From: Michael Barker Date: Mon, 13 Jul 2009 20:59:00 +0000 (-0000) Subject: 2009-07-11 Michael Barker X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=95dc3521c07b15316c0087fb5f088e65162077e4;hp=9e3a325d750510b55beacc23db3d79b6d247c835;p=mono.git 2009-07-11 Michael Barker * MessageQueueException.cs: Removed MonoTODO. * MessageBaseTest.cs: Moved from Mono.Messaging.Test * MessageEnumeratorTest.cs: Moved from Mono.Messaging.Test * MessageTest.cs: Used using aliases to prevent namespace clashes. * AdminTest.cs: Remove unused variables. * AsyncPeekTest.cs: Remove unused variables. * AsyncReceiveTest.cs: Remove unused variables. * MessageFactory.cs: Switched to DateTime.UtcNow. * RabbitMQMessageQueue.cs: Removed some unecessary references to realm. * RabbitMQMessagingProvider.cs: Removed some unecessary references to realm. Changed volatile field to use Interlocked.Increment (++i is not thread safe). * Mono.Messaging.RabbitMQ_test.dll.sources: Moved MessageEnumeratorTest.cs and MessageBaseTest.cs from Mono.Messaging.Test. * MessageBaseTest.cs: Moved to Mono.Messaging.RabbitMQ.Test * MessageEnumeratorTest.cs: Moved to Mono.Messaging.RabbitMQ.Test * MessagingProviderLocator.cs: Removed unessecary fields, made fields readonly and some formatting changes. * Mono.Messaging_test.dll.sources: Moved MessageBaseTest.cs and MessageEnumeratorTest.cs to Mono.Messaging.RabbitMQ.Test. svn path=/trunk/mcs/; revision=137816 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c8999080b8..83319a16445 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,7 @@ cmake_minimum_required(VERSION 2.6.4) # - It would be nice to have a per-target VERBOSE setting # - or a way to change the setting name to 'V' and the output to CC # to be similar to the current build output +# - Add a cache to the manual checks # We use lowercase commands as advocated by the kde cmake coding style @@ -497,19 +498,22 @@ check_c_source_compiles(" void main () {} " GCC) -ac_msg_checking("for isinf") -set(compiles) -check_c_source_compiles(" +if(NOT HAVE_ISINF) + ac_msg_checking("for isinf") + set(compiles) + check_c_source_compiles(" #include void main () { int f = isinf (1); } " compiles) -if(compiles) - ac_msg_result(yes) - ac_define(HAVE_ISINF 1 "isinf available") -else() - ac_msg_result(no) + if(compiles) + ac_msg_result(yes) + ac_define(HAVE_ISINF 1 "isinf available") + set(HAVE_ISINF 1 CACHE BOOL "Have the isinf function") + else() + ac_msg_result(no) + endif() endif() # not 64 bit clean in cross-compile @@ -559,12 +563,16 @@ endif() # A sanity check to catch cases where the package was unpacked # with an ancient tar program (Solaris) # -ac_msg_checking("integrity of package") -if(EXISTS ${srcdir}/${mcsdir}/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs) - ac_msg_result(ok) -else() - set(errorm "Your mono distribution is incomplete; if unpacking from a tar file, make sure you use GNU tar; see http://www.mono-project.com/IncompletePackage for more details") - ac_msg_error(${errorm}) +set(solaris-tar-check yes CACHE BOOL "Enable/disable solaris tar check") + +if(solaris-tar-check) + ac_msg_checking("integrity of package") + if(EXISTS ${srcdir}/${mcsdir}/class/System.Runtime.Serialization.Formatters.Soap/System.Runtime.Serialization.Formatters.Soap/SoapTypeMapper.cs) + ac_msg_result(ok) + else() + set(errorm "Your mono distribution is incomplete; if unpacking from a tar file, make sure you use GNU tar; see http://www.mono-project.com/IncompletePackage for more details") + ac_msg_error(${errorm}) + endif() endif() set(mcs_topdir ${top_srcdir}/${mcsdir}) @@ -2105,6 +2113,26 @@ elseif(host MATCHES "arm.*-linux.*") set(ACCESS_UNALIGNED no) set(JIT_SUPPORTED yes) set(jit_wanted true) +elseif(host MATCHES "mips.*") + set(TARGET MIPS) + set(arch_target mips) + set(ACCESS_UNALIGNED no) + set(JIT_SUPPORTED yes) + set(jit_wanted true) +### ac_msg_checking(for mips n32) +### AC_TRY_COMPILE([], [ +### void main () { +### #if _MIPS_SIM != _ABIN32 +### #error Not mips n32 +### #endif +### } +### ],[ +### ac_msg_result(yes) +### set(sizeof_register 8) +### ],[ +### ac_msg_result(no) +### ]) +### ;; else() message(FATAL_ERROR "Host ${host} not yet supported by the cmake build.") endif() @@ -2123,27 +2151,6 @@ endif() # set(TARGET MIPS;) # set(ACCESS_UNALIGNED "no") # ;; -### mips*) -### set(TARGET MIPS;) -### set(arch_target mips;) -### set(ACCESS_UNALIGNED "no") -### set(JIT_SUPPORTED yes) -### set(jit_wanted true) - -### ac_msg_checking(for mips n32) -### AC_TRY_COMPILE([], [ -### void main () { -### #if _MIPS_SIM != _ABIN32 -### #error Not mips n32 -### #endif -### } -### ],[ -### ac_msg_result(yes) -### set(sizeof_register 8) -### ],[ -### ac_msg_result(no) -### ]) -### ;; ### i*86-*-*) ### set(TARGET X86;) ### set(arch_target x86;) @@ -2677,10 +2684,14 @@ if("${prefix}" STREQUAL "") endif() if("${exec_prefix}" STREQUAL "") set(exec_prefix "\${prefix}") + set(exec_prefix_full "${prefix}") +else() + set(exec_prefix_full "${exec_prefix}") endif() # FIXME: Make these overridable set(bindir "\${exec_prefix}/bin") +set(bindir_full "${exec_prefix_full}/bin") set(sbindir "\${exec_prefix}/sbin") set(libexecdir "\${exec_prefix}/libexec") set(datarootdir "\${prefix}/share") diff --git a/ChangeLog b/ChangeLog index c438c321cae..b121b05eea6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,44 @@ +2009-07-02 Jb Evain + + * scripts/Makefile.am: monolinker is now a 2.0 assembly. + +2009-07-02 jonas echterhoff + + * configure.in: Add linker flag on Mac OS X to allow access to other + processes, needed for debugging. Enable debugging on OS X. + +2009-06-21 Zoltan Varga + + * configure.in (TARGET_BYTE_ORDER): New define containing the byte order of + the target. + +2009-06-18 Marek Habersack + + * data/browscap.ini: applied Mono modifications to the upstream + version. Fixes three tests failing in System.Web. Fixes bug #513965 + Added ecmascriptversion, msdomversion and w3cdomversion to the IE + 8.0 entry. Fixes bug #513965 + +2009-06-16 Raja R Harinath + + * configure.in (--with-profile2): Simplify slightly. + (--with-profile4, --with-moonlight): Likewise. + +2009-06-15 Miguel de Icaza + + * configure.in: Changed the default to not build the 4.0 profile + unless explicitly enabled. + +2009-06-15 Zoltan Varga + + * CMakeLists.txt: Add mips support. + +2009-06-14 Zoltan Varga + + * scripts/CMakeLists.txt: New file. + + * samples/CMakeLists.txt: New file, currently empty. + 2009-06-12 Andreia Gaita * data/config.in: add libcups dllmap entry diff --git a/README b/README index e3a38653c31..b1f596e69bd 100644 --- a/README +++ b/README @@ -522,3 +522,4 @@ This is Mono. independent checkout) from the Mono module, that directory is automatically configured to share the same prefix than this module gets. + diff --git a/configure.in b/configure.in index d41b20c44a8..a866bab1be1 100644 --- a/configure.in +++ b/configure.in @@ -601,8 +601,8 @@ AC_ARG_ENABLE(minimal, [ --enable-minimal=LIST drop support for LIST subsy AC_DEFINE_UNQUOTED(DISABLED_FEATURES, "$DISABLED_FEATURES", [String of disabled features]) if test "x$mono_feature_disable_aot" = "xyes"; then - AC_DEFINE(DISABLE_AOT, 1, [Disable AOT support]) - AC_MSG_NOTICE([Disabled support for AOT]) + AC_DEFINE(DISABLE_AOT_COMPILER, 1, [Disable AOT Compiler]) + AC_MSG_NOTICE([Disabled AOT compiler]) fi if test "x$mono_feature_disable_profiler" = "xyes"; then @@ -2080,6 +2080,14 @@ else AC_DEFINE(SIZEOF_REGISTER,SIZEOF_VOID_P,[size of machine integer registers]) fi +if test "x$target_byte_order" = "xG_BIG_ENDIAN"; then + AC_DEFINE(TARGET_BYTE_ORDER,G_BIG_ENDIAN,[byte order of target]) +elif test "x$target_byte_order" = "xG_LITTLE_ENDIAN"; then + AC_DEFINE(TARGET_BYTE_ORDER,G_LITTLE_ENDIAN,[byte order of target]) +else + AC_DEFINE(TARGET_BYTE_ORDER,G_BYTE_ORDER,[byte order of target]) +fi + if test "x$have_visibility_hidden" = "xyes"; then AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute]) fi @@ -2194,6 +2202,9 @@ if test "x$TARGET" = "xAMD64" -o "x$TARGET" = "xX86" -o "x$TARGET" = "xALPHA"; t *-*-*linux*) mono_debugger_supported=yes ;; + *86-apple-darwin*) + mono_debugger_supported=yes + ;; esac fi fi @@ -2261,26 +2272,9 @@ case "x$gc" in ;; esac -PROFILE2=yes -AC_ARG_WITH(profile2, [ --with-profile2=yes,no If you want to install the 2.0 FX (defaults to yes)],[ - if test x$with_profile2 = xno; then - PROFILE2=no - fi -]) - -PROFILE4=yes -AC_ARG_WITH(profile4, [ --with-profile4=yes,no If you want to install the 4.0 FX (defaults to yes)],[ - if test x$with_profile4 = xno; then - PROFILE4=no - fi -]) - -MOONLIGHT=yes -AC_ARG_WITH(moonlight,[ --with-moonlight=yes,no If you want to build the Moonlight 2.1 assemblies (defaults to yes)],[ - if test x$with_moonlight = xno; then - MOONLIGHT=no - fi -]) +AC_ARG_WITH(profile2, [ --with-profile2=yes,no If you want to install the 2.0 FX (defaults to yes)], [], [with_profile2=yes]) +AC_ARG_WITH(profile4, [ --with-profile4=yes,no If you want to install the 4.0 FX (defaults to no)], [], [with_profile4=no]) +AC_ARG_WITH(moonlight, [ --with-moonlight=yes,no If you want to build the Moonlight 2.1 assemblies (defaults to yes)], [], [with_moonlight=yes]) OPROFILE=no AC_ARG_WITH(oprofile,[ --with-oprofile=no, Enable oprofile support (defaults to no)],[ @@ -2329,9 +2323,9 @@ AC_SUBST(OPROFILE_LIBS) libmono_ldflags="$libmono_ldflags $LIBS" -AM_CONDITIONAL(INSTALL_2_0, test x$PROFILE2 = xyes) -AM_CONDITIONAL(INSTALL_2_1, test x$MOONLIGHT = xyes) -AM_CONDITIONAL(INSTALL_4_0, test x$PROFILE4 = xyes) +AM_CONDITIONAL(INSTALL_2_0, [test "x$with_profile2" = xyes]) +AM_CONDITIONAL(INSTALL_2_1, [test "x$with_moonlight" = xyes]) +AM_CONDITIONAL(INSTALL_4_0, [test "x$with_profile4" = xyes]) AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes) AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno) @@ -2610,7 +2604,7 @@ fi echo 'MCS_FLAGS = $(PLATFORM_DEBUG_FLAGS)' >> $srcdir/$olivedir/build/config.make echo "RUNTIME = $mono_build_root/runtime/mono-wrapper" >> $srcdir/$olivedir/build/config.make echo "MONO_VERSION = $myver" >> $srcdir/$olivedir/build/config.make - if test x$with_moonlight = xyes; then + if test x$with_moonlight = xyes; then echo "WITH_MOONLIGHT = yes" >> $srcdir/$olivedir/build/config.make fi fi @@ -2632,9 +2626,9 @@ echo " TLS: $with_tls SIGALTSTACK: $with_sigaltstack Engine: $jit_status - 2.0 Profile: $PROFILE2 - 2.1 Alpha: $MOONLIGHT - 4.0 Aplha: $PROFILE4 + 2.0 Profile: $with_profile2 + Moon Profile: $with_moonlight + 4.0 Alpha: $with_profile4 JNI support: $jdk_headers_found libgdiplus: $libgdiplus_msg zlib: $zlib_msg diff --git a/data/browscap.ini b/data/browscap.ini index bc298092d76..1267e1deb40 100644 --- a/data/browscap.ini +++ b/data/browscap.ini @@ -1,10 +1,9 @@ ;;; Provided courtesy of http://browsers.garykeith.com -;;; Created on April 3, 2007 at 5:13:55 PM GMT -;;; http://forums.garykeith.com/changes +;;; Created on Wednesday, June 17, 2009 at 6:30 AM GMT [GJK_Browscap_Version] -Version=3942 -Released=Tue, 03 Apr 2007 17:13:55 -0000 +Version=4476 +Released=Wed, 17 Jun 2009 06:30:21 -0000 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DefaultProperties @@ -24,25 +23,19 @@ IFrames=false Tables=false Cookies=false BackgroundSounds=false -AuthenticodeUpdate= CDF=false VBScript=false JavaApplets=false JavaScript=false ActiveXControls=false -Stripper=false isBanned=false -WAP=false isMobileDevice=false isSyndicationReader=false Crawler=false -CSS=0 CssVersion=0 supportsCSS=false AOL=false aolVersion=0 -netCLR=false -ClrVersion=0 ECMAScriptVersion=0.0 W3CDOMVersion=0.0 @@ -63,72 +56,22 @@ Browser=Teoma Parent=Ask Browser=AskJeeves -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fast/AllTheWeb +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baidu -[Fast/AllTheWeb] +[Baidu] Parent=DefaultProperties -Browser=Fast/AllTheWeb -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true +Browser=Baidu Frames=true -IFrames=true Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -Stripper=true -isBanned=true -WAP=true -isMobileDevice=true -isSyndicationReader=true Crawler=true -[*FAST Enterprise Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST Enterprise Crawler - -[FAST Data Search Document Retriever/4.0*] -Parent=Fast/AllTheWeb -Browser=FAST Data Search Document Retriever - -[FAST MetaWeb Crawler (helpdesk at fastsearch dot com)] -Parent=Fast/AllTheWeb -Browser=FAST MetaWeb Crawler - -[Fast PartnerSite Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler - -[FAST-WebCrawler/*/FirstPage*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/FirstPage - -[FAST-WebCrawler/*/Fresh*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Fresh - -[FAST-WebCrawler/*/PartnerSite*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*?Multimedia*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Multimedia +[BaiduImageSpider*] +Parent=Baidu +Browser=BaiduImageSpider -[FastSearch Web Crawler for*] -Parent=Fast/AllTheWeb -Browser=FastSearch Web Crawler +[Baiduspider*] +Parent=Baidu +Browser=BaiDu ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google @@ -141,15 +84,41 @@ Tables=true JavaScript=true Crawler=true -[AdsBot-Google (*http://www.google.com/adsbot.html)] +[* (compatible; Googlebot-Mobile/2.1; *http://www.google.com/bot.html)] +Parent=Google +Browser=Googlebot-Mobile +Frames=false +IFrames=false +Tables=false + +[*Google Wireless Transcoder*] +Parent=Google +Browser=Google Wireless Transcoder + +[AdsBot-Google (?http://www.google.com/adsbot.html)] Parent=Google Browser=AdsBot-Google +[Feedfetcher-Google-iGoogleGadgets;*] +Parent=Google +Browser=iGoogleGadgets +isBanned=true +isSyndicationReader=true + [Feedfetcher-Google;*] Parent=Google Browser=Feedfetcher-Google +isBanned=true isSyndicationReader=true +[Google OpenSocial agent (http://www.google.com/feedfetcher.html)] +Parent=Google +Browser=Google OpenSocial + +[Google-Site-Verification/1.0] +Parent=Google +Browser=Google-Site-Verification + [Google-Sitemaps/*] Parent=Google Browser=Google-Sitemaps @@ -163,11 +132,15 @@ CDF=true Parent=Google Browser=googlebot-urlconsole -[Googlebot/2.1 (*http://www.google.com/bot.html)] +[Googlebot-Video/1.0] +Parent=Google +Browser=Google-Video + +[Googlebot/2.1 (?http://www.google.com/bot.html)] Parent=Google Browser=Googlebot -[Googlebot/2.1 (*http://www.googlebot.com/bot.html)] +[Googlebot/2.1 (?http://www.googlebot.com/bot.html)] Parent=Google Browser=Googlebot @@ -175,15 +148,12 @@ Browser=Googlebot Parent=Google Browser=Googlebot/Test -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Search Appliance - [gsa-crawler*] Parent=Google Browser=Google Search Appliance -Stripper=true isBanned=true -[Mediapartners-Google/*] +[Mediapartners-Google*] Parent=Google Browser=Mediapartners-Google @@ -194,12 +164,15 @@ Browser=Google Desktop [Mozilla/4.0 (compatible; GoogleToolbar*)] Parent=Google Browser=Google Toolbar -Stripper=true isBanned=true -[Mozilla/5.0 (compatible; Googlebot/2.1; *http://www.google.com/bot.html)] +[Mozilla/5.0 (compatible; Google Keyword Tool;*)] Parent=Google -Browser=Googlebot +Browser=Google Keyword Tool + +[Mozilla/5.0 (compatible; Googlebot/2.1; ?http://www.google.com/bot.html)] +Parent=Google +Browser=Google Webmaster Tools ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Inktomi @@ -210,9 +183,14 @@ Frames=true Tables=true Crawler=true +[* (compatible;YahooSeeker/M1A1-R2D2; *)] +Parent=Inktomi +Browser=YahooSeeker-Mobile +Frames=false +Tables=false + [Mozilla/4.0] Parent=Inktomi -Browser=Mozilla/4.0 [Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)] Parent=Inktomi @@ -221,9 +199,20 @@ Win32=true [Mozilla/4.0 (compatible; Yahoo Japan; for robot study; kasugiya)] Parent=Inktomi Browser=Yahoo! RobotStudy -Stripper=true isBanned=true +[Mozilla/5.0 (compatible; BMC/1.0 (Y!J-AGENT))] +Parent=Inktomi +Browser=Y!J-AGENT/BMC + +[Mozilla/5.0 (compatible; BMF/1.0 (Y!J-AGENT))] +Parent=Inktomi +Browser=Y!J-AGENT/BMF + +[Mozilla/5.0 (compatible; BMI/1.0 (Y!J-AGENT; 1.0))] +Parent=Inktomi +Browser=Y!J-AGENT/BMI + [Mozilla/5.0 (compatible; Yahoo! DE Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] Parent=Inktomi Browser=Yahoo! Directory Engine @@ -232,10 +221,24 @@ Browser=Yahoo! Directory Engine Parent=Inktomi Browser=Yahoo! Slurp China +[Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)] +Parent=Inktomi +Browser=Yahoo! Slurp +Version=3.0 +MajorVer=3 +MinorVer=0 + [Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] Parent=Inktomi Browser=Yahoo! Slurp +[Mozilla/5.0 (compatible; Yahoo! Verifier/1.1)] +Parent=Inktomi +Browser=Yahoo! Verifier +Version=1.1 +MajorVer=1 +MinorVer=1 + [Mozilla/5.0 (Slurp/cat; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] Parent=Inktomi Browser=Slurp/cat @@ -243,6 +246,13 @@ Browser=Slurp/cat [Mozilla/5.0 (Slurp/si; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] Parent=Inktomi +[Mozilla/5.0 (Yahoo-MMCrawler/4.0; mailto:vertical-crawl-support@yahoo-inc.com)] +Parent=Inktomi +Browser=Yahoo-MMCrawler +Version=4.0 +MajorVer=4 +MinorVer=0 + [Scooter/*] Parent=Inktomi Browser=Scooter @@ -250,6 +260,9 @@ Browser=Scooter [Scooter/3.3Y!CrawlX] Parent=Inktomi Browser=Scooter/3.3Y!CrawlX +Version=3.3 +MajorVer=3 +MinorVer=3 [slurp] Parent=Inktomi @@ -258,7 +271,9 @@ Browser=slurp [Y!J-BSC/1.0*] Parent=Inktomi Browser=Y!J-BSC -Stripper=true +Version=1.0 +MajorVer=1 +MinorVer=0 isBanned=true [Y!J-SRD/1.0] @@ -280,6 +295,10 @@ Browser=Yahoo Pipes Parent=Inktomi Browser=Yahoo! Mindset +[Yahoo! Slurp/Site Explorer] +Parent=Inktomi +Browser=Yahoo! Site Explorer + [Yahoo-Blogs/*] Parent=Inktomi Browser=Yahoo-Blogs @@ -291,7 +310,6 @@ Browser=Yahoo-MMAudVid [Yahoo-MMCrawler*] Parent=Inktomi Browser=Yahoo-MMCrawler -Stripper=true isBanned=true [YahooFeedSeeker*] @@ -303,7 +321,6 @@ Crawler=false [YahooSeeker/*] Parent=Inktomi Browser=YahooSeeker -WAP=true isMobileDevice=true [YahooSeeker/CafeKelsa (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] @@ -321,31 +338,6 @@ Browser=YahooVideoSearch Parent=Inktomi Browser=YahooYSMcm -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycos - -[Lycos] -Parent=DefaultProperties -Browser=Lycos -Frames=true -Tables=true -Crawler=true - -[Lycos*] -Parent=Lycos -Browser=Lycos - -[Lycos-Proxy] -Parent=Lycos -Browser=Lycos-Proxy - -[Lycos-Spider_(modspider)] -Parent=Lycos -Browser=Lycos-Spider_(modspider) - -[Lycos-Spider_(T-Rex)] -Parent=Lycos -Browser=Lycos-Spider_(T-Rex) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN [MSN] @@ -355,20 +347,34 @@ Frames=true Tables=true Crawler=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN lanshanbot +[adidxbot/1.1 (?http://search.msn.com/msnbot.htm)] +Parent=MSN +Browser=adidxbot + +[librabot/1.0 (*)] +Parent=MSN +Browser=librabot -[lanshanbot/1.0*] +[llssbot/1.0] Parent=MSN -Browser=lanshanbot +Browser=llssbot Version=1.0 MajorVer=1 MinorVer=0 -[Mozilla/4.0 (compatible; MSIE 6.0; Windows NT; MS Search 4.0 Robot, crawler)] +[MSMOBOT/1.1*] Parent=MSN -Browser=MS Search +Browser=msnbot-mobile +Version=1.1 +MajorVer=1 +MinorVer=1 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Images & Other Media +[MSNBot-Academic/1.0*] +Parent=MSN +Browser=MSNBot-Academic +Version=1.0 +MajorVer=1 +MinorVer=0 [msnbot-media/1.0*] Parent=MSN @@ -377,31 +383,34 @@ Version=1.0 MajorVer=1 MinorVer=0 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN News +[msnbot-media/1.1*] +Parent=MSN +Browser=msnbot-media +Version=1.1 +MajorVer=1 +MinorVer=1 -[msnbot-news/1.0*] +[MSNBot-News/1.0*] Parent=MSN -Browser=msnbot-news +Browser=MSNBot-News Version=1.0 MajorVer=1 MinorVer=0 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN News Blog Aggregator - -[msnbot-NewsBlogs/1.0*] -Parent=MSN -Browser=msnbot-NewsBlogs - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Shopping - -[msnbot-Products/1.0*] +[MSNBot-NewsBlogs/1.0*] Parent=MSN -Browser=msnbot-Products -Version=1.0 +Browser=MSNBot-NewsBlogs +Version=1 MajorVer=1 MinorVer=0 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Search +[msnbot-products] +Parent=MSN +Browser=msnbot-products + +[msnbot-webmaster/1.0 (*http://search.msn.com/msnbot.htm)] +Parent=MSN +Browser=msnbot-webmaster tools [msnbot/1.0*] Parent=MSN @@ -410,12 +419,31 @@ Version=1.0 MajorVer=1 MinorVer=0 -[msnbot/1.0-MM*] +[msnbot/1.1*] Parent=MSN -Browser=msnbot-MM -Version=1.00 +Browser=msnbot +Version=1.1 MajorVer=1 +MinorVer=1 + +[msnbot/2.0b*] +Parent=MSN +Version=2.0 +MajorVer=2 MinorVer=0 +Beta=true + +[MSR-ISRCCrawler] +Parent=MSN +Browser=MSR-ISRCCrawler + +[renlifangbot/1.0 (?http://search.msn.com/msnbot.htm)] +Parent=MSN +Browser=renlifangbot + +[T-Mobile Dash Mozilla/4.0 (*) MSNBOT-MOBILE/1.1 (*)] +Parent=MSN +Browser=msnbot-mobile ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yahoo @@ -430,10 +458,16 @@ Crawler=true Parent=Yahoo Browser=Y!J +[Mozilla/5.0 (Yahoo-Test/4.0*)] +Parent=Yahoo +Browser=Yahoo-Test +Version=4.0 +MajorVer=4 +MinorVer=0 + [mp3Spider cn-search-devel at yahoo-inc dot com] Parent=Yahoo Browser=Yahoo! Media -Stripper=true isBanned=true [My Browser] @@ -443,52 +477,21 @@ Browser=Yahoo! My Browser [Y!OASIS/*] Parent=Yahoo Browser=Y!OASIS -Stripper=true isBanned=true [YahooYSMcm/2.0.0] Parent=Yahoo Browser=YahooYSMcm -Stripper=true +Version=2.0 +MajorVer=2 +MinorVer=0 isBanned=true [YRL_ODP_CRAWLER] Parent=Yahoo Browser=YRL_ODP_CRAWLER -Stripper=true isBanned=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baidu - -[Baidu] -Parent=DefaultProperties -Browser=Baidu -Frames=true -Tables=true -Crawler=true - -[Baiduspider*] -Parent=Baidu -Browser=BaiDu - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Onet.pl Szukaj - -[Onet.pl Szukaj] -Parent=DefaultProperties -Browser=Onet.pl Szukaj -Frames=true -IFrames=true -Tables=true -Crawler=true - -[Mozilla/5.0 (compatible; OnetSzukaj/5.0*] -Parent=Onet.pl Szukaj -Browser=OnetSzukaj - -[Onet.pl SA, http://szukaj.onet.pl] -Parent=Onet.pl Szukaj -Browser=Onet.pl - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yandex [Yandex] @@ -503,6 +506,15 @@ Crawler=true [Mozilla/4.0 (compatible; MSIE 5.0; YANDEX)] Parent=Yandex +[Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9) Gecko VisualParser/3.0] +Parent=Yandex +Browser=VisualParser +isBanned=true + +[YaDirectBot/*] +Parent=Yandex +Browser=YaDirectBot + [Yandex/*] Parent=Yandex @@ -516,89 +528,41 @@ Parent=Yandex Browser=YandexSomething isSyndicationReader=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Accoona +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Best of the Web -[Accoona] +[Best of the Web] Parent=DefaultProperties -Browser=Accoona +Browser=Best of the Web Frames=true -IFrames=true Tables=true -Crawler=true -[accoona*] -Parent=Accoona -Browser=Accoona +[Mozilla/4.0 (compatible; BOTW Feed Grabber; *http://botw.org)] +Parent=Best of the Web +Browser=BOTW Feed Grabber +isSyndicationReader=true +Crawler=false -[Accoona-AI-Agent/* (crawler at accoona dot com)] -Parent=Accoona -Browser=Accoona-AI-Agent +[Mozilla/4.0 (compatible; BOTW Spider; *http://botw.org)] +Parent=Best of the Web +Browser=BOTW Spider +isBanned=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Become +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boitho -[Become] +[Boitho] Parent=DefaultProperties -Browser=Become +Browser=Boitho Frames=true Tables=true Crawler=true -[*BecomeBot/*] -Parent=Become -Browser=BecomeBot +[boitho.com-dc/*] +Parent=Boitho +Browser=boitho.com-dc -[*BecomeBot@exava.com*] -Parent=Become -Browser=BecomeBot - -[*Exabot@exava.com*] -Parent=Become -Browser=Exabot - -[MonkeyCrawl/*] -Parent=Become -Browser=MonkeyCrawl - -[Mozilla/5.0 (compatible; BecomeJPBot/2.3; *)] -Parent=Become -Browser=BecomeJPBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Best of the Web - -[Best of the Web] -Parent=DefaultProperties -Browser=Best of the Web -Frames=true -Tables=true - -[Mozilla/4.0 (compatible; BOTW Feed Grabber; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Feed Grabber -isSyndicationReader=true -Crawler=false - -[Mozilla/4.0 (compatible; BOTW Spider; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Spider -Stripper=true -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boitho - -[Boitho] -Parent=DefaultProperties -Browser=Boitho -Frames=true -Tables=true -Crawler=true - -[boitho.com-dc/*] -Parent=Boitho -Browser=boitho.com-dc - -[boitho.com-robot/*] -Parent=Boitho -Browser=boitho.com-robot +[boitho.com-robot/*] +Parent=Boitho +Browser=boitho.com-robot ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Convera @@ -624,6 +588,22 @@ MinorVer=1 Parent=Convera Browser=CrawlConvera +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DotBot + +[DotBot] +Parent=DefaultProperties +Browser=DotBot +Frames=true +Tables=true +isBanned=true +Crawler=true + +[DotBot/* (http://www.dotnetdotcom.org/*)] +Parent=DotBot + +[Mozilla/5.0 (compatible; DotBot/*; http://www.dotnetdotcom.org/*)] +Parent=DotBot + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Entireweb [Entireweb] @@ -632,20 +612,16 @@ Browser=Entireweb Frames=true IFrames=true Tables=true -Stripper=true isBanned=true Crawler=true [Mozilla/4.0 (compatible; SpeedySpider; www.entireweb.com)] Parent=Entireweb -[Speedy Spider (Beta/*; www.entireweb.com)] +[Speedy Spider (*Beta/*)] Parent=Entireweb -[Speedy Spider (Entireweb; Beta/*)] -Parent=Entireweb - -[Speedy_Spider_(http://www.entireweb.com)] +[Speedy?Spider?(http://www.entireweb.com*)] Parent=Entireweb ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Envolk @@ -656,7 +632,6 @@ Browser=Envolk Frames=true IFrames=true Tables=true -Stripper=true isBanned=true Crawler=true @@ -673,7 +648,6 @@ Parent=DefaultProperties Browser=Exalead Frames=true Tables=true -Stripper=true isBanned=true Crawler=true @@ -703,17 +677,19 @@ Platform=Liberate [Exalead NG/*] Parent=Exalead Browser=Exalead NG -Stripper=true isBanned=true [Mozilla/5.0 (compatible; Exabot-Images/3.0;*)] Parent=Exalead Browser=Exabot-Images +[Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter/tests);*)] +Parent=Exalead +Browser=Exabot/BiggerBetter/tests + [Mozilla/5.0 (compatible; Exabot/3.0;*)] Parent=Exalead Browser=Exabot -Stripper=false isBanned=false [Mozilla/5.0 (compatible; NGBot/*)] @@ -725,38 +701,89 @@ Browser=Exalead Previewer Version=1.0 MajorVer=1 MinorVer=0 -Stripper=true isBanned=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Excite +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fast/AllTheWeb -[Excite] +[Fast/AllTheWeb] Parent=DefaultProperties -Browser=Excite +Browser=Fast/AllTheWeb +Alpha=true +Beta=true +Win16=true +Win32=true +Win64=true Frames=true +IFrames=true Tables=true +Cookies=true +BackgroundSounds=true +CDF=true +VBScript=true +JavaApplets=true +JavaScript=true +ActiveXControls=true +isBanned=true +isMobileDevice=true +isSyndicationReader=true Crawler=true -[Mozilla/4.0 (compatible; * sureseeker.com*)] -Parent=Excite -Browser=Excite sureseeker.com +[*FAST Enterprise Crawler*] +Parent=Fast/AllTheWeb +Browser=FAST Enterprise Crawler + +[FAST Data Search Document Retriever/4.0*] +Parent=Fast/AllTheWeb +Browser=FAST Data Search Document Retriever + +[FAST MetaWeb Crawler (helpdesk at fastsearch dot com)] +Parent=Fast/AllTheWeb +Browser=FAST MetaWeb Crawler + +[Fast PartnerSite Crawler*] +Parent=Fast/AllTheWeb +Browser=FAST PartnerSite + +[FAST-WebCrawler/*] +Parent=Fast/AllTheWeb +Browser=FAST-WebCrawler + +[FAST-WebCrawler/*/FirstPage*] +Parent=Fast/AllTheWeb +Browser=FAST-WebCrawler/FirstPage + +[FAST-WebCrawler/*/Fresh*] +Parent=Fast/AllTheWeb +Browser=FAST-WebCrawler/Fresh + +[FAST-WebCrawler/*/PartnerSite*] +Parent=Fast/AllTheWeb +Browser=FAST PartnerSite + +[FAST-WebCrawler/*?Multimedia*] +Parent=Fast/AllTheWeb +Browser=FAST-WebCrawler/Multimedia + +[FastSearch Web Crawler for*] +Parent=Fast/AllTheWeb +Browser=FastSearch Web Crawler -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galaxy +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Gigabot -[Galaxy] +[Gigabot] Parent=DefaultProperties -Browser=Galaxy +Browser=Gigabot Frames=true +IFrames=true Tables=true Crawler=true -[GalaxyBot/*0 (http://www.galaxy.com/galaxybot.html)] -Parent=Galaxy -Browser=GalaxyBot +[Gigabot*] +Parent=Gigabot -[Mozilla/* (compatible; MSIE *; www.galaxy.com;*)] -Parent=Galaxy -Browser=GalaxyBot +[GigabotSiteSearch/*] +Parent=Gigabot +Browser=GigabotSiteSearch ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ilse @@ -791,7 +818,6 @@ Crawler=true [DataFountains/DMOZ Downloader*] Parent=iVia Project Browser=DataFountains/DMOZ Downloader -Stripper=true isBanned=true [DataFountains/DMOZ Feature Vector Corpus Creator*] @@ -814,7 +840,6 @@ Browser=ExactSeek Crawler [exactseek-pagereaper-* (crawler@exactseek.com)] Parent=Jayde Online Browser=exactseek-pagereaper -Stripper=true isBanned=true [exactseek.com] @@ -825,13 +850,37 @@ Browser=exactseek.com Parent=Jayde Online Browser=Jayde Crawler +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycos + +[Lycos] +Parent=DefaultProperties +Browser=Lycos +Frames=true +Tables=true +Crawler=true + +[Lycos*] +Parent=Lycos +Browser=Lycos + +[Lycos-Proxy] +Parent=Lycos +Browser=Lycos-Proxy + +[Lycos-Spider_(modspider)] +Parent=Lycos +Browser=Lycos-Spider_(modspider) + +[Lycos-Spider_(T-Rex)] +Parent=Lycos +Browser=Lycos-Spider_(T-Rex) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Naver [Naver] Parent=DefaultProperties Browser=Naver -Frames=true -Tables=true +isBanned=true Crawler=true [Cowbot-* (NHN Corp*naver.com)] @@ -849,164 +898,21 @@ Browser=Naver NaverBot Parent=Naver Browser=Naver NHN Corp -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openfind - -[Openfind] -Parent=DefaultProperties -Browser=Openfind -Frames=true -Tables=true -Crawler=true - -[Gaisbot/*] -Parent=Openfind - -[Openbot/*] -Parent=Openfind - -[Openfind data gatherer*] -Parent=Openfind - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Orbiter - -[Orbiter] -Parent=DefaultProperties -Browser=Orbiter -Frames=true -Tables=true -Crawler=true - -[Orbiter (?http://www.dailyorbit.com/bot.htm)] -Parent=Orbiter - -[Orbiter (?http://www.thatsearchengine.com/bot.htm)] -Parent=Orbiter -Browser=Orbiter - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PeerFactory - -[PeerFactory] -Parent=DefaultProperties -Browser=PeerFactory -Frames=true -Tables=true -Stripper=true -isBanned=true -Crawler=true - -[PeerFactor 404 crawler] -Parent=PeerFactory -Browser=PeerFactor 404 crawler - -[PeerFactor Crawler] -Parent=PeerFactory -Browser=PeerFactor Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pogodak! - -[Pogodak] -Parent=DefaultProperties -Browser=Pogodak! -Frames=true -Tables=true -Stripper=true -isBanned=true -Crawler=true - -[Mozilla/5.0 (compatible; Pogodak.co.yu/*)] -Parent=Pogodak - -[Mozilla/5.0 (compatible; TridentSpider/*)] -Parent=Pogodak - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Relevare - -[Relevare] -Parent=DefaultProperties -Browser=Relevare -Frames=true -Tables=true -Stripper=true -isBanned=true -Crawler=true - -[bumblebee/*] -Parent=Relevare -Browser=Relevare - -[Bumblebee@relevare.com] -Parent=Relevare - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sensis - -[Sensis] -Parent=DefaultProperties -Browser=Sensis -Frames=true -IFrames=true -Tables=true -Crawler=true - -[Sensis Web Crawler (search_comments\at\sensis\dot\com\dot\au)] -Parent=Sensis -Browser=Sensis Web Crawler - -[Sensis.com.au Web Crawler (search_comments\at\sensis\dot\com\dot\au)] -Parent=Sensis -Browser=Sensis.com.au Web Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shunix - -[Shunix] -Parent=DefaultProperties -Browser=Shunix -Frames=true -IFrames=true -Tables=true -Crawler=true - -[Mozilla/5.0 (compatible; ShunixBot/*)] -Parent=Shunix -Browser=ShunixBot - -[XunBot/*] -Parent=Shunix -Browser=Shunix XunBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Singing Fish - -[Singing Fish] -Parent=DefaultProperties -Browser=Singing Fish -Frames=true -Tables=true -Crawler=true - -[asterias/*] -Parent=Singing Fish - -[Mozilla/* (compatible; *Asterias Crawler v*)*] -Parent=Singing Fish +[Yeti/*] +Parent=Naver +Browser=Yeti ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Snap [Snap] Parent=DefaultProperties Browser=Snap -Stripper=true isBanned=true Crawler=true -[Mozilla/5.0 (*) Gecko/* Firefox/* SnapPreviewBot] -Parent=Snap - -[snap.com beta crawler v0] +[Mozilla/5.0 (SnapPreviewBot) Gecko/* Firefox/*] Parent=Snap -[snap.com*] -Parent=Snap -Browser=Snap - [Snapbot/*] Parent=Snap @@ -1017,7 +923,6 @@ Parent=DefaultProperties Browser=Sogou Frames=true Tables=true -Stripper=true isBanned=true Crawler=true @@ -1025,203 +930,72 @@ Crawler=true Parent=Sogou Browser=Sogou/Shaboyi Spider +[Sogou develop spider/*] +Parent=Sogou +Browser=Sogou Develop Spider + +[Sogou head spider*] +Parent=Sogou +Browser=Sogou/HEAD Spider + +[sogou js robot(*)] +Parent=Sogou + +[Sogou Orion spider/*] +Parent=Sogou +Browser=Sogou Orion spider + [Sogou Pic Agent] Parent=Sogou Browser=Sogou/Image Crawler +[Sogou Pic Spider] +Parent=Sogou +Browser=Sogou Pic Spider + +[Sogou Push Spider/*] +Parent=Sogou +Browser=Sogou Push Spider + [sogou spider] Parent=Sogou Browser=Sogou/Spider -[sogou web spider] +[sogou web spider*] Parent=Sogou Browser=sogou web spider -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Thunderstone +[Sogou-Test-Spider/*] +Parent=Sogou +Browser=Sogou-Test-Spider + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; YodaoBot -[Thunderstone] +[YodaoBot] Parent=DefaultProperties -Browser=Thunderstone +Browser=YodaoBot Frames=true +IFrames=true Tables=true -Stripper=true isBanned=true Crawler=true -[*Webinator*] -Parent=Thunderstone -Browser=Webinator - -[Mozilla/* (compatible; T-H-U-N-D-E-R-S-T-O-N-E)] -Parent=Thunderstone -Browser=Texis +[Mozilla/5.0 (compatible; YodaoBot/1.*)] +Parent=YodaoBot -[T-H-U-N-D-E-R-S-T-O-N-E] -Parent=Thunderstone -Browser=Texis +[Mozilla/5.0 (compatible;YodaoBot-Image/1.*)] +Parent=YodaoBot +Browser=YodaoBot-Image -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Vagabondo +[WAP_Browser/5.0 (compatible; YodaoBot/1.*)] +Parent=YodaoBot -[Vagabondo] -Parent=DefaultProperties -Browser=Vagabondo -Frames=true -IFrames=true -Tables=true -Crawler=true +[YodaoBot/1.* (*)] +Parent=YodaoBot -[Mozilla/4.0 (compatible; Vagabondo/*)] -Parent=Vagabondo -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WISEnut - -[WISEnut] -Parent=DefaultProperties -Browser=WISEnut -Frames=true -Tables=true -Crawler=true - -[Mozilla/4.0 compatible ZyBorg/* (wn*.zyborg@looksmart.net; http://www.WISEnutbot.com)] -Parent=WISEnut - -[Mozilla/4.0 compatible ZyBorg/* Dead Link Checker (*@looksmart.net; http://www.WISEnutbot.com)] -Parent=WISEnut -Browser=Dead Link Checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yoono - -[Yoono] -Parent=DefaultProperties -Browser=Yoono -Frames=true -Tables=true -Stripper=true -isBanned=true -Crawler=true - -[Mozilla/5.0 (compatible; Yoono; http://www.yoono.com/)] -Parent=Yoono - -[yoono/* web-crawler/*] -Parent=Yoono - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ZoomInfo - -[ZoomInfo] -Parent=DefaultProperties -Browser=ZoomInfo -Frames=true -Tables=true -Stripper=true -isBanned=true -Crawler=true - -[NextGenSearchBot 1 (for information visit http://about.zoominfo.com/PublicSite/NextGenSearchBot.asp)] -Parent=ZoomInfo -Browser=ZoomInfo - -[NextGenSearchBot 1 (for information visit http://www.eliyon.com/NextGenSearchBot)] -Parent=ZoomInfo -Browser=Eliyon - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Directories - -[Directories] -Parent=DefaultProperties -Browser=Directories -Frames=true -Tables=true -Crawler=true - -[acontbot] -Parent=Directories -Browser=acontbot - -[aipbot/*] -Parent=Directories -Browser=aipbot - -[Findexa Crawler (http://www.findexa.no/gulesider/article26548.ece)] -Parent=Directories -Browser=Findexa Crawler - -[FirstGov.gov Search - POC:firstgov.webmasters@gsa.gov] -Parent=Directories -Browser=FirstGov.gov Search - -[http://www.istarthere.com (spider@istarthere.com)] -Parent=Directories -Browser=Istartere.com -Stripper=true -isBanned=true - -[Mackster (*)] -Parent=Directories -Browser=Mackster - -[Misterbot] -Parent=Directories -Browser=Misterbot - -[Mozilla/4.0 (compatible; MSIE 5.0; www.galaxy.com;*)] -Parent=Directories -Browser=Galaxy/LOGIKA Search Engine - -[Mozilla/5.0 (?http://www.toile.com/) ToileBot/*] -Parent=Directories -Browser=Toile - -[Mozilla/5.0 (Votay bot/*)] -Parent=Directories -Browser=Votay -Stripper=true -isBanned=true - -[Mozilla/6.0 (compatible; arameda.com Spider)] -Parent=Directories -Browser=Arameda - -[NationalDirectory-*Spider/*] -Parent=Directories -Browser=National Directory -Stripper=true -isBanned=true - -[Octopus/*] -Parent=Directories -Browser=Octopus - -[OpenIntelligenceData/1.* (?http://www.worldwideweb-x.com/openData.html)] -Parent=Directories -Browser=World Wide Web Directory Project -Version=1.0 -MajorVer=1 -MinorVer=0 -Stripper=true -isBanned=true - -[Poirot] -Parent=Directories -Browser=Poirot - -[silk/1.*] -Parent=Directories -Browser=Slider -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebFindBot(http://www.web-find.com)] -Parent=Directories -Browser=WebFindBot - -[Best Whois (http://www.bestwhois.net/)] -Parent=DNS Tools -Browser=Best Whois +[Best Whois (http://www.bestwhois.net/)] +Parent=DNS Tools +Browser=Best Whois [DNSGroup/*] Parent=DNS Tools @@ -1241,115 +1015,29 @@ isSyndicationReader=true [General Crawlers] Parent=DefaultProperties Browser=General Crawlers -Frames=true -IFrames=true -Tables=true Crawler=true -[*Networking4all*] -Parent=General Crawlers -Browser=Networking4all Bot - -[Aport] -Parent=General Crawlers -Browser=Aport - -[ArachnetAgent*] +[A .NET Web Crawler] Parent=General Crawlers - -[Art-Online.com*] -Parent=General Crawlers -Browser=Art-Online.com +isBanned=true [BabalooSpider/1.*] Parent=General Crawlers Browser=BabalooSpider -[BeijingCrawler] -Parent=General Crawlers -Browser=BeijingCrawler -Stripper=true -isBanned=true - [BilgiBot/*] Parent=General Crawlers Browser=BilgiBot -Stripper=true isBanned=true [bot/* (bot; *bot@bot.bot)] Parent=General Crawlers Browser=bot -Stripper=true -isBanned=true - -[botlist] -Parent=General Crawlers -Browser=botlist -Stripper=true -isBanned=true - -[Botswana*] -Parent=General Crawlers -Browser=Botswana - -[BravoBrian BStop*] -Parent=General Crawlers -Browser=BravoBrian BStop - -[BruinBot*] -Parent=General Crawlers -Browser=BruinBot - -[CacheabilityEngine/*] -Parent=General Crawlers -Browser=CacheabilityEngine - -[ccubee/*] -Parent=General Crawlers -Browser=ccubee - -[CFM-SearchBot(http://www.cfm-search.com)] -Parent=General Crawlers -Browser=CFM-SearchBot - -[CJNetworkQuality; http://www.cj.com/networkquality] -Parent=General Crawlers -Browser=CJNetworkQuality -Frames=true -Tables=true -Cookies=true - -[Clushbot/*] -Parent=General Crawlers -Browser=Clushbot -Stripper=true -isBanned=true - -[Comodo HTTP(S) Crawler*] -Parent=General Crawlers -Browser=Comodo HTTP Crawler - -[Crawler Mozilla/4.0] -Parent=General Crawlers -Stripper=true isBanned=true -[CrawlWave/*] -Parent=General Crawlers -Browser=CrawlWave - -[CSHttpClient/*] +[CyberPatrol*] Parent=General Crawlers -Browser=CSHttpClient - -[CydralSpider/1.9*] -Parent=General Crawlers -Browser=Cydral Web Image Search -Version=1.9 -MajorVer=1 -MinorVer=9 -Stripper=true +Browser=CyberPatrol isBanned=true [Cynthia 1.0] @@ -1359,47 +1047,31 @@ Version=1.0 MajorVer=1 MinorVer=0 -[DiamondBot/*] +[ddetailsbot (http://www.displaydetails.com)] Parent=General Crawlers -Browser=DiamondBot -Stripper=true -isBanned=true +Browser=ddetailsbot -[Diff-Engine*] +[DomainCrawler/1.0 (info@domaincrawler.com; http://www.domaincrawler.com/domains/view/*)] Parent=General Crawlers +Browser=DomainCrawler -[DomainsDB.net MetaCrawler*] +[DomainsBotBot/1.*] Parent=General Crawlers -Browser=DomainsDB +Browser=DomainsBotBot +isBanned=true -[dragonfly(ebingbong#playstarmusic.com)] +[DomainsDB.net MetaCrawler*] Parent=General Crawlers -Browser=eBingBong -Stripper=true -isBanned=true +Browser=DomainsDB [Drupal (*)] Parent=General Crawlers Browser=Drupal -[DTAAgent] -Parent=General Crawlers -Browser=DTAAgent - -[Dumbot (version *)] +[Dumbot (version *)*] Parent=General Crawlers Browser=Dumbfind -[EARTHCOM.info/*] -Parent=General Crawlers -Browser=EarthCom - -[EDI/* (Edacious & Intelligent*)] -Parent=General Crawlers -Browser=Edacious & Intelligent Web Crawler -Stripper=true -isBanned=true - [EuripBot/*] Parent=General Crawlers Browser=Europe Internet Portal @@ -1410,65 +1082,40 @@ Browser=eventax [FANGCrawl/*] Parent=General Crawlers -Browser=FANGCrawl -Stripper=true +Browser=Safe-t.net Web Filtering Service isBanned=true -[FRSEEKBOT] +[favorstarbot/*] Parent=General Crawlers -Browser=FRSEEKBOT +Browser=favorstarbot +isBanned=true -[Gaisbot*] +[FollowSite.com (*)] Parent=General Crawlers -Browser=Gaisbot +Browser=FollowSite +isBanned=true -[GeoBot/*] +[Gaisbot*] Parent=General Crawlers -Browser=GeoBot +Browser=Gaisbot -[grub crawler] +[Healthbot/Health_and_Longevity_Project_(HealthHaven.com) ] Parent=General Crawlers -Browser=grub crawler +Browser=Healthbot +isBanned=true -[HiddenMarket-*] +[hitcrawler_0.*] Parent=General Crawlers -Browser=HiddenMarket -Stripper=true +Browser=hitcrawler isBanned=true [htdig/*] Parent=General Crawlers Browser=ht://Dig -[HTTP-Test-Program] -Parent=General Crawlers -Browser=WebBug -MajorVer=5 - -[HTTP/1.0] -Parent=General Crawlers -Browser=HTTP/1.0 - -[http://www.almaden.ibm.com/cs/crawler*] -Parent=General Crawlers -Browser=IBM's WebFountain - -[ichiro/*] -Parent=General Crawlers -Browser=ichiro - -[InnerpriseBot/*] -Parent=General Crawlers -Browser=InnerpriseBot - -[InternetLinkAgent/*] -Parent=General Crawlers -Browser=InternetLinkAgent - -[iVia Page Fetcher*] +[http://hilfe.acont.de/bot.html ACONTBOT] Parent=General Crawlers -Browser=iVia Software -Stripper=true +Browser=ACONTBOT isBanned=true [JetBrains*] @@ -1482,7 +1129,6 @@ Browser=KakleBot [KBeeBot/0.*] Parent=General Crawlers Browser=KBeeBot -Stripper=true isBanned=true [Keyword Density/*] @@ -1492,37 +1138,36 @@ Browser=Keyword Density [LetsCrawl.com/1.0*] Parent=General Crawlers Browser=LetsCrawl.com -Stripper=true isBanned=true [Lincoln State Web Browser] Parent=General Crawlers Browser=Lincoln State Web Browser -Stripper=true isBanned=true [Links4US-Crawler,*] Parent=General Crawlers Browser=Links4US-Crawler -Stripper=true isBanned=true [Lorkyll *.* -- lorkyll@444.net] Parent=General Crawlers Browser=Lorkyll -Stripper=true isBanned=true [Lsearch/sondeur] Parent=General Crawlers Browser=Lsearch/sondeur -Stripper=true +isBanned=true + +[LucidMedia ClickSense/4.?] +Parent=General Crawlers +Browser=LucidMedia-ClickSense isBanned=true [MapoftheInternet.com?(?http://MapoftheInternet.com)] Parent=General Crawlers Browser=MapoftheInternet -Stripper=true isBanned=true [Marvin v0.3] @@ -1543,6 +1188,16 @@ Version=0.01 MajorVer=0 MinorVer=01 +[metatagsdir/*] +Parent=General Crawlers +Browser=metatagsdir +isBanned=true + +[Microsoft Windows Network Diagnostics] +Parent=General Crawlers +Browser=Microsoft Windows Network Diagnostics +isBanned=true + [Miva (AlgoFeedback@miva.com)] Parent=General Crawlers Browser=Miva @@ -1557,7 +1212,6 @@ Browser=Mozdex [Mozilla Compatible (MS IE 3.01 WinNT)] Parent=General Crawlers -Stripper=true isBanned=true [Mozilla/* (compatible; WebCapture*)] @@ -1568,10 +1222,13 @@ Browser=WebCapture Parent=General Crawlers Browser=DepSpid +[Mozilla/4.0 (compatible; MSIE *; Windows NT *; SV1)] +Parent=General Crawlers +Browser=AVG + [Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)] Parent=General Crawlers Browser=Vonna.com -Stripper=true isBanned=true [Mozilla/4.0 (compatible; MSIE 4.01; Windows95)] @@ -1592,42 +1249,85 @@ Browser=N-Stealth [Mozilla/4.0 (compatible; Scumbot/*; Linux/*)] Parent=General Crawlers -Stripper=true isBanned=true [Mozilla/4.0 (compatible; Spider; Linux)] Parent=General Crawlers -Stripper=true +isBanned=true + +[Mozilla/4.0 (compatible; Win32)] +Parent=General Crawlers +Browser=Unknown Crawler isBanned=true [Mozilla/4.1] Parent=General Crawlers -Stripper=true isBanned=true [Mozilla/4.5] Parent=General Crawlers -Stripper=true +isBanned=true + +[Mozilla/5.0 (*http://gnomit.com/) Gecko/* Gnomit/1.0] +Parent=General Crawlers +Browser=Gnomit isBanned=true [Mozilla/5.0 (compatible; AboutUsBot/*)] Parent=General Crawlers Browser=AboutUsBot +isBanned=true [Mozilla/5.0 (compatible; BuzzRankingBot/*)] Parent=General Crawlers Browser=BuzzRankingBot -Stripper=true isBanned=true +[Mozilla/5.0 (compatible; Diffbot/0.1; http://www.diffbot.com)] +Parent=General Crawlers +Browser=Diffbot + +[Mozilla/5.0 (compatible; FirstSearchBot/1.0; *)] +Parent=General Crawlers +Browser=FirstSearchBot + [mozilla/5.0 (compatible; genevabot http://www.healthdash.com)] Parent=General Crawlers Browser=Healthdash +[Mozilla/5.0 (compatible; JadynAveBot; *http://www.jadynave.com/robot*] +Parent=General Crawlers +Browser=JadynAveBot +isBanned=true + [Mozilla/5.0 (compatible; Kyluka crawl; http://www.kyluka.com/crawl.html; crawl@kyluka.com)] Parent=General Crawlers Browser=Kyluka +[Mozilla/5.0 (compatible; MJ12bot/v1.2.*; http://www.majestic12.co.uk/bot.php*)] +Parent=General Crawlers +Browser=MJ12bot +Version=1.2 +MajorVer=1 +MinorVer=2 + +[Mozilla/5.0 (compatible; MSIE 7.0 ?http://www.europarchive.org)] +Parent=General Crawlers +Browser=Europe Web Archive + +[Mozilla/5.0 (compatible; Seznam screenshot-generator 2.0;*)] +Parent=General Crawlers +Browser=Seznam screenshot-generator +isBanned=true + +[Mozilla/5.0 (compatible; Twingly Recon; http://www.twingly.com/)] +Parent=General Crawlers +Browser=Twingly Recon + +[Mozilla/5.0 (compatible; unwrapbot/2.*; http://www.unwrap.jp*)] +Parent=General Crawlers +Browser=UnWrap + [Mozilla/5.0 (compatible; Vermut*)] Parent=General Crawlers Browser=Vermut @@ -1635,7 +1335,6 @@ Browser=Vermut [Mozilla/5.0 (compatible; Webbot/*)] Parent=General Crawlers Browser=Webbot.ru -Stripper=true isBanned=true [n4p_bot*] @@ -1649,7 +1348,11 @@ Browser=Nabot [NetCarta_WebMapper/*] Parent=General Crawlers Browser=NetCarta_WebMapper -Stripper=true +isBanned=true + +[NetID.com Bot*] +Parent=General Crawlers +Browser=NetID.com Bot isBanned=true [neTVision AG andreas.heidoetting@thomson-webcast.net] @@ -1663,7 +1366,6 @@ Browser=NextopiaBOT [nicebot] Parent=General Crawlers Browser=nicebot -Stripper=true isBanned=true [niXXieBot?Foster*] @@ -1673,13 +1375,16 @@ Browser=niXXiebot-Foster [Nozilla/P.N (Just for IDS woring)] Parent=General Crawlers Browser=Nozilla/P.N -Stripper=true isBanned=true [Nudelsalat/*] Parent=General Crawlers Browser=Nudelsalat -Stripper=true +isBanned=true + +[NV32ts] +Parent=General Crawlers +Browser=NV32ts isBanned=true [Ocelli/*] @@ -1693,7 +1398,6 @@ Browser=OpenTaggerBot [Oracle Enterprise Search] Parent=General Crawlers Browser=Oracle Enterprise Search -Stripper=true isBanned=true [Oracle Ultra Search] @@ -1703,19 +1407,26 @@ Browser=Oracle Ultra Search [Pajaczek/*] Parent=General Crawlers Browser=Pajaczek -Stripper=true isBanned=true [panscient.com] Parent=General Crawlers Browser=panscient.com -Stripper=true isBanned=true [Patwebbot (http://www.herz-power.de/technik.html)] Parent=General Crawlers Browser=Patwebbot +[PDFBot (crawler@pdfind.com)] +Parent=General Crawlers +Browser=PDFBot + +[Pete-Spider/1.*] +Parent=General Crawlers +Browser=Pete-Spider +isBanned=true + [PhpDig/*] Parent=General Crawlers Browser=PhpDig @@ -1723,13 +1434,17 @@ Browser=PhpDig [PlantyNet_WebRobot*] Parent=General Crawlers Browser=PlantyNet -Stripper=true isBanned=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PluckIt + +[PluckItCrawler/1.0 (*)] +Parent=General Crawlers +isMobileDevice=true + [PMAFind] Parent=General Crawlers Browser=PMAFind -Stripper=true isBanned=true [Poodle_predictor_1.0] @@ -1739,25 +1454,26 @@ Browser=Poodle Predictor [QuickFinder Crawler] Parent=General Crawlers Browser=QuickFinder -Stripper=true isBanned=true [Radiation Retriever*] Parent=General Crawlers Browser=Radiation Retriever -Stripper=true isBanned=true [RedCarpet/*] Parent=General Crawlers Browser=RedCarpet -Stripper=true isBanned=true [RixBot (http://babelserver.org/rix)] Parent=General Crawlers Browser=RixBot +[Rome Client (http://tinyurl.com/64t5n) Ver: 0.*] +Parent=General Crawlers +Browser=TinyURL + [SBIder/*] Parent=General Crawlers Browser=SiteSell @@ -1765,7 +1481,6 @@ Browser=SiteSell [ScollSpider/2.*] Parent=General Crawlers Browser=ScollSpider -Stripper=true isBanned=true [Search Fst] @@ -1775,13 +1490,11 @@ Browser=Search Fst [searchbot admin@google.com] Parent=General Crawlers Browser=searchbot -Stripper=true isBanned=true [Seeker.lookseek.com] Parent=General Crawlers Browser=LookSeek -Stripper=true isBanned=true [semanticdiscovery/*] @@ -1791,7 +1504,16 @@ Browser=Semantic Discovery [SeznamBot/*] Parent=General Crawlers Browser=SeznamBot -Stripper=true +isBanned=true + +[Shelob (shelob@gmx.net)] +Parent=General Crawlers +Browser=Shelob +isBanned=true + +[shelob v1.*] +Parent=General Crawlers +Browser=shelob isBanned=true [ShopWiki/1.0*] @@ -1804,7 +1526,6 @@ MinorVer=0 [ShowXML/1.0 libwww/5.4.0] Parent=General Crawlers Browser=ShowXML -Stripper=true isBanned=true [sitecheck.internetseer.com*] @@ -1818,37 +1539,40 @@ Browser=SMBot [sohu*] Parent=General Crawlers Browser=sohu-search -Stripper=true isBanned=true [SpankBot*] Parent=General Crawlers Browser=SpankBot -Stripper=true isBanned=true [spider (tspyyp@tom.com)] Parent=General Crawlers Browser=spider (tspyyp@tom.com) -Stripper=true isBanned=true [Sunrise/0.*] Parent=General Crawlers Browser=Sunrise -Stripper=true +isBanned=true + +[Superpages URL Verification Engine] +Parent=General Crawlers +Browser=Superpages + +[Surf Knight] +Parent=General Crawlers +Browser=Surf Knight isBanned=true [SurveyBot/*] Parent=General Crawlers Browser=SurveyBot -Stripper=true isBanned=true [SynapticSearch/AI Crawler 1.?] Parent=General Crawlers Browser=SynapticSearch -Stripper=true isBanned=true [SyncMgr] @@ -1862,7 +1586,6 @@ Browser=Tagyu [Talkro Web-Shot/*] Parent=General Crawlers Browser=Talkro Web-Shot -Stripper=true isBanned=true [Tecomi Bot (http://www.tecomi.com/bot.htm)] @@ -1872,12 +1595,15 @@ Browser=Tecomi [TheInformant*] Parent=General Crawlers Browser=TheInformant -Stripper=true +isBanned=true + +[Toata dragostea*] +Parent=General Crawlers +Browser=Toata dragostea isBanned=true [Tutorial Crawler*] Parent=General Crawlers -Stripper=true isBanned=true [UbiCrawler/*] @@ -1890,13 +1616,20 @@ Browser=UCmore [User*Agent:*] Parent=General Crawlers -Stripper=true isBanned=true +[USER_AGENT] +Parent=General Crawlers +Browser=USER_AGENT +isBanned=true + +[VadixBot] +Parent=General Crawlers +Browser=VadixBot + [VengaBot/*] Parent=General Crawlers Browser=VengaBot -Stripper=true isBanned=true [Visicom Toolbar] @@ -1910,7 +1643,11 @@ Browser=W3C-WebCon [Webclipping.com] Parent=General Crawlers Browser=Webclipping.com -Stripper=true +isBanned=true + +[webcollage/*] +Parent=General Crawlers +Browser=WebCollage isBanned=true [WebCrawler_1.*] @@ -1932,7 +1669,6 @@ Browser=WebTrends [West Wind Internet Protocols*] Parent=General Crawlers Browser=Versatel -Stripper=true isBanned=true [WhizBang] @@ -1946,7 +1682,6 @@ Browser=Willow Internet Crawler [WIRE/* (Linux; i686; Bot,Robot,Spider,Crawler)] Parent=General Crawlers Browser=WIRE -Stripper=true isBanned=true [www.fi crawler, contact crawler@www.fi] @@ -1956,7 +1691,6 @@ Browser=www.fi crawler [Xerka WebBot v1.*] Parent=General Crawlers Browser=Xerka -Stripper=true isBanned=true [XML Sitemaps Generator*] @@ -1966,19 +1700,21 @@ Browser=XML Sitemaps Generator [XSpider*] Parent=General Crawlers Browser=XSpider -Stripper=true isBanned=true [YooW!/* (?http://www.yoow.eu)] Parent=General Crawlers Browser=YooW! -Stripper=true +isBanned=true + +[HiddenMarket-*] +Parent=General RSS +Browser=HiddenMarket isBanned=true [FOTOCHECKER] Parent=Image Crawlers Browser=FOTOCHECKER -Stripper=true isBanned=true ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Search Engines @@ -1986,8 +1722,6 @@ isBanned=true [Search Engines] Parent=DefaultProperties Browser=Search Engines -Frames=true -Tables=true Crawler=true [*FDSE robot*] @@ -2045,10 +1779,30 @@ Browser=RawGrunt Parent=Search Engines Browser=Bit Torrent Search Engine +[Busiversebot/v1.0 (http://www.busiverse.com/bot.php)] +Parent=Search Engines +Browser=Busiversebot +isBanned=true + +[CatchBot/*; http://www.catchbot.com] +Parent=Search Engines +Browser=CatchBot +Version=1.0 +MajorVer=1 +MinorVer=0 + [CipinetBot (http://www.cipinet.com/bot.html)] Parent=Search Engines Browser=CipinetBot +[Cogentbot/1.?*] +Parent=Search Engines +Browser=Cogentbot + +[compatible; Mozilla 4.0; MSIE 5.5; (SqwidgeBot v1.01 - http://www.sqwidge.com/bot/)] +Parent=Search Engines +Browser=SqwidgeBot + [cosmos*] Parent=Search Engines Browser=Xyleme @@ -2061,6 +1815,14 @@ Browser=Deepindex Parent=Search Engines Browser=DiamondBot +[Dumbot*] +Parent=Search Engines +Browser=Dumbot +Version=0.2 +MajorVer=0 +MinorVer=2 +Beta=true + [Eule?Robot*] Parent=Search Engines Browser=Eule-Robot @@ -2073,18 +1835,24 @@ Browser=Faxo Parent=Search Engines Browser=Filangy -[Fooky.com/ScorpionBot/ScoutOut;*] +[flatlandbot/*] +Parent=Search Engines +Browser=Flatland + +[Fooky.com/ScorpionBot/ScoutOut;*] Parent=Search Engines Browser=ScorpionBot -Stripper=true isBanned=true [FyberSpider*] Parent=Search Engines Browser=FyberSpider -Stripper=true isBanned=true +[Gaisbot/*] +Parent=Search Engines +Browser=Gaisbot + [gazz/*(gazz@nttr.co.jp)] Parent=Search Engines Browser=gazz @@ -2108,13 +1876,16 @@ Browser=GroschoBot [GurujiBot/1.*] Parent=Search Engines Browser=GurujiBot -Stripper=true isBanned=true [HenryTheMiragoRobot*] Parent=Search Engines Browser=Mirago +[HolmesBot (http://holmes.ge)] +Parent=Search Engines +Browser=HolmesBot + [Hotzonu/*] Parent=Search Engines Browser=Hotzonu @@ -2122,13 +1893,16 @@ Browser=Hotzonu [HyperEstraier/*] Parent=Search Engines Browser=HyperEstraier -Stripper=true isBanned=true [i1searchbot/*] Parent=Search Engines Browser=i1searchbot +[IIITBOT/1.*] +Parent=Search Engines +Browser=Indian Language Web Search Engine + [Iltrovatore-?etaccio/*] Parent=Search Engines Browser=Iltrovatore-Setaccio @@ -2136,7 +1910,6 @@ Browser=Iltrovatore-Setaccio [InfociousBot (?http://corp.infocious.com/tech_crawler.php)] Parent=Search Engines Browser=InfociousBot -Stripper=true isBanned=true [Infoseek SideWinder/*] @@ -2147,16 +1920,18 @@ Browser=Infoseek Parent=Search Engines Browser=iSEEKbot +[Knight/0.? (Zook Knight; http://knight.zook.in/; knight@zook.in)] +Parent=Search Engines +Browser=Knight + [Kolinka Forum Search (www.kolinka.com)] Parent=Search Engines Browser=Kolinka Forum Search -Stripper=true isBanned=true [KRetrieve/] Parent=Search Engines Browser=KRetrieve -Stripper=true isBanned=true [LapozzBot/*] @@ -2186,29 +1961,32 @@ MinorVer=0 Parent=Search Engines Browser=miniRank -[MJ12bot/*] -Parent=Search Engines -Browser=Majestic-12 - [Mnogosearch*] Parent=Search Engines Browser=Mnogosearch +[Mozilla/0.9* no dos :) (Linux)] +Parent=Search Engines +Browser=goliat +isBanned=true + [Mozilla/4.0 (compatible; Arachmo)] Parent=Search Engines Browser=Arachmo +[Mozilla/4.0 (compatible; http://search.thunderstone.com/texis/websearch/about.html)] +Parent=Search Engines +Browser=ThunderStone +isBanned=true + [Mozilla/4.0 (compatible; MSIE *; Windows NT; Girafabot; girafabot at girafa dot com; http://www.girafa.com)] Parent=Search Engines Browser=Girafabot Win32=true -[Mozilla/4.0 (compatible; MSIE 5.00; Windows 98] +[Mozilla/4.0 (compatible; Vagabondo/*; webcrawler at wise-guys dot nl; *)] Parent=Search Engines -Browser=directNIC -Win32=true -Stripper=true -isBanned=true +Browser=Vagabondo [Mozilla/4.0(?compatible; MSIE 6.0; Qihoo *)] Parent=Search Engines @@ -2218,37 +1996,47 @@ Browser=Qihoo Parent=Search Engines Browser=Inxight Software -[Mozilla/5.0 (*) VoilaBot BETA 1.*] +[Mozilla/5.0 (*) VoilaBot*] Parent=Search Engines Browser=VoilaBot -Stripper=true isBanned=true [Mozilla/5.0 (compatible; ActiveTouristBot*; http://www.activetourist.com)] Parent=Search Engines Browser=ActiveTouristBot -[Mozilla/5.0 (compatible; Charlotte/1.0b; *)] +[Mozilla/5.0 (compatible; Butterfly/1.0; *)*] +Parent=Search Engines +Browser=Butterfly + +[Mozilla/5.0 (compatible; Charlotte/*; *)] Parent=Search Engines Browser=Charlotte Beta=true -Stripper=true isBanned=true -[Mozilla/5.0 (compatible; CXL-FatAssANT (El Robeiro); http://www.conexcol.com/FatAssANT/; ANTid:alfa; v. 0.5.1)] +[Mozilla/5.0 (compatible; CXL-FatAssANT*)] +Parent=Search Engines +Browser=FatAssANT + +[Mozilla/5.0 (compatible; DBLBot/1.0; ?http://www.dontbuylists.com/)] Parent=Search Engines -Browser=Conexcol.com +Browser=DBLBot +Version=1.0 +MajorVer=1 +MinorVer=0 [Mozilla/5.0 (compatible; EARTHCOM.info/*)] Parent=Search Engines Browser=EARTHCOM -[Mozilla/5.0 (compatible; MojeekBot/2.0; http://www.mojeek.com/bot.html)] +[Mozilla/5.0 (compatible; Lipperhey Spider; http://www.lipperhey.com/)] +Parent=Search Engines +Browser=Lipperhey Spider + +[Mozilla/5.0 (compatible; MojeekBot/*; http://www.mojeek.com/bot.html)] Parent=Search Engines Browser=MojeekBot -Version=2.0 -MajorVer=2 -MinorVer=0 [Mozilla/5.0 (compatible; NLCrawler/*] Parent=Search Engines @@ -2257,23 +2045,54 @@ Browser=Northern Light Web Search [Mozilla/5.0 (compatible; OsO;*] Parent=Search Engines Browser=Octopodus -Stripper=true isBanned=true +[Mozilla/5.0 (compatible; Pogodak.*)] +Parent=Search Engines +Browser=Pogodak + +[Mozilla/5.0 (compatible; Quantcastbot/1.*)] +Parent=Search Engines +Browser=Quantcastbot + +[Mozilla/5.0 (compatible; ScoutJet; *http://www.scoutjet.com/)] +Parent=Search Engines +Browser=ScoutJet + [Mozilla/5.0 (compatible; Scrubby/*; http://www.scrubtheweb.com/abs/meta-check.html)] Parent=Search Engines Browser=Scrubby -Stripper=true +isBanned=true + +[Mozilla/5.0 (compatible; YoudaoBot/1.*; http://www.youdao.com/help/webmaster/spider/*)] +Parent=Search Engines +Browser=YoudaoBot +Version=1.0 +MajorVer=1 +MinorVer=0 + +[Mozilla/5.0 (Twiceler*)] +Parent=Search Engines +Browser=Twiceler isBanned=true [Mozilla/5.0 CostaCider Search*] Parent=Search Engines Browser=CostaCider Search +[Mozilla/5.0 GurujiBot/1.0 (*)] +Parent=Search Engines +Browser=GurujiBot + [NavissoBot] Parent=Search Engines Browser=NavissoBot +[NextGenSearchBot*(for information visit *)] +Parent=Search Engines +Browser=ZoomInfo +isBanned=true + [Norbert the Spider(Burf.com)] Parent=Search Engines Browser=Norbert the Spider @@ -2349,13 +2168,11 @@ Browser=Sproose [Sqeobot/0.*] Parent=Search Engines Browser=Branzel -Stripper=true isBanned=true [SquigglebotBot/*] Parent=Search Engines Browser=SquigglebotBot -Stripper=true isBanned=true [StackRambler/*] @@ -2377,13 +2194,11 @@ Browser=Szukacz [Tarantula/*] Parent=Search Engines Browser=Tarantula -Stripper=true isBanned=true [TerrawizBot/*] Parent=Search Engines Browser=TerrawizBot -Stripper=true isBanned=true [Tkensaku/*] @@ -2393,7 +2208,11 @@ Browser=Tkensaku [TMCrawler] Parent=Search Engines Browser=TMCrawler -Stripper=true +isBanned=true + +[Twingly Recon] +Parent=Search Engines +Browser=Twingly Recon isBanned=true [updated/*] @@ -2412,22 +2231,23 @@ Browser=Innerprise Enterprise Search Parent=Search Engines Browser=VMBot +[voyager/2.0 (http://www.kosmix.com/html/crawler.html)] +Parent=Search Engines +Browser=Voyager + [wadaino.jp-crawler*] Parent=Search Engines Browser=wadaino.jp -Stripper=true isBanned=true [WebAlta Crawler/*] Parent=Search Engines Browser=WebAlta Crawler -Stripper=true isBanned=true [WebCorp/*] Parent=Search Engines Browser=WebCorp -Stripper=true isBanned=true [webcrawl.net] @@ -2437,7 +2257,6 @@ Browser=webcrawl.net [WISEbot/*] Parent=Search Engines Browser=WISEbot -Stripper=true isBanned=true [Wotbox/*] @@ -2459,7 +2278,6 @@ Browser=YadowsCrawler [YodaoBot/*] Parent=Search Engines Browser=YodaoBot -Stripper=true isBanned=true [ZeBot_www.ze.bz*] @@ -2482,35 +2300,17 @@ Browser=ATA-Translation-Service Parent=Version Checkers Browser=GJK_Browser_Check -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DYNAMIC - -[DYNAMIC] -Parent=DefaultProperties -Browser=DYNAMIC -Stripper=true -isBanned=true -Crawler=true - -[DYNAMIC (*; http://www.dynamicplus.it; admin@dynamicplus.it)] -Parent=DYNAMIC -Browser=DYNAMIC+ - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; DYNAMIC*)] -Parent=DYNAMIC -Win32=true - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hatena [Hatena] Parent=DefaultProperties Browser=Hatena -Stripper=true isBanned=true Crawler=true -[Feed::Find/0.*] +[Feed::Find/*] Parent=Hatena -Browser=Feed::Find +Browser=Feed Find isSyndicationReader=true [Hatena Antenna/*] @@ -2526,67 +2326,18 @@ Parent=Hatena Browser=Hatena RSS isSyndicationReader=true -[HatenaScreenshot/* (checker)] +[Hatena::Crawler/*] +Parent=Hatena +Browser=Hatena Crawler + +[HatenaScreenshot*] Parent=Hatena Browser=HatenaScreenshot -[URI::Fetch/0.*] +[URI::Fetch/*] Parent=Hatena Browser=URI::Fetch -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hurricane Electric - -[Hurricane Electric] -Parent=DefaultProperties -Browser=Hurricane Electric -Stripper=true -isBanned=true -Crawler=true - -[Gigabot*] -Parent=Hurricane Electric - -[GigabotSiteSearch/*] -Parent=Hurricane Electric -Browser=GigabotSiteSearch - -[Jetbot/*] -Parent=Hurricane Electric - -[Mozilla/4.04 (compatible; Dulance bot;*)] -Parent=Hurricane Electric -Browser=Dulance - -[OmniExplorer_Bot/*] -Parent=Hurricane Electric -Browser=OmniExplorer - -[plinki/0.1*] -Parent=Hurricane Electric -Browser=plinki - -[Twiceler www.cuill.com/robots.html] -Parent=Hurricane Electric -Browser=Twiceler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iaskspider - -[iaskspider] -Parent=DefaultProperties -Browser=iaskspider -Stripper=true -isBanned=true -Crawler=true - -[iaskspider*] -Parent=iaskspider -Browser=iaskspider -Stripper=true -isBanned=true - -[Mozilla/5.0 (compatible; iaskspider/*; MSIE 6.0)] -Parent=iaskspider - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Internet Archive [Internet Archive] @@ -2595,14 +2346,12 @@ Browser=Internet Archive Frames=true IFrames=true Tables=true -Stripper=true isBanned=true Crawler=true [*heritrix*] Parent=Internet Archive -Browser=Wayback Machine -Stripper=true +Browser=Heritrix isBanned=true [ia_archiver*] @@ -2613,57 +2362,19 @@ Browser=Internet Archive Parent=Internet Archive Browser=InternetArchive -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Marty Anstey - -[Marty Anstey] -Parent=DefaultProperties -Browser=Marty Anstey -Stripper=true -isBanned=true -Crawler=true - -[Helix/1.2 (?http://www.sitesearch.ca/helix/)] -Parent=Marty Anstey - -[Mozilla/2.0 (compatible; DC9FE0029G; FreeBSD 5.4-RELEASE; i386; en_US)] -Parent=Marty Anstey - -[Reaper/* (?http://www.sitesearch.ca/reaper)] -Parent=Marty Anstey -Browser=Reaper - -[Vortex/2.2*] -Parent=Marty Anstey -Browser=Vortex -Stripper=true -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Microsoft_Internet_Explorer - -[Microsoft_Internet_Explorer] -Parent=DefaultProperties -Browser=Microsoft_Internet_Explorer -Stripper=true -isBanned=true -Crawler=true - -[Microsoft_Internet_Explorer_5.00.*] -Parent=Microsoft_Internet_Explorer -Stripper=true -isBanned=true +[Mozilla/5.0 (compatible; archive.org_bot/1.*)] +Parent=Internet Archive ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nutch [Nutch] Parent=DefaultProperties Browser=Nutch -Stripper=true isBanned=true Crawler=true [*Nutch*] Parent=Nutch -Stripper=true isBanned=true [CazoodleBot/*] @@ -2674,46 +2385,55 @@ Browser=CazoodleBot Parent=Nutch Browser=LOOQ +[Nutch/0.? (OpenX Spider)] +Parent=Nutch + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Webaroo [Webaroo] Parent=DefaultProperties Browser=Webaroo -Stripper=true -isBanned=true -Crawler=true - -[PiyushBot (Piyush Web Miner;*)] -Parent=Webaroo -Browser=PiyushBot -[RufusBot (Rufus Web Miner;*)] +[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Webaroo/*)] Parent=Webaroo -Browser=RufusBot - -[SumeetBot (Sumeet Bot; *)] -Parent=Webaroo -Browser=SumeetBot +Browser=Webaroo -[WebarooBot (Webaroo Bot;*)] +[Mozilla/5.0 (Windows; U; Windows *; *; rv:*) Gecko/* Firefox/* webaroo/*] Parent=Webaroo -Browser=WebarooBot +Browser=Webaroo -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebCollage +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Word Press -[WebCollage] +[Word Press] Parent=DefaultProperties -Browser=WebCollage -Stripper=true +Browser=Word Press +Alpha=true +Beta=true +Win16=true +Win32=true +Win64=true +Frames=true +IFrames=true +Tables=true +Cookies=true +BackgroundSounds=true +CDF=true +VBScript=true +JavaApplets=true +JavaScript=true +ActiveXControls=true isBanned=true +isMobileDevice=true +isSyndicationReader=true Crawler=true -[mywebcollage/*] -Parent=WebCollage +[WordPress-B-/2.*] +Parent=Word Press +Browser=WordPress-B -[webcollage*/*] -Parent=WebCollage -Browser=WebCollage +[WordPress-Do-P-/2.*] +Parent=Word Press +Browser=WordPress-Do-P [BlueCoat ProxySG] Parent=Blue Coat Systems @@ -2740,7 +2460,6 @@ Browser=Bluecoat [Copyright/Plagiarism] Parent=DefaultProperties Browser=Copyright/Plagiarism -Stripper=true isBanned=true Crawler=true @@ -2748,6 +2467,10 @@ Crawler=true Parent=Copyright/Plagiarism Browser=BDFetch +[copyright sheriff (*)] +Parent=Copyright/Plagiarism +Browser=copyright sheriff + [CopyRightCheck*] Parent=Copyright/Plagiarism Browser=CopyRightCheck @@ -2756,10 +2479,22 @@ Browser=CopyRightCheck Parent=Copyright/Plagiarism Browser=FairAd Client +[iCopyright Conductor*] +Parent=Copyright/Plagiarism +Browser=iCopyright Conductor + [IPiumBot laurion(dot)com] Parent=Copyright/Plagiarism Browser=IPiumBot +[IWAgent/*] +Parent=Copyright/Plagiarism +Browser=Brand Protect + +[Mozilla/5.0 (compatible; DKIMRepBot/*)] +Parent=Copyright/Plagiarism +Browser=DKIMRepBot + [oBot] Parent=Copyright/Plagiarism Browser=oBot @@ -2791,10 +2526,6 @@ Browser=Domain Dossier Parent=DNS Tools Browser=DNS-Digger -[Mozilla/5.0 (compatible; DNS-Digger/*)] -Parent=DNS Tools -Browser=DNS-Digger - [OpenDNS Domain Crawler noc@opendns.com] Parent=DNS Tools Browser=OpenDNS Domain Crawler @@ -2807,10 +2538,13 @@ Browser=Download Managers Frames=true IFrames=true Tables=true -Stripper=true isBanned=true Crawler=true +[AndroidDownloadManager] +Parent=Download Managers +Browser=Android Download Manager + [AutoMate5] Parent=Download Managers Browser=AutoMate5 @@ -3031,7 +2765,6 @@ Browser=E-Mail Harvesters Frames=true IFrames=true Tables=true -Stripper=true isBanned=true Crawler=true @@ -3143,6 +2876,10 @@ Browser=Bloglines Title Fetch Parent=Feeds Blogs Browser=BlogLines Web +[BlogPulseLive (support@blogpulse.com)] +Parent=Feeds Blogs +Browser=BlogPulseLive + [blogsearchbot-pumpkin-2] Parent=Feeds Blogs Browser=blogsearchbot-pumpkin @@ -3189,6 +2926,15 @@ Parent=Feeds Syndicators Parent=Feeds Syndicators Browser=NetVisualize +[AideRSS 2.* (postrank.com)] +Parent=Feeds Syndicators +Browser=AideRSS + +[AideRSS/2.0 (aiderss.com)] +Parent=Feeds Syndicators +Browser=AideRSS +isBanned=true + [Akregator/*] Parent=Feeds Syndicators Browser=Akregator @@ -3201,13 +2947,16 @@ Platform=MacOSX [Cocoal.icio.us/* (*)*] Parent=Feeds Syndicators Browser=Cocoal.icio.us -Stripper=true isBanned=true [Feed43 Proxy/* (*)] Parent=Feeds Syndicators Browser=Feed For Free +[FeedBurner/*] +Parent=Feeds Syndicators +Browser=FeedBurner + [FeedDemon/* (*)] Parent=Feeds Syndicators Browser=FeedDemon @@ -3217,6 +2966,20 @@ Platform=Win32 Parent=Feeds Syndicators Browser=FeedDigest +[FeedGhost/1.*] +Parent=Feeds Syndicators +Browser=FeedGhost +Version=1.0 +MajorVer=1 +MinorVer=0 + +[FeedOnFeeds/0.1.* ( http://minutillo.com/steve/feedonfeeds/)] +Parent=Feeds Syndicators +Browser=FeedOnFeeds +Version=0.1 +MajorVer=0 +MinorVer=1 + [Feedreader * (Powered by Newsbrain)] Parent=Feeds Syndicators Browser=Newsbrain @@ -3225,6 +2988,10 @@ Browser=Newsbrain Parent=Feeds Syndicators Browser=Feedshow +[Feedster Crawler/?.0; Feedster, Inc.] +Parent=Feeds Syndicators +Browser=Feedster + [GreatNews/1.0] Parent=Feeds Syndicators Browser=GreatNews @@ -3243,13 +3010,29 @@ Browser=intraVnews [JetBrains Omea Reader*] Parent=Feeds Syndicators Browser=Omea Reader -Stripper=true isBanned=true +[Liferea/1.5* (Linux; *; http://liferea.sf.net/)] +Parent=Feeds Syndicators +Browser=Liferea +isBanned=true + +[livedoor FeedFetcher/0.0* (http://reader.livedoor.com/;*)] +Parent=Feeds Syndicators +Browser=FeedFetcher +Version=0.0 +MajorVer=0 +MinorVer=0 + [MagpieRSS/* (*)] Parent=Feeds Syndicators Browser=MagpieRSS +[Mobitype * (compatible; Mozilla/*; MSIE *.*; Windows *)] +Parent=Feeds Syndicators +Browser=Mobitype +Platform=Win32 + [Mozilla/5.0 (*; Rojo *; http://www.rojo.com/corporate/help/agg; *)*] Parent=Feeds Syndicators Browser=Rojo @@ -3262,14 +3045,18 @@ Browser=TailRank Parent=Feeds Syndicators Browser=Podtech Network -[Mozilla/5.0 (compatible; newstin.com;*)] -Parent=Feeds Syndicators -Browser=NewsTin - [Mozilla/5.0 (compatible; Newz Crawler *; http://www.newzcrawler.com/?)] Parent=Feeds Syndicators Browser=Newz Crawler +[Mozilla/5.0 (compatible; RSSMicro.com RSS/Atom Feed Robot)] +Parent=Feeds Syndicators +Browser=RSSMicro + +[Mozilla/5.0 (compatible;*newstin.com;*)] +Parent=Feeds Syndicators +Browser=NewsTin + [Mozilla/5.0 (RSS Reader Panel)] Parent=Feeds Syndicators Browser=RSS Reader Panel @@ -3286,10 +3073,6 @@ Browser=NewsMonster Parent=Feeds Syndicators Browser=Rojo -[Mozilla/6.0 (MSIE 6.0; *RSSMicro.com RSS/Atom Feed Robot)] -Parent=Feeds Syndicators -Browser=RSS Micro - [Netvibes (*)] Parent=Feeds Syndicators Browser=Netvibes @@ -3302,6 +3085,10 @@ Browser=NewsAlloy Parent=Feeds Syndicators Browser=Omnipelagos +[Particls] +Parent=Feeds Syndicators +Browser=Particls + [Protopage/* (*)] Parent=Feeds Syndicators Browser=Protopage @@ -3310,6 +3097,10 @@ Browser=Protopage Parent=Feeds Syndicators Browser=PubSub-RSS-Reader +[RSS Menu/*] +Parent=Feeds Syndicators +Browser=RSS Menu + [RssBandit/*] Parent=Feeds Syndicators Browser=RssBandit @@ -3332,13 +3123,20 @@ Browser=SimplePie [Strategic Board Bot (?http://www.strategicboard.com)] Parent=Feeds Syndicators Browser=Strategic Board Bot -Stripper=true isBanned=true [TargetYourNews.com bot] Parent=Feeds Syndicators Browser=TargetYourNews +[Technoratibot/*] +Parent=Feeds Syndicators +Browser=Technoratibot + +[Tumblr/* RSS syndication ( http://www.tumblr.com/) (support@tumblr.com)] +Parent=Feeds Syndicators +Browser=Tumblr RSS syndication + [Windows-RSS-Platform/1.0*] Parent=Feeds Syndicators Browser=Windows-RSS-Platform @@ -3356,11 +3154,46 @@ Browser=Wizz [General RSS] Parent=DefaultProperties Browser=General RSS +isSyndicationReader=true + +[AideRSS/1.0 (aiderss.com); * subscribers] +Parent=General RSS +Browser=AideRSS +Version=1.0 +MajorVer=1 +MinorVer=0 + +[CC Metadata Scaper http://wiki.creativecommons.org/Metadata_Scraper] +Parent=General RSS +Browser=CC Metadata Scaper [Mozilla/5.0 (compatible) GM RSS Panel] Parent=General RSS Browser=RSS Panel +[Mozilla/5.0 http://www.inclue.com; graeme@inclue.com] +Parent=General RSS +Browser=Inclue + +[Runnk online rss reader : http://www.runnk.com/ : RSS favorites : RSS ranking : RSS aggregator*] +Parent=General RSS +Browser=Ruunk + +[Windows-RSS-Platform/2.0 (MSIE 8.0; Windows NT 6.0)] +Parent=General RSS +Browser=Windows-RSS-Platform +Platform=WinVista + +[Mozilla/5.0 (X11; ?; Linux; *) AppleWebKit/* (KHTML, like Gecko, Safari/*) Arora/0.4] +Parent=Google Code +Browser=Arora +Version=0.4 +MajorVer=0 +MinorVer=4 +Platform=Linux +CssVersion=2 +supportsCSS=true + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Validation Checkers [HTML Validators] @@ -3398,7 +3231,7 @@ Browser=W3C Validator Parent=HTML Validators Browser=W3C Line Mode -[Weblide/2.0 beta8*] +[Weblide/2.? beta*] Parent=HTML Validators Browser=Weblide Version=2.0 @@ -3421,10 +3254,13 @@ Browser=Image Crawlers Frames=true IFrames=true Tables=true -Stripper=true isBanned=true Crawler=true +[*CFNetwork*] +Parent=Image Crawlers +Browser=CFNetwork + [*PhotoStickies/*] Parent=Image Crawlers Browser=PhotoStickies @@ -3433,6 +3269,11 @@ Browser=PhotoStickies Parent=Image Crawlers Browser=Camcrawler +[CydralSpider/*] +Parent=Image Crawlers +Browser=Cydral Web Image Search +isBanned=true + [Der gro\xdfe BilderSauger*] Parent=Image Crawlers Browser=Gallery Grabber @@ -3453,10 +3294,18 @@ Browser=HTML2JPG Parent=Image Crawlers Browser=IconSurf +[kalooga/KaloogaBot*] +Parent=Image Crawlers +Browser=KaloogaBot + [Mister PIX*] Parent=Image Crawlers Browser=Mister PIX +[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/* (*) Pandora/2.*] +Parent=Image Crawlers +Browser=Pandora + [naoFavicon4IE*] Parent=Image Crawlers Browser=naoFavicon4IE @@ -3465,10 +3314,6 @@ Browser=naoFavicon4IE Parent=Image Crawlers Browser=pixfinder -[psbot/*] -Parent=Image Crawlers -Browser=PSBot - [rssImagesBot/0.1 (*http://herbert.groot.jebbink.nl/?app=rssImages)] Parent=Image Crawlers Browser=rssImagesBot @@ -3477,6 +3322,10 @@ Browser=rssImagesBot Parent=Image Crawlers Browser=Web Image Collector +[WebImages * (?http://herbert.groot.jebbink.nl/?app=WebImages?)] +Parent=Image Crawlers +Browser=WebImages + [WebPix*] Parent=Image Crawlers Browser=Custo @@ -3522,7 +3371,6 @@ Browser=Web Link Validator [*Zeus*] Parent=Link Checkers Browser=Zeus -Stripper=true isBanned=true [ActiveBookmark *] @@ -3604,7 +3452,6 @@ Browser=JRTwine [Link Valet Online*] Parent=Link Checkers Browser=Link Valet -Stripper=true isBanned=true [LinkAlarm/*] @@ -3622,7 +3469,6 @@ Browser=LinkChecker [LinkextractorPro*] Parent=Link Checkers Browser=LinkextractorPro -Stripper=true isBanned=true [LinkLint-checkonly/*] @@ -3648,7 +3494,6 @@ Browser=MetaGer-LinkChecker [Mozilla/* (compatible; linktiger/*; *http://www.linktiger.com*)] Parent=Link Checkers Browser=LinkTiger -Stripper=true isBanned=true [Mozilla/4.0 (Compatible); URLBase*] @@ -3672,6 +3517,10 @@ MajorVer=3 MinorVer=0 Platform=Win32 +[Mozilla/4.0 (compatible; smartBot/1.*; checking links; *)] +Parent=Link Checkers +Browser=smartBot + [Mozilla/4.0 (compatible; SuperCleaner*;*)] Parent=Link Checkers Browser=SuperCleaner @@ -3679,7 +3528,6 @@ Browser=SuperCleaner [Mozilla/5.0 gURLChecker/*] Parent=Link Checkers Browser=gURLChecker -Stripper=true isBanned=true [Newsgroupreporter LinkCheck] @@ -3693,7 +3541,6 @@ Browser=onCHECK Linkchecker [online link validator (http://www.dead-links.com/)] Parent=Link Checkers Browser=Dead-Links.com -Stripper=true isBanned=true [REL Link Checker*] @@ -3711,14 +3558,12 @@ Browser=Robozilla [RPT-HTTPClient/*] Parent=Link Checkers Browser=RPT-HTTPClient -Stripper=true isBanned=true [SafariBookmarkChecker*(?http://www.coriolis.ch/)] Parent=Link Checkers Browser=SafariBookmarkChecker Platform=MacOSX -CSS=2 CssVersion=2 supportsCSS=true @@ -3752,7 +3597,6 @@ Browser=WorQmada [Xenu* Link Sleuth*] Parent=Link Checkers Browser=Xenu's Link Sleuth -Stripper=true isBanned=true [Z-Add Link Checker*] @@ -3764,13 +3608,11 @@ Browser=Z-Add Link Checker [Microsoft] Parent=DefaultProperties Browser=Microsoft -Stripper=true isBanned=true [Live (http://www.live.com/)] Parent=Microsoft Browser=Microsoft Live -Stripper=false isBanned=false isSyndicationReader=true @@ -3826,10 +3668,17 @@ Browser=Microsoft Visio Parent=Microsoft Browser=Microsoft-WebDAV +[Mozilla/5.0 (Macintosh; Intel Mac OS X) Excel/12.*] +Parent=Microsoft +Browser=Microsoft Excel +Version=12.0 +MajorVer=12 +MinorVer=0 +Platform=MacOSX + [MSN Feed Manager] Parent=Microsoft Browser=MSN Feed Manager -Stripper=false isBanned=false isSyndicationReader=true @@ -3855,6 +3704,11 @@ Platform=Amiga Parent=Miscellaneous Browsers Browser=Avant Browser +[12345] +Parent=Miscellaneous Browsers +Browser=12345 +isBanned=true + [Ace Explorer] Parent=Miscellaneous Browsers Browser=Ace Explorer @@ -3863,7 +3717,20 @@ Browser=Ace Explorer Parent=Miscellaneous Browsers Browser=Enigma Browser -[Godzilla/* (Basic*; *; Commodore C=64; *; rv:1.*)*] +[EVE-minibrowser/*] +Parent=Miscellaneous Browsers +Browser=EVE-minibrowser +IFrames=false +Tables=false +BackgroundSounds=false +VBScript=false +JavaApplets=false +JavaScript=false +ActiveXControls=false +isBanned=false +Crawler=false + +[Godzilla/* (Basic*; *; Commodore C=64; *; rv:1.*)*] Parent=Miscellaneous Browsers Browser=Godzilla @@ -3879,7 +3746,6 @@ VBScript=true JavaApplets=true JavaScript=true ActiveXControls=true -CSS=2 CssVersion=2 supportsCSS=true @@ -3890,10 +3756,13 @@ Platform=WyderOS IFrames=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true +[Mozilla/* (*) - BrowseX (*)] +Parent=Miscellaneous Browsers +Browser=BrowseX + [Mozilla/* (Win32;*Escape?*; ?)] Parent=Miscellaneous Browsers Browser=Escape @@ -3926,10 +3795,6 @@ MinorVer=1 Parent=Miscellaneous Browsers Browser=Wipeout Pure -[Sleipnir*] -Parent=Miscellaneous Browsers -Browser=Sleipnir - [SlimBrowser] Parent=Miscellaneous Browsers Browser=SlimBrowser @@ -3941,10 +3806,14 @@ Version=1.69 MajorVer=1 MinorVer=69 Platform=Win16 -CSS=3 CssVersion=3 supportsCSS=true +[*Netcraft Webserver Survey*] +Parent=Netcraft +Browser=Netcraft Webserver Survey +isBanned=true + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Offline Browsers [Offline Browsers] @@ -3953,7 +3822,6 @@ Browser=Offline Browsers Frames=true Tables=true Cookies=true -Stripper=true isBanned=true Crawler=true @@ -3994,9 +3862,13 @@ Browser=Teleport [Online Scanners] Parent=DefaultProperties Browser=Online Scanners -Stripper=true isBanned=true +[JoeDog/* (X11; I; Siege *)] +Parent=Online Scanners +Browser=JoeDog +isBanned=false + [Morfeus Fucking Scanner] Parent=Online Scanners Browser=Morfeus Fucking Scanner @@ -4018,7 +3890,6 @@ Browser=Secure Computing Corporation [Proxy Servers] Parent=DefaultProperties Browser=Proxy Servers -Stripper=true isBanned=true [*squid*] @@ -4068,7 +3939,6 @@ Browser=SaferSurf [Mozilla/5.0 (compatible; del.icio.us-thumbnails/*; *) KHTML/* (like Gecko)] Parent=Proxy Servers Browser=Yahoo! -Stripper=true isBanned=true Crawler=true @@ -4087,7 +3957,6 @@ Browser=Privoxy [ProxyTester*] Parent=Proxy Servers Browser=ProxyTester -Stripper=true isBanned=true Crawler=true @@ -4095,6 +3964,10 @@ Crawler=true Parent=Proxy Servers Browser=SilentSurf +[SmallProxy*] +Parent=Proxy Servers +Browser=SmallProxy + [Space*Bison/*] Parent=Proxy Servers Browser=Proxomitron @@ -4112,7 +3985,6 @@ Browser=SurfControl [Research Projects] Parent=DefaultProperties Browser=Research Projects -Stripper=true isBanned=true Crawler=true @@ -4176,6 +4048,10 @@ MinorVer=0 Parent=Research Projects Browser=Theophrastus +[Mozilla/5.0 (compatible; Webscan v0.*; http://otc.dyndns.org/webscan/)] +Parent=Research Projects +Browser=Webscan + [MQbot*] Parent=Research Projects Browser=MQbot @@ -4212,6 +4088,10 @@ Browser=UofTDB Experiment Parent=Research Projects Browser=USyd-NLP-Spider +[woriobot*] +Parent=Research Projects +Browser=woriobot + [wwwster/* (Beta, mailto:gue@cis.uni-muenchen.de)] Parent=Research Projects Browser=wwwster @@ -4233,13 +4113,12 @@ Browser=Rippers Frames=true IFrames=true Tables=true -Stripper=true isBanned=true Crawler=true -[*grub-client*] +[*grub*] Parent=Rippers -Browser=grub-client +Browser=grub [*ickHTTP*] Parent=Rippers @@ -4398,6 +4277,14 @@ Parent=Rippers Parent=Rippers Browser=httperf +[HTTPFetch/*] +Parent=Rippers +Browser=HTTPFetch + +[HTTPGrab] +Parent=Rippers +Browser=HTTPGrab + [HttpSession] Parent=Rippers Browser=HttpSession @@ -4529,6 +4416,10 @@ Browser=OSSProxy Parent=Rippers Browser=PageLoad +[PageNest/*] +Parent=Rippers +Browser=PageNest + [pavuk/*] Parent=Rippers Browser=Pavuk @@ -4725,13 +4616,16 @@ Browser=WinScripter iNet Tools Parent=Rippers Browser=WWW-Mechanize +[Zend_Http_Client] +Parent=Rippers +Browser=Zend_Http_Client + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Site Monitors [Site Monitors] Parent=DefaultProperties Browser=Site Monitors Cookies=true -Stripper=true isBanned=true Crawler=true @@ -4742,19 +4636,6 @@ Browser=EasyRider [*maxamine.com--robot*] Parent=Site Monitors Browser=maxamine.com--robot -Stripper=true -isBanned=true - -[*Netcraft Web Server Survey*] -Parent=Site Monitors -Browser=Netcraft -Stripper=true -isBanned=true - -[*Netcraft Webserver Survey*] -Parent=Site Monitors -Browser=Netcraft Webserver Survey -Stripper=true isBanned=true [*WebMon ?.*] @@ -4768,7 +4649,6 @@ Browser=Kenjin Spider [Kevin http://*] Parent=Site Monitors Browser=Kevin -Stripper=true isBanned=true [Mozilla/4.0 (compatible; ChangeDetection/*] @@ -4798,7 +4678,6 @@ Browser=Pingdom [Site Valet Online*] Parent=Site Monitors Browser=Site Valet -Stripper=true isBanned=true [SITECHECKER] @@ -4808,7 +4687,6 @@ Browser=SITECHECKER [sitemonitor@dnsvr.com/*] Parent=Site Monitors Browser=ZoneEdit Failover Monitor -Stripper=false isBanned=false [UpTime Checker*] @@ -4855,10 +4733,22 @@ Tables=true Cookies=true JavaScript=true +[BookmarkBase(2/;http://bookmarkbase.com)] +Parent=Social Bookmarkers +Browser=BookmarkBase + [Cocoal.icio.us/1.0 (v43) (Mac OS X; http://www.scifihifi.com/cocoalicious)] Parent=Social Bookmarkers Browser=Cocoalicious +[Mozilla/5.0 (compatible; FriendFeedBot/0.*; Http://friendfeed.com/about/bot)] +Parent=Social Bookmarkers +Browser=FriendFeedBot + +[Twitturly*] +Parent=Social Bookmarkers +Browser=Twitturly + [WinkBot/*] Parent=Social Bookmarkers Browser=WinkBot @@ -4931,12 +4821,24 @@ Parent=Version Checkers Parent=Version Checkers Browser=Code Sample Web Client +[Desktop Sidebar*] +Parent=Version Checkers +Browser=Desktop Sidebar +isBanned=true + [Mono Browser Capabilities Updater*] Parent=Version Checkers Browser=Mono Browser Capabilities Updater -Stripper=true isBanned=true +[Rewmi/*] +Parent=Version Checkers +isBanned=true + +[Subtext Version 1.9* - http://subtextproject.com/ (Microsoft Windows NT 5.2.*)] +Parent=Version Checkers +Browser=Subtext + [TherapeuticResearch] Parent=Version Checkers Browser=TherapeuticResearch @@ -4953,21 +4855,105 @@ Browser=clarkson.edu Parent=Version Checkers Browser=Substância +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Become + +[Become] +Parent=DefaultProperties +Browser=Become +Frames=true +Tables=true +isSyndicationReader=true +Crawler=true + +[*BecomeBot/*] +Parent=Become +Browser=BecomeBot + +[*BecomeBot@exava.com*] +Parent=Become +Browser=BecomeBot + +[*Exabot@exava.com*] +Parent=Become +Browser=Exabot + +[MonkeyCrawl/*] +Parent=Become +Browser=MonkeyCrawl + +[Mozilla/5.0 (compatible; BecomeJPBot/2.3; *)] +Parent=Become +Browser=BecomeJPBot + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Blue Coat Systems [Blue Coat Systems] Parent=DefaultProperties Browser=Blue Coat Systems -Stripper=true isBanned=true Crawler=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Browscap Abusers + +[Browscap Abusers] +Parent=DefaultProperties +Browser=Browscap Abusers +isBanned=true + +[Apple-PubSub/*] +Parent=Browscap Abusers +Browser=Apple-PubSub + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FeedHub + +[FeedHub] +Parent=DefaultProperties +Browser=FeedHub +isSyndicationReader=true + +[FeedHub FeedDiscovery/1.0 (http://www.feedhub.com)] +Parent=FeedHub +Browser=FeedHub FeedDiscovery +Version=1.0 +MajorVer=1 +MinorVer=0 + +[FeedHub FeedFetcher/1.0 (http://www.feedhub.com)] +Parent=FeedHub +Browser=FeedHub FeedFetcher +Version=1.0 +MajorVer=1 +MinorVer=0 + +[FeedHub MetaDataFetcher/1.0 (http://www.feedhub.com)] +Parent=FeedHub +Browser=FeedHub MetaDataFetcher +Version=1.0 +MajorVer=1 +MinorVer=0 + +[Internet Content Rating Association] +Parent=DefaultProperties +Browser= +Frames=true +IFrames=true +Tables=true +Cookies=true +Crawler=true + +[ICRA_label_generator/1.?] +Parent=Internet Content Rating Association +Browser=ICRA_label_generator + +[ICRA_Semantic_spider/0.?] +Parent=Internet Content Rating Association +Browser=ICRA_Semantic_spider + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NameProtect [NameProtect] Parent=DefaultProperties Browser=NameProtect -Stripper=true isBanned=true Crawler=true @@ -4983,6 +4969,23 @@ Browser=NameProtect Parent=NameProtect Browser=NameProtect +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netcraft + +[Netcraft] +Parent=DefaultProperties +Browser=Netcraft +isBanned=true +Crawler=true + +[*Netcraft Web Server Survey*] +Parent=Netcraft +Browser=Netcraft Webserver Survey +isBanned=true + +[Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; info@netcraft.com)] +Parent=Netcraft +Browser=NetcraftSurveyAgent + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewsGator [NewsGator] @@ -5010,2281 +5013,1508 @@ Browser=NewsGator FetchLinks [NewsGator/*] Parent=NewsGator Browser=NewsGator -Stripper=true isBanned=true [NewsGatorOnline/*] Parent=NewsGator Browser=NewsGatorOnline -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; The Planet's Vulnerability Scanning +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.2 -[The Planet] +[Chrome 0.2] Parent=DefaultProperties -Browser=The Planet's Vulnerability Scanning +Browser=Chrome +Version=0.2 +MinorVer=2 +Beta=true +Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true + +[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] +Parent=Chrome 0.2 +Platform=WinXP -[*; system(id);*] -Parent=The Planet +[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] +Parent=Chrome 0.2 +Platform=Win2003 -[Fastream NETFile Server] -Parent=The Planet +[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] +Parent=Chrome 0.2 +Platform=WinVista -[mercuryboard_user_agent_sql_injection.nasl*] -Parent=The Planet +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.3 -[Mozilla/4.0 (compatible; gallery_203.nasl; Googlebot)] -Parent=The Planet +[Chrome 0.3] +Parent=DefaultProperties +Browser=Chrome +Version=0.3 +MinorVer=3 +Beta=true +Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true -[Mozilla/4.75 * (X11, U] -Parent=The Planet +[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] +Parent=Chrome 0.3 +Platform=WinXP -[Mozilla/7 * (X11; U; Linux 2.6.1 ia64)] -Parent=The Planet +[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] +Parent=Chrome 0.3 +Platform=Win2003 -[NESSUS::SOAP] -Parent=The Planet -Browser=NESSUS::SOAP +[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] +Parent=Chrome 0.3 +Platform=WinVista -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Jakarta Project +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.4 -[Jakarta Project] +[Chrome 0.4] Parent=DefaultProperties -Browser=Jakarta Project -Platform=JAVA -Stripper=true -isBanned=true -Crawler=true +Browser=Chrome +Version=0.4 +MinorVer=4 +Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true -[Jakarta Commons-HttpClient/*] -Parent=Jakarta Project -Browser=Jakarta Commons-HttpClient +[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] +Parent=Chrome 0.4 +Platform=WinXP -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Media Players +[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] +Parent=Chrome 0.4 +Platform=Win2003 -[Media Players] +[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] +Parent=Chrome 0.4 +Platform=WinVista + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.5 + +[Chrome 0.5] Parent=DefaultProperties -Browser=Media Players +Browser=Chrome +Version=0.5 +MinorVer=5 +Beta=true +Win32=true +Frames=true +IFrames=true +Tables=true Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true -[iTunes/* (Windows; ?)] -Parent=Media Players -Browser=iTunes -Platform=Win32 -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] +Parent=Chrome 0.5 +Platform=WinXP -[Microsoft NetShow(TM) Player with RealVideo(R)] -Parent=Media Players -Browser=Microsoft NetShow +[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] +Parent=Chrome 0.5 +Platform=Win2003 -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; *) AppleWebKit/* RealPlayer] -Parent=Media Players -Browser=RealPlayer -Platform=MacOSX +[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] +Parent=Chrome 0.5 +Platform=WinVista -[MPlayer 0.9*] -Parent=Media Players -Browser=MPlayer -Version=0.9 -MajorVer=0 -MinorVer=9 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 1.0 -[MPlayer 1.*] -Parent=Media Players -Browser=MPlayer +[Chrome 1.0] +Parent=DefaultProperties +Browser=Chrome Version=1.0 MajorVer=1 -MinorVer=0 +Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true -[MPlayer HEAD CVS] -Parent=Media Players -Browser=MPlayer +[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] +Parent=Chrome 1.0 +Platform=WinXP -[RealPlayer*] -Parent=Media Players -Browser=RealPlayer +[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] +Parent=Chrome 1.0 +Platform=Win2003 -[RMA/*] -Parent=Media Players -Browser=RMA +[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] +Parent=Chrome 1.0 +Platform=WinVista -[vobsub] -Parent=Media Players -Browser=vobsub -Stripper=true -isBanned=true +[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] +Parent=Chrome 1.0 +Platform=Win7 -[WinampMPEG/*] -Parent=Media Players -Browser=WinAmp +[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] +Parent=Chrome 1.0 +Platform=Win7 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 2.0 -[QuickTime] +[Chrome 2.0] Parent=DefaultProperties -Browser=QuickTime -Cookies=true +Browser=Chrome +Version=2.0 +MajorVer=2 +Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true -[QuickTime (qtver=6.0*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacOSX +[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] +Parent=Chrome 2.0 +Platform=WinXP -[QuickTime (qtver=6.0*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacPPC +[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] +Parent=Chrome 2.0 +Platform=Win2003 -[QuickTime (qtver=6.0*;os=Windows 95*)] -Parent=QuickTime -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=Win95 -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] +Parent=Chrome 2.0 +Platform=WinVista -[QuickTime (qtver=6.0*;os=Windows 98*)] -Parent=QuickTime -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=Win98 -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] +Parent=Chrome 2.0 +Platform=Win7 -[QuickTime (qtver=6.0*;os=Windows Me*)] -Parent=QuickTime -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=WinME -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] +Parent=Chrome 2.0 +Platform=Win7 -[QuickTime (qtver=6.0*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=WinNT -Win32=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 3.0 -[QuickTime (qtver=6.0*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=Win2000 +[Chrome 3.0] +Parent=DefaultProperties +Browser=Chrome +Version=3.0 +MajorVer=3 Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true -[QuickTime (qtver=6.0*;os=Windows NT 5.1*)] -Parent=QuickTime -Version=6.0 -MajorVer=6 -MinorVer=0 +[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] +Parent=Chrome 3.0 Platform=WinXP -Win32=true -[QuickTime (qtver=6.0*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=6.0 -MajorVer=6 -MinorVer=0 +[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] +Parent=Chrome 3.0 Platform=Win2003 -Win32=true -[QuickTime (qtver=6.1*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=6.1 -MajorVer=6 -MinorVer=1 -Platform=MacOSX +[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] +Parent=Chrome 3.0 +Platform=WinVista -[QuickTime (qtver=6.1*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=6.1 -MajorVer=6 -MinorVer=1 -Platform=MacPPC +[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] +Parent=Chrome 3.0 +Platform=Win7 -[QuickTime (qtver=6.1*;os=Windows 95*)] -Parent=QuickTime -Version=6.1 -MajorVer=6 -MinorVer=1 -Platform=Win95 -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] +Parent=Chrome 3.0 +Platform=Win7 -[QuickTime (qtver=6.1*;os=Windows 98*)] -Parent=QuickTime -Version=6.1 -MajorVer=6 -MinorVer=1 -Platform=Win98 -Win32=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Code -[QuickTime (qtver=6.1*;os=Windows Me*)] -Parent=QuickTime -Version=6.1 -MajorVer=6 -MinorVer=1 -Platform=WinME -Win32=true +[Google Code] +Parent=DefaultProperties +Browser=Google Code +Tables=true +Cookies=true +JavaApplets=true -[QuickTime (qtver=6.1*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=6.1 -MajorVer=6 -MinorVer=1 -Platform=WinNT -Win32=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.2 -[QuickTime (qtver=6.1*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=6.1 -MajorVer=6 -MinorVer=1 -Platform=Win2000 +[Iron 0.2] +Parent=DefaultProperties +Browser=Iron +Version=0.2 +MinorVer=2 Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true -[QuickTime (qtver=6.1*;os=Windows NT 5.1*)] -Parent=QuickTime -Version=6.1 -MajorVer=6 -MinorVer=1 +[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] +Parent=Iron 0.2 Platform=WinXP -Win32=true -[QuickTime (qtver=6.1*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=6.1 -MajorVer=6 -MinorVer=1 -Platform=Win2003 -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] +Parent=Iron 0.2 +Platform=WinVista -[QuickTime (qtver=6.2*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=6.2 -MajorVer=6 -MinorVer=2 -Platform=MacOSX +[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] +Parent=Iron 0.2 +Platform=Win7 -[QuickTime (qtver=6.2*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=6.2 -MajorVer=6 -MinorVer=2 -Platform=MacPPC +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.3 -[QuickTime (qtver=6.2*;os=Windows 95*)] -Parent=QuickTime -Version=6.2 -MajorVer=6 -MinorVer=2 -Platform=Win95 +[Iron 0.3] +Parent=DefaultProperties +Browser=Iron +Version=0.3 +MinorVer=3 Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true -[QuickTime (qtver=6.2*;os=Windows 98*)] -Parent=QuickTime -Version=6.2 -MajorVer=6 -MinorVer=2 -Platform=Win98 -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] +Parent=Iron 0.3 +Platform=WinXP -[QuickTime (qtver=6.2*;os=Windows Me*)] -Parent=QuickTime -Version=6.2 -MajorVer=6 -MinorVer=2 -Platform=WinME -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] +Parent=Iron 0.3 +Platform=WinVista -[QuickTime (qtver=6.2*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=6.2 -MajorVer=6 -MinorVer=2 -Platform=WinNT -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] +Parent=Iron 0.3 +Platform=Win7 -[QuickTime (qtver=6.2*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=6.2 -MajorVer=6 -MinorVer=2 -Platform=Win2000 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.4 + +[Iron 0.4] +Parent=DefaultProperties +Browser=Iron +Version=0.4 +MinorVer=4 Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true -[QuickTime (qtver=6.2*;os=Windows NT 5.1*)] -Parent=QuickTime -Version=6.2 -MajorVer=6 -MinorVer=2 +[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] +Parent=Iron 0.4 Platform=WinXP -Win32=true -[QuickTime (qtver=6.2*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=6.2 -MajorVer=6 -MinorVer=2 -Platform=Win2003 -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] +Parent=Iron 0.4 +Platform=WinVista -[QuickTime (qtver=6.3*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=6.3 -MajorVer=6 -MinorVer=3 +[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] +Parent=Iron 0.4 +Platform=Win7 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPod + +[iPod] +Parent=DefaultProperties +Browser=iPod +Platform=iPhone OSX +isMobileDevice=true + +[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/3.0 Mobile/* Safari/*] +Parent=iPod +Version=3.0 +MajorVer=3 +MinorVer=0 Platform=MacOSX -[QuickTime (qtver=6.3*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=6.3 -MajorVer=6 -MinorVer=3 -Platform=MacPPC +[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2 like Mac OS X; en-us) AppleWebKit/* (KHTML, like Gecko) Mobile/*] +Parent=iPod -[QuickTime (qtver=6.3*;os=Windows 95*)] -Parent=QuickTime -Version=6.3 -MajorVer=6 -MinorVer=3 -Platform=Win95 -Win32=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iTunes -[QuickTime (qtver=6.3*;os=Windows 98*)] -Parent=QuickTime -Version=6.3 -MajorVer=6 -MinorVer=3 -Platform=Win98 -Win32=true +[iTunes] +Parent=DefaultProperties +Browser=iTunes +Platform=iPhone OSX -[QuickTime (qtver=6.3*;os=Windows Me*)] -Parent=QuickTime -Version=6.3 -MajorVer=6 -MinorVer=3 -Platform=WinME +[iTunes/* (Windows; ?)] +Parent=iTunes +Browser=iTunes +Platform=Win32 Win32=true -[QuickTime (qtver=6.3*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=6.3 -MajorVer=6 -MinorVer=3 -Platform=WinNT -Win32=true +[MOT-* iTunes/* MIB/* Profile/MIDP-* Configuration/CLDC-* UP.Link/*] +Parent=iTunes -[QuickTime (qtver=6.3*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=6.3 -MajorVer=6 -MinorVer=3 -Platform=Win2000 -Win32=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Media Players -[QuickTime (qtver=6.3*;os=Windows NT 5.1*)] -Parent=QuickTime -Version=6.3 -MajorVer=6 -MinorVer=3 -Platform=WinXP -Win32=true +[Media Players] +Parent=DefaultProperties +Browser=Media Players +Cookies=true -[QuickTime (qtver=6.3*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=6.3 -MajorVer=6 -MinorVer=3 -Platform=Win2003 -Win32=true +[Microsoft NetShow(TM) Player with RealVideo(R)] +Parent=Media Players +Browser=Microsoft NetShow -[QuickTime (qtver=6.4*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=6.4 -MajorVer=6 -MinorVer=4 +[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; *) AppleWebKit/* RealPlayer] +Parent=Media Players +Browser=RealPlayer Platform=MacOSX -[QuickTime (qtver=6.4*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=6.4 -MajorVer=6 -MinorVer=4 -Platform=MacPPC +[MPlayer 0.9*] +Parent=Media Players +Browser=MPlayer +Version=0.9 +MajorVer=0 +MinorVer=9 -[QuickTime (qtver=6.4*;os=Windows 95*)] -Parent=QuickTime -Version=6.4 -MajorVer=6 -MinorVer=4 -Platform=Win95 -Win32=true +[MPlayer 1.*] +Parent=Media Players +Browser=MPlayer +Version=1.0 +MajorVer=1 +MinorVer=0 -[QuickTime (qtver=6.4*;os=Windows 98*)] -Parent=QuickTime -Version=6.4 -MajorVer=6 -MinorVer=4 -Platform=Win98 -Win32=true +[MPlayer HEAD CVS] +Parent=Media Players +Browser=MPlayer -[QuickTime (qtver=6.4*;os=Windows Me*)] -Parent=QuickTime -Version=6.4 -MajorVer=6 -MinorVer=4 -Platform=WinME +[RealPlayer*] +Parent=Media Players +Browser=RealPlayer + +[RMA/*] +Parent=Media Players +Browser=RMA + +[VLC media player*] +Parent=Media Players +Browser=VLC + +[vobsub] +Parent=Media Players +Browser=vobsub +isBanned=true + +[WinampMPEG/*] +Parent=Media Players +Browser=WinAmp + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nintendo + +[Nintendo Wii] +Parent=DefaultProperties +Browser= +isMobileDevice=true + +[Opera/* (Nintendo DSi; Opera/*; *; *)] +Parent=Nintendo Wii +Browser=DSi + +[Opera/* (Nintendo Wii; U; *)] +Parent=Nintendo Wii +Browser=Wii + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows Media Player + +[Windows Media Player] +Parent=DefaultProperties +Browser=Windows Media Player +Cookies=true + +[NSPlayer/10.*] +Parent=Windows Media Player +Version=10.0 +MajorVer=10 +MinorVer=0 + +[NSPlayer/11.*] +Parent=Windows Media Player +Browser=Windows Media Player +Version=11.0 +MajorVer=11 +MinorVer=0 + +[NSPlayer/4.*] +Parent=Windows Media Player +Browser=Windows Media Player +Version=4.0 +MajorVer=4 +MinorVer=0 + +[NSPlayer/7.*] +Parent=Windows Media Player +Browser=Windows Media Player +Version=7.0 +MajorVer=7 +MinorVer=0 + +[NSPlayer/8.*] +Parent=Windows Media Player +Browser=Windows Media Player +Version=8.0 +MajorVer=8 +MinorVer=0 + +[NSPlayer/9.*] +Parent=Windows Media Player +Browser=Windows Media Player +Version=9.0 +MajorVer=9 +MinorVer=0 + +[Windows-Media-Player/10.*] +Parent=Windows Media Player +Browser=Windows-Media-Player +Version=10.0 +MajorVer=10 +MinorVer=0 Win32=true -[QuickTime (qtver=6.4*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=6.4 -MajorVer=6 -MinorVer=4 -Platform=WinNT +[Windows-Media-Player/11.*] +Parent=Windows Media Player +Version=11.0 +MajorVer=11 +MinorVer=0 Win32=true -[QuickTime (qtver=6.4*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=6.4 -MajorVer=6 -MinorVer=4 -Platform=Win2000 +[Windows-Media-Player/7.*] +Parent=Windows Media Player +Browser=Windows Media Player +Version=7.0 +MajorVer=7 +MinorVer=0 Win32=true -[QuickTime (qtver=6.4*;os=Windows NT 5.1*)] -Parent=QuickTime -Version=6.4 -MajorVer=6 -MinorVer=4 -Platform=WinXP +[Windows-Media-Player/8.*] +Parent=Windows Media Player +Browser=Windows Media Player +Version=8.0 +MajorVer=8 +MinorVer=0 Win32=true -[QuickTime (qtver=6.4*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=6.4 -MajorVer=6 -MinorVer=4 -Platform=Win2003 +[Windows-Media-Player/9.*] +Parent=Windows Media Player +Version=9.0 +MajorVer=9 +MinorVer=0 Win32=true -[QuickTime (qtver=6.5*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=6.5 -MajorVer=6 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Zune + +[Zune] +Parent=DefaultProperties +Browser=Zune +Cookies=true + +[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.0*)*] +Parent=Zune +Version=2.0 +MajorVer=2 +MinorVer=0 + +[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.5*)*] +Parent=Zune +Version=2.5 +MajorVer=2 MinorVer=5 + +[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 3.0*)*] +Parent=Zune +Version=3.0 +MajorVer=3 +MinorVer=0 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.0 + +[QuickTime 7.0] +Parent=DefaultProperties +Browser=QuickTime +Version=7.0 +MajorVer=7 +Cookies=true + +[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 10.*)] +Parent=QuickTime 7.0 Platform=MacOSX -[QuickTime (qtver=6.5*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=6.5 -MajorVer=6 -MinorVer=5 +[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 9.*)] +Parent=QuickTime 7.0 Platform=MacPPC -[QuickTime (qtver=6.5*;os=Windows 95*)] -Parent=QuickTime -Version=6.5 -MajorVer=6 -MinorVer=5 +[QuickTime (qtver=7.0*;os=Windows 95*)] +Parent=QuickTime 7.0 Platform=Win95 Win32=true -[QuickTime (qtver=6.5*;os=Windows 98*)] -Parent=QuickTime -Version=6.5 -MajorVer=6 -MinorVer=5 +[QuickTime (qtver=7.0*;os=Windows 98*)] +Parent=QuickTime 7.0 Platform=Win98 Win32=true -[QuickTime (qtver=6.5*;os=Windows Me*)] -Parent=QuickTime -Version=6.5 -MajorVer=6 -MinorVer=5 +[QuickTime (qtver=7.0*;os=Windows Me*)] +Parent=QuickTime 7.0 Platform=WinME Win32=true -[QuickTime (qtver=6.5*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=6.5 -MajorVer=6 -MinorVer=5 +[QuickTime (qtver=7.0*;os=Windows NT 4.0*)] +Parent=QuickTime 7.0 Platform=WinNT Win32=true -[QuickTime (qtver=6.5*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=6.5 -MajorVer=6 -MinorVer=5 +[QuickTime (qtver=7.0*;os=Windows NT 5.0*)] +Parent=QuickTime 7.0 Platform=Win2000 Win32=true -[QuickTime (qtver=6.5*;os=Windows NT 5.1*)] -Parent=QuickTime -Version=6.5 -MajorVer=6 -MinorVer=5 +[QuickTime (qtver=7.0*;os=Windows NT 5.1*)] +Parent=QuickTime 7.0 Platform=WinXP Win32=true -[QuickTime (qtver=6.5*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=6.5 -MajorVer=6 -MinorVer=5 +[QuickTime (qtver=7.0*;os=Windows NT 5.2*)] +Parent=QuickTime 7.0 Platform=Win2003 Win32=true -[QuickTime (qtver=6.6*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=6.6 -MajorVer=6 -MinorVer=6 +[QuickTime/7.0.* (qtver=7.0.*;*;os=Mac 10.*)*] +Parent=QuickTime 7.0 Platform=MacOSX -[QuickTime (qtver=6.6*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=6.6 -MajorVer=6 -MinorVer=6 -Platform=MacPPC +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.1 -[QuickTime (qtver=6.6*;os=Windows 95*)] -Parent=QuickTime -Version=6.6 -MajorVer=6 -MinorVer=6 -Platform=Win95 -Win32=true +[QuickTime 7.1] +Parent=DefaultProperties +Browser=QuickTime +Version=7.1 +MajorVer=7 +MinorVer=1 +Cookies=true -[QuickTime (qtver=6.6*;os=Windows 98*)] -Parent=QuickTime -Version=6.6 -MajorVer=6 -MinorVer=6 -Platform=Win98 -Win32=true +[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 10.*)] +Parent=QuickTime 7.1 +Platform=MacOSX -[QuickTime (qtver=6.6*;os=Windows Me*)] -Parent=QuickTime -Version=6.6 -MajorVer=6 -MinorVer=6 -Platform=WinME +[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 9.*)] +Parent=QuickTime 7.1 +Platform=MacPPC + +[QuickTime (qtver=7.1*;os=Windows 98*)] +Parent=QuickTime 7.1 +Platform=Win98 Win32=true -[QuickTime (qtver=6.6*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=6.6 -MajorVer=6 -MinorVer=6 +[QuickTime (qtver=7.1*;os=Windows NT 4.0*)] +Parent=QuickTime 7.1 Platform=WinNT Win32=true -[QuickTime (qtver=6.6*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=6.6 -MajorVer=6 -MinorVer=6 +[QuickTime (qtver=7.1*;os=Windows NT 5.0*)] +Parent=QuickTime 7.1 Platform=Win2000 Win32=true -[QuickTime (qtver=6.6*;os=Windows NT 5.1*)] -Parent=QuickTime -Version=6.6 -MajorVer=6 -MinorVer=6 +[QuickTime (qtver=7.1*;os=Windows NT 5.1*)] +Parent=QuickTime 7.1 Platform=WinXP Win32=true -[QuickTime (qtver=6.6*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=6.6 -MajorVer=6 -MinorVer=6 +[QuickTime (qtver=7.1*;os=Windows NT 5.2*)] +Parent=QuickTime 7.1 Platform=Win2003 Win32=true -[QuickTime (qtver=6.7*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=6.7 -MajorVer=6 -MinorVer=7 +[QuickTime/7.1.* (qtver=7.1.*;*;os=Mac 10.*)*] +Parent=QuickTime 7.1 Platform=MacOSX -[QuickTime (qtver=6.7*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=6.7 -MajorVer=6 -MinorVer=7 -Platform=MacPPC +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.2 -[QuickTime (qtver=6.7*;os=Windows 95*)] -Parent=QuickTime -Version=6.7 -MajorVer=6 -MinorVer=7 -Platform=Win95 -Win32=true +[QuickTime 7.2] +Parent=DefaultProperties +Browser=QuickTime +Version=7.2 +MajorVer=7 +MinorVer=2 +Platform=MacOSX +Cookies=true -[QuickTime (qtver=6.7*;os=Windows 98*)] -Parent=QuickTime -Version=6.7 -MajorVer=6 -MinorVer=7 -Platform=Win98 -Win32=true +[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 10.*)] +Parent=QuickTime 7.2 +Platform=MacOSX -[QuickTime (qtver=6.7*;os=Windows Me*)] -Parent=QuickTime -Version=6.7 -MajorVer=6 -MinorVer=7 -Platform=WinME +[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 9.*)] +Parent=QuickTime 7.2 +Platform=MacPPC + +[QuickTime (qtver=7.2*;os=Windows 98*)] +Parent=QuickTime 7.2 +Platform=Win98 Win32=true -[QuickTime (qtver=6.7*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=6.7 -MajorVer=6 -MinorVer=7 +[QuickTime (qtver=7.2*;os=Windows NT 4.0*)] +Parent=QuickTime 7.2 Platform=WinNT Win32=true -[QuickTime (qtver=6.7*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=6.7 -MajorVer=6 -MinorVer=7 +[QuickTime (qtver=7.2*;os=Windows NT 5.0*)] +Parent=QuickTime 7.2 Platform=Win2000 Win32=true -[QuickTime (qtver=6.7*;os=Windows NT 5.1*)] -Parent=QuickTime -Version=6.7 -MajorVer=6 -MinorVer=7 +[QuickTime (qtver=7.2*;os=Windows NT 5.1*)] +Parent=QuickTime 7.2 Platform=WinXP Win32=true -[QuickTime (qtver=6.7*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=6.7 -MajorVer=6 -MinorVer=7 +[QuickTime (qtver=7.2*;os=Windows NT 5.2*)] +Parent=QuickTime 7.2 Platform=Win2003 Win32=true -[QuickTime (qtver=6.8*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=6.8 -MajorVer=6 -MinorVer=8 +[QuickTime/7.2.* (qtver=7.2.*;*;os=Mac 10.*)*] +Parent=QuickTime 7.2 Platform=MacOSX -[QuickTime (qtver=6.8*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=6.8 -MajorVer=6 -MinorVer=8 -Platform=MacPPC - -[QuickTime (qtver=6.8*;os=Windows 95*)] -Parent=QuickTime -Version=6.8 -MajorVer=6 -MinorVer=8 -Platform=Win95 -Win32=true - -[QuickTime (qtver=6.8*;os=Windows 98*)] -Parent=QuickTime -Version=6.8 -MajorVer=6 -MinorVer=8 -Platform=Win98 -Win32=true - -[QuickTime (qtver=6.8*;os=Windows Me*)] -Parent=QuickTime -Version=6.8 -MajorVer=6 -MinorVer=8 -Platform=WinME -Win32=true - -[QuickTime (qtver=6.8*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=6.8 -MajorVer=6 -MinorVer=8 -Platform=WinNT -Win32=true - -[QuickTime (qtver=6.8*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=6.8 -MajorVer=6 -MinorVer=8 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=6.8*;os=Windows NT 5.1*)] -Parent=QuickTime -Version=6.8 -MajorVer=6 -MinorVer=8 -Platform=WinXP -Win32=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.3 -[QuickTime (qtver=6.8*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=6.8 -MajorVer=6 -MinorVer=8 -Platform=Win2003 -Win32=true +[QuickTime 7.3] +Parent=DefaultProperties +Browser=QuickTime +Version=7.3 +MajorVer=7 +MinorVer=3 +Platform=MacOSX +Cookies=true -[QuickTime (qtver=6.9*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=6.9 -MajorVer=6 -MinorVer=9 +[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 10.*)] +Parent=QuickTime 7.3 Platform=MacOSX -[QuickTime (qtver=6.9*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=6.9 -MajorVer=6 -MinorVer=9 +[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 9.*)] +Parent=QuickTime 7.3 Platform=MacPPC -[QuickTime (qtver=6.9*;os=Windows 95*)] -Parent=QuickTime -Version=6.9 -MajorVer=6 -MinorVer=9 -Platform=Win95 -Win32=true - -[QuickTime (qtver=6.9*;os=Windows 98*)] -Parent=QuickTime -Version=6.9 -MajorVer=6 -MinorVer=9 +[QuickTime (qtver=7.3*;os=Windows 98*)] +Parent=QuickTime 7.3 Platform=Win98 Win32=true -[QuickTime (qtver=6.9*;os=Windows Me*)] -Parent=QuickTime -Version=6.9 -MajorVer=6 -MinorVer=9 -Platform=WinME -Win32=true - -[QuickTime (qtver=6.9*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=6.9 -MajorVer=6 -MinorVer=9 +[QuickTime (qtver=7.3*;os=Windows NT 4.0*)] +Parent=QuickTime 7.3 Platform=WinNT Win32=true -[QuickTime (qtver=6.9*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=6.9 -MajorVer=6 -MinorVer=9 +[QuickTime (qtver=7.3*;os=Windows NT 5.0*)] +Parent=QuickTime 7.3 Platform=Win2000 Win32=true -[QuickTime (qtver=6.9*;os=Windows NT 5.1*)] -Parent=QuickTime -Version=6.9 -MajorVer=6 -MinorVer=9 +[QuickTime (qtver=7.3*;os=Windows NT 5.1*)] +Parent=QuickTime 7.3 Platform=WinXP Win32=true -[QuickTime (qtver=6.9*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=6.9 -MajorVer=6 -MinorVer=9 +[QuickTime (qtver=7.3*;os=Windows NT 5.2*)] +Parent=QuickTime 7.3 Platform=Win2003 Win32=true -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=7.0 -MajorVer=7 -MinorVer=0 +[QuickTime/7.3.* (qtver=7.3.*;*;os=Mac 10.*)*] +Parent=QuickTime 7.3 Platform=MacOSX -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=7.0 -MajorVer=7 -MinorVer=0 -Platform=MacPPC +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.4 -[QuickTime (qtver=7.0*;os=Windows 95*)] -Parent=QuickTime -Version=7.0 +[QuickTime 7.4] +Parent=DefaultProperties +Browser=QuickTime +Version=7.4 MajorVer=7 -MinorVer=0 -Platform=Win95 -Win32=true +MinorVer=4 +Platform=MacOSX +Cookies=true -[QuickTime (qtver=7.0*;os=Windows 98*)] -Parent=QuickTime -Version=7.0 -MajorVer=7 -MinorVer=0 -Platform=Win98 -Win32=true +[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 10.*)] +Parent=QuickTime 7.4 +Platform=MacOSX -[QuickTime (qtver=7.0*;os=Windows Me*)] -Parent=QuickTime -Version=7.0 -MajorVer=7 -MinorVer=0 -Platform=WinME +[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 9.*)] +Parent=QuickTime 7.4 +Platform=MacPPC + +[QuickTime (qtver=7.4*;os=Windows 98*)] +Parent=QuickTime 7.4 +Platform=Win98 Win32=true -[QuickTime (qtver=7.0*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=7.0 -MajorVer=7 -MinorVer=0 +[QuickTime (qtver=7.4*;os=Windows NT 4.0*)] +Parent=QuickTime 7.4 Platform=WinNT Win32=true -[QuickTime (qtver=7.0*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=7.0 -MajorVer=7 -MinorVer=0 +[QuickTime (qtver=7.4*;os=Windows NT 5.0*)] +Parent=QuickTime 7.4 Platform=Win2000 Win32=true -[QuickTime (qtver=7.0*;os=Windows NT 5.1*)] -Parent=QuickTime -Version=7.0 -MajorVer=7 -MinorVer=0 +[QuickTime (qtver=7.4*;os=Windows NT 5.1*)] +Parent=QuickTime 7.4 Platform=WinXP Win32=true -[QuickTime (qtver=7.0*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=7.0 -MajorVer=7 -MinorVer=0 +[QuickTime (qtver=7.4*;os=Windows NT 5.2*)] +Parent=QuickTime 7.4 Platform=Win2003 Win32=true -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 +[QuickTime/7.4.* (qtver=7.4.*;*;os=Mac 10.*)*] +Parent=QuickTime 7.4 Platform=MacOSX -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Platform=MacPPC +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Android -[QuickTime (qtver=7.1*;os=Windows 98*)] -Parent=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Platform=Win98 -Win32=true +[Android] +Parent=DefaultProperties +Browser=Android +Frames=true +Tables=true +Cookies=true +JavaScript=true +isMobileDevice=true -[QuickTime (qtver=7.1*;os=Windows NT 4.0*)] -Parent=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Platform=WinNT -Win32=true +[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] +Parent=Android +Browser=Android +Platform=Linux +isMobileDevice=true -[QuickTime (qtver=7.1*;os=Windows NT 5.0*)] -Parent=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Platform=Win2000 -Win32=true +[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0.* Mobile Safari/*] +Parent=Android +Browser=Android +Platform=Linux +isMobileDevice=true -[QuickTime (qtver=7.1*;os=Windows NT 5.1*)] -Parent=QuickTime -MajorVer=7.1 -MinorVer=7 -Platform=WinXP -Win32=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BlackBerry -[QuickTime (qtver=7.1*;os=Windows NT 5.2*)] -Parent=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Platform=Win2003 -Win32=true +[BlackBerry] +Parent=DefaultProperties +Browser=BlackBerry +Frames=true +Tables=true +Cookies=true +JavaScript=true +isMobileDevice=true -[QuickTime/7.0.* (qtver=7.0.*;*;os=Mac 10.*)*] -Parent=QuickTime -Version=7.0 -MajorVer=7 -MinorVer=0 -Platform=MacOSX +[*BlackBerry*] +Parent=BlackBerry -[QuickTime/7.1.* (qtver=7.1.*;*;os=Mac 10.*)*] -Parent=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Platform=MacOSX +[*BlackBerrySimulator/*] +Parent=BlackBerry -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows Media Player +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Handspring Blazer -[Windows Media Player] +[Blazer] Parent=DefaultProperties -Browser=Windows Media Player +Browser=Handspring Blazer +Platform=Palm +Frames=true +Tables=true Cookies=true +isMobileDevice=true -[NSPlayer/10.*] -Parent=Windows Media Player -Version=10.0 -MajorVer=10 -MinorVer=0 - -[NSPlayer/11.* WMFSDK/11.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=11.0 -MajorVer=11 +[Mozilla/4.0 (compatible; MSIE 6.0; Windows 95; PalmSource; Blazer 3.0) 16;160x160] +Parent=Blazer +Version=3.0 +MajorVer=3 MinorVer=0 -[NSPlayer/4.*] -Parent=Windows Media Player -Browser=Windows Media Player +[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.0) 16;320x448] +Parent=Blazer Version=4.0 MajorVer=4 MinorVer=0 -[NSPlayer/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 - -[NSPlayer/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 +[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.1) 16;320x320] +Parent=Blazer +Version=4.1 +MajorVer=4 +MinorVer=1 -[NSPlayer/9.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 +[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.2) 16;320x320] +Parent=Blazer +Version=4.2 +MajorVer=4 +MinorVer=2 -[Windows-Media-Player/10.*] -Parent=Windows Media Player -Browser=Windows-Media-Player -Version=10.0 -MajorVer=10 -MinorVer=0 -Win32=true +[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.4) 16;320x320] +Parent=Blazer +Version=4.4 +MajorVer=4 +MinorVer=4 -[Windows-Media-Player/11.*] -Parent=Windows Media Player -Version=11.0 -MajorVer=11 +[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.5) 16;320x320] +Parent=Blazer +Version=4.5 +MajorVer=4 +MinorVer=5 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoCoMo + +[DoCoMo] +Parent=DefaultProperties +Browser=DoCoMo +Frames=true +Tables=true +Cookies=true +JavaScript=true +isMobileDevice=true + +[DoCoMo/1.0*] +Parent=DoCoMo +Version=1.0 +MajorVer=1 MinorVer=0 -Win32=true +Platform=WAP -[Windows-Media-Player/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 +[DoCoMo/2.0*] +Parent=DoCoMo +Version=2.0 +MajorVer=2 MinorVer=0 +Platform=WAP + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IEMobile + +[IEMobile] +Parent=DefaultProperties +Browser=IEMobile +Platform=WinCE Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +VBScript=true +JavaScript=true +ActiveXControls=true +isMobileDevice=true +CssVersion=2 +supportsCSS=true -[Windows-Media-Player/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 +[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.*)*] +Parent=IEMobile +Version=6.0 +MajorVer=6 MinorVer=0 -Win32=true -[Windows-Media-Player/9.*] -Parent=Windows Media Player -Version=9.0 -MajorVer=9 +[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.*)*] +Parent=IEMobile +Version=7.0 +MajorVer=7 MinorVer=0 -Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AvantGo +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPhone -[AvantGo] +[iPhone] Parent=DefaultProperties -Browser=AvantGo +Browser=iPhone +Platform=iPhone OSX Frames=true +IFrames=true Tables=true Cookies=true +BackgroundSounds=true +JavaApplets=true JavaScript=true -WAP=true isMobileDevice=true +CssVersion=3 +supportsCSS=true -[AvantGo*] -Parent=AvantGo +[Mozilla/4.0 (iPhone; *)] +Parent=iPhone -[Mozilla/?.0 (*; U; AvantGo 3.?)] -Parent=AvantGo -Version=3.0 +[Mozilla/4.0 (iPhone; U; CPU like Mac OS X; *)] +Parent=iPhone + +[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] +Parent=iPhone +Browser=iPhone Simulator +Version=3.1 MajorVer=3 -MinorVer=0 +MinorVer=1 -[Mozilla/?.0 (*; U; AvantGo 4.?)] -Parent=AvantGo -Version=4.0 -MajorVer=4 -MinorVer=0 +[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_0_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] +Parent=iPhone +Browser=iPhone Simulator +Version=3.1 +MajorVer=3 +MinorVer=1 -[Mozilla/?.0 (*; U; AvantGo 5.?)] -Parent=AvantGo -Version=5.0 -MajorVer=5 -MinorVer=0 +[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] +Parent=iPhone +Browser=iPhone Simulator +Version=3.1 +MajorVer=3 +MinorVer=1 -[Mozilla/?.0 (*; U; AvantGo 6.?)] -Parent=AvantGo -Version=6.0 -MajorVer=6 -MinorVer=0 +[Mozilla/5.0 (iPhone)] +Parent=iPhone -[Mozilla/?.0 (compatible; AvantGo 3.?)] -Parent=AvantGo -Version=3.0 +[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] +Parent=iPhone +Version=3.1 MajorVer=3 -MinorVer=0 +MinorVer=1 -[Mozilla/?.0 (compatible; AvantGo 3.?; *)] -Parent=AvantGo -Version=3.0 +[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] +Parent=iPhone +Version=3.1 MajorVer=3 -MinorVer=0 +MinorVer=1 -[Mozilla/?.0 (compatible; AvantGo 3.?; FreeBSD)] -Parent=AvantGo -Version=3.0 +[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] +Parent=iPhone +Version=3.1 MajorVer=3 -MinorVer=0 -Platform=FreeBSD +MinorVer=1 -[Mozilla/?.0 (compatible; AvantGo 4.?)] -Parent=AvantGo -Version=4.0 -MajorVer=4 -MinorVer=0 +[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_2 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] +Parent=iPhone -[Mozilla/?.0 (compatible; AvantGo 4.?; *)] -Parent=AvantGo -Version=4.0 -MajorVer=4 -MinorVer=0 +[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_1 like Mac OS X; *)*] +Parent=iPhone -[Mozilla/?.0 (compatible; AvantGo 4.?; FreeBSD)] -Parent=AvantGo -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=FreeBSD +[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; *)] +Parent=iPhone -[Mozilla/?.0 (compatible; AvantGo 5.?)] -Parent=AvantGo -Version=5.0 -MajorVer=5 +[Mozilla/5.0 (iPhone; U; CPU like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0 Mobile/* Safari/*] +Parent=iPhone +Version=3.0 +MajorVer=3 MinorVer=0 -[Mozilla/?.0 (compatible; AvantGo 5.?; *)] -Parent=AvantGo -Version=5.0 -MajorVer=5 -MinorVer=0 +[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/* Mobile/*] +Parent=iPhone +Browser=iTouch -[Mozilla/?.0 (compatible; AvantGo 5.?; FreeBSD)] -Parent=AvantGo -Version=5.0 -MajorVer=5 -MinorVer=0 -Platform=FreeBSD +[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2* like Mac OS X; *)*] +Parent=iPhone +Browser=iTouch +Version=2.2 +MajorVer=2 +MinorVer=2 -[Mozilla/?.0 (compatible; AvantGo 6.?)] -Parent=AvantGo -Version=6.0 -MajorVer=6 -MinorVer=0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KDDI -[Mozilla/?.0 (compatible; AvantGo 6.?; *)] -Parent=AvantGo -Version=6.0 -MajorVer=6 -MinorVer=0 +[KDDI] +Parent=DefaultProperties +Browser=KDDI +Frames=true +Tables=true +Cookies=true +BackgroundSounds=true +VBScript=true +JavaScript=true +ActiveXControls=true +isMobileDevice=true +CssVersion=1 +supportsCSS=true -[Mozilla/?.0 (compatible; AvantGo 6.?; FreeBSD)] -Parent=AvantGo -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=FreeBSD +[KDDI-* UP.Browser/* (GUI) MMP/*] +Parent=KDDI -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BlackBerry +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Mobile -[BlackBerry] +[Miscellaneous Mobile] Parent=DefaultProperties -Browser=BlackBerry -Frames=true +Browser= +IFrames=true Tables=true Cookies=true JavaScript=true -WAP=true isMobileDevice=true +CssVersion=2 +supportsCSS=true -[BlackBerry7*/3.5.*] -Parent=BlackBerry -Version=3.5 -MajorVer=3 -MinorVer=5 +[Mozilla/5.0 (X11; *; CentOS; *) AppleWebKit/* (KHTML, like Gecko) Bolt/0.* Version/3.0 Safari/*] +Parent=Miscellaneous Mobile +Browser=Bolt -[BlackBerry7*/3.6.*] -Parent=BlackBerry -Version=3.6 -MajorVer=3 -MinorVer=6 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser -[BlackBerry7*/3.7.*] -Parent=BlackBerry -Version=3.7 -MajorVer=3 -MinorVer=7 +[Motorola Internet Browser] +Parent=DefaultProperties +Browser=Motorola Internet Browser +Frames=true +Tables=true +Cookies=true +isMobileDevice=true -[BlackBerry7*/3.8.*] -Parent=BlackBerry -Version=3.8 -MajorVer=3 -MinorVer=8 +[MOT-*/*] +Parent=Motorola Internet Browser -[BlackBerry7*/3.9.*] -Parent=BlackBerry -Version=3.9 -MajorVer=3 -MinorVer=9 +[MOT-1*/* UP.Browser/*] +Parent=Motorola Internet Browser -[BlackBerry7*/4.0.*] -Parent=BlackBerry -Version=4.0 -MajorVer=4 -MinorVer=0 +[MOT-8700_/* UP.Browser/*] +Parent=Motorola Internet Browser -[BlackBerry7*/4.1.*] -Parent=BlackBerry -Version=4.1 -MajorVer=4 -MinorVer=1 +[MOT-A-0A/* UP.Browser/*] +Parent=Motorola Internet Browser -[BlackBerry8*/3.5.*] -Parent=BlackBerry -Version=3.5 -MajorVer=3 -MinorVer=5 +[MOT-A-2B/* UP.Browser/*] +Parent=Motorola Internet Browser -[BlackBerry8*/3.6.*] -Parent=BlackBerry -Version=3.6 -MajorVer=3 -MinorVer=6 +[MOT-A-88/* UP.Browser/*] +Parent=Motorola Internet Browser -[BlackBerry8*/3.7.*] -Parent=BlackBerry -Version=3.7 -MajorVer=3 -MinorVer=7 +[MOT-C???/* MIB/*] +Parent=Motorola Internet Browser -[BlackBerry8*/3.8.*] -Parent=BlackBerry -Version=3.8 -MajorVer=3 -MinorVer=8 +[MOT-GATW_/* UP.Browser/*] +Parent=Motorola Internet Browser -[BlackBerry8*/3.9.*] -Parent=BlackBerry -Version=3.9 -MajorVer=3 -MinorVer=9 +[MOT-L6/* MIB/*] +Parent=Motorola Internet Browser -[BlackBerry8*/4.0.*] -Parent=BlackBerry -Version=4.0 -MajorVer=4 -MinorVer=0 +[MOT-L7/* MIB/*] +Parent=Motorola Internet Browser -[BlackBerry8*/4.1.*] -Parent=BlackBerry -Version=4.1 -MajorVer=4 -MinorVer=1 +[MOT-M*/* UP.Browser/*] +Parent=Motorola Internet Browser -[BlackBerry8*/4.2.*] -Parent=BlackBerry -Version=4.2 -MajorVer=4 -MinorVer=2 +[MOT-MP*/* Mozilla/* (compatible; MSIE *; Windows CE; *)] +Parent=Motorola Internet Browser +Win32=true -[BlackBerrySimulator/3.5.*] -Parent=BlackBerry -Version=3.5 -MajorVer=3 -MinorVer=5 +[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)] +Parent=Motorola Internet Browser +Win32=true -[BlackBerrySimulator/3.6.*] -Parent=BlackBerry -Version=3.6 -MajorVer=3 -MinorVer=6 +[MOT-SAP4_/* UP.Browser/*] +Parent=Motorola Internet Browser -[BlackBerrySimulator/3.7.*] -Parent=BlackBerry -Version=3.7 -MajorVer=3 -MinorVer=7 +[MOT-T*/*] +Parent=Motorola Internet Browser -[BlackBerrySimulator/3.8.*] -Parent=BlackBerry -Version=3.8 -MajorVer=3 -MinorVer=8 +[MOT-T7*/* MIB/*] +Parent=Motorola Internet Browser -[BlackBerrySimulator/3.9.*] -Parent=BlackBerry -Version=3.9 -MajorVer=3 -MinorVer=9 +[MOT-T721*] +Parent=Motorola Internet Browser -[BlackBerrySimulator/4.0.*] -Parent=BlackBerry -Version=4.0 -MajorVer=4 -MinorVer=0 +[MOT-TA02/* MIB/*] +Parent=Motorola Internet Browser -[BlackBerrySimulator/4.1.*] -Parent=BlackBerry -Version=4.1 -MajorVer=4 -MinorVer=1 +[MOT-V*/*] +Parent=Motorola Internet Browser -[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/3.5.*] -Parent=BlackBerry -Version=3.5 -MajorVer=3 -MinorVer=5 -Win32=true +[MOT-V*/* MIB/*] +Parent=Motorola Internet Browser -[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/3.6.*] -Parent=BlackBerry -Version=3.6 -MajorVer=3 -MinorVer=6 -Win32=true +[MOT-V*/* UP.Browser/*] +Parent=Motorola Internet Browser -[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/3.7.*] -Parent=BlackBerry -Version=3.7 -MajorVer=3 -MinorVer=7 -Win32=true +[MOT-V3/* MIB/*] +Parent=Motorola Internet Browser -[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/3.8.*] -Parent=BlackBerry -Version=3.8 -MajorVer=3 -MinorVer=8 -Win32=true +[MOT-V4*/* MIB/*] +Parent=Motorola Internet Browser -[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/3.9.*] -Parent=BlackBerry -Version=3.9 -MajorVer=3 -MinorVer=9 -Win32=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Mobile Proxy -[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/4.0.*] -Parent=BlackBerry -Version=4.0 -MajorVer=4 -MinorVer=0 +[MSN Mobile Proxy] +Parent=DefaultProperties +Browser=MSN Mobile Proxy Win32=true +Frames=true +Tables=true +Cookies=true +JavaScript=true +ActiveXControls=true +isMobileDevice=true -[Mozilla/?.0 (compatible; MSIE ?.*; Windows*) BlackBerry7*/4.1.*] -Parent=BlackBerry -Version=4.1 -MajorVer=4 -MinorVer=1 -Win32=true +[Mozilla/* (compatible; MSIE *; Windows*; MSN Mobile Proxy)] +Parent=MSN Mobile Proxy -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Handspring Blazer +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetFront -[Blazer] +[NetFront] Parent=DefaultProperties -Browser=Handspring Blazer -Platform=Palm +Browser=NetFront Frames=true Tables=true Cookies=true -WAP=true +JavaScript=true isMobileDevice=true -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource/*; Blazer/3.*) ??;???x???] -Parent=Blazer -Version=3.0 -MajorVer=3 -MinorVer=0 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource/*; Blazer/4.*) ??;???x???] -Parent=Blazer -Version=4.0 -MajorVer=4 -MinorVer=0 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource/*; Blazer/5.*) ??;???x???] -Parent=Blazer -Version=5.0 -MajorVer=5 -MinorVer=0 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource; Blazer 3.*) ??;???x???] -Parent=Blazer -Version=3.0 -MajorVer=3 -MinorVer=0 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource; Blazer 4.*) ??;???x???] -Parent=Blazer -Version=4.0 -MajorVer=4 -MinorVer=0 -Win32=true +[*NetFront/*] +Parent=NetFront -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 9?; PalmSource; Blazer 5.*) ??;???x???] -Parent=Blazer -Version=5.0 -MajorVer=5 -MinorVer=0 -Win32=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nokia -[UPG1 UP/?.0 (*compatible; Blazer 3.*)] -Parent=Blazer -Version=3.0 -MajorVer=3 -MinorVer=0 +[Nokia] +Parent=DefaultProperties +Browser=Nokia +Tables=true +Cookies=true +isMobileDevice=true -[UPG1 UP/?.0 (*compatible; Blazer 4.*)] -Parent=Blazer -Version=4.0 -MajorVer=4 -MinorVer=0 +[*Nokia*/*] +Parent=Nokia -[UPG1 UP/?.0 (*compatible; Blazer 5.*)] -Parent=Blazer -Version=5.0 -MajorVer=5 -MinorVer=0 +[Mozilla/* (SymbianOS/*; ?; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] +Parent=Nokia +Platform=SymbianOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Danger +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openwave Mobile Browser -[Danger] +[Openwave Mobile Browser] Parent=DefaultProperties -Browser=Danger -Platform=JAVA +Browser=Openwave Mobile Browser +Alpha=true +Win32=true +Win64=true Frames=true Tables=true Cookies=true -JavaScript=true -WAP=true isMobileDevice=true -CSS=1 -CssVersion=1 -supportsCSS=true -[Mozilla/5.0 (*Danger hiptop 1.0*)] -Parent=Danger -Version=1.0 -MajorVer=1 -MinorVer=0 +[*UP.Browser/*] +Parent=Openwave Mobile Browser -[Mozilla/5.0 (*Danger hiptop 2.0*)] -Parent=Danger -Version=2.0 -MajorVer=2 -MinorVer=0 +[*UP.Link/*] +Parent=Openwave Mobile Browser -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoCoMo +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mini -[DoCoMo] +[Opera Mini] Parent=DefaultProperties -Browser=DoCoMo +Browser=Opera Mini Frames=true +IFrames=true Tables=true Cookies=true JavaScript=true -WAP=true isMobileDevice=true -[DoCoMo/1.0*] -Parent=DoCoMo +[Opera/* (J2ME/MIDP; Opera Mini/1.0*)*] +Parent=Opera Mini Version=1.0 MajorVer=1 MinorVer=0 -Platform=WAP -CSS=1 -CssVersion=1 -supportsCSS=true -[DoCoMo/2.0*] -Parent=DoCoMo +[Opera/* (J2ME/MIDP; Opera Mini/1.1*)*] +Parent=Opera Mini +Version=1.1 +MajorVer=1 +MinorVer=1 + +[Opera/* (J2ME/MIDP; Opera Mini/1.2*)*] +Parent=Opera Mini +Version=1.2 +MajorVer=1 +MinorVer=2 + +[Opera/* (J2ME/MIDP; Opera Mini/2.0*)*] +Parent=Opera Mini Version=2.0 MajorVer=2 MinorVer=0 -Platform=WAP -CSS=1 -CssVersion=1 -supportsCSS=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Doris +[Opera/* (J2ME/MIDP; Opera Mini/3.0*)*] +Parent=Opera Mini +Version=3.0 +MajorVer=3 +MinorVer=0 + +[Opera/* (J2ME/MIDP; Opera Mini/3.1*)*] +Parent=Opera Mini +Version=3.1 +MajorVer=3 +MinorVer=1 + +[Opera/* (J2ME/MIDP; Opera Mini/4.0*)*] +Parent=Opera Mini +Version=4.0 +MajorVer=4 +MinorVer=0 + +[Opera/* (J2ME/MIDP; Opera Mini/4.1*)*] +Parent=Opera Mini +Version=4.1 +MajorVer=4 +MinorVer=1 + +[Opera/* (J2ME/MIDP; Opera Mini/4.2*)*] +Parent=Opera Mini +Version=4.2 +MajorVer=4 +MinorVer=2 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mobile -[Doris] +[Opera Mobile] Parent=DefaultProperties -Browser=Doris -Platform=SymbianOS +Browser=Opera Mobi Frames=true Tables=true Cookies=true -WAP=true isMobileDevice=true -[Doris/*] -Parent=Doris +[Opera/9.5 (Microsoft Windows; PPC; *Opera Mobile/*)] +Parent=Opera Mobile +Version=9.5 +MajorVer=9 +MinorVer=5 + +[Opera/9.5 (Microsoft Windows; PPC; Opera Mobi/*)] +Parent=Opera Mobile +Version=9.5 +MajorVer=9 +MinorVer=5 + +[Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/*)*] +Parent=Opera Mobile +Version=9.51 +MajorVer=9 +MinorVer=51 +Beta=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; jig +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Playstation -[jig] +[Playstation] Parent=DefaultProperties -Browser=jig +Browser=Playstation +Platform=WAP Frames=true Tables=true Cookies=true -JavaScript=true -WAP=true isMobileDevice=true -[Mozilla/4.0 (jig browser web; *)] -Parent=jig -Browser=jig browser web +[Mozilla/* (PLAYSTATION *; *)] +Parent=Playstation +Browser=PlayStation 3 +Frames=false + +[Mozilla/* (PSP (PlayStation Portable); *)] +Parent=Playstation -[Mozilla/4.0 (jig browser; *)] -Parent=jig -Browser=jig browser +[Sony PS2 (Linux)] +Parent=Playstation +Browser=Sony PS2 +Platform=Linux -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KDDI +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pocket PC -[KDDI] +[Pocket PC] Parent=DefaultProperties -Browser=KDDI +Browser=Pocket PC +Platform=WinCE +Win32=true Frames=true Tables=true Cookies=true -BackgroundSounds=true -VBScript=true JavaScript=true ActiveXControls=true -WAP=true isMobileDevice=true -CSS=1 CssVersion=1 supportsCSS=true -[KDDI-CA?? UP.Browser/* (GUI) MMP/*] -Parent=KDDI +[*(compatible; MSIE *.*; Windows CE; PPC; *)] +Parent=Pocket PC -[KDDI-Googlebot-Mobile] -Parent=KDDI +[HTC-*/* Mozilla/* (compatible; MSIE *.*; Windows CE*)*] +Parent=Pocket PC +Win32=true -[KDDI-HI?? UP.Browser/* (GUI) MMP/*] -Parent=KDDI +[Mozilla/* (compatible; MSPIE *.*; *Windows CE*)*] +Parent=Pocket PC +Win32=true -[KDDI-KC?? UP.Browser/* (GUI) MMP/*] -Parent=KDDI +[T-Mobile* Mozilla/* (compatible; MSIE *.*; Windows CE; *)] +Parent=Pocket PC -[KDDI-PT?? UP.Browser/* (GUI) MMP/*] -Parent=KDDI +[Vodafone* Mozilla/* (compatible; MSIE *.*; Windows CE; *)*] +Parent=Pocket PC -[KDDI-SA?? UP.Browser/* (GUI) MMP/*] -Parent=KDDI +[Windows CE (Pocket PC) - Version *.*] +Parent=Pocket PC +Win32=true -[KDDI-SN?? UP.Browser/* (GUI) MMP/*] -Parent=KDDI - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEMC Browser -[Motorola Web Browser] +[SEMC Browser] Parent=DefaultProperties -Browser=Motorola Internet Browser -Frames=true +Browser=SEMC Browser +Platform=JAVA Tables=true -Cookies=true -WAP=true isMobileDevice=true +CssVersion=1 +supportsCSS=true -[MOT-1*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-8700_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-0A/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-2B/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-88/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-C???/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-GATW_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-L6/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-L7/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-M*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-SAP4_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-T7*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-T721*] -Parent=Motorola Internet Browser - -[MOT-TA02/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-V3/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V4*/* MIB/*] -Parent=Motorola Internet Browser +[*SEMC-Browser/*] +Parent=SEMC Browser -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SonyEricsson -[Motorola Web Browser] +[SonyEricsson] Parent=DefaultProperties -Browser=Motorola Internet Browser +Browser=SonyEricsson Frames=true Tables=true Cookies=true -WAP=true +JavaScript=true isMobileDevice=true +CssVersion=1 +supportsCSS=true -[MOT-1*/* UP.Browser/*] -Parent=Motorola Web Browser - -[MOT-8700_/* UP.Browser/*] -Parent=Motorola Web Browser - -[MOT-A-0A/* UP.Browser/*] -Parent=Motorola Web Browser - -[MOT-A-2B/* UP.Browser/*] -Parent=Motorola Web Browser - -[MOT-A-88/* UP.Browser/*] -Parent=Motorola Web Browser - -[MOT-C???/* MIB/*] -Parent=Motorola Web Browser - -[MOT-GATW_/* UP.Browser/*] -Parent=Motorola Web Browser - -[MOT-L6/* MIB/*] -Parent=Motorola Web Browser - -[MOT-L7/* MIB/*] -Parent=Motorola Web Browser - -[MOT-M*/* UP.Browser/*] -Parent=Motorola Web Browser - -[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Web Browser -Win32=true - -[MOT-SAP4_/* UP.Browser/*] -Parent=Motorola Web Browser - -[MOT-T7*/* MIB/*] -Parent=Motorola Web Browser - -[MOT-T721*] -Parent=Motorola Web Browser - -[MOT-TA02/* MIB/*] -Parent=Motorola Web Browser +[*Ericsson*] +Parent=SonyEricsson -[MOT-V*/* MIB/*] -Parent=Motorola Web Browser +[*SonyEricsson*] +Parent=SonyEricsson -[MOT-V*/* UP.Browser/*] -Parent=Motorola Web Browser +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netbox -[MOT-V3/* MIB/*] -Parent=Motorola Web Browser +[Netbox] +Parent=DefaultProperties +Browser=Netbox +Frames=true +Tables=true +Cookies=true +JavaScript=true +CssVersion=1 +supportsCSS=true -[MOT-V4*/* MIB/*] -Parent=Motorola Web Browser +[Mozilla/3.01 (compatible; Netbox/*; Linux*)] +Parent=Netbox +Browser=Netbox +Platform=Linux -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Mobile Proxy +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PowerTV -[MSN Mobile Proxy] +[PowerTV] Parent=DefaultProperties -Browser=MSN Mobile Proxy -Win32=true +Browser=PowerTV +Platform=PowerTV Frames=true Tables=true Cookies=true JavaScript=true -ActiveXControls=true -WAP=true -isMobileDevice=true -[Mozilla/4.0 (compatible; MSIE 4.01; Windows NT; MSN Mobile Proxy)] -Parent=MSN Mobile Proxy +[Mozilla/4.0 PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)] +Parent=PowerTV +Version=1.5 +MajorVer=1 +MinorVer=5 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetFront +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebTV/MSNTV -[NetFront] +[WebTV] Parent=DefaultProperties -Browser=NetFront +Browser=WebTV/MSNTV +Platform=WebTV Frames=true Tables=true Cookies=true JavaScript=true -WAP=true -isMobileDevice=true -[*NetFront/3.2] -Parent=NetFront -Version=3.2 -MajorVer=3 -MinorVer=2 -WAP=true -isMobileDevice=true - -[Mozilla/* (*)*NetFront/3.0*] -Parent=NetFront -Version=3.0 -MajorVer=3 +[Mozilla/3.0 WebTV/1.*(compatible; MSIE 2.0)] +Parent=WebTV +Version=1.0 +MajorVer=1 MinorVer=0 -[Mozilla/* (*)*NetFront/3.1*] -Parent=NetFront -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/* (*)*NetFront/3.2*] -Parent=NetFront -Version=3.2 -MajorVer=3 -MinorVer=2 - -[Mozilla/* (*)*NetFront/3.3*] -Parent=NetFront -Version=3.3 -MajorVer=3 -MinorVer=3 - -[Mozilla/* (compatible; MSIE *; Windows *) NetFront/3.0*] -Parent=NetFront -Version=3.0 -MajorVer=3 +[Mozilla/4.0 WebTV/2.0*(compatible; MSIE 3.0)] +Parent=WebTV +Version=2.0 +MajorVer=2 MinorVer=0 -Win32=true -[Mozilla/* (compatible; MSIE *; Windows *) NetFront/3.1*] -Parent=NetFront -Version=3.1 -MajorVer=3 +[Mozilla/4.0 WebTV/2.1*(compatible; MSIE 3.0)] +Parent=WebTV +Version=2.1 +MajorVer=2 MinorVer=1 -Win32=true -[Mozilla/* (compatible; MSIE *; Windows *) NetFront/3.2*] -Parent=NetFront -Version=3.2 -MajorVer=3 +[Mozilla/4.0 WebTV/2.2*(compatible; MSIE 3.0)] +Parent=WebTV +Version=2.2 +MajorVer=2 MinorVer=2 -Win32=true -[Mozilla/* (compatible; MSIE *; Windows *) NetFront/3.3*] -Parent=NetFront -Version=3.3 -MajorVer=3 +[Mozilla/4.0 WebTV/2.3*(compatible; MSIE 3.0)] +Parent=WebTV +Version=2.3 +MajorVer=2 MinorVer=3 -Win32=true -[Mozilla/* (MobilePhone*) NetFront/3.0*] -Parent=NetFront -Version=3.0 -MajorVer=3 -MinorVer=0 +[Mozilla/4.0 WebTV/2.4*(compatible; MSIE 3.0)] +Parent=WebTV +Version=2.4 +MajorVer=2 +MinorVer=4 -[Mozilla/* (MobilePhone*) NetFront/3.1*] -Parent=NetFront -Version=3.1 -MajorVer=3 -MinorVer=1 +[Mozilla/4.0 WebTV/2.5*(compatible; MSIE 4.0)] +Parent=WebTV +Version=2.5 +MajorVer=2 +MinorVer=5 +CssVersion=1 +supportsCSS=true -[Mozilla/* (MobilePhone*) NetFront/3.2*] -Parent=NetFront -Version=3.2 -MajorVer=3 -MinorVer=2 +[Mozilla/4.0 WebTV/2.6*(compatible; MSIE 4.0)] +Parent=WebTV +Version=2.6 +MajorVer=2 +MinorVer=6 +CssVersion=1 +supportsCSS=true -[Mozilla/* (MobilePhone*) NetFront/3.3*] -Parent=NetFront -Version=3.3 -MajorVer=3 -MinorVer=3 - -[Mozilla/* (SmartPhone*) NetFront/3.0*] -Parent=NetFront -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/* (SmartPhone*) NetFront/3.1*] -Parent=NetFront -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/* (SmartPhone*) NetFront/3.2*] -Parent=NetFront -Version=3.2 -MajorVer=3 -MinorVer=2 - -[Mozilla/* (SmartPhone*) NetFront/3.3*] -Parent=NetFront -Version=3.3 -MajorVer=3 -MinorVer=3 - -[Mozilla/* (Windows; U; NT4.0; *) NetFront/3.0*] -Parent=NetFront -Version=3.0 -MajorVer=3 -MinorVer=0 -Win32=true - -[Mozilla/* (Windows; U; NT4.0; *) NetFront/3.1*] -Parent=NetFront -Version=3.1 -MajorVer=3 -MinorVer=1 -Win32=true - -[Mozilla/* (Windows; U; NT4.0; *) NetFront/3.2*] -Parent=NetFront -Version=3.2 -MajorVer=3 -MinorVer=2 -Win32=true - -[Mozilla/* (Windows; U; NT4.0; *) NetFront/3.3*] -Parent=NetFront -Version=3.3 -MajorVer=3 -MinorVer=3 -Win32=true - -[SAMSUNG-SGH-* Configuration/CLDC-?.? NetFront/3.2] -Parent=NetFront -Version=3.2 -MajorVer=3 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nokia - -[Nokia] -Parent=DefaultProperties -Browser=Nokia -Tables=true -Cookies=true -WAP=true -isMobileDevice=true - -[Mozilla/5.0 (SymbianOS/*; U; *) AppleWebKit/413 (KHTML, like Gecko) Safari/413] -Parent=Nokia - -[Nokia????/* SymbianOS/* Series60/*] -Parent=Nokia -Platform=SymbianOS -Frames=true -JavaScript=true - -[Nokia????/1.0 (*) Profile/MIDP-?.? Configuration/CLDC-?.?*] -Parent=Nokia -Frames=false -JavaScript=false - -[Nokia????/1.0 (*)*] -Parent=Nokia -Frames=false -JavaScript=false - -[Nokia????/2.0 (*) Profile/MIDP-?.? Configuration/CLDC-?.?*] -Parent=Nokia - -[Nokia????/2.0 (*) SymbianOS/* Series60/* Profile/MIDP-?.? Configuration/CLDC-?.?*] -Parent=Nokia - -[Nokia????/4.* Series60/* Profile/MIDP-?.? Configuration/CLDC-?.?*] -Parent=Nokia - -[Nokia?????/* (*) Profile/MIDP-?.? Configuration/CLDC-?.?*] -Parent=Nokia - -[Nokia7650/* SymbianOS/* Series60/*] -Parent=Nokia -Platform=SymbianOS -Frames=true -JavaScript=true - -[NokiaN70-1/*/SN* Series60/* Profile/MIDP-?.? Configuration/CLDC-?.?*] -Parent=Nokia -Frames=true -JavaScript=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Obigo - -[Obigo] -Parent=DefaultProperties -Browser=Obigo -Frames=true -Tables=true -Cookies=true -JavaScript=true -WAP=true -isMobileDevice=true - -[AU-MIC/* MMP/*] -Parent=Obigo - -[LG-LX??? AU-MIC-LX??0/* MMP/*] -Parent=Obigo - -[Samsung-SPHA* AU-MIC* MMP/*] -Parent=Obigo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openwave Mobile Browser - -[Openwave Mobile Browser] -Parent=DefaultProperties -Browser=Openwave Mobile Browser -Alpha=true -Win32=true -Win64=true -Frames=true -Tables=true -Cookies=true -WAP=true -isMobileDevice=true -isSyndicationReader=true - -[*UP.Browser/*] -Parent=Openwave Mobile Browser - -[*UP.Link/*] -Parent=Openwave Mobile Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera - -[Opera] -Parent=DefaultProperties -Browser=Opera -Platform=SymbianOS -Frames=true -Tables=true -Cookies=true -JavaScript=true -WAP=true -isMobileDevice=true - -[Mozilla/4.* (compatible; MSIE 6.0; Symbian OS; *Opera*] -Parent=Opera -Platform=SymbianOS - -[Mozilla/4.* (compatible; MSIE 6.0; SymbianOS; *Opera*] -Parent=Opera - -[Opera/* (*Opera Mini/1.0*)*] -Parent=Opera -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Opera/* (*Opera Mini/1.1*)*] -Parent=Opera -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Opera/* (*Opera Mini/1.2*)*] -Parent=Opera -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Opera/* (*Opera Mini/2.0*)*] -Parent=Opera -Version=2.0 -MajorVer=2 -MinorVer=0 -CSS=1 -CssVersion=1 -supportsCSS=true - -[Opera/* (*Opera Mini/3.0*)*] -Parent=Opera -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Opera/* (Nintendo Wii*)] -Parent=Opera -Browser=Wii Web Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Playstation - -[Playstation] -Parent=DefaultProperties -Browser=Playstation -Platform=WAP -Frames=true -Tables=true -Cookies=true -WAP=true -isMobileDevice=true - -[Mozilla/4.0 (PSP (PlayStation Portable); 2.00)] -Parent=Playstation -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (PLAYSTATION 3; 1.00)] -Parent=Playstation -Browser=PlayStation 3 -Version=1.0 -MajorVer=1 -MinorVer=1 -Frames=false - -[Sony PS2 (Linux)] -Parent=Playstation -Browser=Sony PS2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pocket PC - -[Pocket PC] -Parent=DefaultProperties -Browser=Pocket PC -Platform=WinCE -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -WAP=true -isMobileDevice=true -CSS=1 -CssVersion=1 -supportsCSS=true - -[HTC-*/* Mozilla/4.0 (compatible; MSIE 5.5; Windows CE*)*] -Parent=Pocket PC -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true - -[HTC-*/* Mozilla/4.0 (compatible; MSIE 6.0; Windows CE*)*] -Parent=Pocket PC -Version=6.0 -MajorVer=6 -MinorVer=0 -Win32=true - -[Mozilla/1.1 (compatible; MSPIE 2.0; *Windows CE*)*] -Parent=Pocket PC -Version=2.0 -MajorVer=2 -MinorVer=0 -Win32=true - -[Mozilla/2.0 (compatible; MSIE 3.0*; *Windows CE*)*] -Parent=Pocket PC -Version=3.0 -MajorVer=3 -MinorVer=0 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 4.0*; *Windows CE*)*] -Parent=Pocket PC -Version=4.01 -MajorVer=4 -MinorVer=01 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 5.5*; Windows CE*)*] -Parent=Pocket PC -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0*; Windows CE*)*] -Parent=Pocket PC -Version=6.0 -MajorVer=6 -MinorVer=0 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows CE*)*] -Parent=Pocket PC -Version=7.0 -MajorVer=7 -MinorVer=0 -Beta=true -Win32=true - -[SIE-*/* (compatible; MSIE 4.01; Windows CE; PPC; 240x320)] -Parent=Pocket PC - -[T-Mobile Dash Mozilla/4.0 (compatible; MSIE 4.*; Windows CE; Smartphone; 320x240)] -Parent=Pocket PC - -[Vodafone/*/Mozilla/4.0 (compatible; MSIE*; Windows CE;*)*] -Parent=Pocket PC - -[Windows CE (Pocket PC) - Version 4.2*] -Parent=Pocket PC -Version=4.01 -MajorVer=4 -MinorVer=01 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEMC Browser - -[SEMC Browser] -Parent=DefaultProperties -Browser=SEMC Browser -Platform=JAVA -Tables=true -WAP=true -isMobileDevice=true -CSS=1 -CssVersion=1 -supportsCSS=true - -[*SEMC-Browser/*] -Parent=SEMC Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SonyEricsson - -[SonyEricsson] -Parent=DefaultProperties -Browser=SonyEricsson -Frames=true -Tables=true -Cookies=true -JavaScript=true -WAP=true -isMobileDevice=true - -[Ericsson*] -Parent=SonyEricsson - -[SonyEricsson*] -Parent=SonyEricsson - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netbox - -[Netbox] -Parent=DefaultProperties -Browser=Netbox -Frames=true -Tables=true -Cookies=true -JavaScript=true -CSS=1 -CssVersion=1 -supportsCSS=true - -[Mozilla/3.01 (compatible; Netbox/*; Linux*)] -Parent=Netbox -Browser=Netbox -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PowerTV - -[PowerTV] -Parent=DefaultProperties -Browser=PowerTV -Platform=PowerTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)] -Parent=PowerTV -Version=1.5 -MajorVer=1 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebTV/MSNTV - -[WebTV] -Parent=DefaultProperties -Browser=WebTV/MSNTV -Platform=WebTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/3.0 WebTV/1.*(compatible; MSIE 2.0)] -Parent=WebTV -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.0*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.1*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/4.0 WebTV/2.2*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/4.0 WebTV/2.3*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Mozilla/4.0 WebTV/2.4*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Mozilla/4.0 WebTV/2.5*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.5 -MajorVer=2 -MinorVer=5 -CSS=1 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.6*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.6 -MajorVer=2 -MinorVer=6 -CSS=1 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.7*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.7 -MajorVer=2 -MinorVer=7 -CSS=1 -CssVersion=1 -supportsCSS=true +[Mozilla/4.0 WebTV/2.7*(compatible; MSIE 4.0)] +Parent=WebTV +Version=2.7 +MajorVer=2 +MinorVer=7 +CssVersion=1 +supportsCSS=true [Mozilla/4.0 WebTV/2.8*(compatible; MSIE 4.0)] Parent=WebTV @@ -7292,7 +6522,6 @@ Version=2.8 MajorVer=2 MinorVer=8 JavaApplets=true -CSS=1 CssVersion=1 supportsCSS=true @@ -7302,7 +6531,6 @@ Version=2.9 MajorVer=2 MinorVer=9 JavaApplets=true -CSS=1 CssVersion=1 supportsCSS=true @@ -7325,7 +6553,6 @@ Parent=Amaya Version=8.0 MajorVer=8 MinorVer=0 -CSS=2 CssVersion=2 supportsCSS=true @@ -7334,7 +6561,6 @@ Parent=Amaya Version=8.1 MajorVer=8 MinorVer=1 -CSS=2 CssVersion=2 supportsCSS=true @@ -7343,7 +6569,6 @@ Parent=Amaya Version=8.2 MajorVer=8 MinorVer=2 -CSS=2 CssVersion=2 supportsCSS=true @@ -7352,7 +6577,6 @@ Parent=Amaya Version=8.3 MajorVer=8 MinorVer=3 -CSS=2 CssVersion=2 supportsCSS=true @@ -7361,7 +6585,6 @@ Parent=Amaya Version=8.4 MajorVer=8 MinorVer=4 -CSS=2 CssVersion=2 supportsCSS=true @@ -7370,7 +6593,6 @@ Parent=Amaya Version=8.5 MajorVer=8 MinorVer=5 -CSS=2 CssVersion=2 supportsCSS=true @@ -7379,7 +6601,6 @@ Parent=Amaya Version=8.6 MajorVer=8 MinorVer=6 -CSS=2 CssVersion=2 supportsCSS=true @@ -7388,7 +6609,6 @@ Parent=Amaya Version=8.7 MajorVer=8 MinorVer=7 -CSS=2 CssVersion=2 supportsCSS=true @@ -7397,7 +6617,6 @@ Parent=Amaya Version=8.8 MajorVer=8 MinorVer=8 -CSS=2 CssVersion=2 supportsCSS=true @@ -7406,7 +6625,6 @@ Parent=Amaya Version=8.9 MajorVer=8 MinorVer=9 -CSS=2 CssVersion=2 supportsCSS=true @@ -7415,7 +6633,6 @@ Parent=Amaya Version=9.0 MajorVer=8 MinorVer=0 -CSS=2 CssVersion=2 supportsCSS=true @@ -7424,7 +6641,6 @@ Parent=Amaya Version=9.1 MajorVer=9 MinorVer=1 -CSS=2 CssVersion=2 supportsCSS=true @@ -7433,7 +6649,6 @@ Parent=Amaya Version=9.2 MajorVer=9 MinorVer=2 -CSS=2 CssVersion=2 supportsCSS=true @@ -7603,6 +6818,27 @@ MajorVer=2 MinorVer=1 Platform=OpenBSD +[Links (2.2*; FreeBSD*)] +Parent=Links +Version=2.2 +MajorVer=2 +MinorVer=2 +Platform=FreeBSD + +[Links (2.2*; Linux *)] +Parent=Links +Version=2.2 +MajorVer=2 +MinorVer=2 +Platform=Linux + +[Links (2.2*; OpenBSD*)] +Parent=Links +Version=2.2 +MajorVer=2 +MinorVer=2 +Platform=OpenBSD + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lynx [Lynx] @@ -7657,6 +6893,12 @@ Version=2.8 MajorVer=2 MinorVer=8 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NCSA Mosaic + +[Mosaic] +Parent=DefaultProperties +Browser=Mosaic + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; w3m [w3m] @@ -7706,7 +6948,7 @@ Cookies=true [ELinks 0.10] Parent=DefaultProperties -Browser=ELinks 0.10 +Browser=ELinks Version=0.10 MinorVer=10 Frames=true @@ -7836,7 +7078,7 @@ Platform=Unix [ELinks 0.11] Parent=DefaultProperties -Browser=ELinks 0.11 +Browser=ELinks Version=0.11 MinorVer=11 Frames=true @@ -8096,7 +7338,7 @@ Platform=Unix [ELinks 0.9] Parent=DefaultProperties -Browser=ELinks 0.9 +Browser=ELinks Version=0.9 MinorVer=9 Frames=true @@ -8222,1052 +7464,1124 @@ Platform=Solaris Parent=ELinks 0.9 Platform=Unix -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AppleWebKit -[ELinks ] +[AppleWebKit] Parent=DefaultProperties -Browser=ELinks +Browser=AppleWebKit Frames=true +IFrames=true Tables=true +Cookies=true +BackgroundSounds=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[ELinks (*; *AIX*)] -Parent=ELinks -Platform=AIX +[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (KHTML, like Gecko)] +Parent=AppleWebKit -[ELinks (*; *BeOS*)] -Parent=ELinks -Platform=BeOS +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Camino -[ELinks (*; *CygWin*)] -Parent=ELinks -Platform=CygWin +[Camino] +Parent=DefaultProperties +Browser=Camino +Platform=MacOSX +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[ELinks (*; *Darwin*)] -Parent=ELinks -Platform=Darwin +[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.7*] +Parent=Camino +Version=0.7 +MajorVer=0 +MinorVer=7 +Beta=true -[ELinks (*; *Digital Unix*)] -Parent=ELinks -Platform=Digital Unix +[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.8*] +Parent=Camino +Version=0.8 +MajorVer=0 +MinorVer=8 +Beta=true -[ELinks (*; *FreeBSD*)] -Parent=ELinks -Platform=FreeBSD +[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.9*] +Parent=Camino +Version=0.9 +MajorVer=0 +MinorVer=9 +Beta=true -[ELinks (*; *HPUX*)] -Parent=ELinks -Platform=HP-UX +[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.0*] +Parent=Camino +Version=1.0 +MajorVer=1 +MinorVer=0 -[ELinks (*; *IRIX*)] -Parent=ELinks -Platform=IRIX +[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.2*] +Parent=Camino +Version=1.2 +MajorVer=1 +MinorVer=2 + +[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.3*] +Parent=Camino +Version=1.3 +MajorVer=1 +MinorVer=3 +Platform=MacOSX + +[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.4*] +Parent=Camino +Version=1.4 +MajorVer=1 +MinorVer=4 +Platform=MacOSX + +[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.5*] +Parent=Camino +Version=1.5 +MajorVer=1 +MinorVer=5 +Platform=MacOSX + +[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.6*] +Parent=Camino +Version=1.6 +MajorVer=1 +MinorVer=6 +Platform=MacOSX + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chimera + +[Chimera] +Parent=DefaultProperties +Browser=Chimera +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true + +[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Chimera/*] +Parent=Chimera +Platform=MacOSX + +[Mozilla/5.0 Gecko/* Chimera/*] +Parent=Chimera -[ELinks (*; *Linux*)] -Parent=ELinks +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dillo + +[Dillo] +Parent=DefaultProperties +Browser=Dillo Platform=Linux +Frames=true +IFrames=true +Tables=true +Cookies=true +CssVersion=2 +supportsCSS=true -[ELinks (*; *NetBSD*)] -Parent=ELinks -Platform=NetBSD +[Dillo/0.6*] +Parent=Dillo +Version=0.6 +MajorVer=0 +MinorVer=6 -[ELinks (*; *OpenBSD*)] -Parent=ELinks -Platform=OpenBSD +[Dillo/0.7*] +Parent=Dillo +Version=0.7 +MajorVer=0 +MinorVer=7 -[ELinks (*; *OS/2*)] -Parent=ELinks -Platform=OS/2 +[Dillo/0.8*] +Parent=Dillo +Version=0.8 +MajorVer=0 +MinorVer=8 -[ELinks (*; *RISC*)] -Parent=ELinks -Platform=RISC OS +[Dillo/2.0] +Parent=Dillo +Version=2.0 +MajorVer=2 +MinorVer=0 -[ELinks (*; *Solaris*)] -Parent=ELinks -Platform=Solaris +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Emacs/W3 -[ELinks (*; *Unix*)] -Parent=ELinks +[Emacs/W3] +Parent=DefaultProperties +Browser=Emacs/W3 +Frames=true +Tables=true +Cookies=true + +[Emacs/W3/2.* (Unix*] +Parent=Emacs/W3 +Version=2.0 +MajorVer=2 +MinorVer=0 Platform=Unix -[ELinks/* (*AIX*)] -Parent=ELinks -Platform=AIX +[Emacs/W3/2.* (X11*] +Parent=Emacs/W3 +Version=2.0 +MajorVer=2 +MinorVer=0 +Platform=Linux -[ELinks/* (*BeOS*)] -Parent=ELinks -Platform=BeOS +[Emacs/W3/3.* (Unix*] +Parent=Emacs/W3 +Version=3.0 +MajorVer=3 +MinorVer=0 +Platform=Unix -[ELinks/* (*CygWin*)] -Parent=ELinks -Platform=CygWin +[Emacs/W3/3.* (X11*] +Parent=Emacs/W3 +Version=3.0 +MajorVer=3 +MinorVer=0 +Platform=Linux -[ELinks/* (*Darwin*)] -Parent=ELinks -Platform=Darwin +[Emacs/W3/4.* (Unix*] +Parent=Emacs/W3 +Version=4.0 +MajorVer=4 +MinorVer=0 +Platform=Unix -[ELinks/* (*Digital Unix*)] -Parent=ELinks -Platform=Digital Unix +[Emacs/W3/4.* (X11*] +Parent=Emacs/W3 +Version=4.0 +MajorVer=4 +MinorVer=0 +Platform=Linux -[ELinks/* (*FreeBSD*)] -Parent=ELinks -Platform=FreeBSD +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fantomas -[ELinks/* (*HPUX*)] -Parent=ELinks -Platform=HP-UX +[fantomas] +Parent=DefaultProperties +Browser=fantomas +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaScript=true + +[Mozilla/4.0 (cloakBrowser)] +Parent=fantomas +Browser=fantomas cloakBrowser + +[Mozilla/4.0 (fantomas shadowMaker Browser)] +Parent=fantomas +Browser=fantomas shadowMaker Browser -[ELinks/* (*IRIX*)] -Parent=ELinks -Platform=IRIX +[Mozilla/4.0 (fantomBrowser)] +Parent=fantomas +Browser=fantomas fantomBrowser -[ELinks/* (*Linux*)] -Parent=ELinks -Platform=Linux +[Mozilla/4.0 (fantomCrew Browser)] +Parent=fantomas +Browser=fantomas fantomCrew Browser -[ELinks/* (*NetBSD*)] -Parent=ELinks -Platform=NetBSD +[Mozilla/4.0 (stealthBrowser)] +Parent=fantomas +Browser=fantomas stealthBrowser -[ELinks/* (*OpenBSD*)] -Parent=ELinks -Platform=OpenBSD +[multiBlocker browser*] +Parent=fantomas +Browser=fantomas multiBlocker browser -[ELinks/* (*OS/2*)] -Parent=ELinks -Platform=OS/2 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FrontPage -[ELinks/* (*RISC*)] -Parent=ELinks -Platform=RISC OS +[FrontPage] +Parent=DefaultProperties +Browser=FrontPage +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaScript=true -[ELinks/* (*Solaris*)] -Parent=ELinks -Platform=Solaris +[Mozilla/?* (compatible; MS FrontPage*)] +Parent=FrontPage -[ELinks/* (*Unix*)] -Parent=ELinks -Platform=Unix +[MSFrontPage/*] +Parent=FrontPage -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AppleWebKit +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galeon -[AppleWebKit] +[Galeon] Parent=DefaultProperties -Browser=AppleWebKit +Browser=Galeon +Platform=Linux Frames=true IFrames=true Tables=true Cookies=true -BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (KHTML, like Gecko)] -Parent=AppleWebKit +[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.*] +Parent=Galeon +Version=1.0 +MajorVer=1 +MinorVer=0 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Camino +[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/2.*] +Parent=Galeon +Version=2.0 +MajorVer=2 +MinorVer=0 -[Camino] +[Mozilla/5.0 Galeon/1.* (X11; Linux*)*] +Parent=Galeon +Version=1.0 +MajorVer=1 +MinorVer=0 + +[Mozilla/5.0 Galeon/2.* (X11; Linux*)*] +Parent=Galeon +Version=2.0 +MajorVer=2 +MinorVer=0 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HP Secure Web Browser + +[HP Secure Web Browser] Parent=DefaultProperties -Browser=Camino -Platform=MacOSX +Browser=HP Secure Web Browser +Platform=OpenVMS Frames=true IFrames=true Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.7*] -Parent=Camino -Version=0.7 -MajorVer=0 -MinorVer=7 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.8*] -Parent=Camino -Version=0.8 -MajorVer=0 -MinorVer=8 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.9*] -Parent=Camino -Version=0.9 -MajorVer=0 -MinorVer=9 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.0*] -Parent=Camino +[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.0*) Gecko/*] +Parent=HP Secure Web Browser Version=1.0 MajorVer=1 MinorVer=0 -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.2*] -Parent=Camino +[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.1*) Gecko/*] +Parent=HP Secure Web Browser +Version=1.1 +MajorVer=1 +MinorVer=1 + +[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.2*) Gecko/*] +Parent=HP Secure Web Browser Version=1.2 MajorVer=1 MinorVer=2 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chimera +[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.3*) Gecko/*] +Parent=HP Secure Web Browser +Version=1.3 +MajorVer=1 +MinorVer=3 -[Chimera] +[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.4*) Gecko/*] +Parent=HP Secure Web Browser +Version=1.4 +MajorVer=1 +MinorVer=4 + +[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.5*) Gecko/*] +Parent=HP Secure Web Browser +Version=1.5 +MajorVer=1 +MinorVer=5 + +[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.6*) Gecko/*] +Parent=HP Secure Web Browser +Version=1.6 +MajorVer=1 +MinorVer=6 + +[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.7*) Gecko/*] +Parent=HP Secure Web Browser +Version=1.7 +MajorVer=1 +MinorVer=7 + +[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.8*) Gecko/*] +Parent=HP Secure Web Browser +Version=1.8 +MajorVer=1 +MinorVer=8 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IBrowse + +[IBrowse] Parent=DefaultProperties -Browser=Chimera +Browser=IBrowse +Platform=Amiga Frames=true -IFrames=true Tables=true Cookies=true -JavaApplets=true JavaScript=true -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Chimera/*] -Parent=Chimera -Platform=MacOSX +[Arexx (compatible; MSIE 6.0; AmigaOS5.0) IBrowse 4.0] +Parent=IBrowse +Version=4.0 +MajorVer=4 +MinorVer=0 -[Mozilla/5.0 Gecko/* Chimera/*] -Parent=Chimera +[IBrowse/1.22 (AmigaOS *)] +Parent=IBrowse +Version=1.22 +MajorVer=1 +MinorVer=22 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dillo +[IBrowse/2.1 (AmigaOS *)] +Parent=IBrowse +Version=2.1 +MajorVer=2 +MinorVer=1 -[Dillo] +[IBrowse/2.2 (AmigaOS *)] +Parent=IBrowse +Version=2.2 +MajorVer=2 +MinorVer=2 + +[IBrowse/2.3 (AmigaOS *)] +Parent=IBrowse +Version=2.2 +MajorVer=2 +MinorVer=3 + +[Mozilla/* (Win98; I) IBrowse/2.1 (AmigaOS 3.1)] +Parent=IBrowse +Version=2.1 +MajorVer=2 +MinorVer=1 + +[Mozilla/* (Win98; I) IBrowse/2.2 (AmigaOS 3.1)] +Parent=IBrowse +Version=2.2 +MajorVer=2 +MinorVer=2 + +[Mozilla/* (Win98; I) IBrowse/2.3 (AmigaOS 3.1)] +Parent=IBrowse +Version=2.3 +MajorVer=2 +MinorVer=3 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iCab + +[iCab] Parent=DefaultProperties -Browser=Dillo -Platform=Linux +Browser=iCab Frames=true -IFrames=true Tables=true Cookies=true -CSS=2 -CssVersion=2 +JavaScript=true +CssVersion=1 supportsCSS=true -[Dillo/0.6*] -Parent=Dillo -Version=0.6 -MajorVer=0 -MinorVer=6 +[iCab/2.7* (Macintosh; ?; 68K*)] +Parent=iCab +Version=2.7 +MajorVer=2 +MinorVer=7 +Platform=Mac68K -[Dillo/0.7*] -Parent=Dillo -Version=0.7 -MajorVer=0 +[iCab/2.7* (Macintosh; ?; PPC*)] +Parent=iCab +Version=2.7 +MajorVer=2 MinorVer=7 +Platform=MacPPC -[Dillo/0.8*] -Parent=Dillo -Version=0.8 -MajorVer=0 +[iCab/2.8* (Macintosh; ?; *Mac OS X*)] +Parent=iCab +Version=2.8 +MajorVer=2 MinorVer=8 +Platform=MacOSX -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Emacs/W3 +[iCab/2.8* (Macintosh; ?; 68K*)] +Parent=iCab +Version=2.8 +MajorVer=2 +MinorVer=8 +Platform=Mac68K + +[iCab/2.8* (Macintosh; ?; PPC)] +Parent=iCab +Version=2.8 +MajorVer=2 +MinorVer=8 +Platform=MacPPC -[Emacs/W3] -Parent=DefaultProperties -Browser=Emacs/W3 -Frames=true -Tables=true -Cookies=true +[iCab/2.9* (Macintosh; ?; *Mac OS X*)] +Parent=iCab +Version=2.9 +MajorVer=2 +MinorVer=9 +Platform=MacOSX -[Emacs/W3/2.* (Unix*] -Parent=Emacs/W3 -Version=2.0 +[iCab/2.9* (Macintosh; ?; 68K*)] +Parent=iCab +Version=2.9 MajorVer=2 -MinorVer=0 -Platform=Unix +MinorVer=9 +Platform=Mac68K -[Emacs/W3/2.* (X11*] -Parent=Emacs/W3 -Version=2.0 +[iCab/2.9* (Macintosh; ?; PPC*)] +Parent=iCab +Version=2.9 MajorVer=2 -MinorVer=0 -Platform=Linux +MinorVer=9 +Platform=MacPPC -[Emacs/W3/3.* (Unix*] -Parent=Emacs/W3 +[iCab/3.0* (Macintosh; ?; *Mac OS X*)] +Parent=iCab Version=3.0 MajorVer=3 MinorVer=0 -Platform=Unix +Platform=MacOSX +CssVersion=2 +supportsCSS=true -[Emacs/W3/3.* (X11*] -Parent=Emacs/W3 +[iCab/3.0* (Macintosh; ?; PPC*)] +Parent=iCab Version=3.0 MajorVer=3 MinorVer=0 -Platform=Linux +Platform=MacPPC +CssVersion=2 +supportsCSS=true -[Emacs/W3/4.* (Unix*] -Parent=Emacs/W3 +[iCab/4.0 (Macintosh; U; *Mac OS X)] +Parent=iCab Version=4.0 MajorVer=4 MinorVer=0 -Platform=Unix +Platform=MacOSX -[Emacs/W3/4.* (X11*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 +[Mozilla/* (compatible; iCab 3.0*; Macintosh; *Mac OS X*)] +Parent=iCab +Version=3.0 +MajorVer=3 MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fantomas - -[fantomas] -Parent=DefaultProperties -Browser=fantomas -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 (cloakBrowser)] -Parent=fantomas -Browser=fantomas cloakBrowser - -[Mozilla/4.0 (fantomas shadowMaker Browser)] -Parent=fantomas -Browser=fantomas shadowMaker Browser +Platform=MacOSX +CssVersion=2 +supportsCSS=true -[Mozilla/4.0 (fantomBrowser)] -Parent=fantomas -Browser=fantomas fantomBrowser +[Mozilla/* (compatible; iCab 3.0*; Macintosh; ?; PPC*)] +Parent=iCab +Version=3.0 +MajorVer=3 +MinorVer=0 +Platform=MacPPC +CssVersion=2 +supportsCSS=true -[Mozilla/4.0 (fantomCrew Browser)] -Parent=fantomas -Browser=fantomas fantomCrew Browser +[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; 68K*)] +Parent=iCab +Version=2.7 +MajorVer=2 +MinorVer=7 +Platform=Mac68K -[Mozilla/4.0 (stealthBrowser)] -Parent=fantomas -Browser=fantomas stealthBrowser +[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; PPC*)] +Parent=iCab +Version=2.7 +MajorVer=2 +MinorVer=7 +Platform=MacPPC -[multiBlocker browser*] -Parent=fantomas -Browser=fantomas multiBlocker browser +[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; *Mac OS X*)] +Parent=iCab +Version=2.8 +MajorVer=2 +MinorVer=8 +Platform=MacOSX -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FrontPage +[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; PPC*)] +Parent=iCab +Version=2.8 +MajorVer=2 +MinorVer=8 +Platform=MacPPC -[FrontPage] -Parent=DefaultProperties -Browser=FrontPage -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true +[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; *Mac OS X*)] +Parent=iCab +Version=2.9 +MajorVer=2 +MinorVer=9 +Platform=MacOSX -[Mozilla/?* (compatible; MS FrontPage*)] -Parent=FrontPage +[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; ?; PPC*)] +Parent=iCab +Version=2.9 +MajorVer=2 +MinorVer=9 +Platform=MacPPC -[MSFrontPage/*] -Parent=FrontPage +[Mozilla/4.5 (compatible; iCab 4.2*; Macintosh; *Mac OS X*)] +Parent=iCab +Version=4.2 +MajorVer=4 +MinorVer=2 +Platform=MacOSX -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galeon +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iSiloX -[Galeon] +[iSiloX] Parent=DefaultProperties -Browser=Galeon +Browser=iSiloX Frames=true IFrames=true Tables=true Cookies=true -JavaApplets=true JavaScript=true -CSS=2 +Crawler=true CssVersion=2 supportsCSS=true -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.0*] -Parent=Galeon -Version=1.0 -MajorVer=1 +[iSiloX/4.0* MacOS] +Parent=iSiloX +Version=4.0 +MajorVer=4 MinorVer=0 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.1*] -Parent=Galeon -Version=1.1 -MajorVer=1 -MinorVer=1 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.2*] -Parent=Galeon -Version=1.2 -MajorVer=1 -MinorVer=2 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.3*] -Parent=Galeon -Version=1.3 -MajorVer=1 -MinorVer=3 -Platform=Linux +Platform=MacPPC -[Mozilla/5.0 (X11; U; Linux*; Debian/*) Gecko/* Galeon/1.0*] -Parent=Galeon -Version=1.0 -MajorVer=1 +[iSiloX/4.0* Windows/32] +Parent=iSiloX +Version=4.0 +MajorVer=4 MinorVer=0 -Platform=Debian +Platform=Win32 +Win32=true -[Mozilla/5.0 (X11; U; Linux*; Debian/*) Gecko/* Galeon/1.1*] -Parent=Galeon -Version=1.1 -MajorVer=1 +[iSiloX/4.1* MacOS] +Parent=iSiloX +Version=4.1 +MajorVer=4 MinorVer=1 -Platform=Debian - -[Mozilla/5.0 (X11; U; Linux*; Debian/*) Gecko/* Galeon/1.2*] -Parent=Galeon -Version=1.2 -MajorVer=1 -MinorVer=2 -Platform=Debian - -[Mozilla/5.0 (X11; U; Linux*; Debian/*) Gecko/* Galeon/1.3*] -Parent=Galeon -Version=1.3 -MajorVer=1 -MinorVer=3 -Platform=Debian - -[Mozilla/5.0 Galeon/1.0* (X11; Linux*)*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux +Platform=MacPPC -[Mozilla/5.0 Galeon/1.1* (X11; Linux*)*] -Parent=Galeon -Version=1.1 -MajorVer=1 +[iSiloX/4.1* Windows/32] +Parent=iSiloX +Version=4.1 +MajorVer=4 MinorVer=1 -Platform=Linux +Platform=Win32 +Win32=true -[Mozilla/5.0 Galeon/1.2* (X11; Linux*)*] -Parent=Galeon -Version=1.2 -MajorVer=1 +[iSiloX/4.2* MacOS] +Parent=iSiloX +Version=4.2 +MajorVer=4 MinorVer=2 -Platform=Linux +Platform=MacPPC + +[iSiloX/4.2* Windows/32] +Parent=iSiloX +Version=4.2 +MajorVer=4 +MinorVer=2 +Platform=Win32 +Win32=true -[Mozilla/5.0 Galeon/1.3* (X11; Linux*)*] -Parent=Galeon -Version=1.3 -MajorVer=1 +[iSiloX/4.3* MacOS] +Parent=iSiloX +Version=4.3 +MajorVer=4 +MinorVer=4 +Platform=MacOSX + +[iSiloX/4.3* Windows/32] +Parent=iSiloX +Version=4.3 +MajorVer=4 MinorVer=3 -Platform=Linux +Platform=Win32 +Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HP Secure Web Browser +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycoris Desktop/LX -[HP Secure Web Browser] +[Lycoris Desktop/LX] Parent=DefaultProperties -Browser=HP Secure Web Browser -Platform=OpenVMS +Browser=Lycoris Desktop/LX Frames=true IFrames=true Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.0*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.0 -MajorVer=1 -MinorVer=0 +Crawler=true -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.1*) Gecko/*] -Parent=HP Secure Web Browser +[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*: Desktop/LX Amethyst) Gecko/*] +Parent=Lycoris Desktop/LX Version=1.1 MajorVer=1 MinorVer=1 +Platform=Linux -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.2*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.3*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.3 +[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*; Desktop/LX Amethyst) Gecko/*] +Parent=Lycoris Desktop/LX +Version=1.0 MajorVer=1 -MinorVer=3 +MinorVer=0 +Platform=Linux -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.4*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.4 -MajorVer=1 -MinorVer=4 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mosaic -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.5*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.5 -MajorVer=1 -MinorVer=5 +[Mosaic] +Parent=DefaultProperties +Browser=Mosaic +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.6*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.6 -MajorVer=1 -MinorVer=6 +[Mozilla/4.0 (VMS_Mosaic)] +Parent=Mosaic +Platform=OpenVMS -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.7*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.7 -MajorVer=1 +[VMS_Mosaic/3.7*] +Parent=Mosaic +Version=3.7 +MajorVer=3 MinorVer=7 +Platform=OpenVMS -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.8*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.8 -MajorVer=1 +[VMS_Mosaic/3.8*] +Parent=Mosaic +Version=3.8 +MajorVer=3 MinorVer=8 +Platform=OpenVMS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IBrowse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetPositive -[IBrowse] +[NetPositive] Parent=DefaultProperties -Browser=IBrowse -Platform=Amiga +Browser=NetPositive +Platform=BeOS Frames=true +IFrames=true Tables=true Cookies=true +JavaApplets=true JavaScript=true -[Arexx (compatible; MSIE 6.0; AmigaOS5.0) IBrowse 4.0] -Parent=IBrowse -Version=4.0 -MajorVer=4 -MinorVer=0 - -[IBrowse/1.22 (AmigaOS *)] -Parent=IBrowse -Version=1.22 -MajorVer=1 -MinorVer=22 - -[IBrowse/2.1 (AmigaOS *)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[IBrowse/2.2 (AmigaOS *)] -Parent=IBrowse +[*NetPositive/2.2*] +Parent=NetPositive Version=2.2 MajorVer=2 MinorVer=2 -[IBrowse/2.3 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=3 - -[Mozilla/* (Win98; I) IBrowse/2.1 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/* (Win98; I) IBrowse/2.2 (AmigaOS 3.1)] -Parent=IBrowse +[*NetPositive/2.2*BeOS*] +Parent=NetPositive Version=2.2 MajorVer=2 MinorVer=2 -[Mozilla/* (Win98; I) IBrowse/2.3 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.3 -MajorVer=2 -MinorVer=3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iCab +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OmniWeb -[iCab] +[OmniWeb] Parent=DefaultProperties -Browser=iCab +Browser=OmniWeb +Platform=MacOSX Frames=true Tables=true Cookies=true +JavaApplets=true JavaScript=true -CSS=1 -CssVersion=1 +isMobileDevice=true +CssVersion=2 supportsCSS=true -[iCab/2.7* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[iCab/2.7* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[iCab/2.8* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 +[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v4*] +Parent=OmniWeb +Version=4.5 +MajorVer=4 +MinorVer=5 Platform=MacOSX -[iCab/2.8* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=Mac68K - -[iCab/2.8* (Macintosh; ?; PPC)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[iCab/2.9* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 +[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v5*] +Parent=OmniWeb +Version=5. +MajorVer=5 +MinorVer=0 Platform=MacOSX -[iCab/2.9* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=Mac68K - -[iCab/2.9* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[iCab/3.0* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 +[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v6*] +Parent=OmniWeb +Version=6.0 +MajorVer=6 MinorVer=0 Platform=MacOSX -CSS=2 -CssVersion=2 -supportsCSS=true -[iCab/3.0* (Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 +[Mozilla/* (Macintosh; ?; PPC) OmniWeb/4*] +Parent=OmniWeb +Version=4.0 +MajorVer=4 MinorVer=0 Platform=MacPPC -CSS=2 -CssVersion=2 -supportsCSS=true -[Mozilla/* (compatible; iCab 3.0*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 +[Mozilla/* (Macintosh; ?; PPC) OmniWeb/5*] +Parent=OmniWeb +Version=5.0 +MajorVer=5 MinorVer=0 Platform=MacOSX -CSS=2 -CssVersion=2 -supportsCSS=true -[Mozilla/* (compatible; iCab 3.0*; Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 +[Mozilla/* (Macintosh; ?; PPC) OmniWeb/6*] +Parent=OmniWeb +Version=6.0 +MajorVer=6 MinorVer=0 Platform=MacPPC -CSS=2 -CssVersion=2 -supportsCSS=true -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K +[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] +Parent=OmniWeb +Version=5.1 +MajorVer=5 +MinorVer=1 -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC +[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] +Parent=OmniWeb +Version=5.1 +MajorVer=5 +MinorVer=1 -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX +[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] +Parent=OmniWeb +Version=5.5 +MajorVer=5 +MinorVer=5 -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC +[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] +Parent=OmniWeb +Version=5.5 +MajorVer=5 +MinorVer=5 -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX +[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] +Parent=OmniWeb +Version=5.6 +MajorVer=5 +MinorVer=6 -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC +[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] +Parent=OmniWeb +Version=5.6 +MajorVer=5 +MinorVer=6 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iSiloX +[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496] +Parent=OmniWeb +Version=4.5 +MajorVer=4 +MinorVer=5 -[iSiloX] +[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.36 ] +Parent=OmniWeb +Version=5.0 +MajorVer=5 +MinorVer=0 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shiira + +[Shiira] Parent=DefaultProperties -Browser=iSiloX +Browser=Shiira +Platform=MacOSX Frames=true IFrames=true Tables=true Cookies=true +BackgroundSounds=true +JavaApplets=true JavaScript=true -Crawler=true -CSS=2 CssVersion=2 supportsCSS=true -[iSiloX/4.0* MacOS] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC +[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/0.9*] +Parent=Shiira +Version=0.9 +MajorVer=0 +MinorVer=9 -[iSiloX/4.0* Windows/32] -Parent=iSiloX -Version=4.0 -MajorVer=4 +[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.0*] +Parent=Shiira +Version=1.0 +MajorVer=1 MinorVer=0 -Platform=Win32 -Win32=true -[iSiloX/4.1* MacOS] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=MacPPC - -[iSiloX/4.1* Windows/32] -Parent=iSiloX -Version=4.1 -MajorVer=4 +[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.1*] +Parent=Shiira +Version=1.1 +MajorVer=1 MinorVer=1 -Platform=Win32 -Win32=true -[iSiloX/4.2* MacOS] -Parent=iSiloX -Version=4.2 -MajorVer=4 +[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.2*] +Parent=Shiira +Version=1.2 +MajorVer=1 MinorVer=2 -Platform=MacPPC -[iSiloX/4.2* Windows/32] -Parent=iSiloX -Version=4.2 -MajorVer=4 +[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.1*] +Parent=Shiira +Version=2.1 +MajorVer=2 +MinorVer=1 + +[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.2*] +Parent=Shiira +Version=2.2 +MajorVer=2 MinorVer=2 -Platform=Win32 -Win32=true -[iSiloX/4.3* MacOS] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=4 -Platform=MacOSX +[Windows Maker] +Parent=DefaultProperties +Browser=WMaker +Platform=Linux +Frames=true +IFrames=true +Tables=true +Cookies=true +VBScript=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[iSiloX/4.3* Windows/32] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=Win32 -Win32=true +[WMaker*] +Parent=Windows Maker -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.0 -[K-Meleon] +[K-Meleon 1.0] Parent=DefaultProperties Browser=K-Meleon +Version=1.0 +MajorVer=1 Win32=true Frames=true IFrames=true Tables=true Cookies=true +JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/0.7*] -Parent=K-Meleon -Version=0.7 -MajorVer=0 -MinorVer=7 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/0.8*] -Parent=K-Meleon -Version=0.8 -MajorVer=0 -MinorVer=8 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/0.9*] -Parent=K-Meleon -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win95 -Win32=true - [Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon +Parent=K-Meleon 1.0 Version=1.0 MajorVer=1 MinorVer=0 Platform=Win95 Win32=true -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon 0.7*] -Parent=K-Meleon -Version=0.7 -MajorVer=0 -MinorVer=7 +[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.0*] +Parent=K-Meleon 1.0 +Version=1.0 +MajorVer=1 +MinorVer=0 Platform=Win98 Win32=true -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/0.8*] -Parent=K-Meleon -Version=0.8 -MajorVer=0 -MinorVer=8 -Platform=Win95 +[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.0*] +Parent=K-Meleon 1.0 +Version=1.0 +MajorVer=1 +MinorVer=0 +Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/0.9*] -Parent=K-Meleon -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win95 +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.0*] +Parent=K-Meleon 1.0 +Version=1.0 +MajorVer=1 +MinorVer=0 +Platform=WinXP Win32=true -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon +[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.0*] +Parent=K-Meleon 1.0 Version=1.0 MajorVer=1 MinorVer=0 -Platform=Win98 +Platform=Win2003 Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?0.7*] -Parent=K-Meleon -Version=0.7 -MajorVer=0 -MinorVer=7 -Platform=Win2000 +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.0*] +Parent=K-Meleon 1.0 +Version=1.0 +MajorVer=1 +MinorVer=0 +Platform=WinNT Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?0.8*] -Parent=K-Meleon -Version=0.8 -MajorVer=0 -MinorVer=8 -Platform=Win2000 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.1 + +[K-Meleon 1.1] +Parent=DefaultProperties +Browser=K-Meleon +Version=1.1 +MajorVer=1 +MinorVer=1 +Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true + +[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.1*] +Parent=K-Meleon 1.1 +Version=1.0 +MajorVer=1 +MinorVer=0 +Platform=Win95 Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?0.9*] -Parent=K-Meleon -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win2000 +[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.1*] +Parent=K-Meleon 1.1 +Version=1.0 +MajorVer=1 +MinorVer=0 +Platform=Win98 Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.0*] -Parent=K-Meleon +[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.1*] +Parent=K-Meleon 1.1 Version=1.0 MajorVer=1 MinorVer=0 Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/0.7*] -Parent=K-Meleon -Version=0.7 -MajorVer=0 -MinorVer=7 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/0.8*] -Parent=K-Meleon -Version=0.8 -MajorVer=0 -MinorVer=8 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/0.9*] -Parent=K-Meleon -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.1*] +Parent=K-Meleon 1.1 Version=1.0 MajorVer=1 MinorVer=0 Platform=WinXP Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/0.7*] -Parent=K-Meleon -Version=0.7 -MajorVer=0 -MinorVer=7 +[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.1*] +Parent=K-Meleon 1.1 +Version=1.0 +MajorVer=1 +MinorVer=0 Platform=Win2003 Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/0.8*] -Parent=K-Meleon -Version=0.8 -MajorVer=0 -MinorVer=8 -Platform=Win2003 +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.1*] +Parent=K-Meleon 1.1 +Version=1.0 +MajorVer=1 +MinorVer=0 +Platform=WinNT Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/0.9*] -Parent=K-Meleon -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win2003 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.5 + +[K-Meleon 1.5] +Parent=DefaultProperties +Browser=K-Meleon +Version=1.5 +MajorVer=1 +MinorVer=5 Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon +[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.5*] +Parent=K-Meleon 1.5 Version=1.0 MajorVer=1 MinorVer=0 -Platform=Win2003 +Platform=Win95 Win32=true -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/0.7*] -Parent=K-Meleon -Version=0.7 -MajorVer=0 -MinorVer=7 -Platform=WinNT +[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.5*] +Parent=K-Meleon 1.5 +Version=1.0 +MajorVer=1 +MinorVer=0 +Platform=Win98 Win32=true -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/0.8*] -Parent=K-Meleon -Version=0.8 -MajorVer=0 -MinorVer=8 -Platform=WinNT +[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.5*] +Parent=K-Meleon 1.5 +Version=1.0 +MajorVer=1 +MinorVer=0 +Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/0.9*] -Parent=K-Meleon -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=WinNT +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] +Parent=K-Meleon 1.5 +Version=1.0 +MajorVer=1 +MinorVer=0 +Platform=WinXP Win32=true -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon +[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.5*] +Parent=K-Meleon 1.5 Version=1.0 MajorVer=1 MinorVer=0 -Platform=WinNT +Platform=Win2003 Win32=true -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* K-Meleon?0.7*] -Parent=K-Meleon -Version=0.7 -MajorVer=0 -MinorVer=7 -Platform=Linux -Win32=false - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* K-Meleon?0.8*] -Parent=K-Meleon -Version=0.8 -MajorVer=0 -MinorVer=8 -Platform=Linux -Win32=false +[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] +Parent=K-Meleon 1.5 +Platform=WinVista -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* K-Meleon?0.9*] -Parent=K-Meleon -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Linux -Win32=false +[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] +Parent=K-Meleon 1.5 +Platform=Win7 -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* K-Meleon?1.0*] -Parent=K-Meleon +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] +Parent=K-Meleon 1.5 Version=1.0 MajorVer=1 MinorVer=0 -Platform=Linux -Win32=false +Platform=WinNT +Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 3.0 -[Konqueror] +[Konqueror 3.0] Parent=DefaultProperties Browser=Konqueror Platform=Linux @@ -9276,23 +8590,18 @@ IFrames=true Tables=true Cookies=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[*Konqueror/2.*] -Parent=Konqueror -IFrames=false - [*Konqueror/3.0*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.0 MajorVer=3 MinorVer=0 IFrames=false [*Konqueror/3.0*FreeBSD*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.0 MajorVer=3 MinorVer=0 @@ -9300,7 +8609,7 @@ Platform=FreeBSD IFrames=false [*Konqueror/3.0*Linux*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.0 MajorVer=3 MinorVer=0 @@ -9308,404 +8617,219 @@ Platform=Linux IFrames=false [*Konqueror/3.1*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.1 MajorVer=3 MinorVer=1 [*Konqueror/3.1*FreeBSD*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.1 MajorVer=3 MinorVer=1 Platform=FreeBSD [*Konqueror/3.1*Linux*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.1 MajorVer=3 MinorVer=1 [*Konqueror/3.2*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.2 MajorVer=3 MinorVer=2 [*Konqueror/3.2*FreeBSD*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.2 MajorVer=3 MinorVer=2 Platform=FreeBSD [*Konqueror/3.2*Linux*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.2 MajorVer=3 MinorVer=2 Platform=Linux [*Konqueror/3.3*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.3 MajorVer=3 MinorVer=3 [*Konqueror/3.3*FreeBSD*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.3 MajorVer=3 MinorVer=3 Platform=FreeBSD [*Konqueror/3.3*Linux*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.3 MajorVer=3 MinorVer=3 Platform=Linux [*Konqueror/3.3*OpenBSD*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.3 MajorVer=3 MinorVer=3 Platform=OpenBSD [*Konqueror/3.4*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.4 MajorVer=3 MinorVer=4 [*Konqueror/3.4*FreeBSD*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.4 MajorVer=3 MinorVer=4 Platform=FreeBSD [*Konqueror/3.4*Linux*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.4 MajorVer=3 MinorVer=4 Platform=Linux [*Konqueror/3.4*OpenBSD*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.4 MajorVer=3 MinorVer=4 Platform=OpenBSD [*Konqueror/3.5*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.5 MajorVer=3 MinorVer=5 [*Konqueror/3.5*FreeBSD*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.5 MajorVer=3 MinorVer=5 Platform=FreeBSD [*Konqueror/3.5*Linux*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.5 MajorVer=3 MinorVer=5 Platform=Linux [*Konqueror/3.5*OpenBSD*] -Parent=Konqueror +Parent=Konqueror 3.0 Version=3.5 MajorVer=3 MinorVer=5 Platform=OpenBSD -[Konqueror*] -Parent=Konqueror -IFrames=false - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycoris Desktop/LX - -[Lycoris Desktop/LX] -Parent=DefaultProperties -Browser=Lycoris Desktop/LX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -Crawler=true - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*: Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.1 -MajorVer=1 -MinorVer=1 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*; Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/4.0 (VMS_Mosaic)] -Parent=Mosaic -Platform=OpenVMS - -[VMS_Mosaic/3.7*] -Parent=Mosaic -Version=3.7 -MajorVer=3 -MinorVer=7 -Platform=OpenVMS - -[VMS_Mosaic/3.8*] -Parent=Mosaic -Version=3.8 -MajorVer=3 -MinorVer=8 -Platform=OpenVMS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetPositive +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.0 -[NetPositive] +[Konqueror 4.0] Parent=DefaultProperties -Browser=NetPositive -Platform=BeOS +Browser=Konqueror +Version=4.0 +MajorVer=4 Frames=true IFrames=true Tables=true Cookies=true -JavaApplets=true -JavaScript=true - -[*NetPositive/2.2*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -[*NetPositive/2.2*BeOS*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OmniWeb - -[OmniWeb] -Parent=DefaultProperties -Browser=OmniWeb -Frames=true -Tables=true -Cookies=true -JavaApplets=true JavaScript=true -WAP=true -isMobileDevice=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/* (compatible; MSIE *; Mac_PowerPC) OmniWeb/4.0*] -Parent=OmniWeb -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE *; Mac_PowerPC) OmniWeb/4.1*] -Parent=OmniWeb -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE *; Mac_PowerPC) OmniWeb/4.2*] -Parent=OmniWeb -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE *; Mac_PowerPC) OmniWeb/4.3*] -Parent=OmniWeb -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE *; Mac_PowerPC) OmniWeb/4.4*] -Parent=OmniWeb -Version=4.4 -MajorVer=4 -MinorVer=4 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE *; Windows *) OmniWeb/4.0*] -Parent=OmniWeb -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Win32 -Win32=true - -[Mozilla/* (compatible; MSIE *; Windows *) OmniWeb/4.1*] -Parent=OmniWeb -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=Win32 -Win32=true +[Mozilla/5.0 (compatible; Konqueror/4.0*; Debian) KHTML/4.* (like Gecko)] +Parent=Konqueror 4.0 +Platform=Debian -[Mozilla/* (compatible; MSIE *; Windows *) OmniWeb/4.2*] -Parent=OmniWeb -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=Win32 -Win32=true +[Mozilla/5.0 (compatible; Konqueror/4.0.*; *Linux) KHTML/4.* (like Gecko)] +Parent=Konqueror 4.0 +Platform=Linux -[Mozilla/* (compatible; MSIE *; Windows *) OmniWeb/4.3*] -Parent=OmniWeb -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=Win32 -Win32=true +[Mozilla/5.0 (compatible; Konqueror/4.0.*; FreeBSD) KHTML/4.* (like Gecko)] +Parent=Konqueror 4.0 +Platform=FreeBSD -[Mozilla/* (compatible; MSIE *; Windows *) OmniWeb/4.4*] -Parent=OmniWeb -Version=4.4 -MajorVer=4 -MinorVer=4 -Platform=Win32 -Win32=true +[Mozilla/5.0 (compatible; Konqueror/4.0.*; NetBSD) KHTML/4.* (like Gecko)] +Parent=Konqueror 4.0 +Platform=NetBSD -[Mozilla/* (compatible; OmniWeb/4.0*; Mac_PowerPC)] -Parent=OmniWeb -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.1 -[Mozilla/* (compatible; OmniWeb/4.1*; Mac_PowerPC)] -Parent=OmniWeb +[Konqueror 4.1] +Parent=DefaultProperties +Browser=Konqueror Version=4.1 MajorVer=4 MinorVer=1 -Platform=MacPPC +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[Mozilla/* (compatible; OmniWeb/4.2*; Mac_PowerPC)] -Parent=OmniWeb -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacPPC +[Mozilla/5.0 (compatible; Konqueror/4.1*; *Linux*) KHTML/4.* (like Gecko)*] +Parent=Konqueror 4.1 +Platform=Linux -[Mozilla/* (compatible; OmniWeb/4.3*; Mac_PowerPC)] -Parent=OmniWeb -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=MacPPC +[Mozilla/5.0 (compatible; Konqueror/4.1*; Debian) KHTML/4.* (like Gecko)*] +Parent=Konqueror 4.1 +Platform=Debian -[Mozilla/* (compatible; OmniWeb/4.4*; Mac_PowerPC)] -Parent=OmniWeb -Version=4.4 -MajorVer=4 -MinorVer=4 -Platform=MacPPC +[Mozilla/5.0 (compatible; Konqueror/4.1*; FreeBSD) KHTML/4.* (like Gecko)*] +Parent=Konqueror 4.1 +Platform=FreeBSD -[Mozilla/* (Macintosh; I; PPC) OmniWeb/4.0*] -Parent=OmniWeb -Version=4.0 -Platform=MacPPC +[Mozilla/5.0 (compatible; Konqueror/4.1*; NetBSD) KHTML/4.* (like Gecko)*] +Parent=Konqueror 4.1 +Platform=NetBSD -[Mozilla/* (Macintosh; I; PPC) OmniWeb/4.1*] -Parent=OmniWeb -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=MacPPC +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.2 -[Mozilla/* (Macintosh; I; PPC) OmniWeb/4.2*] -Parent=OmniWeb +[Konqueror 4.2] +Parent=DefaultProperties +Browser=Konqueror Version=4.2 MajorVer=4 MinorVer=2 -Platform=MacPPC - -[Mozilla/* (Macintosh; I; PPC) OmniWeb/4.3*] -Parent=OmniWeb -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=MacPPC - -[Mozilla/* (Macintosh; I; PPC) OmniWeb/4.4*] -Parent=OmniWeb -Version=4.4 -MajorVer=4 -MinorVer=4 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.*] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 -Platform=MacOSX +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/420* (KHTML, like Gecko, Safari*) OmniWeb/v5*] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 -Platform=MacOSX +[Mozilla/5.0 (compatible; Konqueror/4.2*; *Linux*) KHTML/4.* (like Gecko)*] +Parent=Konqueror 4.2 +Platform=Linux -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/420* (KHTML, like Gecko, Safari/420) OmniWeb/v6*] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 -Platform=MacOSX +[Mozilla/5.0 (compatible; Konqueror/4.2*; Debian) KHTML/4.* (like Gecko)*] +Parent=Konqueror 4.2 +Platform=Debian -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496*] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 -Platform=MacOSX +[Mozilla/5.0 (compatible; Konqueror/4.2*; FreeBSD) KHTML/4.* (like Gecko)*] +Parent=Konqueror 4.2 +Platform=FreeBSD -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.*] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 -Platform=MacOSX +[Mozilla/5.0 (compatible; Konqueror/4.2*; NetBSD) KHTML/4.* (like Gecko)*] +Parent=Konqueror 4.2 +Platform=NetBSD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari @@ -9720,7 +8844,6 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true ecmascriptversion=1.3 @@ -9784,11 +8907,14 @@ Version=1.0 MajorVer=1 MinorVer=0 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.0 -[SeaMonkey] +[Safari 3.0] Parent=DefaultProperties -Browser=SeaMonkey +Browser=Safari +Version=3.0 +MajorVer=3 +Platform=MacOSX Frames=true IFrames=true Tables=true @@ -9796,61 +8922,37 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/5.0 (Windows; U; Win98; *) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.0; *) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.0* Safari/*] +Parent=Safari 3.0 +Platform=MacOSX -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey -Version=1.0 -MajorVer=1 -MinorVer=0 +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] +Parent=Safari 3.0 Platform=WinXP -Win32=true -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey -Version=1.0 -MajorVer=1 -MinorVer=0 +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.0* Safari/*] +Parent=Safari 3.0 Platform=Win2003 -Win32=true -[Mozilla/5.0 (X11; U; FreeBSD*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=FreeBSD +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.0* Safari/*] +Parent=Safari 3.0 +Platform=WinVista -[Mozilla/5.0 (X11; U; Linux*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] +Parent=Safari 3.0 +Platform=Win7 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shiira +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.1 -[Shiira] +[Safari 3.1] Parent=DefaultProperties -Browser=Shiira +Browser=Safari +Version=3.1 +MajorVer=3 +MinorVer=1 Platform=MacOSX Frames=true IFrames=true @@ -9859,688 +8961,705 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/0.9*] -Parent=Shiira -Version=0.9 -MajorVer=0 -MinorVer=9 +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*] +Parent=Safari 3.1 +Platform=MacOSX -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.0*] -Parent=Shiira -Version=1.0 -MajorVer=1 -MinorVer=0 +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] +Parent=Safari 3.1 +Platform=WinXP -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.1*] -Parent=Shiira -Version=1.1 -MajorVer=1 -MinorVer=1 +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.1* Safari/*] +Parent=Safari 3.1 +Platform=Win2003 -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.2*] -Parent=Shiira -Version=1.2 -MajorVer=1 +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.1* Safari/*] +Parent=Safari 3.1 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] +Parent=Safari 3.1 +Platform=Win7 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.2 + +[Safari 3.2] +Parent=DefaultProperties +Browser=Safari +Version=3.2 +MajorVer=3 MinorVer=2 +Frames=true +IFrames=true +Tables=true +Cookies=true +BackgroundSounds=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true + +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.2* Safari/*] +Parent=Safari 3.2 +Platform=MacOSX + +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] +Parent=Safari 3.2 +Platform=WinXP + +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.2* Safari/*] +Parent=Safari 3.2 +Platform=Win2003 + +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.2* Safari/*] +Parent=Safari 3.2 +Platform=WinVista -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 4.0 +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] +Parent=Safari 3.2 +Platform=Win7 -[Opera 4.0] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 4.0 + +[Safari 4.0] Parent=DefaultProperties -Browser=Opera -Version=4 +Browser=Safari +Version=4.0 MajorVer=4 +Beta=true Frames=true +IFrames=true Tables=true +Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=1 -CssVersion=1 +CssVersion=3 supportsCSS=true -[Mozilla/3.0 (Linux*; U) Opera 4.*] -Parent=Opera 4.0 -Platform=Linux +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4.0* Safari/*] +Parent=Safari 4.0 +Platform=MacOSX -[Mozilla/3.0 (Mac_PowerPC; U) Opera 4.*] -Parent=Opera 4.0 -Platform=MacPPC +[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4 Public Beta Safari/*] +Parent=Safari 4.0 -[Mozilla/3.0 (Windows 2000; U) Opera 4.*] -Parent=Opera 4.0 -Platform=Win2000 -Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] +Parent=Safari 4.0 +Platform=WinXP -[Mozilla/3.0 (Windows 95; U) Opera 4.*] -Parent=Opera 4.0 -Platform=Win95 -Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] +Parent=Safari 4.0 +Platform=WinXP -[Mozilla/3.0 (Windows 98; U) Opera 4.*] -Parent=Opera 4.0 -Platform=Win98 -Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] +Parent=Safari 4.0 +Platform=Win2003 -[Mozilla/3.0 (Windows ME; U) Opera 4.*] -Parent=Opera 4.0 -Platform=WinME -Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4.0* Safari/*] +Parent=Safari 4.0 +Platform=Win2003 -[Mozilla/3.0 (Windows NT 4.0; U) Opera 4.*] -Parent=Opera 4.0 -Platform=WinNT -Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] +Parent=Safari 4.0 +Platform=WinVista -[Mozilla/3.0 (Windows XP; U) Opera 4.*] -Parent=Opera 4.0 -Platform=WinXP -Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] +Parent=Safari 4.0 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] +Parent=Safari 4.0 +Platform=Win7 + +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] +Parent=Safari 4.0 +Platform=Win7 -[Mozilla/4.0 (compatible; MSIE 5.0; Linux*) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] +Parent=Safari 4.0 +Platform=Win7 + +[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] +Parent=Safari 4.0 +Platform=Win7 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 10.0 + +[Opera 10.0] +Parent=DefaultProperties +Browser=Opera +Version=10.0 +MajorVer=10 +Alpha=true +Frames=true +IFrames=true +Tables=true +Cookies=true +BackgroundSounds=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true + +[Mozilla/* (compatible; MSIE*; Linux*) Opera 10.0*] +Parent=Opera 10.0 Platform=Linux -[Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 10.0*] +Parent=Opera 10.0 +Platform=MacOSX + +[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 10.0*] +Parent=Opera 10.0 Platform=MacPPC -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 10.0*] +Parent=Opera 10.0 Platform=Win2000 Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 95) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 10.0*] +Parent=Opera 10.0 Platform=Win95 Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 10.0*] +Parent=Opera 10.0 Platform=Win98 Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows ME) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 10.0*] +Parent=Opera 10.0 +Platform=WinCE +Win32=true + +[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 10.0*] +Parent=Opera 10.0 Platform=WinME Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 4.0) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 10.0*] +Parent=Opera 10.0 Platform=WinNT Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera 4.*] -Parent=Opera 4.0 -Platform=WinXP +[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 10.0*] +Parent=Opera 10.0 +Platform=Win2000 +Win32=true + +[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 10.0*] +Parent=Opera 10.0 +Platform=WinXP +Win32=true + +[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 10.0*] +Parent=Opera 10.0 +Platform=Win2003 +Win32=true + +[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 10.0*] +Parent=Opera 10.0 +Platform=WinVista Win32=true -[Mozilla/4.73 (Windows 98; U) Opera 4.*] -Parent=Opera 4.0 -MinorVer=02 +[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 10.0*] +Parent=Opera 10.0 +Platform=Win7 + +[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 10.0*] +Parent=Opera 10.0 +Platform=WinXP Win32=true -[Mozilla/4.76 (Macintosh;US;PPC) Opera 4.*] -Parent=Opera 4.0 -Platform=MacPPC +[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 10.0*] +Parent=Opera 10.0 +Platform=FreeBSD -[Mozilla/4.78 (Linux*; U) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 10.0*] +Parent=Opera 10.0 Platform=Linux -[Mozilla/4.78 (Mac_PowerPC; U) Opera 4.*] -Parent=Opera 4.0 -Platform=MacPPC +[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 10.0*] +Parent=Opera 10.0 +Platform=SunOS -[Mozilla/4.78 (Windows 2000; U) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 10.0*] +Parent=Opera 10.0 +Platform=MacOSX + +[Mozilla/* (Windows 2000;*) Opera 10.0*] +Parent=Opera 10.0 Platform=Win2000 Win32=true -[Mozilla/4.78 (Windows 95; U) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (Windows 95;*) Opera 10.0*] +Parent=Opera 10.0 Platform=Win95 Win32=true -[Mozilla/4.78 (Windows 98; U) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (Windows 98;*) Opera 10.0*] +Parent=Opera 10.0 Platform=Win98 Win32=true -[Mozilla/4.78 (Windows ME; U) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (Windows ME;*) Opera 10.0*] +Parent=Opera 10.0 Platform=WinME Win32=true -[Mozilla/4.78 (Windows NT 4.0; U) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (Windows NT 4.0;*) Opera 10.0*] +Parent=Opera 10.0 Platform=WinNT Win32=true -[Mozilla/4.78 (Windows XP; U) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (Windows NT 5.0;*) Opera 10.0*] +Parent=Opera 10.0 +Platform=Win2000 +Win32=true + +[Mozilla/* (Windows NT 5.1;*) Opera 10.0*] +Parent=Opera 10.0 Platform=WinXP Win32=true -[Mozilla/5.0 (Linux*; U) Opera 4.*] -Parent=Opera 4.0 +[Mozilla/* (Windows NT 5.2;*) Opera 10.0*] +Parent=Opera 10.0 +Platform=Win2003 +Win32=true + +[Mozilla/* (Windows NT 6.0;*) Opera 10.0*] +Parent=Opera 10.0 +Platform=WinVista + +[Mozilla/* (Windows NT 6.1;*) Opera 10.0*] +Parent=Opera 10.0 +Platform=Win7 + +[Mozilla/* (X11; Linux*) Opera 10.0*] +Parent=Opera 10.0 Platform=Linux -[Mozilla/5.0 (Mac_PowerPC; U) Opera 4.*] -Parent=Opera 4.0 -Platform=MacPPC +[Opera/10.0* (Linux*)*] +Parent=Opera 10.0 +Platform=Linux -[Mozilla/5.0 (Windows 2000; U) Opera 4.*] -Parent=Opera 4.0 -Platform=Win2000 -Win32=true +[Opera/10.0* (Macintosh; *Mac OS X;*)*] +Parent=Opera 10.0 +Platform=MacOSX -[Mozilla/5.0 (Windows 95; U) Opera 4.*] -Parent=Opera 4.0 +[Opera/10.0* (Windows 95*)*] +Parent=Opera 10.0 Platform=Win95 Win32=true -[Mozilla/5.0 (Windows 98; U) Opera 4.*] -Parent=Opera 4.0 +[Opera/10.0* (Windows 98*)*] +Parent=Opera 10.0 Platform=Win98 Win32=true -[Mozilla/5.0 (Windows ME; U) Opera 4.*] -Parent=Opera 4.0 -Platform=WinME +[Opera/10.0* (Windows CE*)*] +Parent=Opera 10.0 +Platform=WinCE Win32=true -[Mozilla/5.0 (Windows NT 4.0; U) Opera 4.*] -Parent=Opera 4.0 -Platform=WinNT +[Opera/10.0* (Windows ME*)*] +Parent=Opera 10.0 +Platform=WinME Win32=true -[Mozilla/5.0 (Windows XP; U) Opera 4.*] -Parent=Opera 4.0 -Platform=WinXP +[Opera/10.0* (Windows NT 4.0*)*] +Parent=Opera 10.0 +Platform=WinNT Win32=true -[Opera/4.* (Linux*; U)*] -Parent=Opera 4.0 -Platform=Linux - -[Opera/4.* (Mac_PowerPC; U)*] -Parent=Opera 4.0 -Platform=MacPPC - -[Opera/4.* (Windows 2000; U)*] -Parent=Opera 4.0 +[Opera/10.0* (Windows NT 5.0*)*] +Parent=Opera 10.0 Platform=Win2000 Win32=true -[Opera/4.* (Windows 95; U)*] -Parent=Opera 4.0 -Platform=Win95 +[Opera/10.0* (Windows NT 5.1*)*] +Parent=Opera 10.0 +Platform=WinXP Win32=true -[Opera/4.* (Windows 98; U)*] -Parent=Opera 4.0 -Platform=Win98 +[Opera/10.0* (Windows NT 5.2*)*] +Parent=Opera 10.0 +Platform=Win2003 Win32=true -[Opera/4.* (Windows ME; U)*] -Parent=Opera 4.0 -Platform=WinME +[Opera/10.0* (Windows NT 6.0*)*] +Parent=Opera 10.0 +Platform=WinVista Win32=true -[Opera/4.* (Windows NT 4.0; U)*] -Parent=Opera 4.0 -Platform=WinNT -Win32=true +[Opera/10.0* (Windows NT 6.1*)*] +Parent=Opera 10.0 +Platform=Win7 -[Opera/4.* (Windows XP; U)*] -Parent=Opera 4.0 +[Opera/10.0* (Windows XP*)*] +Parent=Opera 10.0 Platform=WinXP Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 5.0 +[Opera/10.0* (X11; FreeBSD*)*] +Parent=Opera 10.0 +Platform=FreeBSD + +[Opera/10.0* (X11; Linux*)*] +Parent=Opera 10.0 +Platform=Linux + +[Opera/10.0* (X11; SunOS*)*] +Parent=Opera 10.0 +Platform=SunOS + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.0 -[Opera 5.0] +[Opera 7.0] Parent=DefaultProperties Browser=Opera -Version=5.0 -MajorVer=5 +Version=7.0 +MajorVer=7 Frames=true +IFrames=true Tables=true Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=1 -CssVersion=1 +CssVersion=2 supportsCSS=true -[Mozilla/3.0 (Linux*; ?) Opera 5.0*] -Parent=Opera 5.0 -Platform=Linux - -[Mozilla/3.0 (Mac_PowerPC; ?) Opera 5.0*] -Parent=Opera 5.0 -Platform=MacPPC - -[Mozilla/3.0 (Windows 2000; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/3.0 (Windows 2000; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=Win2000 Win32=true -[Mozilla/3.0 (Windows 95; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/3.0 (Windows 95; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=Win95 Win32=true -[Mozilla/3.0 (Windows 98; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/3.0 (Windows 98; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=Win98 Win32=true -[Mozilla/3.0 (Windows ME; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/3.0 (Windows ME; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=WinME Win32=true -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/3.0 (Windows NT 4.0; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=WinNT Win32=true -[Mozilla/3.0 (Windows XP; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/3.0 (Windows XP; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=WinXP Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Linux*) Opera 5.0*] -Parent=Opera 5.0 -Platform=Linux - -[Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC) Opera 5.0*] -Parent=Opera 5.0 -Platform=MacPPC - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 2000) Opera 7.0*] +Parent=Opera 7.0 Platform=Win2000 Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 95) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 95) Opera 7.0*] +Parent=Opera 7.0 Platform=Win95 Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 98) Opera 7.0*] +Parent=Opera 7.0 Platform=Win98 Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows ME) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows ME) Opera 7.0*] +Parent=Opera 7.0 Platform=WinME Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 4.0) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 4.0) Opera 7.0*] +Parent=Opera 7.0 Platform=WinNT Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera 5.0*] -Parent=Opera 5.0 -Platform=WinXP +[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.0*] +Parent=Opera 7.0 +Platform=Win2000 Win32=true -[Mozilla/4.76 (Macintosh;US;PPC) Opera 5.0*] -Parent=Opera 5.0 -Platform=MacPPC - -[Mozilla/4.78 (Linux*; ?) Opera 5.0*] -Parent=Opera 5.0 -Platform=Linux +[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.0*] +Parent=Opera 7.0 +Platform=WinXP +Win32=true -[Mozilla/4.78 (Mac_PowerPC; ?) Opera 5.0*] -Parent=Opera 5.0 -Platform=MacPPC +[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows XP) Opera 7.0*] +Parent=Opera 7.0 +Platform=WinXP +Win32=true -[Mozilla/4.78 (Windows 2000; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/4.78 (Windows 2000; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=Win2000 Win32=true -[Mozilla/4.78 (Windows 95; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/4.78 (Windows 95; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=Win95 Win32=true -[Mozilla/4.78 (Windows 98; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/4.78 (Windows 98; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=Win98 Win32=true -[Mozilla/4.78 (Windows ME; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/4.78 (Windows ME; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=WinME Win32=true -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/4.78 (Windows NT 4.0; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=WinNT Win32=true -[Mozilla/4.78 (Windows XP; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/4.78 (Windows NT 5.1; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=WinXP Win32=true -[Mozilla/5.0 (Linux*; ?) Opera 5.0*] -Parent=Opera 5.0 -Platform=Linux - -[Mozilla/5.0 (Mac_PowerPC; ?) Opera 5.0*] -Parent=Opera 5.0 -Platform=MacPPC +[Mozilla/4.78 (Windows Windows NT 5.0; ?) Opera 7.0*] +Parent=Opera 7.0 +Platform=Win2000 +Win32=true -[Mozilla/5.0 (SunOS*; ?) Opera 5.0*] -Parent=Opera 5.0 -Platform=SunOS +[Mozilla/4.78 (Windows XP; ?) Opera 7.0*] +Parent=Opera 7.0 +Platform=WinXP +Win32=true -[Mozilla/5.0 (Windows 2000; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/5.0 (Windows 2000; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows 95; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/5.0 (Windows 95; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=Win95 Win32=true -[Mozilla/5.0 (Windows 98; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/5.0 (Windows 98; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=Win98 Win32=true -[Mozilla/5.0 (Windows ME; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/5.0 (Windows ME; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=WinME Win32=true -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/5.0 (Windows NT 4.0; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=WinNT Win32=true -[Mozilla/5.0 (Windows XP; ?) Opera 5.0*] -Parent=Opera 5.0 +[Mozilla/5.0 (Windows NT 5.1; ?) Opera 7.0*] +Parent=Opera 7.0 Platform=WinXP Win32=true -[Opera/5.0*(Linux*; ?)*] -Parent=Opera 5.0 -Platform=Linux - -[Opera/5.0*(Mac_PowerPC; ?)*] -Parent=Opera 5.0 -Platform=MacPPC +[Mozilla/5.0 (Windows XP; ?) Opera 7.0*] +Parent=Opera 7.0 +Platform=WinXP +Win32=true -[Opera/5.0*(Windows 2000; ?)*] -Parent=Opera 5.0 +[Opera/7.0* (Windows 2000; ?)*] +Parent=Opera 7.0 Platform=Win2000 Win32=true -[Opera/5.0*(Windows 95; ?)*] -Parent=Opera 5.0 +[Opera/7.0* (Windows 95; ?)*] +Parent=Opera 7.0 Platform=Win95 Win32=true -[Opera/5.0*(Windows 98; ?)*] -Parent=Opera 5.0 +[Opera/7.0* (Windows 98; ?)*] +Parent=Opera 7.0 Platform=Win98 Win32=true -[Opera/5.0*(Windows ME; ?)*] -Parent=Opera 5.0 +[Opera/7.0* (Windows ME; ?)*] +Parent=Opera 7.0 Platform=WinME Win32=true -[Opera/5.0*(Windows NT 4.0; ?)*] -Parent=Opera 5.0 +[Opera/7.0* (Windows NT 4.0; ?)*] +Parent=Opera 7.0 Platform=WinNT Win32=true -[Opera/5.0*(Windows XP; ?)*] -Parent=Opera 5.0 +[Opera/7.0* (Windows NT 5.0; ?)*] +Parent=Opera 7.0 +Platform=Win2000 +Win32=true + +[Opera/7.0* (Windows NT 5.1; ?)*] +Parent=Opera 7.0 +Platform=WinXP +Win32=true + +[Opera/7.0* (Windows XP; ?)*] +Parent=Opera 7.0 Platform=WinXP Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 5.12 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.1 -[Opera 5.12] +[Opera 7.1] Parent=DefaultProperties Browser=Opera -Version=5.12 -MajorVer=5 -MinorVer=12 +Version=7.1 +MajorVer=7 +MinorVer=1 Frames=true +IFrames=true Tables=true Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=1 -CssVersion=1 +CssVersion=2 supportsCSS=true -[Mozilla/3.0 (Linux*; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=Linux - -[Mozilla/3.0 (OS/2*; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=OS/2 - -[Mozilla/3.0 (Windows 2000; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.1*] +Parent=Opera 7.1 Platform=Win2000 Win32=true -[Mozilla/3.0 (Windows 95; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.1*] +Parent=Opera 7.1 Platform=Win95 Win32=true -[Mozilla/3.0 (Windows 98; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.1*] +Parent=Opera 7.1 Platform=Win98 Win32=true -[Mozilla/3.0 (Windows ME; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.1*] +Parent=Opera 7.1 Platform=WinME Win32=true -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.1*] +Parent=Opera 7.1 Platform=WinNT Win32=true -[Mozilla/3.0 (Windows XP; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 5.0; Linux*) Opera 5.12*] -Parent=Opera 5.12 -Platform=Linux - -[Mozilla/4.0 (compatible; MSIE 5.0; OS/2*) Opera 5.12*] -Parent=Opera 5.12 -Platform=OS/2 - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.1*] +Parent=Opera 7.1 Platform=Win2000 Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 95) Opera 5.12*] -Parent=Opera 5.12 -Platform=Win95 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Opera 5.12*] -Parent=Opera 5.12 -Platform=Win98 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows ME) Opera 5.12*] -Parent=Opera 5.12 -Platform=WinME -Win32=true - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 4.0) Opera 5.12*] -Parent=Opera 5.12 -Platform=WinNT -Win32=true - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.1*] +Parent=Opera 7.1 Platform=WinXP Win32=true -[Mozilla/4.76 (Macintosh;US;PPC) Opera 5.12*] -Parent=Opera 5.12 -Platform=MacPPC - -[Mozilla/4.76 (Windows ME; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=WinME +[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.1*] +Parent=Opera 7.1 +Platform=WinXP Win32=true -[Mozilla/4.78 (Linux*; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=Linux - -[Mozilla/4.78 (OS/2*; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=OS/2 - -[Mozilla/4.78 (Windows 2000; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (Windows 2000; ?) Opera 7.1*] +Parent=Opera 7.1 Platform=Win2000 Win32=true -[Mozilla/4.78 (Windows 95; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (Windows 95; ?) Opera 7.1*] +Parent=Opera 7.1 Platform=Win95 Win32=true -[Mozilla/4.78 (Windows 98; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (Windows 98; ?) Opera 7.1*] +Parent=Opera 7.1 Platform=Win98 Win32=true -[Mozilla/4.78 (Windows ME; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (Windows ME; ?) Opera 7.1*] +Parent=Opera 7.1 Platform=WinME Win32=true -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (Windows NT 4.0; U) Opera 7.1*] +Parent=Opera 7.1 Platform=WinNT Win32=true -[Mozilla/4.78 (Windows XP; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Linux*; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=Linux - -[Mozilla/5.0 (OS/2*; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=OS/2 - -[Mozilla/5.0 (Windows 2000; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (Windows NT 5.0; U) Opera 7.1*] +Parent=Opera 7.1 Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows 95; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows 98; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows ME; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 5.12*] -Parent=Opera 5.12 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows XP; ?) Opera 5.12*] -Parent=Opera 5.12 +[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.1*] +Parent=Opera 7.1 Platform=WinXP Win32=true -[Opera/5.12 (Linux*; ?)*] -Parent=Opera 5.12 +[Opera/7.1* (Linux*; ?)*] +Parent=Opera 7.1 Platform=Linux -[Opera/5.12 (OS/2*; ?)*] -Parent=Opera 5.12 -Platform=OS/2 - -[Opera/5.12 (Windows 2000; ?)*] -Parent=Opera 5.12 -Platform=Win2000 -Win32=true - -[Opera/5.12 (Windows 95; ?)*] -Parent=Opera 5.12 +[Opera/7.1* (Windows 95; ?)*] +Parent=Opera 7.1 Platform=Win95 Win32=true -[Opera/5.12 (Windows 98; ?)*] -Parent=Opera 5.12 +[Opera/7.1* (Windows 98; ?)*] +Parent=Opera 7.1 Platform=Win98 Win32=true -[Opera/5.12 (Windows ME; ?)*] -Parent=Opera 5.12 +[Opera/7.1* (Windows ME; ?)*] +Parent=Opera 7.1 Platform=WinME Win32=true -[Opera/5.12 (Windows NT 4.0; ?)*] -Parent=Opera 5.12 +[Opera/7.1* (Windows NT 4.0; ?)*] +Parent=Opera 7.1 Platform=WinNT Win32=true -[Opera/5.12 (Windows XP; ?)*] -Parent=Opera 5.12 +[Opera/7.1* (Windows NT 5.0; ?)*] +Parent=Opera 7.1 +Platform=Win2000 +Win32=true + +[Opera/7.1* (Windows NT 5.1; ?)*] +Parent=Opera 7.1 +Platform=WinXP +Win32=true + +[Opera/7.1* (Windows XP; ?)*] +Parent=Opera 7.1 Platform=WinXP Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 6.0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.2 -[Opera 6.0] +[Opera 7.2] Parent=DefaultProperties Browser=Opera -Version=6.0 -MajorVer=6 +Version=7.2 +MajorVer=7 +MinorVer=2 Frames=true IFrames=true Tables=true @@ -10548,231 +9667,162 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=1 -CssVersion=1 +CssVersion=2 supportsCSS=true -[Mozilla/3.0 (Linux*; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.2*] +Parent=Opera 7.2 Platform=Linux -[Mozilla/3.0 (Mac_PowerPC; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=MacPPC - -[Mozilla/3.0 (Windows 2000; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.2*] +Parent=Opera 7.2 Platform=Win2000 Win32=true -[Mozilla/3.0 (Windows 95; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.2*] +Parent=Opera 7.2 Platform=Win95 Win32=true -[Mozilla/3.0 (Windows 98; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.2*] +Parent=Opera 7.2 Platform=Win98 Win32=true -[Mozilla/3.0 (Windows ME; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.2*] +Parent=Opera 7.2 Platform=WinME Win32=true -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.2*] +Parent=Opera 7.2 Platform=WinNT Win32=true -[Mozilla/3.0 (Windows XP; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 5.0; Linux*) Opera 6.0*] -Parent=Opera 6.0 -Platform=Linux - -[Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC) Opera 6.0*] -Parent=Opera 6.0 -Platform=MacPPC - -[Mozilla/4.0 (compatible; MSIE 5.0; Macintosh; PPC) Opera 6.0*] -Parent=Opera 6.0 -Platform=MacPPC - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.2*] +Parent=Opera 7.2 Platform=Win2000 Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 95) Opera 6.0*] -Parent=Opera 6.0 -Platform=Win95 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Opera 6.0*] -Parent=Opera 6.0 -Platform=Win98 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows ME) Opera 6.0*] -Parent=Opera 6.0 -Platform=WinME +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.2*] +Parent=Opera 7.2 +Platform=WinXP Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 4.0) Opera 6.0*] -Parent=Opera 6.0 -Platform=WinNT +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.2*] +Parent=Opera 7.2 +Platform=Win2003 Win32=true -[Mozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.2*] +Parent=Opera 7.2 Platform=WinXP Win32=true -[Mozilla/4.76 (Macintosh;US;PPC) Opera 6.0*] -Parent=Opera 6.0 -Platform=MacPPC - -[Mozilla/4.78 (Linux*; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=Linux - -[Mozilla/4.78 (Mac_PowerPC; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=MacPPC - -[Mozilla/4.78 (Windows 2000; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (Windows 2000; ?) Opera 7.2*] +Parent=Opera 7.2 Platform=Win2000 Win32=true -[Mozilla/4.78 (Windows 95; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (Windows 95; ?) Opera 7.2*] +Parent=Opera 7.2 Platform=Win95 Win32=true -[Mozilla/4.78 (Windows 98; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (Windows 98; ?) Opera 7.2*] +Parent=Opera 7.2 Platform=Win98 Win32=true -[Mozilla/4.78 (Windows ME; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (Windows ME; ?) Opera 7.2*] +Parent=Opera 7.2 Platform=WinME Win32=true -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (Windows NT 4.0; U) Opera 7.2*] +Parent=Opera 7.2 Platform=WinNT Win32=true -[Mozilla/4.78 (Windows XP; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Linux*; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=Linux - -[Mozilla/5.0 (Mac_PowerPC; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows 2000; ?) Opera 6.0*] -Parent=Opera 6.0 +[Mozilla/?.* (Windows NT 5.0; U) Opera 7.2*] +Parent=Opera 7.2 Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows 95; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows 98; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows ME; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=WinNT +[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.2*] +Parent=Opera 7.2 +Platform=WinXP Win32=true -[Mozilla/5.0 (Windows XP; ?) Opera 6.0*] -Parent=Opera 6.0 -Platform=WinXP +[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.2*] +Parent=Opera 7.2 +Platform=Win2003 Win32=true -[Opera/6.0* (Linux*; ?)*] -Parent=Opera 6.0 +[Opera/7.2* (Linux*; ?)*] +Parent=Opera 7.2 Platform=Linux -[Opera/6.0* (Mac_PowerPC; ?)*] -Parent=Opera 6.0 -Platform=MacPPC - -[Opera/6.0* (Windows 2000; ?)*] -Parent=Opera 6.0 -Platform=Win2000 -Win32=true - -[Opera/6.0* (Windows 95; ?)*] -Parent=Opera 6.0 +[Opera/7.2* (Windows 95; ?)*] +Parent=Opera 7.2 Platform=Win95 Win32=true -[Opera/6.0* (Windows 98; ?)*] -Parent=Opera 6.0 +[Opera/7.2* (Windows 98; ?)*] +Parent=Opera 7.2 Platform=Win98 Win32=true -[Opera/6.0* (Windows ME; ?)*] -Parent=Opera 6.0 +[Opera/7.2* (Windows ME; ?)*] +Parent=Opera 7.2 Platform=WinME Win32=true -[Opera/6.0* (Windows NT 4.0; ?)*] -Parent=Opera 6.0 +[Opera/7.2* (Windows NT 4.0; ?)*] +Parent=Opera 7.2 Platform=WinNT Win32=true -[Opera/6.0* (Windows NT 5.0; ?)*] -Parent=Opera 6.0 +[Opera/7.2* (Windows NT 5.0; ?)*] +Parent=Opera 7.2 Platform=Win2000 Win32=true -[Opera/6.0* (Windows NT 5.1; ?)*] -Parent=Opera 6.0 +[Opera/7.2* (Windows NT 5.1; ?)*] +Parent=Opera 7.2 Platform=WinXP Win32=true -[Opera/6.0* (Windows NT 5.2; ?)*] -Parent=Opera 6.0 +[Opera/7.2* (Windows NT 5.2; ?)*] +Parent=Opera 7.2 Platform=Win2003 Win32=true -[Opera/6.0* (Windows XP; ?)*] -Parent=Opera 6.0 +[Opera/7.2* (Windows XP; ?)*] +Parent=Opera 7.2 Platform=WinXP Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 6.1 +[Opera/7.2* (X11; FreeBSD*; ?)*] +Parent=Opera 7.2 +Platform=FreeBSD + +[Opera/7.2* (X11; Linux*; ?)*] +Parent=Opera 7.2 +Platform=Linux + +[Opera/7.2* (X11; SunOS*)*] +Parent=Opera 7.2 +Platform=SunOS + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.5 -[Opera 6.1] +[Opera 7.5] Parent=DefaultProperties Browser=Opera -Version=6.1 -MajorVer=6 -MinorVer=1 +Version=7.5 +MajorVer=7 +MinorVer=5 Frames=true IFrames=true Tables=true @@ -10780,377 +9830,356 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=1 -CssVersion=1 -supportsCSS=true - -[Mozilla/3.0 (FreeBSD*; ?) Opera 6.1 *] -Parent=Opera 6.1 -Platform=FreeBSD - -[Mozilla/3.0 (Linux*; ?) Opera 6.1 *] -Parent=Opera 6.1 -Platform=Linux - -[Mozilla/3.0 (Linux*; ?) Opera 6.11 *] -Parent=Opera 6.1 -Version=6.11 -MinorVer=11 -Platform=Linux - -[Mozilla/4.0 (compatible; MSIE 5.0; FreeBSD*) Opera 6.1 *] -Parent=Opera 6.1 -Platform=FreeBSD - -[Mozilla/4.0 (compatible; MSIE 5.0; Linux*) Opera 6.1 *] -Parent=Opera 6.1 -Platform=Linux - -[Mozilla/4.0 (compatible; MSIE 5.0; Linux*) Opera 6.11 *] -Parent=Opera 6.1 -MinorVer=11 -Platform=Linux -CSS=1 -CssVersion=1 +CssVersion=2 supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 5.0; Linux*) Opera 6.12 *] -Parent=Opera 6.1 -Version=6.12 -MinorVer=12 -Platform=Linux - -[Mozilla/4.0 (compatible; MSIE 5.0; UNIX) Opera 6.1 *] -Parent=Opera 6.1 -Platform=Unix - -[Mozilla/4.0 (compatible; MSIE 5.0; UNIX) Opera 6.11 *] -Parent=Opera 6.1 -MinorVer=11 - -[Mozilla/4.0 (compatible; MSIE 5.0; UNIX) Opera 6.12 *] -Parent=Opera 6.1 -Version=6.12 -MinorVer=12 -Platform=Unix - -[Mozilla/4.78 (FreeBSD*; ?) Opera 6.1 *] -Parent=Opera 6.1 -Platform=FreeBSD - -[Mozilla/4.78 (Linux*; ?) Opera 6.1 *] -Parent=Opera 6.1 -Platform=Linux - -[Mozilla/4.78 (Linux*; ?) Opera 6.11 *] -Parent=Opera 6.1 -Version=6.11 -MinorVer=11 -Platform=Linux - -[Mozilla/4.78 (Linux*; ?) Opera 6.12 *] -Parent=Opera 6.1 -Version=6.12 -MinorVer=12 -Platform=Linux - -[Mozilla/4.78 (UNIX; ?) Opera 6.1 *] -Parent=Opera 6.1 -Platform=Unix - -[Mozilla/5.0 (FreeBSD*; ?) Opera 6.1 *] -Parent=Opera 6.1 -Platform=FreeBSD - -[Mozilla/5.0 (Linux*; ?) Opera 6.1 *] -Parent=Opera 6.1 +[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.5*] +Parent=Opera 7.5 Platform=Linux -[Mozilla/5.0 (Linux*; ?) Opera 6.11 *] -Parent=Opera 6.1 -MinorVer=11 - -[Mozilla/5.0 (UNIX; ?) Opera 6.11 *] -Parent=Opera 6.1 -Version=6.11 -MajorVer=6 -MinorVer=11 -Platform=Unix - -[Opera/6.1 (FreeBSD*; ?)*] -Parent=Opera 6.1 -Platform=FreeBSD - -[Opera/6.1 (Linux*; ?)*] -Parent=Opera 6.1 -Platform=Linux +[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.5*] +Parent=Opera 7.5 +Platform=MacPPC -[Opera/6.1 (UNIX*; ?)*] -Parent=Opera 6.1 -Platform=Unix +[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.5*] +Parent=Opera 7.5 +Platform=Win2000 +Win32=true -[Opera/6.11 (FreeBSD*; ?)*] -Parent=Opera 6.1 -Version=6.11 -MinorVer=11 -Platform=FreeBSD +[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.5*] +Parent=Opera 7.5 +Platform=Win95 +Win32=true -[Opera/6.11 (Linux*; ?)*] -Parent=Opera 6.1 -Version=6.11 -MinorVer=11 -Platform=Linux -CSS=1 -CssVersion=1 -supportsCSS=true +[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.5*] +Parent=Opera 7.5 +Platform=Win98 +Win32=true -[Opera/6.11 (UNIX*; ?)*] -Parent=Opera 6.1 -Platform=Unix +[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.5*] +Parent=Opera 7.5 +Platform=WinME +Win32=true -[Opera/6.12 (FreeBSD*; ?)*] -Parent=Opera 6.1 -Version=6.12 -MinorVer=12 -Platform=FreeBSD +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.5*] +Parent=Opera 7.5 +Platform=WinNT +Win32=true -[Opera/6.12 (Linux*; ?)*] -Parent=Opera 6.1 -Version=6.12 -MinorVer=12 -Platform=Linux +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.5*] +Parent=Opera 7.5 +Platform=Win2000 +Win32=true -[Opera/6.12 (OpenBSD*; ?) *] -Parent=Opera 6.1 -Version=6.12 -MinorVer=12 -Platform=OpenBSD +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.5*] +Parent=Opera 7.5 +Platform=WinXP +Win32=true -[Opera/6.12 (SunOS*; ?)*] -Parent=Opera 6.1 -Version=6.12 -MajorVer=6 -MinorVer=12 -Platform=SunOS -IFrames=false +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.5*] +Parent=Opera 7.5 +Platform=Win2003 +Win32=true -[Opera/6.12 (UNIX*; ?)*] -Parent=Opera 6.1 -Version=6.12 -MinorVer=12 -Platform=Unix +[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.5*] +Parent=Opera 7.5 +Platform=WinXP +Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.0 +[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.5*] +Parent=Opera 7.5 +Platform=Linux -[Opera 7.0] -Parent=DefaultProperties -Browser=Opera -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CSS=2 -CssVersion=2 -supportsCSS=true +[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.5*] +Parent=Opera 7.5 +Platform=MacOSX -[Mozilla/3.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (Windows 2000; ?) Opera 7.5*] +Parent=Opera 7.5 Platform=Win2000 Win32=true -[Mozilla/3.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (Windows 95; ?) Opera 7.5*] +Parent=Opera 7.5 Platform=Win95 Win32=true -[Mozilla/3.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (Windows 98; ?) Opera 7.5*] +Parent=Opera 7.5 Platform=Win98 Win32=true -[Mozilla/3.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (Windows ME; ?) Opera 7.5*] +Parent=Opera 7.5 Platform=WinME Win32=true -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (Windows NT 4.0; U) Opera 7.5*] +Parent=Opera 7.5 Platform=WinNT Win32=true -[Mozilla/3.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (Windows NT 5.0; U) Opera 7.5*] +Parent=Opera 7.5 +Platform=Win2000 +Win32=true + +[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.5*] +Parent=Opera 7.5 Platform=WinXP Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 2000) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 +[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.5*] +Parent=Opera 7.5 +Platform=Win2003 Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 95) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (X11; Linux*; ?) Opera 7.5*] +Parent=Opera 7.5 +Platform=Linux + +[Opera/7.5* (Linux*; ?)*] +Parent=Opera 7.5 +Platform=Linux + +[Opera/7.5* (Macintosh; *Mac OS X; ?)*] +Parent=Opera 7.5 +Platform=MacOSX + +[Opera/7.5* (Windows 95; ?)*] +Parent=Opera 7.5 Platform=Win95 Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 98) Opera 7.0*] -Parent=Opera 7.0 +[Opera/7.5* (Windows 98; ?)*] +Parent=Opera 7.5 Platform=Win98 Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows ME) Opera 7.0*] -Parent=Opera 7.0 +[Opera/7.5* (Windows ME; ?)*] +Parent=Opera 7.5 Platform=WinME Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 4.0) Opera 7.0*] -Parent=Opera 7.0 +[Opera/7.5* (Windows NT 4.0; ?)*] +Parent=Opera 7.5 Platform=WinNT Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.0*] -Parent=Opera 7.0 +[Opera/7.5* (Windows NT 5.0; ?)*] +Parent=Opera 7.5 Platform=Win2000 Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.0*] -Parent=Opera 7.0 +[Opera/7.5* (Windows NT 5.1; ?)*] +Parent=Opera 7.5 Platform=WinXP Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows XP) Opera 7.0*] -Parent=Opera 7.0 +[Opera/7.5* (Windows NT 5.2; ?)*] +Parent=Opera 7.5 +Platform=Win2003 +Win32=true + +[Opera/7.5* (Windows XP; ?)*] +Parent=Opera 7.5 Platform=WinXP Win32=true -[Mozilla/4.78 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 +[Opera/7.5* (X11; FreeBSD*; ?)*] +Parent=Opera 7.5 +Platform=FreeBSD + +[Opera/7.5* (X11; Linux*; ?)*] +Parent=Opera 7.5 +Platform=Linux + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.6 + +[Opera 7.6] +Parent=DefaultProperties +Browser=Opera +Version=7.6 +MajorVer=7 +MinorVer=6 +Frames=true +IFrames=true +Tables=true +Cookies=true +BackgroundSounds=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true + +[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.6*] +Parent=Opera 7.6 +Platform=Linux + +[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.6*] +Parent=Opera 7.6 +Platform=MacPPC + +[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.6*] +Parent=Opera 7.6 Platform=Win2000 Win32=true -[Mozilla/4.78 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.6*] +Parent=Opera 7.6 Platform=Win95 Win32=true -[Mozilla/4.78 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.6*] +Parent=Opera 7.6 Platform=Win98 Win32=true -[Mozilla/4.78 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.6*] +Parent=Opera 7.6 Platform=WinME Win32=true -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.6*] +Parent=Opera 7.6 Platform=WinNT Win32=true -[Mozilla/4.78 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.6*] +Parent=Opera 7.6 +Platform=Win2000 +Win32=true + +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.6*] +Parent=Opera 7.6 Platform=WinXP Win32=true -[Mozilla/4.78 (Windows Windows NT 5.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.6*] +Parent=Opera 7.6 +Platform=Win2003 Win32=true -[Mozilla/4.78 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.6*] +Parent=Opera 7.6 Platform=WinXP Win32=true -[Mozilla/5.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.6*] +Parent=Opera 7.6 +Platform=Linux + +[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.6*] +Parent=Opera 7.6 +Platform=MacOSX + +[Mozilla/?.* (Windows 2000; ?) Opera 7.6*] +Parent=Opera 7.6 Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (Windows 95; ?) Opera 7.6*] +Parent=Opera 7.6 Platform=Win95 Win32=true -[Mozilla/5.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (Windows 98; ?) Opera 7.6*] +Parent=Opera 7.6 Platform=Win98 Win32=true -[Mozilla/5.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (Windows ME; ?) Opera 7.6*] +Parent=Opera 7.6 Platform=WinME Win32=true -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (Windows NT 4.0; U) Opera 7.6*] +Parent=Opera 7.6 Platform=WinNT Win32=true -[Mozilla/5.0 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP +[Mozilla/?.* (Windows NT 5.0; U) Opera 7.6*] +Parent=Opera 7.6 +Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 +[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.6*] +Parent=Opera 7.6 Platform=WinXP Win32=true -[Opera/7.0* (Windows 2000; ?)*] -Parent=Opera 7.0 -Platform=Win2000 +[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.6*] +Parent=Opera 7.6 +Platform=Win2003 Win32=true -[Opera/7.0* (Windows 95; ?)*] -Parent=Opera 7.0 +[Mozilla/?.* (X11; Linux*; ?) Opera 7.6*] +Parent=Opera 7.6 +Platform=Linux + +[Opera/7.6* (Linux*)*] +Parent=Opera 7.6 +Platform=Linux + +[Opera/7.6* (Macintosh; *Mac OS X; ?)*] +Parent=Opera 7.6 +Platform=MacOSX + +[Opera/7.6* (Windows 95*)*] +Parent=Opera 7.6 Platform=Win95 Win32=true -[Opera/7.0* (Windows 98; ?)*] -Parent=Opera 7.0 +[Opera/7.6* (Windows 98*)*] +Parent=Opera 7.6 Platform=Win98 Win32=true -[Opera/7.0* (Windows ME; ?)*] -Parent=Opera 7.0 +[Opera/7.6* (Windows ME*)*] +Parent=Opera 7.6 Platform=WinME Win32=true -[Opera/7.0* (Windows NT 4.0; ?)*] -Parent=Opera 7.0 +[Opera/7.6* (Windows NT 4.0*)*] +Parent=Opera 7.6 Platform=WinNT Win32=true -[Opera/7.0* (Windows NT 5.0; ?)*] -Parent=Opera 7.0 +[Opera/7.6* (Windows NT 5.0*)*] +Parent=Opera 7.6 Platform=Win2000 Win32=true -[Opera/7.0* (Windows NT 5.1; ?)*] -Parent=Opera 7.0 +[Opera/7.6* (Windows NT 5.1*)*] +Parent=Opera 7.6 Platform=WinXP Win32=true -[Opera/7.0* (Windows XP; ?)*] -Parent=Opera 7.0 +[Opera/7.6* (Windows NT 5.2*)*] +Parent=Opera 7.6 +Platform=Win2003 +Win32=true + +[Opera/7.6* (Windows XP*)*] +Parent=Opera 7.6 Platform=WinXP Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.1 +[Opera/7.6* (X11; FreeBSD*)*] +Parent=Opera 7.6 +Platform=FreeBSD -[Opera 7.1] +[Opera/7.6* (X11; Linux*)*] +Parent=Opera 7.6 +Platform=Linux + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.0 + +[Opera 8.0] Parent=DefaultProperties Browser=Opera -Version=7.1 -MajorVer=7 -MinorVer=1 +Version=8.0 +MajorVer=8 Frames=true IFrames=true Tables=true @@ -11158,132 +10187,196 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.0*] +Parent=Opera 8.0 +Platform=Linux + +[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X; *) Opera 8.0*] +Parent=Opera 8.0 +Platform=MacOSX + +[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.0*] +Parent=Opera 8.0 +Platform=MacPPC + +[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.0*] +Parent=Opera 8.0 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.0*] +Parent=Opera 8.0 Platform=Win95 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.0*] +Parent=Opera 8.0 Platform=Win98 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.0*] +Parent=Opera 8.0 +Platform=WinCE +Win32=true + +[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.0*] +Parent=Opera 8.0 Platform=WinME Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.0*] +Parent=Opera 8.0 Platform=WinNT Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.0*] +Parent=Opera 8.0 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.0*] +Parent=Opera 8.0 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.0*] +Parent=Opera 8.0 +Platform=Win2003 +Win32=true + +[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.0*] +Parent=Opera 8.0 Platform=WinXP Win32=true -[Mozilla/?.* (Windows 2000; ?) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.0*] +Parent=Opera 8.0 +Platform=FreeBSD + +[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.0*] +Parent=Opera 8.0 +Platform=Linux + +[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.0*] +Parent=Opera 8.0 +Platform=MacOSX + +[Mozilla/?.* (Windows 2000; *) Opera 8.0*] +Parent=Opera 8.0 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows 95; ?) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (Windows 95; *) Opera 8.0*] +Parent=Opera 8.0 Platform=Win95 Win32=true -[Mozilla/?.* (Windows 98; ?) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (Windows 98; *) Opera 8.0*] +Parent=Opera 8.0 Platform=Win98 Win32=true -[Mozilla/?.* (Windows ME; ?) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (Windows ME; *) Opera 8.0*] +Parent=Opera 8.0 Platform=WinME Win32=true -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (Windows NT 4.0; *) Opera 8.0*] +Parent=Opera 8.0 Platform=WinNT Win32=true -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (Windows NT 5.0; *) Opera 8.0*] +Parent=Opera 8.0 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.1*] -Parent=Opera 7.1 +[Mozilla/?.* (Windows NT 5.1; *) Opera 8.0*] +Parent=Opera 8.0 Platform=WinXP Win32=true -[Opera/7.1* (Linux*; ?)*] -Parent=Opera 7.1 +[Mozilla/?.* (Windows NT 5.2; *) Opera 8.0*] +Parent=Opera 8.0 +Platform=Win2003 +Win32=true + +[Mozilla/?.* (X11; Linux*; *) Opera 8.0*] +Parent=Opera 8.0 Platform=Linux -[Opera/7.1* (Windows 95; ?)*] -Parent=Opera 7.1 +[Opera/8.0* (Linux*)*] +Parent=Opera 8.0 +Platform=Linux + +[Opera/8.0* (Macintosh; *Mac OS X; *)*] +Parent=Opera 8.0 +Platform=MacOSX + +[Opera/8.0* (Windows 95*)*] +Parent=Opera 8.0 Platform=Win95 Win32=true -[Opera/7.1* (Windows 98; ?)*] -Parent=Opera 7.1 +[Opera/8.0* (Windows 98*)*] +Parent=Opera 8.0 Platform=Win98 Win32=true -[Opera/7.1* (Windows ME; ?)*] -Parent=Opera 7.1 +[Opera/8.0* (Windows CE*)*] +Parent=Opera 8.0 +Platform=WinCE +Win32=true + +[Opera/8.0* (Windows ME*)*] +Parent=Opera 8.0 Platform=WinME Win32=true -[Opera/7.1* (Windows NT 4.0; ?)*] -Parent=Opera 7.1 +[Opera/8.0* (Windows NT 4.0*)*] +Parent=Opera 8.0 Platform=WinNT Win32=true -[Opera/7.1* (Windows NT 5.0; ?)*] -Parent=Opera 7.1 +[Opera/8.0* (Windows NT 5.0*)*] +Parent=Opera 8.0 Platform=Win2000 Win32=true -[Opera/7.1* (Windows NT 5.1; ?)*] -Parent=Opera 7.1 +[Opera/8.0* (Windows NT 5.1*)*] +Parent=Opera 8.0 Platform=WinXP Win32=true -[Opera/7.1* (Windows XP; ?)*] -Parent=Opera 7.1 +[Opera/8.0* (Windows NT 5.2*)*] +Parent=Opera 8.0 +Platform=Win2003 +Win32=true + +[Opera/8.0* (Windows XP*)*] +Parent=Opera 8.0 Platform=WinXP Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.2 +[Opera/8.0* (X11; FreeBSD*)*] +Parent=Opera 8.0 +Platform=FreeBSD -[Opera 7.2] +[Opera/8.0* (X11; Linux*)*] +Parent=Opera 8.0 +Platform=Linux + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.1 + +[Opera 8.1] Parent=DefaultProperties Browser=Opera -Version=7.2 -MajorVer=7 -MinorVer=2 +Version=8.1 +MajorVer=8 +MinorVer=1 Frames=true IFrames=true Tables=true @@ -11291,162 +10384,191 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.1*] +Parent=Opera 8.1 Platform=Linux -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.1*] +Parent=Opera 8.1 +Platform=MacPPC + +[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.1*] +Parent=Opera 8.1 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.1*] +Parent=Opera 8.1 Platform=Win95 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.1*] +Parent=Opera 8.1 Platform=Win98 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.1*] +Parent=Opera 8.1 +Platform=WinCE +Win32=true + +[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.1*] +Parent=Opera 8.1 Platform=WinME Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.1*] +Parent=Opera 8.1 Platform=WinNT Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.1*] +Parent=Opera 8.1 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.1*] +Parent=Opera 8.1 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.1*] +Parent=Opera 8.1 Platform=Win2003 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.1*] +Parent=Opera 8.1 Platform=WinXP Win32=true -[Mozilla/?.* (Windows 2000; ?) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.1*] +Parent=Opera 8.1 +Platform=FreeBSD + +[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.1*] +Parent=Opera 8.1 +Platform=Linux + +[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.1*] +Parent=Opera 8.1 +Platform=MacOSX + +[Mozilla/?.* (Windows 2000; *) Opera 8.1*] +Parent=Opera 8.1 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows 95; ?) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (Windows 95; *) Opera 8.1*] +Parent=Opera 8.1 Platform=Win95 Win32=true -[Mozilla/?.* (Windows 98; ?) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (Windows 98; *) Opera 8.1*] +Parent=Opera 8.1 Platform=Win98 Win32=true -[Mozilla/?.* (Windows ME; ?) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (Windows ME; *) Opera 8.1*] +Parent=Opera 8.1 Platform=WinME Win32=true -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (Windows NT 4.0; *) Opera 8.1*] +Parent=Opera 8.1 Platform=WinNT Win32=true -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (Windows NT 5.0; *) Opera 8.1*] +Parent=Opera 8.1 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (Windows NT 5.1; *) Opera 8.1*] +Parent=Opera 8.1 Platform=WinXP Win32=true -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.2*] -Parent=Opera 7.2 +[Mozilla/?.* (Windows NT 5.2; *) Opera 8.1*] +Parent=Opera 8.1 Platform=Win2003 Win32=true -[Opera/7.2* (Linux*; ?)*] -Parent=Opera 7.2 +[Mozilla/?.* (X11; Linux*; *) Opera 8.1*] +Parent=Opera 8.1 Platform=Linux -[Opera/7.2* (Windows 95; ?)*] -Parent=Opera 7.2 +[Opera/8.1* (Linux*)*] +Parent=Opera 8.1 +Platform=Linux + +[Opera/8.1* (Macintosh; *Mac OS X; *)*] +Parent=Opera 8.1 +Platform=MacOSX + +[Opera/8.1* (Windows 95*)*] +Parent=Opera 8.1 Platform=Win95 Win32=true -[Opera/7.2* (Windows 98; ?)*] -Parent=Opera 7.2 +[Opera/8.1* (Windows 98*)*] +Parent=Opera 8.1 Platform=Win98 Win32=true -[Opera/7.2* (Windows ME; ?)*] -Parent=Opera 7.2 +[Opera/8.1* (Windows CE*)*] +Parent=Opera 8.1 +Platform=WinCE +Win32=true + +[Opera/8.1* (Windows ME*)*] +Parent=Opera 8.1 Platform=WinME Win32=true -[Opera/7.2* (Windows NT 4.0; ?)*] -Parent=Opera 7.2 +[Opera/8.1* (Windows NT 4.0*)*] +Parent=Opera 8.1 Platform=WinNT Win32=true -[Opera/7.2* (Windows NT 5.0; ?)*] -Parent=Opera 7.2 +[Opera/8.1* (Windows NT 5.0*)*] +Parent=Opera 8.1 Platform=Win2000 Win32=true -[Opera/7.2* (Windows NT 5.1; ?)*] -Parent=Opera 7.2 +[Opera/8.1* (Windows NT 5.1*)*] +Parent=Opera 8.1 Platform=WinXP Win32=true -[Opera/7.2* (Windows NT 5.2; ?)*] -Parent=Opera 7.2 +[Opera/8.1* (Windows NT 5.2*)*] +Parent=Opera 8.1 Platform=Win2003 Win32=true -[Opera/7.2* (Windows XP; ?)*] -Parent=Opera 7.2 +[Opera/8.1* (Windows XP*)*] +Parent=Opera 8.1 Platform=WinXP Win32=true -[Opera/7.2* (X11; FreeBSD*; ?)*] -Parent=Opera 7.2 +[Opera/8.1* (X11; FreeBSD*)*] +Parent=Opera 8.1 Platform=FreeBSD -[Opera/7.2* (X11; Linux*; ?)*] -Parent=Opera 7.2 +[Opera/8.1* (X11; Linux*)*] +Parent=Opera 8.1 Platform=Linux -[Opera/7.2* (X11; SunOS*)*] -Parent=Opera 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.5 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.5 -[Opera 7.5] +[Opera 8.5] Parent=DefaultProperties Browser=Opera -Version=7.5 -MajorVer=7 +Version=8.5 +MajorVer=8 MinorVer=5 Frames=true IFrames=true @@ -11455,179 +10577,201 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true +ecmascriptversion=1.3 +w3cdomversion=1.0 -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.5*] +Parent=Opera 8.5 Platform=Linux -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X;*) Opera 8.5*] +Parent=Opera 8.5 +Platform=MacOSX + +[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.5*] +Parent=Opera 8.5 Platform=MacPPC -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.5*] +Parent=Opera 8.5 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.5*] +Parent=Opera 8.5 Platform=Win95 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.5*] +Parent=Opera 8.5 Platform=Win98 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.5*] +Parent=Opera 8.5 +Platform=WinCE +Win32=true + +[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.5*] +Parent=Opera 8.5 Platform=WinME Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.5*] +Parent=Opera 8.5 Platform=WinNT Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.5*] +Parent=Opera 8.5 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.5*] +Parent=Opera 8.5 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.5*] +Parent=Opera 8.5 Platform=Win2003 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.5*] +Parent=Opera 8.5 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.5*] +Parent=Opera 8.5 +Platform=FreeBSD + +[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.5*] +Parent=Opera 8.5 Platform=Linux -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.5*] +Parent=Opera 8.5 Platform=MacOSX -[Mozilla/?.* (Windows 2000; ?) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (Macintosh; PPC Mac OS X;*) Opera 8.5*] +Parent=Opera 8.5 +Platform=MacOSX + +[Mozilla/?.* (Windows 2000; *) Opera 8.5*] +Parent=Opera 8.5 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows 95; ?) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (Windows 95; *) Opera 8.5*] +Parent=Opera 8.5 Platform=Win95 Win32=true -[Mozilla/?.* (Windows 98; ?) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (Windows 98; *) Opera 8.5*] +Parent=Opera 8.5 Platform=Win98 Win32=true -[Mozilla/?.* (Windows ME; ?) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (Windows ME; *) Opera 8.5*] +Parent=Opera 8.5 Platform=WinME Win32=true -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (Windows NT 4.0; *) Opera 8.5*] +Parent=Opera 8.5 Platform=WinNT Win32=true -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (Windows NT 5.0; *) Opera 8.5*] +Parent=Opera 8.5 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (Windows NT 5.1; *) Opera 8.5*] +Parent=Opera 8.5 Platform=WinXP Win32=true -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (Windows NT 5.2; *) Opera 8.5*] +Parent=Opera 8.5 Platform=Win2003 Win32=true -[Mozilla/?.* (X11; Linux*; ?) Opera 7.5*] -Parent=Opera 7.5 +[Mozilla/?.* (X11; Linux*; *) Opera 8.5*] +Parent=Opera 8.5 Platform=Linux -[Opera/7.5* (Linux*; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (Linux*)*] +Parent=Opera 8.5 Platform=Linux -[Opera/7.5* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (Macintosh; *Mac OS X; *)*] +Parent=Opera 8.5 Platform=MacOSX -[Opera/7.5* (Windows 95; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (Windows 95*)*] +Parent=Opera 8.5 Platform=Win95 Win32=true -[Opera/7.5* (Windows 98; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (Windows 98*)*] +Parent=Opera 8.5 Platform=Win98 Win32=true -[Opera/7.5* (Windows ME; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (Windows CE*)*] +Parent=Opera 8.5 +Platform=WinCE +Win32=true + +[Opera/8.5* (Windows ME*)*] +Parent=Opera 8.5 Platform=WinME Win32=true -[Opera/7.5* (Windows NT 4.0; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (Windows NT 4.0*)*] +Parent=Opera 8.5 Platform=WinNT Win32=true -[Opera/7.5* (Windows NT 5.0; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (Windows NT 5.0*)*] +Parent=Opera 8.5 Platform=Win2000 Win32=true -[Opera/7.5* (Windows NT 5.1; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (Windows NT 5.1*)*] +Parent=Opera 8.5 Platform=WinXP Win32=true -[Opera/7.5* (Windows NT 5.2; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (Windows NT 5.2*)*] +Parent=Opera 8.5 Platform=Win2003 Win32=true -[Opera/7.5* (Windows XP; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (Windows XP*)*] +Parent=Opera 8.5 Platform=WinXP Win32=true -[Opera/7.5* (X11; FreeBSD*; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (X11; FreeBSD*)*] +Parent=Opera 8.5 Platform=FreeBSD -[Opera/7.5* (X11; Linux*; ?)*] -Parent=Opera 7.5 +[Opera/8.5* (X11; Linux*)*] +Parent=Opera 8.5 Platform=Linux -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.6 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.0 -[Opera 7.6] +[Opera 9.0] Parent=DefaultProperties Browser=Opera -Version=7.6 -MajorVer=7 -MinorVer=6 +Version=9.0 +MajorVer=9 Frames=true IFrames=true Tables=true @@ -11635,178 +10779,212 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true +ecmascriptversion=1.5 +w3cdomversion=1.0 -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.0*] +Parent=Opera 9.0 Platform=Linux -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.0*] +Parent=Opera 9.0 +Platform=MacOSX + +[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.0*] +Parent=Opera 9.0 Platform=MacPPC -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.0*] +Parent=Opera 9.0 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.0*] +Parent=Opera 9.0 Platform=Win95 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.0*] +Parent=Opera 9.0 Platform=Win98 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.0*] +Parent=Opera 9.0 +Platform=WinCE +Win32=true + +[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.0*] +Parent=Opera 9.0 Platform=WinME Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.0*] +Parent=Opera 9.0 Platform=WinNT Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.0*] +Parent=Opera 9.0 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.0*] +Parent=Opera 9.0 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.0*] +Parent=Opera 9.0 Platform=Win2003 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.0*] +Parent=Opera 9.0 +Platform=WinVista +Win32=true + +[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.0*] +Parent=Opera 9.0 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.0*] +Parent=Opera 9.0 +Platform=FreeBSD + +[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.0*] +Parent=Opera 9.0 Platform=Linux -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.0*] +Parent=Opera 9.0 +Platform=SunOS + +[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.0*] +Parent=Opera 9.0 Platform=MacOSX -[Mozilla/?.* (Windows 2000; ?) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (Windows 2000;*) Opera 9.0*] +Parent=Opera 9.0 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows 95; ?) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (Windows 95;*) Opera 9.0*] +Parent=Opera 9.0 Platform=Win95 Win32=true -[Mozilla/?.* (Windows 98; ?) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (Windows 98;*) Opera 9.0*] +Parent=Opera 9.0 Platform=Win98 Win32=true -[Mozilla/?.* (Windows ME; ?) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (Windows ME;*) Opera 9.0*] +Parent=Opera 9.0 Platform=WinME Win32=true -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (Windows NT 4.0;*) Opera 9.0*] +Parent=Opera 9.0 Platform=WinNT Win32=true -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (Windows NT 5.0;*) Opera 9.0*] +Parent=Opera 9.0 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (Windows NT 5.1;*) Opera 9.0*] +Parent=Opera 9.0 Platform=WinXP Win32=true -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (Windows NT 5.2;*) Opera 9.0*] +Parent=Opera 9.0 Platform=Win2003 Win32=true -[Mozilla/?.* (X11; Linux*; ?) Opera 7.6*] -Parent=Opera 7.6 +[Mozilla/* (X11; Linux*) Opera 9.0*] +Parent=Opera 9.0 Platform=Linux -[Opera/7.6* (Linux*)*] -Parent=Opera 7.6 +[Opera/9.0* (Linux*)*] +Parent=Opera 9.0 Platform=Linux -[Opera/7.6* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.6 +[Opera/9.0* (Macintosh; *Mac OS X;*)*] +Parent=Opera 9.0 Platform=MacOSX -[Opera/7.6* (Windows 95*)*] -Parent=Opera 7.6 +[Opera/9.0* (Windows 95*)*] +Parent=Opera 9.0 Platform=Win95 Win32=true -[Opera/7.6* (Windows 98*)*] -Parent=Opera 7.6 +[Opera/9.0* (Windows 98*)*] +Parent=Opera 9.0 Platform=Win98 Win32=true -[Opera/7.6* (Windows ME*)*] -Parent=Opera 7.6 +[Opera/9.0* (Windows CE*)*] +Parent=Opera 9.0 +Platform=WinCE +Win32=true + +[Opera/9.0* (Windows ME*)*] +Parent=Opera 9.0 Platform=WinME Win32=true -[Opera/7.6* (Windows NT 4.0*)*] -Parent=Opera 7.6 +[Opera/9.0* (Windows NT 4.0*)*] +Parent=Opera 9.0 Platform=WinNT Win32=true -[Opera/7.6* (Windows NT 5.0*)*] -Parent=Opera 7.6 +[Opera/9.0* (Windows NT 5.0*)*] +Parent=Opera 9.0 Platform=Win2000 Win32=true -[Opera/7.6* (Windows NT 5.1*)*] -Parent=Opera 7.6 +[Opera/9.0* (Windows NT 5.1*)*] +Parent=Opera 9.0 Platform=WinXP Win32=true -[Opera/7.6* (Windows NT 5.2*)*] -Parent=Opera 7.6 +[Opera/9.0* (Windows NT 5.2*)*] +Parent=Opera 9.0 Platform=Win2003 Win32=true -[Opera/7.6* (Windows XP*)*] -Parent=Opera 7.6 +[Opera/9.0* (Windows NT 6.0*)*] +Parent=Opera 9.0 +Platform=WinVista +Win32=true + +[Opera/9.0* (Windows XP*)*] +Parent=Opera 9.0 Platform=WinXP Win32=true -[Opera/7.6* (X11; FreeBSD*)*] -Parent=Opera 7.6 +[Opera/9.0* (X11; FreeBSD*)*] +Parent=Opera 9.0 Platform=FreeBSD -[Opera/7.6* (X11; Linux*)*] -Parent=Opera 7.6 +[Opera/9.0* (X11; Linux*)*] +Parent=Opera 9.0 Platform=Linux -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.1 -[Opera 8.0] +[Opera 9.1] Parent=DefaultProperties Browser=Opera -Version=8.0 -MajorVer=8 +Version=9.1 +MajorVer=9 +MinorVer=1 Frames=true IFrames=true Tables=true @@ -11814,197 +10992,214 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.1*] +Parent=Opera 9.1 Platform=Linux -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X; *) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.1*] +Parent=Opera 9.1 Platform=MacOSX -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC;*) Opera 9.1*] +Parent=Opera 9.1 Platform=MacPPC -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.1*] +Parent=Opera 9.1 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.1*] +Parent=Opera 9.1 Platform=Win95 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.1*] +Parent=Opera 9.1 Platform=Win98 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.1*] +Parent=Opera 9.1 Platform=WinCE Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.1*] +Parent=Opera 9.1 Platform=WinME Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.1*] +Parent=Opera 9.1 Platform=WinNT Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.1*] +Parent=Opera 9.1 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.1*] +Parent=Opera 9.1 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 +[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.1*] +Parent=Opera 9.1 +Platform=Win2003 +Win32=true + +[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.1*] +Parent=Opera 9.1 +Platform=WinVista Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.1*] +Parent=Opera 9.1 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.1*] +Parent=Opera 9.1 Platform=FreeBSD -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.1*] +Parent=Opera 9.1 Platform=Linux -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.1*] +Parent=Opera 9.1 +Platform=SunOS + +[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.1*] +Parent=Opera 9.1 Platform=MacOSX -[Mozilla/?.* (Windows 2000; *) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (Windows 2000;*) Opera 9.1*] +Parent=Opera 9.1 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows 95; *) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (Windows 95;*) Opera 9.1*] +Parent=Opera 9.1 Platform=Win95 Win32=true -[Mozilla/?.* (Windows 98; *) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (Windows 98;*) Opera 9.1*] +Parent=Opera 9.1 Platform=Win98 Win32=true -[Mozilla/?.* (Windows ME; *) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (Windows ME;*) Opera 9.1*] +Parent=Opera 9.1 Platform=WinME Win32=true -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (Windows NT 4.0;*) Opera 9.1*] +Parent=Opera 9.1 Platform=WinNT Win32=true -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (Windows NT 5.0;*) Opera 9.1*] +Parent=Opera 9.1 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (Windows NT 5.1;*) Opera 9.1*] +Parent=Opera 9.1 Platform=WinXP Win32=true -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (Windows NT 5.2;*) Opera 9.1*] +Parent=Opera 9.1 Platform=Win2003 Win32=true -[Mozilla/?.* (X11; Linux*; *) Opera 8.0*] -Parent=Opera 8.0 +[Mozilla/* (X11; Linux*) Opera 9.1*] +Parent=Opera 9.1 Platform=Linux -[Opera/8.0* (Linux*)*] -Parent=Opera 8.0 +[Opera/9.1* (Linux*)*] +Parent=Opera 9.1 Platform=Linux -[Opera/8.0* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.0 +[Opera/9.1* (Macintosh; *Mac OS X;*)*] +Parent=Opera 9.1 Platform=MacOSX -[Opera/8.0* (Windows 95*)*] -Parent=Opera 8.0 +[Opera/9.1* (Windows 95*)*] +Parent=Opera 9.1 Platform=Win95 Win32=true -[Opera/8.0* (Windows 98*)*] -Parent=Opera 8.0 +[Opera/9.1* (Windows 98*)*] +Parent=Opera 9.1 Platform=Win98 Win32=true -[Opera/8.0* (Windows CE*)*] -Parent=Opera 8.0 +[Opera/9.1* (Windows CE*)*] +Parent=Opera 9.1 Platform=WinCE Win32=true -[Opera/8.0* (Windows ME*)*] -Parent=Opera 8.0 +[Opera/9.1* (Windows ME*)*] +Parent=Opera 9.1 Platform=WinME Win32=true -[Opera/8.0* (Windows NT 4.0*)*] -Parent=Opera 8.0 +[Opera/9.1* (Windows NT 4.0*)*] +Parent=Opera 9.1 Platform=WinNT Win32=true -[Opera/8.0* (Windows NT 5.0*)*] -Parent=Opera 8.0 +[Opera/9.1* (Windows NT 5.0*)*] +Parent=Opera 9.1 Platform=Win2000 Win32=true -[Opera/8.0* (Windows NT 5.1*)*] -Parent=Opera 8.0 +[Opera/9.1* (Windows NT 5.1*)*] +Parent=Opera 9.1 Platform=WinXP Win32=true -[Opera/8.0* (Windows NT 5.2*)*] -Parent=Opera 8.0 +[Opera/9.1* (Windows NT 5.2*)*] +Parent=Opera 9.1 Platform=Win2003 Win32=true -[Opera/8.0* (Windows XP*)*] -Parent=Opera 8.0 +[Opera/9.1* (Windows NT 6.0*)*] +Parent=Opera 9.1 +Platform=WinVista +Win32=true + +[Opera/9.1* (Windows XP*)*] +Parent=Opera 9.1 Platform=WinXP Win32=true -[Opera/8.0* (X11; FreeBSD*)*] -Parent=Opera 8.0 +[Opera/9.1* (X11; FreeBSD*)*] +Parent=Opera 9.1 Platform=FreeBSD -[Opera/8.0* (X11; Linux*)*] -Parent=Opera 8.0 +[Opera/9.1* (X11; Linux*)*] +Parent=Opera 9.1 Platform=Linux -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.1 +[Opera/9.1* (X11; SunOS*)*] +Parent=Opera 9.1 +Platform=SunOS -[Opera 8.1] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.2 + +[Opera 9.2] Parent=DefaultProperties Browser=Opera -Version=8.1 -MajorVer=8 -MinorVer=1 +Version=9.2 +MajorVer=9 +MinorVer=2 Frames=true IFrames=true Tables=true @@ -12012,193 +11207,230 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.2*] +Parent=Opera 9.2 Platform=Linux -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.2*] +Parent=Opera 9.2 +Platform=MacOSX + +[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.2*] +Parent=Opera 9.2 Platform=MacPPC -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.2*] +Parent=Opera 9.2 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.2*] +Parent=Opera 9.2 Platform=Win95 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.2*] +Parent=Opera 9.2 Platform=Win98 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.2*] +Parent=Opera 9.2 Platform=WinCE Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.2*] +Parent=Opera 9.2 Platform=WinME Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.2*] +Parent=Opera 9.2 Platform=WinNT Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.2*] +Parent=Opera 9.2 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.2*] +Parent=Opera 9.2 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.2*] +Parent=Opera 9.2 Platform=Win2003 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.2*] +Parent=Opera 9.2 +Platform=WinVista +Win32=true + +[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.2*] +Parent=Opera 9.2 +Platform=Win7 + +[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.2*] +Parent=Opera 9.2 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.2*] +Parent=Opera 9.2 Platform=FreeBSD -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.2*] +Parent=Opera 9.2 Platform=Linux -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.2*] +Parent=Opera 9.2 +Platform=SunOS + +[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.2*] +Parent=Opera 9.2 Platform=MacOSX -[Mozilla/?.* (Windows 2000; *) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (Windows 2000;*) Opera 9.2*] +Parent=Opera 9.2 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows 95; *) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (Windows 95;*) Opera 9.2*] +Parent=Opera 9.2 Platform=Win95 Win32=true -[Mozilla/?.* (Windows 98; *) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (Windows 98;*) Opera 9.2*] +Parent=Opera 9.2 Platform=Win98 Win32=true -[Mozilla/?.* (Windows ME; *) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (Windows ME;*) Opera 9.2*] +Parent=Opera 9.2 Platform=WinME Win32=true -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (Windows NT 4.0;*) Opera 9.2*] +Parent=Opera 9.2 Platform=WinNT Win32=true -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (Windows NT 5.0;*) Opera 9.2*] +Parent=Opera 9.2 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (Windows NT 5.1;*) Opera 9.2*] +Parent=Opera 9.2 Platform=WinXP Win32=true -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (Windows NT 5.2;*) Opera 9.2*] +Parent=Opera 9.2 Platform=Win2003 Win32=true -[Mozilla/?.* (X11; Linux*; *) Opera 8.1*] -Parent=Opera 8.1 +[Mozilla/* (Windows NT 6.0;*) Opera 9.2*] +Parent=Opera 9.2 +Platform=WinVista + +[Mozilla/* (Windows NT 6.1;*) Opera 9.2*] +Parent=Opera 9.2 +Platform=Win7 + +[Mozilla/* (X11; Linux*) Opera 9.2*] +Parent=Opera 9.2 Platform=Linux -[Opera/8.1* (Linux*)*] -Parent=Opera 8.1 +[Opera/9.2* (Linux*)*] +Parent=Opera 9.2 Platform=Linux -[Opera/8.1* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.1 +[Opera/9.2* (Macintosh; *Mac OS X;*)*] +Parent=Opera 9.2 Platform=MacOSX -[Opera/8.1* (Windows 95*)*] -Parent=Opera 8.1 +[Opera/9.2* (Windows 95*)*] +Parent=Opera 9.2 Platform=Win95 Win32=true -[Opera/8.1* (Windows 98*)*] -Parent=Opera 8.1 +[Opera/9.2* (Windows 98*)*] +Parent=Opera 9.2 Platform=Win98 Win32=true -[Opera/8.1* (Windows CE*)*] -Parent=Opera 8.1 +[Opera/9.2* (Windows CE*)*] +Parent=Opera 9.2 Platform=WinCE Win32=true -[Opera/8.1* (Windows ME*)*] -Parent=Opera 8.1 +[Opera/9.2* (Windows ME*)*] +Parent=Opera 9.2 Platform=WinME Win32=true -[Opera/8.1* (Windows NT 4.0*)*] -Parent=Opera 8.1 +[Opera/9.2* (Windows NT 4.0*)*] +Parent=Opera 9.2 Platform=WinNT Win32=true -[Opera/8.1* (Windows NT 5.0*)*] -Parent=Opera 8.1 +[Opera/9.2* (Windows NT 5.0*)*] +Parent=Opera 9.2 Platform=Win2000 Win32=true -[Opera/8.1* (Windows NT 5.1*)*] -Parent=Opera 8.1 +[Opera/9.2* (Windows NT 5.1*)*] +Parent=Opera 9.2 Platform=WinXP Win32=true -[Opera/8.1* (Windows NT 5.2*)*] -Parent=Opera 8.1 +[Opera/9.2* (Windows NT 5.2*)*] +Parent=Opera 9.2 Platform=Win2003 Win32=true -[Opera/8.1* (Windows XP*)*] -Parent=Opera 8.1 +[Opera/9.2* (Windows NT 6.0*)*] +Parent=Opera 9.2 +Platform=WinVista +Win32=true + +[Opera/9.2* (Windows NT 6.1*)*] +Parent=Opera 9.2 +Platform=Win7 + +[Opera/9.2* (Windows XP*)*] +Parent=Opera 9.2 Platform=WinXP Win32=true -[Opera/8.1* (X11; FreeBSD*)*] -Parent=Opera 8.1 +[Opera/9.2* (X11; FreeBSD*)*] +Parent=Opera 9.2 Platform=FreeBSD -[Opera/8.1* (X11; Linux*)*] -Parent=Opera 8.1 +[Opera/9.2* (X11; Linux*)*] +Parent=Opera 9.2 Platform=Linux -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.5 +[Opera/9.2* (X11; SunOS*)*] +Parent=Opera 9.2 +Platform=SunOS -[Opera 8.5] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.3 + +[Opera 9.3] Parent=DefaultProperties Browser=Opera -Version=8.5 -MajorVer=8 -MinorVer=5 +Version=9.3 +MajorVer=9 +MinorVer=3 Frames=true IFrames=true Tables=true @@ -12206,202 +11438,230 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.3*] +Parent=Opera 9.3 Platform=Linux -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.3*] +Parent=Opera 9.3 Platform=MacOSX -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.3*] +Parent=Opera 9.3 Platform=MacPPC -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.3*] +Parent=Opera 9.3 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.3*] +Parent=Opera 9.3 Platform=Win95 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.3*] +Parent=Opera 9.3 Platform=Win98 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.3*] +Parent=Opera 9.3 Platform=WinCE Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.3*] +Parent=Opera 9.3 Platform=WinME Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.3*] +Parent=Opera 9.3 Platform=WinNT Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.3*] +Parent=Opera 9.3 Platform=Win2000 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.3*] +Parent=Opera 9.3 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.3*] +Parent=Opera 9.3 Platform=Win2003 Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.3*] +Parent=Opera 9.3 +Platform=WinVista +Win32=true + +[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.3*] +Parent=Opera 9.3 +Platform=Win7 + +[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.3*] +Parent=Opera 9.3 Platform=WinXP Win32=true -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.3*] +Parent=Opera 9.3 Platform=FreeBSD -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.3*] +Parent=Opera 9.3 Platform=Linux -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX +[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.3*] +Parent=Opera 9.3 +Platform=SunOS -[Mozilla/?.* (Macintosh; PPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.3*] +Parent=Opera 9.3 Platform=MacOSX -[Mozilla/?.* (Windows 2000; *) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (Windows 2000;*) Opera 9.3*] +Parent=Opera 9.3 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows 95; *) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (Windows 95;*) Opera 9.3*] +Parent=Opera 9.3 Platform=Win95 Win32=true -[Mozilla/?.* (Windows 98; *) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (Windows 98;*) Opera 9.3*] +Parent=Opera 9.3 Platform=Win98 Win32=true -[Mozilla/?.* (Windows ME; *) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (Windows ME;*) Opera 9.3*] +Parent=Opera 9.3 Platform=WinME Win32=true -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (Windows NT 4.0;*) Opera 9.3*] +Parent=Opera 9.3 Platform=WinNT Win32=true -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (Windows NT 5.0;*) Opera 9.3*] +Parent=Opera 9.3 Platform=Win2000 Win32=true -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (Windows NT 5.1;*) Opera 9.3*] +Parent=Opera 9.3 Platform=WinXP Win32=true -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (Windows NT 5.2;*) Opera 9.3*] +Parent=Opera 9.3 Platform=Win2003 Win32=true -[Mozilla/?.* (X11; Linux*; *) Opera 8.5*] -Parent=Opera 8.5 +[Mozilla/* (Windows NT 6.0;*) Opera 9.3*] +Parent=Opera 9.3 +Platform=WinVista + +[Mozilla/* (Windows NT 6.1;*) Opera 9.3*] +Parent=Opera 9.3 +Platform=Win7 + +[Mozilla/* (X11; Linux*) Opera 9.3*] +Parent=Opera 9.3 Platform=Linux -[Opera/8.5* (Linux*)*] -Parent=Opera 8.5 +[Opera/9.3* (Linux*)*] +Parent=Opera 9.3 Platform=Linux -[Opera/8.5* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.5 +[Opera/9.3* (Macintosh; *Mac OS X;*)*] +Parent=Opera 9.3 Platform=MacOSX -[Opera/8.5* (Windows 95*)*] -Parent=Opera 8.5 +[Opera/9.3* (Windows 95*)*] +Parent=Opera 9.3 Platform=Win95 Win32=true -[Opera/8.5* (Windows 98*)*] -Parent=Opera 8.5 +[Opera/9.3* (Windows 98*)*] +Parent=Opera 9.3 Platform=Win98 Win32=true -[Opera/8.5* (Windows CE*)*] -Parent=Opera 8.5 +[Opera/9.3* (Windows CE*)*] +Parent=Opera 9.3 Platform=WinCE Win32=true -[Opera/8.5* (Windows ME*)*] -Parent=Opera 8.5 +[Opera/9.3* (Windows ME*)*] +Parent=Opera 9.3 Platform=WinME Win32=true -[Opera/8.5* (Windows NT 4.0*)*] -Parent=Opera 8.5 +[Opera/9.3* (Windows NT 4.0*)*] +Parent=Opera 9.3 Platform=WinNT Win32=true -[Opera/8.5* (Windows NT 5.0*)*] -Parent=Opera 8.5 +[Opera/9.3* (Windows NT 5.0*)*] +Parent=Opera 9.3 Platform=Win2000 Win32=true -[Opera/8.5* (Windows NT 5.1*)*] -Parent=Opera 8.5 +[Opera/9.3* (Windows NT 5.1*)*] +Parent=Opera 9.3 Platform=WinXP Win32=true -[Opera/8.5* (Windows NT 5.2*)*] -Parent=Opera 8.5 +[Opera/9.3* (Windows NT 5.2*)*] +Parent=Opera 9.3 Platform=Win2003 Win32=true -[Opera/8.5* (Windows XP*)*] -Parent=Opera 8.5 +[Opera/9.3* (Windows NT 6.0*)*] +Parent=Opera 9.3 +Platform=WinVista +Win32=true + +[Opera/9.3* (Windows NT 6.1*)*] +Parent=Opera 9.3 +Platform=Win7 + +[Opera/9.3* (Windows XP*)*] +Parent=Opera 9.3 Platform=WinXP Win32=true -[Opera/8.5* (X11; FreeBSD*)*] -Parent=Opera 8.5 +[Opera/9.3* (X11; FreeBSD*)*] +Parent=Opera 9.3 Platform=FreeBSD -[Opera/8.5* (X11; Linux*)*] -Parent=Opera 8.5 +[Opera/9.3* (X11; Linux*)*] +Parent=Opera 9.3 Platform=Linux -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.0 +[Opera/9.3* (X11; SunOS*)*] +Parent=Opera 9.3 +Platform=SunOS -[Opera 9.0] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.4 + +[Opera 9.4] Parent=DefaultProperties Browser=Opera -Version=9.0 +Version=9.4 MajorVer=9 +MinorVer=4 Frames=true IFrames=true Tables=true @@ -12409,213 +11669,230 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.4*] +Parent=Opera 9.4 Platform=Linux -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.4*] +Parent=Opera 9.4 Platform=MacOSX -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.4*] +Parent=Opera 9.4 Platform=MacPPC -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.4*] +Parent=Opera 9.4 Platform=Win2000 Win32=true -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.4*] +Parent=Opera 9.4 Platform=Win95 Win32=true -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.4*] +Parent=Opera 9.4 Platform=Win98 Win32=true -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.4*] +Parent=Opera 9.4 Platform=WinCE Win32=true -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.4*] +Parent=Opera 9.4 Platform=WinME Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.4*] +Parent=Opera 9.4 Platform=WinNT Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.4*] +Parent=Opera 9.4 Platform=Win2000 Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.4*] +Parent=Opera 9.4 Platform=WinXP Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.4*] +Parent=Opera 9.4 Platform=Win2003 Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.4*] +Parent=Opera 9.4 Platform=WinVista Win32=true -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.4*] +Parent=Opera 9.4 +Platform=Win7 + +[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.4*] +Parent=Opera 9.4 Platform=WinXP Win32=true -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.4*] +Parent=Opera 9.4 Platform=FreeBSD -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.4*] +Parent=Opera 9.4 Platform=Linux -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.4*] +Parent=Opera 9.4 Platform=SunOS -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.4*] +Parent=Opera 9.4 Platform=MacOSX -[Mozilla/* (Windows 2000;*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (Windows 2000;*) Opera 9.4*] +Parent=Opera 9.4 Platform=Win2000 Win32=true -[Mozilla/* (Windows 95;*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (Windows 95;*) Opera 9.4*] +Parent=Opera 9.4 Platform=Win95 Win32=true -[Mozilla/* (Windows 98;*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (Windows 98;*) Opera 9.4*] +Parent=Opera 9.4 Platform=Win98 Win32=true -[Mozilla/* (Windows ME;*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (Windows ME;*) Opera 9.4*] +Parent=Opera 9.4 Platform=WinME Win32=true -[Mozilla/* (Windows NT 4.0;*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (Windows NT 4.0;*) Opera 9.4*] +Parent=Opera 9.4 Platform=WinNT Win32=true -[Mozilla/* (Windows NT 5.0;*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (Windows NT 5.0;*) Opera 9.4*] +Parent=Opera 9.4 Platform=Win2000 Win32=true -[Mozilla/* (Windows NT 5.1;*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (Windows NT 5.1;*) Opera 9.4*] +Parent=Opera 9.4 Platform=WinXP Win32=true -[Mozilla/* (Windows NT 5.2;*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (Windows NT 5.2;*) Opera 9.4*] +Parent=Opera 9.4 Platform=Win2003 Win32=true -[Mozilla/* (X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 +[Mozilla/* (Windows NT 6.0;*) Opera 9.4*] +Parent=Opera 9.4 +Platform=WinVista + +[Mozilla/* (Windows NT 6.1;*) Opera 9.4*] +Parent=Opera 9.4 +Platform=Win7 + +[Mozilla/* (X11; Linux*) Opera 9.4*] +Parent=Opera 9.4 Platform=Linux -[Opera/9.0* (Linux*)*] -Parent=Opera 9.0 +[Opera/9.4* (Linux*)*] +Parent=Opera 9.4 Platform=Linux -[Opera/9.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.0 +[Opera/9.4* (Macintosh; *Mac OS X;*)*] +Parent=Opera 9.4 Platform=MacOSX -[Opera/9.0* (Windows 95*)*] -Parent=Opera 9.0 +[Opera/9.4* (Windows 95*)*] +Parent=Opera 9.4 Platform=Win95 Win32=true -[Opera/9.0* (Windows 98*)*] -Parent=Opera 9.0 +[Opera/9.4* (Windows 98*)*] +Parent=Opera 9.4 Platform=Win98 Win32=true -[Opera/9.0* (Windows CE*)*] -Parent=Opera 9.0 +[Opera/9.4* (Windows CE*)*] +Parent=Opera 9.4 Platform=WinCE Win32=true -[Opera/9.0* (Windows ME*)*] -Parent=Opera 9.0 +[Opera/9.4* (Windows ME*)*] +Parent=Opera 9.4 Platform=WinME Win32=true -[Opera/9.0* (Windows NT 4.0*)*] -Parent=Opera 9.0 +[Opera/9.4* (Windows NT 4.0*)*] +Parent=Opera 9.4 Platform=WinNT Win32=true -[Opera/9.0* (Windows NT 5.0*)*] -Parent=Opera 9.0 +[Opera/9.4* (Windows NT 5.0*)*] +Parent=Opera 9.4 Platform=Win2000 Win32=true -[Opera/9.0* (Windows NT 5.1*)*] -Parent=Opera 9.0 +[Opera/9.4* (Windows NT 5.1*)*] +Parent=Opera 9.4 Platform=WinXP Win32=true -[Opera/9.0* (Windows NT 5.2*)*] -Parent=Opera 9.0 +[Opera/9.4* (Windows NT 5.2*)*] +Parent=Opera 9.4 Platform=Win2003 Win32=true -[Opera/9.0* (Windows NT 6.0*)*] -Parent=Opera 9.0 +[Opera/9.4* (Windows NT 6.0*)*] +Parent=Opera 9.4 Platform=WinVista Win32=true -[Opera/9.0* (Windows XP*)*] -Parent=Opera 9.0 +[Opera/9.4* (Windows NT 6.1*)*] +Parent=Opera 9.4 +Platform=Win7 + +[Opera/9.4* (Windows XP*)*] +Parent=Opera 9.4 Platform=WinXP Win32=true -[Opera/9.0* (X11; FreeBSD*)*] -Parent=Opera 9.0 +[Opera/9.4* (X11; FreeBSD*)*] +Parent=Opera 9.4 Platform=FreeBSD -[Opera/9.0* (X11; Linux*)*] -Parent=Opera 9.0 +[Opera/9.4* (X11; Linux*)*] +Parent=Opera 9.4 Platform=Linux -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.1 +[Opera/9.4* (X11; SunOS*)*] +Parent=Opera 9.4 +Platform=SunOS + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.5 -[Opera 9.1] +[Opera 9.5] Parent=DefaultProperties Browser=Opera -Version=9.1 +Version=9.5 MajorVer=9 -MinorVer=1 +MinorVer=5 Frames=true IFrames=true Tables=true @@ -12623,212 +11900,230 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.5*] +Parent=Opera 9.5 Platform=Linux -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.5*] +Parent=Opera 9.5 Platform=MacOSX -[Mozilla/* (compatible; MSIE*; Mac_PowerPC;*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.5*] +Parent=Opera 9.5 Platform=MacPPC -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.5*] +Parent=Opera 9.5 Platform=Win2000 Win32=true -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.5*] +Parent=Opera 9.5 Platform=Win95 Win32=true -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.5*] +Parent=Opera 9.5 Platform=Win98 Win32=true -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.5*] +Parent=Opera 9.5 Platform=WinCE Win32=true -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.5*] +Parent=Opera 9.5 Platform=WinME Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.5*] +Parent=Opera 9.5 Platform=WinNT Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.5*] +Parent=Opera 9.5 Platform=Win2000 Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.5*] +Parent=Opera 9.5 Platform=WinXP Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.5*] +Parent=Opera 9.5 Platform=Win2003 Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.5*] +Parent=Opera 9.5 Platform=WinVista Win32=true -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.5*] +Parent=Opera 9.5 +Platform=Win7 + +[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.5*] +Parent=Opera 9.5 Platform=WinXP Win32=true -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.5*] +Parent=Opera 9.5 Platform=FreeBSD -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.5*] +Parent=Opera 9.5 Platform=Linux -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.5*] +Parent=Opera 9.5 Platform=SunOS -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.5*] +Parent=Opera 9.5 Platform=MacOSX -[Mozilla/* (Windows 2000;*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (Windows 2000;*) Opera 9.5*] +Parent=Opera 9.5 Platform=Win2000 Win32=true -[Mozilla/* (Windows 95;*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (Windows 95;*) Opera 9.5*] +Parent=Opera 9.5 Platform=Win95 Win32=true -[Mozilla/* (Windows 98;*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (Windows 98;*) Opera 9.5*] +Parent=Opera 9.5 Platform=Win98 Win32=true -[Mozilla/* (Windows ME;*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (Windows ME;*) Opera 9.5*] +Parent=Opera 9.5 Platform=WinME Win32=true -[Mozilla/* (Windows NT 4.0;*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (Windows NT 4.0;*) Opera 9.5*] +Parent=Opera 9.5 Platform=WinNT Win32=true -[Mozilla/* (Windows NT 5.0;*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (Windows NT 5.0;*) Opera 9.5*] +Parent=Opera 9.5 Platform=Win2000 Win32=true -[Mozilla/* (Windows NT 5.1;*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (Windows NT 5.1;*) Opera 9.5*] +Parent=Opera 9.5 Platform=WinXP Win32=true -[Mozilla/* (Windows NT 5.2;*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (Windows NT 5.2;*) Opera 9.5*] +Parent=Opera 9.5 Platform=Win2003 Win32=true -[Mozilla/* (X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 +[Mozilla/* (Windows NT 6.0;*) Opera 9.5*] +Parent=Opera 9.5 +Platform=WinVista + +[Mozilla/* (Windows NT 6.1;*) Opera 9.5*] +Parent=Opera 9.5 +Platform=Win7 + +[Mozilla/* (X11; Linux*) Opera 9.5*] +Parent=Opera 9.5 Platform=Linux -[Opera/9.1* (Linux*)*] -Parent=Opera 9.1 +[Opera/9.5* (Linux*)*] +Parent=Opera 9.5 Platform=Linux -[Opera/9.1* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.1 +[Opera/9.5* (Macintosh; *Mac OS X;*)*] +Parent=Opera 9.5 Platform=MacOSX -[Opera/9.1* (Windows 95*)*] -Parent=Opera 9.1 +[Opera/9.5* (Windows 95*)*] +Parent=Opera 9.5 Platform=Win95 Win32=true -[Opera/9.1* (Windows 98*)*] -Parent=Opera 9.1 +[Opera/9.5* (Windows 98*)*] +Parent=Opera 9.5 Platform=Win98 Win32=true -[Opera/9.1* (Windows CE*)*] -Parent=Opera 9.1 +[Opera/9.5* (Windows CE*)*] +Parent=Opera 9.5 Platform=WinCE Win32=true -[Opera/9.1* (Windows ME*)*] -Parent=Opera 9.1 +[Opera/9.5* (Windows ME*)*] +Parent=Opera 9.5 Platform=WinME Win32=true -[Opera/9.1* (Windows NT 4.0*)*] -Parent=Opera 9.1 +[Opera/9.5* (Windows NT 4.0*)*] +Parent=Opera 9.5 Platform=WinNT Win32=true -[Opera/9.1* (Windows NT 5.0*)*] -Parent=Opera 9.1 +[Opera/9.5* (Windows NT 5.0*)*] +Parent=Opera 9.5 Platform=Win2000 Win32=true -[Opera/9.1* (Windows NT 5.1*)*] -Parent=Opera 9.1 +[Opera/9.5* (Windows NT 5.1*)*] +Parent=Opera 9.5 Platform=WinXP Win32=true -[Opera/9.1* (Windows NT 5.2*)*] -Parent=Opera 9.1 +[Opera/9.5* (Windows NT 5.2*)*] +Parent=Opera 9.5 Platform=Win2003 Win32=true -[Opera/9.1* (Windows NT 6.0*)*] -Parent=Opera 9.1 +[Opera/9.5* (Windows NT 6.0*)*] +Parent=Opera 9.5 Platform=WinVista Win32=true -[Opera/9.1* (Windows XP*)*] -Parent=Opera 9.1 +[Opera/9.5* (Windows NT 6.1*)*] +Parent=Opera 9.5 +Platform=Win7 + +[Opera/9.5* (Windows XP*)*] +Parent=Opera 9.5 Platform=WinXP Win32=true -[Opera/9.1* (X11; FreeBSD*)*] -Parent=Opera 9.1 +[Opera/9.5* (X11; FreeBSD*)*] +Parent=Opera 9.5 Platform=FreeBSD -[Opera/9.1* (X11; Linux*)*] -Parent=Opera 9.1 +[Opera/9.5* (X11; Linux*)*] +Parent=Opera 9.5 Platform=Linux -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.2 +[Opera/9.5* (X11; SunOS*)*] +Parent=Opera 9.5 +Platform=SunOS -[Opera 9.2] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.6 + +[Opera 9.6] Parent=DefaultProperties -Browser=Opera 9.2 -Version=9.2 +Browser=Opera +Version=9.6 MajorVer=9 -MinorVer=2 -Beta=true +MinorVer=6 Frames=true IFrames=true Tables=true @@ -12836,203 +12131,222 @@ Cookies=true BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.6*] +Parent=Opera 9.6 Platform=Linux -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.6*] +Parent=Opera 9.6 Platform=MacOSX -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.6*] +Parent=Opera 9.6 Platform=MacPPC -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.6*] +Parent=Opera 9.6 Platform=Win2000 Win32=true -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.6*] +Parent=Opera 9.6 Platform=Win95 Win32=true -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.6*] +Parent=Opera 9.6 Platform=Win98 Win32=true -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.6*] +Parent=Opera 9.6 Platform=WinCE Win32=true -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.6*] +Parent=Opera 9.6 Platform=WinME Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.6*] +Parent=Opera 9.6 Platform=WinNT Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.6*] +Parent=Opera 9.6 Platform=Win2000 Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.6*] +Parent=Opera 9.6 Platform=WinXP Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.6*] +Parent=Opera 9.6 Platform=Win2003 Win32=true -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.6*] +Parent=Opera 9.6 Platform=WinVista Win32=true -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.6*] +Parent=Opera 9.6 +Platform=Win7 + +[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.6*] +Parent=Opera 9.6 Platform=WinXP Win32=true -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.6*] +Parent=Opera 9.6 Platform=FreeBSD -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.6*] +Parent=Opera 9.6 Platform=Linux -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.6*] +Parent=Opera 9.6 Platform=SunOS -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.6*] +Parent=Opera 9.6 Platform=MacOSX -[Mozilla/* (Windows 2000;*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (Windows 2000;*) Opera 9.6*] +Parent=Opera 9.6 Platform=Win2000 Win32=true -[Mozilla/* (Windows 95;*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (Windows 95;*) Opera 9.6*] +Parent=Opera 9.6 Platform=Win95 Win32=true -[Mozilla/* (Windows 98;*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (Windows 98;*) Opera 9.6*] +Parent=Opera 9.6 Platform=Win98 Win32=true -[Mozilla/* (Windows ME;*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (Windows ME;*) Opera 9.6*] +Parent=Opera 9.6 Platform=WinME Win32=true -[Mozilla/* (Windows NT 4.0;*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (Windows NT 4.0;*) Opera 9.6*] +Parent=Opera 9.6 Platform=WinNT Win32=true -[Mozilla/* (Windows NT 5.0;*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (Windows NT 5.0;*) Opera 9.6*] +Parent=Opera 9.6 Platform=Win2000 Win32=true -[Mozilla/* (Windows NT 5.1;*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (Windows NT 5.1;*) Opera 9.6*] +Parent=Opera 9.6 Platform=WinXP Win32=true -[Mozilla/* (Windows NT 5.2;*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (Windows NT 5.2;*) Opera 9.6*] +Parent=Opera 9.6 Platform=Win2003 Win32=true -[Mozilla/* (X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 +[Mozilla/* (Windows NT 6.0;*) Opera 9.6*] +Parent=Opera 9.6 +Platform=WinVista + +[Mozilla/* (Windows NT 6.1;*) Opera 9.6*] +Parent=Opera 9.6 +Platform=Win7 + +[Mozilla/* (X11; Linux*) Opera 9.6*] +Parent=Opera 9.6 Platform=Linux -[Opera/9.2* (Linux*)*] -Parent=Opera 9.2 +[Opera/9.6* (Linux*)*] +Parent=Opera 9.6 Platform=Linux -[Opera/9.2* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.2 +[Opera/9.6* (Macintosh; *Mac OS X;*)*] +Parent=Opera 9.6 Platform=MacOSX -[Opera/9.2* (Windows 95*)*] -Parent=Opera 9.2 +[Opera/9.6* (Windows 95*)*] +Parent=Opera 9.6 Platform=Win95 Win32=true -[Opera/9.2* (Windows 98*)*] -Parent=Opera 9.2 +[Opera/9.6* (Windows 98*)*] +Parent=Opera 9.6 Platform=Win98 Win32=true -[Opera/9.2* (Windows CE*)*] -Parent=Opera 9.2 +[Opera/9.6* (Windows CE*)*] +Parent=Opera 9.6 Platform=WinCE Win32=true -[Opera/9.2* (Windows ME*)*] -Parent=Opera 9.2 +[Opera/9.6* (Windows ME*)*] +Parent=Opera 9.6 Platform=WinME Win32=true -[Opera/9.2* (Windows NT 4.0*)*] -Parent=Opera 9.2 +[Opera/9.6* (Windows NT 4.0*)*] +Parent=Opera 9.6 Platform=WinNT Win32=true -[Opera/9.2* (Windows NT 5.0*)*] -Parent=Opera 9.2 +[Opera/9.6* (Windows NT 5.0*)*] +Parent=Opera 9.6 Platform=Win2000 Win32=true -[Opera/9.2* (Windows NT 5.1*)*] -Parent=Opera 9.2 +[Opera/9.6* (Windows NT 5.1*)*] +Parent=Opera 9.6 Platform=WinXP Win32=true -[Opera/9.2* (Windows NT 5.2*)*] -Parent=Opera 9.2 +[Opera/9.6* (Windows NT 5.2*)*] +Parent=Opera 9.6 Platform=Win2003 Win32=true -[Opera/9.2* (Windows NT 6.0*)*] -Parent=Opera 9.2 +[Opera/9.6* (Windows NT 6.0*)*] +Parent=Opera 9.6 Platform=WinVista Win32=true -[Opera/9.2* (Windows XP*)*] -Parent=Opera 9.2 +[Opera/9.6* (Windows NT 6.1*)*] +Parent=Opera 9.6 +Platform=Win7 + +[Opera/9.6* (Windows XP*)*] +Parent=Opera 9.6 Platform=WinXP Win32=true -[Opera/9.2* (X11; FreeBSD*)*] -Parent=Opera 9.2 +[Opera/9.6* (X11; FreeBSD*)*] +Parent=Opera 9.6 Platform=FreeBSD -[Opera/9.2* (X11; Linux*)*] -Parent=Opera 9.2 +[Opera/9.6* (X11; Linux*)*] +Parent=Opera 9.6 Platform=Linux +[Opera/9.6* (X11; SunOS*)*] +Parent=Opera 9.6 +Platform=SunOS + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.0 [Netscape 4.0] @@ -13045,7 +12359,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=1 CssVersion=1 supportsCSS=true @@ -13088,7 +12401,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=1 CssVersion=1 supportsCSS=true @@ -13184,7 +12496,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=1 CssVersion=1 supportsCSS=true @@ -13192,9 +12503,6 @@ supportsCSS=true Parent=Netscape 4.6 Platform=OS/2 -[Mozilla/4.6*(CJPENNYCATE 3.2.11££tst 101000562$$)] -Parent=Netscape 4.6 - [Mozilla/4.6*(Macintosh; ?; PPC)] Parent=Netscape 4.6 Platform=MacPPC @@ -13257,7 +12565,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=1 CssVersion=1 supportsCSS=true @@ -13773,7 +13080,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=1 CssVersion=1 supportsCSS=true @@ -13836,7 +13142,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true @@ -13874,6 +13179,18 @@ Parent=Netscape 6.0 Platform=WinXP Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.0*] +Parent=Netscape 6.0 +Platform=WinXP + +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.0*] +Parent=Netscape 6.0 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.0*] +Parent=Netscape 6.0 +Platform=Win7 + [Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.0*] Parent=Netscape 6.0 Platform=WinNT @@ -13889,6 +13206,18 @@ Parent=Netscape 6.0 Platform=WinXP Win32=true +[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.0*] +Parent=Netscape 6.0 +Platform=WinXP + +[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.0*] +Parent=Netscape 6.0 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.0*] +Parent=Netscape 6.0 +Platform=Win7 + [Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.0*] Parent=Netscape 6.0 Platform=Linux @@ -13907,7 +13236,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true @@ -13945,6 +13273,18 @@ Parent=Netscape 6.1 Platform=WinXP Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.1*] +Parent=Netscape 6.1 +Platform=WinXP + +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.1*] +Parent=Netscape 6.1 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.1*] +Parent=Netscape 6.1 +Platform=Win7 + [Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.1*] Parent=Netscape 6.1 Platform=WinNT @@ -13960,6 +13300,18 @@ Parent=Netscape 6.1 Platform=WinXP Win32=true +[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.1*] +Parent=Netscape 6.1 +Platform=WinXP + +[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.1*] +Parent=Netscape 6.1 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.1*] +Parent=Netscape 6.1 +Platform=Win7 + [Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.1*] Parent=Netscape 6.1 Platform=Linux @@ -13978,7 +13330,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true @@ -14029,6 +13380,14 @@ Parent=Netscape 6.2 Platform=Win2003 Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.2*] +Parent=Netscape 6.2 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.2*] +Parent=Netscape 6.2 +Platform=Win7 + [Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.2*] Parent=Netscape 6.2 Platform=WinNT @@ -14049,6 +13408,14 @@ Parent=Netscape 6.2 Platform=Win2003 Win32=true +[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.2*] +Parent=Netscape 6.2 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.2*] +Parent=Netscape 6.2 +Platform=Win7 + [Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.2*] Parent=Netscape 6.2 Platform=Linux @@ -14066,7 +13433,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true @@ -14113,6 +13479,14 @@ Parent=Netscape 7.0 Platform=Win2003 Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.0*] +Parent=Netscape 7.0 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.0*] +Parent=Netscape 7.0 +Platform=Win7 + [Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.0*] Parent=Netscape 7.0 Platform=WinNT @@ -14133,6 +13507,14 @@ Parent=Netscape 7.0 Platform=Win2003 Win32=true +[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.0*] +Parent=Netscape 7.0 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.0*] +Parent=Netscape 7.0 +Platform=Win7 + [Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.0*] Parent=Netscape 7.0 Platform=Linux @@ -14155,7 +13537,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true @@ -14211,6 +13592,14 @@ Parent=Netscape 7.1 Platform=Win2003 Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.1*] +Parent=Netscape 7.1 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.1*] +Parent=Netscape 7.1 +Platform=Win7 + [Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.1*] Parent=Netscape 7.1 Platform=WinNT @@ -14228,8 +13617,16 @@ Win32=true [Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.1*] Parent=Netscape 7.1 -Platform=Win2003 -Win32=true +Platform=Win2003 +Win32=true + +[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.1*] +Parent=Netscape 7.1 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.1*] +Parent=Netscape 7.1 +Platform=Win7 [Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.1*] Parent=Netscape 7.1 @@ -14253,7 +13650,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true @@ -14309,6 +13705,14 @@ Parent=Netscape 7.2 Platform=Win2003 Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.2*] +Parent=Netscape 7.2 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.2*] +Parent=Netscape 7.2 +Platform=Win7 + [Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.2*] Parent=Netscape 7.2 Platform=WinNT @@ -14329,6 +13733,14 @@ Parent=Netscape 7.2 Platform=Win2003 Win32=true +[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.2*] +Parent=Netscape 7.2 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.2*] +Parent=Netscape 7.2 +Platform=Win7 + [Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.2*] Parent=Netscape 7.2 Platform=Linux @@ -14350,7 +13762,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true @@ -14406,6 +13817,14 @@ Parent=Netscape 8.0 Platform=Win2003 Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.0*] +Parent=Netscape 8.0 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.0*] +Parent=Netscape 8.0 +Platform=Win7 + [Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.0*] Parent=Netscape 8.0 Platform=WinNT @@ -14426,6 +13845,14 @@ Parent=Netscape 8.0 Platform=Win2003 Win32=true +[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.0*] +Parent=Netscape 8.0 +Platform=WinVista + +[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.0*] +Parent=Netscape 8.0 +Platform=Win7 + [Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.0*] Parent=Netscape 8.0 Platform=Linux @@ -14448,7 +13875,6 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true @@ -14479,620 +13905,307 @@ Win32=true Parent=Netscape 8.1 Platform=WinME Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firebird - -[Firebird] -Parent=DefaultProperties -Browser=Firebird -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CSS=2 -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Linux; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird Browser/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; IRIX*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox - -[Firefox] -Parent=DefaultProperties -Browser=Firefox -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CSS=2 -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (OS/2; *; Warp*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (Windows NT 5.?; ?; rv:1.*) Gecko/* Firefox] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.*; *; rv:1.*) Gecko/* Deer Park/Alpha*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firefox/10.5] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox + +[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 +Platform=WinNT Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox +[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 +Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 +Platform=WinXP Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 +Platform=Win2003 Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 Platform=WinVista Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 +Platform=Win7 -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox +[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 Platform=WinNT Win32=true -[Mozilla/5.0 (Windows; *; WinNT4.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox +[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 +Platform=Win2000 Win32=true -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; FreeBSD*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; HP-UX*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=HP-UX +[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 +Platform=WinXP +Win32=true -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=IRIX64 +[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 +Platform=Win2003 +Win32=true -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox +[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 +Platform=WinVista +Win32=true -[Mozilla/5.0 (X11; *; Linux*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox +[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 +Platform=Win7 -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=OpenBSD +[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 +Platform=Linux -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox +[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.1*] +Parent=Netscape 8.1 Platform=SunOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.0 -[Firefox 1.0] +[SeaMonkey 1.0] Parent=DefaultProperties -Browser=Firefox +Browser=SeaMonkey Version=1.0 MajorVer=1 Frames=true IFrames=true Tables=true Cookies=true +BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacPPC -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] +Parent=SeaMonkey 1.0 Platform=MacOSX -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 +[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] +Parent=SeaMonkey 1.0 Platform=WinME -Win32=true -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 +[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] +Parent=SeaMonkey 1.0 Platform=Win98 -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 +[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] +Parent=SeaMonkey 1.0 Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] +Parent=SeaMonkey 1.0 Platform=WinXP -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] +Parent=SeaMonkey 1.0 Platform=Win2003 -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] +Parent=SeaMonkey 1.0 Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; *Linux*; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux -[Mozilla/5.0 (X11; *; DragonFly*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] +Parent=SeaMonkey 1.0 +Platform=Win7 -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 +[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] +Parent=SeaMonkey 1.0 Platform=FreeBSD -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OpenBSD +[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.0*] +Parent=SeaMonkey 1.0 +Platform=Linux -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 +[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] +Parent=SeaMonkey 1.0 Platform=SunOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.4 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.1 -[Firefox 1.4] +[SeaMonkey 1.1] Parent=DefaultProperties -Browser=Firefox -Version=1.4 +Browser=SeaMonkey +Version=1.1 MajorVer=1 -MinorVer=4 +MinorVer=1 Frames=true IFrames=true Tables=true Cookies=true +BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] +Parent=SeaMonkey 1.1 Platform=MacOSX -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 +[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] +Parent=SeaMonkey 1.1 Platform=WinME -Win32=true -[Mozilla/5.0 (Windows; *; Win95*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 +[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] +Parent=SeaMonkey 1.1 Platform=Win98 -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 +[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] +Parent=SeaMonkey 1.1 Platform=Win2000 -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] +Parent=SeaMonkey 1.1 Platform=WinXP -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] +Parent=SeaMonkey 1.1 Platform=Win2003 -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] +Parent=SeaMonkey 1.1 Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinNT -Win32=true -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] +Parent=SeaMonkey 1.1 +Platform=Win7 -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 +[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] +Parent=SeaMonkey 1.1 Platform=FreeBSD -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OpenBSD +[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.1*] +Parent=SeaMonkey 1.1 +Platform=Linux -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 +[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] +Parent=SeaMonkey 1.1 Platform=SunOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.5 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 2.0 -[Firefox 1.5] +[SeaMonkey 2.0] Parent=DefaultProperties -Browser=Firefox -Version=1.5 -MajorVer=1 -MinorVer=5 +Browser=SeaMonkey +Version=2.0 +MajorVer=2 +Alpha=true Frames=true IFrames=true Tables=true Cookies=true +BackgroundSounds=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] +Parent=SeaMonkey 2.0 Platform=MacOSX -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OS/2 - -[Mozilla/5.0 (rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 +[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] +Parent=SeaMonkey 2.0 +Platform=WinME + +[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] +Parent=SeaMonkey 2.0 Platform=Win98 -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 +[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] +Parent=SeaMonkey 2.0 Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2 x64; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] +Parent=SeaMonkey 2.0 Platform=WinXP -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] +Parent=SeaMonkey 2.0 Platform=Win2003 -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 +[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] +Parent=SeaMonkey 2.0 Platform=WinVista -Win32=true -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinNT -Win32=true +[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] +Parent=SeaMonkey 2.0 +Platform=Win7 -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 +[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] +Parent=SeaMonkey 2.0 +Platform=FreeBSD + +[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.9*) Gecko/20060221 SeaMonkey/2.0*] +Parent=SeaMonkey 2.0 Platform=Linux -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=FreeBSD +[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] +Parent=SeaMonkey 2.0 +Platform=SunOS -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=HP-UX +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 1.0 -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=IRIX64 +[Flock 1.0] +Parent=DefaultProperties +Browser=Flock +Version=1.0 +MajorVer=1 +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OpenBSD +[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] +Parent=Flock 1.0 +Platform=MacOSX -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=SunOS +[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] +Parent=Flock 1.0 +Platform=WinME -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 2.0 +[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] +Parent=Flock 1.0 +Platform=Win2000 -[Firefox 2.0] +[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] +Parent=Flock 1.0 +Platform=WinXP + +[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] +Parent=Flock 1.0 +Platform=Win2003 + +[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] +Parent=Flock 1.0 +Platform=WinVista + +[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] +Parent=Flock 1.0 +Platform=Win7 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 2.0 + +[Flock 2.0] Parent=DefaultProperties -Browser=Firefox +Browser=Flock Version=2.0 MajorVer=2 Frames=true @@ -15101,1704 +14214,1733 @@ Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* BonEcho/2.0*] -Parent=Firefox 2.0 +[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] +Parent=Flock 2.0 Platform=MacOSX -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=MacOSX +[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] +Parent=Flock 2.0 +Platform=WinME -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OS/2 +[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] +Parent=Flock 2.0 +Platform=Win2000 -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinME -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] +Parent=Flock 2.0 +Platform=WinXP -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win95 -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] +Parent=Flock 2.0 +Platform=Win2003 -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win98 -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] +Parent=Flock 2.0 +Platform=WinVista -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2000 -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] +Parent=Flock 2.0 +Platform=Win7 -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.8*) Gecko/* BonEcho/2.0*] -Parent=Firefox 2.0 -Platform=Win2000 -Win32=true +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sleipnir 2.0 -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* BonEcho/2.0*] -Parent=Firefox 2.0 -Platform=WinXP -Win32=true +[Sleipnir] +Parent=DefaultProperties +Browser=Sleipnir +Version=2.0 +MajorVer=2 +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinXP -Win32=true +[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.0*) Sleipnir/2.*] +Parent=Sleipnir +Platform=Win2000 -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* BonEcho/2.0*] -Parent=Firefox 2.0 -Platform=Win2003 -Win32=true +[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.1*) Sleipnir/2.*] +Parent=Sleipnir +Platform=WinXP -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 +[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.2*) Sleipnir/2.*] +Parent=Sleipnir Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.8*) Gecko/* BonEcho/2.0*] -Parent=Firefox 2.0 -Platform=WinVista -Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 +[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.0*) Sleipnir/2.*] +Parent=Sleipnir Platform=WinVista -Win32=true -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinNT -Win32=true +[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.1*) Sleipnir/2.*] +Parent=Sleipnir +Platform=Win7 -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux +[Sleipnir*] +Parent=Sleipnir -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=FreeBSD +[Sleipnir/2.*] +Parent=Sleipnir -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=HP-UX +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fennec 1.0 -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=IRIX64 +[Fennec 1.0] +Parent=DefaultProperties +Browser=Firefox Mobile +Version=1.0 +MajorVer=1 +Alpha=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=3 +supportsCSS=true -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.8*) Gecko/* BonEcho/2.0*] -Parent=Firefox 2.0 -Platform=Linux +[Mozilla/5.0 (Windows; U; Windows NT 5.1; *; rv:1.9*) Gecko/* Fennec/1.0*] +Parent=Fennec 1.0 +Platform=WinXP -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OpenBSD +[Mozilla/5.0 (Windows; U; Windows NT 6.0; *; rv:1.9*) Gecko/* Fennec/1.0*] +Parent=Fennec 1.0 +Platform=WinVista -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=SunOS +[Mozilla/5.0 (Windows; U; Windows NT 6.1; *; rv:1.9*) Gecko/* Fennec/1.0*] +Parent=Fennec 1.0 +Platform=Win7 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firebird -[Firefox 3.0] +[Firebird] Parent=DefaultProperties -Browser=Firefox -Version=3.0 -MajorVer=3 -Alpha=true +Browser=Firebird Frames=true IFrames=true Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Linux +[Mozilla/5.0 (Linux; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] +Parent=Firebird -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=MacOSX +[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Minefield/3.0*] -Parent=Firefox 3.0 -Platform=MacOSX +[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] +Parent=Firebird -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=OS/2 +[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinME +[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird Win32=true -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win95 +[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] +Parent=Firebird Win32=true -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win98 +[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2000 +[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP +[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] +Parent=Firebird Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Minefield/3.0*] -Parent=Firefox 3.0 -Platform=WinXP +[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird Browser/0.*] +Parent=Firebird Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 +[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista +[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] +Parent=Firebird +Win32=true + +[Mozilla/5.0 (Windows; *; Windows NT 5.?; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird +Win32=true + +[Mozilla/5.0 (Windows; *; Windows NT 6.*; *; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird Win32=true -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinNT +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird Win32=true -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Minefield/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Minefield/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=false -Win64=true +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] +Parent=Firebird +Win32=true -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Linux +[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Minefield/3.0*] -Parent=Firefox 3.0 -Platform=Linux +[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] +Parent=Firebird -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=FreeBSD +[Mozilla/5.0 (X11; *; IRIX*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] +Parent=Firebird -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=HP-UX +[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=IRIX64 +[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] +Parent=Firebird -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=OpenBSD +[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firebird/0.*] +Parent=Firebird -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=SunOS +[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] +Parent=Firebird -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phoenix +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox -[Phoenix] +[Firefox] Parent=DefaultProperties -Browser=Phoenix +Browser=Firefox Frames=true IFrames=true Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true +ecmascriptversion=1.3 +w3cdomversion=1.0 -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Version=0.5 -MajorVer=0 -MinorVer=5 +[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Platform=MacOSX + +[Mozilla/5.0 (Macintosh; *; *Mac OS X*; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox + +[Mozilla/5.0 (OS/2; *; Warp*; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox + +[Mozilla/5.0 (Windows NT 5.?; ?; rv:1.*) Gecko/* Firefox] +Parent=Firefox +Win32=true + +[Mozilla/5.0 (Windows; *; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Win32=true + +[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox Platform=WinME Win32=true -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Version=0.5 -MajorVer=0 -MinorVer=5 +[Mozilla/5.0 (Windows; *; Win 9x 4.90; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Win32=true + +[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Platform=Win95 +Win32=true + +[Mozilla/5.0 (Windows; *; Win95; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Win32=true + +[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox Platform=Win98 Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.0*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Version=0.5 -MajorVer=0 -MinorVer=5 +[Mozilla/5.0 (Windows; *; Win98; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Win32=true + +[Mozilla/5.0 (Windows; *; Windows NT 5.*; *; rv:1.*) Gecko/* Deer Park/Alpha*] +Parent=Firefox +Win32=true + +[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firefox/10.5] +Parent=Firefox +Win32=true + +[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Version=0.5 -MajorVer=0 -MinorVer=5 -Platform=WinXP +[Mozilla/5.0 (Windows; *; Windows NT 5.0; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox Win32=true -[Mozilla/5.0 (Windows; *; Windows NT 5.2*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Version=0.5 -MajorVer=0 -MinorVer=5 -Platform=Win2003 +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox Win32=true -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Version=0.5 -MajorVer=0 -MinorVer=5 -Platform=Linux +[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.0 +[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Win32=true -[Mozilla 1.0] -Parent=DefaultProperties -Browser=Mozilla -Version=1.0 -MajorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CSS=2 -CssVersion=2 -supportsCSS=true +[Mozilla/5.0 (Windows; *; Windows NT 5.2; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Win32=true -[Mozilla/5.0 (*rv:1.0.*) Gecko/*] -Parent=Mozilla 1.0 +[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Platform=WinVista +Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.1 +[Mozilla/5.0 (Windows; *; Windows NT 6.0*; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Win32=true -[Mozilla 1.1] -Parent=DefaultProperties -Browser=Mozilla -Version=1.1 -MajorVer=1 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CSS=2 -CssVersion=2 -supportsCSS=true +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Platform=WinNT +Win32=true -[Mozilla/5.0 (*rv:1.1.*) Gecko/*] -Parent=Mozilla 1.1 +[Mozilla/5.0 (Windows; *; WinNT4.0; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.2 +[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Platform=FreeBSD -[Mozilla 1.2] -Parent=DefaultProperties -Browser=Mozilla -Version=1.2 -MajorVer=1 -MinorVer=2 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CSS=2 -CssVersion=2 -supportsCSS=true +[Mozilla/5.0 (X11; *; FreeBSD*; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox -[Mozilla/5.0 (*rv:1.2.*) Gecko/*] -Parent=Mozilla 1.2 +[Mozilla/5.0 (X11; *; HP-UX*; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Platform=HP-UX -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.3 +[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Platform=IRIX64 -[Mozilla 1.3] -Parent=DefaultProperties -Browser=Mozilla -Version=1.3 -MajorVer=1 -MinorVer=3 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CSS=2 -CssVersion=2 -supportsCSS=true +[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox + +[Mozilla/5.0 (X11; *; Linux*; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox + +[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Platform=OpenBSD -[Mozilla/5.0 (*rv:1.3.*) Gecko/*] -Parent=Mozilla 1.3 +[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/0.*] +Parent=Firefox +Platform=SunOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.4 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.0 -[Mozilla 1.4] +[Firefox 1.0] Parent=DefaultProperties -Browser=Mozilla -Version=1.4 +Browser=Firefox +Version=1.0 MajorVer=1 -MinorVer=4 -Beta=true Frames=true IFrames=true Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true +ecmascriptversion=1.3 +w3cdomversion=1.0 -[Mozilla/5.0 (*rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 +[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 +Platform=MacPPC -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 +[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 Platform=MacOSX -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win32=true +[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 +Platform=OS/2 -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win16=true +[Mozilla/5.0 (Windows; *; Win 9x 4.90*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 +Platform=WinME Win32=true -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 +[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 Platform=Win95 Win32=true -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 +[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 Platform=Win98 Win32=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 +[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 Platform=WinXP Win32=true -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 +[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 +Platform=WinXP +Win32=true + +[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 +Platform=Win2003 +Win32=true + +[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 +Platform=WinVista +Win32=true + +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 Platform=WinNT Win32=true -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=FreeBSD +[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 +Platform=Linux -[Mozilla/5.0 (X11; *Linux*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 +[Mozilla/5.0 (X11; *; *Linux*; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 Platform=Linux -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 +[Mozilla/5.0 (X11; *; DragonFly*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 + +[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 +Platform=FreeBSD + +[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 +Platform=HP-UX + +[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 +Platform=IRIX64 + +[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 Platform=OpenBSD -[Mozilla/5.0 (X11; *SunOS*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 +[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.0*] +Parent=Firefox 1.0 Platform=SunOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.5 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.4 -[Mozilla 1.5] +[Firefox 1.4] Parent=DefaultProperties -Browser=Mozilla -Version=1.5 +Browser=Firefox +Version=1.4 MajorVer=1 -MinorVer=5 -Beta=true +MinorVer=4 Frames=true IFrames=true Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true +ecmascriptversion=1.3 +w3cdomversion=1.0 -[Mozilla/5.0 (*rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 +[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 +Platform=Linux -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 +[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 Platform=MacOSX -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win32=true +[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 +Platform=OS/2 -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win16=true +[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 +Platform=WinME Win32=true -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 +[Mozilla/5.0 (Windows; *; Win95*; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 Platform=Win95 Win32=true -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 +[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 Platform=Win98 Win32=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 +[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 Platform=WinXP Win32=true -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 +[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 +Platform=Win2003 +Win32=true + +[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 +Platform=WinVista +Win32=true + +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 Platform=WinNT Win32=true -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 +[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 +Platform=Linux + +[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 Platform=FreeBSD -[Mozilla/5.0 (X11; *Linux*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Linux +[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 +Platform=HP-UX -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 +[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 +Platform=IRIX64 + +[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 Platform=OpenBSD -[Mozilla/5.0 (X11; *SunOS*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 +[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.4*] +Parent=Firefox 1.4 Platform=SunOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.6 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.5 -[Mozilla 1.6] +[Firefox 1.5] Parent=DefaultProperties -Browser=Mozilla -Version=1.6 +Browser=Firefox +Version=1.5 MajorVer=1 -MinorVer=6 -Beta=true +MinorVer=5 Frames=true IFrames=true Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true +ecmascriptversion=1.5 +w3cdomversion=1.0 -[Mozilla/5.0 (*rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 +[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 +Platform=Linux -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 +[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 Platform=MacOSX -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinME -Win32=true +[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 +Platform=OS/2 -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win32=true +[Mozilla/5.0 (rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win16=true +[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 +Platform=WinME Win32=true -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 +[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 Platform=Win95 Win32=true -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 +[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 Platform=Win98 Win32=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 +[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 Platform=WinXP Win32=true -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 +[Mozilla/5.0 (Windows; *; Windows NT 5.2 x64; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 +Platform=WinXP +Win32=true + +[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 +Platform=Win2003 +Win32=true + +[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 +Platform=WinVista +Win32=true + +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 Platform=WinNT Win32=true -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 +[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 +Platform=Linux + +[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 Platform=FreeBSD -[Mozilla/5.0 (X11; *Linux*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Linux +[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 +Platform=HP-UX -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 +[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 +Platform=IRIX64 + +[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 Platform=OpenBSD -[Mozilla/5.0 (X11; *SunOS*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 +[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.5*] +Parent=Firefox 1.5 Platform=SunOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.7 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 2.0 -[Mozilla 1.7] +[Firefox 2.0] Parent=DefaultProperties -Browser=Mozilla -Version=1.7 -MajorVer=1 -MinorVer=7 -Beta=true +Browser=Firefox +Version=2.0 +MajorVer=2 Frames=true IFrames=true Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 CssVersion=2 supportsCSS=true ecmascriptversion=1.5 w3cdomversion=1.0 -[Mozilla/5.0 (*rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 +[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 +Platform=Linux -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 +[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 Platform=MacOSX -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win32=true +[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 +Platform=OS/2 -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win16=true +[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 +Platform=WinME Win32=true -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 +[Mozilla/5.0 (Windows; *; Win95; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 Platform=Win95 Win32=true -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 +[Mozilla/5.0 (Windows; *; Win98; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 Platform=Win98 Win32=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 +[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 Platform=Win2000 Win32=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 Platform=WinXP Win32=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 +[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 Platform=Win2003 Win32=true -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 +[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 +Platform=WinVista +Win32=true + +[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 +Platform=Win7 + +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 Platform=WinNT Win32=true -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 +[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 +Platform=Linux + +[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 Platform=FreeBSD -[Mozilla/5.0 (X11; *Linux*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Linux +[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 +Platform=HP-UX -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 +[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 +Platform=IRIX64 + +[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 Platform=OpenBSD -[Mozilla/5.0 (X11; *SunOS*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 +[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.8*) Gecko/* Firefox/2.0*] +Parent=Firefox 2.0 Platform=SunOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.8 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 -[Mozilla 1.8] +[Firefox 3.0] Parent=DefaultProperties -Browser=Mozilla -Version=1.8 -MajorVer=1 -MinorVer=8 +Browser=Firefox +Version=3.0 +MajorVer=3 Frames=true IFrames=true Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 -CssVersion=2 +CssVersion=3 supportsCSS=true ecmascriptversion=1.5 w3cdomversion=1.0 -[Mozilla/5.0 (*rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 +[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 Platform=MacOSX -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinME -Win32=true +[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 +Platform=Win2000 -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 +Platform=WinXP Win32=true -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win31 -Win16=true +[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 +Platform=Win2003 Win32=true -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win95 +[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 +Platform=WinVista Win32=true -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win98 -Win32=true +[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 +Platform=Win7 -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2000 +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 +Platform=WinNT Win32=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 +[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 Platform=WinXP -Win32=true +Win32=false +Win64=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 +[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 Platform=Win2003 -Win32=true +Win32=false +Win64=true -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinNT -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 +Platform=WinVista -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=FreeBSD +[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 +Platform=Win7 -[Mozilla/5.0 (X11; *Linux*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 +[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 Platform=Linux -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 +[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 +Platform=FreeBSD + +[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 +Platform=HP-UX + +[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 +Platform=IRIX64 + +[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 Platform=OpenBSD -[Mozilla/5.0 (X11; *SunOS*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 +[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.0*] +Parent=Firefox 3.0 Platform=SunOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.9 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.1 -[Mozilla 1.9] +[Firefox 3.1] Parent=DefaultProperties -Browser=Mozilla 1.9 -Version=1.9 -MajorVer=1 -MinorVer=9 -Alpha=true +Browser=Firefox +Version=3.1 +MajorVer=3 +MinorVer=1 +Beta=true Frames=true IFrames=true Tables=true Cookies=true JavaApplets=true JavaScript=true -CSS=2 -CssVersion=2 +CssVersion=3 supportsCSS=true -[Mozilla/5.0 (*rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 +[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 Platform=MacOSX -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=WinXP Win32=true -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win31 -Win16=true +[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=Win2003 Win32=true -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win95 +[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=WinVista Win32=true -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win98 -Win32=true +[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=Win7 -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2000 +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=WinNT Win32=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 +[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 Platform=WinXP -Win32=true +Win32=false +Win64=true -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 +[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 Platform=Win2003 -Win32=true +Win32=false +Win64=true -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinNT -Win32=true +[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=WinVista -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=FreeBSD +[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=Win7 -[Mozilla/5.0 (X11; *Linux*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 +[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 Platform=Linux -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=OpenBSD +[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=FreeBSD -[Mozilla/5.0 (X11; *SunOS*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=SunOS +[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=HP-UX -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE Mac +[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=IRIX64 -[IE Mac] -Parent=DefaultProperties -Browser=IE -Platform=MacPPC -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -JavaApplets=true -JavaScript=true -CSS=1 -CssVersion=1 -supportsCSS=true +[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=OpenBSD -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 5.5 +[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.1*] +Parent=Firefox 3.1 +Platform=SunOS -[AOL 9.0/IE 5.5] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.5 + +[Firefox 3.5] Parent=DefaultProperties -Browser=AOL -Version=5.5 -MajorVer=5 +Browser=Firefox +Version=3.5 +MajorVer=3 MinorVer=5 -Win32=true +Beta=true Frames=true IFrames=true Tables=true Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true JavaApplets=true JavaScript=true -ActiveXControls=true -CSS=2 -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5; *AOL 9.0*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -CSS=2 -CssVersion=2 +CssVersion=3 supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME +[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=MacOSX -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=WinXP +Win32=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=Win2003 +Win32=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=WinVista +Win32=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=Win7 -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 5.5 +[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 Platform=WinNT +Win32=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=WinXP +Win32=false +Win64=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=Win2003 +Win32=false +Win64=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=Win7 -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 +[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=Linux -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=FreeBSD -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=HP-UX -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=IRIX64 -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=OpenBSD -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP +[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] +Parent=Firefox 3.5 +Platform=SunOS -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP -netCLR=true -ClrVersion=1 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phoenix -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Phoenix] +Parent=DefaultProperties +Browser=Phoenix +Version=0.5 +MinorVer=5 +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.4*) Gecko/* Phoenix/0.5*] +Parent=Phoenix +Platform=WinME +Win32=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; *; Win98; *; rv:1.4*) Gecko/* Phoenix/0.5*] +Parent=Phoenix +Platform=Win98 +Win32=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 +[Mozilla/5.0 (Windows; *; Windows NT 5.0*; *; rv:1.4*) Gecko/* Phoenix/0.5*] +Parent=Phoenix +Platform=Win2000 +Win32=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.4*) Gecko/* Phoenix/0.5*] +Parent=Phoenix +Platform=WinXP +Win32=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 +[Mozilla/5.0 (Windows; *; Windows NT 5.2*; *; rv:1.4*) Gecko/* Phoenix/0.5*] +Parent=Phoenix Platform=Win2003 -netCLR=true -ClrVersion=2 +Win32=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *; Linux*; *; rv:1.4*) Gecko/* Phoenix/0.5*] +Parent=Phoenix +Platform=Linux -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 -netCLR=true -ClrVersion=2 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iceweasel -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista +[Iceweasel] +Parent=DefaultProperties +Browser=Iceweasel +Platform=Linux +Beta=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (X11; U; Linux*; *; rv:1.8*) Gecko/* Iceweasel/2.0* (Debian-*)] +Parent=Iceweasel +Version=2.0 +MajorVer=2 +MinorVer=0 -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista -netCLR=true -ClrVersion=2 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.0 -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista -netCLR=true -ClrVersion=2 +[Mozilla 1.0] +Parent=DefaultProperties +Browser=Mozilla +Version=1.0 +MajorVer=1 +Beta=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (*rv:1.0.*) Gecko/*] +Parent=Mozilla 1.0 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 6.0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.1 -[AOL 9.0/IE 6.0] +[Mozilla 1.1] Parent=DefaultProperties -Browser=AOL -Version=6.0 -MajorVer=6 -Win32=true +Browser=Mozilla +Version=1.1 +MajorVer=1 +MinorVer=1 +Beta=true Frames=true IFrames=true Tables=true Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true JavaApplets=true JavaScript=true -ActiveXControls=true -CSS=2 CssVersion=2 supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 6.0 -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME +[Mozilla/5.0 (*rv:1.1.*) Gecko/*] +Parent=Mozilla 1.1 -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win95 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.2 -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win98 +[Mozilla 1.2] +Parent=DefaultProperties +Browser=Mozilla +Version=1.2 +MajorVer=1 +MinorVer=2 +Beta=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (*rv:1.2.*) Gecko/*] +Parent=Mozilla 1.2 -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -netCLR=true -ClrVersion=1 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.3 -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -CSS=2 +[Mozilla 1.3] +Parent=DefaultProperties +Browser=Mozilla +Version=1.3 +MajorVer=1 +MinorVer=3 +Beta=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true CssVersion=2 supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (*rv:1.3.*) Gecko/*] +Parent=Mozilla 1.3 -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.4 -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME -netCLR=true -ClrVersion=1 +[Mozilla 1.4] +Parent=DefaultProperties +Browser=Mozilla +Version=1.4 +MajorVer=1 +MinorVer=4 +Beta=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (*rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 +Platform=MacOSX -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 +[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 Platform=WinME -netCLR=true -ClrVersion=2 +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinNT +[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 +Platform=Win31 +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 +[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 +Platform=Win31 +Win16=true +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (Windows; ?; Win95; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 +Platform=Win95 +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Win98; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 +Platform=Win98 +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 +[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 Platform=Win2000 -netCLR=true -ClrVersion=2 +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 +Platform=WinXP +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 +[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 +Platform=WinNT +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 +Platform=FreeBSD -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *Linux*; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 +Platform=Linux -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 +Platform=OpenBSD -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *SunOS*; *rv:1.4*) Gecko/*] +Parent=Mozilla 1.4 +Platform=SunOS -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.5 + +[Mozilla 1.5] +Parent=DefaultProperties +Browser=Mozilla +Version=1.5 +MajorVer=1 +MinorVer=5 +Beta=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (*rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=MacOSX -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=WinME +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=Win31 +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 +[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=Win31 +Win16=true +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (Windows; ?; Win95; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=Win95 +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Win98; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=Win98 +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=Win2000 +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=WinXP +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista +[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=WinNT +Win32=true -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=FreeBSD -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *Linux*; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=Linux -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=OpenBSD -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *SunOS*; *rv:1.5*) Gecko/*] +Parent=Mozilla 1.5 +Platform=SunOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 7.0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.6 -[AOL 9.0/IE 7.0] +[Mozilla 1.6] Parent=DefaultProperties -Browser=AOL -Version=7.0 -MajorVer=7 -Win32=true +Browser=Mozilla +Version=1.6 +MajorVer=1 +MinorVer=6 +Beta=true Frames=true IFrames=true Tables=true Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true JavaApplets=true JavaScript=true -ActiveXControls=true -CSS=2 CssVersion=2 supportsCSS=true -AOL=true -aolVersion=9.0 -[Mozilla/?.* (?compatible; *MSIE 7.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 7.0 +[Mozilla/5.0 (*rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 +Platform=MacOSX + +[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 Platform=WinME +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 7.0 +[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 +Platform=Win31 +Win32=true + +[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 +Platform=Win31 +Win16=true +Win32=true + +[Mozilla/5.0 (Windows; ?; Win95; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 Platform=Win95 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 7.0 +[Mozilla/5.0 (Windows; ?; Win98; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 Platform=Win98 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 +Platform=Win2000 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 +Platform=WinXP +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -CSS=2 +[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 +Platform=WinNT +Win32=true + +[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 +Platform=FreeBSD + +[Mozilla/5.0 (X11; *Linux*; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 +Platform=Linux + +[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 +Platform=OpenBSD + +[Mozilla/5.0 (X11; *SunOS*; *rv:1.6*) Gecko/*] +Parent=Mozilla 1.6 +Platform=SunOS + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.7 + +[Mozilla 1.7] +Parent=DefaultProperties +Browser=Mozilla +Version=1.7 +MajorVer=1 +MinorVer=7 +Beta=true +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.5 +w3cdomversion=1.0 -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (*rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=MacOSX -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 +[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 Platform=WinME -netCLR=true -ClrVersion=1 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=Win31 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=Win31 +Win16=true +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Win95; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=Win95 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinNT +[Mozilla/5.0 (Windows; ?; Win98; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=Win98 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 7.0 +[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 Platform=Win2000 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=WinXP +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=Win2003 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=WinNT +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=FreeBSD -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 +[Mozilla/5.0 (X11; *Linux*; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=Linux -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=OpenBSD -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *SunOS*; *rv:1.7*) Gecko/*] +Parent=Mozilla 1.7 +Platform=SunOS -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.8 -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla 1.8] +Parent=DefaultProperties +Browser=Mozilla +Version=1.8 +MajorVer=1 +MinorVer=8 +Frames=true +IFrames=true +Tables=true +Cookies=true +JavaApplets=true +JavaScript=true +CssVersion=2 +supportsCSS=true +ecmascriptversion=1.5 +w3cdomversion=1.0 -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP +[Mozilla/5.0 (*rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=MacOSX -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=WinME +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=Win31 +Win16=true +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 +[Mozilla/5.0 (Windows; ?; Win95; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=Win95 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (Windows; ?; Win98; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=Win98 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=Win2000 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=WinXP +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 Platform=Win2003 -netCLR=true -ClrVersion=2 +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista +[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=WinNT +Win32=true -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista -netCLR=true -ClrVersion=1 +[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=FreeBSD -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *Linux*; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=Linux -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=OpenBSD -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista -netCLR=true -ClrVersion=2 +[Mozilla/5.0 (X11; *SunOS*; *rv:1.8*) Gecko/*] +Parent=Mozilla 1.8 +Platform=SunOS -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Avant Browser +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.9 -[Avant Browser] +[Mozilla 1.9] Parent=DefaultProperties -Browser=Avant Browser +Browser=Mozilla +Version=1.9 +MajorVer=1 +MinorVer=9 +Alpha=true Frames=true IFrames=true Tables=true Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true JavaApplets=true JavaScript=true -ActiveXControls=true -CSS=2 CssVersion=2 supportsCSS=true -[Advanced Browser (http://www.avantbrowser.com)] -Parent=Avant Browser +[Mozilla/5.0 (*rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 -[Avant Browser*] -Parent=Avant Browser +[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=MacOSX -[Avant Browser/*] -Parent=Avant Browser +[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=WinME +Win32=true -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 4.01 +[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Win32=true + +[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=Win31 +Win16=true +Win32=true + +[Mozilla/5.0 (Windows; ?; Win95; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=Win95 +Win32=true + +[Mozilla/5.0 (Windows; ?; Win98; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=Win98 +Win32=true + +[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=Win2000 +Win32=true + +[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=WinXP +Win32=true + +[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=Win2003 +Win32=true + +[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=WinNT +Win32=true + +[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=FreeBSD + +[Mozilla/5.0 (X11; *Linux*; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=Linux + +[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=OpenBSD + +[Mozilla/5.0 (X11; *SunOS*; *rv:1.9*) Gecko/*] +Parent=Mozilla 1.9 +Platform=SunOS + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE Mac -[IE 4.01] +[IE Mac] Parent=DefaultProperties Browser=IE -Version=4.01 -MajorVer=4 -MinorVer=01 -Win32=true +Platform=MacPPC Frames=true IFrames=true Tables=true Cookies=true BackgroundSounds=true CDF=true -VBScript=true JavaApplets=true JavaScript=true -ActiveXControls=true -CSS=2 -CssVersion=2 +CssVersion=1 supportsCSS=true -[Mozilla/?.* (?compatible; *MSIE 4.01*)*] -Parent=IE 4.01 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 95*)*] -Parent=IE 4.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98*)*] -Parent=IE 4.01 -Platform=Win98 +[Mozilla/?.? (compatible; MSIE 4.0*; *Mac_PowerPC*] +Parent=IE Mac +Version=4.0 +MajorVer=4 +MinorVer=0 -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 4.0*)*] -Parent=IE 4.01 -Platform=WinNT +[Mozilla/?.? (compatible; MSIE 4.5*; *Mac_PowerPC*] +Parent=IE Mac +Version=4.5 +MajorVer=4 +MinorVer=5 -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.0*)*] -Parent=IE 4.01 -Platform=Win2000 +[Mozilla/?.? (compatible; MSIE 5.0*; *Mac_PowerPC*] +Parent=IE Mac +Version=5.0 +MajorVer=5 +MinorVer=0 -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.01*)*] -Parent=IE 4.01 -Platform=Win2000 +[Mozilla/?.? (compatible; MSIE 5.1*; *Mac_PowerPC*] +Parent=IE Mac +Version=5.1 +MajorVer=5 +MinorVer=1 -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 4.01 -Platform=WinME +[Mozilla/?.? (compatible; MSIE 5.2*; *Mac_PowerPC*] +Parent=IE Mac +Version=5.2 +MajorVer=5 +MinorVer=2 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 5.5 -[IE 5.0] +[AOL 9.0/IE 5.5] Parent=DefaultProperties -Browser=IE -Version=5.0 +Browser=AOL +Version=5.5 MajorVer=5 +MinorVer=5 Win32=true Frames=true IFrames=true @@ -16810,235 +15952,173 @@ VBScript=true JavaApplets=true JavaScript=true ActiveXControls=true -CSS=2 CssVersion=2 supportsCSS=true +AOL=true +aolVersion=9.0 +ecmascriptversion=1.3 +w3cdomversion=1.0 -[Mozilla/?.* (?compatible; *MSIE 5.0*)*] -Parent=IE 5.0 +[Mozilla/?.* (?compatible; *MSIE 5.5; *AOL 9.0*)*] +Parent=AOL 9.0/IE 5.5 -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 95*)*] -Parent=IE 5.0 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Win 9x 4.90*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinME + +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 95*)*] +Parent=AOL 9.0/IE 5.5 Platform=Win95 -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98*)*] -Parent=IE 5.0 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*)*] +Parent=AOL 9.0/IE 5.5 Platform=Win98 -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.0 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 + +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 + +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 +CssVersion=2 +supportsCSS=true + +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 + +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] +Parent=AOL 9.0/IE 5.5 Platform=WinME -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*.NET CLR 1*)*] -Parent=IE 5.0 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 Platform=WinME -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98;*.NET CLR 1*)*] -Parent=IE 5.0 -Platform=Win98 -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 4.0*)*] -Parent=IE 5.0 -Platform=WinNT +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 4.0;*.NET CLR 1*)*] -Parent=IE 5.0 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinME + +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 4.0*)*] +Parent=AOL 9.0/IE 5.5 Platform=WinNT -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.0*)*] -Parent=IE 5.0 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*)*] +Parent=AOL 9.0/IE 5.5 Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.0;*.NET CLR 1*)*] -Parent=IE 5.0 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 Platform=Win2000 -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.01*)*] -Parent=IE 5.0 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.01;*.NET CLR 1*)*] -Parent=IE 5.0 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 Platform=Win2000 -netCLR=true -ClrVersion=1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.01 - -[IE 5.01] -Parent=DefaultProperties -Browser=IE -Version=5.01 -MajorVer=5 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CSS=2 -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.01*)*] -Parent=IE 5.01 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 95*)*] -Parent=IE 5.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98*)*] -Parent=IE 5.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98; Win 9x 4.90;*.NET CLR 1*)*] -Parent=IE 5.01 -Platform=WinME -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98;*.NET CLR 1*)*] -Parent=IE 5.01 -Platform=Win98 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 4.0*)*] -Parent=IE 5.01 -Platform=WinNT +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 +Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 4.0;*.NET CLR 1*)*] -Parent=IE 5.01 -Platform=WinNT -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*)*] +Parent=AOL 9.0/IE 5.5 +Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.0*)*] -Parent=IE 5.01 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.0;*.NET CLR 1*)*] -Parent=IE 5.01 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 Platform=Win2000 -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.01*)*] -Parent=IE 5.01 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.01;*.NET CLR 1*)*] -Parent=IE 5.01 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 Platform=Win2000 -netCLR=true -ClrVersion=1 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0b1 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinXP -[IE 5.0b1] -Parent=DefaultProperties -Browser=IE -Version=5.0 -MajorVer=5 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CSS=2 -CssVersion=2 -supportsCSS=true +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinXP -[Mozilla/?.* (?compatible; *MSIE 5.0b1*)*] -Parent=IE 5.0b1 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinXP -[Mozilla/4.0 (compatible; MSIE 5.0b1; *Windows 95*)*] -Parent=IE 5.0b1 -Platform=Win95 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinXP -[Mozilla/4.0 (compatible; MSIE 5.0b1; *Windows 98*)*] -Parent=IE 5.0b1 -Platform=Win98 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinXP -[Mozilla/4.0 (compatible; MSIE 5.0b1; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.0b1 -Platform=WinME +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*)*] +Parent=AOL 9.0/IE 5.5 +Platform=Win2003 -[Mozilla/4.0 (compatible; MSIE 5.0b1; *Windows 98; Win 9x 4.90;*.NET CLR 1*)*] -Parent=IE 5.0b1 -Platform=WinME -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 +Platform=Win2003 -[Mozilla/4.0 (compatible; MSIE 5.0b1; *Windows 98;*.NET CLR 1*)*] -Parent=IE 5.0b1 -Platform=Win98 -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 +Platform=Win2003 + +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 +Platform=Win2003 -[Mozilla/4.0 (compatible; MSIE 5.0b1; *Windows NT 4.0*)*] -Parent=IE 5.0b1 -Platform=WinNT +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 +Platform=Win2003 -[Mozilla/4.0 (compatible; MSIE 5.0b1; *Windows NT 4.0;*.NET CLR 1*)*] -Parent=IE 5.0b1 -Platform=WinNT -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 5.0b1; *Windows NT 5.0*)*] -Parent=IE 5.0b1 -Platform=Win2000 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 5.0b1; *Windows NT 5.0;*.NET CLR 1*)*] -Parent=IE 5.0b1 -Platform=Win2000 -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 5.0b1; *Windows NT 5.01*)*] -Parent=IE 5.0b1 -Platform=Win2000 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 5.0b1; *Windows NT 5.01;*.NET CLR 1*)*] -Parent=IE 5.0b1 -Platform=Win2000 -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 5.5 +Platform=WinVista -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.5 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 6.0 -[IE 5.5] +[AOL 9.0/IE 6.0] Parent=DefaultProperties -Browser=IE -Version=5.5 -MajorVer=5 -MinorVer=5 +Browser=AOL +Version=6.0 +MajorVer=6 Win32=true Frames=true IFrames=true @@ -17050,222 +16130,173 @@ VBScript=true JavaApplets=true JavaScript=true ActiveXControls=true -CSS=2 CssVersion=2 supportsCSS=true -ecmascriptversion=1.2 +AOL=true +aolVersion=9.0 +ecmascriptversion=1.3 w3cdomversion=1.0 -[Mozilla/?.* (?compatible; *MSIE 5.5*)*] -Parent=IE 5.5 +[Mozilla/?.* (?compatible; *MSIE 6.0; *AOL 9.0*)*] +Parent=AOL 9.0/IE 6.0 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 95*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Win 9x 4.90*)*] +Parent=AOL 9.0/IE 6.0 +Platform=WinME + +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 95*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win95 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win98 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90*)*] -Parent=IE 5.5 -Platform=WinME +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90;*.NET CLR 1*)*] -Parent=IE 5.5 -Platform=WinME -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 5.5 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 +CssVersion=2 +supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90;*.NET CLR 2*)*] -Parent=IE 5.5 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] +Parent=AOL 9.0/IE 6.0 Platform=WinME -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98;*.NET CLR 1*)*] -Parent=IE 5.5 -Platform=Win98 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 5.5 -Platform=Win98 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98;*.NET CLR 2*)*] -Parent=IE 5.5 -Platform=Win98 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 5.5 -Platform=Win98 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0*)*] -Parent=IE 5.5 -Platform=WinNT +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0;*.NET CLR 1*)*] -Parent=IE 5.5 -Platform=WinNT -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 5.5 -Platform=WinNT -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0;*.NET CLR 2*)*] -Parent=IE 5.5 -Platform=WinNT -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 4.0*)*] +Parent=AOL 9.0/IE 6.0 Platform=WinNT -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0;*.NET CLR 1*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2000 -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0;*.NET CLR 2*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01;*.NET CLR 1*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2000 -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01;*.NET CLR 2*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*)*] +Parent=AOL 9.0/IE 6.0 Platform=WinXP -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1;*.NET CLR 1*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 Platform=WinXP -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 Platform=WinXP -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1;*.NET CLR 2*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 Platform=WinXP -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 Platform=WinXP -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2003 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2;*.NET CLR 1*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2003 -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2003 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2;*.NET CLR 2*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2003 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 5.5 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 Platform=Win2003 -netCLR=true -ClrVersion=2 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 6.0 +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*)*] +Parent=AOL 9.0/IE 6.0 +Platform=WinVista -[IE 6.0] +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 +Platform=WinVista + +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 +Platform=WinVista + +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] +Parent=AOL 9.0/IE 6.0 +Platform=WinVista + +[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 6.0 +Platform=WinVista + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 7.0 + +[AOL 9.0/IE 7.0] Parent=DefaultProperties -Browser=IE -Version=6.0 -MajorVer=6 +Browser=AOL +Version=7.0 +MajorVer=7 Win32=true Frames=true IFrames=true @@ -17277,319 +16308,300 @@ VBScript=true JavaApplets=true JavaScript=true ActiveXControls=true -CSS=2 CssVersion=2 supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 -msdomversion=6.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0*)*] -Parent=IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 95*)*] -Parent=IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98*)*] -Parent=IE 6.0 -Platform=Win98 +AOL=true +aolVersion=9.0 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90*)*] -Parent=IE 6.0 -Platform=WinME +[Mozilla/?.* (?compatible; *MSIE 7.0; *AOL 9.0*)*] +Parent=AOL 9.0/IE 7.0 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90;*.NET CLR 1*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Win 9x 4.90*)*] +Parent=AOL 9.0/IE 7.0 Platform=WinME -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 95*)*] +Parent=AOL 9.0/IE 7.0 +Platform=Win95 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90;*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*)*] +Parent=AOL 9.0/IE 7.0 +Platform=Win98 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0 -Platform=WinME -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98;*.NET CLR 1*)*] -Parent=IE 6.0 -Platform=Win98 -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=Win98 -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 +CssVersion=2 +supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98;*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=Win98 -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0 -Platform=Win98 -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] +Parent=AOL 9.0/IE 7.0 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0*)*] -Parent=IE 6.0 -Platform=WinNT +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0;*.NET CLR 1*)*] -Parent=IE 6.0 -Platform=WinNT -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=WinNT -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0;*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=WinNT -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 4.0*)*] +Parent=AOL 9.0/IE 7.0 Platform=WinNT -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0;*.NET CLR 1*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2000 -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0;*.NET CLR 2*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01;*.NET CLR 1*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2000 -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01;*.NET CLR 2*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*)*] +Parent=AOL 9.0/IE 7.0 Platform=WinXP -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1;*.NET CLR 1*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 Platform=WinXP -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 Platform=WinXP -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1;*.NET CLR 2*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 Platform=WinXP -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 Platform=WinXP -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2003 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*.NET CLR 1*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2003 -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2003 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*.NET CLR 2*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2003 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 Platform=Win2003 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*)*] +Parent=AOL 9.0/IE 7.0 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*.NET CLR 1*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] +Parent=AOL 9.0/IE 7.0 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] +Parent=AOL 9.0/IE 7.0 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 6.0 -Platform=WinXP +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Avant Browser -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*.NET CLR 1*)*] -Parent=IE 6.0 -Platform=WinXP -netCLR=true -ClrVersion=1 +[Avant Browser] +Parent=DefaultProperties +Browser=Avant Browser +Frames=true +IFrames=true +Tables=true +Cookies=true +BackgroundSounds=true +CDF=true +VBScript=true +JavaApplets=true +JavaScript=true +ActiveXControls=true +CssVersion=2 +supportsCSS=true -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Advanced Browser (http://www.avantbrowser.com)] +Parent=Avant Browser -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Avant Browser*] +Parent=Avant Browser -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Avant Browser/*] +Parent=Avant Browser -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0*)*] -Parent=IE 6.0 -Platform=WinVista +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 4.01 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0;*.NET CLR 1*)*] -Parent=IE 6.0 -Platform=WinVista -netCLR=true -ClrVersion=1 +[IE 4.01] +Parent=DefaultProperties +Browser=IE +Version=4.01 +MajorVer=4 +MinorVer=01 +Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +BackgroundSounds=true +CDF=true +VBScript=true +JavaApplets=true +JavaScript=true +ActiveXControls=true +CssVersion=2 +supportsCSS=true + +[Mozilla/?.* (?compatible; *MSIE 4.01*)*] +Parent=IE 4.01 + +[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 95*)*] +Parent=IE 4.01 +Platform=Win95 + +[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98*)*] +Parent=IE 4.01 +Platform=Win98 + +[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98; Win 9x 4.90;*)*] +Parent=IE 4.01 +Platform=WinME + +[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 4.0*)*] +Parent=IE 4.01 +Platform=WinNT + +[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.0*)*] +Parent=IE 4.01 +Platform=Win2000 + +[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.01*)*] +Parent=IE 4.01 +Platform=Win2000 + +[Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)] +Parent=IE 4.01 +Platform=WinNT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 + +[IE 5.0] +Parent=DefaultProperties +Browser=IE +Version=5.0 +MajorVer=5 +Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +BackgroundSounds=true +CDF=true +VBScript=true +JavaApplets=true +JavaScript=true +ActiveXControls=true +CssVersion=2 +supportsCSS=true + +[Mozilla/?.* (?compatible; *MSIE 5.0*)*] +Parent=IE 5.0 + +[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 95*)*] +Parent=IE 5.0 +Platform=Win95 + +[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98*)*] +Parent=IE 5.0 +Platform=Win98 + +[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*)*] +Parent=IE 5.0 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=WinVista -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 4.0*)*] +Parent=IE 5.0 +Platform=WinNT -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0;*.NET CLR 2*)*] -Parent=IE 6.0 -Platform=WinVista -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.0*)*] +Parent=IE 5.0 +Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0 -Platform=WinVista -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.01*)*] +Parent=IE 5.0 +Platform=Win2000 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 6.0b +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.01 -[IE 6.0b] +[IE 5.01] Parent=DefaultProperties Browser=IE -Version=6.0b -MajorVer=6 -MinorVer=0b -Beta=true +Version=5.01 +MajorVer=5 +MinorVer=01 Win32=true Frames=true IFrames=true @@ -17601,314 +16613,102 @@ VBScript=true JavaApplets=true JavaScript=true ActiveXControls=true -CSS=2 CssVersion=2 supportsCSS=true -[Mozilla/?.* (?compatible; *MSIE 6.0b*)*] -Parent=IE 6.0b +[Mozilla/?.* (?compatible; *MSIE 5.01*)*] +Parent=IE 5.01 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows 95*)*] -Parent=IE 6.0b +[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 95*)*] +Parent=IE 5.01 Platform=Win95 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows 98*)*] -Parent=IE 6.0b +[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98*)*] +Parent=IE 5.01 Platform=Win98 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows 98; Win 9x 4.90*)*] -Parent=IE 6.0b -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows 98; Win 9x 4.90;*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=WinME -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows 98; Win 9x 4.90;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinME -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows 98; Win 9x 4.90;*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinME -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows 98; Win 9x 4.90;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0b +[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98; Win 9x 4.90;*)*] +Parent=IE 5.01 Platform=WinME -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows 98;*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=Win98 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows 98;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=Win98 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows 98;*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=Win98 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows 98;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=Win98 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 4.0*)*] -Parent=IE 6.0b -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 4.0;*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=WinNT -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 4.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinNT -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 4.0;*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinNT -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 4.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0b +[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 4.0*)*] +Parent=IE 5.01 Platform=WinNT -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.0*)*] -Parent=IE 6.0b +[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.0*)*] +Parent=IE 5.01 Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.0;*.NET CLR 1*)*] -Parent=IE 6.0b +[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.01*)*] +Parent=IE 5.01 Platform=Win2000 -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=Win2000 -netCLR=true -ClrVersion=2 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.5 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.0;*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=Win2000 -netCLR=true -ClrVersion=2 +[IE 5.5] +Parent=DefaultProperties +Browser=IE +Version=5.5 +MajorVer=5 +MinorVer=5 +Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +BackgroundSounds=true +CDF=true +VBScript=true +JavaApplets=true +JavaScript=true +ActiveXControls=true +CssVersion=2 +supportsCSS=true +ecmascriptversion=1.2 +w3cdomversion=1.0 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/?.* (?compatible; *MSIE 5.5*)*] +Parent=IE 5.5 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.01*)*] -Parent=IE 6.0b -Platform=Win2000 +[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 95*)*] +Parent=IE 5.5 +Platform=Win95 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.01;*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=Win2000 -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98*)*] +Parent=IE 5.5 +Platform=Win98 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.01;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90*)*] +Parent=IE 5.5 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.01;*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0*)*] +Parent=IE 5.5 +Platform=WinNT -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.01;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0b +[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0*)*] +Parent=IE 5.5 Platform=Win2000 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.1*)*] -Parent=IE 6.0b -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.1;*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=WinXP -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.1;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinXP -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.1;*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinXP -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01*)*] +Parent=IE 5.5 +Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.1;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0b +[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1*)*] +Parent=IE 5.5 Platform=WinXP -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2*)*] -Parent=IE 6.0b -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=Win2003 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=Win2003 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=Win2003 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0b +[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2*)*] +Parent=IE 5.5 Platform=Win2003 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*Win64;*)*] -Parent=IE 6.0b -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*Win64;*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*Win64;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*Win64;*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*Win64;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 6.0b -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*WOW64;*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=WinXP -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*WOW64;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinXP -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*WOW64;*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinXP -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 5.2;*WOW64;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=WinXP -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 6.0*)*] -Parent=IE 6.0b -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 6.0;*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=WinVista -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 6.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinVista -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 6.0;*.NET CLR 2*)*] -Parent=IE 6.0b -Platform=WinVista -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 6.0b; *Windows NT 6.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 6.0b -Platform=WinVista -netCLR=true -ClrVersion=2 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 7.0 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 6.0 -[IE 7.0] +[IE 6.0] Parent=DefaultProperties Browser=IE -Version=7.0 -MajorVer=7 +Version=6.0 +MajorVer=6 Win32=true Frames=true IFrames=true @@ -17920,315 +16720,145 @@ VBScript=true JavaApplets=true JavaScript=true ActiveXControls=true -CSS=2 CssVersion=2 supportsCSS=true ecmascriptversion=1.2 -msdomversion=7.0 w3cdomversion=1.0 +msdomversion=6.0 -[Mozilla/?.* (?compatible; *MSIE 7.0*)*] -Parent=IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98*)*] -Parent=IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=WinME -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=WinME -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=WinME -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=WinME -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98;*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=Win98 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=Win98 -netCLR=true -ClrVersion=2 +[Mozilla/?.* (?compatible; *MSIE 6.0*)*] +Parent=IE 6.0 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98;*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=Win98 -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 95*)*] +Parent=IE 6.0 +Platform=Win95 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0 +[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98*)*] +Parent=IE 6.0 Platform=Win98 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0*)*] -Parent=IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0;*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=WinNT -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=WinNT -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0;*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=WinNT -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=WinNT -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0;*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0;*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01;*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90*)*] +Parent=IE 6.0 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01;*.NET CLR 2*)*] -Parent=IE 7.0 +[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0*)*] +Parent=IE 6.0 +Platform=WinNT + +[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0*)*] +Parent=IE 6.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0 +[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01*)*] +Parent=IE 6.0 Platform=Win2000 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*] -Parent=IE 7.0 +[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1*)*] +Parent=IE 6.0 Platform=WinXP -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1;*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=WinXP -netCLR=true -ClrVersion=1 +[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2*)*] +Parent=IE 6.0 +Platform=Win2003 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0 +[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*)*] +Parent=IE 6.0 Platform=WinXP -netCLR=true -ClrVersion=2 +Win32=false +Win64=true -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1;*.NET CLR 2*)*] -Parent=IE 7.0 +[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*)*] +Parent=IE 6.0 Platform=WinXP -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=WinXP -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0*)*] +Parent=IE 6.0 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2*)*] -Parent=IE 7.0 -Platform=Win2003 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 7.0 + +[IE 7.0] +Parent=DefaultProperties +Browser=IE +Version=7.0 +MajorVer=7 +Win32=true +Frames=true +IFrames=true +Tables=true +Cookies=true +BackgroundSounds=true +CDF=true +VBScript=true +JavaApplets=true +JavaScript=true +ActiveXControls=true +CssVersion=2 +supportsCSS=true +ecmascriptversion=1.2 +msdomversion=7.0 +w3cdomversion=1.0 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*.NET CLR 1*)*] +[Mozilla/?.* (?compatible; *MSIE 7.0*)*] Parent=IE 7.0 -Platform=Win2003 -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*.NET CLR 1*.NET CLR 2*)*] +[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98*)*] Parent=IE 7.0 -Platform=Win2003 -netCLR=true -ClrVersion=2 +Platform=Win98 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*.NET CLR 2*)*] +[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*)*] Parent=IE 7.0 -Platform=Win2003 -netCLR=true -ClrVersion=2 +Platform=WinME -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*.NET CLR 2*.NET CLR 1*)*] +[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0*)*] Parent=IE 7.0 -Platform=Win2003 -netCLR=true -ClrVersion=2 +Platform=WinNT -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*)*] +[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0*)*] Parent=IE 7.0 -Platform=WinXP -Win32=false -Win64=true +Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*.NET CLR 1*)*] +[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01*)*] Parent=IE 7.0 -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=1 +Platform=Win2000 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*.NET CLR 1*.NET CLR 2*)*] +[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*] Parent=IE 7.0 Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*.NET CLR 2*)*] +[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2*)*] Parent=IE 7.0 -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=2 +Platform=Win2003 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*.NET CLR 2*.NET CLR 1*)*] +[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*)*] Parent=IE 7.0 Platform=WinXP Win32=false Win64=true -netCLR=true -ClrVersion=2 [Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*)*] Parent=IE 7.0 Platform=WinXP -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=WinXP -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=WinXP -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=WinXP -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=WinXP -netCLR=true -ClrVersion=2 - [Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0*)*] Parent=IE 7.0 Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0;*.NET CLR 1*)*] -Parent=IE 7.0 -Platform=WinVista -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0 -Platform=WinVista -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0;*.NET CLR 2*)*] +[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.1*)*] Parent=IE 7.0 -Platform=WinVista -netCLR=true -ClrVersion=2 +Platform=Win7 -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0;*.NET CLR 2*.NET CLR 1*)*] +[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; *)*] Parent=IE 7.0 -Platform=WinVista -netCLR=true -ClrVersion=2 +Platform=Win7 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 7.0b +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 8.0 -[IE 7.0b] +[IE 8.0] Parent=DefaultProperties Browser=IE -Version=7.0b -MajorVer=7 -MinorVer=0b -Beta=true +Version=8.0 +MajorVer=8 Win32=true Frames=true IFrames=true @@ -18240,332 +16870,73 @@ VBScript=true JavaApplets=true JavaScript=true ActiveXControls=true -CSS=2 -CssVersion=2 +CssVersion=3 supportsCSS=true +ecmascriptversion=1.2 +msdomversion=8.0 +w3cdomversion=1.0 -[Mozilla/?.* (?compatible; *MSIE 7.0b*)*] -Parent=IE 7.0b - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows 98*)*] -Parent=IE 7.0b -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 7.0b -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows 98; Win 9x 4.90;*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=WinME -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows 98; Win 9x 4.90;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=WinME -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows 98; Win 9x 4.90;*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=WinME -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows 98; Win 9x 4.90;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=WinME -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows 98;*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=Win98 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows 98;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=Win98 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows 98;*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=Win98 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows 98;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=Win98 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 4.0*)*] -Parent=IE 7.0b -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 4.0;*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=WinNT -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 4.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=WinNT -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 4.0;*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=WinNT -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 4.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=WinNT -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.0*)*] -Parent=IE 7.0b -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.0;*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=Win2000 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=Win2000 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.0;*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=Win2000 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=Win2000 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.01*)*] -Parent=IE 7.0b -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.01;*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=Win2000 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.01;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0*)*] +Parent=IE 8.0 +Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.01;*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=Win2000 -netCLR=true -ClrVersion=2 +[Mozilla/4.0 (compatible; MSIE 8.0; Win32*)*] +Parent=IE 8.0 +Platform=Win32 -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.01;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0b +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0*)*] +Parent=IE 8.0 Platform=Win2000 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.1*)*] -Parent=IE 7.0b -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.1;*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=WinXP -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.1;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=WinXP -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.1;*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=WinXP -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.1;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0b +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1*)*] +Parent=IE 8.0 Platform=WinXP -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2*)*] -Parent=IE 7.0b -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=Win2003 -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=Win2003 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=Win2003 -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0b +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2*)*] +Parent=IE 8.0 Platform=Win2003 -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*Win64;*)*] -Parent=IE 7.0b -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*Win64;*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*Win64;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*Win64;*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*Win64;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=WinXP -Win32=false -Win64=true -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 7.0b -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*WOW64;*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=WinXP -netCLR=true -ClrVersion=1 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*WOW64;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=WinXP -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*WOW64;*.NET CLR 2*)*] -Parent=IE 7.0b -Platform=WinXP -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 5.2;*WOW64;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0b -Platform=WinXP -netCLR=true -ClrVersion=2 - -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 6.0*)*] -Parent=IE 7.0b -Platform=WinVista -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 6.0;*.NET CLR 1*)*] -Parent=IE 7.0b +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0*)*] +Parent=IE 8.0 Platform=WinVista -netCLR=true -ClrVersion=1 -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 6.0;*.NET CLR 1*.NET CLR 2*)*] -Parent=IE 7.0b +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0*)*] +Parent=IE 8.0 Platform=WinVista -netCLR=true -ClrVersion=2 -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 6.0;*.NET CLR 2*)*] -Parent=IE 7.0b +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Win64; x64; Trident/4.0*)*] +Parent=IE 8.0 Platform=WinVista -netCLR=true -ClrVersion=2 +Win32=false +Win64=true -[Mozilla/4.0 (compatible; MSIE 7.0b; *Windows NT 6.0;*.NET CLR 2*.NET CLR 1*)*] -Parent=IE 7.0b +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0*)*] +Parent=IE 8.0 Platform=WinVista -netCLR=true -ClrVersion=2 +Win64=false -[Mozilla/?.? (compatible; MSIE 4.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.0 -MajorVer=4 -MinorVer=0 +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1*)*] +Parent=IE 8.0 +Platform=Win7 -[Mozilla/?.? (compatible; MSIE 4.5*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.5 -MajorVer=4 -MinorVer=5 +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0*)*] +Parent=IE 8.0 +Platform=Win7 -[Mozilla/?.? (compatible; MSIE 5.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.0 -MajorVer=5 -MinorVer=0 +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0*)*] +Parent=IE 8.0 +Platform=Win7 +Win32=false +Win64=true -[Mozilla/?.? (compatible; MSIE 5.1*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.1 -MajorVer=5 -MinorVer=1 +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0*)*] +Parent=IE 8.0 +Platform=Win7 +Win64=false -[Mozilla/?.? (compatible; MSIE 5.2*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.2 -MajorVer=5 -MinorVer=2 +[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 7.0; Trident/4.0*)*] +Parent=IE 8.0 +Platform=Win7 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Default Browser @@ -18585,7 +16956,6 @@ IFrames=false Tables=true Cookies=false BackgroundSounds=false -AuthenticodeUpdate=0 CDF=false VBScript=false JavaApplets=false @@ -18593,15 +16963,16 @@ JavaScript=false ActiveXControls=false Stripper=false isBanned=false -WAP=false isMobileDevice=false isSyndicationReader=false Crawler=false -CSS=0 CssVersion=0 supportsCSS=false AOL=false aolVersion=0 +AuthenticodeUpdate=0 +CSS=0 +WAP=false netCLR=false ClrVersion=0 ECMAScriptVersion=0.0 diff --git a/data/net_2_0/machine.config b/data/net_2_0/machine.config index 4ff8e57b7a0..bb47350be0a 100644 --- a/data/net_2_0/machine.config +++ b/data/net_2_0/machine.config @@ -85,6 +85,7 @@
+
diff --git a/eglib/ChangeLog b/eglib/ChangeLog index e4fc5be5c2e..0b2b96b182d 100644 --- a/eglib/ChangeLog +++ b/eglib/ChangeLog @@ -1,3 +1,7 @@ +2009-06-20 Zoltan Varga + + * src/glib.h: Add GUINT32_FROM/TO_BE macros. + 2009-06-09 Jonathan Chambers * CMakeLists.txt: Add start of CMake build. diff --git a/eglib/src/glib.h b/eglib/src/glib.h index 619a071785b..b840166cb18 100644 --- a/eglib/src/glib.h +++ b/eglib/src/glib.h @@ -860,11 +860,15 @@ glong g_utf8_strlen (const gchar *str, gssize max); # define GUINT64_TO_LE(x) (x) # define GUINT16_TO_LE(x) (x) # define GUINT_TO_LE(x) (x) +# define GUINT32_TO_BE(x) GUINT32_SWAP_LE_BE(x) +# define GUINT32_FROM_BE(x) GUINT32_SWAP_LE_BE(x) #else # define GUINT32_TO_LE(x) GUINT32_SWAP_LE_BE(x) # define GUINT64_TO_LE(x) GUINT64_SWAP_LE_BE(x) # define GUINT16_TO_LE(x) GUINT16_SWAP_LE_BE(x) # define GUINT_TO_LE(x) GUINT32_SWAP_LE_BE(x) +# define GUINT32_TO_BE(x) (x) +# define GUINT32_FROM_BE(x) (x) #endif #define GUINT32_FROM_LE(x) (GUINT32_TO_LE (x)) diff --git a/libgc/ChangeLog b/libgc/ChangeLog index af9f7242f6c..f7e78a27d60 100644 --- a/libgc/ChangeLog +++ b/libgc/ChangeLog @@ -1,3 +1,21 @@ +2009-07-02 jonas echterhoff + + * darwin_stop_world.c: make debugger code compile on + OS X. + + * pthread_support.c: give mach ports to the debugger instead of pthreads, + as those can be iterated over from another executable. + +2009-06-22 Neale Ferguson + + * include/private/gc_locks.h: Fix typo in 390 version of GC_compare_and_exchange + and define a null memory barrier. + +2009-06-16 Geoff Norton + + * include/private/gcconfig.h: Disable static scanning on this platform + * misc.c: Enable platform-specific disabling of static scanning + 2009-06-06 Zoltan Varga * CMakeLists.txt: Fix handling of powerpc and the selection of diff --git a/libgc/darwin_stop_world.c b/libgc/darwin_stop_world.c index d3b94feb258..f9ba57c02b6 100644 --- a/libgc/darwin_stop_world.c +++ b/libgc/darwin_stop_world.c @@ -2,6 +2,12 @@ # if defined(GC_DARWIN_THREADS) +#include "mono/utils/mono-compiler.h" + +#ifdef MONO_DEBUGGER_SUPPORTED +#include "include/libgc-mono-debugger.h" +#endif + /* From "Inside Mac OS X - Mach-O Runtime Architecture" published by Apple Page 49: "The space beneath the stack pointer, where a new stack frame would normally @@ -682,4 +688,17 @@ void GC_darwin_register_mach_handler_thread(mach_port_t thread) { GC_use_mach_handler_thread = 1; } +#ifdef MONO_DEBUGGER_SUPPORTED +GCThreadFunctions *gc_thread_vtable = NULL; + +void * +GC_mono_debugger_get_stack_ptr (void) +{ + GC_thread me; + + me = GC_lookup_thread (pthread_self ()); + return &me->stop_info.stack_ptr; +} +#endif + #endif diff --git a/libgc/include/private/darwin_stop_world.h b/libgc/include/private/darwin_stop_world.h index f6f5314ee31..068e020f610 100644 --- a/libgc/include/private/darwin_stop_world.h +++ b/libgc/include/private/darwin_stop_world.h @@ -10,6 +10,12 @@ struct thread_stop_info { mach_port_t mach_thread; + + int signal; + word last_stop_count; /* GC_last_stop_count value when thread */ + /* last successfully handled a suspend */ + /* signal. */ + ptr_t stack_ptr; /* Valid only when stopped. */ }; struct GC_mach_thread { diff --git a/libgc/include/private/gc_locks.h b/libgc/include/private/gc_locks.h index 83fe57d917d..6b1256dcbca 100644 --- a/libgc/include/private/gc_locks.h +++ b/libgc/include/private/gc_locks.h @@ -565,7 +565,7 @@ # endif /* ALPHA */ # if defined(S390) # if !defined(GENERIC_COMPARE_AND_SWAP) - inline static GC_bool GC_compare_and_exchange(volatile C_word *addr, + inline static GC_bool GC_compare_and_exchange(volatile GC_word *addr, GC_word old, GC_word new_val) { int retval; @@ -583,6 +583,7 @@ return retval == 0; } # endif +# define GC_memory_barrier() # endif # if !defined(GENERIC_COMPARE_AND_SWAP) /* Returns the original value of *addr. */ diff --git a/libgc/include/private/gcconfig.h b/libgc/include/private/gcconfig.h index 66137857ba8..d46e686aa0b 100644 --- a/libgc/include/private/gcconfig.h +++ b/libgc/include/private/gcconfig.h @@ -334,6 +334,7 @@ # define ARM # define mach_type_known # define DARWIN_DONT_PARSE_STACK +# define GC_DONT_REGISTER_MAIN_STATIC_DATA # endif # endif # if defined(NeXT) && defined(mc68000) diff --git a/libgc/misc.c b/libgc/misc.c index ee4348b2920..4744faa405e 100644 --- a/libgc/misc.c +++ b/libgc/misc.c @@ -81,6 +81,8 @@ /* dyn_load.c isn't linked in. */ #ifdef DYNAMIC_LOADING # define GC_REGISTER_MAIN_STATIC_DATA() GC_register_main_static_data() +#elif defined(GC_DONT_REGISTER_MAIN_STATIC_DATA) +# define GC_REGISTER_MAIN_STATIC_DATA() FALSE #else # define GC_REGISTER_MAIN_STATIC_DATA() TRUE #endif diff --git a/libgc/pthread_support.c b/libgc/pthread_support.c index 11d2cd6ad71..46a5f1f469f 100644 --- a/libgc/pthread_support.c +++ b/libgc/pthread_support.c @@ -1010,7 +1010,11 @@ void GC_thr_init() t -> flags = DETACHED | MAIN_THREAD; #ifdef MONO_DEBUGGER_SUPPORTED if (gc_thread_vtable && gc_thread_vtable->thread_created) - gc_thread_vtable->thread_created (pthread_self (), &t->stop_info.stack_ptr); +# ifdef GC_DARWIN_THREADS + gc_thread_vtable->thread_created (mach_thread_self (), &t->stop_info.stack_ptr); +# else + gc_thread_vtable->thread_created (pthread_self (), &t->stop_info.stack_ptr); +# endif #endif GC_stop_init(); @@ -1324,7 +1328,11 @@ void * GC_start_routine_head(void * arg, void *base_addr, # endif /* IA64 */ #ifdef MONO_DEBUGGER_SUPPORTED if (gc_thread_vtable && gc_thread_vtable->thread_created) - gc_thread_vtable->thread_created (my_pthread, &me->stop_info.stack_ptr); +# ifdef GC_DARWIN_THREADS + gc_thread_vtable->thread_created (mach_thread_self(), &me->stop_info.stack_ptr); +# else + gc_thread_vtable->thread_created (my_pthread, &me->stop_info.stack_ptr); +# endif #endif UNLOCK(); diff --git a/man/mono.1 b/man/mono.1 index 563b73ac012..d1c39c10028 100644 --- a/man/mono.1 +++ b/man/mono.1 @@ -5,7 +5,7 @@ .\" Author: .\" Miguel de Icaza (miguel@gnu.org) .\" -.TH Mono "Mono 2.2" +.TH Mono "Mono 2.5" .SH NAME mono \- Mono's ECMA-CLI native code generator (Just-in-Time and Ahead-of-Time) .SH SYNOPSIS @@ -1230,13 +1230,14 @@ For example, this would work from the shell: .fi If you are using mod_mono to host your web applications, you can use the -.B MonoSetEnv -directive, like this: +.B MonoIOMAP +directive instead, like this: .nf - MonoSetEnv MONO_IOMAP=all + MonoIOMAP all .fi +See mod_mono(8) for more details. .TP \fBMONO_MANAGED_WATCHER\fR If set to "disabled", System.IO.FileSystemWatcher will use a file watcher @@ -1264,8 +1265,8 @@ the Global Assembly Cache (see gacutil(1)) or having the dependent libraries side-by-side with the main executable. .Sp For a complete description of recommended practices for application -deployment, see the -http://www.mono-project.com/Guidelines:Application_Deployment page. +deployment, see +http://www.mono-project.com/Guidelines:Application_Deployment .TP \fBMONO_RTC\fR Experimental RTC support in the statistical profiler: if the user has @@ -1557,7 +1558,7 @@ http://www.mono-project.com .SH SEE ALSO .PP certmgr(1), csharp(1), mcs(1), mdb(1), monocov(1), monodis(1), -mono-config(5), mozroots(1), pdb2mdb(1), xsp(1). +mono-config(5), mozroots(1), pdb2mdb(1), xsp(1), mod_mono(8). .PP For more information on AOT: http://www.mono-project.com/AOT diff --git a/mcs/ChangeLog b/mcs/ChangeLog index f3257c5c0ee..f072feb192c 100644 --- a/mcs/ChangeLog +++ b/mcs/ChangeLog @@ -1,3 +1,7 @@ +2009-07-10 Atsushi Enomoto + + * nunit20 : removed old framework. + 2009-06-07 Marek Safar * Makefile: Add net_4_0* profiles. diff --git a/mcs/build/common/ChangeLog b/mcs/build/common/ChangeLog index 828824cba56..68fa7defd69 100644 --- a/mcs/build/common/ChangeLog +++ b/mcs/build/common/ChangeLog @@ -1,3 +1,8 @@ +2009-06-15 Miguel de Icaza + + * MonoTODOAttribute.cs: Thin diet, no point in having virtual + methods and overrides that do the same thing. + 2009-06-10 Marek Safar * Consts.cs.in: Add AssemblySystemCore_3_5. diff --git a/mcs/build/common/MonoTODOAttribute.cs b/mcs/build/common/MonoTODOAttribute.cs index 018db982dd2..ca23aa7eef1 100644 --- a/mcs/build/common/MonoTODOAttribute.cs +++ b/mcs/build/common/MonoTODOAttribute.cs @@ -48,7 +48,7 @@ namespace System { this.comment = comment; } - public virtual string Comment { + public string Comment { get { return comment; } } } @@ -60,10 +60,6 @@ namespace System { : base (comment) { } - - public override string Comment { - get { return base.Comment; } - } } [AttributeUsage (AttributeTargets.All, AllowMultiple=true)] @@ -73,10 +69,6 @@ namespace System { : base (comment) { } - - public override string Comment { - get { return base.Comment; } - } } [AttributeUsage (AttributeTargets.All, AllowMultiple=true)] @@ -86,10 +78,6 @@ namespace System { : base (comment) { } - - public override string Comment { - get { return base.Comment; } - } } [AttributeUsage (AttributeTargets.All, AllowMultiple=true)] @@ -99,10 +87,6 @@ namespace System { : base (comment) { } - - public override string Comment { - get { return base.Comment; } - } } [AttributeUsage (AttributeTargets.All, AllowMultiple=true)] @@ -112,9 +96,5 @@ namespace System { : base (comment) { } - - public override string Comment { - get { return base.Comment; } - } } } diff --git a/mcs/class/ChangeLog b/mcs/class/ChangeLog index 15de9f325c2..4bfc375dad8 100644 --- a/mcs/class/ChangeLog +++ b/mcs/class/ChangeLog @@ -1,3 +1,20 @@ +2009-07-06 Raja R Harinath + + * Makefile (common_dirs): Add SystemWebTestShim. + +2009-07-06 Raja R Harinath + + * Makefile (net_1_1_dirs): Move Mono.Cecil ... + (common_dirs): ... here. + +2009-07-02 Marek Safar + + * Makefile: Add System.Dynamic. + +2009-06-29 Marek Safar + + * Makefile: Add Microsoft.CSharp. + 2009-04-07 Miguel de Icaza * Mono.Tasklets/Mono.Tasklets/Continuation.cs: Fix the signature diff --git a/mcs/class/Makefile b/mcs/class/Makefile index 7055b6f9ec0..441bae50e78 100644 --- a/mcs/class/Makefile +++ b/mcs/class/Makefile @@ -77,7 +77,6 @@ common_dirs := \ RabbitMQ.Client \ Mono.Messaging \ System.Messaging \ - Mono.Messaging.RabbitMQ \ System.ServiceProcess \ System.Drawing.Design \ System.Design \ @@ -87,12 +86,13 @@ common_dirs := \ IBM.Data.DB2 \ Microsoft.JScript \ CustomMarshalers \ - OpenSystem.C + OpenSystem.C \ + Mono.Cecil \ + Mono.Cecil.Mdb \ + SystemWebTestShim net_1_1_dirs := \ - FirebirdSql.Data.Firebird \ - Mono.Cecil \ - Mono.Cecil.Mdb \ + FirebirdSql.Data.Firebird net_2_0_dirs := \ Microsoft.Build.Framework \ @@ -119,8 +119,9 @@ net_2_0_dirs := \ Mono.Management \ Mono.Options \ Mono.Simd \ - Mono.Tasklets - + Mono.Tasklets \ + Mono.Messaging.RabbitMQ + net_2_0_only_dirs := \ System.Web.Extensions_1.0 \ System.Web.Extensions.Design_1.0 @@ -144,6 +145,10 @@ net_3_5_dirs := \ Microsoft.Build.Tasks \ System.Web.Extensions.Design +net_4_0_dirs := \ + System.Dynamic \ + Microsoft.CSharp + net_1_1_bootstrap_SUBDIRS := $(bootstrap_dirs) PEAPI net_1_1_SUBDIRS := $(common_dirs) $(net_1_1_dirs) net_2_0_bootstrap_SUBDIRS := $(bootstrap_dirs) PEAPI @@ -152,11 +157,11 @@ net_2_1_bootstrap_SUBDIRS := corlib System Mono.CompilerServices.SymbolWriter net_2_1_raw_SUBDIRS := $(net_2_1_dirs) net_3_5_SUBDIRS := $(net_3_5_dirs) net_4_0_bootstrap_SUBDIRS := $(bootstrap_dirs) PEAPI -net_4_0_SUBDIRS := $(common_dirs) $(net_2_0_dirs) +net_4_0_SUBDIRS := $(common_dirs) $(net_2_0_dirs) $(net_4_0_dirs) include ../build/rules.make -SUBDIRS = $(common_dirs) $(net_1_1_dirs) $(net_2_0_dirs) $(net_2_0_only_dirs) $(net_2_1_dirs) $(net_3_5_dirs) +SUBDIRS = $(common_dirs) $(net_1_1_dirs) $(net_2_0_dirs) $(net_2_0_only_dirs) $(net_2_1_dirs) $(net_3_5_dirs) $(net_4_0_dirs) # These libraries below are either unimplemented or don't compile, but #BROKEN_SUBDIRS = diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms.CarbonInternal/ChangeLog b/mcs/class/Managed.Windows.Forms/System.Windows.Forms.CarbonInternal/ChangeLog index b0cc0ece1a2..264e831b759 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms.CarbonInternal/ChangeLog +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms.CarbonInternal/ChangeLog @@ -1,3 +1,8 @@ +2009-06-26 Atsushi Enomoto + + * KeyboardHandler.cs : support multi-byte text input. + Fixed bug #501276. + 2009-01-07 Geoff Norton * WindowHandler.cs: Don't attempt to activate a disposed Form. diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms.CarbonInternal/KeyboardHandler.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms.CarbonInternal/KeyboardHandler.cs index b42b92f9969..edc2416b9a9 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms.CarbonInternal/KeyboardHandler.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms.CarbonInternal/KeyboardHandler.cs @@ -55,6 +55,8 @@ namespace System.Windows.Forms.CarbonInternal { internal static bool translate_modifier = false; + internal string ComposedString; + static KeyboardHandler () { // our key filter table is a 256 byte array - if the corresponding byte // is set the key should be filtered from WM_CHAR (apple pushes unicode events @@ -196,11 +198,17 @@ namespace System.Windows.Forms.CarbonInternal { Marshal.FreeHGlobal (buffer); if (key_filter_table [bdata [0]] == 0x00) { - // TODO: We support 2byte/4byte unicode? how does this get packed - msg.message = Msg.WM_CHAR; - msg.wParam = BitConverter.IsLittleEndian ? (IntPtr) bdata [0] : (IntPtr) bdata [size-1]; - msg.lParam = IntPtr.Zero; - msg.hwnd = XplatUICarbon.FocusWindow; + if (size == 1) { + msg.message = Msg.WM_CHAR; + msg.wParam = BitConverter.IsLittleEndian ? (IntPtr) bdata [0] : (IntPtr) bdata [size-1]; + msg.lParam = IntPtr.Zero; + msg.hwnd = XplatUICarbon.FocusWindow; + } else { + msg.message = Msg.WM_IME_COMPOSITION; + Encoding enc = BitConverter.IsLittleEndian ? Encoding.Unicode : Encoding.BigEndianUnicode; + ComposedString = enc.GetString (bdata); + msg.hwnd = XplatUICarbon.FocusWindow; + } } } diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog index 5d0cf73e39c..edc79578111 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog @@ -1,3 +1,148 @@ +2009-07-13 Carlos Alberto Cortez + + * TextBoxBase.cs: Expose the margin top width as a property, to keep + the code clean. + * ToolStripTextBox.cs: Since we are actually using no border in the + default TextBox impl, and we are drawing the border ourselves, we need + to manually set the top margin. + Fixes part of #507462. + +2009-07-06 Carlos Alberto Cortez + + * PrintPreviewDialog.cs: Record when left was pressed, so we can + simulate Tab+Alt when moving the focus throughout our buttons and + controls. + Fixes the remaining bits of #509142. + +2009-07-05 Carlos Alberto Cortez + + * TabControl.cs: When computing the width of each tab page, use the + page's Font instead of the tab control one. + Fixes #514368. + +2009-07-03 Carlos Alberto Cortez + + * MenuAPI.cs: When handling the Keys.Left key, don't close the menu if + the current menu is specifically a ContextMenu (this is what .net does + as well). This way we also avoid a crash caused by MenuTracker trying + to use the menu when it was already hidden. + +2009-07-03 Carlos Alberto Cortez + + * PrintPreviewDialog.cs: Remove the code used to handle the + DropDown menu, since we are now doing it by default in ToolBar, and + just call the base impl as needed.Also, deactivate the dropdown menu + before moving the focus to a different button in our toolbar, as .net + does. + * ContextMenu.cs: + * MenuAPI.cs: Make as internal the needed bits to deactivate a + ContextMenu, and also to keep some beauty in our api. + +2009-07-02 Carlos Alberto Cortez + + * ToolBar.cs: When handling the key down message, if we are on a + drop down button, either show the DropDownMenu or pass the key to its + ProcessCmdKey method as needed. + Fixes the remaining bits of #509985. + +2009-06-29 Carlos Alberto Cortez + + * ToolBar.cs: Isolate the event logic related to OnButtonClick. Also + set current_item when navigating with the keyboard, so we can use it + properly later. Finally, handle both Enter and Space to fire + OnButtonClick *only*, without any other impact, as .net does. + Fixes part of #509985. + +2009-06-29 Carlos Alberto Cortez + + * MenuAPI.cs: Close any active menu when we get a simple Alt. + Fixes #509299. + +2009-06-26 Carlos Alberto Cortez + + * ToolBar.cs: In OnButtonClick only change the Pushed value for + buttons with toogle style. We were previously doing it for + DropDownButton's buttons, but that's not what .net is doing. + Fixes #510030. + +2009-06-26 Atsushi Enomoto + + * XplatUICarbon.cs : support multi-byte text input. + Fixed bug #501276. + +2009-06-22 Carlos Alberto Cortez + + * ListBox.cs: When creating DrawItemEventArgs, pass either + Theme.ColorHighlightText or ForeColor depending on the selected state + of our item, as .net does. + Fixes #512115. + +2009-06-22 Carlos Alberto Cortez + + * ComboBox.cs: When handling WM_CHAR, process the message first, and + send it to the textbox only if it wasn't handled. + Fixes #507459. + +2009-06-18 Jonathan Pobst + + * ComboBox.cs: Only do my big sort at the end of AddRange if + the combobox is actually set to Sorted. + +2009-06-18 Tom Hindle + + * XplatUIX11.cs: Enabled Text to coexist with custom data formats. + Fixes #511849. + +2009-06-18 Carlos Alberto Cortez + + * ListBox.cs: When calculating the scrollbars for non MultiColumn + mode, force the use of the horizontal scrollbar only if + ScrollAlwaysVisible is true as well. + Fixes #513029. + +2009-06-17 Jonathan Pobst + + * ComboBox.cs: When using AddRange on a sorted combobox, don't + try to use our inefficient sorted insert method, just append + it and sort the whole thing at then end. + [Fixes bug #511247] + +2009-06-16 Carlos Alberto Cortez + + * ToolBar.cs: Expose as internal the code used to show a dropdown menu. + * PrintPreviewDialog.cs: Handle the down/up arrow keys for our + DropDown element. + Fixes #509152. + +2009-06-16 Ivan N. Zlatev + + * DataGridView.cs: Scrolling fixes. + [Fixes bug #512816] + +2009-06-16 Ivan N. Zlatev + + * DataGridView.cs, DataGridViewRowCollection.cs: Clean up a bit and + optimize for batch adding rows. + +2009-06-16 Ivan N. Zlatev + + * DataGridView.cs: Avoid calling ReBind twice during the initial data + binding. + [Fixes bug #512807] + +2009-06-16 Ivan N. Zlatev + + * DataGridView.cs: Suppress invalidation during data binding. + [Fixes part of bug #512807] + +2009-06-15 Carlos Alberto Cortez + + * PrintPreviewDialog.cs: Tune the navigation among the buttons and + controls that are part of our ToolBar, so we can mimic the behaviour + observed in .Net, by handling also the arrow keys and doing the + preprocess for them too. + Fixes the remaining bits of #509142. + 2009-06-12 Carlos Alberto Cortez * ToolBar.cs: Expose the current item as internal. @@ -39840,4 +39985,3 @@ XplatUIX11.cs, lang.cs: - Initial check-in - diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ComboBox.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ComboBox.cs index a49e994130b..dfcf50bae24 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ComboBox.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ComboBox.cs @@ -1396,9 +1396,10 @@ namespace System.Windows.Forms break; goto case Msg.WM_CHAR; case Msg.WM_CHAR: - if (textbox_ctrl != null) + // Call our own handler first and send the message to the TextBox if still needed + if (!ProcessKeyMessage (ref m) && textbox_ctrl != null) XplatUI.SendMessage (textbox_ctrl.Handle, (Msg) m.Msg, m.WParam, m.LParam); - break; + return; case Msg.WM_MOUSELEAVE: Point location = PointToClient (Control.MousePosition); if (ClientRectangle.Contains (location)) @@ -2080,7 +2081,7 @@ namespace System.Windows.Forms { int idx; - idx = AddItem (item); + idx = AddItem (item, false); owner.UpdatedItems (); return idx; } @@ -2091,8 +2092,11 @@ namespace System.Windows.Forms throw new ArgumentNullException ("items"); foreach (object mi in items) - AddItem (mi); - + AddItem (mi, true); + + if (owner.sorted) + Sort (); + owner.UpdatedItems (); } @@ -2167,7 +2171,7 @@ namespace System.Windows.Forms owner.BeginUpdate (); if (owner.Sorted) - AddItem (item); + AddItem (item, false); else { object_items.Insert (index, item); #if NET_2_0 @@ -2214,12 +2218,14 @@ namespace System.Windows.Forms #endregion Public Methods #region Private Methods - private int AddItem (object item) + private int AddItem (object item, bool suspend) { + // suspend means do not sort as we put new items in, we will do a + // big sort at the end if (item == null) throw new ArgumentNullException ("item"); - if (owner.Sorted) { + if (owner.Sorted && !suspend) { int index = 0; foreach (object o in object_items) { if (String.Compare (item.ToString (), o.ToString ()) < 0) { @@ -2254,7 +2260,10 @@ namespace System.Windows.Forms internal void AddRange (IList items) { foreach (object mi in items) - AddItem (mi); + AddItem (mi, false); + + if (owner.sorted) + Sort (); owner.UpdatedItems (); } diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ContextMenu.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ContextMenu.cs index 73bc82ed4af..115dcdd7e32 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ContextMenu.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ContextMenu.cs @@ -140,5 +140,9 @@ namespace System.Windows.Forms } #endif #endregion Public Methods + internal void Hide () + { + tracker.Deactivate (); + } } } diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridView.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridView.cs index 4695666152e..ab9339b666f 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridView.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridView.cs @@ -737,9 +737,15 @@ namespace System.Windows.Forms { throw new NotSupportedException ("Type cannot be bound."); ClearBinding (); - dataSource = value; - if (BindingContext != null) + + // Do not set dataSource prior to te BindingContext check because there is some lazy initialization + // code which might result in double call to ReBind here and in OnBindingContextChanged + if (BindingContext != null) { + dataSource = value; ReBind (); + } else { + dataSource = value; + } OnDataSourceChanged (EventArgs.Empty); } } @@ -1029,10 +1035,10 @@ namespace System.Windows.Forms { if (ColumnCount == 0) ColumnCount = 1; - for (int i = rows.Count; i < value; i++) { - DataGridViewRow row = (DataGridViewRow) RowTemplateFull; - rows.AddInternal (row, false); - } + List newRows = new List (value - rows.Count); + for (int i = rows.Count; i < value; i++) + newRows.Add ((DataGridViewRow) RowTemplateFull); + rows.AddRange (newRows.ToArray()); } } } @@ -2401,17 +2407,32 @@ namespace System.Windows.Forms { return true; } - [MonoTODO ("Always includes partial columns")] public int DisplayedColumnCount (bool includePartialColumns) { int result = 0; - - for (int i = first_col_index; i < Columns.Count; i++) - if (Columns.ColumnDisplayIndexSortedArrayList[i].Displayed) + int columnLeft = 0; + + if (RowHeadersVisible) + columnLeft += RowHeadersWidth; + + Size visibleClientArea = ClientSize; + if (verticalScrollBar.Visible) + visibleClientArea.Width -= verticalScrollBar.Width; + if (horizontalScrollBar.Visible) + visibleClientArea.Height -= horizontalScrollBar.Height; + + for (int index = first_col_index; index < Columns.Count; index++) { + DataGridViewColumn column = Columns[ColumnDisplayIndexToIndex (index)]; + if (columnLeft + column.Width <= visibleClientArea.Width) { result++; - else + columnLeft += column.Width; + } else { + if (includePartialColumns) + result++; break; - + } + } + return result; } @@ -2896,7 +2917,8 @@ namespace System.Windows.Forms { if (rowIndex < 0 || rowIndex >= rows.Count) throw new ArgumentOutOfRangeException ("Row index is out of range."); - Invalidate (GetCellDisplayRectangle (columnIndex, rowIndex, true)); + if (!is_binding) + Invalidate (GetCellDisplayRectangle (columnIndex, rowIndex, true)); } public void InvalidateColumn (int columnIndex) @@ -2904,7 +2926,8 @@ namespace System.Windows.Forms { if (columnIndex < 0 || columnIndex >= columns.Count) throw new ArgumentOutOfRangeException ("Column index is out of range."); - Invalidate (GetColumnDisplayRectangle (columnIndex, true)); + if (!is_binding) + Invalidate (GetColumnDisplayRectangle (columnIndex, true)); } public void InvalidateRow (int rowIndex) @@ -2912,7 +2935,8 @@ namespace System.Windows.Forms { if (rowIndex < 0 || rowIndex >= rows.Count) throw new ArgumentOutOfRangeException ("Row index is out of range."); - Invalidate (GetRowDisplayRectangle (rowIndex, true)); + if (!is_binding) + Invalidate (GetRowDisplayRectangle (rowIndex, true)); } public virtual void NotifyCurrentCellDirty (bool dirty) { @@ -4972,7 +4996,7 @@ namespace System.Windows.Forms { // Select the first row if we are not databound. // If we are databound selection is managed by the data manager. - if (IsHandleCreated && DataManager == null && Rows.Count == 1 && Columns.Count > 0) + if (IsHandleCreated && DataManager == null && CurrentCell == null && Rows.Count > 0 && Columns.Count > 0) MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, true); AutoResizeColumnsInternal (); @@ -5705,13 +5729,18 @@ namespace System.Windows.Forms { internal void OnHScrollBarScroll (object sender, ScrollEventArgs e) { + int lastRightVisibleColumntIndex = Columns.Count - DisplayedColumnCount (false); horizontalScrollingOffset = e.NewValue; int left = 0; for (int index = 0; index < Columns.Count; index++) { DataGridViewColumn col = Columns[index]; - if (e.NewValue < left + col.Width) { + if (col.Index >= lastRightVisibleColumntIndex) { + first_col_index = lastRightVisibleColumntIndex; + Invalidate (); + OnScroll (e); + } else if (e.NewValue < left + col.Width) { if (first_col_index != index) { first_col_index = index; Invalidate (); @@ -5741,6 +5770,8 @@ namespace System.Windows.Forms { if (row.Index >= lastTopVisibleRowIndex) { first_row_index = lastTopVisibleRowIndex; + Invalidate (); + OnScroll (e); } else if (e.NewValue < top + row.Height) { if (first_row_index != index) { first_row_index = index; @@ -6003,10 +6034,9 @@ namespace System.Windows.Forms { return; DataGridViewRow row = (DataGridViewRow)RowTemplateFull; - rows.InternalAdd (row); + rows.AddInternal (row, false); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties (element); - foreach (PropertyDescriptor property in properties) { if (property.PropertyType == typeof (IBindingList)) continue; @@ -6126,8 +6156,6 @@ namespace System.Windows.Forms { } PrepareEditingRow (false, true); - PerformLayout(); - Invalidate (); } private void MoveCurrentCell (int x, int y, bool select, bool isControl, bool isShift, bool scroll) @@ -6194,14 +6222,14 @@ namespace System.Windows.Forms { if (scroll) { int disp_x = ColumnIndexToDisplayIndex (x); bool scrollbarsRefreshed = false; + int displayedColumnsCount = DisplayedColumnCount (false); + int delta_x = 0; + // The trick here is that in order to avoid unnecessary calculations each time a row/column + // is added/removed we recalculate the whole grid size just before the scroll to selection. if (disp_x < first_col_index) { - // The trick here is that in order to avoid unnecessary calculations each time a row/column - // is added/removed we recalculate the whole grid size just before just before the scroll - // to selection. RefreshScrollBars (); scrollbarsRefreshed = true; - int delta_x = 0; if (disp_x == 0) delta_x = horizontalScrollBar.Value; @@ -6215,6 +6243,18 @@ namespace System.Windows.Forms { horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value - delta_x); OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value)); + } else if (disp_x > first_col_index + displayedColumnsCount - 1) { + RefreshScrollBars (); + scrollbarsRefreshed = true; + + if (disp_x == Columns.Count - 1) + delta_x = horizontalScrollBar.Maximum - horizontalScrollBar.Value; + else + for (int i = first_col_index + displayedColumnsCount - 1; i < disp_x; i++) + delta_x += Columns[ColumnDisplayIndexToIndex (i)].Width; + + horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value + delta_x); + OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value)); } int disp_y = y; @@ -6317,10 +6357,15 @@ namespace System.Windows.Forms { private void ReBind () { if (!is_binding) { + SuspendLayout (); + is_binding = true; ClearBinding (); DoBinding (); is_binding = false; + + ResumeLayout (true); + Invalidate (); } } diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowCollection.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowCollection.cs index 3d55ca5733c..9af26a926ee 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowCollection.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridViewRowCollection.cs @@ -106,19 +106,21 @@ namespace System.Windows.Forms return Add (value as DataGridViewRow); } - internal int AddInternal (DataGridViewRow dataGridViewRow, bool sharable) + private int AddCore (DataGridViewRow dataGridViewRow, bool sharable) { if (dataGridView.Columns.Count == 0) throw new InvalidOperationException ("DataGridView has no columns."); int result; + dataGridViewRow.SetDataGridView (dataGridView); + // // Add the row just before the editing row (if there is an editing row). // int editing_index = -1; if (DataGridView != null && DataGridView.EditingRow != null && DataGridView.EditingRow != dataGridViewRow) { - editing_index = list.IndexOf (DataGridView.EditingRow); + editing_index = list.Count - 1; // always the last row DataGridView.EditingRow.SetIndex (list.Count); } @@ -134,16 +136,17 @@ namespace System.Windows.Forms } else { dataGridViewRow.SetIndex (result); } - dataGridViewRow.SetDataGridView (dataGridView); + CompleteRowCells (dataGridViewRow); for (int i = 0; i < dataGridViewRow.Cells.Count; i++) { dataGridViewRow.Cells [i].SetOwningColumn (dataGridView.Columns [i]); } - OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Add, dataGridViewRow)); if (raiseEvent) { + OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Add, dataGridViewRow)); DataGridView.OnRowsAddedInternal (new DataGridViewRowsAddedEventArgs (result, 1)); } + return result; } @@ -163,7 +166,7 @@ namespace System.Windows.Forms { if (dataGridView.DataSource != null) throw new InvalidOperationException ("DataSource of DataGridView is not null."); - return AddInternal (dataGridViewRow, true); + return AddCore (dataGridViewRow, true); } private bool CanBeShared (DataGridViewRow row) @@ -212,7 +215,7 @@ namespace System.Windows.Forms throw new InvalidOperationException("DataGridView is in virtual mode."); DataGridViewRow row = (DataGridViewRow)dataGridView.RowTemplateFull; - int result = AddInternal (row, false); + int result = AddCore (row, false); row.SetValues(values); return result; } @@ -239,15 +242,17 @@ namespace System.Windows.Forms if (dataGridView.DataSource != null) throw new InvalidOperationException ("DataSource of DataGridView is not null."); - raiseEvent = false; int count = 0; int lastIndex = -1; + raiseEvent = false; foreach (DataGridViewRow row in dataGridViewRows) { lastIndex = Add (row); count++; } - DataGridView.OnRowsAddedInternal (new DataGridViewRowsAddedEventArgs (lastIndex - count + 1, count)); raiseEvent = true; + + DataGridView.OnRowsAddedInternal (new DataGridViewRowsAddedEventArgs (lastIndex - count + 1, count)); + OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Add, dataGridViewRows)); } public virtual void Clear () @@ -409,6 +414,7 @@ namespace System.Windows.Forms Insert (index, value as DataGridViewRow); } + // FIXME: Do *not* allow insertation *after* the editing row! public virtual void Insert (int rowIndex, DataGridViewRow dataGridViewRow) { dataGridViewRow.SetIndex (rowIndex); @@ -534,18 +540,11 @@ namespace System.Windows.Forms CollectionChanged (this, e); } - internal void InternalAdd (DataGridViewRow dataGridViewRow) + internal void AddInternal (DataGridViewRow dataGridViewRow, bool sharable) { - dataGridViewRow.SetDataGridView (dataGridView); - - // Add the row just before the editing row (if there is an editing row). - if (DataGridView != null && DataGridView.EditingRow != null && DataGridView.NewRowIndex >= 0) { - DataGridView.EditingRow.SetIndex (list.Count); - list.Insert (DataGridView.NewRowIndex, dataGridViewRow); - } else - list.Add (dataGridViewRow); - - dataGridViewRow.SetIndex (list.IndexOf (dataGridViewRow)); + raiseEvent = false; + AddCore (dataGridViewRow, sharable); + raiseEvent = true; } internal ArrayList RowIndexSortedArrayList { diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListBox.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListBox.cs index 2f056230dc6..4aa74f76633 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListBox.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListBox.cs @@ -1345,7 +1345,8 @@ namespace System.Windows.Forms rect.Width += hscrollbar.Value; } - OnDrawItem (new DrawItemEventArgs (dc, Font, rect, i, state, ForeColor, BackColor)); + Color fore_color = (state & DrawItemState.Selected) != 0 ? ThemeEngine.Current.ColorHighlightText : ForeColor; + OnDrawItem (new DrawItemEventArgs (dc, Font, rect, i, state, fore_color, BackColor)); } } @@ -2208,7 +2209,7 @@ namespace System.Windows.Forms show = true; hscrollbar.Maximum = canvas_size.Width; hscrollbar.LargeChange = Math.Max (0, items_area.Width); - } else if (horizontal_scrollbar) { + } else if (scroll_always_visible && horizontal_scrollbar) { show = true; enabled = false; hscrollbar.Maximum = 0; diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/MenuAPI.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/MenuAPI.cs index e9316f9ad19..b412ac1c10d 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/MenuAPI.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/MenuAPI.cs @@ -87,7 +87,7 @@ namespace System.Windows.Forms { } } - void Deactivate () + internal void Deactivate () { bool redrawbar = (keynav_state != KeyNavState.Idle) && (TopMenu is MainMenu); @@ -679,6 +679,13 @@ namespace System.Windows.Forms { public bool ProcessKeys (ref Message msg, Keys keyData) { + // We should process Alt+key only if we don't have an active menu, + // and hide it otherwise. + if ((keyData & Keys.Alt) == Keys.Alt && active) { + Deactivate (); + return false; + } + // If we get Alt-F4, Windows will ignore it because we have a capture, // release the capture and the program will exit. (X11 doesn't care.) if ((keyData & Keys.Alt) == Keys.Alt && (keyData & Keys.F4) == Keys.F4) { @@ -783,7 +790,7 @@ namespace System.Windows.Forms { SelectItem (item, item.MenuItems [0], false); CurrentMenu = item; } - } else { + } else if (!(CurrentMenu is ContextMenu)) { // ContextMenu root remains active. HideSubPopups (CurrentMenu, TopMenu); if (CurrentMenu.parent_menu != null) CurrentMenu = CurrentMenu.parent_menu; diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/PrintPreviewDialog.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/PrintPreviewDialog.cs index 4b7c6c8c8ab..df29d03aea7 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/PrintPreviewDialog.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/PrintPreviewDialog.cs @@ -207,6 +207,8 @@ namespace System.Windows.Forms { class PrintToolBar : ToolBar { + bool left_pressed; + public int GetNext (int pos) { // Select the next button that is *not* a separator @@ -225,31 +227,93 @@ namespace System.Windows.Forms { return pos; } + void SelectNextOnParent (bool forward) + { + ContainerControl container = Parent as ContainerControl; + if (container != null && container.ActiveControl != null) + container.SelectNextControl (container.ActiveControl, forward, true, true, true); + } + protected override void OnGotFocus (EventArgs args) { base.OnGotFocus (args); // Select either the last one or the first one, depending on the direction - CurrentItem = (Control.ModifierKeys & Keys.Shift) != 0 ? GetPrev (items.Length) : 0; + CurrentItem = (Control.ModifierKeys & Keys.Shift) != 0 || left_pressed ? GetPrev (items.Length) : 0; + left_pressed = false; } - protected override bool ProcessDialogKey (Keys key) + // We need to handle Left/Right for our controls by ourselves, as opposed to + // Tab + protected override bool ProcessDialogKey (Keys keyData) { - if ((key & Keys.Tab) == 0 || !Focused) - return base.ProcessDialogKey (key); + switch ((keyData & Keys.KeyCode)) { + case Keys.Left: + left_pressed = true; // Simulate Tab+Alt if focus goes to our buttons + SelectNextOnParent (false); + return true; + case Keys.Right: + SelectNextOnParent (true); + return true; + } - bool forward = (key & Keys.Shift) == 0; - int pos = forward ? GetNext (CurrentItem) : GetPrev (CurrentItem); + return base.ProcessDialogKey (keyData); + } + + void NavigateItems (Keys key) + { + bool forward = true; + switch ((key & Keys.KeyCode)) { + case Keys.Left: + forward = false; + break; + case Keys.Right: + forward = true; + break; + case Keys.Tab: + forward = (Control.ModifierKeys & Keys.Shift) == 0; + break; + } + int pos = forward ? GetNext (CurrentItem) : GetPrev (CurrentItem); if (pos < 0 || pos >= items.Length) { // go to the prev/next control CurrentItem = -1; - return base.ProcessDialogKey (key); + SelectNextOnParent (forward); + return; } - + CurrentItem = pos; - return true; } + bool OnDropDownButton { + get { + return CurrentItem != -1 && items [CurrentItem].Button.Style == ToolBarButtonStyle.DropDownButton; + } + } + + internal override bool InternalPreProcessMessage (ref Message msg) + { + Keys key = (Keys)msg.WParam.ToInt32 (); + switch (key) { + // Up/Down keys are processed only if we are + // on a dropdown button, and ignored otherwise. + case Keys.Up: + case Keys.Down: + if (OnDropDownButton) + break; // process base impl. + return true; + case Keys.Left: + case Keys.Right: + case Keys.Tab: + if (OnDropDownButton) + ((ContextMenu)(items [CurrentItem].Button.DropDownMenu)).Hide (); + + NavigateItems (key); + return true; + } + + return base.InternalPreProcessMessage (ref msg); + } } void CloseButtonClicked (object sender, EventArgs e) diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TabControl.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TabControl.cs index fa7a75d104f..b5eda9a8854 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TabControl.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TabControl.cs @@ -1262,7 +1262,7 @@ namespace System.Windows.Forms { if (SizeMode == TabSizeMode.Fixed) { width = item_size.Width; } else { - width = MeasureStringWidth (DeviceContext, page.Text, Font); + width = MeasureStringWidth (DeviceContext, page.Text, page.Font); width += (Padding.X * 2) + 2; if (ImageList != null && page.ImageIndex >= 0 && page.ImageIndex < ImageList.Images.Count) { diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextBoxBase.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextBoxBase.cs index f68c9d1508d..f04223bd8de 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextBoxBase.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextBoxBase.cs @@ -1770,6 +1770,15 @@ namespace System.Windows.Forms } } + internal int TopMargin { + get { + return document.top_margin; + } + set { + document.top_margin = value; + } + } + #region UIA Framework Properties internal ScrollBar UIAHScrollBar { diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolBar.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolBar.cs index d474d57db4a..f63f5dab1c7 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolBar.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolBar.cs @@ -541,17 +541,17 @@ namespace System.Windows.Forms try { if (current_item == null) throw new ArgumentException ("button", "The button specified is not part of this toolbar"); - OnButtonClick (new ToolBarButtonClickEventArgs (button)); + PerformButtonClick (new ToolBarButtonClickEventArgs (button)); } finally { current_item = previous_item; } } #endif - protected virtual void OnButtonClick (ToolBarButtonClickEventArgs e) + void PerformButtonClick (ToolBarButtonClickEventArgs e) { - if (e.Button.Style == ToolBarButtonStyle.ToggleButton || - e.Button.Style == ToolBarButtonStyle.DropDownButton) { + // Only change pushed for ToogleButton + if (e.Button.Style == ToolBarButtonStyle.ToggleButton) { if (! e.Button.Pushed) e.Button.Pushed = true; else @@ -565,7 +565,11 @@ namespace System.Windows.Forms button_for_focus = current_item.Button; button_for_focus.UIAHasFocus = true; #endif - + OnButtonClick (e); + } + + protected virtual void OnButtonClick (ToolBarButtonClickEventArgs e) + { ToolBarButtonClickEventHandler eh = (ToolBarButtonClickEventHandler)(Events [ButtonClickEvent]); if (eh != null) eh (this, e); @@ -580,10 +584,13 @@ namespace System.Windows.Forms if (e.Button.DropDownMenu == null) return; - ToolBarItem item = current_item; + ShowDropDownMenu (current_item); + } + internal void ShowDropDownMenu (ToolBarItem item) + { Point loc = new Point (item.Rectangle.X + 1, item.Rectangle.Bottom + 1); - ((ContextMenu) e.Button.DropDownMenu).Show (this, loc); + ((ContextMenu) item.Button.DropDownMenu).Show (this, loc); item.DDPressed = false; item.Hilight = false; @@ -648,7 +655,7 @@ namespace System.Windows.Forms { if (msg.Msg == (int)Msg.WM_KEYDOWN) { Keys key_data = (Keys)msg.WParam.ToInt32(); - if (HandleKeyDown (key_data)) + if (HandleKeyDown (ref msg, key_data)) return true; } return base.InternalPreProcessMessage (ref msg); @@ -704,11 +711,15 @@ namespace System.Windows.Forms } } - private bool HandleKeyDown (Keys key_data) + private bool HandleKeyDown (ref Message msg, Keys key_data) { if (Appearance != ToolBarAppearance.Flat || Buttons.Count == 0) return false; + // Handle the key as needed if the current item is a dropdownbutton. + if (HandleKeyOnDropDown (ref msg, key_data)) + return true; + switch (key_data) { case Keys.Left: case Keys.Up: @@ -718,9 +729,39 @@ namespace System.Windows.Forms case Keys.Down: HighlightButton (1); return true; - default: - return false; + case Keys.Enter: + case Keys.Space: + if (current_item != null) { + OnButtonClick (new ToolBarButtonClickEventArgs (current_item.Button)); + return true; + } + break; + } + + return false; + } + + bool HandleKeyOnDropDown (ref Message msg, Keys key_data) + { + if (current_item == null || current_item.Button.Style != ToolBarButtonStyle.DropDownButton || + current_item.Button.DropDownMenu == null) + return false; + + Menu dropdown_menu = current_item.Button.DropDownMenu; + + if (dropdown_menu.Tracker.active) { + dropdown_menu.ProcessCmdKey (ref msg, key_data); + return true; // always true if the menu is active + } + + if (key_data == Keys.Up || key_data == Keys.Down) { + current_item.DDPressed = true; + current_item.Invalidate (); + OnButtonDropDown (new ToolBarButtonClickEventArgs (current_item.Button)); + return true; } + + return false; } void HighlightButton (int offset) @@ -750,7 +791,9 @@ namespace System.Windows.Forms if (curr_item != null) curr_item.Hilight = false; - (enabled [next] as ToolBarItem).Hilight = true; + + current_item = enabled [next] as ToolBarItem; + current_item.Hilight = true; } private void ToolBar_BackgroundImageChanged (object sender, EventArgs args) @@ -828,7 +871,7 @@ namespace System.Windows.Forms // Fire a ButtonClick current_item = item; if ((item.Pressed) && ((me.Button & MouseButtons.Left) == MouseButtons.Left)) - OnButtonClick (new ToolBarButtonClickEventArgs (item.Button)); + PerformButtonClick (new ToolBarButtonClickEventArgs (item.Button)); } else if (item.Pressed) { item.Pressed = false; item.Invalidate (); diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripTextBox.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripTextBox.cs index 98aa9ccb8c0..4e552bde9ad 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripTextBox.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripTextBox.cs @@ -41,9 +41,11 @@ namespace System.Windows.Forms #region Public Constructors public ToolStripTextBox () : base (new ToolStripTextBoxControl ()) { - (this.TextBox as ToolStripTextBoxControl).OwnerItem = this; - base.Control.border_style = BorderStyle.None; - (base.Control as ToolStripTextBoxControl).Border = BorderStyle.Fixed3D; + ToolStripTextBoxControl text_box = TextBox as ToolStripTextBoxControl; + text_box.OwnerItem = this; + text_box.border_style = BorderStyle.None; + text_box.TopMargin = 3; // need to explicitly set the margin + text_box.Border = BorderStyle.Fixed3D; // ToolStripTextBoxControl impl, not TextBox this.border_style = BorderStyle.Fixed3D; } diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUICarbon.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUICarbon.cs index 7d6bb223226..4755efd1791 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUICarbon.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUICarbon.cs @@ -1100,6 +1100,17 @@ namespace System.Windows.Forms { internal override IntPtr DefWndProc(ref Message msg) { Hwnd hwnd = Hwnd.ObjectFromHandle (msg.HWnd); switch ((Msg)msg.Msg) { + case Msg.WM_IME_COMPOSITION: + string s = KeyboardHandler.ComposedString; + foreach (char c in s) + SendMessage (msg.HWnd, Msg.WM_IME_CHAR, (IntPtr) c, msg.LParam); + break; + case Msg.WM_IME_CHAR: + // On Windows API it sends two WM_CHAR messages for each byte, but + // I wonder if it is worthy to emulate it (also no idea how to + // reconstruct those bytes into chars). + SendMessage (msg.HWnd, Msg.WM_CHAR, msg.WParam, msg.LParam); + return IntPtr.Zero; case Msg.WM_QUIT: { if (WindowMapping [hwnd.Handle] != null) diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs index 90d23ba584b..e7242eb960c 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUIX11.cs @@ -1757,7 +1757,11 @@ namespace System.Windows.Forms { sel_event.SelectionEvent.property = xevent.SelectionRequestEvent.property; Marshal.FreeHGlobal(buffer); } - } else if (Clipboard.IsSourceText) { + } else if (Clipboard.IsSourceText && + (format_atom == (IntPtr)Atom.XA_STRING + || format_atom == OEMTEXT + || format_atom == UTF16_STRING + || format_atom == UTF8_STRING)) { IntPtr buffer = IntPtr.Zero; int buflen; Encoding encoding = null; @@ -1774,16 +1778,14 @@ namespace System.Windows.Forms { else if (target_atom == UTF8_STRING) encoding = Encoding.UTF8; - if (encoding != null) { - Byte [] bytes; + Byte [] bytes; - bytes = encoding.GetBytes (Clipboard.GetPlainText ()); - buffer = Marshal.AllocHGlobal (bytes.Length); - buflen = bytes.Length; + bytes = encoding.GetBytes (Clipboard.GetPlainText ()); + buffer = Marshal.AllocHGlobal (bytes.Length); + buflen = bytes.Length; - for (int i = 0; i < buflen; i++) - Marshal.WriteByte (buffer, i, bytes [i]); - } + for (int i = 0; i < buflen; i++) + Marshal.WriteByte (buffer, i, bytes [i]); if (buffer != IntPtr.Zero) { XChangeProperty(DisplayHandle, xevent.SelectionRequestEvent.requestor, (IntPtr)xevent.SelectionRequestEvent.property, (IntPtr)xevent.SelectionRequestEvent.target, 8, PropertyMode.Replace, buffer, buflen); diff --git a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog index 97ca43fd97a..53d367c809a 100644 --- a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog +++ b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog @@ -1,3 +1,7 @@ +2009-06-16 Ivan N. Zlatev + + * DataGridViewTest.cs: Duplicate test label fix. + 2009-06-07 Carlos Alberto Cortez * DataObjectTest.cs: New assertions for the text functionality. diff --git a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/DataGridViewTest.cs b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/DataGridViewTest.cs index 86405d46e26..211f4483c17 100644 --- a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/DataGridViewTest.cs +++ b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/DataGridViewTest.cs @@ -1761,7 +1761,7 @@ namespace MonoTests.System.Windows.Forms Assert.AreEqual (0, dgv.CurrentCell.ColumnIndex, "F3"); dgv.RowCount = 0; - Assert.IsNull (dgv.CurrentCell, "G1"); + Assert.IsNull (dgv.CurrentCell, "P1"); dgv.RowCount = 10; Assert.AreEqual (10, dgv.RowCount, "I1"); diff --git a/mcs/class/Microsoft.CSharp/Assembly/AssemblyInfo.cs b/mcs/class/Microsoft.CSharp/Assembly/AssemblyInfo.cs new file mode 100644 index 00000000000..6c7a223682f --- /dev/null +++ b/mcs/class/Microsoft.CSharp/Assembly/AssemblyInfo.cs @@ -0,0 +1,61 @@ +// +// AssemblyInfo.cs +// +// Authors: +// Marek Safar (marek.safar@gmail.com) +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Reflection; +using System.Resources; +using System.Security; +using System.Security.Permissions; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about the assembly + +[assembly: AssemblyTitle ("Microsoft.CSharp.dll")] +[assembly: AssemblyDescription ("Microsoft.CSharp.dll")] +[assembly: AssemblyDefaultAlias ("Microsoft.CSharp.dll")] + +[assembly: AssemblyCompany (Consts.MonoCompany)] +[assembly: AssemblyProduct (Consts.MonoProduct)] +[assembly: AssemblyCopyright (Consts.MonoCopyright)] +[assembly: AssemblyVersion (Consts.FxVersion)] +[assembly: SatelliteContractVersion (Consts.FxVersion)] +[assembly: AssemblyInformationalVersion (Consts.FxFileVersion)] +[assembly: AssemblyFileVersion (Consts.FxFileVersion)] + +[assembly: NeutralResourcesLanguage ("en-US")] +[assembly: CLSCompliant (true)] +[assembly: AssemblyDelaySign (true)] + +[assembly: AssemblyKeyFile ("../msfinal.pub")] + +[assembly: SecurityCritical] + +[assembly: ComVisible (false)] + diff --git a/mcs/class/Microsoft.CSharp/Assembly/ChangeLog b/mcs/class/Microsoft.CSharp/Assembly/ChangeLog new file mode 100644 index 00000000000..5ae38b37f80 --- /dev/null +++ b/mcs/class/Microsoft.CSharp/Assembly/ChangeLog @@ -0,0 +1,4 @@ +2009-06-29 Marek Safar + + * ChangeLog: Added + diff --git a/mcs/class/Microsoft.CSharp/ChangeLog b/mcs/class/Microsoft.CSharp/ChangeLog new file mode 100644 index 00000000000..5914ff29986 --- /dev/null +++ b/mcs/class/Microsoft.CSharp/ChangeLog @@ -0,0 +1,3 @@ +2009-06-29 Marek Safar + + * Initial commit. diff --git a/mcs/class/Microsoft.CSharp/Makefile b/mcs/class/Microsoft.CSharp/Makefile new file mode 100644 index 00000000000..7e72289e796 --- /dev/null +++ b/mcs/class/Microsoft.CSharp/Makefile @@ -0,0 +1,10 @@ +thisdir = class/Microsoft.CSharp +SUBDIRS = +include ../../build/rules.make + +LIBRARY = Microsoft.CSharp.dll + +LIB_MCS_FLAGS = -r:System.Core.dll + +include ../../build/library.make + diff --git a/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpArgumentInfo.cs b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpArgumentInfo.cs new file mode 100644 index 00000000000..0c13307963c --- /dev/null +++ b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpArgumentInfo.cs @@ -0,0 +1,68 @@ +// +// CSharpArgumentInfo.cs +// +// Authors: +// Marek Safar +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Collections.Generic; + +namespace Microsoft.CSharp.RuntimeBinder +{ + public class CSharpArgumentInfo + { + CSharpArgumentInfoFlags flags; + string name; + + public CSharpArgumentInfo (CSharpArgumentInfoFlags flags, string name) + { + this.flags = flags; + this.name = name; + } + + public override bool Equals (object obj) + { + var other = obj as CSharpArgumentInfo; + return other != null && other.name == name && other.flags == flags; + } + + public CSharpArgumentInfoFlags Flags { + get { return flags; } + } + + public override int GetHashCode () + { + return EqualityComparer.Default.GetHashCode (name) ^ flags.GetHashCode (); + } + + internal bool IsNamed { + get { return (flags & CSharpArgumentInfoFlags.NamedArgument) != 0; } + } + + public string Name { + get { return name; } + } + } +} diff --git a/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpArgumentInfoFlags.cs b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpArgumentInfoFlags.cs new file mode 100644 index 00000000000..09909a10820 --- /dev/null +++ b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpArgumentInfoFlags.cs @@ -0,0 +1,44 @@ +// +// CSharpArgumentInfoFlags.cs +// +// Authors: +// Marek Safar +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; + +namespace Microsoft.CSharp.RuntimeBinder +{ + [Flags] + public enum CSharpArgumentInfoFlags + { + None = 0, + UseCompileTimeType = 1, + LiteralConstant = 2, + NamedArgument = 4, + IsRef = 8, + IsOut = 16, + IsStaticType = 32 + } +} diff --git a/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpCallFlags.cs b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpCallFlags.cs new file mode 100644 index 00000000000..cc3d549617b --- /dev/null +++ b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpCallFlags.cs @@ -0,0 +1,40 @@ +// +// CSharpCallFlags.cs +// +// Authors: +// Marek Safar +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; + +namespace Microsoft.CSharp.RuntimeBinder +{ + [Flags] + public enum CSharpCallFlags + { + None = 0, + SimpleNameCall = 1, + SpecialNames = 2 + } +} diff --git a/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpConversionKind.cs b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpConversionKind.cs new file mode 100644 index 00000000000..e10ec0d9cbf --- /dev/null +++ b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpConversionKind.cs @@ -0,0 +1,38 @@ +// +// CSharpConversionKind.cs +// +// Authors: +// Marek Safar +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; + +namespace Microsoft.CSharp.RuntimeBinder +{ + public enum CSharpConversionKind + { + ImplicitConversion = 0, + ExplicitConversion = 1 + } +} diff --git a/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpInvokeMemberBinder.cs b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpInvokeMemberBinder.cs new file mode 100644 index 00000000000..be93f91ecc5 --- /dev/null +++ b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/CSharpInvokeMemberBinder.cs @@ -0,0 +1,107 @@ +// +// CSharpInvokeMemberBinder.cs +// +// Authors: +// Marek Safar +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Dynamic; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; + +namespace Microsoft.CSharp.RuntimeBinder +{ + public class CSharpInvokeMemberBinder : InvokeMemberBinder + { + CSharpCallFlags flags; + IList argumentInfo; + IList typeArguments; + Type callingContext; + + public CSharpInvokeMemberBinder (CSharpCallFlags flags, string name, Type callingContext, IEnumerable typeArguments, IEnumerable argumentInfo) + : base (name, false, CreateCallInfo (argumentInfo)) + { + this.flags = flags; + this.callingContext = callingContext; + this.argumentInfo = new ReadOnlyCollectionBuilder (argumentInfo); + this.typeArguments = new ReadOnlyCollectionBuilder (typeArguments); + } + + static CallInfo CreateCallInfo (IEnumerable argumentInfo) + { + var named = from arg in argumentInfo where arg.IsNamed select arg.Name; + return new CallInfo (argumentInfo.Count (), named); + } + + public IList ArgumentInfo { + get { + return argumentInfo; + } + } + + public Type CallingContext { + get { + return callingContext; + } + } + + public override bool Equals (object obj) + { + var other = obj as CSharpInvokeMemberBinder; + return other != null && base.Equals (obj) && other.flags == flags && other.callingContext == callingContext && + other.argumentInfo.SequenceEqual (argumentInfo) && other.typeArguments.SequenceEqual (typeArguments); + } + + public CSharpCallFlags Flags { + get { + return flags; + } + } + + public override int GetHashCode () + { + return base.GetHashCode (); + } + + [MonoTODO] + public override DynamicMetaObject FallbackInvoke (DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) + { + throw new NotImplementedException (); + } + + [MonoTODO] + public override DynamicMetaObject FallbackInvokeMember (DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) + { + throw new NotImplementedException (); + } + + public IList TypeArguments { + get { + return typeArguments; + } + } + } +} diff --git a/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/ChangeLog b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/ChangeLog new file mode 100644 index 00000000000..2468c98a3fa --- /dev/null +++ b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.RuntimeBinder/ChangeLog @@ -0,0 +1,9 @@ +2009-07-02 Marek Safar + + * CSharpConversionKind.cs, CSharpArgumentInfo.cs, + CSharpInvokeMemberBinder.cs, CSharpCallFlags.cs: New files. + +2009-06-29 Marek Safar + + * ChangeLog: Added + diff --git a/mcs/class/Microsoft.CSharp/Microsoft.CSharp.dll.sources b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.dll.sources new file mode 100644 index 00000000000..23bbef09a84 --- /dev/null +++ b/mcs/class/Microsoft.CSharp/Microsoft.CSharp.dll.sources @@ -0,0 +1,9 @@ +../../build/common/Consts.cs +../../build/common/Locale.cs +../../build/common/MonoTODOAttribute.cs +Assembly/AssemblyInfo.cs +Microsoft.CSharp.RuntimeBinder/CSharpArgumentInfo.cs +Microsoft.CSharp.RuntimeBinder/CSharpArgumentInfoFlags.cs +Microsoft.CSharp.RuntimeBinder/CSharpCallFlags.cs +Microsoft.CSharp.RuntimeBinder/CSharpConversionKind.cs +Microsoft.CSharp.RuntimeBinder/CSharpInvokeMemberBinder.cs diff --git a/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/ChangeLog b/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/ChangeLog index 3e2ce4d7773..8860adbd9a9 100644 --- a/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/ChangeLog +++ b/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/ChangeLog @@ -1,3 +1,19 @@ +2009-07-10 Atsushi Enomoto + + * SQLiteConnection.cs : remove Console.WriteLine(). + +2009-06-18 Marek Habersack + + * UnsafeNativeMethods.cs: added import of the old sqlite3_open + function to make code compatible with sqlite3 versions older than + 3.5.0 + + * SQLite3.cs: added a workaround for systems which come with + sqlite3 older than 3.5.0 (which added new call sqlite3_open_v2, + used in this version of Mono.Data.Sqlite). If this function is not + found in the native shared library, the old sqlite3_open is used + as fallback. + 2009-02-04 Marek Habersack * SQLite3.cs, SQLite3_UTF16.cs, SQLiteBase.cs, SQLiteFunction.cs, diff --git a/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs b/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs index 4217a0f9f58..a5cbda5fe9e 100644 --- a/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs +++ b/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs @@ -112,7 +112,16 @@ namespace Mono.Data.Sqlite #if !SQLITE_STANDARD int n = UnsafeNativeMethods.sqlite3_open_interop(ToUTF8(strFilename), (int)flags, out db); #else - int n = UnsafeNativeMethods.sqlite3_open_v2(ToUTF8(strFilename), out db, (int)flags, IntPtr.Zero); + // Compatibility with versions < 3.5.0 + int n; + + try { + n = UnsafeNativeMethods.sqlite3_open_v2(ToUTF8(strFilename), out db, (int)flags, IntPtr.Zero); + } catch (EntryPointNotFoundException ex) { + Console.WriteLine ("Your sqlite3 version is old - please upgrade to at least v3.5.0!"); + n = UnsafeNativeMethods.sqlite3_open (ToUTF8 (strFilename), out db); + } + #endif if (n > 0) throw new SqliteException(n, null); diff --git a/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteConnection.cs b/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteConnection.cs index d2239cfe112..be663d73253 100644 --- a/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteConnection.cs +++ b/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteConnection.cs @@ -761,7 +761,6 @@ namespace Mono.Data.Sqlite // For each semi-colon piece, split into key and value pairs by the presence of the = sign for (n = 0; n < x; n++) { - Console.WriteLine (arParts [n]); arPiece = SqliteConvert.Split(arParts[n], '='); if (arPiece.Length == 2) { diff --git a/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/UnsafeNativeMethods.cs b/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/UnsafeNativeMethods.cs index ed372a56514..0823acfc09e 100644 --- a/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/UnsafeNativeMethods.cs +++ b/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/UnsafeNativeMethods.cs @@ -155,6 +155,14 @@ namespace Mono.Data.Sqlite #endif internal static extern int sqlite3_open_v2(byte[] utf8Filename, out IntPtr db, int flags, IntPtr vfs); + // Compatibility with versions < 3.5.0 +#if !PLATFORM_COMPACTFRAMEWORK + [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)] +#else + [DllImport(SQLITE_DLL)] +#endif + internal static extern int sqlite3_open(byte[] utf8Filename, out IntPtr db); + #if !PLATFORM_COMPACTFRAMEWORK [DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] #else diff --git a/mcs/class/Mono.Data.SqliteClient/THIS_IS_OBSOLETE b/mcs/class/Mono.Data.SqliteClient/THIS_IS_OBSOLETE new file mode 100644 index 00000000000..6fcb4cfe09f --- /dev/null +++ b/mcs/class/Mono.Data.SqliteClient/THIS_IS_OBSOLETE @@ -0,0 +1,2 @@ + +Use the Mono.Data.Sqlite instead diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Assembly/AssemblyInfo.cs b/mcs/class/Mono.Messaging.RabbitMQ/Assembly/AssemblyInfo.cs index 0cdccf6c4ed..ed35d9aa8d1 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Assembly/AssemblyInfo.cs +++ b/mcs/class/Mono.Messaging.RabbitMQ/Assembly/AssemblyInfo.cs @@ -53,7 +53,7 @@ using System.Runtime.InteropServices; [assembly: ComVisible (false)] -[assembly: CLSCompliant (true)] +[assembly: CLSCompliant (false)] [assembly: AssemblyDelaySign (true)] [assembly: AssemblyKeyFile("../msfinal.pub")] diff --git a/mcs/class/Mono.Messaging.RabbitMQ/ChangeLog b/mcs/class/Mono.Messaging.RabbitMQ/ChangeLog index 7812d3ee03d..76528499b65 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/ChangeLog +++ b/mcs/class/Mono.Messaging.RabbitMQ/ChangeLog @@ -1,3 +1,8 @@ +2009-07-11 Michael Barker + + * Mono.Messaging.RabbitMQ_test.dll.sources: Moved MessageEnumeratorTest.cs + and MessageBaseTest.cs from Mono.Messaging.Test. + 2009-01-05 Michael Barker * Makefile: Added nunit.mocks to test build diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/ChangeLog b/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/ChangeLog index c2caba20d62..e9c111dd57c 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/ChangeLog +++ b/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/ChangeLog @@ -1,3 +1,10 @@ +2009-07-11 Michael Barker + + * MessageFactory.cs: Switched to DateTime.UtcNow. + * RabbitMQMessageQueue.cs: Removed some unecessary references to realm. + * RabbitMQMessagingProvider.cs: Removed some unecessary references to realm. + Changed volatile field to use Interlocked.Increment (++i is not thread safe). + 2009-05-23 Michael Barker * MessageFactory.cs: Moved TimeSpanToInt32 method to here. diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/MessageFactory.cs b/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/MessageFactory.cs index cdf57dd7d6a..fa9d44d5f4c 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/MessageFactory.cs +++ b/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/MessageFactory.cs @@ -85,7 +85,7 @@ namespace Mono.Messaging.RabbitMQ { if (msg.CorrelationId != null) mb.Properties.CorrelationId = msg.CorrelationId; // TODO: Change to DateTime.UtcNow?? - mb.Properties.Timestamp = MessageFactory.DateTimeToAmqpTimestamp (DateTime.Now); + mb.Properties.Timestamp = MessageFactory.DateTimeToAmqpTimestamp (DateTime.UtcNow); Hashtable headers = new Hashtable (); headers[SENDER_VERSION_KEY] = msg.SenderVersion; diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/RabbitMQMessageQueue.cs b/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/RabbitMQMessageQueue.cs index ef2f6461df1..03069f252ad 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/RabbitMQMessageQueue.cs +++ b/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/RabbitMQMessageQueue.cs @@ -62,7 +62,6 @@ namespace Mono.Messaging.RabbitMQ { private QueueReference qRef = QueueReference.DEFAULT; private readonly RabbitMQMessagingProvider provider; private readonly MessageFactory helper; - private readonly string realm; private readonly bool transactional; public RabbitMQMessageQueue (RabbitMQMessagingProvider provider, @@ -74,17 +73,9 @@ namespace Mono.Messaging.RabbitMQ { public RabbitMQMessageQueue (RabbitMQMessagingProvider provider, QueueReference qRef, bool transactional) - : this (provider, "/data", qRef, transactional) - { - } - - public RabbitMQMessageQueue (RabbitMQMessagingProvider provider, - string realm, QueueReference qRef, - bool transactional) { this.provider = provider; this.helper = new MessageFactory (provider); - this.realm = realm; this.qRef = qRef; this.transactional = transactional; } @@ -203,7 +194,7 @@ namespace Mono.Messaging.RabbitMQ { // No-op (Queue are currently stateless) } - public static void Delete (string realm, QueueReference qRef) + public static void Delete (QueueReference qRef) { ConnectionFactory cf = new ConnectionFactory (); diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/RabbitMQMessagingProvider.cs b/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/RabbitMQMessagingProvider.cs index 45445659d0e..90aaf7101a5 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/RabbitMQMessagingProvider.cs +++ b/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ/RabbitMQMessagingProvider.cs @@ -40,9 +40,8 @@ namespace Mono.Messaging.RabbitMQ { public class RabbitMQMessagingProvider : IMessagingProvider { - private volatile uint txCounter = 0; + private int txCounter = 0; private readonly uint localIp; - private static readonly string DEFAULT_REALM = "/data"; public RabbitMQMessagingProvider() { @@ -74,13 +73,14 @@ namespace Mono.Messaging.RabbitMQ { public IMessageQueueTransaction CreateMessageQueueTransaction () { - string txId = localIp.ToString () + (++txCounter).ToString (); + Interlocked.Increment (ref txCounter); + string txId = localIp.ToString () + txCounter.ToString (); return new RabbitMQMessageQueueTransaction (txId); } public void DeleteQueue (QueueReference qRef) { - RabbitMQMessageQueue.Delete (DEFAULT_REALM, qRef); + RabbitMQMessageQueue.Delete (qRef); } private readonly IDictionary queues = new Hashtable (); diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ_test.dll.sources b/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ_test.dll.sources index 13e7409ef08..3ba70c17b48 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ_test.dll.sources +++ b/mcs/class/Mono.Messaging.RabbitMQ/Mono.Messaging.RabbitMQ_test.dll.sources @@ -12,4 +12,6 @@ Mono.Messaging.RabbitMQ/AsyncPeekTest.cs Mono.Messaging.RabbitMQ/BinaryMessageFormatterTest.cs Mono.Messaging.RabbitMQ/XmlMessageFormatterTest.cs Mono.Messaging.RabbitMQ/TestUtils.cs -Mono.Messaging.RabbitMQ/MessageTest.cs \ No newline at end of file +Mono.Messaging.RabbitMQ/MessageTest.cs +Mono.Messaging.RabbitMQ/MessageBaseTest.cs +Mono.Messaging.RabbitMQ/MessageEnumeratorExceptionTest.cs diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AdminTest.cs b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AdminTest.cs index 612f401988d..954cdf4bb86 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AdminTest.cs +++ b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AdminTest.cs @@ -109,7 +109,7 @@ namespace MonoTests.Mono.Messaging.RabbitMQ q.Send (m3); q.Send (m4); - Message received = q.Receive (); + q.Receive (); q.Purge (); q.Receive (new TimeSpan (0, 0, 2)); } @@ -122,7 +122,7 @@ namespace MonoTests.Mono.Messaging.RabbitMQ q.Send (m1); - Message received = q.Receive (); + q.Receive (); MessageQueue.Delete(@".\private$\delete-queue"); } diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AsyncPeekTest.cs b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AsyncPeekTest.cs index 9663aa63ef7..ae4b2d86851 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AsyncPeekTest.cs +++ b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AsyncPeekTest.cs @@ -134,7 +134,7 @@ namespace MonoTests.Mono.Messaging.RabbitMQ MessageQueue q = MQUtil.GetQueue (@".\private$\async-peek-5"); IAsyncResult result = q.BeginPeek (new TimeSpan (0, 0, 2)); result.AsyncWaitHandle.WaitOne (); - Message rMsg = q.EndPeek (result); + q.EndPeek (result); } } } diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AsyncReceiveTest.cs b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AsyncReceiveTest.cs index e7febea3c2a..1027a7e47f2 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AsyncReceiveTest.cs +++ b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/AsyncReceiveTest.cs @@ -134,7 +134,7 @@ namespace MonoTests.Mono.Messaging.RabbitMQ MessageQueue q = MQUtil.GetQueue (@".\private$\async-peek-5"); IAsyncResult result = q.BeginReceive (new TimeSpan (0, 0, 2)); result.AsyncWaitHandle.WaitOne (); - Message rMsg = q.EndReceive (result); + q.EndReceive (result); } } } diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/BasicMessagingTest.cs b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/BasicMessagingTest.cs index 57e02307c41..3d2e3805baa 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/BasicMessagingTest.cs +++ b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/BasicMessagingTest.cs @@ -118,7 +118,7 @@ namespace MonoTests.Mono.Messaging.RabbitMQ Assert.IsNotNull (pi, "Property not defined: " + property); object o = pi.GetValue (m, null); Assert.Fail (property + ": " + o); - } catch (InvalidOperationException e) { + } catch (InvalidOperationException) { } catch (TargetInvocationException e) { Assert.AreEqual (typeof (InvalidOperationException), e.InnerException.GetType ()); @@ -153,7 +153,7 @@ namespace MonoTests.Mono.Messaging.RabbitMQ Assert.IsNotNull(pi, "Property not defined: " + property); pi.SetValue(m, null, null); Assert.Fail(property); - } catch (InvalidOperationException e) { + } catch (InvalidOperationException) { } catch (TargetInvocationException e) { Assert.AreEqual(exceptionType, e.InnerException.GetType(), diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/ChangeLog b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/ChangeLog index 8de774bbb81..90a48b0e0e8 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/ChangeLog +++ b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/ChangeLog @@ -1,3 +1,12 @@ +2009-07-11 Michael Barker + + * MessageBaseTest.cs: Moved from Mono.Messaging.Test + * MessageEnumeratorTest.cs: Moved from Mono.Messaging.Test + * MessageTest.cs: Used using aliases to prevent namespace clashes. + * AdminTest.cs: Remove unused variables. + * AsyncPeekTest.cs: Remove unused variables. + * AsyncReceiveTest.cs: Remove unused variables. + 2009-05-23 Michael Barker * MessageEnumeratorTest.cs: Added tests for timeout methods. diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/MessageBaseTest.cs b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/MessageBaseTest.cs new file mode 100644 index 00000000000..868448d88f1 --- /dev/null +++ b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/MessageBaseTest.cs @@ -0,0 +1,119 @@ +// +// Mono.Messaging.RabbitMQ +// +// Authors: +// Michael Barker (mike@middlesoft.co.uk) +// +// (C) 2008 Michael Barker +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Messaging; +using System.Reflection; +using Mono.Messaging; + +using SystemAcknowledgeTypes = System.Messaging.AcknowledgeTypes; +using SystemCryptographicProviderType = System.Messaging.CryptographicProviderType; +using SystemEncryptionAlgorithm = System.Messaging.EncryptionAlgorithm; +using SystemHashAlgorithm = System.Messaging.HashAlgorithm; +using SystemMessagePriority = System.Messaging.MessagePriority; + +using NUnit.Framework; + +namespace MonoTests.Mono.Messaging { + + [TestFixture] + public class MessageBaseTest { + + [Test] + public void CheckDefaultValues () + { + Type[] types = { + typeof (IMessage), typeof (object), typeof (IMessageFormatter) + }; + + ConstructorInfo ci = typeof (Message).GetConstructor ( + BindingFlags.NonPublic | BindingFlags.Instance, + Type.DefaultBinder, types, new ParameterModifier[0]); + + if (ci == null) + throw new Exception ("ConstructorInfo is null"); + + Message m = (Message) ci.Invoke (new object[] { new MessageBase (), null, null }); + + Assert.IsNull (m.Body, "Body default should be Null"); + Assert.IsNull (m.Formatter, "Formatter default should null"); + + Assert.AreEqual (SystemAcknowledgeTypes.None, + m.AcknowledgeType, + "AcknowledgeType default should be None"); + Assert.AreEqual (null, m.AdministrationQueue, + "AdministrationQueue default should be null"); + Assert.AreEqual (0, m.AppSpecific, "AppSpecific default should be 0"); + Assert.AreEqual (true, m.AttachSenderId, "AttachSenderId default should be true"); + Assert.AreEqual ("Microsoft Base Cryptographic Provider, Ver. 1.0", m.AuthenticationProviderName, + "AuthenticationProviderName should default to \"Microsoft Base Cryptographic Provider, Ver. 1.0\""); + Assert.AreEqual (SystemCryptographicProviderType.RsaFull, + m.AuthenticationProviderType, + "AuthenticationProviderType should default to RsaFull"); + Assert.AreEqual (null, m.BodyStream, "BodyStream should default to null"); + Assert.AreEqual (Guid.Empty, m.ConnectorType, "ConnectorType should default to empty"); + Assert.AreEqual (null, m.CorrelationId, "CorrelationId should default to null"); + Assert.AreEqual (new byte[0], m.DestinationSymmetricKey, + "DestinationSymmetricKey should default to an empty array"); + Assert.AreEqual (new byte[0], m.DigitalSignature, + "DigitalSignature default to an empty array"); + Assert.AreEqual (SystemEncryptionAlgorithm.Rc2, + m.EncryptionAlgorithm, + "EncryptionAlgorithm should default to Rc2"); + Assert.AreEqual (new byte[0], m.Extension, + "Extension should default to an empty array"); + Assert.AreEqual (SystemHashAlgorithm.Sha, m.HashAlgorithm, + "HashAlgorithm should default to Sha"); + Assert.AreEqual (Guid.Empty.ToString () + "\\0", m.Id, "Id should default to Guid.Empty"); + Assert.AreEqual ("", m.Label, "Label should default to \"\""); + Assert.AreEqual (false, m.IsFirstInTransaction, "IsFirstInTransaction should default to false"); + Assert.AreEqual (false, m.IsLastInTransaction, "IsLastInTransaction should default to false"); + Assert.AreEqual (SystemMessagePriority.Normal, m.Priority, + "Priority should default to Normal"); + Assert.AreEqual (false, m.Recoverable, "Recoverable should default to false"); + Assert.AreEqual (null, m.ResponseQueue, "ResponseQueue should default to null"); + //Assert.AreEqual (null, m.SecurityContext, "SecurityContext should default to null"); + Assert.AreEqual (new byte[0], m.SenderCertificate, + "SenderCertificate should default to an empty array"); + Assert.AreEqual (Message.InfiniteTimeout, m.TimeToBeReceived, + "TimeToBeReceived should default to InfiniteTimeout"); + Assert.AreEqual (Message.InfiniteTimeout, m.TimeToReachQueue, + "TimeToReadQueue should default to InfiniteTimeout"); + Assert.AreEqual (false, m.UseAuthentication, + "UseAuthentication should default to false"); + Assert.AreEqual (false, m.UseDeadLetterQueue, + "UseDeadLetterQueue should default to false"); + Assert.AreEqual (false, m.UseEncryption, "Encryption should default to false"); + Assert.AreEqual (false, m.UseJournalQueue, + "UseJournalQueue should default to false"); + Assert.AreEqual (false, m.UseTracing, "UseTracing should default to false"); + } + } +} diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/MessageEnumeratorExceptionTest.cs b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/MessageEnumeratorExceptionTest.cs new file mode 100644 index 00000000000..c3507ed1865 --- /dev/null +++ b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/MessageEnumeratorExceptionTest.cs @@ -0,0 +1,109 @@ +// +// MessageEnumeratorTest.cs - +// NUnit Test Cases for MessageEnumerator +// +// Author: +// Michael Barker +// +// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +using System; +using System.Security; +using System.Security.Permissions; +using System.Reflection; + +using Mono.Messaging; + +using SystemMessageEnumerator = System.Messaging.MessageEnumerator; +using SystemMessageQueueException = System.Messaging.MessageQueueException; +using SystemIMessageFormatter = System.Messaging.IMessageFormatter; + +using NUnit.Framework; +using NUnit.Mocks; + + +namespace MonoTests.Mono.Messaging { + + [TestFixture] + public class MessageEnumeratorExceptionTest + { + private DynamicMock mockME; + + [SetUp] + public void Init () + { + mockME = new DynamicMock (typeof (IMessageEnumerator)); + } + + [Test] + [ExpectedException(typeof(SystemMessageQueueException))] + public void RemoveCurrentThrowsConnectionException () + { + mockME.ExpectAndThrow ("RemoveCurrent", new ConnectionException (QueueReference.DEFAULT), null); + SystemMessageEnumerator me = CreateEnumerator ((IMessageEnumerator) mockME.MockInstance); + me.RemoveCurrent (); + } + + [Test] + [ExpectedException(typeof(InvalidOperationException))] + public void RemoveCurrentThrowsMessageUnavailableException () + { + mockME.ExpectAndThrow ("RemoveCurrent", new MessageUnavailableException (), null); + SystemMessageEnumerator me = CreateEnumerator ((IMessageEnumerator) mockME.MockInstance); + me.RemoveCurrent (); + } + + [Test] + [ExpectedException(typeof(SystemMessageQueueException))] + public void RemoveCurrentThrowsMonoMessagingException () + { + mockME.ExpectAndThrow ("RemoveCurrent", new MonoMessagingException (), null); + SystemMessageEnumerator me = CreateEnumerator ((IMessageEnumerator) mockME.MockInstance); + me.RemoveCurrent (); + } + + [Test] + [ExpectedException(typeof(NotImplementedException))] + public void RemoveCurrentThrowsMessageNotImplemented () + { + mockME.ExpectAndThrow ("RemoveCurrent", new NotImplementedException (), null); + SystemMessageEnumerator me = CreateEnumerator ((IMessageEnumerator) mockME.MockInstance); + me.RemoveCurrent (); + } + + public SystemMessageEnumerator CreateEnumerator (IMessageEnumerator ime) + { + Type[] types = { + typeof (IMessageEnumerator), typeof (SystemIMessageFormatter) + }; + + ConstructorInfo ci = typeof (SystemMessageEnumerator).GetConstructor ( + BindingFlags.NonPublic | BindingFlags.Instance, + Type.DefaultBinder, types, new ParameterModifier[0]); + + if (ci == null) + throw new Exception ("ConstructorInfo is null"); + + return (SystemMessageEnumerator) ci.Invoke (new object[] { ime, null }); + } + } +} diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/MessageTest.cs b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/MessageTest.cs index f0407173f96..40d847a0ee1 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/MessageTest.cs +++ b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/MessageTest.cs @@ -30,10 +30,11 @@ using NUnit.Framework; using NUnit.Mocks; using System; -//using System.Messaging; using System.Security; using System.Security.Permissions; using System.Reflection; +using SystemMessage = System.Messaging.Message; +using SystemAcknowledgeTypes = System.Messaging.AcknowledgeTypes; using Mono.Messaging; @@ -58,8 +59,8 @@ namespace MonoTests.Mono.Messaging.RabbitMQ { messageMock.Expect ("set_AcknowledgeType", AcknowledgeTypes.FullReachQueue); - System.Messaging.Message m = TestUtils.CreateMessage (iMessage); - m.AcknowledgeType = System.Messaging.AcknowledgeTypes.FullReachQueue; + SystemMessage m = TestUtils.CreateMessage (iMessage); + m.AcknowledgeType = SystemAcknowledgeTypes.FullReachQueue; messageMock.Verify (); } diff --git a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/XmlMessageFormatterTest.cs b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/XmlMessageFormatterTest.cs index 7d65e557120..8b6b49a9617 100644 --- a/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/XmlMessageFormatterTest.cs +++ b/mcs/class/Mono.Messaging.RabbitMQ/Test/Mono.Messaging.RabbitMQ/XmlMessageFormatterTest.cs @@ -119,7 +119,7 @@ namespace MonoTests.Mono.Messaging.RabbitMQ Assert.AreEqual (t0.Iii, t1.Iii, "The int did not serialise/deserialise properly"); Assert.AreEqual (t0.Sss, t1.Sss, "The string did not serialise/deserialise properly"); - Assert.AreEqual (t0.Ttt, t1.Ttt, "The date did not serialise/deserialise properly"); + Assert.AreEqual (t0.Ttt.ToString (), t1.Ttt.ToString (), "The date did not serialise/deserialise properly"); mock1.Verify (); mock2.Verify (); diff --git a/mcs/class/Mono.Messaging/ChangeLog b/mcs/class/Mono.Messaging/ChangeLog index 9cfd069df5f..3e0f8ab586f 100644 --- a/mcs/class/Mono.Messaging/ChangeLog +++ b/mcs/class/Mono.Messaging/ChangeLog @@ -1,3 +1,8 @@ +2009-06-11 Michael Barker + + * Mono.Messaging_test.dll.sources: Moved MessageBaseTest.cs and + MessageEnumeratorTest.cs to Mono.Messaging.RabbitMQ.Test. + 2009-05-23 Michael Barker * Mono.Messaging_test.dll.sources: Added MessageEnumeratorExceptionTest.cs diff --git a/mcs/class/Mono.Messaging/Mono.Messaging/ChangeLog b/mcs/class/Mono.Messaging/Mono.Messaging/ChangeLog index 38bd62f9ae2..d10ef8bab69 100644 --- a/mcs/class/Mono.Messaging/Mono.Messaging/ChangeLog +++ b/mcs/class/Mono.Messaging/Mono.Messaging/ChangeLog @@ -1,3 +1,8 @@ +2009-07-11 Michael Barker + + * MessagingProviderLocator.cs: Removed unessecary fields, made fields + readonly and some formatting changes. + 2009-05-23 Michael Barker * IMessageEnumerator.cs: Added additional methods to support operations diff --git a/mcs/class/Mono.Messaging/Mono.Messaging/MessagingProviderLocator.cs b/mcs/class/Mono.Messaging/Mono.Messaging/MessagingProviderLocator.cs index f1ced06174f..e6f65da5388 100644 --- a/mcs/class/Mono.Messaging/Mono.Messaging/MessagingProviderLocator.cs +++ b/mcs/class/Mono.Messaging/Mono.Messaging/MessagingProviderLocator.cs @@ -43,10 +43,9 @@ namespace Mono.Messaging public class MessagingProviderLocator { public static readonly TimeSpan InfiniteTimeout = TimeSpan.MaxValue; + private static readonly MessagingProviderLocator instance = new MessagingProviderLocator(); + private readonly IMessagingProvider provider; - private static MessagingProviderLocator instance = new MessagingProviderLocator(); - private readonly object syncObj = new object(); - private IMessagingProvider provider = null; private MessagingProviderLocator () { string providerName = System.Environment.GetEnvironmentVariable("MONO_MESSAGING_PROVIDER"); @@ -55,7 +54,9 @@ namespace Mono.Messaging provider = CreateProvider (providerName); } - public static MessagingProviderLocator Instance { get { return instance; } } + public static MessagingProviderLocator Instance { + get { return instance; } + } public static IMessagingProvider GetProvider () { @@ -68,8 +69,7 @@ namespace Mono.Messaging if (t == null) throw new Exception ("Can't find class: " + className); - ConstructorInfo ci = t.GetConstructor (BindingFlags.Public | - BindingFlags.Instance, + ConstructorInfo ci = t.GetConstructor (BindingFlags.Public | BindingFlags.Instance, Type.DefaultBinder, new Type[0], new ParameterModifier[0]); diff --git a/mcs/class/Mono.Messaging/Mono.Messaging_test.dll.sources b/mcs/class/Mono.Messaging/Mono.Messaging_test.dll.sources index d5bfcb3a87e..8c82b8604c4 100644 --- a/mcs/class/Mono.Messaging/Mono.Messaging_test.dll.sources +++ b/mcs/class/Mono.Messaging/Mono.Messaging_test.dll.sources @@ -1,3 +1 @@ -Mono.Messaging/MessageBaseTest.cs -Mono.Messaging/MessageEnumeratorExceptionTest.cs -Mono.Messaging/QueueReferenceTest.cs \ No newline at end of file +Mono.Messaging/QueueReferenceTest.cs diff --git a/mcs/class/Mono.Messaging/Test/Mono.Messaging/ChangeLog b/mcs/class/Mono.Messaging/Test/Mono.Messaging/ChangeLog index 76e40f0761b..888dec2e4f3 100644 --- a/mcs/class/Mono.Messaging/Test/Mono.Messaging/ChangeLog +++ b/mcs/class/Mono.Messaging/Test/Mono.Messaging/ChangeLog @@ -1,3 +1,8 @@ +2009-06-11 Michael Barker + + * MessageBaseTest.cs: Moved to Mono.Messaging.RabbitMQ.Test + * MessageEnumeratorTest.cs: Moved to Mono.Messaging.RabbitMQ.Test + 2009-05-23 Michael Barker * MessageEnumeratorExceptionTest.cs: New diff --git a/mcs/class/Mono.Messaging/Test/Mono.Messaging/MessageBaseTest.cs b/mcs/class/Mono.Messaging/Test/Mono.Messaging/MessageBaseTest.cs deleted file mode 100644 index 52a47047236..00000000000 --- a/mcs/class/Mono.Messaging/Test/Mono.Messaging/MessageBaseTest.cs +++ /dev/null @@ -1,113 +0,0 @@ -// -// Mono.Messaging.RabbitMQ -// -// Authors: -// Michael Barker (mike@middlesoft.co.uk) -// -// (C) 2008 Michael Barker -// - -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -using System; -using System.Messaging; -using System.Reflection; -using Mono.Messaging; - -using NUnit.Framework; - -namespace MonoTests.Mono.Messaging { - - [TestFixture] - public class MessageBaseTest { - - [Test] - public void CheckDefaultValues () - { - Type[] types = { - typeof (IMessage), typeof (object), typeof (IMessageFormatter) - }; - - ConstructorInfo ci = typeof (Message).GetConstructor ( - BindingFlags.NonPublic | BindingFlags.Instance, - Type.DefaultBinder, types, new ParameterModifier[0]); - - if (ci == null) - throw new Exception ("ConstructorInfo is null"); - - Message m = (Message) ci.Invoke (new object[] { new MessageBase (), null, null }); - - Assert.IsNull (m.Body, "Body default should be Null"); - Assert.IsNull (m.Formatter, "Formatter default should null"); - - Assert.AreEqual (System.Messaging.AcknowledgeTypes.None, - m.AcknowledgeType, - "AcknowledgeType default should be None"); - Assert.AreEqual (null, m.AdministrationQueue, - "AdministrationQueue default should be null"); - Assert.AreEqual (0, m.AppSpecific, "AppSpecific default should be 0"); - Assert.AreEqual (true, m.AttachSenderId, "AttachSenderId default should be true"); - Assert.AreEqual ("Microsoft Base Cryptographic Provider, Ver. 1.0", m.AuthenticationProviderName, - "AuthenticationProviderName should default to \"Microsoft Base Cryptographic Provider, Ver. 1.0\""); - Assert.AreEqual (System.Messaging.CryptographicProviderType.RsaFull, - m.AuthenticationProviderType, - "AuthenticationProviderType should default to RsaFull"); - Assert.AreEqual (null, m.BodyStream, "BodyStream should default to null"); - Assert.AreEqual (Guid.Empty, m.ConnectorType, "ConnectorType should default to empty"); - Assert.AreEqual (null, m.CorrelationId, "CorrelationId should default to null"); - Assert.AreEqual (new byte[0], m.DestinationSymmetricKey, - "DestinationSymmetricKey should default to an empty array"); - Assert.AreEqual (new byte[0], m.DigitalSignature, - "DigitalSignature default to an empty array"); - Assert.AreEqual (System.Messaging.EncryptionAlgorithm.Rc2, - m.EncryptionAlgorithm, - "EncryptionAlgorithm should default to Rc2"); - Assert.AreEqual (new byte[0], m.Extension, - "Extension should default to an empty array"); - Assert.AreEqual (System.Messaging.HashAlgorithm.Sha, m.HashAlgorithm, - "HashAlgorithm should default to Sha"); - Assert.AreEqual (Guid.Empty.ToString () + "\\0", m.Id, "Id should default to Guid.Empty"); - Assert.AreEqual ("", m.Label, "Label should default to \"\""); - Assert.AreEqual (false, m.IsFirstInTransaction, "IsFirstInTransaction should default to false"); - Assert.AreEqual (false, m.IsLastInTransaction, "IsLastInTransaction should default to false"); - Assert.AreEqual (System.Messaging.MessagePriority.Normal, m.Priority, - "Priority should default to Normal"); - Assert.AreEqual (false, m.Recoverable, "Recoverable should default to false"); - Assert.AreEqual (null, m.ResponseQueue, "ResponseQueue should default to null"); - //Assert.AreEqual (null, m.SecurityContext, "SecurityContext should default to null"); - Assert.AreEqual (new byte[0], m.SenderCertificate, - "SenderCertificate should default to an empty array"); - Assert.AreEqual (Message.InfiniteTimeout, m.TimeToBeReceived, - "TimeToBeReceived should default to InfiniteTimeout"); - Assert.AreEqual (Message.InfiniteTimeout, m.TimeToReachQueue, - "TimeToReadQueue should default to InfiniteTimeout"); - Assert.AreEqual (false, m.UseAuthentication, - "UseAuthentication should default to false"); - Assert.AreEqual (false, m.UseDeadLetterQueue, - "UseDeadLetterQueue should default to false"); - Assert.AreEqual (false, m.UseEncryption, "Encryption should default to false"); - Assert.AreEqual (false, m.UseJournalQueue, - "UseJournalQueue should default to false"); - Assert.AreEqual (false, m.UseTracing, "UseTracing should default to false"); - } - } -} diff --git a/mcs/class/Mono.Messaging/Test/Mono.Messaging/MessageEnumeratorExceptionTest.cs b/mcs/class/Mono.Messaging/Test/Mono.Messaging/MessageEnumeratorExceptionTest.cs deleted file mode 100644 index 36edde5d52e..00000000000 --- a/mcs/class/Mono.Messaging/Test/Mono.Messaging/MessageEnumeratorExceptionTest.cs +++ /dev/null @@ -1,105 +0,0 @@ -// -// MessageEnumeratorTest.cs - -// NUnit Test Cases for MessageEnumerator -// -// Author: -// Michael Barker -// -// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -using System; -using System.Security; -using System.Security.Permissions; -using System.Reflection; - -using Mono.Messaging; - -using NUnit.Framework; -using NUnit.Mocks; - - -namespace MonoTests.Mono.Messaging { - - [TestFixture] - public class MessageEnumeratorExceptionTest - { - private DynamicMock mockME; - - [SetUp] - public void Init () - { - mockME = new DynamicMock (typeof (IMessageEnumerator)); - } - - [Test] - [ExpectedException("System.Messaging.MessageQueueException")] - public void RemoveCurrentThrowsConnectionException () - { - mockME.ExpectAndThrow ("RemoveCurrent", new ConnectionException (QueueReference.DEFAULT), null); - System.Messaging.MessageEnumerator me = CreateEnumerator ((IMessageEnumerator) mockME.MockInstance); - me.RemoveCurrent (); - } - - [Test] - [ExpectedException("System.InvalidOperationException")] - public void RemoveCurrentThrowsMessageUnavailableException () - { - mockME.ExpectAndThrow ("RemoveCurrent", new MessageUnavailableException (), null); - System.Messaging.MessageEnumerator me = CreateEnumerator ((IMessageEnumerator) mockME.MockInstance); - me.RemoveCurrent (); - } - - [Test] - [ExpectedException("System.Messaging.MessageQueueException")] - public void RemoveCurrentThrowsMonoMessagingException () - { - mockME.ExpectAndThrow ("RemoveCurrent", new MonoMessagingException (), null); - System.Messaging.MessageEnumerator me = CreateEnumerator ((IMessageEnumerator) mockME.MockInstance); - me.RemoveCurrent (); - } - - [Test] - [ExpectedException("System.NotImplementedException")] - public void RemoveCurrentThrowsMessageNotImplemented () - { - mockME.ExpectAndThrow ("RemoveCurrent", new NotImplementedException (), null); - System.Messaging.MessageEnumerator me = CreateEnumerator ((IMessageEnumerator) mockME.MockInstance); - me.RemoveCurrent (); - } - - public System.Messaging.MessageEnumerator CreateEnumerator (IMessageEnumerator ime) - { - Type[] types = { - typeof (IMessageEnumerator), typeof (System.Messaging.IMessageFormatter) - }; - - ConstructorInfo ci = typeof (System.Messaging.MessageEnumerator).GetConstructor ( - BindingFlags.NonPublic | BindingFlags.Instance, - Type.DefaultBinder, types, new ParameterModifier[0]); - - if (ci == null) - throw new Exception ("ConstructorInfo is null"); - - return (System.Messaging.MessageEnumerator) ci.Invoke (new object[] { ime, null }); - } - } -} diff --git a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ChangeLog b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ChangeLog index 24429ef85c8..d0aaa78793d 100644 --- a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ChangeLog +++ b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ChangeLog @@ -1,3 +1,14 @@ +2009-07-02 Gonzalo Paniagua Javier + + * HttpsClientStream.cs: if there's only an ICertificatePolicy and no + ServerCertificateValicationCallback, don't fail. + +2009-07-02 Gonzalo Paniagua Javier + + * HttpsClientStream.cs: invoke the ServerCertificateValidationCallback + in the 2.0 profile. If there's a CertificatePolicy, it is run before + the 2.0 callback. + 2007-09-12 Sebastien Pouliot * Context.cs: Clear key info memory (not just nullify). Fix bug #82819 diff --git a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs index aa43523211a..6f1bcc5e5ac 100644 --- a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs +++ b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs @@ -32,6 +32,10 @@ using System.IO; using System.Net; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; +#if NET_2_0 +using SNS = System.Net.Security; +using SNCX = System.Security.Cryptography.X509Certificates; +#endif namespace Mono.Security.Protocol.Tls { @@ -87,10 +91,38 @@ namespace Mono.Security.Protocol.Tls { // only one problem can be reported by this interface _status = ((failed) ? certificateErrors [0] : 0); +#if NET_2_0 +#pragma warning disable 618 +#endif if (ServicePointManager.CertificatePolicy != null) { ServicePoint sp = _request.ServicePoint; - return ServicePointManager.CertificatePolicy.CheckValidationResult (sp, certificate, _request, _status); + bool res = ServicePointManager.CertificatePolicy.CheckValidationResult (sp, certificate, _request, _status); + if (!res) + return false; + failed = true; } +#if NET_2_0 +#pragma warning restore 618 +#endif +#if NET_2_0 + SNS.RemoteCertificateValidationCallback cb = ServicePointManager.ServerCertificateValidationCallback; + if (cb != null) { + SNS.SslPolicyErrors ssl_errors = 0; + foreach (int i in certificateErrors) { + if (i == (int)-2146762490) // TODO: is this what happens when the purpose is wrong? + ssl_errors |= SNS.SslPolicyErrors.RemoteCertificateNotAvailable; + else if (i == (int) -2146762481) + ssl_errors |= SNS.SslPolicyErrors.RemoteCertificateNameMismatch; + else + ssl_errors |= SNS.SslPolicyErrors.RemoteCertificateChainErrors; + } + SNCX.X509Certificate2 cert2 = new SNCX.X509Certificate2 (certificate.GetRawCertData ()); + SNCX.X509Chain chain = new SNCX.X509Chain (); + if (!chain.Build (cert2)) + ssl_errors |= SNS.SslPolicyErrors.RemoteCertificateChainErrors; + return cb (_request, cert2, chain, ssl_errors); + } +#endif return failed; } } diff --git a/mcs/class/System.ComponentModel.DataAnnotations/ChangeLog b/mcs/class/System.ComponentModel.DataAnnotations/ChangeLog index 51f269e6fa3..5e4d4e47c6b 100644 --- a/mcs/class/System.ComponentModel.DataAnnotations/ChangeLog +++ b/mcs/class/System.ComponentModel.DataAnnotations/ChangeLog @@ -1,3 +1,8 @@ +2009-06-23 Marek Habersack + + * System.ComponentModel.DataAnnotations.dll.sources: added + System.ComponentModel.DataAnnotations/AssociatedMetadataTypePropertyDescriptor.cs + 2009-04-23 Marek Habersack * System.ComponentModel.DataAnnotations_test.dll.sources: added diff --git a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations.dll.sources b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations.dll.sources index 0ed04271910..aa307ea69d9 100644 --- a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations.dll.sources +++ b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations.dll.sources @@ -2,6 +2,7 @@ ../../build/common/Locale.cs ../../build/common/MonoTODOAttribute.cs Assembly/AssemblyInfo.cs +System.ComponentModel.DataAnnotations/AssociatedMetadataTypePropertyDescriptor.cs System.ComponentModel.DataAnnotations/AssociatedMetadataTypeTypeDescriptor.cs System.ComponentModel.DataAnnotations/AssociatedMetadataTypeTypeDescriptionProvider.cs System.ComponentModel.DataAnnotations/DataType.cs diff --git a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/AssociatedMetadataTypePropertyDescriptor.cs b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/AssociatedMetadataTypePropertyDescriptor.cs new file mode 100644 index 00000000000..1b9d140b320 --- /dev/null +++ b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/AssociatedMetadataTypePropertyDescriptor.cs @@ -0,0 +1,67 @@ +// +// AssociatedMetadataTypeTypeDescriptionProvider.cs +// +// Author: +// Marek Habersack +// +// Copyright (C) 2009 Novell Inc. http://novell.com +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Reflection; + +namespace System.ComponentModel.DataAnnotations +{ + class AssociatedMetadataTypePropertyDescriptor : ReflectionPropertyDescriptor + { + MemberInfo metaTypeMember; + + public AssociatedMetadataTypePropertyDescriptor (PropertyInfo typeProperty, MemberInfo metaTypeMember) + : base (typeProperty) + { + this.metaTypeMember = metaTypeMember; + } + + protected override void FillAttributes (IList attributeList) + { + base.FillAttributes (attributeList); + if (metaTypeMember == null) + return; + + object[] attributes = metaTypeMember.GetCustomAttributes (false); + if (attributes == null || attributes.Length == 0) + return; + + foreach (object o in attributes) { + var attr = o as Attribute; + if (attr == null) + continue; + + attributeList.Add (attr); + } + } + } +} diff --git a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/AssociatedMetadataTypeTypeDescriptor.cs b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/AssociatedMetadataTypeTypeDescriptor.cs index a4164155344..4a546cec896 100644 --- a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/AssociatedMetadataTypeTypeDescriptor.cs +++ b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/AssociatedMetadataTypeTypeDescriptor.cs @@ -28,15 +28,27 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Collections.Generic; using System.ComponentModel; +using System.Reflection; namespace System.ComponentModel.DataAnnotations { - // This class currently adds no functionality to its base class. class AssociatedMetadataTypeTypeDescriptor : CustomTypeDescriptor { Type type; Type associatedMetadataType; + bool associatedMetadataTypeChecked; + PropertyDescriptorCollection properties; + + Type AssociatedMetadataType { + get { + if (!associatedMetadataTypeChecked && associatedMetadataType == null) + associatedMetadataType = FindMetadataType (); + + return associatedMetadataType; + } + } public AssociatedMetadataTypeTypeDescriptor (ICustomTypeDescriptor parent, Type type) : this (parent, type, null) @@ -49,5 +61,108 @@ namespace System.ComponentModel.DataAnnotations this.type = type; this.associatedMetadataType = associatedMetadataType; } + + void CopyAttributes (object[] from, List to) + { + foreach (object o in from) { + Attribute a = o as Attribute; + if (a == null) + continue; + + to.Add (a); + } + } + + public override AttributeCollection GetAttributes () + { + var attributes = new List (); + CopyAttributes (type.GetCustomAttributes (true), attributes); + + Type metaType = AssociatedMetadataType; + if (metaType != null) + CopyAttributes (metaType.GetCustomAttributes (true), attributes); + + return new AttributeCollection (attributes.ToArray ()); + } + + public override PropertyDescriptorCollection GetProperties () + { + // Code partially copied from TypeDescriptor.TypeInfo.GetProperties + if (properties != null) + return properties; + + Dictionary metaMembers = null; + var propertiesHash = new Dictionary (); // name - null + var propertiesList = new List (); + Type currentType = type; + Type metaType = AssociatedMetadataType; + + if (metaType != null) { + metaMembers = new Dictionary (); + MemberInfo[] members = metaType.GetMembers (BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + + foreach (MemberInfo member in members) { + switch (member.MemberType) { + case MemberTypes.Field: + case MemberTypes.Property: + break; + + default: + continue; + } + + string name = member.Name; + if (metaMembers.ContainsKey (name)) + continue; + + metaMembers.Add (name, member); + } + } + + // Getting properties type by type, because in the case of a property in the child type, where + // the "new" keyword is used and also the return type is changed Type.GetProperties returns + // also the parent property. + // + // Note that we also have to preserve the properties order here. + // + while (currentType != null && currentType != typeof (object)) { + PropertyInfo[] props = currentType.GetProperties (BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + foreach (PropertyInfo property in props) { + string propName = property.Name; + + if (property.GetIndexParameters ().Length == 0 && property.CanRead && !propertiesHash.ContainsKey (propName)) { + MemberInfo metaMember; + + if (metaMembers != null) + metaMembers.TryGetValue (propName, out metaMember); + else + metaMember = null; + propertiesList.Add (new AssociatedMetadataTypePropertyDescriptor (property, metaMember)); + propertiesHash.Add (propName, true); + } + } + currentType = currentType.BaseType; + } + + properties = new PropertyDescriptorCollection ((PropertyDescriptor[]) propertiesList.ToArray (), true); + return properties; + } + + Type FindMetadataType () + { + associatedMetadataTypeChecked = true; + if (type == null) + return null; + + object[] attrs = type.GetCustomAttributes (typeof (MetadataTypeAttribute), true); + if (attrs == null || attrs.Length == 0) + return null; + + var attr = attrs [0] as MetadataTypeAttribute; + if (attr == null) + return null; + + return attr.MetadataClassType; + } } } diff --git a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/ChangeLog b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/ChangeLog index b8e0ec74e1b..4cbe157ab37 100644 --- a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/ChangeLog +++ b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/ChangeLog @@ -1,3 +1,20 @@ +2009-06-23 Marek Habersack + + * ValidationAttribute.cs: error message must not ever be empty. + + * UIHintAttribute.cs: do not throw NIEX from the constructor. + + * DataTypeAttribute.cs: implemented correct DisplayFormat + intialization for DataType.Time. + + * AssociatedMetadataTypeTypeDescriptor.cs: implemented retrieving + attributes of the associated metadata type, as well as merging of + attribute collections between metadata and main type properties. + + * AssociatedMetadataTypePropertyDescriptor.cs: added. Helper class + which merges attributes from the metadata type (if any) with those + associated with property from the "main" type. + 2009-04-23 Marek Habersack * AssociatedMetadataTypeTypeDescriptor.cs: added - doesn't add any diff --git a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/DataTypeAttribute.cs b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/DataTypeAttribute.cs index 32d638114d2..cd857f102d9 100644 --- a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/DataTypeAttribute.cs +++ b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/DataTypeAttribute.cs @@ -38,6 +38,22 @@ namespace System.ComponentModel.DataAnnotations public DataTypeAttribute (DataType dataType) { DataType = dataType; + + DisplayFormatAttribute displayFormat; + switch (dataType) { + case DataType.Time: + displayFormat = new DisplayFormatAttribute (); + displayFormat.ApplyFormatInEditMode = true; + displayFormat.ConvertEmptyStringToNull = true; + displayFormat.DataFormatString = "{0:t}"; + break; + + default: + displayFormat = null; + break; + } + + DisplayFormat = displayFormat; } public DataTypeAttribute (string customDataType) diff --git a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/UIHintAttribute.cs b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/UIHintAttribute.cs index ab14cfbb5c4..51e6fac6258 100644 --- a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/UIHintAttribute.cs +++ b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/UIHintAttribute.cs @@ -52,8 +52,6 @@ namespace System.ComponentModel.DataAnnotations UIHint = uiHint; PresentationLayer = presentationLayer; ControlParameters = new Dictionary (); - - throw new NotImplementedException (); } public IDictionary ControlParameters { get; private set; } diff --git a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/ValidationAttribute.cs b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/ValidationAttribute.cs index 1b1ef4c0fdf..237aa5f2b7b 100644 --- a/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/ValidationAttribute.cs +++ b/mcs/class/System.ComponentModel.DataAnnotations/System.ComponentModel.DataAnnotations/ValidationAttribute.cs @@ -35,6 +35,7 @@ namespace System.ComponentModel.DataAnnotations public abstract class ValidationAttribute : Attribute { protected ValidationAttribute () + : this ("This member is required") { } diff --git a/mcs/class/System.Core/ChangeLog b/mcs/class/System.Core/ChangeLog index d792d824845..c65ec4c27f5 100644 --- a/mcs/class/System.Core/ChangeLog +++ b/mcs/class/System.Core/ChangeLog @@ -1,3 +1,7 @@ +2009-07-02 Marek Safar + + * net_4_0_System.Core.dll.sources: New file. + 2009-06-04 Jb Evain * Makefile: fix the 2.1 profile version. diff --git a/mcs/class/System.Core/Makefile b/mcs/class/System.Core/Makefile index ba5d54609bf..801f450e33f 100644 --- a/mcs/class/System.Core/Makefile +++ b/mcs/class/System.Core/Makefile @@ -10,6 +10,10 @@ ifneq (2.1, $(FRAMEWORK_VERSION)) LIB_MCS_FLAGS += -d:NET_3_5 -nowarn:1720 endif +ifeq (4.0, $(FRAMEWORK_VERSION)) +LIB_MCS_FLAGS += -d:CODEPLEX_40 +endif + TEST_MCS_FLAGS = $(LIB_MCS_FLAGS) # This is a .NET 2.0+ only assembly diff --git a/mcs/class/System.Core/System.Collections.Generic/ChangeLog b/mcs/class/System.Core/System.Collections.Generic/ChangeLog index 82b28b21c0f..45c4e671d79 100644 --- a/mcs/class/System.Core/System.Collections.Generic/ChangeLog +++ b/mcs/class/System.Core/System.Collections.Generic/ChangeLog @@ -1,3 +1,8 @@ +2009-07-09 Jb Evain + + * HashSet.cs (ICollection.Add): fix for bug #520760. Do not throw + when adding duplicates. + 2009-01-27 Jb Evain * HashSet.cs: use Paolo's trick to return items in insertion order diff --git a/mcs/class/System.Core/System.Collections.Generic/HashSet.cs b/mcs/class/System.Core/System.Collections.Generic/HashSet.cs index f53a9f757d3..960b8083e68 100644 --- a/mcs/class/System.Core/System.Collections.Generic/HashSet.cs +++ b/mcs/class/System.Core/System.Collections.Generic/HashSet.cs @@ -558,8 +558,7 @@ namespace System.Collections.Generic { void ICollection.Add (T item) { - if (!Add (item)) - throw new ArgumentException (); + Add (item); } IEnumerator IEnumerable.GetEnumerator () diff --git a/mcs/class/System.Core/System.Core.dll.sources b/mcs/class/System.Core/System.Core.dll.sources index d729d8fc518..8a0c710faff 100644 --- a/mcs/class/System.Core/System.Core.dll.sources +++ b/mcs/class/System.Core/System.Core.dll.sources @@ -11,6 +11,7 @@ System/TimeZoneInfo.AdjustmentRule.cs System/TimeZoneInfo.cs System/TimeZoneInfo.TransitionTime.cs System/TimeZoneNotFoundException.cs +System.Runtime.CompilerServices/DynamicAttribute.cs System.Runtime.CompilerServices/ExecutionScope.cs System.Runtime.CompilerServices/ExtensionAttribute.cs System.Runtime.CompilerServices/IStrongBox.cs @@ -81,4 +82,4 @@ System.Security.Cryptography/SHA512Cng.cs System.Security.Cryptography/SHA512CryptoServiceProvider.cs System.Threading/LockRecursionException.cs System.Threading/LockRecursionPolicy.cs -System.Threading/ReaderWriterLockSlim.cs \ No newline at end of file +System.Threading/ReaderWriterLockSlim.cs diff --git a/mcs/class/System.Core/System.Dynamic/ChangeLog b/mcs/class/System.Core/System.Dynamic/ChangeLog new file mode 100644 index 00000000000..f2bc813616f --- /dev/null +++ b/mcs/class/System.Core/System.Dynamic/ChangeLog @@ -0,0 +1,4 @@ +2009-07-02 Marek Safar + + * ChangeLog: Implementation imported from class/dlr. + diff --git a/mcs/class/System.Core/System.Linq/QueryableEnumerable.cs b/mcs/class/System.Core/System.Linq/QueryableEnumerable.cs index 34046f0a524..3a66ce66b88 100644 --- a/mcs/class/System.Core/System.Linq/QueryableEnumerable.cs +++ b/mcs/class/System.Core/System.Linq/QueryableEnumerable.cs @@ -100,7 +100,11 @@ namespace System.Linq { static Expression TransformQueryable (Expression expression) { +#if NET_4_0 + throw new NotImplementedException (); +#else return new QueryableTransformer ().Transform (expression); +#endif } public IQueryable CreateQuery (Expression expression) diff --git a/mcs/class/System.Core/System.Runtime.CompilerServices/ChangeLog b/mcs/class/System.Core/System.Runtime.CompilerServices/ChangeLog index 81ec451d107..a98b17a30dc 100644 --- a/mcs/class/System.Core/System.Runtime.CompilerServices/ChangeLog +++ b/mcs/class/System.Core/System.Runtime.CompilerServices/ChangeLog @@ -1,3 +1,11 @@ +2009-07-02 Marek Safar + + * StrongBox_T.cs: Add 4.0 bits. + +2009-06-29 Marek Safar + + * DynamicAttribute.cs: Add DynamicAttribute. + 2009-03-05 Jb Evain * ExecutionScope.cs: add support for hoisted locals. diff --git a/mcs/class/System.Core/System.Runtime.CompilerServices/DynamicAttribute.cs b/mcs/class/System.Core/System.Runtime.CompilerServices/DynamicAttribute.cs new file mode 100644 index 00000000000..2355fa2fe4d --- /dev/null +++ b/mcs/class/System.Core/System.Runtime.CompilerServices/DynamicAttribute.cs @@ -0,0 +1,57 @@ +// +// DynamicAttribute.cs +// +// Authors: +// Marek Safar +// +// Copyright (C) 2009, Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if NET_4_0 + +using System; +using System.Collections.Generic; + +namespace System.Runtime.CompilerServices +{ + + [AttributeUsage (AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue)] + public sealed class DynamicAttribute : Attribute + { + bool[] transformFlags; + + public DynamicAttribute () + { + } + + public DynamicAttribute (bool[] transformFlags) + { + this.transformFlags = transformFlags; + } + + public IList TransformFlags { + get { return transformFlags; } + } + } +} + +#endif diff --git a/mcs/class/System.Core/System.Runtime.CompilerServices/StrongBox_T.cs b/mcs/class/System.Core/System.Runtime.CompilerServices/StrongBox_T.cs index b76f9945f21..9bfa9db14c7 100644 --- a/mcs/class/System.Core/System.Runtime.CompilerServices/StrongBox_T.cs +++ b/mcs/class/System.Core/System.Runtime.CompilerServices/StrongBox_T.cs @@ -32,15 +32,21 @@ namespace System.Runtime.CompilerServices { public T Value; - object IStrongBox.Value +#if NET_4_0 + public StrongBox () { - get { return Value; } - set { Value = (T) value; } } +#endif public StrongBox (T value) { Value = value; } + + object IStrongBox.Value + { + get { return Value; } + set { Value = (T) value; } + } } } diff --git a/mcs/class/System.Core/System.Threading/ChangeLog b/mcs/class/System.Core/System.Threading/ChangeLog index 700ea999fbd..c87449e8b64 100644 --- a/mcs/class/System.Core/System.Threading/ChangeLog +++ b/mcs/class/System.Core/System.Threading/ChangeLog @@ -1,3 +1,10 @@ +2009-06-15 Atsushi Enomoto + + * ReaderWriterLockSlim.cs : fix deadlock when entered + read lock -> entered writer lock -> exited writer lock + -> exited read lock and then entered reader lock. + Fixed bug #512485, patch by Kazuki Oikawa. + 2009-06-10 Marek Safar * LockRecursionException.cs: Updated to 4.0 changes. diff --git a/mcs/class/System.Core/System.Threading/ReaderWriterLockSlim.cs b/mcs/class/System.Core/System.Threading/ReaderWriterLockSlim.cs index c562510d154..4745bc9dc46 100644 --- a/mcs/class/System.Core/System.Threading/ReaderWriterLockSlim.cs +++ b/mcs/class/System.Core/System.Threading/ReaderWriterLockSlim.cs @@ -288,8 +288,11 @@ namespace System.Threading { } //Debug.Assert (numUpgradeWaiters > 0); - write_thread = upgradable_thread = null; - owners = 0; + if (upgradable_thread == Thread.CurrentThread) + owners = 1; + else + owners = 0; + write_thread = null; ExitAndWakeUpAppropriateWaiters (); } diff --git a/mcs/class/System.Core/Test/System.Collections.Generic/ChangeLog b/mcs/class/System.Core/Test/System.Collections.Generic/ChangeLog index 65aba54ad96..21d501f6983 100644 --- a/mcs/class/System.Core/Test/System.Collections.Generic/ChangeLog +++ b/mcs/class/System.Core/Test/System.Collections.Generic/ChangeLog @@ -1,3 +1,8 @@ +2009-07-09 Jb Evain + + * HashSetTest.cs: add test for #520760, ICollection.Add + should not throw on duplicates. + 2008-12-17 Jb Evain * HashSetTest.cs: add test for CopyTo. diff --git a/mcs/class/System.Core/Test/System.Collections.Generic/HashSetTest.cs b/mcs/class/System.Core/Test/System.Collections.Generic/HashSetTest.cs index 527fd23cfda..178191d1c60 100644 --- a/mcs/class/System.Core/Test/System.Collections.Generic/HashSetTest.cs +++ b/mcs/class/System.Core/Test/System.Collections.Generic/HashSetTest.cs @@ -335,6 +335,16 @@ namespace MonoTests.System.Collections.Generic { Assert.AreEqual (42, dest [6]); } + [Test] + public void TestICollection () + { + var set = new HashSet () as ICollection; + set.Add (42); + set.Add (42); + + Assert.AreEqual (1, set.Count); + } + static void AssertContainsOnly (IEnumerable result, IEnumerable data) { Assert.AreEqual (result.Count (), data.Count ()); diff --git a/mcs/class/System.Core/Test/System.Linq.Expressions/ChangeLog b/mcs/class/System.Core/Test/System.Linq.Expressions/ChangeLog index c073bde3347..3fc0edc8091 100644 --- a/mcs/class/System.Core/Test/System.Linq.Expressions/ChangeLog +++ b/mcs/class/System.Core/Test/System.Linq.Expressions/ChangeLog @@ -1,3 +1,9 @@ +2009-07-07 Raja R Harinath + + * ExpressionTest.cs (ExpressionDelegateTarget) [NET_4_0]: Disable + check for ExecutionScope. + (GlobalsInSpace) [NET_4_0]: Disable. + 2008-09-22 Jb Evain * ExpressionTest_TypeIs.cs: add test for bug #428309. diff --git a/mcs/class/System.Core/Test/System.Linq.Expressions/ExpressionTest.cs b/mcs/class/System.Core/Test/System.Linq.Expressions/ExpressionTest.cs index 07629aabce2..200f5247d9c 100644 --- a/mcs/class/System.Core/Test/System.Linq.Expressions/ExpressionTest.cs +++ b/mcs/class/System.Core/Test/System.Linq.Expressions/ExpressionTest.cs @@ -189,7 +189,9 @@ namespace MonoTests.System.Linq.Expressions { Assert.AreEqual (typeof (Func), identity.GetType ()); Assert.IsNotNull (identity.Target); +#if !NET_4_0 Assert.AreEqual (typeof (ExecutionScope), identity.Target.GetType ()); +#endif } class Foo { @@ -205,6 +207,7 @@ namespace MonoTests.System.Linq.Expressions { } } +#if !NET_4_0 [Test] [Category ("TargetJvmNotSupported")] public void GlobalsInScope () @@ -237,6 +240,7 @@ namespace MonoTests.System.Linq.Expressions { Assert.AreEqual ("gazonk42", del ()); } +#endif [Test] public void SimpleHoistedParameter () diff --git a/mcs/class/System.Core/Test/System.Linq.Expressions/ExpressionTest_Convert.cs b/mcs/class/System.Core/Test/System.Linq.Expressions/ExpressionTest_Convert.cs index f678900c1d8..44e61ca8224 100644 --- a/mcs/class/System.Core/Test/System.Linq.Expressions/ExpressionTest_Convert.cs +++ b/mcs/class/System.Core/Test/System.Linq.Expressions/ExpressionTest_Convert.cs @@ -570,5 +570,16 @@ namespace MonoTests.System.Linq.Expressions { Action convnull = () => Assert.AreEqual (null, conv (null)); convnull.AssertThrows (typeof (InvalidOperationException)); } + + [Test] + [ExpectedException (typeof (InvalidOperationException))] + [Category ("NotWorking")] + public void ConvertNullableIntToStringWithConvertMethod () + { + Expression.Convert ( + Expression.Constant ((int?) 0), + typeof (string), + typeof (Convert).GetMethod ("ToString", new [] { typeof (object) })); + } } } diff --git a/mcs/class/System.Core/Test/System.Linq/EnumerableFixture.cs b/mcs/class/System.Core/Test/System.Linq/EnumerableFixture.cs index 17dc339b8f5..2e0ec3e24b7 100644 --- a/mcs/class/System.Core/Test/System.Linq/EnumerableFixture.cs +++ b/mcs/class/System.Core/Test/System.Linq/EnumerableFixture.cs @@ -136,7 +136,12 @@ namespace MonoTests.System.Linq [Test] public void Cast_Integers_YieldsUpcastedObjects () { +#if false + // shouldn't this be inferred? Read (1, 10, 100).Cast ().AssertEquals (1, 10, 100); +#else + Read (1, 10, 100).Cast ().AssertEquals (1, 10, 100); +#endif } [Test] diff --git a/mcs/class/System.Core/Test/System.Threading/ChangeLog b/mcs/class/System.Core/Test/System.Threading/ChangeLog index 8c979c5227b..4314cd4282b 100644 --- a/mcs/class/System.Core/Test/System.Threading/ChangeLog +++ b/mcs/class/System.Core/Test/System.Threading/ChangeLog @@ -1,3 +1,8 @@ +2009-06-15 Atsushi Enomoto + + * ReaderWriterLockSlimTest.cs : test for bug #512485, by + Kazuki Oikawa. + 2009-01-18 Marek Safar * Initial entry. diff --git a/mcs/class/System.Core/Test/System.Threading/ReaderWriterLockSlimTest.cs b/mcs/class/System.Core/Test/System.Threading/ReaderWriterLockSlimTest.cs index fdf8d39ae93..9ea3cf1b731 100644 --- a/mcs/class/System.Core/Test/System.Threading/ReaderWriterLockSlimTest.cs +++ b/mcs/class/System.Core/Test/System.Threading/ReaderWriterLockSlimTest.cs @@ -391,5 +391,18 @@ namespace MonoTests.System.Threading t.Join (); } } + + [Test] + public void EnterWriteLock_After_ExitUpgradeableReadLock () + { + var v = new ReaderWriterLockSlim (); + + v.EnterUpgradeableReadLock (); + Assert.IsTrue (v.TryEnterWriteLock (100)); + v.ExitWriteLock (); + v.ExitUpgradeableReadLock (); + Assert.IsTrue (v.TryEnterWriteLock (100)); + v.ExitWriteLock (); + } } } diff --git a/mcs/class/System.Core/net_4_0_System.Core.dll.sources b/mcs/class/System.Core/net_4_0_System.Core.dll.sources new file mode 100644 index 00000000000..d7952dfd84c --- /dev/null +++ b/mcs/class/System.Core/net_4_0_System.Core.dll.sources @@ -0,0 +1,175 @@ +../../build/common/Consts.cs +../../build/common/Locale.cs +../../build/common/MonoTODOAttribute.cs +../corlib/Mono.Security.Cryptography/CryptoTools.cs +../corlib/Mono.Security.Cryptography/SymmetricTransform.cs +Assembly/AssemblyInfo.cs +System/Actions.cs +System/Funcs.cs +System/InvalidTimeZoneException.cs +System/TimeZoneInfo.AdjustmentRule.cs +System/TimeZoneInfo.cs +System/TimeZoneInfo.TransitionTime.cs +System/TimeZoneNotFoundException.cs +System.Runtime.CompilerServices/DynamicAttribute.cs +System.Runtime.CompilerServices/ExtensionAttribute.cs +System.Runtime.CompilerServices/IStrongBox.cs +System.Runtime.CompilerServices/StrongBox_T.cs +System.Linq/Check.cs +System.Linq/Enumerable.cs +System.Linq/QueryableEnumerable.cs +System.Linq/Grouping.cs +System.Linq/IGrouping.cs +System.Linq/IOrderedQueryable.cs +System.Linq/IOrderedQueryable_T.cs +System.Linq/IOrderedEnumerable_T.cs +System.Linq/IQueryable.cs +System.Linq/IQueryable_T.cs +System.Linq/Lookup.cs +System.Linq/ILookup_T.cs +System.Linq/OrderedEnumerable.cs +System.Linq/OrderedSequence.cs +System.Linq/Queryable.cs +System.Linq/QuickSort.cs +System.Linq/SortContext.cs +System.Linq/SortDirection.cs +System.Linq/SortSequenceContext.cs +System.Linq/IQueryProvider.cs +System.Collections.Generic/HashSet.cs +System.Security.Cryptography/Aes.cs +System.Security.Cryptography/AesManaged.cs +System.Security.Cryptography/AesCryptoServiceProvider.cs +System.Security.Cryptography/AesTransform.cs +System.Security.Cryptography/CngAlgorithm.cs +System.Security.Cryptography/CngAlgorithmGroup.cs +System.Security.Cryptography/MD5Cng.cs +System.Security.Cryptography/SHA1Cng.cs +System.Security.Cryptography/SHA256Cng.cs +System.Security.Cryptography/SHA256CryptoServiceProvider.cs +System.Security.Cryptography/SHA384Cng.cs +System.Security.Cryptography/SHA384CryptoServiceProvider.cs +System.Security.Cryptography/SHA512Cng.cs +System.Security.Cryptography/SHA512CryptoServiceProvider.cs +System.Threading/LockRecursionException.cs +System.Threading/LockRecursionPolicy.cs +System.Threading/ReaderWriterLockSlim.cs + +System.Linq.Expressions/Extensions.cs + +../dlr/Runtime/Microsoft.Scripting.Core/Actions/BinaryOperationBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/BindingRestrictions.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/CallInfo.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSite.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteHelpers.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteOps.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/ConvertBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/CreateInstanceBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/DeleteIndexBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/DeleteMemberBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicMetaObject.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicMetaObjectBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicObject.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/ExpandoClass.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/ExpandoObject.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/GetIndexBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/GetMemberBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/IDynamicMetaObjectProvider.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/InvokeBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/InvokeMemberBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/RuleCache.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/SetIndexBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/SetMemberBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/UnaryOperationBinder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Actions/UpdateDelegates.Generated.cs + +../dlr/Runtime/Microsoft.Scripting.Core/Ast/BinaryExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/BlockExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/CatchBlock.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/ConditionalExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/ConstantExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/DebugInfoExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/DebugViewWriter.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/DefaultExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/DynamicExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/ElementInit.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/Expression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/Expression.DebuggerProxy.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionStringBuilder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionType.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionVisitor.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/GotoExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/IArgumentProvider.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/IndexExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/InvocationExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/LabelExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/LabelTarget.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/LambdaExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/ListArgumentProvider.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/ListInitExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/LoopExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberAssignment.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberBinding.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberInitExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberListBinding.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberMemberBinding.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/MethodCallExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/NewArrayExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/NewExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/ParameterExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/RuntimeVariablesExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/SwitchCase.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/SwitchExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/SymbolDocumentInfo.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/TryExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/TypeBinaryExpression.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/TypeUtils.cs +../dlr/Runtime/Microsoft.Scripting.Core/Ast/UnaryExpression.cs + +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/AnalyzedTree.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/AssemblyGen.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/BoundConstants.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/Closure.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/CompilerScope.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/CompilerScope.Storage.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/ConstantCheck.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/DebugInfoGenerator.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/DelegateHelpers.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/DelegateHelpers.Generated.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/ExpressionQuoter.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/HoistedLocals.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/ILGen.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/KeyedQueue.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/LabelInfo.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Address.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Binary.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.ControlFlow.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Expressions.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Generated.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Lambda.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Logical.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Statements.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Unary.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/OffsetTrackingILGenerator.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/RuntimeVariableList.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/Set.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Bindings.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Generated.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Temps.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/SymbolDocumentGenerator.cs +../dlr/Runtime/Microsoft.Scripting.Core/Compiler/VariableBinder.cs + +../dlr/Runtime/Microsoft.Scripting.Core/Utils/CacheDict.cs +../dlr/Runtime/Microsoft.Scripting.Core/Utils/CollectionExtensions.cs +../dlr/Runtime/Microsoft.Scripting.Core/Utils/ContractUtils.cs +../dlr/Runtime/Microsoft.Scripting.Core/Utils/ExceptionFactory.Generated.cs +../dlr/Runtime/Microsoft.Scripting.Core/Utils/Helpers.cs +../dlr/Runtime/Microsoft.Scripting.Core/Utils/IRuntimeVariables.cs +../dlr/Runtime/Microsoft.Scripting.Core/Utils/ReadOnlyCollectionBuilder.cs +../dlr/Runtime/Microsoft.Scripting.Core/Utils/ReadOnlyDictionary.cs +../dlr/Runtime/Microsoft.Scripting.Core/Utils/ReferenceEqualityComparer.cs +../dlr/Runtime/Microsoft.Scripting.Core/Utils/TrueReadOnlyCollection.cs +../dlr/Runtime/Microsoft.Scripting.Core/Utils/TypeExtensions.cs diff --git a/mcs/class/System.Data.Linq/ChangeLog b/mcs/class/System.Data.Linq/ChangeLog index 0e91dff2adc..4924db9f5d6 100755 --- a/mcs/class/System.Data.Linq/ChangeLog +++ b/mcs/class/System.Data.Linq/ChangeLog @@ -1,3 +1,20 @@ +2009-06-25 Jonathan Pryor + + * src/**/*: Sync with DbLinq r1200. Among other fixes, this fixes an + issue where AttributeMappingSource.GetModel().GetTables() would + return duplicate types, which was unexpected by Marek Habersack. + +2009-06-19 Jonathan Pryor + + * src/**/*, tests/**/*: Sync with DbLinq r1180. Gets unit tests into + a state (i.e. no release tests fail within NUnit), fixes several + bugs, massive code cleanup (#if removal), EntitySet fixes, + removes some locale dependency issues, predicate building, + performance improvements, and likely more. Remove src/VisualMetal; + it's no longer used. + * Makefile (update-dblinq): Exclude more files so that there's less + "garbage" files to review on the next update. + 2009-05-14 Jonathan Pryor * src/DbLinq/Data/Linq/Sugar/Implementation/QueryCache.cs: Temporarily diff --git a/mcs/class/System.Data.Linq/Makefile b/mcs/class/System.Data.Linq/Makefile index a0d0de50a04..271a2e4671b 100755 --- a/mcs/class/System.Data.Linq/Makefile +++ b/mcs/class/System.Data.Linq/Makefile @@ -38,6 +38,21 @@ dist-DbLinq: tar cTf .files - | (cd $(distdir); tar xf -) ; \ rm .files +RSYNC_EXCLUDES = \ + --exclude '*.cache' \ + --exclude '*.csproj.*.txt' \ + --exclude '*.dll' \ + --exclude '*.exe' \ + --exclude '*.force' \ + --exclude '*.pdb' \ + --exclude '*.pidb' \ + --exclude '*.suo' \ + --exclude '*.user' \ + --exclude '*.userprefs' \ + --exclude '*.usertasks' \ + --exclude '.svn' + update-dblinq: - rsync -avz --exclude '.svn' --exclude '*.user' $$HOME/Development/mono-HEAD/dblinq2007/src/ src/ + rsync -avz $(RSYNC_EXCLUDES) $$HOME/Development/mono-HEAD/dblinq2007/src/ src/ + rsync -avz $(RSYNC_EXCLUDES) $$HOME/Development/mono-HEAD/dblinq2007/tests/ tests/ diff --git a/mcs/class/System.Data.Linq/System.Data.Linq.dll.sources b/mcs/class/System.Data.Linq/System.Data.Linq.dll.sources index 4fd517debd0..8e5bf989220 100755 --- a/mcs/class/System.Data.Linq/System.Data.Linq.dll.sources +++ b/mcs/class/System.Data.Linq/System.Data.Linq.dll.sources @@ -66,7 +66,6 @@ src/DbLinq/Data/Linq/Database/ITransactionalCommand.cs src/DbLinq/Data/Linq/DataContext.cs src/DbLinq/Data/Linq/DataLoadOptions.cs src/DbLinq/Data/Linq/DBLinqExtendedAttributte.cs -src/DbLinq/Data/Linq/EntityList.cs src/DbLinq/Data/Linq/EntityRef.cs src/DbLinq/Data/Linq/EntitySet.cs src/DbLinq/Data/Linq/Identity/IdentityKey.cs @@ -76,11 +75,9 @@ src/DbLinq/Data/Linq/Identity/IIdentityReaderFactory.cs src/DbLinq/Data/Linq/Identity/Implementation/IdentityProviderReader.cs src/DbLinq/Data/Linq/Identity/Implementation/IdentityReader.cs src/DbLinq/Data/Linq/Identity/Implementation/IdentityReaderFactory.cs -src/DbLinq/Data/Linq/IEntityMap.cs src/DbLinq/Data/Linq/IExecuteResult.cs src/DbLinq/Data/Linq/IMemberModificationHandler.cs src/DbLinq/Data/Linq/Implementation/DisabledEntityTracker.cs -src/DbLinq/Data/Linq/Implementation/EntityMap.cs src/DbLinq/Data/Linq/Implementation/EntityState.cs src/DbLinq/Data/Linq/Implementation/EntityTrack.cs src/DbLinq/Data/Linq/Implementation/EntityTracker.cs @@ -165,6 +162,7 @@ src/DbLinq/Data/Linq/Sugar/Expressions/SelectOperatorType.cs src/DbLinq/Data/Linq/Sugar/Expressions/SpecialExpression.cs src/DbLinq/Data/Linq/Sugar/Expressions/SpecialExpressionType.cs src/DbLinq/Data/Linq/Sugar/Expressions/StartIndexOffsetExpression.cs +src/DbLinq/Data/Linq/Sugar/Expressions/SubSelectExpression.cs src/DbLinq/Data/Linq/Sugar/Expressions/TableExpression.cs src/DbLinq/Data/Linq/Sugar/Expressions/TableJoinType.cs src/DbLinq/Data/Linq/Sugar/ExpressionTier.cs @@ -288,6 +286,7 @@ src/DbLinq/Util/MemberInfoExtensions.cs src/DbLinq/Util/Output.cs src/DbLinq/Util/OutputLevel.cs src/DbLinq/Util/Page.cs +src/DbLinq/Util/Profiler.cs src/DbLinq/Util/QuotesHelper.cs src/DbLinq/Util/ReferenceEqualityComparer.cs src/DbLinq/Util/ReflectionExtensions.cs @@ -312,7 +311,6 @@ src/DbLinq/Vendor/Implementation/SchemaLoader.Tables.cs src/DbLinq/Vendor/Implementation/SchemaLoader.TypeMapping.cs src/DbLinq/Vendor/Implementation/SqlProvider.cs src/DbLinq/Vendor/Implementation/Vendor.cs -src/DbLinq/Vendor/Implementation/Vendor.Name.cs src/DbLinq/Vendor/Implementation/Vendor.ProcedureResult.cs src/DbLinq/Vendor/INameAliases.cs src/DbLinq/Vendor/ISchemaLoader.cs diff --git a/mcs/class/System.Data.Linq/src/ConnectionStrings.xml b/mcs/class/System.Data.Linq/src/ConnectionStrings.xml deleted file mode 100644 index aaa62522df4..00000000000 --- a/mcs/class/System.Data.Linq/src/ConnectionStrings.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - Data Source=.\SQLExpress;Integrated Security=True;Initial Catalog=Northwind - Data Source=.\SQLExpress;Integrated Security=True;Initial Catalog=Northwind - - Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = 1521)))(CONNECT_DATA = (SERVER = DEDICATED))); User Id = Northwind; Password = linq2 - Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = 1521)))(CONNECT_DATA = (SERVER = DEDICATED))); User Id = Northwind; Password = linq2 - - Data Source=Northwind.db3 - Data Source=Northwind.db3 - DbLinqProvider=Sqlite;Data Source=Northwind.db3 - server={0};user id=LinqUser; password=linq2; database=Northwind - server={0};user id=LinqUser; password=linq2; database=Northwind - server={0};user id=LinqUser; password=linq2; database=Northwind - server={0};user id=LinqUser; password=linq2; database=c:\Program Files\Firebird\Firebird_2_1\examples\nwind\NORTHWIND.FDB - - - diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Firebird/FirebirdSqlProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq.Firebird/FirebirdSqlProvider.cs index a114116658c..11adf3cc240 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.Firebird/FirebirdSqlProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.Firebird/FirebirdSqlProvider.cs @@ -24,23 +24,18 @@ // #endregion +using System; using System.Collections.Generic; using System.Linq; using System.Text; -#if MONO_STRICT -using System.Data.Linq.Sql; -#else + using DbLinq.Data.Linq.Sql; -#endif using DbLinq.Util; using DbLinq.Vendor.Implementation; -using System; namespace DbLinq.Firebird { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class FirebirdSqlProvider : SqlProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Firebird/FirebirdVendor.cs b/mcs/class/System.Data.Linq/src/DbLinq.Firebird/FirebirdVendor.cs index 2c075872620..ccc29b6ee88 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.Firebird/FirebirdVendor.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.Firebird/FirebirdVendor.cs @@ -31,22 +31,21 @@ using System.Text; using System.Data.Linq.Mapping; using System.Reflection; using System.Data; + #if MONO_STRICT using System.Data.Linq; -using System.Data.Linq.SqlClient; #else using DbLinq.Data.Linq; -using DbLinq.Data.Linq.SqlClient; #endif + +using DbLinq.Data.Linq.SqlClient; using DbLinq.Util; using DbLinq.Vendor; namespace DbLinq.Firebird { [Vendor(typeof(FirebirdProvider))] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class FirebirdVendor : Vendor.Implementation.Vendor diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Ingres/IngresSqlProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq.Ingres/IngresSqlProvider.cs index e863dc3677d..edb53d26866 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.Ingres/IngresSqlProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.Ingres/IngresSqlProvider.cs @@ -27,18 +27,12 @@ using System; using System.Collections.Generic; using System.Linq; -#if MONO_STRICT -using System.Data.Linq.Sql; -#else using DbLinq.Data.Linq.Sql; -#endif using DbLinq.Vendor.Implementation; namespace DbLinq.Ingres { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class IngresSqlProvider : SqlProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Ingres/IngresVendor.cs b/mcs/class/System.Data.Linq/src/DbLinq.Ingres/IngresVendor.cs index d09f6da2be8..40542bf34e0 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.Ingres/IngresVendor.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.Ingres/IngresVendor.cs @@ -31,13 +31,10 @@ using System.Data.Linq.Mapping; using System.Reflection; using System.Collections.Generic; using System.Text; -#if MONO_STRICT -using System.Data.Linq.SqlClient; -#else using DbLinq.Data.Linq.SqlClient; -#endif using DbLinq.Util; using DbLinq.Vendor; + #if MONO_STRICT using DataContext = System.Data.Linq.DataContext; #else @@ -50,9 +47,7 @@ namespace DbLinq.Ingres /// Ingres - specific code. /// [Vendor(typeof(IngresProvider))] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class IngresVendor : Vendor.Implementation.Vendor diff --git a/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlSchemaLoader.Constraints.cs b/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlSchemaLoader.Constraints.cs index ae062e06eeb..532e3325081 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlSchemaLoader.Constraints.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlSchemaLoader.Constraints.cs @@ -72,9 +72,9 @@ namespace DbLinq.MySql { string sql = @" SELECT constraint_name,table_schema,table_name - ,column_name,referenced_table_schema,referenced_table_name,referenced_column_name + ,GROUP_CONCAT(column_name SEPARATOR ',') AS column_name,referenced_table_schema,referenced_table_name,GROUP_CONCAT(referenced_column_name SEPARATOR ',') AS referenced_column_name FROM information_schema.`KEY_COLUMN_USAGE` -WHERE table_schema=?db"; +WHERE table_schema=?db GROUP BY constraint_name,table_schema,table_name,referenced_table_name"; return DataCommand.Find(conn, sql, "?db", db, ReadConstraint); } diff --git a/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlSqlProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlSqlProvider.cs index f1a6b34fdfd..24a347e9a5b 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlSqlProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlSqlProvider.cs @@ -27,19 +27,14 @@ using System.Collections.Generic; using System.Linq; using System.Text; -#if MONO_STRICT -using System.Data.Linq.Sql; -#else + using DbLinq.Data.Linq.Sql; -#endif using DbLinq.Util; using DbLinq.Vendor.Implementation; namespace DbLinq.MySql { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class MySqlSqlProvider : SqlProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlVendor.cs b/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlVendor.cs index fcebe700cc2..3fe169e3448 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlVendor.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.MySql/MySqlVendor.cs @@ -31,22 +31,21 @@ using System.Text; using System.Data.Linq.Mapping; using System.Reflection; using System.Data; +using DbLinq.Data.Linq; +using DbLinq.Data.Linq.SqlClient; +using DbLinq.Util; +using DbLinq.Vendor; + #if MONO_STRICT using System.Data.Linq; -using System.Data.Linq.SqlClient; #else using DbLinq.Data.Linq; -using DbLinq.Data.Linq.SqlClient; #endif -using DbLinq.Util; -using DbLinq.Vendor; namespace DbLinq.MySql { [Vendor(typeof(MySqlProvider))] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class MySqlVendor : Vendor.Implementation.Vendor diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Oracle/OracleSqlProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq.Oracle/OracleSqlProvider.cs index 42f0a1d56c2..96725f7c301 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.Oracle/OracleSqlProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.Oracle/OracleSqlProvider.cs @@ -27,19 +27,13 @@ using System.Collections.Generic; using System.Linq; using System.Text; -#if MONO_STRICT -using System.Data.Linq.Sql; -#else using DbLinq.Data.Linq.Sql; -#endif using DbLinq.Util; using DbLinq.Vendor.Implementation; namespace DbLinq.Oracle { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class OracleSqlProvider : SqlProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Oracle/OracleVendor.cs b/mcs/class/System.Data.Linq/src/DbLinq.Oracle/OracleVendor.cs index ba308d5c798..20377d72b7c 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.Oracle/OracleVendor.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.Oracle/OracleVendor.cs @@ -30,12 +30,9 @@ using System.Collections.Generic; using System.Text; using System.Data.Linq; using System.Data.Linq.Mapping; -#if MONO_STRICT -using System.Data.Linq.SqlClient; -#else using DbLinq.Data.Linq.SqlClient; -#endif using DbLinq.Vendor; + #if MONO_STRICT using DataContext = System.Data.Linq.DataContext; #else @@ -45,12 +42,10 @@ using DataContext = DbLinq.Data.Linq.DataContext; namespace DbLinq.Oracle { [Vendor(typeof(OracleProvider))] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - class OracleVendor : Vendor.Implementation.Vendor + class OracleVendor : Vendor.Implementation.Vendor { public override string VendorName { get { return "Oracle"; } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/PgsqlSqlProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/PgsqlSqlProvider.cs index d808b0cd803..545af1aea45 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/PgsqlSqlProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/PgsqlSqlProvider.cs @@ -24,21 +24,15 @@ // #endregion +using System; using System.Collections.Generic; using System.Linq; -#if MONO_STRICT -using System.Data.Linq.Sql; -#else using DbLinq.Data.Linq.Sql; -#endif using DbLinq.Vendor.Implementation; -using System; namespace DbLinq.PostgreSql { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class PgsqlSqlProvider : SqlProvider @@ -55,6 +49,11 @@ namespace DbLinq.PostgreSql return insertId; } + public override SqlStatement GetLiteral(DateTime literal) + { + return "'" + literal.ToString("o") + "'"; + } + protected override SqlStatement GetLiteralStringToUpper(SqlStatement a) { return string.Format("UPPER({0})", a); @@ -64,10 +63,40 @@ namespace DbLinq.PostgreSql { return string.Format("LOWER({0})", a); } + protected override SqlStatement GetLiteralDateDiff(SqlStatement dateA, SqlStatement dateB) { return string.Format("(DATE_PART('Day',{0}-{1})*86400000+DATE_PART('Hour',{0}-{1})*3600000+DATE_PART('Minute',{0}-{1})*60000+DATE_PART('Second',{0}-{1})*1000+DATE_PART('Millisecond',{0}-{1}))::real", dateA, dateB); } + + protected override SqlStatement GetLiteralEqual(SqlStatement a, SqlStatement b) + { + // PostgreSQL return NULL (and not a boolean) for every comparaison involving + // a NULL value, unless the operator used is "IS" (or "IS NOT"). Also, + // using those two operators when the right-hand value is not a literal + // NULL is an error. The only possibility is to explicitly check for NULL + // literals and even swap the operands to make sure NULL gets to the + // right place. + + if (b.Count == 1 && b[0].Sql == "NULL") + return SqlStatement.Format("{0} IS {1}", a, b); + else if (a.Count == 1 && a[0].Sql == "NULL") + return SqlStatement.Format("{0} IS {1}", b, a); + else + return SqlStatement.Format("{0} = {1}", a, b); + } + + protected override SqlStatement GetLiteralNotEqual(SqlStatement a, SqlStatement b) + { + // See comment above, in GetLiteralEqual(). + + if (b.Count == 1 && b[0].Sql == "NULL") + return SqlStatement.Format("{0} IS NOT {1}", a, b); + else if (a.Count == 1 && a[0].Sql == "NULL") + return SqlStatement.Format("{0} IS NOT {1}", b, a); + else + return SqlStatement.Format("{0} <> {1}", a, b); + } public static readonly Dictionary typeMapping = new Dictionary { diff --git a/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/PgsqlVendor.cs b/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/PgsqlVendor.cs index d4959380b55..c17f1930f9c 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/PgsqlVendor.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/PgsqlVendor.cs @@ -30,14 +30,11 @@ using System.Linq; using System.Data.Linq.Mapping; using System.Reflection; using System.Collections.Generic; -#if MONO_STRICT -using System.Data.Linq.SqlClient; -#else using DbLinq.Data.Linq.SqlClient; -#endif using DbLinq.PostgreSql; using DbLinq.Util; using DbLinq.Vendor; + #if MONO_STRICT using DataContext=System.Data.Linq.DataContext; #else @@ -46,16 +43,23 @@ using DataContext=DbLinq.Data.Linq.DataContext; namespace DbLinq.PostgreSql { +#if !MONO_STRICT + public +#endif + class PgsqlVendor : PostgreSqlVendor + { + // This is a compatibility class. It will go away after the + // big PostgreSql rename. + } + /// /// PostgreSQL - specific code. /// [Vendor(typeof(PostgreSqlProvider))] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - class PgsqlVendor : Vendor.Implementation.Vendor + class PostgreSqlVendor : Vendor.Implementation.Vendor { public override string VendorName { get { return "PostgreSQL"; } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/Test/DbLinq.PostgreSql_test.csproj b/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/Test/DbLinq.PostgreSql_test.csproj index 9cb12964c82..da6898754dd 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/Test/DbLinq.PostgreSql_test.csproj +++ b/mcs/class/System.Data.Linq/src/DbLinq.PostgreSql/Test/DbLinq.PostgreSql_test.csproj @@ -58,6 +58,9 @@ nwind\Northwind.cs + + nwind\NorthwindCustom.cs + lib\DynamicLinq.cs diff --git a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerExpressionTranslator.cs b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerExpressionTranslator.cs index dfd219a1455..5c7aa89f9a4 100755 --- a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerExpressionTranslator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerExpressionTranslator.cs @@ -3,11 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar.Expressions; -#endif namespace DbLinq.SqlServer { diff --git a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerSqlProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerSqlProvider.cs index 34152a51435..34e1e5acae8 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerSqlProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerSqlProvider.cs @@ -30,22 +30,15 @@ using System.Collections.Generic; using DbLinq.Vendor.Implementation; -#if MONO_STRICT -using System.Data.Linq.Sql; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sql; using DbLinq.Data.Linq.Sugar.Expressions; -#endif namespace DbLinq.SqlServer { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - class SqlServerSqlProvider : SqlProvider + class SqlServerSqlProvider : SqlProvider { public override ExpressionTranslator GetTranslator() { @@ -67,6 +60,18 @@ namespace DbLinq.SqlServer return string.Format("{0} AS {1}", GetTable(table), GetTableAlias(alias)); } + /// + /// Returns a table alias + /// Ensures about the right case + /// + /// + /// + /// + public override string GetSubQueryAsAlias(string subquery, string alias) + { + return string.Format("({0}) AS {1}", subquery, GetTableAlias(alias)); + } + public override SqlStatement GetLiteral(bool literal) { if (literal) @@ -74,6 +79,11 @@ namespace DbLinq.SqlServer return "0"; } + public override SqlStatement GetLiteral(DateTime literal) + { + return "'" + literal.ToString("o").Substring(0,23) + "'"; + } + public override string GetParameterName(string nameBase) { return string.Format("@{0}", nameBase); @@ -189,7 +199,7 @@ namespace DbLinq.SqlServer protected override SqlStatement GetLiteralStringConcat(SqlStatement a, SqlStatement b) { - return SqlStatement.Format("{0} + {1}", a, b); + return SqlStatement.Format("{0} + {1}", a.Replace("sql_variant", "varchar", false), b.Replace("sql_variant", "varchar", false)); } protected override SqlStatement GetLiteralStringToLower(SqlStatement a) @@ -253,11 +263,14 @@ namespace DbLinq.SqlServer if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) type = type.GetGenericArguments().First(); + if (type.IsValueType && a[0].Sql.StartsWith("@")) + return a; + SqlStatement sqlTypeName; if (typeMapping.ContainsKey(type)) sqlTypeName = typeMapping[type]; else - sqlTypeName = "variant"; + sqlTypeName = "sql_variant"; return SqlStatement.Format("CONVERT({0},{1})", sqlTypeName, a); } diff --git a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerVendor.cs b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerVendor.cs index 26c85f16df8..7b884ee5227 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerVendor.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/SqlServerVendor.cs @@ -32,26 +32,27 @@ using System.Text; using System.Data; using System.Data.Linq.Mapping; +using DbLinq.Data.Linq; +using DbLinq.Data.Linq.SqlClient; using DbLinq.Util; using DbLinq.Vendor; + #if MONO_STRICT -using System.Data.Linq.SqlClient; using DataContext = System.Data.Linq.DataContext; -using ITable = System.Data.Linq.ITable; -using DataLinq = System.Data.Linq; +using DataLinq = System.Data.Linq; +using ITable = System.Data.Linq.ITable; +using System.Data.Linq.SqlClient; #else -using DbLinq.Data.Linq.SqlClient; using DataContext = DbLinq.Data.Linq.DataContext; -using ITable = DbLinq.Data.Linq.ITable; -using DataLinq = DbLinq.Data.Linq; +using DataLinq = DbLinq.Data.Linq; +using ITable = DbLinq.Data.Linq.ITable; +using DbLinq.Data.Linq.SqlClient; #endif namespace DbLinq.SqlServer { [Vendor(typeof(SqlServerProvider), typeof(Sql2000Provider), typeof(Sql2005Provider))] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class SqlServerVendor : Vendor.Implementation.Vendor diff --git a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/DbLinq.SqlServer_test.csproj b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/DbLinq.SqlServer_test.csproj index caa0ca87aff..26677eafcdd 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/DbLinq.SqlServer_test.csproj +++ b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/DbLinq.SqlServer_test.csproj @@ -31,7 +31,7 @@ pdbonly true ..\..\..\build\ - TRACE;DEBUG;MSSQL + TRACE;MSSQL prompt 4 @@ -63,6 +63,9 @@ nwind\Northwind.cs + + nwind\NorthwindCustom.cs + lib\DynamicLinq.cs diff --git a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/DbLinq.SqlServer_test_strict.csproj b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/DbLinq.SqlServer_test_strict.csproj index 7250e0ef359..5521265861f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/DbLinq.SqlServer_test_strict.csproj +++ b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/DbLinq.SqlServer_test_strict.csproj @@ -23,7 +23,7 @@ full false ..\..\..\build.dbg\ - TRACE;DEBUG;MSSQL;MONO_STRICT + TRACE;DEBUG;MSSQL;MONO_STRICT;L2SQL prompt 4 @@ -31,7 +31,7 @@ pdbonly true ..\..\..\build\ - TRACE;DEBUG;MSSQL;MONO_STRICT + TRACE;MSSQL;MONO_STRICT;L2SQL prompt 4 @@ -60,6 +60,9 @@ + + nwind\NorthwindCustom.cs + nwind\originalMSNorthwind.designer.cs diff --git a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/MsSqlDataContextTest.cs b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/MsSqlDataContextTest.cs index 52e249de4eb..79e6a44826c 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/MsSqlDataContextTest.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.SqlServer/Test/MsSqlDataContextTest.cs @@ -66,13 +66,13 @@ namespace DbLinqTest { return string.Format( "SELECT [first_name], [last_name]{0}" + "FROM [people]{0}" + - "WHERE [first_name] = '" + firstName + "'", + "WHERE ([first_name] = '" + firstName + "')", Environment.NewLine); ; } protected override string People(string firstName, string lastName) { - return People(firstName) + " AND [last_name] = '" + lastName + "'"; + return People(firstName) + " AND ([last_name] = '" + lastName + "')"; } protected override string People(string firstName, string lastName, int skip, int take) @@ -84,7 +84,7 @@ namespace DbLinqTest { " ROW_NUMBER() OVER(ORDER BY [first_name], [last_name]{0}" + ") AS [__ROW_NUMBER]{0}" + " FROM [people]{0}" + - "WHERE [first_name] = '{1}' AND [last_name] = '{2}' ) AS [t0]{0}" + + "WHERE ([first_name] = '{1}') AND ([last_name] = '{2}') ) AS [t0]{0}" + "WHERE [__ROW_NUMBER] BETWEEN {3}+1 AND {3}+{4}{0}" + "ORDER BY [__ROW_NUMBER]", Environment.NewLine, firstName, lastName, skip, take); diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/SqliteSqlProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/SqliteSqlProvider.cs index 9484d0b3433..10efc1c7036 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/SqliteSqlProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/SqliteSqlProvider.cs @@ -25,18 +25,12 @@ #endregion using System.Collections.Generic; -#if MONO_STRICT -using System.Data.Linq.Sql; -#else using DbLinq.Data.Linq.Sql; -#endif using DbLinq.Vendor.Implementation; namespace DbLinq.Sqlite { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class SqliteSqlProvider : SqlProvider @@ -70,5 +64,12 @@ namespace DbLinq.Sqlite { return true; } + + public override SqlStatement GetLiteral(bool literal) + { + if (literal) + return "1"; + return "0"; + } } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/SqliteVendor.cs b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/SqliteVendor.cs index 948b957f788..4bbb9b594fe 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/SqliteVendor.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/SqliteVendor.cs @@ -30,29 +30,28 @@ using System.Text; using System.Data; using System.Data.Linq.Mapping; using System.Reflection; -#if MONO_STRICT -using System.Data.Linq; -using System.Data.Linq.SqlClient; -#else using DbLinq.Data.Linq; using DbLinq.Data.Linq.SqlClient; -#endif using DbLinq.Sqlite; using DbLinq.Util; using DbLinq.Vendor; +#if MONO_STRICT +using DataContext = System.Data.Linq.DataContext; +#else +using DataContext = DbLinq.Data.Linq.DataContext; +#endif + namespace DbLinq.Sqlite { /// /// SQLite - specific code. /// [Vendor(typeof(SqliteProvider))] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - class SqliteVendor : Vendor.Implementation.Vendor + class SqliteVendor : Vendor.Implementation.Vendor { public override string VendorName { get { return "SQLite"; } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DbLinq.Sqlite_test.csproj b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DbLinq.Sqlite_test.csproj index 224380dbfe9..f140e640061 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DbLinq.Sqlite_test.csproj +++ b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DbLinq.Sqlite_test.csproj @@ -33,7 +33,7 @@ pdbonly true ..\..\..\build\ - TRACE;DEBUG;SQLITE + TRACE;SQLITE prompt 4 diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DbLinq.Sqlite_test_mono.csproj b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DbLinq.Sqlite_test_mono.csproj index 730dc0b1429..ff2ab684ba7 100755 --- a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DbLinq.Sqlite_test_mono.csproj +++ b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DbLinq.Sqlite_test_mono.csproj @@ -23,7 +23,7 @@ full false ..\..\..\build.dbg\ - TRACE;DEBUG;SQLITE + TRACE;DEBUG;SQLITE;MONO prompt 1 @@ -33,7 +33,7 @@ pdbonly true ..\..\..\build\ - TRACE;DEBUG;SQLITE + TRACE;SQLITE;MONO prompt 4 diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DirectDataContext.cs b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DirectDataContext.cs index 7eb086d6c1b..54554b3c748 100755 --- a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DirectDataContext.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/DirectDataContext.cs @@ -53,7 +53,7 @@ namespace Test_NUnit_Sqlite var dc = new DataContext(connectionString); Assert.AreEqual(typeof(SqliteConnection), dc.Connection.GetType()); - var dcq = from p in dc.GetTable() where p.ProductName == "Pen" select p.ProductID; + var dcq = from p in dc.GetTable() where p.ProductName == "Chai" select p.ProductID; var cmd = dc.GetCommand(dcq); var dcc = dcq.ToList().Count; Assert.AreEqual(dcc, 1); diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/TestBase.cs b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/TestBase.cs index adc9ce02036..64631dbf4e7 100755 --- a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/TestBase.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/TestBase.cs @@ -35,12 +35,12 @@ namespace Test_NUnit public abstract partial class TestBase { static bool doRecreate = true; - public const StringComparison stringComparisonType = StringComparison.InvariantCulture; + public const StringComparison stringComparisonType = StringComparison.Ordinal; static partial void CheckRecreateSqlite () { if (doRecreate) { - File.Copy ("../src/Northwind.db3", "Northwind.db3", true); + File.Copy ("../tests/Northwind.db3", "Northwind.db3", true); doRecreate = false; } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/TestBase_mono.cs b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/TestBase_mono.cs index f61830dcc52..bec2070fa1b 100755 --- a/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/TestBase_mono.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq.Sqlite/Test/TestBase_mono.cs @@ -35,12 +35,12 @@ namespace Test_NUnit public abstract partial class TestBase { static bool doRecreate = true; - public const StringComparison stringComparisonType = StringComparison.InvariantCulture; + public const StringComparison stringComparisonType = StringComparison.Ordinal; static partial void CheckRecreateSqlite () { if (doRecreate) { - File.Copy ("../src/Northwind.db3", "Northwind.db3", true); + File.Copy ("../tests/Northwind.db3", "Northwind.db3", true); doRecreate = false; } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq.sln b/mcs/class/System.Data.Linq/src/DbLinq.sln index b02ab72c3da..b09e57aee90 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq.sln +++ b/mcs/class/System.Data.Linq/src/DbLinq.sln @@ -93,6 +93,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbLinq.SqlServer_test_ndb", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestNamespaceWriter", "Tools\TestNamespaceWriter\TestNamespaceWriter.csproj", "{5C6BF500-1612-4A81-95AF-F31BE0436A27}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbLinq.Sqlite_test_mono", "DbLinq.Sqlite\Test\DbLinq.Sqlite_test_mono.csproj", "{68267FB0-0771-4507-942F-395A1AE556FD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbLinq.Sqlite_test_mono_strict", "DbLinq.Sqlite\Test\DbLinq.Sqlite_test_mono_strict.csproj", "{06413209-2415-4541-8033-D5AAFF778A23}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug - Mono Strict|Any CPU = Debug - Mono Strict|Any CPU @@ -107,36 +111,43 @@ Global {7950197D-4122-49CB-9FD7-45E666BAFEC2}.Release|Any CPU.ActiveCfg = Release|Any CPU {7950197D-4122-49CB-9FD7-45E666BAFEC2}.Release|Any CPU.Build.0 = Release|Any CPU {FA8D1068-3341-4956-BF94-54C6A816BD9E}.Debug - Mono Strict|Any CPU.ActiveCfg = Debug|Any CPU + {FA8D1068-3341-4956-BF94-54C6A816BD9E}.Debug - Mono Strict|Any CPU.Build.0 = Debug|Any CPU {FA8D1068-3341-4956-BF94-54C6A816BD9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FA8D1068-3341-4956-BF94-54C6A816BD9E}.Debug|Any CPU.Build.0 = Debug|Any CPU {FA8D1068-3341-4956-BF94-54C6A816BD9E}.Release|Any CPU.ActiveCfg = Release|Any CPU {FA8D1068-3341-4956-BF94-54C6A816BD9E}.Release|Any CPU.Build.0 = Release|Any CPU {EA47FE75-0E41-4ABF-B355-9667E78072E9}.Debug - Mono Strict|Any CPU.ActiveCfg = Debug|Any CPU + {EA47FE75-0E41-4ABF-B355-9667E78072E9}.Debug - Mono Strict|Any CPU.Build.0 = Debug|Any CPU {EA47FE75-0E41-4ABF-B355-9667E78072E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EA47FE75-0E41-4ABF-B355-9667E78072E9}.Debug|Any CPU.Build.0 = Debug|Any CPU {EA47FE75-0E41-4ABF-B355-9667E78072E9}.Release|Any CPU.ActiveCfg = Release|Any CPU {EA47FE75-0E41-4ABF-B355-9667E78072E9}.Release|Any CPU.Build.0 = Release|Any CPU {D9DE72A2-D885-4C54-A89E-302E6829101C}.Debug - Mono Strict|Any CPU.ActiveCfg = Debug|Any CPU + {D9DE72A2-D885-4C54-A89E-302E6829101C}.Debug - Mono Strict|Any CPU.Build.0 = Debug|Any CPU {D9DE72A2-D885-4C54-A89E-302E6829101C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D9DE72A2-D885-4C54-A89E-302E6829101C}.Debug|Any CPU.Build.0 = Debug|Any CPU {D9DE72A2-D885-4C54-A89E-302E6829101C}.Release|Any CPU.ActiveCfg = Release|Any CPU {D9DE72A2-D885-4C54-A89E-302E6829101C}.Release|Any CPU.Build.0 = Release|Any CPU {32824F7E-9260-413C-B174-F3E315936FA7}.Debug - Mono Strict|Any CPU.ActiveCfg = Debug|Any CPU + {32824F7E-9260-413C-B174-F3E315936FA7}.Debug - Mono Strict|Any CPU.Build.0 = Debug|Any CPU {32824F7E-9260-413C-B174-F3E315936FA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {32824F7E-9260-413C-B174-F3E315936FA7}.Debug|Any CPU.Build.0 = Debug|Any CPU {32824F7E-9260-413C-B174-F3E315936FA7}.Release|Any CPU.ActiveCfg = Release|Any CPU {32824F7E-9260-413C-B174-F3E315936FA7}.Release|Any CPU.Build.0 = Release|Any CPU {60B9AFA1-99B4-4DE6-80E1-80BBED1AC755}.Debug - Mono Strict|Any CPU.ActiveCfg = Debug|Any CPU + {60B9AFA1-99B4-4DE6-80E1-80BBED1AC755}.Debug - Mono Strict|Any CPU.Build.0 = Debug|Any CPU {60B9AFA1-99B4-4DE6-80E1-80BBED1AC755}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {60B9AFA1-99B4-4DE6-80E1-80BBED1AC755}.Debug|Any CPU.Build.0 = Debug|Any CPU {60B9AFA1-99B4-4DE6-80E1-80BBED1AC755}.Release|Any CPU.ActiveCfg = Release|Any CPU {60B9AFA1-99B4-4DE6-80E1-80BBED1AC755}.Release|Any CPU.Build.0 = Release|Any CPU {90D57CD9-D704-409E-88A1-0F22AC79065A}.Debug - Mono Strict|Any CPU.ActiveCfg = Debug|Any CPU + {90D57CD9-D704-409E-88A1-0F22AC79065A}.Debug - Mono Strict|Any CPU.Build.0 = Debug|Any CPU {90D57CD9-D704-409E-88A1-0F22AC79065A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {90D57CD9-D704-409E-88A1-0F22AC79065A}.Debug|Any CPU.Build.0 = Debug|Any CPU {90D57CD9-D704-409E-88A1-0F22AC79065A}.Release|Any CPU.ActiveCfg = Release|Any CPU {90D57CD9-D704-409E-88A1-0F22AC79065A}.Release|Any CPU.Build.0 = Release|Any CPU {363FF43D-C870-4423-BE50-DAED7793A6D1}.Debug - Mono Strict|Any CPU.ActiveCfg = Debug|Any CPU + {363FF43D-C870-4423-BE50-DAED7793A6D1}.Debug - Mono Strict|Any CPU.Build.0 = Debug|Any CPU {363FF43D-C870-4423-BE50-DAED7793A6D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {363FF43D-C870-4423-BE50-DAED7793A6D1}.Debug|Any CPU.Build.0 = Debug|Any CPU {363FF43D-C870-4423-BE50-DAED7793A6D1}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -279,6 +290,18 @@ Global {5C6BF500-1612-4A81-95AF-F31BE0436A27}.Debug|Any CPU.Build.0 = Debug|Any CPU {5C6BF500-1612-4A81-95AF-F31BE0436A27}.Release|Any CPU.ActiveCfg = Release|Any CPU {5C6BF500-1612-4A81-95AF-F31BE0436A27}.Release|Any CPU.Build.0 = Release|Any CPU + {68267FB0-0771-4507-942F-395A1AE556FD}.Debug - Mono Strict|Any CPU.ActiveCfg = Debug|Any CPU + {68267FB0-0771-4507-942F-395A1AE556FD}.Debug - Mono Strict|Any CPU.Build.0 = Debug|Any CPU + {68267FB0-0771-4507-942F-395A1AE556FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68267FB0-0771-4507-942F-395A1AE556FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68267FB0-0771-4507-942F-395A1AE556FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68267FB0-0771-4507-942F-395A1AE556FD}.Release|Any CPU.Build.0 = Release|Any CPU + {06413209-2415-4541-8033-D5AAFF778A23}.Debug - Mono Strict|Any CPU.ActiveCfg = Debug|Any CPU + {06413209-2415-4541-8033-D5AAFF778A23}.Debug - Mono Strict|Any CPU.Build.0 = Debug|Any CPU + {06413209-2415-4541-8033-D5AAFF778A23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {06413209-2415-4541-8033-D5AAFF778A23}.Debug|Any CPU.Build.0 = Debug|Any CPU + {06413209-2415-4541-8033-D5AAFF778A23}.Release|Any CPU.ActiveCfg = Release|Any CPU + {06413209-2415-4541-8033-D5AAFF778A23}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -298,6 +321,8 @@ Global {4A829353-5A69-4EFD-8CD7-92C9D5DEB102} = {33BD0DF3-4C8A-44F9-817C-BF5585D58619} {6661D6CB-8AE4-4CEF-A81E-8A4AFB6A1CEE} = {33BD0DF3-4C8A-44F9-817C-BF5585D58619} {5C6BF500-1612-4A81-95AF-F31BE0436A27} = {33BD0DF3-4C8A-44F9-817C-BF5585D58619} + {68267FB0-0771-4507-942F-395A1AE556FD} = {33BD0DF3-4C8A-44F9-817C-BF5585D58619} + {06413209-2415-4541-8033-D5AAFF778A23} = {33BD0DF3-4C8A-44F9-817C-BF5585D58619} {B784AE42-25A7-4819-8469-C901EB3635A4} = {595F22C8-D8E2-4692-93D5-32FDDB7FF178} {B8E7590F-1EA8-49AE-9808-A36C8A67E322} = {595F22C8-D8E2-4692-93D5-32FDDB7FF178} {2D81DF5B-E974-4131-9A41-519C6B9D0EBC} = {595F22C8-D8E2-4692-93D5-32FDDB7FF178} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/ChangeSet.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/ChangeSet.cs index e0bf806a00d..8cdc3b8bbcf 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/ChangeSet.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/ChangeSet.cs @@ -25,11 +25,6 @@ #endregion using System.Collections.Generic; -#if MONO_STRICT -using System.Data.Linq; -#else -using DbLinq.Data.Linq; -#endif #if MONO_STRICT namespace System.Data.Linq diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataContext.Extended.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataContext.Extended.cs index 20106049543..9663c32c51a 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataContext.Extended.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataContext.Extended.cs @@ -33,6 +33,7 @@ using System.Data; using DbLinq.Vendor; using System.Data.Linq; using DbLinq.Data.Linq.Database.Implementation; +using DbLinq.Util; namespace DbLinq.Data.Linq { @@ -42,7 +43,9 @@ namespace DbLinq.Data.Linq public DataContext(IDatabaseContext databaseContext, MappingSource mappingSource, IVendor vendor) { + Profiler.At("START DataContext(IDatabaseContext, MappingSource, IVendor)"); Init(databaseContext, mappingSource, vendor); + Profiler.At("END DataContext(IDatabaseContext, MappingSource, IVendor)"); } public DataContext(IDbConnection dbConnection, MappingSource mappingSource, IVendor vendor) diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataContext.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataContext.cs index eb7c1e1f633..bb49b9e35d2 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataContext.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataContext.cs @@ -28,36 +28,32 @@ using System; using System.Collections; using System.Data; using System.Data.Common; +using System.Data.Linq; using System.Data.Linq.Mapping; +using System.Linq.Expressions; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using System.Reflection.Emit; #if MONO_STRICT -using System.Data.Linq.Implementation; -using System.Data.Linq.Sugar; -using System.Data.Linq.Identity; -using DbLinq.Util; -using AttributeMappingSource = System.Data.Linq.Mapping.AttributeMappingSource; -using MappingContext = System.Data.Linq.Mapping.MappingContext; -using DbLinq; +using AttributeMappingSource = System.Data.Linq.Mapping.AttributeMappingSource; #else -using DbLinq.Data.Linq.Implementation; -using DbLinq.Data.Linq.Sugar; -using DbLinq.Data.Linq.Identity; -using DbLinq.Util; -using AttributeMappingSource = DbLinq.Data.Linq.Mapping.AttributeMappingSource; -using MappingContext = DbLinq.Data.Linq.Mapping.MappingContext; -using System.Data.Linq; +using AttributeMappingSource = DbLinq.Data.Linq.Mapping.AttributeMappingSource; #endif -using DbLinq.Factory; -using DbLinq.Vendor; +using DbLinq; +using DbLinq.Data.Linq; using DbLinq.Data.Linq.Database; using DbLinq.Data.Linq.Database.Implementation; -using System.Linq.Expressions; -using System.Reflection.Emit; +using DbLinq.Data.Linq.Identity; +using DbLinq.Data.Linq.Implementation; +using DbLinq.Data.Linq.Mapping; +using DbLinq.Data.Linq.Sugar; +using DbLinq.Factory; +using DbLinq.Util; +using DbLinq.Vendor; #if MONO_STRICT namespace System.Data.Linq @@ -68,7 +64,7 @@ namespace DbLinq.Data.Linq public partial class DataContext : IDisposable { //private readonly Dictionary _tableMap = new Dictionary(); - private readonly Dictionary _tableMap = new Dictionary(); + private readonly Dictionary _tableMap = new Dictionary(); public MetaModel Mapping { get; private set; } // PC question: at ctor, we get a IDbConnection and the Connection property exposes a DbConnection @@ -86,6 +82,19 @@ namespace DbLinq.Data.Linq private bool objectTrackingEnabled = true; private bool deferredLoadingEnabled = true; + private bool queryCacheEnabled = false; + + /// + /// Disable the QueryCache: this is surely good for rarely used Select, since preparing + /// the SelectQuery to be cached could require more time than build the sql from scratch. + /// + [DBLinqExtended] + public bool QueryCacheEnabled + { + get { return queryCacheEnabled; } + set { queryCacheEnabled = value; } + } + private IEntityTracker currentTransactionEntities; private IEntityTracker CurrentTransactionEntities { @@ -131,20 +140,25 @@ namespace DbLinq.Data.Linq public DataContext(IDbConnection connection, MappingSource mapping) { + Profiler.At("START DataContext(IDbConnection, MappingSource)"); Init(new DatabaseContext(connection), mapping, null); + Profiler.At("END DataContext(IDbConnection, MappingSource)"); } public DataContext(IDbConnection connection) { + Profiler.At("START DataContext(IDbConnection)"); if (connection == null) throw new ArgumentNullException("connection"); Init(new DatabaseContext(connection), null, null); + Profiler.At("END DataContext(IDbConnection)"); } [DbLinqToDo] public DataContext(string fileOrServerOrConnection, MappingSource mapping) { + Profiler.At("START DataContext(string, MappingSource)"); if (fileOrServerOrConnection == null) throw new ArgumentNullException("fileOrServerOrConnection"); if (mapping == null) @@ -160,10 +174,11 @@ namespace DbLinq.Data.Linq throw new NotImplementedException("Server name not supported."); // Assume it's a connection string... - IVendor ivendor = GetVendor(fileOrServerOrConnection); + IVendor ivendor = GetVendor(ref fileOrServerOrConnection); IDbConnection dbConnection = ivendor.CreateDbConnection(fileOrServerOrConnection); Init(new DatabaseContext(dbConnection), mapping, ivendor); + Profiler.At("END DataContext(string, MappingSource)"); } /// @@ -179,21 +194,23 @@ namespace DbLinq.Data.Linq [DbLinqToDo] public DataContext(string connectionString) { - IVendor ivendor = GetVendor(connectionString); + Profiler.At("START DataContext(string)"); + IVendor ivendor = GetVendor(ref connectionString); IDbConnection dbConnection = ivendor.CreateDbConnection(connectionString); Init(new DatabaseContext(dbConnection), null, ivendor); + Profiler.At("END DataContext(string)"); } - private IVendor GetVendor(string connectionString) + private IVendor GetVendor(ref string connectionString) { if (connectionString == null) throw new ArgumentNullException("connectionString"); Assembly assy; string vendorClassToLoad; - GetVendorInfo(connectionString, out assy, out vendorClassToLoad); + GetVendorInfo(ref connectionString, out assy, out vendorClassToLoad); var types = from type in assy.GetTypes() @@ -214,10 +231,10 @@ namespace DbLinq.Data.Linq return (IVendor) Activator.CreateInstance(types.First()); } - private void GetVendorInfo(string connectionString, out Assembly assembly, out string typeName) + private void GetVendorInfo(ref string connectionString, out Assembly assembly, out string typeName) { System.Text.RegularExpressions.Regex reProvider - = new System.Text.RegularExpressions.Regex(@"DbLinqProvider=([\w\.]+)"); + = new System.Text.RegularExpressions.Regex(@"DbLinqProvider=([\w\.]+);?"); string assemblyFile = null; string vendor; @@ -274,13 +291,12 @@ namespace DbLinq.Data.Linq if (databaseContext.Connection.ConnectionString == null) throw new NullReferenceException(); + string connectionString = databaseContext.Connection.ConnectionString; _VendorProvider = ObjectFactory.Get(); Vendor = vendor ?? - (databaseContext.Connection.ConnectionString != null - ? GetVendor(databaseContext.Connection.ConnectionString) - : null) ?? + (connectionString != null ? GetVendor(ref connectionString) : null) ?? _VendorProvider.FindVendorByProviderType(typeof(SqlClient.Sql2005Provider)); - + DatabaseContext = databaseContext; MemberModificationHandler = ObjectFactory.Create(); // not a singleton: object is stateful @@ -298,43 +314,44 @@ namespace DbLinq.Data.Linq Mapping = mappingSource.GetModel(GetType()); } - /// - /// Checks if the table is allready mapped or maps it if not. - /// - /// Type of the table. - /// Thrown if the table is not mappable. - private void CheckTableMapping(Type tableType) - { - //This will throw an exception if the table is not found - if(Mapping.GetTable(tableType) == null) - { - throw new InvalidOperationException("The type '" + tableType.Name + "' is not mapped as a Table."); - } - } + /// + /// Checks if the table is allready mapped or maps it if not. + /// + /// Type of the table. + /// Thrown if the table is not mappable. + private void CheckTableMapping(Type tableType) + { + //This will throw an exception if the table is not found + if(Mapping.GetTable(tableType) == null) + { + throw new InvalidOperationException("The type '" + tableType.Name + "' is not mapped as a Table."); + } + } - /// - /// Returns a Table for the type TEntity. - /// - /// If the type TEntity is not mappable as a Table. - /// The table type. - public Table GetTable() where TEntity : class + /// + /// Returns a Table for the type TEntity. + /// + /// If the type TEntity is not mappable as a Table. + /// The table type. + public Table GetTable() where TEntity : class { return (Table)GetTable(typeof(TEntity)); } - /// - /// Returns a Table for the given type. - /// - /// The table type. - /// If the type is not mappable as a Table. + /// + /// Returns a Table for the given type. + /// + /// The table type. + /// If the type is not mappable as a Table. public ITable GetTable(Type type) { + Profiler.At("DataContext.GetTable(typeof({0}))", type != null ? type.Name : null); ITable tableExisting; - if (_tableMap.TryGetValue(type, out tableExisting)) + if (_tableMap.TryGetValue(type, out tableExisting)) return tableExisting; - //Check for table mapping - CheckTableMapping(type); + //Check for table mapping + CheckTableMapping(type); var tableNew = Activator.CreateInstance( typeof(Table<>).MakeGenericType(type) @@ -420,7 +437,6 @@ namespace DbLinq.Data.Linq break; default: throw new ArgumentOutOfRangeException(); - break; } } // TODO: handle conflicts (which can only occur when concurrency mode is implemented) @@ -624,65 +640,77 @@ namespace DbLinq.Data.Linq } readonly IDataMapper DataMapper = ObjectFactory.Get(); - private void SetEntityRefQueries(object entity) - { + private void SetEntityRefQueries(object entity) + { if (!this.deferredLoadingEnabled) return; // BUG: This is ignoring External Mappings from XmlMappingSource. - Type thisType = entity.GetType(); - IList properties = DataMapper.GetEntityRefAssociations(thisType); - - - foreach (PropertyInfo prop in properties) - { - //example of entityRef:Order.Employee - AssociationAttribute associationInfo = prop.GetAttribute(); - Type otherTableType = prop.PropertyType; - IList otherPKs = DataMapper.GetPrimaryKeys(Mapping.GetTable(otherTableType)); - - if (otherPKs.Count > 1) - throw new NotSupportedException("Multiple keys object not supported yet."); - - var otherTable = GetTable(otherTableType); - - //ie:EmployeeTerritories.EmployeeID - - var thisForeignKeyProperty = thisType.GetProperty(associationInfo.ThisKey); - object thisForeignKeyValue = thisForeignKeyProperty.GetValue(entity, null); - - IEnumerable query = null; - if (thisForeignKeyValue != null) - { - ParameterExpression p = Expression.Parameter(otherTableType, "other"); - Expression predicate; - if (!(thisForeignKeyProperty.PropertyType.IsNullable())) - { - predicate = Expression.Equal(Expression.MakeMemberAccess(p, otherPKs.First()), - Expression.Constant(thisForeignKeyValue)); - } - else - { - var ValueProperty = thisForeignKeyProperty.PropertyType.GetProperty("Value"); - predicate = Expression.Equal(Expression.MakeMemberAccess(p, otherPKs.First()), - Expression.Constant(ValueProperty.GetValue(thisForeignKeyValue, null))); - } - - query = GetOtherTableQuery(predicate, p, otherTableType, otherTable) as IEnumerable; - //it would be interesting surround the above query with a .Take(1) expression for performance. - } - - - FieldInfo entityRefField = entity.GetType().GetField(associationInfo.Storage, BindingFlags.NonPublic | BindingFlags.Instance); - object entityRefValue = null; - if (query != null) - entityRefValue = Activator.CreateInstance(entityRefField.FieldType, query); - else - entityRefValue = Activator.CreateInstance(entityRefField.FieldType); - entityRefField.SetValue(entity, entityRefValue); - } - } + Type thisType = entity.GetType(); + IEnumerable associationList = Mapping.GetMetaType(entity.GetType()).Associations.Where(a => a.IsForeignKey); + foreach (MetaAssociation association in associationList) + { + //example of entityRef:Order.Employee + var memberData = association.ThisMember; + Type otherTableType = association.OtherType.Type; + ParameterExpression p = Expression.Parameter(otherTableType, "other"); + + var otherTable = GetTable(otherTableType); + + //ie:EmployeeTerritories.EmployeeID + var foreignKeys = memberData.Association.ThisKey; + BinaryExpression predicate = null; + var otherPKs = memberData.Association.OtherKey; + IEnumerator otherPKEnumerator = otherPKs.GetEnumerator(); + + if (otherPKs.Count != foreignKeys.Count) + throw new InvalidOperationException("Foreign keys don't match ThisKey"); + foreach (MetaDataMember key in foreignKeys) + { + otherPKEnumerator.MoveNext(); + + var thisForeignKeyProperty = (PropertyInfo)key.Member; + object thisForeignKeyValue = thisForeignKeyProperty.GetValue(entity, null); + + if (thisForeignKeyValue != null) + { + BinaryExpression keyPredicate; + if (!(thisForeignKeyProperty.PropertyType.IsNullable())) + { + keyPredicate = Expression.Equal(Expression.MakeMemberAccess(p, otherPKEnumerator.Current.Member), + Expression.Constant(thisForeignKeyValue)); + } + else + { + var ValueProperty = thisForeignKeyProperty.PropertyType.GetProperty("Value"); + keyPredicate = Expression.Equal(Expression.MakeMemberAccess(p, otherPKEnumerator.Current.Member), + Expression.Constant(ValueProperty.GetValue(thisForeignKeyValue, null))); + } + + if (predicate == null) + predicate = keyPredicate; + else + predicate = Expression.And(predicate, keyPredicate); + } + } + IEnumerable query = null; + if (predicate != null) + { + query = GetOtherTableQuery(predicate, p, otherTableType, otherTable) as IEnumerable; + //it would be interesting surround the above query with a .Take(1) expression for performance. + } + + + FieldInfo entityRefField = (FieldInfo)memberData.StorageMember; + object entityRefValue = null; + if (query != null) + entityRefValue = Activator.CreateInstance(entityRefField.FieldType, query); + else + entityRefValue = Activator.CreateInstance(entityRefField.FieldType); + entityRefField.SetValue(entity, entityRefValue); + } + } /// /// This method is executed when the entity is being registered. Each EntitySet property has a internal query that can be set using the EntitySet.SetSource method. @@ -696,53 +724,60 @@ namespace DbLinq.Data.Linq // BUG: This is ignoring External Mappings from XmlMappingSource. - IList properties = DataMapper.GetEntitySetAssociations(entity.GetType()); - - if (properties.Any()) { - IList thisPKs = DataMapper.GetPrimaryKeys(Mapping.GetTable(entity.GetType())); - - if (thisPKs.Count > 1) - throw new NotSupportedException("Multiple keys object not supported yet."); - - object primaryKeyValue = (thisPKs.First() as PropertyInfo).GetValue(entity, null); - + IEnumerable associationList = Mapping.GetMetaType(entity.GetType()).Associations.Where(a => !a.IsForeignKey); - foreach (PropertyInfo prop in properties) + if (associationList.Any()) + { + foreach (MetaAssociation association in associationList) { - //example of entitySet: Employee.EmployeeTerritories - var associationInfo = prop.GetAttribute(); - Type otherTableType = prop.PropertyType.GetGenericArguments().First(); + //example of entitySet: Employee.EmployeeTerritories + var memberData = association.ThisMember; + Type otherTableType = association.OtherType.Type; + ParameterExpression p = Expression.Parameter(otherTableType, "other"); //other table:EmployeeTerritories var otherTable = GetTable(otherTableType); - //other table member:EmployeeTerritories.EmployeeID - var otherTableMember = otherTableType.GetProperty(associationInfo.OtherKey); - - ParameterExpression p = Expression.Parameter(otherTableType, "other"); - Expression predicate; - if (!(otherTableMember.PropertyType.IsNullable())) - { - predicate = Expression.Equal(Expression.MakeMemberAccess(p, otherTableMember), - Expression.Constant(primaryKeyValue)); - } - else + var otherKeys = memberData.Association.OtherKey; + var thisKeys = memberData.Association.ThisKey; + if (otherKeys.Count != thisKeys.Count) + throw new InvalidOperationException("This keys don't match OtherKey"); + BinaryExpression predicate = null; + IEnumerator thisKeyEnumerator = thisKeys.GetEnumerator(); + foreach (MetaDataMember otherKey in otherKeys) { - var ValueProperty = otherTableMember.PropertyType.GetProperty("Value"); - predicate = Expression.Equal(Expression.MakeMemberAccess( - Expression.MakeMemberAccess(p, otherTableMember), - ValueProperty), - Expression.Constant(primaryKeyValue)); + thisKeyEnumerator.MoveNext(); + //other table member:EmployeeTerritories.EmployeeID + var otherTableMember = (PropertyInfo)otherKey.Member; + + BinaryExpression keyPredicate; + if (!(otherTableMember.PropertyType.IsNullable())) + { + keyPredicate = Expression.Equal(Expression.MakeMemberAccess(p, otherTableMember), + Expression.Constant(thisKeyEnumerator.Current.Member.GetMemberValue(entity))); + } + else + { + var ValueProperty = otherTableMember.PropertyType.GetProperty("Value"); + keyPredicate = Expression.Equal(Expression.MakeMemberAccess( + Expression.MakeMemberAccess(p, otherTableMember), + ValueProperty), + Expression.Constant(thisKeyEnumerator.Current.Member.GetMemberValue(entity))); + } + if (predicate == null) + predicate = keyPredicate; + else + predicate = Expression.And(predicate, keyPredicate); } var query = GetOtherTableQuery(predicate, p, otherTableType, otherTable); - var entitySetValue = prop.GetValue(entity, null); + var entitySetValue = memberData.Member.GetMemberValue(entity); if (entitySetValue == null) { - entitySetValue = Activator.CreateInstance(prop.PropertyType); - prop.SetValue(entity, entitySetValue, null); + entitySetValue = Activator.CreateInstance(memberData.Member.GetMemberType()); + memberData.Member.SetMemberValue(entity, entitySetValue); } var hasLoadedOrAssignedValues = entitySetValue.GetType().GetProperty("HasLoadedOrAssignedValues"); @@ -802,7 +837,7 @@ namespace DbLinq.Data.Linq var identityReader = _GetIdentityReader(entity.GetType()); var identityKey = identityReader.GetIdentityKey(entity); // if we have no key, we can not watch - if (identityKey == null) + if (identityKey == null || identityKey.Keys.Count == 0) return; // register entity AllTrackedEntities.RegisterToWatch(entity, identityKey); @@ -946,11 +981,11 @@ namespace DbLinq.Data.Linq /// Gets or sets the load options /// [DbLinqToDo] - public DataLoadOptions LoadOptions - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } + public DataLoadOptions LoadOptions + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } public DbTransaction Transaction { get; set; } @@ -1097,6 +1132,16 @@ namespace DbLinq.Data.Linq [DbLinqToDo] public DbCommand GetCommand(IQueryable query) + { + DbCommand dbCommand = GetIDbCommand(query) as DbCommand; + if (dbCommand == null) + throw new InvalidOperationException(); + + return dbCommand; + } + + [DBLinqExtended] + public IDbCommand GetIDbCommand(IQueryable query) { if (query == null) throw new ArgumentNullException("query"); @@ -1105,11 +1150,29 @@ namespace DbLinq.Data.Linq if (qp == null) throw new InvalidOperationException(); - IDbCommand dbCommand = qp.GetQuery(null).GetCommand().Command; - if (!(dbCommand is DbCommand)) - throw new InvalidOperationException(); + if (qp.ExpressionChain.Expressions.Count == 0) + qp.ExpressionChain.Expressions.Add(CreateDefaultQuery(query)); + + return qp.GetQuery(null).GetCommand().Command; + } + + private Expression CreateDefaultQuery(IQueryable query) + { + // Manually create the expression tree for: IQueryable.Select(e => e) + var identityParameter = Expression.Parameter(query.ElementType, "e"); + var identityBody = Expression.Lambda( + typeof(Func<,>).MakeGenericType(query.ElementType, query.ElementType), + identityParameter, + new[] { identityParameter } + ); - return (DbCommand)dbCommand; + return Expression.Call( + typeof(Queryable), + "Select", + new[] { query.ElementType, query.ElementType }, + query.Expression, + Expression.Quote(identityBody) + ); } [DbLinqToDo] diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataLoadOptions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataLoadOptions.cs index ae13027db72..280863c4660 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataLoadOptions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/DataLoadOptions.cs @@ -41,15 +41,11 @@ using DbLinq.Util; /// public sealed class DataLoadOptions { - /// - /// There are the associations to load with a type - /// - private readonly IList eagerLoading = new List(); - /// /// Criteria to restrict associations /// - private readonly IDictionary criteria = new Dictionary(); + private readonly Dictionary eagerLoading = new Dictionary(); + private readonly Dictionary criteria = new Dictionary(); /// /// Filters objects retrieved for a particular relationship. @@ -67,7 +63,15 @@ using DbLinq.Util; /// public void AssociateWith(LambdaExpression expression) { - throw new NotImplementedException(); + // TODO: ensure we have an EntitySet<> + var memberInfo = ReflectionUtility.GetMemberCallInfo(expression); + if (memberInfo == null) + throw new InvalidOperationException("The argument expression must be a property access or a field access where the target object is the parameter"); + if (!criteria.ContainsKey(memberInfo)) + { + VerifyMemberAccessCycles(memberInfo); + criteria.Add(memberInfo, expression); + } } /// @@ -75,11 +79,9 @@ using DbLinq.Util; /// /// /// - internal LambdaExpression GetAssociationCriteria(MemberInfo memberInfo) + public bool GetAssociationCriteria(MemberInfo memberInfo, out LambdaExpression associationCriteria) { - LambdaExpression associationCriteria; - criteria.TryGetValue(memberInfo, out associationCriteria); - return associationCriteria; + return criteria.TryGetValue(memberInfo, out associationCriteria); } /// @@ -102,10 +104,10 @@ using DbLinq.Util; var memberInfo = ReflectionUtility.GetMemberInfo(expression); if (memberInfo == null) throw new InvalidOperationException("The argument expression must be a property access or a field access where the target object is the parameter"); - if (!eagerLoading.Contains(memberInfo)) + if (!eagerLoading.ContainsKey(memberInfo)) { VerifyMemberAccessCycles(memberInfo); - eagerLoading.Add(memberInfo); + eagerLoading.Add(memberInfo, true); } } @@ -113,9 +115,9 @@ using DbLinq.Util; { var mt = GetMemberEntityType (member); var d = member.DeclaringType; - foreach (var m in eagerLoading) + foreach (KeyValuePair m in eagerLoading) { - if (m.DeclaringType == mt && GetMemberEntityType (m) == d) + if (m.Key.DeclaringType == mt && GetMemberEntityType (m.Key) == d) throw new InvalidOperationException("Illegal cycles are detected in the argument expression among other eager-loading expressions"); } } @@ -138,9 +140,9 @@ using DbLinq.Util; /// /// /// True on eager (immediate) logging - internal bool IsImmediate(MemberInfo memberInfo) + public bool IsImmediate(MemberInfo memberInfo) { - return eagerLoading.Contains(memberInfo); + return eagerLoading.ContainsKey(memberInfo); } } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/IDatabaseContext.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/IDatabaseContext.cs index 269ea126e77..97fc4ec1768 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/IDatabaseContext.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/IDatabaseContext.cs @@ -34,9 +34,7 @@ namespace DbLinq.Data.Linq.Database /// - connection /// - creates or manage a transaction /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface IDatabaseContext : IDisposable diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/IDatabaseTransaction.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/IDatabaseTransaction.cs index 5b5597fd5b2..464e2347095 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/IDatabaseTransaction.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/IDatabaseTransaction.cs @@ -32,9 +32,7 @@ namespace DbLinq.Data.Linq.Database /// /// Transaction block. /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface IDatabaseTransaction : IDisposable diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/IDbLinqCommand.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/IDbLinqCommand.cs deleted file mode 100644 index a92f4daf33e..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/IDbLinqCommand.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Data; - -namespace DbLinq.Data.Linq.Database -{ -#if MONO_STRICT - internal -#else - public -#endif - interface IDbLinqCommand : IDisposable - { - IDbCommand Command { get; } - /// - /// Commits the current transaction. - /// throws NRE if _transaction is null. Behavior is intentional. - /// - void Commit(); - } -} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/ITransactionalCommand.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/ITransactionalCommand.cs index 691e2164136..6741a876484 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/ITransactionalCommand.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/ITransactionalCommand.cs @@ -32,12 +32,10 @@ namespace DbLinq.Data.Linq.Database /// /// Transaction-aware command /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - interface ITransactionalCommand : IDisposable + interface ITransactionalCommand : IDisposable { /// /// Gets the command. diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/Implementation/DbLinqCommand.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/Implementation/DbLinqCommand.cs deleted file mode 100644 index d1b76b0f9b6..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/Implementation/DbLinqCommand.cs +++ /dev/null @@ -1,86 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion -using System; -using System.Data; - -#if MONO_STRICT -using System.Data.Linq.Sql; -using System.Data.Linq; -#else -using DbLinq.Data.Linq.Sql; -#endif - -namespace DbLinq.Data.Linq.Database.Implementation -{ - public class DbLinqCommand : IDbLinqCommand - { - private IDisposable _connection; - private IDatabaseTransaction _transaction; - private readonly IDbCommand cmd; - public IDbCommand Command - { - get - { - return cmd; - } - } - - - public virtual void Dispose() - { - Command.Dispose(); - if (_transaction != null) - _transaction.Dispose(); - _connection.Dispose(); - } - - /// - /// Commits the current transaction. - /// throws NRE if _transaction is null. Behavior is intentional. - /// - public void Commit() - { - // TODO: do not commit if participating in a higher transaction - _transaction.Commit(); - } - - public DbLinqCommand(string commandText, bool createTransaction, DataContext dataContext) - { - // TODO: check if all this stuff is necessary - // the OpenConnection() checks that the connection is already open - // TODO: see if we can move this here (in theory the final DataContext shouldn't use) - _connection = dataContext.DatabaseContext.OpenConnection(); - // the transaction is optional - if (createTransaction) - _transaction = dataContext.DatabaseContext.Transaction(); - cmd = dataContext.DatabaseContext.CreateCommand(); - Command.CommandText = commandText; - if (createTransaction) - Command.Transaction = _transaction.Transaction; - } - - } -} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/Implementation/TransactionalCommand.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/Implementation/TransactionalCommand.cs index 986f337af92..80aef599271 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/Implementation/TransactionalCommand.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Database/Implementation/TransactionalCommand.cs @@ -28,12 +28,11 @@ using System; using System.Data; #if MONO_STRICT -using System.Data.Linq.Sql; using System.Data.Linq; -#else -using DbLinq.Data.Linq.Sql; #endif +using DbLinq.Data.Linq.Sql; + namespace DbLinq.Data.Linq.Database.Implementation { /// diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/EntityList.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/EntityList.cs deleted file mode 100644 index c6a8e85ebc8..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/EntityList.cs +++ /dev/null @@ -1,194 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion - -using System; -using System.Collections.Generic; -using System.Linq; - -#if MONO_STRICT -namespace System.Data.Linq -#else -namespace DbLinq.Data.Linq -#endif -{ - /// - /// The class helps keeping a list of entities, sorted by type, then by list (of same type) - /// - internal class EntityList - { - private class EntityByType - { - public readonly object Entity; - public readonly Type Type; - - public EntityByType(object entity, Type type) - { - Entity = entity; - Type = type; - } - } - - private readonly List _entitiesByType = new List(); - private readonly object _lock = new object(); - - /// - /// Enumerates all entites - /// - /// - public IEnumerable EnumerateAll() - { - lock (_lock) - { - // do you love linq's extension methods? I do. - return _entitiesByType.Select(e => e.Entity); - } - } - - /// - /// Enumerates all items with the same type - /// - /// - /// - public IEnumerable Enumerate() - { - lock (_lock) - { - // you too, have fun with linq - return from e in _entitiesByType - where e.Type == typeof(T) - select (T)e.Entity; - } - } - - /// - /// Adds an item - /// - /// - /// - public void Add(T t) - { - Add(t, typeof(T)); - } - - /// - /// Adds an entity of a given type - /// - /// - /// - public void Add(object entity, Type asType) - { - lock (_lock) - { - if (!_entitiesByType.Any(e => e.Entity == entity)) - _entitiesByType.Add(new EntityByType(entity, asType)); - } - } - - /// - /// Removes an item (and don't care if missing) - /// - /// - /// - public void Remove(T t) - { - Remove(t, typeof(T)); - } - - /// - /// Removes an entity, declared as type - /// This method is O(n), use with caution - /// - /// - /// - public void Remove(object e, Type asType) - { - lock (_lock) - { - for (int entityIndex = 0; entityIndex < _entitiesByType.Count; entityIndex++) - { - if (_entitiesByType[entityIndex].Entity == e) - { - _entitiesByType.RemoveAt(entityIndex); - break; - } - } - } - } - - /// - /// Remove items - /// - /// - /// - public void RemoveRange(IEnumerable ts) - { - lock (_lock) - { - foreach (var t in ts) - Remove(t); - } - } - - /// - /// Returns the number of items given a type - /// - /// - /// - public int Count() - { - lock (_lock) - { - return _entitiesByType.Count(e => e.Type == typeof(T)); - } - } - - /// - /// Determines if the given entity is registered - /// - /// - /// - /// - public bool Contains(T t) - { - return Contains(t, typeof(T)); - } - - /// - /// Returns true if the entity is already present in list - /// - /// - /// - /// - public bool Contains(object entity, Type asType) - { - lock (_lock) - { - return _entitiesByType.Any(e => e.Entity == entity); - } - } - - } -} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/EntitySet.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/EntitySet.cs index 338d897517f..22dbed694d5 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/EntitySet.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/EntitySet.cs @@ -47,6 +47,7 @@ namespace DbLinq.Data.Linq private IEnumerable deferredSource; private bool deferred; + private bool assignedValues; private List source; private List Source { @@ -61,6 +62,33 @@ namespace DbLinq.Data.Linq } + /// + /// Gets or sets a value indicating whether this instance has loaded or assigned values. + /// + /// + /// true if this instance has loaded or assigned values; otherwise, false. + /// + public bool HasAssignedValues + { + get { return assignedValues; } + } + + public bool HasLoadedValues + { + get { return source != null; } + } + + /// + /// Gets a value indicating whether this instance has loaded or assigned values. + /// + /// + /// true if this instance has loaded or assigned values; otherwise, false. + /// + public bool HasLoadedOrAssignedValues + { + get { return HasLoadedValues || HasAssignedValues; } + } + /// /// Initializes a new instance of the class. /// @@ -115,10 +143,13 @@ namespace DbLinq.Data.Linq } /// - /// TODO: Add(row) + /// Adds a row /// public void Add(TEntity entity) { + if (entity == null) + throw new ArgumentNullException("entity"); + if (Source.Contains (entity)) return; Source.Add(entity); @@ -136,7 +167,9 @@ namespace DbLinq.Data.Linq IList IListSource.GetList() { - return Source; + //It seems that Microsoft is doing a similar thing in L2SQL, matter of fact, after doing a GetList().Add(new TEntity()), HasAssignedValues continues to be false + //This seems like a bug on their end, but we'll do the same for consistency + return this; } #region IList Members @@ -170,14 +203,15 @@ namespace DbLinq.Data.Linq } /// - /// Removes entity as specified index + /// Removes entity at specified index /// /// public void RemoveAt(int index) { - OnRemove(Source[index]); deferred = false; + var item = Source[index]; Source.RemoveAt(index); + OnRemove(item); ListChangedEventHandler handler = ListChanged; if (handler != null) handler(this, new ListChangedEventArgs(ListChangedType.ItemDeleted, index)); @@ -220,6 +254,7 @@ namespace DbLinq.Data.Linq { ListChangedEventHandler handler = ListChanged; deferred = false; + assignedValues = true; if (deferredSource != null && handler != null) { foreach (var item in Source) @@ -235,7 +270,7 @@ namespace DbLinq.Data.Linq /// /// The entity. /// - /// true if [contains] [the specified entity]; otherwise, false. + /// true if [contains] [the specified entity]; otherwise, false. /// [DbLinqToDo] public bool Contains(TEntity entity) @@ -285,15 +320,16 @@ namespace DbLinq.Data.Linq /// public bool Remove(TEntity entity) { - OnRemove(entity); - deferred = false; int i = Source.IndexOf(entity); if(i < 0) - return false; + return false; + deferred = false; + Source.Remove(entity); + OnRemove(entity); ListChangedEventHandler handler = ListChanged; if (deferredSource != null && handler != null) handler(this, new ListChangedEventArgs(ListChangedType.ItemDeleted, i)); - return Source.Remove(entity); + return true; } #endregion @@ -401,7 +437,7 @@ namespace DbLinq.Data.Linq /// Gets a value indicating whether this instance is deferred. /// /// - /// true if this instance is deferred; otherwise, false. + /// true if this instance is deferred; otherwise, false. /// public bool IsDeferred { @@ -461,17 +497,6 @@ namespace DbLinq.Data.Linq var _ = Source; } - /// - /// Gets or sets a value indicating whether this instance has loaded or assigned values. - /// - /// - /// true if this instance has loaded or assigned values; otherwise, false. - /// - public bool HasLoadedOrAssignedValues - { - get { return source != null; } - } - /// /// Gets a new binding list. /// @@ -490,6 +515,7 @@ namespace DbLinq.Data.Linq /// The entity. private void OnAdd(TEntity entity) { + assignedValues = true; if (onAdd != null) onAdd(entity); } @@ -499,6 +525,7 @@ namespace DbLinq.Data.Linq /// The entity. private void OnRemove(TEntity entity) { + assignedValues = true; if (onRemove != null) onRemove(entity); } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/IEntityMap.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/IEntityMap.cs deleted file mode 100644 index c05168b6bd7..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/IEntityMap.cs +++ /dev/null @@ -1,58 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion - -#if MONO_STRICT -using System.Data.Linq.Identity; -#else -using DbLinq.Data.Linq.Identity; -#endif -using System.Collections.Generic; - -#if MONO_STRICT -namespace System.Data.Linq -#else -namespace DbLinq.Data.Linq -#endif -{ - /// - /// IEntityMap stores entities by key - /// - internal interface IEntityMap - { - IEnumerable Keys { get; } - /// - /// Accessor. Allows to get or set an entity, provided its key. - /// - /// - /// - object this[IdentityKey key] { get; set; } - /// - /// Removes an entity from cache, provided its key - /// - /// - void Remove(IdentityKey key); - } -} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/IMemberModificationHandler.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/IMemberModificationHandler.cs index ce450f595d9..4f1a3e75f45 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/IMemberModificationHandler.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/IMemberModificationHandler.cs @@ -28,11 +28,7 @@ using System.Collections.Generic; using System.Data.Linq.Mapping; using System.Reflection; -#if MONO_STRICT -namespace System.Data.Linq -#else namespace DbLinq.Data.Linq -#endif { /// /// Interface to watch modifications on registered entities diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/IVendorProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/IVendorProvider.cs index c5da0fb311a..06f05cdf103 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/IVendorProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/IVendorProvider.cs @@ -27,15 +27,9 @@ using System; using DbLinq.Vendor; -#if MONO_STRICT -namespace System.Data.Linq -#else namespace DbLinq.Data.Linq -#endif { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface IVendorProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityProvider.cs index 16a7ed2d8f4..8a897b78aa1 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityProvider.cs @@ -24,11 +24,7 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.Identity -#else namespace DbLinq.Data.Linq.Identity -#endif { /// /// This interface may be used by identities to provide a quick access to keys diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityReader.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityReader.cs index 2a1945bb479..6f993d7d0dd 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityReader.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityReader.cs @@ -24,18 +24,12 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.Identity -#else namespace DbLinq.Data.Linq.Identity -#endif { /// /// Allows to read identity from entity /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface IIdentityReader diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityReaderFactory.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityReaderFactory.cs index 36dec4f3e21..0b0b2a83818 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityReaderFactory.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IIdentityReaderFactory.cs @@ -27,10 +27,12 @@ using System; #if MONO_STRICT -namespace System.Data.Linq.Identity +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Identity +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Identity { /// /// Provides a factory that creates IIdentityReaders diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IdentityKey.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IdentityKey.cs index 1402a6e8018..46d7c4061e7 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IdentityKey.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/IdentityKey.cs @@ -27,11 +27,7 @@ using System; using System.Collections.Generic; -#if MONO_STRICT -namespace System.Data.Linq.Identity -#else namespace DbLinq.Data.Linq.Identity -#endif { /// /// Identifies an object in a unique way (think Primay Keys in a database table) @@ -42,9 +38,7 @@ namespace DbLinq.Data.Linq.Identity /// Example: to store Product with ProductID=1, we use the following IdentityKey: /// IdentityKey{Type=Product, Keys={1}} /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif sealed class IdentityKey diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityProviderReader.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityProviderReader.cs index da00f2952c8..04bf050ebf4 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityProviderReader.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityProviderReader.cs @@ -24,17 +24,9 @@ // #endregion -#if MONO_STRICT -using System.Data.Linq.Identity; -#else using DbLinq.Data.Linq.Identity; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Identity.Implementation -#else namespace DbLinq.Data.Linq.Identity.Implementation -#endif { /// /// Returns an Identity from an IdentityKey self-provider (an entity implementing IIdentityProvider) diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityReader.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityReader.cs index f256a49ed93..fb11748d3a2 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityReader.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityReader.cs @@ -27,18 +27,16 @@ using System; using System.Reflection; using System.Collections.Generic; -#if MONO_STRICT -using System.Data.Linq.Identity; -#else using DbLinq.Data.Linq.Identity; -#endif using DbLinq.Util; #if MONO_STRICT -namespace System.Data.Linq.Identity.Implementation +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Identity.Implementation +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Identity.Implementation { /// /// IIdentityReader default implementation @@ -64,7 +62,8 @@ namespace DbLinq.Data.Linq.Identity.Implementation foreach (var keyMember in keyMembers) { var key = keyMember.GetMemberValue(entity); - keys.Add(key); + if(key != null) + keys.Add(key); } return new IdentityKey(type, keys); } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityReaderFactory.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityReaderFactory.cs index 67ab1f87e7a..628478df83d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityReaderFactory.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Identity/Implementation/IdentityReaderFactory.cs @@ -25,19 +25,16 @@ #endregion using System; -#if MONO_STRICT -using System.Data.Linq.Identity; -using System.Data.Linq.Identity.Implementation; -#else using DbLinq.Data.Linq.Identity; using DbLinq.Data.Linq.Identity.Implementation; -#endif #if MONO_STRICT -namespace System.Data.Linq.Identity.Implementation +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Identity.Implementation +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Identity.Implementation { /// /// IIdentityReaderFactory default implementation diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/DisabledEntityTracker.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/DisabledEntityTracker.cs index 32d1bc6e2c8..7e276e62f40 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/DisabledEntityTracker.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/DisabledEntityTracker.cs @@ -28,17 +28,9 @@ using System; using System.Collections.Generic; using System.Linq; -#if MONO_STRICT -using System.Data.Linq.Identity; -#else using DbLinq.Data.Linq.Identity; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Implementation -#else namespace DbLinq.Data.Linq.Implementation -#endif { /// /// List of entities, with their corresponding state (to insert, to watch, to delete) diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityMap.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityMap.cs deleted file mode 100644 index a3e5d95977f..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityMap.cs +++ /dev/null @@ -1,89 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -#if MONO_STRICT -using System.Data.Linq.Identity; -#else -using DbLinq.Data.Linq.Identity; -#endif - -#if MONO_STRICT -namespace System.Data.Linq.Implementation -#else -namespace DbLinq.Data.Linq.Implementation -#endif -{ - /// - /// this is the 'live object cache' - /// - internal class EntityMap : IEntityMap - { - private readonly IDictionary entities = new Dictionary(); - - public IEnumerable Keys - { - get - { - lock (entities) - return entities.Keys; - } - } - - /// - /// lookup or store an object in the 'live object cache'. - /// Example: - /// To store Product with ProductID=1, we use the following IdentityKey: - /// IdentityKey{Type=Product, Keys={1}} - /// - /// - /// - public object this[IdentityKey key] - { - get - { - object o; - lock (entities) - entities.TryGetValue(key, out o); - return o; - } - set - { - lock (entities) - entities[key] = value; - } - } - - public void Remove(IdentityKey key) - { - lock (entities) - entities.Remove(key); - } - } -} \ No newline at end of file diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityState.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityState.cs index b2dc330f530..450eaf4de14 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityState.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityState.cs @@ -24,11 +24,7 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.Implementation -#else namespace DbLinq.Data.Linq.Implementation -#endif { /// /// Represents entity state in data context diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityTrack.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityTrack.cs index 29651541b4a..f485ab9974e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityTrack.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityTrack.cs @@ -24,17 +24,9 @@ // #endregion -#if MONO_STRICT -using System.Data.Linq.Identity; -#else using DbLinq.Data.Linq.Identity; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Implementation -#else namespace DbLinq.Data.Linq.Implementation -#endif { /// /// Keeps track of a referenced entity diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityTracker.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityTracker.cs index d39ebeb1497..c5e80cd3b34 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityTracker.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/EntityTracker.cs @@ -28,17 +28,9 @@ using System; using System.Collections.Generic; using System.Linq; -#if MONO_STRICT -using System.Data.Linq.Identity; -#else using DbLinq.Data.Linq.Identity; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Implementation -#else namespace DbLinq.Data.Linq.Implementation -#endif { /// /// List of entities, with their corresponding state (to insert, to watch, to delete) @@ -133,6 +125,9 @@ namespace DbLinq.Data.Linq.Implementation var entityTrack = FindByReference(entity); if (entityTrack == null) { + entityTrack = FindByIdentity(identityKey); + if (entityTrack != null) + throw new System.Data.Linq.DuplicateKeyException(entity); entityTrack = new EntityTrack(entity, EntityState.ToWatch) { IdentityKey = identityKey }; entities.Add(entityTrack); entitiesByKey[identityKey] = entityTrack; diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/IEntityTracker.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/IEntityTracker.cs index 0ae07dec1b1..715559c00b1 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/IEntityTracker.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/IEntityTracker.cs @@ -28,17 +28,9 @@ using System; using System.Collections.Generic; using System.Linq; -#if MONO_STRICT -using System.Data.Linq.Identity; -#else using DbLinq.Data.Linq.Identity; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Implementation -#else namespace DbLinq.Data.Linq.Implementation -#endif { /// /// Interface of Entity Trackers diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/MemberModificationHandler.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/MemberModificationHandler.cs index 9e41accbc9f..c5ecac98ca1 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/MemberModificationHandler.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/MemberModificationHandler.cs @@ -30,11 +30,7 @@ using System.Data.Linq.Mapping; using System.Reflection; using DbLinq.Util; -#if MONO_STRICT -namespace System.Data.Linq.Implementation -#else namespace DbLinq.Data.Linq.Implementation -#endif { /// /// ModificationHandler class handles entities in two ways: diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/QueryProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/QueryProvider.cs index 9f41e50b562..e2dc0abba2f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/QueryProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/QueryProvider.cs @@ -29,17 +29,16 @@ using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar; -#else using DbLinq.Data.Linq.Sugar; -#endif +using DbLinq.Util; #if MONO_STRICT -namespace System.Data.Linq.Implementation +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Implementation +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Implementation { /// /// QueryProvider is used by both DataContext and Table @@ -147,7 +146,10 @@ namespace DbLinq.Data.Linq.Implementation /// public IQueryable CreateQuery(Expression expression) { - return new QueryProvider(TableType, _dataContext, ExpressionChain, expression); + Profiler.At("START QueryProvider.CreateQuery<{0}>({1})", typeof(TElement).Name, expression.ToString()); + var query = new QueryProvider(TableType, _dataContext, ExpressionChain, expression); + Profiler.At("END QueryProvider.CreateQuery<{0}>(...)", typeof(TElement).Name); + return query; } /// @@ -181,8 +183,11 @@ namespace DbLinq.Data.Linq.Implementation /// public TResult Execute(Expression expression) { + Profiler.At("START QueryProvider.Execute<{0}>(): Executing expression...", typeof(TResult).Name); var query = GetQuery(expression); - return _dataContext.QueryRunner.SelectScalar(query); + var result = _dataContext.QueryRunner.SelectScalar(query); + Profiler.At("END QueryProvider.Execute<{0}>(): Executing expression...", typeof(TResult).Name); + return result; } /// @@ -201,8 +206,11 @@ namespace DbLinq.Data.Linq.Implementation /// public IEnumerator GetEnumerator() { + Profiler.At("START QueryProvider.GetEnumerator<{0}>(): Executing expression...", typeof(T).Name); var query = GetQuery(null); - return _dataContext.QueryRunner.Select(query).GetEnumerator(); + var enumerator = _dataContext.QueryRunner.Select(query).GetEnumerator(); + Profiler.At("END QueryProvider.GetEnumerator<{0}>(): Executing expression...", typeof(T).Name); + return enumerator; } /// diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/VendorProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/VendorProvider.cs index b9b990eff53..5d195e82c52 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/VendorProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Implementation/VendorProvider.cs @@ -31,18 +31,12 @@ using System.Reflection; using DbLinq.Util; using DbLinq.Vendor; -#if MONO_STRICT -namespace System.Data.Linq.Implementation -#else namespace DbLinq.Data.Linq.Implementation -#endif { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - class VendorProvider : IVendorProvider + class VendorProvider : IVendorProvider { private readonly IDictionary _vendorByType = new Dictionary(); diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributeMappingSource.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributeMappingSource.cs index d5aaa5d5848..6b72becb385 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributeMappingSource.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributeMappingSource.cs @@ -1,7 +1,7 @@ #region MIT license // -// MIT license -// +// MIT license +// // Copyright (c) 2007-2008 Jiri Moudry // // Permission is hereby granted, free of charge, to any person obtaining a copy @@ -27,6 +27,8 @@ using System; using System.Data.Linq.Mapping; +using DbLinq.Data.Linq.Mapping; + #if MONO_STRICT namespace System.Data.Linq.Mapping #else diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedAbstractMetaDataMember.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedAbstractMetaDataMember.cs index be5b00e6aa0..70739b1d1ce 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedAbstractMetaDataMember.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedAbstractMetaDataMember.cs @@ -29,11 +29,7 @@ using System.Data.Linq.Mapping; using System.Reflection; using DbLinq.Util; -#if MONO_STRICT -namespace System.Data.Linq.Mapping -#else namespace DbLinq.Data.Linq.Mapping -#endif { internal abstract class AttributedAbstractMetaDataMember : MetaDataMember { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedAssociationMetaDataMember.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedAssociationMetaDataMember.cs index 54f9baa779a..1d7b152c4d0 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedAssociationMetaDataMember.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedAssociationMetaDataMember.cs @@ -29,11 +29,7 @@ using System.Data.Linq.Mapping; using System.Reflection; using DbLinq.Util; -#if MONO_STRICT -namespace System.Data.Linq.Mapping -#else namespace DbLinq.Data.Linq.Mapping -#endif { internal class AttributedAssociationMetaDataMember : AttributedAbstractMetaDataMember { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedColumnMetaDataMember.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedColumnMetaDataMember.cs index 44b42c1146b..773a286f4e7 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedColumnMetaDataMember.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedColumnMetaDataMember.cs @@ -29,11 +29,7 @@ using System.Diagnostics; using System.Reflection; using DbLinq.Util; -#if MONO_STRICT -namespace System.Data.Linq.Mapping -#else namespace DbLinq.Data.Linq.Mapping -#endif { [DebuggerDisplay("MetaDataMember for {MappedName}")] internal class AttributedColumnMetaDataMember : AttributedAbstractMetaDataMember diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaAssociation.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaAssociation.cs index 239b5f193d2..289ad4fcd7f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaAssociation.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaAssociation.cs @@ -32,50 +32,40 @@ using System.Reflection; using DbLinq.Util; using System.Collections.Generic; -#if MONO_STRICT -namespace System.Data.Linq.Mapping -#else namespace DbLinq.Data.Linq.Mapping -#endif { internal class AttributedMetaAssociation : MetaAssociation { //Seperator used for key lists private static readonly char[] STRING_SEPERATOR = new[] { ',' }; + private static string AttributeNameNullCheck (AssociationAttribute attribute) + { + if ( attribute == null ) + return null; + else + return attribute.Name; + } + public AttributedMetaAssociation(MemberInfo member, AssociationAttribute attribute, MetaDataMember metaDataMember) { _memberInfo = member; _associationAttribute = attribute; _thisMember = metaDataMember; - _otherMember = metaDataMember; // see https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=376669 - - SetupRelationship(); + // The bug described here: + // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=376669 + // says that under certain conditions, there's a bug where _otherMember == _thisMember + // Not only is there no point in reproducing a MS bug, it's not as simple as simply setting _otherMember = metaDataMember + Type otherType = _memberInfo.GetFirstInnerReturnType(); + string associationName = member.GetAttribute().Name; + AttributedMetaType ownedMetaType = metaDataMember.DeclaringType.Model.GetMetaType(otherType) as AttributedMetaType; + + if ( ownedMetaType == null ) + throw new InvalidOperationException("Key in referenced table is of a different SQL MetaData provider"); + + _otherMember = ownedMetaType.AssociationsLookup[otherType.GetMembers().Where(m => (AttributeNameNullCheck(m.GetAttribute()) == associationName) && (m != member)).Single()]; } - /// - /// This function sets up the relationship information based on the attribute . - /// - private void SetupRelationship() - { - //Get the association target type - Type targetType = _memberInfo.GetFirstInnerReturnType(); - - var metaModel = ThisMember.DeclaringType.Model as AttributedMetaModel; - if (metaModel == null) - { - throw new InvalidOperationException("Internal Error: MetaModel is not a AttributedMetaModel"); - } - - MetaTable otherTable = metaModel.GetTable(targetType); - - //Setup "this key" - _thisKey = GetKeys(_associationAttribute.ThisKey, ThisMember.DeclaringType); - - //Setup other key - _otherKeys = GetKeys(_associationAttribute.OtherKey, otherTable.RowType); - } - /// /// Returns a list of keys from the given meta type based on the key list string. /// @@ -157,7 +147,19 @@ namespace DbLinq.Data.Linq.Mapping private ReadOnlyCollection _otherKeys; public override ReadOnlyCollection OtherKey { - get { return _otherKeys; } + get { + if (_otherKeys == null) + { + //Get the association target type + var targetType = _memberInfo.GetFirstInnerReturnType(); + + var otherTable = ThisMember.DeclaringType.Model.GetTable(targetType); + + //Setup other key + _otherKeys = GetKeys(_associationAttribute.OtherKey, otherTable.RowType); + } + return _otherKeys; + } } public override bool OtherKeyIsPrimaryKey @@ -187,7 +189,11 @@ namespace DbLinq.Data.Linq.Mapping private ReadOnlyCollection _thisKey; public override ReadOnlyCollection ThisKey { - get { return _thisKey; } + get { + if (_thisKey == null) + _thisKey = GetKeys(_associationAttribute.ThisKey, ThisMember.DeclaringType); + return _thisKey; + } } public override bool ThisKeyIsPrimaryKey diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaFunction.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaFunction.cs index 193476375f4..efa2e75bf31 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaFunction.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaFunction.cs @@ -29,11 +29,7 @@ using System.Collections.ObjectModel; using System.Data.Linq.Mapping; using System.Reflection; -#if MONO_STRICT -namespace System.Data.Linq.Mapping -#else namespace DbLinq.Data.Linq.Mapping -#endif { internal class AttributedMetaFunction : MetaFunction { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaModel.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaModel.cs index 84ad386f0f4..d2cc9beb551 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaModel.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaModel.cs @@ -28,28 +28,23 @@ using System; using System.Collections.Generic; using System.Data.Linq.Mapping; using System.Diagnostics; +using System.Linq; using System.Reflection; #if MONO_STRICT using System.Data.Linq; -using DbLinq.Util; - #else using DbLinq.Data.Linq; +#endif + using DbLinq.Data.Linq.Mapping; using DbLinq.Util; -#endif - //Change notes: //removed virtual init call from constructor //renamed member variables to be better distinguishable from local variables -#if MONO_STRICT -namespace System.Data.Linq.Mapping -#else namespace DbLinq.Data.Linq.Mapping -#endif { /// /// This class is a stateless attribute meta model (it does not depend on any provider) @@ -93,7 +88,11 @@ namespace DbLinq.Data.Linq.Mapping /// public override string DatabaseName { - get { return _DatabaseName; } + get { + if (_DatabaseName == null) + DiscoverDatabaseName(); + return _DatabaseName; + } } @@ -104,12 +103,8 @@ namespace DbLinq.Data.Linq.Mapping } //This function will try to add unknown table types - //TODO: locking for multithreaded access, since it is not only used during init private IDictionary _Tables = new Dictionary(); - private IDictionary _metaFunctions; - - /// /// Initializes a new instance of the class. /// @@ -119,36 +114,6 @@ namespace DbLinq.Data.Linq.Mapping { _ContextType = contextType; _MappingSource = mappingSource; - - DiscoverDatabaseName(); - - FindTables(); - - //Load looks a bit useles since it is only called here - Load(); //TODO refactor this method - } - - private void Load() - { - // stored procedures - _metaFunctions = new Dictionary(); - var functionAttributes = GetFunctionsAttributes(); - foreach (var functionPair in functionAttributes) - { - _metaFunctions[functionPair.Key] = new AttributedMetaFunction(functionPair.Key, functionPair.Value); - } - } - - private IDictionary GetFunctionsAttributes() - { - var functionAttributes = new Dictionary(); - foreach (var methodInfo in _ContextType.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)) - { - var function = ReflectionExtensions.GetAttribute(methodInfo); - if (function != null) - functionAttributes[methodInfo] = function; - } - return functionAttributes; } /// @@ -157,9 +122,7 @@ namespace DbLinq.Data.Linq.Mapping /// The method info for which the should be returned. public override MetaFunction GetFunction(MethodInfo method) { - MetaFunction metaFunction; - _metaFunctions.TryGetValue(method, out metaFunction); - return metaFunction; + return GetFunctions().SingleOrDefault(m => m.Method == method); } /// @@ -167,7 +130,13 @@ namespace DbLinq.Data.Linq.Mapping /// public override IEnumerable GetFunctions() { - return _metaFunctions.Values; + const BindingFlags scope = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance; + foreach (var methodInfo in _ContextType.GetMethods(scope)) + { + var function = methodInfo.GetAttribute(); + if (function != null) + yield return new AttributedMetaFunction(methodInfo, function); + } } public override MetaType GetMetaType(Type type) @@ -193,17 +162,53 @@ namespace DbLinq.Data.Linq.Mapping { return metaTable; } - - return AddTableType(tableType); + return GetTables().FirstOrDefault(t => t.RowType.Type == tableType) + ?? AddTableType(tableType); } /// /// Returns an enumeration of all mapped tables. /// + //Discover all the tables used with this context, used for the GetTable/GetTables function + //Behaviour of GetTables in the Framework: STRANGE + //If the DataContext was a strong typed one (derived with fields for the tables), + //it returns a list of MetaTables for all this tables. + //But if you call GetTable with an additional table - the table doesn't get added to this list. + //If you use a vanilla DataContext the list is empty at the beginning (ok no surprise here), + //if you call GetTable here the table is added to the list. + // + //If you add to properties with the same T of Table only the first gets into the list. public override IEnumerable GetTables() { - return _Tables.Values; - } + const BindingFlags scope = BindingFlags.GetField | + BindingFlags.GetProperty | BindingFlags.Static | + BindingFlags.Instance | BindingFlags.NonPublic | + BindingFlags.Public; + var seen = new HashSet(); + foreach (var info in _ContextType.GetMembers(scope)) + { + // Only look for Fields & Properties. + if (info.MemberType != MemberTypes.Field && info.MemberType != MemberTypes.Property) + continue; + Type memberType = info.GetMemberType(); + + if (memberType == null || !memberType.IsGenericType || + memberType.GetGenericTypeDefinition() != typeof(Table<>)) + continue; + var tableType = memberType.GetGenericArguments()[0]; + if (tableType.IsGenericParameter) + continue; + if (seen.Contains(tableType)) + continue; + seen.Add(tableType); + + MetaTable metaTable; + if (_Tables.TryGetValue(tableType, out metaTable)) + yield return metaTable; + else + yield return AddTableType(tableType); + } + } /// /// Tries to discover the name of the database. @@ -222,58 +227,6 @@ namespace DbLinq.Data.Linq.Mapping } } - //Discover all the tables used with this context, used for the GetTable/GetTables function - //Behaviour of GetTables in the Framework: STRANGE - //If the DataContext was a strong typed one (derived with fields for the tables), - //it returns a list of MetaTables for all this tables. - //But if you call GetTable with an additional table - the table doesn't get added to this list. - //If you use a vanilla DataContext the list is empty at the beginning (ok no surprise here), - //if you call GetTable here the table is added to the list. - // - //If you add to properties with the same T of Table only the first gets into the list. - private void FindTables() - { - MemberInfo[] memberInfos = _ContextType.GetMembers(BindingFlags.GetField - | BindingFlags.GetProperty | BindingFlags.Static | BindingFlags.Instance - | BindingFlags.NonPublic | BindingFlags.Public); - - //foreach (var info in memberInfos) - for (int i = 0; i < memberInfos.Length; ++i ) - { - var info = memberInfos[i]; - - Type memberType = info.GetMemberType(); - - if (memberType == null) - { - continue; - } - - //Ok first possible problem here - there seems to be the .net ITable/Table and the local one - //Same goes for the attribute types - //Any reason for that? - //looking for a table generic - if (memberType.IsGenericType) - { - if (memberType.GetGenericTypeDefinition() != typeof(Table<>)) - { - continue; - } - - Type argumentType = memberType.GetGenericArguments()[0]; - - //If the argument type is a generic parameter we are not interested - //Most likly it is the GetTable function - if (argumentType.IsGenericParameter) - { - continue; - } - - AddTableType(argumentType); - } - } - } - /// /// Adds the table of the given type to the mappings. /// @@ -300,13 +253,7 @@ namespace DbLinq.Data.Linq.Mapping metaType.SetMetaTable(metaTable); _Tables[tableType] = metaTable; - //After that we are ready to setup table associations, need to to this late - //because of possible circular dependencies - //In worst case if SetupAssociations throws an exception we end up with a table - //without complete association information, but this seems to be and ok tradeoff - metaType.SetupAssociations(); - return metaTable; } } -} \ No newline at end of file +} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaTable.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaTable.cs index 755da1e730f..d5776416272 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaTable.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaTable.cs @@ -1,7 +1,7 @@ #region MIT license // -// MIT license -// +// MIT license +// // Copyright (c) 2007-2008 Jiri Moudry // // Permission is hereby granted, free of charge, to any person obtaining a copy @@ -28,11 +28,7 @@ using System.Data.Linq.Mapping; using System.Diagnostics; using System.Reflection; -#if MONO_STRICT -namespace System.Data.Linq.Mapping -#else namespace DbLinq.Data.Linq.Mapping -#endif { [DebuggerDisplay("MetaTable for {TableName}")] internal class AttributedMetaTable : MetaTable diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaType.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaType.cs index 397d0b6f308..d1b09cf627b 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaType.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/AttributedMetaType.cs @@ -33,11 +33,7 @@ using System.Reflection; using DbLinq.Util; using System.Collections.Generic; -#if MONO_STRICT -namespace System.Data.Linq.Mapping -#else namespace DbLinq.Data.Linq.Mapping -#endif { [DebuggerDisplay("MetaType for {Name}")] internal class AttributedMetaType : MetaType @@ -46,50 +42,21 @@ namespace DbLinq.Data.Linq.Mapping { type = classType; - // associations and members - var dataMembersList = new List(); - var persistentMembersList = new List(); - var identityMembersList = new List(); - foreach (var memberInfo in classType.GetMembers()) - { - - var column = memberInfo.GetAttribute(); - if (column != null) - { - var dataMember = new AttributedColumnMetaDataMember(memberInfo, column, this); - dataMembersList.Add(dataMember); - if (dataMember.IsPersistent) - persistentMembersList.Add(dataMember); - if (dataMember.IsPrimaryKey) - identityMembersList.Add(dataMember); - } - } - dataMembers = new ReadOnlyCollection(dataMembersList); - _persistentDataMembers = new ReadOnlyCollection(persistentMembersList); - identityMembers = new ReadOnlyCollection(identityMembersList); - } + AssociationsLookup = new Dictionary(); + _AssociationFixupList = new List(); - /// - /// This function is used to setup associations. - /// It is seperated from the constructor to evade circular dependecies - /// - internal void SetupAssociations() - { - var associationsList = new List(); + //First add the member to the AssociationsLookup table, because creation of the Association will cause both meta classes to look each other up, or possibly a self lookup + //We'll also cache the association data in _AssociationFixupList to be used by GetAssociations foreach (var memberInfo in type.GetMembers()) { var association = memberInfo.GetAttribute(); - if (association != null) - { - var dataMember = new AttributedAssociationMetaDataMember(memberInfo, association, this); - var metaAssociation = new AttributedMetaAssociation(memberInfo, association, dataMember); - associationsList.Add(metaAssociation); - dataMember.SetAssociation(metaAssociation); - } + if (association == null) + continue; + var dataMember = new AttributedAssociationMetaDataMember(memberInfo, association, this); + AssociationsLookup[memberInfo] = dataMember; + _AssociationFixupList.Add(new AssociationData() { Association = association, Member = memberInfo, DataMember = dataMember }); } - - _associations = new ReadOnlyCollection(associationsList); - } + } internal void SetMetaTable(MetaTable metaTable) { @@ -99,7 +66,34 @@ namespace DbLinq.Data.Linq.Mapping private ReadOnlyCollection _associations; public override ReadOnlyCollection Associations { - get { return _associations; } + get { + if (_associations == null) + { + _associations = GetAssociations().ToList().AsReadOnly(); + } + return _associations; + } + } + + private class AssociationData + { + public AssociationAttribute Association; + public MemberInfo Member; + public AttributedAssociationMetaDataMember DataMember; + } + + private IEnumerable GetAssociations() + { + //We can clear our fixup list as we're now going to convert it to the association list + var associationFixupList = _AssociationFixupList; + _AssociationFixupList = null; + + foreach (AssociationData data in associationFixupList) + { + var metaAssociation = new AttributedMetaAssociation(data.Member, data.Association, data.DataMember); + data.DataMember.SetAssociation(metaAssociation); + yield return metaAssociation; + } } public override bool CanInstantiate @@ -108,10 +102,21 @@ namespace DbLinq.Data.Linq.Mapping get { return true; } } - private readonly ReadOnlyCollection dataMembers; + private ReadOnlyCollection dataMembers; public override ReadOnlyCollection DataMembers { - get { return dataMembers; } + get { + if (dataMembers == null) + { + dataMembers = + (from m in type.GetMembers() + let c = m.GetAttribute() + where c != null + select (MetaDataMember) new AttributedColumnMetaDataMember(m, c, this)) + .ToList().AsReadOnly(); + } + return dataMembers; + } } public override MetaDataMember DBGeneratedIdentityMember @@ -133,7 +138,7 @@ namespace DbLinq.Data.Linq.Mapping { // TODO: optimize? // A tip to know the MemberInfo for the same member is not the same when declared from a class and its inheritor - return (from dataMember in _persistentDataMembers where dataMember.Member.Name == member.Name select dataMember).SingleOrDefault(); + return (from m in PersistentDataMembers where m.Member.Name == member.Name select m).SingleOrDefault(); } public override MetaType GetInheritanceType(Type baseType) @@ -171,10 +176,15 @@ namespace DbLinq.Data.Linq.Mapping get { throw new NotImplementedException(); } } - private readonly ReadOnlyCollection identityMembers; + private ReadOnlyCollection identityMembers; public override ReadOnlyCollection IdentityMembers { - get { return identityMembers; } + get { + if (identityMembers == null) + identityMembers = + DataMembers.Where(m => m.IsPrimaryKey).ToList().AsReadOnly(); + return identityMembers; + } } public override MetaType InheritanceBase @@ -235,7 +245,12 @@ namespace DbLinq.Data.Linq.Mapping private ReadOnlyCollection _persistentDataMembers; public override ReadOnlyCollection PersistentDataMembers { - get { return _persistentDataMembers; } + get { + if (_persistentDataMembers == null) + _persistentDataMembers = + DataMembers.Where(m => m.IsPersistent).ToList().AsReadOnly(); + return _persistentDataMembers; + } } private MetaTable table; @@ -254,5 +269,8 @@ namespace DbLinq.Data.Linq.Mapping { get { throw new NotImplementedException(); } } + + internal Dictionary AssociationsLookup; + private List _AssociationFixupList; } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/MappingContext.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/MappingContext.cs index 8b1082f36f2..d114c9fb9d0 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/MappingContext.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/MappingContext.cs @@ -26,23 +26,17 @@ using System; -#if MONO_STRICT -namespace System.Data.Linq.Mapping -#else namespace DbLinq.Data.Linq.Mapping -#endif { /// /// MappingContext is used during the mapping process /// it contains events and properties give to mapper. /// There is one default instance in DataContext. /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - class MappingContext + class MappingContext { #if MONO_STRICT internal diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/XmlMappingSource.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/XmlMappingSource.cs index 554d8e169fc..28f4f97d821 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/XmlMappingSource.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Mapping/XmlMappingSource.cs @@ -604,22 +604,30 @@ namespace DbLinq.Data.Linq.Mapping { this.model = model; this.t = table; - foreach (var member in model.ContextType.GetMember(t.Member)) + System.Type rt; + if (t.Member != null) { - if (table_member != null) - throw new ArgumentException(String.Format("The context type '{0}' contains non-identical member '{1}'", model.ContextType, t.Member)); - table_member = member; + foreach (var member in model.ContextType.GetMember(t.Member)) + { + if (table_member != null) + throw new ArgumentException(String.Format("The context type '{0}' contains non-identical member '{1}'", model.ContextType, t.Member)); + table_member = member; + } + if (table_member == null) + table_member = GetFieldsAndProperties(model.ContextType).First(pi => pi.GetMemberType().IsGenericType && + pi.GetMemberType().GetGenericTypeDefinition() == typeof(Table<>) && + pi.GetMemberType().GetGenericArguments()[0] == model.GetTypeFromName(t.Type.Name)); + if (table_member == null) + throw new ArgumentException(String.Format("The context type '{0}' does not contain member '{1}' which is specified in dbml", model.ContextType, t.Member)); + member_type = table_member.GetMemberType(); + if (member_type.GetGenericTypeDefinition() != typeof(Table<>)) + throw new ArgumentException(String.Format("The table member type was unexpected: '{0}'", member_type)); + rt = member_type.GetGenericArguments()[0]; + } + else + { + rt = System.Type.GetType(t.Type.Name); } - if (table_member == null) - table_member = GetFieldsAndProperties(model.ContextType).First(pi => pi.GetMemberType().IsGenericType && - pi.GetMemberType().GetGenericTypeDefinition() == typeof(Table<>) && - pi.GetMemberType().GetGenericArguments()[0] == model.GetTypeFromName(t.Type.Name)); - if (table_member == null) - throw new ArgumentException(String.Format("The context type '{0}' does not contain member '{1}' which is specified in dbml", model.ContextType, t.Member)); - member_type = table_member.GetMemberType(); - if (member_type.GetGenericTypeDefinition() != typeof(Table<>)) - throw new ArgumentException(String.Format("The table member type was unexpected: '{0}'", member_type)); - var rt = member_type.GetGenericArguments()[0]; row_type = model.GetMetaType(rt); if (row_type == null) throw new ArgumentException(String.Format("MetaType for '{0}' was not found", rt)); @@ -806,7 +814,9 @@ namespace DbLinq.Data.Linq.Mapping public override System.Data.Linq.Mapping.MetaDataMember GetDataMember(MemberInfo member) { //return members.First(m => m.Member == member); - foreach (var m in members) if (m.Member == member) return m; + foreach (var m in members) + if (m.Member == member || (m.Member.ToString() == member.ToString() && member.DeclaringType.IsAssignableFrom(m.Member.DeclaringType))) + return m; throw new ArgumentException(String.Format("No corresponding metadata member for '{0}'", member)); } @@ -1022,7 +1032,7 @@ namespace DbLinq.Data.Linq.Mapping } } public override string MappedName { get { return c.Name; } } - public override string Name { get { return c.Name ?? c.Member; } } + public override string Name { get { return c.Member ?? c.Name; } } public override System.Data.Linq.Mapping.UpdateCheck UpdateCheck { get { return c.UpdateCheck; } } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlLiteralPart.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlLiteralPart.cs index 376142081d2..b41747b2742 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlLiteralPart.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlLiteralPart.cs @@ -26,19 +26,13 @@ using System.Diagnostics; -#if MONO_STRICT -namespace System.Data.Linq.Sql -#else namespace DbLinq.Data.Linq.Sql -#endif { /// /// Represents a literal SQL part /// [DebuggerDisplay("SqlLiteralPart {Literal}")] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class SqlLiteralPart : SqlPart diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlParameterPart.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlParameterPart.cs index 19ee9a94a1b..b8060ea29b2 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlParameterPart.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlParameterPart.cs @@ -26,22 +26,16 @@ using System.Diagnostics; -#if MONO_STRICT -namespace System.Data.Linq.Sql -#else namespace DbLinq.Data.Linq.Sql -#endif { /// /// SqlPart exposing a parameter /// [DebuggerDisplay("SqlParameterPart {Parameter} (as {Alias})")] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - class SqlParameterPart : SqlPart + class SqlParameterPart : SqlPart { /// /// The SQL part is the literal parameter diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlPart.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlPart.cs index ed22636e48a..0a2ed33bf65 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlPart.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlPart.cs @@ -24,18 +24,12 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.Sql -#else namespace DbLinq.Data.Linq.Sql -#endif { /// /// An SqlPart is a constitutive string of SQL query /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif abstract class SqlPart diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlStatement.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlStatement.cs index 225be338566..1214a8d6986 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlStatement.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlStatement.cs @@ -29,20 +29,14 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; -#if MONO_STRICT -namespace System.Data.Linq.Sql -#else namespace DbLinq.Data.Linq.Sql -#endif { /// /// An SqlStatement is a literal SQL request, composed of different parts (SqlPart) /// each part being either a parameter or a literal string /// [DebuggerDisplay("SqlStatement {ToString()}")] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class SqlStatement : IEnumerable diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlStatementBuilder.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlStatementBuilder.cs index bc09ae535f8..7785e8a37a8 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlStatementBuilder.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sql/SqlStatementBuilder.cs @@ -29,22 +29,16 @@ using System.Collections; using System.Collections.Generic; using DbLinq.Util; -#if MONO_STRICT -namespace System.Data.Linq.Sql -#else namespace DbLinq.Data.Linq.Sql -#endif { /// /// An SqlStatement is a literal SQL request, composed of different parts (SqlPart) /// each part being either a parameter or a literal string /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - class SqlStatementBuilder + class SqlStatementBuilder { public readonly List Parts = new List(); diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/FirebirdProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/FirebirdProvider.cs index 39d1d3cbd7c..b340259d936 100755 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/FirebirdProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/FirebirdProvider.cs @@ -24,18 +24,12 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.SqlClient -#else namespace DbLinq.Data.Linq.SqlClient -#endif { /// /// Identifies vendor by using VendorAttribute with this type /// -#if MONO_STRICT && !MONO_STRICT_EXTRA_DB_SUPPORT - internal -#else +#if !MONO_STRICT public #endif class FirebirdProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/IngresProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/IngresProvider.cs index 06bc9a67a84..e37ce178a2e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/IngresProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/IngresProvider.cs @@ -24,18 +24,12 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.SqlClient -#else namespace DbLinq.Data.Linq.SqlClient -#endif { /// /// Identifies vendor by using VendorAttribute with this type /// -#if MONO_STRICT && !MONO_STRICT_EXTRA_DB_SUPPORT - internal -#else +#if !MONO_STRICT public #endif class IngresProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/MySqlProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/MySqlProvider.cs index 4e7d30e6f66..a3f9e3ad393 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/MySqlProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/MySqlProvider.cs @@ -24,18 +24,12 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.SqlClient -#else namespace DbLinq.Data.Linq.SqlClient -#endif { /// /// Identifies vendor by using VendorAttribute with this type /// -#if MONO_STRICT && !MONO_STRICT_EXTRA_DB_SUPPORT - internal -#else +#if !MONO_STRICT public #endif class MySqlProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/OracleProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/OracleProvider.cs index d2f91decefe..766b90df4d6 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/OracleProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/OracleProvider.cs @@ -24,18 +24,12 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.SqlClient -#else namespace DbLinq.Data.Linq.SqlClient -#endif { /// /// Identifies vendor by using VendorAttribute with this type /// -#if MONO_STRICT && !MONO_STRICT_EXTRA_DB_SUPPORT - internal -#else +#if !MONO_STRICT public #endif class OracleProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/PostgreSqlProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/PostgreSqlProvider.cs index f21fbad094c..38aca80cd9f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/PostgreSqlProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/PostgreSqlProvider.cs @@ -24,18 +24,12 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.SqlClient -#else namespace DbLinq.Data.Linq.SqlClient -#endif { /// /// Identifies vendor by using VendorAttribute with this type /// -#if MONO_STRICT && !MONO_STRICT_EXTRA_DB_SUPPORT - internal -#else +#if !MONO_STRICT public #endif class PostgreSqlProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/SqlServerProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/SqlServerProvider.cs index b2545685be4..85f612eaf08 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/SqlServerProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/SqlServerProvider.cs @@ -24,18 +24,12 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.SqlClient -#else namespace DbLinq.Data.Linq.SqlClient -#endif { /// /// Identifies vendor by using VendorAttribute with this type /// -#if MONO_STRICT && !MONO_STRICT_EXTRA_DB_SUPPORT - internal -#else +#if !MONO_STRICT public #endif class SqlServerProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/SqliteProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/SqliteProvider.cs index ecc00251fde..e23509853a7 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/SqliteProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/SqlClient/SqliteProvider.cs @@ -24,18 +24,12 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.SqlClient -#else namespace DbLinq.Data.Linq.SqlClient -#endif { /// /// Identifies vendor by using VendorAttribute with this type /// -#if MONO_STRICT && !MONO_STRICT_EXTRA_DB_SUPPORT - internal -#else +#if !MONO_STRICT public #endif class SqliteProvider diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/AbstractQuery.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/AbstractQuery.cs index d88a6cd21c1..902177d7ea2 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/AbstractQuery.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/AbstractQuery.cs @@ -28,18 +28,16 @@ using DbLinq.Util; using DbLinq.Data.Linq.Database; using System.Collections.Generic; -#if MONO_STRICT -using System.Data.Linq.Sql; -#else using DbLinq.Data.Linq.Sugar.Expressions; using DbLinq.Data.Linq.Sql; -#endif #if MONO_STRICT -namespace System.Data.Linq.Sugar +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Sugar +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Sugar { /// /// Base class for all query types (select, insert, update, delete, raw) diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/BuilderContext.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/BuilderContext.cs index f731baeb93d..4a620ae86d8 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/BuilderContext.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/BuilderContext.cs @@ -27,22 +27,17 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.Expressions; -#else +using System.Reflection; + using DbLinq.Data.Linq.Sugar; using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal class BuilderContext { + public Stack CallStack { get; private set; } + // Global context public QueryContext QueryContext { get; private set; } @@ -103,6 +98,7 @@ namespace DbLinq.Data.Linq.Sugar public BuilderContext(QueryContext queryContext) { + CallStack = new Stack(); SelectExpressions = new List(); currentScopeIndex = SelectExpressions.Count; SelectExpressions.Add(new SelectExpression()); @@ -124,6 +120,7 @@ namespace DbLinq.Data.Linq.Sugar var builderContext = new BuilderContext(); // scope independent Parts + builderContext.CallStack = CallStack; builderContext.QueryContext = QueryContext; builderContext.ExpressionQuery = ExpressionQuery; builderContext.MetaTables = MetaTables; @@ -146,6 +143,7 @@ namespace DbLinq.Data.Linq.Sugar var builderContext = new BuilderContext(); // we basically copy everything + builderContext.CallStack = CallStack; builderContext.QueryContext = QueryContext; builderContext.ExpressionQuery = ExpressionQuery; builderContext.MetaTables = MetaTables; @@ -160,10 +158,53 @@ namespace DbLinq.Data.Linq.Sugar return builderContext; } + /// + /// Creates a new BuilderContext with a new query scope with the same parent of the CurrentSelect + /// + /// + public BuilderContext NewSisterSelect() + { + var builderContext = new BuilderContext(); + + // we basically copy everything + builderContext.CallStack = CallStack; + builderContext.QueryContext = QueryContext; + builderContext.ExpressionQuery = ExpressionQuery; + builderContext.MetaTables = MetaTables; + builderContext.Parameters = Parameters; + builderContext.SelectExpressions = SelectExpressions; + builderContext.ExpectMetaTableDefinition = ExpectMetaTableDefinition; + + // except CurrentScope, of course + builderContext.currentScopeIndex = SelectExpressions.Count; + SelectExpressions.Add(new SelectExpression(CurrentSelect.Parent)); + + return builderContext; + } + + /// + /// Creates a new BuilderContext with a new query scope which is parent of the current one + /// + /// + public void NewParentSelect() + { + SelectExpression currentSelect = this.CurrentSelect; + SelectExpression newParentSelect = new SelectExpression(currentSelect.Parent); + + while (currentSelect != null) + { + currentSelect.Parent = newParentSelect; + currentSelect = currentSelect.NextSelectExpression; + } + this.currentScopeIndex = SelectExpressions.Count; + SelectExpressions.Add(newParentSelect); + } + public BuilderContext Clone() { var builderContext = new BuilderContext(); + builderContext.CallStack = CallStack; builderContext.QueryContext = QueryContext; builderContext.ExpressionQuery = ExpressionQuery; builderContext.MetaTables = MetaTables; diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/DeleteQuery.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/DeleteQuery.cs index 45e090e9ef2..6d2b8470ee7 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/DeleteQuery.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/DeleteQuery.cs @@ -25,19 +25,17 @@ #endregion using System.Collections.Generic; -#if MONO_STRICT -using System.Data.Linq.Sql; -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sql; using DbLinq.Data.Linq.Sugar.Expressions; -#endif #if MONO_STRICT -namespace System.Data.Linq.Sugar +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Sugar +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Sugar { internal class DeleteQuery : ParameterizedQuery { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/DirectQuery.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/DirectQuery.cs index 17bd075bba3..0227ae49c98 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/DirectQuery.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/DirectQuery.cs @@ -29,18 +29,16 @@ using System.Collections.Generic; using DbLinq.Data.Linq.Database; using System.Data; -#if MONO_STRICT -using System.Data.Linq.Sql; -#else using DbLinq.Data.Linq.Sql; using DbLinq.Util; -#endif #if MONO_STRICT -namespace System.Data.Linq.Sugar +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Sugar +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Sugar { internal class DirectQuery : AbstractQuery { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Error.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Error.cs index f3d37da632c..bbb58220e11 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Error.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Error.cs @@ -26,11 +26,7 @@ using System; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { /// /// Shortcuts to generate exceptions (with formatted strings) diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionChain.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionChain.cs index 9e1b134027c..be4f5148c10 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionChain.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionChain.cs @@ -29,44 +29,42 @@ using System.Diagnostics; using System.Linq.Expressions; using System.Collections.Generic; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { [DebuggerDisplay("ExpressionChain {Expressions.Count} Expression(s)")] internal class ExpressionChain : IEnumerable { - public List Expressions { get; private set; } - - public ExpressionChain() - { - Expressions = new List(); - } - - public ExpressionChain(IEnumerable expressions) + private Expression[] expressions; + private List expressionList; + public List Expressions { - Expressions = new List(expressions); + get + { + if (expressionList == null) + if (expressions == null) + expressionList = new List(); + else + expressionList = new List(expressions); + return expressionList; + } } - public ExpressionChain(IEnumerable expressions) + public ExpressionChain() { - Expressions = new List(); - foreach (Expression e in expressions) - Expressions.Add(e); + expressions = new Expression[] { }; } - public ExpressionChain(IEnumerable expressions, Expression expression) - : this(expressions) + public ExpressionChain(ExpressionChain chain) { - Expressions.Add(expression); + this.expressions = new Expression[chain.expressions.Length]; + chain.expressions.CopyTo(this.expressions, 0); } - public ExpressionChain(IEnumerable expressions, IEnumerable expressions2) - : this(expressions) + public ExpressionChain(ExpressionChain chain, Expression expression) { - Expressions.AddRange(expressions2); + this.expressions = new Expression[chain.expressions.Length + 1]; + chain.expressions.CopyTo(this.expressions, 0); + this.expressions[chain.expressions.Length] = expression; } public override bool Equals(object obj) diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/ExpressionMutatorExtensions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/ExpressionMutatorExtensions.cs index ac7816ad2f2..af49e0664d0 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/ExpressionMutatorExtensions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/ExpressionMutatorExtensions.cs @@ -28,19 +28,10 @@ using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.ExpressionMutator; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar.ExpressionMutator; using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator -#endif { /// /// Extensions to Expression, to enumerate and dynamically change operands in a uniformized way diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/ExpressionMutatorFactory.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/ExpressionMutatorFactory.cs index f2c1555f770..58638ccff10 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/ExpressionMutatorFactory.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/ExpressionMutatorFactory.cs @@ -26,19 +26,10 @@ using System; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.ExpressionMutator.Implementation; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation; using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator -#endif { internal static class ExpressionMutatorFactory { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/BinaryExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/BinaryExpressionMutator.cs index df4d10224f9..b86fadf75ac 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/BinaryExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/BinaryExpressionMutator.cs @@ -28,17 +28,10 @@ using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class BinaryExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ConditionalExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ConditionalExpressionMutator.cs index 3669f399357..e9788919f2f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ConditionalExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ConditionalExpressionMutator.cs @@ -26,17 +26,10 @@ using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class ConditionalExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ConstantExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ConstantExpressionMutator.cs index 1956e5489e0..44276d2c048 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ConstantExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ConstantExpressionMutator.cs @@ -26,17 +26,10 @@ using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class ConstantExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/IMemberBindingMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/IMemberBindingMutator.cs index 1e68500ed54..197cec7a601 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/IMemberBindingMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/IMemberBindingMutator.cs @@ -27,11 +27,7 @@ using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal interface IMemberBindingMutator { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/InvocationExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/InvocationExpressionMutator.cs index a06a30bb7e6..0bb0b990070 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/InvocationExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/InvocationExpressionMutator.cs @@ -27,17 +27,10 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class InvocationExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/LambdaExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/LambdaExpressionMutator.cs index 08ff174d9a8..fab0b86b71d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/LambdaExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/LambdaExpressionMutator.cs @@ -27,17 +27,10 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class LambdaExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ListInitExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ListInitExpressionMutator.cs index 4f5fa95bf81..fee13ce3aaa 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ListInitExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ListInitExpressionMutator.cs @@ -26,17 +26,10 @@ using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class ListInitExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberAssignmentMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberAssignmentMutator.cs index 4a4ffda956c..94e92489ac6 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberAssignmentMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberAssignmentMutator.cs @@ -27,11 +27,7 @@ using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class MemberAssignmentMutator : IMemberBindingMutator { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberBindingMutatorFactory.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberBindingMutatorFactory.cs index 96c8374327a..5feafa978b8 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberBindingMutatorFactory.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberBindingMutatorFactory.cs @@ -25,19 +25,11 @@ #endregion using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.ExpressionMutator.Implementation; -#else + using DbLinq.Data.Linq.Sugar; using DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal static class MemberBindingMutatorFactory { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberExpressionMutator.cs index 5d705664523..32ccac1f7bd 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberExpressionMutator.cs @@ -28,17 +28,10 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Reflection; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class MemberExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberInitExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberInitExpressionMutator.cs index b79cf9f3767..ade068b135a 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberInitExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberInitExpressionMutator.cs @@ -27,17 +27,10 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class MemberInitExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberListBindingMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberListBindingMutator.cs index 1a198ed3d4f..1711c34ed88 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberListBindingMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberListBindingMutator.cs @@ -28,11 +28,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class MemberListBindingMutator : IMemberBindingMutator { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberMemberBindingMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberMemberBindingMutator.cs index 74434c28669..4b5c974abd7 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberMemberBindingMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MemberMemberBindingMutator.cs @@ -28,11 +28,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class MemberMemberBindingMutator : IMemberBindingMutator { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MethodCallExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MethodCallExpressionMutator.cs index 0be8c9bb4a8..832570752e0 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MethodCallExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/MethodCallExpressionMutator.cs @@ -27,17 +27,10 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class MethodCallExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/NewArrayExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/NewArrayExpressionMutator.cs index 23db582c256..38a71caa3df 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/NewArrayExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/NewArrayExpressionMutator.cs @@ -27,17 +27,10 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class NewArrayExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/NewExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/NewExpressionMutator.cs index 3653e06918d..8b7a7bf2a6f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/NewExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/NewExpressionMutator.cs @@ -26,17 +26,10 @@ using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class NewExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ParameterExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ParameterExpressionMutator.cs index 8e3e36466fb..95069a91c34 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ParameterExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/ParameterExpressionMutator.cs @@ -26,17 +26,10 @@ using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class ParameterExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/TypeBinaryExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/TypeBinaryExpressionMutator.cs index 4dc72250056..54e2bb771e3 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/TypeBinaryExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/TypeBinaryExpressionMutator.cs @@ -26,17 +26,9 @@ using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class TypeBinaryExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/UnaryExpressionMutator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/UnaryExpressionMutator.cs index b661e7214d7..d13a50b686c 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/UnaryExpressionMutator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionMutator/Implementation/UnaryExpressionMutator.cs @@ -27,17 +27,9 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.ExpressionMutator.Implementation -#else namespace DbLinq.Data.Linq.Sugar.ExpressionMutator.Implementation -#endif { internal class UnaryExpressionMutator : IMutableExpression { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionPrecedence.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionPrecedence.cs index 520db347f10..3886677cfb7 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionPrecedence.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionPrecedence.cs @@ -24,11 +24,7 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal enum ExpressionPrecedence { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionQuery.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionQuery.cs index 1eef7c4c651..3ea2021a53b 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionQuery.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionQuery.cs @@ -26,17 +26,10 @@ using System; using System.Collections.Generic; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { /// /// Represents the first step Expression analysis result diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionTier.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionTier.cs index 68a41229cc1..42675c72ce0 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionTier.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ExpressionTier.cs @@ -26,11 +26,7 @@ using System; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { [Flags] internal enum ExpressionTier diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ColumnExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ColumnExpression.cs index a748c95d92e..82a83448903 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ColumnExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ColumnExpression.cs @@ -27,18 +27,12 @@ using System.Diagnostics; using System.Linq.Expressions; using System.Reflection; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif using DbLinq.Util; +using System.Data.Linq.Mapping; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// Describes a column, related to a table @@ -54,17 +48,19 @@ namespace DbLinq.Data.Linq.Sugar.Expressions public TableExpression Table { get; private set; } public string Name { get; private set; } public MemberInfo MemberInfo { get; private set; } + public MemberInfo StorageInfo { get; private set; } public string Alias { get; set; } public int RequestIndex { get; set; } - public ColumnExpression(TableExpression table, string name, MemberInfo memberInfo) - : base(ExpressionType, memberInfo.GetMemberType()) + public ColumnExpression(TableExpression table, MetaDataMember metaData) + : base(ExpressionType, metaData.Member.GetMemberType()) // memberInfo.GetMemberType()) { Table = table; - Name = name; - MemberInfo = memberInfo; + Name = metaData.MappedName; + MemberInfo = metaData.Member; + StorageInfo = metaData.StorageMember; RequestIndex = -1; // unused } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/CustomExpressionType.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/CustomExpressionType.cs index 6f46a4225d4..feb533e5b6f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/CustomExpressionType.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/CustomExpressionType.cs @@ -24,11 +24,7 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// Those types are required by DbLinq internal expressions diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/EntitySetExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/EntitySetExpression.cs index d1faf068d02..13f081aaca1 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/EntitySetExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/EntitySetExpression.cs @@ -28,17 +28,10 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.ExpressionMutator; -#else + using DbLinq.Data.Linq.Sugar.ExpressionMutator; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// A GroupExpression holds a grouped result diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ExpressionTranslator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ExpressionTranslator.cs index bb4eb7bbb8f..fcb217a65c8 100755 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ExpressionTranslator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ExpressionTranslator.cs @@ -1,11 +1,7 @@ using System; using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// Permits translation of expressions for specific database vendors diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/GroupExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/GroupExpression.cs index 858ab66b8d5..18eedb7d571 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/GroupExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/GroupExpression.cs @@ -27,17 +27,10 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.ExpressionMutator; -#else + using DbLinq.Data.Linq.Sugar.ExpressionMutator; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// A GroupExpression holds a grouped result diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/IExecutableExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/IExecutableExpression.cs index 4ecf5a91a4a..06338b9bc96 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/IExecutableExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/IExecutableExpression.cs @@ -24,11 +24,7 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { #if !MONO_STRICT public diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/IMutableExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/IMutableExpression.cs index 46e40356c46..c83d025ac60 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/IMutableExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/IMutableExpression.cs @@ -27,11 +27,7 @@ using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// Allows an Expression to enumerator its Operands and be mutated, ie changing its operands diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/InputParameterExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/InputParameterExpression.cs index e1eadce9b76..ae6f0cb9d70 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/InputParameterExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/InputParameterExpression.cs @@ -27,17 +27,10 @@ using System; using System.Diagnostics; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { [DebuggerDisplay("InputParameterExpression (current value={GetValue()})")] #if !MONO_STRICT diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/MetaTableExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/MetaTableExpression.cs index d8990137532..719702cfaa4 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/MetaTableExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/MetaTableExpression.cs @@ -28,17 +28,10 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Reflection; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// A MetaTablePiece contains aliases for tables (used on joins) diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/MutableExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/MutableExpression.cs index bb7c2d2db2e..622dbe93ff4 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/MutableExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/MutableExpression.cs @@ -27,17 +27,10 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar; -#else + using DbLinq.Data.Linq.Sugar; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { #if !MONO_STRICT public diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ObjectInputParameterExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ObjectInputParameterExpression.cs index 04d49627a51..83d875e023f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ObjectInputParameterExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ObjectInputParameterExpression.cs @@ -27,17 +27,10 @@ using System; using System.Diagnostics; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { [DebuggerDisplay("ObjectInputParameterExpression")] #if !MONO_STRICT diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ObjectOutputParameterExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ObjectOutputParameterExpression.cs index 977b9cd5b39..05f93eaed66 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ObjectOutputParameterExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/ObjectOutputParameterExpression.cs @@ -27,17 +27,10 @@ using System; using System.Diagnostics; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { [DebuggerDisplay("ObjectOutputParameterExpression")] #if !MONO_STRICT diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/OperandsMutableExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/OperandsMutableExpression.cs index 2f594c47155..e4d73225125 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/OperandsMutableExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/OperandsMutableExpression.cs @@ -29,11 +29,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { #if !MONO_STRICT public diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/OrderByExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/OrderByExpression.cs index 97ede836735..0ec370a0c44 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/OrderByExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/OrderByExpression.cs @@ -26,11 +26,7 @@ using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// Represents a ORDER column to be sorted on diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SelectExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SelectExpression.cs index 912b5d9d39e..f6dc44b665e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SelectExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SelectExpression.cs @@ -27,17 +27,10 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// ScopeExpression describes a selection. @@ -70,7 +63,7 @@ namespace DbLinq.Data.Linq.Sugar.Expressions public SelectOperatorType NextSelectExpressionOperator; // Parent scope: we will climb up to find if we don't find the request table in the current scope - public SelectExpression Parent { get; private set; } + public SelectExpression Parent { get; set; } public SelectExpression() : base(ExpressionType, null, null) diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SelectOperatorType.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SelectOperatorType.cs index 453a7446116..0b9502dbf8b 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SelectOperatorType.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SelectOperatorType.cs @@ -24,15 +24,9 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif enum SelectOperatorType diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SpecialExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SpecialExpression.cs index afc10e51ad9..9cfe833550b 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SpecialExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SpecialExpression.cs @@ -33,21 +33,11 @@ using System.Linq.Expressions; using System.Linq; using System.Collections.ObjectModel; -#if MONO_STRICT -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.ExpressionMutator; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar; using DbLinq.Data.Linq.Sugar.ExpressionMutator; using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// Holds new expression types (sql related), all well as their operands @@ -76,6 +66,8 @@ namespace DbLinq.Data.Linq.Sugar.Expressions return typeof(string); case SpecialExpressionType.Count: return typeof(int); + case SpecialExpressionType.Exists: + return typeof(bool); case SpecialExpressionType.Like: return typeof(bool); case SpecialExpressionType.Min: @@ -114,6 +106,7 @@ namespace DbLinq.Data.Linq.Sugar.Expressions case SpecialExpressionType.Millisecond: return typeof(int); case SpecialExpressionType.Now: + case SpecialExpressionType.Date: return typeof(DateTime); case SpecialExpressionType.DateDiffInMilliseconds: return typeof(long); @@ -183,6 +176,17 @@ namespace DbLinq.Data.Linq.Sugar.Expressions // TODO: by default, shall we answer 1 or throw an exception? return 1; } + case SpecialExpressionType.Exists: + { + var value = operands[0].Evaluate(); + // TODO: string is IEnumerable. See what we do here + if (value is IEnumerable) + { + return true; + } + // TODO: by default, shall we answer 1 or throw an exception? + return false; + } case SpecialExpressionType.Min: { decimal? min = null; @@ -249,6 +253,8 @@ namespace DbLinq.Data.Linq.Sugar.Expressions return ((DateTime)operands[0].Evaluate()).Millisecond; case SpecialExpressionType.Now: return DateTime.Now; + case SpecialExpressionType.Date: + return ((DateTime)operands[0].Evaluate()); case SpecialExpressionType.DateDiffInMilliseconds: return ((DateTime)operands[0].Evaluate()) - ((DateTime)operands[1].Evaluate()); case SpecialExpressionType.Abs: diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SpecialExpressionType.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SpecialExpressionType.cs index 3bd5d1a40df..472fee953b5 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SpecialExpressionType.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SpecialExpressionType.cs @@ -24,28 +24,23 @@ // #endregion -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// SQL specific (and DBlinq required) custom expression types. /// To add a new value here, please be sure to handle it everywhere /// For this, search for "// SETuse" comment in project /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - enum SpecialExpressionType + enum SpecialExpressionType { IsNull = 100, IsNotNull, Concat, Count, + Exists, Like, Min, Max, @@ -73,6 +68,7 @@ namespace DbLinq.Data.Linq.Sugar.Expressions Second, Millisecond, Now, + Date, DateDiffInMilliseconds, Abs, diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/StartIndexOffsetExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/StartIndexOffsetExpression.cs index 890f1d637c6..e69a011aa97 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/StartIndexOffsetExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/StartIndexOffsetExpression.cs @@ -4,11 +4,7 @@ using System.Linq; using System.Text; using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { #if !MONO_STRICT public diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SubSelectExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SubSelectExpression.cs new file mode 100644 index 00000000000..11feedbad84 --- /dev/null +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/SubSelectExpression.cs @@ -0,0 +1,62 @@ +#region MIT license +// +// MIT license +// +// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +#endregion + +using System; +using System.Diagnostics; +using System.Linq.Expressions; + +using DbLinq.Data.Linq.Sugar.Expressions; + +namespace DbLinq.Data.Linq.Sugar.Expressions +{ + /// + /// A table expression produced by a sub select, which work almost like any other table + /// Different joins specify different tables + /// + [DebuggerDisplay("SubSelectExpression {Name} (as {Alias})")] +#if !MONO_STRICT + public +#endif + class SubSelectExpression : TableExpression + { + public SelectExpression Select { get; private set; } + + public SubSelectExpression(SelectExpression select, Type type, string alias) + : base(type, alias) + { + this.Select = select; + this.Alias = alias; + } + + public override bool IsEqualTo(TableExpression expression) + { + SubSelectExpression subSelectTable = expression as SubSelectExpression; + if (subSelectTable == null) + return false; + return Name == expression.Name && JoinID == expression.JoinID && Select == subSelectTable.Select; + } + } +} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/TableExpression.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/TableExpression.cs index c7aca4f3808..1fefc35c973 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/TableExpression.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/TableExpression.cs @@ -27,17 +27,10 @@ using System; using System.Diagnostics; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { /// /// A table is a default table, or a joined table @@ -130,7 +123,7 @@ namespace DbLinq.Data.Linq.Sugar.Expressions Name = tableExpression.Name; } - public bool IsEqualTo(TableExpression expression) + public virtual bool IsEqualTo(TableExpression expression) { return Name == expression.Name && JoinID == expression.JoinID; } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/TableJoinType.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/TableJoinType.cs index 77a8d0d60dc..31d5fdf1675 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/TableJoinType.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Expressions/TableJoinType.cs @@ -26,11 +26,7 @@ using System; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Expressions -#else namespace DbLinq.Data.Linq.Sugar.Expressions -#endif { [Flags] #if !MONO_STRICT diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IDataMapper.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IDataMapper.cs index 0d6733c48fc..323679911e0 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IDataMapper.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IDataMapper.cs @@ -28,18 +28,16 @@ using System; using System.Collections.Generic; using System.Data.Linq.Mapping; using System.Reflection; -#if MONO_STRICT -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar.Expressions; -#endif #if MONO_STRICT -namespace System.Data.Linq.Sugar +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Sugar +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Sugar { internal interface IDataMapper { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IDataRecordReader.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IDataRecordReader.cs index e6b064dc384..0a4790c282c 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IDataRecordReader.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IDataRecordReader.cs @@ -27,11 +27,7 @@ using System; using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal interface IDataRecordReader { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionDispatcher.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionDispatcher.cs index cff79de639c..57281e02822 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionDispatcher.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionDispatcher.cs @@ -28,11 +28,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal interface IExpressionDispatcher { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionLanguageParser.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionLanguageParser.cs index 9ba6c5b559d..4f5c358e197 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionLanguageParser.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionLanguageParser.cs @@ -26,11 +26,7 @@ using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal interface IExpressionLanguageParser { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionOptimizer.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionOptimizer.cs index d889f04b3cd..6c3a82be11f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionOptimizer.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionOptimizer.cs @@ -26,11 +26,7 @@ using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal interface IExpressionOptimizer { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionQualifier.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionQualifier.cs index c8d9a8811b3..486bf592832 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionQualifier.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IExpressionQualifier.cs @@ -26,11 +26,7 @@ using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal interface IExpressionQualifier { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IPrequelAnalyzer.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IPrequelAnalyzer.cs index f52da945f7f..2b7c0a56ff4 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IPrequelAnalyzer.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IPrequelAnalyzer.cs @@ -26,11 +26,7 @@ using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal interface IPrequelAnalyzer { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryBuilder.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryBuilder.cs index b5e510ca73d..38b150de7a2 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryBuilder.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryBuilder.cs @@ -28,11 +28,7 @@ using System; using System.Collections.Generic; using System.Reflection; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal interface IQueryBuilder { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryCache.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryCache.cs index 08228d2781b..cdae5054c9e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryCache.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryCache.cs @@ -27,11 +27,7 @@ using System; using System.Collections.Generic; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal interface IQueryCache { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryRunner.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryRunner.cs index 69cf5f7eb8d..556a10d2dd9 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryRunner.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/IQueryRunner.cs @@ -27,19 +27,18 @@ using System; using System.Collections; using System.Collections.Generic; -#if MONO_STRICT -using System.Data.Linq.Sugar; -#else using System.Data; -using DbLinq.Data.Linq.Sugar; -#endif using System.Reflection; +using DbLinq.Data.Linq.Sugar; + #if MONO_STRICT -namespace System.Data.Linq.Sugar +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Sugar +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Sugar { internal interface IQueryRunner { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ISpecialExpressionTranslator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ISpecialExpressionTranslator.cs index 64da944a845..d11080f4148 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ISpecialExpressionTranslator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ISpecialExpressionTranslator.cs @@ -26,11 +26,7 @@ using System.Linq.Expressions; -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal interface ISpecialExpressionTranslator { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ISqlBuilder.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ISqlBuilder.cs index 373bee2e326..d9b6ab0a940 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ISqlBuilder.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ISqlBuilder.cs @@ -24,17 +24,9 @@ // #endregion -#if MONO_STRICT -using System.Data.Linq.Sql; -#else using DbLinq.Data.Linq.Sql; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { internal interface ISqlBuilder { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/DataMapper.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/DataMapper.cs index 51559329e64..4f4d9b27dc8 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/DataMapper.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/DataMapper.cs @@ -30,18 +30,16 @@ using System.Collections.ObjectModel; using System.Data.Linq.Mapping; using System.Linq; using System.Reflection; -#if MONO_STRICT -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sugar.Expressions; -#endif #if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Sugar.Implementation +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Sugar.Implementation { internal class DataMapper : IDataMapper { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/DataRecordReader.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/DataRecordReader.cs index 591a2a304bc..447743e5eef 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/DataRecordReader.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/DataRecordReader.cs @@ -27,20 +27,12 @@ using System; using System.Data; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar; -using MappingContext = System.Data.Linq.Mapping.MappingContext; -#else + +using DbLinq.Data.Linq.Mapping; using DbLinq.Data.Linq.Sugar; -using MappingContext = DbLinq.Data.Linq.Mapping.MappingContext; -#endif using DbLinq.Util; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { internal class DataRecordReader : IDataRecordReader { @@ -159,8 +151,8 @@ namespace DbLinq.Data.Linq.Sugar.Implementation } if (simpleReturnType == typeof(System.Data.Linq.Binary)) { - return (Expression>)((dataRecord, mappingContext, valueIndex) - => dataRecord.GetAsBytes(valueIndex)); + return (Expression>)((dataRecord, mappingContext, valueIndex) + => dataRecord.GetAsBinary(valueIndex)); } // for polymorphic types especially for ExecuteQuery<>() if (simpleReturnType == typeof(object)) diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Analyzer.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Analyzer.cs index 2f860594a3b..2f666971543 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Analyzer.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Analyzer.cs @@ -25,33 +25,26 @@ #endregion using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; #if MONO_STRICT -using System.Data.Linq.Implementation; -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.ExpressionMutator; -using System.Data.Linq.Sugar.Expressions; -using System.Data.Linq.Sugar.Implementation; +using System.Data.Linq; #else +using DbLinq.Data.Linq; +#endif using DbLinq.Data.Linq.Implementation; using DbLinq.Data.Linq.Sugar; using DbLinq.Data.Linq.Sugar.ExpressionMutator; using DbLinq.Data.Linq.Sugar.Expressions; using DbLinq.Data.Linq.Sugar.Implementation; -#endif - using DbLinq.Factory; using DbLinq.Util; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { partial class ExpressionDispatcher { @@ -158,99 +151,105 @@ namespace DbLinq.Data.Linq.Sugar.Implementation /// protected virtual Expression AnalyzeCall(MethodInfo method, IList parameters, BuilderContext builderContext) { + builderContext.CallStack.Push(method); + Func popCallStack = r => + { + builderContext.CallStack.Pop(); + return r; + }; // all methods to handle are listed here: // ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/fxref_system.core/html/2a54ce9d-76f2-81e2-95bb-59740c85386b.htm string methodName = method.Name; switch (methodName) { case "Select": - return AnalyzeSelect(parameters, builderContext); + return popCallStack(AnalyzeSelect(parameters, builderContext)); case "Where": - return AnalyzeWhere(parameters, builderContext); + return popCallStack(AnalyzeWhere(parameters, builderContext)); case "SelectMany": - return AnalyzeSelectMany(parameters, builderContext); + return popCallStack(AnalyzeSelectMany(parameters, builderContext)); case "Join": - return AnalyzeJoin(parameters, builderContext); + return popCallStack(AnalyzeJoin(parameters, builderContext)); case "GroupJoin": - return AnalyzeGroupJoin(parameters, builderContext); + return popCallStack(AnalyzeGroupJoin(parameters, builderContext)); case "DefaultIfEmpty": - return AnalyzeOuterJoin(parameters, builderContext); + return popCallStack(AnalyzeOuterJoin(parameters, builderContext)); case "Distinct": - return AnalyzeDistinct(parameters, builderContext); + return popCallStack(AnalyzeDistinct(parameters, builderContext)); case "GroupBy": - return AnalyzeGroupBy(parameters, builderContext); + return popCallStack(AnalyzeGroupBy(parameters, builderContext)); case "All": - return AnalyzeAll(parameters, builderContext); + return popCallStack(AnalyzeAll(parameters, builderContext)); case "Any": - return AnalyzeAny(parameters, builderContext); + return popCallStack(AnalyzeAny(parameters, builderContext)); case "Average": - return AnalyzeProjectionQuery(SpecialExpressionType.Average, parameters, builderContext); + return popCallStack(AnalyzeProjectionQuery(SpecialExpressionType.Average, parameters, builderContext)); case "Count": - return AnalyzeProjectionQuery(SpecialExpressionType.Count, parameters, builderContext); + return popCallStack(AnalyzeProjectionQuery(SpecialExpressionType.Count, parameters, builderContext)); case "Max": - return AnalyzeProjectionQuery(SpecialExpressionType.Max, parameters, builderContext); + return popCallStack(AnalyzeProjectionQuery(SpecialExpressionType.Max, parameters, builderContext)); case "Min": - return AnalyzeProjectionQuery(SpecialExpressionType.Min, parameters, builderContext); + return popCallStack(AnalyzeProjectionQuery(SpecialExpressionType.Min, parameters, builderContext)); case "Sum": - return AnalyzeProjectionQuery(SpecialExpressionType.Sum, parameters, builderContext); + return popCallStack(AnalyzeProjectionQuery(SpecialExpressionType.Sum, parameters, builderContext)); case "StartsWith": - return AnalyzeLikeStart(parameters, builderContext); + return popCallStack(AnalyzeLikeStart(parameters, builderContext)); case "EndsWith": - return AnalyzeLikeEnd(parameters, builderContext); + return popCallStack(AnalyzeLikeEnd(parameters, builderContext)); case "Contains": if (typeof(string).IsAssignableFrom(parameters[0].Type)) - return AnalyzeLike(parameters, builderContext); - return AnalyzeContains(parameters, builderContext); + return popCallStack(AnalyzeLike(parameters, builderContext)); + return popCallStack(AnalyzeContains(parameters, builderContext)); case "Substring": - return AnalyzeSubString(parameters, builderContext); + return popCallStack(AnalyzeSubString(parameters, builderContext)); case "First": case "FirstOrDefault": - return AnalyzeScalar(methodName, 1, parameters, builderContext); + return popCallStack(AnalyzeScalar(methodName, 1, parameters, builderContext)); case "Single": case "SingleOrDefault": - return AnalyzeScalar(methodName, 2, parameters, builderContext); + return popCallStack(AnalyzeScalar(methodName, 2, parameters, builderContext)); case "Last": - return AnalyzeScalar(methodName, null, parameters, builderContext); + return popCallStack(AnalyzeScalar(methodName, null, parameters, builderContext)); case "Take": - return AnalyzeTake(parameters, builderContext); + return popCallStack(AnalyzeTake(parameters, builderContext)); case "Skip": - return AnalyzeSkip(parameters, builderContext); + return popCallStack(AnalyzeSkip(parameters, builderContext)); case "ToUpper": - return AnalyzeToUpper(parameters, builderContext); + return popCallStack(AnalyzeToUpper(parameters, builderContext)); case "ToLower": - return AnalyzeToLower(parameters, builderContext); + return popCallStack(AnalyzeToLower(parameters, builderContext)); case "OrderBy": case "ThenBy": - return AnalyzeOrderBy(parameters, false, builderContext); + return popCallStack(AnalyzeOrderBy(parameters, false, builderContext)); case "OrderByDescending": case "ThenByDescending": - return AnalyzeOrderBy(parameters, true, builderContext); + return popCallStack(AnalyzeOrderBy(parameters, true, builderContext)); case "Union": - return AnalyzeSelectOperation(SelectOperatorType.Union, parameters, builderContext); + return popCallStack(AnalyzeSelectOperation(SelectOperatorType.Union, parameters, builderContext)); case "Concat": - return AnalyzeSelectOperation(SelectOperatorType.UnionAll, parameters, builderContext); + return popCallStack(AnalyzeSelectOperation(SelectOperatorType.UnionAll, parameters, builderContext)); case "Intersect": - return AnalyzeSelectOperation(SelectOperatorType.Intersection, parameters, builderContext); + return popCallStack(AnalyzeSelectOperation(SelectOperatorType.Intersection, parameters, builderContext)); case "Except": - return AnalyzeSelectOperation(SelectOperatorType.Exception, parameters, builderContext); + return popCallStack(AnalyzeSelectOperation(SelectOperatorType.Exception, parameters, builderContext)); case "Trim": - return AnalyzeGenericSpecialExpressionType(SpecialExpressionType.Trim, parameters, builderContext); + return popCallStack(AnalyzeGenericSpecialExpressionType(SpecialExpressionType.Trim, parameters, builderContext)); case "TrimStart": - return AnalyzeGenericSpecialExpressionType(SpecialExpressionType.LTrim, parameters, builderContext); + return popCallStack(AnalyzeGenericSpecialExpressionType(SpecialExpressionType.LTrim, parameters, builderContext)); case "TrimEnd": - return AnalyzeGenericSpecialExpressionType(SpecialExpressionType.RTrim, parameters, builderContext); + return popCallStack(AnalyzeGenericSpecialExpressionType(SpecialExpressionType.RTrim, parameters, builderContext)); case "Insert": - return AnalyzeStringInsert(parameters, builderContext); + return popCallStack(AnalyzeStringInsert(parameters, builderContext)); case "Replace": - return AnalyzeGenericSpecialExpressionType(SpecialExpressionType.Replace, parameters, builderContext); + return popCallStack(AnalyzeGenericSpecialExpressionType(SpecialExpressionType.Replace, parameters, builderContext)); case "Remove": - return AnalyzeGenericSpecialExpressionType(SpecialExpressionType.Remove, parameters, builderContext); + return popCallStack(AnalyzeGenericSpecialExpressionType(SpecialExpressionType.Remove, parameters, builderContext)); case "IndexOf": - return AnalyzeGenericSpecialExpressionType(SpecialExpressionType.IndexOf, parameters, builderContext); + return popCallStack(AnalyzeGenericSpecialExpressionType(SpecialExpressionType.IndexOf, parameters, builderContext)); case "ToString": - return AnalyzeToString(method, parameters, builderContext); + return popCallStack(AnalyzeToString(method, parameters, builderContext)); case "Parse": - return AnalyzeParse(method, parameters, builderContext); + return popCallStack(AnalyzeParse(method, parameters, builderContext)); case "Abs": case "Exp": case "Floor": @@ -258,11 +257,11 @@ namespace DbLinq.Data.Linq.Sugar.Implementation case "Round": case "Sign": case "Sqrt": - return AnalyzeGenericSpecialExpressionType((SpecialExpressionType)Enum.Parse(typeof(SpecialExpressionType), methodName), parameters, builderContext); + return popCallStack(AnalyzeGenericSpecialExpressionType((SpecialExpressionType)Enum.Parse(typeof(SpecialExpressionType), methodName), parameters, builderContext)); case "Log10": - return AnalyzeGenericSpecialExpressionType(SpecialExpressionType.Log, parameters, builderContext); + return popCallStack(AnalyzeGenericSpecialExpressionType(SpecialExpressionType.Log, parameters, builderContext)); case "Log": - return AnalyzeLog(parameters, builderContext); + return popCallStack(AnalyzeLog(parameters, builderContext)); default: throw Error.BadArgument("S0133: Implement QueryMethod '{0}'", methodName); } @@ -294,23 +293,35 @@ namespace DbLinq.Data.Linq.Sugar.Implementation { if (method.IsStatic && parameters.Count == 1) { - var expression = Expression.Convert(Analyze(parameters.First(), builderContext), method.ReturnType, method); - ExpressionTier tier = ExpressionQualifier.GetTier(expression); - - - //pibgeus: I would like to call to the expression optimizer since the exception must be thrown if the expression cannot be executed - //in Clr tier, if it can be executed in Clr tier it should continue - // ie: from e in db.Employees where DateTime.Parse("1/1/1999").Year==1999 select e <--- this should work - // ie: from e in db.Employees where DateTime.Parse(e.BirthDate).Year==1999 select e <--- a NotSupportedException must be throwed (this is the behaviour of linq2sql) - - //if (method.ReturnType == typeof(DateTime)) - //{ - // expression = ExpressionOptimizer.Analyze(expression); - // //same behaviour that Linq2Sql - // throw new NotSupportedException("Method 'System.DateTime Parse(System.String)' has no supported translation to SQL"); - //} - - return expression; + Expression parsed = null; + Expression toParse = Analyze(parameters.First(), builderContext); + InputParameterExpression inputParameterToParse = toParse as InputParameterExpression; + if (inputParameterToParse != null) + { + ExpressionTier tier = ExpressionQualifier.GetTier(parameters[0]); + if (tier == ExpressionTier.Clr) + { + parsed = RegisterParameter(System.Linq.Expressions.Expression.Call(method, inputParameterToParse.Expression), inputParameterToParse.Alias, builderContext); + UnregisterParameter(inputParameterToParse, builderContext); + } + } + if(parsed == null) + { + parsed = Expression.Convert(toParse, method.ReturnType, method); + ExpressionTier tier = ExpressionQualifier.GetTier(toParse); + //pibgeus: I would like to call to the expression optimizer since the exception must be thrown if the expression cannot be executed + //in Clr tier, if it can be executed in Clr tier it should continue + // ie: from e in db.Employees where DateTime.Parse("1/1/1999").Year==1999 select e <--- this should work + // ie: from e in db.Employees where DateTime.Parse(e.BirthDate).Year==1999 select e <--- a NotSupportedException must be throwed (this is the behaviour of linq2sql) + + //if (method.ReturnType == typeof(DateTime)) + //{ + // expression = ExpressionOptimizer.Analyze(expression); + // //same behaviour that Linq2Sql + // throw new NotSupportedException("Method 'System.DateTime Parse(System.String)' has no supported translation to SQL"); + //} + } + return parsed; } else throw new ArgumentException(); @@ -322,23 +333,56 @@ namespace DbLinq.Data.Linq.Sugar.Implementation if (parameters.Count != 1) throw new ArgumentException(); - Expression parameter; - if (parameters.First().Type.IsNullable()) - parameter = Expression.Convert(parameters.First(), parameters.First().Type.GetNullableType()); - else - parameter = parameters.First(); + Expression parameter = parameters.First(); + Expression parameterToHandle; - if (!parameter.Type.IsPrimitive && parameter.Type != typeof(string)) + if(parameter.Type.IsNullable()) + parameter = Analyze(Expression.Convert(parameter, parameter.Type.GetNullableType()), builderContext); + + parameterToHandle = Analyze(parameter, builderContext); + + InputParameterExpression inputParameter = parameterToHandle as InputParameterExpression; + if (inputParameter != null) + { + parameterToHandle = RegisterParameter(System.Linq.Expressions.Expression.Call(inputParameter.Expression, method), inputParameter.Alias, builderContext); + UnregisterParameter(inputParameter, builderContext); + + return parameterToHandle; + } + + if (!parameter.Type.IsPrimitive && parameterToHandle.Type != typeof(string)) { //TODO: ExpressionDispacher.Analyze.AnalyzeToString is not complete //This is the standar behaviour in linq2sql, nonetheless the behaviour isn't complete since when the expression //can be executed in the clr, ie: (where new StrangeObject().ToString()) should work. The problem is that //we don't have a reference to the optimizer here. //Working samples in: /Tests/Test_Nunit/ReadTests_Conversions.cs - throw new NotSupportedException("Method ToString can only be translated to SQL for primitive types."); + string message = "Method ToString can only be translated to SQL for primitive types."; + int? select = FirstIndexOf(builderContext.CallStack, "Select"); + int? where = FirstIndexOf(builderContext.CallStack, "Where"); + if ((where ?? int.MaxValue) < (select ?? int.MaxValue)) + // Assume we're generating the .Where() clause, not .Select() + throw new NotSupportedException(message); + // for .Select() + throw new InvalidOperationException(message); } - return Expression.Convert(Analyze(parameter, builderContext), typeof(string), typeof(Convert).GetMethod("ToString", new[] { parameter.Type })); + return Expression.Convert(parameterToHandle, typeof(string), typeof(Convert).GetMethod("ToString", new[] { parameterToHandle.Type })); + } + + static int? FirstIndexOf(Stack callStack, string methodName) + { + int? index = null; + callStack.Where((m, i) => + { + if (m.Name == methodName) + { + index = i; + return true; + } + return false; + }).FirstOrDefault(); + return index; } /// @@ -432,6 +476,21 @@ namespace DbLinq.Data.Linq.Sugar.Implementation var operand0 = Analyze(parameters[0], builderContext); Expression projectionOperand; + if ( builderContext.CurrentSelect.NextSelectExpression != null + || builderContext.CurrentSelect.Operands.Count() > 0 + || builderContext.CurrentSelect.Group.Count > 0 + ) + { + //BuildSelect(builderContext.CurrentSelect, builderContext); + operand0 = new SubSelectExpression(builderContext.CurrentSelect, operand0.Type, "source"); + builderContext.NewParentSelect(); + + // In the new scope we should not have MaximumDatabaseLoad + builderContext.QueryContext.MaximumDatabaseLoad = false; + + builderContext.CurrentSelect.Tables.Add(operand0 as TableExpression); + } + // basically, we have three options for projection methods: // - projection on grouped table (1 operand, a GroupExpression) // - projection on grouped column (2 operands, GroupExpression and ColumnExpression) @@ -464,16 +523,23 @@ namespace DbLinq.Data.Linq.Sugar.Implementation else { var projectionQueryBuilderContext = builderContext.NewSelect(); + var tableExpression = Analyze(parameters[0], projectionQueryBuilderContext); - if (!(tableExpression is TableExpression)) + if (!(tableExpression is TableExpression) && !(tableExpression is EntitySetExpression)) tableExpression = Analyze(tableExpression, projectionQueryBuilderContext); + EntitySetExpression setExpression = tableExpression as EntitySetExpression; + if (setExpression != null) + tableExpression = setExpression.TableExpression; // from here we build a custom clause: // ==> "(select count(*) from where )>0" // TODO (later...): see if some vendors support native Any operator and avoid this substitution if (parameters.Count > 1) { + setExpression = tableExpression as EntitySetExpression; + if (setExpression != null) + tableExpression = setExpression.TableExpression; var anyClause = Analyze(parameters[1], tableExpression, projectionQueryBuilderContext); RegisterWhere(anyClause, projectionQueryBuilderContext); } @@ -482,7 +548,6 @@ namespace DbLinq.Data.Linq.Sugar.Implementation // we now switch back to current context, and compare the result with 0 return projectionQueryBuilderContext.CurrentSelect; - } } @@ -496,7 +561,18 @@ namespace DbLinq.Data.Linq.Sugar.Implementation protected virtual Expression AnalyzeSelect(IList parameters, BuilderContext builderContext) { // just call back the underlying lambda (or quote, whatever) - return Analyze(parameters[1], parameters[0], builderContext); + Expression ex = Analyze(parameters[1], parameters[0], builderContext); + + // http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/1ce25da3-44c6-407d-8395-4c146930004b + if (ex.NodeType == ExpressionType.MemberInit && + builderContext.QueryContext.DataContext.Mapping.GetMetaType(ex.Type) != null) + throw new NotSupportedException( + string.Format("Explicit construction of entity type '{0}' in query is not allowed.", + ex.Type.FullName)); + TableExpression tableExpression = parameters[0] as TableExpression; + if (tableExpression != null && builderContext.CurrentSelect.Tables.Count == 0) + RegisterTable(tableExpression, builderContext); + return ex; } /// @@ -508,7 +584,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation /// protected virtual Expression AnalyzeWhere(IList parameters, BuilderContext builderContext) { - var tablePiece = parameters[0]; + var tablePiece = parameters[0]; RegisterWhere(Analyze(parameters[1], tablePiece, builderContext), builderContext); return tablePiece; } @@ -615,16 +691,25 @@ namespace DbLinq.Data.Linq.Sugar.Implementation //maybe is a static member access like DateTime.Now bool isStaticMemberAccess = memberExpression.Member.GetIsStaticMember(); + var memberInfo = memberExpression.Member; + if (!isStaticMemberAccess && memberInfo.Name == "Count") + return AnalyzeProjectionQuery(SpecialExpressionType.Count, new[] { memberExpression.Expression }, builderContext); + if (!isStaticMemberAccess) // first parameter is object, second is member objectExpression = Analyze(memberExpression.Expression, builderContext); - var memberInfo = memberExpression.Member; // then see what we can do, depending on object type // - MetaTable --> then the result is a table // - Table --> the result may be a column or a join // - Object --> external parameter or table (can this happen here? probably not... to be checked) + EntitySetExpression setExpression = objectExpression as EntitySetExpression; + if (setExpression != null) + { + objectExpression = setExpression.TableExpression; + } + if (objectExpression is MetaTableExpression) { var metaTableExpression = (MetaTableExpression)objectExpression; @@ -645,6 +730,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation { var tableExpression = (TableExpression)objectExpression; + // before finding an association, we check for an EntitySet<> // this will be used in RegisterAssociation Type entityType; @@ -656,18 +742,25 @@ namespace DbLinq.Data.Linq.Sugar.Implementation { // no entitySet? we have right association //if (!isEntitySet) - return queryAssociationExpression; + return queryAssociationExpression; // from here, we may require to cast the table to an entitySet return new EntitySetExpression(queryAssociationExpression, memberInfo.GetMemberType()); } // then, try the column - var queryColumnExpression = RegisterColumn(tableExpression, memberInfo, builderContext); + ColumnExpression queryColumnExpression = RegisterColumn(tableExpression, memberInfo, builderContext); if (queryColumnExpression != null) - return queryColumnExpression; - - if (memberInfo.Name == "Count") - return AnalyzeProjectionQuery(SpecialExpressionType.Count, new[] { memberExpression.Expression }, builderContext); + { + Type storageType = queryColumnExpression.StorageInfo != null ? queryColumnExpression.StorageInfo.GetMemberType() : null; + if (storageType != null && queryColumnExpression.Type != storageType) + { + return Expression.Convert(queryColumnExpression, queryColumnExpression.Type, typeof(Convert).GetMethod("To" + queryColumnExpression.Type.Name, new Type[] { queryColumnExpression.Type })); + } + else + { + return queryColumnExpression; + } + } // then, cry throw Error.BadArgument("S0293: Column must be mapped. Non-mapped columns are not handled by now."); } @@ -717,12 +810,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation return AnalyzeCommonMember(objectExpression, memberInfo, builderContext); } - private Expression AnalyzeTimeSpanMemberAccess(Expression objectExpression, MemberInfo memberInfo) - { - throw new NotImplementedException(); - } - - protected Expression AnalyzeTimeSpamMemberAccess(Expression objectExpression, MemberInfo memberInfo) + protected Expression AnalyzeTimeSpanMemberAccess(Expression objectExpression, MemberInfo memberInfo) { //A timespan expression can be only generated in a c# query as a DateTime difference, as a function call return or as a paramter //this case is for the DateTime difference operation @@ -821,6 +909,8 @@ namespace DbLinq.Data.Linq.Sugar.Implementation return new SpecialExpression(SpecialExpressionType.Second, objectExpression); case "Millisecond": return new SpecialExpression(SpecialExpressionType.Millisecond, objectExpression); + case "Date": + return new SpecialExpression(SpecialExpressionType.Date, objectExpression); default: throw new NotSupportedException(string.Format("DateTime Member access {0} not supported", memberInfo.Name)); } @@ -911,6 +1001,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation var operand = operands[operandIndex]; operands[operandIndex] = Analyze(operand, builderContext); } + return expression.ChangeOperands(operands); } @@ -1088,6 +1179,16 @@ namespace DbLinq.Data.Linq.Sugar.Implementation var expression = Analyze(parameters[0], builderContext); // we select and group by the same criterion var group = new GroupExpression(expression, expression); + if (builderContext.CurrentSelect.NextSelectExpression != null) + { + expression = new SubSelectExpression(builderContext.CurrentSelect, expression.Type, "source"); + builderContext.NewParentSelect(); + + // In the new scope we should not have MaximumDatabaseLoad + builderContext.QueryContext.MaximumDatabaseLoad = false; + + builderContext.CurrentSelect.Tables.Add(expression as TableExpression); + } builderContext.CurrentSelect.Group.Add(group); // "Distinct" method is equivalent to a GroupBy // but for some obscure reasons, Linq expects a IQueryable instead of an IGrouping @@ -1156,6 +1257,18 @@ namespace DbLinq.Data.Linq.Sugar.Implementation var tableExpression = Analyze(parameters[0], builderContext); Expression projectionOperand; + if (builderContext.CurrentSelect.NextSelectExpression != null) + { + TableExpression currentTableExpression = tableExpression as TableExpression; + tableExpression = new SubSelectExpression(builderContext.CurrentSelect, currentTableExpression.Type, "source"); + builderContext.NewParentSelect(); + + // In the new scope we should not have MaximumDatabaseLoad + builderContext.QueryContext.MaximumDatabaseLoad = false; + + builderContext.CurrentSelect.Tables.Add(tableExpression as TableExpression); + } + // basically, we have three options for projection methods: // - projection on grouped table (1 operand, a GroupExpression) // - projection on grouped column (2 operands, GroupExpression and ColumnExpression) @@ -1190,14 +1303,20 @@ namespace DbLinq.Data.Linq.Sugar.Implementation var anyBuilderContext = builderContext.NewSelect(); var tableExpression = Analyze(parameters[0], anyBuilderContext); - if (!(tableExpression is TableExpression)) + if (!(tableExpression is TableExpression) && !(tableExpression is EntitySetExpression)) tableExpression = Analyze(tableExpression, anyBuilderContext); + EntitySetExpression setExpression = tableExpression as EntitySetExpression; + if (setExpression != null) + tableExpression = setExpression.TableExpression; // from here we build a custom clause: // ==> "(select count(*) from
where )>0" // TODO (later...): see if some vendors support native Any operator and avoid this substitution if (parameters.Count > 1) { + setExpression = tableExpression as EntitySetExpression; + if (setExpression != null) + tableExpression = setExpression.TableExpression; var anyClause = Analyze(parameters[1], tableExpression, anyBuilderContext); RegisterWhere(anyClause, anyBuilderContext); } @@ -1252,10 +1371,28 @@ namespace DbLinq.Data.Linq.Sugar.Implementation { if (parameters[0].Type.IsArray) { - var array = Analyze(parameters[0], builderContext); + Expression array = Analyze(parameters[0], builderContext); var expression = Analyze(parameters[1], builderContext); return new SpecialExpression(SpecialExpressionType.In, expression, array); } + else + { + if (typeof(IQueryable).IsAssignableFrom(parameters[0].Type)) + { + Expression p0 = Analyze(parameters[1], builderContext); + BuilderContext newContext = builderContext.NewSelect(); + InputParameterExpression ip1 = new InputParameterExpression(parameters[0], "dummy"); + + Expression p1 = AnalyzeQueryProvider(ip1.GetValue() as QueryProvider, newContext); + ColumnExpression c = p1 as ColumnExpression; + if (!newContext.CurrentSelect.Tables.Contains(c.Table)) + { + newContext.CurrentSelect.Tables.Add(c.Table); + } + // TODO: verify if this is the right place to work + return new SpecialExpression(SpecialExpressionType.In, p0, newContext.CurrentSelect.Mutate(new Expression[] { p1 })); + } + } throw Error.BadArgument("S0548: Can't analyze Contains() method"); } @@ -1299,17 +1436,60 @@ namespace DbLinq.Data.Linq.Sugar.Implementation var queriedType = GetQueriedType(expression); if (queriedType != null) { - + //return new TableExpression(queriedType, DataMapper.GetTableName(queriedType, builderContext.QueryContext.DataContext)); } if (constantExpression.Value is ITable) { var tableType = constantExpression.Type.GetGenericArguments()[0]; - return new TableExpression(tableType, DataMapper.GetTableName(tableType, builderContext.QueryContext.DataContext)); + return CreateTable(tableType, builderContext); + } + else + { + QueryProvider queryProvider = constantExpression.Value as QueryProvider; + if (queryProvider != null) + { + Expression tableExpression = AnalyzeQueryProvider(queryProvider, builderContext.NewQuote()); + return tableExpression; + } } } return expression; } + protected virtual Expression AnalyzeQueryProvider(QueryProvider queryProvider, BuilderContext builderContext) + { + // TODO: check if the QueryProvider qp belong to DataContext present in builderContext.QueryContext.DataContext + // otherwise strange things could happen in the future (I suppose) + + // Build a new Context for the query + ExpressionChain expressions = queryProvider.ExpressionChain; + Expression tableExpression = CreateTableExpression(queryProvider.ExpressionChain.Expressions[0], builderContext); + Expression last = expressions.Last(); + IExpressionLanguageParser languageParser = ObjectFactory.Get(); + foreach (Expression e in expressions) + { + if (e == last) + builderContext.IsExternalInExpressionChain = true; + + // Convert linq Expressions to QueryOperationExpressions and QueryConstantExpressions + // Query expressions language identification + var currentExpression = languageParser.Parse(e, builderContext); + // Query expressions query identification + currentExpression = this.Analyze(currentExpression, tableExpression, builderContext); + + if (!builderContext.IsExternalInExpressionChain) + { + EntitySetExpression setExpression = currentExpression as EntitySetExpression; + if (setExpression != null) + currentExpression = setExpression.TableExpression; + } + tableExpression = currentExpression; + } + + + return tableExpression; + } + protected virtual Expression AnalyzeSelectOperation(SelectOperatorType operatorType, IList parameters, BuilderContext builderContext) { // a special case: if we have several SELECT expressions linked together, @@ -1317,6 +1497,38 @@ namespace DbLinq.Data.Linq.Sugar.Implementation // types and count. builderContext.QueryContext.MaximumDatabaseLoad = true; // all select expression goes to SQL tier +/* */ + var constantExpression = parameters[1] as ConstantExpression; + QueryProvider queryProvider = constantExpression.Value as QueryProvider; + if (queryProvider != null) + { + // Handle second select first + BuilderContext newContext = builderContext.NewSisterSelect(); + Expression tableExpression = AnalyzeQueryProvider(queryProvider, newContext); + BuildSelect(tableExpression, newContext); + + // add the second select select to the chain + if (newContext.CurrentSelect.NextSelectExpression != null) + { + var operand0 = new SubSelectExpression(newContext.CurrentSelect, tableExpression.Type, "source"); + newContext.NewParentSelect(); + newContext.CurrentSelect.Tables.Add(operand0); + } + SelectExpression selectToModify = builderContext.CurrentSelect; + while (selectToModify.NextSelectExpression != null) + selectToModify = selectToModify.NextSelectExpression; + + selectToModify.NextSelectExpression = newContext.CurrentSelect; + selectToModify.NextSelectExpressionOperator = operatorType; + + Expression firstSelection = Analyze(parameters[0], builderContext); + BuildSelect(firstSelection, builderContext); + + return firstSelection; + } + + +/* * var currentSelect = builderContext.CurrentSelect; var nextSelect = new SelectExpression(currentSelect.Parent); builderContext.CurrentSelect = nextSelect; @@ -1333,12 +1545,12 @@ namespace DbLinq.Data.Linq.Sugar.Implementation // /TODO var selectOperandExpression = queryBuilder.BuildSelectExpression(expressionChain, tableExpression, builderContext); builderContext.SelectExpressions.Add(selectOperandExpression); - + nextSelect = builderContext.CurrentSelect; builderContext.CurrentSelect = currentSelect; currentSelect.NextSelectExpression = nextSelect; currentSelect.NextSelectExpressionOperator = operatorType; - +/* */ return Analyze(parameters[0], builderContext); } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Registrar.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Registrar.cs index 44a8d53e265..ab67edd771c 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Registrar.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.Registrar.cs @@ -32,22 +32,12 @@ using System.Linq.Expressions; using System.Reflection; using DbLinq.Util; -#if MONO_STRICT -using System.Data.Linq.Mapping; -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Mapping; using DbLinq.Data.Linq.Sugar; using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { internal partial class ExpressionDispatcher { @@ -100,31 +90,40 @@ namespace DbLinq.Data.Linq.Sugar.Implementation /// protected virtual TableExpression PromoteTable(TableExpression tableExpression, BuilderContext builderContext) { - // 1. Find the table ScopeExpression - SelectExpression oldSelect = FindTableScope(ref tableExpression, builderContext); - if (oldSelect == null) - return null; - // 2. Find a common ScopeExpression - var commonScope = FindCommonScope(oldSelect, builderContext.CurrentSelect); - commonScope.Tables.Add(tableExpression); - return tableExpression; - } - - protected virtual SelectExpression FindTableScope(ref TableExpression tableExpression, BuilderContext builderContext) - { - foreach (var scope in builderContext.SelectExpressions) + int currentIndex = 0; + SelectExpression oldSelect = null; + SelectExpression commonScope = null; + TableExpression foundTable = null; + do { - for (int tableIndex = 0; tableIndex < scope.Tables.Count; tableIndex++) + // take a select + oldSelect = builderContext.SelectExpressions[currentIndex]; + + // look for a common scope + if (oldSelect != builderContext.CurrentSelect) { - if (scope.Tables[tableIndex].IsEqualTo(tableExpression)) - { - tableExpression = scope.Tables[tableIndex]; - scope.Tables.RemoveAt(tableIndex); - return scope; - } + commonScope = FindCommonScope(oldSelect, builderContext.CurrentSelect); + if (commonScope != null) + // if a common scope exists, look for an equivalent table in that select + for (int tableIndex = 0; tableIndex < oldSelect.Tables.Count && foundTable == null; tableIndex++) + { + if (oldSelect.Tables[tableIndex].IsEqualTo(tableExpression)) + { + // found a matching table! + foundTable = oldSelect.Tables[tableIndex]; + } + } } + ++currentIndex; } - return null; + while (currentIndex < builderContext.SelectExpressions.Count && foundTable == null); + + if (foundTable != null) + { + oldSelect.Tables.Remove(foundTable); + commonScope.Tables.Add(foundTable); + } + return foundTable; } /// @@ -143,7 +142,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation return aScope; } } - throw Error.BadArgument("S0127: No common ScopeExpression found"); + return null; } /// @@ -194,7 +193,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation .GetDataMember(memberInfo); if (dataMember == null) return null; - return new ColumnExpression(table, dataMember.MappedName, memberInfo); + return new ColumnExpression(table, dataMember); } /// @@ -383,12 +382,18 @@ namespace DbLinq.Data.Linq.Sugar.Implementation BuilderContext builderContext) { var bindings = new List(); - foreach (var columnExpression in RegisterAllColumns(tableExpression, builderContext)) + + foreach (ColumnExpression columnExpression in RegisterAllColumns(tableExpression, builderContext)) { - var parameterColumn = GetOutputValueReader(columnExpression, - dataRecordParameter, mappingContextParameter, builderContext); - var binding = Expression.Bind(columnExpression.MemberInfo, parameterColumn); - bindings.Add(binding); + MemberInfo memberInfo = columnExpression.StorageInfo ?? columnExpression.MemberInfo; + PropertyInfo propertyInfo = memberInfo as PropertyInfo; + if (propertyInfo == null || propertyInfo.CanWrite) + { + var parameterColumn = GetOutputValueReader(columnExpression, + dataRecordParameter, mappingContextParameter, builderContext); + var binding = Expression.Bind(memberInfo, parameterColumn); + bindings.Add(binding); + } } var newExpression = Expression.New(tableExpression.Type); var initExpression = Expression.MemberInit(newExpression, bindings); @@ -410,8 +415,8 @@ namespace DbLinq.Data.Linq.Sugar.Implementation var bindings = new List(); for (int parameterIndex = 0; parameterIndex < parameters.Count; parameterIndex++) { - var parameter = parameters[parameterIndex]; - var memberInfo = tableType.GetSingleMember(parameter); + var parameter = parameters[parameterIndex]; + var memberInfo = tableType.GetTableColumnMember(parameter); if (memberInfo == null) { memberInfo = tableType.GetSingleMember(parameter, BindingFlags.Public | BindingFlags.NonPublic @@ -481,6 +486,24 @@ namespace DbLinq.Data.Linq.Sugar.Implementation return GetOutputValueReader(expression.Type, valueIndex, dataRecordParameter, mappingContextParameter); } + /// + /// Registers the ColumnExpression as returned by the SQL request. + /// + /// + /// + /// + /// + /// + protected virtual Expression GetOutputValueReader(ColumnExpression expression, + ParameterExpression dataRecordParameter, ParameterExpression mappingContextParameter, + BuilderContext builderContext) + { + int valueIndex = RegisterOutputParameter(expression, builderContext); + Type storageType = expression.StorageInfo != null ? expression.StorageInfo.GetMemberType() : null; + return GetOutputValueReader(storageType ?? expression.Type, valueIndex, dataRecordParameter, mappingContextParameter); + } + + /// /// Registers the expression as returned column /// diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.cs index 7b74ecc82dd..af5c70dcabb 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionDispatcher.cs @@ -30,28 +30,16 @@ using System.Data; using System.Linq; using System.Linq.Expressions; using System.Reflection; -#if MONO_STRICT -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.ExpressionMutator; -using System.Data.Linq.Sugar.Expressions; -using System.Data.Linq.Sugar.Implementation; -using MappingContext = System.Data.Linq.Mapping.MappingContext; -#else + +using DbLinq.Data.Linq.Mapping; using DbLinq.Data.Linq.Sugar; using DbLinq.Data.Linq.Sugar.ExpressionMutator; using DbLinq.Data.Linq.Sugar.Expressions; using DbLinq.Data.Linq.Sugar.Implementation; -using MappingContext = DbLinq.Data.Linq.Mapping.MappingContext; -#endif - using DbLinq.Factory; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { internal partial class ExpressionDispatcher : IExpressionDispatcher { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionLanguageParser.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionLanguageParser.cs index 0f0b597ef3c..21d6eb8b72d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionLanguageParser.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionLanguageParser.cs @@ -30,19 +30,10 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; -#if MONO_STRICT -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.ExpressionMutator; -#else using DbLinq.Data.Linq.Sugar; using DbLinq.Data.Linq.Sugar.ExpressionMutator; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { /// /// Analyzes language patterns and replace them with standard expressions diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionOptimizer.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionOptimizer.cs index cec425e5e2c..efb467261c4 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionOptimizer.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionOptimizer.cs @@ -28,21 +28,11 @@ using System; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.ExpressionMutator; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar; using DbLinq.Data.Linq.Sugar.ExpressionMutator; using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { /// /// Optimizes expressions (such as constant chains) @@ -62,11 +52,90 @@ namespace DbLinq.Data.Linq.Sugar.Implementation expression = AnalyzeNull(expression, builderContext); expression = AnalyzeNot(expression, builderContext); + expression = AnalyzeBinaryBoolean(expression, builderContext); // constant optimization at last, because the previous optimizations may generate constant expressions expression = AnalyzeConstant(expression, builderContext); return expression; } + private Expression AnalyzeBinaryBoolean(Expression expression, BuilderContext builderContext) + { + if (expression.Type != typeof(bool)) + return expression; + var bin = expression as BinaryExpression; + if (bin == null) + return expression; + bool canOptimizeLeft = bin.Left.NodeType == ExpressionType.Constant && bin.Left.Type == typeof(bool); + bool canOptimizeRight = bin.Right.NodeType == ExpressionType.Constant && bin.Right.Type == typeof(bool); + if (canOptimizeLeft && canOptimizeRight) + return Expression.Constant(expression.Evaluate()); + if (canOptimizeLeft || canOptimizeRight) + switch (expression.NodeType) + { + case ExpressionType.AndAlso: + if (canOptimizeLeft) + if ((bool)bin.Left.Evaluate()) + return bin.Right; // (TRUE and X) == X + else + return bin.Left; // (FALSE and X) == FALSE + if (canOptimizeRight) + if ((bool)bin.Right.Evaluate()) + return bin.Left; // (X and TRUE) == X + else + return bin.Right; // (X and FALSE) == FALSE + break; + case ExpressionType.OrElse: + if (canOptimizeLeft) + if ((bool)bin.Left.Evaluate()) + return bin.Left; // (TRUE or X) == TRUE + else + return bin.Right; // (FALSE or X) == X + if (canOptimizeRight) + if ((bool)bin.Right.Evaluate()) + return bin.Right; // (X or TRUE) == TRUE + else + return bin.Left; // (X or FALSE) == X + break; + case ExpressionType.Equal: + // TODO: this optimization should work for Unary Expression Too + // this actually produce errors becouse of string based Sql generation + canOptimizeLeft = canOptimizeLeft && bin.Right is BinaryExpression; + if (canOptimizeLeft) + if ((bool)bin.Left.Evaluate()) + return bin.Right; // (TRUE == X) == X + else + return Expression.Not(bin.Right); // (FALSE == X) == not X + canOptimizeRight = canOptimizeRight && bin.Left is BinaryExpression; + // TODO: this optimization should work for Unary Expression Too + // this actually produce errors becouse of string based Sql generation + if (canOptimizeRight) + if ((bool)bin.Right.Evaluate()) + return bin.Left; // (X == TRUE) == X + else + return Expression.Not(bin.Left); // (X == FALSE) == not X + break; + case ExpressionType.NotEqual: + canOptimizeLeft = canOptimizeLeft && bin.Right is BinaryExpression; + // TODO: this optimization should work for Unary Expression Too + // this actually produce errors becouse of string based Sql generation + if (canOptimizeLeft) + if ((bool)bin.Left.Evaluate()) + return Expression.Not(bin.Right); // (TRUE != X) == not X + else + return bin.Right; // (FALSE != X) == X + canOptimizeRight = canOptimizeRight && bin.Left is BinaryExpression; + // TODO: this optimization should work for Unary Expression Too + // this actually produce errors becouse of string based Sql generation + if (canOptimizeRight) + if ((bool)bin.Right.Evaluate()) + return Expression.Not(bin.Left); // (X != TRUE) == not X + else + return bin.Left; // (X != FALSE) == X + break; + } + return expression; + } + protected virtual Expression AnalyzeConstant(Expression expression, BuilderContext builderContext) { // we try to find a non-constant operand, and if we do, we won't change this expression @@ -75,11 +144,13 @@ namespace DbLinq.Data.Linq.Sugar.Implementation if (!(operand is ConstantExpression)) return expression; } - if (expression is ColumnExpression) + if (expression.NodeType == ExpressionType.Parameter) return expression; - if (expression is TableExpression) + if (expression.NodeType == (ExpressionType)SpecialExpressionType.Like) return expression; - if (expression is ParameterExpression) + // SETuse + // If the value of the first SpecialExpressionType change this 999 should change too + if ((short)expression.NodeType > 999) return expression; // now, we just simply return a constant with new value try @@ -90,7 +161,10 @@ namespace DbLinq.Data.Linq.Sugar.Implementation return optimizedExpression; } // if we fail to evaluate the expression, then just return it - catch (ArgumentException) { } + catch (ArgumentException) + { + return expression; + } return expression; } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionQualifier.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionQualifier.cs index 699c5c1070d..858839deef9 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionQualifier.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/ExpressionQualifier.cs @@ -25,19 +25,10 @@ #endregion using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar; using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { internal class ExpressionQualifier : IExpressionQualifier { @@ -68,6 +59,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation case SpecialExpressionType.Sum: case SpecialExpressionType.Average: case SpecialExpressionType.Count: + case SpecialExpressionType.Exists: case SpecialExpressionType.StringLength: case SpecialExpressionType.ToUpper: case SpecialExpressionType.ToLower: @@ -87,6 +79,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation case SpecialExpressionType.Second: case SpecialExpressionType.Millisecond: case SpecialExpressionType.Now: + case SpecialExpressionType.Date: case SpecialExpressionType.DateDiffInMilliseconds: case SpecialExpressionType.Abs: case SpecialExpressionType.Exp: @@ -238,6 +231,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation case SpecialExpressionType.Second: case SpecialExpressionType.Millisecond: case SpecialExpressionType.Now: + case SpecialExpressionType.Date: case SpecialExpressionType.DateDiffInMilliseconds: case SpecialExpressionType.Abs: case SpecialExpressionType.Exp: diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/LineGrouping.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/LineGrouping.cs index 14977bbd1c4..2c756b4991d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/LineGrouping.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/LineGrouping.cs @@ -28,11 +28,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { internal class LineGrouping : IGrouping { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/PrequelAnalyzer.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/PrequelAnalyzer.cs index 78049448106..a13a5811051 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/PrequelAnalyzer.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/PrequelAnalyzer.cs @@ -26,21 +26,11 @@ using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.ExpressionMutator; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar; using DbLinq.Data.Linq.Sugar.ExpressionMutator; using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { /// /// Analyzes Expressions before translation to SQL, to help the translator diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryBuilder.Upsert.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryBuilder.Upsert.cs index fd39bd722c7..dba0fd8d4f6 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryBuilder.Upsert.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryBuilder.Upsert.cs @@ -30,21 +30,11 @@ using System.Data.Linq.Mapping; using System.Linq.Expressions; using System.Reflection; -#if MONO_STRICT -using System.Data.Linq.Sql; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sql; using DbLinq.Data.Linq.Sugar.Expressions; -#endif - using DbLinq.Util; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { partial class QueryBuilder { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryBuilder.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryBuilder.cs index 29677dff137..b16d82813d6 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryBuilder.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryBuilder.cs @@ -26,26 +26,17 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Linq.Expressions; +using System.Text.RegularExpressions; -#if MONO_STRICT -using System.Data.Linq.Sugar.ExpressionMutator; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar.ExpressionMutator; using DbLinq.Data.Linq.Sugar.Expressions; -#endif -using System.Text.RegularExpressions; using DbLinq.Factory; using DbLinq.Util; -using System.Diagnostics; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { /// /// Full query builder, with cache management @@ -98,7 +89,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation protected virtual IList FindExpressionsByName(string name, BuilderContext builderContext) { var expressions = new List(); - expressions.AddRange(from t in builderContext.EnumerateAllTables() where t.Alias == name select (Expression)t); + expressions.AddRange((from t in builderContext.EnumerateAllTables() where t.Alias == name select (Expression)t).Distinct()); expressions.AddRange(from c in builderContext.EnumerateScopeColumns() where c.Alias == name select (Expression)c); return expressions; } @@ -126,7 +117,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation /// protected virtual void CheckTablesAlias(BuilderContext builderContext) { - var tables = builderContext.EnumerateAllTables().ToList(); + var tables = builderContext.EnumerateAllTables().Distinct().ToList(); // just to be nice: if we have only one table involved, there's no need to alias it if (tables.Count == 1) { @@ -175,7 +166,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation do { externalParameterExpression.Alias = MakeTableName(aliasBase, ++anonymousIndex, builderContext); - } while (FindExpressionsByName(externalParameterExpression.Alias, builderContext).Count != 1); + } while (FindParametersByName(externalParameterExpression.Alias, builderContext).Count > 1); } } } @@ -227,6 +218,12 @@ namespace DbLinq.Data.Linq.Sugar.Implementation // Query expressions query identification currentExpression = ExpressionDispatcher.Analyze(currentExpression, tableExpression, builderContext); + if(! builderContext.IsExternalInExpressionChain) + { + EntitySetExpression setExpression = currentExpression as EntitySetExpression; + if (setExpression != null) + currentExpression = setExpression.TableExpression; + } tableExpression = currentExpression; } ExpressionDispatcher.BuildSelect(tableExpression, builderContext); @@ -292,9 +289,37 @@ namespace DbLinq.Data.Linq.Sugar.Implementation var scopeExpression = builderContext.SelectExpressions[scopeExpressionIndex]; // where clauses + List whereToRemove = new List(); // List of where clausole evaluating TRUE (could be ignored and so removed) + bool falseWhere = false; // true when the full where evaluate to FALSE for (int whereIndex = 0; whereIndex < scopeExpression.Where.Count; whereIndex++) { - scopeExpression.Where[whereIndex] = processor(scopeExpression.Where[whereIndex], builderContext); + Expression whereClausole = processor(scopeExpression.Where[whereIndex], builderContext); + ConstantExpression constantWhereClausole = whereClausole as ConstantExpression; + if (constantWhereClausole != null) + { + if (constantWhereClausole.Value.Equals(false)) + { + falseWhere = true; + break; + } + else if (constantWhereClausole.Value.Equals(true)) + { + whereToRemove.Add(whereIndex); + continue; + } + } + scopeExpression.Where[whereIndex] = whereClausole; + } + if (scopeExpression.Where.Count > 0) + { + if (falseWhere) + { + scopeExpression.Where.Clear(); + scopeExpression.Where.Add(Expression.Equal(Expression.Constant(true), Expression.Constant(false))); + } + else + foreach (int whereIndex in whereToRemove) + scopeExpression.Where.RemoveAt(whereIndex); } // limit clauses @@ -382,36 +407,25 @@ namespace DbLinq.Data.Linq.Sugar.Implementation /// public SelectQuery GetSelectQuery(ExpressionChain expressions, QueryContext queryContext) { - var query = GetFromSelectCache(expressions); + SelectQuery query = null; + if (queryContext.DataContext.QueryCacheEnabled) + { + query = GetFromSelectCache(expressions); + } if (query == null) { -#if DEBUG && !MONO_STRICT - var timer = new Stopwatch(); - timer.Start(); -#endif + Profiler.At("START: GetSelectQuery(), building Expression query"); var expressionsQuery = BuildExpressionQuery(expressions, queryContext); -#if DEBUG && !MONO_STRICT - timer.Stop(); - long expressionBuildTime = timer.ElapsedMilliseconds; + Profiler.At("END: GetSelectQuery(), building Expression query"); - timer.Reset(); - timer.Start(); -#endif + Profiler.At("START: GetSelectQuery(), building Sql query"); query = BuildSqlQuery(expressionsQuery, queryContext); -#if DEBUG && !MONO_STRICT - timer.Stop(); - long sqlBuildTime = timer.ElapsedMilliseconds; -#endif -#if DEBUG && !MONO_STRICT - // generation time statistics - var log = queryContext.DataContext.Log; - if (log != null) + Profiler.At("END: GetSelectQuery(), building Sql query"); + + if (queryContext.DataContext.QueryCacheEnabled) { - log.WriteLine("Select Expression build: {0}ms", expressionBuildTime); - log.WriteLine("Select SQL build: {0}ms", sqlBuildTime); + SetInSelectCache(expressions, query); } -#endif - SetInSelectCache(expressions, query); } return query; } @@ -426,13 +440,20 @@ namespace DbLinq.Data.Linq.Sugar.Implementation /// public virtual Delegate GetTableReader(Type tableType, IList parameters, QueryContext queryContext) { - var reader = GetFromTableReaderCache(tableType, parameters); + Delegate reader = null; + if (queryContext.DataContext.QueryCacheEnabled) + { + reader = GetFromTableReaderCache(tableType, parameters); + } if (reader == null) { var lambda = ExpressionDispatcher.BuildTableReader(tableType, parameters, new BuilderContext(queryContext)); reader = lambda.Compile(); - SetInTableReaderCache(tableType, parameters, reader); + if (queryContext.DataContext.QueryCacheEnabled) + { + SetInTableReaderCache(tableType, parameters, reader); + } } return reader; } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryCache.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryCache.cs index 33028510c43..421a51a1b4d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryCache.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryCache.cs @@ -29,11 +29,7 @@ using System.Collections.Generic; using System.Linq; using DbLinq.Util; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { internal class QueryCache : IQueryCache { @@ -71,7 +67,6 @@ namespace DbLinq.Data.Linq.Sugar.Implementation public SelectQuery GetFromSelectCache(ExpressionChain expressions) { - return null; SelectQuery selectQuery; selectQueries.TryGetValue(expressions, out selectQuery); return selectQuery; diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryRunner.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryRunner.cs index 484b810e362..ce134670991 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryRunner.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/QueryRunner.cs @@ -30,22 +30,16 @@ using System.Collections; using System.Collections.Generic; using System.Reflection; -#if MONO_STRICT -using System.Data.Linq.Sql; -using System.Data.Linq.Sugar.Expressions; -#else +using DbLinq.Data.Linq.Database; using DbLinq.Data.Linq.Sql; using DbLinq.Data.Linq.Sugar.Expressions; -#endif - -using DbLinq.Data.Linq.Database; using DbLinq.Util; #if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else -namespace DbLinq.Data.Linq.Sugar.Implementation +using System.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Sugar.Implementation { internal class QueryRunner : IQueryRunner { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/SpecialExpressionTranslator.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/SpecialExpressionTranslator.cs index 313c0575a95..79078cbc5a6 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/SpecialExpressionTranslator.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/SpecialExpressionTranslator.cs @@ -29,21 +29,11 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar; -using System.Data.Linq.Sugar.ExpressionMutator; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sugar; using DbLinq.Data.Linq.Sugar.ExpressionMutator; using DbLinq.Data.Linq.Sugar.Expressions; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { internal class SpecialExpressionTranslator : ISpecialExpressionTranslator { @@ -118,6 +108,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation case SpecialExpressionType.Hour: case SpecialExpressionType.Minute: case SpecialExpressionType.Millisecond: + case SpecialExpressionType.Date: return GetStandardCallInvoke(specialExpression.SpecialNodeType.ToString(), operands); case SpecialExpressionType.Now: return GetDateTimeNowCall(operands); diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/SqlBuilder.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/SqlBuilder.cs index 9d81320f3ad..301534fd89a 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/SqlBuilder.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/Implementation/SqlBuilder.cs @@ -29,24 +29,14 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sql; -using System.Data.Linq.Sugar.ExpressionMutator; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sql; using DbLinq.Data.Linq.Sugar.ExpressionMutator; using DbLinq.Data.Linq.Sugar.Expressions; -#endif using DbLinq.Factory; using DbLinq.Util; -#if MONO_STRICT -namespace System.Data.Linq.Sugar.Implementation -#else namespace DbLinq.Data.Linq.Sugar.Implementation -#endif { internal class SqlBuilder : ISqlBuilder { @@ -108,6 +98,7 @@ namespace DbLinq.Data.Linq.Sugar.Implementation public SqlStatement Build(SelectExpression selectExpression, QueryContext queryContext) { var translator = GetTranslator(queryContext.DataContext.Vendor.SqlProvider); + var sqlProvider = queryContext.DataContext.Vendor.SqlProvider; selectExpression = translator.OuterExpression(selectExpression); // A scope usually has: @@ -116,11 +107,24 @@ namespace DbLinq.Data.Linq.Sugar.Implementation // - a WHERE: list of conditions // - a GROUP BY: grouping by selected columns // - a ORDER BY: sort + var select = BuildSelect(selectExpression, queryContext); + if (select.ToString() == string.Empty) + { + SubSelectExpression subselect = null; + if (selectExpression.Tables.Count == 1) + subselect = selectExpression.Tables[0] as SubSelectExpression; + if(subselect != null) + return sqlProvider.GetParenthesis(Build(subselect.Select, queryContext)); + } + + // TODO: the following might be wrong (at least this might be the wrong place to do this + if (select.ToString() == string.Empty) + select = new SqlStatement("SELECT " + sqlProvider.GetLiteral(null) + " AS " + sqlProvider.GetSafeName("Empty")); + var tables = GetSortedTables(selectExpression); var from = BuildFrom(tables, queryContext); var join = BuildJoin(tables, queryContext); var where = BuildWhere(tables, selectExpression.Where, queryContext); - var select = BuildSelect(selectExpression, queryContext); var groupBy = BuildGroupBy(selectExpression.Group, queryContext); var having = BuildHaving(selectExpression.Where, queryContext); var orderBy = BuildOrderBy(selectExpression.OrderBy, queryContext); @@ -193,6 +197,18 @@ namespace DbLinq.Data.Linq.Sugar.Implementation if (expression is InputParameterExpression) { var inputParameterExpression = (InputParameterExpression)expression; + if (expression.Type.IsArray) + { + int i = 0; + List inputParameters = new List(); + foreach (object p in (Array)inputParameterExpression.GetValue()) + { + inputParameters.Add(new SqlStatement(new SqlParameterPart(sqlProvider.GetParameterName(inputParameterExpression.Alias + i.ToString()), + inputParameterExpression.Alias + i.ToString()))); + ++i; + } + return new SqlStatement(sqlProvider.GetLiteral(inputParameters.ToArray())); + } return new SqlStatement(new SqlParameterPart(sqlProvider.GetParameterName(inputParameterExpression.Alias), inputParameterExpression.Alias)); @@ -282,7 +298,18 @@ namespace DbLinq.Data.Linq.Sugar.Implementation { if (tableExpression.Alias != null) { - var tableAlias = sqlProvider.GetTableAsAlias(tableExpression.Name, tableExpression.Alias); + string tableAlias; + + // All subqueries has an alias in FROM + SubSelectExpression subquery = tableExpression as SubSelectExpression; + if (subquery == null) + tableAlias = sqlProvider.GetTableAsAlias(tableExpression.Name, tableExpression.Alias); + else + { + var subqueryStatements = new SqlStatement(Build(subquery.Select, queryContext)); + tableAlias = sqlProvider.GetSubQueryAsAlias(subqueryStatements.ToString(), tableExpression.Alias); + } + if ((tableExpression.JoinType & TableJoinType.LeftOuter) != 0) tableAlias = "/* LEFT OUTER */ " + tableAlias; if ((tableExpression.JoinType & TableJoinType.RightOuter) != 0) @@ -432,6 +459,20 @@ namespace DbLinq.Data.Linq.Sugar.Implementation else selectClauses.Add(expressionString); } + SelectExpression selectExp = select as SelectExpression; + if (selectExp != null) + { + if (selectExp.Group.Count == 1 && selectExp.Group[0].GroupedExpression == selectExp.Group[0].KeyExpression) + { + // this is a select DISTINCT expression + // TODO: better handle selected columns on DISTINCT: I suspect this will not work in some cases + if (selectClauses.Count == 0) + { + selectClauses.Add(sqlProvider.GetColumns()); + } + return sqlProvider.GetSelectDistinctClause(selectClauses.ToArray()); + } + } return sqlProvider.GetSelectClause(selectClauses.ToArray()); } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ParameterizedQuery.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ParameterizedQuery.cs index f683e67a875..7e237f92fc0 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ParameterizedQuery.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/ParameterizedQuery.cs @@ -28,19 +28,16 @@ using DbLinq.Util; using DbLinq.Data.Linq.Database; using System.Collections.Generic; -#if MONO_STRICT -using System.Data.Linq.Sql; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sql; using DbLinq.Data.Linq.Sugar.Expressions; -#endif #if MONO_STRICT -namespace System.Data.Linq.Sugar +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Sugar +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Sugar { internal abstract class ParameterizedQuery : AbstractQuery { @@ -62,12 +59,21 @@ namespace DbLinq.Data.Linq.Sugar { var dbParameter = transactionalCommand.Command.CreateParameter(); dbParameter.ParameterName = DataContext.Vendor.SqlProvider.GetParameterName(inputParameter.Alias); - dbParameter.SetValue(inputParameter.GetValue(Target), inputParameter.ValueType); + object value = NormalizeDbType(inputParameter.GetValue(Target)); + dbParameter.SetValue(value, inputParameter.ValueType); transactionalCommand.Command.Parameters.Add(dbParameter); } return transactionalCommand; } + private object NormalizeDbType(object value) + { + System.Data.Linq.Binary b = value as System.Data.Linq.Binary; + if (b != null) + return b.ToArray(); + return value; + } + public object Target { get; set; } } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/QueryContext.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/QueryContext.cs index 88b0744923b..82cf76c74a4 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/QueryContext.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/QueryContext.cs @@ -25,14 +25,14 @@ #endregion #if MONO_STRICT -namespace System.Data.Linq.Sugar +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Sugar +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Sugar { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class QueryContext diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/SelectQuery.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/SelectQuery.cs index 9c6e2214936..521c5afc8f8 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/SelectQuery.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/SelectQuery.cs @@ -30,20 +30,16 @@ using System.Data; using DbLinq.Data.Linq.Database; #if MONO_STRICT -using System.Data.Linq.Sql; -using System.Data.Linq.Sugar.Expressions; -using MappingContext = System.Data.Linq.Mapping.MappingContext; +using System.Data.Linq; #else +using DbLinq.Data.Linq; +#endif + +using DbLinq.Data.Linq.Mapping; using DbLinq.Data.Linq.Sql; using DbLinq.Data.Linq.Sugar.Expressions; -using MappingContext = DbLinq.Data.Linq.Mapping.MappingContext; -#endif -#if MONO_STRICT -namespace System.Data.Linq.Sugar -#else namespace DbLinq.Data.Linq.Sugar -#endif { /// /// Represents a linq query, parsed and compiled, to be sent to database @@ -88,13 +84,29 @@ namespace DbLinq.Data.Linq.Sugar public override ITransactionalCommand GetCommand() { + IDbDataParameter dbParameter; var dbCommand = base.GetCommand(false); foreach (var parameter in InputParameters) { - var dbParameter = dbCommand.Command.CreateParameter(); - dbParameter.ParameterName = DataContext.Vendor.SqlProvider.GetParameterName(parameter.Alias); - dbParameter.Value = parameter.GetValue(); - dbCommand.Command.Parameters.Add(dbParameter); + if (parameter.Type.IsArray) + { + int i = 0; + foreach (object p in (Array)parameter.GetValue()) + { + dbParameter = dbCommand.Command.CreateParameter(); + dbParameter.ParameterName = DataContext.Vendor.SqlProvider.GetParameterName(parameter.Alias + i.ToString()); + dbParameter.Value = p; + dbCommand.Command.Parameters.Add(dbParameter); + ++i; + } + } + else + { + dbParameter = dbCommand.Command.CreateParameter(); + dbParameter.ParameterName = DataContext.Vendor.SqlProvider.GetParameterName(parameter.Alias); + dbParameter.Value = parameter.GetValue(); + dbCommand.Command.Parameters.Add(dbParameter); + } } return dbCommand; } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/UpsertQuery.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/UpsertQuery.cs index ba91ab17965..7f20e6c6efe 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/UpsertQuery.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Sugar/UpsertQuery.cs @@ -25,19 +25,17 @@ #endregion using System.Collections.Generic; -#if MONO_STRICT -using System.Data.Linq.Sql; -using System.Data.Linq.Sugar.Expressions; -#else + using DbLinq.Data.Linq.Sql; using DbLinq.Data.Linq.Sugar.Expressions; -#endif #if MONO_STRICT -namespace System.Data.Linq.Sugar +using System.Data.Linq; #else -namespace DbLinq.Data.Linq.Sugar +using DbLinq.Data.Linq; #endif + +namespace DbLinq.Data.Linq.Sugar { internal class UpsertQuery : ParameterizedQuery { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Table.Extended.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Table.Extended.cs index ee796d78576..0e7b6048877 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Table.Extended.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Table.Extended.cs @@ -27,11 +27,7 @@ using System.Collections.Generic; using System.Linq; -#if MONO_STRICT -namespace System.Data.Linq -#else namespace DbLinq.Data.Linq -#endif { /// /// T may be eg. class Employee or string - the output diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Table.cs b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Table.cs index c9ab7c9bdc8..7dbfab8d6cd 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Table.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Data/Linq/Table.cs @@ -36,17 +36,14 @@ using System.Linq.Expressions; using System.ComponentModel; #if MONO_STRICT -using System.Data.Linq.Implementation; -using System.Data.Linq.Sugar; using ITable = System.Data.Linq.ITable; #else -using DbLinq.Data.Linq.Implementation; -using DbLinq.Data.Linq.Sugar; using ITable = DbLinq.Data.Linq.ITable; #endif using DbLinq; - +using DbLinq.Data.Linq.Implementation; +using DbLinq.Data.Linq.Sugar; #if MONO_STRICT namespace System.Data.Linq @@ -257,7 +254,7 @@ namespace DbLinq.Data.Linq void ITable.AttachAll(IEnumerable entities, bool asModified) { foreach (var entity in entities) - Context.RegisterUpdate(entity); + Context.RegisterUpdate(entity, asModified ? null : entity); } /// diff --git a/mcs/class/System.Data.Linq/src/DbLinq/DbLinq.csproj b/mcs/class/System.Data.Linq/src/DbLinq/DbLinq.csproj index 0b03e6a841d..94e391eda54 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/DbLinq.csproj +++ b/mcs/class/System.Data.Linq/src/DbLinq/DbLinq.csproj @@ -27,7 +27,7 @@ pdbonly true ..\..\build\ - TRACE;DEBUG + TRACE prompt 4 @@ -163,6 +163,7 @@ + @@ -240,6 +241,7 @@ + diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Factory/DbLinqAttribute.cs b/mcs/class/System.Data.Linq/src/DbLinq/Factory/DbLinqAttribute.cs index 97026a16eb2..838cf78af17 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Factory/DbLinqAttribute.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Factory/DbLinqAttribute.cs @@ -32,9 +32,7 @@ namespace DbLinq.Factory /// This class is used by ReflectionObjectFactory to determine if the interfaces come from a DbLinq assembly /// [AttributeUsage(AttributeTargets.Assembly)] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class DbLinqAttribute : Attribute diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Factory/IObjectFactory.cs b/mcs/class/System.Data.Linq/src/DbLinq/Factory/IObjectFactory.cs index a9858b94a25..025a1fd9af9 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Factory/IObjectFactory.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Factory/IObjectFactory.cs @@ -32,9 +32,7 @@ namespace DbLinq.Factory /// The object factory is the start point for DbLinq main factory. /// See ObjectFactory.Current for details /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface IObjectFactory diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Factory/ObjectFactory.cs b/mcs/class/System.Data.Linq/src/DbLinq/Factory/ObjectFactory.cs index 82ac45e414e..388af61521d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Factory/ObjectFactory.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Factory/ObjectFactory.cs @@ -29,9 +29,7 @@ namespace DbLinq.Factory /// Object factory. Main objects (most of them are stateless) are created with this class /// This may allow later to inject dependencies with a third party injector (I'm a Spring.NET big fan) /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif static class ObjectFactory diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Language/Implementation/AbstractEndPluralWords.cs b/mcs/class/System.Data.Linq/src/DbLinq/Language/Implementation/AbstractEndPluralWords.cs index 6f0b721adeb..af2efc268ee 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Language/Implementation/AbstractEndPluralWords.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Language/Implementation/AbstractEndPluralWords.cs @@ -29,9 +29,7 @@ namespace DbLinq.Language.Implementation /// /// Words with singular/plural capacity, changed in the end /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif abstract class AbstractEndPluralWords : AbstractWords diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Language/Implementation/AbstractWords.cs b/mcs/class/System.Data.Linq/src/DbLinq/Language/Implementation/AbstractWords.cs index fe628889a0c..fcbe0ffc661 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Language/Implementation/AbstractWords.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Language/Implementation/AbstractWords.cs @@ -34,12 +34,10 @@ namespace DbLinq.Language.Implementation /// /// Offer base mechanisms for words based languages (== all) /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - abstract class AbstractWords : ILanguageWords + abstract class AbstractWords : ILanguageWords { /// /// Words and corresponding weights diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Logging/ILogger.cs b/mcs/class/System.Data.Linq/src/DbLinq/Logging/ILogger.cs deleted file mode 100644 index 820e8c202bd..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Logging/ILogger.cs +++ /dev/null @@ -1,52 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion -namespace DbLinq.Logging -{ - /// - /// Basic logging. Use this in place of Console, Debug and Trace. - /// -#if MONO_STRICT - internal -#else - public -#endif - interface ILogger - { - /// - /// Writes a line - /// - /// - /// - void Write(Level level, string text); - /// - /// Writes a line with formatting - /// - /// - /// - /// - void Write(Level level, string format, params object[] parameters); - } -} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Logging/Implementation/ConsoleDebugLogger.cs b/mcs/class/System.Data.Linq/src/DbLinq/Logging/Implementation/ConsoleDebugLogger.cs deleted file mode 100644 index 3e2c0c42964..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Logging/Implementation/ConsoleDebugLogger.cs +++ /dev/null @@ -1,85 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion -using System; -using System.Diagnostics; - -namespace DbLinq.Logging.Implementation -{ -#if MONO_STRICT - internal -#else - public -#endif - class ConsoleLogger : Logger - { - public override void Write(Level level, string text) - { - ConsoleColor prevColor = Console.ForegroundColor; - switch (level) - { - case Level.Debug: - Console.ForegroundColor = ConsoleColor.Blue; - break; - case Level.Information: - Console.ResetColor(); - break; - case Level.Warning: - Console.ForegroundColor = ConsoleColor.Yellow; - break; - case Level.Error: - Console.ForegroundColor = ConsoleColor.Red; - break; - default: - throw new ArgumentOutOfRangeException("level"); - } - Console.WriteLine(text); - Console.ForegroundColor = prevColor; - // picrap --> jiri: this is probably not the right place, maybe shall we find something else? - text = text.Replace("System.String", "string"); - text = text.Replace("System.Int32", "int"); - text = text.Replace("DbLinq.Linq.", ""); - text = text.Replace("System.Linq.", ""); - text = text.Replace("nwind.", ""); - Debug.WriteLine(string.Format("{0:u} {1}", DateTime.Now, text)); - //Debug.WriteLine(text); - } - } - //class DebugLogger : Logger - //{ - // public override void Write(Level level, string text) - // { - // //Console.WriteLine(text); - // // picrap --> jiri: this is probably not the right place, maybe shall we find something else? - // text = text.Replace("System.String", "string"); - // text = text.Replace("System.Int32", "int"); - // text = text.Replace("DbLinq.Linq.", ""); - // text = text.Replace("System.Linq.", ""); - // text = text.Replace("nwind.", ""); - // Debug.WriteLine(string.Format("{0:u} {1}", DateTime.Now, text)); - // //Debug.WriteLine(text); - // } - //} -} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Logging/Implementation/Logger.cs b/mcs/class/System.Data.Linq/src/DbLinq/Logging/Implementation/Logger.cs deleted file mode 100644 index a796f8f0b5f..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Logging/Implementation/Logger.cs +++ /dev/null @@ -1,42 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion -namespace DbLinq.Logging.Implementation -{ -#if MONO_STRICT - internal -#else - public -#endif - abstract class Logger : ILogger - { - public abstract void Write(Level level, string text); - - public void Write(Level level, string format, params object[] parameters) - { - Write(level, string.Format(format, parameters)); - } - } -} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Logging/Level.cs b/mcs/class/System.Data.Linq/src/DbLinq/Logging/Level.cs deleted file mode 100644 index e704eab7595..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Logging/Level.cs +++ /dev/null @@ -1,43 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion -namespace DbLinq.Logging -{ - /// - /// Logging level, used by ILogger.Write - /// -#if MONO_STRICT - internal -#else - public -#endif - enum Level - { - Debug, - Information, - Warning, - Error, - } -} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/AssociationName.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/AssociationName.cs index eb3137d6bf7..2ac6eb4597e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/AssociationName.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/AssociationName.cs @@ -28,9 +28,7 @@ namespace DbLinq.Schema /// /// Contains both parts for association name /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class AssociationName : Name diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Case.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Case.cs index d716818595d..dddff6a4593 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Case.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Case.cs @@ -29,9 +29,7 @@ namespace DbLinq.Schema /// /// Represent a case model /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif enum Case diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/ColumnName.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/ColumnName.cs index 56e804f24b3..a9e02671eed 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/ColumnName.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/ColumnName.cs @@ -28,9 +28,7 @@ namespace DbLinq.Schema /// /// A column maps to a property /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class ColumnName : Name diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/ArrayAdapter.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/ArrayAdapter.cs index 0d9df6cfb54..081f35af69e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/ArrayAdapter.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/ArrayAdapter.cs @@ -40,9 +40,7 @@ namespace DbLinq.Schema.Dbml.Adapter /// /// [DebuggerDisplay("{reflectedMember}")] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class ArrayAdapter : ISimpleList diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/CsvArrayAdapter.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/CsvArrayAdapter.cs index 88b9f34ad90..780513de073 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/CsvArrayAdapter.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/CsvArrayAdapter.cs @@ -33,9 +33,7 @@ namespace DbLinq.Schema.Dbml.Adapter /// /// Wraps a CSV string to an array /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class CsvArrayAdapter : ArrayAdapter diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/EnumType.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/EnumType.cs index a2cc44f04ac..8d2a5f67e81 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/EnumType.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/EnumType.cs @@ -32,9 +32,7 @@ using DbLinq.Util; namespace DbLinq.Schema.Dbml.Adapter { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class EnumType : IDictionary, INamedType diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/INamedType.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/INamedType.cs index 1808bd4b2cd..1bced5e9b3e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/INamedType.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/INamedType.cs @@ -29,9 +29,7 @@ namespace DbLinq.Schema.Dbml.Adapter /// /// A INamedType is a literally named type /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface INamedType diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/ISimpleList.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/ISimpleList.cs index 06f8cab2fbe..f26be0c7e5e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/ISimpleList.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/Adapter/ISimpleList.cs @@ -33,9 +33,7 @@ namespace DbLinq.Schema.Dbml.Adapter /// sort of light IList<> /// /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface ISimpleList : IEnumerable diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/DbmlSerializer.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/DbmlSerializer.cs index 7a6777c8e25..790f254a47d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/DbmlSerializer.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Dbml/DbmlSerializer.cs @@ -35,9 +35,7 @@ namespace DbLinq.Schema.Dbml /// /// Serializes DBML /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif static class DbmlSerializer diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/INameFormatter.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/INameFormatter.cs index b4c2b93a974..685aed39e3b 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/INameFormatter.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/INameFormatter.cs @@ -29,9 +29,7 @@ namespace DbLinq.Schema /// /// Allows to manipulate words /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface INameFormatter diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Implementation/NameFormatter.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Implementation/NameFormatter.cs index 8c3ae76a754..6933f8c9320 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Implementation/NameFormatter.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Implementation/NameFormatter.cs @@ -442,7 +442,7 @@ namespace DbLinq.Schema.Implementation associationName.ManyToOneMemberName = Format(words, dbOneName, nameFormat.Case, GetSingularization(Singularization.Singular, nameFormat)); // TODO: this works only for PascalCase if (dbManyName == dbOneName) - associationName.ManyToOneMemberName = foreignKeyName + associationName.ManyToOneMemberName; + associationName.ManyToOneMemberName = foreignKeyName.Replace(',', '_') + associationName.ManyToOneMemberName; // TODO: support new extraction associationName.OneToManyMemberName = Format(words, dbManyName, nameFormat.Case, GetSingularization(Singularization.Plural, nameFormat)); return associationName; diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Name.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Name.cs index 80cc90dc706..ba44a7de01b 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/Name.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/Name.cs @@ -31,9 +31,7 @@ namespace DbLinq.Schema /// /// Base name class, with DB name and words contained /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class Name diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/NameFormat.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/NameFormat.cs index cd5d265ea34..be0b1c51bb5 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/NameFormat.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/NameFormat.cs @@ -31,9 +31,7 @@ namespace DbLinq.Schema /// /// Determines how names must be formated, when extracting from database /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class NameFormat diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/ParameterName.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/ParameterName.cs index 6216bd225dd..0163ca10d57 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/ParameterName.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/ParameterName.cs @@ -26,9 +26,7 @@ namespace DbLinq.Schema { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class ParameterName : Name diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/ProcedureName.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/ProcedureName.cs index 2f932dc45d1..8542b3c8816 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/ProcedureName.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/ProcedureName.cs @@ -26,9 +26,7 @@ namespace DbLinq.Schema { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class ProcedureName : Name diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/SchemaName.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/SchemaName.cs index 1f142ef4771..9db0ffecb51 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/SchemaName.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/SchemaName.cs @@ -26,9 +26,7 @@ namespace DbLinq.Schema { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class SchemaName : Name diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/TableName.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/TableName.cs index d8ef9b94afc..9ca177835d1 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/TableName.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/TableName.cs @@ -26,9 +26,7 @@ namespace DbLinq.Schema { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class TableName : Name diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Schema/WordsExtraction.cs b/mcs/class/System.Data.Linq/src/DbLinq/Schema/WordsExtraction.cs index 4e211630114..bf2d8613ef1 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Schema/WordsExtraction.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Schema/WordsExtraction.cs @@ -29,9 +29,7 @@ namespace DbLinq.Schema /// /// Determines how to extract words from a given text /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif enum WordsExtraction diff --git a/mcs/class/System.Data.Linq/src/DbLinq/System.Data.Linq.csproj b/mcs/class/System.Data.Linq/src/DbLinq/System.Data.Linq.csproj index 4c038f0541b..811b8a4596c 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/System.Data.Linq.csproj +++ b/mcs/class/System.Data.Linq/src/DbLinq/System.Data.Linq.csproj @@ -199,6 +199,7 @@ + @@ -325,6 +326,7 @@ + diff --git a/mcs/class/System.Data.Linq/src/DbLinq/System.Data.Linq/DataLoadOptions.cs b/mcs/class/System.Data.Linq/src/DbLinq/System.Data.Linq/DataLoadOptions.cs deleted file mode 100644 index 116e1679886..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/System.Data.Linq/DataLoadOptions.cs +++ /dev/null @@ -1,61 +0,0 @@ -// -// DataLoadOptions.cs -// -// Author: -// Atsushi Enomoto -// -// Copyright (C) 2008 Novell, Inc. -// - -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -using System; -using System.Linq.Expressions; - -namespace System.Data.Linq -{ - public sealed class DataLoadOptions - { - [MonoTODO] - public void AssociateWith (Expression> expression) - { - throw new NotImplementedException (); - } - - [MonoTODO] - public void AssociateWith (LambdaExpression expression) - { - throw new NotImplementedException (); - } - - [MonoTODO] - public void LoadWith (Expression> expression) - { - throw new NotImplementedException (); - } - - [MonoTODO] - public void LoadWith (LambdaExpression expression) - { - throw new NotImplementedException (); - } - } -} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/AttributeMappingSourceTest.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/AttributeMappingSourceTest.cs new file mode 100755 index 00000000000..64c36881d41 --- /dev/null +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/AttributeMappingSourceTest.cs @@ -0,0 +1,82 @@ +#region MIT license +// +// MIT license +// +// Copyright (c) 2009 Novell, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Data.SqlClient; +using System.IO; +using System.Linq; +using System.Reflection; + +using System.Data.Linq.Mapping; + +#if MONO_STRICT +using System.Data.Linq; +using AttributeMappingSource = System.Data.Linq.Mapping.AttributeMappingSource; +#else +using DbLinq.Data.Linq; +using AttributeMappingSource = DbLinq.Data.Linq.Mapping.AttributeMappingSource; +#endif + +using DbLinq.Null; +using NUnit.Framework; + +namespace DbLinqTest +{ + [Table(Name = "dbo...FooTable")] + class Foo + { + [Column(Name="Col1")] + public string Column1 { get; set; } + } + + [Database(Name = "MyDB1")] + class MyDataContext2 : DataContext + { + public MyDataContext2() + : base(new SqlConnection("Data Source=localhost")) + { + } + + public Table FooTable { get { return GetTable(); } } + public Table FooFieldTable; + } + + [TestFixture] + public class AttributeMappingSourceTest + { + [Test] + public void CreateModel_GetTables_Has_No_Duplicates() + { + var model = new AttributeMappingSource().GetModel(typeof(MyDataContext2)); + var tables = model.GetTables().ToList(); + Assert.AreEqual(1, tables.Count); + Assert.AreEqual("dbo...FooTable", tables[0].TableName); + } + } +} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/DataContextTest.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/DataContextTest.cs index d5cbb2b8cb5..3b1fd709f5b 100755 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/DataContextTest.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/DataContextTest.cs @@ -147,7 +147,19 @@ namespace DbLinqTest { new DataContext("", mapping); } -#if !MONO_STRICT +#if L2SQL + // DbLinqProvider/etc. obviously aren't removed under L2SQL + [ExpectedException(typeof(ArgumentException))] +#endif + [Test] + public void Ctor_ConnectionString_ExtraParameters_Munging() + { + DataContext ctx = new DataContext("Server=localhost;User id=test;Database=test;DbLinqProvider=Sqlite;DbLinqConnectionType=Mono.Data.Sqlite.SqliteConnection, Mono.Data.Sqlite"); + Assert.AreEqual(-1, ctx.Connection.ConnectionString.IndexOf("DbLinqProvider")); + Assert.AreEqual(-1, ctx.Connection.ConnectionString.IndexOf("DbLinqConnectionType")); + } + +#if !L2SQL [Test, ExpectedException(typeof(NotImplementedException))] public void Ctor_FileOrServerOrConnectionIsFilename() { @@ -172,7 +184,7 @@ namespace DbLinqTest { DataContext dc = new DataContext(connection); Assert.AreEqual(connection, dc.Connection); -#if !MONO_STRICT +#if !L2SQL dc = new DataContext (new DummyConnection()); Assert.AreEqual(null, dc.Connection); #endif diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/DbLinqTest.csproj b/mcs/class/System.Data.Linq/src/DbLinq/Test/DbLinqTest.csproj deleted file mode 100644 index bc1324f2a59..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/DbLinqTest.csproj +++ /dev/null @@ -1,98 +0,0 @@ - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {9F424D05-5F16-4C01-8C17-14EF22FF2174} - Library - Properties - DbLinqTest - DbLinqTest - v3.5 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - true - ..\..\src\DbLinq.snk - - - true - full - false - ..\..\..\build.dbg\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - ..\..\..\build\ - TRACE - prompt - 4 - - - - - - False - ..\..\..\lib\MySql.Data.dll - - - False - ..\..\..\lib\nunit.framework.dll - - - - - 3.5 - - - - 3.5 - - - 3.5 - - - - - - 3.5 - - - - - - - - - - - - - - - {7950197D-4122-49CB-9FD7-45E666BAFEC2} - DbLinq - - - {363FF43D-C870-4423-BE50-DAED7793A6D1} - DbMetal - - - - - Properties\DbLinq.snk - - - - - diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/DbLinq_test.csproj b/mcs/class/System.Data.Linq/src/DbLinq/Test/DbLinq_test.csproj index a82100c8213..57de10c5deb 100755 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/DbLinq_test.csproj +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/DbLinq_test.csproj @@ -71,6 +71,7 @@ + diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/DbLinq_test_ndb_strict.csproj b/mcs/class/System.Data.Linq/src/DbLinq/Test/DbLinq_test_ndb_strict.csproj index fd3db689e9a..92a13c68a13 100755 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/DbLinq_test_ndb_strict.csproj +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/DbLinq_test_ndb_strict.csproj @@ -35,7 +35,7 @@ full false ..\..\..\build.dbg\ - TRACE;DEBUG;MONO_STRICT + TRACE;DEBUG;MONO_STRICT;L2SQL prompt 4 true @@ -45,7 +45,7 @@ pdbonly true ..\..\..\build\ - TRACE;MONO_STRICT + TRACE;MONO_STRICT;L2SQL prompt 4 @@ -70,6 +70,7 @@ + diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/EntitySetTest.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/EntitySetTest.cs index 9638abbb8c0..53b694c1f39 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/EntitySetTest.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/EntitySetTest.cs @@ -23,6 +23,13 @@ namespace DbLinqTest new EntitySet(null, null); } + [Test, ExpectedException(typeof(ArgumentNullException))] + public void Add_EntityNull() + { + var people = new EntitySet(); + people.Add(null); + } + [Test] public void Add_IgnoreRepeats() { @@ -291,6 +298,30 @@ namespace DbLinqTest new ListChangedEventArgs(ListChangedType.ItemAdded, 0, -1)); } + [Test] + public void Remove() + { + var people = new EntitySet(); + var events = new List(); + people.ListChanged += (o, e) => events.Add(e); + + people.SetSource(new[]{ + new Person { FirstName = "(", LastName = ")" }, + }); + Assert.IsTrue(people.IsDeferred); + Assert.IsFalse(people.Remove(null)); + AssertEqual(events); + events.Clear(); + Assert.IsTrue(people.IsDeferred); + + var p = people[0]; + Assert.IsTrue(people.Remove(p)); + Assert.IsFalse(people.IsDeferred); + Assert.AreEqual(0, people.Count); + AssertEqual(events, + new ListChangedEventArgs(ListChangedType.ItemDeleted, 0, -1)); + } + [Test] public void SanityChecking() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Attach.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Attach.cs index 682602e7cfb..ecbd7dc0e69 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Attach.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Attach.cs @@ -21,7 +21,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -41,6 +41,9 @@ using nwind; db1.Employees.Attach(employee); } +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] [ExpectedException(typeof(NotSupportedException))] public void Attach02() @@ -83,6 +86,9 @@ using nwind; db1.Employees.AttachAll(employees); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] [ExpectedException(typeof(ChangeConflictException))] public void NotExistingAttatch() diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/CompositePK_Test.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/CompositePK_Test.cs index 21508ddb5bf..5d789662008 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/CompositePK_Test.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/CompositePK_Test.cs @@ -46,7 +46,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -57,6 +57,8 @@ using nwind; [TestFixture] public class CompositePK_Test : TestBase { + const short TestQuantity = short.MaxValue; + protected void cleanup(Northwind db) { try @@ -70,7 +72,7 @@ using nwind; tableName = ((System.Data.Linq.Mapping.TableAttribute)obj).Name; } } - string sql = string.Format("DELETE FROM {0} WHERE OrderID=3 AND ProductID=2", tableName); + string sql = string.Format("DELETE FROM {0} WHERE Quantity={1}", tableName, TestQuantity); db.ExecuteCommand(sql); } catch (Exception) @@ -98,34 +100,40 @@ using nwind; Northwind db = CreateDB(); cleanup(db); + var order = db.Orders.First(); + var product = db.Products.First(); + + var startUnitPrice = 33000; + var endUnitPrice = 34000; + var orderDetail = new OrderDetail { - OrderID = 3, - ProductID = 2, - UnitPrice = 20 + OrderID = order.OrderID, + ProductID = product.ProductID, + Quantity = TestQuantity, + UnitPrice = startUnitPrice }; db.OrderDetails.InsertOnSubmit(orderDetail); db.SubmitChanges(); - orderDetail.UnitPrice = 40; + orderDetail.UnitPrice = endUnitPrice; db.SubmitChanges(); OrderDetail orderDetail2 = (from c in db.OrderDetails - where c.UnitPrice == 40 + where c.UnitPrice == endUnitPrice select c).Single(); Assert.IsTrue(object.ReferenceEquals(orderDetail, orderDetail2), "Must be same object"); - Assert.AreEqual(3, orderDetail2.OrderID); - Assert.AreEqual(2, orderDetail2.ProductID); - Assert.AreEqual(40, orderDetail2.UnitPrice); + Assert.AreEqual(order.OrderID, orderDetail2.OrderID); + Assert.AreEqual(product.ProductID, orderDetail2.ProductID); + Assert.AreEqual(endUnitPrice, orderDetail2.UnitPrice); db.OrderDetails.DeleteOnSubmit(orderDetail); db.SubmitChanges(); } - [Test] public void CP3_DeleteTableWithCompositePK() { @@ -133,7 +141,14 @@ using nwind; cleanup(db); int initialCount = db.OrderDetails.Count(); - var orderDetail = new OrderDetail { OrderID = 2, ProductID = 2 }; + var order = db.Orders.First(); + var product = db.Products.First(); + + var orderDetail = new OrderDetail { + OrderID = order.OrderID, + ProductID = product.ProductID, + Quantity = TestQuantity + }; db.OrderDetails.InsertOnSubmit(orderDetail); db.SubmitChanges(); @@ -144,6 +159,9 @@ using nwind; Assert.AreEqual(db.OrderDetails.Count(), initialCount); } +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] [ExpectedException(typeof(ChangeConflictException))] public void CP4_UnchangedColumnShouldNotUpdated() @@ -169,10 +187,11 @@ using nwind; public void CP5_Composite_ObjectIdentity() { Northwind db = CreateDB(); - var q = db.OrderDetails.Where(od => od.ProductID == 2 && od.OrderID == 1); + + var d = db.OrderDetails.First(); + var q = db.OrderDetails.Where(od => od.ProductID == d.ProductID && od.OrderID == d.OrderID); OrderDetail row1 = q.Single(); - OrderDetail row2 = q.Single(); - Assert.IsTrue(object.ReferenceEquals(row1, row2)); + Assert.IsTrue(object.ReferenceEquals(d, row1)); } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DataContext.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DataContext.cs index b71aa3cb155..c9bea8ea40c 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DataContext.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DataContext.cs @@ -50,7 +50,7 @@ using MsNorthwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DataLoadOptions_Test.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DataLoadOptions_Test.cs index 278c7dcd13c..9cc59f9b771 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DataLoadOptions_Test.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DataLoadOptions_Test.cs @@ -37,7 +37,7 @@ namespace nwind namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -88,6 +88,9 @@ namespace nwind new DataLoadOptions().LoadWith (o => o.Customer.Orders); } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test] [ExpectedException(typeof(InvalidOperationException))] public void LoadWith_BadCycles1() @@ -97,6 +100,9 @@ namespace nwind lo.LoadWith(o => o.Customer); } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test] [ExpectedException(typeof(InvalidOperationException))] public void LoadWith_BadCycles2() diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DynamicLinqTest.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DynamicLinqTest.cs index 044da874a34..d048f3a32f2 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DynamicLinqTest.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/DynamicLinqTest.cs @@ -48,7 +48,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -200,8 +200,9 @@ using nwind; Northwind db = CreateDB(); var predicate = PredicateBuilder.True(); predicate = predicate.And(m => m.City == "Paris"); - int count = db.Customers.Count(predicate); - Assert.AreEqual(1, count); + int predicateCount = db.Customers.Count(predicate); + int normalCount = db.Customers.Where(c => c.City == "Paris").Count(); + Assert.AreEqual(normalCount, predicateCount); } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ExecuteCommand_Test.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ExecuteCommand_Test.cs index 8f8c728a31c..87bf3d8cdee 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ExecuteCommand_Test.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ExecuteCommand_Test.cs @@ -47,7 +47,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -58,19 +58,27 @@ using nwind; [TestFixture] public class ExecuteCommand_Test : TestBase { +#if !DEBUG && (MSSQL && L2SQL) + // DataContext.ExecuteScalar() working with 'SELECT COUNT(*)' is a DbLinq extension. + // Exclude from Linq2Sql comparison tests. + [Explicit] +#endif [Test] public void A2_ProductsTableHasEntries() { Northwind db = CreateDB(); - //string sql = "SELECT count(*) FROM Northwind.Products"; - int result = db.ExecuteCommand("SELECT count(*) FROM Products"); - //long iResult = base.ExecuteScalar(sql); + int result = db.ExecuteCommand("SELECT count(*) FROM \"Products\""); Assert.Greater(result, 0, "Expecting some rows in Products table, got:" + result); } /// /// like above, but includes one parameter. /// +#if !DEBUG && (MSSQL && L2SQL) + // DataContext.ExecuteScalar() working with 'SELECT COUNT(*)' is a DbLinq extension. + // Exclude from Linq2Sql comparison tests. + [Explicit] +#endif [Test] public void A3_ProductCount_Param() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ExecuteQuery_Test.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ExecuteQuery_Test.cs index a3fc265957c..ea375055d7e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ExecuteQuery_Test.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ExecuteQuery_Test.cs @@ -20,7 +20,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Advanced.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Advanced.cs index 2093f3f2748..d0433c234ad 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Advanced.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Advanced.cs @@ -48,7 +48,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples @@ -173,9 +173,16 @@ using nwind; Category customerReloaded=db.Categories.First(c=>c.CategoryID==con.CategoryID); Assert.AreEqual(customerReloaded.CategoryName, con.CategoryName); Assert.AreEqual(customerReloaded.Description, con.Description); + + // cleanup + db.Categories.DeleteOnSubmit(con); + db.SubmitChanges(); } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test(Description = "This sample uses orderbyDescending and Take to return the discontinued products of the top 10 most expensive products")] public void LinqToSqlAdvanced06() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Conversion_Operators.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Conversion_Operators.cs index c731aa02bc4..4c6ec1ce077 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Conversion_Operators.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Conversion_Operators.cs @@ -47,7 +47,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples @@ -93,6 +93,9 @@ using nwind; Assert.IsTrue(list.Length > 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test(Description = "ToList. This sample uses ToList to immediately evaluate a query into a List(Of T).")] public void LinqToSqlConversions03() { @@ -108,7 +111,9 @@ using nwind; Assert.IsTrue(qList.Count > 0); } - +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Linq101SamplesModified("Strange short to boolean casting, perhaps in the original Northwind Product.Discontinued was a boolean property")] [Test(Description = "ToDictionary. This sample uses ToDictionary to immediately evaluate a query and a key expression into an Dictionary(Of K, T).")] public void LinqToSqlConversion04() diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Count_Sum_Min_Max_Avg.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Count_Sum_Min_Max_Avg.cs index 2a7b0215cf7..be1a95b772f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Count_Sum_Min_Max_Avg.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Count_Sum_Min_Max_Avg.cs @@ -20,7 +20,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples @@ -44,6 +44,9 @@ using nwind; Assert.IsTrue(q > 0, "Expect non-zero count"); } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test] public void LinqToSqlCount02() { @@ -91,6 +94,9 @@ using nwind; Assert.IsTrue(q > 0, "Freight sum must be > 0"); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "This sample uses Min to find the Products that have the lowest unit price in each category")] public void LinqToSqlCount07() { @@ -182,6 +188,9 @@ WHERE ([t0].[UnitPrice] = @x2) AND (((@x1 IS NULL) AND ([t0].[CategoryID] IS NUL Assert.IsTrue(q > 0, "Max UnitsInStock must be > 0"); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "This sample uses Max to find the Products that have the highest unit price in each category")] public void LinqToSqlCount10() { @@ -202,6 +211,9 @@ WHERE ([t0].[UnitPrice] = @x2) AND (((@x1 IS NULL) AND ([t0].[CategoryID] IS NUL +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "This sample uses Average to find the average freight of all Orders.")] public void LinqToSqlCount11() { @@ -213,6 +225,9 @@ WHERE ([t0].[UnitPrice] = @x2) AND (((@x1 IS NULL) AND ([t0].[CategoryID] IS NUL Assert.IsTrue(q > 0, "Avg orders'freight must be > 0"); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "This sample uses Average to find the average unit price of all Products.")] public void LinqToSqlCount12() { @@ -227,6 +242,9 @@ WHERE ([t0].[UnitPrice] = @x2) AND (((@x1 IS NULL) AND ([t0].[CategoryID] IS NUL } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "This sample uses Average to find the Products that have unit price higher than the average unit price of the category for each category.")] public void LinqToSqlCount13() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/ExsistIn_Any_All.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/ExsistIn_Any_All.cs index d650432eec4..65a964c1a8c 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/ExsistIn_Any_All.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/ExsistIn_Any_All.cs @@ -21,7 +21,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples @@ -44,6 +44,7 @@ using nwind; var list = q.ToList(); Assert.IsTrue(list.Count > 0); } + [Linq101SamplesModified("Strange casting, It seems like original northwind discontinued were boolean")] [Test(Description = "Any - Conditional. This sample uses Any to return only Categories that have at least one Discontinued product.")] @@ -70,4 +71,4 @@ using nwind; Assert.IsTrue(list.Count > 0); } } -} \ No newline at end of file +} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/GroupBy_Having.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/GroupBy_Having.cs index 668e1f7cad8..e8955ff03f9 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/GroupBy_Having.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/GroupBy_Having.cs @@ -21,7 +21,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples @@ -36,6 +36,9 @@ using nwind; [TestFixture] public class GroupBy_Having : TestBase { +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test(Description = "GroupBy - Simple. This sample uses group by to partition Products by CategoryID.")] public void LinqToSqlGroupBy01() { @@ -51,6 +54,9 @@ using nwind; +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "GroupBy - Max. This sample uses group by and Max to find the maximum unit price for each CategoryID.")] public void LinqToSqlGroupBy02() { @@ -64,6 +70,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "GroupBy - Min. This sample uses group by and Min to find the minimum unit price for each CategoryID.")] public void LinqToSqlGroupBy03() { @@ -77,6 +86,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "GroupBy - Average. This sample uses group by and Average to find the average UnitPrice for each CategoryID.")] public void LinqToSqlGroupBy04() { @@ -92,6 +104,9 @@ using nwind; +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "GroupBy - Sum. This sample uses group by and Sum to find the total UnitPrice for each CategoryID.")] public void LinqToSqlGroupBy05() { @@ -105,6 +120,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "GroupBy - Count. This sample uses group by and Count to find the number of Products in each CategoryID.")] public void LinqToSqlGroupBy06() { @@ -118,6 +136,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Linq101SamplesModified("Strange short to boolean casting, perhaps in the original Northwind Product.Discontinued was a boolean property")] [Test(Description = "GroupBy - Count - Conditional. This sample uses group by and Count to find the number of Products in each CategoryID that are discontinued.")] public void LinqToSqlGroupBy07() @@ -135,6 +156,9 @@ using nwind; +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "GroupBy - followed by where. This sample uses a where clause after a group by clause to find all categories that have at least 10 products.")] public void LinqToSqlGroupBy08() { @@ -152,6 +176,9 @@ using nwind; +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Linq101SamplesModified("Strange syntactical strategy. Everybody aggree with this traduction?")] [Test(Description = "GroupBy - Multiple Columns. This sample uses group by to group products by CategoryID and SupplierID.")] public void LinqToSqlGroupBy09() @@ -168,6 +195,9 @@ using nwind; } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Linq101SamplesModified("Strange syntactical strategy. Everybody aggree with this traduction?")] [Test(Description = "GroupBy - Expression. This sample uses group by to return two sequences of products. The first sequence contains products with unit price greater than 10. The second sequence contains products with unit price less than or equal to 10.")] public void LinqToSqlGroupBy10() diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Inheritance.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Inheritance.cs index 47ccffb1426..8c1028d686e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Inheritance.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Inheritance.cs @@ -21,7 +21,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Insert_Update_Delete.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Insert_Update_Delete.cs index 07cbc9f1b59..1bd1b020cf3 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Insert_Update_Delete.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Insert_Update_Delete.cs @@ -26,7 +26,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples @@ -91,9 +91,15 @@ using nwind; Assert.AreEqual(reloadedCustomer.Country, newCustomer.Country); Assert.AreEqual(reloadedCustomer.Phone, newCustomer.Phone); Assert.AreEqual(reloadedCustomer.Fax, newCustomer.Fax); + + db.Customers.DeleteOnSubmit(reloadedCustomer); + db.SubmitChanges(); } #if !SQLITE +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Linq101SamplesModified("Console and ObjectDummper references deleted")] [Linq101SamplesModified("The original sample didn't compile, db2 Northwind context was used for nothing")] [Test(Description = "Insert - 1-to-Many. This sample uses the Add method to add a new Category to the Categories table object, and a new Product to the Products Table object with a foreign key relationship to the new Category. The call to SubmitChanges persists these new objects and their relationships to the database.")] @@ -107,18 +113,18 @@ using nwind; db.LoadOptions = ds; var q = from c in db.Categories - where c.CategoryName == "Widgets" + where c.CategoryName == "Temp Widgets" select c; var newCategory = new Category { - CategoryName = "Widgets", + CategoryName = "Temp Widgets", Description = "Widgets are the customer-facing analogues to sprockets and cogs." }; var newProduct = new Product { - ProductName = "Blue Widget", + ProductName = "temp Blue Widget", UnitPrice = 34.56m, Category = newCategory }; @@ -135,9 +141,16 @@ using nwind; Assert.AreEqual(reloadedCategory.CategoryName, newCategory.CategoryName); Assert.AreEqual(reloadedCategory.Description, reloadedCategory.Description); + + db.Products.DeleteOnSubmit(newProduct); + db.Categories.DeleteOnSubmit(newCategory); + db.SubmitChanges(); } #endif +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Linq101SamplesModified("Console and ObjectDummper references deleted")] [Linq101SamplesModified("The original sample didn't compile, db2 Northwind context was used for nothing")] [Test(Description = "Insert - Many-to-Many. This sample uses the Add method to add a new Employee to the Employees table object, a new Territory to the Territories table object, and a new EmployeeTerritory to the EmployeeTerritories table object with foreign key relationships to the new Employee and Territory. The call to SubmitChanges persists these new objects and their relationships to the database.")] @@ -153,15 +166,15 @@ using nwind; var q = from e in db.Employees where e.FirstName == "Nancy" select e; - if (db.Employees.Any(e => e.FirstName == "Kira" && e.LastName == "Smith")) + if (db.Employees.Any(e => e.FirstName == "Test Kira" && e.LastName == "Test Smith")) Assert.Ignore(); - var newEmployee = new Employee { FirstName = "Kira", LastName = "Smith" }; + var newEmployee = new Employee { FirstName = "Test Kira", LastName = "Test Smith" }; var newTerritory = new Territory { TerritoryID = "12345", - TerritoryDescription = "Anytown", + TerritoryDescription = "Test Anytown", Region = db.Regions.First() }; @@ -170,6 +183,12 @@ using nwind; db.Territories.InsertOnSubmit(newTerritory); db.EmployeeTerritories.InsertOnSubmit(newEmployeeTerritory); db.SubmitChanges(); + + // cleanup + db.EmployeeTerritories.DeleteOnSubmit(newEmployeeTerritory); + db.Territories.DeleteOnSubmit(newTerritory); + db.Employees.DeleteOnSubmit(newEmployee); + db.SubmitChanges(); } [Linq101SamplesModified("Console and ObjectDummper references deleted")] @@ -186,11 +205,16 @@ using nwind; where c.CustomerID == "ALFKI" select c).First(); + var oldContactTitle = cust.ContactTitle; cust.ContactTitle = "Vice President"; db.SubmitChanges(); Customer reloadedCustomer = db.Customers.First(c => c.CustomerID == cust.CustomerID); Assert.AreEqual(reloadedCustomer.ContactTitle, cust.ContactTitle); + + // undo + reloadedCustomer.ContactTitle = oldContactTitle; + db.SubmitChanges(); } [Linq101SamplesModified("Console and ObjectDummper references deleted")] @@ -217,42 +241,49 @@ using nwind; Assert.AreEqual(original.Current.UnitPrice, reloaded.Current.UnitPrice); Assert.AreEqual(original.MoveNext(), reloaded.MoveNext()); - } + // undo + foreach (var p in q) + p.UnitPrice -= 1.0m; + db.SubmitChanges(); + } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Linq101SamplesModified("Console and ObjectDummper references deleted")] [Test(Description = "Delete - Simple. This sample uses the Remove method to delete an OrderDetail from the OrderDetails Table object. The call to SubmitChanges persists this deletion to the database.")] public void LinqToSqlInsert06() { Northwind db = CreateDB(); - OrderDetail ode = db.OrderDetails.First(); - decimal orderID = ode.OrderID; - decimal productID = ode.ProductID; - - - OrderDetail order = (from c in db.OrderDetails - where c.OrderID == orderID && c.ProductID == productID - select c).First(); + db.Connection.Open(); + db.Transaction = db.Connection.BeginTransaction(); + try + { + OrderDetail ode = db.OrderDetails.First(); + decimal orderID = ode.OrderID; + decimal productID = ode.ProductID; - //what happened to Table.Remove()? - //The Add and AddAll methods are now InsertOnSubmit and InsertAllOnSubmit. The Remove and RemoveAll are now DeleteOnSubmit and DeleteAllOnSubmit. - //http://blogs.vertigo.com/personal/petar/Blog/Lists/Posts/Post.aspx?List=9441ab3e%2Df290%2D4a5b%2Da591%2D49a8226de525&ID=3 - db.OrderDetails.DeleteOnSubmit(order); //formerly Remove(order); - db.SubmitChanges(); + OrderDetail order = (from c in db.OrderDetails + where c.OrderID == orderID && c.ProductID == productID + select c).First(); - Assert.IsFalse(db.OrderDetails.Any(od => od.OrderID == orderID && od.ProductID == productID)); + //what happened to Table.Remove()? + //The Add and AddAll methods are now InsertOnSubmit and InsertAllOnSubmit. The Remove and RemoveAll are now DeleteOnSubmit and DeleteAllOnSubmit. + //http://blogs.vertigo.com/personal/petar/Blog/Lists/Posts/Post.aspx?List=9441ab3e%2Df290%2D4a5b%2Da591%2D49a8226de525&ID=3 - try - { - db.OrderDetails.InsertOnSubmit(order); + db.OrderDetails.DeleteOnSubmit(order); //formerly Remove(order); db.SubmitChanges(); + + Assert.IsFalse(db.OrderDetails.Any(od => od.OrderID == orderID && od.ProductID == productID)); } - catch (Exception ex) + finally { - Assert.Ignore("the orderDetail deleted hasn't be restored, so next run over this text will fail: " + ex.Message); + db.Transaction.Rollback(); + db.Transaction = null; } } @@ -267,25 +298,32 @@ using nwind; //db.SubmitChanges(); } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Linq101SamplesModified("Console and ObjectDummper references deleted")] [Test(Description = "Delete - One-to-Many. This sample uses the Remove method to delete an Order and Order Detail from the Order Details and Orders tables. First deleting Order Details and then deleting from Orders. The call to SubmitChanges persists this deletion to the database.")] public void LinqToSqlInsert07() { Northwind db = CreateDB(); - + + db.Connection.Open(); + db.Transaction = db.Connection.BeginTransaction(); + try + { var orderDetails = from o in db.OrderDetails - where o.Order.CustomerID == "WARTH" + where o.Order.CustomerID == "WARTH" select o; var order = (from o in db.Orders - where o.CustomerID == "WARTH" + where o.CustomerID == "WARTH" select o).FirstOrDefault(); if (!orderDetails.Any() || order == null) Assert.Ignore("Preconditions"); - + foreach (var od in orderDetails) { @@ -298,7 +336,12 @@ using nwind; Assert.IsFalse( db.OrderDetails.Any(od => od.Order.Customer.CustomerID == "WARTH" && od.Order.EmployeeID == 3)); Assert.IsFalse(db.Orders.Any(ord => ord.OrderID == order.OrderID)); - + } + finally + { + db.Transaction.Rollback(); + db.Transaction = null; + } } } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Join.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Join.cs index 495de4d7e74..7361062f620 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Join.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Join.cs @@ -20,7 +20,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples @@ -35,6 +35,7 @@ using nwind; [TestFixture] public class Join : TestBase { + [Test(Description = "This sample uses foreign key navigation in the from clause to select all orders for customers in London")] public void LinqToSqlJoin01() { @@ -146,6 +147,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "GroupJoin - LEFT OUTER JOIN. This sample shows how to get LEFT OUTER JOIN by using DefaultIfEmpty(). The DefaultIfEmpty() method returns null when there is no Order for the Employee.")] public void LinqToSqlJoin07() { @@ -160,6 +164,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "GroupJoin - Projected let assignment. This sample projects a 'let' expression resulting from a join.")] public void LinqToSqlJoin08() { @@ -175,6 +182,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "GroupJoin - Composite Key.This sample shows a join with a composite key.")] public void LinqToSqlJoin09() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Null.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Null.cs index 739b2f2ea92..f437e58a098 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Null.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Null.cs @@ -20,7 +20,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Object Loading.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Object Loading.cs index 0158e1fd286..e3fa5ce02b9 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Object Loading.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Object Loading.cs @@ -58,6 +58,9 @@ using nwind; } +#if !DEBUG && (SQLITE || (MSSQL && !MONO_STRICT)) + [Explicit] +#endif [Linq101SamplesModified("The original sample didn't compile, db2 Northwind context was used for nothing")] [Test(Description = "This sample demonstrates how to use Including to request related data during the original query so that additional roundtrips to the database are not required later when navigating through the retrieved objects.")] public void LinqToSqlObject02() @@ -104,6 +107,9 @@ using nwind; } +#if !DEBUG && (SQLITE || (MSSQL && !MONO_STRICT)) + [Explicit] +#endif [Linq101SamplesModified("The original sample didn't compile, db2 Northwind context was used for nothing")] [Test(Description = "This sample demonstrates how to use Including to request related data during the original query so that additional roundtrips to the database are not required later when navigating through the retrieved objects.")] public void LinqToSqlObject04() diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Object_Identity.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Object_Identity.cs index f59edec4950..32ed8852351 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Object_Identity.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Object_Identity.cs @@ -20,7 +20,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/OptimisticConcurrence.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/OptimisticConcurrence.cs index 7204cc1c374..a4526cd543d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/OptimisticConcurrence.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/OptimisticConcurrence.cs @@ -20,7 +20,7 @@ using Test_NUnit.Linq_101_Samples; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/OrderBy.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/OrderBy.cs index 014b9b6690c..5ec749b1c91 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/OrderBy.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/OrderBy.cs @@ -20,7 +20,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples @@ -98,6 +98,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "OrderBy - Group by. This sample uses Orderby, Max and Group by to find the Products that have the highest unit price in each category, and sorts the group by category id.")] public void LinqToSqlOrderBy06() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Paging.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Paging.cs index b09a8cf4f9c..488ea468e3e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Paging.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Paging.cs @@ -20,7 +20,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Select_Distinct.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Select_Distinct.cs index dadd965768f..d7abe49e055 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Select_Distinct.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Select_Distinct.cs @@ -21,7 +21,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples @@ -123,6 +123,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "select - Nested. This sample uses nested queries to return a sequence of all orders containing their OrderID, a subsequence of the items in the order where there is a discount, and the money saved if shipping is not included.")] public void LinqToSqlSelect09() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/String_Date_functions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/String_Date_functions.cs index a6e8ad3dc7d..dac2b616142 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/String_Date_functions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/String_Date_functions.cs @@ -46,7 +46,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples @@ -259,6 +259,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test(Description = "DateTime.Year. This sample uses the DateTime's Year property to find Orders placed in 1997.")] public void LinqToSqlString16() { @@ -272,6 +275,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test(Description = "DateTime.Month. This sample uses the DateTime's Month property to find Orders placed in December.")] public void LinqToSqlString17() { @@ -285,6 +291,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test(Description = "DateTime.Day. This sample uses the DateTime's Day property to find Orders placed on the 31st day of the month.")] public void LinqToSqlString18() { @@ -298,6 +307,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test(Description = "DateTime.Seconds. This sample uses the DateTime's Day property to find Orders placed on the 31st day of the month.")] public void LinqToSqlString19() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Top_Bottom.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Top_Bottom.cs index d2a43f2c726..1ead5ffb98d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Top_Bottom.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Top_Bottom.cs @@ -20,7 +20,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/UnionAll_Union_Intersect.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/UnionAll_Union_Intersect.cs index 1dbeaec8940..95f04343d47 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/UnionAll_Union_Intersect.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/UnionAll_Union_Intersect.cs @@ -21,7 +21,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Views.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Views.cs index fa2d2354102..3ff9583da13 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Views.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Views.cs @@ -21,7 +21,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Where.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Where.cs index 0fbf4723c81..9783e3df054 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Where.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Linq_101_Samples/Where.cs @@ -21,7 +21,7 @@ using nwind; namespace Test_NUnit_Sqlite.Linq_101_Samples #elif INGRES namespace Test_NUnit_Ingres.Linq_101_Samples -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict.Linq_101_Samples #elif MSSQL namespace Test_NUnit_MsSql.Linq_101_Samples @@ -45,6 +45,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test(Description = "where - 2. This sample uses where to filter for Employees hired during or after 1994.")] public void LinqToSqlWhere02() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest.cs index 66f8a86f972..cbf6f49601f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest.cs @@ -52,7 +52,7 @@ using DataLinq = DbLinq.Data.Linq; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -81,15 +81,19 @@ using DataLinq = DbLinq.Data.Linq; +#if !DEBUG && (MSSQL && L2SQL) + // L2SQL doesn't support 'SELECT' queries in DataContext.ExecuteCommand(). + [Explicit] +#endif [Test] public void A3_ProductsTableHasPen() { Northwind db = CreateDB(); - //string sql = @"SELECT count(*) FROM linqtestdb.Products WHERE ProductName='Pen'"; - string sql = @"SELECT count(*) FROM [Products] WHERE [ProductName]='Pen'"; + //string sql = @"SELECT count(*) FROM linqtestdb.Products WHERE ProductName='Chai'"; + string sql = @"SELECT count(*) FROM [Products] WHERE [ProductName]='Chai'"; long iResult = db.ExecuteCommand(sql); //long iResult = base.ExecuteScalar(sql); - Assert.AreEqual(iResult, 1L, "Expecting one Pen in Products table, got:" + iResult + " (SQL:" + sql + ")"); + Assert.AreEqual(iResult, 1L, "Expecting one Chai in Products table, got:" + iResult + " (SQL:" + sql + ")"); } [Test] @@ -117,6 +121,7 @@ using DataLinq = DbLinq.Data.Linq; var cust = db.Customers.SingleOrDefault(c => c.CompanyName == "Around the Horn"); Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'."); +#if false var id = "ALFKI"; cust = db.Customers.SingleOrDefault(c => c.CustomerID == id); Assert.AreEqual("ALFKI", cust.CustomerID); @@ -132,6 +137,27 @@ using DataLinq = DbLinq.Data.Linq; Assert.AreEqual("ALFKI", cust.CustomerID); id = "BLAUS"; cust = db.Customers.SingleOrDefault(c => c.CustomerID == id); +#endif + cust = GetCustomerById(db, "ALFKI"); + Assert.AreEqual("ALFKI", cust.CustomerID); + + cust = GetCustomerById(db, "BLAUS"); + Assert.AreEqual("BLAUS", cust.CustomerID); + + cust = GetCustomerById(db, "DNE"); + Assert.IsNull(cust); + + cust = GetCustomerById(db, "ALFKI"); + Assert.AreEqual("ALFKI", cust.CustomerID); + + cust = GetCustomerById(db, "BLAUS"); + Assert.AreEqual("BLAUS", cust.CustomerID); + } + + + private static Customer GetCustomerById(Northwind db, string id) + { + return db.Customers.SingleOrDefault(c => c.CustomerID == id); } @@ -151,6 +177,33 @@ using DataLinq = DbLinq.Data.Linq; Assert.IsTrue(p1.ProductID == 1); } + public void A8_SelectSingleOrDefault_QueryCacheDisabled() + { + Northwind db = CreateDB(); +#if !MONO_STRICT + db.QueryCacheEnabled = false; +#endif + + // Query for a specific customer + var cust = db.Customers.SingleOrDefault(c => c.CompanyName == "Around the Horn"); + Assert.IsNotNull(cust, "Expected one customer 'Around the Horn'."); + + cust = GetCustomerById(db, "ALFKI"); + Assert.AreEqual("ALFKI", cust.CustomerID); + + cust = GetCustomerById(db, "BLAUS"); + Assert.AreEqual("BLAUS", cust.CustomerID); + + cust = GetCustomerById(db, "DNE"); + Assert.IsNull(cust); + + cust = GetCustomerById(db, "ALFKI"); + Assert.AreEqual("ALFKI", cust.CustomerID); + + cust = GetCustomerById(db, "BLAUS"); + Assert.AreEqual("BLAUS", cust.CustomerID); + } + #endregion //TODO: group B, which checks AllTypes @@ -167,12 +220,15 @@ using DataLinq = DbLinq.Data.Linq; Assert.Greater(productCount, 0, "Expected some products, got none"); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void C2_SelectPenId() { Northwind db = CreateDB(); - var q = from p in db.Products where p.ProductName == "Pen" select p.ProductID; + var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID; var productIDs = q.ToList(); int productCount = productIDs.Count; Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount); @@ -183,7 +239,7 @@ using DataLinq = DbLinq.Data.Linq; { Northwind db = CreateDB(); - var pen = "Pen"; + var pen = "Chai"; var q = from p in db.Products where p.ProductName == pen select p.ProductID; var productIDs = q.ToList(); int productCount = productIDs.Count; @@ -196,13 +252,13 @@ using DataLinq = DbLinq.Data.Linq; Northwind db = CreateDB(); var q = from p in db.Products - where p.ProductName == "Pen" + where p.ProductName == "Chai" select new { ProductId = p.ProductID, Name = p.ProductName }; int count = 0; //string penName; foreach (var v in q) { - Assert.AreEqual(v.Name, "Pen", "Expected ProductName='Pen'"); + Assert.AreEqual(v.Name, "Chai", "Expected ProductName='Chai'"); count++; } Assert.AreEqual(count, 1, "Expected one pen, got count=" + count); @@ -225,7 +281,7 @@ using DataLinq = DbLinq.Data.Linq; var res = from o in db.Orders select new { test = 1 }; var list = res.ToList(); - Assert.IsTrue(list.Count > 0); + Assert.AreEqual(db.Orders.Count(), list.Count); } @@ -266,6 +322,9 @@ using DataLinq = DbLinq.Data.Linq; /// /// from http://www.agilior.pt/blogs/pedro.rainho/archive/2008/04/11/4271.aspx /// +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "Using LIKE operator from linq query")] public void C7B_LikeOperator() { @@ -284,7 +343,7 @@ using DataLinq = DbLinq.Data.Linq; public void C8_SelectPenByLocalVariable() { Northwind db = CreateDB(); - string pen = "Pen"; + string pen = "Chai"; var q = from p in db.Products where (p.ProductName == pen) @@ -315,8 +374,68 @@ using DataLinq = DbLinq.Data.Linq; where true select p; - int count = q.ToList().Count(); - Assert.Greater(count,0); + int count = q.ToList().Count; + Assert.AreEqual(count, db.Customers.Count()); + } + + [Test] + public void C10b_ConstantPredicate() + { + Northwind db = CreateDB(); + var q = from p in db.Customers + where false + select p; + + int count = q.Count(); + Assert.AreEqual(count, 0); + } + + [Test] + public void C10c_ConstantPredicate() + { + Northwind db = CreateDB(); + var q = from p in db.Customers + where (p.Address.StartsWith("A") && false) + select p; + + int count = q.Count(); + Assert.AreEqual(count, 0); + } + + [Test] + public void C10d_ConstantPredicate() + { + Northwind db = CreateDB(); + var q = from p in db.Customers + where (p.Address.StartsWith("A") || true) + select p; + + int count = q.Count(); + Assert.AreEqual(count, db.Customers.Count()); + } + + [Test] + public void C10e_ConstantPredicate() + { + Northwind db = CreateDB(); + var q = from p in db.Customers + where (p.Address.StartsWith("A") || false) + select p; + + int count = q.Count(); + Assert.Less(count, db.Customers.Count()); + } + + [Test] + public void C10f_ConstantPredicate() + { + Northwind db = CreateDB(); + var q = from p in db.Customers + where (p.Address.StartsWith("A") && true) + select p; + + int count = q.Count(); + Assert.Less(count, db.Customers.Count()); } [Test] @@ -424,6 +543,122 @@ using DataLinq = DbLinq.Data.Linq; Assert.IsNotNull(territory.Region); } + [Test] + public void C19_SelectEmployee_Fluent() + { + Northwind db = CreateDB(); + var q = db.GetTable() + .Join(db.GetTable(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l) + .Join(db.GetTable().Where(e => e.EmployeeID > 0), l => l.EmployeeID, e => e.EmployeeID, (l, e) => e); + var employeeCount = q.Count(); + Assert.Greater(employeeCount, 0, "Expected any employees, got count=" + employeeCount); + } + + /// + /// Test the use of DbLinq as a QueryObject + /// http://www.martinfowler.com/eaaCatalog/queryObject.html + /// + [Test] + public void C20_SelectEmployee_DbLinqAsQueryObject() + { + Northwind db = CreateDB(); + IQueryable allEmployees = db.GetTable(); + + allEmployees = filterByNameOrSurnameContains(db, allEmployees, "an"); + + allEmployees = filterByTerritoryName(db, allEmployees, "Neward"); + + Assert.AreEqual(1, allEmployees.Count()); + } + + [Test] + public void C21_SelectEmployee_DbLinqAsQueryObjectWithOrderCount() + { + Northwind db = CreateDB(); + IQueryable allEmployees = db.GetTable(); + + allEmployees = filterByOrderCountGreaterThan(db, allEmployees, 50); + allEmployees = filterByNameOrSurnameContains(db, allEmployees, "an"); + + allEmployees = filterByTerritoryNames(db, allEmployees, "Neward", "Boston", "Wilton"); + + int employeesCount = allEmployees.ToList().Count; + + Assert.AreEqual(employeesCount, allEmployees.Count()); + } + + + private IQueryable filterByOrderCountGreaterThan(Northwind db, IQueryable allEmployees, int minimumOrderNumber) + { + return from e in allEmployees.Where(e => e.Orders.Count > minimumOrderNumber) select e; + } + + private IQueryable filterByNameOrSurnameContains(Northwind db, IQueryable allEmployees, string namePart) + { + return from e in allEmployees.Where(e => e.FirstName.Contains(namePart) || e.LastName.Contains(namePart)) select e; + } + + private IQueryable filterByTerritoryName(Northwind db, IQueryable allEmployees, string territoryName) + { + IQueryable territoryRequired = db.GetTable().Where(t => t.TerritoryDescription == territoryName); + var q = territoryRequired + .Join(db.GetTable(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l) + .Join(allEmployees, l => l.EmployeeID, e => e.EmployeeID, (l, e) => e); + return q; + } + + private IQueryable filterByTerritoryNames(Northwind db, IQueryable allEmployees, params string[] territoryNames) + { + IQueryable territoryRequired = db.GetTable().Where(t => territoryNames.Contains(t.TerritoryDescription)); + var q = territoryRequired + .Join(db.GetTable(), t => t.TerritoryID, l => l.TerritoryID, (t, l) => l) + .Join(allEmployees, l => l.EmployeeID, e => e.EmployeeID, (l, e) => e); + return q; + } + + [Test] + public void C22_SelectEmployee_GetCommandTextWithNoFilter() + { + Northwind db = CreateDB(); + IQueryable allEmployees = db.GetTable(); + var commandText = db.GetCommand(allEmployees).CommandText; + Assert.IsNotNull(commandText); + } + + [Test] + public void C23_SelectEmployees() + { + Northwind db = CreateDB(); + var allEmployees = db.GetTable(); + int count = 0; + foreach (var emp in allEmployees) + { + ++count; + } + Assert.AreEqual(9, count); + } + +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif + [Test] + public void C24_SelectEmployee_DbLinqAsQueryObjectWithExceptAndImage() + { + // This fail becouse Employee contains a ndata, ndata is not comparable + // and EXCEPT make a distinct on DATA + Northwind db = CreateDB(); + IQueryable allEmployees = db.GetTable(); + + var toExclude = filterByOrderCountGreaterThan(db, allEmployees, 50); + allEmployees = filterByNameOrSurnameContains(db, allEmployees, "a").Except(toExclude); + + string commandText = db.GetCommand(allEmployees).CommandText; + + int employeesCount = allEmployees.ToList().Count; + + Assert.AreEqual(employeesCount, allEmployees.Count()); + } + #endregion @@ -433,7 +668,7 @@ using DataLinq = DbLinq.Data.Linq; { Northwind db = CreateDB(); - var q = from p in db.Products where p.ProductName == "Pen" select p.ProductID; + var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID; var productID = q.First(); Assert.Greater(productID, 0, "Expected penID>0, got " + productID); } @@ -460,21 +695,28 @@ using DataLinq = DbLinq.Data.Linq; { Northwind db = CreateDB(); - var q = from p in db.Products where p.ProductName == "Pen" select p; + var q = from p in db.Products where p.ProductName == "Chai" select p; Product pen = q.First(); Assert.IsNotNull(pen, "Expected non-null Product"); } +#if !DEBUG && MSSQL + // L2SQL: System.NotSupportedException : The query operator 'Last' is not supported. + [Explicit] +#endif [Test] public void D03_SelectLastPenID() { Northwind db = CreateDB(); - var q = from p in db.Products where p.ProductName == "Pen" select p.ProductID; + var q = from p in db.Products where p.ProductName == "Chai" select p.ProductID; var productID = q.Last(); Assert.Greater(productID, 0, "Expected penID>0, got " + productID); } +#if !DEBUG && (POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void D04_SelectProducts_OrderByName() { @@ -502,9 +744,9 @@ using DataLinq = DbLinq.Data.Linq; public void D05_SelectOrdersForProduct() { Northwind db = CreateDB(); - //var q = from p in db.Products where "Pen"==p.ProductName select p.Order; + //var q = from p in db.Products where "Chai"==p.ProductName select p.Order; //List penOrders = q.ToList(); - //Assert.Greater(penOrders.Count,0,"Expected some orders for product 'Pen'"); + //Assert.Greater(penOrders.Count,0,"Expected some orders for product 'Chai'"); var q = from o in db.Orders @@ -538,6 +780,7 @@ using DataLinq = DbLinq.Data.Linq; } Assert.Greater(list1.Count, 0, "Expected some orders for London customers"); } + [Test] public void D07_OrdersFromLondon_Alt() { @@ -606,6 +849,10 @@ using DataLinq = DbLinq.Data.Linq; } +#if !DEBUG && (SQLITE || MSSQL) + // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTest+Northwind1+CustomerDerivedClass' is not mapped as a Table. + [Explicit] +#endif [Test] public void D12_SelectDerivedClass() { @@ -640,14 +887,14 @@ using DataLinq = DbLinq.Data.Linq; { Northwind db = CreateDB(); - var res = db.ExecuteQuery(@"SELECT [ProductID] AS PenId FROM [Products] WHERE - [ProductName] ='Pen'").Single(); - Assert.AreEqual(1, res.PenId); + var res = db.ExecuteQuery(@"SELECT [ProductID] AS ChaiId FROM [Products] WHERE + [ProductName] ='Chai'").Single(); + Assert.AreEqual(1, res.ChaiId); } - class Pen + class Chai { - internal int PenId; + internal int ChaiId; } [Test] @@ -674,6 +921,10 @@ using DataLinq = DbLinq.Data.Linq; } } +#if !DEBUG && (SQLITE || MSSQL) + // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTest+NorthwindDupl+CustomerDerivedClass' is not mapped as a Table. + [Explicit] +#endif [Test] public void D15_DuplicateProperty() { @@ -770,5 +1021,26 @@ using DataLinq = DbLinq.Data.Linq; #endregion + [Test] + public void SqlInjectionAttack() + { + var db = CreateDB(); + var q = db.Customers.Where(c => c.ContactName == "'; DROP TABLE DoesNotExist; --"); + Assert.AreEqual(0, q.Count()); + } + +#if POSTGRES || MSSQL + [Test] + public void Storage01() + { + var db = CreateDB(); + var q = db.NoStorageCategories.Where(c => c.CategoryID == 1); + var r = q.First(); + Assert.AreEqual(1, q.Count()); + Assert.AreEqual(1, r.CategoryID); + Assert.IsTrue(r.propertyInvoked_CategoryName); + Assert.IsFalse(r.propertyInvoked_Description); + } +#endif } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Complex.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Complex.cs index 8fe275901ad..7e61c999552 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Complex.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Complex.cs @@ -53,7 +53,7 @@ using Id = System.Int32; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -81,7 +81,7 @@ using Id = System.Int32; Northwind db = CreateDB(); - Product localProduct = new Product { ProductName = "Pen" }; + Product localProduct = new Product { ProductName = "Chai" }; var q = from p in db.Products where p.ProductName == localProduct.ProductName select p; List products = q.ToList(); @@ -93,7 +93,7 @@ using Id = System.Int32; public void D1_SelectPensByLocalProperty() { Northwind db = CreateDB(); - var pen = new { Name = "Pen" }; + var pen = new { Name = "Chai" }; var q = from p in db.Products where p.ProductName == pen.Name select p; List products = q.ToList(); @@ -102,18 +102,18 @@ using Id = System.Int32; } [Test] - public void D2_SelectPensByLocalPropertyAndConstant() + public void D2_SelectProductByLocalPropertyAndConstant() { Northwind db = CreateDB(); - string pen = "Pen"; + string product = "Carnarvon Tigers"; var q = from p in db.Products - where p.ProductName == pen && - p.QuantityPerUnit == "10" + where p.ProductName == product && + p.QuantityPerUnit.StartsWith("16") select p; List products = q.ToList(); int productCount = products.Count; - Assert.AreEqual(1, productCount, "Expected one pen, got count=" + productCount); + Assert.AreEqual(1, productCount, "Expected one product, got count=" + productCount); } [Test] @@ -188,18 +188,18 @@ using Id = System.Int32; public void F7_ExplicitJoin() { //a nice and light nonsense join: - //bring in rows such as {Pen,AIRBU} + //bring in rows such as {Chai,AIRBU} var q = from p in db.Products - join o in db.Orders on p.ProductID equals o.OrderID - select new { p.ProductName, o.CustomerID }; + join c in db.Categories on p.ProductID equals c.CategoryID + select new { p.ProductName, c.CategoryName }; int rowCount = 0; foreach (var v in q) { rowCount++; Assert.IsTrue(v.ProductName != null); - Assert.IsTrue(v.CustomerID != null); + Assert.IsTrue(v.CategoryName != null); } Assert.IsTrue(rowCount > 2); } @@ -282,17 +282,16 @@ using Id = System.Int32; { var q4 = from p in db.Products where (p.ProductName + p.ProductID).Contains("e") - select p.ProductName; - //select p.ProductName+p.ProductID; + select p.ProductName+p.ProductID; //var q4 = from p in db.Products select p.ProductID; - var q5 = q4.ToList(); - //Assert.Greater( q5.Count, 2, "Expected to see some concat strings"); - //foreach(string s0 in q5) - //{ - // bool startWithLetter = Char.IsLetter(s0[0]); - // bool endsWithDigit = Char.IsDigit(s0[s0.Length-1]); - // Assert.IsTrue(startWithLetter && endsWithDigit, "String must start with letter and end with digit"); - //} + //var q5 = q4.ToList(); + Assert.Greater( q4.Count(), 2, "Expected to see some concat strings"); + foreach(string s0 in q4) + { + bool startWithLetter = Char.IsLetter(s0[0]); + bool endsWithDigit = Char.IsDigit(s0[s0.Length-1]); + Assert.IsTrue(startWithLetter && endsWithDigit, "String must start with letter and end with digit"); + } } #endregion @@ -379,15 +378,187 @@ using Id = System.Int32; { var db = CreateDB(); - var nc = new Category { CategoryName = "test", Picture = new byte[] { 1, 2, 3, 4 } }; + var picture = new byte[] { 1, 2, 3, 4 }; + + var nc = new Category { CategoryName = "test", Picture = picture }; db.Categories.InsertOnSubmit(nc); db.SubmitChanges(); - var q = from c in db.Categories select new { c.Picture }; + var q = from c in db.Categories + where c.CategoryName == "test" + select new { c.Picture }; var l = q.ToList(); Assert.IsTrue(l.Count > 0); + Assert.IsTrue(picture.SequenceEqual(l[0].Picture.ToArray())); + + db.Categories.DeleteOnSubmit(nc); + db.SubmitChanges(); + } + + + [Test] + public void F19_ExceptWithCount_ViaToList() + { + var db = CreateDB(); + + var toExclude = from t in db.GetTable() + where t.TerritoryDescription.StartsWith("A") + select t; + var universe = from t in db.GetTable() select t; + var toTake = universe.Except(toExclude); + + int toListCount = toTake.ToList().Count; + Assert.AreEqual(51, toListCount); + } + + [Test] + public void F20_ExceptWithCount() + { + var db = CreateDB(); + + var toExclude = from t in db.GetTable() + where t.TerritoryDescription.StartsWith("A") + select t; + var universe = from t in db.GetTable() select t; + var toTake = universe.Except(toExclude).Except(db.Territories.Where(terr => terr.TerritoryDescription.StartsWith("B"))); + + int toTakeCount = toTake.Count(); + Assert.AreEqual(44, toTakeCount); + } + +#if !DEBUG && (SQLITE) + [Explicit] +#endif + [Test] + public void F21_CountNestedExcepts() + { + var db = CreateDB(); + + var toExclude1 = from t in db.GetTable() + where t.TerritoryDescription.StartsWith("A") + select t; + var toExclude2 = toExclude1.Except(db.GetTable().Where(terr => terr.TerritoryDescription.Contains("i"))); + + var universe = from t in db.GetTable() select t; + + var toTake = universe.Except(toExclude2); + + int toTakeCount = toTake.Count(); + Assert.AreEqual(52, toTakeCount); } +#if !DEBUG && (SQLITE) + [Explicit] +#endif + [Test] + public void F22_AnyNestedExcepts() + { + var db = CreateDB(); + + var toExclude1 = from t in db.GetTable() + where t.TerritoryDescription.StartsWith("A") + select t; + var toExclude2 = toExclude1.Except(db.GetTable().Where(terr => terr.TerritoryDescription.Contains("i"))); + + var universe = from t in db.GetTable() select t; + + var toTake = universe.Except(toExclude2); + + Assert.IsTrue(toTake.Any()); + } + +#if !DEBUG && SQLITE + [Explicit] +#endif + [Test] + public void F23_AnyNestedExcepts_WithParameter() + { + var db = CreateDB(); + + var toExclude1 = from t in db.GetTable() + where t.TerritoryDescription.StartsWith("A") + select t; + var toExclude2 = toExclude1.Except(db.GetTable().Where(terr => terr.TerritoryDescription.Contains("i"))); + + var universe = from t in db.GetTable() select t; + + var toTake = universe.Except(toExclude2); + + Assert.IsTrue(toTake.Any(t => t.TerritoryDescription.Contains("i"))); + } + +#if !DEBUG && SQLITE + [Explicit] +#endif + [Test] + public void F24_CountNestedExcepts_WithParameter() + { + var db = CreateDB(); + + var toExclude1 = from t in db.GetTable() + where t.TerritoryDescription.StartsWith("A") + select t; + var toExclude2 = toExclude1.Except(db.GetTable().Where(terr => terr.TerritoryDescription.Contains("i"))); + + var universe = from t in db.GetTable() select t; + + var toTake = universe.Except(toExclude2); + + int toTakeCount = toTake.Count(t => t.TerritoryDescription.Contains("o")); + Assert.AreEqual(34, toTakeCount); + } + + [Test] + public void F25_DistinctUnion() + { + var db = CreateDB(); + + var toInclude1 = from t in db.GetTable() + where t.TerritoryDescription.StartsWith("A") + select t; + var toInclude2 = toInclude1.Concat(db.GetTable().Where(terr => terr.TerritoryDescription.Contains("i"))); + + var toTake = toInclude2.Distinct(); + + int count = toTake.ToList().Count; + + Assert.AreEqual(27, count); + } + + [Test] + public void F26_DistinctUnion_Count() + { + var db = CreateDB(); + + var toInclude1 = from t in db.GetTable() + where t.TerritoryDescription.StartsWith("A") + select t; + var toInclude2 = toInclude1.Concat(db.GetTable().Where(terr => terr.TerritoryDescription.Contains("i"))); + + var toTake = toInclude2.Distinct(); + + int count = toTake.Count(); + + Assert.AreEqual(27, count); + } + +#if MSSQL || L2SQL + +#if L2SQL + [Explicit] +#endif + [Test] + public void F27_SelectEmployee_Identifier() + { + var db = CreateDB(); + var q = from e in db.GetTable() where e.Identifier == "7" select e; + EmployeeWithStringIdentifier em = q.Single(); + + Assert.AreEqual("King", em.LastName); + } + +#endif + /// /// the following three tests are from Jahmani's page /// LinqToSQL: Comprehensive Support for SQLite, MS Access, SQServer2000/2005 @@ -432,9 +603,6 @@ using Id = System.Int32; select new { ContactName = e.LastName }); var list = q.ToList(); Assert.IsTrue(list.Count > 0, "Expected some customers and employees from London"); - - int countOfGraeme = list.Count(l => l.ContactName == "graeme"); - Assert.IsTrue(countOfGraeme == 1, "Expected London contacts to include graeme"); } [Test] diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_GroupBy.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_GroupBy.cs index 671cc718ba6..309118e1717 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_GroupBy.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_GroupBy.cs @@ -47,7 +47,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -78,6 +78,9 @@ using nwind; Assert.IsTrue(rowCount > 0, "Must have some rows"); } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test] public void G02_SimpleGroup_First() { @@ -103,6 +106,9 @@ using nwind; } } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test] public void G03_SimpleGroup_WithSelector_Invalid() { @@ -156,6 +162,9 @@ using nwind; } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test] public void G04_SimpleGroup_WithSelector() { @@ -184,6 +193,9 @@ using nwind; } } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void G05_Group_Into() { @@ -226,6 +238,9 @@ using nwind; //select new { g.Key , SumPerCustomer = g.Sum(o2=>o2.OrderID) }; } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void G07_OrderCountByCustomerID_Where() { @@ -244,6 +259,9 @@ using nwind; //select new { g.Key , SumPerCustomer = g.Sum(o2=>o2.OrderID) }; } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void G08_OrderSumByCustomerID() { @@ -267,6 +285,9 @@ using nwind; /// /// Reported by pwy.mail in http://code.google.com/p/dblinq2007/issues/detail?id=64 /// +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test] public void G09_UnitPriceGreaterThan10() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Operands.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Operands.cs index b39cb0e23d9..93af57da302 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Operands.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Operands.cs @@ -47,7 +47,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -180,6 +180,9 @@ using nwind; Assert.IsTrue(count > 0, "Expected some products with ProductID != 1, got none"); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void J1_LocalFunction_DateTime_ParseExact() { @@ -188,7 +191,7 @@ using nwind; //Lookup EmployeeID 1: //Andy Fuller - HireDate: 1989-01-01 00:00:00 - string hireDate = "1989.01.01"; + string hireDate = "1992.08.14"; // Ingres assumes UTC on all date queries var q = from e in db.Employees @@ -197,9 +200,9 @@ using nwind; #else where e.HireDate == DateTime.ParseExact(hireDate, "yyyy.MM.dd", CultureInfo.InvariantCulture) #endif - select e.EmployeeID; - var empID = q.Single(); //MTable_Projected.GetQueryText() - Assert.IsTrue(empID == 1); + select e.LastName; + var empLastName = q.Single(); //MTable_Projected.GetQueryText() + Assert.AreEqual("Fuller", empLastName); } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Subquery.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Subquery.cs index 50e1a67d425..6b9af177c86 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Subquery.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTest_Subquery.cs @@ -53,7 +53,7 @@ using Id = System.Int32; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -80,6 +80,9 @@ SELECT o$.* FROM Employees AS e$ LEFT OUTER JOIN Orders AS o$ ON o$.[EmployeeID] = e$.[EmployeeID] */ +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Description("Subquery")] [Test] public void CQ2_Subquery() @@ -91,6 +94,9 @@ LEFT OUTER JOIN Orders AS o$ ON o$.[EmployeeID] = e$.[EmployeeID] Assert.IsTrue(count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Description("Subquery with nested select")] [Test] public void CQ3_SubquerySelect() @@ -101,6 +107,9 @@ LEFT OUTER JOIN Orders AS o$ ON o$.[EmployeeID] = e$.[EmployeeID] Assert.IsTrue(count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Description("Subquery with nested entityset")] [Test] public void CQ4_SubqueryNested() @@ -111,6 +120,9 @@ LEFT OUTER JOIN Orders AS o$ ON o$.[EmployeeID] = e$.[EmployeeID] Assert.IsTrue(count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Description("Subquery with nested query")] [Test] public void CQ5_SubqueryNestedQuery() @@ -123,8 +135,27 @@ LEFT OUTER JOIN Orders AS o$ ON o$.[EmployeeID] = e$.[EmployeeID] r.OrderID).Contains(d.OrderID) select d; var count = q.ToList().Count; - Assert.AreEqual(count,1 ); + Assert.AreEqual(38, count); + } + + + [Test] + public void QueryableContains01() + { + var db = CreateDB(); + var q1 = db.OrderDetails.Where(o => o.Discount > 0).Select(o => o.OrderID); + var q = db.OrderDetails.Where(o => !q1.Contains(o.OrderID)); + Assert.AreEqual(1110, q.Count()); } + [Test] + public void QueryableContains02() + { + var db = CreateDB(); + DateTime t = DateTime.Parse("01/01/1950"); + var q1 = db.Employees.Where(e => e.BirthDate.HasValue && e.BirthDate.Value > t).Select(e => e.EmployeeID); + var q = db.Orders.Where(o => o.EmployeeID.HasValue && !q1.Contains(o.EmployeeID.Value)); + Assert.AreEqual(279, q.Count()); + } } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_AnyCountFirst.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_AnyCountFirst.cs index 86444c95c1a..86a3797537a 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_AnyCountFirst.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_AnyCountFirst.cs @@ -21,7 +21,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -218,6 +218,9 @@ using nwind; select new { c.CustomerID, HasUSAOrders = c.Orders.Count(o => o.ShipCountry == "USA") }).ToList(); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void FirstInternal01() { @@ -231,6 +234,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void FirstInternal02() { @@ -243,6 +249,9 @@ using nwind; var list = q.ToList(); } +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void FirstInternal03() { @@ -313,11 +322,25 @@ using nwind; public void ArrayContains() { var db = CreateDB(); - decimal[] d = new decimal[] { 1, 4, 5, 6 }; + decimal[] d = new decimal[] { 1, 4, 5, 6, 10248, 10255 }; var q = db.OrderDetails.Where(o => d.Contains(o.OrderID)); Assert.Greater(q.Count(), 0); } + + [Test] + public void ArrayContains_QueryParserCacheHit() + { + var db = CreateDB(); + decimal[] d = new decimal[] { 1, 4, 5, 6, 10248, 10255 }; + var q = db.OrderDetails.Where(o => d.Contains(o.OrderID)); + string query1 = db.GetCommand(q).CommandText; + d = new decimal[] { 1, 4, 5, 6, 7, 8 }; + q = db.OrderDetails.Where(o => d.Contains(o.OrderID)); + string query2 = db.GetCommand(q).CommandText; + Assert.AreEqual(query1, query2); + } + } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Conversions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Conversions.cs index 69ecbf2231e..fbeaa32f419 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Conversions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Conversions.cs @@ -47,7 +47,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -105,6 +105,9 @@ using nwind; var list = query.ToList(); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void ParseInt() { @@ -117,6 +120,9 @@ using nwind; var list = query.ToList(); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void ParseFloat() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_DateTimeFunctions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_DateTimeFunctions.cs index 45bc408ad76..bacd40bae97 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_DateTimeFunctions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_DateTimeFunctions.cs @@ -53,7 +53,7 @@ using DbLinq.Data.Linq; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -64,6 +64,9 @@ using DbLinq.Data.Linq; [TestFixture] public class ReadTests_DateTimeFunctions : TestBase { +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void GetYear() { @@ -77,6 +80,9 @@ using DbLinq.Data.Linq; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void GetMonth() { @@ -90,6 +96,9 @@ using DbLinq.Data.Linq; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void GetDay() { @@ -103,6 +112,9 @@ using DbLinq.Data.Linq; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void GetHours() { @@ -114,6 +126,10 @@ using DbLinq.Data.Linq; } + +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void GetMinutes() { @@ -125,6 +141,10 @@ using DbLinq.Data.Linq; } + +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void GetSeconds() { @@ -136,6 +156,9 @@ using DbLinq.Data.Linq; } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void GetMilliSeconds() { @@ -147,6 +170,9 @@ using DbLinq.Data.Linq; } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void GetCurrentDateTime() { @@ -158,6 +184,9 @@ using DbLinq.Data.Linq; var list = query.ToList(); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void Parse01() { @@ -186,6 +215,7 @@ using DbLinq.Data.Linq; { Northwind db = CreateDB(); var query = from e in db.Employees + where e.BirthDate.HasValue select e.BirthDate.Value == DateTime.Parse("1984/05/02"); @@ -193,7 +223,7 @@ using DbLinq.Data.Linq; } [Test] - [ExpectedException(typeof(NotSupportedException))] + [ExpectedException(typeof(InvalidOperationException))] public void Parse04() { Northwind db = CreateDB(); @@ -204,6 +234,9 @@ using DbLinq.Data.Linq; var list = query.ToList(); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void DateTimeDiffTotalHours() { @@ -216,6 +249,9 @@ using DbLinq.Data.Linq; var list = query.ToList(); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void DateTimeDiffHours() { @@ -232,6 +268,9 @@ using DbLinq.Data.Linq; Assert.Greater(list.Count, 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void DateTimeDiffTotalMinutes() { @@ -244,6 +283,9 @@ using DbLinq.Data.Linq; var list = query.ToList(); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void DateTimeDiffMinutes() { @@ -260,7 +302,10 @@ using DbLinq.Data.Linq; Assert.Greater(list.Count, 0); } - + +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void DateTimeDiffTotalSeconds() { @@ -273,6 +318,9 @@ using DbLinq.Data.Linq; var list = query.ToList(); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void DateTimeDiffSeconds() { @@ -289,6 +337,10 @@ using DbLinq.Data.Linq; Assert.Greater(list.Count, 0); } +#if !DEBUG && (SQLITE || MSSQL) + // L2SQL: SQL Server doesnt' seem to support millisecond precision. + [Explicit] +#endif [Test] public void DateTimeDiffMilliseconds() { @@ -305,6 +357,9 @@ using DbLinq.Data.Linq; Assert.Greater(list.Count, 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void DateTimeDiffTotalMilliseconds() { @@ -317,6 +372,9 @@ using DbLinq.Data.Linq; var list = query.ToList(); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void DateTimeDiffDays() { @@ -333,6 +391,9 @@ using DbLinq.Data.Linq; Assert.Greater(list.Count, 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void DateTimeDiffTotalDays() { @@ -358,40 +419,76 @@ using DbLinq.Data.Linq; { Northwind db = CreateDB(); - DateTime firstDate = db.Employees.First().BirthDate.Value; + var employee = new Employee + { + FirstName = "Test First", + LastName = "Test Last", + }; + db.Employees.InsertOnSubmit(employee); + db.SubmitChanges(); + + DateTime firstDate = db.Employees.First().BirthDate.Value; firstDate.Date.AddDays(2); DateTime parameterDate = firstDate.Date.AddHours(12); - //this test should throw an invalid operation exception since one BirthDate is null so select clausle should crash - var query = from e in db.Employees - select (e.BirthDate.Value - parameterDate).TotalDays; - - var list = query.ToList(); - - Assert.Greater(list.Count, 0); + try + { + //this test should throw an invalid operation exception since one BirthDate is null so select clausle should crash + var query = from e in db.Employees + select (e.BirthDate.Value - parameterDate).TotalDays; + + var list = query.ToList(); + + Assert.Greater(list.Count, 0); + } + finally + { + db.Employees.DeleteOnSubmit(employee); + db.SubmitChanges(); + } } [Test] public void DateTimeDiffTotalDaysSelectWithNulls02() { Northwind db = CreateDB(); + + var employee = new Employee + { + FirstName = "Test First", + LastName = "Test Last", + }; + db.Employees.InsertOnSubmit(employee); + db.SubmitChanges(); + DateTime firstDate = db.Employees.First().BirthDate.Value; DateTime parameterDate = firstDate.Date.AddDays(2); parameterDate = parameterDate.Date.AddHours(12); - - var query = from e in db.Employees - where e.BirthDate.HasValue - select (e.BirthDate.Value - parameterDate).TotalDays; - - var list = query.ToList(); - - Assert.Greater(list.Count, 0); + try + { + var query = from e in db.Employees + where e.BirthDate.HasValue + select (e.BirthDate.Value - parameterDate).TotalDays; + + var list = query.ToList(); + + Assert.Greater(list.Count, 0); + } + finally + { + db.Employees.DeleteOnSubmit(employee); + db.SubmitChanges(); + } } +#if !DEBUG && (SQLITE || (MSSQL && L2SQL)) + // L2SQL: System.Data.SqlClient.SqlException : The datepart minute is not supported by date function datepart for data type date. + [Explicit] +#endif [Test] public void DateGetDate() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_EntitySet.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_EntitySet.cs index 2574b73d756..2dee0d414da 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_EntitySet.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_EntitySet.cs @@ -29,7 +29,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -56,6 +56,9 @@ using nwind; Assert.Greater(customer.Orders.Count, 0); } +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void EntitySetEnumerationProjection() { @@ -141,6 +144,9 @@ using nwind; } +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void Refresh01() { @@ -158,6 +164,9 @@ using nwind; Assert.AreEqual(c.Orders.Count, beforeCount); } +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void Refresh02() { @@ -181,6 +190,9 @@ using nwind; } +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void Refresh03() { @@ -195,6 +207,9 @@ using nwind; Assert.AreNotEqual(order.CustomerID, newcustomerId); } +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void Refresh04() { @@ -299,6 +314,9 @@ using nwind; Assert.IsFalse(customer.Orders.IsDeferred); } +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void DeferedExecutionAndLoadWith() { @@ -317,9 +335,7 @@ using nwind; { var db = CreateDB(); var customer = db.Customers.First(); - Assert.AreEqual("jacques", customer.ContactName, "#1"); int beforeCount = customer.Orders.Count; - Assert.AreEqual(1, beforeCount, "#2"); var order = new Order(); customer.Orders.Add(order); Assert.AreEqual(beforeCount + 1, customer.Orders.Count, "#3"); @@ -333,9 +349,6 @@ using nwind; { var db = CreateDB(); var customer = db.Customers.First(); - Assert.AreEqual("jacques", customer.ContactName, "#1"); - int beforeCount = customer.Orders.Count; - Assert.AreEqual(1, beforeCount, "#2"); var order = new Order(); ((IList)customer.Orders).Add(order); ((IList)customer.Orders).Add(order); // raises ArgumentOutOfRangeException for duplicate @@ -372,12 +385,17 @@ using nwind; { var db = CreateDB(); var customer = db.Customers.First(); + Assert.IsTrue(customer.Orders.IsDeferred); int beforeCount = customer.Orders.Count; + Assert.IsFalse(customer.Orders.IsDeferred); if (beforeCount == 0) Assert.Ignore(); - customer.Orders.Remove(customer.Orders.First()); + Assert.IsFalse(customer.Orders.Remove(null)); + Assert.AreEqual(beforeCount, customer.Orders.Count); + + Assert.IsTrue(customer.Orders.Remove(customer.Orders.First())); Assert.AreEqual(customer.Orders.Count, beforeCount - 1); } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Join.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Join.cs index 731b2f001c6..bc6f08966e2 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Join.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Join.cs @@ -53,7 +53,7 @@ using DbLinq.Data.Linq; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -65,6 +65,9 @@ using DbLinq.Data.Linq; public class ReadTests_Join : TestBase { +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test(Description = "example by Frans Brouma: select all customers that have no orders")] public void LeftJoin_DefaultIfEmpty() { @@ -83,8 +86,8 @@ using DbLinq.Data.Linq; var list = q.ToList(); Assert.IsTrue(list.Count > 0); - int countALFKI = list.Count(item => item.CustomerID == "ALFKI"); - Assert.IsTrue(countALFKI == 1); + int countPARIS = list.Count(item => item.CustomerID == "PARIS"); + Assert.IsTrue(countPARIS == 1); } [Test] @@ -112,7 +115,7 @@ using DbLinq.Data.Linq; foundNull = foundNull || item.City == null; } Assert.IsTrue(foundMelb, "Expected rows with City=Melbourne"); - Assert.IsTrue(foundNull, "Expected rows with City=null"); + Assert.IsFalse(foundNull, "Expected no rows with City=null"); } // picrap: commented out, it doesn't build because of db.Orderdetails (again, a shared source file...) @@ -136,6 +139,10 @@ using DbLinq.Data.Linq; Assert.IsTrue(q1.Count > 0); } +#if !DEBUG && (SQLITE || MSSQL) + // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTests_Join+Northwind1+ExtendedOrder' is not mapped as a Table. + [Explicit] +#endif [Test] public void RetrieveParentAssociationProperty() { @@ -154,6 +161,10 @@ using DbLinq.Data.Linq; +#if !DEBUG && (SQLITE || MSSQL) + // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTests_Join+Northwind1+ExtendedOrder' is not mapped as a Table. + [Explicit] +#endif [Test] public void DifferentParentAndAssociationPropertyNames() { @@ -170,6 +181,10 @@ using DbLinq.Data.Linq; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (SQLITE || MSSQL) + // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.ReadTests_Join+Northwind1+ExtendedOrder' is not mapped as a Table. + [Explicit] +#endif [Test] public void SelectCustomerContactNameFromOrder() { @@ -245,6 +260,7 @@ using DbLinq.Data.Linq; } [Test] + [ExpectedException(typeof(NotSupportedException))] public void WhereBeforeSelect() { Northwind db = CreateDB(); @@ -260,7 +276,6 @@ using DbLinq.Data.Linq; Freight = dok.Freight }); var list = query.ToList(); - Assert.IsTrue(list.Count > 0); } /// @@ -299,6 +314,9 @@ using DbLinq.Data.Linq; var l = custOderInfos.ToList(); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] // submitted by bryan costanich public void ImplicitLeftOuterJoin() diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Maths.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Maths.cs index f72ee01d0f4..1a82ad897c1 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Maths.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_Maths.cs @@ -21,7 +21,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -63,6 +63,9 @@ using nwind; //EXP (SSIS) +#if !DEBUG && (SQLITE && MONO) + [Explicit] +#endif [Test] public void Exp() { @@ -84,6 +87,9 @@ using nwind; //Devuelve el menor entero mayor o igual que una expresión numérica. +#if !DEBUG && (SQLITE && MONO) + [Explicit] +#endif [Test] public void Floor() { @@ -102,48 +108,53 @@ using nwind; //LN (SSIS) +#if !DEBUG && (SQLITE) + [Explicit] +#endif [Test] public void Log01() { Northwind db = CreateDB(); var q = from c in db.OrderDetails - where Math.Log((double)(c.Discount)) > 0.0 + where Math.Log((double)(c.Discount + 1)) > 0.0 select c; - var list = q.ToList(); - + Assert.AreEqual(838, q.Count()); } +#if !DEBUG && (SQLITE) + [Explicit] +#endif [Test] public void Log02() { Northwind db = CreateDB(); var q = from c in db.OrderDetails - where Math.Log((double)(c.Discount),3.0) > 0.0 + where Math.Log((double)(c.Discount + 1),3.0) > 0.0 select c; - var list = q.ToList(); - + Assert.AreEqual(838, q.Count()); } //Devuelve el logaritmo natural de una expresión numérica. //LOG (SSIS) - +#if !DEBUG && (SQLITE && MONO) + [Explicit] +#endif [Test] public void Log03() { Northwind db = CreateDB(); var q = from c in db.OrderDetails - where Math.Log10((double)(c.Discount)) > 0.0 + where Math.Log10((double)(c.Discount + 1)) > 0.0 select c; - var list = q.ToList(); - + Assert.AreEqual(838, q.Count()); } @@ -151,6 +162,9 @@ using nwind; //POWER (SSIS) +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void Pow() { @@ -166,7 +180,9 @@ using nwind; //Devuelve el resultado de elevar una expresión numérica a una determinada potencia. //ROUND (SSIS) - +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test] public void Round() { @@ -180,6 +196,9 @@ using nwind; } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] [ExpectedException(typeof(NotSupportedException))] public void Round02() @@ -199,6 +218,9 @@ using nwind; //SIGN (SSIS) +#if !DEBUG && (SQLITE && MONO) + [Explicit] +#endif [Test] public void Sign01() { @@ -219,6 +241,9 @@ using nwind; //SQRT (SSIS) +#if !DEBUG && (SQLITE && MONO) + [Explicit] +#endif [Test] public void Sqrt() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_ReferenceLoading.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_ReferenceLoading.cs index db8443a7758..185bd839698 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_ReferenceLoading.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_ReferenceLoading.cs @@ -22,7 +22,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -68,6 +68,9 @@ using nwind; Assert.AreEqual(db.Employees.Count(), list.Count); } +#if !DEBUG && (SQLITE || (MSSQL && !MONO_STRICT)) + [Explicit] +#endif [Test] public void ComplexProjection01() { @@ -78,6 +81,9 @@ using nwind; Assert.AreEqual(db.Employees.Count(), list.Count); } +#if !DEBUG && (SQLITE || (MSSQL && !MONO_STRICT)) + [Explicit] +#endif [Test] public void ComplexProjection02() { @@ -89,6 +95,9 @@ using nwind; } +#if !DEBUG && (SQLITE || (MSSQL && !MONO_STRICT)) + [Explicit] +#endif [Test] public void ComplexProjection03() { @@ -99,7 +108,10 @@ using nwind; Assert.AreEqual(db.Employees.Count(), list.Count); } - + +#if !DEBUG && (SQLITE || (MSSQL && !MONO_STRICT)) + [Explicit] +#endif [Test] public void ComplexProjection04() { @@ -110,6 +122,9 @@ using nwind; Assert.AreEqual(db.Employees.Count(), list.Count); } +#if !DEBUG && (SQLITE || (MSSQL && !MONO_STRICT)) + [Explicit] +#endif [Test] public void ComplexProjection05() { @@ -120,6 +135,9 @@ using nwind; Assert.AreEqual(db.Orders.Count(), list.Count); } +#if !DEBUG && (SQLITE || (MSSQL && !MONO_STRICT)) + [Explicit] +#endif [Test] public void ComplexProjection06() { @@ -130,6 +148,9 @@ using nwind; Assert.AreEqual(db.Orders.Count(), list.Count); } +#if !DEBUG && (SQLITE || (MSSQL && !MONO_STRICT)) + [Explicit] +#endif [Test] public void ComplexProjection07() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_StringFunctions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_StringFunctions.cs index 6ee33f0e6df..0c95ce38b20 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_StringFunctions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/ReadTests_StringFunctions.cs @@ -48,7 +48,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -166,6 +166,9 @@ using nwind; } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void IndexOf02() { @@ -190,9 +193,11 @@ using nwind; var list = q.ToList(); Assert.IsTrue(list.Count > 0); - } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void IndexOf04() { @@ -208,6 +213,9 @@ using nwind; +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void IndexOf05() { @@ -223,6 +231,9 @@ using nwind; +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void IndexOf06() { @@ -236,6 +247,9 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void IndexOf08() { @@ -327,6 +341,18 @@ using nwind; Assert.AreEqual(list.Count, db.Employees.Count()); } + [Test] + public void IndexOf15() + { + Northwind db = CreateDB(); + + var q = from e in db.Employees + where " fu".IndexOf('a') == 1 + select e; + + var list = q.ToList(); + Assert.AreEqual(0, list.Count); + } [Test] public void Remove01() @@ -444,6 +470,9 @@ using nwind; Assert.IsTrue(custID == "ALFKI"); } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test] public void StartsWith02() { @@ -457,6 +486,29 @@ using nwind; Assert.IsTrue(matchStart); } + + /// + /// This test is related to paths: enable DbLinq to search for a path or it's container + /// Since we have no path in Nortwind we use a CustomerID. + /// +#if !DEBUG && (MSSQL && L2SQL) + // L2SQL: System.NotSupportedException : Only arguments that can be evaluated on the client are supported for the String.StartsWith method. [Test] + [Explicit] +#endif + [Test] + public void StartsWith03() + { + string path = "ALFKI test"; + Northwind db = CreateDB(); + + var q = from c in db.Customers + where path.StartsWith(c.CustomerID) + select c; + + Customer match = q.Single(); + Assert.IsNotNull(match); + } + [Test] public void EndsWith01() { @@ -493,10 +545,12 @@ using nwind; where "ALFKI".EndsWith("LFKI") select c.CustomerID; - string custID = q.Single(); - Assert.IsTrue(custID == "ALFKI"); + Assert.AreEqual(q.ToList().Count, db.Customers.Count()); } +#if !DEBUG && (MSSQL && !L2SQL) + [Explicit] +#endif [Test] public void EndsWith04() { @@ -508,6 +562,9 @@ using nwind; Assert.IsTrue(q.Any(r => r == true)); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void StartsWithPercent01() { @@ -522,6 +579,10 @@ using nwind; Assert.AreEqual(0, cnt); } +#if !DEBUG && (MSSQL && L2SQL) + // L2SQL: System.NotSupportedException : Method 'System.String TrimStart(Char[])' has no supported translation to SQL. [Test] + [Explicit] +#endif [Test] public void LTrim01() { @@ -535,6 +596,10 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (MSSQL) + // L2SQL: System.InvalidOperationException : Could not translate expression 'Table(Employee).Select(e => Not(e.LastName.TrimStart(Invoke(value(System.Func`1[System.Char[]]))).Contains(" ")))' into SQL and could not treat it as a local expression. + [Explicit] +#endif [Test] public void LTrim02() { @@ -547,6 +612,10 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (MSSQL && L2SQL) + // L2SQL: System.NotSupportedException : Method 'System.String TrimEnd(Char[])' has no supported translation to SQL. + [Explicit] +#endif [Test] public void RTrim01() { @@ -560,6 +629,10 @@ using nwind; Assert.IsTrue(list.Count > 0); } +#if !DEBUG && (MSSQL) + // L2SQL: System.InvalidOperationException : Could not translate expression 'Table(Employee).Select(e => Not(e.LastName.TrimEnd(Invoke(value(System.Func`1[System.Char[]]))).Contains(" ")))' into SQL and could not treat it as a local expression. + [Explicit] +#endif [Test] public void RTrim02() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/StoredProcTest.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/StoredProcTest.cs index 12203dd54c4..64f5da9baab 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/StoredProcTest.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/StoredProcTest.cs @@ -46,7 +46,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -58,7 +58,7 @@ using nwind; public class StoredProcTest : TestBase { -#if !SQLITE && !MSSQL && !MONO_STRICT && !FIREBIRD +#if !SQLITE && !MSSQL && !L2SQL && !FIREBIRD [Test] public void SP1_CallHello0() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Table.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Table.cs index 5a53bc5c0ef..c740a9c78e8 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Table.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Table.cs @@ -22,7 +22,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -40,6 +40,9 @@ using nwind; var customers = db.Customers.ToArray(); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void GetModifiedMembers() { @@ -68,6 +71,9 @@ using nwind; Assert.AreEqual(modInfo.OriginalValue, beforeFax); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void GetOriginalEntityState() { @@ -102,6 +108,9 @@ using nwind; // Assert.IsTrue(db2.Customers.IsReadOnly); //} +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void Attach01() { @@ -112,6 +121,9 @@ using nwind; Assert.IsFalse(db.Customers.Contains(customer)); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] [ExpectedException(typeof(NotSupportedException))] public void Attach02() @@ -125,6 +137,9 @@ using nwind; db2.Customers.Attach(customer); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] [ExpectedException(typeof(InvalidOperationException))] public void Attach03() @@ -135,6 +150,9 @@ using nwind; db.Customers.Attach(customer); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void Attach04() { @@ -146,6 +164,9 @@ using nwind; Assert.Greater(db.Customers.GetModifiedMembers(customer).Count(), 0); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] [ExpectedException(typeof(InvalidOperationException))] public void Attach05() @@ -155,6 +176,9 @@ using nwind; db.Customers.Attach(customer, true); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void Attach06() { @@ -167,6 +191,9 @@ using nwind; } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void AttachAll() { @@ -178,6 +205,9 @@ using nwind; } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void GetBindingList() { @@ -200,11 +230,11 @@ using nwind; DbLinq.Data.Linq.DataContext(db.Connection, CreateVendor()); #endif - var dbq = from p in db.Products where p.ProductName == "Pen" select p.ProductID; + var dbq = from p in db.Products where p.ProductName == "Chai" select p.ProductID; var dbc = dbq.ToList().Count; Assert.AreEqual(dbc, 1); - var dcq = from p in dc.GetTable() where p.ProductName == "Pen" select p.ProductID; + var dcq = from p in dc.GetTable() where p.ProductName == "Chai" select p.ProductID; var dcc = dcq.ToList().Count; Assert.AreEqual(dbc, 1); } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/TestBase.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/TestBase.cs index 983eebc5752..e593fc37c6e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/TestBase.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/TestBase.cs @@ -33,6 +33,37 @@ using NUnit.Framework; using nwind; +#if MONO_STRICT && !MONO +using System.Diagnostics; +public static class Profiler +{ + private static Stopwatch timer = new Stopwatch(); + + [Conditional("DEBUG")] + public static void Start() + { + timer.Reset(); + timer.Start(); + } + [Conditional("DEBUG")] + public static void At(string format, params object[] args) + { + timer.Stop(); + Console.Write("#AT({0:D12}) ", timer.ElapsedTicks); + Console.WriteLine(format, args); + timer.Start(); + } + + [Conditional("DEBUG")] + public static void Stop() + { + timer.Stop(); + } +} +#else +using DbLinq.Util; +#endif + namespace Test_NUnit { /// @@ -41,6 +72,20 @@ namespace Test_NUnit /// public abstract partial class TestBase { + [SetUp] + public void BaseSetUp() + { + Profiler.Start(); + Profiler.At("BaseSetUp()"); + } + + [TearDown] + public void BaseTearDown() + { + Profiler.At("BaseTearDown()"); + Profiler.Stop(); + } + public string DbServer { get @@ -53,7 +98,7 @@ namespace Test_NUnit get { var xConnectionStringsDoc = new XmlDocument(); - xConnectionStringsDoc.Load("../src/ConnectionStrings.xml"); + xConnectionStringsDoc.Load("../tests/ConnectionStrings.xml"); XmlNode currentAssemblyNode = xConnectionStringsDoc.SelectSingleNode(string.Format("//Connection[@assembly=\"{0}\"]", Assembly.GetCallingAssembly().GetName().Name)); string stringConnection = currentAssemblyNode.FirstChild.Value.Replace(@"\\", @"\"); if (stringConnection.Contains("{0}")) diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Transactions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Transactions.cs index 127c3d60f6b..177fd19f270 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Transactions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/Transactions.cs @@ -23,7 +23,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -58,6 +58,9 @@ using nwind; } } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void TransactionRollbackDelete() { @@ -103,6 +106,9 @@ using nwind; return t; } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void TransactionCheckAndRollbackInsert() { @@ -128,7 +134,17 @@ using nwind; afterCustomercount = db.Customers.Count(); Assert.IsTrue(beforeCustomersCount == afterCustomercount); + // The Count is correct. However, DataContext doesn't know that the + // transaction was aborted, and will satisfy the following from + // an internal cache var customer = db.Customers.FirstOrDefault(c => c.CustomerID == id); + Assert.IsNotNull(customer); + + // Let's let DataContext know that it doesn't exist anymore. + db.Customers.DeleteOnSubmit(customer); + db.SubmitChanges(); // Note no exception from deleting a non-existent entity + + customer = db.Customers.FirstOrDefault(c => c.CustomerID == id); Assert.IsNull(customer); } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/VerticalPartitioningTest.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/VerticalPartitioningTest.cs index b974a343f98..5713e0f5053 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/VerticalPartitioningTest.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/VerticalPartitioningTest.cs @@ -43,7 +43,7 @@ using Test_NUnit; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/WriteTest.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/WriteTest.cs index 585a0e5e6aa..3c8ef70ed07 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/WriteTest.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/WriteTest.cs @@ -39,8 +39,12 @@ using nwind; #if MONO_STRICT using System.Data.Linq; +#if MONO +using DbLinq.Util; +#endif #else using DbLinq.Data.Linq; +using DbLinq.Util; #endif #if ORACLE @@ -62,7 +66,7 @@ using Id = System.Int32; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -70,12 +74,16 @@ using Id = System.Int32; namespace Test_NUnit_Firebird #endif { - [SetUpFixture] - public class WriteTestSetup : TestBase + [TestFixture] + public class WriteTest : TestBase { [SetUp] public void TestSetup() { + base.BaseSetUp(); + + Profiler.At("START: WriteTest.TestSetup()"); + Northwind db = CreateDB(); // "[Products]" gets converted to "Products". //This is a DbLinq-defined escape sequence, by Pascal. @@ -88,12 +96,9 @@ using Id = System.Int32; db.Categories.DeleteAllOnSubmit(deleteCategories); db.SubmitChanges(); - } - } - [TestFixture] - public class WriteTest : TestBase - { + Profiler.At("END: WriteTest.TestSetup()"); + } #region Tests 'E' test live object cache [Test] @@ -102,16 +107,18 @@ using Id = System.Int32; //grab an object twice, make sure we get the same object each time Northwind db = CreateDB(); var q = from p in db.Products select p; - Product pen1 = q.First(); - Product pen2 = q.First(); + Product product1 = q.First(); + Product product2 = q.First(); + Assert.AreSame(product1, product2); + string uniqueStr = "Unique" + Environment.TickCount; - pen1.QuantityPerUnit = uniqueStr; - bool isSameObject1 = pen2.QuantityPerUnit == uniqueStr; - Assert.IsTrue(isSameObject1, "Expected pen1 and pen2 to be the same live object, but their fields are different"); - object oPen1 = pen1; - object oPen2 = pen2; - bool isSameObject2 = oPen1 == oPen2; - Assert.IsTrue(isSameObject2, "Expected pen1 and pen2 to be the same live object, but their fields are different"); + product1.QuantityPerUnit = uniqueStr; + bool isSameObject1 = product2.QuantityPerUnit == uniqueStr; + Assert.IsTrue(isSameObject1, "Expected product1 and product2 to be the same live object, but their fields are different"); + object oProduct1 = product1; + object oProduct2 = product2; + bool isSameObject2 = oProduct1 == oProduct2; + Assert.IsTrue(isSameObject2, "Expected product1 and product2 to be the same live object, but their fields are different"); } [Test] @@ -120,10 +127,10 @@ using Id = System.Int32; //grab an object twice, make sure we get the same object each time Northwind db = CreateDB(); var q = from p in db.Products select p; - Product pen1 = q.First(p => p.ProductName == "Pen"); - Product pen2 = q.Single(p => p.ProductName == "Pen"); - bool isSame = object.ReferenceEquals(pen1, pen2); - Assert.IsTrue(isSame, "Expected pen1 and pen2 to be the same live object"); + Product product1 = q.First(p => p.ProductName == "Chai"); + Product product2 = q.Single(p => p.ProductName == "Chai"); + bool isSame = object.ReferenceEquals(product1, product2); + Assert.IsTrue(isSame, "Expected product2 and product2 to be the same live object"); } #if MYSQL && USE_ALLTYPES @@ -261,9 +268,20 @@ using Id = System.Int32; public void G6_UpdateTableWithStringPK() { Northwind db = CreateDB(); + var customer = new Customer + { + CompanyName = "Test Company", + ContactName = "Test Customer", + CustomerID = "BT___", + }; + db.Customers.InsertOnSubmit(customer); + db.SubmitChanges(); Customer BT = db.Customers.Single(c => c.CustomerID == "BT___"); BT.Country = "U.K."; db.SubmitChanges(); + + db.Customers.DeleteOnSubmit(customer); + db.SubmitChanges(); } [Test] @@ -299,13 +317,7 @@ using Id = System.Int32; { Northwind db = CreateDB(); var cust = (from c in db.Customers - select - new Customer - { - CustomerID = c.CustomerID, - City = c.City - - }).First(); + select c).First(); var old = cust.City; cust.City = "Tallinn"; @@ -514,6 +526,9 @@ dummy text #endif +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void G12_EmptyInsertList() { @@ -526,6 +541,9 @@ dummy text db.SubmitChanges(); } +#if !DEBUG && (SQLITE || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void G13_ProvidedAutoGeneratedColumn() { @@ -535,10 +553,12 @@ dummy text newCat.CategoryName = "test"; db.Categories.InsertOnSubmit(newCat); db.SubmitChanges(); - Assert.AreEqual(999, newCat.CategoryID); + // CategoryID is [Column(AutoSync=AutoSync.OnInsert)], so it's + // value is ignored on insert and will be updated + Assert.AreNotEqual(999, newCat.CategoryID); // then, load our object var checkCat = (from c in db.Categories where c.CategoryID == newCat.CategoryID select c).Single(); - Assert.AreEqual(999, checkCat.CategoryID); + Assert.AreEqual(newCat.CategoryID, checkCat.CategoryID); // remove the whole thing db.Categories.DeleteOnSubmit(newCat); db.SubmitChanges(); @@ -549,11 +569,14 @@ dummy text public void G14_AutoGeneratedSupplierIdAndCompanyName() { Northwind db = CreateDB(); - Supplier supplier = new Supplier(); + Supplier supplier = new Supplier() + { + CompanyName = "Test Company", + }; db.Suppliers.InsertOnSubmit(supplier); db.SubmitChanges(); Assert.IsNotNull(supplier.SupplierID); - Assert.AreEqual(null, supplier.CompanyName); + Assert.AreEqual("Test Company", supplier.CompanyName); db.Suppliers.DeleteOnSubmit(supplier); db.SubmitChanges(); } @@ -597,6 +620,9 @@ dummy text /// You are not expected to hold the cache for an extended duration (except possibly for a client scenario), /// or share it across threads, processes, or machines in a cluster. /// +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void G16_CustomerCacheHit() { @@ -604,15 +630,18 @@ dummy text Customer c1 = new Customer() { CustomerID = "temp", CompanyName = "Test", ContactName = "Test" }; db.Customers.InsertOnSubmit(c1); db.SubmitChanges(); - db.ExecuteCommand("delete from customers WHERE CustomerID='temp'"); + db.ExecuteCommand("delete from \"Customers\" WHERE \"CustomerID\"='temp'"); - var res = (from c in db.Customers - where c.CustomerID == "temp" - select c).Single(); + var res = db.Customers.First(c => c.CustomerID == "temp"); + Assert.IsNotNull(res); } +#if !DEBUG && (SQLITE || POSTGRES || MSSQL) + // L2SQL: System.InvalidOperationException : The type 'Test_NUnit_MsSql_Strict.WriteTest+OrderDetailWithSum' is not mapped as a Table. + [Explicit] +#endif [Test] public void G17_LocalPropertyUpdate() { @@ -665,8 +694,12 @@ dummy text } } - +#if !DEBUG && (!(MSSQL && L2SQL)) + [Explicit] +#endif + // L2SQL: System.NotSupportedException : An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext. This is not supported. [Test] + [ExpectedException(typeof(NotSupportedException))] public void G18_UpdateWithAttach() { List list; @@ -681,38 +714,27 @@ dummy text if (order.Freight == null) continue; tbl.Attach(order); - order.Freight += 1; - } - db.SubmitChanges(); - } - - using (Northwind db = CreateDB()) - { - var tbl = db.GetTable(); - foreach (var order in list) - { - if (order.Freight == null) - continue; - tbl.Attach(order); - order.Freight -= 1; } db.SubmitChanges(); } } +#if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL)) + [Explicit] +#endif [Test] public void G19_ExistingCustomerCacheHit() { Northwind db = CreateDB(); - string id = "AIRBU"; + string id = "ALFKI"; Customer c1 = (from c in db.Customers where id == c.CustomerID select c).Single(); db.Connection.ConnectionString = null; - var x = db.Customers.Single(c => id == c.CustomerID); + var x = db.Customers.First(c => id == c.CustomerID); } @@ -733,7 +755,7 @@ dummy text Assert.AreEqual(1, res.Count(), "#1"); - db.ExecuteCommand("delete from customers WHERE CustomerID='temp'"); + db.ExecuteCommand("DELETE FROM \"Customers\" WHERE \"CustomerID\"='temp'"); res = from c in db.Customers where c.CustomerID == id @@ -742,8 +764,7 @@ dummy text } finally { - db.ExecuteCommand("delete from customers WHERE CustomerID='temp'"); - + db.ExecuteCommand("DELETE FROM \"Customers\" WHERE \"CustomerID\"='temp'"); } } @@ -769,6 +790,9 @@ dummy text db.SubmitChanges(); } +#if !DEBUG && SQLITE + [Explicit] +#endif [Test] public void InsertAndDeleteWithDependencies() { @@ -780,7 +804,11 @@ dummy text var product = new Product { +#if INGRES + Discontinued = 1, +#else Discontinued = true, +#endif ProductName = newProduct1, }; @@ -804,7 +832,11 @@ dummy text var p2 = new Product { +#if INGRES + Discontinued = 1, +#else Discontinued = true, +#endif ProductName = newProduct2 }; category.Products.Add(p2); diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/WriteTest_BulkInsert.cs b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/WriteTest_BulkInsert.cs index cbdd75c236c..9c067b72eef 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/WriteTest_BulkInsert.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Test/Providers/WriteTest_BulkInsert.cs @@ -47,7 +47,7 @@ using nwind; namespace Test_NUnit_Sqlite #elif INGRES namespace Test_NUnit_Ingres -#elif MSSQL && MONO_STRICT +#elif MSSQL && L2SQL namespace Test_NUnit_MsSql_Strict #elif MSSQL namespace Test_NUnit_MsSql @@ -59,6 +59,9 @@ using nwind; [TestFixture] public class WriteTest_BulkInsert : TestBase { +#if !DEBUG && (SQLITE || MSSQL) + [Explicit] +#endif [Test] public void BI01_InsertProducts() { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/DataCommand.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/DataCommand.cs index 960665b806e..80a415049ff 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/DataCommand.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/DataCommand.cs @@ -33,9 +33,7 @@ namespace DbLinq.Util /// /// Executes a given SQL command, with parameter and delegate /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT // TODO: once R# is fixed with internal extension methods problems, switch to full internal public // DataCommand is used by vendors #endif diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/DbmlExtensions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/DbmlExtensions.cs index 71b08cf68ee..d692d023232 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/DbmlExtensions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/DbmlExtensions.cs @@ -32,9 +32,7 @@ namespace DbLinq.Util /// /// Executes a given SQL command, with parameter and delegate /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT // TODO: once R# is fixed with internal extension methods problems, switch to full internal public // DataCommand is used by vendors #endif diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/ExpressionChainEqualityComparer.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/ExpressionChainEqualityComparer.cs index ce085f28b20..772fdc43aae 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/ExpressionChainEqualityComparer.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/ExpressionChainEqualityComparer.cs @@ -26,11 +26,8 @@ using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sugar; -#else + using DbLinq.Data.Linq.Sugar; -#endif namespace DbLinq.Util diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/ExpressionEqualityComparer.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/ExpressionEqualityComparer.cs index f223fe98d6f..a3798c39227 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/ExpressionEqualityComparer.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/ExpressionEqualityComparer.cs @@ -27,11 +27,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Implementation; -#else using DbLinq.Data.Linq.Implementation; -#endif namespace DbLinq.Util { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/IDataRecordExtensions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/IDataRecordExtensions.cs index 562abc215fd..be897df5972 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/IDataRecordExtensions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/IDataRecordExtensions.cs @@ -28,9 +28,7 @@ using System.Data; namespace DbLinq.Util { -#if MONO_STRICT || !DEBUG - internal -#else +#if !MONO_STRICT public #endif static class IDataRecordExtensions @@ -105,10 +103,10 @@ namespace DbLinq.Util public static byte[] GetAsBytes(this IDataRecord dataRecord, int index) { if (dataRecord.IsDBNull(index)) - return null; + return new byte[0]; object obj = dataRecord.GetValue(index); if (obj == null) - return null; //nullable blob? + return new byte[0]; //nullable blob? byte[] bytes = obj as byte[]; if (bytes != null) return bytes; //works for BLOB field @@ -117,6 +115,14 @@ namespace DbLinq.Util return new byte[0]; } + public static System.Data.Linq.Binary GetAsBinary(this IDataRecord dataRecord, int index) + { + byte[] bytes = GetAsBytes(dataRecord, index); + if (bytes.Length == 0) + return null; + return new System.Data.Linq.Binary(bytes); + } + public static object GetAsObject(this IDataRecord dataRecord, int index) { if (dataRecord.IsDBNull(index)) diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/IDataTypeExtensions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/IDataTypeExtensions.cs index 315ce4b0fea..a8da9c3eaed 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/IDataTypeExtensions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/IDataTypeExtensions.cs @@ -28,9 +28,7 @@ using DbLinq.Vendor; namespace DbLinq.Util { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public // used by external vendors #endif static class IDataTypeExtensions diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/IDbDataParameterExtensions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/IDbDataParameterExtensions.cs index 0849945c16a..724ab44d145 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/IDbDataParameterExtensions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/IDbDataParameterExtensions.cs @@ -30,9 +30,7 @@ using System.Data.Linq; namespace DbLinq.Util { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif static class IDbDataParameterExtensions diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/ILoggerExtension.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/ILoggerExtension.cs deleted file mode 100644 index 5e751915c56..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/ILoggerExtension.cs +++ /dev/null @@ -1,245 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion - -using System; -using System.Collections.Generic; -using System.Linq.Expressions; -using DbLinq.Logging; - -namespace DbLinq.Util -{ - internal static class ILoggerExtension - { - public static void WriteExpression(this ILogger logger, Level level, Expression expression) - { - try - { - var rawLines = new List(Write(expression, string.Empty, 0)); - rawLines.Insert(0, string.Empty); - var lines = rawLines.ToArray(); - logger.Write(level, string.Join(Environment.NewLine, lines)); - } - catch (NullReferenceException) - { - - } - } - - private static IList Write(Expression expression, string header, int depth) - { - if (expression == null) - return new[] {WriteLiteral("(null)", header, depth)}; - if (expression is BinaryExpression) - return WriteEx((BinaryExpression)expression, header, depth); - if (expression is ConditionalExpression) - return WriteEx((ConditionalExpression)expression, header, depth); - if (expression is ConstantExpression) - return WriteEx((ConstantExpression)expression, header, depth); - if (expression is InvocationExpression) - return WriteEx((InvocationExpression)expression, header, depth); - if (expression is LambdaExpression) - return WriteEx((LambdaExpression)expression, header, depth); - if (expression is MemberExpression) - return WriteEx((MemberExpression)expression, header, depth); - if (expression is MethodCallExpression) - return WriteEx((MethodCallExpression)expression, header, depth); - if (expression is NewExpression) - return WriteEx((NewExpression)expression, header, depth); - if (expression is NewArrayExpression) - return WriteEx((NewArrayExpression)expression, header, depth); - if (expression is MemberInitExpression) - return WriteEx((MemberInitExpression)expression, header, depth); - if (expression is ListInitExpression) - return WriteEx((ListInitExpression)expression, header, depth); - if (expression is ParameterExpression) - return WriteEx((ParameterExpression)expression, header, depth); - if (expression is TypeBinaryExpression) - return WriteEx((TypeBinaryExpression)expression, header, depth); - if (expression is UnaryExpression) - return WriteEx((UnaryExpression)expression, header, depth); - - return new[] {WriteHeader(expression, header, depth)}; - } - - private static IList WriteEx(BinaryExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.AddRange(Write(expression.Left, "Left ", depth)); - lines.AddRange(Write(expression.Right, "Right", depth)); - return lines; - } - - private static IList WriteEx(ConditionalExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.AddRange(Write(expression.Test, "If ", depth)); - lines.AddRange(Write(expression.IfTrue, "Then", depth)); - lines.AddRange(Write(expression.IfFalse, "Else", depth)); - return lines; - } - - private static IList WriteEx(ConstantExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.Add(WriteLiteral(expression.Value, "Value", depth)); - return lines; - } - - private static IList WriteEx(InvocationExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.AddRange(Write(expression.Expression, "Call", depth)); - for (int i = 0; i < expression.Arguments.Count; i++) - lines.AddRange(Write(expression.Arguments[i], string.Format("#{0:0##}", i), depth)); - return lines; - } - - private static IList WriteEx(LambdaExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.AddRange(Write(expression.Body, "Call", depth)); - for (int i = 0; i < expression.Parameters.Count; i++) - lines.AddRange(Write(expression.Parameters[i], string.Format("#{0:0##}", i), depth)); - return lines; - } - - private static IList WriteEx(MemberExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.AddRange(Write(expression.Expression, "Object", depth)); - lines.Add(WriteLiteral(expression.Member.Name, "Member", depth)); - return lines; - } - - private static IList WriteEx(MethodCallExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.AddRange(Write(expression.Object, "Object", depth)); - lines.Add(WriteLiteral(expression.Method.Name, "Method", depth)); - for (int i = 0; i < expression.Arguments.Count; i++) - lines.AddRange(Write(expression.Arguments[i], string.Format("#{0:0####}", i), depth)); - return lines; - } - - private static IList WriteEx(NewExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.Add(WriteLiteral(expression.Constructor.Name, "Ctor", depth)); - for (int i = 0; i < expression.Arguments.Count; i++) - lines.AddRange(Write(expression.Arguments[i], string.Format("#{0:0##}", i), depth)); - if (expression.Members != null) - { - for (int i = 0; i < expression.Members.Count; i++) - lines.Add(WriteLiteral(expression.Members[i].Name, string.Format("M{0:0##}", i), depth)); - } - return lines; - } - - private static IList WriteEx(NewArrayExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - for (int i = 0; i < expression.Expressions.Count; i++) - lines.AddRange(Write(expression.Expressions[i], string.Format("#{0:0##}", i), depth)); - return lines; - } - - private static IList WriteEx(MemberInitExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.AddRange(Write(expression.NewExpression, "New", depth)); - for (int i = 0; i < expression.Bindings.Count; i++) - lines.Add(WriteLiteral(expression.Bindings[i].Member.Name, string.Format("B{0:0##}", i), depth)); - return lines; - } - - private static IList WriteEx(ListInitExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.AddRange(Write(expression.NewExpression, "New", depth)); - for (int i = 0; i < expression.Initializers.Count; i++) - { - lines.Add(WriteLiteral(expression.Initializers[i].AddMethod.Name, string.Format("Method{0:0##}", i), depth)); - for (int j = 0; j < expression.Initializers[i].Arguments.Count; j++) - { - lines.AddRange(Write(expression.Initializers[i].Arguments[j], string.Format("#{0:0##}", j), depth + 1)); - } - } - return lines; - } - - private static IList WriteEx(ParameterExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.Add(WriteLiteral(expression.Name, "Parameter", depth)); - return lines; - } - - private static IList WriteEx(TypeBinaryExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.AddRange(Write(expression.Expression, "Expression", depth)); - lines.Add(WriteLiteral(expression.TypeOperand.Name, "Type ", depth)); - return lines; - } - - private static IList WriteEx(UnaryExpression expression, string header, int depth) - { - var lines = new List(); - lines.Add(WriteHeader(expression, header, depth++)); - lines.Add(WriteLiteral(expression.Method != null ? expression.Method.Name : null, "Method ", depth)); - lines.AddRange(Write(expression.Operand, "Operand", depth)); - return lines; - } - - private static string WriteHeader(Expression expression, string header, int depth) - { - return string.Format("{0}{1} {2} ({3})", GetPrefix(depth), header, expression.NodeType, expression.GetType().Name); - } - - private static string WriteLiteral(object value, string header, int depth) - { - return string.Format("{0}{1}: {2}", GetPrefix(depth), header, value); - } - - private static string GetPrefix(int depth) - { - return string.Empty.PadRight(depth * 2, '.'); - } - } -} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/MemberInfoExtensions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/MemberInfoExtensions.cs index 39cbf051bee..cbc9324022f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/MemberInfoExtensions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/MemberInfoExtensions.cs @@ -32,9 +32,7 @@ namespace DbLinq.Util /// /// Extensions to handle FieldInfo and PropertyInfo as a single class, their MemberInfo class /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif static class MemberInfoExtensions diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/Page.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/Page.cs index 2dcebbd326f..067f444718f 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/Page.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/Page.cs @@ -28,9 +28,7 @@ using System.Collections.Generic; namespace DbLinq.Util { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif class Page diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/Profiler.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/Profiler.cs new file mode 100644 index 00000000000..138529ab570 --- /dev/null +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/Profiler.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Diagnostics; +using System.IO; + +namespace DbLinq.Util +{ +#if !MONO_STRICT + public +#endif + static class Profiler + { + [ThreadStatic] + private static Stopwatch timer = new Stopwatch(); + + private static Stopwatch Timer + { + get + { + if (timer == null) + timer = new Stopwatch(); + return timer; + } + } + + [ThreadStatic] + private static long prevTicks; + [ThreadStatic] + private static bool profiling; + [ThreadStatic] + private static TextWriter log; + + private static TextWriter Log + { + get + { + if (log == null) + log = Console.Out; + return log; + } + set + { + log = value; + } + } + + [Conditional("DEBUG")] + public static void Start() + { + profiling = true; + prevTicks = 0; + Timer.Reset(); + Timer.Start(); + } + + [Conditional("DEBUG")] + public static void At(string format, params object[] args) + { + if (profiling) + { + Timer.Stop(); + Log.Write("#AT(time={0:D12}, elapsed={1:D12}) ", Timer.ElapsedTicks, Timer.ElapsedTicks - prevTicks); + prevTicks = Timer.ElapsedTicks; + Log.WriteLine(format, args); + Timer.Start(); + } + } + + [Conditional("DEBUG")] + public static void Stop() + { + profiling = false; + Timer.Stop(); + } + } +} \ No newline at end of file diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/ReflectionUtility.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/ReflectionUtility.cs index 8267a305d46..6d269db9b64 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/ReflectionUtility.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/ReflectionUtility.cs @@ -79,6 +79,31 @@ namespace DbLinq.Util return GetMemberInfo(paramExpr, expression.Body); } + public static MemberInfo GetMemberCallInfo(LambdaExpression lambdaExpression) + { + MethodCallExpression methodCallExpression = lambdaExpression.Body as MethodCallExpression; + if (methodCallExpression != null) + { + Expression memberExpression = methodCallExpression; + while ( true ) + { + switch (memberExpression.NodeType) + { + case ExpressionType.MemberAccess: + return ((MemberExpression)memberExpression).Member; + case ExpressionType.Call: + methodCallExpression = memberExpression as MethodCallExpression; + memberExpression = (methodCallExpression.Object != null) ? methodCallExpression.Object : methodCallExpression.Arguments[0]; + break; + default: + return null; + } + } + } + else + return GetMemberInfo(lambdaExpression); + } + /// /// Returns MemberInfo specified in the lambda, optional parameter expression constraint. /// diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/TypeConvert.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/TypeConvert.cs index 404b546a18c..4c7deaeb19c 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/TypeConvert.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/TypeConvert.cs @@ -33,9 +33,7 @@ namespace DbLinq.Util /// Types conversion. /// A "smart" extension to System.Convert (at least that's what we hope) /// -#if MONO_STRICT || !DEBUG - internal -#else +#if !MONO_STRICT public #endif static class TypeConvert diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Util/TypeExtensions.cs b/mcs/class/System.Data.Linq/src/DbLinq/Util/TypeExtensions.cs index 6eaa077b475..bca44802926 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Util/TypeExtensions.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Util/TypeExtensions.cs @@ -25,6 +25,7 @@ #endregion using System; +using System.Linq; using System.Data.Linq.Mapping; using System.Reflection; @@ -53,6 +54,31 @@ namespace DbLinq.Util return GetSingleMember(t, name, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic); } + /// + /// Returns a unique MemberInfo based on column name + /// + /// The declaring type + /// The column name for the member + /// A MemberInfo or null + public static MemberInfo GetTableColumnMember(this Type t, string name) + { + return GetTableColumnMember(t, name, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance); + } + + /// + /// Returns a unique MemberInfo based on column name + /// + /// The declaring type + /// The column name for the member + /// Binding flags + /// A MemberInfo or null + public static MemberInfo GetTableColumnMember(this Type t, string name, BindingFlags bindingFlags) + { + return (from member in t.GetMembers() + where (member.GetCustomAttributes(true).OfType().DefaultIfEmpty(new ColumnAttribute()).Single().Name == name) + select member).SingleOrDefault(); + } + /// /// Returns a unique MemberInfo /// diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataName.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataName.cs index 9b9e5f15259..e03f1d2ce0e 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataName.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataName.cs @@ -28,9 +28,7 @@ namespace DbLinq.Vendor /// /// Basic name in a database entity, with a name and schema /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface IDataName diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataTableColumn.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataTableColumn.cs index edd219f617c..c180b668b26 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataTableColumn.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataTableColumn.cs @@ -28,9 +28,7 @@ namespace DbLinq.Vendor /// /// Represents a database column /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface IDataTableColumn : IDataType diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataType.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataType.cs index ff8ac8fe094..93b69a3181d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataType.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IDataType.cs @@ -28,9 +28,7 @@ namespace DbLinq.Vendor /// /// Represents a database data type /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface IDataType diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/INameAliases.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/INameAliases.cs index d8ab993eba7..4f775f7b204 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/INameAliases.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/INameAliases.cs @@ -30,9 +30,7 @@ namespace DbLinq.Vendor /// Represents aliases for table names or types. /// Depending on the implementation, search maybe case insensitive or schema insensitive /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface INameAliases @@ -68,5 +66,8 @@ namespace DbLinq.Vendor /// An optional schema (or null) /// Member type or null if no alias found string GetColumnForcedType(string column, string table, string schema); + + string GetDatabaseNameAlias(string databaseName); + string GetClassNameAlias(string className); } } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/ISchemaLoader.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/ISchemaLoader.cs index 6ccf8e69c4b..cd3c4c4bb28 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/ISchemaLoader.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/ISchemaLoader.cs @@ -31,9 +31,7 @@ using DbLinq.Schema.Dbml; namespace DbLinq.Vendor { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface ISchemaLoader diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/ISqlProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/ISqlProvider.cs index 80c6101fe91..670e9bc3f85 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/ISqlProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/ISqlProvider.cs @@ -27,19 +27,12 @@ using System.Collections.Generic; using System.Linq.Expressions; -#if MONO_STRICT -using System.Data.Linq.Sql; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sql; using DbLinq.Data.Linq.Sugar.Expressions; -#endif namespace DbLinq.Vendor { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface ISqlProvider @@ -107,6 +100,15 @@ namespace DbLinq.Vendor /// string GetTableAsAlias(string table, string alias); + /// + /// Returns a subquery alias + /// Ensures about the right case + /// + /// + /// + /// + string GetSubQueryAsAlias(string table, string alias); + /// /// Returns a table alias /// @@ -148,6 +150,13 @@ namespace DbLinq.Vendor /// SqlStatement GetSelectClause(SqlStatement[] selects); + /// + /// Joins a list of operands to make a SELECT clause + /// + /// + /// + SqlStatement GetSelectDistinctClause(SqlStatement[] selects); + /// /// Returns all table columns (*) /// diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IVendor.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IVendor.cs index cfa12227655..a91c9d311ec 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IVendor.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/IVendor.cs @@ -28,15 +28,15 @@ using System.Data; using System.Reflection; using System.Collections.Generic; -#if MONO_STRICT +#if MONO_STRICT using DataContext = System.Data.Linq.DataContext; -using Data = System.Data; using System.Data.Linq; #else using DataContext = DbLinq.Data.Linq.DataContext; +#endif + using Data = DbLinq.Data; using DbLinq.Data.Linq; -#endif using IExecuteResult = System.Data.Linq.IExecuteResult; namespace DbLinq.Vendor @@ -44,9 +44,7 @@ namespace DbLinq.Vendor /// /// Vendor - specific part of DbLinq. /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif interface IVendor diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.DataName.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.DataName.cs index 943868ee3f1..509c726cc52 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.DataName.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.DataName.cs @@ -27,12 +27,7 @@ namespace DbLinq.Vendor.Implementation { partial class SchemaLoader { -#if MONO_STRICT - internal -#else - public -#endif - class DataName : IDataName + public class DataName : IDataName { public string Name { get; set; } public string Schema { get; set; } diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.DataTableColumn.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.DataTableColumn.cs index 83c9b08117e..e1b819cbc4d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.DataTableColumn.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.DataTableColumn.cs @@ -27,12 +27,7 @@ namespace DbLinq.Vendor.Implementation { partial class SchemaLoader { -#if MONO_STRICT - internal -#else - public -#endif - class DataTableColumn : DataType, IDataTableColumn + public class DataTableColumn : DataType, IDataTableColumn { /// /// The column name diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.ForeignKey.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.ForeignKey.cs index 6a9d538a4a2..696ee8779e7 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.ForeignKey.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.ForeignKey.cs @@ -28,6 +28,8 @@ using System.Data; using System.Linq; using DbLinq.Schema; using DbLinq.Schema.Dbml; +using System.Text; +using System.Collections.Generic; namespace DbLinq.Vendor.Implementation { @@ -43,6 +45,20 @@ namespace DbLinq.Vendor.Implementation /// The names. protected abstract void LoadConstraints(Database schema, SchemaName schemaName, IDbConnection conn, NameFormat nameFormat, Names names); + protected string BuildForeignKey(IDictionary table, string key) + { + string[] keys = key.Split(','); + StringBuilder result = new StringBuilder(); + foreach (string lookupKey in keys) + { + if (result.Length != 0) + result.Append(','); + result.Append(table[lookupKey].PropertyName); + } + + return result.ToString(); + } + /// /// Loads the foreign key. /// @@ -62,8 +78,8 @@ namespace DbLinq.Vendor.Implementation string constraintName, NameFormat nameFormat, Names names) { - var foreignKey = names.ColumnsNames[tableName][columnName].PropertyName; - var reverseForeignKey = names.ColumnsNames[referencedTableName][referencedColumnName].PropertyName; + var foreignKey = BuildForeignKey(names.ColumnsNames[tableName], columnName); + var reverseForeignKey = BuildForeignKey(names.ColumnsNames[referencedTableName], referencedColumnName); var associationName = CreateAssociationName(tableName, tableSchema, referencedTableName, referencedTableSchema, constraintName, foreignKey, nameFormat); diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.Name.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.Name.cs index 7721b081d48..fdcfa54b55a 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.Name.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.Name.cs @@ -131,7 +131,7 @@ namespace DbLinq.Vendor.Implementation protected virtual void CheckConstraintsName(Database schema) { CheckConstraintsName(schema, - association => association.ThisKey + association.Member, + association => association.ThisKey.Replace(',', '_') + association.Member, association => association.Member + association.Type); } @@ -140,7 +140,7 @@ namespace DbLinq.Vendor.Implementation /// /// /// - protected virtual void GenerateStorageFields(Database schema, Func storageGenerator) + protected virtual void GenerateStorageAndMemberFields(Database schema, Func storageGenerator) { foreach (var table in schema.Tables) { @@ -148,9 +148,23 @@ namespace DbLinq.Vendor.Implementation { column.Storage = storageGenerator(column.Member); } + + Dictionary storageFields = new Dictionary(); + Dictionary memberFields = new Dictionary(); foreach (var association in table.Type.Associations) { association.Storage = storageGenerator(association.Member); + + //Associations may contain the same foreign key more than once - add a number suffix to duplicates + int storageSuffix = 0; + if ( storageFields.TryGetValue(association.Storage, out storageSuffix) ) + association.Storage += storageSuffix; + storageFields[association.Storage] = storageSuffix + 1; + + int memberSuffix = 0; + if ( memberFields.TryGetValue(association.Member, out memberSuffix) ) + association.Member += memberSuffix; + memberFields[association.Member] = memberSuffix + 1; } } } @@ -159,9 +173,9 @@ namespace DbLinq.Vendor.Implementation /// Generates all storage fields /// /// - protected virtual void GenerateStorageFields(Database schema) + protected virtual void GenerateStorageAndMemberFields(Database schema) { - GenerateStorageFields(schema, delegate(string name) + GenerateStorageAndMemberFields(schema, delegate(string name) { //jgm 2008June: pre-pended underscore to have same storage format as MS // TODO: add an option for this behavior diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.TypeMapping.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.TypeMapping.cs index 4d1904a442c..cb09323034d 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.TypeMapping.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.TypeMapping.cs @@ -45,12 +45,7 @@ namespace DbLinq.Vendor.Implementation /// /// Default IDataType implementation (see IDataType for details) /// -#if MONO_STRICT - internal -#else - public -#endif - class DataType : IDataType + public class DataType : IDataType { public virtual string Type { get; set; } public virtual bool Nullable { get; set; } @@ -200,6 +195,7 @@ namespace DbLinq.Vendor.Implementation case "oid": case "sytea": case "mediumblob": + case "tinyblob": case "raw": // oracle type case "long raw": // oracle type case "varbinary": diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.cs index c82783ef19f..3fbb44612a4 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SchemaLoader.cs @@ -41,9 +41,7 @@ using DbLinq.Schema.Dbml; namespace DbLinq.Vendor.Implementation { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif abstract partial class SchemaLoader : ISchemaLoader @@ -103,14 +101,14 @@ namespace DbLinq.Vendor.Implementation if (string.IsNullOrEmpty(databaseName)) throw new ArgumentException("A database name is required. Please specify /database="); - databaseName = GetDatabaseName(databaseName); + databaseName = GetDatabaseNameAliased(databaseName, nameAliases); var schemaName = NameFormatter.GetSchemaName(databaseName, GetExtraction(databaseName), nameFormat); var names = new Names(); var schema = new Database { Name = schemaName.DbName, - Class = schemaName.ClassName, + Class = GetRuntimeClassName(schemaName.ClassName, nameAliases), BaseType = typeof(DataContext).FullName, ContextNamespace = contextNamespace, EntityNamespace = entityNamespace, @@ -133,7 +131,7 @@ namespace DbLinq.Vendor.Implementation //CheckNamesSafety(schema); // generate backing fields name (since we have here correct names) - GenerateStorageFields(schema); + GenerateStorageAndMemberFields(schema); return schema; } @@ -148,6 +146,23 @@ namespace DbLinq.Vendor.Implementation return databaseName; } + protected virtual string GetDatabaseNameAliased(string databaseName, INameAliases nameAliases) + { + string databaseNameAliased = nameAliases != null ? nameAliases.GetDatabaseNameAlias(databaseName) : null; + return (databaseNameAliased != null) ? databaseNameAliased : GetDatabaseName(databaseName); + } + + /// + /// Gets a usable name for the database class. + /// + /// Name of the clas. + /// + protected virtual string GetRuntimeClassName(string className, INameAliases nameAliases) + { + string classNameAliased = nameAliases != null ? nameAliases.GetClassNameAlias(className) : null; + return (classNameAliased != null) ? classNameAliased : className; + } + /// /// Writes an error line. /// @@ -404,6 +419,7 @@ namespace DbLinq.Vendor.Implementation column.CanBeNull = columnRow.Nullable; + string columnTypeAlias = nameAliases != null ? nameAliases.GetColumnForcedType(columnRow.ColumnName, columnRow.TableName, columnRow.TableSchema) : null; var columnType = MapDbType(columnName.DbName, columnRow); var columnEnumType = columnType as EnumType; @@ -416,6 +432,8 @@ namespace DbLinq.Vendor.Implementation enumType[enumValue.Key] = enumValue.Value; } } + else if (columnTypeAlias != null) + column.Type = columnTypeAlias; else column.Type = columnType.ToString(); diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SqlProvider.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SqlProvider.cs index 7d6fca8bb7b..a8c83322156 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SqlProvider.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/SqlProvider.cs @@ -31,24 +31,17 @@ using System.Linq; using System.Linq.Expressions; using System.Text.RegularExpressions; -#if MONO_STRICT -using System.Data.Linq.Sql; -using System.Data.Linq.Sugar.Expressions; -#else using DbLinq.Data.Linq.Sql; using DbLinq.Data.Linq.Sugar.Expressions; -#endif using DbLinq.Util; namespace DbLinq.Vendor.Implementation { -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - class SqlProvider : ISqlProvider + class SqlProvider : ISqlProvider { public virtual ExpressionTranslator GetTranslator() { @@ -172,12 +165,17 @@ namespace DbLinq.Vendor.Implementation if (literal is bool) return GetLiteral((bool)literal); if (literal is DateTime) - return GetLiteral(literal.ToString()); + return GetLiteral((DateTime)literal); if (literal.GetType().IsArray) return GetLiteral((Array)literal); return Convert.ToString(literal, CultureInfo.InvariantCulture); } + public virtual SqlStatement GetLiteral(DateTime literal) + { + return literal.ToString("o"); + } + public virtual SqlStatement GetLiteral(bool literal) { return Convert.ToString(literal, CultureInfo.InvariantCulture); @@ -285,7 +283,6 @@ namespace DbLinq.Vendor.Implementation throw new ArgumentException(operationType.ToString()); } - /// /// Converts a special expression type to literal /// @@ -304,6 +301,8 @@ namespace DbLinq.Vendor.Implementation return GetLiteralStringConcat(p[0], p[1]); case SpecialExpressionType.Count: return GetLiteralCount(p[0]); + case SpecialExpressionType.Exists: + return GetLiteralExists(p[0]); case SpecialExpressionType.Like: return GetLiteralLike(p[0], p[1]); case SpecialExpressionType.Min: @@ -354,6 +353,8 @@ namespace DbLinq.Vendor.Implementation case SpecialExpressionType.Second: case SpecialExpressionType.Millisecond: return GetLiteralDateTimePart(p[0], operationType); + case SpecialExpressionType.Date: + return p[0]; case SpecialExpressionType.DateDiffInMilliseconds: return GetLiteralDateDiff(p[0], p[1]); case SpecialExpressionType.Abs: @@ -383,6 +384,11 @@ namespace DbLinq.Vendor.Implementation throw new ArgumentException(operationType.ToString()); } + protected virtual SqlStatement GetLiteralExists(SqlStatement sqlStatement) + { + return SqlStatement.Format("EXISTS {0}", sqlStatement); + } + private int SpecificVendorStringIndexStart { get @@ -695,6 +701,18 @@ namespace DbLinq.Vendor.Implementation return string.Format("{0} {1}", GetTable(table), GetTableAlias(alias)); } + /// + /// Returns a table alias + /// Ensures about the right case + /// + /// + /// + /// + public virtual string GetSubQueryAsAlias(string subquery, string alias) + { + return string.Format("({0}) {1}", subquery, GetTableAlias(alias)); + } + /// /// Returns a table alias /// @@ -773,7 +791,7 @@ namespace DbLinq.Vendor.Implementation { if (wheres.Length == 0) return SqlStatement.Empty; - return SqlStatement.Format("WHERE {0}", SqlStatement.Join(" AND ", wheres)); + return SqlStatement.Format("WHERE ({0})", SqlStatement.Join(") AND (", wheres)); } /// @@ -800,6 +818,18 @@ namespace DbLinq.Vendor.Implementation return SqlStatement.Format("SELECT {0}", SqlStatement.Join(", ", selects)); } + /// + /// Joins a list of operands to make a SELECT clause + /// + /// + /// + public virtual SqlStatement GetSelectDistinctClause(SqlStatement[] selects) + { + if (selects.Length == 0) + return SqlStatement.Empty; + return SqlStatement.Format("SELECT DISTINCT {0}", SqlStatement.Join(", ", selects)); + } + /// /// Returns all table columns (*) /// @@ -858,7 +888,7 @@ namespace DbLinq.Vendor.Implementation /// protected virtual SqlStatement GetLiteralAnd(SqlStatement a, SqlStatement b) { - return SqlStatement.Format("{0} AND {1}", a, b); + return SqlStatement.Format("({0}) AND ({1})", a, b); } /// @@ -968,7 +998,7 @@ namespace DbLinq.Vendor.Implementation /// protected virtual SqlStatement GetLiteralExclusiveOr(SqlStatement a, SqlStatement b) { - return SqlStatement.Format("{0} XOR {1}", a, b); + return SqlStatement.Format("({0}) XOR ({1})", a, b); } /// @@ -1118,7 +1148,7 @@ namespace DbLinq.Vendor.Implementation /// protected virtual SqlStatement GetLiteralOr(SqlStatement a, SqlStatement b) { - return SqlStatement.Format("{0} OR {1}", a, b); + return SqlStatement.Format("({0}) OR ({1})", a, b); } /// @@ -1538,7 +1568,7 @@ namespace DbLinq.Vendor.Implementation /// /// The name part. /// - /// true if [is made safe] [the specified name part]; otherwise, false. + /// true if [is made safe] [the specified name part]; otherwise, false. /// protected virtual bool IsMadeSafe(string namePart) { @@ -1553,7 +1583,7 @@ namespace DbLinq.Vendor.Implementation /// /// The name part. /// - /// true if [is name case safe] [the specified name part]; otherwise, false. + /// true if [is name case safe] [the specified name part]; otherwise, false. /// protected virtual bool IsNameCaseSafe(string namePart) { @@ -1623,6 +1653,7 @@ namespace DbLinq.Vendor.Implementation case "where": case "order": case "by": + case "key": return false; default: diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/Vendor.Name.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/Vendor.Name.cs deleted file mode 100644 index 38036ee1309..00000000000 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/Vendor.Name.cs +++ /dev/null @@ -1,38 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion - -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; -using DbLinq.Util; -using System.Collections.Generic; - -namespace DbLinq.Vendor.Implementation -{ - partial class Vendor - { - } -} diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/Vendor.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/Vendor.cs index 3dc1ce7b66b..2a92d2440c9 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/Vendor.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/Implementation/Vendor.cs @@ -31,14 +31,13 @@ using System.Data; using System.Linq; #if MONO_STRICT -using DataContext = System.Data.Linq.DataContext; -using Data = System.Data; using System.Data.Linq; #else -using DataContext = DbLinq.Data.Linq.DataContext; -using Data = DbLinq.Data; using DbLinq.Data.Linq; #endif + +using Data = DbLinq.Data; + using IExecuteResult = System.Data.Linq.IExecuteResult; namespace DbLinq.Vendor.Implementation @@ -47,12 +46,10 @@ namespace DbLinq.Vendor.Implementation /// some IVendor functionality is the same for many vendors, /// implemented here as virtual functions. /// -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - abstract partial class Vendor : IVendor + abstract partial class Vendor : IVendor { /// /// Pings requested DB, true is result is OK. @@ -166,7 +163,7 @@ namespace DbLinq.Vendor.Implementation /// public IDbConnection CreateDbConnection(string connectionString) { - var reConnectionType = new System.Text.RegularExpressions.Regex(@"DbLinqConnectionType=([^;]*)"); + var reConnectionType = new System.Text.RegularExpressions.Regex(@"DbLinqConnectionType=([^;]*);?"); string connTypeVal = null; if (!reConnectionType.IsMatch(connectionString)) { diff --git a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/VendorAttribute.cs b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/VendorAttribute.cs index a3808bf1c52..856f82f8f5b 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq/Vendor/VendorAttribute.cs +++ b/mcs/class/System.Data.Linq/src/DbLinq/Vendor/VendorAttribute.cs @@ -29,15 +29,14 @@ using System.Data; using System.Reflection; using System.Collections.Generic; -#if MONO_STRICT +#if MONO_STRICT using DataContext = System.Data.Linq.DataContext; -using Data = System.Data; -using System.Data.Linq; #else using DataContext = DbLinq.Data.Linq.DataContext; +#endif + using Data = DbLinq.Data; using DbLinq.Data.Linq; -#endif using IExecuteResult = System.Data.Linq.IExecuteResult; namespace DbLinq.Vendor @@ -46,12 +45,10 @@ namespace DbLinq.Vendor /// This attribute is used by vendors /// [AttributeUsage(AttributeTargets.Class)] -#if MONO_STRICT - internal -#else +#if !MONO_STRICT public #endif - class VendorAttribute : Attribute + class VendorAttribute : Attribute { public IList ProviderTypes { get; private set; } diff --git a/mcs/class/System.Data.Linq/src/DbLinq_StudioExpress.sln b/mcs/class/System.Data.Linq/src/DbLinq_StudioExpress.sln index 79bdbaa7b40..2092e5db66a 100644 --- a/mcs/class/System.Data.Linq/src/DbLinq_StudioExpress.sln +++ b/mcs/class/System.Data.Linq/src/DbLinq_StudioExpress.sln @@ -53,6 +53,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbLinq.Sqlite_test_mono_str EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbLinq_test_ndb_strict", "DbLinq\Test\DbLinq_test_ndb_strict.csproj", "{AB60629C-6B19-4465-89AA-DBD7A0428F4B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NUnitRunner", "Tools\NUnitRunner\NUnitRunner.csproj", "{61EF7ADF-C133-4329-8848-C6B832122C4F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -163,6 +165,10 @@ Global {AB60629C-6B19-4465-89AA-DBD7A0428F4B}.Debug|Any CPU.Build.0 = Debug|Any CPU {AB60629C-6B19-4465-89AA-DBD7A0428F4B}.Release|Any CPU.ActiveCfg = Release|Any CPU {AB60629C-6B19-4465-89AA-DBD7A0428F4B}.Release|Any CPU.Build.0 = Release|Any CPU + {61EF7ADF-C133-4329-8848-C6B832122C4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {61EF7ADF-C133-4329-8848-C6B832122C4F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61EF7ADF-C133-4329-8848-C6B832122C4F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {61EF7ADF-C133-4329-8848-C6B832122C4F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/mcs/class/System.Data.Linq/src/DbMetal/Generator/Implementation/CodeTextGenerator/CodeGenerator.Class.cs b/mcs/class/System.Data.Linq/src/DbMetal/Generator/Implementation/CodeTextGenerator/CodeGenerator.Class.cs index fed9400788d..4d5bc1b40ca 100644 --- a/mcs/class/System.Data.Linq/src/DbMetal/Generator/Implementation/CodeTextGenerator/CodeGenerator.Class.cs +++ b/mcs/class/System.Data.Linq/src/DbMetal/Generator/Implementation/CodeTextGenerator/CodeGenerator.Class.cs @@ -407,6 +407,7 @@ namespace DbMetal.Generator.Implementation.CodeTextGenerator var storageAttribute = NewAttributeDefinition(); storageAttribute["Storage"] = child.Storage; storageAttribute["OtherKey"] = child.OtherKey; + storageAttribute["ThisKey"] = child.ThisKey; storageAttribute["Name"] = child.Name; SpecificationDefinition specifications; @@ -498,7 +499,8 @@ namespace DbMetal.Generator.Implementation.CodeTextGenerator targetTable.Type.Name)); var storageAttribute = NewAttributeDefinition(); - storageAttribute["Storage"] = storageField; + storageAttribute["Storage"] = storageField; + storageAttribute["OtherKey"] = parent.OtherKey; storageAttribute["ThisKey"] = parent.ThisKey; storageAttribute["Name"] = parent.Name; storageAttribute["IsForeignKey"] = parent.IsForeignKey; diff --git a/mcs/class/System.Data.Linq/src/DbMetal/Schema/DbmlRename.cs b/mcs/class/System.Data.Linq/src/DbMetal/Schema/DbmlRename.cs index fd969cb1d82..ea3dc62d78d 100644 --- a/mcs/class/System.Data.Linq/src/DbMetal/Schema/DbmlRename.cs +++ b/mcs/class/System.Data.Linq/src/DbMetal/Schema/DbmlRename.cs @@ -135,5 +135,15 @@ namespace DbMetal.Schema return null; return c.Type; } + + public string GetDatabaseNameAlias(string databaseName) + { + return Name; + } + + public string GetClassNameAlias(string className) + { + return Class; + } } } diff --git a/mcs/class/System.Data.Linq/src/DbMetal/Schema/TableAlias.cs b/mcs/class/System.Data.Linq/src/DbMetal/Schema/TableAlias.cs index 32abe842850..45ca88e1600 100644 --- a/mcs/class/System.Data.Linq/src/DbMetal/Schema/TableAlias.cs +++ b/mcs/class/System.Data.Linq/src/DbMetal/Schema/TableAlias.cs @@ -38,6 +38,12 @@ namespace DbMetal.Schema { public class Renamings : INameAliases { + [XmlAttribute("Name")] + public string Name { get; set; } + + [XmlAttribute("Class")] + public string Class { get; set; } + [XmlElement("Renaming")] public readonly List Arr = new List(); @@ -65,6 +71,16 @@ namespace DbMetal.Schema { return GetAlias(column); } + + public string GetDatabaseNameAlias(string databaseName) + { + return Name; + } + + public string GetClassNameAlias(string className) + { + return Class; + } } public class Renaming diff --git a/mcs/class/System.Data.Linq/src/Northwind.db3 b/mcs/class/System.Data.Linq/src/Northwind.db3 deleted file mode 100644 index 91cf1b16bf3..00000000000 Binary files a/mcs/class/System.Data.Linq/src/Northwind.db3 and /dev/null differ diff --git a/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/NUnitRunner.csproj b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/NUnitRunner.csproj new file mode 100644 index 00000000000..a4e248c8ded --- /dev/null +++ b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/NUnitRunner.csproj @@ -0,0 +1,81 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {61EF7ADF-C133-4329-8848-C6B832122C4F} + WinExe + Properties + NUnitConsoleRunner + NUnitConsoleRunner + v3.5 + 512 + + + true + full + false + ..\..\..\build.dbg\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\..\build\ + TRACE + prompt + 4 + + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Program.cs b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Program.cs new file mode 100644 index 00000000000..85ece4c7d69 --- /dev/null +++ b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace NUnitConsoleRunner +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + string[] args = new string[] { "../DbLinq-Sqlite-Sqlserver.nunit" }; + NUnit.Gui.AppEntry.Main(args); + } + } +} diff --git a/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/AssemblyInfo.cs b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..8b6d0f969f6 --- /dev/null +++ b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("NUnitConsoleRunner")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("NUnitConsoleRunner")] +[assembly: AssemblyCopyright("Copyright © 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("2e39c94e-8988-41cf-a6a4-81a82fa02066")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Resources.Designer.cs b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Resources.Designer.cs new file mode 100644 index 00000000000..fb84fc9f4ad --- /dev/null +++ b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.3082 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace NUnitConsoleRunner.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NUnitConsoleRunner.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Resources.resx b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Resources.resx new file mode 100644 index 00000000000..ffecec851ab --- /dev/null +++ b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Settings.Designer.cs b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Settings.Designer.cs new file mode 100644 index 00000000000..457989b1997 --- /dev/null +++ b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.3082 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace NUnitConsoleRunner.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Settings.settings b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Settings.settings new file mode 100644 index 00000000000..abf36c5d3d7 --- /dev/null +++ b/mcs/class/System.Data.Linq/src/Tools/NUnitRunner/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/App.config b/mcs/class/System.Data.Linq/src/VisualMetal/App.config deleted file mode 100644 index aeb41ccf14d..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/App.config +++ /dev/null @@ -1,41 +0,0 @@ - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - True - - - - \ No newline at end of file diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/App.xaml b/mcs/class/System.Data.Linq/src/VisualMetal/App.xaml deleted file mode 100644 index e0a397eef77..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/App.xaml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/App.xaml.cs b/mcs/class/System.Data.Linq/src/VisualMetal/App.xaml.cs deleted file mode 100644 index 63204139ab9..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/App.xaml.cs +++ /dev/null @@ -1,46 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Data; -using System.Linq; -using System.Windows; -using DbMetal; - -namespace VisualMetal -{ - /// - /// Interaction logic for App.xaml - /// - public partial class App : Application - { - public App() - { - Reference.DbLinqLocalizations(); - } - } -} diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/Dialog.cs b/mcs/class/System.Data.Linq/src/VisualMetal/Dialog.cs deleted file mode 100644 index baf469f8028..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/Dialog.cs +++ /dev/null @@ -1,72 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Controls.Primitives; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Interop; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Threading; -using System.Windows.Shapes; - -namespace VisualMetal -{ - public class Dialog : Window - { - public Dialog() - { - Background = SystemColors.ControlBrush; - - ResizeMode = ResizeMode.NoResize; - ShowInTaskbar = false; - WindowStyle = WindowStyle.ToolWindow; - SizeToContent = SizeToContent.WidthAndHeight; - - // these can't be set via a style as they are not dependency props - WindowStartupLocation = WindowStartupLocation.CenterOwner; - - // Note: Setting the owner causes the WPF designer to not be able to instantiate. - if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) - { - var windows = Application.Current.Windows; - Owner = windows[windows.Count - 2]; - } - } - - protected override void OnInitialized(EventArgs e) - { - base.OnInitialized(e); - - Resources.MergedDictionaries.Add(Application.Current.Resources); - } - } -} diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/LoginWindow.xaml b/mcs/class/System.Data.Linq/src/VisualMetal/LoginWindow.xaml deleted file mode 100644 index e272045ace8..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/LoginWindow.xaml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MySql - PostgreSQL - OracleODP - Oracle - Ingres - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/MainWindow.xaml.cs b/mcs/class/System.Data.Linq/src/VisualMetal/MainWindow.xaml.cs deleted file mode 100644 index 4021c348cd2..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/MainWindow.xaml.cs +++ /dev/null @@ -1,218 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Markup; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; -using DbLinq.Factory; -using DbLinq.Vendor; -using DbLinq.Schema.Dbml; -using DbMetal; -using DbMetal.Generator; -using DbMetal.Generator.Implementation.CodeDomGenerator; - -namespace VisualMetal -{ - public partial class MainWindow : Window - { - public IProcessor Program = ObjectFactory.Get(); - public Parameters Parameters = new Parameters(); - public ISchemaLoader Loader; - - Database database; - public Database Database - { - get - { - return database; - } - set - { - database = value; - - TableList.ItemsSource = Database.Table; - SchemaPropertyGrid.SelectedObject = Database; - } - } - - public MainWindow() - { - InitializeComponent(); - - try - { - if (!String.IsNullOrEmpty(Properties.Settings.Default.Params)) - using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(Properties.Settings.Default.Params))) - Parameters = (Parameters)XamlReader.Load(stream); - } - catch { } // throw away any errors from parsing parameters - } - - protected override void OnClosed(EventArgs e) - { - base.OnClosed(e); - - if (!Properties.Settings.Default.SavePassword) - Parameters.Password = null; // clear password for security. - Properties.Settings.Default.Params = XamlWriter.Save(Parameters); - Properties.Settings.Default.Save(); - } - - private void Login_Click(object sender, RoutedEventArgs e) - { - new LoginWindow(this).ShowDialog(); - } - - private void Open_Click(object sender, RoutedEventArgs e) - { - var dialog = new System.Windows.Forms.OpenFileDialog(); - dialog.Filter = "Database markup files (*.dbml)|*.dbml|All files (*.*)|*.*"; - if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.Cancel) - { - Database = Program.ReadSchema(Parameters, dialog.FileName); - } - } - - private void GenerateCSharp_Click(object sender, RoutedEventArgs e) - { - if (Database == null) - { - MessageBox.Show("No database schema loaded."); - return; - } - - var dialog = new System.Windows.Forms.SaveFileDialog(); - dialog.Filter = "C# source files (*.cs)|*.cs|All files (*.*)|*.*"; - dialog.FileName = Parameters.Database; - // TODO: use common way with DbMetal instead of hardcoded generators. - if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.Cancel) - new CSharpCodeDomGenerator().GenerateCSharp(Database, dialog.FileName); - //Program.GenerateCSharp(Parameters, Database, Loader, dialog.FileName); - } - - private void GenerateVisualBasic_Click(object sender, RoutedEventArgs e) - { - if (Database == null) - { - MessageBox.Show("No database schema loaded."); - return; - } - - var dialog = new System.Windows.Forms.SaveFileDialog(); - dialog.Filter = "Visual Basic source files (*.vb)|*.vb|All files (*.*)|*.*"; - dialog.FileName = Parameters.Database; - if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.Cancel) - new CSharpCodeDomGenerator().GenerateVisualBasic(Database, dialog.FileName); - } - - private void SaveDbml_Click(object sender, RoutedEventArgs e) - { - if (Database == null) - { - MessageBox.Show("No database schema loaded."); - return; - } - - var dialog = new System.Windows.Forms.SaveFileDialog(); - dialog.Filter = "Database markup files (*.dbml)|*.dbml|All files (*.*)|*.*"; - dialog.FileName = Parameters.Database; - if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.Cancel) - using (Stream dbmlFile = File.OpenWrite(dialog.FileName)) - DbmlSerializer.Write(dbmlFile, Database); - } - - private void Exit_Click(object sender, RoutedEventArgs e) - { - Close(); - } - - private void TableList_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - if (e.AddedItems.Count == 0) - ColumnList.ItemsSource = null; - else - { - DbLinq.Schema.Dbml.Table selected = (DbLinq.Schema.Dbml.Table)e.AddedItems[0]; - ColumnList.ItemsSource = selected.Type.Items; - TablePropertyGrid.SelectedObject = selected; - } - } - - private void ColumnList_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - if (e.AddedItems.Count > 0) - ColumnPropertyGrid.SelectedObject = e.AddedItems[0]; - else - ColumnPropertyGrid.SelectedObject = null; - } - - private void RebindTableList(object sender, RoutedEventArgs e) - { - // this is ugly, it's needed to refresh the Table.ToString calls - // Alternates to doing this might be implementing INotifyProvider on the table class, or not using an ItemsSource binding - // or maybe use a data template to display the item, instead of using ToString - // ideally we need a datagrid instead of a listbox - - var temp = TableList.ItemsSource; - TableList.ItemsSource = null; - TableList.ItemsSource = temp; - } - - private void RebindColumnList(object sender, RoutedEventArgs e) - { - // this is ugly, it's needed to refresh the Column.ToString calls - var temp = ColumnList.ItemsSource; - ColumnList.ItemsSource = null; - ColumnList.ItemsSource = temp; - } - - public bool LoadSchema() - { - try - { - ISchemaLoader loader; - Database = Program.ReadSchema(Parameters, out loader); - } - catch (Exception exception) - { - MessageBox.Show(exception.ToString()); - return false; - } - return true; - } - } -} \ No newline at end of file diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/Properties/AssemblyInfo.cs b/mcs/class/System.Data.Linq/src/VisualMetal/Properties/AssemblyInfo.cs deleted file mode 100644 index c812ed3469f..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,80 +0,0 @@ -#region MIT license -// -// MIT license -// -// Copyright (c) 2007-2008 Jiri Moudry, Pascal Craponne -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// -#endregion -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Windows; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("VisualMetal")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("VisualMetal")] -[assembly: AssemblyCopyright("Copyright © 2008")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -//In order to begin building localizable applications, set -//CultureYouAreCodingWith in your .csproj file -//inside a . For example, if you are using US english -//in your source files, set the to en-US. Then uncomment -//the NeutralResourceLanguage attribute below. Update the "en-US" in -//the line below to match the UICulture setting in the project file. - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) -)] - - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Resources.Designer.cs b/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Resources.Designer.cs deleted file mode 100644 index fe7666bb210..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.1434 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace VisualMetal.Properties -{ - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("VisualMetal.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Resources.resx b/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Resources.resx deleted file mode 100644 index ffecec851ab..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Settings.Designer.cs b/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Settings.Designer.cs deleted file mode 100644 index a64a89e5d46..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Settings.Designer.cs +++ /dev/null @@ -1,50 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.1434 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace VisualMetal.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string Params { - get { - return ((string)(this["Params"])); - } - set { - this["Params"] = value; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("True")] - public bool SavePassword { - get { - return ((bool)(this["SavePassword"])); - } - set { - this["SavePassword"] = value; - } - } - } -} diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Settings.settings b/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Settings.settings deleted file mode 100644 index 8c68d71846d..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/Properties/Settings.settings +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - True - - - \ No newline at end of file diff --git a/mcs/class/System.Data.Linq/src/VisualMetal/VisualMetal.csproj b/mcs/class/System.Data.Linq/src/VisualMetal/VisualMetal.csproj deleted file mode 100644 index 31fbc340a68..00000000000 --- a/mcs/class/System.Data.Linq/src/VisualMetal/VisualMetal.csproj +++ /dev/null @@ -1,171 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {05260362-DD1C-4DF4-890B-163D0A6D94B9} - WinExe - Properties - VisualMetal - VisualMetal - v3.5 - 512 - {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 4 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - False - ..\..\lib\Ingres.Client.dll - - - False - ..\..\lib\MySql.Data.dll - - - False - ..\..\lib\Npgsql.dll - - - 3.0 - - - - 3.5 - - - False - ..\..\lib\System.Data.SQLite.DLL - - - - 3.5 - - - 3.5 - - - - - 3.0 - - - 3.0 - - - 3.0 - - - 3.0 - - - - - MSBuild:Compile - Designer - - - Designer - MSBuild:Compile - - - MSBuild:Compile - Designer - - - App.xaml - Code - - - MainWindow.xaml - Code - - - - - - LoginWindow.xaml - - - Code - - - True - True - Resources.resx - - - True - Settings.settings - True - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - - {90D57CD9-D704-409E-88A1-0F22AC79065A} - DbLinq.Ingres - - - {FA8D1068-3341-4956-BF94-54C6A816BD9E} - DbLinq.MySql - - - {D9DE72A2-D885-4C54-A89E-302E6829101C} - DbLinq.Oracle - - - {32824F7E-9260-413C-B174-F3E315936FA7} - DbLinq.PostgreSql - - - {60B9AFA1-99B4-4DE6-80E1-80BBED1AC755} - DbLinq.Sqlite - - - {7950197D-4122-49CB-9FD7-45E666BAFEC2} - DbLinq - - - {363FF43D-C870-4423-BE50-DAED7793A6D1} - DbMetal - - - - - \ No newline at end of file diff --git a/mcs/class/System.Data.Linq/tests/ConnectionStrings.xml b/mcs/class/System.Data.Linq/tests/ConnectionStrings.xml new file mode 100644 index 00000000000..aaa62522df4 --- /dev/null +++ b/mcs/class/System.Data.Linq/tests/ConnectionStrings.xml @@ -0,0 +1,24 @@ + + + Data Source=.\SQLExpress;Integrated Security=True;Initial Catalog=Northwind + Data Source=.\SQLExpress;Integrated Security=True;Initial Catalog=Northwind + + Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = 1521)))(CONNECT_DATA = (SERVER = DEDICATED))); User Id = Northwind; Password = linq2 + Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = 1521)))(CONNECT_DATA = (SERVER = DEDICATED))); User Id = Northwind; Password = linq2 + + Data Source=Northwind.db3 + Data Source=Northwind.db3 + DbLinqProvider=Sqlite;Data Source=Northwind.db3 + server={0};user id=LinqUser; password=linq2; database=Northwind + server={0};user id=LinqUser; password=linq2; database=Northwind + server={0};user id=LinqUser; password=linq2; database=Northwind + server={0};user id=LinqUser; password=linq2; database=c:\Program Files\Firebird\Firebird_2_1\examples\nwind\NORTHWIND.FDB + + + diff --git a/mcs/class/System.Data.Linq/tests/Northwind.db3 b/mcs/class/System.Data.Linq/tests/Northwind.db3 new file mode 100644 index 00000000000..fad06644868 Binary files /dev/null and b/mcs/class/System.Data.Linq/tests/Northwind.db3 differ diff --git a/mcs/class/System.Data.Linq/tests/instnwnd.PostgreSQL.sql b/mcs/class/System.Data.Linq/tests/instnwnd.PostgreSQL.sql new file mode 100644 index 00000000000..bda3b2ed243 --- /dev/null +++ b/mcs/class/System.Data.Linq/tests/instnwnd.PostgreSQL.sql @@ -0,0 +1,9142 @@ +/* +** Copyright Microsoft, Inc. 1994 - 2000 +** All Rights Reserved. +** +** Changes for PostgreSQL Copyright 2009 Studio Associato Di Nunzio e Di Gregorio +** +** This file is distributed under the MS-PL license. +** See LICENSE.MSPL for more information. +*/ + +DROP TABLE IF EXISTS Employees; +DROP TABLE IF EXISTS Categories; +DROP TABLE IF EXISTS Customers; +DROP TABLE IF EXISTS Shippers; +DROP TABLE IF EXISTS Suppliers; +DROP TABLE IF EXISTS Orders; +DROP TABLE IF EXISTS Products; +DROP TABLE IF EXISTS "OrderDetails"; +DROP TABLE IF EXISTS CustomerCustomerDemo; +DROP TABLE IF EXISTS CustomerDemographics; +DROP TABLE IF EXISTS Region; +DROP TABLE IF EXISTS Territories; +DROP TABLE IF EXISTS EmployeeTerritories; + +CREATE TABLE "Employees" ( + "EmployeeID" serial NOT NULL , + "LastName" varchar (20) NOT NULL , + "FirstName" varchar (10) NOT NULL , + "Title" varchar (30) , + "TitleOfCourtesy" varchar (25) , + "BirthDate" "date" , + "HireDate" date , + "Address" varchar (60) , + "City" varchar (15) , + "Region" varchar (15) , + "PostalCode" varchar (10) , + "Country" varchar (15) , + "HomePhone" varchar (24) , + "Extension" varchar (4) , + "Photo" bytea , + "Notes" text , + "ReportsTo" int4 , + "PhotoPath" varchar (255) , + CONSTRAINT "PK_Employees" PRIMARY KEY ( + "EmployeeID" + ), + CONSTRAINT "FK_Employees_Employees" FOREIGN KEY + ( + "ReportsTo" + ) REFERENCES "Employees" ( + "EmployeeID" + ) DEFERRABLE, + CONSTRAINT "CK_Birthdate" CHECK ("BirthDate" < now()) +); + +CREATE INDEX "Employees_LastName" ON "Employees"("LastName"); +CREATE INDEX "Employees_PostalCode" ON "Employees"("PostalCode"); + +CREATE TABLE "Categories" ( + "CategoryID" serial NOT NULL , + "CategoryName" varchar (15) NOT NULL , + "Description" text , + "Picture" bytea , + CONSTRAINT "PK_Categories" PRIMARY KEY + ( + "CategoryID" + ) +); + +CREATE INDEX "Categories_CategoryName" ON "Categories"("CategoryName"); + +CREATE TABLE "Customers" ( + "CustomerID" char (5) NOT NULL , + "CompanyName" varchar (40) NOT NULL , + "ContactName" varchar (30) , + "ContactTitle" varchar (30) , + "Address" varchar (60) , + "City" varchar (15) , + "Region" varchar (15) , + "PostalCode" varchar (10) , + "Country" varchar (15) , + "Phone" varchar (24) , + "Fax" varchar (24) , + CONSTRAINT "PK_Customers" PRIMARY KEY + ( + "CustomerID" + ) +); + CREATE INDEX "Customers_City" ON "Customers"("City"); +CREATE INDEX "Customers_CompanyName" ON "Customers"("CompanyName"); +CREATE INDEX "Customers_PostalCode" ON "Customers"("PostalCode"); +CREATE INDEX "Customers_Region" ON "Customers"("Region"); + +CREATE TABLE "Shippers" ( + "ShipperID" serial NOT NULL , + "CompanyName" varchar (40) NOT NULL , + "Phone" varchar (24) NULL , + CONSTRAINT "PK_Shippers" PRIMARY KEY + ( + "ShipperID" + ) +); + +CREATE TABLE "Suppliers" ( + "SupplierID" serial NOT NULL , + "CompanyName" varchar (40) NOT NULL , + "ContactName" varchar (30) , + "ContactTitle" varchar (30) , + "Address" varchar (60) , + "City" varchar (15) , + "Region" varchar (15) , + "PostalCode" varchar (10) , + "Country" varchar (15) , + "Phone" varchar (24) , + "Fax" varchar (24) , + "HomePage" text , + CONSTRAINT "PK_Suppliers" PRIMARY KEY + ( + "SupplierID" + ) +); + +CREATE INDEX "Suppliers_CompanyName" ON "Suppliers"("CompanyName"); +CREATE INDEX "Suppliers_PostalCode" ON "Suppliers"("PostalCode"); + +CREATE TABLE "Orders" ( + "OrderID" serial NOT NULL , + "CustomerID" char (5) , + "EmployeeID" int4 , + "OrderDate" date , + "RequiredDate" date , + "ShippedDate" date , + "ShipVia" int4 , + "Freight" decimal DEFAULT 0, + "ShipName" varchar (40) , + "ShipAddress" varchar (60) , + "ShipCity" varchar (15) , + "ShipRegion" varchar (15) , + "ShipPostalCode" varchar (10) , + "ShipCountry" varchar (15) , + CONSTRAINT "PK_Orders" PRIMARY KEY + ( + "OrderID" + ), + CONSTRAINT "FK_Orders_Customers" FOREIGN KEY + ( + "CustomerID" + ) REFERENCES "Customers" ( + "CustomerID" + ) DEFERRABLE, + CONSTRAINT "FK_Orders_Employees" FOREIGN KEY + ( + "EmployeeID" + ) REFERENCES "Employees" ( + "EmployeeID" + ) DEFERRABLE, + CONSTRAINT "FK_Orders_Shippers" FOREIGN KEY + ( + "ShipVia" + ) REFERENCES "Shippers" ( + "ShipperID" + ) DEFERRABLE +); + +CREATE INDEX "Orders_CustomerID" ON "Orders"("CustomerID"); +CREATE INDEX "Orders_CustomersOrders" ON "Orders"("CustomerID"); +CREATE INDEX "Orders_EmployeeID" ON "Orders"("EmployeeID"); +CREATE INDEX "Orders_EmployeesOrders" ON "Orders"("EmployeeID"); +CREATE INDEX "Orders_OrderDate" ON "Orders"("OrderDate"); +CREATE INDEX "Orders_ShippedDate" ON "Orders"("ShippedDate"); +CREATE INDEX "Orders_ShippersOrders" ON "Orders"("ShipVia"); +CREATE INDEX "Orders_ShipPostalCode" ON "Orders"("ShipPostalCode"); + +CREATE TABLE "Products" ( + "ProductID" serial NOT NULL , + "ProductName" varchar (40) NOT NULL , + "SupplierID" int4 , + "CategoryID" int4 , + "QuantityPerUnit" varchar (20) , + "UnitPrice" decimal DEFAULT 0, + "UnitsInStock" int2 DEFAULT 0, + "UnitsOnOrder" int2 DEFAULT 0, + "ReorderLevel" int2 DEFAULT 0, + "Discontinued" boolean DEFAULT false, + CONSTRAINT "PK_Products" PRIMARY KEY + ( + "ProductID" + ), + CONSTRAINT "FK_Products_Categories" FOREIGN KEY + ( + "CategoryID" + ) REFERENCES "Categories" ( + "CategoryID" + ), + CONSTRAINT "FK_Products_Suppliers" FOREIGN KEY + ( + "SupplierID" + ) REFERENCES "Suppliers" ( + "SupplierID" + ) DEFERRABLE, + CONSTRAINT "CK_Products_UnitPrice" CHECK ("UnitPrice" >= 0), + CONSTRAINT "CK_ReorderLevel" CHECK ("ReorderLevel" >= 0), + CONSTRAINT "CK_UnitsInStock" CHECK ("UnitsInStock" >= 0), + CONSTRAINT "CK_UnitsOnOrder" CHECK ("UnitsOnOrder" >= 0) +); + +CREATE INDEX "Products_CategoriesProducts" ON "Products"("CategoryID"); +CREATE INDEX "Products_CategoryID" ON "Products"("CategoryID"); +CREATE INDEX "Products_ProductName" ON "Products"("ProductName"); +CREATE INDEX "Products_SupplierID" ON "Products"("SupplierID"); +CREATE INDEX "Products_SuppliersProducts" ON "Products"("SupplierID"); + +CREATE TABLE "OrderDetails" ( + "OrderID" int4 NOT NULL , + "ProductID" int4 NOT NULL , + "UnitPrice" decimal DEFAULT 0, + "Quantity" int2 DEFAULT 1, + "Discount" float DEFAULT 0, + CONSTRAINT "PK_Order_Details" PRIMARY KEY + ( + "OrderID", + "ProductID" + ), + CONSTRAINT "FK_Order_Details_Orders" FOREIGN KEY + ( + "OrderID" + ) REFERENCES "Orders" ( + "OrderID" + ) DEFERRABLE, + CONSTRAINT "FK_Order_Details_Products" FOREIGN KEY + ( + "ProductID" + ) REFERENCES "Products" ( + "ProductID" + ) DEFERRABLE, + CONSTRAINT "CK_Discount" CHECK ("Discount" >= 0 AND "Discount" <= 1), + CONSTRAINT "CK_Quantity" CHECK ("Quantity" > 0), + CONSTRAINT "CK_UnitPrice" CHECK ("UnitPrice" >= 0) +); + +CREATE INDEX "OrderDetails_OrderID" ON "OrderDetails"("OrderID"); +CREATE INDEX "OrderDetails_OrdersOrder_Details" ON "OrderDetails"("OrderID"); +CREATE INDEX "OrderDetails_ProductID" ON "OrderDetails"("ProductID"); +CREATE INDEX "OrderDetails_ProductsOrder_Details" ON "OrderDetails"("ProductID"); + +CREATE VIEW "Customer and Suppliers by City" AS +SELECT "City", "CompanyName", "ContactName", 'Customers' AS "Relationship" +FROM "Customers" +UNION SELECT "City", "CompanyName", "ContactName", 'Suppliers' +FROM "Suppliers" +--ORDER BY "City", "CompanyName" +; + +CREATE VIEW "Alphabetical list of products" AS +SELECT "Products".*, "Categories"."CategoryName" +FROM "Categories" INNER JOIN "Products" ON ("Categories"."CategoryID" = "Products"."CategoryID") +WHERE ("Products"."Discontinued"=false) +; + +CREATE VIEW "Current Product List" AS +SELECT "Product_List"."ProductID", "Product_List"."ProductName" +FROM "Products" AS "Product_List" +WHERE ("Product_List"."Discontinued"=false) +--ORDER BY "Product_List"."ProductName" +; + +CREATE VIEW "Orders Qry" AS +SELECT "Orders"."OrderID", "Orders"."CustomerID", "Orders"."EmployeeID", "Orders"."OrderDate", + "Orders"."RequiredDate", + "Orders"."ShippedDate", "Orders"."ShipVia", "Orders"."Freight", "Orders"."ShipName", + "Orders"."ShipAddress", "Orders"."ShipCity", + "Orders"."ShipRegion", "Orders"."ShipPostalCode", "Orders"."ShipCountry", + "Customers"."CompanyName", "Customers"."Address", "Customers"."City", "Customers"."Region", + "Customers"."PostalCode", "Customers"."Country" +FROM "Customers" INNER JOIN "Orders" ON "Customers"."CustomerID" = "Orders"."CustomerID" +; + +CREATE VIEW "Products Above Average Price" AS +SELECT "Products"."ProductName", "Products"."UnitPrice" +FROM "Products" +WHERE "Products"."UnitPrice" > (SELECT avg("UnitPrice") FROM "Products"); +--ORDER BY Products.UnitPrice DESC ; + +CREATE VIEW "Products by Category" AS +SELECT "Categories"."CategoryName", "Products"."ProductName", "Products"."QuantityPerUnit", + "Products"."UnitsInStock", "Products"."Discontinued" +FROM "Categories" INNER JOIN "Products" ON "Categories"."CategoryID" = "Products"."CategoryID" +WHERE "Products"."Discontinued" != true +--ORDER BY Categories.CategoryName, Products.ProductName +; + +CREATE VIEW "Quarterly Orders" AS +SELECT DISTINCT "Customers"."CustomerID", "Customers"."CompanyName", "Customers"."City", + "Customers"."Country" +FROM "Customers" RIGHT OUTER JOIN "Orders" ON "Customers"."CustomerID" = "Orders"."CustomerID" +WHERE "Orders"."OrderDate" BETWEEN '1997-01-01' AND '1997-12-31' ; + +CREATE VIEW "Invoices" AS +SELECT "Orders"."ShipName", "Orders"."ShipAddress", "Orders"."ShipCity", "Orders"."ShipRegion", + "Orders"."ShipPostalCode", "Orders"."ShipCountry", "Orders"."CustomerID", + "Customers"."CompanyName" AS "CustomerName", "Customers"."Address", "Customers"."City", + "Customers"."Region", "Customers"."PostalCode", "Customers"."Country", + ("FirstName" || ' ' || "LastName") AS "Salesperson", + "Orders"."OrderID", "Orders"."OrderDate", "Orders"."RequiredDate", "Orders"."ShippedDate", + "Shippers"."CompanyName" AS "ShipperName", + "OrderDetails"."ProductID", "Products"."ProductName", "OrderDetails"."UnitPrice", + "OrderDetails"."Quantity", "OrderDetails"."Discount", + (("OrderDetails"."UnitPrice" * "Quantity" * (1-"Discount")/100)*100)::decimal AS "ExtendedPrice", + "Orders"."Freight" +FROM "Shippers", + "Products", + "Employees", + "Customers", + "Orders", + "OrderDetails" +WHERE "Employees"."EmployeeID" = "Orders"."EmployeeID" + AND "Customers"."CustomerID" = "Orders"."CustomerID" + AND "Orders"."OrderID" = "OrderDetails"."OrderID" + AND "Products"."ProductID" = "OrderDetails"."ProductID" + AND "Shippers"."ShipperID" = "Orders"."ShipVia" +; + +CREATE VIEW "Order Details Extended" AS +SELECT "OrderDetails"."OrderID", "OrderDetails"."ProductID", "Products"."ProductName", + "OrderDetails"."UnitPrice", "OrderDetails"."Quantity", "OrderDetails"."Discount", + (("OrderDetails"."UnitPrice" * "Quantity" * (1-"Discount")/100)::decimal * 100) AS "ExtendedPrice" +FROM "Products" INNER JOIN "OrderDetails" ON ("Products"."ProductID" = "OrderDetails"."ProductID") +--ORDER BY "OrderDetails".OrderID +; + +CREATE VIEW "Order Subtotals" AS +SELECT "OrderDetails"."OrderID", + sum(("OrderDetails"."UnitPrice" * "Quantity" * (1-"Discount")/100)::decimal * 100) AS "Subtotal" +FROM "OrderDetails" +GROUP BY "OrderDetails"."OrderID" +; + +CREATE VIEW "Product Sales for 1997" AS +SELECT "Categories"."CategoryName", "Products"."ProductName", + sum(("OrderDetails"."UnitPrice" * "Quantity" * (1-"Discount")/100)::DECIMAL * 100) AS "ProductSales" +FROM "Categories" INNER JOIN "Products" ON ("Categories"."CategoryID" = "Products"."CategoryID") + INNER JOIN ("Orders" + INNER JOIN "OrderDetails" ON ("Orders"."OrderID" = "OrderDetails"."OrderID")) + ON ("Products"."ProductID" = "OrderDetails"."ProductID") +WHERE "Orders"."ShippedDate" BETWEEN '1997-01-01' AND '1997-12-31' +GROUP BY "Categories"."CategoryName", "Products"."ProductName" +; + +CREATE VIEW "Category Sales for 1997" AS +SELECT "Product Sales for 1997"."CategoryName", + sum("Product Sales for 1997"."ProductSales") AS "CategorySales" +FROM "Product Sales for 1997" +GROUP BY "Product Sales for 1997"."CategoryName" +; + +CREATE VIEW "Sales by Category" AS +SELECT "Categories"."CategoryID", "Categories"."CategoryName", "Products"."ProductName", + sum("Order Details Extended"."ExtendedPrice") AS "ProductSales" +FROM "Categories" INNER JOIN + ("Products" INNER JOIN + ("Orders" INNER JOIN "Order Details Extended" ON ("Orders"."OrderID" = "Order Details Extended"."OrderID")) + ON ("Products"."ProductID" = "Order Details Extended"."ProductID")) + ON ("Categories"."CategoryID" = "Products"."CategoryID") +WHERE "Orders"."OrderDate" BETWEEN '1997-01-01' AND '1997-12-31' +GROUP BY "Categories"."CategoryID", "Categories"."CategoryName", "Products"."ProductName" +--ORDER BY Products.ProductName +; + +CREATE VIEW "Sales Totals by Amount" AS +SELECT "Order Subtotals"."Subtotal" AS "SaleAmount", "Orders"."OrderID", "Customers"."CompanyName", + "Orders"."ShippedDate" +FROM "Customers" INNER JOIN + ("Orders" INNER JOIN "Order Subtotals" ON ("Orders"."OrderID" = "Order Subtotals"."OrderID")) + ON ("Customers"."CustomerID" = "Orders"."CustomerID") +WHERE ("Order Subtotals"."Subtotal" > 2500) AND ("Orders"."ShippedDate" BETWEEN '1997-01-01' AND '1997-12-31') +; + +CREATE VIEW "Summary of Sales by Quarter" AS +SELECT "Orders"."ShippedDate", "Orders"."OrderID", "Order Subtotals"."Subtotal" +FROM "Orders" INNER JOIN "Order Subtotals" ON ("Orders"."OrderID" = "Order Subtotals"."OrderID") +WHERE "Orders"."ShippedDate" IS NOT NULL +--ORDER BY Orders.ShippedDate +; + +CREATE VIEW "Summary of Sales by Year" AS +SELECT "Orders"."ShippedDate", "Orders"."OrderID", "Order Subtotals"."Subtotal" +FROM "Orders" INNER JOIN "Order Subtotals" ON "Orders"."OrderID" = "Order Subtotals"."OrderID" +WHERE "Orders"."ShippedDate" IS NOT NULL +--ORDER BY Orders.ShippedDate +; + +/* create procedure "Ten Most Expensive Products" AS +SET ROWCOUNT 10 +SELECT Products.ProductName AS TenMostExpensiveProducts, Products.UnitPrice +FROM Products +ORDER BY Products.UnitPrice DESC +GO + +create procedure "Employee Sales by Country" +@Beginning_Date DateTime, @Ending_Date DateTime AS +SELECT Employees.Country, Employees.LastName, Employees.FirstName, Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal AS SaleAmount +FROM Employees INNER JOIN + (Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID) + ON Employees.EmployeeID = Orders.EmployeeID +WHERE Orders.ShippedDate Between @Beginning_Date And @Ending_Date +GO + +create procedure "Sales by Year" + @Beginning_Date DateTime, @Ending_Date DateTime AS +SELECT Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal, DATENAME(yy,ShippedDate) AS Year +FROM Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID +WHERE Orders.ShippedDate Between @Beginning_Date And @Ending_Date +GO*/ + +BEGIN; +SET CONSTRAINTS ALL DEFERRED; +SET datestyle TO iso, mdy; + +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(1,'Beverages','Soft drinks, coffees, teas, beers, and ales',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000000010000000001000000001001000000000000001010100010000100100000001010001000000100100000100000010101000100000100010000000000000000000001000000001000000000000001000000000000000000000001001001000000000000000000001001001000012507070100000001000000001000100100000010000001000000000100100100000001001010101010000000000000000000001001000100000101010101000000000000000000000000000000000000101020525363777777777777753530100101000100000000001010001001000100100100000000000100000000000000000100010001001010001000000010010000000000000100000000000000000000000000000001014343577777777777777777777777777770100120001010100102000000000000000000000000100100010010000000000100010000000000000000010010000001001001010100000000000000000000000000000001021617777777775757535353525777777777777770150120000100010101000000000000000001000000000000001001001000000000010010000010010010000101001001000000100000001000000000000000000000001417777737617376377775767771707752777777776340161210300000000010000000000010000000000000000000000000000000000000000100000000000100000000000010000100000000000000000000000000100503677577571705014000000101070717775777777775334101400010101010001010010101000000000000000000000000000001000000000000000000000000000000001010001000001000000000000000000000000010357353000000000000000000000000000171777777777470612101000000001000001000000010000000000000000000000000000000100010703010101210000000000000000000000000000000000000000000000101034350000000010653435777570477474700000107757777171000000101001000101000101010000100000000000000000001041477110131035750020040477301000100000000000000000000000000000000000000000010004014176577707000067777777776560404007371734361701400001241000001000000001000020400000200000101747767777000101073777577777775372100000000100000000000000100100000000010000010000037676476700004000577470416717477421405000434140343000565120510100301014002107171370701437777777775777777112103177777777777705757771010000000100000000000000010000100000101000470440440671007477776777777614060600742524001777777747646776752060250003021716737777777777777774747727574777001016777777777767173317703000101010000000010000000001000000000000420460200077427477767777777775677777746474656606767777665746776757151253507166737777733746777577777777572776771100517777777767776015713141030020001000000001001000000000010100067440044047761477767776706767777674765673470657505767375664746757777271252167717733771737776777677567476577577121103775777777776717027753121010101000010000000000100001010000010767060004776747776776777756776777777777042477676067777467474747676777565256531311771177376477777576757777747710110701777777767777401717340000000000100001000000000001000000101004776540666050777677657777677470774777776747664607777376747476777777677717173735377717737747777777777774774770011271077777767777763171735210121010100000000000000000000010000000300406767757676775077006767477774774777774747770476777656706746777657777777777777777777737667777476574774777771001031777777776767741371771000000000010000000000000000000000101005707442567656176006767004770476707700767770000477747734656446745677676777777777777777777375667777777777777777773100010777777777777771753521010101010000000000100010000000010007777712152503004670077774767427047247776577564700076737747670474277777777777777777367777777765777777777777434777750757775377767676770172773100000000001000000000000001000101007170701614204046007746040676167470774167743656777740077776067407465677677777777777757717777737476775716161243410303077777777577775210000011350001001001000000101000100000100002100171525675070074340670005004076700706570757777767770077744746466567777677777777777777777773776777610000000137775350317777773777737750701000101021001000100000000000010100010010300067777761650604065047604760746404776406705656776770077764750474747677777777777777777773733747777773011735777777777777777757777777777767412041001001000001000001000000010001000577744140000607406706767676776777776477756767777447700774076646764777567777777777777737373737764677747753527777776777777777776365735353513010300120301010000000000000000001000107000210006147767674646040404040066667767677775476777046644644044456776767777777777733737373776777776774244777377717712777165357577534242040010010010000010001000000100010000100300050000146664000000101030734352101100065677767077770047604774377676777767777777777373737333756477657075377100770770177776525271673001012101210301001030000000100100000001000005000060046160004000125343510110101000000000007740000047744733737377757677777777777373737377737656757777777373101676770777717775671773001010300000021021010000000000000100000000100077400000414021414000000000000000000000000000300000777777773737377677677777777777373737333735677677777377710177777717774705271767340300000010101000100000100000100100000001014005660000000737560600000000000000000000000000004730777773733373737777747677777777737337353761666777777737737017771677077353777574735310012101000000010010100000100000000010004300065400000000400141254140404000000000000000000037737776773777373733777677777777777677646746565756747777773773017017710765654352735770017010303031010010000000100001001010030704000660000000000000040000000000000000000000000007777514673373373737777777476777777777474644764666776777777772711031076117307374357477373010341050043030012100100010100100012500000047000000000046742000000000000000000000000077776677777377377373733737767777777777767645676507574777657610057121101731611574777637735105270125213010050210100001070210301650000000640000000006776406776464000040641434177777767667614737337337373777777767677777776564767474664667477761775271112116101002331211101052721016120140161034106010173075617770000570047400047400446000000467770504777767173573756767776767737737773737377776777777777776564746765477576777176700774656474731010011000001250165214716170121012011070777173777400063770040000760467600000000740760600777067777777676767676767337333373737377747677777777776767747424676747677157701677677676131331213131301371317310312161525053073077777777700047577700000006006760000640400006474046740777777777676767676737737777373777777767777777777674746767467477777743670175305325352527135335353170143414371617130131211777177777777001737770006760476677047064466400047640077747777777767676767673773373333737373776746777777765467674704747674765375610731773573752534737417017035303130101010030001427777777737770047777770047460704644064400004640067004767077777777767676767673377377773737777776777777777766565665670767767775077007563153347370731013213617034343434307031417121177773777777740257737700027447000064000000000640064006760777777776767767767773373333373737777476777777777746765674464747767763477027172753717175777757757357171717171717433616163777777735737400737773400460660046000000000004000600676747777777776766766767377377777373737777747677777776756567467746765777117100537153353773777777777777777777777777737757737573777773773772047777350000474044600440000000000040047774007777700667677677633333333333737777766767777777777667476564657476760600007353375373177777777777777777777777777777737777377733753777740007177770000664024640640000000000004646700477777007767667666777777777773737777777777777776777446467565676777535373525317137177177777777777777777777777777777775377773753771737700076737350000000474664665646644400400464000077700067677677773333333333373737776676777777777767777766767765677771713175217037173777777777777777777777777775375377173753777377773700057777004007477667764766767667467600000004770000767667666677777777777337777775677777771777772604000404067761171613131535353717777777777777777777737753777777777753773717735374700000500670446677777776777776777776561004661000006767767777333131101100777777666567777567704040505140777716536353147173135371777777777777777777577577777777777777777353753777371700000001776040404040404606076767776170000470000071101100100000000000110157177776777776470124100002530004777111301313017535371777777777771771737377773777377753773717353252165376164464265700400000000000004040040076774000440000777500750000000000000000017347766777746564100000000400300652513530753303170737777775777777777777737777777773777753757035353134317137313533000046440000004400000000053770000000000077343100000000000000000004135777775676176000700000004044213052153115353371357777377737737775777777573757777777353213503161617163521657257000006700060042400000005273710000000000007577000000000000000000531117777665447405244000000040031501313030721353537737775777577753737717737777777777777035343343131303103171317337130100000567000200000031756000000000000000077771012100101101131117133375466747465707047000071502161011531534353517753773737353777737777777777737537713503353170717173561343105307030525370047014161717433700000000000000000000101011770000006402737373767456467777777773065773510137343531317073737773775777773777577375735737577777343375377373673071316352731717173137000007737352713574000000000000000000000000464000000046733737373446647777777777740007373737110310343537171773565373537577177375737777777777773353737717175357727753717163737357770000071735371677700000000000000000000000000460004004676173737374745777777777777004631713112031213131317337177737777777377777777777777777777775377737777377371717353773571747737377617771677773570000000000000000000000000400400000000406337333464673777777777774007733373311001013135317177737775377377777777777777777777777737777573777377777736771773773716717535343373525773700000000000000000000000000000000000000037337374433373777777777700007740010313133173137337357753777777777777777777777777777777737737775375737373717367171653735727367374753737174000000000000000000004600000000000000000373733643773373777777777404073000000000012137331737377777777777777777777777777777777777577773737773757575735317273353531757535737377576300000000000000000000424400000004000040007373375733337333377777770000700000000000000000070477777777777777777777777777777777777737773757753757373737777775357273673373773535737357000000000000000000004406000000000404004037337333773737737377777700400000000000004006404043777777773757777777777777777777777777773773737773777777717371737357171752573473721777340000000000000000000006446400000000004004337337333373337337337777100004705340100016503777747717717757777777777777777777777777773757757773577173577775777577377773777373757777177700000000000660000640047674000000004000003737337373377337373737774040077760004000000044004737777777777777777777777777777777777773773773577377777377377377377537177535757373537710000000000004040004640604600000000000400073733737337333737373777700000047477420000000000435777777777777777777777777777777777777757777777777777777777777777777777737737377577777000000000004600000460064600000004000000000373373337337373737373777600000000000550043617777777777777777777777777777777777777777773777777773777777777777777777777777777777737737777000000000000000000000406400000004040000003373373737337373737373770040000000002777357777777777777777777777777777777777777775777777777773777573717775777777577377777777777777757340400000000000000040004064000000000000000073373373337333373737377750000000000057777777777777777777777777777777177775737577737777777735777773777773773775377377735735735375737737000000000000000044600406060000000000000046337337337373777373733777007460000000377777777777777777777777777777777737737777377777377777737371775353753753777777777777777777737717750000000000000000000000444404400400000000063733737337333337373377774067400000000777777777777777777777777375773777757777177177377735777777777377777777777777777777777777777777777704000000000000000000006000666066000000004433733337337377333377777700676004004407777777777777777777777777777757357375377777775777737777777777777777777777777777777777777777777772010000000000000000000040004404440000000000373737337337337377777777704600674660077777777777777777777777777737777777777773773773777777777777777377377777737777753777777777777777750040000000000000000000000460460000000000463733733733733737777777770047464067000777777777777777777777777777777777777777777777777777771737177777757377377753777777777737757773737000000000000000000000644640000460000000000073373733733733777777773750660760400017777777777777777777777777777777777777777777777777777777777373773777357173775377735737777377757777240000000000000000000606400000000000000000373373773733777777777737604746400406057777777777777777777777777777777777777777775775771733735377757177175737753737537777757777777777750100000000000000000046540000000000000000007337333333777777777771771066067674767677777777777777777777777777777777377777777377737777775737573737736373717375773777373737377777371200400000000000000000046000000000000000000073737373777777777777737700656476464617777777777777777777777777775757777777575757735773735371737357737575357635733577377577777773777775000040000000000000440646000040000000000000733733377777777777777137106606476400077777777777777775777757357777777757577377375777775737777577735737377371735773757073737175777777370000000000000000046764656546400000000000007733737777537777777777774474407467005077777777777775777757377735737717737377777737777371773737373773577535373437073737757577737353777700500000000000004676474266640000000000000047333777074747777777777776567642766027777757537775777371735777777577777777577777775377777777577577777737777577737757757373737777775777000000400000000067407604040000000000000000077777103716173777777737676665646470577757377775777375777777177377777777777357357777773737777777371735737773735753737377777773577377370004000000000000666424604040000000000000000777777007677477777777767676767474003577777777773777777777777777773773573777377773777777577773777777777771775773777757353753577357777770010000000000040406404000244000000000000000777370141477567777777762476767660067777777773777777737773777753777777777777777777777777773777777777375367377375357367767767737673477140240000000000000446400004660000040000000007737520077772757777770040047667767177777757777777777777577737777757777717753717717777777757753535357777775775777777535753735757177357005004000000000000000040400476440464000000007773401616575777777006440004764256777377375775375735737777777737737737773777777777773777777777777771771777777777777773775777377577773000000040000000000400000000000067400000000077771425777367777700400060006765377777377777377737777777735735777777777777777777777757777777777777777777777777777777777777377377353770070040000000000000400000404000040000000000077770525765777777004004040440065773775717377777777377777777777777777777777777777777777777777777777777773737371775377773775657527777500004000000000000000000442424400064000000000777724077576777700400600007000373757373775775375375737777777777777777777777777777777777777737777377373577575777777573575373733771737300700004000000000000004646440000672440000000777507567657775000444040644047777377777773777777777757777777777777777777777777777777757377771777375773737373737373773377753575377577400004000000000000000000400000040440640000004777407757777700404246044604375777757737777777777777777777773777777777777777777777777377775773575737175717175717571757253372734372773007000040000000000000000000004600464000000007772525677777004704064240124373777377577777777777777773773777777573577777777777757377737373777373777737367363727373735356171737177175000400000400000000000000004600000400000000047710477777700676006564640577777777777777777777737773777777577177777777777777777377735775775377757173717535357174352537737373717717730070040000000000000000000040046000000000000077777711357047600446500072777777777737777777377777777573573777777777777777777777737777377377177377757773777377737777343574356773737710060040400400000000000000000400000000000000771571715356770446002470757775773777777377757735735773777777777777777777777777735777377777777777777737573577177535357773777371747527710160000000040000000000000006000000000000007771353777767600056440042735373775377375773777777777777777777777777777777777777777777777777777757377773777377737777735777537577373717700104004000000000000000000440000000000000077171357777674006064214357577775737757777777777777777777777777777777777777777777377777777777777777777777777777777737777373777737577777300424000400000000000000000000000000000000777174777756765404051425373735737777777777777777777777777777777777777777777777777777777777777377777577777777777777777375777737777353777100100400040400000000000000000000000000007717137577764767404061777777777777737737777777777777777377777777737537777777777777777577777777773773777737775377177577737353753737770737100400400000000000000000000000000000000077717177777467760030065377577777777777777777777777377777777777777777777777777777777373735371777775777177753777777737717757775375753573536100050040404040000000000000000000000000771717177720767000043737737737737757737773773777777777777777777777777777777777777577777777777737773777777777777777777773773737737377357753000004200000004040000000000000000000047773537777504004104375777573757777371777777777773777777777777777777777777777777373777777777777777777777777777777777777777757777777377373777200504040404000000400000000000000000077153577770000016075375373777737177777717717777777777777777777777777777777777777777777777777777777777777777777777777777777375373577177573535300100040104004000040400040040004000177353577770070007277377777537777753757777777777777777777777777777777777777777777777777777777757777777773777577777775377537727576377717252734120050040400404040000040000000400007735353777005006535357777737771773777377777777777777777777777777777777777777777777775737777377777717377777777773777777777753753735752771775173500007000040000004004000400400000477717177775004353777737377773777777777777777777777777777777777777777777777777777773737757377173717777773577737777773777773773777773771773136343700000561040405004000400400040400775317777700367771737577537757777777777777777777777777377777777777777777777777775757717777777777737177577377777775777773777353717773771776535353716000047000404004000500050010001735717777761717777573777777777777777777777777777757375777777777777777777777773737737773753777177577737777537537737777757777777771757372537737271717100005252004004040604004040077531717777177777777777777737777777775777777777777777777777777777777777777777757717753757775377737737773777777777777777777177173777737753770775363774320000416524100000400400004773717777777777737777777777777777377377777777777777777777777777777777777777777737773777773777777777577757377377777777377377777753737753771775375757377577600000106141410143405007757537777777777777377737777773777777777777777777777777777777777777777777777777753777737777777777777737777777777777777777777377777573777777377373775373735373000000000400010000077377717777737777757757571777777777777777777777777777777777777777777777777737773777777777777777777777777777777777777777777777777777777737775777777377775777777777161612161637777777101777777771771773777777777777777777777777777777777777777777177577377577757777777777777777777777777777777777737777777777777737737775773737717717771737737537777777777777777775717177777771777777777377773777777777777777777777777777777777777777777777777777777777777777777377377777377777777777377577177537777777373757737737735377735737737377737775773777377717177777777737777777777777777777377777777777777777777777777777777777777777777777357537537777577773775753573577577537377737753757357757357571753777171735735775357537737571777771717577777777777375777375735377377775377777777777777777777777777777777777777777777737777771773753757377377777737777777777773777377737737737377375377777737573537737753773777777777177777777775775737757737777777757377777777777777777777777777777777777777777357777777777777777777777777777777773777777777777777777777777777777777537717773777777777777577777717711737777173737377777377777777177377777777777777777777777777777777777777777777737377777777777777777777777773777777777737775777777777757777775373737777773777377377537737777777710101417777757757377777771735377777777777777777777777777777777777777777777777777777777377777777377377777777777775775775775737777717717371735377575735373757175365737777773737777777773617377373775737773777777777777777777777777777777777777777777777777777777377757177573737777577773575373573737737777773773737777777777777737373777175337637173573537777577717777753775777775377777777777777777777777777777777777777777777777777777777777777773737773777573573753777737777777777773773777577577737353717353577175217437753577377377771737373773777375377375377777777777777777777777777777777777777777777777777777777777777757153471773737373773771737771737377777777777773777737577777777777377737733717373717177737777777577777375377777777777777777777777777777777777777777777777777777777777777777777773737773771757577573577377717777575717377777777777377773717353717357175717577717753777175773773537777777777777777777777777777777777777777777777777777777777777777777777777777777753473535377373717353717171735373737777777777777777737777777777777737737737353735371737737777377777777777777777777777777777777777777777777777777777777777777777777777777777777777773777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777773535000000000000000000000105000000000000C7AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(2,'Condiments','Sweet and savory sauces, relishes, spreads, and seasonings',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000777777777737125353313731773543110105302502105313321714317343717135371373147317317171717121135301610131217777777770146765074747776567616774776565774040371737031611737710110100007777777777717435357353531713343030301103112161705353317353343717135371370317717737371734125031131352171777777714066544724767776774747657700577764774340735757100371507530210777777777777777731737317353731704311151303112110431731305317314171731717171354731713535373107131703011317177777770664576076567476404776147676777674174074740573312411002173611137777777777777353167171735337173531163125351615307173171737171707373173733537023177373737351611010113521737777775245006047474747407777777767657775747477416560075141200115351103077777777777777377143161735717353463107113131303343353171317373107177317173171477135353717370737312503173577777344760547061604760777777777777764677776007470774033001010035212100777777777777777173563535335371731053130707071351165343171701773417357717177130177173717717134101713353173777747640076047447000777777777777777775667570467760774040301010101053107777777777777773712531335337171735301531313134334135353361371350735331737137707137353731737433731717377777776040000407647604777777777777777777460547743565054776011001031213010077777777777777353561737534717337161352171712717103737335137137061373573171711073531737171710351171735373777704740460464746777777777777777777777040667746776007751300530101301300777777777777777373071713713717135241311030711317605117533517171075353357373734173173537373735373773777777770460464740406757777777777777777771777640577740457777000131035310701007777173777777775353431613717357131630731713735311637317173737171235353353535725377777777777777777773737777567404706425046777777777777777757777775246577777767711350131030311300177777357777777737350771731171337510531071351613735534317131717305737357377373077777777777777777777777777776540060405646777777777777374777377777774767777747771076035031110121000173735777777773535307131717373513243357317073171163353712571735073171733535735777777777777777777777777777704600564064077577777777777737777777777424577756771147741121161037100017357733577777773731603521725153251071335213317077071335373371732177373573737777777777777777737737777777776460464604046473777777777777777777737777567776657167647421121121103001035775737377777571711613531337353371435135351713131471731171735716171773753777777777737777777773777777777774740405674747777777777777777777377737176567757370470067070121121100010733531717577777371734173535353353107127713631735370371737173537107377373777777777773777377377171377777777444006640464677777777777777777777777777756777774747047741137112116100305737161373777737173107313531735352471713171173537017173717353731637535777777777777777737737737337177777770760650406047777777777777777077777373437777770567674776012101611210010131717135357777713253425343525353131031717373537171617171371717750537737777777777773737737733713537777777744404656440467777777777777777777377771577774764044774470717131071301210161335253077777757131035313137377534721717173537371637171733737343537777777777777777737737753713137377777764604646560457777777777777773777373001777574777764477611301121010001017135131314377773131716317353135313001717353353717165317371713573173777777777777777737573533373353717777777465404006400767777777777777377735000137776067664707640341216131300300035253521707577135271653531161773716173371375335373531717173757316773777777777777773773737377171313773777770460000440066757777777777777773700010577756764100674031311310100010103131313521073777731131052773171371310715377135737171773353353337717777777777777777773773737333131353353777776764007640456006777777777737371000013576644566565671341210131300010103521703170073735371730311173171371352735377335373725357353757177177777777777777777773737377173317173773777344564046466404444056477777537301000373405606746764011331352171001201013523152107177735303504373171357017005335217135307107317371337377777777777777777773377373137317133353353777706400004400676000640677471001000171464767444564031301052117100301001703117211617173531713035316127331710737171717731734071737171777737777777777777777777737377735333531737777717746654047046440044700465700016113000564440676653130171311303001010303152311340217173613530435313513531210717313613535312131713771777577777777777777777373735333337113713131377777344660240404740064000007003012446064000065641301430121217100303010117214341305030713521770035312153431340315251703537140713531737773573777777777777737373737171337311317171771777714540440064600464074764547407644764474661061711131171213001100121311331330433171353713107121713013170071631331353113013073173537752777777777777777773737337373131371731317707377776646600000000400464006460040000476461100121212163011710430103104341170510350307131714035353017317034353153417125240735317537717377373777777777737173537713137113133135371377737771404047400000000440040000046564612110016111211111303013012110331333130343135134352334031251210717107353213717131300131733737777577777777777777737173713737133713717131774353737777776646444600006000046442564670513430031611030301700012112131170552530043032531351307171335313137007153513035211071631535737716173777777777777737373733733531313133713707375737737757474604640746406546442411030301104111210110303104012112533130313134315113171371407135031707110712313253121520031173733537777777777777777737737373717373313533531177165373577777737777574746445652413513125110130012121121210110013152113152531725005303616343160335303521310243535161134112143537371777777173777777777777731737737313171731353137350737173717352573717737353737171343070110212100210130101013020210311612313171134121711311353134135311353531061303116113010013535373537370777777777777773777371737373331371335117340537153717352573737517340707317351130211011201712103103011001312531711725371124301253717135035215271212170171703130313030703535373777757377777777777773735733717171311371333173163537353707142570532717161352513307111211211401113502101211041713030371135363105331301212530431731135353107031100110411000713737177377377777777777773773733771733317131335353170143417217317073173535317071353250303071021120120301311303124330171711371133150435053537171703713107031316053160317031301071371717717734777777777777777377377337371331351733137124331335351700717053530700714351131501103112107111131030105001153012125363757312131303113121051707131716110210110101100300317137373737713777777777777777777777777377373331537174101170535321705713725353507331216121312110710003070125103130061213110133151317052521716161370213134310313514310303121310140307171717735653777777777777777777775341307071331313130060130305313003411310303014105310101012101214311130121103130131412130757377735213171213135105350311251212021030110101030035317337735731777777777777777777757171310101373535317100112535321610613161035110031310130103010131003030013112105007031301011317731730717031711612012135035335310503110212130104713535713737167377777777777777777737310010135153313530003011010511001212117121243001030012101103010051013100301130011030130077737771750731731631350717133031035302110211010121303533733753773177777777777777777777510100000017335331711043030312121041153010101001121031010102103010303100311012100121010010731737773731731711531300316153171307116111035031101433537533771774377777777777777753012110111000015617137200103110311121203103031210021110010030101010000103110121013000130131017771777771471352373053525313317037130612102103121312573713753777377773777777777735035355371731510001717701100314311430100101311011021102031211011010130010100312112100030012003037777737377335375317330131351631713150110311301535017353777377377177777777777773513513130111053351101771130070131303131053170161307050311101030102121000121211010010101013101101777777777716537131731570716331531352352311210713013343773777375377577777777777713171310135371315373103520010113161311032072113131110311212121012110110031101121213030003100100307737777773717137171731310315331707353014301311253353573573717377737377377777773177125353131735335357103131202521135271510113412163105211111113110121210003100111011100101301010177777377775637717331737071735213317317431734121314317373777777777757777777777317313113107173777531737150101013173031133043713353110631777377777373111001310312121030012121000210777777773733171316171611073135351731703101013171733525777777652104277777377731713535341717353537357571310100010351353250310351317377577525010505357730301031010112100210100101037377777777757335735331734353717371371707131343121753177050001040014077777737713713011331357777775337175000100010370351314771377775713400100000000000417531013130313051130100010077777777777345331735353125353310375313430521353531377770000400140014057777777351717351071353771775357331001111111353353211377777434001000000000000000003531051014110030100100210777777737735335731735217103341737137353413110313535377104700106756207747773537371710325175375777317735110110001107317351677771611013400100000000000000000703121313003012100010017777777777773433173131710735333113710305303431073737770777406456065570014777753103535113137773711771101110010100171771737777171607000010001000000000000000130110300611101010011077737777773717717353731730537516371737125313173171777575646747676566756704773757110717757777773773130000111001110771377777516101105010000000000000000000000532131101721000012000777777773777717317353431343133317171717035307173773777775747400456556756701773737711010343571513571110010010001001777777777357343034341010000050000000000000150121001121100010107777777777771635371353735343535353371335431713535377777770006047606677674073777777771711113173753000001000010100177777777535305141000000401070000000000000000313500310100100010077777777777373537037331530173537317137523173773737777777747650460447465677777777777777777777777300001100000010110777777573530530374175353107057310000000000001710071030010101010777777777377753713713573716137131733533507171353777777777774640540761465477777777777777777777575000000000000000007777777753577575031035257053007700000000000003100121121000300007777375777737343711713131716137171753533437173773777777576700766704465625777777777777777777777737000000000000000077777777773537077577561763571001000000000000053010121001000110077777737777773531733536173253717373373711717353777777777755046564476767477777777777777777777777111300000110101000777777753577753712707100142070070000000010010300713110100010000375771777373534371353317315171731717171707353777377777774766474677644747777757777777777777777717370100013000000007777777777777350574100005251007100000000000000611210030001000017737371777773716135271711732533537373737307377177777777777752424464765677777777777777777777777777141010011100000077777777777770712170710301701617000000000130010531031010101001071771735717777136131173731716173531717135353737377777777747654476744644777777777777777777777777713001011010100100777777777777570570110414161600071000000004170003071011000100000371737137773733417373171371217137373737737771777777777777777467444604677777777777777777777777771700000001010010017777777577757353052431201001015340000000012100171121200100101011735717773375353735317137131613717171731717377377777777777600742076565677777777777777777777777737100010110100000077777777777305705251525034000702100000000005037103101100010000037133710775737352135237317350713737371773777377777777777765046546046467777777675777777777777773710113110110110001777777777775730701006125010100050000000010030013103000010001010717717373737735357135117717334353537373773577377777777777567746644650477577775777777777777777750131100000100100077777777771775711753010530400001010000000010010703113100010000003710735357353737037333713317137373757377173737377777773776564745204646757774777777777777777773313010010101110007777777777577771650341252051012104200000000007001352100101000101017373171737373531617171371713435317337537357777777377377756470064404657777777776567777777777751111101000110011377777777777577161035214105200040101000000000101031013010001010000735377335773773535373173173353737737737737373737377375377777447476704677777775777777777777771371301001001011017777777777537577134104034001001000000000000000700033101000100001003171357331771737160152173171351733717373717177775371737776767460446044777777467774777777777771311111001101017777777777777577756134311012161401000100000000010101012121010000000077337335737377373137335353737363573735373737735337173177756104700046567777777757477777777777117131000100113777777777777776717351410401450101000000000000000016017110100010000010357371773177735371613533371353537373737717353173713717775654065400004677777774707757777777735311010112113777777777777777535757161252161210000010001000000010010310210001001010007335377377353773530713535337337173537373735377311713737765670000004004777765656577777777777531311010111777777777777777777536352141010014340100000000000000010000311010100000001071775335377373737170733735717537373717373735317373717775725650000474046777577777677777777773711311313777777777777777777777575757161050000100000000000000000001001210000100000000377335737737777737313571733733717373735353737731353733770567000007400077777677777577777777735311177777777777777777777777573537010116310100000000000000000000000131010010000010105335173353777371353053331353171735373737373713177737777770016140740004777757777747777777777531377777777777777777777777757347753777717400000000000000000000000010103001000001000035736317357357377317271737373735337171737353777333737377716140141003473777776757465777777773537777777777777777777777777775771757761601000000000000000000000000003100000001001010173317717377377373711373535353734737371717371377777777777502112007047377777756777777777777777777777777777777777777777777771777771501000100000000000000000000000003103010001021016317431635377377173727173373371313531373737377737737777733714005001737377777777777777777777777777777777777777777777777775777776142140100000000000000000000000000110001000101012017713173537377737353117317137137343777373737737373773737373737137773777777777777777777777777777777777777777777777777777777775011210010000000000000000000000000001200100010301211431617353717737353353613733537335373337777733737373373737373737737373777777474240567777777777777737173302137777777777777753435341410001010000000000000000000000010010003010101003173617313737573753353435373135337773333777733737373373373373733737773777756101000507777777777777776140500001377777777777753525210250000000000000000000000000000210010010210303117351314771737373371321733173737733337377333373333373373373733773773777714000404070747777777777400000000000400257777777757170714141001000000000000000000000000001003001011010100617335733135377717137152357333773337333333373337373737377373777377377777435777707477175777777700000000000000005377577777716171430300100100000000000000000000000000010021201210311314121353737173737313253333733337333373373337333373377337373337737777710777775077574707777700000000000000011007377757753717071050140000000000000000000000000000001000101310310035737171253537177317353057733737333333333333337373373337373777737777777775475725777770477770000000000000000003005777677757717070102101000000000000000000000000000121010100310311121312135353343737733337373373333373333333737333337373737373373777777777773470052574177777700000000000000000010077575777771751016010000100000000000000000000000000100030310130307171353433035353773731717373333333337337333333373733373737377777777777777747125352757657770000000000000000001250577777753571252501410100000000000000000000000000110001011013010112130313117312777733323323332337333333333737373333737373737737777777777777140016050257407700050000000000000041003777777777357103000000000000000000000000000000002030003071301213353413437017717737373333333333333333333333333373733737373737737777777777777375017257400747100000000000000001000075777577575307505101010000000000000000000000000010101211035351010313703113733337337333333323333333733733733373333373737373737777777777777777477405670067777000000000000000000007743477777737530302500000100000000000000000000000130300313121213013431353673377373323333333333323333333333373333737373737377777777777777776747640424000474775200000000000000007575707705753553141410010100000000000010000000000013011035217131301703137331373333233333323333333333333333373373733737373737737777777777777756777004774770576705700000000000002177677057777777347130012000000000000003500000000000013125035217050131353137337333313333323333233333332337333333333733737373737737777777777464644640004047406700677505000107161756505777000575357316153050101000000000017100000000000707125131213130137333273313332333233333333332333733333373737373733733737737777777777656740000074067640000575767700416500416777777775777777717535214010000001000005370000000000424133530351302130137333323233333333333333333333233333333333333333773377373737777777757474000004656504704756524057470770071257777777777777571771341431001010000010117430000000007406753071034111013273331333323332333333233233333333733733733737373377337377777777774246740047000064704706760077077574774774577777777777777775347131020500010000035210100000000675740243103130303033323233331333333333233333333333333333333733337373337373737377776564404004064000474404004104747724740776776777777777777774735317435102100010015035700000000004642440043101010101331333323333323333233333333233332333333733373733373737373777777706400000670400000000070470477777577074757757777777777775675775701520510521001431500010000000700040056103121312103233333332333333213333323333323333333733337333737373737373777744470000004041640560046747477757556777417677707777777776567467171353413001006143043401000000074000004640210101001033323033333231333333233333333333333733373737373737337373773774676740460000640646406756777477776775774675447407776774052467747257253143525012107100000000000464270047040121303121333333323333323333333333332333333333373333333333337337373377640444004000004004000046777770707756767775677777657574256477567057357057177171410507110100000000054640676740101001003033333132333332332333033333323337333337373737373737373777774040000600004640000470047677434475034774434774750676705657740400645717377753430001214730000000000600004404042101301333323233333333333333333312333333333733733333733373373737376420000004006040420006406767767477042457707407047765774067764740064163717575251010000573500014425604450000046500210130333131323313233333333333333333373333733373733737337373777745400044004040000405447747747577774050604077447747465765044747604776445777775200010101350102467406470640000046041030113233733312333323323323323333233337333373333733737373373774664400000004000000460467767676776770675424770747725046565677654004476064065351777777777770005470474004000600470001012031323333333333333333333333333333333737337373373337377777000400000000000040000006767477676777765702576004765406770464004604700440000577777777777777750076000000000007407646001211733330332332313333333333323333333733333733377373737373744040000000000040647400477676765657656564047645076567656440756425674004704047777777777777777710400007647600540044650030123333333331333233233231233333337333373733737333373737777000040000000000040004000445740400676472470041674004740400042447560470424747677777777777777777760004047044064600000640171130337303233333333333333333333333733333733737373737737765400400000000400046004600064000400400540470047040076000470047646404004740004377777777777777777040077047707400740000740121333331373323333333333333233333333373733373337373733777046400040000000640040074006004367400407601647400764045607404650470576474040654777777777777777770404400746440044674046002117303137133133233231233233337373337333337337737373777704640000040004040000004400440674400046764064740040410065247000006746645647704427777777777777777700600047004704670400674013031377032323333333333333333233337333373733733373773737400000000000004040074567202400460000007400564706776656065646406004007247044046577777777777777777040460057706000400005674001137117313330333333333333333333333373333733737373377740400004400004000004464044047004747440046564006004454045640474654004744064760006777777777777777777400400674147700707604060307032313733333233233213233333373373337373373737377737740004000040000040400070004406640460707656475004006020064047441600474007476500077777777777777777740000000047464064074004400117313073333333333333333333373333337333337333737373770600460004604000007006464640045061046404650640560056440540064674070465647400406477777777777777774000420000760000434007060003313753533723331333333333323333337337373737373737777704700040640004000044050065000460460074004604006544640046700470640470744006647040047777777777777000400404007704000467444044013073312713330323323323323333373333333333337373737377466400404400654060006460460447474050060000460046064740004474400564464024045240640004777777656744000640074047777047446056700053531713733333333333333333333337373737373733737377774400000000047676404746540000746447465440047406704504004467404046746540470564004740046567765656424064040060777744040610674003312731353333333333333333333333333333333333737377777400004440000464640004044604464647676766746560404046000476776767677776004646400404656676646464644400400640404777600004400460011713000000000000000000000105000000000000E0AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(3,'Confections','Desserts, candies, and sweet breads',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000113330735737777704000000000000006060000252000014131315311716037070021240161075371617637506357172512171357170173537160000025214002070000012436167777777173333737171773737377700001111131330131357737700000000000010000050040006331131313310705073430040000003070761617433514356537571773171771716167170604076776775677064253437177777737357531737373753537337113313111111113131235777000043712006767773677777711131531311777377077043125361707171177773563737373563777177371374735716771707717735637700016777476777737531333733537371373717531111313130131316131112163035371350007753477177311137133171331777777770734772516177777717777352575777357377717537533173777160277767777777043635673717737533337171353735737353773713111271131130317013111111131131670073677776771733113113135137777777771470777616777777777175377375377357177773573757073577775677777677770365635777677533753537337371737353377377313111123130131313103131313131711770477670777353533133531331177777777763777177717777777777735357377757777737777353353553737737777777777761771637535733533333135317373753371317371271131111313521313310112131171337003717377771313117113171131777777777177716777777777777777777735353773777777777775773365777777777777767160677747673173717117337335373777177775311123103121113130371131317113313143047765767171715331313133137777777777677777734377777777777437577777357777777777737357530735777777777776071777737317371733733531737177313733737131113313113303511130153311311317343077777773131331171353153137777777735377777777777777777777537737177777777777777777737777767777777777717061617717331337313173371737737373573773103111313103132130133071311311313000617277173171731331313111137777777777757175377777777777736527577173757775777775257537171777735361777253525616717373535333171371737717173753713313121011313113113153131131371310000604167113131171131713131177777775353737736535777173773753752767757377737737777736757777177777776165206353735331317337133335373753737373773111311131311301312130331303113131701070127013353133131713113113171773737773571753773527657765274371717737737777773773753637177777707177716535273533173731713717133717377317177373121131111121130313131031313313531600076507711317153131313113117777777717163763777767753717373136161634777577177757757777567075717776353613437473353131737313313353373731373735311131103111131111301731115313313131120012507317133317131713113137773577737753753435373777675756537535736173777737773773577377736777777677617437173337331737313353353753771335337131111110131303121731073131071313134107612771313535313531311313573757373535375377777567743527253473434357677537577375777735717771717171771707167317131733537317311331373337137131103331313113111113113312133131313503071650131313131531311313173757377757777737437773717377775367343717773537777375773737777777777777777167736535333373173731313133537311313313311111121353011303310335313111331312161677373135373133131135311777377777373717537717777777777725357343634777777777773757757777777777777777716573733171317171733313713317331331313331331130313311113311133173311531371753777717131171117173131311777777777757737717777777777777776347757737777777777777377377377777777777777773777173133333373531313313313331331311121773313311031341373053105313171773777771313537133713131311137777777777377777777777777777775357777775777777777777777777777777777777777777777773313713535373313313131331110103131137701710113113131317331333131337777177731731311311317171131177777777777777773717777777777377737373737777737777775777777777777777777777357777131331313331373131313113111010111773371600771213011305313171143171137777777131713131731313171131777777777777777777777777773577737777774770737777173737375777777777777777777775737331313313137353113103113331111117701677000071513131331353133131331177737753131313531371313131117777777773777777777353535777377771773773775737177777775377777777777777777777377735313313131313373113110111131113171607777000072111111134337113131133771777735317113371310117113177777777777777775377777773777535377357177377777777537777735777377777777777777777133313333131313131101011131113111677077700000000003373131013353533713777373131313135135313631317777777777777371737573773777373737717337317737537373773777773777753777777777777737331311113133133313111131353353137777343400000000000113113111312111717357713171313133131717531177777777777375377773771771717171713707531753573735371777373777173777773777777777713173133313113013313131113377377177701353700000000003113713121313131317371371311317173171317131377777737357377735371771373737371771333533723171735373777577777777773777777777777733133113111113101313131757173173343410111313410000041371353135313537375335131731713117135377177777377757377577173773777773535333171713531117373537173537373777737171737777777777313313113131111111311173337357131353131301111343035363131317133113317137133313113313313531631177377753777773313717353121013131717171312113331313312113777753737777777573777777771331333111000101111130311771733110111111110311317525753173113153035337713535317317315313171533157773773735375353717353113313131331310110110131311313101313773573737773771773777771133131311111131331131371373713131313013111311313737371173713131317137713131315317313531373513353577757771337317313133313121111313110110131111111111313033173753773777773577377733133133331331331331011171717311111111303111131353537737113312171313713713135333713713171173711313737331371731313313111111113030101210111110010101011111110313371353737753077777313113131333133131131313373775313011031113013131317777713371713131131311353733171371313107171131131135777137113111101011011011111311113100011110101000010111121131377777377307377131311331013113133713131117131111313503113317035303177353131713171131731311171137131353131213171153131137313313010101001011010101110101111000111010101010101101111317377357757077111131101013313713331133110171031131352115213131313131317131353031311353373371137171313131713133131131331310113111131130121111110313101211310011010101010101100011337177737737173131111101011173735333533331313501013111631131735353173533533313135313135317137313313171713111111111111101011010121012111110101011011131101011001101103710112110101117373773777653113101103137173133533353133131313171313113073130331213353135353131303531733711535353131311313131313170101101111113111101010101101101010311010110110351310153501011237175377771377111130111313313353335373311013113101213713103131131317335131352133533171711733313313131311111111211331130110101010110110101000101101101013030010131031131313531011137337135370527131111333331353335333171313177307335112153171725353711131713313513530337331717317171131313113311017521012110101110010101001101000101111211111101013170170103031210135337377737147131331311133317335373731113111711533113313331131310317131311713313171537171371713131311331311011313113111011101011110101100100110101011131301317010113131311111113331713317777323131131003131331333131337307131130310311213533173131131317173171253133353137131313131131110101353531010101110101101010100111010010101112101101313131310101010312111113351731777507111110313133133113373111711103131135371713413107112111313131311353571373537131311103101013531131211110101010110101010110001011010110111101310101130113111311113010311331733537707331111310113113313171131173171533131313133173133713121713535312133171173533531313111111031121111301011101101010101110111010011010131031310111110112101010121013110311331737737707713111113313013013131103113131013131313111353171353171353131113517137317173173773301013113130311111010101301030112110101011010110103101010101010111101211111312111031173131717127731303311210101313173171311131701616017337335331331313317130353373531733317717311113113011131030301010110131111011010111300101011311131110100110100101101010113101133317173777077775775311111130117113170706070700005200101731731535351731171353173171757733717310313011011011111311110111101031013110101300001011010121010110010110110101100101311111313353177577737737713131111371311777777777716705347253531731313313731135353171373317753311351011101011101010010110101311013101011011101011013131110100010100110101001110100230011311377137037777777777777377770707725777777610634305277353535353731737137137137177731310131331310111010111111310113111011101131011700101101010110110101001010010101000011031371011373131717777077737575775777777777773677761071777520735373713171773535353717313713131013011111011001010101101031101011010110101073113110111011010010100101010113010311301107333013313773770777747773773437577725777777777707767036571737753735371353137353731713731101311303013775311011101111101111011010111111710100010101101111010101001011011131121100331311011311171771777375777777537777776776776777707716537371713717135377377171713533111331113011111313377751001101011100101011010101013311111010101101010011001010101010121101100110101011033735377777777777577777777777777777777070773535373773737735317177373733113131101711300101101113733100101101110101001010111011010101010110101011001110311010111101100110012110103117377527777377777357776776777777777770525313371717353713171737335371713311133133110111110131310357710010101010101100110101701110101101001010101110001101010010100111011111010010335317777574777777775377771725707777772531715373737373717377535771737351311111011310100111010310313371011010100100110010103101010100100101010101011131111011010111211001011311111131237777375777757777777704725707436531713737177173753535377637371713331313111101111101301111131011133010101100100110110111010101101110101111101013013011011010011011111011101313011753777737777777771725073520717753431353537317351373777071757373311111111301110101110110310113101013110100110110011011031001010100110110301111301101101101011001010101101110101071371777777777771704720742577634367125313531717377575707737375311131313131101011101011011013010111010111011011011301101101101010010111011110310110110110110101131310100101011113117177717577753577073512753471777707531753773717737737735357777731113113133101010101011011011110011010101001010101110101100010101010101010110111010110011010101113130110101101013031777773437777770742616343061617707672717177777777777767377371713113111113110101101001011101111011010131011010101010101110110111010111010110101010111011011010111110103101101211771777777577777712755257777777770735357677777777777771735735737313111012111010101101111100110101001010111001011101101010010010101111010110110101010011011001031011010100112111177377777777777757616327777777777777567773577777777777777537773535313100111101101100110010111010111100111010111100110010110101010110101111011011103111101010371713101113111011107313537771717577775257507777777777737377777377777777777773777377331310113121130100110011010001010010110101011010111011010110010111010101013013121101610101217130110101010101103131717771777777171727777727777777777477777777777777777777771735375331010101121110110111010111010111010101010101010001010100101010011101101011011101311371311525110110101013101111310317775257377777507776577777777777777777777777777777777737737137131310171110010011011110101010001010101110101011301010110101011101101011011101131311111703130310110101010110101031753777775777777727353777777777773777777777777777777777353753713571013121011101101101010101001110110110001011110111010000101110110110101010313010112121353411011011011111211113153775375377535776574347777777777757777777777777777777773713331313353535131000110101313110101100010101011101100110101003110110110110110101111011352111531113701101101001011130113317775777777777353774377777777777737737377777777777777757717131777317331031110101101101110101111010111010101110113111577777370110110101100101013131613536111305301011101011010317017737777777774347034167361757772757777777777777777777737313133111371531113111101110110110101011310101011101010301077377377710110110101110113111531353113635130171010173101131713777577777777774373436756572773757737777777777777777773737131011311713101035010101011011013107101011101100101311117737775773130001011101013101213317134311113717217073110113131317777717777777034141617373777677737777777777777777777777777131310303103131131773730101011101313111010110110101010137737727170131101000101101311311037135031701315313152111013112757777775777773436216167567535777777777777777777777777717373531311153110110737777537131031311777713110110110111110737521717310101371310101110311017101131431315311713313011013113737777777777741615250716352773777777777777777777777777777313130107301031013513353173511111035331717017010101001011713537371011135377510101011101713110353171301301110111011101357775777777777216102527777777777777777777777777777777773735773513111111101101315335317301035130101311311110101117727773777710112112537371301010330110317131135311113071121013137775777777777775250753477777777777777777777777777777777775733133717730101121101031535121331134111301711212511121713513773531312113111305377771735110101213170101303011121171101013777735777777702527673477777777777777777377777777777777737717113317531121101311131121711521131215131251113031112513411777701111010311310135371121031117152131310111011103171331357735777777777753473743777773777737777777777777777777777371737353533101110101012107111031110111133111312111103013103121331310101011010533531121113101213111110110101101353131111377777773535777673757777777777777777777777777777777777777773131313305311011101311311213101211031251031011101351710101111010011011101311351317111301531113012111011010101311301257777775777773773747763477777777777777377777777777777777737777131315301011301311131211101311131111131011101370130351310101111071103110130310313161713121013110101011010131301111377777777577777757737573777737777777377777777777777777777177353101311313010110121051303101121012130111010777173111210731101011031101130111310113131211113101112101011031101121071777777777717577763572757777777737777777737777777777777777777777131317101111031111315310101111111011011377353117121177101100101170101111030131211111121301101011117017521113113137777777777777737577257277777777777777777777777777777777773773731121735310101013030130531130301211301777717171303110310110111131371100101111101113030110110301010731713112111735777777777777777572775357777377377777737377377777777777777737753531171717010111011110113130111311101137777131171110357713010101011130111101010111011110113011111310173717110131737777777777777777257276353777777737737777777777777777377377177373713537313510011010131010131010301101777371731121110373053510111010113121101110101010110111012101311173137313031777777777777757775355717777777377777777737777777777777777773777713137717131311011011003111011311110177735331071152117771313210101011010110101010101010310101011101437113717353137777777777777777276373777377377737377737777377777377777777735777313171312535301101101111301301101037771731153121211735311435112111301013131101101011111011131121313310301371311777777777777777775717777777777737777377777777777777737373737737777130317113031710110110101101100101771731521311111317731213112112101111101030110111010101010101105015315301377137777777777777777773777777777737737377377773777777777777777777337777531313111131312110010101101110117771731131303110173111010717117112101101111030103110111011101131211313171313777777777777777777777777777737773777377773777377373777373737371777773131350307105351011101101101010773121121010110017211011313130311251310101001111312113013101301011121371313777777777777777777777777777777777373735737777377777777377777777737777777112131113130107110110110101137112110111011013771101014352535211130713111131271011101110110121130113137357777777777737777777777777777773737771737737777717373777717373737717777773113573773531310351011011101713111011001101073570131313113131213113152121051111101111010111110135711153777777777777777737777777777777777737373437737737777777377637773737377777777313173573535310311211010173010111011100111773171035253143151707352111113121031101211130101735737373377777777773777777777777777777777737717353577777777735737737737377737177777311177777317353535311121110111010011001131077735303513101313131311113030101113103135121413131733757357777777777777737777777777777777773573737377777777777777777771737373773177777173733531735371307030111031001011101110503171521711213531703703130311111313105314103531316113715331737777777737777777777777777777777773772737370777777777717777733717377777177777311773771531735317110101101101010103013113773111211713121311110110121210101121131713535317313331737777737737777377777377377777777777770753573534357777377771717752737377777777777731531731735735317312101101101031111013410717031701107111303110111111311121125371773535371711777777777777735377773777777777777777777377373727373734377577777771737377777777777777773173531737173535351330100111103013101311211101130313030110110103010101113537137177377171377777773777377777777777777777777777777777707773534365737716375357163717377777777777777777313771737753535373513171010101110131071112113011101111011010111113103071717753717717335377777777777737373777777773777777777777773707167335327777714177371727377777777777777777777711335353737137153717177711110311011130113011303101011073711012103113131313353773771737777377777377777773777737777777777773777773737376335353517730115073537377777777777777777777731537353537537371737137370710131030130113101101101033717735317177571615353353573777173777737377737377777377777737777777777737773435317237277735341617317377777777777777777777777773535373537177171717537731313017113513050310110117575773535353713731331357373371317777777777777777737777777737777773777777777773363735353773777535371637777777777777777777777777713137717177713735373573534307121703035371031037773737173735373777171171331317527777773777773737737777777377777777777777377777777170736357353032525637377777777777777777777777777777513737737771773533573531717171753537173537537173537753577717137173131171637177737777373777777777773777777777777777377777377777372537236353533531377777777777777777777777777777737353537531771737537773571777731373537173537537153717373335377173537170675242477773777777377377377777777377377777777777377777773712717737252163777777777777777777777777777777777577737737773173513717353777371435753717173713173735375357533133317373001024107343777373777777777737773777777777377777377777777777371210101217377777777777777777777777777777777773677753537317131371735371777713773335373571717717171737733113100137100000100074347735777377377377773777777377777777777777773777777773737377777777777777777777777777777777777773471757373717707175371735373711757357537173737713737335353531216174213000000000160137737177377777377777777377777777377777777777777777777777737777777777777777777777777777777775773472777573717707025371735353733717337173537531717175737373171706353471000042107162473637376373777373737377773777777737777377777737773777777077777777777777777777777777777777737753577777777770735317171737371753735717353713773737333531370070714253600000010616150377177177377377777777737377377777773777737737777777777307777777777777777777777777777777777777767177777777775040603121317177377173311317777131311010343107347435341041061061777276536363717737173737371677377737777777777777777737773777017377777777777777377777777777777777777167777777777727371707576713177377311060131313371763434340347737767761207161007077573713173771776375675271735377777377777377377737773777707677737777777777777777777777777777777777177777777777525677020753673135311677166072147777140774340377677777741676167077773767776172723377373737377377777777737777777737573777370761737777777777777777777777777777777777777777777777777773577527777172531770167107757375676372537734777777777275347712777677777037017757137373735235237377537773777372777353537777173577737773777737777777777777777377377777777777777771776172577777777607077070777677777314775610477777777720536710657777777770503303323743707073773577733637777377773436777670007677377777777777777777777777777777177777777737777777774176142770776777307077070773776777430637270777777777512416370376775777727765301703353737371212537771703774371773535213170001077377737777777777777737777777777777777777577777777736012147777753574007052525777717763410505003437707176012140505717727035001000600343303030035353637163775377763477637767007000375273773773777377377777737377777777777777777777777610400030707276301000000072504761700020000077410776701600210063600534720000201006304343037020071707707127525353703170716100007737777777777777777777777777777777777777777777777101073001675250534060030104352430170507016125703676010000050002714177043401401400751437070500143163740707703727343767070700001437735373777777777777377377377171777777777777777777777777705207772521014060707617767070305204036571717771610012415636707371423000210727052572002007707307007707163701010070760002053677777737773737777777717777777077777777777777777777777775307077560210110717617167761615314172776707761670717271610707671507014252572572570500740700434300707161677677770107001671737373773777773773771677777717171771777777757775357777777525252105060601671616170105204216357071770101034725777777771060701610777777777252070307077700071616177777777770707707373777777777777777777373777777777777177777777777777070777777777770707171777777777777773573577777777777777773577777777777717770777777777775257770434000000000000000000000105000000000000E1AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(4,'Dairy Products','Cheeses',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000777777777777775773775737773773777777577777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777173434716174361735707353436571717377235700007777777737777737777737653777757377177737537537777777777777777777777777777777777777777777747657252103060206042434777777777777777777777777735777375374361705253432163617075727777777737777777737777777777777757775777773573777777777777777777777777777777777777777772524141210000040604004000000000004061677777777777777177763534736175370773527577757777737577777777773777773757717717717717373737771777777777777777777777777777777777777777777127052430200400604200000000000000000000000000077777777777771776773717237077052707271735735677377737357775773577737777777777777757753777777777777777777777777777777777777775251076502410040600600000000000000000000000000000000000007777777777171756757577307371717076734737177777777777773577777777377777777777777777777777777777777777777777777777777777777676107412042000000000004000000000000000000000000000000000077777777773773637075352525617357737576177357777357777737577777775371735737777777777777777777777777777777777777561600000016700604004004004000000000000000000000000000000000000000000777777777177777377677773765725772737777777777737777777357357377777777777777777777777777777777777777777776536177777777650060000000000000404000000000000000000000000000000000000000077777777757377671717075377777577573777377777777777777777777777777777777777777777777777777777777777777172577777777717777040040000200000202004004000000000000000000000000000000000000777777375775777777727171777373577777777777777777777777777777777777777777777777777777777777777777567537775767775600247142006040404040404000000000000000000000000000000000000000000077777777737370707567677774772777777777777777777777777777777777777777777777777777777777777757572536577727757700000164250400000000000000000000000000000000000000000000000000000000007777373775673773717353773577777777777777777777777777777777777777777777777777777777777756376357616767577777700000025020000000000000000000000000000000000000000000000000000000000007777777777174347777775352717777777777777777777777777777777777777777777777777777777777374357635737576167061652007560400000000000000000004020000000000000000000000000000000000000000777757377737716177767757777777777777777777777777777777777777777777777777777777777765374357434777077752161257003434246040000400400000000404004000400000000000000000000000000000000477377347563777071737377777777777777777777777777777777777777777777777777777777775161434243652527777756140007403400004204000000000000000000200200024040000000000000000000000000000377757737356177777756777777777777777777777777777777777777777777777777777777761636342707165256775777777777777000000000425200000040000000040040400402004000000000000000000000000000077373525617271617735377777777777777777777777777777777777777777777777777771775414340564167014707777777343576100000000004752440004000400000000000004204240000000000000000000000000077567773615777725777777777777777777777777777777777777777777777777777777770736340703167047025200777757202172507060000000652060004000400404004004000000040004000000000000000000000077352353634371737177777777777777777777777777777777777777777777777777777670504250746014304004043434275710050725100000000047004000000000000000000404000200000000000000000000000000077775743537477476777777777777777777777777777777777777777777777777777071072435274212420424200240041427060030052473400000000420000000000000000000000404040000400000000000000000000077172353653717353777777777777777777777777777777777777777777777777177477043425010410400004040043607404140061253043612000000040640000000000000000000000040400240400000000000000000176775253777777777777777777777777777777777777777777777777777777776537043471724202420424003043405607024240040243043416100000000060000000000000000000000000240000000000000000000000735077253434353577777777777777777777777777777777777777777777777773467743424014040040000604306521604000000000000100216034000000042500000000000000000000040004000000000000000000000527014343537072777777777777777777777777777777777777777777777770743535360500606034034070434702040000000040040042410501434020000000656504000004000000000004020400000000000000000003714363527707357777777777777777777777777777777777777777777777775347765160610014024072452400504042000400000000000200203030506000000000616160000000000000000400000000000000000000001634107107717777777777377737777777777777777777777777777777577767347724100424204070452521602002004000000000000040004000030314700000000042470040000000000000604000000000000000000061527077316703777777777777777777777777777777777777777777773752577716524612500563472524040040404000000000000000004000404004212520000000000047002400000000000421400004000000000000172016125613757777777777777777777777777777777777777777777765677741607521040256056152434306120102040000000000000000000000000040357340000000000650040000000000060000000000000000000705253573757277777777777777777777777777777777777777777775371777760524747025617256250004404464040000000000000000000000000000000000716707000000065242040000004074000040000000000000725363757257777777777777777777777777777777777777777777765671671702503244707657050656125212120350000000000000000000000000000000000001616520001060546006000002070400000000000000070707577277777777777777777777777777777777777777777777777371677564652645217771616070216525674774301000000000000000000000000000000000700712107700112034610000040470000000000000000170707257753777777777777777777777777777777777777777777776565352535214120747774343417470753537531000010000000000000000000000000000000070041650030677400046000253640000000000000007070737773777777777777777777777777777777777777777777777717374240607420547356534343743773676573000000000100000000000000000000000000000057252121013577777000040643740000000000000007071757777777777777777777777777777777777777777777777777656534343416520347736747343743571777741010000000001000000000000000000000000000217010000203177777742041677740000000000000725242737537777777777777777777777777777777777777777777753737470042430476770571734775376777177300000100000000000000000000000000000000034161001210102777777750000567704000000000003525375776777777777777777777777777777777777777777777777765743004341043177177365777167571677770000000010010000100100000000000000000000003002100010617777777600600000425600000000056102527377177777777777777777777777777777777777777777775363742524242147576525365777772773576710100100000001000000010000000000000000000000100210211037777777007000000000424000001200614357176177777777777777777777777777777777777777777775752542505252167537565372573577577357300000000000000000000000000000000000000000000010010201077777770077000000000000000025300020216177777777777777777777777777777777777777777777727772142525042536743534757777772777774100000001000001010000000100000000000000000000001210121777777700000000000700000000704034175777737777777777777777777777773777777777777777777577054252420356771776777273477777477710010010000000000001000000001000000000000000000000012107777777400000000000000000434303403434341577777777777777777777777777753777777777777777077025241504252563575257577775777177300000000000010000000010000000001000000000000000000001217777770000000000000000000000701612537363777777737773777777777777777777777777777777777167061626143473576377727573777777747100000010010000000000000000000000100000000000000000000357777770000000000000000000000761612535777777777777777777377777777777777777777777777776714161416007076175673572747377777730001000000000000100000000100001000001010000000000000000277777000000000000000000000000170777763777737357353757357777777777777777777777777777753422507241707716437757757775757777500000100000000000010000000000000000000001012400000000000021776000000000000000000000006707343575777777777777377777777777777777777777777777777767450615242506717653672771777377737010000000000010000000100000000000001000000001000000000000404070000000024000004000000016107777377357777777777777777777777777777777777777777777173070625042516705657757767167575770000000100010000000000000000000000000010000001010000000000000040100000176000377000770352525347777777777777777777777777777777777777777777777777656071425252435635270777777772777710010000000000000100000000011000000000000100000000000000000040252400007610004740007077602537737777777777777777777777777777777777777777307757775307406160043463527577757753577707000000000000000000000000000010000000000000010000001000000000025240000007000037000007761757777757777777777777777777777777777777777777774716773776502534165241756752707677767757770000000000000010000000000000010000000000000000010001001200061420000000000000000000003161207052777777777777777777777777777777777777377717617747777702436125260743657753777777257730102100001000000000000000000000000000000000000000001001000061400000000000000002506061657127052777777777777777777777777777777777775770777065707776561405601416165252765777577777100010000000000000000000000000000000000000000000010000102567060000000001773774352100001206107357777777777777777777777777777777177777073701752756177347360560605257653563477777070000100000000000000000000000001100000000000000001001010216100000000000606043437777777777535771677777777777777777777777777777777777775777720253617056704076161425241652577736577710100010000000000100000000000000000000000000000000000001636160000000000000000000424343437763071777777777777777777777777777177777777721747570257077717725036163425243652525777777700010001001000100000000000000000000000000000000000000101404000000000000000000000000000001757277777777577577577777777777777777735773577737051207430653524507041425241616525074743101000000000000000000000000000000000000000000000000010202020600000000000000000000000007477375777777773773737377777777777777775773576777752025070161347770240724340160652567371773300101001000000000000000000000000000000000000000010001040040000700000000000000000000077767777777577777777777377777777777737777777717161743507076146161657070524176050065256563673730000000010000100000000000000000000000000000000001002040075017700003740000020000077772507777773777773573757777777777735777737777007007342100170352573657070524016070024343571733733210100001000000000000000000000000000000000000001000077760077200007600000750000743756173777777773777357373777777735777777765307701635250610616070052725242525607043410706074773773610010000000000000000000000000000000000000100000777777700774000177000017600077774216775777777777737735357777777773777707534160060070521061001725250577752520140707060407434373333321000001001000000000000000000000000000000010137777770007700006770000777005777425621777773737777717373737777777743777777034177171030060125614165252552752576034043470702434277773732301000000000001000000000000000000000000000377777770017200017700003770027777001567377775773537351717537777777705053770436143434070104030612101612416070757434343434707056173773737321210000000000000000000000000000000101007777777430000000035700007761657777023057737736153434370703777777753027777072534341603436737410707061613611616252524340610707256173773737361000100100000000000000000001000000000177777777000000000000000075425367700456375773717273537073171777777361417777050616030141410041271527170040065255352534161460525024377377373337312000000000100000000000000010000103777776740000000002020340702576770612734736157777577577174341777770521257772171616577273430034020142534352101207614216167376167534217337377737631210001000000000000000000000100377777777700000000000140000252753470434717717235377363777373771777770525277576507177775001412535160342100052405205214704175070177777777773337333733733000001000000010010000100007777777576700720000002102141652752430525637777777535757375775277770702525777773777717120302050767050104777253721610610212527416777777773777737773772733312100100010000001000003777777777770057400000056000200256341402527535377353773735777377774030050177677177777772514101200103777777775705050161241470412707777573777373773337337373733250010000010000010177777777767700272000000374000175770002016752777557671775777375775377470276717177777773712037400142057740217737727060041020003040775773777357373377737737372373333431010001010037777777765776105750000007770006027740012452777353353771737177777377737775357777777777657571763002100212710612410535161061434343000737777577777777337333737377373733332303003037777777777777576002700000007740305057730003052557677771777477717377775777777777777777757373070104104000417651251243420107072534000437775737717377377737773737333373736373373377777777775777727770371000000777000026777400006357353777176717353775777777537777771737777377740170000630000377025724103416000057052573775737777777535733773337373776373733337377777777777777477577000000000003770002517772000534727771777717777777777773777777777775717777571270030010750304161407100617070012006100777737753535737773777377737373337333773737777777777777777777777000000000000300142437740002437577177777717357353717777777777777777777773751734000007614300037707010074010401000703717773777737435353717373737377337733777777777777777777777767765200000000300030303474340107437777777777775735777777777717777777777753567721737000000037430070707352037421000125075761777177717737271737373737337731437777577777777777777777757700000000000000404043076120001747777777777777777777777777777777777777777730507430001000753401000006004143100340003773777537712771717535277373717531343777777777777777777777777774100000000100003034307410002567377777777777777777777777777777777777777771752013410025037700000100104002016070000001771737753757172713617116352733077317777777777777777577774777772016000006000007000743600012074777777777777777777777777777777777777771612052412410735700772000000030100010170100070775717371736173753737353711653107057777777777777777775777777750275000016000007000347000074377777777777777777777777777777777777375377775210241277727777050000000000000000700000375363743563537152317071253731357317377777777777777777777777777061760000770000770024370000035677777777777777777777777777777777177777771421434120500143417007006005000000001600017527357377353716375613535352534331707777777777777737777777777776174300007700034740535770003473777777777777777777777777777777777773534163503430752142100025001010206000000000003073717717535341735133573617353531743177777577777776577777775777700374000077700077702476710043657777777777777777777777777777777777577672507701617742104371020060000100100000000000707352712737371736532535343172521343777777777777777777777777777740770000777000777012577600143777777777777777777777777777777771737761743700161614100630407050107050610020102500017716353753525361713533533172531717117777377777777777577777777774300000000700007770607775004256777777777777777777777777777737777770017171700000030601750300216100210061412517211473471735377173534352570347153170707677775767777777777777777657730000000000000017270537760021617777777777777777777777777777777771710024361614000001700250757576014070121612745763771372573433053713753177132352171311774377777577777777777577777430000000000000005027060000525677777377777777777777777777775771671600015300031200000010003002016030052410417320177774173437577070712352117153070352707777777177777577777777777777420000000000000205007030000435777777777777777777777777777737777161001020502404116100700700351701403001243524177777537073713137171751357216357171351377777757767577775277777777770105000000000000125614000161637377777777777777777777777775777712716000012100300600610601617206060340704100617777777253535256517343136131735121214325777357677776776777757757757616720000000500002070200000027477777777777777777777777777377717050705000400100101010071610404101100120120701777773771617037313725307717251123717335167777777775737771777737677777007700000027000014070000025017777777777777777777777777777737773010300001242520002000000030300607740165100777777777771617147707135301717367510714325377777737737757777677777777777475600000077000030770000024247777777777777777777777777757777340200030301010143414003416500010161034020773777777777771707331352717375215313671635101777717577777775777577577777703677000001770000047740000107377777777777777777777777777737534100100000020030201021343212177060002503177775777777535770731475251617031736161101016367777777657777277777777771777077340000077700000375200016074777777777777777777777777777777730000010001010001021000153534317173412147717777777777737771073031631617070517036373614177777777774775761777776775770054300000377600007777000250077777777777777777777777777775735701000001000001001003012153535637173577357777373777377777777071611613435272035014010337777717717777777777734777777770200000000777001007770001607077777777777777777777777777377773000100000010000000100017013531353572717737177775777771777717161631611201017037737775777777677777777537775773577777061000000000000020077700007007777777777777777777777777775773500000010010000010010001213343175727353773577757777377177777776173052163577777777777777777775347753777657777777776776100000000001070000024000700777777777777777777777777777773777000100000000010010001001715317031717757177173737375777777777712141253577373775737777277777777737675777776375777717716000000010020000030521430601477777777777777777777777777775373100000000010000000000121303535371713737177357575773735777777752173773777777737777775777777777577777577177776717777616000000200001210002402417423777777777777777777777777753777700000000100000000010000116152135073752577356737373775737777777777353777357377777573777777777776357276377777777777777017000010000024000052503402547777777777777777777777777777770100100100000000010001010311313437305317125373567175733477777777777771717735777777757777777777357777775777707757677706774000670001434005200342704377777577777777777777777777771734000000000000100000000035230533111735737737173537737577777777777777777737777777777777777777757707757777657777737577707770001775020777205274305216777737735377777777777777735777130000000000100000010000111531417251235017153537525737137777777777777777717777777777717777777777777771617777777577777052770027767403775600774704257577777777777777777777777773777000100001000000000000103030121301375137352370713737537577777777777777777777777777777777777777765727777777775367777770775216177703477761657770705237737777777777777777777777775301000010000000000000000013517171717013615357173757717343777777777777777777777777777777777773777537577777771777777777616563407777442577524377707027777771777777777777777777717373500000000000000100001001312303112317351361307153313717177777777777777777777777777777777777757777777777775777777717777012142147772106776106776524147777777777777777777777777774352101200000000000000000000111116116112351353533747717335377777777777777777777757777777717777777777777757777767777777756042142052142507706107770707071777777777777777777777777317016161100100000000000000016125213513515361353453313635707777777777777777777777777777777777777777777777777777777577777734304343252052052050617070607777777777777777777777777101521613016134301000000000001713531701212121116171335757171357777777777777777777777777777177777773577777777777775777777777400434344047025205261602434167777717637717777777777777702503507107010521210300000035371161735753534312134530317353777777777777777777777777777777675777777777777777777777777777770703434034307504361420410706177777777577771637777777777753503016107030505250103000071673535331361735717133517107103777777777777777777777777777777373757777777777777777777777777770600616034202704161430612506717677773777777577777777777777775210703503031216101717171163525677171723527507343712577777777777777777777777777773577777777757777777777777777777777401771616005614306025070416017777777777777777777777777777777777771410307041610777777777717171103525357353735371717777777777777777777737777753777757777777777777774777777777777776167760414777070615706003601677777777777777377777717777777777777777774101301777777777777777777771717015253437161777777777777777777775777777777577375773773777777777777777774777702570772430776061427741605261777735371777757777777777777777777777777777761777777777777777777777777777771717107127777777777777777771777777777777377737777777777777777777777777777742400412477775243477341615067777777537173777777777777777777777777777777777777777777777777777777777777777777717577777777777777777777717577777735677777577777777777777777777777777053761610077705243777600260135377703677777737777777777777777777777777777777777777777777777777777777777777777777753757777777777777777773777777773537777752577777777777777777777740276160607770425257740165016777577753177777577777777777777777777777777777777777777777777777777777777777777777777777777777777777777676777777777777757772777777777777777777777777705070501607721605277342032407703777777377773537777777777777777777777777777777777777777777777777777777777777777777777777777777777753535677277775773771753617777777777777777777777200020601400401240160104052777757777771437777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777773535757377777777075777777777777777777777774343430703430705216070612410777777777773777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777377777777707377777777777777777777777700040040240060420400000007067777000000000000000000000105000000000000D6AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(5,'Grains/Cereals','Breads, crackers, pasta, and cereal',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000777777740043734074373737370737777043707777777777777743777777777000534040673577777500740000400050040042500000777770004217073737373773777730040407073377307373725000043374053000003737373777377604074377777347737377047637777777777777547777777777400750250573177777505350700050000000040004000577770404033773737373773370400040407071214377373736100372000073777777777777377704404427437307377777734341777757777757477077577777771040075000777577777040614340000000040000000003777700007773737737737377040040000007061637373773536173040004003737737373737520404040453774777737373777777767777777777705777777777770004770477737777770051004100000000000000000047777700737373773773737200004004040407173737377373737340004000777777777777736440406404247073737777777737777577777777745761777777777750017770777537777750065000000014000000001040005777733737373773373771604004004000063773773737373730000004040737373737737700406040604007777773737737777777757777777770742777757757777777757777577777601734000000213000000040004167777763737373773773021400004004005373737373737373400404000007777777773753652444040404737373777777777767567777777753475757777377774077777077713777771561410504351750000000000000017771000437373772007003040000400737373737373377240040000040473737373776345340042440573777777377377777577777777777767527077357777717737775775777777770140040037077100000000000040477770703373772253733704304000071637737373737603104000404000777777773617370744044043777373777777777777775777777777577757477737777717777777737177777740000005753176001000000000000077710007373351273773334304037361603737773773506000400000407373373653773773734040772365777373777777777777777757777756770577577777705776177777577777005000127357710040000000000400077705011340361433071214015730001061733770003717000040000377777765343763770704077344032737777777777777777777777777775752777377771377704777737777773001057517375000000000000000007777001340004373737370033723710360273773173733733434004037373640436777377070773734537477777777777777777777777765777525257777777175754007775717777740070030777700000000000000050477775377310000073773207373376004005336036007256352000033507765060470737737707377772407073777777777777777777775775767775417577777737600017737117777101400573777000000005000000000007734170771371052371337373337010033404017373337253434372040430440475617707777737352507775277777777777777757777775775637777777777771404077777357777003537157700000000000000004340007734351005021050077373777373773700004007177373003737370060440440427603737373777777773465657777777777777777777777565547777777757770000077717777775007167375000000000000000000100577515335701507130036373333373340040400436334307773735300440040060471777777777377373746175767777777777777777777777716377357774277040417773777777710731717700000000000500000040000750072571173053711001067777324000000400435430773373723440444044040463737377377377743475677777777777777777777775375657757777714074000617753537777715731775000000000000000000140006734150163413041405031100337004040400400423077377737373040040044041777777377777737443475657757777777775777777567477777777777737434005747777777777777777701000000000000000000000017737350141741030017521110100000000400400437337373737374044444040773737377737377761674367767777777777777775656757777777777777400405521077371777777777771000000000500400000041043775775214170171413710052177111040400440053737737373737340040004376377777737777752574577575757777777777777777771777777777777753540436040777577777777777100502500000000000000104167527101507006121477105010713040000040007377373737373716444074407354241737737372777772567767777777777775777757565775777777777770714054050777357177777777010050050000001000004707573517040350514140717010711771310040040737337373737376300004016777365347737777573737777565777777777777777777767777777777777777777707016177377373535777770500160004014040000015707777071357300717152503537700103610000337024253737373014074407737374074327771636777777777777777777777777775777577777777777777775353757757657777753777777710143505000000000000420077505357314141361050341510153533000707700500273737043233016773777734004776167717777777777777777777777777777577757777777777777777777777735704777735777777052050000056100000000504573417215614170516135170077352700373373042125377352373577737773737737773534407777777777777777777777777777777777757777777777777777717777407707777737777701050000400014000000050030753751701016153050434037135310137377352104037304250732373777777737737772404406572777777777777777777777775777777777777577777777777777777045177777537777701000500050400073040070577053653507317053171714177534316373373734317304000303737773773737773772444061652775777777777777777777777777777777777777677777777777777775067577377777771070050014000077141017500773141250714705257371304712411017377733637724000404343717777777777377040407440657777777777777777777777777777757777777775777777777771777770572777777777771052500400007104040470077714105073531505346525035353104313523773370004040000340273733737377174042443470747777777777777777777777777777777757777777777777777777777770571771777777770014300007314000010140534107014143560734110505107173117703161137004000004040301777777777776377440641474377777777777777777777777777777777777775707777777777777777777765777777777710014005054000000404007717053430501141416350167125776143535377100000404000040773737737371616525341464077777777777777777777777777777777777777776577773777777777777704077735777777771401420000000000000771752140410716100715371711507010000705734340040000400033377777777563773736442537777777777777777777777777777777777775757717477777577777777777507105777777777700040500004004005271456105313410415351040507170100571050143410024000400017377737371736173777753544777577777777777777777777777777777577677657743477773777777777777057604353553777040170500000000005473116535441710430701313507173100071016110037100400403736337777760416773737763777777257777777777777777777777777777775777756543577777777777777777075070402741470004070400007504071457717731061770415061701161775014014017340336030000370034271730406635377761777377347777777777777777777777777777777777757777756777777777777777777743040057121741405000005500007700370571414141051734140534135301731421410037713005377003001760440440576527377777777777777777777777777777777777777777757777561635777775777777777704354100177717353400050520070577144007061735305301531073417770141040143000000347733330040020406044042437757777777777777777777777777777777777777777777777777775777777737777777777507377770377757771004377750525305335711507535377042561717101710350140053053100003777610040340444004040407377777777777777777777777777777777777777775777777575775657777777777777771777777777577737774005770061775254177721703405171010141712500404250143750414000100037361353044044424404777737777777777757777777777777777777777777777777777777777377777777777777777757171737353577700376107577771034351570514176053416077141301001104141000001004000737373204004400440563777773777777777777777777777777777777777777777777775657757777777177777777740257777577677377357414773777777514043052412511241710535035101070004100711250031003737204044420444243777377777777777777777777777777777777777777777777757777767757777777577777777055614016141014014707617571777777717107113414341530417101430417171300001071351410173714000400472405773767777777777777777777777777777777777777777777777777757577777777773577777770061616140164400071417773531743777777577414341041410716101410000471711400050031007373210400444041773743527377777777777777777777777777777777777777777777777777747577777777777777147141450706100165065675353435357077777701617134301570510700005710040043115004140002405200072407773774256577777777777777777777577777777777777777777777777577775777677777777777770434343070414147707173537753777717177777775353410467313050100053050010000401000015013303504041773777375616177777777777777777777777777777777777777777777777775777757777777777777750541404050404165047171653717777777753537777771711107507170521414070140100007100030077372007773777377737777774257777777777777777775737777777777777777777777777757757777777777777070043434252177165377531353717777777777571777777777173516530570101050101710417104103307353073777377737777776174767777777777577775777577777777777777777777777777777775753771771777057041405057416717171775353357777777777777174765777170253501071404340561013710000073733200777377737777372416477777777777773771777777777777777777777777777777777757777777775067774707143077257771777077137714777777777777777735173477535140407400101000104050000005343250177377737777377454657575777777777577773777177577777777777777777777777777775777475707575735707354145735371717357717371777777771734777777753507777311403140540505010000010002143027377737773777773652477676577777737777575777777777577777777777777777777777777577725707725675747777377775377717353715377737775775735775777777717174001571003100005610007710402007737737773777356165257747577777777757357773535777777777777777777777777777777777757577757575377571311177777761757357731177577173777771777777777777717161035040530001710510000053733737773777376737777756777777777757777777357777777177777777777777777777777777777777777777737753361037717171177335371107777737775357777777173777777717537571001041140040004000377373773777377717773777775777777777777577375371777777777773777777777777777777777777777777775771375113117717177175735737717777577777717777777571756571607573431405040000110000172137373777377436727777777777777777777737357775357357771777757777777777777777777777777777573737771133513137777177375734117371737717371717777777777717505170541401210171043500036373637377377700453577777777777777777777757777334357777777571771777757377775377777577377777357535177152103577777717537537701777571775777735777777777707352052070535050404173037100003737377430464367737777777777777777775737715153717717773777777777775777777577377777573571713117310311313735371773753771177777377537353077777777777775757715000143100130103724000073737700440404407777777777777777777737717734357777753571771753535371717777777537753777370171301711311017771717171717537357177537757775352577777771776717771571077300510733100700303720464040604745777777777777777777757771735353573753171773777735377777537177753751775373015311210313117777377777713517777177537371735352567777777717750773700571412513772300007340040404404524277777777777777777775377573537777357375357177771717535773757777353777531117131731533010717775717117752713777777757577137153177077777777104144353000751273373533700000040640460475777777777777777777777537357717535771521737573535353773775353577771753371713073503151137771731753771371477735375373717712714717577577777310000411410303737373360000004404140474377777777777777777777177757717537773173171717171716171757731073775377357130371753710370177775777375377173175777371757713717717052537177777771110061041737373360404000040466340477767777777777777777777717777737153577177175777713531071717771171775317357171171717711310777737175375317171371757573717717537777050547535777777710171103737375300004000140475253777577777777777777777771777753537777357717735371713171173753537771335757317173303711310117777777377175737177777737757770531773777770107677777525752570373737020000000406340527777777777777777777777777175777371753535371353537573017017315373753177573731713511535370311377777535717733531257353577773137373047377377771505043504005017737200105004000075257777777777777777777777777777173575716357771775353753153717171731353737173757171713033531110301777777777735753571377777753757535350004377377777777140105300373610373320000400527737737777777777477777777777757177773515353571371713773717113035775357173577353537171531437111177777777177737713175353537757337535314000377341273777361005343243043343734000037777777777777777577765777777777735717773617777375373757753535301537135317537317131717131353173031777777777717753716377777753735753530704044204377777377777735004004337333000373737737777777777476757577677777771773757771573717317571737373130121717531713753531053530107317513107777717771775353535377757373571373531000003537373737737773400000437432700137343777777777777777756767775777777775757377573577757137377575173511535313531253713413103113115313711377777771717737717375777375753775173530404043737373773773640040400003352177373377777737777777777757576777777777777357773537777357175173735013301317130313535713177117103710353217777777777717535717377777773775377171700017373737373373730040000404040012337373377777777777777777767757777777777775735353507517317777171373515311717115153530353533503111035211177777777773777731717777577777537534371007327373737377342504004040000037373736373737777777777777777757777777777775773577371731371775317177111321703130312135351313571313503531317777777777757377177777777371713717371521720500737373730301600400004003737373737377777777277777777777777777777777773577357535171701735777177771511353510116171310112131103111353135777777777377177717777777777757735173173700300373732161733400004007773737373373777773747477777777777777777777777773717353735301717317777177373771313135317171731717171313071301735377777777577377777777757777371735341373004003725240372733704002120063737373730777244345657777777777777777777777575775757134353715777777777177171617101137371121130131015353137777757777777775777777777777177535121737214001730000127337340003737003003737730003747434727777777777777777777777777737537371711135773777777717537171711312577133513713171331330757357377777777777777777777777753103571733733732040040613730034373500404373732013344346454750747777777777777777777777537575353716135356177753773535313035111352513711711350171117377377377377777777777777717153737171333773737040000000343430733736300003372000272434707256776777777777777777775777777537377717317125310177771535371715137305313153713712135330707537175775737373777777777737357577357773373700000000040000737773737030370040000336454745614757777777777777777767777777757535735711535317717073537011313411137171211351353531175353757737377757777777777777775737317333377370000404000000733733373733770004004037307257165677777777777777777777574777775373537571373130171711353751371371373571315353125313713537777373757737775753753777777773775773777307000400000400537377377377370004000000000745677725777775777777777777777777777777573537377177517170535353131071511053534331353535710172571357753717577373773777577577675033373337030710000000021237337337337000000404004007165747777777777777777777777777757777777777535777173135133531353571123713353135530353137313573767353777773777753577537437737070073777003733250040021373737737377316000000004000377727377777777777777777777777777777777775353537757171733513175271317151351357133535317111777171717775353777577777737773535753007340030733437300003724000323737300401600000000037747777777777777777757577777777777777777177777717737175351343531152531337135373171313535373707771771737777773717371717177737377733000030373730073771000007373702533121000040613737377777777777777777676777777777777777777737717517757125371353171353515113435353535353313571771770775653537577775777377171657173573400437233070373270000037342503363707000031343077777777777777776757575777777777777777775757737717777135357353171312312513133537173171703471771771637777777753737175377173377173773500005030373373303407340002527373000121720000777777777777777675676767577777777777777777777571717717107135352171715353710513113177161771347167171753537537375757377137757176170773700030737373737373300000043713250727372004007777777777777777567757576777777777777777771753773771731713535317073537131131251347537177175737717777377757777572735717771737717735357340373737373737304000040000605233737215000277777777777777777756776577777777777777777777777771717471753537531153513516113161337567177637571707175717736173757563707173535217537717170737373737376000400004000303773737321211777707777777777777756577777777777777777777537175775313531317777773533752137153175773574175737371717377777577577353575352527535737537763737373737373300000004000007733773737373607777777767777777777777777777777777777777777777777777531775777535313571317113317177577377537575670716177777352537777165753517172516153535717337377034014000400005733773373737300007777734347777777777777777777777777777777777577171753175713773771757173531735777777375734347371171617617575777757016133134361615217277173752737303703000400002733377337733734000777775674756777777777777777777777777777777777777773775303753757171377177171777717175775775174777071717763777534357715756717535125017137343737021633737300404310242337733470000007734241434757777777777777777777775777777777777777753777153757317775353353777777777777735734371771617717577773577357020115213434171257417353535001733730700037700004337733032420075676564743647777777777777777777477777777777777757775717717125777735353777757775752535767577576171771773717777147707152527571007055213735373730061673700373730000033610403713100241450470745357777777777777565747777777777777777775373771753537177173777753777773777776117717717707077175775707370535211357000505321756171617050033030377373600005340002372372006564773464767777777777777777767775675777777777777777753573717537177777575775777777534157434717757717167737737757173531525353410125570716135317304043437737373735320000405373310150473775341777777777777777775747675477777777777777777773573737577777577025677777577777353534357375777175775771616516503134353434121534357434315300073733737333734000400020342063773477434777777677777777777777757477777777777777777567777757777777777707571775777757525257357075776177737177141753713040535251000572515235315235173737773737770000000040004017333775773777777477777777777777770743777777777777777777756577775777577777753675777577737753525707777717753757734004005340017253505035251637512521163033733373733120004000004033337777437477773773717775777777777777777775777777777777777777657777577777757775777777357753747734100775701657370400005341153415343005071071410710507115063777373560000000040000377733773737777777777777670747777777777777727777777777777777757777777777777775771435777757775357534175377751774340000007342161617141000570161710712527031003373712134000000001373323737477773777777777741674777777777777777757777747777777777777777777577777777777777577377177735716107577377775100000014105141707107000000101071351117140377250073733000000360307373737777777777777761765453437577777777777777765777777777777777777777757777775777777775756717563475777657717534000004770506170716500100014303125306736037000007372730000173000003373773777777377777560563647467777377777777777536577777777777777777777777757777575777777735763753535717347777400100001536514175010140505211141507510517340040437373730033270000037207777737777773636561441641773777777777736464756577777777777777777777777777777777777775771757777770755353537500404167536170177710100005250003103712500040000043700037731300003000077777773777747573464344377777777777736753574356747777777777777777575677777777777775377077777577775277747743452525353516156150741410001000304341250040004040000737732736331200000737743777737737377504437563477777774757746065670777777777777775657677757775254777777717717357757535705371757341757765251617275100040000100517165000004000004373773373733120000007773743737707777703737776173437777777737357561477777777777777777775757675777734757777737757776376777775777357350717175071757524050100100052050100404000004006377377373372000000043770377604737377747737374467777370737777725477777777777777777775677675777757770757174757753575357717725257657756756177161613531214015000050040003304004003717337373377000000000743777704061677343737777737173706577777774773773775377777777777777565777777775777277731343777774735771757705770735717056140561405001700041000005373030403720727737377300200000000377700404043714377777373777744656277373737777774767777777777777777777777777777575757574315777173577775075773577571653535257170500534001100400337340003171000013773720031000000077707440442404277737377777340614045077747737777773577775777777777777777777777777777777535777777577765777373477537775256525507414341710406500016737370737234040273370177273040000700406160040405377777377377704607064343777777773777774725677777777777777777777777577536525735771077561775753567525775375707143705376501010400030400373737300007340060335370014137440604454040737737377737434740544144777377773777736161475757777777777777777773777777753416567167707176576757357577777525716141735710040400040403777373737737704004075737203633606160100600437673777773563434042424637377737777777456576706777777777777777777475777777777771714141414753571775737252777571657177525705040004000737337373773340000000020201737373604437340443700047373772537737404417477777773773617252414750777777777777767477767677777777777777777770777774165475757773477377470521400004000433737737737374004040404070737373730100737003737070027742563737717707737070737777477777756740777777777777777757475757077777777777777777574757777737773774161037373073773160000537527737373770034000040000073737373737347700737734043770406177734707373742563773743737371614377072777777777375253434257777777777777770707070737737773777352407740407073237000343600000377361073434004040717373737373737077737373737370000404361773777777356177044377777777777777757777777777777747475777777777777777474565654657777777737373700000007373703173373000037302527373300400030233737373737700000000000000000000000105000000000000E5AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(6,'Meat/Poultry','Prepared meats',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000733431247777777777777777777777777777777777777777777777777777777777777777777777772577777777777777777777777775677750043507777777717677777776343737737172736373635337373373727300002407477737777377377777777777777777777777777777777777777777777777777777777777777777777777777777777776767777677777775247757777776775761707373737237372737173717377373777363737733477777777777777777777777773777777777777777777777777777777777777777777777777377777777774777777377777777776777767677760104357777775673372737373737737373737373737337373337173732407777377777777777777777777777777777777777777777777777777777777777777777773777524000000000000004165777777777777777527750435677777773734737371737373173737373727372736334737337377777777777777737777773777777777777777777777777777777777777777777777777736140000000000000000000000000040507777777777777770041757777777733737273637376373736373737373713733737637777377777777777777777777777777777777777777777777777777777777777777777734000000000001404160746740040000000040657777777777775241677777377737373737373373727377373737353773737237377777777777777777777777777777777777777777777777777777777777777777735210000000044767773777577353777777652040000043777777777774161577777737725373735367373737317371737233373737737377777777777773777777777777377777377777777777777777777777777774371600000006177737534247043414747416171777737000004077777777770043777777773737373737337371737736372737776373733737777777777777777777377773777777777777777777777777777777777756370700000004577616506461407404740043406060407437760000005777777775241777777373737363737737373633737373733335273573737777777777777777777777777777737777777777777777777777777312777700000407773052507005040400000040040414052525041775340000537777775340777777773727373731737373773737373757337373637777777777777777737777777777777777777777777777777777753434777000000077757047040404004000400040004000404040406524177704000477777774177077777377353772773637373373737373237737373733777777777777777777757777777777777777777777777777437243772500000477725242404000400000000040000000000000400050412407772000057777777407477777737373337337363736537343737773373737377777737773777777777377777777777777777777777775373607346750000047750404140004000004000400000400004000000004040443400577700007777777001477777737277737737353733637373733377363734377777777777777777777777777777777777777777176372577747770000077725257040404004004000600606070745424040040000000400561617700004777777403777737737337337173737737373727771325373737737777777777377777777777777777777777763617253476347370000067745040400000000406574757577577577777577777704000000040040407770001777777754777777737537727372733737373733367373657477777777777777757777777777777777777535375361767356776000047710343400040042456535377777773752713637777757774000000004043430770004777777037777773773633737373773737337177735657727377777777777777777577777777777773537270365763565252710040775644040040042457373765725730577757757577577777777640004000040450776000777777414777777373773737373172527536725727373577777777777777773777777777777373436071675364743363770000077205340040006577707161775735476177343777373776773777740000004000434170400777777434777777373373737363733736717737776563477777777777777777777777770325253437767164733256577400047705404000004753520712577073527717707775252572537575775774000000040042573001777777057777777777373525737747773770771737373777777777777777777777352137563767743706733565777700007714742000407573672171657617161753770773537357357757777777776000004004050774000777777077777373716373737743737167077273434777777777777777777737716376562570752743712567776776000477600144000256171353435753707167370753073435257743727737777577400000004250376007777777007777773737477773776577737717773737777777777777777750730707077576772703725777747776700007705640000057177071253437617343572534771717077717353531653737777700000040040577005777777757777777773716577373727537772377733777777777377301273472777616312171774777567677770000770561040004347712165617561340177353473563435752717073431307171777400000004340370007777777077777777777673635365373673757773777777737163434767747374161631676765677667747776000077524004000534712161731347317037725347172153772710725343574716167177500000404004770007777777517777777773777777737737377337377377777727073777706347436373477777767675767776570007700534000004716774352164357075053534363717257713770125352131616107037600000000700770057777777657777777777577737377737377737375337164177474617716303434767675675675767577437000077564040400034353316171356371237773057170717717703073527074777777777757700000050601740077777777727775757477777737377377737737377727077607273630716777777577567767676747237760007702014000004770774317070757071407307277353653631717143577777777577777774000004041403700577777737575777777737577777377163763576374177670734307076657677676777676775370737461000570655600000061177130707165217121770775317075377143434377757317177775777770000000040477100777777777777777773753777737737771777735777601271616777777767477476767757363437073770007341600400004576174353160177707525371737613777316317177777357736134361677770000004161077007777777777777737170300777735673773737777670761677776776567777677776567347163477477000477041400000037716334343170537103525356535616357316167770537305070537171777770000000040077007777777777773507140500777773777777472731271777567475656776767727037352736752707630043707560400004547357435252077416343036373721775325217577072534373172534361757740000004340770047777777773052500100005777775617617357761677676777767777656350343761674775274731400074040000004056371753121735701735171715717177733535773713535215257053437173773700000404107700777777775705210434770007777773773777777777577476767777257316377341765770725321633041734304000000775772765343521763532070737677375343436570761253725217343107252577400000042407100777775210705070057750007777777777777777676767777652707306716407665361635325333700077054704000007525351734303525172553035253534737353577731743071717053167153173777500000141077005777775615250575257770007777777777777777477773435270724735673725326121633736173000734214000004756572737571613472573257125777273171257713430353521613707316361616176000040060530027777771614377725437741017777777777777767774347361437573467342530713373361337300067425400000401653715257303425357705302537717577617776161735252535241736534171737750000004106700577777777435477752577704777777777777777773337325277462567134312733727353373733400171443404000741745635217753524735737171637773713777717161435353431360512712073577700000004217300777777771603577743077700777777777777774346164775637572126127373633733273370733006721040000000747375735250717134731707031527565703757725363434361655372510717073077400004054075007777777775743477747077750777777777777337357736473402163713731733573537316333700017547040000051617436525377616571743717563577377775737170153537171325052070707147375000000001720077777777777051777705777005777777777776164625653343337373373273273233633737373004770605000004060471753752171770367125752317777537167771617637053436503735371737335700004007427100777777777777476577500777007777777777757735733252373731327337335337373523731734007701424000007147430743717071755707737357707777777771721613537073513752525252525777000000401437007777777777777053577614774047777777777625620707373361727336137337335333731723300037525004000007057717147677072705353434375735775775375717617073527703717173533521774000000400730077777777777777456777403770077777777775733737337353733731737327336336373723737300772434000000447675637717177153652757737073577777777737731743577170750707052503577000000402407500777777777777777251777147770177777777720703333613273363363733732533735233371730005705405000005357177170743416365351271577356377777771653565317217371273735271777704000000050532007777777777777775467776017740777777777737336173377317317331271373373333537323700067007244000004776574173577355734777172357375357775773763737635634375353435370777000000404002710477777777777777777147775077700777777773333337373337237337373363373072732717733700177141000004034717372532516375734352541257377773777777177535735735271617070777740000000025057000777777777777777776147774077704777777736177336374337336327337373273373373323173000716064040000473617577053617527757773375375307177777177737773734377173753777175000000000404330077777777777777777777077770577437777777337333713333631731733633137337317373737270043705500000004775776175301712557765357432525777777777737657257537707161677577770000004040033400777777777777777777774177770777077777777336363377373723733371372735732733631733320047406040000005723573077770353253177273573737177717777753735363753777771777303400000000050471007777777777777777777774077770777577777733713372336173732730373373323733613732737300017014204000025707170014774353043417753575777776777777777777577777777777774353000000040403700477777777777777777777775077743777777777363373173733371373737327373731733733733517000770605400000477716527021775707353771763736573535357777777777777757317777530740000040020070007777777777777777777777770577747777777373372336333536336132733533163363373363172270004350500004000571205710170120775735077170717253777771775777773707374775743070000000004507100477777777777777777777777770777773752536773177337363733737371633727337337343136175370005704244000000775207770052501030437177777777777567777777777757756177777352500000040400071007777777777777777777777777777777763777757336337137333713337333733737137123347436327570007705340040004375301772102161430525071717775363717777777777777777777352017400000002401700077777777777777777777777777734373577777777337723635363727127373731323612547323575716300053404044000004770707170014121043035377773537577777777577777777777775251700000000450070007777777777777777777777777370777577767727337133373337333733737300272561252361756363637400077007000000005771616570612525352527753777777777777177777777777771725364000004040007100677777777777777777777777534777776777353756723673353633773733030735073076777776777735773700437405604000004771610771701020353717677577777777577775777777777773537100004000404370007777777777777777777753736777777737257777773373372333730312163434261677353535737775777773400437005040040000771630777775753757617537475777757145735777777777777774000000400017000777777777777777777773775777777161757777767773353373733437256143737163534372737573777777777000570524140000045775771614361674217343563777777534735777777777777714000004040407710077777777777777716353653677753437776777767777372334330343704307234256352737353773757377377777000770416004000007777577777577535747773757377516043577757777577753400004000005370007777777777777777777777777772777777777777777773373336161720736714737357737537373777277777777777000572407404040007777775777777773731777374777753557577777777757741040000650427100077777777777777777777777473757777767776777767734334072525734716300077371737737353773735777777777400353416050000407777777775777777473475377753502537577777577777361040400407710047777777771657777777777777777777777777777775337336137252721630616737717673633437361773773777777777040770407060400057777777777757777753777575752757757777537717775004161400771004777735256161352535777777777767776777777353637474072725256163073733752773317173737737177377777777777000777054142400077777777777775717777777777175535777536575757534704142573100776150505001050041430375777777777777777257677777737253525236177173477771353737317131737377777777777777400177206414240047777777777777777757405147537777716553577777405256053700007150000000040041001414125377777777737177777777777725207337177372373773777353014307471657075373777777777424057516414340000577777777777777000065217575777616757177707074017770006500000000000010000100210525275777777777777572534333525737373337337377371301201637737373737725477577777777500077701654045042525743452540500400534577777775751777750474057770005010000000000100001050215050105177777777777763773737707333707377273773737525034373731737777771513707757777777740007774006524004000000000000000007507357577771777754707017370000100000000010000010100001000030712107577777777537377373737373736335370343533125373501434143113170755757657777777774004377500416504040434000000000043565737777742570525405775000040000000000000100000010140121411053503177777373773237373707373737336172777043731003471077756740010217717777777777777004137770416165240404040400400043575757775756164007773000141000000000000100010110010100501421052507177777773775737373737371725616252127530047741647077657777435005775757777777777400407773404054165210207040404247177777534004537771000460000000000000000000000001000010121143017107137737777373727373730636163735717753057777064704775357477706135777777777777777740000577771600404444540525041404757752407573752000447140000000010000000000101010011410416105710713577773737373737371671437170763653007004374014707764652574404431577777777777777777400001777773500000004040600000001757777740000477740000000100010012011000001001000121103530171053117777773737330631637436370343743704074774060565735656571606470757777777777777777774000041777777776716350747777777725000004477777400000000101010510010350101041034143501537171070737737773737671477073616177770340416007706560077440617764040435377777777777777777777440000004161753757775352507000000407777777700000010110121013013525201705103501210712507071171773773772731637212525777777075000610477040056775775776504746475777777777777777777777777404000000000000000000000404777777777770400101001201010701210111171013041035070351717127147777377173777077777777777770524041470775076005761474756765777677777777777777777777777777777765616442406146567477777777777777410010101010101010105112530172053171417155071717503177377737373212577777777777735004200420764054065767470757776577771777777777777777777777777777777777777577773577777777777777734010000101010000000000010035153101731713071352513543777737737377777777777777774360404041457704204074543474765677656577777777777777777777777777777777777473043547777777777777777410001010000000000000000001403016171071653161717752177737773637377777777777777735040004160077004702524246056565765656777777777777777777777777777777565173516170034173777777777771000100000000000000000000000105010001711317170735017737773737373777777777777777470040400070774000404004147677775777775777777777777777777777777777777777052710734537575777777777771014100000000000010001010000001061520343435353537017773777373777777777777777777354002404040770400474256157577777757347577777777777777777777777777777777150705010527771775777777775210100000010100001000001010001000140151435357153073773773723777777777777777777004040016016040040005057677757675775734717777777777777777777777775374347070034273417347777777777777530000000000010100010100201601014134303534307705374373173577777777777777777752400040640404004140524775775775777535553575777777777777777777777707535712016531750774737377577777777740001000101020014010011101125030411753411711077737567777777777777777777777712404040160404424240534175376175357563743525777777777757777777777000473417013400301717574577777777777775000300001010010014004004101413061071701077377777777777777777777777777777752400040525024141700434165757075347577577577777777777774777777770071403016701250077073737707575777777777700170500410010010101030521615171307777177757737773737777777777777777777300040000406502524141435716175717537573743757777777777777577777025420350011077006516174771777777777777777750010011041043016161052141034377777777767727777377777777777777777777777174246740440750050343570717521617757575757777775757577777777777503505000000734717217717577717777777777777777161000100105010105214377777577773777773777777563777777777777777777777014777777700050304101034161755705277777757777777777716377777777740300000401413714770737057735777777777777777777770716125252525777777777775777773777717373777777777777777777777777125777777570340102407537161617775417577777777777777757077777777104034000720407217714717365771757777777777777777777777737777777777717637737737757357777777777777777777777777763536535074752050014251716757173565777743757577777777777777535777756010010037053505771771657717677377777777777777737377377777777772536777777777757377777770777777777777777673717176777034347205007061125071307545773777775737777777777777777773777703400007041272125367165341773575777777777777737777777777773773777777377777377377777370777777777777775253747776776777735075703414104025347753731757357776577777775777777777757777410000171005714734177177743577767737777777777777777777777777777777377537367777677347777777777777673677657776773717074777714710034375373312301610307707577575777377777777777773773474040061730037716170773776177177577777777777777777777777737773775737777777673577777777777777777577577777253475677777767771067377337107351171310110713577777775777777777777757752100000173407750777077357717777737757777777777777777777777773777377777771735777777777777353673676772763617767767776776573425736530712730303601013031165375777777777777777777777605200716152570177716534777775177577777777777777777777377377577177777773777777777777777737777577777773757657777777776777571773533377731713101173011103125375777777777735777777777005721712073706136173525347767707737777777777777777777777773777777772577777777777375737777776777437477777677767677777776077373563167723010767753031101134377777777777777777777777701703417161177417761777177177077577577777777777737773773777777253777777777777775377775677777777777777677767777767717617725363353713111771110101410310135357777777757777777775770340147350167701673577707737777757737757777777737777775777677377777777777777277377777477177437776777767777777371716761771737135361774765213031713371431016777777757777777777777774034217236530777143761772577177377577777777777777777777735377777777777772737167767167337677777777767777767757677777343737037635330135771011101215073537353777777777777777777377377041605753053770757177752577757707777777777777777777737777777777777377375777777577737477776777777777707777677767675775277717325136127773012115301102114353777777777777777777777777353731257770177307771777073777777777777777777777377777777777777376377777677673725777777777777437777777777753717327537177735373517157741311210125311613077771777377777777537777735671477730077716571277717757777537777777777777777777777777773717357747777171765777677777777777776777770737363737577373637103016330371770121313530567101777567575777777773777377777167301677716377347571773437777757777777777777777777777377257677777773737777777777767777477777777773373437372733735253127353710534371353101017713533125777777677777777777777777777716771771617771737077577707777777777777777777777777774377777777677365777677777657377777777777353743733737173727773353530343773135161253531277030103527777777777777771777777777777717670777741677525723757771777777777777777777757353777777777717347776777777437371777777737257273737773737373577716303771717170121311727031731135312577777777777771777777777777777771771717377177773577377577777777777777777773727777775763527777777777777373707677777773477737373737336373737377331734770307353177163513177503031253777777777777177777777777777777777072777716177177057777777777777777777757377777777277177777777777732537347777727737777373737737637773727373343523131371307773477353703437313431477777777777125777777777777777777777570707777167777376177777777777777737377577777477377777777677637773657777735773477377777737373737373737367373561343071703477375301713101713167777777770125777777777777777777777777773752537171777177777777777775737777576777773757776777777735737577777347637777377737373567353737371737337373316131371173773537730353330350717776101577777777777777777777777773737775377776772577777777777753777747776777352777677777773437737677737776371777377773777773737373537373537735335731352536313572163531234117077771717777777777677777777777777777777777777716173757777777777773777777777737737777777767777377752777377761735777777733753737373736372736372733363730525373535273173173435137253677777777777753777777777777777767357777777767777577777777777753777767777767735677777777735377172757757725377777777773773773737373737373737373763731731125737331343152173727101057357777777753777737777777774377377737777737177777777777775637777777777737177777777777737736167777777361777777777773753773773727373737373737373373727352112521637336377353116167777777773637777777777377773777757777767527777777777777773737777777775370777767777671771707777777572343777777777775373777373253735373537353713735373736377250575350531710705617377377376177577777377776573577773777767737777777777777772777777776777377777777777777376377777773772357777777777777737773777377373727363727327363736373737337333016177161071737777776356177773737377775373776777776777717777777777777373771777777775377767776777775277717677773752177777777777777253637373377377373737373737737373737373737317373737074377777737252177377737777756717377777777774734377777777777777275271777747743767777777777776375347773770743777777777777716357375777377737377373737373733737373737073034725616527377434361617377733737773737373777777777373737777777777777773707377767767373777777777777712717277736577373777777777777713737737737377373777373737373737373737373737377773773773737773737373737773777737377777777777777777777777777777777773777777777777737777777777777373777777777773737777777777777373777777777777737000000000000000000000105000000000000A2AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(7,'Produce','Dried fruit and bean curd',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF0000000000000033273373337373373373172177765677143477212657777776567776777777747077777777777777777777757777754757777777777777777777377777777777777777777777377777777777777777102136770007770000373373373233373373372173613777767773617717725777776777777677777777771777777777777757777777707746757777777777777777777777777777777777777777777777737777777777777752412576706033277337317373737237337373303763470777675672730737677777677767777777777777777777777777775777740447575677777777777777777777777377777777777777777777777777777777777777771252637616373333733733373333733737337373137377565777574777271756777767776777777777777777777777757777706070047565477777777777777777777777777777777777777777777777777777777777777777701043777337733732737317373373233737337375236377276777617677374347777777676777777777777777577777777405771065772577777777777777777777777737777777777777777777777777777777777777777777300333733732733737237373173733737363373535275752777775367377774777777777777777777777577777777404177774065746577777777777777777777777777777737777737777777777777777777777377777777770733773773373373733273373773733373373733123375656767574737377767777777777777777777775777406546746750074756577777777777777777777777777777777777777777777777777777777777777777777773732333337337333737337333233377377373737734373777776777477737357777777777777577577777560654257757750475656577777777777777777777777777777777777777777777777777377777777777777777773777373732733773337333773737337333372733737343707777777616577737777777777777777777760475604047770640465756567777777777777777777777777777777377777777777777777777737777777777777333337333733733373737633373737337376373773737373770776777777777777777777777777777770045253404047475240434756152767777777777777777777777777777777377777777777777777777777737777777373337273373372373333737337237327337373373737377377717777777777777777577757757774040404645256561764571656747671374767777777777777777777777777777777777777777777377777777777777737333737337137337237373733733737373733737373737737737777777777777777777757777771404250041435614044406774475475277635177777777777777777777777777777777777777777777777737777777377337273337337237337337337273773737337373737373733737737737777777777777777777777642404040040404044000447770477465635267252477777777777777777777777777777777777737777777777777777773737373737337337317337337333733737373736373737773737737777777777777777577777741450404241000000007440777770475747475257353701777777777777777777777777777777777777777777777777777773333373337337337336337337733773373373737373733377373773777777777777577777704067000014104000000740067775740474747765624721676577777777777777777777777777777777777737777777377777373737363733733633737373733373337367373737377377737777377737777775777777770474757645650000000444005776563704657452777752567312047777777777777777777777777777777777773777777777773373337373273733373337333727372737337373737737737737377777777777777777774052474775347050100557000477757447750076544347772524677300677777777777777777777777777777377777777777777737367737373333737377337373737373737373737733737737777377377777777777777006440424675747446577604077774607446774476564342477717077731257777777777777777777777777777777777777777777337333337373733733337237337373373737373733773773737377777777577577777404704250450476400247400407777405440045704056547707047677404673025677777777777777777777777777777777777377777737377737373273363737373733737373737337377377377777737377777777777400474040405246750045404040757040640045426504674763736342567773447312107677777777777777777777777777777777777733333333737373373373337337373373373736737737377373737777777777777740045404040464144244343440577644044040060456714074454775256347477256256313077777777777777777777777777777777777377725213737377377373737273727372737337733737377377773777575777770004061604040564044047440777740040000444040444654565275677365267347356346243066377777777777777777777777777777773333737721235337333373733333737373737733773737737737377377777774004240474104340404004750775674074004140000040407706565477767537124765674716527135677777777777777777777777777777725217470773733733777333777773737373733377377373773777777577774004414043414004770040047777465047504070400004074757744656565777652532126167653652463150767777777777777777777777777737773773470723730337773333373737373777737377773777377777773400004647751000004740000467774164074000500000007404777714742567677777656116347747677167273705777777777777777777777777470163573777561735323577773737373773373777373773777737777740434004041601000016400005777704157700414000000040477777604756565677777776617307247167734203630357777777777777777777773777743675273776727173333737373773777373737777377377777740000470004351140004440007760746576770400000000004077777775504654747676767477765325727756565743070727777777777777777777163572777437577717777637753637737373737777777377777777770004047416405040000400005774054056507440040000044424777657652447565257674767646777430347656376347632531677777777777777777743353437777252773537656371737777777773737377773777777000000507471401100000400776140424075600770040004000577575750657006565647765777776777777737274074771643673134777777777777772777737125277777476777377777737377373777777773777777777000404404743400004000477547465140005405640044000477764774250756506565677767776747677777701277160677743466330147777777777353473777737132537777177777777777737777377773777777777777000000040040004400057706704100000561404040000457760536047740640456474767764765677676767761216770043777114636334176777777737777373777777771777777777777777777777773777777777777771000040004050400047777444410400004044000000057671457654565340477047474356777767647677474777610036764647673652437213677773773337773777773777777777777777777752544644647777777777771000044004770004774340007410000400404250747775440675000044000477447437271667777765777676777773531212716471673707243177777377777773777777377777777776756040400000000000657677777776000004000400177454740001000001400404777777737400770000040404770567473475375677767777656777767470712616674747657343063337733773737377777737777775250000000000100500400040147777771000040000577407604044140000070000077777414440475010000000077774047747276167347767675675646767677251213434717274767377777777377777737777777765000040500725656572571414004004537770000044716565604500401000000404005777750640057105000000447775704776775616735636567767676777747677767343732667477356733776177777777777777775000400070775777777577677777525000405770000004774041406470700000070004064777740040247105000040777770400775677671663570747777676777747477774761617136346657777377373777777777775000002577775774757776575656757777741600570000004704040414040500000440005074477140044041100000077774400043737765675743632342771656766767665676767616137353676177777777777777771400007777656565777773577765475647577774140470000004042407404400000040004774405676564004100000007754000007377771777767765656353077674777767567777677776530343377377777777777777040007774747775777757056175357640757675777701040000004040447340050004004474040065750400471000004750400007777777777070756565361607603436747776677574767777677337777777777777777740000747774145770775311110535375744654567775765000000005040047740400404034074161440675040044040757440000577777777777776372765677761743613716777676776576767464777777777777777770000777744776452577525343010105071741650575777777450000040400440404000004465406560045640040000777400000067665677677777756753774360767253652716056776776756777776777777777777777000177543474453457757115115014100165665676565657777000000040040040000474047500040045000474004757400000054745064040604656777674377574707675247273734677777677777677777777777777100457756744045657775315773701211400157575757575777777500000044000007577404710400005240043777574340000747664646476474464042407777406373465436734342437147677656665677777777777774003776054656161657775771775351521014377777777777565777740000004405047473404400000044160447616504000044747475675656476566546404467770437327657474773432737167657767777777777777000577056404047577757735775571353510015777777777777775777710000000777407446100000000074400775404000056767656674664676474566474424064776035307276676567476163437277777777777777740017747475675774757777773430014116171077777777777777776757740000044750605014100000007040475040400047747474656477475656666747467464046475727307135256353617253617477777777777771004770747477577177777775351117113105105777775357757377575777700000004740560400000004754707504000005674767677777767767677574746746546400066435332523725665765670723030777777777700077775777177177177777775071010141107127777777717777777777757740000007704071000000414604740400004677777777776767777777767676774746656464047663733703071725661671747677777777774007774775777176175357777711075531305105577757175717577777777777700000045704461405040405714400000777776776776777776776777777776767656656474040561733373030721765467253677777777700177577777177535377777771035312150110127775737370753517775657577740000074400040060407740400000777777777777777777777777677676777777765665646044642737373372163127345765777777770047757771717717777577777701515715310300577777754153534775777777777000000470004004047754040000777777767777777777757777777777777767676776566564600470733337333312525272567777777500077675777735717573577771103031710514100775771731356571717775775777000000040040405777400000077777777777767676466656747477677777777777676566564640463737337173733321252777777777007775777535707773577177761511430713012102777775534317775635734775775400000470400777540000077777777777656404405416414707407460656777677776566565604460737033363737373303777577700077577753771717577356177530161151715351057535773515777711577475777770150000405777400000077777777776400441753777111373511701454206467776776506746400452337373333233337337777775004777777775075777375711573117111214311110777777150377717077775777577704770000044540000077777777764004167377777710535751305157335501044677776640656540663733337335373533777707770077757571735717575777771056111715315707017717157357753471757477167777700770000000000007777777764000535357737773131173315121717533757100406777746066400473372536333233633775077500777777775701772535777777157141215217500007777357777413575357477577577505770000000007777777774014171717375777771121753121525733513317711404776756164640407333337337333737770770007775777531771517573577777731315131530011075777777773777307777757757776007770000005777777760407773131617737737131113351151173153051713771004277674674404633737333733733377507700577777717057053756357777777141717077501000177577771715715757575677777750577770000777777764053577115171353777753010377101217351313131353177300467764067404373733163352337770077000775775771317161715777757757170717537011100177777775735777777777575777700777773477777777412537177312135357377331111311315353311511050117357710007777446044333277373337337700770047775777575017571777715353757175753501070100577775775725771777577777577705777747777777440513537371117131335377112117311130357131311317153737737004767065044373333373337377007700077477757353573577775121514377173750351010017777777777577475777777757775077777777777740713712575730311435137313111035301115331011011503717113535006776442407373737273733770077004777777775357757777531510135757775357507103777777777777353527577577777704777767777764171371535337111131303531713013131134337113135303171701711777000767640433372333332377700770007717575777777777773010034131777777773101157777777777757504153777775777705777577777517371113537737312531713433111015131111517111111153531131537377500774640673371737173377007710077777777777777777751711010415377757575177765743577777773534747777777775167777777744357371703111171711311111053131037121303131313012173111103577373700677440173373333373770077400777577775737777777131001011205777777777770171715347777741417175777757760577777774173735121153737331310121101316113753111151111011717310301773317577104767046373373637337710771004777777177575377750100100501577777777777417501534157775350747777777777157777777413535737113131101171113112111111353735103134353131311111173115353777106764413336333732777407770007757575377777777171010013101057777777701777701010015735250153757757774077777734171733713141053171035317313134135371773110113713535312103171301353777107762437337173733771077740017777775075357777171001075317137777577577775340311025775340757777777754777775431311753711313111131131357717131031737777131713773771111173111301353777006740437333333737770777300077577177177777711101005315014577777753777530111400537534110777775777417777743535371371731111210113101373311111173573731713743157131107111311535253777007643337373633377747775000777775715257777170101173503173777777377710153701300753515257775777711777770311317137373110301131315377315313035317353121071317337101311301113131757775076073732373373777377771000771537771177777170053510150157777775747105341141101773705357765777647777541735213530353311110110131117331111013737313513135311577717311312134173777770065233737373377775777770000777575756177777710153100050357357761710717101370065757165777777775177776171313533171353313131311073717121313103533512153535313777771211115135777777775265233333373377777777700004756377375757771753010010315375775110531717161517737357737775777507777705353531353131311317711171113731311111353713111213130777777771130537733535373700703507173373777777777700005304735171777147710105001435047137351741410117777575737575177752577770537313131211312135771103105371153112131331301137173535313131131013531151317577146742333216337777777777700004004577017743105310111011161077505301101014357777777577767777741777543717135171131311037771111301173313111101711112113173313110131117773171314317177106374247313277777777777500004000537417101005710001071540473525357100017761775777577577775177777013737133133111311717373011131153113131317313117373111111311010177113110715377537014377342061777777777777000004000753504110771011353561317751050012177757175777577657777507777701713533113110311173737111131013110771101777101735313130110131137713510351351737770673434356167777777777777000040004775311657170777410110477777535757775777107777755777764177777071713435311131013353537301011311053713377353537531110113013113571713135135277577700343473616377777777577777000005000617571777577751757751177777777777777057753576777775517777741313531316133171353133531311010101373735317337773111313153117077731105137135173777506363061617777777737277777400061000425655377777701777765777777777777757053577557775700777777525713153131531131352513531311010153735737317135371301113353317777735317175735777777417163563607777777777536773000057000441657577771777777104777777775774777770747777560577777770533171317133113113113170171031311253533135313135771135271315351753531737331737777770277352341677737757777771775000007500044753771417775750407777575777577553575777716153777777437117125313110312101353113017125135373717131351177313131101121131377373511153575777717737735373777733777777777737000000771004465753507770142407777371753573747177777450777777777477313111313531111171303111311130117371335311301257011131131111101577711312110313777003733333377757773437377777777140000577300042571153750054465775771770541177777040177777777750771713131713131301131153011311110335371313711311317131131011213533771301111311141777433777727333773373716777767777300000057535014304351005243543477474071777777404177777777777707113153101313101133413111301031017173134311311131313512131371353571311110130170113501373733737773477373737177775777740000007777535011000464444644450517577775040435777777777770771353317130113135311311301131101737317331130103535353335317135373331112533511113577127327373333373337273737253736777735000000477777735315141615353777777770404001777737777777770171315213135311135311211310101317317311113131317737335317135131775112113513737713174007134377377377737373737370735735773700000004057777737777777777777744040005777777777777777561335313517131313131311311131101775717371311111777717135313131577737113533511535777771216337257337233737373737333723527377770000000004056575757474440400000017377777777777777777057113153335353501773531031113177573313131310177731131131716173777713513101313073777007634605327737377373737373773773372537177700000000000000000000000000567777777777777777777770731705315113131357773113105311577371311210137773113103111177777531311311131115357770773561362533737337373737373373377373736371773521000000000000041074777777777737537777777777704711131336317111373535351331130375775311131737353713113121157777131131131112101777506167374356377337373733737373373373737373727777777770707134373777777777777777777773772577777707731141111113017777331011170117131177375777531313713113113017737171161135111101776072525276377337737373773732737373373737373733077777777737671777767777777777777777777777737775077713135313111357735171371131433531357777713105111135311301057713131113533530177717352527525237373373737337373637377737373737377307777777777776537373777777777777777777777773770477713111310131373713011013113353101771337711131213733131111377353537377751111771477777352161737337372733737333736333373373737337737077756777777777775375777777776777777777777730777353301531171171311317311317313111035110353111110177531301577737353531377777770777777777373373737373773737733737772773737377733737343773477377675777737777767777777777777777714757353131171121171711111301735353313131311353131131037371107777373313110177777477777777777737373737373372733733733373373737333773737370347374777776777773477777777677777777777433735317133131113131031311173573311111131111317131101353131377735311300115777750777777777777737373733737737373773377377337373773337737377333433073777777777737377777777776777677057131713511101017131110173373331731307113010731711311173537777131130111217775277777777777773737337373733733732337337337737373377733737337373737352352777777777777777767777777777037531310313110217131313177171731111137311111531311121177757733131537311777765777777777777773737337333773773773737377337337373337737377337373737377373437777777737777777777777775013535311110111371711177373371373107173531037171311110171317531031777711777077777777777777337336337773333373373737337736337376333737337373373373337373734356777777753777777677760713131131010351131373717171331113533713101177317131131311113113177531777707777777777777777337313723337777337373637733737737333773737727337337377737373773735775777777343777767710771717113135303513535313173533313177131137577717173531521301315737777771777777777777777736336363163712337737373733773733737373273733733637736333737373373737273677777773737777740773717353731713103131353113535371317713512577717173531111101337777777747777777777777777313777176163737337337373773373733737373737733773337337737373773737737353736777777771767760753507353531113107171117103531371317773713577313537135311105777777770777777777777777776363737777752527316737373373373763337373733773377337733737373373733373737171777767767173100753535373531711131313311113171131135353151253111107131131137777776577777777777777777777177476377377756733173737377373336737337377337333733377373727737277737373736161757777777400711535313121107135351130107313121777315305351030117353113577777717777777777777777777737737134347777373567133737337373733733737337737273377337373733737333737273737373637777677700773535353131317131253131117371111375311311371110017317101777774777777777777777777777476777773725277777376753437137373733772737733737373372737373737377737273737377373752735637740771311353111317131311101017331307737715341351310017131137777077777777777777777777737137373737737167737735273327237373733373733773737363373737373735333737337373337373373433477300777131313053535351353111735310117771701315331101617135777547777777777777777777777777770737373777373477777756537430373737373773377373737373737373733773373737377737377337373307500477711111301313131311333531311777173171537110101777777540357367777777777777777777373737677577777377347727737473774343537373377337373737373637373373357373737333737337733373733730077773535353711171310573711113777353112157110077777734376347377777777777777777770733437033237377373737527773767377727032353337737373737373737367373373737337733737333777373737370006773131111353011131713713011777353513773110177770457436343436177777777777777737677777747537377777773716161777773777757273733733737337373737337363373637323733737733317373737371214375313531311317565351311177177311357775377700063767757777716252773777777773437716577372761716373777737373436747737725252173373737737373737737373733373737363732373637327332737000435713111131537773121013777753535777777550475353617676777271634343434777777777737074771772737373737377773713707477777777072373533737373733737373737337733733377373337337373733730000757777577577575113577777777777776740247677761707375675674777616732617716577777370777777747743477373777773737343773777756172733737373773737373737333733773337373737337333737373700050577777777777577777777777777010747777677767765271671676347774770727737777777773434743737373725361737337773777074736377252521637373373737373737373733373733733733737373373373371240441675777777777777735614045676777676767776777763434354776076576577777777777777737377777777777373777773777737737777777777773733737373737373737373737373373373373337337337337337333161434565747475656561616377777677777767777677777677637257777677777700000000000000000000010500000000000092AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(8,'Seafood','Seaweed and fish',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF0000000000000021312121001212103012101120511213001003031000000000001001201000031434130127125003036131617112161707121633525212434101612140103000000001000010000001000000000000010000000000000000100102120005212143012525002070011030101770000000000001001200070431030521125306171134303436170643125351431717043523421052136001002010020100200001020100010000000000000100000021310316114104031050307010303401035203003073000000000001002101000031071430161771407072535353717341752534363761634352153525252411700000002100000100000100000000000000010010003000100114211021201343030103430100312121010301710000000001020010001007007021316161302717353434371734367377371717173525257616137171360000100104002100007000000000000000010000200000100316211203104250103016101125061614121201437600000000000103003004101313534313177500717373535773534717535377777174071301216516165170070600030100000000100000000000000000001000000014211251007100212107012306121001303410301371000000000000001001006124252134343137437775373737777707737775375377370477777532735327124010100000001000002001001000000000000000001000211230303112041352101214130106121071211037500000000100010020102043513353437177703753737753537773477777377737537563010103471634716412520210121020001001000000000000100000000000001251014304204120016125013016001413001243772000000000012001012054303614353717371747377777377777347777777777777756357777777177171610252141060000000000000000000000000000000010210130303030311006171212130305210121341301317710000000000000120010025351734353777770777777777777777577777777750602004000000016124371675252161010410002010000000000000000001000000000014316100253000125050030301204120300341377000000000300100121034070361373753777377777777777777767672525004241447420704046004100400435353070212000400000300100000100000000002100003030310351204352121217050341420150350337770000000100010210103007171375357377777477777777777752705464464604766640446464644606460704024347125001000010030000000000000001000010003016100021021001214130103030120013021037577000000012010010121610657375737377777777777777774040644466567600406400040006000000476746424400212534120430000000000000000000000000003000310313521705241212016310161003503143533770000014010030216101341735737777777777777774740404647460406040042040004620040000000440240467504040025000000000001000000000000000030000000021001001200214316110701030402143031777700000212010010107161347737737777777777727000606676764000000047047640000444644640002040000466464040020041200012000000000000000000001010013523121311041310112530303042112035373770000001010201034312170773777777777777600444664404040070416000000750000000000000000046400560000046744004200001001000000000000100000002000001000525060120430612011610015217135377700000520001121011071737777777777774040476767400000206400640425675200000000000000064000046440000046767400101000000000000000000001201010043121312121124131031215201216025125371770000024012120161637353477777777770464676440000700004740400777777700000000000000000007747600674640000446740002000000000000000000001002000000520012121006030011211201007021317377700003070010121311717353777777524476777600067046404006730331777716101031000000000000047777704040000000044664014121000000001001000000100421312113041706011413705205312101350717373000104030120534371717347777444676460420000464006421171531537133131313133130100000000077700000006740000067400002000000000000000000030041000012241130001321300121130404034333717100000603016113137173775775647767400047400470000703417133113313713131135313133100000000160000000000000650467460010000400000000000010000020013041302112430520712161033007135353637000131430314343537371737674766765000420476000065713337113301311317337333737313110010000100000000000000640046540000002000100000020010001010241101306110431110353125013002537351710000161410331353535377747664004067607400404777521111113101353313337737373337333301011300110100000000000000006620100000000001000100200020001302305112003161212102533404353353737000137061371535373777764677000702444660000077760103131212133337311773737377717310313130130213011000000000000476400060100000000010010040010001300121216142125350713001025335371700003703173173737777767777640046740000470527777012112101317352710033773331773001331371011011101301113000000006774000000010000000201200121020305116125000351210330107124137173527000713547357377777777746464000006460000677777730113111203131311300013777373172101073131030121301313011200000004674004000000000001000000000100121301031250215214136103106117173531001733717377777777676400000075000000057777776101313311133737337310003777377317271373130113101310312111100000004460000002001000003004210000016121031304071211213012507017373617000371753777777777767670006746460000773737377300131373733773001717000003377733721037310131213131213013031300000006740000010000001200010003030301007061002121025341703300737171700017537277777777777767400074006777377170737735013137773373100000330000017177773103373013101303031311301110000060474000300000000301000200100001031131121417017110303114343537373016333771777777777664000066470171331333331737720013177773770000000730000002003773737330003121131313331303310000006764000000001000000041002010007060021520013012730707210073777771017533777777777675000000002533131737173737337100113377773773310100110000010001043735300101133133735371101210040047764000100000030001200100210131135132106107251013101777777777073713777177777747760066000173307371313331337373000311377773777770017200000001000331031000031313737731000131012774066400012000001000020120030000021012010612310123716173716577717171777717777777776006500077317133333373733737710013133777777777310031000000000131303130001313373750000000101304600474000000000000007010101001035131215300114313501210370712530777373737777777666440764617337333017371313730333700013113370737777301170100000013131373010001337377300000000310000000460100001001200000020021020012021210706030612353017710712531377777777777777400064001737131373213337331371733000013013510437377773332101007770131343000001777371710170000030040476520012000200041210010000101215141210013011215213710131253075777373717777760000000073733737371217133521333770000100313000347777307310207777100600010000131777373737310013104607764000000001000100061201200021213030300705321521435207701347777777777777766704760007333533733335313313337173300010010312000103773731031177310211111700000127773777777001210070067600010010000420210101000100141203150430120512121370070077131677377777774776007461033733733717333335317133337000000013113000053717731003375311303373700003113777377737101004670447400200000000101020000300303030142130433130717037001701700771177737777766000006043173733733737371303033525373000000013113131313331031177731311153777710003031000077733714000400642000000000012041012100000003152112103050031211770070070077007377777776400474404333733731733331331313132133331000000013131130311213037773131333377777771311021001373773000000076410100000005001020000210100142111250241307125377103107701700377737777740000060031753353373735337130303013353530000000011313311131131377313537377777101107003112121777300600027640000010000020303012100020002112341304170314313770077073037007737777766700067427533373377333337137131313352333531000000131311333123537373313137377777373713103011100070067600474600200000010100400000010100011250301202170307317300701700700137777777777400040442153773337371333131303052317121212100000001311131133137773313777373737737717133313100040047000674101000000202121030120020000341330701407035317770073070077007737377776400200000053333373737337173130313313312131030231201301213523173377111217377773737737733111210000645644046600200001004110102040010100400301010300313521737205701701701773777777460047400601317177373313713313371361371213002113173130331303353337733333137373337373723734331001000066427641001001200210602010121000020330703431140703171771031063077003757777767400246407643737337353733371711131331335213112030217313071301337777310103123777737337370330101001000400465603000000001201050020000200410010303072121717373702560500700173737777767004006046013537333313531333330731731213030317131212353303737337717313131113230717735350733100101000000764000300000001021210101210401213431103100431217177053017037007173777774676470000700533737373733373171731333131303530303031313210313333713731210130311010313133333130100310000064003010000000702500002000000034003070710613353737301300700700173777777767406464046653353735331317137333132712521313211313035311337373731217371000000000000000000103010005600054404300205210210010012000100243413103111210417353535007012071037373737777640006700004217313333737333537317313131303011730301231230133133131213773000100000000000000000420064046676030535301001021212010142041012200710217302412173730300710300435377777765600056400744737371713137313317335313031713231313331331337137131311337777003500000000000000007406400076434777777777773500016030100006015011211210143371217007013007053173737777767000600064072531333373713737337333733121311030310331217133313131337710001003000000000000560040670004677777737337373777353001002000413421217307034215071710700700700317353777774764000052006653535353373373333733531353312133135337131333313131353770000130101000000000466460000600247773733373737337336165102500601200121210117104333173001030042143717377777767000006650040033333371337373533733733313713103033112173131313121333000177773301100000016400077404444777373373333333333337326100010301430007032121214127171070030140313035377377764000000600005735373371737373733731717331373131123312133131313133771137777777721300024600004660067673737373373737373373333107202410421070117110710433512103035000007161737377777400000046460463533135333733733533733331731333733131313073121131373377777777733131110400004640004767777373373333333337337312301401203007012121071243341253070100702317173537777747600250000000771353733373373373373737173121731353533131310076037177777773421713131201240007000067777773737337373737333312330020160500707010713031041371343134310505303173537737766704640400066121273735337373317137333313131373333353031771771002777773770001313101000000046146777777373337333333333327206676160120121021071217070250361343130700305352173717777576000006700041111353337333735337317373735303353131331377777770017777070110313131311101000476777777737377337373733367764747476764106161403031013004335170307071021734317353773776640047606000131271237337373131733737313131313337121035777737701677700016131313131000300006777777773737333733333376767656476747416010030317073701631433031713125052131635373777774000064000003011313533737333731373137337333537313131777733777740100000013131313000310000677777777773737373737276767767767676765601243400013010301433143431617006316171735377357776604000067053073133353337353737373737313533313313137777771777700000000001313111310160647777777777777737333337770746776777777760341212103701711600523131613037105317034377177377756700000006000161053371733333337331337313133353130013733137770600000000000012301316777777777777777777777777575652105274777677740250400010301271073516161343500612527173537357477764600076400007117373333717373537377337335353130017373707310040000000000000311130676777777777777777777775252000040705010677764705203000711635004301235317171253171717353717737373560000640404771331371713335333335333533533313121231131313000470000000060004003447777777777777777777772524040406170707061057776124100041271037125371521612534247373717377737477777744000007600135371333737331737333733313113131001137171057200674056000400067746777777777777777777777440442400004070707165207474030000035005030425231713713716171753777777777777777747640040007131311713537333317331717333717121021121200064004604600000005666777777777777777777775652560404004124143507175707074000430037133516135353071253714373777777777777777777746700000717135331313137171735373331513331101000040006500670067404204467777777777777777777777765646046527424470743707070706021402005030150243534373535734637777777777777777777777746000024373313513173537333333135133371012121000675004646560042777466777777777777777777777764564654746440407065254525257750000010133512335061350353731735777777777777777777777777774404400071313313113313171717133171707000464064460067006000047667777777777777777777777774776565646142400041525273535253774020000150215307073371717777777777777777777777777777777776767600000113537353353313131171060000007604700000040047444677777777777777777777777777777777777746440604061615067617057734161202335721607171737373777777777767677776767676677767774465600007117353371313313132006504640000006000000007766767777777777777777777777777777777777777774740402525637141747257700014115303171617177177777777777647777767677774747766776777464047776025335313171317750076467000000000666040666477777777777777777777777777777777777777777777404041653450772535777701202721617125373737377777777677777777777767676767777677677777464674001731313137004600000046004000007777647777777777773777777777777777777777766676567777777774065257274357707770205013171735205371777777777777777767465445465446506447677676777774646476775210476400004762000676744664677777777777737373733737377777777777720456446474676777777075257174717157750020017121735373737377777477777746476766767466746652704667677677777747647465467674206476740447464767777777777777777737373773737777777777720456444747665474777746165705253676777701012735273707777777777777777476777775777676774765644470047767767777774776766746465447464764765777717777777777777373773737337377777777774046646676765646464777707560725771517770207001735353567373777777777476777777664765656465644767474000767767777774777777777767672574567773777777777777777777373373737737377777777004654656767665646444677563570573472777750106173703733537777777777767777747654765647656065644646476444247677777777777777777177576727137777737777777777777773773773730707777777740076647676767664746404477562537473557777030300353571743773777777767777774764264424244406424740656446765647767777777777777167707717536537773777777777777737377274340577777777774006656767676764746442460656156743143777752505213733373353777777777777746466404402465427650424074240474765007767777777777016750770773753567777777777777777777414121437777777777000765676776767674644644040771635356777772010321471747374777777777777764670404720744067406470004656560464767407767777777756777360777753763577777777777777777616034103077777777740056767776676746465464464640775774357777417070521373317377377777777767464400004446700467400656706606474240767647777777777007757177777761742577777777777777765010121410777777777024667766777676776666464440460734357777770203030527374737177777777774760000464420044474646744642474577065064777427677777770757767774752577173737777777777776121216030301777777747567776776766766674400000000047577777774010141430117373777777777777464404600002466067067476464747466646566540677647777777652775775737377617756777377777773010104101050167777771676776767676677675000000000000077777772000252020343737173717777777746400474606444044040046440046046147416740670477527777770077737737057017727737777777777750306030252120177777647656777777777767664000000000000777777410010000140143777173737777776564020640407600000000006056424066706465724470677477777752477747573077077177017773777776100101011010520777771657677777742460000000000000000007775610000010100212073717735777777746406440060440474241200046460404744470724477465676477777007077773777107716776777777777710342125203021013777567767775402050004014000000000000061430020100202001000173733777777776400044246404604665424000004656476467656452742564777777774747777771710637777517737377773020105010141101257760776776020605224707421604200000000042014100214010000057735753777777747400240040604707466456000004656647647677656740770774777737777777737731777136743777737341052120302124210777756777040414524570617461670700040000010020310010010000233773771777776046074740044424464467601000004656465640477600700646777777477777777777703776537771717776121010150510110703770777740016724724256425641474700007001250100612030030041753773777777754604464600606406470440464000000647467042763476525756777770777777773373377733743173733753403430212030201057547760017605434165070520742434760400000030701014007000303771373777377660472000614040646464706072000000046746174147616476677777777777777777777777775737353175200300101001410102736370056760562506506076474257425700470010000125210300070473775375777775474444044644004044046440640000000037777776747477077477777777777777777773777372517377737500010217030216105756561614163416470616052435607424760670030107100210061031373737377777764600064000607400060076745676100000337777777777477477777777777737777337777777773617137737214210001010012121770047607407430434075250461643560704740042007000430061605375371777377740046706064464006746406046004200004777777765406747767777777777777777773721377353737753744001070120010000167043650743470463434424427074346165647301010301012040301337377177777777460044446446060474404006774761000710677777767677767757777777777777777775014777737527377700000012503021014352525270343434341643430745616434706574000250002010071434371737357377774470604650654042464240046464047100671077777747567476777777777777777777733133573573577773700000000104102034607470564742434060743465261653461656771210303010061021037177173657377376465624644644644004600424065246301277077777676565777777777777777777777737773173773771777560000002112150135616526160743434343461605652470743477701000000010071034037353717377777746564406760674240647407000464777040577777777476167777777777777777777777377777657375377737140000000000212461616507074340656146165770470475256775242101012061025031173673477737377706400676404604404060244052677765330777777776774776777777777777777777737777771335737736770606100000301005356461647006165216705256043063424077721014200004016112143717173437777777446004440604006000444424645667777731777777774076577777777777777777777733777776521617716165752561614161764253461605745275641674252565147077777521210121007212052373477357735377737164002404656444646460464644567777731377777774676777777777777777777777777777737537703353063773777777777756470343420204025250614052066340477743050240103001413050173435253537737777470404740640065646444040606476777713737777677477777777777777777777777377773712501705252573771617617435607444652547525000605256056140077777161211303040703043037357525277773777777646466440006646000600464650477777347776774747777777777777777777777777777773070372525247075271771342570442700056200605670524203616047777706134124050030301303435253347137171737375744000024454040040400044666077777777746776777777777777777777777777717777773070503121437735370377070374240642005470725052535654007777770135216113200414160521525257077173777757367764560406600740766400004506460677777676747777777777777777777777777377777771032506161435370357071470314040404200404024242400025747776120417136141212030130523347307077353737375737576600040464644442464076406574477777654777737777777777777777777777777777325052317063536177217302171634000404002104000500776567774116153212512300417012012157071707134735735727573744406400042000047402440656647777777727777771734777777777777777777777737012341420707253521771657061010400004040612570674657656161601205071614043121705214307030613531731733563773777747604740000046440604644746777777457371777735777777777777777777777015250123505371361171210303112521000000040442467477525252121125303003300352501211211707616563434735734143353775347564600240400604004246746777776377771735737777777777777777777777210270503607071725275346160703071300100000640507472420105025001617141000212161205230611003113531612527375371737736165644740664074644756357737616717373530777777777777777777771705251030340713521735324215130141024070210420170703010052021103161212300615214305301616534707343071371617136173617056577734765416567173635371771653734717371747777777777777771021030343435025252170530501632070212140305021017021050041201104216113434071120121030431003001310317070140617535353737037353435373777073717135275347377137343527077777777777777761525350343025435316172573061053071250210121003021103030210142131030603100016170143413034703424250313136341230370317124437253734353771473716735337047357135307134217537777774777302120352171302525312533070163010010304250121001421701000710300070113143043012170303430001300711214242510061535035617102517352535271243170711635720735234363537004730737737137750714170353070434316173525306107071241000121412121121030400030171034207104216121034130143424070125031311206112303703124253734353073525216171277170142537537153616173071777343046321033034307170713735252534010303000134252102001016107002103143003031530201012507103052000714036130070525053614341716105252531617343704352125217356072530703617100717173773352010507143530703024343431712125630503030000212110307212100012502125341403014303611212143043070124112532132120003310321213407171613071717061353535343314173531713037060703273070316030302100713571435353431617001430341071050500610010510300410341301231343000501201252103004036434350152516142505251525070243061707034370070343070347025252160707502431705347171404341716170343242703421743524343070303024212121210712030012030305251425316070341705214340724110121030301210003121212103005317130713537007135307135310437135313531241352130312120030121213071735071353170312100301010101001210101030301000001010121303130000121030121030030434300000000000000000000010500000000000094AD05FE'); + +INSERT INTO "Customers" VALUES('ALFKI','Alfreds Futterkiste','Maria Anders','Sales Representative','Obere Str. 57','Berlin',NULL,'12209','Germany','030-0074321','030-0076545'); +INSERT INTO "Customers" VALUES('ANATR','Ana Trujillo Emparedados y helados','Ana Trujillo','Owner','Avda. de la Constitución 2222','México D.F.',NULL,'05021','Mexico','(5) 555-4729','(5) 555-3745'); +INSERT INTO "Customers" VALUES('ANTON','Antonio Moreno Taquería','Antonio Moreno','Owner','Mataderos 2312','México D.F.',NULL,'05023','Mexico','(5) 555-3932',NULL); +INSERT INTO "Customers" VALUES('AROUT','Around the Horn','Thomas Hardy','Sales Representative','120 Hanover Sq.','London',NULL,'WA1 1DP','UK','(171) 555-7788','(171) 555-6750'); +INSERT INTO "Customers" VALUES('BERGS','Berglunds snabbköp','Christina Berglund','Order Administrator','Berguvsvägen 8','Luleå',NULL,'S-958 22','Sweden','0921-12 34 65','0921-12 34 67'); +INSERT INTO "Customers" VALUES('BLAUS','Blauer See Delikatessen','Hanna Moos','Sales Representative','Forsterstr. 57','Mannheim',NULL,'68306','Germany','0621-08460','0621-08924'); +INSERT INTO "Customers" VALUES('BLONP','Blondesddsl père et fils','Frédérique Citeaux','Marketing Manager','24, place Kléber','Strasbourg',NULL,'67000','France','88.60.15.31','88.60.15.32'); +INSERT INTO "Customers" VALUES('BOLID','Bólido Comidas preparadas','Martín Sommer','Owner','C/ Araquil, 67','Madrid',NULL,'28023','Spain','(91) 555 22 82','(91) 555 91 99'); +INSERT INTO "Customers" VALUES('BONAP','Bon app''','Laurence Lebihan','Owner','12, rue des Bouchers','Marseille',NULL,'13008','France','91.24.45.40','91.24.45.41'); +INSERT INTO "Customers" VALUES('BOTTM','Bottom-Dollar Markets','Elizabeth Lincoln','Accounting Manager','23 Tsawassen Blvd.','Tsawassen','BC','T2F 8M4','Canada','(604) 555-4729','(604) 555-3745'); + +INSERT INTO "Customers" VALUES('BSBEV','B''s Beverages','Victoria Ashworth','Sales Representative','Fauntleroy Circus','London',NULL,'EC2 5NT','UK','(171) 555-1212',NULL); +INSERT INTO "Customers" VALUES('CACTU','Cactus Comidas para llevar','Patricio Simpson','Sales Agent','Cerrito 333','Buenos Aires',NULL,'1010','Argentina','(1) 135-5555','(1) 135-4892'); +INSERT INTO "Customers" VALUES('CENTC','Centro comercial Moctezuma','Francisco Chang','Marketing Manager','Sierras de Granada 9993','México D.F.',NULL,'05022','Mexico','(5) 555-3392','(5) 555-7293'); +INSERT INTO "Customers" VALUES('CHOPS','Chop-suey Chinese','Yang Wang','Owner','Hauptstr. 29','Bern',NULL,'3012','Switzerland','0452-076545',NULL); +INSERT INTO "Customers" VALUES('COMMI','Comércio Mineiro','Pedro Afonso','Sales Associate','Av. dos Lusíadas, 23','Sao Paulo','SP','05432-043','Brazil','(11) 555-7647',NULL); +INSERT INTO "Customers" VALUES('CONSH','Consolidated Holdings','Elizabeth Brown','Sales Representative','Berkeley Gardens 12 Brewery','London',NULL,'WX1 6LT','UK','(171) 555-2282','(171) 555-9199'); +INSERT INTO "Customers" VALUES('DRACD','Drachenblut Delikatessen','Sven Ottlieb','Order Administrator','Walserweg 21','Aachen',NULL,'52066','Germany','0241-039123','0241-059428'); +INSERT INTO "Customers" VALUES('DUMON','Du monde entier','Janine Labrune','Owner','67, rue des Cinquante Otages','Nantes',NULL,'44000','France','40.67.88.88','40.67.89.89'); +INSERT INTO "Customers" VALUES('EASTC','Eastern Connection','Ann Devon','Sales Agent','35 King George','London',NULL,'WX3 6FW','UK','(171) 555-0297','(171) 555-3373'); +INSERT INTO "Customers" VALUES('ERNSH','Ernst Handel','Roland Mendel','Sales Manager','Kirchgasse 6','Graz',NULL,'8010','Austria','7675-3425','7675-3426'); + +INSERT INTO "Customers" VALUES('FAMIA','Familia Arquibaldo','Aria Cruz','Marketing Assistant','Rua Orós, 92','Sao Paulo','SP','05442-030','Brazil','(11) 555-9857',NULL); +INSERT INTO "Customers" VALUES('FISSA','FISSA Fabrica Inter. Salchichas S.A.','Diego Roel','Accounting Manager','C/ Moralzarzal, 86','Madrid',NULL,'28034','Spain','(91) 555 94 44','(91) 555 55 93'); +INSERT INTO "Customers" VALUES('FOLIG','Folies gourmandes','Martine Rancé','Assistant Sales Agent','184, chaussée de Tournai','Lille',NULL,'59000','France','20.16.10.16','20.16.10.17'); +INSERT INTO "Customers" VALUES('FOLKO','Folk och fä HB','Maria Larsson','Owner','Åkergatan 24','Bräcke',NULL,'S-844 67','Sweden','0695-34 67 21',NULL); +INSERT INTO "Customers" VALUES('FRANK','Frankenversand','Peter Franken','Marketing Manager','Berliner Platz 43','München',NULL,'80805','Germany','089-0877310','089-0877451'); +INSERT INTO "Customers" VALUES('FRANR','France restauration','Carine Schmitt','Marketing Manager','54, rue Royale','Nantes',NULL,'44000','France','40.32.21.21','40.32.21.20'); +INSERT INTO "Customers" VALUES('FRANS','Franchi S.p.A.','Paolo Accorti','Sales Representative','Via Monte Bianco 34','Torino',NULL,'10100','Italy','011-4988260','011-4988261'); +INSERT INTO "Customers" VALUES('FURIB','Furia Bacalhau e Frutos do Mar','Lino Rodriguez','Sales Manager','Jardim das rosas n. 32','Lisboa',NULL,'1675','Portugal','(1) 354-2534','(1) 354-2535'); +INSERT INTO "Customers" VALUES('GALED','Galería del gastrónomo','Eduardo Saavedra','Marketing Manager','Rambla de Cataluña, 23','Barcelona',NULL,'08022','Spain','(93) 203 4560','(93) 203 4561'); +INSERT INTO "Customers" VALUES('GODOS','Godos Cocina Típica','José Pedro Freyre','Sales Manager','C/ Romero, 33','Sevilla',NULL,'41101','Spain','(95) 555 82 82',NULL); + +INSERT INTO "Customers" VALUES('GOURL','Gourmet Lanchonetes','André Fonseca','Sales Associate','Av. Brasil, 442','Campinas','SP','04876-786','Brazil','(11) 555-9482',NULL); +INSERT INTO "Customers" VALUES('GREAL','Great Lakes Food Market','Howard Snyder','Marketing Manager','2732 Baker Blvd.','Eugene','OR','97403','USA','(503) 555-7555',NULL); +INSERT INTO "Customers" VALUES('GROSR','GROSELLA-Restaurante','Manuel Pereira','Owner','5ª Ave. Los Palos Grandes','Caracas','DF','1081','Venezuela','(2) 283-2951','(2) 283-3397'); +INSERT INTO "Customers" VALUES('HANAR','Hanari Carnes','Mario Pontes','Accounting Manager','Rua do Paço, 67','Rio de Janeiro','RJ','05454-876','Brazil','(21) 555-0091','(21) 555-8765'); +INSERT INTO "Customers" VALUES('HILAA','HILARION-Abastos','Carlos Hernández','Sales Representative','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal','Táchira','5022','Venezuela','(5) 555-1340','(5) 555-1948'); +INSERT INTO "Customers" VALUES('HUNGC','Hungry Coyote Import Store','Yoshi Latimer','Sales Representative','City Center Plaza 516 Main St.','Elgin','OR','97827','USA','(503) 555-6874','(503) 555-2376'); +INSERT INTO "Customers" VALUES('HUNGO','Hungry Owl All-Night Grocers','Patricia McKenna','Sales Associate','8 Johnstown Road','Cork','Co. Cork',NULL,'Ireland','2967 542','2967 3333'); +INSERT INTO "Customers" VALUES('ISLAT','Island Trading','Helen Bennett','Marketing Manager','Garden House Crowther Way','Cowes','Isle of Wight','PO31 7PJ','UK','(198) 555-8888',NULL); +INSERT INTO "Customers" VALUES('KOENE','Königlich Essen','Philip Cramer','Sales Associate','Maubelstr. 90','Brandenburg',NULL,'14776','Germany','0555-09876',NULL); +INSERT INTO "Customers" VALUES('LACOR','La corne d''abondance','Daniel Tonini','Sales Representative','67, avenue de l''Europe','Versailles',NULL,'78000','France','30.59.84.10','30.59.85.11'); + +INSERT INTO "Customers" VALUES('LAMAI','La maison d''Asie','Annette Roulet','Sales Manager','1 rue Alsace-Lorraine','Toulouse',NULL,'31000','France','61.77.61.10','61.77.61.11'); +INSERT INTO "Customers" VALUES('LAUGB','Laughing Bacchus Wine Cellars','Yoshi Tannamuri','Marketing Assistant','1900 Oak St.','Vancouver','BC','V3F 2K1','Canada','(604) 555-3392','(604) 555-7293'); +INSERT INTO "Customers" VALUES('LAZYK','Lazy K Kountry Store','John Steel','Marketing Manager','12 Orchestra Terrace','Walla Walla','WA','99362','USA','(509) 555-7969','(509) 555-6221'); +INSERT INTO "Customers" VALUES('LEHMS','Lehmanns Marktstand','Renate Messner','Sales Representative','Magazinweg 7','Frankfurt a.M.',NULL,'60528','Germany','069-0245984','069-0245874'); +INSERT INTO "Customers" VALUES('LETSS','Let''s Stop N Shop','Jaime Yorres','Owner','87 Polk St. Suite 5','San Francisco','CA','94117','USA','(415) 555-5938',NULL); +INSERT INTO "Customers" VALUES('LILAS','LILA-Supermercado','Carlos González','Accounting Manager','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto','Lara','3508','Venezuela','(9) 331-6954','(9) 331-7256'); +INSERT INTO "Customers" VALUES('LINOD','LINO-Delicateses','Felipe Izquierdo','Owner','Ave. 5 de Mayo Porlamar','I. de Margarita','Nueva Esparta','4980','Venezuela','(8) 34-56-12','(8) 34-93-93'); +INSERT INTO "Customers" VALUES('LONEP','Lonesome Pine Restaurant','Fran Wilson','Sales Manager','89 Chiaroscuro Rd.','Portland','OR','97219','USA','(503) 555-9573','(503) 555-9646'); +INSERT INTO "Customers" VALUES('MAGAA','Magazzini Alimentari Riuniti','Giovanni Rovelli','Marketing Manager','Via Ludovico il Moro 22','Bergamo',NULL,'24100','Italy','035-640230','035-640231'); +INSERT INTO "Customers" VALUES('MAISD','Maison Dewey','Catherine Dewey','Sales Agent','Rue Joseph-Bens 532','Bruxelles',NULL,'B-1180','Belgium','(02) 201 24 67','(02) 201 24 68'); + +INSERT INTO "Customers" VALUES('MEREP','Mère Paillarde','Jean Fresnière','Marketing Assistant','43 rue St. Laurent','Montréal','Québec','H1J 1C3','Canada','(514) 555-8054','(514) 555-8055'); +INSERT INTO "Customers" VALUES('MORGK','Morgenstern Gesundkost','Alexander Feuer','Marketing Assistant','Heerstr. 22','Leipzig',NULL,'04179','Germany','0342-023176',NULL); +INSERT INTO "Customers" VALUES('NORTS','North/South','Simon Crowther','Sales Associate','South House 300 Queensbridge','London',NULL,'SW7 1RZ','UK','(171) 555-7733','(171) 555-2530'); +INSERT INTO "Customers" VALUES('OCEAN','Océano Atlántico Ltda.','Yvonne Moncada','Sales Agent','Ing. Gustavo Moncada 8585 Piso 20-A','Buenos Aires',NULL,'1010','Argentina','(1) 135-5333','(1) 135-5535'); +INSERT INTO "Customers" VALUES('OLDWO','Old World Delicatessen','Rene Phillips','Sales Representative','2743 Bering St.','Anchorage','AK','99508','USA','(907) 555-7584','(907) 555-2880'); +INSERT INTO "Customers" VALUES('OTTIK','Ottilies Käseladen','Henriette Pfalzheim','Owner','Mehrheimerstr. 369','Köln',NULL,'50739','Germany','0221-0644327','0221-0765721'); +INSERT INTO "Customers" VALUES('PARIS','Paris spécialités','Marie Bertrand','Owner','265, boulevard Charonne','Paris',NULL,'75012','France','(1) 42.34.22.66','(1) 42.34.22.77'); +INSERT INTO "Customers" VALUES('PERIC','Pericles Comidas clásicas','Guillermo Fernández','Sales Representative','Calle Dr. Jorge Cash 321','México D.F.',NULL,'05033','Mexico','(5) 552-3745','(5) 545-3745'); +INSERT INTO "Customers" VALUES('PICCO','Piccolo und mehr','Georg Pipps','Sales Manager','Geislweg 14','Salzburg',NULL,'5020','Austria','6562-9722','6562-9723'); +INSERT INTO "Customers" VALUES('PRINI','Princesa Isabel Vinhos','Isabel de Castro','Sales Representative','Estrada da saúde n. 58','Lisboa',NULL,'1756','Portugal','(1) 356-5634',NULL); + +INSERT INTO "Customers" VALUES('QUEDE','Que Delícia','Bernardo Batista','Accounting Manager','Rua da Panificadora, 12','Rio de Janeiro','RJ','02389-673','Brazil','(21) 555-4252','(21) 555-4545'); +INSERT INTO "Customers" VALUES('QUEEN','Queen Cozinha','Lúcia Carvalho','Marketing Assistant','Alameda dos Canàrios, 891','Sao Paulo','SP','05487-020','Brazil','(11) 555-1189',NULL); +INSERT INTO "Customers" VALUES('QUICK','QUICK-Stop','Horst Kloss','Accounting Manager','Taucherstraße 10','Cunewalde',NULL,'01307','Germany','0372-035188',NULL); +INSERT INTO "Customers" VALUES('RANCH','Rancho grande','Sergio Gutiérrez','Sales Representative','Av. del Libertador 900','Buenos Aires',NULL,'1010','Argentina','(1) 123-5555','(1) 123-5556'); +INSERT INTO "Customers" VALUES('RATTC','Rattlesnake Canyon Grocery','Paula Wilson','Assistant Sales Representative','2817 Milton Dr.','Albuquerque','NM','87110','USA','(505) 555-5939','(505) 555-3620'); +INSERT INTO "Customers" VALUES('REGGC','Reggiani Caseifici','Maurizio Moroni','Sales Associate','Strada Provinciale 124','Reggio Emilia',NULL,'42100','Italy','0522-556721','0522-556722'); +INSERT INTO "Customers" VALUES('RICAR','Ricardo Adocicados','Janete Limeira','Assistant Sales Agent','Av. Copacabana, 267','Rio de Janeiro','RJ','02389-890','Brazil','(21) 555-3412',NULL); +INSERT INTO "Customers" VALUES('RICSU','Richter Supermarkt','Michael Holz','Sales Manager','Grenzacherweg 237','Genève',NULL,'1203','Switzerland','0897-034214',NULL); +INSERT INTO "Customers" VALUES('ROMEY','Romero y tomillo','Alejandra Camino','Accounting Manager','Gran Vía, 1','Madrid',NULL,'28001','Spain','(91) 745 6200','(91) 745 6210'); +INSERT INTO "Customers" VALUES('SANTG','Santé Gourmet','Jonas Bergulfsen','Owner','Erling Skakkes gate 78','Stavern',NULL,'4110','Norway','07-98 92 35','07-98 92 47'); + +INSERT INTO "Customers" VALUES('SAVEA','Save-a-lot Markets','Jose Pavarotti','Sales Representative','187 Suffolk Ln.','Boise','ID','83720','USA','(208) 555-8097',NULL); +INSERT INTO "Customers" VALUES('SEVES','Seven Seas Imports','Hari Kumar','Sales Manager','90 Wadhurst Rd.','London',NULL,'OX15 4NB','UK','(171) 555-1717','(171) 555-5646'); +INSERT INTO "Customers" VALUES('SIMOB','Simons bistro','Jytte Petersen','Owner','Vinbæltet 34','Kobenhavn',NULL,'1734','Denmark','31 12 34 56','31 13 35 57'); +INSERT INTO "Customers" VALUES('SPECD','Spécialités du monde','Dominique Perrier','Marketing Manager','25, rue Lauriston','Paris',NULL,'75016','France','(1) 47.55.60.10','(1) 47.55.60.20'); +INSERT INTO "Customers" VALUES('SPLIR','Split Rail Beer & Ale','Art Braunschweiger','Sales Manager','P.O. Box 555','Lander','WY','82520','USA','(307) 555-4680','(307) 555-6525'); +INSERT INTO "Customers" VALUES('SUPRD','Suprêmes délices','Pascale Cartrain','Accounting Manager','Boulevard Tirou, 255','Charleroi',NULL,'B-6000','Belgium','(071) 23 67 22 20','(071) 23 67 22 21'); +INSERT INTO "Customers" VALUES('THEBI','The Big Cheese','Liz Nixon','Marketing Manager','89 Jefferson Way Suite 2','Portland','OR','97201','USA','(503) 555-3612',NULL); +INSERT INTO "Customers" VALUES('THECR','The Cracker Box','Liu Wong','Marketing Assistant','55 Grizzly Peak Rd.','Butte','MT','59801','USA','(406) 555-5834','(406) 555-8083'); +INSERT INTO "Customers" VALUES('TOMSP','Toms Spezialitäten','Karin Josephs','Marketing Manager','Luisenstr. 48','Münster',NULL,'44087','Germany','0251-031259','0251-035695'); +INSERT INTO "Customers" VALUES('TORTU','Tortuga Restaurante','Miguel Angel Paolino','Owner','Avda. Azteca 123','México D.F.',NULL,'05033','Mexico','(5) 555-2933',NULL); + +INSERT INTO "Customers" VALUES('TRADH','Tradição Hipermercados','Anabela Domingues','Sales Representative','Av. Inês de Castro, 414','Sao Paulo','SP','05634-030','Brazil','(11) 555-2167','(11) 555-2168'); +INSERT INTO "Customers" VALUES('TRAIH','Trail''s Head Gourmet Provisioners','Helvetius Nagy','Sales Associate','722 DaVinci Blvd.','Kirkland','WA','98034','USA','(206) 555-8257','(206) 555-2174'); +INSERT INTO "Customers" VALUES('VAFFE','Vaffeljernet','Palle Ibsen','Sales Manager','Smagsloget 45','Århus',NULL,'8200','Denmark','86 21 32 43','86 22 33 44'); +INSERT INTO "Customers" VALUES('VICTE','Victuailles en stock','Mary Saveley','Sales Agent','2, rue du Commerce','Lyon',NULL,'69004','France','78.32.54.86','78.32.54.87'); +INSERT INTO "Customers" VALUES('VINET','Vins et alcools Chevalier','Paul Henriot','Accounting Manager','59 rue de l''Abbaye','Reims',NULL,'51100','France','26.47.15.10','26.47.15.11'); +INSERT INTO "Customers" VALUES('WANDK','Die Wandernde Kuh','Rita Müller','Sales Representative','Adenauerallee 900','Stuttgart',NULL,'70563','Germany','0711-020361','0711-035428'); +INSERT INTO "Customers" VALUES('WARTH','Wartian Herkku','Pirkko Koskitalo','Accounting Manager','Torikatu 38','Oulu',NULL,'90110','Finland','981-443655','981-443655'); +INSERT INTO "Customers" VALUES('WELLI','Wellington Importadora','Paula Parente','Sales Manager','Rua do Mercado, 12','Resende','SP','08737-363','Brazil','(14) 555-8122',NULL); +INSERT INTO "Customers" VALUES('WHITC','White Clover Markets','Karl Jablonski','Owner','305 - 14th Ave. S. Suite 3B','Seattle','WA','98128','USA','(206) 555-4112','(206) 555-4115'); +INSERT INTO "Customers" VALUES('WILMK','Wilman Kala','Matti Karttunen','Owner/Marketing Assistant','Keskuskatu 45','Helsinki',NULL,'21240','Finland','90-224 8858','90-224 8858'); +INSERT INTO "Customers" VALUES('WOLZA','Wolski Zajazd','Zbyszek Piestrzeniewicz','Owner','ul. Filtrowa 68','Warszawa',NULL,'01-012','Poland','(26) 642-7012','(26) 642-7012'); + +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(1,'Davolio','Nancy','Sales Representative','Ms.','12/08/1948','05/01/1992','507 - 20th Ave. E. +Apt. 2A','Seattle','WA','98122','USA','(206) 555-9857','5467',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FF0CB0C9000B090900000A009009000000000909A09A900B09000A90A00000000FFFEFFFFFFFFFFFFFFFFFCB9CFCFEFAFFFFFFFFEDFFFEDEFFDEFEFCFFFFDADA00D900009009009000000000090A00090BC0000900900000000A00ACA0E0E0E0F0E9CA9000A9CB0C00009090E0000009090B0000D009009000000900009A000FFFFFFFFFFFFEFFFFFFFFFCADEBDBDFDFDFFFFFFFFFEFEDFFFEFFFFFFFEFCAF0C9A0A0D00009A0000000000000009090A000B009A9000090000900C0900900900FA90ADA00090B00B000000009000090000009009A9B009009A00000000C000BFFFFFFFFEFFFFFFFFFFFFCF9FBCBEFBFFEBFFFFFFFEFDFFFEFDFFCFFEFFF9BC0B00909000900009000000000000900000909009A0C0B00000B00009A00E0E0E0EFCADA0C90000CB009000009A9A09A000B0090090900D00A9090009090A0000FFFFFFFEFFFEFFFFFFFFFFF0F0FFDFEDADFDFFFFFFFFFEFEFDEFEFFCFDEFEC0F0C9AC00A00A09000000090000000090A900A00009090000A00000CA00C09009090F900DA009A9000DA00D0000009C090000090B000A9A9B090000000AC00000BFFEFFFFFFFFFFFFFFFFFEDA9DF0FF9FFFFFFF0FFFFFFFFFDFEFFDEFFEFDFF9A9A0090909009000900000000000090A9000909A9000A90D090000A9000B0E0CACA0FAE9A9CA000A99A90B00000090B000909000090090D00009A900009000009FFFFFFFFFFFFFEFFFFFFEDADEBCFDEFFDADADFFFFFFFFFFEFEFCBEFDEDBEFCAD0D0E00A000000900000000000009009009000000009000A000090000000009A900DF090CA9009090E90900B00090A9009000090B009A09A90909000090B0009FFFFFFFFFFFEFFFFFFFFFD09E9CFBFBF0FFFFFEFFDEFFFFFFFFDFFDFEBFEFDA90B0A90900A9009000000000000000000000090900090A909000A0000ACB00B0C0E0AF0F0BC09000009ADA9090000090F0000900909009909A9A0900000000000FFFEFFFFEFFFEFFEFFFFEA9E9FBFDEDFFFDFFFDFFFFFCFFFFFEFEFEDFCFDEFC000D0000900000000000000000000009009000A0090090000B00900009000C00A09C0FF0F0BCA0B0A00090F0A9A900090B0900900090000B0D090A900009A000BFFFFFFFFFFFFFFFFFFFFD0F9E9F0FBEF0FAFCBFEFFDFFFFFFFFFDFFAFFAF9EFBC0A9C0A00909000900000000009000000000900000000B0000000A000000B0C90A00F0B0F009C0009000B009C000B00AD000B0099A909A90B00990000009C00FFFFFFFEFFFEFFEFFFFFCA90F0FCFFDFDFFDFFFDFDBEFFFDFFFFFEFCFCFDFEFC00900A9000000A090000000000000000B000900900000900909AC90000A9000A0C09CF00F00DA0090000909F0B909C0099A09009A00000090909A0090009A09FFFFFFFFFFFFFFFDFFFEE99CF0FDBE9EFAFCBE9EFBEFFFDEBFDBFFFFFFF0FEDF0A90AD0009009090000000000000000090090000000000009A00900090000DA0900A0AFADADB009AC900000009000A9009AD00090090909BCB09C9900090009AFFFFFFFFFEFFFEFEFEFFDACB0FDADFFBDF9FFDFDFDFDFFFFFFEFFFFFEFCF0FBED0E9009C0000000000000000000000000000000900000000009A00000090B0C00E9C00FDA90E9AC9A0A90A90A9A909AD009B900AD0A90009090B0A90000090BDFFFFFFFFFFFFFFFFFFFC09AD0B0F0BEDAFE9EFAFBEBFDAFDFFFDBFFFFFFFFCFFE9009A0B00000090A90000000000000090090000000000090009B000000000B0000AD0FADEB9E9000D00090090D0B099A9A0F09009009090B09099000000009EFFFFFFFFFFEFFFFCFFC0F0DAFCF9FD9FDF9FF9FDFDFEFFFFEFDFEDFFFFEFCFFEDE9E09000090000090000000000000000000090090000000099C00900000F000090000FDBADCADA900A9000000B009CA9C099A00B0090A9E900B00A0009009FBFFFFFFFEFFFFEFEFFC0B09AD09ADEBEFE9EF0FCBEF9FBDFFFFFFFFFFFFFFFFEFF000900090000900000000000000000900900000009009009A0A9000000900000ACA0AFAEDABF9ADA900DA9C909E9A99A9C9A9990900900909909900000000BCFFFFFFFFFEFFFDFFCBC0F0DA9EDBFDF9FF9DFBFF9FEDFFEBDFFEDBFFFFFEFFFFEC09ACB00000000909000000000000000000900900000090009000009000A0000000D0FDBEDACFBCBCBA09A0A00909AC9BA99E0A9A90090B00BCA9000000009BFFFFFFFFFFFFFEFF00909E9CB9EDAFCF0FEBCF0FE9FBCFDFFBFFFFCFFFFFFFFFFFE09009000000A0000000000000000000000000000000009A0909000090900000000BFFE9FDBC9E9BC900909900B09B0D9A0999C00090909A0909000090090FFFFFFEFFFFEFFFFC90A900B0DADBDFBFFDBDB9FDBFCFFBFFEDFDBFFBFFFFFFFFFE900B0C009090900900000000000000009000000900000AD090A0009A000000909A09F9FFEBEBEBDADBAD0BCA09C0BCB0BC9B00A9090B0F0990B000000000B9FFFFFFFFFFFDEFCA0C9CAD0DADBEBEDADBEDAFCBFCBDBCFDFFEFFCFDFFFFFFFFED00009A9000000090000000000000000000000000000090000090900000F0900000DAFEADBFDBDF0FAD0A9090B0B0090B0BD0B990000090000900000090090FFFFFFFFEFFEFFFD09A0090B0F0FDF9FFEDBFDFBCBFFFFFAFFBFFFBFBFFFFFFFFFFE09000000000900000000000000000000000000000000900900000909000000A9A9AF9DADAFCBFBCBF9F0B0F090B9A9C90B90E909090B909B0900000000090BFFEFFFFFFFFEFE00909AD0BCBDAFE9FDBCBE9FFDADAFDF9FDFDFFCF9FFFFFFFFFC000090909000B009000000000000009000000900009A009A90000000B09E0900C90FEADADFBF0DBDAF0BC090F90000B0B0DB90B00090000090B0000000009FFFFFFFFFFEFFF090C0AC9ADBDAFDBFEBEFFDFF0FFFFDBFFEFFBFFFFEFFFFFFFFEB000000A0000000000000000000000000000000000B090000009009A9000000090A9F0DFAF0FE9EBEBDBE9B0B0BC090BD09A9A9009A90090B000000009009BFFFFFFEFFFFDFC000A9090F9EFBDBEDBFDF9FE9FFBDBEFFFDBFCFF9F9FFFFFFFFD000000090009090000000000000000000000000009C0000A909A0000009009A00A9CFEA0D0FDBFBC9CADBF090D0B00990B09B9E90090B009090900000000000FEFFFFFFFEFEF00090DAF0F9EDEDBFCFBFE9FFADFEFDFCBFFFFFFFEF9FFFFFFFE90000900000000090000000000000000000000090B000009000000B0F0A0000F0D0BFDFFAFAFEDBFBF9E9EF0BA9ADA0A9C9AD09A0900090000000000000009BDFFFFFFEFFFFE0900A909F0FBFBFDBFDEFFFFDFFBDFBFFFE9FDBDF9FEFFFFFFFFC090000090000000000000000000000000000000F00000909A9090090909AD000000FBEFDFFDBFE9E9A9B9BD09DB90D09B090B909009000B090900000090900FFFEFFFFFFFED000D0CBCBDADEDEFFFFF9FDAFF9FFEDF9FDFEFEFFFF9F9FFFFF9B00000000090090000000000000000000000000B090009000900009F0AC00000A0BCFCF0BEDAFF9F9ADF0FFA9AB00B09E9A9A9E90090900900000000000000FBEFFFFFFFEDF009009B0F0FDFBFBFCBDFFEFFDEFEDFBFFEFBF9FBDF0FFEFFFFFE00000000000000000000000000000000000009F000000009BCA900B00909A0AD0D09FA9EC9AF9EF0ADBAD0BDF9C9F0B09090999A900A09000009000000000909FFFFFFEFFEFC00B0E0F9FFAFDFDFFFFAFDBFFBDFBDFCF9FCFFDFBFFBDBFFFFFD9A0000B0000000900000000000000000000BCB0B000009A0090009E9E0000900A0A0FFCBFEDAF9BFDADBBF0B0BB099DA9F0BCB0D0009009090000000000090B0DFFFEFFFFFF000099F0F0FDFAFEBDFFDFFFCFFFFFEBFFFFBDEBCF9FCBDADFFFAD0000000000000000000000000000000000090D000090090B009F09090B00C090D09FEBFCBADBEF0BDADA9FDBC9FA0B90090099A909000A00000090000000009AFEDFFFFEFC09090E9F9FBEBDFFFFBFFFFFFBDE9FFDF0F0FFBDFBEFBFFDBFFFF0900000000000000000000000000000000B9A9A00090090900FA0BCA0000B0B0E0A0F0F0BEDFEF9BCADADFA9A9A9099E99B0B9A900009009000000000000009ADFFFFDEFFDA000F0BDAFCFDFFF9FFCFFE9FFFFFFF9EBFDFFADEBFDBCBCBE9EF09A00009C000000000000000000000000090C0900900A900B0F909000900D000C090DFACFEDAF9F9EBDB9A9BDBDBDB0B9A90990D0B09009000900000000000909ADEFEFFFEF009009F0F9FBFCBFEFFFF9FFF9FCF9EFFDAF0FDBFD0FDBDBD9F9FF009000A00000000000000000000000000B090E9009090B9C9A00E090C00A000B0CB0FDB0F0F0FBE9CBCF9EDA9A9ADBCB9ADA0B0909A9000900000900000000009BFDFFFFFFC009ACBDAFDEBFFDFBDBFFFDEFFBFF9FAFDFF0F9EBFBEFEFADADBE9000090000000000000000000000000009A090000090B0ABD090900B0A900F0CB0E9F0EDAF9E9E9BBCB9EBBDBDBDB09AD0999090090009000000000000000009A0FFFEFEF00000DBCBDFBFDF0FBDEFFFFBFFDEDFEFDFADADFE9FCBDBD9FBD0BD0B0000CB0000000000000000000000009C90A900A90BC9D00A000B0009C0B09AC090F0B9ADADBF0BCBBCB9DADA9A90BDA9B0A9A09A00900090000090000000909DBEFFFFDE090DB0FBFBEDEBFFFFFFDADFDFBFBFBDFADBFFADBCBDADBEF90BD009000900000000000000000000000009A000900999A90B0A090B9C90F00BC0AC0B0EFB0C09ADA9FDBFCB9EBB9BDBDB90B9099C900990090000000009000000000ADFEDFEF0000A9F0FCFDBDFDFDFBFFFFFBEFDFCFADFBC9ADADBCBF0F90FBCBE9AC000AC0000000000000000000000009A090E90A09E900900BCA9A00B0090090009FDBB0F09F0B0B9BCB9C9E9B0BCB9CBDA9B0900B00090000000000000000090A9FADFEF0090E9F9FAFFBEBEBFDFFFFFFDFEBFDFBCFFEDBDADBCBDAFD0F90909000090000000000000000000000009009090099E900F00909909C900000A9A9E90FBCDF0BE9BDBDADB9E9BBDADB909BB090900090909009000000090000009090FEDFED009ADBCBE9FDADFDFFFEFDBDEDBFDFCBFCBCBDADADB0F9E99AF0BDA00B009000000000000000000000000900900A9B00909B09ADA0E00A00D0B0D0C0000F09BA9F9BCBB0F0BE9BBCBF9B0F9AD90B009090000000000090000000000009E9EF9E000D9ADBDFDAFFFBF9FFBFFFFFFFAFBFCBDBDADADACBDADBCF99E0D090000A0000000000000000000000000B0009000B09A000000900000000C000B00A9FFAD9CB0F9ADBBDB9F0DBF9ADB0B90B99A9A00B09090090000009000000090B9E9EF009A9ADBCBEBFDBDEFFFFDFFFBFFDFDE9FCBE0F9E9DBCB9F0B0DA99A000000D00000000000000000000900900009A90900000090900909090B09A0000900F9FABBDB0F9AD0BCB9B09AF9A9BCBBCBC90900900000000000900000000000009E9CF009E9ADBD9E9FEBFDFFFFFFCFDAFBFFFAFDBDADBE9CBCB0F0BE9E9DA09000000000000000000000000000A9090000009000000A000A000A000009000090FF9FDFBE9BF9BF9B9E9FBD9BD9CB9090B090900090009000000000900000090B09EB009C90F0FEBDFBDFDBFFBFF9FFFFDFCBCF0F0F0F0DA9E9CB0D0909A09000009A000000000000000009000900000909000000909000909009000000090DADFAFFFADBDADBF0F9E9BADBBE9AB09F9B90B0009B009000000009000000000000DAD0D0A09ADBCBDFADFBEFFCFDEFFFF9FEBDF9F0F0F0DA9E90BC9ADA9E0900000000000000000000000000009A009A9000000000000000000000000900900B0BF9EBFFF0BDA9FBDB9AD9BCF9B99B0B09E9009000000009000000000000000909ADA00090F9ADBDADFAFDFFFFFFBFF9FEBFDBEFCBDAD0F0F09E90F090990F0900009000000000000000009009090000000000000900009000000009A090A9BDBFFBDF9FFF9FFBDBEBDBBCBB9F0F0DB9B090900909090000000000090000000000009E00090CBCBFFBDFBFBDBFFFFFFEFFDFADBCBCBCBA9E9E90F09E9E0B000000000000000000000000000000A0090090900000000090009000900009A90BCB9FFEBEFFB0FA9FAF9FBD0BF0FA9B9A9E99A9A90009A000900900000000000000090BC909AC9B0F9E9EBFDEFFFDFFDFFFFDEBDFEBDBCBCDCBC9EB0DA90900D0B009000000000000000000090090900009000000000000000000000A909090F0BFEFF9F9BF0FB9FFF9FBCBBF9F99F9E90B9E90900090009000000000000090000090AC000009A0F9E9FDFDBFDFFFFFFF9FDBFDFE9DACBCB0A90B0D0F009E09A90000000000000000000000900B0900900000000000000000909009090B0F0B09F9F9FBEFC9F90FB9BF0FB9F9E9BFA99F99090900900090000900000000000000000909000900D90F9FAFBEFFBFFFFFFFFFEFFAF9FEF9E90F9E9CA0B09E090000090000000000000000000000000A00090000900090090900000A90B009090DBFBEBFFDFBFEBFF9CFDBF9FADBFBCBDBA9ADB0B0B009000909000009000000000000000000009A0BDADBDFFDBFFFFFFFFFFFFFDFFE9F0F0FA0D0A9D0CB0900B00900000000000000000000000090909000009000000000000900900009ADA9A90F9F9EFA9EDBDB9EBBAF9ABDBE9DB9B0DB9A99C9090009000000090000000000000009090000A90D0BF0FBCBFDFFFFFFFDE9F9EF0FF0F0F0DE9AD0A9A0F9E90D000900000000000000000000900000000000000000000009000B00909E909C9AF9E9E9F9FFAFBEFDBDFDBFDBF9FBE9E9B0BDB09A900090A909090000000000000000000A00909C9AFC9FFDBFFFFFFFFFFFFFEFF9FDADAD0DA9AC9E9C9C90000A090000000000000000000000009A900009000009000909000090090B0090B0BF9E9ADAF00BDBF9BBEBFADBBDAB9F9B9E9DA90B090090009000000000000000000000090900000B0D9BE9AFFDFBFFFFDFFFF9F9EFAFDADA9A9C0B00B0A9A0BD090000900000000000000000009000009000900900900000009A090A9C0B0F0F90F0BDA0BF0FADFFDF9F9FBCBFDBE9E9B9A99F90B090A90009009000900000000000000000000090B0E9FFDBFFFFDFFFFFF9EFEF9CDADBCF0DA9C09E0D0C9C0A009A000000000000000000000000090000000000000000009009009CB090909AFB0F0F09F0B0FFBFBFEBFBDBF0BDBBDBC9F0B0B0D0B09009000900900000000090000009090009A9C9BDADBEDBFFFFFFFFFEF9F0FBBDAF09E0D0A9E09A0B0B09C90090000000000000000000000900000000009009000000A0900B90090B0BBD9CB0F09EF9ADB9FFCB9FF9EBDBDBEDB0BB099F0909090900009009000009000000000000000090009ADADBDFFFFFFFFFFFDF9F0FBCDAF09E0B0AD00900D0D0D00A0900000000000000000000090009000900000000000909090A900A9A9C9FDAFA9BCBE9F0F9FE9BFFF9EBDBBEBF9BF909F0B09A9A9000909000000000000000000000000900009F0F9FBEFBFFDFBFFF9FBEF0F9CBAD0DA0D0D00D0ADB0B0A0B0900009000000000000000000009000000009000909000000090E9090DA9A9AD09FCB9CBE9AF9FFF9AFF9FBDBDF0F0BEDA9BCB90990B90000909000900000009000000090000000090F0DBDF9FBFFDFFFED9FF0F0D0F0BCB0A0F0A900C0C90D0CA9C00000000000000000000000000000000000000000090B0090A9CB09ADBDAF00BCA9FB09FE9A9FFDBFE9E9FBB9F9B9BC9B9CB00900B090A0009000909000000000000090009A9AD0FBFAFFFFCFBFCBDBE90BCB9E9AC9C9C900D0E90B0A9A9090A90000000000000000000090090000000009000B009000900090B90BDA9A90BD0F9FFD0BE9ADEBDBEF9FBFBE9F0FCBC9A90B0A99C90900909000000000090000000009000900D0BFBCFDFE9FBFEDBFDAD9EDA9E09C90B0B0CB0B00B0C9C00A09000000000000000000000000000000000000090000000900B90B0CBC0BCBCBDAF9FFFB0BDBDB9EBFDBFADBDBC9B9B90B9CB99DA0B00009000000900000000000000000000009AD9ADBBF9FFFF9FBDEBDBE9A9C9DA9E0C0CB00C090C90A0F0D0E9009000000000000000000000000000000900009090900A90E9C9B0BDB9E9FEDFFFFFF00ADADBDBEBDF9FAFFBCBCBF90B90F09909090009000900009000900000000090009009AD9FCFEF9F9FFFFF9FF0DF9EBCBC90B09009A90E90AD0900A900B000000000000000000000900000000000090000000B000909A09F0ADF0F0BFDFFFFF0DBCBF0F99FBEF9F9F9BF9090F0B909A090B009A009000009000900000000000000009E9AF0F9F9FFFFFDFFFE9FB0FD0F09E9C9A0D000090E90A0909090C090000000000000000000000000000000000B000B0009DA9A99E9F9A0F9FDFFFFFFB0B0BF0FBEFADBDAFBCBE9A9EB909C9AD9A90090090000090000900000000000000909A90F9FBFBFFFFFFFFDF9FEDFF0BDBE09A0C9A0D0B009000DAC0CA0090000000000000000000900000000090900900900009A009C9E9A9EBDBAFFFFFFDFF00DADF0F9BDBFBF9FBD9BDB9DA90B0900909009009000000900000000000000900000D0F9E9FDFFFFFFFFFBFF9FBCBDEBC9F0D0BC09A00DA00F0009A90B0A0B0000000000000000000000000000000000000909090B09A9AD0BDADF9FFFFFFFF0A9FA9F0FCBDADBE9FBE9E9A99F090B9BC0B09A900909000009090000000000000090B0ADBFBFFFFFFFFFFDFFEDFFDBDEBCBDAD09E09C0090009A00000C90C000000000000000000000000000000009A090000A00909A9F0BBCBDAFFFDFFFFFF09F09E9E9BDAFBF9F0F9B9BDAF09A900099000900900000909000000000000000000009DBDFFFFFFFFFFFFFFF9F9FADBDDF0F9ADA90E9A90CB00C9ADA900090900000000000000009000000000090900000909090BC90F0F0D9FA9FBDBFFFFFB09E9E9A9BFAF9F9EDBFADADA999A9C90B9A09B009A0000900009000000000000009099FBFFFFFFFFFFFFFFFFDFFEFDFFEB0FDAD909E900CA90090000000A9A00000000000000000000000000090000009000A000B00ADA9E9ABE9FDFBEFDFFDF00BF0BDAC9F9FBFBBCBDB9B9CBC90B09000900909009000090900000000000000000EBFFFFFFFFFFFFFFFFFFFF9F9FADBDF9ADACF09ADA9009E0B090909C0090A00000000000000000000000000A90900909090D0909ADB0BDE9AFB9EDBFFFFF000BDA9FBCBEDBCFBF9AFCB0B9A909B0909090B009000090000900000000000000099F9FFFFFFFFFFFFFFFFFFFFFFDFFCBDE9F9B0F0909CBC090CBCA0E0900AD090000000000000900000000009000000000000B00BCB0F90BDBDADEB0E9FCBE0009ADADABDBBFB9F9FDB9F90BD0BC090F0009090A90000090B000000000000000BBFFFFFFFFFFFFFFFFDFFFDFCF9EBDBDADF0FCD9ADADA09BCA9009090A09000000000000000000000000000000009009090B0009090F00F9ADE9A90F9EBFEB009ADBDAD9FADF0F0FA9BCB0F90B909B09099A900900009000000000000000000BDFFFFFFFFFFFFFFFFFFFFFFBFBFDDADEDB0FDB0AD09AC9AC090CBC90009C00B000000000000000000000090900900000A00090900BCB0BB0F0B0F0F0FEFC0F0000A0BDBE9FFBF9F9FADBD90B090B0090B0090A9009000B09000000000000009BFFFFFFFFFFFFFFFFFFFFFFDFDFDAFF9FBCF0BCBD9AD0BC90BCA900A0F00A90000000000000000000000000000009009090B000A090B9C9CB0F0F09AB0FDBFE90BC900BDBE9FDAF0B9F0BBE99F0D090B0090909090000900090000000000009FFBFFFFFFFFFFFFFFFFFFFDFFFFCBD9FE9FBDF0FCBE9AD0BCB09D0F0D00900009000000000000009000009000000000009000909C0B0DAB0BCF0B0BC9CB0ADAB0C0B0A9E9E9FBFBDBDE9F9C9BE9B0B09090A90B09A900000900000000000009FBDFFFFFFFFFFFFFFFFFFFFFFFFDBFFEF9F0FA9F9BC90DA9CB0DA0A09A0BCA9CA00900000000000000000000900090009A0A900009009A9CBCB9CBC0B0B0FDADF00BC0DBCBFBDAF9EB0B9B0BF09900909009900909000090900000000000009BFFFFFFFFFFFFFFFFFFFFFFDFF9EBFC9F9EDF09FCBC9ADA9CB0DA9E99E0D009009CA0000000000000000009000000000900090000B00BCBCB0F9EA90B0E9E9A9AF0000B00B0DAFDFF9FDBE9F90BCA99A9C9A009009009000000900000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9FF0F9A9DE09ADADBC9F0DAD09CA09ADACB00090000000000000000000000009000009000090009090F090E990F0F9B0F0F0F009C0BC9A9FBFBFFBE9F0BF9B99A0D0B0909A900B00900900000000000009BDBFFFFFFFFFFFFFFFFFFFFFFF0FF9E9F9EDDAB9E90B90E9A0B09ADA9C9E9090C9A00000000000000000000000000000B00A900009000B0B0E9BCACA9F0E0F0B0BB000A90A09E9CBDF0F9F9BD0F0DAD90B0900090900900000090000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EBF0F9ABD0F0F0C0F9CBD0DADA9E9A9CBCB9AD0DA90000000000000009000000009009000900A09A0D0BD0A9DB9E0B9F0BC90F0A09CB0DA9EBFAFBDBFAF0B09A9B0B09A9090900900000090000000000BDBFFFFFFFFFFFFFFFFFFFFFFFFFDBDAD9C9090D0F009E9B90AD0FADA9C9A9CA9000C0B0000000000000000000000090000000000000090090BC0A9DA0E9F9E00B0BEFC900BC0BCB9F9F9FBCBDBDB9F9090909C90000B0090009000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9A99A090909F090CAD9AF09E9E9ADA09E9E9A9009E900000000000000009000009009009000900090BCB0D0A9F9ADAD0F0F09B0AC90B0DA0DAF9F0FBCBCBCB0F9E9ADA909A9009009000090000000009DBDFFFFFFFFFFFFFFFDFFFFFFFFFDBE9C90D9D09A0009E9B0AD09E99E9E90DBC9A9C9E9E00A000000000000000000000000000000000090A009CB09DA0FBF00B0B0F0D00B00F0A9FA9FAFBF9FBF9F9F0B909090BC9090090000000000000009FBFFFFFFFFFFFFFFFDBFFFFFFFFD9FC9F9BDA90BC9D09000C9C0F09E9F09E9A0BCBCA9009090D00000000000900000009009000000900000909A009A0BDBCA9E09E900A09FCB0099E9CBF9FDADBDB0B0B9E90B0909000090000000000000000BBFFFFFFFFFFFFFF9FBFFFFFFFDBDFF9F90D090D9090000909A9B0BCB0F0F0F0D0909DACBCBCA0000000000000000000000000900900009A900E90DA0F9E9E9F09E90F0D000B0F00A9BF9FFAFFBDAF9F9CB9BD09A909A9009090000900000009DFDFFFFFFFFFFFFFFFFDFBFFFDBDB99C9E909090090909000090C9CBDF0F9E90BCADA009000909C00000000000000000000900000000900000900B0999E9E9E0DA9A000B0009E9E90E9FADBF9FABDBE9A9CB0B9090B090900000000000000000BFBFFFFFFFFFFFFFF9FAFDFFDBD0D009990F9CBBC9E0909090090A90ADBCBDBE90D0DAD0F0F0A0B00000000000000000090000000000009090A909A0E90F0B9A0F0C900DA0009E9AC9A9FBFDFBDFADBDF9B0F9CB090900009000000000000009BDFFFFFFFFFFFFFFFFFDBFF90009A9FBEFFFEF9CBE0900000000090F9ADBCBC9E9A9A90B0909D000000000000000000900009000009000000090BC909ADAD0E9C090000A9A00B0BDB0BCBDEBBFFBDBFA9B099AB090DA9090000000000000000FFFFFFFFFFFFFFFFFDADAD090099BF0FFFFFFF9AFF09E0F00000000090F9ADA9A9C9E9CB0CBC0A0F000000000000000000000009000009009090F0B0DAD0F0E90B0E0000F00009ADADE9BFBFFDF9EBDB9F0F0BD9DA9090009090000000000009BDBFFFFFFFFFFFFFFFFBDA900000FDFBFDBFEBC9E9E0900000900000ADAFDBDCD0B09A9CA90A9C90000000000000000000900000090000000DA090DA09A9009A0C9000009FA90C09A9BC0FF9FAFF9FADFB9BD0BA99A909900000000000000000BFFDFFFFFFFFFFFFFF9FF9CAD0090B0DAD9BD0B09090090090000090909ADAABCBCBC9E9DAD0A9E9A0000000000000000000900000090090B090A90909DA9E0D00000000E900A9AC9E0BF9FBFFDBFFDBADE90B9DBC90B0A9000000000000000BDBFFFFFFFFFFFFFFFDFF9E99909090999000090900090009000000000BC9ADD9AD009A90A9A9C900D000000000000000000000000000000A000F09ACB0A0C900A0009009B0A90009A0BF9EFFCFBFF0BD9FB9BD0B0B9090900900000000000009FFFBFFFFFFFFFFFFFBF0FFFFFF99090F09BD99C900900990009A90DAD00BDB0AD0BDBC9E9C9E0A0F0A00000000000000900000090000009090909ADB090DB0B0C9000C9EF90A9ADAD000FB9FBDF9FFFAF9BCB0BDBDA9E909000000000000009B9FDFFFFFFFFFFFFFFDFFBDBFFFFFDF99BC909A909D0BC0C90BC0DA090BD0BCBD0F000A909A099C909000000000000000000000000000B0000A0BCB0000B0C0090000B0F00FA009A9AC909EFFFBFE9FBDBCB9DB0B9A90900B000000000000000FFBFFFFFFFFFFFFFFFF9FFADFFFFFFFFFDBDBC9FDA9C9B9ADADB00D0E00AD0BCB09F9C9E9E9E0A9AC0F0000000000000000000900009009090909ADBC90C9A9CA0A90CBCBF00B0A00A9A00B9FADFBFBDBFBDA9AD9ADB9A9090900000000000009BFFBFFFFFFFFFFFFFFFF9FFBFFFFFFFFFFFDFF0BDFBDE0D0900DA0B09F9ADCB0F000B0909099C0D0B0000000000000000090000000000000009A9A090A9AD0B090CA90A090B000B0D000B0FFFFBDBCBF9CB9F99ADBD090D0000000000000009FFDFFFFFFFFFFFDBFDBF9FDBDFFFFFDFFDFFFB09FCBCB099E9E9A9AD0F00DBB0D09E90D0F0F0E0B0B0C000000000000000000000009009009A9E9C909A9000BC0CA0F0E90FA00A90B0BC00DBFF9EFFFF0FBDA9ADB9B0F909A909000000000009BFFFDFFFFFFFFFFFFFFDEBFFFFFFFFFFFFBFFC9E9BDBC9E0900D0D09A9DBAC0F9E99E9A090090900C90B00000000900000000000000000000909ABCB0C00F09A9ADFAF00B0DA90A00B0B0A00BFF9F9FBFDA9F99ADADB09A900000000000000009FBFBFFFFFFFFFFFFDBF9F0F9FDFFFFFFFDFFFF9E9F0B090A9B0B0F0DA0D9BD0A9E909CB0F0CB0F09AD0000000000000090000000000900900BC90909A99000D0AFFDFBC0FA90A90B0DAD09ADEBFFEBDFBFF0BC9B9BBDA909090000000000009FDFFFFFFFFFFFFFDFBFDF9DBFFFFFFFFFFFFDBD09F0D09E9C0C90D0B0DB0F0BFD090F090D09A9C09E00BC0000009A0000000000000000000090B0F09E90A09A0BDFFFECB0B00A00A00B0BCA09BDE9BDFBFF9BDBB0DBD0909A900000000000009BFBDFFFDFFFFFFFFFFDFADBFCBFFFFFFFFFFBFCBE909E0000B9AD0B0DB0F09C90B0F00BCB0A9C0B009F00090009000000000000900900090BCBDA90F09AC90CBCFFFEDBCACB00B09A9AF0F0F0FBFFFA9E9FFEB0DBA9BF9E9009090000000000BDFFFFFFFFFFFFFFFDBFBDBC9BDBFDFFFFDFFFDBD9E9009090000B0D0BCB9CBBCBC90BD090C90B00DA0009C0090A000000000000000009000090A9CB0BC0BCB00F0FDFACB0BCB00A00090B0F0F0F9FEDBFFBF9FB0DBCB09909A00000000000000BDBFFBFFFFFFFFFFFFDF9FBC9BDFFFFFFBFDFBFF99E9000090C90B0D09CB9C9BDBCBCADA9BC0D0B09E90A909E09C00009000000000000090B0990BC9CBC0BCB0BF0E9F9E0EB00A0A9A0A0F09AF0FBDBCB0F9FBDBB99FFB0B0990900000000009BFFFDFFFFFFFFFFFFFFFF9DB9CB9FBDFD09B9FDB0F9000000090009A0F90F9E9E99CB909C09B0090C90E90B00900B000000000000000000009E9E90B009ADA9E00BCA0A09900B0900009A9A009FADAFF9FFFFDAD0FFB90D0900000000000000BDBDBFFFFFFFFFFFFFFDBDBE9CBDFFFFF99F9FDB0FD0E99A909A90DBC990F9E9CB9EBD0CB0B0C0F0A9A09000CB09F000000000000009090909E9A90B0CBCBCBCB0B0B0F09AFB000A0A0A09AC9E09FFFDBEDAFBFFBF9A9FB9AD0B0909000000009BFFFFFFFFFFFFFFFFFFFFDF9B0909FFFFFFFFFFDBFBDAC90F0DA0009F0F0F9FBDE9D0B9C9CB090C9009CADA90E009000000000000000000B09A9EBCBE9ADACB0A0CA00A000FA9009090A09A09A09AFADBBFDFFBDBF9F9E909009000000000009DBDBDFFFFFFFFFFFFFFFFBDFDF9F9FFFFFFFFFFFDADB9AC90B0D09A90BDBCBC9ADA9FCB9A9CB0B009E090090909E0F000000000000000900BC909CBCBCF0B0E9CB09A90B0F00A0A0A0A90A0B0090F9FFFDFBFBDFE9FBE9F9A900090000000000BFFFFFFFFFFFFFFFFDFFFDFBF0F0F9FFFFFFFFFDFFFCD99E9CB009C9E9ADBDBFDBDBA9C0DB09C09E090A90CA09A09009000000009000900909ADA900FFACF0B0A00A00A0090B00900900A090ADAF0FBCBFAFFFFBDBDBDB90909A900000000099F9FBFFFFFFFFFFFFFFFDFFBFDF9F9FFFFFFFFFFFFDB9B0E9CB00B09E9FDADAD0BCBC9DBDB0CB0B090B0D0A909E9D0F9E000000000090009A9ADA9ACBDADF0B0F0B0BCBCB0FA0A0A0A0A090A90B09ADBFFDFFF9FFBFAFBF0B0900090900000009BFDFFFFFFFFFFFFFFFFFBFDFBFFDBFFFDFFFFFFFFFEDE99AD0C90DA9DA9FBDBFDF9FEBCBC9BC9CA9C000D009090A90000000000000000B0D09A9C0BDADA0FCA00E9E9E9EA0F909009000A00A00A900CBFBF9FF0FFF9FDBFDBC9900000000000ADBFFFFFFFFFFFFFFFFFFDFFFDFBFDBDFFFFFFFFFDFDBDE09A9009ADA9F0DAD0B0F099DB0F0CB0900BCB0A9CA00B0F090F000000000090009AD9ABDAFCADA0BDBB0F0FAFDFF0A0A0A0A9A09A09A9E0B0BCFFFFBFBFDFBBF9B09A09090000000099FDBFFFFFFFFFFFFFFFFFFFDFFDFFFFFFFFFFFFFFFBDA9DAC0B0BC90F0FBDBFDF9FFE9E90F90DADA090900A9C90D0BCB000000000900090B0BED0BF00900F0A0CB0F0D0EAB00B09009000A09A000900FFFBFFFFDFBF9EDBCB909000900000009FBFFFFFFFFFFFFFFFFFFFFDBFFFFBFFFFFFFFFFFFFDE9DA099C9CBBFF9E9DADABCB090F9F9ADBC909CAC00900009AD00090000000009A0B09F9AFC0D0EBDA9ADBACBEAFBDCB00A0A0A0A090A0B0B0E900FFF9FFBFFBFBBF9AD09090000000009BFFFFFFFFFFFFFFFFFFDFFFFFBDFFFFFFFFFFFFFFFFBDAD9E00B09C90F9EBDBFDBDFFF9E9AD909ADA099A0090B0000BDA00000090000900FADAD0B0A90C0F09A0DB09000ABCB09009009A00900B0B0EB09AFFFFFBFDFDFBDB9A9A0909000000099FFFFFFFFFFFFFFFDFFFFFFDFFFDFFFFFFFFFFFFDFCBDA09B9CBCBF9E9DADF0FDA9DAF9EDAE9E90DA0C900000909009C900000000900909FADAC0090B0B0F09A00E0BC909A00A0A0A0A00A0A9A00B00CADFBFFDF9FBF9ADBC99090000000009BFFFFFFFFFFFFFFFFFFBFDBDFF9FFFFFFFFFFFFFFFFBDADBC0CB0B09E9EBDB0F9ADFAD9E9BD9E9ADAD0B00000000009A9A0000000000B0DB09A9A90CAC0F00BC9AD0B0A0AE90A0B090B09A909A09ADADA09BDFBFBFBF0BFFB90A900909000009CBFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFDFCBC9009B0D0DE9F9DBCFDADFA9DAF9E9E9AD09A90C00000900909C0000000090909ABCBC000A090B00B00A90B009A99E09000A00A00A0A0B0B0A9000EBFFFFDA9F99B0F99090000000009BDBFFFFFFFFFFFFFFFFFFFDFBFDFFFFFFFFFFFFFFFFF90F0F0C9ADB9E0FEDB0BDA9DEBD0F9E9ADABC9E9A9000000000A9E00000000000F9CB0BC00D00009AC9ADAC0F0E00A9A0A900B09A9009A0A0B0E9090DBFDBFF9BF0DB9E9DA90900000009BDFFFFFFFFFFFFFFFFFFFFFDFFFDBDFFFFFFFFFFF9EFF090B0D0ACBDB9BEFDAFDA99EBDADBDE9DA9E9C000000009090909000000090B0ABC0009A000ACA0B09A9A9A90B0DA090A0A00A00EB0CB9CA90A000BFFBFF9E90BB9E99A9000090000909FBFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFF90F0D09A9DBC9EFC90BD0BDE99CADACB9E9CB09A900000090000BC000009090009D0B009A0090090900E9EDAC0AC0A90A00090A09A900B00A9CA0900BCBDBFFBDB90DB9A090090000900BDBFFFFFFFFFFFFFFFDFFFFDFFFDFFFFFFFFFFFFFDE9CF09A0A9DACBAD09BFECBDA9ACBF9BDBCBCBC9E9C000000000A9C9A0000000A9B0A00CB0C900C9A0A0A9A9A09A90BDA00A9A0A9A00A0B09A9A09A0909FFFFBF9AD0B90F99090090000900B9FFFFFFFFFFFFFFFFFF0FAFDBEBDFDFFFFFFFFFFFFB0D00D9CADBCDADAC099BC9EDB9CBCBCBCB09E9A000000000909A0C0000009000C9A900000A9A0009090DAC9E0A00AD0B0000000B09E0EADA9A09A0000BDADFF9B909B9ADB090009000990F9BFFFFFFFFFFFBDBE9FDBCBDDFAFBFDFFFFFFFDBCDB0B0A0B009A9DADBCAC0A900FA9CBCBDADFA9C9E9000009000C9B00000000090B0C0BC0B0C09A0A0A0B09A0090B0F0A00B0B0B00EA0B09A0E90ADADA9AFFBFBE9E9A9C9B0900900000009B9FFFFFFFFFFDFDFF9F0BC90A90D9EDBFFFFFFFFFFBC00D090C9E0CA900909090B90DA9DBC9F09CBA900000000090B0C900000009A900B000900B0E0900090A9CB0A0000B00A000000A909ACA9A90A9A900CBDBFDF9990909BC9A9000000099F0DBFDFFFFFFFFFBF0FCBD0BC90F9ADBFFFFFFFFFCBC9090AC0B09099C0BCBCAC0C0CB9EBCBAC9EBC9CA000090AD0A9CB00000090000CB09CB00F009A0A9A0AD0A0BC90AF0B090B0A0B0A0E0B0E9A99E9ACB00BDFAFFA9B0B09B909B0909000099A9BFFFFFFFF9FDFF9BDAD09A90090F9FFFFFFFFFDAC0A09090009E0AD00090B090B0E9CB0DBAD09E9C900000909CB00B900000909A90CA09E9ADA09000909A9AD00A90BC00A00A90090A90E90A0EB0F0BCBC9ADBDBDAD09CB0BC0900000909A9DBCBFDBFFFBFFBCBC009000909ADB0F9FFFFFFFDF9900D0BC9CB09000090000000090B09E0D0BCB0B00000000A0B0F0C000000000DA9BDA0000A0A0A0A00A900A900A0CB0A09A00A0A09A09AD0B00A0B0B0B0BFFBFF99B0909DB900900000909A9BDBFFDBFDF0F0909E0A9C0B0D09DBFBFFFFFFFACA090A00B00DAD0B00000000090009E9B0F0BCBCB0000009C90D00B000009A09A9CA09CBE909009090B00AD0E0BC9B0B00A09A9009A0BE0ABC9A9F0F0F0D0BDBDBCB09B09A9A090900909B99BF9FBDA9DB0909E0000D009C90ADB0FDFFFFFDAD909E090900F0000C00C0090000090F090E90D0F0C000009A00DA90900000009A9CB0F0B0000A0A0A0A00A90A9A00AF009A9A00A0A00000BC0AAD0A9AA0B0F0BFBFB9F0090909B000000009AD09EBDBDA0090FFF00C0000A009009FBFFFFFFFFA000900C0090BC000000000000000009E09EB0F09A00000009A90000000009009EBC90F0A9A00090000A90EB0009E90FA0009A0090A9A000B09A0BCBD9BCB0F9E9FF9B90B09F00F090900909B9999EBD90009BFFE0000AC9E009009F9FFFFFFDFDA009A90000EF0A00000000000009A09F09CB0F0D00000090C0F00F0000000BC90BF0AD0000B0A0B090A900E9A0A0F00B0A00B0A00009A00E0CB0B0AACB0BCBFBF9EBF9090099090000009090BCB9FBE900009C09E0000009009BE9FFFFFFFF09090C000B09000C0000000000009A9CA0BCB0CBCA000000009A0090000090909AFC0E9A0A0B000000A00A0B00090009A0A09A000B00A0090B0B0A0CB990DADBDBFFBD90F099A009A909090B0BDB09FF9D0B0000000000009000BC9FFBFFFFF0F0C00B0090000000000000009009C0CB09DA9CB09000000009A0900900000009AFCB090009000A9A0A09A0900B0A0BFA909A009A00A900A0A0CA00B00EABADBAFDBF9FA9090009A090000090D90BDB9FFA90FF0000000090009F9BF9FFFFFFFF0B0B009C009E900000000000000A9A9CBCACA9CAC0000000009C090A000090B0F9000A0A0A0A000909A000A0A000009E0A09A0A0B00A09009A90F00B090CB09DBBFFF9FB09B090900B090909A99090B9FDF909E9C00090090000FD0F9FFFFFDFE9C00909A0000F09000090900A90C9A90B99CB90B000000000B0000900000090AF00C90900909A0A0A0A9A0090A9A0F0B00A009000B00A0A000A00A00A9A9AFADFF9FBF9F09000090090000B90F9F09FFBEDA909A909000009BDBEBFFFFFDFEBD0B09E0A9C09000E09E000009C0E9AC0F0CABCAD00000000000DAD900000900BD000A0A0A9A0A0000090009A0A00000B00A09A0A0B00A00900B00B09A9A9AD09FFBFFFDB09090900090A9099090B0B9F9F9BFDAD00AC0909BADBCBDF9F9FFFBD0BC0090D090000909009A909E9A90D9B0CB9C09A000000000009A9E00009A0BC0000909A9000009A9A0A00A00090A0F0A09A09A9A0A909A0A00B00A0A00E90B0BFF9FBFFB90B000900990000B099D90BFFFDEBFBFF99BCB0D9E9F9BCBFFFBFCFAD0F0000A0F0BC00A900CADA90D0F0AC0BCA9F0C0000000000009F0000000D09A09A0A000A0A9A000000A900B0A000AD0A00A000F0CAA0009A00A0909A90BE9F9FFFFFBDFA909900000A99909B0B0B99B9FBDF9F9FEF0BDA9E90BC9BDADFF9F9DA90F009000009A9CADB9CBCAD0B0D9AD09E00B00000000000000000000900BC0009A9A0B09000A0A0A90A00000A009A90B09A9A0BA9CBA9A0A90BCA00A009AB0FFBF9FFBD9B009090090A090D099C0BDFBDBDE9E9909009009F09E9ADBFCFFBE9F090F0090000009000E9E9DAF0F0AD0BC9DAC000000000000000000000A90B00CA00CB00AE0B090D00A09A0B009AF0A000A00ADAD0A000009CA0A09A9A9EBC9FBDFFFBF0BC9B00009099909A9B09BDA99CB09A9000009009A09F9BDFBDBFBC9FCBEF090009000000909009A09C9AD0BCB0A0900000000000000000009090BC00B0B0B0CA90900A0A0A90A00000A0AD0A0A0A90A0AE9A9A9A0A909A0000A90BBEFFBFBDFF9B909000000BC90990B9099EB90B09CBC9CBC9E9DBDADF0BDFFFDFE9BD99CBCB00090090A000B0D0F0BCBC0BC0DA000000000000900000000B0F00CB0C0A00B0A0A0A0B0BC0AC9A0A0009AB09090A0909A0CA009A0A0A9E0B09AF0DBFFFFFBFFDAD0B90000909A9A99CB9AD9CBC9CB09A990BF9A9ADB0FFDAFDAF9FCBEFADADCB0F0DA09C900C9A90F0F0BD0B00D00000000000000090009009AD0A0B0B0F00E90DA90000B00A00C9ADABC0A0A0A9A0A00B09A0A0F0BC00B0AC00BA9FBFDBDFBF9B90D090000B909CB9099BFB9B090F9C9AFDAFDFF9FF9EBFDBFDFBBDBDFBDBBDF0FADBE0E9F0ADFE9F0F0AD0DA0000000000000000000900F0F0AD0A00A00B0A0A0ACB0E0A90B0B00A0F0A900B000B00B0AA0F09000A0B0C0B0F09FFDFBFFBFDF0A9A0000099C09B90B0FADBCF0BF9E9BFDBF9F9BCF9F9F9BDFF0FCFDE9DEFCF0FAD9E9F9BCBDF09F0F09DA0B00000000000000000000009090000A90B09A009A090B0A9A9CA0A00A900B00A00A9A0A00A0900A0A9A9A0A9A0A0BE9FAFFDBCBFBD909909A009B900BD9999BDB9D99F9F0DBFDFBCFF9EFFDEFF0FFDBFBFEBF9F9F9DEBDF0FCBE90FE0F0BCAD0C0000000000000000000090ADAD00B0CA0CA09A000A0000000A0900B0CAF0B00B00A090B09A0AB000A00900A900909A9FBFBFBF9EBF0BC909000099B0B0B0D9BDABCB0F9B0F9E9FBDBF9F0F9DBF9FBCFDBDF0FEDAF0DEBCF9FDFFF9F9E9E9B0B000000000000000000000A90B000A0B09A90A00A900A00B0A09ACB0CA90BE00A0A90B0A0A00B000B000A0A00A0A0A0DADFFFDF9FFDBD09A009A99AC0999DB0BCBD9B9F9C9F9FBDBDBCBF9FBFADFADEBDADADFDBFDBFB9DBFCBE9E9E9E9E9C0D000000000000000000009009AF09AD000A00A9A900A909A0090A0A00B00AD09A0900A0A9A90B009A000B0090B009A09A9BFBDBABDBBF9A9090099E99BDA9A9099B0BCBCB9BF9E9FAFDBFCBDAD9F9DFBDBFFFBFBEDBCFCFEFCBE9F9E9E9E9CA9A0000000000000000000000DAD00E00B0A90A90CA0A0A0A00A0A0090A0A90BA000A0B09A000A00A000A0000A000A090A0BC9FFFFDBFDEBDB0090009A9099F9B09E9F99BF9E90F9BDDB9E9BCBDAF9EBC9FCBDBDEDFADBDBF9DBFDADE9F0F9CB9C00000000000000000000009A90F009A000A00A0B0009000A9000B0A9090A0CBA90000A09A0B0B09A09000A00A090A00090BCBFF9E9BF9FBFF909A099F9A9A9D09090F090B9F9BCFB9FF9FDBDBDAF9FBEB9FEDBFBDFFEBCFEBCBDFBDADBCBACA90000000000000000000000A9E9E9AC9A900B0000A9A0A9000A90000A0A000BC9A0A9000A09A00A000A0A900900A000B00A09BDBFFFDBFBDBDAD09000B0DB9FB9A9099BDBD09ADB9EF0BDBADADF9DADF9FEF9FCFDFADBDBDBDFBE9EADBCBC99C00000000000000000000090D09A000B000A000B0A000090A9A00A9A00009A0F0A0000A0A90A00B00A00000A0A0B00B000B099EFFFBDABFDAFB99A90099FB0DB0090B0F09A9BBDB9F9BDBCBDF9F0BFFF9EDF9EFBFAFDFDEDAFE9EDBDDBCBC9E0A00000000000000000000000A0BC9CB00A0000A0090A9A0A0000A00009A0A009B00B00090A90B00A90B0A00000000000A000A09A9FFBFCBFF0FFADA99A09DBA9F900099F9DAD09E9E9CBDBDA9E9FF0F0FFBFF9FDFDBFAFBFDBDF9EDABCBC9A9C0000000000000000000000909F0BA00A09A9A09A0A000900B0A090A0A000000E9A000A0000A00A90A00090A090A0A0A09A09000DBFDFBFDBDF9FDBDAD9E0BDDB9F9900B0B99B9F99BF9BCB9F9BDADBDF9FCBFFBEBFCFDFDAFCBEF9FDE9E9EDA909000000000000000000000A09FC0B00A000000090A0A0A0009A00900A0B0A0BF0B0A00A0000B0A09A0A0000A0090090000A0B9A0BFFFFBFFBE9FFADAB990BA9EB0B0909DAF0B0FBC9DA9BCBCFBDBCBBCFBDE9FDFDBDBCBF9FDDBE9E9F9E9AC0A000000000000000000000909E90BCA900A0A0A0A0090000A0000A0A9000000E000090090A9A0009A0900A0000A00A0A0A00900C9FFBDBCBFFDBFBDBD09E9BDFB9D090B9A999CB909BA9FCBDBBCBCFBCFBDFBFCBFAFFEFFCFFEBE9F9F0E9AD0D000000000000000000909AC9EBCA00000A900900000A00B0000A090000B0A9AB9A0A0A0A00000B0A0A0A00B0A00000000900A0B000FFFFFFBFFF0FBCBDB9E9B9F9A909CBD9E9BDA9E9D0B9F9EDBDBFDFBDAFCFBDFF9F9F9F0F9FDEFADF9EDA0A90000000000000000000090A900C0B0B00000A000B0000000A09A0A9A000000CB09000000A0B00009000900009A0B00B00A09009A90BFBDBDBFFFDF9ABCB9E9E9F9E9A90BA909AD99A9F0F0F9BCBDAF9EFDBFDEBDCFEF0FFF9E9F9CFADA9ED90C00000000000000000000090BC0B0000A00A000A0000A00A900000000B00A00BCA0A090A00000A0B0A9A0A00000000000A00A09AC0BDFFFEBDADBFAFDF9F0F9FBCB9099BD9F0990BE9F0BD9BCBDBE9FEBDAFDBFDFBF9FFDADEFF0FF9FADE9ACB00900000000000000909A00BCA000A0A09A00A0900A0900000A0A9A0A00A900DA9000A09009A09000000000A0A00A0A0009000A0900BF9FBDBFBFFFDA99A9B0F9F9E90BCBE90F0BC990BD0BE9F0F9FDBDFF9FE9FAFDFCFADFBD0FF0F0DF0BC900000000000000000000009DA9009A9090A090000A0000A0A0A000009000000AB0A0A000A0A00A0A0A9A0A9009000900B0A0A9009AD00FFFFFCBDBDFBFEFDADB0FBF9AC9B99A99099A0F90BD9E9F9EF0FF0FE9FEDFDAFBDF0FCBFA9FCBF0BCB000000000000000009009C90AD0CA00A0A0000A9A0000A00000090A0A0A9A0A00CF090B0000000009000090A0A00A0A00000000A0000A90BDBFF9EBBCF9FBFDADB9DAF99ADAD9A09E9990BD0ADB9CF9BF0FF9FF9FBEFDFCBFF9FCFDE9FCBCDAC9E90000000000000000A00A90A909E9000B0A00000A090A9A0B0A090000009000B00A000A900A9A0A0B0A000000A9000B0A9A0009A9AD00BFF9FF9FDBFFF0FBDBCBBDBE909B9AD0B9A0C900B9ADAB9EDFF9CF0FEFDBDADBFCBCBF9EBEDBDBAD9A0000000000009000009009CBC0AA0A0B00090A0A090A000000000A0B0A0A0A0ACB0000A00A00000000000A90A000A9A000009A00000009E9FBEBFCBF0F9FDADAFBCBF990F9E90909C9B0E9D0DB9CFB0F9EFBFB9DBEFFBFCBDFF9EFD9F0E0D0AC90090000000000900900B0B09AC909A00A00A90D0A0009A0B0A9A0A009A00000BCA9A09000B000A90A0B000009A0000A0A9A00A0A9A9C09BDFDF9FA9FAFBFFBDBDBD0FA90B99F0B0000990A9B0FB0DF0FBDCFCFADF9EDBFFEBCFBDAF0F9DAC9000000000009000090A09C0DAC90A0A0F00B00A0A00A0A00000000909A000B0B0B00000A0A000A90A000000A00009A0909000A090000A900EBFBFFBDB9DBCBDFADAFB9FDAF9E900DB09000900C90DB0BF0FBF9BDFA9F9FCBDDF9EDBDADACB9B0F000000000000900090CA9A09A0D0BC00A00A90B0A9090A9A0B0A0A0A0A9A0000CB0A0000900A00000B0A0B00A0A000A0A0A900A0A0900A09CBFDADFCFBC9FAFDBF9FF0BC9A9A9F0000A90009B0DADBC9F9CBCFADFDEFAFDEBFEDBCF9E9F0C00009000000000000B00090009E0CA00A9A90A0A0A00E0A00000009000090000A0AB0000A000A9000A9A000000900000A0009000B0090A0A900BFFFBFBFA99EBDBFE9FE9BFDBDAD90009090009B00B0909EBCFADBDADAF9F9EBDADBEDBCBD0A9090000000000909A900A90A9DA90B00B0000A09009CB009A0A0B0A0A0B0A0A0B090CB00009A0000A900000B0A0A000B000B0A0A0000A00900F909FFFDFBDEF9CBCBDF9BFDB9EB900A9000090000D090CBC9CB9DBCBDBD0F0F9EFDEF9F0F0AC9CA09000000900A000009C09C0A9E00B00A9A090A0A0A09A0009000900000009000A0BC0A000000A00A0A0B0009000A000B00000900A000A09A00E0BDFBCBF9FAF9BFAFFDBFEF9CFBC9009000000B000B09A99CACADADAF9FDAD9A9F0F0F0D90A9000000000009009C90A90A909E9CACB00A0A00009A0A00A9A0A0A0A9A0A0A0A00009A900A000B000009000A00A0900A000A0B0A0A90A900A09A909AFFFDBFFDBE9FDBCBE9F9EB909A9C0009000090000000E9999ADAD0F0ADAFDE9F0F0F0AC9009000000000009A00B00090BCBCA900A00090A9A00900B000090000000900009A0AE000000A0000A9A0A0A90A00A00000A900000000000A09A0090FDFFBEBDAFDFCBFFF9FBFBD0F090A009000090090909090ACAC909A9ADBC90B9E9F00909000000009090909009B0D0F0F0F09000A909A0A00000A0A000A0A0A0B0A00A00A009090A0A09000A000000000009000B0A900A0A0B0A0A000000B0E00BBDFFDBDBFBFFDBFFFCBDAB0BC09000000000000000009090BCBC9C9009E9C090090E00000000000000ACA9E0C0A90B0F0BC0A900A0000000B00900A0900090009A00A9000A0E90000A00009A0A9A9A0A0A0A0000A000900000900B00A0090B0CBFBDFEBDEDBEBF0FBFFFDF90B00B009000900000000000090000A00F009A9E0F0E90900000000000B090909B090F0F90000000A00A9A09A00A0A090A00B0A0A00009000A000BCA90000A9A000000000900090A0000B0A0B0A0A0A00A90A000090FFFBDFBFBDFFDFFFF9FBE9E909000000000000000000000090909000900090009000000000000900C0BCB009E90900F0F000A9000000A0000900A000A000900A0A0A0A09A0CB00A0A000000B0A0A0A0A0A0A090A0000000090000000000A9A0F9FBFFBCBCF9FFF9F0FFF9F99E00909A0000900000000000000000090009000900000000000090A099B090C9E90BCAF0900A0000A00A0000A0A0A090B00B0A0A90000000000B0000090000A000090900009000A09A0A0B00A0A0B0A000A9009000FFDFFFFFBE9BFFFFBCBFBCB09000090000000000000000000000000000000000000000000009C9A0000A9A9AD0BD9AC00900A09000000090009A0A0A0000900A9A009A0A0CBA0A00A0A09A0B0A0A0A0A0A900A009000A900000090A900A0A0909AFBDFBDFFEDAFFFFFFDFBCBCB00000000000000000000000000000000000000000000000000009E9C9C9C09AD0AC0B000A0000A09A0B0A0A0A09009A0B0A000009A00090BC090000900000000009090000E900A0A0000A09A000A00A00009A0E9FFFBFFBDBDBDBFFDBEBDB909C90090000000000000000000000000000000000000000090A9A9090BA9AB9E9EBDA9C0A0090A00000000009000A0A0000000B0A0A00A0A0C90A00A00A0A00A0B0A0A0A90A9A0B0009A0A00A00A00000090A00090FBDFDBFFFFCBCBFFFDFFBCBCA000009009000000000000000000000000000000000009A09C90F0BC9DADCB0900C0B0000A09000A0000A00A0B00900B0A9A00000009000BA00A90A0000090009C0000A00000CA9A0000900090A0A9A0A000B0A90FAFFFCBFFBFFDBFFBF0F9B090900000000000000000000000000000000000000000000F0B0F0F9BEBDBB0F0F0B0000B0000A000A0A09000000A0A0000000B0A9A0A0A0CB0000090A09A0A00A0B0B00A9A0B0000A9A0A0A0A090000000B0009A09FBFBFDADFFBEFDFFFFBC9F000A900000000000000000000000000000000000000090090DA9BCF9F0FC9E9F0C09EB0000A00A900000A0A90A00000A9A0A00000000000BC0B0A0A00000009A0000009000000A0F0000009000A0A0A9A000A000BC0FDFFBFBFDFFBFFF9FFBF09F090090900000000000000000000000000000000009E90F0BDFEB9E9F0BE9BCAB9E9CA0A900000A09000000009A00B000900B0A0A9A090CB00000009A0A90AC9A0A0A0A00A9A9000A0B0A0A0B00900000A090A900B9AFFFDEDBFFFFFFFF0FCBF000000000000000000000000000000000000000000000F0F0FA99EDBE9F9FC0BDCF0A9000A9A0000A0A000A0A009A00A0A0A00090000A0B0A00A90A0000A09A09009000A9000A9A090090000000A0A0A900A00A0B0E9AFFFFBE9FFFBFFFFDBC9AD09000000000000000000000000000000000000900BDA9DFBDEFFADF9EF0BD0FA0F0A9A00000A000009A00000A0000090090A0A00A000E90B00A00A0900A00A0A0A00900A00000A0A0A0A9A0B0009000A000000090990BFFDFBC9EFDFFFBEBDB0F0A9000909000000000000000000000000000000000FABCFB9F9FAFF9EDAFF0F000000A00A009A000000A09000A0A00A0A0900A009A09E000000900A0090B009000A0A009A0A9009009000000A00A0A90A9A09A0A0E0DBFFFCBF9FBFFFFDFADB09C0090000000000000000000000000000000090DBC9DFBDEFEFFDF0FFBFDA00A9A00090090A000A0A00900A000090A0000A0090A000E90A0B0A0A000A0A000A0A00009A00900A0A0A0A0A0A090A090000000000090B0BDBFFFCBCFFFFFFBFDADE9A900000000000000000000000009009000900B0BFEBCBFF9F9EBFF9EDE0CB0009A00A0A000000000A00A00B00A0900A0000A090A09A000000000A90000B00000B0A00000A0090090000900A090A0A0A000A090A90F0FE9FBFDFADBFFEDEBF9BC9CA90900000000000000000000000009000BC0FCBDFFF0FFEFFDADEFAFB0000A00A000000A0A9A000000000A000A009A0B00A0000E9A9A0A00A00A0B0000A0900000A9009A0A0A0A0B0A000A00000900B000A00A09A9BFEDEF9FFCBDFBDFCF0B09000000000000000000000000009A00A000B0BDEBCBFF9FF9EFFF090C0F0B000000A00A9000000B0A09A0009A00B00000000A0A0BC00009000900000BCA90A000B000A00000900900000B000A9A0A00000A00000A09CA9FBFFE9FFFFFFBF9FCBCBC90000000000000900000900900909090DADABDBFDFEF9FFDA09E0BA0000A9A00090000A00000000000A0000000A000A090000CB00A0A0B0A00A0A0000000A000B000A09A0A0A0A09A000B000000A0A9009A0B09A09FFDFFFFE9EFFEDEFA9F009A000900000000000090000DA0D000000AD0BDEF9EBF9EF9A0DA09C90A0A0009A00A0A000A00A00A0A0900A0A0000B000A09A0B0A09000000A90909A0A0A09A0000A90A00009009A000A000A0A00900A0A0000000B000BFFFFFF9F9FF9FDF0DB0DA9000009090900000009A09A0A9E9E9D0FCBDAFDF0F9E0FA000A0A009000A00A00000A90A0000090A0A0090A9A000B000000F09A0A9A0000A0A0009000000B0A000000A9A0A0000A90B090090A000000A00A0A000B0009F9FFEFFFFFFBEFADE99CB0B09C0000A9090F009F090D0009AEB9F0BDAFBFCBF90F09E9A90A0A9000000A09000000A9A000000A000000A0000A0A009E0000000B000009A0A0B0A000009A0A9A000000A9A00A00A0A0A00A90090000000A90000BCFFFFFFFFFFDF9FB9ACB0D0DA0B09090E0909A90F0F0BDAC99CFADFEDBCBF0CAC00A0000A0000A0B00900A000A090000A000000A0A0090A0009000E90A90A0A00A0B0AC0000090A0A0A0000000A9A00009A09A009000000A0A09A09A0000A900FBFFDFFFBEFFFFEDEDFBDA9A090D0ADA99F0BDEF0F0BCABDBEFADFA9BCBCBCB090090B0A900A00000A0A000A000A00A000B00B000900A000A00A0A9A90A00900090000B0B0A0A0090900B0A0B00009A0A00CA0B0A009A0000000000090A90000009FBEFFDFFFFFFFFBDBEDBD9E9AF99CBE9FCBB9F9FDBDDAFDBCBCFDE9E9E9E000A0A0000B000B0A000000009A000009A00A000000A000A09A0000E0A00B0A0A0A0A9000009000A0A0A000900A0A00090A90000000A00A9A00A00A00A0000A90A000FBDFFFFAFFFFFFEDBEBFADF9FEB9DB0BDFCF0F0BFAFDAFDBDBE0BCBDAC9E00900B0A000A00009A00A0B000000A00000000A0A00A0090000A00DBC9A0009000900A9A0A0A9A000090A0A000900A0A090A9ADA9A0000000900000A00A0A900900009EBFFFFFFDBFFFFFDFCFBEFE9FEBCFFAFBFFFFFCF9AFDAFEDBFCBCA09A00B0A00090A900A000009000000A0A90A00A0A009000900A0A00900A00AC0B0A0A0A0ADA09000009A9A0A9000B0A0A90000A00000000B000A0A09A0000090000A00000009FFFFFFEFFFFFBFFFBFDBDBDBDBF9FFDFF9E9FBEFDAFF90FCB0F0DAC0000090A0A000B00A0A0A00A0A000000009009000A00A0A00000A0ADB00B000009009000CA0A9A0A0090009A0000900A0B00B0A0B0A000A09000000A90A000A0090A0000009FDFFFFFFCFFCBDFFFFFEFEFFFFFFBEFFFFEDBDADBCFF0BC0000000B0A0A00000A0009000000000009000A0A0A000A00B0000009A0000ACB00A0A0A0A0A0B0B090AC90A0A90A000A00A00900A0009000D0A000A00A00900000A9000A0000000000AF9FFFFFFFFFFFFFFF9F9FFFFFFFDBF9FFFEFFEFF0E0CBC0000B0009000A9009A00A0A90A0B009A0A00000000A000000A009A000A00F90A090900000900000A009A09000A00B009A09A0A009A00A0A0A90A000900A00A0000000A00B00A00000900F9FFFFFFFFE9F0FFFFFFFADFBFFEFFFFDFFF0BF9F000A0A900A0A0A900A0000A000000000A00000B0090A000B0A0009A000A0900A0E900A0A9A90A0A0B0090A000A0A90A000A00A0009A000A090900A900A0A000000A000A090000909090000F0BC9BFFFFFFFFFFFFFFFDFFFFFFFFFDEBFC09E0E0CB009000A9000000A00A09000A0A00A00000A0000A0090A00900A000A090A0AF90CA000000A000900A0A009A9090A900A0000090A000A0900A0A000A900090A00090A00A000A0A0A009A0000CBFCBCBF9FFFFFFFFFFFFFFCFFDFEA9F0F009FDB00F0A0A900A9A0A00090A0A0090000000A09000A0000A000A0A900A900A0000CAB00B09A0000B00A0900B000E0A00A009A9A0A0000A90A0A000CB0000A00A000B00009000A090000A0000B0090AD0FCFFFFFDEDFFFFFBDBFFFE9FDE0FCA00BEDF000000A00000900B0A0000A0A00B00A900A000000A000A9000A000A0000A90BD0A000A09A9A00B09A0A00B09ADA909A0000900A900000009A9A0A9A0000000A00A00A000000A09000A9000B0AD0B0B0BCA0FBFFFEF0FEFCBC9E00BCB09CBCBFADA9A9000B0A0A0A0000B0090000000000000A09A090A000A9A00B000B0A00AC0A090A00A0000B00A0C90B0FADA9E0A000A00A000A0A0B0A0000000009A00A000000000A90A000A0B000A0A0090AC900CBDFBCB00909E90BCBC00BC9E0EB0BDADA0000A0A009000000B000A0A0A00A00A0A000000000090AD009A000A0009A0BB00A09A900E9ACBE9A9AF0F9FFFF09C0B09A009A00900009A0A9ADA0A00009000B0A9A000000B00000A009000A090ACB0000000000000000000F000A9090ACBDA9A0A00900A0A9A9A00A9E90000000000000B00A000A00A9A0BE0BE9000A000CF090A00A090A9BDBCB0DBFFFFFFFFA9A0AC09A000A0A0A00090E00090A00A00A000000B0A0A000B00090A00B00A0A90000000000000000000A00BCB0A0A09A0AC0009A0A090000000B00A9EB0B0A90A9009000000A009A00F00BDCBE9E90A909A0A090E90A09ADBFF0FFFFFFFFFFFCF09CB0A00A9000900A0A009A0A090A00A00A0A000009000A00A0A000A0090090A9A9A0000000A0900B09CB00009009A090B0B000000A09A0A0000B0F9F00000A00A0A00A000000A0DA0BFCBFF0F0A000AE9E900A90A09ADFFFCBDBFFFFFFFFFFA9EBA0DA900A9A0A900090A09C00A0900900900A000A0A0000000000000A00A0000000A0B090000A0000A0A0B0A0A0000A0000A00A000A0090A9ADFBF0E0A0000000000000A90A09ABDFCBFFDFFADA9A0B000A90A09CA9ABDFBF0FBFFFFFFFFBDF9FDFA00A000000A0B0A000A0B000A0A0A00A900B0000B009A00A9A0A00A00A9A00A090000A0B009ADA909000009A0B00B0A000900B0000A0009A9FCB0900A00A0000A90000090AC9EBFFFFFFDF0E000DBA90A90A0B00DAFBCBBEDFBFBFFFDFBFFFFFDAD0A90A90000009A9000A9000000A000A00A00000A00090000900009000A90A0A0A0000A0A000A0A0A0A00000A00000B0A0000A9000A0A9E9BCA000000000A0000A00A009AB9E9FDFFFFFF9F00BC00A9E9CB00B09F0F0C9BFDE9FBEBFDFFFF9E9A000A00A9A0B0A00A0B0E0B0A9009A000000B000000A00000A009A0A09000000909A0F0909A900090090A00009A0B00000A0000A09000DADA090A09A00A90000A00000A000E9FFFFFFFF0E0A0CA9E90B0B00B0BF0F0DBBE9A9B0F9F9FBFFFEDA00B090B00000000B09000000000A0000A9A000A00A000A0A000A00000A0A0B00A0A0900A0A00A00A00A000A9A0000000B009A0A00A0A9A0B0F0A000090000A000000A0900F9FFFFFFFBCE9090B9A9AF0F09AC9E9FFBEF0DADADF9EB0BDFFDBADA00A0ACA0A0B0B000A0A0B0A0A0000B00000000900900009000000A900000000000A0A00000009000000B0000A0A00A000A00009000009FFF9F000A00A00000A09A000A0B0ABFDFFFEDB0A0A0CF090A90E09A9BFFFF9FFBDBFBFBDADA0BBEDB009A909090900C0BCBC0900009009A000A00A0A0A000A0B000A90A00A0A9000A0B09090B0B00A0A0A0B0000A00090A90A0000A00A0A9A0A9FFE9E9000000A0000000090000BC9BFFFFDAC90000BA9AF9EB90A0FFFFFFFF0FADFDFFCB0BDFDBF0E9A00A0A0A0ADABCB0A9A0B0A0A0A00A09009000000A00000A00A0900000A0B0000A0A00000A90000000A0A90A000000090A0090000009BFFFFF0A00A00000A90A00A0A0A90BEDFEFDA0B0A9A09DAF90B0CA9FBFFFFFDA9F9FBFFDBE9FBFFFFCB000A9E9C9ADABDFBE9E0000900000900A0A00A00A00000A0000000A00A000000A000000A000000A90A09000090A00A00A09000A00A00BEDF9F00000900A90000000000090EBDBF9FA0F000000EB09EBCB09A9FFFFFFFF0A9FFFFFF9FFFFFFFBC0B090BABE9BDFFFDF090B0A0A0B0A0A0000009009009A00B00A9A0000900B0A90A900B00B0A0A00A00A0A0A0A00A09A00A00A00B00B009BBE00A9A000000A00A09A009A0A90EBCF0DA0A0A0009EB90B9E0A9ADFFFFF0DBCA9FFFFFFFFFFFFDFBC00AC9DBDFFFFFFFEFA0009000000090A90A00A00A0000000000009A00A00000000A0000009009000900909000900009000900000000A0C09A900000A00000000000A0090A900B0A0909090A0F90E9E09A9CBBFFFFBFA09BFFFFFFFFFFFFFFF0B0B0BBFFFFFFFFFFF9CB0A0A9A0B0A0A00A00A00A00A00A00A00A0A00A00A00A00A00A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B09A9A00A00A000A00A00A00A00A0A9A0B0A9A0A0A0A00B0A9A09A00B9FFFFFF000B0FFFFFFFFFFFFFFF9E00BDFFFFFFFFFFFF0A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000105000000000000B4AD05FE','Education includes a BA in psychology from Colorado State University in 1970. She also completed "The Art of the Cold Call." Nancy is a member of Toastmasters International.',2,'http://accweb/emmployees/davolio.bmp'); + +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(2,'Fuller','Andrew','Vice President, Sales','Dr.','02/19/1952','08/14/1992','908 W. Capital Way','Tacoma','WA','98401','USA','(206) 555-9482','3457',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00F00000000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000C00BFE000000A9000FFFFFFFFFFCFFFFFFFC009FFC00000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB09F00000000FCBFFE9E0BFFFFFFFFFF0FFFFFFC09FFFE0000000000000000000900000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000009009F09FFC0BFFFFFFFFFF0FFFFFFFFEFFFC00000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0B00000FF0000000BFFFFFFFFFFFDFFFFFF0F9FE0000000000000000000000000000000900000000F00000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE09FFFC0A9F0000FC00BFFFFFFFFFFFEBFFFFCFFEFC00000000000000000000900000090000000000000F0000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009CBE09C00000000BFFFFFFFFFFFFFDFFFCBFC90000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0009FF0BFA9F0A9BFFFFFFFFFFFFFEFFFFFFC000000000000000009000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009FCBC0DFFFFDFFFFFFFFFFFFFFFF9F0FC000000000000000000C0000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00AF0000000000BFFFFFFFFFFFFFFFEFE0000000000000000000D000000000000000000000000000000F00000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FC00BF0090BFFFFFFFFFFFFFFFFDFC00000000000000000C00000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD09EBFC9ADAFFFFFFFFFFFFFFFFFFFE000000000000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000009FFFFFFFFFFFFFFFFFFFC00000000000000009C0000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BFDBFFFFFFFFFFFFFFFFFFFFFFF00000000000000090000000000000000000000000000000000000F00000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FDB9FFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDBFFFBFFF99FFFFFFFFFFFFFFFFFFFFFC00000009000000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBBFFF9FDFBDFFF9BFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000F00000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FBFFDFBDFFBFFFBFFFF9FFFFFFFFFFFFFFFFFF0000000000000000000000000090A0009CB0DA9A9AF9E9BE900A00F0000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFFFFBFFBFBFDFBFFFFF9BFFFFFFFFFFFFFFFFE00000000000000009CA90A90F00C90BDA9ADA9FF9F9E9BD9B0C9C0F0000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFFBDFFF9FD0F9F9DFBFFFFF9FFFFFFFFFFFFFFFC0000000000000DADA99E09CB0F9BCBDAD9F9BDB0BCB9ADAFCB9A9FF000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFFBF9FFBDA9F0AD0B0A09DB9BFFFBFFFFFFFFFFFFFFE0900000009CB0B9BDA99F9BDB0F9B0B9AB0F9ADF9BDADB99BCBDA9F00000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFDBFBFDBFCF0F0FDFCBDAD0D9F0BEFDFBFFFFFFFFFFFFFFFFC000000000009CBCF0BCB0F0BDB9E9F9E9DB9E9B0F0BDB0FE9B9ADBF0000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFDBFFFF9FF0F9FFBCB0BD0F9A9E00D090BDFBFFFFFFFFFFFFFFC0000000C0B9FB9B9BDB9F9BDA9E9B9E99A9E9ADF99F9ADB99F0F9EF0000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFBDBDBDADEADBDA9C9F9F0FBDADA9DB0F0F9E9DBFFF9FFFFFFFFFE000000B09DA9CBCF09E9A9E9F9BD0F9ADBDB9F9A9E9ADADBE9F0F9F000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFBE9FBFBE9FDBDBCBCBFBC9E9F9E0DBDA0DB09E09E9CB9FFFFFFFFFFFC00009000A9FB99B9F09F9F9B0F0B99E9ADADA9E9F9F9B9AD9A9B0FF00000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFDF9FDFBCDFDADA9E90B9C9CBFBCBFDBF0F9FBC9E99E9AD0FFFF9FFFFFFFE0000C0DBDB0DAD0F0BC9BCBCF9BCBC9BDB9BDB9F0B0F0F9BE9E9F9F00000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFDBBBFFB9CFB0BCB0F09FDE9FA90DB9CBD0F9E9CBF99E90F9A90BFF9FFFFFFC00000B9A9ADB9BF0BDBBCB9B9BCBDBBDA9EDA9E9B9F9F0BC9B9F9AF0000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFF9F9BDFCB0DCB0DBC9DBDBF0A9E99FF0FCB0FB9E9FBC9EB0F09EDBCF9BF9BFFFF000909CBDBDB0F09BCB0DBDADADB9A9CBDB9B9F9E9E9A9BDBFCB0F9F9F0F0D000000000000000000000000000000000000000000000000000FFFFFFFFFFFFD9BF9FFB9FCB0BCB0DBE9E90DBDB9E09CB09AD0DBDA9DBD9C99E99E9B0F0FFFFFFFC0F0A9BCBCBCB9F0B9DB0B0F9B9E9DB9B0F0DA9F9F9F9E9A9B9DB0FF9F99BBF990C000000000000000000000000000000000000000000000FFFFFFFFFFFB0BFF0FBCDADBC9E9BCB0D09AF09E0D9F9A9F0DA9E09D0A00F0BCBDA9F0F0F0FB9FFF00009CBDB9F9BCBDF0B0F9F90FCBCB0F0F9BF9F0BCB0F9F9F9EB0F9FB0BDAFDBCF9AD09A0CBCB0000000000000000000000000000000000BFFFFFFFFF0BD9FF9F9C9ADA09F09C9CB0BFD09E99FA9AD9E9F9F99F0F9F99BD9B0FD0FF9F9E9FFFF009ADA9B0F0BCB9B0B0F9E9AF9B9B9F0B90F90B9F9BDB0BCBCB9DB0F9F0BD9A9B0F90F0DB909FF000000000000000000000000000000009FFFFFFFBC9F9EF9F0F0BC9A9DA99E9A9CBD0BFD9E90DFDA9F9BCBCBCBDBCBEDBEDF9BF99F0F9E9BFFC00009C9F9BDB9E9F9D0B9F90F9E9E9F0DB0FBCF0BCBC9F9BFC9A9FBCBDABDBC9B9EB9BADBFA9AF0000000000000000000000000000000FFFFFFE90BDADBF9E90D0BC9E90E90F0F90BD0BA9FFB9A9F9E9F9F9F9F0DBDBCB9FBE9EF0BF9E9E9FF009090B0BCB0D9BCBA9BCB0F9BCB99A9F0BD09B9F9B9BA9E99BE9A9FF909DADB0DB9DAD9BC9DBD9C00000000000000000000000000000FFFFFD09BDFB9F0BC9E9A9C9A90F9CB090BDA9F9DF09FD9FDADBCBDBDE9BFBDFBDCBD9DB9FDFFBFD9FE000E000D0B9FBADBDDADB9F0BCBDAD9F0BCBFBCB9E9E9DB9FAD9BDBF9A9FAB90DA9F0B9ADB9BE9ABC000000000000000000000000000BFFFFCB9BCFB0FD0D0A909CB09CB9CB0FDBCBDF9EBDBF0BE9BDBDBF9E9BFFD0FBDFBF0FB0DBF0FFDBE90009090B0B0DB0D9A9A99EDAD9BDA9BAB9F9B9CB9E9F9F0BCBDBADA9F9DA9D9E9B9E9BC9FA9E99F9CBC00000000000000000000000009FFFE99DADB0DF0B0BD00F0B0FA9C0B9DB0DBDA9F90F9FFFDBDBFFDFF9FDBDBF9FBFDBFF9FBCBF9FAF9FBC000AC00C9ADB0BDBDADB9B0F0BDAD9CF0BCFBDF9B0B0F9BDAD9BDAFABDABD9ADB9E9BC9F99E9AF99B0000000000000000000000000FFF99EBDBDFB09E9C00F09FC90DBDB0F0DBADBD0BFF9F99FBFFDB9B9FFBDFBDBF9F9FDBDFDBDDFFDFFAFDBF090090009A9F0BCB9ADADB9F0BDAB9BDB9F0B0FDBDB0BCB9AD0BDF9DA9DABD0BDBD0B0F9E9BD9AD0F00000000000000000000000BFF09E99ADB0DB0009A99F009BDBCB0F9A9CDBCBFDBDF0FF9BDBFDFFFF9FFBDFFDFFFBFFFBFFBA9FBF9F9FCBC009A090E9C9BDB9CB9F9CB9F909DADADA9F9F9ADADBDBF0F0BCBBDA9FA9D0BCB9AB9F9A9BCBE9BF9B0000000000000000000009FE09F9DAD9ADA0D0F0D9E09FF0F0B9F9E9DBA9DBDB9EBFDBFDFFDBF9F9FFF9FBFBF9FFDBDFF9FDFBDFFDAFBFB0000000909ADA9CBBCB0BBCBCBEB9BDB9F9E9ADB9BC9A9F9BDB9DBDA9DBAF9BCBD0DA9F0DB99E90D0F00000000000000000000FF99BCB0F0E90DA090B0A9DB09F9FDE9E9DA9DEBDADFFDBFDBFBFBFFFFFF9FFFFFDFBDFBFF9FFFF9FFBDBFDBCFF009CB00AC99FB9C9BDBC9F9B990FCB0F0F9BDB0F09BDF0BC9ADFCB9E9D90F9BDA9BDA9F0DA99EB9BCB000000000000000000BF00DB0DB9B0F0090BC9D0BCBDA9A9B9E9A9FBF9F9FB9FBDBFDFDFDFF9FFFFFFFDFFFFFDFBFFBDBFBFDBEFBFFBD9F00000900AC9FABC9ADB0BC9E9B9BDB9F0F0F9F0FA9A9F9BF9AFB9E9BEBD0BDADBCB9F0B9F0F99E9BDF00000000000000000FC0BD0F90D0D00F0D09A9F9BDADBDF0F9F9F0D0F9FBDFFDF9FFBFBFBFFFF9FF9FFBFDFFBFDFFDFFFFFFF9FDBDFBEBF0090C0909B0D9B9F90F9BF0BCBCB0F9BDB9E9BD0F9F0F09E9F9E99E990BDADB0B9E99BDADB9E99F0B0000000000000000BF0BDA99ADA0B0909A9F0F09E9FBCB9F9CBC9FBF9FBDFBDABDBFDFFDFDF9FFBFFFFFFBF9FFFFBFBFDFFDBFFBFEBFFDF0000B00A9ADBA9E9E9B0F09DBDB9F9ADA9E9BDA9BDADB9E9FDB90F9BCBCBDB0DADBCBCB990F9EA9F9F000000000000000FC0DADBC9009C9E0F9CB9F9F9F09FDADBF9FBDBDFF9EBDBFDBDBFF9FBFFFFFDF9F9FDFFFFFBFDFFFBFFBFFFDBDF9FAFF0000909C9A9DBDB9E9F9F9A9BCF0FDB9F9F0BDBCB9F0F9B0BEDB0F0B090BDB9DB0BDBDAF9A99DA9EBC9000000000000BFC09D09AD0DA0099A0BCB0F0F9F9BDF9CBF9E9F09FF9FF9FBDBDBFF9FDF9F9FFFBFFBDFBDFFFFBDFFFFFFDBFFBDFBDBDF0900C0009E9A9E99A9E9F9E9B9B0BCF0F9F9A9BDA9B0F9FF9B0F9BD0BDB0F0BDBD09AD9E9F0B9F999AC00000000000FE09A9BC90B0090F0D9DBDBDBDBFCFBB9B9C9BDBFF9FDBDBDBDBDF9BDBFBFFFF9FDBDFFBFFBDF9FFBDBFBDFFFDFFBDFFBFE00B09A9C90DB9F0DBDB0B9F0F0F9B9BDA9E9F0BDBCB9E9FB0F9BC0BCB0F9BCBDA9BF9A9B0F9E9ADADB0000000000FF0DA9F09000C9E9ADB9EB0FBDAF9BBFCFFCBBDADBDBCB9F9FDBDA9FDBF9FFDB9FFBDBFBFDBFFBFFBFFFDFFBFBFBBDBFF9FF0000000B0FBADADB0B0F9E9F9F9BCBCB9F9F0BDBCB9E9BDF99ADBD09BDBCBBDBDAD0BD0F909BDB090BD000000000FFF09C9E09E9B09F09AF99F0F9F9FDDBDB9BDFDBDFBDBDFBDADF9BDB9F9F9FBDFBDFFDBFDBDFBDBDFDBFFBFFDFFDFFF0FFBDF0000D00909DB9A9F9F0F9F9A9ADBDB0F0F09E9BFCB9BCBCF9DA9A9CBDB9D0B0BDBDABD0FBC9ADBDBCB9000000009FFC9B0900000F09F9DBE9F9FF9FABDBBCFF9BE9BC9FFBDBD9B0FDADBDBDF9FF9FBDBFDFBFBDFFFBFBFBFFFBFBFBF9FF9FFBFF090A09E9A9E9D0BCB90B0F9F9F0F9F9B9FB9E9BDBCBBFB9A9DBDA90BCB0BDBDA9BD0B9909BDB0B09F0E00000000BCA09F0C90D090F0FBC9F9F0BFDDFBFC99BEDBFDBF9D9EBFBDB9F9BDBDB9FF9FDFBDBFBDFFFBDBDFDFDF9FFFFDF9FB9FF0FDF000900009F9F0BDB9E9F9BCBCBB9E9ADA90F9F9ADBD0F9E9FADA9CBDBDBCBD0B9E9BDBE9AF9E9C9FB09000000000099F00B0B0BE9BDBC9F0BF9F0BBBDF9BFFDBDB9F9FBBF9C9F9F99FD0BDFB9FFBFFFFFDF9FBDFBFFBFBFFFF9FBFFF9FF9FBFBC0000D09E9B0BDA9E9DA9E9B9BCF99F9F9F9ADADBE9FF9B099BD0B9E9A99A9F0DBC9A99F90F9B0A9CBC0000000000CB0B000DBC9CBC9BFBFC9F9FFDDF9FF9BBFBDFBF9FD9FBF9F9FFBBDB999F9F9F9F9BFBFDBBFDBDFFFFFFFFFFBFFFFBFFFFFF009A0A09CBD0B9F9A9BDB0DADB9AF0BCB0F9BF9BDA9FEDBCBCBD09BDBCBDA9F0B9E9E90F9AD9D9B99BC900000009AD9C0DA09BF99BFDBD9FBFF9BFBBF9FFDFDBF9F9FBFBDBDB9F9FD9F9FF9F9F9DBDFD9F9FDFBFFFBDBFF9FBFDFDBFFDBBFDBFF009009A9EBD0F0F9ADADB9F9E9DBDB9E9ADB0F0BDADB90B9F9A9E9BC9A9F90BDA99BDB0BDB0BADAF09AC000000099A0909DAD0F0F9BCBFBDADFF9FDBFBDBFBDBFFF9FDFBDBFF9F9BF9F09F0F9EBDB9FF9FFBFFFBFFFFDBFFFFBFBF9FBFDFBFFF000C900999A9BDB0DBDB0F0B9FA9ADB9F9BDB9F9E9FBCB9E9A9CB9E9B9DB0BDA9FBCB09CB0F0D9F99E900000009CBC0B0F0B9F9FDADF9FDBDBF9FDBFBDBDFDFFF99BDBBDBDF9FBFFD9F9F9F9F99F9FF9BFBDBDFFBFBFFFFBDBDFF9FFFDFBDFFF000B00B0FAD0F0BCBA9ADBDBCBDBDB0F0F0F0F0F9BF99E99BDA99F9E9EB0F09F909F9E9BDB99AB9CB9F90900000B909C99BC9A9FBDBBDBF9BF9FFBFDFFFBFB9F9FFFBDFBFFBF9F9FBFDBDBDB0FF9F9FBFDFFFFBDFFDFFBDFFFF9FBDBFBFFFF9FF00000C909BB9F9BD9FDA9ADB9BDA9F9B9BDB9F0BCBE99E9E99E0B9BD9F9BDA9FB0B99E9ADAD9CBBCB0F0A90009CBCA9AC0F9FD0F0DFBFDF9FF9BDFF9F9FFDBFF9F9FBFDBDBFFFF9FBBDBDBD99BDBC9DBF9FBFFFFBFBDFFBDBFBFFFFDFFFFBFFFB09C90AD0D0F0F0B0B9F9F9E9EBDB0F0F9BCB9F9BFDBC9B9BC9BDADA9A9E99F0DBDE99BDB9B0B9CB9F9F9CB909B9090D9B9F0BBDBF9F9FBFBDFFBFBFBFBDFF9BFFF9FDBFBFDBF9FFDFBDADBC9CB9BFBDBFDFFFFBFFFBFBFFBDFDFBFFBF9FFFFBC00A0090B0B9F9E9F9E9A9E9FDB0FDBD0BCBDA9E9FB09BE9E9BDADB9F9F99EB9BF0B9ADADA0DBCB9E9A90B0C0BDA09E9ADADBDFDBDBFFBD9FFFBDBDBDFDBF9FFDB9FDBF9FDBFDBF9F9DBDBDBFB9FDBDBDFBFFBFDF9FDFDFBDFBFBFDBDFFFFF9FF009090BC9BCB09B9E9BDBDB9A9F9A9ABDBDA9F9FF9DAD9F9DA9DBC9ADBCB9CBC9BDADBDBD9A9BD0BDBDBDB90DAD009F9F9F0B9FA9DBDFBFDBDFFFFFFFBFDBDBFDBFBDFFBFFDBDFBFFFBDBDBD9FDBDBDBFDBDFFFBFFBFBDFBFFFFFFFFBFFBFFFF0000E00B0F9F9F0F9F0BCB0F9F0F9F9DBCB9F0B0FFA9A9BA9DA9BBD9A9BCB9FBDA99A9A9AD9CB9F0BCB0BCB0990DA9CB0F9FDADFBFDBDFBFFBDBFFBFDFBFBF9BFF9FB9FDBDBFBDBDBD99F9DBDBDBD9FD9BFBFFFF9FDBFFBDBDBDBFBFDFBDFBFFF0090909C9A9E9B0F9F9BDB0F9F0F0F0BBCB9FDBF09F9FC9DA9F0DA9DBCB9E90BDBC9DBD9A9B9E99F99F9900BE9A9CBDB9E9BFBFDBFFFBDF9FBFF9FFBFFFDFFBD9FBDF9FBFF9FBDB9FFFFFFFF9F9FB9BFDFFFFFBFFBFDBDFFFFFFFFFFBFFFFFBF0000AC9A9F9B9CB9E9E9ADB9EB9FB9BDFBDA9ADF9F09A9BA9FBDB9EB0B9CB9BCBCB9BE9A9CBC9BF0BF0F0F9C90C9B9CBD9FD9D9BFDB9FFBFFDFFFFFFFBDBB9DBFBDFBBFDB9F0DF9FDBFFDBDFDBF9DFFDBFFF9FFF9BDBFFFBF9FF9FFBFFFFFFFF00090909CBCBCB9F9F9BDB0F99F09E9E90BDBDBFB0DBDBC9CBDADA9DBC9BDE9F9BDAD9BDA99BF09F09B0909BCB9ACB9FAF9BFBFDBFFF9FDBFBFBFBFBDFFFDFBDF9F9FD9F0D9B9FD9BDB9F9BF9FDFBDBFFFFFE99FFFDBFBFDFFFFFFDFFFBF9FFF900C0A0B9BDA9CB9E9ADADBDBE9BF9F9BFCBCB0BCBA9ADB9B0F9BDA9F9E9B9A9E9BDAF09DAD90F09F0DBD09F00D9BCB9DBCF9FBF9F9DFBBDFFFDFFDFBFBFFBDBBF9FBF09B9D9F9BD9FDBDFDBDBF9FFDFFFFF9009F9BD9FBBFBFBFBFFFFFFFBDFE09A90C0F0BDB9E9BDB9F0B0F9F0F0BCB9BDBDBDF9DBDBCADB9FE99F0B99E9DB9F0B99FB09B0F9BDA9B0B0FB09A0DBDBBDB9E9FF9FFB9FDFBF9FBDBFFFDFBDBDFDBD9DBD9CB99BDBF9BDB9FDB9DBD9BD990000909ADBF9DFDFDFFFFBF9FFFFFBF00000909BDA9E9BCBCF0F9F9ADB9F9BDE9A9ADFA9ADADB9B9F099E9BD0F9FB0F0BDBE909E9F9BCB9F09CB9C9E9DBF0FDA9FDBF9FBFDFDBFFFFFFFFF9FFBDF9F900000909B9CBD9D99C90909090900909009DBDCBD9F9FFBFFBFDFFFFFFBFFFFF009CB0B9E9BD9ADBDB9B9F0BDB0F0BCB9BDBDAF9C9B9AD0DADBDA9ADA9AF0DB9F9AD9BDA90BCB9E90DB09F0099A9DBF9FF9BFDBF9BFBFFBDFFBDBFFFF9FBDB900B090900909009000909C9AD09099CB09F9BDBBDBFBFF9F9FFBFBF9FFFDFBFFF000000CB9E9ADBDBA9E9E9FDA9F9BDB9FCBCB9FBBC9F9B9BDB0BD09BD99BF0F0BDBBCB9DBDB9CB9E90090BF9AD9F0FDB9EDBDBDFFDBDBDFFBFFFF9FFBFDFBDA9D9BDB0D90D0909B9DBD9BD99F9F9F9DBD9F9FDBF9FDFBFBF9FFFFFFFFFBFFFBFC09A9090F9F9A9AD9F9F9B0BDA9E9ADA9B9BCBFC9BA9F0F0BDF9A9F0B0F09B9F909CB9E90B0FB9E90000FD00DABCB9BDF9BDBFBFBFDBFBFFFFFFBFFBDFBF9F9FBFDBDF9BDB9DBD9F99BD9F9F9BDBDBBDFBDFBFF9FFBFFDFFFF9F9FBFBFFFF9FFB00C0A0F0B0F9F9BE9A9E9FF9BDBDB9F9E9E99B9BC9CB90BDA9AD90B0DBDBFCBCBFB9E90F9DB9C9000099B09B9DB9F0F9BDBF9DBDFFBFDFBDBF9FDBDBFF9F9FBFDBF9BFDB9FBDBDBDBDFBD9DBD9F9DDBF9FBDF9FF9FF9FBDBFFFFFDFFFDBFFFFC09A9099BDF9E9BC9F9F9BCB0F0F0BCBCB9BCBFD09BBDAD0B9F90FBD9A9BC9BDB090F9F90ABC9B9F9F90E90BC9ADF9FCBFF0FFBFF9F9FBFFFFFFFBFFF9FFFFFDBFDFFDBFDF9DBDBDBDBDFFFBDFBDBFBDBFFFBFF9FFFFFFFFFF9FBFBFFBFFFFBFF00000CBCB0B9F9FA9A9ADB9F9B9BDBDB0FCB0BEBC9CB9B9CB0F909AD9E9BF0BCB9F0B0F9D9BD9FDF9F99E9CBF9A9E9BD0FBD9DBFBFF9FDBFDBDFDB9FF9FBFDBDBF9F9F9FFF9FFDBDFFFFFFFFBDFF9FFFFFFF9FFBFDBFDBFDBFDFDFBFFFF9FFBF009CB00BDBCB0F9FDBD9ADF0F0F0B0BDB9BDBF99B0B9E9CB9F9E9F9BA9F09F9B9E9BDB09A9DBFFBFFFF090A90F9F9F9BF9FBFF9FDDBFFBFBFFBFBFFF9FFFDBFF9FFFBDBF9FF9F9FFBFB9F9DBDFBDFFFBFFFFFF9FDBFFFFFBFFBFBFDFFBFFFBDFF000009B0F9F9FA9ADABDB9F9F9BDBDADADA9F0F0D9E90B9E9A99A9C9DA9FBCBCB9E90DAD9FF9DFFDBF90F9DF9E9EBDF9F9DBDFBFBBF9FDFBDF9FDF9FFBDBFDBFFB9FF9F9F9F9BF9FBDFBDBFF9FFFBFDFDBFF9FFBFF9FBFFF9F9FFFBFFFBFFFFF09A09F0F9B0FBD9F9BD9AF9E9ADAF0F9B9F0DB09AB9F9CB9F9E9DAB0BDB0DB99CB9F9B9BF9FFBDBFFDF09E9AD9B9CB9F0FBFBF9FDFFFFBDFBFFFBFFBDFFBDBDBFDF9FF9FBF9FF9FDF9FDBF9FBFBFDBFFBF9FFF9F9FFFDF9FFFFFBFFDFFFDFBFFC09C009BC9FBCBE9ADAF9E9B9F9BDB0F0F0BBDBC9DA9A9E90B9A9D9F0BDB0FA9BCB0F0D9FF9FFBDBFFF909F9AD9FBDE9F9FD9FF9BF9FFFBDBDBFDBDFBDBDBFFD9BDBDBF9DBF9FFBFFFBFDFFFDFDBDFBFDBFF9FFFFF9FBFF9FF9FFFFFFBFFBFFFF0090BC0BB0DBDBD9BD9F9F0F0F0BDB9F9F9FB09B0F9C99BDBC9F0B0BDA9F9DADB9F99FBDBF9BDF9FBF0DB0BDBC9F9BDBF9BFF9FF9FF9BDFFFF9FBFBFBFFFDBBFD9E9F9EBDBFF9FF09FFBFFDBFBFFBDBFDF9FBDBDBFFFDBFBDFBDBFBFFFFFF9FF00A009BD0FB9F9AF0BA9E9BDB9F9F0F0BCBF0DB0DB0B9BCB09B0F09DA9DB0BDB9E90FF9DBDFFF9DBFD0B0FDBCBBF9F9F9FFDB9F9FF9FFFFBDBFBDFFDFDF9FBDDBF99DBD9F9F9FF9FBDBDB9BFD9F9FFDBF9FBDFFFFDBDBFFDBFFFF9FFFBFFFFFFC090F0DA9BDEB0F9F9DF9BCB0F0F0B9FDB9DB9CBB0D9E9BDBC9F9FA9F9ADBCB0F9DB9DBDB9F9FFBDF0DBD9ADB9D0BDBFE9BBFDBF9FFBDBDFBDBDBDBFBFBF9FFBDBBFBDBF9E9FBDF9DBF9FDFDBFBF9FBDFF9FFB9FBFFBFDBFFBDFFFFFFFF9FBFFF0000B0FBCBBDF9B0FAB0F9F9BDBBCF0BCFADA9C9BA99ADB0B0B09DA9F9A9BDB0B09FBFFDBFF9FFBFB00BDB0DABDF0F99FD9FBDBF9FFBFBFDBFFFBD9FDFDBD9FBDFDF0DBDB9D9BFFF9EFBFBFDBDFFDBFBDF9FFFFDBDF9FDBDFBFBFFBFFFFFF9FFA0900909BD9A9E9F9DBDA9BCB0D9B9F9B9FBD0B9C9F0D9AD9C9F9A9F09DBCB0DBDBD99BFF9FFF9FDC9F09F0BD9A9F9FF9FBDFBFDBF9FDF9FFDBDFFFBBFBFFFBDBDB9FB0F9FBFD9F9F99DBDFBFFFBFDBDBFFBDBDBFFBFBFFFBFDFFFFFFFFFBDBFC000DADBCBF9F9F9EBDB9F0F9FBEDA9E9EF90B9E9B09BAD9A9B9E9F09FB0B9DA9BDBFFFDFFBFFFDB0B09F0BDBE9F9BF9FBDBBDDBFDFFFBFF9FFB99BDF9FF9F9F9FBDBDF9FDBDBFFF09CB0F9FFFBD9FFFFDBDFFBDF9FDFDFBDFFFFFFFFFBFFD9FF009A090BF0F0B0FB9E9CB9B9AD9B9F9F99E9C99AD9AD9B0DADA90BDB0D9F0B9FDFDBDBF9FFF9FBF09FE9F9E99F9FCBFBDBFDBBDBF9F9F9FFBDFFFFDBF9FF9F9F9F9DB99BFDBFD99F9B9DBF999FFBDBDBFFFB9FBFFFBFBDFFBFBFFBFFFFFFBFFF000090F9DB9F9F9ADBFB0F0F9BE9E9E9BF9A9EB9AD9AD0B09BDBD0BDBA9ADA9BBFFF9F9FF9FFFDBD009ADB9E9DA9F9FCBDBFDBF9FFBFFF9FFBDF9BF9DBFBFFBF9FE9DBFD9BDBF009FDB9DBFC0909BDBDBDFFFDF9F9FFFBFDFFFFFFFFFBFFFFBFD009E90ABDA9E9F9F09F9BDBC9BDB9F0FFE9099E99ADBBDBC909A9F09DBD99DFDBDBF9FFBFF909F0BDBDB0D9BE9FBDB9FBDBF9FFBDFDBDFF9FFBFF9FF9FDFBDFF99B09DBC0009DB9B9FFBDFB99F9DBF9FF9BDBBFFFBDFFFBFFFFFFFFFFFBDBDFE09A00F9DBBDB9E9BFF0BCB0BF0BCB9F9B99F9E9DADA9C90B0BF9F0BCB09A9FBF9FF9DF9FC909FB0DAD0FD9BE9F9DBFDBDBF9FF9DBFBFF9FFF9FF9FBDB9FBDFB90F9FDB09B9D9AD9FFDBDBBFFF9FBFFFFB9FFFDFDBDBF9FFFFFFFFFFFFFFFFFFF0000909AFCB0F9BCB99F9F9F9FDB9E9BFCB0B9B09BDB9AD9F090BD9BDBC9FBDFF9FFA9F9909BFDA9B9B0BAD99BFBF9BFF9FF9FBFBDF9FFFBFF9FFDFBDF9FBDFDF9FFBDBDBDBD9BFD9FFFDFF9FFFFFFDBDFB9BFBFFFFFFFDBFFFFFFBFFFBDBFFF0090E9BF9BDF9E9BCBE9BCB0FA9ADB0F9F0D0F0F09BCB9A99F9F0BC9A9A99FF9DBFFDB9DBFDBFC9CBDE9C9BE9DA9FFD9BF9FF9FDFBFFF9FFDFFFFBDFBDBBDF9BDBDBDBFFDBCBD9FBFFBFBDFF9BFFFFF9BDDFDFFF9FDBDFFFBFFFFFFFFFFF9FFF90E900D0F0B0BDBDBDBCB9F99FBDADB9FB9A99B9ADA9F0DA90B09F9ADBD9FF9FBFF99DBFFF9FF9A9DA9DBFC9FBDF9BFFF9F9BFBF9FDBFFFFBFFF9FFBDBDDBBFDB9FBDFD9BF99BF9FFFDFFBFFFFFFFF99FBBFFBDBFFFFFBFFFFFFFFFFFFFF9BFFC0909A9B9F9F9ADABF9BDA9AF9FBDBCBF90DBCBC9B9F09B9CBD9F9AD9B0BFBDBDBD9FBDFF9FFD09DA9BE999BF9F9FFDB9FBFDFFDFFBDBDBDFFF9FF9FF9FBFDF09FD9FB9FFD9FF9FFFFF9FFFFFFFFFF9FFFDF9FFFDFBF9FFFFFFFFFFFBFFBDFFBF00AC09EDADA9F9BD09E9F9F9E9CB0BDBCB90B09F0F0F0DA90B0BC9B0D9FDDBFFD9BDFBFFFDBF0B0DBD9BCBDBCBF9FBDFBDFBDBF9F9FFFFBDFFFFFFDBFF99F9F99FF99F90BF9FF9FF9FFDBFFFFBFF9FF9FFBFF9FBFFFFFFFFFFFFFFFFFFF9FDFF0909A9B9B9BDAF0BFF9BCB0F9FB9FDBFBCBDBDA99B99B09F9C99BC9BA9BFB9FFBF9BDF9FFBFF9CBBCBE9F9ADBDBF9FBDFBDFBDBFDF9F9FFF9FBDFFFF9FFBDBDB09BFDBDBDBF9FF9FBDBDFFFFFFFFB9FF9FFFFFFFFDBFFFFFFFFFFFFFFFF9FFFFA0009CADADA9DBD90BCB9F9BF0F0B0FF99090B9CBCBC0F90B9BE99AD9FFD9FFFDFFDBFFFB9FD009C999F09F9FBDFBDBF9FBFDFF9FBFFFBDBFFDFBFBDFF9FFFBD9F99BCBDBD9F99FFDBFFBFFBDBF9FFFBFFF9FFDBFFFFDFBFFFFFFFFFBFFBFFBFD09E099BDBDBA9AFFB9F0BCB0F9FDB9BDA9EB9CB09B9B90F0F099E99BDB9BDFFB9F9FDBFDFFF0BDB0FF0BF0F99FBDBFDBDFDBBDBFFDB9FFFFFFBFDFFBF9FDBD9F09FDB9F9DBF9FFDBFDBFFFFFFFF9FBFDFBFFBFFFDBFFFFFFFFFFFBFFFBDF9FFF0009A9E9A9F9F9F90F0BDB9F9E9A9FF9C99C9A99F0D0CB990BCB90F9FF9FBFFDFBDBFF9F99F090FB09F9DB9FFBDBDFBFBFBDFBD99FFFDBDF9FDBFBDFDFBFFFBDBDA9C9F9A9DBDBFDBFFFFFFFBDBFFDFBDFFFDBFFBFFFFFFFFFFFFFFFFDBFF9FF0090CB9F9E9E9F0BF9F9ADBE9BBDE9EB9A0BD9E90B9B9CB0F99ADB09BDF9FFFBDFBDFFFBFF9F0D9F9F9EBDB9F9FFBD9FDBFBDFFFBDBDFFFBFBFDFFFBF9F9FBDBDBDBB90F9F9FBDBFDBFFFFFFFFFFFBFFBF9FFFFDFFFBFFFFFFFFFFFFFBFFDBFF9A0A90F0B9F9A9FDADADB0DBCDA9BFF9C9D0B090F9E90B9D0B0D099FFF09FBFFF9F9BFDF09F09A90F9F99BCB9FBDFBF9BFDFFBDBDBFBF9BDFFDBF9FDFFBFFDFFFDBDDF99F9F9DBF9FFFFFFBFFFFF9FFDFFFF9FFBFFFFFFFFFFFFFFFFFFFDF9FF0D090F9BD0BFDF9ADB9BCBBDBBDBCBF90B0B9DADB090BD0B09DA90F9B99FBDFFFFF9FFF99F00DBDBDA90FDBDFF9F9FBDFDBDBDFFFFDBDBDFBDBFBDBBF9FD9BFBF9F9AB9FDF9FBFDFBDFFFFFFFFFFFBFBFFFFFFBFFBFFFFFFFBFFFFBFFBFFBDBFF0009B0F0FF9B0BF9ADE9BDA9CBCBDBE9CBCB0909DBC0BD0F9A9A99FDFF9FFFFBDBD9FFCB9F9A90F9BF9B9F9B9FBF9FDBFBFFFBFF9BDFBFBDBF9FFDF9F9BF9FDBF9F9DF9B9BDF9F9FBFFFFFFFBDFBDFDBFDBFFDBDFFFFFFFFFFBFFFFFF0BDBFFC09ACBDB9B9E9FD0F9B9ADBDFB9F9BD9A999ADA9A99B09A900D9D09BF9F9BFBDFFDB0BFD9F00DBDBC9FD0B9FDBDBDBFBDBDBDBDBDFFBDFDF9DFF9BFF9FFDBDBF9FBDB0BD9F9BDB9F9FBFFFF9FFF9FFBFDFBFDBFFBFDBFFBFFFFDFFFBFFC99DBFFE0909BCBCBF9ABF9E9F9A9A9F0BCBBF90E9D09C90E9DADA9B9A00BFF9FD99FFBFBFD99BF00009E9B99AD9EBBDFF9F9FDBFFBDFFBFDFBFBFFBF9FDBDBF9B9F9DBFDBDFDBCBDFBFDBDFFFFFBFF9BFF9FFBBDBFF9FFFFFFBFFFFFFBFFFFFF09BFFD090ADA9F9B0F9F0F9F0F9FF9ADB9FF0CB99A9B0BF9B0999C9C9B99FF9F9BFFBDFFFFF0F900C9BDBDF0F9BD9CFB9FBDBBFDBDBF9F9FBDBDB9F9F9FBFF9FDF9FB9F9BDB99F9F99DBFFBFFFFDF9FFF9FF9FDFDA9FDBF9FFDFFF9FFFFFFFF009DFF0F00DB9F9ADF9F9F9A9B0F90BDB0F9DB90BE9C0D9090BCB0B0BC009BF9FD0BDFF9FFBDF9F09009ADA9B9F9FBB9FD9FBDFDBFFFDFBFF9F9FDF9F9F9F9FFBFBF9DBDBC9BCB9F9FBFF99FFFBFB9FBD9F9ADA9B9F9FBDBFBFBFFFFBFFFBFBFF09BFF00A9A9F0BDB0F0F0F9E9F0FBDADBCBBCBD09B9A0F9AD09C9C99B909FFDBF99BBDF9FF9BF00000999FDDBDA9DF9BF9FDBBF9F9BBD9BDADB0B0F9EBF9F9BDBDBF9F0FBCBDF9DBDF9FFFBFFFFDBDFBFCF9BDFDB9F9FBDBDFFDBFFFFFFFFFF0099FF0D009E9FCBF9BBF9BCB09B9E9F0B9FDB00BC9C990BDA9B9A9AD0D09BF9FDBDFDFBFF0BFD00E900F99A9F09FB9FDBFFBDFBFBFDFBFDBDBDBDF9BD99DBFDBDBDFF9F99F9B9FBDB9FBDFFFFF0BFF9E9BDBDB9BDBF9F9FFBFFBFFFBFFFFFFBF090FF0009E9B9BDAF0DBFCBDBCBDFB9FDA9BC9BD9B0B0BD090DAD0909A90FFDBFD9BFBFDF9DF00900E9BCFBDB9F9FDBBFDB9F9D9FDBB9DA9F9F9F9BDB9EB099BFDBDB9F9F9BFDADBDFF9FBFFFD9FC9BD9F9BDBFFFFFFFFFBFDBFF9FFFFBFFFFC9FFBF0A9E9BCBCBD9FBF0B9B0BDAB0F0B9FFBC00B0D0D9A9F0B909CBD009BFF9F9E9FFFFDBFB0000900DB9DBCF9E9BDBDBDF9FBF9BC9FBDB9FBDBFFBDF9DBDAD9AFBFDBDBC9DBDBDBDBFF9BFFADBB9F9F9BDBDF9BDBFFFFFBFFFFFBFFFFFFFF0B9FFDC909BDBDB9FA9CBDBDAD0BDBDBDADBDB99ADB0B0F9090DA9A90B90F99FF9F99FFFB9FDAD000E09ADABDB9F9F9F9FFBF9DBDF9BF0DBDBDBFDBDFBDBF9BDBD99DBBDADB9BDBDBDBDBDFFFF90DFBDBD9FFDBFFD909A9FFFF9909F9FFFFFFFAD0BFA9E9ADADADA9FFB9E9ADB0DADADBDADF9E0990D0900F0B99C90BC090BFF99FDBBDBDF0BD00009009B9DA9F9FBDBFDBDFBF9BAF0DB9BCBDBDBDB0DBD99DBDBBF9FDBDBDE9BDBFBDBFFBFF09FBFDADBFFFFFD90BDBDFBD0000BDBFBFFFFFF00BFADA90D9BF9BDF0BDE9BDA9F9B9F9AF9BF009BCB0B0DB90D0F0BC99B0B9DF9FF99CBDF9BDA0000009DEDB9F9AD9FBDBBFBF9BD999B9E99BC9FF9FDBF9FFF9DBDDBDBDBDB99DBF9DBFBFDFF9BF9909909090000FFFF900000F9DBFFFFFBFF09E90C90DABAF9ADA9BDA9BCB9F0BCF9AD9BCDB9C09D00B09E90B0909AD09C9BFF99E9BDBF00900000000B9ADBDBDBFADBDFDBDBDBCF0D09F9FF009F9FF9F090BE9EBFBFBFBDF0BD9FBDFDBFFE9DBC09FFF00000909FFF0009090FBFDBF9FFFFF09E900A99D9DBDB9FCBDBCBCB09FB0BDBADBBCB9A0B9C9F09A9DBC909A90B099FF9BDBFDBD00090009000F9BDADBD9F9FBBFF9EDB9900000999BF0000009FFD9999909FDBDBDF9BF9FBFBDBFDA99BB09FF009FE000FC009FFF099DBBDFFBFFFD0000A9CA0BE9E9E9BDA9F9B9EB09F9E9DFADF9C09D09A90BC9CB0B0E990F9F00F9FDBDA900000000000090D0BDBDEB9F9FDB9F9BC9E9900000BFC0000090FFFFFD099F9BD0B9BDF9F9F9FFFFFD0FD9D09000090000000FBFF090BBDFBFDFFFF0ADBC9009C99BF9BDABDB0F0F9DBC9ADBA99BF0B9B0BC90F990B09D099E9090099FB9FFD0000000000009CBB9F9BDB9FDE9BFDBFF9B90A9C9C0000009FC00BFF000BDBDFDBBDFDBBFFFFFFFFFB09BFBFBDBD0C009009F9FF000BDBDFADFBFBFE09B000A90A9AF0BCB9DB0F0F90BCBBF9AD9EFBD000D0BCB90E90DB0B0B9E9AD9A009F990000000000000009CB9F0BDFBB9FF9FB99FCBD909A9DE900009000000AD99F9BF09DB9BDFF9FFBF9FFDF090D9DADBF9FFFFF9BFA90B9FBFF9F9BFFFF9000E0900D09D9BDBCBE9F9B9AF0B0D0BDAF9BFBD9A99090F99A9AD9C9C9909A9C90000009000900900909009CBDBDBD0F090BDFE9BDBEDB0DB090FFDBC009BC99BF99F09FADBDFBDFFF9FFFDBFF9E9A99DBD9FBFFBD00D09F9FC9FBFFF9FFFFF09F9E090A00A9DA9BDBCBDE99BC9BBDA99AD9BD0AD9E9CB09E9C9B0B0B0F90C900000000000B0C000000A0DBBD0F9FBFD9BDF909F9F99BBDB09CB99FFF9FFDBFFDBCB09F9F9FFBDBF9FFFFFBFF9F9BD0B090B990909BF9BF9FBFF0F9CBFFBFFBC00F0DAC90B0F0F9E9BF9A9F0DB0D0BDAD9BEF0B99A90B09F9A9B0D09C900B9B0000000000000B00009C09BC90F9BF9DBADA90BF9E90FDFCBDFBDDA909AD09AD090909F9F9BDBDBFFFFF9FFFF9FB0D0FCBDBC9EDBDBFDBFDAD9E9F9A9BFFFFFFF09FB009000D0B9CB9F0F9F0FB0DABDADBAF9F90F0DA90F090D0D0B90BCB99C0B000000000D09C0900000F0BDB9FCBFA9DBDAD9009F9F09BDFBDFBDBFD9BBD99F9F9FF099E9F9FFFDBFFFFF9FFDDFBB9909F9B9BFFDBFDBFDBFBDBFFF0DBFFFF00BC0F009E90BDABDADB9E9B0DBAD0B9AD9CBBF90B99E99FA9A9B9CB0990E9B00D0C09000000A0000909009CBDA9BD9FF9DB9A0D9E909F099ADB9FBDBFFDFBFF90B999FBDBDBF9D9FFFFF9FFBFBBC9CB9F000C9009BDBF9BD0900090009BFFFFF90F09FE000A00D0BDBCB9E9F09DBDAD9AB9FF9CBC9E90A99C909E90DA0B90D90A0000000C09009C00A009F9B9FDBFBDBFAD0D9A090F00BF0D9E99FFDB9FBD090F9CB09DA9BC9FBBF9F9FFF9FDFD9090D0AD0000000000C00900D00009FFFBFF00BF0F00909C9A9ADA9BDE9B0BCB0BDAF9DA9F0B09B90F9DA9ADA90B09D90F0AC90000000900C000009C9A9BCBDB9F9FBC9FB00090F00BD09BF0F090B0D0000F090B0C9B0DF9BFFDFFFFFFFFFFBFBE0000900900000090000ACB0A909BFBDFFFE9C09E90E00A0D0DB9FDA9BCBDBCBDA909ADFBD0BD0E909AD9009F9C9A9E99090090090000000900900B0DADBDAFCBDBD9F9DF0000909009E0990F00D9000000000C900C990909BFBDFFBFFFDBDBD990000900F0D0000909090909C9BFFFFFFF90BF09E9000900A90FA9F0F90B09B0DBCBDABFBD0B99B0F9ADB9090B0D09E9F00000000000900A00000C09F9EF9BDBFDA9FB0BD000000D009C009090A00D09F090090090A09FF99FFFBFFBDFFFFFFF099E000900000C0A000F0C09A9FFFBFFFFFAD0BF0F0BC0090BC9DA9F0FBCBCBDA9B0BD9F90BC9E0D9AD00DBCB09A9A900900000000000009C0B090B0BDB9FDBDB9F9BDFDBF90009000009E0C009C9A0C0000000000D9FF9FFF9FFDFDFBFFBDBFF9090C000009099C9FB09BBC9FFDFFFFFFD09ADF0F0009AC009BAD0B909B090BF0DADAFF0BC9A999AD9B9B090D099C90F000F0000000000000C0A0DBCB9F0B9E9F9FDBF9AD9F000009A9099A90000090900000009909BFFFDBFFFFFFBFFFDFFF9FFDB900000A09EBF009DADBFFBFF9FFFFA9E9FFF09C000900F0D9F9E9E9CBBD09A99F9BD09B0DAC9A9C0CBDA9ADA9A90000009000000900090090099F0DBDBDBFF9BD0BDBE9BD0009FEBCBCBC909000C9000909BDBFDF9FFFFFFBFFFFFFFBDBDBFFFFFBDBD9DF990BDBE99FFFFFFFBFFFD0B0BF00F0B000090B9A9A909A9C90BC9CB0BFBD0DB99BCB9B9090909090D0BC0000C0000000C0000D09ACBDBF9FDBD9FF0FBDBD9EDBF90909F9090BCBC0F000099DBDFFFBFFFFFFDBFFFDFFFFFFFFFFFFFF9FF9FFBFFFDF9F9BFFFFFBFFFFFFA9C90FF0F00D000000E9ADA9C9A90F0B0B0F0DA0B09E0990F0DBCBCBCBCB0900900000000000090000A0D00A9FE9BFFF99F9FADBF99FFF0009000090BF9B99F9FFFBFFBDFFFFFFF9FFFFFFBFFBDFFBFFF9F9FFFFFBFFFBFFFFFFFFFFFFFFFFFBDA0AFBCBCB0A00000909C90DA9C9E09C90D09BC909E99F0F09B0990909090E900000000000000000090C9B99DB99E9B90F9F9FDB09FBCBFD09E9FDBDF9BDFFBDBFFFFFFFFFFBFFFFFFDFFFFFFFFFFFF9FFFFFFDBFDFDFFFBFFFFFFFBFFFBFFFF09BD9CB0F0C00000000000000000090000000F000090000900000000000090000000090090000009000900F0BDFF9FDF9BF0F9BFDAD9F9BFF99DB9FFBDFFFFFFFBDFFFFFBDFFFF9FFFFBFFFDFFFFFBFFFFFFFBFDBFFBFFFFFFFFFFFFFFFFFFFDE00FAFD09A9000000000000000000000000000F000000000000000000000000F00000000000009000000090D0B09FB9AD9DBDF9BDBBF9FF9FFBFFF99FBDFBDF9FFFBFF9FFFFFFFFFFBFFFFFFBFFFFDFF9FDBFDBFFFFFFFFFFFFFFFFFFBFFFFFB90090BE9EDE00000000000000000000000000F0000000000000000000000009000C00000000D00000000BC09BD9FBDFD9A9FBDEDBDF9FF9F9FDBDBFFFFFBFFBFF9FFFFFFFFFFFFFF9FFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9CB009F0B9A9E9C000000000000000000000009E000000000000000000000000009A000000900000C000900B009AF0DB0BDFBDB9BFF9FF9FBFFBFBDFF99BDFFFDBFFDBFFFFFBFDBFFFFF9FFF9FFFBFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCB000BCBDEDF00000000000000000000000000E9A09000000000000000000000C0000900000000A900090C900D099DB9FDBBCBFFDBDB9BDBDF9FDBF9FFFFBDBFFFFFFFBFFFDFFFFF9FFFFFBFFFBFDFFFBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC009F9F0B0BCB000000000000000000000000BC00A0000000000000000000090009000000000000000000AD0BD0BF0F9BC9F999F9FFDBFFBDFBFDFFBDBDFFFDBFDBFFFFDBFBFFBFFBFFFFDFFDFFFBFFFFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFDA90000BE9F09F0C00000000000000000000000CB00000000000000000000000000000000900009C009000909000BC9BDADBF9FFEDFBDBFDBDBFDBFBFDFFFBFFBFFBFDBFFFFFDFFFF9FFBF9FBFBFFBFF9FFFF9FFF9FFBFFFFFFFFFFFFFFFFFFFBF0090BC9BC0BC0B00000000000000000000000BC0000000000B00000000000000C000C00000000000000000FAC909BC9DBD9FDB9BBDBDFBFFFBFFDFDBFBFFDFFFDFFFFF9FFFFFBDBFFDFFFFFFFFFFDBFFFBDBFFFFFDFFFFFFFFFFFFFFFFFFFBD00900FDAC0BF0BD00000000000000000000000CB009A0C00000000000000009E0900090000000090000000009F09C9BA9BFB0BDFFDBFB9F9BDFDBFBFFFFDFBDFBFFFFFFFBFFBDFFFFFFFFFFFFDBDBFFFD9FFFFFBFFFDBFFFFFFFFFFFFFFFFFDAF0E09AF9F00F0DAE0000000000000000000000BC00000900000C00E00A000009000900000000000000D000900B90BC9F9C9FDBF9BF9DFFDFBFBFDFDBF9FBFFBFFF9FBDBFFDFFBFFDBFFBFFFDBFFFFFF9BF99DBFDFBFBFFFFFFFFFFFFFFFFFFF909009F00ADBF0BD00000000000000000000000E9A0000A00000B009009000000000000000000000090A0090009E90B90FBDA9F9FD9FBF9BFDFDBFBFF9FFFDBDF9FFFFFFDFFBDFFFFFFFFDBFBFFBFF9FDE99FBF9FBFFDF9FFFFFFFFFFFFFFFF9E9A090DB0D0F0BFE00000000000000000000000BC0000000000000000000000000000C000000000000090000D009BC90F909FDB9FBFBFDBFDBFBFFDBFFFF9FFBFFFBDBDFBFBFFFFBFFFFBFFFFDFFF9F0099E99FF9FFDBBFFFBFFFFFFFFFFFFBF0BC0F0A00BE9BCD000000000000000000000000DA00A090000000ACA0000009000009000000000000000C0900BC90BC90BF90BDBF9FDBFDFBF9FDBFFDBDBFBFFDBDFFFBFFFDFFBFFFFFDFFFFFBFBD090B9F99F9FFF9BFD999C9B99FFFFFFFFFCF0900090D09C0BE900000000000000000000000E9C000000000009000CA0000000000000000000000000900A09ADC9BBD9CB99ED9F9FDBDBFDFBFF9FFFFFFF9FFFBDBFF9FBFBFDFDBF9BFF9F9FFC99099F09BFDBF9FF9BFE9000FBCBFFFFFFF9F0090FC0BF0BCF00F0000000000000000000000F0A00000A00000000B0000900000000000000000090000009C09A909C0B9F0F9BF9BF9FBFDBDFDBFFBDBDBFFFBFFFFDFFFDFFDBFFFDFFFBFFFF0B00FBF09FDFBD9F09FF090B9D9099FFFFFF9A0BC0A90BC009B0BC00000000000000000000000AC9000000000000E0000000000000000000000000000000900009CBC9B9CBDB9FDBFDFBFDBFBFBFDBDBFFFDFBDFF9FFBFFBFFFFFFBFFDFF0B00909B9D0BBFFBD9B09F909090CA00FFFFFFFF0F9C909CB0F09AC9D0C0000000000000000000000DA00C00000009A090E0000000000000000000000000909000BD0A90B9CB9CBD9FBC9BDFDBDBDBDFBFFDF9FBFFFBFFBFF9FFFDBFFFDFFB9F9D9900C9F09DF9D0B09FBDAD0BC09009BFFFFFFF900A09A0C90BC9B0A000000000000000000C00000F9E0A00000900000009E00000000000000000000000000000009C090FBCB9BCBCBFF9BFBFFDBFBDFDBBFFDF9FFDFFDFFFFFFFFFFB9B9F900B0C99BF09F09FB9FDA9F000900B0009FBFFFFF0F09C0BC9AC9BEF0F9F000000000000000C0000000F0090000000A000AC0000000000000000000000000000009C09F090F09F9E9B9F9DBDF9F9FBDFFFB9FDFBFBFF9FFBFFFFBFBFFF00C09009F009AF909B9FF09C90900909009009BF9FFFFFFF000B000099AC90DA0000000000000000000000C000E00E000000000009A0000000000000000000000000000009000BF090F0BDBCF9FBFF9F9FBDBBD9FFFFBF9FFDFBFFFBFFFDFFBD099BD0BF09DBD9C9F9E9090B09BC90000BC909E9FBFFFF90909C000D0AC9F0B0D0000000000000C0000000000F090000000000000000000000000000000000000000C0AD00A0909CB909E9DB9F9F99FBFFDBDFFBDFBDFDFBFBFF9FFFDBFBFF099BC9A9C9D0B0B09BC9900090BC0000090000E9BFFFFBF9E00000090A90B00BC9A000000000000A00000000000F0A00A00000000000090000000000000000000000009090F090C0090FD09A9F9F9FFF9F9BFDB9FFBDFBFBFFDFFFFFF9FFFFD0F00FF9CB9A009FD0B00A09DBC00900009A90A90B9FF99FFF9000000E900C9F09A9C000000000000000C00C00000AD00900000000000A00A00000000000000000000000000000009A90DA9BF9F0FBF99BDBFDBFFFF9FBFDF9FFBFFFFF9FF99F0B09F90099C099F000D09D90A09090009E0C009DADF900BFF000DA00900000B00E0DA0C000000C00C000000000000DA00C000000000000000000090000000000000000900000090F09CB09DE90F9BDE9FFFBDBF9F9FBDFDBFFF9FF9FFDBF99F09C9E909BC0009F99DB0B00A09000000B00909C0B9FA09FF0000900900009DBC0B99B0000000000000000000000000AD00A0000000000000000000000000000000000000009C000000A09B0B9DF9FDF9F9F9FFF9FFBDFFBFFF9FFFFFFB0BCBF00900900C0B00BCA0000D00D0D09DAD0D0D00009B0F0909F0909A00000000A00900AC0F000000000000000000000000F0A0000000000000000000000000000000000000000000900090D00D9CBA9E9BBDBFBF9BFDB9FBDBDB9FFBDBFFFDBD99F0909BD0909000999CB0900B0000E90B0B009A9E09F0F09F90A00D0000000909000D9B00000000000000000000000000F0D00000000000000000000000000000000000000900000BC0000B00B09DB9F9FBD9DBFDBFFFFDBFFFFFFDFFFF0090F00000F0000AC009AC0900009C090B00F0C9CBAD099BE900F00C909A009000000E00F0ACBC0000000000000000000000000A0000000000000000000000000000000000000000000000000909C909FB0F9ED9FFBFDBDBDBDBFBDBDBDBF9F9090F9090F9000090909C90900D09A09E90C90090B0D9ADAD90BD0009000000000909090F00D900000000000000000000000000F0000000000000000000000000000000000000000000900900C000ADBC0DF9F9BFBDBDBFBFFBFFDFF9FFF9FFF009F90C090000900F0009A00000AC00000909ADA9C9AC99B0E90A09000A90D0000000E0000B0AD0000000000000000000000000AD0000000000000000000000000000000000000000000000000009009B0BDADF0DBFDAD9F9DF9BF9FF9BFFBFC0909CB00AD000009000B00D00900909000000900090900E9B9C9000909C00000000A900090D90A0000000000000A00000000000DA000000000000000000000000000000000000000000C0000900900F0DB0BDB9FBDAFDBF9FB9FF9FF9FDB9FD0B0DA900090000090009C0900000D0000000000090000BF90C0A009A0A0900A000090000B0A0AD0000000000000000000900E000AD0A0A0000000000000000000000000000000000090090000009E0090B0DBDBDF9BD9BFDBF9FF9FBBDBFFFD090909C009000909C00900900900000000909000000AD9C9C009090C9090A00909000C0090C90D000000000A000A000090E000000DA0909CA900000000009A000000000000000000000000009000009000DB9E9FA9FDBFF9F9E9F9F9FDBFBDBF0BC9A09000000000000090000000909090000000F09000B00B00009A0C0D09C00000000000000B000000000090090000000900000E9E0A090000000000CA0C9A0C000000000000000000000000000000909E99F9F9BDF9BF9BDBFFBDBFC9F9FC9900D000090000009000090000900000000000900009000F90E90E0090A00000000900000090BC00000000000A00A000000CA0000F0090CA00C000E9A0909A000B0000000000000000000000000000000009F00F9FCB9FCBDFF9F9FBFDFBDBF00A0D000900000090000000000900000C00000A0000000BD0009009090E90090000000090F00BC00000000000000000000090000000F000B090A0B000C0A0A00F0000000000000000000000000000000000009F9BCB99E9BDAF9BDBDFDB99FF099C9A90000000090000009000000000900090D0090090BD0AD000F00E90009A000900000000BC0B0000000000000000009E0000000F000000E090C0B0A9C00D00000000000000000000000000900000000090009F9F0F9FDBD9FDBFFAFBCBD900A000000000000000000000000000900000000000000F00000BD0090909000009000000009009000000000000A00000000000000000F000090A0A90C90A09A0A0000B000000000000000000000000000000000900F9F9F99EB9ADBF99D9F9BCBD09090900000000000000000000000000090009000000F090900B00F00009C000000009A00F00F0000000000000000000090000000F000A0A09C00A0A090A0090F000000000000000000000000000000000000009DA9E9AF9DFB9F9FFBF9FDB000AC000009000000000000000000000000000000090090000E9BC9F00000A09000900D009009F000000000000000000000000000000A00909C0A0B0909CA00D0E0000000000000000000009000000000000900009ADBDBDBDBBD0F9F9FDADBC0909000000000000000000000000009000000000000090000090C0B000AD009AC0000A000009E000000000000000000000000000000F0DAC00A09000ACA00D0A0000009000000000000000000000000900000000009BDA9F0FC9E99FADBFDBCB0000090000000000000000000000000000000000000BC0000BC090C00900F0009A0009009CB0B0000000A0000000000000000000000DA009A00A0A0D009A0000000000000000000000000C00900000000000009000C09DADB9F99E9FDBF9F9BC0090000000000000000000000000000000000000000000909000A9009E9000000C090000A00D0000000000000000000000000000000AD00A00D090DA0BC0000000000000000000000000009000000000090000000090A9DBDAFCB090FBDBCBC90000900000000000000000000000009000000009000009A00009000B0000090090000C9A90F0000000000000A000000000000000000F0B0C09A0A0A0000000000000000B0000000900000000000000000000000000009CA9E99BC9BF909C9000090000000000000000000000000000000000000000900000009A9E900900F00000B00900C9000000000000000000000000000000000F00A9A0009C90F000000000000A000000000000900F000000000000000000009000909BC09C00AD0B0F90000000000000000000000000000000000000000090E90000000C00090E900000000000B09A0000000000009000000000000000000000F000DADA00A000000000000000009C000000000000009000000000000000000000000090A9090BC90000000000000000000000000000000000000000090CA900000D090B900E9000090BC90090C00D0000000000000A9A00000000000000000F00F0A00000000000000000000000A00000A0900000000000000000000000000009000000D000D00BC90000000000000000000000000000000000000000090000090000AC00D00000AC000000CA90A0000000000000A00C000000900000000000F000000000000000A000000000000009009C00B000000000000000000000000000090009000900900000000000000000000000000000000000000000000000C90C0009090B000BC090A09A09A90090000000B0000B0CB0A00000A0000000000F0B0A900000000000090A0000000009A00000000909000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000BC0AC090009A0090000C000F000000000A00009A0900000000000000000BC0000C00C00900B00A00000B0000000000009000000FE0000000000000000000000000000000000000000000000000000000000000000000000000000900000000090090000CBC09C009C09000900000000000000E09ACA0000000000000000FA90CA0B009000A000000000000000000C90AC0000000C00D090000000000000000000000000000000000000000000000000000000000000000900090000000000000000909A900000000A000BC00000000A09000090E09000000000000000009C0A90000A00A00000000000000000009000900DA00900000000009000000000000000000000000000000000000000000000000000000000000009000000900E9000000AC0000090000000900000000000000A009A0A9AC00000000000000000EBC000000000090000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000900000C9090B0C0000B00F0009C000000000090000009C09A00000000000000000DA9A000000000A0000000000000000000A000B00000000000000000000000000000000000000000000000000000000000000000000000000000900000000000000DA0000000900A009000CB0B0000000000A000000A0AC000000000000000000F0C00000000000C0A000000000A000000000000E900CB0000000000000000000000000000000000000000000000000000000000000000000090C00000000000090009E90000A09C00000B0000000000000000000A00909A00000000000000000DA00000A0000900900000000000000000000009000900090AC09000000000000000000000000000000000000000000000000000000000000000000000000009000090000909000090009C0000000000000A000000900A0000000000000000000F00D00009A0000A0000000000000000000000000000000009000900900000000000000000000000000000000000000000000000000000000000000000090000000000000C0AC90000CB00000000000000090000000A00000000000A000000000AF00A00000CAF0000000000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009A90000000B0000000000000000000A000A009A000A9C0A0000000A000F000000A0900000000000000000A0000000000000000900000000000000000000000000000000000000000000000000000000000000009009000000000000900009000C000900090000000000000000000A0000900000000C0A090F000B09C000C0000900A000000000009A000000000000A00000B00C0000000000000000000000000000000000000000000000000000000090D00000000000000000000000000E0BDA909E0900BC0000000A00000000000000009A0000B0A900A00000CA000F00000A0000000000000000000000000000000000009A00000000000000000000000000000000000000000000000000000000000009000000009C00900000000009C0000E0000BC000000000000000000000000A0000A000000F0C00000B0000AD000000000B0000000A00000000000000000000000009000000000000000000000000000000000000000000000000000000000090000000000009000000000000009009009000000000000000000000000000000000090A9E00B0000000EBC0DA0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C0000000000000000000000000090900BCA0009ACB00000000000000000000000000000A09E0C009A0000000A90A0A900000000000000000000000000000000000000000A0C09009C00000000000000000000000000000000000000000000000000000000000000009C00000000000AD00900CB0900000000000000000000000000000090A0B0B0AC000000900F00DA000000000000000000000A0000000000000000000090A00000900000000000000000000000000000000000000000000000900000000000000000A90009CA0F090B000900C000000000000000000000000000A0B0A0D0000009000000ADA000F00000000000000000090A00000000000000A000A0900000F00AC0B0000000000000000000000000000000000000000000000000000000900009A000000009000000D000B00000000000000000000000000900C0CBCA0A00000A000000000F00F0000000000000000000C90009000000000000000000A0900090000C9C00000000000000000000090000000900000009E000000900090000F000C9C0A90B0C00BC00000BC000000000000000000000000000CA9A9009009A0B0000000000B0000F0000000000000000B000AC0A000000000000DA00A0900000000090000000000000000000900000090C0000A0000000090900000000009000900009C0000B090000B0F000000000000000000000000000A0A90000A00000000000A9009A00A0F0000000000000A00000B0090000A00000A09A00C900CA00B00000000000000000000000000009000090009000D00C90000000000000000090A0B000090000000090C90000000000000000000000A0000009000A00000A0000000000A0C000000F0000000000000D00000CA0C0A000000000000B0A000000000B000A090A0D0000009000000000C000000000D0000000000000000090000000000090AC09C000DBCB00000000000000000000000000009A00A00000000000A00000000A0BCB00F00000000000000A00000090A90000A00000000000CB000000C000900009000A000000000090009000000000000090000AD0000900000D00E090DADA9000090F000000000000000000000000A000900A000000000000000090000E9A9000000000000000000009E00A00000000009000000000B0CB000009E9A00000000C0000009000D000009A00C0000000000000009000BC0ACB0F00A0900000000000B00000000000000000000000000000A00A0000000000000000000C90A90CAC9A00A0F00000000000A09009C0000A0000A00900A000000000000000009A0000A900090000000A90E0000090C0B0000F000000000000090000900000000000009000CB0000000000000000000000A0900000000000000000000C0A00A000A09A00A900F0000000000000A0C00A000000A000000000000000000A00A9E000C0B000000000090A9C009000D0A900000900000000000000000000009000C90900F00DA900000000000000000000000000E00000000000000000AC00B09A9AD0DA00000000F000000000090009A0090C090000000A0000000A90009009000BCB00000000B000E0000000000B00000090E0000900900090900009000C009000000900B0000000000000000000000000000000000000000000909A00B00CA0C0A0A0000000A00F000000000A000000000B0E00000000000000000A0A00000EBC00000CB0000090000CB000A0C0009C00A09000000000000000900000090000A9E0BC0BC00000000000000000000000000A0900000000009A9AC0E00B0E9A090A90000B000000F0000000E9000DA000000000090C00000000000000900000A90A9A00B000B000A090B000BC9090A000B0D00009C09C000000000900000A900D00900000000000000000000000000000000000A00000000AC000AB0B0C00000A000000000000000F0900090000A000000000000A09A00000000000000000009E9C00F0000C0090C0AC0ADA0ACA090DA0C0000C0A000000B00000000D09000CA000000000000000000000000000000000000000000A00B000B0E9C00CB09A090000000000000000F00000A000AD00000000000000000000000000000000000000A0B00000B000A09A00BC00D090CA000900B09090090009000900F00A0A00090000000000000000000000000000A0000000000009000000B0009A0B0A00A00A0000000A000A00000A0000000000000000000000000000000000A900000000000B0BC0A0000000000090009A0A0A900900A9C0A000C0A0000C0E0B00BC9C0000000000000000000000000000000000000000000A00A090A0009A00000000000000000000000000A0F000A00009000000000000000000000000000000000000A900C0A9C90009E000000E0A000C9C0AC0AC00000C0A90C0000A909C0F0A000A0000000000000000000000000000000000000000000000A0090A00A90A09A000000000000900000000F0F000CB000A00000000AC00000000000000000000000000B0B00A0A00A009090A09090E9A0009000090A90B00000000900A0B00F00000DA00000000000000000000000000000000000000000000000A000000000000000000000000A0000000F00009A00A00900000000090000000000000000000000A0C0000F000000000A0090A0E00000B00A900A00000000A90000000C0E9000B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000F00AC00C9000000000000A00000000000000009000900900ADA000000000B0CBCBCA900000000000900DA000090009A00090B00000C0B000A000A00000BC000000000000000000000000000000000000000A000000000000000000000000000F0090A90A0000A0000000000000000000000000A000A000A900000B0000B0CB00A09ACB00BC00000A00A00000000000000000090000B0C000000D00000009AC000000000000000000000000000000A000A9000000A0000000000000000000000ADA0000000E09000000000000A00000090DA9AC00C000000000090000900B00B09A09000000009000000009000000000000A00E0A900A90090DA00000000000BC0000000000000000000000000000C00000000000000000000000000000A0000F000000A9090C00A0090A000000000A90AA0C009A9009A000A9A0000A0000AD0CAC9E000000B00A090090A000000000009090B09000F00A00A000000000A0900000000000000000000000000000B0900000000A00000000000000000000000000AC0000000A0A00000A090090000090CA9C9A09A00A0000000000A0900A9E9A0B09A0000000000C000E00000000000B0CA0CAC0ACB0000000000000000000A00A09000000000000000000000090C0A00000A0000000000000000000000000000F09A0000000000D0000000A000000A9A90A00000C000000900C0000000000000000009A09A0009A9A00000000000000900090BC900E90000000000000000000000A0C00000000000000000000A0BC000000000000000000000A0000000000000F0000000000090A000000000A90000C0AD0F00B0B000000ACB0A90A00000B0F000BC00C00C9A0000C90B000B0000000A09A000A0B00A000000000000000000000000A000000000000000000000009E00000000000000000000000000000000000F0000000000A00000000000000A9A9ADA0000000000000000000000000000000000B00B0A00000B0A0000A0000000000000B09C0CBC00000000000000000000000000A000000000000000000000A00000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010500000000000089AD05FE','Andrew received his BTS commercial in 1974 and a Ph.D. in international marketing from the University of Dallas in 1981. He is fluent in French and Italian and reads German. He joined the company as a sales representative, was promoted to sales manager in January 1992 and to vice president of sales in March 1993. Andrew is a member of the Sales Management Roundtable, the Seattle Chamber of Commerce, and the Pacific Rim Importers Association.',NULL,'http://accweb/emmployees/fuller.bmp'); + +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(3,'Leverling','Janet','Sales Representative','Ms.','08/30/1963','04/01/1992','722 Moss Bay Blvd.','Kirkland','WA','98033','USA','(206) 555-3412','3355',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000080540000424D80540000000000007600000028000000C0000000E0000000010004000000000000540000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFB009A00A9009A9AA9A900009AA9ABE9EB0B0BB09A0AB0A9A9B0FA0FA0CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFE9A09A9EBEBFBB0BB0AB09AC9090AB0BCB0BA9E9AA9A90B000009AAB09009BEB0BAD0EB9E9F9B0C0B0FADB0F0BEB0FCBC0BCBFB0F0BBE0B09BA0BBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFA9DABEBFFFADFFADBF0BEBBAFAF0FBBAB9ADABADBE0AB0BCBFBC090E0A9AFA9BC90BB9AFABEE0BB0FA9ABEBE9B0FBA9AB9A9A0FB09E0BDAFA0DBE9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFB0FABFFFAFAFEABCBAA9F09AF0B9BBCBE9EBE9ADA9A990FAB0000BFA9090B09E0BAF00A9ADAB9BCBE9F0BCF0BE9FA9EB9CA90FBEAF0BFBA9ADBA9ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FE99A9FAFFFFEBDA9ADBCBFA9BA9EAFACB0B9AF9A9AFAEB0900BB9A0000A9AF0BBCB0B9E9BADAFAB0BABEBBBC9EAA9EBEABBE90B9B0B0BCBE9A9FADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBAFBA9BEBE09ABFEBABAB0F0F0F9DBFBBAFAB0FAF0B090BCBC00090B0B0A0BBE9B0BCA9AF9A9BC9E9FAD00ABAB9FA9CB9C90B0FABFF09ADBFEB00B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBE9ABDEFBDBBFFCAB0F0D0FB0BBA0ABF0FDA9F0A90009A09A0B00000000D0BDA9AFADA9BDBEBFABABBADABFBDA9E0BEB9EBABE9A9EB0FE9AB09FAFBAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B9E9FABADAFEB0BBDE9BABBA9FEDBBF0BFABC0A900BFE0BC0900B090B0B0BFAFE9A9A900A0B0E9CF0C0B0F0CADABF0F0ABBCB0B0BCBEB0A9AFA9A9E9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFABA9F9FAF0FCBCAB0BE90EDABBABCBFA090B090FBFEF009A0B00A000F0B00B0BE9EBAF9FBFBBBBABB09FABB0F9AFA9FBCFBCB0E9B9A9FAC9F0BC9F0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBF0DA0A0FBEBABBDEF9AFBBADA9CB0A0BCA00BAF0BFFE9BA9009090B09ACBBAFF0BADB0A0BADACBDE9CA0BC0BAAF0FBAEB00B0B9A0F9EB9ABAFABABBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BA9BFBACB9EDAB0BAF9AE9A9FA90900090B0F0BFBFE000CB0A00009A9B0ADB0BE900A99ADABFBABEA99A0BF0F9AF0FF0BFADA0E9BABBEBC90BC9E0BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9E9AF00FBFEBA9EBBC9A09BCA000A09A9ABCB9BFFEE9AF0B009090BAFBEB9BAF0BAFF9ACB0BFACBDBBE0DBFAF9EB0B0BE909A99B00BF0B0AABCBABDBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BA9AFBCBCBBEBBCABAD000090909009AC90B0AA9FF090B0B00A0BC90F090F9EBCB0AF9ABF0B9BAA9CB0A00FAABCBEBDAFAF0E09BE90FBF9CBB0BCA0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0FBDA0BABE90CB9B0FA9AB000A00B0A9A9A9F9EBFE0BC00090900BA9BEB0BABCB0FB0BCB0FBEBDBFA9E9BFADBCBA9A0BE90BBB0E9AFA90FA00BE9A9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A0B0EBFBCB9EBBAF0F0BC90B0090000909A9E0BBFEE900B0DA000900FA0B0B0BBE9B0BEB0B0AB0A0F0BBC0A99ABAD0BFF9EB0C009A909EBA9E9F0BCADBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9BDBFBB00BE0BAC9AFA9ABFE09A00909A0BCBA9AEBE90AB00A90A9ABFBE9F00FC9AEBC909ADB9EBFB0BC0B09AE9CB0F0A0A90B9EB090FAB0FA9A0FA90ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0A000CBE9BE99BFA90F090AB00000009090F0BFBFE0B0DA900090BCBA90AB0BEB90BAFADBA0FB0EBEBABEBC9AA9A9ABF90FA009A9EB09E9AFADA9CA9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB9FB9A9AE9BEFAF9A9ABEB9EBCB00000A0B0BE9AFF0FA090B00A90B0FADB009BAE9ADBAB0FFB0FBF09BF00B0D0F0EB00AB09EB0DA90A9AF0B0B0CB00B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0A00EBCB9BEB0BA0F0B09AE90B00B00090A909FFF09009A00090A0F9A9BAB0B0BFADA0D0F0B0BA9A9E00AF0A0BA9BC9E909AB09A09A9CA9ADACA90B0BCFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9B9BB0BE9E9E909F0BCBEB90B9CB00900BB0FAABEE0B9E090B0BDBBAF0E90C9AE90B0BAB09AFDABE9ADB9A909A9E00A90E90D0A09E0B09A9A090A00009BFE000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CACBE0BA9A9AB00B0B0BC0BCAB0B0000009AFBE9A9E090A0009ABEFABBAB009BADAF09ABE9ABBDAFBAFA9E9AD090B0A90A0A9CB0900B0DADB0B000900BC90000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB9ADBE9FA9E9EB00F0F9A9E900BCB0B900F90FBEDA9A09090A9A90BC0DB0B09AFB00BCBCB0BCBEB0BDA9E0BC0A0BC090A9090B09A9B00B0A00009000900000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A9AA9A0BF0B0BFBA90ACB0B0F0B0B00A90ABAFE90ADA0A0090DAFB0BA0BC0AFAC0BCB0BADAB0B0FEBA90B00B0900BCA9CB0A00A0000B09090900000000009000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9BF0F9FADA0BBFF0E90A99ABCB090B0E9000B9FE90E9009009AFAA9A9A9F0A909BBB0B0BC9A9EBDB0B9E0BCA9000BA009A0090B0909A900A0000000000000000090009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9A9AB0BBF0F0B0B9EBDAE90B0E0BC9AF0B00E9F0A9A9A090A9A9FAFCBB0B0B00FAF0E9AB0B0BAB0F0BBF0B0A9A909A9090A0000000009090000000000090009000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBE9AF0F09AFAF0A9EA90A90B090B09A90B0BAF090009A0909BE9BA9AFBBC0A90F0B0A9CB0F0DAFABE0000900000000A0A9090A9A900A0000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09A9ADBF0BBE9B0BBE90BBCA909A009A9AC9A0BEBA0F0009A0BEBBE09F0009A90BABE090B0B0BABBCB090B000090009090900A090000900009000000090000000009009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9A9F0A00ABE9B0FA09ABC0B9E0A9F9ADA9A9E9D00C90A9000F0BDA0DA0FBBE9E09F9FA0B0E0BCBCBAD0A009000000000000009000000090000000000000000000900000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA9A0B9DA9CB9EB0BDAD0BBC0B09000A90BF0BAA9A9A9009A90BAAFFABBA0A9A9A0A0BDAC9B09A9BE9A909000000000000009000900900000090000000000000000000900FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9ADA0A09AB0A0BE0B0A9E0B00B0B0B0A900F09E09000B000B0BFF0B0F9F9BE9A9E9BEA9BA0DA9E09E9000000000000000000000000000000000000000000000900000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE09A9BC9A9CBE9E9F0F0B09A9AD00B09C0B0B0BC9AA9A009A9ADABFADAABABCBCB09EB9C009A9A09B0A00000000009000000000000900000000000000000090000000909C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09A9C00A90A09A9A0A0BCBA0D0A0BC9A9A900BE9AC90090BCBFAFABCBADA9BA9A0A9BCAB0F0B090A0090000090900000009000000000090000000009000900000000000BE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFE90A9A90A90B090909A9A0DBA0990B00B9E09F0A9A09A000B0BFDEBE9FBEBEFAD9000B0090A0F0BCB000009000000009000000000000000000000900000000000009000BF0BFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBFFA09000090090000000909A009A0A00B00A90A0F009A09A9ADA0BADBB0A9F09B9A0F0BADB0A990BCB0000900000000000000000000000000009000000000000000000009FE0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA909090009000000000000000009A00909A09BC0BFF09AC090090BFF0FAE0BF9ABBEE0B0A9F00A900A090090900000090000000000000000000000000000000000009000900BF09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF909090000000000000000000000900090BF009E00B0BA0A90B0A9AFA9ABA9BFABAD00BFF0900BA9DA0F0B0B00000090900000000000000000000000000000000900000000009A9ED0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000090000000000000900000009000000B0B0B0BECBDA0090CB9EBFF0F009CBBAB0BEBE909E0A9009000B00090000000900000000000000000000000000000000000090000900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00909000000000900000000000000000009009009A09BF0A090A0B0ABBEBEFAFEBBCB9ADAF00A9AF090A9A9E9009000900000000000000000000000000000000000000900000090009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09000000900000000000000000000000000000A9A009FEA9BCA9090BB0FFFFABF0BCBEAB0BFEB09E9A0A90009000009000000000000000000000000000000000000000000090090090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000000000000000000000000090000000009000909AF0DA090E0F0FFFEBEDFA9EBA99AF0BF09ABE09009A9A09090000000000000000000000000000000090000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00009009000000900000000900000000000000009A00BF0BA09A99BBFAABFFBB0BE9BCBA90F0FE090BCA9A0009A000000000000000000000000000090000000000900900000000090D0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9000000000090000000000000000000000000000090A0BC9AD00A000BFBCBCBEF0BAFBCBAB0BABCBAF09009A9A0900900000000000000090000000000000000000000000000000900A9FEFFFFFFFFFFFFFFCBF9FF9FFFFFFFFD99F9FFFFFFFF000900090000000000000900000000000000000000009BEBE90A909E9F0BBFFA9EBC9B0B0BCF09EF0BC9A09A00090000000000000000000000090000000000000000000000090090A99EBFFFFFFFEF9A9BF9FF9F9F0F0BDBFFFB0FB9F09FFFFE00000900000000000000000000000000000000000090BAE900A90BABBAFAFEA9EB0BAAF0FEB00AFBE9A0900909A00000000000000000000000000000000000000000000000000009C0A9FFFFFFFB9DBDFDBFDBFBF9FBDBE999DDB9CB99A990FF090000900000000000000000000000000000000900009FBAF09A09E9E9E90BCB0E9EBDAB0DAF9CAFFE9E0B0A0090909000000000000000000000000000000000000000009000000B0900BFFFE90DB0FBFFDBFDF9FBD9F9BFFABDBFBDBDB0F90900000009090009000900090000000009000000000000A9E90A09F0BFAFAFEBBCB9E9EBF0BAF0AB9BAFA9A0909A00000000000000000000000000000000000000000000000000000000BCBFC9909B0FBDBFFF9FBE9DAF9FDB9DBBDBDBCBF99ADA00000000000000000000000000000000000000000009BEFA09A00BF0BE9A9E0B0A9A9E0B009EF0E0FE9AC90A000900000900000000000000009000000000000000000000000000900B09009ACBF0F9DBDAF9FBDFFBF9ADB9FFBCBDBDBF09F0909090000000000000000000000000000000000000009A9A909AD0B00ADCB0F0900909A9A9E0A90BFFA9EB0A090900090000000090009000000000000000000000000000000009000909009A09909F9FBFFF9F9FF99F9FDF9FB9DBDA9B99DB0B9000000000000000000000000000009000000000000000AF0E90ABCBFBEB0E9A0B00A000900C90000BEF0F9ADA000900000000000000000000000000000090000000000000000000000000090A9F09B9F9BFBFF9BFF9FBBDBDFFB9F9F9FABD9CB0909090000000000000000000000000000000000000909A90A90DA009BCBB0F00F090900B0000B0009AF0AF009A9000000000000000000009000000000000000000900000000000090009009009BFBCBFDBDF9FCB9FBDF9FB9ADF9F9B0D9A9B90000000909009000009009009000000000000009000009E0B0F0A9FAEAB0CB0B000000000900D0009009AF00B000009090000900090090000000000000000000000000090000000000900090BDBC99FBDBFBF9FB9EF9FBFF0F9F0F9ADF9BBD9E9A90900000000000000000000000000000000000000A9A0BCB0ADA009F0EB0009A900B009AC000000000009A0F0090000000000000000000000000009000000000000000000009000000900090B9AFBDBFFDBF9FDBDFF9F9FFDBF9BDB9BD0B09000000900000000000000000000000000009000000900090009009ADA0B90BCB000090900009C0D00000000090B0009000090000000000000000090000000000000000000000000000000090B9CB9DBFF99F9FB9F9B9FFFB9BF9BE9F0BCBD0B9B9090900900000000000000000000000000000000000B0A9A9A9A09A9E0AD0B09009ACA00000090090000009000090000000009000000000000900000000000000000000000000000000090909B9EBDB9FBFFBCFBFFFBDBDFF9EF9F9FDBB9BD0D0B000000009000090000000000000000000000009090090000009A090900A000A9A90909000000C00090000000000000000000090000090000000000009000000900000000000000900900A9DA9F9F9FF0F9BDB9F9BDBEBF9BD9B9E9B9C99A9A09090900000000000000000000000000000090000A00B00B09A9A09A0A9A9090900090000090090900000000009000009000000000900009000000000000000000000900000000000000099A99F9B0F9BF9FDB9F9FFF9F9FFFFBEDBCF9B0F9C9B09A00090000900000009000900000090000000000900090A00090009000000009090B090000000E000000000000000000900900900000000000000900000000000000000000900000000009E9ADBBDF9B9B9F0BF9B9FBF9B99F9F9B9EDBCB909C090900000000000090000000000900000000009009A0009090009000900909A00A0000000900009000000000000900000000090000900009000000000000000000000000000000000909AD9BDB9DB0F9E9F9F9BDF9BDBFDEF9F0FDB9B9B9CB0B9090090900000000000000000000000000000000A000A0000000000000000009090900900C0D09C09000000000000900000000009000900000000000900000000000000000000000000099BDB9EB9F9F9B0B9F9FB0F9F0BB9ADB9B09E9E9A9090A00900000009000000000000900000000000009009090000000000000900090000009A090A00C0000009000090000000009000000000000009009000000000000000000000000090099A9A9E99DB9B9BDBDB9E99F9A9BDBDF9AFDF9B99C9B0090900000900000000000000000000000000090009000000900000000000090000909A000C0D0D0F0909000900000000090000090000000009000000009000000000900000000090000009DB99FB90DADA9B9F9FB9B9F9BDBA9F99A9EDB0B0D9A900900900000000009000000000000000000000000900900000000090000009090009090900CAC0C0000000000000000000000000000000000000000000000000000000000000000009A9A9F990F9B99BD0B9090D0F9FCBD9F0BE9F990F9B0A9CA90000000000000000090000000009000000000000000000000000000090000009000E0C0C9C909000900009000900000000000009000000000000000000000000000900000000000909D9ADAF9AD0BD0BD0BDB9F9A9B90B0DF990BAF090D9009009000000009000000000909000000000000009000000000000000000000090B00F0D009A000C090000000009000009000000000009009000000900000000090000000000000000909A9BDB99099F0B90BD9B0B0BD0F9F9B9ADABD99BDA9A9009000090000000000000000000000000000000000000900900000000090090000900DE900D0D000000090090000000000009000000000000000000000090000000000000009000000BC9BC9B0BDA9090F90B0C9D90B90B09CB99D0B09CB90D0B00909000000000000000000000000000000000000090000000000000000000009ADAD00C000009C00000000000090000090000900000000000000000000000000000000000000000909B0B9C99090B9F9AB9F9B0BBD0B9F9B90B0F0F0B0F0B0909000000000000000000000000000900000000000000000000000000000000900C0DAD090C90C00000000000000009090000000000900000090000900000000000000000000000090B90D9A9ACB0BD0909C90B0BD90BD00A9CBDA999099909000000000090000000000000000900000000000000000000000000000000000000009ECF0E00C09000090090000900000000900900000000900000000000000000000000000000090090F9BC90999D9A9ADA9A90D09A9A9FBD0B909F0AD00BCB09090909000000009000090000000000000000000000000000000000000000000090009C90D0900009000000090000000000000000900090000000000000000900000000000000000009090B0B0B00B90999909A9B09C9090BD0F9A9990B00909A00000000000000000000000000000000000000000000000000000000000000000009E9C00CAC09C00000000000000090000900900000000090009000900000000000900000900000B0B090099C9BD0F0B0F9F990DB9BDA909B90D0F09090A9C9090000000000000000000000000000000000000000000000000000000090000000900C09E9090000090900000900900000000900900900900000000000000000000000000000000990D009BDA9A90B9BDB90B0F9B9ADADB9E9EB9B09ADA990B0000900900000000000000000000000000000000000009000000000000000000000000FC000C0C0090C0A009000000000900000000000000000000000000090000000000900000090090B9090999B9C999CBD99BC9F9BDBDE909DADA99090090090000000090000000000000000000009000000000900000900009000000090090000909C9090090009C0D000000000900000009009090909009000900000000000000000000000090B009BE90F0DB9BE9B9ADF9B9BDBBDBFFF0B9BDAC9A9A090090090000000000000000000000000000000000000000000000000900000000009000C00AC0C000C9009000000000000000000009000000000000000000000000000000000000009A099B099B9B90F99B9F9B9BDBDBDFFF9F0FDADA99A9C900B0000000000000000000000000000000000000900000000000000000009000000000909C9C9A90C9000C0E90090000900009000000009000009000000000000000000000000000090990B0D0BC9F9F99BDF9BDFDB9BFFFBDFFFB099F9AD90B09009009000000000000000000000900900000000000000000000900090000090909000CCAC00C00000CB0D0C00000000009000900000000900000000000000000009000000090009A90E909B999B09BDBDB9F9BBFFDF9FDFBF9FDFCB0F90A9000900000009000000000000000000000000000000000000000900000009090000000090B0C9E90D0D0B0C0CBC900090000000000090090000900900900009009000000000000000009099BD09FBDF9BDB9BDB9FD99BFFFFFFDFFFBFBDB0F99E9A909090000000000000000000000000000000000000000000000000000000909009A000C9F0C0CAC00C09C9C0E090000090009000000000900000000000000000000000000000000909F09A9B09B9F9F9F9B9DBBFFFDBFDBFFFFBDFDEDB9E9909C00000900000090000000000000000000000000000000000000009000000000000090C9CC0C90909C9CE9E0C9C00009000900009009A0000000000000000000000000000000000900B09BDBD9F0F9FB9BDBDBFD9BDBDFFFFF9FDFFBDB0F9BCB0B0090000000000000000000000000000000000000000000000000000009000090900CBCA0F0CAC0CAC90C9CBC9E9000000009000000090090900090000000000000009009000000B9DB09B09B99B9D9F9BDB99BFDBFBFFFFFFFBF9FE9F0F0BC9090009000000000000000000000000000000000000000000000000090000090000909C0DC0F090D090E9CAC0C0C0C900900000009000000000000000000000090000000000000090B09F0DBF0BD0BB99F9BDBD9BBDBDBF0DB99FFFDBFF9BD9B0BC9000000900000000000000000000900000000000009000000000000000000900000FC0FC0C0C0E0C9C0D0F09C9A0000000090000900090000000009000000000000000000009A999B9B9099DB9D9E90BDA9B9D99F9E9FBDFFF9FBFDBFCBADBC9A09000000000000000000000000000000000000000000000000000009000000000C0DEC0DAD009C9CA9E0C0CA0C09000900009000000009000000000000090000000000000909ADAD9E9F9FB0B9B99B909909A9B0999BDBBBDBFF9E9E9BD909B090000000000000000000000000000000090000000000000000900000090000909C9E90FC0E9EC0E9C09C9009C9CAD000A00009000090009000000009000090000000000000BD9B90B9B9B09DBE9DBCBB90F990D9F0F9FDFDBF9FFBF9F9EB9FC9E0000000000000090000000000000000000000000000000900000000000000000BCCDC0F0D0DAD0E9CA0C9C0009CAD0909000090900000000000000000000000000090000D0B09F9DA99BDB999B0999CBB9EBB0B9B9E9BFF9FBDF9FDAD9E9AB099900000000000000000000000000090000000000000000000000000000900000C9ACBCCADEADE0D0AD0AC00D0C0D0A000090000A000000000000000000000000000000090B9F9A9B9F0DB9ADBC9BCB99D099D9F9F9BF9F9FFDFB9EBDBBDBD9FCA0000900000000000000090000000000000000000000000000009000000009090EDCCCBDE0D0C9CAD0CD0BC00E9E0D009A00000909000000000000000000000090000090B9DB9DBDA99B9F9B99BF9B9F0BDA9B09FFFDFFFFFFBDFF9FBCBDBF0B90D0000000000000000000090090000000000000000000000000009000000000CD0BB0CE0FCADAD00F000C0C90C9E0F000900900000000900000000000000000000000BD9EB90B09B9F9F09F9F999D099999999F99FFFFFF9FFFBDB9F9FBC9F9E900000000090000000000000009000000000000000000000000000000000000DACCC9E9C0FC0CAD00DAD09ACBC0D00BC00B00090009000000000000900000000000000B99B9F9BD9F9B9F9BB9F9A9B9BD9BDF99F99FFFFFFFDFF0F09BCBF9CBDA900000000000000000000000000009000000009000000000000000000000090DAD9E9CAD0BCF0DAD0C0C0C90CB0E9C9A000900009000000000000000000000000009BDAD9E9BF0B0BDB9BDD99999D9D9F999DB9DBDFFFFFDFF9F9BFFBDBFBF0F0F090000000000000000000000000000000000000000000000000000000090C0DCC0E0D0EC90CAC0E0DAC90E90C9C0E90900A0900000000000000000000900000099E9B9B99F99BDB9BDB9B99F9990909999099FDFDFFFFFB9FB9F9BDBF0F9F990000000000000000000000090000000090000000000000000000090009000CBC0AD0F0D09ECBCBC9C0DA0D0EDA0BC900A009000009000000000000000000000090B9F9FDBF9BF99DBDA99CB09999B9B09BF99999FFFDFFDFD90B9FFBDF9DBDBE90000000000000000000000000000000000000000000000000000000000009CF09EC0E0C090C9CA0F0CD0E90CDC00E9009000B090000000000090000000000000BDA9F9BDBD9BE999BDF9999900B9F9BFFFF099099DFDFBFBDBDB9FFBFFBDADF0F0900000000000000000000000000000000000000000000000000000000900CDC9E9C90F0E9E0DC0CB0C9CE9A9AD00F00A9000000000000000000000000000909F9F9AF9BFBD9BE9B9909090B9BFBFFFBFFFFFF9D9B9FD90B90BFFDFDBFFFFBF0000000000000000000000000900000000000000000000000000000000000F0C9E9E0AC0C9C0F0909CC9E090C0D00F0090009000000000000000000000000009F99BDF99F9DBAD99CB090B9F9FFFFFBFFFFFFFFF00999BFBD9F9FFFFFFDBDFC9C90000000000000000000090000000000000000000000000009000000900D0CBECCD0D09E0F0C0CAC0BC0F0E9E0BC0900090009090000000000000000000009A9AF9B9BF9BBD9B9B909009BFF9FFFF9FFFFBFFFFF0000999A99BDBFBF9FFFFFFB0A000000009000000090000000000000000000000000000000000900000EDFC9E9AC0DA9C0F0F009C0BC0D009C0BCE9000090000000000000000000000000BDBDBDBF9BFDFBD0F090009BDBF9BFBC0BDBD09B90B909000990BDBDFDFFFFF9FDF99000000000000000000000000000900090009000090090000090000090000FE9EC9E0CCBDCD00DA9CC9E0F0E0FC090090000900009000000000000000000DB99BDB99F9B9DB9090000B090090909990909909D0000009A09F9BFFFBFFDBFFE9E0000000000000000000000000000000000000009000000000000009000DED09CC9E0D0BCCA0AD0CCE9A0D0C9D009E0000090000000000000000000000099A9FBDB9DA9B9FB009000909909B90999B0F9BDEF90999F9A9C9999BF9BDFDBFFF9F090000000000000000000000000000000000000000000000000009A000DAD0FECBC9CADE0BCDCADA90CDCADACACFC90009000090000000000000000000009F909F9FBDBDF9DB90B9F090909099090999099999F9FFFFDB09F0BDBFDFBBF9FDFBDA900009000000009000000090000000000000000000000000900009000C0F00BCACBC0DCCB0D00CE9A0F0CD0D00E0900009000000000000000000000000B9FB99A99B9B9B99E90B9F9BCB9DA9DB9FDBDF9FFFFFFF9FFDB09BDBDBB9FDDBFBEDBD00000000000000000009000009009000000000000000900000900009A9DCFDC9C9C0F0E9CCA0D09CC90CB0F0FC900000000900000000000000000000090F9DBD9BD9F0F9BC9BD9B9DB99F999B9F9BDBFFBFDFFFFFF9A9DB099BDDB9FBFDFFDBCB0000000000000000000000000000090000000000000000900000090CCAD0CA0F0CBC0D0E90DA0CA9ACF0CC0C000090900000009000000000009BF0099BB9B9BFDBB9B9B99B90BC9B99F9DBF9F9BDBF9DF9FFFF9F0F99B9DBBDABFDBDFBFFFE90090000000000000000000000009000000000090000000000900000C9AD0F0DC0F0C9CAD0CA09C90CD00DA9EDE90000000900000000000000000BF000BD0F0F09B9C9F9DA90BD99A9F9B9B99B9DB999BBFFFFDFF9F9F0D0B9DB9D9FBFD9FDBDF900000000000000000000900000000000090000009000900000009CBCDED000F00F0E9CAD0D0E0E9A0F0CC090C00090090000000000000000000909090B99B9BD9BB99A9D9F9B09D09BC99F9DA90F9D09B9FDBDF99A99B99F9DBF9DFBFFFFFBEDA900000009000009000000000000000000000000009000000000C0C0E9EFC90C90C9C0D00A0909C0D0DA9ECE90000000000000000000000000000000BDBD9F9B0D9F9DB9B909BF9BD09B0B9B99F90B9FDFBDFA9F9F9F0DB9B9F9FFBDFFFFDFDB00090000000000000000000900900900000090000000000090090D0D9C9C0AC9ACB0E90CBC9CACADACE9CC900009000000090000000000000000909B99CB9AD9F9F09B9AD09BD9090B999D99CB09B9FFFFDBFDF0BD09BB9F9FBDFFDFFFFDFFED0900000000000000000000000000000000000000000009000000C0F0CADECD0C900D00F00CA909C0D09CB0C909000900000000000000000000000009CBB9F9DB9B99F9D99B909B9B99E99A9B9090D9BD9FFDBDBDB9B99DB9F9DBDFFFFFFFFDBBC00900000000000000009000000900000900000090000009009E9C0FCDA9AC9E0FC0F0CF09CEDA9E0DE0CDA00000000000000009000009000009090F9DFF9B99F9F99B9BD9F909D9F99A99009B090B0B90FBDF9BD90F9BDBDBFFFFFFFFFFFFDE9900000000000000000000000000009000009000000900000000C9C0BCFCD0E9C09E0DA0DE0900C9CA9CB09000090000090000000000000000000090BB99BDBF9F99F9BDA99090B0990900990990BC90099DB9BDB0999F9F9F9FDFFFFFFFFDFBCA0909000000000009000000090090000000000000000090090D0E9CC9CBCAD0E9E0DACDE0DACAD0E9C0C000900000000000000000000000000909A9BD9BDBD9BDFBDBDB9DA9B909B09C90B099CB99F0909B9BC909B9F9B9FBFFFFFFFFFFFFED0900000000009000000000000000000900000009000009009AC0C90C9EBC0DAC9C0F0C9E0F0C9DAD0CADA90000000900000000900000000000000090DBF9F9FBDB9DBDBDB9D09AD909B00D9B0B99F999BDFFD9B9B99F99FFFDFFFFFFFFFFFFDFF00090000000000000000000000900000000000000090000C0DCBCDACDCF9C9ACBC0F0E9C0F0AC0AD0D0C0090009000000000000000000000000009B99B9FBDFBDBF9BDBDBBD990B0999B09D99B99BDFFFFFF0D09DB9F99FFFFFFFFFFFFFFFFCDA90000000000000000000000000009000000000090000909C09C0CDA9E0CA0CD09E0D0CBC0DC9ED0E0F090000900000000000000009000000090909FFF9BDBDBDBDBDB9F9D9A999099BD9B9BDDF9FFFFFFFC9B9F9BDBFFFDFFFFFFFFFFFFFFFB00000900000000000000000000000000000900000009000A9EC9EBCDE9F09C9A0E0DACBC0DA9AC0F0DC00009000000000000000000000000900009BF9BDF9FBDBDBDBDF9F9B9DB099AD9BDBF9FBFFFFFFFFDB9DB9F9BDBDFFFFFFFFFFFFFFD90D0090000900000000009000000000009000000000000000DCDAF0D0F0FCC0AC0D0BC90C9E0CCDAD0E9AD090A00009009000000000000000000009A99F9F9FBDB9BDBDB9FBF9F90B0999BDBD9BBDFFFFFFFF0D9B9FFFFFFFBFFFFFFFFFFFFFFFF00000000000000000000000000009000000000000000009ADADC9EF0FCB0D09E0D0ED0F090B00DADCE0C0A09009000000000000000000000000909F9BFBF9DBDF9F9BDF9D9F9BD990F90BDBD9FBFFFFFFFF9BDF9BDBDF9FDFFFFFFFFFFFFFFCBF000000000000009000000000090000000000009000000000DAFE9EF0FE000C0DAD00E0CAC0DA0D0BCDE909000000000000900000000000000000B0BD9F9FBDB9B9F9F9FBF9BDB9E999BDB9BD99FFFFFFFD9BBBFDFFFBFFFFFFFFFFFFFFFFFBD0900000000000000000000000000009000000000000000009ED0FF0FFAD0C9ADAC0DE9C9C9A0C9CACDA9C000090000000000000000000900900099F9FFF9F9F9F9F9BDBF9DBDBDB99A9D99F9B9FFFFFFFFFFDFDFFBFDFDBDBDFFFFFFFFFFFDF9E00090000000000000000000000000000900000000900900CB0FE0FF0FF90C00D0F00C0A00D0BCADF0CF09090000090000000000000000000009A99F99FBDBDBDBFDB9F9FBDB9BDBD9B0FB9DBDBDFFFFFFFFFFFBFDFBFFFFFFFFFFFFFFFFFFDE9000000000009000000000000000000000000000000000909CFF9FDAFDAC90E9E00DA0D0C9AC09C00F0CE00000090000090000900000000000009A9FFBDF9F9FDFDF9F9F9BDBF9B9BF999DBD9BDBFFFFFFFFFFFDFFFDF9F99FBDFFFFFFFFFFFF0900000000000000090000000909000000000000000090CAC9CAFAFDAFF00C9C9EDAC90CB0C9ACBCFCE90900090000090000000000000000000009F9FDFBF9B9BD9FB9F9F9BD9F9F90BDB99B9DBDFFFFFFFFFDFFFFFF9F9FFBDFFFFFFFFFFFDE90000000000000000000000000000000000000000000009C9EBDCF0BFCB0E9E0E9C0D0E90C9AC9CBC090000900000000000000000900000000099BDBDBBDDBDBDBFD9B9B99F9F9B99F9A99F9F9BFFFFFFFFFFFFFB9F9F9F9BDBFBFDFFFFFFFE9000000009090000000000900000000000000000009090DE9ECD0EBCFCBFD00D0D0ADAD00DA0D0E9CADE90000000000000000000000000090090009BDBFDBBDBDBDB9FDDBDB99BF9DF9F9DB999F9BFFFFFFFFFFDEDF0F9FBFFFDFDFFFFFFFF9F000000090000000000000000900000900000000000000000C90BC9CDABCF0CF0ACD0C0ECD0DAC9CE9C0000900000090000009000000000000000090BBDBFDBF9F9BDA9BBDA9F099A9B09B99F9F9FDFFFFFFFFFCB9B9F9F9DFFFFBFFFFFBFFFE9090090000000000000009000000900000000000090000090FCDCBCBCDCBC090DC9ADAD09AC0C9E0DCBDE900009000000000000000000000000000009FFBDBDBBDBDB9D0909D09E9D99F9D9F9BDB9BFFFFFFF99BDBC9090B90B9BDFFDFFFFFFD000000000000000000000000000000000000090000009000C0000C0C9E9EFCAC0A0CC0CBCC9E9E0D0AC00000000000000000000000000000000000909B9F9B9BDB9BD9A9A990B0990B0B9AB9BDBDFFFFFFDD0BC990A90B090B9FEFF9FBFDFA9000000000000000000000000000000000000000000000000090DAD0DAD0FC99C9C9CB0F0C0BC0C0DACD0FC9090000000090000000000000000900000909FCBF9F90F9A99D99A9090A90909D0D9BDBF9FFFFEB909A09909C99F9F9F9FFFDBFBDB00090000000000090000000000900000000000000900000900C0C00CDAC9EF0CAC00C90DAC0BCBC0DACD00E000900090000090000000900000000000090BBDBCBFB9D9B0B09099A9909090B9B9DBDBFFFFFD0E909000909A09B0FDFBDEBCBDBC09000000900000000000000090000000000000000000000000900DA0CDAD0FF0D09E9CA0D0D0D0DE0D9ADF090000900000000000000000000000000090099B9B99DB9A9D090B009000A909099FBFBDFFFFDA9909090B9A999CDFBF0F9999B9A0900000000000000000009000000000000000000000009000000C90CD00DE9EC0CAC9C0CDACACACA0D0ECC000009000000000000000000000000000000090B9F0B0B0BD909BC90BD09990B090F99BDFFFFDF090B009090000AFB0D099A09ADBC900000000000000000000000000900000000009000000000000000C90EDE9ED0F0D00ADA0C9C9C9CDAC9E9ED09A0000090000000000000000000000000000909D090900B0F00090BFA00909A99BFDBFFFFE99F00090F0009090DF000099F9B0B0000090000000090000000000000009090000000900000000909C90CC9C0DEBD0CAC9C0D09AC0FCBCDAC9E9CA0D09000000090009000000000090000090090B0B90909090B0900009DF00909099BBDBFFF9E099090BC9000000A9009B090F0D0900000000000000000900000900000000009000000009090C0000C9A0CBCBCDCAD09C09A0E09E00C0ADF0CCB0DA000900909000000000000000000000000000990B0B000BC0000F0BE009A909A9F9FFFFFF99A09009A00909090009E909B90B000000000000000000000000000000000000009000090000C90F0D0C0D0CDCBE09C0E0BC0D0D0C9EDADC0EDBCDE090B0C9A000000000000000000000000000909AD090900900909A090990090B9DBBDBFFF9E009009000000000009E909E9CB009000000000009000000000000009090A90900000900000DA0C0C000D0CBCBED0CBC9C0BC0CA9E090DCAFDAC0E9E000AB0C0000000000000000000000000000909A90099C000000900000900099B9FFBF9FF90909009009000009FE90A99A90900090000000000000000000900000009000000000000090009009E9C0E9CBC9FE9CAC9C0DA9C09CECA9C0EDBE9C9F0DDEB090000000000000000000000000000909ADB0B09090000099B009090F9B9F9FFBDF9CA090090009C9FBD00990BCB009000000090000000000009000900000009009009000000090C9C00C9C0C9CF0F90D0DA9CADC0FCA90DCBC9E0DE9ECBFAFC000090000000000000000000000000090909009BDAD9CB9A0009A09B99FFBFF9F0B9B0900909B0B9A0009BCBF0909000000000000000000000000000009000000000900090000C00009C000DACBCFCCACAC0CE9CAFC09CFCAC9ECDE9ECBDAFC090A000000090000000000000900000909A90B09009A0B000909009B09FB99F9FF9F00900900000900909A09009000000000000000000000009000000000009000900000900909090D0C090D0C9CBCB0D0DAD09CAD0ADE009CBED0F0EDBEFFF900D9C90000000000000000000000000090990D9E0909900900909909DB99FBFF9F90DB0090909090090B09090900000000090000000090000000000090000000900090000000C00C000900E0DACF0FE0E9C0ADAD0FCFADEDE9C9ADAF9EDFBEFEF0A9A009000000000000000000000000000A9A990B000990900000B090F99F9B9E9B0900000009090090000000000000000000009000000900000000000090000000009009090D09C0C0AD0D0D0DE9FC9CADCC00E0F0DADACADEFFDEFBFAFFBDADFED0000000000000000000000009009099090A9090900000900009FB9BF9FFF9F9DAD000000000090909000000090000000000000000000000090000090009090900000000E0C00909C000C0F0DE99CAD00BCF0D0FEF0E9DEBEBEBFEFFFFFEDFADA09A09000000000000000000000000000909090000090000999B999F9FBF9DA9B99A90900000000000000000000009000090000000000009000090000900000000000009C909C00C09CF0F0DE9EE9C0FCC90DAD0D0ED0E9FDFFFFBFFFEFFADFAD009000000090000000000000000909B0009000900009090BE9DADB9F9F9FB9F0F09000090090000000000000000000000000090009009000000000B00900090090009C000C00D090C00D0CF0FFCBED0BCE0C0ADADBEDE0CBEFFEFFEFFBFFEBDA0009009000000000000000000000909B9A09000090CA9C9D9B9B9F9FBDF9F9DB9F9BD9F090090000000000000000009000000000000000000900D00D00A90000009009CD09C00C0C9C0C9E0F0FADCBEC90DADC0CAC9ADCBCBFBFFFFFFEFFBFE0D000A900000000000000000000000909C99A9DBDA999B9FB9FDF9BDBDBFF9BBDB9E90B00090000000000900900000000000000000000000000C9A9FA9ED009090000C0A00C09C00B00BCE9CDADDFAFC9EDE0C9E9C9EDCBCFDFEFFFFBFFFFEFE9000900000000000000009000009090B9B9B9DB9BF9FBDFB9DB9B9FBFFFF9FFDBDF9B9009000900900000000000000000009000000000009000FADFCBDE90F000090090D0D00C090C0DC09CFADFEADBFE9E9CBC0E9E9EADC9AFFFEFFEFFFFFF9E90009A090000000000000000000009099ADB09F99BF9FBDFFBFDF9F9F9FFF9BF0B9FC9009000000090000000000000000000009000000000900DEBFEFBEF0DCB0000C0000D090C09C00FCB0DFA9DECBFEBEDCBC90C0DCACFC9FFFFFFFFEBFEFEFE9009000000000000000000009090B0D9BDBDBF9DBF9FB9BD9FBFBF9FB9FF9F9F09B00000000000000000000000000000009000000090000090DFBFFE9EDACC9CA909C000C090C00D00DCF0DFCADBF0FFFABC0EDADA9CBCBEBFFFFFFFFFFFBFC9000009009000000000000000000909B90B9B99FBD9FBDFFBFBDBDBDBCB9DA9BDB0009000000000000000000009009000000000000000000000FAFFFBFDAD0F0C9C0C09C900C09CDACD0E9EBC9C9ECFFF0FCDE90CC9EFC9EDFEFFEFFEFFFFFCB000909A00000090000000900000909B09F9FF9FB9FBDBDB99F9FDFFBDBD9A9D090909000000000000000000000000009000000000900009000DBDFAFCFADAD0C9C0C90C000D09C000DAC9CBCFCBCF9E9EF0FA9EDEBCC0BCDADBFFFFFFFFFEFBC0900000000000000090000000090909DA9B99B9DBDFBDBDBF9F9B9BDBDBC9B09A90000009009000000900009000000000000000900009000090FAFFBF0FC0C9CAC90C090D000CA0DC0DADEDF0EDACBCF9EFDECBC9CBDCCADCADFBFFFFFEFFFEF00009009000000000000000000009A999F0F9FBBDB9FB9BDB9F9F9CB9A9B00909090000000000000900000000000000000000900000000C0000DFFFFFF0FDE0DC0CB0C000D0D0D00F0CD0F0FFFADFCF0F9FAFBCFACCADADADCFAFFFEFBFFFFFF0F09009000900000000000000000009A99B9B0DDBDBDBDBF9DB9EB99F9D0090B000000000000000000000000000000900900000009000900909EBFFEBCF0C0D009C0C90D000C00C9C9CAD0F0FFFFAFBFEF0FFCF0CDADAD0C0DADFEFFFFFBEFBEF0000000000000900000000000090909DA9DBDBBB9B9F9F99BBD99DB09B0909009090090000000000009000000090000000000000009000000CBFFFBDF0DAD0E9C009C00C0D00D0C0CADCF0FFFBFFFEFBFFEBE9EF0D0DE0F9EDADBFFFEFFFFFFDF0909009000000000000000090009A9BDB9F9F9DBDBDB9DBC99A9B0F09A000900000000000000900000000090000000000090090000009000BDFFFFEBEDC0D0C09C00D09E09E0DAD0DADADF0FEFFFFFEFBDF9E9EBCE0DCCC00DECBFFFFFFFFFAFC0A090000000000000000000000090090B9B9BBDB9BDBB9B9BD0990909090090000000000090000000000000000090000000000000000090CBFFFFFCBCBC0D0C09C00E09C0D00D0E0D0F0FFFFFEBFFDFEEBEFFDEDBDADA9FCAD9FCBFFEFFEFFF090000000000000000900000000909B9BDBDBC9B9F9BD0F9F9A9F09A900090009000900000000090000000000000000090000009009000009EFFFFFBCBCCBC0BCC09C9C00D0CD0C9DE9CF0FFFBFFDAFADBDFBFAFACECADCC0D0ECBEFFBFFFFADAC090009000000000000000009009B0D099B99BDB9BE9B9B0D9900900909090000000000000000000000000009000000000000000B009CC9FFFFEFBCFCC90C9C0A9C000CD00F00FCE0DE9FC9EFCBEDADAFAFEFFFFBDBDADADE9C9CD0FFFFFFFEF9C00900000000000000000000090099BCBDBBDBDAD99BC99A009B09000000000000000000000000000090000000900000090009000000BCFBFFBFEF9E9ED0C0D0C09CD0A9C0CD0D0DE9EFBE9EBC9EDEDFFFBFFFFFEFEDADADE9E0FC9EFBEFFFAFBC00000000000000000000000090A09B09C9B9B9BBD9BC999A090090900090000000000000000000000000000000900000000000900009EFFFFFBFE9C00D0C0C9C00AD0C9C9ACADA9E9CFCFC9EF0FBFAFFFEBFEFFBFFFFFE9EDBCBCBDFFFFBFFCA9000009000000000000000090999009B9BC9BD0D0B90B00900090000900009000090090009000900000090000000900000909000900CBFFFFFFCBEDED0E90D0AD0D0C9CACD0DCDE9EFB0F0FE9FBEFFFAFFFFFBFFFAFFAFFFBEDF0FEFBFEFEDA90090000000000000000090000000A990D09BD9B9B9A900B09090090000000009000000000000000000000000000000000900000000DBFFFFFFEBF0D00D0CC00D0C0C9E0C9C9E9E9EDBCF0F9FFEFFFBFFFFFFFFEFFFFFFFBEFFBEFDBEFFFFBFFC0000000000009000000000009090900B9B099A909C9090900000000090090000000000000000000900900009009000900000000900ADBFFFFFFFCF0CF0D09AD0D0F0C9C9CADCF0DEAFFFFEFAF9FAFEFFFFFFFFFFFFFFFFFFFFFFBEFFBFFFEFBF090000090000000000000000000909009CB0D9BDA99A090090090090000000000000000900000000000090000000000000000900090EFFFFFFFBF0F0C0CC0C0C0C0D0C9E9C0E9EBDF0FFAFBFFEFFFBFFEFBEFFFFBFEFFEFFFEFFFFBFFEFFFBCF00090000000000000000000009000090B099A9C9900900090090000000000009000900000009000000000090090090009000900090DBFFFFFFFFFE9E9CB0D0DAD0D0E9C0C9E9C9CE9FFFDFFCFBFFFFFFFFFFFFFEFFFBFFFFBFFEFFFEFFFBFCFB0900000000000000000000000000090090B090B09A9009000000000090000000000000000000090009000000000000900090000B0EFFFFFFFFFFE9CD0D0C0C0D0E0C9C0CDADCFEFBFFAAF0FBEFFAFFFFFFFFFBFFFFFFFFFFFFFFFFFFFBFEFBFC0A0900000900000000000009000900900909A90B00900090090009000090000000000900000000000000900009000A0090090AD0FDBFFFFFFFFFFFE0C0C9CBC00D0D0D0F0CDA0DADADFFBFEFFBFFFFEBFFFBFFFFFFFFFFFFFFBFFBFFFFFFFEBF09000009000090000000000000000000900090909000900000000000000090009000000090000000000000000009090000000DADAFFFFFFFFFFFFF9F0F0C0C9C90C0CAD0DACDE9CFFAFFEFFBFEFFFFFFFEFFEFFFFBFEFBFFEFFFFEFFFFFFFFFC90090900000000090009000000000900009000090909000900090000000000000000000000090090000000900000000009009AFFFFFFFFFFFFFFFFECD0C9C90CAC9E9C0C0D0F0FBCBDFFFBFFFFFFFBFFFFFFFBFEFFFFFEFBFFEFFFFFEFBFAFCBC0B0000000000000000000000000000000009090000000000000009000000000000000000000000090900000909AC9090009EFFFBFFFFFFFFFFFFE9F00DAC0C9C9C0C0D0F0F0DECBFFAFFFEFFFBFEFFFFFBFFFFBFFFFFFFFFFFBFFFBFFFFFFBE9000B00000900000000000900000000909000000090009000090000000000000000900009000000000000900000900009000BFFFFFFFFFFFFFFFFFC0FC0D0D0C0C9C9CAD0CCFADBFCBFFFFFFFFFFFFFEBFFFFFFFFFFFBFFFFBFFFFFFFFFFFEFF0900090000000000000000000000000000000009000000000000000000000009000000000000009000000000900009000090BDAFFFFFFFFFFFFFFBFC0D0C0CB0CBC0E9C0DA9CDACBFCFFFBFFBEFFBFFFFFEFBEFFFFAFFFFFEFFFFFEFFFAFFBDAC009000900000090000000000009000000000000009000009000000900000900000000900009000000000009009000009000CBFFFFFFFFFFFFFFFEDAD0F0D0C0D0C9C0D0EDCB0FDADBFFFFFFFFFFFFFFFFFFFFFBFFFFFEFBFFFEBFFFFFFFEFFE90900090000000000000000000000000000000000000000000000000000000000000000000000000090009000AC0090B000DBFFFFFFFFFFFFFFFADAD0C0C0C0D0C9C0DAC9CADEDAFFFAFFFAFFFBFEFBFFBFFFFFEFFFFFFFFFFFFFFFFAFFFFFAD00009A00000000000000000000000000000090000000009000000000000000000009000000000009000000090909A000000BCBFFFFFFFFFFFFFFF0DC0D0DAD0CB0CBC0D0E9DCB0FDADFFFFFFFFFFFFFFEFFFFFFFFFFFBFFFFFFFFFBFFFFFFFFEFC00090B09090000000900000000000000000009000000000000900000900000900000009000090000900000000009090900BFFFFFFFFFFFFFFEFF0DAC9C0C9CC9C0D0C9CCADEDAFFAFFFFFFBEFFBFFFFFFEBFFFFBEFFFFFFEBFFFFFFFFEFFFF0B0900000000009000000000900000000000000000900000000000000000090000000009009000000000909000909000000DFFFFFFFFFFFFFFFFBCF0C9E0D0E09C0D0F0E9AD0F0FCBDFFFFFFFFFFFFFFBFFFFFBFFFFFFEFBFFFFFEFFBFFBFFF0FC000909000000000000000000000000000000000000000000000000000000000000000000000000900000009000000B09FBFFFFFFFFFFFFFFFFDE9ED0C9C0C9C0F0C0C9CDCF0FCBFFAFBEFFFFFFFEFFFFFFFFFFFFFBFFFFFFFFFFFFEFFFFEFFBDE9000009000000000000000000000000900000000009000000000090000000009009000000900000000000000009000AFFFFFFFFFFFFFFFFFEF0CD0C9C0D0C0D0C9C9CE0F0FCBF0FFFFFFBFFFBFFFFFEFFFFEFFFFFFFFFFFFFFBFFFFFFFBFEFBCA9090000900000000000000000000900000900000000000000090000900009000000009000000009000B0090900009FFFFFFFFFFFFFFFFFFFBF0ADAC9E0DAC0DAC9E90F0F0FCFF0FFFFFFEFFEFFBFFFBFFFFFBEFFFFFFEBFEFFFFFBFFFFFFBCF9C0A09000000009009000000009000000000009000000090090000000000900000900000000000000900000000099FFFFFFFFFFFFFFFFFFFFFCFD0C9C0D0C9C0D0C0CDC9CF9ADAFFFFFFFFFFFFFFFFFFFBFFFFFBEFBFFFFFFFFFFFFEFFFFBEFBCA909000000900000009000000000000000000000000000000000000000000000000900000009009000909009090FFFFFFFFFFFFFFFFFFFFFEBC0C9CAD0C9C0F0C9CBCADEBCFFFFBFFFBFFBFFBFFFBFFFEFFFFFFFFEFFFFFBFFEFFFFFBEFFFFCF90C009090000000000000000000000000000000000000000009000000900009009000009090090000000000000BFFFFFFFFFFFFFFFFFFFFFBCBCBC9C0D0E9C0D0E9C9DE9CFBCBCFFBEFFFFFFFEFFEFFFFFFBFFFFFFFBFFFFFFBFFFFFFFFFFBFAFB0900000009009000000900000000000900000000090000000000000000000000000900000000009000090909FFFFFFFFFFFFFFFFFFFFFFDFC9C0C9C0D0C9C0D0CAC0DE9CFBFBFFFFFFFEFFFFBFFFBFFBFEFFBFFFFFFFEFFFFFFBFFFFFAFFFFDE9E0909000000000000000000009000000000090900009000000000000090000009000000900900009090000FFFFFFFFFFFFFFFFFFFFFFFFADE9CBC0D00D0E9C9C9CFA9EF0FCFFFFFFBFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFEFFEBFFFEFBEBE09000090000000900000090000000000009000000000000009009000000000000000900000009A9000000FBFFFFFFFFFFFFFFFFFFFFFEBCD0C9C0DACDAC9C0E9ED0DCF0FBFFAFFFFFFFFBFFFFBFEFFFFFFFFFFFFEFFFBFFAFFFFFFFFFFFFFFDBDA09000009000000009000000009000000000000000000000000000000000900009000909090000000090FFFFFFFFFFFFFFFFFFFFFFFDFCADAC9C0D00D0C9C9CCBCEB0FEDADFFFFFFFBFFFFEFFFFFFBFFBFFFFEFFFBFFFFFFFFFFFFFFFFBEFEFADBC09000009000900000000000000090000000000000000000000000000000090000000000C90C9C90CBFFFFFFFFFFFFFFFFFFFFFFFBE9D0D0CBC0D0C9CAD0D0C9CDE9FBFBFFFBEFFFFEFFFFFFFBFEFFFFFFFFBFFFFEFFFFFBFFBFEFBFFFBFBDBCA9000000000000900000000000000000000900090000900000009000900000000090000B000B0A00BFFFFFFFFFFFFFFFFFFFFFFFFEFCED0E9C0DAD0E9C0F0ADE9ADE9EDEFFFFFFEFFFFBFFFFFFFFFEFFFBFFFFBFFFBFFFFFEFFFFFEFFFFFFEFE9009000000000000090090000000000900000000000000900000000000000000900009000BC0009FFFFFFFFFFFFFFFFFFFFFFFFFFF9E90C9C0D0C0C9C0D0CDC9EDE9EFBFBFFFFBFFFFFFFFEBFFFFFBFFFEFFFFEFFFFFEFFFFFFFBFFFEBFEFBF9EF0090000900000000000909090900000000000000000000000000000000900000090090009090AFFFFFFFFFFFFFFFFFFFFFFFFFFFE9CF0C9E0C9C9C0DAC9CBC9E9FF0FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFBFFFBFCFF9EDA0090000000900000000000000000000000000090000000000000009000090000000090000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9CD0C9C0E9CBC0D0E9CFCBC0FFBFFFFFFFFFBFFFFBFFFFAFFFFFFFFFBFFFFFFFFFFFBFFEFFFFFFFFFFBEFFAD090000009000000090000000900090000090000000009009000090000000000909000090FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCF0E9C0D0D0C0D0C9CCBCBCFF0FCBFFFBEFFFFFFEFFFFFFFFFBFEBFFFEFFFFEFBFFFEFFBFFFFFFFEFFAFFDBCF0C000000000000900000090000000090000000000000000000000000090009000009090CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF0C9CAD0E0D0D0ADACBC9CBF0FBFFFFFFFFBEFFFFFFFEFFFFFFFFFFBFFFFBFFFFFFFFFFFFFFEFBFFBFFFBEFBFA909090000090000009000000000000000000000090000000090000000000000090000BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FD00D0C9C0DACD0C9C0FED0FDE9EBFFFFFFFFFBFFFBFFBFFFFFFFFFFFFFFFFFFFFBFFFFFFBFFFFFFFFFFFBCFCBCA000000000000900900900090000000000000000000000000000900090090000090CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC0CF0C9C0D0C90C9CADD09EF0FBFFFFFFFFFFFFFFFFFFFFFFAFFFFFFFBFFFFFFFEFFFFEFFFFFFFFFFEBFFEFFBFCB09090000000000000A000900009000009000000000009000009000000000090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9F0C9E0D00F0CDAC9D0EDE9CFADE9FFFFFBFFBFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFFFFFFEFFFFFEFFBFFCBC9C0009000090009090900000000009000000000090000000000000900909000ACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9E0C9C0DACD0CF00DACE9CBCBE9FBFFFFFFFFFFFEFFFFFFEFFFFFEFBFFFFFFFBFFFFFFFFFBEFFBFFBFFFFBFFEBFFFFBE9009000000000000B00900000000000000900000000009000900000000909BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED0DAC90C90C90CD0C9DE9CF0DFCFBFFFFEFFFEFFFFFFBFFBFFFFFFFFFFFFBFEFFBFEFBFFFFFFFFFFFFFFFFFFFEBCBCBCBC0000000090090000009000000000900000000900900900E0009000000CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBCD0D0ED0CBCC90E9CA0DE9EFAFBDEFFFBFFFBFFBFFBEFFFFFFFFBFFFBFFFFFFFFFFFFFFFFFBFFFFFEFBFFEBFFBFFFFFBE9AD0900900A9009090000090000000000000000000000090900009000DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEDADE0D00D0C90E9C0DCDE9E9CDBCFBFFFFFFFFFFFFFFFFFFFFEFFFFFFFFBFFFFFFFFFFFFFFFFFEFFFFFEFFFFFFFFFBFBFFFF0B009A0990C9AC00090000090000090090090009090000009000C9FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDAD0C9C0DE0D0C9C0DA9E9CBDEBEFBFFFEFFBFFFFFFFFFFFFFFBFFFEBFFEFFFFBFFFFFFFEBFFFFFFFBFFFFFFFFFFAFFFFFBFBFEBC09FACB9E9BC9000900009090000000000900000909000090B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBC9CBC09C0F0C0F0CD0DE9E9F9EDAFFFFFFFEBFFEBFFFBFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFBFFFFFFBFFFFFFBFFBFFFFFBFB9A9DACB9EBFA9E0C0900000000000900000900000090090CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9E0C9CC9C0D0D0DACF0DE9ECFBFFFFFBFFFFFFFFFFFFFEFFFFFBFFFFBFFFFFFFBFFFBFFFEBFFFFFEFFFEFFEBFFFFBFFFFBFFFFEDABDBFEFDADE9FBCA9A909009090009000009000000F0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FC9C9E09C09CBC0D0D0DADE9BCF0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFEFBFFFBFFFFFBFBFDE9FBFBFFBFFCBDAC00A09000000000090009090F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9E0D0C9EC9C0C0F0CBCBCF0FCFBFFFFFFEBFFFFFBFFBFFFBFFAFFFBFFFEFFFFFFFFFEFFFFFFFEFFBFFFFFFFFFFBFFFBFFFFFBFFFFAFBEFFFEDAFEBFFEDBF09C0009A90900000000ACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC0D9E0D009CAD0D0C9CE9E9EDBBCFBFFFFFFFFFAFFFFEFFFFFFFFFFEFBFFFFFFFFFFBFFFFFFFFBFFFFFFFFFFFFFFFBFFFFBFFFFFBFFFFBFBFBFDBDFAFBE9EF0BDAD00C0AD09000D09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE0D0CDCC9C0DAD0F0DCDE9ECFBDEFFFBFFFBFFFFFFFFBFFFFFFFFFFFFFBFEBFFEFFFFFAFFFFFFFEFFFEFFFFFEFBFFBFFFFFFFBFFBFBFFFEFFAFFBFFFFFF0FCADAF0BFCAACC99AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BD0C9A009C09C0D0CDADA9E9F0FBFBFFFFFFFFFFFBFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFBFFFFFFFBFFFBFFFFFFFBFFBFFFBFFFFFFEFBFBFBFFAFFFBEF0FFADBFCBFCBFDFBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FCCCBCDCFC0BCC9CADADADCFDAFDEFFFFFFFEFFBFFEFFFFEFBFFFFFFFFBFFFFFFBFFFBFFFFFFEFFBFFFFFFFEFFBFBFFFFFFBFFFFBFBFBFFEFFEBFFFBFFBFFBCFBCEBDEBCFAFEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9A9C00000DC9AC0D0C9CFADADEBDBFFFBFFFFFFFFFFFFBFFFFFEFFFFEFFFBFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFBFBFFFFFFFFFFFFFFBFBFFFFBFFFFFFADBCFBDEBDFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FCD0DEDCD00CC9CBCBCF0DCBCBDEBFFFFFFFBFFFFBFFFFFFFFFBFFFBFFFFEFFFEFFFFFFFBEFFFFFEFFFEFFFFFFEFFFFFFBFFBFBFFFFBFBFFFFBFFFFFFFFEFFEBEDEBCAFCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E9E0909AC909C90CD0CF0BCBDEBDEBFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFBFFFFFFBFFFFBFFFBFFFFFBFFBFFFFFFFFFBFBFFFFFFFFFFFFFFFFFBE9E9EBCBFDBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F9C0DCCCC9ECCACC9ACF9EDEDE9EBFFFFFBFFFBFFFFFFBFFBFFFFFFFFFFFBFFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFFAFE9EDBCF9EDAFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE9C00B09C909C9BCD90CF09E9FDFBFFFFEFFFFEFBFEFFEFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFFEFBFFFBFBFBFBFFFFFFFFFFFFFFFFFFDBDE9ECBCE9EDADEFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD0FCDCC0CCD0CC00ECF0CFCBCBE9FFFFFFFFFFFFFFFFFFFFFEFFBFFBFEFFFEFFFEFFFEFFEBFFEBFFEFBFEBFFFFBFFFBFFFFFFFFFBFFFFFFFFFFFFFEFBEF0FCBDE9FCBCFBFFEFBEFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBECF00090B09A090DD09CF9CBCFE9FEBFFFBFFBFFFFFFBFFBFFBFFFFFFFFBFFBFFBFFBFFBFFFFFFFFBFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFBFBCF9EDADA0F0ADA9E9ADBEDBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED90DCFCCCCCCDECCACDE9CADCB9EDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFBFFFFBFBFBFBFFFFFFFFFFFFBFEFFBECB0DCEDCEDCEDCEFCE9EDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0EC0009090900909CBC0CED0FCFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFFFFFFFFFFFFFFFFFFBFFBFBEDBFCFAD9E9DAD9E9DADBC9ECBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DEDCCDCCCDCCD0DCBDBDADADADEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE9E9CAC9E0DAC9E0DAC9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CA900B00B00B00E00C0C0DADADBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEFDEFDEFDEFDFFFFFFFFFFFFFFF000000000000000000000105000000000000A9AD05FE','Janet has a BS degree in chemistry from Boston College (1984). She has also completed a certificate program in food retailing management. Janet was hired as a sales associate in 1991 and promoted to sales representative in February 1992.',2,'http://accweb/emmployees/leverling.bmp'); + +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(4,'Peacock','Margaret','Sales Representative','Mrs.','09/19/1937','05/03/1993','4110 Old Redmond Rd.','Redmond','WA','98052','USA','(206) 555-8122','5176',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FDB9BFBFFBFB9FBDBBBFDBF9FBFBFBFBFBFBDBFBDBFBBFBFBFFD0000000000000000000000000000000000000000000000000000000000000000BBDBF9BDBF9BB9BFB9FBFB9FB9BBFBBBBFBBFB9F9B9FB9BF9BF9BFBBFBBFBDBF9FBDBF9F9BDBFBFBF9FBB9BDBB9BBF9BBFBFBFBFBFBFBFBFBFBFBFBFFBFBFBBA00000000000000000000000000000000000000000000000000000000000000009BFB9FBB9BBDBFB9BFB9BFFBDBF9BDBDBBDBBFFBFBFBFFBBFFBBF9F9BDB9BBFBBFBBFBFBFBBFFB9F9BB9FBFBB9FBDBFBFBFBF9FBFBDBF9BFBFBFBFBF9FFBFBD00000000000000000000000000000000000000000000000000000000000000000BFB9FBB9FBDBB9BBFBDBF9BBBFBBFBBB9FBBDBB9BFBF9BBDBB9FBFBBFBFBFF9BDB9FB9BDB9F9FBFBBFBFBDB9FB9BB9BFBF9FBFBDBFBFBFBF9FBFBFBFBFBF9FB000000000000000000000000000000000000000000000000000000000000000009BFFBBDBB9B9FBDBDBBFBBF9FBDF9BDBFBDFBBFBF9BFBFFBFBFBDBFF9BFB9BBFBFB9FBFBBFBBF9BDB9FBBBFBBDBDBF9BDBFBFBFBFBFBFBFBFBFBDBFBFBFBFBF0000000000000000000000000000000000000000000000000000000000000000009BBF9BDBF9B9FBBBDB9F9BF9BBBFBB9BBBBF9BFBFB9BB9FBDBFBB9BFB9FBF9BDBFB9F9F9BDBFBFBBFBDBFB9FBBB9BBFBBBDBFBFBDBF9FBFBF9FBFBFBFBFFB0000000000000000000000000000000000000000000000000000000000000000000BDB9FBB9BBFB9BDBBBFBBFBFBDB9BDBF9F9BFF9FBDBFFBFBBFBDBFB9FBBDBFBBB9BFBBBBFBBFB9BDB9BF9BFB9F9FBF9BFFBFBDBFBFBFBDBFBFBFBFBFFBF9BF0000000000000000000000000000000000000000000000000000000000000000009BBFBB9FBDB9BFBBBDB9F9B9FBBBFBB9FBBF9BBBFBFB9BB9F9BBFB9FBBDBBBDBDBFB9FBDB9FFBFBBFBFBFB9FBBBB9BBF9BFBFBFBFBFBFBFBFBFBFBDFBFBFF90000000000000000000000000000000000000000000000000000000000000000000BF9BDB9BB9FB9F9FBBFBFBFBDF9B9FBBF9BBFBF9B9FBFBFBF9F9FBBDBBF9FBFBF9FBDBBFB9FDB9F9B9F9FBBDBDBF9FBFBDBBFBDBF9FBF9FBFBFBFBFBFBBBE00000000000000000000000000000000000000000000000000000000000000000009BFBBFBDBB9FBBB9F9B9BDBBBBBDB9F9BF9FBDBFBFBB9F9BBFBB9FBBDBBF9B9BBB9BBDB9FBFBBFBFBFBBBDBFBBB9BB9BFBF9BBFBFBFBFBFBDBFBFBFFBDFF90000000000000000000000000000000000000000000000000000000000000000000BDBDB90B9FBB9F9FBBFBFBF9F9FBBFBBFBBFBBF9F9F9FBFBDBDBFB9FBBDBBFBF9FBF9BAF9BFBDB9BDB9BDBFB9BDBBDBFBFBFFFBFBFBFBFBFBFBDBFBFBFB9A00000000000000000000000000000000000000000000000000000000000000000009BBBBBFBF9B9FBBB9F9F9B9FBBB9F9BDB9F9BDBBBBBFBB9FBBBFB9FBBDBBDBB9EBB9FBF9BFFBBFBFBFBFBB9BFBBF9BB9FBDBBBDBFBDBF9FBFBFBFBFBFBFF000000000000000000000000000000000000000000000000000000000000000000000BDBDB9B0BFB9F9FBBBBFBFBDBDBBBFBBFBBFBDBDBDBDBF9F9F9FBBDBBDBBDBF9F9E9B9FA9FDB9F9B9F9FBFB9F9BF9FB9BBFFBFBDBFBFBFBFBFBFBFBFBBF0000000000000000000000000000000000000000000000000000000000000000000009BBBDBDB9BDBBB9F9BDBB9BB9BDB9BBDBDB9BBBBFBBB9BBBFBB9FBBDBB9FB9BBBBBF0B9FBFBBFBBFBFBBDB9FBBF9B9BFFFB9FBFBFBFBFBFBDBFBF9FBDF9A000000000000000000000000000000000000000000000000000000000000000000000BDBBBB9FB9BDBFBBFBBDBF9F9BBFBDBBBBFBDBDB9F9FBDB9BDBB9FBF9FB9F9F9E9BBFA00F9FB9F9FB9FBBFBFDBBBFB9B9BFBBFBF9FBDBFBFBFBFBFBFBB0000000000000000000000000090BCBC9F0A9E000000000000000000000000000000009BF9F0FB9BFB9B9F9BDBB9B9BBF9BBFBDFBDBBB9FBFB9BBF9AF9FAB9AB9FAB0B9FBC0000FB9FFBB9FB9F9BDBB9F9BDBFBFBBF9FBFBFBF9FBF9FBFBFBF9000000000000000000000000DA0F0BCBF0FDF9FBFEB00000000000000000000000000009BB9BB9FB9BFBFBFBBDBF9BF9BBDB9BB9BBF9FBB9B9F9E9FB9B9F9FBDAB9DBFA0000000F0B0BDAF9FBBFBBFBFBFBB9BFBDFBFBFBFBFBFBFBFBF9FBDBE00000000000000000000009ABDFDFFBDFF9FAFDF9FDFFAF00000000000000000000000009F9F9A9FBDBB9BBDBB9BF9BF9FBFBDBF9B9B9FBF9ABB9B9FBFA9B0BBDBEB0000000000F0000090B0BDADB9F9B9F9FB9FBBDBBDBBDBFBFBFBFBFBFBF9000000000000000000009EFFDBFA9FDFB9FDF9FAFFBF9F9E9090000000000000000000000BB0BF9B9BBDBF9BBDB99BB9BB9B9BB0BFBFA9A9BDBCBFA9A9BF9FBCA0000000000000B000000000000B0FBFFFBFB9BFBFBFFBFFBFBFBDBFBFBFBFB0000000000000000009BBFFBCBEBDFFFADFEBBFBDF9F9FFFBFFAC000000000000000000000BDBF9BBFBDB9BBE9B0BFBDBF9F9FBDBF09B9BDBCBBB9B9BDBF0A00000000000000000F00000A00000000009A9BDBFFBF9FBBF9BFBDBFBF9FBFBF9BC0000000000000000BEDF9FDFDBDFBF9FF9BDFDFBFFFFDBDFCBDBCB00000000000000000000B9BBDB9BBFBDB9F9F9B9BB9BBB9AB9BBF9E9A9B0F9FBE9A000000000000000000000F000A0000000000000000B0B9FBFBF9FFBFBFBFBFBFF9FBFBB00000000000000BC9BFFEBFBFDAFDFF9FFDBEBDF9E9FFFBFFDBDBCBDAC00000000000000000F0BBDB9FB9BFB9B9BDBBDBDBDBD9E99A9BDBFBF9A00000000000000000000000000D000000000000000000000000B0FBDBBBF9FBF9FBFBBFBFBD00000000000000BCBFFDBDBDE9BF9FADFBCBDBDFBFFBF0BDF9BEBCBDADB0D0000000000000099BD9BBFB9FB99E9BB9BD9BB0B0BB9BFBF0B00000000000000000000000000000000A000000000000000000000000009BFBFDBBF9FBFBF9FBFBDA0000000000000ADBDFDAFFDFBFFDFBDBADBFBDB9FF9FDFFF9FFD9F9A9F0F0A90000000000000BFBBBF9BFBDBFB9F0FB0BADBDBBDBE0000000000000000000000000000000000000F00000000000A0000000000000000BFBBFFBFBFBFBFBF9FA000000000009C9F0FBFBFDBE9FDAFBDFFDBDBCBFF0FFFBF9FF0FBF0F9E9F9F9E90000000000000B9F9BF9B9BB09B9BBDBF9A9BE9A000000000000000000000000000000000000000F000000000000000000000000000000FB9FBFBFB9FBFBFBF00000000000A9E9F9EDFBFDBF0FDBFADBFFF9FDADF9FDFBFBDF9F9F9F90BCBCBCB0000000000009A9FB9FBBC9F0FBDA0000000000000000000000000000000000000000000000000D0000000000000000000000000000009FBBDBF9FBFBDBBF00000000009BCB9BCFBFBDFBDBFBFFDFBD9E9F9BDBBFFBFDFDBFBCB9E9EBDB9F9AD0F00000000009FBB9FB9FBB0B00000000000000000000000000000000000000000000000000000A0000000000000000000000000000000BFFBFBFBFBFBFF90000000000FCBDEFF9FDFEBDAFDFBDFBDAFBF9ADB0FDBFDBFBF0DBDE9F9D0BCBCBDA09E00000000B9B9FB9F0000000000000000000000000000000000000000000000000000000000F000000000000000000000000000000009BFBDBFBDBFBB000000000009BCFBCBFAF9F9FDBBDEBBCBDBD0BDA9F9BDFBEDADBF0B9F9AFBDB9F0B9F09C00000000FBF9FBA0000000000000000000000000000000000000000000000000000000000F000000000000A000000000000000000000BFBFBFBF9FFE0000000000E9BDFBDFDBFFFBFDFBDFDBDADBF0BD00F0B0DBDB0DBDADAD99E9E9BD0F0F0B0000000099BB9F00000000000000000000000000000000000000000000000000000000000D000000000A00000000000000000000000099FBDBFBFBB000000000909FEBFDAFBFDBDF9BFCBFAFBDBC9BCB9F09CB09A9DA09099A9E9B9F0BF9B9E9E0000000BF9FB000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000BFBFBFBFBD00000000000BCBDAFFFDFAFFAFFDBF9F9C9E9BC90F09FBDBE9DA9BDBFA9F090F09F90FCB90D000000B9BB0000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000BFFBDBFB0000000000C9FFFDBDBFBDBDF9FAD9F0FBF9E9FBF9FF09A909A9C9A90D0BBDB9F9ADB9B9E9AD000000FBC0000000000000000000000000000000000000000000000000000000000000F000000000000000000000000000000000000009BFBFBFC00000000B0A9BFFEFFDFFFBFF9FBEFBD0F9FBDBDA99F0DBDBDA9F9E9B9C9ADB0F9ADADA9F0AC0000B9A000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000FBFBDBA00000000009FFE9F9FAF9FDBFF9F9F0FBFBDFADADBE9FBCBDBDF9E9BCF9BDBCB9E9BDB9E9BDA00000F000000000000000000000000000000000000000000000000000000000000000E00000000000000A00C090C000000000000000009BFBFBD000000009CFEF9FBFFFDFFBFD9E9E9F9FBDEBDBF9FDBC9FBCBF0BDBDB9BCBCB9F9BC9ADB9CA90000B00000000000000000000C0000000000000000000000000000000000000000000F0C00A000000A0900A000A0000000C0000000000009FBDA000000000B9BFFFCF9FBFBDBAFBDBFFBDFF9DBFDF0BFBFDBFD9FDBDADADB9B0F0BDBF9ADAB9E0000000000000000000000CA000000000000000000000000000000000000000000000F0A000C00AC090C0000A000AC0AC000A0A0000AC000BFBF00000000A0FDBCBFBFFF9FFDBDAF9BDFBCBFBCBBDFD9F9FDBFDBFDBDBDADF9F9F0F0F9F9DE99E0000000000A000000C0A0000000E0000000A0C0000000000000000000000000000009000000A000000A00C9C0C900090A0900C9AC00000E9AFB000000000DAFFFFDFF9FFF0FDBDBFFFBDF9FDBFDBFBFFFFBDFBF9F9F9F9B0F0F9F9F9FCBB9FA900000000000000000000000C0A000CA000C000A00000000000000000000000000000E000A000000A00000A0A0A0C0AC00C0C00000B00A000DBF000000000BFFADBFE9FFDBFBBEBFFCBDFBFFBFDBDBFDBDBDFBFDF0F9FBCBDBDBCB0B0FBBCDAD00000000000000AC0A000C0A000000000CA0000000000000000000000000000000000F0000000000000000000000A000A00A0A0AC00C0C90A09BE00000000FBDFFF9FFBFADBDF9F9FBFBDF9FDFBFFDBFFFFFFFDBDBFDE9FDBCB9F9F9F9FDBBDBE000000000000000000A00000000CA0C00000AC000000000000000000000000000000F00000000000000000000000000000000000A00A00C00C0B000000009EBFCBFBDFDFBCBFFFFBDFFBFFBFDF9FFDF9FFF9FBFFDBF9F9ADBDE9E9E9B0FCBBD9F0000000000000000C000000AC00000A00AC00000000000000000000000000000000B0000000A00000A00000000000000000000000000A00A00C00000000FDFFBFDFFBE9FBF9F9FDBF9F9FDFBFFF9FBFF9FFFDF9FDBF9FDBCB9F9F9F0F9BDDAF9E00000000AC00000000E00C000A0000C0C00A000000000000A00000000000000000C0000000000000000000000000000000000000000000000A00000009BFFADFFBCF9FBFDFBFFBF9FFFFFBFDF9FFDFDFFF9FBFF9FDBCB9F9F9CBDADB9FFBF9E9000000C00000CA0000000A0000C0E00A0A0C000000000A00000000000000000000F0000000000000000000000000000000000000000000000000000000FBDFFBDFBFFBDFBFF9FDFFF9F9FDFBFFDBFFBF9FFFDBDBE9F9FFDBCBF0F9F0F0BC9FBDF0000A0000A00000E0000000E000000C00000000A0000000000000000000000000B0000000000000000000000000000000000000000000000000000000FEFBDFF9F9FFBDF9FFBF9FFFFFBFDF9FBDBDFFF9F9F9FDBDBD9ABF9DBDBCBDBDBFBDBBCBC0000000000000000E00C000A00A000C00A00000C0009000000A000000000000F000000000000000000000000000000000000000000000000000000ADBFFEBFEBFF9FFBFF9FFFF9F9FDFBFFFDFFF9F9FFFFF9F9FDAFDF9FBCBDBDBCBD9FEDFBDA00000000000A0000000A00C0C0C0A0A000000000A00E00A00000000000A0000C0000000000000000000000000000000000000000000000000000009FFDF9FDBDF9FBFFDBFFBDBFFFFFBFDF9FBDBFFFFF9F9FFBCBF9F9FE9F9F0F0F9EBF9FBDAD00000A00CA0C0A0C000000000A00C0000000A000000000C00A000A000000000B000000000000000000000000000000000000000000000000000000BBFAFFBFFFBFFFDBFDBDFFFDBF9FDFBFFDFFDF9F9FFFF9FDBD9F0FDBDBCBDBF9F9F9FBDFBDA0000C00000000000AC0CA0A000A00000000000000000000000C00000000A00F000000000000A000000000000000000000000000000000000000000FFDBDE9FBDBDBFDBFFBF9FFDFFBFFDBFBFBFFFFFFBDFF9FFBFBDBF9FBDBE9FBCF9E9FBDFBDBE000000000C000000000C0C0C000000A00000A00A000A0C0000000A000000F0000000000000000000000000000000000000000000000000000009FBFFFBFBDFFFFFBF9FFFFFBFBDFDBFFDFDFDBFFDFDFBDFBDFDFBDADBCBDBDADBDBFDBDBFDAD00000AC000A00E000A009A0B000A900000000000C000000A00A00000000000000000000000000000000000000000000000000000000000000009EFDE9BFDFFFBF9FDFFFDBDBDFDBFBFDFBFFBFFDBFBFBDFBDB0FBDBDBDBDADBDBDBF9F0FFDBF9E000000A0000000E00CA0C0C0E0C0E00CA0B0C0000000000000000000A000F000000000000000000000000000000000000000000000000000000BFBFEDFBF9FDFFBF9FBFFFFFBFFFDFBFDBFDFBFFDFDFBDEBDF9DAF9F0F9F9EBDBCDBFF0BFF9E9E0A0000000C000000000A0A000A00CA00C0A0A0A0A0A0000000C00000000F0000000000000000000000000000000000000000000000000000000FDBFF9FFFBFBDFFFFDF9FDBDBDBFFDBFDBFDF9FBFF9FBDFBFFBD9E9F0F0F9DBFBFDBDF9FFF9F90C000C00A00A00C0A0C9C0BC0D0A9CA9A0C0D0C9C0D0E0E00A00A000000B0000000000000000000000000000000000000000000000000000009BFE9BFF9FDFFFBDBFFBFFBFFFFFDBFFFFFFBFFFDF9FFDBDF9DFFBDBDBDBDAF0FDBFFBDBDBFF9EB000A000000C00A00CA0A0C0A0AC0A0C0CB0A0A0A0A00009C000C0A00E0C000000000000000000000000000000000000000000000000000000FEF9FDF9FFBFF9FFFDBF9FDF9F9FBFFDFBDFFDBDFBFFDBFF0FBA9CBF0F0F0BDBDBF9FDBCBFDBCBD00000000000000009000D0A90C9AC90A00C0C00C00C0BCA0ACA0BC0D00B000000000000000000000000000000000000000000000000000000BDBFFBFFBDF9FFBDBFDFFBFBFFFFDFFBFFBFFFFBFFDBFFDBF9FDFBD9F9F9BDBDBDFFBFF9DBFFF9E9AC00AC0A00B000A0000A00C0A000AC9E0B0ADA0E9AC000C900C00A0A0F000000000000000000000000000000000000000000000000000009EBCBDF9FFBFF9FFFDBFDBDFDFBDBFBDFFDFDBFDFDBFDBFFDBF9BDBEBCBCBDADADB9FDBFBE9FF9F9E90000000C000C000E00000A000C0000000000090000ACA0AC9A0C00C0F00000000000000000000000000000000000000000000000000000E9FFBFBFF9FDBFF9FBF9BFFBFBDFFDFFFBFFBFDBFBDFBDF9FDAFCBD9DBDBDAD9F9EFBFFDF9BDBFFDBCA0000000000A0000000000000A000A0C0AC0AC0AC9009C00AC0B0E9A00000000000000000000000000000000000000000000000000000A9BF9FFDF9FFBFF9FFFDFFDBFDFFBFBFBDFF9FDBFDDAD0F99E99DBDEBFADBCB9F0BF9FDFB9EDFDF9ADA9C00A00A00000000000A000A00000000000000000AC0000000000000F00000000000000000000000000000000000000000000000000000FDEF9FBFFF9F9FFBDBF9FBDBFBDFDFDFBDBEDBF9FBDBD9AD99E9099C99E9BDADBD9FFBDFF9BABFFDBF009000000A000000A0000000000A000A00000000000A00AC00AC0000F00000000000000000000000000000000000000000000000000090BBDBFFDF9FFFFBDFFDBFDFFFDFFBFBFFDEDBD0DFDFFFFDDAD99DBC9BC9F0DBDADBF9FFBDFFDDBDBFD9FAC00000000000A000000000000000000000A0000000000009000A0000000000000000000000000000000000000000000000000000000ADEBFDBFBFF9F9FFBDBDBFBDBFBDFFDF9F9D9FDBFFFDF9F9D9AD0D9BC9A9DBCB9BCBDBDFFBDBBDBFCBE9DA0000000000000000000000000000000A0000A00000000A0000000F0000000000000000000000000000000000000000000000000009FF9FDBFFDF9FFFFBDFBFFBDFFBDFE9FBD0F9E99F9C9090D0B0D09A0C9C9D00BDADBDBFBDBDBFCDBDBF9DA000A00000000000000000000000000000000000A000A0000000000A000000000000000000000000000000000000000000000000000ADBFBFFDFBFFBDBDFFBDF9FFBDFFBDF0DBD0D9FD09B9FDB9BDFBFBDF9AB00BD09DBDBE9FFFFBDBBDBDBEBDBC0000000A0000000000000000000000000000000000000000A000D0000000000000000000000000000000000000000000000000009ADFDBFBFDF9FFFBDBDBFF9FFBDFF9DF0D0B09BFFDFFBFFFFFFFDFBFFDFF009E909BD9F9BDFFFDEBDFD9F0B0C000000000000000000000000000000000000000000000A00000F000000000000000000000000000000000000000000000000000FFBEBFDFFFBFF9FFFFAD9FFF9FF0DF0900BDFFFFFBFFFFDBFFFFBFFFFBF0F0090DBCBFDFDBF9FB9F0BBF0FDB0000A00000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000009BF9F9FDBFF9FF9FF9F9DFAFF9FF9F9090F9FFBFFFFFFFFFBEFFFFFFFFBDFFB0900B09BDB0BFDFBDFDBDEDBDA00A00000000000000000000000000000000000000000000000000D0000000000000000000000000000000000000000000000000ADAFFFBFF9FFDBFBDF9FB9F9FFBC90E9EF0FBFDFFFFFBFFFF9BFFFFFFFFFFFC9E090DBCBFFDBF9FF9ADB9BDA9FC000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000BDBDFF9FFBFFDFFBFBDE99F9EDBD90B9FF9FFBBFFFDFBFCF0DB9F9BDBDADBF090C0099099F9FF9FFDBCF0FDA9AC0000A000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000BCBFBF9FFFDFBFBDFDF9BDBBF9F00A9FFF9EFFCF9E9B0D9B9DBC90C90DADBC900A909CADBF0FBDFBDBDB9F9AD9F0A000000000000000000000000000000000000000A00000A0000000000000000000000000000000000000000000000000000BDBFDFDFF9FBFDFDF9F9ADAFC9F090DFFE9E9B990BD90D9E9CB09AD99E909090E9909A99BE9DF9F9F0FA9DADF9E0000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000ADBFBFBFFFDBFBFBFBDF9D9B90C00B09F099C9E9DADF0BDDBDFDDBAD9BDADBF9F0F0DBC99FB0BDBDBD9EBDA9E9BC00000000000000000000000000000000000000000000000000E000000000A000000000000000000000000000000000000009FADFFDF9FFFFDF9FDFBDBAD0F99BD0F09FE9BF9F9F9FDFBFDBFBFDFBCF9F9CBDAD9B0DBDA9DFDBCBDBD90BDA9EDA90A0000A00000000000000000000000000000A0000000000009000000000000A0000000000000000000000000000000000CABDFBDBFFFBDBFBFFBF9E9DB9ADADBF9FF9BFDFFFFFFFBFDFBFDF9F9FF9F0FBDADBC9F09A9FB9ADBDA9AF9DA9F9A9C000000000000000000000000000000000000000000A000000E0000000000000000000000000000000000000000000909A9BDFBFFFFF9FFFFDFBDF9F9BCBDBDBE9FF9FFDFBF9FDBDFDFBFDFBFFFDBDADF0F9DA9E9BF9DF0FDBDB9FD99A9E9E9CA0000A00000000000000000000000000000A000000000A0000900000000000000000000000000000000000000000000BFFFFBFDF9F9FFFBDBF9FF9E90FBDBCBDFFDAFDBFBDFFBFFBFBFDFBDE9F9ADBDBDBD0BDB90D0FA9F0B9F0F9BCBD990F0BCB00000000000000000000000000000000000000A000000000E000000000000000000000000000000000000000009ADBF9F9EBFFFBF9FDFBDFF9E9FBD9DADBDB9FBDBFDFFBDFDBDFDFBF9FBDFFFFF0FB0FBFCBCB9BD9F99F9E9F9E9BDADA9AD00CA00000000000000000000000000000000000000000000000B00000000000000000000000000000000000000000ADFFDFEFFDF9FDFFFBFDBF9F9F9C9ABD9F9EF9DFF9FBDFFBFFFBFBDFFFDBF9F9DB9DF9C9BD9DE9A90F0BDBDBDBDBC9BC9CBCB0D00000A0000000000000000000000000000000000A000A00C0000000000000000000000000000000000000000BDFBFFBF9FBFFFFBF9FDBF9F9F9E9B9D9BE9F9FBF9FFDFFBDFDBDFDFFBDBF9FF9FADE90FBDA9A9BDBF9BD9F9E9F0F9BCB0B0BC9A00A0000000000000000000000000000000A000000000000B0000000000000000000000000000000000000009FBFFFFDFFDFBF9FDFFBFD9F9F0F9BDA9AD9F9F9E9FDBFBDFFBFFFBF9FDAD9F09E9DB9BF90BDBD9DAD0F0FBDBDBDBDAD9BC9E00FC00000000000000000000000000000000000000000000000E00000000000000000000000000000000000000ADFDFBFFBFBEFDFFBF9FDBEFF0FBDFCBDF9A90F9F9FBFDBDB9DF9F9FFFBDB9E9F99E9FC90FD09CB0BDB99F9EDBFDBDBDADCB09CB0BC0000000000000000000000000000000000000A000B0000900000000000000000000000000000000000009FFBFBFDFFDFFBFBDFFFFBF9F9F9DBB9F9AD9DB9E9F9E9FFFFFBFFFFF9DFBCBBDADA990B9F9A9F9DBD0DAF9DBBDBCBD9F9BBC9EBC0DA00000000000000000000000000000000000A0000000000E000000000000000000000000000000000000BBFBDFFFFBFFBDFDFFF9F9FDF9FBFFBDFDBDF0B0F9F9F9FBDBDBDBD9F9FFADBDCBF9F9E09C909F0BAD0BBD9FFBDFDBDAF0F9C9A900BA00A000000000000000000000000000000000000000000009000000000000000000000000000000000000DFDFFBDFFFDFFBFFFBFFFFBFBFDBDBDF9BF9BF9D0BDBDF9FBDADF9FB9F9F9FDFBF9F0F9F0B0F09D9DBBD9FBDBDF9BF9F9F9E9AD0F00D000000000000000000000000000000000A0000000A00A00E000000000000000000000000000000000000BFBFDFFBFFBFCFFBFDF9F9FDF9FFFDBFFDFFDFBF9CB0BDBDFFF9AD0DADADFBF9FDFF9F09F0F9FA9A9D0BC9FBDBFFDBF9F9F9F9AD0ADAD00A00000000000000000000000000000000000A0000000B000000000000000000000000000000000009F9FDBFFFDFFFBF9FFFBFFEFBFFDBDBDBDBF9F9F9FB9DF9FBC99FDBFFBDBFBDFFFBF9F0F9E99E99C9F0BDFBFDBFDBFD9EDADADADA0D00A0000000000000000000000000000000000A00000090C00C00000000000000000000000000000000000BFFFBFF9FFFF9FFFF9FFDBDBDBDBFBFFFFDBFFF9FD9E9A9F9FBFFBFDBDFFFDFFFFDFFF9F090FB9E9B0F9F9FDBFDBFDBFF9F9F9F90F00BC00000000000000000000000000000000000000000A00A0B00000000000000000000000000000000000FDBDFFFFFBFFF9FAFFFBFFFFFFFFDFDBDBFDF9FFFBF9F9CBD9F9FDBFFFF9FBFFDBF9F9E9F0F0DE90DB9F9FBFDBC90BDB9F9F0F0E90BC0900000000000000000000000000000000000000A0000900E00000000000000000000000000000000000BFFBF9FFFFF9FEFDFBFDBDBF9F9FBFFFFDBFFFBFDF9F9B9EB9CFBFDFBDBFDF9FFDFF9F9F0D0B99E90F9FFD0900BCBC0D0BCBD9F9E90B0E0E0000000000000000000000000000000A000000000000900000000000000000000000000000000009FBDFDFFBFDAFBDBFFCFFFFFDFFFFFDBFBFFDFFDFFFFFFDF9DA9BDFBFDFDAF9FE9FBDFCBCB0BCBC09F9E90BCBDBDBDBF0BC90FADA9CAC09000000000000000000000000000000000000A000A00A00E0000000000000000000000000000000000FDFFBFBFFDFBDFFFFFBFBF9FBFBDBDBFDFFFFBFFBFF9F9F99ADBDF9FDBEBD9FF9FFDBDBDBC9C90B9F0F9CBDBDBDBFDF9FFD0F09DBCB909E0000000000000000000000000000000000000000000000B0000000000000000000000000000000000BFBDFDFDBF9FFF9EBDFFDFFDFFFFFFFFBDF9FFDFFDFFFFBFFDBCB0F9BDBDBFF9FBDBCBDADB09E9C9AD0F9E9F0FBDFBFFD9FBDE9A0BCCA00000A000000000000000000000000000000000000000000C00000000000000000000000000000000000FFBFBDBDADBFFFFFBFBEBFFBDF9FFBDFBFFFFFFBF9F0FDBDBDBDBCF0FDBDADFDFBDBDBDADA90B0F09BCBDBDBDFBDF9FBE9F0BC9C0B9DAC0BC0000000000000000000000000000000000000000000F0000000000000000000000000000000000BDFDFFFFBDBFFBF9FEDFDFDBFFFFFDFFFDFFF9F9CDADF9EDBCBDADB9F9F0FDBFBDFBFDADBC9E9C909E9F9F9FF9BDFBFF9FF9FDBF0BCA0090000000000000000000000000000000000000000000000A0000000000000000000000000000000009FFBFFBDBDBFFFDEFFFBFBFBFDFBFFBFFFBFB9FCFFBF9BDFBDFFF9F9F0FBFDBF9DF9EDBDBC9A9DA90F9F9FF0F9FFFBDF9FF9FFBDCBC090F0ACA0000000000000000000000000000000000000000000D0000000000000000000000000000000000BDF9FFFCBDFDBFBFBDFFFDFFFFDFDFFBDFCDCBBF9FDFFFBDF9FFFDEBDBDFBFDEFBFDBDADA9D0E9E9BDBE9BDBFDBDFBFF9FF9BCBBDBDE0000000000000000000000000000000000000000000000000A0000000000000000000000000000000000BFFFFDBDBFBFFDFDFAF9EBF9FBFFBFDFF0BBFDF9F9F9F9FBFBDBFFFDBDBCDBF9FDBFDBDBDE9B909E9E9DFDBDBFFBDF9FF9FFDFDE9EBFCB0F000000000000000000000000000000000000000000000F0000000000000000000000000000000000FDBFBFFF9FFFEBEBFDFFFDFFFFFFFFFE9FDF9F9FFFBFFFFDFDFBDBDFEBCBBDBF9FFDADADA90C0F99F9FBFBFFF9FFFBFF9FF0FBDBFDBDF0C00000000000000000000000000000000000000000000000000000000000000000000000000000000BFBFDFFF9BFFFBDFFDFBDBFFBDBDFF9E9FBF9FBF9FBDFDBDBFFBDFFBFFD9F9CBDFFDBF9F909E9B0BE9FBDBDBDBFFDBFDBFF9FBDBFCBCBE00AC00000000000000000000000000000000000000000000F0000000000000000000000000000000009FDFFFF9FC9F9EBDABFEFFBDFFFFBEF9FDF9F9FDBDFFBFFFFBDFFBDFF9EBCFBCBF0FF9F0FDA90C9D9F9FFFFFFFDBFFFFFDBFBDFCFBDAD9E0900000000000000000000000000000000000000000000000000000000000000000000000000000000BFBF9FFBFB0F9EFDF9FBDFFBDFFFD0FBFFFFFBFFBFDF9FBDFBFDFF9FFFDBFDBDFF9FFDB00DA9ADADAF9F9FF9FFF9FDBCBDADBBF9E9FACBC0A00000000000000000000000000000000000000000000F000000000000000000000000000000000FFDFDFFDF9DBC9B0BEFFDEBDFFBFDBFFDFBDB9F9FDFBFFFFFBFFBFBFF9FFFCBFBDBFDADFDBAD0DABDBDFBFF9FF9FFFBFFBFDBCF9E9E9DBC00000000000000000000000000000000000000000000A00A000000000000000000000000000000000BDFBFBFFBCADABCFDF9FBFFFBFFDAFDBFBDFFFFFFBFDFBFDBDFDFDFF9FFBCBDBCBFDBFF0B0D00BDDBDBBCF9FDAFFBDFF9F9ADB9E9F9EBE9009C0000000000000000000000000000000000000000000D000000000000000000000000000000009FBFFFFF9F99A9CB0BFFFFBDFFDBFDBFFDFFBDBDBDFBFFDBFFFBFBF9FFBDFFF0DBDBFDBDBCB00D0BADADDF9EBFDBDFBD0F0FDAD0B9E9F09EC00A0000000000000000000000000000000000000000000E000000000000000000000000000000000FDBDFFFFFFF0A9ED0FBFDFBFBFFADFFFBFBFFFBFFBDFBFDBFDF9FFF9FFBBDFCBCBFDBCF9F0DAADDBDBA9BF9F9FFBDFFBDB0BDAD0F9E9F09A0000000000000000000000000000000000000000000000B000000000000000000000000000000000BFFFBDFFFFAD009ABFDEBFDFDFCDAF9FFDFDBDFDBDFBDBFFDBFF9F9FBDFDBFF9FBDBFFBDADA9DABCBDFFF9FFFFFFEBDFADFC09B0BCBDADAC0000000000000000000000000000000000000000000000C00000000000000000000000000000000BFDBFFFF9FDF09AFADFFBFEFBFBFBFFFFFBFBFFFBFBFFFFFDBF99E9FBCBDBEF0DADFFDBDE9F09E9DFFF9F9EFDBF9DBDF0FDA9BF0FC9FADA900000000000000000000000000000000000000000000000B000000000000000000000000000000009FFFDFFFFFBDE000DA9FFDBDFFFC9F9F9FDFDBDBDFF9FFFFBDBFFBF9DBFFF9BE9FB0FBFBDB09E9EB9F0FBD9FBCFFEF0BD0BC9C9F0BF0DBC000000000000000000000000000000000000000000000000F000000000000000000000000000000000B9FABFFFFFADA0F0DAFFFFFBDBFEFFBF9BBFFBFBDFFFFBDFFCBD9FAF9F9FFDF0DFF9FDF9EFDAD0DAD90CAF9E90909CA9FCB0BCBD0BF0CBC000000000000000A0000000000000000000000000000000E000000000000000000000000000000009FF9FDFFDBFDF0000BF9EFFBFEFC9BDE9EDF9FFDFFBDBDFFADBDBE99DFFFF0F0FFBDFBF9E90000B0F0ADB9C00E0E0009CA90D0BC0F09BF0000000000000000000000000000000000000000000000000900000000000000000000000000000000BD09FBFBFFCB0000BF0FFBDFFDBFBCFBFB9AFFDBFBDFEFCBDBCBC99EB09B9FBDA9CFBFDA00090BCD9FDB0CF0F0900E9CA9C00BD0B09EC0C000000000000000000000000000000000000000000000000E000000000000000000000000000000000FBF09FFDBFBE900C0FBFFFFBFF0DBFDFDFDBDADBDFBDBFDA9F9F0F99FEDE9FE9EBFDFFD09ADADBE9BFFFB0CADE0000AD09A9CAC9CA99A0E00000000000000000A00C00000000000000000000000000F00000000000000000000000000000000BDF9F09BED0D0E00B00FDBEDFBFFE9FBFAF9AF9FFFCBC000C0CBCB0F09B9BDADBDFBFFBFFF9F9E9FFFFFFDA900000000000DA90B09CAC0900000000000000000900A0A0000000000000000000000000B000000000000000000000000000000000FBFCBC09A9A900000BDAFDBED009EBDF9FFD9AD0A0C0A90A0BDF0D0BCF0DAD0FFBDFBFDBDE9FBDADFBFFC0EDAD0AC09ADA00CBCBCB000E00000000000000090C0090000000000000000000000000A0C000000000000000000000000000000000BFCB009AD0000000ADAF9FAD0BFFBDE9FF0BED0BFDB09CAD0DA0DA9E9B9EBCBF9FFFDFBFFBF9EDBFFFDB0F90BCAD09ADAC9CBC09000DA00000000000000000A00E00000A0000000000000000000000B0000000000000000000000000000000000FBC0000000000000000A0FBFCFFCFBFE9FD9BFDFFFFE0000AD009F9FCF9CBDFFFBFBFFDBD9F9BDBDBFEDACBCBDACBC090A909E00E9AC9C000000000000CA00090000000000000000000000C0A00C0F000000000000000000000000000000000009A0000000000000000CBDEBFEBF0F9FFAFE90BFFFF0F00000BCBCF9BCB0FBF9FDFF9FFFFADF9E9F0F9FF0F0CADBCBCAD0E0000F0F9A0A0000000000000909E000000000000000000000A000000A0C00000000000A0000000000000000000000AC000000000000000BDBDAFDE9FFF0FDADF9EF9FBFDFDADADBCBCB9EDAC9FDFFFBFDFF9BDF9BE9F9BDA9CE9E9C0000000090F9F9F0C9C000000000000000E0000A00A00000000000000C00A0CA000B000000000A00000000000000000000000090000000000000009E9EBFFFBFFDADEBFF9E99EDFFEFADF9F0F9F9EDA99FBFBDBDFBF9FDFBFFDBF0F0F9F9BC0A00F0DBCBCF0F9E9EB0A00000000000009A000000000000000000000A0A0D00000C0F0000000000000000000000000000000000000000000000000009FFFFCFF9EBFCBCF0F9EFDBE9DBDAFD0F0E0F09CBE9F9FFFBFDFFBFBDBDBDF9FF9F0BCB9D9F9E9AF9FBF0F9E90C900000000000000C09A00000000A000000000000A0AC0A0A0E000000000000000000000000000000000A0000000000000000A00BCFBFEFDFBFCBCF0E9EADBEBCFDAE9F9F00E9BDFBDF9FDFBF9FDBDFFBFBFF9F0F9F9EFADADBC9AD0DADA09E9A0E000000000000A900000000000000000000000C000A00D00D000000000000000000000000000000000000900000000000009CBFFBFDBFFADBBCBDFBDFDFEDCB9AD9E0C00F0FCB9FFBFBFBDFFFBFFBDFDFDBFBF9E9E999BDADBC9A9BF09F0000090000000000000000000AC00000000000000000AC009E0A0B00000000000000000000000000000000A0000A00000000000000BDADFEFDADFCFFFAFDEBFFFDBFCEDAC90BDBDB9FFF9FDFDFFF9FFDBDBFBFBFDFDF9FB9FEF0F9ADADAC09E0E0DA9E000000000000000000000A00000000000000A090ACA000CE000000000000000000000000000000009E00000000000000000BCBFFBFBFFBFBDBDFCBDEF0FFFCBDADBCBC9A9FFF9FFBFFBDBFFDBFFFFFFFDFBFBFFDFF9F9F9FF9F9F9BC909A0C0000000000000000A000000000A000000000000CAC90C0CA0F00000000000000000000000000000000009E00000000000000009CBCFDEDBDEDBCBDBFBD9F9ADBCBCB0BDBFDF9FFFBDF9FFFFDBFF9F9FBDFBFDFDBFBDFFFFFF0FF9FEDBADAC9A9E9E0000000000CA00000A000000000A0000000000A0A0A900B000000000000000000000000000000000A00000000000000000A0BFFBFBFEFBFFBFBCBCBE9EDADBDBDFDBF9FBFF9FDFFFF9F9FFDFFFFFFFFFFBFFFDFFBDBDBDFF9EF9FCDADBC9E9C0000000000B0000000000A0000A00000000A0000C0900E0E00000000000000000000000000000000AD00BC00000000000000DADAFDFFBDF0FDEDBDFBDBFBDBFBDFBFFFFFFDFFFFFBF9FFFBFBFBF9FFFF9FFFFDBFBDFFFDBF9FF9E9BBF9ACB00A000000000000900000000000A0C9000ACA0000E0A0E0E00F0000000000000000000000000000000000A00000000000000009ADBDFFADFBFFBFBFFBCFFFDFFDFFFFFFDFFDFBF9FBFDFFF9FDFDFDFFFDFFFFDBFFFDFFBDBFDBFCBDBEDC9EDBCBD0000000000000000A00000000000ACAC0009CA009C0009A0F00000000000000000000000000000000B0C0009A00000000000000FB0FFBFE9FFDF9FFBDBFFFBFFDBFFFBFFBFFFFFDFF9FBFBFBFBFBDBFBFFFFFFFBFBDFADBFCBDFADBFBE9E9ACAC000000000000A000000000000000000A0A0000A0ADAC0C090000000000600000000000A00000000000A9A000000000000000A90FFBDEDBFF0FBE9FDFFFBDFFBFFFDFFFFFFDFFBFBFFFDFDFDFDFFFFFFDFBFF9FFFDFBDFDFBDBFDBCBDBF9EF90B00000000000000000000000A0DA0A000C0CA00C00000A0AE00000A000000A000A0000000A000000A9AD00C000000000000009CBDBCFFBFDFFFFDFBFFBDFFFDFFFFFBFDFFFBFDFFDF9FBFBFFBFBDBFDFBFFDFFFDBFBDFBFBDFE9ADF9ED0F090AC0000000000000000000A0000000D0C0A90A0C0A0AC0F0C0F00000000A00000000000A00000000000000A0A000000000000000A9EBFF9EFFBF9FBFFFDFBFDFBFF9FFFFFBDFFFFFFFFFFDFDBDFDFFFFBFF9FBFBFFDFDBF9FDAF9FFCBDFBF0DAC90000000000000000000000F00000A0AC0E0C0A90C9A000B0F0000000000A000000000000000000000E00C90000000000000000009E9BF9FFFFFFFF9FFFFFBFFFFFFDFFFFFFFDBF9FBDBFBFFBFBFBDFFFFFFFFDFBFBFDFF9FDBF9FBEB9E9FA9A0000000000000000000B0C000ACA0009A00A90CA0A0CAC0C0B00A000000000A00000A000A00000000909A0000A000000000000009E9EDFFF0FFF9FFFFBDFFFFDBDFBFFBDFFFBFFFFFFFFDF9FFDFDFFBFDBFDFFFBDFDFBF9FFBFCF9F9DE9FC9C0000000000000000000000A000009C9E0C0F0CA00C0CB09A0AE0000A00AC00000000000000000000A0C0AC9A0000000000000000B0A9FBE9FFF9FFFFFFFFFBDFFFFFFFFFFFBFDFFDBDBDBFBFDBFBFBDFFFFFBF9FFFBFBF9FF0FDB9E9FEBDA9A00000000000000000000C0000A9C0A0A000A00A0CB00A0CAC0CF0000000000A0000A0000A0000000000A00000C09000000000000000D9E9FFBFFFFF9FBDFFFFFBFFBFFBDFFFDFFFBFFFFFDFDBFFDFFFFFFF9FFFFF9FDFDFFDBFDBEF9F9BDA9C0000000000000000A00000AD0000A0C00E9E9E0CB0CA9CA000B0F0000000000000000000000000A000009E9A000A00E00000000000000A9E9EDBDBFFFFFFF9FFFFFDFFDFFBDBFFBFDBDFBFBFFF9FBFFDBF9FFF9FFFFBFBF9FBDBBDBDADE9FDA900000000000000000000A00000C009A900A000B0CA0CA0DACAC0900A00000A0000A0000A000A0000000A000C0B000090009000000000B0F9FBFFFFDBFDFBFFFFDFFFFFFFFFFFF9FDFFFFDFDF9FFFDFDBFFFFFFFF9FFFDFFFFDEDFBDADBFF0A9C0000000000000000000AC90A0A0A0E0CAD0F0E0CAD0A0CA0900AE0000A00000AC000000000000C00000009A9AC000000A00A000000000C9AFE9FBFFFFBFFFFFBFFFBFFBFFDFFFFFFBFFBFFFBFFDBFBFFFFFBDBFFFF9FFF9F9FBB9CBDBDB09D0A0000000000000000000000C00D00000B00A0E00B00A9CB00E0BCF000000AC00000000A0C00F000000A00AC0C900B0A000C00000000000BCBDBFCF9FFFFFDFFDFFFDFFFDFBFFF9FFFFFFDFBDFDBFFFFFFBDFFFFF9FFFFBFFFFBDDFBCBDADF0A900000000000000000000000A0000BCBC0E0C00BC0E0CA00CB0E0AF00000C00000000A00900000A00A000C90A00A0C090090090000000090B0F9FBFFFBDFFBFBFFFBFFBFFFFFBFFFFFFDFFFFFBFDFBDFFDFFFFF9FFFFFFFDFBDFBE9F9FF9B0D0C9A00000000000000000A000000A0000A90B0F00A00B0CA0AC09C0B00A000000A000C0000A0A00C00000000A00A09A0C0A00A000000000000DADADBF9FFBFFFFFFFFFFDFFFDFFFFFBDFBFFFDBFFBFFFFBFFFBFDFFFBDFFFBFDFBDBFDB0BCF0A9A0000000000000000000000000000CAC0E0CA0CAD0E0CB0F00ACA0E000000A0000A00000000000000000A90C90C0000A000000000000000ADA9FBFDFFFFFDFFDFBDFFFFFBFFFDFFFFFFFFFBFFDFFFDBFDFBFDFFFBDFFBFDFFBF9FF9ADFDB0F90C0000000000000000000000A9C090A90B00BC0B00A90A0C00ADA0DF0000000000000000AC000C0A0000000A0A9000B0900009C0000000009A9F0FDBEBF9FFFBFFFFFDBFFFFFFFBDFFFFFFDFBFF9FFFFFFFFFFFBFFBFFDBF9FDFFDBDFA9A09C0B0090000000000000000000000A0E00CAC9E00E0DAC0E9CA0E00C0AF000A0000000000A000000A00CA00C00000A9AC00CB0DA00B0000000000CBDAFFDFFFFBFFFFFFBFFFFFFFBFFFFFFFFFFFDFFFFFFFBFFFFFFFDFFFBFFFFFBDFBEBDF9D09B000000000000000000000000000000B000A00F00A0CB00A09E9ADAD0D0000C0000A0C000000A009000000A0009C00C9A0A00000000000000000B0BF9FBFFBDFFDBFDFFFF9FFDFFFFFFFFFDBFFFBFFF9FDFF9FFFFFBFDFFF9FF9FFBDF9F0B00AC000A00000000000000000000000000C0F0DAC0E9CA00E0CAC00CA00AA000000A0000A00000000E00A000090BCA00B000900000000000000009C90F9EFDF9FFFFFFFBFFFFFFFFFDFFFBFFBFFF9FFDBFFFBFFFFFBDFFFBF9FFF9FFBDFBFDBCF99000900000000000000000000000A09A0A00A00A00AC9E90B00F0A90E0F000A000000000000A00000C0000E00000B0C0A00000B0000000000000A0F0F9FBFFFF9FBFFFFDBFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFDFFBDFFFFF9FFBDFFBDFADF0B00000000000000000000000A000000C09C9E0CBCBC9A00AC0E00E0CA9CF00000000000000A00C000A0000900E00000B0900E90000B0000000000090BCBCBDBFFFFFDFFBFFDBFFBFFFFFFFFDFFFFFFFFFFFFDBFBFFFFFBFDBFF9FFBFDFBD009D9E9000000A000000000000000000000A00A00F0000AC0AC9A09E09A0CA0F000000000A0000C0000A000A00A00900F0F0CA000000000000090000090A09F9FFF9FBDBFBDFFFFFFFFDFBFFFFBFBFDBFF9FFFDFFFDFFF9FFFDBFDBFF9FDBF0F0EB0A00000009000A000000A900F000000000A0CA00E9E0B0DAC0E00BC0E90EA00000A000000A0000A000C00000000A00000B0090000000000A000A0000D9F0BE90FEDFFFFFFFFBFDFFFFFDBFDFFFFFFDBFFBFBFBFFF9FFF9FBFDBFF9FFBF0BFB9C09000A0000009000000000A0000A000000D0B00F0A0C0CA00A90AC0A9CA9F00A0000A0000000000000A0C000E000D0BCBC9C0A0000000000000090A00A0BC9FF9BFADBDBFBDFFFFFBFFFFBFFFDFBFFFFFFDFFF9FFFF9FFFDFBFDBF9FDB0DBCF9AC0000900A0000000E00000000C000090A0E0CA00CBA0A0CBC0E90F0CAC0F00000000000000A00000900000090A0A0000A0A009A0900000000000009090DB09AD0BDBFFDFFFFFFBFDFBDFFDBFBFDFBDF9FBF9FFBDBFF9FBFFDBFFDFBAD0F0B0C900900A0009E00090000A09E0A00C000E900A9CAD0C0D0B00AD0AC0A90B0D00000C0000A000000AC0000A00000090CB0BC9090C000000000000000000ACA0DADAF9EFDBFBDBF9FFFFFFFBFBFDFFFBDFFFFFDFF9FFFDBFFDB9FF9EBDFD0D9D09A00A00D00D000090E0009C0C09000A00A00E9CA00A0A0AAC0E00AC9ACAC0EA000A000A000000000000E0000A00E00A00C0BC0A0A0000A00000000009AD0909A0909CB9BEBDFFFFFF9FBDFFDFFFF9FFFFBF9FBF9FFBDBDBDBEFF9F9DA90B0A0AC00D00A000A0000A00000A09A0ACB009000F00A09E0F0D0C9A90AD0AC900F0F0000000000000E000000000C00000000A9ADAAD0090C0000000000000000A0000F0F0BDEDBDAF9FF9FFFFFBFFBDBFFBDBFDFFDE9FDBDAFDAF9F99E9AF9E9C09C9090A90D0B0000B0C900A00000D000E0E0F00AC9E0000A0A0AC0E00E90ACA00F0000000000000000A0000A0000000009C000D0AC000B000000000000000000F00090F0B9E9F9FF0FFBDBFDF9FFFF9FFEDBF0BF9FBF9FDBF9E9FE9FFD0F09A0000AC90CA00C00000000090D0AD0A000900A0BC0A00E9E0CAD0CA09E00E00BCB0F0000A00000A00000000A0C0A0000A0C000A0AD9A9A00000000000000000009009A0F00DA9BCBD0FBDFEFDBFFF9E9E9F9BC9FD0BD09F0BF0F9F09F09AD00E090A0000A909A0009000A0ACA0A00A0D0A0E9C0C0AD0E9A09A0A0B0F00BCBCBC00EA0000000A0000000000000000000000A0A090F0A0C0000000000000000AD00000AC900FADDE9E9FBDADBDBF9F0F9F9F0BCBCB0BDAFF0FF09E9ADFADBCB0900000D09AD0AC009A0CA90C900C900000AC0000A0BC0A0C0CAC90E0C00AC0000ACB0F00A0000000000A000E000A0000A0900090ADAFC9A000000000000000000A000009EF0900B9B9E90F9BDBCFADBC9ACB9CB0BCBDA909F09DF90DA900090E0000000A000C900000000C9A009A00E900009A0E9E00AC9A0A9ACA90A0E9A0E0F0AC0F000000000000000000000C000000E0000C0090AC9ADACA000000000009009AC00090E0DAC0CA9E9ADACB90F00BF900E9C909E9CBF09FAA0F09CA9F0A9000900090F00A000000090A0C0AC00000E09A0C9000F09AC0F00C0CAD0B0C9A9A0C9A0D00000A0000A00000000A000A000000ADA09ACBDB0C009090000000000AC000090BE909A09A90090F0DB0E909F00CBC90B0F090BC90F0D9F09E09C00D00A0000A0000900000A00A0009090BC000000C0A00E000E0A00ADA9A00E0E0E0C0F0E0DA00000000000CA000A00000000000000000AC90A0E9A9E0AC000000000009000A0C90E0000000F0E90B0C9A9E0C9B09AF0F0F0AD9ADADBE0A009A00B0009C00C90F0000C0A09C90C90A0E000B000B00BC0E900E090DAC00AC0E909A009A0A90AF00A0000A0000000000009E000000A900A09A0E9E9ADE9C90A9000000F00AC0000BFE900000F0009CADABC9CB0BC0E9C0DB00F9A0DB00090D000090CA0000A90E0000A9A0D00000A0C00000000000000B00ACA9ACA00B0E0B00ACAC9EAC9CAC0F00000000000000000000000000000CA9C00CB009E09AFAE9CA0000D000000009000FEC09E00090A9C0D0BE9CB0BC9A9E0CB00C9A0CBCBCA09000E90000BC00B0F009C000000A0900B000BC000000CAC0E90BC009CA0CA9C0AD0A9A00DA0BCB0D0000000000A000A000CA00A000000000A0A90CBE9AE9C9F0B0DA00000000000AC9E9A9000000A000B0AD0DA0F0CBADA9B00DA90D0B09090CA00900009C009AD000F0000B0AD00E0000F000A00A0A900B00E00BCAA0F00E0AD0AC0CBCA0CA00CA0000A000000000000000000000A00A0009C00A090C90BAF0FCA00A00A0000BC09A9FC0A00000C9CBCAD0E9ADADB0D0D0C0B090E0BC0A0E9000000000A0B0E000B000A9C00000000000000000009C0CAC0E09AC009C00F0BC0ACB0B0A9CB00FAF0000000A000000000A0000C0000009CACA9E09CBEB0E9C0F0BDAD00000000000ACBCBC0000B00A00909A9AD09E0DA0A9AD0CA090009C90A000000000D0C09000C9A9CA9AC900A9000A00E009C0A0A090A90E0A0E0BCA0C00E90E0CAC0AC9E00F000000000000A000000000A0000000090009A0000CB0EB0FE0F0FAD00000000090E9E9E9000090F0A0E0C0BE09A0DAD000B0D0E90A0000000000000A009A00DA00CA90C00AC000C000900000A9CBCA0C0E00D0B0C0ADA0E90E09A0DA9CA00F0D00A00000000000000000A000000000A0A0A0C00BCB0F00F09F0F0DA0F0000000009E9E00C00CAC00D090B0C09E0F090ADAC0A0000D00AD00000000090A00DA00900000B09000000A0CA000A000A009E0B0F0A0CA9AC00E90E0BC0F00E09EA00A000000000000000000A0C00000000A0D09C0B0BCA0F00F0AF0E9EBED0A90A00000F0E900A0B0090B0ACA0DA9E0900E0D0090090000000000000090AC0D0DA090CA90AC00CA00A000090009C0F00D0E000C0AC0B00CA9E9CA9AC0A00E90E090FF0000A00000A0000A0000000A0000090ACA9E0C09ADADA00D0BDE9C9AD0C00900000A9EE090CBCAC0C090F0C09E0F090A000B00CB00B0000000000009A0A0000A000C900A0C09000000A0C0A00E0A90ACB0AC9E0E0BCA00AC0CBC9CB0CA9E0E0F00000000000000000000000000000C0900A9A0E090F0F0E0E0B0FACBE9A0C0A000AD0900E9A0090A9E000B0E0900CA9CB0C0CB0000000000000A0000D0D000C000A0A09090AC0E0000D0A09A090CAC9AC09A09C9E00DA0DA9A0AA0CA9CA0DA0D0000000A00000A0000A00A0000A09A00AD0C0900E00DAD09AD0E9CBC9AC90AC00000ACA090D0F0AD009E9C090E0B000000B000000000000000000F0A0A00A9000D09C0E00A900000A00000C0CA0B0A0CA9E0CA0A0BE00F0CAC9C9E9CA0DA00CB00000000000000000000000C0000A00F000B0E0A9AFA9E0AD0E9AF00AC9A09090C0BC9000E0A00DA09E00A00E90C09E000000000000000000000000D0000000A9A0A0900C000B00900A000B0A9C0C0CB0E00B0E90C09E00A90E0A0AA9CA0BCBE0A00000000000000000C000A0009C0000A0C0900C009EDBCA09AD0BC9AC000C0A0000E00009C9E00F09AD0F00090A00000000000000000000A09A00000000C00C0D0CA0A9000C00AC000BC00C0A0B0AC00DAC00E9ACA0CBCAC9E0C9C0AD0E00F0000A000000A0000000A0000000A000BC0B0E0F0A9E00ADADBC0AD0AC9A9E0A0900009E9000A09AC0FE0A009E00000000000000000000000090C0DA000090A09A00A90C00ADA0000000C00A9A0C0CB0ADA00ADA0C0BCB0CA9A00B0A0F0A09E0D000000000000000A0000000000AC0B00090090009009F0AD0E9ADA9CBAC0090CACA00000A0000C09A09C9CA0000000000000000000000A00000000000A00009C00000A900C000BC0B0B0000C00B0A0C0A0CBCA0F0BC0ACBC0CAD0E9CAC9E00BB00000000A00000000A000A000090000C0ACA0E0A0E0E0ADAADADA0DA0D0B0CA000900A000009A09AC9E0A09C0000000000000000000090C0CA09A000C00CA00A09E9C00A9A0AC00000C00A90A0C00E9A0DA009C0AC0AD00A0BC0A0CA90A09E0E000000000000000000000000000E000B0009000D0909ADA9CBCBDA0CB0ACB009000A000C0000C00CBE9C00000A000000000000000000000B09A0C09A090009C0000A0BC0C0909A9E000A0C00CB0E90AD0AD0EA0E90F00AF0E09E9CBCAC9CA9CF0000A00000000A0000000000A0000E0000A0E9A00E0000DA00E0EDA00F00CB0E0AC90C9A0000A0B000A000A000000000000000000000A00000C9A0C9ACA90A09A0D000A9A0E0C0009A0900A00000AC0AC0A90DA0E00E90090E00A00A9A0ACA0D00000000000000000000A00000000000CB0C00C0B00A00A0DA909ADAC00F00C90000A000000009C0F0D000000D000000000000000000C090E9A0C9A0C90CA000C0A0E90C0D00A0000C0E0BC0A0CBC9ACB0CACAC90E09E0E0E9CBCBC0C0F09E0B00000000000000000A000000000A000A000B00B0C09C0B0DAC0FACAD09A00B0A0DA0C0000000000B000A00C00A0000000000000000090B0E90C9A0C900A09C90A90900CB0A0B0CA0E0A9000000A00AC90CB009A0E90E0B0F00A0AC0B0A0CA09E000000000A000000000000000000000000C0AC0A0A000C0A0BA0DA9EE0D00C0CA00000A0000000000F0D0000000000000000000C0BCAD0E9E9AC9A0A009CA0AC00CACB00C0C09009090C0E00AD0CAD0E0ACBCACB0CA9AC00F0F0CB0CBC9AD0EF000000000000000000000A00000000000A00000D000A0000C0DA0F09AF0F0B009ADA00C00A000A0CA0A0F0A000000900000009A0BCB9AD9A9E9AC90C9E000090B0A90CA90B0E0ACACA0A000C00A90A90AD00A90CA9C09ACA000B00E00A0CA00F00000A0000000A000000C0000A0000009000E0A00009CA9A0B0C90FAD0A0ACAF0C000900000000009C0000000000E00C0DAC0E0D000C0A0C00000000A00AD00AC0D0A00CA000090000D000A90AC0E0CADACBCACBCA0AC0BCBCACAD0BC0E90F090000000A0000000A000A0000000000000E900900AC00000C00CBAE0C0ADDF0D00FADA0A000000000A09E0AD0CA0000A0B009A900ADA9A9C9A9C09A0000900A0CB00AC90B0C9ACACB0A00A000000A90BC00A00DA009AD0BC00AC900AC0B00E00E000000000000000000000000000000000000AC0000A0A0A9E9AC9C9AF0A0ADACB0DAC00D000000000000D00A9C900090CA0C00E90000C0A0CA0A0CA900CA0CB000090AC00A009000C000C000CA90E0CB0F0F0A0F0E0AC0A0E90E9E90E0DA09EF0000000000000000000000A00000000A00A000A000000D000E9A0AC00D0F0E9ACA0DADA0AC0CA0000000A0F0A0E0F0E90DA9E90ADADA90DA9C900000E0009000BCAC09AC0DACA00000C000A0000E9AA0E000E900A9C0BC0B0EA0A0E90A0CA00F000A0000000000000A0000000000000000000000000000A0D0E9E9A9E0A009ADADA0DA9C90A0000000A00000D09A0BCADACB0E0D00000E000A0E09CB09E0A0E0009A9E09A0090C0A000B00C090E00C9C0ADA0E0F0E0AC0F0C90D0E00E9E90F0900000000000000000000000000000000000000000000A000A0BC0ADE09CADAC09A0DA0E0A000000AC00C00C0A0E09C09AC90E09A0CBCB090F0090A000E09C090F0AC000AC0AC0A000A000000A000F0A0F0AC90B0C0BC9A00A0E0A90E9A00E00E000000000A000A000000A000000000000000A000000000000000F00BE0B0A0BCAC9ACB0D0F0D0E00000000A9009CA0AC00A0900CB000C0E00C0AD00E0900B0E00D00CA900900090C00C00A0000F0A0DA0C9ACAC0BE0AC0E9CB0F0CB0C0CB0CAF000000000000000000000000000000000A0000000000000000000E909C0F09CB00E90C0A000A09000A9A0900E0000D0A90D00CA00F0A0090A900A0090A0E090F0ACA90C00E00A00A00000C00000C9A0CB0E090AC00D0A90A0C00A0CA9A0CA90F00000A000000000000A000000000000000000000000000000000000ACAF00E00CB00E9AD0E00000E00C00A0000AC9A0D0E0A0A9000090A0000AC0DA00C900E00009000A00000C00000A0000ACA0A0CB00E90EADACA0AD0E9E0AD0F00E0DA0CA900000000000000000000000000000000000000000000000000000A0DA909E09EB0FE9AC0A90E0A009000C00C9000AC00A0BC90C0E00E0D0E9C09A00C0B00F00BC00CA000A000A0000000A0000900DAC0E90E9000B09CACA00BC0A00E90A0DACE000000000000000000000A0000000000000A000000000000000000000E0E9E00C009E0BD0E090C000A0A000A0E0900F09C00E0A90F090A000A00000B00E00000A0A0009C0009000CA000000000E0A09A0CA0CADACACA090DAC9E0CB0CAD0A90FA000000000000000000000000000000000000000000000000000000A00B0E9E9ADA09E0A09ACA90AC9C00B00000E000E0AC909C0000E000A90AC9E00F00BCAC0000B0CA00A0C00A00000000A000D0E00F09E90AD00ADA0E00A00F0CB00AC0E0D000000000000A0000A000000000000000A00000000000000000000000D0090A0CA0DE0F0F0C90CAD0A0BC0CBCB000F00090ACA0A0A000D00C090A00C0000009AC00C0A000000A00000CA0000CA0A09AD0AC0AC0A0F000E90F0DA00A0CBC9A00B000000000000000000000000000000000000000000000000000000000A0A0E9CB0DA090E0F0ADA90AC9CADA000E0F00BC0ACB0D0D0C9A0A0A00AC09A0AC0B0E00A90000000000000000000000090CAC0AC0BC9A9C0A9E90E00A00E9CA00AC9EE0000A000000000000000A00000000000000000000000000000000000000C900AC0A9CAC900BCA0CBC9EB009E9E900AC0AD0000A0A9AC00D0DAD09AC009A0C00900CA000C0A000000A00000000ACB09AC0B0CAC0E0F0C0E00AC9E90A0DAC9A00F00000000A000000000000000000000000000000000000000000000000000A009AD0A09A0E009C0BCA09CF0E000E0D0000ACBC0C0C09ADA0A000A000A0C0B0AC0000000000000A000000000A0000CAC0BC0A09A0900A900F09A00E0DA00AC0F0D000000000000000000000000000000000A00000000000000000000000A000C0AC0ADAC0F09E0A9E0DACA009ADA9A0ADA0090A9A9A0C000C000AC0F00DA0C000A000000A00000000000A00000000A90AC0F0DAC0E0E9E0E0CAC0F00A0CBC9A00B00000000000000000A00000000000000000000000000000000000000000000000BC009A00E009E90A0B0ADAC000CBC00DACA0C00C0A0A00B0E90000A00000900CA0000000000000000000000A9E0CAD0B00A00F0B000A90A90B00F0CB00AC0EE00000000000000000000A00000000000000A000000000000000000000000A00000B0E00CB0BCA0E09C0D0009ADA00BCA000C900A0000D0000000A0000000ACA0000A0000000A000A0000A000000B000AC0E0DA00CACBC0E0E0CAC0A0CAC0A90F000000000000A0000000000000000000000000000000000000000000000000A000090E9AC00BC09E0A0AE90C00090090F00A0E0DA09000AC00C000000CA0000000000000A0000000000000000000E9C0B09A0CB0AD00A0900B00BC9A09AD0E0D00000000000000000000000000000000000000000000000000000000000000000C0AE9C00AC00A000D0D00A0A00E0E0E00F0000000E000000A0000E0000000000000000000000000000000000E0E9A0AC0E0DA0C0A0E9CACAC0E00AC0E00A00B000000000000000000000000000000000A000000000000000000000000000000A00D00A00900B0D0B0A000C90C000900000000A00000A000000000000000000A000000000000C0000000000A00900CAD0A09A0C0B0D00A0B00B00BC0B00AD0FE0000000A00000000A0000000000000000000000000000000000000000000000000A0F009ACA0C0AC0C000A0000B0000ADA000000CA00000000000000000A00000000A000000A00A000A0000000ACA90AC9E0CA9AC0A0E9C0F0CAC0A0CAD0A00F000A0000000000000000A0000000000000000000000000000000000000000000000000E000000000A00A0000A0000E0000CA00000000000A000A0000000000000000000000000000000000000C09CAC9A00B0CA09E090A000A09AC9A00AC9E0D000000000000000000000000000000000000000000000000000000000000000000000A000000A000000000000C000000A0000000000000000000000A000000000000000A0000000000000A000A00A0A0C9E0CAD0E0CAC0F0E9CAC0AC9E00A00A00000000000000000000000000000000000A000000000000000000000000000000000000000000000000000A00A00000C0000000A00000000000000000000000000000000000000000000000090E9C9C0A00B00A00B09A000A00A9C0A09AC9EF00000000000000000000000000000000A000000000000000000000000000000000000000A0000000000000000000A00A00000A00000A000000000000000000A000A00000000A0000000000000E00A0A9E9E0CAC0F0CAC0CAC9E9CA0BCAC0A00F000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000A0000000A00000000000000000000A000000000F0C0A000B09A00A90A909A000A0C009AC9E0D000000000000000A0000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000A00000000000000000A000A9ACACAC0E0DAC0E0E0E0E0E9E9ACA0A000A00000000000000000A0000000000000000A000000000000000000000000000000000000000000000000A000000000000000000000000000000000000A0000000000000000000000000000000009E0C09090A090A09A090009090000000D0C9EF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000A000000000000000000A0000E009ACACAD0E0E0E0CACADACACACBCADA0A0A0F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000A00000000000000000000000000000000000000000000A000A000000000000E0090A00A90090A090000A00000A00CBC0D0D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000A0000A000A00000000A000000000000000000000000009A00E0E9CAC0E0E0DACACAD0DADAC0DA000A0AA000000000000000000A00000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000A0000000000000000000AC0DA9000A09A0900A000B000A00090A00CA9C0F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0CADAC9E0CACAD0CBC0CAC0E0E0E0E0BCA0AF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090A000A000B000A000A090B090900090000D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ACADACBCADACADACBCADACACACACADACADACA0F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010500000000000020AD05FE','Margaret holds a BA in English literature from Concordia College (1958) and an MA from the American Institute of Culinary Arts (1966). She was assigned to the London office temporarily from July through November 1992.',2,'http://accweb/emmployees/peacock.bmp'); + +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(5,'Buchanan','Steven','Sales Manager','Mr.','03/04/1955','10/17/1993','14 Garrett Hill','London',NULL,'SW1 8JR','UK','(71) 555-4848','3453',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C00000000000000A0000000000000000000000E900000000C9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D000C000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000A90000000000000000000000CA0000000E900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000C00000000C00000000000000090000000000000000C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000A000000000000000000000CA00000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C00000000000000000000000000000000909000000000000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090000000000000000CA0000C000000000000000000C000000E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000C90000000000000000CA9000000E90900000000000000D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000AC0000000000009000000A0000E0E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000900CA0000000000000000B00E900CB0900000000C00000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C000000E000000000000000000CA00F0000DA00000000000000000CACA90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009CA0000000000000000C0000000A90CA9C9090000009000C0C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0000C0B0000000000CA000E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000CA09009000000000000E9000000000000000000000000000000000000000000000000000009A0000000000000000000000000000000000000000000000000000000000000000000000000000000000C0000C90000000000000000000000000C000DA09000000000000C9CE0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C000000000000C0CA00000000CB0D000000000000000EA9000000000000000000000000000000000000000000000000000A0B000000000000000000000000000000000000000000000000000000000000000000000000000B00000000000A000000000C0000C0000C0D00C0F09CB0B09000000000000DE0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D0000000000000CA9E9F0B0F0B9CBCB0D0000000000000000CF0000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000C00000000000000000000000CB9C0D0A9C9ADCB9AD0B090000000000000EFA9000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000C0A90000000000A00000000E0DE90CB9AD9CB0DB0F0DBC900000000000000000C000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000000000090000B0000000000000C0000000C9CA90F9AD0DA9AD9AD90F00BCB09000000000000C00000000000000000000000000000000000000000000000000000A9A0000000000B000A00000000000000000000000000000000000000000000000000000000000000000000000009000E0F0BDCB0F9A9A9C90BC9AD0F9C909000000000000000E000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000C0C90DAD0B0D0C9C9CBCBC9A9CB9CB0E900000000000000E0900000000000000000000000000000000000000000000000000B00B00000000A000900A00000000000000000000000000000000000000000000000000E00000000000000000000A0B0E9A9AD0F0B9A9A90909ADF99CBC99CA900000000000C0C0000000000000000000000000000000000000000000000000B00A0000000000000A0000B0000000000000000000000000000000000000000000000A000900000000C0000000000C0CB0D0D9A99C0D0D9E9E9C900FCBDBE99C09000000000000A0000000000000000000000000000000000000000000000090C00900000000000090000C000000A0000000000000000000000000000000000000000C0900000000000000C0000C09090DA9AC9CA9B0B009090B0F90BC0D9E9B00000000000000D0000000000000000000000000000000000000000009A900A0090A0000000000A0A00000A000000000000000000000000000000000000000000000000E0E000000000000000C000ADADA90DB9A9D0C90F9E0F0D90F0DBFADAC9000000000000CA000000000000000000000000000000000000000900000000DA0000000A0A0B0090000000000A0000E90000000000000000000000000000000000ACB000900000000000C0000AD090090DA9C0D00B9E900990B0E90DBC0DBDBC90000000000DAD000000000000000000000000000000000000C0A000000CB0090000C0F090000A000000A900009A000A900000000000000000000000000000000C90000000000000000000CA9000ADADA9CB9A9BC0090B00E90D9EBC9F9EDADB0900000000CACA0000000000000000000000000000000090A0B0000B0DA000A000ECBA00A0A009000000000A0000000C0000000000000000000000000000000000000000A0000000000000000090D09090B0C9009A90C0D090F0A9C9ACB9ADBCF000000000000D00000000000000000000000000A0B0CB0C000090000000090D00FF0C9E9090A00000000000000000CB00000900000000000000000000000000CB000000C900000000000090CBCB0BCBC9C9B00F0D00B909AD009C9BC9FCDBE9B0900000000EDA00000000000000000000000ADAC90090009000ACB000090E00A00EBEA0ACA9000000A00A009A00000E90000EB000000000000000000000000000000000000000000900E0090009C909A9A00C909A9D00AD009F0BC0ADA9BC9FCB000000000000000000000000000000000EFDFBDADA00A009A9000009A009A90000C9EF9ACA0000A90090000000000ACB0000F000000000000000000000000CA0000000000000E000E9000A9F0B0F00D09DA9AC900A9D0A9E00D0BD9ADE9FE9FC9000000000C0000000000000000009EFFFFEBCB0090090A0009009A000000C0000AEF0E090000A000A000A0000000CB00000CB0000000000000000000000009000000000000009E0000909C09C909A09CA9C900F90CA9C099F0F00ED09E0DBCBB00000000CA000000000000000CEFEFFFFFBDF0DA0000090C0A0000090E09A00000DEBC9A00B0000A90A000000000FE90000A90000000000000000000000000000000000900000090F0BCB0B0B09AD9A09090B900A99090F0009AD9A9E9F9EDE90000000CA90000000000000CFFFFFFFEFDEFA0B090E9000B0090A9000900090000A0EB00A009A9000009000000000FF00000E0000000000000000000000CA000000000A09A9E00000D0909C90BC900C9ADA9CAD09000F90E9F0DA0DAD0FADBDE90000000C000000000000CEFFFFFFFFFFBF9FD00A900A0000000C00A0009E00000000000DAE000A0A9A000000000ECBC90000B00000000000000000000090900000000C0C0000F09B0B0DA09C0B09A900900900BC9F0009000B0DA9DAD0F0E9F0000000000000000000CFFFFFFFFFFFFFFEF0BC9000090900F09000900A09000900000A0E09ACA090000000000000FFB00000CB0000000000000000000E0E0000000009A0000909E909C909A900D090F90E9A09090090BC990C9A9CBCBCDBFDA90000000E000000CFEFFFFFFFFFFFFEFFFF9FA9A09A9C0A0000A090009C0A0000A09A00FA9AC90B0A00000000000EFE9A0000A00A0000000000000000C0900000000000090ADA9E90DA9A9C90F90AC900090C909A09AD000E09E9CBCBCB0EDADB000000C0000CFFFFFFFEFFFFFFFFFFFEDFAC0D09000000900900A0CA000D000000000000CFFEAC00900000000000FFF9000009000A00000000000000ADA9000000000E000909099A909090A90A99B00B009000C09C009A90900F0F09EDF9EDFC000000000EFFFFFFFFFFFFFFFFEFFFFFBFDBB0A00000B000A00900090B0A0A0000A00000ACADB0A0A0000900000C0FFEB0000A0000000000000000000C0E000000000900DA9CBC9C9AC9A90C90C0090090A90B09A90BC0090F0090F09A0F9A9B000000E0CFFFFFFFFFFFFEFFFFFFFFFFFEBC9D00DA90000900A009000009000A0090000000F0E09000000A000000FEFF900B00000000000000000000CA9000000000000B909B09A90990C90B09A90F090C900000000009AC009E0F0FCFDADFCF900000D0FFFFFFFFFFFFFFFFFFFFFEFDF9FFA0B0000090F009C9000A0D0E000900A00000A000A9A000000000000CEFFE9A00000A900000000000000CB00000000000ACBD0F0C9099A90A900900900000A900090900900000ADA090D0B9A9E9E900000CAEFFFFFFFFFFFEFFFFFFFFFFFEBEF00D09A09A000000000A0900A900A00009000900A00000000090000000FFDB00000000A0000000000000000F0000000000990B99B90BC0DAC90B0C0BC909090009000000090909000D0E9EDEDE9E9F000000CFFFFFFFFFFFFFFFFFFFFFFFFFFDBF9A000000900090A00900090000000A0A00000090000C0000E0900000E0B000A09A0D0B0000000000000AC0F00000000CADBCBC0BC99A0990009A90909A009000090090000000000A90B00B0FCBCFB0000CFFFFFFFFFFFFFFFFFFFFFFFFFFFADAD0B0909CA09A09090000A09E0090A0900000A0A00000A90000A00000B000B0000000A00000000000000DE900000000C9B90999909A090A09090900A0009000900000000000009000C0C9EDE9F0F090000EFFFFFFFFFFFFFFFFFFFFFFFEFBFFFB0B00CA0009000000A0DA9C0090A00000A9A00000000A9000B000000000000000000000000000000000CE9A0000000E9BD0F9A0E9AD90D090BC0009090900900000000000000000909A9AD09AE9E9E900CFFFFFFFFFFFFFFFEFFFFFFFFFFEDB9CBC90090900009A009000000B000090A0C00000B000000A000D09A00A00A0000EB00A0EB00000000000CBC09C000099F09B9C99909009A900090B000000000000000000000000000000C0A0FD9E9E9000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFA900B000A90B0009009000B0C00A0A009A9A90000A00000000A00000900000CAF0B00CFFF9000000000ACBE000000E99F9CB9E9A909A900F09A0090900090000090000000000000000000DA0AD0F9E90CEFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDBCB000900000C900E00A9000B0090000A00000A0090009A0E909A0B00A090EBE90000FFFFB00000000C0F0900000F9BF9B99090D0B0D0990900900000000009000000000000000000900900D0AD0EDA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADB009A00C9A90A0909000C09000A090A00000009A0000E0F9ACA00000000A0090000EFFFFFF00000000FE9E0009DB9E9DADADA9A9C90B0000090090090900000000000000000000000000C00BC9E9B0DEFFFFFFFFFFFFFFFEFFFFFFFFFFEFBEBF0CB0090B000009A000000BC00000A09090A00A0C0A000F0ECBDADA0A9000B000A0CFFFFFFFFB00000E0F00900CAFDBDB99909C909A90090B0000000000000000000000000000000000009AC00E9ECFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC9B0C0000000090000090B000B00B000A0A000000A9000000B0CA009000A0000A000FFFFFFFFFFFF9000C0FA0009F9F9BCBDA9A90B090DB000909090000009009000000000000000000000009C09A909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBE9B909A9009A0B0090A0090000000B000000009000E900A000A9E0AC0A09A09000EFFFFFFFFFFFFF000AF09000F9FBF9B9A9D090D00B000900000A0909090000000000009090000000000000A9C0DACCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCBC00A000A9000C0B00900CA09000A000A90000A0A00A00C90A9CA900B00000000FFFFFFFFFFFFFFFB00C90000FFFBD9F09D9A90B0B9090900900909A00000000000090000000000900000E090C0B00FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBD0B09090D009090C0000A090A0A09009000A00000B0DA00AC00ADEFA09E0B00EFFFFFFFFFFFFFFFFF90CA000CF9F9FB9F0BC9AD09C0090A900900000909000900090009009A90900A90090C00B0CAD0CFFFFFFFFFFFFFFFFFEFFFFFFFFFFFBFBA90000A000A00A009A090009009E00A00A90090000A00000B00000EDF0000EFFFFFFFFFFFFFFFFFFFFB0D0009FFFBDBDBD9B090B09B009009A090900000090090009C0090000DA90009009A9C09000B0CFFFFFFFFFFFFFFFFFFFFFFFFFFEFDEDADBCB090B0909090090090A000A90B00A000A00A0009A9000CA9A90AA0FFFFFFFFFFFFFFFFFFFFFFFFF9A000EFBFDBDB09AD9E909009009000900009090B00900DA09090D090000909C9C09CA9E9AD0DAFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBDA090C000000A00A000A0009009CA00009A0D0000B0ACA000A9C00AC9CBEFFFFFFEFFFFFFFFFFFFFFFFBC090FFFDBBCBDBD0A9090090A90909009090A09009009009A909A9E9099AD0B0A9CA9C00C00ADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBC9A00B090B090909090C900A9A09E09A0000A900C009C0000E0BC9A0ACBDFFFFBFFFFFFFFFFFFFFFFFFBC00FFFBFDB909A9909ACB0C90A00090A00909E990A9A90C90BC9090B0C9090D9E09CBCB0BC90DFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB0B009000A000CA000A000A09009E09E00A0A9C0B00A0A0B0009E0A0D0F0AEBEFBCFFFFFFFFFFFFFFFFA90B0CFFFF9BDFBD9E9909009009090BC9090F090AD90D09B9AD0BCBD0DB0DB0F0B9FE9CBCD0BCA0FFFFFFFFFFFFFFFEFFFFFFFFFFFBEFF09A090909C909009009000000C90E9A90900A9C0B0900000A00F0DA000D00CB0EFFFFFFFFFFF9FA90000C0BFFDBFDB9CB090E90090A9090000909A90F990ADA9E9C99F9BD0B0C9B0D0FDE9DEBDA9AC90DEFFFFFFFFFFFFFFFFFFFFFFFFFAFDB0DA90A0000A000A9000A090A9090A9A000A00D0A90C0A09A000E0EA9CBFABCB0B09E9CAD0A900A00000000BCFFBFDBBDB99E990B9090900F909A0F0DB09CBD99C90BDA90D0BD09B0DBF9CBDEBDECBC9ADA0FFFFFFFFFFFFFFFFFFFFFFFFFFDBADB0C0909A909A9000090000000A9C0C9A00A0A09E9A90A0090900D0A0C0DEB0C00A00B0A900000090009000CFFFDBFDA9E990A900A9000900F0990B9CBCB9ADA9BD09DBDBD9ADBCB0D0FBCFFDADBCBC90DACFFFFFFFFFFFFFFFFFFFFFFFFFBFDA009A00C000000D09A009A9090CA90AC909090E00C0E9000A0A00AFCB0E0F9A0FFCB00000A9A90000CFA900CFFBFBDBDB90E9090D0090B09009E0D0A99BC99AD90BDA9090BC90D9D9AD0D0F0FDADF0BCB09ACFFFFFFFFFFFEFFFFFFFFFFFFFAFDB00909A90B0900A0090000E00090A90A0A00090B0B00B0A0000AD09E09A00CFFFFFFBCB0000CA9ACB900000FFFFDFBDBCB99C0B090A9C90B9A99A9DBC9B9E9B0F9B9DBDBDBDB9A9E99F9F9FFADF0FDADAD09EFFFFFFFFFFFFFFFFFFFFFFEDF9ADA90A000000A090900A0909009E0D0A09000A0E09C0F0C909A000AFE9AC90FFFFFFFFFFFFFFB9D0DA000000FFBDBBDB09900A909090900B0C9DA9DB09F9C909D90D9A9ADBC9BC9F99E9E9EDADF0FF0BC909E9FFFFFFFFFFFFFFFFFFFFFFFBFAD0900090090909000A0D00A00B090A0D0A0A9009CA9A00B0E009A9C0BE90A0CBEFFFFFFFFFFFFF0BEF90000CFFFFFDB9DBCB09090A090A9C99B0DB09F090B9F9ADB9F9D909B0D9F9EF9F9F9F9E9FE9EDB0F09ACFFFFFFFFFFFFFFFFFFFFFFF9F0B0AD0A9A0A0000B09009090900E900AD0000A0A0D090C0B0F00CA0C0FEFDA009ADAFFFFFFFADA0CFFF90000FBF9FBDA909090DA99C0990B0F0B09F0BDBD090F990F9A9F90DB0B0D9EBD0FCBCBD0DF9EDB9E0D9AFFFFFFFFFFFFFFFFFFFFBFE9F0D00900909C9A000000A00E00090E900A9E00C0B0A0CA9C00BCBCBFFFFFFFFBC00000CB0BC9A9CFFFF00000FFFFFDBDBCB0F009009B0C90909DBC990909BDB9ADB90D909F00D0DA9990F99F9DAFF0F90FC9F0ACDFFFFFFFFEFFFFFFFFFFFFBF0B0B00090000A09C9A9090909A9E090A0D009A0B0C90A9CA9FCBCBFFEFFFFFFFFFFFFEBCFE9E9EBFFDA9000CFFBDB9A9090900B90B000B0F0BCB0B9E9A9F0B09D99C9A90900900B0D9EDBDE9FCBD0FD0F09B00D9EFFFFFFFFFFFFFFFFFFFF0F0BC900A9A0A90900A0000AC0A09090AD09A9A0D0C9A0BCA0DA09EFDEFFFFFFFFFFFFFFFFFFFFFFBCFFBDA0000FFFBFD90F0B0090C9090909099909D099D09D9DB0B0B900F009A90D0B09BC9BCBBCBF9AF0FADADA09EFFFFFFFFFFFFFFFFFFFFFF90A090009C0A09090909090D00CA900AC00DA0B0C9C09CB0DAC9AFFFFFFFFFFFFFFFFFFFFFBDFF9CFFF99000FFDFBBC909090090A9CB0DA9E9ADA9BCB0B0B909D9D0D9009000C9A9C9E9BCBDDBD0FCDBD09090DA9CFFFFFFFFFFFFFFFFFFFFBDE9DA09C0090900A000A000A0B0A90E909A900D09A0B0F00FADAFCFEFFFFFFFFFFFFFFFFFFFFFF9EBFFF0000CFBFBDB9A90F09A090900909090D90D099D9D9CB9A909A0900090900CB090DBDAF0FF9FADA9E9E9BCF09EFFFFFFFFFFFFFFFFF9EB9A009A0B0A00A9090909A090009C090A0C0E9A0E0D0E00F0D0F0FFFFFFFFFFFFFFFFFFFFFFFFEBDFFF0B0000FFDFB9C0DA9090DB09A90B909A9A9A9E9A9A9B9C99A9090909000009090DADAD9FF9F0DB9E9C9AC90BCFFFFFFFFFFFFFFFFFFFF9E909009000909000A00C0900F00BCA0D0B090C909A090F00FADEFFFFFFFFFFFFFFFFFFFFFFFBDF9ACB90000CFFF9F09B09090B000090D0A00D09C9999D99C09BD09C90000C9090900F0BC9DFFD9E9FF9E90B0D9E9CBCFFFFFFFFFFFFFFFFBF0B0F00B000900A0DA909A900E90900900A9C0A0B0E0DACB0F00F0FEFFFFFFFFFFFFFFFFFFFFFDFFEFBDEF90000FFBF9F09BCB0D099BC0B090D0A90B0E0B0DB99C90B090B9090A9090F90D0FA90FAFDF9AD9E9CB0A9E9CBEFFFFFFFFFFFFFFFFFFF90B009E0A90D00000000B000A09E0AD00A9C9C090A09C00F09EFFFFFFFFFFFFFFFFFFFFFFFFADBD0B090000EFFFDA9BC9999A9A00990909090909999D9B090B9F9DB900D099CBDA90F9F9DFF9FDBDEDB090B0D9E9EBD0FFFFFFFFFFFFFFFFFBDAF00900900A00B09A090009AD0000909E90A09ACBC9CB0F0FEFFFFFFFFFFFFFFFFFFFFFFFFFF9E9E9C00000DFB9B99C90F0AD90D09A09A09A9E9E90F0B0D9BC909A9CBDB9BCB90DBDF9E9FBCFDBCBB90BCBCB0E9CBD0FFFFFFFFFFFFFFFFFBCF900BCA90A900900009A009E000E90CA000C9AC900B0A0F00F9EFFFFFFFFFFFFFFFFFFFFFFFFFFBDA09A0000EFFF9CA9A90990090900D009C90909A999D9BC9BDBD9F9909C99C9F9CB0DBDEDBF0FF9DAD09F0C99BCADADEFFFFFFFFFFFFFFFFBA9E9090090090A90B0009A009A990B09C9A0C90E9C0D090F00EDFFFFFFFFFFFFFFFFFFFFFFFFFFCBDB009000DFBDBBD99F9E9B090B90B09A90B0909CA9B09BD099A99E9DB9DA9F0F9DBEDBDFDFF9FE990F09F9EADBCBCB9FFFFFFFFFFFFFFFFFDA9A0090A9CA900C09A009000C00E000A009A0A90A9A0F00F0FBEFFFFFFFFFFFFFFFFFFFFFFFFBFF0F090000EFF90DA9E9099C90B0C9090909D0BC9B9D0DBCBDBD9DB99A9CB9D090DAD9FCFADE9F99DA90DADA9DADBDBCFEFFFFFFFFFFFFFFF0F9C90B0A9009009A9009C0A9A900909AD0F00C90E9C0F00F0FDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF900000CFF9ADBD990BDA9B0D09B09E90B0090B0909A99909BCB900909000090909CADF9F9F0BCA9DA9BDBDADACBCB0FFFFFFFFFFFFFFF9FB0B0BC0900B00B000090A09C00B0AC000000B0E900B00E90F0EFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDE900000FFBDA9ADAD9AD09B0B00909AD09B0909CB99DADBC9909090000990000000909C000D0990090DA9CBC9FDBCF09EFFFFFFFFFFFFFEDAD00900F00B0CB090A09000BC0D09ADA9AC090E9C0F09E00F9EFFFFFFFFFFFFFFFFFFFFFFFFFFFEBFF90000FFBDF9DB9AD9BD0D09BCB090B0D000DB00F099009000000909C0AD0BC909C0A909000009A0F9FA99F0F0F9F0F9EFFFFFFFFFFFFBF9A9A0B009009000A90009A90B00A00000C9AC090A900E99F0EFFFFFFFFFFFFFFFFFFFFFFFFFFFF99E9A090CFBCB9FB0D9BC9A9B9C990DA99DA9B900990900090090D09C9C999909009A99C9E9A900000D009D0F0F0F9E9F0FDFFFFFFFFFFFBF9E9C0900B009A9090C0B000C00009C90F09A00B0E9C0F09E0EFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EF0909000F9DBDA9DBBC9B9D0A9A09A9C9A900009000000909B0B0909A9B0F0F9F9FD9E9BDAD0B090DB0BF0F0F9F9EDBCFFFFFFFFFFFFFFFCB090B0A900B000A09A90CB0B09E0A0A00000D0C900A90BC0F9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BE90B900AFF9F9BC99BD0B9D09BC99A9909909000909BCB09D9BDBD9D0909909E9AF9FCBDB0D0DAD09C9B9DADADFADBCFDFFFFFFFFFFFBFBDA90D00B0CA90D000090000A09D09C9A9E0A9A0F0C0E0B0E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD99FD099C9BCBDADBDADBD0B99E99E99E90000000009C990F0BC909A9A9E90E909D9CF9F0FDB0A90BF09EDAF9FDADF0F9FFFFFFFFFFFFFFADADA0A90C9090A09A90A9090DA00A000C00900C900B09C0F0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9B9B909FDBDBDB0BF9B0BC0B90B90B9090D0A909E0B0F99999B9C90D090900BCBCBDADFCB0D9DED09E9BD9E9EDBEDBCBDFFFFFFFFFFFFDBB09C90A9A9A909A00A90AC009009C9A90B0CA9A0F0CE9E9ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDBD09CFBDBDADBD9FCBD9BD0F90F9090A909C00990D09AD0AD0B09000009D09CBDADBCB9E9ACB9B099EDAF9F9EDBCBDBFFFFFFFFFFFBFBC9A9A0900000A0900D0009A9AC00A0CA0C0900D009A9A0DE9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBDB99B0BDB9EBDBDBE9B09A9A99E909CB090909A9009A9090D909090090900ADADAD9ECBDE9D9BD0C9EF9BD0DAFDBEDE9FFDFFFFFFFFFFCBAD009B0A9E90D009A009A00009F090909A0ADA0BC0D0DA0ADFEFFFFFFFFFFFFFFFFFFFFFFFFFFBFB9F9F999FFFBDB9E9F9F9F9D0DA99B9B9090DA90909AD0BDA909E99A90000909090DADBDA9DA0FCB90990F0FBFD0BCBF9E9FFFFFFFFFFFFBDBAB00C9C090A0BC090A0909CA000E0AC00D000D09A0A0D0F0EFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DB9F9F9CFBDFBDA9F0F9F0B0B99F0D09090009C909E9090990B0900D0909000C9E9AD0DADF0D9090090F99F9C9EFDFD0FDFF9FFFFFFFFFFFF0D09B0A9A0B0900B009C0A0A900A90909A00E9A0E0D0F0F0FBDFFFFFFFFFFFFFFFFFFFFFFFFFFBDB9F9FB9FBDFBDBDF9F9FBD9F9CB09B9F9A0900B0A9090B0DAD0990B0090090DB090DCBCBD0B9CA90BCB9CFADBFBDADAFF0F9FEFFFFFFFFB0B9A9E009009C00A900B00A9C9009C00CA0D0900D09A0F00F0DEFFFFFFFFFFFFFFFFFFFFFFFFFF9DBDBDB9DBDFFBDBCB9BDAF9A90B99F0D0909909009D0909C9090900D0900C90000D0F0BDAD0BCA990C90C9B9DBCD0FDBDADFB0DFFFFFFFFFFFCBD09CB0BCA9A90A9C0090000F0A90B090A0E9A0E0D00F0BE0FEFFFFFFFFFFFFFFFFFFFFFFFFBA9F9FBDB9BDFBFF9F9F0F9DF9F9CB09B9B0900F0900009E09A90B0DB0909A909090A90DCBDADD9DA9909B9C9E9FBFDBEFFDBCFF0DFFFFFFFFFBF0BA0900090090D0A900A90B000000C0AC9090C909ACB0C0DADBFFFFFFFFFFFFFFFFFFFFFFFF9D990D9BDBDFFFDBF9F0F9FB9F9B99F90D0DB99090090B0990D09090090909090909D0F0BD0DB0B09CA90D0B9DBCDFBCF9CBEF909FFFFFFFFFBFDBC90A9E9A0B0A0900A900C00B00F0A90900E0B00E090E9FADEFFFFFFFFFFFFFFFFFFFFFFFF9B0B0FBBF99BFFFBF9E9F9FB0F9AD9E9F99B90CA9009009C90B09F9099090D090BD0F0F99C0FF0F9D099C90BCDADFBEDF9FBFD9FBDEFFFFFFFFFCBA09AD0900D0C09A09000A90BC900900ACB0900F09CAD0A0DADEFFFFFFFFFFFFFFFFFFFFFFFF9909DBD9BFFFFFF9F9F9FBDF9F9BDB99AD0B9990990B009A9C900090009A9B9D0B99D9EDB9099090B009A9D9BDBFDF9FFCF0FADF9DFFFFFFFFFBD9F00B0A9B0B0B09CA9090000009A09C900CAD009E09AD0F0FAFFFFFFFFFFFFFFFFFFFFFFFFB90909FBD90DFFFFF9F9F0DBFF9F0BDAD9B9C9A9D009090009099909099C90DA9D9E9ADBFDAD0F9E90900DA9E9FD9FFF0FF9FDB0FBFFFFFFFFBFBEB0B009C000090CA900E090F0B00C90A0CB090ADA09E0ADAD0DEFFFFFFFFFFFFFFFFFFFFFFF90DBDB9090DBFFF9FF0F9FBDB9FBDB9F9BD9B9D9A9B0909090B000B0DADB9F9DB0F9FFDFDFDFB909090F909D9F0FFF9FDF9EDADFF9CFFFFFFFFFF9BC9CB0B0F0B0B0909090A000000B0E90B00AC9009E90DA9EBEFFFFFFFFFFFFFFFFFFFFFFFB9DB909090B0FFFFFF9FDBFDBDFF9F9F9BDB0D9A999C90C909090DB9DB9BDBDBB9DBDBDBFFFFBD0DA90990DF0BDFFFDFFFBEDBF9F9DBFFFFFFFFF9BCA9A900909C0000A0A000909AD0009C009C90E0F00ADA0DBCFFFFFFFFFFFFFFFFFFFFFFFF90999909090DFFFFFBF9BDFBFF99F9F9BD0DBBD9F0909990B000909DBD9F9DB9DFBDBDFFDFFFDFB990DACBB9FDBDFFFDFDFDBDE9EFBDFFFFFFFFBFEB9000E9A0A0B0F09090B0CA0009E00A9A0A090009E90DAE0F0FFFFFFFFFFFFFFFFFFFFFFFB9CBCB090909FFFFFDFFFBDF9FFBDF9F9BB9D9B09DBDA9A909D909A99BD9FBDB99DBDBDFFFDFFF90DA999D0DADFFDFFFBFFBDBDB9FD0FFFFFFFFE9BCBDB9009C900900AC000909CB000909C9C9CA0F0E09EAD0F0FFFFFFFFFFFFFFFFFFFFFFFF99B99990909FFFFFFBF9FDBFF9FDBFDB9DDBBD9F9A999D09D0A09C9DBD0BD9F9F9BDBDBDFFFFDBDA99CBCBDBDBFDFFFFFDEDFEF0DFB9FFFFFFFFBFF9A00CB9A9A9E0A9090B00A000009AC0A0A0B0D0009E090F0FFEFFFFFFFFFFFFFFFFFFFFFB9C9DB90090F9FFFFFFDFFBDF9F9BF9BDF9B9D9B9D9BC9A99A999B09A9B9DBF9F9BDADFDFFDBDBD090DB9F9F9FDFFFFFDFFBFDB9DBF9CFFFFFFFFFF0BC90B00000090909A00009090BAC0B09C90C0A90F00F0F0F0FFFFFFFFFFFFFFFFFFFFFFF999FB909900DBDFFFFFBDBDBFFBFF9FDB9F9F9BD9AD9B99C9090D099D0DB9C9F9F99DB9FFFFFEDBDBF0FDBDBCFFDFDFFFDFDBFDEBDFB9DFFFFFFFF9F09AD0ADA9E9A0A0C009E000E00909C0A00B009E00F00F0F0FEFFFFFFFFFFFFFFFFFFFFFBF909DBD0990FBFFFFFFFFFFF9F9FDB9FDB9F9F9BD9BD9E9B9DB9A9CB9B9CB9F9F9F9BDFDFDFDBDAD9DB9F0FDBDFBFFDFBFFFDAF9E9FFBCFFFFFFBFFAF09A90090009C90A90090B00900A00909AC0F090F09ECA9E9FFFFFFFFFFFFFFFFFFFFFFF999FB909009CBDFFFFFFFFF9FF9FBDF9BDF9F9BD9BD9A99C9A9D99B9C9DB9DBDB9DBDB9FFFBFFFDBEBDEDBDBDBDFDFFFDFDFFFDF9FF999FFFFFFFF0F9CB00F9A9A90A0090A000009A00D0BCAC00900CA00E0B9E9EFEFFFFFFFFFFFFFFFFFFFFB9ADBD9B9090FFFFFFFFF9F9FF9FF9F9BDB9B9BD9F90B9DB9B9DA9E9DBDB9FBDB9FB99DFDFDFDFDBF9DF9BDBDFDFFFFBDFFFBD9F0FFFB0FDFFFFFFBFB0B0E9000C90A90B0009009A0000A00090B0ACB0DAD0D0E0F0FFFFFFFFFFFFFFFFFFFFFF9D99FBD9A9090FFFFFFFFFFFDBDB9F9BD9BDDBDBB0DBDB9D0DA99990B9BD9C99FD9DBFBDFFFFFFFFDFF9FCBDE9FBDBDFFDFDFFEBFDFFD99FFFFFFFFF0F0900B0B0A9C0000000A009C9090DA000C9090A09A9ADAD0FCFFFFFFFFFFFFFFFFFFFFFB90F9FB9D09009BFFFFFFFFBFFFDB9FDBDB9BD9D9B999CB9B9DBCBD9D9CBB9FB9BF9D9F9FDBDFFF9FDADBF9F9F0DFFF9FFFBDBD9EFFFBDADFFFFFFF9F0F0B9C00900B0F00B0900C00A00A00D0B00CAC9CAC0DA9ADAFFFFFFFFFFFFFFFFFFFFFF9999DBDB9B909CFFFFFFFFFFDB9BDF9BE9DBDB9B9DBDB99D09B0990B0B9D9F9DBD9BBD9FDFFFF9FFFBDBD9F9BDBF9F9FF9FFEFFFDFFFF99FFFFFFF0FBA90C0B0F0A900009000090A9000D090AC0B0090A90FA9EDADEFFFFFFFFFFFFFFFFFFFF99E9FBFBD9909A9FFFFFFFFFDBFFDB9BD99B999F0DB099BCB9F99F9F9D9F9BD9BDBF9D9F9FFFDFFDDADBDFAD0F0F9FDFFDFFDFDADAFFF99EDFFFFFFFF09CB0B09009C90B000000A000000A0E9090CB0AD0CB00D0ADEFFFFFFFFFFFFFFFFFFFFFB9999DBDBF9F99C9FFFFFFFFFFF9BDBDBDBDBDB9B99DAD99D90F09090B99F0BBDBD9F9BDFFDFBDBFBDBF09DBD9F9CBE9FFFFFBFFFF9FFF09FFFFFFFBDFA90900CB0A0A0000A09000909090900CA900D0A9ACBCAF0B0FFFFFFFFFFFFFFFFFFFFFF99E99FBDBF9BF9FFFFFFFFFBDFF9F9BDB99DAD9DB999A9B0B99F9BDBDAD9D9DA9F9BD9BDFFDFFDEDBD9F0B0A90FBDFF9FDFDFDBDFFF9F909FFFFFFFADAB0E9A00D09090900000900CA00C0B0B00A9A9C0C9CBC0FCFEFFFFFFFFFFFFFFFFFFFFB9099F9DB9DBD9B9DFFFFFFFFFBFDB9DB9F0B99B09CB99D09D0B09C99099B9BD9F9F99FDFFFFF9F9BDA909C9DAD9CFBDFFBFFFFFF0FCF9F90FFFFFFBFBD0C9090B0A0E0A00900A00A0000B00C09C90C0A0B0B0DB0FAFFFFFFFFFFFFFFFFFFFFF9D90F9FBFDBB9F0FBFFFFFFFDBFDBBDB0D9BD9F9D9B9CB0B9A9C909B0F9BCBD9B99F9F9BFF9F0FA9D00D0B09A90ADBCF0DFDBCF9009FB090FEFFFFFFE90B9A0E0090909C00000000909000B090A0E9AD0D0E9EA0F0FDFFFFFFFFFFFFFFFFFFFFBB99099F9B9DF9F09000FFFFFFFBFDBD9BD0B090B0DA9090C9090B0C99C999B9F9F9B9DFDFFBD990099AD09C9E9DADF9FBFFFFFFB0EDFF909FFFFFF9F9E00090B0AC000090090090000090C0AD09000A9A90C9EDADAEFFFFFFFFFFFFFFFFFFFFF909AD9BDB9B9B9F09000FFFBDFDBF9BD0B99DB9090909C909A09C9000B09E909F9FDB9FFFDFBCBDA09009A9090BDADEDE9FDF9FC90FFFF90DFFFFBFEB9E9E09C909A9A00A0000000E000F09000A0D0D0C0FA090F0DFFFFFFFFFFFFFFFFFFFFFFF99D9ADBDBDFBD90009DFFFFFBBF9FB9B9C9A0DB0909A909009090B0909C99F99F9BDBDFFF9990090009090BCBDADBDBDF0FFFFB0E9FFFFFFFFFFFF9BC9090A000A00090000000A90900000ACBC9A0A09A90DAE9EBEFFFFFFFFFFFFFFFFFFFFFB90909090F9B99A0BCBEFFFFFDFDBD9C9CB999909AD090A9090000090090B09BF9BDBDFF9B0F009090909E9C9CADBCBEDADFBCF0D90BFFFFFFFFFFBFCA9A0A90BC90D0000900090000090B09000090DAC9ECBC9ACFFFFFFFFFFFFFFFFFFFFFFFF99090BDB9F9F00D000DFFFFFFBB9BB9B90BC9A909A90990D09090909A090F9C9BDBDBDFFD90090000000009A9D0FBC9ADAFDFFB0EFDBDFFFFFFFFDA9B0C900C0A000A0900000000A00AC0CA90B0E009A09A0F0F9A9EFFFFFFFFFFFFFFFFFFFFFFB9BDDBDB990900F0F0FF9FBFDBD9C90099B0DBD09DA0D0900B0000090090B9F9F9F9FFBFB9ADB90D0BD9BC90A90DBD90DEBEDF9EFFFFFFFFFFFBFF0F0B0DA9090B090A0009000009009A90C0C090BC0DAC9AD0EDEFFFFFFFFFFFFFFFFFFFFFFFFFDBB9B9F00009000FFFFFFFBDBA9B9000C9B09B0099A0B0D090909C900909BDBDBDFDF90D9000909000000F0DE9CA0CBDFDFB0CFFFFFFFFFFFFEBF0900A00AC000C0090000A0D0000000B0B09AC009AC9AD0AF0FFFFFFFFFFFFFFFFFFFFFFFFFFB9DBD900000A00F9FFFF9FDB9D9D09009B0D900900090909090009A99E9FDB9F9FFFBC9A09090A00000000DA9A090BCFBEFC0FFFFFFFFFFFFF9F090E90D090B09A90000009000A09A9C000A09ADAC90BC0F90F0FFFFFFFFFFFFFFFFFFFFFFFFFFFB90009000C90CFFFFFFFBD0B0B90900090A9000000CA90000900900909B9FBDBDF9B0DB000009000000CAD09000CBCDFFB9EFFFFFFFFFFFFFADA900A0A000C000C0A9000000900C0B0D09C0009ADACB00E09E9EFFFFFFFFFFFFFFFFFFFFFFFFFF090000090000FFFFFFFFBD9F0BD090000900000000DEB900090090BD0FD9DBDFFF9B00900900000000ACB00C09CFBE9FF0CFFFFFFFFFFFFBDBCA9090DA90B00A9000000000000B000A0E0BCBC00090F090E9EFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000F0FFFF9F9FB9A99C9B0900000000000DA9000900090AC9B9BBF9FBDF9C900090000000000900090CBD0DEF00FFFFFFFFFFFFBDEB090E00000A009000900900B000000AD09090009ACB0E090E90FADFFFFFFFFFFFFFFFFFFFFFFFFB000900000000FFFFFFFF9F9D0BB0D000900000000000009009000999ADFD9FFDFB09A0900009000000000090E9FCBF0F90CFFFFFFFFFFFFFB09CA90B09C90CA00A00000000E09C9000A00E9AC90C909E09AD0FFEFFFFFFFFFFFFFFFFFFFFFFF90000000009C9EFFFFBDFF90B90D9B0900900000000009000000909E9F9BBF9FBFDBD90090000000900009ACBDF0F0CFDA9EFFFFFFFFFFFBCBDA9000C00A009000900A000009000A90D0900090A90AC09AC0AD0FFFFFFFFFFFFFFFFFFFFFFFFF900000000000A9FFFFDFBFBD0F0BCBDBD000090000090000B009009090F9D9F9F9F9A9D0A990090000D0C099EFBF9F0EF90CFFFFFFFFFFFFFDADA9CB0B0900A0D0009000090000B0CA0ACA90E0D0BC9AC090DADADFFFFFFFFFFFFFFFFFFFFFFFB000900900000CFFFFBFDFFB909090909B99DA0909A0C9A9009A09A0BD9FBFDBFF9E90A90CA9D00909A9BF0FDBC9E0DF9A0CFFFFFFFFFFFFBE900000000CA9000A0000090A0000C0090909C009A0000009ACA0FFFFFFFFFFFFFFFFFFFFFFFFFF9000000000900FFFFBDFFBD9CB0CB0F9E9CB099B0D09B0900900909D09AD9DBDF9B990909090A09ADADAD0DA9E9E0DEBE900FFFFFFFFFFFBE90E9A90D0A90C00090000000C0B090B00AC00A9A00F09ADA0909FADFFFFFFFFFFFFFFFFFFFFFFFF90000000000000FFFFFFFFFB900909009A90BCBCB0B0090900900900F9FBAF9B9F0F0F000009090909090B0D00009ADF900CEFFFFFFFFFFFBDB00CA0A900000B00009000000000009090BC90D000AC0090E00CFAFFFFFFFFFFFFFFFFFFFFFFFFB000000000CA90CFFFFBFFFFF9B00A9009009090909090009009009A090D99F9E9F99099A90000000000000090DAC9EEF000FFFFFFFFFFFDFADB009000CB0B0000A00000090000B0CA00000A0AD090B00C90FADFFFFFFFFFFFFFFFFFFFFFFFFF90000090009000FFFFFFDFF9F9C90900900900000000000000000BC9DBDA9E9E9FDBDB0D0090000000000000A0009EDF9000EFFFFFFFFFFFADA0DA0C0B000000D0900090A000000009C90B09C900AC0CA9ADADBFFFFFFFFFFFFFFFFFFFFFFFFFB000000000000E9FFFFFFFFFFB90D0000000000000000000909C9090B099F9BDBDB0BC9A99C0900000000C90C9ADEDFB0000FFFFFFFFFFFBFDA9090A90090C90A000000000A909CB00A00C0A00AD09A900CBEFEFFFFFFFFFFFFFFFFFFFFFFFFF900000000000900FFFFFBFFFF9FB09909A90090900000090C0B0BCBD9FAD0FDBDADBD9F9F0B909C90900900F0FCFFFFF9000EFFFFFFFFFFF9A9CA0D000E0A0A00000000090000000909CB09CB00A0C0A9E9C9FFFFFFFFFFFFFFFFFFFFFFFFFFF9000000000000900FFFFFFFFFF9F9AD9C90900A009090009BC9F990BC9DB9BCBF9BCBF9E9F0F9EBE9CBCADADFFFFFFFFA900DFFFFFFFFFFFEDA900A09090090090B0900000000090E00A00000C9C9A9C00EAFEFFFFFFFFFFFFFFFFFFFFFFFFFF900000000009AC0BDFFFFFFFFFBDBDB0B0F0BD909CB09F9E9FBCBDBDBFBCFDBFDFDBDBF9BF9FF9F9FBDBDFFFFFFFFFF90000EFFFFFFFFFFFBF9CB090CA00C00A00000000000900A0909009E90B0A00C0BCBDFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000000000C090D0FFFFBFFFFDBDFBDBD9BC90F9BCBDBDBDB9F9BDADBDBDBF9B9BDBDFDFDFF9FFFDFFFFFDFFFFFFFDE900CFFFFFFFFFFFBC9A0000A9000B00D0000000009A000900A0DA00E00D0F0B0CBCEBFFFFFFFFFFFFFFFFFFFFFFFFFFF900000000009A90A9FFFFFFFFFBFBBDBDBF9BF9BCB9BF9E9F9F9EDBDBDBF9F9FFDFFBFBFBF9FFF9FFFFFDFFFFFFFFBFB0000FFFFFFFFFFFFFAD0F0D000B009A00C9000900000000C9C0090909A000009ACBDEFFFFFFFFFFFFFFFFFFFFFFFFFFB000000000000C09CA9BFFDBFFFFDF9F9BDBDDBFDBDFDADBDBCB9BDBF9FDBF9F9FB9FDFDBDFFDBDF9FFFFFFFFFFFFFDFFB000EFFFFFFFFFFBDAB000A90C00C00090A09000000000B000B0C0A00C9A9E9E09EAFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000000000909A090FDFFFFFFFFBFBDBF9FBBDBBDB9BDB9BDBDBDBDF9FBDFFFF9FF9F9FFFBDBFFBFFFDFFFFFFFFFFFF9C90CFFFFFFFFFFFFF9CB0900A90B0090A000000000090000B000A90DA9AC00009E9DFEFFFFFFFFFFFFFFFFFFFFFFFFFB000000000000AC90FCBF9FFDFF9F9DBF9F9FDB9DB9FDB9FDBDBDF9F9FBDFBDBDBF9FBFF9FDFF9FDFDFFFFFFFFFFFDFBCB000FFFFFFFFFFBEBCB00CAC900000E0009000000B00009009C90C000C909E9E00EADFFFFFFFFFFFFFFFFFFFFFFFFFFF90090000000009E09ADFFFBFFFF9FBF9F9F9BDBF9F9BDF9B9ADB9FBDF9FBDBDBDBF9F9FFBF9FFFBFBFFFFFFFFFFFFEDBD00CFFFFFFFFFFFDB9CB00900A0CB09090000090000000AC00A00B0B000E0009E9DAEFFFFFFFFFFFFFFFFFFFFFFFFFFF900000000000D09C09ADBDFFFFFBD9F9F9BFDBD9F9F9BDF9FDBDBDBF9F9F9FBDBD9F9FDBDFFDBFDFDFFFFFFFFFFFFFFFAD000FFFFFFFFFFFEB0C9A0009000000A00A900000000009A909000C0B090F0000E9DAFFFFFFFFFFFFFFFFFFFFFFFFFF000000000900000B0F9FFFBDBF9FBB9F9F9BBDBF9B9FDB9DB9F9F9F9FBCBF9FBDBFBDBBDFBDBF9FBFFFFFFFFFFFFDFFFB000EFFFFFFFFFFBF9CB0C90BC0B00AC09000000000900900000E90A9C0E000ADADAEFFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000B00F0D9E9FBDFFFFB9DDBF9FDF9BDBDF9B9FB9F9F9F9FF9DBDF9F9F9DBFDFBDBFDFFFDFFFFFFFFFFFFFFD0900FFFFFFFFFFFDBCB009A00000C90900000000090000CA0CB000D00A909AD00DADBFFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000C0090ADBF9FFBF9F9FBBD9F9B9FDB9B9F9F99F9F9BDBF9FBF9BF9F9FBD9FBDBF9FBDBFFDFFFFFFFFFFFFFF000CFFFFFFFFFBF0F09A0C90B09A00A000009000A000A90900090A9C00AC0A9E0AEDEFFFFFFFFFFFFFFFFFFFFFFFFFFB900E00000009E0BCBC9F9FDFFBF9DBBDBFDB9BDFDBDB9FF9F9FDBDDBD9FF9DBDBDBFBDBFDFBDFFDBFFFFFFFFFFFFFFF0F000EBFFFFFFFFFF0BC90A00C0009000B000000000000000090A000A9C909C009C9EFFFFFFFFFFFFFFFFFFFFFFFFFFF900090000009009C9FBFFBFBF9F9FBD9F9B9FF9B9BDBDBF9F9F9BDBBDBF9FFBDBDBDBDBDBBFDBBDBFDFFFFFFFFFFFFFF9000ADEFFFFFFFFF9BCA0090E09AC0C9000900009009000B00E0C90D00A0E0A0F0FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000000900E09E9EBDF9FDFDFBF9DBB9BDF99BDBDB9B9DF9F9BDBBD9F9F9B9F9F9F9BDBDFDBFDFF9FFFFFFFFFFFFFFE0000DFFFFFFFFFBCBC909E00900090A0000000000000000C909000A0B0D090D0009DEFFFFFFFFFFFFFFFFFFFFFFFFFFFB000C0000009E90BDFBFFBFBFBD9FB9DFDB9FF9FDB9F9F9B9BDBF9FBF9FBFDFBDBF9FDBDB9BDBF9FFFFFFFFFFFFFFFF99000EF9EFFFFFFFBF0B000B00B00A090E900000000000B00A000B000C0A0E0ADACA0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFB000D0000000F0DADF9FDFDFFBF9FB9B9FB9F9B9F9FB9F9F9F99FBDBDBDBF9FBDBF9FBDFF9FDBF9FDFFFFFFFFFFFFFF00000EFDFFFFFFF9F0DA90C00C09000000A90009009000090C0900D09090909009F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000A00000CB0F0FBFFBFBFBDF9F9FBDF9F9BDBFDB99F9F9F9FBDBF9F9DBDBDBFD9FBDBF9F9FFDFFFFFFFFFFFFFFFF0B000CFBEFFFFFFBEFB00CA90B00AC9A900000000000A000009A000A0A0E00E0E9E0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000090000000DBFDF9FDFDFFBF9F9DB9BDBDBF99BDFB9B9F9BDBD9FBDBFBDFBDBFF9FF9FFFF9F9FFFFFFFFFFFFFFB9000DBF9EFFFFFFFF90CB090000090000000000000000090B0000F090D090909000FDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000000000D0BCFBFFBFBFFBD9F9FBDBDBFBD9FBDB9DF9F9BDBDBBDBFF9DF9FBDBDF9BF9F9FFFFDFFFFFFFFFFFFFC00000EF0DFFFFFBF0FB00A00AD0A00A00A9009000000900C000D0000A00A0E0E9E0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000000090A9CBDF9FFDFBDFBF9F9FBDBD9FBF9F9FBB9F9FDBDBDF9D9BFB9F9FBDBFFDFFFFDBDBFFFFFFFFFFFFFDB900000CBEFFFFFFFF0F9D090000D0900D00000000900000009A000B0D0D0D09000DCEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009C0000000000FFFFBFFFFBDBF9F9DBDBF9F9F9F9F9F9F9BDBD9BFBFDBDFBFDBFDBDBF9F9FFFFDFFFFFFFFFFFFB000000FF0FFFFFFFF9F0A00CA90A00AC90000000000000009A00090C000A00A00E9EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB900000000009EDBDBFDFFFBDBF9F9FBFBF9BDB9F9F9F9BDBF9E9FF9F9BDBDBDBFDBFFDBFDBF9FDFFFFFFFFFFFFD000000FE9FCFFFFFF9EF0DA900C090090A00B0000000090000009C0B00A90B09E900EDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A0000000009A9FDBFDBDFFF9F9FBD9F9FDBDBDB9F9BDBF9F9FA9F9FF9FBDFBDBFDBFDFBDFFBFFFFFFFFFFFFFB00000C0FEBFFFFFFFFB9B00A09A00AC0009000900000000000D00A0009C0C0C000F09AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9090000000000CBADBFFBDBDFBF9FBF9FB9FBDBF9BDFBD9F9F9DBDB9FF9FBDFBDBBDBF9FBDFFDFFFFFFFFFFFF0900000F0DFEFFFFFFFEDAD09C090009A00000000000000000B009000000B09A0BC00EDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00C000000000909DBDBDFBFBDF9F9F9F9FFBDBDBFDB9FBF9DBFBDBDF9FF9DBBDFFDFF9FFDFBDBFFFFFFFFFFF900000000BEFFFFFFFFFB9E9A00A0CB0009CA90000900900000000009ADA000A09C00BCBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000000000000DA9F0FBDBDB9FBF9FBFDB9F9F9DB9F9F9FBF99F9FBFB9FBFDFB9FB9FF9FBDFFFDFFFFFFFBD00000000FEDBFFFFFFFBDE900090900000000C0000000009000009E0000909C9C00B0CBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9000000000009ADA9DBDBDBFFBDBF9F9BFF9FBFB9F9F9BDBDBF9F9F9DF9F9FBDFBDFF9FFDBF9FFFFFFFFCF00000000D0FFFFFFFFFFFA9AC9AC0A009E9A900A900000000000900900000E0A09A00CBCBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00900B000000009C9ADB9E99E9FDBF9FDB9F9F9FDBF9FDBDBDBDBDBFBDFBF9FBDFBF9F9BFDFF9FDADFFFFB90000000ACFBEFFFFFFBFDF9A00900D000000A900000000000000A000B0009000C0D0B0ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00E000000000000BC90F9FF9DBBD9FBBDFBF9F9B9FB9BDB9F9FBF9DBFBD9F9FBDF9FBFDBF9FFFFFFF0F9000000000CFBCFFFFFFFFFBAC9C9A00A0A900C00000000090090009000C0BC00D0B00A0CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90000C900000090900BC90B99FBDFBF9DB9F9BDBDF9DBDBDF9FBD9FBF9DBFBFBDB9F9FDBF9FFE9F9F0F9090000000ADADEFFFFFFFBF0DB0A0C09090C00B000090000000000000A90000B0A00A9C9EAFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0090000000000000909AD9CB9CB9D9FBDBDBDBDB9FBDBDB9BFDBFBDDBF9FDBDBFEBFDBD9E9F9F0F090000000000C9EF9FFFFFFFFFFFAC90090AC000B0009A00000000000000900A900090D0C0A09CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90C000000000000000090A9CB9FBAD9FBDADBADBF0F9F9FF99BC9FBBDBF9ADF9BD9DBEBF9E9F0F0F090000000000CBEEFFFFFFFFF9F9BCB0A090A900C0A000000000090009AC000C00C00A090D0EBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0009009000000000900090B0D09DB099B9BD9BD9F9F9F99FFDBF9CFBD9FDBBFDBFB9D90F09CB090000000000000FC9FFFFFFFFFFFBE900C900000A90900090000000000000009000B0A090CA00FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000CA0000000000009009090BDB0BCBC9D0BD0BDB9F0BFB09B90B990B09AD09AD0DA0F09CA0000000000000CCEFBFEFFFFFFFFF9E90E900CA0D0000A000000009000000009000B0009C0A90DA9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000C0000000000000000000000909090AD00BDA9E9F009DBC0F9CBC9CBDB0F00B0900000909000000000000BFBCFFFFFFFFFFFFBE90A0B0900BC090C9A0000000000000000A0000C009C0A0C0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000900900000000000000900900900A909A90090909F0B00B90B009A000900900009009000000000000000CEFDEFFFFFFFFFFFEDBE9C00000000A000000900000090009A009C009A0A0090CBEFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000000000900000900000900009090000000900900000900900000009000000000000000000000FB0FFFFFFFFFFFFBFBC9A090ACB009000A000000000000000000009AC090DA0E9EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000C00000000000000009000009090009000000900090090009090090090090000000000000000000009CEBCFFFFFFFFFFFFFFDE9A90AC9000A0C090900000000000000009A000000000900FEFFFFFFFFFFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFF009A00000000000000000000000009009009000090000000000000000000000000000000000000000E0FFFFEFFFFFFFFFFFFFBBF0C9000009009A00000000000000000900000900F0ACADA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A0C0000000000000000009009000000000000000000000000000000000000000000000000000000C0F09CFFFFFFFFFFFFFFFFD0B0A09A0AC0A000A090090000090000A00C9A009009000CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF900900000000000000000000009000000000000000000000000000000000000000000000000000000CEFEFFFFFFFFFFFFFFF9EBC9C0C09009000D0000000000000000009000C0A00C0BCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000ACFFFFFFFFFFFFFFFFFFFFFEBD0A9000000009A0000000000000000090A000090C0B000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC00000000000000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFBDBA90A9A00B0AC0000A90000000900000000009A009000CB0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDAC9000000000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFDAD0C009C00900009000000000000000009000000AC90B0CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFBAF0B009A00000B0000000000000000090000000C900A0C0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFBCD9000000090E000C00900000000000000000E09A00900BCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9A000000000000000000000000000000000000000000000000000000000000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFBAE9A9E000A009009A0000000000900000B0090000A0C000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCD00000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB0C0090C09000A0000A000009000000000000009C0A90E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA0B00000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AD0B00A0900E000090090000000000009000009000900C9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D9C000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEDA900000000090000000000000000000000900A000A90A0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A9E090000000000000000000000000000000000000000000000000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDB9CA09C900B000AD0A00000000009000000A0000C9000C9C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0090C00000000000000000000000000000000000000000000000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFB90CA00AC0000000000900000000000090000900A0C0A00FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E90A9A09000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFBDADA9000000090000900000000000000000000009009000FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9CAD00D00A90000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFBEFFFFFFFFFFBFDAD000090090AC0900000000000000000000090A0000A09E0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDA9009A0A900D0E000000000000C00000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFB0B9000E0000000A0000000000000000009000000D00000D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9E9E0D0C0F0A9009C90000C90CA000C0000000000000000C00DEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FC0E9A00000900000900000000090000900000900A00C0A0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA900B0B9A0D0E0F0A0CBCBADA90C90000CBC9000000000CBFDAFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFB9B0000900000900000000000000000000000000000909C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9CAD0C0C0F0B090B0DBE9FDA9BCBEFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFCFFFFFFFFFFBFFB0DAC09000A000A0000000000000000000000090009000A00E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDA09A9A9A900C9E0C9A0DAB0BC0F9FFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFBFFB09000000900000900000000000000000090000000000009E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBC00C0DADA9A9A90DA0DEBDB9A9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEFFFFFFFFFFDBDE9E9A090000090000000000000000000000000000090000C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA09ADA9A009C0C90E09EB9E9E9DEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFBFEB9A900000000000000000000000000000000000000000090BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC09E0090C0F0A0B0E90F0DEDBF9EBFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFF0FFBFFFFFBFFEFB9E900000000000000000000000000000000000090000000C0CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0090E9A909C9C900F0FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFF9FBDBC9E09000090000900000000000000000000000000000000A9ACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9E0E900DACA9A0ADA9E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFF9FFFFBFB09A009000000000000000000000000000000000000090000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD09090E9A909C9C900CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF9FFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBDFFEBF9E9E9E9000000000000000000000000000000000000000000000FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADA0E090C00E0A0ADAF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FEFFBEFFFFFFFFFFFFFFFFFFFBFCFBFFFBFBDFFBF9A900009900000000000000000000000000000000000000DADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB90909ACB0B0909C909CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E90DADFBFFFFFFFFFFFFFFFFFFFDFBCF0FBEDFBE9E9AD00000000000000000000000000000000000000000000000ADFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E0C900C0DACA9E0A9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEB0DADF0FBFFFFFFFFFFFFFFFFEBFBFFFDBBEDBF9F9A9090000000000000000000000000000000000000000000ADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0B09A0ADA9A090009C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9CA9A0F0DEBEFFFFFFFFFFFFBFDFCBFBFFDBBDBE9AD0A00000000000000000000000000000000000000000000D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD00E90D0000D0E0BCAF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDA0A90CBCBEBDFFFFFFFFFFFFFFFBEBFDFADBFCBE9BDA0900000000000000000000000000000000000000000000ADADBFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA9E900A0A9E9A90D090DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9CB009009E9ADBFFFFFFFFF9EDBDAF9FADBBF9E90900000000000000000000000000000000000000000000000BCBDBDEBFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF09A9C09C000CA0ACA0ACDAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9E90DA0BC9ACBEDBEBFBFFDFFBF0F9AFDBFCBCB9E9A90900000000000000000000000000000000000000000090C0BCBFBDBF9FFFBFFDFFFFFFFFFFFFFFFFFFFFFFBFFFFFBDB0F0C0A9A0BCB09C909C9ABFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9FDA9E09C000C909ADBDEFEBFBCF0F0FD9AD0BDB9E9AD000000000000000000000000000000000000000000000009ADAF0DAD0BCB0F9EBF9FBEDFBFFFFFBFFBFFFFFFFFBFBFEBC90B09C0D000C0A00E9ACDEDBFFFBFAFEBFFFEFFFBFFFFFBFDBEDA9E99A90B09ADADADE9FBDFCB0B90F0AF0BF0BCB090A0000000000000000000000000000000000000000000000000909A09ADA9E9E9E0FADBDADAD0F0F0F0F9CBC9E9CBC9090A00E0B0A0F0B0DA90009A9AC9E9CBD99E9ADB0F0F0F0B0F0BCB0F09A0C000C000000A9A0DAB09C0E90BD9AD0FCBC9E90900000000000000000000000000000000000000000000000000090000000000900000A009A09A09AD0A09A00B00BCB0C9C90C09C90C0900CBCA0D09A09A00ACB0F0ACB0F0F0F0F0F0BCB0F0D0B0D0B0D0BC90C9E9C0F0B090E0AD0B0B09B090000000000000000000000000000000000000000000000000000000009009000900900900900000900000900900000000B0A0A9A0A0A9A0ADA0090A0009009000000090000000000000000000A000A000A000A09A00A900000A9090BCBCBC0F0A9000000000000000000000000000000000000000000000000000000000000000000000000009000000900000000900BC009C90C90C90C090009C0090000000900090009009009009009009009009009009009000009009009000E0C09A90B0090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009E0ACB0E9ACA9E0E9E0A90000000000000000000000000000000000000000000000000009000000000090B0BC9E9CB000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090009009000900090000000000000000000000000000000000000000000000000000000000000000000090B09A9090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFADFBCFBDEBDFADFBCFBDFBEDBF00000000000000000000010500000000000076AD05FE','Steven Buchanan graduated from St. Andrews University, Scotland, with a BSC degree in 1976. Upon joining the company as a sales representative in 1992, he spent 6 months in an orientation program at the Seattle office and then returned to his permanent post in London. He was promoted to sales manager in March 1993. Mr. Buchanan has completed the courses "Successful Telemarketing" and "International Sales Management." He is fluent in French.',2,'http://accweb/emmployees/buchanan.bmp'); + +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(6,'Suyama','Michael','Sales Representative','Mr.','07/02/1963','10/17/1993','Coventry House +Miner Rd.','London',NULL,'EC2 7JR','UK','(71) 555-7773','428',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF9A9FBCBFFD0000000000000C0BCF9BDF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FCF0EFDE9A00000000000000BCB0FCA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A9A9F9EBFC0000000000000AD0BCF0BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0DACBE9F0A000000000000090BCB0BCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0F0DA0FD000000000000000ADADE90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC909A9F0A000000000000000000B0EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A0C0000000000000000000BCBC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0DA9E9000000000000000000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000B00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF900B0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000BEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000009AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000A0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000A0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000BF9ED0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000900A0A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF090FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000B0E909000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000009A0A00000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90090F0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000A0BC0900B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBC009090000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000090A9A0A00000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE909A0DA9B0900DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000009A090000009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF090B09909009A90BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A0000000000000BE9A000000009A9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD09A09090A9090909009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0090000000000A009E9E000000000AA90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00909D09A9909A090090009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA0F0A000B000000090A09A9A9000000009AF0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09A9A09A900090900B00B0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000F009A0000000000000ACB0A00A00009AD0A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0B0D09900909A00009009090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000900F00A000000000000090B0E9E900009A0BA90B0ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9090909B0090B00900B0090900A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0A9A0A0F0000000000000000A009A9A0A000009F0BC090900FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90B090B000B0009009009000A09909009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB0B000000F09A000000000000000000090CB000A0ADABA0A00009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0909A90990090000000009A09000909009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0B0A0FA9A90F0A0900000000A90000A00A00B0000090A0C9ADA9A000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0909F0909A0090A909A090000900B000A9000FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A090F0B00E00AF090E0000000000A00000000B0000000A909A0000000A9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFF0909A090B0D0B0090900900B0900900B9900B09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A90BCAA9E9A09A0F00B0B0A900000000090000000A00000000A0B0B000BCBAA90FFFFFFFFFFFFFFFFFFFFFFFFF009F099A909A90BC00A09A90C9A9AC90000090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA090AC0B0DA0ADA000F0A0DAF9EBCB00000000000000900000000090E09A0090DA00009FFFFFFFFFFFFFFFFFFFFF09B09B099E909AC09A900000B000909A9C90B09CB090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE90DA009A00A00F0A9AF0F000A90F0B00000000A00000000A0000000B0A9A0000ABA900900FBFFFFFFFFFFFFFFFFFF09B09B09AD09E09000000B00900B0A9A90B0909A909090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A9A0A000A0DADAB0ADAC0AF0009AFAF0A00000000000000A09000009A00F00A00B0D00A00A9B0FFFFFFFFFFFFFFFFFF0B0DB0DA9B0B0900B009000900900D09CA9A900090B0DA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A90CB090090A00000F0A0B0F00000090F0A00000000A00009A00000000BB0B00900A0BC00000F0B00BFFFFFFFFFFFFF0999A99A9DAD00A90090A090A00A09A0B090DA9B9A90B90909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009A9EBBF00000ADABADA00B00AF00A09A00009A0000A900900000B00000A00DACB00009A0B0A09A0F0B0000FFFFFFFFFFE9BE99AF9A909A90090A09000900900900B0B09E099090B0B90BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A000B0F0FFA00A000C0A9A0CAD0F0900000B00000000000000000BCA9A009AFA900000000BA90900BA000000BFFFFFFFFF9BC90BD9ADA9A900B009000B000900900909C9A9BCA9F09909B09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00A9000A9FBFFF0009CA9ABC0CBA9A0F0A0000000B0090A000A00A00B0A90090A9090A00A000B9E9A00E900000B0F0FFFFFFFA9F9BBF0B09090DA900900090009A09A9ADA90B090B9B099A9F09BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000000ADFFFFF00000A90E00AB0000AF00000000000A00090009000000BCA0A00A0A000900FADA9E0A090A9000090BFFFFFFFDB0BC90BCB9E9A909B90B0B0909009009090B00B0F09E9AD909B0909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000A90000009AFFFFFF00000A000B00A9EB0F0000000000000000A00000000B0B9000B09000A0A90BADA909A0BCA00000B0BFFFFFFBF9FBAD9B0B909A9C0B0909A09A9CB9A90B09B0D90B09B9A9B09B9B90FFFFFFFFFFFFFFFFFFFFFFFFFD0000A000000A0009BFFFFF000A9CA9A0F0E00CAF00B0000000000000000A000000BCA00900A000909EBDBA9A0009A09000A000FFFFFF9F9A90DB0F09A9F9AB99A9B0D9A90B09D0B09AD9A0BC9ADADBC9AD09A9BDFFFFFFFFFFFFFFFFFFFFF000A0090000A090000AFFFFFF00090A90CA009ABA9F0000000A000000A0000000000BDA9000AB0B00A0A90A0000000A09A00000B0BFFFFFBCBF9FB0B09F9A9AD99E9F090B0DB09A0B0FA99A9B90B9099A9B99BE999AFFFFFFFFFFFFFFFFFFF0000090000900000000BDFFFFF0000AC0A0A90A0E0C0F00A9A0000900000009A0900000A00A0B000000000A9000000A90F0000000009FFFF9FB90B09F99B09DB9BEB99ADBB09B09BDB9999DA90DA99EB0F9F0B099B0F90FFFFFFFFFFFFFFFFF0000A000A000A00000000BFFFFFE0000B0CB00E9A90BAF09009A090A00A09A000A0A000B0B0000BFA9A0B090009A00000A0BCA090A000FFFFE9EBD0B09AD0BA9AD99EB9B90DB09F09A9AFA9A9B9A9E090B0B9F0F099B9B9BFFFFFFFFFFFFFFFE0009000000A0090A00A000BFFFFFA0000B00F0000A000F000A0A9AE90B00009A0900000000000B0A9A9A00A0A000009009FA900000009FFFF9B99ABDB09A99DB9A9A99E9AB0BDA9BBDBD99BBD0B909B9F090A9B9B9E9ADA99FFFFFFFFFFFFFF000A000A00900000000090FFFFFF9009A00A00AB0E09E0F0A09090A90A009A000000009000000B0F9B0F00F0900000000FAA90A9A09000FFFCB0FAD900F99B0A909099A99D9990B9D0BB0BBC90BDA9B090B9F9BDADA90B9B9EBFFFFFFFFFFFF0A900000900000A00000000BFFFFFE0000CAD0BC0090A00F0000A0AD0B0B0A0FA00A0000A00A000B0BEB0BB0CA000000A9AD9A00000A000BFFBDB990B9B0A9C9909A9B0D0B0ADA9DA9BC9BC9B0B00900F0BC9A90B9B9B9DBDBBDBFFFFFFFFFFF000A09A0000A0000090A00ADFFFFF9000A90A0A0FA0A0A0F09A09A9AB0A09A90B0900A000B009000B0B0BCBB0000000000BAF0F0B0000A00F0B0FB0BC0999A9A9E090D0B099099A99A9B90B09F9B9B99099B09F90F0BCB09AD9B9BFFFFFFFFFFC0000000A00000000A00009ABFFFFF00000B009000F0C90F0A0000000F0BADABCBAF000F9ADA00A009A9AB0FA00000A00BDF090000B0900B9F9F90F9B9A9E9B0999A909090A9009099090B99A909E9A9B0B0B09AF09F9F9B9BBCBDBFFFFFFFF00A90A00900090000000090ADFFFFFE0000E0A0E0B00A0A0FA9CB00B0B09A90BCB9E909B9ADA9A090BAB0F0F090000090BEBA00A09A00A0B0F9A9AB9090DA9909B0A90B009090099A9E99B09E9A9B90DB09DB9DB999BB0B0BCBDB9B0FFFFFFFC9A00E90A000A00A0B000A000BFFFFF0000B00C09A0CA900AF9AB0B00B0BADAF0B0F0FAACAFB0A90A0090B0B9A090A000ADBC9A09A009A9BDB0F9F9CB0A9A9B0BD09990909A009A00909B0DB99B9C9A9B09A900B0F0BC9DBD9B9B9FBDBFFFFFF0A9A90A0000000000000900A9FFFFFFF0000A0B0A00A00E90F09ADADA0C90B0BB00A9090B9ADBDABCB0AB0B0A9E0009A00A9A00000B0000EBDB9A9B9990909090B9ADA909090009090909B09A90B9B0909A9B99B99B0B0B0BE9E9F0BB9BFFFFFAC0CA09E9A000000000A000000FFFFDA0000D00ACB09A00A0F00A9A009A0ADBC00000A0000F0A000B0A90B0ADA9ABDA0090009000000A0F9FBCBDB0BE9BCB0F9B9099090A00090000A90909BD9BDA9DB0F90DA90FA9F9BDB99BB9BBDF0FFFFF00B0B0F000000000B000000000BFFFFFF000A0A0090E009A00F009009A0009A00B0A9000A0B0A90BB09B0A0090B0BDA0D0A00A0A00B0090B0B0B9A9F99009099AD0B9A9A909090009090B09B09A9A99A099A9A9DB999B0B09EBC9DBDBB9BFFFE0F0A0A0A00009000000000000BFFFFFF0009009CB0A000A09EF000A00000000B00000A09000000A0CBA00900A00BFADBA00009E9B00A0A9FBDBDBDB0B0B9A9A999B9C9090909A909A0090B0DB99B9B099A90999A90BE9DBDB99BAB0B9FADFFF000AD0D090A000A0000B0009A00FFFFFFA000E0A00E00B0C0A0F0000000900B00A0B0F9A00000000B00DBA0B000009BE9F0B0B09EBF0900B9CB9A9A9BD90909DAB0DBB9BDB9F9DB99D9B090B09E9CBDB0F0BDA9A9B999BA9A9E9D9F9FB99BFFDB0B0A0A000000000000000A00009FFFFDF0000B0A90B0CA9A9AF0000000000000090FBADA00A00000BBA09A00000A0F9A0A000BFBDFA00BDBB9F9F9F0B0F0B0B9DB909ADB9E9B09F0B999B99B99B99A9B990909D90F0B09BDB9A9A9A9BEBFFFE00CBCB00A0900000A0000000009AFFFFFA00000C0AACA0000C0F0009A00A0000090BBADB0B000009AD009A0000B0DB0000900BFFFFADA9F0F0DA9B9A99909C990B9ADBDB9F9BDBF9B9E9F9CB90B09A9909A9A99A9B9BD9F9A909BDBDBDB9FFF00AB0A0000000A00900A0000000AFFFFFE0000B0A9E90090A0BAF000000000B000A0ADBEFBC0900A00BAFA900000A00A00000BDBFFFDA9A9B9BB9BCBDABA909A9F0B9B99BDB9F9F9F9F9B0B9C9BDB9DA9F09090B9ADA9A9A99BDB09A9A9FBFF09AD0E90F0BCA900000009A000009BFFFFFD0000D0A00A0AC9AC0F000000900000000B0BB9ABA0000000900A0B0009A09000000ADBFFFFDBDA9CBDB9B99D00B09099C90F9F0F9B999BDBDBDBB9B0B0BB9A9B0B0F099B9F9B9F0B09F09F9B9BFFAC0A9AE00A0BCACA0A0B00000A00ADFFFFFA0000A9CB09A00A0B0F0000000000000900B0DAF09A0090B0A0900000B0000000000BFFFFBFA9B9B9B0BDABB0B909A0B0B9F9B09990090099BDB9D9F99F909D909C909B0B9B9E90BD9B09B09E9FF090B0E909ADBCA9090000CB0A09000BFFFFFD00A00AA00E09A0000F000A900A0000000B0BAB9FA000000000A000000000000000BDFFFFEF9F0F0F0BDA9D090000090909090990BC9A090009BDBB09B0B9B0A9A9A9B0F9E90B9B90B09B0DB9BE0ACA0E9A0E0A0A90A00000A0000000BEFFFFA00009E90CB00E00FABF0000000009000A90A90FB0FB000000900000B000000A00000BFFFFBDA9B9B9B9B99A9A900900000090C0A90B990F0B9090D9F9D90D0990909A9B9B9FB99C9B9BC9B0BCB90009A9E0B09AD0A0CA09A0900B00A09FFFFFF0000A00BA00B09A000F000000000A00000B0A90FBF0FA000A0000000A9A0000900000DBFFDBDA9E9ADB0FB90DA9A000000009B90F90E9A9BCB909099A9A9B0A90B099CB9A99BEB9A9C9B0999BCB0B00CA9E0AC0A9C9000000A00000000BFFFFFF0009A0CA9E0AE0BE0F0090A0900000090A9A0BBCBF00900000000B0000090000000BFFFFFB9BDB9DB0B909A909090000000000B00B909099BE90B00909009000090A99F9BAD99F9B9B09F0B0B9A0CB0BCB0D0B00A0A0000000000000ADFFFFF0000ACB09A0B09A00BF000000009000A0A9090BCBF0B00000000B000900000000009FFFFF09E9A9AB0BD0B0909000090B09A909099000090BC90B09000009009090B99B09F99BBA90B0DB090B9C09A0BCBE9AA0DA0909A000000000009FFFFFE0000090EACB0CA0DA0F000000A00009009A0A90B0B00A0A090000090A000A000000A9FFFFFB9BDBD990B9DA9A9A9A9090BC90909009099A90B009000000000000A909ADBB0BB0D99F9B099B9C9B0A9ADADAF9CBADA0E09A0000A00000AFFFFFF000B0AB09AC0A90A0AF000009000A0009A9B0A000DA900900A0000A0000000000009EBFFF9E9A90B0F90B0909C9090B099B9A9A990B909009090A909090000000909A990F90FBA9A909B0BCB9A9B0CBAFBCAFBCBADA9AC009009000009BFFFFFF0000C0A09A90A0090F000B0000900A000A09A9A9A9ACB0AD00B0F0900090000A0009FFFDB9BDBB9B90B9B09A9A90B09F0B9D990BC90F09909099900B00A0009009E90B99BB999BDBBD09B99A9C9A90DADBDACBFCB0FA9A00A00000000FFFFFF00000B0CA000E0BCA0F00000A90A0090A9B9E9C9E09090C90BC0900A00000090000BFFFBA9F0B0D090BD090B0999A90B09E9BB0B9B9B99B09A9F9A9B909000B00B090F9ABC99AF0B090B9F9AD9BADAEBFEBEBF9EB0F0C0000000A00B0FBFFFF00009A00B0F0A900A00F0A0090A009A009A0A90A90B0F0A9A009A0BC090A0A00090A9BFFFDB9BD9B9F90B0BC9B0F09E90B99AD9F9E9F9FBDBBDB0B9D009009009090B90B99B0F99B99BBDB0B9B099ADBCBFDBCFEDFE9AB000A9A090000BFFFFFF00000F00A000A0B09AF009A00900000A0909A90A900090090B0900B00090900A0900AFFFBDA9B09A9A99B9B0990B09BD0A99A9B99B0B9A9DB9BDBA9B0A900900B090B99E99B0B09AD09A9BDB0B0F9ABFCBEFBFBFADAD0F000000A00000FFFFFFF000A0BC0ADA000E00F0000000A909A90ABA0009009A0000000A0B00A0000A090A0BDFFF9A9F0FB999F0909B9A99B090BD0BDB0DA9D00DBA9E909D0099CB0A9A9DA90DA9BA99F9BDBBD9BCB0F9B09FDEBFFBCFDEDADAA0000000000A09BFFFFF000A000A90A09EB00AF00009A090A090A9009A000A000009A0B09009090A0090A909FBF0B9F9B90DAB09B9A9E9CBC9AB90B0909A90A99B0D99B9B0B9B0B099909A909A990D9A9A9A990B0B9B9BC9BFEBFF0FFBEBAF0F09A00A0000900FFFFFF000090FA90A90A000B0F00B00CB0B0B0ADA0B0900900900A099C000000A0090A0000BEFFBDB0B0B9B999BC999B9B9BBD0F90B0B90909A009B0B0BCB90C9090F0B909B99A9B0B9B9F9A9BDB9BDA99B0BFFFFFFEFFDF0B0E000009A00000BFFFFFF0000A000E00E0B0E00FB000B0BCF9ADB0B00A0A009A00900A9B0B00B009000090009BDF9A9F9F9F0BDA9B0F090BC99B9A9F99CB0B0090B09B0D090B9B0B0B0B0F90DA99A990F090BDA9A9F0BDABCB0DBEFFF9FAF0F0B9A09000000A000BFFFFFA0009A0B0B0900B0B0F09A909FBBCB00B09B09090A90B00900000000000A000A000A9FABDB9A9A9B9A9F9B9B9F9BBEBDB9A9A909C0B0C90F09B0B9CB0BDBD99F9A9A9BC99A99BBB90B99B9B9B99B9BAFDBEBFEDBE9ACAC00A00000000BDFFFFF000A0AD0A0A0AC000AF9F09EBE9DA90B00A000B0A90B00B0A90B00B00B0009000A99FB9DB0BDBDB0DB990B09A90BD99ABC90D00B09090B090B0BD0B9F99A9BA909B99099E99A9C90B9DABCBCBCB0DADFBEDFE9BE0BCB09A00000A9000FFFFFF00000D00AC09A9AADA9FA9A0B9BFA90B0F09A90009AD090009000000000000A09000FBCBB9F9B0B9BBDAFB99F99B0BFBD9B9A9A900B00900B0D909F9F9EBDA9DB9B0DA9B09AD99B9F90B99B9B9B99B0B0FFBCBFE9F0ADA0000900000B0BFFFFFF0000A0B0B0E0090A00FBE9B0F9ADA00B0B00A09009A9A9000B09A90B00B0000A00B9FBDA9ADB9F0DB999BFA9A9C990BBD0900909009A90909A9B0BB0B9B9FA90B09A909B99A9A9A9BB0F0BDBA9F0BD0F0FFBCBDADA9ADA00A0A00A0000FFFFFFB0009AC00B0A0E09A0F0900F0BCB09E0000B00A00909009A900000A000009090090BF9B9F9B9F9BB9FBAD99B99B9A9900B0090A090900A09A90DB9DBDBDB99BBD9B99BD0B09BD9B90DB9B9B0F9A9B0BAFBCFBFAFA9E9A090000900000BFFFFFE000A00B0A009A90AC0F0B0B0B0909A090B000000B0DA090090B0B0909A9A0A0A00BF9B9FB9BE9BF9FAD9BABD0B009D0B900000900A009090090B9FAB9ABA9BC90B09A90BDB9A9AD0BB0B9E9F99F9E9ADBCFAF0F09E9AD0A00000A09A0BFFFFF900000F0AD00E00A0BAF00000000A090A00B009000B09A0B0A900000A000000909ADBBCBB0F99BF0BB9BF9D9BD99B9A9909000009909000090090099DBD9D099BB9BD99B99AD9B99BD9BDB9B9AB0B9B9AFFBDAF9EB0E9A000A9A00000BDFFFFFE0009A00A0AB00AD000F0090009000A0900000A0009AD9909DA909A09A9A0B00A09BDB9F9FBFBDBDBDBDBBB0B9A90990BDB09000A0909A900000900B09B0B9A909D0B0BDA99B0DBA9A9A9BCB9DBDA9E9DAFCBDAF0F9ADADA900009A000ABFFFFF900A0F09000A90A0B0F00A090A09090A000000090A90A0B0A90A0090000900B00BEFBF9B9B9FBFBFBFB0F9F9A9F9A0B9A99A9F999A990000A99BDB09A09099B9B0B9B9A9BE9BB9DB9F9B0B9AB9B9F9B0B9BFAF0F0ADA9A00A00A0000ADFFFFFE000000A0EB0DA09AC0F0900000000000000A09A0A90B09009A009A0A09A00B009F9B09BFBCFBDB9F9F9F9B9BDB90999F9FA9B90BC90B09A990B09099099B0F9E9B9F9F9FB99BD0BB0B9E9BDBDA9F0B0BD0F0BDA9ADABCA0B09A90A9A9BFFFFF9000BCA9A900A00A00AF0009009000A09009000909A09A00B009A0909A09B009A9BBDBF09FB9FBFFBFBFBF9EB90B9B0BFB99D0B9B9B99F99BDBD9B90A9BC9B99B0F9B90B9DBE9BF9DBDB9B9A9B9B9B9F9BB9BCBADA9E9AD00A00000000FFFFFFE000090E00EA90F00B0F00A00000B09000A00B0A9ADA09A00B009A00A9A00B000B0DB9BFB9FBBDB9F9F9F9F9FB9F0D909FFAB9BC9B0FA9B0B0BBF0BD909B09A9B9B9EBDBAB9BF9BB99A9BDB9F0F9E9A9BDBF9BC9ACB0F9ABC9A00A00000FFFFFF0000A90B090E00BC0AF0900900A0000A09000090B09A09A90B0A09B009A90B0BDB9AF9B9FBDFBFFBFBFBFBB9FB9B9A9FB9F9FDBBDB99F9F9FBDBF9A9909BDBDBDBF9BB9F9FB9E9FABDBCB9FB9B0B9F9FADBBDBE9A0F0AD00A09009A09BFFFFFB000A00A0EA090A0A90F00090A9090A9090A90B0B09A09AD0B0B09A00BA9A0009B0BF9B9FBDB9BF9F9F9F9BDF09F0B99BDF9FFBBDBFBFBFBFBDFB9909A9B9B9B0BB9FBDF9FB9F9BBD9BB9B0B09F9BDA9B9B9F9A9ADB0ADA0A000A0000AFFFFFFC0009CBCB009AACB00AF0B0A9909A900000000090A09A09AB0B09A09B0D00B0BF9F9BDAF9FBBFDBFBFBFBFFBBFBBDBCB9BBFBBDFBF9F9F9F9FB9FF0B99BDBCBF9F9F9FBBBDBFBDBDBBC9F9F9FB0B0B9F9F9F9FBDA0E9FA90090000A090FFFFFFB000A0A00B0E09A0AD0F9099EBB09A9B9A90090A9DA09A090B0B09A00A0B00909B9FBBDBB9F9BF9FBDBDB9BFDBDBB9B9E9FFDFBF9FBFFBFFB9FB9090BDA9BBDBBBFBFBDFBF9FBFBBDBB9AB9B9B9F9A9B90B9A9B0F9A09EAD0A0A0900A09FFFFFF00009A9E0B0A09E0AAF0B9A9B0BF9000000A0A90A90A90A9CB0B09A90909A0BF0F9F9BDBEBFB9FBDBFBFFF9BFBDBF9F9B9BFBDBFF9FBFBDFF9DB9B99B9F9FBDBDBDBDBBF9FBDBDFADBF9DBE9F9B9DBCBBBDBDBF0ADAF09A00090A0900BFFFFFC000A0CA0BCADA00B00F90B9B9BB0BA9B0909090A9B090A9AB09A9A900A0A09F99BB9FFBF99F9FBDBBDBDB9FFD9FADBBFBFDFFBFDBFFDFDBB9AB9E9DABFBFBDBFBFBFFBDFBF9FBFB9B9B9BB9B0BCBAB9BD09B9B9E90B0DA0090A00000BFFFFFFA0009CB0F0A9A9EB0CBFA9AFBBCBB09000A000A0900A0909099A9A90B09090A9B9F0F9BDBBFBF9BF9FBFBFF9BBFB9BBDBDBB9FDBFFBFBFBF9FBDB9BBDF9B9FBF9F9FBDBF9FFBF9BDBDBDBE9F9F9B990F9BBBDAF9BCADAA900A00090A09FFFFFFD000A0A00BCACA0CBA0F9090B9B90B0B0900B090A9090A0B0AA9A9A90B0B090BDA9FBFBFDBF9FBDBF9A9B9BFDB9FF9FBCBDFBFBFFBDFFBF9FBDBFBDBB9FFBF9FBFF9FBFBFB9FBFBBDBA9B9B9A9B0BF9B09DA99BCBB0BD0E900000A0000AFFFFFE00009CBCA9A90B009AF0A9A90B0B0000A09000090B0A900B999A9E9B0B00A9F09FB9F9BBF9BBDBB0F9F9E9BB9FB9FF9BFBBDBFDBFFBDBDBF9BF9FBDBFB9F9BF9FBFBDBDBDFBDBDFBDBF9F9F9F9F90BDB0B9FBDB9CACAF00000B00000B9FFFFFB0000A0A09E0AC0AF00F09000A00000000000000A000900B90AA9B0BA9B0B9B9B9B9FBF9F9BFDBB9DB9B099B0FB9FB9BF9BDBFBFFBFFFFBF9BFDBBDBFBDBFBF9FBBDBFFFBF9BF9BB9BF9B0BB9B9A9BDB099FB0B99AB9B00A0000000900FFFFFF0009AD00DA0090A900FFA0900090000000900009009A00B00B99A9BB9EB9A0F90FBFBDBBFBDBBBDAB9A9B9AD9A9EBDAF9FBFBDFBFDBF9BDBBDBBDFB0BDBDB9FFBDFBDB9BDBBDBBFDBF9BFBD9BCB9A9B9F0B9BD90F90E0F0090000000A9FFFFFFC00000B0A09E0B0E0A0F9A0A90000000900090A09B09A90B00A90B0BA90B9B0B909FBBFDBFBFCBBDB9F0DB9A9999B9F9B9D0FBBDBFFFFFBDBFDBB9FBDBBBFB9FBBDBFFFBBDFBDBBBDBF99BBE9B9F9E9A9F9FBBB90BDB0A00A000000000BFFFFFBA000AC09A00AC09A90FA9900000B00A000A0090A00B00B0B09AB9BB9BA00BDB9BFBDF9BF9F9BF9B9A99B0990F0B0B9BDBBB9F9FFBF9B9FBF9BF9FB9B9F9BDA9F9B9B9BDFBBDBDF9BF9EBD9BBDA99B9FB9A99C99B9A0F0F000000B0009FFFFFFC000A9A9E09A90B00CAF90A00B0B009000090B0B09B00B0009ABDBE9A099B099CBF9FBBF9FBBD9F0F99B099A9090D9BE9A99FBFFBDFBFFBF9AF9EB9F9F0BCB9B9ADBDAFB9BDBBB9BF9BB9BFBD9B9BE9B909009BE9A9F0B00000B000A9AFFFFFF00090C0A09AC0A0E0B0FA09A00009A000B0A00B09A00B0A9A009A9BADBA00B09B9BFBFDBE9BDBBB9B0B09E909A90B099F9FB9F9BFBF9B9F9FB9B9F9BA9B9B9BCB9A9B9BDBFBDBDBF9BF9FB99AB9E99F9FB09B099F9A0F00A9A000A90A9FFFFFFA000A9E90E09AD0B000F9A0900B009A00000B00B0BBA09000B0A9A9B00B0BD909F9F9BF9BFBBDADBDBDB90B0909090B0B90BDBFF9FBFFB9B9DBF9BD9B0D909B9BDB9F9FB9BDBFBDBFDBB9FBF9F9BB0BB09F099A99F9B0F0000B0B0EB0A9FFFFDF0000A0A90AA0A00BE0F0900A90B0009009000B0B0090A0B0009ADA0B0090B09ABFBFF9F9909A9B0B0000909A90B09090B99BB9BFBDB9FADBB0B9A9AD9B0BD090B9AB9BDBFBBDBBF9BF9F9B9B9BDBDBC9B090009A90F0B0B0000ADB0DBFFFFFFA00009E9E0D09CBC00BF00A090A90B00A0000B0009A0A90000B0A9A90A9AB0909F9BF9AB9A090909009A900000000B09B9FAD9FF9FFBF99BB9DB0DB90B0900B9F09BDAFBDBFDBBFDBF9BBE9BFBCB0B99B090A999F9B0B0E00A0A9A0FAFFFFFFF000B0EB0B0A0AB0A0B0F9009A99E009090A00009A09000000000900A9000D9009BFDBFBDB9F000000000A00000090000D099BA9BFB9F9BF9DAB0B9009090B9909BDB9B9BBDBBFDBBBDBF9BF909B9B0F00B00900B9BCBCA9000900DBE90FFFFFFC00009EBCB0BC0A9AC0FA9000A909A00000000A09A00000000000B00A9A9AB09A0BF9BDB090B00000009000000000009A9A99F9F9FFBF9BA99D90B9A900000A909B0BDBCBBDBBBDFBBF9F9BFBFB9F9B9009009009B9A9E0A9000A00BEBBFFFFFB000AD9EB0E0B0CA0B0F000A9CA9A09A900090000000000000000000000090909DB9FFF0FB9090000000000000000000990DA9BBFB9B9BC9B0B0000009A90909A90F9BB9BDBFDFBBDBDBBFDB9B0F09F090009099F9A9E9A00A0000B000FFFFFFC0009AE0BE9A0A90F0AF00090A90090000000000000000000000000B000000000BBFFB9B9909A900000000000000000B009B9BBDB9F0F09B0B9000090000000000B9B0DBFBF9BBBDBFBBF9B9F9F9BB000009090B09F0BC00000000009BFFFFFB000A0E9BC000F00A000F09A0000000A000000000000000000000A90000B0000009EB9F0FADB90B0909A00000000000909B090D9ADB9B9B09D0090000B0000000900009A9909BF9FB9F9F9BE9BB0B0DB90090B0999A9E0B0B00000000A0FFFFFF00009A0A0A9A0AC9ADAF0000A90A9009A00000000000000000000000B0000000099DBFB9BB0F90B0B090D99A90900900009A9A9B9AD09DB0B90A000000000000000000000B090B9EBBFBF9BF9BDB9B09B9A90B0F990BDAC000009A0009BFFFFFF0000D0CB000900A000F0090000000000090000000000000000000A00000000000FB9BDBD0B9A999090B000900A09A090909990D099B0B09009090000000000000000009A99B9FB9F9BDBBDBBCB9A9FBC99F999B09B0A90A0000000000FFFFFF000A0A0A00E0A0A00A0F000090A00A00000000000000000000000090000000000BB9E9FA9BF09DA09A909A90090900909A9AD0B9B9A0909009090090000000000000090099ADBB9BFBDBBDBBDB9ADB099B090FB099E0BCB0000000000BFFFFFE000900B00B00CA9CB09F000A000090000000000000000000000000000000000000DBBF99F09B0B9B0DA90900B00009000909A9900099B09A9A9A9009090909A9A9A9909B0B90BCBDB9BDBBF9A9E90B9A90B9B9090B9E9AC90A0000000BFFFFFDA000E00AC00B000A0A0F0A90009000090000000000000000000000000000000009AD9FA90B0DB0D0B090B099090B00B0909090B9BDA9090909090B00A9A9A9D09090CB09D0B9B9BBFFBBCB9BDB9B90BDB090FB0090B0E9A00000000000BFFFFFD0000BC0B0A0B0B0C9AF00000A00000000000000000000000000000000000000009BB090009A9B0B90B090A000909009A9B09B090909A90090009090909C90B9A9A9B09A9B9E9BC9B9ADBDBF9AD0AD0909AD900999E9A9CB0000A0000BDFFFFFA00B00A90AD0E00A9A0F00009000A0000000000000000000000000000000000000BE9F0000000000000000090B009A900909BC90B9B9C9A90A90B00909A9A900909909B9B0B9BDBBFBDBBBB09B0B990B9099B0909A9A9EA000B000A90FFFFFF000000F0ACB0A09ADA0FF090A0000900000000000000000000000000A000000000099B9F00000000000000000009A090B9CB09B9F909A909009090090B0909A9B0F0B9AD0BD9F0BF9BDB9DBDBE9900A90A9B00000B9ADA09A000009000BFFFFFF0000A09A9A0B0A0A0B0F00000090000A09000000000000000000000900000000000F9B0B000000000000000000090B90B99B09A9BD09B0B090A090A909A909A99990B9B99AB9F9BE9BFBA9B99A9A9009009900099E90FBC09A00A00B00BFFFFFF0009ACB0F9CBCB0F0BF000900A00009000000000000000000000000000000000009ADBD00000000000000000000BD0B90BCB9B90B9B090D0B0900900909E990B0BF9E9AD99A9BF9FB9BDBDA00000000000A099DA00A00B0000900000BFFFFFE0009E0B0E0A0A00E0ACF000009009000000000000000000000000900000000000009B9A9A000000000000000009090B9EB9B9D09F9BCB09A90900B00B0A909CB9F0909A909ADBD9BBDADB9A90000000000009B0B00BCBF0A00000B00BDFFFFFB00000B0F9A9E90B0B0BF090A000000000000000000009000000000A00000000000000F9F9C000000000000900A0F9B0B99F9AB9A9A999F90B00B00900090B0B0B0B0B090B09B9ABF9B9B9B900000000000000090000B00D009A000000BFFFFFF000A9E00ACA00AC0AC0F0A090A90A9A90A900000009000000000000000000000000009A9AB90900000000A009909AD9EB9AD9BDB9DB0B0B90900000000000090090000000009F9F9E9BCBCB00000000000000000090AFA0B0000000000FFFFFCB00009E9A90AD0A90B0F009000000000000000900000000000000000000000000000099F99ADA9A9F0F0B99B0F9B9BB99F9BBDA9B9A9F99E9A9000000000000000000000009A9B9BB9F9B90000000000000000009A0D09E000000B000BFFFFFF0000A0A00A0CA00E00AF00A0090090009000000000000000000000000000000000009A9A9E9B9F9F0B99BDAFDB9ADA9DBA9BC9B9E9BDB0B909000000000000000000000009FBDBCBDBB090000000000000000000AC9ABE0000000000BCFFFFFA0000090CBC0B09A00BCF0900000A009A090090A00000A900A009009000000000000009F9B9BDA9E9BDAF9BF9A9FB9DBAD9F9BBDB9F9B9F0B9F0990000000000000000909A9A9B9B9B0D9A000000000000000000009AD00B0000000000BFFFFFF000B0E9A0A00A0CB00AF00090A900A000A00000900000000090000A0000000000000009ADA9BDBBF9BDBE9BF9F9FBBDBB9BF9BADB9F0B9BDA9BA9A900900900000000009DBDBCBF9F9A9000000000000000000000A0ABC0B0000000000FFFFFDB00000A009AC0A00E90F00A000000909A900A00000900000900A00000000000000000A99B9B0B9DABFB9FBF9BFB0F9F9F0F9BDFBBCBBDBDB9F0DB9F0B00000090000B9FAB9B9B99A9A900000000000000000000009E9CB000000A0000BFFFFFE0000F00DA009A00A00AF0000A90A00A0000009000A0090B000090090000000000000090BC9E9F0BBDB9F9BDAFB9F9FA9BF9BCBB9DBBDB0B9FB9BBCB9D09ADA90009B9EB99E9F9BE99000000000000000000000009A00B0E0000000009FFFFFFB000A000A0C0A0DA90E0F090900909000909000A090000009A00000A00000000000000090B9909BD9BDABF9BF9DBFB9FBF9FBB9FBBF9BF9FB09FADBDABBF9B90FBDB0F99FB9B9E990000000000000000000000000ADA9E09A000000000BFFFFFC00090E90A9A0A00A09AF00A00A0000BCA0A000000090A00009A0900000000000000009A90B0B09A90B9DAF9BBBDBDB9B9F0F9B9CB9E9BBDBBF9BB9BDBD9FBFB9B0F9BFB0BDAB9B0B000000000000000000000000000A9AC00000000000FFFFFFB000A00E00C90AC0A00F0009000A000090909000A000900000000000000000000000000000090B09F9FB9BF9F0B9ABDBDBB9BDBB9F9BDBA9F9BD9FBF9AFBCBDAF9BBDB0F9B9F9E900000000000000000000000000BAD0F0B000000000BFFFFFE000009A09A0A090B0CAF090000900B0B0A00A0B0900A00A90000000000000000000000000000009B0B09BDB0B9FB9DB0BB99E9ADBBBDBB9F9BDBFA99BFBDBDBF9FBDA9F9BCB9A900000000000000000000000000F0C0B0A00000000A9FFFFFF9000BCA00A0000CA00B0F0A0A0A000000909000000B090000A0000A0000000000000000000000000099BF9ADBDB9C9A9B09CB99B99C9A9DB9FBA9BDBFB9DBBBB9BA9BF9B9B99F90900000000000000000000000000B0B0E9000A000000BFFFFFE0000900BCACA9A0E00AF00909009A9ADA000900000000900000000000000000000000000000000000090B9B9A9A99909F9B0B09A9B99BADB0DBF9B9BFBBDBD9F9DB9BDBCBB0B9A00000000000000000000000000A0F0B0AC0000000000FFFFFF900A0AC000900090BC0F00000A90000009A0A09A9A9A0A0090009000000000000000000000000000009FBCB09090A0B090099F99B0BC99B9BB9B9FBC9DAB9AB9BBBCBB9B9DBDA90000000000000000000000000B0F00AD0B000000000FFFFFFE000009A0B0A0E0A000AF00B0A90000B0B009090000C0909A00A00000000000000000000009A0000009A909000000090909BDA90B0D9B9BADBDB0FB9BBBB9FBDAF9DBBDADBA9A9000000000000000000000000000F00BDAA000000000B9FFFFF9000BCA00CA009AC00A9F0009000A900009A000A00A9A0A0000000000000000000000000000090900009B000000000000B09099BD9AB9AD9B0BDBBCBF9F9FB9BB9ABF9B9B9DB9000000000000000000000000000B0B00A9C0000000000FFFFFFE0000000B00DA00B0BCAF900A9E000A9AC090B09090090DA900000A00000000000000000000000A90000000000000009009A9A90B99BDBB9FB9BDB9B9F9B9F9F9F9B9E9F9AB0F9B0000000000000000000000000CA0F0CA9A000000000AFFFFFF000A9AC0A000A000000F0090009000009A0000A000A0A000A0900900000000000000000000009009A900000009000000090990B0BCB09CB99E9B9FBDABDA9A9B9BDB9B0BD990000000000000000000000000000B0F09A9E00000000009FFFFFB0000C09A09A0D0E0A9AF0A00B00A9009A00B0B09A90909A09000000000000000000000000090A090000000000000000900B9CB999909BB90B9B0F90B9DBB9FBF0FB9BDB9A9A900000000000000000000000000BCB0AA9E09A0000000BFFFFFFC00B0B0A0E00A0A090E0F0090000009A0000000000000A09C0A0000B000000000000000000000090B000000000000000A009A990F0B9F909BDBDB9BBDBBBDB9B9BB0F9AD0909A000000000000000000000000000BCB0DA9AC90000A000FFFFFFA00000C009E00090A000F90A00A90A00B0BC9A9E909A900A90009A0000000000000000000000000900000000A0009A00900090A99B0B0BDB0B0BDADBBDB0BFBCBDB9BB9A9A0090000000000000000000000000000BCA09E9A00B0009A9BFFFFFF000A0B0A00BCAA0CB0AF00909000090C000000000A00E900A9000000000000000000000000000900090909A9000090000090B99A9D9B9A9F9B9B9B9CB9F999B9B9F9CB9090000000000000000000000000000000E9BCA9E9EB0E9AC00FFFFFFF0009CAC9AF0A9CB0AC9F0A00A0B09A00B00B0B0B009090A0900009A00000000000000000000090A00A0000000000000000A90DA9A9A9E9B9BCB9FBDBBF9BBEB9E9B0B90B0000000000000000000000000000000B9ACA9E9A9CA90F0BFFFFFFF00000A9BEF0AFCBE9E9AF09AC00C000B00900000090A0A090000B000000000000000000000000009009000009090000000909B099DB99BD9E9BDBA9BF99AD9BDB9E9B9AD909000000000000000000000000000000E9A9E9E9EBDAF0BCBFFFFFFF00ADAECB0FDABE9E9AFF000B09A09009A0B09E90009090A90A00000B00000000000000000000000090B090B09E900900000099A9A9E90BB9B9AD9F0BF9FBF9BF9BE9D9A9A000000000000000000000000000000B0F00A9ADACBCBCA9CBFFFFDA000099EFFAFDADAFEDAF09000009A0909000A00A9000000009000B0000000000000000000000000000000090B09A00000009A090909B990BCB9BB9BDBB9B9AD9B99B0B9090000000000000000000000000000000F0BCBCBE9FADA9FAFFFFFFFF0000AE9F0F9EFBF0BFFF0A0A9A9009A0E0A900900A00A9CA0009000C000000000000000000000000090009A000900000000009A09A9ADAF99BDBCBDBE9F0BF9BADB090000000000000000000000000000000000BCBCB0AF9FADAFFE9FFFFFFF000B0F9FAFFAF0FCBFE0F909C000B0009090C0A0A00090A09C00A00B00000000000000000000000000000009090A90000000000900909999ADB0B99BF9B9F99A990090A9000000000000000000000000000000000B0A0BDAF0FBF9E9F0FFFFFFE0000EBCF0FDFFBFEDBFF0B0B0F009A00B00B00C09000000A090000000000000000000000000000000000000009000000000000000000A099A9DB0B0BDA9ABD9E9B0A900000000000000000000000000000000000CBDACB9EBCF0FBEBFFFFFFFB000B0FBFFBEBCF0FADFF0000000B009000000B000A0009000A00900B000000000000000000000000000000000000000000000000000090A090B0F9F9B9D990B90909000000000000000000000000000000000000BA09A0CBCBAFBCF0FBFFFFFC0000BCFEBCFFFBFFFFAF00B00B00000000B0000B00900A0090000A0000000000000000000000000000000000000000000000000000000009A0909A900B09A900A000000000000000000000000000000000000009E09E0FBE9ADE9E9ADFFFFFF000A9EBF9FFBCBEF0F0FF00090000090A9000B0000000000A0000000000000000000000000000000000000000000000000000000000000000090B090B90B09A909000000000000000000000000000000000000000BCA0B009E9A9EBCBAFFFFFFA000CBCFAF0FFFDBFFFFF900000090A00000000000000909000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0B00CBE0ACBE9E00DBFFFFFD009A0BCDAF0FAFCBE9EF0CB0B09AC900009090BC900A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0CBA09ADADEBCB0AFFFFFFA0000BEBAE9EBDEBE9EBFAB9EDAB09A9B0B0FAF0B0BF90B09A9F0ADAF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F09A00DAF0BFADA00FFFFFFF0000F0CBC9E9FEBF0FADFDFFFBDFFBFCB09FBDBFDFF0FFCB0DADF9FF9F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0A09ABDAFE9FA0A0BFFFFFF00000ABCAEBEF9E0F0FAFBFFFFFBDFBFFFADFFFFBFFFBDBFBFBFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ADADA0C0ADBFEDE90D0FFFFFFF00A9CA90BCBEF9EAF0FFFFFFFFFFFFFFBDBFFFFFFFFFFFDBCFFFFFFFFE000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0B00F0BFAFCBFA0EABFFFFFF00000A9EADAFDAADADAFFFDFFFFFEBFDBDAFFFFFFFFFFFFAFFBFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCAC0B00BCFFFFE9FADFFFFFFF0009CBCA9E9FAEDA0FAFFBEBFFBDBDFAF09FBFFFDFFF9F9F9BDFFFFBFBF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B9BC0A9EBDEBE9EADADFFFFFF000A0A0F0BEDE9A9FADFF9BC9F0F0B9F0B00DADAF0FBE9E9A9A9FADFCFDA00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E0A090E9EBFCBE9EBEBFFFFFFF0009CA0FCBEBE0E0FAFF00B00A90000900B09A90B0090B0D00B09A9A9A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0F0BACB0BCBADAE9E9FFFFFFF0000A0BCABFCF0F0FADFF00000000A9000000000000000000A9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0B0BC090ADABCEBDA9EFFFFFFCA0090BCAFDEBABCBADFAF0900090000A000900900009A0090909A0900A090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0E09A0BDACE9A0ACABFFFFFFF000ACAFDBEBDEDACFAFFF000B00090000900A00A09A0090A00A00000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F00B0BC9E0A9B0E9E9AD0BFFFFFFF00090AAFDEBAFFAFDAFF0A0000A000900A009000000000000909000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009A9ACBCAA0BCACB0E0ACAFEFFFFFF0000A0FDAFBCF0ADBEFFF090909009000009000000000000900A00A0000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009E0E0B0A90D0B0F0F0BCBF9FFFFFFB000ADBFADFCFBEFFE9E0F0000A00000A0000000900900B000A0909090090900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A09AD0F00A0ACB0A9ACB0EBFFFFFFF00000E0FEAFACBDAFFBFF09A900B0B00900000A0000A00000900A000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FA09A00BC0B09ADACBACBCA9FFFFFFE009A9F9FDBFBEFDADEBF0000090000000A900000A00000000090909000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B09E00F00A900ACA9AC0B09EFFFFFFE90000EAEFAE0E9EBFEBCF000B000000000000900000000900B0A00A009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0CA09A0A9000E9A9E00B00E9BFFFFF9000ACB9F9ADB9FAFCB9EF00000B0090A00000000900900A000090909A0009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AB09A0C90ACA900CA0B0CA00ADFFFFFF0009A0E0ACACACA9ACA0F0090009A00000090A000000A00000000A9090900A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0DAE0CB0A09000A9090CA009A9AFFFFFEF0009A9E9A9A9ADA9ADAF00A0900000090A00090A0000000900B090000A00000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009A90B00090A00A00ACA090A000FFFFFFF000A0CA0ACACACA0E0A0F0009A0009000000000000A009000A0000A0B090A900A0BC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0EACA0A00E000900B00000AC00ADBFFFF90000CB09E90A9A9E9E0FF0900009A00A00900900909000A00090909000090000009FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009AD00A90000000C00B0000A09FFFFFFE000B0ACA0ADACACA0B00F00B09A000900000A00A000000000000A0090B0000B09A0BFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0F00A0D00A9A00A0A0000A0090A0FFFFFF9A0090BCB0A9A0BCA0FAF000000909009A00009000A09000900090A0000B0000009FFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000E9090AF00A00000009009000090000FFFFFFF000CACA0AC0E0F0A9E00F9009A90A0A00009000009000C000A900009A9000900A9ADFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000009A00A0AF00B00BC0A000000A0000A0A9FBFFFF0000A0B09E9A09A0BCA0FFADBE9AD909F9B0F9ADB0E9AB0BBC9ADA9AD0F9B0CBC90FBFFFFFA00000000000000000000000000000000000000000000000000000000000000000000000000A000A009ADAD0BACB00A9090A0A0000A00000FFFFFFF000900EA00B0E9E0ADA0FB0F9FFAFBCBCFDAFDADB9FDFF0FBE9FFF9ABF0F9A9BFADFFFFFFDB00000000000000000000000000000000000000000000000000000000000000000000A0000000ADACA00BAFC9A0E90A0E0090A9A0D0A90A9FFFFFF90A0E90DA0CB0A9E9ADAFFFFFF9FDAFBFBFFDBFBEFFBFDFFDFFF9FEDF0FBE9FE9FBFFFFFF0E0B000000000A000000000000000000000000000000000000000000000000000000A00000009E9A0B0FACB0BE9E9AE9A09A0E90CB0A9CA9FFFFFFE00009A0A0B00E9E0BCADFFFFFFFFBFDFFFFFFFFDFFFFFFBFFFFFFFBFBFFDFBDBFFFFFFFF0FBDE0000000000000000000000000000000000000000000000000000000000A9000000000A0BE0A9CBCBCB0FE9E9AF90F0ADA90EBACBCA9EFFFFFFB0000ACB0F0EA9A0BCA9AF9FBFFFFFBFFFFDBFFFBF9FFFFFFFBFFFFDFFFBF9EFFFDBFFFFFF00A9FAC00000000000000000000000000000000000000000000000000000A9CA0A0090A9C9E90F0FAFADA9EB9EB0F0AE9F0A9EFBCFBEBFEBFFFFFFC000B0BCA0A90E9E0A9E0FFFDFBFFDFFDBFFFFFFFFFFFFFFFFFFFFFBF9FFFF9FBBEFFFFFFFFBCACBA000000000000000000000000000000000000000000000000000000AA900BCA09AA0AEB0BCBCFAFE9EF0FE0F9A0A9E90AFBCF9E9F0FFFFFFFB000CA9E9EA9A0BC0A9AFFBFFFFFBFBFFFFFFFFDFBFFFFFFFFFFFBFFFFFFBFBCF9BFFFFFF0CB0BCF00000000000000000000000000000000000000000000000000000F0DACBCA9EAC9E900F0FBFADA9E9AFA9B0E9E9E0AF9EFBEFFAFFFFFFFFE0000B0CBA9CBCBCBADACFBFFFFFFFFFFFFBFFFFBFFFFFFFFBFFFFFFDFBFFFDBFBFFFFFFF0FB0ACB0AC00000000000000000000000000000000000000000000000000FA0A0B0A9E909AB0EFBEBCE9E9EBEDA9CACB0B0A9F9EDBCBDAFCBFFFFFF9009E0FBEDEBEAE9ADA0BFFDBFFFFF9FBFFFFFFFFFFFFFFFFFFFFFFFBFFFFFBCBDBDFFFFFF00F0B0F0BA000000000000000000000000000000000000000000000000B0BCBE0F9E0BEAD0FB0F0FBBFBEBDFADAA9A0E09CA0ABAFBFADBBFBFFFFFE0000B0E9A9E9BDAE9AF0FFFF9FFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFFFFFBF00F0F0E9CB0000000000000000000000000000000000000000000000BCBCB09E0A9E09ABE0EBCBEDE9E9EA0FADAC9A9A0B0F0CBCBCBEDEFFFFFFFF00A0CB0FAF0ECBDBEDAFFFBFFFBFFBFBFFFFFFFBFFFFFFFFFFFFFFFFBDFBFBDBCFFFFFFFFCBF0F0FBEBCB0C000000000000000000000000000000000000000000BCBE0EBE9E9E9BE9E9FBCAF9AFEBE9FFADA9A00000000BADBEBE9AB0FFFFFFB0000B0F0F0FBBEACBADAFFFFFFFFBDFFFFDFBFFFFFFFFFFFFFFFBFBFFFFDFDABFBFFFFFFF0B0FBEBCF0F0FA900000000000000000000000000000000000000ACBCBCA9BC9A9EB0E0F0FACBFDAFF9F0FAE9EBCBC0B0CA9A9CBE0F0FADFFFFFFFC000B0E0B0E9ACA9FADADFFF9FBDFFFBFBFBFFDFFFFFFFFFDBFFFFFDFFFBFBFFDBDFFFFF9E9EF0FDFBFBFF9EDAD0000000000000000000000000000000000A90B0A9ADACBEDABCBDBEBCBF0FAFDAFAFBDBFADA0B00A900EAFADBCBADABFFFFFFB00009ABCA9ACB9EA9EB0FFFFFFFFBFFDFFFFBFBFFFFFFFFFFFFFFFFFBFFFFFBFBFBFFFFFFA90FAFBCFCBEFBEBEFBE90000A000000000000000000A9009AC0AF0F0EDA9A9A9EDAEADAFBCAF0FAFFCBCAE9EDADA0F00AB09ADFAFBCB0F0FFFFFFF00A0C0A9E0B00E9CB0FAFFFFBFBFDF9FBFFFFFFFFBFFFFBFFFFDBFBFFDFFBFDFF9FFFFFFEDAF9F9EBFBFDADBDF0E9EBE9E9000A000A009A00090AC0AA00B0D0A0B0A9EFCAF0BDBDADADBF9EBDA9FEFBDEBAFADA0AF0CBE9EBDACBEA9FBFFFFFE009CBADA9ACAF0AB0E00FFFFDFFFFAFFFF9FF9FFFFFFFFFFFFBFFDFFFFBDFFBF0FFFFFFF9BADAFEFFCFCBFFEFAFBFDADAF0E9E09009CAC09A0A090A9C9AC00A09E0F0E9ABDAFAEAFADAF0EBDAFFE9BCAF0FC9ADAF09BE9EBCBEB9E9FEFFFFFF9000A0CBCAD0B00F0E90BFFFBFF9FBFBF9FFBFFFFFFFFBDFFFFFFFBFFFFFFFFFFFBBFFFFFE0DAF9F0FBFBEDADBDF0BEFBCBDBE9FADA0A99A09000A900A009A09E00B0B9ADFEBCDBDADADAF9FADBCBFEBDAF0BACB09EAE0BCBFE9FEBEBFFFFFFFE0000FBCB0AACAF0EBCA0FFFFFFFFDFDFFBFFFBFFFFFFFFBFFFFFFFFBFFFFBFDBFDFFFFFFBF09EBFF0FDEBFFAFAFFCBEDBEBCBE9EBCBCAE9EACBC0E0B09A00000B00E0E0B00BAA0F0FAF0AF0FAFBE9E0F9EBCB0FEADB0F0BCBFEADFBCBFFFFFFB00B00EBCF09ADAF90BCAFFFFFFBFBFBFFDF9FFFFFFFFFFFFFFFFDBFFFFFFFFBFFBFFFFFDF0BFBCFAFBEBDADFDF0FBF9EF9EBDBADA9A9F9E9F9A9B0BC0A000A0000F0B0BCAF0DADAA9E9F9EAF9EF9EBDAE9E9AF0BDA0DA9EBE9BDBEDFFFFFFFFC000CB0EB0FADADAEBCA9FFFFFFFDFFFFBFBFFFFFFFFFFFFFFFBFFFFFFFFFFDFF9FBFFFFFA0F0CFBDFEDFEFBEBEBFADAF9EBCBEDADACF0EBF0EDAE0F0BC0B090A9A000A00900A90A9CB0AE0BDAF0FADAADB0EF0BCAADA0E9ADFEFEBFAFFFFFFFB00A9ADB0FADAFADBCA9EFFFFFFFBF9FFDFFFFFFFFFFFFFFFFFFFBFDFFFFFBFFBEDFFFFFF0F0FB0FADBE9FBCFDBCFDADFADBFCBBCBDBAF9FCFB0F9F0F0BC00A00C90A9C9A0A90A9C0A0E90F0E9FACB0E9AEF9AFCBC9A9A9EFEBFBFCFF0FFFFFFC000ACA0F0FADADAE9AF0FFFFFFFFFFFBFBDBFFFFFFFFFBFFFFFFFFBFFFFFFFBDBFBFFFFFF0B0FBEDADBE9FBEBEBEBFADBEDABCE9EAD9EBABCFBCB0F0F0B090B0ACBCA0A9C0AC0A0B090A00B0ADB0E90F9ACF0B0BAC0ACB0B9EDEBFAFFFFFFFFB0090BCBEBCBEBE9EBCAFFFFFFFFFFBFFFFBFFBFFFFFFFFFFFFFFDFFFFFFFDFFFFDFFFFFF9E9EDADBFEBDACDBCBDBCBDADABDE9BE9BAF0FDEBF0FADAF0BCACAC9A9A90BCA0B0B09000E090BC09A0F0A0ACBA9E0E0CB0DA0FFEFBFDEF0FBFFFFFE000A0BCBCBE9E9E9CBDAFFFFFFFBDFDBF9FDBFFFFFFFFFFFFFFBFBFFBFFFFBFBFBFFFFF9EB0FBFFFEBCBEBBAF9EAF9EBEBDEBBEDACF0F9EBF0FADAF0BCB09A9ADADAFC9ADAC0F0E0B09A00ABE0F0A0DA9AD0A9A0B0A0BDE0FBEDAF9FFFFFFFF00A0C9EBCBE9E9EBEABEBFFFFFFFFBFBDEBFBDFFFFFFBFFFFFFFFFFFFFFBFFFFFDFFFFFFE90FEDFEBDFBE9FCF0E9F0EB0FDABDE9ADB0FBE9F0F0F0BCBCBCA0DACADAF0BEDA9AB0A9ACA00E90090A9CA00E00F00D0009E0ABF9CBEB0FAFFFFFFF9009AB0FADAFAE9E9FCFCFFFFFFFFDBFBFDBFBFDBFFFDFFFFFFFFBF9FFFFFFF9FBFBFFFFFFA9FBFDFFFDFFAF9FBE9F0DA0ADABCFAADB0CBEBFAF0F0BCB0BCB09B0F09E9ABCBC9E9E90BCB0A9E0F0A90A90B00A0A0F0A09C0AAF00FACB0FFFFFFE0000CBCBE9CB0F0EBABFFFFFFFFFBE9FBFF9FBFFFFBFFBFFFFFFFDFFBDFFBFFFE9FFFFFF0DADEFBEFAFBDFFEFFDEFBADBDAD0B0D9ACBBDBCBDBCBE9BF0F00F0E9AFA9EDABCBADA9EBCB0E9E9AB0F0A90A00B09000009A0BC90AD00B0FFFFFFFF000A9EBCBEBCFAFBCFCAFFFFFBDBFDBFDF9EBDFFBDFFFFFFFBF9FBFBFFBFFFFF9FFFFFFE9A9FBFFFFFFEFEFBDEBF0FCB0EA9EBCBAE9BCBEBCBEBCBCE0F00B0A9ADADE9A9CBCF0BE9CA9E9A9AF0F0BC0BC9E00A0A000000000A000B0CBFFFFFF000BCAB0F0ADABCBCFAB9FFFFFFFFBFFFBFBDBFBFFFFBFFFFFFFFFFFDFFFFFFDBFBFFFFF9E0FEFCFFDFFFFFFFFFFFFBFFF9FFADAC09ACB0BDADA9E9BBDA9AC9EBCBCB0F0FADA9AD0BA9E9ADAD0FAD0BCA0A9AD0D00B0A0900090A000A9FFFFFF00009C9E9ADAFCBEB0FCAFFFFFFFDF9FFDFFFBDFDBFFFFFFFFFFFDBFBFFFFFFFFFDBFFFFF9A9BFBFAFADFF9EFBDEFDEBCBF0FDBFBF0F9EDAF9ADA9ECBE9E9A09A9EBCB0F0F0F0FAF0F0BCB0FAF0FAF0BCBDA0A0A900C0000A00090090AFFFFFFF000A0A0ACA9ABCBCB0BCFFFFFFBFBFFBFBDBDBFBFFFFFFFFFFFBFFFFFFFFFFBF9FFFFFFCBC0F0FFFFFFAFFFFEFBFFFFFFEFFAFCBCB0A9A9E0F0BCBBCBCBC0F0F0F0BCBE9AF0BCB0F0BCB0F0BCBDADACBCA9E9E9EB0B0B0A90A00A0009FFFFFFA00A9CB0DA9CBCBCBCBCBFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFB00BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0F0BCBCB00B0B0F0BCBCB0F0BCB0F0BCB0F0BCBFADA9A9A9E9A9A00000000000000000BFFFFFF00000A00A00A00A0A0A0A000000000000000000000105000000000000D4AD05FE','Michael is a graduate of Sussex University (MA, economics, 1983) and the University of California at Los Angeles (MBA, marketing, 1986). He has also taken the courses "Multi-Cultural Selling" and "Time Management for the Sales Professional." He is fluent in Japanese and can read and write French, Portuguese, and Spanish.',5,'http://accweb/emmployees/davolio.bmp'); + +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(7,'King','Robert','Sales Representative','Mr.','05/29/1960','01/02/1994','Edgeham Hollow +Winchester Way','London',NULL,'RG1 9SP','UK','(71) 555-5598','465',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FEDECDACFEFCEADE0ECECBCE0CEFEFECFFEFCFEEEDEFEFEFCDEBCEFFEFCFEDEFCFEFECFDEFFC000C0A0C0CE0EDFE0FCE9FDFCBF9F9FCFCEFCF0FC000000EFCE0CE0CE0FCBE0F0EDECACBCAECACEF0FCE0FCCACE9E0FEEDE0E0E0EEDACEC0CEDEFCACAECE0CAEDEECFCACFCEDEFE0EDEFECFCFEDFFEFFFCFEEECEEFCE0EFEDFEDEFFEDFEFEFE900000C9E9CADEFE0FCBDFCBDBD0FCF9F9FFDEFFCAF0000C0CADCAC0E9ECACCFCECACADECEDEFCF0EECACECAEDE0ECECEDACFCFCEDEACF0FEF0EEFACEDCADEFED0ECBCADEEEFAEEDEFEEFCFEEFEFEEFEFEFEDACBCF0EFEDE0FEFEFECFEEFEFFF00C0CE0EC0EDEFACFCBDBCBDFE9FDB9E9E90EFFCAC0CA00C0EFCACCECEC0ECACE0FCEDECBCAC0E0ED0CEDEBCDE0FCF0E9EEFEE0E9E0DE0ECACEFDFCCCAFCEECFEEFCECECE9ECFCFEFCE9EEFEDEDEFDEFFFEDEDECEEFEDFEFEFEFFCFFEFDEFDEFF00000DE9ECEFEDE9EDADFDAF9F09EDF99CF9EFFFCAC0900CC0EC0E9CACE9CF0EC0F0E0ECFCFECFCEEBCACCEACECACECECFCBCFCECEECFCEDEDEEFEBCECBC0FCFCAF0F0ECEDEEFCFEFEFEDEFEFEFEFFEEFFEACEFCFCEEFFCFEFCFEEFEEFFEFFEFB0C0E0F00DEBCE9E9FDADBDCF0F99ADEB90D0FEFFDECA000ACDAC0ECDACE0EC9ECECFCFE0ECBECADCECEBCCE9ECECADEACECFACBEC9EE0FCEADEF0CEFECEFEEBEFCECEDACAEDEAFCEDECFEDACFEFEEDFEDFCE9EE0EDFEEFEDEFEFDEDFEFFEFFF00000C0CFEFCDAD9E9EDBCFBDF9CBD99C9F0FCFDEFBCC000CCACFC0EACCACCACCACAC0E0FCECCBCEADACCE9ECE9E9ECEDEFEDEFCCBECDEEBEDEFFCAC0CEFEFDECCCAC0EECEDECFCFFEFFEFEFFEDEFFFEFEAEDEECFEFEEFFFFEBEDEEFEFFCFEFCF000CAEEDEBCBC9E9CBDADBDE9A9C9CE9E09D0FEFCFE9A00CACF00E0CCADCADEADEDEEDECE0FEECFCECFE0ECE0ECECF0ECADEECFEECFAEDEDEFEFFCBCAC0CEEFEBEDEF0CBCAEFEFEEF0EDEDECFEFEFEFDEDCAEDACFEFFDEFEFCFEFFFEEFFEDEFFBC00CDFAFCBDAD9CBD0FDCBFDF90A99C9FCBCBCEFCFED000CACECCEDACE0E0CCACAC0EDAFCAC9E0E9E0DECACFCACACEDEFEE9E0F9EECFEEFEEDFFFEFCBC0C0CECEACEFECECCECEFDEFEEFEFEFEFDEFEFEEFCCECEFFCFEFEDEEDEECFFDEFFFEFEFBC0EEDCBC9C9E9D0FDAF9CBDAD9C0BD090D0D90EE9EFE900CBCBC0EC0CECE0ECECFE0ECECFECEFCECEACEDE0ECFCE0ECE9EEDEEEDEF0FCFFFAFFEDFEFEFBCAD0CCE0EDF0FACFFEEFCFCFCEDEDEFEFFEF0EEF0EFDEFEFEDEFFEFFFEFEFEFEDEFFC00CB0BC9E9E9E9F09D9EDDADBC90C0FCF0F0E0DCEDEF000CCEC0E0CE0C9CECBCACCFCBCBC0F0CACADCE9CACC9E0FCFADECFECFCEBCEEFEB00FEFEEDFCFCEDEECA9CCEEECCFECEDEFEFAEFEFEFEFFEDFEDACEFFEFFFEFFEFCEFCEFEFEFCFEFFEFFCE0FC9E9E9CDBC9E9E9FADF09A90B9090D099CAFEEDA900EF0E0CE0CACE0DECFCBEECECEECEECDECE0CECFAEECE0ECEEFACBCEFCEDFFB000FFCFFEEFEEFEE9FCEF0C0CFE0EFFEFEDEDE0FEFEFFEFE0ECEDEFEFEFEDFEDEFFEFFEFCFFEFFFCFEFF0D09E9D0F9ACBD0F9E9DE9F99C9C0DAD0BC09C0CFEF00CECFCE0C0ECACEACACEED0EDAC0F0DAE0E9EACACC0CBCECFEDEDEEFACFFEF0C0E0FEFECFFCFDEDEEEFCEEBCE0EDEEDEEFEFEFECFCFEFFFFECBCEFEFFFEFEFEFECFFEFCFFEDEEFEFEFCAF0F0DADBCF9DADBC9F0F9E9E0909A0DAD09E00E0CFEB00CFAD0E0C0CC0DEDEF0EEFCACECCECCECECCCFCACECCACBCF0EEDECFCEFFEB000EFFEDFECBEEBEFDECBEDEE9C0ECFEFDEFEDEDEEFEFEDECFECEFCFEFCFCFEDEFFEDFEFFEFFFFFCFEDAD0D0F0DAD90F0D0DBC0F09F09DA00D0090F0909CEFED000FEDEC0CACACECACECED0CACDACACAC0F0E0E0ECACACFCEEEFE9E0FEFFBC90E0F0FEFEEFFEEDEDAEEFEDEEDEFE0CE0FEEDEFEEFCFEFFEFFACEFFFEFEFFEFEFEFEFEEFFEFEFEFEFBCADAD0F0DE9DADF9E9F0DBD9FC9F09C909F0D0900CEFF0CACFEF0E0E0C0CE9ECF0F0ECACEACEDACCE0ECE0EC0CCE0E0FCBCFCEFEFFACA0E0E00FCFCFCEDFEFEDEDECE9EFEDEF0ECEFFEFCADEFEFEFFECF0FEFEFDEFEFCFEFCFEFFFEDEFCFEDECFC0D0F0DBC9E9E0D9F0DBC9E99F0F0BC0000B0C9000CEFFCFE9EF0C0C0E0CEDACECF0EDACCCACCE0EC00CC9EDEBCFCFEFCE0EFDE9E9000000A0FFEFAFEEDECFEFAFEFEDEFACFE9E0CEFEFDECEDEDEFFECEFDEFEFEFCFEFCEFEDEFEFFEFEFFEFCA9CBC9F0F9F9F9F0F0F0DBC9E0D90D09B0D0C90A900FCEFFEFECCFE0E0CE0ECFCACAC0ECA0FCAC0C0ECEBEECACCE0ECCACFFDEFFFA0A00A0000FEFCFCF0EF0ECEDEDEEFECFFECFEFCACFEEEBEFEFFEF0FEFEFDFEDEFEDEFFEFFFEFDEFCFCEFCB0C9CF0DF9EF0FCBDBD9F0D0F9F9E9A9C0D009A90C000EDEFCFCBE0C0CCACEF0E0DECCE0CCEC0C0EFE0C0CC0BC0E0CCBEFFEFEFEA00000000000FFFEEEFEFCEFE9EEFEDECBCECFEDE9C0EFFDEDEFFEFCEFCFEFEEFEFCFEFFEDFEEFFEEFEFEFCF0F9EB9DEBCF9DF9F0F0F0F0F9C9E9C9CA90A900C0900CEBCFEBEEDE0CA0CE9CE0EE0E00CCAC0E0EC0C0E0E0ECEECFFEFEDEFCFF0900000000000FCFFFDEDEEFCEEDE0FEFFEEFEFEFEFFFCCEEEFEFEFFEFEFCFEFFEDEFEFCFEFEFDFEFFCFEDE0909C9DEBDDB0FADE9FDBDBD99E9E9F0F99C900D0900000CEEFDEDECAC0CE0CEACC0CC0ECA0C0ECE0CACECEDEDEDAFE0FCFEFEF00A00A000000000FACFEFEFE9EF9ECEFCEEDEDEDACFCEEFAF0DEEDEFEDEFFEEDFCFEFFCFEFEFEDEFEFCFEDEFBCBCADADDEBCDFDDBDE9E9E9EDAD0D09D0F0B0D00A0090000DCEFECBEDAC0CFC0CACE0EC0ECEEC0C0CACBCBCE0E0EDEDEFECFCFEB00A000000000A0FCF0FFEFCFECEFE9CEDAEFEFEFFEFFDEFCECADEFFEFEFCFFEEFFFEFEFFEDFEFFEFEFEFFE009C99FDBE9DBF0FADF9FDF9F9BDF9ADADB0D0DA90D090000CEAFCADECEC0CACACC0C0E00E0C0C0EADEDECCECADECEEFEFCFFEBA0A0A0000000000C0FE900EFFFECFFEDEFAEDEDEDEDECFEEFFEF0CEEFEFFCFEFEFFFEEDEFCEFEEFFEFDEFCFE09FCBCFCBD9FFEDFFDFBEDF9EF9ED09CBC90D0F09C000000000EDCEFE9E90EEDAC0AC0ECDECC0E9EFCCACADACBCECFADEDEFEAE0000000A000000000AF0F0000FEFFECFAECFCEEFEEFEFFCFFEFFEFF0CCFEFFEDEFCFEDFEFEFFCFFFCFFEFEF0C9C09CBDBDEFE9FBDFBDFDBEDBCFDBDE9D9ADBD0F09090C00000CEBCFCECEC0C0C0CCECF0E0CADCE0CBEDECECECEDAEDEBEDAFC9A0A0A0000A00B00A90BE0A000CFEFFFCFEFCFDECF0EFEFFEDEFCFEDEACCFFEFEFFFEFEFEDEFEFEFEFEFEDEEF9A9CBDEDEDBDFFDFEDFE9FDBFDBDADB9E9CDADAD0F0CA90900000CE0EF0F0FCACACA0CA0C0E0EE0FECCAE0F0E9E0ECFECEEFCAA0C9000A0000000A00A0F09000000DFEFEFCAFEAFEEFEDEFEFEFEFEFEFD0EFEFEDEFEFEFCEFFCFEFEFEFCFEFD00D0FCBDBFBDFBCFFBFFFFFFDEBDF9FCF9FA9D0DAD0990000000000CFE0FCECAC0C0CCACCACECD0EC0FEDCFCEDECFCBC0FFCEA9C0A0A00000000A009A0AF0A000000FEFFEDEFFCFCF0FCFEFDEFFCFCFEFFEFFFCFEFEFCFEFFEEFEFCFFCFEFA90E9CBCBDEFDEFFFFFFDFBDFBCFBDE9E9F9F0DDADBD09F0009000000CE0CFCEAD0CACACACCADE9E0EDACE0CEACE0E0E0ECFECA9000BC0000000000000A090FF0C0090009EFFFECEFEFEFEEFEFEFCFEFEDFEEFFEEFFFEDFEDEFEDFEFFEDEFEFCFC09E9FDFF9FFDFEDFFFFFFFDFBFDBDBDF0F0DB09E9CBC0AD0C090000ACFEE0FCE0C0CCCCADE0CECE0ECBCFACCBCCFCECFEF0B0A0A00A900000000000000A0FEB09A00A0000AFFFECFCFCFFEDEFEFEFEFEFDEFFDEFEFFEEFEFCFEFDEFFEFEDEF0BC90F0F0FFDFBFFFFFFFFFFFFDFADFCBDF9FBCFD9E9DBD9090000000C0C9EF0E9E0CAF0FCACE0F0EDACE0CE9ECAE0CFE9EACA0900AC0A000000000000A000FEDA000090000ECFEDEFAEFECFEEDEFEDFEFEEFEFEFEFDEFDEFFFEFEFFEFEDEFE09C9EFCFDFFEBFFDFFFDFFDFFBCBFDBDBDADAD0B9AC9AD00F0E90000000E0ECECFCC0ECCACACDACCEC0CE0EC0ECADCEFE9E90000A0900A00B0A0A00A0A00000F9A000900000000EFFFEDEDEFFEFFEDEFEDEFFFFCFFFEFEFEFEFEFEFFEDEFEF090D0F9DBFFFFDFDEFFFFFFFFFDFFFDBDEDADBD9FC0D9FDADF9090090000CC0E0FCACACFCACEDCAC0E00CE0CC0ECADEEBCB0A0A9000000A09A000000000000000BE90900A00000000EEFFEFEFEFFCEFEF0EEFCFEFFEDEFEFFEFFEFDEFEFEFCFE9CBCBCFEFDF0FFFFFFFFFFFFBFFBF9FEB9BDBC9E99F9E90F09AD0D000000CACFCADEFCAC0DE0CACEC0ECE0EF0E9ECECFDA000000AD00E000A0A0A000A0E0F0B00F0A00A090000000000CFEDFEFCFFFCFEFDEFEFFEFFEFFFCFFEFFEFFEFFFEFEDA0D0F9FDFAFFFFFFFFDFFFFFDFFDFF9FDEDADBF9E90F9ED9FC90B0B000000C0CFCAC0FCACACFEC00EC0E0D0CECECFFBE0F0A000E0AF009A000000A00000A00000F90009000000000000ACFEEDEFEFEFEDEEFCFFEDFEFFEEFFEFFEFEFFCFEFED00DADCFCBFDFFDFFFFFFFFFDFFFFFFDEF9F9F9C9E9E9D09AD0BDE9C09000000EE0EDEFCADECE0C0EC0AC0ECEC0FEB00C0FA0000ADFC9EBE0A0B0A000000000A0A000090000000000000000EFFFEFFEDFEFEF0FEFFFEFFEFFFEFFEDFFFEFEFDE90DADBFFFFFFFFFFFDFFFFFFFFFFF9FBF9F9E9E9E999DA9ED9BC09909000000EC0CFCACADE0C0C0EC0ECCF0E0EFE90000A00000AC0A0A00009A0A000A0000000009F000000000000000000000EFFFEFEEFFEDEEFEFEFEFFEDEFEFFEEFEFEDEE00E9DEDEBDFFFFFFFFFFFFFFFFFFDFFDFDF0F9F9F9ECF09C9BCDBDBCBC900000C0FE0ECFCE0CE0E0CAC0DACECFE900000000000000A000E0F0A0000A0000000000A0AB000000000000000000000ACFFFFFCEFEDECFFFFFEFFEFFFEFFFEDFFEDF9C9E9FBDFFFDFFFDFFFFFFFFFFBFFBEFBFFDBDAD09990F0BC0B0DAD909A900000C0ECBCAFCAC0CCE0CEECECFFCB0000000000000000000000A0BA0000AC000000000D00000000000000000000000ACFEFEFFFFEFEFEFEFFFEFFEFDEFEFEFEFE00DADFCFFFFFFFFFFFFFFFFFFFFFFDFDFFCBFEF9FF9EDB9CD9F0F90BCBC9000000EC9CECFC0C0E0E0ED0CEFB00000000A0A000000000000A0E90000A0AC0A00000000A0000000000000000000000000EFFFFEFEDEFFFEFFFEFFEFFEFFFFFEDA90DADEFFFFFFFFFFFFFFFFFFFFFDFFFFBFDBFDF9F99E900DA9A0D90FD9C9000000CC0EEDACACAC0F0CCAEFB000000000C0000000000000000000A00A0009A0000A00A09A000000000000000000000000000EFFFFFEFEFFFEFFEFFEFFEFEFEFE90DADFDBFDFFDFFFFFFFFFFFFFFFFFF9FDFFF9F9EDEF9F9F09C9DACF9A0BCB900000ADC0ECF0CCACCCAFCF0000000000A0A000A000000000A00A00A090ACA0000000000E9000000000000C0B0A00000000000EFFEFFFFFEFFFEFEFDEFFEFFDEF00D0FAFDFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFF9F9F0F09F0BC99B0D9C99C09000C0E0DADECACCACECFA90000000000C090A0000000000000000900AC90CBCA000A900BE000000000E009A0000000000000000EFFEFEFFFEFFFFFEFFEFEFEF00DAFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF09FF9F9F99E99C9E9C9ADBCA99000000C0ECEBC0CACFAF00000000000000AC000000A00000000A0A00000A000090A90000F09000A0A0E9CB00000000000000000C9EFFFFFEFFFFEFEFFEFFFEF09E9EDFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FDF9FFF0F0FC9E99E9A9C9AD909D9E00000E0EC0FC0DEEDAD0000000000000A000A0E0000000000000000A00000A00A0000000FCA00000000A00A0000000000000000A0000EFFFEFEFFFFEFFEFEDF000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF9F9FBDB9F9F090D0BC9BCBDA099000C0C0CEACEE9E90000000000000000A0AC000A000000000000A00A0A0000000000000AF0000000A00A000000000000000000000000CFFFFFFEFEFEFFFFEA9CBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDAFF9E9DADA909F9E9C9BC9909DBCB0000C0CBCDE9E9000000000000000000000A0A000000A000A000000000A0E0000900000FE9A000000000000000000A00000000C0A0000FEFEFEFFFFFEFEFF900DFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFBFF9FE9FB99F9F09090B0C9ACBCB0909000ACACEA0A0000000000000000000A0AA00000A0A000A0000000A00AC090A00000000FA00000A0A0A00000000A000A0000A0A0C0000CFFFFFFFEFEFFFFC0CFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FDF9F99F9C9E0D09ADAD0D9AD9D90DAD0000C0CCAD0000000000000000000000000000A000000000000000000000A0900000000FF00000000000A0A0000000000000000A000A00CFFEFEFFFFFEFCB9ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFBDB0F90BC990BC9090B00900BCBD9B000C0E0FCA000A000000A0000000000A0A0A00000A0A0A00A000000000A00A00A000000FEB0000000000000000000A00000000C0A0C0000CFFFFEFEFFFEF00CFFFFFFFFFFFFDFFFFFFFFFFFFFFFFDFFDFDAF9F9E9DBCBC9BCBC9DBC9BC090AD09000C0CE0E000009A00000A0A000000000000000000000000000A000000000000000000FBC00000000000A0000000000A00000A00CA0009EFEFFFFFFEFFE90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBF99EDADBE99DB9C9DBDAD9A090C9D0F000C00E0DA9A00FAC9A0000000A000000A00A000A000A0A00000000000000000000A000FEB0000000000000000A000000000000C0B00E00CFFFFFEFEFFE90FFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFBDBC9EFDBDF9DBDADE9FBC9F9FC99E900A990C0ACCFA000CFAC9AC90A00A00000000000000000000000A00000000000000000A0C0AF000000000000000A000000A00000000AC0E00A00EFFEFFFFEFCE9CFFFFFFFFFFFFFFFFDFFFFFFFFFFDBDBDF9FF9FADF0FF0F9B9F0DFE9E99F090BC9C0000CAC0CA00A0CBE90A0CA000000000000A00000000000000A00000000000000000A00FFB000000000000000000A00000000000A00E0CA09CFFFEFFFFF90FFFFFFFFFFFFFFFFFBFFFFFFFF9FFFF0BCF0FFDFBFF9FFFCFDBFBDBDFF9F9E9090B090C0CEB00A00A000A009ACB0A0A0000000000A0000000000000A00A0000A00000000A0B00000000000000000A000C0A000000000CA9CA9CA0EFFFFEFEB0EFFFFFFFFFFFFFFFDFFFFFDFBDFFF90FFDBFFFDBFDFDFF9FBFBCDFFFFBCF9F9DBC90D0C00F9000000000009A000000000000A00000000000000000000000000000A00000A00F0000000000000000000A0A0000000A000A0EA0CADADFFEFFFFC9CFFFFFFFFFFFFFFFFFFFDFFFFFAF0FFFDBFFDBFFFFBFBDFFDFDFBE9FDFF9EBDA90BCB0B0EC0000000000000000A000B000A00000000000000000000000A00A00A0000A00000AD000000A00000000000000A000000C0A00C00DA0000CFFFFEFB0FFFFFFFFFFFFFFFFFFFFFFBFF9FDFBDBFFDFFFFDFFDFFFFFFFBFDFFBF9FFDDB9F9D09C9CCB00000A0000E0ACB000A000E9000A0000000A000000A000A00E90A000000000000FADA00A000A00000000000000A0A0000DA00ACACB0000CFEFFFE9CFFFFFFFFFFFFFFFFBFFFFFDBFFBDFFFFFFFFFFFFFFFDFFFFFDFBDFDFF9FBFDE9A9F09A9A9000000000A0E9ACB0000A00A000000000A0000A00000000000E00000A000A0000FFA00000000000000000000A9C0000A0A00A000000A000FFFFED0EFFFFFFFFFFFFFFFFFDFBFBFFDBDFFDFFFFFFFFFFFFFFFFDFBFFFFBFF9E9F0F9FDB0DAD0D000A00000A0CBCE90A00A00A00A00A00A00000000000CA000CA00A0A0000000000FA00000A0000000000000A0C00AC0A00000000A0A00000EFFEFB0DFFFFFFFFFFFFFFFFFFFDFDFFFFFFBFFFFFFFFFFFFFFFFFBFDFFDFDF9FFFDBDBF9ADB99CB00000A00000ACA9A00000000000CA00A00000A00000A00000A000000000A000000FF90A00000000000000000A0A00A00C000000000000009CFFFFC00FFFFFFFFFFFFFFFFFFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFDFBFBFFDBDBDBC9FDB0DA90D00A000000000AC0A00A00A000A00F0000A000000A00000A0000A0000000000000FCA000000000000A000000000A00A0A0A000000000A000A0DEFFBCFFFFFFFFFFFFFFFFFBDBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFDBFDBCF9FF0F9F0DB09A9000000A0000A000000000A00E00A0A000A00A000A00C0000000000000000000AB0000A000000000000A00000000000C000000000000A000EFFED0FFFFFFFFFFFFFFFFDFFFDFFFFFFFFFFFFFFFFFFFFFFFFFDFFFDFFFBFDBFF9F99F9F99BC9F000A0A0A00A0000A00000AC00A00A0000E000A000000A000A0000000000000000F00A00000000A0E0A00000000000A0A0A0000000CB00000CDEFF0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FDBE9DBDADBCBCBCB909DA000000E000A0000A0ACA9A0A000A0A0A0A000A00000A0000000000000000000E0CA0000000C0AC9A000000000000000000A90A0C0F009A0FEFE9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FDFF9F9DBF0F9F9BDB99DADA09000A0A00A0000000000EA000A0000000000A00000A0000000A00000A000000B9A0CB00000A0E9A000A0A00000000A000A000090B000A00ACFFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBF9F9FBD9F9FBCFDADAF099DAD0A00000ACB0A0A00A0000A0000A0A0A00A000000000A00A000000000000000E000AC0A000000A000A0000000000A0000000000A00A0000CBCFEBCFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFDFFFBDF9F9F0DAF9F9CB9BDBD9BDA990B0000A000000000000A0A0A0A0000000A000A00000000000000E0A00000000B00AC0B00000A000A000000000000000A00900A000000000ACAFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FDF9E9F99F999C9B9FCBF9ADA9C9E900A000A0A0A00A00000000000A0A0A00000000A000000000000A000000000E0000AC0B0A000A00C0E0A000000000000000000000000A00ADCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FBDBD9E99F0F9FDCB9D0BDBD9B09D09C00000000A0000A00A0A0A000000A00000A00A000000000A000A00000009A0000AC000000000A900000000000A0000000000A00000000A0EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FBD9F09D0B0B9DEBDDADAD0F0B0A0B0A000000A0A000000000A00A000000000000000000A0000A000000000E0000000A000000A00CACA0000000C00000A000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDBF9F999F9DB99D9D0B9DABDBDB999C9D000000A000000000000A0000000000000A0A000000000000000A000000090000A0000A0000000A009000000E0B00000CA00000A0000000A0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBD9D90DF0B909DA90BD0F9D9E9F09E9F0A00000000A0A0000000000000000000000C0A0000000000A0A000000000E0A0000A000000A0AC0F0ECB0A0000EB000A0C00A0000000000009CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBDBF9FDB9D9F9F999D09F09EB9F9F090099000000000000000000000000000000000A90000000A0000000A00A0000B0000A00A000A00A0A000ACE9000A0C0E9C09A0C0A0A0A90A00000AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDFFDFF9FDBDF9D9FCB99C9F99DADB9F9F90F0A0A00A00000A00A000000000000000000E0A000000000000000000000CA00000000A00000000EADA9E00000A000A0AC0B0C00C00000000ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFDBD9F9FDB9F0B999CB909CB9DBCF9090F090000000A0A000000000A0000000000A0000000A0000A00A0A0A000000B0000000000000A0A0A000E00A000000A00D00AC00B0A0A000A9E0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFDB9BDBF9F9B0D99D090990BDB9EBDF90F9F090A0A00A00000A0A000000000000000000E0ADA0000A0000000000A0000E0000000000000000A0A0A0A00A0000000A0AD00E0C00900A0000AEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFBFDBFDFD9D9FFFDFBE9B90DB0D09C99CB9FF9099E90000000A0A00000A00000A00000000000000000000000000E0A0000009A0000A0000000000000A000A0000000000000A09A0F00A000A009CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFDFFDB99FFFFFFFBDFFDEFB0D90909E9BDADBF9E99E90A0A000000A0A0000000000000000A00ACA0000000A000A00D0A00A0E9000A00000A00000A0A00A000A0A00000000A0DAC000E00E900A0AFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FDFFDFFFBDBDFFFFFFFFFFFFFBDF9FB0009090DBDBF9E9F090000000A00A00000000000A00000000000000A00A00000A0CA0A00000B0000000000C90A000000A0A0A000000000A000A00B0E90E00CAD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD9DEFFFFFFFFFFF9FFF9EB9E9900009DBC9F9F990DADA0000000A000A00000A00000000A00ACA0A000000000000A0E00CA00E00A0000A0A0A000000A000000A0A0A0000000B0B0000CB09EB0ACBFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F9FBDF9DAFBFFFBFFFBDFFFBDB9B9C99CB00000099E9E9F0F90900000A0000A000000000000000000000C0000000A0A00000CADA90A0DB00000000CADA0A0000A0A0A00000000A000A0A0A000ACAC9CB0ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEFDFFBF9DFDBFFFDBFFBFB990D0D0900909000000B9F9FDB0F9F0A0A000A000A0000A00A00ACA000000A0CAC0A0000000000ACACA000EACA00000000000000A0900000A0A0A0A090A00000000000A0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB9FF9009EFBDFF9BD90D9CBD9B9B909F0909090090D0F9B9D090900000000A000A0000000000000A0A000A00B0000000000A000AC9A0F00000A0000A0A000000A00A0A000A00000A00000000A00B09000F0FFFFFFFFFFFFFFFFFFFFFFFFFFF9BDF909090F99FF9F9DBDBDBDB9C9D0BD090D09A99000B90FDA9ADA90A00A0000A000000A000A0A0A0C00000CAC09A00A0000000A00A00EBE0E09A0A0000A000000000000A0000A0A0000A000000000A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFBFDB0F900009F9F9F9FBDBDBDBDFBF9FDB9DB9BD9D0D99CBD9BD9C9CA000000A000A000A000A00C0000A0000A000E0CA000A0CA00000000FCB00E009000000000A00A00E009E9A0000A9A090A0000B000B00ACFFFFFFFFFFFFFFFFFFFFFFFFFFFB9DB99BD9DBDF9FDF9FFFFFF9F9DBF99E9E9C9ADA9A0909AD9B0B9900A0000000000000000000A0A000A0A000A00EADA0C0A00F0000000FBCEB0F0A0A00000A000900F0BE00A00A0B0000A000B0000900000FFFFFFFFFFFFFFFFFFFFFFFFFFFF9DB9CBDBFFFFFFFFFFFFFDBDF0FBD0FBDB9FB9DB9D9990F99E9D9E9B0000A000000000000000A0000A000000000A0CA0F0AC0E00A00000FCB00C0A9C9000009000A0F0AC00B000900E0A000B000A00A00A0FEFFFFFFFFFFFFFFFFFFFFFFFFFFB9A9CBDFFFFFFFFFFFFF9FBFFBDBC9F9C99E9DCB0DBCBCB90F9F9A9C000A00000000000000000000A0000000000000A9E0E09A0A0000000AB0DA9AD0ACA00A00A90000E90B0000A0A09E900000A00900B0900FFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9BDFFFFFFFFFFFFFFFFDF9DBD9B099E99A9B9DA9909C990F0D9CB900000A0000000A0000000000A0A00A000000000000A0C90A000000DEA0000A90B00000000A0000A000A00000E00EB0A000F0A000ACBCEFFFFFFFFFFFFFFFFFFFFFFFFFBDB0BD0BDFFFFFFFFFFFFFBFBFBDAD99A0909D09CBDADB9BCBD9B0B90DA000000A090000000000A0000000000A0A00A00A09CA0E090A0000A90000000ACADA00A0AC0B00000000000A0AD00009AE0E90A00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF990FFFFFFFFFFFFFFFFDFDBDBDB9C990F009E990990D0990FDBD0F0900000000A00CADA000000000000000C000000000A00F0A0000000F000A000A909A00000DAF0000000000A09C0A00A0AC9EBCA00A0AFEFFFFFFFFFFFFFFFFFFFFFFFFBDF990FF9FFFFFFFFFFFFBDBFBDBDBD0B909009909E9F0F9B90F9090F99000A00A0A00E9A00000AC0000A0A00A00A000000AC0E00000000009A00900900A0000000AC0A09A0000000A0B00A00000E0EA900000CFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF990F9FFFDFFFDFBDFBD9DBDBFBD9E9099E090909909CBD9F9F990F090000000000AC9A0A000ADA0900000A0009000000B0A00A0000E0E9A00B000090A900000AC9A000A00000000E009A00A0EDEEB000A0FFFFFFFFFFFFFFFFFFFFFFFFFFFDBDF999F9FFBFFBFFFBD9B9BDFFDBF9DB9C990DA99E9F990F90F0F9D0B0F0A00A0A000AA0000A0000ACA0A00CACA00900A00000000B0E9EB000000B00000CA000090A00A000A0A0A0A90E00000CA0E9E9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F09FBDFDFFF9FDBFFDFFBDFF9FBDA9AD9BD9C9909E99EDBD9E9BDD0000A0000A0000A0A00A0A0090000A09000A0000000A000C0CACA09A0F00000ADA90000A00CF0E9A00000900E9A0A00A0E9ECA0E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFDF9F90DFFBFDBFFFFFFFFFFFF9FBDBD9D9BCB09A09E99F9B9DB9F0D9A9A00000000A0A0000A00000E0A0A0CA0A900C0EABC90A0A0ACFF0000090A000A000000000A0F0E00A0A0A0B0AC9090000A0BCB0CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBF9F9A9FDBFDFFFFFFFFFFFFFFDFF9E9AD9BF99DB9DF0FDFADE9DABD0000000A0A00000A00000009000C0BC9C000B09C0A00000EDAE9A000ACB0F0C90A900000BCEFF0F000000A009A0A0A000000ADB9DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9F9F99AFDBFFFFFFFFFFFFFFFBDFBDBDBCD9E90DB9F9B9D9BDB9DCBDB000A0000A000000A0000A000A000A0ACB00A0BC9A00000ACFE9000DACF09A0AC0090A9CAF0FA00A00B00A0A000000A000FDBDFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9DBDFFFFFFFFFFFFFFFFFBDBDADBBF99FBCF9FDEBFDBDE9BDA00A0000A0000A0A000A00000A09A00C090E90000A0000A0CB0B00A0ACB00A000900AC9CAD0F09CB0CA00A90000A0B090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFBDBDBFBDFFFFFFFFFFFFFFBFDF9F9DBD90F0D9BCB9BDDB0F9BDF0B00000A000A090000000A0A900000A0BEE90F0009000000A0ECA0D0000A000000A900A0B0A0E0E0EB0E900A000000CADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FBDFFFFFFFFFFFFFFFFDFBDBC9E9E9F9FBFDBDFDBBDF9FDA9F00000000A000E9E9A00000000A00000C0FFE9A000000000000BDA0A0A000A00A0000900009E9ADADE9A0AC90A09A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFBDFF9FFFFFFFFFFFFFFFF9F9B99E9F9F9FDB9FDE9FF0FDADA90000000A000000000A00A00900000AC0EBE9A00000000000CA0000000A000D0B0A0A90000000A0A0000B0AD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDFBFFFFFFFFFFFFFFFF9FBDBC9F9F0F9E9BDF0F9FDBF9BDB0000000A000A0A0A0A000000A00A00009A9C9000900000A00AB000A00AC090A0B0C9C900A0A0A000000CACAD0A0CFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFDFFFFFFFFFFFFFFBDFBDAD9F0F9BDBDBDF9F9F9BC9FC9AD0A0000000A00000000000000000000A0000A090A000A000ACE9000000A0A090009A0E000900000A00A0F0FAF0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFFFFFFFFFFFFFFFFBDBDB09F9FDBDBDF0F9F9FDBF99F9AD0A0A00A00A00000900A00900900A9000B09A000A00000000FAB0A0A0E0CA0B0A0090A000E90A000000EEFCB00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFF9FF9BDF9F0BDADFB9F9F9EBD9CFA909A9090A00A000A00A0A000A00A0A00E9E9CAC9A0000000A0A0BD0000009EB000090B0090A000A0000A0ACBCB0CBFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFFDFFFFFFFFFFFFFFFFFFF9FDA9E9F9FDB9CF9F9F9DBFB99F909E0E000A00A000000C0B09009009E000A09A000A0000A0000F0A9A0A0E0009000000A0A00A0000A000CBEB0E9EFF9FFFFFB9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFF9F0B9F9F9F9B9FB9BD0F9FAD9CF09CB0B000A00A0A0000A0B00ACBC0A0000A00A000000A00000A0A90000000A90090000000000000A0000A000000ADFFFFFFFF9FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFF9FFFFDBFFFFFFFFFFFF9FF9F9D09E9E9C90D9CB9E9D9E9B9DA90000A00E00000A9090000909A90A0A000000A00000000A00AFE9A9A0A000A00009000000000000A000A0A0000FFFFF9FFBD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FFDBFF9FFBFFDFFFFFFFFFFFFF9F9A9F99F9B9F90B9099A999E9E99F9A000A00ADA090A0A0B0A0E0E000000000000000000000A00B909000000A0DA9A000000000000000000000A09FFFB9FDFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FF9FFF9FFFFFFFFFFFFFFFFFFBC9D0F990909090D9BC9DADBD9BC90000009E0A0A0AD000C0900909A000000000000000A00000AF0A00000A00DAC0D0000000000000A0A000A000CFF9D9FBFBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFB9F9BDBF9FFFFBFFFFFFFFFFFBDBD9B0B90C90D0BC90BC99AD9D0BC9A9A0CA0E000000DAB0A9ACADACA00A0000000000000000A0A0A909A00000A0A9A0B000A000000000000A00000FFF9BDDFFDFFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBCBDBC9F9F9FDFFFFFFFFFFFFBDB0D9D0B909BD99BD99AD90B0BDB0D00B0CA00A000A00CBCADADA9000000000000A0000A0000000DA0000000000000000A0000A000000000000A00CFFF9AF9FFFFFFBFFF0FFFFFFFFFFFFFFFFFFFFFFFBDB9DBDB909B90F9FBFFBDBFFFFFFFFDBDB009009F099E9CBD09A99C909DB0F00A0CB000A00A0000CACACA0A00000000000000000A000A0A90090000000A00A00000A000000A0A0000A000FFFB9D9F9BDFFFBDB09DFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F9F9C9B909C9FDFFFFFFFFFBFF9099A99099F099B90BD9CB09F090D0F0CFACA0000000A0A0A0A00000A0000000A0000000000000F00A000000000000000A00000000000CA9A00CFFFF9D9B9DFFBDB9E90FEFFFFFFFFFFFFFFFFFFBFFF9FF9F9FDB9F9BD0999B9FBFDFFFFFFDF909F0C9ED9F0F9E9CBD90B0DB09E90B0A0A000A00000000000000A0000000000A0000000000000A0F090A0000000A0A0A000A000000A0A000C9CBFFFFBB9CB9F9FFDF9B09FFFFFFFFFFFFFFFFFFFFF9FFBFFFFFBFF9F99B9F09CBDBFFFFFFFFBF90099990E990909900090900D09E9C00000A000000A00A00A00000A0A0000A00000A0A0A00A000B0A000000000000000A0000000A0000A0A0A0CF9FFFDB990F09FBF0900DFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9E9CBC9099DBDBDFFFFFFF9F9F9000A990000000090000090B00909A0A00000A00000000000A000000A0000000A0000000000A0E900000000A0A0A0A000A00A0000A00000000FBFFFFF9F9999F9F9909CFFFFFFFFFFFFFFFFFFF9FFFFFDFFFFF9F9F9B9F9A99E9F9FFFFFFFFA90090D00000000000000C90909F9000000000000A0A00000000000000000000A00000A0A0A0000B000A000000000000A0A00A0000000A00A0DFBDDFFFFFF990FFF9CA90ADFFFFFFFFFFFFFFFBF9FFFF9FFBDB9909090D0909CB9F9FFFFFFFF9D9090000000900000C090B00F0D0000000A000A0A000000000A00A0000A00A000000A0000000A00A0000000000000A0A000A000A0A0000000A0EDBFFFFFFFFB9090B9900DBFFFFFFFFFFFFFBF9FFB999B0090000000009009090D0FFFFFFFF9FB090090900000000909E909090B9B0000000A00000A0A000000E90E0A00000000A000A0A0A00000DA0000000000A0000A0E0F00000000000000FFDFFFFFFBF9E990000900DFFFFFFFFFFFFFDFF9FDBE9DBD0900000000090B090B99FDFFFFFF9F9E900009E909ADBCB9090090D0C090000000A0A000000000000A000CA0000000000000000A0000A00000000000000A000000A0A00000000000E9F9FFFFB090900909000D0FFFFFFFFFFFFFBFFFFBD9FBDBFBD0900B00BC909099CFBFFFFFFFF99909090009CBC90900909BCB09B900000000000A0A00000A0A0C0A0A00A0A0000A00A0A0000A0000000000000000000A0A0A0000000000000ADF9FDBFB0D09009000009AFFFFFFFFFFFFFFFF9F9FFB9CFFDFFFB9D0D9090909E9FBDFBFFFDB0F0F9A90090009090909CAC00909C00000000A00A0000000000C00A0000000000A00000000A0000AF00000000000000000000000000000000000FBDFFFD99000900000000CDFFFFFFFFFFFFFFFFFFFF9F999F99FDFB9A909090F9DBDBFDF9FBFDB90D90090909009ACB0999990DA0900000000A000A0000A0000A000000A0000000000A0A00A0A00A000000000000000000A00000000000000000FB9DBF099900009000009AFFFFFFFFFFFFFFFFFF9FFBF9A9F0B09C990090F99BF9E9FBFF9F99FF9ADB90009090990DBCBCADB0900900000000A0000A00000A00A0A0A000A0A000A0000000000A0F00000000000000000000000000000000000F9DBF999E009A90000909ADFFFFFFFFFFFFFFFFFFFF9FFFDF9F9F9B09DBCB9AD09F9F9F9FF0FF09F990DA90000000909909900900000000000000A000000A0000C000000000000000A0A0A000000000000000000000A00000000000000000000E9BD9C9E99F9900000000CDFFFFFFFFFFFFFFFFDFFFFFDBFBF9F9FDBDA9990D09F0B0F9FF9FF9FF9F0F990900000000000000900009000000000000A00A000ACA0A0A00A000000000000000A00A0A00000000000000000000000000000000000DF9E9BDBDF9E9900000009AFFFFFFFFFFFFFFFFBFBDFFFFDFDFBDA909000090F90D9DBC9FFF9FF9E9F9F0DAD0000000000000000CB0000000000000000000000000000000A0A0A00A00A0A00A0CAB00000A0000000000000000000000A0000000E9990DFBF990009000000D9FFFFFFFFFFFFFFFFDFADBDFBB090090009090DA9E90F0FBF9FDFBDF9FDADB09099A90000000000090990000000000000000A0A0A0A0A000000000000000000000000CA00000000000000000000000000000000000FBDEFFBD90090000000000FFFFFFFFFFFFFFFFFF9DBDA9D090090090000009D9FF9FDFDFFBFDFBFFBDBFDBDAD09C900009000C09C0000000000000000A00000000000A0000A0A000A0A00A0A0A0A0000000000000000A00000000000000000000999990909000000000090FCFFFFFFFFFFFFFFFFFB909009E09C0F0BC9E9FFFFF9FFFFBFDFDBFDFBDBD0BF0F9FDB0D0F9E0909B0A900000000000000000000000B00000A0A0000000000A0000009E00A000000000A000000000000000000000000000090000000000000009FFFFFFFFFFFFFFFFFFFFDF9F99DBBD9FDBDBDF9F9FFDFFFDBFBFFBFDFFFFFFDBDF0BC9A9009D0F00C90000000000000000000A00A000A000000A0A0A000A000A0A00A90000A0A000A000000000000000A00000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFBFF9FFFFFFDFFBFDF9F9FDADF9BD99F90B009090900000000000000000000000A000A9A00000000A00A0000000EA0A0000000A0000A0A000000000000009000000000000000000090000000DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFDFDBFFDFFBFFFFFBDB9C9A9E90C9090000000000000000000000000A00000A0000A0A0A0000000A0A000B0000A0000A000A000000000000A000000000000000000000000000000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFDFF9FDBDBD09BD0900B090009000000000000000000000000A0A0000A00000000000A00000A0E00A00A0A000000000000000A0000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FFDFFFFFFFFBDB09F09090909000B000900000000000000000000A0009A0A000A0A0A0000000A000009A00000000A0A00A0A00000000B00000000900000000000000000000000009CBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFF9FFF9DB09909A0C90900090000000000000000000000000A00000A00000000A00000000000E000A00A0A00000000000000A00000000000000000000000000000000000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFFF9FFDFDFFFF99B0909E909DB9000900900000000000000000000000A00A0A000A0A0A00000A00000000B00000000000A000000A0A0000000000000009000000000000000000000000BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFBFFDFB9F0D9F990DA900090C0900900000000000000000000000000000A000000A0000000000000A0000A0A0A000A0A000009A0B000000000000000000000000000000000090D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFDFFFBF9D099B09A909D099009A900000000000000000000000000A00A0A00A00A0000A00000A00A0F000A0000000000000ACA000000000000000000000000000000000000090C90AD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFDFFBB900090D09A99E90009009000000000000000000000000000000A00A000A00000A00000000A000000000A0000000090A0A00000000D000900000000000000000000009A9DBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFBFDFFBF9D90DB9DB90BC9A90090909000000000000000000000000A0A00A000A000A0000A0000000E0F0000A0A0A00000A000A0A0900000009000900000000900000000000900909DA9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFDFFFBFDF9A0DB9CB900D9909090000000000000000000000000000000000000A00A0000A000000A0A90AB00000000000A000A00000A09009000090000009000000000000000009E9E9DEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FDFFB99DBC9BDA9990A90000909000000000000000000000000000A00A0A0A0000000000A000000ACA0A000000000000000A0A00A00000000000909000000000000000000C0909A99DADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBF00BDBF09900F99090900009000000000000000000000000A000000C000A00A00A0000000A00B0000A0A0A00A00A00000000000000000090000000000000000000900900F0D9EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FFFFFF99D9F09F9CB909AD0909090000000000000000000000000000A0000A0AE9000000CA00A00000A000000000000000000B0A0A00009000000000000000009000000000DAD9090FBDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFBDBF99E9E99F9A990F09090000000000000000000000000000000A00000E0CF000A09E0B00000A00AF0000000000000000A000900090000000000000900000000090000000900B0F0DEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF9F099BDA9C90909009A09090000000000000000000000000090A00A00BE0FA0C0E0E09A00000000A00000000000A0A00A00A00A00000000090090000000000000000000B09C90F9FBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBDFF9B0D0BDB9BDA9099090000000000000000000000000000000C0F000000E0DA9ACBCA00A000000F0000A00A00000000A00A00A00900000090000000000000000900000D09A90D0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFBDF9C9F909C909C9AC909090000000000000000000000000000ACA0A0A0F0EA000A0A9A000A0A00A00000000000A00A000A09A09000900000009000900000000000000000C000FBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFDBDFB0B9ADBDB9B909090000000000000000000000000000000CACBE090C00A9000A0000000A0000A900A000000000000A0000ACA00000090009000000000000000000090090909C9F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFBD90D909090DA90900909000000000000000000000000000A9E0FCE0B0ACA0A00000A0A0000A00EA000A0A0A000A0000000090A90000090C00000000000000000090000000CB0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDBDFBF9ADBCB9909CB09000000000000000000000000000000000A0A9AECB000C00A000000A000000B0000000000000000000A0A000000000090900000000000000000000000900DAFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBFBDF9F90999CA9099090900000000000000000000000000000A090CEE9A00A0A0A000A0A090A090A000A0A0000000000000000000000000000000000000900000000000009000DAFDAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFDFDF0F90DBC909DA90000000900000000000000000000000000C0ACAA9A0A00AC00000000C0A90A00E000000A000A000000000000A00000000000000900000000009009090000009DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFBF9FBDB909A900900900000000000000000000000000000CA0A000000000A00A9A09A00A9E9A00A0B00000000000000000000A0000000000000900000000000000000000009090CADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBDBDFBFDBDF0F909B00900090000000000000000000000000000CE9A00BCA0A00A0C0CA00000A0E9E900CA0000000A0000000A00000000000000090000000000000000009000900000BDAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFFFFBD9BDB09909C090009000000090000000000000000000009A0AC0A000000A00A0ACACA900EDA9A0AA000A00E090A0000000A000A00000000000000000000000900000090000090D0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FBDFAF0F9F0B0090090000000000000000000000000000000A0C09A0A0A90A00A0AD0B000ACB0A0090B0000000AA000A000000000000000000009000000000000000000000090000ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFFF9FFFDB9D99909D90909009000000000000900000000000000000CA0E000000A00A00000AC9A090E9C9A0ACA0000A000E9000000000000A0090000000900000000000000900000000900909EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFBDBFFFBFF9F090B00000000000090090000009000000000000900B0A90A000A90A0A000AC0A000A00090B0000000AC0A000000000A00000A0000090C090909000000000000000000090DEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FF9E9F09A99AD09009000090090000000000000000000000900E0C00A00E0CA000000A00B00E0E9A0A000A0000AC0A00A000A00900A000090000000BC90C000909000000000090A90ADBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBDBDFF9F9F9DBD9090909000900000000000000000000000000000AC90A9AC0B00A000A00A09AC0ADADA0000E000A0000A9A000A900A0A900000000000090900909000000000000000909C90DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFDFFFFBDBF9F9A909CB0900009000000000900900000000000000009C9A0E0000ACAE09A00009CA00ACACA0E9A0B00000A00C00A0C0A00000A0A0000900000000000000000000000000000C0090BC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FBDBDBE9F9F9B090090900000000090000000900000000000000000009A000009E00E09A00CAC0E0BCB0000E0A0A00CA0A000A000A0A0000000000000C09000000900000000000090090B0C9FFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBCBD99090909009000009090009C0900000000000000000090B0A0A000B0E0E0B000A0CA90B0A9CA00ACBA00C000A00000000A0000000000000000090CA90000009000000000000000C0B9E9FFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFF9FDB0BDB909A9090090900090000000000B009090000000000000000000000A0000B0000FAD0B0CAC00CA0A0CA09E0ADA000A9A0A00000000A00A90000900009000000000000000000000009090C9F9FFDFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFBF9F9090909000090000900909000909000DA9CB0000000000009C900A0A0C0A0E00B0E0CA00E00ADA0000A90AA900A00AC000000A000A0000000909000000090909000000000000000090000090DBDBFFFFFFFFFFFFFFFFFFFFFFFFFDBFFBDBD9F9F90B00090900090000000009000090009009009000000000000A00C0A9AC00E0000FADAE0ED0ADA9A90A00E0A000A00A0A00A00B00000000CA00000000000000090000000000000000000900BCBDF9FBFDFFFFFFFFFFFFFFBFBDFBFDADBCFA9909D09900000900000090909000000000000009000000000090B00E0FCACB0F0F0BE00E09A0AECAAC0CACA0B000A00000000000E00000000A099E90090000000000000000000000000D0090A9C9BCBFFFFFFFFFFFFFFFFFFFDFFFBFDBF9F999DAD9A900090000000909000000000900900900009000000090E90CE0FA0A90E0E0E00CE90E00EDADC0EA0900E0000000A00000A000A00000090C09E9000000090C900900000000000000900C90BC9F0D9F9F9FBFFFFBFFBDFBF9F9F9BD9F0BCB09B090090000000000000900000000000000000009000090090A0A9EEDEDEA9E0F0E9A0E00AC0ACAAE90E0A09A0000A000000000A000000000A9EC90F00090000000000000000000000000000090099AD0FBFDF9F0FDB9FB0DBF9E9F9B099990900909009000000000090000000090090900000000900000009C00E0AEBA9CA9E0F0E0B0A9CACACCDAEC0AC0E0000000000000000000000A000009E900D000900900000000000000090090909C0BD0AD0BD09A9E9F9BCB9CB9099990009000000900000000000000000000000000000000000000000090090B09AC0FCBCCEF0CA0E00E00CA00ACAAAC0ABC0A9A000000000000A000000A900A0A9E900F909000000900000000000000000000009000909009AD9909009009009000000900900900090090000090000000000000900009000000000900000A9C0E09A0ACEAF0AADEDAF000AC0ECCACC0E0C0ACA000000000000000000000009000000909E90D0090009000000000090000000090090900009090009009090090090009000000000000000000000000000000009000090000000000000909C9CBCBCA0ECBCF0E9CACAC0A0F00E0BAC0AE0E0E00F0A00000000000000A00000A0000A090009E9A9A090000000000000000000000000000090000090009000000000009000000000000000000000000000000009000090E9000900000009000B09CACB090ACAEFEADEBEBCA00E0ECCAE0C9A0A0E0A0000000000000000000A0B09A0000A09C090D0D9CA909000000000000000000009009000900900900009090090000000000000000000000000000000000000000900909A9CA00900CA90D0DADEBCA0E9EEDE9EACE00E9CE0E0A0C0EA0C0C000A000000000000000000000000000000000B0DA9A009C00090000000000000000000000000000000000900000000000000000000000000000000000000000000090009000009090009090B09A0E00F0D0E0FAFEFDEB0F00E0ADACE0AC0CA0A0A0F00000000000000000A0900A00A00A0E90DA0D0D9F09AD000900000000000000000000090090009000000000000000090000000000000000000000000009009009CB000090090D090B0D090C09EFAEAE0ECEEDAEBCE00E0ACACA0E00A00000000A00000000000000A000A00000009000A00DB0F0090C9A900C09000000000000090000000000900090090000000000000000000900000000000009000000000900909090000009AD090B0E9A000EDADAF0EFAFFCEBCACADE0CACACBC0ACA0000F000000000000000000A0000000A0A0A9CB00D0DB0F90C0DA900090900000000000090000000000000000000000000000000000000900000000000000000090C9A0000000000B090B0D0D0000EEDAFECAEBCFEEFFE9E0CA0ECAC0AC0AC000A000000000000000000000000000A0000000A00DBCBCD0009B090009A0000000000000000000000000900900000000000000900000000009009000000000900F0090909000000B090E9C9A9A90ADADAEE0F0ECEFEFFACAC0E0ECA0E0E0E0A0A0000A00000000000000A00000A000000A00A0000009CB0F9D0C909C90D9000000900009000000900900000000000000900900000900000000000909000000009009A90000000D09C099A90D00A00ACACE9EACFAFEFFEFFA9E0E0A0DA00000C0000009A0000000000000000000000000000000A9A0E9AD90E9B0F090DA0DA09000000000900000000000909C0090090C000009C00009000900900000000000D0090D0900090B00009BC0DADAD00000E0F0E0E0ECAFEFFEFCA0E0E9E0CACA0A0A00A00E00000000000000000A00000000000000000090DADB9E0D0DAFA9DA99000000009000900000000900090900000009C9000B0000090000000000090900A090B000090C0090B9009B090E0A0CA09E0E0E9E0EFEFFEFE9E00E0E00A0000C0000000000000000000000000000000000000000A0A0ACAD09C9DB0F9C9DA9D000900009009000000090C00C909A0090909000090009A09C000009090900000909AD0900B00090000CB9F09CF009E90CEACAF0E0FECFFEFE9E00E0000E00A00A00AC0A0B000000000000000A00000000000000A000000090BCB0F0D9E9B09CBCB00900000F090090000009A90A0D0900000A09C090D090009009000000000000D09000900090090DB9C909CA0F0E0E0B0CBC0E0E0FEEFFFFEBCA0A0E0000C0000000000E000A00000000A000A0A000A0000000000A0B0A0009C90F090C9E90090D000000009C90C0900900009C909E9090D090900000C9000000009000090090B0090009090900B0DBB0BC9CACADA9E0E0EACADACADEFEFFEDAC0C00A0A00A00A00A000B0A0000000000000000000000000000000000000E0B0F90F0F9090C9CB090900D09A9A90900000900C0B0090F0909E9E9D0B090A90900900090900F090DB090F000A09F0F0D0D090ACBCACE0F0F0CBCACAEEFEFFEDA0A0A000000000A00C00A0A000000A0000A00A00A00A0000000000A0ADA0B0900D00F9F9CBCB9A909AC009A0C9C900090090009090C9CF0D0AD0909A0090C90CA000009E9E0909F090009009C9DB099B09A9A09E0E0E9E0E0EAC0E0EDEFFEFFEAD0C00AC00E00C000A00C0F0000A000A00000000000000000000000000000A0EB0BD0C9A909D0D09C90900090B0F9B0090C090000909A99AD9090F099D0A9009090F0D0909F9F00B0090009A90BC9E9CB090CAC0ACBCACBCAD0EACBCAFEFFEFBC0A0A000A000A0AC00A0A00A0A0000000A0A0000A0A0B0A00A0A0000A0A0A000C9CB9BCDE9E0B0DA9CB09C9AD0D0C9D0A990090900F0D0E90F0F090E0090090090090BCBD090990090A9090DBD0B90F9CBCB09ACF0EACACACAC00E0ACAFEFFEFEF0C0CA000A0000A00C000F00000A0A0A00000A000000000000000A00000D0F0B0A0D0B99F99C9AD0A90CB0D09A9BCBBD00B0C9E9F09A909E909DAD99009000900B9C990B9E9A0D909D0FBDB0A9D0F9E0DA0CACA0E0CBCADACADA0ACEDEFFEFF00A0A000E00CA0000A000AA000A000900000A00000A00A00A00000000BCA0A0AC00F0BDADE9E9AD9A9D090D0B00DCB9C90F0D9E90090D09E9DBDA9900AD090F009C0B9AD9C9ADDBADB0F9C90D9F0BCBCBAC9EAD0ECBACA0E0A0A0C0CAEFFEFFE9E0C00A000A000CA000A009A00000A000A000000A00A00000000A00A000DA9000B00E9ADB9FBD9A0D00BCB090D0B0CF9AD99A09F9BC900090A0BDE9F990F090DB09BCBDA0BD99AD90DB90B0F0F0F90DA0DAE0CAF0ACCACA00D0CA0A0CFEFFFEBE0A0E0C0A0000A000A0C00E00000000A000A00A00090000000000000ACAC0E9A0CA900F0E9C9BC990F909DADA09C9B0F9AC9DF09C9ADB09C99C099A9E990DA90DBC99C9D90BCB9ADB0DA9DB9F9F0FA0FE0CAF0CAC0A000DA0A00000A0EFEFFFEDAC00A000CA0000AC000A09A0000000000000A00A0A0A000000A00A9009A90000000A00090B0CB0E900C0E909CA90C90D99E90F0BD9ADBC9A090009C9000B9CBBC9BCB0BCBDB0D9BCB99CB0E9E0F09E00FACCAAC0BCACA00000A00C0E9EFFEFFADA0E00A0A00E00000A000A0000A00A0A0A00000000000000A090A0000A0A0A0A0A0009A0A00B0D99CB909C9E99009ADA9E9E909D0AD9C9B0D09E900B0909009C9BCB9DF9BCBDBEDBDBCB0ADACBC9EB0EAC0A0D0AC09000ACA000A0ACEFEFFFACAC000AC000000CA0AC0A0E00000000C0000A000A000000000CA0900A0000090000A0A000000000CA90AD0B09A0D0C909C909C90AD9B0B9C90B00DBD09A9CB00B0F90FA9EDBDA99A9A9A9ADA0F0BAC0E9C0BC0AE0A0A0E00000AC00CBEFFFFEFF0ACA0000E0A0A000000009A0000A0A9A00000A000A0E9000000E0A000000A0A0000000A000A00A90C900D0D0D09A909A9CB09E900C09CA909090009AD9009D00D0FD9F9BCB9DB0DB0DA0F0F0ADCBAF0E0E0AC009C00000A00C00A00CEEFEFFE9E900E0A000C00A0A00A00E00A00C90000A00000000000A00A0B090000A000000A00A0A00A00000CA90C9A9A90BC90F0D0BD0F90F9B9090DAD0090DADB0990B9DBF9AF0F9BDA9ADA0FA9F0B0F9ABC0CADA00CB0E0A0A0A000A0A000ACAFFFFEFE0CA00000A0A000C0CA0CE90000A0A00A00000000000B000000C0A00A000A0A00000000000000A0A909A90DC9C00BC990AD0BD0F90C0F0DA90ADE9099CBFCBC9E9CBD9FDADA90F0BDB0FA9EDA0EC0EACA0F0A0000000C00E000000E0EFFFEFFEB0ACA0ACA0000A0A0A0FE0A9000090A0000A000000A00A000A9A000000000000A00A0A90A00000D0CE09C9A9A90900CADD9EDAD0F9BD0F0DE9D09E9CA9C9BDBF9FF9EF0BDB9EB0BCBEBCBE9ACF0AE09AC0AC0ACA0E0A0A000A0CA000CEEFFFFFCE00C0000C0AC0C0ECE0FEEA0A0A0000000000000000000000009A0000000000000090E00A00A0A0A9E0AD0E90F090900ADBCBFBDADAD9F0DA9F0F9FDB0F0F09E9BF99FDACB9E9EB0BCBCADA0EC90E00BC0B00000000000A00A00A0A0FEFFEFCBDA0A0A00A00ACAE9EFEEFB000900A00A0000A00000B0A00000A000A00A00A000000AC0BC90A0000F0AD0A090F0DADCFF90DBC9CAD9F9E9FBDF0BCF0BCF990DF9F090F0ADBE0BA0FADA09E0CB0AAC9AC0A0C0A0A00ACA0000C0000C0EEFFFFFBEACAC0C0A0CACACFEFEFFFC00A0A0000000A000A00A00000A0A0000000000000000AC0BE0A00000A00F0A900E0CBCBA909E9E90B99A9EBDBC9A9DBDBDF99ADB9A909E9ADB00B0DB090A9E0EB0E9C0A00A000A0000E0000CA0A00A00ACFEFEFFEF0900A0ACEBCFEFFEFFFFEBE000000000A0000000000000000090A009000000A0A009AC090A00A00A0000CA009A0B0D0F0909B90DADB9DADBF9CBCBCB9FFDBCBDADA9ADACEBCBACB0ADA0B0CB00A90E00DA00C0A00000A0000A0CA0CAEFFFFFF00E0E0ECBCEEFEFEFEFEFF0B0B0A00A0000A0A0DA0A000000000000A0A000000000000B0A000009000A0B009A0000A000A0E00C90900909E9CBF9BDBDA09EFBCB0FBCB09A9CBC9A0F00F0CB0CB00E00B000A0A00A00A00A000C0000ACFEFFFEFFE0E9E9EEFFEFFFFFFFFEFBC000000000A00900A0000A000000A00900000A00090A0A0C000A0BCA00B0000A000A0000B09090B0A0009E0B09B09E9E9A9FA9ADBCFBCBCBE9EFEBE9EBFFBFBFFBE9A90AC0A0C0000C0AC00C0A0A0A00CBCFFFFFFACBCEEEFFEFFFEFEFFEFFFE0A0A0A00A0000A0BC0B0000000A000CA0000000A0A00C00A0A9C0000CAC0CB0000000A0A000A0A0090A9A09C0E00F0B0BCB09BCBEFBFBFBF9EFADADBFFFFFFFFFFB9A0A00A000A0A0A000A0A000000CA0EEFEFFEFEFEEFFFFEFEFEFFFFEFFEFB00090000000A0000A000000000000B000A000000000B0A09000A0A0A09A9A0E9A00000090A090000A00000A0B0BCADADABCBACBFBFFFFFFBFBDFEFEFFFFFFFFFFFFF90CA90CA000C000A0000A0AC0A00E0FFFEFFFFEFFEFEFFFFFFFFEFFFFFFCB0A0A9A00A00000000A0A00A00A0000B009A0000000009A0A0000D0DAC0E900009A09A00090A00B00A0A090E0F0B0B0BCB009ADFFFFFFFFFFFAFCBFFFFFFFFFFFFFBFA90A000B0A0A0C00E00C00A000E0EEFFFFFFEFEFFFFEFFEFFEFFFEFEFFF0A000000B00A0A00A9000000000CACA00A000A00A0A0000000A0A0AA0B000E9A0000000A0A09000009090E09A0ADAF0FB0B9EBAFFFFFFFFFFFFFFEFFFFFFFFFFFFFF9A0AC0B0C00000A0A00A0A000E0BCEFEFFFFFFFFFEFFFFEFFEFFFEFFFEBA009A000A0000000000A000A0000A0B0CADA000000900A000B0090C9C90A9A9000A00A090090A0000A0E0A90AC9F0F0BBCBDABDFFBFFFFFFBFFFFAFFFFFFFFFFFFFFBA9C90A00A00A0A00C0A000C0E0ECEFFFFFFEFEFEFFFEFFFFFFFFEBFACBCF0A000A0000A0000A0000A0000A0D0CA900DA0000000000A000ACA0A0A0000A0A90090A0BCA00A0A000090A909A0B0BE9BEBDAFBFFFFFBFFFFBFEF0F9FBFFFFFFFFFF9A0A00E00A00C000A00CACAF0FEFFFEFFFFFFFFFFEFFFEFEFEFAFCCFACAA900A000A0000A0000B00000A000A0900A000B000A0A000000A0900000B00000C0A00000009E090000B0AD0A0A9CAD0BE9FBFF9E9FBFBFBFBFFFFFFAFBFBFFFFFFFFBE900E90A00E0A0E00E0ACBCEEFFEFFFFFFFFFFFEFFFEFFFFEFADABA0000F0A0000000A000000000000B000A00A0A90A000A0000000A0A9CA0B0B000A0A00A00A00B0A009A0A0A0CB0A9000A9ABDBFFFBFBFBFBFFFFBFBFFEFECBCBFFFFFFFFFB9A0B0A00DA000000E9ECFEFFFEFFFEFFFFFFFEFFFEFFFEAF0BCAC0C0E0AA0000A0A0000000A0A00A0000000000000009009000A0B00000A000000A00900A90909000900A000900B09000A900FDAFBFBFBFFFFFFBFBFFFFEFF0BFBFFFFFFFFFFBCB0C00CA0090E9EE9EEFEFEFEFFEFFFEFFFFFFFBEFFECAF00E000A0A00CF00A0000A000A00000000ACA0B00A000000A00A0000000A9A0A9A9A0A000ACA900A0A0A0A0A90A9A0A000A9A900B9ABFFFFFFFBFFBFBFBFBFBFFFEFDAFFBFFFFFFFFA900A0A90AE0E0E0FEFFFFFFFFFFFEFFFFFFFFEFEFACABC0EA0E0AC0CACA0B000A0000A0000009000090000000A00A0000009A000000000000000A90000E00000009000A0000090A0900E9E0E9FBFFBFBFFBFFFFFFFFFFFFFBEBF0FFFFFFFFFFBF0B0D0AC90E9EFFEFEFEFFEFFEFFFFFFFFFFFFEF0FAC0A00C00C0ACACACF0A0A0A0A00000A0A0A0A0A0A0A0A0000000A0A0A000A0A0A0A0A0A0B0A0B0B0B0B0B0B0A9A0B0A9A0A90A0F9BB9BFFFFFFFFFFFFBFBFBFBFBFFEFFCBFBFFFFFFFFFF0B0E0ADAEEFEFEFFFFFFFFFFEFFEFEFFFFFFFE9EE0E0E0E0A0E0E0E0ECAA00000000000000000000000000000000000000000000000000000000000000000000000000000000000A9FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBFBFFFFFFFFFFB9ACBCFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE0E0E0E0E0E0E0E0E0A000000000000000000000010500000000000070AD05FE','Robert King served in the Peace Corps and traveled extensively before completing his degree in English at the University of Michigan in 1992, the year he joined the company. After completing a course entitled "Selling in Europe," he was transferred to the London office in March 1993.',5,'http://accweb/emmployees/davolio.bmp'); + +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(8,'Callahan','Laura','Inside Sales Coordinator','Ms.','01/09/1958','03/05/1994','4726 - 11th Ave. N.E.','Seattle','WA','98105','USA','(206) 555-1189','2344',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00F00900000000000009090FB0000900000090000000909BFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0009C90C0F9E9BE000090009000D09009009000000000000000B0900000000900000FF009CD00000009000090900000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B0D0900909E9FC9000900900FBFA90000000090000909000000D00B0000000000009000009B00000000090900000909BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0900B00009E9E09000900F9DFFFF090009000090000090090B09090000000000009F00000F0000009000009000000BFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AC90009009090C9000099E00D0FFFE900000000090009000F000000000000000009E90090F00000090090900009C9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00900000000900900009F00090909ED009090900000090090000090000000000009E0009F0000000000000909E90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFFFFFFFFFFFF90D00909090909000900BC90900009BDA90000000000BEFFE00000000000000000090F09A0009000090000900090BFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFCBBF00000000000090009FE00000000FFC000900909DFBD0B0000000000000000000099ED00009000090009F00009BFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFC9F000000909000000099E00000090B0090090000BFC00D00000000909A00000000009000000000000900BF009ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFFFFFFFFFF9E9FF90000009090090009BD0B0909C900000090900900B00000000000900000000000009000090000000900009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFBFFFFFFFFF09F0009000900000000000FBC9000A00909000009F000F0000000090000900000000000000000000900009F009EFBFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFEFFFFF0F009000000900000000090DAFDBD0900009009FE000900000000009000900000000000000000000009090FC9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBDFBFFFFFBFFFFFFF0000000000000000009000090000000000000090000F000000000000000900000000000000000000000090009FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFBFFFFFFFFFFFF090909090090000000000009000900090000000000B0090000000009000A0000000000000000F00009000900BFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBFFBFDFFFDFBFFBFFFF00000000000000009090090000900000009BF00990F00000000090000909000000000000000900F9E0009009FDFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCBDFFBDBFFFDFFFBFFC000900900000000000000000900090009CFC9FF0EB09090000000900000000000000000009009009A000009BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFBFFFEBFFFFDFFFFFD0009009090DBDB00000000000000090FBFFADAD0F90009A00900009090900000000000000F00090D9000000FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBFFFBFDFF9FFFDBFBFFFEF9EB00000000F0FADFBCBC90000090000BCFFCF0F00F0090090900909000000000000000000090000000009009BFFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFFBFFFFFFFFFFFFBFBFFD000900099A9DF0FFFFBCF000000090BD0B09000B09A90900090A090900000000000000009E00009000009AFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDAFFFFFFFFFFF9FBDBFBDFBDFDFBCBA000099FEDFE09F0D0FFBC00000900D0A9C0000F0BDA09A9000900009000000000000000099E000B0090099FDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AFDBFFBDBFEFFFFCFBDFAFBCFFDFD00000FFF0F9C009E09CBC00009E9AFD000000F900D009C09009000090900900000000000090000000000BFBFBFBFFFFFFFFFFDFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDBEF9FFEF9F9F9FBDFADF9FBDBEBFE909009BD009B0F9FE9F0900009C900000000B09F0090B900000900000000000000000000090990000009FFFFFFFFFFFFFFBFFBFFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFFFFBFF9F099EB9F9FBCBE9FABDBFEFFEFFDFBC00090FE9AFEF9E09F000000000000000000F0900B09000090000009090000009000000000000000009FF9FBFFFDFBFFBDFCBFFFBFFF0FFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFEFFFFBE90FDFADBF9F9FDFCBFDBF9FBFFF00000090DBDFFED00000000000000000000B0B909F090B000000000000000000A90000000000009000BFFFDBFFBFDBDFBFBFDBFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFBFFDFBDBE9F9F9B0BDFF0FBEFAFBDBFDFFFFFEFF0009000000909090090000000000000000F9CB00BFC90900900000909009009C0900000000000000099FAFF9FF0FAB0F9FBEF9FFFDBFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFBFFFFFFFFEFCB0B9FBDF9FDBFFEBFAFFFBDBFF000900090000000000000000000009000F09099E90B00900000000000900909ADA900000000000090BFDB9E90B9D9F9ADBDBFFFBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFBFFFFBFFBFF9FADBDBDBCBCFBAFBBE9F9FFDFBCFFFFFF90000000000000000000000000000000B0A9E099E9C090B090000090009000900000000000000000909BC99BCDBEBFFFFFFFFADFFFFFFFFFFFFFFFFFFBFFFBFFFFFFFFFFFFFFFBFFFBFFCFBFFFFDFBFFDBFFFAF90B9FFDFFDFFFFBFFFFFFFBDAC0000000000000000000000000000000F9090B0090B0009A000000009000C000900000000000000000009AE9BBF9FDBFBFBFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFFDFFFDFFBDFBDBFAFDEBFFBCBDEBD9E9FBCBFBFADFFBFFFBFEFF909F0000000000000000000000000090FC909C900909000909009090000B9090C0900000000000000000999E9CBFAFDFDFFFFDBFFFFFFFFFFFFFFFFFFFFBFF9FFFBFFFFFFFFFBFF0FFBFFBFFFEDFBFDFADFBDBDBEF9F0FFF0FDFFBFCFBDEDBDAF009F9F9000000000000000000000000FB09A90A90000900900900009090000A9000000000000000000000B9FBDBDBFBFBFFDBFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFBDFEFBFFBDFADF9FBFBDFBFDBEDAFBCBDAFBF9FFFBF9EDBFFFBFFFF9F000000090000000000000000000000B0F0900900B0900000B009090B00090900000090000000000900099CBCBDBFADFFFFBFFFFFFFFFFFFFFFFFFFFFFDFBFBF9FDFBFFFFFF9FFF9FFBDFBEFF9FEBE9BE9BF9CBFBF9F0FADBCBFFBFFF0FF0F9E0000000000000000000000000000090F09F0A90090000090909E0000000000000900000000000000000000B9BDAF9FFBFBFFFFFFFFFFFFFFFFFFFFFFFFBFFDFFFFBFFDBDFBFF9FBFF0FFBDBDBE9FDFFDBFF0FBF9E9EDBDBFFFDBDFE9FFDBFBC9FA00000000000000000000000000000F90BD9E9009000000000909090909000900000009000000000000090E9BDBF9FFFDF9FBFFFFFFFFFFFFFFFFFFFFFBFFBDFFFFBFFBFCBFFDF0FF9EFADBDBFBB9AF9ADBCBCBDBBEBF09BFAFBDBF0FAD0FBC9D09000000000000000000000009000B090B0909A009000909009A0000000090009000000000000000000099ADADAFBDBFABFFFFFFFFFFFFFFFFFFFFBFDFF9FFB9F9FFFFFBFDABFFBDFB9FBEBDADEFDBEDF0BDBFADF9F0F0F0FDEFF9FBDBF09B0A90000000000000000000000000000F00B0DA9090000000009000090090000000000000000009000000009ADB9BDBCBEDBDFFFFFFFFFFFFFFFFFFFFFFFFBFFE9FEFF9FF9FDBFFCBDAF9FE9F9E9FB9BADB0BDADADBDAFF9F9FFB9B0F9E9F0DBC0900000000000000000000000000000F09CB09AD0B00000000090900900000000009000000090009000000090F9E9FBDBF0BFBFFFFFFFFFFFFFFFFFFFFBFCF9FFDBDBF9FFBFE9FBFBF9EB9F0F9FADEFDBCBCB9F9FABDB0FAF0BDEFF0F9E0B00B9000000000000000000000000000090BE9009090909009000000009009009000000000000000E00009000009B0F9B0FBDBDBDFFBFFFFFFFFFFFFFFFFFFFFBFFBFFFBCBE9FE9FF0DBCBDBDE9FADB9B9BCB9DBCB0F9FDADBDB9F0A90F9ADBC9F000000000000000000000000000000000F90B00F0B0C00900900900900900B09000000900000909000000000000DBC9F9CBF0BFBFFFBFFFFFFFFFFFFFFFFDFFFBFCBDFFFDFB9FB9FBDBFADA9F0DBCFCFCBDAA99ADBE9ADBCBCF099FBBCB099A0900000000000000000000000000000000B0F09B0909B09000000009000009000090000000009000000000900009BA9FADBF09EBDFBFFFFFFFFFFFFFFFFFFFBF9FDBFEBF9FBDFF0FF9E9E9F9F0FB0F9B0BB0F9DADBC9BDBE9F9B9E009C90DA009000000000000000000000000009000000F09BC09A900900900900009A000009B0000000900000909000090F00090DA99ABCB9BEBDFFFFFFFFFFFFFFFFFBFFFFFEBF9BDFF0FBCBFDAF9F9F9ADF09F9ADBC9F09A9A9BADA9DA9E9E9900BCB00900000000000000000000000000000000900F009B09C0B00B0000009000090000009000000000000000090009000009BDAD9DBC9D9FADFBFFFFFFFFFFFFFFFFFDBFDFCFFADBFDFBDBF9FADB0F9A9F0BD9ADBE9F0D0D09DADA9F9B09ACB090090000000000000000000000000000000000000F09A0F099090D0900000090900090090B00000090000000000000900000009A0B0B0BF9FBFFFFBFFFFFFFFFFFFFBFFFBFBF9FBDBF0FBE9FBDBCBDADB0F0BE9F09B0B0B0BDA9BBCBC0F0D90009000000000000000000000000000000000900000B00D990B0009A000009090000900000000000000000000000000000000099B9F9F09ADBFBDBFFFFFFFFFFFFFFFFFFF0FDF0FBCBE9FBD9F0DADBDADB0F9BC9DA9E9E9C9BDA90D0990B909A0000000000000000000000000000000000000000000F09A0A090B00900000000909000000909000000090000000000000000000000909E9DAF9FEFBFFFFFFFFFFFFFFFDBFFFA9F0DBF9FBDBEBFBF0F0B0DB0D0B0B0F9A90B0009CB0F0A9C0B009000000000000000000000000000000000000090000FB09909E9C900900009000000000000009090000000000000000000000000900B090BDBE9BFFFFFFFFFFFFFFFFFFF9FFDFBFBCBDE9E9F9CF9F9F9FADB0F9E9F0D9F099F0B09909D0B00900000000000000000000000000000000000000000000F00009A90B0B000009009000900000000000000000000000000000000000000909A09AD9FF9FBFFFFFFFFFFFFFBEFFF0FADBCBDA9BFBCBB9E9A9E99B0F09B90BAB0BCA09C9ACB0A9090000000000000000000000000000000000000000000000F99E909DA9000900000B0000009009009090009000000000000000000000000009090BDBE9FFFFFFFFFFFFFFFFFF9E9F9DBCB9EBDF0DBFDE9F9F90F0DADBC0F0D0D00990A9090090000000000000000000000000000000900000000009090009BE09A9A0DAD900000900990000000000000900000900000000000000000000000000090B9FBFFFFFFFFFFFFFFFFFFFFBFADB0F9DA9FAD0B9F0DA9F0B90B09B09B0B090AD909A9009000000000000000000000000000000000900000000009000F9F0909B09AB000000900A900000009000000000000000000000000000000000000090BCBCBFBFFFFFFFFFFFFFFBDBDADFADF0B9F0DBF9E9FBADA9F0F9CB0DB0DAD9A9000B000900000000000000000000000000000000090000000000000000F0B0F0000F9C900000090900900000000090900000000000000000000000000000000009B9FDFFFFFFFFFFFFFFFEFEBDB0DB0FAD0BA90FDB0D9BF09B0B99E9ADA90AD09B00090000000000000000000000000000000000000000000900090000B00F90B0B90B0000099AD0000000090900000000090000000000000000000000000000090FFBFFFFFFFFFFFFFFDBDBDB0FB0F9D0F0D9F0B0DBAD0DBCBC0E909090F9000009000000000000000000000000000000000000090900000000000000F909A9090CBC90000000B0909009000000090900000000000000000000000000000000009A9FFFFFFFFFFFFFFFFFBF09F0DB0B0B9B0B0BDBAD0B9A9B09B9BCBCB0000B0900900000000000000000000000000000000000000000000000900000FA9ADA90B9A9A9000090000000000090900000000000000000000000000000000000000009FBFFFFFFFFFFFFFFBDE9FE9B0DBCB0F09C909C9BD0F9C9E9C90909C9B9900090000000000000000000000000000000000009090000000000090000F0009ADA009C900B00009A90090009000000090900900000000000000000000000000000009FFFFFFFFFFFFFFFFFBF09BC9A990D09E9ADA9A9A90B0B9A9ADA9A9AC0009000000000000000000000000000000000000000000000009009000000B09BBD0909A9AC909000090000000009000090000000000000000000000000000000000009BFFFFFFFFFFFFFBEBDBC9BC9AD0E9A9A909B09D0D0BCB9C9AD09C90909A90000000000000000000000000000000000000009000000900000000000F000CBFAD00C9B090A0900000090009A000000900000000000000000000000000000000000BFFFFFFFFFFFDFD9FADBF0B90B990D0D0BC0DA0B0F09CB0F9A9A90F090000000000000000000000000000000000000000000000000000009090000F9A9090B0B0B00F099000000000090090900000090000000000000000000000000000000009FFFFFFFFBD9A9E90D090D0BD0A9A90B099A99C909B090B0D09CB090A9090000000000000000000000000000000000000000000000000000000000F090B0BDBC90090BC009000000000090900000900090000000000000000000000000000009BFFFFFF9FCBFDB9BDB9B0B9C0BD090B0DA090A9A90C9AD90B0B09CB0D0000000000000000000000000000000000000000000000000000009000000B0AF0D0BCB9A90BCB090090000000900A90000000000000000000000000000000000000000BFFFFDFBDBFCB9EDB0FC99CB9900BC90909CB900DA9B090F09C9A90900090000000000000000000000000000000000000000000000009090000090F9090B0F9BC900090F00000000090000909000000000000000000000000000000000000009FFFFFBFFFDBFFFB0FDB9FA90BCB909A90B0900DB090C9E90F0BC90B00B000000000000000000000000000000000000000000000900000000000000FA90BCB0F0BE909A9A9F000000000909000B00090900000000000000000000000000000000BFFFFFDFFFF9FFDFBFE99F9F090CB0DA9CB09A09A9B090B09909A9C900900000000000000000000000000000000000000000000000000900000900F9E0909E9F99AD090DA9090000000000090009000000000000000000000000000000000009BFFFFFBFBDFFF9FBDF9FE9F09E9B090909090900D009A9C9ACB0D0B090000000000000000000000000000000000000000000000000000000090000F09B00A99A9E9B0CB09E900000000000900090000000000000000000000000000000000009FFFFFFFFFFBDBFFFFBFF9FA9F9BC9B0A9A90F09A90F090B90990B09000900000000000000000000000000000000000000000000000090000000009BAC0909ACBE9FCB90A90B09090000000009000909000000000000000000000000000000009FFFFFFFFFFFFFFF9FEDBFDFF0F0BC0D90D0909090090F90CB0E9090E90000000000000000000000000000000000000000000000000000000090900F9B0AD09099A9BCB9C009CA00000000000090000009000000000000000000000000000000BFFFFFFFFFFFFDFFFF9FDAF9FBDF9B9A90B0A9E90B09000B09909E09009000000000000000000000000000000000000000000000000000000000090F0AD90A0B0ADBCB0F9A90B90900000000090009000000000000000000000000000000000BFFFFFFFFFFFFFFBFFBFFBFDBFDA9E9E90F09D0900D00B09090A0909B09A000000000000000000000000000000000000000000000000000000900000B0990A9D009BCB9F00909000000000000009B00000000000000000000000000000000009FFFFFFFFFFFFFFFFDFDF9F9BFCBFDBDB0F909A09A9009090DA0D9A090C09000000000000000000000000000000000000000000000000000000009090F00AC90A9F00BCB09B09E90900090000000009000900000000000000000000000000009BFFFFFFFFFFFFFFFFFBFBFEFDFBDFADBCB00F09B9C90B009A099A09F00900000000000000000000000000000000000000000000000000000000000009AB099A900BD09ADAD0F090000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFDBFDEDBDBE9FB9FBCBDBB0F0C0B0909E09000900090A90900000000000000000000000000000000000000000000090000000090900F0A0A09A90A909B9A909A090000000000000009000000000000000000000000000000BFFFFFFFFFFFFFFFBFFDBF9FBDB9EDFBCBDAD0D0B9B0DBC90909A9CB09A090000000000000000000000000000000000000000000000000000009000009BB00909E9E99F0F0E90F09000000000000000000000000000000000000000000000009BFFFFFFFFFFFBDBDFBDAF9FAD9EDB9A9F9E9ADBBDAC9A09A90A09000900D009000000000000000000000000000000000000000000000900009000909A9CF0A0B0009A00B099F00B0000009000000000000000000000000000000000000000009FFFFFFFFFFFFFFFADF9F9E9DA9B0ADBD0F9BDB0DA9BC9B0909090909E0909A000000000000000000000000000000000000000000000000000000000990BB0090B9A09A9CBE09B0D000000090000000000000000000000000000000000000009FFFFFFFFFFFFBDF9F9BE9F9EBDAD9B0DA9AD0BCBBDE9B0DADA9C000B090A0090900000000000000000000000000000000000000000000000000900000AD0F00A00ADA0D0B09BC9DA90000000000000000000009000000000000000000000009BFFFFFFFFFFFFFEBF9F0DB099099A9C9B0D9A9DB0DA9F0DA9090B09000090900000000000000000000000000000000000000000000000000000000000B09BA0009A99090A9CBCB0A90000009090000000000000000000000000000000000000BFFBFFFFFFFFFFDBD0DADB09F0F9AD09BCB9A9CBADB9F09A909E9090090900000900000000000000000000000000000000000000000000000000900090D0BCF0A0A9AA9A09A9A90F900000000000090000000000000000000000000000000009FFFFFFFFFFFFFBFDBFB990F0909C90F09090D0B9DADADFF90F09E9090000A90B000000000000000000000000000000000000000000000000000009000B0B09B009009AD0BC09CB90BD000000000900000000090000000000000000000000000BBFFFBFFFFFFFDFBC90DAD990F90B090BCBCB090E99B9A9DA909A90F09A090000909000000000000000000000000000000000000000000000000000009090F0B00A0A0B0BC9A9A9E9CB000000909000090000000000000000000000000000009FFFFFFFFFFFFFF9DB9F9DBCF99090DAD09090DA990F0F9FADA9AD0B9000900090000000000000000000000000000000000000000000000000000909009ADB00E000090B000B009E9AB900000000009000090090000000000000000000000009FFFDFBFFFFFFDF9FBDFFDBFDBDADA9099A9BC9B0D0B0B9EBDB9C90BCA90900090090000000000000000000000000000000000000000000000000000A0B090009B0000A90BB00DA09BD0E9000000090090000000000000000000000000000000BBFFBFDFFFFFFBFFDFFDBFFDBDBD9DB9009C9A9C9AD09C99FADA9A9099CB009000009000000000000000000000000000000000000000000000000009090F0090BB00A00A000B0A9F00B99A0000000090A0000009000000000000000000000009FFFFFBFBFFFFFFFFFDBC9009090B09CBDB0909A909A9A9ADBDBD0D0BCB0090009000000000000000000000000000000000000000000000000000000090909A090F0A00A9A9A099009F0FAD09000000009090009A00000000000000000000009FFFFF9E9FFFFFFFDBCB09BD9A9AD09E9090DAD090F09C90909BFAB0BC90DB0E90009000900000000000000000000000000000000000000000000000900F00090CBA0000000A09A0E9B0B0909000900009000000000000000000000000000000BFFBF9F9FFFFFFFDBC99FFFFADFF9E909009099ADB09A9ADA9BCF9D090B0B00900000000000000000000000000000000000000000000000000000000009090B09B0B00A00B00B0B09ACBDE9A9E90000000090000909000000000000000000009FBFFDA9BFBFFFBD9BFFFFFFFFFFEFF0F090A900900F0D090909B9EB0F09C90909090009000000000000000000000000000000000000000000000000909A0000000BF0000A0A0000B09B0B9C909A900900000090000000000000000000000000BFFFFBDA9FFFFFD0BFFFFFFFFFFFFFF9BFAD9AD00990B0F0BC9ADBDF90B0B0DA9A009000000000000000000000000000000000000000000000000000090909090900B000A0900A0B0B00F9E90B09C09000000900009900000000000000000009FFBF0F99FFFFF00BFFFFFFFFF9EBFF0BCFDA9F009000909909AD0BEB0F0909A90C90000000000000000000000000000000000000000000000000000000B0000A009AA000000A00000BCB9E9A90C9A90000000000000A0000000000000000009FFFFFF90BF9A9909FFFFFF9F009BDB0F0FBA9CB09AD00909E9A90BDB9D0BDA9090909A900000000000000000000000000000000000000000000000000090009090BA9F0A00A000A0B00B00B09A9B09A000000000900990000000000000000009BFDF990BDFFDF09BFFF9E9E99D000090909C0B0F009A000090DA99ADFA990DA9E9A0000000000000000000000000000000000000000000000000000009A900000009AB00000B00000A90F90F0D09A9D9000000000000E909000000000000000BFFBFE9A9B090900F9F9F9F9E9BD9B0CB090900909009090090090F9B0F00B0909090900900000000000000000000000000000000000000000000000090009009000B0F0000B0000000A9A0B09A9E9E0A9000000000009000000000000000009FFFF0909D09A909B9F9F9F9F9FCB0D99090B09909090000000090B00DFBDBC9ADA9CB00900000000000000000000000000000000000000000000000000090000009BCBB00A000A000A9A9AD09E9F90999C09000009009A90900000000000009FFF90B9F9A9FDFBFFFFFFFFFFFFBFDBF0BDA9CB0A90AD909090909909B90009A9090900900000000000000000000000000000000000000000000000009000000900B0A0A0000A00A00000B0BDA90ADB00A900000000000000000000000000000BFBE9090F9FFBFFFFFFFFFFFBFFDBF09F09DA9BD9E99A09A9A9A9ACB09E9B9AD09A9A09A0000000000000000000000000000000000000000000000090009000009009A9F00000B0000A00A00BCBD9ADBD00B0900009090909000000000000009FDF9900B0FADFFFFFFFFFFBDF9FBCBF09F0BDADA99E9DA9C90D099090B9C0D90B09C90D090900000000000000000000000000000000000000000000000000000009A00AB00A0000A000000B0B9A9ADA9A9009A0000000000000000000000000BFFBBCB099BDBFBFFFFFFBFFFAF9FBD09A0909909F09A99E9A9A90090900B9A0F09A990A90000000000000000000000000000000000000000000000000090000090A0B09F0000A9A0000A0B009ADADA9AD09000000090009090000000000000BFFDBC9909BCBFFFFFFFFFFFDBD9F0D0B9C99ADA9F09AD0F090D09E9B09E9900990D09A09009000000000000000000000000000000000000000000900000000090BC9000AA000000000000000B0DBDB0D09E9E909000000000000000000000099FBFDBF0BC099BDBFBFFFFDFBCA909A9009AC909B0BD0B90B0B0B0990F90B0F9E0B0B0C909A000000000000000000000000000000000000000000000000000900009A9AB0B0A000A000A00B000000BCBADA909A0090000000009000000000000BFFFBDBD9B9A9FADFFFFFFF9F99E09009A99A9B0C9CBD0F0D9C90B0FB0BD0909900909B00C90909000000000000000000000000000000000000000000000000009000A90BF0000A90000000000A9B0BD0B09E909000000000090000000000009FFFFFFFBF09D09FFBDFFFFBE9F099009000090C9B9A9A99B0B9BD9F90D0B9E9A0BDA9009A90000000000000000000000000000000000000000000000000009009ADA90A00B000000A0000A0A00900FF0B0DA90F000000000000000000000009BFFFBFDBD0DBA9BF9FFFFF9FDBE9B00900909009BC0DBD0F09CBC9E90F9BDA909D9009E9090A9000000000000000000000000000000000000000000000009000900900B0FBA0A00B000000000A00A90B9E9A9E90B00000000009090000000000FFFFFFFFBFBD9E99FBFFFFFBFDF9C9BC9B09C9B009B09A90F9BDBFBDB9E90DADB0A9B09A90900900000000000000000000000000000000000000000000000090A90A0B0B0AF00000A000000000009A9CBDAD09AD090000000000000000000009BFFFFFBDFDBE99F0BDBFFFFFFBFFBC9B0DA9A090909F09F90F0F99CBCB9F9B90D9C0D0900F0900090000000909000000000000000000000000000000000009009090B00AB9B0000A0000000A00B0A9A90B9A9E90BC000000000009000000000BFFFFFFFFBFF9FE9BDBFFFFFFFFDBCBD0F09D9F0F09A09E90FBDBEFBDBDA9E9E9A9B9A9A90900B0900009009E9ADA0000000000000000000000000000000000A900AB0A900EA0000900000000000A0B09E9E9F09A900000000000900000000009FFFFFFBFFF9FF9BCBDFFFFFFFFBFDB0B09F0B099009DB9BFBDBF9BDB0F9F9B9F9AD0D09C9009000009000B0909090000000000000000000000000000000090909A9009A9ABF0A0A0A00000000A09000A90BCBCBD09000000000000909000000FFFFFFFFF9FFF9FDBFBFFFFFFFFDFADF9DB0BC9E0D9A9CBD9DBCBFDBDF9E9E9E9C9A9A9A9A9A0900900009C909009B00000000000000000000000000000000900A90ABE0A00B0000A9000000000A0A0B0BC9A9B0AF0000000000000000000009BFFFFFFFFFFFBFBFDBDBFFFFFFFFBDB0F0DBDBB99A09B9EBEBFBF9FE9FBDB9F9B9BDB0D9090900900009009A90B00C90000000000000000000000000000000A909A990B00B0F00009A00A0A0000000900B0BCBCBD00900000000009000000000BFFFFFFFFFBDFFF9FFFFFFFFFFFBDFFDB9A909C9A99FCBDBDF9FDF9BFBC9F9ADE9E90F0BD0B09A00900009090C909B00000000000000000000000000000009009E0A0B00B0AA0A00A0A0909000A9A0A0B0F09A9B0B9E09000000000000000009FFFFFFFFFFFFF9FFFFBFFFFFFFFDFBCB9E9CBCB0D0F0B9F9FBF9FAFFDBDBE9F9B99CB990A9C9000900909A09090F000000000000000000000000000000000090BA90B00B0A0F0000B009AAA0000000000B0A90C9C009A0000000000900000000BFFFFFFFFFBFFFFBFFFFFFFFFFFBDDBDE90B909B0B9BDF9EBDEFBDF9ADBF9F0F0F0BC9E9DA900900000009000B09090000000000000000000000000000009A9AD0A9AA00A00B0A000BAE9000000A000090B9E9A09B90D9000000000000000009FFFFFFFFFFFFFBFFFFFFFFFFFFFFBE9A9F90FBCBD0F9A9F9FBDBFBDFF9F0F9F9F9F9B09A909A90909000009A90BCB00000000000000000000000000000000909A90090B00B0F0000B0B0A0A0A0A000A0A0A09A99AC09A0900000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFDF9F9F0BD09909B9CBDADBDBFDFBDBF9F9F09E90BC9F9E9E900A000909009C909000000000000000000000000000000009CADA0B0A000B00A000A0A00000000000000090BBC9E090BCB000000000000000009FFFFFFFFFFFFFFFBFFFFFFFFFFFFBCBD0BD0BDADB0FBDBFFFFDBFBDBF0F9F0BDB0BD9A9090909090900000900000900000000000000000000900000000009A90900A09A000AB000000000000A000A0000A000B09B09090B00000009000000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFDF0BDA0F9A9BCB0DAF9BCBFCBDEBDBFE9F9AD9CBADADA9A9E9000000090B000000000000000000000000000000000009009A0B09A00A0A0F0000000A0A0000A0000A00A9A9F0D009A9C90000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F09DB09D099DBDBDFFBDBFFBDBFDB9F9F9BA9D909B0D09009090000000900000000000000000000000000000000000B00900A00B0009AA000000000009A000A00000000A0B9A9000B0000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBDA09F9A9E9A9ADAF9FFF9FDBFDADFADAD0DB0BDAD9A909A000090000900000000000000000000000000000000009009E0A900A00A9A0B000000A0A00A000A000000B0B9BCAC00090C9000009000000009FFFFFFFFFDBFFBFFFFFFFFFFFFFFDBDA99F0AD0909FDBD9F0B0F0BFCB9FB9DB9FB0BDA9A090F0909000000900B00000000000000000000000000000009009009000A90A0000E00A0A090000000A9000A000A0A0B99090A90A00000000000009BFFFFFFBFFFFFFFFFFFFFFFFFFFFBF909F00990B9FA9ADBEBDBD9BD9BDFBDFADE90F099C9F09090DA90000000900000000000000000000000090000000A09A90A9A900A9A9A0B000000A0000A000A0A00000B0F0ACB0090090900009090000000BFFFFFFFFBDADBDBFFBFFFFFFFFDFFFA9BDADBC09FDBC99DADAF0BE9BDEBDB9BF99F0BB09A9A9A0000000000090000000000000000000000000000000900C0B000A0A000A00F00000A0000A000B0A0000A00BA90B00909000000000000000009FFFFFFFFBCB9B0BC9FDFFFFFFFFFF09D0909099BC9A9B0F0F9D9FD9FCB9DADFC9AD0BD0F0D09C9909000000000000000000000000000000000000000909A9900B00000A900AB0A00B0000A000A0A000A000B000B0DA00A009000009090000009FFFFFFFF9F9F0D99BDAFBFFFFFFFF9F0BCB0BCBC9A9C0F9B0B0A90B0B9FABDA9BDABD0B909A909A0000000000000000000000000000000000000000000090A0B0A00A90A0B0A00A000A0000000090A0000A0A9A9A0D009900000000000000009BFFFFFFFFFFBF9E90B99FDBFFFFF9E90909C909A909B90D0D09909090909DA9DABD09F0CB0D0B0090000000000000000000000000000000009000009099AC9A090B00A0B000F090A00000A00000A9A00009A000A9A0900AC0900900090000000BFFFFFFFFFEDBF9F9CBCBFFFFFFFFDBDB0B90B090DAD0B0B0F0FBCBCBC9A99E9D0F9A9B909A9090000000000000000000000000000000000000000000A09B09A0A00B000A00A9A000000A0000A00A00A00A00A09A90B00990000000900000000FFFFDFFFF9FBCBCBCB99F9FFFFFFFBE909C09C90B090BC9F9BD0090909AD0B9B0B9ADAD0F090CB09000000000000000000000000000000000000000090DA0A090B0A0A9A90AB0000A00A0000090A00000B00009ADAD0C900A000009000000009BFF9BBFF0FBC909099ACBDBFFFFFBD99CB09A9AC9BCBDBBD0F0F9BCB0909ADACBDAD990B090B90000000000000000000000000000000000009000009A9A9009AA00009A0A00FA000000000000A000000A0000A0BA9A9BC9090000000000000009FFFC909FFC0000000990B9BFFFFFADA9090009900909C0FBC900090BCB09099909ADAD09A90009000000000000000000000000000000000000000B0C9A0B0A090B0A000000B0A0A00A0000000A0000000A00000F0F00B0F0900000000000000BFF90090BFF00000000090FDFFFFDFBCB0E99000B090B9F0FE00000090090000090909A9C90DA900000000000000000000000000000000000000090B909A0F9A0A0A9A0B0A0F000000000000A0000000000000A9AA9BD0B09A000090000000009FBCB0009EF0900000090F9BFFFFFBD9099000B9D00900BFF00000000900090B0A9A9A9CB0B0900000000000000000000000000000000000900090900EB09A00B009A9A0000B00000A00000000000000A000A09E090F0ADAD000000000000000FFFFDA9009000000099A9B0FFFFFBC9A090009000BD009FFC0900000000000909D090D9A909000900000000000000000000000000000000000900DAC9B00A9AB0B0A0A9A000F0A0A000A0000000000000A0000ABFAB0F909A9000090900000099FFFBDA9000000900009C9FBFFFFFFE9DA0F009090A9F000F000000000009A0900B09A0900009000000000000000000000000000000000900009A09B00BE9A00A000B000A00B00000A000000000000000000000009AB0F09C00900000A900000ADBFFFFBD0B0900909C9B09FFFFFFBDA9900900D090090900000000009000900B09E99CA909000000000000000000000000000000000000090009000B00B09A90BA00A090A0F000000000000000000A00000000BAA90F9E9A900000009000009BFFFBFDFFBDF0F0A99A9CBFFFFFF9FF9CB09A90A90090F0F090009000090909090C90A900000000000000000000000000000000000000000000900BD0B0A0A9A0000A90A000A00A00000000000000000A00000A0090A9A090090000000000000BFFFFFFBE9E9B9F9DA9DBBDFBFFFFE9CB0C90099009000909CA9900D99CB09AD0B90B909000000000000000000000000000000000000009000000090A0B0A9ACAB0A90A0000B0000000000000000000000000009A0A9ADBE90000090009000090F9FFBFDF9F9E90B099A9FFFFFBFF9FBC9B00900090B0909A99CA990A0909C9A9CA90C00900000000000000000000000000000000000000000090B0A9A0B00AB0000A000000F0000A0000000000000000000000A9A00009009090000000000009FAF9E9ADA0909009AC9E9BFFFFFBFCBB0C9F0F0B09090BC90B99CB990B0B0090900B0900000000000000000000000000000000000000000000000D0A9A0B000B00A9A0A000B0A000000000000000000000000A0A09A90ADB00009B000090009BFF9E9C9090000090D9B9FFFFFDFFFBD0F9A090900000909A9C9A900E90D09F09A9D09A900000000000000000000000000000000000000900009090A9A090A9A00A00000000A000A00000000000000000000000900A0009000909000000000009FFFF9B00000909ADBAFFDFBFFBFFADAF90090000090909AD09ADBCB99E9A000090A00000000000000000000000000000000000000000000000000A9A0B0A9A00A00A0A0000F0A000000000000000000000000A0A000B0009000090900090900BFFFFFFFBDB9FBFFBDF9FBFF9FFFDFBDFE990090900000090BC90090009090909E090909000000000000000000000000000000000000000000909ADA900B000A00000000000B00A000000000000000000000000B0A9000F00B9000A0900000909FFFFFFFFFFFFFF9FBFFFFFFFFFFBFFBF9EBD0A000000000009A9A9CB000000B0900000000000000000000000000000000000000000000000000090A0A9EBA09A0A00000000F00000A00000000000000000000B0000A090090C0909000000000BFFFFFFFFFFFFFFFFFFFBFFFFBFFFFFDFFFDAF99090900900900D00900909090900909090000000000000000000000000000000000000000009A90A9E9A900AA000000A0000A0A00000000000000000000000A000A00000B009B000090000009FFFFFFFFFFFFFFBFFFFFFFFFFFFFFFBFFFBFFFDEF0B009009009009009CB09000000000000000000000000000000000000000000000000000000009A9A0A0A900A000000000F00A00000000000000000000000BA900A00900B00F090009000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFBDBCBDA09A09A09A90B00000000000090000000000000000000000000000000000000900009090FA00090000A00000000000B00000000000000000000000000000A900009009009E9A0009009FFFFFFFFFFFFFFFFFFFFFFFBFFFBFFFFFFFFFBFFFFBCBDBC9F0900009090000000000000000000000000000000000000000000000000000900A0900B0A00A00000000000000E00000000000000000000000000B0A00A0000090B00909909009ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADFF9E9B0000090900000900000000000000000000000000000000000000000000000090090DA0B0A90A000000000000000B0A00000000000000000000000A0A000000A9B0090B0BCA00A909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFDFFB9EBD0090900000000000000000000000000000000000000000000000000000000090000B09A0090A0000000000000000F000000000000000000000000000000000000099AD0D09090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFBF9EF9009009090900000000000000000000000000000000000000000000000000009000090DA00B0A000000000000000000A0000000000000000000000000000000000000AC9A90B000009C9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFF9DE900900A090000009000000000000000000000000000000000000000000009000090A909A90B0A00000000000000000F00000000000000000000000000000000000090909CB0D0B0009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDAF9EB900DA90900000090000000000000000000000000000000000000000000000000000090BC90A00000000000000000000B000000000000000000000000000000000000A90B0B09A90090B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFBF9F9000B0900090009000000000000000000000000000000000000000000000090000090A9AD00B000000000000000000000E00000000000000000000000000000000000090090DAD0900009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBDFDBCB090090909000000000900000000000000000000000000000000000000000000000009C90BA0A00000000000000000000B00000000000000000000000000000000000009ADA90B00F009A9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BCBD0090B00B09000900900090000000000000000000000000000000000000900000900A90BD090000000000000000000000F00000000000000000000000000000000000A009090BCBD090009FFFFFFFFFFFBFFFFFFFFFFFFFFFFFFBFFFA90F9DB9A090D00900009000000000000000000000000000000000000000000000000000900090F00A0A000000000000000000000A0000000000000000000000000000000000000B0B0F0900B0099BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FF9DA9C0909A90090000090900900000000000000000000000000000000000009000000000BDA9A9000000000000000000000000B000000000000000000000000000000A00000909C909EBD00B0C9BFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFBD909EBDA90009009009009000000000000000000000000000000000000000000000000090090009C00B00000000000000A00000000E000000000000000000000000000000000000009ADB090AD009A0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FBDB0F0900B900900000909000090000000000000000000000000000000000000000000009BCA9A0000000000000000000A00000B000000000000000000000000000000000000B0A909F9F9A900999FFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFDA9FADF90009C0000900900000900000000000000000000000000000000000009000090000B00990900A0000000000000000000000A00000000000000000000000000000000000000D0BE9A00DAD090BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF090F9F90009A9090B0090090090000009000000000000000000000000000000000000009AD9E90E00A000000000000000000000000F00000000000000000000000000000000000B09A909E9F9A909A9E9FFFFFFFF9FFFFFFFFFFFFFFFFFFFDFF09F9F9A900090009000009090000900000000000000000000000000000000000000000000A09009000000000000000000000000000A000000000000000000000000000000000000009E9E9A9C9E90909BDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9E9ED000909000900900009090000000000000000000000000000000000090000000099D0A9A0A09A00000000000000000000000B00000000000000000000000000000000000A09A909F9E9A90F09BCBFFFFFFFDBFFFFFFFFFFFFFFFFFFFFBC09BDA90909A00090000090900A0900009000000000000000000000000000000000000BCA009C9000A000000000000000000000000E0000000000000000000000000000000000099AD00B0A9E9E90BC0B9FBFFFFFAFFFFFFFFFFFFFFFFFFF9FC99FDA9000090909000909A0009090009000000000000009000000000000090000000090090B0B0A009000000000000000000000000B000000000000000000000000000000000A0A0DAFD099E909E90BD0F9FFFFFFDBFFFFFFFFFFFFFFFFFFFBF009A909009E0009A9000090900000000000090000000000000000000000000000009A0F009CBC000A00A0000000000000000000000B000000000000000000000000000000000090B09A9AC99FA99AD0B9ADABFFFFBFFFFFFFFFFFFFFFFFFFFDE900D0009009900000090900090909009000000000000000009000000000000000000D9009A90B00090000000000000000000000000E000000000000000A000000000000000000000DADADB0E9DAD09BC09BDF9FFFF9FFFFFFFFFFFFFFFFFFFAF099B09000B000909000009090000000000900090000000000000000000090000000B0AD0B0DA00000A000000000000000000000000B00000000000000000000000000000000000A9B0BDB0E9FADA9BCBDBCB9FFFF0FFFFFFFFFFFFFFFFFBF9FD0BC0009009009A900090900A09A9000900000000000000000000000000000000099C090B0DA9A09A00000000000000000000000000A00A0000000000A00000000000000A0000000009CB0F9B09F9E9B0B09ADBFFFFDBFFFFFFFFBFFFFFFFFFF0C0B0B000909000009000009090000900000090000009A0090000000000000000000BDA9C9A000A0000A00000000000000000000000F0000000000000000A0000000000000000000BCA9CBCF0F0BCBCE9CB0DADBFFFADBFFFDFFFFFFBFFFDBDFB09C909009E0900900090900009090000000000000000900009000000009000000B0009A0F9A009A000000000000000000000000000B00000000000000000000A00000A0000000000090B9B0F9E909B99A9CB9A9FFBDBFFDFBFFFFFFFFFFBEFBC9A900000090009000000009090000090009000009000000000000000B0000000909E90D90009A00000000000000000000000000000A0000000000000000000000A000000000A0000B000C0FDA90BCBCAFDB90FDFBDCBFFFFFFFDFFFDFBDFDBC9090B090090909009090909000A9000000000909000A900009000000900000009ADA90F00A0B0000000A00000000000000000000000F00000000000000A000000000000000000000000B0909ADF090DBD9A9E99A9FFB9FFBFFBFBFBFBFDAFBDB0000000090A0000000000000090009000009000A0090000000000000C90000900909E90B00000A00000000000000000000000000000B00000000000000000A00A000A000000000A000000A909ADF0B0FADDA9EBDA9FED9FF9FDFFFFDFAF9DAFCB0090000090900900000900900900000900009090000009000000090A00000009A090E900A9A0000A00000000000000000000000000A000000000000A000A0000000000A000000000A009000A9A0F0F9FAB9C90B9EDB9A9FFFBFADBFFD9EBDB9C090090090000900009000000000000000909000009009000900000090000000AD0F090A90000000000000000000000000000000000F000000000000000000000000000000000000009A009E9C9F9F0F0D0DA9E9C9B9E9FFDBDFDFFDB9A99F9E90000000000900000000009090090009000A000000000000900000090000000990B09A000A00000A0000A0000000A00000000000000A00000000000000A00000000000000000A0000000B0090B00B0F9FAFAD09A9E9E9ADBBEFBF9FBED0FF0F0000900009000000000009000000000000909000009A90000000009A0000900BCAD0A00A00000A00000000000A00000000000000A000B00000000000000000000A0000A00000000000A0000B00090CBCAD9F9A9C90909C9ADF9FDBF0F9A90BD9F00000000090090000000000000000900B00C09090000000900000090000009090A90B009A0000000000000000000000000000000000E000000000000A00A00A0000000000A0000000000A9009E0B09F9AF0DF09ADA9A909B0F9ADAF9E99F9A909090000000000000000000900009000900B000000900090000009000009009E0900A00B0000000A000000A00000000000000A0A0000B000000000000000000000000000000009000A000000B00909ADAD09A09A909C90E90DB0FDBDBC9E9A9DA00000009000000000090000009000A900D09009C90E900000009A0090900DA09A0B09A0000B00000000000000000000000000000000A00000000000000000B00000B000A0000A0A009000B00900C000BEDADBC9CB0009090BC9B0BC9B090DA090000000000000000000000000009090E9A0090A0A900000000000000000B00B0B00A0000A000A0000A0000000000000000000000000B000000000000000A000A0A00000000000009000A000A00B009099A90F0B0CB0B00090BC9D0BC9ADB0900000000000000000000000000900000900900090900900000009000900BC0B0B00F09A9A00000900A000A000A000000000000A000A00E000000000000A0000A00000A0A000A000000A00000000900B00009E90FCB09C0090E909A0BC9A9009000000000000000000000000090000B09A9D0B9E0000B00000009000000F00B000F0A0A000900A0A00090000000000000A000000000000B000000000000000000000000000A000A00A0000000000009009E9E90F0B0D0A900A90000909AD090000900000000000000000000000A09D0DAC9A00000009C00000900A009E900B0BEB0A909A9A0A09000A00A0000000000A00000000000000A0000000000000000A0000A000000090000000A000A000000090090CB0C9CBC9C9FD0009000009E000000000000009000900000009090900B0900090D009E9000000A0909A09A9B0A90090A0A000000A00000000000A000000900000090A0000F0000000000000000000A00000A000A00000009000000A00000B00B0F9B0B09A000AD00000090090000000000900000D009009000A00D0B0090BCBCB00B00000000900000DAD0ACBCA9A0B09000A9A000A00B0000000000000A0A00000000000A00000000000A000000A09000A000A000A000000A00000900000000900C00DAD09FF00000000E9000000000000009CB0000000090909A90DADA90900090000009000009CB090B0B0A90E9ACA0B000009009000A0000000000000000000A00000B0000000000000A00A900A0A000000000000A9A00000000A0000909A0FBC9A90FF000000000090009090000090C9A0000B00BC9A9E9E90CB000000000009009000009B0B0D0A0B009AA900B000A9A00A00A00000A000000000000000A0000000E000000000000000000A90000009A00A0000000000000A09A9000009090B0DCB00F090000090009A0009009000B00909000900BC9009CB0000000000000090A000900C9CB0B0DA9A0900B009A9000000B00A0A000000000A00A0000000000000B0000000000A000000000A00A000000000A0009A0000000000A00000000DAA9CB00009CB00C9AD0909E090CB0000000099E0F9000BCA0000009000000900A90000E9A9A9C9EB0000BCB00A000A0B0A00000900000000000000000000000A0000A0000000A00000A0000A009000A00A09A090A0000A0000000A90000090F09D0BC90B0E90FDBAD0ACBC09A0900D0D0B0F0E90000BC009000090000000900D00090900D0DA9B00B0FB0A00B0B0A090009000A000A000000000000000000A000000F000000000000000A000000A00000000000000A000000000000A0A000A0900A09AD009BE9A0C9AD9C0B0C9009A90BC90090D0E90090000000000090F00B00000A0BDA9A9AC0BCB0000B00000900A00A0A000A0000A0000A00A000A0000000000A00000A0000A000000000A00A000B00A000A0000000000000000000B0900B0D9EDA0D009C9DBC9A0B9CB0EBDADAD00AD000A9000000C009000000A000D000009C9009E9E9A90A0B0B00A9A9A0B00A00090A00000000000000000000000000000B0000000000000A00B00000900A000090A00000000000A00000000000A000A0B0FDAAF0F0A00ADDACB0D90E90000AD000AD00000009A000000000909A0090B00B0F09B09A0A9000A0B0000000000900A0090A90A000000000000000000A00000E0000000A0000B00000A9A0A000000A000000A000009000000000000009A0900B0BDD0D09D099A0BD0E0AD000009000009000000000090000000D0E0090A0C90C90BE0A00900A9A0900B0A0B0A000A000A0000000B0A000A000A0A0A00000000B0000000000A0000A00000000000A0000000000000A00000000000000A0090A0000FABEBEACA0C9C0A9090000000000900000000909000000909A90900C909ADBAF0090B0A0B0009A0A00900009A0009A90A0A00000000000000009000000000A000000000000A0000A9A9A00A000000A00A090A00000000A00000000000A09A9A909C9C9DBD09A09C00CB000000090000000000000000000AC00000D0BCBC9A090B0A000900A9A0009A0A0A9A0009A00A09009A000000000000B0A000000000B00000000000009A000A000B0000000900000A0000000A000000A0000000000000A0A9A0A00BE090A90090F090900A00000000000000000BC9090900A9090BE9AAC090A9A0A90000A00090B0009A000B09A0A000000A00000000009A00A00000E00000000000B0A000009A000000A00A000900000000000000000000000000A00000900909FC9CADC0F00009E000909AD0A000000009CB0000A0AC9E90F0F0B0D0B0A0900900A09000A9E000B0A00A000A0900A00A0000000000A9A000000000B000000000A000000A90A0000A00000000A0A0000000000000000000000000000000A00A0A0BFADB0B09CB0F00C00000009000009ADA00C9CB09C9A90F0BA90A0B0B090A0A0000A0B09A009A00000900B000A90000000000000B0000000000A0A00000000000A0A00000000A000B00A900000000A00A00A00A000000000000000000000009000DADEDE0AC90F9B000000000909BC909F09A90D0B09E9AF0DA09A0000A00000A90000A00B0A90A09A0A00900000000000000000000A0A0000090B00000000000000900A0A090B0000000A00900A000000000000A00A00000000A00000000000B0B0B0BD090000ACBCB09090DADADAFCA9E9CB0AD0FE9E90BA9A09A9A000000000A09A9A00B0AF9A00000A0A000A00000A000A00000900000A000E00000000000000A0A0909A000B0A90000A0000009A000000000000000A0000000A00A0000A0000000ADA0B00D90F0DADAFADADAD9BDE9FADFDAF09A9A00000000009A00000000000A0B00BB0A00B0B00000000000A0000000000A000000000AB0000000000000A000000A0A9A0000A00000A009A00000000000000000000A00000000000000A9A0B0900D0DB0ACB0F9E90D0F9ADAE0BDAD9A0B09A000000B0A00B0A000A90000B0B090A9ACB09A00009000000000000000000A000A000009A9A0000000000A0090B00A9A90000B00090A9000000000A09000000A0000000000A000090A000900000000B09A0D09C9ACBCB0B0ADAD9F0A90A0B0A09A9A9A0000B009000000A0A00000A00A9A0A009A0A0A00A000A0000000000000000000A000B0000000000000A0000000A0A900A00A000A9A0A000000A000000000A00A000000000A00000A00B0A0B00A09A09A009000000D090A009000900000000009A0900A0A0B00000090A9A90A9009009A009000000000000B000000009A90A0000000E000000000000000A000A90090A9000009A9009000A0000000A0009000000000000A0000000000009000900A09A0900A9A009A0A090A0A9A00090A00A00000A000000000A9A9A00000A90A0A00A09A0A9A090000A9A00A000A00A00000000A00B00000000000A00000A900A0A00009A0B00A0A00B00000000000A00A0000000000000000A0000009A0A0A0B09A0A00B00090A09000A909AC0A0A090009A00000009A9A0B0000009A0B00A0909A90A009000A0A090000B000000A90A0000A0000A0000000000000A00000A0900B00A0000A90900000090A00A00000000A00000000000A00009A0A0009090000A909000000A09A00B090A00B009000A000000B00A00000009A0A0A0000B090A0A0A009AA0B000000A00BA0A00000009A00000B00F00000000000000000009A0A00A90B0B00A0A0B000A0000000000000900A0000A00000009000090A0A000B090A000B000000A9A00A0B0B00B0A0B009A000000900A9A0A9A90090A9A00A00000909A090000A90009A0090000000A00000000000A0000000000000000A0A00090B0A00000B090000B00000B0000A00A0000000000000009A0A0900A9000A000A000A000B0B0090000900000B009000A000B0000A00000900A0A9A09A0B090B0B0A0A09A09A090A0A0000A0000A00000000000A00B000000000000000000900B0A0090A0B0000A90A0090A0009A0000000A0000A000000A00000A0A0000009A0090000A00000A0A9A00A0B0B0000A9A9000000A000009A0A9009009A9000A000009009A0BA00A0009000000A0000000A0000A0000E00000000000000000A0B0000B0A0900B0A90A0900A0000A0000090009000090000A900000900900A90A09A000A09000A00090000000000A0A900000B0A00090A0A000000A0A0A0A9A90A0A9A0A0A0BC9A900000A000B000000A0090A00009A0B000000000000000000000A900090A00000000A0000009000000A00A0A0000000A0000000A00A00000000000A000A00900000A000000009090A00A00009000A0900000000090900000A09000000090BA00A0B0A090000A9A00000A000000A000A0000000000000000000A900A9A0A90B0000B000A90A00000A000000900A000A0000A000B00090A90A09A0000090000000A00000B0000A0A0009A90A0A00A000000A09A090A0A0A90B0BA0A0B09A0A09A9000000A000A90000009000000009A0F000000000000000000000A000009A000B00009000000A00900009A000009A00009000A0000A000000000090000A000A000009000000B009009A0009000000B0A00000000A009090A0B0090000A0909A00A9A0A900A0B0A00000000A00000A00A0000000000000000000000A9A9A00B000A0000A00A9000A0000A0000A00000000A000900090A00A09A000A00A000B00000000A00A00000A0A00000A000000000B000A0A0090A00A9B0BA0B0B000A0ADA9000900A09009AB00A00A0000000000B0000000000000000000A09000A9A00A900B00000000000000B0000A900A0090A000A00A0A0000090009A000000000009A00A000000B0000090A9A009A000A0B00A0090900A900A0ABADB00A0B090A900A0B0A0000A0B0BCB000000000000000E000000000000000000000A0009A09A90A000A000000A000000009A000900A000000900900009A0A0A00000A90A900A00000000009000A9000A0009A000A9000BA90A0A0A000A09090BA0AB0000A09A0B000000B00000A9A0000009A00000A00B00000000000000000000000A9A09A00A09000000A0000A00A00A0000A009000000A00A0000A0090090A000000000B00A000000A0A00000A0B090A000000009ABCA0009009A0900A0FA00909A0B09A0B000A09A00A09A9A0A0000A0000000000A0000000000000000000000000DA009A9A0A00000000000000000000900A00A00A9000000A9000000000B0B0A00A00090000A009009A0B00000A90A00000A0A90B009A0A000A0A09A009A0A0900A09AC0B09A09A09A0000090A00000A00A0000B000000000000000000000A9A0A9A000090000A0000A00000000900A00000000000A090A000A9A0A0A00000090090A0A0A00000000000000B0B0A909A000900A9A90A909A09090A09A0A9000A090A09A00A00A0B0000A0B0A00B000000000000E0000000000000000000000009A0009A9A000000000000000A00A0000A900000A0090A009000000900900A0000A00900090B00A0A9A09A0B00A9A0A000A0000000AADA0A00A00A90A0900E9A90AC90A09A90B0900A9A90009AB000A00000A000B0000000000000000000A00A9A009A000000A000000000A0000000A0000A09A0090A00000A900A00A00A900A0090A00B00A009000000A0000A9000000000A0B0A9A90A900000A90A90A0A9A00A9A0A09A00A000A000000A9E000A0000A00000BA000000000000000A000090000B000A00A00000000000000000A09009A00A0000A0000A0000A090900000A09A0A00000A0000A00B0B090B0B0A9A9A9A0090000009AA9A9A9A90A90A09A9A9A900B09A00B090A0009A0B09A9A00000009A00000F000000000000000000000A9A00A0000000000000000000000000A00009090A9000B0900B0090A0A09A9090000090B0009A90000000A0000009A000000A000009A090A00000A90A09A000009A090AA0B00A009000A090A00A9A090000000000AA00000000000000000000A0000000000000000000000000000000000A0A00A00A9A00A0000A000000A00A0A9A9A0A00B0A00A9A9A9A90B0B0B09A9A00B00A00A00B0A9A9A0B00B0B09A9A9A00BA909000B00A0A0B09AB0BA9A000A0B0A0000A9B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000A00A000000000000000000000B00B0A00A000A00B000A0A9A000000000A000000000000000000000000000000000000000000105000000000000DFAD05FE','Laura received a BA in psychology from the University of Washington. She has also completed a course in business French. She reads and writes French.',2,'http://accweb/emmployees/davolio.bmp'); + +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(9,'Dodsworth','Anne','Sales Representative','Ms.','01/27/1966','11/15/1994','7 Houndstooth Rd.','London',NULL,'WG2 7LT','UK','(71) 555-4444','452',E'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00D999D999999D9D999DB99DD9F9D9D9D99D99D9F9D999BD9FD9D9D9D9D9DFD9F9F9DBDBD9DBD9DB9FD9FDFFFFFFFFFFFFFFFFFFF9D9F9DB9D9DFD9DB9F9BDF9F9D9DBD9BD9F99DBD99999999D9DBDBD9BDDD9F9DBDBD9F9D9D99D9BD999D99D9D99DB99D999D9F9D9F9D9D9999D9B9BDBD99F9D9999D9DBD9FDBDBDBDBDBD9F9D9DBD9D99FD9F9DD9FDD9FFFFFFFFFFFFFFFFFFDBDF9DBDD9F9DBD9DD9DD9D9DDBD9D9DD9D9D99D99999D99D9F9D9D9DD99BD9D9D9D9F9DBD9FD9DD999DB9DBD99D99D999D999D9BD9D9DBDBDD9D9DD9D9DD999999999FD9F9D9FD9D9D9D9F9D9F9D9DBDF99F9DF9F9F9FFFFFFFFFFFFFFFFFFFFD99DF9DB9DF9D9D9F9F9F9F9BD9F99F9F9DBDF9D99D999D9D9D9D9F99BDD9D9F9F9F9D9D9D99BD999999D9D9F99D999999D9F9D9D99F99DD99B9D999D9B99D999D9D99FD9DBDD9DFDBDBD9D9D9F9F9D99DF9FD9FD9FDFFFFFFFFFFFFFFFFFFFFBDF99D9DFD9F9DBD9D9D9D9DD9D9DD9D9D9D99F99999999B9DBDBD9D9D99DBD9D9D9D9F9F9D9D9BD999D9F9D99DBD9D999BD9D99D9D9D999D9D99F9F9D9DB9D9999BD99F9DDB9F99D9DD9F9F9D9D9DBD99D9DBD9FD9FFFFFFFFFFFFFFFFFFFFFD9DDBDB9DBD9F9DBDBDBDBD99F9F99F9F9F9D99D9999D99D99D9D9DBD9F9D99F9DBDBD9D9DBD9DD9F99999DBD9999999F9D9DBD9BDBD9FD9BD99D9D9D9D9D999999D9DFD9F9DD9DF9F9DBD9D9F9D9D9D9FDF9DFD9FDDFFFFFFFFFFFFFFFFFFFFF9F9D9DDBD9F9D9D9D9D9D9FD9D9DF9D9D9DBD9F999999D99D9DBD9D9D9DBD9D9D9D9DBD9D9D9B9D999D9D9D99D9D9999D9F99D9D9D99D99D99F9D99DB999999D9D9DF99F9DDBDF9D9DBD9D9F9DBDBDBDDB9DBD9F9FFFFFFFFFFFFFFFFFFFFFFFD9FDBDBDBD9D9DBDBDF9F9D9BD9F9D9F9F9D9D999D9D999DBDBD9F9DBD9D9F9DBD9F9D9F9DBD9D9D9999BD9F9B99999D99D9D9BD9D9D9BD99D9D9BD99D99D999F9F99FD9DBD9D9D9F9D9DBD9D9D9D9D99DDBDF9DD9FFFFFFFFFFFFFFFFFFFFFF9F99D9D9DFD9F9D9DD9DD9FDD9D9DBD9D9D9DBD999999D99D9D9D9D9DBD9D9D9DBD9F9D9D9D99D9F999D9D9DD9D99999FD9F9D9D9BDBDD9DF99F9D9D9BD99999D9DD9D9F9DBDBDBD9F9F9D9F9F9F9DBD9BDDBDF9FDFFFFFFFFFFFFFFFFFFFFFFDDF9FDBD9DBD9DBDB9F9BD99F9F9D9D9F9DBD9FD999D9BD99D9F9DBD9D9F9DBD9D9D9DBD9F9D9BD9D99999F99D999D9D99D9DB99FD9D99D99DD9D9DB9D9999DBDDB9DBD9DBDDD9D9D9D9DBD9D9D9DBD9FD9FD9DF9FFFFFFFFFFFFFFFFFFFFFFFFBDD9DD9F9D9D9D9DD9DD9FD9D9D9F9F9D9D9D9999D99D9D99F9D9D9F9D9DBD9F9DBDBD9D9DB9D9F99999D9D999999DBDF9D99D9D99D9F9BDDB9DBD9D99D9D9D9B9DBD9DBDDB9F9F9F9FD9D9F9F9F9D9D9FDBDF9DFFFFFFFFFFFFFFFFFFFFFFFFD99F99F9DBDBDF9F9FDB9D99F9F9D9D9DBD9F9D9999D999BD9D9F9F9D9F9D9D9DBD9D9DBD9DD9D9D999D9D9D999D99D99DB9DBD9D9F9D9D99DBD99D9999B9DBDDD9DDF9DF9DDD9D9DD9BDBD9D9D9DBDBDBDDBDFFFFFFFFFFFFFFFFFFFFFFFFFFDFD9FDDBD9D9D9D9DD9DF9FD9D9F9D9F9D9D9F99D9DB9D9D99BD9D9DBD9DBDBD9DD9DF9DBD99F9F9D9999F999999F99D9D9D9D9DBD9D9D9FD9D9D9BD9D99D9D9BD9B9D999F9F9F9F99DD9DBDBDBD9D9D9DBDD9DDFFFFFFFFFFFFFFFFFFFFFFFFF9FD9BDDBD9F9F9F9BD99D9F9D9D9F9D9DB9D9D99B9D99D9DD99F9D9DBD9D9DBDB9F99D9D9F99D9DB99999D99999D9F9F9DBD9F9D9F9F9D99D9DBD99999D9DBDDD9DDBDFD9D9D9D9DF99F9D9D9D9F9F9F9DF9F9FFFFFFFFFFFFFFFFFFFFFFFFFFD9DFDBDD9D9D9D9DD9DF9D9DBD9D9D9BD9D9F99D9D9F99F99D9D9F9DD9F9F9D9DD9DF9F9D9DD99F9D99D9999D9F9D9D9D9D9D9D9D9D99D9F9D9D9D999D9F9D99B9F99D9D9F9F9F9F99F9D9F9F9F9D9D9DF9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBD9DB9F9F9FDBDBDB9DBDBD9F9DBDD9D9F9D99999D9D99D9FDBD9F9BD9D9DBDBDB9D9DBD9B9D9D9999BD999D9DBD9DBD9DBD9DBD9D9F9D9BD9999D9BD9F9FDD9DFDBDBDD9DD9D99D9DBD9D9D9DBD9DBDF99FFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBDFDD9D9DD9D9D9DD9D9D9D9D9D99F9D9DB9D9DF9D99DBD99D9D9DDDBDF9D9D9DD9F9D9D9D9F9D999D9999BD9D9F9D9F9D9F9D9DBD9D9D9DF9D99D9D9DD9BD999DD9D99F9DBDFD9D9D9F9F9D9DBDBD9DFDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD9DB9DBDB9F9F9F9BDBD9F9DBD9D9DDB9DD99999DBDD999D9FDBDBD9D9DBDBDB9FD9D9F9DBD9DBD999D99D9D9D9D9DBD9F9D9DBD9D9F9D999999D9D9F9BDD99DF99DBDF9DBD999F9F9D99D9F9FD9D9F9DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9BDBDD9D9DD9D9D9DD9D9F9D9D9F9D99D99F9D9DDD99BD9DBD99D9D9F9F9D9DDDD9DF9F9D9D9DBD999D99D9DBDBD9F9D9D9DF9F9D9F9D9BD9D99D9BDBD9DD999F99FD9D9DBD9D9D9D9D9FD9F9D99F9F9FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDD9DB9F9DBDBDF9F9F9FD9DBD9D9F9D9DF999F9B99DD9D9D9FD9DBD9D9D9FDB9BDB9D9DF9DBD9DD999B9B9D9D99D9F9D9F99D9D9D99D9D999D9BD9D9DD9BD99DDD99F9F9D9DBDBDBDBD9BD9D9FD99DFD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9FD9D9F9D9DD9D9D9DD9F9DBD9D9F9F99D9D99DDF99DB9D999F9DBDBDBDD9DDD9DD9FD9D99DBDBD99D9D99F9DBD99DBDDDBD9DBDD9BD9F999D99D9F9BDD999B9DF9D9D9DBD9D9D9D9FDD9F9F9FDF9FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD9FD9D9DBDB9F9F9F9BD9D9D9F9D9D9D9F99D999D9F9D9BDDD9D9D9D9DB9F9BDDBDF9BDBD9D99DBD9999DF9D9D9DF9D9F9D9F9D9BD99D99D999DBD9DD9BD99DD99D9F9F99D9BDBDBD99BD9D9D9D99D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F99F9DBD9DD9D9D9DD9F9F99D999D99DD9DBD9D9D9D9DD9B9DBDBDBD9DD9DDDBD99DD9D9F9DDBD9999DF99DBDBD9D9F9DBD99D9DD9D99D99BD9DDBDBDD999DB9DBD9D9DDBDD9D9D9FDD9F9F9F9BDFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DBD9DBDBDBDBDBD9D9DD9FDF99F9BD9D9DBDBD9F999DD9D9D9D9F9F9F9BD9FDDBDBD9DB9D9D99D99DF9D9D9DBD9D9D9D9F999DB9D99D9D9F9D9D99D99D9D9D9DBDB9D9BDBDBD99BD9D9D9DD9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9F9F9D9F9D9D9DD9D99F9F9BD9999D9DDB99F9D99D99DBD99BD9BDBD9D9DDDDBD9F9DD9DBD9DBDBD9DF9D9DBD9F9DBD9F9DBD9DF99D99F99DBD9DBD9DB999BD9DBD9D9D99D9D9D9DFD9F9F9FDBD9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD99DBD9F9F9F9F9FDD9D9DD9DD9D9999D9D9D9DDBDD9D9FD99DD9DBDBDB99FDBD9F9F9D9D9D9D9D9BDDBD9D9D9D9D9F9D9D9D99D999D99D9D9F9D9BD9D99D999D9F9D9F99D9F9F999D9D9D9DD9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9DBD9D9D9D9D9D9DBDBD99F9BD9F9DDF99DBDB9D9BD9D99DDB9D9D9D9DDF9D9DF9D9DBDBDBDFDBDDDBD9F9F9F9F9F9DBD9F9FD9F9D9D9F9D9D9F9D9999D99DF9D9DBD9DBDBD9D9DDBDBDBDB9F9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9F9D9F9F9F9F9F9F9D9D9FD99D9D9DB99D9D9D9D99D9DB9DB99D9F9F9F9F9F9DF9F9DBD9D99D99DBF9DF9DD9DD9DD9D9D9D9D99D99F99D9D9F9D9D99D999BD99DBD99D99D9D9DBDB9D9D9D9DD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9DBD9D9D9D9D9D9F9F9D999D9F9999DF99F9D9F9F9D99D9D9DBD9D9D9D9D9FD9D9FDD9F9DDBDFDDDF9DF99F9BDB9F9F9DBD9D99D99DBD9FD9F9D9DB9D99D9D99D9FD9F99F9F9D9D9F9F9F99F9BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9DBDBDBDBD9F9D9D9F9DDF9D9DFD99DF9D9BD9D9DBDDBD9D9D9DBDBDBD9F9BDBD9BD9D9B9D99BDF9DF9DF9DDDDD9D9DD9DBDBD99D9D9D99D9DB999D999D99BD9D99D99D9D9DBDBD9D9D9DF9DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9D9D9D9D9F9DBD9D9DB99D9D999D99D99DD9F9D9D999DB9D9F9D9DD9DBDDD9D9FDDF9DDDBDFD9DDF9DF9DBDB9BDBDB9F9D9D9D9F9DBD9FD999D9D9999F99D9DB9D99DBDB9F9D9DBDBDBD99F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBD9F9F9F9D9D9DBDBD9DD9F99DDB9DB9DB9D9DBDBD9D99D9D99DBDBDBDDB9F9FD9F9DBDBD9D9F9F9F99FDD9DDD9D9DD9D9D9DBD9D9D9D99F9D9D9BD9D99D9D99D9F9D99DD9DBD9D9D9D9FD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9F9DD9D9F9F9F9D9D9DB9D99DB99D9D99DF9F9D9D9F9FD9F99D9D9D9DF9DD9D99F9F9D9DBDBDDFDDDFD9F9DB9FDBDBDF9F9F9D9DBDBDBD99D999D9999D999BDDBD999D9BDBD9DB9DBDBD9BD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9DBDBD9D9DD9F9F9F9DF9DF9D9D99FD99D9D9F9D9D999D9D9F9BDBD99F9F9FD9DD9F9FD9DDBDDBDBDBD9DBDD9DD9D9DD9D9D9F9D9D9D9D99DBD99D99BD9FD99D9DDB9D99D9F9D9BD9D9FD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBDBD9D9F9DB9F9D9D9D99D99D9F99D99D999F9D9F9DBDDB9F99DD9D9FD9D9D9DF9BDD9DBDF9DFFDFDDDFDF9D9F99F9F9BDBD9F9D9F9D9DB9D99D9F99DD9D999F99B99D9D9F9D9BDDDBDBD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99D9D9F9D9F9DD9D9F9DBDDBD9D99DB9D99FD9DBD9D9D999D99D999F9D9F9F9DB9DDDBDBDF9DBD9F9F9F9D9DF9DFD9D9DDD99D9DBD9D9F9D99D9999D999B99DD9D9D9D9DBD999DD9B9D9D9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9DBD9F99D999F9D9D9D99D9B99D99DB9D99F9D9DBD9D9D9D999FD9DBD9D9F9DDBDBD9DD9FDFDFDFDF9FDF9DF9DBDBDB9FDBDD9D9DBD9D9D99F9D9BD9D9D9B9D9D9D9B9D9DDB99DD9F9F9DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBD9D9DDF9DF9D9F9DBDF99DDD9B9D9D99D99DBD9D9F9F9F9DF999D9D9F9D9F99D9DBDBDF9DBDDBDBDFDBDDBDDBDDD9DD99D9BD9DBD9D9F99D9D99D999D99DDB9F9BDD99DB9D9DB9F9D9DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9F9F999D99DBD9D9D99DF99BD9D99D999D9F9D9F9D99D9DB9D9F9F9F9DBD9DFDBDDBDD9FFDFFFDFDF9DDBD9F9DB9FDB9DF9DDBD9D9BD99F9999D999F99D999D99D999F99D9DBDD9DBDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDBD9D9FDF9FD9DBDBD9FD99DD9D999F99DB9D9F9D9D9D99D9D9D9D9D9DBD9DBD9DDBDDBDBD9F9DFDBDF9FDF9DF9DD99DD99DB9D9D9DD9D99D9DB9D999D99DBD9D9D9D99D9999D99F9D9DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9DBD999D99F9D9DBD99FDB9D9BD9D999D99D9DBD9F9F9F99F99DD9F9D9F9D9F9FDDBDFDFFD009FDFDF9FDF9DF9DFDBDF9DD9F9F9BD9F9D999D9BD9D9D99D99F99B9D9BD9F99F9D9F99FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DB9DBDDBD9D9D9D9D9D999D9BD99D9D999D9BD9DBD9D9D9DD9DB9BD9F9DD9F9DF9F9DF9FDFF909BDF9FDF9DFD9DBD9D99DB9D9D9DD99D99F9D99D99F99BD9F999D9DB9D9999F9DBD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DD9D99D9FD9F9BD9F9DD99D99D9B9F99DB9D99D9DBD99F9BD9D9D9D9DBDF9FD9FDFD9FDBDF09909FFFDBDFDBDFD9F9FDF9DF9DBD9BD99D9999D99D999D999D9D9D99D99D9D9D9D9FD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9DB9DBDBD9999D9D9D9DB9DB9D999D99D99D9DF9F9D9F9D9D9D9D9F9DBD99DD9F9DBDFDFDFD90D999DDFDF9FD9DBDD9D99D99D9D99D9DB9D9F99D999D999D9999B9999D9B99F9BD999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99D9D9D99DFD9D9BD999D9D9BD9D9D999D9B99D9F9D9DBD9DBDBD9F9DDFDF9FDDFDBDBFDFF0B00D09B9FFD9FF9DBDBDF9FD9F99FD9D9D99D9D9B9DB9D9B9D9F9D99D99D9D99DDBDF9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DDBD9D9F9999F9D99F9DB99D99999F99D9D9D9D99DBD9D9F9D9D9D9DB9DBDF9FF9FDFDFFDFC9D9099009DFFD9DF9DD99D99D9DF99F9D99D9999D999D99D9999999DB999999D99D99DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9BDDB9D9D9D99DBD99D9D9D9D9D9BD9DB999DB9DDBD9D9BD9DBD9F9FDDBD9DFD9FDF9FDFFF9B9099C900BD9FDF9DF9FDF9FD9D99D9D9BD9B9D99999999999D9999999DBD9D9BD99F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D999DB99F99D999D9D99DB99B99D9999D9D99D999D9F9D9DBD9F9D9DBDDFBDBFDBDFDFFFD00E909909009F9FDF9D9D99D99DB9D99D9D99D99D999D9999D9999D99D99999BD99FD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9F9D9D9D9BD9D999BD9DD9D9999D9D9DB9D9BDDB9D9D9D9D9D9FDBDDBDDFDDFDFFDFDFFB990DA9D0900099B9FF9DFD9DBD9DBD9B999999999D999D99999999999999D9D9D99D99FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9BD999D9999D999DBD9999999D9D9BD9B9D99D99D9D9F9F9F9F9D9FDBD9F9FBFDF9FFDFDF00CB990990DB00009D9F999F9D9D9D99D999D99D9999999999999999999D99999BD9B9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9F99DBD9DBD99999B9999999BD99D99D9BD99DF9D9D9D9D9FD9FDDFDFDDDBDFDFFFFF9DB000990F00009E90BD9FD9D99F999D99D9999999999999999999999D9999BD9D99DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD99BD99F9D999999999D9DBD999D99D999DB9D99F999D9F9F9F9D9FD9F9F9FFFFFDFFDFDFDA909090999000090909999DBD999D9999999999999999999999999999999D9999F999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D99D9999999D999D9999999B99D99D9F99D99D99DDBD9D9DDF9F9DFDFDFDBDFDFDFFFFF09000909090099009000999999D999999999999999999990990999999999999D9D9D99FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999D999DB999999D99999D999F9999D999F9D9B9DBDBDB9DF9F9FDBDFDFFDFFFDFFFF909A9090F09D000000900099999999999099999909999999909909999999D99999999DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9F9999D99999D99999D99999999D999F9D999F9D9D9D9DDBDDDFDBDF9FFDFFDFFFFF99000000C990B0900900000009999999999909999999099090909999999999999BD9F9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999D99999D999999999D99D9D999D999999D9D9DBDBDDBDDBF9FDFDFFDFFDFFFFD9D9A0009DB0090000000000000000000099999909999999090909090909999999D99999DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9999D99F99D999999999999999999999999D9DBD9BD9D9F9D9FDDF9F9FDFFDFFFF9B9BF9C900E909099009A900000000000000000099909090990000909999999999999999D9BFFFFFFFFFFFFBFFFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9B99999999999999999999999999999999999D9DBDD9FFD9F9DFDFDFDFFFFF99DC9D0900B090000900000000000000000000000000909090000900909099909999999D999DFFFFFFFFBFFBDF9FFDFF9FBF9FFBFFFFFFFFFFFFFFFFFFFFFFFD9999D99999999999999909999999999099999D99D9D9BD9DBFDFF9FFDFFFF999C9A9FF9909090A0990090900000000000000000000000000000000090909909999999999999FFFFFFFBFFFBFFBBFBFFBFBF9FB9BDBDBF9FFBFFFFFFFFFFFFFFF99999999999D9999909999990990999999D99BDF9F9FDFDBDDDBDFFDFFF909F09FDFF990B00B09000990A000000000000000000000000000000009009990999909099999999FFFFFFDF9FBF9BDFFFBBDBDBFBDBF9BBDBFBDFDBBDBFFFFFFFFFFD99D999999999909999999999090909999999D99D9D9D9BDDBFDFDFFB909909DF9BDFF9D09000B0900B90900000000000000000000000000000000900909090999909999999DFFFFBBFFBDFFFBDBFDFBFBDBFBDBFDBDBDBBBFDBFF9BFBFFFFFFF9999999D99909999990990909090990999999D9F9F9FDDBDDFFFF090900090B9C9B9D909000909E9BC09000000000000000000000000000000000009099909909990990999FFFFB9DB9FFBF9FBFDBBDBDBDBDBF9BFBFBDFDBFF9FFF9FBDBFFFF999999999999999909990999999999999999DBD9D9D99FDBF999099000900B0DB0D0B09090D000900990000000000000000000000000000000000000090099099099909909FFF99FBFFFBF9FBF9FBDBFBFBFBDBBDF9F9FBBBF9FBF9BF9F9FFFF999999999999999099900990999999999D999D9F9DBDFDBD9900900090009099090BD99C09BDA90900B0000000000000000000000000000000000000000900909909999990BFFA9B9BDBDBFBDBFB9F9F9FDBDBDFBFBFFBDFDBFBDBFDBFBF9BFF990999999099999990999999999909999B9D9F9DBD9999990000090909090900909D909B000990000090900000000000000000000000000000000000000090090990990999DF999BDBBFBDBFBDBFFBFBF9BFBFB9F9F9FBFBF9F9F9BBDBDBF9DBF9990999999999099909999909099099D99999999900900009000090000900B90F0AD0909990CF909090000000000000000000000000000000000000000000900909999909FB09B0B9F9FBF9FBF9BDBDBFF9FFFFBFFBFDBDBFBFBFDBBF9F9BB9099999999990999990909099999999999999990900000000000000090F900900099D990D9000B9A0000900000000000000000000000000000000000000000000909909999F0090999FDBFBDBDBDBDFBFBF9FF9FBDF9FDBFBFDBDBDB9F9BF9F990909999990999090999999990999999999900000000000000000009099009099B90909900009090BC900000000000000000000000000000000000000000000000000909099F909B9B9BBDBBFBFBFBBDBDBFBFF9FFBFFBFBDBFFFBFBF9FB9B9A990990990999999990090999999990990900000000090909009000009AD090B000F0F909DB09090C9009090000000000000000000000000000000000000000000000099990DB090090BDBBDBDBDBDFBFBFFFDBFBF9F9FF9FF9FB9F9FB9BDBD99A9909909990909099990990999099990900000000000000000000009099A90099099CB90B00000B90B000000000000000000000000000000000000000000000000000000909000909B9BBDBFBFBFBBDFDBF9BF9F9FBFBDFBFFBDFBF9FFDB9BB99909099909999999090990999090000000000000000009000000000000090990AD0F9D09090909909009009000000000000000000000000000000000000000000000000900900909099BDBDBDFBDBDFBBF9FF9FBFBDF9FBFDBDFBF9FB9B9F99DB0909090990909909009099909000000000000000000000090900000909009A099B9FBD09A000009090090000000000000000000000000000000000000000000000000000000000090BDBBFBF9FBFFBFDBF9BBB9BDBBFBDBFFFBDBF9DBFB99A909000909099990909090909000000000000000000000000000000000090A909900CF0DBD9900900B009A090090000000000000000000000000000000000000000000000090000000090B9F9FBF9F9FB9BDBF9DBF9BDB9FBDB9FBF9FBBD9FB99B9B99090990909009000090000000000000000000000000000090090000900DADB999FB909E90A09090090000000000000000000000000000000000000000000000000000000000009099F9FBDBFBFBDBFB9BBB99BDBDBBDBFFFDFBF9FBF9DB090900009009090900090000000000000000000000000000090900000090090B90D00B9D09999909A90090009090000000000000000000000000000000000000000000000000000000009BBFBDBFBDBDBDB9F9D99FB9B9BDBBDB9BBBDB9F9BB999B00909009909000090000000000000000000000000000000000000090A90990F909DCB9090C90090B0009A0000000000000000000000000000000000000000000000000000000000090DBDBFBDBBDBB9F99BB9B999BDB9F9BFFFDFBDBBF9DB090900009000000090000000000000000000000000000000000000090009090A90F90B90909B9090B009000909009000000000000000000000000000000000000000000000000000000099BF9BFBDBF9F9BBD99B9BDB9B9B9F99B9BF9F99FBBDB090900000900090000000000000000000000000000000000000000009009A9909090DFBA9009A90909009000000000000000000000000000000000000000000000000000000000000900BF9FBDBF99B9BD9B9BDBDB9F9F9F9BF9FB9FBFB9F9B9909000000000000000000000000000000000000000000000000090000A909C0B0F9CB9D900B009C00A9000090B0000000000000000000000000000000000000000000000000000000009B9FBDBB9BBBDB9B9BDBDBDF9BF9F9F99B9F99B9FF9B00900000000000000000000000000000000000000000000000090009090909A9099090DF09009A9B90909090000900000000000000000000000000000000000000000000000000000000BDB9FBF9F9D9B9B9F9BDBDBBFDBF9F9FBDB9FF9F9BF9B9000000000000000000000000000000000000000000000000000000000009099BC9F9AD90090900990900A90090000000000000000000000000000000000000000000000000000000000BFBDB9B9BB99D9F9F9BFFDFBFDBFBF9F9DB9BF9F9BF9090000000000000000000000000000000000000000000000000000009090A9AD09AD99FB0909A9B00A00990B000900000000000000000000000000000000000000000000000000000009BDBBDBDB9DB9BB9FFFFDBFFFFFFDFFFBFBF9F9BB9F9B90000000000000000000000000000000000000000000000090000090000BD090BD9FE9F9C90B9A90999F000909000000000000000000000000000000000000000000000000000000009BDBBDB9B99B9FBDFFBDFBFFBDBFFBFF9FDF9F9BD9FBDB00000000000000000000000000000000000000000900000000000000090900B9DAF990FB90B09090F0B0D0B00090000000000000000000000000000000000000000000000000000000ADBDBB9B9DB9F9FF9FFBFFFFFFFFFFFFFFBFFFBDBB9B9F9000000000000000000000000000000000000000000000900000000090009900F9DFD9D0B90D00A90909B00090000000000000000000000000000000000000000000000000000000009B9BDBDB9B9FBF9FFFFFFFFFFFFFFFFFFFFFBDFBD9BDB9B0000000000000000000000000000000000000000009000000090090A9000BD9DF9FA99909DA9B9E909A909000900000000000000000000000000000000000000000000000000000009BFB9B999BDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDB9F900000000000000000000000000000000000000009000009090000AC900B000B0FDFD9C099A9B00990A909090000000000000000000000000000000000000000000009000000000009F9BDB09BBDBFBFFBFFFFFFFFFFFFFFFFFFFFFFBDBDBDB9000000000000000000000000000000000000009000090900C0000909909090999FFF909BB0900090090090B009000000000000000000000000000000000000000000B0F00000000000BF9BD9BD9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBDB9000000000000000000000000000000000000000090000F9F0090090A09CBDBC9DFDBD99BB99A90B0000A9C90090000000000000000000000000000000000000000009AF000000000B9BDB9B9BFDBDFBFDBFFFFFBFFFFFFFFFFFFFFFFFFFF9F9B0000000000000000000000000000000000000000009000F0900000990B0909909FF9E9B900A90B900090099000000000000000000000000000000000000000000000090F000000009F9B9B9FBDBFFBFFFFFFFFFFFFBFFBFBFFFFFBFFFFFDFBFD00000000900000000000000000000000000000000900909000B09000D09ADF0F9F9E9900BD9DB00900009A009000000000000000000000000000000000000000000AD0FB90000000F9BBDBDBDBFFFFFFBFFBFFBFF9FF9FFFFFFBFFDFBFFBF9FB9000000000000000000000000000000000000909009B000009090009A9ADB9F9C9E9909F0B0B0900B009009000000000000000000000000000000000000000000909A090CF000009BBD9B9FBFFFBFFBDFBDFBFDBFFBFFBF9FBDFFFBFFFFFFF9FF00000000000000000000000000000000000000A900009090000090BD9DBDE9F999BC9D9F9F9FAB009CA90A90000000000000000000000000000000000000000000090FB9BB000009BB9DB9FBFFFBFFBFFBFDBFF9FF9FFFFFFFBFFFFBFFFFFFBDF0000009B0000000000000000000000000000000090000090900090F09DBDFFCBC9BDAF9B09090B0A990900090000000000000000000000000000000000000009AF9A90FF000009F99FBFFFFDBFDFBFBDFFBFDBFFBFF9F9FBFFDBFFDFBF9F9FFB90000000000000000000000000000000900009090090900000090F9B0BDBD9F99DF999D0909BA9E990000900000000000000000000000000000000000000009E09009EF900009BB9FBDBDBFBFFFBDFDBF9FFBFDBDB9FBFFFDBFFDFBFFFFFFFBDF90000D000000000000000000000000000090000000000009090F9909D0FBFF9CB9CBDB99A90DA9A09BB0A9000000000000000000000000000000000000000B9B090FFF00000099F9BFBFFFFFFBFFBFFFFB9DB99B9F9DBDBFFFFBFFBDBFBF9FFBF0000B000000000000000000000000000009000909090900B090B0FCBDFDDBF9E99ABC9D00B999900909000000000000000000000000000000000000000000000A9FF9000000F9BFDBDBF9FBFDBDFBF9BDB99B9DB9B99BDBDBFFFFFFFFFFF9BDBF00090000000000000000000000000000009000000A009009A9099FF9FBD0F9909B99B09B090A099A0009000000000000000000000000000000000000000000000FB0000009B9F9BFBFFFFF9FFBFDBF9B9FDDFBDFDFFDBDBFDBDBDBDBDBFFFFFDA000000000000000000000000000000000000900909009909090F9FFD9E9FF990BDA9DB0B9090B00090000000000000000000000000000000000000000000009B90000000BDFBFF9FBDBF9FFBF9BD99FDFBFBDBDBBDBFFDFBFFFBFBFFFF9F9FB90000000000000000000000000000090090A9009C090B9A90BCB9DBFFFDFD00ADA9BB0990B0090A900090000000000000000000000000000000000000000000000000000DBB9F9BFDFBFBFFBDBDB9FFFBDBDFFBFFDBF99B9DBDBDBDBF9FFFFFFF909000000000000000000000000000000900090B9F99C9BC999CB990FBFFBD9FB0DAB009B9B09009B000000900000000000000000000000000000000000000900000000BDFBFF9FBDFFDBF9F9BDB99DBFFBFFDBFFFFF9F99B9FB9BDBFBFBFBFDF000000000000000000000000000000000900A90B00B909B0A9BDADBDF9FFFDF9BB90DBBFB9009B9A90000000000000000000000000000000000000000000000000000BDB9F9BFBFBF9BF9F9F999FB9FFBFFFBFFF9FFFFBD099909BFFFDFDFFBF00000000000000000000000000000090000BD0909990BD0B9C99DFDBDFF9FBD9A9B0B9FB9B0B00090000000000000000000000000000000000000000000000000000BDBFFFFFFDFFDBF9F9B999BF9FFBDFFB9FBFFFFBFF900099BFFDBFBFBDFF9000000000000000000000009000000009090B09A9CBD0B909B0F9FFDF9F090BBB0B0B9B0B9090B09A000000900000000000000000000000000000000000000000009BDBF9FBFBFBFB99B9900BDBF9F9B9B9999B99F9BB900009F9FBFFFFFFBFB0000000000000000000000000090000009E90BD0B90B990B0D99F9FFBFFD990BEB09099A9B9A9CB0900090000000000000000000000000000000000000009000000FBF9FFBDBDFDBDB9900090BFB9B9999D9B999999999999F9BBFDBFBDBFDFFD0000000000000000000000000000909090BD0A90F90DA90B090F909DBDB09BDB90A9A9B009DA99A9A900000000000000000000000000000000000000000000000BF9FFFBFFFBFBFB990000099999999BD9B9D9F9B9D9DBFB9BDBDBBDFFFFBFFBB000000000000000000000009000000009D0B9B09A9B09A99FD9EBFBCB0900BB0A909B0DB9A99A9B0000009000000000000000000000000000000000000F90000F9FFB9F9FBDBF99F9B9D999999999F9FBFDBF9F9FBDFBFDBDBDBFDBF9F9FFFD000000000000000000000090000090A9F9AF90C9A9090B9B0F9F9D0099D09B9A9BFA9A9B0F9F0900B000000000000000000000000000000000000000000000000BFBFFFFBDBBDBFB9BDBBDB9FDBFFFFBDB9B9FBFFDFBFDFBF9B9B9B9FBBFFFBFD00000000000000000000000009000900FD0DB9B09B0B0BC9FFCBAB9A90B00B00A9B09A9BB909F9A9B09000900000000000000000000000000000000000B00009F9F9FBDBBD9B99FBDBDBFDFBFDBF9B9B09999B9FBFFBFBDBF9BDB9F9FDBBDFFB0000000000000000000000000A9000909BD909DBCBD9F9B00F9D90090B9F09ABDB090990009AB09000009000000000000000000000000000000000000090000BFBFFBDBDBBF9FB9B9B9F9FBFFBF9F0999F9BD9F9F9FFFDBDB99B9F9F9BDFBFF9A0000000000000000000000090000009F09090F0BDAF9F099FF9E9F9EDE90ABDAC900000090B909A909A0000000000000000000000000000000000000000009F9FDBDBFB9F99B9DBDBFBFBFDBDB9B9BDB99F9B9BFFF9FBDB99F9F9F9BFF9FFFBD00000000000000000009009000909B90999CBD9F9B9B00B09DBDF9A9B99B09A9B9A09A000900B00A0009090000000000000000000000000000000000F0000ABFBFBB9F9F9FBDB9B9F99FDBFBF9B999B9FF9F9F999BF9FB9B9BDBFBFDF9FBFFF9000000000000000000009000900000C9E9A90F9F0909090DABC9FDFF9A9000000F9A090000000B090900A000000000000000000000000000000000009B9B9D9FBDFDB9B9F9FBDB99BFFBF9F9B99999F9FFFFF9F9F9FF9F99F9FDBDBFBF9F9FF9000000000000000000000000090009090909900FD00A9A9FDDBDBFDFDFF0000099A9A00090000000A009900000000000000000000000000000000009F9F9FBFBDBB9BDBF9F9FBF9B99BDBFBF9F9FBFFFFFFFFFFFFFDBB99B9FFBFFFDFFFFFFFF00000000000000000000009000009A90909A09F90B09C9F9FBFF9CBFFFD000999AB00000000009009090009000000000000000000000000000000F0FFBFFBDF9FBDBF9F9FFBDF9F99BDBF9F9F9FFDFFFFFFFFFFFFFFBDB9DFDBFDFFBF9FF9FBDA000000000000000000090000000000BDA9090909090B9BCBD9999F9FFF000000090000900000000000090000000000000000000000000000000099FBDFBDBBFBDBF9BFBF9FFBF9F9999FB9FFFFBFFFFFFFFFFFFFFF999BFBFFFFBDFFFFFFFFF900000000000000000000000900909909C90000B009BD0D9FB09A9DFFDF00009000000900000A0009A09A90090000000000000000000000000000B9FFBFFBDBDBF9FFDBDFFBDFFFFFB9B9DB9FFFFFFFFFFFFFFFFFFFB9F9FFFFFFFFFFFFFFFFFF0000000000000000000009000000E99F9E9090DB0D0F999D0BC90BDBBF009000F009A00009A900000900000000000000000000000000000000009FF9FB9DBFBF9FBDBFFBDFFBDFF9FF99B9FFFBDFFFFFFFFFFFFFF999FFFFFFFFFFFFFFFFFBFB000000000000000000000000090090FCB909FA90DB990D09F09BD9ADDF00009A9E00090000000090900000000000000000000000000000000000FFBFB9FBF9FDBFFBFFFFFBFFFBFFF9F999FBDFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFDF90000000000000000009000900090BDBDE9EBD9DBC0099B9F90F9090BF00000909A090000A000000A0900900000000000000000000000000000BDBDBDB9BDBFBF9FFDBFDFF9FFFFFFFFBF99FBFFBFFFFFFFFFFFBF9FFFFFFFFFFFFFFFFFFFFFFB00000000000000000000900000C9090B9F9D909DF9B009D0BD0F9009909A900009909000900000090090000000000000000000000000000000FBFFFBDBDBDBDBFBFFFFBFFFFFFFFFFFFFBF9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF0000000000000000000000000B00B09090B0B90BDFDFF0990BDF0B9C900000B09000009A000000909000000900000000000000000000000009BDFB9FB9BBFBFFFDFFFFFFFFFFFFFFFFFFFFF9FBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB00000000000000000090900909900B0D909009CFFDF90B09090909B90000B00A09009A9A0000900A09090000000000000000000000000000BDFBDB9B9FDBDBDBFFBFFFFFFFFFFFFFFFFFDBFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF90000000000000000000009A9009909B09A9F9BB9BB9090909AB0F090000090900B000090090A909000A0000000000000000000000000000FBFFB9FDB9BFFFFFFFFFFBFFBFFFFFFFFFFBFFBDBFDFFFFFFFFFFFFFFFFFFBDFFFFFFFFFFFFFFFDBF00000000000000009000909A0B00B09DB90909C900A9CB9B090F9B0B000A000900B0B009A09C90090909090000000000000000000000009FF9F9BB99B9BFFBFBFDFFDFFFFFFFFFFFDFFF9FFFBFFFFFFFFFFFFFFFFBFFFFBFFFFFFFFFFFFFFBDB00000000000009000090A909909E9F0DCBDADBBF99CB90C09A9CBD900B0900009A0900B00909A90A000000000000000000000000000000FB9B9BDBB90FFDBFFFFBFBFFFFFFBFDBFFBFFBFFBDFFBFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFF9BD0000000000000000000090F0A9F9909B9FD9F0D90FFDADB9A9FB90B0B0B00B09A09A0B0A9CA90090090B09000000000000000000000009FBDB9F9F90F9FBFDF9FFFFFBFFFFDFBFF9FFBDF9FFF9FFFFFFFFFFFFBF9FBDFFBFBFFFFFFFFFFFF99B0000000000000000900B0909DB9A90B0DFBFFDBDDF9A9B90DFF9CF00009B009090A9A090B0909A0000000000000000000000000000000FF9B90BB099BFFFFBFFBF9FFFDBFBBFFDBFB9FBFF9FBFFFFFFFFFBFDBDBF9FB99F9FBFFFFFFFFFFFB0F900000000000000000900B0A9009C909B0D9DBDFBFDF90DB90FDB9BB0A0B90000B009A00AB090900B09090000000000000000000000009B9B9909B009FBFFFBFFFFBDFFFFDFB9BDBDBDB9BFDFBDFFFFFFFFFBFB9B999B99BDF9FFBFFFFFFFD9B0000000000000000900990990BDB9A9C9B90DFFFDBDB090D99DB0C90000B00909CBA90BFB90B009A00A00000000000000000000000000F9090909009B9FDBDFF9FBFFBF9BB99B9A9B9B9F9BBFDBFFFFFFFDBD9BD9B9BDB9F9BFBFDFFFFFFFB9F9000000000000090009A090AD0B0D90B000BFF9DBDF9D09FD9A9D9A0A9B0BF0BABADBA9A90A9A9A90909000000000000000000000000BB0900090909FFFBFFBFFBFDBF9BD99F999999909BDF9BFFFFFFFBBFBB99B9BD9BDBBFFDFFFFFFFFF90B000000000000000009009DAD9B0909090B9D99DA9DB09BDF9099A900000B09B0F9FBCBB9A90B9A9A0A9A900000000000000000000000990909000000B9FFBFF9FDFBDBF9B9B9A9F9B099B9B9FFDFFFFFFDF999B90990B9A9D9BBFBFFFBFFF9F9B0000000000000090090B09B00B09A9090099CBDFF090D9FF9009A900A9AB0B0BB0FB9A9A00B00B90900A000000000000000000000000990D0909009DB9FDFBFBFBFB9B09B999B9999B9090B9BBBFFFFFBFF0909FB090090B99999B9FFFFF0B900000000000009000BC909E9F90F090B0FA9DBDBDBD090D9DAD0DDFA09A90B0B90BFFA9A9B000B00B00B9000000000000000000000009A9BB9A90000BFFBFB9F9B9999099090909ADB909B99F9FDFFFFFDB9B90BD09000009000DB9F9FFFF9909000000000000000009A90909EB90B09C9909D9EFDB0099FF99BBF909BA9B0B00AFFF900F0A0000B090000000000000000000000000909F9F9090009F9BDF9F9B990000000000009F0009099BDBBFBFFFB909090B00009000009A9DBFFFFF000000000000000000999090F009B9CBC9FBF09F9BD900090FF9CA090B0A0900A9AB0BBFEBBFF0B00B0BA9A9000000000000000000000090B9B09000009BFFBFBFBDBDB000000000000B990090B9BDFFFFBDBDB90900000000000DB9BFFFFFFB00000000000000009000A9A90B9009B9FBC9DBD0D0BDB90B9ADB999E99B000B00A9A90DFFCBFFFCFA9ADBCDA0000000000000000000000909B990900000DBDBDBF9BFB9F900000000000009009CB9B9FBFFFFBD09090900000A9B90999FBFFFF90000000000009000B99C909D0B90D0909FBC99999D90090DFFDBC99A9000A00A9A9ABBB9BFFFFBB0FFFFBB090000000000000000000000990000000000BBF9BFDFF9F9B9090900000009000999B9FBFDF9FBDBB9009909A9B9900B9FBDFFFFD000000000000000090009A9E99C0D0B09A90BD9DAD09D9FFFFDFDBDA900B090BB9A9B9009A9BBBBDFFFF0FD000000000000000000000009000900000009BD9ABDBB9B9B909B00090090000A9B0B9F9F9FBFBDB990B000099000099DBF9FBFFFB0000000000009009009B09090F9DB900090BD90B909FFFFDBFBFBC9D0900FBA9E0F000BA000909BABB9FBFA000C000000000000000000090900000000009BBD9B9090909B909B90900900990999B9FBFBDBDBBDB999990009099A9B90FBDFFF90000000000000000A900909090F909909AD9099D90FFDF9A9009DBDB09A9A9E9BBA9A00B00A0009900A90B909A9A9000000000000000000BA9000000000099B9900000000090909090099099B0DB999F9BFBDB9FBC9A99000900909B990B9FFF900000000000000900B09A9F090F9009C9FFFF09CBDFBDF9FFF0909D900FBFBFADBAC9AD0B00B0A00000000000000000000000000000000990000000009B9B000090090009000000009009A909B9FBF9F9BDB9F99B990090000909090BFDFFB900000000000000B009C90D909BD90F9FDFDF9099DF9FDF9FDBD0F909090BB09A9B0B9AB0B0000000A0090900000900000000000000000000000000000009000099B000090000000000009090DBDB9F9BDBDBDBBDA90909000900009ADFDBFF9F0000000000000900909B0B09F0FFFDFFBBBFD90FF9FBF9BDBC9F9CB099BCBB000A90A9000000000009A00A00090A09000000000000000000000000000000900B0B0F90000000000000000909A9B9F9F9B9B9BD9BD99A90A90A009D099BFF9FB900000000090000900A90D0B009099A999C0DBE9D9FC99C90990F9F9F09BB000000000B00B0000009009A0900009000000000000000000000000000000000000999909B0000000009009A90B99BDB9B9F9F9B9B9BBFBDBD9F99FDA9FBE9BDBDB0900000000000000B009A909B09909DBCB990D90FD9B00BDB0BD9E9F9F90BB000000000000000000A0000F0CB0000B00000000000000000000000000000000090B0B9B0900909909D09BDB909F99BDBDB9B909DAD990BDBF9FF9BDB9099FB0B900000000000000B0090090B099A0F909909A99099BD09D909090BDBD090000000000000000000000000FFFFF0A009000000000000000000000000000000000009099099000090009A9B09909B9B0F9B9B9DA99B99BFBF9F9FB9BDB90B9F099900000000000000900D09B09C9AC9990B9C90D0000BD0BC9E9AD09990090900000000B00000000000009AFFFFFFDA000000000000000000000000000000000000009A9B0B9000009A999090B90909B9BDBDA99900909999B9F90909909909B900900000000000000090A000B9E9BE9E900B0B09B0909D99F9FDBD000B9AD0000000000A000000000000ADFFFFFFFDF0000000000000000000000000000000000000090990900000090B99B9000090090B9B9BB9000B00B9F9BFB9000B09090B9B0000000000000009A99090099099F9E99090909909F90D9F9ADBD900DBD9000000BA9000000000000A9FFFFFFFFFB000000000000000000000000000000000000099090000009000909A909900009099A9D9009909909D0BD99000B99A90B090000000000000090000090DB0F0BD9F9E0A9DA9A0DBDA9909C9FF9A9DBC9B00000B0000000000000B09ABBBFFDEBF0000000000000000000000000000000000000000000000090090009909B00009009F99A90900CB090B9F9B09009909090900900000000000000909B00B0909D0A9FDBD0BC909B009D09DBFDBD09A9990000000B0000000000000A000900BFBD900090000000000000000000000000000000000000000000090099000909F90000909B990090B99B009B99090B090B900009000000000000000B00909099A9909900BDA9F9F0B09B9B90BDFF90B09A90900000A0B00000000000B000000000BA00000F000000000000000000000000000000000000000000909009900B909900090B0DA909009A9C900FB900909A9009090000000000000000009A0B0B090DA90990FFDB0F9BDBC900D90FF9F9DA9DAD9000000000000000000B00000AC09A09009FF000D00000000000000000000000000000000000000B090B9000990B9B0090099B9900099DBB9099900B09090900000090000000000000000909090B0990DA0BFFB0FF09ADBDBDF0990FDFFFDA99000000000A00090000000000BCB0A09009EB09A9A0000000000000000000000000000000000000909099000B0909900000909090009A9A99090B09099B090000009000000000000000090900B0F099A9099FFFFDF99DF9FDFDBD90F9E9FFFF90B0000A0009A00A00000000000B0909A000BDB0000000000000000000000000000000000000000009000000909A9000000009A9000099999090F9009B09000000000000000000000000000A90999CBEDA99E9FF9A9F0BDF9F0BD0B09D90F9FFD9000009A0000B00B00000000009A000090000F09E90000000000000000000000000000000000090009090900909909000009090B00000000BC90B9009B9900000000000000000000000009000E0B99FBDADFEBD099090B90D9DB990B0B0BCBFBCB000000000000B000000000B00000000009B09E900B000000000000000000000000000000000009000000090B000B00009000990009099B9B999009B00000090000000000000000090000090990FCBDAF9B9FA9FA0B09099FF9F99C9909B9C9BD00000B00000B00000000A0000000000000ADA0B000000000000000000000000000000000000000009090909909900009009090900009A9090000009909009000000000000000000009009A000BDBDBF90FFFDFF999009FDF0B90A99A0F0DB9CB0000B0000A00000000A00B0000000000009A9BCBD00000000000000000000000000000000000009000000900000900009000000000009090B09000000000009000000000000000000000009B90FFB090B09FBFFF0A9B099DBDA990BD99F9C9B000000A9000000000000B0000000000A0009AC9BCBE90000000000000000000000000000000000000090000B900000000090000090090000090090000090900000000000000000000000900000B9FDE909FF9DFFFFD00FC9FDBDA99EBE9FFBCF900B0090A0900000000000000000000900009B0FBDB0000000000000000000000000000000000000000090900009000000000000000009090009000000000000090000000000000000090090900FFB90BEFFFFFFDFA9FBDBDBC9F9A9D9FFBCBDA0000A0A9A00000000000000000000B0090000090B000000000000000000000000000000000000000090000909000090A90000909B0000009000000000000090000090000000000900900A00009BFF90B99FFFFFBFDFFDF9D99F909DB0B99F9FD0000000090000000000000000A0A00000000000000000000000000000000000000000000000000000000900009090090D09900A9099009000900000000000000000A900000000000A00090909A09FCB0FA9FF9F9BFDFB9D0D90D9E9FD9FA9CBB00A9A90A0000000000000000090900B09000A00000000000000000000000000000000000000000000000090000B090090B09F9009AC990B090009000000000000000000000000900909000090900BFDFDFFFFFF099F0DB990FDFDBF9F009B090000000A9A00000000000000000A0A900A0B009000000000000000000000000000000000000000000000090000000009A999A90990990B09000900000000000000009000090000000000A900A00009FFFFFFFFDBF0FBDBC9DBDB9AD9FA9B0DBCB0000B0009000000A000000000A9090A90900900B0A900000000000000000000000000000000000000000000009909009900999A009A909009000000000000000000000000000000090090099C9000FFFBFFFFBF09ADF09DB999ADB0B9D09A9A900000B000000000000A9A0000000000000B0A00090C9000000000000000000000000000000000000000000000009090009B0B0D90090090900B00000000000000900000000000000000009A0B00000BFDBFFBCD99DBDFD909E90BCBDBA90909000A0000000000000000B0B000000A090A0090900A9A0A9000000000000000000000000000000000000000000000000990099090B009900A0909090000000000000000000000090090009009C0F9009F0FCB9FB90A99FFBDB09BD999CDB0900F00000B000A00000A09A9A9000000A00009000000B00909000000000000000000000000000000000000000000000000900B0000B09090A9090000000000000000000000000000000000900090B90B000A9BB9ED09BD9E9FD9DBD09E9CB90F09B09000B00A090000009A9A00000000090A0000000000900000000000000000000000000000000000000000000000000000900909909000909000090000000000000000000000000909000009A900AD000D9000B90F0BF9DFF90909F9FF90B90FCBF0000B09A0000000A00000000000000900090A0900000000000000000000000000000000000000000000000000000090090000090B0900000900000000000000000000000000000A000B00009090B00BEFF99099D00FBDFF9A909FDBB09A99BFD000000A9A0000000B0000A000000A00A90A090000000000000000000000000000000000000000000000000000000000009009A900009000000000000000000000000000000000009000090BCB009009FFFE9F0AFBD0FBD9C90F09FD0BC9EB09F00A000900000000000A09090000090090000000090B00000000000000000000000000000000000000000000000000000000900009000090000000000000000000000000000900900090900C9009A09FFFFFF0BDFFFB9DB09DF9909ABDBF90FF9000000A0000000B0BA900A000000000000909090A0000000000000000000000000000900000000000000000000000000000000900000000000000000000000000009000000000009A000A090B0090CFFFFFFF9BFFB09A09DBBD0F9FDFFF0FFDB000000000A9A0000000B9000000000B0B000A9A900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090909A90DA09BFFFFFFB0A9FFFF990B00BDF0BFBDBF9BFD0000000B00000B0B09A0A00A0000A00009A90000090000000000000000000900090000000000000000000000000000000000000000000000000000000000000000000900000000900090000FB0D0CFFFFFFF99C909FBA909BDDFB90DDF09F09F0000A9A00000A000A009000009A90000A0000B0F00009000000000000000B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000A90BD00FBFFFFFFFF9AFB09BF9B0FBCBFB90FBE9BFADF9000009A9A00B900B000000000A000009090A90C9000000000000000000900009000000000000000000000000000000000000000000000000000000000000000000000000000000009090C90BDBDFFFFFFFFFDF90BE9F9FB9B9B09A9F9FDEDBD9000A9A0009A0AB00000A00000090B000A0900BFAF0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0B09EFF9FFFFFFFFFFB099FFFFFC9009ADA990B9B0B900000000000900000A090A9000A000A09A0B0FDFBC0000000000000000000900A00000000000000000000000000000000000009000000000000000000000000000000000000000009A9090E9B09FFFFFFFFFFFF909FDFF99F9B0999009009D000009A9A9A00000000900000000900009A900A9EBD9A90000000000000000900009000000000000000000000000000000000000000000000000000000000000000000000000000900000F0B900BE9ADFFFFFFFFFFF09B9A9E9009E000D0DB0A99090A000A000A00000A0A000A000A00A0F00B9F9F0A000000000000000090000900000900000000090000000000000000000900000000000000000000000000000000000000000009C9B009000099FFFFFFFFFFFFFF09A9D9BD9F9B0B0B90D99A0A00BB09000090A09000A9090B009090B0B000A09090000000000000000A0000000000000000000000000000000000000000000A9000000000000000000000000000000000000000B0090009000A9BFFFFFFFFFFFFF0D9AD0F90F090D0909F0900000BA00000A090A0090A0A00B0A000000B099A09A9000000000000000090000000000000090000000000000000000000000000C0900000000000000000000000000000000000009F00900000090CFFFFFFFFFFFFBB0BDB90F90BDABB09F0F00000B09A000090A090B0A900B000000000900A099A000000000000000090000000000000000000000000000000000000000000090B000000000000000000000000000000000A00090090A009000009BFFFFFFFFFF90990BD9F90B909D0BC9F990009A9A90000A009AA09000B00B090000A0009BEA090000000000000000000B0000000000000000000000000000000000000000A0000000000000000000000000000000000090000B90090900090B00B9B9F9BF990A00AD0D00B0D0B0B0BB09A000A000000A900A090B009A09A000A0B009A9A099000000900900000000000000000000000000B00000000000000000000000900000000000000000000000000000000000000900900F000009000090009A9A90A00000999A900B0B0B099CB90900900000000009A00000A9A09BA0900B90009A0A000000000000000000000009000A0000000000900B0000000000000000000009000000000000000000000000000000000000000909900000B09000000009A9000000A09009B0B909A0B90900A00A00A000A0BA90000A9A90A0900A90A0B0A090900909000000000009000900A0900000000000A0000000000000000000000000000000000000000000000000000000000009009A90A00000090B0000000000000000090B9A0BDA90F9EB00B0000000000009A9A00900000B0B0A009A909AD0000000000900000000000000009000C00900000090000000000000000000000000000000000000000000000000000000009A90A900009000099E900000000A0000000900BD00B9BBDBDB9B0B9A0A900000000A9B00A0009A9ADA90B0A9E9A9A09000B0000A900000000000000000009000000000000900000000000000000000000000000000000000000000000000000000009009F09C009A09A000000009A0A0000A0090900A9FBF00B99CB0900A0A000A09AF0B9A90A000B0A9E9B0B0B09A0B00000B0000000000000000000000A00009000000000000000000000000000000000000000000000000000000000000009009090009A909090990000000000900A000909B0909A9B99ACB0900A0B0009A09AB0BB0B00A9A9AB09EB0A9AF0F09000909000009000000000090000090000000000000000000000000000000000000000000000000000000000000000090090A9ACADA9090B0009A0000000000A0A900F90AD090009A90B99090B009A9A9A0BBA9BB0B00B9A9AB9BA90909A9B0A0090A000009000000000000000000000900000000000000000000000000000000000000000000000000000000000000A0B009090909000D090F00900000000009000F0099090A09000B09A90BB09A9A9A9BF09A9A90BA9A9A9BE9BB0BBA9A0909A00009A90A0000000000000000000000000000000000000000000000000000000000000009000000000000000000A909090F0F09A9009A9090B9A900000000A0B0B09B009F000A0009A9C9A99BA9A09AB0BBE9A9A009A9A9A9BA9AF0F0F9A000000900000090000090000000000000000000000000000000000000000000000A000000000A00000000000000000900900C0909F9C9A009CB0B09000000000000000AC09A00F99000009A90DAB09AB0AF9FB0BB9A9A9AA9B0FA99BF9BB9A090A90900A90090000090000090000000000000000000000000000000C0B0000000F000000AD0000000000000000000000000B0B0B090B0D09A90090000000000009A00099B00999A000000F9E9A99BAB90B9BA9BB0A9A9AB9BEBB9BAB0BB00A9000000A090000000900A0000009000000000000000009FD000000009000000009A00C0F0000090000000D0090F00009009E9C90D090BDB0B009090B0000000000A0000B0A0A90DA000009B00B9BDA9F0BFAFB9A0B09A9AB9A9B9BA9B9B009A90A09090900009A909A90090000000900000009000000000A9A90A0000A90000A00C909A00000A000000A009A0009090A9009A9A9A9AD09CB0DA90A090A00000000000B0090900A90DB00000BB0A9A9ABB0B9BA9BA9A0FB9EB9ABA9B0B09ADADA90000A009A90000A000900A9009A0000000000000000009000000900900C000DEF00AC90C900000000009009F0B00A900B00909A9C9A90BDB09A990A909A00000009A0B9A0A90900090B0000DB9E909A9BFBA9B0900BB0BB9A9B9A9A9A09A9A9A009A90A0000009009A0A900000090B090000000000000000000000C0ADBDEFFFFFDFFEFF0E90C09CA900A900909A9C090090B090B90DB9009AD00B00000900000A00BCA09D000999E90000BA9A99BA9ABB09A0A00BBCBB9ABB9A9A000BA9A0B009000000000A0009A00909A0B00000000000009000000000900000B0D0A0B0F9B9BF99B9A90F90CB9C0090E9ADAD0B9A09A000DA9E9B0009090A9090009A0009000B0B09B0A009A09A000009090A09A909A00090B0BBB0B09AB0B09A9000090A00A0000090009A000900A090090A0900000000000000000009A0900E90C9C9AD0A000A009A90A0B00B9EA090909A90090099A9A990009D00A0900A00B0009A00A9A00A9A090A9C9B00900000A0B9BB9A9A90000A9B0BFBBB090A0B09A9A9A0900000000A0A90000A00A900A90A090A09A9000000A00090000090A0900B0BACB0BC9A90000009090B0009CB0F0B09A9AC9A00909E99A90B0090A90900099009A09A9A90A9A0090BC9B0090B00900A90A9A00A00A90A9B0B000A090A0A000000A0B0900B000000000900000B0009000900000090090000000000C909E9F0909B0BCB000000000A0A00F0B0B090B0DA9090B09A0B090A909990009000A90A00900B0A09AF0A9A90B09A000A000A0A90AB9B0B000000A9A0B09A0000A90000000B0B00A000000000A90A0000000000A09A0A9A00000009090AD0F9A9EB09A0F0B0A9A90B000000A9090B0B0009ABC9A9CA9A09AD9099AD9A0D009000A090009B0B0B0B0BA9A9A90A09900B0090A9090A90A0B0090000000B0A00900B00B000000000A90B00A90B00000000000000B09A0090090A00F00A0A900B00909C9A9B0F9A9CB0000A00000CA0A9009A9AD0B9DAB9A9A090ADA090AD9A9000A0090A9B00900B0B9E9A9ADA90900B0090A90A00A909BA900A0A09A0B0B0B0A0B0B0000009A0B0A000090000000000000A00000A090A0B0A9000009090A909BAF0A90BCA9A0DA90B0000900B0B0B0AB0A9A0B90BA90FAD0B0B99990B9AD9D09090BA9009B09B0F9AB9A90A9AAD0BD0B0000A90B00A9A900A00090A09000B0B0B0B0B0A90B0000090B0A00A00000000000000A0909A909009E9E9A9A0B09B0A0D0BDAF0B9E9BB0AB0B090A0000A90BC9A9ADB0A909EFBDABCB00A0CB00909A9090B090B9E90BCBBAB9A90A9A9B0B09B0B0B09A00009AB0A0009A0A900A0BCB0B9A9A009AA0A09A9AA0090090A0A00A009A90A90A0A00A009A9A90000B0AB0A99BAFAFDAF0B0B0B90009AA909AB9AB0BA9E9B0F9F0BFBDEBDBB0BDB99A90B099E90909E9A9B9E9B0BDAB0A9ADB0B09A0B0000A0000B090900B0A090A9009EBDB0A9A9A9A0909A00A90B0A00A00909000A00A90A9009A90B0A9A90A9A9CBF0B9A0009FFFFDB0BCB0ADABA90AA000A9CB09A9B0BB0BFBDFF9FAFCB0B0F0B000F9A999A9A9AB0B0BA0B9A90BCB0BA9E9A9F0A00000B000A9A0B0009AA90A0A0BEFFB9A9A9A9A0B00B00A9A9A9A0B0A0A0000B00A90A9000000B0B0A9000A909B009A0B0FFFFFEF0B0B0B09AB909B0B0AB0B0B0A90A90B0FBFFFFFBFB09990B909A9AABC9BDB9F9F9BB0BBA9AB0B0BB0BDA9B09A09000009A0B0B0B009A0090B9FF9EBF9A90A9A00B00B00B0BE9B0B0B09A9000B0A900000B0B0B0B00A909ABA09A0090BFFFFFFFF0B0A0BE90EBA0B0B90A9A0B9AB9AB0BBCFBDFFFF0F0B0F9EB0DB999BA9ABA9ABA90B90A9B0B0B00B0A9A9A000A00A09A9A9A0B0A9A00B0A9EFFEFF0A9AA90B0B00B0AB0B90BCB0A09A00A0B009A00A0B0B0B0B09A90A0B009A00B0BFFFFFFFFF0B099A9ABB90B9A00A9A0B90A9CADFADFFEFFFFFFFF0BBFB9DBBFBEBDB9A9B9A9BBA0A90A9A9A9A9A90BE090B00909ADB9A9A0A9A9A9A9BBFBFFFFFF009AB0B0FA0B00F0AB0B0A90A0B0900ABA9A99A0BCB0B0A000A9B0B0A90B0A9EFFFFFFFFF0B0A9A9A9EB0A9B09A090AB9BBFFFFFFFFFFFFFFFF909B9A9BFB9B9AFA9A9A9A9009000B0B0000000A90B0A0B0A0A9B0000909A0B0B0F0FCFFFFFFFBA90B0E90B00A9A90BCABCA9A90AA9009A9A0A9A9B0B0F9B0B0A0B0B0B0A9BB9FFFFFFFFFACB0A9ADA90B0A9AA9AA900BCBFFFFFFFDFFFFFFFFB009A909B9EBB9B9ADAB0BAB00000000B0090009A90B00009A9ABBB0B0A00B0FFFBFBFFFFFFFFEDBA9A9A000F9A9AC0A90A9A9EB90ABBE9A9B0A9ACBCB0A0F0B9BD0A9A9B0BCBFFFFFFFFFF9A09ADA9AB0B0A09A90A0BFBFFFFFFFFFBFFFFFFF000A9CB0BFB9EB0F9A90B09000000000000A000000A00B0BA9A9A90A0009ADFFFBCFFFFFFFFFFFB0000000E9A0AC0A900E90A9A90AF909A9A0A900B0B0B09A0BCB0B9B0BADBF9FFFFFFFFFFE9FA9A90E09A9E9AADA9FFFFFFFFFFFBFDFFFFFFF00090B0BDA9A99B00B0BA9A900000000000909000090B0BCBDA909FFBB0ADAFFFFFDFEFFFFFFFF00F00000000B0B00A0000B0A90A90AFABC09000E0E0F0E00F0B0B0A0B09AF9EFFFFFFFFFF9A00E0A090ACBFFF9AFFFFFFFFFFFFFDFEFFFFFFF0000B090B9B9A00A90B0900000000000000000000000BCBF0B0000FFCFB0BFFFFFBEBDFFFFFFFFF00A00A00A0C00C00CA900D0A9CA90090B0A000009A9A9E00BCBC90BCBB9EF9BFFFFFFFFFFDA909C0AC9ACFFFFFFFFFFFFFFFFFBFF9FFFFFFFB000000000009A90000000000000000000000000000A0B0FF00000FFFB0FFFFFFFDFFFFFFFFFFFE0000000000A00A00A0CA00AC0A0CA0E00000000E0F0F00F0CB09A9E900CBDEDFFFFFFFFF0A0E0A0A00A0FFFFFFFFFFFFFFFFFFDE9FFFFFFFF0000000000000000000000000000000000000000000090DADB0000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000B0F00E00A90B0000A9BFFFBFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFBFFFFFFFFF0000000000000000000000000000000000000000000000BFF00000000000000000000000000105000000000000AEAD05FE','Anne has a BA degree in English from St. Lawrence College. She is fluent in French and German.',5,'http://accweb/emmployees/davolio.bmp'); + +INSERT INTO "OrderDetails" VALUES(10248,11,14,12,0); +INSERT INTO "OrderDetails" VALUES(10248,42,9.8,10,0); +INSERT INTO "OrderDetails" VALUES(10248,72,34.8,5,0); +INSERT INTO "OrderDetails" VALUES(10249,14,18.6,9,0); +INSERT INTO "OrderDetails" VALUES(10249,51,42.4,40,0); +INSERT INTO "OrderDetails" VALUES(10250,41,7.7,10,0); +INSERT INTO "OrderDetails" VALUES(10250,51,42.4,35,0.15); +INSERT INTO "OrderDetails" VALUES(10250,65,16.8,15,0.15); +INSERT INTO "OrderDetails" VALUES(10251,22,16.8,6,0.05); +INSERT INTO "OrderDetails" VALUES(10251,57,15.6,15,0.05); + +INSERT INTO "OrderDetails" VALUES(10251,65,16.8,20,0); +INSERT INTO "OrderDetails" VALUES(10252,20,64.8,40,0.05); +INSERT INTO "OrderDetails" VALUES(10252,33,2,25,0.05); +INSERT INTO "OrderDetails" VALUES(10252,60,27.2,40,0); +INSERT INTO "OrderDetails" VALUES(10253,31,10,20,0); +INSERT INTO "OrderDetails" VALUES(10253,39,14.4,42,0); +INSERT INTO "OrderDetails" VALUES(10253,49,16,40,0); +INSERT INTO "OrderDetails" VALUES(10254,24,3.6,15,0.15); +INSERT INTO "OrderDetails" VALUES(10254,55,19.2,21,0.15); +INSERT INTO "OrderDetails" VALUES(10254,74,8,21,0); + +INSERT INTO "OrderDetails" VALUES(10255,2,15.2,20,0); +INSERT INTO "OrderDetails" VALUES(10255,16,13.9,35,0); +INSERT INTO "OrderDetails" VALUES(10255,36,15.2,25,0); +INSERT INTO "OrderDetails" VALUES(10255,59,44,30,0); +INSERT INTO "OrderDetails" VALUES(10256,53,26.2,15,0); +INSERT INTO "OrderDetails" VALUES(10256,77,10.4,12,0); +INSERT INTO "OrderDetails" VALUES(10257,27,35.1,25,0); +INSERT INTO "OrderDetails" VALUES(10257,39,14.4,6,0); +INSERT INTO "OrderDetails" VALUES(10257,77,10.4,15,0); +INSERT INTO "OrderDetails" VALUES(10258,2,15.2,50,0.2); + +INSERT INTO "OrderDetails" VALUES(10258,5,17,65,0.2); +INSERT INTO "OrderDetails" VALUES(10258,32,25.6,6,0.2); +INSERT INTO "OrderDetails" VALUES(10259,21,8,10,0); +INSERT INTO "OrderDetails" VALUES(10259,37,20.8,1,0); +INSERT INTO "OrderDetails" VALUES(10260,41,7.7,16,0.25); +INSERT INTO "OrderDetails" VALUES(10260,57,15.6,50,0); +INSERT INTO "OrderDetails" VALUES(10260,62,39.4,15,0.25); +INSERT INTO "OrderDetails" VALUES(10260,70,12,21,0.25); +INSERT INTO "OrderDetails" VALUES(10261,21,8,20,0); +INSERT INTO "OrderDetails" VALUES(10261,35,14.4,20,0); + +INSERT INTO "OrderDetails" VALUES(10262,5,17,12,0.2); +INSERT INTO "OrderDetails" VALUES(10262,7,24,15,0); +INSERT INTO "OrderDetails" VALUES(10262,56,30.4,2,0); +INSERT INTO "OrderDetails" VALUES(10263,16,13.9,60,0.25); +INSERT INTO "OrderDetails" VALUES(10263,24,3.6,28,0); +INSERT INTO "OrderDetails" VALUES(10263,30,20.7,60,0.25); +INSERT INTO "OrderDetails" VALUES(10263,74,8,36,0.25); +INSERT INTO "OrderDetails" VALUES(10264,2,15.2,35,0); +INSERT INTO "OrderDetails" VALUES(10264,41,7.7,25,0.15); +INSERT INTO "OrderDetails" VALUES(10265,17,31.2,30,0); + +INSERT INTO "OrderDetails" VALUES(10265,70,12,20,0); +INSERT INTO "OrderDetails" VALUES(10266,12,30.4,12,0.05); +INSERT INTO "OrderDetails" VALUES(10267,40,14.7,50,0); +INSERT INTO "OrderDetails" VALUES(10267,59,44,70,0.15); +INSERT INTO "OrderDetails" VALUES(10267,76,14.4,15,0.15); +INSERT INTO "OrderDetails" VALUES(10268,29,99,10,0); +INSERT INTO "OrderDetails" VALUES(10268,72,27.8,4,0); +INSERT INTO "OrderDetails" VALUES(10269,33,2,60,0.05); +INSERT INTO "OrderDetails" VALUES(10269,72,27.8,20,0.05); +INSERT INTO "OrderDetails" VALUES(10270,36,15.2,30,0); + +INSERT INTO "OrderDetails" VALUES(10270,43,36.8,25,0); +INSERT INTO "OrderDetails" VALUES(10271,33,2,24,0); +INSERT INTO "OrderDetails" VALUES(10272,20,64.8,6,0); +INSERT INTO "OrderDetails" VALUES(10272,31,10,40,0); +INSERT INTO "OrderDetails" VALUES(10272,72,27.8,24,0); +INSERT INTO "OrderDetails" VALUES(10273,10,24.8,24,0.05); +INSERT INTO "OrderDetails" VALUES(10273,31,10,15,0.05); +INSERT INTO "OrderDetails" VALUES(10273,33,2,20,0); +INSERT INTO "OrderDetails" VALUES(10273,40,14.7,60,0.05); +INSERT INTO "OrderDetails" VALUES(10273,76,14.4,33,0.05); + +INSERT INTO "OrderDetails" VALUES(10274,71,17.2,20,0); +INSERT INTO "OrderDetails" VALUES(10274,72,27.8,7,0); +INSERT INTO "OrderDetails" VALUES(10275,24,3.6,12,0.05); +INSERT INTO "OrderDetails" VALUES(10275,59,44,6,0.05); +INSERT INTO "OrderDetails" VALUES(10276,10,24.8,15,0); +INSERT INTO "OrderDetails" VALUES(10276,13,4.8,10,0); +INSERT INTO "OrderDetails" VALUES(10277,28,36.4,20,0); +INSERT INTO "OrderDetails" VALUES(10277,62,39.4,12,0); +INSERT INTO "OrderDetails" VALUES(10278,44,15.5,16,0); +INSERT INTO "OrderDetails" VALUES(10278,59,44,15,0); + +INSERT INTO "OrderDetails" VALUES(10278,63,35.1,8,0); +INSERT INTO "OrderDetails" VALUES(10278,73,12,25,0); +INSERT INTO "OrderDetails" VALUES(10279,17,31.2,15,0.25); +INSERT INTO "OrderDetails" VALUES(10280,24,3.6,12,0); +INSERT INTO "OrderDetails" VALUES(10280,55,19.2,20,0); +INSERT INTO "OrderDetails" VALUES(10280,75,6.2,30,0); +INSERT INTO "OrderDetails" VALUES(10281,19,7.3,1,0); +INSERT INTO "OrderDetails" VALUES(10281,24,3.6,6,0); +INSERT INTO "OrderDetails" VALUES(10281,35,14.4,4,0); +INSERT INTO "OrderDetails" VALUES(10282,30,20.7,6,0); + +INSERT INTO "OrderDetails" VALUES(10282,57,15.6,2,0); +INSERT INTO "OrderDetails" VALUES(10283,15,12.4,20,0); +INSERT INTO "OrderDetails" VALUES(10283,19,7.3,18,0); +INSERT INTO "OrderDetails" VALUES(10283,60,27.2,35,0); +INSERT INTO "OrderDetails" VALUES(10283,72,27.8,3,0); +INSERT INTO "OrderDetails" VALUES(10284,27,35.1,15,0.25); +INSERT INTO "OrderDetails" VALUES(10284,44,15.5,21,0); +INSERT INTO "OrderDetails" VALUES(10284,60,27.2,20,0.25); +INSERT INTO "OrderDetails" VALUES(10284,67,11.2,5,0.25); +INSERT INTO "OrderDetails" VALUES(10285,1,14.4,45,0.2); + +INSERT INTO "OrderDetails" VALUES(10285,40,14.7,40,0.2); +INSERT INTO "OrderDetails" VALUES(10285,53,26.2,36,0.2); +INSERT INTO "OrderDetails" VALUES(10286,35,14.4,100,0); +INSERT INTO "OrderDetails" VALUES(10286,62,39.4,40,0); +INSERT INTO "OrderDetails" VALUES(10287,16,13.9,40,0.15); +INSERT INTO "OrderDetails" VALUES(10287,34,11.2,20,0); +INSERT INTO "OrderDetails" VALUES(10287,46,9.6,15,0.15); +INSERT INTO "OrderDetails" VALUES(10288,54,5.9,10,0.1); +INSERT INTO "OrderDetails" VALUES(10288,68,10,3,0.1); +INSERT INTO "OrderDetails" VALUES(10289,3,8,30,0); + +INSERT INTO "OrderDetails" VALUES(10289,64,26.6,9,0); +INSERT INTO "OrderDetails" VALUES(10290,5,17,20,0); +INSERT INTO "OrderDetails" VALUES(10290,29,99,15,0); +INSERT INTO "OrderDetails" VALUES(10290,49,16,15,0); +INSERT INTO "OrderDetails" VALUES(10290,77,10.4,10,0); +INSERT INTO "OrderDetails" VALUES(10291,13,4.8,20,0.1); +INSERT INTO "OrderDetails" VALUES(10291,44,15.5,24,0.1); +INSERT INTO "OrderDetails" VALUES(10291,51,42.4,2,0.1); +INSERT INTO "OrderDetails" VALUES(10292,20,64.8,20,0); +INSERT INTO "OrderDetails" VALUES(10293,18,50,12,0); + +INSERT INTO "OrderDetails" VALUES(10293,24,3.6,10,0); +INSERT INTO "OrderDetails" VALUES(10293,63,35.1,5,0); +INSERT INTO "OrderDetails" VALUES(10293,75,6.2,6,0); +INSERT INTO "OrderDetails" VALUES(10294,1,14.4,18,0); +INSERT INTO "OrderDetails" VALUES(10294,17,31.2,15,0); +INSERT INTO "OrderDetails" VALUES(10294,43,36.8,15,0); +INSERT INTO "OrderDetails" VALUES(10294,60,27.2,21,0); +INSERT INTO "OrderDetails" VALUES(10294,75,6.2,6,0); +INSERT INTO "OrderDetails" VALUES(10295,56,30.4,4,0); +INSERT INTO "OrderDetails" VALUES(10296,11,16.8,12,0); + +INSERT INTO "OrderDetails" VALUES(10296,16,13.9,30,0); +INSERT INTO "OrderDetails" VALUES(10296,69,28.8,15,0); +INSERT INTO "OrderDetails" VALUES(10297,39,14.4,60,0); +INSERT INTO "OrderDetails" VALUES(10297,72,27.8,20,0); +INSERT INTO "OrderDetails" VALUES(10298,2,15.2,40,0); +INSERT INTO "OrderDetails" VALUES(10298,36,15.2,40,0.25); +INSERT INTO "OrderDetails" VALUES(10298,59,44,30,0.25); +INSERT INTO "OrderDetails" VALUES(10298,62,39.4,15,0); +INSERT INTO "OrderDetails" VALUES(10299,19,7.3,15,0); +INSERT INTO "OrderDetails" VALUES(10299,70,12,20,0); + +INSERT INTO "OrderDetails" VALUES(10300,66,13.6,30,0); +INSERT INTO "OrderDetails" VALUES(10300,68,10,20,0); +INSERT INTO "OrderDetails" VALUES(10301,40,14.7,10,0); +INSERT INTO "OrderDetails" VALUES(10301,56,30.4,20,0); +INSERT INTO "OrderDetails" VALUES(10302,17,31.2,40,0); +INSERT INTO "OrderDetails" VALUES(10302,28,36.4,28,0); +INSERT INTO "OrderDetails" VALUES(10302,43,36.8,12,0); +INSERT INTO "OrderDetails" VALUES(10303,40,14.7,40,0.1); +INSERT INTO "OrderDetails" VALUES(10303,65,16.8,30,0.1); +INSERT INTO "OrderDetails" VALUES(10303,68,10,15,0.1); + +INSERT INTO "OrderDetails" VALUES(10304,49,16,30,0); +INSERT INTO "OrderDetails" VALUES(10304,59,44,10,0); +INSERT INTO "OrderDetails" VALUES(10304,71,17.2,2,0); +INSERT INTO "OrderDetails" VALUES(10305,18,50,25,0.1); +INSERT INTO "OrderDetails" VALUES(10305,29,99,25,0.1); +INSERT INTO "OrderDetails" VALUES(10305,39,14.4,30,0.1); +INSERT INTO "OrderDetails" VALUES(10306,30,20.7,10,0); +INSERT INTO "OrderDetails" VALUES(10306,53,26.2,10,0); +INSERT INTO "OrderDetails" VALUES(10306,54,5.9,5,0); +INSERT INTO "OrderDetails" VALUES(10307,62,39.4,10,0); + +INSERT INTO "OrderDetails" VALUES(10307,68,10,3,0); +INSERT INTO "OrderDetails" VALUES(10308,69,28.8,1,0); +INSERT INTO "OrderDetails" VALUES(10308,70,12,5,0); +INSERT INTO "OrderDetails" VALUES(10309,4,17.6,20,0); +INSERT INTO "OrderDetails" VALUES(10309,6,20,30,0); +INSERT INTO "OrderDetails" VALUES(10309,42,11.2,2,0); +INSERT INTO "OrderDetails" VALUES(10309,43,36.8,20,0); +INSERT INTO "OrderDetails" VALUES(10309,71,17.2,3,0); +INSERT INTO "OrderDetails" VALUES(10310,16,13.9,10,0); +INSERT INTO "OrderDetails" VALUES(10310,62,39.4,5,0); + +INSERT INTO "OrderDetails" VALUES(10311,42,11.2,6,0); +INSERT INTO "OrderDetails" VALUES(10311,69,28.8,7,0); +INSERT INTO "OrderDetails" VALUES(10312,28,36.4,4,0); +INSERT INTO "OrderDetails" VALUES(10312,43,36.8,24,0); +INSERT INTO "OrderDetails" VALUES(10312,53,26.2,20,0); +INSERT INTO "OrderDetails" VALUES(10312,75,6.2,10,0); +INSERT INTO "OrderDetails" VALUES(10313,36,15.2,12,0); +INSERT INTO "OrderDetails" VALUES(10314,32,25.6,40,0.1); +INSERT INTO "OrderDetails" VALUES(10314,58,10.6,30,0.1); +INSERT INTO "OrderDetails" VALUES(10314,62,39.4,25,0.1); + +INSERT INTO "OrderDetails" VALUES(10315,34,11.2,14,0); +INSERT INTO "OrderDetails" VALUES(10315,70,12,30,0); +INSERT INTO "OrderDetails" VALUES(10316,41,7.7,10,0); +INSERT INTO "OrderDetails" VALUES(10316,62,39.4,70,0); +INSERT INTO "OrderDetails" VALUES(10317,1,14.4,20,0); +INSERT INTO "OrderDetails" VALUES(10318,41,7.7,20,0); +INSERT INTO "OrderDetails" VALUES(10318,76,14.4,6,0); +INSERT INTO "OrderDetails" VALUES(10319,17,31.2,8,0); +INSERT INTO "OrderDetails" VALUES(10319,28,36.4,14,0); +INSERT INTO "OrderDetails" VALUES(10319,76,14.4,30,0); + +INSERT INTO "OrderDetails" VALUES(10320,71,17.2,30,0); +INSERT INTO "OrderDetails" VALUES(10321,35,14.4,10,0); +INSERT INTO "OrderDetails" VALUES(10322,52,5.6,20,0); +INSERT INTO "OrderDetails" VALUES(10323,15,12.4,5,0); +INSERT INTO "OrderDetails" VALUES(10323,25,11.2,4,0); +INSERT INTO "OrderDetails" VALUES(10323,39,14.4,4,0); +INSERT INTO "OrderDetails" VALUES(10324,16,13.9,21,0.15); +INSERT INTO "OrderDetails" VALUES(10324,35,14.4,70,0.15); +INSERT INTO "OrderDetails" VALUES(10324,46,9.6,30,0); +INSERT INTO "OrderDetails" VALUES(10324,59,44,40,0.15); + +INSERT INTO "OrderDetails" VALUES(10324,63,35.1,80,0.15); +INSERT INTO "OrderDetails" VALUES(10325,6,20,6,0); +INSERT INTO "OrderDetails" VALUES(10325,13,4.8,12,0); +INSERT INTO "OrderDetails" VALUES(10325,14,18.6,9,0); +INSERT INTO "OrderDetails" VALUES(10325,31,10,4,0); +INSERT INTO "OrderDetails" VALUES(10325,72,27.8,40,0); +INSERT INTO "OrderDetails" VALUES(10326,4,17.6,24,0); +INSERT INTO "OrderDetails" VALUES(10326,57,15.6,16,0); +INSERT INTO "OrderDetails" VALUES(10326,75,6.2,50,0); +INSERT INTO "OrderDetails" VALUES(10327,2,15.2,25,0.2); + +INSERT INTO "OrderDetails" VALUES(10327,11,16.8,50,0.2); +INSERT INTO "OrderDetails" VALUES(10327,30,20.7,35,0.2); +INSERT INTO "OrderDetails" VALUES(10327,58,10.6,30,0.2); +INSERT INTO "OrderDetails" VALUES(10328,59,44,9,0); +INSERT INTO "OrderDetails" VALUES(10328,65,16.8,40,0); +INSERT INTO "OrderDetails" VALUES(10328,68,10,10,0); +INSERT INTO "OrderDetails" VALUES(10329,19,7.3,10,0.05); +INSERT INTO "OrderDetails" VALUES(10329,30,20.7,8,0.05); +INSERT INTO "OrderDetails" VALUES(10329,38,210.8,20,0.05); +INSERT INTO "OrderDetails" VALUES(10329,56,30.4,12,0.05); + +INSERT INTO "OrderDetails" VALUES(10330,26,24.9,50,0.15); +INSERT INTO "OrderDetails" VALUES(10330,72,27.8,25,0.15); +INSERT INTO "OrderDetails" VALUES(10331,54,5.9,15,0); +INSERT INTO "OrderDetails" VALUES(10332,18,50,40,0.2); +INSERT INTO "OrderDetails" VALUES(10332,42,11.2,10,0.2); +INSERT INTO "OrderDetails" VALUES(10332,47,7.6,16,0.2); +INSERT INTO "OrderDetails" VALUES(10333,14,18.6,10,0); +INSERT INTO "OrderDetails" VALUES(10333,21,8,10,0.1); +INSERT INTO "OrderDetails" VALUES(10333,71,17.2,40,0.1); +INSERT INTO "OrderDetails" VALUES(10334,52,5.6,8,0); + +INSERT INTO "OrderDetails" VALUES(10334,68,10,10,0); +INSERT INTO "OrderDetails" VALUES(10335,2,15.2,7,0.2); +INSERT INTO "OrderDetails" VALUES(10335,31,10,25,0.2); +INSERT INTO "OrderDetails" VALUES(10335,32,25.6,6,0.2); +INSERT INTO "OrderDetails" VALUES(10335,51,42.4,48,0.2); +INSERT INTO "OrderDetails" VALUES(10336,4,17.6,18,0.1); +INSERT INTO "OrderDetails" VALUES(10337,23,7.2,40,0); +INSERT INTO "OrderDetails" VALUES(10337,26,24.9,24,0); +INSERT INTO "OrderDetails" VALUES(10337,36,15.2,20,0); +INSERT INTO "OrderDetails" VALUES(10337,37,20.8,28,0); + +INSERT INTO "OrderDetails" VALUES(10337,72,27.8,25,0); +INSERT INTO "OrderDetails" VALUES(10338,17,31.2,20,0); +INSERT INTO "OrderDetails" VALUES(10338,30,20.7,15,0); +INSERT INTO "OrderDetails" VALUES(10339,4,17.6,10,0); +INSERT INTO "OrderDetails" VALUES(10339,17,31.2,70,0.05); +INSERT INTO "OrderDetails" VALUES(10339,62,39.4,28,0); +INSERT INTO "OrderDetails" VALUES(10340,18,50,20,0.05); +INSERT INTO "OrderDetails" VALUES(10340,41,7.7,12,0.05); +INSERT INTO "OrderDetails" VALUES(10340,43,36.8,40,0.05); +INSERT INTO "OrderDetails" VALUES(10341,33,2,8,0); + +INSERT INTO "OrderDetails" VALUES(10341,59,44,9,0.15); +INSERT INTO "OrderDetails" VALUES(10342,2,15.2,24,0.2); +INSERT INTO "OrderDetails" VALUES(10342,31,10,56,0.2); +INSERT INTO "OrderDetails" VALUES(10342,36,15.2,40,0.2); +INSERT INTO "OrderDetails" VALUES(10342,55,19.2,40,0.2); +INSERT INTO "OrderDetails" VALUES(10343,64,26.6,50,0); +INSERT INTO "OrderDetails" VALUES(10343,68,10,4,0.05); +INSERT INTO "OrderDetails" VALUES(10343,76,14.4,15,0); +INSERT INTO "OrderDetails" VALUES(10344,4,17.6,35,0); +INSERT INTO "OrderDetails" VALUES(10344,8,32,70,0.25); + +INSERT INTO "OrderDetails" VALUES(10345,8,32,70,0); +INSERT INTO "OrderDetails" VALUES(10345,19,7.3,80,0); +INSERT INTO "OrderDetails" VALUES(10345,42,11.2,9,0); +INSERT INTO "OrderDetails" VALUES(10346,17,31.2,36,0.1); +INSERT INTO "OrderDetails" VALUES(10346,56,30.4,20,0); +INSERT INTO "OrderDetails" VALUES(10347,25,11.2,10,0); +INSERT INTO "OrderDetails" VALUES(10347,39,14.4,50,0.15); +INSERT INTO "OrderDetails" VALUES(10347,40,14.7,4,0); +INSERT INTO "OrderDetails" VALUES(10347,75,6.2,6,0.15); +INSERT INTO "OrderDetails" VALUES(10348,1,14.4,15,0.15); + +INSERT INTO "OrderDetails" VALUES(10348,23,7.2,25,0); +INSERT INTO "OrderDetails" VALUES(10349,54,5.9,24,0); +INSERT INTO "OrderDetails" VALUES(10350,50,13,15,0.1); +INSERT INTO "OrderDetails" VALUES(10350,69,28.8,18,0.1); +INSERT INTO "OrderDetails" VALUES(10351,38,210.8,20,0.05); +INSERT INTO "OrderDetails" VALUES(10351,41,7.7,13,0); +INSERT INTO "OrderDetails" VALUES(10351,44,15.5,77,0.05); +INSERT INTO "OrderDetails" VALUES(10351,65,16.8,10,0.05); +INSERT INTO "OrderDetails" VALUES(10352,24,3.6,10,0); +INSERT INTO "OrderDetails" VALUES(10352,54,5.9,20,0.15); + +INSERT INTO "OrderDetails" VALUES(10353,11,16.8,12,0.2); +INSERT INTO "OrderDetails" VALUES(10353,38,210.8,50,0.2); +INSERT INTO "OrderDetails" VALUES(10354,1,14.4,12,0); +INSERT INTO "OrderDetails" VALUES(10354,29,99,4,0); +INSERT INTO "OrderDetails" VALUES(10355,24,3.6,25,0); +INSERT INTO "OrderDetails" VALUES(10355,57,15.6,25,0); +INSERT INTO "OrderDetails" VALUES(10356,31,10,30,0); +INSERT INTO "OrderDetails" VALUES(10356,55,19.2,12,0); +INSERT INTO "OrderDetails" VALUES(10356,69,28.8,20,0); +INSERT INTO "OrderDetails" VALUES(10357,10,24.8,30,0.2); + +INSERT INTO "OrderDetails" VALUES(10357,26,24.9,16,0); +INSERT INTO "OrderDetails" VALUES(10357,60,27.2,8,0.2); +INSERT INTO "OrderDetails" VALUES(10358,24,3.6,10,0.05); +INSERT INTO "OrderDetails" VALUES(10358,34,11.2,10,0.05); +INSERT INTO "OrderDetails" VALUES(10358,36,15.2,20,0.05); +INSERT INTO "OrderDetails" VALUES(10359,16,13.9,56,0.05); +INSERT INTO "OrderDetails" VALUES(10359,31,10,70,0.05); +INSERT INTO "OrderDetails" VALUES(10359,60,27.2,80,0.05); +INSERT INTO "OrderDetails" VALUES(10360,28,36.4,30,0); +INSERT INTO "OrderDetails" VALUES(10360,29,99,35,0); + +INSERT INTO "OrderDetails" VALUES(10360,38,210.8,10,0); +INSERT INTO "OrderDetails" VALUES(10360,49,16,35,0); +INSERT INTO "OrderDetails" VALUES(10360,54,5.9,28,0); +INSERT INTO "OrderDetails" VALUES(10361,39,14.4,54,0.1); +INSERT INTO "OrderDetails" VALUES(10361,60,27.2,55,0.1); +INSERT INTO "OrderDetails" VALUES(10362,25,11.2,50,0); +INSERT INTO "OrderDetails" VALUES(10362,51,42.4,20,0); +INSERT INTO "OrderDetails" VALUES(10362,54,5.9,24,0); +INSERT INTO "OrderDetails" VALUES(10363,31,10,20,0); +INSERT INTO "OrderDetails" VALUES(10363,75,6.2,12,0); + +INSERT INTO "OrderDetails" VALUES(10363,76,14.4,12,0); +INSERT INTO "OrderDetails" VALUES(10364,69,28.8,30,0); +INSERT INTO "OrderDetails" VALUES(10364,71,17.2,5,0); +INSERT INTO "OrderDetails" VALUES(10365,11,16.8,24,0); +INSERT INTO "OrderDetails" VALUES(10366,65,16.8,5,0); +INSERT INTO "OrderDetails" VALUES(10366,77,10.4,5,0); +INSERT INTO "OrderDetails" VALUES(10367,34,11.2,36,0); +INSERT INTO "OrderDetails" VALUES(10367,54,5.9,18,0); +INSERT INTO "OrderDetails" VALUES(10367,65,16.8,15,0); +INSERT INTO "OrderDetails" VALUES(10367,77,10.4,7,0); + +INSERT INTO "OrderDetails" VALUES(10368,21,8,5,0.1); +INSERT INTO "OrderDetails" VALUES(10368,28,36.4,13,0.1); +INSERT INTO "OrderDetails" VALUES(10368,57,15.6,25,0); +INSERT INTO "OrderDetails" VALUES(10368,64,26.6,35,0.1); +INSERT INTO "OrderDetails" VALUES(10369,29,99,20,0); +INSERT INTO "OrderDetails" VALUES(10369,56,30.4,18,0.25); +INSERT INTO "OrderDetails" VALUES(10370,1,14.4,15,0.15); +INSERT INTO "OrderDetails" VALUES(10370,64,26.6,30,0); +INSERT INTO "OrderDetails" VALUES(10370,74,8,20,0.15); +INSERT INTO "OrderDetails" VALUES(10371,36,15.2,6,0.2); + +INSERT INTO "OrderDetails" VALUES(10372,20,64.8,12,0.25); +INSERT INTO "OrderDetails" VALUES(10372,38,210.8,40,0.25); +INSERT INTO "OrderDetails" VALUES(10372,60,27.2,70,0.25); +INSERT INTO "OrderDetails" VALUES(10372,72,27.8,42,0.25); +INSERT INTO "OrderDetails" VALUES(10373,58,10.6,80,0.2); +INSERT INTO "OrderDetails" VALUES(10373,71,17.2,50,0.2); +INSERT INTO "OrderDetails" VALUES(10374,31,10,30,0); +INSERT INTO "OrderDetails" VALUES(10374,58,10.6,15,0); +INSERT INTO "OrderDetails" VALUES(10375,14,18.6,15,0); +INSERT INTO "OrderDetails" VALUES(10375,54,5.9,10,0); + +INSERT INTO "OrderDetails" VALUES(10376,31,10,42,0.05); +INSERT INTO "OrderDetails" VALUES(10377,28,36.4,20,0.15); +INSERT INTO "OrderDetails" VALUES(10377,39,14.4,20,0.15); +INSERT INTO "OrderDetails" VALUES(10378,71,17.2,6,0); +INSERT INTO "OrderDetails" VALUES(10379,41,7.7,8,0.1); +INSERT INTO "OrderDetails" VALUES(10379,63,35.1,16,0.1); +INSERT INTO "OrderDetails" VALUES(10379,65,16.8,20,0.1); +INSERT INTO "OrderDetails" VALUES(10380,30,20.7,18,0.1); +INSERT INTO "OrderDetails" VALUES(10380,53,26.2,20,0.1); +INSERT INTO "OrderDetails" VALUES(10380,60,27.2,6,0.1); + +INSERT INTO "OrderDetails" VALUES(10380,70,12,30,0); +INSERT INTO "OrderDetails" VALUES(10381,74,8,14,0); +INSERT INTO "OrderDetails" VALUES(10382,5,17,32,0); +INSERT INTO "OrderDetails" VALUES(10382,18,50,9,0); +INSERT INTO "OrderDetails" VALUES(10382,29,99,14,0); +INSERT INTO "OrderDetails" VALUES(10382,33,2,60,0); +INSERT INTO "OrderDetails" VALUES(10382,74,8,50,0); +INSERT INTO "OrderDetails" VALUES(10383,13,4.8,20,0); +INSERT INTO "OrderDetails" VALUES(10383,50,13,15,0); +INSERT INTO "OrderDetails" VALUES(10383,56,30.4,20,0); + +INSERT INTO "OrderDetails" VALUES(10384,20,64.8,28,0); +INSERT INTO "OrderDetails" VALUES(10384,60,27.2,15,0); +INSERT INTO "OrderDetails" VALUES(10385,7,24,10,0.2); +INSERT INTO "OrderDetails" VALUES(10385,60,27.2,20,0.2); +INSERT INTO "OrderDetails" VALUES(10385,68,10,8,0.2); +INSERT INTO "OrderDetails" VALUES(10386,24,3.6,15,0); +INSERT INTO "OrderDetails" VALUES(10386,34,11.2,10,0); +INSERT INTO "OrderDetails" VALUES(10387,24,3.6,15,0); +INSERT INTO "OrderDetails" VALUES(10387,28,36.4,6,0); +INSERT INTO "OrderDetails" VALUES(10387,59,44,12,0); + +INSERT INTO "OrderDetails" VALUES(10387,71,17.2,15,0); +INSERT INTO "OrderDetails" VALUES(10388,45,7.6,15,0.2); +INSERT INTO "OrderDetails" VALUES(10388,52,5.6,20,0.2); +INSERT INTO "OrderDetails" VALUES(10388,53,26.2,40,0); +INSERT INTO "OrderDetails" VALUES(10389,10,24.8,16,0); +INSERT INTO "OrderDetails" VALUES(10389,55,19.2,15,0); +INSERT INTO "OrderDetails" VALUES(10389,62,39.4,20,0); +INSERT INTO "OrderDetails" VALUES(10389,70,12,30,0); +INSERT INTO "OrderDetails" VALUES(10390,31,10,60,0.1); +INSERT INTO "OrderDetails" VALUES(10390,35,14.4,40,0.1); + +INSERT INTO "OrderDetails" VALUES(10390,46,9.6,45,0); +INSERT INTO "OrderDetails" VALUES(10390,72,27.8,24,0.1); +INSERT INTO "OrderDetails" VALUES(10391,13,4.8,18,0); +INSERT INTO "OrderDetails" VALUES(10392,69,28.8,50,0); +INSERT INTO "OrderDetails" VALUES(10393,2,15.2,25,0.25); +INSERT INTO "OrderDetails" VALUES(10393,14,18.6,42,0.25); +INSERT INTO "OrderDetails" VALUES(10393,25,11.2,7,0.25); +INSERT INTO "OrderDetails" VALUES(10393,26,24.9,70,0.25); +INSERT INTO "OrderDetails" VALUES(10393,31,10,32,0); +INSERT INTO "OrderDetails" VALUES(10394,13,4.8,10,0); + +INSERT INTO "OrderDetails" VALUES(10394,62,39.4,10,0); +INSERT INTO "OrderDetails" VALUES(10395,46,9.6,28,0.1); +INSERT INTO "OrderDetails" VALUES(10395,53,26.2,70,0.1); +INSERT INTO "OrderDetails" VALUES(10395,69,28.8,8,0); +INSERT INTO "OrderDetails" VALUES(10396,23,7.2,40,0); +INSERT INTO "OrderDetails" VALUES(10396,71,17.2,60,0); +INSERT INTO "OrderDetails" VALUES(10396,72,27.8,21,0); +INSERT INTO "OrderDetails" VALUES(10397,21,8,10,0.15); +INSERT INTO "OrderDetails" VALUES(10397,51,42.4,18,0.15); +INSERT INTO "OrderDetails" VALUES(10398,35,14.4,30,0); + +INSERT INTO "OrderDetails" VALUES(10398,55,19.2,120,0.1); +INSERT INTO "OrderDetails" VALUES(10399,68,10,60,0); +INSERT INTO "OrderDetails" VALUES(10399,71,17.2,30,0); +INSERT INTO "OrderDetails" VALUES(10399,76,14.4,35,0); +INSERT INTO "OrderDetails" VALUES(10399,77,10.4,14,0); +INSERT INTO "OrderDetails" VALUES(10400,29,99,21,0); +INSERT INTO "OrderDetails" VALUES(10400,35,14.4,35,0); +INSERT INTO "OrderDetails" VALUES(10400,49,16,30,0); +INSERT INTO "OrderDetails" VALUES(10401,30,20.7,18,0); +INSERT INTO "OrderDetails" VALUES(10401,56,30.4,70,0); + +INSERT INTO "OrderDetails" VALUES(10401,65,16.8,20,0); +INSERT INTO "OrderDetails" VALUES(10401,71,17.2,60,0); +INSERT INTO "OrderDetails" VALUES(10402,23,7.2,60,0); +INSERT INTO "OrderDetails" VALUES(10402,63,35.1,65,0); +INSERT INTO "OrderDetails" VALUES(10403,16,13.9,21,0.15); +INSERT INTO "OrderDetails" VALUES(10403,48,10.2,70,0.15); +INSERT INTO "OrderDetails" VALUES(10404,26,24.9,30,0.05); +INSERT INTO "OrderDetails" VALUES(10404,42,11.2,40,0.05); +INSERT INTO "OrderDetails" VALUES(10404,49,16,30,0.05); +INSERT INTO "OrderDetails" VALUES(10405,3,8,50,0); + +INSERT INTO "OrderDetails" VALUES(10406,1,14.4,10,0); +INSERT INTO "OrderDetails" VALUES(10406,21,8,30,0.1); +INSERT INTO "OrderDetails" VALUES(10406,28,36.4,42,0.1); +INSERT INTO "OrderDetails" VALUES(10406,36,15.2,5,0.1); +INSERT INTO "OrderDetails" VALUES(10406,40,14.7,2,0.1); +INSERT INTO "OrderDetails" VALUES(10407,11,16.8,30,0); +INSERT INTO "OrderDetails" VALUES(10407,69,28.8,15,0); +INSERT INTO "OrderDetails" VALUES(10407,71,17.2,15,0); +INSERT INTO "OrderDetails" VALUES(10408,37,20.8,10,0); +INSERT INTO "OrderDetails" VALUES(10408,54,5.9,6,0); + +INSERT INTO "OrderDetails" VALUES(10408,62,39.4,35,0); +INSERT INTO "OrderDetails" VALUES(10409,14,18.6,12,0); +INSERT INTO "OrderDetails" VALUES(10409,21,8,12,0); +INSERT INTO "OrderDetails" VALUES(10410,33,2,49,0); +INSERT INTO "OrderDetails" VALUES(10410,59,44,16,0); +INSERT INTO "OrderDetails" VALUES(10411,41,7.7,25,0.2); +INSERT INTO "OrderDetails" VALUES(10411,44,15.5,40,0.2); +INSERT INTO "OrderDetails" VALUES(10411,59,44,9,0.2); +INSERT INTO "OrderDetails" VALUES(10412,14,18.6,20,0.1); +INSERT INTO "OrderDetails" VALUES(10413,1,14.4,24,0); + +INSERT INTO "OrderDetails" VALUES(10413,62,39.4,40,0); +INSERT INTO "OrderDetails" VALUES(10413,76,14.4,14,0); +INSERT INTO "OrderDetails" VALUES(10414,19,7.3,18,0.05); +INSERT INTO "OrderDetails" VALUES(10414,33,2,50,0); +INSERT INTO "OrderDetails" VALUES(10415,17,31.2,2,0); +INSERT INTO "OrderDetails" VALUES(10415,33,2,20,0); +INSERT INTO "OrderDetails" VALUES(10416,19,7.3,20,0); +INSERT INTO "OrderDetails" VALUES(10416,53,26.2,10,0); +INSERT INTO "OrderDetails" VALUES(10416,57,15.6,20,0); +INSERT INTO "OrderDetails" VALUES(10417,38,210.8,50,0); + +INSERT INTO "OrderDetails" VALUES(10417,46,9.6,2,0.25); +INSERT INTO "OrderDetails" VALUES(10417,68,10,36,0.25); +INSERT INTO "OrderDetails" VALUES(10417,77,10.4,35,0); +INSERT INTO "OrderDetails" VALUES(10418,2,15.2,60,0); +INSERT INTO "OrderDetails" VALUES(10418,47,7.6,55,0); +INSERT INTO "OrderDetails" VALUES(10418,61,22.8,16,0); +INSERT INTO "OrderDetails" VALUES(10418,74,8,15,0); +INSERT INTO "OrderDetails" VALUES(10419,60,27.2,60,0.05); +INSERT INTO "OrderDetails" VALUES(10419,69,28.8,20,0.05); +INSERT INTO "OrderDetails" VALUES(10420,9,77.6,20,0.1); + +INSERT INTO "OrderDetails" VALUES(10420,13,4.8,2,0.1); +INSERT INTO "OrderDetails" VALUES(10420,70,12,8,0.1); +INSERT INTO "OrderDetails" VALUES(10420,73,12,20,0.1); +INSERT INTO "OrderDetails" VALUES(10421,19,7.3,4,0.15); +INSERT INTO "OrderDetails" VALUES(10421,26,24.9,30,0); +INSERT INTO "OrderDetails" VALUES(10421,53,26.2,15,0.15); +INSERT INTO "OrderDetails" VALUES(10421,77,10.4,10,0.15); +INSERT INTO "OrderDetails" VALUES(10422,26,24.9,2,0); +INSERT INTO "OrderDetails" VALUES(10423,31,10,14,0); +INSERT INTO "OrderDetails" VALUES(10423,59,44,20,0); + +INSERT INTO "OrderDetails" VALUES(10424,35,14.4,60,0.2); +INSERT INTO "OrderDetails" VALUES(10424,38,210.8,49,0.2); +INSERT INTO "OrderDetails" VALUES(10424,68,10,30,0.2); +INSERT INTO "OrderDetails" VALUES(10425,55,19.2,10,0.25); +INSERT INTO "OrderDetails" VALUES(10425,76,14.4,20,0.25); +INSERT INTO "OrderDetails" VALUES(10426,56,30.4,5,0); +INSERT INTO "OrderDetails" VALUES(10426,64,26.6,7,0); +INSERT INTO "OrderDetails" VALUES(10427,14,18.6,35,0); +INSERT INTO "OrderDetails" VALUES(10428,46,9.6,20,0); +INSERT INTO "OrderDetails" VALUES(10429,50,13,40,0); + +INSERT INTO "OrderDetails" VALUES(10429,63,35.1,35,0.25); +INSERT INTO "OrderDetails" VALUES(10430,17,31.2,45,0.2); +INSERT INTO "OrderDetails" VALUES(10430,21,8,50,0); +INSERT INTO "OrderDetails" VALUES(10430,56,30.4,30,0); +INSERT INTO "OrderDetails" VALUES(10430,59,44,70,0.2); +INSERT INTO "OrderDetails" VALUES(10431,17,31.2,50,0.25); +INSERT INTO "OrderDetails" VALUES(10431,40,14.7,50,0.25); +INSERT INTO "OrderDetails" VALUES(10431,47,7.6,30,0.25); +INSERT INTO "OrderDetails" VALUES(10432,26,24.9,10,0); +INSERT INTO "OrderDetails" VALUES(10432,54,5.9,40,0); + +INSERT INTO "OrderDetails" VALUES(10433,56,30.4,28,0); +INSERT INTO "OrderDetails" VALUES(10434,11,16.8,6,0); +INSERT INTO "OrderDetails" VALUES(10434,76,14.4,18,0.15); +INSERT INTO "OrderDetails" VALUES(10435,2,15.2,10,0); +INSERT INTO "OrderDetails" VALUES(10435,22,16.8,12,0); +INSERT INTO "OrderDetails" VALUES(10435,72,27.8,10,0); +INSERT INTO "OrderDetails" VALUES(10436,46,9.6,5,0); +INSERT INTO "OrderDetails" VALUES(10436,56,30.4,40,0.1); +INSERT INTO "OrderDetails" VALUES(10436,64,26.6,30,0.1); +INSERT INTO "OrderDetails" VALUES(10436,75,6.2,24,0.1); + +INSERT INTO "OrderDetails" VALUES(10437,53,26.2,15,0); +INSERT INTO "OrderDetails" VALUES(10438,19,7.3,15,0.2); +INSERT INTO "OrderDetails" VALUES(10438,34,11.2,20,0.2); +INSERT INTO "OrderDetails" VALUES(10438,57,15.6,15,0.2); +INSERT INTO "OrderDetails" VALUES(10439,12,30.4,15,0); +INSERT INTO "OrderDetails" VALUES(10439,16,13.9,16,0); +INSERT INTO "OrderDetails" VALUES(10439,64,26.6,6,0); +INSERT INTO "OrderDetails" VALUES(10439,74,8,30,0); +INSERT INTO "OrderDetails" VALUES(10440,2,15.2,45,0.15); +INSERT INTO "OrderDetails" VALUES(10440,16,13.9,49,0.15); + +INSERT INTO "OrderDetails" VALUES(10440,29,99,24,0.15); +INSERT INTO "OrderDetails" VALUES(10440,61,22.8,90,0.15); +INSERT INTO "OrderDetails" VALUES(10441,27,35.1,50,0); +INSERT INTO "OrderDetails" VALUES(10442,11,16.8,30,0); +INSERT INTO "OrderDetails" VALUES(10442,54,5.9,80,0); +INSERT INTO "OrderDetails" VALUES(10442,66,13.6,60,0); +INSERT INTO "OrderDetails" VALUES(10443,11,16.8,6,0.2); +INSERT INTO "OrderDetails" VALUES(10443,28,36.4,12,0); +INSERT INTO "OrderDetails" VALUES(10444,17,31.2,10,0); +INSERT INTO "OrderDetails" VALUES(10444,26,24.9,15,0); + +INSERT INTO "OrderDetails" VALUES(10444,35,14.4,8,0); +INSERT INTO "OrderDetails" VALUES(10444,41,7.7,30,0); +INSERT INTO "OrderDetails" VALUES(10445,39,14.4,6,0); +INSERT INTO "OrderDetails" VALUES(10445,54,5.9,15,0); +INSERT INTO "OrderDetails" VALUES(10446,19,7.3,12,0.1); +INSERT INTO "OrderDetails" VALUES(10446,24,3.6,20,0.1); +INSERT INTO "OrderDetails" VALUES(10446,31,10,3,0.1); +INSERT INTO "OrderDetails" VALUES(10446,52,5.6,15,0.1); +INSERT INTO "OrderDetails" VALUES(10447,19,7.3,40,0); +INSERT INTO "OrderDetails" VALUES(10447,65,16.8,35,0); + +INSERT INTO "OrderDetails" VALUES(10447,71,17.2,2,0); +INSERT INTO "OrderDetails" VALUES(10448,26,24.9,6,0); +INSERT INTO "OrderDetails" VALUES(10448,40,14.7,20,0); +INSERT INTO "OrderDetails" VALUES(10449,10,24.8,14,0); +INSERT INTO "OrderDetails" VALUES(10449,52,5.6,20,0); +INSERT INTO "OrderDetails" VALUES(10449,62,39.4,35,0); +INSERT INTO "OrderDetails" VALUES(10450,10,24.8,20,0.2); +INSERT INTO "OrderDetails" VALUES(10450,54,5.9,6,0.2); +INSERT INTO "OrderDetails" VALUES(10451,55,19.2,120,0.1); +INSERT INTO "OrderDetails" VALUES(10451,64,26.6,35,0.1); + +INSERT INTO "OrderDetails" VALUES(10451,65,16.8,28,0.1); +INSERT INTO "OrderDetails" VALUES(10451,77,10.4,55,0.1); +INSERT INTO "OrderDetails" VALUES(10452,28,36.4,15,0); +INSERT INTO "OrderDetails" VALUES(10452,44,15.5,100,0.05); +INSERT INTO "OrderDetails" VALUES(10453,48,10.2,15,0.1); +INSERT INTO "OrderDetails" VALUES(10453,70,12,25,0.1); +INSERT INTO "OrderDetails" VALUES(10454,16,13.9,20,0.2); +INSERT INTO "OrderDetails" VALUES(10454,33,2,20,0.2); +INSERT INTO "OrderDetails" VALUES(10454,46,9.6,10,0.2); +INSERT INTO "OrderDetails" VALUES(10455,39,14.4,20,0); + +INSERT INTO "OrderDetails" VALUES(10455,53,26.2,50,0); +INSERT INTO "OrderDetails" VALUES(10455,61,22.8,25,0); +INSERT INTO "OrderDetails" VALUES(10455,71,17.2,30,0); +INSERT INTO "OrderDetails" VALUES(10456,21,8,40,0.15); +INSERT INTO "OrderDetails" VALUES(10456,49,16,21,0.15); +INSERT INTO "OrderDetails" VALUES(10457,59,44,36,0); +INSERT INTO "OrderDetails" VALUES(10458,26,24.9,30,0); +INSERT INTO "OrderDetails" VALUES(10458,28,36.4,30,0); +INSERT INTO "OrderDetails" VALUES(10458,43,36.8,20,0); +INSERT INTO "OrderDetails" VALUES(10458,56,30.4,15,0); + +INSERT INTO "OrderDetails" VALUES(10458,71,17.2,50,0); +INSERT INTO "OrderDetails" VALUES(10459,7,24,16,0.05); +INSERT INTO "OrderDetails" VALUES(10459,46,9.6,20,0.05); +INSERT INTO "OrderDetails" VALUES(10459,72,27.8,40,0); +INSERT INTO "OrderDetails" VALUES(10460,68,10,21,0.25); +INSERT INTO "OrderDetails" VALUES(10460,75,6.2,4,0.25); +INSERT INTO "OrderDetails" VALUES(10461,21,8,40,0.25); +INSERT INTO "OrderDetails" VALUES(10461,30,20.7,28,0.25); +INSERT INTO "OrderDetails" VALUES(10461,55,19.2,60,0.25); +INSERT INTO "OrderDetails" VALUES(10462,13,4.8,1,0); + +INSERT INTO "OrderDetails" VALUES(10462,23,7.2,21,0); +INSERT INTO "OrderDetails" VALUES(10463,19,7.3,21,0); +INSERT INTO "OrderDetails" VALUES(10463,42,11.2,50,0); +INSERT INTO "OrderDetails" VALUES(10464,4,17.6,16,0.2); +INSERT INTO "OrderDetails" VALUES(10464,43,36.8,3,0); +INSERT INTO "OrderDetails" VALUES(10464,56,30.4,30,0.2); +INSERT INTO "OrderDetails" VALUES(10464,60,27.2,20,0); +INSERT INTO "OrderDetails" VALUES(10465,24,3.6,25,0); +INSERT INTO "OrderDetails" VALUES(10465,29,99,18,0.1); +INSERT INTO "OrderDetails" VALUES(10465,40,14.7,20,0); + +INSERT INTO "OrderDetails" VALUES(10465,45,7.6,30,0.1); +INSERT INTO "OrderDetails" VALUES(10465,50,13,25,0); +INSERT INTO "OrderDetails" VALUES(10466,11,16.8,10,0); +INSERT INTO "OrderDetails" VALUES(10466,46,9.6,5,0); +INSERT INTO "OrderDetails" VALUES(10467,24,3.6,28,0); +INSERT INTO "OrderDetails" VALUES(10467,25,11.2,12,0); +INSERT INTO "OrderDetails" VALUES(10468,30,20.7,8,0); +INSERT INTO "OrderDetails" VALUES(10468,43,36.8,15,0); +INSERT INTO "OrderDetails" VALUES(10469,2,15.2,40,0.15); +INSERT INTO "OrderDetails" VALUES(10469,16,13.9,35,0.15); + +INSERT INTO "OrderDetails" VALUES(10469,44,15.5,2,0.15); +INSERT INTO "OrderDetails" VALUES(10470,18,50,30,0); +INSERT INTO "OrderDetails" VALUES(10470,23,7.2,15,0); +INSERT INTO "OrderDetails" VALUES(10470,64,26.6,8,0); +INSERT INTO "OrderDetails" VALUES(10471,7,24,30,0); +INSERT INTO "OrderDetails" VALUES(10471,56,30.4,20,0); +INSERT INTO "OrderDetails" VALUES(10472,24,3.6,80,0.05); +INSERT INTO "OrderDetails" VALUES(10472,51,42.4,18,0); +INSERT INTO "OrderDetails" VALUES(10473,33,2,12,0); +INSERT INTO "OrderDetails" VALUES(10473,71,17.2,12,0); + +INSERT INTO "OrderDetails" VALUES(10474,14,18.6,12,0); +INSERT INTO "OrderDetails" VALUES(10474,28,36.4,18,0); +INSERT INTO "OrderDetails" VALUES(10474,40,14.7,21,0); +INSERT INTO "OrderDetails" VALUES(10474,75,6.2,10,0); +INSERT INTO "OrderDetails" VALUES(10475,31,10,35,0.15); +INSERT INTO "OrderDetails" VALUES(10475,66,13.6,60,0.15); +INSERT INTO "OrderDetails" VALUES(10475,76,14.4,42,0.15); +INSERT INTO "OrderDetails" VALUES(10476,55,19.2,2,0.05); +INSERT INTO "OrderDetails" VALUES(10476,70,12,12,0); +INSERT INTO "OrderDetails" VALUES(10477,1,14.4,15,0); + +INSERT INTO "OrderDetails" VALUES(10477,21,8,21,0.25); +INSERT INTO "OrderDetails" VALUES(10477,39,14.4,20,0.25); +INSERT INTO "OrderDetails" VALUES(10478,10,24.8,20,0.05); +INSERT INTO "OrderDetails" VALUES(10479,38,210.8,30,0); +INSERT INTO "OrderDetails" VALUES(10479,53,26.2,28,0); +INSERT INTO "OrderDetails" VALUES(10479,59,44,60,0); +INSERT INTO "OrderDetails" VALUES(10479,64,26.6,30,0); +INSERT INTO "OrderDetails" VALUES(10480,47,7.6,30,0); +INSERT INTO "OrderDetails" VALUES(10480,59,44,12,0); +INSERT INTO "OrderDetails" VALUES(10481,49,16,24,0); + +INSERT INTO "OrderDetails" VALUES(10481,60,27.2,40,0); +INSERT INTO "OrderDetails" VALUES(10482,40,14.7,10,0); +INSERT INTO "OrderDetails" VALUES(10483,34,11.2,35,0.05); +INSERT INTO "OrderDetails" VALUES(10483,77,10.4,30,0.05); +INSERT INTO "OrderDetails" VALUES(10484,21,8,14,0); +INSERT INTO "OrderDetails" VALUES(10484,40,14.7,10,0); +INSERT INTO "OrderDetails" VALUES(10484,51,42.4,3,0); +INSERT INTO "OrderDetails" VALUES(10485,2,15.2,20,0.1); +INSERT INTO "OrderDetails" VALUES(10485,3,8,20,0.1); +INSERT INTO "OrderDetails" VALUES(10485,55,19.2,30,0.1); + +INSERT INTO "OrderDetails" VALUES(10485,70,12,60,0.1); +INSERT INTO "OrderDetails" VALUES(10486,11,16.8,5,0); +INSERT INTO "OrderDetails" VALUES(10486,51,42.4,25,0); +INSERT INTO "OrderDetails" VALUES(10486,74,8,16,0); +INSERT INTO "OrderDetails" VALUES(10487,19,7.3,5,0); +INSERT INTO "OrderDetails" VALUES(10487,26,24.9,30,0); +INSERT INTO "OrderDetails" VALUES(10487,54,5.9,24,0.25); +INSERT INTO "OrderDetails" VALUES(10488,59,44,30,0); +INSERT INTO "OrderDetails" VALUES(10488,73,12,20,0.2); +INSERT INTO "OrderDetails" VALUES(10489,11,16.8,15,0.25); + +INSERT INTO "OrderDetails" VALUES(10489,16,13.9,18,0); +INSERT INTO "OrderDetails" VALUES(10490,59,44,60,0); +INSERT INTO "OrderDetails" VALUES(10490,68,10,30,0); +INSERT INTO "OrderDetails" VALUES(10490,75,6.2,36,0); +INSERT INTO "OrderDetails" VALUES(10491,44,15.5,15,0.15); +INSERT INTO "OrderDetails" VALUES(10491,77,10.4,7,0.15); +INSERT INTO "OrderDetails" VALUES(10492,25,11.2,60,0.05); +INSERT INTO "OrderDetails" VALUES(10492,42,11.2,20,0.05); +INSERT INTO "OrderDetails" VALUES(10493,65,16.8,15,0.1); +INSERT INTO "OrderDetails" VALUES(10493,66,13.6,10,0.1); + +INSERT INTO "OrderDetails" VALUES(10493,69,28.8,10,0.1); +INSERT INTO "OrderDetails" VALUES(10494,56,30.4,30,0); +INSERT INTO "OrderDetails" VALUES(10495,23,7.2,10,0); +INSERT INTO "OrderDetails" VALUES(10495,41,7.7,20,0); +INSERT INTO "OrderDetails" VALUES(10495,77,10.4,5,0); +INSERT INTO "OrderDetails" VALUES(10496,31,10,20,0.05); +INSERT INTO "OrderDetails" VALUES(10497,56,30.4,14,0); +INSERT INTO "OrderDetails" VALUES(10497,72,27.8,25,0); +INSERT INTO "OrderDetails" VALUES(10497,77,10.4,25,0); +INSERT INTO "OrderDetails" VALUES(10498,24,4.5,14,0); + +INSERT INTO "OrderDetails" VALUES(10498,40,18.4,5,0); +INSERT INTO "OrderDetails" VALUES(10498,42,14,30,0); +INSERT INTO "OrderDetails" VALUES(10499,28,45.6,20,0); +INSERT INTO "OrderDetails" VALUES(10499,49,20,25,0); +INSERT INTO "OrderDetails" VALUES(10500,15,15.5,12,0.05); +INSERT INTO "OrderDetails" VALUES(10500,28,45.6,8,0.05); +INSERT INTO "OrderDetails" VALUES(10501,54,7.45,20,0); +INSERT INTO "OrderDetails" VALUES(10502,45,9.5,21,0); +INSERT INTO "OrderDetails" VALUES(10502,53,32.8,6,0); +INSERT INTO "OrderDetails" VALUES(10502,67,14,30,0); + +INSERT INTO "OrderDetails" VALUES(10503,14,23.25,70,0); +INSERT INTO "OrderDetails" VALUES(10503,65,21.05,20,0); +INSERT INTO "OrderDetails" VALUES(10504,2,19,12,0); +INSERT INTO "OrderDetails" VALUES(10504,21,10,12,0); +INSERT INTO "OrderDetails" VALUES(10504,53,32.8,10,0); +INSERT INTO "OrderDetails" VALUES(10504,61,28.5,25,0); +INSERT INTO "OrderDetails" VALUES(10505,62,49.3,3,0); +INSERT INTO "OrderDetails" VALUES(10506,25,14,18,0.1); +INSERT INTO "OrderDetails" VALUES(10506,70,15,14,0.1); +INSERT INTO "OrderDetails" VALUES(10507,43,46,15,0.15); + +INSERT INTO "OrderDetails" VALUES(10507,48,12.75,15,0.15); +INSERT INTO "OrderDetails" VALUES(10508,13,6,10,0); +INSERT INTO "OrderDetails" VALUES(10508,39,18,10,0); +INSERT INTO "OrderDetails" VALUES(10509,28,45.6,3,0); +INSERT INTO "OrderDetails" VALUES(10510,29,123.79,36,0); +INSERT INTO "OrderDetails" VALUES(10510,75,7.75,36,0.1); +INSERT INTO "OrderDetails" VALUES(10511,4,22,50,0.15); +INSERT INTO "OrderDetails" VALUES(10511,7,30,50,0.15); +INSERT INTO "OrderDetails" VALUES(10511,8,40,10,0.15); +INSERT INTO "OrderDetails" VALUES(10512,24,4.5,10,0.15); + +INSERT INTO "OrderDetails" VALUES(10512,46,12,9,0.15); +INSERT INTO "OrderDetails" VALUES(10512,47,9.5,6,0.15); +INSERT INTO "OrderDetails" VALUES(10512,60,34,12,0.15); +INSERT INTO "OrderDetails" VALUES(10513,21,10,40,0.2); +INSERT INTO "OrderDetails" VALUES(10513,32,32,50,0.2); +INSERT INTO "OrderDetails" VALUES(10513,61,28.5,15,0.2); +INSERT INTO "OrderDetails" VALUES(10514,20,81,39,0); +INSERT INTO "OrderDetails" VALUES(10514,28,45.6,35,0); +INSERT INTO "OrderDetails" VALUES(10514,56,38,70,0); +INSERT INTO "OrderDetails" VALUES(10514,65,21.05,39,0); + +INSERT INTO "OrderDetails" VALUES(10514,75,7.75,50,0); +INSERT INTO "OrderDetails" VALUES(10515,9,97,16,0.15); +INSERT INTO "OrderDetails" VALUES(10515,16,17.45,50,0); +INSERT INTO "OrderDetails" VALUES(10515,27,43.9,120,0); +INSERT INTO "OrderDetails" VALUES(10515,33,2.5,16,0.15); +INSERT INTO "OrderDetails" VALUES(10515,60,34,84,0.15); +INSERT INTO "OrderDetails" VALUES(10516,18,62.5,25,0.1); +INSERT INTO "OrderDetails" VALUES(10516,41,9.65,80,0.1); +INSERT INTO "OrderDetails" VALUES(10516,42,14,20,0); +INSERT INTO "OrderDetails" VALUES(10517,52,7,6,0); + +INSERT INTO "OrderDetails" VALUES(10517,59,55,4,0); +INSERT INTO "OrderDetails" VALUES(10517,70,15,6,0); +INSERT INTO "OrderDetails" VALUES(10518,24,4.5,5,0); +INSERT INTO "OrderDetails" VALUES(10518,38,263.5,15,0); +INSERT INTO "OrderDetails" VALUES(10518,44,19.45,9,0); +INSERT INTO "OrderDetails" VALUES(10519,10,31,16,0.05); +INSERT INTO "OrderDetails" VALUES(10519,56,38,40,0); +INSERT INTO "OrderDetails" VALUES(10519,60,34,10,0.05); +INSERT INTO "OrderDetails" VALUES(10520,24,4.5,8,0); +INSERT INTO "OrderDetails" VALUES(10520,53,32.8,5,0); + +INSERT INTO "OrderDetails" VALUES(10521,35,18,3,0); +INSERT INTO "OrderDetails" VALUES(10521,41,9.65,10,0); +INSERT INTO "OrderDetails" VALUES(10521,68,12.5,6,0); +INSERT INTO "OrderDetails" VALUES(10522,1,18,40,0.2); +INSERT INTO "OrderDetails" VALUES(10522,8,40,24,0); +INSERT INTO "OrderDetails" VALUES(10522,30,25.89,20,0.2); +INSERT INTO "OrderDetails" VALUES(10522,40,18.4,25,0.2); +INSERT INTO "OrderDetails" VALUES(10523,17,39,25,0.1); +INSERT INTO "OrderDetails" VALUES(10523,20,81,15,0.1); +INSERT INTO "OrderDetails" VALUES(10523,37,26,18,0.1); + +INSERT INTO "OrderDetails" VALUES(10523,41,9.65,6,0.1); +INSERT INTO "OrderDetails" VALUES(10524,10,31,2,0); +INSERT INTO "OrderDetails" VALUES(10524,30,25.89,10,0); +INSERT INTO "OrderDetails" VALUES(10524,43,46,60,0); +INSERT INTO "OrderDetails" VALUES(10524,54,7.45,15,0); +INSERT INTO "OrderDetails" VALUES(10525,36,19,30,0); +INSERT INTO "OrderDetails" VALUES(10525,40,18.4,15,0.1); +INSERT INTO "OrderDetails" VALUES(10526,1,18,8,0.15); +INSERT INTO "OrderDetails" VALUES(10526,13,6,10,0); +INSERT INTO "OrderDetails" VALUES(10526,56,38,30,0.15); + +INSERT INTO "OrderDetails" VALUES(10527,4,22,50,0.1); +INSERT INTO "OrderDetails" VALUES(10527,36,19,30,0.1); +INSERT INTO "OrderDetails" VALUES(10528,11,21,3,0); +INSERT INTO "OrderDetails" VALUES(10528,33,2.5,8,0.2); +INSERT INTO "OrderDetails" VALUES(10528,72,34.8,9,0); +INSERT INTO "OrderDetails" VALUES(10529,55,24,14,0); +INSERT INTO "OrderDetails" VALUES(10529,68,12.5,20,0); +INSERT INTO "OrderDetails" VALUES(10529,69,36,10,0); +INSERT INTO "OrderDetails" VALUES(10530,17,39,40,0); +INSERT INTO "OrderDetails" VALUES(10530,43,46,25,0); + +INSERT INTO "OrderDetails" VALUES(10530,61,28.5,20,0); +INSERT INTO "OrderDetails" VALUES(10530,76,18,50,0); +INSERT INTO "OrderDetails" VALUES(10531,59,55,2,0); +INSERT INTO "OrderDetails" VALUES(10532,30,25.89,15,0); +INSERT INTO "OrderDetails" VALUES(10532,66,17,24,0); +INSERT INTO "OrderDetails" VALUES(10533,4,22,50,0.05); +INSERT INTO "OrderDetails" VALUES(10533,72,34.8,24,0); +INSERT INTO "OrderDetails" VALUES(10533,73,15,24,0.05); +INSERT INTO "OrderDetails" VALUES(10534,30,25.89,10,0); +INSERT INTO "OrderDetails" VALUES(10534,40,18.4,10,0.2); + +INSERT INTO "OrderDetails" VALUES(10534,54,7.45,10,0.2); +INSERT INTO "OrderDetails" VALUES(10535,11,21,50,0.1); +INSERT INTO "OrderDetails" VALUES(10535,40,18.4,10,0.1); +INSERT INTO "OrderDetails" VALUES(10535,57,19.5,5,0.1); +INSERT INTO "OrderDetails" VALUES(10535,59,55,15,0.1); +INSERT INTO "OrderDetails" VALUES(10536,12,38,15,0.25); +INSERT INTO "OrderDetails" VALUES(10536,31,12.5,20,0); +INSERT INTO "OrderDetails" VALUES(10536,33,2.5,30,0); +INSERT INTO "OrderDetails" VALUES(10536,60,34,35,0.25); +INSERT INTO "OrderDetails" VALUES(10537,31,12.5,30,0); + +INSERT INTO "OrderDetails" VALUES(10537,51,53,6,0); +INSERT INTO "OrderDetails" VALUES(10537,58,13.25,20,0); +INSERT INTO "OrderDetails" VALUES(10537,72,34.8,21,0); +INSERT INTO "OrderDetails" VALUES(10537,73,15,9,0); +INSERT INTO "OrderDetails" VALUES(10538,70,15,7,0); +INSERT INTO "OrderDetails" VALUES(10538,72,34.8,1,0); +INSERT INTO "OrderDetails" VALUES(10539,13,6,8,0); +INSERT INTO "OrderDetails" VALUES(10539,21,10,15,0); +INSERT INTO "OrderDetails" VALUES(10539,33,2.5,15,0); +INSERT INTO "OrderDetails" VALUES(10539,49,20,6,0); + +INSERT INTO "OrderDetails" VALUES(10540,3,10,60,0); +INSERT INTO "OrderDetails" VALUES(10540,26,31.23,40,0); +INSERT INTO "OrderDetails" VALUES(10540,38,263.5,30,0); +INSERT INTO "OrderDetails" VALUES(10540,68,12.5,35,0); +INSERT INTO "OrderDetails" VALUES(10541,24,4.5,35,0.1); +INSERT INTO "OrderDetails" VALUES(10541,38,263.5,4,0.1); +INSERT INTO "OrderDetails" VALUES(10541,65,21.05,36,0.1); +INSERT INTO "OrderDetails" VALUES(10541,71,21.5,9,0.1); +INSERT INTO "OrderDetails" VALUES(10542,11,21,15,0.05); +INSERT INTO "OrderDetails" VALUES(10542,54,7.45,24,0.05); + +INSERT INTO "OrderDetails" VALUES(10543,12,38,30,0.15); +INSERT INTO "OrderDetails" VALUES(10543,23,9,70,0.15); +INSERT INTO "OrderDetails" VALUES(10544,28,45.6,7,0); +INSERT INTO "OrderDetails" VALUES(10544,67,14,7,0); +INSERT INTO "OrderDetails" VALUES(10545,11,21,10,0); +INSERT INTO "OrderDetails" VALUES(10546,7,30,10,0); +INSERT INTO "OrderDetails" VALUES(10546,35,18,30,0); +INSERT INTO "OrderDetails" VALUES(10546,62,49.3,40,0); +INSERT INTO "OrderDetails" VALUES(10547,32,32,24,0.15); +INSERT INTO "OrderDetails" VALUES(10547,36,19,60,0); + +INSERT INTO "OrderDetails" VALUES(10548,34,14,10,0.25); +INSERT INTO "OrderDetails" VALUES(10548,41,9.65,14,0); +INSERT INTO "OrderDetails" VALUES(10549,31,12.5,55,0.15); +INSERT INTO "OrderDetails" VALUES(10549,45,9.5,100,0.15); +INSERT INTO "OrderDetails" VALUES(10549,51,53,48,0.15); +INSERT INTO "OrderDetails" VALUES(10550,17,39,8,0.1); +INSERT INTO "OrderDetails" VALUES(10550,19,9.2,10,0); +INSERT INTO "OrderDetails" VALUES(10550,21,10,6,0.1); +INSERT INTO "OrderDetails" VALUES(10550,61,28.5,10,0.1); +INSERT INTO "OrderDetails" VALUES(10551,16,17.45,40,0.15); + +INSERT INTO "OrderDetails" VALUES(10551,35,18,20,0.15); +INSERT INTO "OrderDetails" VALUES(10551,44,19.45,40,0); +INSERT INTO "OrderDetails" VALUES(10552,69,36,18,0); +INSERT INTO "OrderDetails" VALUES(10552,75,7.75,30,0); +INSERT INTO "OrderDetails" VALUES(10553,11,21,15,0); +INSERT INTO "OrderDetails" VALUES(10553,16,17.45,14,0); +INSERT INTO "OrderDetails" VALUES(10553,22,21,24,0); +INSERT INTO "OrderDetails" VALUES(10553,31,12.5,30,0); +INSERT INTO "OrderDetails" VALUES(10553,35,18,6,0); +INSERT INTO "OrderDetails" VALUES(10554,16,17.45,30,0.05); + +INSERT INTO "OrderDetails" VALUES(10554,23,9,20,0.05); +INSERT INTO "OrderDetails" VALUES(10554,62,49.3,20,0.05); +INSERT INTO "OrderDetails" VALUES(10554,77,13,10,0.05); +INSERT INTO "OrderDetails" VALUES(10555,14,23.25,30,0.2); +INSERT INTO "OrderDetails" VALUES(10555,19,9.2,35,0.2); +INSERT INTO "OrderDetails" VALUES(10555,24,4.5,18,0.2); +INSERT INTO "OrderDetails" VALUES(10555,51,53,20,0.2); +INSERT INTO "OrderDetails" VALUES(10555,56,38,40,0.2); +INSERT INTO "OrderDetails" VALUES(10556,72,34.8,24,0); +INSERT INTO "OrderDetails" VALUES(10557,64,33.25,30,0); + +INSERT INTO "OrderDetails" VALUES(10557,75,7.75,20,0); +INSERT INTO "OrderDetails" VALUES(10558,47,9.5,25,0); +INSERT INTO "OrderDetails" VALUES(10558,51,53,20,0); +INSERT INTO "OrderDetails" VALUES(10558,52,7,30,0); +INSERT INTO "OrderDetails" VALUES(10558,53,32.8,18,0); +INSERT INTO "OrderDetails" VALUES(10558,73,15,3,0); +INSERT INTO "OrderDetails" VALUES(10559,41,9.65,12,0.05); +INSERT INTO "OrderDetails" VALUES(10559,55,24,18,0.05); +INSERT INTO "OrderDetails" VALUES(10560,30,25.89,20,0); +INSERT INTO "OrderDetails" VALUES(10560,62,49.3,15,0.25); + +INSERT INTO "OrderDetails" VALUES(10561,44,19.45,10,0); +INSERT INTO "OrderDetails" VALUES(10561,51,53,50,0); +INSERT INTO "OrderDetails" VALUES(10562,33,2.5,20,0.1); +INSERT INTO "OrderDetails" VALUES(10562,62,49.3,10,0.1); +INSERT INTO "OrderDetails" VALUES(10563,36,19,25,0); +INSERT INTO "OrderDetails" VALUES(10563,52,7,70,0); +INSERT INTO "OrderDetails" VALUES(10564,17,39,16,0.05); +INSERT INTO "OrderDetails" VALUES(10564,31,12.5,6,0.05); +INSERT INTO "OrderDetails" VALUES(10564,55,24,25,0.05); +INSERT INTO "OrderDetails" VALUES(10565,24,4.5,25,0.1); + +INSERT INTO "OrderDetails" VALUES(10565,64,33.25,18,0.1); +INSERT INTO "OrderDetails" VALUES(10566,11,21,35,0.15); +INSERT INTO "OrderDetails" VALUES(10566,18,62.5,18,0.15); +INSERT INTO "OrderDetails" VALUES(10566,76,18,10,0); +INSERT INTO "OrderDetails" VALUES(10567,31,12.5,60,0.2); +INSERT INTO "OrderDetails" VALUES(10567,51,53,3,0); +INSERT INTO "OrderDetails" VALUES(10567,59,55,40,0.2); +INSERT INTO "OrderDetails" VALUES(10568,10,31,5,0); +INSERT INTO "OrderDetails" VALUES(10569,31,12.5,35,0.2); +INSERT INTO "OrderDetails" VALUES(10569,76,18,30,0); + +INSERT INTO "OrderDetails" VALUES(10570,11,21,15,0.05); +INSERT INTO "OrderDetails" VALUES(10570,56,38,60,0.05); +INSERT INTO "OrderDetails" VALUES(10571,14,23.25,11,0.15); +INSERT INTO "OrderDetails" VALUES(10571,42,14,28,0.15); +INSERT INTO "OrderDetails" VALUES(10572,16,17.45,12,0.1); +INSERT INTO "OrderDetails" VALUES(10572,32,32,10,0.1); +INSERT INTO "OrderDetails" VALUES(10572,40,18.4,50,0); +INSERT INTO "OrderDetails" VALUES(10572,75,7.75,15,0.1); +INSERT INTO "OrderDetails" VALUES(10573,17,39,18,0); +INSERT INTO "OrderDetails" VALUES(10573,34,14,40,0); + +INSERT INTO "OrderDetails" VALUES(10573,53,32.8,25,0); +INSERT INTO "OrderDetails" VALUES(10574,33,2.5,14,0); +INSERT INTO "OrderDetails" VALUES(10574,40,18.4,2,0); +INSERT INTO "OrderDetails" VALUES(10574,62,49.3,10,0); +INSERT INTO "OrderDetails" VALUES(10574,64,33.25,6,0); +INSERT INTO "OrderDetails" VALUES(10575,59,55,12,0); +INSERT INTO "OrderDetails" VALUES(10575,63,43.9,6,0); +INSERT INTO "OrderDetails" VALUES(10575,72,34.8,30,0); +INSERT INTO "OrderDetails" VALUES(10575,76,18,10,0); +INSERT INTO "OrderDetails" VALUES(10576,1,18,10,0); + +INSERT INTO "OrderDetails" VALUES(10576,31,12.5,20,0); +INSERT INTO "OrderDetails" VALUES(10576,44,19.45,21,0); +INSERT INTO "OrderDetails" VALUES(10577,39,18,10,0); +INSERT INTO "OrderDetails" VALUES(10577,75,7.75,20,0); +INSERT INTO "OrderDetails" VALUES(10577,77,13,18,0); +INSERT INTO "OrderDetails" VALUES(10578,35,18,20,0); +INSERT INTO "OrderDetails" VALUES(10578,57,19.5,6,0); +INSERT INTO "OrderDetails" VALUES(10579,15,15.5,10,0); +INSERT INTO "OrderDetails" VALUES(10579,75,7.75,21,0); +INSERT INTO "OrderDetails" VALUES(10580,14,23.25,15,0.05); + +INSERT INTO "OrderDetails" VALUES(10580,41,9.65,9,0.05); +INSERT INTO "OrderDetails" VALUES(10580,65,21.05,30,0.05); +INSERT INTO "OrderDetails" VALUES(10581,75,7.75,50,0.2); +INSERT INTO "OrderDetails" VALUES(10582,57,19.5,4,0); +INSERT INTO "OrderDetails" VALUES(10582,76,18,14,0); +INSERT INTO "OrderDetails" VALUES(10583,29,123.79,10,0); +INSERT INTO "OrderDetails" VALUES(10583,60,34,24,0.15); +INSERT INTO "OrderDetails" VALUES(10583,69,36,10,0.15); +INSERT INTO "OrderDetails" VALUES(10584,31,12.5,50,0.05); +INSERT INTO "OrderDetails" VALUES(10585,47,9.5,15,0); + +INSERT INTO "OrderDetails" VALUES(10586,52,7,4,0.15); +INSERT INTO "OrderDetails" VALUES(10587,26,31.23,6,0); +INSERT INTO "OrderDetails" VALUES(10587,35,18,20,0); +INSERT INTO "OrderDetails" VALUES(10587,77,13,20,0); +INSERT INTO "OrderDetails" VALUES(10588,18,62.5,40,0.2); +INSERT INTO "OrderDetails" VALUES(10588,42,14,100,0.2); +INSERT INTO "OrderDetails" VALUES(10589,35,18,4,0); +INSERT INTO "OrderDetails" VALUES(10590,1,18,20,0); +INSERT INTO "OrderDetails" VALUES(10590,77,13,60,0.05); +INSERT INTO "OrderDetails" VALUES(10591,3,10,14,0); + +INSERT INTO "OrderDetails" VALUES(10591,7,30,10,0); +INSERT INTO "OrderDetails" VALUES(10591,54,7.45,50,0); +INSERT INTO "OrderDetails" VALUES(10592,15,15.5,25,0.05); +INSERT INTO "OrderDetails" VALUES(10592,26,31.23,5,0.05); +INSERT INTO "OrderDetails" VALUES(10593,20,81,21,0.2); +INSERT INTO "OrderDetails" VALUES(10593,69,36,20,0.2); +INSERT INTO "OrderDetails" VALUES(10593,76,18,4,0.2); +INSERT INTO "OrderDetails" VALUES(10594,52,7,24,0); +INSERT INTO "OrderDetails" VALUES(10594,58,13.25,30,0); +INSERT INTO "OrderDetails" VALUES(10595,35,18,30,0.25); + +INSERT INTO "OrderDetails" VALUES(10595,61,28.5,120,0.25); +INSERT INTO "OrderDetails" VALUES(10595,69,36,65,0.25); +INSERT INTO "OrderDetails" VALUES(10596,56,38,5,0.2); +INSERT INTO "OrderDetails" VALUES(10596,63,43.9,24,0.2); +INSERT INTO "OrderDetails" VALUES(10596,75,7.75,30,0.2); +INSERT INTO "OrderDetails" VALUES(10597,24,4.5,35,0.2); +INSERT INTO "OrderDetails" VALUES(10597,57,19.5,20,0); +INSERT INTO "OrderDetails" VALUES(10597,65,21.05,12,0.2); +INSERT INTO "OrderDetails" VALUES(10598,27,43.9,50,0); +INSERT INTO "OrderDetails" VALUES(10598,71,21.5,9,0); + +INSERT INTO "OrderDetails" VALUES(10599,62,49.3,10,0); +INSERT INTO "OrderDetails" VALUES(10600,54,7.45,4,0); +INSERT INTO "OrderDetails" VALUES(10600,73,15,30,0); +INSERT INTO "OrderDetails" VALUES(10601,13,6,60,0); +INSERT INTO "OrderDetails" VALUES(10601,59,55,35,0); +INSERT INTO "OrderDetails" VALUES(10602,77,13,5,0.25); +INSERT INTO "OrderDetails" VALUES(10603,22,21,48,0); +INSERT INTO "OrderDetails" VALUES(10603,49,20,25,0.05); +INSERT INTO "OrderDetails" VALUES(10604,48,12.75,6,0.1); +INSERT INTO "OrderDetails" VALUES(10604,76,18,10,0.1); + +INSERT INTO "OrderDetails" VALUES(10605,16,17.45,30,0.05); +INSERT INTO "OrderDetails" VALUES(10605,59,55,20,0.05); +INSERT INTO "OrderDetails" VALUES(10605,60,34,70,0.05); +INSERT INTO "OrderDetails" VALUES(10605,71,21.5,15,0.05); +INSERT INTO "OrderDetails" VALUES(10606,4,22,20,0.2); +INSERT INTO "OrderDetails" VALUES(10606,55,24,20,0.2); +INSERT INTO "OrderDetails" VALUES(10606,62,49.3,10,0.2); +INSERT INTO "OrderDetails" VALUES(10607,7,30,45,0); +INSERT INTO "OrderDetails" VALUES(10607,17,39,100,0); +INSERT INTO "OrderDetails" VALUES(10607,33,2.5,14,0); + +INSERT INTO "OrderDetails" VALUES(10607,40,18.4,42,0); +INSERT INTO "OrderDetails" VALUES(10607,72,34.8,12,0); +INSERT INTO "OrderDetails" VALUES(10608,56,38,28,0); +INSERT INTO "OrderDetails" VALUES(10609,1,18,3,0); +INSERT INTO "OrderDetails" VALUES(10609,10,31,10,0); +INSERT INTO "OrderDetails" VALUES(10609,21,10,6,0); +INSERT INTO "OrderDetails" VALUES(10610,36,19,21,0.25); +INSERT INTO "OrderDetails" VALUES(10611,1,18,6,0); +INSERT INTO "OrderDetails" VALUES(10611,2,19,10,0); +INSERT INTO "OrderDetails" VALUES(10611,60,34,15,0); + +INSERT INTO "OrderDetails" VALUES(10612,10,31,70,0); +INSERT INTO "OrderDetails" VALUES(10612,36,19,55,0); +INSERT INTO "OrderDetails" VALUES(10612,49,20,18,0); +INSERT INTO "OrderDetails" VALUES(10612,60,34,40,0); +INSERT INTO "OrderDetails" VALUES(10612,76,18,80,0); +INSERT INTO "OrderDetails" VALUES(10613,13,6,8,0.1); +INSERT INTO "OrderDetails" VALUES(10613,75,7.75,40,0); +INSERT INTO "OrderDetails" VALUES(10614,11,21,14,0); +INSERT INTO "OrderDetails" VALUES(10614,21,10,8,0); +INSERT INTO "OrderDetails" VALUES(10614,39,18,5,0); + +INSERT INTO "OrderDetails" VALUES(10615,55,24,5,0); +INSERT INTO "OrderDetails" VALUES(10616,38,263.5,15,0.05); +INSERT INTO "OrderDetails" VALUES(10616,56,38,14,0); +INSERT INTO "OrderDetails" VALUES(10616,70,15,15,0.05); +INSERT INTO "OrderDetails" VALUES(10616,71,21.5,15,0.05); +INSERT INTO "OrderDetails" VALUES(10617,59,55,30,0.15); +INSERT INTO "OrderDetails" VALUES(10618,6,25,70,0); +INSERT INTO "OrderDetails" VALUES(10618,56,38,20,0); +INSERT INTO "OrderDetails" VALUES(10618,68,12.5,15,0); +INSERT INTO "OrderDetails" VALUES(10619,21,10,42,0); + +INSERT INTO "OrderDetails" VALUES(10619,22,21,40,0); +INSERT INTO "OrderDetails" VALUES(10620,24,4.5,5,0); +INSERT INTO "OrderDetails" VALUES(10620,52,7,5,0); +INSERT INTO "OrderDetails" VALUES(10621,19,9.2,5,0); +INSERT INTO "OrderDetails" VALUES(10621,23,9,10,0); +INSERT INTO "OrderDetails" VALUES(10621,70,15,20,0); +INSERT INTO "OrderDetails" VALUES(10621,71,21.5,15,0); +INSERT INTO "OrderDetails" VALUES(10622,2,19,20,0); +INSERT INTO "OrderDetails" VALUES(10622,68,12.5,18,0.2); +INSERT INTO "OrderDetails" VALUES(10623,14,23.25,21,0); + +INSERT INTO "OrderDetails" VALUES(10623,19,9.2,15,0.1); +INSERT INTO "OrderDetails" VALUES(10623,21,10,25,0.1); +INSERT INTO "OrderDetails" VALUES(10623,24,4.5,3,0); +INSERT INTO "OrderDetails" VALUES(10623,35,18,30,0.1); +INSERT INTO "OrderDetails" VALUES(10624,28,45.6,10,0); +INSERT INTO "OrderDetails" VALUES(10624,29,123.79,6,0); +INSERT INTO "OrderDetails" VALUES(10624,44,19.45,10,0); +INSERT INTO "OrderDetails" VALUES(10625,14,23.25,3,0); +INSERT INTO "OrderDetails" VALUES(10625,42,14,5,0); +INSERT INTO "OrderDetails" VALUES(10625,60,34,10,0); + +INSERT INTO "OrderDetails" VALUES(10626,53,32.8,12,0); +INSERT INTO "OrderDetails" VALUES(10626,60,34,20,0); +INSERT INTO "OrderDetails" VALUES(10626,71,21.5,20,0); +INSERT INTO "OrderDetails" VALUES(10627,62,49.3,15,0); +INSERT INTO "OrderDetails" VALUES(10627,73,15,35,0.15); +INSERT INTO "OrderDetails" VALUES(10628,1,18,25,0); +INSERT INTO "OrderDetails" VALUES(10629,29,123.79,20,0); +INSERT INTO "OrderDetails" VALUES(10629,64,33.25,9,0); +INSERT INTO "OrderDetails" VALUES(10630,55,24,12,0.05); +INSERT INTO "OrderDetails" VALUES(10630,76,18,35,0); + +INSERT INTO "OrderDetails" VALUES(10631,75,7.75,8,0.1); +INSERT INTO "OrderDetails" VALUES(10632,2,19,30,0.05); +INSERT INTO "OrderDetails" VALUES(10632,33,2.5,20,0.05); +INSERT INTO "OrderDetails" VALUES(10633,12,38,36,0.15); +INSERT INTO "OrderDetails" VALUES(10633,13,6,13,0.15); +INSERT INTO "OrderDetails" VALUES(10633,26,31.23,35,0.15); +INSERT INTO "OrderDetails" VALUES(10633,62,49.3,80,0.15); +INSERT INTO "OrderDetails" VALUES(10634,7,30,35,0); +INSERT INTO "OrderDetails" VALUES(10634,18,62.5,50,0); +INSERT INTO "OrderDetails" VALUES(10634,51,53,15,0); + +INSERT INTO "OrderDetails" VALUES(10634,75,7.75,2,0); +INSERT INTO "OrderDetails" VALUES(10635,4,22,10,0.1); +INSERT INTO "OrderDetails" VALUES(10635,5,21.35,15,0.1); +INSERT INTO "OrderDetails" VALUES(10635,22,21,40,0); +INSERT INTO "OrderDetails" VALUES(10636,4,22,25,0); +INSERT INTO "OrderDetails" VALUES(10636,58,13.25,6,0); +INSERT INTO "OrderDetails" VALUES(10637,11,21,10,0); +INSERT INTO "OrderDetails" VALUES(10637,50,16.25,25,0.05); +INSERT INTO "OrderDetails" VALUES(10637,56,38,60,0.05); +INSERT INTO "OrderDetails" VALUES(10638,45,9.5,20,0); + +INSERT INTO "OrderDetails" VALUES(10638,65,21.05,21,0); +INSERT INTO "OrderDetails" VALUES(10638,72,34.8,60,0); +INSERT INTO "OrderDetails" VALUES(10639,18,62.5,8,0); +INSERT INTO "OrderDetails" VALUES(10640,69,36,20,0.25); +INSERT INTO "OrderDetails" VALUES(10640,70,15,15,0.25); +INSERT INTO "OrderDetails" VALUES(10641,2,19,50,0); +INSERT INTO "OrderDetails" VALUES(10641,40,18.4,60,0); +INSERT INTO "OrderDetails" VALUES(10642,21,10,30,0.2); +INSERT INTO "OrderDetails" VALUES(10642,61,28.5,20,0.2); +INSERT INTO "OrderDetails" VALUES(10643,28,45.6,15,0.25); + +INSERT INTO "OrderDetails" VALUES(10643,39,18,21,0.25); +INSERT INTO "OrderDetails" VALUES(10643,46,12,2,0.25); +INSERT INTO "OrderDetails" VALUES(10644,18,62.5,4,0.1); +INSERT INTO "OrderDetails" VALUES(10644,43,46,20,0); +INSERT INTO "OrderDetails" VALUES(10644,46,12,21,0.1); +INSERT INTO "OrderDetails" VALUES(10645,18,62.5,20,0); +INSERT INTO "OrderDetails" VALUES(10645,36,19,15,0); +INSERT INTO "OrderDetails" VALUES(10646,1,18,15,0.25); +INSERT INTO "OrderDetails" VALUES(10646,10,31,18,0.25); +INSERT INTO "OrderDetails" VALUES(10646,71,21.5,30,0.25); + +INSERT INTO "OrderDetails" VALUES(10646,77,13,35,0.25); +INSERT INTO "OrderDetails" VALUES(10647,19,9.2,30,0); +INSERT INTO "OrderDetails" VALUES(10647,39,18,20,0); +INSERT INTO "OrderDetails" VALUES(10648,22,21,15,0); +INSERT INTO "OrderDetails" VALUES(10648,24,4.5,15,0.15); +INSERT INTO "OrderDetails" VALUES(10649,28,45.6,20,0); +INSERT INTO "OrderDetails" VALUES(10649,72,34.8,15,0); +INSERT INTO "OrderDetails" VALUES(10650,30,25.89,30,0); +INSERT INTO "OrderDetails" VALUES(10650,53,32.8,25,0.05); +INSERT INTO "OrderDetails" VALUES(10650,54,7.45,30,0); + +INSERT INTO "OrderDetails" VALUES(10651,19,9.2,12,0.25); +INSERT INTO "OrderDetails" VALUES(10651,22,21,20,0.25); +INSERT INTO "OrderDetails" VALUES(10652,30,25.89,2,0.25); +INSERT INTO "OrderDetails" VALUES(10652,42,14,20,0); +INSERT INTO "OrderDetails" VALUES(10653,16,17.45,30,0.1); +INSERT INTO "OrderDetails" VALUES(10653,60,34,20,0.1); +INSERT INTO "OrderDetails" VALUES(10654,4,22,12,0.1); +INSERT INTO "OrderDetails" VALUES(10654,39,18,20,0.1); +INSERT INTO "OrderDetails" VALUES(10654,54,7.45,6,0.1); +INSERT INTO "OrderDetails" VALUES(10655,41,9.65,20,0.2); + +INSERT INTO "OrderDetails" VALUES(10656,14,23.25,3,0.1); +INSERT INTO "OrderDetails" VALUES(10656,44,19.45,28,0.1); +INSERT INTO "OrderDetails" VALUES(10656,47,9.5,6,0.1); +INSERT INTO "OrderDetails" VALUES(10657,15,15.5,50,0); +INSERT INTO "OrderDetails" VALUES(10657,41,9.65,24,0); +INSERT INTO "OrderDetails" VALUES(10657,46,12,45,0); +INSERT INTO "OrderDetails" VALUES(10657,47,9.5,10,0); +INSERT INTO "OrderDetails" VALUES(10657,56,38,45,0); +INSERT INTO "OrderDetails" VALUES(10657,60,34,30,0); +INSERT INTO "OrderDetails" VALUES(10658,21,10,60,0); + +INSERT INTO "OrderDetails" VALUES(10658,40,18.4,70,0.05); +INSERT INTO "OrderDetails" VALUES(10658,60,34,55,0.05); +INSERT INTO "OrderDetails" VALUES(10658,77,13,70,0.05); +INSERT INTO "OrderDetails" VALUES(10659,31,12.5,20,0.05); +INSERT INTO "OrderDetails" VALUES(10659,40,18.4,24,0.05); +INSERT INTO "OrderDetails" VALUES(10659,70,15,40,0.05); +INSERT INTO "OrderDetails" VALUES(10660,20,81,21,0); +INSERT INTO "OrderDetails" VALUES(10661,39,18,3,0.2); +INSERT INTO "OrderDetails" VALUES(10661,58,13.25,49,0.2); +INSERT INTO "OrderDetails" VALUES(10662,68,12.5,10,0); + +INSERT INTO "OrderDetails" VALUES(10663,40,18.4,30,0.05); +INSERT INTO "OrderDetails" VALUES(10663,42,14,30,0.05); +INSERT INTO "OrderDetails" VALUES(10663,51,53,20,0.05); +INSERT INTO "OrderDetails" VALUES(10664,10,31,24,0.15); +INSERT INTO "OrderDetails" VALUES(10664,56,38,12,0.15); +INSERT INTO "OrderDetails" VALUES(10664,65,21.05,15,0.15); +INSERT INTO "OrderDetails" VALUES(10665,51,53,20,0); +INSERT INTO "OrderDetails" VALUES(10665,59,55,1,0); +INSERT INTO "OrderDetails" VALUES(10665,76,18,10,0); +INSERT INTO "OrderDetails" VALUES(10666,29,123.79,36,0); + +INSERT INTO "OrderDetails" VALUES(10666,65,21.05,10,0); +INSERT INTO "OrderDetails" VALUES(10667,69,36,45,0.2); +INSERT INTO "OrderDetails" VALUES(10667,71,21.5,14,0.2); +INSERT INTO "OrderDetails" VALUES(10668,31,12.5,8,0.1); +INSERT INTO "OrderDetails" VALUES(10668,55,24,4,0.1); +INSERT INTO "OrderDetails" VALUES(10668,64,33.25,15,0.1); +INSERT INTO "OrderDetails" VALUES(10669,36,19,30,0); +INSERT INTO "OrderDetails" VALUES(10670,23,9,32,0); +INSERT INTO "OrderDetails" VALUES(10670,46,12,60,0); +INSERT INTO "OrderDetails" VALUES(10670,67,14,25,0); + +INSERT INTO "OrderDetails" VALUES(10670,73,15,50,0); +INSERT INTO "OrderDetails" VALUES(10670,75,7.75,25,0); +INSERT INTO "OrderDetails" VALUES(10671,16,17.45,10,0); +INSERT INTO "OrderDetails" VALUES(10671,62,49.3,10,0); +INSERT INTO "OrderDetails" VALUES(10671,65,21.05,12,0); +INSERT INTO "OrderDetails" VALUES(10672,38,263.5,15,0.1); +INSERT INTO "OrderDetails" VALUES(10672,71,21.5,12,0); +INSERT INTO "OrderDetails" VALUES(10673,16,17.45,3,0); +INSERT INTO "OrderDetails" VALUES(10673,42,14,6,0); +INSERT INTO "OrderDetails" VALUES(10673,43,46,6,0); + +INSERT INTO "OrderDetails" VALUES(10674,23,9,5,0); +INSERT INTO "OrderDetails" VALUES(10675,14,23.25,30,0); +INSERT INTO "OrderDetails" VALUES(10675,53,32.8,10,0); +INSERT INTO "OrderDetails" VALUES(10675,58,13.25,30,0); +INSERT INTO "OrderDetails" VALUES(10676,10,31,2,0); +INSERT INTO "OrderDetails" VALUES(10676,19,9.2,7,0); +INSERT INTO "OrderDetails" VALUES(10676,44,19.45,21,0); +INSERT INTO "OrderDetails" VALUES(10677,26,31.23,30,0.15); +INSERT INTO "OrderDetails" VALUES(10677,33,2.5,8,0.15); +INSERT INTO "OrderDetails" VALUES(10678,12,38,100,0); + +INSERT INTO "OrderDetails" VALUES(10678,33,2.5,30,0); +INSERT INTO "OrderDetails" VALUES(10678,41,9.65,120,0); +INSERT INTO "OrderDetails" VALUES(10678,54,7.45,30,0); +INSERT INTO "OrderDetails" VALUES(10679,59,55,12,0); +INSERT INTO "OrderDetails" VALUES(10680,16,17.45,50,0.25); +INSERT INTO "OrderDetails" VALUES(10680,31,12.5,20,0.25); +INSERT INTO "OrderDetails" VALUES(10680,42,14,40,0.25); +INSERT INTO "OrderDetails" VALUES(10681,19,9.2,30,0.1); +INSERT INTO "OrderDetails" VALUES(10681,21,10,12,0.1); +INSERT INTO "OrderDetails" VALUES(10681,64,33.25,28,0); + +INSERT INTO "OrderDetails" VALUES(10682,33,2.5,30,0); +INSERT INTO "OrderDetails" VALUES(10682,66,17,4,0); +INSERT INTO "OrderDetails" VALUES(10682,75,7.75,30,0); +INSERT INTO "OrderDetails" VALUES(10683,52,7,9,0); +INSERT INTO "OrderDetails" VALUES(10684,40,18.4,20,0); +INSERT INTO "OrderDetails" VALUES(10684,47,9.5,40,0); +INSERT INTO "OrderDetails" VALUES(10684,60,34,30,0); +INSERT INTO "OrderDetails" VALUES(10685,10,31,20,0); +INSERT INTO "OrderDetails" VALUES(10685,41,9.65,4,0); +INSERT INTO "OrderDetails" VALUES(10685,47,9.5,15,0); + +INSERT INTO "OrderDetails" VALUES(10686,17,39,30,0.2); +INSERT INTO "OrderDetails" VALUES(10686,26,31.23,15,0); +INSERT INTO "OrderDetails" VALUES(10687,9,97,50,0.25); +INSERT INTO "OrderDetails" VALUES(10687,29,123.79,10,0); +INSERT INTO "OrderDetails" VALUES(10687,36,19,6,0.25); +INSERT INTO "OrderDetails" VALUES(10688,10,31,18,0.1); +INSERT INTO "OrderDetails" VALUES(10688,28,45.6,60,0.1); +INSERT INTO "OrderDetails" VALUES(10688,34,14,14,0); +INSERT INTO "OrderDetails" VALUES(10689,1,18,35,0.25); +INSERT INTO "OrderDetails" VALUES(10690,56,38,20,0.25); + +INSERT INTO "OrderDetails" VALUES(10690,77,13,30,0.25); +INSERT INTO "OrderDetails" VALUES(10691,1,18,30,0); +INSERT INTO "OrderDetails" VALUES(10691,29,123.79,40,0); +INSERT INTO "OrderDetails" VALUES(10691,43,46,40,0); +INSERT INTO "OrderDetails" VALUES(10691,44,19.45,24,0); +INSERT INTO "OrderDetails" VALUES(10691,62,49.3,48,0); +INSERT INTO "OrderDetails" VALUES(10692,63,43.9,20,0); +INSERT INTO "OrderDetails" VALUES(10693,9,97,6,0); +INSERT INTO "OrderDetails" VALUES(10693,54,7.45,60,0.15); +INSERT INTO "OrderDetails" VALUES(10693,69,36,30,0.15); + +INSERT INTO "OrderDetails" VALUES(10693,73,15,15,0.15); +INSERT INTO "OrderDetails" VALUES(10694,7,30,90,0); +INSERT INTO "OrderDetails" VALUES(10694,59,55,25,0); +INSERT INTO "OrderDetails" VALUES(10694,70,15,50,0); +INSERT INTO "OrderDetails" VALUES(10695,8,40,10,0); +INSERT INTO "OrderDetails" VALUES(10695,12,38,4,0); +INSERT INTO "OrderDetails" VALUES(10695,24,4.5,20,0); +INSERT INTO "OrderDetails" VALUES(10696,17,39,20,0); +INSERT INTO "OrderDetails" VALUES(10696,46,12,18,0); +INSERT INTO "OrderDetails" VALUES(10697,19,9.2,7,0.25); + +INSERT INTO "OrderDetails" VALUES(10697,35,18,9,0.25); +INSERT INTO "OrderDetails" VALUES(10697,58,13.25,30,0.25); +INSERT INTO "OrderDetails" VALUES(10697,70,15,30,0.25); +INSERT INTO "OrderDetails" VALUES(10698,11,21,15,0); +INSERT INTO "OrderDetails" VALUES(10698,17,39,8,0.05); +INSERT INTO "OrderDetails" VALUES(10698,29,123.79,12,0.05); +INSERT INTO "OrderDetails" VALUES(10698,65,21.05,65,0.05); +INSERT INTO "OrderDetails" VALUES(10698,70,15,8,0.05); +INSERT INTO "OrderDetails" VALUES(10699,47,9.5,12,0); +INSERT INTO "OrderDetails" VALUES(10700,1,18,5,0.2); + +INSERT INTO "OrderDetails" VALUES(10700,34,14,12,0.2); +INSERT INTO "OrderDetails" VALUES(10700,68,12.5,40,0.2); +INSERT INTO "OrderDetails" VALUES(10700,71,21.5,60,0.2); +INSERT INTO "OrderDetails" VALUES(10701,59,55,42,0.15); +INSERT INTO "OrderDetails" VALUES(10701,71,21.5,20,0.15); +INSERT INTO "OrderDetails" VALUES(10701,76,18,35,0.15); +INSERT INTO "OrderDetails" VALUES(10702,3,10,6,0); +INSERT INTO "OrderDetails" VALUES(10702,76,18,15,0); +INSERT INTO "OrderDetails" VALUES(10703,2,19,5,0); +INSERT INTO "OrderDetails" VALUES(10703,59,55,35,0); + +INSERT INTO "OrderDetails" VALUES(10703,73,15,35,0); +INSERT INTO "OrderDetails" VALUES(10704,4,22,6,0); +INSERT INTO "OrderDetails" VALUES(10704,24,4.5,35,0); +INSERT INTO "OrderDetails" VALUES(10704,48,12.75,24,0); +INSERT INTO "OrderDetails" VALUES(10705,31,12.5,20,0); +INSERT INTO "OrderDetails" VALUES(10705,32,32,4,0); +INSERT INTO "OrderDetails" VALUES(10706,16,17.45,20,0); +INSERT INTO "OrderDetails" VALUES(10706,43,46,24,0); +INSERT INTO "OrderDetails" VALUES(10706,59,55,8,0); +INSERT INTO "OrderDetails" VALUES(10707,55,24,21,0); + +INSERT INTO "OrderDetails" VALUES(10707,57,19.5,40,0); +INSERT INTO "OrderDetails" VALUES(10707,70,15,28,0.15); +INSERT INTO "OrderDetails" VALUES(10708,5,21.35,4,0); +INSERT INTO "OrderDetails" VALUES(10708,36,19,5,0); +INSERT INTO "OrderDetails" VALUES(10709,8,40,40,0); +INSERT INTO "OrderDetails" VALUES(10709,51,53,28,0); +INSERT INTO "OrderDetails" VALUES(10709,60,34,10,0); +INSERT INTO "OrderDetails" VALUES(10710,19,9.2,5,0); +INSERT INTO "OrderDetails" VALUES(10710,47,9.5,5,0); +INSERT INTO "OrderDetails" VALUES(10711,19,9.2,12,0); + +INSERT INTO "OrderDetails" VALUES(10711,41,9.65,42,0); +INSERT INTO "OrderDetails" VALUES(10711,53,32.8,120,0); +INSERT INTO "OrderDetails" VALUES(10712,53,32.8,3,0.05); +INSERT INTO "OrderDetails" VALUES(10712,56,38,30,0); +INSERT INTO "OrderDetails" VALUES(10713,10,31,18,0); +INSERT INTO "OrderDetails" VALUES(10713,26,31.23,30,0); +INSERT INTO "OrderDetails" VALUES(10713,45,9.5,110,0); +INSERT INTO "OrderDetails" VALUES(10713,46,12,24,0); +INSERT INTO "OrderDetails" VALUES(10714,2,19,30,0.25); +INSERT INTO "OrderDetails" VALUES(10714,17,39,27,0.25); + +INSERT INTO "OrderDetails" VALUES(10714,47,9.5,50,0.25); +INSERT INTO "OrderDetails" VALUES(10714,56,38,18,0.25); +INSERT INTO "OrderDetails" VALUES(10714,58,13.25,12,0.25); +INSERT INTO "OrderDetails" VALUES(10715,10,31,21,0); +INSERT INTO "OrderDetails" VALUES(10715,71,21.5,30,0); +INSERT INTO "OrderDetails" VALUES(10716,21,10,5,0); +INSERT INTO "OrderDetails" VALUES(10716,51,53,7,0); +INSERT INTO "OrderDetails" VALUES(10716,61,28.5,10,0); +INSERT INTO "OrderDetails" VALUES(10717,21,10,32,0.05); +INSERT INTO "OrderDetails" VALUES(10717,54,7.45,15,0); + +INSERT INTO "OrderDetails" VALUES(10717,69,36,25,0.05); +INSERT INTO "OrderDetails" VALUES(10718,12,38,36,0); +INSERT INTO "OrderDetails" VALUES(10718,16,17.45,20,0); +INSERT INTO "OrderDetails" VALUES(10718,36,19,40,0); +INSERT INTO "OrderDetails" VALUES(10718,62,49.3,20,0); +INSERT INTO "OrderDetails" VALUES(10719,18,62.5,12,0.25); +INSERT INTO "OrderDetails" VALUES(10719,30,25.89,3,0.25); +INSERT INTO "OrderDetails" VALUES(10719,54,7.45,40,0.25); +INSERT INTO "OrderDetails" VALUES(10720,35,18,21,0); +INSERT INTO "OrderDetails" VALUES(10720,71,21.5,8,0); + +INSERT INTO "OrderDetails" VALUES(10721,44,19.45,50,0.05); +INSERT INTO "OrderDetails" VALUES(10722,2,19,3,0); +INSERT INTO "OrderDetails" VALUES(10722,31,12.5,50,0); +INSERT INTO "OrderDetails" VALUES(10722,68,12.5,45,0); +INSERT INTO "OrderDetails" VALUES(10722,75,7.75,42,0); +INSERT INTO "OrderDetails" VALUES(10723,26,31.23,15,0); +INSERT INTO "OrderDetails" VALUES(10724,10,31,16,0); +INSERT INTO "OrderDetails" VALUES(10724,61,28.5,5,0); +INSERT INTO "OrderDetails" VALUES(10725,41,9.65,12,0); +INSERT INTO "OrderDetails" VALUES(10725,52,7,4,0); + +INSERT INTO "OrderDetails" VALUES(10725,55,24,6,0); +INSERT INTO "OrderDetails" VALUES(10726,4,22,25,0); +INSERT INTO "OrderDetails" VALUES(10726,11,21,5,0); +INSERT INTO "OrderDetails" VALUES(10727,17,39,20,0.05); +INSERT INTO "OrderDetails" VALUES(10727,56,38,10,0.05); +INSERT INTO "OrderDetails" VALUES(10727,59,55,10,0.05); +INSERT INTO "OrderDetails" VALUES(10728,30,25.89,15,0); +INSERT INTO "OrderDetails" VALUES(10728,40,18.4,6,0); +INSERT INTO "OrderDetails" VALUES(10728,55,24,12,0); +INSERT INTO "OrderDetails" VALUES(10728,60,34,15,0); + +INSERT INTO "OrderDetails" VALUES(10729,1,18,50,0); +INSERT INTO "OrderDetails" VALUES(10729,21,10,30,0); +INSERT INTO "OrderDetails" VALUES(10729,50,16.25,40,0); +INSERT INTO "OrderDetails" VALUES(10730,16,17.45,15,0.05); +INSERT INTO "OrderDetails" VALUES(10730,31,12.5,3,0.05); +INSERT INTO "OrderDetails" VALUES(10730,65,21.05,10,0.05); +INSERT INTO "OrderDetails" VALUES(10731,21,10,40,0.05); +INSERT INTO "OrderDetails" VALUES(10731,51,53,30,0.05); +INSERT INTO "OrderDetails" VALUES(10732,76,18,20,0); +INSERT INTO "OrderDetails" VALUES(10733,14,23.25,16,0); + +INSERT INTO "OrderDetails" VALUES(10733,28,45.6,20,0); +INSERT INTO "OrderDetails" VALUES(10733,52,7,25,0); +INSERT INTO "OrderDetails" VALUES(10734,6,25,30,0); +INSERT INTO "OrderDetails" VALUES(10734,30,25.89,15,0); +INSERT INTO "OrderDetails" VALUES(10734,76,18,20,0); +INSERT INTO "OrderDetails" VALUES(10735,61,28.5,20,0.1); +INSERT INTO "OrderDetails" VALUES(10735,77,13,2,0.1); +INSERT INTO "OrderDetails" VALUES(10736,65,21.05,40,0); +INSERT INTO "OrderDetails" VALUES(10736,75,7.75,20,0); +INSERT INTO "OrderDetails" VALUES(10737,13,6,4,0); + +INSERT INTO "OrderDetails" VALUES(10737,41,9.65,12,0); +INSERT INTO "OrderDetails" VALUES(10738,16,17.45,3,0); +INSERT INTO "OrderDetails" VALUES(10739,36,19,6,0); +INSERT INTO "OrderDetails" VALUES(10739,52,7,18,0); +INSERT INTO "OrderDetails" VALUES(10740,28,45.6,5,0.2); +INSERT INTO "OrderDetails" VALUES(10740,35,18,35,0.2); +INSERT INTO "OrderDetails" VALUES(10740,45,9.5,40,0.2); +INSERT INTO "OrderDetails" VALUES(10740,56,38,14,0.2); +INSERT INTO "OrderDetails" VALUES(10741,2,19,15,0.2); +INSERT INTO "OrderDetails" VALUES(10742,3,10,20,0); + +INSERT INTO "OrderDetails" VALUES(10742,60,34,50,0); +INSERT INTO "OrderDetails" VALUES(10742,72,34.8,35,0); +INSERT INTO "OrderDetails" VALUES(10743,46,12,28,0.05); +INSERT INTO "OrderDetails" VALUES(10744,40,18.4,50,0.2); +INSERT INTO "OrderDetails" VALUES(10745,18,62.5,24,0); +INSERT INTO "OrderDetails" VALUES(10745,44,19.45,16,0); +INSERT INTO "OrderDetails" VALUES(10745,59,55,45,0); +INSERT INTO "OrderDetails" VALUES(10745,72,34.8,7,0); +INSERT INTO "OrderDetails" VALUES(10746,13,6,6,0); +INSERT INTO "OrderDetails" VALUES(10746,42,14,28,0); + +INSERT INTO "OrderDetails" VALUES(10746,62,49.3,9,0); +INSERT INTO "OrderDetails" VALUES(10746,69,36,40,0); +INSERT INTO "OrderDetails" VALUES(10747,31,12.5,8,0); +INSERT INTO "OrderDetails" VALUES(10747,41,9.65,35,0); +INSERT INTO "OrderDetails" VALUES(10747,63,43.9,9,0); +INSERT INTO "OrderDetails" VALUES(10747,69,36,30,0); +INSERT INTO "OrderDetails" VALUES(10748,23,9,44,0); +INSERT INTO "OrderDetails" VALUES(10748,40,18.4,40,0); +INSERT INTO "OrderDetails" VALUES(10748,56,38,28,0); +INSERT INTO "OrderDetails" VALUES(10749,56,38,15,0); + +INSERT INTO "OrderDetails" VALUES(10749,59,55,6,0); +INSERT INTO "OrderDetails" VALUES(10749,76,18,10,0); +INSERT INTO "OrderDetails" VALUES(10750,14,23.25,5,0.15); +INSERT INTO "OrderDetails" VALUES(10750,45,9.5,40,0.15); +INSERT INTO "OrderDetails" VALUES(10750,59,55,25,0.15); +INSERT INTO "OrderDetails" VALUES(10751,26,31.23,12,0.1); +INSERT INTO "OrderDetails" VALUES(10751,30,25.89,30,0); +INSERT INTO "OrderDetails" VALUES(10751,50,16.25,20,0.1); +INSERT INTO "OrderDetails" VALUES(10751,73,15,15,0); +INSERT INTO "OrderDetails" VALUES(10752,1,18,8,0); + +INSERT INTO "OrderDetails" VALUES(10752,69,36,3,0); +INSERT INTO "OrderDetails" VALUES(10753,45,9.5,4,0); +INSERT INTO "OrderDetails" VALUES(10753,74,10,5,0); +INSERT INTO "OrderDetails" VALUES(10754,40,18.4,3,0); +INSERT INTO "OrderDetails" VALUES(10755,47,9.5,30,0.25); +INSERT INTO "OrderDetails" VALUES(10755,56,38,30,0.25); +INSERT INTO "OrderDetails" VALUES(10755,57,19.5,14,0.25); +INSERT INTO "OrderDetails" VALUES(10755,69,36,25,0.25); +INSERT INTO "OrderDetails" VALUES(10756,18,62.5,21,0.2); +INSERT INTO "OrderDetails" VALUES(10756,36,19,20,0.2); + +INSERT INTO "OrderDetails" VALUES(10756,68,12.5,6,0.2); +INSERT INTO "OrderDetails" VALUES(10756,69,36,20,0.2); +INSERT INTO "OrderDetails" VALUES(10757,34,14,30,0); +INSERT INTO "OrderDetails" VALUES(10757,59,55,7,0); +INSERT INTO "OrderDetails" VALUES(10757,62,49.3,30,0); +INSERT INTO "OrderDetails" VALUES(10757,64,33.25,24,0); +INSERT INTO "OrderDetails" VALUES(10758,26,31.23,20,0); +INSERT INTO "OrderDetails" VALUES(10758,52,7,60,0); +INSERT INTO "OrderDetails" VALUES(10758,70,15,40,0); +INSERT INTO "OrderDetails" VALUES(10759,32,32,10,0); + +INSERT INTO "OrderDetails" VALUES(10760,25,14,12,0.25); +INSERT INTO "OrderDetails" VALUES(10760,27,43.9,40,0); +INSERT INTO "OrderDetails" VALUES(10760,43,46,30,0.25); +INSERT INTO "OrderDetails" VALUES(10761,25,14,35,0.25); +INSERT INTO "OrderDetails" VALUES(10761,75,7.75,18,0); +INSERT INTO "OrderDetails" VALUES(10762,39,18,16,0); +INSERT INTO "OrderDetails" VALUES(10762,47,9.5,30,0); +INSERT INTO "OrderDetails" VALUES(10762,51,53,28,0); +INSERT INTO "OrderDetails" VALUES(10762,56,38,60,0); +INSERT INTO "OrderDetails" VALUES(10763,21,10,40,0); + +INSERT INTO "OrderDetails" VALUES(10763,22,21,6,0); +INSERT INTO "OrderDetails" VALUES(10763,24,4.5,20,0); +INSERT INTO "OrderDetails" VALUES(10764,3,10,20,0.1); +INSERT INTO "OrderDetails" VALUES(10764,39,18,130,0.1); +INSERT INTO "OrderDetails" VALUES(10765,65,21.05,80,0.1); +INSERT INTO "OrderDetails" VALUES(10766,2,19,40,0); +INSERT INTO "OrderDetails" VALUES(10766,7,30,35,0); +INSERT INTO "OrderDetails" VALUES(10766,68,12.5,40,0); +INSERT INTO "OrderDetails" VALUES(10767,42,14,2,0); +INSERT INTO "OrderDetails" VALUES(10768,22,21,4,0); + +INSERT INTO "OrderDetails" VALUES(10768,31,12.5,50,0); +INSERT INTO "OrderDetails" VALUES(10768,60,34,15,0); +INSERT INTO "OrderDetails" VALUES(10768,71,21.5,12,0); +INSERT INTO "OrderDetails" VALUES(10769,41,9.65,30,0.05); +INSERT INTO "OrderDetails" VALUES(10769,52,7,15,0.05); +INSERT INTO "OrderDetails" VALUES(10769,61,28.5,20,0); +INSERT INTO "OrderDetails" VALUES(10769,62,49.3,15,0); +INSERT INTO "OrderDetails" VALUES(10770,11,21,15,0.25); +INSERT INTO "OrderDetails" VALUES(10771,71,21.5,16,0); +INSERT INTO "OrderDetails" VALUES(10772,29,123.79,18,0); + +INSERT INTO "OrderDetails" VALUES(10772,59,55,25,0); +INSERT INTO "OrderDetails" VALUES(10773,17,39,33,0); +INSERT INTO "OrderDetails" VALUES(10773,31,12.5,70,0.2); +INSERT INTO "OrderDetails" VALUES(10773,75,7.75,7,0.2); +INSERT INTO "OrderDetails" VALUES(10774,31,12.5,2,0.25); +INSERT INTO "OrderDetails" VALUES(10774,66,17,50,0); +INSERT INTO "OrderDetails" VALUES(10775,10,31,6,0); +INSERT INTO "OrderDetails" VALUES(10775,67,14,3,0); +INSERT INTO "OrderDetails" VALUES(10776,31,12.5,16,0.05); +INSERT INTO "OrderDetails" VALUES(10776,42,14,12,0.05); + +INSERT INTO "OrderDetails" VALUES(10776,45,9.5,27,0.05); +INSERT INTO "OrderDetails" VALUES(10776,51,53,120,0.05); +INSERT INTO "OrderDetails" VALUES(10777,42,14,20,0.2); +INSERT INTO "OrderDetails" VALUES(10778,41,9.65,10,0); +INSERT INTO "OrderDetails" VALUES(10779,16,17.45,20,0); +INSERT INTO "OrderDetails" VALUES(10779,62,49.3,20,0); +INSERT INTO "OrderDetails" VALUES(10780,70,15,35,0); +INSERT INTO "OrderDetails" VALUES(10780,77,13,15,0); +INSERT INTO "OrderDetails" VALUES(10781,54,7.45,3,0.2); +INSERT INTO "OrderDetails" VALUES(10781,56,38,20,0.2); + +INSERT INTO "OrderDetails" VALUES(10781,74,10,35,0); +INSERT INTO "OrderDetails" VALUES(10782,31,12.5,1,0); +INSERT INTO "OrderDetails" VALUES(10783,31,12.5,10,0); +INSERT INTO "OrderDetails" VALUES(10783,38,263.5,5,0); +INSERT INTO "OrderDetails" VALUES(10784,36,19,30,0); +INSERT INTO "OrderDetails" VALUES(10784,39,18,2,0.15); +INSERT INTO "OrderDetails" VALUES(10784,72,34.8,30,0.15); +INSERT INTO "OrderDetails" VALUES(10785,10,31,10,0); +INSERT INTO "OrderDetails" VALUES(10785,75,7.75,10,0); +INSERT INTO "OrderDetails" VALUES(10786,8,40,30,0.2); + +INSERT INTO "OrderDetails" VALUES(10786,30,25.89,15,0.2); +INSERT INTO "OrderDetails" VALUES(10786,75,7.75,42,0.2); +INSERT INTO "OrderDetails" VALUES(10787,2,19,15,0.05); +INSERT INTO "OrderDetails" VALUES(10787,29,123.79,20,0.05); +INSERT INTO "OrderDetails" VALUES(10788,19,9.2,50,0.05); +INSERT INTO "OrderDetails" VALUES(10788,75,7.75,40,0.05); +INSERT INTO "OrderDetails" VALUES(10789,18,62.5,30,0); +INSERT INTO "OrderDetails" VALUES(10789,35,18,15,0); +INSERT INTO "OrderDetails" VALUES(10789,63,43.9,30,0); +INSERT INTO "OrderDetails" VALUES(10789,68,12.5,18,0); + +INSERT INTO "OrderDetails" VALUES(10790,7,30,3,0.15); +INSERT INTO "OrderDetails" VALUES(10790,56,38,20,0.15); +INSERT INTO "OrderDetails" VALUES(10791,29,123.79,14,0.05); +INSERT INTO "OrderDetails" VALUES(10791,41,9.65,20,0.05); +INSERT INTO "OrderDetails" VALUES(10792,2,19,10,0); +INSERT INTO "OrderDetails" VALUES(10792,54,7.45,3,0); +INSERT INTO "OrderDetails" VALUES(10792,68,12.5,15,0); +INSERT INTO "OrderDetails" VALUES(10793,41,9.65,14,0); +INSERT INTO "OrderDetails" VALUES(10793,52,7,8,0); +INSERT INTO "OrderDetails" VALUES(10794,14,23.25,15,0.2); + +INSERT INTO "OrderDetails" VALUES(10794,54,7.45,6,0.2); +INSERT INTO "OrderDetails" VALUES(10795,16,17.45,65,0); +INSERT INTO "OrderDetails" VALUES(10795,17,39,35,0.25); +INSERT INTO "OrderDetails" VALUES(10796,26,31.23,21,0.2); +INSERT INTO "OrderDetails" VALUES(10796,44,19.45,10,0); +INSERT INTO "OrderDetails" VALUES(10796,64,33.25,35,0.2); +INSERT INTO "OrderDetails" VALUES(10796,69,36,24,0.2); +INSERT INTO "OrderDetails" VALUES(10797,11,21,20,0); +INSERT INTO "OrderDetails" VALUES(10798,62,49.3,2,0); +INSERT INTO "OrderDetails" VALUES(10798,72,34.8,10,0); + +INSERT INTO "OrderDetails" VALUES(10799,13,6,20,0.15); +INSERT INTO "OrderDetails" VALUES(10799,24,4.5,20,0.15); +INSERT INTO "OrderDetails" VALUES(10799,59,55,25,0); +INSERT INTO "OrderDetails" VALUES(10800,11,21,50,0.1); +INSERT INTO "OrderDetails" VALUES(10800,51,53,10,0.1); +INSERT INTO "OrderDetails" VALUES(10800,54,7.45,7,0.1); +INSERT INTO "OrderDetails" VALUES(10801,17,39,40,0.25); +INSERT INTO "OrderDetails" VALUES(10801,29,123.79,20,0.25); +INSERT INTO "OrderDetails" VALUES(10802,30,25.89,25,0.25); +INSERT INTO "OrderDetails" VALUES(10802,51,53,30,0.25); + +INSERT INTO "OrderDetails" VALUES(10802,55,24,60,0.25); +INSERT INTO "OrderDetails" VALUES(10802,62,49.3,5,0.25); +INSERT INTO "OrderDetails" VALUES(10803,19,9.2,24,0.05); +INSERT INTO "OrderDetails" VALUES(10803,25,14,15,0.05); +INSERT INTO "OrderDetails" VALUES(10803,59,55,15,0.05); +INSERT INTO "OrderDetails" VALUES(10804,10,31,36,0); +INSERT INTO "OrderDetails" VALUES(10804,28,45.6,24,0); +INSERT INTO "OrderDetails" VALUES(10804,49,20,4,0.15); +INSERT INTO "OrderDetails" VALUES(10805,34,14,10,0); +INSERT INTO "OrderDetails" VALUES(10805,38,263.5,10,0); + +INSERT INTO "OrderDetails" VALUES(10806,2,19,20,0.25); +INSERT INTO "OrderDetails" VALUES(10806,65,21.05,2,0); +INSERT INTO "OrderDetails" VALUES(10806,74,10,15,0.25); +INSERT INTO "OrderDetails" VALUES(10807,40,18.4,1,0); +INSERT INTO "OrderDetails" VALUES(10808,56,38,20,0.15); +INSERT INTO "OrderDetails" VALUES(10808,76,18,50,0.15); +INSERT INTO "OrderDetails" VALUES(10809,52,7,20,0); +INSERT INTO "OrderDetails" VALUES(10810,13,6,7,0); +INSERT INTO "OrderDetails" VALUES(10810,25,14,5,0); +INSERT INTO "OrderDetails" VALUES(10810,70,15,5,0); + +INSERT INTO "OrderDetails" VALUES(10811,19,9.2,15,0); +INSERT INTO "OrderDetails" VALUES(10811,23,9,18,0); +INSERT INTO "OrderDetails" VALUES(10811,40,18.4,30,0); +INSERT INTO "OrderDetails" VALUES(10812,31,12.5,16,0.1); +INSERT INTO "OrderDetails" VALUES(10812,72,34.8,40,0.1); +INSERT INTO "OrderDetails" VALUES(10812,77,13,20,0); +INSERT INTO "OrderDetails" VALUES(10813,2,19,12,0.2); +INSERT INTO "OrderDetails" VALUES(10813,46,12,35,0); +INSERT INTO "OrderDetails" VALUES(10814,41,9.65,20,0); +INSERT INTO "OrderDetails" VALUES(10814,43,46,20,0.15); + +INSERT INTO "OrderDetails" VALUES(10814,48,12.75,8,0.15); +INSERT INTO "OrderDetails" VALUES(10814,61,28.5,30,0.15); +INSERT INTO "OrderDetails" VALUES(10815,33,2.5,16,0); +INSERT INTO "OrderDetails" VALUES(10816,38,263.5,30,0.05); +INSERT INTO "OrderDetails" VALUES(10816,62,49.3,20,0.05); +INSERT INTO "OrderDetails" VALUES(10817,26,31.23,40,0.15); +INSERT INTO "OrderDetails" VALUES(10817,38,263.5,30,0); +INSERT INTO "OrderDetails" VALUES(10817,40,18.4,60,0.15); +INSERT INTO "OrderDetails" VALUES(10817,62,49.3,25,0.15); +INSERT INTO "OrderDetails" VALUES(10818,32,32,20,0); + +INSERT INTO "OrderDetails" VALUES(10818,41,9.65,20,0); +INSERT INTO "OrderDetails" VALUES(10819,43,46,7,0); +INSERT INTO "OrderDetails" VALUES(10819,75,7.75,20,0); +INSERT INTO "OrderDetails" VALUES(10820,56,38,30,0); +INSERT INTO "OrderDetails" VALUES(10821,35,18,20,0); +INSERT INTO "OrderDetails" VALUES(10821,51,53,6,0); +INSERT INTO "OrderDetails" VALUES(10822,62,49.3,3,0); +INSERT INTO "OrderDetails" VALUES(10822,70,15,6,0); +INSERT INTO "OrderDetails" VALUES(10823,11,21,20,0.1); +INSERT INTO "OrderDetails" VALUES(10823,57,19.5,15,0); + +INSERT INTO "OrderDetails" VALUES(10823,59,55,40,0.1); +INSERT INTO "OrderDetails" VALUES(10823,77,13,15,0.1); +INSERT INTO "OrderDetails" VALUES(10824,41,9.65,12,0); +INSERT INTO "OrderDetails" VALUES(10824,70,15,9,0); +INSERT INTO "OrderDetails" VALUES(10825,26,31.23,12,0); +INSERT INTO "OrderDetails" VALUES(10825,53,32.8,20,0); +INSERT INTO "OrderDetails" VALUES(10826,31,12.5,35,0); +INSERT INTO "OrderDetails" VALUES(10826,57,19.5,15,0); +INSERT INTO "OrderDetails" VALUES(10827,10,31,15,0); +INSERT INTO "OrderDetails" VALUES(10827,39,18,21,0); + +INSERT INTO "OrderDetails" VALUES(10828,20,81,5,0); +INSERT INTO "OrderDetails" VALUES(10828,38,263.5,2,0); +INSERT INTO "OrderDetails" VALUES(10829,2,19,10,0); +INSERT INTO "OrderDetails" VALUES(10829,8,40,20,0); +INSERT INTO "OrderDetails" VALUES(10829,13,6,10,0); +INSERT INTO "OrderDetails" VALUES(10829,60,34,21,0); +INSERT INTO "OrderDetails" VALUES(10830,6,25,6,0); +INSERT INTO "OrderDetails" VALUES(10830,39,18,28,0); +INSERT INTO "OrderDetails" VALUES(10830,60,34,30,0); +INSERT INTO "OrderDetails" VALUES(10830,68,12.5,24,0); + +INSERT INTO "OrderDetails" VALUES(10831,19,9.2,2,0); +INSERT INTO "OrderDetails" VALUES(10831,35,18,8,0); +INSERT INTO "OrderDetails" VALUES(10831,38,263.5,8,0); +INSERT INTO "OrderDetails" VALUES(10831,43,46,9,0); +INSERT INTO "OrderDetails" VALUES(10832,13,6,3,0.2); +INSERT INTO "OrderDetails" VALUES(10832,25,14,10,0.2); +INSERT INTO "OrderDetails" VALUES(10832,44,19.45,16,0.2); +INSERT INTO "OrderDetails" VALUES(10832,64,33.25,3,0); +INSERT INTO "OrderDetails" VALUES(10833,7,30,20,0.1); +INSERT INTO "OrderDetails" VALUES(10833,31,12.5,9,0.1); + +INSERT INTO "OrderDetails" VALUES(10833,53,32.8,9,0.1); +INSERT INTO "OrderDetails" VALUES(10834,29,123.79,8,0.05); +INSERT INTO "OrderDetails" VALUES(10834,30,25.89,20,0.05); +INSERT INTO "OrderDetails" VALUES(10835,59,55,15,0); +INSERT INTO "OrderDetails" VALUES(10835,77,13,2,0.2); +INSERT INTO "OrderDetails" VALUES(10836,22,21,52,0); +INSERT INTO "OrderDetails" VALUES(10836,35,18,6,0); +INSERT INTO "OrderDetails" VALUES(10836,57,19.5,24,0); +INSERT INTO "OrderDetails" VALUES(10836,60,34,60,0); +INSERT INTO "OrderDetails" VALUES(10836,64,33.25,30,0); + +INSERT INTO "OrderDetails" VALUES(10837,13,6,6,0); +INSERT INTO "OrderDetails" VALUES(10837,40,18.4,25,0); +INSERT INTO "OrderDetails" VALUES(10837,47,9.5,40,0.25); +INSERT INTO "OrderDetails" VALUES(10837,76,18,21,0.25); +INSERT INTO "OrderDetails" VALUES(10838,1,18,4,0.25); +INSERT INTO "OrderDetails" VALUES(10838,18,62.5,25,0.25); +INSERT INTO "OrderDetails" VALUES(10838,36,19,50,0.25); +INSERT INTO "OrderDetails" VALUES(10839,58,13.25,30,0.1); +INSERT INTO "OrderDetails" VALUES(10839,72,34.8,15,0.1); +INSERT INTO "OrderDetails" VALUES(10840,25,14,6,0.2); + +INSERT INTO "OrderDetails" VALUES(10840,39,18,10,0.2); +INSERT INTO "OrderDetails" VALUES(10841,10,31,16,0); +INSERT INTO "OrderDetails" VALUES(10841,56,38,30,0); +INSERT INTO "OrderDetails" VALUES(10841,59,55,50,0); +INSERT INTO "OrderDetails" VALUES(10841,77,13,15,0); +INSERT INTO "OrderDetails" VALUES(10842,11,21,15,0); +INSERT INTO "OrderDetails" VALUES(10842,43,46,5,0); +INSERT INTO "OrderDetails" VALUES(10842,68,12.5,20,0); +INSERT INTO "OrderDetails" VALUES(10842,70,15,12,0); +INSERT INTO "OrderDetails" VALUES(10843,51,53,4,0.25); + +INSERT INTO "OrderDetails" VALUES(10844,22,21,35,0); +INSERT INTO "OrderDetails" VALUES(10845,23,9,70,0.1); +INSERT INTO "OrderDetails" VALUES(10845,35,18,25,0.1); +INSERT INTO "OrderDetails" VALUES(10845,42,14,42,0.1); +INSERT INTO "OrderDetails" VALUES(10845,58,13.25,60,0.1); +INSERT INTO "OrderDetails" VALUES(10845,64,33.25,48,0); +INSERT INTO "OrderDetails" VALUES(10846,4,22,21,0); +INSERT INTO "OrderDetails" VALUES(10846,70,15,30,0); +INSERT INTO "OrderDetails" VALUES(10846,74,10,20,0); +INSERT INTO "OrderDetails" VALUES(10847,1,18,80,0.2); + +INSERT INTO "OrderDetails" VALUES(10847,19,9.2,12,0.2); +INSERT INTO "OrderDetails" VALUES(10847,37,26,60,0.2); +INSERT INTO "OrderDetails" VALUES(10847,45,9.5,36,0.2); +INSERT INTO "OrderDetails" VALUES(10847,60,34,45,0.2); +INSERT INTO "OrderDetails" VALUES(10847,71,21.5,55,0.2); +INSERT INTO "OrderDetails" VALUES(10848,5,21.35,30,0); +INSERT INTO "OrderDetails" VALUES(10848,9,97,3,0); +INSERT INTO "OrderDetails" VALUES(10849,3,10,49,0); +INSERT INTO "OrderDetails" VALUES(10849,26,31.23,18,0.15); +INSERT INTO "OrderDetails" VALUES(10850,25,14,20,0.15); + +INSERT INTO "OrderDetails" VALUES(10850,33,2.5,4,0.15); +INSERT INTO "OrderDetails" VALUES(10850,70,15,30,0.15); +INSERT INTO "OrderDetails" VALUES(10851,2,19,5,0.05); +INSERT INTO "OrderDetails" VALUES(10851,25,14,10,0.05); +INSERT INTO "OrderDetails" VALUES(10851,57,19.5,10,0.05); +INSERT INTO "OrderDetails" VALUES(10851,59,55,42,0.05); +INSERT INTO "OrderDetails" VALUES(10852,2,19,15,0); +INSERT INTO "OrderDetails" VALUES(10852,17,39,6,0); +INSERT INTO "OrderDetails" VALUES(10852,62,49.3,50,0); +INSERT INTO "OrderDetails" VALUES(10853,18,62.5,10,0); + +INSERT INTO "OrderDetails" VALUES(10854,10,31,100,0.15); +INSERT INTO "OrderDetails" VALUES(10854,13,6,65,0.15); +INSERT INTO "OrderDetails" VALUES(10855,16,17.45,50,0); +INSERT INTO "OrderDetails" VALUES(10855,31,12.5,14,0); +INSERT INTO "OrderDetails" VALUES(10855,56,38,24,0); +INSERT INTO "OrderDetails" VALUES(10855,65,21.05,15,0.15); +INSERT INTO "OrderDetails" VALUES(10856,2,19,20,0); +INSERT INTO "OrderDetails" VALUES(10856,42,14,20,0); +INSERT INTO "OrderDetails" VALUES(10857,3,10,30,0); +INSERT INTO "OrderDetails" VALUES(10857,26,31.23,35,0.25); + +INSERT INTO "OrderDetails" VALUES(10857,29,123.79,10,0.25); +INSERT INTO "OrderDetails" VALUES(10858,7,30,5,0); +INSERT INTO "OrderDetails" VALUES(10858,27,43.9,10,0); +INSERT INTO "OrderDetails" VALUES(10858,70,15,4,0); +INSERT INTO "OrderDetails" VALUES(10859,24,4.5,40,0.25); +INSERT INTO "OrderDetails" VALUES(10859,54,7.45,35,0.25); +INSERT INTO "OrderDetails" VALUES(10859,64,33.25,30,0.25); +INSERT INTO "OrderDetails" VALUES(10860,51,53,3,0); +INSERT INTO "OrderDetails" VALUES(10860,76,18,20,0); +INSERT INTO "OrderDetails" VALUES(10861,17,39,42,0); + +INSERT INTO "OrderDetails" VALUES(10861,18,62.5,20,0); +INSERT INTO "OrderDetails" VALUES(10861,21,10,40,0); +INSERT INTO "OrderDetails" VALUES(10861,33,2.5,35,0); +INSERT INTO "OrderDetails" VALUES(10861,62,49.3,3,0); +INSERT INTO "OrderDetails" VALUES(10862,11,21,25,0); +INSERT INTO "OrderDetails" VALUES(10862,52,7,8,0); +INSERT INTO "OrderDetails" VALUES(10863,1,18,20,0.15); +INSERT INTO "OrderDetails" VALUES(10863,58,13.25,12,0.15); +INSERT INTO "OrderDetails" VALUES(10864,35,18,4,0); +INSERT INTO "OrderDetails" VALUES(10864,67,14,15,0); + +INSERT INTO "OrderDetails" VALUES(10865,38,263.5,60,0.05); +INSERT INTO "OrderDetails" VALUES(10865,39,18,80,0.05); +INSERT INTO "OrderDetails" VALUES(10866,2,19,21,0.25); +INSERT INTO "OrderDetails" VALUES(10866,24,4.5,6,0.25); +INSERT INTO "OrderDetails" VALUES(10866,30,25.89,40,0.25); +INSERT INTO "OrderDetails" VALUES(10867,53,32.8,3,0); +INSERT INTO "OrderDetails" VALUES(10868,26,31.23,20,0); +INSERT INTO "OrderDetails" VALUES(10868,35,18,30,0); +INSERT INTO "OrderDetails" VALUES(10868,49,20,42,0.1); +INSERT INTO "OrderDetails" VALUES(10869,1,18,40,0); + +INSERT INTO "OrderDetails" VALUES(10869,11,21,10,0); +INSERT INTO "OrderDetails" VALUES(10869,23,9,50,0); +INSERT INTO "OrderDetails" VALUES(10869,68,12.5,20,0); +INSERT INTO "OrderDetails" VALUES(10870,35,18,3,0); +INSERT INTO "OrderDetails" VALUES(10870,51,53,2,0); +INSERT INTO "OrderDetails" VALUES(10871,6,25,50,0.05); +INSERT INTO "OrderDetails" VALUES(10871,16,17.45,12,0.05); +INSERT INTO "OrderDetails" VALUES(10871,17,39,16,0.05); +INSERT INTO "OrderDetails" VALUES(10872,55,24,10,0.05); +INSERT INTO "OrderDetails" VALUES(10872,62,49.3,20,0.05); + +INSERT INTO "OrderDetails" VALUES(10872,64,33.25,15,0.05); +INSERT INTO "OrderDetails" VALUES(10872,65,21.05,21,0.05); +INSERT INTO "OrderDetails" VALUES(10873,21,10,20,0); +INSERT INTO "OrderDetails" VALUES(10873,28,45.6,3,0); +INSERT INTO "OrderDetails" VALUES(10874,10,31,10,0); +INSERT INTO "OrderDetails" VALUES(10875,19,9.2,25,0); +INSERT INTO "OrderDetails" VALUES(10875,47,9.5,21,0.1); +INSERT INTO "OrderDetails" VALUES(10875,49,20,15,0); +INSERT INTO "OrderDetails" VALUES(10876,46,12,21,0); +INSERT INTO "OrderDetails" VALUES(10876,64,33.25,20,0); + +INSERT INTO "OrderDetails" VALUES(10877,16,17.45,30,0.25); +INSERT INTO "OrderDetails" VALUES(10877,18,62.5,25,0); +INSERT INTO "OrderDetails" VALUES(10878,20,81,20,0.05); +INSERT INTO "OrderDetails" VALUES(10879,40,18.4,12,0); +INSERT INTO "OrderDetails" VALUES(10879,65,21.05,10,0); +INSERT INTO "OrderDetails" VALUES(10879,76,18,10,0); +INSERT INTO "OrderDetails" VALUES(10880,23,9,30,0.2); +INSERT INTO "OrderDetails" VALUES(10880,61,28.5,30,0.2); +INSERT INTO "OrderDetails" VALUES(10880,70,15,50,0.2); +INSERT INTO "OrderDetails" VALUES(10881,73,15,10,0); + +INSERT INTO "OrderDetails" VALUES(10882,42,14,25,0); +INSERT INTO "OrderDetails" VALUES(10882,49,20,20,0.15); +INSERT INTO "OrderDetails" VALUES(10882,54,7.45,32,0.15); +INSERT INTO "OrderDetails" VALUES(10883,24,4.5,8,0); +INSERT INTO "OrderDetails" VALUES(10884,21,10,40,0.05); +INSERT INTO "OrderDetails" VALUES(10884,56,38,21,0.05); +INSERT INTO "OrderDetails" VALUES(10884,65,21.05,12,0.05); +INSERT INTO "OrderDetails" VALUES(10885,2,19,20,0); +INSERT INTO "OrderDetails" VALUES(10885,24,4.5,12,0); +INSERT INTO "OrderDetails" VALUES(10885,70,15,30,0); + +INSERT INTO "OrderDetails" VALUES(10885,77,13,25,0); +INSERT INTO "OrderDetails" VALUES(10886,10,31,70,0); +INSERT INTO "OrderDetails" VALUES(10886,31,12.5,35,0); +INSERT INTO "OrderDetails" VALUES(10886,77,13,40,0); +INSERT INTO "OrderDetails" VALUES(10887,25,14,5,0); +INSERT INTO "OrderDetails" VALUES(10888,2,19,20,0); +INSERT INTO "OrderDetails" VALUES(10888,68,12.5,18,0); +INSERT INTO "OrderDetails" VALUES(10889,11,21,40,0); +INSERT INTO "OrderDetails" VALUES(10889,38,263.5,40,0); +INSERT INTO "OrderDetails" VALUES(10890,17,39,15,0); + +INSERT INTO "OrderDetails" VALUES(10890,34,14,10,0); +INSERT INTO "OrderDetails" VALUES(10890,41,9.65,14,0); +INSERT INTO "OrderDetails" VALUES(10891,30,25.89,15,0.05); +INSERT INTO "OrderDetails" VALUES(10892,59,55,40,0.05); +INSERT INTO "OrderDetails" VALUES(10893,8,40,30,0); +INSERT INTO "OrderDetails" VALUES(10893,24,4.5,10,0); +INSERT INTO "OrderDetails" VALUES(10893,29,123.79,24,0); +INSERT INTO "OrderDetails" VALUES(10893,30,25.89,35,0); +INSERT INTO "OrderDetails" VALUES(10893,36,19,20,0); +INSERT INTO "OrderDetails" VALUES(10894,13,6,28,0.05); + +INSERT INTO "OrderDetails" VALUES(10894,69,36,50,0.05); +INSERT INTO "OrderDetails" VALUES(10894,75,7.75,120,0.05); +INSERT INTO "OrderDetails" VALUES(10895,24,4.5,110,0); +INSERT INTO "OrderDetails" VALUES(10895,39,18,45,0); +INSERT INTO "OrderDetails" VALUES(10895,40,18.4,91,0); +INSERT INTO "OrderDetails" VALUES(10895,60,34,100,0); +INSERT INTO "OrderDetails" VALUES(10896,45,9.5,15,0); +INSERT INTO "OrderDetails" VALUES(10896,56,38,16,0); +INSERT INTO "OrderDetails" VALUES(10897,29,123.79,80,0); +INSERT INTO "OrderDetails" VALUES(10897,30,25.89,36,0); + +INSERT INTO "OrderDetails" VALUES(10898,13,6,5,0); +INSERT INTO "OrderDetails" VALUES(10899,39,18,8,0.15); +INSERT INTO "OrderDetails" VALUES(10900,70,15,3,0.25); +INSERT INTO "OrderDetails" VALUES(10901,41,9.65,30,0); +INSERT INTO "OrderDetails" VALUES(10901,71,21.5,30,0); +INSERT INTO "OrderDetails" VALUES(10902,55,24,30,0.15); +INSERT INTO "OrderDetails" VALUES(10902,62,49.3,6,0.15); +INSERT INTO "OrderDetails" VALUES(10903,13,6,40,0); +INSERT INTO "OrderDetails" VALUES(10903,65,21.05,21,0); +INSERT INTO "OrderDetails" VALUES(10903,68,12.5,20,0); + +INSERT INTO "OrderDetails" VALUES(10904,58,13.25,15,0); +INSERT INTO "OrderDetails" VALUES(10904,62,49.3,35,0); +INSERT INTO "OrderDetails" VALUES(10905,1,18,20,0.05); +INSERT INTO "OrderDetails" VALUES(10906,61,28.5,15,0); +INSERT INTO "OrderDetails" VALUES(10907,75,7.75,14,0); +INSERT INTO "OrderDetails" VALUES(10908,7,30,20,0.05); +INSERT INTO "OrderDetails" VALUES(10908,52,7,14,0.05); +INSERT INTO "OrderDetails" VALUES(10909,7,30,12,0); +INSERT INTO "OrderDetails" VALUES(10909,16,17.45,15,0); +INSERT INTO "OrderDetails" VALUES(10909,41,9.65,5,0); + +INSERT INTO "OrderDetails" VALUES(10910,19,9.2,12,0); +INSERT INTO "OrderDetails" VALUES(10910,49,20,10,0); +INSERT INTO "OrderDetails" VALUES(10910,61,28.5,5,0); +INSERT INTO "OrderDetails" VALUES(10911,1,18,10,0); +INSERT INTO "OrderDetails" VALUES(10911,17,39,12,0); +INSERT INTO "OrderDetails" VALUES(10911,67,14,15,0); +INSERT INTO "OrderDetails" VALUES(10912,11,21,40,0.25); +INSERT INTO "OrderDetails" VALUES(10912,29,123.79,60,0.25); +INSERT INTO "OrderDetails" VALUES(10913,4,22,30,0.25); +INSERT INTO "OrderDetails" VALUES(10913,33,2.5,40,0.25); + +INSERT INTO "OrderDetails" VALUES(10913,58,13.25,15,0); +INSERT INTO "OrderDetails" VALUES(10914,71,21.5,25,0); +INSERT INTO "OrderDetails" VALUES(10915,17,39,10,0); +INSERT INTO "OrderDetails" VALUES(10915,33,2.5,30,0); +INSERT INTO "OrderDetails" VALUES(10915,54,7.45,10,0); +INSERT INTO "OrderDetails" VALUES(10916,16,17.45,6,0); +INSERT INTO "OrderDetails" VALUES(10916,32,32,6,0); +INSERT INTO "OrderDetails" VALUES(10916,57,19.5,20,0); +INSERT INTO "OrderDetails" VALUES(10917,30,25.89,1,0); +INSERT INTO "OrderDetails" VALUES(10917,60,34,10,0); + +INSERT INTO "OrderDetails" VALUES(10918,1,18,60,0.25); +INSERT INTO "OrderDetails" VALUES(10918,60,34,25,0.25); +INSERT INTO "OrderDetails" VALUES(10919,16,17.45,24,0); +INSERT INTO "OrderDetails" VALUES(10919,25,14,24,0); +INSERT INTO "OrderDetails" VALUES(10919,40,18.4,20,0); +INSERT INTO "OrderDetails" VALUES(10920,50,16.25,24,0); +INSERT INTO "OrderDetails" VALUES(10921,35,18,10,0); +INSERT INTO "OrderDetails" VALUES(10921,63,43.9,40,0); +INSERT INTO "OrderDetails" VALUES(10922,17,39,15,0); +INSERT INTO "OrderDetails" VALUES(10922,24,4.5,35,0); + +INSERT INTO "OrderDetails" VALUES(10923,42,14,10,0.2); +INSERT INTO "OrderDetails" VALUES(10923,43,46,10,0.2); +INSERT INTO "OrderDetails" VALUES(10923,67,14,24,0.2); +INSERT INTO "OrderDetails" VALUES(10924,10,31,20,0.1); +INSERT INTO "OrderDetails" VALUES(10924,28,45.6,30,0.1); +INSERT INTO "OrderDetails" VALUES(10924,75,7.75,6,0); +INSERT INTO "OrderDetails" VALUES(10925,36,19,25,0.15); +INSERT INTO "OrderDetails" VALUES(10925,52,7,12,0.15); +INSERT INTO "OrderDetails" VALUES(10926,11,21,2,0); +INSERT INTO "OrderDetails" VALUES(10926,13,6,10,0); + +INSERT INTO "OrderDetails" VALUES(10926,19,9.2,7,0); +INSERT INTO "OrderDetails" VALUES(10926,72,34.8,10,0); +INSERT INTO "OrderDetails" VALUES(10927,20,81,5,0); +INSERT INTO "OrderDetails" VALUES(10927,52,7,5,0); +INSERT INTO "OrderDetails" VALUES(10927,76,18,20,0); +INSERT INTO "OrderDetails" VALUES(10928,47,9.5,5,0); +INSERT INTO "OrderDetails" VALUES(10928,76,18,5,0); +INSERT INTO "OrderDetails" VALUES(10929,21,10,60,0); +INSERT INTO "OrderDetails" VALUES(10929,75,7.75,49,0); +INSERT INTO "OrderDetails" VALUES(10929,77,13,15,0); + +INSERT INTO "OrderDetails" VALUES(10930,21,10,36,0); +INSERT INTO "OrderDetails" VALUES(10930,27,43.9,25,0); +INSERT INTO "OrderDetails" VALUES(10930,55,24,25,0.2); +INSERT INTO "OrderDetails" VALUES(10930,58,13.25,30,0.2); +INSERT INTO "OrderDetails" VALUES(10931,13,6,42,0.15); +INSERT INTO "OrderDetails" VALUES(10931,57,19.5,30,0); +INSERT INTO "OrderDetails" VALUES(10932,16,17.45,30,0.1); +INSERT INTO "OrderDetails" VALUES(10932,62,49.3,14,0.1); +INSERT INTO "OrderDetails" VALUES(10932,72,34.8,16,0); +INSERT INTO "OrderDetails" VALUES(10932,75,7.75,20,0.1); + +INSERT INTO "OrderDetails" VALUES(10933,53,32.8,2,0); +INSERT INTO "OrderDetails" VALUES(10933,61,28.5,30,0); +INSERT INTO "OrderDetails" VALUES(10934,6,25,20,0); +INSERT INTO "OrderDetails" VALUES(10935,1,18,21,0); +INSERT INTO "OrderDetails" VALUES(10935,18,62.5,4,0.25); +INSERT INTO "OrderDetails" VALUES(10935,23,9,8,0.25); +INSERT INTO "OrderDetails" VALUES(10936,36,19,30,0.2); +INSERT INTO "OrderDetails" VALUES(10937,28,45.6,8,0); +INSERT INTO "OrderDetails" VALUES(10937,34,14,20,0); +INSERT INTO "OrderDetails" VALUES(10938,13,6,20,0.25); + +INSERT INTO "OrderDetails" VALUES(10938,43,46,24,0.25); +INSERT INTO "OrderDetails" VALUES(10938,60,34,49,0.25); +INSERT INTO "OrderDetails" VALUES(10938,71,21.5,35,0.25); +INSERT INTO "OrderDetails" VALUES(10939,2,19,10,0.15); +INSERT INTO "OrderDetails" VALUES(10939,67,14,40,0.15); +INSERT INTO "OrderDetails" VALUES(10940,7,30,8,0); +INSERT INTO "OrderDetails" VALUES(10940,13,6,20,0); +INSERT INTO "OrderDetails" VALUES(10941,31,12.5,44,0.25); +INSERT INTO "OrderDetails" VALUES(10941,62,49.3,30,0.25); +INSERT INTO "OrderDetails" VALUES(10941,68,12.5,80,0.25); + +INSERT INTO "OrderDetails" VALUES(10941,72,34.8,50,0); +INSERT INTO "OrderDetails" VALUES(10942,49,20,28,0); +INSERT INTO "OrderDetails" VALUES(10943,13,6,15,0); +INSERT INTO "OrderDetails" VALUES(10943,22,21,21,0); +INSERT INTO "OrderDetails" VALUES(10943,46,12,15,0); +INSERT INTO "OrderDetails" VALUES(10944,11,21,5,0.25); +INSERT INTO "OrderDetails" VALUES(10944,44,19.45,18,0.25); +INSERT INTO "OrderDetails" VALUES(10944,56,38,18,0); +INSERT INTO "OrderDetails" VALUES(10945,13,6,20,0); +INSERT INTO "OrderDetails" VALUES(10945,31,12.5,10,0); + +INSERT INTO "OrderDetails" VALUES(10946,10,31,25,0); +INSERT INTO "OrderDetails" VALUES(10946,24,4.5,25,0); +INSERT INTO "OrderDetails" VALUES(10946,77,13,40,0); +INSERT INTO "OrderDetails" VALUES(10947,59,55,4,0); +INSERT INTO "OrderDetails" VALUES(10948,50,16.25,9,0); +INSERT INTO "OrderDetails" VALUES(10948,51,53,40,0); +INSERT INTO "OrderDetails" VALUES(10948,55,24,4,0); +INSERT INTO "OrderDetails" VALUES(10949,6,25,12,0); +INSERT INTO "OrderDetails" VALUES(10949,10,31,30,0); +INSERT INTO "OrderDetails" VALUES(10949,17,39,6,0); + +INSERT INTO "OrderDetails" VALUES(10949,62,49.3,60,0); +INSERT INTO "OrderDetails" VALUES(10950,4,22,5,0); +INSERT INTO "OrderDetails" VALUES(10951,33,2.5,15,0.05); +INSERT INTO "OrderDetails" VALUES(10951,41,9.65,6,0.05); +INSERT INTO "OrderDetails" VALUES(10951,75,7.75,50,0.05); +INSERT INTO "OrderDetails" VALUES(10952,6,25,16,0.05); +INSERT INTO "OrderDetails" VALUES(10952,28,45.6,2,0); +INSERT INTO "OrderDetails" VALUES(10953,20,81,50,0.05); +INSERT INTO "OrderDetails" VALUES(10953,31,12.5,50,0.05); +INSERT INTO "OrderDetails" VALUES(10954,16,17.45,28,0.15); + +INSERT INTO "OrderDetails" VALUES(10954,31,12.5,25,0.15); +INSERT INTO "OrderDetails" VALUES(10954,45,9.5,30,0); +INSERT INTO "OrderDetails" VALUES(10954,60,34,24,0.15); +INSERT INTO "OrderDetails" VALUES(10955,75,7.75,12,0.2); +INSERT INTO "OrderDetails" VALUES(10956,21,10,12,0); +INSERT INTO "OrderDetails" VALUES(10956,47,9.5,14,0); +INSERT INTO "OrderDetails" VALUES(10956,51,53,8,0); +INSERT INTO "OrderDetails" VALUES(10957,30,25.89,30,0); +INSERT INTO "OrderDetails" VALUES(10957,35,18,40,0); +INSERT INTO "OrderDetails" VALUES(10957,64,33.25,8,0); + +INSERT INTO "OrderDetails" VALUES(10958,5,21.35,20,0); +INSERT INTO "OrderDetails" VALUES(10958,7,30,6,0); +INSERT INTO "OrderDetails" VALUES(10958,72,34.8,5,0); +INSERT INTO "OrderDetails" VALUES(10959,75,7.75,20,0.15); +INSERT INTO "OrderDetails" VALUES(10960,24,4.5,10,0.25); +INSERT INTO "OrderDetails" VALUES(10960,41,9.65,24,0); +INSERT INTO "OrderDetails" VALUES(10961,52,7,6,0.05); +INSERT INTO "OrderDetails" VALUES(10961,76,18,60,0); +INSERT INTO "OrderDetails" VALUES(10962,7,30,45,0); +INSERT INTO "OrderDetails" VALUES(10962,13,6,77,0); + +INSERT INTO "OrderDetails" VALUES(10962,53,32.8,20,0); +INSERT INTO "OrderDetails" VALUES(10962,69,36,9,0); +INSERT INTO "OrderDetails" VALUES(10962,76,18,44,0); +INSERT INTO "OrderDetails" VALUES(10963,60,34,2,0.15); +INSERT INTO "OrderDetails" VALUES(10964,18,62.5,6,0); +INSERT INTO "OrderDetails" VALUES(10964,38,263.5,5,0); +INSERT INTO "OrderDetails" VALUES(10964,69,36,10,0); +INSERT INTO "OrderDetails" VALUES(10965,51,53,16,0); +INSERT INTO "OrderDetails" VALUES(10966,37,26,8,0); +INSERT INTO "OrderDetails" VALUES(10966,56,38,12,0.15); + +INSERT INTO "OrderDetails" VALUES(10966,62,49.3,12,0.15); +INSERT INTO "OrderDetails" VALUES(10967,19,9.2,12,0); +INSERT INTO "OrderDetails" VALUES(10967,49,20,40,0); +INSERT INTO "OrderDetails" VALUES(10968,12,38,30,0); +INSERT INTO "OrderDetails" VALUES(10968,24,4.5,30,0); +INSERT INTO "OrderDetails" VALUES(10968,64,33.25,4,0); +INSERT INTO "OrderDetails" VALUES(10969,46,12,9,0); +INSERT INTO "OrderDetails" VALUES(10970,52,7,40,0.2); +INSERT INTO "OrderDetails" VALUES(10971,29,123.79,14,0); +INSERT INTO "OrderDetails" VALUES(10972,17,39,6,0); + +INSERT INTO "OrderDetails" VALUES(10972,33,2.5,7,0); +INSERT INTO "OrderDetails" VALUES(10973,26,31.23,5,0); +INSERT INTO "OrderDetails" VALUES(10973,41,9.65,6,0); +INSERT INTO "OrderDetails" VALUES(10973,75,7.75,10,0); +INSERT INTO "OrderDetails" VALUES(10974,63,43.9,10,0); +INSERT INTO "OrderDetails" VALUES(10975,8,40,16,0); +INSERT INTO "OrderDetails" VALUES(10975,75,7.75,10,0); +INSERT INTO "OrderDetails" VALUES(10976,28,45.6,20,0); +INSERT INTO "OrderDetails" VALUES(10977,39,18,30,0); +INSERT INTO "OrderDetails" VALUES(10977,47,9.5,30,0); + +INSERT INTO "OrderDetails" VALUES(10977,51,53,10,0); +INSERT INTO "OrderDetails" VALUES(10977,63,43.9,20,0); +INSERT INTO "OrderDetails" VALUES(10978,8,40,20,0.15); +INSERT INTO "OrderDetails" VALUES(10978,21,10,40,0.15); +INSERT INTO "OrderDetails" VALUES(10978,40,18.4,10,0); +INSERT INTO "OrderDetails" VALUES(10978,44,19.45,6,0.15); +INSERT INTO "OrderDetails" VALUES(10979,7,30,18,0); +INSERT INTO "OrderDetails" VALUES(10979,12,38,20,0); +INSERT INTO "OrderDetails" VALUES(10979,24,4.5,80,0); +INSERT INTO "OrderDetails" VALUES(10979,27,43.9,30,0); + +INSERT INTO "OrderDetails" VALUES(10979,31,12.5,24,0); +INSERT INTO "OrderDetails" VALUES(10979,63,43.9,35,0); +INSERT INTO "OrderDetails" VALUES(10980,75,7.75,40,0.2); +INSERT INTO "OrderDetails" VALUES(10981,38,263.5,60,0); +INSERT INTO "OrderDetails" VALUES(10982,7,30,20,0); +INSERT INTO "OrderDetails" VALUES(10982,43,46,9,0); +INSERT INTO "OrderDetails" VALUES(10983,13,6,84,0.15); +INSERT INTO "OrderDetails" VALUES(10983,57,19.5,15,0); +INSERT INTO "OrderDetails" VALUES(10984,16,17.45,55,0); +INSERT INTO "OrderDetails" VALUES(10984,24,4.5,20,0); + +INSERT INTO "OrderDetails" VALUES(10984,36,19,40,0); +INSERT INTO "OrderDetails" VALUES(10985,16,17.45,36,0.1); +INSERT INTO "OrderDetails" VALUES(10985,18,62.5,8,0.1); +INSERT INTO "OrderDetails" VALUES(10985,32,32,35,0.1); +INSERT INTO "OrderDetails" VALUES(10986,11,21,30,0); +INSERT INTO "OrderDetails" VALUES(10986,20,81,15,0); +INSERT INTO "OrderDetails" VALUES(10986,76,18,10,0); +INSERT INTO "OrderDetails" VALUES(10986,77,13,15,0); +INSERT INTO "OrderDetails" VALUES(10987,7,30,60,0); +INSERT INTO "OrderDetails" VALUES(10987,43,46,6,0); + +INSERT INTO "OrderDetails" VALUES(10987,72,34.8,20,0); +INSERT INTO "OrderDetails" VALUES(10988,7,30,60,0); +INSERT INTO "OrderDetails" VALUES(10988,62,49.3,40,0.1); +INSERT INTO "OrderDetails" VALUES(10989,6,25,40,0); +INSERT INTO "OrderDetails" VALUES(10989,11,21,15,0); +INSERT INTO "OrderDetails" VALUES(10989,41,9.65,4,0); +INSERT INTO "OrderDetails" VALUES(10990,21,10,65,0); +INSERT INTO "OrderDetails" VALUES(10990,34,14,60,0.15); +INSERT INTO "OrderDetails" VALUES(10990,55,24,65,0.15); +INSERT INTO "OrderDetails" VALUES(10990,61,28.5,66,0.15); + +INSERT INTO "OrderDetails" VALUES(10991,2,19,50,0.2); +INSERT INTO "OrderDetails" VALUES(10991,70,15,20,0.2); +INSERT INTO "OrderDetails" VALUES(10991,76,18,90,0.2); +INSERT INTO "OrderDetails" VALUES(10992,72,34.8,2,0); +INSERT INTO "OrderDetails" VALUES(10993,29,123.79,50,0.25); +INSERT INTO "OrderDetails" VALUES(10993,41,9.65,35,0.25); +INSERT INTO "OrderDetails" VALUES(10994,59,55,18,0.05); +INSERT INTO "OrderDetails" VALUES(10995,51,53,20,0); +INSERT INTO "OrderDetails" VALUES(10995,60,34,4,0); +INSERT INTO "OrderDetails" VALUES(10996,42,14,40,0); + +INSERT INTO "OrderDetails" VALUES(10997,32,32,50,0); +INSERT INTO "OrderDetails" VALUES(10997,46,12,20,0.25); +INSERT INTO "OrderDetails" VALUES(10997,52,7,20,0.25); +INSERT INTO "OrderDetails" VALUES(10998,24,4.5,12,0); +INSERT INTO "OrderDetails" VALUES(10998,61,28.5,7,0); +INSERT INTO "OrderDetails" VALUES(10998,74,10,20,0); +INSERT INTO "OrderDetails" VALUES(10998,75,7.75,30,0); +INSERT INTO "OrderDetails" VALUES(10999,41,9.65,20,0.05); +INSERT INTO "OrderDetails" VALUES(10999,51,53,15,0.05); +INSERT INTO "OrderDetails" VALUES(10999,77,13,21,0.05); + +INSERT INTO "OrderDetails" VALUES(11000,4,22,25,0.25); +INSERT INTO "OrderDetails" VALUES(11000,24,4.5,30,0.25); +INSERT INTO "OrderDetails" VALUES(11000,77,13,30,0); +INSERT INTO "OrderDetails" VALUES(11001,7,30,60,0); +INSERT INTO "OrderDetails" VALUES(11001,22,21,25,0); +INSERT INTO "OrderDetails" VALUES(11001,46,12,25,0); +INSERT INTO "OrderDetails" VALUES(11001,55,24,6,0); +INSERT INTO "OrderDetails" VALUES(11002,13,6,56,0); +INSERT INTO "OrderDetails" VALUES(11002,35,18,15,0.15); +INSERT INTO "OrderDetails" VALUES(11002,42,14,24,0.15); + +INSERT INTO "OrderDetails" VALUES(11002,55,24,40,0); +INSERT INTO "OrderDetails" VALUES(11003,1,18,4,0); +INSERT INTO "OrderDetails" VALUES(11003,40,18.4,10,0); +INSERT INTO "OrderDetails" VALUES(11003,52,7,10,0); +INSERT INTO "OrderDetails" VALUES(11004,26,31.23,6,0); +INSERT INTO "OrderDetails" VALUES(11004,76,18,6,0); +INSERT INTO "OrderDetails" VALUES(11005,1,18,2,0); +INSERT INTO "OrderDetails" VALUES(11005,59,55,10,0); +INSERT INTO "OrderDetails" VALUES(11006,1,18,8,0); +INSERT INTO "OrderDetails" VALUES(11006,29,123.79,2,0.25); + +INSERT INTO "OrderDetails" VALUES(11007,8,40,30,0); +INSERT INTO "OrderDetails" VALUES(11007,29,123.79,10,0); +INSERT INTO "OrderDetails" VALUES(11007,42,14,14,0); +INSERT INTO "OrderDetails" VALUES(11008,28,45.6,70,0.05); +INSERT INTO "OrderDetails" VALUES(11008,34,14,90,0.05); +INSERT INTO "OrderDetails" VALUES(11008,71,21.5,21,0); +INSERT INTO "OrderDetails" VALUES(11009,24,4.5,12,0); +INSERT INTO "OrderDetails" VALUES(11009,36,19,18,0.25); +INSERT INTO "OrderDetails" VALUES(11009,60,34,9,0); +INSERT INTO "OrderDetails" VALUES(11010,7,30,20,0); + +INSERT INTO "OrderDetails" VALUES(11010,24,4.5,10,0); +INSERT INTO "OrderDetails" VALUES(11011,58,13.25,40,0.05); +INSERT INTO "OrderDetails" VALUES(11011,71,21.5,20,0); +INSERT INTO "OrderDetails" VALUES(11012,19,9.2,50,0.05); +INSERT INTO "OrderDetails" VALUES(11012,60,34,36,0.05); +INSERT INTO "OrderDetails" VALUES(11012,71,21.5,60,0.05); +INSERT INTO "OrderDetails" VALUES(11013,23,9,10,0); +INSERT INTO "OrderDetails" VALUES(11013,42,14,4,0); +INSERT INTO "OrderDetails" VALUES(11013,45,9.5,20,0); +INSERT INTO "OrderDetails" VALUES(11013,68,12.5,2,0); + +INSERT INTO "OrderDetails" VALUES(11014,41,9.65,28,0.1); +INSERT INTO "OrderDetails" VALUES(11015,30,25.89,15,0); +INSERT INTO "OrderDetails" VALUES(11015,77,13,18,0); +INSERT INTO "OrderDetails" VALUES(11016,31,12.5,15,0); +INSERT INTO "OrderDetails" VALUES(11016,36,19,16,0); +INSERT INTO "OrderDetails" VALUES(11017,3,10,25,0); +INSERT INTO "OrderDetails" VALUES(11017,59,55,110,0); +INSERT INTO "OrderDetails" VALUES(11017,70,15,30,0); +INSERT INTO "OrderDetails" VALUES(11018,12,38,20,0); +INSERT INTO "OrderDetails" VALUES(11018,18,62.5,10,0); + +INSERT INTO "OrderDetails" VALUES(11018,56,38,5,0); +INSERT INTO "OrderDetails" VALUES(11019,46,12,3,0); +INSERT INTO "OrderDetails" VALUES(11019,49,20,2,0); +INSERT INTO "OrderDetails" VALUES(11020,10,31,24,0.15); +INSERT INTO "OrderDetails" VALUES(11021,2,19,11,0.25); +INSERT INTO "OrderDetails" VALUES(11021,20,81,15,0); +INSERT INTO "OrderDetails" VALUES(11021,26,31.23,63,0); +INSERT INTO "OrderDetails" VALUES(11021,51,53,44,0.25); +INSERT INTO "OrderDetails" VALUES(11021,72,34.8,35,0); +INSERT INTO "OrderDetails" VALUES(11022,19,9.2,35,0); + +INSERT INTO "OrderDetails" VALUES(11022,69,36,30,0); +INSERT INTO "OrderDetails" VALUES(11023,7,30,4,0); +INSERT INTO "OrderDetails" VALUES(11023,43,46,30,0); +INSERT INTO "OrderDetails" VALUES(11024,26,31.23,12,0); +INSERT INTO "OrderDetails" VALUES(11024,33,2.5,30,0); +INSERT INTO "OrderDetails" VALUES(11024,65,21.05,21,0); +INSERT INTO "OrderDetails" VALUES(11024,71,21.5,50,0); +INSERT INTO "OrderDetails" VALUES(11025,1,18,10,0.1); +INSERT INTO "OrderDetails" VALUES(11025,13,6,20,0.1); +INSERT INTO "OrderDetails" VALUES(11026,18,62.5,8,0); + +INSERT INTO "OrderDetails" VALUES(11026,51,53,10,0); +INSERT INTO "OrderDetails" VALUES(11027,24,4.5,30,0.25); +INSERT INTO "OrderDetails" VALUES(11027,62,49.3,21,0.25); +INSERT INTO "OrderDetails" VALUES(11028,55,24,35,0); +INSERT INTO "OrderDetails" VALUES(11028,59,55,24,0); +INSERT INTO "OrderDetails" VALUES(11029,56,38,20,0); +INSERT INTO "OrderDetails" VALUES(11029,63,43.9,12,0); +INSERT INTO "OrderDetails" VALUES(11030,2,19,100,0.25); +INSERT INTO "OrderDetails" VALUES(11030,5,21.35,70,0); +INSERT INTO "OrderDetails" VALUES(11030,29,123.79,60,0.25); + +INSERT INTO "OrderDetails" VALUES(11030,59,55,100,0.25); +INSERT INTO "OrderDetails" VALUES(11031,1,18,45,0); +INSERT INTO "OrderDetails" VALUES(11031,13,6,80,0); +INSERT INTO "OrderDetails" VALUES(11031,24,4.5,21,0); +INSERT INTO "OrderDetails" VALUES(11031,64,33.25,20,0); +INSERT INTO "OrderDetails" VALUES(11031,71,21.5,16,0); +INSERT INTO "OrderDetails" VALUES(11032,36,19,35,0); +INSERT INTO "OrderDetails" VALUES(11032,38,263.5,25,0); +INSERT INTO "OrderDetails" VALUES(11032,59,55,30,0); +INSERT INTO "OrderDetails" VALUES(11033,53,32.8,70,0.1); + +INSERT INTO "OrderDetails" VALUES(11033,69,36,36,0.1); +INSERT INTO "OrderDetails" VALUES(11034,21,10,15,0.1); +INSERT INTO "OrderDetails" VALUES(11034,44,19.45,12,0); +INSERT INTO "OrderDetails" VALUES(11034,61,28.5,6,0); +INSERT INTO "OrderDetails" VALUES(11035,1,18,10,0); +INSERT INTO "OrderDetails" VALUES(11035,35,18,60,0); +INSERT INTO "OrderDetails" VALUES(11035,42,14,30,0); +INSERT INTO "OrderDetails" VALUES(11035,54,7.45,10,0); +INSERT INTO "OrderDetails" VALUES(11036,13,6,7,0); +INSERT INTO "OrderDetails" VALUES(11036,59,55,30,0); + +INSERT INTO "OrderDetails" VALUES(11037,70,15,4,0); +INSERT INTO "OrderDetails" VALUES(11038,40,18.4,5,0.2); +INSERT INTO "OrderDetails" VALUES(11038,52,7,2,0); +INSERT INTO "OrderDetails" VALUES(11038,71,21.5,30,0); +INSERT INTO "OrderDetails" VALUES(11039,28,45.6,20,0); +INSERT INTO "OrderDetails" VALUES(11039,35,18,24,0); +INSERT INTO "OrderDetails" VALUES(11039,49,20,60,0); +INSERT INTO "OrderDetails" VALUES(11039,57,19.5,28,0); +INSERT INTO "OrderDetails" VALUES(11040,21,10,20,0); +INSERT INTO "OrderDetails" VALUES(11041,2,19,30,0.2); + +INSERT INTO "OrderDetails" VALUES(11041,63,43.9,30,0); +INSERT INTO "OrderDetails" VALUES(11042,44,19.45,15,0); +INSERT INTO "OrderDetails" VALUES(11042,61,28.5,4,0); +INSERT INTO "OrderDetails" VALUES(11043,11,21,10,0); +INSERT INTO "OrderDetails" VALUES(11044,62,49.3,12,0); +INSERT INTO "OrderDetails" VALUES(11045,33,2.5,15,0); +INSERT INTO "OrderDetails" VALUES(11045,51,53,24,0); +INSERT INTO "OrderDetails" VALUES(11046,12,38,20,0.05); +INSERT INTO "OrderDetails" VALUES(11046,32,32,15,0.05); +INSERT INTO "OrderDetails" VALUES(11046,35,18,18,0.05); + +INSERT INTO "OrderDetails" VALUES(11047,1,18,25,0.25); +INSERT INTO "OrderDetails" VALUES(11047,5,21.35,30,0.25); +INSERT INTO "OrderDetails" VALUES(11048,68,12.5,42,0); +INSERT INTO "OrderDetails" VALUES(11049,2,19,10,0.2); +INSERT INTO "OrderDetails" VALUES(11049,12,38,4,0.2); +INSERT INTO "OrderDetails" VALUES(11050,76,18,50,0.1); +INSERT INTO "OrderDetails" VALUES(11051,24,4.5,10,0.2); +INSERT INTO "OrderDetails" VALUES(11052,43,46,30,0.2); +INSERT INTO "OrderDetails" VALUES(11052,61,28.5,10,0.2); +INSERT INTO "OrderDetails" VALUES(11053,18,62.5,35,0.2); + +INSERT INTO "OrderDetails" VALUES(11053,32,32,20,0); +INSERT INTO "OrderDetails" VALUES(11053,64,33.25,25,0.2); +INSERT INTO "OrderDetails" VALUES(11054,33,2.5,10,0); +INSERT INTO "OrderDetails" VALUES(11054,67,14,20,0); +INSERT INTO "OrderDetails" VALUES(11055,24,4.5,15,0); +INSERT INTO "OrderDetails" VALUES(11055,25,14,15,0); +INSERT INTO "OrderDetails" VALUES(11055,51,53,20,0); +INSERT INTO "OrderDetails" VALUES(11055,57,19.5,20,0); +INSERT INTO "OrderDetails" VALUES(11056,7,30,40,0); +INSERT INTO "OrderDetails" VALUES(11056,55,24,35,0); + +INSERT INTO "OrderDetails" VALUES(11056,60,34,50,0); +INSERT INTO "OrderDetails" VALUES(11057,70,15,3,0); +INSERT INTO "OrderDetails" VALUES(11058,21,10,3,0); +INSERT INTO "OrderDetails" VALUES(11058,60,34,21,0); +INSERT INTO "OrderDetails" VALUES(11058,61,28.5,4,0); +INSERT INTO "OrderDetails" VALUES(11059,13,6,30,0); +INSERT INTO "OrderDetails" VALUES(11059,17,39,12,0); +INSERT INTO "OrderDetails" VALUES(11059,60,34,35,0); +INSERT INTO "OrderDetails" VALUES(11060,60,34,4,0); +INSERT INTO "OrderDetails" VALUES(11060,77,13,10,0); + +INSERT INTO "OrderDetails" VALUES(11061,60,34,15,0); +INSERT INTO "OrderDetails" VALUES(11062,53,32.8,10,0.2); +INSERT INTO "OrderDetails" VALUES(11062,70,15,12,0.2); +INSERT INTO "OrderDetails" VALUES(11063,34,14,30,0); +INSERT INTO "OrderDetails" VALUES(11063,40,18.4,40,0.1); +INSERT INTO "OrderDetails" VALUES(11063,41,9.65,30,0.1); +INSERT INTO "OrderDetails" VALUES(11064,17,39,77,0.1); +INSERT INTO "OrderDetails" VALUES(11064,41,9.65,12,0); +INSERT INTO "OrderDetails" VALUES(11064,53,32.8,25,0.1); +INSERT INTO "OrderDetails" VALUES(11064,55,24,4,0.1); + +INSERT INTO "OrderDetails" VALUES(11064,68,12.5,55,0); +INSERT INTO "OrderDetails" VALUES(11065,30,25.89,4,0.25); +INSERT INTO "OrderDetails" VALUES(11065,54,7.45,20,0.25); +INSERT INTO "OrderDetails" VALUES(11066,16,17.45,3,0); +INSERT INTO "OrderDetails" VALUES(11066,19,9.2,42,0); +INSERT INTO "OrderDetails" VALUES(11066,34,14,35,0); +INSERT INTO "OrderDetails" VALUES(11067,41,9.65,9,0); +INSERT INTO "OrderDetails" VALUES(11068,28,45.6,8,0.15); +INSERT INTO "OrderDetails" VALUES(11068,43,46,36,0.15); +INSERT INTO "OrderDetails" VALUES(11068,77,13,28,0.15); + +INSERT INTO "OrderDetails" VALUES(11069,39,18,20,0); +INSERT INTO "OrderDetails" VALUES(11070,1,18,40,0.15); +INSERT INTO "OrderDetails" VALUES(11070,2,19,20,0.15); +INSERT INTO "OrderDetails" VALUES(11070,16,17.45,30,0.15); +INSERT INTO "OrderDetails" VALUES(11070,31,12.5,20,0); +INSERT INTO "OrderDetails" VALUES(11071,7,30,15,0.05); +INSERT INTO "OrderDetails" VALUES(11071,13,6,10,0.05); +INSERT INTO "OrderDetails" VALUES(11072,2,19,8,0); +INSERT INTO "OrderDetails" VALUES(11072,41,9.65,40,0); +INSERT INTO "OrderDetails" VALUES(11072,50,16.25,22,0); + +INSERT INTO "OrderDetails" VALUES(11072,64,33.25,130,0); +INSERT INTO "OrderDetails" VALUES(11073,11,21,10,0); +INSERT INTO "OrderDetails" VALUES(11073,24,4.5,20,0); +INSERT INTO "OrderDetails" VALUES(11074,16,17.45,14,0.05); +INSERT INTO "OrderDetails" VALUES(11075,2,19,10,0.15); +INSERT INTO "OrderDetails" VALUES(11075,46,12,30,0.15); +INSERT INTO "OrderDetails" VALUES(11075,76,18,2,0.15); +INSERT INTO "OrderDetails" VALUES(11076,6,25,20,0.25); +INSERT INTO "OrderDetails" VALUES(11076,14,23.25,20,0.25); +INSERT INTO "OrderDetails" VALUES(11076,19,9.2,10,0.25); + +INSERT INTO "OrderDetails" VALUES(11077,2,19,24,0.2); +INSERT INTO "OrderDetails" VALUES(11077,3,10,4,0); +INSERT INTO "OrderDetails" VALUES(11077,4,22,1,0); +INSERT INTO "OrderDetails" VALUES(11077,6,25,1,0.02); +INSERT INTO "OrderDetails" VALUES(11077,7,30,1,0.05); +INSERT INTO "OrderDetails" VALUES(11077,8,40,2,0.1); +INSERT INTO "OrderDetails" VALUES(11077,10,31,1,0); +INSERT INTO "OrderDetails" VALUES(11077,12,38,2,0.05); +INSERT INTO "OrderDetails" VALUES(11077,13,6,4,0); +INSERT INTO "OrderDetails" VALUES(11077,14,23.25,1,0.03); + +INSERT INTO "OrderDetails" VALUES(11077,16,17.45,2,0.03); +INSERT INTO "OrderDetails" VALUES(11077,20,81,1,0.04); +INSERT INTO "OrderDetails" VALUES(11077,23,9,2,0); +INSERT INTO "OrderDetails" VALUES(11077,32,32,1,0); +INSERT INTO "OrderDetails" VALUES(11077,39,18,2,0.05); +INSERT INTO "OrderDetails" VALUES(11077,41,9.65,3,0); +INSERT INTO "OrderDetails" VALUES(11077,46,12,3,0.02); +INSERT INTO "OrderDetails" VALUES(11077,52,7,2,0); +INSERT INTO "OrderDetails" VALUES(11077,55,24,2,0); +INSERT INTO "OrderDetails" VALUES(11077,60,34,2,0.06); + +INSERT INTO "OrderDetails" VALUES(11077,64,33.25,2,0.03); +INSERT INTO "OrderDetails" VALUES(11077,66,17,1,0); +INSERT INTO "OrderDetails" VALUES(11077,73,15,2,0.01); +INSERT INTO "OrderDetails" VALUES(11077,75,7.75,4,0); +INSERT INTO "OrderDetails" VALUES(11077,77,13,2,0); + +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10248,N'VINET',5,'7/4/1996','8/1/1996','7/16/1996',3,32.38, + N'Vins et alcools Chevalier',N'59 rue de l''Abbaye',N'Reims', + NULL,N'51100',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10249,N'TOMSP',6,'7/5/1996','8/16/1996','7/10/1996',1,11.61, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10250,N'HANAR',4,'7/8/1996','8/5/1996','7/12/1996',2,65.83, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10251,N'VICTE',3,'7/8/1996','8/5/1996','7/15/1996',1,41.34, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10252,N'SUPRD',4,'7/9/1996','8/6/1996','7/11/1996',2,51.30, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10253,N'HANAR',3,'7/10/1996','7/24/1996','7/16/1996',2,58.17, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10254,N'CHOPS',5,'7/11/1996','8/8/1996','7/23/1996',2,22.98, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10255,N'RICSU',9,'7/12/1996','8/9/1996','7/15/1996',3,148.33, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10256,N'WELLI',3,'7/15/1996','8/12/1996','7/17/1996',2,13.97, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10257,N'HILAA',4,'7/16/1996','8/13/1996','7/22/1996',3,81.91, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10258,N'ERNSH',1,'7/17/1996','8/14/1996','7/23/1996',1,140.51, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10259,N'CENTC',4,'7/18/1996','8/15/1996','7/25/1996',3,3.25, + N'Centro comercial Moctezuma',N'Sierras de Granada 9993',N'México D.F.', + NULL,N'05022',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10260,N'OTTIK',4,'7/19/1996','8/16/1996','7/29/1996',1,55.09, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10261,N'QUEDE',4,'7/19/1996','8/16/1996','7/30/1996',2,3.05, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10262,N'RATTC',8,'7/22/1996','8/19/1996','7/25/1996',3,48.29, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10263,N'ERNSH',9,'7/23/1996','8/20/1996','7/31/1996',3,146.06, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10264,N'FOLKO',6,'7/24/1996','8/21/1996','8/23/1996',3,3.67, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10265,N'BLONP',2,'7/25/1996','8/22/1996','8/12/1996',1,55.28, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10266,N'WARTH',3,'7/26/1996','9/6/1996','7/31/1996',3,25.73, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10267,N'FRANK',4,'7/29/1996','8/26/1996','8/6/1996',1,208.58, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10268,N'GROSR',8,'7/30/1996','8/27/1996','8/2/1996',3,66.29, + N'GROSELLA-Restaurante',N'5ª Ave. Los Palos Grandes',N'Caracas', + N'DF',N'1081',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10269,N'WHITC',5,'7/31/1996','8/14/1996','8/9/1996',1,4.56, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10270,N'WARTH',1,'8/1/1996','8/29/1996','8/2/1996',1,136.54, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10271,N'SPLIR',6,'8/1/1996','8/29/1996','8/30/1996',2,4.54, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10272,N'RATTC',6,'8/2/1996','8/30/1996','8/6/1996',2,98.03, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10273,N'QUICK',3,'8/5/1996','9/2/1996','8/12/1996',3,76.07, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10274,N'VINET',6,'8/6/1996','9/3/1996','8/16/1996',1,6.01, + N'Vins et alcools Chevalier',N'59 rue de l''Abbaye',N'Reims', + NULL,N'51100',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10275,N'MAGAA',1,'8/7/1996','9/4/1996','8/9/1996',1,26.93, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10276,N'TORTU',8,'8/8/1996','8/22/1996','8/14/1996',3,13.84, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10277,N'MORGK',2,'8/9/1996','9/6/1996','8/13/1996',3,125.77, + N'Morgenstern Gesundkost',N'Heerstr. 22',N'Leipzig', + NULL,N'04179',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10278,N'BERGS',8,'8/12/1996','9/9/1996','8/16/1996',2,92.69, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10279,N'LEHMS',8,'8/13/1996','9/10/1996','8/16/1996',2,25.83, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10280,N'BERGS',2,'8/14/1996','9/11/1996','9/12/1996',1,8.98, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10281,N'ROMEY',4,'8/14/1996','8/28/1996','8/21/1996',1,2.94, + N'Romero y tomillo',N'Gran Vía, 1',N'Madrid', + NULL,N'28001',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10282,N'ROMEY',4,'8/15/1996','9/12/1996','8/21/1996',1,12.69, + N'Romero y tomillo',N'Gran Vía, 1',N'Madrid', + NULL,N'28001',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10283,N'LILAS',3,'8/16/1996','9/13/1996','8/23/1996',3,84.81, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10284,N'LEHMS',4,'8/19/1996','9/16/1996','8/27/1996',1,76.56, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10285,N'QUICK',1,'8/20/1996','9/17/1996','8/26/1996',2,76.83, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10286,N'QUICK',8,'8/21/1996','9/18/1996','8/30/1996',3,229.24, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10287,N'RICAR',8,'8/22/1996','9/19/1996','8/28/1996',3,12.76, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10288,N'REGGC',4,'8/23/1996','9/20/1996','9/3/1996',1,7.45, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10289,N'BSBEV',7,'8/26/1996','9/23/1996','8/28/1996',3,22.77, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10290,N'COMMI',8,'8/27/1996','9/24/1996','9/3/1996',1,79.70, + N'Comércio Mineiro',N'Av. dos Lusíadas, 23',N'Sao Paulo', + N'SP',N'05432-043',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10291,N'QUEDE',6,'8/27/1996','9/24/1996','9/4/1996',2,6.40, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10292,N'TRADH',1,'8/28/1996','9/25/1996','9/2/1996',2,1.35, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10293,N'TORTU',1,'8/29/1996','9/26/1996','9/11/1996',3,21.18, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10294,N'RATTC',4,'8/30/1996','9/27/1996','9/5/1996',2,147.26, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10295,N'VINET',2,'9/2/1996','9/30/1996','9/10/1996',2,1.15, + N'Vins et alcools Chevalier',N'59 rue de l''Abbaye',N'Reims', + NULL,N'51100',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10296,N'LILAS',6,'9/3/1996','10/1/1996','9/11/1996',1,0.12, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10297,N'BLONP',5,'9/4/1996','10/16/1996','9/10/1996',2,5.74, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10298,N'HUNGO',6,'9/5/1996','10/3/1996','9/11/1996',2,168.22, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10299,N'RICAR',4,'9/6/1996','10/4/1996','9/13/1996',2,29.76, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10300,N'MAGAA',2,'9/9/1996','10/7/1996','9/18/1996',2,17.68, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10301,N'WANDK',8,'9/9/1996','10/7/1996','9/17/1996',2,45.08, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10302,N'SUPRD',4,'9/10/1996','10/8/1996','10/9/1996',2,6.27, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10303,N'GODOS',7,'9/11/1996','10/9/1996','9/18/1996',2,107.83, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10304,N'TORTU',1,'9/12/1996','10/10/1996','9/17/1996',2,63.79, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10305,N'OLDWO',8,'9/13/1996','10/11/1996','10/9/1996',3,257.62, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10306,N'ROMEY',1,'9/16/1996','10/14/1996','9/23/1996',3,7.56, + N'Romero y tomillo',N'Gran Vía, 1',N'Madrid', + NULL,N'28001',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10307,N'LONEP',2,'9/17/1996','10/15/1996','9/25/1996',2,0.56, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10308,N'ANATR',7,'9/18/1996','10/16/1996','9/24/1996',3,1.61, + N'Ana Trujillo Emparedados y helados',N'Avda. de la Constitución 2222',N'México D.F.', + NULL,N'05021',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10309,N'HUNGO',3,'9/19/1996','10/17/1996','10/23/1996',1,47.30, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10310,N'THEBI',8,'9/20/1996','10/18/1996','9/27/1996',2,17.52, + N'The Big Cheese',N'89 Jefferson Way Suite 2',N'Portland', + N'OR',N'97201',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10311,N'DUMON',1,'9/20/1996','10/4/1996','9/26/1996',3,24.69, + N'Du monde entier',N'67, rue des Cinquante Otages',N'Nantes', + NULL,N'44000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10312,N'WANDK',2,'9/23/1996','10/21/1996','10/3/1996',2,40.26, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10313,N'QUICK',2,'9/24/1996','10/22/1996','10/4/1996',2,1.96, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10314,N'RATTC',1,'9/25/1996','10/23/1996','10/4/1996',2,74.16, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10315,N'ISLAT',4,'9/26/1996','10/24/1996','10/3/1996',2,41.76, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10316,N'RATTC',1,'9/27/1996','10/25/1996','10/8/1996',3,150.15, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10317,N'LONEP',6,'9/30/1996','10/28/1996','10/10/1996',1,12.69, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10318,N'ISLAT',8,'10/1/1996','10/29/1996','10/4/1996',2,4.73, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10319,N'TORTU',7,'10/2/1996','10/30/1996','10/11/1996',3,64.50, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10320,N'WARTH',5,'10/3/1996','10/17/1996','10/18/1996',3,34.57, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10321,N'ISLAT',3,'10/3/1996','10/31/1996','10/11/1996',2,3.43, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10322,N'PERIC',7,'10/4/1996','11/1/1996','10/23/1996',3,0.40, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10323,N'KOENE',4,'10/7/1996','11/4/1996','10/14/1996',1,4.88, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10324,N'SAVEA',9,'10/8/1996','11/5/1996','10/10/1996',1,214.27, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10325,N'KOENE',1,'10/9/1996','10/23/1996','10/14/1996',3,64.86, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10326,N'BOLID',4,'10/10/1996','11/7/1996','10/14/1996',2,77.92, + N'Bólido Comidas preparadas',N'C/ Araquil, 67',N'Madrid', + NULL,N'28023',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10327,N'FOLKO',2,'10/11/1996','11/8/1996','10/14/1996',1,63.36, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10328,N'FURIB',4,'10/14/1996','11/11/1996','10/17/1996',3,87.03, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10329,N'SPLIR',4,'10/15/1996','11/26/1996','10/23/1996',2,191.67, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10330,N'LILAS',3,'10/16/1996','11/13/1996','10/28/1996',1,12.75, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10331,N'BONAP',9,'10/16/1996','11/27/1996','10/21/1996',1,10.19, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10332,N'MEREP',3,'10/17/1996','11/28/1996','10/21/1996',2,52.84, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10333,N'WARTH',5,'10/18/1996','11/15/1996','10/25/1996',3,0.59, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10334,N'VICTE',8,'10/21/1996','11/18/1996','10/28/1996',2,8.56, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10335,N'HUNGO',7,'10/22/1996','11/19/1996','10/24/1996',2,42.11, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10336,N'PRINI',7,'10/23/1996','11/20/1996','10/25/1996',2,15.51, + N'Princesa Isabel Vinhos',N'Estrada da saúde n. 58',N'Lisboa', + NULL,N'1756',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10337,N'FRANK',4,'10/24/1996','11/21/1996','10/29/1996',3,108.26, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10338,N'OLDWO',4,'10/25/1996','11/22/1996','10/29/1996',3,84.21, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10339,N'MEREP',2,'10/28/1996','11/25/1996','11/4/1996',2,15.66, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10340,N'BONAP',1,'10/29/1996','11/26/1996','11/8/1996',3,166.31, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10341,N'SIMOB',7,'10/29/1996','11/26/1996','11/5/1996',3,26.78, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10342,N'FRANK',4,'10/30/1996','11/13/1996','11/4/1996',2,54.83, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10343,N'LEHMS',4,'10/31/1996','11/28/1996','11/6/1996',1,110.37, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10344,N'WHITC',4,'11/1/1996','11/29/1996','11/5/1996',2,23.29, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10345,N'QUICK',2,'11/4/1996','12/2/1996','11/11/1996',2,249.06, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10346,N'RATTC',3,'11/5/1996','12/17/1996','11/8/1996',3,142.08, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10347,N'FAMIA',4,'11/6/1996','12/4/1996','11/8/1996',3,3.10, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10348,N'WANDK',4,'11/7/1996','12/5/1996','11/15/1996',2,0.78, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10349,N'SPLIR',7,'11/8/1996','12/6/1996','11/15/1996',1,8.63, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10350,N'LAMAI',6,'11/11/1996','12/9/1996','12/3/1996',2,64.19, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10351,N'ERNSH',1,'11/11/1996','12/9/1996','11/20/1996',1,162.33, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10352,N'FURIB',3,'11/12/1996','11/26/1996','11/18/1996',3,1.30, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10353,N'PICCO',7,'11/13/1996','12/11/1996','11/25/1996',3,360.63, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10354,N'PERIC',8,'11/14/1996','12/12/1996','11/20/1996',3,53.80, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10355,N'AROUT',6,'11/15/1996','12/13/1996','11/20/1996',1,41.95, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10356,N'WANDK',6,'11/18/1996','12/16/1996','11/27/1996',2,36.71, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10357,N'LILAS',1,'11/19/1996','12/17/1996','12/2/1996',3,34.88, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10358,N'LAMAI',5,'11/20/1996','12/18/1996','11/27/1996',1,19.64, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10359,N'SEVES',5,'11/21/1996','12/19/1996','11/26/1996',3,288.43, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10360,N'BLONP',4,'11/22/1996','12/20/1996','12/2/1996',3,131.70, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10361,N'QUICK',1,'11/22/1996','12/20/1996','12/3/1996',2,183.17, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10362,N'BONAP',3,'11/25/1996','12/23/1996','11/28/1996',1,96.04, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10363,N'DRACD',4,'11/26/1996','12/24/1996','12/4/1996',3,30.54, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10364,N'EASTC',1,'11/26/1996','1/7/1997','12/4/1996',1,71.97, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10365,N'ANTON',3,'11/27/1996','12/25/1996','12/2/1996',2,22.00, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10366,N'GALED',8,'11/28/1996','1/9/1997','12/30/1996',2,10.14, + N'Galería del gastronómo',N'Rambla de Cataluña, 23',N'Barcelona', + NULL,N'8022',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10367,N'VAFFE',7,'11/28/1996','12/26/1996','12/2/1996',3,13.55, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10368,N'ERNSH',2,'11/29/1996','12/27/1996','12/2/1996',2,101.95, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10369,N'SPLIR',8,'12/2/1996','12/30/1996','12/9/1996',2,195.68, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10370,N'CHOPS',6,'12/3/1996','12/31/1996','12/27/1996',2,1.17, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10371,N'LAMAI',1,'12/3/1996','12/31/1996','12/24/1996',1,0.45, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10372,N'QUEEN',5,'12/4/1996','1/1/1997','12/9/1996',2,890.78, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10373,N'HUNGO',4,'12/5/1996','1/2/1997','12/11/1996',3,124.12, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10374,N'WOLZA',1,'12/5/1996','1/2/1997','12/9/1996',3,3.94, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10375,N'HUNGC',3,'12/6/1996','1/3/1997','12/9/1996',2,20.12, + N'Hungry Coyote Import Store',N'City Center Plaza 516 Main St.',N'Elgin', + N'OR',N'97827',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10376,N'MEREP',1,'12/9/1996','1/6/1997','12/13/1996',2,20.39, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10377,N'SEVES',1,'12/9/1996','1/6/1997','12/13/1996',3,22.21, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10378,N'FOLKO',5,'12/10/1996','1/7/1997','12/19/1996',3,5.44, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10379,N'QUEDE',2,'12/11/1996','1/8/1997','12/13/1996',1,45.03, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10380,N'HUNGO',8,'12/12/1996','1/9/1997','1/16/1997',3,35.03, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10381,N'LILAS',3,'12/12/1996','1/9/1997','12/13/1996',3,7.99, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10382,N'ERNSH',4,'12/13/1996','1/10/1997','12/16/1996',1,94.77, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10383,N'AROUT',8,'12/16/1996','1/13/1997','12/18/1996',3,34.24, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10384,N'BERGS',3,'12/16/1996','1/13/1997','12/20/1996',3,168.64, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10385,N'SPLIR',1,'12/17/1996','1/14/1997','12/23/1996',2,30.96, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10386,N'FAMIA',9,'12/18/1996','1/1/1997','12/25/1996',3,13.99, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10387,N'SANTG',1,'12/18/1996','1/15/1997','12/20/1996',2,93.63, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10388,N'SEVES',2,'12/19/1996','1/16/1997','12/20/1996',1,34.86, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10389,N'BOTTM',4,'12/20/1996','1/17/1997','12/24/1996',2,47.42, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10390,N'ERNSH',6,'12/23/1996','1/20/1997','12/26/1996',1,126.38, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10391,N'DRACD',3,'12/23/1996','1/20/1997','12/31/1996',3,5.45, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10392,N'PICCO',2,'12/24/1996','1/21/1997','1/1/1997',3,122.46, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10393,N'SAVEA',1,'12/25/1996','1/22/1997','1/3/1997',3,126.56, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10394,N'HUNGC',1,'12/25/1996','1/22/1997','1/3/1997',3,30.34, + N'Hungry Coyote Import Store',N'City Center Plaza 516 Main St.',N'Elgin', + N'OR',N'97827',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10395,N'HILAA',6,'12/26/1996','1/23/1997','1/3/1997',1,184.41, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10396,N'FRANK',1,'12/27/1996','1/10/1997','1/6/1997',3,135.35, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10397,N'PRINI',5,'12/27/1996','1/24/1997','1/2/1997',1,60.26, + N'Princesa Isabel Vinhos',N'Estrada da saúde n. 58',N'Lisboa', + NULL,N'1756',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10398,N'SAVEA',2,'12/30/1996','1/27/1997','1/9/1997',3,89.16, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10399,N'VAFFE',8,'12/31/1996','1/14/1997','1/8/1997',3,27.36, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10400,N'EASTC',1,'1/1/1997','1/29/1997','1/16/1997',3,83.93, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10401,N'RATTC',1,'1/1/1997','1/29/1997','1/10/1997',1,12.51, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10402,N'ERNSH',8,'1/2/1997','2/13/1997','1/10/1997',2,67.88, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10403,N'ERNSH',4,'1/3/1997','1/31/1997','1/9/1997',3,73.79, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10404,N'MAGAA',2,'1/3/1997','1/31/1997','1/8/1997',1,155.97, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10405,N'LINOD',1,'1/6/1997','2/3/1997','1/22/1997',1,34.82, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10406,N'QUEEN',7,'1/7/1997','2/18/1997','1/13/1997',1,108.04, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10407,N'OTTIK',2,'1/7/1997','2/4/1997','1/30/1997',2,91.48, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10408,N'FOLIG',8,'1/8/1997','2/5/1997','1/14/1997',1,11.26, + N'Folies gourmandes',N'184, chaussée de Tournai',N'Lille', + NULL,N'59000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10409,N'OCEAN',3,'1/9/1997','2/6/1997','1/14/1997',1,29.83, + N'Océano Atlántico Ltda.',N'Ing. Gustavo Moncada 8585 Piso 20-A',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10410,N'BOTTM',3,'1/10/1997','2/7/1997','1/15/1997',3,2.40, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10411,N'BOTTM',9,'1/10/1997','2/7/1997','1/21/1997',3,23.65, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10412,N'WARTH',8,'1/13/1997','2/10/1997','1/15/1997',2,3.77, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10413,N'LAMAI',3,'1/14/1997','2/11/1997','1/16/1997',2,95.66, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10414,N'FAMIA',2,'1/14/1997','2/11/1997','1/17/1997',3,21.48, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10415,N'HUNGC',3,'1/15/1997','2/12/1997','1/24/1997',1,0.20, + N'Hungry Coyote Import Store',N'City Center Plaza 516 Main St.',N'Elgin', + N'OR',N'97827',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10416,N'WARTH',8,'1/16/1997','2/13/1997','1/27/1997',3,22.72, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10417,N'SIMOB',4,'1/16/1997','2/13/1997','1/28/1997',3,70.29, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10418,N'QUICK',4,'1/17/1997','2/14/1997','1/24/1997',1,17.55, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10419,N'RICSU',4,'1/20/1997','2/17/1997','1/30/1997',2,137.35, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10420,N'WELLI',3,'1/21/1997','2/18/1997','1/27/1997',1,44.12, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10421,N'QUEDE',8,'1/21/1997','3/4/1997','1/27/1997',1,99.23, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10422,N'FRANS',2,'1/22/1997','2/19/1997','1/31/1997',1,3.02, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10423,N'GOURL',6,'1/23/1997','2/6/1997','2/24/1997',3,24.50, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10424,N'MEREP',7,'1/23/1997','2/20/1997','1/27/1997',2,370.61, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10425,N'LAMAI',6,'1/24/1997','2/21/1997','2/14/1997',2,7.93, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10426,N'GALED',4,'1/27/1997','2/24/1997','2/6/1997',1,18.69, + N'Galería del gastronómo',N'Rambla de Cataluña, 23',N'Barcelona', + NULL,N'8022',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10427,N'PICCO',4,'1/27/1997','2/24/1997','3/3/1997',2,31.29, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10428,N'REGGC',7,'1/28/1997','2/25/1997','2/4/1997',1,11.09, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10429,N'HUNGO',3,'1/29/1997','3/12/1997','2/7/1997',2,56.63, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10430,N'ERNSH',4,'1/30/1997','2/13/1997','2/3/1997',1,458.78, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10431,N'BOTTM',4,'1/30/1997','2/13/1997','2/7/1997',2,44.17, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10432,N'SPLIR',3,'1/31/1997','2/14/1997','2/7/1997',2,4.34, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10433,N'PRINI',3,'2/3/1997','3/3/1997','3/4/1997',3,73.83, + N'Princesa Isabel Vinhos',N'Estrada da saúde n. 58',N'Lisboa', + NULL,N'1756',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10434,N'FOLKO',3,'2/3/1997','3/3/1997','2/13/1997',2,17.92, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10435,N'CONSH',8,'2/4/1997','3/18/1997','2/7/1997',2,9.21, + N'Consolidated Holdings',N'Berkeley Gardens 12 Brewery',N'London', + NULL,N'WX1 6LT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10436,N'BLONP',3,'2/5/1997','3/5/1997','2/11/1997',2,156.66, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10437,N'WARTH',8,'2/5/1997','3/5/1997','2/12/1997',1,19.97, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10438,N'TOMSP',3,'2/6/1997','3/6/1997','2/14/1997',2,8.24, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10439,N'MEREP',6,'2/7/1997','3/7/1997','2/10/1997',3,4.07, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10440,N'SAVEA',4,'2/10/1997','3/10/1997','2/28/1997',2,86.53, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10441,N'OLDWO',3,'2/10/1997','3/24/1997','3/14/1997',2,73.02, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10442,N'ERNSH',3,'2/11/1997','3/11/1997','2/18/1997',2,47.94, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10443,N'REGGC',8,'2/12/1997','3/12/1997','2/14/1997',1,13.95, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10444,N'BERGS',3,'2/12/1997','3/12/1997','2/21/1997',3,3.50, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10445,N'BERGS',3,'2/13/1997','3/13/1997','2/20/1997',1,9.30, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10446,N'TOMSP',6,'2/14/1997','3/14/1997','2/19/1997',1,14.68, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10447,N'RICAR',4,'2/14/1997','3/14/1997','3/7/1997',2,68.66, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10448,N'RANCH',4,'2/17/1997','3/17/1997','2/24/1997',2,38.82, + N'Rancho grande',N'Av. del Libertador 900',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10449,N'BLONP',3,'2/18/1997','3/18/1997','2/27/1997',2,53.30, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10450,N'VICTE',8,'2/19/1997','3/19/1997','3/11/1997',2,7.23, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10451,N'QUICK',4,'2/19/1997','3/5/1997','3/12/1997',3,189.09, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10452,N'SAVEA',8,'2/20/1997','3/20/1997','2/26/1997',1,140.26, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10453,N'AROUT',1,'2/21/1997','3/21/1997','2/26/1997',2,25.36, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10454,N'LAMAI',4,'2/21/1997','3/21/1997','2/25/1997',3,2.74, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10455,N'WARTH',8,'2/24/1997','4/7/1997','3/3/1997',2,180.45, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10456,N'KOENE',8,'2/25/1997','4/8/1997','2/28/1997',2,8.12, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10457,N'KOENE',2,'2/25/1997','3/25/1997','3/3/1997',1,11.57, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10458,N'SUPRD',7,'2/26/1997','3/26/1997','3/4/1997',3,147.06, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10459,N'VICTE',4,'2/27/1997','3/27/1997','2/28/1997',2,25.09, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10460,N'FOLKO',8,'2/28/1997','3/28/1997','3/3/1997',1,16.27, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10461,N'LILAS',1,'2/28/1997','3/28/1997','3/5/1997',3,148.61, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10462,N'CONSH',2,'3/3/1997','3/31/1997','3/18/1997',1,6.17, + N'Consolidated Holdings',N'Berkeley Gardens 12 Brewery',N'London', + NULL,N'WX1 6LT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10463,N'SUPRD',5,'3/4/1997','4/1/1997','3/6/1997',3,14.78, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10464,N'FURIB',4,'3/4/1997','4/1/1997','3/14/1997',2,89.00, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10465,N'VAFFE',1,'3/5/1997','4/2/1997','3/14/1997',3,145.04, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10466,N'COMMI',4,'3/6/1997','4/3/1997','3/13/1997',1,11.93, + N'Comércio Mineiro',N'Av. dos Lusíadas, 23',N'Sao Paulo', + N'SP',N'05432-043',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10467,N'MAGAA',8,'3/6/1997','4/3/1997','3/11/1997',2,4.93, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10468,N'KOENE',3,'3/7/1997','4/4/1997','3/12/1997',3,44.12, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10469,N'WHITC',1,'3/10/1997','4/7/1997','3/14/1997',1,60.18, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10470,N'BONAP',4,'3/11/1997','4/8/1997','3/14/1997',2,64.56, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10471,N'BSBEV',2,'3/11/1997','4/8/1997','3/18/1997',3,45.59, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10472,N'SEVES',8,'3/12/1997','4/9/1997','3/19/1997',1,4.20, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10473,N'ISLAT',1,'3/13/1997','3/27/1997','3/21/1997',3,16.37, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10474,N'PERIC',5,'3/13/1997','4/10/1997','3/21/1997',2,83.49, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10475,N'SUPRD',9,'3/14/1997','4/11/1997','4/4/1997',1,68.52, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10476,N'HILAA',8,'3/17/1997','4/14/1997','3/24/1997',3,4.41, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10477,N'PRINI',5,'3/17/1997','4/14/1997','3/25/1997',2,13.02, + N'Princesa Isabel Vinhos',N'Estrada da saúde n. 58',N'Lisboa', + NULL,N'1756',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10478,N'VICTE',2,'3/18/1997','4/1/1997','3/26/1997',3,4.81, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10479,N'RATTC',3,'3/19/1997','4/16/1997','3/21/1997',3,708.95, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10480,N'FOLIG',6,'3/20/1997','4/17/1997','3/24/1997',2,1.35, + N'Folies gourmandes',N'184, chaussée de Tournai',N'Lille', + NULL,N'59000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10481,N'RICAR',8,'3/20/1997','4/17/1997','3/25/1997',2,64.33, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10482,N'LAZYK',1,'3/21/1997','4/18/1997','4/10/1997',3,7.48, + N'Lazy K Kountry Store',N'12 Orchestra Terrace',N'Walla Walla', + N'WA',N'99362',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10483,N'WHITC',7,'3/24/1997','4/21/1997','4/25/1997',2,15.28, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10484,N'BSBEV',3,'3/24/1997','4/21/1997','4/1/1997',3,6.88, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10485,N'LINOD',4,'3/25/1997','4/8/1997','3/31/1997',2,64.45, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10486,N'HILAA',1,'3/26/1997','4/23/1997','4/2/1997',2,30.53, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10487,N'QUEEN',2,'3/26/1997','4/23/1997','3/28/1997',2,71.07, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10488,N'FRANK',8,'3/27/1997','4/24/1997','4/2/1997',2,4.93, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10489,N'PICCO',6,'3/28/1997','4/25/1997','4/9/1997',2,5.29, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10490,N'HILAA',7,'3/31/1997','4/28/1997','4/3/1997',2,210.19, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10491,N'FURIB',8,'3/31/1997','4/28/1997','4/8/1997',3,16.96, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10492,N'BOTTM',3,'4/1/1997','4/29/1997','4/11/1997',1,62.89, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10493,N'LAMAI',4,'4/2/1997','4/30/1997','4/10/1997',3,10.64, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10494,N'COMMI',4,'4/2/1997','4/30/1997','4/9/1997',2,65.99, + N'Comércio Mineiro',N'Av. dos Lusíadas, 23',N'Sao Paulo', + N'SP',N'05432-043',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10495,N'LAUGB',3,'4/3/1997','5/1/1997','4/11/1997',3,4.65, + N'Laughing Bacchus Wine Cellars',N'2319 Elm St.',N'Vancouver', + N'BC',N'V3F 2K1',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10496,N'TRADH',7,'4/4/1997','5/2/1997','4/7/1997',2,46.77, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10497,N'LEHMS',7,'4/4/1997','5/2/1997','4/7/1997',1,36.21, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10498,N'HILAA',8,'4/7/1997','5/5/1997','4/11/1997',2,29.75, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10499,N'LILAS',4,'4/8/1997','5/6/1997','4/16/1997',2,102.02, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10500,N'LAMAI',6,'4/9/1997','5/7/1997','4/17/1997',1,42.68, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10501,N'BLAUS',9,'4/9/1997','5/7/1997','4/16/1997',3,8.85, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10502,N'PERIC',2,'4/10/1997','5/8/1997','4/29/1997',1,69.32, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10503,N'HUNGO',6,'4/11/1997','5/9/1997','4/16/1997',2,16.74, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10504,N'WHITC',4,'4/11/1997','5/9/1997','4/18/1997',3,59.13, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10505,N'MEREP',3,'4/14/1997','5/12/1997','4/21/1997',3,7.13, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10506,N'KOENE',9,'4/15/1997','5/13/1997','5/2/1997',2,21.19, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10507,N'ANTON',7,'4/15/1997','5/13/1997','4/22/1997',1,47.45, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10508,N'OTTIK',1,'4/16/1997','5/14/1997','5/13/1997',2,4.99, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10509,N'BLAUS',4,'4/17/1997','5/15/1997','4/29/1997',1,0.15, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10510,N'SAVEA',6,'4/18/1997','5/16/1997','4/28/1997',3,367.63, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10511,N'BONAP',4,'4/18/1997','5/16/1997','4/21/1997',3,350.64, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10512,N'FAMIA',7,'4/21/1997','5/19/1997','4/24/1997',2,3.53, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10513,N'WANDK',7,'4/22/1997','6/3/1997','4/28/1997',1,105.65, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10514,N'ERNSH',3,'4/22/1997','5/20/1997','5/16/1997',2,789.95, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10515,N'QUICK',2,'4/23/1997','5/7/1997','5/23/1997',1,204.47, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10516,N'HUNGO',2,'4/24/1997','5/22/1997','5/1/1997',3,62.78, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10517,N'NORTS',3,'4/24/1997','5/22/1997','4/29/1997',3,32.07, + N'North/South',N'South House 300 Queensbridge',N'London', + NULL,N'SW7 1RZ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10518,N'TORTU',4,'4/25/1997','5/9/1997','5/5/1997',2,218.15, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10519,N'CHOPS',6,'4/28/1997','5/26/1997','5/1/1997',3,91.76, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10520,N'SANTG',7,'4/29/1997','5/27/1997','5/1/1997',1,13.37, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10521,N'CACTU',8,'4/29/1997','5/27/1997','5/2/1997',2,17.22, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10522,N'LEHMS',4,'4/30/1997','5/28/1997','5/6/1997',1,45.33, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10523,N'SEVES',7,'5/1/1997','5/29/1997','5/30/1997',2,77.63, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10524,N'BERGS',1,'5/1/1997','5/29/1997','5/7/1997',2,244.79, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10525,N'BONAP',1,'5/2/1997','5/30/1997','5/23/1997',2,11.06, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10526,N'WARTH',4,'5/5/1997','6/2/1997','5/15/1997',2,58.59, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10527,N'QUICK',7,'5/5/1997','6/2/1997','5/7/1997',1,41.90, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10528,N'GREAL',6,'5/6/1997','5/20/1997','5/9/1997',2,3.35, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10529,N'MAISD',5,'5/7/1997','6/4/1997','5/9/1997',2,66.69, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10530,N'PICCO',3,'5/8/1997','6/5/1997','5/12/1997',2,339.22, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10531,N'OCEAN',7,'5/8/1997','6/5/1997','5/19/1997',1,8.12, + N'Océano Atlántico Ltda.',N'Ing. Gustavo Moncada 8585 Piso 20-A',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10532,N'EASTC',7,'5/9/1997','6/6/1997','5/12/1997',3,74.46, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10533,N'FOLKO',8,'5/12/1997','6/9/1997','5/22/1997',1,188.04, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10534,N'LEHMS',8,'5/12/1997','6/9/1997','5/14/1997',2,27.94, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10535,N'ANTON',4,'5/13/1997','6/10/1997','5/21/1997',1,15.64, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10536,N'LEHMS',3,'5/14/1997','6/11/1997','6/6/1997',2,58.88, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10537,N'RICSU',1,'5/14/1997','5/28/1997','5/19/1997',1,78.85, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10538,N'BSBEV',9,'5/15/1997','6/12/1997','5/16/1997',3,4.87, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10539,N'BSBEV',6,'5/16/1997','6/13/1997','5/23/1997',3,12.36, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10540,N'QUICK',3,'5/19/1997','6/16/1997','6/13/1997',3,1007.64, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10541,N'HANAR',2,'5/19/1997','6/16/1997','5/29/1997',1,68.65, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10542,N'KOENE',1,'5/20/1997','6/17/1997','5/26/1997',3,10.95, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10543,N'LILAS',8,'5/21/1997','6/18/1997','5/23/1997',2,48.17, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10544,N'LONEP',4,'5/21/1997','6/18/1997','5/30/1997',1,24.91, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10545,N'LAZYK',8,'5/22/1997','6/19/1997','6/26/1997',2,11.92, + N'Lazy K Kountry Store',N'12 Orchestra Terrace',N'Walla Walla', + N'WA',N'99362',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10546,N'VICTE',1,'5/23/1997','6/20/1997','5/27/1997',3,194.72, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10547,N'SEVES',3,'5/23/1997','6/20/1997','6/2/1997',2,178.43, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10548,N'TOMSP',3,'5/26/1997','6/23/1997','6/2/1997',2,1.43, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10549,N'QUICK',5,'5/27/1997','6/10/1997','5/30/1997',1,171.24, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10550,N'GODOS',7,'5/28/1997','6/25/1997','6/6/1997',3,4.32, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10551,N'FURIB',4,'5/28/1997','7/9/1997','6/6/1997',3,72.95, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10552,N'HILAA',2,'5/29/1997','6/26/1997','6/5/1997',1,83.22, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10553,N'WARTH',2,'5/30/1997','6/27/1997','6/3/1997',2,149.49, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10554,N'OTTIK',4,'5/30/1997','6/27/1997','6/5/1997',3,120.97, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10555,N'SAVEA',6,'6/2/1997','6/30/1997','6/4/1997',3,252.49, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10556,N'SIMOB',2,'6/3/1997','7/15/1997','6/13/1997',1,9.80, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10557,N'LEHMS',9,'6/3/1997','6/17/1997','6/6/1997',2,96.72, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10558,N'AROUT',1,'6/4/1997','7/2/1997','6/10/1997',2,72.97, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10559,N'BLONP',6,'6/5/1997','7/3/1997','6/13/1997',1,8.05, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10560,N'FRANK',8,'6/6/1997','7/4/1997','6/9/1997',1,36.65, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10561,N'FOLKO',2,'6/6/1997','7/4/1997','6/9/1997',2,242.21, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10562,N'REGGC',1,'6/9/1997','7/7/1997','6/12/1997',1,22.95, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10563,N'RICAR',2,'6/10/1997','7/22/1997','6/24/1997',2,60.43, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10564,N'RATTC',4,'6/10/1997','7/8/1997','6/16/1997',3,13.75, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10565,N'MEREP',8,'6/11/1997','7/9/1997','6/18/1997',2,7.15, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10566,N'BLONP',9,'6/12/1997','7/10/1997','6/18/1997',1,88.40, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10567,N'HUNGO',1,'6/12/1997','7/10/1997','6/17/1997',1,33.97, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10568,N'GALED',3,'6/13/1997','7/11/1997','7/9/1997',3,6.54, + N'Galería del gastronómo',N'Rambla de Cataluña, 23',N'Barcelona', + NULL,N'8022',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10569,N'RATTC',5,'6/16/1997','7/14/1997','7/11/1997',1,58.98, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10570,N'MEREP',3,'6/17/1997','7/15/1997','6/19/1997',3,188.99, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10571,N'ERNSH',8,'6/17/1997','7/29/1997','7/4/1997',3,26.06, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10572,N'BERGS',3,'6/18/1997','7/16/1997','6/25/1997',2,116.43, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10573,N'ANTON',7,'6/19/1997','7/17/1997','6/20/1997',3,84.84, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10574,N'TRAIH',4,'6/19/1997','7/17/1997','6/30/1997',2,37.60, + N'Trail''s Head Gourmet Provisioners',N'722 DaVinci Blvd.',N'Kirkland', + N'WA',N'98034',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10575,N'MORGK',5,'6/20/1997','7/4/1997','6/30/1997',1,127.34, + N'Morgenstern Gesundkost',N'Heerstr. 22',N'Leipzig', + NULL,N'04179',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10576,N'TORTU',3,'6/23/1997','7/7/1997','6/30/1997',3,18.56, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10577,N'TRAIH',9,'6/23/1997','8/4/1997','6/30/1997',2,25.41, + N'Trail''s Head Gourmet Provisioners',N'722 DaVinci Blvd.',N'Kirkland', + N'WA',N'98034',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10578,N'BSBEV',4,'6/24/1997','7/22/1997','7/25/1997',3,29.60, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10579,N'LETSS',1,'6/25/1997','7/23/1997','7/4/1997',2,13.73, + N'Let''s Stop N Shop',N'87 Polk St. Suite 5',N'San Francisco', + N'CA',N'94117',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10580,N'OTTIK',4,'6/26/1997','7/24/1997','7/1/1997',3,75.89, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10581,N'FAMIA',3,'6/26/1997','7/24/1997','7/2/1997',1,3.01, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10582,N'BLAUS',3,'6/27/1997','7/25/1997','7/14/1997',2,27.71, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10583,N'WARTH',2,'6/30/1997','7/28/1997','7/4/1997',2,7.28, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10584,N'BLONP',4,'6/30/1997','7/28/1997','7/4/1997',1,59.14, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10585,N'WELLI',7,'7/1/1997','7/29/1997','7/10/1997',1,13.41, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10586,N'REGGC',9,'7/2/1997','7/30/1997','7/9/1997',1,0.48, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10587,N'QUEDE',1,'7/2/1997','7/30/1997','7/9/1997',1,62.52, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10588,N'QUICK',2,'7/3/1997','7/31/1997','7/10/1997',3,194.67, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10589,N'GREAL',8,'7/4/1997','8/1/1997','7/14/1997',2,4.42, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10590,N'MEREP',4,'7/7/1997','8/4/1997','7/14/1997',3,44.77, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10591,N'VAFFE',1,'7/7/1997','7/21/1997','7/16/1997',1,55.92, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10592,N'LEHMS',3,'7/8/1997','8/5/1997','7/16/1997',1,32.10, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10593,N'LEHMS',7,'7/9/1997','8/6/1997','8/13/1997',2,174.20, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10594,N'OLDWO',3,'7/9/1997','8/6/1997','7/16/1997',2,5.24, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10595,N'ERNSH',2,'7/10/1997','8/7/1997','7/14/1997',1,96.78, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10596,N'WHITC',8,'7/11/1997','8/8/1997','8/12/1997',1,16.34, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10597,N'PICCO',7,'7/11/1997','8/8/1997','7/18/1997',3,35.12, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10598,N'RATTC',1,'7/14/1997','8/11/1997','7/18/1997',3,44.42, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10599,N'BSBEV',6,'7/15/1997','8/26/1997','7/21/1997',3,29.98, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10600,N'HUNGC',4,'7/16/1997','8/13/1997','7/21/1997',1,45.13, + N'Hungry Coyote Import Store',N'City Center Plaza 516 Main St.',N'Elgin', + N'OR',N'97827',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10601,N'HILAA',7,'7/16/1997','8/27/1997','7/22/1997',1,58.30, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10602,N'VAFFE',8,'7/17/1997','8/14/1997','7/22/1997',2,2.92, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10603,N'SAVEA',8,'7/18/1997','8/15/1997','8/8/1997',2,48.77, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10604,N'FURIB',1,'7/18/1997','8/15/1997','7/29/1997',1,7.46, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10605,N'MEREP',1,'7/21/1997','8/18/1997','7/29/1997',2,379.13, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10606,N'TRADH',4,'7/22/1997','8/19/1997','7/31/1997',3,79.40, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10607,N'SAVEA',5,'7/22/1997','8/19/1997','7/25/1997',1,200.24, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10608,N'TOMSP',4,'7/23/1997','8/20/1997','8/1/1997',2,27.79, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10609,N'DUMON',7,'7/24/1997','8/21/1997','7/30/1997',2,1.85, + N'Du monde entier',N'67, rue des Cinquante Otages',N'Nantes', + NULL,N'44000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10610,N'LAMAI',8,'7/25/1997','8/22/1997','8/6/1997',1,26.78, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10611,N'WOLZA',6,'7/25/1997','8/22/1997','8/1/1997',2,80.65, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10612,N'SAVEA',1,'7/28/1997','8/25/1997','8/1/1997',2,544.08, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10613,N'HILAA',4,'7/29/1997','8/26/1997','8/1/1997',2,8.11, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10614,N'BLAUS',8,'7/29/1997','8/26/1997','8/1/1997',3,1.93, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10615,N'WILMK',2,'7/30/1997','8/27/1997','8/6/1997',3,0.75, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10616,N'GREAL',1,'7/31/1997','8/28/1997','8/5/1997',2,116.53, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10617,N'GREAL',4,'7/31/1997','8/28/1997','8/4/1997',2,18.53, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10618,N'MEREP',1,'8/1/1997','9/12/1997','8/8/1997',1,154.68, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10619,N'MEREP',3,'8/4/1997','9/1/1997','8/7/1997',3,91.05, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10620,N'LAUGB',2,'8/5/1997','9/2/1997','8/14/1997',3,0.94, + N'Laughing Bacchus Wine Cellars',N'2319 Elm St.',N'Vancouver', + N'BC',N'V3F 2K1',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10621,N'ISLAT',4,'8/5/1997','9/2/1997','8/11/1997',2,23.73, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10622,N'RICAR',4,'8/6/1997','9/3/1997','8/11/1997',3,50.97, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10623,N'FRANK',8,'8/7/1997','9/4/1997','8/12/1997',2,97.18, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10624,N'THECR',4,'8/7/1997','9/4/1997','8/19/1997',2,94.80, + N'The Cracker Box',N'55 Grizzly Peak Rd.',N'Butte', + N'MT',N'59801',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10625,N'ANATR',3,'8/8/1997','9/5/1997','8/14/1997',1,43.90, + N'Ana Trujillo Emparedados y helados',N'Avda. de la Constitución 2222',N'México D.F.', + NULL,N'05021',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10626,N'BERGS',1,'8/11/1997','9/8/1997','8/20/1997',2,138.69, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10627,N'SAVEA',8,'8/11/1997','9/22/1997','8/21/1997',3,107.46, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10628,N'BLONP',4,'8/12/1997','9/9/1997','8/20/1997',3,30.36, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10629,N'GODOS',4,'8/12/1997','9/9/1997','8/20/1997',3,85.46, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10630,N'KOENE',1,'8/13/1997','9/10/1997','8/19/1997',2,32.35, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10631,N'LAMAI',8,'8/14/1997','9/11/1997','8/15/1997',1,0.87, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10632,N'WANDK',8,'8/14/1997','9/11/1997','8/19/1997',1,41.38, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10633,N'ERNSH',7,'8/15/1997','9/12/1997','8/18/1997',3,477.90, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10634,N'FOLIG',4,'8/15/1997','9/12/1997','8/21/1997',3,487.38, + N'Folies gourmandes',N'184, chaussée de Tournai',N'Lille', + NULL,N'59000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10635,N'MAGAA',8,'8/18/1997','9/15/1997','8/21/1997',3,47.46, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10636,N'WARTH',4,'8/19/1997','9/16/1997','8/26/1997',1,1.15, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10637,N'QUEEN',6,'8/19/1997','9/16/1997','8/26/1997',1,201.29, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10638,N'LINOD',3,'8/20/1997','9/17/1997','9/1/1997',1,158.44, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10639,N'SANTG',7,'8/20/1997','9/17/1997','8/27/1997',3,38.64, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10640,N'WANDK',4,'8/21/1997','9/18/1997','8/28/1997',1,23.55, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10641,N'HILAA',4,'8/22/1997','9/19/1997','8/26/1997',2,179.61, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10642,N'SIMOB',7,'8/22/1997','9/19/1997','9/5/1997',3,41.89, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10643,N'ALFKI',6,'8/25/1997','9/22/1997','9/2/1997',1,29.46, + N'Alfreds Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10644,N'WELLI',3,'8/25/1997','9/22/1997','9/1/1997',2,0.14, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10645,N'HANAR',4,'8/26/1997','9/23/1997','9/2/1997',1,12.41, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10646,N'HUNGO',9,'8/27/1997','10/8/1997','9/3/1997',3,142.33, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10647,N'QUEDE',4,'8/27/1997','9/10/1997','9/3/1997',2,45.54, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10648,N'RICAR',5,'8/28/1997','10/9/1997','9/9/1997',2,14.25, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10649,N'MAISD',5,'8/28/1997','9/25/1997','8/29/1997',3,6.20, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10650,N'FAMIA',5,'8/29/1997','9/26/1997','9/3/1997',3,176.81, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10651,N'WANDK',8,'9/1/1997','9/29/1997','9/11/1997',2,20.60, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10652,N'GOURL',4,'9/1/1997','9/29/1997','9/8/1997',2,7.14, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10653,N'FRANK',1,'9/2/1997','9/30/1997','9/19/1997',1,93.25, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10654,N'BERGS',5,'9/2/1997','9/30/1997','9/11/1997',1,55.26, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10655,N'REGGC',1,'9/3/1997','10/1/1997','9/11/1997',2,4.41, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10656,N'GREAL',6,'9/4/1997','10/2/1997','9/10/1997',1,57.15, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10657,N'SAVEA',2,'9/4/1997','10/2/1997','9/15/1997',2,352.69, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10658,N'QUICK',4,'9/5/1997','10/3/1997','9/8/1997',1,364.15, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10659,N'QUEEN',7,'9/5/1997','10/3/1997','9/10/1997',2,105.81, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10660,N'HUNGC',8,'9/8/1997','10/6/1997','10/15/1997',1,111.29, + N'Hungry Coyote Import Store',N'City Center Plaza 516 Main St.',N'Elgin', + N'OR',N'97827',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10661,N'HUNGO',7,'9/9/1997','10/7/1997','9/15/1997',3,17.55, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10662,N'LONEP',3,'9/9/1997','10/7/1997','9/18/1997',2,1.28, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10663,N'BONAP',2,'9/10/1997','9/24/1997','10/3/1997',2,113.15, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10664,N'FURIB',1,'9/10/1997','10/8/1997','9/19/1997',3,1.27, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10665,N'LONEP',1,'9/11/1997','10/9/1997','9/17/1997',2,26.31, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10666,N'RICSU',7,'9/12/1997','10/10/1997','9/22/1997',2,232.42, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10667,N'ERNSH',7,'9/12/1997','10/10/1997','9/19/1997',1,78.09, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10668,N'WANDK',1,'9/15/1997','10/13/1997','9/23/1997',2,47.22, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10669,N'SIMOB',2,'9/15/1997','10/13/1997','9/22/1997',1,24.39, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10670,N'FRANK',4,'9/16/1997','10/14/1997','9/18/1997',1,203.48, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10671,N'FRANR',1,'9/17/1997','10/15/1997','9/24/1997',1,30.34, + N'France restauration',N'54, rue Royale',N'Nantes', + NULL,N'44000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10672,N'BERGS',9,'9/17/1997','10/1/1997','9/26/1997',2,95.75, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10673,N'WILMK',2,'9/18/1997','10/16/1997','9/19/1997',1,22.76, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10674,N'ISLAT',4,'9/18/1997','10/16/1997','9/30/1997',2,0.90, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10675,N'FRANK',5,'9/19/1997','10/17/1997','9/23/1997',2,31.85, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10676,N'TORTU',2,'9/22/1997','10/20/1997','9/29/1997',2,2.01, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10677,N'ANTON',1,'9/22/1997','10/20/1997','9/26/1997',3,4.03, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10678,N'SAVEA',7,'9/23/1997','10/21/1997','10/16/1997',3,388.98, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10679,N'BLONP',8,'9/23/1997','10/21/1997','9/30/1997',3,27.94, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10680,N'OLDWO',1,'9/24/1997','10/22/1997','9/26/1997',1,26.61, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10681,N'GREAL',3,'9/25/1997','10/23/1997','9/30/1997',3,76.13, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10682,N'ANTON',3,'9/25/1997','10/23/1997','10/1/1997',2,36.13, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10683,N'DUMON',2,'9/26/1997','10/24/1997','10/1/1997',1,4.40, + N'Du monde entier',N'67, rue des Cinquante Otages',N'Nantes', + NULL,N'44000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10684,N'OTTIK',3,'9/26/1997','10/24/1997','9/30/1997',1,145.63, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10685,N'GOURL',4,'9/29/1997','10/13/1997','10/3/1997',2,33.75, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10686,N'PICCO',2,'9/30/1997','10/28/1997','10/8/1997',1,96.50, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10687,N'HUNGO',9,'9/30/1997','10/28/1997','10/30/1997',2,296.43, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10688,N'VAFFE',4,'10/1/1997','10/15/1997','10/7/1997',2,299.09, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10689,N'BERGS',1,'10/1/1997','10/29/1997','10/7/1997',2,13.42, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10690,N'HANAR',1,'10/2/1997','10/30/1997','10/3/1997',1,15.80, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10691,N'QUICK',2,'10/3/1997','11/14/1997','10/22/1997',2,810.05, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10692,N'ALFKI',4,'10/3/1997','10/31/1997','10/13/1997',2,61.02, + N'Alfred''s Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10693,N'WHITC',3,'10/6/1997','10/20/1997','10/10/1997',3,139.34, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10694,N'QUICK',8,'10/6/1997','11/3/1997','10/9/1997',3,398.36, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10695,N'WILMK',7,'10/7/1997','11/18/1997','10/14/1997',1,16.72, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10696,N'WHITC',8,'10/8/1997','11/19/1997','10/14/1997',3,102.55, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10697,N'LINOD',3,'10/8/1997','11/5/1997','10/14/1997',1,45.52, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10698,N'ERNSH',4,'10/9/1997','11/6/1997','10/17/1997',1,272.47, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10699,N'MORGK',3,'10/9/1997','11/6/1997','10/13/1997',3,0.58, + N'Morgenstern Gesundkost',N'Heerstr. 22',N'Leipzig', + NULL,N'04179',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10700,N'SAVEA',3,'10/10/1997','11/7/1997','10/16/1997',1,65.10, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10701,N'HUNGO',6,'10/13/1997','10/27/1997','10/15/1997',3,220.31, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10702,N'ALFKI',4,'10/13/1997','11/24/1997','10/21/1997',1,23.94, + N'Alfred''s Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10703,N'FOLKO',6,'10/14/1997','11/11/1997','10/20/1997',2,152.30, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10704,N'QUEEN',6,'10/14/1997','11/11/1997','11/7/1997',1,4.78, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10705,N'HILAA',9,'10/15/1997','11/12/1997','11/18/1997',2,3.52, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10706,N'OLDWO',8,'10/16/1997','11/13/1997','10/21/1997',3,135.63, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10707,N'AROUT',4,'10/16/1997','10/30/1997','10/23/1997',3,21.74, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10708,N'THEBI',6,'10/17/1997','11/28/1997','11/5/1997',2,2.96, + N'The Big Cheese',N'89 Jefferson Way Suite 2',N'Portland', + N'OR',N'97201',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10709,N'GOURL',1,'10/17/1997','11/14/1997','11/20/1997',3,210.80, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10710,N'FRANS',1,'10/20/1997','11/17/1997','10/23/1997',1,4.98, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10711,N'SAVEA',5,'10/21/1997','12/2/1997','10/29/1997',2,52.41, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10712,N'HUNGO',3,'10/21/1997','11/18/1997','10/31/1997',1,89.93, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10713,N'SAVEA',1,'10/22/1997','11/19/1997','10/24/1997',1,167.05, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10714,N'SAVEA',5,'10/22/1997','11/19/1997','10/27/1997',3,24.49, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10715,N'BONAP',3,'10/23/1997','11/6/1997','10/29/1997',1,63.20, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10716,N'RANCH',4,'10/24/1997','11/21/1997','10/27/1997',2,22.57, + N'Rancho grande',N'Av. del Libertador 900',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10717,N'FRANK',1,'10/24/1997','11/21/1997','10/29/1997',2,59.25, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10718,N'KOENE',1,'10/27/1997','11/24/1997','10/29/1997',3,170.88, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10719,N'LETSS',8,'10/27/1997','11/24/1997','11/5/1997',2,51.44, + N'Let''s Stop N Shop',N'87 Polk St. Suite 5',N'San Francisco', + N'CA',N'94117',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10720,N'QUEDE',8,'10/28/1997','11/11/1997','11/5/1997',2,9.53, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10721,N'QUICK',5,'10/29/1997','11/26/1997','10/31/1997',3,48.92, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10722,N'SAVEA',8,'10/29/1997','12/10/1997','11/4/1997',1,74.58, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10723,N'WHITC',3,'10/30/1997','11/27/1997','11/25/1997',1,21.72, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10724,N'MEREP',8,'10/30/1997','12/11/1997','11/5/1997',2,57.75, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10725,N'FAMIA',4,'10/31/1997','11/28/1997','11/5/1997',3,10.83, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10726,N'EASTC',4,'11/3/1997','11/17/1997','12/5/1997',1,16.56, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10727,N'REGGC',2,'11/3/1997','12/1/1997','12/5/1997',1,89.90, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10728,N'QUEEN',4,'11/4/1997','12/2/1997','11/11/1997',2,58.33, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10729,N'LINOD',8,'11/4/1997','12/16/1997','11/14/1997',3,141.06, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10730,N'BONAP',5,'11/5/1997','12/3/1997','11/14/1997',1,20.12, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10731,N'CHOPS',7,'11/6/1997','12/4/1997','11/14/1997',1,96.65, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10732,N'BONAP',3,'11/6/1997','12/4/1997','11/7/1997',1,16.97, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10733,N'BERGS',1,'11/7/1997','12/5/1997','11/10/1997',3,110.11, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10734,N'GOURL',2,'11/7/1997','12/5/1997','11/12/1997',3,1.63, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10735,N'LETSS',6,'11/10/1997','12/8/1997','11/21/1997',2,45.97, + N'Let''s Stop N Shop',N'87 Polk St. Suite 5',N'San Francisco', + N'CA',N'94117',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10736,N'HUNGO',9,'11/11/1997','12/9/1997','11/21/1997',2,44.10, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10737,N'VINET',2,'11/11/1997','12/9/1997','11/18/1997',2,7.79, + N'Vins et alcools Chevalier',N'59 rue de l''Abbaye',N'Reims', + NULL,N'51100',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10738,N'SPECD',2,'11/12/1997','12/10/1997','11/18/1997',1,2.91, + N'Spécialités du monde',N'25, rue Lauriston',N'Paris', + NULL,N'75016',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10739,N'VINET',3,'11/12/1997','12/10/1997','11/17/1997',3,11.08, + N'Vins et alcools Chevalier',N'59 rue de l''Abbaye',N'Reims', + NULL,N'51100',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10740,N'WHITC',4,'11/13/1997','12/11/1997','11/25/1997',2,81.88, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10741,N'AROUT',4,'11/14/1997','11/28/1997','11/18/1997',3,10.96, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10742,N'BOTTM',3,'11/14/1997','12/12/1997','11/18/1997',3,243.73, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10743,N'AROUT',1,'11/17/1997','12/15/1997','11/21/1997',2,23.72, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10744,N'VAFFE',6,'11/17/1997','12/15/1997','11/24/1997',1,69.19, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10745,N'QUICK',9,'11/18/1997','12/16/1997','11/27/1997',1,3.52, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10746,N'CHOPS',1,'11/19/1997','12/17/1997','11/21/1997',3,31.43, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10747,N'PICCO',6,'11/19/1997','12/17/1997','11/26/1997',1,117.33, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10748,N'SAVEA',3,'11/20/1997','12/18/1997','11/28/1997',1,232.55, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10749,N'ISLAT',4,'11/20/1997','12/18/1997','12/19/1997',2,61.53, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10750,N'WARTH',9,'11/21/1997','12/19/1997','11/24/1997',1,79.30, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10751,N'RICSU',3,'11/24/1997','12/22/1997','12/3/1997',3,130.79, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10752,N'NORTS',2,'11/24/1997','12/22/1997','11/28/1997',3,1.39, + N'North/South',N'South House 300 Queensbridge',N'London', + NULL,N'SW7 1RZ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10753,N'FRANS',3,'11/25/1997','12/23/1997','11/27/1997',1,7.70, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10754,N'MAGAA',6,'11/25/1997','12/23/1997','11/27/1997',3,2.38, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10755,N'BONAP',4,'11/26/1997','12/24/1997','11/28/1997',2,16.71, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10756,N'SPLIR',8,'11/27/1997','12/25/1997','12/2/1997',2,73.21, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10757,N'SAVEA',6,'11/27/1997','12/25/1997','12/15/1997',1,8.19, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10758,N'RICSU',3,'11/28/1997','12/26/1997','12/4/1997',3,138.17, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10759,N'ANATR',3,'11/28/1997','12/26/1997','12/12/1997',3,11.99, + N'Ana Trujillo Emparedados y helados',N'Avda. de la Constitución 2222',N'México D.F.', + NULL,N'05021',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10760,N'MAISD',4,'12/1/1997','12/29/1997','12/10/1997',1,155.64, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10761,N'RATTC',5,'12/2/1997','12/30/1997','12/8/1997',2,18.66, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10762,N'FOLKO',3,'12/2/1997','12/30/1997','12/9/1997',1,328.74, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10763,N'FOLIG',3,'12/3/1997','12/31/1997','12/8/1997',3,37.35, + N'Folies gourmandes',N'184, chaussée de Tournai',N'Lille', + NULL,N'59000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10764,N'ERNSH',6,'12/3/1997','12/31/1997','12/8/1997',3,145.45, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10765,N'QUICK',3,'12/4/1997','1/1/1998','12/9/1997',3,42.74, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10766,N'OTTIK',4,'12/5/1997','1/2/1998','12/9/1997',1,157.55, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10767,N'SUPRD',4,'12/5/1997','1/2/1998','12/15/1997',3,1.59, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10768,N'AROUT',3,'12/8/1997','1/5/1998','12/15/1997',2,146.32, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10769,N'VAFFE',3,'12/8/1997','1/5/1998','12/12/1997',1,65.06, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10770,N'HANAR',8,'12/9/1997','1/6/1998','12/17/1997',3,5.32, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10771,N'ERNSH',9,'12/10/1997','1/7/1998','1/2/1998',2,11.19, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10772,N'LEHMS',3,'12/10/1997','1/7/1998','12/19/1997',2,91.28, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10773,N'ERNSH',1,'12/11/1997','1/8/1998','12/16/1997',3,96.43, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10774,N'FOLKO',4,'12/11/1997','12/25/1997','12/12/1997',1,48.20, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10775,N'THECR',7,'12/12/1997','1/9/1998','12/26/1997',1,20.25, + N'The Cracker Box',N'55 Grizzly Peak Rd.',N'Butte', + N'MT',N'59801',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10776,N'ERNSH',1,'12/15/1997','1/12/1998','12/18/1997',3,351.53, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10777,N'GOURL',7,'12/15/1997','12/29/1997','1/21/1998',2,3.01, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10778,N'BERGS',3,'12/16/1997','1/13/1998','12/24/1997',1,6.79, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10779,N'MORGK',3,'12/16/1997','1/13/1998','1/14/1998',2,58.13, + N'Morgenstern Gesundkost',N'Heerstr. 22',N'Leipzig', + NULL,N'04179',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10780,N'LILAS',2,'12/16/1997','12/30/1997','12/25/1997',1,42.13, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10781,N'WARTH',2,'12/17/1997','1/14/1998','12/19/1997',3,73.16, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10782,N'CACTU',9,'12/17/1997','1/14/1998','12/22/1997',3,1.10, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10783,N'HANAR',4,'12/18/1997','1/15/1998','12/19/1997',2,124.98, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10784,N'MAGAA',4,'12/18/1997','1/15/1998','12/22/1997',3,70.09, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10785,N'GROSR',1,'12/18/1997','1/15/1998','12/24/1997',3,1.51, + N'GROSELLA-Restaurante',N'5ª Ave. Los Palos Grandes',N'Caracas', + N'DF',N'1081',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10786,N'QUEEN',8,'12/19/1997','1/16/1998','12/23/1997',1,110.87, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10787,N'LAMAI',2,'12/19/1997','1/2/1998','12/26/1997',1,249.93, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10788,N'QUICK',1,'12/22/1997','1/19/1998','1/19/1998',2,42.70, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10789,N'FOLIG',1,'12/22/1997','1/19/1998','12/31/1997',2,100.60, + N'Folies gourmandes',N'184, chaussée de Tournai',N'Lille', + NULL,N'59000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10790,N'GOURL',6,'12/22/1997','1/19/1998','12/26/1997',1,28.23, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10791,N'FRANK',6,'12/23/1997','1/20/1998','1/1/1998',2,16.85, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10792,N'WOLZA',1,'12/23/1997','1/20/1998','12/31/1997',3,23.79, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10793,N'AROUT',3,'12/24/1997','1/21/1998','1/8/1998',3,4.52, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10794,N'QUEDE',6,'12/24/1997','1/21/1998','1/2/1998',1,21.49, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10795,N'ERNSH',8,'12/24/1997','1/21/1998','1/20/1998',2,126.66, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10796,N'HILAA',3,'12/25/1997','1/22/1998','1/14/1998',1,26.52, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10797,N'DRACD',7,'12/25/1997','1/22/1998','1/5/1998',2,33.35, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10798,N'ISLAT',2,'12/26/1997','1/23/1998','1/5/1998',1,2.33, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10799,N'KOENE',9,'12/26/1997','2/6/1998','1/5/1998',3,30.76, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10800,N'SEVES',1,'12/26/1997','1/23/1998','1/5/1998',3,137.44, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10801,N'BOLID',4,'12/29/1997','1/26/1998','12/31/1997',2,97.09, + N'Bólido Comidas preparadas',N'C/ Araquil, 67',N'Madrid', + NULL,N'28023',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10802,N'SIMOB',4,'12/29/1997','1/26/1998','1/2/1998',2,257.26, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10803,N'WELLI',4,'12/30/1997','1/27/1998','1/6/1998',1,55.23, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10804,N'SEVES',6,'12/30/1997','1/27/1998','1/7/1998',2,27.33, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10805,N'THEBI',2,'12/30/1997','1/27/1998','1/9/1998',3,237.34, + N'The Big Cheese',N'89 Jefferson Way Suite 2',N'Portland', + N'OR',N'97201',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10806,N'VICTE',3,'12/31/1997','1/28/1998','1/5/1998',2,22.11, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10807,N'FRANS',4,'12/31/1997','1/28/1998','1/30/1998',1,1.36, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10808,N'OLDWO',2,'1/1/1998','1/29/1998','1/9/1998',3,45.53, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10809,N'WELLI',7,'1/1/1998','1/29/1998','1/7/1998',1,4.87, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10810,N'LAUGB',2,'1/1/1998','1/29/1998','1/7/1998',3,4.33, + N'Laughing Bacchus Wine Cellars',N'2319 Elm St.',N'Vancouver', + N'BC',N'V3F 2K1',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10811,N'LINOD',8,'1/2/1998','1/30/1998','1/8/1998',1,31.22, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10812,N'REGGC',5,'1/2/1998','1/30/1998','1/12/1998',1,59.78, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10813,N'RICAR',1,'1/5/1998','2/2/1998','1/9/1998',1,47.38, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10814,N'VICTE',3,'1/5/1998','2/2/1998','1/14/1998',3,130.94, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10815,N'SAVEA',2,'1/5/1998','2/2/1998','1/14/1998',3,14.62, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10816,N'GREAL',4,'1/6/1998','2/3/1998','2/4/1998',2,719.78, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10817,N'KOENE',3,'1/6/1998','1/20/1998','1/13/1998',2,306.07, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10818,N'MAGAA',7,'1/7/1998','2/4/1998','1/12/1998',3,65.48, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10819,N'CACTU',2,'1/7/1998','2/4/1998','1/16/1998',3,19.76, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10820,N'RATTC',3,'1/7/1998','2/4/1998','1/13/1998',2,37.52, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10821,N'SPLIR',1,'1/8/1998','2/5/1998','1/15/1998',1,36.68, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10822,N'TRAIH',6,'1/8/1998','2/5/1998','1/16/1998',3,7.00, + N'Trail''s Head Gourmet Provisioners',N'722 DaVinci Blvd.',N'Kirkland', + N'WA',N'98034',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10823,N'LILAS',5,'1/9/1998','2/6/1998','1/13/1998',2,163.97, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10824,N'FOLKO',8,'1/9/1998','2/6/1998','1/30/1998',1,1.23, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10825,N'DRACD',1,'1/9/1998','2/6/1998','1/14/1998',1,79.25, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10826,N'BLONP',6,'1/12/1998','2/9/1998','2/6/1998',1,7.09, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10827,N'BONAP',1,'1/12/1998','1/26/1998','2/6/1998',2,63.54, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10828,N'RANCH',9,'1/13/1998','1/27/1998','2/4/1998',1,90.85, + N'Rancho grande',N'Av. del Libertador 900',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10829,N'ISLAT',9,'1/13/1998','2/10/1998','1/23/1998',1,154.72, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10830,N'TRADH',4,'1/13/1998','2/24/1998','1/21/1998',2,81.83, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10831,N'SANTG',3,'1/14/1998','2/11/1998','1/23/1998',2,72.19, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10832,N'LAMAI',2,'1/14/1998','2/11/1998','1/19/1998',2,43.26, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10833,N'OTTIK',6,'1/15/1998','2/12/1998','1/23/1998',2,71.49, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10834,N'TRADH',1,'1/15/1998','2/12/1998','1/19/1998',3,29.78, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10835,N'ALFKI',1,'1/15/1998','2/12/1998','1/21/1998',3,69.53, + N'Alfred''s Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10836,N'ERNSH',7,'1/16/1998','2/13/1998','1/21/1998',1,411.88, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10837,N'BERGS',9,'1/16/1998','2/13/1998','1/23/1998',3,13.32, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10838,N'LINOD',3,'1/19/1998','2/16/1998','1/23/1998',3,59.28, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10839,N'TRADH',3,'1/19/1998','2/16/1998','1/22/1998',3,35.43, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10840,N'LINOD',4,'1/19/1998','3/2/1998','2/16/1998',2,2.71, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10841,N'SUPRD',5,'1/20/1998','2/17/1998','1/29/1998',2,424.30, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10842,N'TORTU',1,'1/20/1998','2/17/1998','1/29/1998',3,54.42, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10843,N'VICTE',4,'1/21/1998','2/18/1998','1/26/1998',2,9.26, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10844,N'PICCO',8,'1/21/1998','2/18/1998','1/26/1998',2,25.22, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10845,N'QUICK',8,'1/21/1998','2/4/1998','1/30/1998',1,212.98, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10846,N'SUPRD',2,'1/22/1998','3/5/1998','1/23/1998',3,56.46, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10847,N'SAVEA',4,'1/22/1998','2/5/1998','2/10/1998',3,487.57, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10848,N'CONSH',7,'1/23/1998','2/20/1998','1/29/1998',2,38.24, + N'Consolidated Holdings',N'Berkeley Gardens 12 Brewery',N'London', + NULL,N'WX1 6LT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10849,N'KOENE',9,'1/23/1998','2/20/1998','1/30/1998',2,0.56, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10850,N'VICTE',1,'1/23/1998','3/6/1998','1/30/1998',1,49.19, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10851,N'RICAR',5,'1/26/1998','2/23/1998','2/2/1998',1,160.55, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10852,N'RATTC',8,'1/26/1998','2/9/1998','1/30/1998',1,174.05, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10853,N'BLAUS',9,'1/27/1998','2/24/1998','2/3/1998',2,53.83, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10854,N'ERNSH',3,'1/27/1998','2/24/1998','2/5/1998',2,100.22, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10855,N'OLDWO',3,'1/27/1998','2/24/1998','2/4/1998',1,170.97, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10856,N'ANTON',3,'1/28/1998','2/25/1998','2/10/1998',2,58.43, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10857,N'BERGS',8,'1/28/1998','2/25/1998','2/6/1998',2,188.85, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10858,N'LACOR',2,'1/29/1998','2/26/1998','2/3/1998',1,52.51, + N'La corne d''abondance',N'67, avenue de l''Europe',N'Versailles', + NULL,N'78000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10859,N'FRANK',1,'1/29/1998','2/26/1998','2/2/1998',2,76.10, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10860,N'FRANR',3,'1/29/1998','2/26/1998','2/4/1998',3,19.26, + N'France restauration',N'54, rue Royale',N'Nantes', + NULL,N'44000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10861,N'WHITC',4,'1/30/1998','2/27/1998','2/17/1998',2,14.93, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10862,N'LEHMS',8,'1/30/1998','3/13/1998','2/2/1998',2,53.23, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10863,N'HILAA',4,'2/2/1998','3/2/1998','2/17/1998',2,30.26, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10864,N'AROUT',4,'2/2/1998','3/2/1998','2/9/1998',2,3.04, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10865,N'QUICK',2,'2/2/1998','2/16/1998','2/12/1998',1,348.14, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10866,N'BERGS',5,'2/3/1998','3/3/1998','2/12/1998',1,109.11, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10867,N'LONEP',6,'2/3/1998','3/17/1998','2/11/1998',1,1.93, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10868,N'QUEEN',7,'2/4/1998','3/4/1998','2/23/1998',2,191.27, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10869,N'SEVES',5,'2/4/1998','3/4/1998','2/9/1998',1,143.28, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10870,N'WOLZA',5,'2/4/1998','3/4/1998','2/13/1998',3,12.04, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10871,N'BONAP',9,'2/5/1998','3/5/1998','2/10/1998',2,112.27, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10872,N'GODOS',5,'2/5/1998','3/5/1998','2/9/1998',2,175.32, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10873,N'WILMK',4,'2/6/1998','3/6/1998','2/9/1998',1,0.82, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10874,N'GODOS',5,'2/6/1998','3/6/1998','2/11/1998',2,19.58, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10875,N'BERGS',4,'2/6/1998','3/6/1998','3/3/1998',2,32.37, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10876,N'BONAP',7,'2/9/1998','3/9/1998','2/12/1998',3,60.42, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10877,N'RICAR',1,'2/9/1998','3/9/1998','2/19/1998',1,38.06, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10878,N'QUICK',4,'2/10/1998','3/10/1998','2/12/1998',1,46.69, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10879,N'WILMK',3,'2/10/1998','3/10/1998','2/12/1998',3,8.50, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10880,N'FOLKO',7,'2/10/1998','3/24/1998','2/18/1998',1,88.01, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10881,N'CACTU',4,'2/11/1998','3/11/1998','2/18/1998',1,2.84, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10882,N'SAVEA',4,'2/11/1998','3/11/1998','2/20/1998',3,23.10, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10883,N'LONEP',8,'2/12/1998','3/12/1998','2/20/1998',3,0.53, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10884,N'LETSS',4,'2/12/1998','3/12/1998','2/13/1998',2,90.97, + N'Let''s Stop N Shop',N'87 Polk St. Suite 5',N'San Francisco', + N'CA',N'94117',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10885,N'SUPRD',6,'2/12/1998','3/12/1998','2/18/1998',3,5.64, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10886,N'HANAR',1,'2/13/1998','3/13/1998','3/2/1998',1,4.99, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10887,N'GALED',8,'2/13/1998','3/13/1998','2/16/1998',3,1.25, + N'Galería del gastronómo',N'Rambla de Cataluña, 23',N'Barcelona', + NULL,N'8022',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10888,N'GODOS',1,'2/16/1998','3/16/1998','2/23/1998',2,51.87, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10889,N'RATTC',9,'2/16/1998','3/16/1998','2/23/1998',3,280.61, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10890,N'DUMON',7,'2/16/1998','3/16/1998','2/18/1998',1,32.76, + N'Du monde entier',N'67, rue des Cinquante Otages',N'Nantes', + NULL,N'44000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10891,N'LEHMS',7,'2/17/1998','3/17/1998','2/19/1998',2,20.37, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10892,N'MAISD',4,'2/17/1998','3/17/1998','2/19/1998',2,120.27, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10893,N'KOENE',9,'2/18/1998','3/18/1998','2/20/1998',2,77.78, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10894,N'SAVEA',1,'2/18/1998','3/18/1998','2/20/1998',1,116.13, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10895,N'ERNSH',3,'2/18/1998','3/18/1998','2/23/1998',1,162.75, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10896,N'MAISD',7,'2/19/1998','3/19/1998','2/27/1998',3,32.45, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10897,N'HUNGO',3,'2/19/1998','3/19/1998','2/25/1998',2,603.54, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10898,N'OCEAN',4,'2/20/1998','3/20/1998','3/6/1998',2,1.27, + N'Océano Atlántico Ltda.',N'Ing. Gustavo Moncada 8585 Piso 20-A',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10899,N'LILAS',5,'2/20/1998','3/20/1998','2/26/1998',3,1.21, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10900,N'WELLI',1,'2/20/1998','3/20/1998','3/4/1998',2,1.66, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10901,N'HILAA',4,'2/23/1998','3/23/1998','2/26/1998',1,62.09, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10902,N'FOLKO',1,'2/23/1998','3/23/1998','3/3/1998',1,44.15, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10903,N'HANAR',3,'2/24/1998','3/24/1998','3/4/1998',3,36.71, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10904,N'WHITC',3,'2/24/1998','3/24/1998','2/27/1998',3,162.95, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10905,N'WELLI',9,'2/24/1998','3/24/1998','3/6/1998',2,13.72, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10906,N'WOLZA',4,'2/25/1998','3/11/1998','3/3/1998',3,26.29, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10907,N'SPECD',6,'2/25/1998','3/25/1998','2/27/1998',3,9.19, + N'Spécialités du monde',N'25, rue Lauriston',N'Paris', + NULL,N'75016',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10908,N'REGGC',4,'2/26/1998','3/26/1998','3/6/1998',2,32.96, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10909,N'SANTG',1,'2/26/1998','3/26/1998','3/10/1998',2,53.05, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10910,N'WILMK',1,'2/26/1998','3/26/1998','3/4/1998',3,38.11, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10911,N'GODOS',3,'2/26/1998','3/26/1998','3/5/1998',1,38.19, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10912,N'HUNGO',2,'2/26/1998','3/26/1998','3/18/1998',2,580.91, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10913,N'QUEEN',4,'2/26/1998','3/26/1998','3/4/1998',1,33.05, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10914,N'QUEEN',6,'2/27/1998','3/27/1998','3/2/1998',1,21.19, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10915,N'TORTU',2,'2/27/1998','3/27/1998','3/2/1998',2,3.51, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10916,N'RANCH',1,'2/27/1998','3/27/1998','3/9/1998',2,63.77, + N'Rancho grande',N'Av. del Libertador 900',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10917,N'ROMEY',4,'3/2/1998','3/30/1998','3/11/1998',2,8.29, + N'Romero y tomillo',N'Gran Vía, 1',N'Madrid', + NULL,N'28001',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10918,N'BOTTM',3,'3/2/1998','3/30/1998','3/11/1998',3,48.83, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10919,N'LINOD',2,'3/2/1998','3/30/1998','3/4/1998',2,19.80, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10920,N'AROUT',4,'3/3/1998','3/31/1998','3/9/1998',2,29.61, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10921,N'VAFFE',1,'3/3/1998','4/14/1998','3/9/1998',1,176.48, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10922,N'HANAR',5,'3/3/1998','3/31/1998','3/5/1998',3,62.74, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10923,N'LAMAI',7,'3/3/1998','4/14/1998','3/13/1998',3,68.26, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10924,N'BERGS',3,'3/4/1998','4/1/1998','4/8/1998',2,151.52, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10925,N'HANAR',3,'3/4/1998','4/1/1998','3/13/1998',1,2.27, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10926,N'ANATR',4,'3/4/1998','4/1/1998','3/11/1998',3,39.92, + N'Ana Trujillo Emparedados y helados',N'Avda. de la Constitución 2222',N'México D.F.', + NULL,N'05021',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10927,N'LACOR',4,'3/5/1998','4/2/1998','4/8/1998',1,19.79, + N'La corne d''abondance',N'67, avenue de l''Europe',N'Versailles', + NULL,N'78000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10928,N'GALED',1,'3/5/1998','4/2/1998','3/18/1998',1,1.36, + N'Galería del gastronómo',N'Rambla de Cataluña, 23',N'Barcelona', + NULL,N'8022',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10929,N'FRANK',6,'3/5/1998','4/2/1998','3/12/1998',1,33.93, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10930,N'SUPRD',4,'3/6/1998','4/17/1998','3/18/1998',3,15.55, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10931,N'RICSU',4,'3/6/1998','3/20/1998','3/19/1998',2,13.60, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10932,N'BONAP',8,'3/6/1998','4/3/1998','3/24/1998',1,134.64, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10933,N'ISLAT',6,'3/6/1998','4/3/1998','3/16/1998',3,54.15, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10934,N'LEHMS',3,'3/9/1998','4/6/1998','3/12/1998',3,32.01, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10935,N'WELLI',4,'3/9/1998','4/6/1998','3/18/1998',3,47.59, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10936,N'GREAL',3,'3/9/1998','4/6/1998','3/18/1998',2,33.68, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10937,N'CACTU',7,'3/10/1998','3/24/1998','3/13/1998',3,31.51, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10938,N'QUICK',3,'3/10/1998','4/7/1998','3/16/1998',2,31.89, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10939,N'MAGAA',2,'3/10/1998','4/7/1998','3/13/1998',2,76.33, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10940,N'BONAP',8,'3/11/1998','4/8/1998','3/23/1998',3,19.77, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10941,N'SAVEA',7,'3/11/1998','4/8/1998','3/20/1998',2,400.81, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10942,N'REGGC',9,'3/11/1998','4/8/1998','3/18/1998',3,17.95, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10943,N'BSBEV',4,'3/11/1998','4/8/1998','3/19/1998',2,2.17, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10944,N'BOTTM',6,'3/12/1998','3/26/1998','3/13/1998',3,52.92, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10945,N'MORGK',4,'3/12/1998','4/9/1998','3/18/1998',1,10.22, + N'Morgenstern Gesundkost',N'Heerstr. 22',N'Leipzig', + NULL,N'04179',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10946,N'VAFFE',1,'3/12/1998','4/9/1998','3/19/1998',2,27.20, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10947,N'BSBEV',3,'3/13/1998','4/10/1998','3/16/1998',2,3.26, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10948,N'GODOS',3,'3/13/1998','4/10/1998','3/19/1998',3,23.39, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10949,N'BOTTM',2,'3/13/1998','4/10/1998','3/17/1998',3,74.44, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10950,N'MAGAA',1,'3/16/1998','4/13/1998','3/23/1998',2,2.50, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10951,N'RICSU',9,'3/16/1998','4/27/1998','4/7/1998',2,30.85, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10952,N'ALFKI',1,'3/16/1998','4/27/1998','3/24/1998',1,40.42, + N'Alfred''s Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10953,N'AROUT',9,'3/16/1998','3/30/1998','3/25/1998',2,23.72, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10954,N'LINOD',5,'3/17/1998','4/28/1998','3/20/1998',1,27.91, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10955,N'FOLKO',8,'3/17/1998','4/14/1998','3/20/1998',2,3.26, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10956,N'BLAUS',6,'3/17/1998','4/28/1998','3/20/1998',2,44.65, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10957,N'HILAA',8,'3/18/1998','4/15/1998','3/27/1998',3,105.36, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10958,N'OCEAN',7,'3/18/1998','4/15/1998','3/27/1998',2,49.56, + N'Océano Atlántico Ltda.',N'Ing. Gustavo Moncada 8585 Piso 20-A',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10959,N'GOURL',6,'3/18/1998','4/29/1998','3/23/1998',2,4.98, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10960,N'HILAA',3,'3/19/1998','4/2/1998','4/8/1998',1,2.08, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10961,N'QUEEN',8,'3/19/1998','4/16/1998','3/30/1998',1,104.47, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10962,N'QUICK',8,'3/19/1998','4/16/1998','3/23/1998',2,275.79, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10963,N'FURIB',9,'3/19/1998','4/16/1998','3/26/1998',3,2.70, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10964,N'SPECD',3,'3/20/1998','4/17/1998','3/24/1998',2,87.38, + N'Spécialités du monde',N'25, rue Lauriston',N'Paris', + NULL,N'75016',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10965,N'OLDWO',6,'3/20/1998','4/17/1998','3/30/1998',3,144.38, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10966,N'CHOPS',4,'3/20/1998','4/17/1998','4/8/1998',1,27.19, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10967,N'TOMSP',2,'3/23/1998','4/20/1998','4/2/1998',2,62.22, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10968,N'ERNSH',1,'3/23/1998','4/20/1998','4/1/1998',3,74.60, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10969,N'COMMI',1,'3/23/1998','4/20/1998','3/30/1998',2,0.21, + N'Comércio Mineiro',N'Av. dos Lusíadas, 23',N'Sao Paulo', + N'SP',N'05432-043',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10970,N'BOLID',9,'3/24/1998','4/7/1998','4/24/1998',1,16.16, + N'Bólido Comidas preparadas',N'C/ Araquil, 67',N'Madrid', + NULL,N'28023',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10971,N'FRANR',2,'3/24/1998','4/21/1998','4/2/1998',2,121.82, + N'France restauration',N'54, rue Royale',N'Nantes', + NULL,N'44000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10972,N'LACOR',4,'3/24/1998','4/21/1998','3/26/1998',2,0.02, + N'La corne d''abondance',N'67, avenue de l''Europe',N'Versailles', + NULL,N'78000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10973,N'LACOR',6,'3/24/1998','4/21/1998','3/27/1998',2,15.17, + N'La corne d''abondance',N'67, avenue de l''Europe',N'Versailles', + NULL,N'78000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10974,N'SPLIR',3,'3/25/1998','4/8/1998','4/3/1998',3,12.96, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10975,N'BOTTM',1,'3/25/1998','4/22/1998','3/27/1998',3,32.27, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10976,N'HILAA',1,'3/25/1998','5/6/1998','4/3/1998',1,37.97, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10977,N'FOLKO',8,'3/26/1998','4/23/1998','4/10/1998',3,208.50, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10978,N'MAISD',9,'3/26/1998','4/23/1998','4/23/1998',2,32.82, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10979,N'ERNSH',8,'3/26/1998','4/23/1998','3/31/1998',2,353.07, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10980,N'FOLKO',4,'3/27/1998','5/8/1998','4/17/1998',1,1.26, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10981,N'HANAR',1,'3/27/1998','4/24/1998','4/2/1998',2,193.37, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10982,N'BOTTM',2,'3/27/1998','4/24/1998','4/8/1998',1,14.01, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10983,N'SAVEA',2,'3/27/1998','4/24/1998','4/6/1998',2,657.54, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10984,N'SAVEA',1,'3/30/1998','4/27/1998','4/3/1998',3,211.22, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10985,N'HUNGO',2,'3/30/1998','4/27/1998','4/2/1998',1,91.51, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10986,N'OCEAN',8,'3/30/1998','4/27/1998','4/21/1998',2,217.86, + N'Océano Atlántico Ltda.',N'Ing. Gustavo Moncada 8585 Piso 20-A',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10987,N'EASTC',8,'3/31/1998','4/28/1998','4/6/1998',1,185.48, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10988,N'RATTC',3,'3/31/1998','4/28/1998','4/10/1998',2,61.14, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10989,N'QUEDE',2,'3/31/1998','4/28/1998','4/2/1998',1,34.76, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10990,N'ERNSH',2,'4/1/1998','5/13/1998','4/7/1998',3,117.61, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10991,N'QUICK',1,'4/1/1998','4/29/1998','4/7/1998',1,38.51, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10992,N'THEBI',1,'4/1/1998','4/29/1998','4/3/1998',3,4.27, + N'The Big Cheese',N'89 Jefferson Way Suite 2',N'Portland', + N'OR',N'97201',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10993,N'FOLKO',7,'4/1/1998','4/29/1998','4/10/1998',3,8.81, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10994,N'VAFFE',2,'4/2/1998','4/16/1998','4/9/1998',3,65.53, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10995,N'PERIC',1,'4/2/1998','4/30/1998','4/6/1998',3,46.00, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10996,N'QUICK',4,'4/2/1998','4/30/1998','4/10/1998',2,1.12, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10997,N'LILAS',8,'4/3/1998','5/15/1998','4/13/1998',2,73.91, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10998,N'WOLZA',8,'4/3/1998','4/17/1998','4/17/1998',2,20.31, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10999,N'OTTIK',6,'4/3/1998','5/1/1998','4/10/1998',2,96.35, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11000,N'RATTC',2,'4/6/1998','5/4/1998','4/14/1998',3,55.12, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11001,N'FOLKO',2,'4/6/1998','5/4/1998','4/14/1998',2,197.30, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11002,N'SAVEA',4,'4/6/1998','5/4/1998','4/16/1998',1,141.16, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11003,N'THECR',3,'4/6/1998','5/4/1998','4/8/1998',3,14.91, + N'The Cracker Box',N'55 Grizzly Peak Rd.',N'Butte', + N'MT',N'59801',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11004,N'MAISD',3,'4/7/1998','5/5/1998','4/20/1998',1,44.84, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11005,N'WILMK',2,'4/7/1998','5/5/1998','4/10/1998',1,0.75, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11006,N'GREAL',3,'4/7/1998','5/5/1998','4/15/1998',2,25.19, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11007,N'PRINI',8,'4/8/1998','5/6/1998','4/13/1998',2,202.24, + N'Princesa Isabel Vinhos',N'Estrada da saúde n. 58',N'Lisboa', + NULL,N'1756',N'Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11008,N'ERNSH',7,'4/8/1998','5/6/1998',NULL,3,79.46, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11009,N'GODOS',2,'4/8/1998','5/6/1998','4/10/1998',1,59.11, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11010,N'REGGC',2,'4/9/1998','5/7/1998','4/21/1998',2,28.71, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11011,N'ALFKI',3,'4/9/1998','5/7/1998','4/13/1998',1,1.21, + N'Alfred''s Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11012,N'FRANK',1,'4/9/1998','4/23/1998','4/17/1998',3,242.95, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11013,N'ROMEY',2,'4/9/1998','5/7/1998','4/10/1998',1,32.99, + N'Romero y tomillo',N'Gran Vía, 1',N'Madrid', + NULL,N'28001',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11014,N'LINOD',2,'4/10/1998','5/8/1998','4/15/1998',3,23.60, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11015,N'SANTG',2,'4/10/1998','4/24/1998','4/20/1998',2,4.62, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11016,N'AROUT',9,'4/10/1998','5/8/1998','4/13/1998',2,33.80, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11017,N'ERNSH',9,'4/13/1998','5/11/1998','4/20/1998',2,754.26, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11018,N'LONEP',4,'4/13/1998','5/11/1998','4/16/1998',2,11.65, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11019,N'RANCH',6,'4/13/1998','5/11/1998',NULL,3,3.17, + N'Rancho grande',N'Av. del Libertador 900',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11020,N'OTTIK',2,'4/14/1998','5/12/1998','4/16/1998',2,43.30, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11021,N'QUICK',3,'4/14/1998','5/12/1998','4/21/1998',1,297.18, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11022,N'HANAR',9,'4/14/1998','5/12/1998','5/4/1998',2,6.27, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11023,N'BSBEV',1,'4/14/1998','4/28/1998','4/24/1998',2,123.83, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11024,N'EASTC',4,'4/15/1998','5/13/1998','4/20/1998',1,74.36, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11025,N'WARTH',6,'4/15/1998','5/13/1998','4/24/1998',3,29.17, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11026,N'FRANS',4,'4/15/1998','5/13/1998','4/28/1998',1,47.09, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11027,N'BOTTM',1,'4/16/1998','5/14/1998','4/20/1998',1,52.52, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11028,N'KOENE',2,'4/16/1998','5/14/1998','4/22/1998',1,29.59, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11029,N'CHOPS',4,'4/16/1998','5/14/1998','4/27/1998',1,47.84, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11030,N'SAVEA',7,'4/17/1998','5/15/1998','4/27/1998',2,830.75, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11031,N'SAVEA',6,'4/17/1998','5/15/1998','4/24/1998',2,227.22, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11032,N'WHITC',2,'4/17/1998','5/15/1998','4/23/1998',3,606.19, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11033,N'RICSU',7,'4/17/1998','5/15/1998','4/23/1998',3,84.74, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11034,N'OLDWO',8,'4/20/1998','6/1/1998','4/27/1998',1,40.32, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11035,N'SUPRD',2,'4/20/1998','5/18/1998','4/24/1998',2,0.17, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11036,N'DRACD',8,'4/20/1998','5/18/1998','4/22/1998',3,149.47, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11037,N'GODOS',7,'4/21/1998','5/19/1998','4/27/1998',1,3.20, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11038,N'SUPRD',1,'4/21/1998','5/19/1998','4/30/1998',2,29.59, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11039,N'LINOD',1,'4/21/1998','5/19/1998',NULL,2,65.00, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11040,N'GREAL',4,'4/22/1998','5/20/1998',NULL,3,18.84, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11041,N'CHOPS',3,'4/22/1998','5/20/1998','4/28/1998',2,48.22, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11042,N'COMMI',2,'4/22/1998','5/6/1998','5/1/1998',1,29.99, + N'Comércio Mineiro',N'Av. dos Lusíadas, 23',N'Sao Paulo', + N'SP',N'05432-043',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11043,N'SPECD',5,'4/22/1998','5/20/1998','4/29/1998',2,8.80, + N'Spécialités du monde',N'25, rue Lauriston',N'Paris', + NULL,N'75016',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11044,N'WOLZA',4,'4/23/1998','5/21/1998','5/1/1998',1,8.72, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11045,N'BOTTM',6,'4/23/1998','5/21/1998',NULL,2,70.58, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11046,N'WANDK',8,'4/23/1998','5/21/1998','4/24/1998',2,71.64, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11047,N'EASTC',7,'4/24/1998','5/22/1998','5/1/1998',3,46.62, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11048,N'BOTTM',7,'4/24/1998','5/22/1998','4/30/1998',3,24.12, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11049,N'GOURL',3,'4/24/1998','5/22/1998','5/4/1998',1,8.34, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11050,N'FOLKO',8,'4/27/1998','5/25/1998','5/5/1998',2,59.41, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11051,N'LAMAI',7,'4/27/1998','5/25/1998',NULL,3,2.79, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11052,N'HANAR',3,'4/27/1998','5/25/1998','5/1/1998',1,67.26, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11053,N'PICCO',2,'4/27/1998','5/25/1998','4/29/1998',2,53.05, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11054,N'CACTU',8,'4/28/1998','5/26/1998',NULL,1,0.33, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11055,N'HILAA',7,'4/28/1998','5/26/1998','5/5/1998',2,120.92, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11056,N'EASTC',8,'4/28/1998','5/12/1998','5/1/1998',2,278.96, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11057,N'NORTS',3,'4/29/1998','5/27/1998','5/1/1998',3,4.13, + N'North/South',N'South House 300 Queensbridge',N'London', + NULL,N'SW7 1RZ',N'UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11058,N'BLAUS',9,'4/29/1998','5/27/1998',NULL,3,31.14, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11059,N'RICAR',2,'4/29/1998','6/10/1998',NULL,2,85.80, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11060,N'FRANS',2,'4/30/1998','5/28/1998','5/4/1998',2,10.98, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11061,N'GREAL',4,'4/30/1998','6/11/1998',NULL,3,14.01, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11062,N'REGGC',4,'4/30/1998','5/28/1998',NULL,2,29.93, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11063,N'HUNGO',3,'4/30/1998','5/28/1998','5/6/1998',2,81.73, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11064,N'SAVEA',1,'5/1/1998','5/29/1998','5/4/1998',1,30.09, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11065,N'LILAS',8,'5/1/1998','5/29/1998',NULL,1,12.91, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11066,N'WHITC',7,'5/1/1998','5/29/1998','5/4/1998',2,44.72, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11067,N'DRACD',1,'5/4/1998','5/18/1998','5/6/1998',2,7.98, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11068,N'QUEEN',8,'5/4/1998','6/1/1998',NULL,2,81.75, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11069,N'TORTU',1,'5/4/1998','6/1/1998','5/6/1998',2,15.67, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11070,N'LEHMS',2,'5/5/1998','6/2/1998',NULL,1,136.00, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11071,N'LILAS',1,'5/5/1998','6/2/1998',NULL,1,0.93, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11072,N'ERNSH',4,'5/5/1998','6/2/1998',NULL,2,258.64, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11073,N'PERIC',2,'5/5/1998','6/2/1998',NULL,2,24.95, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11074,N'SIMOB',7,'5/6/1998','6/3/1998',NULL,2,18.44, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11075,N'RICSU',8,'5/6/1998','6/3/1998',NULL,2,6.19, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11076,N'BONAP',4,'5/6/1998','6/3/1998',NULL,2,38.28, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11077,N'RATTC',1,'5/6/1998','6/3/1998',NULL,2,8.53, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA'); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(1,'Chai',1,1,'10 boxes x 20 bags',18,39,0,10,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(2,'Chang',1,1,'24 - 12 oz bottles',19,17,40,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(3,'Aniseed Syrup',1,2,'12 - 550 ml bottles',10,13,70,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(4,'Chef Anton''s Cajun Seasoning',2,2,'48 - 6 oz jars',22,53,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(5,'Chef Anton''s Gumbo Mix',2,2,'36 boxes',21.35,0,0,0,true); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(6,'Grandma''s Boysenberry Spread',3,2,'12 - 8 oz jars',25,120,0,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(7,'Uncle Bob''s Organic Dried Pears',3,7,'12 - 1 lb pkgs.',30,15,0,10,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(8,'Northwoods Cranberry Sauce',3,2,'12 - 12 oz jars',40,6,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(9,'Mishi Kobe Niku',4,6,'18 - 500 g pkgs.',97,29,0,0,true); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(10,'Ikura',4,8,'12 - 200 ml jars',31,31,0,0,false); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(11,'Queso Cabrales',5,4,'1 kg pkg.',21,22,30,30,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(12,'Queso Manchego La Pastora',5,4,'10 - 500 g pkgs.',38,86,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(13,'Konbu',6,8,'2 kg box',6,24,0,5,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(14,'Tofu',6,7,'40 - 100 g pkgs.',23.25,35,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(15,'Genen Shouyu',6,2,'24 - 250 ml bottles',15.5,39,0,5,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(16,'Pavlova',7,3,'32 - 500 g boxes',17.45,29,0,10,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(17,'Alice Mutton',7,6,'20 - 1 kg tins',39,0,0,0,true); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(18,'Carnarvon Tigers',7,8,'16 kg pkg.',62.5,42,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(19,'Teatime Chocolate Biscuits',8,3,'10 boxes x 12 pieces',9.2,25,0,5,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(20,'Sir Rodney''s Marmalade',8,3,'30 gift boxes',81,40,0,0,false); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(21,'Sir Rodney''s Scones',8,3,'24 pkgs. x 4 pieces',10,3,40,5,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(22,'Gustaf''s Knäckebröd',9,5,'24 - 500 g pkgs.',21,104,0,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(23,'Tunnbröd',9,5,'12 - 250 g pkgs.',9,61,0,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(24,'Guaraná Fantástica',10,1,'12 - 355 ml cans',4.5,20,0,0,true); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(25,'NuNuCa Nuß-Nougat-Creme',11,3,'20 - 450 g glasses',14,76,0,30,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(26,'Gumbär Gummibärchen',11,3,'100 - 250 g bags',31.23,15,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(27,'Schoggi Schokolade',11,3,'100 - 100 g pieces',43.9,49,0,30,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(28,'Rössle Sauerkraut',12,7,'25 - 825 g cans',45.6,26,0,0,true); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(29,'Thüringer Rostbratwurst',12,6,'50 bags x 30 sausgs.',123.79,0,0,0,true); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(30,'Nord-Ost Matjeshering',13,8,'10 - 200 g glasses',25.89,10,0,15,false); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(31,'Gorgonzola Telino',14,4,'12 - 100 g pkgs',12.5,0,70,20,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(32,'Mascarpone Fabioli',14,4,'24 - 200 g pkgs.',32,9,40,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(33,'Geitost',15,4,'500 g',2.5,112,0,20,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(34,'Sasquatch Ale',16,1,'24 - 12 oz bottles',14,111,0,15,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(35,'Steeleye Stout',16,1,'24 - 12 oz bottles',18,20,0,15,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(36,'Inlagd Sill',17,8,'24 - 250 g jars',19,112,0,20,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(37,'Gravad lax',17,8,'12 - 500 g pkgs.',26,11,50,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(38,'Côte de Blaye',18,1,'12 - 75 cl bottles',263.5,17,0,15,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(39,'Chartreuse verte',18,1,'750 cc per bottle',18,69,0,5,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(40,'Boston Crab Meat',19,8,'24 - 4 oz tins',18.4,123,0,30,false); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(41,'Jack''s New England Clam Chowder',19,8,'12 - 12 oz cans',9.65,85,0,10,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(42,'Singaporean Hokkien Fried Mee',20,5,'32 - 1 kg pkgs.',14,26,0,0,true); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(43,'Ipoh Coffee',20,1,'16 - 500 g tins',46,17,10,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(44,'Gula Malacca',20,2,'20 - 2 kg bags',19.45,27,0,15,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(45,'Rogede sild',21,8,'1k pkg.',9.5,5,70,15,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(46,'Spegesild',21,8,'4 - 450 g glasses',12,95,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(47,'Zaanse koeken',22,3,'10 - 4 oz boxes',9.5,36,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(48,'Chocolade',22,3,'10 pkgs.',12.75,15,70,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(49,'Maxilaku',23,3,'24 - 50 g pkgs.',20,10,60,15,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(50,'Valkoinen suklaa',23,3,'12 - 100 g bars',16.25,65,0,30,false); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(51,'Manjimup Dried Apples',24,7,'50 - 300 g pkgs.',53,20,0,10,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(52,'Filo Mix',24,5,'16 - 2 kg boxes',7,38,0,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(53,'Perth Pasties',24,6,'48 pieces',32.8,0,0,0,true); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(54,'Tourtière',25,6,'16 pies',7.45,21,0,10,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(55,'Pâté chinois',25,6,'24 boxes x 2 pies',24,115,0,20,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(56,'Gnocchi di nonna Alice',26,5,'24 - 250 g pkgs.',38,21,10,30,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(57,'Ravioli Angelo',26,5,'24 - 250 g pkgs.',19.5,36,0,20,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(58,'Escargots de Bourgogne',27,8,'24 pieces',13.25,62,0,20,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(59,'Raclette Courdavault',28,4,'5 kg pkg.',55,79,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(60,'Camembert Pierrot',28,4,'15 - 300 g rounds',34,19,0,0,false); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(61,'Sirop d''érable',29,2,'24 - 500 ml bottles',28.5,113,0,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(62,'Tarte au sucre',29,3,'48 pies',49.3,17,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(63,'Vegie-spread',7,2,'15 - 625 g jars',43.9,24,0,5,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(64,'Wimmers gute Semmelknödel',12,5,'20 bags x 4 pieces',33.25,22,80,30,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(65,'Louisiana Fiery Hot Pepper Sauce',2,2,'32 - 8 oz bottles',21.05,76,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(66,'Louisiana Hot Spiced Okra',2,2,'24 - 8 oz jars',17,4,100,20,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(67,'Laughing Lumberjack Lager',16,1,'24 - 12 oz bottles',14,52,0,10,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(68,'Scottish Longbreads',8,3,'10 boxes x 8 pieces',12.5,6,10,15,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(69,'Gudbrandsdalsost',15,4,'10 kg pkg.',36,26,0,15,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(70,'Outback Lager',7,1,'24 - 355 ml bottles',15,15,10,30,false); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(71,'Flotemysost',15,4,'10 - 500 g pkgs.',21.5,26,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(72,'Mozzarella di Giovanni',14,4,'24 - 200 g pkgs.',34.8,14,0,0,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(73,'Röd Kaviar',17,8,'24 - 150 g jars',15,101,0,5,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(74,'Longlife Tofu',4,7,'5 kg pkg.',10,4,20,5,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(75,'Rhönbräu Klosterbier',12,1,'24 - 0.5 l bottles',7.75,125,0,25,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(76,'Lakkalikööri',23,1,'500 ml',18,57,0,20,false); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(77,'Original Frankfurter grüne Soße',12,2,'12 boxes',13,32,0,15,false); + +INSERT INTO "Shippers"("ShipperID","CompanyName","Phone") VALUES(1,'Speedy Express','(503) 555-9831'); +INSERT INTO "Shippers"("ShipperID","CompanyName","Phone") VALUES(2,'United Package','(503) 555-3199'); +INSERT INTO "Shippers"("ShipperID","CompanyName","Phone") VALUES(3,'Federal Shipping','(503) 555-9931'); + +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(1,'Exotic Liquids','Charlotte Cooper','Purchasing Manager','49 Gilbert St.','London',NULL,'EC1 4SD','UK','(171) 555-2222',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(2,'New Orleans Cajun Delights','Shelley Burke','Order Administrator','P.O. Box 78934','New Orleans','LA','70117','USA','(100) 555-4822',NULL,'#CAJUN.HTM#'); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(3,'Grandma Kelly''s Homestead','Regina Murphy','Sales Representative','707 Oxford Rd.','Ann Arbor','MI','48104','USA','(313) 555-5735','(313) 555-3349',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(4,'Tokyo Traders','Yoshi Nagase','Marketing Manager','9-8 Sekimai Musashino-shi','Tokyo',NULL,'100','Japan','(03) 3555-5011',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(5,'Cooperativa de Quesos ''Las Cabras''','Antonio del Valle Saavedra','Export Administrator','Calle del Rosal 4','Oviedo','Asturias','33007','Spain','(98) 598 76 54',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(6,'Mayumi''s','Mayumi Ohno','Marketing Representative','92 Setsuko Chuo-ku','Osaka',NULL,'545','Japan','(06) 431-7877',NULL,'Mayumi''s (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/mayumi.htm#'); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(7,'Pavlova, Ltd.','Ian Devling','Marketing Manager','74 Rose St. Moonie Ponds','Melbourne','Victoria','3058','Australia','(03) 444-2343','(03) 444-6588',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(8,'Specialty Biscuits, Ltd.','Peter Wilson','Sales Representative','29 King''s Way','Manchester',NULL,'M14 GSD','UK','(161) 555-4448',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(9,'PB Knäckebröd AB','Lars Peterson','Sales Agent','Kaloadagatan 13','Göteborg',NULL,'S-345 67','Sweden','031-987 65 43','031-987 65 91',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(10,'Refrescos Americanas LTDA','Carlos Diaz','Marketing Manager','Av. das Americanas 12.890','Sao Paulo',NULL,'5442','Brazil','(11) 555 4640',NULL,NULL); + +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(11,'Heli Süßwaren GmbH & Co. KG','Petra Winkler','Sales Manager','Tiergartenstraße 5','Berlin',NULL,'10785','Germany','(010) 9984510',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(12,'Plutzer Lebensmittelgroßmärkte AG','Martin Bein','International Marketing Mgr.','Bogenallee 51','Frankfurt',NULL,'60439','Germany','(069) 992755',NULL,'Plutzer (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/plutzer.htm#'); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(13,'Nord-Ost-Fisch Handelsgesellschaft mbH','Sven Petersen','Coordinator Foreign Markets','Frahmredder 112a','Cuxhaven',NULL,'27478','Germany','(04721) 8713','(04721) 8714',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(14,'Formaggi Fortini s.r.l.','Elio Rossi','Sales Representative','Viale Dante, 75','Ravenna',NULL,'48100','Italy','(0544) 60323','(0544) 60603','#FORMAGGI.HTM#'); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(15,'Norske Meierier','Beate Vileid','Marketing Manager','Hatlevegen 5','Sandvika',NULL,'1320','Norway','(0)2-953010',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(16,'Bigfoot Breweries','Cheryl Saylor','Regional Account Rep.','3400 - 8th Avenue Suite 210','Bend','OR','97101','USA','(503) 555-9931',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(17,'Svensk Sjöföda AB','Michael Björn','Sales Representative','Brovallavägen 231','Stockholm',NULL,'S-123 45','Sweden','08-123 45 67',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(18,'Aux joyeux ecclésiastiques','Guylène Nodier','Sales Manager','203, Rue des Francs-Bourgeois','Paris',NULL,'75004','France','(1) 03.83.00.68','(1) 03.83.00.62',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(19,'New England Seafood Cannery','Robb Merchant','Wholesale Account Agent','Order Processing Dept. 2100 Paul Revere Blvd.','Boston','MA','02134','USA','(617) 555-3267','(617) 555-3389',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(20,'Leka Trading','Chandra Leka','Owner','471 Serangoon Loop, Suite #402','Singapore',NULL,'0512','Singapore','555-8787',NULL,NULL); + +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(21,'Lyngbysild','Niels Petersen','Sales Manager','Lyngbysild Fiskebakken 10','Lyngby',NULL,'2800','Denmark','43844108','43844115',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(22,'Zaanse Snoepfabriek','Dirk Luchte','Accounting Manager','Verkoop Rijnweg 22','Zaandam',NULL,'9999 ZZ','Netherlands','(12345) 1212','(12345) 1210',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(23,'Karkki Oy','Anne Heikkonen','Product Manager','Valtakatu 12','Lappeenranta',NULL,'53120','Finland','(953) 10956',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(24,'G''day, Mate','Wendy Mackenzie','Sales Representative','170 Prince Edward Parade Hunter''s Hill','Sydney','NSW','2042','Australia','(02) 555-5914','(02) 555-4873','G''day Mate (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/gdaymate.htm#'); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(25,'Ma Maison','Jean-Guy Lauzon','Marketing Manager','2960 Rue St. Laurent','Montréal','Québec','H1J 1C3','Canada','(514) 555-9022',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(26,'Pasta Buttini s.r.l.','Giovanni Giudici','Order Administrator','Via dei Gelsomini, 153','Salerno',NULL,'84100','Italy','(089) 6547665','(089) 6547667',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(27,'Escargots Nouveaux','Marie Delamare','Sales Manager','22, rue H. Voiron','Montceau',NULL,'71300','France','85.57.00.07',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(28,'Gai pâturage','Eliane Noz','Sales Representative','Bat. B 3, rue des Alpes','Annecy',NULL,'74000','France','38.76.98.06','38.76.98.58',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(29,'Forêts d''érables','Chantal Goulet','Accounting Manager','148 rue Chasseur','Ste-Hyacinthe','Québec','J2S 7S8','Canada','(514) 555-2955','(514) 555-2921',NULL); + +/* The following adds stored procedures */ + +/* if exists (select * from sysobjects where id = object_id('dbo.CustOrdersDetail')); + drop procedure dbo.CustOrdersDetail +GO + +CREATE PROCEDURE CustOrdersDetail @OrderID int +AS +SELECT ProductName, + UnitPrice=ROUND(Od.UnitPrice, 2), + Quantity, + Discount=CONVERT(int, Discount * 100), + ExtendedPrice=ROUND(CONVERT(money, Quantity * (1 - Discount) * Od.UnitPrice), 2); +FROM Products P, [Order Details] Od +WHERE Od.ProductID = P.ProductID and Od.OrderID = @OrderID +go + + +if exists (select * from sysobjects where id = object_id('dbo.CustOrdersOrders')); + drop procedure dbo.CustOrdersOrders +GO + +CREATE PROCEDURE CustOrdersOrders @CustomerID char(5); +AS +SELECT OrderID, + OrderDate, + RequiredDate, + ShippedDate +FROM Orders +WHERE CustomerID = @CustomerID +ORDER BY OrderID +GO + + +if exists (select * from sysobjects where id = object_id('dbo.CustOrderHist') and sysstat & 0xf = 4); + drop procedure dbo.CustOrderHist +GO +CREATE PROCEDURE CustOrderHist @CustomerID char(5); +AS +SELECT ProductName, Total=SUM(Quantity); +FROM Products P, [Order Details] OD, Orders O, Customers C +WHERE C.CustomerID = @CustomerID +AND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID +GROUP BY ProductName +GO + +if exists (select * from sysobjects where id = object_id('dbo.SalesByCategory') and sysstat & 0xf = 4); + drop procedure dbo.SalesByCategory +GO +CREATE PROCEDURE SalesByCategory + @CategoryName varchar(15), @OrdYear varchar(4) = '1998' +AS +IF @OrdYear != '1996' AND @OrdYear != '1997' AND @OrdYear != '1998' +BEGIN + SELECT @OrdYear = '1998' +END + +SELECT ProductName, + TotalPurchase=ROUND(SUM(CONVERT(decimal(14,2), OD.Quantity * (1-OD.Discount) * OD.UnitPrice)), 0); +FROM [Order Details] OD, Orders O, Products P, Categories C +WHERE OD.OrderID = O.OrderID + AND OD.ProductID = P.ProductID + AND P.CategoryID = C.CategoryID + AND C.CategoryName = @CategoryName + AND SUBSTRING(CONVERT(varchar(22), O.OrderDate, 111), 1, 4) = @OrdYear +GROUP BY ProductName +ORDER BY ProductName +GO +*/ + +/* The follwing adds tables to the Northwind database */ + + +CREATE TABLE "CustomerCustomerDemo" + ("CustomerID" char (5) NOT NULL, + "CustomerTypeID" char (10) NOT NULL +); + +CREATE TABLE "CustomerDemographics" + ("CustomerTypeID" char (10) NOT NULL , + "CustomerDesc" text NULL +); + +CREATE TABLE "Region" + ( "RegionID" serial , + "RegionDescription" char (50) NOT NULL +); + +CREATE TABLE "Territories" + ("TerritoryID" varchar (20) NOT NULL , + "TerritoryDescription" char (50) NOT NULL , + "RegionID" int4 NOT NULL +); + +CREATE TABLE "EmployeeTerritories" + ("EmployeeID" int4 NOT NULL, + "TerritoryID" varchar (20) NOT NULL +); + +-- The following adds data to the tables just created. + +INSERT INTO "Region" VALUES (1,'Eastern'); +INSERT INTO "Region" VALUES (2,'Western'); +INSERT INTO "Region" VALUES (3,'Northern'); +INSERT INTO "Region" VALUES (4,'Southern'); + +INSERT INTO "Territories" VALUES ('01581','Westboro',1); +INSERT INTO "Territories" VALUES ('01730','Bedford',1); +INSERT INTO "Territories" VALUES ('01833','Georgetow',1); +INSERT INTO "Territories" VALUES ('02116','Boston',1); +INSERT INTO "Territories" VALUES ('02139','Cambridge',1); +INSERT INTO "Territories" VALUES ('02184','Braintree',1); +INSERT INTO "Territories" VALUES ('02903','Providence',1); +INSERT INTO "Territories" VALUES ('03049','Hollis',3); +INSERT INTO "Territories" VALUES ('03801','Portsmouth',3); +INSERT INTO "Territories" VALUES ('06897','Wilton',1); +INSERT INTO "Territories" VALUES ('07960','Morristown',1); +INSERT INTO "Territories" VALUES ('08837','Edison',1); +INSERT INTO "Territories" VALUES ('10019','New York',1); +INSERT INTO "Territories" VALUES ('10038','New York',1); +INSERT INTO "Territories" VALUES ('11747','Mellvile',1); +INSERT INTO "Territories" VALUES ('14450','Fairport',1); +INSERT INTO "Territories" VALUES ('19428','Philadelphia',3); +INSERT INTO "Territories" VALUES ('19713','Neward',1); +INSERT INTO "Territories" VALUES ('20852','Rockville',1); +INSERT INTO "Territories" VALUES ('27403','Greensboro',1); +INSERT INTO "Territories" VALUES ('27511','Cary',1); +INSERT INTO "Territories" VALUES ('29202','Columbia',4); +INSERT INTO "Territories" VALUES ('30346','Atlanta',4); +INSERT INTO "Territories" VALUES ('31406','Savannah',4); +INSERT INTO "Territories" VALUES ('32859','Orlando',4); +INSERT INTO "Territories" VALUES ('33607','Tampa',4); +INSERT INTO "Territories" VALUES ('40222','Louisville',1); +INSERT INTO "Territories" VALUES ('44122','Beachwood',3); +INSERT INTO "Territories" VALUES ('45839','Findlay',3); +INSERT INTO "Territories" VALUES ('48075','Southfield',3); +INSERT INTO "Territories" VALUES ('48084','Troy',3); +INSERT INTO "Territories" VALUES ('48304','Bloomfield Hills',3); +INSERT INTO "Territories" VALUES ('53404','Racine',3); +INSERT INTO "Territories" VALUES ('55113','Roseville',3); +INSERT INTO "Territories" VALUES ('55439','Minneapolis',3); +INSERT INTO "Territories" VALUES ('60179','Hoffman Estates',2); +INSERT INTO "Territories" VALUES ('60601','Chicago',2); +INSERT INTO "Territories" VALUES ('72716','Bentonville',4); +INSERT INTO "Territories" VALUES ('75234','Dallas',4); +INSERT INTO "Territories" VALUES ('78759','Austin',4); +INSERT INTO "Territories" VALUES ('80202','Denver',2); +INSERT INTO "Territories" VALUES ('80909','Colorado Springs',2); +INSERT INTO "Territories" VALUES ('85014','Phoenix',2); +INSERT INTO "Territories" VALUES ('85251','Scottsdale',2); +INSERT INTO "Territories" VALUES ('90405','Santa Monica',2); +INSERT INTO "Territories" VALUES ('94025','Menlo Park',2); +INSERT INTO "Territories" VALUES ('94105','San Francisco',2); +INSERT INTO "Territories" VALUES ('95008','Campbell',2); +INSERT INTO "Territories" VALUES ('95054','Santa Clara',2); +INSERT INTO "Territories" VALUES ('95060','Santa Cruz',2); +INSERT INTO "Territories" VALUES ('98004','Bellevue',2); +INSERT INTO "Territories" VALUES ('98052','Redmond',2); +INSERT INTO "Territories" VALUES ('98104','Seattle',2); + +INSERT INTO "EmployeeTerritories" VALUES (1,'06897'); +INSERT INTO "EmployeeTerritories" VALUES (1,'19713'); +INSERT INTO "EmployeeTerritories" VALUES (2,'01581'); +INSERT INTO "EmployeeTerritories" VALUES (2,'01730'); +INSERT INTO "EmployeeTerritories" VALUES (2,'01833'); +INSERT INTO "EmployeeTerritories" VALUES (2,'02116'); +INSERT INTO "EmployeeTerritories" VALUES (2,'02139'); +INSERT INTO "EmployeeTerritories" VALUES (2,'02184'); +INSERT INTO "EmployeeTerritories" VALUES (2,'40222'); +INSERT INTO "EmployeeTerritories" VALUES (3,'30346'); +INSERT INTO "EmployeeTerritories" VALUES (3,'31406'); +INSERT INTO "EmployeeTerritories" VALUES (3,'32859'); +INSERT INTO "EmployeeTerritories" VALUES (3,'33607'); +INSERT INTO "EmployeeTerritories" VALUES (4,'20852'); +INSERT INTO "EmployeeTerritories" VALUES (4,'27403'); +INSERT INTO "EmployeeTerritories" VALUES (4,'27511'); +INSERT INTO "EmployeeTerritories" VALUES (5,'02903'); +INSERT INTO "EmployeeTerritories" VALUES (5,'07960'); +INSERT INTO "EmployeeTerritories" VALUES (5,'08837'); +INSERT INTO "EmployeeTerritories" VALUES (5,'10019'); +INSERT INTO "EmployeeTerritories" VALUES (5,'10038'); +INSERT INTO "EmployeeTerritories" VALUES (5,'11747'); +INSERT INTO "EmployeeTerritories" VALUES (5,'14450'); +INSERT INTO "EmployeeTerritories" VALUES (6,'85014'); +INSERT INTO "EmployeeTerritories" VALUES (6,'85251'); +INSERT INTO "EmployeeTerritories" VALUES (6,'98004'); +INSERT INTO "EmployeeTerritories" VALUES (6,'98052'); +INSERT INTO "EmployeeTerritories" VALUES (6,'98104'); +INSERT INTO "EmployeeTerritories" VALUES (7,'60179'); +INSERT INTO "EmployeeTerritories" VALUES (7,'60601'); +INSERT INTO "EmployeeTerritories" VALUES (7,'80202'); +INSERT INTO "EmployeeTerritories" VALUES (7,'80909'); +INSERT INTO "EmployeeTerritories" VALUES (7,'90405'); +INSERT INTO "EmployeeTerritories" VALUES (7,'94025'); +INSERT INTO "EmployeeTerritories" VALUES (7,'94105'); +INSERT INTO "EmployeeTerritories" VALUES (7,'95008'); +INSERT INTO "EmployeeTerritories" VALUES (7,'95054'); +INSERT INTO "EmployeeTerritories" VALUES (7,'95060'); +INSERT INTO "EmployeeTerritories" VALUES (8,'19428'); +INSERT INTO "EmployeeTerritories" VALUES (8,'44122'); +INSERT INTO "EmployeeTerritories" VALUES (8,'45839'); +INSERT INTO "EmployeeTerritories" VALUES (8,'53404'); +INSERT INTO "EmployeeTerritories" VALUES (9,'03049'); +INSERT INTO "EmployeeTerritories" VALUES (9,'03801'); +INSERT INTO "EmployeeTerritories" VALUES (9,'48075'); +INSERT INTO "EmployeeTerritories" VALUES (9,'48084'); +INSERT INTO "EmployeeTerritories" VALUES (9,'48304'); +INSERT INTO "EmployeeTerritories" VALUES (9,'55113'); +INSERT INTO "EmployeeTerritories" VALUES (9,'55439'); + +COMMIT; + + +-- The following adds constraints to the Northwind database + +ALTER TABLE "CustomerCustomerDemo" + ADD CONSTRAINT "PK_CustomerCustomerDemo" PRIMARY KEY + ( + "CustomerID", + "CustomerTypeID" + ); + +ALTER TABLE "CustomerDemographics" + ADD CONSTRAINT "PK_CustomerDemographics" PRIMARY KEY + ( + "CustomerTypeID" + ); + +ALTER TABLE "CustomerCustomerDemo" + ADD CONSTRAINT "FK_CustomerCustomerDemo" FOREIGN KEY + ( + "CustomerTypeID" + ) REFERENCES "CustomerDemographics" ( + "CustomerTypeID" + ); + +ALTER TABLE "CustomerCustomerDemo" + ADD CONSTRAINT "FK_CustomerCustomerDemo_Customers" FOREIGN KEY + ( + "CustomerID" + ) REFERENCES "Customers" ( + "CustomerID" + ); + +ALTER TABLE "Region" + ADD CONSTRAINT "PK_Region" PRIMARY KEY + ( + "RegionID" + ); + +ALTER TABLE "Territories" + ADD CONSTRAINT "PK_Territories" PRIMARY KEY + ( + "TerritoryID" + ); + +ALTER TABLE "Territories" + ADD CONSTRAINT "FK_Territories_Region" FOREIGN KEY + ( + "RegionID" + ) REFERENCES "Region" ( + "RegionID" + ); + +ALTER TABLE "EmployeeTerritories" + ADD CONSTRAINT "PK_EmployeeTerritories" PRIMARY KEY + ( + "EmployeeID", + "TerritoryID" + ); + +ALTER TABLE "EmployeeTerritories" + ADD CONSTRAINT "FK_EmployeeTerritories_Employees" FOREIGN KEY + ( + "EmployeeID" + ) REFERENCES "Employees" ( + "EmployeeID" + ); + + +ALTER TABLE "EmployeeTerritories" + ADD CONSTRAINT "FK_EmployeeTerritories_Territories" FOREIGN KEY + ( + "TerritoryID" + ) REFERENCES "Territories" ( + "TerritoryID" + ); + +SELECT setval('"Products_ProductID_seq"', (SELECT max("ProductID")+1 FROM "Products")); +SELECT setval('"Region_RegionID_seq"', (SELECT max("RegionID")+1 FROM "Region")); +SELECT setval('"Suppliers_SupplierID_seq"', (SELECT max("SupplierID")+1 FROM "Suppliers")); \ No newline at end of file diff --git a/mcs/class/System.Data.Linq/tests/instnwnd.SQLite.sql b/mcs/class/System.Data.Linq/tests/instnwnd.SQLite.sql new file mode 100644 index 00000000000..668169401dd --- /dev/null +++ b/mcs/class/System.Data.Linq/tests/instnwnd.SQLite.sql @@ -0,0 +1,9031 @@ +/* +** Copyright Microsoft, Inc. 1994 - 2000 +** All Rights Reserved. +** +** Changes for SQLite Copyright 2009 Novell, Inc. +*/ + +/* +DROP TABLE Employees; +DROP TABLE Categories; +DROP TABLE Customers; +DROP TABLE Shippers; +DROP TABLE Suppliers; +DROP TABLE Orders; +DROP TABLE Products; +DROP TABLE "Order Details"; +DROP TABLE CustomerCustomerDemo; +DROP TABLE CustomerDemographics; +DROP TABLE Region; +DROP TABLE Territories; +DROP TABLE EmployeeTerritories; + +DROP view "Customer and Suppliers by City"; +DROP view "Alphabetical list of products"; +DROP view "Current Product List"; +DROP view "Orders Qry"; +DROP view "Products Above Average Price"; +DROP view "Products by Category"; +DROP view "Quarterly Orders"; +DROP view Invoices; +DROP view "Order Details Extended"; +DROP view "Order Subtotals"; +DROP view "Product Sales for 1997"; +DROP view "Category Sales for 1997"; +DROP view "Sales by Category"; +DROP view "Sales Totals by Amount"; +DROP view "Summary of Sales by Quarter"; +DROP view "Summary of Sales by Year"; +*/ + +CREATE TABLE "Employees" ( + "EmployeeID" INTEGER NOT NULL , + "LastName" nvarchar (20) NOT NULL , + "FirstName" nvarchar (10) NOT NULL , + "Title" nvarchar (30) NULL , + "TitleOfCourtesy" nvarchar (25) NULL , + "BirthDate" "datetime" NULL , + "HireDate" "datetime" NULL , + "Address" nvarchar (60) NULL , + "City" nvarchar (15) NULL , + "Region" nvarchar (15) NULL , + "PostalCode" nvarchar (10) NULL , + "Country" nvarchar (15) NULL , + "HomePhone" nvarchar (24) NULL , + "Extension" nvarchar (4) NULL , + "Photo" "image" NULL , + "Notes" "ntext" NULL , + "ReportsTo" "int" NULL , + "PhotoPath" nvarchar (255) NULL , + CONSTRAINT "PK_Employees" PRIMARY KEY + ( + "EmployeeID" + ), + CONSTRAINT "FK_Employees_Employees" FOREIGN KEY + ( + "ReportsTo" + ) REFERENCES "Employees" ( + "EmployeeID" + ) +); + +CREATE TABLE "Categories" ( + "CategoryID" INTEGER NOT NULL , + "CategoryName" nvarchar (15) NOT NULL , + "Description" "ntext" NULL , + "Picture" "image" NULL , + CONSTRAINT "PK_Categories" PRIMARY KEY + ( + "CategoryID" + ) +); + +CREATE TABLE "Customers" ( + "CustomerID" nchar (5) NOT NULL , + "CompanyName" nvarchar (40) NOT NULL , + "ContactName" nvarchar (30) NULL , + "ContactTitle" nvarchar (30) NULL , + "Address" nvarchar (60) NULL , + "City" nvarchar (15) NULL , + "Region" nvarchar (15) NULL , + "PostalCode" nvarchar (10) NULL , + "Country" nvarchar (15) NULL , + "Phone" nvarchar (24) NULL , + "Fax" nvarchar (24) NULL , + CONSTRAINT "PK_Customers" PRIMARY KEY + ( + "CustomerID" + ) +); + +CREATE TABLE "Shippers" ( + "ShipperID" INTEGER NOT NULL , + "CompanyName" nvarchar (40) NOT NULL , + "Phone" nvarchar (24) NULL , + CONSTRAINT "PK_Shippers" PRIMARY KEY + ( + "ShipperID" + ) +); + +CREATE TABLE "Suppliers" ( + "SupplierID" INTEGER NOT NULL , + "CompanyName" nvarchar (40) NOT NULL , + "ContactName" nvarchar (30) NULL , + "ContactTitle" nvarchar (30) NULL , + "Address" nvarchar (60) NULL , + "City" nvarchar (15) NULL , + "Region" nvarchar (15) NULL , + "PostalCode" nvarchar (10) NULL , + "Country" nvarchar (15) NULL , + "Phone" nvarchar (24) NULL , + "Fax" nvarchar (24) NULL , + "HomePage" "ntext" NULL , + CONSTRAINT "PK_Suppliers" PRIMARY KEY + ( + "SupplierID" + ) +); + +CREATE TABLE "Orders" ( + "OrderID" INTEGER NOT NULL , + "CustomerID" nchar (5) NULL , + "EmployeeID" "int" NULL , + "OrderDate" "datetime" NULL , + "RequiredDate" "datetime" NULL , + "ShippedDate" "datetime" NULL , + "ShipVia" "int" NULL , + "Freight" "money" NULL CONSTRAINT "DF_Orders_Freight" DEFAULT (0), + "ShipName" nvarchar (40) NULL , + "ShipAddress" nvarchar (60) NULL , + "ShipCity" nvarchar (15) NULL , + "ShipRegion" nvarchar (15) NULL , + "ShipPostalCode" nvarchar (10) NULL , + "ShipCountry" nvarchar (15) NULL , + CONSTRAINT "PK_Orders" PRIMARY KEY + ( + "OrderID" + ), + CONSTRAINT "FK_Orders_Customers" FOREIGN KEY + ( + "CustomerID" + ) REFERENCES "Customers" ( + "CustomerID" + ), + CONSTRAINT "FK_Orders_Employees" FOREIGN KEY + ( + "EmployeeID" + ) REFERENCES "Employees" ( + "EmployeeID" + ), + CONSTRAINT "FK_Orders_Shippers" FOREIGN KEY + ( + "ShipVia" + ) REFERENCES "Shippers" ( + "ShipperID" + ) +); + +CREATE TABLE "Products" ( + "ProductID" INTEGER NOT NULL , + "ProductName" nvarchar (40) NOT NULL , + "SupplierID" "int" NULL , + "CategoryID" "int" NULL , + "QuantityPerUnit" nvarchar (20) NULL , + "UnitPrice" "money" NULL CONSTRAINT "DF_Products_UnitPrice" DEFAULT (0), + "UnitsInStock" "smallint" NULL CONSTRAINT "DF_Products_UnitsInStock" DEFAULT (0), + "UnitsOnOrder" "smallint" NULL CONSTRAINT "DF_Products_UnitsOnOrder" DEFAULT (0), + "ReorderLevel" "smallint" NULL CONSTRAINT "DF_Products_ReorderLevel" DEFAULT (0), + "Discontinued" "bit" NOT NULL CONSTRAINT "DF_Products_Discontinued" DEFAULT (0), + CONSTRAINT "PK_Products" PRIMARY KEY + ( + "ProductID" + ), + CONSTRAINT "FK_Products_Categories" FOREIGN KEY + ( + "CategoryID" + ) REFERENCES "Categories" ( + "CategoryID" + ), + CONSTRAINT "FK_Products_Suppliers" FOREIGN KEY + ( + "SupplierID" + ) REFERENCES "Suppliers" ( + "SupplierID" + ), + CONSTRAINT "CK_Products_UnitPrice" CHECK (UnitPrice >= 0), + CONSTRAINT "CK_ReorderLevel" CHECK (ReorderLevel >= 0), + CONSTRAINT "CK_UnitsInStock" CHECK (UnitsInStock >= 0), + CONSTRAINT "CK_UnitsOnOrder" CHECK (UnitsOnOrder >= 0) +); + +CREATE TABLE "Order Details" ( + "OrderID" "int" NOT NULL , + "ProductID" "int" NOT NULL , + "UnitPrice" "money" NOT NULL CONSTRAINT "DF_Order_Details_UnitPrice" DEFAULT (0), + "Quantity" "smallint" NOT NULL CONSTRAINT "DF_Order_Details_Quantity" DEFAULT (1), + "Discount" "real" NOT NULL CONSTRAINT "DF_Order_Details_Discount" DEFAULT (0), + CONSTRAINT "PK_Order_Details" PRIMARY KEY + ( + "OrderID", + "ProductID" + ), + CONSTRAINT "FK_Order_Details_Orders" FOREIGN KEY + ( + "OrderID" + ) REFERENCES "Orders" ( + "OrderID" + ), + CONSTRAINT "FK_Order_Details_Products" FOREIGN KEY + ( + "ProductID" + ) REFERENCES "Products" ( + "ProductID" + ), + CONSTRAINT "CK_Discount" CHECK (Discount >= 0 and (Discount <= 1)), + CONSTRAINT "CK_Quantity" CHECK (Quantity > 0), + CONSTRAINT "CK_UnitPrice" CHECK (UnitPrice >= 0) +); + +create view "Customer and Suppliers by City" AS +SELECT City, CompanyName, ContactName, 'Customers' AS Relationship +FROM Customers +UNION SELECT City, CompanyName, ContactName, 'Suppliers' +FROM Suppliers +--ORDER BY City, CompanyName +; + +create view "Alphabetical list of products" AS +SELECT Products.*, Categories.CategoryName +FROM Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID +WHERE (((Products.Discontinued)=0)) +; + +create view "Current Product List" AS +SELECT Product_List.ProductID, Product_List.ProductName +FROM Products AS Product_List +WHERE (((Product_List.Discontinued)=0)) +--ORDER BY Product_List.ProductName +; + +create view "Orders Qry" AS +SELECT Orders.OrderID, Orders.CustomerID, Orders.EmployeeID, Orders.OrderDate, Orders.RequiredDate, + Orders.ShippedDate, Orders.ShipVia, Orders.Freight, Orders.ShipName, Orders.ShipAddress, Orders.ShipCity, + Orders.ShipRegion, Orders.ShipPostalCode, Orders.ShipCountry, + Customers.CompanyName, Customers.Address, Customers.City, Customers.Region, Customers.PostalCode, Customers.Country +FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID +; + +create view "Products Above Average Price" AS +SELECT Products.ProductName, Products.UnitPrice +FROM Products +WHERE Products.UnitPrice>(SELECT AVG(UnitPrice) From Products) +--ORDER BY Products.UnitPrice DESC +; + +create view "Products by Category" AS +SELECT Categories.CategoryName, Products.ProductName, Products.QuantityPerUnit, Products.UnitsInStock, Products.Discontinued +FROM Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID +WHERE Products.Discontinued <> 1 +--ORDER BY Categories.CategoryName, Products.ProductName +; + +/* RIGHT and FULL OUTER JOINs are not supported. +create view "Quarterly Orders" AS +SELECT DISTINCT Customers.CustomerID, Customers.CompanyName, Customers.City, Customers.Country +FROM Customers RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID +WHERE Orders.OrderDate BETWEEN '19970101' And '19971231' +GO + +create view Invoices AS +SELECT Orders.ShipName, Orders.ShipAddress, Orders.ShipCity, Orders.ShipRegion, Orders.ShipPostalCode, + Orders.ShipCountry, Orders.CustomerID, Customers.CompanyName AS CustomerName, Customers.Address, Customers.City, + Customers.Region, Customers.PostalCode, Customers.Country, + (FirstName + ' ' + LastName) AS Salesperson, + Orders.OrderID, Orders.OrderDate, Orders.RequiredDate, Orders.ShippedDate, Shippers.CompanyName As ShipperName, + "Order Details".ProductID, Products.ProductName, "Order Details".UnitPrice, "Order Details".Quantity, + "Order Details".Discount, + (CONVERT(money,("Order Details".UnitPrice*Quantity*(1-Discount)/100))*100) AS ExtendedPrice, Orders.Freight +FROM Shippers INNER JOIN + (Products INNER JOIN + ( + (Employees INNER JOIN + (Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) + ON Employees.EmployeeID = Orders.EmployeeID) + INNER JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID) + ON Products.ProductID = "Order Details".ProductID) + ON Shippers.ShipperID = Orders.ShipVia +GO + +create view "Order Details Extended" AS +SELECT "Order Details".OrderID, "Order Details".ProductID, Products.ProductName, + "Order Details".UnitPrice, "Order Details".Quantity, "Order Details".Discount, + (CONVERT(money,("Order Details".UnitPrice*Quantity*(1-Discount)/100))*100) AS ExtendedPrice +FROM Products INNER JOIN "Order Details" ON Products.ProductID = "Order Details".ProductID +--ORDER BY "Order Details".OrderID +GO + +create view "Order Subtotals" AS +SELECT "Order Details".OrderID, Sum(CONVERT(money,("Order Details".UnitPrice*Quantity*(1-Discount)/100))*100) AS Subtotal +FROM "Order Details" +GROUP BY "Order Details".OrderID +GO + +create view "Product Sales for 1997" AS +SELECT Categories.CategoryName, Products.ProductName, +Sum(CONVERT(money,("Order Details".UnitPrice*Quantity*(1-Discount)/100))*100) AS ProductSales +FROM (Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID) + INNER JOIN (Orders + INNER JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID) + ON Products.ProductID = "Order Details".ProductID +WHERE (((Orders.ShippedDate) Between '19970101' And '19971231')) +GROUP BY Categories.CategoryName, Products.ProductName +GO + +create view "Category Sales for 1997" AS +SELECT "Product Sales for 1997".CategoryName, Sum("Product Sales for 1997".ProductSales) AS CategorySales +FROM "Product Sales for 1997" +GROUP BY "Product Sales for 1997".CategoryName +GO + +create view "Sales by Category" AS +SELECT Categories.CategoryID, Categories.CategoryName, Products.ProductName, + Sum("Order Details Extended".ExtendedPrice) AS ProductSales +FROM Categories INNER JOIN + (Products INNER JOIN + (Orders INNER JOIN "Order Details Extended" ON Orders.OrderID = "Order Details Extended".OrderID) + ON Products.ProductID = "Order Details Extended".ProductID) + ON Categories.CategoryID = Products.CategoryID +WHERE Orders.OrderDate BETWEEN '19970101' And '19971231' +GROUP BY Categories.CategoryID, Categories.CategoryName, Products.ProductName +--ORDER BY Products.ProductName +GO + +create view "Sales Totals by Amount" AS +SELECT "Order Subtotals".Subtotal AS SaleAmount, Orders.OrderID, Customers.CompanyName, Orders.ShippedDate +FROM Customers INNER JOIN + (Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID) + ON Customers.CustomerID = Orders.CustomerID +WHERE ("Order Subtotals".Subtotal >2500) AND (Orders.ShippedDate BETWEEN '19970101' And '19971231') +GO + +create view "Summary of Sales by Quarter" AS +SELECT Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal +FROM Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID +WHERE Orders.ShippedDate IS NOT NULL +--ORDER BY Orders.ShippedDate +GO + +create view "Summary of Sales by Year" AS +SELECT Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal +FROM Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID +WHERE Orders.ShippedDate IS NOT NULL +--ORDER BY Orders.ShippedDate +GO + +create procedure "Ten Most Expensive Products" AS +SET ROWCOUNT 10 +SELECT Products.ProductName AS TenMostExpensiveProducts, Products.UnitPrice +FROM Products +ORDER BY Products.UnitPrice DESC +GO + +create procedure "Employee Sales by Country" +@Beginning_Date DateTime, @Ending_Date DateTime AS +SELECT Employees.Country, Employees.LastName, Employees.FirstName, Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal AS SaleAmount +FROM Employees INNER JOIN + (Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID) + ON Employees.EmployeeID = Orders.EmployeeID +WHERE Orders.ShippedDate Between @Beginning_Date And @Ending_Date +GO + +create procedure "Sales by Year" + @Beginning_Date DateTime, @Ending_Date DateTime AS +SELECT Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal, DATENAME(yy,ShippedDate) AS Year +FROM Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID +WHERE Orders.ShippedDate Between @Beginning_Date And @Ending_Date +GO + +set quoted_identifier on +go +set identity_insert "Categories" on +go +ALTER TABLE "Categories" NOCHECK CONSTRAINT ALL +go +*/ + +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(1,'Beverages','Soft drinks, coffees, teas, beers, and ales',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000000010000000001000000001001000000000000001010100010000100100000001010001000000100100000100000010101000100000100010000000000000000000001000000001000000000000001000000000000000000000001001001000000000000000000001001001000012507070100000001000000001000100100000010000001000000000100100100000001001010101010000000000000000000001001000100000101010101000000000000000000000000000000000000101020525363777777777777753530100101000100000000001010001001000100100100000000000100000000000000000100010001001010001000000010010000000000000100000000000000000000000000000001014343577777777777777777777777777770100120001010100102000000000000000000000000100100010010000000000100010000000000000000010010000001001001010100000000000000000000000000000001021617777777775757535353525777777777777770150120000100010101000000000000000001000000000000001001001000000000010010000010010010000101001001000000100000001000000000000000000000001417777737617376377775767771707752777777776340161210300000000010000000000010000000000000000000000000000000000000000100000000000100000000000010000100000000000000000000000000100503677577571705014000000101070717775777777775334101400010101010001010010101000000000000000000000000000001000000000000000000000000000000001010001000001000000000000000000000000010357353000000000000000000000000000171777777777470612101000000001000001000000010000000000000000000000000000000100010703010101210000000000000000000000000000000000000000000000101034350000000010653435777570477474700000107757777171000000101001000101000101010000100000000000000000001041477110131035750020040477301000100000000000000000000000000000000000000000010004014176577707000067777777776560404007371734361701400001241000001000000001000020400000200000101747767777000101073777577777775372100000000100000000000000100100000000010000010000037676476700004000577470416717477421405000434140343000565120510100301014002107171370701437777777775777777112103177777777777705757771010000000100000000000000010000100000101000470440440671007477776777777614060600742524001777777747646776752060250003021716737777777777777774747727574777001016777777777767173317703000101010000000010000000001000000000000420460200077427477767777777775677777746474656606767777665746776757151253507166737777733746777577777777572776771100517777777767776015713141030020001000000001001000000000010100067440044047761477767776706767777674765673470657505767375664746757777271252167717733771737776777677567476577577121103775777777776717027753121010101000010000000000100001010000010767060004776747776776777756776777777777042477676067777467474747676777565256531311771177376477777576757777747710110701777777767777401717340000000000100001000000000001000000101004776540666050777677657777677470774777776747664607777376747476777777677717173735377717737747777777777774774770011271077777767777763171735210121010100000000000000000000010000000300406767757676775077006767477774774777774747770476777656706746777657777777777777777777737667777476574774777771001031777777776767741371771000000000010000000000000000000000101005707442567656176006767004770476707700767770000477747734656446745677676777777777777777777375667777777777777777773100010777777777777771753521010101010000000000100010000000010007777712152503004670077774767427047247776577564700076737747670474277777777777777777367777777765777777777777434777750757775377767676770172773100000000001000000000000001000101007170701614204046007746040676167470774167743656777740077776067407465677677777777777757717777737476775716161243410303077777777577775210000011350001001001000000101000100000100002100171525675070074340670005004076700706570757777767770077744746466567777677777777777777777773776777610000000137775350317777773777737750701000101021001000100000000000010100010010300067777761650604065047604760746404776406705656776770077764750474747677777777777777777773733747777773011735777777777777777757777777777767412041001001000001000001000000010001000577744140000607406706767676776777776477756767777447700774076646764777567777777777777737373737764677747753527777776777777777776365735353513010300120301010000000000000000001000107000210006147767674646040404040066667767677775476777046644644044456776767777777777733737373776777776774244777377717712777165357577534242040010010010000010001000000100010000100300050000146664000000101030734352101100065677767077770047604774377676777767777777777373737333756477657075377100770770177776525271673001012101210301001030000000100100000001000005000060046160004000125343510110101000000000007740000047744733737377757677777777777373737377737656757777777373101676770777717775671773001010300000021021010000000000000100000000100077400000414021414000000000000000000000000000300000777777773737377677677777777777373737333735677677777377710177777717774705271767340300000010101000100000100000100100000001014005660000000737560600000000000000000000000000004730777773733373737777747677777777737337353761666777777737737017771677077353777574735310012101000000010010100000100000000010004300065400000000400141254140404000000000000000000037737776773777373733777677777777777677646746565756747777773773017017710765654352735770017010303031010010000000100001001010030704000660000000000000040000000000000000000000000007777514673373373737777777476777777777474644764666776777777772711031076117307374357477373010341050043030012100100010100100012500000047000000000046742000000000000000000000000077776677777377377373733737767777777777767645676507574777657610057121101731611574777637735105270125213010050210100001070210301650000000640000000006776406776464000040641434177777767667614737337337373777777767677777776564767474664667477761775271112116101002331211101052721016120140161034106010173075617770000570047400047400446000000467770504777767173573756767776767737737773737377776777777777776564746765477576777176700774656474731010011000001250165214716170121012011070777173777400063770040000760467600000000740760600777067777777676767676767337333373737377747677777777776767747424676747677157701677677676131331213131301371317310312161525053073077777777700047577700000006006760000640400006474046740777777777676767676737737777373777777767777777777674746767467477777743670175305325352527135335353170143414371617130131211777177777777001737770006760476677047064466400047640077747777777767676767673773373333737373776746777777765467674704747674765375610731773573752534737417017035303130101010030001427777777737770047777770047460704644064400004640067004767077777777767676767673377377773737777776777777777766565665670767767775077007563153347370731013213617034343434307031417121177773777777740257737700027447000064000000000640064006760777777776767767767773373333373737777476777777777746765674464747767763477027172753717175777757757357171717171717433616163777777735737400737773400460660046000000000004000600676747777777776766766767377377777373737777747677777776756567467746765777117100537153353773777777777777777777777777737757737573777773773772047777350000474044600440000000000040047774007777700667677677633333333333737777766767777777777667476564657476760600007353375373177777777777777777777777777777737777377733753777740007177770000664024640640000000000004646700477777007767667666777777777773737777777777777776777446467565676777535373525317137177177777777777777777777777777777775377773753771737700076737350000000474664665646644400400464000077700067677677773333333333373737776676777777777767777766767765677771713175217037173777777777777777777777777775375377173753777377773700057777004007477667764766767667467600000004770000767667666677777777777337777775677777771777772604000404067761171613131535353717777777777777777777737753777777777753773717735374700000500670446677777776777776777776561004661000006767767777333131101100777777666567777567704040505140777716536353147173135371777777777777777777577577777777777777777353753777371700000001776040404040404606076767776170000470000071101100100000000000110157177776777776470124100002530004777111301313017535371777777777771771737377773777377753773717353252165376164464265700400000000000004040040076774000440000777500750000000000000000017347766777746564100000000400300652513530753303170737777775777777777777737777777773777753757035353134317137313533000046440000004400000000053770000000000077343100000000000000000004135777775676176000700000004044213052153115353371357777377737737775777777573757777777353213503161617163521657257000006700060042400000005273710000000000007577000000000000000000531117777665447405244000000040031501313030721353537737775777577753737717737777777777777035343343131303103171317337130100000567000200000031756000000000000000077771012100101101131117133375466747465707047000071502161011531534353517753773737353777737777777777737537713503353170717173561343105307030525370047014161717433700000000000000000000101011770000006402737373767456467777777773065773510137343531317073737773775777773777577375735737577777343375377373673071316352731717173137000007737352713574000000000000000000000000464000000046733737373446647777777777740007373737110310343537171773565373537577177375737777777777773353737717175357727753717163737357770000071735371677700000000000000000000000000460004004676173737374745777777777777004631713112031213131317337177737777777377777777777777777777775377737777377371717353773571747737377617771677773570000000000000000000000000400400000000406337333464673777777777774007733373311001013135317177737775377377777777777777777777777737777573777377777736771773773716717535343373525773700000000000000000000000000000000000000037337374433373777777777700007740010313133173137337357753777777777777777777777777777777737737775375737373717367171653735727367374753737174000000000000000000004600000000000000000373733643773373777777777404073000000000012137331737377777777777777777777777777777777777577773737773757575735317273353531757535737377576300000000000000000000424400000004000040007373375733337333377777770000700000000000000000070477777777777777777777777777777777777737773757753757373737777775357273673373773535737357000000000000000000004406000000000404004037337333773737737377777700400000000000004006404043777777773757777777777777777777777777773773737773777777717371737357171752573473721777340000000000000000000006446400000000004004337337333373337337337777100004705340100016503777747717717757777777777777777777777777773757757773577173577775777577377773777373757777177700000000000660000640047674000000004000003737337373377337373737774040077760004000000044004737777777777777777777777777777777777773773773577377777377377377377537177535757373537710000000000004040004640604600000000000400073733737337333737373777700000047477420000000000435777777777777777777777777777777777777757777777777777777777777777777777737737377577777000000000004600000460064600000004000000000373373337337373737373777600000000000550043617777777777777777777777777777777777777777773777777773777777777777777777777777777777737737777000000000000000000000406400000004040000003373373737337373737373770040000000002777357777777777777777777777777777777777777775777777777773777573717775777777577377777777777777757340400000000000000040004064000000000000000073373373337333373737377750000000000057777777777777777777777777777777177775737577737777777735777773777773773775377377735735735375737737000000000000000044600406060000000000000046337337337373777373733777007460000000377777777777777777777777777777777737737777377777377777737371775353753753777777777777777777737717750000000000000000000000444404400400000000063733737337333337373377774067400000000777777777777777777777777375773777757777177177377735777777777377777777777777777777777777777777777704000000000000000000006000666066000000004433733337337377333377777700676004004407777777777777777777777777777757357375377777775777737777777777777777777777777777777777777777777772010000000000000000000040004404440000000000373737337337337377777777704600674660077777777777777777777777777737777777777773773773777777777777777377377777737777753777777777777777750040000000000000000000000460460000000000463733733733733737777777770047464067000777777777777777777777777777777777777777777777777777771737177777757377377753777777777737757773737000000000000000000000644640000460000000000073373733733733777777773750660760400017777777777777777777777777777777777777777777777777777777777373773777357173775377735737777377757777240000000000000000000606400000000000000000373373773733777777777737604746400406057777777777777777777777777777777777777777775775771733735377757177175737753737537777757777777777750100000000000000000046540000000000000000007337333333777777777771771066067674767677777777777777777777777777777777377777777377737777775737573737736373717375773777373737377777371200400000000000000000046000000000000000000073737373777777777777737700656476464617777777777777777777777777775757777777575757735773735371737357737575357635733577377577777773777775000040000000000000440646000040000000000000733733377777777777777137106606476400077777777777777775777757357777777757577377375777775737777577735737377371735773757073737175777777370000000000000000046764656546400000000000007733737777537777777777774474407467005077777777777775777757377735737717737377777737777371773737373773577535373437073737757577737353777700500000000000004676474266640000000000000047333777074747777777777776567642766027777757537775777371735777777577777777577777775377777777577577777737777577737757757373737777775777000000400000000067407604040000000000000000077777103716173777777737676665646470577757377775777375777777177377777777777357357777773737777777371735737773735753737377777773577377370004000000000000666424604040000000000000000777777007677477777777767676767474003577777777773777777777777777773773573777377773777777577773777777777771775773777757353753577357777770010000000000040406404000244000000000000000777370141477567777777762476767660067777777773777777737773777753777777777777777777777777773777777777375367377375357367767767737673477140240000000000000446400004660000040000000007737520077772757777770040047667767177777757777777777777577737777757777717753717717777777757753535357777775775777777535753735757177357005004000000000000000040400476440464000000007773401616575777777006440004764256777377375775375735737777777737737737773777777777773777777777777771771777777777777773775777377577773000000040000000000400000000000067400000000077771425777367777700400060006765377777377777377737777777735735777777777777777777777757777777777777777777777777777777777777377377353770070040000000000000400000404000040000000000077770525765777777004004040440065773775717377777777377777777777777777777777777777777777777777777777777773737371775377773775657527777500004000000000000000000442424400064000000000777724077576777700400600007000373757373775775375375737777777777777777777777777777777777777737777377373577575777777573575373733771737300700004000000000000004646440000672440000000777507567657775000444040644047777377777773777777777757777777777777777777777777777777757377771777375773737373737373773377753575377577400004000000000000000000400000040440640000004777407757777700404246044604375777757737777777777777777777773777777777777777777777777377775773575737175717175717571757253372734372773007000040000000000000000000004600464000000007772525677777004704064240124373777377577777777777777773773777777573577777777777757377737373777373777737367363727373735356171737177175000400000400000000000000004600000400000000047710477777700676006564640577777777777777777777737773777777577177777777777777777377735775775377757173717535357174352537737373717717730070040000000000000000000040046000000000000077777711357047600446500072777777777737777777377777777573573777777777777777777777737777377377177377757773777377737777343574356773737710060040400400000000000000000400000000000000771571715356770446002470757775773777777377757735735773777777777777777777777777735777377777777777777737573577177535357773777371747527710160000000040000000000000006000000000000007771353777767600056440042735373775377375773777777777777777777777777777777777777777777777777777757377773777377737777735777537577373717700104004000000000000000000440000000000000077171357777674006064214357577775737757777777777777777777777777777777777777777777377777777777777777777777777777777737777373777737577777300424000400000000000000000000000000000000777174777756765404051425373735737777777777777777777777777777777777777777777777777777777777777377777577777777777777777375777737777353777100100400040400000000000000000000000000007717137577764767404061777777777777737737777777777777777377777777737537777777777777777577777777773773777737775377177577737353753737770737100400400000000000000000000000000000000077717177777467760030065377577777777777777777777777377777777777777777777777777777777373735371777775777177753777777737717757775375753573536100050040404040000000000000000000000000771717177720767000043737737737737757737773773777777777777777777777777777777777777577777777777737773777777777777777777773773737737377357753000004200000004040000000000000000000047773537777504004104375777573757777371777777777773777777777777777777777777777777373777777777777777777777777777777777777777757777777377373777200504040404000000400000000000000000077153577770000016075375373777737177777717717777777777777777777777777777777777777777777777777777777777777777777777777777777375373577177573535300100040104004000040400040040004000177353577770070007277377777537777753757777777777777777777777777777777777777777777777777777777757777777773777577777775377537727576377717252734120050040400404040000040000000400007735353777005006535357777737771773777377777777777777777777777777777777777777777777775737777377777717377777777773777777777753753735752771775173500007000040000004004000400400000477717177775004353777737377773777777777777777777777777777777777777777777777777777773737757377173717777773577737777773777773773777773771773136343700000561040405004000400400040400775317777700367771737577537757777777777777777777777777377777777777777777777777775757717777777777737177577377777775777773777353717773771776535353716000047000404004000500050010001735717777761717777573777777777777777777777777777757375777777777777777777777773737737773753777177577737777537537737777757777777771757372537737271717100005252004004040604004040077531717777177777777777777737777777775777777777777777777777777777777777777777757717753757775377737737773777777777777777777177173777737753770775363774320000416524100000400400004773717777777777737777777777777777377377777777777777777777777777777777777777777737773777773777777777577757377377777777377377777753737753771775375757377577600000106141410143405007757537777777777777377737777773777777777777777777777777777777777777777777777777753777737777777777777737777777777777777777777377777573777777377373775373735373000000000400010000077377717777737777757757571777777777777777777777777777777777777777777777777737773777777777777777777777777777777777777777777777777777777737775777777377775777777777161612161637777777101777777771771773777777777777777777777777777777777777777777177577377577757777777777777777777777777777777777737777777777777737737775773737717717771737737537777777777777777775717177777771777777777377773777777777777777777777777777777777777777777777777777777777777777777377377777377777777777377577177537777777373757737737735377735737737377737775773777377717177777777737777777777777777777377777777777777777777777777777777777777777777777357537537777577773775753573577577537377737753757357757357571753777171735735775357537737571777771717577777777777375777375735377377775377777777777777777777777777777777777777777777737777771773753757377377777737777777777773777377737737737377375377777737573537737753773777777777177777777775775737757737777777757377777777777777777777777777777777777777777357777777777777777777777777777777773777777777777777777777777777777777537717773777777777777577777717711737777173737377777377777777177377777777777777777777777777777777777777777777737377777777777777777777777773777777777737775777777777757777775373737777773777377377537737777777710101417777757757377777771735377777777777777777777777777777777777777777777777777777777377777777377377777777777775775775775737777717717371735377575735373757175365737777773737777777773617377373775737773777777777777777777777777777777777777777777777777777777377757177573737777577773575373573737737777773773737777777777777737373777175337637173573537777577717777753775777775377777777777777777777777777777777777777777777777777777777777777773737773777573573753777737777777777773773777577577737353717353577175217437753577377377771737373773777375377375377777777777777777777777777777777777777777777777777777777777777757153471773737373773771737771737377777777777773777737577777777777377737733717373717177737777777577777375377777777777777777777777777777777777777777777777777777777777777777777773737773771757577573577377717777575717377777777777377773717353717357175717577717753777175773773537777777777777777777777777777777777777777777777777777777777777777777777777777777753473535377373717353717171735373737777777777777777737777777777777737737737353735371737737777377777777777777777777777777777777777777777777777777777777777777777777777777777777777773777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777773535000000000000000000000105000000000000C7AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(2,'Condiments','Sweet and savory sauces, relishes, spreads, and seasonings',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000777777777737125353313731773543110105302502105313321714317343717135371373147317317171717121135301610131217777777770146765074747776567616774776565774040371737031611737710110100007777777777717435357353531713343030301103112161705353317353343717135371370317717737371734125031131352171777777714066544724767776774747657700577764774340735757100371507530210777777777777777731737317353731704311151303112110431731305317314171731717171354731713535373107131703011317177777770664576076567476404776147676777674174074740573312411002173611137777777777777353167171735337173531163125351615307173171737171707373173733537023177373737351611010113521737777775245006047474747407777777767657775747477416560075141200115351103077777777777777377143161735717353463107113131303343353171317373107177317173171477135353717370737312503173577777344760547061604760777777777777764677776007470774033001010035212100777777777777777173563535335371731053130707071351165343171701773417357717177130177173717717134101713353173777747640076047447000777777777777777775667570467760774040301010101053107777777777777773712531335337171735301531313134334135353361371350735331737137707137353731737433731717377777776040000407647604777777777777777777460547743565054776011001031213010077777777777777353561737534717337161352171712717103737335137137061373573171711073531737171710351171735373777704740460464746777777777777777777777040667746776007751300530101301300777777777777777373071713713717135241311030711317605117533517171075353357373734173173537373735373773777777770460464740406757777777777777777771777640577740457777000131035310701007777173777777775353431613717357131630731713735311637317173737171235353353535725377777777777777777773737777567404706425046777777777777777757777775246577777767711350131030311300177777357777777737350771731171337510531071351613735534317131717305737357377373077777777777777777777777777776540060405646777777777777374777377777774767777747771076035031110121000173735777777773535307131717373513243357317073171163353712571735073171733535735777777777777777777777777777704600564064077577777777777737777777777424577756771147741121161037100017357733577777773731603521725153251071335213317077071335373371732177373573737777777777777777737737777777776460464604046473777777777777777777737777567776657167647421121121103001035775737377777571711613531337353371435135351713131471731171735716171773753777777777737777777773777777777774740405674747777777777777777777377737176567757370470067070121121100010733531717577777371734173535353353107127713631735370371737173537107377373777777777773777377377171377777777444006640464677777777777777777777777777756777774747047741137112116100305737161373777737173107313531735352471713171173537017173717353731637535777777777777777737737737337177777770760650406047777777777777777077777373437777770567674776012101611210010131717135357777713253425343525353131031717373537171617171371717750537737777777777773737737733713537777777744404656440467777777777777777777377771577774764044774470717131071301210161335253077777757131035313137377534721717173537371637171733737343537777777777777777737737753713137377777764604646560457777777777777773777373001777574777764477611301121010001017135131314377773131716317353135313001717353353717165317371713573173777777777777777737573533373353717777777465404006400767777777777777377735000137776067664707640341216131300300035253521707577135271653531161773716173371375335373531717173757316773777777777777773773737377171313773777770460000440066757777777777777773700010577756764100674031311310100010103131313521073777731131052773171371310715377135737171773353353337717777777777777777773773737333131353353777776764007640456006777777777737371000013576644566565671341210131300010103521703170073735371730311173171371352735377335373725357353757177177777777777777777773737377173317173773777344564046466404444056477777537301000373405606746764011331352171001201013523152107177735303504373171357017005335217135307107317371337377777777777777777773377373137317133353353777706400004400676000640677471001000171464767444564031301052117100301001703117211617173531713035316127331710737171717731734071737171777737777777777777777777737377735333531737777717746654047046440044700465700016113000564440676653130171311303001010303152311340217173613530435313513531210717313613535312131713771777577777777777777777373735333337113713131377777344660240404740064000007003012446064000065641301430121217100303010117214341305030713521770035312153431340315251703537140713531737773573777777777777737373737171337311317171771777714540440064600464074764547407644764474661061711131171213001100121311331330433171353713107121713013170071631331353113013073173537752777777777777777773737337373131371731317707377776646600000000400464006460040000476461100121212163011710430103104341170510350307131714035353017317034353153417125240735317537717377373777777777737173537713137113133135371377737771404047400000000440040000046564612110016111211111303013012110331333130343135134352334031251210717107353213717131300131733737777577777777777777737173713737133713717131774353737777776646444600006000046442564670513430031611030301700012112131170552530043032531351307171335313137007153513035211071631535737716173777777777777737373733733531313133713707375737737757474604640746406546442411030301104111210110303104012112533130313134315113171371407135031707110712313253121520031173733537777777777777777737737373717373313533531177165373577777737777574746445652413513125110130012121121210110013152113152531725005303616343160335303521310243535161134112143537371777777173777777777777731737737313171731353137350737173717352573717737353737171343070110212100210130101013020210311612313171134121711311353134135311353531061303116113010013535373537370777777777777773777371737373331371335117340537153717352573737517340707317351130211011201712103103011001312531711725371124301253717135035215271212170171703130313030703535373777757377777777777773735733717171311371333173163537353707142570532717161352513307111211211401113502101211041713030371135363105331301212530431731135353107031100110411000713737177377377777777777773773733771733317131335353170143417217317073173535317071353250303071021120120301311303124330171711371133150435053537171703713107031316053160317031301071371717717734777777777777777377377337371331351733137124331335351700717053530700714351131501103112107111131030105001153012125363757312131303113121051707131716110210110101100300317137373737713777777777777777777777777377373331537174101170535321705713725353507331216121312110710003070125103130061213110133151317052521716161370213134310313514310303121310140307171717735653777777777777777777775341307071331313130060130305313003411310303014105310101012101214311130121103130131412130757377735213171213135105350311251212021030110101030035317337735731777777777777777777757171310101373535317100112535321610613161035110031310130103010131003030013112105007031301011317731730717031711612012135035335310503110212130104713535713737167377777777777777777737310010135153313530003011010511001212117121243001030012101103010051013100301130011030130077737771750731731631350717133031035302110211010121303533733753773177777777777777777777510100000017335331711043030312121041153010101001121031010102103010303100311012100121010010731737773731731711531300316153171307116111035031101433537533771774377777777777777753012110111000015617137200103110311121203103031210021110010030101010000103110121013000130131017771777771471352373053525313317037130612102103121312573713753777377773777777777735035355371731510001717701100314311430100101311011021102031211011010130010100312112100030012003037777737377335375317330131351631713150110311301535017353777377377177777777777773513513130111053351101771130070131303131053170161307050311101030102121000121211010010101013101101777777777716537131731570716331531352352311210713013343773777375377577777777777713171310135371315373103520010113161311032072113131110311212121012110110031101121213030003100100307737777773717137171731310315331707353014301311253353573573717377737377377777773177125353131735335357103131202521135271510113412163105211111113110121210003100111011100101301010177777377775637717331737071735213317317431734121314317373777777777757777777777317313113107173777531737150101013173031133043713353110631777377777373111001310312121030012121000210777777773733171316171611073135351731703101013171733525777777652104277777377731713535341717353537357571310100010351353250310351317377577525010505357730301031010112100210100101037377777777757335735331734353717371371707131343121753177050001040014077777737713713011331357777775337175000100010370351314771377775713400100000000000417531013130313051130100010077777777777345331735353125353310375313430521353531377770000400140014057777777351717351071353771775357331001111111353353211377777434001000000000000000003531051014110030100100210777777737735335731735217103341737137353413110313535377104700106756207747773537371710325175375777317735110110001107317351677771611013400100000000000000000703121313003012100010017777777777773433173131710735333113710305303431073737770777406456065570014777753103535113137773711771101110010100171771737777171607000010001000000000000000130110300611101010011077737777773717717353731730537516371737125313173171777575646747676566756704773757110717757777773773130000111001110771377777516101105010000000000000000000000532131101721000012000777777773777717317353431343133317171717035307173773777775747400456556756701773737711010343571513571110010010001001777777777357343034341010000050000000000000150121001121100010107777777777771635371353735343535353371335431713535377777770006047606677674073777777771711113173753000001000010100177777777535305141000000401070000000000000000313500310100100010077777777777373537037331530173537317137523173773737777777747650460447465677777777777777777777777300001100000010110777777573530530374175353107057310000000000001710071030010101010777777777377753713713573716137131733533507171353777777777774640540761465477777777777777777777575000000000000000007777777753577575031035257053007700000000000003100121121000300007777375777737343711713131716137171753533437173773777777576700766704465625777777777777777777777737000000000000000077777777773537077577561763571001000000000000053010121001000110077777737777773531733536173253717373373711717353777777777755046564476767477777777777777777777777111300000110101000777777753577753712707100142070070000000010010300713110100010000375771777373534371353317315171731717171707353777377777774766474677644747777757777777777777777717370100013000000007777777777777350574100005251007100000000000000611210030001000017737371777773716135271711732533537373737307377177777777777752424464765677777777777777777777777777141010011100000077777777777770712170710301701617000000000130010531031010101001071771735717777136131173731716173531717135353737377777777747654476744644777777777777777777777777713001011010100100777777777777570570110414161600071000000004170003071011000100000371737137773733417373171371217137373737737771777777777777777467444604677777777777777777777777771700000001010010017777777577757353052431201001015340000000012100171121200100101011735717773375353735317137131613717171731717377377777777777600742076565677777777777777777777777737100010110100000077777777777305705251525034000702100000000005037103101100010000037133710775737352135237317350713737371773777377777777777765046546046467777777675777777777777773710113110110110001777777777775730701006125010100050000000010030013103000010001010717717373737735357135117717334353537373773577377777777777567746644650477577775777777777777777750131100000100100077777777771775711753010530400001010000000010010703113100010000003710735357353737037333713317137373757377173737377777773776564745204646757774777777777777777773313010010101110007777777777577771650341252051012104200000000007001352100101000101017373171737373531617171371713435317337537357777777377377756470064404657777777776567777777777751111101000110011377777777777577161035214105200040101000000000101031013010001010000735377335773773535373173173353737737737737373737377375377777447476704677777775777777777777771371301001001011017777777777537577134104034001001000000000000000700033101000100001003171357331771737160152173171351733717373717177775371737776767460446044777777467774777777777771311111001101017777777777777577756134311012161401000100000000010101012121010000000077337335737377373137335353737363573735373737735337173177756104700046567777777757477777777777117131000100113777777777777776717351410401450101000000000000000016017110100010000010357371773177735371613533371353537373737717353173713717775654065400004677777774707757777777735311010112113777777777777777535757161252161210000010001000000010010310210001001010007335377377353773530713535337337173537373735377311713737765670000004004777765656577777777777531311010111777777777777777777536352141010014340100000000000000010000311010100000001071775335377373737170733735717537373717373735317373717775725650000474046777577777677777777773711311313777777777777777777777575757161050000100000000000000000001001210000100000000377335737737777737313571733733717373735353737731353733770567000007400077777677777577777777735311177777777777777777777777573537010116310100000000000000000000000131010010000010105335173353777371353053331353171735373737373713177737777770016140740004777757777747777777777531377777777777777777777777757347753777717400000000000000000000000010103001000001000035736317357357377317271737373735337171737353777333737377716140141003473777776757465777777773537777777777777777777777777775771757761601000000000000000000000000003100000001001010173317717377377373711373535353734737371717371377777777777502112007047377777756777777777777777777777777777777777777777777771777771501000100000000000000000000000003103010001021016317431635377377173727173373371313531373737377737737777733714005001737377777777777777777777777777777777777777777777777775777776142140100000000000000000000000000110001000101012017713173537377737353117317137137343777373737737373773737373737137773777777777777777777777777777777777777777777777777777777775011210010000000000000000000000000001200100010301211431617353717737353353613733537335373337777733737373373737373737737373777777474240567777777777777737173302137777777777777753435341410001010000000000000000000000010010003010101003173617313737573753353435373135337773333777733737373373373373733737773777756101000507777777777777776140500001377777777777753525210250000000000000000000000000000210010010210303117351314771737373371321733173737733337377333373333373373373733773773777714000404070747777777777400000000000400257777777757170714141001000000000000000000000000001003001011010100617335733135377717137152357333773337333333373337373737377373777377377777435777707477175777777700000000000000005377577777716171430300100100000000000000000000000000010021201210311314121353737173737313253333733337333373373337333373377337373337737777710777775077574707777700000000000000011007377757753717071050140000000000000000000000000000001000101310310035737171253537177317353057733737333333333333337373373337373777737777777775475725777770477770000000000000000003005777677757717070102101000000000000000000000000000121010100310311121312135353343737733337373373333373333333737333337373737373373777777777773470052574177777700000000000000000010077575777771751016010000100000000000000000000000000100030310130307171353433035353773731717373333333337337333333373733373737377777777777777747125352757657770000000000000000001250577777753571252501410100000000000000000000000000110001011013010112130313117312777733323323332337333333333737373333737373737737777777777777140016050257407700050000000000000041003777777777357103000000000000000000000000000000002030003071301213353413437017717737373333333333333333333333333373733737373737737777777777777375017257400747100000000000000001000075777577575307505101010000000000000000000000000010101211035351010313703113733337337333333323333333733733733373333373737373737777777777777777477405670067777000000000000000000007743477777737530302500000100000000000000000000000130300313121213013431353673377373323333333333323333333333373333737373737377777777777777776747640424000474775200000000000000007575707705753553141410010100000000000010000000000013011035217131301703137331373333233333323333333333333333373373733737373737737777777777777756777004774770576705700000000000002177677057777777347130012000000000000003500000000000013125035217050131353137337333313333323333233333332337333333333733737373737737777777777464644640004047406700677505000107161756505777000575357316153050101000000000017100000000000707125131213130137333273313332333233333333332333733333373737373733733737737777777777656740000074067640000575767700416500416777777775777777717535214010000001000005370000000000424133530351302130137333323233333333333333333333233333333333333333773377373737777777757474000004656504704756524057470770071257777777777777571771341431001010000010117430000000007406753071034111013273331333323332333333233233333333733733733737373377337377777777774246740047000064704706760077077574774774577777777777777775347131020500010000035210100000000675740243103130303033323233331333333333233333333333333333333733337373337373737377776564404004064000474404004104747724740776776777777777777774735317435102100010015035700000000004642440043101010101331333323333323333233333333233332333333733373733373737373777777706400000670400000000070470477777577074757757777777777775675775701520510521001431500010000000700040056103121312103233333332333333213333323333323333333733337333737373737373777744470000004041640560046747477757556777417677707777777776567467171353413001006143043401000000074000004640210101001033323033333231333333233333333333333733373737373737337373773774676740460000640646406756777477776775774675447407776774052467747257253143525012107100000000000464270047040121303121333333323333323333333333332333333333373333333333337337373377640444004000004004000046777770707756767775677777657574256477567057357057177171410507110100000000054640676740101001003033333132333332332333033333323337333337373737373737373777774040000600004640000470047677434475034774434774750676705657740400645717377753430001214730000000000600004404042101301333323233333333333333333312333333333733733333733373373737376420000004006040420006406767767477042457707407047765774067764740064163717575251010000573500014425604450000046500210130333131323313233333333333333333373333733373733737337373777745400044004040000405447747747577774050604077447747465765044747604776445777775200010101350102467406470640000046041030113233733312333323323323323333233337333373333733737373373774664400000004000000460467767676776770675424770747725046565677654004476064065351777777777770005470474004000600470001012031323333333333333333333333333333333737337373373337377777000400000000000040000006767477676777765702576004765406770464004604700440000577777777777777750076000000000007407646001211733330332332313333333333323333333733333733377373737373744040000000000040647400477676765657656564047645076567656440756425674004704047777777777777777710400007647600540044650030123333333331333233233231233333337333373733737333373737777000040000000000040004000445740400676472470041674004740400042447560470424747677777777777777777760004047044064600000640171130337303233333333333333333333333733333733737373737737765400400000000400046004600064000400400540470047040076000470047646404004740004377777777777777777040077047707400740000740121333331373323333333333333233333333373733373337373733777046400040000000640040074006004367400407601647400764045607404650470576474040654777777777777777770404400746440044674046002117303137133133233231233233337373337333337337737373777704640000040004040000004400440674400046764064740040410065247000006746645647704427777777777777777700600047004704670400674013031377032323333333333333333233337333373733733373773737400000000000004040074567202400460000007400564706776656065646406004007247044046577777777777777777040460057706000400005674001137117313330333333333333333333333373333733737373377740400004400004000004464044047004747440046564006004454045640474654004744064760006777777777777777777400400674147700707604060307032313733333233233213233333373373337373373737377737740004000040000040400070004406640460707656475004006020064047441600474007476500077777777777777777740000000047464064074004400117313073333333333333333333373333337333337333737373770600460004604000007006464640045061046404650640560056440540064674070465647400406477777777777777774000420000760000434007060003313753533723331333333333323333337337373737373737777704700040640004000044050065000460460074004604006544640046700470640470744006647040047777777777777000400404007704000467444044013073312713330323323323323333373333333333337373737377466400404400654060006460460447474050060000460046064740004474400564464024045240640004777777656744000640074047777047446056700053531713733333333333333333333337373737373733737377774400000000047676404746540000746447465440047406704504004467404046746540470564004740046567765656424064040060777744040610674003312731353333333333333333333333333333333333737377777400004440000464640004044604464647676766746560404046000476776767677776004646400404656676646464644400400640404777600004400460011713000000000000000000000105000000000000E0AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(3,'Confections','Desserts, candies, and sweet breads',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000113330735737777704000000000000006060000252000014131315311716037070021240161075371617637506357172512171357170173537160000025214002070000012436167777777173333737171773737377700001111131330131357737700000000000010000050040006331131313310705073430040000003070761617433514356537571773171771716167170604076776775677064253437177777737357531737373753537337113313111111113131235777000043712006767773677777711131531311777377077043125361707171177773563737373563777177371374735716771707717735637700016777476777737531333733537371373717531111313130131316131112163035371350007753477177311137133171331777777770734772516177777717777352575777357377717537533173777160277767777777043635673717737533337171353735737353773713111271131130317013111111131131670073677776771733113113135137777777771470777616777777777175377375377357177773573757073577775677777677770365635777677533753537337371737353377377313111123130131313103131313131711770477670777353533133531331177777777763777177717777777777735357377757777737777353353553737737777777777761771637535733533333135317373753371317371271131111313521313310112131171337003717377771313117113171131777777777177716777777777777777777735353773777777777775773365777777777777767160677747673173717117337335373777177775311123103121113130371131317113313143047765767171715331313133137777777777677777734377777777777437577777357777777777737357530735777777777776071777737317371733733531737177313733737131113313113303511130153311311317343077777773131331171353153137777777735377777777777777777777537737177777777777777777737777767777777777717061617717331337313173371737737373573773103111313103132130133071311311313000617277173171731331313111137777777777757175377777777777736527577173757775777775257537171777735361777253525616717373535333171371737717173753713313121011313113113153131131371310000604167113131171131713131177777775353737736535777173773753752767757377737737777736757777177777776165206353735331317337133335373753737373773111311131311301312130331303113131701070127013353133131713113113171773737773571753773527657765274371717737737777773773753637177777707177716535273533173731713717133717377317177373121131111121130313131031313313531600076507711317153131313113117777777717163763777767753717373136161634777577177757757777567075717776353613437473353131737313313353373731373735311131103111131111301731115313313131120012507317133317131713113137773577737753753435373777675756537535736173777737773773577377736777777677617437173337331737313353353753771335337131111110131303121731073131071313134107612771313535313531311313573757373535375377777567743527253473434357677537577375777735717771717171771707167317131733537317311331373337137131103331313113111113113312133131313503071650131313131531311313173757377757777737437773717377775367343717773537777375773737777777777777777167736535333373173731313133537311313313311111121353011303310335313111331312161677373135373133131135311777377777373717537717777777777725357343634777777777773757757777777777777777716573733171317171733313713317331331313331331130313311113311133173311531371753777717131171117173131311777777777757737717777777777777776347757737777777777777377377377777777777777773777173133333373531313313313331331311121773313311031341373053105313171773777771313537133713131311137777777777377777777777777777775357777775777777777777777777777777777777777777777773313713535373313313131331110103131137701710113113131317331333131337777177731731311311317171131177777777777777773717777777777377737373737777737777775777777777777777777777357777131331313331373131313113111010111773371600771213011305313171143171137777777131713131731313171131777777777777777777777777773577737777774770737777173737375777777777777777777775737331313313137353113103113331111117701677000071513131331353133131331177737753131313531371313131117777777773777777777353535777377771773773775737177777775377777777777777777777377735313313131313373113110111131113171607777000072111111134337113131133771777735317113371310117113177777777777777775377777773777535377357177377777777537777735777377777777777777777133313333131313131101011131113111677077700000000003373131013353533713777373131313135135313631317777777777777371737573773777373737717337317737537373773777773777753777777777777737331311113133133313111131353353137777343400000000000113113111312111717357713171313133131717531177777777777375377773771771717171713707531753573735371777373777173777773777777777713173133313113013313131113377377177701353700000000003113713121313131317371371311317173171317131377777737357377735371771373737371771333533723171735373777577777777773777777777777733133113111113101313131757173173343410111313410000041371353135313537375335131731713117135377177777377757377577173773777773535333171713531117373537173537373777737171737777777777313313113131111111311173337357131353131301111343035363131317133113317137133313113313313531631177377753777773313717353121013131717171312113331313312113777753737777777573777777771331333111000101111130311771733110111111110311317525753173113153035337713535317317315313171533157773773735375353717353113313131331310110110131311313101313773573737773771773777771133131311111131331131371373713131313013111311313737371173713131317137713131315317313531373513353577757771337317313133313121111313110110131111111111313033173753773777773577377733133133331331331331011171717311111111303111131353537737113312171313713713135333713713171173711313737331371731313313111111113030101210111110010101011111110313371353737753077777313113131333133131131313373775313011031113013131317777713371713131131311353733171371313107171131131135777137113111101011011011111311113100011110101000010111121131377777377307377131311331013113133713131117131111313503113317035303177353131713171131731311171137131353131213171153131137313313010101001011010101110101111000111010101010101101111317377357757077111131101013313713331133110171031131352115213131313131317131353031311353373371137171313131713133131131331310113111131130121111110313101211310011010101010101100011337177737737173131111101011173735333533331313501013111631131735353173533533313135313135317137313313171713111111111111101011010121012111110101011011131101011001101103710112110101117373773777653113101103137173133533353133131313171313113073130331213353135353131303531733711535353131311313131313170101101111113111101010101101101010311010110110351310153501011237175377771377111130111313313353335373311013113101213713103131131317335131352133533171711733313313131311111111211331130110101010110110101000101101101013030010131031131313531011137337135370527131111333331353335333171313177307335112153171725353711131713313513530337331717317171131313113311017521012110101110010101001101000101111211111101013170170103031210135337377737147131331311133317335373731113111711533113313331131310317131311713313171537171371713131311331311011313113111011101011110101100100110101011131301317010113131311111113331713317777323131131003131331333131337307131130310311213533173131131317173171253133353137131313131131110101353531010101110101101010100111010010101112101101313131310101010312111113351731777507111110313133133113373111711103131135371713413107112111313131311353571373537131311103101013531131211110101010110101010110001011010110111101310101130113111311113010311331733537707331111310113113313171131173171533131313133173133713121713535312133171173533531313111111031121111301011101101010101110111010011010131031310111110112101010121013110311331737737707713111113313013013131103113131013131313111353171353171353131113517137317173173773301013113130311111010101301030112110101011010110103101010101010111101211111312111031173131717127731303311210101313173171311131701616017337335331331313317130353373531733317717311113113011131030301010110131111011010111300101011311131110100110100101101010113101133317173777077775775311111130117113170706070700005200101731731535351731171353173171757733717310313011011011111311110111101031013110101300001011010121010110010110110101100101311111313353177577737737713131111371311777777777716705347253531731313313731135353171373317753311351011101011101010010110101311013101011011101011013131110100010100110101001110100230011311377137037777777777777377770707725777777610634305277353535353731737137137137177731310131331310111010111111310113111011101131011700101101010110110101001010010101000011031371011373131717777077737575775777777777773677761071777520735373713171773535353717313713131013011111011001010101101031101011010110101073113110111011010010100101010113010311301107333013313773770777747773773437577725777777777707767036571737753735371353137353731713731101311303013775311011101111101111011010111111710100010101101111010101001011011131121100331311011311171771777375777777537777776776776777707716537371713717135377377171713533111331113011111313377751001101011100101011010101013311111010101101010011001010101010121101100110101011033735377777777777577777777777777777777070773535373773737735317177373733113131101711300101101113733100101101110101001010111011010101010110101011001110311010111101100110012110103117377527777377777357776776777777777770525313371717353713171737335371713311133133110111110131310357710010101010101100110101701110101101001010101110001101010010100111011111010010335317777574777777775377771725707777772531715373737373717377535771737351311111011310100111010310313371011010100100110010103101010100100101010101011131111011010111211001011311111131237777375777757777777704725707436531713737177173753535377637371713331313111101111101301111131011133010101100100110110111010101101110101111101013013011011010011011111011101313011753777737777777771725073520717753431353537317351373777071757373311111111301110101110110310113101013110100110110011011031001010100110110301111301101101101011001010101101110101071371777777777771704720742577634367125313531717377575707737375311131313131101011101011011013010111010111011011011301101101101010010111011110310110110110110101131310100101011113117177717577753577073512753471777707531753773717737737735357777731113113133101010101011011011110011010101001010101110101100010101010101010110111010110011010101113130110101101013031777773437777770742616343061617707672717177777777777767377371713113111113110101101001011101111011010131011010101010101110110111010111010110101010111011011010111110103101101211771777777577777712755257777777770735357677777777777771735735737313111012111010101101111100110101001010111001011101101010010010101111010110110101010011011001031011010100112111177377777777777757616327777777777777567773577777777777777537773535313100111101101100110010111010111100111010111100110010110101010110101111011011103111101010371713101113111011107313537771717577775257507777777777737377777377777777777773777377331310113121130100110011010001010010110101011010111011010110010111010101013013121101610101217130110101010101103131717771777777171727777727777777777477777777777777777777771735375331010101121110110111010111010111010101010101010001010100101010011101101011011101311371311525110110101013101111310317775257377777507776577777777777777777777777777777777737737137131310171110010011011110101010001010101110101011301010110101011101101011011101131311111703130310110101010110101031753777775777777727353777777777773777777777777777777777353753713571013121011101101101010101001110110110001011110111010000101110110110101010313010112121353411011011011111211113153775375377535776574347777777777757777777777777777777773713331313353535131000110101313110101100010101011101100110101003110110110110110101111011352111531113701101101001011130113317775777777777353774377777777777737737377777777777777757717131777317331031110101101101110101111010111010101110113111577777370110110101100101013131613536111305301011101011010317017737777777774347034167361757772757777777777777777777737313133111371531113111101110110110101011310101011101010301077377377710110110101110113111531353113635130171010173101131713777577777777774373436756572773757737777777777777777773737131011311713101035010101011011013107101011101100101311117737775773130001011101013101213317134311113717217073110113131317777717777777034141617373777677737777777777777777777777777131310303103131131773730101011101313111010110110101010137737727170131101000101101311311037135031701315313152111013112757777775777773436216167567535777777777777777777777777717373531311153110110737777537131031311777713110110110111110737521717310101371310101110311017101131431315311713313011013113737777777777741615250716352773777777777777777777777777777313130107301031013513353173511111035331717017010101001011713537371011135377510101011101713110353171301301110111011101357775777777777216102527777777777777777777777777777777773735773513111111101101315335317301035130101311311110101117727773777710112112537371301010330110317131135311113071121013137775777777777775250753477777777777777777777777777777777775733133717730101121101031535121331134111301711212511121713513773531312113111305377771735110101213170101303011121171101013777735777777702527673477777777777777777377777777777777737717113317531121101311131121711521131215131251113031112513411777701111010311310135371121031117152131310111011103171331357735777777777753473743777773777737777777777777777777777371737353533101110101012107111031110111133111312111103013103121331310101011010533531121113101213111110110101101353131111377777773535777673757777777777777777777777777777777777777773131313305311011101311311213101211031251031011101351710101111010011011101311351317111301531113012111011010101311301257777775777773773747763477777777777777377777777777777777737777131315301011301311131211101311131111131011101370130351310101111071103110130310313161713121013110101011010131301111377777777577777757737573777737777777377777777777777777777177353101311313010110121051303101121012130111010777173111210731101011031101130111310113131211113101112101011031101121071777777777717577763572757777777737777777737777777777777777777777131317101111031111315310101111111011011377353117121177101100101170101111030131211111121301101011117017521113113137777777777777737577257277777777777777777777777777777777773773731121735310101013030130531130301211301777717171303110310110111131371100101111101113030110110301010731713112111735777777777777777572775357777377377777737377377777777777777737753531171717010111011110113130111311101137777131171110357713010101011130111101010111011110113011111310173717110131737777777777777777257276353777777737737777777777777777377377177373713537313510011010131010131010301101777371731121110373053510111010113121101110101010110111012101311173137313031777777777777757775355717777777377777777737777777777777777773777713137717131311011011003111011311110177735331071152117771313210101011010110101010101010310101011101437113717353137777777777777777276373777377377737377737777377777377777777735777313171312535301101101111301301101037771731153121211735311435112111301013131101101011111011131121313310301371311777777777777777775717777777777737777377777777777777737373737737777130317113031710110110101101100101771731521311111317731213112112101111101030110111010101010101105015315301377137777777777777777773777777777737737377377773777777777777777777337777531313111131312110010101101110117771731131303110173111010717117112101101111030103110111011101131211313171313777777777777777777777777777737773777377773777377373777373737371777773131350307105351011101101101010773121121010110017211011313130311251310101001111312113013101301011121371313777777777777777777777777777777777373735737777377777777377777777737777777112131113130107110110110101137112110111011013771101014352535211130713111131271011101110110121130113137357777777777737777777777777777773737771737737777717373777717373737717777773113573773531310351011011101713111011001101073570131313113131213113152121051111101111010111110135711153777777777777777737777777777777777737373437737737777777377637773737377777777313173573535310311211010173010111011100111773171035253143151707352111113121031101211130101735737373377777777773777777777777777777777737717353577777777735737737737377737177777311177777317353535311121110111010011001131077735303513101313131311113030101113103135121413131733757357777777777777737777777777777777773573737377777777777777777771737373773177777173733531735371307030111031001011101110503171521711213531703703130311111313105314103531316113715331737777777737777777777777777777777773772737370777777777717777733717377777177777311773771531735317110101101101010103013113773111211713121311110110121210101121131713535317313331737777737737777377777377377777777777770753573534357777377771717752737377777777777731531731735735317312101101101031111013410717031701107111303110111111311121125371773535371711777777777777735377773777777777777777777377373727373734377577777771737377777777777777773173531737173535351330100111103013101311211101130313030110110103010101113537137177377171377777773777377777777777777777777777777777707773534365737716375357163717377777777777777777313771737753535373513171010101110131071112113011101111011010111113103071717753717717335377777777777737373777777773777777777777773707167335327777714177371727377777777777777777777711335353737137153717177711110311011130113011303101011073711012103113131313353773771737777377777377777773777737777777777773777773737376335353517730115073537377777777777777777777731537353537537371737137370710131030130113101101101033717735317177571615353353573777173777737377737377777377777737777777777737773435317237277735341617317377777777777777777777777773535373537177171717537731313017113513050310110117575773535353713731331357373371317777777777777777737777777737777773777777777773363735353773777535371637777777777777777777777777713137717177713735373573534307121703035371031037773737173735373777171171331317527777773777773737737777777377777777777777377777777170736357353032525637377777777777777777777777777777513737737771773533573531717171753537173537537173537753577717137173131171637177737777373777777777773777777777777777377777377777372537236353533531377777777777777777777777777777737353537531771737537773571777731373537173537537153717373335377173537170675242477773777777377377377777777377377777777777377777773712717737252163777777777777777777777777777777777577737737773173513717353777371435753717173713173735375357533133317373001024107343777373777777777737773777777777377777377777777777371210101217377777777777777777777777777777777773677753537317131371735371777713773335373571717717171737733113100137100000100074347735777377377377773777777377777777777777773777777773737377777777777777777777777777777777777773471757373717707175371735373711757357537173737713737335353531216174213000000000160137737177377777377777777377777777377777777777777777777777737777777777777777777777777777777775773472777573717707025371735353733717337173537531717175737373171706353471000042107162473637376373777373737377773777777737777377777737773777777077777777777777777777777777777777737753577777777770735317171737371753735717353713773737333531370070714253600000010616150377177177377377777777737377377777773777737737777777777307777777777777777777777777777777777777767177777777775040603121317177377173311317777131311010343107347435341041061061777276536363717737173737371677377737777777777777777737773777017377777777777777377777777777777777777167777777777727371707576713177377311060131313371763434340347737767761207161007077573713173771776375675271735377777377777377377737773777707677737777777777777777777777777777777777177777777777525677020753673135311677166072147777140774340377677777741676167077773767776172723377373737377377777777737777777737573777370761737777777777777777777777777777777777777777777777777773577527777172531770167107757375676372537734777777777275347712777677777037017757137373735235237377537773777372777353537777173577737773777737777777777777777377377777777777777771776172577777777607077070777677777314775610477777777720536710657777777770503303323743707073773577733637777377773436777670007677377777777777777777777777777777177777777737777777774176142770776777307077070773776777430637270777777777512416370376775777727765301703353737371212537771703774371773535213170001077377737777777777777737777777777777777777577777777736012147777753574007052525777717763410505003437707176012140505717727035001000600343303030035353637163775377763477637767007000375273773773777377377777737377777777777777777777777610400030707276301000000072504761700020000077410776701600210063600534720000201006304343037020071707707127525353703170716100007737777777777777777777777777777777777777777777777101073001675250534060030104352430170507016125703676010000050002714177043401401400751437070500143163740707703727343767070700001437735373777777777777377377377171777777777777777777777777705207772521014060707617767070305204036571717771610012415636707371423000210727052572002007707307007707163701010070760002053677777737773737777777717777777077777777777777777777777775307077560210110717617167761615314172776707761670717271610707671507014252572572570500740700434300707161677677770107001671737373773777773773771677777717171771777777757775357777777525252105060601671616170105204216357071770101034725777777771060701610777777777252070307077700071616177777777770707707373777777777777777777373777777777777177777777777777070777777777770707171777777777777773573577777777777777773577777777777717770777777777775257770434000000000000000000000105000000000000E1AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(4,'Dairy Products','Cheeses',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000777777777777775773775737773773777777577777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777173434716174361735707353436571717377235700007777777737777737777737653777757377177737537537777777777777777777777777777777777777777777747657252103060206042434777777777777777777777777735777375374361705253432163617075727777777737777777737777777777777757775777773573777777777777777777777777777777777777777772524141210000040604004000000000004061677777777777777177763534736175370773527577757777737577777777773777773757717717717717373737771777777777777777777777777777777777777777777127052430200400604200000000000000000000000000077777777777771776773717237077052707271735735677377737357775773577737777777777777757753777777777777777777777777777777777777775251076502410040600600000000000000000000000000000000000007777777777171756757577307371717076734737177777777777773577777777377777777777777777777777777777777777777777777777777777777676107412042000000000004000000000000000000000000000000000077777777773773637075352525617357737576177357777357777737577777775371735737777777777777777777777777777777777777561600000016700604004004004000000000000000000000000000000000000000000777777777177777377677773765725772737777777777737777777357357377777777777777777777777777777777777777777776536177777777650060000000000000404000000000000000000000000000000000000000077777777757377671717075377777577573777377777777777777777777777777777777777777777777777777777777777777172577777777717777040040000200000202004004000000000000000000000000000000000000777777375775777777727171777373577777777777777777777777777777777777777777777777777777777777777777567537775767775600247142006040404040404000000000000000000000000000000000000000000077777777737370707567677774772777777777777777777777777777777777777777777777777777777777777757572536577727757700000164250400000000000000000000000000000000000000000000000000000000007777373775673773717353773577777777777777777777777777777777777777777777777777777777777756376357616767577777700000025020000000000000000000000000000000000000000000000000000000000007777777777174347777775352717777777777777777777777777777777777777777777777777777777777374357635737576167061652007560400000000000000000004020000000000000000000000000000000000000000777757377737716177767757777777777777777777777777777777777777777777777777777777777765374357434777077752161257003434246040000400400000000404004000400000000000000000000000000000000477377347563777071737377777777777777777777777777777777777777777777777777777777775161434243652527777756140007403400004204000000000000000000200200024040000000000000000000000000000377757737356177777756777777777777777777777777777777777777777777777777777777761636342707165256775777777777777000000000425200000040000000040040400402004000000000000000000000000000077373525617271617735377777777777777777777777777777777777777777777777777771775414340564167014707777777343576100000000004752440004000400000000000004204240000000000000000000000000077567773615777725777777777777777777777777777777777777777777777777777777770736340703167047025200777757202172507060000000652060004000400404004004000000040004000000000000000000000077352353634371737177777777777777777777777777777777777777777777777777777670504250746014304004043434275710050725100000000047004000000000000000000404000200000000000000000000000000077775743537477476777777777777777777777777777777777777777777777777777071072435274212420424200240041427060030052473400000000420000000000000000000000404040000400000000000000000000077172353653717353777777777777777777777777777777777777777777777777177477043425010410400004040043607404140061253043612000000040640000000000000000000000040400240400000000000000000176775253777777777777777777777777777777777777777777777777777777776537043471724202420424003043405607024240040243043416100000000060000000000000000000000000240000000000000000000000735077253434353577777777777777777777777777777777777777777777777773467743424014040040000604306521604000000000000100216034000000042500000000000000000000040004000000000000000000000527014343537072777777777777777777777777777777777777777777777770743535360500606034034070434702040000000040040042410501434020000000656504000004000000000004020400000000000000000003714363527707357777777777777777777777777777777777777777777777775347765160610014024072452400504042000400000000000200203030506000000000616160000000000000000400000000000000000000001634107107717777777777377737777777777777777777777777777777577767347724100424204070452521602002004000000000000040004000030314700000000042470040000000000000604000000000000000000061527077316703777777777777777777777777777777777777777777773752577716524612500563472524040040404000000000000000004000404004212520000000000047002400000000000421400004000000000000172016125613757777777777777777777777777777777777777777777765677741607521040256056152434306120102040000000000000000000000000040357340000000000650040000000000060000000000000000000705253573757277777777777777777777777777777777777777777775371777760524747025617256250004404464040000000000000000000000000000000000716707000000065242040000004074000040000000000000725363757257777777777777777777777777777777777777777777765671671702503244707657050656125212120350000000000000000000000000000000000001616520001060546006000002070400000000000000070707577277777777777777777777777777777777777777777777777371677564652645217771616070216525674774301000000000000000000000000000000000700712107700112034610000040470000000000000000170707257753777777777777777777777777777777777777777777776565352535214120747774343417470753537531000010000000000000000000000000000000070041650030677400046000253640000000000000007070737773777777777777777777777777777777777777777777777717374240607420547356534343743773676573000000000100000000000000000000000000000057252121013577777000040643740000000000000007071757777777777777777777777777777777777777777777777777656534343416520347736747343743571777741010000000001000000000000000000000000000217010000203177777742041677740000000000000725242737537777777777777777777777777777777777777777777753737470042430476770571734775376777177300000100000000000000000000000000000000034161001210102777777750000567704000000000003525375776777777777777777777777777777777777777777777777765743004341043177177365777167571677770000000010010000100100000000000000000000003002100010617777777600600000425600000000056102527377177777777777777777777777777777777777777777775363742524242147576525365777772773576710100100000001000000010000000000000000000000100210211037777777007000000000424000001200614357176177777777777777777777777777777777777777777775752542505252167537565372573577577357300000000000000000000000000000000000000000000010010201077777770077000000000000000025300020216177777777777777777777777777777777777777777777727772142525042536743534757777772777774100000001000001010000000100000000000000000000001210121777777700000000000700000000704034175777737777777777777777777777773777777777777777777577054252420356771776777273477777477710010010000000000001000000001000000000000000000000012107777777400000000000000000434303403434341577777777777777777777777777753777777777777777077025241504252563575257577775777177300000000000010000000010000000001000000000000000000001217777770000000000000000000000701612537363777777737773777777777777777777777777777777777167061626143473576377727573777777747100000010010000000000000000000000100000000000000000000357777770000000000000000000000761612535777777777777777777377777777777777777777777777776714161416007076175673572747377777730001000000000000100000000100001000001010000000000000000277777000000000000000000000000170777763777737357353757357777777777777777777777777777753422507241707716437757757775757777500000100000000000010000000000000000000001012400000000000021776000000000000000000000006707343575777777777777377777777777777777777777777777777767450615242506717653672771777377737010000000000010000000100000000000001000000001000000000000404070000000024000004000000016107777377357777777777777777777777777777777777777777777173070625042516705657757767167575770000000100010000000000000000000000000010000001010000000000000040100000176000377000770352525347777777777777777777777777777777777777777777777777656071425252435635270777777772777710010000000000000100000000011000000000000100000000000000000040252400007610004740007077602537737777777777777777777777777777777777777777307757775307406160043463527577757753577707000000000000000000000000000010000000000000010000001000000000025240000007000037000007761757777757777777777777777777777777777777777777774716773776502534165241756752707677767757770000000000000010000000000000010000000000000000010001001200061420000000000000000000003161207052777777777777777777777777777777777777377717617747777702436125260743657753777777257730102100001000000000000000000000000000000000000000001001000061400000000000000002506061657127052777777777777777777777777777777777775770777065707776561405601416165252765777577777100010000000000000000000000000000000000000000000010000102567060000000001773774352100001206107357777777777777777777777777777777177777073701752756177347360560605257653563477777070000100000000000000000000000001100000000000000001001010216100000000000606043437777777777535771677777777777777777777777777777777777775777720253617056704076161425241652577736577710100010000000000100000000000000000000000000000000000001636160000000000000000000424343437763071777777777777777777777777777177777777721747570257077717725036163425243652525777777700010001001000100000000000000000000000000000000000000101404000000000000000000000000000001757277777777577577577777777777777777735773577737051207430653524507041425241616525074743101000000000000000000000000000000000000000000000000010202020600000000000000000000000007477375777777773773737377777777777777775773576777752025070161347770240724340160652567371773300101001000000000000000000000000000000000000000010001040040000700000000000000000000077767777777577777777777377777777777737777777717161743507076146161657070524176050065256563673730000000010000100000000000000000000000000000000001002040075017700003740000020000077772507777773777773573757777777777735777737777007007342100170352573657070524016070024343571733733210100001000000000000000000000000000000000000001000077760077200007600000750000743756173777777773777357373777777735777777765307701635250610616070052725242525607043410706074773773610010000000000000000000000000000000000000100000777777700774000177000017600077774216775777777777737735357777777773777707534160060070521061001725250577752520140707060407434373333321000001001000000000000000000000000000000010137777770007700006770000777005777425621777773737777717373737777777743777777034177171030060125614165252552752576034043470702434277773732301000000000001000000000000000000000000000377777770017200017700003770027777001567377775773537351717537777777705053770436143434070104030612101612416070757434343434707056173773737321210000000000000000000000000000000101007777777430000000035700007761657777023057737736153434370703777777753027777072534341603436737410707061613611616252524340610707256173773737361000100100000000000000000001000000000177777777000000000000000075425367700456375773717273537073171777777361417777050616030141410041271527170040065255352534161460525024377377373337312000000000100000000000000010000103777776740000000002020340702576770612734736157777577577174341777770521257772171616577273430034020142534352101207614216167376167534217337377737631210001000000000000000000000100377777777700000000000140000252753470434717717235377363777373771777770525277576507177775001412535160342100052405205214704175070177777777773337333733733000001000000010010000100007777777576700720000002102141652752430525637777777535757375775277770702525777773777717120302050767050104777253721610610212527416777777773777737773772733312100100010000001000003777777777770057400000056000200256341402527535377353773735777377774030050177677177777772514101200103777777775705050161241470412707777573777373773337337373733250010000010000010177777777767700272000000374000175770002016752777557671775777375775377470276717177777773712037400142057740217737727060041020003040775773777357373377737737372373333431010001010037777777765776105750000007770006027740012452777353353771737177777377737775357777777777657571763002100212710612410535161061434343000737777577777777337333737377373733332303003037777777777777576002700000007740305057730003052557677771777477717377775777777777777777757373070104104000417651251243420107072534000437775737717377377737773737333373736373373377777777775777727770371000000777000026777400006357353777176717353775777777537777771737777377740170000630000377025724103416000057052573775737777777535733773337373776373733337377777777777777477577000000000003770002517772000534727771777717777777777773777777777775717777571270030010750304161407100617070012006100777737753535737773777377737373337333773737777777777777777777777000000000000300142437740002437577177777717357353717777777777777777777773751734000007614300037707010074010401000703717773777737435353717373737377337733777777777777777777777767765200000000300030303474340107437777777777775735777777777717777777777753567721737000000037430070707352037421000125075761777177717737271737373737337731437777577777777777777777757700000000000000404043076120001747777777777777777777777777777777777777777730507430001000753401000006004143100340003773777537712771717535277373717531343777777777777777777777777774100000000100003034307410002567377777777777777777777777777777777777777771752013410025037700000100104002016070000001771737753757172713617116352733077317777777777777777577774777772016000006000007000743600012074777777777777777777777777777777777777771612052412410735700772000000030100010170100070775717371736173753737353711653107057777777777777777775777777750275000016000007000347000074377777777777777777777777777777777777375377775210241277727777050000000000000000700000375363743563537152317071253731357317377777777777777777777777777061760000770000770024370000035677777777777777777777777777777777177777771421434120500143417007006005000000001600017527357377353716375613535352534331707777777777777737777777777776174300007700034740535770003473777777777777777777777777777777777773534163503430752142100025001010206000000000003073717717535341735133573617353531743177777577777776577777775777700374000077700077702476710043657777777777777777777777777777777777577672507701617742104371020060000100100000000000707352712737371736532535343172521343777777777777777777777777777740770000777000777012577600143777777777777777777777777777777771737761743700161614100630407050107050610020102500017716353753525361713533533172531717117777377777777777577777777774300000000700007770607775004256777777777777777777777777777737777770017171700000030601750300216100210061412517211473471735377173534352570347153170707677775767777777777777777657730000000000000017270537760021617777777777777777777777777777777771710024361614000001700250757576014070121612745763771372573433053713753177132352171311774377777577777777777577777430000000000000005027060000525677777377777777777777777777775771671600015300031200000010003002016030052410417320177774173437577070712352117153070352707777777177777577777777777777420000000000000205007030000435777777777777777777777777777737777161001020502404116100700700351701403001243524177777537073713137171751357216357171351377777757767577775277777777770105000000000000125614000161637377777777777777777777777775777712716000012100300600610601617206060340704100617777777253535256517343136131735121214325777357677776776777757757757616720000000500002070200000027477777777777777777777777777377717050705000400100101010071610404101100120120701777773771617037313725307717251123717335167777777775737771777737677777007700000027000014070000025017777777777777777777777777777737773010300001242520002000000030300607740165100777777777771617147707135301717367510714325377777737737757777677777777777475600000077000030770000024247777777777777777777777777757777340200030301010143414003416500010161034020773777777777771707331352717375215313671635101777717577777775777577577777703677000001770000047740000107377777777777777777777777777737534100100000020030201021343212177060002503177775777777535770731475251617031736161101016367777777657777277777777771777077340000077700000375200016074777777777777777777777777777777730000010001010001021000153534317173412147717777777777737771073031631617070517036373614177777777774775761777776775770054300000377600007777000250077777777777777777777777777775735701000001000001001003012153535637173577357777373777377777777071611613435272035014010337777717717777777777734777777770200000000777001007770001607077777777777777777777777777377773000100000010000000100017013531353572717737177775777771777717161631611201017037737775777777677777777537775773577777061000000000000020077700007007777777777777777777777777775773500000010010000010010001213343175727353773577757777377177777776173052163577777777777777777775347753777657777777776776100000000001070000024000700777777777777777777777777777773777000100000000010010001001715317031717757177173737375777777777712141253577373775737777277777777737675777776375777717716000000010020000030521430601477777777777777777777777777775373100000000010000000000121303535371713737177357575773735777777752173773777777737777775777777777577777577177776717777616000000200001210002402417423777777777777777777777777753777700000000100000000010000116152135073752577356737373775737777777777353777357377777573777777777776357276377777777777777017000010000024000052503402547777777777777777777777777777770100100100000000010001010311313437305317125373567175733477777777777771717735777777757777777777357777775777707757677706774000670001434005200342704377777577777777777777777777771734000000000000100000000035230533111735737737173537737577777777777777777737777777777777777777757707757777657777737577707770001775020777205274305216777737735377777777777777735777130000000000100000010000111531417251235017153537525737137777777777777777717777777777717777777777777771617777777577777052770027767403775600774704257577777777777777777777777773777000100001000000000000103030121301375137352370713737537577777777777777777777777777777777777777765727777777775367777770775216177703477761657770705237737777777777777777777777775301000010000000000000000013517171717013615357173757717343777777777777777777777777777777777773777537577777771777777777616563407777442577524377707027777771777777777777777777717373500000000000000100001001312303112317351361307153313717177777777777777777777777777777777777757777777777775777777717777012142147772106776106776524147777777777777777777777777774352101200000000000000000000111116116112351353533747717335377777777777777777777757777777717777777777777757777767777777756042142052142507706107770707071777777777777777777777777317016161100100000000000000016125213513515361353453313635707777777777777777777777777777777777777777777777777777777577777734304343252052052050617070607777777777777777777777777101521613016134301000000000001713531701212121116171335757171357777777777777777777777777777177777773577777777777775777777777400434344047025205261602434167777717637717777777777777702503507107010521210300000035371161735753534312134530317353777777777777777777777777777777675777777777777777777777777777770703434034307504361420410706177777777577771637777777777753503016107030505250103000071673535331361735717133517107103777777777777777777777777777777373757777777777777777777777777770600616034202704161430612506717677773777777577777777777777775210703503031216101717171163525677171723527507343712577777777777777777777777777773577777777757777777777777777777777401771616005614306025070416017777777777777777777777777777777777771410307041610777777777717171103525357353735371717777777777777777777737777753777757777777777777774777777777777776167760414777070615706003601677777777777777377777717777777777777777774101301777777777777777777771717015253437161777777777777777777775777777777577375773773777777777777777774777702570772430776061427741605261777735371777757777777777777777777777777777761777777777777777777777777777771717107127777777777777777771777777777777377737777777777777777777777777777742400412477775243477341615067777777537173777777777777777777777777777777777777777777777777777777777777777777717577777777777777777777717577777735677777577777777777777777777777777053761610077705243777600260135377703677777737777777777777777777777777777777777777777777777777777777777777777777753757777777777777777773777777773537777752577777777777777777777740276160607770425257740165016777577753177777577777777777777777777777777777777777777777777777777777777777777777777777777777777777777676777777777777757772777777777777777777777777705070501607721605277342032407703777777377773537777777777777777777777777777777777777777777777777777777777777777777777777777777777753535677277775773771753617777777777777777777777200020601400401240160104052777757777771437777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777773535757377777777075777777777777777777777774343430703430705216070612410777777777773777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777377777777707377777777777777777777777700040040240060420400000007067777000000000000000000000105000000000000D6AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(5,'Grains/Cereals','Breads, crackers, pasta, and cereal',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000777777740043734074373737370737777043707777777777777743777777777000534040673577777500740000400050040042500000777770004217073737373773777730040407073377307373725000043374053000003737373777377604074377777347737377047637777777777777547777777777400750250573177777505350700050000000040004000577770404033773737373773370400040407071214377373736100372000073777777777777377704404427437307377777734341777757777757477077577777771040075000777577777040614340000000040000000003777700007773737737737377040040000007061637373773536173040004003737737373737520404040453774777737373777777767777777777705777777777770004770477737777770051004100000000000000000047777700737373773773737200004004040407173737377373737340004000777777777777736440406404247073737777777737777577777777745761777777777750017770777537777750065000000014000000001040005777733737373773373771604004004000063773773737373730000004040737373737737700406040604007777773737737777777757777777770742777757757777777757777577777601734000000213000000040004167777763737373773773021400004004005373737373737373400404000007777777773753652444040404737373777777777767567777777753475757777377774077777077713777771561410504351750000000000000017771000437373772007003040000400737373737373377240040000040473737373776345340042440573777777377377777577777777777767527077357777717737775775777777770140040037077100000000000040477770703373772253733704304000071637737373737603104000404000777777773617370744044043777373777777777777775777777777577757477737777717777777737177777740000005753176001000000000000077710007373351273773334304037361603737773773506000400000407373373653773773734040772365777373777777777777777757777756770577577777705776177777577777005000127357710040000000000400077705011340361433071214015730001061733770003717000040000377777765343763770704077344032737777777777777777777777777775752777377771377704777737777773001057517375000000000000000007777001340004373737370033723710360273773173733733434004037373640436777377070773734537477777777777777777777777765777525257777777175754007775717777740070030777700000000000000050477775377310000073773207373376004005336036007256352000033507765060470737737707377772407073777777777777777777775775767775417577777737600017737117777101400573777000000005000000000007734170771371052371337373337010033404017373337253434372040430440475617707777737352507775277777777777777757777775775637777777777771404077777357777003537157700000000000000004340007734351005021050077373777373773700004007177373003737370060440440427603737373777777773465657777777777777777777777565547777777757770000077717777775007167375000000000000000000100577515335701507130036373333373340040400436334307773735300440040060471777777777377373746175767777777777777777777777716377357774277040417773777777710731717700000000000500000040000750072571173053711001067777324000000400435430773373723440444044040463737377377377743475677777777777777777777775375657757777714074000617753537777715731775000000000000000000140006734150163413041405031100337004040400400423077377737373040040044041777777377777737443475657757777777775777777567477777777777737434005747777777777777777701000000000000000000000017737350141741030017521110100000000400400437337373737374044444040773737377737377761674367767777777777777775656757777777777777400405521077371777777777771000000000500400000041043775775214170171413710052177111040400440053737737373737340040004376377777737777752574577575757777777777777777771777777777777753540436040777577777777777100502500000000000000104167527101507006121477105010713040000040007377373737373716444074407354241737737372777772567767777777777775777757565775777777777770714054050777357177777777010050050000001000004707573517040350514140717010711771310040040737337373737376300004016777365347737777573737777565777777777777777777767777777777777777777707016177377373535777770500160004014040000015707777071357300717152503537700103610000337024253737373014074407737374074327771636777777777777777777777777775777577777777777777775353757757657777753777777710143505000000000000420077505357314141361050341510153533000707700500273737043233016773777734004776167717777777777777777777777777777577757777777777777777777777735704777735777777052050000056100000000504573417215614170516135170077352700373373042125377352373577737773737737773534407777777777777777777777777777777777757777777777777777717777407707777737777701050000400014000000050030753751701016153050434037135310137377352104037304250732373777777737737772404406572777777777777777777777775777777777777577777777777777777045177777537777701000500050400073040070577053653507317053171714177534316373373734317304000303737773773737773772444061652775777777777777777777777777777777777777677777777777777775067577377777771070050014000077141017500773141250714705257371304712411017377733637724000404343717777777777377040407440657777777777777777777777777777757777777775777777777771777770572777777777771052500400007104040470077714105073531505346525035353104313523773370004040000340273733737377174042443470747777777777777777777777777777777757777777777777777777777770571771777777770014300007314000010140534107014143560734110505107173117703161137004000004040301777777777776377440641474377777777777777777777777777777777777775707777777777777777777765777777777710014005054000000404007717053430501141416350167125776143535377100000404000040773737737371616525341464077777777777777777777777777777777777777776577773777777777777704077735777777771401420000000000000771752140410716100715371711507010000705734340040000400033377777777563773736442537777777777777777777777777777777777775757717477777577777777777507105777777777700040500004004005271456105313410415351040507170100571050143410024000400017377737371736173777753544777577777777777777777777777777777577677657743477773777777777777057604353553777040170500000000005473116535441710430701313507173100071016110037100400403736337777760416773737763777777257777777777777777777777777777775777756543577777777777777777075070402741470004070400007504071457717731061770415061701161775014014017340336030000370034271730406635377761777377347777777777777777777777777777777777757777756777777777777777777743040057121741405000005500007700370571414141051734140534135301731421410037713005377003001760440440576527377777777777777777777777777777777777777777757777561635777775777777777704354100177717353400050520070577144007061735305301531073417770141040143000000347733330040020406044042437757777777777777777777777777777777777777777777777777775777777737777777777507377770377757771004377750525305335711507535377042561717101710350140053053100003777610040340444004040407377777777777777777777777777777777777777775777777575775657777777777777771777777777577737774005770061775254177721703405171010141712500404250143750414000100037361353044044424404777737777777777757777777777777777777777777777777777777777377777777777777777757171737353577700376107577771034351570514176053416077141301001104141000001004000737373204004400440563777773777777777777777777777777777777777777777777775657757777777177777777740257777577677377357414773777777514043052412511241710535035101070004100711250031003737204044420444243777377777777777777777777777777777777777777777777757777767757777777577777777055614016141014014707617571777777717107113414341530417101430417171300001071351410173714000400472405773767777777777777777777777777777777777777777777777777757577777777773577777770061616140164400071417773531743777777577414341041410716101410000471711400050031007373210400444041773743527377777777777777777777777777777777777777777777777777747577777777777777147141450706100165065675353435357077777701617134301570510700005710040043115004140002405200072407773774256577777777777777777777577777777777777777777777777577775777677777777777770434343070414147707173537753777717177777775353410467313050100053050010000401000015013303504041773777375616177777777777777777777777777777777777777777777777775777757777777777777750541404050404165047171653717777777753537777771711107507170521414070140100007100030077372007773777377737777774257777777777777777775737777777777777777777777777757757777777777777070043434252177165377531353717777777777571777777777173516530570101050101710417104103307353073777377737777776174767777777777577775777577777777777777777777777777777775753771771777057041405057416717171775353357777777777777174765777170253501071404340561013710000073733200777377737777372416477777777777773771777777777777777777777777777777777757777777775067774707143077257771777077137714777777777777777735173477535140407400101000104050000005343250177377737777377454657575777777777577773777177577777777777777777777777777775777475707575735707354145735371717357717371777777771734777777753507777311403140540505010000010002143027377737773777773652477676577777737777575777777777577777777777777777777777777577725707725675747777377775377717353715377737775775735775777777717174001571003100005610007710402007737737773777356165257747577777777757357773535777777777777777777777777777777777757577757575377571311177777761757357731177577173777771777777777777717161035040530001710510000053733737773777376737777756777777777757777777357777777177777777777777777777777777777777777777737753361037717171177335371107777737775357777777173777777717537571001041140040004000377373773777377717773777775777777777777577375371777777777773777777777777777777777777777777775771375113117717177175735737717777577777717777777571756571607573431405040000110000172137373777377436727777777777777777777737357775357357771777757777777777777777777777777777573737771133513137777177375734117371737717371717777777777717505170541401210171043500036373637377377700453577777777777777777777757777334357777777571771777757377775377777577377777357535177152103577777717537537701777571775777735777777777707352052070535050404173037100003737377430464367737777777777777777775737715153717717773777777777775777777577377777573571713117310311313735371773753771177777377537353077777777777775757715000143100130103724000073737700440404407777777777777777777737717734357777753571771753535371717777777537753777370171301711311017771717171717537357177537757775352577777771776717771571077300510733100700303720464040604745777777777777777777757771735353573753171773777735377777537177753751775373015311210313117777377777713517777177537371735352567777777717750773700571412513772300007340040404404524277777777777777777775377573537777357375357177771717535773757777353777531117131731533010717775717117752713777777757577137153177077777777104144353000751273373533700000040640460475777777777777777777777537357717535771521737573535353773775353577771753371713073503151137771731753771371477735375373717712714717577577777310000411410303737373360000004404140474377777777777777777777177757717537773173171717171716171757731073775377357130371753710370177775777375377173175777371757713717717052537177777771110061041737373360404000040466340477767777777777777777777717777737153577177175777713531071717771171775317357171171717711310777737175375317171371757573717717537777050547535777777710171103737375300004000140475253777577777777777777777771777753537777357717735371713171173753537771335757317173303711310117777777377175737177777737757770531773777770107677777525752570373737020000000406340527777777777777777777777777175777371753535371353537573017017315373753177573731713511535370311377777535717733531257353577773137373047377377771505043504005017737200105004000075257777777777777777777777777777173575716357771775353753153717171731353737173757171713033531110301777777777735753571377777753757535350004377377777777140105300373610373320000400527737737777777777477777777777757177773515353571371713773717113035775357173577353537171531437111177777777177737713175353537757337535314000377341273777361005343243043343734000037777777777777777577765777777777735717773617777375373757753535301537135317537317131717131353173031777777777717753716377777753735753530704044204377777377777735004004337333000373737737777777777476757577677777771773757771573717317571737373130121717531713753531053530107317513107777717771775353535377757373571373531000003537373737737773400000437432700137343777777777777777756767775777777775757377573577757137377575173511535313531253713413103113115313711377777771717737717375777375753775173530404043737373773773640040400003352177373377777737777777777757576777777777777357773537777357175173735013301317130313535713177117103710353217777777777717535717377777773775377171700017373737373373730040000404040012337373377777777777777777767757777777777775735353507517317777171373515311717115153530353533503111035211177777777773777731717777577777537534371007327373737377342504004040000037373736373737777777777777777757777777777775773577371731371775317177111321703130312135351313571313503531317777777777757377177777777371713717371521720500737373730301600400004003737373737377777777277777777777777777777777773577357535171701735777177771511353510116171310112131103111353135777777777377177717777777777757735173173700300373732161733400004007773737373373777773747477777777777777777777777773717353735301717317777177373771313135317171731717171313071301735377777777577377777777757777371735341373004003725240372733704002120063737373730777244345657777777777777777777777575775757134353715777777777177171617101137371121130131015353137777757777777775777777777777177535121737214001730000127337340003737003003737730003747434727777777777777777777777777737537371711135773777777717537171711312577133513713171331330757357377777777777777777777777753103571733733732040040613730034373500404373732013344346454750747777777777777777777777537575353716135356177753773535313035111352513711711350171117377377377377777777777777717153737171333773737040000000343430733736300003372000272434707256776777777777777777775777777537377717317125310177771535371715137305313153713712135330707537175775737373777777777737357577357773373700000000040000737773737030370040000336454745614757777777777777777767777777757535735711535317717073537011313411137171211351353531175353757737377757777777777777775737317333377370000404000000733733373733770004004037307257165677777777777777777777574777775373537571373130171711353751371371373571315353125313713537777373757737775753753777777773775773777307000400000400537377377377370004000000000745677725777775777777777777777777777777573537377177517170535353131071511053534331353535710172571357753717577373773777577577675033373337030710000000021237337337337000000404004007165747777777777777777777777777757777777777535777173135133531353571123713353135530353137313573767353777773777753577537437737070073777003733250040021373737737377316000000004000377727377777777777777777777777777777777775353537757171733513175271317151351357133535317111777171717775353777577777737773535753007340030733437300003724000323737300401600000000037747777777777777777757577777777777777777177777717737175351343531152531337135373171313535373707771771737777773717371717177737377733000030373730073771000007373702533121000040613737377777777777777777676777777777777777777737717517757125371353171353515113435353535353313571771770775653537577775777377171657173573400437233070373270000037342503363707000031343077777777777777776757575777777777777777775757737717777135357353171312312513133537173171703471771771637777777753737175377173377173773500005030373373303407340002527373000121720000777777777777777675676767577777777777777777777571717717107135352171715353710513113177161771347167171753537537375757377137757176170773700030737373737373300000043713250727372004007777777777777777567757576777777777777777771753773771731713535317073537131131251347537177175737717777377757777572735717771737717735357340373737373737304000040000605233737215000277777777777777777756776577777777777777777777777771717471753537531153513516113161337567177637571707175717736173757563707173535217537717170737373737376000400004000303773737321211777707777777777777756577777777777777777777537175775313531317777773533752137153175773574175737371717377777577577353575352527535737537763737373737373300000004000007733773737373607777777767777777777777777777777777777777777777777777531775777535313571317113317177577377537575670716177777352537777165753517172516153535717337377034014000400005733773373737300007777734347777777777777777777777777777777777577171753175713773771757173531735777777375734347371171617617575777757016133134361615217277173752737303703000400002733377337733734000777775674756777777777777777777777777777777777777773775303753757171377177171777717175775775174777071717763777534357715756717535125017137343737021633737300404310242337733470000007734241434757777777777777777777775777777777777777753777153757317775353353777777777777735734371771617717577773577357020115213434171257417353535001733730700037700004337733032420075676564743647777777777777777777477777777777777757775717717125777735353777757775752535767577576171771773717777147707152527571007055213735373730061673700373730000033610403713100241450470745357777777777777565747777777777777777775373771753537177173777753777773777776117717717707077175775707370535211357000505321756171617050033030377373600005340002372372006564773464767777777777777777767775675777777777777777753573717537177777575775777777534157434717757717167737737757173531525353410125570716135317304043437737373735320000405373310150473775341777777777777777775747675477777777777777777773573737577777577025677777577777353534357375777175775771616516503134353434121534357434315300073733737333734000400020342063773477434777777677777777777777757477777777777777777567777757777777777707571775777757525257357075776177737177141753713040535251000572515235315235173737773737770000000040004017333775773777777477777777777777770743777777777777777777756577775777577777753675777577737753525707777717753757734004005340017253505035251637512521163033733373733120004000004033337777437477773773717775777777777777777775777777777777777777657777577777757775777777357753747734100775701657370400005341153415343005071071410710507115063777373560000000040000377733773737777777777777670747777777777777727777777777777777757777777777777775771435777757775357534175377751774340000007342161617141000570161710712527031003373712134000000001373323737477773777777777741674777777777777777757777747777777777777777777577777777777777577377177735716107577377775100000014105141707107000000101071351117140377250073733000000360307373737777777777777761765453437577777777777777765777777777777777777777757777775777777775756717563475777657717534000004770506170716500100014303125306736037000007372730000173000003373773777777377777560563647467777377777777777536577777777777777777777777757777575777777735763753535717347777400100001536514175010140505211141507510517340040437373730033270000037207777737777773636561441641773777777777736464756577777777777777777777777777777777777775771757777770755353537500404167536170177710100005250003103712500040000043700037731300003000077777773777747573464344377777777777736753574356747777777777777777575677777777777775377077777577775277747743452525353516156150741410001000304341250040004040000737732736331200000737743777737737377504437563477777774757746065670777777777777775657677757775254777777717717357757535705371757341757765251617275100040000100517165000004000004373773373733120000007773743737707777703737776173437777777737357561477777777777777777775757675777734757777737757776376777775777357350717175071757524050100100052050100404000004006377377373372000000043770377604737377747737374467777370737777725477777777777777777775677675777757770757174757753575357717725257657756756177161613531214015000050040003304004003717337373377000000000743777704061677343737777737173706577777774773773775377777777777777565777777775777277731343777774735771757705770735717056140561405001700041000005373030403720727737377300200000000377700404043714377777373777744656277373737777774767777777777777777777777777777575757574315777173577775075773577571653535257170500534001100400337340003171000013773720031000000077707440442404277737377777340614045077747737777773577775777777777777777777777777777777535777777577765777373477537775256525507414341710406500016737370737234040273370177273040000700406160040405377777377377704607064343777777773777774725677777777777777777777777577536525735771077561775753567525775375707143705376501010400030400373737300007340060335370014137440604454040737737377737434740544144777377773777736161475757777777777777777773777777753416567167707176576757357577777525716141735710040400040403777373737737704004075737203633606160100600437673777773563434042424637377737777777456576706777777777777777777475777777777771714141414753571775737252777571657177525705040004000737337373773340000000020201737373604437340443700047373772537737404417477777773773617252414750777777777777767477767677777777777777777770777774165475757773477377470521400004000433737737737374004040404070737373730100737003737070027742563737717707737070737777477777756740777777777777777757475757077777777777777777574757777737773774161037373073773160000537527737373770034000040000073737373737347700737734043770406177734707373742563773743737371614377072777777777375253434257777777777777770707070737737773777352407740407073237000343600000377361073434004040717373737373737077737373737370000404361773777777356177044377777777777777757777777777777747475777777777777777474565654657777777737373700000007373703173373000037302527373300400030233737373737700000000000000000000000105000000000000E5AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(6,'Meat/Poultry','Prepared meats',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000733431247777777777777777777777777777777777777777777777777777777777777777777777772577777777777777777777777775677750043507777777717677777776343737737172736373635337373373727300002407477737777377377777777777777777777777777777777777777777777777777777777777777777777777777777777776767777677777775247757777776775761707373737237372737173717377373777363737733477777777777777777777777773777777777777777777777777777777777777777777777777377777777774777777377777777776777767677760104357777775673372737373737737373737373737337373337173732407777377777777777777777777777777777777777777777777777777777777777777777773777524000000000000004165777777777777777527750435677777773734737371737373173737373727372736334737337377777777777777737777773777777777777777777777777777777777777777777777777736140000000000000000000000000040507777777777777770041757777777733737273637376373736373737373713733737637777377777777777777777777777777777777777777777777777777777777777777777734000000000001404160746740040000000040657777777777775241677777377737373737373373727377373737353773737237377777777777777777777777777777777777777777777777777777777777777777735210000000044767773777577353777777652040000043777777777774161577777737725373735367373737317371737233373737737377777777777773777777777777377777377777777777777777777777777774371600000006177737534247043414747416171777737000004077777777770043777777773737373737337371737736372737776373733737777777777777777777377773777777777777777777777777777777777756370700000004577616506461407404740043406060407437760000005777777775241777777373737363737737373633737373733335273573737777777777777777777777777777737777777777777777777777777312777700000407773052507005040400000040040414052525041775340000537777775340777777773727373731737373773737373757337373637777777777777777737777777777777777777777777777777777753434777000000077757047040404004000400040004000404040406524177704000477777774177077777377353772773637373373737373237737373733777777777777777777757777777777777777777777777777437243772500000477725242404000400000000040000000000000400050412407772000057777777407477777737373337337363736537343737773373737377777737773777777777377777777777777777777777775373607346750000047750404140004000004000400000400004000000004040443400577700007777777001477777737277737737353733637373733377363734377777777777777777777777777777777777777777176372577747770000077725257040404004004000600606070745424040040000000400561617700004777777403777737737337337173737737373727771325373737737777777777377777777777777777777777763617253476347370000067745040400000000406574757577577577777577777704000000040040407770001777777754777777737537727372733737373733367373657477777777777777757777777777777777777535375361767356776000047710343400040042456535377777773752713637777757774000000004043430770004777777037777773773633737373773737337177735657727377777777777777777577777777777773537270365763565252710040775644040040042457373765725730577757757577577777777640004000040450776000777777414777777373773737373172527536725727373577777777777777773777777777777373436071675364743363770000077205340040006577707161775735476177343777373776773777740000004000434170400777777434777777373373737363733736717737776563477777777777777777777777770325253437767164733256577400047705404000004753520712577073527717707775252572537575775774000000040042573001777777057777777777373525737747773770771737373777777777777777777777352137563767743706733565777700007714742000407573672171657617161753770773537357357757777777776000004004050774000777777077777373716373737743737167077273434777777777777777777737716376562570752743712567776776000477600144000256171353435753707167370753073435257743727737777577400000004250376007777777007777773737477773776577737717773737777777777777777750730707077576772703725777747776700007705640000057177071253437617343572534771717077717353531653737777700000040040577005777777757777777773716577373727537772377733777777777377301273472777616312171774777567677770000770561040004347712165617561340177353473563435752717073431307171777400000004340370007777777077777777777673635365373673757773777777737163434767747374161631676765677667747776000077524004000534712161731347317037725347172153772710725343574716167177500000404004770007777777517777777773777777737737377337377377777727073777706347436373477777767675767776570007700534000004716774352164357075053534363717257713770125352131616107037600000000700770057777777657777777777577737377737377737375337164177474617716303434767675675675767577437000077564040400034353316171356371237773057170717717703073527074777777777757700000050601740077777777727775757477777737377377737737377727077607273630716777777577567767676747237760007702014000004770774317070757071407307277353653631717143577777777577777774000004041403700577777737575777777737577777377163763576374177670734307076657677676777676775370737461000570655600000061177130707165217121770775317075377143434377757317177775777770000000040477100777777777777777773753777737737771777735777601271616777777767477476767757363437073770007341600400004576174353160177707525371737613777316317177777357736134361677770000004161077007777777777777737170300777735673773737777670761677776776567777677776567347163477477000477041400000037716334343170537103525356535616357316167770537305070537171777770000000040077007777777777773507140500777773777777472731271777567475656776767727037352736752707630043707560400004547357435252077416343036373721775325217577072534373172534361757740000004340770047777777773052500100005777775617617357761677676777767777656350343761674775274731400074040000004056371753121735701735171715717177733535773713535215257053437173773700000404107700777777775705210434770007777773773777777777577476767777257316377341765770725321633041734304000000775772765343521763532070737677375343436570761253725217343107252577400000042407100777775210705070057750007777777777777777676767777652707306716407665361635325333700077054704000007525351734303525172553035253534737353577731743071717053167153173777500000141077005777775615250575257770007777777777777777477773435270724735673725326121633736173000734214000004756572737571613472573257125777273171257713430353521613707316361616176000040060530027777771614377725437741017777777777777767774347361437573467342530713373361337300067425400000401653715257303425357705302537717577617776161735252535241736534171737750000004106700577777777435477752577704777777777777777773337325277462567134312733727353373733400171443404000741745635217753524735737171637773713777717161435353431360512712073577700000004217300777777771603577743077700777777777777774346164775637572126127373633733273370733006721040000000747375735250717134731707031527565703757725363434361655372510717073077400004054075007777777775743477747077750777777777777337357736473402163713731733573537316333700017547040000051617436525377616571743717563577377775737170153537171325052070707147375000000001720077777777777051777705777005777777777776164625653343337373373273273233633737373004770605000004060471753752171770367125752317777537167771617637053436503735371737335700004007427100777777777777476577500777007777777777757735733252373731327337335337373523731734007701424000007147430743717071755707737357707777777771721613537073513752525252525777000000401437007777777777777053577614774047777777777625620707373361727336137337335333731723300037525004000007057717147677072705353434375735775775375717617073527703717173533521774000000400730077777777777777456777403770077777777775733737337353733731737327336336373723737300772434000000447675637717177153652757737073577777777737731743577170750707052503577000000402407500777777777777777251777147770177777777720703333613273363363733732533735233371730005705405000005357177170743416365351271577356377777771653565317217371273735271777704000000050532007777777777777775467776017740777777777737336173377317317331271373373333537323700067007244000004776574173577355734777172357375357775773763737635634375353435370777000000404002710477777777777777777147775077700777777773333337373337237337373363373072732717733700177141000004034717372532516375734352541257377773777777177535735735271617070777740000000025057000777777777777777776147774077704777777736177336374337336327337373273373373323173000716064040000473617577053617527757773375375307177777177737773734377173753777175000000000404330077777777777777777777077770577437777777337333713333631731733633137337317373737270043705500000004775776175301712557765357432525777777777737657257537707161677577770000004040033400777777777777777777774177770777077777777336363377373723733371372735732733631733320047406040000005723573077770353253177273573737177717777753735363753777771777303400000000050471007777777777777777777774077770777577777733713372336173732730373373323733613732737300017014204000025707170014774353043417753575777776777777777777577777777777774353000000040403700477777777777777777777775077743777777777363373173733371373737327373731733733733517000770605400000477716527021775707353771763736573535357777777777777757317777530740000040020070007777777777777777777777770577747777777373372336333536336132733533163363373363172270004350500004000571205710170120775735077170717253777771775777773707374775743070000000004507100477777777777777777777777770777773752536773177337363733737371633727337337343136175370005704244000000775207770052501030437177777777777567777777777757756177777352500000040400071007777777777777777777777777777777763777757336337137333713337333733737137123347436327570007705340040004375301772102161430525071717775363717777777777777777777352017400000002401700077777777777777777777777777734373577777777337723635363727127373731323612547323575716300053404044000004770707170014121043035377773537577777777577777777777775251700000000450070007777777777777777777777777370777577767727337133373337333733737300272561252361756363637400077007000000005771616570612525352527753777777777777177777777777771725364000004040007100677777777777777777777777534777776777353756723673353633773733030735073076777776777735773700437405604000004771610771701020353717677577777777577775777777777773537100004000404370007777777777777777777753736777777737257777773373372333730312163434261677353535737775777773400437005040040000771630777775753757617537475777757145735777777777777774000000400017000777777777777777777773775777777161757777767773353373733437256143737163534372737573777777777000570524140000045775771614361674217343563777777534735777777777777714000004040407710077777777777777716353653677753437776777767777372334330343704307234256352737353773757377377777000770416004000007777577777577535747773757377516043577757777577753400004000005370007777777777777777777777777772777777777777777773373336161720736714737357737537373777277777777777000572407404040007777775777777773731777374777753557577777777757741040000650427100077777777777777777777777473757777767776777767734334072525734716300077371737737353773735777777777400353416050000407777777775777777473475377753502537577777577777361040400407710047777777771657777777777777777777777777777775337336137252721630616737717673633437361773773777777777040770407060400057777777777757777753777575752757757777537717775004161400771004777735256161352535777777777767776777777353637474072725256163073733752773317173737737177377777777777000777054142400077777777777775717777777777175535777536575757534704142573100776150505001050041430375777777777777777257677777737253525236177173477771353737317131737377777777777777400177206414240047777777777777777757405147537777716553577777405256053700007150000000040041001414125377777777737177777777777725207337177372373773777353014307471657075373777777777424057516414340000577777777777777000065217575777616757177707074017770006500000000000010000100210525275777777777777572534333525737373337337377371301201637737373737725477577777777500077701654045042525743452540500400534577777775751777750474057770005010000000000100001050215050105177777777777763773737707333707377273773737525034373731737777771513707757777777740007774006524004000000000000000007507357577771777754707017370000100000000010000010100001000030712107577777777537377373737373736335370343533125373501434143113170755757657777777774004377500416504040434000000000043565737777742570525405775000040000000000000100000010140121411053503177777373773237373707373737336172777043731003471077756740010217717777777777777004137770416165240404040400400043575757775756164007773000141000000000000100010110010100501421052507177777773775737373737371725616252127530047741647077657777435005775757777777777400407773404054165210207040404247177777534004537771000460000000000000000000000001000010121143017107137737777373727373730636163735717753057777064704775357477706135777777777777777740000577771600404444540525041404757752407573752000447140000000010000000000101010011410416105710713577773737373737371671437170763653007004374014707764652574404431577777777777777777400001777773500000004040600000001757777740000477740000000100010012011000001001000121103530171053117777773737330631637436370343743704074774060565735656571606470757777777777777777774000041777777776716350747777777725000004477777400000000101010510010350101041034143501537171070737737773737671477073616177770340416007706560077440617764040435377777777777777777777440000004161753757775352507000000407777777700000010110121013013525201705103501210712507071171773773772731637212525777777075000610477040056775775776504746475777777777777777777777777404000000000000000000000404777777777770400101001201010701210111171013041035070351717127147777377173777077777777777770524041470775076005761474756765777677777777777777777777777777777765616442406146567477777777777777410010101010101010105112530172053171417155071717503177377737373212577777777777735004200420764054065767470757776577771777777777777777777777777777777777777577773577777777777777734010000101010000000000010035153101731713071352513543777737737377777777777777774360404041457704204074543474765677656577777777777777777777777777777777777473043547777777777777777410001010000000000000000001403016171071653161717752177737773637377777777777777735040004160077004702524246056565765656777777777777777777777777777777565173516170034173777777777771000100000000000000000000000105010001711317170735017737773737373777777777777777470040400070774000404004147677775777775777777777777777777777777777777777052710734537575777777777771014100000000000010001010000001061520343435353537017773777373777777777777777777354002404040770400474256157577777757347577777777777777777777777777777777150705010527771775777777775210100000010100001000001010001000140151435357153073773773723777777777777777777004040016016040040005057677757675775734717777777777777777777777775374347070034273417347777777777777530000000000010100010100201601014134303534307705374373173577777777777777777752400040640404004140524775775775777535553575777777777777777777777707535712016531750774737377577777777740001000101020014010011101125030411753411711077737567777777777777777777777712404040160404424240534175376175357563743525777777777757777777777000473417013400301717574577777777777775000300001010010014004004101413061071701077377777777777777777777777777777752400040525024141700434165757075347577577577777777777774777777770071403016701250077073737707575777777777700170500410010010101030521615171307777177757737773737777777777777777777300040000406502524141435716175717537573743757777777777777577777025420350011077006516174771777777777777777750010011041043016161052141034377777777767727777377777777777777777777777174246740440750050343570717521617757575757777775757577777777777503505000000734717217717577717777777777777777161000100105010105214377777577773777773777777563777777777777777777777014777777700050304101034161755705277777757777777777716377777777740300000401413714770737057735777777777777777777770716125252525777777777775777773777717373777777777777777777777777125777777570340102407537161617775417577777777777777757077777777104034000720407217714717365771757777777777777777777777737777777777717637737737757357777777777777777777777777763536535074752050014251716757173565777743757577777777777777535777756010010037053505771771657717677377777777777777737377377777777772536777777777757377777770777777777777777673717176777034347205007061125071307545773777775737777777777777777773777703400007041272125367165341773575777777777777737777777777773773777777377777377377777370777777777777775253747776776777735075703414104025347753731757357776577777775777777777757777410000171005714734177177743577767737777777777777777777777777777777377537367777677347777777777777673677657776773717074777714710034375373312301610307707577575777377777777777773773474040061730037716170773776177177577777777777777777777777737773775737777777673577777777777777777577577777253475677777767771067377337107351171310110713577777775777777777777757752100000173407750777077357717777737757777777777777777777777773777377777771735777777777777353673676772763617767767776776573425736530712730303601013031165375777777777777777777777605200716152570177716534777775177577777777777777777777377377577177777773777777777777777737777577777773757657777777776777571773533377731713101173011103125375777777777735777777777005721712073706136173525347767707737777777777777777777777773777777772577777777777375737777776777437477777677767677777776077373563167723010767753031101134377777777777777777777777701703417161177417761777177177077577577777777777737773773777777253777777777777775377775677777777777777677767777767717617725363353713111771110101410310135357777777757777777775770340147350167701673577707737777757737757777777737777775777677377777777777777277377777477177437776777767777777371716761771737135361774765213031713371431016777777757777777777777774034217236530777143761772577177377577777777777777777777735377777777777772737167767167337677777777767777767757677777343737037635330135771011101215073537353777777777777777777377377041605753053770757177752577757707777777777777777777737777777777777377375777777577737477776777777777707777677767675775277717325136127773012115301102114353777777777777777777777777353731257770177307771777073777777777777777777777377777777777777376377777677673725777777777777437777777777753717327537177735373517157741311210125311613077771777377777777537777735671477730077716571277717757777537777777777777777777777777773717357747777171765777677777777777776777770737363737577373637103016330371770121313530567101777567575777777773777377777167301677716377347571773437777757777777777777777777777377257677777773737777777777767777477777777773373437372733735253127353710534371353101017713533125777777677777777777777777777716771771617771737077577707777777777777777777777777774377777777677365777677777657377777777777353743733737173727773353530343773135161253531277030103527777777777777771777777777777717670777741677525723757771777777777777777777757353777777777717347776777777437371777777737257273737773737373577716303771717170121311727031731135312577777777777771777777777777777771771717377177773577377577777777777777777773727777775763527777777777777373707677777773477737373737336373737377331734770307353177163513177503031253777777777777177777777777777777777072777716177177057777777777777777777757377777777277177777777777732537347777727737777373737737637773727373343523131371307773477353703437313431477777777777125777777777777777777777570707777167777376177777777777777737377577777477377777777677637773657777735773477377777737373737373737367373561343071703477375301713101713167777777770125777777777777777777777777773752537171777177777777777775737777576777773757776777777735737577777347637777377737373567353737371737337373316131371173773537730353330350717776101577777777777777777777777773737775377776772577777777777753777747776777352777677777773437737677737776371777377773777773737373537373537735335731352536313572163531234117077771717777777777677777777777777777777777777716173757777777777773777777777737737777777767777377752777377761735777777733753737373736372736372733363730525373535273173173435137253677777777777753777777777777777767357777777767777577777777777753777767777767735677777777735377172757757725377777777773773773737373737373737373763731731125737331343152173727101057357777777753777737777777774377377737777737177777777777775637777777777737177777777777737736167777777361777777777773753773773727373737373737373373727352112521637336377353116167777777773637777777777377773777757777767527777777777777773737777777775370777767777671771707777777572343777777777775373777373253735373537353713735373736377250575350531710705617377377376177577777377776573577773777767737777777777777772777777776777377777777777777376377777773772357777777777777737773777377373727363727327363736373737337333016177161071737777776356177773737377775373776777776777717777777777777373771777777775377767776777775277717677773752177777777777777253637373377377373737373737737373737373737317373737074377777737252177377737777756717377777777774734377777777777777275271777747743767777777777776375347773770743777777777777716357375777377737377373737373733737373737073034725616527377434361617377733737773737373777777777373737777777777777773707377767767373777777777777712717277736577373777777777777713737737737377373777373737373737373737373737377773773773737773737373737773777737377777777777777777777777777777777773777777777777737777777777777373777777777773737777777777777373777777777777737000000000000000000000105000000000000A2AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(7,'Produce','Dried fruit and bean curd',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF0000000000000033273373337373373373172177765677143477212657777776567776777777747077777777777777777777757777754757777777777777777777377777777777777777777777377777777777777777102136770007770000373373373233373373372173613777767773617717725777776777777677777777771777777777777757777777707746757777777777777777777777777777777777777777777777737777777777777752412576706033277337317373737237337373303763470777675672730737677777677767777777777777777777777777775777740447575677777777777777777777777377777777777777777777777777777777777777771252637616373333733733373333733737337373137377565777574777271756777767776777777777777777777777757777706070047565477777777777777777777777777777777777777777777777777777777777777777701043777337733732737317373373233737337375236377276777617677374347777777676777777777777777577777777405771065772577777777777777777777777737777777777777777777777777777777777777777777300333733732733737237373173733737363373535275752777775367377774777777777777777777777577777777404177774065746577777777777777777777777777777737777737777777777777777777777377777777770733773773373373733273373773733373373733123375656767574737377767777777777777777777775777406546746750074756577777777777777777777777777777777777777777777777777777777777777777777773732333337337333737337333233377377373737734373777776777477737357777777777777577577777560654257757750475656577777777777777777777777777777777777777777777777777377777777777777777773777373732733773337333773737337333372733737343707777777616577737777777777777777777760475604047770640465756567777777777777777777777777777777377777777777777777777737777777777777333337333733733373737633373737337376373773737373770776777777777777777777777777777770045253404047475240434756152767777777777777777777777777777777377777777777777777777777737777777373337273373372373333737337237327337373373737377377717777777777777777577757757774040404645256561764571656747671374767777777777777777777777777777777777777777777377777777777777737333737337137337237373733733737373733737373737737737777777777777777777757777771404250041435614044406774475475277635177777777777777777777777777777777777777777777777737777777377337273337337237337337337273773737337373737373733737737737777777777777777777777642404040040404044000447770477465635267252477777777777777777777777777777777777737777777777777777773737373737337337317337337333733737373736373737773737737777777777777777577777741450404241000000007440777770475747475257353701777777777777777777777777777777777777777777777777777773333373337337337336337337733773373373737373733377373773777777777777577777704067000014104000000740067775740474747765624721676577777777777777777777777777777777777737777777377777373737363733733633737373733373337367373737377377737777377737777775777777770474757645650000000444005776563704657452777752567312047777777777777777777777777777777777773777777777773373337373273733373337333727372737337373737737737737377777777777777777774052474775347050100557000477757447750076544347772524677300677777777777777777777777777777377777777777777737367737373333737377337373737373737373737733737737777377377777777777777006440424675747446577604077774607446774476564342477717077731257777777777777777777777777777777777777777777337333337373733733337237337373373737373733773773737377777777577577777404704250450476400247400407777405440045704056547707047677404673025677777777777777777777777777777777777377777737377737373273363737373733737373737337377377377777737377777777777400474040405246750045404040757040640045426504674763736342567773447312107677777777777777777777777777777777777733333333737373373373337337373373373736737737377373737777777777777740045404040464144244343440577644044040060456714074454775256347477256256313077777777777777777777777777777777777377725213737377377373737273727372737337733737377377773777575777770004061604040564044047440777740040000444040444654565275677365267347356346243066377777777777777777777777777777773333737721235337333373733333737373737733773737737737377377777774004240474104340404004750775674074004140000040407706565477767537124765674716527135677777777777777777777777777777725217470773733733777333777773737373733377377373773777777577774004414043414004770040047777465047504070400004074757744656565777652532126167653652463150767777777777777777777777777737773773470723730337773333373737373777737377773777377777773400004647751000004740000467774164074000500000007404777714742567677777656116347747677167273705777777777777777777777777470163573777561735323577773737373773373777373773777737777740434004041601000016400005777704157700414000000040477777604756565677777776617307247167734203630357777777777777777777773777743675273776727173333737373773777373737777377377777740000470004351140004440007760746576770400000000004077777775504654747676767477765325727756565743070727777777777777777777163572777437577717777637753637737373737777777377777777770004047416405040000400005774054056507440040000044424777657652447565257674767646777430347656376347632531677777777777777777743353437777252773537656371737777777773737377773777777000000507471401100000400776140424075600770040004000577575750657006565647765777776777777737274074771643673134777777777777772777737125277777476777377777737377373777777773777777777000404404743400004000477547465140005405640044000477764774250756506565677767776747677777701277160677743466330147777777777353473777737132537777177777777777737777377773777777777777000000040040004400057706704100000561404040000457760536047740640456474767764765677676767761216770043777114636334176777777737777373777777771777777777777777777777773777777777777771000040004050400047777444410400004044000000057671457654565340477047474356777767647677474777610036764647673652437213677773773337773777773777777777777777777752544644647777777777771000044004770004774340007410000400404250747775440675000044000477447437271667777765777676777773531212716471673707243177777377777773777777377777777776756040400000000000657677777776000004000400177454740001000001400404777777737400770000040404770567473475375677767777656777767470712616674747657343063337733773737377777737777775250000000000100500400040147777771000040000577407604044140000070000077777414440475010000000077774047747276167347767675675646767677251213434717274767377777777377777737777777765000040500725656572571414004004537770000044716565604500401000000404005777750640057105000000447775704776775616735636567767676777747677767343732667477356733776177777777777777775000400070775777777577677777525000405770000004774041406470700000070004064777740040247105000040777770400775677671663570747777676777747477774761617136346657777377373777777777775000002577775774757776575656757777741600570000004704040414040500000440005074477140044041100000077774400043737765675743632342771656766767665676767616137353676177777777777777771400007777656565777773577765475647577774140470000004042407404400000040004774405676564004100000007754000007377771777767765656353077674777767567777677776530343377377777777777777040007774747775777757056175357640757675777701040000004040447340050004004474040065750400471000004750400007777777777070756565361607603436747776677574767777677337777777777777777740000747774145770775311110535375744654567775765000000005040047740400404034074161440675040044040757440000577777777777776372765677761743613716777676776576767464777777777777777770000777744776452577525343010105071741650575777777450000040400440404000004465406560045640040000777400000067665677677777756753774360767253652716056776776756777776777777777777777000177543474453457757115115014100165665676565657777000000040040040000474047500040045000474004757400000054745064040604656777674377574707675247273734677777677777677777777777777100457756744045657775315773701211400157575757575777777500000044000007577404710400005240043777574340000747664646476474464042407777406373465436734342437147677656665677777777777774003776054656161657775771775351521014377777777777565777740000004405047473404400000044160447616504000044747475675656476566546404467770437327657474773432737167657767777777777777000577056404047577757735775571353510015777777777777775777710000000777407446100000000074400775404000056767656674664676474566474424064776035307276676567476163437277777777777777740017747475675774757777773430014116171077777777777777776757740000044750605014100000007040475040400047747474656477475656666747467464046475727307135256353617253617477777777777771004770747477577177777775351117113105105777775357757377575777700000004740560400000004754707504000005674767677777767767677574746746546400066435332523725665765670723030777777777700077775777177177177777775071010141107127777777717777777777757740000007704071000000414604740400004677777777776767777777767676774746656464047663733703071725661671747677777777774007774775777176175357777711075531305105577757175717577777777777700000045704461405040405714400000777776776776777776776777777776767656656474040561733373030721765467253677777777700177577777177535377777771035312150110127775737370753517775657577740000074400040060407740400000777777777777777777777777677676777777765665646044642737373372163127345765777777770047757771717717777577777701515715310300577777754153534775777777777000000470004004047754040000777777767777777777757777777777777767676776566564600470733337333312525272567777777500077675777735717573577771103031710514100775771731356571717775775777000000040040405777400000077777777777767676466656747477677777777777676566564640463737337173733321252777777777007775777535707773577177761511430713012102777775534317775635734775775400000470400777540000077777777777656404405416414707407460656777677776566565604460737033363737373303777577700077577753771717577356177530161151715351057535773515777711577475777770150000405777400000077777777776400441753777111373511701454206467776776506746400452337373333233337337777775004777777775075777375711573117111214311110777777150377717077775777577704770000044540000077777777764004167377777710535751305157335501044677776640656540663733337335373533777707770077757571735717575777771056111715315707017717157357753471757477167777700770000000000007777777764000535357737773131173315121717533757100406777746066400473372536333233633775077500777777775701772535777777157141215217500007777357777413575357477577577505770000000007777777774014171717375777771121753121525733513317711404776756164640407333337337333737770770007775777531771517573577777731315131530011075777777773777307777757757776007770000005777777760407773131617737737131113351151173153051713771004277674674404633737333733733377507700577777717057053756357777777141717077501000177577771715715757575677777750577770000777777764053577115171353777753010377101217351313131353177300467764067404373733163352337770077000775775771317161715777757757170717537011100177777775735777777777575777700777773477777777412537177312135357377331111311315353311511050117357710007777446044333277373337337700770047775777575017571777715353757175753501070100577775775725771777577777577705777747777777440513537371117131335377112117311130357131311317153737737004767065044373333373337377007700077477757353573577775121514377173750351010017777777777577475777777757775077777777777740713712575730311435137313111035301115331011011503717113535006776442407373737273733770077004777777775357757777531510135757775357507103777777777777353527577577777704777767777764171371535337111131303531713013131134337113135303171701711777000767640433372333332377700770007717575777777777773010034131777777773101157777777777757504153777775777705777577777517371113537737312531713433111015131111517111111153531131537377500774640673371737173377007710077777777777777777751711010415377757575177765743577777773534747777777775167777777744357371703111171711311111053131037121303131313012173111103577373700677440173373333373770077400777577775737777777131001011205777777777770171715347777741417175777757760577777774173735121153737331310121101316113753111151111011717310301773317577104767046373373637337710771004777777177575377750100100501577777777777417501534157775350747777777777157777777413535737113131101171113112111111353735103134353131311111173115353777106764413336333732777407770007757575377777777171010013101057777777701777701010015735250153757757774077777734171733713141053171035317313134135371773110113713535312103171301353777107762437337173733771077740017777775075357777171001075317137777577577775340311025775340757777777754777775431311753711313111131131357717131031737777131713773771111173111301353777006740437333333737770777300077577177177777711101005315014577777753777530111400537534110777775777417777743535371371731111210113101373311111173573731713743157131107111311535253777007643337373633377747775000777775715257777170101173503173777777377710153701300753515257775777711777770311317137373110301131315377315313035317353121071317337101311301113131757775076073732373373777377771000771537771177777170053510150157777775747105341141101773705357765777647777541735213530353311110110131117331111013737313513135311577717311312134173777770065233737373377775777770000777575756177777710153100050357357761710717101370065757165777777775177776171313533171353313131311073717121313103533512153535313777771211115135777777775265233333373377777777700004756377375757771753010010315375775110531717161517737357737775777507777705353531353131311317711171113731311111353713111213130777777771130537733535373700703507173373777777777700005304735171777147710105001435047137351741410117777575737575177752577770537313131211312135771103105371153112131331301137173535313131131013531151317577146742333216337777777777700004004577017743105310111011161077505301101014357777777577767777741777543717135171131311037771111301173313111101711112113173313110131117773171314317177106374247313277777777777500004000537417101005710001071540473525357100017761775777577577775177777013737133133111311717373011131153113131317313117373111111311010177113110715377537014377342061777777777777000004000753504110771011353561317751050012177757175777577657777507777701713533113110311173737111131013110771101777101735313130110131137713510351351737770673434356167777777777777000040004775311657170777410110477777535757775777107777755777764177777071713435311131013353537301011311053713377353537531110113013113571713135135277577700343473616377777777577777000005000617571777577751757751177777777777777057753576777775517777741313531316133171353133531311010101373735317337773111313153117077731105137135173777506363061617777777737277777400061000425655377777701777765777777777777757053577557775700777777525713153131531131352513531311010153735737317135371301113353317777735317175735777777417163563607777777777536773000057000441657577771777777104777777775774777770747777560577777770533171317133113113113170171031311253533135313135771135271315351753531737331737777770277352341677737757777771775000007500044753771417775750407777575777577553575777716153777777437117125313110312101353113017125135373717131351177313131101121131377373511153575777717737735373777733777777777737000000771004465753507770142407777371753573747177777450777777777477313111313531111171303111311130117371335311301257011131131111101577711312110313777003733333377757773437377777777140000577300042571153750054465775771770541177777040177777777750771713131713131301131153011311110335371313711311317131131011213533771301111311141777433777727333773373716777767777300000057535014304351005243543477474071777777404177777777777707113153101313101133413111301031017173134311311131313512131371353571311110130170113501373733737773477373737177775777740000007777535011000464444644450517577775040435777777777770771353317130113135311311301131101737317331130103535353335317135373331112533511113577127327373333373337273737253736777735000000477777735315141615353777777770404001777737777777770171315213135311135311211310101317317311113131317737335317135131775112113513737713174007134377377377737373737370735735773700000004057777737777777777777744040005777777777777777561335313517131313131311311131101775717371311111777717135313131577737113533511535777771216337257337233737373737333723527377770000000004056575757474440400000017377777777777777777057113153335353501773531031113177573313131310177731131131716173777713513101313073777007634605327737377373737373773773372537177700000000000000000000000000567777777777777777777770731705315113131357773113105311577371311210137773113103111177777531311311131115357770773561362533737337373737373373377373736371773521000000000000041074777777777737537777777777704711131336317111373535351331130375775311131737353713113121157777131131131112101777506167374356377337373733737373373373737373727777777770707134373777777777777777777773772577777707731141111113017777331011170117131177375777531313713113113017737171161135111101776072525276377337737373773732737373373737373733077777777737671777767777777777777777777777737775077713135313111357735171371131433531357777713105111135311301057713131113533530177717352527525237373373737337373637377737373737377307777777777776537373777777777777777777777773770477713111310131373713011013113353101771337711131213733131111377353537377751111771477777352161737337372733737333736333373373737337737077756777777777775375777777776777777777777730777353301531171171311317311317313111035110353111110177531301577737353531377777770777777777373373737373773737733737772773737377733737343773477377675777737777767777777777777777714757353131171121171711111301735353313131311353131131037371107777373313110177777477777777777737373737373372733733733373373737333773737370347374777776777773477777777677777777777433735317133131113131031311173573311111131111317131101353131377735311300115777750777777777777737373733737737373773377377337373773337737377333433073777777777737377777777776777677057131713511101017131110173373331731307113010731711311173537777131130111217775277777777777773737337373733733732337337337737373377733737337373737352352777777777777777767777777777037531310313110217131313177171731111137311111531311121177757733131537311777765777777777777773737337333773773773737377337337373337737377337373737377373437777777737777777777777775013535311110111371711177373371373107173531037171311110171317531031777711777077777777777777337336337773333373373737337736337376333737337373373373337373734356777777753777777677760713131131010351131373717171331113533713101177317131131311113113177531777707777777777777777337313723337777337373637733737737333773737727337337377737373773735775777777343777767710771717113135303513535313173533313177131137577717173531521301315737777771777777777777777736336363163712337737373733773733737373273733733637736333737373373737273677777773737777740773717353731713103131353113535371317713512577717173531111101337777777747777777777777777313777176163737337337373773373733737373737733773337337737373773737737353736777777771767760753507353531113107171117103531371317773713577313537135311105777777770777777777777777776363737777752527316737373373373763337373733773377337733737373373733373737171777767767173100753535373531711131313311113171131135353151253111107131131137777776577777777777777777777177476377377756733173737377373336737337377337333733377373727737277737373736161757777777400711535313121107135351130107313121777315305351030117353113577777717777777777777777777737737134347777373567133737337373733733737337737273377337373733737333737273737373637777677700773535353131317131253131117371111375311311371110017317101777774777777777777777777777476777773725277777376753437137373733772737733737373372737373737377737273737377373752735637740771311353111317131311101017331307737715341351310017131137777077777777777777777777737137373737737167737735273327237373733373733773737363373737373735333737337373337373373433477300777131313053535351353111735310117771701315331101617135777547777777777777777777777777770737373777373477777756537430373737373773377373737373737373733773373737377737377337373307500477711111301313131311333531311777173171537110101777777540357367777777777777777777373737677577777377347727737473774343537373377337373737373637373373357373737333737337733373733730077773535353711171310573711113777353112157110077777734376347377777777777777777770733437033237377373737527773767377727032353337737373737373737367373373737337733737333777373737370006773131111353011131713713011777353513773110177770457436343436177777777777777737677777747537377777773716161777773777757273733733737337373737337363373637323733737733317373737371214375313531311317565351311177177311357775377700063767757777716252773777777773437716577372761716373777737373436747737725252173373737737373737737373733373737363732373637327332737000435713111131537773121013777753535777777550475353617676777271634343434777777777737074771772737373737377773713707477777777072373533737373733737373737337733733377373337337373733730000757777577577575113577777777777776740247677761707375675674777616732617716577777370777777747743477373777773737343773777756172733737373773737373737333733773337373737337333737373700050577777777777577777777777777010747777677767765271671676347774770727737777777773434743737373725361737337773777074736377252521637373373737373737373733373733733733737373373373371240441675777777777777735614045676777676767776777763434354776076576577777777777777737377777777777373777773777737737777777777773733737373737373737373737373373373373337337337337337333161434565747475656561616377777677777767777677777677637257777677777700000000000000000000010500000000000092AD05FE'); +INSERT INTO "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(8,'Seafood','Seaweed and fish',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF0000000000000021312121001212103012101120511213001003031000000000001001201000031434130127125003036131617112161707121633525212434101612140103000000001000010000001000000000000010000000000000000100102120005212143012525002070011030101770000000000001001200070431030521125306171134303436170643125351431717043523421052136001002010020100200001020100010000000000000100000021310316114104031050307010303401035203003073000000000001002101000031071430161771407072535353717341752534363761634352153525252411700000002100000100000100000000000000010010003000100114211021201343030103430100312121010301710000000001020010001007007021316161302717353434371734367377371717173525257616137171360000100104002100007000000000000000010000200000100316211203104250103016101125061614121201437600000000000103003004101313534313177500717373535773534717535377777174071301216516165170070600030100000000100000000000000000001000000014211251007100212107012306121001303410301371000000000000001001006124252134343137437775373737777707737775375377370477777532735327124010100000001000002001001000000000000000001000211230303112041352101214130106121071211037500000000100010020102043513353437177703753737753537773477777377737537563010103471634716412520210121020001001000000000000100000000000001251014304204120016125013016001413001243772000000000012001012054303614353717371747377777377777347777777777777756357777777177171610252141060000000000000000000000000000000010210130303030311006171212130305210121341301317710000000000000120010025351734353777770777777777777777577777777750602004000000016124371675252161010410002010000000000000000001000000000014316100253000125050030301204120300341377000000000300100121034070361373753777377777777777777767672525004241447420704046004100400435353070212000400000300100000100000000002100003030310351204352121217050341420150350337770000000100010210103007171375357377777477777777777752705464464604766640446464644606460704024347125001000010030000000000000001000010003016100021021001214130103030120013021037577000000012010010121610657375737377777777777777774040644466567600406400040006000000476746424400212534120430000000000000000000000000003000310313521705241212016310161003503143533770000014010030216101341735737777777777777774740404647460406040042040004620040000000440240467504040025000000000001000000000000000030000000021001001200214316110701030402143031777700000212010010107161347737737777777777727000606676764000000047047640000444644640002040000466464040020041200012000000000000000000001010013523121311041310112530303042112035373770000001010201034312170773777777777777600444664404040070416000000750000000000000000046400560000046744004200001001000000000000100000002000001000525060120430612011610015217135377700000520001121011071737777777777774040476767400000206400640425675200000000000000064000046440000046767400101000000000000000000001201010043121312121124131031215201216025125371770000024012120161637353477777777770464676440000700004740400777777700000000000000000007747600674640000446740002000000000000000000001002000000520012121006030011211201007021317377700003070010121311717353777777524476777600067046404006730331777716101031000000000000047777704040000000044664014121000000001001000000100421312113041706011413705205312101350717373000104030120534371717347777444676460420000464006421171531537133131313133130100000000077700000006740000067400002000000000000000000030041000012241130001321300121130404034333717100000603016113137173775775647767400047400470000703417133113313713131135313133100000000160000000000000650467460010000400000000000010000020013041302112430520712161033007135353637000131430314343537371737674766765000420476000065713337113301311317337333737313110010000100000000000000640046540000002000100000020010001010241101306110431110353125013002537351710000161410331353535377747664004067607400404777521111113101353313337737373337333301011300110100000000000000006620100000000001000100200020001302305112003161212102533404353353737000137061371535373777764677000702444660000077760103131212133337311773737377717310313130130213011000000000000476400060100000000010010040010001300121216142125350713001025335371700003703173173737777767777640046740000470527777012112101317352710033773331773001331371011011101301113000000006774000000010000000201200121020305116125000351210330107124137173527000713547357377777777746464000006460000677777730113111203131311300013777373172101073131030121301313011200000004674004000000000001000000000100121301031250215214136103106117173531001733717377777777676400000075000000057777776101313311133737337310003777377317271373130113101310312111100000004460000002001000003004210000016121031304071211213012507017373617000371753777777777767670006746460000773737377300131373733773001717000003377733721037310131213131213013031300000006740000010000001200010003030301007061002121025341703300737171700017537277777777777767400074006777377170737735013137773373100000330000017177773103373013101303031311301110000060474000300000000301000200100001031131121417017110303114343537373016333771777777777664000066470171331333331737720013177773770000000730000002003773737330003121131313331303310000006764000000001000000041002010007060021520013012730707210073777771017533777777777675000000002533131737173737337100113377773773310100110000010001043735300101133133735371101210040047764000100000030001200100210131135132106107251013101777777777073713777177777747760066000173307371313331337373000311377773777770017200000001000331031000031313737731000131012774066400012000001000020120030000021012010612310123716173716577717171777717777777776006500077317133333373733737710013133777777777310031000000000131303130001313373750000000101304600474000000000000007010101001035131215300114313501210370712530777373737777777666440764617337333017371313730333700013113370737777301170100000013131373010001337377300000000310000000460100001001200000020021020012021210706030612353017710712531377777777777777400064001737131373213337331371733000013013510437377773332101007770131343000001777371710170000030040476520012000200041210010000101215141210013011215213710131253075777373717777760000000073733737371217133521333770000100313000347777307310207777100600010000131777373737310013104607764000000001000100061201200021213030300705321521435207701347777777777777766704760007333533733335313313337173300010010312000103773731031177310211111700000127773777777001210070067600010010000420210101000100141203150430120512121370070077131677377777774776007461033733733717333335317133337000000013113000053717731003375311303373700003113777377737101004670447400200000000101020000300303030142130433130717037001701700771177737777766000006043173733733737371303033525373000000013113131313331031177731311153777710003031000077733714000400642000000000012041012100000003152112103050031211770070070077007377777776400474404333733731733331331313132133331000000013131130311213037773131333377777771311021001373773000000076410100000005001020000210100142111250241307125377103107701700377737777740000060031753353373735337130303013353530000000011313311131131377313537377777101107003112121777300600027640000010000020303012100020002112341304170314313770077073037007737777766700067427533373377333337137131313352333531000000131311333123537373313137377777373713103011100070067600474600200000010100400000010100011250301202170307317300701700700137777777777400040442153773337371333131303052317121212100000001311131133137773313777373737737717133313100040047000674101000000202121030120020000341330701407035317770073070077007737377776400200000053333373737337173130313313312131030231201301213523173377111217377773737737733111210000645644046600200001004110102040010100400301010300313521737205701701701773777777460047400601317177373313713313371361371213002113173130331303353337733333137373337373723734331001000066427641001001200210602010121000020330703431140703171771031063077003757777767400246407643737337353733371711131331335213112030217313071301337777310103123777737337370330101001000400465603000000001201050020000200410010303072121717373702560500700173737777767004006046013537333313531333330731731213030317131212353303737337717313131113230717735350733100101000000764000300000001021210101210401213431103100431217177053017037007173777774676470000700533737373733373171731333131303530303031313210313333713731210130311010313133333130100310000064003010000000702500002000000034003070710613353737301300700700173777777767406464046653353735331317137333132712521313211313035311337373731217371000000000000000000103010005600054404300205210210010012000100243413103111210417353535007012071037373737777640006700004217313333737333537317313131303011730301231230133133131213773000100000000000000000420064046676030535301001021212010142041012200710217302412173730300710300435377777765600056400744737371713137313317335313031713231313331331337137131311337777003500000000000000007406400076434777777777773500016030100006015011211210143371217007013007053173737777767000600064072531333373713737337333733121311030310331217133313131337710001003000000000000560040670004677777737337373777353001002000413421217307034215071710700700700317353777774764000052006653535353373373333733531353312133135337131333313131353770000130101000000000466460000600247773733373737337336165102500601200121210117104333173001030042143717377777767000006650040033333371337373533733733313713103033112173131313121333000177773301100000016400077404444777373373333333333337326100010301430007032121214127171070030140313035377377764000000600005735373371737373733731717331373131123312133131313133771137777777721300024600004660067673737373373737373373333107202410421070117110710433512103035000007161737377777400000046460463533135333733733533733331731333733131313073121131373377777777733131110400004640004767777373373333333337337312301401203007012121071243341253070100702317173537777747600250000000771353733373373373373737173121731353533131310076037177777773421713131201240007000067777773737337373737333312330020160500707010713031041371343134310505303173537737766704640400066121273735337373317137333313131373333353031771771002777773770001313101000000046146777777373337333333333327206676160120121021071217070250361343130700305352173717777576000006700041111353337333735337317373735303353131331377777770017777070110313131311101000476777777737377337373733367764747476764106161403031013004335170307071021734317353773776640047606000131271237337373131733737313131313337121035777737701677700016131313131000300006777777773737333733333376767656476747416010030317073701631433031713125052131635373777774000064000003011313533737333731373137337333537313131777733777740100000013131313000310000677777777773737373737276767767767676765601243400013010301433143431617006316171735377357776604000067053073133353337353737373737313533313313137777771777700000000001313111310160647777777777777737333337770746776777777760341212103701711600523131613037105317034377177377756700000006000161053371733333337331337313133353130013733137770600000000000012301316777777777777777777777777575652105274777677740250400010301271073516161343500612527173537357477764600076400007117373333717373537377337335353130017373707310040000000000000311130676777777777777777777775252000040705010677764705203000711635004301235317171253171717353717737373560000640404771331371713335333335333533533313121231131313000470000000060004003447777777777777777777772524040406170707061057776124100041271037125371521612534247373717377737477777744000007600135371333737331737333733313113131001137171057200674056000400067746777777777777777777777440442400004070707165207474030000035005030425231713713716171753777777777777777747640040007131311713537333317331717333717121021121200064004604600000005666777777777777777777775652560404004124143507175707074000430037133516135353071253714373777777777777777777746700000717135331313137171735373331513331101000040006500670067404204467777777777777777777777765646046527424470743707070706021402005030150243534373535734637777777777777777777777746000024373313513173537333333135133371012121000675004646560042777466777777777777777777777764564654746440407065254525257750000010133512335061350353731735777777777777777777777777774404400071313313113313171717133171707000464064460067006000047667777777777777777777777774776565646142400041525273535253774020000150215307073371717777777777777777777777777777777776767600000113537353353313131171060000007604700000040047444677777777777777777777777777777777777746440604061615067617057734161202335721607171737373777777777767677776767676677767774465600007117353371313313132006504640000006000000007766767777777777777777777777777777777777777774740402525637141747257700014115303171617177177777777777647777767677774747766776777464047776025335313171317750076467000000000666040666477777777777777777777777777777777777777777777404041653450772535777701202721617125373737377777777677777777777767676767777677677777464674001731313137004600000046004000007777647777777777773777777777777777777777766676567777777774065257274357707770205013171735205371777777777777777767465445465446506447677676777774646476775210476400004762000676744664677777777777737373733737377777777777720456446474676777777075257174717157750020017121735373737377777477777746476766767466746652704667677677777747647465467674206476740447464767777777777777777737373773737777777777720456444747665474777746165705253676777701012735273707777777777777777476777775777676774765644470047767767777774776766746465447464764765777717777777777777373773737337377777777774046646676765646464777707560725771517770207001735353567373777777777476777777664765656465644767474000767767777774777777777767672574567773777777777777777777373373737737377777777004654656767665646444677563570573472777750106173703733537777777777767777747654765647656065644646476444247677777777777777777177576727137777737777777777777773773773730707777777740076647676767664746404477562537473557777030300353571743773777777767777774764264424244406424740656446765647767777777777777167707717536537773777777777777737377274340577777777774006656767676764746442460656156743143777752505213733373353777777777777746466404402465427650424074240474765007767777777777016750770773753567777777777777777777414121437777777777000765676776767674644644040771635356777772010321471747374777777777777764670404720744067406470004656560464767407767777777756777360777753763577777777777777777616034103077777777740056767776676746465464464640775774357777417070521373317377377777777767464400004446700467400656706606474240767647777777777007757177777761742577777777777777765010121410777777777024667766777676776666464440460734357777770203030527374737177777777774760000464420044474646744642474577065064777427677777770757767774752577173737777777777776121216030301777777747567776776766766674400000000047577777774010141430117373777777777777464404600002466067067476464747466646566540677647777777652775775737377617756777377777773010104101050167777771676776767676677675000000000000077777772000252020343737173717777777746400474606444044040046440046046147416740670477527777770077737737057017727737777777777750306030252120177777647656777777777767664000000000000777777410010000140143777173737777776564020640407600000000006056424066706465724470677477777752477747573077077177017773777776100101011010520777771657677777742460000000000000000007775610000010100212073717735777777746406440060440474241200046460404744470724477465676477777007077773777107716776777777777710342125203021013777567767775402050004014000000000000061430020100202001000173733777777776400044246404604665424000004656476467656452742564777777774747777771710637777517737377773020105010141101257760776776020605224707421604200000000042014100214010000057735753777777747400240040604707466456000004656647647677656740770774777737777777737731777136743777737341052120302124210777756777040414524570617461670700040000010020310010010000233773771777776046074740044424464467601000004656465640477600700646777777477777777777703776537771717776121010150510110703770777740016724724256425641474700007001250100612030030041753773777777754604464600606406470440464000000647467042763476525756777770777777773373377733743173733753403430212030201057547760017605434165070520742434760400000030701014007000303771373777377660472000614040646464706072000000046746174147616476677777777777777777777777775737353175200300101001410102736370056760562506506076474257425700470010000125210300070473775375777775474444044644004044046440640000000037777776747477077477777777777777777773777372517377737500010217030216105756561614163416470616052435607424760670030107100210061031373737377777764600064000607400060076745676100000337777777777477477777777777737777337777777773617137737214210001010012121770047607407430434075250461643560704740042007000430061605375371777377740046706064464006746406046004200004777777765406747767777777777777777773721377353737753744001070120010000167043650743470463434424427074346165647301010301012040301337377177777777460044446446060474404006774761000710677777767677767757777777777777777775014777737527377700000012503021014352525270343434341643430745616434706574000250002010071434371737357377774470604650654042464240046464047100671077777747567476777777777777777777733133573573577773700000000104102034607470564742434060743465261653461656771210303010061021037177173657377376465624644644644004600424065246301277077777676565777777777777777777777737773173773771777560000002112150135616526160743434343461605652470743477701000000010071034037353717377777746564406760674240647407000464777040577777777476167777777777777777777777377777657375377737140000000000212461616507074340656146165770470475256775242101012061025031173673477737377706400676404604404060244052677765330777777776774776777777777777777777737777771335737736770606100000301005356461647006165216705256043063424077721014200004016112143717173437777777446004440604006000444424645667777731777777774076577777777777777777777733777776521617716165752561614161764253461605745275641674252565147077777521210121007212052373477357735377737164002404656444646460464644567777731377777774676777777777777777777777777777737537703353063773777777777756470343420204025250614052066340477743050240103001413050173435253537737777470404740640065646444040606476777713737777677477777777777777777777777377773712501705252573771617617435607444652547525000605256056140077777161211303040703043037357525277773777777646466440006646000600464650477777347776774747777777777777777777777777777773070372525247075271771342570442700056200605670524203616047777706134124050030301303435253347137171737375744000024454040040400044666077777777746776777777777777777777777777717777773070503121437735370377070374240642005470725052535654007777770135216113200414160521525257077173777757367764560406600740766400004506460677777676747777777777777777777777777377777771032506161435370357071470314040404200404024242400025747776120417136141212030130523347307077353737375737576600040464644442464076406574477777654777737777777777777777777777777777325052317063536177217302171634000404002104000500776567774116153212512300417012012157071707134735735727573744406400042000047402440656647777777727777771734777777777777777777777737012341420707253521771657061010400004040612570674657656161601205071614043121705214307030613531731733563773777747604740000046440604644746777777457371777735777777777777777777777015250123505371361171210303112521000000040442467477525252121125303003300352501211211707616563434735734143353775347564600240400604004246746777776377771735737777777777777777777777210270503607071725275346160703071300100000640507472420105025001617141000212161205230611003113531612527375371737736165644740664074644756357737616717373530777777777777777777771705251030340713521735324215130141024070210420170703010052021103161212300615214305301616534707343071371617136173617056577734765416567173635371771653734717371747777777777777771021030343435025252170530501632070212140305021017021050041201104216113434071120121030431003001310317070140617535353737037353435373777073717135275347377137343527077777777777777761525350343025435316172573061053071250210121003021103030210142131030603100016170143413034703424250313136341230370317124437253734353771473716735337047357135307134217537777774777302120352171302525312533070163010010304250121001421701000710300070113143043012170303430001300711214242510061535035617102517352535271243170711635720735234363537004730737737137750714170353070434316173525306107071241000121412121121030400030171034207104216121034130143424070125031311206112303703124253734353073525216171277170142537537153616173071777343046321033034307170713735252534010303000134252102001016107002103143003031530201012507103052000714036130070525053614341716105252531617343704352125217356072530703617100717173773352010507143530703024343431712125630503030000212110307212100012502125341403014303611212143043070124112532132120003310321213407171613071717061353535343314173531713037060703273070316030302100713571435353431617001430341071050500610010510300410341301231343000501201252103004036434350152516142505251525070243061707034370070343070347025252160707502431705347171404341716170343242703421743524343070303024212121210712030012030305251425316070341705214340724110121030301210003121212103005317130713537007135307135310437135313531241352130312120030121213071735071353170312100301010101001210101030301000001010121303130000121030121030030434300000000000000000000010500000000000094AD05FE'); +; + +INSERT INTO "Customers" VALUES('ALFKI','Alfreds Futterkiste','Maria Anders','Sales Representative','Obere Str. 57','Berlin',NULL,'12209','Germany','030-0074321','030-0076545'); +INSERT INTO "Customers" VALUES('ANATR','Ana Trujillo Emparedados y helados','Ana Trujillo','Owner','Avda. de la Constitución 2222','México D.F.',NULL,'05021','Mexico','(5) 555-4729','(5) 555-3745'); +INSERT INTO "Customers" VALUES('ANTON','Antonio Moreno Taquería','Antonio Moreno','Owner','Mataderos 2312','México D.F.',NULL,'05023','Mexico','(5) 555-3932',NULL); +INSERT INTO "Customers" VALUES('AROUT','Around the Horn','Thomas Hardy','Sales Representative','120 Hanover Sq.','London',NULL,'WA1 1DP','UK','(171) 555-7788','(171) 555-6750'); +INSERT INTO "Customers" VALUES('BERGS','Berglunds snabbköp','Christina Berglund','Order Administrator','Berguvsvägen 8','Luleå',NULL,'S-958 22','Sweden','0921-12 34 65','0921-12 34 67'); +INSERT INTO "Customers" VALUES('BLAUS','Blauer See Delikatessen','Hanna Moos','Sales Representative','Forsterstr. 57','Mannheim',NULL,'68306','Germany','0621-08460','0621-08924'); +INSERT INTO "Customers" VALUES('BLONP','Blondesddsl père et fils','Frédérique Citeaux','Marketing Manager','24, place Kléber','Strasbourg',NULL,'67000','France','88.60.15.31','88.60.15.32'); +INSERT INTO "Customers" VALUES('BOLID','Bólido Comidas preparadas','Martín Sommer','Owner','C/ Araquil, 67','Madrid',NULL,'28023','Spain','(91) 555 22 82','(91) 555 91 99'); +INSERT INTO "Customers" VALUES('BONAP','Bon app''','Laurence Lebihan','Owner','12, rue des Bouchers','Marseille',NULL,'13008','France','91.24.45.40','91.24.45.41'); +INSERT INTO "Customers" VALUES('BOTTM','Bottom-Dollar Markets','Elizabeth Lincoln','Accounting Manager','23 Tsawassen Blvd.','Tsawassen','BC','T2F 8M4','Canada','(604) 555-4729','(604) 555-3745'); +; +INSERT INTO "Customers" VALUES('BSBEV','B''s Beverages','Victoria Ashworth','Sales Representative','Fauntleroy Circus','London',NULL,'EC2 5NT','UK','(171) 555-1212',NULL); +INSERT INTO "Customers" VALUES('CACTU','Cactus Comidas para llevar','Patricio Simpson','Sales Agent','Cerrito 333','Buenos Aires',NULL,'1010','Argentina','(1) 135-5555','(1) 135-4892'); +INSERT INTO "Customers" VALUES('CENTC','Centro comercial Moctezuma','Francisco Chang','Marketing Manager','Sierras de Granada 9993','México D.F.',NULL,'05022','Mexico','(5) 555-3392','(5) 555-7293'); +INSERT INTO "Customers" VALUES('CHOPS','Chop-suey Chinese','Yang Wang','Owner','Hauptstr. 29','Bern',NULL,'3012','Switzerland','0452-076545',NULL); +INSERT INTO "Customers" VALUES('COMMI','Comércio Mineiro','Pedro Afonso','Sales Associate','Av. dos Lusíadas, 23','Sao Paulo','SP','05432-043','Brazil','(11) 555-7647',NULL); +INSERT INTO "Customers" VALUES('CONSH','Consolidated Holdings','Elizabeth Brown','Sales Representative','Berkeley Gardens 12 Brewery','London',NULL,'WX1 6LT','UK','(171) 555-2282','(171) 555-9199'); +INSERT INTO "Customers" VALUES('DRACD','Drachenblut Delikatessen','Sven Ottlieb','Order Administrator','Walserweg 21','Aachen',NULL,'52066','Germany','0241-039123','0241-059428'); +INSERT INTO "Customers" VALUES('DUMON','Du monde entier','Janine Labrune','Owner','67, rue des Cinquante Otages','Nantes',NULL,'44000','France','40.67.88.88','40.67.89.89'); +INSERT INTO "Customers" VALUES('EASTC','Eastern Connection','Ann Devon','Sales Agent','35 King George','London',NULL,'WX3 6FW','UK','(171) 555-0297','(171) 555-3373'); +INSERT INTO "Customers" VALUES('ERNSH','Ernst Handel','Roland Mendel','Sales Manager','Kirchgasse 6','Graz',NULL,'8010','Austria','7675-3425','7675-3426'); +; +INSERT INTO "Customers" VALUES('FAMIA','Familia Arquibaldo','Aria Cruz','Marketing Assistant','Rua Orós, 92','Sao Paulo','SP','05442-030','Brazil','(11) 555-9857',NULL); +INSERT INTO "Customers" VALUES('FISSA','FISSA Fabrica Inter. Salchichas S.A.','Diego Roel','Accounting Manager','C/ Moralzarzal, 86','Madrid',NULL,'28034','Spain','(91) 555 94 44','(91) 555 55 93'); +INSERT INTO "Customers" VALUES('FOLIG','Folies gourmandes','Martine Rancé','Assistant Sales Agent','184, chaussée de Tournai','Lille',NULL,'59000','France','20.16.10.16','20.16.10.17'); +INSERT INTO "Customers" VALUES('FOLKO','Folk och fä HB','Maria Larsson','Owner','Åkergatan 24','Bräcke',NULL,'S-844 67','Sweden','0695-34 67 21',NULL); +INSERT INTO "Customers" VALUES('FRANK','Frankenversand','Peter Franken','Marketing Manager','Berliner Platz 43','München',NULL,'80805','Germany','089-0877310','089-0877451'); +INSERT INTO "Customers" VALUES('FRANR','France restauration','Carine Schmitt','Marketing Manager','54, rue Royale','Nantes',NULL,'44000','France','40.32.21.21','40.32.21.20'); +INSERT INTO "Customers" VALUES('FRANS','Franchi S.p.A.','Paolo Accorti','Sales Representative','Via Monte Bianco 34','Torino',NULL,'10100','Italy','011-4988260','011-4988261'); +INSERT INTO "Customers" VALUES('FURIB','Furia Bacalhau e Frutos do Mar','Lino Rodriguez','Sales Manager','Jardim das rosas n. 32','Lisboa',NULL,'1675','Portugal','(1) 354-2534','(1) 354-2535'); +INSERT INTO "Customers" VALUES('GALED','Galería del gastrónomo','Eduardo Saavedra','Marketing Manager','Rambla de Cataluña, 23','Barcelona',NULL,'08022','Spain','(93) 203 4560','(93) 203 4561'); +INSERT INTO "Customers" VALUES('GODOS','Godos Cocina Típica','José Pedro Freyre','Sales Manager','C/ Romero, 33','Sevilla',NULL,'41101','Spain','(95) 555 82 82',NULL); +; +INSERT INTO "Customers" VALUES('GOURL','Gourmet Lanchonetes','André Fonseca','Sales Associate','Av. Brasil, 442','Campinas','SP','04876-786','Brazil','(11) 555-9482',NULL); +INSERT INTO "Customers" VALUES('GREAL','Great Lakes Food Market','Howard Snyder','Marketing Manager','2732 Baker Blvd.','Eugene','OR','97403','USA','(503) 555-7555',NULL); +INSERT INTO "Customers" VALUES('GROSR','GROSELLA-Restaurante','Manuel Pereira','Owner','5ª Ave. Los Palos Grandes','Caracas','DF','1081','Venezuela','(2) 283-2951','(2) 283-3397'); +INSERT INTO "Customers" VALUES('HANAR','Hanari Carnes','Mario Pontes','Accounting Manager','Rua do Paço, 67','Rio de Janeiro','RJ','05454-876','Brazil','(21) 555-0091','(21) 555-8765'); +INSERT INTO "Customers" VALUES('HILAA','HILARION-Abastos','Carlos Hernández','Sales Representative','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal','Táchira','5022','Venezuela','(5) 555-1340','(5) 555-1948'); +INSERT INTO "Customers" VALUES('HUNGC','Hungry Coyote Import Store','Yoshi Latimer','Sales Representative','City Center Plaza 516 Main St.','Elgin','OR','97827','USA','(503) 555-6874','(503) 555-2376'); +INSERT INTO "Customers" VALUES('HUNGO','Hungry Owl All-Night Grocers','Patricia McKenna','Sales Associate','8 Johnstown Road','Cork','Co. Cork',NULL,'Ireland','2967 542','2967 3333'); +INSERT INTO "Customers" VALUES('ISLAT','Island Trading','Helen Bennett','Marketing Manager','Garden House Crowther Way','Cowes','Isle of Wight','PO31 7PJ','UK','(198) 555-8888',NULL); +INSERT INTO "Customers" VALUES('KOENE','Königlich Essen','Philip Cramer','Sales Associate','Maubelstr. 90','Brandenburg',NULL,'14776','Germany','0555-09876',NULL); +INSERT INTO "Customers" VALUES('LACOR','La corne d''abondance','Daniel Tonini','Sales Representative','67, avenue de l''Europe','Versailles',NULL,'78000','France','30.59.84.10','30.59.85.11'); +; +INSERT INTO "Customers" VALUES('LAMAI','La maison d''Asie','Annette Roulet','Sales Manager','1 rue Alsace-Lorraine','Toulouse',NULL,'31000','France','61.77.61.10','61.77.61.11'); +INSERT INTO "Customers" VALUES('LAUGB','Laughing Bacchus Wine Cellars','Yoshi Tannamuri','Marketing Assistant','1900 Oak St.','Vancouver','BC','V3F 2K1','Canada','(604) 555-3392','(604) 555-7293'); +INSERT INTO "Customers" VALUES('LAZYK','Lazy K Kountry Store','John Steel','Marketing Manager','12 Orchestra Terrace','Walla Walla','WA','99362','USA','(509) 555-7969','(509) 555-6221'); +INSERT INTO "Customers" VALUES('LEHMS','Lehmanns Marktstand','Renate Messner','Sales Representative','Magazinweg 7','Frankfurt a.M.',NULL,'60528','Germany','069-0245984','069-0245874'); +INSERT INTO "Customers" VALUES('LETSS','Let''s Stop N Shop','Jaime Yorres','Owner','87 Polk St. Suite 5','San Francisco','CA','94117','USA','(415) 555-5938',NULL); +INSERT INTO "Customers" VALUES('LILAS','LILA-Supermercado','Carlos González','Accounting Manager','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto','Lara','3508','Venezuela','(9) 331-6954','(9) 331-7256'); +INSERT INTO "Customers" VALUES('LINOD','LINO-Delicateses','Felipe Izquierdo','Owner','Ave. 5 de Mayo Porlamar','I. de Margarita','Nueva Esparta','4980','Venezuela','(8) 34-56-12','(8) 34-93-93'); +INSERT INTO "Customers" VALUES('LONEP','Lonesome Pine Restaurant','Fran Wilson','Sales Manager','89 Chiaroscuro Rd.','Portland','OR','97219','USA','(503) 555-9573','(503) 555-9646'); +INSERT INTO "Customers" VALUES('MAGAA','Magazzini Alimentari Riuniti','Giovanni Rovelli','Marketing Manager','Via Ludovico il Moro 22','Bergamo',NULL,'24100','Italy','035-640230','035-640231'); +INSERT INTO "Customers" VALUES('MAISD','Maison Dewey','Catherine Dewey','Sales Agent','Rue Joseph-Bens 532','Bruxelles',NULL,'B-1180','Belgium','(02) 201 24 67','(02) 201 24 68'); +; +INSERT INTO "Customers" VALUES('MEREP','Mère Paillarde','Jean Fresnière','Marketing Assistant','43 rue St. Laurent','Montréal','Québec','H1J 1C3','Canada','(514) 555-8054','(514) 555-8055'); +INSERT INTO "Customers" VALUES('MORGK','Morgenstern Gesundkost','Alexander Feuer','Marketing Assistant','Heerstr. 22','Leipzig',NULL,'04179','Germany','0342-023176',NULL); +INSERT INTO "Customers" VALUES('NORTS','North/South','Simon Crowther','Sales Associate','South House 300 Queensbridge','London',NULL,'SW7 1RZ','UK','(171) 555-7733','(171) 555-2530'); +INSERT INTO "Customers" VALUES('OCEAN','Océano Atlántico Ltda.','Yvonne Moncada','Sales Agent','Ing. Gustavo Moncada 8585 Piso 20-A','Buenos Aires',NULL,'1010','Argentina','(1) 135-5333','(1) 135-5535'); +INSERT INTO "Customers" VALUES('OLDWO','Old World Delicatessen','Rene Phillips','Sales Representative','2743 Bering St.','Anchorage','AK','99508','USA','(907) 555-7584','(907) 555-2880'); +INSERT INTO "Customers" VALUES('OTTIK','Ottilies Käseladen','Henriette Pfalzheim','Owner','Mehrheimerstr. 369','Köln',NULL,'50739','Germany','0221-0644327','0221-0765721'); +INSERT INTO "Customers" VALUES('PARIS','Paris spécialités','Marie Bertrand','Owner','265, boulevard Charonne','Paris',NULL,'75012','France','(1) 42.34.22.66','(1) 42.34.22.77'); +INSERT INTO "Customers" VALUES('PERIC','Pericles Comidas clásicas','Guillermo Fernández','Sales Representative','Calle Dr. Jorge Cash 321','México D.F.',NULL,'05033','Mexico','(5) 552-3745','(5) 545-3745'); +INSERT INTO "Customers" VALUES('PICCO','Piccolo und mehr','Georg Pipps','Sales Manager','Geislweg 14','Salzburg',NULL,'5020','Austria','6562-9722','6562-9723'); +INSERT INTO "Customers" VALUES('PRINI','Princesa Isabel Vinhos','Isabel de Castro','Sales Representative','Estrada da saúde n. 58','Lisboa',NULL,'1756','Portugal','(1) 356-5634',NULL); +; +INSERT INTO "Customers" VALUES('QUEDE','Que Delícia','Bernardo Batista','Accounting Manager','Rua da Panificadora, 12','Rio de Janeiro','RJ','02389-673','Brazil','(21) 555-4252','(21) 555-4545'); +INSERT INTO "Customers" VALUES('QUEEN','Queen Cozinha','Lúcia Carvalho','Marketing Assistant','Alameda dos Canàrios, 891','Sao Paulo','SP','05487-020','Brazil','(11) 555-1189',NULL); +INSERT INTO "Customers" VALUES('QUICK','QUICK-Stop','Horst Kloss','Accounting Manager','Taucherstraße 10','Cunewalde',NULL,'01307','Germany','0372-035188',NULL); +INSERT INTO "Customers" VALUES('RANCH','Rancho grande','Sergio Gutiérrez','Sales Representative','Av. del Libertador 900','Buenos Aires',NULL,'1010','Argentina','(1) 123-5555','(1) 123-5556'); +INSERT INTO "Customers" VALUES('RATTC','Rattlesnake Canyon Grocery','Paula Wilson','Assistant Sales Representative','2817 Milton Dr.','Albuquerque','NM','87110','USA','(505) 555-5939','(505) 555-3620'); +INSERT INTO "Customers" VALUES('REGGC','Reggiani Caseifici','Maurizio Moroni','Sales Associate','Strada Provinciale 124','Reggio Emilia',NULL,'42100','Italy','0522-556721','0522-556722'); +INSERT INTO "Customers" VALUES('RICAR','Ricardo Adocicados','Janete Limeira','Assistant Sales Agent','Av. Copacabana, 267','Rio de Janeiro','RJ','02389-890','Brazil','(21) 555-3412',NULL); +INSERT INTO "Customers" VALUES('RICSU','Richter Supermarkt','Michael Holz','Sales Manager','Grenzacherweg 237','Genève',NULL,'1203','Switzerland','0897-034214',NULL); +INSERT INTO "Customers" VALUES('ROMEY','Romero y tomillo','Alejandra Camino','Accounting Manager','Gran Vía, 1','Madrid',NULL,'28001','Spain','(91) 745 6200','(91) 745 6210'); +INSERT INTO "Customers" VALUES('SANTG','Santé Gourmet','Jonas Bergulfsen','Owner','Erling Skakkes gate 78','Stavern',NULL,'4110','Norway','07-98 92 35','07-98 92 47'); +; +INSERT INTO "Customers" VALUES('SAVEA','Save-a-lot Markets','Jose Pavarotti','Sales Representative','187 Suffolk Ln.','Boise','ID','83720','USA','(208) 555-8097',NULL); +INSERT INTO "Customers" VALUES('SEVES','Seven Seas Imports','Hari Kumar','Sales Manager','90 Wadhurst Rd.','London',NULL,'OX15 4NB','UK','(171) 555-1717','(171) 555-5646'); +INSERT INTO "Customers" VALUES('SIMOB','Simons bistro','Jytte Petersen','Owner','Vinbæltet 34','Kobenhavn',NULL,'1734','Denmark','31 12 34 56','31 13 35 57'); +INSERT INTO "Customers" VALUES('SPECD','Spécialités du monde','Dominique Perrier','Marketing Manager','25, rue Lauriston','Paris',NULL,'75016','France','(1) 47.55.60.10','(1) 47.55.60.20'); +INSERT INTO "Customers" VALUES('SPLIR','Split Rail Beer & Ale','Art Braunschweiger','Sales Manager','P.O. Box 555','Lander','WY','82520','USA','(307) 555-4680','(307) 555-6525'); +INSERT INTO "Customers" VALUES('SUPRD','Suprêmes délices','Pascale Cartrain','Accounting Manager','Boulevard Tirou, 255','Charleroi',NULL,'B-6000','Belgium','(071) 23 67 22 20','(071) 23 67 22 21'); +INSERT INTO "Customers" VALUES('THEBI','The Big Cheese','Liz Nixon','Marketing Manager','89 Jefferson Way Suite 2','Portland','OR','97201','USA','(503) 555-3612',NULL); +INSERT INTO "Customers" VALUES('THECR','The Cracker Box','Liu Wong','Marketing Assistant','55 Grizzly Peak Rd.','Butte','MT','59801','USA','(406) 555-5834','(406) 555-8083'); +INSERT INTO "Customers" VALUES('TOMSP','Toms Spezialitäten','Karin Josephs','Marketing Manager','Luisenstr. 48','Münster',NULL,'44087','Germany','0251-031259','0251-035695'); +INSERT INTO "Customers" VALUES('TORTU','Tortuga Restaurante','Miguel Angel Paolino','Owner','Avda. Azteca 123','México D.F.',NULL,'05033','Mexico','(5) 555-2933',NULL); +; +INSERT INTO "Customers" VALUES('TRADH','Tradição Hipermercados','Anabela Domingues','Sales Representative','Av. Inês de Castro, 414','Sao Paulo','SP','05634-030','Brazil','(11) 555-2167','(11) 555-2168'); +INSERT INTO "Customers" VALUES('TRAIH','Trail''s Head Gourmet Provisioners','Helvetius Nagy','Sales Associate','722 DaVinci Blvd.','Kirkland','WA','98034','USA','(206) 555-8257','(206) 555-2174'); +INSERT INTO "Customers" VALUES('VAFFE','Vaffeljernet','Palle Ibsen','Sales Manager','Smagsloget 45','Århus',NULL,'8200','Denmark','86 21 32 43','86 22 33 44'); +INSERT INTO "Customers" VALUES('VICTE','Victuailles en stock','Mary Saveley','Sales Agent','2, rue du Commerce','Lyon',NULL,'69004','France','78.32.54.86','78.32.54.87'); +INSERT INTO "Customers" VALUES('VINET','Vins et alcools Chevalier','Paul Henriot','Accounting Manager','59 rue de l''Abbaye','Reims',NULL,'51100','France','26.47.15.10','26.47.15.11'); +INSERT INTO "Customers" VALUES('WANDK','Die Wandernde Kuh','Rita Müller','Sales Representative','Adenauerallee 900','Stuttgart',NULL,'70563','Germany','0711-020361','0711-035428'); +INSERT INTO "Customers" VALUES('WARTH','Wartian Herkku','Pirkko Koskitalo','Accounting Manager','Torikatu 38','Oulu',NULL,'90110','Finland','981-443655','981-443655'); +INSERT INTO "Customers" VALUES('WELLI','Wellington Importadora','Paula Parente','Sales Manager','Rua do Mercado, 12','Resende','SP','08737-363','Brazil','(14) 555-8122',NULL); +INSERT INTO "Customers" VALUES('WHITC','White Clover Markets','Karl Jablonski','Owner','305 - 14th Ave. S. Suite 3B','Seattle','WA','98128','USA','(206) 555-4112','(206) 555-4115'); +INSERT INTO "Customers" VALUES('WILMK','Wilman Kala','Matti Karttunen','Owner/Marketing Assistant','Keskuskatu 45','Helsinki',NULL,'21240','Finland','90-224 8858','90-224 8858'); +; +INSERT INTO "Customers" VALUES('WOLZA','Wolski Zajazd','Zbyszek Piestrzeniewicz','Owner','ul. Filtrowa 68','Warszawa',NULL,'01-012','Poland','(26) 642-7012','(26) 642-7012'); +; +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(1,'Davolio','Nancy','Sales Representative','Ms.','1948-12-08','1992-05-01','507 - 20th Ave. E. +Apt. 2A','Seattle','WA','98122','USA','(206) 555-9857','5467',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FF0CB0C9000B090900000A009009000000000909A09A900B09000A90A00000000FFFEFFFFFFFFFFFFFFFFFCB9CFCFEFAFFFFFFFFEDFFFEDEFFDEFEFCFFFFDADA00D900009009009000000000090A00090BC0000900900000000A00ACA0E0E0E0F0E9CA9000A9CB0C00009090E0000009090B0000D009009000000900009A000FFFFFFFFFFFFEFFFFFFFFFCADEBDBDFDFDFFFFFFFFFEFEDFFFEFFFFFFFEFCAF0C9A0A0D00009A0000000000000009090A000B009A9000090000900C0900900900FA90ADA00090B00B000000009000090000009009A9B009009A00000000C000BFFFFFFFFEFFFFFFFFFFFFCF9FBCBEFBFFEBFFFFFFFEFDFFFEFDFFCFFEFFF9BC0B00909000900009000000000000900000909009A0C0B00000B00009A00E0E0E0EFCADA0C90000CB009000009A9A09A000B0090090900D00A9090009090A0000FFFFFFFEFFFEFFFFFFFFFFF0F0FFDFEDADFDFFFFFFFFFEFEFDEFEFFCFDEFEC0F0C9AC00A00A09000000090000000090A900A00009090000A00000CA00C09009090F900DA009A9000DA00D0000009C090000090B000A9A9B090000000AC00000BFFEFFFFFFFFFFFFFFFFFEDA9DF0FF9FFFFFFF0FFFFFFFFFDFEFFDEFFEFDFF9A9A0090909009000900000000000090A9000909A9000A90D090000A9000B0E0CACA0FAE9A9CA000A99A90B00000090B000909000090090D00009A900009000009FFFFFFFFFFFFFEFFFFFFEDADEBCFDEFFDADADFFFFFFFFFFEFEFCBEFDEDBEFCAD0D0E00A000000900000000000009009009000000009000A000090000000009A900DF090CA9009090E90900B00090A9009000090B009A09A90909000090B0009FFFFFFFFFFFEFFFFFFFFFD09E9CFBFBF0FFFFFEFFDEFFFFFFFFDFFDFEBFEFDA90B0A90900A9009000000000000000000000090900090A909000A0000ACB00B0C0E0AF0F0BC09000009ADA9090000090F0000900909009909A9A0900000000000FFFEFFFFEFFFEFFEFFFFEA9E9FBFDEDFFFDFFFDFFFFFCFFFFFEFEFEDFCFDEFC000D0000900000000000000000000009009000A0090090000B00900009000C00A09C0FF0F0BCA0B0A00090F0A9A900090B0900900090000B0D090A900009A000BFFFFFFFFFFFFFFFFFFFFD0F9E9F0FBEF0FAFCBFEFFDFFFFFFFFFDFFAFFAF9EFBC0A9C0A00909000900000000009000000000900000000B0000000A000000B0C90A00F0B0F009C0009000B009C000B00AD000B0099A909A90B00990000009C00FFFFFFFEFFFEFFEFFFFFCA90F0FCFFDFDFFDFFFDFDBEFFFDFFFFFEFCFCFDFEFC00900A9000000A090000000000000000B000900900000900909AC90000A9000A0C09CF00F00DA0090000909F0B909C0099A09009A00000090909A0090009A09FFFFFFFFFFFFFFFDFFFEE99CF0FDBE9EFAFCBE9EFBEFFFDEBFDBFFFFFFF0FEDF0A90AD0009009090000000000000000090090000000000009A00900090000DA0900A0AFADADB009AC900000009000A9009AD00090090909BCB09C9900090009AFFFFFFFFFEFFFEFEFEFFDACB0FDADFFBDF9FFDFDFDFDFFFFFFEFFFFFEFCF0FBED0E9009C0000000000000000000000000000000900000000009A00000090B0C00E9C00FDA90E9AC9A0A90A90A9A909AD009B900AD0A90009090B0A90000090BDFFFFFFFFFFFFFFFFFFFC09AD0B0F0BEDAFE9EFAFBEBFDAFDFFFDBFFFFFFFFCFFE9009A0B00000090A90000000000000090090000000000090009B000000000B0000AD0FADEB9E9000D00090090D0B099A9A0F09009009090B09099000000009EFFFFFFFFFFEFFFFCFFC0F0DAFCF9FD9FDF9FF9FDFDFEFFFFEFDFEDFFFFEFCFFEDE9E09000090000090000000000000000000090090000000099C00900000F000090000FDBADCADA900A9000000B009CA9C099A00B0090A9E900B00A0009009FBFFFFFFFEFFFFEFEFFC0B09AD09ADEBEFE9EF0FCBEF9FBDFFFFFFFFFFFFFFFFEFF000900090000900000000000000000900900000009009009A0A9000000900000ACA0AFAEDABF9ADA900DA9C909E9A99A9C9A9990900900909909900000000BCFFFFFFFFFEFFFDFFCBC0F0DA9EDBFDF9FF9DFBFF9FEDFFEBDFFEDBFFFFFEFFFFEC09ACB00000000909000000000000000000900900000090009000009000A0000000D0FDBEDACFBCBCBA09A0A00909AC9BA99E0A9A90090B00BCA9000000009BFFFFFFFFFFFFFEFF00909E9CB9EDAFCF0FEBCF0FE9FBCFDFFBFFFFCFFFFFFFFFFFE09009000000A0000000000000000000000000000000009A0909000090900000000BFFE9FDBC9E9BC900909900B09B0D9A0999C00090909A0909000090090FFFFFFEFFFFEFFFFC90A900B0DADBDFBFFDBDB9FDBFCFFBFFEDFDBFFBFFFFFFFFFE900B0C009090900900000000000000009000000900000AD090A0009A000000909A09F9FFEBEBEBDADBAD0BCA09C0BCB0BC9B00A9090B0F0990B000000000B9FFFFFFFFFFFDEFCA0C9CAD0DADBEBEDADBEDAFCBFCBDBCFDFFEFFCFDFFFFFFFFED00009A9000000090000000000000000000000000000090000090900000F0900000DAFEADBFDBDF0FAD0A9090B0B0090B0BD0B990000090000900000090090FFFFFFFFEFFEFFFD09A0090B0F0FDF9FFEDBFDFBCBFFFFFAFFBFFFBFBFFFFFFFFFFE09000000000900000000000000000000000000000000900900000909000000A9A9AF9DADAFCBFBCBF9F0B0F090B9A9C90B90E909090B909B0900000000090BFFEFFFFFFFFEFE00909AD0BCBDAFE9FDBCBE9FFDADAFDF9FDFDFFCF9FFFFFFFFFC000090909000B009000000000000009000000900009A009A90000000B09E0900C90FEADADFBF0DBDAF0BC090F90000B0B0DB90B00090000090B0000000009FFFFFFFFFFEFFF090C0AC9ADBDAFDBFEBEFFDFF0FFFFDBFFEFFBFFFFEFFFFFFFFEB000000A0000000000000000000000000000000000B090000009009A9000000090A9F0DFAF0FE9EBEBDBE9B0B0BC090BD09A9A9009A90090B000000009009BFFFFFFEFFFFDFC000A9090F9EFBDBEDBFDF9FE9FFBDBEFFFDBFCFF9F9FFFFFFFFD000000090009090000000000000000000000000009C0000A909A0000009009A00A9CFEA0D0FDBFBC9CADBF090D0B00990B09B9E90090B009090900000000000FEFFFFFFFEFEF00090DAF0F9EDEDBFCFBFE9FFADFEFDFCBFFFFFFFEF9FFFFFFFE90000900000000090000000000000000000000090B000009000000B0F0A0000F0D0BFDFFAFAFEDBFBF9E9EF0BA9ADA0A9C9AD09A0900090000000000000009BDFFFFFFEFFFFE0900A909F0FBFBFDBFDEFFFFDFFBDFBFFFE9FDBDF9FEFFFFFFFFC090000090000000000000000000000000000000F00000909A9090090909AD000000FBEFDFFDBFE9E9A9B9BD09DB90D09B090B909009000B090900000090900FFFEFFFFFFFED000D0CBCBDADEDEFFFFF9FDAFF9FFEDF9FDFEFEFFFF9F9FFFFF9B00000000090090000000000000000000000000B090009000900009F0AC00000A0BCFCF0BEDAFF9F9ADF0FFA9AB00B09E9A9A9E90090900900000000000000FBEFFFFFFFEDF009009B0F0FDFBFBFCBDFFEFFDEFEDFBFFEFBF9FBDF0FFEFFFFFE00000000000000000000000000000000000009F000000009BCA900B00909A0AD0D09FA9EC9AF9EF0ADBAD0BDF9C9F0B09090999A900A09000009000000000909FFFFFFEFFEFC00B0E0F9FFAFDFDFFFFAFDBFFBDFBDFCF9FCFFDFBFFBDBFFFFFD9A0000B0000000900000000000000000000BCB0B000009A0090009E9E0000900A0A0FFCBFEDAF9BFDADBBF0B0BB099DA9F0BCB0D0009009090000000000090B0DFFFEFFFFFF000099F0F0FDFAFEBDFFDFFFCFFFFFEBFFFFBDEBCF9FCBDADFFFAD0000000000000000000000000000000000090D000090090B009F09090B00C090D09FEBFCBADBEF0BDADA9FDBC9FA0B90090099A909000A00000090000000009AFEDFFFFEFC09090E9F9FBEBDFFFFBFFFFFFBDE9FFDF0F0FFBDFBEFBFFDBFFFF0900000000000000000000000000000000B9A9A00090090900FA0BCA0000B0B0E0A0F0F0BEDFEF9BCADADFA9A9A9099E99B0B9A900009009000000000000009ADFFFFDEFFDA000F0BDAFCFDFFF9FFCFFE9FFFFFFF9EBFDFFADEBFDBCBCBE9EF09A00009C000000000000000000000000090C0900900A900B0F909000900D000C090DFACFEDAF9F9EBDB9A9BDBDBDB0B9A90990D0B09009000900000000000909ADEFEFFFEF009009F0F9FBFCBFEFFFF9FFF9FCF9EFFDAF0FDBFD0FDBDBD9F9FF009000A00000000000000000000000000B090E9009090B9C9A00E090C00A000B0CB0FDB0F0F0FBE9CBCF9EDA9A9ADBCB9ADA0B0909A9000900000900000000009BFDFFFFFFC009ACBDAFDEBFFDFBDBFFFDEFFBFF9FAFDFF0F9EBFBEFEFADADBE9000090000000000000000000000000009A090000090B0ABD090900B0A900F0CB0E9F0EDAF9E9E9BBCB9EBBDBDBDB09AD0999090090009000000000000000009A0FFFEFEF00000DBCBDFBFDF0FBDEFFFFBFFDEDFEFDFADADFE9FCBDBD9FBD0BD0B0000CB0000000000000000000000009C90A900A90BC9D00A000B0009C0B09AC090F0B9ADADBF0BCBBCB9DADA9A90BDA9B0A9A09A00900090000090000000909DBEFFFFDE090DB0FBFBEDEBFFFFFFDADFDFBFBFBDFADBFFADBCBDADBEF90BD009000900000000000000000000000009A000900999A90B0A090B9C90F00BC0AC0B0EFB0C09ADA9FDBFCB9EBB9BDBDB90B9099C900990090000000009000000000ADFEDFEF0000A9F0FCFDBDFDFDFBFFFFFBEFDFCFADFBC9ADADBCBF0F90FBCBE9AC000AC0000000000000000000000009A090E90A09E900900BCA9A00B0090090009FDBB0F09F0B0B9BCB9C9E9B0BCB9CBDA9B0900B00090000000000000000090A9FADFEF0090E9F9FAFFBEBEBFDFFFFFFDFEBFDFBCFFEDBDADBCBDAFD0F90909000090000000000000000000000009009090099E900F00909909C900000A9A9E90FBCDF0BE9BDBDADB9E9BBDADB909BB090900090909009000000090000009090FEDFED009ADBCBE9FDADFDFFFEFDBDEDBFDFCBFCBCBDADADB0F9E99AF0BDA00B009000000000000000000000000900900A9B00909B09ADA0E00A00D0B0D0C0000F09BA9F9BCBB0F0BE9BBCBF9B0F9AD90B009090000000000090000000000009E9EF9E000D9ADBDFDAFFFBF9FFBFFFFFFFAFBFCBDBDADADACBDADBCF99E0D090000A0000000000000000000000000B0009000B09A000000900000000C000B00A9FFAD9CB0F9ADBBDB9F0DBF9ADB0B90B99A9A00B09090090000009000000090B9E9EF009A9ADBCBEBFDBDEFFFFDFFFBFFDFDE9FCBE0F9E9DBCB9F0B0DA99A000000D00000000000000000000900900009A90900000090900909090B09A0000900F9FABBDB0F9AD0BCB9B09AF9A9BCBBCBC90900900000000000900000000000009E9CF009E9ADBD9E9FEBFDFFFFFFCFDAFBFFFAFDBDADBE9CBCB0F0BE9E9DA09000000000000000000000000000A9090000009000000A000A000A000009000090FF9FDFBE9BF9BF9B9E9FBD9BD9CB9090B090900090009000000000900000090B09EB009C90F0FEBDFBDFDBFFBFF9FFFFDFCBCF0F0F0F0DA9E9CB0D0909A09000009A000000000000000009000900000909000000909000909009000000090DADFAFFFADBDADBF0F9E9BADBBE9AB09F9B90B0009B009000000009000000000000DAD0D0A09ADBCBDFADFBEFFCFDEFFFF9FEBDF9F0F0F0DA9E90BC9ADA9E0900000000000000000000000000009A009A9000000000000000000000000900900B0BF9EBFFF0BDA9FBDB9AD9BCF9B99B0B09E9009000000009000000000000000909ADA00090F9ADBDADFAFDFFFFFFBFF9FEBFDBEFCBDAD0F0F09E90F090990F0900009000000000000000009009090000000000000900009000000009A090A9BDBFFBDF9FFF9FFBDBEBDBBCBB9F0F0DB9B090900909090000000000090000000000009E00090CBCBFFBDFBFBDBFFFFFFEFFDFADBCBCBCBA9E9E90F09E9E0B000000000000000000000000000000A0090090900000000090009000900009A90BCB9FFEBEFFB0FA9FAF9FBD0BF0FA9B9A9E99A9A90009A000900900000000000000090BC909AC9B0F9E9EBFDEFFFDFFDFFFFDEBDFEBDBCBCDCBC9EB0DA90900D0B009000000000000000000090090900009000000000000000000000A909090F0BFEFF9F9BF0FB9FFF9FBCBBF9F99F9E90B9E90900090009000000000000090000090AC000009A0F9E9FDFDBFDFFFFFFF9FDBFDFE9DACBCB0A90B0D0F009E09A90000000000000000000000900B0900900000000000000000909009090B0F0B09F9F9FBEFC9F90FB9BF0FB9F9E9BFA99F99090900900090000900000000000000000909000900D90F9FAFBEFFBFFFFFFFFFEFFAF9FEF9E90F9E9CA0B09E090000090000000000000000000000000A00090000900090090900000A90B009090DBFBEBFFDFBFEBFF9CFDBF9FADBFBCBDBA9ADB0B0B009000909000009000000000000000000009A0BDADBDFFDBFFFFFFFFFFFFFDFFE9F0F0FA0D0A9D0CB0900B00900000000000000000000000090909000009000000000000900900009ADA9A90F9F9EFA9EDBDB9EBBAF9ABDBE9DB9B0DB9A99C9090009000000090000000000000009090000A90D0BF0FBCBFDFFFFFFFDE9F9EF0FF0F0F0DE9AD0A9A0F9E90D000900000000000000000000900000000000000000000009000B00909E909C9AF9E9E9F9FFAFBEFDBDFDBFDBF9FBE9E9B0BDB09A900090A909090000000000000000000A00909C9AFC9FFDBFFFFFFFFFFFFFEFF9FDADAD0DA9AC9E9C9C90000A090000000000000000000000009A900009000009000909000090090B0090B0BF9E9ADAF00BDBF9BBEBFADBBDAB9F9B9E9DA90B090090009000000000000000000000090900000B0D9BE9AFFDFBFFFFDFFFF9F9EFAFDADA9A9C0B00B0A9A0BD090000900000000000000000009000009000900900900000009A090A9C0B0F0F90F0BDA0BF0FADFFDF9F9FBCBFDBE9E9B9A99F90B090A90009009000900000000000000000000090B0E9FFDBFFFFDFFFFFF9EFEF9CDADBCF0DA9C09E0D0C9C0A009A000000000000000000000000090000000000000000009009009CB090909AFB0F0F09F0B0FFBFBFEBFBDBF0BDBBDBC9F0B0B0D0B09009000900900000000090000009090009A9C9BDADBEDBFFFFFFFFFEF9F0FBBDAF09E0D0A9E09A0B0B09C90090000000000000000000000900000000009009000000A0900B90090B0BBD9CB0F09EF9ADB9FFCB9FF9EBDBDBEDB0BB099F0909090900009009000009000000000000000090009ADADBDFFFFFFFFFFFDF9F0FBCDAF09E0B0AD00900D0D0D00A0900000000000000000000090009000900000000000909090A900A9A9C9FDAFA9BCBE9F0F9FE9BFFF9EBDBBEBF9BF909F0B09A9A9000909000000000000000000000000900009F0F9FBEFBFFDFBFFF9FBEF0F9CBAD0DA0D0D00D0ADB0B0A0B0900009000000000000000000009000000009000909000000090E9090DA9A9AD09FCB9CBE9AF9FFF9AFF9FBDBDF0F0BEDA9BCB90990B90000909000900000009000000090000000090F0DBDF9FBFFDFFFED9FF0F0D0F0BCB0A0F0A900C0C90D0CA9C00000000000000000000000000000000000000000090B0090A9CB09ADBDAF00BCA9FB09FE9A9FFDBFE9E9FBB9F9B9BC9B9CB00900B090A0009000909000000000000090009A9AD0FBFAFFFFCFBFCBDBE90BCB9E9AC9C9C900D0E90B0A9A9090A90000000000000000000090090000000009000B009000900090B90BDA9A90BD0F9FFD0BE9ADEBDBEF9FBFBE9F0FCBC9A90B0A99C90900909000000000090000000009000900D0BFBCFDFE9FBFEDBFDAD9EDA9E09C90B0B0CB0B00B0C9C00A09000000000000000000000000000000000000090000000900B90B0CBC0BCBCBDAF9FFFB0BDBDB9EBFDBFADBDBC9B9B90B9CB99DA0B00009000000900000000000000000000009AD9ADBBF9FFFF9FBDEBDBE9A9C9DA9E0C0CB00C090C90A0F0D0E9009000000000000000000000000000000900009090900A90E9C9B0BDB9E9FEDFFFFFF00ADADBDBEBDF9FAFFBCBCBF90B90F09909090009000900009000900000000090009009AD9FCFEF9F9FFFFF9FF0DF9EBCBC90B09009A90E90AD0900A900B000000000000000000000900000000000090000000B000909A09F0ADF0F0BFDFFFFF0DBCBF0F99FBEF9F9F9BF9090F0B909A090B009A009000009000900000000000000009E9AF0F9F9FFFFFDFFFE9FB0FD0F09E9C9A0D000090E90A0909090C090000000000000000000000000000000000B000B0009DA9A99E9F9A0F9FDFFFFFFB0B0BF0FBEFADBDAFBCBE9A9EB909C9AD9A90090090000090000900000000000000909A90F9FBFBFFFFFFFFDF9FEDFF0BDBE09A0C9A0D0B009000DAC0CA0090000000000000000000900000000090900900900009A009C9E9A9EBDBAFFFFFFDFF00DADF0F9BDBFBF9FBD9BDB9DA90B0900909009009000000900000000000000900000D0F9E9FDFFFFFFFFFBFF9FBCBDEBC9F0D0BC09A00DA00F0009A90B0A0B0000000000000000000000000000000000000909090B09A9AD0BDADF9FFFFFFFF0A9FA9F0FCBDADBE9FBE9E9A99F090B9BC0B09A900909000009090000000000000090B0ADBFBFFFFFFFFFFDFFEDFFDBDEBCBDAD09E09C0090009A00000C90C000000000000000000000000000000009A090000A00909A9F0BBCBDAFFFDFFFFFF09F09E9E9BDAFBF9F0F9B9BDAF09A900099000900900000909000000000000000000009DBDFFFFFFFFFFFFFFF9F9FADBDDF0F9ADA90E9A90CB00C9ADA900090900000000000000009000000000090900000909090BC90F0F0D9FA9FBDBFFFFFB09E9E9A9BFAF9F9EDBFADADA999A9C90B9A09B009A0000900009000000000000009099FBFFFFFFFFFFFFFFFFDFFEFDFFEB0FDAD909E900CA90090000000A9A00000000000000000000000000090000009000A000B00ADA9E9ABE9FDFBEFDFFDF00BF0BDAC9F9FBFBBCBDB9B9CBC90B09000900909009000090900000000000000000EBFFFFFFFFFFFFFFFFFFFF9F9FADBDF9ADACF09ADA9009E0B090909C0090A00000000000000000000000000A90900909090D0909ADB0BDE9AFB9EDBFFFFF000BDA9FBCBEDBCFBF9AFCB0B9A909B0909090B009000090000900000000000000099F9FFFFFFFFFFFFFFFFFFFFFFDFFCBDE9F9B0F0909CBC090CBCA0E0900AD090000000000000900000000009000000000000B00BCB0F90BDBDADEB0E9FCBE0009ADADABDBBFB9F9FDB9F90BD0BC090F0009090A90000090B000000000000000BBFFFFFFFFFFFFFFFFDFFFDFCF9EBDBDADF0FCD9ADADA09BCA9009090A09000000000000000000000000000000009009090B0009090F00F9ADE9A90F9EBFEB009ADBDAD9FADF0F0FA9BCB0F90B909B09099A900900009000000000000000000BDFFFFFFFFFFFFFFFFFFFFFFBFBFDDADEDB0FDB0AD09AC9AC090CBC90009C00B000000000000000000000090900900000A00090900BCB0BB0F0B0F0F0FEFC0F0000A0BDBE9FFBF9F9FADBD90B090B0090B0090A9009000B09000000000000009BFFFFFFFFFFFFFFFFFFFFFFDFDFDAFF9FBCF0BCBD9AD0BC90BCA900A0F00A90000000000000000000000000000009009090B000A090B9C9CB0F0F09AB0FDBFE90BC900BDBE9FDAF0B9F0BBE99F0D090B0090909090000900090000000000009FFBFFFFFFFFFFFFFFFFFFFDFFFFCBD9FE9FBDF0FCBE9AD0BCB09D0F0D00900009000000000000009000009000000000009000909C0B0DAB0BCF0B0BC9CB0ADAB0C0B0A9E9E9FBFBDBDE9F9C9BE9B0B09090A90B09A900000900000000000009FBDFFFFFFFFFFFFFFFFFFFFFFFFDBFFEF9F0FA9F9BC90DA9CB0DA0A09A0BCA9CA00900000000000000000000900090009A0A900009009A9CBCB9CBC0B0B0FDADF00BC0DBCBFBDAF9EB0B9B0BF09900909009900909000090900000000000009BFFFFFFFFFFFFFFFFFFFFFFDFF9EBFC9F9EDF09FCBC9ADA9CB0DA9E99E0D009009CA0000000000000000009000000000900090000B00BCBCB0F9EA90B0E9E9A9AF0000B00B0DAFDFF9FDBE9F90BCA99A9C9A009009009000000900000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9FF0F9A9DE09ADADBC9F0DAD09CA09ADACB00090000000000000000000000009000009000090009090F090E990F0F9B0F0F0F009C0BC9A9FBFBFFBE9F0BF9B99A0D0B0909A900B00900900000000000009BDBFFFFFFFFFFFFFFFFFFFFFFF0FF9E9F9EDDAB9E90B90E9A0B09ADA9C9E9090C9A00000000000000000000000000000B00A900009000B0B0E9BCACA9F0E0F0B0BB000A90A09E9CBDF0F9F9BD0F0DAD90B0900090900900000090000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EBF0F9ABD0F0F0C0F9CBD0DADA9E9A9CBCB9AD0DA90000000000000009000000009009000900A09A0D0BD0A9DB9E0B9F0BC90F0A09CB0DA9EBFAFBDBFAF0B09A9B0B09A9090900900000090000000000BDBFFFFFFFFFFFFFFFFFFFFFFFFFDBDAD9C9090D0F009E9B90AD0FADA9C9A9CA9000C0B0000000000000000000000090000000000000090090BC0A9DA0E9F9E00B0BEFC900BC0BCB9F9F9FBCBDBDB9F9090909C90000B0090009000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9A99A090909F090CAD9AF09E9E9ADA09E9E9A9009E900000000000000009000009009009000900090BCB0D0A9F9ADAD0F0F09B0AC90B0DA0DAF9F0FBCBCBCB0F9E9ADA909A9009009000090000000009DBDFFFFFFFFFFFFFFFDFFFFFFFFFDBE9C90D9D09A0009E9B0AD09E99E9E90DBC9A9C9E9E00A000000000000000000000000000000000090A009CB09DA0FBF00B0B0F0D00B00F0A9FA9FAFBF9FBF9F9F0B909090BC9090090000000000000009FBFFFFFFFFFFFFFFFDBFFFFFFFFD9FC9F9BDA90BC9D09000C9C0F09E9F09E9A0BCBCA9009090D00000000000900000009009000000900000909A009A0BDBCA9E09E900A09FCB0099E9CBF9FDADBDB0B0B9E90B0909000090000000000000000BBFFFFFFFFFFFFFF9FBFFFFFFFDBDFF9F90D090D9090000909A9B0BCB0F0F0F0D0909DACBCBCA0000000000000000000000000900900009A900E90DA0F9E9E9F09E90F0D000B0F00A9BF9FFAFFBDAF9F9CB9BD09A909A9009090000900000009DFDFFFFFFFFFFFFFFFFDFBFFFDBDB99C9E909090090909000090C9CBDF0F9E90BCADA009000909C00000000000000000000900000000900000900B0999E9E9E0DA9A000B0009E9E90E9FADBF9FABDBE9A9CB0B9090B090900000000000000000BFBFFFFFFFFFFFFFF9FAFDFFDBD0D009990F9CBBC9E0909090090A90ADBCBDBE90D0DAD0F0F0A0B00000000000000000090000000000009090A909A0E90F0B9A0F0C900DA0009E9AC9A9FBFDFBDFADBDF9B0F9CB090900009000000000000009BDFFFFFFFFFFFFFFFFFDBFF90009A9FBEFFFEF9CBE0900000000090F9ADBCBC9E9A9A90B0909D000000000000000000900009000009000000090BC909ADAD0E9C090000A9A00B0BDB0BCBDEBBFFBDBFA9B099AB090DA9090000000000000000FFFFFFFFFFFFFFFFFDADAD090099BF0FFFFFFF9AFF09E0F00000000090F9ADA9A9C9E9CB0CBC0A0F000000000000000000000009000009009090F0B0DAD0F0E90B0E0000F00009ADADE9BFBFFDF9EBDB9F0F0BD9DA9090009090000000000009BDBFFFFFFFFFFFFFFFFBDA900000FDFBFDBFEBC9E9E0900000900000ADAFDBDCD0B09A9CA90A9C90000000000000000000900000090000000DA090DA09A9009A0C9000009FA90C09A9BC0FF9FAFF9FADFB9BD0BA99A909900000000000000000BFFDFFFFFFFFFFFFFF9FF9CAD0090B0DAD9BD0B09090090090000090909ADAABCBCBC9E9DAD0A9E9A0000000000000000000900000090090B090A90909DA9E0D00000000E900A9AC9E0BF9FBFFDBFFDBADE90B9DBC90B0A9000000000000000BDBFFFFFFFFFFFFFFFDFF9E99909090999000090900090009000000000BC9ADD9AD009A90A9A9C900D000000000000000000000000000000A000F09ACB0A0C900A0009009B0A90009A0BF9EFFCFBFF0BD9FB9BD0B0B9090900900000000000009FFFBFFFFFFFFFFFFFBF0FFFFFF99090F09BD99C900900990009A90DAD00BDB0AD0BDBC9E9C9E0A0F0A00000000000000900000090000009090909ADB090DB0B0C9000C9EF90A9ADAD000FB9FBDF9FFFAF9BCB0BDBDA9E909000000000000009B9FDFFFFFFFFFFFFFFDFFBDBFFFFFDF99BC909A909D0BC0C90BC0DA090BD0BCBD0F000A909A099C909000000000000000000000000000B0000A0BCB0000B0C0090000B0F00FA009A9AC909EFFFBFE9FBDBCB9DB0B9A90900B000000000000000FFBFFFFFFFFFFFFFFFF9FFADFFFFFFFFFDBDBC9FDA9C9B9ADADB00D0E00AD0BCB09F9C9E9E9E0A9AC0F0000000000000000000900009009090909ADBC90C9A9CA0A90CBCBF00B0A00A9A00B9FADFBFBDBFBDA9AD9ADB9A9090900000000000009BFFBFFFFFFFFFFFFFFFF9FFBFFFFFFFFFFFDFF0BDFBDE0D0900DA0B09F9ADCB0F000B0909099C0D0B0000000000000000090000000000000009A9A090A9AD0B090CA90A090B000B0D000B0FFFFBDBCBF9CB9F99ADBD090D0000000000000009FFDFFFFFFFFFFFDBFDBF9FDBDFFFFFDFFDFFFB09FCBCB099E9E9A9AD0F00DBB0D09E90D0F0F0E0B0B0C000000000000000000000009009009A9E9C909A9000BC0CA0F0E90FA00A90B0BC00DBFF9EFFFF0FBDA9ADB9B0F909A909000000000009BFFFDFFFFFFFFFFFFFFDEBFFFFFFFFFFFFBFFC9E9BDBC9E0900D0D09A9DBAC0F9E99E9A090090900C90B00000000900000000000000000000909ABCB0C00F09A9ADFAF00B0DA90A00B0B0A00BFF9F9FBFDA9F99ADADB09A900000000000000009FBFBFFFFFFFFFFFFDBF9F0F9FDFFFFFFFDFFFF9E9F0B090A9B0B0F0DA0D9BD0A9E909CB0F0CB0F09AD0000000000000090000000000900900BC90909A99000D0AFFDFBC0FA90A90B0DAD09ADEBFFEBDFBFF0BC9B9BBDA909090000000000009FDFFFFFFFFFFFFFDFBFDF9DBFFFFFFFFFFFFDBD09F0D09E9C0C90D0B0DB0F0BFD090F090D09A9C09E00BC0000009A0000000000000000000090B0F09E90A09A0BDFFFECB0B00A00A00B0BCA09BDE9BDFBFF9BDBB0DBD0909A900000000000009BFBDFFFDFFFFFFFFFFDFADBFCBFFFFFFFFFFBFCBE909E0000B9AD0B0DB0F09C90B0F00BCB0A9C0B009F00090009000000000000900900090BCBDA90F09AC90CBCFFFEDBCACB00B09A9AF0F0F0FBFFFA9E9FFEB0DBA9BF9E9009090000000000BDFFFFFFFFFFFFFFFDBFBDBC9BDBFDFFFFDFFFDBD9E9009090000B0D0BCB9CBBCBC90BD090C90B00DA0009C0090A000000000000000009000090A9CB0BC0BCB00F0FDFACB0BCB00A00090B0F0F0F9FEDBFFBF9FB0DBCB09909A00000000000000BDBFFBFFFFFFFFFFFFDF9FBC9BDFFFFFFBFDFBFF99E9000090C90B0D09CB9C9BDBCBCADA9BC0D0B09E90A909E09C00009000000000000090B0990BC9CBC0BCB0BF0E9F9E0EB00A0A9A0A0F09AF0FBDBCB0F9FBDBB99FFB0B0990900000000009BFFFDFFFFFFFFFFFFFFFF9DB9CB9FBDFD09B9FDB0F9000000090009A0F90F9E9E99CB909C09B0090C90E90B00900B000000000000000000009E9E90B009ADA9E00BCA0A09900B0900009A9A009FADAFF9FFFFDAD0FFB90D0900000000000000BDBDBFFFFFFFFFFFFFFDBDBE9CBDFFFFF99F9FDB0FD0E99A909A90DBC990F9E9CB9EBD0CB0B0C0F0A9A09000CB09F000000000000009090909E9A90B0CBCBCBCB0B0B0F09AFB000A0A0A09AC9E09FFFDBEDAFBFFBF9A9FB9AD0B0909000000009BFFFFFFFFFFFFFFFFFFFFDF9B0909FFFFFFFFFFDBFBDAC90F0DA0009F0F0F9FBDE9D0B9C9CB090C9009CADA90E009000000000000000000B09A9EBCBE9ADACB0A0CA00A000FA9009090A09A09A09AFADBBFDFFBDBF9F9E909009000000000009DBDBDFFFFFFFFFFFFFFFFBDFDF9F9FFFFFFFFFFFDADB9AC90B0D09A90BDBCBC9ADA9FCB9A9CB0B009E090090909E0F000000000000000900BC909CBCBCF0B0E9CB09A90B0F00A0A0A0A90A0B0090F9FFFDFBFBDFE9FBE9F9A900090000000000BFFFFFFFFFFFFFFFFDFFFDFBF0F0F9FFFFFFFFFDFFFCD99E9CB009C9E9ADBDBFDBDBA9C0DB09C09E090A90CA09A09009000000009000900909ADA900FFACF0B0A00A00A0090B00900900A090ADAF0FBCBFAFFFFBDBDBDB90909A900000000099F9FBFFFFFFFFFFFFFFFDFFBFDF9F9FFFFFFFFFFFFDB9B0E9CB00B09E9FDADAD0BCBC9DBDB0CB0B090B0D0A909E9D0F9E000000000090009A9ADA9ACBDADF0B0F0B0BCBCB0FA0A0A0A0A090A90B09ADBFFDFFF9FFBFAFBF0B0900090900000009BFDFFFFFFFFFFFFFFFFFBFDFBFFDBFFFDFFFFFFFFFEDE99AD0C90DA9DA9FBDBFDF9FEBCBC9BC9CA9C000D009090A90000000000000000B0D09A9C0BDADA0FCA00E9E9E9EA0F909009000A00A00A900CBFBF9FF0FFF9FDBFDBC9900000000000ADBFFFFFFFFFFFFFFFFFFDFFFDFBFDBDFFFFFFFFFDFDBDE09A9009ADA9F0DAD0B0F099DB0F0CB0900BCB0A9CA00B0F090F000000000090009AD9ABDAFCADA0BDBB0F0FAFDFF0A0A0A0A9A09A09A9E0B0BCFFFFBFBFDFBBF9B09A09090000000099FDBFFFFFFFFFFFFFFFFFFFDFFDFFFFFFFFFFFFFFFBDA9DAC0B0BC90F0FBDBFDF9FFE9E90F90DADA090900A9C90D0BCB000000000900090B0BED0BF00900F0A0CB0F0D0EAB00B09009000A09A000900FFFBFFFFDFBF9EDBCB909000900000009FBFFFFFFFFFFFFFFFFFFFFDBFFFFBFFFFFFFFFFFFFDE9DA099C9CBBFF9E9DADABCB090F9F9ADBC909CAC00900009AD00090000000009A0B09F9AFC0D0EBDA9ADBACBEAFBDCB00A0A0A0A090A0B0B0E900FFF9FFBFFBFBBF9AD09090000000009BFFFFFFFFFFFFFFFFFFDFFFFFBDFFFFFFFFFFFFFFFFBDAD9E00B09C90F9EBDBFDBDFFF9E9AD909ADA099A0090B0000BDA00000090000900FADAD0B0A90C0F09A0DB09000ABCB09009009A00900B0B0EB09AFFFFFBFDFDFBDB9A9A0909000000099FFFFFFFFFFFFFFFDFFFFFFDFFFDFFFFFFFFFFFFDFCBDA09B9CBCBF9E9DADF0FDA9DAF9EDAE9E90DA0C900000909009C900000000900909FADAC0090B0B0F09A00E0BC909A00A0A0A0A00A0A9A00B00CADFBFFDF9FBF9ADBC99090000000009BFFFFFFFFFFFFFFFFFFBFDBDFF9FFFFFFFFFFFFFFFFBDADBC0CB0B09E9EBDB0F9ADFAD9E9BD9E9ADAD0B00000000009A9A0000000000B0DB09A9A90CAC0F00BC9AD0B0A0AE90A0B090B09A909A09ADADA09BDFBFBFBF0BFFB90A900909000009CBFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFDFCBC9009B0D0DE9F9DBCFDADFA9DAF9E9E9AD09A90C00000900909C0000000090909ABCBC000A090B00B00A90B009A99E09000A00A00A0A0B0B0A9000EBFFFFDA9F99B0F99090000000009BDBFFFFFFFFFFFFFFFFFFFDFBFDFFFFFFFFFFFFFFFFF90F0F0C9ADB9E0FEDB0BDA9DEBD0F9E9ADABC9E9A9000000000A9E00000000000F9CB0BC00D00009AC9ADAC0F0E00A9A0A900B09A9009A0A0B0E9090DBFDBFF9BF0DB9E9DA90900000009BDFFFFFFFFFFFFFFFFFFFFFDFFFDBDFFFFFFFFFFF9EFF090B0D0ACBDB9BEFDAFDA99EBDADBDE9DA9E9C000000009090909000000090B0ABC0009A000ACA0B09A9A9A90B0DA090A0A00A00EB0CB9CA90A000BFFBFF9E90BB9E99A9000090000909FBFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFF90F0D09A9DBC9EFC90BD0BDE99CADACB9E9CB09A900000090000BC000009090009D0B009A0090090900E9EDAC0AC0A90A00090A09A900B00A9CA0900BCBDBFFBDB90DB9A090090000900BDBFFFFFFFFFFFFFFFDFFFFDFFFDFFFFFFFFFFFFFDE9CF09A0A9DACBAD09BFECBDA9ACBF9BDBCBCBC9E9C000000000A9C9A0000000A9B0A00CB0C900C9A0A0A9A9A09A90BDA00A9A0A9A00A0B09A9A09A0909FFFFBF9AD0B90F99090090000900B9FFFFFFFFFFFFFFFFFF0FAFDBEBDFDFFFFFFFFFFFFB0D00D9CADBCDADAC099BC9EDB9CBCBCBCB09E9A000000000909A0C0000009000C9A900000A9A0009090DAC9E0A00AD0B0000000B09E0EADA9A09A0000BDADFF9B909B9ADB090009000990F9BFFFFFFFFFFFBDBE9FDBCBDDFAFBFDFFFFFFFDBCDB0B0A0B009A9DADBCAC0A900FA9CBCBDADFA9C9E9000009000C9B00000000090B0C0BC0B0C09A0A0A0B09A0090B0F0A00B0B0B00EA0B09A0E90ADADA9AFFBFBE9E9A9C9B0900900000009B9FFFFFFFFFFDFDFF9F0BC90A90D9EDBFFFFFFFFFFBC00D090C9E0CA900909090B90DA9DBC9F09CBA900000000090B0C900000009A900B000900B0E0900090A9CB0A0000B00A000000A909ACA9A90A9A900CBDBFDF9990909BC9A9000000099F0DBFDFFFFFFFFFBF0FCBD0BC90F9ADBFFFFFFFFFCBC9090AC0B09099C0BCBCAC0C0CB9EBCBAC9EBC9CA000090AD0A9CB00000090000CB09CB00F009A0A9A0AD0A0BC90AF0B090B0A0B0A0E0B0E9A99E9ACB00BDFAFFA9B0B09B909B0909000099A9BFFFFFFFF9FDFF9BDAD09A90090F9FFFFFFFFFDAC0A09090009E0AD00090B090B0E9CB0DBAD09E9C900000909CB00B900000909A90CA09E9ADA09000909A9AD00A90BC00A00A90090A90E90A0EB0F0BCBC9ADBDBDAD09CB0BC0900000909A9DBCBFDBFFFBFFBCBC009000909ADB0F9FFFFFFFDF9900D0BC9CB09000090000000090B09E0D0BCB0B00000000A0B0F0C000000000DA9BDA0000A0A0A0A00A900A900A0CB0A09A00A0A09A09AD0B00A0B0B0B0BFFBFF99B0909DB900900000909A9BDBFFDBFDF0F0909E0A9C0B0D09DBFBFFFFFFFACA090A00B00DAD0B00000000090009E9B0F0BCBCB0000009C90D00B000009A09A9CA09CBE909009090B00AD0E0BC9B0B00A09A9009A0BE0ABC9A9F0F0F0D0BDBDBCB09B09A9A090900909B99BF9FBDA9DB0909E0000D009C90ADB0FDFFFFFDAD909E090900F0000C00C0090000090F090E90D0F0C000009A00DA90900000009A9CB0F0B0000A0A0A0A00A90A9A00AF009A9A00A0A00000BC0AAD0A9AA0B0F0BFBFB9F0090909B000000009AD09EBDBDA0090FFF00C0000A009009FBFFFFFFFFA000900C0090BC000000000000000009E09EB0F09A00000009A90000000009009EBC90F0A9A00090000A90EB0009E90FA0009A0090A9A000B09A0BCBD9BCB0F9E9FF9B90B09F00F090900909B9999EBD90009BFFE0000AC9E009009F9FFFFFFDFDA009A90000EF0A00000000000009A09F09CB0F0D00000090C0F00F0000000BC90BF0AD0000B0A0B090A900E9A0A0F00B0A00B0A00009A00E0CB0B0AACB0BCBFBF9EBF9090099090000009090BCB9FBE900009C09E0000009009BE9FFFFFFFF09090C000B09000C0000000000009A9CA0BCB0CBCA000000009A0090000090909AFC0E9A0A0B000000A00A0B00090009A0A09A000B00A0090B0B0A0CB990DADBDBFFBD90F099A009A909090B0BDB09FF9D0B0000000000009000BC9FFBFFFFF0F0C00B0090000000000000009009C0CB09DA9CB09000000009A0900900000009AFCB090009000A9A0A09A0900B0A0BFA909A009A00A900A0A0CA00B00EABADBAFDBF9FA9090009A090000090D90BDB9FFA90FF0000000090009F9BF9FFFFFFFF0B0B009C009E900000000000000A9A9CBCACA9CAC0000000009C090A000090B0F9000A0A0A0A000909A000A0A000009E0A09A0A0B00A09009A90F00B090CB09DBBFFF9FB09B090900B090909A99090B9FDF909E9C00090090000FD0F9FFFFFDFE9C00909A0000F09000090900A90C9A90B99CB90B000000000B0000900000090AF00C90900909A0A0A0A9A0090A9A0F0B00A009000B00A0A000A00A00A9A9AFADFF9FBF9F09000090090000B90F9F09FFBEDA909A909000009BDBEBFFFFFDFEBD0B09E0A9C09000E09E000009C0E9AC0F0CABCAD00000000000DAD900000900BD000A0A0A9A0A0000090009A0A00000B00A09A0A0B00A00900B00B09A9A9AD09FFBFFFDB09090900090A9099090B0B9F9F9BFDAD00AC0909BADBCBDF9F9FFFBD0BC0090D090000909009A909E9A90D9B0CB9C09A000000000009A9E00009A0BC0000909A9000009A9A0A00A00090A0F0A09A09A9A0A909A0A00B00A0A00E90B0BFF9FBFFB90B000900990000B099D90BFFFDEBFBFF99BCB0D9E9F9BCBFFFBFCFAD0F0000A0F0BC00A900CADA90D0F0AC0BCA9F0C0000000000009F0000000D09A09A0A000A0A9A000000A900B0A000AD0A00A000F0CAA0009A00A0909A90BE9F9FFFFFBDFA909900000A99909B0B0B99B9FBDF9F9FEF0BDA9E90BC9BDADFF9F9DA90F009000009A9CADB9CBCAD0B0D9AD09E00B00000000000000000000900BC0009A9A0B09000A0A0A90A00000A009A90B09A9A0BA9CBA9A0A90BCA00A009AB0FFBF9FFBD9B009090090A090D099C0BDFBDBDE9E9909009009F09E9ADBFCFFBE9F090F0090000009000E9E9DAF0F0AD0BC9DAC000000000000000000000A90B00CA00CB00AE0B090D00A09A0B009AF0A000A00ADAD0A000009CA0A09A9A9EBC9FBDFFFBF0BC9B00009099909A9B09BDA99CB09A9000009009A09F9BDFBDBFBC9FCBEF090009000000909009A09C9AD0BCB0A0900000000000000000009090BC00B0B0B0CA90900A0A0A90A00000A0AD0A0A0A90A0AE9A9A9A0A909A0000A90BBEFFBFBDFF9B909000000BC90990B9099EB90B09CBC9CBC9E9DBDADF0BDFFFDFE9BD99CBCB00090090A000B0D0F0BCBC0BC0DA000000000000900000000B0F00CB0C0A00B0A0A0A0B0BC0AC9A0A0009AB09090A0909A0CA009A0A0A9E0B09AF0DBFFFFFBFFDAD0B90000909A9A99CB9AD9CBC9CB09A990BF9A9ADB0FFDAFDAF9FCBEFADADCB0F0DA09C900C9A90F0F0BD0B00D00000000000000090009009AD0A0B0B0F00E90DA90000B00A00C9ADABC0A0A0A9A0A00B09A0A0F0BC00B0AC00BA9FBFDBDFBF9B90D090000B909CB9099BFB9B090F9C9AFDAFDFF9FF9EBFDBFDFBBDBDFBDBBDF0FADBE0E9F0ADFE9F0F0AD0DA0000000000000000000900F0F0AD0A00A00B0A0A0ACB0E0A90B0B00A0F0A900B000B00B0AA0F09000A0B0C0B0F09FFDFBFFBFDF0A9A0000099C09B90B0FADBCF0BF9E9BFDBF9F9BCF9F9F9BDFF0FCFDE9DEFCF0FAD9E9F9BCBDF09F0F09DA0B00000000000000000000009090000A90B09A009A090B0A9A9CA0A00A900B00A00A9A0A00A0900A0A9A9A0A9A0A0BE9FAFFDBCBFBD909909A009B900BD9999BDB9D99F9F0DBFDFBCFF9EFFDEFF0FFDBFBFEBF9F9F9DEBDF0FCBE90FE0F0BCAD0C0000000000000000000090ADAD00B0CA0CA09A000A0000000A0900B0CAF0B00B00A090B09A0AB000A00900A900909A9FBFBFBF9EBF0BC909000099B0B0B0D9BDABCB0F9B0F9E9FBDBF9F0F9DBF9FBCFDBDF0FEDAF0DEBCF9FDFFF9F9E9E9B0B000000000000000000000A90B000A0B09A90A00A900A00B0A09ACB0CA90BE00A0A90B0A0A00B000B000A0A00A0A0A0DADFFFDF9FFDBD09A009A99AC0999DB0BCBD9B9F9C9F9FBDBDBCBF9FBFADFADEBDADADFDBFDBFB9DBFCBE9E9E9E9E9C0D000000000000000000009009AF09AD000A00A9A900A909A0090A0A00B00AD09A0900A0A9A90B009A000B0090B009A09A9BFBDBABDBBF9A9090099E99BDA9A9099B0BCBCB9BF9E9FAFDBFCBDAD9F9DFBDBFFFBFBEDBCFCFEFCBE9F9E9E9E9CA9A0000000000000000000000DAD00E00B0A90A90CA0A0A0A00A0A0090A0A90BA000A0B09A000A00A000A0000A000A090A0BC9FFFFDBFDEBDB0090009A9099F9B09E9F99BF9E90F9BDDB9E9BCBDAF9EBC9FCBDBDEDFADBDBF9DBFDADE9F0F9CB9C00000000000000000000009A90F009A000A00A0B0009000A9000B0A9090A0CBA90000A09A0B0B09A09000A00A090A00090BCBFF9E9BF9FBFF909A099F9A9A9D09090F090B9F9BCFB9FF9FDBDBDAF9FBEB9FEDBFBDFFEBCFEBCBDFBDADBCBACA90000000000000000000000A9E9E9AC9A900B0000A9A0A9000A90000A0A000BC9A0A9000A09A00A000A0A900900A000B00A09BDBFFFDBFBDBDAD09000B0DB9FB9A9099BDBD09ADB9EF0BDBADADF9DADF9FEF9FCFDFADBDBDBDFBE9EADBCBC99C00000000000000000000090D09A000B000A000B0A000090A9A00A9A00009A0F0A0000A0A90A00B00A00000A0A0B00B000B099EFFFBDABFDAFB99A90099FB0DB0090B0F09A9BBDB9F9BDBCBDF9F0BFFF9EDF9EFBFAFDFDEDAFE9EDBDDBCBC9E0A00000000000000000000000A0BC9CB00A0000A0090A9A0A0000A00009A0A009B00B00090A90B00A90B0A00000000000A000A09A9FFBFCBFF0FFADA99A09DBA9F900099F9DAD09E9E9CBDBDA9E9FF0F0FFBFF9FDFDBFAFBFDBDF9EDABCBC9A9C0000000000000000000000909F0BA00A09A9A09A0A000900B0A090A0A000000E9A000A0000A00A90A00090A090A0A0A09A09000DBFDFBFDBDF9FDBDAD9E0BDDB9F9900B0B99B9F99BF9BCB9F9BDADBDF9FCBFFBEBFCFDFDAFCBEF9FDE9E9EDA909000000000000000000000A09FC0B00A000000090A0A0A0009A00900A0B0A0BF0B0A00A0000B0A09A0A0000A0090090000A0B9A0BFFFFBFFBE9FFADAB990BA9EB0B0909DAF0B0FBC9DA9BCBCFBDBCBBCFBDE9FDFDBDBCBF9FDDBE9E9F9E9AC0A000000000000000000000909E90BCA900A0A0A0A0090000A0000A0A9000000E000090090A9A0009A0900A0000A00A0A0A00900C9FFBDBCBFFDBFBDBD09E9BDFB9D090B9A999CB909BA9FCBDBBCBCFBCFBDFBFCBFAFFEFFCFFEBE9F9F0E9AD0D000000000000000000909AC9EBCA00000A900900000A00B0000A090000B0A9AB9A0A0A0A00000B0A0A0A00B0A00000000900A0B000FFFFFFBFFF0FBCBDB9E9B9F9A909CBD9E9BDA9E9D0B9F9EDBDBFDFBDAFCFBDFF9F9F9F0F9FDEFADF9EDA0A90000000000000000000090A900C0B0B00000A000B0000000A09A0A9A000000CB09000000A0B00009000900009A0B00B00A09009A90BFBDBDBFFFDF9ABCB9E9E9F9E9A90BA909AD99A9F0F0F9BCBDAF9EFDBFDEBDCFEF0FFF9E9F9CFADA9ED90C00000000000000000000090BC0B0000A00A000A0000A00A900000000B00A00BCA0A090A00000A0B0A9A0A00000000000A00A09AC0BDFFFEBDADBFAFDF9F0F9FBCB9099BD9F0990BE9F0BD9BCBDBE9FEBDAFDBFDFBF9FFDADEFF0FF9FADE9ACB00900000000000000909A00BCA000A0A09A00A0900A0900000A0A9A0A00A900DA9000A09009A09000000000A0A00A0A0009000A0900BF9FBDBFBFFFDA99A9B0F9F9E90BCBE90F0BC990BD0BE9F0F9FDBDFF9FE9FAFDFCFADFBD0FF0F0DF0BC900000000000000000000009DA9009A9090A090000A0000A0A0A000009000000AB0A0A000A0A00A0A0A9A0A9009000900B0A0A9009AD00FFFFFCBDBDFBFEFDADB0FBF9AC9B99A99099A0F90BD9E9F9EF0FF0FE9FEDFDAFBDF0FCBFA9FCBF0BCB000000000000000009009C90AD0CA00A0A0000A9A0000A00000090A0A0A9A0A00CF090B0000000009000090A0A00A0A00000000A0000A90BDBFF9EBBCF9FBFDADB9DAF99ADAD9A09E9990BD0ADB9CF9BF0FF9FF9FBEFDFCBFF9FCFDE9FCBCDAC9E90000000000000000A00A90A909E9000B0A00000A090A9A0B0A090000009000B00A000A900A9A0A0B0A000000A9000B0A9A0009A9AD00BFF9FF9FDBFFF0FBDBCBBDBE909B9AD0B9A0C900B9ADAB9EDFF9CF0FEFDBDADBFCBCBF9EBEDBDBAD9A0000000000009000009009CBC0AA0A0B00090A0A090A000000000A0B0A0A0A0ACB0000A00A00000000000A90A000A9A000009A00000009E9FBEBFCBF0F9FDADAFBCBF990F9E90909C9B0E9D0DB9CFB0F9EFBFB9DBEFFBFCBDFF9EFD9F0E0D0AC90090000000000900900B0B09AC909A00A00A90D0A0009A0B0A9A0A009A00000BCA9A09000B000A90A0B000009A0000A0A9A00A0A9A9C09BDFDF9FA9FAFBFFBDBDBD0FA90B99F0B0000990A9B0FB0DF0FBDCFCFADF9EDBFFEBCFBDAF0F9DAC9000000000009000090A09C0DAC90A0A0F00B00A0A00A0A00000000909A000B0B0B00000A0A000A90A000000A00009A0909000A090000A900EBFBFFBDB9DBCBDFADAFB9FDAF9E900DB09000900C90DB0BF0FBF9BDFA9F9FCBDDF9EDBDADACB9B0F000000000000900090CA9A09A0D0BC00A00A90B0A9090A9A0B0A0A0A0A9A0000CB0A0000900A00000B0A0B00A0A000A0A0A900A0A0900A09CBFDADFCFBC9FAFDBF9FF0BC9A9A9F0000A90009B0DADBC9F9CBCFADFDEFAFDEBFEDBCF9E9F0C00009000000000000B00090009E0CA00A9A90A0A0A00E0A00000009000090000A0AB0000A000A9000A9A000000900000A0009000B0090A0A900BFFFBFBFA99EBDBFE9FE9BFDBDAD90009090009B00B0909EBCFADBDADAF9F9EBDADBEDBCBD0A9090000000000909A900A90A9DA90B00B0000A09009CB009A0A0B0A0A0B0A0A0B090CB00009A0000A900000B0A0A000B000B0A0A0000A00900F909FFFDFBDEF9CBCBDF9BFDB9EB900A9000090000D090CBC9CB9DBCBDBD0F0F9EFDEF9F0F0AC9CA09000000900A000009C09C0A9E00B00A9A090A0A0A09A0009000900000009000A0BC0A000000A00A0A0B0009000A000B00000900A000A09A00E0BDFBCBF9FAF9BFAFFDBFEF9CFBC9009000000B000B09A99CACADADAF9FDAD9A9F0F0F0D90A9000000000009009C90A90A909E9CACB00A0A00009A0A00A9A0A0A0A9A0A0A0A00009A900A000B000009000A00A0900A000A0B0A0A90A900A09A909AFFFDBFFDBE9FDBCBE9F9EB909A9C0009000090000000E9999ADAD0F0ADAFDE9F0F0F0AC9009000000000009A00B00090BCBCA900A00090A9A00900B000090000000900009A0AE000000A0000A9A0A0A90A00A00000A900000000000A09A0090FDFFBEBDAFDFCBFFF9FBFBD0F090A009000090090909090ACAC909A9ADBC90B9E9F00909000000009090909009B0D0F0F0F09000A909A0A00000A0A000A0A0A0B0A00A00A009090A0A09000A000000000009000B0A900A0A0B0A0A000000B0E00BBDFFDBDBFBFFDBFFFCBDAB0BC09000000000000000009090BCBC9C9009E9C090090E00000000000000ACA9E0C0A90B0F0BC0A900A0000000B00900A0900090009A00A9000A0E90000A00009A0A9A9A0A0A0A0000A000900000900B00A0090B0CBFBDFEBDEDBEBF0FBFFFDF90B00B009000900000000000090000A00F009A9E0F0E90900000000000B090909B090F0F90000000A00A9A09A00A0A090A00B0A0A00009000A000BCA90000A9A000000000900090A0000B0A0B0A0A0A00A90A000090FFFBDFBFBDFFDFFFF9FBE9E909000000000000000000000090909000900090009000000000000900C0BCB009E90900F0F000A9000000A0000900A000A000900A0A0A0A09A0CB00A0A000000B0A0A0A0A0A0A090A0000000090000000000A9A0F9FBFFBCBCF9FFF9F0FFF9F99E00909A0000900000000000000000090009000900000000000090A099B090C9E90BCAF0900A0000A00A0000A0A0A090B00B0A0A90000000000B0000090000A000090900009000A09A0A0B00A0A0B0A000A9009000FFDFFFFFBE9BFFFFBCBFBCB09000090000000000000000000000000000000000000000000009C9A0000A9A9AD0BD9AC00900A09000000090009A0A0A0000900A9A009A0A0CBA0A00A0A09A0B0A0A0A0A0A900A009000A900000090A900A0A0909AFBDFBDFFEDAFFFFFFDFBCBCB00000000000000000000000000000000000000000000000000009E9C9C9C09AD0AC0B000A0000A09A0B0A0A0A09009A0B0A000009A00090BC090000900000000009090000E900A0A0000A09A000A00A00009A0E9FFFBFFBDBDBDBFFDBEBDB909C90090000000000000000000000000000000000000000090A9A9090BA9AB9E9EBDA9C0A0090A00000000009000A0A0000000B0A0A00A0A0C90A00A00A0A00A0B0A0A0A90A9A0B0009A0A00A00A00000090A00090FBDFDBFFFFCBCBFFFDFFBCBCA000009009000000000000000000000000000000000009A09C90F0BC9DADCB0900C0B0000A09000A0000A00A0B00900B0A9A00000009000BA00A90A0000090009C0000A00000CA9A0000900090A0A9A0A000B0A90FAFFFCBFFBFFDBFFBF0F9B090900000000000000000000000000000000000000000000F0B0F0F9BEBDBB0F0F0B0000B0000A000A0A09000000A0A0000000B0A9A0A0A0CB0000090A09A0A00A0B0B00A9A0B0000A9A0A0A0A090000000B0009A09FBFBFDADFFBEFDFFFFBC9F000A900000000000000000000000000000000000000090090DA9BCF9F0FC9E9F0C09EB0000A00A900000A0A90A00000A9A0A00000000000BC0B0A0A00000009A0000009000000A0F0000009000A0A0A9A000A000BC0FDFFBFBFDFFBFFF9FFBF09F090090900000000000000000000000000000000009E90F0BDFEB9E9F0BE9BCAB9E9CA0A900000A09000000009A00B000900B0A0A9A090CB00000009A0A90AC9A0A0A0A00A9A9000A0B0A0A0B00900000A090A900B9AFFFDEDBFFFFFFFF0FCBF000000000000000000000000000000000000000000000F0F0FA99EDBE9F9FC0BDCF0A9000A9A0000A0A000A0A009A00A0A0A00090000A0B0A00A90A0000A09A09009000A9000A9A090090000000A0A0A900A00A0B0E9AFFFFBE9FFFBFFFFDBC9AD09000000000000000000000000000000000000900BDA9DFBDEFFADF9EF0BD0FA0F0A9A00000A000009A00000A0000090090A0A00A000E90B00A00A0900A00A0A0A00900A00000A0A0A0A9A0B0009000A000000090990BFFDFBC9EFDFFFBEBDB0F0A9000909000000000000000000000000000000000FABCFB9F9FAFF9EDAFF0F000000A00A009A000000A09000A0A00A0A0900A009A09E000000900A0090B009000A0A009A0A9009009000000A00A0A90A9A09A0A0E0DBFFFCBF9FBFFFFDFADB09C0090000000000000000000000000000000090DBC9DFBDEFEFFDF0FFBFDA00A9A00090090A000A0A00900A000090A0000A0090A000E90A0B0A0A000A0A000A0A00009A00900A0A0A0A0A0A090A090000000000090B0BDBFFFCBCFFFFFFBFDADE9A900000000000000000000000009009000900B0BFEBCBFF9F9EBFF9EDE0CB0009A00A0A000000000A00A00B00A0900A0000A090A09A000000000A90000B00000B0A00000A0090090000900A090A0A0A000A090A90F0FE9FBFDFADBFFEDEBF9BC9CA90900000000000000000000000009000BC0FCBDFFF0FFEFFDADEFAFB0000A00A000000A0A9A000000000A000A009A0B00A0000E9A9A0A00A00A0B0000A0900000A9009A0A0A0A0B0A000A00000900B000A00A09A9BFEDEF9FFCBDFBDFCF0B09000000000000000000000000009A00A000B0BDEBCBFF9FF9EFFF090C0F0B000000A00A9000000B0A09A0009A00B00000000A0A0BC00009000900000BCA90A000B000A00000900900000B000A9A0A00000A00000A09CA9FBFFE9FFFFFFBF9FCBCBC90000000000000900000900900909090DADABDBFDFEF9FFDA09E0BA0000A9A00090000A00000000000A0000000A000A090000CB00A0A0B0A00A0A0000000A000B000A09A0A0A0A09A000B000000A0A9009A0B09A09FFDFFFFE9EFFEDEFA9F009A000900000000000090000DA0D000000AD0BDEF9EBF9EF9A0DA09C90A0A0009A00A0A000A00A00A0A0900A0A0000B000A09A0B0A09000000A90909A0A0A09A0000A90A00009009A000A000A0A00900A0A0000000B000BFFFFFF9F9FF9FDF0DB0DA9000009090900000009A09A0A9E9E9D0FCBDAFDF0F9E0FA000A0A009000A00A00000A90A0000090A0A0090A9A000B000000F09A0A9A0000A0A0009000000B0A000000A9A0A0000A90B090090A000000A00A0A000B0009F9FFEFFFFFFBEFADE99CB0B09C0000A9090F009F090D0009AEB9F0BDAFBFCBF90F09E9A90A0A9000000A09000000A9A000000A000000A0000A0A009E0000000B000009A0A0B0A000009A0A9A000000A9A00A00A0A0A00A90090000000A90000BCFFFFFFFFFFDF9FB9ACB0D0DA0B09090E0909A90F0F0BDAC99CFADFEDBCBF0CAC00A0000A0000A0B00900A000A090000A000000A0A0090A0009000E90A90A0A00A0B0AC0000090A0A0A0000000A9A00009A09A009000000A0A09A09A0000A900FBFFDFFFBEFFFFEDEDFBDA9A090D0ADA99F0BDEF0F0BCABDBEFADFA9BCBCBCB090090B0A900A00000A0A000A000A00A000B00B000900A000A00A0A9A90A00900090000B0B0A0A0090900B0A0B00009A0A00CA0B0A009A0000000000090A90000009FBEFFDFFFFFFFFBDBEDBD9E9AF99CBE9FCBB9F9FDBDDAFDBCBCFDE9E9E9E000A0A0000B000B0A000000009A000009A00A000000A000A09A0000E0A00B0A0A0A0A9000009000A0A0A000900A0A00090A90000000A00A9A00A00A00A0000A90A000FBDFFFFAFFFFFFEDBEBFADF9FEB9DB0BDFCF0F0BFAFDAFDBDBE0BCBDAC9E00900B0A000A00009A00A0B000000A00000000A0A00A0090000A00DBC9A0009000900A9A0A0A9A000090A0A000900A0A090A9ADA9A0000000900000A00A0A900900009EBFFFFFFDBFFFFFDFCFBEFE9FEBCFFAFBFFFFFCF9AFDAFEDBFCBCA09A00B0A00090A900A000009000000A0A90A00A0A009000900A0A00900A00AC0B0A0A0A0ADA09000009A9A0A9000B0A0A90000A00000000B000A0A09A0000090000A00000009FFFFFFEFFFFFBFFFBFDBDBDBDBF9FFDFF9E9FBEFDAFF90FCB0F0DAC0000090A0A000B00A0A0A00A0A000000009009000A00A0A00000A0ADB00B000009009000CA0A9A0A0090009A0000900A0B00B0A0B0A000A09000000A90A000A0090A0000009FDFFFFFFCFFCBDFFFFFEFEFFFFFFBEFFFFEDBDADBCFF0BC0000000B0A0A00000A0009000000000009000A0A0A000A00B0000009A0000ACB00A0A0A0A0A0B0B090AC90A0A90A000A00A00900A0009000D0A000A00A00900000A9000A0000000000AF9FFFFFFFFFFFFFFF9F9FFFFFFFDBF9FFFEFFEFF0E0CBC0000B0009000A9009A00A0A90A0B009A0A00000000A000000A009A000A00F90A090900000900000A009A09000A00B009A09A0A009A00A0A0A90A000900A00A0000000A00B00A00000900F9FFFFFFFFE9F0FFFFFFFADFBFFEFFFFDFFF0BF9F000A0A900A0A0A900A0000A000000000A00000B0090A000B0A0009A000A0900A0E900A0A9A90A0A0B0090A000A0A90A000A00A0009A000A090900A900A0A000000A000A090000909090000F0BC9BFFFFFFFFFFFFFFFDFFFFFFFFFDEBFC09E0E0CB009000A9000000A00A09000A0A00A00000A0000A0090A00900A000A090A0AF90CA000000A000900A0A009A9090A900A0000090A000A0900A0A000A900090A00090A00A000A0A0A009A0000CBFCBCBF9FFFFFFFFFFFFFFCFFDFEA9F0F009FDB00F0A0A900A9A0A00090A0A0090000000A09000A0000A000A0A900A900A0000CAB00B09A0000B00A0900B000E0A00A009A9A0A0000A90A0A000CB0000A00A000B00009000A090000A0000B0090AD0FCFFFFFDEDFFFFFBDBFFFE9FDE0FCA00BEDF000000A00000900B0A0000A0A00B00A900A000000A000A9000A000A0000A90BD0A000A09A9A00B09A0A00B09ADA909A0000900A900000009A9A0A9A0000000A00A00A000000A09000A9000B0AD0B0B0BCA0FBFFFEF0FEFCBC9E00BCB09CBCBFADA9A9000B0A0A0A0000B0090000000000000A09A090A000A9A00B000B0A00AC0A090A00A0000B00A0C90B0FADA9E0A000A00A000A0A0B0A0000000009A00A000000000A90A000A0B000A0A0090AC900CBDFBCB00909E90BCBC00BC9E0EB0BDADA0000A0A009000000B000A0A0A00A00A0A000000000090AD009A000A0009A0BB00A09A900E9ACBE9A9AF0F9FFFF09C0B09A009A00900009A0A9ADA0A00009000B0A9A000000B00000A009000A090ACB0000000000000000000F000A9090ACBDA9A0A00900A0A9A9A00A9E90000000000000B00A000A00A9A0BE0BE9000A000CF090A00A090A9BDBCB0DBFFFFFFFFA9A0AC09A000A0A0A00090E00090A00A00A000000B0A0A000B00090A00B00A0A90000000000000000000A00BCB0A0A09A0AC0009A0A090000000B00A9EB0B0A90A9009000000A009A00F00BDCBE9E90A909A0A090E90A09ADBFF0FFFFFFFFFFFCF09CB0A00A9000900A0A009A0A090A00A00A0A000009000A00A0A000A0090090A9A9A0000000A0900B09CB00009009A090B0B000000A09A0A0000B0F9F00000A00A0A00A000000A0DA0BFCBFF0F0A000AE9E900A90A09ADFFFCBDBFFFFFFFFFFA9EBA0DA900A9A0A900090A09C00A0900900900A000A0A0000000000000A00A0000000A0B090000A0000A0A0B0A0A0000A0000A00A000A0090A9ADFBF0E0A0000000000000A90A09ABDFCBFFDFFADA9A0B000A90A09CA9ABDFBF0FBFFFFFFFFBDF9FDFA00A000000A0B0A000A0B000A0A0A00A900B0000B009A00A9A0A00A00A9A00A090000A0B009ADA909000009A0B00B0A000900B0000A0009A9FCB0900A00A0000A90000090AC9EBFFFFFFDF0E000DBA90A90A0B00DAFBCBBEDFBFBFFFDFBFFFFFDAD0A90A90000009A9000A9000000A000A00A00000A00090000900009000A90A0A0A0000A0A000A0A0A0A00000A00000B0A0000A9000A0A9E9BCA000000000A0000A00A009AB9E9FDFFFFFF9F00BC00A9E9CB00B09F0F0C9BFDE9FBEBFDFFFF9E9A000A00A9A0B0A00A0B0E0B0A9009A000000B000000A00000A009A0A09000000909A0F0909A900090090A00009A0B00000A0000A09000DADA090A09A00A90000A00000A000E9FFFFFFFF0E0A0CA9E90B0B00B0BF0F0DBBE9A9B0F9F9FBFFFEDA00B090B00000000B09000000000A0000A9A000A00A000A0A000A00000A0A0B00A0A0900A0A00A00A00A000A9A0000000B009A0A00A0A9A0B0F0A000090000A000000A0900F9FFFFFFFBCE9090B9A9AF0F09AC9E9FFBEF0DADADF9EB0BDFFDBADA00A0ACA0A0B0B000A0A0B0A0A0000B00000000900900009000000A900000000000A0A00000009000000B0000A0A00A000A00009000009FFF9F000A00A00000A09A000A0B0ABFDFFFEDB0A0A0CF090A90E09A9BFFFF9FFBDBFBFBDADA0BBEDB009A909090900C0BCBC0900009009A000A00A0A0A000A0B000A90A00A0A9000A0B09090B0B00A0A0A0B0000A00090A90A0000A00A0A9A0A9FFE9E9000000A0000000090000BC9BFFFFDAC90000BA9AF9EB90A0FFFFFFFF0FADFDFFCB0BDFDBF0E9A00A0A0A0ADABCB0A9A0B0A0A0A00A09009000000A00000A00A0900000A0B0000A0A00000A90000000A0A90A000000090A0090000009BFFFFF0A00A00000A90A00A0A0A90BEDFEFDA0B0A9A09DAF90B0CA9FBFFFFFDA9F9FBFFDBE9FBFFFFCB000A9E9C9ADABDFBE9E0000900000900A0A00A00A00000A0000000A00A000000A000000A000000A90A09000090A00A00A09000A00A00BEDF9F00000900A90000000000090EBDBF9FA0F000000EB09EBCB09A9FFFFFFFF0A9FFFFFF9FFFFFFFBC0B090BABE9BDFFFDF090B0A0A0B0A0A0000009009009A00B00A9A0000900B0A90A900B00B0A0A00A00A0A0A0A00A09A00A00A00B00B009BBE00A9A000000A00A09A009A0A90EBCF0DA0A0A0009EB90B9E0A9ADFFFFF0DBCA9FFFFFFFFFFFFDFBC00AC9DBDFFFFFFFEFA0009000000090A90A00A00A0000000000009A00A00000000A0000009009000900909000900009000900000000A0C09A900000A00000000000A0090A900B0A0909090A0F90E9E09A9CBBFFFFBFA09BFFFFFFFFFFFFFFF0B0B0BBFFFFFFFFFFF9CB0A0A9A0B0A0A00A00A00A00A00A00A00A0A00A00A00A00A00A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B09A9A00A00A000A00A00A00A00A0A9A0B0A9A0A0A0A00B0A9A09A00B9FFFFFF000B0FFFFFFFFFFFFFFF9E00BDFFFFFFFFFFFF0A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000105000000000000B4AD05FE','Education includes a BA in psychology from Colorado State University in 1970. She also completed "The Art of the Cold Call." Nancy is a member of Toastmasters International.',2,'http://accweb/emmployees/davolio.bmp') +; +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(2,'Fuller','Andrew','Vice President, Sales','Dr.','1952-02-19','1992-08-14','908 W. Capital Way','Tacoma','WA','98401','USA','(206) 555-9482','3457',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00F00000000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000C00BFE000000A9000FFFFFFFFFFCFFFFFFFC009FFC00000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB09F00000000FCBFFE9E0BFFFFFFFFFF0FFFFFFC09FFFE0000000000000000000900000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000009009F09FFC0BFFFFFFFFFF0FFFFFFFFEFFFC00000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0B00000FF0000000BFFFFFFFFFFFDFFFFFF0F9FE0000000000000000000000000000000900000000F00000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE09FFFC0A9F0000FC00BFFFFFFFFFFFEBFFFFCFFEFC00000000000000000000900000090000000000000F0000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009CBE09C00000000BFFFFFFFFFFFFFDFFFCBFC90000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0009FF0BFA9F0A9BFFFFFFFFFFFFFEFFFFFFC000000000000000009000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009FCBC0DFFFFDFFFFFFFFFFFFFFFF9F0FC000000000000000000C0000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00AF0000000000BFFFFFFFFFFFFFFFEFE0000000000000000000D000000000000000000000000000000F00000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FC00BF0090BFFFFFFFFFFFFFFFFDFC00000000000000000C00000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD09EBFC9ADAFFFFFFFFFFFFFFFFFFFE000000000000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000009FFFFFFFFFFFFFFFFFFFC00000000000000009C0000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BFDBFFFFFFFFFFFFFFFFFFFFFFF00000000000000090000000000000000000000000000000000000F00000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FDB9FFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDBFFFBFFF99FFFFFFFFFFFFFFFFFFFFFC00000009000000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBBFFF9FDFBDFFF9BFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000F00000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FBFFDFBDFFBFFFBFFFF9FFFFFFFFFFFFFFFFFF0000000000000000000000000090A0009CB0DA9A9AF9E9BE900A00F0000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFFFFBFFBFBFDFBFFFFF9BFFFFFFFFFFFFFFFFE00000000000000009CA90A90F00C90BDA9ADA9FF9F9E9BD9B0C9C0F0000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFFBDFFF9FD0F9F9DFBFFFFF9FFFFFFFFFFFFFFFC0000000000000DADA99E09CB0F9BCBDAD9F9BDB0BCB9ADAFCB9A9FF000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFFBF9FFBDA9F0AD0B0A09DB9BFFFBFFFFFFFFFFFFFFE0900000009CB0B9BDA99F9BDB0F9B0B9AB0F9ADF9BDADB99BCBDA9F00000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFDBFBFDBFCF0F0FDFCBDAD0D9F0BEFDFBFFFFFFFFFFFFFFFFC000000000009CBCF0BCB0F0BDB9E9F9E9DB9E9B0F0BDB0FE9B9ADBF0000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFDBFFFF9FF0F9FFBCB0BD0F9A9E00D090BDFBFFFFFFFFFFFFFFC0000000C0B9FB9B9BDB9F9BDA9E9B9E99A9E9ADF99F9ADB99F0F9EF0000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFBDBDBDADEADBDA9C9F9F0FBDADA9DB0F0F9E9DBFFF9FFFFFFFFFE000000B09DA9CBCF09E9A9E9F9BD0F9ADBDB9F9A9E9ADADBE9F0F9F000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFBE9FBFBE9FDBDBCBCBFBC9E9F9E0DBDA0DB09E09E9CB9FFFFFFFFFFFC00009000A9FB99B9F09F9F9B0F0B99E9ADADA9E9F9F9B9AD9A9B0FF00000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFDF9FDFBCDFDADA9E90B9C9CBFBCBFDBF0F9FBC9E99E9AD0FFFF9FFFFFFFE0000C0DBDB0DAD0F0BC9BCBCF9BCBC9BDB9BDB9F0B0F0F9BE9E9F9F00000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFDBBBFFB9CFB0BCB0F09FDE9FA90DB9CBD0F9E9CBF99E90F9A90BFF9FFFFFFC00000B9A9ADB9BF0BDBBCB9B9BCBDBBDA9EDA9E9B9F9F0BC9B9F9AF0000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFF9F9BDFCB0DCB0DBC9DBDBF0A9E99FF0FCB0FB9E9FBC9EB0F09EDBCF9BF9BFFFF000909CBDBDB0F09BCB0DBDADADB9A9CBDB9B9F9E9E9A9BDBFCB0F9F9F0F0D000000000000000000000000000000000000000000000000000FFFFFFFFFFFFD9BF9FFB9FCB0BCB0DBE9E90DBDB9E09CB09AD0DBDA9DBD9C99E99E9B0F0FFFFFFFC0F0A9BCBCBCB9F0B9DB0B0F9B9E9DB9B0F0DA9F9F9F9E9A9B9DB0FF9F99BBF990C000000000000000000000000000000000000000000000FFFFFFFFFFFB0BFF0FBCDADBC9E9BCB0D09AF09E0D9F9A9F0DA9E09D0A00F0BCBDA9F0F0F0FB9FFF00009CBDB9F9BCBDF0B0F9F90FCBCB0F0F9BF9F0BCB0F9F9F9EB0F9FB0BDAFDBCF9AD09A0CBCB0000000000000000000000000000000000BFFFFFFFFF0BD9FF9F9C9ADA09F09C9CB0BFD09E99FA9AD9E9F9F99F0F9F99BD9B0FD0FF9F9E9FFFF009ADA9B0F0BCB9B0B0F9E9AF9B9B9F0B90F90B9F9BDB0BCBCB9DB0F9F0BD9A9B0F90F0DB909FF000000000000000000000000000000009FFFFFFFBC9F9EF9F0F0BC9A9DA99E9A9CBD0BFD9E90DFDA9F9BCBCBCBDBCBEDBEDF9BF99F0F9E9BFFC00009C9F9BDB9E9F9D0B9F90F9E9E9F0DB0FBCF0BCBC9F9BFC9A9FBCBDABDBC9B9EB9BADBFA9AF0000000000000000000000000000000FFFFFFE90BDADBF9E90D0BC9E90E90F0F90BD0BA9FFB9A9F9E9F9F9F9F0DBDBCB9FBE9EF0BF9E9E9FF009090B0BCB0D9BCBA9BCB0F9BCB99A9F0BD09B9F9B9BA9E99BE9A9FF909DADB0DB9DAD9BC9DBD9C00000000000000000000000000000FFFFFD09BDFB9F0BC9E9A9C9A90F9CB090BDA9F9DF09FD9FDADBCBDBDE9BFBDFBDCBD9DB9FDFFBFD9FE000E000D0B9FBADBDDADB9F0BCBDAD9F0BCBFBCB9E9E9DB9FAD9BDBF9A9FAB90DA9F0B9ADB9BE9ABC000000000000000000000000000BFFFFCB9BCFB0FD0D0A909CB09CB9CB0FDBCBDF9EBDBF0BE9BDBDBF9E9BFFD0FBDFBF0FB0DBF0FFDBE90009090B0B0DB0D9A9A99EDAD9BDA9BAB9F9B9CB9E9F9F0BCBDBADA9F9DA9D9E9B9E9BC9FA9E99F9CBC00000000000000000000000009FFFE99DADB0DF0B0BD00F0B0FA9C0B9DB0DBDA9F90F9FFFDBDBFFDFF9FDBDBF9FBFDBFF9FBCBF9FAF9FBC000AC00C9ADB0BDBDADB9B0F0BDAD9CF0BCFBDF9B0B0F9BDAD9BDAFABDABD9ADB9E9BC9F99E9AF99B0000000000000000000000000FFF99EBDBDFB09E9C00F09FC90DBDB0F0DBADBD0BFF9F99FBFFDB9B9FFBDFBDBF9F9FDBDFDBDDFFDFFAFDBF090090009A9F0BCB9ADADB9F0BDAB9BDB9F0B0FDBDB0BCB9AD0BDF9DA9DABD0BDBD0B0F9E9BD9AD0F00000000000000000000000BFF09E99ADB0DB0009A99F009BDBCB0F9A9CDBCBFDBDF0FF9BDBFDFFFF9FFBDFFDFFFBFFFBFFBA9FBF9F9FCBC009A090E9C9BDB9CB9F9CB9F909DADADA9F9F9ADADBDBF0F0BCBBDA9FA9D0BCB9AB9F9A9BCBE9BF9B0000000000000000000009FE09F9DAD9ADA0D0F0D9E09FF0F0B9F9E9DBA9DBDB9EBFDBFDFFDBF9F9FFF9FBFBF9FFDBDFF9FDFBDFFDAFBFB0000000909ADA9CBBCB0BBCBCBEB9BDB9F9E9ADB9BC9A9F9BDB9DBDA9DBAF9BCBD0DA9F0DB99E90D0F00000000000000000000FF99BCB0F0E90DA090B0A9DB09F9FDE9E9DA9DEBDADFFDBFDBFBFBFFFFFF9FFFFFDFBDFBFF9FFFF9FFBDBFDBCFF009CB00AC99FB9C9BDBC9F9B990FCB0F0F9BDB0F09BDF0BC9ADFCB9E9D90F9BDA9BDA9F0DA99EB9BCB000000000000000000BF00DB0DB9B0F0090BC9D0BCBDA9A9B9E9A9FBF9F9FB9FBDBFDFDFDFF9FFFFFFFDFFFFFDFBFFBDBFBFDBEFBFFBD9F00000900AC9FABC9ADB0BC9E9B9BDB9F0F0F9F0FA9A9F9BF9AFB9E9BEBD0BDADBCB9F0B9F0F99E9BDF00000000000000000FC0BD0F90D0D00F0D09A9F9BDADBDF0F9F9F0D0F9FBDFFDF9FFBFBFBFFFF9FF9FFBFDFFBFDFFDFFFFFFF9FDBDFBEBF0090C0909B0D9B9F90F9BF0BCBCB0F9BDB9E9BD0F9F0F09E9F9E99E990BDADB0B9E99BDADB9E99F0B0000000000000000BF0BDA99ADA0B0909A9F0F09E9FBCB9F9CBC9FBF9FBDFBDABDBFDFFDFDF9FFBFFFFFFBF9FFFFBFBFDFFDBFFBFEBFFDF0000B00A9ADBA9E9E9B0F09DBDB9F9ADA9E9BDA9BDADB9E9FDB90F9BCBCBDB0DADBCBCB990F9EA9F9F000000000000000FC0DADBC9009C9E0F9CB9F9F9F09FDADBF9FBDBDFF9EBDBFDBDBFF9FBFFFFFDF9F9FDFFFFFBFDFFFBFFBFFFDBDF9FAFF0000909C9A9DBDB9E9F9F9A9BCF0FDB9F9F0BDBCB9F0F9B0BEDB0F0B090BDB9DB0BDBDAF9A99DA9EBC9000000000000BFC09D09AD0DA0099A0BCB0F0F9F9BDF9CBF9E9F09FF9FF9FBDBDBFF9FDF9F9FFFBFFBDFBDFFFFBDFFFFFFDBFFBDFBDBDF0900C0009E9A9E99A9E9F9E9B9B0BCF0F9F9A9BDA9B0F9FF9B0F9BD0BDB0F0BDBD09AD9E9F0B9F999AC00000000000FE09A9BC90B0090F0D9DBDBDBDBFCFBB9B9C9BDBFF9FDBDBDBDBDF9BDBFBFFFF9FDBDFFBFFBDF9FFBDBFBDFFFDFFBDFFBFE00B09A9C90DB9F0DBDB0B9F0F0F9B9BDA9E9F0BDBCB9E9FB0F9BC0BCB0F9BCBDA9BF9A9B0F9E9ADADB0000000000FF0DA9F09000C9E9ADB9EB0FBDAF9BBFCFFCBBDADBDBCB9F9FDBDA9FDBF9FFDB9FFBDBFBFDBFFBFFBFFFDFFBFBFBBDBFF9FF0000000B0FBADADB0B0F9E9F9F9BCBCB9F9F0BDBCB9E9BDF99ADBD09BDBCBBDBDAD0BD0F909BDB090BD000000000FFF09C9E09E9B09F09AF99F0F9F9FDDBDB9BDFDBDFBDBDFBDADF9BDB9F9F9FBDFBDFFDBFDBDFBDBDFDBFFBFFDFFDFFF0FFBDF0000D00909DB9A9F9F0F9F9A9ADBDB0F0F09E9BFCB9BCBCF9DA9A9CBDB9D0B0BDBDABD0FBC9ADBDBCB9000000009FFC9B0900000F09F9DBE9F9FF9FABDBBCFF9BE9BC9FFBDBD9B0FDADBDBDF9FF9FBDBFDFBFBDFFFBFBFBFFFBFBFBF9FF9FFBFF090A09E9A9E9D0BCB90B0F9F9F0F9F9B9FB9E9BDBCBBFB9A9DBDA90BCB0BDBDA9BD0B9909BDB0B09F0E00000000BCA09F0C90D090F0FBC9F9F0BFDDFBFC99BEDBFDBF9D9EBFBDB9F9BDBDB9FF9FDFBDBFBDFFFBDBDFDFDF9FFFFDF9FB9FF0FDF000900009F9F0BDB9E9F9BCBCBB9E9ADA90F9F9ADBD0F9E9FADA9CBDBDBCBD0B9E9BDBE9AF9E9C9FB09000000000099F00B0B0BE9BDBC9F0BF9F0BBBDF9BFFDBDB9F9FBBF9C9F9F99FD0BDFB9FFBFFFFFDF9FBDFBFFBFBFFFF9FBFFF9FF9FBFBC0000D09E9B0BDA9E9DA9E9B9BCF99F9F9F9ADADBE9FF9B099BD0B9E9A99A9F0DBC9A99F90F9B0A9CBC0000000000CB0B000DBC9CBC9BFBFC9F9FFDDF9FF9BBFBDFBF9FD9FBF9F9FFBBDB999F9F9F9F9BFBFDBBFDBDFFFFFFFFFFBFFFFBFFFFFF009A0A09CBD0B9F9A9BDB0DADB9AF0BCB0F9BF9BDA9FEDBCBCBD09BDBCBDA9F0B9E9E90F9AD9D9B99BC900000009AD9C0DA09BF99BFDBD9FBFF9BFBBF9FFDFDBF9F9FBFBDBDB9F9FD9F9FF9F9F9DBDFD9F9FDFBFFFBDBFF9FBFDFDBFFDBBFDBFF009009A9EBD0F0F9ADADB9F9E9DBDB9E9ADB0F0BDADB90B9F9A9E9BC9A9F90BDA99BDB0BDB0BADAF09AC000000099A0909DAD0F0F9BCBFBDADFF9FDBFBDBFBDBFFF9FDFBDBFF9F9BF9F09F0F9EBDB9FF9FFBFFFBFFFFDBFFFFBFBF9FBFDFBFFF000C900999A9BDB0DBDB0F0B9FA9ADB9F9BDB9F9E9FBCB9E9A9CB9E9B9DB0BDA9FBCB09CB0F0D9F99E900000009CBC0B0F0B9F9FDADF9FDBDBF9FDBFBDBDFDFFF99BDBBDBDF9FBFFD9F9F9F9F99F9FF9BFBDBDFFBFBFFFFBDBDFF9FFFDFBDFFF000B00B0FAD0F0BCBA9ADBDBCBDBDB0F0F0F0F0F9BF99E99BDA99F9E9EB0F09F909F9E9BDB99AB9CB9F90900000B909C99BC9A9FBDBBDBF9BF9FFBFDFFFBFB9F9FFFBDFBFFBF9F9FBFDBDBDB0FF9F9FBFDFFFFBDFFDFFBDFFFF9FBDBFBFFFF9FF00000C909BB9F9BD9FDA9ADB9BDA9F9B9BDB9F0BCBE99E9E99E0B9BD9F9BDA9FB0B99E9ADAD9CBBCB0F0A90009CBCA9AC0F9FD0F0DFBFDF9FF9BDFF9F9FFDBFF9F9FBFDBDBFFFF9FBBDBDBD99BDBC9DBF9FBFFFFBFBDFFBDBFBFFFFDFFFFBFFFB09C90AD0D0F0F0B0B9F9F9E9EBDB0F0F9BCB9F9BFDBC9B9BC9BDADA9A9E99F0DBDE99BDB9B0B9CB9F9F9CB909B9090D9B9F0BBDBF9F9FBFBDFFBFBFBFBDFF9BFFF9FDBFBFDBF9FFDFBDADBC9CB9BFBDBFDFFFFBFFFBFBFFBDFDFBFFBF9FFFFBC00A0090B0B9F9E9F9E9A9E9FDB0FDBD0BCBDA9E9FB09BE9E9BDADB9F9F99EB9BF0B9ADADA0DBCB9E9A90B0C0BDA09E9ADADBDFDBDBFFBD9FFFBDBDBDFDBF9FFDB9FDBF9FDBFDBF9F9DBDBDBFB9FDBDBDFBFFBFDF9FDFDFBDFBFBFDBDFFFFF9FF009090BC9BCB09B9E9BDBDB9A9F9A9ABDBDA9F9FF9DAD9F9DA9DBC9ADBCB9CBC9BDADBDBD9A9BD0BDBDBDB90DAD009F9F9F0B9FA9DBDFBFDBDFFFFFFFBFDBDBFDBFBDFFBFFDBDFBFFFBDBDBD9FDBDBDBFDBDFFFBFFBFBDFBFFFFFFFFBFFBFFFF0000E00B0F9F9F0F9F0BCB0F9F0F9F9DBCB9F0B0FFA9A9BA9DA9BBD9A9BCB9FBDA99A9A9AD9CB9F0BCB0BCB0990DA9CB0F9FDADFBFDBDFBFFBDBFFBFDFBFBF9BFF9FB9FDBDBFBDBDBD99F9DBDBDBD9FD9BFBFFFF9FDBFFBDBDBDBFBFDFBDFBFFF0090909C9A9E9B0F9F9BDB0F9F0F0F0BBCB9FDBF09F9FC9DA9F0DA9DBCB9E90BDBC9DBD9A9B9E99F99F9900BE9A9CBDB9E9BFBFDBFFFBDF9FBFF9FFBFFFDFFBD9FBDF9FBFF9FBDB9FFFFFFFF9F9FB9BFDFFFFFBFFBFDBDFFFFFFFFFFBFFFFFBF0000AC9A9F9B9CB9E9E9ADB9EB9FB9BDFBDA9ADF9F09A9BA9FBDB9EB0B9CB9BCBCB9BE9A9CBC9BF0BF0F0F9C90C9B9CBD9FD9D9BFDB9FFBFFDFFFFFFFBDBB9DBFBDFBBFDB9F0DF9FDBFFDBDFDBF9DFFDBFFF9FFF9BDBFFFBF9FF9FFBFFFFFFFF00090909CBCBCB9F9F9BDB0F99F09E9E90BDBDBFB0DBDBC9CBDADA9DBC9BDE9F9BDAD9BDA99BF09F09B0909BCB9ACB9FAF9BFBFDBFFF9FDBFBFBFBFBDFFFDFBDF9F9FD9F0D9B9FD9BDB9F9BF9FDFBDBFFFFFE99FFFDBFBFDFFFFFFDFFFBF9FFF900C0A0B9BDA9CB9E9ADADBDBE9BF9F9BFCBCB0BCBA9ADB9B0F9BDA9F9E9B9A9E9BDAF09DAD90F09F0DBD09F00D9BCB9DBCF9FBF9F9DFBBDFFFDFFDFBFBFFBDBBF9FBF09B9D9F9BD9FDBDFDBDBF9FFDFFFFF9009F9BD9FBBFBFBFBFFFFFFFBDFE09A90C0F0BDB9E9BDB9F0B0F9F0F0BCB9BDBDBDF9DBDBCADB9FE99F0B99E9DB9F0B99FB09B0F9BDA9B0B0FB09A0DBDBBDB9E9FF9FFB9FDFBF9FBDBFFFDFBDBDFDBD9DBD9CB99BDBF9BDB9FDB9DBD9BD990000909ADBF9DFDFDFFFFBF9FFFFFBF00000909BDA9E9BCBCF0F9F9ADB9F9BDE9A9ADFA9ADADB9B9F099E9BD0F9FB0F0BDBE909E9F9BCB9F09CB9C9E9DBF0FDA9FDBF9FBFDFDBFFFFFFFFF9FFBDF9F900000909B9CBD9D99C90909090900909009DBDCBD9F9FFBFFBFDFFFFFFBFFFFF009CB0B9E9BD9ADBDB9B9F0BDB0F0BCB9BDBDAF9C9B9AD0DADBDA9ADA9AF0DB9F9AD9BDA90BCB9E90DB09F0099A9DBF9FF9BFDBF9BFBFFBDFFBDBFFFF9FBDB900B090900909009000909C9AD09099CB09F9BDBBDBFBFF9F9FFBFBF9FFFDFBFFF000000CB9E9ADBDBA9E9E9FDA9F9BDB9FCBCB9FBBC9F9B9BDB0BD09BD99BF0F0BDBBCB9DBDB9CB9E90090BF9AD9F0FDB9EDBDBDFFDBDBDFFBFFFF9FFBFDFBDA9D9BDB0D90D0909B9DBD9BD99F9F9F9DBD9F9FDBF9FDFBFBF9FFFFFFFFFBFFFBFC09A9090F9F9A9AD9F9F9B0BDA9E9ADA9B9BCBFC9BA9F0F0BDF9A9F0B0F09B9F909CB9E90B0FB9E90000FD00DABCB9BDF9BDBFBFBFDBFBFFFFFFBFFBDFBF9F9FBFDBDF9BDB9DBD9F99BD9F9F9BDBDBBDFBDFBFF9FFBFFDFFFF9F9FBFBFFFF9FFB00C0A0F0B0F9F9BE9A9E9FF9BDBDB9F9E9E99B9BC9CB90BDA9AD90B0DBDBFCBCBFB9E90F9DB9C9000099B09B9DB9F0F9BDBF9DBDFFBFDFBDBF9FDBDBFF9F9FBFDBF9BFDB9FBDBDBDBDFBD9DBD9F9DDBF9FBDF9FF9FF9FBDBFFFFFDFFFDBFFFFC09A9099BDF9E9BC9F9F9BCB0F0F0BCBCB9BCBFD09BBDAD0B9F90FBD9A9BC9BDB090F9F90ABC9B9F9F90E90BC9ADF9FCBFF0FFBFF9F9FBFFFFFFFBFFF9FFFFFDBFDFFDBFDF9DBDBDBDBDFFFBDFBDBFBDBFFFBFF9FFFFFFFFFF9FBFBFFBFFFFBFF00000CBCB0B9F9FA9A9ADB9F9B9BDBDB0FCB0BEBC9CB9B9CB0F909AD9E9BF0BCB9F0B0F9D9BD9FDF9F99E9CBF9A9E9BD0FBD9DBFBFF9FDBFDBDFDB9FF9FBFDBDBF9F9F9FFF9FFDBDFFFFFFFFBDFF9FFFFFFF9FFBFDBFDBFDBFDFDFBFFFF9FFBF009CB00BDBCB0F9FDBD9ADF0F0F0B0BDB9BDBF99B0B9E9CB9F9E9F9BA9F09F9B9E9BDB09A9DBFFBFFFF090A90F9F9F9BF9FBFF9FDDBFFBFBFFBFBFFF9FFFDBFF9FFFBDBF9FF9F9FFBFB9F9DBDFBDFFFBFFFFFF9FDBFFFFFBFFBFBFDFFBFFFBDFF000009B0F9F9FA9ADABDB9F9F9BDBDADADA9F0F0D9E90B9E9A99A9C9DA9FBCBCB9E90DAD9FF9DFFDBF90F9DF9E9EBDF9F9DBDFBFBBF9FDFBDF9FDF9FFBDBFDBFFB9FF9F9F9F9BF9FBDFBDBFF9FFFBFDFDBFF9FFBFF9FBFFF9F9FFFBFFFBFFFFF09A09F0F9B0FBD9F9BD9AF9E9ADAF0F9B9F0DB09AB9F9CB9F9E9DAB0BDB0DB99CB9F9B9BF9FFBDBFFDF09E9AD9B9CB9F0FBFBF9FDFFFFBDFBFFFBFFBDFFBDBDBFDF9FF9FBF9FF9FDF9FDBF9FBFBFDBFFBF9FFF9F9FFFDF9FFFFFBFFDFFFDFBFFC09C009BC9FBCBE9ADAF9E9B9F9BDB0F0F0BBDBC9DA9A9E90B9A9D9F0BDB0FA9BCB0F0D9FF9FFBDBFFF909F9AD9FBDE9F9FD9FF9BF9FFFBDBDBFDBDFBDBDBFFD9BDBDBF9DBF9FFBFFFBFDFFFDFDBDFBFDBFF9FFFFF9FBFF9FF9FFFFFFBFFBFFFF0090BC0BB0DBDBD9BD9F9F0F0F0BDB9F9F9FB09B0F9C99BDBC9F0B0BDA9F9DADB9F99FBDBF9BDF9FBF0DB0BDBC9F9BDBF9BFF9FF9FF9BDFFFF9FBFBFBFFFDBBFD9E9F9EBDBFF9FF09FFBFFDBFBFFBDBFDF9FBDBDBFFFDBFBDFBDBFBFFFFFF9FF00A009BD0FB9F9AF0BA9E9BDB9F9F0F0BCBF0DB0DB0B9BCB09B0F09DA9DB0BDB9E90FF9DBDFFF9DBFD0B0FDBCBBF9F9F9FFDB9F9FF9FFFFBDBFBDFFDFDF9FBDDBF99DBD9F9F9FF9FBDBDB9BFD9F9FFDBF9FBDFFFFDBDBFFDBFFFF9FFFBFFFFFFC090F0DA9BDEB0F9F9DF9BCB0F0F0B9FDB9DB9CBB0D9E9BDBC9F9FA9F9ADBCB0F9DB9DBDB9F9FFBDF0DBD9ADB9D0BDBFE9BBFDBF9FFBDBDFBDBDBDBFBFBF9FFBDBBFBDBF9E9FBDF9DBF9FDFDBFBF9FBDFF9FFB9FBFFBFDBFFBDFFFFFFFF9FBFFF0000B0FBCBBDF9B0FAB0F9F9BDBBCF0BCFADA9C9BA99ADB0B0B09DA9F9A9BDB0B09FBFFDBFF9FFBFB00BDB0DABDF0F99FD9FBDBF9FFBFBFDBFFFBD9FDFDBD9FBDFDF0DBDB9D9BFFF9EFBFBFDBDFFDBFBDF9FFFFDBDF9FDBDFBFBFFBFFFFFF9FFA0900909BD9A9E9F9DBDA9BCB0D9B9F9B9FBD0B9C9F0D9AD9C9F9A9F09DBCB0DBDBD99BFF9FFF9FDC9F09F0BD9A9F9FF9FBDFBFDBF9FDF9FFDBDFFFBBFBFFFBDBDB9FB0F9FBFD9F9F99DBDFBFFFBFDBDBFFBDBDBFFBFBFFFBFDFFFFFFFFFBDBFC000DADBCBF9F9F9EBDB9F0F9FBEDA9E9EF90B9E9B09BAD9A9B9E9F09FB0B9DA9BDBFFFDFFBFFFDB0B09F0BDBE9F9BF9FBDBBDDBFDFFFBFF9FFB99BDF9FF9F9F9FBDBDF9FDBDBFFF09CB0F9FFFBD9FFFFDBDFFBDF9FDFDFBDFFFFFFFFFBFFD9FF009A090BF0F0B0FB9E9CB9B9AD9B9F9F99E9C99AD9AD9B0DADA90BDB0D9F0B9FDFDBDBF9FFF9FBF09FE9F9E99F9FCBFBDBFDBBDBF9F9F9FFBDFFFFDBF9FF9F9F9F9DB99BFDBFD99F9B9DBF999FFBDBDBFFFB9FBFFFBFBDFFBFBFFBFFFFFFBFFF000090F9DB9F9F9ADBFB0F0F9BE9E9E9BF9A9EB9AD9AD0B09BDBD0BDBA9ADA9BBFFF9F9FF9FFFDBD009ADB9E9DA9F9FCBDBFDBF9FFBFFF9FFBDF9BF9DBFBFFBF9FE9DBFD9BDBF009FDB9DBFC0909BDBDBDFFFDF9F9FFFBFDFFFFFFFFFBFFFFBFD009E90ABDA9E9F9F09F9BDBC9BDB9F0FFE9099E99ADBBDBC909A9F09DBD99DFDBDBF9FFBFF909F0BDBDB0D9BE9FBDB9FBDBF9FFBDFDBDFF9FFBFF9FF9FDFBDFF99B09DBC0009DB9B9FFBDFB99F9DBF9FF9BDBBFFFBDFFFBFFFFFFFFFFFBDBDFE09A00F9DBBDB9E9BFF0BCB0BF0BCB9F9B99F9E9DADA9C90B0BF9F0BCB09A9FBF9FF9DF9FC909FB0DAD0FD9BE9F9DBFDBDBF9FF9DBFBFF9FFF9FF9FBDB9FBDFB90F9FDB09B9D9AD9FFDBDBBFFF9FBFFFFB9FFFDFDBDBF9FFFFFFFFFFFFFFFFFFF0000909AFCB0F9BCB99F9F9F9FDB9E9BFCB0B9B09BDB9AD9F090BD9BDBC9FBDFF9FFA9F9909BFDA9B9B0BAD99BFBF9BFF9FF9FBFBDF9FFFBFF9FFDFBDF9FBDFDF9FFBDBDBDBD9BFD9FFFDFF9FFFFFFDBDFB9BFBFFFFFFFDBFFFFFFBFFFBDBFFF0090E9BF9BDF9E9BCBE9BCB0FA9ADB0F9F0D0F0F09BCB9A99F9F0BC9A9A99FF9DBFFDB9DBFDBFC9CBDE9C9BE9DA9FFD9BF9FF9FDFBFFF9FFDFFFFBDFBDBBDF9BDBDBDBFFDBCBD9FBFFBFBDFF9BFFFFF9BDDFDFFF9FDBDFFFBFFFFFFFFFFF9FFF90E900D0F0B0BDBDBDBCB9F99FBDADB9FB9A99B9ADA9F0DA90B09F9ADBD9FF9FBFF99DBFFF9FF9A9DA9DBFC9FBDF9BFFF9F9BFBF9FDBFFFFBFFF9FFBDBDDBBFDB9FBDFD9BF99BF9FFFDFFBFFFFFFFF99FBBFFBDBFFFFFBFFFFFFFFFFFFFF9BFFC0909A9B9F9F9ADABF9BDA9AF9FBDBCBF90DBCBC9B9F09B9CBD9F9AD9B0BFBDBDBD9FBDFF9FFD09DA9BE999BF9F9FFDB9FBFDFFDFFBDBDBDFFF9FF9FF9FBFDF09FD9FB9FFD9FF9FFFFF9FFFFFFFFFF9FFFDF9FFFDFBF9FFFFFFFFFFFBFFBDFFBF00AC09EDADA9F9BD09E9F9F9E9CB0BDBCB90B09F0F0F0DA90B0BC9B0D9FDDBFFD9BDFBFFFDBF0B0DBD9BCBDBCBF9FBDFBDFBDBF9F9FFFFBDFFFFFFDBFF99F9F99FF99F90BF9FF9FF9FFDBFFFFBFF9FF9FFBFF9FBFFFFFFFFFFFFFFFFFFF9FDFF0909A9B9B9BDAF0BFF9BCB0F9FB9FDBFBCBDBDA99B99B09F9C99BC9BA9BFB9FFBF9BDF9FFBFF9CBBCBE9F9ADBDBF9FBDFBDFBDBFDF9F9FFF9FBDFFFF9FFBDBDB09BFDBDBDBF9FF9FBDBDFFFFFFFFB9FF9FFFFFFFFDBFFFFFFFFFFFFFFFF9FFFFA0009CADADA9DBD90BCB9F9BF0F0B0FF99090B9CBCBC0F90B9BE99AD9FFD9FFFDFFDBFFFB9FD009C999F09F9FBDFBDBF9FBFDFF9FBFFFBDBFFDFBFBDFF9FFFBD9F99BCBDBD9F99FFDBFFBFFBDBF9FFFBFFF9FFDBFFFFDFBFFFFFFFFFBFFBFFBFD09E099BDBDBA9AFFB9F0BCB0F9FDB9BDA9EB9CB09B9B90F0F099E99BDB9BDFFB9F9FDBFDFFF0BDB0FF0BF0F99FBDBFDBDFDBBDBFFDB9FFFFFFBFDFFBF9FDBD9F09FDB9F9DBF9FFDBFDBFFFFFFFF9FBFDFBFFBFFFDBFFFFFFFFFFFBFFFBDF9FFF0009A9E9A9F9F9F90F0BDB9F9E9A9FF9C99C9A99F0D0CB990BCB90F9FF9FBFFDFBDBFF9F99F090FB09F9DB9FFBDBDFBFBFBDFBD99FFFDBDF9FDBFBDFDFBFFFBDBDA9C9F9A9DBDBFDBFFFFFFFBDBFFDFBDFFFDBFFBFFFFFFFFFFFFFFFFDBFF9FF0090CB9F9E9E9F0BF9F9ADBE9BBDE9EB9A0BD9E90B9B9CB0F99ADB09BDF9FFFBDFBDFFFBFF9F0D9F9F9EBDB9F9FFBD9FDBFBDFFFBDBDFFFBFBFDFFFBF9F9FBDBDBDBB90F9F9FBDBFDBFFFFFFFFFFFBFFBF9FFFFDFFFBFFFFFFFFFFFFFBFFDBFF9A0A90F0B9F9A9FDADADB0DBCDA9BFF9C9D0B090F9E90B9D0B0D099FFF09FBFFF9F9BFDF09F09A90F9F99BCB9FBDFBF9BFDFFBDBDBFBF9BDFFDBF9FDFFBFFDFFFDBDDF99F9F9DBF9FFFFFFBFFFFF9FFDFFFF9FFBFFFFFFFFFFFFFFFFFFFDF9FF0D090F9BD0BFDF9ADB9BCBBDBBDBCBF90B0B9DADB090BD0B09DA90F9B99FBDFFFFF9FFF99F00DBDBDA90FDBDFF9F9FBDFDBDBDFFFFDBDBDFBDBFBDBBF9FD9BFBF9F9AB9FDF9FBFDFBDFFFFFFFFFFFBFBFFFFFFBFFBFFFFFFFBFFFFBFFBFFBDBFF0009B0F0FF9B0BF9ADE9BDA9CBCBDBE9CBCB0909DBC0BD0F9A9A99FDFF9FFFFBDBD9FFCB9F9A90F9BF9B9F9B9FBF9FDBFBFFFBFF9BDFBFBDBF9FFDF9F9BF9FDBF9F9DF9B9BDF9F9FBFFFFFFFBDFBDFDBFDBFFDBDFFFFFFFFFFBFFFFFF0BDBFFC09ACBDB9B9E9FD0F9B9ADBDFB9F9BD9A999ADA9A99B09A900D9D09BF9F9BFBDFFDB0BFD9F00DBDBC9FD0B9FDBDBDBFBDBDBDBDBDFFBDFDF9DFF9BFF9FFDBDBF9FBDB0BD9F9BDB9F9FBFFFF9FFF9FFBFDFBFDBFFBFDBFFBFFFFDFFFBFFC99DBFFE0909BCBCBF9ABF9E9F9A9A9F0BCBBF90E9D09C90E9DADA9B9A00BFF9FD99FFBFBFD99BF00009E9B99AD9EBBDFF9F9FDBFFBDFFBFDFBFBFFBF9FDBDBF9B9F9DBFDBDFDBCBDFBFDBDFFFFFBFF9BFF9FFBBDBFF9FFFFFFBFFFFFFBFFFFFF09BFFD090ADA9F9B0F9F0F9F0F9FF9ADB9FF0CB99A9B0BF9B0999C9C9B99FF9F9BFFBDFFFFF0F900C9BDBDF0F9BD9CFB9FBDBBFDBDBF9F9FBDBDB9F9F9FBFF9FDF9FB9F9BDB99F9F99DBFFBFFFFDF9FFF9FF9FDFDA9FDBF9FFDFFF9FFFFFFFF009DFF0F00DB9F9ADF9F9F9A9B0F90BDB0F9DB90BE9C0D9090BCB0B0BC009BF9FD0BDFF9FFBDF9F09009ADA9B9F9FBB9FD9FBDFDBFFFDFBFF9F9FDF9F9F9F9FFBFBF9DBDBC9BCB9F9FBFF99FFFBFB9FBD9F9ADA9B9F9FBDBFBFBFFFFBFFFBFBFF09BFF00A9A9F0BDB0F0F0F9E9F0FBDADBCBBCBD09B9A0F9AD09C9C99B909FFDBF99BBDF9FF9BF00000999FDDBDA9DF9BF9FDBBF9F9BBD9BDADB0B0F9EBF9F9BDBDBF9F0FBCBDF9DBDF9FFFBFFFFDBDFBFCF9BDFDB9F9FBDBDFFDBFFFFFFFFFF0099FF0D009E9FCBF9BBF9BCB09B9E9F0B9FDB00BC9C990BDA9B9A9AD0D09BF9FDBDFDFBFF0BFD00E900F99A9F09FB9FDBFFBDFBFBFDFBFDBDBDBDF9BD99DBFDBDBDFF9F99F9B9FBDB9FBDFFFFF0BFF9E9BDBDB9BDBF9F9FFBFFBFFFBFFFFFFBF090FF0009E9B9BDAF0DBFCBDBCBDFB9FDA9BC9BD9B0B0BD090DAD0909A90FFDBFD9BFBFDF9DF00900E9BCFBDB9F9FDBBFDB9F9D9FDBB9DA9F9F9F9BDB9EB099BFDBDB9F9F9BFDADBDFF9FBFFFD9FC9BD9F9BDBFFFFFFFFFBFDBFF9FFFFBFFFFC9FFBF0A9E9BCBCBD9FBF0B9B0BDAB0F0B9FFBC00B0D0D9A9F0B909CBD009BFF9F9E9FFFFDBFB0000900DB9DBCF9E9BDBDBDF9FBF9BC9FBDB9FBDBFFBDF9DBDAD9AFBFDBDBC9DBDBDBDBFF9BFFADBB9F9F9BDBDF9BDBFFFFFBFFFFFBFFFFFFFF0B9FFDC909BDBDB9FA9CBDBDAD0BDBDBDADBDB99ADB0B0F9090DA9A90B90F99FF9F99FFFB9FDAD000E09ADABDB9F9F9F9FFBF9DBDF9BF0DBDBDBFDBDFBDBF9BDBD99DBBDADB9BDBDBDBDBDFFFF90DFBDBD9FFDBFFD909A9FFFF9909F9FFFFFFFAD0BFA9E9ADADADA9FFB9E9ADB0DADADBDADF9E0990D0900F0B99C90BC090BFF99FDBBDBDF0BD00009009B9DA9F9FBDBFDBDFBF9BAF0DB9BCBDBDBDB0DBD99DBDBBF9FDBDBDE9BDBFBDBFFBFF09FBFDADBFFFFFD90BDBDFBD0000BDBFBFFFFFF00BFADA90D9BF9BDF0BDE9BDA9F9B9F9AF9BF009BCB0B0DB90D0F0BC99B0B9DF9FF99CBDF9BDA0000009DEDB9F9AD9FBDBBFBF9BD999B9E99BC9FF9FDBF9FFF9DBDDBDBDBDB99DBF9DBFBFDFF9BF9909909090000FFFF900000F9DBFFFFFBFF09E90C90DABAF9ADA9BDA9BCB9F0BCF9AD9BCDB9C09D00B09E90B0909AD09C9BFF99E9BDBF00900000000B9ADBDBDBFADBDFDBDBDBCF0D09F9FF009F9FF9F090BE9EBFBFBFBDF0BD9FBDFDBFFE9DBC09FFF00000909FFF0009090FBFDBF9FFFFF09E900A99D9DBDB9FCBDBCBCB09FB0BDBADBBCB9A0B9C9F09A9DBC909A90B099FF9BDBFDBD00090009000F9BDADBD9F9FBBFF9EDB9900000999BF0000009FFD9999909FDBDBDF9BF9FBFBDBFDA99BB09FF009FE000FC009FFF099DBBDFFBFFFD0000A9CA0BE9E9E9BDA9F9B9EB09F9E9DFADF9C09D09A90BC9CB0B0E990F9F00F9FDBDA900000000000090D0BDBDEB9F9FDB9F9BC9E9900000BFC0000090FFFFFD099F9BD0B9BDF9F9F9FFFFFD0FD9D09000090000000FBFF090BBDFBFDFFFF0ADBC9009C99BF9BDABDB0F0F9DBC9ADBA99BF0B9B0BC90F990B09D099E9090099FB9FFD0000000000009CBB9F9BDB9FDE9BFDBFF9B90A9C9C0000009FC00BFF000BDBDFDBBDFDBBFFFFFFFFFB09BFBFBDBD0C009009F9FF000BDBDFADFBFBFE09B000A90A9AF0BCB9DB0F0F90BCBBF9AD9EFBD000D0BCB90E90DB0B0B9E9AD9A009F990000000000000009CB9F0BDFBB9FF9FB99FCBD909A9DE900009000000AD99F9BF09DB9BDFF9FFBF9FFDF090D9DADBF9FFFFF9BFA90B9FBFF9F9BFFFF9000E0900D09D9BDBCBE9F9B9AF0B0D0BDAF9BFBD9A99090F99A9AD9C9C9909A9C90000009000900900909009CBDBDBD0F090BDFE9BDBEDB0DB090FFDBC009BC99BF99F09FADBDFBDFFF9FFFDBFF9E9A99DBD9FBFFBD00D09F9FC9FBFFF9FFFFF09F9E090A00A9DA9BDBCBDE99BC9BBDA99AD9BD0AD9E9CB09E9C9B0B0B0F90C900000000000B0C000000A0DBBD0F9FBFD9BDF909F9F99BBDB09CB99FFF9FFDBFFDBCB09F9F9FFBDBF9FFFFFBFF9F9BD0B090B990909BF9BF9FBFF0F9CBFFBFFBC00F0DAC90B0F0F9E9BF9A9F0DB0D0BDAD9BEF0B99A90B09F9A9B0D09C900B9B0000000000000B00009C09BC90F9BF9DBADA90BF9E90FDFCBDFBDDA909AD09AD090909F9F9BDBDBFFFFF9FFFF9FB0D0FCBDBC9EDBDBFDBFDAD9E9F9A9BFFFFFFF09FB009000D0B9CB9F0F9F0FB0DABDADBAF9F90F0DA90F090D0D0B90BCB99C0B000000000D09C0900000F0BDB9FCBFA9DBDAD9009F9F09BDFBDFBDBFD9BBD99F9F9FF099E9F9FFFDBFFFFF9FFDDFBB9909F9B9BFFDBFDBFDBFBDBFFF0DBFFFF00BC0F009E90BDABDADB9E9B0DBAD0B9AD9CBBF90B99E99FA9A9B9CB0990E9B00D0C09000000A0000909009CBDA9BD9FF9DB9A0D9E909F099ADB9FBDBFFDFBFF90B999FBDBDBF9D9FFFFF9FFBFBBC9CB9F000C9009BDBF9BD0900090009BFFFFF90F09FE000A00D0BDBCB9E9F09DBDAD9AB9FF9CBC9E90A99C909E90DA0B90D90A0000000C09009C00A009F9B9FDBFBDBFAD0D9A090F00BF0D9E99FFDB9FBD090F9CB09DA9BC9FBBF9F9FFF9FDFD9090D0AD0000000000C00900D00009FFFBFF00BF0F00909C9A9ADA9BDE9B0BCB0BDAF9DA9F0B09B90F9DA9ADA90B09D90F0AC90000000900C000009C9A9BCBDB9F9FBC9FB00090F00BD09BF0F090B0D0000F090B0C9B0DF9BFFDFFFFFFFFFFBFBE0000900900000090000ACB0A909BFBDFFFE9C09E90E00A0D0DB9FDA9BCBDBCBDA909ADFBD0BD0E909AD9009F9C9A9E99090090090000000900900B0DADBDAFCBDBD9F9DF0000909009E0990F00D9000000000C900C990909BFBDFFBFFFDBDBD990000900F0D0000909090909C9BFFFFFFF90BF09E9000900A90FA9F0F90B09B0DBCBDABFBD0B99B0F9ADB9090B0D09E9F00000000000900A00000C09F9EF9BDBFDA9FB0BD000000D009C009090A00D09F090090090A09FF99FFFBFFBDFFFFFFF099E000900000C0A000F0C09A9FFFBFFFFFAD0BF0F0BC0090BC9DA9F0FBCBCBDA9B0BD9F90BC9E0D9AD00DBCB09A9A900900000000000009C0B090B0BDB9FDBDB9F9BDFDBF90009000009E0C009C9A0C0000000000D9FF9FFF9FFDFDFBFFBDBFF9090C000009099C9FB09BBC9FFDFFFFFFD09ADF0F0009AC009BAD0B909B090BF0DADAFF0BC9A999AD9B9B090D099C90F000F0000000000000C0A0DBCB9F0B9E9F9FDBF9AD9F000009A9099A90000090900000009909BFFFDBFFFFFFBFFFDFFF9FFDB900000A09EBF009DADBFFBFF9FFFFA9E9FFF09C000900F0D9F9E9E9CBBD09A99F9BD09B0DAC9A9C0CBDA9ADA9A90000009000000900090090099F0DBDBDBFF9BD0BDBE9BD0009FEBCBCBC909000C9000909BDBFDF9FFFFFFBFFFFFFFBDBDBFFFFFBDBD9DF990BDBE99FFFFFFFBFFFD0B0BF00F0B000090B9A9A909A9C90BC9CB0BFBD0DB99BCB9B9090909090D0BC0000C0000000C0000D09ACBDBF9FDBD9FF0FBDBD9EDBF90909F9090BCBC0F000099DBDFFFBFFFFFFDBFFFDFFFFFFFFFFFFFF9FF9FFBFFFDF9F9BFFFFFBFFFFFFA9C90FF0F00D000000E9ADA9C9A90F0B0B0F0DA0B09E0990F0DBCBCBCBCB0900900000000000090000A0D00A9FE9BFFF99F9FADBF99FFF0009000090BF9B99F9FFFBFFBDFFFFFFF9FFFFFFBFFBDFFBFFF9F9FFFFFBFFFBFFFFFFFFFFFFFFFFFBDA0AFBCBCB0A00000909C90DA9C9E09C90D09BC909E99F0F09B0990909090E900000000000000000090C9B99DB99E9B90F9F9FDB09FBCBFD09E9FDBDF9BDFFBDBFFFFFFFFFFBFFFFFFDFFFFFFFFFFFF9FFFFFFDBFDFDFFFBFFFFFFFBFFFBFFFF09BD9CB0F0C00000000000000000090000000F000090000900000000000090000000090090000009000900F0BDFF9FDF9BF0F9BFDAD9F9BFF99DB9FFBDFFFFFFFBDFFFFFBDFFFF9FFFFBFFFDFFFFFBFFFFFFFBFDBFFBFFFFFFFFFFFFFFFFFFFDE00FAFD09A9000000000000000000000000000F000000000000000000000000F00000000000009000000090D0B09FB9AD9DBDF9BDBBF9FF9FFBFFF99FBDFBDF9FFFBFF9FFFFFFFFFFBFFFFFFBFFFFDFF9FDBFDBFFFFFFFFFFFFFFFFFFBFFFFFB90090BE9EDE00000000000000000000000000F0000000000000000000000009000C00000000D00000000BC09BD9FBDFD9A9FBDEDBDF9FF9F9FDBDBFFFFFBFFBFF9FFFFFFFFFFFFFF9FFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9CB009F0B9A9E9C000000000000000000000009E000000000000000000000000009A000000900000C000900B009AF0DB0BDFBDB9BFF9FF9FBFFBFBDFF99BDFFFDBFFDBFFFFFBFDBFFFFF9FFF9FFFBFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCB000BCBDEDF00000000000000000000000000E9A09000000000000000000000C0000900000000A900090C900D099DB9FDBBCBFFDBDB9BDBDF9FDBF9FFFFBDBFFFFFFFBFFFDFFFFF9FFFFFBFFFBFDFFFBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC009F9F0B0BCB000000000000000000000000BC00A0000000000000000000090009000000000000000000AD0BD0BF0F9BC9F999F9FFDBFFBDFBFDFFBDBDFFFDBFDBFFFFDBFBFFBFFBFFFFDFFDFFFBFFFFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFDA90000BE9F09F0C00000000000000000000000CB00000000000000000000000000000000900009C009000909000BC9BDADBF9FFEDFBDBFDBDBFDBFBFDFFFBFFBFFBFDBFFFFFDFFFF9FFBF9FBFBFFBFF9FFFF9FFF9FFBFFFFFFFFFFFFFFFFFFFBF0090BC9BC0BC0B00000000000000000000000BC0000000000B00000000000000C000C00000000000000000FAC909BC9DBD9FDB9BBDBDFBFFFBFFDFDBFBFFDFFFDFFFFF9FFFFFBDBFFDFFFFFFFFFFDBFFFBDBFFFFFDFFFFFFFFFFFFFFFFFFFBD00900FDAC0BF0BD00000000000000000000000CB009A0C00000000000000009E0900090000000090000000009F09C9BA9BFB0BDFFDBFB9F9BDFDBFBFFFFDFBDFBFFFFFFFBFFBDFFFFFFFFFFFFDBDBFFFD9FFFFFBFFFDBFFFFFFFFFFFFFFFFFDAF0E09AF9F00F0DAE0000000000000000000000BC00000900000C00E00A000009000900000000000000D000900B90BC9F9C9FDBF9BF9DFFDFBFBFDFDBF9FBFFBFFF9FBDBFFDFFBFFDBFFBFFFDBFFFFFF9BF99DBFDFBFBFFFFFFFFFFFFFFFFFFF909009F00ADBF0BD00000000000000000000000E9A0000A00000B009009000000000000000000000090A0090009E90B90FBDA9F9FD9FBF9BFDFDBFBFF9FFFDBDF9FFFFFFDFFBDFFFFFFFFDBFBFFBFF9FDE99FBF9FBFFDF9FFFFFFFFFFFFFFFF9E9A090DB0D0F0BFE00000000000000000000000BC0000000000000000000000000000C000000000000090000D009BC90F909FDB9FBFBFDBFDBFBFFDBFFFF9FFBFFFBDBDFBFBFFFFBFFFFBFFFFDFFF9F0099E99FF9FFDBBFFFBFFFFFFFFFFFFBF0BC0F0A00BE9BCD000000000000000000000000DA00A090000000ACA0000009000009000000000000000C0900BC90BC90BF90BDBF9FDBFDFBF9FDBFFDBDBFBFFDBDFFFBFFFDFFBFFFFFDFFFFFBFBD090B9F99F9FFF9BFD999C9B99FFFFFFFFFCF0900090D09C0BE900000000000000000000000E9C000000000009000CA0000000000000000000000000900A09ADC9BBD9CB99ED9F9FDBDBFDFBFF9FFFFFFF9FFFBDBFF9FBFBFDFDBF9BFF9F9FFC99099F09BFDBF9FF9BFE9000FBCBFFFFFFF9F0090FC0BF0BCF00F0000000000000000000000F0A00000A00000000B0000900000000000000000090000009C09A909C0B9F0F9BF9BF9FBFDBDFDBFFBDBDBFFFBFFFFDFFFDFFDBFFFDFFFBFFFF0B00FBF09FDFBD9F09FF090B9D9099FFFFFF9A0BC0A90BC009B0BC00000000000000000000000AC9000000000000E0000000000000000000000000000000900009CBC9B9CBDB9FDBFDFBFDBFBFBFDBDBFFFDFBDFF9FFBFFBFFFFFFBFFDFF0B00909B9D0BBFFBD9B09F909090CA00FFFFFFFF0F9C909CB0F09AC9D0C0000000000000000000000DA00C00000009A090E0000000000000000000000000909000BD0A90B9CB9CBD9FBC9BDFDBDBDBDFBFFDF9FBFFFBFFBFF9FFFDBFFFDFFB9F9D9900C9F09DF9D0B09FBDAD0BC09009BFFFFFFF900A09A0C90BC9B0A000000000000000000C00000F9E0A00000900000009E00000000000000000000000000000009C090FBCB9BCBCBFF9BFBFFDBFBDFDBBFFDF9FFDFFDFFFFFFFFFFB9B9F900B0C99BF09F09FB9FDA9F000900B0009FBFFFFF0F09C0BC9AC9BEF0F9F000000000000000C0000000F0090000000A000AC0000000000000000000000000000009C09F090F09F9E9B9F9DBDF9F9FBDFFFB9FDFBFBFF9FFBFFFFBFBFFF00C09009F009AF909B9FF09C90900909009009BF9FFFFFFF000B000099AC90DA0000000000000000000000C000E00E000000000009A0000000000000000000000000000009000BF090F0BDBCF9FBFF9F9FBDBBD9FFFFBF9FFDFBFFFBFFFDFFBD099BD0BF09DBD9C9F9E9090B09BC90000BC909E9FBFFFF90909C000D0AC9F0B0D0000000000000C0000000000F090000000000000000000000000000000000000000C0AD00A0909CB909E9DB9F9F99FBFFDBDFFBDFBDFDFBFBFF9FFFDBFBFF099BC9A9C9D0B0B09BC9900090BC0000090000E9BFFFFBF9E00000090A90B00BC9A000000000000A00000000000F0A00A00000000000090000000000000000000000009090F090C0090FD09A9F9F9FFF9F9BFDB9FFBDFBFBFFDFFFFFF9FFFFD0F00FF9CB9A009FD0B00A09DBC00900009A90A90B9FF99FFF9000000E900C9F09A9C000000000000000C00C00000AD00900000000000A00A00000000000000000000000000000009A90DA9BF9F0FBF99BDBFDBFFFF9FBFDF9FFBFFFFF9FF99F0B09F90099C099F000D09D90A09090009E0C009DADF900BFF000DA00900000B00E0DA0C000000C00C000000000000DA00C000000000000000000090000000000000000900000090F09CB09DE90F9BDE9FFFBDBF9F9FBDFDBFFF9FF9FFDBF99F09C9E909BC0009F99DB0B00A09000000B00909C0B9FA09FF0000900900009DBC0B99B0000000000000000000000000AD00A0000000000000000000000000000000000000009C000000A09B0B9DF9FDF9F9F9FFF9FFBDFFBFFF9FFFFFFB0BCBF00900900C0B00BCA0000D00D0D09DAD0D0D00009B0F0909F0909A00000000A00900AC0F000000000000000000000000F0A0000000000000000000000000000000000000000000900090D00D9CBA9E9BBDBFBF9BFDB9FBDBDB9FFBDBFFFDBD99F0909BD0909000999CB0900B0000E90B0B009A9E09F0F09F90A00D0000000909000D9B00000000000000000000000000F0D00000000000000000000000000000000000000900000BC0000B00B09DB9F9FBD9DBFDBFFFFDBFFFFFFDFFFF0090F00000F0000AC009AC0900009C090B00F0C9CBAD099BE900F00C909A009000000E00F0ACBC0000000000000000000000000A0000000000000000000000000000000000000000000000000909C909FB0F9ED9FFBFDBDBDBDBFBDBDBDBF9F9090F9090F9000090909C90900D09A09E90C90090B0D9ADAD90BD0009000000000909090F00D900000000000000000000000000F0000000000000000000000000000000000000000000900900C000ADBC0DF9F9BFBDBDBFBFFBFFDFF9FFF9FFF009F90C090000900F0009A00000AC00000909ADA9C9AC99B0E90A09000A90D0000000E0000B0AD0000000000000000000000000AD0000000000000000000000000000000000000000000000000009009B0BDADF0DBFDAD9F9DF9BF9FF9BFFBFC0909CB00AD000009000B00D00900909000000900090900E9B9C9000909C00000000A900090D90A0000000000000A00000000000DA000000000000000000000000000000000000000000C0000900900F0DB0BDB9FBDAFDBF9FB9FF9FF9FDB9FD0B0DA900090000090009C0900000D0000000000090000BF90C0A009A0A0900A000090000B0A0AD0000000000000000000900E000AD0A0A0000000000000000000000000000000000090090000009E0090B0DBDBDF9BD9BFDBF9FF9FBBDBFFFD090909C009000909C00900900900000000909000000AD9C9C009090C9090A00909000C0090C90D000000000A000A000090E000000DA0909CA900000000009A000000000000000000000000009000009000DB9E9FA9FDBFF9F9E9F9F9FDBFBDBF0BC9A09000000000000090000000909090000000F09000B00B00009A0C0D09C00000000000000B000000000090090000000900000E9E0A090000000000CA0C9A0C000000000000000000000000000000909E99F9F9BDF9BF9BDBFFBDBFC9F9FC9900D000090000009000090000900000000000900009000F90E90E0090A00000000900000090BC00000000000A00A000000CA0000F0090CA00C000E9A0909A000B0000000000000000000000000000000009F00F9FCB9FCBDFF9F9FBFDFBDBF00A0D000900000090000000000900000C00000A0000000BD0009009090E90090000000090F00BC00000000000000000000090000000F000B090A0B000C0A0A00F0000000000000000000000000000000000009F9BCB99E9BDAF9BDBDFDB99FF099C9A90000000090000009000000000900090D0090090BD0AD000F00E90009A000900000000BC0B0000000000000000009E0000000F000000E090C0B0A9C00D00000000000000000000000000900000000090009F9F0F9FDBD9FDBFFAFBCBD900A000000000000000000000000000900000000000000F00000BD0090909000009000000009009000000000000A00000000000000000F000090A0A90C90A09A0A0000B000000000000000000000000000000000900F9F9F99EB9ADBF99D9F9BCBD09090900000000000000000000000000090009000000F090900B00F00009C000000009A00F00F0000000000000000000090000000F000A0A09C00A0A090A0090F000000000000000000000000000000000000009DA9E9AF9DFB9F9FFBF9FDB000AC000009000000000000000000000000000000090090000E9BC9F00000A09000900D009009F000000000000000000000000000000A00909C0A0B0909CA00D0E0000000000000000000009000000000000900009ADBDBDBDBBD0F9F9FDADBC0909000000000000000000000000009000000000000090000090C0B000AD009AC0000A000009E000000000000000000000000000000F0DAC00A09000ACA00D0A0000009000000000000000000000000900000000009BDA9F0FC9E99FADBFDBCB0000090000000000000000000000000000000000000BC0000BC090C00900F0009A0009009CB0B0000000A0000000000000000000000DA009A00A0A0D009A0000000000000000000000000C00900000000000009000C09DADB9F99E9FDBF9F9BC0090000000000000000000000000000000000000000000909000A9009E9000000C090000A00D0000000000000000000000000000000AD00A00D090DA0BC0000000000000000000000000009000000000090000000090A9DBDAFCB090FBDBCBC90000900000000000000000000000009000000009000009A00009000B0000090090000C9A90F0000000000000A000000000000000000F0B0C09A0A0A0000000000000000B0000000900000000000000000000000000009CA9E99BC9BF909C9000090000000000000000000000000000000000000000900000009A9E900900F00000B00900C9000000000000000000000000000000000F00A9A0009C90F000000000000A000000000000900F000000000000000000009000909BC09C00AD0B0F90000000000000000000000000000000000000000090E90000000C00090E900000000000B09A0000000000009000000000000000000000F000DADA00A000000000000000009C000000000000009000000000000000000000000090A9090BC90000000000000000000000000000000000000000090CA900000D090B900E9000090BC90090C00D0000000000000A9A00000000000000000F00F0A00000000000000000000000A00000A0900000000000000000000000000009000000D000D00BC90000000000000000000000000000000000000000090000090000AC00D00000AC000000CA90A0000000000000A00C000000900000000000F000000000000000A000000000000009009C00B000000000000000000000000000090009000900900000000000000000000000000000000000000000000000C90C0009090B000BC090A09A09A90090000000B0000B0CB0A00000A0000000000F0B0A900000000000090A0000000009A00000000909000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000BC0AC090009A0090000C000F000000000A00009A0900000000000000000BC0000C00C00900B00A00000B0000000000009000000FE0000000000000000000000000000000000000000000000000000000000000000000000000000900000000090090000CBC09C009C09000900000000000000E09ACA0000000000000000FA90CA0B009000A000000000000000000C90AC0000000C00D090000000000000000000000000000000000000000000000000000000000000000900090000000000000000909A900000000A000BC00000000A09000090E09000000000000000009C0A90000A00A00000000000000000009000900DA00900000000009000000000000000000000000000000000000000000000000000000000000009000000900E9000000AC0000090000000900000000000000A009A0A9AC00000000000000000EBC000000000090000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000900000C9090B0C0000B00F0009C000000000090000009C09A00000000000000000DA9A000000000A0000000000000000000A000B00000000000000000000000000000000000000000000000000000000000000000000000000000900000000000000DA0000000900A009000CB0B0000000000A000000A0AC000000000000000000F0C00000000000C0A000000000A000000000000E900CB0000000000000000000000000000000000000000000000000000000000000000000090C00000000000090009E90000A09C00000B0000000000000000000A00909A00000000000000000DA00000A0000900900000000000000000000009000900090AC09000000000000000000000000000000000000000000000000000000000000000000000000009000090000909000090009C0000000000000A000000900A0000000000000000000F00D00009A0000A0000000000000000000000000000000009000900900000000000000000000000000000000000000000000000000000000000000000090000000000000C0AC90000CB00000000000000090000000A00000000000A000000000AF00A00000CAF0000000000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009A90000000B0000000000000000000A000A009A000A9C0A0000000A000F000000A0900000000000000000A0000000000000000900000000000000000000000000000000000000000000000000000000000000009009000000000000900009000C000900090000000000000000000A0000900000000C0A090F000B09C000C0000900A000000000009A000000000000A00000B00C0000000000000000000000000000000000000000000000000000000090D00000000000000000000000000E0BDA909E0900BC0000000A00000000000000009A0000B0A900A00000CA000F00000A0000000000000000000000000000000000009A00000000000000000000000000000000000000000000000000000000000009000000009C00900000000009C0000E0000BC000000000000000000000000A0000A000000F0C00000B0000AD000000000B0000000A00000000000000000000000009000000000000000000000000000000000000000000000000000000000090000000000009000000000000009009009000000000000000000000000000000000090A9E00B0000000EBC0DA0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C0000000000000000000000000090900BCA0009ACB00000000000000000000000000000A09E0C009A0000000A90A0A900000000000000000000000000000000000000000A0C09009C00000000000000000000000000000000000000000000000000000000000000009C00000000000AD00900CB0900000000000000000000000000000090A0B0B0AC000000900F00DA000000000000000000000A0000000000000000000090A00000900000000000000000000000000000000000000000000000900000000000000000A90009CA0F090B000900C000000000000000000000000000A0B0A0D0000009000000ADA000F00000000000000000090A00000000000000A000A0900000F00AC0B0000000000000000000000000000000000000000000000000000000900009A000000009000000D000B00000000000000000000000000900C0CBCA0A00000A000000000F00F0000000000000000000C90009000000000000000000A0900090000C9C00000000000000000000090000000900000009E000000900090000F000C9C0A90B0C00BC00000BC000000000000000000000000000CA9A9009009A0B0000000000B0000F0000000000000000B000AC0A000000000000DA00A0900000000090000000000000000000900000090C0000A0000000090900000000009000900009C0000B090000B0F000000000000000000000000000A0A90000A00000000000A9009A00A0F0000000000000A00000B0090000A00000A09A00C900CA00B00000000000000000000000000009000090009000D00C90000000000000000090A0B000090000000090C90000000000000000000000A0000009000A00000A0000000000A0C000000F0000000000000D00000CA0C0A000000000000B0A000000000B000A090A0D0000009000000000C000000000D0000000000000000090000000000090AC09C000DBCB00000000000000000000000000009A00A00000000000A00000000A0BCB00F00000000000000A00000090A90000A00000000000CB000000C000900009000A000000000090009000000000000090000AD0000900000D00E090DADA9000090F000000000000000000000000A000900A000000000000000090000E9A9000000000000000000009E00A00000000009000000000B0CB000009E9A00000000C0000009000D000009A00C0000000000000009000BC0ACB0F00A0900000000000B00000000000000000000000000000A00A0000000000000000000C90A90CAC9A00A0F00000000000A09009C0000A0000A00900A000000000000000009A0000A900090000000A90E0000090C0B0000F000000000000090000900000000000009000CB0000000000000000000000A0900000000000000000000C0A00A000A09A00A900F0000000000000A0C00A000000A000000000000000000A00A9E000C0B000000000090A9C009000D0A900000900000000000000000000009000C90900F00DA900000000000000000000000000E00000000000000000AC00B09A9AD0DA00000000F000000000090009A0090C090000000A0000000A90009009000BCB00000000B000E0000000000B00000090E0000900900090900009000C009000000900B0000000000000000000000000000000000000000000909A00B00CA0C0A0A0000000A00F000000000A000000000B0E00000000000000000A0A00000EBC00000CB0000090000CB000A0C0009C00A09000000000000000900000090000A9E0BC0BC00000000000000000000000000A0900000000009A9AC0E00B0E9A090A90000B000000F0000000E9000DA000000000090C00000000000000900000A90A9A00B000B000A090B000BC9090A000B0D00009C09C000000000900000A900D00900000000000000000000000000000000000A00000000AC000AB0B0C00000A000000000000000F0900090000A000000000000A09A00000000000000000009E9C00F0000C0090C0AC0ADA0ACA090DA0C0000C0A000000B00000000D09000CA000000000000000000000000000000000000000000A00B000B0E9C00CB09A090000000000000000F00000A000AD00000000000000000000000000000000000000A0B00000B000A09A00BC00D090CA000900B09090090009000900F00A0A00090000000000000000000000000000A0000000000009000000B0009A0B0A00A00A0000000A000A00000A0000000000000000000000000000000000A900000000000B0BC0A0000000000090009A0A0A900900A9C0A000C0A0000C0E0B00BC9C0000000000000000000000000000000000000000000A00A090A0009A00000000000000000000000000A0F000A00009000000000000000000000000000000000000A900C0A9C90009E000000E0A000C9C0AC0AC00000C0A90C0000A909C0F0A000A0000000000000000000000000000000000000000000000A0090A00A90A09A000000000000900000000F0F000CB000A00000000AC00000000000000000000000000B0B00A0A00A009090A09090E9A0009000090A90B00000000900A0B00F00000DA00000000000000000000000000000000000000000000000A000000000000000000000000A0000000F00009A00A00900000000090000000000000000000000A0C0000F000000000A0090A0E00000B00A900A00000000A90000000C0E9000B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000F00AC00C9000000000000A00000000000000009000900900ADA000000000B0CBCBCA900000000000900DA000090009A00090B00000C0B000A000A00000BC000000000000000000000000000000000000000A000000000000000000000000000F0090A90A0000A0000000000000000000000000A000A000A900000B0000B0CB00A09ACB00BC00000A00A00000000000000000090000B0C000000D00000009AC000000000000000000000000000000A000A9000000A0000000000000000000000ADA0000000E09000000000000A00000090DA9AC00C000000000090000900B00B09A09000000009000000009000000000000A00E0A900A90090DA00000000000BC0000000000000000000000000000C00000000000000000000000000000A0000F000000A9090C00A0090A000000000A90AA0C009A9009A000A9A0000A0000AD0CAC9E000000B00A090090A000000000009090B09000F00A00A000000000A0900000000000000000000000000000B0900000000A00000000000000000000000000AC0000000A0A00000A090090000090CA9C9A09A00A0000000000A0900A9E9A0B09A0000000000C000E00000000000B0CA0CAC0ACB0000000000000000000A00A09000000000000000000000090C0A00000A0000000000000000000000000000F09A0000000000D0000000A000000A9A90A00000C000000900C0000000000000000009A09A0009A9A00000000000000900090BC900E90000000000000000000000A0C00000000000000000000A0BC000000000000000000000A0000000000000F0000000000090A000000000A90000C0AD0F00B0B000000ACB0A90A00000B0F000BC00C00C9A0000C90B000B0000000A09A000A0B00A000000000000000000000000A000000000000000000000009E00000000000000000000000000000000000F0000000000A00000000000000A9A9ADA0000000000000000000000000000000000B00B0A00000B0A0000A0000000000000B09C0CBC00000000000000000000000000A000000000000000000000A00000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010500000000000089AD05FE','Andrew received his BTS commercial in 1974 and a Ph.D. in international marketing from the University of Dallas in 1981. He is fluent in French and Italian and reads German. He joined the company as a sales representative, was promoted to sales manager in January 1992 and to vice president of sales in March 1993. Andrew is a member of the Sales Management Roundtable, the Seattle Chamber of Commerce, and the Pacific Rim Importers Association.',NULL,'http://accweb/emmployees/fuller.bmp'); +; +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(3,'Leverling','Janet','Sales Representative','Ms.','1963-08-30','1992-04-01','722 Moss Bay Blvd.','Kirkland','WA','98033','USA','(206) 555-3412','3355',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000080540000424D80540000000000007600000028000000C0000000E0000000010004000000000000540000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFB009A00A9009A9AA9A900009AA9ABE9EB0B0BB09A0AB0A9A9B0FA0FA0CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFE9A09A9EBEBFBB0BB0AB09AC9090AB0BCB0BA9E9AA9A90B000009AAB09009BEB0BAD0EB9E9F9B0C0B0FADB0F0BEB0FCBC0BCBFB0F0BBE0B09BA0BBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFA9DABEBFFFADFFADBF0BEBBAFAF0FBBAB9ADABADBE0AB0BCBFBC090E0A9AFA9BC90BB9AFABEE0BB0FA9ABEBE9B0FBA9AB9A9A0FB09E0BDAFA0DBE9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFB0FABFFFAFAFEABCBAA9F09AF0B9BBCBE9EBE9ADA9A990FAB0000BFA9090B09E0BAF00A9ADAB9BCBE9F0BCF0BE9FA9EB9CA90FBEAF0BFBA9ADBA9ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FE99A9FAFFFFEBDA9ADBCBFA9BA9EAFACB0B9AF9A9AFAEB0900BB9A0000A9AF0BBCB0B9E9BADAFAB0BABEBBBC9EAA9EBEABBE90B9B0B0BCBE9A9FADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBAFBA9BEBE09ABFEBABAB0F0F0F9DBFBBAFAB0FAF0B090BCBC00090B0B0A0BBE9B0BCA9AF9A9BC9E9FAD00ABAB9FA9CB9C90B0FABFF09ADBFEB00B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBE9ABDEFBDBBFFCAB0F0D0FB0BBA0ABF0FDA9F0A90009A09A0B00000000D0BDA9AFADA9BDBEBFABABBADABFBDA9E0BEB9EBABE9A9EB0FE9AB09FAFBAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B9E9FABADAFEB0BBDE9BABBA9FEDBBF0BFABC0A900BFE0BC0900B090B0B0BFAFE9A9A900A0B0E9CF0C0B0F0CADABF0F0ABBCB0B0BCBEB0A9AFA9A9E9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFABA9F9FAF0FCBCAB0BE90EDABBABCBFA090B090FBFEF009A0B00A000F0B00B0BE9EBAF9FBFBBBBABB09FABB0F9AFA9FBCFBCB0E9B9A9FAC9F0BC9F0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBF0DA0A0FBEBABBDEF9AFBBADA9CB0A0BCA00BAF0BFFE9BA9009090B09ACBBAFF0BADB0A0BADACBDE9CA0BC0BAAF0FBAEB00B0B9A0F9EB9ABAFABABBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BA9BFBACB9EDAB0BAF9AE9A9FA90900090B0F0BFBFE000CB0A00009A9B0ADB0BE900A99ADABFBABEA99A0BF0F9AF0FF0BFADA0E9BABBEBC90BC9E0BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9E9AF00FBFEBA9EBBC9A09BCA000A09A9ABCB9BFFEE9AF0B009090BAFBEB9BAF0BAFF9ACB0BFACBDBBE0DBFAF9EB0B0BE909A99B00BF0B0AABCBABDBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BA9AFBCBCBBEBBCABAD000090909009AC90B0AA9FF090B0B00A0BC90F090F9EBCB0AF9ABF0B9BAA9CB0A00FAABCBEBDAFAF0E09BE90FBF9CBB0BCA0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0FBDA0BABE90CB9B0FA9AB000A00B0A9A9A9F9EBFE0BC00090900BA9BEB0BABCB0FB0BCB0FBEBDBFA9E9BFADBCBA9A0BE90BBB0E9AFA90FA00BE9A9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A0B0EBFBCB9EBBAF0F0BC90B0090000909A9E0BBFEE900B0DA000900FA0B0B0BBE9B0BEB0B0AB0A0F0BBC0A99ABAD0BFF9EB0C009A909EBA9E9F0BCADBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9BDBFBB00BE0BAC9AFA9ABFE09A00909A0BCBA9AEBE90AB00A90A9ABFBE9F00FC9AEBC909ADB9EBFB0BC0B09AE9CB0F0A0A90B9EB090FAB0FA9A0FA90ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0A000CBE9BE99BFA90F090AB00000009090F0BFBFE0B0DA900090BCBA90AB0BEB90BAFADBA0FB0EBEBABEBC9AA9A9ABF90FA009A9EB09E9AFADA9CA9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB9FB9A9AE9BEFAF9A9ABEB9EBCB00000A0B0BE9AFF0FA090B00A90B0FADB009BAE9ADBAB0FFB0FBF09BF00B0D0F0EB00AB09EB0DA90A9AF0B0B0CB00B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0A00EBCB9BEB0BA0F0B09AE90B00B00090A909FFF09009A00090A0F9A9BAB0B0BFADA0D0F0B0BA9A9E00AF0A0BA9BC9E909AB09A09A9CA9ADACA90B0BCFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9B9BB0BE9E9E909F0BCBEB90B9CB00900BB0FAABEE0B9E090B0BDBBAF0E90C9AE90B0BAB09AFDABE9ADB9A909A9E00A90E90D0A09E0B09A9A090A00009BFE000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CACBE0BA9A9AB00B0B0BC0BCAB0B0000009AFBE9A9E090A0009ABEFABBAB009BADAF09ABE9ABBDAFBAFA9E9AD090B0A90A0A9CB0900B0DADB0B000900BC90000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB9ADBE9FA9E9EB00F0F9A9E900BCB0B900F90FBEDA9A09090A9A90BC0DB0B09AFB00BCBCB0BCBEB0BDA9E0BC0A0BC090A9090B09A9B00B0A00009000900000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A9AA9A0BF0B0BFBA90ACB0B0F0B0B00A90ABAFE90ADA0A0090DAFB0BA0BC0AFAC0BCB0BADAB0B0FEBA90B00B0900BCA9CB0A00A0000B09090900000000009000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9BF0F9FADA0BBFF0E90A99ABCB090B0E9000B9FE90E9009009AFAA9A9A9F0A909BBB0B0BC9A9EBDB0B9E0BCA9000BA009A0090B0909A900A0000000000000000090009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9A9AB0BBF0F0B0B9EBDAE90B0E0BC9AF0B00E9F0A9A9A090A9A9FAFCBB0B0B00FAF0E9AB0B0BAB0F0BBF0B0A9A909A9090A0000000009090000000000090009000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBE9AF0F09AFAF0A9EA90A90B090B09A90B0BAF090009A0909BE9BA9AFBBC0A90F0B0A9CB0F0DAFABE0000900000000A0A9090A9A900A0000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09A9ADBF0BBE9B0BBE90BBCA909A009A9AC9A0BEBA0F0009A0BEBBE09F0009A90BABE090B0B0BABBCB090B000090009090900A090000900009000000090000000009009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9A9F0A00ABE9B0FA09ABC0B9E0A9F9ADA9A9E9D00C90A9000F0BDA0DA0FBBE9E09F9FA0B0E0BCBCBAD0A009000000000000009000000090000000000000000000900000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA9A0B9DA9CB9EB0BDAD0BBC0B09000A90BF0BAA9A9A9009A90BAAFFABBA0A9A9A0A0BDAC9B09A9BE9A909000000000000009000900900000090000000000000000000900FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9ADA0A09AB0A0BE0B0A9E0B00B0B0B0A900F09E09000B000B0BFF0B0F9F9BE9A9E9BEA9BA0DA9E09E9000000000000000000000000000000000000000000000900000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE09A9BC9A9CBE9E9F0F0B09A9AD00B09C0B0B0BC9AA9A009A9ADABFADAABABCBCB09EB9C009A9A09B0A00000000009000000000000900000000000000000090000000909C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09A9C00A90A09A9A0A0BCBA0D0A0BC9A9A900BE9AC90090BCBFAFABCBADA9BA9A0A9BCAB0F0B090A0090000090900000009000000000090000000009000900000000000BE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFE90A9A90A90B090909A9A0DBA0990B00B9E09F0A9A09A000B0BFDEBE9FBEBEFAD9000B0090A0F0BCB000009000000009000000000000000000000900000000000009000BF0BFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBFFA09000090090000000909A009A0A00B00A90A0F009A09A9ADA0BADBB0A9F09B9A0F0BADB0A990BCB0000900000000000000000000000000009000000000000000000009FE0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA909090009000000000000000009A00909A09BC0BFF09AC090090BFF0FAE0BF9ABBEE0B0A9F00A900A090090900000090000000000000000000000000000000000009000900BF09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF909090000000000000000000000900090BF009E00B0BA0A90B0A9AFA9ABA9BFABAD00BFF0900BA9DA0F0B0B00000090900000000000000000000000000000000900000000009A9ED0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000090000000000000900000009000000B0B0B0BECBDA0090CB9EBFF0F009CBBAB0BEBE909E0A9009000B00090000000900000000000000000000000000000000000090000900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00909000000000900000000000000000009009009A09BF0A090A0B0ABBEBEFAFEBBCB9ADAF00A9AF090A9A9E9009000900000000000000000000000000000000000000900000090009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09000000900000000000000000000000000000A9A009FEA9BCA9090BB0FFFFABF0BCBEAB0BFEB09E9A0A90009000009000000000000000000000000000000000000000000090090090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000000000000000000000000090000000009000909AF0DA090E0F0FFFEBEDFA9EBA99AF0BF09ABE09009A9A09090000000000000000000000000000000090000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00009009000000900000000900000000000000009A00BF0BA09A99BBFAABFFBB0BE9BCBA90F0FE090BCA9A0009A000000000000000000000000000090000000000900900000000090D0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9000000000090000000000000000000000000000090A0BC9AD00A000BFBCBCBEF0BAFBCBAB0BABCBAF09009A9A0900900000000000000090000000000000000000000000000000900A9FEFFFFFFFFFFFFFFCBF9FF9FFFFFFFFD99F9FFFFFFFF000900090000000000000900000000000000000000009BEBE90A909E9F0BBFFA9EBC9B0B0BCF09EF0BC9A09A00090000000000000000000000090000000000000000000000090090A99EBFFFFFFFEF9A9BF9FF9F9F0F0BDBFFFB0FB9F09FFFFE00000900000000000000000000000000000000000090BAE900A90BABBAFAFEA9EB0BAAF0FEB00AFBE9A0900909A00000000000000000000000000000000000000000000000000009C0A9FFFFFFFB9DBDFDBFDBFBF9FBDBE999DDB9CB99A990FF090000900000000000000000000000000000000900009FBAF09A09E9E9E90BCB0E9EBDAB0DAF9CAFFE9E0B0A0090909000000000000000000000000000000000000000009000000B0900BFFFE90DB0FBFFDBFDF9FBD9F9BFFABDBFBDBDB0F90900000009090009000900090000000009000000000000A9E90A09F0BFAFAFEBBCB9E9EBF0BAF0AB9BAFA9A0909A00000000000000000000000000000000000000000000000000000000BCBFC9909B0FBDBFFF9FBE9DAF9FDB9DBBDBDBCBF99ADA00000000000000000000000000000000000000000009BEFA09A00BF0BE9A9E0B0A9A9E0B009EF0E0FE9AC90A000900000900000000000000009000000000000000000000000000900B09009ACBF0F9DBDAF9FBDFFBF9ADB9FFBCBDBDBF09F0909090000000000000000000000000000000000000009A9A909AD0B00ADCB0F0900909A9A9E0A90BFFA9EB0A090900090000000090009000000000000000000000000000000009000909009A09909F9FBFFF9F9FF99F9FDF9FB9DBDA9B99DB0B9000000000000000000000000000009000000000000000AF0E90ABCBFBEB0E9A0B00A000900C90000BEF0F9ADA000900000000000000000000000000000090000000000000000000000000090A9F09B9F9BFBFF9BFF9FBBDBDFFB9F9F9FABD9CB0909090000000000000000000000000000000000000909A90A90DA009BCBB0F00F090900B0000B0009AF0AF009A9000000000000000000009000000000000000000900000000000090009009009BFBCBFDBDF9FCB9FBDF9FB9ADF9F9B0D9A9B90000000909009000009009009000000000000009000009E0B0F0A9FAEAB0CB0B000000000900D0009009AF00B000009090000900090090000000000000000000000000090000000000900090BDBC99FBDBFBF9FB9EF9FBFF0F9F0F9ADF9BBD9E9A90900000000000000000000000000000000000000A9A0BCB0ADA009F0EB0009A900B009AC000000000009A0F0090000000000000000000000000009000000000000000000009000000900090B9AFBDBFFDBF9FDBDFF9F9FFDBF9BDB9BD0B09000000900000000000000000000000000009000000900090009009ADA0B90BCB000090900009C0D00000000090B0009000090000000000000000090000000000000000000000000000000090B9CB9DBFF99F9FB9F9B9FFFB9BF9BE9F0BCBD0B9B9090900900000000000000000000000000000000000B0A9A9A9A09A9E0AD0B09009ACA00000090090000009000090000000009000000000000900000000000000000000000000000000090909B9EBDB9FBFFBCFBFFFBDBDFF9EF9F9FDBB9BD0D0B000000009000090000000000000000000000009090090000009A090900A000A9A90909000000C00090000000000000000000090000090000000000009000000900000000000000900900A9DA9F9F9FF0F9BDB9F9BDBEBF9BD9B9E9B9C99A9A09090900000000000000000000000000000090000A00B00B09A9A09A0A9A9090900090000090090900000000009000009000000000900009000000000000000000000900000000000000099A99F9B0F9BF9FDB9F9FFF9F9FFFFBEDBCF9B0F9C9B09A00090000900000009000900000090000000000900090A00090009000000009090B090000000E000000000000000000900900900000000000000900000000000000000000900000000009E9ADBBDF9B9B9F0BF9B9FBF9B99F9F9B9EDBCB909C090900000000000090000000000900000000009009A0009090009000900909A00A0000000900009000000000000900000000090000900009000000000000000000000000000000000909AD9BDB9DB0F9E9F9F9BDF9BDBFDEF9F0FDB9B9B9CB0B9090090900000000000000000000000000000000A000A0000000000000000009090900900C0D09C09000000000000900000000009000900000000000900000000000000000000000000099BDB9EB9F9F9B0B9F9FB0F9F0BB9ADB9B09E9E9A9090A00900000009000000000000900000000000009009090000000000000900090000009A090A00C0000009000090000000009000000000000009009000000000000000000000000090099A9A9E99DB9B9BDBDB9E99F9A9BDBDF9AFDF9B99C9B0090900000900000000000000000000000000090009000000900000000000090000909A000C0D0D0F0909000900000000090000090000000009000000009000000000900000000090000009DB99FB90DADA9B9F9FB9B9F9BDBA9F99A9EDB0B0D9A900900900000000009000000000000000000000000900900000000090000009090009090900CAC0C0000000000000000000000000000000000000000000000000000000000000000009A9A9F990F9B99BD0B9090D0F9FCBD9F0BE9F990F9B0A9CA90000000000000000090000000009000000000000000000000000000090000009000E0C0C9C909000900009000900000000000009000000000000000000000000000900000000000909D9ADAF9AD0BD0BD0BDB9F9A9B90B0DF990BAF090D9009009000000009000000000909000000000000009000000000000000000000090B00F0D009A000C090000000009000009000000000009009000000900000000090000000000000000909A9BDB99099F0B90BD9B0B0BD0F9F9B9ADABD99BDA9A9009000090000000000000000000000000000000000000900900000000090090000900DE900D0D000000090090000000000009000000000000000000000090000000000000009000000BC9BC9B0BDA9090F90B0C9D90B90B09CB99D0B09CB90D0B00909000000000000000000000000000000000000090000000000000000000009ADAD00C000009C00000000000090000090000900000000000000000000000000000000000000000909B0B9C99090B9F9AB9F9B0BBD0B9F9B90B0F0F0B0F0B0909000000000000000000000000000900000000000000000000000000000000900C0DAD090C90C00000000000000009090000000000900000090000900000000000000000000000090B90D9A9ACB0BD0909C90B0BD90BD00A9CBDA999099909000000000090000000000000000900000000000000000000000000000000000000009ECF0E00C09000090090000900000000900900000000900000000000000000000000000000090090F9BC90999D9A9ADA9A90D09A9A9FBD0B909F0AD00BCB09090909000000009000090000000000000000000000000000000000000000000090009C90D0900009000000090000000000000000900090000000000000000900000000000000000009090B0B0B00B90999909A9B09C9090BD0F9A9990B00909A00000000000000000000000000000000000000000000000000000000000000000009E9C00CAC09C00000000000000090000900900000000090009000900000000000900000900000B0B090099C9BD0F0B0F9F990DB9BDA909B90D0F09090A9C9090000000000000000000000000000000000000000000000000000000090000000900C09E9090000090900000900900000000900900900900000000000000000000000000000000990D009BDA9A90B9BDB90B0F9B9ADADB9E9EB9B09ADA990B0000900900000000000000000000000000000000000009000000000000000000000000FC000C0C0090C0A009000000000900000000000000000000000000090000000000900000090090B9090999B9C999CBD99BC9F9BDBDE909DADA99090090090000000090000000000000000000009000000000900000900009000000090090000909C9090090009C0D000000000900000009009090909009000900000000000000000000000090B009BE90F0DB9BE9B9ADF9B9BDBBDBFFF0B9BDAC9A9A090090090000000000000000000000000000000000000000000000000900000000009000C00AC0C000C9009000000000000000000009000000000000000000000000000000000000009A099B099B9B90F99B9F9B9BDBDBDFFF9F0FDADA99A9C900B0000000000000000000000000000000000000900000000000000000009000000000909C9C9A90C9000C0E90090000900009000000009000009000000000000000000000000000090990B0D0BC9F9F99BDF9BDFDB9BFFFBDFFFB099F9AD90B09009009000000000000000000000900900000000000000000000900090000090909000CCAC00C00000CB0D0C00000000009000900000000900000000000000000009000000090009A90E909B999B09BDBDB9F9BBFFDF9FDFBF9FDFCB0F90A9000900000009000000000000000000000000000000000000000900000009090000000090B0C9E90D0D0B0C0CBC900090000000000090090000900900900009009000000000000000009099BD09FBDF9BDB9BDB9FD99BFFFFFFDFFFBFBDB0F99E9A909090000000000000000000000000000000000000000000000000000000909009A000C9F0C0CAC00C09C9C0E090000090009000000000900000000000000000000000000000000909F09A9B09B9F9F9F9B9DBBFFFDBFDBFFFFBDFDEDB9E9909C00000900000090000000000000000000000000000000000000009000000000000090C9CC0C90909C9CE9E0C9C00009000900009009A0000000000000000000000000000000000900B09BDBD9F0F9FB9BDBDBFD9BDBDFFFFF9FDFFBDB0F9BCB0B0090000000000000000000000000000000000000000000000000000009000090900CBCA0F0CAC0CAC90C9CBC9E9000000009000000090090900090000000000000009009000000B9DB09B09B99B9D9F9BDB99BFDBFBFFFFFFFBF9FE9F0F0BC9090009000000000000000000000000000000000000000000000000090000090000909C0DC0F090D090E9CAC0C0C0C900900000009000000000000000000000090000000000000090B09F0DBF0BD0BB99F9BDBD9BBDBDBF0DB99FFFDBFF9BD9B0BC9000000900000000000000000000900000000000009000000000000000000900000FC0FC0C0C0E0C9C0D0F09C9A0000000090000900090000000009000000000000000000009A999B9B9099DB9D9E90BDA9B9D99F9E9FBDFFF9FBFDBFCBADBC9A09000000000000000000000000000000000000000000000000000009000000000C0DEC0DAD009C9CA9E0C0CA0C09000900009000000009000000000000090000000000000909ADAD9E9F9FB0B9B99B909909A9B0999BDBBBDBFF9E9E9BD909B090000000000000000000000000000000090000000000000000900000090000909C9E90FC0E9EC0E9C09C9009C9CAD000A00009000090009000000009000090000000000000BD9B90B9B9B09DBE9DBCBB90F990D9F0F9FDFDBF9FFBF9F9EB9FC9E0000000000000090000000000000000000000000000000900000000000000000BCCDC0F0D0DAD0E9CA0C9C0009CAD0909000090900000000000000000000000000090000D0B09F9DA99BDB999B0999CBB9EBB0B9B9E9BFF9FBDF9FDAD9E9AB099900000000000000000000000000090000000000000000000000000000900000C9ACBCCADEADE0D0AD0AC00D0C0D0A000090000A000000000000000000000000000000090B9F9A9B9F0DB9ADBC9BCB99D099D9F9F9BF9F9FFDFB9EBDBBDBD9FCA0000900000000000000090000000000000000000000000000009000000009090EDCCCBDE0D0C9CAD0CD0BC00E9E0D009A00000909000000000000000000000090000090B9DB9DBDA99B9F9B99BF9B9F0BDA9B09FFFDFFFFFFBDFF9FBCBDBF0B90D0000000000000000000090090000000000000000000000000009000000000CD0BB0CE0FCADAD00F000C0C90C9E0F000900900000000900000000000000000000000BD9EB90B09B9F9F09F9F999D099999999F99FFFFFF9FFFBDB9F9FBC9F9E900000000090000000000000009000000000000000000000000000000000000DACCC9E9C0FC0CAD00DAD09ACBC0D00BC00B00090009000000000000900000000000000B99B9F9BD9F9B9F9BB9F9A9B9BD9BDF99F99FFFFFFFDFF0F09BCBF9CBDA900000000000000000000000000009000000009000000000000000000000090DAD9E9CAD0BCF0DAD0C0C0C90CB0E9C9A000900009000000000000000000000000009BDAD9E9BF0B0BDB9BDD99999D9D9F999DB9DBDFFFFFDFF9F9BFFBDBFBF0F0F090000000000000000000000000000000000000000000000000000000090C0DCC0E0D0EC90CAC0E0DAC90E90C9C0E90900A0900000000000000000000900000099E9B9B99F99BDB9BDB9B99F9990909999099FDFDFFFFFB9FB9F9BDBF0F9F990000000000000000000000090000000090000000000000000000090009000CBC0AD0F0D09ECBCBC9C0DA0D0EDA0BC900A009000009000000000000000000000090B9F9FDBF9BF99DBDA99CB09999B9B09BF99999FFFDFFDFD90B9FFBDF9DBDBE90000000000000000000000000000000000000000000000000000000000009CF09EC0E0C090C9CA0F0CD0E90CDC00E9009000B090000000000090000000000000BDA9F9BDBD9BE999BDF9999900B9F9BFFFF099099DFDFBFBDBDB9FFBFFBDADF0F0900000000000000000000000000000000000000000000000000000000900CDC9E9C90F0E9E0DC0CB0C9CE9A9AD00F00A9000000000000000000000000000909F9F9AF9BFBD9BE9B9909090B9BFBFFFBFFFFFF9D9B9FD90B90BFFDFDBFFFFBF0000000000000000000000000900000000000000000000000000000000000F0C9E9E0AC0C9C0F0909CC9E090C0D00F0090009000000000000000000000000009F99BDF99F9DBAD99CB090B9F9FFFFFBFFFFFFFFF00999BFBD9F9FFFFFFDBDFC9C90000000000000000000090000000000000000000000000009000000900D0CBECCD0D09E0F0C0CAC0BC0F0E9E0BC0900090009090000000000000000000009A9AF9B9BF9BBD9B9B909009BFF9FFFF9FFFFBFFFFF0000999A99BDBFBF9FFFFFFB0A000000009000000090000000000000000000000000000000000900000EDFC9E9AC0DA9C0F0F009C0BC0D009C0BCE9000090000000000000000000000000BDBDBDBF9BFDFBD0F090009BDBF9BFBC0BDBD09B90B909000990BDBDFDFFFFF9FDF99000000000000000000000000000900090009000090090000090000090000FE9EC9E0CCBDCD00DA9CC9E0F0E0FC090090000900009000000000000000000DB99BDB99F9B9DB9090000B090090909990909909D0000009A09F9BFFFBFFDBFFE9E0000000000000000000000000000000000000009000000000000009000DED09CC9E0D0BCCA0AD0CCE9A0D0C9D009E0000090000000000000000000000099A9FBDB9DA9B9FB009000909909B90999B0F9BDEF90999F9A9C9999BF9BDFDBFFF9F090000000000000000000000000000000000000000000000000009A000DAD0FECBC9CADE0BCDCADA90CDCADACACFC90009000090000000000000000000009F909F9FBDBDF9DB90B9F090909099090999099999F9FFFFDB09F0BDBFDFBBF9FDFBDA900009000000009000000090000000000000000000000000900009000C0F00BCACBC0DCCB0D00CE9A0F0CD0D00E0900009000000000000000000000000B9FB99A99B9B9B99E90B9F9BCB9DA9DB9FDBDF9FFFFFFF9FFDB09BDBDBB9FDDBFBEDBD00000000000000000009000009009000000000000000900000900009A9DCFDC9C9C0F0E9CCA0D09CC90CB0F0FC900000000900000000000000000000090F9DBD9BD9F0F9BC9BD9B9DB99F999B9F9BDBFFBFDFFFFFF9A9DB099BDDB9FBFDFFDBCB0000000000000000000000000000090000000000000000900000090CCAD0CA0F0CBC0D0E90DA0CA9ACF0CC0C000090900000009000000000009BF0099BB9B9BFDBB9B9B99B90BC9B99F9DBF9F9BDBF9DF9FFFF9F0F99B9DBBDABFDBDFBFFFE90090000000000000000000000009000000000090000000000900000C9AD0F0DC0F0C9CAD0CA09C90CD00DA9EDE90000000900000000000000000BF000BD0F0F09B9C9F9DA90BD99A9F9B9B99B9DB999BBFFFFDFF9F9F0D0B9DB9D9FBFD9FDBDF900000000000000000000900000000000090000009000900000009CBCDED000F00F0E9CAD0D0E0E9A0F0CC090C00090090000000000000000000909090B99B9BD9BB99A9D9F9B09D09BC99F9DA90F9D09B9FDBDF99A99B99F9DBF9DFBFFFFFBEDA900000009000009000000000000000000000000009000000000C0C0E9EFC90C90C9C0D00A0909C0D0DA9ECE90000000000000000000000000000000BDBD9F9B0D9F9DB9B909BF9BD09B0B9B99F90B9FDFBDFA9F9F9F0DB9B9F9FFBDFFFFDFDB00090000000000000000000900900900000090000000000090090D0D9C9C0AC9ACB0E90CBC9CACADACE9CC900009000000090000000000000000909B99CB9AD9F9F09B9AD09BD9090B999D99CB09B9FFFFDBFDF0BD09BB9F9FBDFFDFFFFDFFED0900000000000000000000000000000000000000000009000000C0F0CADECD0C900D00F00CA909C0D09CB0C909000900000000000000000000000009CBB9F9DB9B99F9D99B909B9B99E99A9B9090D9BD9FFDBDBDB9B99DB9F9DBDFFFFFFFFDBBC00900000000000000009000000900000900000090000009009E9C0FCDA9AC9E0FC0F0CF09CEDA9E0DE0CDA00000000000000009000009000009090F9DFF9B99F9F99B9BD9F909D9F99A99009B090B0B90FBDF9BD90F9BDBDBFFFFFFFFFFFFDE9900000000000000000000000000009000009000000900000000C9C0BCFCD0E9C09E0DA0DE0900C9CA9CB09000090000090000000000000000000090BB99BDBF9F99F9BDA99090B0990900990990BC90099DB9BDB0999F9F9F9FDFFFFFFFFDFBCA0909000000000009000000090090000000000000000090090D0E9CC9CBCAD0E9E0DACDE0DACAD0E9C0C000900000000000000000000000000909A9BD9BDBD9BDFBDBDB9DA9B909B09C90B099CB99F0909B9BC909B9F9B9FBFFFFFFFFFFFFED0900000000009000000000000000000900000009000009009AC0C90C9EBC0DAC9C0F0C9E0F0C9DAD0CADA90000000900000000900000000000000090DBF9F9FBDB9DBDBDB9D09AD909B00D9B0B99F999BDFFD9B9B99F99FFFDFFFFFFFFFFFFDFF00090000000000000000000000900000000000000090000C0DCBCDACDCF9C9ACBC0F0E9C0F0AC0AD0D0C0090009000000000000000000000000009B99B9FBDFBDBF9BDBDBBD990B0999B09D99B99BDFFFFFF0D09DB9F99FFFFFFFFFFFFFFFFCDA90000000000000000000000000009000000000090000909C09C0CDA9E0CA0CD09E0D0CBC0DC9ED0E0F090000900000000000000009000000090909FFF9BDBDBDBDBDB9F9D9A999099BD9B9BDDF9FFFFFFFC9B9F9BDBFFFDFFFFFFFFFFFFFFFB00000900000000000000000000000000000900000009000A9EC9EBCDE9F09C9A0E0DACBC0DA9AC0F0DC00009000000000000000000000000900009BF9BDF9FBDBDBDBDF9F9B9DB099AD9BDBF9FBFFFFFFFFDB9DB9F9BDBDFFFFFFFFFFFFFFD90D0090000900000000009000000000009000000000000000DCDAF0D0F0FCC0AC0D0BC90C9E0CCDAD0E9AD090A00009009000000000000000000009A99F9F9FBDB9BDBDB9FBF9F90B0999BDBD9BBDFFFFFFFF0D9B9FFFFFFFBFFFFFFFFFFFFFFFF00000000000000000000000000009000000000000000009ADADC9EF0FCB0D09E0D0ED0F090B00DADCE0C0A09009000000000000000000000000909F9BFBF9DBDF9F9BDF9D9F9BD990F90BDBD9FBFFFFFFFF9BDF9BDBDF9FDFFFFFFFFFFFFFFCBF000000000000009000000000090000000000009000000000DAFE9EF0FE000C0DAD00E0CAC0DA0D0BCDE909000000000000900000000000000000B0BD9F9FBDB9B9F9F9FBF9BDB9E999BDB9BD99FFFFFFFD9BBBFDFFFBFFFFFFFFFFFFFFFFFBD0900000000000000000000000000009000000000000000009ED0FF0FFAD0C9ADAC0DE9C9C9A0C9CACDA9C000090000000000000000000900900099F9FFF9F9F9F9F9BDBF9DBDBDB99A9D99F9B9FFFFFFFFFFDFDFFBFDFDBDBDFFFFFFFFFFFDF9E00090000000000000000000000000000900000000900900CB0FE0FF0FF90C00D0F00C0A00D0BCADF0CF09090000090000000000000000000009A99F99FBDBDBDBFDB9F9FBDB9BDBD9B0FB9DBDBDFFFFFFFFFFFBFDFBFFFFFFFFFFFFFFFFFFDE9000000000009000000000000000000000000000000000909CFF9FDAFDAC90E9E00DA0D0C9AC09C00F0CE00000090000090000900000000000009A9FFBDF9F9FDFDF9F9F9BDBF9B9BF999DBD9BDBFFFFFFFFFFFDFFFDF9F99FBDFFFFFFFFFFFF0900000000000000090000000909000000000000000090CAC9CAFAFDAFF00C9C9EDAC90CB0C9ACBCFCE90900090000090000000000000000000009F9FDFBF9B9BD9FB9F9F9BD9F9F90BDB99B9DBDFFFFFFFFFDFFFFFF9F9FFBDFFFFFFFFFFFDE90000000000000000000000000000000000000000000009C9EBDCF0BFCB0E9E0E9C0D0E90C9AC9CBC090000900000000000000000900000000099BDBDBBDDBDBDBFD9B9B99F9F9B99F9A99F9F9BFFFFFFFFFFFFFB9F9F9F9BDBFBFDFFFFFFFE9000000009090000000000900000000000000000009090DE9ECD0EBCFCBFD00D0D0ADAD00DA0D0E9CADE90000000000000000000000000090090009BDBFDBBDBDBDB9FDDBDB99BF9DF9F9DB999F9BFFFFFFFFFFDEDF0F9FBFFFDFDFFFFFFFF9F000000090000000000000000900000900000000000000000C90BC9CDABCF0CF0ACD0C0ECD0DAC9CE9C0000900000090000009000000000000000090BBDBFDBF9F9BDA9BBDA9F099A9B09B99F9F9FDFFFFFFFFFCB9B9F9F9DFFFFBFFFFFBFFFE9090090000000000000009000000900000000000090000090FCDCBCBCDCBC090DC9ADAD09AC0C9E0DCBDE900009000000000000000000000000000009FFBDBDBBDBDB9D0909D09E9D99F9D9F9BDB9BFFFFFFF99BDBC9090B90B9BDFFDFFFFFFD000000000000000000000000000000000000090000009000C0000C0C9E9EFCAC0A0CC0CBCC9E9E0D0AC00000000000000000000000000000000000909B9F9B9BDB9BD9A9A990B0990B0B9AB9BDBDFFFFFFDD0BC990A90B090B9FEFF9FBFDFA9000000000000000000000000000000000000000000000000090DAD0DAD0FC99C9C9CB0F0C0BC0C0DACD0FC9090000000090000000000000000900000909FCBF9F90F9A99D99A9090A90909D0D9BDBF9FFFFEB909A09909C99F9F9F9FFFDBFBDB00090000000000090000000000900000000000000900000900C0C00CDAC9EF0CAC00C90DAC0BCBC0DACD00E000900090000090000000900000000000090BBDBCBFB9D9B0B09099A9909090B9B9DBDBFFFFFD0E909000909A09B0FDFBDEBCBDBC09000000900000000000000090000000000000000000000000900DA0CDAD0FF0D09E9CA0D0D0D0DE0D9ADF090000900000000000000000000000000090099B9B99DB9A9D090B009000A909099FBFBDFFFFDA9909090B9A999CDFBF0F9999B9A0900000000000000000009000000000000000000000009000000C90CD00DE9EC0CAC9C0CDACACACA0D0ECC000009000000000000000000000000000000090B9F0B0B0BD909BC90BD09990B090F99BDFFFFDF090B009090000AFB0D099A09ADBC900000000000000000000000000900000000009000000000000000C90EDE9ED0F0D00ADA0C9C9C9CDAC9E9ED09A0000090000000000000000000000000000909D090900B0F00090BFA00909A99BFDBFFFFE99F00090F0009090DF000099F9B0B0000090000000090000000000000009090000000900000000909C90CC9C0DEBD0CAC9C0D09AC0FCBCDAC9E9CA0D09000000090009000000000090000090090B0B90909090B0900009DF00909099BBDBFFF9E099090BC9000000A9009B090F0D0900000000000000000900000900000000009000000009090C0000C9A0CBCBCDCAD09C09A0E09E00C0ADF0CCB0DA000900909000000000000000000000000000990B0B000BC0000F0BE009A909A9F9FFFFFF99A09009A00909090009E909B90B000000000000000000000000000000000000009000090000C90F0D0C0D0CDCBE09C0E0BC0D0D0C9EDADC0EDBCDE090B0C9A000000000000000000000000000909AD090900900909A090990090B9DBBDBFFF9E009009000000000009E909E9CB009000000000009000000000000009090A90900000900000DA0C0C000D0CBCBED0CBC9C0BC0CA9E090DCAFDAC0E9E000AB0C0000000000000000000000000000909A90099C000000900000900099B9FFBF9FF90909009009000009FE90A99A90900090000000000000000000900000009000000000000090009009E9C0E9CBC9FE9CAC9C0DA9C09CECA9C0EDBE9C9F0DDEB090000000000000000000000000000909ADB0B09090000099B009090F9B9F9FFBDF9CA090090009C9FBD00990BCB009000000090000000000009000900000009009009000000090C9C00C9C0C9CF0F90D0DA9CADC0FCA90DCBC9E0DE9ECBFAFC000090000000000000000000000000090909009BDAD9CB9A0009A09B99FFBFF9F0B9B0900909B0B9A0009BCBF0909000000000000000000000000000009000000000900090000C00009C000DACBCFCCACAC0CE9CAFC09CFCAC9ECDE9ECBDAFC090A000000090000000000000900000909A90B09009A0B000909009B09FB99F9FF9F00900900000900909A09009000000000000000000000009000000000009000900000900909090D0C090D0C9CBCB0D0DAD09CAD0ADE009CBED0F0EDBEFFF900D9C90000000000000000000000000090990D9E0909900900909909DB99FBFF9F90DB0090909090090B09090900000000090000000090000000000090000000900090000000C00C000900E0DACF0FE0E9C0ADAD0FCFADEDE9C9ADAF9EDFBEFEF0A9A009000000000000000000000000000A9A990B000990900000B090F99F9B9E9B0900000009090090000000000000000000009000000900000000000090000000009009090D09C0C0AD0D0D0DE9FC9CADCC00E0F0DADACADEFFDEFBFAFFBDADFED0000000000000000000000009009099090A9090900000900009FB9BF9FFF9F9DAD000000000090909000000090000000000000000000000090000090009090900000000E0C00909C000C0F0DE99CAD00BCF0D0FEF0E9DEBEBEBFEFFFFFEDFADA09A09000000000000000000000000000909090000090000999B999F9FBF9DA9B99A90900000000000000000000009000090000000000009000090000900000000000009C909C00C09CF0F0DE9EE9C0FCC90DAD0D0ED0E9FDFFFFBFFFEFFADFAD009000000090000000000000000909B0009000900009090BE9DADB9F9F9FB9F0F09000090090000000000000000000000000090009009000000000B00900090090009C000C00D090C00D0CF0FFCBED0BCE0C0ADADBEDE0CBEFFEFFEFFBFFEBDA0009009000000000000000000000909B9A09000090CA9C9D9B9B9F9FBDF9F9DB9F9BD9F090090000000000000000009000000000000000000900D00D00A90000009009CD09C00C0C9C0C9E0F0FADCBEC90DADC0CAC9ADCBCBFBFFFFFFEFFBFE0D000A900000000000000000000000909C99A9DBDA999B9FB9FDF9BDBDBFF9BBDB9E90B00090000000000900900000000000000000000000000C9A9FA9ED009090000C0A00C09C00B00BCE9CDADDFAFC9EDE0C9E9C9EDCBCFDFEFFFFBFFFFEFE9000900000000000000009000009090B9B9B9DB9BF9FBDFB9DB9B9FBFFFF9FFDBDF9B9009000900900000000000000000009000000000009000FADFCBDE90F000090090D0D00C090C0DC09CFADFEADBFE9E9CBC0E9E9EADC9AFFFEFFEFFFFFF9E90009A090000000000000000000009099ADB09F99BF9FBDFFBFDF9F9F9FFF9BF0B9FC9009000000090000000000000000000009000000000900DEBFEFBEF0DCB0000C0000D090C09C00FCB0DFA9DECBFEBEDCBC90C0DCACFC9FFFFFFFFEBFEFEFE9009000000000000000000009090B0D9BDBDBF9DBF9FB9BD9FBFBF9FB9FF9F9F09B00000000000000000000000000000009000000090000090DFBFFE9EDACC9CA909C000C090C00D00DCF0DFCADBF0FFFABC0EDADA9CBCBEBFFFFFFFFFFFBFC9000009009000000000000000000909B90B9B99FBD9FBDFFBFBDBDBDBCB9DA9BDB0009000000000000000000009009000000000000000000000FAFFFBFDAD0F0C9C0C09C900C09CDACD0E9EBC9C9ECFFF0FCDE90CC9EFC9EDFEFFEFFEFFFFFCB000909A00000090000000900000909B09F9FF9FB9FBDBDB99F9FDFFBDBD9A9D090909000000000000000000000000009000000000900009000DBDFAFCFADAD0C9C0C90C000D09C000DAC9CBCFCBCF9E9EF0FA9EDEBCC0BCDADBFFFFFFFFFEFBC0900000000000000090000000090909DA9B99B9DBDFBDBDBF9F9B9BDBDBC9B09A90000009009000000900009000000000000000900009000090FAFFBF0FC0C9CAC90C090D000CA0DC0DADEDF0EDACBCF9EFDECBC9CBDCCADCADFBFFFFFEFFFEF00009009000000000000000000009A999F0F9FBBDB9FB9BDB9F9F9CB9A9B00909090000000000000900000000000000000000900000000C0000DFFFFFF0FDE0DC0CB0C000D0D0D00F0CD0F0FFFADFCF0F9FAFBCFACCADADADCFAFFFEFBFFFFFF0F09009000900000000000000000009A99B9B0DDBDBDBDBF9DB9EB99F9D0090B000000000000000000000000000000900900000009000900909EBFFEBCF0C0D009C0C90D000C00C9C9CAD0F0FFFFAFBFEF0FFCF0CDADAD0C0DADFEFFFFFBEFBEF0000000000000900000000000090909DA9DBDBBB9B9F9F99BBD99DB09B0909009090090000000000009000000090000000000000009000000CBFFFBDF0DAD0E9C009C00C0D00D0C0CADCF0FFFBFFFEFBFFEBE9EF0D0DE0F9EDADBFFFEFFFFFFDF0909009000000000000000090009A9BDB9F9F9DBDBDB9DBC99A9B0F09A000900000000000000900000000090000000000090090000009000BDFFFFEBEDC0D0C09C00D09E09E0DAD0DADADF0FEFFFFFEFBDF9E9EBCE0DCCC00DECBFFFFFFFFFAFC0A090000000000000000000000090090B9B9BBDB9BDBB9B9BD0990909090090000000000090000000000000000090000000000000000090CBFFFFFCBCBC0D0C09C00E09C0D00D0E0D0F0FFFFFEBFFDFEEBEFFDEDBDADA9FCAD9FCBFFEFFEFFF090000000000000000900000000909B9BDBDBC9B9F9BD0F9F9A9F09A900090009000900000000090000000000000000090000009009000009EFFFFFBCBCCBC0BCC09C9C00D0CD0C9DE9CF0FFFBFFDAFADBDFBFAFACECADCC0D0ECBEFFBFFFFADAC090009000000000000000009009B0D099B99BDB9BE9B9B0D9900900909090000000000000000000000000009000000000000000B009CC9FFFFEFBCFCC90C9C0A9C000CD00F00FCE0DE9FC9EFCBEDADAFAFEFFFFBDBDADADE9C9CD0FFFFFFFEF9C00900000000000000000000090099BCBDBBDBDAD99BC99A009B09000000000000000000000000000090000000900000090009000000BCFBFFBFEF9E9ED0C0D0C09CD0A9C0CD0D0DE9EFBE9EBC9EDEDFFFBFFFFFEFEDADADE9E0FC9EFBEFFFAFBC00000000000000000000000090A09B09C9B9B9BBD9BC999A090090900090000000000000000000000000000000900000000000900009EFFFFFBFE9C00D0C0C9C00AD0C9C9ACADA9E9CFCFC9EF0FBFAFFFEBFEFFBFFFFFE9EDBCBCBDFFFFBFFCA9000009000000000000000090999009B9BC9BD0D0B90B00900090000900009000090090009000900000090000000900000909000900CBFFFFFFCBEDED0E90D0AD0D0C9CACD0DCDE9EFB0F0FE9FBEFFFAFFFFFBFFFAFFAFFFBEDF0FEFBFEFEDA90090000000000000000090000000A990D09BD9B9B9A900B09090090000000009000000000000000000000000000000000900000000DBFFFFFFEBF0D00D0CC00D0C0C9E0C9C9E9E9EDBCF0F9FFEFFFBFFFFFFFFEFFFFFFFBEFFBEFDBEFFFFBFFC0000000000009000000000009090900B9B099A909C9090900000000090090000000000000000000900900009009000900000000900ADBFFFFFFFCF0CF0D09AD0D0F0C9C9CADCF0DEAFFFFEFAF9FAFEFFFFFFFFFFFFFFFFFFFFFFBEFFBFFFEFBF090000090000000000000000000909009CB0D9BDA99A090090090090000000000000000900000000000090000000000000000900090EFFFFFFFBF0F0C0CC0C0C0C0D0C9E9C0E9EBDF0FFAFBFFEFFFBFFEFBEFFFFBFEFFEFFFEFFFFBFFEFFFBCF00090000000000000000000009000090B099A9C9900900090090000000000009000900000009000000000090090090009000900090DBFFFFFFFFFE9E9CB0D0DAD0D0E9C0C9E9C9CE9FFFDFFCFBFFFFFFFFFFFFFEFFFBFFFFBFFEFFFEFFFBFCFB0900000000000000000000000000090090B090B09A9009000000000090000000000000000000090009000000000000900090000B0EFFFFFFFFFFE9CD0D0C0C0D0E0C9C0CDADCFEFBFFAAF0FBEFFAFFFFFFFFFBFFFFFFFFFFFFFFFFFFFBFEFBFC0A0900000900000000000009000900900909A90B00900090090009000090000000000900000000000000900009000A0090090AD0FDBFFFFFFFFFFFE0C0C9CBC00D0D0D0F0CDA0DADADFFBFEFFBFFFFEBFFFBFFFFFFFFFFFFFFBFFBFFFFFFFEBF09000009000090000000000000000000900090909000900000000000000090009000000090000000000000000009090000000DADAFFFFFFFFFFFFF9F0F0C0C9C90C0CAD0DACDE9CFFAFFEFFBFEFFFFFFFEFFEFFFFBFEFBFFEFFFFEFFFFFFFFFC90090900000000090009000000000900009000090909000900090000000000000000000000090090000000900000000009009AFFFFFFFFFFFFFFFFECD0C9C90CAC9E9C0C0D0F0FBCBDFFFBFFFFFFFBFFFFFFFBFEFFFFFEFBFFEFFFFFEFBFAFCBC0B0000000000000000000000000000000009090000000000000009000000000000000000000000090900000909AC9090009EFFFBFFFFFFFFFFFFE9F00DAC0C9C9C0C0D0F0F0DECBFFAFFFEFFFBFEFFFFFBFFFFBFFFFFFFFFFFBFFFBFFFFFFBE9000B00000900000000000900000000909000000090009000090000000000000000900009000000000000900000900009000BFFFFFFFFFFFFFFFFFC0FC0D0D0C0C9C9CAD0CCFADBFCBFFFFFFFFFFFFFEBFFFFFFFFFFFBFFFFBFFFFFFFFFFFEFF0900090000000000000000000000000000000009000000000000000000000009000000000000009000000000900009000090BDAFFFFFFFFFFFFFFBFC0D0C0CB0CBC0E9C0DA9CDACBFCFFFBFFBEFFBFFFFFEFBEFFFFAFFFFFEFFFFFEFFFAFFBDAC009000900000090000000000009000000000000009000009000000900000900000000900009000000000009009000009000CBFFFFFFFFFFFFFFFEDAD0F0D0C0D0C9C0D0EDCB0FDADBFFFFFFFFFFFFFFFFFFFFFBFFFFFEFBFFFEBFFFFFFFEFFE90900090000000000000000000000000000000000000000000000000000000000000000000000000090009000AC0090B000DBFFFFFFFFFFFFFFFADAD0C0C0C0D0C9C0DAC9CADEDAFFFAFFFAFFFBFEFBFFBFFFFFEFFFFFFFFFFFFFFFFAFFFFFAD00009A00000000000000000000000000000090000000009000000000000000000009000000000009000000090909A000000BCBFFFFFFFFFFFFFFF0DC0D0DAD0CB0CBC0D0E9DCB0FDADFFFFFFFFFFFFFFEFFFFFFFFFFFBFFFFFFFFFBFFFFFFFFEFC00090B09090000000900000000000000000009000000000000900000900000900000009000090000900000000009090900BFFFFFFFFFFFFFFEFF0DAC9C0C9CC9C0D0C9CCADEDAFFAFFFFFFBEFFBFFFFFFEBFFFFBEFFFFFFEBFFFFFFFFEFFFF0B0900000000009000000000900000000000000000900000000000000000090000000009009000000000909000909000000DFFFFFFFFFFFFFFFFBCF0C9E0D0E09C0D0F0E9AD0F0FCBDFFFFFFFFFFFFFFBFFFFFBFFFFFFEFBFFFFFEFFBFFBFFF0FC000909000000000000000000000000000000000000000000000000000000000000000000000000900000009000000B09FBFFFFFFFFFFFFFFFFDE9ED0C9C0C9C0F0C0C9CDCF0FCBFFAFBEFFFFFFFEFFFFFFFFFFFFFBFFFFFFFFFFFFEFFFFEFFBDE9000009000000000000000000000000900000000009000000000090000000009009000000900000000000000009000AFFFFFFFFFFFFFFFFFEF0CD0C9C0D0C0D0C9C9CE0F0FCBF0FFFFFFBFFFBFFFFFEFFFFEFFFFFFFFFFFFFFBFFFFFFFBFEFBCA9090000900000000000000000000900000900000000000000090000900009000000009000000009000B0090900009FFFFFFFFFFFFFFFFFFFBF0ADAC9E0DAC0DAC9E90F0F0FCFF0FFFFFFEFFEFFBFFFBFFFFFBEFFFFFFEBFEFFFFFBFFFFFFBCF9C0A09000000009009000000009000000000009000000090090000000000900000900000000000000900000000099FFFFFFFFFFFFFFFFFFFFFCFD0C9C0D0C9C0D0C0CDC9CF9ADAFFFFFFFFFFFFFFFFFFFBFFFFFBEFBFFFFFFFFFFFFEFFFFBEFBCA909000000900000009000000000000000000000000000000000000000000000000900000009009000909009090FFFFFFFFFFFFFFFFFFFFFEBC0C9CAD0C9C0F0C9CBCADEBCFFFFBFFFBFFBFFBFFFBFFFEFFFFFFFFEFFFFFBFFEFFFFFBEFFFFCF90C009090000000000000000000000000000000000000000009000000900009009000009090090000000000000BFFFFFFFFFFFFFFFFFFFFFBCBCBC9C0D0E9C0D0E9C9DE9CFBCBCFFBEFFFFFFFEFFEFFFFFFBFFFFFFFBFFFFFFBFFFFFFFFFFBFAFB0900000009009000000900000000000900000000090000000000000000000000000900000000009000090909FFFFFFFFFFFFFFFFFFFFFFDFC9C0C9C0D0C9C0D0CAC0DE9CFBFBFFFFFFFEFFFFBFFFBFFBFEFFBFFFFFFFEFFFFFFBFFFFFAFFFFDE9E0909000000000000000000009000000000090900009000000000000090000009000000900900009090000FFFFFFFFFFFFFFFFFFFFFFFFADE9CBC0D00D0E9C9C9CFA9EF0FCFFFFFFBFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFEFFEBFFFEFBEBE09000090000000900000090000000000009000000000000009009000000000000000900000009A9000000FBFFFFFFFFFFFFFFFFFFFFFEBCD0C9C0DACDAC9C0E9ED0DCF0FBFFAFFFFFFFFBFFFFBFEFFFFFFFFFFFFEFFFBFFAFFFFFFFFFFFFFFDBDA09000009000000009000000009000000000000000000000000000000000900009000909090000000090FFFFFFFFFFFFFFFFFFFFFFFDFCADAC9C0D00D0C9C9CCBCEB0FEDADFFFFFFFBFFFFEFFFFFFBFFBFFFFEFFFBFFFFFFFFFFFFFFFFBEFEFADBC09000009000900000000000000090000000000000000000000000000000090000000000C90C9C90CBFFFFFFFFFFFFFFFFFFFFFFFBE9D0D0CBC0D0C9CAD0D0C9CDE9FBFBFFFBEFFFFEFFFFFFFBFEFFFFFFFFBFFFFEFFFFFBFFBFEFBFFFBFBDBCA9000000000000900000000000000000000900090000900000009000900000000090000B000B0A00BFFFFFFFFFFFFFFFFFFFFFFFFEFCED0E9C0DAD0E9C0F0ADE9ADE9EDEFFFFFFEFFFFBFFFFFFFFFEFFFBFFFFBFFFBFFFFFEFFFFFEFFFFFFEFE9009000000000000090090000000000900000000000000900000000000000000900009000BC0009FFFFFFFFFFFFFFFFFFFFFFFFFFF9E90C9C0D0C0C9C0D0CDC9EDE9EFBFBFFFFBFFFFFFFFEBFFFFFBFFFEFFFFEFFFFFEFFFFFFFBFFFEBFEFBF9EF0090000900000000000909090900000000000000000000000000000000900000090090009090AFFFFFFFFFFFFFFFFFFFFFFFFFFFE9CF0C9E0C9C9C0DAC9CBC9E9FF0FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFBFFFBFCFF9EDA0090000000900000000000000000000000000090000000000000009000090000000090000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9CD0C9C0E9CBC0D0E9CFCBC0FFBFFFFFFFFFBFFFFBFFFFAFFFFFFFFFBFFFFFFFFFFFBFFEFFFFFFFFFFBEFFAD090000009000000090000000900090000090000000009009000090000000000909000090FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCF0E9C0D0D0C0D0C9CCBCBCFF0FCBFFFBEFFFFFFEFFFFFFFFFBFEBFFFEFFFFEFBFFFEFFBFFFFFFFEFFAFFDBCF0C000000000000900000090000000090000000000000000000000000090009000009090CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF0C9CAD0E0D0D0ADACBC9CBF0FBFFFFFFFFBEFFFFFFFEFFFFFFFFFFBFFFFBFFFFFFFFFFFFFFEFBFFBFFFBEFBFA909090000090000009000000000000000000000090000000090000000000000090000BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FD00D0C9C0DACD0C9C0FED0FDE9EBFFFFFFFFFBFFFBFFBFFFFFFFFFFFFFFFFFFFFBFFFFFFBFFFFFFFFFFFBCFCBCA000000000000900900900090000000000000000000000000000900090090000090CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC0CF0C9C0D0C90C9CADD09EF0FBFFFFFFFFFFFFFFFFFFFFFFAFFFFFFFBFFFFFFFEFFFFEFFFFFFFFFFEBFFEFFBFCB09090000000000000A000900009000009000000000009000009000000000090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9F0C9E0D00F0CDAC9D0EDE9CFADE9FFFFFBFFBFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFFFFFFEFFFFFEFFBFFCBC9C0009000090009090900000000009000000000090000000000000900909000ACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9E0C9C0DACD0CF00DACE9CBCBE9FBFFFFFFFFFFFEFFFFFFEFFFFFEFBFFFFFFFBFFFFFFFFFBEFFBFFBFFFFBFFEBFFFFBE9009000000000000B00900000000000000900000000009000900000000909BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED0DAC90C90C90CD0C9DE9CF0DFCFBFFFFEFFFEFFFFFFBFFBFFFFFFFFFFFFBFEFFBFEFBFFFFFFFFFFFFFFFFFFFEBCBCBCBC0000000090090000009000000000900000000900900900E0009000000CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBCD0D0ED0CBCC90E9CA0DE9EFAFBDEFFFBFFFBFFBFFBEFFFFFFFFBFFFBFFFFFFFFFFFFFFFFFBFFFFFEFBFFEBFFBFFFFFBE9AD0900900A9009090000090000000000000000000000090900009000DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEDADE0D00D0C90E9C0DCDE9E9CDBCFBFFFFFFFFFFFFFFFFFFFFEFFFFFFFFBFFFFFFFFFFFFFFFFFEFFFFFEFFFFFFFFFBFBFFFF0B009A0990C9AC00090000090000090090090009090000009000C9FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDAD0C9C0DE0D0C9C0DA9E9CBDEBEFBFFFEFFBFFFFFFFFFFFFFFBFFFEBFFEFFFFBFFFFFFFEBFFFFFFFBFFFFFFFFFFAFFFFFBFBFEBC09FACB9E9BC9000900009090000000000900000909000090B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBC9CBC09C0F0C0F0CD0DE9E9F9EDAFFFFFFFEBFFEBFFFBFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFBFFFFFFBFFFFFFBFFBFFFFFBFB9A9DACB9EBFA9E0C0900000000000900000900000090090CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9E0C9CC9C0D0D0DACF0DE9ECFBFFFFFBFFFFFFFFFFFFFEFFFFFBFFFFBFFFFFFFBFFFBFFFEBFFFFFEFFFEFFEBFFFFBFFFFBFFFFEDABDBFEFDADE9FBCA9A909009090009000009000000F0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FC9C9E09C09CBC0D0D0DADE9BCF0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFEFBFFFBFFFFFBFBFDE9FBFBFFBFFCBDAC00A09000000000090009090F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9E0D0C9EC9C0C0F0CBCBCF0FCFBFFFFFFEBFFFFFBFFBFFFBFFAFFFBFFFEFFFFFFFFFEFFFFFFFEFFBFFFFFFFFFFBFFFBFFFFFBFFFFAFBEFFFEDAFEBFFEDBF09C0009A90900000000ACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC0D9E0D009CAD0D0C9CE9E9EDBBCFBFFFFFFFFFAFFFFEFFFFFFFFFFEFBFFFFFFFFFFBFFFFFFFFBFFFFFFFFFFFFFFFBFFFFBFFFFFBFFFFBFBFBFDBDFAFBE9EF0BDAD00C0AD09000D09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE0D0CDCC9C0DAD0F0DCDE9ECFBDEFFFBFFFBFFFFFFFFBFFFFFFFFFFFFFBFEBFFEFFFFFAFFFFFFFEFFFEFFFFFEFBFFBFFFFFFFBFFBFBFFFEFFAFFBFFFFFF0FCADAF0BFCAACC99AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BD0C9A009C09C0D0CDADA9E9F0FBFBFFFFFFFFFFFBFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFBFFFFFFFBFFFBFFFFFFFBFFBFFFBFFFFFFEFBFBFBFFAFFFBEF0FFADBFCBFCBFDFBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FCCCBCDCFC0BCC9CADADADCFDAFDEFFFFFFFEFFBFFEFFFFEFBFFFFFFFFBFFFFFFBFFFBFFFFFFEFFBFFFFFFFEFFBFBFFFFFFBFFFFBFBFBFFEFFEBFFFBFFBFFBCFBCEBDEBCFAFEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9A9C00000DC9AC0D0C9CFADADEBDBFFFBFFFFFFFFFFFFBFFFFFEFFFFEFFFBFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFBFBFFFFFFFFFFFFFFBFBFFFFBFFFFFFADBCFBDEBDFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FCD0DEDCD00CC9CBCBCF0DCBCBDEBFFFFFFFBFFFFBFFFFFFFFFBFFFBFFFFEFFFEFFFFFFFBEFFFFFEFFFEFFFFFFEFFFFFFBFFBFBFFFFBFBFFFFBFFFFFFFFEFFEBEDEBCAFCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E9E0909AC909C90CD0CF0BCBDEBDEBFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFBFFFFFFBFFFFBFFFBFFFFFBFFBFFFFFFFFFBFBFFFFFFFFFFFFFFFFFBE9E9EBCBFDBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F9C0DCCCC9ECCACC9ACF9EDEDE9EBFFFFFBFFFBFFFFFFBFFBFFFFFFFFFFFBFFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFFAFE9EDBCF9EDAFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE9C00B09C909C9BCD90CF09E9FDFBFFFFEFFFFEFBFEFFEFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFFEFBFFFBFBFBFBFFFFFFFFFFFFFFFFFFDBDE9ECBCE9EDADEFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD0FCDCC0CCD0CC00ECF0CFCBCBE9FFFFFFFFFFFFFFFFFFFFFEFFBFFBFEFFFEFFFEFFFEFFEBFFEBFFEFBFEBFFFFBFFFBFFFFFFFFFBFFFFFFFFFFFFFEFBEF0FCBDE9FCBCFBFFEFBEFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBECF00090B09A090DD09CF9CBCFE9FEBFFFBFFBFFFFFFBFFBFFBFFFFFFFFBFFBFFBFFBFFBFFFFFFFFBFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFBFBCF9EDADA0F0ADA9E9ADBEDBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED90DCFCCCCCCDECCACDE9CADCB9EDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFBFFFFBFBFBFBFFFFFFFFFFFFBFEFFBECB0DCEDCEDCEDCEFCE9EDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0EC0009090900909CBC0CED0FCFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFFFFFFFFFFFFFFFFFFBFFBFBEDBFCFAD9E9DAD9E9DADBC9ECBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DEDCCDCCCDCCD0DCBDBDADADADEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE9E9CAC9E0DAC9E0DAC9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CA900B00B00B00E00C0C0DADADBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEFDEFDEFDEFDFFFFFFFFFFFFFFF000000000000000000000105000000000000A9AD05FE','Janet has a BS degree in chemistry from Boston College (1984). She has also completed a certificate program in food retailing management. Janet was hired as a sales associate in 1991 and promoted to sales representative in February 1992.',2,'http://accweb/emmployees/leverling.bmp'); +; +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(4,'Peacock','Margaret','Sales Representative','Mrs.','1937-09-19','1993-05-03','4110 Old Redmond Rd.','Redmond','WA','98052','USA','(206) 555-8122','5176',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FDB9BFBFFBFB9FBDBBBFDBF9FBFBFBFBFBFBDBFBDBFBBFBFBFFD0000000000000000000000000000000000000000000000000000000000000000BBDBF9BDBF9BB9BFB9FBFB9FB9BBFBBBBFBBFB9F9B9FB9BF9BF9BFBBFBBFBDBF9FBDBF9F9BDBFBFBF9FBB9BDBB9BBF9BBFBFBFBFBFBFBFBFBFBFBFBFFBFBFBBA00000000000000000000000000000000000000000000000000000000000000009BFB9FBB9BBDBFB9BFB9BFFBDBF9BDBDBBDBBFFBFBFBFFBBFFBBF9F9BDB9BBFBBFBBFBFBFBBFFB9F9BB9FBFBB9FBDBFBFBFBF9FBFBDBF9BFBFBFBFBF9FFBFBD00000000000000000000000000000000000000000000000000000000000000000BFB9FBB9FBDBB9BBFBDBF9BBBFBBFBBB9FBBDBB9BFBF9BBDBB9FBFBBFBFBFF9BDB9FB9BDB9F9FBFBBFBFBDB9FB9BB9BFBF9FBFBDBFBFBFBF9FBFBFBFBFBF9FB000000000000000000000000000000000000000000000000000000000000000009BFFBBDBB9B9FBDBDBBFBBF9FBDF9BDBFBDFBBFBF9BFBFFBFBFBDBFF9BFB9BBFBFB9FBFBBFBBF9BDB9FBBBFBBDBDBF9BDBFBFBFBFBFBFBFBFBFBDBFBFBFBFBF0000000000000000000000000000000000000000000000000000000000000000009BBF9BDBF9B9FBBBDB9F9BF9BBBFBB9BBBBF9BFBFB9BB9FBDBFBB9BFB9FBF9BDBFB9F9F9BDBFBFBBFBDBFB9FBBB9BBFBBBDBFBFBDBF9FBFBF9FBFBFBFBFFB0000000000000000000000000000000000000000000000000000000000000000000BDB9FBB9BBFB9BDBBBFBBFBFBDB9BDBF9F9BFF9FBDBFFBFBBFBDBFB9FBBDBFBBB9BFBBBBFBBFB9BDB9BF9BFB9F9FBF9BFFBFBDBFBFBFBDBFBFBFBFBFFBF9BF0000000000000000000000000000000000000000000000000000000000000000009BBFBB9FBDB9BFBBBDB9F9B9FBBBFBB9FBBF9BBBFBFB9BB9F9BBFB9FBBDBBBDBDBFB9FBDB9FFBFBBFBFBFB9FBBBB9BBF9BFBFBFBFBFBFBFBFBFBFBDFBFBFF90000000000000000000000000000000000000000000000000000000000000000000BF9BDB9BB9FB9F9FBBFBFBFBDF9B9FBBF9BBFBF9B9FBFBFBF9F9FBBDBBF9FBFBF9FBDBBFB9FDB9F9B9F9FBBDBDBF9FBFBDBBFBDBF9FBF9FBFBFBFBFBFBBBE00000000000000000000000000000000000000000000000000000000000000000009BFBBFBDBB9FBBB9F9B9BDBBBBBDB9F9BF9FBDBFBFBB9F9BBFBB9FBBDBBF9B9BBB9BBDB9FBFBBFBFBFBBBDBFBBB9BB9BFBF9BBFBFBFBFBFBDBFBFBFFBDFF90000000000000000000000000000000000000000000000000000000000000000000BDBDB90B9FBB9F9FBBFBFBF9F9FBBFBBFBBFBBF9F9F9FBFBDBDBFB9FBBDBBFBF9FBF9BAF9BFBDB9BDB9BDBFB9BDBBDBFBFBFFFBFBFBFBFBFBFBDBFBFBFB9A00000000000000000000000000000000000000000000000000000000000000000009BBBBBFBF9B9FBBB9F9F9B9FBBB9F9BDB9F9BDBBBBBFBB9FBBBFB9FBBDBBDBB9EBB9FBF9BFFBBFBFBFBFBB9BFBBF9BB9FBDBBBDBFBDBF9FBFBFBFBFBFBFF000000000000000000000000000000000000000000000000000000000000000000000BDBDB9B0BFB9F9FBBBBFBFBDBDBBBFBBFBBFBDBDBDBDBF9F9F9FBBDBBDBBDBF9F9E9B9FA9FDB9F9B9F9FBFB9F9BF9FB9BBFFBFBDBFBFBFBFBFBFBFBFBBF0000000000000000000000000000000000000000000000000000000000000000000009BBBDBDB9BDBBB9F9BDBB9BB9BDB9BBDBDB9BBBBFBBB9BBBFBB9FBBDBB9FB9BBBBBF0B9FBFBBFBBFBFBBDB9FBBF9B9BFFFB9FBFBFBFBFBFBDBFBF9FBDF9A000000000000000000000000000000000000000000000000000000000000000000000BDBBBB9FB9BDBFBBFBBDBF9F9BBFBDBBBBFBDBDB9F9FBDB9BDBB9FBF9FB9F9F9E9BBFA00F9FB9F9FB9FBBFBFDBBBFB9B9BFBBFBF9FBDBFBFBFBFBFBFBB0000000000000000000000000090BCBC9F0A9E000000000000000000000000000000009BF9F0FB9BFB9B9F9BDBB9B9BBF9BBFBDFBDBBB9FBFB9BBF9AF9FAB9AB9FAB0B9FBC0000FB9FFBB9FB9F9BDBB9F9BDBFBFBBF9FBFBFBF9FBF9FBFBFBF9000000000000000000000000DA0F0BCBF0FDF9FBFEB00000000000000000000000000009BB9BB9FB9BFBFBFBBDBF9BF9BBDB9BB9BBF9FBB9B9F9E9FB9B9F9FBDAB9DBFA0000000F0B0BDAF9FBBFBBFBFBFBB9BFBDFBFBFBFBFBFBFBFBF9FBDBE00000000000000000000009ABDFDFFBDFF9FAFDF9FDFFAF00000000000000000000000009F9F9A9FBDBB9BBDBB9BF9BF9FBFBDBF9B9B9FBF9ABB9B9FBFA9B0BBDBEB0000000000F0000090B0BDADB9F9B9F9FB9FBBDBBDBBDBFBFBFBFBFBFBF9000000000000000000009EFFDBFA9FDFB9FDF9FAFFBF9F9E9090000000000000000000000BB0BF9B9BBDBF9BBDB99BB9BB9B9BB0BFBFA9A9BDBCBFA9A9BF9FBCA0000000000000B000000000000B0FBFFFBFB9BFBFBFFBFFBFBFBDBFBFBFBFB0000000000000000009BBFFBCBEBDFFFADFEBBFBDF9F9FFFBFFAC000000000000000000000BDBF9BBFBDB9BBE9B0BFBDBF9F9FBDBF09B9BDBCBBB9B9BDBF0A00000000000000000F00000A00000000009A9BDBFFBF9FBBF9BFBDBFBF9FBFBF9BC0000000000000000BEDF9FDFDBDFBF9FF9BDFDFBFFFFDBDFCBDBCB00000000000000000000B9BBDB9BBFBDB9F9F9B9BB9BBB9AB9BBF9E9A9B0F9FBE9A000000000000000000000F000A0000000000000000B0B9FBFBF9FFBFBFBFBFBFF9FBFBB00000000000000BC9BFFEBFBFDAFDFF9FFDBEBDF9E9FFFBFFDBDBCBDAC00000000000000000F0BBDB9FB9BFB9B9BDBBDBDBDBD9E99A9BDBFBF9A00000000000000000000000000D000000000000000000000000B0FBDBBBF9FBF9FBFBBFBFBD00000000000000BCBFFDBDBDE9BF9FADFBCBDBDFBFFBF0BDF9BEBCBDADB0D0000000000000099BD9BBFB9FB99E9BB9BD9BB0B0BB9BFBF0B00000000000000000000000000000000A000000000000000000000000009BFBFDBBF9FBFBF9FBFBDA0000000000000ADBDFDAFFDFBFFDFBDBADBFBDB9FF9FDFFF9FFD9F9A9F0F0A90000000000000BFBBBF9BFBDBFB9F0FB0BADBDBBDBE0000000000000000000000000000000000000F00000000000A0000000000000000BFBBFFBFBFBFBFBF9FA000000000009C9F0FBFBFDBE9FDAFBDFFDBDBCBFF0FFFBF9FF0FBF0F9E9F9F9E90000000000000B9F9BF9B9BB09B9BBDBF9A9BE9A000000000000000000000000000000000000000F000000000000000000000000000000FB9FBFBFB9FBFBFBF00000000000A9E9F9EDFBFDBF0FDBFADBFFF9FDADF9FDFBFBDF9F9F9F90BCBCBCB0000000000009A9FB9FBBC9F0FBDA0000000000000000000000000000000000000000000000000D0000000000000000000000000000009FBBDBF9FBFBDBBF00000000009BCB9BCFBFBDFBDBFBFFDFBD9E9F9BDBBFFBFDFDBFBCB9E9EBDB9F9AD0F00000000009FBB9FB9FBB0B00000000000000000000000000000000000000000000000000000A0000000000000000000000000000000BFFBFBFBFBFBFF90000000000FCBDEFF9FDFEBDAFDFBDFBDAFBF9ADB0FDBFDBFBF0DBDE9F9D0BCBCBDA09E00000000B9B9FB9F0000000000000000000000000000000000000000000000000000000000F000000000000000000000000000000009BFBDBFBDBFBB000000000009BCFBCBFAF9F9FDBBDEBBCBDBD0BDA9F9BDFBEDADBF0B9F9AFBDB9F0B9F09C00000000FBF9FBA0000000000000000000000000000000000000000000000000000000000F000000000000A000000000000000000000BFBFBFBF9FFE0000000000E9BDFBDFDBFFFBFDFBDFDBDADBF0BD00F0B0DBDB0DBDADAD99E9E9BD0F0F0B0000000099BB9F00000000000000000000000000000000000000000000000000000000000D000000000A00000000000000000000000099FBDBFBFBB000000000909FEBFDAFBFDBDF9BFCBFAFBDBC9BCB9F09CB09A9DA09099A9E9B9F0BF9B9E9E0000000BF9FB000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000BFBFBFBFBD00000000000BCBDAFFFDFAFFAFFDBF9F9C9E9BC90F09FBDBE9DA9BDBFA9F090F09F90FCB90D000000B9BB0000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000BFFBDBFB0000000000C9FFFDBDBFBDBDF9FAD9F0FBF9E9FBF9FF09A909A9C9A90D0BBDB9F9ADB9B9E9AD000000FBC0000000000000000000000000000000000000000000000000000000000000F000000000000000000000000000000000000009BFBFBFC00000000B0A9BFFEFFDFFFBFF9FBEFBD0F9FBDBDA99F0DBDBDA9F9E9B9C9ADB0F9ADADA9F0AC0000B9A000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000FBFBDBA00000000009FFE9F9FAF9FDBFF9F9F0FBFBDFADADBE9FBCBDBDF9E9BCF9BDBCB9E9BDB9E9BDA00000F000000000000000000000000000000000000000000000000000000000000000E00000000000000A00C090C000000000000000009BFBFBD000000009CFEF9FBFFFDFFBFD9E9E9F9FBDEBDBF9FDBC9FBCBF0BDBDB9BCBCB9F9BC9ADB9CA90000B00000000000000000000C0000000000000000000000000000000000000000000F0C00A000000A0900A000A0000000C0000000000009FBDA000000000B9BFFFCF9FBFBDBAFBDBFFBDFF9DBFDF0BFBFDBFD9FDBDADADB9B0F0BDBF9ADAB9E0000000000000000000000CA000000000000000000000000000000000000000000000F0A000C00AC090C0000A000AC0AC000A0A0000AC000BFBF00000000A0FDBCBFBFFF9FFDBDAF9BDFBCBFBCBBDFD9F9FDBFDBFDBDBDADF9F9F0F0F9F9DE99E0000000000A000000C0A0000000E0000000A0C0000000000000000000000000000009000000A000000A00C9C0C900090A0900C9AC00000E9AFB000000000DAFFFFDFF9FFF0FDBDBFFFBDF9FDBFDBFBFFFFBDFBF9F9F9F9B0F0F9F9F9FCBB9FA900000000000000000000000C0A000CA000C000A00000000000000000000000000000E000A000000A00000A0A0A0C0AC00C0C00000B00A000DBF000000000BFFADBFE9FFDBFBBEBFFCBDFBFFBFDBDBFDBDBDFBFDF0F9FBCBDBDBCB0B0FBBCDAD00000000000000AC0A000C0A000000000CA0000000000000000000000000000000000F0000000000000000000000A000A00A0A0AC00C0C90A09BE00000000FBDFFF9FFBFADBDF9F9FBFBDF9FDFBFFDBFFFFFFFDBDBFDE9FDBCB9F9F9F9FDBBDBE000000000000000000A00000000CA0C00000AC000000000000000000000000000000F00000000000000000000000000000000000A00A00C00C0B000000009EBFCBFBDFDFBCBFFFFBDFFBFFBFDF9FFDF9FFF9FBFFDBF9F9ADBDE9E9E9B0FCBBD9F0000000000000000C000000AC00000A00AC00000000000000000000000000000000B0000000A00000A00000000000000000000000000A00A00C00000000FDFFBFDFFBE9FBF9F9FDBF9F9FDFBFFF9FBFF9FFFDF9FDBF9FDBCB9F9F9F0F9BDDAF9E00000000AC00000000E00C000A0000C0C00A000000000000A00000000000000000C0000000000000000000000000000000000000000000000A00000009BFFADFFBCF9FBFDFBFFBF9FFFFFBFDF9FFDFDFFF9FBFF9FDBCB9F9F9CBDADB9FFBF9E9000000C00000CA0000000A0000C0E00A0A0C000000000A00000000000000000000F0000000000000000000000000000000000000000000000000000000FBDFFBDFBFFBDFBFF9FDFFF9F9FDFBFFDBFFBF9FFFDBDBE9F9FFDBCBF0F9F0F0BC9FBDF0000A0000A00000E0000000E000000C00000000A0000000000000000000000000B0000000000000000000000000000000000000000000000000000000FEFBDFF9F9FFBDF9FFBF9FFFFFBFDF9FBDBDFFF9F9F9FDBDBD9ABF9DBDBCBDBDBFBDBBCBC0000000000000000E00C000A00A000C00A00000C0009000000A000000000000F000000000000000000000000000000000000000000000000000000ADBFFEBFEBFF9FFBFF9FFFF9F9FDFBFFFDFFF9F9FFFFF9F9FDAFDF9FBCBDBDBCBD9FEDFBDA00000000000A0000000A00C0C0C0A0A000000000A00E00A00000000000A0000C0000000000000000000000000000000000000000000000000000009FFDF9FDBDF9FBFFDBFFBDBFFFFFBFDF9FBDBFFFFF9F9FFBCBF9F9FE9F9F0F0F9EBF9FBDAD00000A00CA0C0A0C000000000A00C0000000A000000000C00A000A000000000B000000000000000000000000000000000000000000000000000000BBFAFFBFFFBFFFDBFDBDFFFDBF9FDFBFFDFFDF9F9FFFF9FDBD9F0FDBDBCBDBF9F9F9FBDFBDA0000C00000000000AC0CA0A000A00000000000000000000000C00000000A00F000000000000A000000000000000000000000000000000000000000FFDBDE9FBDBDBFDBFFBF9FFDFFBFFDBFBFBFFFFFFBDFF9FFBFBDBF9FBDBE9FBCF9E9FBDFBDBE000000000C000000000C0C0C000000A00000A00A000A0C0000000A000000F0000000000000000000000000000000000000000000000000000009FBFFFBFBDFFFFFBF9FFFFFBFBDFDBFFDFDFDBFFDFDFBDFBDFDFBDADBCBDBDADBDBFDBDBFDAD00000AC000A00E000A009A0B000A900000000000C000000A00A00000000000000000000000000000000000000000000000000000000000000009EFDE9BFDFFFBF9FDFFFDBDBDFDBFBFDFBFFBFFDBFBFBDFBDB0FBDBDBDBDADBDBDBF9F0FFDBF9E000000A0000000E00CA0C0C0E0C0E00CA0B0C0000000000000000000A000F000000000000000000000000000000000000000000000000000000BFBFEDFBF9FDFFBF9FBFFFFFBFFFDFBFDBFDFBFFDFDFBDEBDF9DAF9F0F9F9EBDBCDBFF0BFF9E9E0A0000000C000000000A0A000A00CA00C0A0A0A0A0A0000000C00000000F0000000000000000000000000000000000000000000000000000000FDBFF9FFFBFBDFFFFDF9FDBDBDBFFDBFDBFDF9FBFF9FBDFBFFBD9E9F0F0F9DBFBFDBDF9FFF9F90C000C00A00A00C0A0C9C0BC0D0A9CA9A0C0D0C9C0D0E0E00A00A000000B0000000000000000000000000000000000000000000000000000009BFE9BFF9FDFFFBDBFFBFFBFFFFFDBFFFFFFBFFFDF9FFDBDF9DFFBDBDBDBDAF0FDBFFBDBDBFF9EB000A000000C00A00CA0A0C0A0AC0A0C0CB0A0A0A0A00009C000C0A00E0C000000000000000000000000000000000000000000000000000000FEF9FDF9FFBFF9FFFDBF9FDF9F9FBFFDFBDFFDBDFBFFDBFF0FBA9CBF0F0F0BDBDBF9FDBCBFDBCBD00000000000000009000D0A90C9AC90A00C0C00C00C0BCA0ACA0BC0D00B000000000000000000000000000000000000000000000000000000BDBFFBFFBDF9FFBDBFDFFBFBFFFFDFFBFFBFFFFBFFDBFFDBF9FDFBD9F9F9BDBDBDFFBFF9DBFFF9E9AC00AC0A00B000A0000A00C0A000AC9E0B0ADA0E9AC000C900C00A0A0F000000000000000000000000000000000000000000000000000009EBCBDF9FFBFF9FFFDBFDBDFDFBDBFBDFFDFDBFDFDBFDBFFDBF9BDBEBCBCBDADADB9FDBFBE9FF9F9E90000000C000C000E00000A000C0000000000090000ACA0AC9A0C00C0F00000000000000000000000000000000000000000000000000000E9FFBFBFF9FDBFF9FBF9BFFBFBDFFDFFFBFFBFDBFBDFBDF9FDAFCBD9DBDBDAD9F9EFBFFDF9BDBFFDBCA0000000000A0000000000000A000A0C0AC0AC0AC9009C00AC0B0E9A00000000000000000000000000000000000000000000000000000A9BF9FFDF9FFBFF9FFFDFFDBFDFFBFBFBDFF9FDBFDDAD0F99E99DBDEBFADBCB9F0BF9FDFB9EDFDF9ADA9C00A00A00000000000A000A00000000000000000AC0000000000000F00000000000000000000000000000000000000000000000000000FDEF9FBFFF9F9FFBDBF9FBDBFBDFDFDFBDBEDBF9FBDBD9AD99E9099C99E9BDADBD9FFBDFF9BABFFDBF009000000A000000A0000000000A000A00000000000A00AC00AC0000F00000000000000000000000000000000000000000000000000090BBDBFFDF9FFFFBDFFDBFDFFFDFFBFBFFDEDBD0DFDFFFFDDAD99DBC9BC9F0DBDADBF9FFBDFFDDBDBFD9FAC00000000000A000000000000000000000A0000000000009000A0000000000000000000000000000000000000000000000000000000ADEBFDBFBFF9F9FFBDBDBFBDBFBDFFDF9F9D9FDBFFFDF9F9D9AD0D9BC9A9DBCB9BCBDBDFFBDBBDBFCBE9DA0000000000000000000000000000000A0000A00000000A0000000F0000000000000000000000000000000000000000000000000009FF9FDBFFDF9FFFFBDFBFFBDFFBDFE9FBD0F9E99F9C9090D0B0D09A0C9C9D00BDADBDBFBDBDBFCDBDBF9DA000A00000000000000000000000000000000000A000A0000000000A000000000000000000000000000000000000000000000000000ADBFBFFDFBFFBDBDFFBDF9FFBDFFBDF0DBD0D9FD09B9FDB9BDFBFBDF9AB00BD09DBDBE9FFFFBDBBDBDBEBDBC0000000A0000000000000000000000000000000000000000A000D0000000000000000000000000000000000000000000000000009ADFDBFBFDF9FFFBDBDBFF9FFBDFF9DF0D0B09BFFDFFBFFFFFFFDFBFFDFF009E909BD9F9BDFFFDEBDFD9F0B0C000000000000000000000000000000000000000000000A00000F000000000000000000000000000000000000000000000000000FFBEBFDFFFBFF9FFFFAD9FFF9FF0DF0900BDFFFFFBFFFFDBFFFFBFFFFBF0F0090DBCBFDFDBF9FB9F0BBF0FDB0000A00000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000009BF9F9FDBFF9FF9FF9F9DFAFF9FF9F9090F9FFBFFFFFFFFFBEFFFFFFFFBDFFB0900B09BDB0BFDFBDFDBDEDBDA00A00000000000000000000000000000000000000000000000000D0000000000000000000000000000000000000000000000000ADAFFFBFF9FFDBFBDF9FB9F9FFBC90E9EF0FBFDFFFFFBFFFF9BFFFFFFFFFFFC9E090DBCBFFDBF9FF9ADB9BDA9FC000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000BDBDFF9FFBFFDFFBFBDE99F9EDBD90B9FF9FFBBFFFDFBFCF0DB9F9BDBDADBF090C0099099F9FF9FFDBCF0FDA9AC0000A000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000BCBFBF9FFFDFBFBDFDF9BDBBF9F00A9FFF9EFFCF9E9B0D9B9DBC90C90DADBC900A909CADBF0FBDFBDBDB9F9AD9F0A000000000000000000000000000000000000000A00000A0000000000000000000000000000000000000000000000000000BDBFDFDFF9FBFDFDF9F9ADAFC9F090DFFE9E9B990BD90D9E9CB09AD99E909090E9909A99BE9DF9F9F0FA9DADF9E0000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000ADBFBFBFFFDBFBFBFBDF9D9B90C00B09F099C9E9DADF0BDDBDFDDBAD9BDADBF9F0F0DBC99FB0BDBDBD9EBDA9E9BC00000000000000000000000000000000000000000000000000E000000000A000000000000000000000000000000000000009FADFFDF9FFFFDF9FDFBDBAD0F99BD0F09FE9BF9F9F9FDFBFDBFBFDFBCF9F9CBDAD9B0DBDA9DFDBCBDBD90BDA9EDA90A0000A00000000000000000000000000000A0000000000009000000000000A0000000000000000000000000000000000CABDFBDBFFFBDBFBFFBF9E9DB9ADADBF9FF9BFDFFFFFFFBFDFBFDF9F9FF9F0FBDADBC9F09A9FB9ADBDA9AF9DA9F9A9C000000000000000000000000000000000000000000A000000E0000000000000000000000000000000000000000000909A9BDFBFFFFF9FFFFDFBDF9F9BCBDBDBE9FF9FFDFBF9FDBDFDFBFDFBFFFDBDADF0F9DA9E9BF9DF0FDBDB9FD99A9E9E9CA0000A00000000000000000000000000000A000000000A0000900000000000000000000000000000000000000000000BFFFFBFDF9F9FFFBDBF9FF9E90FBDBCBDFFDAFDBFBDFFBFFBFBFDFBDE9F9ADBDBDBD0BDB90D0FA9F0B9F0F9BCBD990F0BCB00000000000000000000000000000000000000A000000000E000000000000000000000000000000000000000009ADBF9F9EBFFFBF9FDFBDFF9E9FBD9DADBDB9FBDBFDFFBDFDBDFDFBF9FBDFFFFF0FB0FBFCBCB9BD9F99F9E9F9E9BDADA9AD00CA00000000000000000000000000000000000000000000000B00000000000000000000000000000000000000000ADFFDFEFFDF9FDFFFBFDBF9F9F9C9ABD9F9EF9DFF9FBDFFBFFFBFBDFFFDBF9F9DB9DF9C9BD9DE9A90F0BDBDBDBDBC9BC9CBCB0D00000A0000000000000000000000000000000000A000A00C0000000000000000000000000000000000000000BDFBFFBF9FBFFFFBF9FDBF9F9F9E9B9D9BE9F9FBF9FFDFFBDFDBDFDFFBDBF9FF9FADE90FBDA9A9BDBF9BD9F9E9F0F9BCB0B0BC9A00A0000000000000000000000000000000A000000000000B0000000000000000000000000000000000000009FBFFFFDFFDFBF9FDFFBFD9F9F0F9BDA9AD9F9F9E9FDBFBDFFBFFFBF9FDAD9F09E9DB9BF90BDBD9DAD0F0FBDBDBDBDAD9BC9E00FC00000000000000000000000000000000000000000000000E00000000000000000000000000000000000000ADFDFBFFBFBEFDFFBF9FDBEFF0FBDFCBDF9A90F9F9FBFDBDB9DF9F9FFFBDB9E9F99E9FC90FD09CB0BDB99F9EDBFDBDBDADCB09CB0BC0000000000000000000000000000000000000A000B0000900000000000000000000000000000000000009FFBFBFDFFDFFBFBDFFFFBF9F9F9DBB9F9AD9DB9E9F9E9FFFFFBFFFFF9DFBCBBDADA990B9F9A9F9DBD0DAF9DBBDBCBD9F9BBC9EBC0DA00000000000000000000000000000000000A0000000000E000000000000000000000000000000000000BBFBDFFFFBFFBDFDFFF9F9FDF9FBFFBDFDBDF0B0F9F9F9FBDBDBDBD9F9FFADBDCBF9F9E09C909F0BAD0BBD9FFBDFDBDAF0F9C9A900BA00A000000000000000000000000000000000000000000009000000000000000000000000000000000000DFDFFBDFFFDFFBFFFBFFFFBFBFDBDBDF9BF9BF9D0BDBDF9FBDADF9FB9F9F9FDFBF9F0F9F0B0F09D9DBBD9FBDBDF9BF9F9F9E9AD0F00D000000000000000000000000000000000A0000000A00A00E000000000000000000000000000000000000BFBFDFFBFFBFCFFBFDF9F9FDF9FFFDBFFDFFDFBF9CB0BDBDFFF9AD0DADADFBF9FDFF9F09F0F9FA9A9D0BC9FBDBFFDBF9F9F9F9AD0ADAD00A00000000000000000000000000000000000A0000000B000000000000000000000000000000000009F9FDBFFFDFFFBF9FFFBFFEFBFFDBDBDBDBF9F9F9FB9DF9FBC99FDBFFBDBFBDFFFBF9F0F9E99E99C9F0BDFBFDBFDBFD9EDADADADA0D00A0000000000000000000000000000000000A00000090C00C00000000000000000000000000000000000BFFFBFF9FFFF9FFFF9FFDBDBDBDBFBFFFFDBFFF9FD9E9A9F9FBFFBFDBDFFFDFFFFDFFF9F090FB9E9B0F9F9FDBFDBFDBFF9F9F9F90F00BC00000000000000000000000000000000000000000A00A0B00000000000000000000000000000000000FDBDFFFFFBFFF9FAFFFBFFFFFFFFDFDBDBFDF9FFFBF9F9CBD9F9FDBFFFF9FBFFDBF9F9E9F0F0DE90DB9F9FBFDBC90BDB9F9F0F0E90BC0900000000000000000000000000000000000000A0000900E00000000000000000000000000000000000BFFBF9FFFFF9FEFDFBFDBDBF9F9FBFFFFDBFFFBFDF9F9B9EB9CFBFDFBDBFDF9FFDFF9F9F0D0B99E90F9FFD0900BCBC0D0BCBD9F9E90B0E0E0000000000000000000000000000000A000000000000900000000000000000000000000000000009FBDFDFFBFDAFBDBFFCFFFFFDFFFFFDBFBFFDFFDFFFFFFDF9DA9BDFBFDFDAF9FE9FBDFCBCB0BCBC09F9E90BCBDBDBDBF0BC90FADA9CAC09000000000000000000000000000000000000A000A00A00E0000000000000000000000000000000000FDFFBFBFFDFBDFFFFFBFBF9FBFBDBDBFDFFFFBFFBFF9F9F99ADBDF9FDBEBD9FF9FFDBDBDBC9C90B9F0F9CBDBDBDBFDF9FFD0F09DBCB909E0000000000000000000000000000000000000000000000B0000000000000000000000000000000000BFBDFDFDBF9FFF9EBDFFDFFDFFFFFFFFBDF9FFDFFDFFFFBFFDBCB0F9BDBDBFF9FBDBCBDADB09E9C9AD0F9E9F0FBDFBFFD9FBDE9A0BCCA00000A000000000000000000000000000000000000000000C00000000000000000000000000000000000FFBFBDBDADBFFFFFBFBEBFFBDF9FFBDFBFFFFFFBF9F0FDBDBDBDBCF0FDBDADFDFBDBDBDADA90B0F09BCBDBDBDFBDF9FBE9F0BC9C0B9DAC0BC0000000000000000000000000000000000000000000F0000000000000000000000000000000000BDFDFFFFBDBFFBF9FEDFDFDBFFFFFDFFFDFFF9F9CDADF9EDBCBDADB9F9F0FDBFBDFBFDADBC9E9C909E9F9F9FF9BDFBFF9FF9FDBF0BCA0090000000000000000000000000000000000000000000000A0000000000000000000000000000000009FFBFFBDBDBFFFDEFFFBFBFBFDFBFFBFFFBFB9FCFFBF9BDFBDFFF9F9F0FBFDBF9DF9EDBDBC9A9DA90F9F9FF0F9FFFBDF9FF9FFBDCBC090F0ACA0000000000000000000000000000000000000000000D0000000000000000000000000000000000BDF9FFFCBDFDBFBFBDFFFDFFFFDFDFFBDFCDCBBF9FDFFFBDF9FFFDEBDBDFBFDEFBFDBDADA9D0E9E9BDBE9BDBFDBDFBFF9FF9BCBBDBDE0000000000000000000000000000000000000000000000000A0000000000000000000000000000000000BFFFFDBDBFBFFDFDFAF9EBF9FBFFBFDFF0BBFDF9F9F9F9FBFBDBFFFDBDBCDBF9FDBFDBDBDE9B909E9E9DFDBDBFFBDF9FF9FFDFDE9EBFCB0F000000000000000000000000000000000000000000000F0000000000000000000000000000000000FDBFBFFF9FFFEBEBFDFFFDFFFFFFFFFE9FDF9F9FFFBFFFFDFDFBDBDFEBCBBDBF9FFDADADA90C0F99F9FBFBFFF9FFFBFF9FF0FBDBFDBDF0C00000000000000000000000000000000000000000000000000000000000000000000000000000000BFBFDFFF9BFFFBDFFDFBDBFFBDBDFF9E9FBF9FBF9FBDFDBDBFFBDFFBFFD9F9CBDFFDBF9F909E9B0BE9FBDBDBDBFFDBFDBFF9FBDBFCBCBE00AC00000000000000000000000000000000000000000000F0000000000000000000000000000000009FDFFFF9FC9F9EBDABFEFFBDFFFFBEF9FDF9F9FDBDFFBFFFFBDFFBDFF9EBCFBCBF0FF9F0FDA90C9D9F9FFFFFFFDBFFFFFDBFBDFCFBDAD9E0900000000000000000000000000000000000000000000000000000000000000000000000000000000BFBF9FFBFB0F9EFDF9FBDFFBDFFFD0FBFFFFFBFFBFDF9FBDFBFDFF9FFFDBFDBDFF9FFDB00DA9ADADAF9F9FF9FFF9FDBCBDADBBF9E9FACBC0A00000000000000000000000000000000000000000000F000000000000000000000000000000000FFDFDFFDF9DBC9B0BEFFDEBDFFBFDBFFDFBDB9F9FDFBFFFFFBFFBFBFF9FFFCBFBDBFDADFDBAD0DABDBDFBFF9FF9FFFBFFBFDBCF9E9E9DBC00000000000000000000000000000000000000000000A00A000000000000000000000000000000000BDFBFBFFBCADABCFDF9FBFFFBFFDAFDBFBDFFFFFFBFDFBFDBDFDFDFF9FFBCBDBCBFDBFF0B0D00BDDBDBBCF9FDAFFBDFF9F9ADB9E9F9EBE9009C0000000000000000000000000000000000000000000D000000000000000000000000000000009FBFFFFF9F99A9CB0BFFFFBDFFDBFDBFFDFFBDBDBDFBFFDBFFFBFBF9FFBDFFF0DBDBFDBDBCB00D0BADADDF9EBFDBDFBD0F0FDAD0B9E9F09EC00A0000000000000000000000000000000000000000000E000000000000000000000000000000000FDBDFFFFFFF0A9ED0FBFDFBFBFFADFFFBFBFFFBFFBDFBFDBFDF9FFF9FFBBDFCBCBFDBCF9F0DAADDBDBA9BF9F9FFBDFFBDB0BDAD0F9E9F09A0000000000000000000000000000000000000000000000B000000000000000000000000000000000BFFFBDFFFFAD009ABFDEBFDFDFCDAF9FFDFDBDFDBDFBDBFFDBFF9F9FBDFDBFF9FBDBFFBDADA9DABCBDFFF9FFFFFFEBDFADFC09B0BCBDADAC0000000000000000000000000000000000000000000000C00000000000000000000000000000000BFDBFFFF9FDF09AFADFFBFEFBFBFBFFFFFBFBFFFBFBFFFFFDBF99E9FBCBDBEF0DADFFDBDE9F09E9DFFF9F9EFDBF9DBDF0FDA9BF0FC9FADA900000000000000000000000000000000000000000000000B000000000000000000000000000000009FFFDFFFFFBDE000DA9FFDBDFFFC9F9F9FDFDBDBDFF9FFFFBDBFFBF9DBFFF9BE9FB0FBFBDB09E9EB9F0FBD9FBCFFEF0BD0BC9C9F0BF0DBC000000000000000000000000000000000000000000000000F000000000000000000000000000000000B9FABFFFFFADA0F0DAFFFFFBDBFEFFBF9BBFFBFBDFFFFBDFFCBD9FAF9F9FFDF0DFF9FDF9EFDAD0DAD90CAF9E90909CA9FCB0BCBD0BF0CBC000000000000000A0000000000000000000000000000000E000000000000000000000000000000009FF9FDFFDBFDF0000BF9EFFBFEFC9BDE9EDF9FFDFFBDBDFFADBDBE99DFFFF0F0FFBDFBF9E90000B0F0ADB9C00E0E0009CA90D0BC0F09BF0000000000000000000000000000000000000000000000000900000000000000000000000000000000BD09FBFBFFCB0000BF0FFBDFFDBFBCFBFB9AFFDBFBDFEFCBDBCBC99EB09B9FBDA9CFBFDA00090BCD9FDB0CF0F0900E9CA9C00BD0B09EC0C000000000000000000000000000000000000000000000000E000000000000000000000000000000000FBF09FFDBFBE900C0FBFFFFBFF0DBFDFDFDBDADBDFBDBFDA9F9F0F99FEDE9FE9EBFDFFD09ADADBE9BFFFB0CADE0000AD09A9CAC9CA99A0E00000000000000000A00C00000000000000000000000000F00000000000000000000000000000000BDF9F09BED0D0E00B00FDBEDFBFFE9FBFAF9AF9FFFCBC000C0CBCB0F09B9BDADBDFBFFBFFF9F9E9FFFFFFDA900000000000DA90B09CAC0900000000000000000900A0A0000000000000000000000000B000000000000000000000000000000000FBFCBC09A9A900000BDAFDBED009EBDF9FFD9AD0A0C0A90A0BDF0D0BCF0DAD0FFBDFBFDBDE9FBDADFBFFC0EDAD0AC09ADA00CBCBCB000E00000000000000090C0090000000000000000000000000A0C000000000000000000000000000000000BFCB009AD0000000ADAF9FAD0BFFBDE9FF0BED0BFDB09CAD0DA0DA9E9B9EBCBF9FFFDFBFFBF9EDBFFFDB0F90BCAD09ADAC9CBC09000DA00000000000000000A00E00000A0000000000000000000000B0000000000000000000000000000000000FBC0000000000000000A0FBFCFFCFBFE9FD9BFDFFFFE0000AD009F9FCF9CBDFFFBFBFFDBD9F9BDBDBFEDACBCBDACBC090A909E00E9AC9C000000000000CA00090000000000000000000000C0A00C0F000000000000000000000000000000000009A0000000000000000CBDEBFEBF0F9FFAFE90BFFFF0F00000BCBCF9BCB0FBF9FDFF9FFFFADF9E9F0F9FF0F0CADBCBCAD0E0000F0F9A0A0000000000000909E000000000000000000000A000000A0C00000000000A0000000000000000000000AC000000000000000BDBDAFDE9FFF0FDADF9EF9FBFDFDADADBCBCB9EDAC9FDFFFBFDFF9BDF9BE9F9BDA9CE9E9C0000000090F9F9F0C9C000000000000000E0000A00A00000000000000C00A0CA000B000000000A00000000000000000000000090000000000000009E9EBFFFBFFDADEBFF9E99EDFFEFADF9F0F9F9EDA99FBFBDBDFBF9FDFBFFDBF0F0F9F9BC0A00F0DBCBCF0F9E9EB0A00000000000009A000000000000000000000A0A0D00000C0F0000000000000000000000000000000000000000000000000009FFFFCFF9EBFCBCF0F9EFDBE9DBDAFD0F0E0F09CBE9F9FFFBFDFFBFBDBDBDF9FF9F0BCB9D9F9E9AF9FBF0F9E90C900000000000000C09A00000000A000000000000A0AC0A0A0E000000000000000000000000000000000A0000000000000000A00BCFBFEFDFBFCBCF0E9EADBEBCFDAE9F9F00E9BDFBDF9FDFBF9FDBDFFBFBFF9F0F9F9EFADADBC9AD0DADA09E9A0E000000000000A900000000000000000000000C000A00D00D000000000000000000000000000000000000900000000000009CBFFBFDBFFADBBCBDFBDFDFEDCB9AD9E0C00F0FCB9FFBFBFBDFFFBFFBDFDFDBFBF9E9E999BDADBC9A9BF09F0000090000000000000000000AC00000000000000000AC009E0A0B00000000000000000000000000000000A0000A00000000000000BDADFEFDADFCFFFAFDEBFFFDBFCEDAC90BDBDB9FFF9FDFDFFF9FFDBDBFBFBFDFDF9FB9FEF0F9ADADAC09E0E0DA9E000000000000000000000A00000000000000A090ACA000CE000000000000000000000000000000009E00000000000000000BCBFFBFBFFBFBDBDFCBDEF0FFFCBDADBCBC9A9FFF9FFBFFBDBFFDBFFFFFFFDFBFBFFDFF9F9F9FF9F9F9BC909A0C0000000000000000A000000000A000000000000CAC90C0CA0F00000000000000000000000000000000009E00000000000000009CBCFDEDBDEDBCBDBFBD9F9ADBCBCB0BDBFDF9FFFBDF9FFFFDBFF9F9FBDFBFDFDBFBDFFFFFF0FF9FEDBADAC9A9E9E0000000000CA00000A000000000A0000000000A0A0A900B000000000000000000000000000000000A00000000000000000A0BFFBFBFEFBFFBFBCBCBE9EDADBDBDFDBF9FBFF9FDFFFF9F9FFDFFFFFFFFFFBFFFDFFBDBDBDFF9EF9FCDADBC9E9C0000000000B0000000000A0000A00000000A0000C0900E0E00000000000000000000000000000000AD00BC00000000000000DADAFDFFBDF0FDEDBDFBDBFBDBFBDFBFFFFFFDFFFFFBF9FFFBFBFBF9FFFF9FFFFDBFBDFFFDBF9FF9E9BBF9ACB00A000000000000900000000000A0C9000ACA0000E0A0E0E00F0000000000000000000000000000000000A00000000000000009ADBDFFADFBFFBFBFFBCFFFDFFDFFFFFFDFFDFBF9FBFDFFF9FDFDFDFFFDFFFFDBFFFDFFBDBFDBFCBDBEDC9EDBCBD0000000000000000A00000000000ACAC0009CA009C0009A0F00000000000000000000000000000000B0C0009A00000000000000FB0FFBFE9FFDF9FFBDBFFFBFFDBFFFBFFBFFFFFDFF9FBFBFBFBFBDBFBFFFFFFFBFBDFADBFCBDFADBFBE9E9ACAC000000000000A000000000000000000A0A0000A0ADAC0C090000000000600000000000A00000000000A9A000000000000000A90FFBDEDBFF0FBE9FDFFFBDFFBFFFDFFFFFFDFFBFBFFFDFDFDFDFFFFFFDFBFF9FFFDFBDFDFBDBFDBCBDBF9EF90B00000000000000000000000A0DA0A000C0CA00C00000A0AE00000A000000A000A0000000A000000A9AD00C000000000000009CBDBCFFBFDFFFFDFBFFBDFFFDFFFFFBFDFFFBFDFFDF9FBFBFFBFBDBFDFBFFDFFFDBFBDFBFBDFE9ADF9ED0F090AC0000000000000000000A0000000D0C0A90A0C0A0AC0F0C0F00000000A00000000000A00000000000000A0A000000000000000A9EBFF9EFFBF9FBFFFDFBFDFBFF9FFFFFBDFFFFFFFFFFDFDBDFDFFFFBFF9FBFBFFDFDBF9FDAF9FFCBDFBF0DAC90000000000000000000000F00000A0AC0E0C0A90C9A000B0F0000000000A000000000000000000000E00C90000000000000000009E9BF9FFFFFFFF9FFFFFBFFFFFFDFFFFFFFDBF9FBDBFBFFBFBFBDFFFFFFFFDFBFBFDFF9FDBF9FBEB9E9FA9A0000000000000000000B0C000ACA0009A00A90CA0A0CAC0C0B00A000000000A00000A000A00000000909A0000A000000000000009E9EDFFF0FFF9FFFFBDFFFFDBDFBFFBDFFFBFFFFFFFFDF9FFDFDFFBFDBFDFFFBDFDFBF9FFBFCF9F9DE9FC9C0000000000000000000000A000009C9E0C0F0CA00C0CB09A0AE0000A00AC00000000000000000000A0C0AC9A0000000000000000B0A9FBE9FFF9FFFFFFFFFBDFFFFFFFFFFFBFDFFDBDBDBFBFDBFBFBDFFFFFBF9FFFBFBF9FF0FDB9E9FEBDA9A00000000000000000000C0000A9C0A0A000A00A0CB00A0CAC0CF0000000000A0000A0000A0000000000A00000C09000000000000000D9E9FFBFFFFF9FBDFFFFFBFFBFFBDFFFDFFFBFFFFFDFDBFFDFFFFFFF9FFFFF9FDFDFFDBFDBEF9F9BDA9C0000000000000000A00000AD0000A0C00E9E9E0CB0CA9CA000B0F0000000000000000000000000A000009E9A000A00E00000000000000A9E9EDBDBFFFFFFF9FFFFFDFFDFFBDBFFBFDBDFBFBFFF9FBFFDBF9FFF9FFFFBFBF9FBDBBDBDADE9FDA900000000000000000000A00000C009A900A000B0CA0CA0DACAC0900A00000A0000A0000A000A0000000A000C0B000090009000000000B0F9FBFFFFDBFDFBFFFFDFFFFFFFFFFFF9FDFFFFDFDF9FFFDFDBFFFFFFFF9FFFDFFFFDEDFBDADBFF0A9C0000000000000000000AC90A0A0A0E0CAD0F0E0CAD0A0CA0900AE0000A00000AC000000000000C00000009A9AC000000A00A000000000C9AFE9FBFFFFBFFFFFBFFFBFFBFFDFFFFFFBFFBFFFBFFDBFBFFFFFBDBFFFF9FFF9F9FBB9CBDBDB09D0A0000000000000000000000C00D00000B00A0E00B00A9CB00E0BCF000000AC00000000A0C00F000000A00AC0C900B0A000C00000000000BCBDBFCF9FFFFFDFFDFFFDFFFDFBFFF9FFFFFFDFBDFDBFFFFFFBDFFFFF9FFFFBFFFFBDDFBCBDADF0A900000000000000000000000A0000BCBC0E0C00BC0E0CA00CB0E0AF00000C00000000A00900000A00A000C90A00A0C090090090000000090B0F9FBFFFBDFFBFBFFFBFFBFFFFFBFFFFFFDFFFFFBFDFBDFFDFFFFF9FFFFFFFDFBDFBE9F9FF9B0D0C9A00000000000000000A000000A0000A90B0F00A00B0CA0AC09C0B00A000000A000C0000A0A00C00000000A00A09A0C0A00A000000000000DADADBF9FFBFFFFFFFFFFDFFFDFFFFFBDFBFFFDBFFBFFFFBFFFBFDFFFBDFFFBFDFBDBFDB0BCF0A9A0000000000000000000000000000CAC0E0CA0CAD0E0CB0F00ACA0E000000A0000A00000000000000000A90C90C0000A000000000000000ADA9FBFDFFFFFDFFDFBDFFFFFBFFFDFFFFFFFFFBFFDFFFDBFDFBFDFFFBDFFBFDFFBF9FF9ADFDB0F90C0000000000000000000000A9C090A90B00BC0B00A90A0C00ADA0DF0000000000000000AC000C0A0000000A0A9000B0900009C0000000009A9F0FDBEBF9FFFBFFFFFDBFFFFFFFBDFFFFFFDFBFF9FFFFFFFFFFFBFFBFFDBF9FDFFDBDFA9A09C0B0090000000000000000000000A0E00CAC9E00E0DAC0E9CA0E00C0AF000A0000000000A000000A00CA00C00000A9AC00CB0DA00B0000000000CBDAFFDFFFFBFFFFFFBFFFFFFFBFFFFFFFFFFFDFFFFFFFBFFFFFFFDFFFBFFFFFBDFBEBDF9D09B000000000000000000000000000000B000A00F00A0CB00A09E9ADAD0D0000C0000A0C000000A009000000A0009C00C9A0A00000000000000000B0BF9FBFFBDFFDBFDFFFF9FFDFFFFFFFFFDBFFFBFFF9FDFF9FFFFFBFDFFF9FF9FFBDF9F0B00AC000A00000000000000000000000000C0F0DAC0E9CA00E0CAC00CA00AA000000A0000A00000000E00A000090BCA00B000900000000000000009C90F9EFDF9FFFFFFFBFFFFFFFFFDFFFBFFBFFF9FFDBFFFBFFFFFBDFFFBF9FFF9FFBDFBFDBCF99000900000000000000000000000A09A0A00A00A00AC9E90B00F0A90E0F000A000000000000A00000C0000E00000B0C0A00000B0000000000000A0F0F9FBFFFF9FBFFFFDBFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFDFFBDFFFFF9FFBDFFBDFADF0B00000000000000000000000A000000C09C9E0CBCBC9A00AC0E00E0CA9CF00000000000000A00C000A0000900E00000B0900E90000B0000000000090BCBCBDBFFFFFDFFBFFDBFFBFFFFFFFFDFFFFFFFFFFFFDBFBFFFFFBFDBFF9FFBFDFBD009D9E9000000A000000000000000000000A00A00F0000AC0AC9A09E09A0CA0F000000000A0000C0000A000A00A00900F0F0CA000000000000090000090A09F9FFF9FBDBFBDFFFFFFFFDFBFFFFBFBFDBFF9FFFDFFFDFFF9FFFDBFDBFF9FDBF0F0EB0A00000009000A000000A900F000000000A0CA00E9E0B0DAC0E00BC0E90EA00000A000000A0000A000C00000000A00000B0090000000000A000A0000D9F0BE90FEDFFFFFFFFBFDFFFFFDBFDFFFFFFDBFFBFBFBFFF9FFF9FBFDBFF9FFBF0BFB9C09000A0000009000000000A0000A000000D0B00F0A0C0CA00A90AC0A9CA9F00A0000A0000000000000A0C000E000D0BCBC9C0A0000000000000090A00A0BC9FF9BFADBDBFBDFFFFFBFFFFBFFFDFBFFFFFFDFFF9FFFF9FFFDFBFDBF9FDB0DBCF9AC0000900A0000000E00000000C000090A0E0CA00CBA0A0CBC0E90F0CAC0F00000000000000A00000900000090A0A0000A0A009A0900000000000009090DB09AD0BDBFFDFFFFFFBFDFBDFFDBFBFDFBDF9FBF9FFBDBFF9FBFFDBFFDFBAD0F0B0C900900A0009E00090000A09E0A00C000E900A9CAD0C0D0B00AD0AC0A90B0D00000C0000A000000AC0000A00000090CB0BC9090C000000000000000000ACA0DADAF9EFDBFBDBF9FFFFFFFBFBFDFFFBDFFFFFDFF9FFFDBFFDB9FF9EBDFD0D9D09A00A00D00D000090E0009C0C09000A00A00E9CA00A0A0AAC0E00AC9ACAC0EA000A000A000000000000E0000A00E00A00C0BC0A0A0000A00000000009AD0909A0909CB9BEBDFFFFFF9FBDFFDFFFF9FFFFBF9FBF9FFBDBDBDBEFF9F9DA90B0A0AC00D00A000A0000A00000A09A0ACB009000F00A09E0F0D0C9A90AD0AC900F0F0000000000000E000000000C00000000A9ADAAD0090C0000000000000000A0000F0F0BDEDBDAF9FF9FFFFFBFFBDBFFBDBFDFFDE9FDBDAFDAF9F99E9AF9E9C09C9090A90D0B0000B0C900A00000D000E0E0F00AC9E0000A0A0AC0E00E90ACA00F0000000000000000A0000A0000000009C000D0AC000B000000000000000000F00090F0B9E9F9FF0FFBDBFDF9FFFF9FFEDBF0BF9FBF9FDBF9E9FE9FFD0F09A0000AC90CA00C00000000090D0AD0A000900A0BC0A00E9E0CAD0CA09E00E00BCB0F0000A00000A00000000A0C0A0000A0C000A0AD9A9A00000000000000000009009A0F00DA9BCBD0FBDFEFDBFFF9E9E9F9BC9FD0BD09F0BF0F9F09F09AD00E090A0000A909A0009000A0ACA0A00A0D0A0E9C0C0AD0E9A09A0A0B0F00BCBCBC00EA0000000A0000000000000000000000A0A090F0A0C0000000000000000AD00000AC900FADDE9E9FBDADBDBF9F0F9F9F0BCBCB0BDAFF0FF09E9ADFADBCB0900000D09AD0AC009A0CA90C900C900000AC0000A0BC0A0C0CAC90E0C00AC0000ACB0F00A0000000000A000E000A0000A0900090ADAFC9A000000000000000000A000009EF0900B9B9E90F9BDBCFADBC9ACB9CB0BCBDA909F09DF90DA900090E0000000A000C900000000C9A009A00E900009A0E9E00AC9A0A9ACA90A0E9A0E0F0AC0F000000000000000000000C000000E0000C0090AC9ADACA000000000009009AC00090E0DAC0CA9E9ADACB90F00BF900E9C909E9CBF09FAA0F09CA9F0A9000900090F00A000000090A0C0AC00000E09A0C9000F09AC0F00C0CAD0B0C9A9A0C9A0D00000A0000A00000000A000A000000ADA09ACBDB0C009090000000000AC000090BE909A09A90090F0DB0E909F00CBC90B0F090BC90F0D9F09E09C00D00A0000A0000900000A00A0009090BC000000C0A00E000E0A00ADA9A00E0E0E0C0F0E0DA00000000000CA000A00000000000000000AC90A0E9A9E0AC000000000009000A0C90E0000000F0E90B0C9A9E0C9B09AF0F0F0AD9ADADBE0A009A00B0009C00C90F0000C0A09C90C90A0E000B000B00BC0E900E090DAC00AC0E909A009A0A90AF00A0000A0000000000009E000000A900A09A0E9E9ADE9C90A9000000F00AC0000BFE900000F0009CADABC9CB0BC0E9C0DB00F9A0DB00090D000090CA0000A90E0000A9A0D00000A0C00000000000000B00ACA9ACA00B0E0B00ACAC9EAC9CAC0F00000000000000000000000000000CA9C00CB009E09AFAE9CA0000D000000009000FEC09E00090A9C0D0BE9CB0BC9A9E0CB00C9A0CBCBCA09000E90000BC00B0F009C000000A0900B000BC000000CAC0E90BC009CA0CA9C0AD0A9A00DA0BCB0D0000000000A000A000CA00A000000000A0A90CBE9AE9C9F0B0DA00000000000AC9E9A9000000A000B0AD0DA0F0CBADA9B00DA90D0B09090CA00900009C009AD000F0000B0AD00E0000F000A00A0A900B00E00BCAA0F00E0AD0AC0CBCA0CA00CA0000A000000000000000000000A00A0009C00A090C90BAF0FCA00A00A0000BC09A9FC0A00000C9CBCAD0E9ADADB0D0D0C0B090E0BC0A0E9000000000A0B0E000B000A9C00000000000000000009C0CAC0E09AC009C00F0BC0ACB0B0A9CB00FAF0000000A000000000A0000C0000009CACA9E09CBEB0E9C0F0BDAD00000000000ACBCBC0000B00A00909A9AD09E0DA0A9AD0CA090009C90A000000000D0C09000C9A9CA9AC900A9000A00E009C0A0A090A90E0A0E0BCA0C00E90E0CAC0AC9E00F000000000000A000000000A0000000090009A0000CB0EB0FE0F0FAD00000000090E9E9E9000090F0A0E0C0BE09A0DAD000B0D0E90A0000000000000A009A00DA00CA90C00AC000C000900000A9CBCA0C0E00D0B0C0ADA0E90E09A0DA9CA00F0D00A00000000000000000A000000000A0A0A0C00BCB0F00F09F0F0DA0F0000000009E9E00C00CAC00D090B0C09E0F090ADAC0A0000D00AD00000000090A00DA00900000B09000000A0CA000A000A009E0B0F0A0CA9AC00E90E0BC0F00E09EA00A000000000000000000A0C00000000A0D09C0B0BCA0F00F0AF0E9EBED0A90A00000F0E900A0B0090B0ACA0DA9E0900E0D0090090000000000000090AC0D0DA090CA90AC00CA00A000090009C0F00D0E000C0AC0B00CA9E9CA9AC0A00E90E090FF0000A00000A0000A0000000A0000090ACA9E0C09ADADA00D0BDE9C9AD0C00900000A9EE090CBCAC0C090F0C09E0F090A000B00CB00B0000000000009A0A0000A000C900A0C09000000A0C0A00E0A90ACB0AC9E0E0BCA00AC0CBC9CB0CA9E0E0F00000000000000000000000000000C0900A9A0E090F0F0E0E0B0FACBE9A0C0A000AD0900E9A0090A9E000B0E0900CA9CB0C0CB0000000000000A0000D0D000C000A0A09090AC0E0000D0A09A090CAC9AC09A09C9E00DA0DA9A0AA0CA9CA0DA0D0000000A00000A0000A00A0000A09A00AD0C0900E00DAD09AD0E9CBC9AC90AC00000ACA090D0F0AD009E9C090E0B000000B000000000000000000F0A0A00A9000D09C0E00A900000A00000C0CA0B0A0CA9E0CA0A0BE00F0CAC9C9E9CA0DA00CB00000000000000000000000C0000A00F000B0E0A9AFA9E0AD0E9AF00AC9A09090C0BC9000E0A00DA09E00A00E90C09E000000000000000000000000D0000000A9A0A0900C000B00900A000B0A9C0C0CB0E00B0E90C09E00A90E0A0AA9CA0BCBE0A00000000000000000C000A0009C0000A0C0900C009EDBCA09AD0BC9AC000C0A0000E00009C9E00F09AD0F00090A00000000000000000000A09A00000000C00C0D0CA0A9000C00AC000BC00C0A0B0AC00DAC00E9ACA0CBCAC9E0C9C0AD0E00F0000A000000A0000000A0000000A000BC0B0E0F0A9E00ADADBC0AD0AC9A9E0A0900009E9000A09AC0FE0A009E00000000000000000000000090C0DA000090A09A00A90C00ADA0000000C00A9A0C0CB0ADA00ADA0C0BCB0CA9A00B0A0F0A09E0D000000000000000A0000000000AC0B00090090009009F0AD0E9ADA9CBAC0090CACA00000A0000C09A09C9CA0000000000000000000000A00000000000A00009C00000A900C000BC0B0B0000C00B0A0C0A0CBCA0F0BC0ACBC0CAD0E9CAC9E00BB00000000A00000000A000A000090000C0ACA0E0A0E0E0ADAADADA0DA0D0B0CA000900A000009A09AC9E0A09C0000000000000000000090C0CA09A000C00CA00A09E9C00A9A0AC00000C00A90A0C00E9A0DA009C0AC0AD00A0BC0A0CA90A09E0E000000000000000000000000000E000B0009000D0909ADA9CBCBDA0CB0ACB009000A000C0000C00CBE9C00000A000000000000000000000B09A0C09A090009C0000A0BC0C0909A9E000A0C00CB0E90AD0AD0EA0E90F00AF0E09E9CBCAC9CA9CF0000A00000000A0000000000A0000E0000A0E9A00E0000DA00E0EDA00F00CB0E0AC90C9A0000A0B000A000A000000000000000000000A00000C9A0C9ACA90A09A0D000A9A0E0C0009A0900A00000AC0AC0A90DA0E00E90090E00A00A9A0ACA0D00000000000000000000A00000000000CB0C00C0B00A00A0DA909ADAC00F00C90000A000000009C0F0D000000D000000000000000000C090E9A0C9A0C90CA000C0A0E90C0D00A0000C0E0BC0A0CBC9ACB0CACAC90E09E0E0E9CBCBC0C0F09E0B00000000000000000A000000000A000A000B00B0C09C0B0DAC0FACAD09A00B0A0DA0C0000000000B000A00C00A0000000000000000090B0E90C9A0C900A09C90A90900CB0A0B0CA0E0A9000000A00AC90CB009A0E90E0B0F00A0AC0B0A0CA09E000000000A000000000000000000000000C0AC0A0A000C0A0BA0DA9EE0D00C0CA00000A0000000000F0D0000000000000000000C0BCAD0E9E9AC9A0A009CA0AC00CACB00C0C09009090C0E00AD0CAD0E0ACBCACB0CA9AC00F0F0CB0CBC9AD0EF000000000000000000000A00000000000A00000D000A0000C0DA0F09AF0F0B009ADA00C00A000A0CA0A0F0A000000900000009A0BCB9AD9A9E9AC90C9E000090B0A90CA90B0E0ACACA0A000C00A90A90AD00A90CA9C09ACA000B00E00A0CA00F00000A0000000A000000C0000A0000009000E0A00009CA9A0B0C90FAD0A0ACAF0C000900000000009C0000000000E00C0DAC0E0D000C0A0C00000000A00AD00AC0D0A00CA000090000D000A90AC0E0CADACBCACBCA0AC0BCBCACAD0BC0E90F090000000A0000000A000A0000000000000E900900AC00000C00CBAE0C0ADDF0D00FADA0A000000000A09E0AD0CA0000A0B009A900ADA9A9C9A9C09A0000900A0CB00AC90B0C9ACACB0A00A000000A90BC00A00DA009AD0BC00AC900AC0B00E00E000000000000000000000000000000000000AC0000A0A0A9E9AC9C9AF0A0ADACB0DAC00D000000000000D00A9C900090CA0C00E90000C0A0CA0A0CA900CA0CB000090AC00A009000C000C000CA90E0CB0F0F0A0F0E0AC0A0E90E9E90E0DA09EF0000000000000000000000A00000000A00A000A000000D000E9A0AC00D0F0E9ACA0DADA0AC0CA0000000A0F0A0E0F0E90DA9E90ADADA90DA9C900000E0009000BCAC09AC0DACA00000C000A0000E9AA0E000E900A9C0BC0B0EA0A0E90A0CA00F000A0000000000000A0000000000000000000000000000A0D0E9E9A9E0A009ADADA0DA9C90A0000000A00000D09A0BCADACB0E0D00000E000A0E09CB09E0A0E0009A9E09A0090C0A000B00C090E00C9C0ADA0E0F0E0AC0F0C90D0E00E9E90F0900000000000000000000000000000000000000000000A000A0BC0ADE09CADAC09A0DA0E0A000000AC00C00C0A0E09C09AC90E09A0CBCB090F0090A000E09C090F0AC000AC0AC0A000A000000A000F0A0F0AC90B0C0BC9A00A0E0A90E9A00E00E000000000A000A000000A000000000000000A000000000000000F00BE0B0A0BCAC9ACB0D0F0D0E00000000A9009CA0AC00A0900CB000C0E00C0AD00E0900B0E00D00CA900900090C00C00A0000F0A0DA0C9ACAC0BE0AC0E9CB0F0CB0C0CB0CAF000000000000000000000000000000000A0000000000000000000E909C0F09CB00E90C0A000A09000A9A0900E0000D0A90D00CA00F0A0090A900A0090A0E090F0ACA90C00E00A00A00000C00000C9A0CB0E090AC00D0A90A0C00A0CA9A0CA90F00000A000000000000A000000000000000000000000000000000000ACAF00E00CB00E9AD0E00000E00C00A0000AC9A0D0E0A0A9000090A0000AC0DA00C900E00009000A00000C00000A0000ACA0A0CB00E90EADACA0AD0E9E0AD0F00E0DA0CA900000000000000000000000000000000000000000000000000000A0DA909E09EB0FE9AC0A90E0A009000C00C9000AC00A0BC90C0E00E0D0E9C09A00C0B00F00BC00CA000A000A0000000A0000900DAC0E90E9000B09CACA00BC0A00E90A0DACE000000000000000000000A0000000000000A000000000000000000000E0E9E00C009E0BD0E090C000A0A000A0E0900F09C00E0A90F090A000A00000B00E00000A0A0009C0009000CA000000000E0A09A0CA0CADACACA090DAC9E0CB0CAD0A90FA000000000000000000000000000000000000000000000000000000A00B0E9E9ADA09E0A09ACA90AC9C00B00000E000E0AC909C0000E000A90AC9E00F00BCAC0000B0CA00A0C00A00000000A000D0E00F09E90AD00ADA0E00A00F0CB00AC0E0D000000000000A0000A000000000000000A00000000000000000000000D0090A0CA0DE0F0F0C90CAD0A0BC0CBCB000F00090ACA0A0A000D00C090A00C0000009AC00C0A000000A00000CA0000CA0A09AD0AC0AC0A0F000E90F0DA00A0CBC9A00B000000000000000000000000000000000000000000000000000000000A0A0E9CB0DA090E0F0ADA90AC9CADA000E0F00BC0ACB0D0D0C9A0A0A00AC09A0AC0B0E00A90000000000000000000000090CAC0AC0BC9A9C0A9E90E00A00E9CA00AC9EE0000A000000000000000A00000000000000000000000000000000000000C900AC0A9CAC900BCA0CBC9EB009E9E900AC0AD0000A0A9AC00D0DAD09AC009A0C00900CA000C0A000000A00000000ACB09AC0B0CAC0E0F0C0E00AC9E90A0DAC9A00F00000000A000000000000000000000000000000000000000000000000000A009AD0A09A0E009C0BCA09CF0E000E0D0000ACBC0C0C09ADA0A000A000A0C0B0AC0000000000000A000000000A0000CAC0BC0A09A0900A900F09A00E0DA00AC0F0D000000000000000000000000000000000A00000000000000000000000A000C0AC0ADAC0F09E0A9E0DACA009ADA9A0ADA0090A9A9A0C000C000AC0F00DA0C000A000000A00000000000A00000000A90AC0F0DAC0E0E9E0E0CAC0F00A0CBC9A00B00000000000000000A00000000000000000000000000000000000000000000000BC009A00E009E90A0B0ADAC000CBC00DACA0C00C0A0A00B0E90000A00000900CA0000000000000000000000A9E0CAD0B00A00F0B000A90A90B00F0CB00AC0EE00000000000000000000A00000000000000A000000000000000000000000A00000B0E00CB0BCA0E09C0D0009ADA00BCA000C900A0000D0000000A0000000ACA0000A0000000A000A0000A000000B000AC0E0DA00CACBC0E0E0CAC0A0CAC0A90F000000000000A0000000000000000000000000000000000000000000000000A000090E9AC00BC09E0A0AE90C00090090F00A0E0DA09000AC00C000000CA0000000000000A0000000000000000000E9C0B09A0CB0AD00A0900B00BC9A09AD0E0D00000000000000000000000000000000000000000000000000000000000000000C0AE9C00AC00A000D0D00A0A00E0E0E00F0000000E000000A0000E0000000000000000000000000000000000E0E9A0AC0E0DA0C0A0E9CACAC0E00AC0E00A00B000000000000000000000000000000000A000000000000000000000000000000A00D00A00900B0D0B0A000C90C000900000000A00000A000000000000000000A000000000000C0000000000A00900CAD0A09A0C0B0D00A0B00B00BC0B00AD0FE0000000A00000000A0000000000000000000000000000000000000000000000000A0F009ACA0C0AC0C000A0000B0000ADA000000CA00000000000000000A00000000A000000A00A000A0000000ACA90AC9E0CA9AC0A0E9C0F0CAC0A0CAD0A00F000A0000000000000000A0000000000000000000000000000000000000000000000000E000000000A00A0000A0000E0000CA00000000000A000A0000000000000000000000000000000000000C09CAC9A00B0CA09E090A000A09AC9A00AC9E0D000000000000000000000000000000000000000000000000000000000000000000000A000000A000000000000C000000A0000000000000000000000A000000000000000A0000000000000A000A00A0A0C9E0CAD0E0CAC0F0E9CAC0AC9E00A00A00000000000000000000000000000000000A000000000000000000000000000000000000000000000000000A00A00000C0000000A00000000000000000000000000000000000000000000000090E9C9C0A00B00A00B09A000A00A9C0A09AC9EF00000000000000000000000000000000A000000000000000000000000000000000000000A0000000000000000000A00A00000A00000A000000000000000000A000A00000000A0000000000000E00A0A9E9E0CAC0F0CAC0CAC9E9CA0BCAC0A00F000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000A0000000A00000000000000000000A000000000F0C0A000B09A00A90A909A000A0C009AC9E0D000000000000000A0000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000A00000000000000000A000A9ACACAC0E0DAC0E0E0E0E0E9E9ACA0A000A00000000000000000A0000000000000000A000000000000000000000000000000000000000000000000A000000000000000000000000000000000000A0000000000000000000000000000000009E0C09090A090A09A090009090000000D0C9EF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000A000000000000000000A0000E009ACACAD0E0E0E0CACADACACACBCADA0A0A0F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000A00000000000000000000000000000000000000000000A000A000000000000E0090A00A90090A090000A00000A00CBC0D0D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000A0000A000A00000000A000000000000000000000000009A00E0E9CAC0E0E0DACACAD0DADAC0DA000A0AA000000000000000000A00000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000A0000000000000000000AC0DA9000A09A0900A000B000A00090A00CA9C0F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0CADAC9E0CACAD0CBC0CAC0E0E0E0E0BCA0AF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090A000A000B000A000A090B090900090000D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ACADACBCADACADACBCADACACACACADACADACA0F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010500000000000020AD05FE','Margaret holds a BA in English literature from Concordia College (1958) and an MA from the American Institute of Culinary Arts (1966). She was assigned to the London office temporarily from July through November 1992.',2,'http://accweb/emmployees/peacock.bmp'); +; +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(5,'Buchanan','Steven','Sales Manager','Mr.','1955-03-04','1993-10-17','14 Garrett Hill','London',NULL,'SW1 8JR','UK','(71) 555-4848','3453',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C00000000000000A0000000000000000000000E900000000C9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D000C000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000A90000000000000000000000CA0000000E900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000C00000000C00000000000000090000000000000000C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000A000000000000000000000CA00000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C00000000000000000000000000000000909000000000000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090000000000000000CA0000C000000000000000000C000000E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000C90000000000000000CA9000000E90900000000000000D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000AC0000000000009000000A0000E0E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000900CA0000000000000000B00E900CB0900000000C00000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C000000E000000000000000000CA00F0000DA00000000000000000CACA90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009CA0000000000000000C0000000A90CA9C9090000009000C0C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0000C0B0000000000CA000E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000CA09009000000000000E9000000000000000000000000000000000000000000000000000009A0000000000000000000000000000000000000000000000000000000000000000000000000000000000C0000C90000000000000000000000000C000DA09000000000000C9CE0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C000000000000C0CA00000000CB0D000000000000000EA9000000000000000000000000000000000000000000000000000A0B000000000000000000000000000000000000000000000000000000000000000000000000000B00000000000A000000000C0000C0000C0D00C0F09CB0B09000000000000DE0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D0000000000000CA9E9F0B0F0B9CBCB0D0000000000000000CF0000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000C00000000000000000000000CB9C0D0A9C9ADCB9AD0B090000000000000EFA9000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000C0A90000000000A00000000E0DE90CB9AD9CB0DB0F0DBC900000000000000000C000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000000000090000B0000000000000C0000000C9CA90F9AD0DA9AD9AD90F00BCB09000000000000C00000000000000000000000000000000000000000000000000000A9A0000000000B000A00000000000000000000000000000000000000000000000000000000000000000000000009000E0F0BDCB0F9A9A9C90BC9AD0F9C909000000000000000E000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000C0C90DAD0B0D0C9C9CBCBC9A9CB9CB0E900000000000000E0900000000000000000000000000000000000000000000000000B00B00000000A000900A00000000000000000000000000000000000000000000000000E00000000000000000000A0B0E9A9AD0F0B9A9A90909ADF99CBC99CA900000000000C0C0000000000000000000000000000000000000000000000000B00A0000000000000A0000B0000000000000000000000000000000000000000000000A000900000000C0000000000C0CB0D0D9A99C0D0D9E9E9C900FCBDBE99C09000000000000A0000000000000000000000000000000000000000000000090C00900000000000090000C000000A0000000000000000000000000000000000000000C0900000000000000C0000C09090DA9AC9CA9B0B009090B0F90BC0D9E9B00000000000000D0000000000000000000000000000000000000000009A900A0090A0000000000A0A00000A000000000000000000000000000000000000000000000000E0E000000000000000C000ADADA90DB9A9D0C90F9E0F0D90F0DBFADAC9000000000000CA000000000000000000000000000000000000000900000000DA0000000A0A0B0090000000000A0000E90000000000000000000000000000000000ACB000900000000000C0000AD090090DA9C0D00B9E900990B0E90DBC0DBDBC90000000000DAD000000000000000000000000000000000000C0A000000CB0090000C0F090000A000000A900009A000A900000000000000000000000000000000C90000000000000000000CA9000ADADA9CB9A9BC0090B00E90D9EBC9F9EDADB0900000000CACA0000000000000000000000000000000090A0B0000B0DA000A000ECBA00A0A009000000000A0000000C0000000000000000000000000000000000000000A0000000000000000090D09090B0C9009A90C0D090F0A9C9ACB9ADBCF000000000000D00000000000000000000000000A0B0CB0C000090000000090D00FF0C9E9090A00000000000000000CB00000900000000000000000000000000CB000000C900000000000090CBCB0BCBC9C9B00F0D00B909AD009C9BC9FCDBE9B0900000000EDA00000000000000000000000ADAC90090009000ACB000090E00A00EBEA0ACA9000000A00A009A00000E90000EB000000000000000000000000000000000000000000900E0090009C909A9A00C909A9D00AD009F0BC0ADA9BC9FCB000000000000000000000000000000000EFDFBDADA00A009A9000009A009A90000C9EF9ACA0000A90090000000000ACB0000F000000000000000000000000CA0000000000000E000E9000A9F0B0F00D09DA9AC900A9D0A9E00D0BD9ADE9FE9FC9000000000C0000000000000000009EFFFFEBCB0090090A0009009A000000C0000AEF0E090000A000A000A0000000CB00000CB0000000000000000000000009000000000000009E0000909C09C909A09CA9C900F90CA9C099F0F00ED09E0DBCBB00000000CA000000000000000CEFEFFFFFBDF0DA0000090C0A0000090E09A00000DEBC9A00B0000A90A000000000FE90000A90000000000000000000000000000000000900000090F0BCB0B0B09AD9A09090B900A99090F0009AD9A9E9F9EDE90000000CA90000000000000CFFFFFFFEFDEFA0B090E9000B0090A9000900090000A0EB00A009A9000009000000000FF00000E0000000000000000000000CA000000000A09A9E00000D0909C90BC900C9ADA9CAD09000F90E9F0DA0DAD0FADBDE90000000C000000000000CEFFFFFFFFFFBF9FD00A900A0000000C00A0009E00000000000DAE000A0A9A000000000ECBC90000B00000000000000000000090900000000C0C0000F09B0B0DA09C0B09A900900900BC9F0009000B0DA9DAD0F0E9F0000000000000000000CFFFFFFFFFFFFFFEF0BC9000090900F09000900A09000900000A0E09ACA090000000000000FFB00000CB0000000000000000000E0E0000000009A0000909E909C909A900D090F90E9A09090090BC990C9A9CBCBCDBFDA90000000E000000CFEFFFFFFFFFFFFEFFFF9FA9A09A9C0A0000A090009C0A0000A09A00FA9AC90B0A00000000000EFE9A0000A00A0000000000000000C0900000000000090ADA9E90DA9A9C90F90AC900090C909A09AD000E09E9CBCBCB0EDADB000000C0000CFFFFFFFEFFFFFFFFFFFEDFAC0D09000000900900A0CA000D000000000000CFFEAC00900000000000FFF9000009000A00000000000000ADA9000000000E000909099A909090A90A99B00B009000C09C009A90900F0F09EDF9EDFC000000000EFFFFFFFFFFFFFFFFEFFFFFBFDBB0A00000B000A00900090B0A0A0000A00000ACADB0A0A0000900000C0FFEB0000A0000000000000000000C0E000000000900DA9CBC9C9AC9A90C90C0090090A90B09A90BC0090F0090F09A0F9A9B000000E0CFFFFFFFFFFFFEFFFFFFFFFFFEBC9D00DA90000900A009000009000A0090000000F0E09000000A000000FEFF900B00000000000000000000CA9000000000000B909B09A90990C90B09A90F090C900000000009AC009E0F0FCFDADFCF900000D0FFFFFFFFFFFFFFFFFFFFFEFDF9FFA0B0000090F009C9000A0D0E000900A00000A000A9A000000000000CEFFE9A00000A900000000000000CB00000000000ACBD0F0C9099A90A900900900000A900090900900000ADA090D0B9A9E9E900000CAEFFFFFFFFFFFEFFFFFFFFFFFEBEF00D09A09A000000000A0900A900A00009000900A00000000090000000FFDB00000000A0000000000000000F0000000000990B99B90BC0DAC90B0C0BC909090009000000090909000D0E9EDEDE9E9F000000CFFFFFFFFFFFFFFFFFFFFFFFFFFDBF9A000000900090A00900090000000A0A00000090000C0000E0900000E0B000A09A0D0B0000000000000AC0F00000000CADBCBC0BC99A0990009A90909A009000090090000000000A90B00B0FCBCFB0000CFFFFFFFFFFFFFFFFFFFFFFFFFFFADAD0B0909CA09A09090000A09E0090A0900000A0A00000A90000A00000B000B0000000A00000000000000DE900000000C9B90999909A090A09090900A0009000900000000000009000C0C9EDE9F0F090000EFFFFFFFFFFFFFFFFFFFFFFFEFBFFFB0B00CA0009000000A0DA9C0090A00000A9A00000000A9000B000000000000000000000000000000000CE9A0000000E9BD0F9A0E9AD90D090BC0009090900900000000000000000909A9AD09AE9E9E900CFFFFFFFFFFFFFFFEFFFFFFFFFFEDB9CBC90090900009A009000000B000090A0C00000B000000A000D09A00A00A0000EB00A0EB00000000000CBC09C000099F09B9C99909009A900090B000000000000000000000000000000C0A0FD9E9E9000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFA900B000A90B0009009000B0C00A0A009A9A90000A00000000A00000900000CAF0B00CFFF9000000000ACBE000000E99F9CB9E9A909A900F09A0090900090000090000000000000000000DA0AD0F9E90CEFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDBCB000900000C900E00A9000B0090000A00000A0090009A0E909A0B00A090EBE90000FFFFB00000000C0F0900000F9BF9B99090D0B0D0990900900000000009000000000000000000900900D0AD0EDA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADB009A00C9A90A0909000C09000A090A00000009A0000E0F9ACA00000000A0090000EFFFFFF00000000FE9E0009DB9E9DADADA9A9C90B0000090090090900000000000000000000000000C00BC9E9B0DEFFFFFFFFFFFFFFFEFFFFFFFFFFEFBEBF0CB0090B000009A000000BC00000A09090A00A0C0A000F0ECBDADA0A9000B000A0CFFFFFFFFB00000E0F00900CAFDBDB99909C909A90090B0000000000000000000000000000000000009AC00E9ECFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC9B0C0000000090000090B000B00B000A0A000000A9000000B0CA009000A0000A000FFFFFFFFFFFF9000C0FA0009F9F9BCBDA9A90B090DB000909090000009009000000000000000000000009C09A909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBE9B909A9009A0B0090A0090000000B000000009000E900A000A9E0AC0A09A09000EFFFFFFFFFFFFF000AF09000F9FBF9B9A9D090D00B000900000A0909090000000000009090000000000000A9C0DACCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCBC00A000A9000C0B00900CA09000A000A90000A0A00A00C90A9CA900B00000000FFFFFFFFFFFFFFFB00C90000FFFBD9F09D9A90B0B9090900900909A00000000000090000000000900000E090C0B00FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBD0B09090D009090C0000A090A0A09009000A00000B0DA00AC00ADEFA09E0B00EFFFFFFFFFFFFFFFFF90CA000CF9F9FB9F0BC9AD09C0090A900900000909000900090009009A90900A90090C00B0CAD0CFFFFFFFFFFFFFFFFFEFFFFFFFFFFFBFBA90000A000A00A009A090009009E00A00A90090000A00000B00000EDF0000EFFFFFFFFFFFFFFFFFFFFB0D0009FFFBDBDBD9B090B09B009009A090900000090090009C0090000DA90009009A9C09000B0CFFFFFFFFFFFFFFFFFFFFFFFFFFEFDEDADBCB090B0909090090090A000A90B00A000A00A0009A9000CA9A90AA0FFFFFFFFFFFFFFFFFFFFFFFFF9A000EFBFDBDB09AD9E909009009000900009090B00900DA09090D090000909C9C09CA9E9AD0DAFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBDA090C000000A00A000A0009009CA00009A0D0000B0ACA000A9C00AC9CBEFFFFFFEFFFFFFFFFFFFFFFFBC090FFFDBBCBDBD0A9090090A90909009090A09009009009A909A9E9099AD0B0A9CA9C00C00ADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBC9A00B090B090909090C900A9A09E09A0000A900C009C0000E0BC9A0ACBDFFFFBFFFFFFFFFFFFFFFFFFBC00FFFBFDB909A9909ACB0C90A00090A00909E990A9A90C90BC9090B0C9090D9E09CBCB0BC90DFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB0B009000A000CA000A000A09009E09E00A0A9C0B00A0A0B0009E0A0D0F0AEBEFBCFFFFFFFFFFFFFFFFA90B0CFFFF9BDFBD9E9909009009090BC9090F090AD90D09B9AD0BCBD0DB0DB0F0B9FE9CBCD0BCA0FFFFFFFFFFFFFFFEFFFFFFFFFFFBEFF09A090909C909009009000000C90E9A90900A9C0B0900000A00F0DA000D00CB0EFFFFFFFFFFF9FA90000C0BFFDBFDB9CB090E90090A9090000909A90F990ADA9E9C99F9BD0B0C9B0D0FDE9DEBDA9AC90DEFFFFFFFFFFFFFFFFFFFFFFFFFAFDB0DA90A0000A000A9000A090A9090A9A000A00D0A90C0A09A000E0EA9CBFABCB0B09E9CAD0A900A00000000BCFFBFDBBDB99E990B9090900F909A0F0DB09CBD99C90BDA90D0BD09B0DBF9CBDEBDECBC9ADA0FFFFFFFFFFFFFFFFFFFFFFFFFFDBADB0C0909A909A9000090000000A9C0C9A00A0A09E9A90A0090900D0A0C0DEB0C00A00B0A900000090009000CFFFDBFDA9E990A900A9000900F0990B9CBCB9ADA9BD09DBDBD9ADBCB0D0FBCFFDADBCBC90DACFFFFFFFFFFFFFFFFFFFFFFFFFBFDA009A00C000000D09A009A9090CA90AC909090E00C0E9000A0A00AFCB0E0F9A0FFCB00000A9A90000CFA900CFFBFBDBDB90E9090D0090B09009E0D0A99BC99AD90BDA9090BC90D9D9AD0D0F0FDADF0BCB09ACFFFFFFFFFFFEFFFFFFFFFFFFFAFDB00909A90B0900A0090000E00090A90A0A00090B0B00B0A0000AD09E09A00CFFFFFFBCB0000CA9ACB900000FFFFDFBDBCB99C0B090A9C90B9A99A9DBC9B9E9B0F9B9DBDBDBDB9A9E99F9F9FFADF0FDADAD09EFFFFFFFFFFFFFFFFFFFFFFEDF9ADA90A000000A090900A0909009E0D0A09000A0E09C0F0C909A000AFE9AC90FFFFFFFFFFFFFFB9D0DA000000FFBDBBDB09900A909090900B0C9DA9DB09F9C909D90D9A9ADBC9BC9F99E9E9EDADF0FF0BC909E9FFFFFFFFFFFFFFFFFFFFFFFBFAD0900090090909000A0D00A00B090A0D0A0A9009CA9A00B0E009A9C0BE90A0CBEFFFFFFFFFFFFF0BEF90000CFFFFFDB9DBCB09090A090A9C99B0DB09F090B9F9ADB9F9D909B0D9F9EF9F9F9F9E9FE9EDB0F09ACFFFFFFFFFFFFFFFFFFFFFFF9F0B0AD0A9A0A0000B09009090900E900AD0000A0A0D090C0B0F00CA0C0FEFDA009ADAFFFFFFFADA0CFFF90000FBF9FBDA909090DA99C0990B0F0B09F0BDBD090F990F9A9F90DB0B0D9EBD0FCBCBD0DF9EDB9E0D9AFFFFFFFFFFFFFFFFFFFFBFE9F0D00900909C9A000000A00E00090E900A9E00C0B0A0CA9C00BCBCBFFFFFFFFBC00000CB0BC9A9CFFFF00000FFFFFDBDBCB0F009009B0C90909DBC990909BDB9ADB90D909F00D0DA9990F99F9DAFF0F90FC9F0ACDFFFFFFFFEFFFFFFFFFFFFBF0B0B00090000A09C9A9090909A9E090A0D009A0B0C90A9CA9FCBCBFFEFFFFFFFFFFFFEBCFE9E9EBFFDA9000CFFBDB9A9090900B90B000B0F0BCB0B9E9A9F0B09D99C9A90900900B0D9EDBDE9FCBD0FD0F09B00D9EFFFFFFFFFFFFFFFFFFFF0F0BC900A9A0A90900A0000AC0A09090AD09A9A0D0C9A0BCA0DA09EFDEFFFFFFFFFFFFFFFFFFFFFFBCFFBDA0000FFFBFD90F0B0090C9090909099909D099D09D9DB0B0B900F009A90D0B09BC9BCBBCBF9AF0FADADA09EFFFFFFFFFFFFFFFFFFFFFF90A090009C0A09090909090D00CA900AC00DA0B0C9C09CB0DAC9AFFFFFFFFFFFFFFFFFFFFFBDFF9CFFF99000FFDFBBC909090090A9CB0DA9E9ADA9BCB0B0B909D9D0D9009000C9A9C9E9BCBDDBD0FCDBD09090DA9CFFFFFFFFFFFFFFFFFFFFBDE9DA09C0090900A000A000A0B0A90E909A900D09A0B0F00FADAFCFEFFFFFFFFFFFFFFFFFFFFFF9EBFFF0000CFBFBDB9A90F09A090900909090D90D099D9D9CB9A909A0900090900CB090DBDAF0FF9FADA9E9E9BCF09EFFFFFFFFFFFFFFFFF9EB9A009A0B0A00A9090909A090009C090A0C0E9A0E0D0E00F0D0F0FFFFFFFFFFFFFFFFFFFFFFFFEBDFFF0B0000FFDFB9C0DA9090DB09A90B909A9A9A9E9A9A9B9C99A9090909000009090DADAD9FF9F0DB9E9C9AC90BCFFFFFFFFFFFFFFFFFFFF9E909009000909000A00C0900F00BCA0D0B090C909A090F00FADEFFFFFFFFFFFFFFFFFFFFFFFBDF9ACB90000CFFF9F09B09090B000090D0A00D09C9999D99C09BD09C90000C9090900F0BC9DFFD9E9FF9E90B0D9E9CBCFFFFFFFFFFFFFFFFBF0B0F00B000900A0DA909A900E90900900A9C0A0B0E0DACB0F00F0FEFFFFFFFFFFFFFFFFFFFFFDFFEFBDEF90000FFBF9F09BCB0D099BC0B090D0A90B0E0B0DB99C90B090B9090A9090F90D0FA90FAFDF9AD9E9CB0A9E9CBEFFFFFFFFFFFFFFFFFFF90B009E0A90D00000000B000A09E0AD00A9C9C090A09C00F09EFFFFFFFFFFFFFFFFFFFFFFFFADBD0B090000EFFFDA9BC9999A9A00990909090909999D9B090B9F9DB900D099CBDA90F9F9DFF9FDBDEDB090B0D9E9EBD0FFFFFFFFFFFFFFFFFBDAF00900900A00B09A090009AD0000909E90A09ACBC9CB0F0FEFFFFFFFFFFFFFFFFFFFFFFFFFF9E9E9C00000DFB9B99C90F0AD90D09A09A09A9E9E90F0B0D9BC909A9CBDB9BCB90DBDF9E9FBCFDBCBB90BCBCB0E9CBD0FFFFFFFFFFFFFFFFFBCF900BCA90A900900009A009E000E90CA000C9AC900B0A0F00F9EFFFFFFFFFFFFFFFFFFFFFFFFFFBDA09A0000EFFF9CA9A90990090900D009C90909A999D9BC9BDBD9F9909C99C9F9CB0DBDEDBF0FF9DAD09F0C99BCADADEFFFFFFFFFFFFFFFFBA9E9090090090A90B0009A009A990B09C9A0C90E9C0D090F00EDFFFFFFFFFFFFFFFFFFFFFFFFFFCBDB009000DFBDBBD99F9E9B090B90B09A90B0909CA9B09BD099A99E9DB9DA9F0F9DBEDBDFDFF9FE990F09F9EADBCBCB9FFFFFFFFFFFFFFFFFDA9A0090A9CA900C09A009000C00E000A009A0A90A9A0F00F0FBEFFFFFFFFFFFFFFFFFFFFFFFFBFF0F090000EFF90DA9E9099C90B0C9090909D0BC9B9D0DBCBDBD9DB99A9CB9D090DAD9FCFADE9F99DA90DADA9DADBDBCFEFFFFFFFFFFFFFFF0F9C90B0A9009009A9009C0A9A900909AD0F00C90E9C0F00F0FDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF900000CFF9ADBD990BDA9B0D09B09E90B0090B0909A99909BCB900909000090909CADF9F9F0BCA9DA9BDBDADACBCB0FFFFFFFFFFFFFFF9FB0B0BC0900B00B000090A09C00B0AC000000B0E900B00E90F0EFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDE900000FFBDA9ADAD9AD09B0B00909AD09B0909CB99DADBC9909090000990000000909C000D0990090DA9CBC9FDBCF09EFFFFFFFFFFFFFEDAD00900F00B0CB090A09000BC0D09ADA9AC090E9C0F09E00F9EFFFFFFFFFFFFFFFFFFFFFFFFFFFEBFF90000FFBDF9DB9AD9BD0D09BCB090B0D000DB00F099009000000909C0AD0BC909C0A909000009A0F9FA99F0F0F9F0F9EFFFFFFFFFFFFBF9A9A0B009009000A90009A90B00A00000C9AC090A900E99F0EFFFFFFFFFFFFFFFFFFFFFFFFFFFF99E9A090CFBCB9FB0D9BC9A9B9C990DA99DA9B900990900090090D09C9C999909009A99C9E9A900000D009D0F0F0F9E9F0FDFFFFFFFFFFFBF9E9C0900B009A9090C0B000C00009C90F09A00B0E9C0F09E0EFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EF0909000F9DBDA9DBBC9B9D0A9A09A9C9A900009000000909B0B0909A9B0F0F9F9FD9E9BDAD0B090DB0BF0F0F9F9EDBCFFFFFFFFFFFFFFFCB090B0A900B000A09A90CB0B09E0A0A00000D0C900A90BC0F9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BE90B900AFF9F9BC99BD0B9D09BC99A9909909000909BCB09D9BDBD9D0909909E9AF9FCBDB0D0DAD09C9B9DADADFADBCFDFFFFFFFFFFFBFBDA90D00B0CA90D000090000A09D09C9A9E0A9A0F0C0E0B0E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD99FD099C9BCBDADBDADBD0B99E99E99E90000000009C990F0BC909A9A9E90E909D9CF9F0FDB0A90BF09EDAF9FDADF0F9FFFFFFFFFFFFFFADADA0A90C9090A09A90A9090DA00A000C00900C900B09C0F0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9B9B909FDBDBDB0BF9B0BC0B90B90B9090D0A909E0B0F99999B9C90D090900BCBCBDADFCB0D9DED09E9BD9E9EDBEDBCBDFFFFFFFFFFFFDBB09C90A9A9A909A00A90AC009009C9A90B0CA9A0F0CE9E9ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDBD09CFBDBDADBD9FCBD9BD0F90F9090A909C00990D09AD0AD0B09000009D09CBDADBCB9E9ACB9B099EDAF9F9EDBCBDBFFFFFFFFFFFBFBC9A9A0900000A0900D0009A9AC00A0CA0C0900D009A9A0DE9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBDB99B0BDB9EBDBDBE9B09A9A99E909CB090909A9009A9090D909090090900ADADAD9ECBDE9D9BD0C9EF9BD0DAFDBEDE9FFDFFFFFFFFFFCBAD009B0A9E90D009A009A00009F090909A0ADA0BC0D0DA0ADFEFFFFFFFFFFFFFFFFFFFFFFFFFFBFB9F9F999FFFBDB9E9F9F9F9D0DA99B9B9090DA90909AD0BDA909E99A90000909090DADBDA9DA0FCB90990F0FBFD0BCBF9E9FFFFFFFFFFFFBDBAB00C9C090A0BC090A0909CA000E0AC00D000D09A0A0D0F0EFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DB9F9F9CFBDFBDA9F0F9F0B0B99F0D09090009C909E9090990B0900D0909000C9E9AD0DADF0D9090090F99F9C9EFDFD0FDFF9FFFFFFFFFFFF0D09B0A9A0B0900B009C0A0A900A90909A00E9A0E0D0F0F0FBDFFFFFFFFFFFFFFFFFFFFFFFFFFBDB9F9FB9FBDFBDBDF9F9FBD9F9CB09B9F9A0900B0A9090B0DAD0990B0090090DB090DCBCBD0B9CA90BCB9CFADBFBDADAFF0F9FEFFFFFFFFB0B9A9E009009C00A900B00A9C9009C00CA0D0900D09A0F00F0DEFFFFFFFFFFFFFFFFFFFFFFFFFF9DBDBDB9DBDFFBDBCB9BDAF9A90B99F0D0909909009D0909C9090900D0900C90000D0F0BDAD0BCA990C90C9B9DBCD0FDBDADFB0DFFFFFFFFFFFCBD09CB0BCA9A90A9C0090000F0A90B090A0E9A0E0D00F0BE0FEFFFFFFFFFFFFFFFFFFFFFFFFBA9F9FBDB9BDFBFF9F9F0F9DF9F9CB09B9B0900F0900009E09A90B0DB0909A909090A90DCBDADD9DA9909B9C9E9FBFDBEFFDBCFF0DFFFFFFFFFBF0BA0900090090D0A900A90B000000C0AC9090C909ACB0C0DADBFFFFFFFFFFFFFFFFFFFFFFFF9D990D9BDBDFFFDBF9F0F9FB9F9B99F90D0DB99090090B0990D09090090909090909D0F0BD0DB0B09CA90D0B9DBCDFBCF9CBEF909FFFFFFFFFBFDBC90A9E9A0B0A0900A900C00B00F0A90900E0B00E090E9FADEFFFFFFFFFFFFFFFFFFFFFFFF9B0B0FBBF99BFFFBF9E9F9FB0F9AD9E9F99B90CA9009009C90B09F9099090D090BD0F0F99C0FF0F9D099C90BCDADFBEDF9FBFD9FBDEFFFFFFFFFCBA09AD0900D0C09A09000A90BC900900ACB0900F09CAD0A0DADEFFFFFFFFFFFFFFFFFFFFFFFF9909DBD9BFFFFFF9F9F9FBDF9F9BDB99AD0B9990990B009A9C900090009A9B9D0B99D9EDB9099090B009A9D9BDBFDF9FFCF0FADF9DFFFFFFFFFBD9F00B0A9B0B0B09CA9090000009A09C900CAD009E09AD0F0FAFFFFFFFFFFFFFFFFFFFFFFFFB90909FBD90DFFFFF9F9F0DBFF9F0BDAD9B9C9A9D009090009099909099C90DA9D9E9ADBFDAD0F9E90900DA9E9FD9FFF0FF9FDB0FBFFFFFFFFBFBEB0B009C000090CA900E090F0B00C90A0CB090ADA09E0ADAD0DEFFFFFFFFFFFFFFFFFFFFFFF90DBDB9090DBFFF9FF0F9FBDB9FBDB9F9BD9B9D9A9B0909090B000B0DADB9F9DB0F9FFDFDFDFB909090F909D9F0FFF9FDF9EDADFF9CFFFFFFFFFF9BC9CB0B0F0B0B0909090A000000B0E90B00AC9009E90DA9EBEFFFFFFFFFFFFFFFFFFFFFFFB9DB909090B0FFFFFF9FDBFDBDFF9F9F9BDB0D9A999C90C909090DB9DB9BDBDBB9DBDBDBFFFFBD0DA90990DF0BDFFFDFFFBEDBF9F9DBFFFFFFFFF9BCA9A900909C0000A0A000909AD0009C009C90E0F00ADA0DBCFFFFFFFFFFFFFFFFFFFFFFFF90999909090DFFFFFBF9BDFBFF99F9F9BD0DBBD9F0909990B000909DBD9F9DB9DFBDBDFFDFFFDFB990DACBB9FDBDFFFDFDFDBDE9EFBDFFFFFFFFBFEB9000E9A0A0B0F09090B0CA0009E00A9A0A090009E90DAE0F0FFFFFFFFFFFFFFFFFFFFFFFB9CBCB090909FFFFFDFFFBDF9FFBDF9F9BB9D9B09DBDA9A909D909A99BD9FBDB99DBDBDFFFDFFF90DA999D0DADFFDFFFBFFBDBDB9FD0FFFFFFFFE9BCBDB9009C900900AC000909CB000909C9C9CA0F0E09EAD0F0FFFFFFFFFFFFFFFFFFFFFFFF99B99990909FFFFFFBF9FDBFF9FDBFDB9DDBBD9F9A999D09D0A09C9DBD0BD9F9F9BDBDBDFFFFDBDA99CBCBDBDBFDFFFFFDEDFEF0DFB9FFFFFFFFBFF9A00CB9A9A9E0A9090B00A000009AC0A0A0B0D0009E090F0FFEFFFFFFFFFFFFFFFFFFFFFB9C9DB90090F9FFFFFFDFFBDF9F9BF9BDF9B9D9B9D9BC9A99A999B09A9B9DBF9F9BDADFDFFDBDBD090DB9F9F9FDFFFFFDFFBFDB9DBF9CFFFFFFFFFF0BC90B00000090909A00009090BAC0B09C90C0A90F00F0F0F0FFFFFFFFFFFFFFFFFFFFFFF999FB909900DBDFFFFFBDBDBFFBFF9FDB9F9F9BD9AD9B99C9090D099D0DB9C9F9F99DB9FFFFFEDBDBF0FDBDBCFFDFDFFFDFDBFDEBDFB9DFFFFFFFF9F09AD0ADA9E9A0A0C009E000E00909C0A00B009E00F00F0F0FEFFFFFFFFFFFFFFFFFFFFFBF909DBD0990FBFFFFFFFFFFF9F9FDB9FDB9F9F9BD9BD9E9B9DB9A9CB9B9CB9F9F9F9BDFDFDFDBDAD9DB9F0FDBDFBFFDFBFFFDAF9E9FFBCFFFFFFBFFAF09A90090009C90A90090B00900A00909AC0F090F09ECA9E9FFFFFFFFFFFFFFFFFFFFFFF999FB909009CBDFFFFFFFFF9FF9FBDF9BDF9F9BD9BD9A99C9A9D99B9C9DB9DBDB9DBDB9FFFBFFFDBEBDEDBDBDBDFDFFFDFDFFFDF9FF999FFFFFFFF0F9CB00F9A9A90A0090A000009A00D0BCAC00900CA00E0B9E9EFEFFFFFFFFFFFFFFFFFFFFB9ADBD9B9090FFFFFFFFF9F9FF9FF9F9BDB9B9BD9F90B9DB9B9DA9E9DBDB9FBDB9FB99DFDFDFDFDBF9DF9BDBDFDFFFFBDFFFBD9F0FFFB0FDFFFFFFBFB0B0E9000C90A90B0009009A0000A00090B0ACB0DAD0D0E0F0FFFFFFFFFFFFFFFFFFFFFF9D99FBD9A9090FFFFFFFFFFFDBDB9F9BD9BDDBDBB0DBDB9D0DA99990B9BD9C99FD9DBFBDFFFFFFFFDFF9FCBDE9FBDBDFFDFDFFEBFDFFD99FFFFFFFFF0F0900B0B0A9C0000000A009C9090DA000C9090A09A9ADAD0FCFFFFFFFFFFFFFFFFFFFFFB90F9FB9D09009BFFFFFFFFBFFFDB9FDBDB9BD9D9B999CB9B9DBCBD9D9CBB9FB9BF9D9F9FDBDFFF9FDADBF9F9F0DFFF9FFFBDBD9EFFFBDADFFFFFFF9F0F0B9C00900B0F00B0900C00A00A00D0B00CAC9CAC0DA9ADAFFFFFFFFFFFFFFFFFFFFFF9999DBDB9B909CFFFFFFFFFFDB9BDF9BE9DBDB9B9DBDB99D09B0990B0B9D9F9DBD9BBD9FDFFFF9FFFBDBD9F9BDBF9F9FF9FFEFFFDFFFF99FFFFFFF0FBA90C0B0F0A900009000090A9000D090AC0B0090A90FA9EDADEFFFFFFFFFFFFFFFFFFFF99E9FBFBD9909A9FFFFFFFFFDBFFDB9BD99B999F0DB099BCB9F99F9F9D9F9BD9BDBF9D9F9FFFDFFDDADBDFAD0F0F9FDFFDFFDFDADAFFF99EDFFFFFFFF09CB0B09009C90B000000A000000A0E9090CB0AD0CB00D0ADEFFFFFFFFFFFFFFFFFFFFFB9999DBDBF9F99C9FFFFFFFFFFF9BDBDBDBDBDB9B99DAD99D90F09090B99F0BBDBD9F9BDFFDFBDBFBDBF09DBD9F9CBE9FFFFFBFFFF9FFF09FFFFFFFBDFA90900CB0A0A0000A09000909090900CA900D0A9ACBCAF0B0FFFFFFFFFFFFFFFFFFFFFF99E99FBDBF9BF9FFFFFFFFFBDFF9F9BDB99DAD9DB999A9B0B99F9BDBDAD9D9DA9F9BD9BDFFDFFDEDBD9F0B0A90FBDFF9FDFDFDBDFFF9F909FFFFFFFADAB0E9A00D09090900000900CA00C0B0B00A9A9C0C9CBC0FCFEFFFFFFFFFFFFFFFFFFFFB9099F9DB9DBD9B9DFFFFFFFFFBFDB9DB9F0B99B09CB99D09D0B09C99099B9BD9F9F99FDFFFFF9F9BDA909C9DAD9CFBDFFBFFFFFF0FCF9F90FFFFFFBFBD0C9090B0A0E0A00900A00A0000B00C09C90C0A0B0B0DB0FAFFFFFFFFFFFFFFFFFFFFF9D90F9FBFDBB9F0FBFFFFFFFDBFDBBDB0D9BD9F9D9B9CB0B9A9C909B0F9BCBD9B99F9F9BFF9F0FA9D00D0B09A90ADBCF0DFDBCF9009FB090FEFFFFFFE90B9A0E0090909C00000000909000B090A0E9AD0D0E9EA0F0FDFFFFFFFFFFFFFFFFFFFFBB99099F9B9DF9F09000FFFFFFFBFDBD9BD0B090B0DA9090C9090B0C99C999B9F9F9B9DFDFFBD990099AD09C9E9DADF9FBFFFFFFB0EDFF909FFFFFF9F9E00090B0AC000090090090000090C0AD09000A9A90C9EDADAEFFFFFFFFFFFFFFFFFFFFF909AD9BDB9B9B9F09000FFFBDFDBF9BD0B99DB9090909C909A09C9000B09E909F9FDB9FFFDFBCBDA09009A9090BDADEDE9FDF9FC90FFFF90DFFFFBFEB9E9E09C909A9A00A0000000E000F09000A0D0D0C0FA090F0DFFFFFFFFFFFFFFFFFFFFFFF99D9ADBDBDFBD90009DFFFFFBBF9FB9B9C9A0DB0909A909009090B0909C99F99F9BDBDFFF9990090009090BCBDADBDBDF0FFFFB0E9FFFFFFFFFFFF9BC9090A000A00090000000A90900000ACBC9A0A09A90DAE9EBEFFFFFFFFFFFFFFFFFFFFFB90909090F9B99A0BCBEFFFFFDFDBD9C9CB999909AD090A9090000090090B09BF9BDBDFF9B0F009090909E9C9CADBCBEDADFBCF0D90BFFFFFFFFFFBFCA9A0A90BC90D0000900090000090B09000090DAC9ECBC9ACFFFFFFFFFFFFFFFFFFFFFFFF99090BDB9F9F00D000DFFFFFFBB9BB9B90BC9A909A90990D09090909A090F9C9BDBDBDFFD90090000000009A9D0FBC9ADAFDFFB0EFDBDFFFFFFFFDA9B0C900C0A000A0900000000A00AC0CA90B0E009A09A0F0F9A9EFFFFFFFFFFFFFFFFFFFFFFB9BDDBDB990900F0F0FF9FBFDBD9C90099B0DBD09DA0D0900B0000090090B9F9F9F9FFBFB9ADB90D0BD9BC90A90DBD90DEBEDF9EFFFFFFFFFFFBFF0F0B0DA9090B090A0009000009009A90C0C090BC0DAC9AD0EDEFFFFFFFFFFFFFFFFFFFFFFFFFDBB9B9F00009000FFFFFFFBDBA9B9000C9B09B0099A0B0D090909C900909BDBDBDFDF90D9000909000000F0DE9CA0CBDFDFB0CFFFFFFFFFFFFEBF0900A00AC000C0090000A0D0000000B0B09AC009AC9AD0AF0FFFFFFFFFFFFFFFFFFFFFFFFFFB9DBD900000A00F9FFFF9FDB9D9D09009B0D900900090909090009A99E9FDB9F9FFFBC9A09090A00000000DA9A090BCFBEFC0FFFFFFFFFFFFF9F090E90D090B09A90000009000A09A9C000A09ADAC90BC0F90F0FFFFFFFFFFFFFFFFFFFFFFFFFFFB90009000C90CFFFFFFFBD0B0B90900090A9000000CA90000900900909B9FBDBDF9B0DB000009000000CAD09000CBCDFFB9EFFFFFFFFFFFFFADA900A0A000C000C0A9000000900C0B0D09C0009ADACB00E09E9EFFFFFFFFFFFFFFFFFFFFFFFFFF090000090000FFFFFFFFBD9F0BD090000900000000DEB900090090BD0FD9DBDFFF9B00900900000000ACB00C09CFBE9FF0CFFFFFFFFFFFFBDBCA9090DA90B00A9000000000000B000A0E0BCBC00090F090E9EFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000F0FFFF9F9FB9A99C9B0900000000000DA9000900090AC9B9BBF9FBDF9C900090000000000900090CBD0DEF00FFFFFFFFFFFFBDEB090E00000A009000900900B000000AD09090009ACB0E090E90FADFFFFFFFFFFFFFFFFFFFFFFFFB000900000000FFFFFFFF9F9D0BB0D000900000000000009009000999ADFD9FFDFB09A0900009000000000090E9FCBF0F90CFFFFFFFFFFFFFB09CA90B09C90CA00A00000000E09C9000A00E9AC90C909E09AD0FFEFFFFFFFFFFFFFFFFFFFFFFF90000000009C9EFFFFBDFF90B90D9B0900900000000009000000909E9F9BBF9FBFDBD90090000000900009ACBDF0F0CFDA9EFFFFFFFFFFFBCBDA9000C00A009000900A000009000A90D0900090A90AC09AC0AD0FFFFFFFFFFFFFFFFFFFFFFFFF900000000000A9FFFFDFBFBD0F0BCBDBD000090000090000B009009090F9D9F9F9F9A9D0A990090000D0C099EFBF9F0EF90CFFFFFFFFFFFFFDADA9CB0B0900A0D0009000090000B0CA0ACA90E0D0BC9AC090DADADFFFFFFFFFFFFFFFFFFFFFFFB000900900000CFFFFBFDFFB909090909B99DA0909A0C9A9009A09A0BD9FBFDBFF9E90A90CA9D00909A9BF0FDBC9E0DF9A0CFFFFFFFFFFFFBE900000000CA9000A0000090A0000C0090909C009A0000009ACA0FFFFFFFFFFFFFFFFFFFFFFFFFF9000000000900FFFFBDFFBD9CB0CB0F9E9CB099B0D09B0900900909D09AD9DBDF9B990909090A09ADADAD0DA9E9E0DEBE900FFFFFFFFFFFBE90E9A90D0A90C00090000000C0B090B00AC00A9A00F09ADA0909FADFFFFFFFFFFFFFFFFFFFFFFFF90000000000000FFFFFFFFFB900909009A90BCBCB0B0090900900900F9FBAF9B9F0F0F000009090909090B0D00009ADF900CEFFFFFFFFFFFBDB00CA0A900000B00009000000000009090BC90D000AC0090E00CFAFFFFFFFFFFFFFFFFFFFFFFFFB000000000CA90CFFFFBFFFFF9B00A9009009090909090009009009A090D99F9E9F99099A90000000000000090DAC9EEF000FFFFFFFFFFFDFADB009000CB0B0000A00000090000B0CA00000A0AD090B00C90FADFFFFFFFFFFFFFFFFFFFFFFFFF90000090009000FFFFFFDFF9F9C90900900900000000000000000BC9DBDA9E9E9FDBDB0D0090000000000000A0009EDF9000EFFFFFFFFFFFADA0DA0C0B000000D0900090A000000009C90B09C900AC0CA9ADADBFFFFFFFFFFFFFFFFFFFFFFFFFB000000000000E9FFFFFFFFFFB90D0000000000000000000909C9090B099F9BDBDB0BC9A99C0900000000C90C9ADEDFB0000FFFFFFFFFFFBFDA9090A90090C90A000000000A909CB00A00C0A00AD09A900CBEFEFFFFFFFFFFFFFFFFFFFFFFFFF900000000000900FFFFFBFFFF9FB09909A90090900000090C0B0BCBD9FAD0FDBDADBD9F9F0B909C90900900F0FCFFFFF9000EFFFFFFFFFFF9A9CA0D000E0A0A00000000090000000909CB09CB00A0C0A9E9C9FFFFFFFFFFFFFFFFFFFFFFFFFFF9000000000000900FFFFFFFFFF9F9AD9C90900A009090009BC9F990BC9DB9BCBF9BCBF9E9F0F9EBE9CBCADADFFFFFFFFA900DFFFFFFFFFFFEDA900A09090090090B0900000000090E00A00000C9C9A9C00EAFEFFFFFFFFFFFFFFFFFFFFFFFFFF900000000009AC0BDFFFFFFFFFBDBDB0B0F0BD909CB09F9E9FBCBDBDBFBCFDBFDFDBDBF9BF9FF9F9FBDBDFFFFFFFFFF90000EFFFFFFFFFFFBF9CB090CA00C00A00000000000900A0909009E90B0A00C0BCBDFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000000000C090D0FFFFBFFFFDBDFBDBD9BC90F9BCBDBDBDB9F9BDADBDBDBF9B9BDBDFDFDFF9FFFDFFFFFDFFFFFFFDE900CFFFFFFFFFFFBC9A0000A9000B00D0000000009A000900A0DA00E00D0F0B0CBCEBFFFFFFFFFFFFFFFFFFFFFFFFFFF900000000009A90A9FFFFFFFFFBFBBDBDBF9BF9BCB9BF9E9F9F9EDBDBDBF9F9FFDFFBFBFBF9FFF9FFFFFDFFFFFFFFBFB0000FFFFFFFFFFFFFAD0F0D000B009A00C9000900000000C9C0090909A000009ACBDEFFFFFFFFFFFFFFFFFFFFFFFFFFB000000000000C09CA9BFFDBFFFFDF9F9BDBDDBFDBDFDADBDBCB9BDBF9FDBF9F9FB9FDFDBDFFDBDF9FFFFFFFFFFFFFDFFB000EFFFFFFFFFFBDAB000A90C00C00090A09000000000B000B0C0A00C9A9E9E09EAFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000000000909A090FDFFFFFFFFBFBDBF9FBBDBBDB9BDB9BDBDBDBDF9FBDFFFF9FF9F9FFFBDBFFBFFFDFFFFFFFFFFFF9C90CFFFFFFFFFFFFF9CB0900A90B0090A000000000090000B000A90DA9AC00009E9DFEFFFFFFFFFFFFFFFFFFFFFFFFFB000000000000AC90FCBF9FFDFF9F9DBF9F9FDB9DB9FDB9FDBDBDF9F9FBDFBDBDBF9FBFF9FDFF9FDFDFFFFFFFFFFFDFBCB000FFFFFFFFFFBEBCB00CAC900000E0009000000B00009009C90C000C909E9E00EADFFFFFFFFFFFFFFFFFFFFFFFFFFF90090000000009E09ADFFFBFFFF9FBF9F9F9BDBF9F9BDF9B9ADB9FBDF9FBDBDBDBF9F9FFBF9FFFBFBFFFFFFFFFFFFEDBD00CFFFFFFFFFFFDB9CB00900A0CB09090000090000000AC00A00B0B000E0009E9DAEFFFFFFFFFFFFFFFFFFFFFFFFFFF900000000000D09C09ADBDFFFFFBD9F9F9BFDBD9F9F9BDF9FDBDBDBF9F9F9FBDBD9F9FDBDFFDBFDFDFFFFFFFFFFFFFFFAD000FFFFFFFFFFFEB0C9A0009000000A00A900000000009A909000C0B090F0000E9DAFFFFFFFFFFFFFFFFFFFFFFFFFF000000000900000B0F9FFFBDBF9FBB9F9F9BBDBF9B9FDB9DB9F9F9F9FBCBF9FBDBFBDBBDFBDBF9FBFFFFFFFFFFFFDFFFB000EFFFFFFFFFFBF9CB0C90BC0B00AC09000000000900900000E90A9C0E000ADADAEFFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000B00F0D9E9FBDFFFFB9DDBF9FDF9BDBDF9B9FB9F9F9F9FF9DBDF9F9F9DBFDFBDBFDFFFDFFFFFFFFFFFFFFD0900FFFFFFFFFFFDBCB009A00000C90900000000090000CA0CB000D00A909AD00DADBFFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000C0090ADBF9FFBF9F9FBBD9F9B9FDB9B9F9F99F9F9BDBF9FBF9BF9F9FBD9FBDBF9FBDBFFDFFFFFFFFFFFFFF000CFFFFFFFFFBF0F09A0C90B09A00A000009000A000A90900090A9C00AC0A9E0AEDEFFFFFFFFFFFFFFFFFFFFFFFFFFB900E00000009E0BCBC9F9FDFFBF9DBBDBFDB9BDFDBDB9FF9F9FDBDDBD9FF9DBDBDBFBDBFDFBDFFDBFFFFFFFFFFFFFFF0F000EBFFFFFFFFFF0BC90A00C0009000B000000000000000090A000A9C909C009C9EFFFFFFFFFFFFFFFFFFFFFFFFFFF900090000009009C9FBFFBFBF9F9FBD9F9B9FF9B9BDBDBF9F9F9BDBBDBF9FFBDBDBDBDBDBBFDBBDBFDFFFFFFFFFFFFFF9000ADEFFFFFFFFF9BCA0090E09AC0C9000900009009000B00E0C90D00A0E0A0F0FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000000900E09E9EBDF9FDFDFBF9DBB9BDF99BDBDB9B9DF9F9BDBBD9F9F9B9F9F9F9BDBDFDBFDFF9FFFFFFFFFFFFFFE0000DFFFFFFFFFBCBC909E00900090A0000000000000000C909000A0B0D090D0009DEFFFFFFFFFFFFFFFFFFFFFFFFFFFB000C0000009E90BDFBFFBFBFBD9FB9DFDB9FF9FDB9F9F9B9BDBF9FBF9FBFDFBDBF9FDBDB9BDBF9FFFFFFFFFFFFFFFF99000EF9EFFFFFFFBF0B000B00B00A090E900000000000B00A000B000C0A0E0ADACA0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFB000D0000000F0DADF9FDFDFFBF9FB9B9FB9F9B9F9FB9F9F9F99FBDBDBDBF9FBDBF9FBDFF9FDBF9FDFFFFFFFFFFFFFF00000EFDFFFFFFF9F0DA90C00C09000000A90009009000090C0900D09090909009F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000A00000CB0F0FBFFBFBFBDF9F9FBDF9F9BDBFDB99F9F9F9FBDBF9F9DBDBDBFD9FBDBF9F9FFDFFFFFFFFFFFFFFFF0B000CFBEFFFFFFBEFB00CA90B00AC9A900000000000A000009A000A0A0E00E0E9E0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000090000000DBFDF9FDFDFFBF9F9DB9BDBDBF99BDFB9B9F9BDBD9FBDBFBDFBDBFF9FF9FFFF9F9FFFFFFFFFFFFFFB9000DBF9EFFFFFFFF90CB090000090000000000000000090B0000F090D090909000FDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000000000D0BCFBFFBFBFFBD9F9FBDBDBFBD9FBDB9DF9F9BDBDBBDBFF9DF9FBDBDF9BF9F9FFFFDFFFFFFFFFFFFFC00000EF0DFFFFFBF0FB00A00AD0A00A00A9009000000900C000D0000A00A0E0E9E0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000000090A9CBDF9FFDFBDFBF9F9FBDBD9FBF9F9FBB9F9FDBDBDF9D9BFB9F9FBDBFFDFFFFDBDBFFFFFFFFFFFFFDB900000CBEFFFFFFFF0F9D090000D0900D00000000900000009A000B0D0D0D09000DCEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009C0000000000FFFFBFFFFBDBF9F9DBDBF9F9F9F9F9F9F9BDBD9BFBFDBDFBFDBFDBDBF9F9FFFFDFFFFFFFFFFFFB000000FF0FFFFFFFF9F0A00CA90A00AC90000000000000009A00090C000A00A00E9EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB900000000009EDBDBFDFFFBDBF9F9FBFBF9BDB9F9F9F9BDBF9E9FF9F9BDBDBDBFDBFFDBFDBF9FDFFFFFFFFFFFFD000000FE9FCFFFFFF9EF0DA900C090090A00B0000000090000009C0B00A90B09E900EDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A0000000009A9FDBFDBDFFF9F9FBD9F9FDBDBDB9F9BDBF9F9FA9F9FF9FBDFBDBFDBFDFBDFFBFFFFFFFFFFFFFB00000C0FEBFFFFFFFFB9B00A09A00AC0009000900000000000D00A0009C0C0C000F09AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9090000000000CBADBFFBDBDFBF9FBF9FB9FBDBF9BDFBD9F9F9DBDB9FF9FBDFBDBBDBF9FBDFFDFFFFFFFFFFFF0900000F0DFEFFFFFFFEDAD09C090009A00000000000000000B009000000B09A0BC00EDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00C000000000909DBDBDFBFBDF9F9F9F9FFBDBDBFDB9FBF9DBFBDBDF9FF9DBBDFFDFF9FFDFBDBFFFFFFFFFFF900000000BEFFFFFFFFFB9E9A00A0CB0009CA90000900900000000009ADA000A09C00BCBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000000000000DA9F0FBDBDB9FBF9FBFDB9F9F9DB9F9F9FBF99F9FBFB9FBFDFB9FB9FF9FBDFFFDFFFFFFFBD00000000FEDBFFFFFFFBDE900090900000000C0000000009000009E0000909C9C00B0CBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9000000000009ADA9DBDBDBFFBDBF9F9BFF9FBFB9F9F9BDBDBF9F9F9DF9F9FBDFBDFF9FFDBF9FFFFFFFFCF00000000D0FFFFFFFFFFFA9AC9AC0A009E9A900A900000000000900900000E0A09A00CBCBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00900B000000009C9ADB9E99E9FDBF9FDB9F9F9FDBF9FDBDBDBDBDBFBDFBF9FBDFBF9F9BFDFF9FDADFFFFB90000000ACFBEFFFFFFBFDF9A00900D000000A900000000000000A000B0009000C0D0B0ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00E000000000000BC90F9FF9DBBD9FBBDFBF9F9B9FB9BDB9F9FBF9DBFBD9F9FBDF9FBFDBF9FFFFFFF0F9000000000CFBCFFFFFFFFFBAC9C9A00A0A900C00000000090090009000C0BC00D0B00A0CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90000C900000090900BC90B99FBDFBF9DB9F9BDBDF9DBDBDF9FBD9FBF9DBFBFBDB9F9FDBF9FFE9F9F0F9090000000ADADEFFFFFFFBF0DB0A0C09090C00B000090000000000000A90000B0A00A9C9EAFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0090000000000000909AD9CB9CB9D9FBDBDBDBDB9FBDBDB9BFDBFBDDBF9FDBDBFEBFDBD9E9F9F0F090000000000C9EF9FFFFFFFFFFFAC90090AC000B0009A00000000000000900A900090D0C0A09CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90C000000000000000090A9CB9FBAD9FBDADBADBF0F9F9FF99BC9FBBDBF9ADF9BD9DBEBF9E9F0F0F090000000000CBEEFFFFFFFFF9F9BCB0A090A900C0A000000000090009AC000C00C00A090D0EBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0009009000000000900090B0D09DB099B9BD9BD9F9F9F99FFDBF9CFBD9FDBBFDBFB9D90F09CB090000000000000FC9FFFFFFFFFFFBE900C900000A90900090000000000000009000B0A090CA00FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000CA0000000000009009090BDB0BCBC9D0BD0BDB9F0BFB09B90B990B09AD09AD0DA0F09CA0000000000000CCEFBFEFFFFFFFFF9E90E900CA0D0000A000000009000000009000B0009C0A90DA9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000C0000000000000000000000909090AD00BDA9E9F009DBC0F9CBC9CBDB0F00B0900000909000000000000BFBCFFFFFFFFFFFFBE90A0B0900BC090C9A0000000000000000A0000C009C0A0C0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000900900000000000000900900900A909A90090909F0B00B90B009A000900900009009000000000000000CEFDEFFFFFFFFFFFEDBE9C00000000A000000900000090009A009C009A0A0090CBEFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000000000900000900000900009090000000900900000900900000009000000000000000000000FB0FFFFFFFFFFFFBFBC9A090ACB009000A000000000000000000009AC090DA0E9EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000C00000000000000009000009090009000000900090090009090090090090000000000000000000009CEBCFFFFFFFFFFFFFFDE9A90AC9000A0C090900000000000000009A000000000900FEFFFFFFFFFFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFF009A00000000000000000000000009009009000090000000000000000000000000000000000000000E0FFFFEFFFFFFFFFFFFFBBF0C9000009009A00000000000000000900000900F0ACADA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A0C0000000000000000009009000000000000000000000000000000000000000000000000000000C0F09CFFFFFFFFFFFFFFFFD0B0A09A0AC0A000A090090000090000A00C9A009009000CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF900900000000000000000000009000000000000000000000000000000000000000000000000000000CEFEFFFFFFFFFFFFFFF9EBC9C0C09009000D0000000000000000009000C0A00C0BCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000ACFFFFFFFFFFFFFFFFFFFFFEBD0A9000000009A0000000000000000090A000090C0B000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC00000000000000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFBDBA90A9A00B0AC0000A90000000900000000009A009000CB0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDAC9000000000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFDAD0C009C00900009000000000000000009000000AC90B0CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFBAF0B009A00000B0000000000000000090000000C900A0C0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFBCD9000000090E000C00900000000000000000E09A00900BCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9A000000000000000000000000000000000000000000000000000000000000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFBAE9A9E000A009009A0000000000900000B0090000A0C000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCD00000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB0C0090C09000A0000A000009000000000000009C0A90E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA0B00000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AD0B00A0900E000090090000000000009000009000900C9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D9C000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEDA900000000090000000000000000000000900A000A90A0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A9E090000000000000000000000000000000000000000000000000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDB9CA09C900B000AD0A00000000009000000A0000C9000C9C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0090C00000000000000000000000000000000000000000000000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFB90CA00AC0000000000900000000000090000900A0C0A00FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E90A9A09000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFBDADA9000000090000900000000000000000000009009000FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9CAD00D00A90000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFBEFFFFFFFFFFBFDAD000090090AC0900000000000000000000090A0000A09E0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDA9009A0A900D0E000000000000C00000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFB0B9000E0000000A0000000000000000009000000D00000D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9E9E0D0C0F0A9009C90000C90CA000C0000000000000000C00DEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FC0E9A00000900000900000000090000900000900A00C0A0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA900B0B9A0D0E0F0A0CBCBADA90C90000CBC9000000000CBFDAFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFB9B0000900000900000000000000000000000000000909C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9CAD0C0C0F0B090B0DBE9FDA9BCBEFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFCFFFFFFFFFFBFFB0DAC09000A000A0000000000000000000000090009000A00E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDA09A9A9A900C9E0C9A0DAB0BC0F9FFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFBFFB09000000900000900000000000000000090000000000009E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBC00C0DADA9A9A90DA0DEBDB9A9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEFFFFFFFFFFDBDE9E9A090000090000000000000000000000000000090000C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA09ADA9A009C0C90E09EB9E9E9DEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFBFEB9A900000000000000000000000000000000000000000090BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC09E0090C0F0A0B0E90F0DEDBF9EBFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFF0FFBFFFFFBFFEFB9E900000000000000000000000000000000000090000000C0CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0090E9A909C9C900F0FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFF9FBDBC9E09000090000900000000000000000000000000000000A9ACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9E0E900DACA9A0ADA9E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFF9FFFFBFB09A009000000000000000000000000000000000000090000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD09090E9A909C9C900CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF9FFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBDFFEBF9E9E9E9000000000000000000000000000000000000000000000FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADA0E090C00E0A0ADAF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FEFFBEFFFFFFFFFFFFFFFFFFFBFCFBFFFBFBDFFBF9A900009900000000000000000000000000000000000000DADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB90909ACB0B0909C909CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E90DADFBFFFFFFFFFFFFFFFFFFFDFBCF0FBEDFBE9E9AD00000000000000000000000000000000000000000000000ADFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E0C900C0DACA9E0A9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEB0DADF0FBFFFFFFFFFFFFFFFFEBFBFFFDBBEDBF9F9A9090000000000000000000000000000000000000000000ADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0B09A0ADA9A090009C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9CA9A0F0DEBEFFFFFFFFFFFFBFDFCBFBFFDBBDBE9AD0A00000000000000000000000000000000000000000000D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD00E90D0000D0E0BCAF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDA0A90CBCBEBDFFFFFFFFFFFFFFFBEBFDFADBFCBE9BDA0900000000000000000000000000000000000000000000ADADBFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA9E900A0A9E9A90D090DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9CB009009E9ADBFFFFFFFFF9EDBDAF9FADBBF9E90900000000000000000000000000000000000000000000000BCBDBDEBFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF09A9C09C000CA0ACA0ACDAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9E90DA0BC9ACBEDBEBFBFFDFFBF0F9AFDBFCBCB9E9A90900000000000000000000000000000000000000000090C0BCBFBDBF9FFFBFFDFFFFFFFFFFFFFFFFFFFFFFBFFFFFBDB0F0C0A9A0BCB09C909C9ABFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9FDA9E09C000C909ADBDEFEBFBCF0F0FD9AD0BDB9E9AD000000000000000000000000000000000000000000000009ADAF0DAD0BCB0F9EBF9FBEDFBFFFFFBFFBFFFFFFFFBFBFEBC90B09C0D000C0A00E9ACDEDBFFFBFAFEBFFFEFFFBFFFFFBFDBEDA9E99A90B09ADADADE9FBDFCB0B90F0AF0BF0BCB090A0000000000000000000000000000000000000000000000000909A09ADA9E9E9E0FADBDADAD0F0F0F0F9CBC9E9CBC9090A00E0B0A0F0B0DA90009A9AC9E9CBD99E9ADB0F0F0F0B0F0BCB0F09A0C000C000000A9A0DAB09C0E90BD9AD0FCBC9E90900000000000000000000000000000000000000000000000000090000000000900000A009A09A09AD0A09A00B00BCB0C9C90C09C90C0900CBCA0D09A09A00ACB0F0ACB0F0F0F0F0F0BCB0F0D0B0D0B0D0BC90C9E9C0F0B090E0AD0B0B09B090000000000000000000000000000000000000000000000000000000009009000900900900900000900000900900000000B0A0A9A0A0A9A0ADA0090A0009009000000090000000000000000000A000A000A000A09A00A900000A9090BCBCBC0F0A9000000000000000000000000000000000000000000000000000000000000000000000000009000000900000000900BC009C90C90C90C090009C0090000000900090009009009009009009009009009009009000009009009000E0C09A90B0090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009E0ACB0E9ACA9E0E9E0A90000000000000000000000000000000000000000000000000009000000000090B0BC9E9CB000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090009009000900090000000000000000000000000000000000000000000000000000000000000000000090B09A9090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFADFBCFBDEBDFADFBCFBDFBEDBF00000000000000000000010500000000000076AD05FE','Steven Buchanan graduated from St. Andrews University, Scotland, with a BSC degree in 1976. Upon joining the company as a sales representative in 1992, he spent 6 months in an orientation program at the Seattle office and then returned to his permanent post in London. He was promoted to sales manager in March 1993. Mr. Buchanan has completed the courses "Successful Telemarketing" and "International Sales Management." He is fluent in French.',2,'http://accweb/emmployees/buchanan.bmp'); +; +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(6,'Suyama','Michael','Sales Representative','Mr.','1963-07-02','1993-10-17','Coventry House +Miner Rd.','London',NULL,'EC2 7JR','UK','(71) 555-7773','428',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF9A9FBCBFFD0000000000000C0BCF9BDF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FCF0EFDE9A00000000000000BCB0FCA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A9A9F9EBFC0000000000000AD0BCF0BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0DACBE9F0A000000000000090BCB0BCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0F0DA0FD000000000000000ADADE90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC909A9F0A000000000000000000B0EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A0C0000000000000000000BCBC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0DA9E9000000000000000000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000B00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF900B0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000BEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000009AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000A0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000A0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000BF9ED0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000900A0A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF090FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000B0E909000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000009A0A00000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90090F0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000A0BC0900B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBC009090000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000090A9A0A00000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE909A0DA9B0900DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000009A090000009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF090B09909009A90BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A0000000000000BE9A000000009A9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD09A09090A9090909009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0090000000000A009E9E000000000AA90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00909D09A9909A090090009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA0F0A000B000000090A09A9A9000000009AF0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09A9A09A900090900B00B0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000F009A0000000000000ACB0A00A00009AD0A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0B0D09900909A00009009090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000900F00A000000000000090B0E9E900009A0BA90B0ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9090909B0090B00900B0090900A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0A9A0A0F0000000000000000A009A9A0A000009F0BC090900FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90B090B000B0009009009000A09909009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB0B000000F09A000000000000000000090CB000A0ADABA0A00009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0909A90990090000000009A09000909009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0B0A0FA9A90F0A0900000000A90000A00A00B0000090A0C9ADA9A000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0909F0909A0090A909A090000900B000A9000FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A090F0B00E00AF090E0000000000A00000000B0000000A909A0000000A9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFF0909A090B0D0B0090900900B0900900B9900B09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A90BCAA9E9A09A0F00B0B0A900000000090000000A00000000A0B0B000BCBAA90FFFFFFFFFFFFFFFFFFFFFFFFF009F099A909A90BC00A09A90C9A9AC90000090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA090AC0B0DA0ADA000F0A0DAF9EBCB00000000000000900000000090E09A0090DA00009FFFFFFFFFFFFFFFFFFFFF09B09B099E909AC09A900000B000909A9C90B09CB090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE90DA009A00A00F0A9AF0F000A90F0B00000000A00000000A0000000B0A9A0000ABA900900FBFFFFFFFFFFFFFFFFFF09B09B09AD09E09000000B00900B0A9A90B0909A909090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A9A0A000A0DADAB0ADAC0AF0009AFAF0A00000000000000A09000009A00F00A00B0D00A00A9B0FFFFFFFFFFFFFFFFFF0B0DB0DA9B0B0900B009000900900D09CA9A900090B0DA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A90CB090090A00000F0A0B0F00000090F0A00000000A00009A00000000BB0B00900A0BC00000F0B00BFFFFFFFFFFFFF0999A99A9DAD00A90090A090A00A09A0B090DA9B9A90B90909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009A9EBBF00000ADABADA00B00AF00A09A00009A0000A900900000B00000A00DACB00009A0B0A09A0F0B0000FFFFFFFFFFE9BE99AF9A909A90090A09000900900900B0B09E099090B0B90BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A000B0F0FFA00A000C0A9A0CAD0F0900000B00000000000000000BCA9A009AFA900000000BA90900BA000000BFFFFFFFFF9BC90BD9ADA9A900B009000B000900900909C9A9BCA9F09909B09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00A9000A9FBFFF0009CA9ABC0CBA9A0F0A0000000B0090A000A00A00B0A90090A9090A00A000B9E9A00E900000B0F0FFFFFFFA9F9BBF0B09090DA900900090009A09A9ADA90B090B9B099A9F09BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000000ADFFFFF00000A90E00AB0000AF00000000000A00090009000000BCA0A00A0A000900FADA9E0A090A9000090BFFFFFFFDB0BC90BCB9E9A909B90B0B0909009009090B00B0F09E9AD909B0909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000A90000009AFFFFFF00000A000B00A9EB0F0000000000000000A00000000B0B9000B09000A0A90BADA909A0BCA00000B0BFFFFFFBF9FBAD9B0B909A9C0B0909A09A9CB9A90B09B0D90B09B9A9B09B9B90FFFFFFFFFFFFFFFFFFFFFFFFFD0000A000000A0009BFFFFF000A9CA9A0F0E00CAF00B0000000000000000A000000BCA00900A000909EBDBA9A0009A09000A000FFFFFF9F9A90DB0F09A9F9AB99A9B0D9A90B09D0B09AD9A0BC9ADADBC9AD09A9BDFFFFFFFFFFFFFFFFFFFFF000A0090000A090000AFFFFFF00090A90CA009ABA9F0000000A000000A0000000000BDA9000AB0B00A0A90A0000000A09A00000B0BFFFFFBCBF9FB0B09F9A9AD99E9F090B0DB09A0B0FA99A9B90B9099A9B99BE999AFFFFFFFFFFFFFFFFFFF0000090000900000000BDFFFFF0000AC0A0A90A0E0C0F00A9A0000900000009A0900000A00A0B000000000A9000000A90F0000000009FFFF9FB90B09F99B09DB9BEB99ADBB09B09BDB9999DA90DA99EB0F9F0B099B0F90FFFFFFFFFFFFFFFFF0000A000A000A00000000BFFFFFE0000B0CB00E9A90BAF09009A090A00A09A000A0A000B0B0000BFA9A0B090009A00000A0BCA090A000FFFFE9EBD0B09AD0BA9AD99EB9B90DB09F09A9AFA9A9B9A9E090B0B9F0F099B9B9BFFFFFFFFFFFFFFFE0009000000A0090A00A000BFFFFFA0000B00F0000A000F000A0A9AE90B00009A0900000000000B0A9A9A00A0A000009009FA900000009FFFF9B99ABDB09A99DB9A9A99E9AB0BDA9BBDBD99BBD0B909B9F090A9B9B9E9ADA99FFFFFFFFFFFFFF000A000A00900000000090FFFFFF9009A00A00AB0E09E0F0A09090A90A009A000000009000000B0F9B0F00F0900000000FAA90A9A09000FFFCB0FAD900F99B0A909099A99D9990B9D0BB0BBC90BDA9B090B9F9BDADA90B9B9EBFFFFFFFFFFFF0A900000900000A00000000BFFFFFE0000CAD0BC0090A00F0000A0AD0B0B0A0FA00A0000A00A000B0BEB0BB0CA000000A9AD9A00000A000BFFBDB990B9B0A9C9909A9B0D0B0ADA9DA9BC9BC9B0B00900F0BC9A90B9B9B9DBDBBDBFFFFFFFFFFF000A09A0000A0000090A00ADFFFFF9000A90A0A0FA0A0A0F09A09A9AB0A09A90B0900A000B009000B0B0BCBB0000000000BAF0F0B0000A00F0B0FB0BC0999A9A9E090D0B099099A99A9B90B09F9B9B99099B09F90F0BCB09AD9B9BFFFFFFFFFFC0000000A00000000A00009ABFFFFF00000B009000F0C90F0A0000000F0BADABCBAF000F9ADA00A009A9AB0FA00000A00BDF090000B0900B9F9F90F9B9A9E9B0999A909090A9009099090B99A909E9A9B0B0B09AF09F9F9B9BBCBDBFFFFFFFF00A90A00900090000000090ADFFFFFE0000E0A0E0B00A0A0FA9CB00B0B09A90BCB9E909B9ADA9A090BAB0F0F090000090BEBA00A09A00A0B0F9A9AB9090DA9909B0A90B009090099A9E99B09E9A9B90DB09DB9DB999BB0B0BCBDB9B0FFFFFFFC9A00E90A000A00A0B000A000BFFFFF0000B00C09A0CA900AF9AB0B00B0BADAF0B0F0FAACAFB0A90A0090B0B9A090A000ADBC9A09A009A9BDB0F9F9CB0A9A9B0BD09990909A009A00909B0DB99B9C9A9B09A900B0F0BC9DBD9B9B9FBDBFFFFFF0A9A90A0000000000000900A9FFFFFFF0000A0B0A00A00E90F09ADADA0C90B0BB00A9090B9ADBDABCB0AB0B0A9E0009A00A9A00000B0000EBDB9A9B9990909090B9ADA909090009090909B09A90B9B0909A9B99B99B0B0B0BE9E9F0BB9BFFFFFAC0CA09E9A000000000A000000FFFFDA0000D00ACB09A00A0F00A9A009A0ADBC00000A0000F0A000B0A90B0ADA9ABDA0090009000000A0F9FBCBDB0BE9BCB0F9B9099090A00090000A90909BD9BDA9DB0F90DA90FA9F9BDB99BB9BBDF0FFFFF00B0B0F000000000B000000000BFFFFFF000A0A0090E009A00F009009A0009A00B0A9000A0B0A90BB09B0A0090B0BDA0D0A00A0A00B0090B0B0B9A9F99009099AD0B9A9A909090009090B09B09A9A99A099A9A9DB999B0B09EBC9DBDBB9BFFFE0F0A0A0A00009000000000000BFFFFFF0009009CB0A000A09EF000A00000000B00000A09000000A0CBA00900A00BFADBA00009E9B00A0A9FBDBDBDB0B0B9A9A999B9C9090909A909A0090B0DB99B9B099A90999A90BE9DBDB99BAB0B9FADFFF000AD0D090A000A0000B0009A00FFFFFFA000E0A00E00B0C0A0F0000000900B00A0B0F9A00000000B00DBA0B000009BE9F0B0B09EBF0900B9CB9A9A9BD90909DAB0DBB9BDB9F9DB99D9B090B09E9CBDB0F0BDA9A9B999BA9A9E9D9F9FB99BFFDB0B0A0A000000000000000A00009FFFFDF0000B0A90B0CA9A9AF0000000000000090FBADA00A00000BBA09A00000A0F9A0A000BFBDFA00BDBB9F9F9F0B0F0B0B9DB909ADB9E9B09F0B999B99B99B99A9B990909D90F0B09BDB9A9A9A9BEBFFFE00CBCB00A0900000A0000000009AFFFFFA00000C0AACA0000C0F0009A00A0000090BBADB0B000009AD009A0000B0DB0000900BFFFFADA9F0F0DA9B9A99909C990B9ADBDB9F9BDBF9B9E9F9CB90B09A9909A9A99A9B9BD9F9A909BDBDBDB9FFF00AB0A0000000A00900A0000000AFFFFFE0000B0A9E90090A0BAF000000000B000A0ADBEFBC0900A00BAFA900000A00A00000BDBFFFDA9A9B9BB9BCBDABA909A9F0B9B99BDB9F9F9F9F9B0B9C9BDB9DA9F09090B9ADA9A9A99BDB09A9A9FBFF09AD0E90F0BCA900000009A000009BFFFFFD0000D0A00A0AC9AC0F000000900000000B0BB9ABA0000000900A0B0009A09000000ADBFFFFDBDA9CBDB9B99D00B09099C90F9F0F9B999BDBDBDBB9B0B0BB9A9B0B0F099B9F9B9F0B09F09F9B9BFFAC0A9AE00A0BCACA0A0B00000A00ADFFFFFA0000A9CB09A00A0B0F0000000000000900B0DAF09A0090B0A0900000B0000000000BFFFFBFA9B9B9B0BDABB0B909A0B0B9F9B09990090099BDB9D9F99F909D909C909B0B9B9E90BD9B09B09E9FF090B0E909ADBCA9090000CB0A09000BFFFFFD00A00AA00E09A0000F000A900A0000000B0BAB9FA000000000A000000000000000BDFFFFEF9F0F0F0BDA9D090000090909090990BC9A090009BDBB09B0B9B0A9A9A9B0F9E90B9B90B09B0DB9BE0ACA0E9A0E0A0A90A00000A0000000BEFFFFA00009E90CB00E00FABF0000000009000A90A90FB0FB000000900000B000000A00000BFFFFBDA9B9B9B9B99A9A900900000090C0A90B990F0B9090D9F9D90D0990909A9B9B9FB99C9B9BC9B0BCB90009A9E0B09AD0A0CA09A0900B00A09FFFFFF0000A00BA00B09A000F000000000A00000B0A90FBF0FA000A0000000A9A0000900000DBFFDBDA9E9ADB0FB90DA9A000000009B90F90E9A9BCB909099A9A9B0A90B099CB9A99BEB9A9C9B0999BCB0B00CA9E0AC0A9C9000000A00000000BFFFFFF0009A0CA9E0AE0BE0F0090A0900000090A9A0BBCBF00900000000B0000090000000BFFFFFB9BDB9DB0B909A909090000000000B00B909099BE90B00909009000090A99F9BAD99F9B9B09F0B0B9A0CB0BCB0D0B00A0A0000000000000ADFFFFF0000ACB09A0B09A00BF000000009000A0A9090BCBF0B00000000B000900000000009FFFFF09E9A9AB0BD0B0909000090B09A909099000090BC90B09000009009090B99B09F99BBA90B0DB090B9C09A0BCBE9AA0DA0909A000000000009FFFFFE0000090EACB0CA0DA0F000000A00009009A0A90B0B00A0A090000090A000A000000A9FFFFFB9BDBD990B9DA9A9A9A9090BC90909009099A90B009000000000000A909ADBB0BB0D99F9B099B9C9B0A9ADADAF9CBADA0E09A0000A00000AFFFFFF000B0AB09AC0A90A0AF000009000A0009A9B0A000DA900900A0000A0000000000009EBFFF9E9A90B0F90B0909C9090B099B9A9A990B909009090A909090000000909A990F90FBA9A909B0BCB9A9B0CBAFBCAFBCBADA9AC009009000009BFFFFFF0000C0A09A90A0090F000B0000900A000A09A9A9A9ACB0AD00B0F0900090000A0009FFFDB9BDBB9B90B9B09A9A90B09F0B9D990BC90F09909099900B00A0009009E90B99BB999BDBBD09B99A9C9A90DADBDACBFCB0FA9A00A00000000FFFFFF00000B0CA000E0BCA0F00000A90A0090A9B9E9C9E09090C90BC0900A00000090000BFFFBA9F0B0D090BD090B0999A90B09E9BB0B9B9B99B09A9F9A9B909000B00B090F9ABC99AF0B090B9F9AD9BADAEBFEBEBF9EB0F0C0000000A00B0FBFFFF00009A00B0F0A900A00F0A0090A009A009A0A90A90B0F0A9A009A0BC090A0A00090A9BFFFDB9BD9B9F90B0BC9B0F09E90B99AD9F9E9F9FBDBBDB0B9D009009009090B90B99B0F99B99BBDB0B9B099ADBCBFDBCFEDFE9AB000A9A090000BFFFFFF00000F00A000A0B09AF009A00900000A0909A90A900090090B0900B00090900A0900AFFFBDA9B09A9A99B9B0990B09BD0A99A9B99B0B9A9DB9BDBA9B0A900900B090B99E99B0B09AD09A9BDB0B0F9ABFCBEFBFBFADAD0F000000A00000FFFFFFF000A0BC0ADA000E00F0000000A909A90ABA0009009A0000000A0B00A0000A090A0BDFFF9A9F0FB999F0909B9A99B090BD0BDB0DA9D00DBA9E909D0099CB0A9A9DA90DA9BA99F9BDBBD9BCB0F9B09FDEBFFBCFDEDADAA0000000000A09BFFFFF000A000A90A09EB00AF00009A090A090A9009A000A000009A0B09009090A0090A909FBF0B9F9B90DAB09B9A9E9CBC9AB90B0909A90A99B0D99B9B0B9B0B099909A909A990D9A9A9A990B0B9B9BC9BFEBFF0FFBEBAF0F09A00A0000900FFFFFF000090FA90A90A000B0F00B00CB0B0B0ADA0B0900900900A099C000000A0090A0000BEFFBDB0B0B9B999BC999B9B9BBD0F90B0B90909A009B0B0BCB90C9090F0B909B99A9B0B9B9F9A9BDB9BDA99B0BFFFFFFEFFDF0B0E000009A00000BFFFFFF0000A000E00E0B0E00FB000B0BCF9ADB0B00A0A009A00900A9B0B00B009000090009BDF9A9F9F9F0BDA9B0F090BC99B9A9F99CB0B0090B09B0D090B9B0B0B0B0F90DA99A990F090BDA9A9F0BDABCB0DBEFFF9FAF0F0B9A09000000A000BFFFFFA0009A0B0B0900B0B0F09A909FBBCB00B09B09090A90B00900000000000A000A000A9FABDB9A9A9B9A9F9B9B9F9BBEBDB9A9A909C0B0C90F09B0B9CB0BDBD99F9A9A9BC99A99BBB90B99B9B9B99B9BAFDBEBFEDBE9ACAC00A00000000BDFFFFF000A0AD0A0A0AC000AF9F09EBE9DA90B00A000B0A90B00B0A90B00B00B0009000A99FB9DB0BDBDB0DB990B09A90BD99ABC90D00B09090B090B0BD0B9F99A9BA909B99099E99A9C90B9DABCBCBCB0DADFBEDFE9BE0BCB09A00000A9000FFFFFF00000D00AC09A9AADA9FA9A0B9BFA90B0F09A90009AD090009000000000000A09000FBCBB9F9B0B9BBDAFB99F99B0BFBD9B9A9A900B00900B0D909F9F9EBDA9DB9B0DA9B09AD99B9F90B99B9B9B99B0B0FFBCBFE9F0ADA0000900000B0BFFFFFF0000A0B0B0E0090A00FBE9B0F9ADA00B0B00A09009A9A9000B09A90B00B0000A00B9FBDA9ADB9F0DB999BFA9A9C990BBD0900909009A90909A9B0BB0B9B9FA90B09A909B99A9A9A9BB0F0BDBA9F0BD0F0FFBCBDADA9ADA00A0A00A0000FFFFFFB0009AC00B0A0E09A0F0900F0BCB09E0000B00A00909009A900000A000009090090BF9B9F9B9F9BB9FBAD99B99B9A9900B0090A090900A09A90DB9DBDBDB99BBD9B99BD0B09BD9B90DB9B9B0F9A9B0BAFBCFBFAFA9E9A090000900000BFFFFFE000A00B0A009A90AC0F0B0B0B0909A090B000000B0DA090090B0B0909A9A0A0A00BF9B9FB9BE9BF9FAD9BABD0B009D0B900000900A009090090B9FAB9ABA9BC90B09A90BDB9A9AD0BB0B9E9F99F9E9ADBCFAF0F09E9AD0A00000A09A0BFFFFF900000F0AD00E00A0BAF00000000A090A00B009000B09A0B0A900000A000000909ADBBCBB0F99BF0BB9BF9D9BD99B9A9909000009909000090090099DBD9D099BB9BD99B99AD9B99BD9BDB9B9AB0B9B9AFFBDAF9EB0E9A000A9A00000BDFFFFFE0009A00A0AB00AD000F0090009000A0900000A0009AD9909DA909A09A9A0B00A09BDB9F9FBFBDBDBDBDBBB0B9A90990BDB09000A0909A900000900B09B0B9A909D0B0BDA99B0DBA9A9A9BCB9DBDA9E9DAFCBDAF0F9ADADA900009A000ABFFFFF900A0F09000A90A0B0F00A090A09090A000000090A90A0B0A90A0090000900B00BEFBF9B9B9FBFBFBFB0F9F9A9F9A0B9A99A9F999A990000A99BDB09A09099B9B0B9B9A9BE9BB9DB9F9B0B9AB9B9F9B0B9BFAF0F0ADA9A00A00A0000ADFFFFFE000000A0EB0DA09AC0F0900000000000000A09A0A90B09009A009A0A09A00B009F9B09BFBCFBDB9F9F9F9B9BDB90999F9FA9B90BC90B09A990B09099099B0F9E9B9F9F9FB99BD0BB0B9E9BDBDA9F0B0BD0F0BDA9ADABCA0B09A90A9A9BFFFFF9000BCA9A900A00A00AF0009009000A09009000909A09A00B009A0909A09B009A9BBDBF09FB9FBFFBFBFBF9EB90B9B0BFB99D0B9B9B99F99BDBD9B90A9BC9B99B0F9B90B9DBE9BF9DBDB9B9A9B9B9B9F9BB9BCBADA9E9AD00A00000000FFFFFFE000090E00EA90F00B0F00A00000B09000A00B0A9ADA09A00B009A00A9A00B000B0DB9BFB9FBBDB9F9F9F9F9FB9F0D909FFAB9BC9B0FA9B0B0BBF0BD909B09A9B9B9EBDBAB9BF9BB99A9BDB9F0F9E9A9BDBF9BC9ACB0F9ABC9A00A00000FFFFFF0000A90B090E00BC0AF0900900A0000A09000090B09A09A90B0A09B009A90B0BDB9AF9B9FBDFBFFBFBFBFBB9FB9B9A9FB9F9FDBBDB99F9F9FBDBF9A9909BDBDBDBF9BB9F9FB9E9FABDBCB9FB9B0B9F9FADBBDBE9A0F0AD00A09009A09BFFFFFB000A00A0EA090A0A90F00090A9090A9090A90B0B09A09AD0B0B09A00BA9A0009B0BF9B9FBDB9BF9F9F9F9BDF09F0B99BDF9FFBBDBFBFBFBFBDFB9909A9B9B9B0BB9FBDF9FB9F9BBD9BB9B0B09F9BDA9B9B9F9A9ADB0ADA0A000A0000AFFFFFFC0009CBCB009AACB00AF0B0A9909A900000000090A09A09AB0B09A09B0D00B0BF9F9BDAF9FBBFDBFBFBFBFFBBFBBDBCB9BBFBBDFBF9F9F9F9FB9FF0B99BDBCBF9F9F9FBBBDBFBDBDBBC9F9F9FB0B0B9F9F9F9FBDA0E9FA90090000A090FFFFFFB000A0A00B0E09A0AD0F9099EBB09A9B9A90090A9DA09A090B0B09A00A0B00909B9FBBDBB9F9BF9FBDBDB9BFDBDBB9B9E9FFDFBF9FBFFBFFB9FB9090BDA9BBDBBBFBFBDFBF9FBFBBDBB9AB9B9B9F9A9B90B9A9B0F9A09EAD0A0A0900A09FFFFFF00009A9E0B0A09E0AAF0B9A9B0BF9000000A0A90A90A90A9CB0B09A90909A0BF0F9F9BDBEBFB9FBDBFBFFF9BFBDBF9F9B9BFBDBFF9FBFBDFF9DB9B99B9F9FBDBDBDBDBBF9FBDBDFADBF9DBE9F9B9DBCBBBDBDBF0ADAF09A00090A0900BFFFFFC000A0CA0BCADA00B00F90B9B9BB0BA9B0909090A9B090A9AB09A9A900A0A09F99BB9FFBF99F9FBDBBDBDB9FFD9FADBBFBFDFFBFDBFFDFDBB9AB9E9DABFBFBDBFBFBFFBDFBF9FBFB9B9B9BB9B0BCBAB9BD09B9B9E90B0DA0090A00000BFFFFFFA0009CB0F0A9A9EB0CBFA9AFBBCBB09000A000A0900A0909099A9A90B09090A9B9F0F9BDBBFBF9BF9FBFBFF9BBFB9BBDBDBB9FDBFFBFBFBF9FBDB9BBDF9B9FBF9F9FBDBF9FFBF9BDBDBDBE9F9F9B990F9BBBDAF9BCADAA900A00090A09FFFFFFD000A0A00BCACA0CBA0F9090B9B90B0B0900B090A9090A0B0AA9A9A90B0B090BDA9FBFBFDBF9FBDBF9A9B9BFDB9FF9FBCBDFBFBFFBDFFBF9FBDBFBDBB9FFBF9FBFF9FBFBFB9FBFBBDBA9B9B9A9B0BF9B09DA99BCBB0BD0E900000A0000AFFFFFE00009CBCA9A90B009AF0A9A90B0B0000A09000090B0A900B999A9E9B0B00A9F09FB9F9BBF9BBDBB0F9F9E9BB9FB9FF9BFBBDBFDBFFBDBDBF9BF9FBDBFB9F9BF9FBFBDBDBDFBDBDFBDBF9F9F9F9F90BDB0B9FBDB9CACAF00000B00000B9FFFFFB0000A0A09E0AC0AF00F09000A00000000000000A000900B90AA9B0BA9B0B9B9B9B9FBF9F9BFDBB9DB9B099B0FB9FB9BF9BDBFBFFBFFFFBF9BFDBBDBFBDBFBF9FBBDBFFFBF9BF9BB9BF9B0BB9B9A9BDB099FB0B99AB9B00A0000000900FFFFFF0009AD00DA0090A900FFA0900090000000900009009A00B00B99A9BB9EB9A0F90FBFBDBBFBDBBBDAB9A9B9AD9A9EBDAF9FBFBDFBFDBF9BDBBDBBDFB0BDBDB9FFBDFBDB9BDBBDBBFDBF9BFBD9BCB9A9B9F0B9BD90F90E0F0090000000A9FFFFFFC00000B0A09E0B0E0A0F9A0A90000000900090A09B09A90B00A90B0BA90B9B0B909FBBFDBFBFCBBDB9F0DB9A9999B9F9B9D0FBBDBFFFFFBDBFDBB9FBDBBBFB9FBBDBFFFBBDFBDBBBDBF99BBE9B9F9E9A9F9FBBB90BDB0A00A000000000BFFFFFBA000AC09A00AC09A90FA9900000B00A000A0090A00B00B0B09AB9BB9BA00BDB9BFBDF9BF9F9BF9B9A99B0990F0B0B9BDBBB9F9FFBF9B9FBF9BF9FB9B9F9BDA9F9B9B9BDFBBDBDF9BF9EBD9BBDA99B9FB9A99C99B9A0F0F000000B0009FFFFFFC000A9A9E09A90B00CAF90A00B0B009000090B0B09B00B0009ABDBE9A099B099CBF9FBBF9FBBD9F0F99B099A9090D9BE9A99FBFFBDFBFFBF9AF9EB9F9F0BCB9B9ADBDAFB9BDBBB9BF9BB9BFBD9B9BE9B909009BE9A9F0B00000B000A9AFFFFFF00090C0A09AC0A0E0B0FA09A00009A000B0A00B09A00B0A9A009A9BADBA00B09B9BFBFDBE9BDBBB9B0B09E909A90B099F9FB9F9BFBF9B9F9FB9B9F9BA9B9B9BCB9A9B9BDBFBDBDBF9BF9FB99AB9E99F9FB09B099F9A0F00A9A000A90A9FFFFFFA000A9E90E09AD0B000F9A0900B009A00000B00B0BBA09000B0A9A9B00B0BD909F9F9BF9BFBBDADBDBDB90B0909090B0B90BDBFF9FBFFB9B9DBF9BD9B0D909B9BDB9F9FB9BDBFBDBFDBB9FBF9F9BB0BB09F099A99F9B0F0000B0B0EB0A9FFFFDF0000A0A90AA0A00BE0F0900A90B0009009000B0B0090A0B0009ADA0B0090B09ABFBFF9F9909A9B0B0000909A90B09090B99BB9BFBDB9FADBB0B9A9AD9B0BD090B9AB9BDBFBBDBBF9BF9F9B9B9BDBDBC9B090009A90F0B0B0000ADB0DBFFFFFFA00009E9E0D09CBC00BF00A090A90B00A0000B0009A0A90000B0A9A90A9AB0909F9BF9AB9A090909009A900000000B09B9FAD9FF9FFBF99BB9DB0DB90B0900B9F09BDAFBDBFDBBFDBF9BBE9BFBCB0B99B090A999F9B0B0E00A0A9A0FAFFFFFFF000B0EB0B0A0AB0A0B0F9009A99E009090A00009A09000000000900A9000D9009BFDBFBDB9F000000000A00000090000D099BA9BFB9F9BF9DAB0B9009090B9909BDB9B9BBDBBFDBBBDBF9BF909B9B0F00B00900B9BCBCA9000900DBE90FFFFFFC00009EBCB0BC0A9AC0FA9000A909A00000000A09A00000000000B00A9A9AB09A0BF9BDB090B00000009000000000009A9A99F9F9FFBF9BA99D90B9A900000A909B0BDBCBBDBBBDFBBF9F9BFBFB9F9B9009009009B9A9E0A9000A00BEBBFFFFFB000AD9EB0E0B0CA0B0F000A9CA9A09A900090000000000000000000000090909DB9FFF0FB9090000000000000000000990DA9BBFB9B9BC9B0B0000009A90909A90F9BB9BDBFDFBBDBDBBFDB9B0F09F090009099F9A9E9A00A0000B000FFFFFFC0009AE0BE9A0A90F0AF00090A90090000000000000000000000000B000000000BBFFB9B9909A900000000000000000B009B9BBDB9F0F09B0B9000090000000000B9B0DBFBF9BBBDBFBBF9B9F9F9BB000009090B09F0BC00000000009BFFFFFB000A0E9BC000F00A000F09A0000000A000000000000000000000A90000B0000009EB9F0FADB90B0909A00000000000909B090D9ADB9B9B09D0090000B0000000900009A9909BF9FB9F9F9BE9BB0B0DB90090B0999A9E0B0B00000000A0FFFFFF00009A0A0A9A0AC9ADAF0000A90A9009A00000000000000000000000B0000000099DBFB9BB0F90B0B090D99A90900900009A9A9B9AD09DB0B90A000000000000000000000B090B9EBBFBF9BF9BDB9B09B9A90B0F990BDAC000009A0009BFFFFFF0000D0CB000900A000F0090000000000090000000000000000000A00000000000FB9BDBD0B9A999090B000900A09A090909990D099B0B09009090000000000000000009A99B9FB9F9BDBBDBBCB9A9FBC99F999B09B0A90A0000000000FFFFFF000A0A0A00E0A0A00A0F000090A00A00000000000000000000000090000000000BB9E9FA9BF09DA09A909A90090900909A9AD0B9B9A0909009090090000000000000090099ADBB9BFBDBBDBBDB9ADB099B090FB099E0BCB0000000000BFFFFFE000900B00B00CA9CB09F000A000090000000000000000000000000000000000000DBBF99F09B0B9B0DA90900B00009000909A9900099B09A9A9A9009090909A9A9A9909B0B90BCBDB9BDBBF9A9E90B9A90B9B9090B9E9AC90A0000000BFFFFFDA000E00AC00B000A0A0F0A90009000090000000000000000000000000000000009AD9FA90B0DB0D0B090B099090B00B0909090B9BDA9090909090B00A9A9A9D09090CB09D0B9B9BBFFBBCB9BDB9B90BDB090FB0090B0E9A00000000000BFFFFFD0000BC0B0A0B0B0C9AF00000A00000000000000000000000000000000000000009BB090009A9B0B90B090A000909009A9B09B090909A90090009090909C90B9A9A9B09A9B9E9BC9B9ADBDBF9AD0AD0909AD900999E9A9CB0000A0000BDFFFFFA00B00A90AD0E00A9A0F00009000A0000000000000000000000000000000000000BE9F0000000000000000090B009A900909BC90B9B9C9A90A90B00909A9A900909909B9B0B9BDBBFBDBBBB09B0B990B9099B0909A9A9EA000B000A90FFFFFF000000F0ACB0A09ADA0FF090A0000900000000000000000000000000A000000000099B9F00000000000000000009A090B9CB09B9F909A909009090090B0909A9B0F0B9AD0BD9F0BF9BDB9DBDBE9900A90A9B00000B9ADA09A000009000BFFFFFF0000A09A9A0B0A0A0B0F00000090000A09000000000000000000000900000000000F9B0B000000000000000000090B90B99B09A9BD09B0B090A090A909A909A99990B9B99AB9F9BE9BFBA9B99A9A9009009900099E90FBC09A00A00B00BFFFFFF0009ACB0F9CBCB0F0BF000900A00009000000000000000000000000000000000009ADBD00000000000000000000BD0B90BCB9B90B9B090D0B0900900909E990B0BF9E9AD99A9BF9FB9BDBDA00000000000A099DA00A00B0000900000BFFFFFE0009E0B0E0A0A00E0ACF000009009000000000000000000000000900000000000009B9A9A000000000000000009090B9EB9B9D09F9BCB09A90900B00B0A909CB9F0909A909ADBD9BBDADB9A90000000000009B0B00BCBF0A00000B00BDFFFFFB00000B0F9A9E90B0B0BF090A000000000000000000009000000000A00000000000000F9F9C000000000000900A0F9B0B99F9AB9A9A999F90B00B00900090B0B0B0B0B090B09B9ABF9B9B9B900000000000000090000B00D009A000000BFFFFFF000A9E00ACA00AC0AC0F0A090A90A9A90A900000009000000000000000000000000009A9AB90900000000A009909AD9EB9AD9BDB9DB0B0B90900000000000090090000000009F9F9E9BCBCB00000000000000000090AFA0B0000000000FFFFFCB00009E9A90AD0A90B0F009000000000000000900000000000000000000000000000099F99ADA9A9F0F0B99B0F9B9BB99F9BBDA9B9A9F99E9A9000000000000000000000009A9B9BB9F9B90000000000000000009A0D09E000000B000BFFFFFF0000A0A00A0CA00E00AF00A0090090009000000000000000000000000000000000009A9A9E9B9F9F0B99BDAFDB9ADA9DBA9BC9B9E9BDB0B909000000000000000000000009FBDBCBDBB090000000000000000000AC9ABE0000000000BCFFFFFA0000090CBC0B09A00BCF0900000A009A090090A00000A900A009009000000000000009F9B9BDA9E9BDAF9BF9A9FB9DBAD9F9BBDB9F9B9F0B9F0990000000000000000909A9A9B9B9B0D9A000000000000000000009AD00B0000000000BFFFFFF000B0E9A0A00A0CB00AF00090A900A000A00000900000000090000A0000000000000009ADA9BDBBF9BDBE9BF9F9FBBDBB9BF9BADB9F0B9BDA9BA9A900900900000000009DBDBCBF9F9A9000000000000000000000A0ABC0B0000000000FFFFFDB00000A009AC0A00E90F00A000000909A900A00000900000900A00000000000000000A99B9B0B9DABFB9FBF9BFB0F9F9F0F9BDFBBCBBDBDB9F0DB9F0B00000090000B9FAB9B9B99A9A900000000000000000000009E9CB000000A0000BFFFFFE0000F00DA009A00A00AF0000A90A00A0000009000A0090B000090090000000000000090BC9E9F0BBDB9F9BDAFB9F9FA9BF9BCBB9DBBDB0B9FB9BBCB9D09ADA90009B9EB99E9F9BE99000000000000000000000009A00B0E0000000009FFFFFFB000A000A0C0A0DA90E0F090900909000909000A090000009A00000A00000000000000090B9909BD9BDABF9BF9DBFB9FBF9FBB9FBBF9BF9FB09FADBDABBF9B90FBDB0F99FB9B9E990000000000000000000000000ADA9E09A000000000BFFFFFC00090E90A9A0A00A09AF00A00A0000BCA0A000000090A00009A0900000000000000009A90B0B09A90B9DAF9BBBDBDB9B9F0F9B9CB9E9BBDBBF9BB9BDBD9FBFB9B0F9BFB0BDAB9B0B000000000000000000000000000A9AC00000000000FFFFFFB000A00E00C90AC0A00F0009000A000090909000A000900000000000000000000000000000090B09F9FB9BF9F0B9ABDBDBB9BDBB9F9BDBA9F9BD9FBF9AFBCBDAF9BBDB0F9B9F9E900000000000000000000000000BAD0F0B000000000BFFFFFE000009A09A0A090B0CAF090000900B0B0A00A0B0900A00A90000000000000000000000000000009B0B09BDB0B9FB9DB0BB99E9ADBBBDBB9F9BDBFA99BFBDBDBF9FBDA9F9BCB9A900000000000000000000000000F0C0B0A00000000A9FFFFFF9000BCA00A0000CA00B0F0A0A0A000000909000000B090000A0000A0000000000000000000000000099BF9ADBDB9C9A9B09CB99B99C9A9DB9FBA9BDBFB9DBBBB9BA9BF9B9B99F90900000000000000000000000000B0B0E9000A000000BFFFFFE0000900BCACA9A0E00AF00909009A9ADA000900000000900000000000000000000000000000000000090B9B9A9A99909F9B0B09A9B99BADB0DBF9B9BFBBDBD9F9DB9BDBCBB0B9A00000000000000000000000000A0F0B0AC0000000000FFFFFF900A0AC000900090BC0F00000A90000009A0A09A9A9A0A0090009000000000000000000000000000009FBCB09090A0B090099F99B0BC99B9BB9B9FBC9DAB9AB9BBBCBB9B9DBDA90000000000000000000000000B0F00AD0B000000000FFFFFFE000009A0B0A0E0A000AF00B0A90000B0B009090000C0909A00A00000000000000000000009A0000009A909000000090909BDA90B0D9B9BADBDB0FB9BBBB9FBDAF9DBBDADBA9A9000000000000000000000000000F00BDAA000000000B9FFFFF9000BCA00CA009AC00A9F0009000A900009A000A00A9A0A0000000000000000000000000000090900009B000000000000B09099BD9AB9AD9B0BDBBCBF9F9FB9BB9ABF9B9B9DB9000000000000000000000000000B0B00A9C0000000000FFFFFFE0000000B00DA00B0BCAF900A9E000A9AC090B09090090DA900000A00000000000000000000000A90000000000000009009A9A90B99BDBB9FB9BDB9B9F9B9F9F9F9B9E9F9AB0F9B0000000000000000000000000CA0F0CA9A000000000AFFFFFF000A9AC0A000A000000F0090009000009A0000A000A0A000A0900900000000000000000000009009A900000009000000090990B0BCB09CB99E9B9FBDABDA9A9B9BDB9B0BD990000000000000000000000000000B0F09A9E00000000009FFFFFB0000C09A09A0D0E0A9AF0A00B00A9009A00B0B09A90909A09000000000000000000000000090A090000000000000000900B9CB999909BB90B9B0F90B9DBB9FBF0FB9BDB9A9A900000000000000000000000000BCB0AA9E09A0000000BFFFFFFC00B0B0A0E00A0A090E0F0090000009A0000000000000A09C0A0000B000000000000000000000090B000000000000000A009A990F0B9F909BDBDB9BBDBBBDB9B9BB0F9AD0909A000000000000000000000000000BCB0DA9AC90000A000FFFFFFA00000C009E00090A000F90A00A90A00B0BC9A9E909A900A90009A0000000000000000000000000900000000A0009A00900090A99B0B0BDB0B0BDADBBDB0BFBCBDB9BB9A9A0090000000000000000000000000000BCA09E9A00B0009A9BFFFFFF000A0B0A00BCAA0CB0AF00909000090C000000000A00E900A9000000000000000000000000000900090909A9000090000090B99A9D9B9A9F9B9B9B9CB9F999B9B9F9CB9090000000000000000000000000000000E9BCA9E9EB0E9AC00FFFFFFF0009CAC9AF0A9CB0AC9F0A00A0B09A00B00B0B0B009090A0900009A00000000000000000000090A00A0000000000000000A90DA9A9A9E9B9BCB9FBDBBF9BBEB9E9B0B90B0000000000000000000000000000000B9ACA9E9A9CA90F0BFFFFFFF00000A9BEF0AFCBE9E9AF09AC00C000B00900000090A0A090000B000000000000000000000000009009000009090000000909B099DB99BD9E9BDBA9BF99AD9BDB9E9B9AD909000000000000000000000000000000E9A9E9E9EBDAF0BCBFFFFFFF00ADAECB0FDABE9E9AFF000B09A09009A0B09E90009090A90A00000B00000000000000000000000090B090B09E900900000099A9A9E90BB9B9AD9F0BF9FBF9BF9BE9D9A9A000000000000000000000000000000B0F00A9ADACBCBCA9CBFFFFDA000099EFFAFDADAFEDAF09000009A0909000A00A9000000009000B0000000000000000000000000000000090B09A00000009A090909B990BCB9BB9BDBB9B9AD9B99B0B9090000000000000000000000000000000F0BCBCBE9FADA9FAFFFFFFFF0000AE9F0F9EFBF0BFFF0A0A9A9009A0E0A900900A00A9CA0009000C000000000000000000000000090009A000900000000009A09A9ADAF99BDBCBDBE9F0BF9BADB090000000000000000000000000000000000BCBCB0AF9FADAFFE9FFFFFFF000B0F9FAFFAF0FCBFE0F909C000B0009090C0A0A00090A09C00A00B00000000000000000000000000000009090A90000000000900909999ADB0B99BF9B9F99A990090A9000000000000000000000000000000000B0A0BDAF0FBF9E9F0FFFFFFE0000EBCF0FDFFBFEDBFF0B0B0F009A00B00B00C09000000A090000000000000000000000000000000000000009000000000000000000A099A9DB0B0BDA9ABD9E9B0A900000000000000000000000000000000000CBDACB9EBCF0FBEBFFFFFFFB000B0FBFFBEBCF0FADFF0000000B009000000B000A0009000A00900B000000000000000000000000000000000000000000000000000090A090B0F9F9B9D990B90909000000000000000000000000000000000000BA09A0CBCBAFBCF0FBFFFFFC0000BCFEBCFFFBFFFFAF00B00B00000000B0000B00900A0090000A0000000000000000000000000000000000000000000000000000000009A0909A900B09A900A000000000000000000000000000000000000009E09E0FBE9ADE9E9ADFFFFFF000A9EBF9FFBCBEF0F0FF00090000090A9000B0000000000A0000000000000000000000000000000000000000000000000000000000000000090B090B90B09A909000000000000000000000000000000000000000BCA0B009E9A9EBCBAFFFFFFA000CBCFAF0FFFDBFFFFF900000090A00000000000000909000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0B00CBE0ACBE9E00DBFFFFFD009A0BCDAF0FAFCBE9EF0CB0B09AC900009090BC900A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0CBA09ADADEBCB0AFFFFFFA0000BEBAE9EBDEBE9EBFAB9EDAB09A9B0B0FAF0B0BF90B09A9F0ADAF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F09A00DAF0BFADA00FFFFFFF0000F0CBC9E9FEBF0FADFDFFFBDFFBFCB09FBDBFDFF0FFCB0DADF9FF9F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0A09ABDAFE9FA0A0BFFFFFF00000ABCAEBEF9E0F0FAFBFFFFFBDFBFFFADFFFFBFFFBDBFBFBFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ADADA0C0ADBFEDE90D0FFFFFFF00A9CA90BCBEF9EAF0FFFFFFFFFFFFFFBDBFFFFFFFFFFFDBCFFFFFFFFE000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0B00F0BFAFCBFA0EABFFFFFF00000A9EADAFDAADADAFFFDFFFFFEBFDBDAFFFFFFFFFFFFAFFBFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCAC0B00BCFFFFE9FADFFFFFFF0009CBCA9E9FAEDA0FAFFBEBFFBDBDFAF09FBFFFDFFF9F9F9BDFFFFBFBF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B9BC0A9EBDEBE9EADADFFFFFF000A0A0F0BEDE9A9FADFF9BC9F0F0B9F0B00DADAF0FBE9E9A9A9FADFCFDA00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E0A090E9EBFCBE9EBEBFFFFFFF0009CA0FCBEBE0E0FAFF00B00A90000900B09A90B0090B0D00B09A9A9A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0F0BACB0BCBADAE9E9FFFFFFF0000A0BCABFCF0F0FADFF00000000A9000000000000000000A9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0B0BC090ADABCEBDA9EFFFFFFCA0090BCAFDEBABCBADFAF0900090000A000900900009A0090909A0900A090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0E09A0BDACE9A0ACABFFFFFFF000ACAFDBEBDEDACFAFFF000B00090000900A00A09A0090A00A00000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F00B0BC9E0A9B0E9E9AD0BFFFFFFF00090AAFDEBAFFAFDAFF0A0000A000900A009000000000000909000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009A9ACBCAA0BCACB0E0ACAFEFFFFFF0000A0FDAFBCF0ADBEFFF090909009000009000000000000900A00A0000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009E0E0B0A90D0B0F0F0BCBF9FFFFFFB000ADBFADFCFBEFFE9E0F0000A00000A0000000900900B000A0909090090900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A09AD0F00A0ACB0A9ACB0EBFFFFFFF00000E0FEAFACBDAFFBFF09A900B0B00900000A0000A00000900A000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FA09A00BC0B09ADACBACBCA9FFFFFFE009A9F9FDBFBEFDADEBF0000090000000A900000A00000000090909000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B09E00F00A900ACA9AC0B09EFFFFFFE90000EAEFAE0E9EBFEBCF000B000000000000900000000900B0A00A009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0CA09A0A9000E9A9E00B00E9BFFFFF9000ACB9F9ADB9FAFCB9EF00000B0090A00000000900900A000090909A0009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AB09A0C90ACA900CA0B0CA00ADFFFFFF0009A0E0ACACACA9ACA0F0090009A00000090A000000A00000000A9090900A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0DAE0CB0A09000A9090CA009A9AFFFFFEF0009A9E9A9A9ADA9ADAF00A0900000090A00090A0000000900B090000A00000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009A90B00090A00A00ACA090A000FFFFFFF000A0CA0ACACACA0E0A0F0009A0009000000000000A009000A0000A0B090A900A0BC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0EACA0A00E000900B00000AC00ADBFFFF90000CB09E90A9A9E9E0FF0900009A00A00900900909000A00090909000090000009FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009AD00A90000000C00B0000A09FFFFFFE000B0ACA0ADACACA0B00F00B09A000900000A00A000000000000A0090B0000B09A0BFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0F00A0D00A9A00A0A0000A0090A0FFFFFF9A0090BCB0A9A0BCA0FAF000000909009A00009000A09000900090A0000B0000009FFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000E9090AF00A00000009009000090000FFFFFFF000CACA0AC0E0F0A9E00F9009A90A0A00009000009000C000A900009A9000900A9ADFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000009A00A0AF00B00BC0A000000A0000A0A9FBFFFF0000A0B09E9A09A0BCA0FFADBE9AD909F9B0F9ADB0E9AB0BBC9ADA9AD0F9B0CBC90FBFFFFFA00000000000000000000000000000000000000000000000000000000000000000000000000A000A009ADAD0BACB00A9090A0A0000A00000FFFFFFF000900EA00B0E9E0ADA0FB0F9FFAFBCBCFDAFDADB9FDFF0FBE9FFF9ABF0F9A9BFADFFFFFFDB00000000000000000000000000000000000000000000000000000000000000000000A0000000ADACA00BAFC9A0E90A0E0090A9A0D0A90A9FFFFFF90A0E90DA0CB0A9E9ADAFFFFFF9FDAFBFBFFDBFBEFFBFDFFDFFF9FEDF0FBE9FE9FBFFFFFF0E0B000000000A000000000000000000000000000000000000000000000000000000A00000009E9A0B0FACB0BE9E9AE9A09A0E90CB0A9CA9FFFFFFE00009A0A0B00E9E0BCADFFFFFFFFBFDFFFFFFFFDFFFFFFBFFFFFFFBFBFFDFBDBFFFFFFFF0FBDE0000000000000000000000000000000000000000000000000000000000A9000000000A0BE0A9CBCBCB0FE9E9AF90F0ADA90EBACBCA9EFFFFFFB0000ACB0F0EA9A0BCA9AF9FBFFFFFBFFFFDBFFFBF9FFFFFFFBFFFFDFFFBF9EFFFDBFFFFFF00A9FAC00000000000000000000000000000000000000000000000000000A9CA0A0090A9C9E90F0FAFADA9EB9EB0F0AE9F0A9EFBCFBEBFEBFFFFFFC000B0BCA0A90E9E0A9E0FFFDFBFFDFFDBFFFFFFFFFFFFFFFFFFFFFBF9FFFF9FBBEFFFFFFFFBCACBA000000000000000000000000000000000000000000000000000000AA900BCA09AA0AEB0BCBCFAFE9EF0FE0F9A0A9E90AFBCF9E9F0FFFFFFFB000CA9E9EA9A0BC0A9AFFBFFFFFBFBFFFFFFFFDFBFFFFFFFFFFFBFFFFFFBFBCF9BFFFFFF0CB0BCF00000000000000000000000000000000000000000000000000000F0DACBCA9EAC9E900F0FBFADA9E9AFA9B0E9E9E0AF9EFBEFFAFFFFFFFFE0000B0CBA9CBCBCBADACFBFFFFFFFFFFFFBFFFFBFFFFFFFFBFFFFFFDFBFFFDBFBFFFFFFF0FB0ACB0AC00000000000000000000000000000000000000000000000000FA0A0B0A9E909AB0EFBEBCE9E9EBEDA9CACB0B0A9F9EDBCBDAFCBFFFFFF9009E0FBEDEBEAE9ADA0BFFDBFFFFF9FBFFFFFFFFFFFFFFFFFFFFFFFBFFFFFBCBDBDFFFFFF00F0B0F0BA000000000000000000000000000000000000000000000000B0BCBE0F9E0BEAD0FB0F0FBBFBEBDFADAA9A0E09CA0ABAFBFADBBFBFFFFFE0000B0E9A9E9BDAE9AF0FFFF9FFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFFFFFBF00F0F0E9CB0000000000000000000000000000000000000000000000BCBCB09E0A9E09ABE0EBCBEDE9E9EA0FADAC9A9A0B0F0CBCBCBEDEFFFFFFFF00A0CB0FAF0ECBDBEDAFFFBFFFBFFBFBFFFFFFFBFFFFFFFFFFFFFFFFBDFBFBDBCFFFFFFFFCBF0F0FBEBCB0C000000000000000000000000000000000000000000BCBE0EBE9E9E9BE9E9FBCAF9AFEBE9FFADA9A00000000BADBEBE9AB0FFFFFFB0000B0F0F0FBBEACBADAFFFFFFFFBDFFFFDFBFFFFFFFFFFFFFFFBFBFFFFDFDABFBFFFFFFF0B0FBEBCF0F0FA900000000000000000000000000000000000000ACBCBCA9BC9A9EB0E0F0FACBFDAFF9F0FAE9EBCBC0B0CA9A9CBE0F0FADFFFFFFFC000B0E0B0E9ACA9FADADFFF9FBDFFFBFBFBFFDFFFFFFFFFDBFFFFFDFFFBFBFFDBDFFFFF9E9EF0FDFBFBFF9EDAD0000000000000000000000000000000000A90B0A9ADACBEDABCBDBEBCBF0FAFDAFAFBDBFADA0B00A900EAFADBCBADABFFFFFFB00009ABCA9ACB9EA9EB0FFFFFFFFBFFDFFFFBFBFFFFFFFFFFFFFFFFFBFFFFFBFBFBFFFFFFA90FAFBCFCBEFBEBEFBE90000A000000000000000000A9009AC0AF0F0EDA9A9A9EDAEADAFBCAF0FAFFCBCAE9EDADA0F00AB09ADFAFBCB0F0FFFFFFF00A0C0A9E0B00E9CB0FAFFFFBFBFDF9FBFFFFFFFFBFFFFBFFFFDBFBFFDFFBFDFF9FFFFFFEDAF9F9EBFBFDADBDF0E9EBE9E9000A000A009A00090AC0AA00B0D0A0B0A9EFCAF0BDBDADADBF9EBDA9FEFBDEBAFADA0AF0CBE9EBDACBEA9FBFFFFFE009CBADA9ACAF0AB0E00FFFFDFFFFAFFFF9FF9FFFFFFFFFFFFBFFDFFFFBDFFBF0FFFFFFF9BADAFEFFCFCBFFEFAFBFDADAF0E9E09009CAC09A0A090A9C9AC00A09E0F0E9ABDAFAEAFADAF0EBDAFFE9BCAF0FC9ADAF09BE9EBCBEB9E9FEFFFFFF9000A0CBCAD0B00F0E90BFFFBFF9FBFBF9FFBFFFFFFFFBDFFFFFFFBFFFFFFFFFFFBBFFFFFE0DAF9F0FBFBEDADBDF0BEFBCBDBE9FADA0A99A09000A900A009A09E00B0B9ADFEBCDBDADADAF9FADBCBFEBDAF0BACB09EAE0BCBFE9FEBEBFFFFFFFE0000FBCB0AACAF0EBCA0FFFFFFFFDFDFFBFFFBFFFFFFFFBFFFFFFFFBFFFFBFDBFDFFFFFFBF09EBFF0FDEBFFAFAFFCBEDBEBCBE9EBCBCAE9EACBC0E0B09A00000B00E0E0B00BAA0F0FAF0AF0FAFBE9E0F9EBCB0FEADB0F0BCBFEADFBCBFFFFFFB00B00EBCF09ADAF90BCAFFFFFFBFBFBFFDF9FFFFFFFFFFFFFFFFDBFFFFFFFFBFFBFFFFFDF0BFBCFAFBEBDADFDF0FBF9EF9EBDBADA9A9F9E9F9A9B0BC0A000A0000F0B0BCAF0DADAA9E9F9EAF9EF9EBDAE9E9AF0BDA0DA9EBE9BDBEDFFFFFFFFC000CB0EB0FADADAEBCA9FFFFFFFDFFFFBFBFFFFFFFFFFFFFFFBFFFFFFFFFFDFF9FBFFFFFA0F0CFBDFEDFEFBEBEBFADAF9EBCBEDADACF0EBF0EDAE0F0BC0B090A9A000A00900A90A9CB0AE0BDAF0FADAADB0EF0BCAADA0E9ADFEFEBFAFFFFFFFB00A9ADB0FADAFADBCA9EFFFFFFFBF9FFDFFFFFFFFFFFFFFFFFFFBFDFFFFFBFFBEDFFFFFF0F0FB0FADBE9FBCFDBCFDADFADBFCBBCBDBAF9FCFB0F9F0F0BC00A00C90A9C9A0A90A9C0A0E90F0E9FACB0E9AEF9AFCBC9A9A9EFEBFBFCFF0FFFFFFC000ACA0F0FADADAE9AF0FFFFFFFFFFFBFBDBFFFFFFFFFBFFFFFFFFBFFFFFFFBDBFBFFFFFF0B0FBEDADBE9FBEBEBEBFADBEDABCE9EAD9EBABCFBCB0F0F0B090B0ACBCA0A9C0AC0A0B090A00B0ADB0E90F9ACF0B0BAC0ACB0B9EDEBFAFFFFFFFFB0090BCBEBCBEBE9EBCAFFFFFFFFFFBFFFFBFFBFFFFFFFFFFFFFFDFFFFFFFDFFFFDFFFFFF9E9EDADBFEBDACDBCBDBCBDADABDE9BE9BAF0FDEBF0FADAF0BCACAC9A9A90BCA0B0B09000E090BC09A0F0A0ACBA9E0E0CB0DA0FFEFBFDEF0FBFFFFFE000A0BCBCBE9E9E9CBDAFFFFFFFBDFDBF9FDBFFFFFFFFFFFFFFBFBFFBFFFFBFBFBFFFFF9EB0FBFFFEBCBEBBAF9EAF9EBEBDEBBEDACF0F9EBF0FADAF0BCB09A9ADADAFC9ADAC0F0E0B09A00ABE0F0A0DA9AD0A9A0B0A0BDE0FBEDAF9FFFFFFFF00A0C9EBCBE9E9EBEABEBFFFFFFFFBFBDEBFBDFFFFFFBFFFFFFFFFFFFFFBFFFFFDFFFFFFE90FEDFEBDFBE9FCF0E9F0EB0FDABDE9ADB0FBE9F0F0F0BCBCBCA0DACADAF0BEDA9AB0A9ACA00E90090A9CA00E00F00D0009E0ABF9CBEB0FAFFFFFFF9009AB0FADAFAE9E9FCFCFFFFFFFFDBFBFDBFBFDBFFFDFFFFFFFFBF9FFFFFFF9FBFBFFFFFFA9FBFDFFFDFFAF9FBE9F0DA0ADABCFAADB0CBEBFAF0F0BCB0BCB09B0F09E9ABCBC9E9E90BCB0A9E0F0A90A90B00A0A0F0A09C0AAF00FACB0FFFFFFE0000CBCBE9CB0F0EBABFFFFFFFFFBE9FBFF9FBFFFFBFFBFFFFFFFDFFBDFFBFFFE9FFFFFF0DADEFBEFAFBDFFEFFDEFBADBDAD0B0D9ACBBDBCBDBCBE9BF0F00F0E9AFA9EDABCBADA9EBCB0E9E9AB0F0A90A00B09000009A0BC90AD00B0FFFFFFFF000A9EBCBEBCFAFBCFCAFFFFFBDBFDBFDF9EBDFFBDFFFFFFFBF9FBFBFFBFFFFF9FFFFFFE9A9FBFFFFFFEFEFBDEBF0FCB0EA9EBCBAE9BCBEBCBEBCBCE0F00B0A9ADADE9A9CBCF0BE9CA9E9A9AF0F0BC0BC9E00A0A000000000A000B0CBFFFFFF000BCAB0F0ADABCBCFAB9FFFFFFFFBFFFBFBDBFBFFFFBFFFFFFFFFFFDFFFFFFDBFBFFFFF9E0FEFCFFDFFFFFFFFFFFFBFFF9FFADAC09ACB0BDADA9E9BBDA9AC9EBCBCB0F0FADA9AD0BA9E9ADAD0FAD0BCA0A9AD0D00B0A0900090A000A9FFFFFF00009C9E9ADAFCBEB0FCAFFFFFFFDF9FFDFFFBDFDBFFFFFFFFFFFDBFBFFFFFFFFFDBFFFFF9A9BFBFAFADFF9EFBDEFDEBCBF0FDBFBF0F9EDAF9ADA9ECBE9E9A09A9EBCB0F0F0F0FAF0F0BCB0FAF0FAF0BCBDA0A0A900C0000A00090090AFFFFFFF000A0A0ACA9ABCBCB0BCFFFFFFBFBFFBFBDBDBFBFFFFFFFFFFFBFFFFFFFFFFBF9FFFFFFCBC0F0FFFFFFAFFFFEFBFFFFFFEFFAFCBCB0A9A9E0F0BCBBCBCBC0F0F0F0BCBE9AF0BCB0F0BCB0F0BCBDADACBCA9E9E9EB0B0B0A90A00A0009FFFFFFA00A9CB0DA9CBCBCBCBCBFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFB00BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0F0BCBCB00B0B0F0BCBCB0F0BCB0F0BCB0F0BCBFADA9A9A9E9A9A00000000000000000BFFFFFF00000A00A00A00A0A0A0A000000000000000000000105000000000000D4AD05FE','Michael is a graduate of Sussex University (MA, economics, 1983) and the University of California at Los Angeles (MBA, marketing, 1986). He has also taken the courses "Multi-Cultural Selling" and "Time Management for the Sales Professional." He is fluent in Japanese and can read and write French, Portuguese, and Spanish.',5,'http://accweb/emmployees/davolio.bmp') +; +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(7,'King','Robert','Sales Representative','Mr.','1960-05-29','1994-01-02','Edgeham Hollow +Winchester Way','London',NULL,'RG1 9SP','UK','(71) 555-5598','465',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FEDECDACFEFCEADE0ECECBCE0CEFEFECFFEFCFEEEDEFEFEFCDEBCEFFEFCFEDEFCFEFECFDEFFC000C0A0C0CE0EDFE0FCE9FDFCBF9F9FCFCEFCF0FC000000EFCE0CE0CE0FCBE0F0EDECACBCAECACEF0FCE0FCCACE9E0FEEDE0E0E0EEDACEC0CEDEFCACAECE0CAEDEECFCACFCEDEFE0EDEFECFCFEDFFEFFFCFEEECEEFCE0EFEDFEDEFFEDFEFEFE900000C9E9CADEFE0FCBDFCBDBD0FCF9F9FFDEFFCAF0000C0CADCAC0E9ECACCFCECACADECEDEFCF0EECACECAEDE0ECECEDACFCFCEDEACF0FEF0EEFACEDCADEFED0ECBCADEEEFAEEDEFEEFCFEEFEFEEFEFEFEDACBCF0EFEDE0FEFEFECFEEFEFFF00C0CE0EC0EDEFACFCBDBCBDFE9FDB9E9E90EFFCAC0CA00C0EFCACCECEC0ECACE0FCEDECBCAC0E0ED0CEDEBCDE0FCF0E9EEFEE0E9E0DE0ECACEFDFCCCAFCEECFEEFCECECE9ECFCFEFCE9EEFEDEDEFDEFFFEDEDECEEFEDFEFEFEFFCFFEFDEFDEFF00000DE9ECEFEDE9EDADFDAF9F09EDF99CF9EFFFCAC0900CC0EC0E9CACE9CF0EC0F0E0ECFCFECFCEEBCACCEACECACECECFCBCFCECEECFCEDEDEEFEBCECBC0FCFCAF0F0ECEDEEFCFEFEFEDEFEFEFEFFEEFFEACEFCFCEEFFCFEFCFEEFEEFFEFFEFB0C0E0F00DEBCE9E9FDADBDCF0F99ADEB90D0FEFFDECA000ACDAC0ECDACE0EC9ECECFCFE0ECBECADCECEBCCE9ECECADEACECFACBEC9EE0FCEADEF0CEFECEFEEBEFCECEDACAEDEAFCEDECFEDACFEFEEDFEDFCE9EE0EDFEEFEDEFEFDEDFEFFEFFF00000C0CFEFCDAD9E9EDBCFBDF9CBD99C9F0FCFDEFBCC000CCACFC0EACCACCACCACAC0E0FCECCBCEADACCE9ECE9E9ECEDEFEDEFCCBECDEEBEDEFFCAC0CEFEFDECCCAC0EECEDECFCFFEFFEFEFFEDEFFFEFEAEDEECFEFEEFFFFEBEDEEFEFFCFEFCF000CAEEDEBCBC9E9CBDADBDE9A9C9CE9E09D0FEFCFE9A00CACF00E0CCADCADEADEDEEDECE0FEECFCECFE0ECE0ECECF0ECADEECFEECFAEDEDEFEFFCBCAC0CEEFEBEDEF0CBCAEFEFEEF0EDEDECFEFEFEFDEDCAEDACFEFFDEFEFCFEFFFEEFFEDEFFBC00CDFAFCBDAD9CBD0FDCBFDF90A99C9FCBCBCEFCFED000CACECCEDACE0E0CCACAC0EDAFCAC9E0E9E0DECACFCACACEDEFEE9E0F9EECFEEFEEDFFFEFCBC0C0CECEACEFECECCECEFDEFEEFEFEFEFDEFEFEEFCCECEFFCFEFEDEEDEECFFDEFFFEFEFBC0EEDCBC9C9E9D0FDAF9CBDAD9C0BD090D0D90EE9EFE900CBCBC0EC0CECE0ECECFE0ECECFECEFCECEACEDE0ECFCE0ECE9EEDEEEDEF0FCFFFAFFEDFEFEFBCAD0CCE0EDF0FACFFEEFCFCFCEDEDEFEFFEF0EEF0EFDEFEFEDEFFEFFFEFEFEFEDEFFC00CB0BC9E9E9E9F09D9EDDADBC90C0FCF0F0E0DCEDEF000CCEC0E0CE0C9CECBCACCFCBCBC0F0CACADCE9CACC9E0FCFADECFECFCEBCEEFEB00FEFEEDFCFCEDEECA9CCEEECCFECEDEFEFAEFEFEFEFFEDFEDACEFFEFFFEFFEFCEFCEFEFEFCFEFFEFFCE0FC9E9E9CDBC9E9E9FADF09A90B9090D099CAFEEDA900EF0E0CE0CACE0DECFCBEECECEECEECDECE0CECFAEECE0ECEEFACBCEFCEDFFB000FFCFFEEFEEFEE9FCEF0C0CFE0EFFEFEDEDE0FEFEFFEFE0ECEDEFEFEFEDFEDEFFEFFEFCFFEFFFCFEFF0D09E9D0F9ACBD0F9E9DE9F99C9C0DAD0BC09C0CFEF00CECFCE0C0ECACEACACEED0EDAC0F0DAE0E9EACACC0CBCECFEDEDEEFACFFEF0C0E0FEFECFFCFDEDEEEFCEEBCE0EDEEDEEFEFEFECFCFEFFFFECBCEFEFFFEFEFEFECFFEFCFFEDEEFEFEFCAF0F0DADBCF9DADBC9F0F9E9E0909A0DAD09E00E0CFEB00CFAD0E0C0CC0DEDEF0EEFCACECCECCECECCCFCACECCACBCF0EEDECFCEFFEB000EFFEDFECBEEBEFDECBEDEE9C0ECFEFDEFEDEDEEFEFEDECFECEFCFEFCFCFEDEFFEDFEFFEFFFFFCFEDAD0D0F0DAD90F0D0DBC0F09F09DA00D0090F0909CEFED000FEDEC0CACACECACECED0CACDACACAC0F0E0E0ECACACFCEEEFE9E0FEFFBC90E0F0FEFEEFFEEDEDAEEFEDEEDEFE0CE0FEEDEFEEFCFEFFEFFACEFFFEFEFFEFEFEFEFEEFFEFEFEFEFBCADAD0F0DE9DADF9E9F0DBD9FC9F09C909F0D0900CEFF0CACFEF0E0E0C0CE9ECF0F0ECACEACEDACCE0ECE0EC0CCE0E0FCBCFCEFEFFACA0E0E00FCFCFCEDFEFEDEDECE9EFEDEF0ECEFFEFCADEFEFEFFECF0FEFEFDEFEFCFEFCFEFFFEDEFCFEDECFC0D0F0DBC9E9E0D9F0DBC9E99F0F0BC0000B0C9000CEFFCFE9EF0C0C0E0CEDACECF0EDACCCACCE0EC00CC9EDEBCFCFEFCE0EFDE9E9000000A0FFEFAFEEDECFEFAFEFEDEFACFE9E0CEFEFDECEDEDEFFECEFDEFEFEFCFEFCEFEDEFEFFEFEFFEFCA9CBC9F0F9F9F9F0F0F0DBC9E0D90D09B0D0C90A900FCEFFEFECCFE0E0CE0ECFCACAC0ECA0FCAC0C0ECEBEECACCE0ECCACFFDEFFFA0A00A0000FEFCFCF0EF0ECEDEDEEFECFFECFEFCACFEEEBEFEFFEF0FEFEFDFEDEFEDEFFEFFFEFDEFCFCEFCB0C9CF0DF9EF0FCBDBD9F0D0F9F9E9A9C0D009A90C000EDEFCFCBE0C0CCACEF0E0DECCE0CCEC0C0EFE0C0CC0BC0E0CCBEFFEFEFEA00000000000FFFEEEFEFCEFE9EEFEDECBCECFEDE9C0EFFDEDEFFEFCEFCFEFEEFEFCFEFFEDFEEFFEEFEFEFCF0F9EB9DEBCF9DF9F0F0F0F0F9C9E9C9CA90A900C0900CEBCFEBEEDE0CA0CE9CE0EE0E00CCAC0E0EC0C0E0E0ECEECFFEFEDEFCFF0900000000000FCFFFDEDEEFCEEDE0FEFFEEFEFEFEFFFCCEEEFEFEFFEFEFCFEFFEDEFEFCFEFEFDFEFFCFEDE0909C9DEBDDB0FADE9FDBDBD99E9E9F0F99C900D0900000CEEFDEDECAC0CE0CEACC0CC0ECA0C0ECE0CACECEDEDEDAFE0FCFEFEF00A00A000000000FACFEFEFE9EF9ECEFCEEDEDEDACFCEEFAF0DEEDEFEDEFFEEDFCFEFFCFEFEFEDEFEFCFEDEFBCBCADADDEBCDFDDBDE9E9E9EDAD0D09D0F0B0D00A0090000DCEFECBEDAC0CFC0CACE0EC0ECEEC0C0CACBCBCE0E0EDEDEFECFCFEB00A000000000A0FCF0FFEFCFECEFE9CEDAEFEFEFFEFFDEFCECADEFFEFEFCFFEEFFFEFEFFEDFEFFEFEFEFFE009C99FDBE9DBF0FADF9FDF9F9BDF9ADADB0D0DA90D090000CEAFCADECEC0CACACC0C0E00E0C0C0EADEDECCECADECEEFEFCFFEBA0A0A0000000000C0FE900EFFFECFFEDEFAEDEDEDEDECFEEFFEF0CEEFEFFCFEFEFFFEEDEFCEFEEFFEFDEFCFE09FCBCFCBD9FFEDFFDFBEDF9EF9ED09CBC90D0F09C000000000EDCEFE9E90EEDAC0AC0ECDECC0E9EFCCACADACBCECFADEDEFEAE0000000A000000000AF0F0000FEFFECFAECFCEEFEEFEFFCFFEFFEFF0CCFEFFEDEFCFEDFEFEFFCFFFCFFEFEF0C9C09CBDBDEFE9FBDFBDFDBEDBCFDBDE9D9ADBD0F09090C00000CEBCFCECEC0C0C0CCECF0E0CADCE0CBEDECECECEDAEDEBEDAFC9A0A0A0000A00B00A90BE0A000CFEFFFCFEFCFDECF0EFEFFEDEFCFEDEACCFFEFEFFFEFEFEDEFEFEFEFEFEDEEF9A9CBDEDEDBDFFDFEDFE9FDBFDBDADB9E9CDADAD0F0CA90900000CE0EF0F0FCACACA0CA0C0E0EE0FECCAE0F0E9E0ECFECEEFCAA0C9000A0000000A00A0F09000000DFEFEFCAFEAFEEFEDEFEFEFEFEFEFD0EFEFEDEFEFEFCEFFCFEFEFEFCFEFD00D0FCBDBFBDFBCFFBFFFFFFDEBDF9FCF9FA9D0DAD0990000000000CFE0FCECAC0C0CCACCACECD0EC0FEDCFCEDECFCBC0FFCEA9C0A0A00000000A009A0AF0A000000FEFFEDEFFCFCF0FCFEFDEFFCFCFEFFEFFFCFEFEFCFEFFEEFEFCFFCFEFA90E9CBCBDEFDEFFFFFFDFBDFBCFBDE9E9F9F0DDADBD09F0009000000CE0CFCEAD0CACACACCADE9E0EDACE0CEACE0E0E0ECFECA9000BC0000000000000A090FF0C0090009EFFFECEFEFEFEEFEFEFCFEFEDFEEFFEEFFFEDFEDEFEDFEFFEDEFEFCFC09E9FDFF9FFDFEDFFFFFFFDFBFDBDBDF0F0DB09E9CBC0AD0C090000ACFEE0FCE0C0CCCCADE0CECE0ECBCFACCBCCFCECFEF0B0A0A00A900000000000000A0FEB09A00A0000AFFFECFCFCFFEDEFEFEFEFEFDEFFDEFEFFEEFEFCFEFDEFFEFEDEF0BC90F0F0FFDFBFFFFFFFFFFFFDFADFCBDF9FBCFD9E9DBD9090000000C0C9EF0E9E0CAF0FCACE0F0EDACE0CE9ECAE0CFE9EACA0900AC0A000000000000A000FEDA000090000ECFEDEFAEFECFEEDEFEDFEFEEFEFEFEFDEFDEFFFEFEFFEFEDEFE09C9EFCFDFFEBFFDFFFDFFDFFBCBFDBDBDADAD0B9AC9AD00F0E90000000E0ECECFCC0ECCACACDACCEC0CE0EC0ECADCEFE9E90000A0900A00B0A0A00A0A00000F9A000900000000EFFFEDEDEFFEFFEDEFEDEFFFFCFFFEFEFEFEFEFEFFEDEFEF090D0F9DBFFFFDFDEFFFFFFFFFDFFFDBDEDADBD9FC0D9FDADF9090090000CC0E0FCACACFCACEDCAC0E00CE0CC0ECADEEBCB0A0A9000000A09A000000000000000BE90900A00000000EEFFEFEFEFFCEFEF0EEFCFEFFEDEFEFFEFFEFDEFEFEFCFE9CBCBCFEFDF0FFFFFFFFFFFFBFFBF9FEB9BDBC9E99F9E90F09AD0D000000CACFCADEFCAC0DE0CACEC0ECE0EF0E9ECECFDA000000AD00E000A0A0A000A0E0F0B00F0A00A090000000000CFEDFEFCFFFCFEFDEFEFFEFFEFFFCFFEFFEFFEFFFEFEDA0D0F9FDFAFFFFFFFFDFFFFFDFFDFF9FDEDADBF9E90F9ED9FC90B0B000000C0CFCAC0FCACACFEC00EC0E0D0CECECFFBE0F0A000E0AF009A000000A00000A00000F90009000000000000ACFEEDEFEFEFEDEEFCFFEDFEFFEEFFEFFEFEFFCFEFED00DADCFCBFDFFDFFFFFFFFFDFFFFFFDEF9F9F9C9E9E9D09AD0BDE9C09000000EE0EDEFCADECE0C0EC0AC0ECEC0FEB00C0FA0000ADFC9EBE0A0B0A000000000A0A000090000000000000000EFFFEFFEDFEFEF0FEFFFEFFEFFFEFFEDFFFEFEFDE90DADBFFFFFFFFFFFDFFFFFFFFFFF9FBF9F9E9E9E999DA9ED9BC09909000000EC0CFCACADE0C0C0EC0ECCF0E0EFE90000A00000AC0A0A00009A0A000A0000000009F000000000000000000000EFFFEFEEFFEDEEFEFEFEFFEDEFEFFEEFEFEDEE00E9DEDEBDFFFFFFFFFFFFFFFFFFDFFDFDF0F9F9F9ECF09C9BCDBDBCBC900000C0FE0ECFCE0CE0E0CAC0DACECFE900000000000000A000E0F0A0000A0000000000A0AB000000000000000000000ACFFFFFCEFEDECFFFFFEFFEFFFEFFFEDFFEDF9C9E9FBDFFFDFFFDFFFFFFFFFFBFFBEFBFFDBDAD09990F0BC0B0DAD909A900000C0ECBCAFCAC0CCE0CEECECFFCB0000000000000000000000A0BA0000AC000000000D00000000000000000000000ACFEFEFFFFEFEFEFEFFFEFFEFDEFEFEFEFE00DADFCFFFFFFFFFFFFFFFFFFFFFFDFDFFCBFEF9FF9EDB9CD9F0F90BCBC9000000EC9CECFC0C0E0E0ED0CEFB00000000A0A000000000000A0E90000A0AC0A00000000A0000000000000000000000000EFFFFEFEDEFFFEFFFEFFEFFEFFFFFEDA90DADEFFFFFFFFFFFFFFFFFFFFFDFFFFBFDBFDF9F99E900DA9A0D90FD9C9000000CC0EEDACACAC0F0CCAEFB000000000C0000000000000000000A00A0009A0000A00A09A000000000000000000000000000EFFFFFEFEFFFEFFEFFEFFEFEFEFE90DADFDBFDFFDFFFFFFFFFFFFFFFFFF9FDFFF9F9EDEF9F9F09C9DACF9A0BCB900000ADC0ECF0CCACCCAFCF0000000000A0A000A000000000A00A00A090ACA0000000000E9000000000000C0B0A00000000000EFFEFFFFFEFFFEFEFDEFFEFFDEF00D0FAFDFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFF9F9F0F09F0BC99B0D9C99C09000C0E0DADECACCACECFA90000000000C090A0000000000000000900AC90CBCA000A900BE000000000E009A0000000000000000EFFEFEFFFEFFFFFEFFEFEFEF00DAFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF09FF9F9F99E99C9E9C9ADBCA99000000C0ECEBC0CACFAF00000000000000AC000000A00000000A0A00000A000090A90000F09000A0A0E9CB00000000000000000C9EFFFFFEFFFFEFEFFEFFFEF09E9EDFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FDF9FFF0F0FC9E99E9A9C9AD909D9E00000E0EC0FC0DEEDAD0000000000000A000A0E0000000000000000A00000A00A0000000FCA00000000A00A0000000000000000A0000EFFFEFEFFFFEFFEFEDF000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF9F9FBDB9F9F090D0BC9BCBDA099000C0C0CEACEE9E90000000000000000A0AC000A000000000000A00A0A0000000000000AF0000000A00A000000000000000000000000CFFFFFFEFEFEFFFFEA9CBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDAFF9E9DADA909F9E9C9BC9909DBCB0000C0CBCDE9E9000000000000000000000A0A000000A000A000000000A0E0000900000FE9A000000000000000000A00000000C0A0000FEFEFEFFFFFEFEFF900DFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFBFF9FE9FB99F9F09090B0C9ACBCB0909000ACACEA0A0000000000000000000A0AA00000A0A000A0000000A00AC090A00000000FA00000A0A0A00000000A000A0000A0A0C0000CFFFFFFFEFEFFFFC0CFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FDF9F99F9C9E0D09ADAD0D9AD9D90DAD0000C0CCAD0000000000000000000000000000A000000000000000000000A0900000000FF00000000000A0A0000000000000000A000A00CFFEFEFFFFFEFCB9ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFBDB0F90BC990BC9090B00900BCBD9B000C0E0FCA000A000000A0000000000A0A0A00000A0A0A00A000000000A00A00A000000FEB0000000000000000000A00000000C0A0C0000CFFFFEFEFFFEF00CFFFFFFFFFFFFDFFFFFFFFFFFFFFFFDFFDFDAF9F9E9DBCBC9BCBC9DBC9BC090AD09000C0CE0E000009A00000A0A000000000000000000000000000A000000000000000000FBC00000000000A0000000000A00000A00CA0009EFEFFFFFFEFFE90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBF99EDADBE99DB9C9DBDAD9A090C9D0F000C00E0DA9A00FAC9A0000000A000000A00A000A000A0A00000000000000000000A000FEB0000000000000000A000000000000C0B00E00CFFFFFEFEFFE90FFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFBDBC9EFDBDF9DBDADE9FBC9F9FC99E900A990C0ACCFA000CFAC9AC90A00A00000000000000000000000A00000000000000000A0C0AF000000000000000A000000A00000000AC0E00A00EFFEFFFFEFCE9CFFFFFFFFFFFFFFFFDFFFFFFFFFFDBDBDF9FF9FADF0FF0F9B9F0DFE9E99F090BC9C0000CAC0CA00A0CBE90A0CA000000000000A00000000000000A00000000000000000A00FFB000000000000000000A00000000000A00E0CA09CFFFEFFFFF90FFFFFFFFFFFFFFFFFBFFFFFFFF9FFFF0BCF0FFDFBFF9FFFCFDBFBDBDFF9F9E9090B090C0CEB00A00A000A009ACB0A0A0000000000A0000000000000A00A0000A00000000A0B00000000000000000A000C0A000000000CA9CA9CA0EFFFFEFEB0EFFFFFFFFFFFFFFFDFFFFFDFBDFFF90FFDBFFFDBFDFDFF9FBFBCDFFFFBCF9F9DBC90D0C00F9000000000009A000000000000A00000000000000000000000000000A00000A00F0000000000000000000A0A0000000A000A0EA0CADADFFEFFFFC9CFFFFFFFFFFFFFFFFFFFDFFFFFAF0FFFDBFFDBFFFFBFBDFFDFDFBE9FDFF9EBDA90BCB0B0EC0000000000000000A000B000A00000000000000000000000A00A00A0000A00000AD000000A00000000000000A000000C0A00C00DA0000CFFFFEFB0FFFFFFFFFFFFFFFFFFFFFFBFF9FDFBDBFFDFFFFDFFDFFFFFFFBFDFFBF9FFDDB9F9D09C9CCB00000A0000E0ACB000A000E9000A0000000A000000A000A00E90A000000000000FADA00A000A00000000000000A0A0000DA00ACACB0000CFEFFFE9CFFFFFFFFFFFFFFFFBFFFFFDBFFBDFFFFFFFFFFFFFFFDFFFFFDFBDFDFF9FBFDE9A9F09A9A9000000000A0E9ACB0000A00A000000000A0000A00000000000E00000A000A0000FFA00000000000000000000A9C0000A0A00A000000A000FFFFED0EFFFFFFFFFFFFFFFFFDFBFBFFDBDFFDFFFFFFFFFFFFFFFFDFBFFFFBFF9E9F0F9FDB0DAD0D000A00000A0CBCE90A00A00A00A00A00A00000000000CA000CA00A0A0000000000FA00000A0000000000000A0C00AC0A00000000A0A00000EFFEFB0DFFFFFFFFFFFFFFFFFFFDFDFFFFFFBFFFFFFFFFFFFFFFFFBFDFFDFDF9FFFDBDBF9ADB99CB00000A00000ACA9A00000000000CA00A00000A00000A00000A000000000A000000FF90A00000000000000000A0A00A00C000000000000009CFFFFC00FFFFFFFFFFFFFFFFFFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFDFBFBFFDBDBDBC9FDB0DA90D00A000000000AC0A00A00A000A00F0000A000000A00000A0000A0000000000000FCA000000000000A000000000A00A0A0A000000000A000A0DEFFBCFFFFFFFFFFFFFFFFFBDBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFDBFDBCF9FF0F9F0DB09A9000000A0000A000000000A00E00A0A000A00A000A00C0000000000000000000AB0000A000000000000A00000000000C000000000000A000EFFED0FFFFFFFFFFFFFFFFDFFFDFFFFFFFFFFFFFFFFFFFFFFFFFDFFFDFFFBFDBFF9F99F9F99BC9F000A0A0A00A0000A00000AC00A00A0000E000A000000A000A0000000000000000F00A00000000A0E0A00000000000A0A0A0000000CB00000CDEFF0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FDBE9DBDADBCBCBCB909DA000000E000A0000A0ACA9A0A000A0A0A0A000A00000A0000000000000000000E0CA0000000C0AC9A000000000000000000A90A0C0F009A0FEFE9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FDFF9F9DBF0F9F9BDB99DADA09000A0A00A0000000000EA000A0000000000A00000A0000000A00000A000000B9A0CB00000A0E9A000A0A00000000A000A000090B000A00ACFFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBF9F9FBD9F9FBCFDADAF099DAD0A00000ACB0A0A00A0000A0000A0A0A00A000000000A00A000000000000000E000AC0A000000A000A0000000000A0000000000A00A0000CBCFEBCFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFDFFFBDF9F9F0DAF9F9CB9BDBD9BDA990B0000A000000000000A0A0A0A0000000A000A00000000000000E0A00000000B00AC0B00000A000A000000000000000A00900A000000000ACAFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FDF9E9F99F999C9B9FCBF9ADA9C9E900A000A0A0A00A00000000000A0A0A00000000A000000000000A000000000E0000AC0B0A000A00C0E0A000000000000000000000000A00ADCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FBDBD9E99F0F9FDCB9D0BDBD9B09D09C00000000A0000A00A0A0A000000A00000A00A000000000A000A00000009A0000AC000000000A900000000000A0000000000A00000000A0EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FBD9F09D0B0B9DEBDDADAD0F0B0A0B0A000000A0A000000000A00A000000000000000000A0000A000000000E0000000A000000A00CACA0000000C00000A000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDBF9F999F9DB99D9D0B9DABDBDB999C9D000000A000000000000A0000000000000A0A000000000000000A000000090000A0000A0000000A009000000E0B00000CA00000A0000000A0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBD9D90DF0B909DA90BD0F9D9E9F09E9F0A00000000A0A0000000000000000000000C0A0000000000A0A000000000E0A0000A000000A0AC0F0ECB0A0000EB000A0C00A0000000000009CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBDBF9FDB9D9F9F999D09F09EB9F9F090099000000000000000000000000000000000A90000000A0000000A00A0000B0000A00A000A00A0A000ACE9000A0C0E9C09A0C0A0A0A90A00000AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDFFDFF9FDBDF9D9FCB99C9F99DADB9F9F90F0A0A00A00000A00A000000000000000000E0A000000000000000000000CA00000000A00000000EADA9E00000A000A0AC0B0C00C00000000ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFDBD9F9FDB9F0B999CB909CB9DBCF9090F090000000A0A000000000A0000000000A0000000A0000A00A0A0A000000B0000000000000A0A0A000E00A000000A00D00AC00B0A0A000A9E0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFDB9BDBF9F9B0D99D090990BDB9EBDF90F9F090A0A00A00000A0A000000000000000000E0ADA0000A0000000000A0000E0000000000000000A0A0A0A00A0000000A0AD00E0C00900A0000AEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFBFDBFDFD9D9FFFDFBE9B90DB0D09C99CB9FF9099E90000000A0A00000A00000A00000000000000000000000000E0A0000009A0000A0000000000000A000A0000000000000A09A0F00A000A009CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFDFFDB99FFFFFFFBDFFDEFB0D90909E9BDADBF9E99E90A0A000000A0A0000000000000000A00ACA0000000A000A00D0A00A0E9000A00000A00000A0A00A000A0A00000000A0DAC000E00E900A0AFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FDFFDFFFBDBDFFFFFFFFFFFFFBDF9FB0009090DBDBF9E9F090000000A00A00000000000A00000000000000A00A00000A0CA0A00000B0000000000C90A000000A0A0A000000000A000A00B0E90E00CAD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD9DEFFFFFFFFFFF9FFF9EB9E9900009DBC9F9F990DADA0000000A000A00000A00000000A00ACA0A000000000000A0E00CA00E00A0000A0A0A000000A000000A0A0A0000000B0B0000CB09EB0ACBFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F9FBDF9DAFBFFFBFFFBDFFFBDB9B9C99CB00000099E9E9F0F90900000A0000A000000000000000000000C0000000A0A00000CADA90A0DB00000000CADA0A0000A0A0A00000000A000A0A0A000ACAC9CB0ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEFDFFBF9DFDBFFFDBFFBFB990D0D0900909000000B9F9FDB0F9F0A0A000A000A0000A00A00ACA000000A0CAC0A0000000000ACACA000EACA00000000000000A0900000A0A0A0A090A00000000000A0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB9FF9009EFBDFF9BD90D9CBD9B9B909F0909090090D0F9B9D090900000000A000A0000000000000A0A000A00B0000000000A000AC9A0F00000A0000A0A000000A00A0A000A00000A00000000A00B09000F0FFFFFFFFFFFFFFFFFFFFFFFFFFF9BDF909090F99FF9F9DBDBDBDB9C9D0BD090D09A99000B90FDA9ADA90A00A0000A000000A000A0A0A0C00000CAC09A00A0000000A00A00EBE0E09A0A0000A000000000000A0000A0A0000A000000000A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFBFDB0F900009F9F9F9FBDBDBDBDFBF9FDB9DB9BD9D0D99CBD9BD9C9CA000000A000A000A000A00C0000A0000A000E0CA000A0CA00000000FCB00E009000000000A00A00E009E9A0000A9A090A0000B000B00ACFFFFFFFFFFFFFFFFFFFFFFFFFFFB9DB99BD9DBDF9FDF9FFFFFF9F9DBF99E9E9C9ADA9A0909AD9B0B9900A0000000000000000000A0A000A0A000A00EADA0C0A00F0000000FBCEB0F0A0A00000A000900F0BE00A00A0B0000A000B0000900000FFFFFFFFFFFFFFFFFFFFFFFFFFFF9DB9CBDBFFFFFFFFFFFFFDBDF0FBD0FBDB9FB9DB9D9990F99E9D9E9B0000A000000000000000A0000A000000000A0CA0F0AC0E00A00000FCB00C0A9C9000009000A0F0AC00B000900E0A000B000A00A00A0FEFFFFFFFFFFFFFFFFFFFFFFFFFFB9A9CBDFFFFFFFFFFFFF9FBFFBDBC9F9C99E9DCB0DBCBCB90F9F9A9C000A00000000000000000000A0000000000000A9E0E09A0A0000000AB0DA9AD0ACA00A00A90000E90B0000A0A09E900000A00900B0900FFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9BDFFFFFFFFFFFFFFFFDF9DBD9B099E99A9B9DA9909C990F0D9CB900000A0000000A0000000000A0A00A000000000000A0C90A000000DEA0000A90B00000000A0000A000A00000E00EB0A000F0A000ACBCEFFFFFFFFFFFFFFFFFFFFFFFFFBDB0BD0BDFFFFFFFFFFFFFBFBFBDAD99A0909D09CBDADB9BCBD9B0B90DA000000A090000000000A0000000000A0A00A00A09CA0E090A0000A90000000ACADA00A0AC0B00000000000A0AD00009AE0E90A00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF990FFFFFFFFFFFFFFFFDFDBDBDB9C990F009E990990D0990FDBD0F0900000000A00CADA000000000000000C000000000A00F0A0000000F000A000A909A00000DAF0000000000A09C0A00A0AC9EBCA00A0AFEFFFFFFFFFFFFFFFFFFFFFFFFBDF990FF9FFFFFFFFFFFFBDBFBDBDBD0B909009909E9F0F9B90F9090F99000A00A0A00E9A00000AC0000A0A00A00A000000AC0E00000000009A00900900A0000000AC0A09A0000000A0B00A00000E0EA900000CFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF990F9FFFDFFFDFBDFBD9DBDBFBD9E9099E090909909CBD9F9F990F090000000000AC9A0A000ADA0900000A0009000000B0A00A0000E0E9A00B000090A900000AC9A000A00000000E009A00A0EDEEB000A0FFFFFFFFFFFFFFFFFFFFFFFFFFFDBDF999F9FFBFFBFFFBD9B9BDFFDBF9DB9C990DA99E9F990F90F0F9D0B0F0A00A0A000AA0000A0000ACA0A00CACA00900A00000000B0E9EB000000B00000CA000090A00A000A0A0A0A90E00000CA0E9E9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F09FBDFDFFF9FDBFFDFFBDFF9FBDA9AD9BD9C9909E99EDBD9E9BDD0000A0000A0000A0A00A0A0090000A09000A0000000A000C0CACA09A0F00000ADA90000A00CF0E9A00000900E9A0A00A0E9ECA0E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFDF9F90DFFBFDBFFFFFFFFFFFF9FBDBD9D9BCB09A09E99F9B9DB9F0D9A9A00000000A0A0000A00000E0A0A0CA0A900C0EABC90A0A0ACFF0000090A000A000000000A0F0E00A0A0A0B0AC9090000A0BCB0CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBF9F9A9FDBFDFFFFFFFFFFFFFFDFF9E9AD9BF99DB9DF0FDFADE9DABD0000000A0A00000A00000009000C0BC9C000B09C0A00000EDAE9A000ACB0F0C90A900000BCEFF0F000000A009A0A0A000000ADB9DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9F9F99AFDBFFFFFFFFFFFFFFFBDFBDBDBCD9E90DB9F9B9D9BDB9DCBDB000A0000A000000A0000A000A000A0ACB00A0BC9A00000ACFE9000DACF09A0AC0090A9CAF0FA00A00B00A0A000000A000FDBDFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9DBDFFFFFFFFFFFFFFFFFBDBDADBBF99FBCF9FDEBFDBDE9BDA00A0000A0000A0A000A00000A09A00C090E90000A0000A0CB0B00A0ACB00A000900AC9CAD0F09CB0CA00A90000A0B090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFBDBDBFBDFFFFFFFFFFFFFFBFDF9F9DBD90F0D9BCB9BDDB0F9BDF0B00000A000A090000000A0A900000A0BEE90F0009000000A0ECA0D0000A000000A900A0B0A0E0E0EB0E900A000000CADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FBDFFFFFFFFFFFFFFFFDFBDBC9E9E9F9FBFDBDFDBBDF9FDA9F00000000A000E9E9A00000000A00000C0FFE9A000000000000BDA0A0A000A00A0000900009E9ADADE9A0AC90A09A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFBDFF9FFFFFFFFFFFFFFFF9F9B99E9F9F9FDB9FDE9FF0FDADA90000000A000000000A00A00900000AC0EBE9A00000000000CA0000000A000D0B0A0A90000000A0A0000B0AD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDFBFFFFFFFFFFFFFFFF9FBDBC9F9F0F9E9BDF0F9FDBF9BDB0000000A000A0A0A0A000000A00A00009A9C9000900000A00AB000A00AC090A0B0C9C900A0A0A000000CACAD0A0CFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFDFFFFFFFFFFFFFFBDFBDAD9F0F9BDBDBDF9F9F9BC9FC9AD0A0000000A00000000000000000000A0000A090A000A000ACE9000000A0A090009A0E000900000A00A0F0FAF0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFFFFFFFFFFFFFFFFBDBDB09F9FDBDBDF0F9F9FDBF99F9AD0A0A00A00A00000900A00900900A9000B09A000A00000000FAB0A0A0E0CA0B0A0090A000E90A000000EEFCB00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFF9FF9BDF9F0BDADFB9F9F9EBD9CFA909A9090A00A000A00A0A000A00A0A00E9E9CAC9A0000000A0A0BD0000009EB000090B0090A000A0000A0ACBCB0CBFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFFDFFFFFFFFFFFFFFFFFFF9FDA9E9F9FDB9CF9F9F9DBFB99F909E0E000A00A000000C0B09009009E000A09A000A0000A0000F0A9A0A0E0009000000A0A00A0000A000CBEB0E9EFF9FFFFFB9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFF9F0B9F9F9F9B9FB9BD0F9FAD9CF09CB0B000A00A0A0000A0B00ACBC0A0000A00A000000A00000A0A90000000A90090000000000000A0000A000000ADFFFFFFFF9FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFF9FFFFDBFFFFFFFFFFFF9FF9F9D09E9E9C90D9CB9E9D9E9B9DA90000A00E00000A9090000909A90A0A000000A00000000A00AFE9A9A0A000A00009000000000000A000A0A0000FFFFF9FFBD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FFDBFF9FFBFFDFFFFFFFFFFFFF9F9A9F99F9B9F90B9099A999E9E99F9A000A00ADA090A0A0B0A0E0E000000000000000000000A00B909000000A0DA9A000000000000000000000A09FFFB9FDFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FF9FFF9FFFFFFFFFFFFFFFFFFBC9D0F990909090D9BC9DADBD9BC90000009E0A0A0AD000C0900909A000000000000000A00000AF0A00000A00DAC0D0000000000000A0A000A000CFF9D9FBFBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFB9F9BDBF9FFFFBFFFFFFFFFFFBDBD9B0B90C90D0BC90BC99AD9D0BC9A9A0CA0E000000DAB0A9ACADACA00A0000000000000000A0A0A909A00000A0A9A0B000A000000000000A00000FFF9BDDFFDFFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBCBDBC9F9F9FDFFFFFFFFFFFFBDB0D9D0B909BD99BD99AD90B0BDB0D00B0CA00A000A00CBCADADA9000000000000A0000A0000000DA0000000000000000A0000A000000000000A00CFFF9AF9FFFFFFBFFF0FFFFFFFFFFFFFFFFFFFFFFFBDB9DBDB909B90F9FBFFBDBFFFFFFFFDBDB009009F099E9CBD09A99C909DB0F00A0CB000A00A0000CACACA0A00000000000000000A000A0A90090000000A00A00000A000000A0A0000A000FFFB9D9F9BDFFFBDB09DFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F9F9C9B909C9FDFFFFFFFFFBFF9099A99099F099B90BD9CB09F090D0F0CFACA0000000A0A0A0A00000A0000000A0000000000000F00A000000000000000A00000000000CA9A00CFFFF9D9B9DFFBDB9E90FEFFFFFFFFFFFFFFFFFFBFFF9FF9F9FDB9F9BD0999B9FBFDFFFFFFDF909F0C9ED9F0F9E9CBD90B0DB09E90B0A0A000A00000000000000A0000000000A0000000000000A0F090A0000000A0A0A000A000000A0A000C9CBFFFFBB9CB9F9FFDF9B09FFFFFFFFFFFFFFFFFFFFF9FFBFFFFFBFF9F99B9F09CBDBFFFFFFFFBF90099990E990909900090900D09E9C00000A000000A00A00A00000A0A0000A00000A0A0A00A000B0A000000000000000A0000000A0000A0A0A0CF9FFFDB990F09FBF0900DFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9E9CBC9099DBDBDFFFFFFF9F9F9000A990000000090000090B00909A0A00000A00000000000A000000A0000000A0000000000A0E900000000A0A0A0A000A00A0000A00000000FBFFFFF9F9999F9F9909CFFFFFFFFFFFFFFFFFFF9FFFFFDFFFFF9F9F9B9F9A99E9F9FFFFFFFFA90090D00000000000000C90909F9000000000000A0A00000000000000000000A00000A0A0A0000B000A000000000000A0A00A0000000A00A0DFBDDFFFFFF990FFF9CA90ADFFFFFFFFFFFFFFFBF9FFFF9FFBDB9909090D0909CB9F9FFFFFFFF9D9090000000900000C090B00F0D0000000A000A0A000000000A00A0000A00A000000A0000000A00A0000000000000A0A000A000A0A0000000A0EDBFFFFFFFFB9090B9900DBFFFFFFFFFFFFFBF9FFB999B0090000000009009090D0FFFFFFFF9FB090090900000000909E909090B9B0000000A00000A0A000000E90E0A00000000A000A0A0A00000DA0000000000A0000A0E0F00000000000000FFDFFFFFFBF9E990000900DFFFFFFFFFFFFFDFF9FDBE9DBD0900000000090B090B99FDFFFFFF9F9E900009E909ADBCB9090090D0C090000000A0A000000000000A000CA0000000000000000A0000A00000000000000A000000A0A00000000000E9F9FFFFB090900909000D0FFFFFFFFFFFFFBFFFFBD9FBDBFBD0900B00BC909099CFBFFFFFFFF99909090009CBC90900909BCB09B900000000000A0A00000A0A0C0A0A00A0A0000A00A0A0000A0000000000000000000A0A0A0000000000000ADF9FDBFB0D09009000009AFFFFFFFFFFFFFFFF9F9FFB9CFFDFFFB9D0D9090909E9FBDFBFFFDB0F0F9A90090009090909CAC00909C00000000A00A0000000000C00A0000000000A00000000A0000AF00000000000000000000000000000000000FBDFFFD99000900000000CDFFFFFFFFFFFFFFFFFFFF9F999F99FDFB9A909090F9DBDBFDF9FBFDB90D90090909009ACB0999990DA0900000000A000A0000A0000A000000A0000000000A0A00A0A00A000000000000000000A00000000000000000FB9DBF099900009000009AFFFFFFFFFFFFFFFFFF9FFBF9A9F0B09C990090F99BF9E9FBFF9F99FF9ADB90009090990DBCBCADB0900900000000A0000A00000A00A0A0A000A0A000A0000000000A0F00000000000000000000000000000000000F9DBF999E009A90000909ADFFFFFFFFFFFFFFFFFFFF9FFFDF9F9F9B09DBCB9AD09F9F9F9FF0FF09F990DA90000000909909900900000000000000A000000A0000C000000000000000A0A0A000000000000000000000A00000000000000000000E9BD9C9E99F9900000000CDFFFFFFFFFFFFFFFFDFFFFFDBFBF9F9FDBDA9990D09F0B0F9FF9FF9FF9F0F990900000000000000900009000000000000A00A000ACA0A0A00A000000000000000A00A0A00000000000000000000000000000000000DF9E9BDBDF9E9900000009AFFFFFFFFFFFFFFFFBFBDFFFFDFDFBDA909000090F90D9DBC9FFF9FF9E9F9F0DAD0000000000000000CB0000000000000000000000000000000A0A0A00A00A0A00A0CAB00000A0000000000000000000000A0000000E9990DFBF990009000000D9FFFFFFFFFFFFFFFFDFADBDFBB090090009090DA9E90F0FBF9FDFBDF9FDADB09099A90000000000090990000000000000000A0A0A0A0A000000000000000000000000CA00000000000000000000000000000000000FBDEFFBD90090000000000FFFFFFFFFFFFFFFFFF9DBDA9D090090090000009D9FF9FDFDFFBFDFBFFBDBFDBDAD09C900009000C09C0000000000000000A00000000000A0000A0A000A0A00A0A0A0A0000000000000000A00000000000000000000999990909000000000090FCFFFFFFFFFFFFFFFFFB909009E09C0F0BC9E9FFFFF9FFFFBFDFDBFDFBDBD0BF0F9FDB0D0F9E0909B0A900000000000000000000000B00000A0A0000000000A0000009E00A000000000A000000000000000000000000000090000000000000009FFFFFFFFFFFFFFFFFFFFDF9F99DBBD9FDBDBDF9F9FFDFFFDBFBFFBFDFFFFFFDBDF0BC9A9009D0F00C90000000000000000000A00A000A000000A0A0A000A000A0A00A90000A0A000A000000000000000A00000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFBFF9FFFFFFDFFBFDF9F9FDADF9BD99F90B009090900000000000000000000000A000A9A00000000A00A0000000EA0A0000000A0000A0A000000000000009000000000000000000090000000DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFDFDBFFDFFBFFFFFBDB9C9A9E90C9090000000000000000000000000A00000A0000A0A0A0000000A0A000B0000A0000A000A000000000000A000000000000000000000000000000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFDFF9FDBDBD09BD0900B090009000000000000000000000000A0A0000A00000000000A00000A0E00A00A0A000000000000000A0000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FFDFFFFFFFFBDB09F09090909000B000900000000000000000000A0009A0A000A0A0A0000000A000009A00000000A0A00A0A00000000B00000000900000000000000000000000009CBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFF9FFF9DB09909A0C90900090000000000000000000000000A00000A00000000A00000000000E000A00A0A00000000000000A00000000000000000000000000000000000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFFF9FFDFDFFFF99B0909E909DB9000900900000000000000000000000A00A0A000A0A0A00000A00000000B00000000000A000000A0A0000000000000009000000000000000000000000BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFBFFDFB9F0D9F990DA900090C0900900000000000000000000000000000A000000A0000000000000A0000A0A0A000A0A000009A0B000000000000000000000000000000000090D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFDFFFBF9D099B09A909D099009A900000000000000000000000000A00A0A00A00A0000A00000A00A0F000A0000000000000ACA000000000000000000000000000000000000090C90AD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFDFFBB900090D09A99E90009009000000000000000000000000000000A00A000A00000A00000000A000000000A0000000090A0A00000000D000900000000000000000000009A9DBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFBFDFFBF9D90DB9DB90BC9A90090909000000000000000000000000A0A00A000A000A0000A0000000E0F0000A0A0A00000A000A0A0900000009000900000000900000000000900909DA9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFDFFFBFDF9A0DB9CB900D9909090000000000000000000000000000000000000A00A0000A000000A0A90AB00000000000A000A00000A09009000090000009000000000000000009E9E9DEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FDFFB99DBC9BDA9990A90000909000000000000000000000000000A00A0A0A0000000000A000000ACA0A000000000000000A0A00A00000000000909000000000000000000C0909A99DADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBF00BDBF09900F99090900009000000000000000000000000A000000C000A00A00A0000000A00B0000A0A0A00A00A00000000000000000090000000000000000000900900F0D9EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FFFFFF99D9F09F9CB909AD0909090000000000000000000000000000A0000A0AE9000000CA00A00000A000000000000000000B0A0A00009000000000000000009000000000DAD9090FBDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFBDBF99E9E99F9A990F09090000000000000000000000000000000A00000E0CF000A09E0B00000A00AF0000000000000000A000900090000000000000900000000090000000900B0F0DEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF9F099BDA9C90909009A09090000000000000000000000000090A00A00BE0FA0C0E0E09A00000000A00000000000A0A00A00A00A00000000090090000000000000000000B09C90F9FBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBDFF9B0D0BDB9BDA9099090000000000000000000000000000000C0F000000E0DA9ACBCA00A000000F0000A00A00000000A00A00A00900000090000000000000000900000D09A90D0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFBDF9C9F909C909C9AC909090000000000000000000000000000ACA0A0A0F0EA000A0A9A000A0A00A00000000000A00A000A09A09000900000009000900000000000000000C000FBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFDBDFB0B9ADBDB9B909090000000000000000000000000000000CACBE090C00A9000A0000000A0000A900A000000000000A0000ACA00000090009000000000000000000090090909C9F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFBD90D909090DA90900909000000000000000000000000000A9E0FCE0B0ACA0A00000A0A0000A00EA000A0A0A000A0000000090A90000090C00000000000000000090000000CB0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDBDFBF9ADBCB9909CB09000000000000000000000000000000000A0A9AECB000C00A000000A000000B0000000000000000000A0A000000000090900000000000000000000000900DAFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBFBDF9F90999CA9099090900000000000000000000000000000A090CEE9A00A0A0A000A0A090A090A000A0A0000000000000000000000000000000000000900000000000009000DAFDAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFDFDF0F90DBC909DA90000000900000000000000000000000000C0ACAA9A0A00AC00000000C0A90A00E000000A000A000000000000A00000000000000900000000009009090000009DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFBF9FBDB909A900900900000000000000000000000000000CA0A000000000A00A9A09A00A9E9A00A0B00000000000000000000A0000000000000900000000000000000000009090CADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBDBDFBFDBDF0F909B00900090000000000000000000000000000CE9A00BCA0A00A0C0CA00000A0E9E900CA0000000A0000000A00000000000000090000000000000000009000900000BDAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFFFFBD9BDB09909C090009000000090000000000000000000009A0AC0A000000A00A0ACACA900EDA9A0AA000A00E090A0000000A000A00000000000000000000000900000090000090D0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FBDFAF0F9F0B0090090000000000000000000000000000000A0C09A0A0A90A00A0AD0B000ACB0A0090B0000000AA000A000000000000000000009000000000000000000000090000ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFFF9FFFDB9D99909D90909009000000000000900000000000000000CA0E000000A00A00000AC9A090E9C9A0ACA0000A000E9000000000000A0090000000900000000000000900000000900909EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFBDBFFFBFF9F090B00000000000090090000009000000000000900B0A90A000A90A0A000AC0A000A00090B0000000AC0A000000000A00000A0000090C090909000000000000000000090DEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FF9E9F09A99AD09009000090090000000000000000000000900E0C00A00E0CA000000A00B00E0E9A0A000A0000AC0A00A000A00900A000090000000BC90C000909000000000090A90ADBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBDBDFF9F9F9DBD9090909000900000000000000000000000000000AC90A9AC0B00A000A00A09AC0ADADA0000E000A0000A9A000A900A0A900000000000090900909000000000000000909C90DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFDFFFFBDBF9F9A909CB0900009000000000900900000000000000009C9A0E0000ACAE09A00009CA00ACACA0E9A0B00000A00C00A0C0A00000A0A0000900000000000000000000000000000C0090BC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FBDBDBE9F9F9B090090900000000090000000900000000000000000009A000009E00E09A00CAC0E0BCB0000E0A0A00CA0A000A000A0A0000000000000C09000000900000000000090090B0C9FFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBCBD99090909009000009090009C0900000000000000000090B0A0A000B0E0E0B000A0CA90B0A9CA00ACBA00C000A00000000A0000000000000000090CA90000009000000000000000C0B9E9FFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFF9FDB0BDB909A9090090900090000000000B009090000000000000000000000A0000B0000FAD0B0CAC00CA0A0CA09E0ADA000A9A0A00000000A00A90000900009000000000000000000000009090C9F9FFDFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFBF9F9090909000090000900909000909000DA9CB0000000000009C900A0A0C0A0E00B0E0CA00E00ADA0000A90AA900A00AC000000A000A0000000909000000090909000000000000000090000090DBDBFFFFFFFFFFFFFFFFFFFFFFFFFDBFFBDBD9F9F90B00090900090000000009000090009009009000000000000A00C0A9AC00E0000FADAE0ED0ADA9A90A00E0A000A00A0A00A00B00000000CA00000000000000090000000000000000000900BCBDF9FBFDFFFFFFFFFFFFFFBFBDFBFDADBCFA9909D09900000900000090909000000000000009000000000090B00E0FCACB0F0F0BE00E09A0AECAAC0CACA0B000A00000000000E00000000A099E90090000000000000000000000000D0090A9C9BCBFFFFFFFFFFFFFFFFFFFDFFFBFDBF9F999DAD9A900090000000909000000000900900900009000000090E90CE0FA0A90E0E0E00CE90E00EDADC0EA0900E0000000A00000A000A00000090C09E9000000090C900900000000000000900C90BC9F0D9F9F9FBFFFFBFFBDFBF9F9F9BD9F0BCB09B090090000000000000900000000000000000009000090090A0A9EEDEDEA9E0F0E9A0E00AC0ACAAE90E0A09A0000A000000000A000000000A9EC90F00090000000000000000000000000000090099AD0FBFDF9F0FDB9FB0DBF9E9F9B099990900909009000000000090000000090090900000000900000009C00E0AEBA9CA9E0F0E0B0A9CACACCDAEC0AC0E0000000000000000000000A000009E900D000900900000000000000090090909C0BD0AD0BD09A9E9F9BCB9CB9099990009000000900000000000000000000000000000000000000000090090B09AC0FCBCCEF0CA0E00E00CA00ACAAAC0ABC0A9A000000000000A000000A900A0A9E900F909000000900000000000000000000009000909009AD9909009009009000000900900900090090000090000000000000900009000000000900000A9C0E09A0ACEAF0AADEDAF000AC0ECCACC0E0C0ACA000000000000000000000009000000909E90D0090009000000000090000000090090900009090009009090090090009000000000000000000000000000000009000090000000000000909C9CBCBCA0ECBCF0E9CACAC0A0F00E0BAC0AE0E0E00F0A00000000000000A00000A0000A090009E9A9A090000000000000000000000000000090000090009000000000009000000000000000000000000000000009000090E9000900000009000B09CACB090ACAEFEADEBEBCA00E0ECCAE0C9A0A0E0A0000000000000000000A0B09A0000A09C090D0D9CA909000000000000000000009009000900900900009090090000000000000000000000000000000000000000900909A9CA00900CA90D0DADEBCA0E9EEDE9EACE00E9CE0E0A0C0EA0C0C000A000000000000000000000000000000000B0DA9A009C00090000000000000000000000000000000000900000000000000000000000000000000000000000000090009000009090009090B09A0E00F0D0E0FAFEFDEB0F00E0ADACE0AC0CA0A0A0F00000000000000000A0900A00A00A0E90DA0D0D9F09AD000900000000000000000000090090009000000000000000090000000000000000000000000009009009CB000090090D090B0D090C09EFAEAE0ECEEDAEBCE00E0ACACA0E00A00000000A00000000000000A000A00000009000A00DB0F0090C9A900C09000000000000090000000000900090090000000000000000000900000000000009000000000900909090000009AD090B0E9A000EDADAF0EFAFFCEBCACADE0CACACBC0ACA0000F000000000000000000A0000000A0A0A9CB00D0DB0F90C0DA900090900000000000090000000000000000000000000000000000000900000000000000000090C9A0000000000B090B0D0D0000EEDAFECAEBCFEEFFE9E0CA0ECAC0AC0AC000A000000000000000000000000000A0000000A00DBCBCD0009B090009A0000000000000000000000000900900000000000000900000000009009000000000900F0090909000000B090E9C9A9A90ADADAEE0F0ECEFEFFACAC0E0ECA0E0E0E0A0A0000A00000000000000A00000A000000A00A0000009CB0F9D0C909C90D9000000900009000000900900000000000000900900000900000000000909000000009009A90000000D09C099A90D00A00ACACE9EACFAFEFFEFFA9E0E0A0DA00000C0000009A0000000000000000000000000000000A9A0E9AD90E9B0F090DA0DA09000000000900000000000909C0090090C000009C00009000900900000000000D0090D0900090B00009BC0DADAD00000E0F0E0E0ECAFEFFEFCA0E0E9E0CACA0A0A00A00E00000000000000000A00000000000000000090DADB9E0D0DAFA9DA99000000009000900000000900090900000009C9000B0000090000000000090900A090B000090C0090B9009B090E0A0CA09E0E0E9E0EFEFFEFE9E00E0E00A0000C0000000000000000000000000000000000000000A0A0ACAD09C9DB0F9C9DA9D000900009009000000090C00C909A0090909000090009A09C000009090900000909AD0900B00090000CB9F09CF009E90CEACAF0E0FECFFEFE9E00E0000E00A00A00AC0A0B000000000000000A00000000000000A000000090BCB0F0D9E9B09CBCB00900000F090090000009A90A0D0900000A09C090D090009009000000000000D09000900090090DB9C909CA0F0E0E0B0CBC0E0E0FEEFFFFEBCA0A0E0000C0000000000E000A00000000A000A0A000A0000000000A0B0A0009C90F090C9E90090D000000009C90C0900900009C909E9090D090900000C9000000009000090090B0090009090900B0DBB0BC9CACADA9E0E0EACADACADEFEFFEDAC0C00A0A00A00A00A000B0A0000000000000000000000000000000000000E0B0F90F0F9090C9CB090900D09A9A90900000900C0B0090F0909E9E9D0B090A90900900090900F090DB090F000A09F0F0D0D090ACBCACE0F0F0CBCACAEEFEFFEDA0A0A000000000A00C00A0A000000A0000A00A00A00A0000000000A0ADA0B0900D00F9F9CBCB9A909AC009A0C9C900090090009090C9CF0D0AD0909A0090C90CA000009E9E0909F090009009C9DB099B09A9A09E0E0E9E0E0EAC0E0EDEFFEFFEAD0C00AC00E00C000A00C0F0000A000A00000000000000000000000000000A0EB0BD0C9A909D0D09C90900090B0F9B0090C090000909A99AD9090F099D0A9009090F0D0909F9F00B0090009A90BC9E9CB090CAC0ACBCACBCAD0EACBCAFEFFEFBC0A0A000A000A0AC00A0A00A0A0000000A0A0000A0A0B0A00A0A0000A0A0A000C9CB9BCDE9E0B0DA9CB09C9AD0D0C9D0A990090900F0D0E90F0F090E0090090090090BCBD090990090A9090DBD0B90F9CBCB09ACF0EACACACAC00E0ACAFEFFEFEF0C0CA000A0000A00C000F00000A0A0A00000A000000000000000A00000D0F0B0A0D0B99F99C9AD0A90CB0D09A9BCBBD00B0C9E9F09A909E909DAD99009000900B9C990B9E9A0D909D0FBDB0A9D0F9E0DA0CACA0E0CBCADACADA0ACEDEFFEFF00A0A000E00CA0000A000AA000A000900000A00000A00A00A00000000BCA0A0AC00F0BDADE9E9AD9A9D090D0B00DCB9C90F0D9E90090D09E9DBDA9900AD090F009C0B9AD9C9ADDBADB0F9C90D9F0BCBCBAC9EAD0ECBACA0E0A0A0C0CAEFFEFFE9E0C00A000A000CA000A009A00000A000A000000A00A00000000A00A000DA9000B00E9ADB9FBD9A0D00BCB090D0B0CF9AD99A09F9BC900090A0BDE9F990F090DB09BCBDA0BD99AD90DB90B0F0F0F90DA0DAE0CAF0ACCACA00D0CA0A0CFEFFFEBE0A0E0C0A0000A000A0C00E00000000A000A00A00090000000000000ACAC0E9A0CA900F0E9C9BC990F909DADA09C9B0F9AC9DF09C9ADB09C99C099A9E990DA90DBC99C9D90BCB9ADB0DA9DB9F9F0FA0FE0CAF0CAC0A000DA0A00000A0EFEFFFEDAC00A000CA0000AC000A09A0000000000000A00A0A0A000000A00A9009A90000000A00090B0CB0E900C0E909CA90C90D99E90F0BD9ADBC9A090009C9000B9CBBC9BCB0BCBDB0D9BCB99CB0E9E0F09E00FACCAAC0BCACA00000A00C0E9EFFEFFADA0E00A0A00E00000A000A0000A00A0A0A00000000000000A090A0000A0A0A0A0A0009A0A00B0D99CB909C9E99009ADA9E9E909D0AD9C9B0D09E900B0909009C9BCB9DF9BCBDBEDBDBCB0ADACBC9EB0EAC0A0D0AC09000ACA000A0ACEFEFFFACAC000AC000000CA0AC0A0E00000000C0000A000A000000000CA0900A0000090000A0A000000000CA90AD0B09A0D0C909C909C90AD9B0B9C90B00DBD09A9CB00B0F90FA9EDBDA99A9A9A9ADA0F0BAC0E9C0BC0AE0A0A0E00000AC00CBEFFFFEFF0ACA0000E0A0A000000009A0000A0A9A00000A000A0E9000000E0A000000A0A0000000A000A00A90C900D0D0D09A909A9CB09E900C09CA909090009AD9009D00D0FD9F9BCB9DB0DB0DA0F0F0ADCBAF0E0E0AC009C00000A00C00A00CEEFEFFE9E900E0A000C00A0A00A00E00A00C90000A00000000000A00A0B090000A000000A00A0A00A00000CA90C9A9A90BC90F0D0BD0F90F9B9090DAD0090DADB0990B9DBF9AF0F9BDA9ADA0FA9F0B0F9ABC0CADA00CB0E0A0A0A000A0A000ACAFFFFEFE0CA00000A0A000C0CA0CE90000A0A00A00000000000B000000C0A00A000A0A00000000000000A0A909A90DC9C00BC990AD0BD0F90C0F0DA90ADE9099CBFCBC9E9CBD9FDADA90F0BDB0FA9EDA0EC0EACA0F0A0000000C00E000000E0EFFFEFFEB0ACA0ACA0000A0A0A0FE0A9000090A0000A000000A00A000A9A000000000000A00A0A90A00000D0CE09C9A9A90900CADD9EDAD0F9BD0F0DE9D09E9CA9C9BDBF9FF9EF0BDB9EB0BCBEBCBE9ACF0AE09AC0AC0ACA0E0A0A000A0CA000CEEFFFFFCE00C0000C0AC0C0ECE0FEEA0A0A0000000000000000000000009A0000000000000090E00A00A0A0A9E0AD0E90F090900ADBCBFBDADAD9F0DA9F0F9FDB0F0F09E9BF99FDACB9E9EB0BCBCADA0EC90E00BC0B00000000000A00A00A0A0FEFFEFCBDA0A0A00A00ACAE9EFEEFB000900A00A0000A00000B0A00000A000A00A00A000000AC0BC90A0000F0AD0A090F0DADCFF90DBC9CAD9F9E9FBDF0BCF0BCF990DF9F090F0ADBE0BA0FADA09E0CB0AAC9AC0A0C0A0A00ACA0000C0000C0EEFFFFFBEACAC0C0A0CACACFEFEFFFC00A0A0000000A000A00A00000A0A0000000000000000AC0BE0A00000A00F0A900E0CBCBA909E9E90B99A9EBDBC9A9DBDBDF99ADB9A909E9ADB00B0DB090A9E0EB0E9C0A00A000A0000E0000CA0A00A00ACFEFEFFEF0900A0ACEBCFEFFEFFFFEBE000000000A0000000000000000090A009000000A0A009AC090A00A00A0000CA009A0B0D0F0909B90DADB9DADBF9CBCBCB9FFDBCBDADA9ADACEBCBACB0ADA0B0CB00A90E00DA00C0A00000A0000A0CA0CAEFFFFFF00E0E0ECBCEEFEFEFEFEFF0B0B0A00A0000A0A0DA0A000000000000A0A000000000000B0A000009000A0B009A0000A000A0E00C90900909E9CBF9BDBDA09EFBCB0FBCB09A9CBC9A0F00F0CB0CB00E00B000A0A00A00A00A000C0000ACFEFFFEFFE0E9E9EEFFEFFFFFFFFEFBC000000000A00900A0000A000000A00900000A00090A0A0C000A0BCA00B0000A000A0000B09090B0A0009E0B09B09E9E9A9FA9ADBCFBCBCBE9EFEBE9EBFFBFBFFBE9A90AC0A0C0000C0AC00C0A0A0A00CBCFFFFFFACBCEEEFFEFFFEFEFFEFFFE0A0A0A00A0000A0BC0B0000000A000CA0000000A0A00C00A0A9C0000CAC0CB0000000A0A000A0A0090A9A09C0E00F0B0BCB09BCBEFBFBFBF9EFADADBFFFFFFFFFFB9A0A00A000A0A0A000A0A000000CA0EEFEFFEFEFEEFFFFEFEFEFFFFEFFEFB00090000000A0000A000000000000B000A000000000B0A09000A0A0A09A9A0E9A00000090A090000A00000A0B0BCADADABCBACBFBFFFFFFBFBDFEFEFFFFFFFFFFFFF90CA90CA000C000A0000A0AC0A00E0FFFEFFFFEFFEFEFFFFFFFFEFFFFFFCB0A0A9A00A00000000A0A00A00A0000B009A0000000009A0A0000D0DAC0E900009A09A00090A00B00A0A090E0F0B0B0BCB009ADFFFFFFFFFFFAFCBFFFFFFFFFFFFFBFA90A000B0A0A0C00E00C00A000E0EEFFFFFFEFEFFFFEFFEFFEFFFEFEFFF0A000000B00A0A00A9000000000CACA00A000A00A0A0000000A0A0AA0B000E9A0000000A0A09000009090E09A0ADAF0FB0B9EBAFFFFFFFFFFFFFFEFFFFFFFFFFFFFF9A0AC0B0C00000A0A00A0A000E0BCEFEFFFFFFFFFEFFFFEFFEFFFEFFFEBA009A000A0000000000A000A0000A0B0CADA000000900A000B0090C9C90A9A9000A00A090090A0000A0E0A90AC9F0F0BBCBDABDFFBFFFFFFBFFFFAFFFFFFFFFFFFFFBA9C90A00A00A0A00C0A000C0E0ECEFFFFFFEFEFEFFFEFFFFFFFFEBFACBCF0A000A0000A0000A0000A0000A0D0CA900DA0000000000A000ACA0A0A0000A0A90090A0BCA00A0A000090A909A0B0BE9BEBDAFBFFFFFBFFFFBFEF0F9FBFFFFFFFFFF9A0A00E00A00C000A00CACAF0FEFFFEFFFFFFFFFFEFFFEFEFEFAFCCFACAA900A000A0000A0000B00000A000A0900A000B000A0A000000A0900000B00000C0A00000009E090000B0AD0A0A9CAD0BE9FBFF9E9FBFBFBFBFFFFFFAFBFBFFFFFFFFBE900E90A00E0A0E00E0ACBCEEFFEFFFFFFFFFFFEFFFEFFFFEFADABA0000F0A0000000A000000000000B000A00A0A90A000A0000000A0A9CA0B0B000A0A00A00A00B0A009A0A0A0CB0A9000A9ABDBFFFBFBFBFBFFFFBFBFFEFECBCBFFFFFFFFFB9A0B0A00DA000000E9ECFEFFFEFFFEFFFFFFFEFFFEFFFEAF0BCAC0C0E0AA0000A0A0000000A0A00A0000000000000009009000A0B00000A000000A00900A90909000900A000900B09000A900FDAFBFBFBFFFFFFBFBFFFFEFF0BFBFFFFFFFFFFBCB0C00CA0090E9EE9EEFEFEFEFFEFFFEFFFFFFFBEFFECAF00E000A0A00CF00A0000A000A00000000ACA0B00A000000A00A0000000A9A0A9A9A0A000ACA900A0A0A0A0A90A9A0A000A9A900B9ABFFFFFFFBFFBFBFBFBFBFFFEFDAFFBFFFFFFFFA900A0A90AE0E0E0FEFFFFFFFFFFFEFFFFFFFFEFEFACABC0EA0E0AC0CACA0B000A0000A0000009000090000000A00A0000009A000000000000000A90000E00000009000A0000090A0900E9E0E9FBFFBFBFFBFFFFFFFFFFFFFBEBF0FFFFFFFFFFBF0B0D0AC90E9EFFEFEFEFFEFFEFFFFFFFFFFFFEF0FAC0A00C00C0ACACACF0A0A0A0A00000A0A0A0A0A0A0A0A0000000A0A0A000A0A0A0A0A0A0B0A0B0B0B0B0B0B0A9A0B0A9A0A90A0F9BB9BFFFFFFFFFFFFBFBFBFBFBFFEFFCBFBFFFFFFFFFF0B0E0ADAEEFEFEFFFFFFFFFFEFFEFEFFFFFFFE9EE0E0E0E0A0E0E0E0ECAA00000000000000000000000000000000000000000000000000000000000000000000000000000000000A9FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBFBFFFFFFFFFFB9ACBCFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE0E0E0E0E0E0E0E0E0A000000000000000000000010500000000000070AD05FE','Robert King served in the Peace Corps and traveled extensively before completing his degree in English at the University of Michigan in 1992, the year he joined the company. After completing a course entitled "Selling in Europe," he was transferred to the London office in March 1993.',5,'http://accweb/emmployees/davolio.bmp') +; +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(8,'Callahan','Laura','Inside Sales Coordinator','Ms.','1958-01-09','1994-03-05','4726 - 11th Ave. N.E.','Seattle','WA','98105','USA','(206) 555-1189','2344',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00F00900000000000009090FB0000900000090000000909BFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0009C90C0F9E9BE000090009000D09009009000000000000000B0900000000900000FF009CD00000009000090900000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B0D0900909E9FC9000900900FBFA90000000090000909000000D00B0000000000009000009B00000000090900000909BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0900B00009E9E09000900F9DFFFF090009000090000090090B09090000000000009F00000F0000009000009000000BFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AC90009009090C9000099E00D0FFFE900000000090009000F000000000000000009E90090F00000090090900009C9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00900000000900900009F00090909ED009090900000090090000090000000000009E0009F0000000000000909E90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFFFFFFFFFFFF90D00909090909000900BC90900009BDA90000000000BEFFE00000000000000000090F09A0009000090000900090BFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFCBBF00000000000090009FE00000000FFC000900909DFBD0B0000000000000000000099ED00009000090009F00009BFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFC9F000000909000000099E00000090B0090090000BFC00D00000000909A00000000009000000000000900BF009ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFFFFFFFFFF9E9FF90000009090090009BD0B0909C900000090900900B00000000000900000000000009000090000000900009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFBFFFFFFFFF09F0009000900000000000FBC9000A00909000009F000F0000000090000900000000000000000000900009F009EFBFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFEFFFFF0F009000000900000000090DAFDBD0900009009FE000900000000009000900000000000000000000009090FC9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBDFBFFFFFBFFFFFFF0000000000000000009000090000000000000090000F000000000000000900000000000000000000000090009FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFBFFFFFFFFFFFF090909090090000000000009000900090000000000B0090000000009000A0000000000000000F00009000900BFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBFFBFDFFFDFBFFBFFFF00000000000000009090090000900000009BF00990F00000000090000909000000000000000900F9E0009009FDFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCBDFFBDBFFFDFFFBFFC000900900000000000000000900090009CFC9FF0EB09090000000900000000000000000009009009A000009BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFBFFFEBFFFFDFFFFFD0009009090DBDB00000000000000090FBFFADAD0F90009A00900009090900000000000000F00090D9000000FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBFFFBFDFF9FFFDBFBFFFEF9EB00000000F0FADFBCBC90000090000BCFFCF0F00F0090090900909000000000000000000090000000009009BFFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFFBFFFFFFFFFFFFBFBFFD000900099A9DF0FFFFBCF000000090BD0B09000B09A90900090A090900000000000000009E00009000009AFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDAFFFFFFFFFFF9FBDBFBDFBDFDFBCBA000099FEDFE09F0D0FFBC00000900D0A9C0000F0BDA09A9000900009000000000000000099E000B0090099FDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AFDBFFBDBFEFFFFCFBDFAFBCFFDFD00000FFF0F9C009E09CBC00009E9AFD000000F900D009C09009000090900900000000000090000000000BFBFBFBFFFFFFFFFFDFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDBEF9FFEF9F9F9FBDFADF9FBDBEBFE909009BD009B0F9FE9F0900009C900000000B09F0090B900000900000000000000000000090990000009FFFFFFFFFFFFFFBFFBFFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFFFFBFF9F099EB9F9FBCBE9FABDBFEFFEFFDFBC00090FE9AFEF9E09F000000000000000000F0900B09000090000009090000009000000000000000009FF9FBFFFDFBFFBDFCBFFFBFFF0FFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFEFFFFBE90FDFADBF9F9FDFCBFDBF9FBFFF00000090DBDFFED00000000000000000000B0B909F090B000000000000000000A90000000000009000BFFFDBFFBFDBDFBFBFDBFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFBFFDFBDBE9F9F9B0BDFF0FBEFAFBDBFDFFFFFEFF0009000000909090090000000000000000F9CB00BFC90900900000909009009C0900000000000000099FAFF9FF0FAB0F9FBEF9FFFDBFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFBFFFFFFFFEFCB0B9FBDF9FDBFFEBFAFFFBDBFF000900090000000000000000000009000F09099E90B00900000000000900909ADA900000000000090BFDB9E90B9D9F9ADBDBFFFBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFBFFFFBFFBFF9FADBDBDBCBCFBAFBBE9F9FFDFBCFFFFFF90000000000000000000000000000000B0A9E099E9C090B090000090009000900000000000000000909BC99BCDBEBFFFFFFFFADFFFFFFFFFFFFFFFFFFBFFFBFFFFFFFFFFFFFFFBFFFBFFCFBFFFFDFBFFDBFFFAF90B9FFDFFDFFFFBFFFFFFFBDAC0000000000000000000000000000000F9090B0090B0009A000000009000C000900000000000000000009AE9BBF9FDBFBFBFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFFDFFFDFFBDFBDBFAFDEBFFBCBDEBD9E9FBCBFBFADFFBFFFBFEFF909F0000000000000000000000000090FC909C900909000909009090000B9090C0900000000000000000999E9CBFAFDFDFFFFDBFFFFFFFFFFFFFFFFFFFFBFF9FFFBFFFFFFFFFBFF0FFBFFBFFFEDFBFDFADFBDBDBEF9F0FFF0FDFFBFCFBDEDBDAF009F9F9000000000000000000000000FB09A90A90000900900900009090000A9000000000000000000000B9FBDBDBFBFBFFDBFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFBDFEFBFFBDFADF9FBFBDFBFDBEDAFBCBDAFBF9FFFBF9EDBFFFBFFFF9F000000090000000000000000000000B0F0900900B0900000B009090B00090900000090000000000900099CBCBDBFADFFFFBFFFFFFFFFFFFFFFFFFFFFFDFBFBF9FDFBFFFFFF9FFF9FFBDFBEFF9FEBE9BE9BF9CBFBF9F0FADBCBFFBFFF0FF0F9E0000000000000000000000000000090F09F0A90090000090909E0000000000000900000000000000000000B9BDAF9FFBFBFFFFFFFFFFFFFFFFFFFFFFFFBFFDFFFFBFFDBDFBFF9FBFF0FFBDBDBE9FDFFDBFF0FBF9E9EDBDBFFFDBDFE9FFDBFBC9FA00000000000000000000000000000F90BD9E9009000000000909090909000900000009000000000000090E9BDBF9FFFDF9FBFFFFFFFFFFFFFFFFFFFFFBFFBDFFFFBFFBFCBFFDF0FF9EFADBDBFBB9AF9ADBCBCBDBBEBF09BFAFBDBF0FAD0FBC9D09000000000000000000000009000B090B0909A009000909009A0000000090009000000000000000000099ADADAFBDBFABFFFFFFFFFFFFFFFFFFFFBFDFF9FFB9F9FFFFFBFDABFFBDFB9FBEBDADEFDBEDF0BDBFADF9F0F0F0FDEFF9FBDBF09B0A90000000000000000000000000000F00B0DA9090000000009000090090000000000000000009000000009ADB9BDBCBEDBDFFFFFFFFFFFFFFFFFFFFFFFFBFFE9FEFF9FF9FDBFFCBDAF9FE9F9E9FB9BADB0BDADADBDAFF9F9FFB9B0F9E9F0DBC0900000000000000000000000000000F09CB09AD0B00000000090900900000000009000000090009000000090F9E9FBDBF0BFBFFFFFFFFFFFFFFFFFFFFBFCF9FFDBDBF9FFBFE9FBFBF9EB9F0F9FADEFDBCBCB9F9FABDB0FAF0BDEFF0F9E0B00B9000000000000000000000000000090BE9009090909009000000009009009000000000000000E00009000009B0F9B0FBDBDBDFFBFFFFFFFFFFFFFFFFFFFFBFFBFFFBCBE9FE9FF0DBCBDBDE9FADB9B9BCB9DBCB0F9FDADBDB9F0A90F9ADBC9F000000000000000000000000000000000F90B00F0B0C00900900900900900B09000000900000909000000000000DBC9F9CBF0BFBFFFBFFFFFFFFFFFFFFFFDFFFBFCBDFFFDFB9FB9FBDBFADA9F0DBCFCFCBDAA99ADBE9ADBCBCF099FBBCB099A0900000000000000000000000000000000B0F09B0909B09000000009000009000090000000009000000000900009BA9FADBF09EBDFBFFFFFFFFFFFFFFFFFFFBF9FDBFEBF9FBDFF0FF9E9E9F9F0FB0F9B0BB0F9DADBC9BDBE9F9B9E009C90DA009000000000000000000000000009000000F09BC09A900900900900009A000009B0000000900000909000090F00090DA99ABCB9BEBDFFFFFFFFFFFFFFFFFBFFFFFEBF9BDFF0FBCBFDAF9F9F9ADF09F9ADBC9F09A9A9BADA9DA9E9E9900BCB00900000000000000000000000000000000900F009B09C0B00B0000009000090000009000000000000000090009000009BDAD9DBC9D9FADFBFFFFFFFFFFFFFFFFFDBFDFCFFADBFDFBDBF9FADB0F9A9F0BD9ADBE9F0D0D09DADA9F9B09ACB090090000000000000000000000000000000000000F09A0F099090D0900000090900090090B00000090000000000000900000009A0B0B0BF9FBFFFFBFFFFFFFFFFFFFBFFFBFBF9FBDBF0FBE9FBDBCBDADB0F0BE9F09B0B0B0BDA9BBCBC0F0D90009000000000000000000000000000000000900000B00D990B0009A000009090000900000000000000000000000000000000099B9F9F09ADBFBDBFFFFFFFFFFFFFFFFFFF0FDF0FBCBE9FBD9F0DADBDADB0F9BC9DA9E9E9C9BDA90D0990B909A0000000000000000000000000000000000000000000F09A0A090B00900000000909000000909000000090000000000000000000000909E9DAF9FEFBFFFFFFFFFFFFFFFDBFFFA9F0DBF9FBDBEBFBF0F0B0DB0D0B0B0F9A90B0009CB0F0A9C0B009000000000000000000000000000000000000090000FB09909E9C900900009000000000000009090000000000000000000000000900B090BDBE9BFFFFFFFFFFFFFFFFFFF9FFDFBFBCBDE9E9F9CF9F9F9FADB0F9E9F0D9F099F0B09909D0B00900000000000000000000000000000000000000000000F00009A90B0B000009009000900000000000000000000000000000000000000909A09AD9FF9FBFFFFFFFFFFFFFBEFFF0FADBCBDA9BFBCBB9E9A9E99B0F09B90BAB0BCA09C9ACB0A9090000000000000000000000000000000000000000000000F99E909DA9000900000B0000009009009090009000000000000000000000000009090BDBE9FFFFFFFFFFFFFFFFFF9E9F9DBCB9EBDF0DBFDE9F9F90F0DADBC0F0D0D00990A9090090000000000000000000000000000000900000000009090009BE09A9A0DAD900000900990000000000000900000900000000000000000000000000090B9FBFFFFFFFFFFFFFFFFFFFFBFADB0F9DA9FAD0B9F0DA9F0B90B09B09B0B090AD909A9009000000000000000000000000000000000900000000009000F9F0909B09AB000000900A900000009000000000000000000000000000000000000090BCBCBFBFFFFFFFFFFFFFFBDBDADFADF0B9F0DBF9E9FBADA9F0F9CB0DB0DAD9A9000B000900000000000000000000000000000000090000000000000000F0B0F0000F9C900000090900900000000090900000000000000000000000000000000009B9FDFFFFFFFFFFFFFFFEFEBDB0DB0FAD0BA90FDB0D9BF09B0B99E9ADA90AD09B00090000000000000000000000000000000000000000000900090000B00F90B0B90B0000099AD0000000090900000000090000000000000000000000000000090FFBFFFFFFFFFFFFFFDBDBDB0FB0F9D0F0D9F0B0DBAD0DBCBC0E909090F9000009000000000000000000000000000000000000090900000000000000F909A9090CBC90000000B0909009000000090900000000000000000000000000000000009A9FFFFFFFFFFFFFFFFFBF09F0DB0B0B9B0B0BDBAD0B9A9B09B9BCBCB0000B0900900000000000000000000000000000000000000000000000900000FA9ADA90B9A9A9000090000000000090900000000000000000000000000000000000000009FBFFFFFFFFFFFFFFBDE9FE9B0DBCB0F09C909C9BD0F9C9E9C90909C9B9900090000000000000000000000000000000000009090000000000090000F0009ADA009C900B00009A90090009000000090900900000000000000000000000000000009FFFFFFFFFFFFFFFFFBF09BC9A990D09E9ADA9A9A90B0B9A9ADA9A9AC0009000000000000000000000000000000000000000000000009009000000B09BBD0909A9AC909000090000000009000090000000000000000000000000000000000009BFFFFFFFFFFFFFBEBDBC9BC9AD0E9A9A909B09D0D0BCB9C9AD09C90909A90000000000000000000000000000000000000009000000900000000000F000CBFAD00C9B090A0900000090009A000000900000000000000000000000000000000000BFFFFFFFFFFFDFD9FADBF0B90B990D0D0BC0DA0B0F09CB0F9A9A90F090000000000000000000000000000000000000000000000000000009090000F9A9090B0B0B00F099000000000090090900000090000000000000000000000000000000009FFFFFFFFBD9A9E90D090D0BD0A9A90B099A99C909B090B0D09CB090A9090000000000000000000000000000000000000000000000000000000000F090B0BDBC90090BC009000000000090900000900090000000000000000000000000000009BFFFFFF9FCBFDB9BDB9B0B9C0BD090B0DA090A9A90C9AD90B0B09CB0D0000000000000000000000000000000000000000000000000000009000000B0AF0D0BCB9A90BCB090090000000900A90000000000000000000000000000000000000000BFFFFDFBDBFCB9EDB0FC99CB9900BC90909CB900DA9B090F09C9A90900090000000000000000000000000000000000000000000000009090000090F9090B0F9BC900090F00000000090000909000000000000000000000000000000000000009FFFFFBFFFDBFFFB0FDB9FA90BCB909A90B0900DB090C9E90F0BC90B00B000000000000000000000000000000000000000000000900000000000000FA90BCB0F0BE909A9A9F000000000909000B00090900000000000000000000000000000000BFFFFFDFFFF9FFDFBFE99F9F090CB0DA9CB09A09A9B090B09909A9C900900000000000000000000000000000000000000000000000000900000900F9E0909E9F99AD090DA9090000000000090009000000000000000000000000000000000009BFFFFFBFBDFFF9FBDF9FE9F09E9B090909090900D009A9C9ACB0D0B090000000000000000000000000000000000000000000000000000000090000F09B00A99A9E9B0CB09E900000000000900090000000000000000000000000000000000009FFFFFFFFFFBDBFFFFBFF9FA9F9BC9B0A9A90F09A90F090B90990B09000900000000000000000000000000000000000000000000000090000000009BAC0909ACBE9FCB90A90B09090000000009000909000000000000000000000000000000009FFFFFFFFFFFFFFF9FEDBFDFF0F0BC0D90D0909090090F90CB0E9090E90000000000000000000000000000000000000000000000000000000090900F9B0AD09099A9BCB9C009CA00000000000090000009000000000000000000000000000000BFFFFFFFFFFFFDFFFF9FDAF9FBDF9B9A90B0A9E90B09000B09909E09009000000000000000000000000000000000000000000000000000000000090F0AD90A0B0ADBCB0F9A90B90900000000090009000000000000000000000000000000000BFFFFFFFFFFFFFFBFFBFFBFDBFDA9E9E90F09D0900D00B09090A0909B09A000000000000000000000000000000000000000000000000000000900000B0990A9D009BCB9F00909000000000000009B00000000000000000000000000000000009FFFFFFFFFFFFFFFFDFDF9F9BFCBFDBDB0F909A09A9009090DA0D9A090C09000000000000000000000000000000000000000000000000000000009090F00AC90A9F00BCB09B09E90900090000000009000900000000000000000000000000009BFFFFFFFFFFFFFFFFFBFBFEFDFBDFADBCB00F09B9C90B009A099A09F00900000000000000000000000000000000000000000000000000000000000009AB099A900BD09ADAD0F090000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFDBFDEDBDBE9FB9FBCBDBB0F0C0B0909E09000900090A90900000000000000000000000000000000000000000000090000000090900F0A0A09A90A909B9A909A090000000000000009000000000000000000000000000000BFFFFFFFFFFFFFFFBFFDBF9FBDB9EDFBCBDAD0D0B9B0DBC90909A9CB09A090000000000000000000000000000000000000000000000000000009000009BB00909E9E99F0F0E90F09000000000000000000000000000000000000000000000009BFFFFFFFFFFFBDBDFBDAF9FAD9EDB9A9F9E9ADBBDAC9A09A90A09000900D009000000000000000000000000000000000000000000000900009000909A9CF0A0B0009A00B099F00B0000009000000000000000000000000000000000000000009FFFFFFFFFFFFFFFADF9F9E9DA9B0ADBD0F9BDB0DA9BC9B0909090909E0909A000000000000000000000000000000000000000000000000000000000990BB0090B9A09A9CBE09B0D000000090000000000000000000000000000000000000009FFFFFFFFFFFFBDF9F9BE9F9EBDAD9B0DA9AD0BCBBDE9B0DADA9C000B090A0090900000000000000000000000000000000000000000000000000900000AD0F00A00ADA0D0B09BC9DA90000000000000000000009000000000000000000000009BFFFFFFFFFFFFFEBF9F0DB099099A9C9B0D9A9DB0DA9F0DA9090B09000090900000000000000000000000000000000000000000000000000000000000B09BA0009A99090A9CBCB0A90000009090000000000000000000000000000000000000BFFBFFFFFFFFFFDBD0DADB09F0F9AD09BCB9A9CBADB9F09A909E9090090900000900000000000000000000000000000000000000000000000000900090D0BCF0A0A9AA9A09A9A90F900000000000090000000000000000000000000000000009FFFFFFFFFFFFFBFDBFB990F0909C90F09090D0B9DADADFF90F09E9090000A90B000000000000000000000000000000000000000000000000000009000B0B09B009009AD0BC09CB90BD000000000900000000090000000000000000000000000BBFFFBFFFFFFFDFBC90DAD990F90B090BCBCB090E99B9A9DA909A90F09A090000909000000000000000000000000000000000000000000000000000009090F0B00A0A0B0BC9A9A9E9CB000000909000090000000000000000000000000000009FFFFFFFFFFFFFF9DB9F9DBCF99090DAD09090DA990F0F9FADA9AD0B9000900090000000000000000000000000000000000000000000000000000909009ADB00E000090B000B009E9AB900000000009000090090000000000000000000000009FFFDFBFFFFFFDF9FBDFFDBFDBDADA9099A9BC9B0D0B0B9EBDB9C90BCA90900090090000000000000000000000000000000000000000000000000000A0B090009B0000A90BB00DA09BD0E9000000090090000000000000000000000000000000BBFFBFDFFFFFFBFFDFFDBFFDBDBD9DB9009C9A9C9AD09C99FADA9A9099CB009000009000000000000000000000000000000000000000000000000009090F0090BB00A00A000B0A9F00B99A0000000090A0000009000000000000000000000009FFFFFBFBFFFFFFFFFDBC9009090B09CBDB0909A909A9A9ADBDBD0D0BCB0090009000000000000000000000000000000000000000000000000000000090909A090F0A00A9A9A099009F0FAD09000000009090009A00000000000000000000009FFFFF9E9FFFFFFFDBCB09BD9A9AD09E9090DAD090F09C90909BFAB0BC90DB0E90009000900000000000000000000000000000000000000000000000900F00090CBA0000000A09A0E9B0B0909000900009000000000000000000000000000000BFFBF9F9FFFFFFFDBC99FFFFADFF9E909009099ADB09A9ADA9BCF9D090B0B00900000000000000000000000000000000000000000000000000000000009090B09B0B00A00B00B0B09ACBDE9A9E90000000090000909000000000000000000009FBFFDA9BFBFFFBD9BFFFFFFFFFFEFF0F090A900900F0D090909B9EB0F09C90909090009000000000000000000000000000000000000000000000000909A0000000BF0000A0A0000B09B0B9C909A900900000090000000000000000000000000BFFFFBDA9FFFFFD0BFFFFFFFFFFFFFF9BFAD9AD00990B0F0BC9ADBDF90B0B0DA9A009000000000000000000000000000000000000000000000000000090909090900B000A0900A0B0B00F9E90B09C09000000900009900000000000000000009FFBF0F99FFFFF00BFFFFFFFFF9EBFF0BCFDA9F009000909909AD0BEB0F0909A90C90000000000000000000000000000000000000000000000000000000B0000A009AA000000A00000BCB9E9A90C9A90000000000000A0000000000000000009FFFFFF90BF9A9909FFFFFF9F009BDB0F0FBA9CB09AD00909E9A90BDB9D0BDA9090909A900000000000000000000000000000000000000000000000000090009090BA9F0A00A000A0B00B00B09A9B09A000000000900990000000000000000009BFDF990BDFFDF09BFFF9E9E99D000090909C0B0F009A000090DA99ADFA990DA9E9A0000000000000000000000000000000000000000000000000000009A900000009AB00000B00000A90F90F0D09A9D9000000000000E909000000000000000BFFBFE9A9B090900F9F9F9F9E9BD9B0CB090900909009090090090F9B0F00B0909090900900000000000000000000000000000000000000000000000090009009000B0F0000B0000000A9A0B09A9E9E0A9000000000009000000000000000009FFFF0909D09A909B9F9F9F9F9FCB0D99090B09909090000000090B00DFBDBC9ADA9CB00900000000000000000000000000000000000000000000000000090000009BCBB00A000A000A9A9AD09E9F90999C09000009009A90900000000000009FFF90B9F9A9FDFBFFFFFFFFFFFFBFDBF0BDA9CB0A90AD909090909909B90009A9090900900000000000000000000000000000000000000000000000009000000900B0A0A0000A00A00000B0BDA90ADB00A900000000000000000000000000000BFBE9090F9FFBFFFFFFFFFFFBFFDBF09F09DA9BD9E99A09A9A9A9ACB09E9B9AD09A9A09A0000000000000000000000000000000000000000000000090009000009009A9F00000B0000A00A00BCBD9ADBD00B0900009090909000000000000009FDF9900B0FADFFFFFFFFFFBDF9FBCBF09F0BDADA99E9DA9C90D099090B9C0D90B09C90D090900000000000000000000000000000000000000000000000000000009A00AB00A0000A000000B0B9A9ADA9A9009A0000000000000000000000000BFFBBCB099BDBFBFFFFFFBFFFAF9FBD09A0909909F09A99E9A9A90090900B9A0F09A990A90000000000000000000000000000000000000000000000000090000090A0B09F0000A9A0000A0B009ADADA9AD09000000090009090000000000000BFFDBC9909BCBFFFFFFFFFFFDBD9F0D0B9C99ADA9F09AD0F090D09E9B09E9900990D09A09009000000000000000000000000000000000000000000900000000090BC9000AA000000000000000B0DBDB0D09E9E909000000000000000000000099FBFDBF0BC099BDBFBFFFFDFBCA909A9009AC909B0BD0B90B0B0B0990F90B0F9E0B0B0C909A000000000000000000000000000000000000000000000000000900009A9AB0B0A000A000A00B000000BCBADA909A0090000000009000000000000BFFFBDBD9B9A9FADFFFFFFF9F99E09009A99A9B0C9CBD0F0D9C90B0FB0BD0909900909B00C90909000000000000000000000000000000000000000000000000009000A90BF0000A90000000000A9B0BD0B09E909000000000090000000000009FFFFFFFBF09D09FFBDFFFFBE9F099009000090C9B9A9A99B0B9BD9F90D0B9E9A0BDA9009A90000000000000000000000000000000000000000000000000009009ADA90A00B000000A0000A0A00900FF0B0DA90F000000000000000000000009BFFFBFDBD0DBA9BF9FFFFF9FDBE9B00900909009BC0DBD0F09CBC9E90F9BDA909D9009E9090A9000000000000000000000000000000000000000000000009000900900B0FBA0A00B000000000A00A90B9E9A9E90B00000000009090000000000FFFFFFFFBFBD9E99FBFFFFFBFDF9C9BC9B09C9B009B09A90F9BDBFBDB9E90DADB0A9B09A90900900000000000000000000000000000000000000000000000090A90A0B0B0AF00000A000000000009A9CBDAD09AD090000000000000000000009BFFFFFBDFDBE99F0BDBFFFFFFBFFBC9B0DA9A090909F09F90F0F99CBCB9F9B90D9C0D0900F0900090000000909000000000000000000000000000000000009009090B00AB9B0000A0000000A00B0A9A90B9A9E90BC000000000009000000000BFFFFFFFFBFF9FE9BDBFFFFFFFFDBCBD0F09D9F0F09A09E90FBDBEFBDBDA9E9E9A9B9A9A90900B0900009009E9ADA0000000000000000000000000000000000A900AB0A900EA0000900000000000A0B09E9E9F09A900000000000900000000009FFFFFFBFFF9FF9BCBDFFFFFFFFBFDB0B09F0B099009DB9BFBDBF9BDB0F9F9B9F9AD0D09C9009000009000B0909090000000000000000000000000000000090909A9009A9ABF0A0A0A00000000A09000A90BCBCBD09000000000000909000000FFFFFFFFF9FFF9FDBFBFFFFFFFFDFADF9DB0BC9E0D9A9CBD9DBCBFDBDF9E9E9E9C9A9A9A9A9A0900900009C909009B00000000000000000000000000000000900A90ABE0A00B0000A9000000000A0A0B0BC9A9B0AF0000000000000000000009BFFFFFFFFFFFBFBFDBDBFFFFFFFFBDB0F0DBDBB99A09B9EBEBFBF9FE9FBDB9F9B9BDB0D9090900900009009A90B00C90000000000000000000000000000000A909A990B00B0F00009A00A0A0000000900B0BCBCBD00900000000009000000000BFFFFFFFFFBDFFF9FFFFFFFFFFFBDFFDB9A909C9A99FCBDBDF9FDF9BFBC9F9ADE9E90F0BD0B09A00900009090C909B00000000000000000000000000000009009E0A0B00B0AA0A00A0A0909000A9A0A0B0F09A9B0B9E09000000000000000009FFFFFFFFFFFFF9FFFFBFFFFFFFFDFBCB9E9CBCB0D0F0B9F9FBF9FAFFDBDBE9F9B99CB990A9C9000900909A09090F000000000000000000000000000000000090BA90B00B0A0F0000B009AAA0000000000B0A90C9C009A0000000000900000000BFFFFFFFFFBFFFFBFFFFFFFFFFFBDDBDE90B909B0B9BDF9EBDEFBDF9ADBF9F0F0F0BC9E9DA900900000009000B09090000000000000000000000000000009A9AD0A9AA00A00B0A000BAE9000000A000090B9E9A09B90D9000000000000000009FFFFFFFFFFFFFBFFFFFFFFFFFFFFBE9A9F90FBCBD0F9A9F9FBDBFBDFF9F0F9F9F9F9B09A909A90909000009A90BCB00000000000000000000000000000000909A90090B00B0F0000B0B0A0A0A0A000A0A0A09A99AC09A0900000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFDF9F9F0BD09909B9CBDADBDBFDFBDBF9F9F09E90BC9F9E9E900A000909009C909000000000000000000000000000000009CADA0B0A000B00A000A0A00000000000000090BBC9E090BCB000000000000000009FFFFFFFFFFFFFFFBFFFFFFFFFFFFBCBD0BD0BDADB0FBDBFFFFDBFBDBF0F9F0BDB0BD9A9090909090900000900000900000000000000000000900000000009A90900A09A000AB000000000000A000A0000A000B09B09090B00000009000000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFDF0BDA0F9A9BCB0DAF9BCBFCBDEBDBFE9F9AD9CBADADA9A9E9000000090B000000000000000000000000000000000009009A0B09A00A0A0F0000000A0A0000A0000A00A9A9F0D009A9C90000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F09DB09D099DBDBDFFBDBFFBDBFDB9F9F9BA9D909B0D09009090000000900000000000000000000000000000000000B00900A00B0009AA000000000009A000A00000000A0B9A9000B0000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBDA09F9A9E9A9ADAF9FFF9FDBFDADFADAD0DB0BDAD9A909A000090000900000000000000000000000000000000009009E0A900A00A9A0B000000A0A00A000A000000B0B9BCAC00090C9000009000000009FFFFFFFFFDBFFBFFFFFFFFFFFFFFDBDA99F0AD0909FDBD9F0B0F0BFCB9FB9DB9FB0BDA9A090F0909000000900B00000000000000000000000000000009009009000A90A0000E00A0A090000000A9000A000A0A0B99090A90A00000000000009BFFFFFFBFFFFFFFFFFFFFFFFFFFFBF909F00990B9FA9ADBEBDBD9BD9BDFBDFADE90F099C9F09090DA90000000900000000000000000000000090000000A09A90A9A900A9A9A0B000000A0000A000A0A00000B0F0ACB0090090900009090000000BFFFFFFFFBDADBDBFFBFFFFFFFFDFFFA9BDADBC09FDBC99DADAF0BE9BDEBDB9BF99F0BB09A9A9A0000000000090000000000000000000000000000000900C0B000A0A000A00F00000A0000A000B0A0000A00BA90B00909000000000000000009FFFFFFFFBCB9B0BC9FDFFFFFFFFFF09D0909099BC9A9B0F0F9D9FD9FCB9DADFC9AD0BD0F0D09C9909000000000000000000000000000000000000000909A9900B00000A900AB0A00B0000A000A0A000A000B000B0DA00A009000009090000009FFFFFFFF9F9F0D99BDAFBFFFFFFFF9F0BCB0BCBC9A9C0F9B0B0A90B0B9FABDA9BDABD0B909A909A0000000000000000000000000000000000000000000090A0B0A00A90A0B0A00A000A0000000090A0000A0A9A9A0D009900000000000000009BFFFFFFFFFFBF9E90B99FDBFFFFF9E90909C909A909B90D0D09909090909DA9DABD09F0CB0D0B0090000000000000000000000000000000009000009099AC9A090B00A0B000F090A00000A00000A9A00009A000A9A0900AC0900900090000000BFFFFFFFFFEDBF9F9CBCBFFFFFFFFDBDB0B90B090DAD0B0B0F0FBCBCBC9A99E9D0F9A9B909A9090000000000000000000000000000000000000000000A09B09A0A00B000A00A9A000000A0000A00A00A00A00A09A90B00990000000900000000FFFFDFFFF9FBCBCBCB99F9FFFFFFFBE909C09C90B090BC9F9BD0090909AD0B9B0B9ADAD0F090CB09000000000000000000000000000000000000000090DA0A090B0A0A9A90AB0000A00A0000090A00000B00009ADAD0C900A000009000000009BFF9BBFF0FBC909099ACBDBFFFFFBD99CB09A9AC9BCBDBBD0F0F9BCB0909ADACBDAD990B090B90000000000000000000000000000000000009000009A9A9009AA00009A0A00FA000000000000A000000A0000A0BA9A9BC9090000000000000009FFFC909FFC0000000990B9BFFFFFADA9090009900909C0FBC900090BCB09099909ADAD09A90009000000000000000000000000000000000000000B0C9A0B0A090B0A000000B0A0A00A0000000A0000000A00000F0F00B0F0900000000000000BFF90090BFF00000000090FDFFFFDFBCB0E99000B090B9F0FE00000090090000090909A9C90DA900000000000000000000000000000000000000090B909A0F9A0A0A9A0B0A0F000000000000A0000000000000A9AA9BD0B09A000090000000009FBCB0009EF0900000090F9BFFFFFBD9099000B9D00900BFF00000000900090B0A9A9A9CB0B0900000000000000000000000000000000000900090900EB09A00B009A9A0000B00000A00000000000000A000A09E090F0ADAD000000000000000FFFFDA9009000000099A9B0FFFFFBC9A090009000BD009FFC0900000000000909D090D9A909000900000000000000000000000000000000000900DAC9B00A9AB0B0A0A9A000F0A0A000A0000000000000A0000ABFAB0F909A9000090900000099FFFBDA9000000900009C9FBFFFFFFE9DA0F009090A9F000F000000000009A0900B09A0900009000000000000000000000000000000000900009A09B00BE9A00A000B000A00B00000A000000000000000000000009AB0F09C00900000A900000ADBFFFFBD0B0900909C9B09FFFFFFBDA9900900D090090900000000009000900B09E99CA909000000000000000000000000000000000000090009000B00B09A90BA00A090A0F000000000000000000A00000000BAA90F9E9A900000009000009BFFFBFDFFBDF0F0A99A9CBFFFFFF9FF9CB09A90A90090F0F090009000090909090C90A900000000000000000000000000000000000000000000900BD0B0A0A9A0000A90A000A00A00000000000000000A00000A0090A9A090090000000000000BFFFFFFBE9E9B9F9DA9DBBDFBFFFFE9CB0C90099009000909CA9900D99CB09AD0B90B909000000000000000000000000000000000000009000000090A0B0A9ACAB0A90A0000B0000000000000000000000000009A0A9ADBE90000090009000090F9FFBFDF9F9E90B099A9FFFFFBFF9FBC9B00900090B0909A99CA990A0909C9A9CA90C00900000000000000000000000000000000000000000090B0A9A0B00AB0000A000000F0000A0000000000000000000000A9A00009009090000000000009FAF9E9ADA0909009AC9E9BFFFFFBFCBB0C9F0F0B09090BC90B99CB990B0B0090900B0900000000000000000000000000000000000000000000000D0A9A0B000B00A9A0A000B0A000000000000000000000000A0A09A90ADB00009B000090009BFF9E9C9090000090D9B9FFFFFDFFFBD0F9A090900000909A9C9A900E90D09F09A9D09A900000000000000000000000000000000000000900009090A9A090A9A00A00000000A000A00000000000000000000000900A0009000909000000000009FFFF9B00000909ADBAFFDFBFFBFFADAF90090000090909AD09ADBCB99E9A000090A00000000000000000000000000000000000000000000000000A9A0B0A9A00A00A0A0000F0A000000000000000000000000A0A000B0009000090900090900BFFFFFFFBDB9FBFFBDF9FBFF9FFFDFBDFE990090900000090BC90090009090909E090909000000000000000000000000000000000000000000909ADA900B000A00000000000B00A000000000000000000000000B0A9000F00B9000A0900000909FFFFFFFFFFFFFF9FBFFFFFFFFFFBFFBF9EBD0A000000000009A9A9CB000000B0900000000000000000000000000000000000000000000000000090A0A9EBA09A0A00000000F00000A00000000000000000000B0000A090090C0909000000000BFFFFFFFFFFFFFFFFFFFBFFFFBFFFFFDFFFDAF99090900900900D00900909090900909090000000000000000000000000000000000000000009A90A9E9A900AA000000A0000A0A00000000000000000000000A000A00000B009B000090000009FFFFFFFFFFFFFFBFFFFFFFFFFFFFFFBFFFBFFFDEF0B009009009009009CB09000000000000000000000000000000000000000000000000000000009A9A0A0A900A000000000F00A00000000000000000000000BA900A00900B00F090009000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFBDBCBDA09A09A09A90B00000000000090000000000000000000000000000000000000900009090FA00090000A00000000000B00000000000000000000000000000A900009009009E9A0009009FFFFFFFFFFFFFFFFFFFFFFFBFFFBFFFFFFFFFBFFFFBCBDBC9F0900009090000000000000000000000000000000000000000000000000000900A0900B0A00A00000000000000E00000000000000000000000000B0A00A0000090B00909909009ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADFF9E9B0000090900000900000000000000000000000000000000000000000000000090090DA0B0A90A000000000000000B0A00000000000000000000000A0A000000A9B0090B0BCA00A909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFDFFB9EBD0090900000000000000000000000000000000000000000000000000000000090000B09A0090A0000000000000000F000000000000000000000000000000000000099AD0D09090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFBF9EF9009009090900000000000000000000000000000000000000000000000000009000090DA00B0A000000000000000000A0000000000000000000000000000000000000AC9A90B000009C9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFF9DE900900A090000009000000000000000000000000000000000000000000009000090A909A90B0A00000000000000000F00000000000000000000000000000000000090909CB0D0B0009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDAF9EB900DA90900000090000000000000000000000000000000000000000000000000000090BC90A00000000000000000000B000000000000000000000000000000000000A90B0B09A90090B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFBF9F9000B0900090009000000000000000000000000000000000000000000000090000090A9AD00B000000000000000000000E00000000000000000000000000000000000090090DAD0900009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBDFDBCB090090909000000000900000000000000000000000000000000000000000000000009C90BA0A00000000000000000000B00000000000000000000000000000000000009ADA90B00F009A9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BCBD0090B00B09000900900090000000000000000000000000000000000000900000900A90BD090000000000000000000000F00000000000000000000000000000000000A009090BCBD090009FFFFFFFFFFFBFFFFFFFFFFFFFFFFFFBFFFA90F9DB9A090D00900009000000000000000000000000000000000000000000000000000900090F00A0A000000000000000000000A0000000000000000000000000000000000000B0B0F0900B0099BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FF9DA9C0909A90090000090900900000000000000000000000000000000000009000000000BDA9A9000000000000000000000000B000000000000000000000000000000A00000909C909EBD00B0C9BFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFBD909EBDA90009009009009000000000000000000000000000000000000000000000000090090009C00B00000000000000A00000000E000000000000000000000000000000000000009ADB090AD009A0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FBDB0F0900B900900000909000090000000000000000000000000000000000000000000009BCA9A0000000000000000000A00000B000000000000000000000000000000000000B0A909F9F9A900999FFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFDA9FADF90009C0000900900000900000000000000000000000000000000000009000090000B00990900A0000000000000000000000A00000000000000000000000000000000000000D0BE9A00DAD090BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF090F9F90009A9090B0090090090000009000000000000000000000000000000000000009AD9E90E00A000000000000000000000000F00000000000000000000000000000000000B09A909E9F9A909A9E9FFFFFFFF9FFFFFFFFFFFFFFFFFFFDFF09F9F9A900090009000009090000900000000000000000000000000000000000000000000A09009000000000000000000000000000A000000000000000000000000000000000000009E9E9A9C9E90909BDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9E9ED000909000900900009090000000000000000000000000000000000090000000099D0A9A0A09A00000000000000000000000B00000000000000000000000000000000000A09A909F9E9A90F09BCBFFFFFFFDBFFFFFFFFFFFFFFFFFFFFBC09BDA90909A00090000090900A0900009000000000000000000000000000000000000BCA009C9000A000000000000000000000000E0000000000000000000000000000000000099AD00B0A9E9E90BC0B9FBFFFFFAFFFFFFFFFFFFFFFFFFF9FC99FDA9000090909000909A0009090009000000000000009000000000000090000000090090B0B0A009000000000000000000000000B000000000000000000000000000000000A0A0DAFD099E909E90BD0F9FFFFFFDBFFFFFFFFFFFFFFFFFFFBF009A909009E0009A9000090900000000000090000000000000000000000000000009A0F009CBC000A00A0000000000000000000000B000000000000000000000000000000000090B09A9AC99FA99AD0B9ADABFFFFBFFFFFFFFFFFFFFFFFFFFDE900D0009009900000090900090909009000000000000000009000000000000000000D9009A90B00090000000000000000000000000E000000000000000A000000000000000000000DADADB0E9DAD09BC09BDF9FFFF9FFFFFFFFFFFFFFFFFFFAF099B09000B000909000009090000000000900090000000000000000000090000000B0AD0B0DA00000A000000000000000000000000B00000000000000000000000000000000000A9B0BDB0E9FADA9BCBDBCB9FFFF0FFFFFFFFFFFFFFFFFBF9FD0BC0009009009A900090900A09A9000900000000000000000000000000000000099C090B0DA9A09A00000000000000000000000000A00A0000000000A00000000000000A0000000009CB0F9B09F9E9B0B09ADBFFFFDBFFFFFFFFBFFFFFFFFFF0C0B0B000909000009000009090000900000090000009A0090000000000000000000BDA9C9A000A0000A00000000000000000000000F0000000000000000A0000000000000000000BCA9CBCF0F0BCBCE9CB0DADBFFFADBFFFDFFFFFFBFFFDBDFB09C909009E0900900090900009090000000000000000900009000000009000000B0009A0F9A009A000000000000000000000000000B00000000000000000000A00000A0000000000090B9B0F9E909B99A9CB9A9FFBDBFFDFBFFFFFFFFFFBEFBC9A900000090009000000009090000090009000009000000000000000B0000000909E90D90009A00000000000000000000000000000A0000000000000000000000A000000000A0000B000C0FDA90BCBCAFDB90FDFBDCBFFFFFFFDFFFDFBDFDBC9090B090090909009090909000A9000000000909000A900009000000900000009ADA90F00A0B0000000A00000000000000000000000F00000000000000A000000000000000000000000B0909ADF090DBD9A9E99A9FFB9FFBFFBFBFBFBFDAFBDB0000000090A0000000000000090009000009000A0090000000000000C90000900909E90B00000A00000000000000000000000000000B00000000000000000A00A000A000000000A000000A909ADF0B0FADDA9EBDA9FED9FF9FDFFFFDFAF9DAFCB0090000090900900000900900900000900009090000009000000090A00000009A090E900A9A0000A00000000000000000000000000A000000000000A000A0000000000A000000000A009000A9A0F0F9FAB9C90B9EDB9A9FFFBFADBFFD9EBDB9C090090090000900009000000000000000909000009009000900000090000000AD0F090A90000000000000000000000000000000000F000000000000000000000000000000000000009A009E9C9F9F0F0D0DA9E9C9B9E9FFDBDFDFFDB9A99F9E90000000000900000000009090090009000A000000000000900000090000000990B09A000A00000A0000A0000000A00000000000000A00000000000000A00000000000000000A0000000B0090B00B0F9FAFAD09A9E9E9ADBBEFBF9FBED0FF0F0000900009000000000009000000000000909000009A90000000009A0000900BCAD0A00A00000A00000000000A00000000000000A000B00000000000000000000A0000A00000000000A0000B00090CBCAD9F9A9C90909C9ADF9FDBF0F9A90BD9F00000000090090000000000000000900B00C09090000000900000090000009090A90B009A0000000000000000000000000000000000E000000000000A00A00A0000000000A0000000000A9009E0B09F9AF0DF09ADA9A909B0F9ADAF9E99F9A909090000000000000000000900009000900B000000900090000009000009009E0900A00B0000000A000000A00000000000000A0A0000B000000000000000000000000000000009000A000000B00909ADAD09A09A909C90E90DB0FDBDBC9E9A9DA00000009000000000090000009000A900D09009C90E900000009A0090900DA09A0B09A0000B00000000000000000000000000000000A00000000000000000B00000B000A0000A0A009000B00900C000BEDADBC9CB0009090BC9B0BC9B090DA090000000000000000000000000009090E9A0090A0A900000000000000000B00B0B00A0000A000A0000A0000000000000000000000000B000000000000000A000A0A00000000000009000A000A00B009099A90F0B0CB0B00090BC9D0BC9ADB0900000000000000000000000000900000900900090900900000009000900BC0B0B00F09A9A00000900A000A000A000000000000A000A00E000000000000A0000A00000A0A000A000000A00000000900B00009E90FCB09C0090E909A0BC9A9009000000000000000000000000090000B09A9D0B9E0000B00000009000000F00B000F0A0A000900A0A00090000000000000A000000000000B000000000000000000000000000A000A00A0000000000009009E9E90F0B0D0A900A90000909AD090000900000000000000000000000A09D0DAC9A00000009C00000900A009E900B0BEB0A909A9A0A09000A00A0000000000A00000000000000A0000000000000000A0000A000000090000000A000A000000090090CB0C9CBC9C9FD0009000009E000000000000009000900000009090900B0900090D009E9000000A0909A09A9B0A90090A0A000000A00000000000A000000900000090A0000F0000000000000000000A00000A000A00000009000000A00000B00B0F9B0B09A000AD00000090090000000000900000D009009000A00D0B0090BCBCB00B00000000900000DAD0ACBCA9A0B09000A9A000A00B0000000000000A0A00000000000A00000000000A000000A09000A000A000A000000A00000900000000900C00DAD09FF00000000E9000000000000009CB0000000090909A90DADA90900090000009000009CB090B0B0A90E9ACA0B000009009000A0000000000000000000A00000B0000000000000A00A900A0A000000000000A9A00000000A0000909A0FBC9A90FF000000000090009090000090C9A0000B00BC9A9E9E90CB000000000009009000009B0B0D0A0B009AA900B000A9A00A00A00000A000000000000000A0000000E000000000000000000A90000009A00A0000000000000A09A9000009090B0DCB00F090000090009A0009009000B00909000900BC9009CB0000000000000090A000900C9CB0B0DA9A0900B009A9000000B00A0A000000000A00A0000000000000B0000000000A000000000A00A000000000A0009A0000000000A00000000DAA9CB00009CB00C9AD0909E090CB0000000099E0F9000BCA0000009000000900A90000E9A9A9C9EB0000BCB00A000A0B0A00000900000000000000000000000A0000A0000000A00000A0000A009000A00A09A090A0000A0000000A90000090F09D0BC90B0E90FDBAD0ACBC09A0900D0D0B0F0E90000BC009000090000000900D00090900D0DA9B00B0FB0A00B0B0A090009000A000A000000000000000000A000000F000000000000000A000000A00000000000000A000000000000A0A000A0900A09AD009BE9A0C9AD9C0B0C9009A90BC90090D0E90090000000000090F00B00000A0BDA9A9AC0BCB0000B00000900A00A0A000A0000A0000A00A000A0000000000A00000A0000A000000000A00A000B00A000A0000000000000000000B0900B0D9EDA0D009C9DBC9A0B9CB0EBDADAD00AD000A9000000C009000000A000D000009C9009E9E9A90A0B0B00A9A9A0B00A00090A00000000000000000000000000000B0000000000000A00B00000900A000090A00000000000A00000000000A000A0B0FDAAF0F0A00ADDACB0D90E90000AD000AD00000009A000000000909A0090B00B0F09B09A0A9000A0B0000000000900A0090A90A000000000000000000A00000E0000000A0000B00000A9A0A000000A000000A000009000000000000009A0900B0BDD0D09D099A0BD0E0AD000009000009000000000090000000D0E0090A0C90C90BE0A00900A9A0900B0A0B0A000A000A0000000B0A000A000A0A0A00000000B0000000000A0000A00000000000A0000000000000A00000000000000A0090A0000FABEBEACA0C9C0A9090000000000900000000909000000909A90900C909ADBAF0090B0A0B0009A0A00900009A0009A90A0A00000000000000009000000000A000000000000A0000A9A9A00A000000A00A090A00000000A00000000000A09A9A909C9C9DBD09A09C00CB000000090000000000000000000AC00000D0BCBC9A090B0A000900A9A0009A0A0A9A0009A00A09009A000000000000B0A000000000B00000000000009A000A000B0000000900000A0000000A000000A0000000000000A0A9A0A00BE090A90090F090900A00000000000000000BC9090900A9090BE9AAC090A9A0A90000A00090B0009A000B09A0A000000A00000000009A00A00000E00000000000B0A000009A000000A00A000900000000000000000000000000A00000900909FC9CADC0F00009E000909AD0A000000009CB0000A0AC9E90F0F0B0D0B0A0900900A09000A9E000B0A00A000A0900A00A0000000000A9A000000000B000000000A000000A90A0000A00000000A0A0000000000000000000000000000000A00A0A0BFADB0B09CB0F00C00000009000009ADA00C9CB09C9A90F0BA90A0B0B090A0A0000A0B09A009A00000900B000A90000000000000B0000000000A0A00000000000A0A00000000A000B00A900000000A00A00A00A000000000000000000000009000DADEDE0AC90F9B000000000909BC909F09A90D0B09E9AF0DA09A0000A00000A90000A00B0A90A09A0A00900000000000000000000A0A0000090B00000000000000900A0A090B0000000A00900A000000000000A00A00000000A00000000000B0B0B0BD090000ACBCB09090DADADAFCA9E9CB0AD0FE9E90BA9A09A9A000000000A09A9A00B0AF9A00000A0A000A00000A000A00000900000A000E00000000000000A0A0909A000B0A90000A0000009A000000000000000A0000000A00A0000A0000000ADA0B00D90F0DADAFADADAD9BDE9FADFDAF09A9A00000000009A00000000000A0B00BB0A00B0B00000000000A0000000000A000000000AB0000000000000A000000A0A9A0000A00000A009A00000000000000000000A00000000000000A9A0B0900D0DB0ACB0F9E90D0F9ADAE0BDAD9A0B09A000000B0A00B0A000A90000B0B090A9ACB09A00009000000000000000000A000A000009A9A0000000000A0090B00A9A90000B00090A9000000000A09000000A0000000000A000090A000900000000B09A0D09C9ACBCB0B0ADAD9F0A90A0B0A09A9A9A0000B009000000A0A00000A00A9A0A009A0A0A00A000A0000000000000000000A000B0000000000000A0000000A0A900A00A000A9A0A000000A000000000A00A000000000A00000A00B0A0B00A09A09A009000000D090A009000900000000009A0900A0A0B00000090A9A90A9009009A009000000000000B000000009A90A0000000E000000000000000A000A90090A9000009A9009000A0000000A0009000000000000A0000000000009000900A09A0900A9A009A0A090A0A9A00090A00A00000A000000000A9A9A00000A90A0A00A09A0A9A090000A9A00A000A00A00000000A00B00000000000A00000A900A0A00009A0B00A0A00B00000000000A00A0000000000000000A0000009A0A0A0B09A0A00B00090A09000A909AC0A0A090009A00000009A9A0B0000009A0B00A0909A90A009000A0A090000B000000A90A0000A0000A0000000000000A00000A0900B00A0000A90900000090A00A00000000A00000000000A00009A0A0009090000A909000000A09A00B090A00B009000A000000B00A00000009A0A0A0000B090A0A0A009AA0B000000A00BA0A00000009A00000B00F00000000000000000009A0A00A90B0B00A0A0B000A0000000000000900A0000A00000009000090A0A000B090A000B000000A9A00A0B0B00B0A0B009A000000900A9A0A9A90090A9A00A00000909A090000A90009A0090000000A00000000000A0000000000000000A0A00090B0A00000B090000B00000B0000A00A0000000000000009A0A0900A9000A000A000A000B0B0090000900000B009000A000B0000A00000900A0A9A09A0B090B0B0A0A09A09A090A0A0000A0000A00000000000A00B000000000000000000900B0A0090A0B0000A90A0090A0009A0000000A0000A000000A00000A0A0000009A0090000A00000A0A9A00A0B0B0000A9A9000000A000009A0A9009009A9000A000009009A0BA00A0009000000A0000000A0000A0000E00000000000000000A0B0000B0A0900B0A90A0900A0000A0000090009000090000A900000900900A90A09A000A09000A00090000000000A0A900000B0A00090A0A000000A0A0A0A9A90A0A9A0A0A0BC9A900000A000B000000A0090A00009A0B000000000000000000000A900090A00000000A0000009000000A00A0A0000000A0000000A00A00000000000A000A00900000A000000009090A00A00009000A0900000000090900000A09000000090BA00A0B0A090000A9A00000A000000A000A0000000000000000000A900A9A0A90B0000B000A90A00000A000000900A000A0000A000B00090A90A09A0000090000000A00000B0000A0A0009A90A0A00A000000A09A090A0A0A90B0BA0A0B09A0A09A9000000A000A90000009000000009A0F000000000000000000000A000009A000B00009000000A00900009A000009A00009000A0000A000000000090000A000A000009000000B009009A0009000000B0A00000000A009090A0B0090000A0909A00A9A0A900A0B0A00000000A00000A00A0000000000000000000000A9A9A00B000A0000A00A9000A0000A0000A00000000A000900090A00A09A000A00A000B00000000A00A00000A0A00000A000000000B000A0A0090A00A9B0BA0B0B000A0ADA9000900A09009AB00A00A0000000000B0000000000000000000A09000A9A00A900B00000000000000B0000A900A0090A000A00A0A0000090009A000000000009A00A000000B0000090A9A009A000A0B00A0090900A900A0ABADB00A0B090A900A0B0A0000A0B0BCB000000000000000E000000000000000000000A0009A09A90A000A000000A000000009A000900A000000900900009A0A0A00000A90A900A00000000009000A9000A0009A000A9000BA90A0A0A000A09090BA0AB0000A09A0B000000B00000A9A0000009A00000A00B00000000000000000000000A9A09A00A09000000A0000A00A00A0000A009000000A00A0000A0090090A000000000B00A000000A0A00000A0B090A000000009ABCA0009009A0900A0FA00909A0B09A0B000A09A00A09A9A0A0000A0000000000A0000000000000000000000000DA009A9A0A00000000000000000000900A00A00A9000000A9000000000B0B0A00A00090000A009009A0B00000A90A00000A0A90B009A0A000A0A09A009A0A0900A09AC0B09A09A09A0000090A00000A00A0000B000000000000000000000A9A0A9A000090000A0000A00000000900A00000000000A090A000A9A0A0A00000090090A0A0A00000000000000B0B0A909A000900A9A90A909A09090A09A0A9000A090A09A00A00A0B0000A0B0A00B000000000000E0000000000000000000000009A0009A9A000000000000000A00A0000A900000A0090A009000000900900A0000A00900090B00A0A9A09A0B00A9A0A000A0000000AADA0A00A00A90A0900E9A90AC90A09A90B0900A9A90009AB000A00000A000B0000000000000000000A00A9A009A000000A000000000A0000000A0000A09A0090A00000A900A00A00A900A0090A00B00A009000000A0000A9000000000A0B0A9A90A900000A90A90A0A9A00A9A0A09A00A000A000000A9E000A0000A00000BA000000000000000A000090000B000A00A00000000000000000A09009A00A0000A0000A0000A090900000A09A0A00000A0000A00B0B090B0B0A9A9A9A0090000009AA9A9A9A90A90A09A9A9A900B09A00B090A0009A0B09A9A00000009A00000F000000000000000000000A9A00A0000000000000000000000000A00009090A9000B0900B0090A0A09A9090000090B0009A90000000A0000009A000000A000009A090A00000A90A09A000009A090AA0B00A009000A090A00A9A090000000000AA00000000000000000000A0000000000000000000000000000000000A0A00A00A9A00A0000A000000A00A0A9A9A0A00B0A00A9A9A9A90B0B0B09A9A00B00A00A00B0A9A9A0B00B0B09A9A9A00BA909000B00A0A0B09AB0BA9A000A0B0A0000A9B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000A00A000000000000000000000B00B0A00A000A00B000A0A9A000000000A000000000000000000000000000000000000000000105000000000000DFAD05FE','Laura received a BA in psychology from the University of Washington. She has also completed a course in business French. She reads and writes French.',2,'http://accweb/emmployees/davolio.bmp'); +; +INSERT INTO "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(9,'Dodsworth','Anne','Sales Representative','Ms.','1966-01-27','1994-11-15','7 Houndstooth Rd.','London',NULL,'WG2 7LT','UK','(71) 555-4444','452',X'151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00D999D999999D9D999DB99DD9F9D9D9D99D99D9F9D999BD9FD9D9D9D9D9DFD9F9F9DBDBD9DBD9DB9FD9FDFFFFFFFFFFFFFFFFFFF9D9F9DB9D9DFD9DB9F9BDF9F9D9DBD9BD9F99DBD99999999D9DBDBD9BDDD9F9DBDBD9F9D9D99D9BD999D99D9D99DB99D999D9F9D9F9D9D9999D9B9BDBD99F9D9999D9DBD9FDBDBDBDBDBD9F9D9DBD9D99FD9F9DD9FDD9FFFFFFFFFFFFFFFFFFDBDF9DBDD9F9DBD9DD9DD9D9DDBD9D9DD9D9D99D99999D99D9F9D9D9DD99BD9D9D9D9F9DBD9FD9DD999DB9DBD99D99D999D999D9BD9D9DBDBDD9D9DD9D9DD999999999FD9F9D9FD9D9D9D9F9D9F9D9DBDF99F9DF9F9F9FFFFFFFFFFFFFFFFFFFFD99DF9DB9DF9D9D9F9F9F9F9BD9F99F9F9DBDF9D99D999D9D9D9D9F99BDD9D9F9F9F9D9D9D99BD999999D9D9F99D999999D9F9D9D99F99DD99B9D999D9B99D999D9D99FD9DBDD9DFDBDBD9D9D9F9F9D99DF9FD9FD9FDFFFFFFFFFFFFFFFFFFFFBDF99D9DFD9F9DBD9D9D9D9DD9D9DD9D9D9D99F99999999B9DBDBD9D9D99DBD9D9D9D9F9F9D9D9BD999D9F9D99DBD9D999BD9D99D9D9D999D9D99F9F9D9DB9D9999BD99F9DDB9F99D9DD9F9F9D9D9DBD99D9DBD9FD9FFFFFFFFFFFFFFFFFFFFFD9DDBDB9DBD9F9DBDBDBDBD99F9F99F9F9F9D99D9999D99D99D9D9DBD9F9D99F9DBDBD9D9DBD9DD9F99999DBD9999999F9D9DBD9BDBD9FD9BD99D9D9D9D9D999999D9DFD9F9DD9DF9F9DBD9D9F9D9D9D9FDF9DFD9FDDFFFFFFFFFFFFFFFFFFFFF9F9D9DDBD9F9D9D9D9D9D9FD9D9DF9D9D9DBD9F999999D99D9DBD9D9D9DBD9D9D9D9DBD9D9D9B9D999D9D9D99D9D9999D9F99D9D9D99D99D99F9D99DB999999D9D9DF99F9DDBDF9D9DBD9D9F9DBDBDBDDB9DBD9F9FFFFFFFFFFFFFFFFFFFFFFFD9FDBDBDBD9D9DBDBDF9F9D9BD9F9D9F9F9D9D999D9D999DBDBD9F9DBD9D9F9DBD9F9D9F9DBD9D9D9999BD9F9B99999D99D9D9BD9D9D9BD99D9D9BD99D99D999F9F99FD9DBD9D9D9F9D9DBD9D9D9D9D99DDBDF9DD9FFFFFFFFFFFFFFFFFFFFFF9F99D9D9DFD9F9D9DD9DD9FDD9D9DBD9D9D9DBD999999D99D9D9D9D9DBD9D9D9DBD9F9D9D9D99D9F999D9D9DD9D99999FD9F9D9D9BDBDD9DF99F9D9D9BD99999D9DD9D9F9DBDBDBD9F9F9D9F9F9F9DBD9BDDBDF9FDFFFFFFFFFFFFFFFFFFFFFFDDF9FDBD9DBD9DBDB9F9BD99F9F9D9D9F9DBD9FD999D9BD99D9F9DBD9D9F9DBD9D9D9DBD9F9D9BD9D99999F99D999D9D99D9DB99FD9D99D99DD9D9DB9D9999DBDDB9DBD9DBDDD9D9D9D9DBD9D9D9DBD9FD9FD9DF9FFFFFFFFFFFFFFFFFFFFFFFFBDD9DD9F9D9D9D9DD9DD9FD9D9D9F9F9D9D9D9999D99D9D99F9D9D9F9D9DBD9F9DBDBD9D9DB9D9F99999D9D999999DBDF9D99D9D99D9F9BDDB9DBD9D99D9D9D9B9DBD9DBDDB9F9F9F9FD9D9F9F9F9D9D9FDBDF9DFFFFFFFFFFFFFFFFFFFFFFFFD99F99F9DBDBDF9F9FDB9D99F9F9D9D9DBD9F9D9999D999BD9D9F9F9D9F9D9D9DBD9D9DBD9DD9D9D999D9D9D999D99D99DB9DBD9D9F9D9D99DBD99D9999B9DBDDD9DDF9DF9DDD9D9DD9BDBD9D9D9DBDBDBDDBDFFFFFFFFFFFFFFFFFFFFFFFFFFDFD9FDDBD9D9D9D9DD9DF9FD9D9F9D9F9D9D9F99D9DB9D9D99BD9D9DBD9DBDBD9DD9DF9DBD99F9F9D9999F999999F99D9D9D9D9DBD9D9D9FD9D9D9BD9D99D9D9BD9B9D999F9F9F9F99DD9DBDBDBD9D9D9DBDD9DDFFFFFFFFFFFFFFFFFFFFFFFFF9FD9BDDBD9F9F9F9BD99D9F9D9D9F9D9DB9D9D99B9D99D9DD99F9D9DBD9D9DBDB9F99D9D9F99D9DB99999D99999D9F9F9DBD9F9D9F9F9D99D9DBD99999D9DBDDD9DDBDFD9D9D9D9DF99F9D9D9D9F9F9F9DF9F9FFFFFFFFFFFFFFFFFFFFFFFFFFD9DFDBDD9D9D9D9DD9DF9D9DBD9D9D9BD9D9F99D9D9F99F99D9D9F9DD9F9F9D9DD9DF9F9D9DD99F9D99D9999D9F9D9D9D9D9D9D9D9D99D9F9D9D9D999D9F9D99B9F99D9D9F9F9F9F99F9D9F9F9F9D9D9DF9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBD9DB9F9F9FDBDBDB9DBDBD9F9DBDD9D9F9D99999D9D99D9FDBD9F9BD9D9DBDBDB9D9DBD9B9D9D9999BD999D9DBD9DBD9DBD9DBD9D9F9D9BD9999D9BD9F9FDD9DFDBDBDD9DD9D99D9DBD9D9D9DBD9DBDF99FFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBDFDD9D9DD9D9D9DD9D9D9D9D9D99F9D9DB9D9DF9D99DBD99D9D9DDDBDF9D9D9DD9F9D9D9D9F9D999D9999BD9D9F9D9F9D9F9D9DBD9D9D9DF9D99D9D9DD9BD999DD9D99F9DBDFD9D9D9F9F9D9DBDBD9DFDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD9DB9DBDB9F9F9F9BDBD9F9DBD9D9DDB9DD99999DBDD999D9FDBDBD9D9DBDBDB9FD9D9F9DBD9DBD999D99D9D9D9D9DBD9F9D9DBD9D9F9D999999D9D9F9BDD99DF99DBDF9DBD999F9F9D99D9F9FD9D9F9DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9BDBDD9D9DD9D9D9DD9D9F9D9D9F9D99D99F9D9DDD99BD9DBD99D9D9F9F9D9DDDD9DF9F9D9D9DBD999D99D9DBDBD9F9D9D9DF9F9D9F9D9BD9D99D9BDBD9DD999F99FD9D9DBD9D9D9D9D9FD9F9D99F9F9FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDD9DB9F9DBDBDF9F9F9FD9DBD9D9F9D9DF999F9B99DD9D9D9FD9DBD9D9D9FDB9BDB9D9DF9DBD9DD999B9B9D9D99D9F9D9F99D9D9D99D9D999D9BD9D9DD9BD99DDD99F9F9D9DBDBDBDBD9BD9D9FD99DFD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9FD9D9F9D9DD9D9D9DD9F9DBD9D9F9F99D9D99DDF99DB9D999F9DBDBDBDD9DDD9DD9FD9D99DBDBD99D9D99F9DBD99DBDDDBD9DBDD9BD9F999D99D9F9BDD999B9DF9D9D9DBD9D9D9D9FDD9F9F9FDF9FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD9FD9D9DBDB9F9F9F9BD9D9D9F9D9D9D9F99D999D9F9D9BDDD9D9D9D9DB9F9BDDBDF9BDBD9D99DBD9999DF9D9D9DF9D9F9D9F9D9BD99D99D999DBD9DD9BD99DD99D9F9F99D9BDBDBD99BD9D9D9D99D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F99F9DBD9DD9D9D9DD9F9F99D999D99DD9DBD9D9D9D9DD9B9DBDBDBD9DD9DDDBD99DD9D9F9DDBD9999DF99DBDBD9D9F9DBD99D9DD9D99D99BD9DDBDBDD999DB9DBD9D9DDBDD9D9D9FDD9F9F9F9BDFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DBD9DBDBDBDBDBD9D9DD9FDF99F9BD9D9DBDBD9F999DD9D9D9D9F9F9F9BD9FDDBDBD9DB9D9D99D99DF9D9D9DBD9D9D9D9F999DB9D99D9D9F9D9D99D99D9D9D9DBDB9D9BDBDBD99BD9D9D9DD9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9F9F9D9F9D9D9DD9D99F9F9BD9999D9DDB99F9D99D99DBD99BD9BDBD9D9DDDDBD9F9DD9DBD9DBDBD9DF9D9DBD9F9DBD9F9DBD9DF99D99F99DBD9DBD9DB999BD9DBD9D9D99D9D9D9DFD9F9F9FDBD9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD99DBD9F9F9F9F9FDD9D9DD9DD9D9999D9D9D9DDBDD9D9FD99DD9DBDBDB99FDBD9F9F9D9D9D9D9D9BDDBD9D9D9D9D9F9D9D9D99D999D99D9D9F9D9BD9D99D999D9F9D9F99D9F9F999D9D9D9DD9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9DBD9D9D9D9D9D9DBDBD99F9BD9F9DDF99DBDB9D9BD9D99DDB9D9D9D9DDF9D9DF9D9DBDBDBDFDBDDDBD9F9F9F9F9F9DBD9F9FD9F9D9D9F9D9D9F9D9999D99DF9D9DBD9DBDBD9D9DDBDBDBDB9F9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9F9D9F9F9F9F9F9F9D9D9FD99D9D9DB99D9D9D9D99D9DB9DB99D9F9F9F9F9F9DF9F9DBD9D99D99DBF9DF9DD9DD9DD9D9D9D9D99D99F99D9D9F9D9D99D999BD99DBD99D99D9D9DBDB9D9D9D9DD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9DBD9D9D9D9D9D9F9F9D999D9F9999DF99F9D9F9F9D99D9D9DBD9D9D9D9D9FD9D9FDD9F9DDBDFDDDF9DF99F9BDB9F9F9DBD9D99D99DBD9FD9F9D9DB9D99D9D99D9FD9F99F9F9D9D9F9F9F99F9BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9DBDBDBDBD9F9D9D9F9DDF9D9DFD99DF9D9BD9D9DBDDBD9D9D9DBDBDBD9F9BDBD9BD9D9B9D99BDF9DF9DF9DDDDD9D9DD9DBDBD99D9D9D99D9DB999D999D99BD9D99D99D9D9DBDBD9D9D9DF9DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9D9D9D9D9F9DBD9D9DB99D9D999D99D99DD9F9D9D999DB9D9F9D9DD9DBDDD9D9FDDF9DDDBDFD9DDF9DF9DBDB9BDBDB9F9D9D9D9F9DBD9FD999D9D9999F99D9DB9D99DBDB9F9D9DBDBDBD99F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBD9F9F9F9D9D9DBDBD9DD9F99DDB9DB9DB9D9DBDBD9D99D9D99DBDBDBDDB9F9FD9F9DBDBD9D9F9F9F99FDD9DDD9D9DD9D9D9DBD9D9D9D99F9D9D9BD9D99D9D99D9F9D99DD9DBD9D9D9D9FD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9F9DD9D9F9F9F9D9D9DB9D99DB99D9D99DF9F9D9D9F9FD9F99D9D9D9DF9DD9D99F9F9D9DBDBDDFDDDFD9F9DB9FDBDBDF9F9F9D9DBDBDBD99D999D9999D999BDDBD999D9BDBD9DB9DBDBD9BD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9DBDBD9D9DD9F9F9F9DF9DF9D9D99FD99D9D9F9D9D999D9D9F9BDBD99F9F9FD9DD9F9FD9DDBDDBDBDBD9DBDD9DD9D9DD9D9D9F9D9D9D9D99DBD99D99BD9FD99D9DDB9D99D9F9D9BD9D9FD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBDBD9D9F9DB9F9D9D9D99D99D9F99D99D999F9D9F9DBDDB9F99DD9D9FD9D9D9DF9BDD9DBDF9DFFDFDDDFDF9D9F99F9F9BDBD9F9D9F9D9DB9D99D9F99DD9D999F99B99D9D9F9D9BDDDBDBD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99D9D9F9D9F9DD9D9F9DBDDBD9D99DB9D99FD9DBD9D9D999D99D999F9D9F9F9DB9DDDBDBDF9DBD9F9F9F9D9DF9DFD9D9DDD99D9DBD9D9F9D99D9999D999B99DD9D9D9D9DBD999DD9B9D9D9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9DBD9F99D999F9D9D9D99D9B99D99DB9D99F9D9DBD9D9D9D999FD9DBD9D9F9DDBDBD9DD9FDFDFDFDF9FDF9DF9DBDBDB9FDBDD9D9DBD9D9D99F9D9BD9D9D9B9D9D9D9B9D9DDB99DD9F9F9DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBD9D9DDF9DF9D9F9DBDF99DDD9B9D9D99D99DBD9D9F9F9F9DF999D9D9F9D9F99D9DBDBDF9DBDDBDBDFDBDDBDDBDDD9DD99D9BD9DBD9D9F99D9D99D999D99DDB9F9BDD99DB9D9DB9F9D9DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9F9F999D99DBD9D9D99DF99BD9D99D999D9F9D9F9D99D9DB9D9F9F9F9DBD9DFDBDDBDD9FFDFFFDFDF9DDBD9F9DB9FDB9DF9DDBD9D9BD99F9999D999F99D999D99D999F99D9DBDD9DBDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDBD9D9FDF9FD9DBDBD9FD99DD9D999F99DB9D9F9D9D9D99D9D9D9D9D9DBD9DBD9DDBDDBDBD9F9DFDBDF9FDF9DF9DD99DD99DB9D9D9DD9D99D9DB9D999D99DBD9D9D9D99D9999D99F9D9DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9DBD999D99F9D9DBD99FDB9D9BD9D999D99D9DBD9F9F9F99F99DD9F9D9F9D9F9FDDBDFDFFD009FDFDF9FDF9DF9DFDBDF9DD9F9F9BD9F9D999D9BD9D9D99D99F99B9D9BD9F99F9D9F99FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DB9DBDDBD9D9D9D9D9D999D9BD99D9D999D9BD9DBD9D9D9DD9DB9BD9F9DD9F9DF9F9DF9FDFF909BDF9FDF9DFD9DBD9D99DB9D9D9DD99D99F9D99D99F99BD9F999D9DB9D9999F9DBD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DD9D99D9FD9F9BD9F9DD99D99D9B9F99DB9D99D9DBD99F9BD9D9D9D9DBDF9FD9FDFD9FDBDF09909FFFDBDFDBDFD9F9FDF9DF9DBD9BD99D9999D99D999D999D9D9D99D99D9D9D9D9FD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9DB9DBDBD9999D9D9D9DB9DB9D999D99D99D9DF9F9D9F9D9D9D9D9F9DBD99DD9F9DBDFDFDFD90D999DDFDF9FD9DBDD9D99D99D9D99D9DB9D9F99D999D999D9999B9999D9B99F9BD999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99D9D9D99DFD9D9BD999D9D9BD9D9D999D9B99D9F9D9DBD9DBDBD9F9DDFDF9FDDFDBDBFDFF0B00D09B9FFD9FF9DBDBDF9FD9F99FD9D9D99D9D9B9DB9D9B9D9F9D99D99D9D99DDBDF9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DDBD9D9F9999F9D99F9DB99D99999F99D9D9D9D99DBD9D9F9D9D9D9DB9DBDF9FF9FDFDFFDFC9D9099009DFFD9DF9DD99D99D9DF99F9D99D9999D999D99D9999999DB999999D99D99DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9BDDB9D9D9D99DBD99D9D9D9D9D9BD9DB999DB9DDBD9D9BD9DBD9F9FDDBD9DFD9FDF9FDFFF9B9099C900BD9FDF9DF9FDF9FD9D99D9D9BD9B9D99999999999D9999999DBD9D9BD99F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D999DB99F99D999D9D99DB99B99D9999D9D99D999D9F9D9DBD9F9D9DBDDFBDBFDBDFDFFFD00E909909009F9FDF9D9D99D99DB9D99D9D99D99D999D9999D9999D99D99999BD99FD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9F9D9D9D9BD9D999BD9DD9D9999D9D9DB9D9BDDB9D9D9D9D9D9FDBDDBDDFDDFDFFDFDFFB990DA9D0900099B9FF9DFD9DBD9DBD9B999999999D999D99999999999999D9D9D99D99FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9BD999D9999D999DBD9999999D9D9BD9B9D99D99D9D9F9F9F9F9D9FDBD9F9FBFDF9FFDFDF00CB990990DB00009D9F999F9D9D9D99D999D99D9999999999999999999D99999BD9B9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9F99DBD9DBD99999B9999999BD99D99D9BD99DF9D9D9D9D9FD9FDDFDFDDDBDFDFFFFF9DB000990F00009E90BD9FD9D99F999D99D9999999999999999999999D9999BD9D99DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD99BD99F9D999999999D9DBD999D99D999DB9D99F999D9F9F9F9D9FD9F9F9FFFFFDFFDFDFDA909090999000090909999DBD999D9999999999999999999999999999999D9999F999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D99D9999999D999D9999999B99D99D9F99D99D99DDBD9D9DDF9F9DFDFDFDBDFDFDFFFFF09000909090099009000999999D999999999999999999990990999999999999D9D9D99FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999D999DB999999D99999D999F9999D999F9D9B9DBDBDB9DF9F9FDBDFDFFDFFFDFFFF909A9090F09D000000900099999999999099999909999999909909999999D99999999DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9F9999D99999D99999D99999999D999F9D999F9D9D9D9DDBDDDFDBDF9FFDFFDFFFFF99000000C990B0900900000009999999999909999999099090909999999999999BD9F9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999D99999D999999999D99D9D999D999999D9D9DBDBDDBDDBF9FDFDFFDFFDFFFFD9D9A0009DB0090000000000000000000099999909999999090909090909999999D99999DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9999D99F99D999999999999999999999999D9DBD9BD9D9F9D9FDDF9F9FDFFDFFFF9B9BF9C900E909099009A900000000000000000099909090990000909999999999999999D9BFFFFFFFFFFFFBFFFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9B99999999999999999999999999999999999D9DBDD9FFD9F9DFDFDFDFFFFF99DC9D0900B090000900000000000000000000000000909090000900909099909999999D999DFFFFFFFFBFFBDF9FFDFF9FBF9FFBFFFFFFFFFFFFFFFFFFFFFFFD9999D99999999999999909999999999099999D99D9D9BD9DBFDFF9FFDFFFF999C9A9FF9909090A0990090900000000000000000000000000000000090909909999999999999FFFFFFFBFFFBFFBBFBFFBFBF9FB9BDBDBF9FFBFFFFFFFFFFFFFFF99999999999D9999909999990990999999D99BDF9F9FDFDBDDDBDFFDFFF909F09FDFF990B00B09000990A000000000000000000000000000000009009990999909099999999FFFFFFDF9FBF9BDFFFBBDBDBFBDBF9BBDBFBDFDBBDBFFFFFFFFFFD99D999999999909999999999090909999999D99D9D9D9BDDBFDFDFFB909909DF9BDFF9D09000B0900B90900000000000000000000000000000000900909090999909999999DFFFFBBFFBDFFFBDBFDFBFBDBFBDBFDBDBDBBBFDBFF9BFBFFFFFFF9999999D99909999990990909090990999999D9F9F9FDDBDDFFFF090900090B9C9B9D909000909E9BC09000000000000000000000000000000000009099909909990990999FFFFB9DB9FFBF9FBFDBBDBDBDBDBF9BFBFBDFDBFF9FFF9FBDBFFFF999999999999999909990999999999999999DBD9D9D99FDBF999099000900B0DB0D0B09090D000900990000000000000000000000000000000000000090099099099909909FFF99FBFFFBF9FBF9FBDBFBFBFBDBBDF9F9FBBBF9FBF9BF9F9FFFF999999999999999099900990999999999D999D9F9DBDFDBD9900900090009099090BD99C09BDA90900B0000000000000000000000000000000000000000900909909999990BFFA9B9BDBDBFBDBFB9F9F9FDBDBDFBFBFFBDFDBFBDBFDBFBF9BFF990999999099999990999999999909999B9D9F9DBD9999990000090909090900909D909B000990000090900000000000000000000000000000000000000090090990990999DF999BDBBFBDBFBDBFFBFBF9BFBFB9F9F9FBFBF9F9F9BBDBDBF9DBF9990999999999099909999909099099D99999999900900009000090000900B90F0AD0909990CF909090000000000000000000000000000000000000000000900909999909FB09B0B9F9FBF9FBF9BDBDBFF9FFFFBFFBFDBDBFBFBFDBBF9F9BB9099999999990999990909099999999999999990900000000000000090F900900099D990D9000B9A0000900000000000000000000000000000000000000000000909909999F0090999FDBFBDBDBDBDFBFBF9FF9FBDF9FDBFBFDBDBDB9F9BF9F990909999990999090999999990999999999900000000000000000009099009099B90909900009090BC900000000000000000000000000000000000000000000000000909099F909B9B9BBDBBFBFBFBBDBDBFBFF9FFBFFBFBDBFFFBFBF9FB9B9A990990990999999990090999999990990900000000090909009000009AD090B000F0F909DB09090C9009090000000000000000000000000000000000000000000000099990DB090090BDBBDBDBDBDFBFBFFFDBFBF9F9FF9FF9FB9F9FB9BDBD99A9909909990909099990990999099990900000000000000000000009099A90099099CB90B00000B90B000000000000000000000000000000000000000000000000000000909000909B9BBDBFBFBFBBDFDBF9BF9F9FBFBDFBFFBDFBF9FFDB9BB99909099909999999090990999090000000000000000009000000000000090990AD0F9D09090909909009009000000000000000000000000000000000000000000000000900900909099BDBDBDFBDBDFBBF9FF9FBFBDF9FBFDBDFBF9FB9B9F99DB0909090990909909009099909000000000000000000000090900000909009A099B9FBD09A000009090090000000000000000000000000000000000000000000000000000000000090BDBBFBF9FBFFBFDBF9BBB9BDBBFBDBFFFBDBF9DBFB99A909000909099990909090909000000000000000000000000000000000090A909900CF0DBD9900900B009A090090000000000000000000000000000000000000000000000090000000090B9F9FBF9F9FB9BDBF9DBF9BDB9FBDB9FBF9FBBD9FB99B9B99090990909009000090000000000000000000000000000090090000900DADB999FB909E90A09090090000000000000000000000000000000000000000000000000000000000009099F9FBDBFBFBDBFB9BBB99BDBDBBDBFFFDFBF9FBF9DB090900009009090900090000000000000000000000000000090900000090090B90D00B9D09999909A90090009090000000000000000000000000000000000000000000000000000000009BBFBDBFBDBDBDB9F9D99FB9B9BDBBDB9BBBDB9F9BB999B00909009909000090000000000000000000000000000000000000090A90990F909DCB9090C90090B0009A0000000000000000000000000000000000000000000000000000000000090DBDBFBDBBDBB9F99BB9B999BDB9F9BFFFDFBDBBF9DB090900009000000090000000000000000000000000000000000000090009090A90F90B90909B9090B009000909009000000000000000000000000000000000000000000000000000000099BF9BFBDBF9F9BBD99B9BDB9B9B9F99B9BF9F99FBBDB090900000900090000000000000000000000000000000000000000009009A9909090DFBA9009A90909009000000000000000000000000000000000000000000000000000000000000900BF9FBDBF99B9BD9B9BDBDB9F9F9F9BF9FB9FBFB9F9B9909000000000000000000000000000000000000000000000000090000A909C0B0F9CB9D900B009C00A9000090B0000000000000000000000000000000000000000000000000000000009B9FBDBB9BBBDB9B9BDBDBDF9BF9F9F99B9F99B9FF9B00900000000000000000000000000000000000000000000000090009090909A9099090DF09009A9B90909090000900000000000000000000000000000000000000000000000000000000BDB9FBF9F9D9B9B9F9BDBDBBFDBF9F9FBDB9FF9F9BF9B9000000000000000000000000000000000000000000000000000000000009099BC9F9AD90090900990900A90090000000000000000000000000000000000000000000000000000000000BFBDB9B9BB99D9F9F9BFFDFBFDBFBF9F9DB9BF9F9BF9090000000000000000000000000000000000000000000000000000009090A9AD09AD99FB0909A9B00A00990B000900000000000000000000000000000000000000000000000000000009BDBBDBDB9DB9BB9FFFFDBFFFFFFDFFFBFBF9F9BB9F9B90000000000000000000000000000000000000000000000090000090000BD090BD9FE9F9C90B9A90999F000909000000000000000000000000000000000000000000000000000000009BDBBDB9B99B9FBDFFBDFBFFBDBFFBFF9FDF9F9BD9FBDB00000000000000000000000000000000000000000900000000000000090900B9DAF990FB90B09090F0B0D0B00090000000000000000000000000000000000000000000000000000000ADBDBB9B9DB9F9FF9FFBFFFFFFFFFFFFFFBFFFBDBB9B9F9000000000000000000000000000000000000000000000900000000090009900F9DFD9D0B90D00A90909B00090000000000000000000000000000000000000000000000000000000009B9BDBDB9B9FBF9FFFFFFFFFFFFFFFFFFFFFBDFBD9BDB9B0000000000000000000000000000000000000000009000000090090A9000BD9DF9FA99909DA9B9E909A909000900000000000000000000000000000000000000000000000000000009BFB9B999BDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDB9F900000000000000000000000000000000000000009000009090000AC900B000B0FDFD9C099A9B00990A909090000000000000000000000000000000000000000000009000000000009F9BDB09BBDBFBFFBFFFFFFFFFFFFFFFFFFFFFFBDBDBDB9000000000000000000000000000000000000009000090900C0000909909090999FFF909BB0900090090090B009000000000000000000000000000000000000000000B0F00000000000BF9BD9BD9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBDB9000000000000000000000000000000000000000090000F9F0090090A09CBDBC9DFDBD99BB99A90B0000A9C90090000000000000000000000000000000000000000009AF000000000B9BDB9B9BFDBDFBFDBFFFFFBFFFFFFFFFFFFFFFFFFFF9F9B0000000000000000000000000000000000000000009000F0900000990B0909909FF9E9B900A90B900090099000000000000000000000000000000000000000000000090F000000009F9B9B9FBDBFFBFFFFFFFFFFFFBFFBFBFFFFFBFFFFFDFBFD00000000900000000000000000000000000000000900909000B09000D09ADF0F9F9E9900BD9DB00900009A009000000000000000000000000000000000000000000AD0FB90000000F9BBDBDBDBFFFFFFBFFBFFBFF9FF9FFFFFFBFFDFBFFBF9FB9000000000000000000000000000000000000909009B000009090009A9ADB9F9C9E9909F0B0B0900B009009000000000000000000000000000000000000000000909A090CF000009BBD9B9FBFFFBFFBDFBDFBFDBFFBFFBF9FBDFFFBFFFFFFF9FF00000000000000000000000000000000000000A900009090000090BD9DBDE9F999BC9D9F9F9FAB009CA90A90000000000000000000000000000000000000000000090FB9BB000009BB9DB9FBFFFBFFBFFBFDBFF9FF9FFFFFFFBFFFFBFFFFFFBDF0000009B0000000000000000000000000000000090000090900090F09DBDFFCBC9BDAF9B09090B0A990900090000000000000000000000000000000000000009AF9A90FF000009F99FBFFFFDBFDFBFBDFFBFDBFFBFF9F9FBFFDBFFDFBF9F9FFB90000000000000000000000000000000900009090090900000090F9B0BDBD9F99DF999D0909BA9E990000900000000000000000000000000000000000000009E09009EF900009BB9FBDBDBFBFFFBDFDBF9FFBFDBDB9FBFFFDBFFDFBFFFFFFFBDF90000D000000000000000000000000000090000000000009090F9909D0FBFF9CB9CBDB99A90DA9A09BB0A9000000000000000000000000000000000000000B9B090FFF00000099F9BFBFFFFFFBFFBFFFFB9DB99B9F9DBDBFFFFBFFBDBFBF9FFBF0000B000000000000000000000000000009000909090900B090B0FCBDFDDBF9E99ABC9D00B999900909000000000000000000000000000000000000000000000A9FF9000000F9BFDBDBF9FBFDBDFBF9BDB99B9DB9B99BDBDBFFFFFFFFFFF9BDBF00090000000000000000000000000000009000000A009009A9099FF9FBD0F9909B99B09B090A099A0009000000000000000000000000000000000000000000000FB0000009B9F9BFBFFFFF9FFBFDBF9B9FDDFBDFDFFDBDBFDBDBDBDBDBFFFFFDA000000000000000000000000000000000000900909009909090F9FFD9E9FF990BDA9DB0B9090B00090000000000000000000000000000000000000000000009B90000000BDFBFF9FBDBF9FFBF9BD99FDFBFBDBDBBDBFFDFBFFFBFBFFFF9F9FB90000000000000000000000000000090090A9009C090B9A90BCB9DBFFFDFD00ADA9BB0990B0090A900090000000000000000000000000000000000000000000000000000DBB9F9BFDFBFBFFBDBDB9FFFBDBDFFBFFDBF99B9DBDBDBDBF9FFFFFFF909000000000000000000000000000000900090B9F99C9BC999CB990FBFFBD9FB0DAB009B9B09009B000000900000000000000000000000000000000000000900000000BDFBFF9FBDFFDBF9F9BDB99DBFFBFFDBFFFFF9F99B9FB9BDBFBFBFBFDF000000000000000000000000000000000900A90B00B909B0A9BDADBDF9FFFDF9BB90DBBFB9009B9A90000000000000000000000000000000000000000000000000000BDB9F9BFBFBF9BF9F9F999FB9FFBFFFBFFF9FFFFBD099909BFFFDFDFFBF00000000000000000000000000000090000BD0909990BD0B9C99DFDBDFF9FBD9A9B0B9FB9B0B00090000000000000000000000000000000000000000000000000000BDBFFFFFFDFFDBF9F9B999BF9FFBDFFB9FBFFFFBFF900099BFFDBFBFBDFF9000000000000000000000009000000009090B09A9CBD0B909B0F9FFDF9F090BBB0B0B9B0B9090B09A000000900000000000000000000000000000000000000000009BDBF9FBFBFBFB99B9900BDBF9F9B9B9999B99F9BB900009F9FBFFFFFFBFB0000000000000000000000000090000009E90BD0B90B990B0D99F9FFBFFD990BEB09099A9B9A9CB0900090000000000000000000000000000000000000009000000FBF9FFBDBDFDBDB9900090BFB9B9999D9B999999999999F9BBFDBFBDBFDFFD0000000000000000000000000000909090BD0A90F90DA90B090F909DBDB09BDB90A9A9B009DA99A9A900000000000000000000000000000000000000000000000BF9FFFBFFFBFBFB990000099999999BD9B9D9F9B9D9DBFB9BDBDBBDFFFFBFFBB000000000000000000000009000000009D0B9B09A9B09A99FD9EBFBCB0900BB0A909B0DB9A99A9B0000009000000000000000000000000000000000000F90000F9FFB9F9FBDBF99F9B9D999999999F9FBFDBF9F9FBDFBFDBDBDBFDBF9F9FFFD000000000000000000000090000090A9F9AF90C9A9090B9B0F9F9D0099D09B9A9BFA9A9B0F9F0900B000000000000000000000000000000000000000000000000BFBFFFFBDBBDBFB9BDBBDB9FDBFFFFBDB9B9FBFFDFBFDFBF9B9B9B9FBBFFFBFD00000000000000000000000009000900FD0DB9B09B0B0BC9FFCBAB9A90B00B00A9B09A9BB909F9A9B09000900000000000000000000000000000000000B00009F9F9FBDBBD9B99FBDBDBFDFBFDBF9B9B09999B9FBFFBFBDBF9BDB9F9FDBBDFFB0000000000000000000000000A9000909BD909DBCBD9F9B00F9D90090B9F09ABDB090990009AB09000009000000000000000000000000000000000000090000BFBFFBDBDBBF9FB9B9B9F9FBFFBF9F0999F9BD9F9F9FFFDBDB99B9F9F9BDFBFF9A0000000000000000000000090000009F09090F0BDAF9F099FF9E9F9EDE90ABDAC900000090B909A909A0000000000000000000000000000000000000000009F9FDBDBFB9F99B9DBDBFBFBFDBDB9B9BDB99F9B9BFFF9FBDB99F9F9F9BFF9FFFBD00000000000000000009009000909B90999CBD9F9B9B00B09DBDF9A9B99B09A9B9A09A000900B00A0009090000000000000000000000000000000000F0000ABFBFBB9F9F9FBDB9B9F99FDBFBF9B999B9FF9F9F999BF9FB9B9BDBFBFDF9FBFFF9000000000000000000009000900000C9E9A90F9F0909090DABC9FDFF9A9000000F9A090000000B090900A000000000000000000000000000000000009B9B9D9FBDFDB9B9F9FBDB99BFFBF9F9B99999F9FFFFF9F9F9FF9F99F9FDBDBFBF9F9FF9000000000000000000000000090009090909900FD00A9A9FDDBDBFDFDFF0000099A9A00090000000A009900000000000000000000000000000000009F9F9FBFBDBB9BDBF9F9FBF9B99BDBFBF9F9FBFFFFFFFFFFFFFDBB99B9FFBFFFDFFFFFFFF00000000000000000000009000009A90909A09F90B09C9F9FBFF9CBFFFD000999AB00000000009009090009000000000000000000000000000000F0FFBFFBDF9FBDBF9F9FFBDF9F99BDBF9F9F9FFDFFFFFFFFFFFFFFBDB9DFDBFDFFBF9FF9FBDA000000000000000000090000000000BDA9090909090B9BCBD9999F9FFF000000090000900000000000090000000000000000000000000000000099FBDFBDBBFBDBF9BFBF9FFBF9F9999FB9FFFFBFFFFFFFFFFFFFFF999BFBFFFFBDFFFFFFFFF900000000000000000000000900909909C90000B009BD0D9FB09A9DFFDF00009000000900000A0009A09A90090000000000000000000000000000B9FFBFFBDBDBF9FFDBDFFBDFFFFFB9B9DB9FFFFFFFFFFFFFFFFFFFB9F9FFFFFFFFFFFFFFFFFF0000000000000000000009000000E99F9E9090DB0D0F999D0BC90BDBBF009000F009A00009A900000900000000000000000000000000000000009FF9FB9DBFBF9FBDBFFBDFFBDFF9FF99B9FFFBDFFFFFFFFFFFFFF999FFFFFFFFFFFFFFFFFBFB000000000000000000000000090090FCB909FA90DB990D09F09BD9ADDF00009A9E00090000000090900000000000000000000000000000000000FFBFB9FBF9FDBFFBFFFFFBFFFBFFF9F999FBDFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFDF90000000000000000009000900090BDBDE9EBD9DBC0099B9F90F9090BF00000909A090000A000000A0900900000000000000000000000000000BDBDBDB9BDBFBF9FFDBFDFF9FFFFFFFFBF99FBFFBFFFFFFFFFFFBF9FFFFFFFFFFFFFFFFFFFFFFB00000000000000000000900000C9090B9F9D909DF9B009D0BD0F9009909A900009909000900000090090000000000000000000000000000000FBFFFBDBDBDBDBFBFFFFBFFFFFFFFFFFFFBF9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF0000000000000000000000000B00B09090B0B90BDFDFF0990BDF0B9C900000B09000009A000000909000000900000000000000000000000009BDFB9FB9BBFBFFFDFFFFFFFFFFFFFFFFFFFFF9FBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB00000000000000000090900909900B0D909009CFFDF90B09090909B90000B00A09009A9A0000900A09090000000000000000000000000000BDFBDB9B9FDBDBDBFFBFFFFFFFFFFFFFFFFFDBFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF90000000000000000000009A9009909B09A9F9BB9BB9090909AB0F090000090900B000090090A909000A0000000000000000000000000000FBFFB9FDB9BFFFFFFFFFFBFFBFFFFFFFFFFBFFBDBFDFFFFFFFFFFFFFFFFFFBDFFFFFFFFFFFFFFFDBF00000000000000009000909A0B00B09DB90909C900A9CB9B090F9B0B000A000900B0B009A09C90090909090000000000000000000000009FF9F9BB99B9BFFBFBFDFFDFFFFFFFFFFFDFFF9FFFBFFFFFFFFFFFFFFFFBFFFFBFFFFFFFFFFFFFFBDB00000000000009000090A909909E9F0DCBDADBBF99CB90C09A9CBD900B0900009A0900B00909A90A000000000000000000000000000000FB9B9BDBB90FFDBFFFFBFBFFFFFFBFDBFFBFFBFFBDFFBFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFF9BD0000000000000000000090F0A9F9909B9FD9F0D90FFDADB9A9FB90B0B0B00B09A09A0B0A9CA90090090B09000000000000000000000009FBDB9F9F90F9FBFDF9FFFFFBFFFFDFBFF9FFBDF9FFF9FFFFFFFFFFFFBF9FBDFFBFBFFFFFFFFFFFF99B0000000000000000900B0909DB9A90B0DFBFFDBDDF9A9B90DFF9CF00009B009090A9A090B0909A0000000000000000000000000000000FF9B90BB099BFFFFBFFBF9FFFDBFBBFFDBFB9FBFF9FBFFFFFFFFFBFDBDBF9FB99F9FBFFFFFFFFFFFB0F900000000000000000900B0A9009C909B0D9DBDFBFDF90DB90FDB9BB0A0B90000B009A00AB090900B09090000000000000000000000009B9B9909B009FBFFFBFFFFBDFFFFDFB9BDBDBDB9BFDFBDFFFFFFFFFBFB9B999B99BDF9FFBFFFFFFFD9B0000000000000000900990990BDB9A9C9B90DFFFDBDB090D99DB0C90000B00909CBA90BFB90B009A00A00000000000000000000000000F9090909009B9FDBDFF9FBFFBF9BB99B9A9B9B9F9BBFDBFFFFFFFDBD9BD9B9BDB9F9BFBFDFFFFFFFB9F9000000000000090009A090AD0B0D90B000BFF9DBDF9D09FD9A9D9A0A9B0BF0BABADBA9A90A9A9A90909000000000000000000000000BB0900090909FFFBFFBFFBFDBF9BD99F999999909BDF9BFFFFFFFBBFBB99B9BD9BDBBFFDFFFFFFFFF90B000000000000000009009DAD9B0909090B9D99DA9DB09BDF9099A900000B09B0F9FBCBB9A90B9A9A0A9A900000000000000000000000990909000000B9FFBFF9FDFBDBF9B9B9A9F9B099B9B9FFDFFFFFFDF999B90990B9A9D9BBFBFFFBFFF9F9B0000000000000090090B09B00B09A9090099CBDFF090D9FF9009A900A9AB0B0BB0FB9A9A00B00B90900A000000000000000000000000990D0909009DB9FDFBFBFBFB9B09B999B9999B9090B9BBBFFFFFBFF0909FB090090B99999B9FFFFF0B900000000000009000BC909E9F90F090B0FA9DBDBDBD090D9DAD0DDFA09A90B0B90BFFA9A9B000B00B00B9000000000000000000000009A9BB9A90000BFFBFB9F9B9999099090909ADB909B99F9FDFFFFFDB9B90BD09000009000DB9F9FFFF9909000000000000000009A90909EB90B09C9909D9EFDB0099FF99BBF909BA9B0B00AFFF900F0A0000B090000000000000000000000000909F9F9090009F9BDF9F9B990000000000009F0009099BDBBFBFFFB909090B00009000009A9DBFFFFF000000000000000000999090F009B9CBC9FBF09F9BD900090FF9CA090B0A0900A9AB0BBFEBBFF0B00B0BA9A9000000000000000000000090B9B09000009BFFBFBFBDBDB000000000000B990090B9BDFFFFBDBDB90900000000000DB9BFFFFFFB00000000000000009000A9A90B9009B9FBC9DBD0D0BDB90B9ADB999E99B000B00A9A90DFFCBFFFCFA9ADBCDA0000000000000000000000909B990900000DBDBDBF9BFB9F900000000000009009CB9B9FBFFFFBD09090900000A9B90999FBFFFF90000000000009000B99C909D0B90D0909FBC99999D90090DFFDBC99A9000A00A9A9ABBB9BFFFFBB0FFFFBB090000000000000000000000990000000000BBF9BFDFF9F9B9090900000009000999B9FBFDF9FBDBB9009909A9B9900B9FBDFFFFD000000000000000090009A9E99C0D0B09A90BD9DAD09D9FFFFDFDBDA900B090BB9A9B9009A9BBBBDFFFF0FD000000000000000000000009000900000009BD9ABDBB9B9B909B00090090000A9B0B9F9F9FBFBDB990B000099000099DBF9FBFFFB0000000000009009009B09090F9DB900090BD90B909FFFFDBFBFBC9D0900FBA9E0F000BA000909BABB9FBFA000C000000000000000000090900000000009BBD9B9090909B909B90900900990999B9FBFBDBDBBDB999990009099A9B90FBDFFF90000000000000000A900909090F909909AD9099D90FFDF9A9009DBDB09A9A9E9BBA9A00B00A0009900A90B909A9A9000000000000000000BA9000000000099B9900000000090909090099099B0DB999F9BFBDB9FBC9A99000900909B990B9FFF900000000000000900B09A9F090F9009C9FFFF09CBDFBDF9FFF0909D900FBFBFADBAC9AD0B00B0A00000000000000000000000000000000990000000009B9B000090090009000000009009A909B9FBF9F9BDB9F99B990090000909090BFDFFB900000000000000B009C90D909BD90F9FDFDF9099DF9FDF9FDBD0F909090BB09A9B0B9AB0B0000000A0090900000900000000000000000000000000000009000099B000090000000000009090DBDB9F9BDBDBDBBDA90909000900009ADFDBFF9F0000000000000900909B0B09F0FFFDFFBBBFD90FF9FBF9BDBC9F9CB099BCBB000A90A9000000000009A00A00090A09000000000000000000000000000000900B0B0F90000000000000000909A9B9F9F9B9B9BD9BD99A90A90A009D099BFF9FB900000000090000900A90D0B009099A999C0DBE9D9FC99C90990F9F9F09BB000000000B00B0000009009A0900009000000000000000000000000000000000000999909B0000000009009A90B99BDB9B9F9F9B9B9BBFBDBD9F99FDA9FBE9BDBDB0900000000000000B009A909B09909DBCB990D90FD9B00BDB0BD9E9F9F90BB000000000000000000A0000F0CB0000B00000000000000000000000000000000090B0B9B0900909909D09BDB909F99BDBDB9B909DAD990BDBF9FF9BDB9099FB0B900000000000000B0090090B099A0F909909A99099BD09D909090BDBD090000000000000000000000000FFFFF0A009000000000000000000000000000000000009099099000090009A9B09909B9B0F9B9B9DA99B99BFBF9F9FB9BDB90B9F099900000000000000900D09B09C9AC9990B9C90D0000BD0BC9E9AD09990090900000000B00000000000009AFFFFFFDA000000000000000000000000000000000000009A9B0B9000009A999090B90909B9BDBDA99900909999B9F90909909909B900900000000000000090A000B9E9BE9E900B0B09B0909D99F9FDBD000B9AD0000000000A000000000000ADFFFFFFFDF0000000000000000000000000000000000000090990900000090B99B9000090090B9B9BB9000B00B9F9BFB9000B09090B9B0000000000000009A99090099099F9E99090909909F90D9F9ADBD900DBD9000000BA9000000000000A9FFFFFFFFFB000000000000000000000000000000000000099090000009000909A909900009099A9D9009909909D0BD99000B99A90B090000000000000090000090DB0F0BD9F9E0A9DA9A0DBDA9909C9FF9A9DBC9B00000B0000000000000B09ABBBFFDEBF0000000000000000000000000000000000000000000000090090009909B00009009F99A90900CB090B9F9B09009909090900900000000000000909B00B0909D0A9FDBD0BC909B009D09DBFDBD09A9990000000B0000000000000A000900BFBD900090000000000000000000000000000000000000000000090099000909F90000909B990090B99B009B99090B090B900009000000000000000B00909099A9909900BDA9F9F0B09B9B90BDFF90B09A90900000A0B00000000000B000000000BA00000F000000000000000000000000000000000000000000909009900B909900090B0DA909009A9C900FB900909A9009090000000000000000009A0B0B090DA90990FFDB0F9BDBC900D90FF9F9DA9DAD9000000000000000000B00000AC09A09009FF000D00000000000000000000000000000000000000B090B9000990B9B0090099B9900099DBB9099900B09090900000090000000000000000909090B0990DA0BFFB0FF09ADBDBDF0990FDFFFDA99000000000A00090000000000BCB0A09009EB09A9A0000000000000000000000000000000000000909099000B0909900000909090009A9A99090B09099B090000009000000000000000090900B0F099A9099FFFFDF99DF9FDFDBD90F9E9FFFF90B0000A0009A00A00000000000B0909A000BDB0000000000000000000000000000000000000000009000000909A9000000009A9000099999090F9009B09000000000000000000000000000A90999CBEDA99E9FF9A9F0BDF9F0BD0B09D90F9FFD9000009A0000B00B00000000009A000090000F09E90000000000000000000000000000000000090009090900909909000009090B00000000BC90B9009B9900000000000000000000000009000E0B99FBDADFEBD099090B90D9DB990B0B0BCBFBCB000000000000B000000000B00000000009B09E900B000000000000000000000000000000000009000000090B000B00009000990009099B9B999009B00000090000000000000000090000090990FCBDAF9B9FA9FA0B09099FF9F99C9909B9C9BD00000B00000B00000000A0000000000000ADA0B000000000000000000000000000000000000000009090909909900009009090900009A9090000009909009000000000000000000009009A000BDBDBF90FFFDFF999009FDF0B90A99A0F0DB9CB0000B0000A00000000A00B0000000000009A9BCBD00000000000000000000000000000000000009000000900000900009000000000009090B09000000000009000000000000000000000009B90FFB090B09FBFFF0A9B099DBDA990BD99F9C9B000000A9000000000000B0000000000A0009AC9BCBE90000000000000000000000000000000000000090000B900000000090000090090000090090000090900000000000000000000000900000B9FDE909FF9DFFFFD00FC9FDBDA99EBE9FFBCF900B0090A0900000000000000000000900009B0FBDB0000000000000000000000000000000000000000090900009000000000000000009090009000000000000090000000000000000090090900FFB90BEFFFFFFDFA9FBDBDBC9F9A9D9FFBCBDA0000A0A9A00000000000000000000B0090000090B000000000000000000000000000000000000000090000909000090A90000909B0000009000000000000090000090000000000900900A00009BFF90B99FFFFFBFDFFDF9D99F909DB0B99F9FD0000000090000000000000000A0A00000000000000000000000000000000000000000000000000000000900009090090D09900A9099009000900000000000000000A900000000000A00090909A09FCB0FA9FF9F9BFDFB9D0D90D9E9FD9FA9CBB00A9A90A0000000000000000090900B09000A00000000000000000000000000000000000000000000000090000B090090B09F9009AC990B090009000000000000000000000000900909000090900BFDFDFFFFFF099F0DB990FDFDBF9F009B090000000A9A00000000000000000A0A900A0B009000000000000000000000000000000000000000000000090000000009A999A90990990B09000900000000000000009000090000000000A900A00009FFFFFFFFDBF0FBDBC9DBDB9AD9FA9B0DBCB0000B0009000000A000000000A9090A90900900B0A900000000000000000000000000000000000000000000009909009900999A009A909009000000000000000000000000000000090090099C9000FFFBFFFFBF09ADF09DB999ADB0B9D09A9A900000B000000000000A9A0000000000000B0A00090C9000000000000000000000000000000000000000000000009090009B0B0D90090090900B00000000000000900000000000000000009A0B00000BFDBFFBCD99DBDFD909E90BCBDBA90909000A0000000000000000B0B000000A090A0090900A9A0A9000000000000000000000000000000000000000000000000990099090B009900A0909090000000000000000000000090090009009C0F9009F0FCB9FB90A99FFBDB09BD999CDB0900F00000B000A00000A09A9A9000000A00009000000B00909000000000000000000000000000000000000000000000000900B0000B09090A9090000000000000000000000000000000000900090B90B000A9BB9ED09BD9E9FD9DBD09E9CB90F09B09000B00A090000009A9A00000000090A0000000000900000000000000000000000000000000000000000000000000000900909909000909000090000000000000000000000000909000009A900AD000D9000B90F0BF9DFF90909F9FF90B90FCBF0000B09A0000000A00000000000000900090A0900000000000000000000000000000000000000000000000000000090090000090B0900000900000000000000000000000000000A000B00009090B00BEFF99099D00FBDFF9A909FDBB09A99BFD000000A9A0000000B0000A000000A00A90A090000000000000000000000000000000000000000000000000000000000009009A900009000000000000000000000000000000000009000090BCB009009FFFE9F0AFBD0FBD9C90F09FD0BC9EB09F00A000900000000000A09090000090090000000090B00000000000000000000000000000000000000000000000000000000900009000090000000000000000000000000000900900090900C9009A09FFFFFF0BDFFFB9DB09DF9909ABDBF90FF9000000A0000000B0BA900A000000000000909090A0000000000000000000000000000900000000000000000000000000000000900000000000000000000000000009000000000009A000A090B0090CFFFFFFF9BFFB09A09DBBD0F9FDFFF0FFDB000000000A9A0000000B9000000000B0B000A9A900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090909A90DA09BFFFFFFB0A9FFFF990B00BDF0BFBDBF9BFD0000000B00000B0B09A0A00A0000A00009A90000090000000000000000000900090000000000000000000000000000000000000000000000000000000000000000000900000000900090000FB0D0CFFFFFFF99C909FBA909BDDFB90DDF09F09F0000A9A00000A000A009000009A90000A0000B0F00009000000000000000B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000A90BD00FBFFFFFFFF9AFB09BF9B0FBCBFB90FBE9BFADF9000009A9A00B900B000000000A000009090A90C9000000000000000000900009000000000000000000000000000000000000000000000000000000000000000000000000000000009090C90BDBDFFFFFFFFFDF90BE9F9FB9B9B09A9F9FDEDBD9000A9A0009A0AB00000A00000090B000A0900BFAF0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0B09EFF9FFFFFFFFFFB099FFFFFC9009ADA990B9B0B900000000000900000A090A9000A000A09A0B0FDFBC0000000000000000000900A00000000000000000000000000000000000009000000000000000000000000000000000000000009A9090E9B09FFFFFFFFFFFF909FDFF99F9B0999009009D000009A9A9A00000000900000000900009A900A9EBD9A90000000000000000900009000000000000000000000000000000000000000000000000000000000000000000000000000900000F0B900BE9ADFFFFFFFFFFF09B9A9E9009E000D0DB0A99090A000A000A00000A0A000A000A00A0F00B9F9F0A000000000000000090000900000900000000090000000000000000000900000000000000000000000000000000000000000009C9B009000099FFFFFFFFFFFFFF09A9D9BD9F9B0B0B90D99A0A00BB09000090A09000A9090B009090B0B000A09090000000000000000A0000000000000000000000000000000000000000000A9000000000000000000000000000000000000000B0090009000A9BFFFFFFFFFFFFF0D9AD0F90F090D0909F0900000BA00000A090A0090A0A00B0A000000B099A09A9000000000000000090000000000000090000000000000000000000000000C0900000000000000000000000000000000000009F00900000090CFFFFFFFFFFFFBB0BDB90F90BDABB09F0F00000B09A000090A090B0A900B000000000900A099A000000000000000090000000000000000000000000000000000000000000090B000000000000000000000000000000000A00090090A009000009BFFFFFFFFFF90990BD9F90B909D0BC9F990009A9A90000A009AA09000B00B090000A0009BEA090000000000000000000B0000000000000000000000000000000000000000A0000000000000000000000000000000000090000B90090900090B00B9B9F9BF990A00AD0D00B0D0B0B0BB09A000A000000A900A090B009A09A000A0B009A9A099000000900900000000000000000000000000B00000000000000000000000900000000000000000000000000000000000000900900F000009000090009A9A90A00000999A900B0B0B099CB90900900000000009A00000A9A09BA0900B90009A0A000000000000000000000009000A0000000000900B0000000000000000000009000000000000000000000000000000000000000909900000B09000000009A9000000A09009B0B909A0B90900A00A00A000A0BA90000A9A90A0900A90A0B0A090900909000000000009000900A0900000000000A0000000000000000000000000000000000000000000000000000000000009009A90A00000090B0000000000000000090B9A0BDA90F9EB00B0000000000009A9A00900000B0B0A009A909AD0000000000900000000000000009000C00900000090000000000000000000000000000000000000000000000000000000009A90A900009000099E900000000A0000000900BD00B9BBDBDB9B0B9A0A900000000A9B00A0009A9ADA90B0A9E9A9A09000B0000A900000000000000000009000000000000900000000000000000000000000000000000000000000000000000000009009F09C009A09A000000009A0A0000A0090900A9FBF00B99CB0900A0A000A09AF0B9A90A000B0A9E9B0B0B09A0B00000B0000000000000000000000A00009000000000000000000000000000000000000000000000000000000000000009009090009A909090990000000000900A000909B0909A9B99ACB0900A0B0009A09AB0BB0B00A9A9AB09EB0A9AF0F09000909000009000000000090000090000000000000000000000000000000000000000000000000000000000000000090090A9ACADA9090B0009A0000000000A0A900F90AD090009A90B99090B009A9A9A0BBA9BB0B00B9A9AB9BA90909A9B0A0090A000009000000000000000000000900000000000000000000000000000000000000000000000000000000000000A0B009090909000D090F00900000000009000F0099090A09000B09A90BB09A9A9A9BF09A9A90BA9A9A9BE9BB0BBA9A0909A00009A90A0000000000000000000000000000000000000000000000000000000000000009000000000000000000A909090F0F09A9009A9090B9A900000000A0B0B09B009F000A0009A9C9A99BA9A09AB0BBE9A9A009A9A9A9BA9AF0F0F9A000000900000090000090000000000000000000000000000000000000000000000A000000000A00000000000000000900900C0909F9C9A009CB0B09000000000000000AC09A00F99000009A90DAB09AB0AF9FB0BB9A9A9AA9B0FA99BF9BB9A090A90900A90090000090000090000000000000000000000000000000C0B0000000F000000AD0000000000000000000000000B0B0B090B0D09A90090000000000009A00099B00999A000000F9E9A99BAB90B9BA9BB0A9A9AB9BEBB9BAB0BB00A9000000A090000000900A0000009000000000000000009FD000000009000000009A00C0F0000090000000D0090F00009009E9C90D090BDB0B009090B0000000000A0000B0A0A90DA000009B00B9BDA9F0BFAFB9A0B09A9AB9A9B9BA9B9B009A90A09090900009A909A90090000000900000009000000000A9A90A0000A90000A00C909A00000A000000A009A0009090A9009A9A9A9AD09CB0DA90A090A00000000000B0090900A90DB00000BB0A9A9ABB0B9BA9BA9A0FB9EB9ABA9B0B09ADADA90000A009A90000A000900A9009A0000000000000000009000000900900C000DEF00AC90C900000000009009F0B00A900B00909A9C9A90BDB09A990A909A00000009A0B9A0A90900090B0000DB9E909A9BFBA9B0900BB0BB9A9B9A9A9A09A9A9A009A90A0000009009A0A900000090B090000000000000000000000C0ADBDEFFFFFDFFEFF0E90C09CA900A900909A9C090090B090B90DB9009AD00B00000900000A00BCA09D000999E90000BA9A99BA9ABB09A0A00BBCBB9ABB9A9A000BA9A0B009000000000A0009A00909A0B00000000000009000000000900000B0D0A0B0F9B9BF99B9A90F90CB9C0090E9ADAD0B9A09A000DA9E9B0009090A9090009A0009000B0B09B0A009A09A000009090A09A909A00090B0BBB0B09AB0B09A9000090A00A0000090009A000900A090090A0900000000000000000009A0900E90C9C9AD0A000A009A90A0B00B9EA090909A90090099A9A990009D00A0900A00B0009A00A9A00A9A090A9C9B00900000A0B9BB9A9A90000A9B0BFBBB090A0B09A9A9A0900000000A0A90000A00A900A90A090A09A9000000A00090000090A0900B0BACB0BC9A90000009090B0009CB0F0B09A9AC9A00909E99A90B0090A90900099009A09A9A90A9A0090BC9B0090B00900A90A9A00A00A90A9B0B000A090A0A000000A0B0900B000000000900000B0009000900000090090000000000C909E9F0909B0BCB000000000A0A00F0B0B090B0DA9090B09A0B090A909990009000A90A00900B0A09AF0A9A90B09A000A000A0A90AB9B0B000000A9A0B09A0000A90000000B0B00A000000000A90A0000000000A09A0A9A00000009090AD0F9A9EB09A0F0B0A9A90B000000A9090B0B0009ABC9A9CA9A09AD9099AD9A0D009000A090009B0B0B0B0BA9A9A90A09900B0090A9090A90A0B0090000000B0A00900B00B000000000A90B00A90B00000000000000B09A0090090A00F00A0A900B00909C9A9B0F9A9CB0000A00000CA0A9009A9AD0B9DAB9A9A090ADA090AD9A9000A0090A9B00900B0B9E9A9ADA90900B0090A90A00A909BA900A0A09A0B0B0B0A0B0B0000009A0B0A000090000000000000A00000A090A0B0A9000009090A909BAF0A90BCA9A0DA90B0000900B0B0B0AB0A9A0B90BA90FAD0B0B99990B9AD9D09090BA9009B09B0F9AB9A90A9AAD0BD0B0000A90B00A9A900A00090A09000B0B0B0B0B0A90B0000090B0A00A00000000000000A0909A909009E9E9A9A0B09B0A0D0BDAF0B9E9BB0AB0B090A0000A90BC9A9ADB0A909EFBDABCB00A0CB00909A9090B090B9E90BCBBAB9A90A9A9B0B09B0B0B09A00009AB0A0009A0A900A0BCB0B9A9A009AA0A09A9AA0090090A0A00A009A90A90A0A00A009A9A90000B0AB0A99BAFAFDAF0B0B0B90009AA909AB9AB0BA9E9B0F9F0BFBDEBDBB0BDB99A90B099E90909E9A9B9E9B0BDAB0A9ADB0B09A0B0000A0000B090900B0A090A9009EBDB0A9A9A9A0909A00A90B0A00A00909000A00A90A9009A90B0A9A90A9A9CBF0B9A0009FFFFDB0BCB0ADABA90AA000A9CB09A9B0BB0BFBDFF9FAFCB0B0F0B000F9A999A9A9AB0B0BA0B9A90BCB0BA9E9A9F0A00000B000A9A0B0009AA90A0A0BEFFB9A9A9A9A0B00B00A9A9A9A0B0A0A0000B00A90A9000000B0B0A9000A909B009A0B0FFFFFEF0B0B0B09AB909B0B0AB0B0B0A90A90B0FBFFFFFBFB09990B909A9AABC9BDB9F9F9BB0BBA9AB0B0BB0BDA9B09A09000009A0B0B0B009A0090B9FF9EBF9A90A9A00B00B00B0BE9B0B0B09A9000B0A900000B0B0B0B00A909ABA09A0090BFFFFFFFF0B0A0BE90EBA0B0B90A9A0B9AB9AB0BBCFBDFFFF0F0B0F9EB0DB999BA9ABA9ABA90B90A9B0B0B00B0A9A9A000A00A09A9A9A0B0A9A00B0A9EFFEFF0A9AA90B0B00B0AB0B90BCB0A09A00A0B009A00A0B0B0B0B09A90A0B009A00B0BFFFFFFFFF0B099A9ABB90B9A00A9A0B90A9CADFADFFEFFFFFFFF0BBFB9DBBFBEBDB9A9B9A9BBA0A90A9A9A9A9A90BE090B00909ADB9A9A0A9A9A9A9BBFBFFFFFF009AB0B0FA0B00F0AB0B0A90A0B0900ABA9A99A0BCB0B0A000A9B0B0A90B0A9EFFFFFFFFF0B0A9A9A9EB0A9B09A090AB9BBFFFFFFFFFFFFFFFF909B9A9BFB9B9AFA9A9A9A9009000B0B0000000A90B0A0B0A0A9B0000909A0B0B0F0FCFFFFFFFBA90B0E90B00A9A90BCABCA9A90AA9009A9A0A9A9B0B0F9B0B0A0B0B0B0A9BB9FFFFFFFFFACB0A9ADA90B0A9AA9AA900BCBFFFFFFFDFFFFFFFFB009A909B9EBB9B9ADAB0BAB00000000B0090009A90B00009A9ABBB0B0A00B0FFFBFBFFFFFFFFEDBA9A9A000F9A9AC0A90A9A9EB90ABBE9A9B0A9ACBCB0A0F0B9BD0A9A9B0BCBFFFFFFFFFF9A09ADA9AB0B0A09A90A0BFBFFFFFFFFFBFFFFFFF000A9CB0BFB9EB0F9A90B09000000000000A000000A00B0BA9A9A90A0009ADFFFBCFFFFFFFFFFFB0000000E9A0AC0A900E90A9A90AF909A9A0A900B0B0B09A0BCB0B9B0BADBF9FFFFFFFFFFE9FA9A90E09A9E9AADA9FFFFFFFFFFFBFDFFFFFFF00090B0BDA9A99B00B0BA9A900000000000909000090B0BCBDA909FFBB0ADAFFFFFDFEFFFFFFFF00F00000000B0B00A0000B0A90A90AFABC09000E0E0F0E00F0B0B0A0B09AF9EFFFFFFFFFF9A00E0A090ACBFFF9AFFFFFFFFFFFFFDFEFFFFFFF0000B090B9B9A00A90B0900000000000000000000000BCBF0B0000FFCFB0BFFFFFBEBDFFFFFFFFF00A00A00A0C00C00CA900D0A9CA90090B0A000009A9A9E00BCBC90BCBB9EF9BFFFFFFFFFFDA909C0AC9ACFFFFFFFFFFFFFFFFFBFF9FFFFFFFB000000000009A90000000000000000000000000000A0B0FF00000FFFB0FFFFFFFDFFFFFFFFFFFE0000000000A00A00A0CA00AC0A0CA0E00000000E0F0F00F0CB09A9E900CBDEDFFFFFFFFF0A0E0A0A00A0FFFFFFFFFFFFFFFFFFDE9FFFFFFFF0000000000000000000000000000000000000000000090DADB0000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000B0F00E00A90B0000A9BFFFBFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFBFFFFFFFFF0000000000000000000000000000000000000000000000BFF00000000000000000000000000105000000000000AEAD05FE','Anne has a BA degree in English from St. Lawrence College. She is fluent in French and German.',5,'http://accweb/emmployees/davolio.bmp'); +; +INSERT INTO "Order Details" VALUES(10248,11,14,12,0); +INSERT INTO "Order Details" VALUES(10248,42,9.8,10,0); +INSERT INTO "Order Details" VALUES(10248,72,34.8,5,0); +INSERT INTO "Order Details" VALUES(10249,14,18.6,9,0); +INSERT INTO "Order Details" VALUES(10249,51,42.4,40,0); +INSERT INTO "Order Details" VALUES(10250,41,7.7,10,0); +INSERT INTO "Order Details" VALUES(10250,51,42.4,35,0.15); +INSERT INTO "Order Details" VALUES(10250,65,16.8,15,0.15); +INSERT INTO "Order Details" VALUES(10251,22,16.8,6,0.05); +INSERT INTO "Order Details" VALUES(10251,57,15.6,15,0.05); + +INSERT INTO "Order Details" VALUES(10251,65,16.8,20,0); +INSERT INTO "Order Details" VALUES(10252,20,64.8,40,0.05); +INSERT INTO "Order Details" VALUES(10252,33,2,25,0.05); +INSERT INTO "Order Details" VALUES(10252,60,27.2,40,0); +INSERT INTO "Order Details" VALUES(10253,31,10,20,0); +INSERT INTO "Order Details" VALUES(10253,39,14.4,42,0); +INSERT INTO "Order Details" VALUES(10253,49,16,40,0); +INSERT INTO "Order Details" VALUES(10254,24,3.6,15,0.15); +INSERT INTO "Order Details" VALUES(10254,55,19.2,21,0.15); +INSERT INTO "Order Details" VALUES(10254,74,8,21,0); + +INSERT INTO "Order Details" VALUES(10255,2,15.2,20,0); +INSERT INTO "Order Details" VALUES(10255,16,13.9,35,0); +INSERT INTO "Order Details" VALUES(10255,36,15.2,25,0); +INSERT INTO "Order Details" VALUES(10255,59,44,30,0); +INSERT INTO "Order Details" VALUES(10256,53,26.2,15,0); +INSERT INTO "Order Details" VALUES(10256,77,10.4,12,0); +INSERT INTO "Order Details" VALUES(10257,27,35.1,25,0); +INSERT INTO "Order Details" VALUES(10257,39,14.4,6,0); +INSERT INTO "Order Details" VALUES(10257,77,10.4,15,0); +INSERT INTO "Order Details" VALUES(10258,2,15.2,50,0.2); + +INSERT INTO "Order Details" VALUES(10258,5,17,65,0.2); +INSERT INTO "Order Details" VALUES(10258,32,25.6,6,0.2); +INSERT INTO "Order Details" VALUES(10259,21,8,10,0); +INSERT INTO "Order Details" VALUES(10259,37,20.8,1,0); +INSERT INTO "Order Details" VALUES(10260,41,7.7,16,0.25); +INSERT INTO "Order Details" VALUES(10260,57,15.6,50,0); +INSERT INTO "Order Details" VALUES(10260,62,39.4,15,0.25); +INSERT INTO "Order Details" VALUES(10260,70,12,21,0.25); +INSERT INTO "Order Details" VALUES(10261,21,8,20,0); +INSERT INTO "Order Details" VALUES(10261,35,14.4,20,0); + +INSERT INTO "Order Details" VALUES(10262,5,17,12,0.2); +INSERT INTO "Order Details" VALUES(10262,7,24,15,0); +INSERT INTO "Order Details" VALUES(10262,56,30.4,2,0); +INSERT INTO "Order Details" VALUES(10263,16,13.9,60,0.25); +INSERT INTO "Order Details" VALUES(10263,24,3.6,28,0); +INSERT INTO "Order Details" VALUES(10263,30,20.7,60,0.25); +INSERT INTO "Order Details" VALUES(10263,74,8,36,0.25); +INSERT INTO "Order Details" VALUES(10264,2,15.2,35,0); +INSERT INTO "Order Details" VALUES(10264,41,7.7,25,0.15); +INSERT INTO "Order Details" VALUES(10265,17,31.2,30,0); + +INSERT INTO "Order Details" VALUES(10265,70,12,20,0); +INSERT INTO "Order Details" VALUES(10266,12,30.4,12,0.05); +INSERT INTO "Order Details" VALUES(10267,40,14.7,50,0); +INSERT INTO "Order Details" VALUES(10267,59,44,70,0.15); +INSERT INTO "Order Details" VALUES(10267,76,14.4,15,0.15); +INSERT INTO "Order Details" VALUES(10268,29,99,10,0); +INSERT INTO "Order Details" VALUES(10268,72,27.8,4,0); +INSERT INTO "Order Details" VALUES(10269,33,2,60,0.05); +INSERT INTO "Order Details" VALUES(10269,72,27.8,20,0.05); +INSERT INTO "Order Details" VALUES(10270,36,15.2,30,0); + +INSERT INTO "Order Details" VALUES(10270,43,36.8,25,0); +INSERT INTO "Order Details" VALUES(10271,33,2,24,0); +INSERT INTO "Order Details" VALUES(10272,20,64.8,6,0); +INSERT INTO "Order Details" VALUES(10272,31,10,40,0); +INSERT INTO "Order Details" VALUES(10272,72,27.8,24,0); +INSERT INTO "Order Details" VALUES(10273,10,24.8,24,0.05); +INSERT INTO "Order Details" VALUES(10273,31,10,15,0.05); +INSERT INTO "Order Details" VALUES(10273,33,2,20,0); +INSERT INTO "Order Details" VALUES(10273,40,14.7,60,0.05); +INSERT INTO "Order Details" VALUES(10273,76,14.4,33,0.05); + +INSERT INTO "Order Details" VALUES(10274,71,17.2,20,0); +INSERT INTO "Order Details" VALUES(10274,72,27.8,7,0); +INSERT INTO "Order Details" VALUES(10275,24,3.6,12,0.05); +INSERT INTO "Order Details" VALUES(10275,59,44,6,0.05); +INSERT INTO "Order Details" VALUES(10276,10,24.8,15,0); +INSERT INTO "Order Details" VALUES(10276,13,4.8,10,0); +INSERT INTO "Order Details" VALUES(10277,28,36.4,20,0); +INSERT INTO "Order Details" VALUES(10277,62,39.4,12,0); +INSERT INTO "Order Details" VALUES(10278,44,15.5,16,0); +INSERT INTO "Order Details" VALUES(10278,59,44,15,0); + +INSERT INTO "Order Details" VALUES(10278,63,35.1,8,0); +INSERT INTO "Order Details" VALUES(10278,73,12,25,0); +INSERT INTO "Order Details" VALUES(10279,17,31.2,15,0.25); +INSERT INTO "Order Details" VALUES(10280,24,3.6,12,0); +INSERT INTO "Order Details" VALUES(10280,55,19.2,20,0); +INSERT INTO "Order Details" VALUES(10280,75,6.2,30,0); +INSERT INTO "Order Details" VALUES(10281,19,7.3,1,0); +INSERT INTO "Order Details" VALUES(10281,24,3.6,6,0); +INSERT INTO "Order Details" VALUES(10281,35,14.4,4,0); +INSERT INTO "Order Details" VALUES(10282,30,20.7,6,0); + +INSERT INTO "Order Details" VALUES(10282,57,15.6,2,0); +INSERT INTO "Order Details" VALUES(10283,15,12.4,20,0); +INSERT INTO "Order Details" VALUES(10283,19,7.3,18,0); +INSERT INTO "Order Details" VALUES(10283,60,27.2,35,0); +INSERT INTO "Order Details" VALUES(10283,72,27.8,3,0); +INSERT INTO "Order Details" VALUES(10284,27,35.1,15,0.25); +INSERT INTO "Order Details" VALUES(10284,44,15.5,21,0); +INSERT INTO "Order Details" VALUES(10284,60,27.2,20,0.25); +INSERT INTO "Order Details" VALUES(10284,67,11.2,5,0.25); +INSERT INTO "Order Details" VALUES(10285,1,14.4,45,0.2); + +INSERT INTO "Order Details" VALUES(10285,40,14.7,40,0.2); +INSERT INTO "Order Details" VALUES(10285,53,26.2,36,0.2); +INSERT INTO "Order Details" VALUES(10286,35,14.4,100,0); +INSERT INTO "Order Details" VALUES(10286,62,39.4,40,0); +INSERT INTO "Order Details" VALUES(10287,16,13.9,40,0.15); +INSERT INTO "Order Details" VALUES(10287,34,11.2,20,0); +INSERT INTO "Order Details" VALUES(10287,46,9.6,15,0.15); +INSERT INTO "Order Details" VALUES(10288,54,5.9,10,0.1); +INSERT INTO "Order Details" VALUES(10288,68,10,3,0.1); +INSERT INTO "Order Details" VALUES(10289,3,8,30,0); + +INSERT INTO "Order Details" VALUES(10289,64,26.6,9,0); +INSERT INTO "Order Details" VALUES(10290,5,17,20,0); +INSERT INTO "Order Details" VALUES(10290,29,99,15,0); +INSERT INTO "Order Details" VALUES(10290,49,16,15,0); +INSERT INTO "Order Details" VALUES(10290,77,10.4,10,0); +INSERT INTO "Order Details" VALUES(10291,13,4.8,20,0.1); +INSERT INTO "Order Details" VALUES(10291,44,15.5,24,0.1); +INSERT INTO "Order Details" VALUES(10291,51,42.4,2,0.1); +INSERT INTO "Order Details" VALUES(10292,20,64.8,20,0); +INSERT INTO "Order Details" VALUES(10293,18,50,12,0); + +INSERT INTO "Order Details" VALUES(10293,24,3.6,10,0); +INSERT INTO "Order Details" VALUES(10293,63,35.1,5,0); +INSERT INTO "Order Details" VALUES(10293,75,6.2,6,0); +INSERT INTO "Order Details" VALUES(10294,1,14.4,18,0); +INSERT INTO "Order Details" VALUES(10294,17,31.2,15,0); +INSERT INTO "Order Details" VALUES(10294,43,36.8,15,0); +INSERT INTO "Order Details" VALUES(10294,60,27.2,21,0); +INSERT INTO "Order Details" VALUES(10294,75,6.2,6,0); +INSERT INTO "Order Details" VALUES(10295,56,30.4,4,0); +INSERT INTO "Order Details" VALUES(10296,11,16.8,12,0); + +INSERT INTO "Order Details" VALUES(10296,16,13.9,30,0); +INSERT INTO "Order Details" VALUES(10296,69,28.8,15,0); +INSERT INTO "Order Details" VALUES(10297,39,14.4,60,0); +INSERT INTO "Order Details" VALUES(10297,72,27.8,20,0); +INSERT INTO "Order Details" VALUES(10298,2,15.2,40,0); +INSERT INTO "Order Details" VALUES(10298,36,15.2,40,0.25); +INSERT INTO "Order Details" VALUES(10298,59,44,30,0.25); +INSERT INTO "Order Details" VALUES(10298,62,39.4,15,0); +INSERT INTO "Order Details" VALUES(10299,19,7.3,15,0); +INSERT INTO "Order Details" VALUES(10299,70,12,20,0); + +INSERT INTO "Order Details" VALUES(10300,66,13.6,30,0); +INSERT INTO "Order Details" VALUES(10300,68,10,20,0); +INSERT INTO "Order Details" VALUES(10301,40,14.7,10,0); +INSERT INTO "Order Details" VALUES(10301,56,30.4,20,0); +INSERT INTO "Order Details" VALUES(10302,17,31.2,40,0); +INSERT INTO "Order Details" VALUES(10302,28,36.4,28,0); +INSERT INTO "Order Details" VALUES(10302,43,36.8,12,0); +INSERT INTO "Order Details" VALUES(10303,40,14.7,40,0.1); +INSERT INTO "Order Details" VALUES(10303,65,16.8,30,0.1); +INSERT INTO "Order Details" VALUES(10303,68,10,15,0.1); + +INSERT INTO "Order Details" VALUES(10304,49,16,30,0); +INSERT INTO "Order Details" VALUES(10304,59,44,10,0); +INSERT INTO "Order Details" VALUES(10304,71,17.2,2,0); +INSERT INTO "Order Details" VALUES(10305,18,50,25,0.1); +INSERT INTO "Order Details" VALUES(10305,29,99,25,0.1); +INSERT INTO "Order Details" VALUES(10305,39,14.4,30,0.1); +INSERT INTO "Order Details" VALUES(10306,30,20.7,10,0); +INSERT INTO "Order Details" VALUES(10306,53,26.2,10,0); +INSERT INTO "Order Details" VALUES(10306,54,5.9,5,0); +INSERT INTO "Order Details" VALUES(10307,62,39.4,10,0); + +INSERT INTO "Order Details" VALUES(10307,68,10,3,0); +INSERT INTO "Order Details" VALUES(10308,69,28.8,1,0); +INSERT INTO "Order Details" VALUES(10308,70,12,5,0); +INSERT INTO "Order Details" VALUES(10309,4,17.6,20,0); +INSERT INTO "Order Details" VALUES(10309,6,20,30,0); +INSERT INTO "Order Details" VALUES(10309,42,11.2,2,0); +INSERT INTO "Order Details" VALUES(10309,43,36.8,20,0); +INSERT INTO "Order Details" VALUES(10309,71,17.2,3,0); +INSERT INTO "Order Details" VALUES(10310,16,13.9,10,0); +INSERT INTO "Order Details" VALUES(10310,62,39.4,5,0); + +INSERT INTO "Order Details" VALUES(10311,42,11.2,6,0); +INSERT INTO "Order Details" VALUES(10311,69,28.8,7,0); +INSERT INTO "Order Details" VALUES(10312,28,36.4,4,0); +INSERT INTO "Order Details" VALUES(10312,43,36.8,24,0); +INSERT INTO "Order Details" VALUES(10312,53,26.2,20,0); +INSERT INTO "Order Details" VALUES(10312,75,6.2,10,0); +INSERT INTO "Order Details" VALUES(10313,36,15.2,12,0); +INSERT INTO "Order Details" VALUES(10314,32,25.6,40,0.1); +INSERT INTO "Order Details" VALUES(10314,58,10.6,30,0.1); +INSERT INTO "Order Details" VALUES(10314,62,39.4,25,0.1); + +INSERT INTO "Order Details" VALUES(10315,34,11.2,14,0); +INSERT INTO "Order Details" VALUES(10315,70,12,30,0); +INSERT INTO "Order Details" VALUES(10316,41,7.7,10,0); +INSERT INTO "Order Details" VALUES(10316,62,39.4,70,0); +INSERT INTO "Order Details" VALUES(10317,1,14.4,20,0); +INSERT INTO "Order Details" VALUES(10318,41,7.7,20,0); +INSERT INTO "Order Details" VALUES(10318,76,14.4,6,0); +INSERT INTO "Order Details" VALUES(10319,17,31.2,8,0); +INSERT INTO "Order Details" VALUES(10319,28,36.4,14,0); +INSERT INTO "Order Details" VALUES(10319,76,14.4,30,0); + +INSERT INTO "Order Details" VALUES(10320,71,17.2,30,0); +INSERT INTO "Order Details" VALUES(10321,35,14.4,10,0); +INSERT INTO "Order Details" VALUES(10322,52,5.6,20,0); +INSERT INTO "Order Details" VALUES(10323,15,12.4,5,0); +INSERT INTO "Order Details" VALUES(10323,25,11.2,4,0); +INSERT INTO "Order Details" VALUES(10323,39,14.4,4,0); +INSERT INTO "Order Details" VALUES(10324,16,13.9,21,0.15); +INSERT INTO "Order Details" VALUES(10324,35,14.4,70,0.15); +INSERT INTO "Order Details" VALUES(10324,46,9.6,30,0); +INSERT INTO "Order Details" VALUES(10324,59,44,40,0.15); + +INSERT INTO "Order Details" VALUES(10324,63,35.1,80,0.15); +INSERT INTO "Order Details" VALUES(10325,6,20,6,0); +INSERT INTO "Order Details" VALUES(10325,13,4.8,12,0); +INSERT INTO "Order Details" VALUES(10325,14,18.6,9,0); +INSERT INTO "Order Details" VALUES(10325,31,10,4,0); +INSERT INTO "Order Details" VALUES(10325,72,27.8,40,0); +INSERT INTO "Order Details" VALUES(10326,4,17.6,24,0); +INSERT INTO "Order Details" VALUES(10326,57,15.6,16,0); +INSERT INTO "Order Details" VALUES(10326,75,6.2,50,0); +INSERT INTO "Order Details" VALUES(10327,2,15.2,25,0.2); + +INSERT INTO "Order Details" VALUES(10327,11,16.8,50,0.2); +INSERT INTO "Order Details" VALUES(10327,30,20.7,35,0.2); +INSERT INTO "Order Details" VALUES(10327,58,10.6,30,0.2); +INSERT INTO "Order Details" VALUES(10328,59,44,9,0); +INSERT INTO "Order Details" VALUES(10328,65,16.8,40,0); +INSERT INTO "Order Details" VALUES(10328,68,10,10,0); +INSERT INTO "Order Details" VALUES(10329,19,7.3,10,0.05); +INSERT INTO "Order Details" VALUES(10329,30,20.7,8,0.05); +INSERT INTO "Order Details" VALUES(10329,38,210.8,20,0.05); +INSERT INTO "Order Details" VALUES(10329,56,30.4,12,0.05); + +INSERT INTO "Order Details" VALUES(10330,26,24.9,50,0.15); +INSERT INTO "Order Details" VALUES(10330,72,27.8,25,0.15); +INSERT INTO "Order Details" VALUES(10331,54,5.9,15,0); +INSERT INTO "Order Details" VALUES(10332,18,50,40,0.2); +INSERT INTO "Order Details" VALUES(10332,42,11.2,10,0.2); +INSERT INTO "Order Details" VALUES(10332,47,7.6,16,0.2); +INSERT INTO "Order Details" VALUES(10333,14,18.6,10,0); +INSERT INTO "Order Details" VALUES(10333,21,8,10,0.1); +INSERT INTO "Order Details" VALUES(10333,71,17.2,40,0.1); +INSERT INTO "Order Details" VALUES(10334,52,5.6,8,0); + +INSERT INTO "Order Details" VALUES(10334,68,10,10,0); +INSERT INTO "Order Details" VALUES(10335,2,15.2,7,0.2); +INSERT INTO "Order Details" VALUES(10335,31,10,25,0.2); +INSERT INTO "Order Details" VALUES(10335,32,25.6,6,0.2); +INSERT INTO "Order Details" VALUES(10335,51,42.4,48,0.2); +INSERT INTO "Order Details" VALUES(10336,4,17.6,18,0.1); +INSERT INTO "Order Details" VALUES(10337,23,7.2,40,0); +INSERT INTO "Order Details" VALUES(10337,26,24.9,24,0); +INSERT INTO "Order Details" VALUES(10337,36,15.2,20,0); +INSERT INTO "Order Details" VALUES(10337,37,20.8,28,0); + +INSERT INTO "Order Details" VALUES(10337,72,27.8,25,0); +INSERT INTO "Order Details" VALUES(10338,17,31.2,20,0); +INSERT INTO "Order Details" VALUES(10338,30,20.7,15,0); +INSERT INTO "Order Details" VALUES(10339,4,17.6,10,0); +INSERT INTO "Order Details" VALUES(10339,17,31.2,70,0.05); +INSERT INTO "Order Details" VALUES(10339,62,39.4,28,0); +INSERT INTO "Order Details" VALUES(10340,18,50,20,0.05); +INSERT INTO "Order Details" VALUES(10340,41,7.7,12,0.05); +INSERT INTO "Order Details" VALUES(10340,43,36.8,40,0.05); +INSERT INTO "Order Details" VALUES(10341,33,2,8,0); + +INSERT INTO "Order Details" VALUES(10341,59,44,9,0.15); +INSERT INTO "Order Details" VALUES(10342,2,15.2,24,0.2); +INSERT INTO "Order Details" VALUES(10342,31,10,56,0.2); +INSERT INTO "Order Details" VALUES(10342,36,15.2,40,0.2); +INSERT INTO "Order Details" VALUES(10342,55,19.2,40,0.2); +INSERT INTO "Order Details" VALUES(10343,64,26.6,50,0); +INSERT INTO "Order Details" VALUES(10343,68,10,4,0.05); +INSERT INTO "Order Details" VALUES(10343,76,14.4,15,0); +INSERT INTO "Order Details" VALUES(10344,4,17.6,35,0); +INSERT INTO "Order Details" VALUES(10344,8,32,70,0.25); + +INSERT INTO "Order Details" VALUES(10345,8,32,70,0); +INSERT INTO "Order Details" VALUES(10345,19,7.3,80,0); +INSERT INTO "Order Details" VALUES(10345,42,11.2,9,0); +INSERT INTO "Order Details" VALUES(10346,17,31.2,36,0.1); +INSERT INTO "Order Details" VALUES(10346,56,30.4,20,0); +INSERT INTO "Order Details" VALUES(10347,25,11.2,10,0); +INSERT INTO "Order Details" VALUES(10347,39,14.4,50,0.15); +INSERT INTO "Order Details" VALUES(10347,40,14.7,4,0); +INSERT INTO "Order Details" VALUES(10347,75,6.2,6,0.15); +INSERT INTO "Order Details" VALUES(10348,1,14.4,15,0.15); + +INSERT INTO "Order Details" VALUES(10348,23,7.2,25,0); +INSERT INTO "Order Details" VALUES(10349,54,5.9,24,0); +INSERT INTO "Order Details" VALUES(10350,50,13,15,0.1); +INSERT INTO "Order Details" VALUES(10350,69,28.8,18,0.1); +INSERT INTO "Order Details" VALUES(10351,38,210.8,20,0.05); +INSERT INTO "Order Details" VALUES(10351,41,7.7,13,0); +INSERT INTO "Order Details" VALUES(10351,44,15.5,77,0.05); +INSERT INTO "Order Details" VALUES(10351,65,16.8,10,0.05); +INSERT INTO "Order Details" VALUES(10352,24,3.6,10,0); +INSERT INTO "Order Details" VALUES(10352,54,5.9,20,0.15); + +INSERT INTO "Order Details" VALUES(10353,11,16.8,12,0.2); +INSERT INTO "Order Details" VALUES(10353,38,210.8,50,0.2); +INSERT INTO "Order Details" VALUES(10354,1,14.4,12,0); +INSERT INTO "Order Details" VALUES(10354,29,99,4,0); +INSERT INTO "Order Details" VALUES(10355,24,3.6,25,0); +INSERT INTO "Order Details" VALUES(10355,57,15.6,25,0); +INSERT INTO "Order Details" VALUES(10356,31,10,30,0); +INSERT INTO "Order Details" VALUES(10356,55,19.2,12,0); +INSERT INTO "Order Details" VALUES(10356,69,28.8,20,0); +INSERT INTO "Order Details" VALUES(10357,10,24.8,30,0.2); + +INSERT INTO "Order Details" VALUES(10357,26,24.9,16,0); +INSERT INTO "Order Details" VALUES(10357,60,27.2,8,0.2); +INSERT INTO "Order Details" VALUES(10358,24,3.6,10,0.05); +INSERT INTO "Order Details" VALUES(10358,34,11.2,10,0.05); +INSERT INTO "Order Details" VALUES(10358,36,15.2,20,0.05); +INSERT INTO "Order Details" VALUES(10359,16,13.9,56,0.05); +INSERT INTO "Order Details" VALUES(10359,31,10,70,0.05); +INSERT INTO "Order Details" VALUES(10359,60,27.2,80,0.05); +INSERT INTO "Order Details" VALUES(10360,28,36.4,30,0); +INSERT INTO "Order Details" VALUES(10360,29,99,35,0); + +INSERT INTO "Order Details" VALUES(10360,38,210.8,10,0); +INSERT INTO "Order Details" VALUES(10360,49,16,35,0); +INSERT INTO "Order Details" VALUES(10360,54,5.9,28,0); +INSERT INTO "Order Details" VALUES(10361,39,14.4,54,0.1); +INSERT INTO "Order Details" VALUES(10361,60,27.2,55,0.1); +INSERT INTO "Order Details" VALUES(10362,25,11.2,50,0); +INSERT INTO "Order Details" VALUES(10362,51,42.4,20,0); +INSERT INTO "Order Details" VALUES(10362,54,5.9,24,0); +INSERT INTO "Order Details" VALUES(10363,31,10,20,0); +INSERT INTO "Order Details" VALUES(10363,75,6.2,12,0); + +INSERT INTO "Order Details" VALUES(10363,76,14.4,12,0); +INSERT INTO "Order Details" VALUES(10364,69,28.8,30,0); +INSERT INTO "Order Details" VALUES(10364,71,17.2,5,0); +INSERT INTO "Order Details" VALUES(10365,11,16.8,24,0); +INSERT INTO "Order Details" VALUES(10366,65,16.8,5,0); +INSERT INTO "Order Details" VALUES(10366,77,10.4,5,0); +INSERT INTO "Order Details" VALUES(10367,34,11.2,36,0); +INSERT INTO "Order Details" VALUES(10367,54,5.9,18,0); +INSERT INTO "Order Details" VALUES(10367,65,16.8,15,0); +INSERT INTO "Order Details" VALUES(10367,77,10.4,7,0); + +INSERT INTO "Order Details" VALUES(10368,21,8,5,0.1); +INSERT INTO "Order Details" VALUES(10368,28,36.4,13,0.1); +INSERT INTO "Order Details" VALUES(10368,57,15.6,25,0); +INSERT INTO "Order Details" VALUES(10368,64,26.6,35,0.1); +INSERT INTO "Order Details" VALUES(10369,29,99,20,0); +INSERT INTO "Order Details" VALUES(10369,56,30.4,18,0.25); +INSERT INTO "Order Details" VALUES(10370,1,14.4,15,0.15); +INSERT INTO "Order Details" VALUES(10370,64,26.6,30,0); +INSERT INTO "Order Details" VALUES(10370,74,8,20,0.15); +INSERT INTO "Order Details" VALUES(10371,36,15.2,6,0.2); + +INSERT INTO "Order Details" VALUES(10372,20,64.8,12,0.25); +INSERT INTO "Order Details" VALUES(10372,38,210.8,40,0.25); +INSERT INTO "Order Details" VALUES(10372,60,27.2,70,0.25); +INSERT INTO "Order Details" VALUES(10372,72,27.8,42,0.25); +INSERT INTO "Order Details" VALUES(10373,58,10.6,80,0.2); +INSERT INTO "Order Details" VALUES(10373,71,17.2,50,0.2); +INSERT INTO "Order Details" VALUES(10374,31,10,30,0); +INSERT INTO "Order Details" VALUES(10374,58,10.6,15,0); +INSERT INTO "Order Details" VALUES(10375,14,18.6,15,0); +INSERT INTO "Order Details" VALUES(10375,54,5.9,10,0); + +INSERT INTO "Order Details" VALUES(10376,31,10,42,0.05); +INSERT INTO "Order Details" VALUES(10377,28,36.4,20,0.15); +INSERT INTO "Order Details" VALUES(10377,39,14.4,20,0.15); +INSERT INTO "Order Details" VALUES(10378,71,17.2,6,0); +INSERT INTO "Order Details" VALUES(10379,41,7.7,8,0.1); +INSERT INTO "Order Details" VALUES(10379,63,35.1,16,0.1); +INSERT INTO "Order Details" VALUES(10379,65,16.8,20,0.1); +INSERT INTO "Order Details" VALUES(10380,30,20.7,18,0.1); +INSERT INTO "Order Details" VALUES(10380,53,26.2,20,0.1); +INSERT INTO "Order Details" VALUES(10380,60,27.2,6,0.1); + +INSERT INTO "Order Details" VALUES(10380,70,12,30,0); +INSERT INTO "Order Details" VALUES(10381,74,8,14,0); +INSERT INTO "Order Details" VALUES(10382,5,17,32,0); +INSERT INTO "Order Details" VALUES(10382,18,50,9,0); +INSERT INTO "Order Details" VALUES(10382,29,99,14,0); +INSERT INTO "Order Details" VALUES(10382,33,2,60,0); +INSERT INTO "Order Details" VALUES(10382,74,8,50,0); +INSERT INTO "Order Details" VALUES(10383,13,4.8,20,0); +INSERT INTO "Order Details" VALUES(10383,50,13,15,0); +INSERT INTO "Order Details" VALUES(10383,56,30.4,20,0); + +INSERT INTO "Order Details" VALUES(10384,20,64.8,28,0); +INSERT INTO "Order Details" VALUES(10384,60,27.2,15,0); +INSERT INTO "Order Details" VALUES(10385,7,24,10,0.2); +INSERT INTO "Order Details" VALUES(10385,60,27.2,20,0.2); +INSERT INTO "Order Details" VALUES(10385,68,10,8,0.2); +INSERT INTO "Order Details" VALUES(10386,24,3.6,15,0); +INSERT INTO "Order Details" VALUES(10386,34,11.2,10,0); +INSERT INTO "Order Details" VALUES(10387,24,3.6,15,0); +INSERT INTO "Order Details" VALUES(10387,28,36.4,6,0); +INSERT INTO "Order Details" VALUES(10387,59,44,12,0); + +INSERT INTO "Order Details" VALUES(10387,71,17.2,15,0); +INSERT INTO "Order Details" VALUES(10388,45,7.6,15,0.2); +INSERT INTO "Order Details" VALUES(10388,52,5.6,20,0.2); +INSERT INTO "Order Details" VALUES(10388,53,26.2,40,0); +INSERT INTO "Order Details" VALUES(10389,10,24.8,16,0); +INSERT INTO "Order Details" VALUES(10389,55,19.2,15,0); +INSERT INTO "Order Details" VALUES(10389,62,39.4,20,0); +INSERT INTO "Order Details" VALUES(10389,70,12,30,0); +INSERT INTO "Order Details" VALUES(10390,31,10,60,0.1); +INSERT INTO "Order Details" VALUES(10390,35,14.4,40,0.1); + +INSERT INTO "Order Details" VALUES(10390,46,9.6,45,0); +INSERT INTO "Order Details" VALUES(10390,72,27.8,24,0.1); +INSERT INTO "Order Details" VALUES(10391,13,4.8,18,0); +INSERT INTO "Order Details" VALUES(10392,69,28.8,50,0); +INSERT INTO "Order Details" VALUES(10393,2,15.2,25,0.25); +INSERT INTO "Order Details" VALUES(10393,14,18.6,42,0.25); +INSERT INTO "Order Details" VALUES(10393,25,11.2,7,0.25); +INSERT INTO "Order Details" VALUES(10393,26,24.9,70,0.25); +INSERT INTO "Order Details" VALUES(10393,31,10,32,0); +INSERT INTO "Order Details" VALUES(10394,13,4.8,10,0); + +INSERT INTO "Order Details" VALUES(10394,62,39.4,10,0); +INSERT INTO "Order Details" VALUES(10395,46,9.6,28,0.1); +INSERT INTO "Order Details" VALUES(10395,53,26.2,70,0.1); +INSERT INTO "Order Details" VALUES(10395,69,28.8,8,0); +INSERT INTO "Order Details" VALUES(10396,23,7.2,40,0); +INSERT INTO "Order Details" VALUES(10396,71,17.2,60,0); +INSERT INTO "Order Details" VALUES(10396,72,27.8,21,0); +INSERT INTO "Order Details" VALUES(10397,21,8,10,0.15); +INSERT INTO "Order Details" VALUES(10397,51,42.4,18,0.15); +INSERT INTO "Order Details" VALUES(10398,35,14.4,30,0); + +INSERT INTO "Order Details" VALUES(10398,55,19.2,120,0.1); +INSERT INTO "Order Details" VALUES(10399,68,10,60,0); +INSERT INTO "Order Details" VALUES(10399,71,17.2,30,0); +INSERT INTO "Order Details" VALUES(10399,76,14.4,35,0); +INSERT INTO "Order Details" VALUES(10399,77,10.4,14,0); +INSERT INTO "Order Details" VALUES(10400,29,99,21,0); +INSERT INTO "Order Details" VALUES(10400,35,14.4,35,0); +INSERT INTO "Order Details" VALUES(10400,49,16,30,0); +INSERT INTO "Order Details" VALUES(10401,30,20.7,18,0); +INSERT INTO "Order Details" VALUES(10401,56,30.4,70,0); + +INSERT INTO "Order Details" VALUES(10401,65,16.8,20,0); +INSERT INTO "Order Details" VALUES(10401,71,17.2,60,0); +INSERT INTO "Order Details" VALUES(10402,23,7.2,60,0); +INSERT INTO "Order Details" VALUES(10402,63,35.1,65,0); +INSERT INTO "Order Details" VALUES(10403,16,13.9,21,0.15); +INSERT INTO "Order Details" VALUES(10403,48,10.2,70,0.15); +INSERT INTO "Order Details" VALUES(10404,26,24.9,30,0.05); +INSERT INTO "Order Details" VALUES(10404,42,11.2,40,0.05); +INSERT INTO "Order Details" VALUES(10404,49,16,30,0.05); +INSERT INTO "Order Details" VALUES(10405,3,8,50,0); + +INSERT INTO "Order Details" VALUES(10406,1,14.4,10,0); +INSERT INTO "Order Details" VALUES(10406,21,8,30,0.1); +INSERT INTO "Order Details" VALUES(10406,28,36.4,42,0.1); +INSERT INTO "Order Details" VALUES(10406,36,15.2,5,0.1); +INSERT INTO "Order Details" VALUES(10406,40,14.7,2,0.1); +INSERT INTO "Order Details" VALUES(10407,11,16.8,30,0); +INSERT INTO "Order Details" VALUES(10407,69,28.8,15,0); +INSERT INTO "Order Details" VALUES(10407,71,17.2,15,0); +INSERT INTO "Order Details" VALUES(10408,37,20.8,10,0); +INSERT INTO "Order Details" VALUES(10408,54,5.9,6,0); + +INSERT INTO "Order Details" VALUES(10408,62,39.4,35,0); +INSERT INTO "Order Details" VALUES(10409,14,18.6,12,0); +INSERT INTO "Order Details" VALUES(10409,21,8,12,0); +INSERT INTO "Order Details" VALUES(10410,33,2,49,0); +INSERT INTO "Order Details" VALUES(10410,59,44,16,0); +INSERT INTO "Order Details" VALUES(10411,41,7.7,25,0.2); +INSERT INTO "Order Details" VALUES(10411,44,15.5,40,0.2); +INSERT INTO "Order Details" VALUES(10411,59,44,9,0.2); +INSERT INTO "Order Details" VALUES(10412,14,18.6,20,0.1); +INSERT INTO "Order Details" VALUES(10413,1,14.4,24,0); + +INSERT INTO "Order Details" VALUES(10413,62,39.4,40,0); +INSERT INTO "Order Details" VALUES(10413,76,14.4,14,0); +INSERT INTO "Order Details" VALUES(10414,19,7.3,18,0.05); +INSERT INTO "Order Details" VALUES(10414,33,2,50,0); +INSERT INTO "Order Details" VALUES(10415,17,31.2,2,0); +INSERT INTO "Order Details" VALUES(10415,33,2,20,0); +INSERT INTO "Order Details" VALUES(10416,19,7.3,20,0); +INSERT INTO "Order Details" VALUES(10416,53,26.2,10,0); +INSERT INTO "Order Details" VALUES(10416,57,15.6,20,0); +INSERT INTO "Order Details" VALUES(10417,38,210.8,50,0); + +INSERT INTO "Order Details" VALUES(10417,46,9.6,2,0.25); +INSERT INTO "Order Details" VALUES(10417,68,10,36,0.25); +INSERT INTO "Order Details" VALUES(10417,77,10.4,35,0); +INSERT INTO "Order Details" VALUES(10418,2,15.2,60,0); +INSERT INTO "Order Details" VALUES(10418,47,7.6,55,0); +INSERT INTO "Order Details" VALUES(10418,61,22.8,16,0); +INSERT INTO "Order Details" VALUES(10418,74,8,15,0); +INSERT INTO "Order Details" VALUES(10419,60,27.2,60,0.05); +INSERT INTO "Order Details" VALUES(10419,69,28.8,20,0.05); +INSERT INTO "Order Details" VALUES(10420,9,77.6,20,0.1); + +INSERT INTO "Order Details" VALUES(10420,13,4.8,2,0.1); +INSERT INTO "Order Details" VALUES(10420,70,12,8,0.1); +INSERT INTO "Order Details" VALUES(10420,73,12,20,0.1); +INSERT INTO "Order Details" VALUES(10421,19,7.3,4,0.15); +INSERT INTO "Order Details" VALUES(10421,26,24.9,30,0); +INSERT INTO "Order Details" VALUES(10421,53,26.2,15,0.15); +INSERT INTO "Order Details" VALUES(10421,77,10.4,10,0.15); +INSERT INTO "Order Details" VALUES(10422,26,24.9,2,0); +INSERT INTO "Order Details" VALUES(10423,31,10,14,0); +INSERT INTO "Order Details" VALUES(10423,59,44,20,0); + +INSERT INTO "Order Details" VALUES(10424,35,14.4,60,0.2); +INSERT INTO "Order Details" VALUES(10424,38,210.8,49,0.2); +INSERT INTO "Order Details" VALUES(10424,68,10,30,0.2); +INSERT INTO "Order Details" VALUES(10425,55,19.2,10,0.25); +INSERT INTO "Order Details" VALUES(10425,76,14.4,20,0.25); +INSERT INTO "Order Details" VALUES(10426,56,30.4,5,0); +INSERT INTO "Order Details" VALUES(10426,64,26.6,7,0); +INSERT INTO "Order Details" VALUES(10427,14,18.6,35,0); +INSERT INTO "Order Details" VALUES(10428,46,9.6,20,0); +INSERT INTO "Order Details" VALUES(10429,50,13,40,0); + +INSERT INTO "Order Details" VALUES(10429,63,35.1,35,0.25); +INSERT INTO "Order Details" VALUES(10430,17,31.2,45,0.2); +INSERT INTO "Order Details" VALUES(10430,21,8,50,0); +INSERT INTO "Order Details" VALUES(10430,56,30.4,30,0); +INSERT INTO "Order Details" VALUES(10430,59,44,70,0.2); +INSERT INTO "Order Details" VALUES(10431,17,31.2,50,0.25); +INSERT INTO "Order Details" VALUES(10431,40,14.7,50,0.25); +INSERT INTO "Order Details" VALUES(10431,47,7.6,30,0.25); +INSERT INTO "Order Details" VALUES(10432,26,24.9,10,0); +INSERT INTO "Order Details" VALUES(10432,54,5.9,40,0); + +INSERT INTO "Order Details" VALUES(10433,56,30.4,28,0); +INSERT INTO "Order Details" VALUES(10434,11,16.8,6,0); +INSERT INTO "Order Details" VALUES(10434,76,14.4,18,0.15); +INSERT INTO "Order Details" VALUES(10435,2,15.2,10,0); +INSERT INTO "Order Details" VALUES(10435,22,16.8,12,0); +INSERT INTO "Order Details" VALUES(10435,72,27.8,10,0); +INSERT INTO "Order Details" VALUES(10436,46,9.6,5,0); +INSERT INTO "Order Details" VALUES(10436,56,30.4,40,0.1); +INSERT INTO "Order Details" VALUES(10436,64,26.6,30,0.1); +INSERT INTO "Order Details" VALUES(10436,75,6.2,24,0.1); + +INSERT INTO "Order Details" VALUES(10437,53,26.2,15,0); +INSERT INTO "Order Details" VALUES(10438,19,7.3,15,0.2); +INSERT INTO "Order Details" VALUES(10438,34,11.2,20,0.2); +INSERT INTO "Order Details" VALUES(10438,57,15.6,15,0.2); +INSERT INTO "Order Details" VALUES(10439,12,30.4,15,0); +INSERT INTO "Order Details" VALUES(10439,16,13.9,16,0); +INSERT INTO "Order Details" VALUES(10439,64,26.6,6,0); +INSERT INTO "Order Details" VALUES(10439,74,8,30,0); +INSERT INTO "Order Details" VALUES(10440,2,15.2,45,0.15); +INSERT INTO "Order Details" VALUES(10440,16,13.9,49,0.15); + +INSERT INTO "Order Details" VALUES(10440,29,99,24,0.15); +INSERT INTO "Order Details" VALUES(10440,61,22.8,90,0.15); +INSERT INTO "Order Details" VALUES(10441,27,35.1,50,0); +INSERT INTO "Order Details" VALUES(10442,11,16.8,30,0); +INSERT INTO "Order Details" VALUES(10442,54,5.9,80,0); +INSERT INTO "Order Details" VALUES(10442,66,13.6,60,0); +INSERT INTO "Order Details" VALUES(10443,11,16.8,6,0.2); +INSERT INTO "Order Details" VALUES(10443,28,36.4,12,0); +INSERT INTO "Order Details" VALUES(10444,17,31.2,10,0); +INSERT INTO "Order Details" VALUES(10444,26,24.9,15,0); + +INSERT INTO "Order Details" VALUES(10444,35,14.4,8,0); +INSERT INTO "Order Details" VALUES(10444,41,7.7,30,0); +INSERT INTO "Order Details" VALUES(10445,39,14.4,6,0); +INSERT INTO "Order Details" VALUES(10445,54,5.9,15,0); +INSERT INTO "Order Details" VALUES(10446,19,7.3,12,0.1); +INSERT INTO "Order Details" VALUES(10446,24,3.6,20,0.1); +INSERT INTO "Order Details" VALUES(10446,31,10,3,0.1); +INSERT INTO "Order Details" VALUES(10446,52,5.6,15,0.1); +INSERT INTO "Order Details" VALUES(10447,19,7.3,40,0); +INSERT INTO "Order Details" VALUES(10447,65,16.8,35,0); + +INSERT INTO "Order Details" VALUES(10447,71,17.2,2,0); +INSERT INTO "Order Details" VALUES(10448,26,24.9,6,0); +INSERT INTO "Order Details" VALUES(10448,40,14.7,20,0); +INSERT INTO "Order Details" VALUES(10449,10,24.8,14,0); +INSERT INTO "Order Details" VALUES(10449,52,5.6,20,0); +INSERT INTO "Order Details" VALUES(10449,62,39.4,35,0); +INSERT INTO "Order Details" VALUES(10450,10,24.8,20,0.2); +INSERT INTO "Order Details" VALUES(10450,54,5.9,6,0.2); +INSERT INTO "Order Details" VALUES(10451,55,19.2,120,0.1); +INSERT INTO "Order Details" VALUES(10451,64,26.6,35,0.1); + +INSERT INTO "Order Details" VALUES(10451,65,16.8,28,0.1); +INSERT INTO "Order Details" VALUES(10451,77,10.4,55,0.1); +INSERT INTO "Order Details" VALUES(10452,28,36.4,15,0); +INSERT INTO "Order Details" VALUES(10452,44,15.5,100,0.05); +INSERT INTO "Order Details" VALUES(10453,48,10.2,15,0.1); +INSERT INTO "Order Details" VALUES(10453,70,12,25,0.1); +INSERT INTO "Order Details" VALUES(10454,16,13.9,20,0.2); +INSERT INTO "Order Details" VALUES(10454,33,2,20,0.2); +INSERT INTO "Order Details" VALUES(10454,46,9.6,10,0.2); +INSERT INTO "Order Details" VALUES(10455,39,14.4,20,0); + +INSERT INTO "Order Details" VALUES(10455,53,26.2,50,0); +INSERT INTO "Order Details" VALUES(10455,61,22.8,25,0); +INSERT INTO "Order Details" VALUES(10455,71,17.2,30,0); +INSERT INTO "Order Details" VALUES(10456,21,8,40,0.15); +INSERT INTO "Order Details" VALUES(10456,49,16,21,0.15); +INSERT INTO "Order Details" VALUES(10457,59,44,36,0); +INSERT INTO "Order Details" VALUES(10458,26,24.9,30,0); +INSERT INTO "Order Details" VALUES(10458,28,36.4,30,0); +INSERT INTO "Order Details" VALUES(10458,43,36.8,20,0); +INSERT INTO "Order Details" VALUES(10458,56,30.4,15,0); + +INSERT INTO "Order Details" VALUES(10458,71,17.2,50,0); +INSERT INTO "Order Details" VALUES(10459,7,24,16,0.05); +INSERT INTO "Order Details" VALUES(10459,46,9.6,20,0.05); +INSERT INTO "Order Details" VALUES(10459,72,27.8,40,0); +INSERT INTO "Order Details" VALUES(10460,68,10,21,0.25); +INSERT INTO "Order Details" VALUES(10460,75,6.2,4,0.25); +INSERT INTO "Order Details" VALUES(10461,21,8,40,0.25); +INSERT INTO "Order Details" VALUES(10461,30,20.7,28,0.25); +INSERT INTO "Order Details" VALUES(10461,55,19.2,60,0.25); +INSERT INTO "Order Details" VALUES(10462,13,4.8,1,0); + +INSERT INTO "Order Details" VALUES(10462,23,7.2,21,0); +INSERT INTO "Order Details" VALUES(10463,19,7.3,21,0); +INSERT INTO "Order Details" VALUES(10463,42,11.2,50,0); +INSERT INTO "Order Details" VALUES(10464,4,17.6,16,0.2); +INSERT INTO "Order Details" VALUES(10464,43,36.8,3,0); +INSERT INTO "Order Details" VALUES(10464,56,30.4,30,0.2); +INSERT INTO "Order Details" VALUES(10464,60,27.2,20,0); +INSERT INTO "Order Details" VALUES(10465,24,3.6,25,0); +INSERT INTO "Order Details" VALUES(10465,29,99,18,0.1); +INSERT INTO "Order Details" VALUES(10465,40,14.7,20,0); + +INSERT INTO "Order Details" VALUES(10465,45,7.6,30,0.1); +INSERT INTO "Order Details" VALUES(10465,50,13,25,0); +INSERT INTO "Order Details" VALUES(10466,11,16.8,10,0); +INSERT INTO "Order Details" VALUES(10466,46,9.6,5,0); +INSERT INTO "Order Details" VALUES(10467,24,3.6,28,0); +INSERT INTO "Order Details" VALUES(10467,25,11.2,12,0); +INSERT INTO "Order Details" VALUES(10468,30,20.7,8,0); +INSERT INTO "Order Details" VALUES(10468,43,36.8,15,0); +INSERT INTO "Order Details" VALUES(10469,2,15.2,40,0.15); +INSERT INTO "Order Details" VALUES(10469,16,13.9,35,0.15); + +INSERT INTO "Order Details" VALUES(10469,44,15.5,2,0.15); +INSERT INTO "Order Details" VALUES(10470,18,50,30,0); +INSERT INTO "Order Details" VALUES(10470,23,7.2,15,0); +INSERT INTO "Order Details" VALUES(10470,64,26.6,8,0); +INSERT INTO "Order Details" VALUES(10471,7,24,30,0); +INSERT INTO "Order Details" VALUES(10471,56,30.4,20,0); +INSERT INTO "Order Details" VALUES(10472,24,3.6,80,0.05); +INSERT INTO "Order Details" VALUES(10472,51,42.4,18,0); +INSERT INTO "Order Details" VALUES(10473,33,2,12,0); +INSERT INTO "Order Details" VALUES(10473,71,17.2,12,0); + +INSERT INTO "Order Details" VALUES(10474,14,18.6,12,0); +INSERT INTO "Order Details" VALUES(10474,28,36.4,18,0); +INSERT INTO "Order Details" VALUES(10474,40,14.7,21,0); +INSERT INTO "Order Details" VALUES(10474,75,6.2,10,0); +INSERT INTO "Order Details" VALUES(10475,31,10,35,0.15); +INSERT INTO "Order Details" VALUES(10475,66,13.6,60,0.15); +INSERT INTO "Order Details" VALUES(10475,76,14.4,42,0.15); +INSERT INTO "Order Details" VALUES(10476,55,19.2,2,0.05); +INSERT INTO "Order Details" VALUES(10476,70,12,12,0); +INSERT INTO "Order Details" VALUES(10477,1,14.4,15,0); + +INSERT INTO "Order Details" VALUES(10477,21,8,21,0.25); +INSERT INTO "Order Details" VALUES(10477,39,14.4,20,0.25); +INSERT INTO "Order Details" VALUES(10478,10,24.8,20,0.05); +INSERT INTO "Order Details" VALUES(10479,38,210.8,30,0); +INSERT INTO "Order Details" VALUES(10479,53,26.2,28,0); +INSERT INTO "Order Details" VALUES(10479,59,44,60,0); +INSERT INTO "Order Details" VALUES(10479,64,26.6,30,0); +INSERT INTO "Order Details" VALUES(10480,47,7.6,30,0); +INSERT INTO "Order Details" VALUES(10480,59,44,12,0); +INSERT INTO "Order Details" VALUES(10481,49,16,24,0); + +INSERT INTO "Order Details" VALUES(10481,60,27.2,40,0); +INSERT INTO "Order Details" VALUES(10482,40,14.7,10,0); +INSERT INTO "Order Details" VALUES(10483,34,11.2,35,0.05); +INSERT INTO "Order Details" VALUES(10483,77,10.4,30,0.05); +INSERT INTO "Order Details" VALUES(10484,21,8,14,0); +INSERT INTO "Order Details" VALUES(10484,40,14.7,10,0); +INSERT INTO "Order Details" VALUES(10484,51,42.4,3,0); +INSERT INTO "Order Details" VALUES(10485,2,15.2,20,0.1); +INSERT INTO "Order Details" VALUES(10485,3,8,20,0.1); +INSERT INTO "Order Details" VALUES(10485,55,19.2,30,0.1); + +INSERT INTO "Order Details" VALUES(10485,70,12,60,0.1); +INSERT INTO "Order Details" VALUES(10486,11,16.8,5,0); +INSERT INTO "Order Details" VALUES(10486,51,42.4,25,0); +INSERT INTO "Order Details" VALUES(10486,74,8,16,0); +INSERT INTO "Order Details" VALUES(10487,19,7.3,5,0); +INSERT INTO "Order Details" VALUES(10487,26,24.9,30,0); +INSERT INTO "Order Details" VALUES(10487,54,5.9,24,0.25); +INSERT INTO "Order Details" VALUES(10488,59,44,30,0); +INSERT INTO "Order Details" VALUES(10488,73,12,20,0.2); +INSERT INTO "Order Details" VALUES(10489,11,16.8,15,0.25); + +INSERT INTO "Order Details" VALUES(10489,16,13.9,18,0); +INSERT INTO "Order Details" VALUES(10490,59,44,60,0); +INSERT INTO "Order Details" VALUES(10490,68,10,30,0); +INSERT INTO "Order Details" VALUES(10490,75,6.2,36,0); +INSERT INTO "Order Details" VALUES(10491,44,15.5,15,0.15); +INSERT INTO "Order Details" VALUES(10491,77,10.4,7,0.15); +INSERT INTO "Order Details" VALUES(10492,25,11.2,60,0.05); +INSERT INTO "Order Details" VALUES(10492,42,11.2,20,0.05); +INSERT INTO "Order Details" VALUES(10493,65,16.8,15,0.1); +INSERT INTO "Order Details" VALUES(10493,66,13.6,10,0.1); + +INSERT INTO "Order Details" VALUES(10493,69,28.8,10,0.1); +INSERT INTO "Order Details" VALUES(10494,56,30.4,30,0); +INSERT INTO "Order Details" VALUES(10495,23,7.2,10,0); +INSERT INTO "Order Details" VALUES(10495,41,7.7,20,0); +INSERT INTO "Order Details" VALUES(10495,77,10.4,5,0); +INSERT INTO "Order Details" VALUES(10496,31,10,20,0.05); +INSERT INTO "Order Details" VALUES(10497,56,30.4,14,0); +INSERT INTO "Order Details" VALUES(10497,72,27.8,25,0); +INSERT INTO "Order Details" VALUES(10497,77,10.4,25,0); +INSERT INTO "Order Details" VALUES(10498,24,4.5,14,0); + +INSERT INTO "Order Details" VALUES(10498,40,18.4,5,0); +INSERT INTO "Order Details" VALUES(10498,42,14,30,0); +INSERT INTO "Order Details" VALUES(10499,28,45.6,20,0); +INSERT INTO "Order Details" VALUES(10499,49,20,25,0); +INSERT INTO "Order Details" VALUES(10500,15,15.5,12,0.05); +INSERT INTO "Order Details" VALUES(10500,28,45.6,8,0.05); +INSERT INTO "Order Details" VALUES(10501,54,7.45,20,0); +INSERT INTO "Order Details" VALUES(10502,45,9.5,21,0); +INSERT INTO "Order Details" VALUES(10502,53,32.8,6,0); +INSERT INTO "Order Details" VALUES(10502,67,14,30,0); + +INSERT INTO "Order Details" VALUES(10503,14,23.25,70,0); +INSERT INTO "Order Details" VALUES(10503,65,21.05,20,0); +INSERT INTO "Order Details" VALUES(10504,2,19,12,0); +INSERT INTO "Order Details" VALUES(10504,21,10,12,0); +INSERT INTO "Order Details" VALUES(10504,53,32.8,10,0); +INSERT INTO "Order Details" VALUES(10504,61,28.5,25,0); +INSERT INTO "Order Details" VALUES(10505,62,49.3,3,0); +INSERT INTO "Order Details" VALUES(10506,25,14,18,0.1); +INSERT INTO "Order Details" VALUES(10506,70,15,14,0.1); +INSERT INTO "Order Details" VALUES(10507,43,46,15,0.15); + +INSERT INTO "Order Details" VALUES(10507,48,12.75,15,0.15); +INSERT INTO "Order Details" VALUES(10508,13,6,10,0); +INSERT INTO "Order Details" VALUES(10508,39,18,10,0); +INSERT INTO "Order Details" VALUES(10509,28,45.6,3,0); +INSERT INTO "Order Details" VALUES(10510,29,123.79,36,0); +INSERT INTO "Order Details" VALUES(10510,75,7.75,36,0.1); +INSERT INTO "Order Details" VALUES(10511,4,22,50,0.15); +INSERT INTO "Order Details" VALUES(10511,7,30,50,0.15); +INSERT INTO "Order Details" VALUES(10511,8,40,10,0.15); +INSERT INTO "Order Details" VALUES(10512,24,4.5,10,0.15); + +INSERT INTO "Order Details" VALUES(10512,46,12,9,0.15); +INSERT INTO "Order Details" VALUES(10512,47,9.5,6,0.15); +INSERT INTO "Order Details" VALUES(10512,60,34,12,0.15); +INSERT INTO "Order Details" VALUES(10513,21,10,40,0.2); +INSERT INTO "Order Details" VALUES(10513,32,32,50,0.2); +INSERT INTO "Order Details" VALUES(10513,61,28.5,15,0.2); +INSERT INTO "Order Details" VALUES(10514,20,81,39,0); +INSERT INTO "Order Details" VALUES(10514,28,45.6,35,0); +INSERT INTO "Order Details" VALUES(10514,56,38,70,0); +INSERT INTO "Order Details" VALUES(10514,65,21.05,39,0); + +INSERT INTO "Order Details" VALUES(10514,75,7.75,50,0); +INSERT INTO "Order Details" VALUES(10515,9,97,16,0.15); +INSERT INTO "Order Details" VALUES(10515,16,17.45,50,0); +INSERT INTO "Order Details" VALUES(10515,27,43.9,120,0); +INSERT INTO "Order Details" VALUES(10515,33,2.5,16,0.15); +INSERT INTO "Order Details" VALUES(10515,60,34,84,0.15); +INSERT INTO "Order Details" VALUES(10516,18,62.5,25,0.1); +INSERT INTO "Order Details" VALUES(10516,41,9.65,80,0.1); +INSERT INTO "Order Details" VALUES(10516,42,14,20,0); +INSERT INTO "Order Details" VALUES(10517,52,7,6,0); + +INSERT INTO "Order Details" VALUES(10517,59,55,4,0); +INSERT INTO "Order Details" VALUES(10517,70,15,6,0); +INSERT INTO "Order Details" VALUES(10518,24,4.5,5,0); +INSERT INTO "Order Details" VALUES(10518,38,263.5,15,0); +INSERT INTO "Order Details" VALUES(10518,44,19.45,9,0); +INSERT INTO "Order Details" VALUES(10519,10,31,16,0.05); +INSERT INTO "Order Details" VALUES(10519,56,38,40,0); +INSERT INTO "Order Details" VALUES(10519,60,34,10,0.05); +INSERT INTO "Order Details" VALUES(10520,24,4.5,8,0); +INSERT INTO "Order Details" VALUES(10520,53,32.8,5,0); + +INSERT INTO "Order Details" VALUES(10521,35,18,3,0); +INSERT INTO "Order Details" VALUES(10521,41,9.65,10,0); +INSERT INTO "Order Details" VALUES(10521,68,12.5,6,0); +INSERT INTO "Order Details" VALUES(10522,1,18,40,0.2); +INSERT INTO "Order Details" VALUES(10522,8,40,24,0); +INSERT INTO "Order Details" VALUES(10522,30,25.89,20,0.2); +INSERT INTO "Order Details" VALUES(10522,40,18.4,25,0.2); +INSERT INTO "Order Details" VALUES(10523,17,39,25,0.1); +INSERT INTO "Order Details" VALUES(10523,20,81,15,0.1); +INSERT INTO "Order Details" VALUES(10523,37,26,18,0.1); + +INSERT INTO "Order Details" VALUES(10523,41,9.65,6,0.1); +INSERT INTO "Order Details" VALUES(10524,10,31,2,0); +INSERT INTO "Order Details" VALUES(10524,30,25.89,10,0); +INSERT INTO "Order Details" VALUES(10524,43,46,60,0); +INSERT INTO "Order Details" VALUES(10524,54,7.45,15,0); +INSERT INTO "Order Details" VALUES(10525,36,19,30,0); +INSERT INTO "Order Details" VALUES(10525,40,18.4,15,0.1); +INSERT INTO "Order Details" VALUES(10526,1,18,8,0.15); +INSERT INTO "Order Details" VALUES(10526,13,6,10,0); +INSERT INTO "Order Details" VALUES(10526,56,38,30,0.15); + +INSERT INTO "Order Details" VALUES(10527,4,22,50,0.1); +INSERT INTO "Order Details" VALUES(10527,36,19,30,0.1); +INSERT INTO "Order Details" VALUES(10528,11,21,3,0); +INSERT INTO "Order Details" VALUES(10528,33,2.5,8,0.2); +INSERT INTO "Order Details" VALUES(10528,72,34.8,9,0); +INSERT INTO "Order Details" VALUES(10529,55,24,14,0); +INSERT INTO "Order Details" VALUES(10529,68,12.5,20,0); +INSERT INTO "Order Details" VALUES(10529,69,36,10,0); +INSERT INTO "Order Details" VALUES(10530,17,39,40,0); +INSERT INTO "Order Details" VALUES(10530,43,46,25,0); + +INSERT INTO "Order Details" VALUES(10530,61,28.5,20,0); +INSERT INTO "Order Details" VALUES(10530,76,18,50,0); +INSERT INTO "Order Details" VALUES(10531,59,55,2,0); +INSERT INTO "Order Details" VALUES(10532,30,25.89,15,0); +INSERT INTO "Order Details" VALUES(10532,66,17,24,0); +INSERT INTO "Order Details" VALUES(10533,4,22,50,0.05); +INSERT INTO "Order Details" VALUES(10533,72,34.8,24,0); +INSERT INTO "Order Details" VALUES(10533,73,15,24,0.05); +INSERT INTO "Order Details" VALUES(10534,30,25.89,10,0); +INSERT INTO "Order Details" VALUES(10534,40,18.4,10,0.2); + +INSERT INTO "Order Details" VALUES(10534,54,7.45,10,0.2); +INSERT INTO "Order Details" VALUES(10535,11,21,50,0.1); +INSERT INTO "Order Details" VALUES(10535,40,18.4,10,0.1); +INSERT INTO "Order Details" VALUES(10535,57,19.5,5,0.1); +INSERT INTO "Order Details" VALUES(10535,59,55,15,0.1); +INSERT INTO "Order Details" VALUES(10536,12,38,15,0.25); +INSERT INTO "Order Details" VALUES(10536,31,12.5,20,0); +INSERT INTO "Order Details" VALUES(10536,33,2.5,30,0); +INSERT INTO "Order Details" VALUES(10536,60,34,35,0.25); +INSERT INTO "Order Details" VALUES(10537,31,12.5,30,0); + +INSERT INTO "Order Details" VALUES(10537,51,53,6,0); +INSERT INTO "Order Details" VALUES(10537,58,13.25,20,0); +INSERT INTO "Order Details" VALUES(10537,72,34.8,21,0); +INSERT INTO "Order Details" VALUES(10537,73,15,9,0); +INSERT INTO "Order Details" VALUES(10538,70,15,7,0); +INSERT INTO "Order Details" VALUES(10538,72,34.8,1,0); +INSERT INTO "Order Details" VALUES(10539,13,6,8,0); +INSERT INTO "Order Details" VALUES(10539,21,10,15,0); +INSERT INTO "Order Details" VALUES(10539,33,2.5,15,0); +INSERT INTO "Order Details" VALUES(10539,49,20,6,0); + +INSERT INTO "Order Details" VALUES(10540,3,10,60,0); +INSERT INTO "Order Details" VALUES(10540,26,31.23,40,0); +INSERT INTO "Order Details" VALUES(10540,38,263.5,30,0); +INSERT INTO "Order Details" VALUES(10540,68,12.5,35,0); +INSERT INTO "Order Details" VALUES(10541,24,4.5,35,0.1); +INSERT INTO "Order Details" VALUES(10541,38,263.5,4,0.1); +INSERT INTO "Order Details" VALUES(10541,65,21.05,36,0.1); +INSERT INTO "Order Details" VALUES(10541,71,21.5,9,0.1); +INSERT INTO "Order Details" VALUES(10542,11,21,15,0.05); +INSERT INTO "Order Details" VALUES(10542,54,7.45,24,0.05); + +INSERT INTO "Order Details" VALUES(10543,12,38,30,0.15); +INSERT INTO "Order Details" VALUES(10543,23,9,70,0.15); +INSERT INTO "Order Details" VALUES(10544,28,45.6,7,0); +INSERT INTO "Order Details" VALUES(10544,67,14,7,0); +INSERT INTO "Order Details" VALUES(10545,11,21,10,0); +INSERT INTO "Order Details" VALUES(10546,7,30,10,0); +INSERT INTO "Order Details" VALUES(10546,35,18,30,0); +INSERT INTO "Order Details" VALUES(10546,62,49.3,40,0); +INSERT INTO "Order Details" VALUES(10547,32,32,24,0.15); +INSERT INTO "Order Details" VALUES(10547,36,19,60,0); + +INSERT INTO "Order Details" VALUES(10548,34,14,10,0.25); +INSERT INTO "Order Details" VALUES(10548,41,9.65,14,0); +INSERT INTO "Order Details" VALUES(10549,31,12.5,55,0.15); +INSERT INTO "Order Details" VALUES(10549,45,9.5,100,0.15); +INSERT INTO "Order Details" VALUES(10549,51,53,48,0.15); +INSERT INTO "Order Details" VALUES(10550,17,39,8,0.1); +INSERT INTO "Order Details" VALUES(10550,19,9.2,10,0); +INSERT INTO "Order Details" VALUES(10550,21,10,6,0.1); +INSERT INTO "Order Details" VALUES(10550,61,28.5,10,0.1); +INSERT INTO "Order Details" VALUES(10551,16,17.45,40,0.15); + +INSERT INTO "Order Details" VALUES(10551,35,18,20,0.15); +INSERT INTO "Order Details" VALUES(10551,44,19.45,40,0); +INSERT INTO "Order Details" VALUES(10552,69,36,18,0); +INSERT INTO "Order Details" VALUES(10552,75,7.75,30,0); +INSERT INTO "Order Details" VALUES(10553,11,21,15,0); +INSERT INTO "Order Details" VALUES(10553,16,17.45,14,0); +INSERT INTO "Order Details" VALUES(10553,22,21,24,0); +INSERT INTO "Order Details" VALUES(10553,31,12.5,30,0); +INSERT INTO "Order Details" VALUES(10553,35,18,6,0); +INSERT INTO "Order Details" VALUES(10554,16,17.45,30,0.05); + +INSERT INTO "Order Details" VALUES(10554,23,9,20,0.05); +INSERT INTO "Order Details" VALUES(10554,62,49.3,20,0.05); +INSERT INTO "Order Details" VALUES(10554,77,13,10,0.05); +INSERT INTO "Order Details" VALUES(10555,14,23.25,30,0.2); +INSERT INTO "Order Details" VALUES(10555,19,9.2,35,0.2); +INSERT INTO "Order Details" VALUES(10555,24,4.5,18,0.2); +INSERT INTO "Order Details" VALUES(10555,51,53,20,0.2); +INSERT INTO "Order Details" VALUES(10555,56,38,40,0.2); +INSERT INTO "Order Details" VALUES(10556,72,34.8,24,0); +INSERT INTO "Order Details" VALUES(10557,64,33.25,30,0); + +INSERT INTO "Order Details" VALUES(10557,75,7.75,20,0); +INSERT INTO "Order Details" VALUES(10558,47,9.5,25,0); +INSERT INTO "Order Details" VALUES(10558,51,53,20,0); +INSERT INTO "Order Details" VALUES(10558,52,7,30,0); +INSERT INTO "Order Details" VALUES(10558,53,32.8,18,0); +INSERT INTO "Order Details" VALUES(10558,73,15,3,0); +INSERT INTO "Order Details" VALUES(10559,41,9.65,12,0.05); +INSERT INTO "Order Details" VALUES(10559,55,24,18,0.05); +INSERT INTO "Order Details" VALUES(10560,30,25.89,20,0); +INSERT INTO "Order Details" VALUES(10560,62,49.3,15,0.25); + +INSERT INTO "Order Details" VALUES(10561,44,19.45,10,0); +INSERT INTO "Order Details" VALUES(10561,51,53,50,0); +INSERT INTO "Order Details" VALUES(10562,33,2.5,20,0.1); +INSERT INTO "Order Details" VALUES(10562,62,49.3,10,0.1); +INSERT INTO "Order Details" VALUES(10563,36,19,25,0); +INSERT INTO "Order Details" VALUES(10563,52,7,70,0); +INSERT INTO "Order Details" VALUES(10564,17,39,16,0.05); +INSERT INTO "Order Details" VALUES(10564,31,12.5,6,0.05); +INSERT INTO "Order Details" VALUES(10564,55,24,25,0.05); +INSERT INTO "Order Details" VALUES(10565,24,4.5,25,0.1); + +INSERT INTO "Order Details" VALUES(10565,64,33.25,18,0.1); +INSERT INTO "Order Details" VALUES(10566,11,21,35,0.15); +INSERT INTO "Order Details" VALUES(10566,18,62.5,18,0.15); +INSERT INTO "Order Details" VALUES(10566,76,18,10,0); +INSERT INTO "Order Details" VALUES(10567,31,12.5,60,0.2); +INSERT INTO "Order Details" VALUES(10567,51,53,3,0); +INSERT INTO "Order Details" VALUES(10567,59,55,40,0.2); +INSERT INTO "Order Details" VALUES(10568,10,31,5,0); +INSERT INTO "Order Details" VALUES(10569,31,12.5,35,0.2); +INSERT INTO "Order Details" VALUES(10569,76,18,30,0); + +INSERT INTO "Order Details" VALUES(10570,11,21,15,0.05); +INSERT INTO "Order Details" VALUES(10570,56,38,60,0.05); +INSERT INTO "Order Details" VALUES(10571,14,23.25,11,0.15); +INSERT INTO "Order Details" VALUES(10571,42,14,28,0.15); +INSERT INTO "Order Details" VALUES(10572,16,17.45,12,0.1); +INSERT INTO "Order Details" VALUES(10572,32,32,10,0.1); +INSERT INTO "Order Details" VALUES(10572,40,18.4,50,0); +INSERT INTO "Order Details" VALUES(10572,75,7.75,15,0.1); +INSERT INTO "Order Details" VALUES(10573,17,39,18,0); +INSERT INTO "Order Details" VALUES(10573,34,14,40,0); + +INSERT INTO "Order Details" VALUES(10573,53,32.8,25,0); +INSERT INTO "Order Details" VALUES(10574,33,2.5,14,0); +INSERT INTO "Order Details" VALUES(10574,40,18.4,2,0); +INSERT INTO "Order Details" VALUES(10574,62,49.3,10,0); +INSERT INTO "Order Details" VALUES(10574,64,33.25,6,0); +INSERT INTO "Order Details" VALUES(10575,59,55,12,0); +INSERT INTO "Order Details" VALUES(10575,63,43.9,6,0); +INSERT INTO "Order Details" VALUES(10575,72,34.8,30,0); +INSERT INTO "Order Details" VALUES(10575,76,18,10,0); +INSERT INTO "Order Details" VALUES(10576,1,18,10,0); + +INSERT INTO "Order Details" VALUES(10576,31,12.5,20,0); +INSERT INTO "Order Details" VALUES(10576,44,19.45,21,0); +INSERT INTO "Order Details" VALUES(10577,39,18,10,0); +INSERT INTO "Order Details" VALUES(10577,75,7.75,20,0); +INSERT INTO "Order Details" VALUES(10577,77,13,18,0); +INSERT INTO "Order Details" VALUES(10578,35,18,20,0); +INSERT INTO "Order Details" VALUES(10578,57,19.5,6,0); +INSERT INTO "Order Details" VALUES(10579,15,15.5,10,0); +INSERT INTO "Order Details" VALUES(10579,75,7.75,21,0); +INSERT INTO "Order Details" VALUES(10580,14,23.25,15,0.05); + +INSERT INTO "Order Details" VALUES(10580,41,9.65,9,0.05); +INSERT INTO "Order Details" VALUES(10580,65,21.05,30,0.05); +INSERT INTO "Order Details" VALUES(10581,75,7.75,50,0.2); +INSERT INTO "Order Details" VALUES(10582,57,19.5,4,0); +INSERT INTO "Order Details" VALUES(10582,76,18,14,0); +INSERT INTO "Order Details" VALUES(10583,29,123.79,10,0); +INSERT INTO "Order Details" VALUES(10583,60,34,24,0.15); +INSERT INTO "Order Details" VALUES(10583,69,36,10,0.15); +INSERT INTO "Order Details" VALUES(10584,31,12.5,50,0.05); +INSERT INTO "Order Details" VALUES(10585,47,9.5,15,0); + +INSERT INTO "Order Details" VALUES(10586,52,7,4,0.15); +INSERT INTO "Order Details" VALUES(10587,26,31.23,6,0); +INSERT INTO "Order Details" VALUES(10587,35,18,20,0); +INSERT INTO "Order Details" VALUES(10587,77,13,20,0); +INSERT INTO "Order Details" VALUES(10588,18,62.5,40,0.2); +INSERT INTO "Order Details" VALUES(10588,42,14,100,0.2); +INSERT INTO "Order Details" VALUES(10589,35,18,4,0); +INSERT INTO "Order Details" VALUES(10590,1,18,20,0); +INSERT INTO "Order Details" VALUES(10590,77,13,60,0.05); +INSERT INTO "Order Details" VALUES(10591,3,10,14,0); + +INSERT INTO "Order Details" VALUES(10591,7,30,10,0); +INSERT INTO "Order Details" VALUES(10591,54,7.45,50,0); +INSERT INTO "Order Details" VALUES(10592,15,15.5,25,0.05); +INSERT INTO "Order Details" VALUES(10592,26,31.23,5,0.05); +INSERT INTO "Order Details" VALUES(10593,20,81,21,0.2); +INSERT INTO "Order Details" VALUES(10593,69,36,20,0.2); +INSERT INTO "Order Details" VALUES(10593,76,18,4,0.2); +INSERT INTO "Order Details" VALUES(10594,52,7,24,0); +INSERT INTO "Order Details" VALUES(10594,58,13.25,30,0); +INSERT INTO "Order Details" VALUES(10595,35,18,30,0.25); + +INSERT INTO "Order Details" VALUES(10595,61,28.5,120,0.25); +INSERT INTO "Order Details" VALUES(10595,69,36,65,0.25); +INSERT INTO "Order Details" VALUES(10596,56,38,5,0.2); +INSERT INTO "Order Details" VALUES(10596,63,43.9,24,0.2); +INSERT INTO "Order Details" VALUES(10596,75,7.75,30,0.2); +INSERT INTO "Order Details" VALUES(10597,24,4.5,35,0.2); +INSERT INTO "Order Details" VALUES(10597,57,19.5,20,0); +INSERT INTO "Order Details" VALUES(10597,65,21.05,12,0.2); +INSERT INTO "Order Details" VALUES(10598,27,43.9,50,0); +INSERT INTO "Order Details" VALUES(10598,71,21.5,9,0); + +INSERT INTO "Order Details" VALUES(10599,62,49.3,10,0); +INSERT INTO "Order Details" VALUES(10600,54,7.45,4,0); +INSERT INTO "Order Details" VALUES(10600,73,15,30,0); +INSERT INTO "Order Details" VALUES(10601,13,6,60,0); +INSERT INTO "Order Details" VALUES(10601,59,55,35,0); +INSERT INTO "Order Details" VALUES(10602,77,13,5,0.25); +INSERT INTO "Order Details" VALUES(10603,22,21,48,0); +INSERT INTO "Order Details" VALUES(10603,49,20,25,0.05); +INSERT INTO "Order Details" VALUES(10604,48,12.75,6,0.1); +INSERT INTO "Order Details" VALUES(10604,76,18,10,0.1); + +INSERT INTO "Order Details" VALUES(10605,16,17.45,30,0.05); +INSERT INTO "Order Details" VALUES(10605,59,55,20,0.05); +INSERT INTO "Order Details" VALUES(10605,60,34,70,0.05); +INSERT INTO "Order Details" VALUES(10605,71,21.5,15,0.05); +INSERT INTO "Order Details" VALUES(10606,4,22,20,0.2); +INSERT INTO "Order Details" VALUES(10606,55,24,20,0.2); +INSERT INTO "Order Details" VALUES(10606,62,49.3,10,0.2); +INSERT INTO "Order Details" VALUES(10607,7,30,45,0); +INSERT INTO "Order Details" VALUES(10607,17,39,100,0); +INSERT INTO "Order Details" VALUES(10607,33,2.5,14,0); + +INSERT INTO "Order Details" VALUES(10607,40,18.4,42,0); +INSERT INTO "Order Details" VALUES(10607,72,34.8,12,0); +INSERT INTO "Order Details" VALUES(10608,56,38,28,0); +INSERT INTO "Order Details" VALUES(10609,1,18,3,0); +INSERT INTO "Order Details" VALUES(10609,10,31,10,0); +INSERT INTO "Order Details" VALUES(10609,21,10,6,0); +INSERT INTO "Order Details" VALUES(10610,36,19,21,0.25); +INSERT INTO "Order Details" VALUES(10611,1,18,6,0); +INSERT INTO "Order Details" VALUES(10611,2,19,10,0); +INSERT INTO "Order Details" VALUES(10611,60,34,15,0); + +INSERT INTO "Order Details" VALUES(10612,10,31,70,0); +INSERT INTO "Order Details" VALUES(10612,36,19,55,0); +INSERT INTO "Order Details" VALUES(10612,49,20,18,0); +INSERT INTO "Order Details" VALUES(10612,60,34,40,0); +INSERT INTO "Order Details" VALUES(10612,76,18,80,0); +INSERT INTO "Order Details" VALUES(10613,13,6,8,0.1); +INSERT INTO "Order Details" VALUES(10613,75,7.75,40,0); +INSERT INTO "Order Details" VALUES(10614,11,21,14,0); +INSERT INTO "Order Details" VALUES(10614,21,10,8,0); +INSERT INTO "Order Details" VALUES(10614,39,18,5,0); + +INSERT INTO "Order Details" VALUES(10615,55,24,5,0); +INSERT INTO "Order Details" VALUES(10616,38,263.5,15,0.05); +INSERT INTO "Order Details" VALUES(10616,56,38,14,0); +INSERT INTO "Order Details" VALUES(10616,70,15,15,0.05); +INSERT INTO "Order Details" VALUES(10616,71,21.5,15,0.05); +INSERT INTO "Order Details" VALUES(10617,59,55,30,0.15); +INSERT INTO "Order Details" VALUES(10618,6,25,70,0); +INSERT INTO "Order Details" VALUES(10618,56,38,20,0); +INSERT INTO "Order Details" VALUES(10618,68,12.5,15,0); +INSERT INTO "Order Details" VALUES(10619,21,10,42,0); + +INSERT INTO "Order Details" VALUES(10619,22,21,40,0); +INSERT INTO "Order Details" VALUES(10620,24,4.5,5,0); +INSERT INTO "Order Details" VALUES(10620,52,7,5,0); +INSERT INTO "Order Details" VALUES(10621,19,9.2,5,0); +INSERT INTO "Order Details" VALUES(10621,23,9,10,0); +INSERT INTO "Order Details" VALUES(10621,70,15,20,0); +INSERT INTO "Order Details" VALUES(10621,71,21.5,15,0); +INSERT INTO "Order Details" VALUES(10622,2,19,20,0); +INSERT INTO "Order Details" VALUES(10622,68,12.5,18,0.2); +INSERT INTO "Order Details" VALUES(10623,14,23.25,21,0); + +INSERT INTO "Order Details" VALUES(10623,19,9.2,15,0.1); +INSERT INTO "Order Details" VALUES(10623,21,10,25,0.1); +INSERT INTO "Order Details" VALUES(10623,24,4.5,3,0); +INSERT INTO "Order Details" VALUES(10623,35,18,30,0.1); +INSERT INTO "Order Details" VALUES(10624,28,45.6,10,0); +INSERT INTO "Order Details" VALUES(10624,29,123.79,6,0); +INSERT INTO "Order Details" VALUES(10624,44,19.45,10,0); +INSERT INTO "Order Details" VALUES(10625,14,23.25,3,0); +INSERT INTO "Order Details" VALUES(10625,42,14,5,0); +INSERT INTO "Order Details" VALUES(10625,60,34,10,0); + +INSERT INTO "Order Details" VALUES(10626,53,32.8,12,0); +INSERT INTO "Order Details" VALUES(10626,60,34,20,0); +INSERT INTO "Order Details" VALUES(10626,71,21.5,20,0); +INSERT INTO "Order Details" VALUES(10627,62,49.3,15,0); +INSERT INTO "Order Details" VALUES(10627,73,15,35,0.15); +INSERT INTO "Order Details" VALUES(10628,1,18,25,0); +INSERT INTO "Order Details" VALUES(10629,29,123.79,20,0); +INSERT INTO "Order Details" VALUES(10629,64,33.25,9,0); +INSERT INTO "Order Details" VALUES(10630,55,24,12,0.05); +INSERT INTO "Order Details" VALUES(10630,76,18,35,0); + +INSERT INTO "Order Details" VALUES(10631,75,7.75,8,0.1); +INSERT INTO "Order Details" VALUES(10632,2,19,30,0.05); +INSERT INTO "Order Details" VALUES(10632,33,2.5,20,0.05); +INSERT INTO "Order Details" VALUES(10633,12,38,36,0.15); +INSERT INTO "Order Details" VALUES(10633,13,6,13,0.15); +INSERT INTO "Order Details" VALUES(10633,26,31.23,35,0.15); +INSERT INTO "Order Details" VALUES(10633,62,49.3,80,0.15); +INSERT INTO "Order Details" VALUES(10634,7,30,35,0); +INSERT INTO "Order Details" VALUES(10634,18,62.5,50,0); +INSERT INTO "Order Details" VALUES(10634,51,53,15,0); + +INSERT INTO "Order Details" VALUES(10634,75,7.75,2,0); +INSERT INTO "Order Details" VALUES(10635,4,22,10,0.1); +INSERT INTO "Order Details" VALUES(10635,5,21.35,15,0.1); +INSERT INTO "Order Details" VALUES(10635,22,21,40,0); +INSERT INTO "Order Details" VALUES(10636,4,22,25,0); +INSERT INTO "Order Details" VALUES(10636,58,13.25,6,0); +INSERT INTO "Order Details" VALUES(10637,11,21,10,0); +INSERT INTO "Order Details" VALUES(10637,50,16.25,25,0.05); +INSERT INTO "Order Details" VALUES(10637,56,38,60,0.05); +INSERT INTO "Order Details" VALUES(10638,45,9.5,20,0); + +INSERT INTO "Order Details" VALUES(10638,65,21.05,21,0); +INSERT INTO "Order Details" VALUES(10638,72,34.8,60,0); +INSERT INTO "Order Details" VALUES(10639,18,62.5,8,0); +INSERT INTO "Order Details" VALUES(10640,69,36,20,0.25); +INSERT INTO "Order Details" VALUES(10640,70,15,15,0.25); +INSERT INTO "Order Details" VALUES(10641,2,19,50,0); +INSERT INTO "Order Details" VALUES(10641,40,18.4,60,0); +INSERT INTO "Order Details" VALUES(10642,21,10,30,0.2); +INSERT INTO "Order Details" VALUES(10642,61,28.5,20,0.2); +INSERT INTO "Order Details" VALUES(10643,28,45.6,15,0.25); + +INSERT INTO "Order Details" VALUES(10643,39,18,21,0.25); +INSERT INTO "Order Details" VALUES(10643,46,12,2,0.25); +INSERT INTO "Order Details" VALUES(10644,18,62.5,4,0.1); +INSERT INTO "Order Details" VALUES(10644,43,46,20,0); +INSERT INTO "Order Details" VALUES(10644,46,12,21,0.1); +INSERT INTO "Order Details" VALUES(10645,18,62.5,20,0); +INSERT INTO "Order Details" VALUES(10645,36,19,15,0); +INSERT INTO "Order Details" VALUES(10646,1,18,15,0.25); +INSERT INTO "Order Details" VALUES(10646,10,31,18,0.25); +INSERT INTO "Order Details" VALUES(10646,71,21.5,30,0.25); + +INSERT INTO "Order Details" VALUES(10646,77,13,35,0.25); +INSERT INTO "Order Details" VALUES(10647,19,9.2,30,0); +INSERT INTO "Order Details" VALUES(10647,39,18,20,0); +INSERT INTO "Order Details" VALUES(10648,22,21,15,0); +INSERT INTO "Order Details" VALUES(10648,24,4.5,15,0.15); +INSERT INTO "Order Details" VALUES(10649,28,45.6,20,0); +INSERT INTO "Order Details" VALUES(10649,72,34.8,15,0); +INSERT INTO "Order Details" VALUES(10650,30,25.89,30,0); +INSERT INTO "Order Details" VALUES(10650,53,32.8,25,0.05); +INSERT INTO "Order Details" VALUES(10650,54,7.45,30,0); + +INSERT INTO "Order Details" VALUES(10651,19,9.2,12,0.25); +INSERT INTO "Order Details" VALUES(10651,22,21,20,0.25); +INSERT INTO "Order Details" VALUES(10652,30,25.89,2,0.25); +INSERT INTO "Order Details" VALUES(10652,42,14,20,0); +INSERT INTO "Order Details" VALUES(10653,16,17.45,30,0.1); +INSERT INTO "Order Details" VALUES(10653,60,34,20,0.1); +INSERT INTO "Order Details" VALUES(10654,4,22,12,0.1); +INSERT INTO "Order Details" VALUES(10654,39,18,20,0.1); +INSERT INTO "Order Details" VALUES(10654,54,7.45,6,0.1); +INSERT INTO "Order Details" VALUES(10655,41,9.65,20,0.2); + +INSERT INTO "Order Details" VALUES(10656,14,23.25,3,0.1); +INSERT INTO "Order Details" VALUES(10656,44,19.45,28,0.1); +INSERT INTO "Order Details" VALUES(10656,47,9.5,6,0.1); +INSERT INTO "Order Details" VALUES(10657,15,15.5,50,0); +INSERT INTO "Order Details" VALUES(10657,41,9.65,24,0); +INSERT INTO "Order Details" VALUES(10657,46,12,45,0); +INSERT INTO "Order Details" VALUES(10657,47,9.5,10,0); +INSERT INTO "Order Details" VALUES(10657,56,38,45,0); +INSERT INTO "Order Details" VALUES(10657,60,34,30,0); +INSERT INTO "Order Details" VALUES(10658,21,10,60,0); + +INSERT INTO "Order Details" VALUES(10658,40,18.4,70,0.05); +INSERT INTO "Order Details" VALUES(10658,60,34,55,0.05); +INSERT INTO "Order Details" VALUES(10658,77,13,70,0.05); +INSERT INTO "Order Details" VALUES(10659,31,12.5,20,0.05); +INSERT INTO "Order Details" VALUES(10659,40,18.4,24,0.05); +INSERT INTO "Order Details" VALUES(10659,70,15,40,0.05); +INSERT INTO "Order Details" VALUES(10660,20,81,21,0); +INSERT INTO "Order Details" VALUES(10661,39,18,3,0.2); +INSERT INTO "Order Details" VALUES(10661,58,13.25,49,0.2); +INSERT INTO "Order Details" VALUES(10662,68,12.5,10,0); + +INSERT INTO "Order Details" VALUES(10663,40,18.4,30,0.05); +INSERT INTO "Order Details" VALUES(10663,42,14,30,0.05); +INSERT INTO "Order Details" VALUES(10663,51,53,20,0.05); +INSERT INTO "Order Details" VALUES(10664,10,31,24,0.15); +INSERT INTO "Order Details" VALUES(10664,56,38,12,0.15); +INSERT INTO "Order Details" VALUES(10664,65,21.05,15,0.15); +INSERT INTO "Order Details" VALUES(10665,51,53,20,0); +INSERT INTO "Order Details" VALUES(10665,59,55,1,0); +INSERT INTO "Order Details" VALUES(10665,76,18,10,0); +INSERT INTO "Order Details" VALUES(10666,29,123.79,36,0); + +INSERT INTO "Order Details" VALUES(10666,65,21.05,10,0); +INSERT INTO "Order Details" VALUES(10667,69,36,45,0.2); +INSERT INTO "Order Details" VALUES(10667,71,21.5,14,0.2); +INSERT INTO "Order Details" VALUES(10668,31,12.5,8,0.1); +INSERT INTO "Order Details" VALUES(10668,55,24,4,0.1); +INSERT INTO "Order Details" VALUES(10668,64,33.25,15,0.1); +INSERT INTO "Order Details" VALUES(10669,36,19,30,0); +INSERT INTO "Order Details" VALUES(10670,23,9,32,0); +INSERT INTO "Order Details" VALUES(10670,46,12,60,0); +INSERT INTO "Order Details" VALUES(10670,67,14,25,0); + +INSERT INTO "Order Details" VALUES(10670,73,15,50,0); +INSERT INTO "Order Details" VALUES(10670,75,7.75,25,0); +INSERT INTO "Order Details" VALUES(10671,16,17.45,10,0); +INSERT INTO "Order Details" VALUES(10671,62,49.3,10,0); +INSERT INTO "Order Details" VALUES(10671,65,21.05,12,0); +INSERT INTO "Order Details" VALUES(10672,38,263.5,15,0.1); +INSERT INTO "Order Details" VALUES(10672,71,21.5,12,0); +INSERT INTO "Order Details" VALUES(10673,16,17.45,3,0); +INSERT INTO "Order Details" VALUES(10673,42,14,6,0); +INSERT INTO "Order Details" VALUES(10673,43,46,6,0); + +INSERT INTO "Order Details" VALUES(10674,23,9,5,0); +INSERT INTO "Order Details" VALUES(10675,14,23.25,30,0); +INSERT INTO "Order Details" VALUES(10675,53,32.8,10,0); +INSERT INTO "Order Details" VALUES(10675,58,13.25,30,0); +INSERT INTO "Order Details" VALUES(10676,10,31,2,0); +INSERT INTO "Order Details" VALUES(10676,19,9.2,7,0); +INSERT INTO "Order Details" VALUES(10676,44,19.45,21,0); +INSERT INTO "Order Details" VALUES(10677,26,31.23,30,0.15); +INSERT INTO "Order Details" VALUES(10677,33,2.5,8,0.15); +INSERT INTO "Order Details" VALUES(10678,12,38,100,0); + +INSERT INTO "Order Details" VALUES(10678,33,2.5,30,0); +INSERT INTO "Order Details" VALUES(10678,41,9.65,120,0); +INSERT INTO "Order Details" VALUES(10678,54,7.45,30,0); +INSERT INTO "Order Details" VALUES(10679,59,55,12,0); +INSERT INTO "Order Details" VALUES(10680,16,17.45,50,0.25); +INSERT INTO "Order Details" VALUES(10680,31,12.5,20,0.25); +INSERT INTO "Order Details" VALUES(10680,42,14,40,0.25); +INSERT INTO "Order Details" VALUES(10681,19,9.2,30,0.1); +INSERT INTO "Order Details" VALUES(10681,21,10,12,0.1); +INSERT INTO "Order Details" VALUES(10681,64,33.25,28,0); + +INSERT INTO "Order Details" VALUES(10682,33,2.5,30,0); +INSERT INTO "Order Details" VALUES(10682,66,17,4,0); +INSERT INTO "Order Details" VALUES(10682,75,7.75,30,0); +INSERT INTO "Order Details" VALUES(10683,52,7,9,0); +INSERT INTO "Order Details" VALUES(10684,40,18.4,20,0); +INSERT INTO "Order Details" VALUES(10684,47,9.5,40,0); +INSERT INTO "Order Details" VALUES(10684,60,34,30,0); +INSERT INTO "Order Details" VALUES(10685,10,31,20,0); +INSERT INTO "Order Details" VALUES(10685,41,9.65,4,0); +INSERT INTO "Order Details" VALUES(10685,47,9.5,15,0); + +INSERT INTO "Order Details" VALUES(10686,17,39,30,0.2); +INSERT INTO "Order Details" VALUES(10686,26,31.23,15,0); +INSERT INTO "Order Details" VALUES(10687,9,97,50,0.25); +INSERT INTO "Order Details" VALUES(10687,29,123.79,10,0); +INSERT INTO "Order Details" VALUES(10687,36,19,6,0.25); +INSERT INTO "Order Details" VALUES(10688,10,31,18,0.1); +INSERT INTO "Order Details" VALUES(10688,28,45.6,60,0.1); +INSERT INTO "Order Details" VALUES(10688,34,14,14,0); +INSERT INTO "Order Details" VALUES(10689,1,18,35,0.25); +INSERT INTO "Order Details" VALUES(10690,56,38,20,0.25); + +INSERT INTO "Order Details" VALUES(10690,77,13,30,0.25); +INSERT INTO "Order Details" VALUES(10691,1,18,30,0); +INSERT INTO "Order Details" VALUES(10691,29,123.79,40,0); +INSERT INTO "Order Details" VALUES(10691,43,46,40,0); +INSERT INTO "Order Details" VALUES(10691,44,19.45,24,0); +INSERT INTO "Order Details" VALUES(10691,62,49.3,48,0); +INSERT INTO "Order Details" VALUES(10692,63,43.9,20,0); +INSERT INTO "Order Details" VALUES(10693,9,97,6,0); +INSERT INTO "Order Details" VALUES(10693,54,7.45,60,0.15); +INSERT INTO "Order Details" VALUES(10693,69,36,30,0.15); + +INSERT INTO "Order Details" VALUES(10693,73,15,15,0.15); +INSERT INTO "Order Details" VALUES(10694,7,30,90,0); +INSERT INTO "Order Details" VALUES(10694,59,55,25,0); +INSERT INTO "Order Details" VALUES(10694,70,15,50,0); +INSERT INTO "Order Details" VALUES(10695,8,40,10,0); +INSERT INTO "Order Details" VALUES(10695,12,38,4,0); +INSERT INTO "Order Details" VALUES(10695,24,4.5,20,0); +INSERT INTO "Order Details" VALUES(10696,17,39,20,0); +INSERT INTO "Order Details" VALUES(10696,46,12,18,0); +INSERT INTO "Order Details" VALUES(10697,19,9.2,7,0.25); + +INSERT INTO "Order Details" VALUES(10697,35,18,9,0.25); +INSERT INTO "Order Details" VALUES(10697,58,13.25,30,0.25); +INSERT INTO "Order Details" VALUES(10697,70,15,30,0.25); +INSERT INTO "Order Details" VALUES(10698,11,21,15,0); +INSERT INTO "Order Details" VALUES(10698,17,39,8,0.05); +INSERT INTO "Order Details" VALUES(10698,29,123.79,12,0.05); +INSERT INTO "Order Details" VALUES(10698,65,21.05,65,0.05); +INSERT INTO "Order Details" VALUES(10698,70,15,8,0.05); +INSERT INTO "Order Details" VALUES(10699,47,9.5,12,0); +INSERT INTO "Order Details" VALUES(10700,1,18,5,0.2); + +INSERT INTO "Order Details" VALUES(10700,34,14,12,0.2); +INSERT INTO "Order Details" VALUES(10700,68,12.5,40,0.2); +INSERT INTO "Order Details" VALUES(10700,71,21.5,60,0.2); +INSERT INTO "Order Details" VALUES(10701,59,55,42,0.15); +INSERT INTO "Order Details" VALUES(10701,71,21.5,20,0.15); +INSERT INTO "Order Details" VALUES(10701,76,18,35,0.15); +INSERT INTO "Order Details" VALUES(10702,3,10,6,0); +INSERT INTO "Order Details" VALUES(10702,76,18,15,0); +INSERT INTO "Order Details" VALUES(10703,2,19,5,0); +INSERT INTO "Order Details" VALUES(10703,59,55,35,0); + +INSERT INTO "Order Details" VALUES(10703,73,15,35,0); +INSERT INTO "Order Details" VALUES(10704,4,22,6,0); +INSERT INTO "Order Details" VALUES(10704,24,4.5,35,0); +INSERT INTO "Order Details" VALUES(10704,48,12.75,24,0); +INSERT INTO "Order Details" VALUES(10705,31,12.5,20,0); +INSERT INTO "Order Details" VALUES(10705,32,32,4,0); +INSERT INTO "Order Details" VALUES(10706,16,17.45,20,0); +INSERT INTO "Order Details" VALUES(10706,43,46,24,0); +INSERT INTO "Order Details" VALUES(10706,59,55,8,0); +INSERT INTO "Order Details" VALUES(10707,55,24,21,0); + +INSERT INTO "Order Details" VALUES(10707,57,19.5,40,0); +INSERT INTO "Order Details" VALUES(10707,70,15,28,0.15); +INSERT INTO "Order Details" VALUES(10708,5,21.35,4,0); +INSERT INTO "Order Details" VALUES(10708,36,19,5,0); +INSERT INTO "Order Details" VALUES(10709,8,40,40,0); +INSERT INTO "Order Details" VALUES(10709,51,53,28,0); +INSERT INTO "Order Details" VALUES(10709,60,34,10,0); +INSERT INTO "Order Details" VALUES(10710,19,9.2,5,0); +INSERT INTO "Order Details" VALUES(10710,47,9.5,5,0); +INSERT INTO "Order Details" VALUES(10711,19,9.2,12,0); + +INSERT INTO "Order Details" VALUES(10711,41,9.65,42,0); +INSERT INTO "Order Details" VALUES(10711,53,32.8,120,0); +INSERT INTO "Order Details" VALUES(10712,53,32.8,3,0.05); +INSERT INTO "Order Details" VALUES(10712,56,38,30,0); +INSERT INTO "Order Details" VALUES(10713,10,31,18,0); +INSERT INTO "Order Details" VALUES(10713,26,31.23,30,0); +INSERT INTO "Order Details" VALUES(10713,45,9.5,110,0); +INSERT INTO "Order Details" VALUES(10713,46,12,24,0); +INSERT INTO "Order Details" VALUES(10714,2,19,30,0.25); +INSERT INTO "Order Details" VALUES(10714,17,39,27,0.25); + +INSERT INTO "Order Details" VALUES(10714,47,9.5,50,0.25); +INSERT INTO "Order Details" VALUES(10714,56,38,18,0.25); +INSERT INTO "Order Details" VALUES(10714,58,13.25,12,0.25); +INSERT INTO "Order Details" VALUES(10715,10,31,21,0); +INSERT INTO "Order Details" VALUES(10715,71,21.5,30,0); +INSERT INTO "Order Details" VALUES(10716,21,10,5,0); +INSERT INTO "Order Details" VALUES(10716,51,53,7,0); +INSERT INTO "Order Details" VALUES(10716,61,28.5,10,0); +INSERT INTO "Order Details" VALUES(10717,21,10,32,0.05); +INSERT INTO "Order Details" VALUES(10717,54,7.45,15,0); + +INSERT INTO "Order Details" VALUES(10717,69,36,25,0.05); +INSERT INTO "Order Details" VALUES(10718,12,38,36,0); +INSERT INTO "Order Details" VALUES(10718,16,17.45,20,0); +INSERT INTO "Order Details" VALUES(10718,36,19,40,0); +INSERT INTO "Order Details" VALUES(10718,62,49.3,20,0); +INSERT INTO "Order Details" VALUES(10719,18,62.5,12,0.25); +INSERT INTO "Order Details" VALUES(10719,30,25.89,3,0.25); +INSERT INTO "Order Details" VALUES(10719,54,7.45,40,0.25); +INSERT INTO "Order Details" VALUES(10720,35,18,21,0); +INSERT INTO "Order Details" VALUES(10720,71,21.5,8,0); + +INSERT INTO "Order Details" VALUES(10721,44,19.45,50,0.05); +INSERT INTO "Order Details" VALUES(10722,2,19,3,0); +INSERT INTO "Order Details" VALUES(10722,31,12.5,50,0); +INSERT INTO "Order Details" VALUES(10722,68,12.5,45,0); +INSERT INTO "Order Details" VALUES(10722,75,7.75,42,0); +INSERT INTO "Order Details" VALUES(10723,26,31.23,15,0); +INSERT INTO "Order Details" VALUES(10724,10,31,16,0); +INSERT INTO "Order Details" VALUES(10724,61,28.5,5,0); +INSERT INTO "Order Details" VALUES(10725,41,9.65,12,0); +INSERT INTO "Order Details" VALUES(10725,52,7,4,0); + +INSERT INTO "Order Details" VALUES(10725,55,24,6,0); +INSERT INTO "Order Details" VALUES(10726,4,22,25,0); +INSERT INTO "Order Details" VALUES(10726,11,21,5,0); +INSERT INTO "Order Details" VALUES(10727,17,39,20,0.05); +INSERT INTO "Order Details" VALUES(10727,56,38,10,0.05); +INSERT INTO "Order Details" VALUES(10727,59,55,10,0.05); +INSERT INTO "Order Details" VALUES(10728,30,25.89,15,0); +INSERT INTO "Order Details" VALUES(10728,40,18.4,6,0); +INSERT INTO "Order Details" VALUES(10728,55,24,12,0); +INSERT INTO "Order Details" VALUES(10728,60,34,15,0); + +INSERT INTO "Order Details" VALUES(10729,1,18,50,0); +INSERT INTO "Order Details" VALUES(10729,21,10,30,0); +INSERT INTO "Order Details" VALUES(10729,50,16.25,40,0); +INSERT INTO "Order Details" VALUES(10730,16,17.45,15,0.05); +INSERT INTO "Order Details" VALUES(10730,31,12.5,3,0.05); +INSERT INTO "Order Details" VALUES(10730,65,21.05,10,0.05); +INSERT INTO "Order Details" VALUES(10731,21,10,40,0.05); +INSERT INTO "Order Details" VALUES(10731,51,53,30,0.05); +INSERT INTO "Order Details" VALUES(10732,76,18,20,0); +INSERT INTO "Order Details" VALUES(10733,14,23.25,16,0); + +INSERT INTO "Order Details" VALUES(10733,28,45.6,20,0); +INSERT INTO "Order Details" VALUES(10733,52,7,25,0); +INSERT INTO "Order Details" VALUES(10734,6,25,30,0); +INSERT INTO "Order Details" VALUES(10734,30,25.89,15,0); +INSERT INTO "Order Details" VALUES(10734,76,18,20,0); +INSERT INTO "Order Details" VALUES(10735,61,28.5,20,0.1); +INSERT INTO "Order Details" VALUES(10735,77,13,2,0.1); +INSERT INTO "Order Details" VALUES(10736,65,21.05,40,0); +INSERT INTO "Order Details" VALUES(10736,75,7.75,20,0); +INSERT INTO "Order Details" VALUES(10737,13,6,4,0); + +INSERT INTO "Order Details" VALUES(10737,41,9.65,12,0); +INSERT INTO "Order Details" VALUES(10738,16,17.45,3,0); +INSERT INTO "Order Details" VALUES(10739,36,19,6,0); +INSERT INTO "Order Details" VALUES(10739,52,7,18,0); +INSERT INTO "Order Details" VALUES(10740,28,45.6,5,0.2); +INSERT INTO "Order Details" VALUES(10740,35,18,35,0.2); +INSERT INTO "Order Details" VALUES(10740,45,9.5,40,0.2); +INSERT INTO "Order Details" VALUES(10740,56,38,14,0.2); +INSERT INTO "Order Details" VALUES(10741,2,19,15,0.2); +INSERT INTO "Order Details" VALUES(10742,3,10,20,0); + +INSERT INTO "Order Details" VALUES(10742,60,34,50,0); +INSERT INTO "Order Details" VALUES(10742,72,34.8,35,0); +INSERT INTO "Order Details" VALUES(10743,46,12,28,0.05); +INSERT INTO "Order Details" VALUES(10744,40,18.4,50,0.2); +INSERT INTO "Order Details" VALUES(10745,18,62.5,24,0); +INSERT INTO "Order Details" VALUES(10745,44,19.45,16,0); +INSERT INTO "Order Details" VALUES(10745,59,55,45,0); +INSERT INTO "Order Details" VALUES(10745,72,34.8,7,0); +INSERT INTO "Order Details" VALUES(10746,13,6,6,0); +INSERT INTO "Order Details" VALUES(10746,42,14,28,0); + +INSERT INTO "Order Details" VALUES(10746,62,49.3,9,0); +INSERT INTO "Order Details" VALUES(10746,69,36,40,0); +INSERT INTO "Order Details" VALUES(10747,31,12.5,8,0); +INSERT INTO "Order Details" VALUES(10747,41,9.65,35,0); +INSERT INTO "Order Details" VALUES(10747,63,43.9,9,0); +INSERT INTO "Order Details" VALUES(10747,69,36,30,0); +INSERT INTO "Order Details" VALUES(10748,23,9,44,0); +INSERT INTO "Order Details" VALUES(10748,40,18.4,40,0); +INSERT INTO "Order Details" VALUES(10748,56,38,28,0); +INSERT INTO "Order Details" VALUES(10749,56,38,15,0); + +INSERT INTO "Order Details" VALUES(10749,59,55,6,0); +INSERT INTO "Order Details" VALUES(10749,76,18,10,0); +INSERT INTO "Order Details" VALUES(10750,14,23.25,5,0.15); +INSERT INTO "Order Details" VALUES(10750,45,9.5,40,0.15); +INSERT INTO "Order Details" VALUES(10750,59,55,25,0.15); +INSERT INTO "Order Details" VALUES(10751,26,31.23,12,0.1); +INSERT INTO "Order Details" VALUES(10751,30,25.89,30,0); +INSERT INTO "Order Details" VALUES(10751,50,16.25,20,0.1); +INSERT INTO "Order Details" VALUES(10751,73,15,15,0); +INSERT INTO "Order Details" VALUES(10752,1,18,8,0); + +INSERT INTO "Order Details" VALUES(10752,69,36,3,0); +INSERT INTO "Order Details" VALUES(10753,45,9.5,4,0); +INSERT INTO "Order Details" VALUES(10753,74,10,5,0); +INSERT INTO "Order Details" VALUES(10754,40,18.4,3,0); +INSERT INTO "Order Details" VALUES(10755,47,9.5,30,0.25); +INSERT INTO "Order Details" VALUES(10755,56,38,30,0.25); +INSERT INTO "Order Details" VALUES(10755,57,19.5,14,0.25); +INSERT INTO "Order Details" VALUES(10755,69,36,25,0.25); +INSERT INTO "Order Details" VALUES(10756,18,62.5,21,0.2); +INSERT INTO "Order Details" VALUES(10756,36,19,20,0.2); + +INSERT INTO "Order Details" VALUES(10756,68,12.5,6,0.2); +INSERT INTO "Order Details" VALUES(10756,69,36,20,0.2); +INSERT INTO "Order Details" VALUES(10757,34,14,30,0); +INSERT INTO "Order Details" VALUES(10757,59,55,7,0); +INSERT INTO "Order Details" VALUES(10757,62,49.3,30,0); +INSERT INTO "Order Details" VALUES(10757,64,33.25,24,0); +INSERT INTO "Order Details" VALUES(10758,26,31.23,20,0); +INSERT INTO "Order Details" VALUES(10758,52,7,60,0); +INSERT INTO "Order Details" VALUES(10758,70,15,40,0); +INSERT INTO "Order Details" VALUES(10759,32,32,10,0); + +INSERT INTO "Order Details" VALUES(10760,25,14,12,0.25); +INSERT INTO "Order Details" VALUES(10760,27,43.9,40,0); +INSERT INTO "Order Details" VALUES(10760,43,46,30,0.25); +INSERT INTO "Order Details" VALUES(10761,25,14,35,0.25); +INSERT INTO "Order Details" VALUES(10761,75,7.75,18,0); +INSERT INTO "Order Details" VALUES(10762,39,18,16,0); +INSERT INTO "Order Details" VALUES(10762,47,9.5,30,0); +INSERT INTO "Order Details" VALUES(10762,51,53,28,0); +INSERT INTO "Order Details" VALUES(10762,56,38,60,0); +INSERT INTO "Order Details" VALUES(10763,21,10,40,0); + +INSERT INTO "Order Details" VALUES(10763,22,21,6,0); +INSERT INTO "Order Details" VALUES(10763,24,4.5,20,0); +INSERT INTO "Order Details" VALUES(10764,3,10,20,0.1); +INSERT INTO "Order Details" VALUES(10764,39,18,130,0.1); +INSERT INTO "Order Details" VALUES(10765,65,21.05,80,0.1); +INSERT INTO "Order Details" VALUES(10766,2,19,40,0); +INSERT INTO "Order Details" VALUES(10766,7,30,35,0); +INSERT INTO "Order Details" VALUES(10766,68,12.5,40,0); +INSERT INTO "Order Details" VALUES(10767,42,14,2,0); +INSERT INTO "Order Details" VALUES(10768,22,21,4,0); + +INSERT INTO "Order Details" VALUES(10768,31,12.5,50,0); +INSERT INTO "Order Details" VALUES(10768,60,34,15,0); +INSERT INTO "Order Details" VALUES(10768,71,21.5,12,0); +INSERT INTO "Order Details" VALUES(10769,41,9.65,30,0.05); +INSERT INTO "Order Details" VALUES(10769,52,7,15,0.05); +INSERT INTO "Order Details" VALUES(10769,61,28.5,20,0); +INSERT INTO "Order Details" VALUES(10769,62,49.3,15,0); +INSERT INTO "Order Details" VALUES(10770,11,21,15,0.25); +INSERT INTO "Order Details" VALUES(10771,71,21.5,16,0); +INSERT INTO "Order Details" VALUES(10772,29,123.79,18,0); + +INSERT INTO "Order Details" VALUES(10772,59,55,25,0); +INSERT INTO "Order Details" VALUES(10773,17,39,33,0); +INSERT INTO "Order Details" VALUES(10773,31,12.5,70,0.2); +INSERT INTO "Order Details" VALUES(10773,75,7.75,7,0.2); +INSERT INTO "Order Details" VALUES(10774,31,12.5,2,0.25); +INSERT INTO "Order Details" VALUES(10774,66,17,50,0); +INSERT INTO "Order Details" VALUES(10775,10,31,6,0); +INSERT INTO "Order Details" VALUES(10775,67,14,3,0); +INSERT INTO "Order Details" VALUES(10776,31,12.5,16,0.05); +INSERT INTO "Order Details" VALUES(10776,42,14,12,0.05); + +INSERT INTO "Order Details" VALUES(10776,45,9.5,27,0.05); +INSERT INTO "Order Details" VALUES(10776,51,53,120,0.05); +INSERT INTO "Order Details" VALUES(10777,42,14,20,0.2); +INSERT INTO "Order Details" VALUES(10778,41,9.65,10,0); +INSERT INTO "Order Details" VALUES(10779,16,17.45,20,0); +INSERT INTO "Order Details" VALUES(10779,62,49.3,20,0); +INSERT INTO "Order Details" VALUES(10780,70,15,35,0); +INSERT INTO "Order Details" VALUES(10780,77,13,15,0); +INSERT INTO "Order Details" VALUES(10781,54,7.45,3,0.2); +INSERT INTO "Order Details" VALUES(10781,56,38,20,0.2); + +INSERT INTO "Order Details" VALUES(10781,74,10,35,0); +INSERT INTO "Order Details" VALUES(10782,31,12.5,1,0); +INSERT INTO "Order Details" VALUES(10783,31,12.5,10,0); +INSERT INTO "Order Details" VALUES(10783,38,263.5,5,0); +INSERT INTO "Order Details" VALUES(10784,36,19,30,0); +INSERT INTO "Order Details" VALUES(10784,39,18,2,0.15); +INSERT INTO "Order Details" VALUES(10784,72,34.8,30,0.15); +INSERT INTO "Order Details" VALUES(10785,10,31,10,0); +INSERT INTO "Order Details" VALUES(10785,75,7.75,10,0); +INSERT INTO "Order Details" VALUES(10786,8,40,30,0.2); + +INSERT INTO "Order Details" VALUES(10786,30,25.89,15,0.2); +INSERT INTO "Order Details" VALUES(10786,75,7.75,42,0.2); +INSERT INTO "Order Details" VALUES(10787,2,19,15,0.05); +INSERT INTO "Order Details" VALUES(10787,29,123.79,20,0.05); +INSERT INTO "Order Details" VALUES(10788,19,9.2,50,0.05); +INSERT INTO "Order Details" VALUES(10788,75,7.75,40,0.05); +INSERT INTO "Order Details" VALUES(10789,18,62.5,30,0); +INSERT INTO "Order Details" VALUES(10789,35,18,15,0); +INSERT INTO "Order Details" VALUES(10789,63,43.9,30,0); +INSERT INTO "Order Details" VALUES(10789,68,12.5,18,0); + +INSERT INTO "Order Details" VALUES(10790,7,30,3,0.15); +INSERT INTO "Order Details" VALUES(10790,56,38,20,0.15); +INSERT INTO "Order Details" VALUES(10791,29,123.79,14,0.05); +INSERT INTO "Order Details" VALUES(10791,41,9.65,20,0.05); +INSERT INTO "Order Details" VALUES(10792,2,19,10,0); +INSERT INTO "Order Details" VALUES(10792,54,7.45,3,0); +INSERT INTO "Order Details" VALUES(10792,68,12.5,15,0); +INSERT INTO "Order Details" VALUES(10793,41,9.65,14,0); +INSERT INTO "Order Details" VALUES(10793,52,7,8,0); +INSERT INTO "Order Details" VALUES(10794,14,23.25,15,0.2); + +INSERT INTO "Order Details" VALUES(10794,54,7.45,6,0.2); +INSERT INTO "Order Details" VALUES(10795,16,17.45,65,0); +INSERT INTO "Order Details" VALUES(10795,17,39,35,0.25); +INSERT INTO "Order Details" VALUES(10796,26,31.23,21,0.2); +INSERT INTO "Order Details" VALUES(10796,44,19.45,10,0); +INSERT INTO "Order Details" VALUES(10796,64,33.25,35,0.2); +INSERT INTO "Order Details" VALUES(10796,69,36,24,0.2); +INSERT INTO "Order Details" VALUES(10797,11,21,20,0); +INSERT INTO "Order Details" VALUES(10798,62,49.3,2,0); +INSERT INTO "Order Details" VALUES(10798,72,34.8,10,0); + +INSERT INTO "Order Details" VALUES(10799,13,6,20,0.15); +INSERT INTO "Order Details" VALUES(10799,24,4.5,20,0.15); +INSERT INTO "Order Details" VALUES(10799,59,55,25,0); +INSERT INTO "Order Details" VALUES(10800,11,21,50,0.1); +INSERT INTO "Order Details" VALUES(10800,51,53,10,0.1); +INSERT INTO "Order Details" VALUES(10800,54,7.45,7,0.1); +INSERT INTO "Order Details" VALUES(10801,17,39,40,0.25); +INSERT INTO "Order Details" VALUES(10801,29,123.79,20,0.25); +INSERT INTO "Order Details" VALUES(10802,30,25.89,25,0.25); +INSERT INTO "Order Details" VALUES(10802,51,53,30,0.25); + +INSERT INTO "Order Details" VALUES(10802,55,24,60,0.25); +INSERT INTO "Order Details" VALUES(10802,62,49.3,5,0.25); +INSERT INTO "Order Details" VALUES(10803,19,9.2,24,0.05); +INSERT INTO "Order Details" VALUES(10803,25,14,15,0.05); +INSERT INTO "Order Details" VALUES(10803,59,55,15,0.05); +INSERT INTO "Order Details" VALUES(10804,10,31,36,0); +INSERT INTO "Order Details" VALUES(10804,28,45.6,24,0); +INSERT INTO "Order Details" VALUES(10804,49,20,4,0.15); +INSERT INTO "Order Details" VALUES(10805,34,14,10,0); +INSERT INTO "Order Details" VALUES(10805,38,263.5,10,0); + +INSERT INTO "Order Details" VALUES(10806,2,19,20,0.25); +INSERT INTO "Order Details" VALUES(10806,65,21.05,2,0); +INSERT INTO "Order Details" VALUES(10806,74,10,15,0.25); +INSERT INTO "Order Details" VALUES(10807,40,18.4,1,0); +INSERT INTO "Order Details" VALUES(10808,56,38,20,0.15); +INSERT INTO "Order Details" VALUES(10808,76,18,50,0.15); +INSERT INTO "Order Details" VALUES(10809,52,7,20,0); +INSERT INTO "Order Details" VALUES(10810,13,6,7,0); +INSERT INTO "Order Details" VALUES(10810,25,14,5,0); +INSERT INTO "Order Details" VALUES(10810,70,15,5,0); + +INSERT INTO "Order Details" VALUES(10811,19,9.2,15,0); +INSERT INTO "Order Details" VALUES(10811,23,9,18,0); +INSERT INTO "Order Details" VALUES(10811,40,18.4,30,0); +INSERT INTO "Order Details" VALUES(10812,31,12.5,16,0.1); +INSERT INTO "Order Details" VALUES(10812,72,34.8,40,0.1); +INSERT INTO "Order Details" VALUES(10812,77,13,20,0); +INSERT INTO "Order Details" VALUES(10813,2,19,12,0.2); +INSERT INTO "Order Details" VALUES(10813,46,12,35,0); +INSERT INTO "Order Details" VALUES(10814,41,9.65,20,0); +INSERT INTO "Order Details" VALUES(10814,43,46,20,0.15); + +INSERT INTO "Order Details" VALUES(10814,48,12.75,8,0.15); +INSERT INTO "Order Details" VALUES(10814,61,28.5,30,0.15); +INSERT INTO "Order Details" VALUES(10815,33,2.5,16,0); +INSERT INTO "Order Details" VALUES(10816,38,263.5,30,0.05); +INSERT INTO "Order Details" VALUES(10816,62,49.3,20,0.05); +INSERT INTO "Order Details" VALUES(10817,26,31.23,40,0.15); +INSERT INTO "Order Details" VALUES(10817,38,263.5,30,0); +INSERT INTO "Order Details" VALUES(10817,40,18.4,60,0.15); +INSERT INTO "Order Details" VALUES(10817,62,49.3,25,0.15); +INSERT INTO "Order Details" VALUES(10818,32,32,20,0); + +INSERT INTO "Order Details" VALUES(10818,41,9.65,20,0); +INSERT INTO "Order Details" VALUES(10819,43,46,7,0); +INSERT INTO "Order Details" VALUES(10819,75,7.75,20,0); +INSERT INTO "Order Details" VALUES(10820,56,38,30,0); +INSERT INTO "Order Details" VALUES(10821,35,18,20,0); +INSERT INTO "Order Details" VALUES(10821,51,53,6,0); +INSERT INTO "Order Details" VALUES(10822,62,49.3,3,0); +INSERT INTO "Order Details" VALUES(10822,70,15,6,0); +INSERT INTO "Order Details" VALUES(10823,11,21,20,0.1); +INSERT INTO "Order Details" VALUES(10823,57,19.5,15,0); + +INSERT INTO "Order Details" VALUES(10823,59,55,40,0.1); +INSERT INTO "Order Details" VALUES(10823,77,13,15,0.1); +INSERT INTO "Order Details" VALUES(10824,41,9.65,12,0); +INSERT INTO "Order Details" VALUES(10824,70,15,9,0); +INSERT INTO "Order Details" VALUES(10825,26,31.23,12,0); +INSERT INTO "Order Details" VALUES(10825,53,32.8,20,0); +INSERT INTO "Order Details" VALUES(10826,31,12.5,35,0); +INSERT INTO "Order Details" VALUES(10826,57,19.5,15,0); +INSERT INTO "Order Details" VALUES(10827,10,31,15,0); +INSERT INTO "Order Details" VALUES(10827,39,18,21,0); + +INSERT INTO "Order Details" VALUES(10828,20,81,5,0); +INSERT INTO "Order Details" VALUES(10828,38,263.5,2,0); +INSERT INTO "Order Details" VALUES(10829,2,19,10,0); +INSERT INTO "Order Details" VALUES(10829,8,40,20,0); +INSERT INTO "Order Details" VALUES(10829,13,6,10,0); +INSERT INTO "Order Details" VALUES(10829,60,34,21,0); +INSERT INTO "Order Details" VALUES(10830,6,25,6,0); +INSERT INTO "Order Details" VALUES(10830,39,18,28,0); +INSERT INTO "Order Details" VALUES(10830,60,34,30,0); +INSERT INTO "Order Details" VALUES(10830,68,12.5,24,0); + +INSERT INTO "Order Details" VALUES(10831,19,9.2,2,0); +INSERT INTO "Order Details" VALUES(10831,35,18,8,0); +INSERT INTO "Order Details" VALUES(10831,38,263.5,8,0); +INSERT INTO "Order Details" VALUES(10831,43,46,9,0); +INSERT INTO "Order Details" VALUES(10832,13,6,3,0.2); +INSERT INTO "Order Details" VALUES(10832,25,14,10,0.2); +INSERT INTO "Order Details" VALUES(10832,44,19.45,16,0.2); +INSERT INTO "Order Details" VALUES(10832,64,33.25,3,0); +INSERT INTO "Order Details" VALUES(10833,7,30,20,0.1); +INSERT INTO "Order Details" VALUES(10833,31,12.5,9,0.1); + +INSERT INTO "Order Details" VALUES(10833,53,32.8,9,0.1); +INSERT INTO "Order Details" VALUES(10834,29,123.79,8,0.05); +INSERT INTO "Order Details" VALUES(10834,30,25.89,20,0.05); +INSERT INTO "Order Details" VALUES(10835,59,55,15,0); +INSERT INTO "Order Details" VALUES(10835,77,13,2,0.2); +INSERT INTO "Order Details" VALUES(10836,22,21,52,0); +INSERT INTO "Order Details" VALUES(10836,35,18,6,0); +INSERT INTO "Order Details" VALUES(10836,57,19.5,24,0); +INSERT INTO "Order Details" VALUES(10836,60,34,60,0); +INSERT INTO "Order Details" VALUES(10836,64,33.25,30,0); + +INSERT INTO "Order Details" VALUES(10837,13,6,6,0); +INSERT INTO "Order Details" VALUES(10837,40,18.4,25,0); +INSERT INTO "Order Details" VALUES(10837,47,9.5,40,0.25); +INSERT INTO "Order Details" VALUES(10837,76,18,21,0.25); +INSERT INTO "Order Details" VALUES(10838,1,18,4,0.25); +INSERT INTO "Order Details" VALUES(10838,18,62.5,25,0.25); +INSERT INTO "Order Details" VALUES(10838,36,19,50,0.25); +INSERT INTO "Order Details" VALUES(10839,58,13.25,30,0.1); +INSERT INTO "Order Details" VALUES(10839,72,34.8,15,0.1); +INSERT INTO "Order Details" VALUES(10840,25,14,6,0.2); + +INSERT INTO "Order Details" VALUES(10840,39,18,10,0.2); +INSERT INTO "Order Details" VALUES(10841,10,31,16,0); +INSERT INTO "Order Details" VALUES(10841,56,38,30,0); +INSERT INTO "Order Details" VALUES(10841,59,55,50,0); +INSERT INTO "Order Details" VALUES(10841,77,13,15,0); +INSERT INTO "Order Details" VALUES(10842,11,21,15,0); +INSERT INTO "Order Details" VALUES(10842,43,46,5,0); +INSERT INTO "Order Details" VALUES(10842,68,12.5,20,0); +INSERT INTO "Order Details" VALUES(10842,70,15,12,0); +INSERT INTO "Order Details" VALUES(10843,51,53,4,0.25); + +INSERT INTO "Order Details" VALUES(10844,22,21,35,0); +INSERT INTO "Order Details" VALUES(10845,23,9,70,0.1); +INSERT INTO "Order Details" VALUES(10845,35,18,25,0.1); +INSERT INTO "Order Details" VALUES(10845,42,14,42,0.1); +INSERT INTO "Order Details" VALUES(10845,58,13.25,60,0.1); +INSERT INTO "Order Details" VALUES(10845,64,33.25,48,0); +INSERT INTO "Order Details" VALUES(10846,4,22,21,0); +INSERT INTO "Order Details" VALUES(10846,70,15,30,0); +INSERT INTO "Order Details" VALUES(10846,74,10,20,0); +INSERT INTO "Order Details" VALUES(10847,1,18,80,0.2); + +INSERT INTO "Order Details" VALUES(10847,19,9.2,12,0.2); +INSERT INTO "Order Details" VALUES(10847,37,26,60,0.2); +INSERT INTO "Order Details" VALUES(10847,45,9.5,36,0.2); +INSERT INTO "Order Details" VALUES(10847,60,34,45,0.2); +INSERT INTO "Order Details" VALUES(10847,71,21.5,55,0.2); +INSERT INTO "Order Details" VALUES(10848,5,21.35,30,0); +INSERT INTO "Order Details" VALUES(10848,9,97,3,0); +INSERT INTO "Order Details" VALUES(10849,3,10,49,0); +INSERT INTO "Order Details" VALUES(10849,26,31.23,18,0.15); +INSERT INTO "Order Details" VALUES(10850,25,14,20,0.15); + +INSERT INTO "Order Details" VALUES(10850,33,2.5,4,0.15); +INSERT INTO "Order Details" VALUES(10850,70,15,30,0.15); +INSERT INTO "Order Details" VALUES(10851,2,19,5,0.05); +INSERT INTO "Order Details" VALUES(10851,25,14,10,0.05); +INSERT INTO "Order Details" VALUES(10851,57,19.5,10,0.05); +INSERT INTO "Order Details" VALUES(10851,59,55,42,0.05); +INSERT INTO "Order Details" VALUES(10852,2,19,15,0); +INSERT INTO "Order Details" VALUES(10852,17,39,6,0); +INSERT INTO "Order Details" VALUES(10852,62,49.3,50,0); +INSERT INTO "Order Details" VALUES(10853,18,62.5,10,0); + +INSERT INTO "Order Details" VALUES(10854,10,31,100,0.15); +INSERT INTO "Order Details" VALUES(10854,13,6,65,0.15); +INSERT INTO "Order Details" VALUES(10855,16,17.45,50,0); +INSERT INTO "Order Details" VALUES(10855,31,12.5,14,0); +INSERT INTO "Order Details" VALUES(10855,56,38,24,0); +INSERT INTO "Order Details" VALUES(10855,65,21.05,15,0.15); +INSERT INTO "Order Details" VALUES(10856,2,19,20,0); +INSERT INTO "Order Details" VALUES(10856,42,14,20,0); +INSERT INTO "Order Details" VALUES(10857,3,10,30,0); +INSERT INTO "Order Details" VALUES(10857,26,31.23,35,0.25); + +INSERT INTO "Order Details" VALUES(10857,29,123.79,10,0.25); +INSERT INTO "Order Details" VALUES(10858,7,30,5,0); +INSERT INTO "Order Details" VALUES(10858,27,43.9,10,0); +INSERT INTO "Order Details" VALUES(10858,70,15,4,0); +INSERT INTO "Order Details" VALUES(10859,24,4.5,40,0.25); +INSERT INTO "Order Details" VALUES(10859,54,7.45,35,0.25); +INSERT INTO "Order Details" VALUES(10859,64,33.25,30,0.25); +INSERT INTO "Order Details" VALUES(10860,51,53,3,0); +INSERT INTO "Order Details" VALUES(10860,76,18,20,0); +INSERT INTO "Order Details" VALUES(10861,17,39,42,0); + +INSERT INTO "Order Details" VALUES(10861,18,62.5,20,0); +INSERT INTO "Order Details" VALUES(10861,21,10,40,0); +INSERT INTO "Order Details" VALUES(10861,33,2.5,35,0); +INSERT INTO "Order Details" VALUES(10861,62,49.3,3,0); +INSERT INTO "Order Details" VALUES(10862,11,21,25,0); +INSERT INTO "Order Details" VALUES(10862,52,7,8,0); +INSERT INTO "Order Details" VALUES(10863,1,18,20,0.15); +INSERT INTO "Order Details" VALUES(10863,58,13.25,12,0.15); +INSERT INTO "Order Details" VALUES(10864,35,18,4,0); +INSERT INTO "Order Details" VALUES(10864,67,14,15,0); + +INSERT INTO "Order Details" VALUES(10865,38,263.5,60,0.05); +INSERT INTO "Order Details" VALUES(10865,39,18,80,0.05); +INSERT INTO "Order Details" VALUES(10866,2,19,21,0.25); +INSERT INTO "Order Details" VALUES(10866,24,4.5,6,0.25); +INSERT INTO "Order Details" VALUES(10866,30,25.89,40,0.25); +INSERT INTO "Order Details" VALUES(10867,53,32.8,3,0); +INSERT INTO "Order Details" VALUES(10868,26,31.23,20,0); +INSERT INTO "Order Details" VALUES(10868,35,18,30,0); +INSERT INTO "Order Details" VALUES(10868,49,20,42,0.1); +INSERT INTO "Order Details" VALUES(10869,1,18,40,0); + +INSERT INTO "Order Details" VALUES(10869,11,21,10,0); +INSERT INTO "Order Details" VALUES(10869,23,9,50,0); +INSERT INTO "Order Details" VALUES(10869,68,12.5,20,0); +INSERT INTO "Order Details" VALUES(10870,35,18,3,0); +INSERT INTO "Order Details" VALUES(10870,51,53,2,0); +INSERT INTO "Order Details" VALUES(10871,6,25,50,0.05); +INSERT INTO "Order Details" VALUES(10871,16,17.45,12,0.05); +INSERT INTO "Order Details" VALUES(10871,17,39,16,0.05); +INSERT INTO "Order Details" VALUES(10872,55,24,10,0.05); +INSERT INTO "Order Details" VALUES(10872,62,49.3,20,0.05); + +INSERT INTO "Order Details" VALUES(10872,64,33.25,15,0.05); +INSERT INTO "Order Details" VALUES(10872,65,21.05,21,0.05); +INSERT INTO "Order Details" VALUES(10873,21,10,20,0); +INSERT INTO "Order Details" VALUES(10873,28,45.6,3,0); +INSERT INTO "Order Details" VALUES(10874,10,31,10,0); +INSERT INTO "Order Details" VALUES(10875,19,9.2,25,0); +INSERT INTO "Order Details" VALUES(10875,47,9.5,21,0.1); +INSERT INTO "Order Details" VALUES(10875,49,20,15,0); +INSERT INTO "Order Details" VALUES(10876,46,12,21,0); +INSERT INTO "Order Details" VALUES(10876,64,33.25,20,0); + +INSERT INTO "Order Details" VALUES(10877,16,17.45,30,0.25); +INSERT INTO "Order Details" VALUES(10877,18,62.5,25,0); +INSERT INTO "Order Details" VALUES(10878,20,81,20,0.05); +INSERT INTO "Order Details" VALUES(10879,40,18.4,12,0); +INSERT INTO "Order Details" VALUES(10879,65,21.05,10,0); +INSERT INTO "Order Details" VALUES(10879,76,18,10,0); +INSERT INTO "Order Details" VALUES(10880,23,9,30,0.2); +INSERT INTO "Order Details" VALUES(10880,61,28.5,30,0.2); +INSERT INTO "Order Details" VALUES(10880,70,15,50,0.2); +INSERT INTO "Order Details" VALUES(10881,73,15,10,0); + +INSERT INTO "Order Details" VALUES(10882,42,14,25,0); +INSERT INTO "Order Details" VALUES(10882,49,20,20,0.15); +INSERT INTO "Order Details" VALUES(10882,54,7.45,32,0.15); +INSERT INTO "Order Details" VALUES(10883,24,4.5,8,0); +INSERT INTO "Order Details" VALUES(10884,21,10,40,0.05); +INSERT INTO "Order Details" VALUES(10884,56,38,21,0.05); +INSERT INTO "Order Details" VALUES(10884,65,21.05,12,0.05); +INSERT INTO "Order Details" VALUES(10885,2,19,20,0); +INSERT INTO "Order Details" VALUES(10885,24,4.5,12,0); +INSERT INTO "Order Details" VALUES(10885,70,15,30,0); + +INSERT INTO "Order Details" VALUES(10885,77,13,25,0); +INSERT INTO "Order Details" VALUES(10886,10,31,70,0); +INSERT INTO "Order Details" VALUES(10886,31,12.5,35,0); +INSERT INTO "Order Details" VALUES(10886,77,13,40,0); +INSERT INTO "Order Details" VALUES(10887,25,14,5,0); +INSERT INTO "Order Details" VALUES(10888,2,19,20,0); +INSERT INTO "Order Details" VALUES(10888,68,12.5,18,0); +INSERT INTO "Order Details" VALUES(10889,11,21,40,0); +INSERT INTO "Order Details" VALUES(10889,38,263.5,40,0); +INSERT INTO "Order Details" VALUES(10890,17,39,15,0); + +INSERT INTO "Order Details" VALUES(10890,34,14,10,0); +INSERT INTO "Order Details" VALUES(10890,41,9.65,14,0); +INSERT INTO "Order Details" VALUES(10891,30,25.89,15,0.05); +INSERT INTO "Order Details" VALUES(10892,59,55,40,0.05); +INSERT INTO "Order Details" VALUES(10893,8,40,30,0); +INSERT INTO "Order Details" VALUES(10893,24,4.5,10,0); +INSERT INTO "Order Details" VALUES(10893,29,123.79,24,0); +INSERT INTO "Order Details" VALUES(10893,30,25.89,35,0); +INSERT INTO "Order Details" VALUES(10893,36,19,20,0); +INSERT INTO "Order Details" VALUES(10894,13,6,28,0.05); + +INSERT INTO "Order Details" VALUES(10894,69,36,50,0.05); +INSERT INTO "Order Details" VALUES(10894,75,7.75,120,0.05); +INSERT INTO "Order Details" VALUES(10895,24,4.5,110,0); +INSERT INTO "Order Details" VALUES(10895,39,18,45,0); +INSERT INTO "Order Details" VALUES(10895,40,18.4,91,0); +INSERT INTO "Order Details" VALUES(10895,60,34,100,0); +INSERT INTO "Order Details" VALUES(10896,45,9.5,15,0); +INSERT INTO "Order Details" VALUES(10896,56,38,16,0); +INSERT INTO "Order Details" VALUES(10897,29,123.79,80,0); +INSERT INTO "Order Details" VALUES(10897,30,25.89,36,0); + +INSERT INTO "Order Details" VALUES(10898,13,6,5,0); +INSERT INTO "Order Details" VALUES(10899,39,18,8,0.15); +INSERT INTO "Order Details" VALUES(10900,70,15,3,0.25); +INSERT INTO "Order Details" VALUES(10901,41,9.65,30,0); +INSERT INTO "Order Details" VALUES(10901,71,21.5,30,0); +INSERT INTO "Order Details" VALUES(10902,55,24,30,0.15); +INSERT INTO "Order Details" VALUES(10902,62,49.3,6,0.15); +INSERT INTO "Order Details" VALUES(10903,13,6,40,0); +INSERT INTO "Order Details" VALUES(10903,65,21.05,21,0); +INSERT INTO "Order Details" VALUES(10903,68,12.5,20,0); + +INSERT INTO "Order Details" VALUES(10904,58,13.25,15,0); +INSERT INTO "Order Details" VALUES(10904,62,49.3,35,0); +INSERT INTO "Order Details" VALUES(10905,1,18,20,0.05); +INSERT INTO "Order Details" VALUES(10906,61,28.5,15,0); +INSERT INTO "Order Details" VALUES(10907,75,7.75,14,0); +INSERT INTO "Order Details" VALUES(10908,7,30,20,0.05); +INSERT INTO "Order Details" VALUES(10908,52,7,14,0.05); +INSERT INTO "Order Details" VALUES(10909,7,30,12,0); +INSERT INTO "Order Details" VALUES(10909,16,17.45,15,0); +INSERT INTO "Order Details" VALUES(10909,41,9.65,5,0); + +INSERT INTO "Order Details" VALUES(10910,19,9.2,12,0); +INSERT INTO "Order Details" VALUES(10910,49,20,10,0); +INSERT INTO "Order Details" VALUES(10910,61,28.5,5,0); +INSERT INTO "Order Details" VALUES(10911,1,18,10,0); +INSERT INTO "Order Details" VALUES(10911,17,39,12,0); +INSERT INTO "Order Details" VALUES(10911,67,14,15,0); +INSERT INTO "Order Details" VALUES(10912,11,21,40,0.25); +INSERT INTO "Order Details" VALUES(10912,29,123.79,60,0.25); +INSERT INTO "Order Details" VALUES(10913,4,22,30,0.25); +INSERT INTO "Order Details" VALUES(10913,33,2.5,40,0.25); + +INSERT INTO "Order Details" VALUES(10913,58,13.25,15,0); +INSERT INTO "Order Details" VALUES(10914,71,21.5,25,0); +INSERT INTO "Order Details" VALUES(10915,17,39,10,0); +INSERT INTO "Order Details" VALUES(10915,33,2.5,30,0); +INSERT INTO "Order Details" VALUES(10915,54,7.45,10,0); +INSERT INTO "Order Details" VALUES(10916,16,17.45,6,0); +INSERT INTO "Order Details" VALUES(10916,32,32,6,0); +INSERT INTO "Order Details" VALUES(10916,57,19.5,20,0); +INSERT INTO "Order Details" VALUES(10917,30,25.89,1,0); +INSERT INTO "Order Details" VALUES(10917,60,34,10,0); + +INSERT INTO "Order Details" VALUES(10918,1,18,60,0.25); +INSERT INTO "Order Details" VALUES(10918,60,34,25,0.25); +INSERT INTO "Order Details" VALUES(10919,16,17.45,24,0); +INSERT INTO "Order Details" VALUES(10919,25,14,24,0); +INSERT INTO "Order Details" VALUES(10919,40,18.4,20,0); +INSERT INTO "Order Details" VALUES(10920,50,16.25,24,0); +INSERT INTO "Order Details" VALUES(10921,35,18,10,0); +INSERT INTO "Order Details" VALUES(10921,63,43.9,40,0); +INSERT INTO "Order Details" VALUES(10922,17,39,15,0); +INSERT INTO "Order Details" VALUES(10922,24,4.5,35,0); + +INSERT INTO "Order Details" VALUES(10923,42,14,10,0.2); +INSERT INTO "Order Details" VALUES(10923,43,46,10,0.2); +INSERT INTO "Order Details" VALUES(10923,67,14,24,0.2); +INSERT INTO "Order Details" VALUES(10924,10,31,20,0.1); +INSERT INTO "Order Details" VALUES(10924,28,45.6,30,0.1); +INSERT INTO "Order Details" VALUES(10924,75,7.75,6,0); +INSERT INTO "Order Details" VALUES(10925,36,19,25,0.15); +INSERT INTO "Order Details" VALUES(10925,52,7,12,0.15); +INSERT INTO "Order Details" VALUES(10926,11,21,2,0); +INSERT INTO "Order Details" VALUES(10926,13,6,10,0); + +INSERT INTO "Order Details" VALUES(10926,19,9.2,7,0); +INSERT INTO "Order Details" VALUES(10926,72,34.8,10,0); +INSERT INTO "Order Details" VALUES(10927,20,81,5,0); +INSERT INTO "Order Details" VALUES(10927,52,7,5,0); +INSERT INTO "Order Details" VALUES(10927,76,18,20,0); +INSERT INTO "Order Details" VALUES(10928,47,9.5,5,0); +INSERT INTO "Order Details" VALUES(10928,76,18,5,0); +INSERT INTO "Order Details" VALUES(10929,21,10,60,0); +INSERT INTO "Order Details" VALUES(10929,75,7.75,49,0); +INSERT INTO "Order Details" VALUES(10929,77,13,15,0); + +INSERT INTO "Order Details" VALUES(10930,21,10,36,0); +INSERT INTO "Order Details" VALUES(10930,27,43.9,25,0); +INSERT INTO "Order Details" VALUES(10930,55,24,25,0.2); +INSERT INTO "Order Details" VALUES(10930,58,13.25,30,0.2); +INSERT INTO "Order Details" VALUES(10931,13,6,42,0.15); +INSERT INTO "Order Details" VALUES(10931,57,19.5,30,0); +INSERT INTO "Order Details" VALUES(10932,16,17.45,30,0.1); +INSERT INTO "Order Details" VALUES(10932,62,49.3,14,0.1); +INSERT INTO "Order Details" VALUES(10932,72,34.8,16,0); +INSERT INTO "Order Details" VALUES(10932,75,7.75,20,0.1); + +INSERT INTO "Order Details" VALUES(10933,53,32.8,2,0); +INSERT INTO "Order Details" VALUES(10933,61,28.5,30,0); +INSERT INTO "Order Details" VALUES(10934,6,25,20,0); +INSERT INTO "Order Details" VALUES(10935,1,18,21,0); +INSERT INTO "Order Details" VALUES(10935,18,62.5,4,0.25); +INSERT INTO "Order Details" VALUES(10935,23,9,8,0.25); +INSERT INTO "Order Details" VALUES(10936,36,19,30,0.2); +INSERT INTO "Order Details" VALUES(10937,28,45.6,8,0); +INSERT INTO "Order Details" VALUES(10937,34,14,20,0); +INSERT INTO "Order Details" VALUES(10938,13,6,20,0.25); + +INSERT INTO "Order Details" VALUES(10938,43,46,24,0.25); +INSERT INTO "Order Details" VALUES(10938,60,34,49,0.25); +INSERT INTO "Order Details" VALUES(10938,71,21.5,35,0.25); +INSERT INTO "Order Details" VALUES(10939,2,19,10,0.15); +INSERT INTO "Order Details" VALUES(10939,67,14,40,0.15); +INSERT INTO "Order Details" VALUES(10940,7,30,8,0); +INSERT INTO "Order Details" VALUES(10940,13,6,20,0); +INSERT INTO "Order Details" VALUES(10941,31,12.5,44,0.25); +INSERT INTO "Order Details" VALUES(10941,62,49.3,30,0.25); +INSERT INTO "Order Details" VALUES(10941,68,12.5,80,0.25); + +INSERT INTO "Order Details" VALUES(10941,72,34.8,50,0); +INSERT INTO "Order Details" VALUES(10942,49,20,28,0); +INSERT INTO "Order Details" VALUES(10943,13,6,15,0); +INSERT INTO "Order Details" VALUES(10943,22,21,21,0); +INSERT INTO "Order Details" VALUES(10943,46,12,15,0); +INSERT INTO "Order Details" VALUES(10944,11,21,5,0.25); +INSERT INTO "Order Details" VALUES(10944,44,19.45,18,0.25); +INSERT INTO "Order Details" VALUES(10944,56,38,18,0); +INSERT INTO "Order Details" VALUES(10945,13,6,20,0); +INSERT INTO "Order Details" VALUES(10945,31,12.5,10,0); + +INSERT INTO "Order Details" VALUES(10946,10,31,25,0); +INSERT INTO "Order Details" VALUES(10946,24,4.5,25,0); +INSERT INTO "Order Details" VALUES(10946,77,13,40,0); +INSERT INTO "Order Details" VALUES(10947,59,55,4,0); +INSERT INTO "Order Details" VALUES(10948,50,16.25,9,0); +INSERT INTO "Order Details" VALUES(10948,51,53,40,0); +INSERT INTO "Order Details" VALUES(10948,55,24,4,0); +INSERT INTO "Order Details" VALUES(10949,6,25,12,0); +INSERT INTO "Order Details" VALUES(10949,10,31,30,0); +INSERT INTO "Order Details" VALUES(10949,17,39,6,0); + +INSERT INTO "Order Details" VALUES(10949,62,49.3,60,0); +INSERT INTO "Order Details" VALUES(10950,4,22,5,0); +INSERT INTO "Order Details" VALUES(10951,33,2.5,15,0.05); +INSERT INTO "Order Details" VALUES(10951,41,9.65,6,0.05); +INSERT INTO "Order Details" VALUES(10951,75,7.75,50,0.05); +INSERT INTO "Order Details" VALUES(10952,6,25,16,0.05); +INSERT INTO "Order Details" VALUES(10952,28,45.6,2,0); +INSERT INTO "Order Details" VALUES(10953,20,81,50,0.05); +INSERT INTO "Order Details" VALUES(10953,31,12.5,50,0.05); +INSERT INTO "Order Details" VALUES(10954,16,17.45,28,0.15); + +INSERT INTO "Order Details" VALUES(10954,31,12.5,25,0.15); +INSERT INTO "Order Details" VALUES(10954,45,9.5,30,0); +INSERT INTO "Order Details" VALUES(10954,60,34,24,0.15); +INSERT INTO "Order Details" VALUES(10955,75,7.75,12,0.2); +INSERT INTO "Order Details" VALUES(10956,21,10,12,0); +INSERT INTO "Order Details" VALUES(10956,47,9.5,14,0); +INSERT INTO "Order Details" VALUES(10956,51,53,8,0); +INSERT INTO "Order Details" VALUES(10957,30,25.89,30,0); +INSERT INTO "Order Details" VALUES(10957,35,18,40,0); +INSERT INTO "Order Details" VALUES(10957,64,33.25,8,0); + +INSERT INTO "Order Details" VALUES(10958,5,21.35,20,0); +INSERT INTO "Order Details" VALUES(10958,7,30,6,0); +INSERT INTO "Order Details" VALUES(10958,72,34.8,5,0); +INSERT INTO "Order Details" VALUES(10959,75,7.75,20,0.15); +INSERT INTO "Order Details" VALUES(10960,24,4.5,10,0.25); +INSERT INTO "Order Details" VALUES(10960,41,9.65,24,0); +INSERT INTO "Order Details" VALUES(10961,52,7,6,0.05); +INSERT INTO "Order Details" VALUES(10961,76,18,60,0); +INSERT INTO "Order Details" VALUES(10962,7,30,45,0); +INSERT INTO "Order Details" VALUES(10962,13,6,77,0); + +INSERT INTO "Order Details" VALUES(10962,53,32.8,20,0); +INSERT INTO "Order Details" VALUES(10962,69,36,9,0); +INSERT INTO "Order Details" VALUES(10962,76,18,44,0); +INSERT INTO "Order Details" VALUES(10963,60,34,2,0.15); +INSERT INTO "Order Details" VALUES(10964,18,62.5,6,0); +INSERT INTO "Order Details" VALUES(10964,38,263.5,5,0); +INSERT INTO "Order Details" VALUES(10964,69,36,10,0); +INSERT INTO "Order Details" VALUES(10965,51,53,16,0); +INSERT INTO "Order Details" VALUES(10966,37,26,8,0); +INSERT INTO "Order Details" VALUES(10966,56,38,12,0.15); + +INSERT INTO "Order Details" VALUES(10966,62,49.3,12,0.15); +INSERT INTO "Order Details" VALUES(10967,19,9.2,12,0); +INSERT INTO "Order Details" VALUES(10967,49,20,40,0); +INSERT INTO "Order Details" VALUES(10968,12,38,30,0); +INSERT INTO "Order Details" VALUES(10968,24,4.5,30,0); +INSERT INTO "Order Details" VALUES(10968,64,33.25,4,0); +INSERT INTO "Order Details" VALUES(10969,46,12,9,0); +INSERT INTO "Order Details" VALUES(10970,52,7,40,0.2); +INSERT INTO "Order Details" VALUES(10971,29,123.79,14,0); +INSERT INTO "Order Details" VALUES(10972,17,39,6,0); + +INSERT INTO "Order Details" VALUES(10972,33,2.5,7,0); +INSERT INTO "Order Details" VALUES(10973,26,31.23,5,0); +INSERT INTO "Order Details" VALUES(10973,41,9.65,6,0); +INSERT INTO "Order Details" VALUES(10973,75,7.75,10,0); +INSERT INTO "Order Details" VALUES(10974,63,43.9,10,0); +INSERT INTO "Order Details" VALUES(10975,8,40,16,0); +INSERT INTO "Order Details" VALUES(10975,75,7.75,10,0); +INSERT INTO "Order Details" VALUES(10976,28,45.6,20,0); +INSERT INTO "Order Details" VALUES(10977,39,18,30,0); +INSERT INTO "Order Details" VALUES(10977,47,9.5,30,0); + +INSERT INTO "Order Details" VALUES(10977,51,53,10,0); +INSERT INTO "Order Details" VALUES(10977,63,43.9,20,0); +INSERT INTO "Order Details" VALUES(10978,8,40,20,0.15); +INSERT INTO "Order Details" VALUES(10978,21,10,40,0.15); +INSERT INTO "Order Details" VALUES(10978,40,18.4,10,0); +INSERT INTO "Order Details" VALUES(10978,44,19.45,6,0.15); +INSERT INTO "Order Details" VALUES(10979,7,30,18,0); +INSERT INTO "Order Details" VALUES(10979,12,38,20,0); +INSERT INTO "Order Details" VALUES(10979,24,4.5,80,0); +INSERT INTO "Order Details" VALUES(10979,27,43.9,30,0); + +INSERT INTO "Order Details" VALUES(10979,31,12.5,24,0); +INSERT INTO "Order Details" VALUES(10979,63,43.9,35,0); +INSERT INTO "Order Details" VALUES(10980,75,7.75,40,0.2); +INSERT INTO "Order Details" VALUES(10981,38,263.5,60,0); +INSERT INTO "Order Details" VALUES(10982,7,30,20,0); +INSERT INTO "Order Details" VALUES(10982,43,46,9,0); +INSERT INTO "Order Details" VALUES(10983,13,6,84,0.15); +INSERT INTO "Order Details" VALUES(10983,57,19.5,15,0); +INSERT INTO "Order Details" VALUES(10984,16,17.45,55,0); +INSERT INTO "Order Details" VALUES(10984,24,4.5,20,0); + +INSERT INTO "Order Details" VALUES(10984,36,19,40,0); +INSERT INTO "Order Details" VALUES(10985,16,17.45,36,0.1); +INSERT INTO "Order Details" VALUES(10985,18,62.5,8,0.1); +INSERT INTO "Order Details" VALUES(10985,32,32,35,0.1); +INSERT INTO "Order Details" VALUES(10986,11,21,30,0); +INSERT INTO "Order Details" VALUES(10986,20,81,15,0); +INSERT INTO "Order Details" VALUES(10986,76,18,10,0); +INSERT INTO "Order Details" VALUES(10986,77,13,15,0); +INSERT INTO "Order Details" VALUES(10987,7,30,60,0); +INSERT INTO "Order Details" VALUES(10987,43,46,6,0); + +INSERT INTO "Order Details" VALUES(10987,72,34.8,20,0); +INSERT INTO "Order Details" VALUES(10988,7,30,60,0); +INSERT INTO "Order Details" VALUES(10988,62,49.3,40,0.1); +INSERT INTO "Order Details" VALUES(10989,6,25,40,0); +INSERT INTO "Order Details" VALUES(10989,11,21,15,0); +INSERT INTO "Order Details" VALUES(10989,41,9.65,4,0); +INSERT INTO "Order Details" VALUES(10990,21,10,65,0); +INSERT INTO "Order Details" VALUES(10990,34,14,60,0.15); +INSERT INTO "Order Details" VALUES(10990,55,24,65,0.15); +INSERT INTO "Order Details" VALUES(10990,61,28.5,66,0.15); + +INSERT INTO "Order Details" VALUES(10991,2,19,50,0.2); +INSERT INTO "Order Details" VALUES(10991,70,15,20,0.2); +INSERT INTO "Order Details" VALUES(10991,76,18,90,0.2); +INSERT INTO "Order Details" VALUES(10992,72,34.8,2,0); +INSERT INTO "Order Details" VALUES(10993,29,123.79,50,0.25); +INSERT INTO "Order Details" VALUES(10993,41,9.65,35,0.25); +INSERT INTO "Order Details" VALUES(10994,59,55,18,0.05); +INSERT INTO "Order Details" VALUES(10995,51,53,20,0); +INSERT INTO "Order Details" VALUES(10995,60,34,4,0); +INSERT INTO "Order Details" VALUES(10996,42,14,40,0); + +INSERT INTO "Order Details" VALUES(10997,32,32,50,0); +INSERT INTO "Order Details" VALUES(10997,46,12,20,0.25); +INSERT INTO "Order Details" VALUES(10997,52,7,20,0.25); +INSERT INTO "Order Details" VALUES(10998,24,4.5,12,0); +INSERT INTO "Order Details" VALUES(10998,61,28.5,7,0); +INSERT INTO "Order Details" VALUES(10998,74,10,20,0); +INSERT INTO "Order Details" VALUES(10998,75,7.75,30,0); +INSERT INTO "Order Details" VALUES(10999,41,9.65,20,0.05); +INSERT INTO "Order Details" VALUES(10999,51,53,15,0.05); +INSERT INTO "Order Details" VALUES(10999,77,13,21,0.05); + +INSERT INTO "Order Details" VALUES(11000,4,22,25,0.25); +INSERT INTO "Order Details" VALUES(11000,24,4.5,30,0.25); +INSERT INTO "Order Details" VALUES(11000,77,13,30,0); +INSERT INTO "Order Details" VALUES(11001,7,30,60,0); +INSERT INTO "Order Details" VALUES(11001,22,21,25,0); +INSERT INTO "Order Details" VALUES(11001,46,12,25,0); +INSERT INTO "Order Details" VALUES(11001,55,24,6,0); +INSERT INTO "Order Details" VALUES(11002,13,6,56,0); +INSERT INTO "Order Details" VALUES(11002,35,18,15,0.15); +INSERT INTO "Order Details" VALUES(11002,42,14,24,0.15); + +INSERT INTO "Order Details" VALUES(11002,55,24,40,0); +INSERT INTO "Order Details" VALUES(11003,1,18,4,0); +INSERT INTO "Order Details" VALUES(11003,40,18.4,10,0); +INSERT INTO "Order Details" VALUES(11003,52,7,10,0); +INSERT INTO "Order Details" VALUES(11004,26,31.23,6,0); +INSERT INTO "Order Details" VALUES(11004,76,18,6,0); +INSERT INTO "Order Details" VALUES(11005,1,18,2,0); +INSERT INTO "Order Details" VALUES(11005,59,55,10,0); +INSERT INTO "Order Details" VALUES(11006,1,18,8,0); +INSERT INTO "Order Details" VALUES(11006,29,123.79,2,0.25); + +INSERT INTO "Order Details" VALUES(11007,8,40,30,0); +INSERT INTO "Order Details" VALUES(11007,29,123.79,10,0); +INSERT INTO "Order Details" VALUES(11007,42,14,14,0); +INSERT INTO "Order Details" VALUES(11008,28,45.6,70,0.05); +INSERT INTO "Order Details" VALUES(11008,34,14,90,0.05); +INSERT INTO "Order Details" VALUES(11008,71,21.5,21,0); +INSERT INTO "Order Details" VALUES(11009,24,4.5,12,0); +INSERT INTO "Order Details" VALUES(11009,36,19,18,0.25); +INSERT INTO "Order Details" VALUES(11009,60,34,9,0); +INSERT INTO "Order Details" VALUES(11010,7,30,20,0); + +INSERT INTO "Order Details" VALUES(11010,24,4.5,10,0); +INSERT INTO "Order Details" VALUES(11011,58,13.25,40,0.05); +INSERT INTO "Order Details" VALUES(11011,71,21.5,20,0); +INSERT INTO "Order Details" VALUES(11012,19,9.2,50,0.05); +INSERT INTO "Order Details" VALUES(11012,60,34,36,0.05); +INSERT INTO "Order Details" VALUES(11012,71,21.5,60,0.05); +INSERT INTO "Order Details" VALUES(11013,23,9,10,0); +INSERT INTO "Order Details" VALUES(11013,42,14,4,0); +INSERT INTO "Order Details" VALUES(11013,45,9.5,20,0); +INSERT INTO "Order Details" VALUES(11013,68,12.5,2,0); + +INSERT INTO "Order Details" VALUES(11014,41,9.65,28,0.1); +INSERT INTO "Order Details" VALUES(11015,30,25.89,15,0); +INSERT INTO "Order Details" VALUES(11015,77,13,18,0); +INSERT INTO "Order Details" VALUES(11016,31,12.5,15,0); +INSERT INTO "Order Details" VALUES(11016,36,19,16,0); +INSERT INTO "Order Details" VALUES(11017,3,10,25,0); +INSERT INTO "Order Details" VALUES(11017,59,55,110,0); +INSERT INTO "Order Details" VALUES(11017,70,15,30,0); +INSERT INTO "Order Details" VALUES(11018,12,38,20,0); +INSERT INTO "Order Details" VALUES(11018,18,62.5,10,0); + +INSERT INTO "Order Details" VALUES(11018,56,38,5,0); +INSERT INTO "Order Details" VALUES(11019,46,12,3,0); +INSERT INTO "Order Details" VALUES(11019,49,20,2,0); +INSERT INTO "Order Details" VALUES(11020,10,31,24,0.15); +INSERT INTO "Order Details" VALUES(11021,2,19,11,0.25); +INSERT INTO "Order Details" VALUES(11021,20,81,15,0); +INSERT INTO "Order Details" VALUES(11021,26,31.23,63,0); +INSERT INTO "Order Details" VALUES(11021,51,53,44,0.25); +INSERT INTO "Order Details" VALUES(11021,72,34.8,35,0); +INSERT INTO "Order Details" VALUES(11022,19,9.2,35,0); + +INSERT INTO "Order Details" VALUES(11022,69,36,30,0); +INSERT INTO "Order Details" VALUES(11023,7,30,4,0); +INSERT INTO "Order Details" VALUES(11023,43,46,30,0); +INSERT INTO "Order Details" VALUES(11024,26,31.23,12,0); +INSERT INTO "Order Details" VALUES(11024,33,2.5,30,0); +INSERT INTO "Order Details" VALUES(11024,65,21.05,21,0); +INSERT INTO "Order Details" VALUES(11024,71,21.5,50,0); +INSERT INTO "Order Details" VALUES(11025,1,18,10,0.1); +INSERT INTO "Order Details" VALUES(11025,13,6,20,0.1); +INSERT INTO "Order Details" VALUES(11026,18,62.5,8,0); + +INSERT INTO "Order Details" VALUES(11026,51,53,10,0); +INSERT INTO "Order Details" VALUES(11027,24,4.5,30,0.25); +INSERT INTO "Order Details" VALUES(11027,62,49.3,21,0.25); +INSERT INTO "Order Details" VALUES(11028,55,24,35,0); +INSERT INTO "Order Details" VALUES(11028,59,55,24,0); +INSERT INTO "Order Details" VALUES(11029,56,38,20,0); +INSERT INTO "Order Details" VALUES(11029,63,43.9,12,0); +INSERT INTO "Order Details" VALUES(11030,2,19,100,0.25); +INSERT INTO "Order Details" VALUES(11030,5,21.35,70,0); +INSERT INTO "Order Details" VALUES(11030,29,123.79,60,0.25); + +INSERT INTO "Order Details" VALUES(11030,59,55,100,0.25); +INSERT INTO "Order Details" VALUES(11031,1,18,45,0); +INSERT INTO "Order Details" VALUES(11031,13,6,80,0); +INSERT INTO "Order Details" VALUES(11031,24,4.5,21,0); +INSERT INTO "Order Details" VALUES(11031,64,33.25,20,0); +INSERT INTO "Order Details" VALUES(11031,71,21.5,16,0); +INSERT INTO "Order Details" VALUES(11032,36,19,35,0); +INSERT INTO "Order Details" VALUES(11032,38,263.5,25,0); +INSERT INTO "Order Details" VALUES(11032,59,55,30,0); +INSERT INTO "Order Details" VALUES(11033,53,32.8,70,0.1); + +INSERT INTO "Order Details" VALUES(11033,69,36,36,0.1); +INSERT INTO "Order Details" VALUES(11034,21,10,15,0.1); +INSERT INTO "Order Details" VALUES(11034,44,19.45,12,0); +INSERT INTO "Order Details" VALUES(11034,61,28.5,6,0); +INSERT INTO "Order Details" VALUES(11035,1,18,10,0); +INSERT INTO "Order Details" VALUES(11035,35,18,60,0); +INSERT INTO "Order Details" VALUES(11035,42,14,30,0); +INSERT INTO "Order Details" VALUES(11035,54,7.45,10,0); +INSERT INTO "Order Details" VALUES(11036,13,6,7,0); +INSERT INTO "Order Details" VALUES(11036,59,55,30,0); + +INSERT INTO "Order Details" VALUES(11037,70,15,4,0); +INSERT INTO "Order Details" VALUES(11038,40,18.4,5,0.2); +INSERT INTO "Order Details" VALUES(11038,52,7,2,0); +INSERT INTO "Order Details" VALUES(11038,71,21.5,30,0); +INSERT INTO "Order Details" VALUES(11039,28,45.6,20,0); +INSERT INTO "Order Details" VALUES(11039,35,18,24,0); +INSERT INTO "Order Details" VALUES(11039,49,20,60,0); +INSERT INTO "Order Details" VALUES(11039,57,19.5,28,0); +INSERT INTO "Order Details" VALUES(11040,21,10,20,0); +INSERT INTO "Order Details" VALUES(11041,2,19,30,0.2); + +INSERT INTO "Order Details" VALUES(11041,63,43.9,30,0); +INSERT INTO "Order Details" VALUES(11042,44,19.45,15,0); +INSERT INTO "Order Details" VALUES(11042,61,28.5,4,0); +INSERT INTO "Order Details" VALUES(11043,11,21,10,0); +INSERT INTO "Order Details" VALUES(11044,62,49.3,12,0); +INSERT INTO "Order Details" VALUES(11045,33,2.5,15,0); +INSERT INTO "Order Details" VALUES(11045,51,53,24,0); +INSERT INTO "Order Details" VALUES(11046,12,38,20,0.05); +INSERT INTO "Order Details" VALUES(11046,32,32,15,0.05); +INSERT INTO "Order Details" VALUES(11046,35,18,18,0.05); + +INSERT INTO "Order Details" VALUES(11047,1,18,25,0.25); +INSERT INTO "Order Details" VALUES(11047,5,21.35,30,0.25); +INSERT INTO "Order Details" VALUES(11048,68,12.5,42,0); +INSERT INTO "Order Details" VALUES(11049,2,19,10,0.2); +INSERT INTO "Order Details" VALUES(11049,12,38,4,0.2); +INSERT INTO "Order Details" VALUES(11050,76,18,50,0.1); +INSERT INTO "Order Details" VALUES(11051,24,4.5,10,0.2); +INSERT INTO "Order Details" VALUES(11052,43,46,30,0.2); +INSERT INTO "Order Details" VALUES(11052,61,28.5,10,0.2); +INSERT INTO "Order Details" VALUES(11053,18,62.5,35,0.2); + +INSERT INTO "Order Details" VALUES(11053,32,32,20,0); +INSERT INTO "Order Details" VALUES(11053,64,33.25,25,0.2); +INSERT INTO "Order Details" VALUES(11054,33,2.5,10,0); +INSERT INTO "Order Details" VALUES(11054,67,14,20,0); +INSERT INTO "Order Details" VALUES(11055,24,4.5,15,0); +INSERT INTO "Order Details" VALUES(11055,25,14,15,0); +INSERT INTO "Order Details" VALUES(11055,51,53,20,0); +INSERT INTO "Order Details" VALUES(11055,57,19.5,20,0); +INSERT INTO "Order Details" VALUES(11056,7,30,40,0); +INSERT INTO "Order Details" VALUES(11056,55,24,35,0); + +INSERT INTO "Order Details" VALUES(11056,60,34,50,0); +INSERT INTO "Order Details" VALUES(11057,70,15,3,0); +INSERT INTO "Order Details" VALUES(11058,21,10,3,0); +INSERT INTO "Order Details" VALUES(11058,60,34,21,0); +INSERT INTO "Order Details" VALUES(11058,61,28.5,4,0); +INSERT INTO "Order Details" VALUES(11059,13,6,30,0); +INSERT INTO "Order Details" VALUES(11059,17,39,12,0); +INSERT INTO "Order Details" VALUES(11059,60,34,35,0); +INSERT INTO "Order Details" VALUES(11060,60,34,4,0); +INSERT INTO "Order Details" VALUES(11060,77,13,10,0); + +INSERT INTO "Order Details" VALUES(11061,60,34,15,0); +INSERT INTO "Order Details" VALUES(11062,53,32.8,10,0.2); +INSERT INTO "Order Details" VALUES(11062,70,15,12,0.2); +INSERT INTO "Order Details" VALUES(11063,34,14,30,0); +INSERT INTO "Order Details" VALUES(11063,40,18.4,40,0.1); +INSERT INTO "Order Details" VALUES(11063,41,9.65,30,0.1); +INSERT INTO "Order Details" VALUES(11064,17,39,77,0.1); +INSERT INTO "Order Details" VALUES(11064,41,9.65,12,0); +INSERT INTO "Order Details" VALUES(11064,53,32.8,25,0.1); +INSERT INTO "Order Details" VALUES(11064,55,24,4,0.1); + +INSERT INTO "Order Details" VALUES(11064,68,12.5,55,0); +INSERT INTO "Order Details" VALUES(11065,30,25.89,4,0.25); +INSERT INTO "Order Details" VALUES(11065,54,7.45,20,0.25); +INSERT INTO "Order Details" VALUES(11066,16,17.45,3,0); +INSERT INTO "Order Details" VALUES(11066,19,9.2,42,0); +INSERT INTO "Order Details" VALUES(11066,34,14,35,0); +INSERT INTO "Order Details" VALUES(11067,41,9.65,9,0); +INSERT INTO "Order Details" VALUES(11068,28,45.6,8,0.15); +INSERT INTO "Order Details" VALUES(11068,43,46,36,0.15); +INSERT INTO "Order Details" VALUES(11068,77,13,28,0.15); + +INSERT INTO "Order Details" VALUES(11069,39,18,20,0); +INSERT INTO "Order Details" VALUES(11070,1,18,40,0.15); +INSERT INTO "Order Details" VALUES(11070,2,19,20,0.15); +INSERT INTO "Order Details" VALUES(11070,16,17.45,30,0.15); +INSERT INTO "Order Details" VALUES(11070,31,12.5,20,0); +INSERT INTO "Order Details" VALUES(11071,7,30,15,0.05); +INSERT INTO "Order Details" VALUES(11071,13,6,10,0.05); +INSERT INTO "Order Details" VALUES(11072,2,19,8,0); +INSERT INTO "Order Details" VALUES(11072,41,9.65,40,0); +INSERT INTO "Order Details" VALUES(11072,50,16.25,22,0); + +INSERT INTO "Order Details" VALUES(11072,64,33.25,130,0); +INSERT INTO "Order Details" VALUES(11073,11,21,10,0); +INSERT INTO "Order Details" VALUES(11073,24,4.5,20,0); +INSERT INTO "Order Details" VALUES(11074,16,17.45,14,0.05); +INSERT INTO "Order Details" VALUES(11075,2,19,10,0.15); +INSERT INTO "Order Details" VALUES(11075,46,12,30,0.15); +INSERT INTO "Order Details" VALUES(11075,76,18,2,0.15); +INSERT INTO "Order Details" VALUES(11076,6,25,20,0.25); +INSERT INTO "Order Details" VALUES(11076,14,23.25,20,0.25); +INSERT INTO "Order Details" VALUES(11076,19,9.2,10,0.25); + +INSERT INTO "Order Details" VALUES(11077,2,19,24,0.2); +INSERT INTO "Order Details" VALUES(11077,3,10,4,0); +INSERT INTO "Order Details" VALUES(11077,4,22,1,0); +INSERT INTO "Order Details" VALUES(11077,6,25,1,0.02); +INSERT INTO "Order Details" VALUES(11077,7,30,1,0.05); +INSERT INTO "Order Details" VALUES(11077,8,40,2,0.1); +INSERT INTO "Order Details" VALUES(11077,10,31,1,0); +INSERT INTO "Order Details" VALUES(11077,12,38,2,0.05); +INSERT INTO "Order Details" VALUES(11077,13,6,4,0); +INSERT INTO "Order Details" VALUES(11077,14,23.25,1,0.03); + +INSERT INTO "Order Details" VALUES(11077,16,17.45,2,0.03); +INSERT INTO "Order Details" VALUES(11077,20,81,1,0.04); +INSERT INTO "Order Details" VALUES(11077,23,9,2,0); +INSERT INTO "Order Details" VALUES(11077,32,32,1,0); +INSERT INTO "Order Details" VALUES(11077,39,18,2,0.05); +INSERT INTO "Order Details" VALUES(11077,41,9.65,3,0); +INSERT INTO "Order Details" VALUES(11077,46,12,3,0.02); +INSERT INTO "Order Details" VALUES(11077,52,7,2,0); +INSERT INTO "Order Details" VALUES(11077,55,24,2,0); +INSERT INTO "Order Details" VALUES(11077,60,34,2,0.06); + +INSERT INTO "Order Details" VALUES(11077,64,33.25,2,0.03); +INSERT INTO "Order Details" VALUES(11077,66,17,1,0); +INSERT INTO "Order Details" VALUES(11077,73,15,2,0.01); +INSERT INTO "Order Details" VALUES(11077,75,7.75,4,0); +INSERT INTO "Order Details" VALUES(11077,77,13,2,0); + +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10248,'VINET',5,'1996-07-04','1996-08-01','1996-07-16',3,32.38, + 'Vins et alcools Chevalier','59 rue de l''Abbaye','Reims', + NULL,'51100','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10249,'TOMSP',6,'1996-07-05','1996-08-16','1996-07-10',1,11.61, + 'Toms Spezialitäten','Luisenstr. 48','Münster', + NULL,'44087','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10250,'HANAR',4,'1996-07-08','1996-08-05','1996-07-12',2,65.83, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10251,'VICTE',3,'1996-07-08','1996-08-05','1996-07-15',1,41.34, + 'Victuailles en stock','2, rue du Commerce','Lyon', + NULL,'69004','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10252,'SUPRD',4,'1996-07-09','1996-08-06','1996-07-11',2,51.30, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10253,'HANAR',3,'1996-07-10','1996-07-24','1996-07-16',2,58.17, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10254,'CHOPS',5,'1996-07-11','1996-08-08','1996-07-23',2,22.98, + 'Chop-suey Chinese','Hauptstr. 31','Bern', + NULL,'3012','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10255,'RICSU',9,'1996-07-12','1996-08-09','1996-07-15',3,148.33, + 'Richter Supermarkt','Starenweg 5','Genève', + NULL,'1204','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10256,'WELLI',3,'1996-07-15','1996-08-12','1996-07-17',2,13.97, + 'Wellington Importadora','Rua do Mercado, 12','Resende', + 'SP','08737-363','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10257,'HILAA',4,'1996-07-16','1996-08-13','1996-07-22',3,81.91, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10258,'ERNSH',1,'1996-07-17','1996-08-14','1996-07-23',1,140.51, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10259,'CENTC',4,'1996-07-18','1996-08-15','1996-07-25',3,3.25, + 'Centro comercial Moctezuma','Sierras de Granada 9993','México D.F.', + NULL,'05022','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10260,'OTTIK',4,'1996-07-19','1996-08-16','1996-07-29',1,55.09, + 'Ottilies Käseladen','Mehrheimerstr. 369','Köln', + NULL,'50739','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10261,'QUEDE',4,'1996-07-19','1996-08-16','1996-07-30',2,3.05, + 'Que Delícia','Rua da Panificadora, 12','Rio de Janeiro', + 'RJ','02389-673','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10262,'RATTC',8,'1996-07-22','1996-08-19','1996-07-25',3,48.29, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10263,'ERNSH',9,'1996-07-23','1996-08-20','1996-07-31',3,146.06, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10264,'FOLKO',6,'1996-07-24','1996-08-21','1996-08-23',3,3.67, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10265,'BLONP',2,'1996-07-25','1996-08-22','1996-08-12',1,55.28, + 'Blondel père et fils','24, place Kléber','Strasbourg', + NULL,'67000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10266,'WARTH',3,'1996-07-26','1996-09-06','1996-07-31',3,25.73, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10267,'FRANK',4,'1996-07-29','1996-08-26','1996-08-06',1,208.58, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10268,'GROSR',8,'1996-07-30','1996-08-27','1996-08-02',3,66.29, + 'GROSELLA-Restaurante','5ª Ave. Los Palos Grandes','Caracas', + 'DF','1081','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10269,'WHITC',5,'1996-07-31','1996-08-14','1996-08-09',1,4.56, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10270,'WARTH',1,'1996-08-01','1996-08-29','1996-08-02',1,136.54, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10271,'SPLIR',6,'1996-08-01','1996-08-29','1996-08-30',2,4.54, + 'Split Rail Beer & Ale','P.O. Box 555','Lander', + 'WY','82520','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10272,'RATTC',6,'1996-08-02','1996-08-30','1996-08-06',2,98.03, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10273,'QUICK',3,'1996-08-05','1996-09-02','1996-08-12',3,76.07, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10274,'VINET',6,'1996-08-06','1996-09-03','1996-08-16',1,6.01, + 'Vins et alcools Chevalier','59 rue de l''Abbaye','Reims', + NULL,'51100','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10275,'MAGAA',1,'1996-08-07','1996-09-04','1996-08-09',1,26.93, + 'Magazzini Alimentari Riuniti','Via Ludovico il Moro 22','Bergamo', + NULL,'24100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10276,'TORTU',8,'1996-08-08','1996-08-22','1996-08-14',3,13.84, + 'Tortuga Restaurante','Avda. Azteca 123','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10277,'MORGK',2,'1996-08-09','1996-09-06','1996-08-13',3,125.77, + 'Morgenstern Gesundkost','Heerstr. 22','Leipzig', + NULL,'04179','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10278,'BERGS',8,'1996-08-12','1996-09-09','1996-08-16',2,92.69, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10279,'LEHMS',8,'1996-08-13','1996-09-10','1996-08-16',2,25.83, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10280,'BERGS',2,'1996-08-14','1996-09-11','1996-09-12',1,8.98, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10281,'ROMEY',4,'1996-08-14','1996-08-28','1996-08-21',1,2.94, + 'Romero y tomillo','Gran Vía, 1','Madrid', + NULL,'28001','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10282,'ROMEY',4,'1996-08-15','1996-09-12','1996-08-21',1,12.69, + 'Romero y tomillo','Gran Vía, 1','Madrid', + NULL,'28001','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10283,'LILAS',3,'1996-08-16','1996-09-13','1996-08-23',3,84.81, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10284,'LEHMS',4,'1996-08-19','1996-09-16','1996-08-27',1,76.56, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10285,'QUICK',1,'1996-08-20','1996-09-17','1996-08-26',2,76.83, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10286,'QUICK',8,'1996-08-21','1996-09-18','1996-08-30',3,229.24, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10287,'RICAR',8,'1996-08-22','1996-09-19','1996-08-28',3,12.76, + 'Ricardo Adocicados','Av. Copacabana, 267','Rio de Janeiro', + 'RJ','02389-890','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10288,'REGGC',4,'1996-08-23','1996-09-20','1996-09-03',1,7.45, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10289,'BSBEV',7,'1996-08-26','1996-09-23','1996-08-28',3,22.77, + 'B''s Beverages','Fauntleroy Circus','Londo', + NULL,'EC2 5NT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10290,'COMMI',8,'1996-08-27','1996-09-24','1996-09-03',1,79.70, + 'Comércio Mineiro','Av. dos Lusíadas, 23','Sao Paulo', + 'SP','05432-043','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10291,'QUEDE',6,'1996-08-27','1996-09-24','1996-09-04',2,6.40, + 'Que Delícia','Rua da Panificadora, 12','Rio de Janeiro', + 'RJ','02389-673','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10292,'TRADH',1,'1996-08-28','1996-09-25','1996-09-02',2,1.35, + 'Tradiçao Hipermercados','Av. Inês de Castro, 414','Sao Paulo', + 'SP','05634-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10293,'TORTU',1,'1996-08-29','1996-09-26','1996-09-11',3,21.18, + 'Tortuga Restaurante','Avda. Azteca 123','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10294,'RATTC',4,'1996-08-30','1996-09-27','1996-09-05',2,147.26, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10295,'VINET',2,'1996-09-02','1996-09-30','1996-09-10',2,1.15, + 'Vins et alcools Chevalier','59 rue de l''Abbaye','Reims', + NULL,'51100','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10296,'LILAS',6,'1996-09-03','1996-10-01','1996-09-11',1,0.12, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10297,'BLONP',5,'1996-09-04','1996-10-16','1996-09-10',2,5.74, + 'Blondel père et fils','24, place Kléber','Strasbourg', + NULL,'67000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10298,'HUNGO',6,'1996-09-05','1996-10-03','1996-09-11',2,168.22, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10299,'RICAR',4,'1996-09-06','1996-10-04','1996-09-13',2,29.76, + 'Ricardo Adocicados','Av. Copacabana, 267','Rio de Janeiro', + 'RJ','02389-890','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10300,'MAGAA',2,'1996-09-09','1996-10-07','1996-09-18',2,17.68, + 'Magazzini Alimentari Riuniti','Via Ludovico il Moro 22','Bergamo', + NULL,'24100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10301,'WANDK',8,'1996-09-09','1996-10-07','1996-09-17',2,45.08, + 'Die Wandernde Kuh','Adenauerallee 900','Stuttgart', + NULL,'70563','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10302,'SUPRD',4,'1996-09-10','1996-10-08','1996-10-09',2,6.27, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10303,'GODOS',7,'1996-09-11','1996-10-09','1996-09-18',2,107.83, + 'Godos Cocina Típica','C/ Romero, 33','Sevilla', + NULL,'41101','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10304,'TORTU',1,'1996-09-12','1996-10-10','1996-09-17',2,63.79, + 'Tortuga Restaurante','Avda. Azteca 123','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10305,'OLDWO',8,'1996-09-13','1996-10-11','1996-10-09',3,257.62, + 'Old World Delicatesse','2743 Bering St.','Anchorage', + 'AK','99508','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10306,'ROMEY',1,'1996-09-16','1996-10-14','1996-09-23',3,7.56, + 'Romero y tomillo','Gran Vía, 1','Madrid', + NULL,'28001','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10307,'LONEP',2,'1996-09-17','1996-10-15','1996-09-25',2,0.56, + 'Lonesome Pine Restaurant','89 Chiaroscuro Rd.','Portland', + 'OR','97219','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10308,'ANATR',7,'1996-09-18','1996-10-16','1996-09-24',3,1.61, + 'Ana Trujillo Emparedados y helados','Avda. de la Constitución 2222','México D.F.', + NULL,'05021','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10309,'HUNGO',3,'1996-09-19','1996-10-17','1996-10-23',1,47.30, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10310,'THEBI',8,'1996-09-20','1996-10-18','1996-09-27',2,17.52, + 'The Big Cheese','89 Jefferson Way Suite 2','Portland', + 'OR','97201','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10311,'DUMO',1,'1996-09-20','1996-10-04','1996-09-26',3,24.69, + 'Du monde entier','67, rue des Cinquante Otages','Nantes', + NULL,'44000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10312,'WANDK',2,'1996-09-23','1996-10-21','1996-10-03',2,40.26, + 'Die Wandernde Kuh','Adenauerallee 900','Stuttgart', + NULL,'70563','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10313,'QUICK',2,'1996-09-24','1996-10-22','1996-10-04',2,1.96, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10314,'RATTC',1,'1996-09-25','1996-10-23','1996-10-04',2,74.16, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10315,'ISLAT',4,'1996-09-26','1996-10-24','1996-10-03',2,41.76, + 'Island Trading','Garden House Crowther Way','Cowes', + 'Isle of Wight','PO31 7PJ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10316,'RATTC',1,'1996-09-27','1996-10-25','1996-10-08',3,150.15, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10317,'LONEP',6,'1996-09-30','1996-10-28','1996-10-10',1,12.69, + 'Lonesome Pine Restaurant','89 Chiaroscuro Rd.','Portland', + 'OR','97219','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10318,'ISLAT',8,'1996-10-01','1996-10-29','1996-10-04',2,4.73, + 'Island Trading','Garden House Crowther Way','Cowes', + 'Isle of Wight','PO31 7PJ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10319,'TORTU',7,'1996-10-02','1996-10-30','1996-10-11',3,64.50, + 'Tortuga Restaurante','Avda. Azteca 123','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10320,'WARTH',5,'1996-10-03','1996-10-17','1996-10-18',3,34.57, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10321,'ISLAT',3,'1996-10-03','1996-10-31','1996-10-11',2,3.43, + 'Island Trading','Garden House Crowther Way','Cowes', + 'Isle of Wight','PO31 7PJ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10322,'PERIC',7,'1996-10-04','1996-11-01','1996-10-23',3,0.40, + 'Pericles Comidas clásicas','Calle Dr. Jorge Cash 321','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10323,'KOENE',4,'1996-10-07','1996-11-04','1996-10-14',1,4.88, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10324,'SAVEA',9,'1996-10-08','1996-11-05','1996-10-10',1,214.27, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10325,'KOENE',1,'1996-10-09','1996-10-23','1996-10-14',3,64.86, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10326,'BOLID',4,'1996-10-10','1996-11-07','1996-10-14',2,77.92, + 'Bólido Comidas preparadas','C/ Araquil, 67','Madrid', + NULL,'28023','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10327,'FOLKO',2,'1996-10-11','1996-11-08','1996-10-14',1,63.36, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10328,'FURIB',4,'1996-10-14','1996-11-11','1996-10-17',3,87.03, + 'Furia Bacalhau e Frutos do Mar','Jardim das rosas n. 32','Lisboa', + NULL,'1675','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10329,'SPLIR',4,'1996-10-15','1996-11-26','1996-10-23',2,191.67, + 'Split Rail Beer & Ale','P.O. Box 555','Lander', + 'WY','82520','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10330,'LILAS',3,'1996-10-16','1996-11-13','1996-10-28',1,12.75, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10331,'BONAP',9,'1996-10-16','1996-11-27','1996-10-21',1,10.19, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10332,'MEREP',3,'1996-10-17','1996-11-28','1996-10-21',2,52.84, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10333,'WARTH',5,'1996-10-18','1996-11-15','1996-10-25',3,0.59, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10334,'VICTE',8,'1996-10-21','1996-11-18','1996-10-28',2,8.56, + 'Victuailles en stock','2, rue du Commerce','Lyo', + NULL,'69004','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10335,'HUNGO',7,'1996-10-22','1996-11-19','1996-10-24',2,42.11, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10336,'PRINI',7,'1996-10-23','1996-11-20','1996-10-25',2,15.51, + 'Princesa Isabel Vinhos','Estrada da saúde n. 58','Lisboa', + NULL,'1756','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10337,'FRANK',4,'1996-10-24','1996-11-21','1996-10-29',3,108.26, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10338,'OLDWO',4,'1996-10-25','1996-11-22','1996-10-29',3,84.21, + 'Old World Delicatesse','2743 Bering St.','Anchorage', + 'AK','99508','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10339,'MEREP',2,'1996-10-28','1996-11-25','1996-11-04',2,15.66, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10340,'BONAP',1,'1996-10-29','1996-11-26','1996-11-08',3,166.31, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10341,'SIMOB',7,'1996-10-29','1996-11-26','1996-11-05',3,26.78, + 'Simons bistro','Vinbæltet 34','Kobenhav', + NULL,'1734','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10342,'FRANK',4,'1996-10-30','1996-11-13','1996-11-04',2,54.83, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10343,'LEHMS',4,'1996-10-31','1996-11-28','1996-11-06',1,110.37, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10344,'WHITC',4,'1996-11-01','1996-11-29','1996-11-05',2,23.29, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10345,'QUICK',2,'1996-11-04','1996-12-02','1996-11-11',2,249.06, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10346,'RATTC',3,'1996-11-05','1996-12-17','1996-11-08',3,142.08, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10347,'FAMIA',4,'1996-11-06','1996-12-04','1996-11-08',3,3.10, + 'Familia Arquibaldo','Rua Orós, 92','Sao Paulo', + 'SP','05442-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10348,'WANDK',4,'1996-11-07','1996-12-05','1996-11-15',2,0.78, + 'Die Wandernde Kuh','Adenauerallee 900','Stuttgart', + NULL,'70563','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10349,'SPLIR',7,'1996-11-08','1996-12-06','1996-11-15',1,8.63, + 'Split Rail Beer & Ale','P.O. Box 555','Lander', + 'WY','82520','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10350,'LAMAI',6,'1996-11-11','1996-12-09','1996-12-03',2,64.19, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10351,'ERNSH',1,'1996-11-11','1996-12-09','1996-11-20',1,162.33, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10352,'FURIB',3,'1996-11-12','1996-11-26','1996-11-18',3,1.30, + 'Furia Bacalhau e Frutos do Mar','Jardim das rosas n. 32','Lisboa', + NULL,'1675','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10353,'PICCO',7,'1996-11-13','1996-12-11','1996-11-25',3,360.63, + 'Piccolo und mehr','Geislweg 14','Salzburg', + NULL,'5020','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10354,'PERIC',8,'1996-11-14','1996-12-12','1996-11-20',3,53.80, + 'Pericles Comidas clásicas','Calle Dr. Jorge Cash 321','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10355,'AROUT',6,'1996-11-15','1996-12-13','1996-11-20',1,41.95, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10356,'WANDK',6,'1996-11-18','1996-12-16','1996-11-27',2,36.71, + 'Die Wandernde Kuh','Adenauerallee 900','Stuttgart', + NULL,'70563','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10357,'LILAS',1,'1996-11-19','1996-12-17','1996-12-02',3,34.88, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10358,'LAMAI',5,'1996-11-20','1996-12-18','1996-11-27',1,19.64, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10359,'SEVES',5,'1996-11-21','1996-12-19','1996-11-26',3,288.43, + 'Seven Seas Imports','90 Wadhurst Rd.','Londo', + NULL,'OX15 4NB','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10360,'BLONP',4,'1996-11-22','1996-12-20','1996-12-02',3,131.70, + 'Blondel père et fils','24, place Kléber','Strasbourg', + NULL,'67000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10361,'QUICK',1,'1996-11-22','1996-12-20','1996-12-03',2,183.17, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10362,'BONAP',3,'1996-11-25','1996-12-23','1996-11-28',1,96.04, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10363,'DRACD',4,'1996-11-26','1996-12-24','1996-12-04',3,30.54, + 'Drachenblut Delikatesse','Walserweg 21','Aache', + NULL,'52066','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10364,'EASTC',1,'1996-11-26','1997-01-07','1996-12-04',1,71.97, + 'Eastern Connectio','35 King George','Londo', + NULL,'WX3 6FW','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10365,'ANTO',3,'1996-11-27','1996-12-25','1996-12-02',2,22.00, + 'Antonio Moreno Taquería','Mataderos 2312','México D.F.', + NULL,'05023','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10366,'GALED',8,'1996-11-28','1997-01-09','1996-12-30',2,10.14, + 'Galería del gastronómo','Rambla de Cataluña, 23','Barcelona', + NULL,'8022','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10367,'VAFFE',7,'1996-11-28','1996-12-26','1996-12-02',3,13.55, + 'Vaffeljernet','Smagsloget 45','Århus', + NULL,'8200','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10368,'ERNSH',2,'1996-11-29','1996-12-27','1996-12-02',2,101.95, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10369,'SPLIR',8,'1996-12-02','1996-12-30','1996-12-09',2,195.68, + 'Split Rail Beer & Ale','P.O. Box 555','Lander', + 'WY','82520','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10370,'CHOPS',6,'1996-12-03','1996-12-31','1996-12-27',2,1.17, + 'Chop-suey Chinese','Hauptstr. 31','Ber', + NULL,'3012','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10371,'LAMAI',1,'1996-12-03','1996-12-31','1996-12-24',1,0.45, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10372,'QUEE',5,'1996-12-04','1997-01-01','1996-12-09',2,890.78, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10373,'HUNGO',4,'1996-12-05','1997-01-02','1996-12-11',3,124.12, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10374,'WOLZA',1,'1996-12-05','1997-01-02','1996-12-09',3,3.94, + 'Wolski Zajazd','ul. Filtrowa 68','Warszawa', + NULL,'01-012','Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10375,'HUNGC',3,'1996-12-06','1997-01-03','1996-12-09',2,20.12, + 'Hungry Coyote Import Store','City Center Plaza 516 Main St.','Elgi', + 'OR','97827','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10376,'MEREP',1,'1996-12-09','1997-01-06','1996-12-13',2,20.39, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10377,'SEVES',1,'1996-12-09','1997-01-06','1996-12-13',3,22.21, + 'Seven Seas Imports','90 Wadhurst Rd.','Londo', + NULL,'OX15 4NB','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10378,'FOLKO',5,'1996-12-10','1997-01-07','1996-12-19',3,5.44, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10379,'QUEDE',2,'1996-12-11','1997-01-08','1996-12-13',1,45.03, + 'Que Delícia','Rua da Panificadora, 12','Rio de Janeiro', + 'RJ','02389-673','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10380,'HUNGO',8,'1996-12-12','1997-01-09','1997-01-16',3,35.03, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10381,'LILAS',3,'1996-12-12','1997-01-09','1996-12-13',3,7.99, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10382,'ERNSH',4,'1996-12-13','1997-01-10','1996-12-16',1,94.77, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10383,'AROUT',8,'1996-12-16','1997-01-13','1996-12-18',3,34.24, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10384,'BERGS',3,'1996-12-16','1997-01-13','1996-12-20',3,168.64, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10385,'SPLIR',1,'1996-12-17','1997-01-14','1996-12-23',2,30.96, + 'Split Rail Beer & Ale','P.O. Box 555','Lander', + 'WY','82520','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10386,'FAMIA',9,'1996-12-18','1997-01-01','1996-12-25',3,13.99, + 'Familia Arquibaldo','Rua Orós, 92','Sao Paulo', + 'SP','05442-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10387,'SANTG',1,'1996-12-18','1997-01-15','1996-12-20',2,93.63, + 'Santé Gourmet','Erling Skakkes gate 78','Staver', + NULL,'4110','Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10388,'SEVES',2,'1996-12-19','1997-01-16','1996-12-20',1,34.86, + 'Seven Seas Imports','90 Wadhurst Rd.','Londo', + NULL,'OX15 4NB','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10389,'BOTTM',4,'1996-12-20','1997-01-17','1996-12-24',2,47.42, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10390,'ERNSH',6,'1996-12-23','1997-01-20','1996-12-26',1,126.38, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10391,'DRACD',3,'1996-12-23','1997-01-20','1996-12-31',3,5.45, + 'Drachenblut Delikatesse','Walserweg 21','Aache', + NULL,'52066','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10392,'PICCO',2,'1996-12-24','1997-01-21','1997-01-01',3,122.46, + 'Piccolo und mehr','Geislweg 14','Salzburg', + NULL,'5020','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10393,'SAVEA',1,'1996-12-25','1997-01-22','1997-01-03',3,126.56, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10394,'HUNGC',1,'1996-12-25','1997-01-22','1997-01-03',3,30.34, + 'Hungry Coyote Import Store','City Center Plaza 516 Main St.','Elgi', + 'OR','97827','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10395,'HILAA',6,'1996-12-26','1997-01-23','1997-01-03',1,184.41, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10396,'FRANK',1,'1996-12-27','1997-01-10','1997-01-06',3,135.35, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10397,'PRINI',5,'1996-12-27','1997-01-24','1997-01-02',1,60.26, + 'Princesa Isabel Vinhos','Estrada da saúde n. 58','Lisboa', + NULL,'1756','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10398,'SAVEA',2,'1996-12-30','1997-01-27','1997-01-09',3,89.16, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10399,'VAFFE',8,'1996-12-31','1997-01-14','1997-01-08',3,27.36, + 'Vaffeljernet','Smagsloget 45','Århus', + NULL,'8200','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10400,'EASTC',1,'1997-01-01','1997-01-29','1997-01-16',3,83.93, + 'Eastern Connectio','35 King George','Londo', + NULL,'WX3 6FW','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10401,'RATTC',1,'1997-01-01','1997-01-29','1997-01-10',1,12.51, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10402,'ERNSH',8,'1997-01-02','1997-02-13','1997-01-10',2,67.88, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10403,'ERNSH',4,'1997-01-03','1997-01-31','1997-01-09',3,73.79, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10404,'MAGAA',2,'1997-01-03','1997-01-31','1997-01-08',1,155.97, + 'Magazzini Alimentari Riuniti','Via Ludovico il Moro 22','Bergamo', + NULL,'24100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10405,'LINOD',1,'1997-01-06','1997-02-03','1997-01-22',1,34.82, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10406,'QUEE',7,'1997-01-07','1997-02-18','1997-01-13',1,108.04, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10407,'OTTIK',2,'1997-01-07','1997-02-04','1997-01-30',2,91.48, + 'Ottilies Käselade','Mehrheimerstr. 369','Köl', + NULL,'50739','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10408,'FOLIG',8,'1997-01-08','1997-02-05','1997-01-14',1,11.26, + 'Folies gourmandes','184, chaussée de Tournai','Lille', + NULL,'59000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10409,'OCEA',3,'1997-01-09','1997-02-06','1997-01-14',1,29.83, + 'Océano Atlántico Ltda.','Ing. Gustavo Moncada 8585 Piso 20-A','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10410,'BOTTM',3,'1997-01-10','1997-02-07','1997-01-15',3,2.40, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10411,'BOTTM',9,'1997-01-10','1997-02-07','1997-01-21',3,23.65, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10412,'WARTH',8,'1997-01-13','1997-02-10','1997-01-15',2,3.77, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10413,'LAMAI',3,'1997-01-14','1997-02-11','1997-01-16',2,95.66, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10414,'FAMIA',2,'1997-01-14','1997-02-11','1997-01-17',3,21.48, + 'Familia Arquibaldo','Rua Orós, 92','Sao Paulo', + 'SP','05442-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10415,'HUNGC',3,'1997-01-15','1997-02-12','1997-01-24',1,0.20, + 'Hungry Coyote Import Store','City Center Plaza 516 Main St.','Elgi', + 'OR','97827','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10416,'WARTH',8,'1997-01-16','1997-02-13','1997-01-27',3,22.72, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10417,'SIMOB',4,'1997-01-16','1997-02-13','1997-01-28',3,70.29, + 'Simons bistro','Vinbæltet 34','Kobenhav', + NULL,'1734','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10418,'QUICK',4,'1997-01-17','1997-02-14','1997-01-24',1,17.55, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10419,'RICSU',4,'1997-01-20','1997-02-17','1997-01-30',2,137.35, + 'Richter Supermarkt','Starenweg 5','Genève', + NULL,'1204','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10420,'WELLI',3,'1997-01-21','1997-02-18','1997-01-27',1,44.12, + 'Wellington Importadora','Rua do Mercado, 12','Resende', + 'SP','08737-363','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10421,'QUEDE',8,'1997-01-21','1997-03-04','1997-01-27',1,99.23, + 'Que Delícia','Rua da Panificadora, 12','Rio de Janeiro', + 'RJ','02389-673','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10422,'FRANS',2,'1997-01-22','1997-02-19','1997-01-31',1,3.02, + 'Franchi S.p.A.','Via Monte Bianco 34','Torino', + NULL,'10100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10423,'GOURL',6,'1997-01-23','1997-02-06','1997-02-24',3,24.50, + 'Gourmet Lanchonetes','Av. Brasil, 442','Campinas', + 'SP','04876-786','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10424,'MEREP',7,'1997-01-23','1997-02-20','1997-01-27',2,370.61, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10425,'LAMAI',6,'1997-01-24','1997-02-21','1997-02-14',2,7.93, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10426,'GALED',4,'1997-01-27','1997-02-24','1997-02-06',1,18.69, + 'Galería del gastronómo','Rambla de Cataluña, 23','Barcelona', + NULL,'8022','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10427,'PICCO',4,'1997-01-27','1997-02-24','1997-03-03',2,31.29, + 'Piccolo und mehr','Geislweg 14','Salzburg', + NULL,'5020','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10428,'REGGC',7,'1997-01-28','1997-02-25','1997-02-04',1,11.09, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10429,'HUNGO',3,'1997-01-29','1997-03-12','1997-02-07',2,56.63, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10430,'ERNSH',4,'1997-01-30','1997-02-13','1997-02-03',1,458.78, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10431,'BOTTM',4,'1997-01-30','1997-02-13','1997-02-07',2,44.17, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10432,'SPLIR',3,'1997-01-31','1997-02-14','1997-02-07',2,4.34, + 'Split Rail Beer & Ale','P.O. Box 555','Lander', + 'WY','82520','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10433,'PRINI',3,'1997-02-03','1997-03-03','1997-03-04',3,73.83, + 'Princesa Isabel Vinhos','Estrada da saúde n. 58','Lisboa', + NULL,'1756','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10434,'FOLKO',3,'1997-02-03','1997-03-03','1997-02-13',2,17.92, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10435,'CONSH',8,'1997-02-04','1997-03-18','1997-02-07',2,9.21, + 'Consolidated Holdings','Berkeley Gardens 12 Brewery','Londo', + NULL,'WX1 6LT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10436,'BLONP',3,'1997-02-05','1997-03-05','1997-02-11',2,156.66, + 'Blondel père et fils','24, place Kléber','Strasbourg', + NULL,'67000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10437,'WARTH',8,'1997-02-05','1997-03-05','1997-02-12',1,19.97, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10438,'TOMSP',3,'1997-02-06','1997-03-06','1997-02-14',2,8.24, + 'Toms Spezialitäte','Luisenstr. 48','Münster', + NULL,'44087','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10439,'MEREP',6,'1997-02-07','1997-03-07','1997-02-10',3,4.07, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10440,'SAVEA',4,'1997-02-10','1997-03-10','1997-02-28',2,86.53, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10441,'OLDWO',3,'1997-02-10','1997-03-24','1997-03-14',2,73.02, + 'Old World Delicatesse','2743 Bering St.','Anchorage', + 'AK','99508','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10442,'ERNSH',3,'1997-02-11','1997-03-11','1997-02-18',2,47.94, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10443,'REGGC',8,'1997-02-12','1997-03-12','1997-02-14',1,13.95, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10444,'BERGS',3,'1997-02-12','1997-03-12','1997-02-21',3,3.50, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10445,'BERGS',3,'1997-02-13','1997-03-13','1997-02-20',1,9.30, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10446,'TOMSP',6,'1997-02-14','1997-03-14','1997-02-19',1,14.68, + 'Toms Spezialitäte','Luisenstr. 48','Münster', + NULL,'44087','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10447,'RICAR',4,'1997-02-14','1997-03-14','1997-03-07',2,68.66, + 'Ricardo Adocicados','Av. Copacabana, 267','Rio de Janeiro', + 'RJ','02389-890','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10448,'RANCH',4,'1997-02-17','1997-03-17','1997-02-24',2,38.82, + 'Rancho grande','Av. del Libertador 900','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10449,'BLONP',3,'1997-02-18','1997-03-18','1997-02-27',2,53.30, + 'Blondel père et fils','24, place Kléber','Strasbourg', + NULL,'67000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10450,'VICTE',8,'1997-02-19','1997-03-19','1997-03-11',2,7.23, + 'Victuailles en stock','2, rue du Commerce','Lyo', + NULL,'69004','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10451,'QUICK',4,'1997-02-19','1997-03-05','1997-03-12',3,189.09, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10452,'SAVEA',8,'1997-02-20','1997-03-20','1997-02-26',1,140.26, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10453,'AROUT',1,'1997-02-21','1997-03-21','1997-02-26',2,25.36, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10454,'LAMAI',4,'1997-02-21','1997-03-21','1997-02-25',3,2.74, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10455,'WARTH',8,'1997-02-24','1997-04-07','1997-03-03',2,180.45, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10456,'KOENE',8,'1997-02-25','1997-04-08','1997-02-28',2,8.12, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10457,'KOENE',2,'1997-02-25','1997-03-25','1997-03-03',1,11.57, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10458,'SUPRD',7,'1997-02-26','1997-03-26','1997-03-04',3,147.06, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10459,'VICTE',4,'1997-02-27','1997-03-27','1997-02-28',2,25.09, + 'Victuailles en stock','2, rue du Commerce','Lyo', + NULL,'69004','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10460,'FOLKO',8,'1997-02-28','1997-03-28','1997-03-03',1,16.27, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10461,'LILAS',1,'1997-02-28','1997-03-28','1997-03-05',3,148.61, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10462,'CONSH',2,'1997-03-03','1997-03-31','1997-03-18',1,6.17, + 'Consolidated Holdings','Berkeley Gardens 12 Brewery','Londo', + NULL,'WX1 6LT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10463,'SUPRD',5,'1997-03-04','1997-04-01','1997-03-06',3,14.78, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10464,'FURIB',4,'1997-03-04','1997-04-01','1997-03-14',2,89.00, + 'Furia Bacalhau e Frutos do Mar','Jardim das rosas n. 32','Lisboa', + NULL,'1675','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10465,'VAFFE',1,'1997-03-05','1997-04-02','1997-03-14',3,145.04, + 'Vaffeljernet','Smagsloget 45','Århus', + NULL,'8200','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10466,'COMMI',4,'1997-03-06','1997-04-03','1997-03-13',1,11.93, + 'Comércio Mineiro','Av. dos Lusíadas, 23','Sao Paulo', + 'SP','05432-043','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10467,'MAGAA',8,'1997-03-06','1997-04-03','1997-03-11',2,4.93, + 'Magazzini Alimentari Riuniti','Via Ludovico il Moro 22','Bergamo', + NULL,'24100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10468,'KOENE',3,'1997-03-07','1997-04-04','1997-03-12',3,44.12, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10469,'WHITC',1,'1997-03-10','1997-04-07','1997-03-14',1,60.18, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10470,'BONAP',4,'1997-03-11','1997-04-08','1997-03-14',2,64.56, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10471,'BSBEV',2,'1997-03-11','1997-04-08','1997-03-18',3,45.59, + 'B''s Beverages','Fauntleroy Circus','Londo', + NULL,'EC2 5NT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10472,'SEVES',8,'1997-03-12','1997-04-09','1997-03-19',1,4.20, + 'Seven Seas Imports','90 Wadhurst Rd.','Londo', + NULL,'OX15 4NB','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10473,'ISLAT',1,'1997-03-13','1997-03-27','1997-03-21',3,16.37, + 'Island Trading','Garden House Crowther Way','Cowes', + 'Isle of Wight','PO31 7PJ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10474,'PERIC',5,'1997-03-13','1997-04-10','1997-03-21',2,83.49, + 'Pericles Comidas clásicas','Calle Dr. Jorge Cash 321','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10475,'SUPRD',9,'1997-03-14','1997-04-11','1997-04-04',1,68.52, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10476,'HILAA',8,'1997-03-17','1997-04-14','1997-03-24',3,4.41, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10477,'PRINI',5,'1997-03-17','1997-04-14','1997-03-25',2,13.02, + 'Princesa Isabel Vinhos','Estrada da saúde n. 58','Lisboa', + NULL,'1756','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10478,'VICTE',2,'1997-03-18','1997-04-01','1997-03-26',3,4.81, + 'Victuailles en stock','2, rue du Commerce','Lyo', + NULL,'69004','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10479,'RATTC',3,'1997-03-19','1997-04-16','1997-03-21',3,708.95, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10480,'FOLIG',6,'1997-03-20','1997-04-17','1997-03-24',2,1.35, + 'Folies gourmandes','184, chaussée de Tournai','Lille', + NULL,'59000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10481,'RICAR',8,'1997-03-20','1997-04-17','1997-03-25',2,64.33, + 'Ricardo Adocicados','Av. Copacabana, 267','Rio de Janeiro', + 'RJ','02389-890','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10482,'LAZYK',1,'1997-03-21','1997-04-18','1997-04-10',3,7.48, + 'Lazy K Kountry Store','12 Orchestra Terrace','Walla Walla', + 'WA','99362','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10483,'WHITC',7,'1997-03-24','1997-04-21','1997-04-25',2,15.28, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10484,'BSBEV',3,'1997-03-24','1997-04-21','1997-04-01',3,6.88, + 'B''s Beverages','Fauntleroy Circus','Londo', + NULL,'EC2 5NT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10485,'LINOD',4,'1997-03-25','1997-04-08','1997-03-31',2,64.45, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10486,'HILAA',1,'1997-03-26','1997-04-23','1997-04-02',2,30.53, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10487,'QUEE',2,'1997-03-26','1997-04-23','1997-03-28',2,71.07, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10488,'FRANK',8,'1997-03-27','1997-04-24','1997-04-02',2,4.93, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10489,'PICCO',6,'1997-03-28','1997-04-25','1997-04-09',2,5.29, + 'Piccolo und mehr','Geislweg 14','Salzburg', + NULL,'5020','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10490,'HILAA',7,'1997-03-31','1997-04-28','1997-04-03',2,210.19, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10491,'FURIB',8,'1997-03-31','1997-04-28','1997-04-08',3,16.96, + 'Furia Bacalhau e Frutos do Mar','Jardim das rosas n. 32','Lisboa', + NULL,'1675','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10492,'BOTTM',3,'1997-04-01','1997-04-29','1997-04-11',1,62.89, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10493,'LAMAI',4,'1997-04-02','1997-04-30','1997-04-10',3,10.64, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10494,'COMMI',4,'1997-04-02','1997-04-30','1997-04-09',2,65.99, + 'Comércio Mineiro','Av. dos Lusíadas, 23','Sao Paulo', + 'SP','05432-043','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10495,'LAUGB',3,'1997-04-03','1997-05-01','1997-04-11',3,4.65, + 'Laughing Bacchus Wine Cellars','2319 Elm St.','Vancouver', + 'BC','V3F 2K1','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10496,'TRADH',7,'1997-04-04','1997-05-02','1997-04-07',2,46.77, + 'Tradiçao Hipermercados','Av. Inês de Castro, 414','Sao Paulo', + 'SP','05634-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10497,'LEHMS',7,'1997-04-04','1997-05-02','1997-04-07',1,36.21, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10498,'HILAA',8,'1997-04-07','1997-05-05','1997-04-11',2,29.75, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10499,'LILAS',4,'1997-04-08','1997-05-06','1997-04-16',2,102.02, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10500,'LAMAI',6,'1997-04-09','1997-05-07','1997-04-17',1,42.68, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10501,'BLAUS',9,'1997-04-09','1997-05-07','1997-04-16',3,8.85, + 'Blauer See Delikatesse','Forsterstr. 57','Mannheim', + NULL,'68306','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10502,'PERIC',2,'1997-04-10','1997-05-08','1997-04-29',1,69.32, + 'Pericles Comidas clásicas','Calle Dr. Jorge Cash 321','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10503,'HUNGO',6,'1997-04-11','1997-05-09','1997-04-16',2,16.74, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10504,'WHITC',4,'1997-04-11','1997-05-09','1997-04-18',3,59.13, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10505,'MEREP',3,'1997-04-14','1997-05-12','1997-04-21',3,7.13, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10506,'KOENE',9,'1997-04-15','1997-05-13','1997-05-02',2,21.19, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10507,'ANTO',7,'1997-04-15','1997-05-13','1997-04-22',1,47.45, + 'Antonio Moreno Taquería','Mataderos 2312','México D.F.', + NULL,'05023','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10508,'OTTIK',1,'1997-04-16','1997-05-14','1997-05-13',2,4.99, + 'Ottilies Käselade','Mehrheimerstr. 369','Köl', + NULL,'50739','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10509,'BLAUS',4,'1997-04-17','1997-05-15','1997-04-29',1,0.15, + 'Blauer See Delikatesse','Forsterstr. 57','Mannheim', + NULL,'68306','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10510,'SAVEA',6,'1997-04-18','1997-05-16','1997-04-28',3,367.63, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10511,'BONAP',4,'1997-04-18','1997-05-16','1997-04-21',3,350.64, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10512,'FAMIA',7,'1997-04-21','1997-05-19','1997-04-24',2,3.53, + 'Familia Arquibaldo','Rua Orós, 92','Sao Paulo', + 'SP','05442-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10513,'WANDK',7,'1997-04-22','1997-06-03','1997-04-28',1,105.65, + 'Die Wandernde Kuh','Adenauerallee 900','Stuttgart', + NULL,'70563','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10514,'ERNSH',3,'1997-04-22','1997-05-20','1997-05-16',2,789.95, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10515,'QUICK',2,'1997-04-23','1997-05-07','1997-05-23',1,204.47, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10516,'HUNGO',2,'1997-04-24','1997-05-22','1997-05-01',3,62.78, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10517,'NORTS',3,'1997-04-24','1997-05-22','1997-04-29',3,32.07, + 'North/South','South House 300 Queensbridge','Londo', + NULL,'SW7 1RZ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10518,'TORTU',4,'1997-04-25','1997-05-09','1997-05-05',2,218.15, + 'Tortuga Restaurante','Avda. Azteca 123','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10519,'CHOPS',6,'1997-04-28','1997-05-26','1997-05-01',3,91.76, + 'Chop-suey Chinese','Hauptstr. 31','Ber', + NULL,'3012','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10520,'SANTG',7,'1997-04-29','1997-05-27','1997-05-01',1,13.37, + 'Santé Gourmet','Erling Skakkes gate 78','Staver', + NULL,'4110','Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10521,'CACTU',8,'1997-04-29','1997-05-27','1997-05-02',2,17.22, + 'Cactus Comidas para llevar','Cerrito 333','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10522,'LEHMS',4,'1997-04-30','1997-05-28','1997-05-06',1,45.33, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10523,'SEVES',7,'1997-05-01','1997-05-29','1997-05-30',2,77.63, + 'Seven Seas Imports','90 Wadhurst Rd.','Londo', + NULL,'OX15 4NB','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10524,'BERGS',1,'1997-05-01','1997-05-29','1997-05-07',2,244.79, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10525,'BONAP',1,'1997-05-02','1997-05-30','1997-05-23',2,11.06, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10526,'WARTH',4,'1997-05-05','1997-06-02','1997-05-15',2,58.59, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10527,'QUICK',7,'1997-05-05','1997-06-02','1997-05-07',1,41.90, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10528,'GREAL',6,'1997-05-06','1997-05-20','1997-05-09',2,3.35, + 'Great Lakes Food Market','2732 Baker Blvd.','Eugene', + 'OR','97403','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10529,'MAISD',5,'1997-05-07','1997-06-04','1997-05-09',2,66.69, + 'Maison Dewey','Rue Joseph-Bens 532','Bruxelles', + NULL,'B-1180','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10530,'PICCO',3,'1997-05-08','1997-06-05','1997-05-12',2,339.22, + 'Piccolo und mehr','Geislweg 14','Salzburg', + NULL,'5020','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10531,'OCEA',7,'1997-05-08','1997-06-05','1997-05-19',1,8.12, + 'Océano Atlántico Ltda.','Ing. Gustavo Moncada 8585 Piso 20-A','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10532,'EASTC',7,'1997-05-09','1997-06-06','1997-05-12',3,74.46, + 'Eastern Connectio','35 King George','Londo', + NULL,'WX3 6FW','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10533,'FOLKO',8,'1997-05-12','1997-06-09','1997-05-22',1,188.04, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10534,'LEHMS',8,'1997-05-12','1997-06-09','1997-05-14',2,27.94, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10535,'ANTO',4,'1997-05-13','1997-06-10','1997-05-21',1,15.64, + 'Antonio Moreno Taquería','Mataderos 2312','México D.F.', + NULL,'05023','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10536,'LEHMS',3,'1997-05-14','1997-06-11','1997-06-06',2,58.88, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10537,'RICSU',1,'1997-05-14','1997-05-28','1997-05-19',1,78.85, + 'Richter Supermarkt','Starenweg 5','Genève', + NULL,'1204','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10538,'BSBEV',9,'1997-05-15','1997-06-12','1997-05-16',3,4.87, + 'B''s Beverages','Fauntleroy Circus','Londo', + NULL,'EC2 5NT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10539,'BSBEV',6,'1997-05-16','1997-06-13','1997-05-23',3,12.36, + 'B''s Beverages','Fauntleroy Circus','Londo', + NULL,'EC2 5NT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10540,'QUICK',3,'1997-05-19','1997-06-16','1997-06-13',3,1007.64, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10541,'HANAR',2,'1997-05-19','1997-06-16','1997-05-29',1,68.65, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10542,'KOENE',1,'1997-05-20','1997-06-17','1997-05-26',3,10.95, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10543,'LILAS',8,'1997-05-21','1997-06-18','1997-05-23',2,48.17, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10544,'LONEP',4,'1997-05-21','1997-06-18','1997-05-30',1,24.91, + 'Lonesome Pine Restaurant','89 Chiaroscuro Rd.','Portland', + 'OR','97219','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10545,'LAZYK',8,'1997-05-22','1997-06-19','1997-06-26',2,11.92, + 'Lazy K Kountry Store','12 Orchestra Terrace','Walla Walla', + 'WA','99362','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10546,'VICTE',1,'1997-05-23','1997-06-20','1997-05-27',3,194.72, + 'Victuailles en stock','2, rue du Commerce','Lyo', + NULL,'69004','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10547,'SEVES',3,'1997-05-23','1997-06-20','1997-06-02',2,178.43, + 'Seven Seas Imports','90 Wadhurst Rd.','Londo', + NULL,'OX15 4NB','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10548,'TOMSP',3,'1997-05-26','1997-06-23','1997-06-02',2,1.43, + 'Toms Spezialitäte','Luisenstr. 48','Münster', + NULL,'44087','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10549,'QUICK',5,'1997-05-27','1997-06-10','1997-05-30',1,171.24, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10550,'GODOS',7,'1997-05-28','1997-06-25','1997-06-06',3,4.32, + 'Godos Cocina Típica','C/ Romero, 33','Sevilla', + NULL,'41101','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10551,'FURIB',4,'1997-05-28','1997-07-09','1997-06-06',3,72.95, + 'Furia Bacalhau e Frutos do Mar','Jardim das rosas n. 32','Lisboa', + NULL,'1675','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10552,'HILAA',2,'1997-05-29','1997-06-26','1997-06-05',1,83.22, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10553,'WARTH',2,'1997-05-30','1997-06-27','1997-06-03',2,149.49, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10554,'OTTIK',4,'1997-05-30','1997-06-27','1997-06-05',3,120.97, + 'Ottilies Käselade','Mehrheimerstr. 369','Köl', + NULL,'50739','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10555,'SAVEA',6,'1997-06-02','1997-06-30','1997-06-04',3,252.49, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10556,'SIMOB',2,'1997-06-03','1997-07-15','1997-06-13',1,9.80, + 'Simons bistro','Vinbæltet 34','Kobenhav', + NULL,'1734','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10557,'LEHMS',9,'1997-06-03','1997-06-17','1997-06-06',2,96.72, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10558,'AROUT',1,'1997-06-04','1997-07-02','1997-06-10',2,72.97, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10559,'BLONP',6,'1997-06-05','1997-07-03','1997-06-13',1,8.05, + 'Blondel père et fils','24, place Kléber','Strasbourg', + NULL,'67000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10560,'FRANK',8,'1997-06-06','1997-07-04','1997-06-09',1,36.65, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10561,'FOLKO',2,'1997-06-06','1997-07-04','1997-06-09',2,242.21, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10562,'REGGC',1,'1997-06-09','1997-07-07','1997-06-12',1,22.95, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10563,'RICAR',2,'1997-06-10','1997-07-22','1997-06-24',2,60.43, + 'Ricardo Adocicados','Av. Copacabana, 267','Rio de Janeiro', + 'RJ','02389-890','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10564,'RATTC',4,'1997-06-10','1997-07-08','1997-06-16',3,13.75, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10565,'MEREP',8,'1997-06-11','1997-07-09','1997-06-18',2,7.15, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10566,'BLONP',9,'1997-06-12','1997-07-10','1997-06-18',1,88.40, + 'Blondel père et fils','24, place Kléber','Strasbourg', + NULL,'67000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10567,'HUNGO',1,'1997-06-12','1997-07-10','1997-06-17',1,33.97, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10568,'GALED',3,'1997-06-13','1997-07-11','1997-07-09',3,6.54, + 'Galería del gastronómo','Rambla de Cataluña, 23','Barcelona', + NULL,'8022','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10569,'RATTC',5,'1997-06-16','1997-07-14','1997-07-11',1,58.98, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10570,'MEREP',3,'1997-06-17','1997-07-15','1997-06-19',3,188.99, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10571,'ERNSH',8,'1997-06-17','1997-07-29','1997-07-04',3,26.06, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10572,'BERGS',3,'1997-06-18','1997-07-16','1997-06-25',2,116.43, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10573,'ANTO',7,'1997-06-19','1997-07-17','1997-06-20',3,84.84, + 'Antonio Moreno Taquería','Mataderos 2312','México D.F.', + NULL,'05023','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10574,'TRAIH',4,'1997-06-19','1997-07-17','1997-06-30',2,37.60, + 'Trail''s Head Gourmet Provisioners','722 DaVinci Blvd.','Kirkland', + 'WA','98034','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10575,'MORGK',5,'1997-06-20','1997-07-04','1997-06-30',1,127.34, + 'Morgenstern Gesundkost','Heerstr. 22','Leipzig', + NULL,'04179','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10576,'TORTU',3,'1997-06-23','1997-07-07','1997-06-30',3,18.56, + 'Tortuga Restaurante','Avda. Azteca 123','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10577,'TRAIH',9,'1997-06-23','1997-08-04','1997-06-30',2,25.41, + 'Trail''s Head Gourmet Provisioners','722 DaVinci Blvd.','Kirkland', + 'WA','98034','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10578,'BSBEV',4,'1997-06-24','1997-07-22','1997-07-25',3,29.60, + 'B''s Beverages','Fauntleroy Circus','Londo', + NULL,'EC2 5NT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10579,'LETSS',1,'1997-06-25','1997-07-23','1997-07-04',2,13.73, + 'Let''s Stop N Shop','87 Polk St. Suite 5','San Francisco', + 'CA','94117','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10580,'OTTIK',4,'1997-06-26','1997-07-24','1997-07-01',3,75.89, + 'Ottilies Käselade','Mehrheimerstr. 369','Köl', + NULL,'50739','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10581,'FAMIA',3,'1997-06-26','1997-07-24','1997-07-02',1,3.01, + 'Familia Arquibaldo','Rua Orós, 92','Sao Paulo', + 'SP','05442-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10582,'BLAUS',3,'1997-06-27','1997-07-25','1997-07-14',2,27.71, + 'Blauer See Delikatesse','Forsterstr. 57','Mannheim', + NULL,'68306','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10583,'WARTH',2,'1997-06-30','1997-07-28','1997-07-04',2,7.28, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10584,'BLONP',4,'1997-06-30','1997-07-28','1997-07-04',1,59.14, + 'Blondel père et fils','24, place Kléber','Strasbourg', + NULL,'67000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10585,'WELLI',7,'1997-07-01','1997-07-29','1997-07-10',1,13.41, + 'Wellington Importadora','Rua do Mercado, 12','Resende', + 'SP','08737-363','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10586,'REGGC',9,'1997-07-02','1997-07-30','1997-07-09',1,0.48, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10587,'QUEDE',1,'1997-07-02','1997-07-30','1997-07-09',1,62.52, + 'Que Delícia','Rua da Panificadora, 12','Rio de Janeiro', + 'RJ','02389-673','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10588,'QUICK',2,'1997-07-03','1997-07-31','1997-07-10',3,194.67, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10589,'GREAL',8,'1997-07-04','1997-08-01','1997-07-14',2,4.42, + 'Great Lakes Food Market','2732 Baker Blvd.','Eugene', + 'OR','97403','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10590,'MEREP',4,'1997-07-07','1997-08-04','1997-07-14',3,44.77, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10591,'VAFFE',1,'1997-07-07','1997-07-21','1997-07-16',1,55.92, + 'Vaffeljernet','Smagsloget 45','Århus', + NULL,'8200','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10592,'LEHMS',3,'1997-07-08','1997-08-05','1997-07-16',1,32.10, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10593,'LEHMS',7,'1997-07-09','1997-08-06','1997-08-13',2,174.20, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10594,'OLDWO',3,'1997-07-09','1997-08-06','1997-07-16',2,5.24, + 'Old World Delicatesse','2743 Bering St.','Anchorage', + 'AK','99508','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10595,'ERNSH',2,'1997-07-10','1997-08-07','1997-07-14',1,96.78, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10596,'WHITC',8,'1997-07-11','1997-08-08','1997-08-12',1,16.34, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10597,'PICCO',7,'1997-07-11','1997-08-08','1997-07-18',3,35.12, + 'Piccolo und mehr','Geislweg 14','Salzburg', + NULL,'5020','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10598,'RATTC',1,'1997-07-14','1997-08-11','1997-07-18',3,44.42, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10599,'BSBEV',6,'1997-07-15','1997-08-26','1997-07-21',3,29.98, + 'B''s Beverages','Fauntleroy Circus','Londo', + NULL,'EC2 5NT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10600,'HUNGC',4,'1997-07-16','1997-08-13','1997-07-21',1,45.13, + 'Hungry Coyote Import Store','City Center Plaza 516 Main St.','Elgi', + 'OR','97827','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10601,'HILAA',7,'1997-07-16','1997-08-27','1997-07-22',1,58.30, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10602,'VAFFE',8,'1997-07-17','1997-08-14','1997-07-22',2,2.92, + 'Vaffeljernet','Smagsloget 45','Århus', + NULL,'8200','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10603,'SAVEA',8,'1997-07-18','1997-08-15','1997-08-08',2,48.77, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10604,'FURIB',1,'1997-07-18','1997-08-15','1997-07-29',1,7.46, + 'Furia Bacalhau e Frutos do Mar','Jardim das rosas n. 32','Lisboa', + NULL,'1675','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10605,'MEREP',1,'1997-07-21','1997-08-18','1997-07-29',2,379.13, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10606,'TRADH',4,'1997-07-22','1997-08-19','1997-07-31',3,79.40, + 'Tradiçao Hipermercados','Av. Inês de Castro, 414','Sao Paulo', + 'SP','05634-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10607,'SAVEA',5,'1997-07-22','1997-08-19','1997-07-25',1,200.24, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10608,'TOMSP',4,'1997-07-23','1997-08-20','1997-08-01',2,27.79, + 'Toms Spezialitäte','Luisenstr. 48','Münster', + NULL,'44087','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10609,'DUMO',7,'1997-07-24','1997-08-21','1997-07-30',2,1.85, + 'Du monde entier','67, rue des Cinquante Otages','Nantes', + NULL,'44000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10610,'LAMAI',8,'1997-07-25','1997-08-22','1997-08-06',1,26.78, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10611,'WOLZA',6,'1997-07-25','1997-08-22','1997-08-01',2,80.65, + 'Wolski Zajazd','ul. Filtrowa 68','Warszawa', + NULL,'01-012','Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10612,'SAVEA',1,'1997-07-28','1997-08-25','1997-08-01',2,544.08, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10613,'HILAA',4,'1997-07-29','1997-08-26','1997-08-01',2,8.11, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10614,'BLAUS',8,'1997-07-29','1997-08-26','1997-08-01',3,1.93, + 'Blauer See Delikatesse','Forsterstr. 57','Mannheim', + NULL,'68306','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10615,'WILMK',2,'1997-07-30','1997-08-27','1997-08-06',3,0.75, + 'Wilman Kala','Keskuskatu 45','Helsinki', + NULL,'21240','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10616,'GREAL',1,'1997-07-31','1997-08-28','1997-08-05',2,116.53, + 'Great Lakes Food Market','2732 Baker Blvd.','Eugene', + 'OR','97403','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10617,'GREAL',4,'1997-07-31','1997-08-28','1997-08-04',2,18.53, + 'Great Lakes Food Market','2732 Baker Blvd.','Eugene', + 'OR','97403','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10618,'MEREP',1,'1997-08-01','1997-09-12','1997-08-08',1,154.68, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10619,'MEREP',3,'1997-08-04','1997-09-01','1997-08-07',3,91.05, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10620,'LAUGB',2,'1997-08-05','1997-09-02','1997-08-14',3,0.94, + 'Laughing Bacchus Wine Cellars','2319 Elm St.','Vancouver', + 'BC','V3F 2K1','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10621,'ISLAT',4,'1997-08-05','1997-09-02','1997-08-11',2,23.73, + 'Island Trading','Garden House Crowther Way','Cowes', + 'Isle of Wight','PO31 7PJ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10622,'RICAR',4,'1997-08-06','1997-09-03','1997-08-11',3,50.97, + 'Ricardo Adocicados','Av. Copacabana, 267','Rio de Janeiro', + 'RJ','02389-890','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10623,'FRANK',8,'1997-08-07','1997-09-04','1997-08-12',2,97.18, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10624,'THECR',4,'1997-08-07','1997-09-04','1997-08-19',2,94.80, + 'The Cracker Box','55 Grizzly Peak Rd.','Butte', + 'MT','59801','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10625,'ANATR',3,'1997-08-08','1997-09-05','1997-08-14',1,43.90, + 'Ana Trujillo Emparedados y helados','Avda. de la Constitución 2222','México D.F.', + NULL,'05021','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10626,'BERGS',1,'1997-08-11','1997-09-08','1997-08-20',2,138.69, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10627,'SAVEA',8,'1997-08-11','1997-09-22','1997-08-21',3,107.46, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10628,'BLONP',4,'1997-08-12','1997-09-09','1997-08-20',3,30.36, + 'Blondel père et fils','24, place Kléber','Strasbourg', + NULL,'67000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10629,'GODOS',4,'1997-08-12','1997-09-09','1997-08-20',3,85.46, + 'Godos Cocina Típica','C/ Romero, 33','Sevilla', + NULL,'41101','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10630,'KOENE',1,'1997-08-13','1997-09-10','1997-08-19',2,32.35, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10631,'LAMAI',8,'1997-08-14','1997-09-11','1997-08-15',1,0.87, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10632,'WANDK',8,'1997-08-14','1997-09-11','1997-08-19',1,41.38, + 'Die Wandernde Kuh','Adenauerallee 900','Stuttgart', + NULL,'70563','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10633,'ERNSH',7,'1997-08-15','1997-09-12','1997-08-18',3,477.90, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10634,'FOLIG',4,'1997-08-15','1997-09-12','1997-08-21',3,487.38, + 'Folies gourmandes','184, chaussée de Tournai','Lille', + NULL,'59000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10635,'MAGAA',8,'1997-08-18','1997-09-15','1997-08-21',3,47.46, + 'Magazzini Alimentari Riuniti','Via Ludovico il Moro 22','Bergamo', + NULL,'24100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10636,'WARTH',4,'1997-08-19','1997-09-16','1997-08-26',1,1.15, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10637,'QUEE',6,'1997-08-19','1997-09-16','1997-08-26',1,201.29, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10638,'LINOD',3,'1997-08-20','1997-09-17','1997-09-01',1,158.44, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10639,'SANTG',7,'1997-08-20','1997-09-17','1997-08-27',3,38.64, + 'Santé Gourmet','Erling Skakkes gate 78','Staver', + NULL,'4110','Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10640,'WANDK',4,'1997-08-21','1997-09-18','1997-08-28',1,23.55, + 'Die Wandernde Kuh','Adenauerallee 900','Stuttgart', + NULL,'70563','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10641,'HILAA',4,'1997-08-22','1997-09-19','1997-08-26',2,179.61, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10642,'SIMOB',7,'1997-08-22','1997-09-19','1997-09-05',3,41.89, + 'Simons bistro','Vinbæltet 34','Kobenhav', + NULL,'1734','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10643,'ALFKI',6,'1997-08-25','1997-09-22','1997-09-02',1,29.46, + 'Alfreds Futterkiste','Obere Str. 57','Berli', + NULL,'12209','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10644,'WELLI',3,'1997-08-25','1997-09-22','1997-09-01',2,0.14, + 'Wellington Importadora','Rua do Mercado, 12','Resende', + 'SP','08737-363','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10645,'HANAR',4,'1997-08-26','1997-09-23','1997-09-02',1,12.41, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10646,'HUNGO',9,'1997-08-27','1997-10-08','1997-09-03',3,142.33, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10647,'QUEDE',4,'1997-08-27','1997-09-10','1997-09-03',2,45.54, + 'Que Delícia','Rua da Panificadora, 12','Rio de Janeiro', + 'RJ','02389-673','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10648,'RICAR',5,'1997-08-28','1997-10-09','1997-09-09',2,14.25, + 'Ricardo Adocicados','Av. Copacabana, 267','Rio de Janeiro', + 'RJ','02389-890','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10649,'MAISD',5,'1997-08-28','1997-09-25','1997-08-29',3,6.20, + 'Maison Dewey','Rue Joseph-Bens 532','Bruxelles', + NULL,'B-1180','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10650,'FAMIA',5,'1997-08-29','1997-09-26','1997-09-03',3,176.81, + 'Familia Arquibaldo','Rua Orós, 92','Sao Paulo', + 'SP','05442-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10651,'WANDK',8,'1997-09-01','1997-09-29','1997-09-11',2,20.60, + 'Die Wandernde Kuh','Adenauerallee 900','Stuttgart', + NULL,'70563','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10652,'GOURL',4,'1997-09-01','1997-09-29','1997-09-08',2,7.14, + 'Gourmet Lanchonetes','Av. Brasil, 442','Campinas', + 'SP','04876-786','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10653,'FRANK',1,'1997-09-02','1997-09-30','1997-09-19',1,93.25, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10654,'BERGS',5,'1997-09-02','1997-09-30','1997-09-11',1,55.26, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10655,'REGGC',1,'1997-09-03','1997-10-01','1997-09-11',2,4.41, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10656,'GREAL',6,'1997-09-04','1997-10-02','1997-09-10',1,57.15, + 'Great Lakes Food Market','2732 Baker Blvd.','Eugene', + 'OR','97403','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10657,'SAVEA',2,'1997-09-04','1997-10-02','1997-09-15',2,352.69, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10658,'QUICK',4,'1997-09-05','1997-10-03','1997-09-08',1,364.15, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10659,'QUEE',7,'1997-09-05','1997-10-03','1997-09-10',2,105.81, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10660,'HUNGC',8,'1997-09-08','1997-10-06','1997-10-15',1,111.29, + 'Hungry Coyote Import Store','City Center Plaza 516 Main St.','Elgi', + 'OR','97827','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10661,'HUNGO',7,'1997-09-09','1997-10-07','1997-09-15',3,17.55, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10662,'LONEP',3,'1997-09-09','1997-10-07','1997-09-18',2,1.28, + 'Lonesome Pine Restaurant','89 Chiaroscuro Rd.','Portland', + 'OR','97219','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10663,'BONAP',2,'1997-09-10','1997-09-24','1997-10-03',2,113.15, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10664,'FURIB',1,'1997-09-10','1997-10-08','1997-09-19',3,1.27, + 'Furia Bacalhau e Frutos do Mar','Jardim das rosas n. 32','Lisboa', + NULL,'1675','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10665,'LONEP',1,'1997-09-11','1997-10-09','1997-09-17',2,26.31, + 'Lonesome Pine Restaurant','89 Chiaroscuro Rd.','Portland', + 'OR','97219','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10666,'RICSU',7,'1997-09-12','1997-10-10','1997-09-22',2,232.42, + 'Richter Supermarkt','Starenweg 5','Genève', + NULL,'1204','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10667,'ERNSH',7,'1997-09-12','1997-10-10','1997-09-19',1,78.09, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10668,'WANDK',1,'1997-09-15','1997-10-13','1997-09-23',2,47.22, + 'Die Wandernde Kuh','Adenauerallee 900','Stuttgart', + NULL,'70563','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10669,'SIMOB',2,'1997-09-15','1997-10-13','1997-09-22',1,24.39, + 'Simons bistro','Vinbæltet 34','Kobenhav', + NULL,'1734','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10670,'FRANK',4,'1997-09-16','1997-10-14','1997-09-18',1,203.48, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10671,'FRANR',1,'1997-09-17','1997-10-15','1997-09-24',1,30.34, + 'France restauratio','54, rue Royale','Nantes', + NULL,'44000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10672,'BERGS',9,'1997-09-17','1997-10-01','1997-09-26',2,95.75, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10673,'WILMK',2,'1997-09-18','1997-10-16','1997-09-19',1,22.76, + 'Wilman Kala','Keskuskatu 45','Helsinki', + NULL,'21240','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10674,'ISLAT',4,'1997-09-18','1997-10-16','1997-09-30',2,0.90, + 'Island Trading','Garden House Crowther Way','Cowes', + 'Isle of Wight','PO31 7PJ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10675,'FRANK',5,'1997-09-19','1997-10-17','1997-09-23',2,31.85, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10676,'TORTU',2,'1997-09-22','1997-10-20','1997-09-29',2,2.01, + 'Tortuga Restaurante','Avda. Azteca 123','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10677,'ANTO',1,'1997-09-22','1997-10-20','1997-09-26',3,4.03, + 'Antonio Moreno Taquería','Mataderos 2312','México D.F.', + NULL,'05023','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10678,'SAVEA',7,'1997-09-23','1997-10-21','1997-10-16',3,388.98, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10679,'BLONP',8,'1997-09-23','1997-10-21','1997-09-30',3,27.94, + 'Blondel père et fils','24, place Kléber','Strasbourg', + NULL,'67000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10680,'OLDWO',1,'1997-09-24','1997-10-22','1997-09-26',1,26.61, + 'Old World Delicatesse','2743 Bering St.','Anchorage', + 'AK','99508','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10681,'GREAL',3,'1997-09-25','1997-10-23','1997-09-30',3,76.13, + 'Great Lakes Food Market','2732 Baker Blvd.','Eugene', + 'OR','97403','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10682,'ANTO',3,'1997-09-25','1997-10-23','1997-10-01',2,36.13, + 'Antonio Moreno Taquería','Mataderos 2312','México D.F.', + NULL,'05023','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10683,'DUMO',2,'1997-09-26','1997-10-24','1997-10-01',1,4.40, + 'Du monde entier','67, rue des Cinquante Otages','Nantes', + NULL,'44000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10684,'OTTIK',3,'1997-09-26','1997-10-24','1997-09-30',1,145.63, + 'Ottilies Käselade','Mehrheimerstr. 369','Köl', + NULL,'50739','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10685,'GOURL',4,'1997-09-29','1997-10-13','1997-10-03',2,33.75, + 'Gourmet Lanchonetes','Av. Brasil, 442','Campinas', + 'SP','04876-786','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10686,'PICCO',2,'1997-09-30','1997-10-28','1997-10-08',1,96.50, + 'Piccolo und mehr','Geislweg 14','Salzburg', + NULL,'5020','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10687,'HUNGO',9,'1997-09-30','1997-10-28','1997-10-30',2,296.43, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10688,'VAFFE',4,'1997-10-01','1997-10-15','1997-10-07',2,299.09, + 'Vaffeljernet','Smagsloget 45','Århus', + NULL,'8200','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10689,'BERGS',1,'1997-10-01','1997-10-29','1997-10-07',2,13.42, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10690,'HANAR',1,'1997-10-02','1997-10-30','1997-10-03',1,15.80, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10691,'QUICK',2,'1997-10-03','1997-11-14','1997-10-22',2,810.05, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10692,'ALFKI',4,'1997-10-03','1997-10-31','1997-10-13',2,61.02, + 'Alfred''s Futterkiste','Obere Str. 57','Berli', + NULL,'12209','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10693,'WHITC',3,'1997-10-06','1997-10-20','1997-10-10',3,139.34, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10694,'QUICK',8,'1997-10-06','1997-11-03','1997-10-09',3,398.36, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10695,'WILMK',7,'1997-10-07','1997-11-18','1997-10-14',1,16.72, + 'Wilman Kala','Keskuskatu 45','Helsinki', + NULL,'21240','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10696,'WHITC',8,'1997-10-08','1997-11-19','1997-10-14',3,102.55, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10697,'LINOD',3,'1997-10-08','1997-11-05','1997-10-14',1,45.52, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10698,'ERNSH',4,'1997-10-09','1997-11-06','1997-10-17',1,272.47, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10699,'MORGK',3,'1997-10-09','1997-11-06','1997-10-13',3,0.58, + 'Morgenstern Gesundkost','Heerstr. 22','Leipzig', + NULL,'04179','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10700,'SAVEA',3,'1997-10-10','1997-11-07','1997-10-16',1,65.10, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10701,'HUNGO',6,'1997-10-13','1997-10-27','1997-10-15',3,220.31, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10702,'ALFKI',4,'1997-10-13','1997-11-24','1997-10-21',1,23.94, + 'Alfred''s Futterkiste','Obere Str. 57','Berli', + NULL,'12209','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10703,'FOLKO',6,'1997-10-14','1997-11-11','1997-10-20',2,152.30, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10704,'QUEE',6,'1997-10-14','1997-11-11','1997-11-07',1,4.78, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10705,'HILAA',9,'1997-10-15','1997-11-12','1997-11-18',2,3.52, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10706,'OLDWO',8,'1997-10-16','1997-11-13','1997-10-21',3,135.63, + 'Old World Delicatesse','2743 Bering St.','Anchorage', + 'AK','99508','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10707,'AROUT',4,'1997-10-16','1997-10-30','1997-10-23',3,21.74, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10708,'THEBI',6,'1997-10-17','1997-11-28','1997-11-05',2,2.96, + 'The Big Cheese','89 Jefferson Way Suite 2','Portland', + 'OR','97201','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10709,'GOURL',1,'1997-10-17','1997-11-14','1997-11-20',3,210.80, + 'Gourmet Lanchonetes','Av. Brasil, 442','Campinas', + 'SP','04876-786','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10710,'FRANS',1,'1997-10-20','1997-11-17','1997-10-23',1,4.98, + 'Franchi S.p.A.','Via Monte Bianco 34','Torino', + NULL,'10100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10711,'SAVEA',5,'1997-10-21','1997-12-02','1997-10-29',2,52.41, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10712,'HUNGO',3,'1997-10-21','1997-11-18','1997-10-31',1,89.93, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10713,'SAVEA',1,'1997-10-22','1997-11-19','1997-10-24',1,167.05, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10714,'SAVEA',5,'1997-10-22','1997-11-19','1997-10-27',3,24.49, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10715,'BONAP',3,'1997-10-23','1997-11-06','1997-10-29',1,63.20, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10716,'RANCH',4,'1997-10-24','1997-11-21','1997-10-27',2,22.57, + 'Rancho grande','Av. del Libertador 900','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10717,'FRANK',1,'1997-10-24','1997-11-21','1997-10-29',2,59.25, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10718,'KOENE',1,'1997-10-27','1997-11-24','1997-10-29',3,170.88, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10719,'LETSS',8,'1997-10-27','1997-11-24','1997-11-05',2,51.44, + 'Let''s Stop N Shop','87 Polk St. Suite 5','San Francisco', + 'CA','94117','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10720,'QUEDE',8,'1997-10-28','1997-11-11','1997-11-05',2,9.53, + 'Que Delícia','Rua da Panificadora, 12','Rio de Janeiro', + 'RJ','02389-673','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10721,'QUICK',5,'1997-10-29','1997-11-26','1997-10-31',3,48.92, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10722,'SAVEA',8,'1997-10-29','1997-12-10','1997-11-04',1,74.58, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10723,'WHITC',3,'1997-10-30','1997-11-27','1997-11-25',1,21.72, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10724,'MEREP',8,'1997-10-30','1997-12-11','1997-11-05',2,57.75, + 'Mère Paillarde','43 rue St. Laurent','Montréal', + 'Québec','H1J 1C3','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10725,'FAMIA',4,'1997-10-31','1997-11-28','1997-11-05',3,10.83, + 'Familia Arquibaldo','Rua Orós, 92','Sao Paulo', + 'SP','05442-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10726,'EASTC',4,'1997-11-03','1997-11-17','1997-12-05',1,16.56, + 'Eastern Connectio','35 King George','Londo', + NULL,'WX3 6FW','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10727,'REGGC',2,'1997-11-03','1997-12-01','1997-12-05',1,89.90, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10728,'QUEE',4,'1997-11-04','1997-12-02','1997-11-11',2,58.33, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10729,'LINOD',8,'1997-11-04','1997-12-16','1997-11-14',3,141.06, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10730,'BONAP',5,'1997-11-05','1997-12-03','1997-11-14',1,20.12, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10731,'CHOPS',7,'1997-11-06','1997-12-04','1997-11-14',1,96.65, + 'Chop-suey Chinese','Hauptstr. 31','Ber', + NULL,'3012','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10732,'BONAP',3,'1997-11-06','1997-12-04','1997-11-07',1,16.97, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10733,'BERGS',1,'1997-11-07','1997-12-05','1997-11-10',3,110.11, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10734,'GOURL',2,'1997-11-07','1997-12-05','1997-11-12',3,1.63, + 'Gourmet Lanchonetes','Av. Brasil, 442','Campinas', + 'SP','04876-786','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10735,'LETSS',6,'1997-11-10','1997-12-08','1997-11-21',2,45.97, + 'Let''s Stop N Shop','87 Polk St. Suite 5','San Francisco', + 'CA','94117','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10736,'HUNGO',9,'1997-11-11','1997-12-09','1997-11-21',2,44.10, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10737,'VINET',2,'1997-11-11','1997-12-09','1997-11-18',2,7.79, + 'Vins et alcools Chevalier','59 rue de l''Abbaye','Reims', + NULL,'51100','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10738,'SPECD',2,'1997-11-12','1997-12-10','1997-11-18',1,2.91, + 'Spécialités du monde','25, rue Lauristo','Paris', + NULL,'75016','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10739,'VINET',3,'1997-11-12','1997-12-10','1997-11-17',3,11.08, + 'Vins et alcools Chevalier','59 rue de l''Abbaye','Reims', + NULL,'51100','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10740,'WHITC',4,'1997-11-13','1997-12-11','1997-11-25',2,81.88, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10741,'AROUT',4,'1997-11-14','1997-11-28','1997-11-18',3,10.96, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10742,'BOTTM',3,'1997-11-14','1997-12-12','1997-11-18',3,243.73, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10743,'AROUT',1,'1997-11-17','1997-12-15','1997-11-21',2,23.72, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10744,'VAFFE',6,'1997-11-17','1997-12-15','1997-11-24',1,69.19, + 'Vaffeljernet','Smagsloget 45','Århus', + NULL,'8200','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10745,'QUICK',9,'1997-11-18','1997-12-16','1997-11-27',1,3.52, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10746,'CHOPS',1,'1997-11-19','1997-12-17','1997-11-21',3,31.43, + 'Chop-suey Chinese','Hauptstr. 31','Ber', + NULL,'3012','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10747,'PICCO',6,'1997-11-19','1997-12-17','1997-11-26',1,117.33, + 'Piccolo und mehr','Geislweg 14','Salzburg', + NULL,'5020','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10748,'SAVEA',3,'1997-11-20','1997-12-18','1997-11-28',1,232.55, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10749,'ISLAT',4,'1997-11-20','1997-12-18','1997-12-19',2,61.53, + 'Island Trading','Garden House Crowther Way','Cowes', + 'Isle of Wight','PO31 7PJ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10750,'WARTH',9,'1997-11-21','1997-12-19','1997-11-24',1,79.30, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10751,'RICSU',3,'1997-11-24','1997-12-22','1997-12-03',3,130.79, + 'Richter Supermarkt','Starenweg 5','Genève', + NULL,'1204','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10752,'NORTS',2,'1997-11-24','1997-12-22','1997-11-28',3,1.39, + 'North/South','South House 300 Queensbridge','Londo', + NULL,'SW7 1RZ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10753,'FRANS',3,'1997-11-25','1997-12-23','1997-11-27',1,7.70, + 'Franchi S.p.A.','Via Monte Bianco 34','Torino', + NULL,'10100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10754,'MAGAA',6,'1997-11-25','1997-12-23','1997-11-27',3,2.38, + 'Magazzini Alimentari Riuniti','Via Ludovico il Moro 22','Bergamo', + NULL,'24100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10755,'BONAP',4,'1997-11-26','1997-12-24','1997-11-28',2,16.71, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10756,'SPLIR',8,'1997-11-27','1997-12-25','1997-12-02',2,73.21, + 'Split Rail Beer & Ale','P.O. Box 555','Lander', + 'WY','82520','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10757,'SAVEA',6,'1997-11-27','1997-12-25','1997-12-15',1,8.19, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10758,'RICSU',3,'1997-11-28','1997-12-26','1997-12-04',3,138.17, + 'Richter Supermarkt','Starenweg 5','Genève', + NULL,'1204','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10759,'ANATR',3,'1997-11-28','1997-12-26','1997-12-12',3,11.99, + 'Ana Trujillo Emparedados y helados','Avda. de la Constitución 2222','México D.F.', + NULL,'05021','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10760,'MAISD',4,'1997-12-01','1997-12-29','1997-12-10',1,155.64, + 'Maison Dewey','Rue Joseph-Bens 532','Bruxelles', + NULL,'B-1180','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10761,'RATTC',5,'1997-12-02','1997-12-30','1997-12-08',2,18.66, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10762,'FOLKO',3,'1997-12-02','1997-12-30','1997-12-09',1,328.74, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10763,'FOLIG',3,'1997-12-03','1997-12-31','1997-12-08',3,37.35, + 'Folies gourmandes','184, chaussée de Tournai','Lille', + NULL,'59000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10764,'ERNSH',6,'1997-12-03','1997-12-31','1997-12-08',3,145.45, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10765,'QUICK',3,'1997-12-04','1998-01-01','1997-12-09',3,42.74, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10766,'OTTIK',4,'1997-12-05','1998-01-02','1997-12-09',1,157.55, + 'Ottilies Käselade','Mehrheimerstr. 369','Köl', + NULL,'50739','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10767,'SUPRD',4,'1997-12-05','1998-01-02','1997-12-15',3,1.59, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10768,'AROUT',3,'1997-12-08','1998-01-05','1997-12-15',2,146.32, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10769,'VAFFE',3,'1997-12-08','1998-01-05','1997-12-12',1,65.06, + 'Vaffeljernet','Smagsloget 45','Århus', + NULL,'8200','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10770,'HANAR',8,'1997-12-09','1998-01-06','1997-12-17',3,5.32, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10771,'ERNSH',9,'1997-12-10','1998-01-07','1998-01-02',2,11.19, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10772,'LEHMS',3,'1997-12-10','1998-01-07','1997-12-19',2,91.28, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10773,'ERNSH',1,'1997-12-11','1998-01-08','1997-12-16',3,96.43, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10774,'FOLKO',4,'1997-12-11','1997-12-25','1997-12-12',1,48.20, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10775,'THECR',7,'1997-12-12','1998-01-09','1997-12-26',1,20.25, + 'The Cracker Box','55 Grizzly Peak Rd.','Butte', + 'MT','59801','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10776,'ERNSH',1,'1997-12-15','1998-01-12','1997-12-18',3,351.53, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10777,'GOURL',7,'1997-12-15','1997-12-29','1998-01-21',2,3.01, + 'Gourmet Lanchonetes','Av. Brasil, 442','Campinas', + 'SP','04876-786','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10778,'BERGS',3,'1997-12-16','1998-01-13','1997-12-24',1,6.79, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10779,'MORGK',3,'1997-12-16','1998-01-13','1998-01-14',2,58.13, + 'Morgenstern Gesundkost','Heerstr. 22','Leipzig', + NULL,'04179','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10780,'LILAS',2,'1997-12-16','1997-12-30','1997-12-25',1,42.13, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10781,'WARTH',2,'1997-12-17','1998-01-14','1997-12-19',3,73.16, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10782,'CACTU',9,'1997-12-17','1998-01-14','1997-12-22',3,1.10, + 'Cactus Comidas para llevar','Cerrito 333','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10783,'HANAR',4,'1997-12-18','1998-01-15','1997-12-19',2,124.98, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10784,'MAGAA',4,'1997-12-18','1998-01-15','1997-12-22',3,70.09, + 'Magazzini Alimentari Riuniti','Via Ludovico il Moro 22','Bergamo', + NULL,'24100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10785,'GROSR',1,'1997-12-18','1998-01-15','1997-12-24',3,1.51, + 'GROSELLA-Restaurante','5ª Ave. Los Palos Grandes','Caracas', + 'DF','1081','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10786,'QUEE',8,'1997-12-19','1998-01-16','1997-12-23',1,110.87, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10787,'LAMAI',2,'1997-12-19','1998-01-02','1997-12-26',1,249.93, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10788,'QUICK',1,'1997-12-22','1998-01-19','1998-01-19',2,42.70, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10789,'FOLIG',1,'1997-12-22','1998-01-19','1997-12-31',2,100.60, + 'Folies gourmandes','184, chaussée de Tournai','Lille', + NULL,'59000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10790,'GOURL',6,'1997-12-22','1998-01-19','1997-12-26',1,28.23, + 'Gourmet Lanchonetes','Av. Brasil, 442','Campinas', + 'SP','04876-786','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10791,'FRANK',6,'1997-12-23','1998-01-20','1998-01-01',2,16.85, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10792,'WOLZA',1,'1997-12-23','1998-01-20','1997-12-31',3,23.79, + 'Wolski Zajazd','ul. Filtrowa 68','Warszawa', + NULL,'01-012','Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10793,'AROUT',3,'1997-12-24','1998-01-21','1998-01-08',3,4.52, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10794,'QUEDE',6,'1997-12-24','1998-01-21','1998-01-02',1,21.49, + 'Que Delícia','Rua da Panificadora, 12','Rio de Janeiro', + 'RJ','02389-673','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10795,'ERNSH',8,'1997-12-24','1998-01-21','1998-01-20',2,126.66, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10796,'HILAA',3,'1997-12-25','1998-01-22','1998-01-14',1,26.52, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10797,'DRACD',7,'1997-12-25','1998-01-22','1998-01-05',2,33.35, + 'Drachenblut Delikatesse','Walserweg 21','Aache', + NULL,'52066','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10798,'ISLAT',2,'1997-12-26','1998-01-23','1998-01-05',1,2.33, + 'Island Trading','Garden House Crowther Way','Cowes', + 'Isle of Wight','PO31 7PJ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10799,'KOENE',9,'1997-12-26','1998-02-06','1998-01-05',3,30.76, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10800,'SEVES',1,'1997-12-26','1998-01-23','1998-01-05',3,137.44, + 'Seven Seas Imports','90 Wadhurst Rd.','Londo', + NULL,'OX15 4NB','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10801,'BOLID',4,'1997-12-29','1998-01-26','1997-12-31',2,97.09, + 'Bólido Comidas preparadas','C/ Araquil, 67','Madrid', + NULL,'28023','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10802,'SIMOB',4,'1997-12-29','1998-01-26','1998-01-02',2,257.26, + 'Simons bistro','Vinbæltet 34','Kobenhav', + NULL,'1734','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10803,'WELLI',4,'1997-12-30','1998-01-27','1998-01-06',1,55.23, + 'Wellington Importadora','Rua do Mercado, 12','Resende', + 'SP','08737-363','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10804,'SEVES',6,'1997-12-30','1998-01-27','1998-01-07',2,27.33, + 'Seven Seas Imports','90 Wadhurst Rd.','Londo', + NULL,'OX15 4NB','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10805,'THEBI',2,'1997-12-30','1998-01-27','1998-01-09',3,237.34, + 'The Big Cheese','89 Jefferson Way Suite 2','Portland', + 'OR','97201','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10806,'VICTE',3,'1997-12-31','1998-01-28','1998-01-05',2,22.11, + 'Victuailles en stock','2, rue du Commerce','Lyo', + NULL,'69004','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10807,'FRANS',4,'1997-12-31','1998-01-28','1998-01-30',1,1.36, + 'Franchi S.p.A.','Via Monte Bianco 34','Torino', + NULL,'10100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10808,'OLDWO',2,'1998-01-01','1998-01-29','1998-01-09',3,45.53, + 'Old World Delicatesse','2743 Bering St.','Anchorage', + 'AK','99508','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10809,'WELLI',7,'1998-01-01','1998-01-29','1998-01-07',1,4.87, + 'Wellington Importadora','Rua do Mercado, 12','Resende', + 'SP','08737-363','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10810,'LAUGB',2,'1998-01-01','1998-01-29','1998-01-07',3,4.33, + 'Laughing Bacchus Wine Cellars','2319 Elm St.','Vancouver', + 'BC','V3F 2K1','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10811,'LINOD',8,'1998-01-02','1998-01-30','1998-01-08',1,31.22, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10812,'REGGC',5,'1998-01-02','1998-01-30','1998-01-12',1,59.78, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10813,'RICAR',1,'1998-01-05','1998-02-02','1998-01-09',1,47.38, + 'Ricardo Adocicados','Av. Copacabana, 267','Rio de Janeiro', + 'RJ','02389-890','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10814,'VICTE',3,'1998-01-05','1998-02-02','1998-01-14',3,130.94, + 'Victuailles en stock','2, rue du Commerce','Lyo', + NULL,'69004','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10815,'SAVEA',2,'1998-01-05','1998-02-02','1998-01-14',3,14.62, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10816,'GREAL',4,'1998-01-06','1998-02-03','1998-02-04',2,719.78, + 'Great Lakes Food Market','2732 Baker Blvd.','Eugene', + 'OR','97403','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10817,'KOENE',3,'1998-01-06','1998-01-20','1998-01-13',2,306.07, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10818,'MAGAA',7,'1998-01-07','1998-02-04','1998-01-12',3,65.48, + 'Magazzini Alimentari Riuniti','Via Ludovico il Moro 22','Bergamo', + NULL,'24100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10819,'CACTU',2,'1998-01-07','1998-02-04','1998-01-16',3,19.76, + 'Cactus Comidas para llevar','Cerrito 333','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10820,'RATTC',3,'1998-01-07','1998-02-04','1998-01-13',2,37.52, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10821,'SPLIR',1,'1998-01-08','1998-02-05','1998-01-15',1,36.68, + 'Split Rail Beer & Ale','P.O. Box 555','Lander', + 'WY','82520','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10822,'TRAIH',6,'1998-01-08','1998-02-05','1998-01-16',3,7.00, + 'Trail''s Head Gourmet Provisioners','722 DaVinci Blvd.','Kirkland', + 'WA','98034','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10823,'LILAS',5,'1998-01-09','1998-02-06','1998-01-13',2,163.97, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10824,'FOLKO',8,'1998-01-09','1998-02-06','1998-01-30',1,1.23, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10825,'DRACD',1,'1998-01-09','1998-02-06','1998-01-14',1,79.25, + 'Drachenblut Delikatesse','Walserweg 21','Aache', + NULL,'52066','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10826,'BLONP',6,'1998-01-12','1998-02-09','1998-02-06',1,7.09, + 'Blondel père et fils','24, place Kléber','Strasbourg', + NULL,'67000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10827,'BONAP',1,'1998-01-12','1998-01-26','1998-02-06',2,63.54, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10828,'RANCH',9,'1998-01-13','1998-01-27','1998-02-04',1,90.85, + 'Rancho grande','Av. del Libertador 900','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10829,'ISLAT',9,'1998-01-13','1998-02-10','1998-01-23',1,154.72, + 'Island Trading','Garden House Crowther Way','Cowes', + 'Isle of Wight','PO31 7PJ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10830,'TRADH',4,'1998-01-13','1998-02-24','1998-01-21',2,81.83, + 'Tradiçao Hipermercados','Av. Inês de Castro, 414','Sao Paulo', + 'SP','05634-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10831,'SANTG',3,'1998-01-14','1998-02-11','1998-01-23',2,72.19, + 'Santé Gourmet','Erling Skakkes gate 78','Staver', + NULL,'4110','Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10832,'LAMAI',2,'1998-01-14','1998-02-11','1998-01-19',2,43.26, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10833,'OTTIK',6,'1998-01-15','1998-02-12','1998-01-23',2,71.49, + 'Ottilies Käselade','Mehrheimerstr. 369','Köl', + NULL,'50739','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10834,'TRADH',1,'1998-01-15','1998-02-12','1998-01-19',3,29.78, + 'Tradiçao Hipermercados','Av. Inês de Castro, 414','Sao Paulo', + 'SP','05634-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10835,'ALFKI',1,'1998-01-15','1998-02-12','1998-01-21',3,69.53, + 'Alfred''s Futterkiste','Obere Str. 57','Berli', + NULL,'12209','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10836,'ERNSH',7,'1998-01-16','1998-02-13','1998-01-21',1,411.88, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10837,'BERGS',9,'1998-01-16','1998-02-13','1998-01-23',3,13.32, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10838,'LINOD',3,'1998-01-19','1998-02-16','1998-01-23',3,59.28, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10839,'TRADH',3,'1998-01-19','1998-02-16','1998-01-22',3,35.43, + 'Tradiçao Hipermercados','Av. Inês de Castro, 414','Sao Paulo', + 'SP','05634-030','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10840,'LINOD',4,'1998-01-19','1998-03-02','1998-02-16',2,2.71, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10841,'SUPRD',5,'1998-01-20','1998-02-17','1998-01-29',2,424.30, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10842,'TORTU',1,'1998-01-20','1998-02-17','1998-01-29',3,54.42, + 'Tortuga Restaurante','Avda. Azteca 123','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10843,'VICTE',4,'1998-01-21','1998-02-18','1998-01-26',2,9.26, + 'Victuailles en stock','2, rue du Commerce','Lyo', + NULL,'69004','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10844,'PICCO',8,'1998-01-21','1998-02-18','1998-01-26',2,25.22, + 'Piccolo und mehr','Geislweg 14','Salzburg', + NULL,'5020','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10845,'QUICK',8,'1998-01-21','1998-02-04','1998-01-30',1,212.98, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10846,'SUPRD',2,'1998-01-22','1998-03-05','1998-01-23',3,56.46, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10847,'SAVEA',4,'1998-01-22','1998-02-05','1998-02-10',3,487.57, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10848,'CONSH',7,'1998-01-23','1998-02-20','1998-01-29',2,38.24, + 'Consolidated Holdings','Berkeley Gardens 12 Brewery','Londo', + NULL,'WX1 6LT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10849,'KOENE',9,'1998-01-23','1998-02-20','1998-01-30',2,0.56, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10850,'VICTE',1,'1998-01-23','1998-03-06','1998-01-30',1,49.19, + 'Victuailles en stock','2, rue du Commerce','Lyo', + NULL,'69004','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10851,'RICAR',5,'1998-01-26','1998-02-23','1998-02-02',1,160.55, + 'Ricardo Adocicados','Av. Copacabana, 267','Rio de Janeiro', + 'RJ','02389-890','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10852,'RATTC',8,'1998-01-26','1998-02-09','1998-01-30',1,174.05, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10853,'BLAUS',9,'1998-01-27','1998-02-24','1998-02-03',2,53.83, + 'Blauer See Delikatesse','Forsterstr. 57','Mannheim', + NULL,'68306','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10854,'ERNSH',3,'1998-01-27','1998-02-24','1998-02-05',2,100.22, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10855,'OLDWO',3,'1998-01-27','1998-02-24','1998-02-04',1,170.97, + 'Old World Delicatesse','2743 Bering St.','Anchorage', + 'AK','99508','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10856,'ANTO',3,'1998-01-28','1998-02-25','1998-02-10',2,58.43, + 'Antonio Moreno Taquería','Mataderos 2312','México D.F.', + NULL,'05023','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10857,'BERGS',8,'1998-01-28','1998-02-25','1998-02-06',2,188.85, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10858,'LACOR',2,'1998-01-29','1998-02-26','1998-02-03',1,52.51, + 'La corne d''abondance','67, avenue de l''Europe','Versailles', + NULL,'78000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10859,'FRANK',1,'1998-01-29','1998-02-26','1998-02-02',2,76.10, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10860,'FRANR',3,'1998-01-29','1998-02-26','1998-02-04',3,19.26, + 'France restauratio','54, rue Royale','Nantes', + NULL,'44000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10861,'WHITC',4,'1998-01-30','1998-02-27','1998-02-17',2,14.93, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10862,'LEHMS',8,'1998-01-30','1998-03-13','1998-02-02',2,53.23, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10863,'HILAA',4,'1998-02-02','1998-03-02','1998-02-17',2,30.26, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10864,'AROUT',4,'1998-02-02','1998-03-02','1998-02-09',2,3.04, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10865,'QUICK',2,'1998-02-02','1998-02-16','1998-02-12',1,348.14, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10866,'BERGS',5,'1998-02-03','1998-03-03','1998-02-12',1,109.11, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10867,'LONEP',6,'1998-02-03','1998-03-17','1998-02-11',1,1.93, + 'Lonesome Pine Restaurant','89 Chiaroscuro Rd.','Portland', + 'OR','97219','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10868,'QUEE',7,'1998-02-04','1998-03-04','1998-02-23',2,191.27, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10869,'SEVES',5,'1998-02-04','1998-03-04','1998-02-09',1,143.28, + 'Seven Seas Imports','90 Wadhurst Rd.','Londo', + NULL,'OX15 4NB','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10870,'WOLZA',5,'1998-02-04','1998-03-04','1998-02-13',3,12.04, + 'Wolski Zajazd','ul. Filtrowa 68','Warszawa', + NULL,'01-012','Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10871,'BONAP',9,'1998-02-05','1998-03-05','1998-02-10',2,112.27, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10872,'GODOS',5,'1998-02-05','1998-03-05','1998-02-09',2,175.32, + 'Godos Cocina Típica','C/ Romero, 33','Sevilla', + NULL,'41101','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10873,'WILMK',4,'1998-02-06','1998-03-06','1998-02-09',1,0.82, + 'Wilman Kala','Keskuskatu 45','Helsinki', + NULL,'21240','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10874,'GODOS',5,'1998-02-06','1998-03-06','1998-02-11',2,19.58, + 'Godos Cocina Típica','C/ Romero, 33','Sevilla', + NULL,'41101','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10875,'BERGS',4,'1998-02-06','1998-03-06','1998-03-03',2,32.37, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10876,'BONAP',7,'1998-02-09','1998-03-09','1998-02-12',3,60.42, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10877,'RICAR',1,'1998-02-09','1998-03-09','1998-02-19',1,38.06, + 'Ricardo Adocicados','Av. Copacabana, 267','Rio de Janeiro', + 'RJ','02389-890','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10878,'QUICK',4,'1998-02-10','1998-03-10','1998-02-12',1,46.69, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10879,'WILMK',3,'1998-02-10','1998-03-10','1998-02-12',3,8.50, + 'Wilman Kala','Keskuskatu 45','Helsinki', + NULL,'21240','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10880,'FOLKO',7,'1998-02-10','1998-03-24','1998-02-18',1,88.01, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10881,'CACTU',4,'1998-02-11','1998-03-11','1998-02-18',1,2.84, + 'Cactus Comidas para llevar','Cerrito 333','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10882,'SAVEA',4,'1998-02-11','1998-03-11','1998-02-20',3,23.10, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10883,'LONEP',8,'1998-02-12','1998-03-12','1998-02-20',3,0.53, + 'Lonesome Pine Restaurant','89 Chiaroscuro Rd.','Portland', + 'OR','97219','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10884,'LETSS',4,'1998-02-12','1998-03-12','1998-02-13',2,90.97, + 'Let''s Stop N Shop','87 Polk St. Suite 5','San Francisco', + 'CA','94117','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10885,'SUPRD',6,'1998-02-12','1998-03-12','1998-02-18',3,5.64, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10886,'HANAR',1,'1998-02-13','1998-03-13','1998-03-02',1,4.99, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10887,'GALED',8,'1998-02-13','1998-03-13','1998-02-16',3,1.25, + 'Galería del gastronómo','Rambla de Cataluña, 23','Barcelona', + NULL,'8022','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10888,'GODOS',1,'1998-02-16','1998-03-16','1998-02-23',2,51.87, + 'Godos Cocina Típica','C/ Romero, 33','Sevilla', + NULL,'41101','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10889,'RATTC',9,'1998-02-16','1998-03-16','1998-02-23',3,280.61, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10890,'DUMO',7,'1998-02-16','1998-03-16','1998-02-18',1,32.76, + 'Du monde entier','67, rue des Cinquante Otages','Nantes', + NULL,'44000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10891,'LEHMS',7,'1998-02-17','1998-03-17','1998-02-19',2,20.37, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10892,'MAISD',4,'1998-02-17','1998-03-17','1998-02-19',2,120.27, + 'Maison Dewey','Rue Joseph-Bens 532','Bruxelles', + NULL,'B-1180','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10893,'KOENE',9,'1998-02-18','1998-03-18','1998-02-20',2,77.78, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10894,'SAVEA',1,'1998-02-18','1998-03-18','1998-02-20',1,116.13, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10895,'ERNSH',3,'1998-02-18','1998-03-18','1998-02-23',1,162.75, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10896,'MAISD',7,'1998-02-19','1998-03-19','1998-02-27',3,32.45, + 'Maison Dewey','Rue Joseph-Bens 532','Bruxelles', + NULL,'B-1180','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10897,'HUNGO',3,'1998-02-19','1998-03-19','1998-02-25',2,603.54, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10898,'OCEA',4,'1998-02-20','1998-03-20','1998-03-06',2,1.27, + 'Océano Atlántico Ltda.','Ing. Gustavo Moncada 8585 Piso 20-A','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10899,'LILAS',5,'1998-02-20','1998-03-20','1998-02-26',3,1.21, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10900,'WELLI',1,'1998-02-20','1998-03-20','1998-03-04',2,1.66, + 'Wellington Importadora','Rua do Mercado, 12','Resende', + 'SP','08737-363','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10901,'HILAA',4,'1998-02-23','1998-03-23','1998-02-26',1,62.09, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10902,'FOLKO',1,'1998-02-23','1998-03-23','1998-03-03',1,44.15, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10903,'HANAR',3,'1998-02-24','1998-03-24','1998-03-04',3,36.71, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10904,'WHITC',3,'1998-02-24','1998-03-24','1998-02-27',3,162.95, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10905,'WELLI',9,'1998-02-24','1998-03-24','1998-03-06',2,13.72, + 'Wellington Importadora','Rua do Mercado, 12','Resende', + 'SP','08737-363','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10906,'WOLZA',4,'1998-02-25','1998-03-11','1998-03-03',3,26.29, + 'Wolski Zajazd','ul. Filtrowa 68','Warszawa', + NULL,'01-012','Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10907,'SPECD',6,'1998-02-25','1998-03-25','1998-02-27',3,9.19, + 'Spécialités du monde','25, rue Lauristo','Paris', + NULL,'75016','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10908,'REGGC',4,'1998-02-26','1998-03-26','1998-03-06',2,32.96, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10909,'SANTG',1,'1998-02-26','1998-03-26','1998-03-10',2,53.05, + 'Santé Gourmet','Erling Skakkes gate 78','Staver', + NULL,'4110','Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10910,'WILMK',1,'1998-02-26','1998-03-26','1998-03-04',3,38.11, + 'Wilman Kala','Keskuskatu 45','Helsinki', + NULL,'21240','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10911,'GODOS',3,'1998-02-26','1998-03-26','1998-03-05',1,38.19, + 'Godos Cocina Típica','C/ Romero, 33','Sevilla', + NULL,'41101','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10912,'HUNGO',2,'1998-02-26','1998-03-26','1998-03-18',2,580.91, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10913,'QUEE',4,'1998-02-26','1998-03-26','1998-03-04',1,33.05, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10914,'QUEE',6,'1998-02-27','1998-03-27','1998-03-02',1,21.19, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10915,'TORTU',2,'1998-02-27','1998-03-27','1998-03-02',2,3.51, + 'Tortuga Restaurante','Avda. Azteca 123','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10916,'RANCH',1,'1998-02-27','1998-03-27','1998-03-09',2,63.77, + 'Rancho grande','Av. del Libertador 900','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10917,'ROMEY',4,'1998-03-02','1998-03-30','1998-03-11',2,8.29, + 'Romero y tomillo','Gran Vía, 1','Madrid', + NULL,'28001','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10918,'BOTTM',3,'1998-03-02','1998-03-30','1998-03-11',3,48.83, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10919,'LINOD',2,'1998-03-02','1998-03-30','1998-03-04',2,19.80, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10920,'AROUT',4,'1998-03-03','1998-03-31','1998-03-09',2,29.61, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10921,'VAFFE',1,'1998-03-03','1998-04-14','1998-03-09',1,176.48, + 'Vaffeljernet','Smagsloget 45','Århus', + NULL,'8200','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10922,'HANAR',5,'1998-03-03','1998-03-31','1998-03-05',3,62.74, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10923,'LAMAI',7,'1998-03-03','1998-04-14','1998-03-13',3,68.26, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10924,'BERGS',3,'1998-03-04','1998-04-01','1998-04-08',2,151.52, + 'Berglunds snabbköp','Berguvsvägen 8','Luleå', + NULL,'S-958 22','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10925,'HANAR',3,'1998-03-04','1998-04-01','1998-03-13',1,2.27, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10926,'ANATR',4,'1998-03-04','1998-04-01','1998-03-11',3,39.92, + 'Ana Trujillo Emparedados y helados','Avda. de la Constitución 2222','México D.F.', + NULL,'05021','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10927,'LACOR',4,'1998-03-05','1998-04-02','1998-04-08',1,19.79, + 'La corne d''abondance','67, avenue de l''Europe','Versailles', + NULL,'78000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10928,'GALED',1,'1998-03-05','1998-04-02','1998-03-18',1,1.36, + 'Galería del gastronómo','Rambla de Cataluña, 23','Barcelona', + NULL,'8022','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10929,'FRANK',6,'1998-03-05','1998-04-02','1998-03-12',1,33.93, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10930,'SUPRD',4,'1998-03-06','1998-04-17','1998-03-18',3,15.55, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10931,'RICSU',4,'1998-03-06','1998-03-20','1998-03-19',2,13.60, + 'Richter Supermarkt','Starenweg 5','Genève', + NULL,'1204','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10932,'BONAP',8,'1998-03-06','1998-04-03','1998-03-24',1,134.64, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10933,'ISLAT',6,'1998-03-06','1998-04-03','1998-03-16',3,54.15, + 'Island Trading','Garden House Crowther Way','Cowes', + 'Isle of Wight','PO31 7PJ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10934,'LEHMS',3,'1998-03-09','1998-04-06','1998-03-12',3,32.01, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10935,'WELLI',4,'1998-03-09','1998-04-06','1998-03-18',3,47.59, + 'Wellington Importadora','Rua do Mercado, 12','Resende', + 'SP','08737-363','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10936,'GREAL',3,'1998-03-09','1998-04-06','1998-03-18',2,33.68, + 'Great Lakes Food Market','2732 Baker Blvd.','Eugene', + 'OR','97403','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10937,'CACTU',7,'1998-03-10','1998-03-24','1998-03-13',3,31.51, + 'Cactus Comidas para llevar','Cerrito 333','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10938,'QUICK',3,'1998-03-10','1998-04-07','1998-03-16',2,31.89, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10939,'MAGAA',2,'1998-03-10','1998-04-07','1998-03-13',2,76.33, + 'Magazzini Alimentari Riuniti','Via Ludovico il Moro 22','Bergamo', + NULL,'24100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10940,'BONAP',8,'1998-03-11','1998-04-08','1998-03-23',3,19.77, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10941,'SAVEA',7,'1998-03-11','1998-04-08','1998-03-20',2,400.81, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10942,'REGGC',9,'1998-03-11','1998-04-08','1998-03-18',3,17.95, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10943,'BSBEV',4,'1998-03-11','1998-04-08','1998-03-19',2,2.17, + 'B''s Beverages','Fauntleroy Circus','Londo', + NULL,'EC2 5NT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10944,'BOTTM',6,'1998-03-12','1998-03-26','1998-03-13',3,52.92, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10945,'MORGK',4,'1998-03-12','1998-04-09','1998-03-18',1,10.22, + 'Morgenstern Gesundkost','Heerstr. 22','Leipzig', + NULL,'04179','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10946,'VAFFE',1,'1998-03-12','1998-04-09','1998-03-19',2,27.20, + 'Vaffeljernet','Smagsloget 45','Århus', + NULL,'8200','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10947,'BSBEV',3,'1998-03-13','1998-04-10','1998-03-16',2,3.26, + 'B''s Beverages','Fauntleroy Circus','Londo', + NULL,'EC2 5NT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10948,'GODOS',3,'1998-03-13','1998-04-10','1998-03-19',3,23.39, + 'Godos Cocina Típica','C/ Romero, 33','Sevilla', + NULL,'41101','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10949,'BOTTM',2,'1998-03-13','1998-04-10','1998-03-17',3,74.44, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10950,'MAGAA',1,'1998-03-16','1998-04-13','1998-03-23',2,2.50, + 'Magazzini Alimentari Riuniti','Via Ludovico il Moro 22','Bergamo', + NULL,'24100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10951,'RICSU',9,'1998-03-16','1998-04-27','1998-04-07',2,30.85, + 'Richter Supermarkt','Starenweg 5','Genève', + NULL,'1204','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10952,'ALFKI',1,'1998-03-16','1998-04-27','1998-03-24',1,40.42, + 'Alfred''s Futterkiste','Obere Str. 57','Berli', + NULL,'12209','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10953,'AROUT',9,'1998-03-16','1998-03-30','1998-03-25',2,23.72, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10954,'LINOD',5,'1998-03-17','1998-04-28','1998-03-20',1,27.91, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10955,'FOLKO',8,'1998-03-17','1998-04-14','1998-03-20',2,3.26, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10956,'BLAUS',6,'1998-03-17','1998-04-28','1998-03-20',2,44.65, + 'Blauer See Delikatesse','Forsterstr. 57','Mannheim', + NULL,'68306','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10957,'HILAA',8,'1998-03-18','1998-04-15','1998-03-27',3,105.36, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10958,'OCEA',7,'1998-03-18','1998-04-15','1998-03-27',2,49.56, + 'Océano Atlántico Ltda.','Ing. Gustavo Moncada 8585 Piso 20-A','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10959,'GOURL',6,'1998-03-18','1998-04-29','1998-03-23',2,4.98, + 'Gourmet Lanchonetes','Av. Brasil, 442','Campinas', + 'SP','04876-786','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10960,'HILAA',3,'1998-03-19','1998-04-02','1998-04-08',1,2.08, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10961,'QUEE',8,'1998-03-19','1998-04-16','1998-03-30',1,104.47, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10962,'QUICK',8,'1998-03-19','1998-04-16','1998-03-23',2,275.79, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10963,'FURIB',9,'1998-03-19','1998-04-16','1998-03-26',3,2.70, + 'Furia Bacalhau e Frutos do Mar','Jardim das rosas n. 32','Lisboa', + NULL,'1675','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10964,'SPECD',3,'1998-03-20','1998-04-17','1998-03-24',2,87.38, + 'Spécialités du monde','25, rue Lauristo','Paris', + NULL,'75016','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10965,'OLDWO',6,'1998-03-20','1998-04-17','1998-03-30',3,144.38, + 'Old World Delicatesse','2743 Bering St.','Anchorage', + 'AK','99508','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10966,'CHOPS',4,'1998-03-20','1998-04-17','1998-04-08',1,27.19, + 'Chop-suey Chinese','Hauptstr. 31','Ber', + NULL,'3012','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10967,'TOMSP',2,'1998-03-23','1998-04-20','1998-04-02',2,62.22, + 'Toms Spezialitäte','Luisenstr. 48','Münster', + NULL,'44087','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10968,'ERNSH',1,'1998-03-23','1998-04-20','1998-04-01',3,74.60, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10969,'COMMI',1,'1998-03-23','1998-04-20','1998-03-30',2,0.21, + 'Comércio Mineiro','Av. dos Lusíadas, 23','Sao Paulo', + 'SP','05432-043','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10970,'BOLID',9,'1998-03-24','1998-04-07','1998-04-24',1,16.16, + 'Bólido Comidas preparadas','C/ Araquil, 67','Madrid', + NULL,'28023','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10971,'FRANR',2,'1998-03-24','1998-04-21','1998-04-02',2,121.82, + 'France restauratio','54, rue Royale','Nantes', + NULL,'44000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10972,'LACOR',4,'1998-03-24','1998-04-21','1998-03-26',2,0.02, + 'La corne d''abondance','67, avenue de l''Europe','Versailles', + NULL,'78000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10973,'LACOR',6,'1998-03-24','1998-04-21','1998-03-27',2,15.17, + 'La corne d''abondance','67, avenue de l''Europe','Versailles', + NULL,'78000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10974,'SPLIR',3,'1998-03-25','1998-04-08','1998-04-03',3,12.96, + 'Split Rail Beer & Ale','P.O. Box 555','Lander', + 'WY','82520','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10975,'BOTTM',1,'1998-03-25','1998-04-22','1998-03-27',3,32.27, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10976,'HILAA',1,'1998-03-25','1998-05-06','1998-04-03',1,37.97, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10977,'FOLKO',8,'1998-03-26','1998-04-23','1998-04-10',3,208.50, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10978,'MAISD',9,'1998-03-26','1998-04-23','1998-04-23',2,32.82, + 'Maison Dewey','Rue Joseph-Bens 532','Bruxelles', + NULL,'B-1180','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10979,'ERNSH',8,'1998-03-26','1998-04-23','1998-03-31',2,353.07, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10980,'FOLKO',4,'1998-03-27','1998-05-08','1998-04-17',1,1.26, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10981,'HANAR',1,'1998-03-27','1998-04-24','1998-04-02',2,193.37, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10982,'BOTTM',2,'1998-03-27','1998-04-24','1998-04-08',1,14.01, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10983,'SAVEA',2,'1998-03-27','1998-04-24','1998-04-06',2,657.54, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10984,'SAVEA',1,'1998-03-30','1998-04-27','1998-04-03',3,211.22, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10985,'HUNGO',2,'1998-03-30','1998-04-27','1998-04-02',1,91.51, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10986,'OCEA',8,'1998-03-30','1998-04-27','1998-04-21',2,217.86, + 'Océano Atlántico Ltda.','Ing. Gustavo Moncada 8585 Piso 20-A','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10987,'EASTC',8,'1998-03-31','1998-04-28','1998-04-06',1,185.48, + 'Eastern Connectio','35 King George','Londo', + NULL,'WX3 6FW','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10988,'RATTC',3,'1998-03-31','1998-04-28','1998-04-10',2,61.14, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10989,'QUEDE',2,'1998-03-31','1998-04-28','1998-04-02',1,34.76, + 'Que Delícia','Rua da Panificadora, 12','Rio de Janeiro', + 'RJ','02389-673','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10990,'ERNSH',2,'1998-04-01','1998-05-13','1998-04-07',3,117.61, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10991,'QUICK',1,'1998-04-01','1998-04-29','1998-04-07',1,38.51, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10992,'THEBI',1,'1998-04-01','1998-04-29','1998-04-03',3,4.27, + 'The Big Cheese','89 Jefferson Way Suite 2','Portland', + 'OR','97201','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10993,'FOLKO',7,'1998-04-01','1998-04-29','1998-04-10',3,8.81, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10994,'VAFFE',2,'1998-04-02','1998-04-16','1998-04-09',3,65.53, + 'Vaffeljernet','Smagsloget 45','Århus', + NULL,'8200','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10995,'PERIC',1,'1998-04-02','1998-04-30','1998-04-06',3,46.00, + 'Pericles Comidas clásicas','Calle Dr. Jorge Cash 321','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10996,'QUICK',4,'1998-04-02','1998-04-30','1998-04-10',2,1.12, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10997,'LILAS',8,'1998-04-03','1998-05-15','1998-04-13',2,73.91, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10998,'WOLZA',8,'1998-04-03','1998-04-17','1998-04-17',2,20.31, + 'Wolski Zajazd','ul. Filtrowa 68','Warszawa', + NULL,'01-012','Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10999,'OTTIK',6,'1998-04-03','1998-05-01','1998-04-10',2,96.35, + 'Ottilies Käselade','Mehrheimerstr. 369','Köl', + NULL,'50739','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11000,'RATTC',2,'1998-04-06','1998-05-04','1998-04-14',3,55.12, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11001,'FOLKO',2,'1998-04-06','1998-05-04','1998-04-14',2,197.30, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11002,'SAVEA',4,'1998-04-06','1998-05-04','1998-04-16',1,141.16, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11003,'THECR',3,'1998-04-06','1998-05-04','1998-04-08',3,14.91, + 'The Cracker Box','55 Grizzly Peak Rd.','Butte', + 'MT','59801','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11004,'MAISD',3,'1998-04-07','1998-05-05','1998-04-20',1,44.84, + 'Maison Dewey','Rue Joseph-Bens 532','Bruxelles', + NULL,'B-1180','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11005,'WILMK',2,'1998-04-07','1998-05-05','1998-04-10',1,0.75, + 'Wilman Kala','Keskuskatu 45','Helsinki', + NULL,'21240','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11006,'GREAL',3,'1998-04-07','1998-05-05','1998-04-15',2,25.19, + 'Great Lakes Food Market','2732 Baker Blvd.','Eugene', + 'OR','97403','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11007,'PRINI',8,'1998-04-08','1998-05-06','1998-04-13',2,202.24, + 'Princesa Isabel Vinhos','Estrada da saúde n. 58','Lisboa', + NULL,'1756','Portugal'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11008,'ERNSH',7,'1998-04-08','1998-05-06',NULL,3,79.46, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11009,'GODOS',2,'1998-04-08','1998-05-06','1998-04-10',1,59.11, + 'Godos Cocina Típica','C/ Romero, 33','Sevilla', + NULL,'41101','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11010,'REGGC',2,'1998-04-09','1998-05-07','1998-04-21',2,28.71, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11011,'ALFKI',3,'1998-04-09','1998-05-07','1998-04-13',1,1.21, + 'Alfred''s Futterkiste','Obere Str. 57','Berli', + NULL,'12209','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11012,'FRANK',1,'1998-04-09','1998-04-23','1998-04-17',3,242.95, + 'Frankenversand','Berliner Platz 43','Münche', + NULL,'80805','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11013,'ROMEY',2,'1998-04-09','1998-05-07','1998-04-10',1,32.99, + 'Romero y tomillo','Gran Vía, 1','Madrid', + NULL,'28001','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11014,'LINOD',2,'1998-04-10','1998-05-08','1998-04-15',3,23.60, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11015,'SANTG',2,'1998-04-10','1998-04-24','1998-04-20',2,4.62, + 'Santé Gourmet','Erling Skakkes gate 78','Staver', + NULL,'4110','Norway'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11016,'AROUT',9,'1998-04-10','1998-05-08','1998-04-13',2,33.80, + 'Around the Hor','Brook Farm Stratford St. Mary','Colchester', + 'Essex','CO7 6JX','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11017,'ERNSH',9,'1998-04-13','1998-05-11','1998-04-20',2,754.26, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11018,'LONEP',4,'1998-04-13','1998-05-11','1998-04-16',2,11.65, + 'Lonesome Pine Restaurant','89 Chiaroscuro Rd.','Portland', + 'OR','97219','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11019,'RANCH',6,'1998-04-13','1998-05-11',NULL,3,3.17, + 'Rancho grande','Av. del Libertador 900','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11020,'OTTIK',2,'1998-04-14','1998-05-12','1998-04-16',2,43.30, + 'Ottilies Käselade','Mehrheimerstr. 369','Köl', + NULL,'50739','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11021,'QUICK',3,'1998-04-14','1998-05-12','1998-04-21',1,297.18, + 'QUICK-Stop','Taucherstraße 10','Cunewalde', + NULL,'01307','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11022,'HANAR',9,'1998-04-14','1998-05-12','1998-05-04',2,6.27, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11023,'BSBEV',1,'1998-04-14','1998-04-28','1998-04-24',2,123.83, + 'B''s Beverages','Fauntleroy Circus','Londo', + NULL,'EC2 5NT','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11024,'EASTC',4,'1998-04-15','1998-05-13','1998-04-20',1,74.36, + 'Eastern Connectio','35 King George','Londo', + NULL,'WX3 6FW','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11025,'WARTH',6,'1998-04-15','1998-05-13','1998-04-24',3,29.17, + 'Wartian Herkku','Torikatu 38','Oulu', + NULL,'90110','Finland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11026,'FRANS',4,'1998-04-15','1998-05-13','1998-04-28',1,47.09, + 'Franchi S.p.A.','Via Monte Bianco 34','Torino', + NULL,'10100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11027,'BOTTM',1,'1998-04-16','1998-05-14','1998-04-20',1,52.52, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11028,'KOENE',2,'1998-04-16','1998-05-14','1998-04-22',1,29.59, + 'Königlich Esse','Maubelstr. 90','Brandenburg', + NULL,'14776','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11029,'CHOPS',4,'1998-04-16','1998-05-14','1998-04-27',1,47.84, + 'Chop-suey Chinese','Hauptstr. 31','Ber', + NULL,'3012','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11030,'SAVEA',7,'1998-04-17','1998-05-15','1998-04-27',2,830.75, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11031,'SAVEA',6,'1998-04-17','1998-05-15','1998-04-24',2,227.22, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11032,'WHITC',2,'1998-04-17','1998-05-15','1998-04-23',3,606.19, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11033,'RICSU',7,'1998-04-17','1998-05-15','1998-04-23',3,84.74, + 'Richter Supermarkt','Starenweg 5','Genève', + NULL,'1204','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11034,'OLDWO',8,'1998-04-20','1998-06-01','1998-04-27',1,40.32, + 'Old World Delicatesse','2743 Bering St.','Anchorage', + 'AK','99508','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11035,'SUPRD',2,'1998-04-20','1998-05-18','1998-04-24',2,0.17, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11036,'DRACD',8,'1998-04-20','1998-05-18','1998-04-22',3,149.47, + 'Drachenblut Delikatesse','Walserweg 21','Aache', + NULL,'52066','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11037,'GODOS',7,'1998-04-21','1998-05-19','1998-04-27',1,3.20, + 'Godos Cocina Típica','C/ Romero, 33','Sevilla', + NULL,'41101','Spai'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11038,'SUPRD',1,'1998-04-21','1998-05-19','1998-04-30',2,29.59, + 'Suprêmes délices','Boulevard Tirou, 255','Charleroi', + NULL,'B-6000','Belgium'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11039,'LINOD',1,'1998-04-21','1998-05-19',NULL,2,65.00, + 'LINO-Delicateses','Ave. 5 de Mayo Porlamar','I. de Margarita', + 'Nueva Esparta','4980','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11040,'GREAL',4,'1998-04-22','1998-05-20',NULL,3,18.84, + 'Great Lakes Food Market','2732 Baker Blvd.','Eugene', + 'OR','97403','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11041,'CHOPS',3,'1998-04-22','1998-05-20','1998-04-28',2,48.22, + 'Chop-suey Chinese','Hauptstr. 31','Ber', + NULL,'3012','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11042,'COMMI',2,'1998-04-22','1998-05-06','1998-05-01',1,29.99, + 'Comércio Mineiro','Av. dos Lusíadas, 23','Sao Paulo', + 'SP','05432-043','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11043,'SPECD',5,'1998-04-22','1998-05-20','1998-04-29',2,8.80, + 'Spécialités du monde','25, rue Lauristo','Paris', + NULL,'75016','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11044,'WOLZA',4,'1998-04-23','1998-05-21','1998-05-01',1,8.72, + 'Wolski Zajazd','ul. Filtrowa 68','Warszawa', + NULL,'01-012','Poland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11045,'BOTTM',6,'1998-04-23','1998-05-21',NULL,2,70.58, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11046,'WANDK',8,'1998-04-23','1998-05-21','1998-04-24',2,71.64, + 'Die Wandernde Kuh','Adenauerallee 900','Stuttgart', + NULL,'70563','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11047,'EASTC',7,'1998-04-24','1998-05-22','1998-05-01',3,46.62, + 'Eastern Connectio','35 King George','Londo', + NULL,'WX3 6FW','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11048,'BOTTM',7,'1998-04-24','1998-05-22','1998-04-30',3,24.12, + 'Bottom-Dollar Markets','23 Tsawassen Blvd.','Tsawasse', + 'BC','T2F 8M4','Canada'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11049,'GOURL',3,'1998-04-24','1998-05-22','1998-05-04',1,8.34, + 'Gourmet Lanchonetes','Av. Brasil, 442','Campinas', + 'SP','04876-786','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11050,'FOLKO',8,'1998-04-27','1998-05-25','1998-05-05',2,59.41, + 'Folk och fä HB','Åkergatan 24','Bräcke', + NULL,'S-844 67','Swede'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11051,'LAMAI',7,'1998-04-27','1998-05-25',NULL,3,2.79, + 'La maison d''Asie','1 rue Alsace-Lorraine','Toulouse', + NULL,'31000','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11052,'HANAR',3,'1998-04-27','1998-05-25','1998-05-01',1,67.26, + 'Hanari Carnes','Rua do Paço, 67','Rio de Janeiro', + 'RJ','05454-876','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11053,'PICCO',2,'1998-04-27','1998-05-25','1998-04-29',2,53.05, + 'Piccolo und mehr','Geislweg 14','Salzburg', + NULL,'5020','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11054,'CACTU',8,'1998-04-28','1998-05-26',NULL,1,0.33, + 'Cactus Comidas para llevar','Cerrito 333','Buenos Aires', + NULL,'1010','Argentina'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11055,'HILAA',7,'1998-04-28','1998-05-26','1998-05-05',2,120.92, + 'HILARION-Abastos','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal', + 'Táchira','5022','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11056,'EASTC',8,'1998-04-28','1998-05-12','1998-05-01',2,278.96, + 'Eastern Connectio','35 King George','Londo', + NULL,'WX3 6FW','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11057,'NORTS',3,'1998-04-29','1998-05-27','1998-05-01',3,4.13, + 'North/South','South House 300 Queensbridge','Londo', + NULL,'SW7 1RZ','UK'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11058,'BLAUS',9,'1998-04-29','1998-05-27',NULL,3,31.14, + 'Blauer See Delikatesse','Forsterstr. 57','Mannheim', + NULL,'68306','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11059,'RICAR',2,'1998-04-29','1998-06-10',NULL,2,85.80, + 'Ricardo Adocicados','Av. Copacabana, 267','Rio de Janeiro', + 'RJ','02389-890','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11060,'FRANS',2,'1998-04-30','1998-05-28','1998-05-04',2,10.98, + 'Franchi S.p.A.','Via Monte Bianco 34','Torino', + NULL,'10100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11061,'GREAL',4,'1998-04-30','1998-06-11',NULL,3,14.01, + 'Great Lakes Food Market','2732 Baker Blvd.','Eugene', + 'OR','97403','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11062,'REGGC',4,'1998-04-30','1998-05-28',NULL,2,29.93, + 'Reggiani Caseifici','Strada Provinciale 124','Reggio Emilia', + NULL,'42100','Italy'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11063,'HUNGO',3,'1998-04-30','1998-05-28','1998-05-06',2,81.73, + 'Hungry Owl All-Night Grocers','8 Johnstown Road','Cork', + 'Co. Cork',NULL,'Ireland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11064,'SAVEA',1,'1998-05-01','1998-05-29','1998-05-04',1,30.09, + 'Save-a-lot Markets','187 Suffolk Ln.','Boise', + 'ID','83720','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11065,'LILAS',8,'1998-05-01','1998-05-29',NULL,1,12.91, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11066,'WHITC',7,'1998-05-01','1998-05-29','1998-05-04',2,44.72, + 'White Clover Markets','1029 - 12th Ave. S.','Seattle', + 'WA','98124','USA'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11067,'DRACD',1,'1998-05-04','1998-05-18','1998-05-06',2,7.98, + 'Drachenblut Delikatesse','Walserweg 21','Aache', + NULL,'52066','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11068,'QUEE',8,'1998-05-04','1998-06-01',NULL,2,81.75, + 'Queen Cozinha','Alameda dos Canàrios, 891','Sao Paulo', + 'SP','05487-020','Brazil'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11069,'TORTU',1,'1998-05-04','1998-06-01','1998-05-06',2,15.67, + 'Tortuga Restaurante','Avda. Azteca 123','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11070,'LEHMS',2,'1998-05-05','1998-06-02',NULL,1,136.00, + 'Lehmanns Marktstand','Magazinweg 7','Frankfurt a.M.', + NULL,'60528','Germany'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11071,'LILAS',1,'1998-05-05','1998-06-02',NULL,1,0.93, + 'LILA-Supermercado','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto', + 'Lara','3508','Venezuela'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11072,'ERNSH',4,'1998-05-05','1998-06-02',NULL,2,258.64, + 'Ernst Handel','Kirchgasse 6','Graz', + NULL,'8010','Austria'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11073,'PERIC',2,'1998-05-05','1998-06-02',NULL,2,24.95, + 'Pericles Comidas clásicas','Calle Dr. Jorge Cash 321','México D.F.', + NULL,'05033','Mexico'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11074,'SIMOB',7,'1998-05-06','1998-06-03',NULL,2,18.44, + 'Simons bistro','Vinbæltet 34','Kobenhav', + NULL,'1734','Denmark'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11075,'RICSU',8,'1998-05-06','1998-06-03',NULL,2,6.19, + 'Richter Supermarkt','Starenweg 5','Genève', + NULL,'1204','Switzerland'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11076,'BONAP',4,'1998-05-06','1998-06-03',NULL,2,38.28, + 'Bon app''','12, rue des Bouchers','Marseille', + NULL,'13008','France'); +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11077,'RATTC',1,'1998-05-06','1998-06-03',NULL,2,8.53, + 'Rattlesnake Canyon Grocery','2817 Milton Dr.','Albuquerque', + 'NM','87110','USA'); + + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(1,'Chai',1,1,'10 boxes x 20 bags',18,39,0,10,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(2,'Chang',1,1,'24 - 12 oz bottles',19,17,40,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(3,'Aniseed Syrup',1,2,'12 - 550 ml bottles',10,13,70,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(4,'Chef Anton''s Cajun Seasoning',2,2,'48 - 6 oz jars',22,53,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(5,'Chef Anton''s Gumbo Mix',2,2,'36 boxes',21.35,0,0,0,1); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(6,'Grandma''s Boysenberry Spread',3,2,'12 - 8 oz jars',25,120,0,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(7,'Uncle Bob''s Organic Dried Pears',3,7,'12 - 1 lb pkgs.',30,15,0,10,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(8,'Northwoods Cranberry Sauce',3,2,'12 - 12 oz jars',40,6,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(9,'Mishi Kobe Niku',4,6,'18 - 500 g pkgs.',97,29,0,0,1); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(10,'Ikura',4,8,'12 - 200 ml jars',31,31,0,0,0); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(11,'Queso Cabrales',5,4,'1 kg pkg.',21,22,30,30,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(12,'Queso Manchego La Pastora',5,4,'10 - 500 g pkgs.',38,86,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(13,'Konbu',6,8,'2 kg box',6,24,0,5,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(14,'Tofu',6,7,'40 - 100 g pkgs.',23.25,35,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(15,'Genen Shouyu',6,2,'24 - 250 ml bottles',15.5,39,0,5,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(16,'Pavlova',7,3,'32 - 500 g boxes',17.45,29,0,10,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(17,'Alice Mutton',7,6,'20 - 1 kg tins',39,0,0,0,1); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(18,'Carnarvon Tigers',7,8,'16 kg pkg.',62.5,42,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(19,'Teatime Chocolate Biscuits',8,3,'10 boxes x 12 pieces',9.2,25,0,5,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(20,'Sir Rodney''s Marmalade',8,3,'30 gift boxes',81,40,0,0,0); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(21,'Sir Rodney''s Scones',8,3,'24 pkgs. x 4 pieces',10,3,40,5,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(22,'Gustaf''s Knäckebröd',9,5,'24 - 500 g pkgs.',21,104,0,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(23,'Tunnbröd',9,5,'12 - 250 g pkgs.',9,61,0,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(24,'Guaraná Fantástica',10,1,'12 - 355 ml cans',4.5,20,0,0,1); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(25,'NuNuCa Nuß-Nougat-Creme',11,3,'20 - 450 g glasses',14,76,0,30,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(26,'Gumbär Gummibärchen',11,3,'100 - 250 g bags',31.23,15,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(27,'Schoggi Schokolade',11,3,'100 - 100 g pieces',43.9,49,0,30,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(28,'Rössle Sauerkraut',12,7,'25 - 825 g cans',45.6,26,0,0,1); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(29,'Thüringer Rostbratwurst',12,6,'50 bags x 30 sausgs.',123.79,0,0,0,1); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(30,'Nord-Ost Matjeshering',13,8,'10 - 200 g glasses',25.89,10,0,15,0); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(31,'Gorgonzola Telino',14,4,'12 - 100 g pkgs',12.5,0,70,20,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(32,'Mascarpone Fabioli',14,4,'24 - 200 g pkgs.',32,9,40,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(33,'Geitost',15,4,'500 g',2.5,112,0,20,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(34,'Sasquatch Ale',16,1,'24 - 12 oz bottles',14,111,0,15,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(35,'Steeleye Stout',16,1,'24 - 12 oz bottles',18,20,0,15,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(36,'Inlagd Sill',17,8,'24 - 250 g jars',19,112,0,20,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(37,'Gravad lax',17,8,'12 - 500 g pkgs.',26,11,50,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(38,'Côte de Blaye',18,1,'12 - 75 cl bottles',263.5,17,0,15,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(39,'Chartreuse verte',18,1,'750 cc per bottle',18,69,0,5,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(40,'Boston Crab Meat',19,8,'24 - 4 oz tins',18.4,123,0,30,0); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(41,'Jack''s New England Clam Chowder',19,8,'12 - 12 oz cans',9.65,85,0,10,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(42,'Singaporean Hokkien Fried Mee',20,5,'32 - 1 kg pkgs.',14,26,0,0,1); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(43,'Ipoh Coffee',20,1,'16 - 500 g tins',46,17,10,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(44,'Gula Malacca',20,2,'20 - 2 kg bags',19.45,27,0,15,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(45,'Rogede sild',21,8,'1k pkg.',9.5,5,70,15,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(46,'Spegesild',21,8,'4 - 450 g glasses',12,95,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(47,'Zaanse koeken',22,3,'10 - 4 oz boxes',9.5,36,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(48,'Chocolade',22,3,'10 pkgs.',12.75,15,70,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(49,'Maxilaku',23,3,'24 - 50 g pkgs.',20,10,60,15,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(50,'Valkoinen suklaa',23,3,'12 - 100 g bars',16.25,65,0,30,0); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(51,'Manjimup Dried Apples',24,7,'50 - 300 g pkgs.',53,20,0,10,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(52,'Filo Mix',24,5,'16 - 2 kg boxes',7,38,0,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(53,'Perth Pasties',24,6,'48 pieces',32.8,0,0,0,1); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(54,'Tourtière',25,6,'16 pies',7.45,21,0,10,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(55,'Pâté chinois',25,6,'24 boxes x 2 pies',24,115,0,20,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(56,'Gnocchi di nonna Alice',26,5,'24 - 250 g pkgs.',38,21,10,30,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(57,'Ravioli Angelo',26,5,'24 - 250 g pkgs.',19.5,36,0,20,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(58,'Escargots de Bourgogne',27,8,'24 pieces',13.25,62,0,20,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(59,'Raclette Courdavault',28,4,'5 kg pkg.',55,79,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(60,'Camembert Pierrot',28,4,'15 - 300 g rounds',34,19,0,0,0); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(61,'Sirop d''érable',29,2,'24 - 500 ml bottles',28.5,113,0,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(62,'Tarte au sucre',29,3,'48 pies',49.3,17,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(63,'Vegie-spread',7,2,'15 - 625 g jars',43.9,24,0,5,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(64,'Wimmers gute Semmelknödel',12,5,'20 bags x 4 pieces',33.25,22,80,30,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(65,'Louisiana Fiery Hot Pepper Sauce',2,2,'32 - 8 oz bottles',21.05,76,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(66,'Louisiana Hot Spiced Okra',2,2,'24 - 8 oz jars',17,4,100,20,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(67,'Laughing Lumberjack Lager',16,1,'24 - 12 oz bottles',14,52,0,10,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(68,'Scottish Longbreads',8,3,'10 boxes x 8 pieces',12.5,6,10,15,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(69,'Gudbrandsdalsost',15,4,'10 kg pkg.',36,26,0,15,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(70,'Outback Lager',7,1,'24 - 355 ml bottles',15,15,10,30,0); + +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(71,'Flotemysost',15,4,'10 - 500 g pkgs.',21.5,26,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(72,'Mozzarella di Giovanni',14,4,'24 - 200 g pkgs.',34.8,14,0,0,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(73,'Röd Kaviar',17,8,'24 - 150 g jars',15,101,0,5,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(74,'Longlife Tofu',4,7,'5 kg pkg.',10,4,20,5,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(75,'Rhönbräu Klosterbier',12,1,'24 - 0.5 l bottles',7.75,125,0,25,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(76,'Lakkalikööri',23,1,'500 ml',18,57,0,20,0); +INSERT INTO "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(77,'Original Frankfurter grüne Soße',12,2,'12 boxes',13,32,0,15,0); + +INSERT INTO "Shippers"("ShipperID","CompanyName","Phone") VALUES(1,'Speedy Express','(503) 555-9831'); +INSERT INTO "Shippers"("ShipperID","CompanyName","Phone") VALUES(2,'United Package','(503) 555-3199'); +INSERT INTO "Shippers"("ShipperID","CompanyName","Phone") VALUES(3,'Federal Shipping','(503) 555-9931'); + +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(1,'Exotic Liquids','Charlotte Cooper','Purchasing Manager','49 Gilbert St.','London',NULL,'EC1 4SD','UK','(171) 555-2222',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(2,'New Orleans Cajun Delights','Shelley Burke','Order Administrator','P.O. Box 78934','New Orleans','LA','70117','USA','(100) 555-4822',NULL,'#CAJUN.HTM#'); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(3,'Grandma Kelly''s Homestead','Regina Murphy','Sales Representative','707 Oxford Rd.','Ann Arbor','MI','48104','USA','(313) 555-5735','(313) 555-3349',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(4,'Tokyo Traders','Yoshi Nagase','Marketing Manager','9-8 Sekimai Musashino-shi','Tokyo',NULL,'100','Japan','(03) 3555-5011',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(5,'Cooperativa de Quesos ''Las Cabras''','Antonio del Valle Saavedra','Export Administrator','Calle del Rosal 4','Oviedo','Asturias','33007','Spain','(98) 598 76 54',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(6,'Mayumi''s','Mayumi Ohno','Marketing Representative','92 Setsuko Chuo-ku','Osaka',NULL,'545','Japan','(06) 431-7877',NULL,'Mayumi''s (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/mayumi.htm#'); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(7,'Pavlova, Ltd.','Ian Devling','Marketing Manager','74 Rose St. Moonie Ponds','Melbourne','Victoria','3058','Australia','(03) 444-2343','(03) 444-6588',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(8,'Specialty Biscuits, Ltd.','Peter Wilson','Sales Representative','29 King''s Way','Manchester',NULL,'M14 GSD','UK','(161) 555-4448',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(9,'PB Knäckebröd AB','Lars Peterson','Sales Agent','Kaloadagatan 13','Göteborg',NULL,'S-345 67','Sweden','031-987 65 43','031-987 65 91',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(10,'Refrescos Americanas LTDA','Carlos Diaz','Marketing Manager','Av. das Americanas 12.890','Sao Paulo',NULL,'5442','Brazil','(11) 555 4640',NULL,NULL); + +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(11,'Heli Süßwaren GmbH & Co. KG','Petra Winkler','Sales Manager','Tiergartenstraße 5','Berlin',NULL,'10785','Germany','(010) 9984510',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(12,'Plutzer Lebensmittelgroßmärkte AG','Martin Bein','International Marketing Mgr.','Bogenallee 51','Frankfurt',NULL,'60439','Germany','(069) 992755',NULL,'Plutzer (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/plutzer.htm#'); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(13,'Nord-Ost-Fisch Handelsgesellschaft mbH','Sven Petersen','Coordinator Foreign Markets','Frahmredder 112a','Cuxhaven',NULL,'27478','Germany','(04721) 8713','(04721) 8714',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(14,'Formaggi Fortini s.r.l.','Elio Rossi','Sales Representative','Viale Dante, 75','Ravenna',NULL,'48100','Italy','(0544) 60323','(0544) 60603','#FORMAGGI.HTM#'); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(15,'Norske Meierier','Beate Vileid','Marketing Manager','Hatlevegen 5','Sandvika',NULL,'1320','Norway','(0)2-953010',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(16,'Bigfoot Breweries','Cheryl Saylor','Regional Account Rep.','3400 - 8th Avenue Suite 210','Bend','OR','97101','USA','(503) 555-9931',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(17,'Svensk Sjöföda AB','Michael Björn','Sales Representative','Brovallavägen 231','Stockholm',NULL,'S-123 45','Sweden','08-123 45 67',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(18,'Aux joyeux ecclésiastiques','Guylène Nodier','Sales Manager','203, Rue des Francs-Bourgeois','Paris',NULL,'75004','France','(1) 03.83.00.68','(1) 03.83.00.62',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(19,'New England Seafood Cannery','Robb Merchant','Wholesale Account Agent','Order Processing Dept. 2100 Paul Revere Blvd.','Boston','MA','02134','USA','(617) 555-3267','(617) 555-3389',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(20,'Leka Trading','Chandra Leka','Owner','471 Serangoon Loop, Suite #402','Singapore',NULL,'0512','Singapore','555-8787',NULL,NULL); + +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(21,'Lyngbysild','Niels Petersen','Sales Manager','Lyngbysild Fiskebakken 10','Lyngby',NULL,'2800','Denmark','43844108','43844115',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(22,'Zaanse Snoepfabriek','Dirk Luchte','Accounting Manager','Verkoop Rijnweg 22','Zaandam',NULL,'9999 ZZ','Netherlands','(12345) 1212','(12345) 1210',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(23,'Karkki Oy','Anne Heikkonen','Product Manager','Valtakatu 12','Lappeenranta',NULL,'53120','Finland','(953) 10956',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(24,'G''day, Mate','Wendy Mackenzie','Sales Representative','170 Prince Edward Parade Hunter''s Hill','Sydney','NSW','2042','Australia','(02) 555-5914','(02) 555-4873','G''day Mate (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/gdaymate.htm#'); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(25,'Ma Maison','Jean-Guy Lauzon','Marketing Manager','2960 Rue St. Laurent','Montréal','Québec','H1J 1C3','Canada','(514) 555-9022',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(26,'Pasta Buttini s.r.l.','Giovanni Giudici','Order Administrator','Via dei Gelsomini, 153','Salerno',NULL,'84100','Italy','(089) 6547665','(089) 6547667',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(27,'Escargots Nouveaux','Marie Delamare','Sales Manager','22, rue H. Voiron','Montceau',NULL,'71300','France','85.57.00.07',NULL,NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(28,'Gai pâturage','Eliane Noz','Sales Representative','Bat. B 3, rue des Alpes','Annecy',NULL,'74000','France','38.76.98.06','38.76.98.58',NULL); +INSERT INTO "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(29,'Forêts d''érables','Chantal Goulet','Accounting Manager','148 rue Chasseur','Ste-Hyacinthe','Québec','J2S 7S8','Canada','(514) 555-2955','(514) 555-2921',NULL); + + +/* The follwing adds tables to the Northwind database */ + + +CREATE TABLE [CustomerCustomerDemo] + ([CustomerID] nchar (5) NOT NULL, + [CustomerTypeID] [nchar] (10) NOT NULL, + CONSTRAINT [PK_CustomerCustomerDemo] PRIMARY KEY + ( + [CustomerID], + [CustomerTypeID] + ), + CONSTRAINT [FK_CustomerCustomerDemo] FOREIGN KEY + ( + [CustomerTypeID] + ) REFERENCES [CustomerDemographics] ( + [CustomerTypeID] + ), + CONSTRAINT [FK_CustomerCustomerDemo_Customers] FOREIGN KEY + ( + [CustomerID] + ) REFERENCES [Customers] ( + [CustomerID] + ) +); + + +CREATE TABLE [CustomerDemographics] + ([CustomerTypeID] [nchar] (10) NOT NULL , + [CustomerDesc] [ntext] NULL , + CONSTRAINT [PK_CustomerDemographics] PRIMARY KEY + ( + [CustomerTypeID] + ) +); + + +CREATE TABLE [Region] + ( [RegionID] [int] NOT NULL , + [RegionDescription] [nchar] (50) NOT NULL, + CONSTRAINT [PK_Region] PRIMARY KEY + ( + [RegionID] + ) +); + + +CREATE TABLE [Territories] + ([TerritoryID] [nvarchar] (20) NOT NULL , + [TerritoryDescription] [nchar] (50) NOT NULL , + [RegionID] [int] NOT NULL, + CONSTRAINT [PK_Territories] PRIMARY KEY + ( + [TerritoryID] + ), + CONSTRAINT [FK_Territories_Region] FOREIGN KEY + ( + [RegionID] + ) REFERENCES [Region] ( + [RegionID] + ) +); + + +CREATE TABLE [EmployeeTerritories] + ([EmployeeID] [int] NOT NULL, + [TerritoryID] [nvarchar] (20) NOT NULL , + CONSTRAINT [PK_EmployeeTerritories] PRIMARY KEY + ( + [EmployeeID], + [TerritoryID] + ), + CONSTRAINT [FK_EmployeeTerritories_Employees] FOREIGN KEY + ( + [EmployeeID] + ) REFERENCES [Employees] ( + [EmployeeID] + ), + CONSTRAINT [FK_EmployeeTerritories_Territories] FOREIGN KEY + ( + [TerritoryID] + ) REFERENCES [Territories] ( + [TerritoryID] + ) +); + +-- The following adds data to the tables just created. + +Insert Into Region Values (1,'Eastern'); +Insert Into Region Values (2,'Western'); +Insert Into Region Values (3,'Northern'); +Insert Into Region Values (4,'Southern'); + + +Insert Into Territories Values ('01581','Westboro',1); +Insert Into Territories Values ('01730','Bedford',1); +Insert Into Territories Values ('01833','Georgetow',1); +Insert Into Territories Values ('02116','Boston',1); +Insert Into Territories Values ('02139','Cambridge',1); +Insert Into Territories Values ('02184','Braintree',1); +Insert Into Territories Values ('02903','Providence',1); +Insert Into Territories Values ('03049','Hollis',3); +Insert Into Territories Values ('03801','Portsmouth',3); +Insert Into Territories Values ('06897','Wilton',1); +Insert Into Territories Values ('07960','Morristown',1); +Insert Into Territories Values ('08837','Edison',1); +Insert Into Territories Values ('10019','New York',1); +Insert Into Territories Values ('10038','New York',1); +Insert Into Territories Values ('11747','Mellvile',1); +Insert Into Territories Values ('14450','Fairport',1); +Insert Into Territories Values ('19428','Philadelphia',3); +Insert Into Territories Values ('19713','Neward',1); +Insert Into Territories Values ('20852','Rockville',1); +Insert Into Territories Values ('27403','Greensboro',1); +Insert Into Territories Values ('27511','Cary',1); +Insert Into Territories Values ('29202','Columbia',4); +Insert Into Territories Values ('30346','Atlanta',4); +Insert Into Territories Values ('31406','Savannah',4); +Insert Into Territories Values ('32859','Orlando',4); +Insert Into Territories Values ('33607','Tampa',4); +Insert Into Territories Values ('40222','Louisville',1); +Insert Into Territories Values ('44122','Beachwood',3); +Insert Into Territories Values ('45839','Findlay',3); +Insert Into Territories Values ('48075','Southfield',3); +Insert Into Territories Values ('48084','Troy',3); +Insert Into Territories Values ('48304','Bloomfield Hills',3); +Insert Into Territories Values ('53404','Racine',3); +Insert Into Territories Values ('55113','Roseville',3); +Insert Into Territories Values ('55439','Minneapolis',3); +Insert Into Territories Values ('60179','Hoffman Estates',2); +Insert Into Territories Values ('60601','Chicago',2); +Insert Into Territories Values ('72716','Bentonville',4); +Insert Into Territories Values ('75234','Dallas',4); +Insert Into Territories Values ('78759','Austin',4); +Insert Into Territories Values ('80202','Denver',2); +Insert Into Territories Values ('80909','Colorado Springs',2); +Insert Into Territories Values ('85014','Phoenix',2); +Insert Into Territories Values ('85251','Scottsdale',2); +Insert Into Territories Values ('90405','Santa Monica',2); +Insert Into Territories Values ('94025','Menlo Park',2); +Insert Into Territories Values ('94105','San Francisco',2); +Insert Into Territories Values ('95008','Campbell',2); +Insert Into Territories Values ('95054','Santa Clara',2); +Insert Into Territories Values ('95060','Santa Cruz',2); +Insert Into Territories Values ('98004','Bellevue',2); +Insert Into Territories Values ('98052','Redmond',2); +Insert Into Territories Values ('98104','Seattle',2); + + +Insert Into EmployeeTerritories Values (1,'06897'); +Insert Into EmployeeTerritories Values (1,'19713'); +Insert Into EmployeeTerritories Values (2,'01581'); +Insert Into EmployeeTerritories Values (2,'01730'); +Insert Into EmployeeTerritories Values (2,'01833'); +Insert Into EmployeeTerritories Values (2,'02116'); +Insert Into EmployeeTerritories Values (2,'02139'); +Insert Into EmployeeTerritories Values (2,'02184'); +Insert Into EmployeeTerritories Values (2,'40222'); +Insert Into EmployeeTerritories Values (3,'30346'); +Insert Into EmployeeTerritories Values (3,'31406'); +Insert Into EmployeeTerritories Values (3,'32859'); +Insert Into EmployeeTerritories Values (3,'33607'); +Insert Into EmployeeTerritories Values (4,'20852'); +Insert Into EmployeeTerritories Values (4,'27403'); +Insert Into EmployeeTerritories Values (4,'27511'); +Insert Into EmployeeTerritories Values (5,'02903'); +Insert Into EmployeeTerritories Values (5,'07960'); +Insert Into EmployeeTerritories Values (5,'08837'); +Insert Into EmployeeTerritories Values (5,'10019'); +Insert Into EmployeeTerritories Values (5,'10038'); +Insert Into EmployeeTerritories Values (5,'11747'); +Insert Into EmployeeTerritories Values (5,'14450'); +Insert Into EmployeeTerritories Values (6,'85014'); +Insert Into EmployeeTerritories Values (6,'85251'); +Insert Into EmployeeTerritories Values (6,'98004'); +Insert Into EmployeeTerritories Values (6,'98052'); +Insert Into EmployeeTerritories Values (6,'98104'); +Insert Into EmployeeTerritories Values (7,'60179'); +Insert Into EmployeeTerritories Values (7,'60601'); +Insert Into EmployeeTerritories Values (7,'80202'); +Insert Into EmployeeTerritories Values (7,'80909'); +Insert Into EmployeeTerritories Values (7,'90405'); +Insert Into EmployeeTerritories Values (7,'94025'); +Insert Into EmployeeTerritories Values (7,'94105'); +Insert Into EmployeeTerritories Values (7,'95008'); +Insert Into EmployeeTerritories Values (7,'95054'); +Insert Into EmployeeTerritories Values (7,'95060'); +Insert Into EmployeeTerritories Values (8,'19428'); +Insert Into EmployeeTerritories Values (8,'44122'); +Insert Into EmployeeTerritories Values (8,'45839'); +Insert Into EmployeeTerritories Values (8,'53404'); +Insert Into EmployeeTerritories Values (9,'03049'); +Insert Into EmployeeTerritories Values (9,'03801'); +Insert Into EmployeeTerritories Values (9,'48075'); +Insert Into EmployeeTerritories Values (9,'48084'); +Insert Into EmployeeTerritories Values (9,'48304'); +Insert Into EmployeeTerritories Values (9,'55113'); +Insert Into EmployeeTerritories Values (9,'55439'); + diff --git a/mcs/class/System.Data.Linq/tests/instnwnd.SqlServer.sql b/mcs/class/System.Data.Linq/tests/instnwnd.SqlServer.sql new file mode 100644 index 00000000000..c0506142f6b --- /dev/null +++ b/mcs/class/System.Data.Linq/tests/instnwnd.SqlServer.sql @@ -0,0 +1,9336 @@ +/* +** Copyright Microsoft, Inc. 1994 - 2000 +** All Rights Reserved. +*/ + +SET NOCOUNT ON +GO + +USE master +GO +if exists (select * from sysdatabases where name='Northwind') + drop database Northwind +go + +DECLARE @device_directory NVARCHAR(520) +SELECT @device_directory = SUBSTRING(filename, 1, CHARINDEX(N'master.mdf', LOWER(filename)) - 1) +FROM master.dbo.sysaltfiles WHERE dbid = 1 AND fileid = 1 + +EXECUTE (N'CREATE DATABASE Northwind + ON PRIMARY (NAME = N''Northwind'', FILENAME = N''' + @device_directory + N'northwnd.mdf'') + LOG ON (NAME = N''Northwind_log'', FILENAME = N''' + @device_directory + N'northwnd.ldf'')') +go + +exec sp_dboption 'Northwind','trunc. log on chkpt.','true' +exec sp_dboption 'Northwind','select into/bulkcopy','true' +GO + +set quoted_identifier on +GO + +/* Set DATEFORMAT so that the date strings are interpreted correctly regardless of + the default DATEFORMAT on the server. +*/ +SET DATEFORMAT mdy +GO +use "Northwind" +go +if exists (select * from sysobjects where id = object_id('dbo.Employee Sales by Country') and sysstat & 0xf = 4) + drop procedure "dbo"."Employee Sales by Country" +GO +if exists (select * from sysobjects where id = object_id('dbo.Sales by Year') and sysstat & 0xf = 4) + drop procedure "dbo"."Sales by Year" +GO +if exists (select * from sysobjects where id = object_id('dbo.Ten Most Expensive Products') and sysstat & 0xf = 4) + drop procedure "dbo"."Ten Most Expensive Products" +GO +if exists (select * from sysobjects where id = object_id('dbo.Category Sales for 1997') and sysstat & 0xf = 2) + drop view "dbo"."Category Sales for 1997" +GO +if exists (select * from sysobjects where id = object_id('dbo.Sales by Category') and sysstat & 0xf = 2) + drop view "dbo"."Sales by Category" +GO +if exists (select * from sysobjects where id = object_id('dbo.Sales Totals by Amount') and sysstat & 0xf = 2) + drop view "dbo"."Sales Totals by Amount" +GO +if exists (select * from sysobjects where id = object_id('dbo.Summary of Sales by Quarter') and sysstat & 0xf = 2) + drop view "dbo"."Summary of Sales by Quarter" +GO +if exists (select * from sysobjects where id = object_id('dbo.Summary of Sales by Year') and sysstat & 0xf = 2) + drop view "dbo"."Summary of Sales by Year" +GO +if exists (select * from sysobjects where id = object_id('dbo.Invoices') and sysstat & 0xf = 2) + drop view "dbo"."Invoices" +GO +if exists (select * from sysobjects where id = object_id('dbo.Order Details Extended') and sysstat & 0xf = 2) + drop view "dbo"."Order Details Extended" +GO +if exists (select * from sysobjects where id = object_id('dbo.Order Subtotals') and sysstat & 0xf = 2) + drop view "dbo"."Order Subtotals" +GO +if exists (select * from sysobjects where id = object_id('dbo.Product Sales for 1997') and sysstat & 0xf = 2) + drop view "dbo"."Product Sales for 1997" +GO +if exists (select * from sysobjects where id = object_id('dbo.Alphabetical list of products') and sysstat & 0xf = 2) + drop view "dbo"."Alphabetical list of products" +GO +if exists (select * from sysobjects where id = object_id('dbo.Current Product List') and sysstat & 0xf = 2) + drop view "dbo"."Current Product List" +GO +if exists (select * from sysobjects where id = object_id('dbo.Orders Qry') and sysstat & 0xf = 2) + drop view "dbo"."Orders Qry" +GO +if exists (select * from sysobjects where id = object_id('dbo.Products Above Average Price') and sysstat & 0xf = 2) + drop view "dbo"."Products Above Average Price" +GO +if exists (select * from sysobjects where id = object_id('dbo.Products by Category') and sysstat & 0xf = 2) + drop view "dbo"."Products by Category" +GO +if exists (select * from sysobjects where id = object_id('dbo.Quarterly Orders') and sysstat & 0xf = 2) + drop view "dbo"."Quarterly Orders" +GO +if exists (select * from sysobjects where id = object_id('dbo.Customer and Suppliers by City') and sysstat & 0xf = 2) + drop view "dbo"."Customer and Suppliers by City" +GO +if exists (select * from sysobjects where id = object_id('dbo.Order Details') and sysstat & 0xf = 3) + drop table "dbo"."Order Details" +GO +if exists (select * from sysobjects where id = object_id('dbo.Orders') and sysstat & 0xf = 3) + drop table "dbo"."Orders" +GO +if exists (select * from sysobjects where id = object_id('dbo.Products') and sysstat & 0xf = 3) + drop table "dbo"."Products" +GO +if exists (select * from sysobjects where id = object_id('dbo.Categories') and sysstat & 0xf = 3) + drop table "dbo"."Categories" +GO +if exists (select * from sysobjects where id = object_id('dbo.Customers') and sysstat & 0xf = 3) + drop table "dbo"."Customers" +GO +if exists (select * from sysobjects where id = object_id('dbo.Shippers') and sysstat & 0xf = 3) + drop table "dbo"."Shippers" +GO +if exists (select * from sysobjects where id = object_id('dbo.Suppliers') and sysstat & 0xf = 3) + drop table "dbo"."Suppliers" +GO +if exists (select * from sysobjects where id = object_id('dbo.Employees') and sysstat & 0xf = 3) + drop table "dbo"."Employees" +GO +CREATE TABLE "Employees" ( + "EmployeeID" "int" IDENTITY (1, 1) NOT NULL , + "LastName" nvarchar (20) NOT NULL , + "FirstName" nvarchar (10) NOT NULL , + "Title" nvarchar (30) NULL , + "TitleOfCourtesy" nvarchar (25) NULL , + "BirthDate" "datetime" NULL , + "HireDate" "datetime" NULL , + "Address" nvarchar (60) NULL , + "City" nvarchar (15) NULL , + "Region" nvarchar (15) NULL , + "PostalCode" nvarchar (10) NULL , + "Country" nvarchar (15) NULL , + "HomePhone" nvarchar (24) NULL , + "Extension" nvarchar (4) NULL , + "Photo" "image" NULL , + "Notes" "ntext" NULL , + "ReportsTo" "int" NULL , + "PhotoPath" nvarchar (255) NULL , + CONSTRAINT "PK_Employees" PRIMARY KEY CLUSTERED + ( + "EmployeeID" + ), + CONSTRAINT "FK_Employees_Employees" FOREIGN KEY + ( + "ReportsTo" + ) REFERENCES "dbo"."Employees" ( + "EmployeeID" + ), + CONSTRAINT "CK_Birthdate" CHECK (BirthDate < getdate()) +) +GO + CREATE INDEX "LastName" ON "dbo"."Employees"("LastName") +GO + CREATE INDEX "PostalCode" ON "dbo"."Employees"("PostalCode") +GO + +CREATE TABLE "Categories" ( + "CategoryID" "int" IDENTITY (1, 1) NOT NULL , + "CategoryName" nvarchar (15) NOT NULL , + "Description" "ntext" NULL , + "Picture" "image" NULL , + CONSTRAINT "PK_Categories" PRIMARY KEY CLUSTERED + ( + "CategoryID" + ) +) +GO + CREATE INDEX "CategoryName" ON "dbo"."Categories"("CategoryName") +GO + +CREATE TABLE "Customers" ( + "CustomerID" nchar (5) NOT NULL , + "CompanyName" nvarchar (40) NOT NULL , + "ContactName" nvarchar (30) NULL , + "ContactTitle" nvarchar (30) NULL , + "Address" nvarchar (60) NULL , + "City" nvarchar (15) NULL , + "Region" nvarchar (15) NULL , + "PostalCode" nvarchar (10) NULL , + "Country" nvarchar (15) NULL , + "Phone" nvarchar (24) NULL , + "Fax" nvarchar (24) NULL , + CONSTRAINT "PK_Customers" PRIMARY KEY CLUSTERED + ( + "CustomerID" + ) +) +GO + CREATE INDEX "City" ON "dbo"."Customers"("City") +GO + CREATE INDEX "CompanyName" ON "dbo"."Customers"("CompanyName") +GO + CREATE INDEX "PostalCode" ON "dbo"."Customers"("PostalCode") +GO + CREATE INDEX "Region" ON "dbo"."Customers"("Region") +GO + +CREATE TABLE "Shippers" ( + "ShipperID" "int" IDENTITY (1, 1) NOT NULL , + "CompanyName" nvarchar (40) NOT NULL , + "Phone" nvarchar (24) NULL , + CONSTRAINT "PK_Shippers" PRIMARY KEY CLUSTERED + ( + "ShipperID" + ) +) +GO +CREATE TABLE "Suppliers" ( + "SupplierID" "int" IDENTITY (1, 1) NOT NULL , + "CompanyName" nvarchar (40) NOT NULL , + "ContactName" nvarchar (30) NULL , + "ContactTitle" nvarchar (30) NULL , + "Address" nvarchar (60) NULL , + "City" nvarchar (15) NULL , + "Region" nvarchar (15) NULL , + "PostalCode" nvarchar (10) NULL , + "Country" nvarchar (15) NULL , + "Phone" nvarchar (24) NULL , + "Fax" nvarchar (24) NULL , + "HomePage" "ntext" NULL , + CONSTRAINT "PK_Suppliers" PRIMARY KEY CLUSTERED + ( + "SupplierID" + ) +) +GO + CREATE INDEX "CompanyName" ON "dbo"."Suppliers"("CompanyName") +GO + CREATE INDEX "PostalCode" ON "dbo"."Suppliers"("PostalCode") +GO + +CREATE TABLE "Orders" ( + "OrderID" "int" IDENTITY (1, 1) NOT NULL , + "CustomerID" nchar (5) NULL , + "EmployeeID" "int" NULL , + "OrderDate" "datetime" NULL , + "RequiredDate" "datetime" NULL , + "ShippedDate" "datetime" NULL , + "ShipVia" "int" NULL , + "Freight" "money" NULL CONSTRAINT "DF_Orders_Freight" DEFAULT (0), + "ShipName" nvarchar (40) NULL , + "ShipAddress" nvarchar (60) NULL , + "ShipCity" nvarchar (15) NULL , + "ShipRegion" nvarchar (15) NULL , + "ShipPostalCode" nvarchar (10) NULL , + "ShipCountry" nvarchar (15) NULL , + CONSTRAINT "PK_Orders" PRIMARY KEY CLUSTERED + ( + "OrderID" + ), + CONSTRAINT "FK_Orders_Customers" FOREIGN KEY + ( + "CustomerID" + ) REFERENCES "dbo"."Customers" ( + "CustomerID" + ), + CONSTRAINT "FK_Orders_Employees" FOREIGN KEY + ( + "EmployeeID" + ) REFERENCES "dbo"."Employees" ( + "EmployeeID" + ), + CONSTRAINT "FK_Orders_Shippers" FOREIGN KEY + ( + "ShipVia" + ) REFERENCES "dbo"."Shippers" ( + "ShipperID" + ) +) +GO + CREATE INDEX "CustomerID" ON "dbo"."Orders"("CustomerID") +GO + CREATE INDEX "CustomersOrders" ON "dbo"."Orders"("CustomerID") +GO + CREATE INDEX "EmployeeID" ON "dbo"."Orders"("EmployeeID") +GO + CREATE INDEX "EmployeesOrders" ON "dbo"."Orders"("EmployeeID") +GO + CREATE INDEX "OrderDate" ON "dbo"."Orders"("OrderDate") +GO + CREATE INDEX "ShippedDate" ON "dbo"."Orders"("ShippedDate") +GO + CREATE INDEX "ShippersOrders" ON "dbo"."Orders"("ShipVia") +GO + CREATE INDEX "ShipPostalCode" ON "dbo"."Orders"("ShipPostalCode") +GO + +CREATE TABLE "Products" ( + "ProductID" "int" IDENTITY (1, 1) NOT NULL , + "ProductName" nvarchar (40) NOT NULL , + "SupplierID" "int" NULL , + "CategoryID" "int" NULL , + "QuantityPerUnit" nvarchar (20) NULL , + "UnitPrice" "money" NULL CONSTRAINT "DF_Products_UnitPrice" DEFAULT (0), + "UnitsInStock" "smallint" NULL CONSTRAINT "DF_Products_UnitsInStock" DEFAULT (0), + "UnitsOnOrder" "smallint" NULL CONSTRAINT "DF_Products_UnitsOnOrder" DEFAULT (0), + "ReorderLevel" "smallint" NULL CONSTRAINT "DF_Products_ReorderLevel" DEFAULT (0), + "Discontinued" "bit" NOT NULL CONSTRAINT "DF_Products_Discontinued" DEFAULT (0), + CONSTRAINT "PK_Products" PRIMARY KEY CLUSTERED + ( + "ProductID" + ), + CONSTRAINT "FK_Products_Categories" FOREIGN KEY + ( + "CategoryID" + ) REFERENCES "dbo"."Categories" ( + "CategoryID" + ), + CONSTRAINT "FK_Products_Suppliers" FOREIGN KEY + ( + "SupplierID" + ) REFERENCES "dbo"."Suppliers" ( + "SupplierID" + ), + CONSTRAINT "CK_Products_UnitPrice" CHECK (UnitPrice >= 0), + CONSTRAINT "CK_ReorderLevel" CHECK (ReorderLevel >= 0), + CONSTRAINT "CK_UnitsInStock" CHECK (UnitsInStock >= 0), + CONSTRAINT "CK_UnitsOnOrder" CHECK (UnitsOnOrder >= 0) +) +GO + CREATE INDEX "CategoriesProducts" ON "dbo"."Products"("CategoryID") +GO + CREATE INDEX "CategoryID" ON "dbo"."Products"("CategoryID") +GO + CREATE INDEX "ProductName" ON "dbo"."Products"("ProductName") +GO + CREATE INDEX "SupplierID" ON "dbo"."Products"("SupplierID") +GO + CREATE INDEX "SuppliersProducts" ON "dbo"."Products"("SupplierID") +GO + +CREATE TABLE "Order Details" ( + "OrderID" "int" NOT NULL , + "ProductID" "int" NOT NULL , + "UnitPrice" "money" NOT NULL CONSTRAINT "DF_Order_Details_UnitPrice" DEFAULT (0), + "Quantity" "smallint" NOT NULL CONSTRAINT "DF_Order_Details_Quantity" DEFAULT (1), + "Discount" "real" NOT NULL CONSTRAINT "DF_Order_Details_Discount" DEFAULT (0), + CONSTRAINT "PK_Order_Details" PRIMARY KEY CLUSTERED + ( + "OrderID", + "ProductID" + ), + CONSTRAINT "FK_Order_Details_Orders" FOREIGN KEY + ( + "OrderID" + ) REFERENCES "dbo"."Orders" ( + "OrderID" + ), + CONSTRAINT "FK_Order_Details_Products" FOREIGN KEY + ( + "ProductID" + ) REFERENCES "dbo"."Products" ( + "ProductID" + ), + CONSTRAINT "CK_Discount" CHECK (Discount >= 0 and (Discount <= 1)), + CONSTRAINT "CK_Quantity" CHECK (Quantity > 0), + CONSTRAINT "CK_UnitPrice" CHECK (UnitPrice >= 0) +) +GO + CREATE INDEX "OrderID" ON "dbo"."Order Details"("OrderID") +GO + CREATE INDEX "OrdersOrder_Details" ON "dbo"."Order Details"("OrderID") +GO + CREATE INDEX "ProductID" ON "dbo"."Order Details"("ProductID") +GO + CREATE INDEX "ProductsOrder_Details" ON "dbo"."Order Details"("ProductID") +GO + +create view "Customer and Suppliers by City" AS +SELECT City, CompanyName, ContactName, 'Customers' AS Relationship +FROM Customers +UNION SELECT City, CompanyName, ContactName, 'Suppliers' +FROM Suppliers +--ORDER BY City, CompanyName +GO + +create view "Alphabetical list of products" AS +SELECT Products.*, Categories.CategoryName +FROM Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID +WHERE (((Products.Discontinued)=0)) +GO + +create view "Current Product List" AS +SELECT Product_List.ProductID, Product_List.ProductName +FROM Products AS Product_List +WHERE (((Product_List.Discontinued)=0)) +--ORDER BY Product_List.ProductName +GO + +create view "Orders Qry" AS +SELECT Orders.OrderID, Orders.CustomerID, Orders.EmployeeID, Orders.OrderDate, Orders.RequiredDate, + Orders.ShippedDate, Orders.ShipVia, Orders.Freight, Orders.ShipName, Orders.ShipAddress, Orders.ShipCity, + Orders.ShipRegion, Orders.ShipPostalCode, Orders.ShipCountry, + Customers.CompanyName, Customers.Address, Customers.City, Customers.Region, Customers.PostalCode, Customers.Country +FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID +GO + +create view "Products Above Average Price" AS +SELECT Products.ProductName, Products.UnitPrice +FROM Products +WHERE Products.UnitPrice>(SELECT AVG(UnitPrice) From Products) +--ORDER BY Products.UnitPrice DESC +GO + +create view "Products by Category" AS +SELECT Categories.CategoryName, Products.ProductName, Products.QuantityPerUnit, Products.UnitsInStock, Products.Discontinued +FROM Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID +WHERE Products.Discontinued <> 1 +--ORDER BY Categories.CategoryName, Products.ProductName +GO + +create view "Quarterly Orders" AS +SELECT DISTINCT Customers.CustomerID, Customers.CompanyName, Customers.City, Customers.Country +FROM Customers RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID +WHERE Orders.OrderDate BETWEEN '19970101' And '19971231' +GO + +create view Invoices AS +SELECT Orders.ShipName, Orders.ShipAddress, Orders.ShipCity, Orders.ShipRegion, Orders.ShipPostalCode, + Orders.ShipCountry, Orders.CustomerID, Customers.CompanyName AS CustomerName, Customers.Address, Customers.City, + Customers.Region, Customers.PostalCode, Customers.Country, + (FirstName + ' ' + LastName) AS Salesperson, + Orders.OrderID, Orders.OrderDate, Orders.RequiredDate, Orders.ShippedDate, Shippers.CompanyName As ShipperName, + "Order Details".ProductID, Products.ProductName, "Order Details".UnitPrice, "Order Details".Quantity, + "Order Details".Discount, + (CONVERT(money,("Order Details".UnitPrice*Quantity*(1-Discount)/100))*100) AS ExtendedPrice, Orders.Freight +FROM Shippers INNER JOIN + (Products INNER JOIN + ( + (Employees INNER JOIN + (Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) + ON Employees.EmployeeID = Orders.EmployeeID) + INNER JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID) + ON Products.ProductID = "Order Details".ProductID) + ON Shippers.ShipperID = Orders.ShipVia +GO + +create view "Order Details Extended" AS +SELECT "Order Details".OrderID, "Order Details".ProductID, Products.ProductName, + "Order Details".UnitPrice, "Order Details".Quantity, "Order Details".Discount, + (CONVERT(money,("Order Details".UnitPrice*Quantity*(1-Discount)/100))*100) AS ExtendedPrice +FROM Products INNER JOIN "Order Details" ON Products.ProductID = "Order Details".ProductID +--ORDER BY "Order Details".OrderID +GO + +create view "Order Subtotals" AS +SELECT "Order Details".OrderID, Sum(CONVERT(money,("Order Details".UnitPrice*Quantity*(1-Discount)/100))*100) AS Subtotal +FROM "Order Details" +GROUP BY "Order Details".OrderID +GO + +create view "Product Sales for 1997" AS +SELECT Categories.CategoryName, Products.ProductName, +Sum(CONVERT(money,("Order Details".UnitPrice*Quantity*(1-Discount)/100))*100) AS ProductSales +FROM (Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID) + INNER JOIN (Orders + INNER JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID) + ON Products.ProductID = "Order Details".ProductID +WHERE (((Orders.ShippedDate) Between '19970101' And '19971231')) +GROUP BY Categories.CategoryName, Products.ProductName +GO + +create view "Category Sales for 1997" AS +SELECT "Product Sales for 1997".CategoryName, Sum("Product Sales for 1997".ProductSales) AS CategorySales +FROM "Product Sales for 1997" +GROUP BY "Product Sales for 1997".CategoryName +GO + +create view "Sales by Category" AS +SELECT Categories.CategoryID, Categories.CategoryName, Products.ProductName, + Sum("Order Details Extended".ExtendedPrice) AS ProductSales +FROM Categories INNER JOIN + (Products INNER JOIN + (Orders INNER JOIN "Order Details Extended" ON Orders.OrderID = "Order Details Extended".OrderID) + ON Products.ProductID = "Order Details Extended".ProductID) + ON Categories.CategoryID = Products.CategoryID +WHERE Orders.OrderDate BETWEEN '19970101' And '19971231' +GROUP BY Categories.CategoryID, Categories.CategoryName, Products.ProductName +--ORDER BY Products.ProductName +GO + +create view "Sales Totals by Amount" AS +SELECT "Order Subtotals".Subtotal AS SaleAmount, Orders.OrderID, Customers.CompanyName, Orders.ShippedDate +FROM Customers INNER JOIN + (Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID) + ON Customers.CustomerID = Orders.CustomerID +WHERE ("Order Subtotals".Subtotal >2500) AND (Orders.ShippedDate BETWEEN '19970101' And '19971231') +GO + +create view "Summary of Sales by Quarter" AS +SELECT Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal +FROM Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID +WHERE Orders.ShippedDate IS NOT NULL +--ORDER BY Orders.ShippedDate +GO + +create view "Summary of Sales by Year" AS +SELECT Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal +FROM Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID +WHERE Orders.ShippedDate IS NOT NULL +--ORDER BY Orders.ShippedDate +GO + +create procedure "Ten Most Expensive Products" AS +SET ROWCOUNT 10 +SELECT Products.ProductName AS TenMostExpensiveProducts, Products.UnitPrice +FROM Products +ORDER BY Products.UnitPrice DESC +GO + +create procedure "Employee Sales by Country" +@Beginning_Date DateTime, @Ending_Date DateTime AS +SELECT Employees.Country, Employees.LastName, Employees.FirstName, Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal AS SaleAmount +FROM Employees INNER JOIN + (Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID) + ON Employees.EmployeeID = Orders.EmployeeID +WHERE Orders.ShippedDate Between @Beginning_Date And @Ending_Date +GO + +create procedure "Sales by Year" + @Beginning_Date DateTime, @Ending_Date DateTime AS +SELECT Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal, DATENAME(yy,ShippedDate) AS Year +FROM Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID +WHERE Orders.ShippedDate Between @Beginning_Date And @Ending_Date +GO + +set quoted_identifier on +go +set identity_insert "Categories" on +go +ALTER TABLE "Categories" NOCHECK CONSTRAINT ALL +go +INSERT "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(1,'Beverages','Soft drinks, coffees, teas, beers, and ales',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000000010000000001000000001001000000000000001010100010000100100000001010001000000100100000100000010101000100000100010000000000000000000001000000001000000000000001000000000000000000000001001001000000000000000000001001001000012507070100000001000000001000100100000010000001000000000100100100000001001010101010000000000000000000001001000100000101010101000000000000000000000000000000000000101020525363777777777777753530100101000100000000001010001001000100100100000000000100000000000000000100010001001010001000000010010000000000000100000000000000000000000000000001014343577777777777777777777777777770100120001010100102000000000000000000000000100100010010000000000100010000000000000000010010000001001001010100000000000000000000000000000001021617777777775757535353525777777777777770150120000100010101000000000000000001000000000000001001001000000000010010000010010010000101001001000000100000001000000000000000000000001417777737617376377775767771707752777777776340161210300000000010000000000010000000000000000000000000000000000000000100000000000100000000000010000100000000000000000000000000100503677577571705014000000101070717775777777775334101400010101010001010010101000000000000000000000000000001000000000000000000000000000000001010001000001000000000000000000000000010357353000000000000000000000000000171777777777470612101000000001000001000000010000000000000000000000000000000100010703010101210000000000000000000000000000000000000000000000101034350000000010653435777570477474700000107757777171000000101001000101000101010000100000000000000000001041477110131035750020040477301000100000000000000000000000000000000000000000010004014176577707000067777777776560404007371734361701400001241000001000000001000020400000200000101747767777000101073777577777775372100000000100000000000000100100000000010000010000037676476700004000577470416717477421405000434140343000565120510100301014002107171370701437777777775777777112103177777777777705757771010000000100000000000000010000100000101000470440440671007477776777777614060600742524001777777747646776752060250003021716737777777777777774747727574777001016777777777767173317703000101010000000010000000001000000000000420460200077427477767777777775677777746474656606767777665746776757151253507166737777733746777577777777572776771100517777777767776015713141030020001000000001001000000000010100067440044047761477767776706767777674765673470657505767375664746757777271252167717733771737776777677567476577577121103775777777776717027753121010101000010000000000100001010000010767060004776747776776777756776777777777042477676067777467474747676777565256531311771177376477777576757777747710110701777777767777401717340000000000100001000000000001000000101004776540666050777677657777677470774777776747664607777376747476777777677717173735377717737747777777777774774770011271077777767777763171735210121010100000000000000000000010000000300406767757676775077006767477774774777774747770476777656706746777657777777777777777777737667777476574774777771001031777777776767741371771000000000010000000000000000000000101005707442567656176006767004770476707700767770000477747734656446745677676777777777777777777375667777777777777777773100010777777777777771753521010101010000000000100010000000010007777712152503004670077774767427047247776577564700076737747670474277777777777777777367777777765777777777777434777750757775377767676770172773100000000001000000000000001000101007170701614204046007746040676167470774167743656777740077776067407465677677777777777757717777737476775716161243410303077777777577775210000011350001001001000000101000100000100002100171525675070074340670005004076700706570757777767770077744746466567777677777777777777777773776777610000000137775350317777773777737750701000101021001000100000000000010100010010300067777761650604065047604760746404776406705656776770077764750474747677777777777777777773733747777773011735777777777777777757777777777767412041001001000001000001000000010001000577744140000607406706767676776777776477756767777447700774076646764777567777777777777737373737764677747753527777776777777777776365735353513010300120301010000000000000000001000107000210006147767674646040404040066667767677775476777046644644044456776767777777777733737373776777776774244777377717712777165357577534242040010010010000010001000000100010000100300050000146664000000101030734352101100065677767077770047604774377676777767777777777373737333756477657075377100770770177776525271673001012101210301001030000000100100000001000005000060046160004000125343510110101000000000007740000047744733737377757677777777777373737377737656757777777373101676770777717775671773001010300000021021010000000000000100000000100077400000414021414000000000000000000000000000300000777777773737377677677777777777373737333735677677777377710177777717774705271767340300000010101000100000100000100100000001014005660000000737560600000000000000000000000000004730777773733373737777747677777777737337353761666777777737737017771677077353777574735310012101000000010010100000100000000010004300065400000000400141254140404000000000000000000037737776773777373733777677777777777677646746565756747777773773017017710765654352735770017010303031010010000000100001001010030704000660000000000000040000000000000000000000000007777514673373373737777777476777777777474644764666776777777772711031076117307374357477373010341050043030012100100010100100012500000047000000000046742000000000000000000000000077776677777377377373733737767777777777767645676507574777657610057121101731611574777637735105270125213010050210100001070210301650000000640000000006776406776464000040641434177777767667614737337337373777777767677777776564767474664667477761775271112116101002331211101052721016120140161034106010173075617770000570047400047400446000000467770504777767173573756767776767737737773737377776777777777776564746765477576777176700774656474731010011000001250165214716170121012011070777173777400063770040000760467600000000740760600777067777777676767676767337333373737377747677777777776767747424676747677157701677677676131331213131301371317310312161525053073077777777700047577700000006006760000640400006474046740777777777676767676737737777373777777767777777777674746767467477777743670175305325352527135335353170143414371617130131211777177777777001737770006760476677047064466400047640077747777777767676767673773373333737373776746777777765467674704747674765375610731773573752534737417017035303130101010030001427777777737770047777770047460704644064400004640067004767077777777767676767673377377773737777776777777777766565665670767767775077007563153347370731013213617034343434307031417121177773777777740257737700027447000064000000000640064006760777777776767767767773373333373737777476777777777746765674464747767763477027172753717175777757757357171717171717433616163777777735737400737773400460660046000000000004000600676747777777776766766767377377777373737777747677777776756567467746765777117100537153353773777777777777777777777777737757737573777773773772047777350000474044600440000000000040047774007777700667677677633333333333737777766767777777777667476564657476760600007353375373177777777777777777777777777777737777377733753777740007177770000664024640640000000000004646700477777007767667666777777777773737777777777777776777446467565676777535373525317137177177777777777777777777777777777775377773753771737700076737350000000474664665646644400400464000077700067677677773333333333373737776676777777777767777766767765677771713175217037173777777777777777777777777775375377173753777377773700057777004007477667764766767667467600000004770000767667666677777777777337777775677777771777772604000404067761171613131535353717777777777777777777737753777777777753773717735374700000500670446677777776777776777776561004661000006767767777333131101100777777666567777567704040505140777716536353147173135371777777777777777777577577777777777777777353753777371700000001776040404040404606076767776170000470000071101100100000000000110157177776777776470124100002530004777111301313017535371777777777771771737377773777377753773717353252165376164464265700400000000000004040040076774000440000777500750000000000000000017347766777746564100000000400300652513530753303170737777775777777777777737777777773777753757035353134317137313533000046440000004400000000053770000000000077343100000000000000000004135777775676176000700000004044213052153115353371357777377737737775777777573757777777353213503161617163521657257000006700060042400000005273710000000000007577000000000000000000531117777665447405244000000040031501313030721353537737775777577753737717737777777777777035343343131303103171317337130100000567000200000031756000000000000000077771012100101101131117133375466747465707047000071502161011531534353517753773737353777737777777777737537713503353170717173561343105307030525370047014161717433700000000000000000000101011770000006402737373767456467777777773065773510137343531317073737773775777773777577375735737577777343375377373673071316352731717173137000007737352713574000000000000000000000000464000000046733737373446647777777777740007373737110310343537171773565373537577177375737777777777773353737717175357727753717163737357770000071735371677700000000000000000000000000460004004676173737374745777777777777004631713112031213131317337177737777777377777777777777777777775377737777377371717353773571747737377617771677773570000000000000000000000000400400000000406337333464673777777777774007733373311001013135317177737775377377777777777777777777777737777573777377777736771773773716717535343373525773700000000000000000000000000000000000000037337374433373777777777700007740010313133173137337357753777777777777777777777777777777737737775375737373717367171653735727367374753737174000000000000000000004600000000000000000373733643773373777777777404073000000000012137331737377777777777777777777777777777777777577773737773757575735317273353531757535737377576300000000000000000000424400000004000040007373375733337333377777770000700000000000000000070477777777777777777777777777777777777737773757753757373737777775357273673373773535737357000000000000000000004406000000000404004037337333773737737377777700400000000000004006404043777777773757777777777777777777777777773773737773777777717371737357171752573473721777340000000000000000000006446400000000004004337337333373337337337777100004705340100016503777747717717757777777777777777777777777773757757773577173577775777577377773777373757777177700000000000660000640047674000000004000003737337373377337373737774040077760004000000044004737777777777777777777777777777777777773773773577377777377377377377537177535757373537710000000000004040004640604600000000000400073733737337333737373777700000047477420000000000435777777777777777777777777777777777777757777777777777777777777777777777737737377577777000000000004600000460064600000004000000000373373337337373737373777600000000000550043617777777777777777777777777777777777777777773777777773777777777777777777777777777777737737777000000000000000000000406400000004040000003373373737337373737373770040000000002777357777777777777777777777777777777777777775777777777773777573717775777777577377777777777777757340400000000000000040004064000000000000000073373373337333373737377750000000000057777777777777777777777777777777177775737577737777777735777773777773773775377377735735735375737737000000000000000044600406060000000000000046337337337373777373733777007460000000377777777777777777777777777777777737737777377777377777737371775353753753777777777777777777737717750000000000000000000000444404400400000000063733737337333337373377774067400000000777777777777777777777777375773777757777177177377735777777777377777777777777777777777777777777777704000000000000000000006000666066000000004433733337337377333377777700676004004407777777777777777777777777777757357375377777775777737777777777777777777777777777777777777777777772010000000000000000000040004404440000000000373737337337337377777777704600674660077777777777777777777777777737777777777773773773777777777777777377377777737777753777777777777777750040000000000000000000000460460000000000463733733733733737777777770047464067000777777777777777777777777777777777777777777777777777771737177777757377377753777777777737757773737000000000000000000000644640000460000000000073373733733733777777773750660760400017777777777777777777777777777777777777777777777777777777777373773777357173775377735737777377757777240000000000000000000606400000000000000000373373773733777777777737604746400406057777777777777777777777777777777777777777775775771733735377757177175737753737537777757777777777750100000000000000000046540000000000000000007337333333777777777771771066067674767677777777777777777777777777777777377777777377737777775737573737736373717375773777373737377777371200400000000000000000046000000000000000000073737373777777777777737700656476464617777777777777777777777777775757777777575757735773735371737357737575357635733577377577777773777775000040000000000000440646000040000000000000733733377777777777777137106606476400077777777777777775777757357777777757577377375777775737777577735737377371735773757073737175777777370000000000000000046764656546400000000000007733737777537777777777774474407467005077777777777775777757377735737717737377777737777371773737373773577535373437073737757577737353777700500000000000004676474266640000000000000047333777074747777777777776567642766027777757537775777371735777777577777777577777775377777777577577777737777577737757757373737777775777000000400000000067407604040000000000000000077777103716173777777737676665646470577757377775777375777777177377777777777357357777773737777777371735737773735753737377777773577377370004000000000000666424604040000000000000000777777007677477777777767676767474003577777777773777777777777777773773573777377773777777577773777777777771775773777757353753577357777770010000000000040406404000244000000000000000777370141477567777777762476767660067777777773777777737773777753777777777777777777777777773777777777375367377375357367767767737673477140240000000000000446400004660000040000000007737520077772757777770040047667767177777757777777777777577737777757777717753717717777777757753535357777775775777777535753735757177357005004000000000000000040400476440464000000007773401616575777777006440004764256777377375775375735737777777737737737773777777777773777777777777771771777777777777773775777377577773000000040000000000400000000000067400000000077771425777367777700400060006765377777377777377737777777735735777777777777777777777757777777777777777777777777777777777777377377353770070040000000000000400000404000040000000000077770525765777777004004040440065773775717377777777377777777777777777777777777777777777777777777777777773737371775377773775657527777500004000000000000000000442424400064000000000777724077576777700400600007000373757373775775375375737777777777777777777777777777777777777737777377373577575777777573575373733771737300700004000000000000004646440000672440000000777507567657775000444040644047777377777773777777777757777777777777777777777777777777757377771777375773737373737373773377753575377577400004000000000000000000400000040440640000004777407757777700404246044604375777757737777777777777777777773777777777777777777777777377775773575737175717175717571757253372734372773007000040000000000000000000004600464000000007772525677777004704064240124373777377577777777777777773773777777573577777777777757377737373777373777737367363727373735356171737177175000400000400000000000000004600000400000000047710477777700676006564640577777777777777777777737773777777577177777777777777777377735775775377757173717535357174352537737373717717730070040000000000000000000040046000000000000077777711357047600446500072777777777737777777377777777573573777777777777777777777737777377377177377757773777377737777343574356773737710060040400400000000000000000400000000000000771571715356770446002470757775773777777377757735735773777777777777777777777777735777377777777777777737573577177535357773777371747527710160000000040000000000000006000000000000007771353777767600056440042735373775377375773777777777777777777777777777777777777777777777777777757377773777377737777735777537577373717700104004000000000000000000440000000000000077171357777674006064214357577775737757777777777777777777777777777777777777777777377777777777777777777777777777777737777373777737577777300424000400000000000000000000000000000000777174777756765404051425373735737777777777777777777777777777777777777777777777777777777777777377777577777777777777777375777737777353777100100400040400000000000000000000000000007717137577764767404061777777777777737737777777777777777377777777737537777777777777777577777777773773777737775377177577737353753737770737100400400000000000000000000000000000000077717177777467760030065377577777777777777777777777377777777777777777777777777777777373735371777775777177753777777737717757775375753573536100050040404040000000000000000000000000771717177720767000043737737737737757737773773777777777777777777777777777777777777577777777777737773777777777777777777773773737737377357753000004200000004040000000000000000000047773537777504004104375777573757777371777777777773777777777777777777777777777777373777777777777777777777777777777777777777757777777377373777200504040404000000400000000000000000077153577770000016075375373777737177777717717777777777777777777777777777777777777777777777777777777777777777777777777777777375373577177573535300100040104004000040400040040004000177353577770070007277377777537777753757777777777777777777777777777777777777777777777777777777757777777773777577777775377537727576377717252734120050040400404040000040000000400007735353777005006535357777737771773777377777777777777777777777777777777777777777777775737777377777717377777777773777777777753753735752771775173500007000040000004004000400400000477717177775004353777737377773777777777777777777777777777777777777777777777777777773737757377173717777773577737777773777773773777773771773136343700000561040405004000400400040400775317777700367771737577537757777777777777777777777777377777777777777777777777775757717777777777737177577377777775777773777353717773771776535353716000047000404004000500050010001735717777761717777573777777777777777777777777777757375777777777777777777777773737737773753777177577737777537537737777757777777771757372537737271717100005252004004040604004040077531717777177777777777777737777777775777777777777777777777777777777777777777757717753757775377737737773777777777777777777177173777737753770775363774320000416524100000400400004773717777777777737777777777777777377377777777777777777777777777777777777777777737773777773777777777577757377377777777377377777753737753771775375757377577600000106141410143405007757537777777777777377737777773777777777777777777777777777777777777777777777777753777737777777777777737777777777777777777777377777573777777377373775373735373000000000400010000077377717777737777757757571777777777777777777777777777777777777777777777777737773777777777777777777777777777777777777777777777777777777737775777777377775777777777161612161637777777101777777771771773777777777777777777777777777777777777777777177577377577757777777777777777777777777777777777737777777777777737737775773737717717771737737537777777777777777775717177777771777777777377773777777777777777777777777777777777777777777777777777777777777777777377377777377777777777377577177537777777373757737737735377735737737377737775773777377717177777777737777777777777777777377777777777777777777777777777777777777777777777357537537777577773775753573577577537377737753757357757357571753777171735735775357537737571777771717577777777777375777375735377377775377777777777777777777777777777777777777777777737777771773753757377377777737777777777773777377737737737377375377777737573537737753773777777777177777777775775737757737777777757377777777777777777777777777777777777777777357777777777777777777777777777777773777777777777777777777777777777777537717773777777777777577777717711737777173737377777377777777177377777777777777777777777777777777777777777777737377777777777777777777777773777777777737775777777777757777775373737777773777377377537737777777710101417777757757377777771735377777777777777777777777777777777777777777777777777777777377777777377377777777777775775775775737777717717371735377575735373757175365737777773737777777773617377373775737773777777777777777777777777777777777777777777777777777777377757177573737777577773575373573737737777773773737777777777777737373777175337637173573537777577717777753775777775377777777777777777777777777777777777777777777777777777777777777773737773777573573753777737777777777773773777577577737353717353577175217437753577377377771737373773777375377375377777777777777777777777777777777777777777777777777777777777777757153471773737373773771737771737377777777777773777737577777777777377737733717373717177737777777577777375377777777777777777777777777777777777777777777777777777777777777777777773737773771757577573577377717777575717377777777777377773717353717357175717577717753777175773773537777777777777777777777777777777777777777777777777777777777777777777777777777777753473535377373717353717171735373737777777777777777737777777777777737737737353735371737737777377777777777777777777777777777777777777777777777777777777777777777777777777777777777773777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777773535000000000000000000000105000000000000C7AD05FE) +INSERT "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(2,'Condiments','Sweet and savory sauces, relishes, spreads, and seasonings',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000777777777737125353313731773543110105302502105313321714317343717135371373147317317171717121135301610131217777777770146765074747776567616774776565774040371737031611737710110100007777777777717435357353531713343030301103112161705353317353343717135371370317717737371734125031131352171777777714066544724767776774747657700577764774340735757100371507530210777777777777777731737317353731704311151303112110431731305317314171731717171354731713535373107131703011317177777770664576076567476404776147676777674174074740573312411002173611137777777777777353167171735337173531163125351615307173171737171707373173733537023177373737351611010113521737777775245006047474747407777777767657775747477416560075141200115351103077777777777777377143161735717353463107113131303343353171317373107177317173171477135353717370737312503173577777344760547061604760777777777777764677776007470774033001010035212100777777777777777173563535335371731053130707071351165343171701773417357717177130177173717717134101713353173777747640076047447000777777777777777775667570467760774040301010101053107777777777777773712531335337171735301531313134334135353361371350735331737137707137353731737433731717377777776040000407647604777777777777777777460547743565054776011001031213010077777777777777353561737534717337161352171712717103737335137137061373573171711073531737171710351171735373777704740460464746777777777777777777777040667746776007751300530101301300777777777777777373071713713717135241311030711317605117533517171075353357373734173173537373735373773777777770460464740406757777777777777777771777640577740457777000131035310701007777173777777775353431613717357131630731713735311637317173737171235353353535725377777777777777777773737777567404706425046777777777777777757777775246577777767711350131030311300177777357777777737350771731171337510531071351613735534317131717305737357377373077777777777777777777777777776540060405646777777777777374777377777774767777747771076035031110121000173735777777773535307131717373513243357317073171163353712571735073171733535735777777777777777777777777777704600564064077577777777777737777777777424577756771147741121161037100017357733577777773731603521725153251071335213317077071335373371732177373573737777777777777777737737777777776460464604046473777777777777777777737777567776657167647421121121103001035775737377777571711613531337353371435135351713131471731171735716171773753777777777737777777773777777777774740405674747777777777777777777377737176567757370470067070121121100010733531717577777371734173535353353107127713631735370371737173537107377373777777777773777377377171377777777444006640464677777777777777777777777777756777774747047741137112116100305737161373777737173107313531735352471713171173537017173717353731637535777777777777777737737737337177777770760650406047777777777777777077777373437777770567674776012101611210010131717135357777713253425343525353131031717373537171617171371717750537737777777777773737737733713537777777744404656440467777777777777777777377771577774764044774470717131071301210161335253077777757131035313137377534721717173537371637171733737343537777777777777777737737753713137377777764604646560457777777777777773777373001777574777764477611301121010001017135131314377773131716317353135313001717353353717165317371713573173777777777777777737573533373353717777777465404006400767777777777777377735000137776067664707640341216131300300035253521707577135271653531161773716173371375335373531717173757316773777777777777773773737377171313773777770460000440066757777777777777773700010577756764100674031311310100010103131313521073777731131052773171371310715377135737171773353353337717777777777777777773773737333131353353777776764007640456006777777777737371000013576644566565671341210131300010103521703170073735371730311173171371352735377335373725357353757177177777777777777777773737377173317173773777344564046466404444056477777537301000373405606746764011331352171001201013523152107177735303504373171357017005335217135307107317371337377777777777777777773377373137317133353353777706400004400676000640677471001000171464767444564031301052117100301001703117211617173531713035316127331710737171717731734071737171777737777777777777777777737377735333531737777717746654047046440044700465700016113000564440676653130171311303001010303152311340217173613530435313513531210717313613535312131713771777577777777777777777373735333337113713131377777344660240404740064000007003012446064000065641301430121217100303010117214341305030713521770035312153431340315251703537140713531737773573777777777777737373737171337311317171771777714540440064600464074764547407644764474661061711131171213001100121311331330433171353713107121713013170071631331353113013073173537752777777777777777773737337373131371731317707377776646600000000400464006460040000476461100121212163011710430103104341170510350307131714035353017317034353153417125240735317537717377373777777777737173537713137113133135371377737771404047400000000440040000046564612110016111211111303013012110331333130343135134352334031251210717107353213717131300131733737777577777777777777737173713737133713717131774353737777776646444600006000046442564670513430031611030301700012112131170552530043032531351307171335313137007153513035211071631535737716173777777777777737373733733531313133713707375737737757474604640746406546442411030301104111210110303104012112533130313134315113171371407135031707110712313253121520031173733537777777777777777737737373717373313533531177165373577777737777574746445652413513125110130012121121210110013152113152531725005303616343160335303521310243535161134112143537371777777173777777777777731737737313171731353137350737173717352573717737353737171343070110212100210130101013020210311612313171134121711311353134135311353531061303116113010013535373537370777777777777773777371737373331371335117340537153717352573737517340707317351130211011201712103103011001312531711725371124301253717135035215271212170171703130313030703535373777757377777777777773735733717171311371333173163537353707142570532717161352513307111211211401113502101211041713030371135363105331301212530431731135353107031100110411000713737177377377777777777773773733771733317131335353170143417217317073173535317071353250303071021120120301311303124330171711371133150435053537171703713107031316053160317031301071371717717734777777777777777377377337371331351733137124331335351700717053530700714351131501103112107111131030105001153012125363757312131303113121051707131716110210110101100300317137373737713777777777777777777777777377373331537174101170535321705713725353507331216121312110710003070125103130061213110133151317052521716161370213134310313514310303121310140307171717735653777777777777777777775341307071331313130060130305313003411310303014105310101012101214311130121103130131412130757377735213171213135105350311251212021030110101030035317337735731777777777777777777757171310101373535317100112535321610613161035110031310130103010131003030013112105007031301011317731730717031711612012135035335310503110212130104713535713737167377777777777777777737310010135153313530003011010511001212117121243001030012101103010051013100301130011030130077737771750731731631350717133031035302110211010121303533733753773177777777777777777777510100000017335331711043030312121041153010101001121031010102103010303100311012100121010010731737773731731711531300316153171307116111035031101433537533771774377777777777777753012110111000015617137200103110311121203103031210021110010030101010000103110121013000130131017771777771471352373053525313317037130612102103121312573713753777377773777777777735035355371731510001717701100314311430100101311011021102031211011010130010100312112100030012003037777737377335375317330131351631713150110311301535017353777377377177777777777773513513130111053351101771130070131303131053170161307050311101030102121000121211010010101013101101777777777716537131731570716331531352352311210713013343773777375377577777777777713171310135371315373103520010113161311032072113131110311212121012110110031101121213030003100100307737777773717137171731310315331707353014301311253353573573717377737377377777773177125353131735335357103131202521135271510113412163105211111113110121210003100111011100101301010177777377775637717331737071735213317317431734121314317373777777777757777777777317313113107173777531737150101013173031133043713353110631777377777373111001310312121030012121000210777777773733171316171611073135351731703101013171733525777777652104277777377731713535341717353537357571310100010351353250310351317377577525010505357730301031010112100210100101037377777777757335735331734353717371371707131343121753177050001040014077777737713713011331357777775337175000100010370351314771377775713400100000000000417531013130313051130100010077777777777345331735353125353310375313430521353531377770000400140014057777777351717351071353771775357331001111111353353211377777434001000000000000000003531051014110030100100210777777737735335731735217103341737137353413110313535377104700106756207747773537371710325175375777317735110110001107317351677771611013400100000000000000000703121313003012100010017777777777773433173131710735333113710305303431073737770777406456065570014777753103535113137773711771101110010100171771737777171607000010001000000000000000130110300611101010011077737777773717717353731730537516371737125313173171777575646747676566756704773757110717757777773773130000111001110771377777516101105010000000000000000000000532131101721000012000777777773777717317353431343133317171717035307173773777775747400456556756701773737711010343571513571110010010001001777777777357343034341010000050000000000000150121001121100010107777777777771635371353735343535353371335431713535377777770006047606677674073777777771711113173753000001000010100177777777535305141000000401070000000000000000313500310100100010077777777777373537037331530173537317137523173773737777777747650460447465677777777777777777777777300001100000010110777777573530530374175353107057310000000000001710071030010101010777777777377753713713573716137131733533507171353777777777774640540761465477777777777777777777575000000000000000007777777753577575031035257053007700000000000003100121121000300007777375777737343711713131716137171753533437173773777777576700766704465625777777777777777777777737000000000000000077777777773537077577561763571001000000000000053010121001000110077777737777773531733536173253717373373711717353777777777755046564476767477777777777777777777777111300000110101000777777753577753712707100142070070000000010010300713110100010000375771777373534371353317315171731717171707353777377777774766474677644747777757777777777777777717370100013000000007777777777777350574100005251007100000000000000611210030001000017737371777773716135271711732533537373737307377177777777777752424464765677777777777777777777777777141010011100000077777777777770712170710301701617000000000130010531031010101001071771735717777136131173731716173531717135353737377777777747654476744644777777777777777777777777713001011010100100777777777777570570110414161600071000000004170003071011000100000371737137773733417373171371217137373737737771777777777777777467444604677777777777777777777777771700000001010010017777777577757353052431201001015340000000012100171121200100101011735717773375353735317137131613717171731717377377777777777600742076565677777777777777777777777737100010110100000077777777777305705251525034000702100000000005037103101100010000037133710775737352135237317350713737371773777377777777777765046546046467777777675777777777777773710113110110110001777777777775730701006125010100050000000010030013103000010001010717717373737735357135117717334353537373773577377777777777567746644650477577775777777777777777750131100000100100077777777771775711753010530400001010000000010010703113100010000003710735357353737037333713317137373757377173737377777773776564745204646757774777777777777777773313010010101110007777777777577771650341252051012104200000000007001352100101000101017373171737373531617171371713435317337537357777777377377756470064404657777777776567777777777751111101000110011377777777777577161035214105200040101000000000101031013010001010000735377335773773535373173173353737737737737373737377375377777447476704677777775777777777777771371301001001011017777777777537577134104034001001000000000000000700033101000100001003171357331771737160152173171351733717373717177775371737776767460446044777777467774777777777771311111001101017777777777777577756134311012161401000100000000010101012121010000000077337335737377373137335353737363573735373737735337173177756104700046567777777757477777777777117131000100113777777777777776717351410401450101000000000000000016017110100010000010357371773177735371613533371353537373737717353173713717775654065400004677777774707757777777735311010112113777777777777777535757161252161210000010001000000010010310210001001010007335377377353773530713535337337173537373735377311713737765670000004004777765656577777777777531311010111777777777777777777536352141010014340100000000000000010000311010100000001071775335377373737170733735717537373717373735317373717775725650000474046777577777677777777773711311313777777777777777777777575757161050000100000000000000000001001210000100000000377335737737777737313571733733717373735353737731353733770567000007400077777677777577777777735311177777777777777777777777573537010116310100000000000000000000000131010010000010105335173353777371353053331353171735373737373713177737777770016140740004777757777747777777777531377777777777777777777777757347753777717400000000000000000000000010103001000001000035736317357357377317271737373735337171737353777333737377716140141003473777776757465777777773537777777777777777777777777775771757761601000000000000000000000000003100000001001010173317717377377373711373535353734737371717371377777777777502112007047377777756777777777777777777777777777777777777777777771777771501000100000000000000000000000003103010001021016317431635377377173727173373371313531373737377737737777733714005001737377777777777777777777777777777777777777777777777775777776142140100000000000000000000000000110001000101012017713173537377737353117317137137343777373737737373773737373737137773777777777777777777777777777777777777777777777777777777775011210010000000000000000000000000001200100010301211431617353717737353353613733537335373337777733737373373737373737737373777777474240567777777777777737173302137777777777777753435341410001010000000000000000000000010010003010101003173617313737573753353435373135337773333777733737373373373373733737773777756101000507777777777777776140500001377777777777753525210250000000000000000000000000000210010010210303117351314771737373371321733173737733337377333373333373373373733773773777714000404070747777777777400000000000400257777777757170714141001000000000000000000000000001003001011010100617335733135377717137152357333773337333333373337373737377373777377377777435777707477175777777700000000000000005377577777716171430300100100000000000000000000000000010021201210311314121353737173737313253333733337333373373337333373377337373337737777710777775077574707777700000000000000011007377757753717071050140000000000000000000000000000001000101310310035737171253537177317353057733737333333333333337373373337373777737777777775475725777770477770000000000000000003005777677757717070102101000000000000000000000000000121010100310311121312135353343737733337373373333373333333737333337373737373373777777777773470052574177777700000000000000000010077575777771751016010000100000000000000000000000000100030310130307171353433035353773731717373333333337337333333373733373737377777777777777747125352757657770000000000000000001250577777753571252501410100000000000000000000000000110001011013010112130313117312777733323323332337333333333737373333737373737737777777777777140016050257407700050000000000000041003777777777357103000000000000000000000000000000002030003071301213353413437017717737373333333333333333333333333373733737373737737777777777777375017257400747100000000000000001000075777577575307505101010000000000000000000000000010101211035351010313703113733337337333333323333333733733733373333373737373737777777777777777477405670067777000000000000000000007743477777737530302500000100000000000000000000000130300313121213013431353673377373323333333333323333333333373333737373737377777777777777776747640424000474775200000000000000007575707705753553141410010100000000000010000000000013011035217131301703137331373333233333323333333333333333373373733737373737737777777777777756777004774770576705700000000000002177677057777777347130012000000000000003500000000000013125035217050131353137337333313333323333233333332337333333333733737373737737777777777464644640004047406700677505000107161756505777000575357316153050101000000000017100000000000707125131213130137333273313332333233333333332333733333373737373733733737737777777777656740000074067640000575767700416500416777777775777777717535214010000001000005370000000000424133530351302130137333323233333333333333333333233333333333333333773377373737777777757474000004656504704756524057470770071257777777777777571771341431001010000010117430000000007406753071034111013273331333323332333333233233333333733733733737373377337377777777774246740047000064704706760077077574774774577777777777777775347131020500010000035210100000000675740243103130303033323233331333333333233333333333333333333733337373337373737377776564404004064000474404004104747724740776776777777777777774735317435102100010015035700000000004642440043101010101331333323333323333233333333233332333333733373733373737373777777706400000670400000000070470477777577074757757777777777775675775701520510521001431500010000000700040056103121312103233333332333333213333323333323333333733337333737373737373777744470000004041640560046747477757556777417677707777777776567467171353413001006143043401000000074000004640210101001033323033333231333333233333333333333733373737373737337373773774676740460000640646406756777477776775774675447407776774052467747257253143525012107100000000000464270047040121303121333333323333323333333333332333333333373333333333337337373377640444004000004004000046777770707756767775677777657574256477567057357057177171410507110100000000054640676740101001003033333132333332332333033333323337333337373737373737373777774040000600004640000470047677434475034774434774750676705657740400645717377753430001214730000000000600004404042101301333323233333333333333333312333333333733733333733373373737376420000004006040420006406767767477042457707407047765774067764740064163717575251010000573500014425604450000046500210130333131323313233333333333333333373333733373733737337373777745400044004040000405447747747577774050604077447747465765044747604776445777775200010101350102467406470640000046041030113233733312333323323323323333233337333373333733737373373774664400000004000000460467767676776770675424770747725046565677654004476064065351777777777770005470474004000600470001012031323333333333333333333333333333333737337373373337377777000400000000000040000006767477676777765702576004765406770464004604700440000577777777777777750076000000000007407646001211733330332332313333333333323333333733333733377373737373744040000000000040647400477676765657656564047645076567656440756425674004704047777777777777777710400007647600540044650030123333333331333233233231233333337333373733737333373737777000040000000000040004000445740400676472470041674004740400042447560470424747677777777777777777760004047044064600000640171130337303233333333333333333333333733333733737373737737765400400000000400046004600064000400400540470047040076000470047646404004740004377777777777777777040077047707400740000740121333331373323333333333333233333333373733373337373733777046400040000000640040074006004367400407601647400764045607404650470576474040654777777777777777770404400746440044674046002117303137133133233231233233337373337333337337737373777704640000040004040000004400440674400046764064740040410065247000006746645647704427777777777777777700600047004704670400674013031377032323333333333333333233337333373733733373773737400000000000004040074567202400460000007400564706776656065646406004007247044046577777777777777777040460057706000400005674001137117313330333333333333333333333373333733737373377740400004400004000004464044047004747440046564006004454045640474654004744064760006777777777777777777400400674147700707604060307032313733333233233213233333373373337373373737377737740004000040000040400070004406640460707656475004006020064047441600474007476500077777777777777777740000000047464064074004400117313073333333333333333333373333337333337333737373770600460004604000007006464640045061046404650640560056440540064674070465647400406477777777777777774000420000760000434007060003313753533723331333333333323333337337373737373737777704700040640004000044050065000460460074004604006544640046700470640470744006647040047777777777777000400404007704000467444044013073312713330323323323323333373333333333337373737377466400404400654060006460460447474050060000460046064740004474400564464024045240640004777777656744000640074047777047446056700053531713733333333333333333333337373737373733737377774400000000047676404746540000746447465440047406704504004467404046746540470564004740046567765656424064040060777744040610674003312731353333333333333333333333333333333333737377777400004440000464640004044604464647676766746560404046000476776767677776004646400404656676646464644400400640404777600004400460011713000000000000000000000105000000000000E0AD05FE) +INSERT "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(3,'Confections','Desserts, candies, and sweet breads',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000113330735737777704000000000000006060000252000014131315311716037070021240161075371617637506357172512171357170173537160000025214002070000012436167777777173333737171773737377700001111131330131357737700000000000010000050040006331131313310705073430040000003070761617433514356537571773171771716167170604076776775677064253437177777737357531737373753537337113313111111113131235777000043712006767773677777711131531311777377077043125361707171177773563737373563777177371374735716771707717735637700016777476777737531333733537371373717531111313130131316131112163035371350007753477177311137133171331777777770734772516177777717777352575777357377717537533173777160277767777777043635673717737533337171353735737353773713111271131130317013111111131131670073677776771733113113135137777777771470777616777777777175377375377357177773573757073577775677777677770365635777677533753537337371737353377377313111123130131313103131313131711770477670777353533133531331177777777763777177717777777777735357377757777737777353353553737737777777777761771637535733533333135317373753371317371271131111313521313310112131171337003717377771313117113171131777777777177716777777777777777777735353773777777777775773365777777777777767160677747673173717117337335373777177775311123103121113130371131317113313143047765767171715331313133137777777777677777734377777777777437577777357777777777737357530735777777777776071777737317371733733531737177313733737131113313113303511130153311311317343077777773131331171353153137777777735377777777777777777777537737177777777777777777737777767777777777717061617717331337313173371737737373573773103111313103132130133071311311313000617277173171731331313111137777777777757175377777777777736527577173757775777775257537171777735361777253525616717373535333171371737717173753713313121011313113113153131131371310000604167113131171131713131177777775353737736535777173773753752767757377737737777736757777177777776165206353735331317337133335373753737373773111311131311301312130331303113131701070127013353133131713113113171773737773571753773527657765274371717737737777773773753637177777707177716535273533173731713717133717377317177373121131111121130313131031313313531600076507711317153131313113117777777717163763777767753717373136161634777577177757757777567075717776353613437473353131737313313353373731373735311131103111131111301731115313313131120012507317133317131713113137773577737753753435373777675756537535736173777737773773577377736777777677617437173337331737313353353753771335337131111110131303121731073131071313134107612771313535313531311313573757373535375377777567743527253473434357677537577375777735717771717171771707167317131733537317311331373337137131103331313113111113113312133131313503071650131313131531311313173757377757777737437773717377775367343717773537777375773737777777777777777167736535333373173731313133537311313313311111121353011303310335313111331312161677373135373133131135311777377777373717537717777777777725357343634777777777773757757777777777777777716573733171317171733313713317331331313331331130313311113311133173311531371753777717131171117173131311777777777757737717777777777777776347757737777777777777377377377777777777777773777173133333373531313313313331331311121773313311031341373053105313171773777771313537133713131311137777777777377777777777777777775357777775777777777777777777777777777777777777777773313713535373313313131331110103131137701710113113131317331333131337777177731731311311317171131177777777777777773717777777777377737373737777737777775777777777777777777777357777131331313331373131313113111010111773371600771213011305313171143171137777777131713131731313171131777777777777777777777777773577737777774770737777173737375777777777777777777775737331313313137353113103113331111117701677000071513131331353133131331177737753131313531371313131117777777773777777777353535777377771773773775737177777775377777777777777777777377735313313131313373113110111131113171607777000072111111134337113131133771777735317113371310117113177777777777777775377777773777535377357177377777777537777735777377777777777777777133313333131313131101011131113111677077700000000003373131013353533713777373131313135135313631317777777777777371737573773777373737717337317737537373773777773777753777777777777737331311113133133313111131353353137777343400000000000113113111312111717357713171313133131717531177777777777375377773771771717171713707531753573735371777373777173777773777777777713173133313113013313131113377377177701353700000000003113713121313131317371371311317173171317131377777737357377735371771373737371771333533723171735373777577777777773777777777777733133113111113101313131757173173343410111313410000041371353135313537375335131731713117135377177777377757377577173773777773535333171713531117373537173537373777737171737777777777313313113131111111311173337357131353131301111343035363131317133113317137133313113313313531631177377753777773313717353121013131717171312113331313312113777753737777777573777777771331333111000101111130311771733110111111110311317525753173113153035337713535317317315313171533157773773735375353717353113313131331310110110131311313101313773573737773771773777771133131311111131331131371373713131313013111311313737371173713131317137713131315317313531373513353577757771337317313133313121111313110110131111111111313033173753773777773577377733133133331331331331011171717311111111303111131353537737113312171313713713135333713713171173711313737331371731313313111111113030101210111110010101011111110313371353737753077777313113131333133131131313373775313011031113013131317777713371713131131311353733171371313107171131131135777137113111101011011011111311113100011110101000010111121131377777377307377131311331013113133713131117131111313503113317035303177353131713171131731311171137131353131213171153131137313313010101001011010101110101111000111010101010101101111317377357757077111131101013313713331133110171031131352115213131313131317131353031311353373371137171313131713133131131331310113111131130121111110313101211310011010101010101100011337177737737173131111101011173735333533331313501013111631131735353173533533313135313135317137313313171713111111111111101011010121012111110101011011131101011001101103710112110101117373773777653113101103137173133533353133131313171313113073130331213353135353131303531733711535353131311313131313170101101111113111101010101101101010311010110110351310153501011237175377771377111130111313313353335373311013113101213713103131131317335131352133533171711733313313131311111111211331130110101010110110101000101101101013030010131031131313531011137337135370527131111333331353335333171313177307335112153171725353711131713313513530337331717317171131313113311017521012110101110010101001101000101111211111101013170170103031210135337377737147131331311133317335373731113111711533113313331131310317131311713313171537171371713131311331311011313113111011101011110101100100110101011131301317010113131311111113331713317777323131131003131331333131337307131130310311213533173131131317173171253133353137131313131131110101353531010101110101101010100111010010101112101101313131310101010312111113351731777507111110313133133113373111711103131135371713413107112111313131311353571373537131311103101013531131211110101010110101010110001011010110111101310101130113111311113010311331733537707331111310113113313171131173171533131313133173133713121713535312133171173533531313111111031121111301011101101010101110111010011010131031310111110112101010121013110311331737737707713111113313013013131103113131013131313111353171353171353131113517137317173173773301013113130311111010101301030112110101011010110103101010101010111101211111312111031173131717127731303311210101313173171311131701616017337335331331313317130353373531733317717311113113011131030301010110131111011010111300101011311131110100110100101101010113101133317173777077775775311111130117113170706070700005200101731731535351731171353173171757733717310313011011011111311110111101031013110101300001011010121010110010110110101100101311111313353177577737737713131111371311777777777716705347253531731313313731135353171373317753311351011101011101010010110101311013101011011101011013131110100010100110101001110100230011311377137037777777777777377770707725777777610634305277353535353731737137137137177731310131331310111010111111310113111011101131011700101101010110110101001010010101000011031371011373131717777077737575775777777777773677761071777520735373713171773535353717313713131013011111011001010101101031101011010110101073113110111011010010100101010113010311301107333013313773770777747773773437577725777777777707767036571737753735371353137353731713731101311303013775311011101111101111011010111111710100010101101111010101001011011131121100331311011311171771777375777777537777776776776777707716537371713717135377377171713533111331113011111313377751001101011100101011010101013311111010101101010011001010101010121101100110101011033735377777777777577777777777777777777070773535373773737735317177373733113131101711300101101113733100101101110101001010111011010101010110101011001110311010111101100110012110103117377527777377777357776776777777777770525313371717353713171737335371713311133133110111110131310357710010101010101100110101701110101101001010101110001101010010100111011111010010335317777574777777775377771725707777772531715373737373717377535771737351311111011310100111010310313371011010100100110010103101010100100101010101011131111011010111211001011311111131237777375777757777777704725707436531713737177173753535377637371713331313111101111101301111131011133010101100100110110111010101101110101111101013013011011010011011111011101313011753777737777777771725073520717753431353537317351373777071757373311111111301110101110110310113101013110100110110011011031001010100110110301111301101101101011001010101101110101071371777777777771704720742577634367125313531717377575707737375311131313131101011101011011013010111010111011011011301101101101010010111011110310110110110110101131310100101011113117177717577753577073512753471777707531753773717737737735357777731113113133101010101011011011110011010101001010101110101100010101010101010110111010110011010101113130110101101013031777773437777770742616343061617707672717177777777777767377371713113111113110101101001011101111011010131011010101010101110110111010111010110101010111011011010111110103101101211771777777577777712755257777777770735357677777777777771735735737313111012111010101101111100110101001010111001011101101010010010101111010110110101010011011001031011010100112111177377777777777757616327777777777777567773577777777777777537773535313100111101101100110010111010111100111010111100110010110101010110101111011011103111101010371713101113111011107313537771717577775257507777777777737377777377777777777773777377331310113121130100110011010001010010110101011010111011010110010111010101013013121101610101217130110101010101103131717771777777171727777727777777777477777777777777777777771735375331010101121110110111010111010111010101010101010001010100101010011101101011011101311371311525110110101013101111310317775257377777507776577777777777777777777777777777777737737137131310171110010011011110101010001010101110101011301010110101011101101011011101131311111703130310110101010110101031753777775777777727353777777777773777777777777777777777353753713571013121011101101101010101001110110110001011110111010000101110110110101010313010112121353411011011011111211113153775375377535776574347777777777757777777777777777777773713331313353535131000110101313110101100010101011101100110101003110110110110110101111011352111531113701101101001011130113317775777777777353774377777777777737737377777777777777757717131777317331031110101101101110101111010111010101110113111577777370110110101100101013131613536111305301011101011010317017737777777774347034167361757772757777777777777777777737313133111371531113111101110110110101011310101011101010301077377377710110110101110113111531353113635130171010173101131713777577777777774373436756572773757737777777777777777773737131011311713101035010101011011013107101011101100101311117737775773130001011101013101213317134311113717217073110113131317777717777777034141617373777677737777777777777777777777777131310303103131131773730101011101313111010110110101010137737727170131101000101101311311037135031701315313152111013112757777775777773436216167567535777777777777777777777777717373531311153110110737777537131031311777713110110110111110737521717310101371310101110311017101131431315311713313011013113737777777777741615250716352773777777777777777777777777777313130107301031013513353173511111035331717017010101001011713537371011135377510101011101713110353171301301110111011101357775777777777216102527777777777777777777777777777777773735773513111111101101315335317301035130101311311110101117727773777710112112537371301010330110317131135311113071121013137775777777777775250753477777777777777777777777777777777775733133717730101121101031535121331134111301711212511121713513773531312113111305377771735110101213170101303011121171101013777735777777702527673477777777777777777377777777777777737717113317531121101311131121711521131215131251113031112513411777701111010311310135371121031117152131310111011103171331357735777777777753473743777773777737777777777777777777777371737353533101110101012107111031110111133111312111103013103121331310101011010533531121113101213111110110101101353131111377777773535777673757777777777777777777777777777777777777773131313305311011101311311213101211031251031011101351710101111010011011101311351317111301531113012111011010101311301257777775777773773747763477777777777777377777777777777777737777131315301011301311131211101311131111131011101370130351310101111071103110130310313161713121013110101011010131301111377777777577777757737573777737777777377777777777777777777177353101311313010110121051303101121012130111010777173111210731101011031101130111310113131211113101112101011031101121071777777777717577763572757777777737777777737777777777777777777777131317101111031111315310101111111011011377353117121177101100101170101111030131211111121301101011117017521113113137777777777777737577257277777777777777777777777777777777773773731121735310101013030130531130301211301777717171303110310110111131371100101111101113030110110301010731713112111735777777777777777572775357777377377777737377377777777777777737753531171717010111011110113130111311101137777131171110357713010101011130111101010111011110113011111310173717110131737777777777777777257276353777777737737777777777777777377377177373713537313510011010131010131010301101777371731121110373053510111010113121101110101010110111012101311173137313031777777777777757775355717777777377777777737777777777777777773777713137717131311011011003111011311110177735331071152117771313210101011010110101010101010310101011101437113717353137777777777777777276373777377377737377737777377777377777777735777313171312535301101101111301301101037771731153121211735311435112111301013131101101011111011131121313310301371311777777777777777775717777777777737777377777777777777737373737737777130317113031710110110101101100101771731521311111317731213112112101111101030110111010101010101105015315301377137777777777777777773777777777737737377377773777777777777777777337777531313111131312110010101101110117771731131303110173111010717117112101101111030103110111011101131211313171313777777777777777777777777777737773777377773777377373777373737371777773131350307105351011101101101010773121121010110017211011313130311251310101001111312113013101301011121371313777777777777777777777777777777777373735737777377777777377777777737777777112131113130107110110110101137112110111011013771101014352535211130713111131271011101110110121130113137357777777777737777777777777777773737771737737777717373777717373737717777773113573773531310351011011101713111011001101073570131313113131213113152121051111101111010111110135711153777777777777777737777777777777777737373437737737777777377637773737377777777313173573535310311211010173010111011100111773171035253143151707352111113121031101211130101735737373377777777773777777777777777777777737717353577777777735737737737377737177777311177777317353535311121110111010011001131077735303513101313131311113030101113103135121413131733757357777777777777737777777777777777773573737377777777777777777771737373773177777173733531735371307030111031001011101110503171521711213531703703130311111313105314103531316113715331737777777737777777777777777777777773772737370777777777717777733717377777177777311773771531735317110101101101010103013113773111211713121311110110121210101121131713535317313331737777737737777377777377377777777777770753573534357777377771717752737377777777777731531731735735317312101101101031111013410717031701107111303110111111311121125371773535371711777777777777735377773777777777777777777377373727373734377577777771737377777777777777773173531737173535351330100111103013101311211101130313030110110103010101113537137177377171377777773777377777777777777777777777777777707773534365737716375357163717377777777777777777313771737753535373513171010101110131071112113011101111011010111113103071717753717717335377777777777737373777777773777777777777773707167335327777714177371727377777777777777777777711335353737137153717177711110311011130113011303101011073711012103113131313353773771737777377777377777773777737777777777773777773737376335353517730115073537377777777777777777777731537353537537371737137370710131030130113101101101033717735317177571615353353573777173777737377737377777377777737777777777737773435317237277735341617317377777777777777777777777773535373537177171717537731313017113513050310110117575773535353713731331357373371317777777777777777737777777737777773777777777773363735353773777535371637777777777777777777777777713137717177713735373573534307121703035371031037773737173735373777171171331317527777773777773737737777777377777777777777377777777170736357353032525637377777777777777777777777777777513737737771773533573531717171753537173537537173537753577717137173131171637177737777373777777777773777777777777777377777377777372537236353533531377777777777777777777777777777737353537531771737537773571777731373537173537537153717373335377173537170675242477773777777377377377777777377377777777777377777773712717737252163777777777777777777777777777777777577737737773173513717353777371435753717173713173735375357533133317373001024107343777373777777777737773777777777377777377777777777371210101217377777777777777777777777777777777773677753537317131371735371777713773335373571717717171737733113100137100000100074347735777377377377773777777377777777777777773777777773737377777777777777777777777777777777777773471757373717707175371735373711757357537173737713737335353531216174213000000000160137737177377777377777777377777777377777777777777777777777737777777777777777777777777777777775773472777573717707025371735353733717337173537531717175737373171706353471000042107162473637376373777373737377773777777737777377777737773777777077777777777777777777777777777777737753577777777770735317171737371753735717353713773737333531370070714253600000010616150377177177377377777777737377377777773777737737777777777307777777777777777777777777777777777777767177777777775040603121317177377173311317777131311010343107347435341041061061777276536363717737173737371677377737777777777777777737773777017377777777777777377777777777777777777167777777777727371707576713177377311060131313371763434340347737767761207161007077573713173771776375675271735377777377777377377737773777707677737777777777777777777777777777777777177777777777525677020753673135311677166072147777140774340377677777741676167077773767776172723377373737377377777777737777777737573777370761737777777777777777777777777777777777777777777777777773577527777172531770167107757375676372537734777777777275347712777677777037017757137373735235237377537773777372777353537777173577737773777737777777777777777377377777777777777771776172577777777607077070777677777314775610477777777720536710657777777770503303323743707073773577733637777377773436777670007677377777777777777777777777777777177777777737777777774176142770776777307077070773776777430637270777777777512416370376775777727765301703353737371212537771703774371773535213170001077377737777777777777737777777777777777777577777777736012147777753574007052525777717763410505003437707176012140505717727035001000600343303030035353637163775377763477637767007000375273773773777377377777737377777777777777777777777610400030707276301000000072504761700020000077410776701600210063600534720000201006304343037020071707707127525353703170716100007737777777777777777777777777777777777777777777777101073001675250534060030104352430170507016125703676010000050002714177043401401400751437070500143163740707703727343767070700001437735373777777777777377377377171777777777777777777777777705207772521014060707617767070305204036571717771610012415636707371423000210727052572002007707307007707163701010070760002053677777737773737777777717777777077777777777777777777777775307077560210110717617167761615314172776707761670717271610707671507014252572572570500740700434300707161677677770107001671737373773777773773771677777717171771777777757775357777777525252105060601671616170105204216357071770101034725777777771060701610777777777252070307077700071616177777777770707707373777777777777777777373777777777777177777777777777070777777777770707171777777777777773573577777777777777773577777777777717770777777777775257770434000000000000000000000105000000000000E1AD05FE) +INSERT "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(4,'Dairy Products','Cheeses',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000777777777777775773775737773773777777577777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777173434716174361735707353436571717377235700007777777737777737777737653777757377177737537537777777777777777777777777777777777777777777747657252103060206042434777777777777777777777777735777375374361705253432163617075727777777737777777737777777777777757775777773573777777777777777777777777777777777777777772524141210000040604004000000000004061677777777777777177763534736175370773527577757777737577777777773777773757717717717717373737771777777777777777777777777777777777777777777127052430200400604200000000000000000000000000077777777777771776773717237077052707271735735677377737357775773577737777777777777757753777777777777777777777777777777777777775251076502410040600600000000000000000000000000000000000007777777777171756757577307371717076734737177777777777773577777777377777777777777777777777777777777777777777777777777777777676107412042000000000004000000000000000000000000000000000077777777773773637075352525617357737576177357777357777737577777775371735737777777777777777777777777777777777777561600000016700604004004004000000000000000000000000000000000000000000777777777177777377677773765725772737777777777737777777357357377777777777777777777777777777777777777777776536177777777650060000000000000404000000000000000000000000000000000000000077777777757377671717075377777577573777377777777777777777777777777777777777777777777777777777777777777172577777777717777040040000200000202004004000000000000000000000000000000000000777777375775777777727171777373577777777777777777777777777777777777777777777777777777777777777777567537775767775600247142006040404040404000000000000000000000000000000000000000000077777777737370707567677774772777777777777777777777777777777777777777777777777777777777777757572536577727757700000164250400000000000000000000000000000000000000000000000000000000007777373775673773717353773577777777777777777777777777777777777777777777777777777777777756376357616767577777700000025020000000000000000000000000000000000000000000000000000000000007777777777174347777775352717777777777777777777777777777777777777777777777777777777777374357635737576167061652007560400000000000000000004020000000000000000000000000000000000000000777757377737716177767757777777777777777777777777777777777777777777777777777777777765374357434777077752161257003434246040000400400000000404004000400000000000000000000000000000000477377347563777071737377777777777777777777777777777777777777777777777777777777775161434243652527777756140007403400004204000000000000000000200200024040000000000000000000000000000377757737356177777756777777777777777777777777777777777777777777777777777777761636342707165256775777777777777000000000425200000040000000040040400402004000000000000000000000000000077373525617271617735377777777777777777777777777777777777777777777777777771775414340564167014707777777343576100000000004752440004000400000000000004204240000000000000000000000000077567773615777725777777777777777777777777777777777777777777777777777777770736340703167047025200777757202172507060000000652060004000400404004004000000040004000000000000000000000077352353634371737177777777777777777777777777777777777777777777777777777670504250746014304004043434275710050725100000000047004000000000000000000404000200000000000000000000000000077775743537477476777777777777777777777777777777777777777777777777777071072435274212420424200240041427060030052473400000000420000000000000000000000404040000400000000000000000000077172353653717353777777777777777777777777777777777777777777777777177477043425010410400004040043607404140061253043612000000040640000000000000000000000040400240400000000000000000176775253777777777777777777777777777777777777777777777777777777776537043471724202420424003043405607024240040243043416100000000060000000000000000000000000240000000000000000000000735077253434353577777777777777777777777777777777777777777777777773467743424014040040000604306521604000000000000100216034000000042500000000000000000000040004000000000000000000000527014343537072777777777777777777777777777777777777777777777770743535360500606034034070434702040000000040040042410501434020000000656504000004000000000004020400000000000000000003714363527707357777777777777777777777777777777777777777777777775347765160610014024072452400504042000400000000000200203030506000000000616160000000000000000400000000000000000000001634107107717777777777377737777777777777777777777777777777577767347724100424204070452521602002004000000000000040004000030314700000000042470040000000000000604000000000000000000061527077316703777777777777777777777777777777777777777777773752577716524612500563472524040040404000000000000000004000404004212520000000000047002400000000000421400004000000000000172016125613757777777777777777777777777777777777777777777765677741607521040256056152434306120102040000000000000000000000000040357340000000000650040000000000060000000000000000000705253573757277777777777777777777777777777777777777777775371777760524747025617256250004404464040000000000000000000000000000000000716707000000065242040000004074000040000000000000725363757257777777777777777777777777777777777777777777765671671702503244707657050656125212120350000000000000000000000000000000000001616520001060546006000002070400000000000000070707577277777777777777777777777777777777777777777777777371677564652645217771616070216525674774301000000000000000000000000000000000700712107700112034610000040470000000000000000170707257753777777777777777777777777777777777777777777776565352535214120747774343417470753537531000010000000000000000000000000000000070041650030677400046000253640000000000000007070737773777777777777777777777777777777777777777777777717374240607420547356534343743773676573000000000100000000000000000000000000000057252121013577777000040643740000000000000007071757777777777777777777777777777777777777777777777777656534343416520347736747343743571777741010000000001000000000000000000000000000217010000203177777742041677740000000000000725242737537777777777777777777777777777777777777777777753737470042430476770571734775376777177300000100000000000000000000000000000000034161001210102777777750000567704000000000003525375776777777777777777777777777777777777777777777777765743004341043177177365777167571677770000000010010000100100000000000000000000003002100010617777777600600000425600000000056102527377177777777777777777777777777777777777777777775363742524242147576525365777772773576710100100000001000000010000000000000000000000100210211037777777007000000000424000001200614357176177777777777777777777777777777777777777777775752542505252167537565372573577577357300000000000000000000000000000000000000000000010010201077777770077000000000000000025300020216177777777777777777777777777777777777777777777727772142525042536743534757777772777774100000001000001010000000100000000000000000000001210121777777700000000000700000000704034175777737777777777777777777777773777777777777777777577054252420356771776777273477777477710010010000000000001000000001000000000000000000000012107777777400000000000000000434303403434341577777777777777777777777777753777777777777777077025241504252563575257577775777177300000000000010000000010000000001000000000000000000001217777770000000000000000000000701612537363777777737773777777777777777777777777777777777167061626143473576377727573777777747100000010010000000000000000000000100000000000000000000357777770000000000000000000000761612535777777777777777777377777777777777777777777777776714161416007076175673572747377777730001000000000000100000000100001000001010000000000000000277777000000000000000000000000170777763777737357353757357777777777777777777777777777753422507241707716437757757775757777500000100000000000010000000000000000000001012400000000000021776000000000000000000000006707343575777777777777377777777777777777777777777777777767450615242506717653672771777377737010000000000010000000100000000000001000000001000000000000404070000000024000004000000016107777377357777777777777777777777777777777777777777777173070625042516705657757767167575770000000100010000000000000000000000000010000001010000000000000040100000176000377000770352525347777777777777777777777777777777777777777777777777656071425252435635270777777772777710010000000000000100000000011000000000000100000000000000000040252400007610004740007077602537737777777777777777777777777777777777777777307757775307406160043463527577757753577707000000000000000000000000000010000000000000010000001000000000025240000007000037000007761757777757777777777777777777777777777777777777774716773776502534165241756752707677767757770000000000000010000000000000010000000000000000010001001200061420000000000000000000003161207052777777777777777777777777777777777777377717617747777702436125260743657753777777257730102100001000000000000000000000000000000000000000001001000061400000000000000002506061657127052777777777777777777777777777777777775770777065707776561405601416165252765777577777100010000000000000000000000000000000000000000000010000102567060000000001773774352100001206107357777777777777777777777777777777177777073701752756177347360560605257653563477777070000100000000000000000000000001100000000000000001001010216100000000000606043437777777777535771677777777777777777777777777777777777775777720253617056704076161425241652577736577710100010000000000100000000000000000000000000000000000001636160000000000000000000424343437763071777777777777777777777777777177777777721747570257077717725036163425243652525777777700010001001000100000000000000000000000000000000000000101404000000000000000000000000000001757277777777577577577777777777777777735773577737051207430653524507041425241616525074743101000000000000000000000000000000000000000000000000010202020600000000000000000000000007477375777777773773737377777777777777775773576777752025070161347770240724340160652567371773300101001000000000000000000000000000000000000000010001040040000700000000000000000000077767777777577777777777377777777777737777777717161743507076146161657070524176050065256563673730000000010000100000000000000000000000000000000001002040075017700003740000020000077772507777773777773573757777777777735777737777007007342100170352573657070524016070024343571733733210100001000000000000000000000000000000000000001000077760077200007600000750000743756173777777773777357373777777735777777765307701635250610616070052725242525607043410706074773773610010000000000000000000000000000000000000100000777777700774000177000017600077774216775777777777737735357777777773777707534160060070521061001725250577752520140707060407434373333321000001001000000000000000000000000000000010137777770007700006770000777005777425621777773737777717373737777777743777777034177171030060125614165252552752576034043470702434277773732301000000000001000000000000000000000000000377777770017200017700003770027777001567377775773537351717537777777705053770436143434070104030612101612416070757434343434707056173773737321210000000000000000000000000000000101007777777430000000035700007761657777023057737736153434370703777777753027777072534341603436737410707061613611616252524340610707256173773737361000100100000000000000000001000000000177777777000000000000000075425367700456375773717273537073171777777361417777050616030141410041271527170040065255352534161460525024377377373337312000000000100000000000000010000103777776740000000002020340702576770612734736157777577577174341777770521257772171616577273430034020142534352101207614216167376167534217337377737631210001000000000000000000000100377777777700000000000140000252753470434717717235377363777373771777770525277576507177775001412535160342100052405205214704175070177777777773337333733733000001000000010010000100007777777576700720000002102141652752430525637777777535757375775277770702525777773777717120302050767050104777253721610610212527416777777773777737773772733312100100010000001000003777777777770057400000056000200256341402527535377353773735777377774030050177677177777772514101200103777777775705050161241470412707777573777373773337337373733250010000010000010177777777767700272000000374000175770002016752777557671775777375775377470276717177777773712037400142057740217737727060041020003040775773777357373377737737372373333431010001010037777777765776105750000007770006027740012452777353353771737177777377737775357777777777657571763002100212710612410535161061434343000737777577777777337333737377373733332303003037777777777777576002700000007740305057730003052557677771777477717377775777777777777777757373070104104000417651251243420107072534000437775737717377377737773737333373736373373377777777775777727770371000000777000026777400006357353777176717353775777777537777771737777377740170000630000377025724103416000057052573775737777777535733773337373776373733337377777777777777477577000000000003770002517772000534727771777717777777777773777777777775717777571270030010750304161407100617070012006100777737753535737773777377737373337333773737777777777777777777777000000000000300142437740002437577177777717357353717777777777777777777773751734000007614300037707010074010401000703717773777737435353717373737377337733777777777777777777777767765200000000300030303474340107437777777777775735777777777717777777777753567721737000000037430070707352037421000125075761777177717737271737373737337731437777577777777777777777757700000000000000404043076120001747777777777777777777777777777777777777777730507430001000753401000006004143100340003773777537712771717535277373717531343777777777777777777777777774100000000100003034307410002567377777777777777777777777777777777777777771752013410025037700000100104002016070000001771737753757172713617116352733077317777777777777777577774777772016000006000007000743600012074777777777777777777777777777777777777771612052412410735700772000000030100010170100070775717371736173753737353711653107057777777777777777775777777750275000016000007000347000074377777777777777777777777777777777777375377775210241277727777050000000000000000700000375363743563537152317071253731357317377777777777777777777777777061760000770000770024370000035677777777777777777777777777777777177777771421434120500143417007006005000000001600017527357377353716375613535352534331707777777777777737777777777776174300007700034740535770003473777777777777777777777777777777777773534163503430752142100025001010206000000000003073717717535341735133573617353531743177777577777776577777775777700374000077700077702476710043657777777777777777777777777777777777577672507701617742104371020060000100100000000000707352712737371736532535343172521343777777777777777777777777777740770000777000777012577600143777777777777777777777777777777771737761743700161614100630407050107050610020102500017716353753525361713533533172531717117777377777777777577777777774300000000700007770607775004256777777777777777777777777777737777770017171700000030601750300216100210061412517211473471735377173534352570347153170707677775767777777777777777657730000000000000017270537760021617777777777777777777777777777777771710024361614000001700250757576014070121612745763771372573433053713753177132352171311774377777577777777777577777430000000000000005027060000525677777377777777777777777777775771671600015300031200000010003002016030052410417320177774173437577070712352117153070352707777777177777577777777777777420000000000000205007030000435777777777777777777777777777737777161001020502404116100700700351701403001243524177777537073713137171751357216357171351377777757767577775277777777770105000000000000125614000161637377777777777777777777777775777712716000012100300600610601617206060340704100617777777253535256517343136131735121214325777357677776776777757757757616720000000500002070200000027477777777777777777777777777377717050705000400100101010071610404101100120120701777773771617037313725307717251123717335167777777775737771777737677777007700000027000014070000025017777777777777777777777777777737773010300001242520002000000030300607740165100777777777771617147707135301717367510714325377777737737757777677777777777475600000077000030770000024247777777777777777777777777757777340200030301010143414003416500010161034020773777777777771707331352717375215313671635101777717577777775777577577777703677000001770000047740000107377777777777777777777777777737534100100000020030201021343212177060002503177775777777535770731475251617031736161101016367777777657777277777777771777077340000077700000375200016074777777777777777777777777777777730000010001010001021000153534317173412147717777777777737771073031631617070517036373614177777777774775761777776775770054300000377600007777000250077777777777777777777777777775735701000001000001001003012153535637173577357777373777377777777071611613435272035014010337777717717777777777734777777770200000000777001007770001607077777777777777777777777777377773000100000010000000100017013531353572717737177775777771777717161631611201017037737775777777677777777537775773577777061000000000000020077700007007777777777777777777777777775773500000010010000010010001213343175727353773577757777377177777776173052163577777777777777777775347753777657777777776776100000000001070000024000700777777777777777777777777777773777000100000000010010001001715317031717757177173737375777777777712141253577373775737777277777777737675777776375777717716000000010020000030521430601477777777777777777777777777775373100000000010000000000121303535371713737177357575773735777777752173773777777737777775777777777577777577177776717777616000000200001210002402417423777777777777777777777777753777700000000100000000010000116152135073752577356737373775737777777777353777357377777573777777777776357276377777777777777017000010000024000052503402547777777777777777777777777777770100100100000000010001010311313437305317125373567175733477777777777771717735777777757777777777357777775777707757677706774000670001434005200342704377777577777777777777777777771734000000000000100000000035230533111735737737173537737577777777777777777737777777777777777777757707757777657777737577707770001775020777205274305216777737735377777777777777735777130000000000100000010000111531417251235017153537525737137777777777777777717777777777717777777777777771617777777577777052770027767403775600774704257577777777777777777777777773777000100001000000000000103030121301375137352370713737537577777777777777777777777777777777777777765727777777775367777770775216177703477761657770705237737777777777777777777777775301000010000000000000000013517171717013615357173757717343777777777777777777777777777777777773777537577777771777777777616563407777442577524377707027777771777777777777777777717373500000000000000100001001312303112317351361307153313717177777777777777777777777777777777777757777777777775777777717777012142147772106776106776524147777777777777777777777777774352101200000000000000000000111116116112351353533747717335377777777777777777777757777777717777777777777757777767777777756042142052142507706107770707071777777777777777777777777317016161100100000000000000016125213513515361353453313635707777777777777777777777777777777777777777777777777777777577777734304343252052052050617070607777777777777777777777777101521613016134301000000000001713531701212121116171335757171357777777777777777777777777777177777773577777777777775777777777400434344047025205261602434167777717637717777777777777702503507107010521210300000035371161735753534312134530317353777777777777777777777777777777675777777777777777777777777777770703434034307504361420410706177777777577771637777777777753503016107030505250103000071673535331361735717133517107103777777777777777777777777777777373757777777777777777777777777770600616034202704161430612506717677773777777577777777777777775210703503031216101717171163525677171723527507343712577777777777777777777777777773577777777757777777777777777777777401771616005614306025070416017777777777777777777777777777777777771410307041610777777777717171103525357353735371717777777777777777777737777753777757777777777777774777777777777776167760414777070615706003601677777777777777377777717777777777777777774101301777777777777777777771717015253437161777777777777777777775777777777577375773773777777777777777774777702570772430776061427741605261777735371777757777777777777777777777777777761777777777777777777777777777771717107127777777777777777771777777777777377737777777777777777777777777777742400412477775243477341615067777777537173777777777777777777777777777777777777777777777777777777777777777777717577777777777777777777717577777735677777577777777777777777777777777053761610077705243777600260135377703677777737777777777777777777777777777777777777777777777777777777777777777777753757777777777777777773777777773537777752577777777777777777777740276160607770425257740165016777577753177777577777777777777777777777777777777777777777777777777777777777777777777777777777777777777676777777777777757772777777777777777777777777705070501607721605277342032407703777777377773537777777777777777777777777777777777777777777777777777777777777777777777777777777777753535677277775773771753617777777777777777777777200020601400401240160104052777757777771437777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777773535757377777777075777777777777777777777774343430703430705216070612410777777777773777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777377777777707377777777777777777777777700040040240060420400000007067777000000000000000000000105000000000000D6AD05FE) +INSERT "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(5,'Grains/Cereals','Breads, crackers, pasta, and cereal',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000777777740043734074373737370737777043707777777777777743777777777000534040673577777500740000400050040042500000777770004217073737373773777730040407073377307373725000043374053000003737373777377604074377777347737377047637777777777777547777777777400750250573177777505350700050000000040004000577770404033773737373773370400040407071214377373736100372000073777777777777377704404427437307377777734341777757777757477077577777771040075000777577777040614340000000040000000003777700007773737737737377040040000007061637373773536173040004003737737373737520404040453774777737373777777767777777777705777777777770004770477737777770051004100000000000000000047777700737373773773737200004004040407173737377373737340004000777777777777736440406404247073737777777737777577777777745761777777777750017770777537777750065000000014000000001040005777733737373773373771604004004000063773773737373730000004040737373737737700406040604007777773737737777777757777777770742777757757777777757777577777601734000000213000000040004167777763737373773773021400004004005373737373737373400404000007777777773753652444040404737373777777777767567777777753475757777377774077777077713777771561410504351750000000000000017771000437373772007003040000400737373737373377240040000040473737373776345340042440573777777377377777577777777777767527077357777717737775775777777770140040037077100000000000040477770703373772253733704304000071637737373737603104000404000777777773617370744044043777373777777777777775777777777577757477737777717777777737177777740000005753176001000000000000077710007373351273773334304037361603737773773506000400000407373373653773773734040772365777373777777777777777757777756770577577777705776177777577777005000127357710040000000000400077705011340361433071214015730001061733770003717000040000377777765343763770704077344032737777777777777777777777777775752777377771377704777737777773001057517375000000000000000007777001340004373737370033723710360273773173733733434004037373640436777377070773734537477777777777777777777777765777525257777777175754007775717777740070030777700000000000000050477775377310000073773207373376004005336036007256352000033507765060470737737707377772407073777777777777777777775775767775417577777737600017737117777101400573777000000005000000000007734170771371052371337373337010033404017373337253434372040430440475617707777737352507775277777777777777757777775775637777777777771404077777357777003537157700000000000000004340007734351005021050077373777373773700004007177373003737370060440440427603737373777777773465657777777777777777777777565547777777757770000077717777775007167375000000000000000000100577515335701507130036373333373340040400436334307773735300440040060471777777777377373746175767777777777777777777777716377357774277040417773777777710731717700000000000500000040000750072571173053711001067777324000000400435430773373723440444044040463737377377377743475677777777777777777777775375657757777714074000617753537777715731775000000000000000000140006734150163413041405031100337004040400400423077377737373040040044041777777377777737443475657757777777775777777567477777777777737434005747777777777777777701000000000000000000000017737350141741030017521110100000000400400437337373737374044444040773737377737377761674367767777777777777775656757777777777777400405521077371777777777771000000000500400000041043775775214170171413710052177111040400440053737737373737340040004376377777737777752574577575757777777777777777771777777777777753540436040777577777777777100502500000000000000104167527101507006121477105010713040000040007377373737373716444074407354241737737372777772567767777777777775777757565775777777777770714054050777357177777777010050050000001000004707573517040350514140717010711771310040040737337373737376300004016777365347737777573737777565777777777777777777767777777777777777777707016177377373535777770500160004014040000015707777071357300717152503537700103610000337024253737373014074407737374074327771636777777777777777777777777775777577777777777777775353757757657777753777777710143505000000000000420077505357314141361050341510153533000707700500273737043233016773777734004776167717777777777777777777777777777577757777777777777777777777735704777735777777052050000056100000000504573417215614170516135170077352700373373042125377352373577737773737737773534407777777777777777777777777777777777757777777777777777717777407707777737777701050000400014000000050030753751701016153050434037135310137377352104037304250732373777777737737772404406572777777777777777777777775777777777777577777777777777777045177777537777701000500050400073040070577053653507317053171714177534316373373734317304000303737773773737773772444061652775777777777777777777777777777777777777677777777777777775067577377777771070050014000077141017500773141250714705257371304712411017377733637724000404343717777777777377040407440657777777777777777777777777777757777777775777777777771777770572777777777771052500400007104040470077714105073531505346525035353104313523773370004040000340273733737377174042443470747777777777777777777777777777777757777777777777777777777770571771777777770014300007314000010140534107014143560734110505107173117703161137004000004040301777777777776377440641474377777777777777777777777777777777777775707777777777777777777765777777777710014005054000000404007717053430501141416350167125776143535377100000404000040773737737371616525341464077777777777777777777777777777777777777776577773777777777777704077735777777771401420000000000000771752140410716100715371711507010000705734340040000400033377777777563773736442537777777777777777777777777777777777775757717477777577777777777507105777777777700040500004004005271456105313410415351040507170100571050143410024000400017377737371736173777753544777577777777777777777777777777777577677657743477773777777777777057604353553777040170500000000005473116535441710430701313507173100071016110037100400403736337777760416773737763777777257777777777777777777777777777775777756543577777777777777777075070402741470004070400007504071457717731061770415061701161775014014017340336030000370034271730406635377761777377347777777777777777777777777777777777757777756777777777777777777743040057121741405000005500007700370571414141051734140534135301731421410037713005377003001760440440576527377777777777777777777777777777777777777777757777561635777775777777777704354100177717353400050520070577144007061735305301531073417770141040143000000347733330040020406044042437757777777777777777777777777777777777777777777777777775777777737777777777507377770377757771004377750525305335711507535377042561717101710350140053053100003777610040340444004040407377777777777777777777777777777777777777775777777575775657777777777777771777777777577737774005770061775254177721703405171010141712500404250143750414000100037361353044044424404777737777777777757777777777777777777777777777777777777777377777777777777777757171737353577700376107577771034351570514176053416077141301001104141000001004000737373204004400440563777773777777777777777777777777777777777777777777775657757777777177777777740257777577677377357414773777777514043052412511241710535035101070004100711250031003737204044420444243777377777777777777777777777777777777777777777777757777767757777777577777777055614016141014014707617571777777717107113414341530417101430417171300001071351410173714000400472405773767777777777777777777777777777777777777777777777777757577777777773577777770061616140164400071417773531743777777577414341041410716101410000471711400050031007373210400444041773743527377777777777777777777777777777777777777777777777777747577777777777777147141450706100165065675353435357077777701617134301570510700005710040043115004140002405200072407773774256577777777777777777777577777777777777777777777777577775777677777777777770434343070414147707173537753777717177777775353410467313050100053050010000401000015013303504041773777375616177777777777777777777777777777777777777777777777775777757777777777777750541404050404165047171653717777777753537777771711107507170521414070140100007100030077372007773777377737777774257777777777777777775737777777777777777777777777757757777777777777070043434252177165377531353717777777777571777777777173516530570101050101710417104103307353073777377737777776174767777777777577775777577777777777777777777777777777775753771771777057041405057416717171775353357777777777777174765777170253501071404340561013710000073733200777377737777372416477777777777773771777777777777777777777777777777777757777777775067774707143077257771777077137714777777777777777735173477535140407400101000104050000005343250177377737777377454657575777777777577773777177577777777777777777777777777775777475707575735707354145735371717357717371777777771734777777753507777311403140540505010000010002143027377737773777773652477676577777737777575777777777577777777777777777777777777577725707725675747777377775377717353715377737775775735775777777717174001571003100005610007710402007737737773777356165257747577777777757357773535777777777777777777777777777777777757577757575377571311177777761757357731177577173777771777777777777717161035040530001710510000053733737773777376737777756777777777757777777357777777177777777777777777777777777777777777777737753361037717171177335371107777737775357777777173777777717537571001041140040004000377373773777377717773777775777777777777577375371777777777773777777777777777777777777777777775771375113117717177175735737717777577777717777777571756571607573431405040000110000172137373777377436727777777777777777777737357775357357771777757777777777777777777777777777573737771133513137777177375734117371737717371717777777777717505170541401210171043500036373637377377700453577777777777777777777757777334357777777571771777757377775377777577377777357535177152103577777717537537701777571775777735777777777707352052070535050404173037100003737377430464367737777777777777777775737715153717717773777777777775777777577377777573571713117310311313735371773753771177777377537353077777777777775757715000143100130103724000073737700440404407777777777777777777737717734357777753571771753535371717777777537753777370171301711311017771717171717537357177537757775352577777771776717771571077300510733100700303720464040604745777777777777777777757771735353573753171773777735377777537177753751775373015311210313117777377777713517777177537371735352567777777717750773700571412513772300007340040404404524277777777777777777775377573537777357375357177771717535773757777353777531117131731533010717775717117752713777777757577137153177077777777104144353000751273373533700000040640460475777777777777777777777537357717535771521737573535353773775353577771753371713073503151137771731753771371477735375373717712714717577577777310000411410303737373360000004404140474377777777777777777777177757717537773173171717171716171757731073775377357130371753710370177775777375377173175777371757713717717052537177777771110061041737373360404000040466340477767777777777777777777717777737153577177175777713531071717771171775317357171171717711310777737175375317171371757573717717537777050547535777777710171103737375300004000140475253777577777777777777777771777753537777357717735371713171173753537771335757317173303711310117777777377175737177777737757770531773777770107677777525752570373737020000000406340527777777777777777777777777175777371753535371353537573017017315373753177573731713511535370311377777535717733531257353577773137373047377377771505043504005017737200105004000075257777777777777777777777777777173575716357771775353753153717171731353737173757171713033531110301777777777735753571377777753757535350004377377777777140105300373610373320000400527737737777777777477777777777757177773515353571371713773717113035775357173577353537171531437111177777777177737713175353537757337535314000377341273777361005343243043343734000037777777777777777577765777777777735717773617777375373757753535301537135317537317131717131353173031777777777717753716377777753735753530704044204377777377777735004004337333000373737737777777777476757577677777771773757771573717317571737373130121717531713753531053530107317513107777717771775353535377757373571373531000003537373737737773400000437432700137343777777777777777756767775777777775757377573577757137377575173511535313531253713413103113115313711377777771717737717375777375753775173530404043737373773773640040400003352177373377777737777777777757576777777777777357773537777357175173735013301317130313535713177117103710353217777777777717535717377777773775377171700017373737373373730040000404040012337373377777777777777777767757777777777775735353507517317777171373515311717115153530353533503111035211177777777773777731717777577777537534371007327373737377342504004040000037373736373737777777777777777757777777777775773577371731371775317177111321703130312135351313571313503531317777777777757377177777777371713717371521720500737373730301600400004003737373737377777777277777777777777777777777773577357535171701735777177771511353510116171310112131103111353135777777777377177717777777777757735173173700300373732161733400004007773737373373777773747477777777777777777777777773717353735301717317777177373771313135317171731717171313071301735377777777577377777777757777371735341373004003725240372733704002120063737373730777244345657777777777777777777777575775757134353715777777777177171617101137371121130131015353137777757777777775777777777777177535121737214001730000127337340003737003003737730003747434727777777777777777777777777737537371711135773777777717537171711312577133513713171331330757357377777777777777777777777753103571733733732040040613730034373500404373732013344346454750747777777777777777777777537575353716135356177753773535313035111352513711711350171117377377377377777777777777717153737171333773737040000000343430733736300003372000272434707256776777777777777777775777777537377717317125310177771535371715137305313153713712135330707537175775737373777777777737357577357773373700000000040000737773737030370040000336454745614757777777777777777767777777757535735711535317717073537011313411137171211351353531175353757737377757777777777777775737317333377370000404000000733733373733770004004037307257165677777777777777777777574777775373537571373130171711353751371371373571315353125313713537777373757737775753753777777773775773777307000400000400537377377377370004000000000745677725777775777777777777777777777777573537377177517170535353131071511053534331353535710172571357753717577373773777577577675033373337030710000000021237337337337000000404004007165747777777777777777777777777757777777777535777173135133531353571123713353135530353137313573767353777773777753577537437737070073777003733250040021373737737377316000000004000377727377777777777777777777777777777777775353537757171733513175271317151351357133535317111777171717775353777577777737773535753007340030733437300003724000323737300401600000000037747777777777777777757577777777777777777177777717737175351343531152531337135373171313535373707771771737777773717371717177737377733000030373730073771000007373702533121000040613737377777777777777777676777777777777777777737717517757125371353171353515113435353535353313571771770775653537577775777377171657173573400437233070373270000037342503363707000031343077777777777777776757575777777777777777775757737717777135357353171312312513133537173171703471771771637777777753737175377173377173773500005030373373303407340002527373000121720000777777777777777675676767577777777777777777777571717717107135352171715353710513113177161771347167171753537537375757377137757176170773700030737373737373300000043713250727372004007777777777777777567757576777777777777777771753773771731713535317073537131131251347537177175737717777377757777572735717771737717735357340373737373737304000040000605233737215000277777777777777777756776577777777777777777777777771717471753537531153513516113161337567177637571707175717736173757563707173535217537717170737373737376000400004000303773737321211777707777777777777756577777777777777777777537175775313531317777773533752137153175773574175737371717377777577577353575352527535737537763737373737373300000004000007733773737373607777777767777777777777777777777777777777777777777777531775777535313571317113317177577377537575670716177777352537777165753517172516153535717337377034014000400005733773373737300007777734347777777777777777777777777777777777577171753175713773771757173531735777777375734347371171617617575777757016133134361615217277173752737303703000400002733377337733734000777775674756777777777777777777777777777777777777773775303753757171377177171777717175775775174777071717763777534357715756717535125017137343737021633737300404310242337733470000007734241434757777777777777777777775777777777777777753777153757317775353353777777777777735734371771617717577773577357020115213434171257417353535001733730700037700004337733032420075676564743647777777777777777777477777777777777757775717717125777735353777757775752535767577576171771773717777147707152527571007055213735373730061673700373730000033610403713100241450470745357777777777777565747777777777777777775373771753537177173777753777773777776117717717707077175775707370535211357000505321756171617050033030377373600005340002372372006564773464767777777777777777767775675777777777777777753573717537177777575775777777534157434717757717167737737757173531525353410125570716135317304043437737373735320000405373310150473775341777777777777777775747675477777777777777777773573737577777577025677777577777353534357375777175775771616516503134353434121534357434315300073733737333734000400020342063773477434777777677777777777777757477777777777777777567777757777777777707571775777757525257357075776177737177141753713040535251000572515235315235173737773737770000000040004017333775773777777477777777777777770743777777777777777777756577775777577777753675777577737753525707777717753757734004005340017253505035251637512521163033733373733120004000004033337777437477773773717775777777777777777775777777777777777777657777577777757775777777357753747734100775701657370400005341153415343005071071410710507115063777373560000000040000377733773737777777777777670747777777777777727777777777777777757777777777777775771435777757775357534175377751774340000007342161617141000570161710712527031003373712134000000001373323737477773777777777741674777777777777777757777747777777777777777777577777777777777577377177735716107577377775100000014105141707107000000101071351117140377250073733000000360307373737777777777777761765453437577777777777777765777777777777777777777757777775777777775756717563475777657717534000004770506170716500100014303125306736037000007372730000173000003373773777777377777560563647467777377777777777536577777777777777777777777757777575777777735763753535717347777400100001536514175010140505211141507510517340040437373730033270000037207777737777773636561441641773777777777736464756577777777777777777777777777777777777775771757777770755353537500404167536170177710100005250003103712500040000043700037731300003000077777773777747573464344377777777777736753574356747777777777777777575677777777777775377077777577775277747743452525353516156150741410001000304341250040004040000737732736331200000737743777737737377504437563477777774757746065670777777777777775657677757775254777777717717357757535705371757341757765251617275100040000100517165000004000004373773373733120000007773743737707777703737776173437777777737357561477777777777777777775757675777734757777737757776376777775777357350717175071757524050100100052050100404000004006377377373372000000043770377604737377747737374467777370737777725477777777777777777775677675777757770757174757753575357717725257657756756177161613531214015000050040003304004003717337373377000000000743777704061677343737777737173706577777774773773775377777777777777565777777775777277731343777774735771757705770735717056140561405001700041000005373030403720727737377300200000000377700404043714377777373777744656277373737777774767777777777777777777777777777575757574315777173577775075773577571653535257170500534001100400337340003171000013773720031000000077707440442404277737377777340614045077747737777773577775777777777777777777777777777777535777777577765777373477537775256525507414341710406500016737370737234040273370177273040000700406160040405377777377377704607064343777777773777774725677777777777777777777777577536525735771077561775753567525775375707143705376501010400030400373737300007340060335370014137440604454040737737377737434740544144777377773777736161475757777777777777777773777777753416567167707176576757357577777525716141735710040400040403777373737737704004075737203633606160100600437673777773563434042424637377737777777456576706777777777777777777475777777777771714141414753571775737252777571657177525705040004000737337373773340000000020201737373604437340443700047373772537737404417477777773773617252414750777777777777767477767677777777777777777770777774165475757773477377470521400004000433737737737374004040404070737373730100737003737070027742563737717707737070737777477777756740777777777777777757475757077777777777777777574757777737773774161037373073773160000537527737373770034000040000073737373737347700737734043770406177734707373742563773743737371614377072777777777375253434257777777777777770707070737737773777352407740407073237000343600000377361073434004040717373737373737077737373737370000404361773777777356177044377777777777777757777777777777747475777777777777777474565654657777777737373700000007373703173373000037302527373300400030233737373737700000000000000000000000105000000000000E5AD05FE) +INSERT "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(6,'Meat/Poultry','Prepared meats',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF00000000000000733431247777777777777777777777777777777777777777777777777777777777777777777777772577777777777777777777777775677750043507777777717677777776343737737172736373635337373373727300002407477737777377377777777777777777777777777777777777777777777777777777777777777777777777777777777776767777677777775247757777776775761707373737237372737173717377373777363737733477777777777777777777777773777777777777777777777777777777777777777777777777377777777774777777377777777776777767677760104357777775673372737373737737373737373737337373337173732407777377777777777777777777777777777777777777777777777777777777777777777773777524000000000000004165777777777777777527750435677777773734737371737373173737373727372736334737337377777777777777737777773777777777777777777777777777777777777777777777777736140000000000000000000000000040507777777777777770041757777777733737273637376373736373737373713733737637777377777777777777777777777777777777777777777777777777777777777777777734000000000001404160746740040000000040657777777777775241677777377737373737373373727377373737353773737237377777777777777777777777777777777777777777777777777777777777777777735210000000044767773777577353777777652040000043777777777774161577777737725373735367373737317371737233373737737377777777777773777777777777377777377777777777777777777777777774371600000006177737534247043414747416171777737000004077777777770043777777773737373737337371737736372737776373733737777777777777777777377773777777777777777777777777777777777756370700000004577616506461407404740043406060407437760000005777777775241777777373737363737737373633737373733335273573737777777777777777777777777777737777777777777777777777777312777700000407773052507005040400000040040414052525041775340000537777775340777777773727373731737373773737373757337373637777777777777777737777777777777777777777777777777777753434777000000077757047040404004000400040004000404040406524177704000477777774177077777377353772773637373373737373237737373733777777777777777777757777777777777777777777777777437243772500000477725242404000400000000040000000000000400050412407772000057777777407477777737373337337363736537343737773373737377777737773777777777377777777777777777777777775373607346750000047750404140004000004000400000400004000000004040443400577700007777777001477777737277737737353733637373733377363734377777777777777777777777777777777777777777176372577747770000077725257040404004004000600606070745424040040000000400561617700004777777403777737737337337173737737373727771325373737737777777777377777777777777777777777763617253476347370000067745040400000000406574757577577577777577777704000000040040407770001777777754777777737537727372733737373733367373657477777777777777757777777777777777777535375361767356776000047710343400040042456535377777773752713637777757774000000004043430770004777777037777773773633737373773737337177735657727377777777777777777577777777777773537270365763565252710040775644040040042457373765725730577757757577577777777640004000040450776000777777414777777373773737373172527536725727373577777777777777773777777777777373436071675364743363770000077205340040006577707161775735476177343777373776773777740000004000434170400777777434777777373373737363733736717737776563477777777777777777777777770325253437767164733256577400047705404000004753520712577073527717707775252572537575775774000000040042573001777777057777777777373525737747773770771737373777777777777777777777352137563767743706733565777700007714742000407573672171657617161753770773537357357757777777776000004004050774000777777077777373716373737743737167077273434777777777777777777737716376562570752743712567776776000477600144000256171353435753707167370753073435257743727737777577400000004250376007777777007777773737477773776577737717773737777777777777777750730707077576772703725777747776700007705640000057177071253437617343572534771717077717353531653737777700000040040577005777777757777777773716577373727537772377733777777777377301273472777616312171774777567677770000770561040004347712165617561340177353473563435752717073431307171777400000004340370007777777077777777777673635365373673757773777777737163434767747374161631676765677667747776000077524004000534712161731347317037725347172153772710725343574716167177500000404004770007777777517777777773777777737737377337377377777727073777706347436373477777767675767776570007700534000004716774352164357075053534363717257713770125352131616107037600000000700770057777777657777777777577737377737377737375337164177474617716303434767675675675767577437000077564040400034353316171356371237773057170717717703073527074777777777757700000050601740077777777727775757477777737377377737737377727077607273630716777777577567767676747237760007702014000004770774317070757071407307277353653631717143577777777577777774000004041403700577777737575777777737577777377163763576374177670734307076657677676777676775370737461000570655600000061177130707165217121770775317075377143434377757317177775777770000000040477100777777777777777773753777737737771777735777601271616777777767477476767757363437073770007341600400004576174353160177707525371737613777316317177777357736134361677770000004161077007777777777777737170300777735673773737777670761677776776567777677776567347163477477000477041400000037716334343170537103525356535616357316167770537305070537171777770000000040077007777777777773507140500777773777777472731271777567475656776767727037352736752707630043707560400004547357435252077416343036373721775325217577072534373172534361757740000004340770047777777773052500100005777775617617357761677676777767777656350343761674775274731400074040000004056371753121735701735171715717177733535773713535215257053437173773700000404107700777777775705210434770007777773773777777777577476767777257316377341765770725321633041734304000000775772765343521763532070737677375343436570761253725217343107252577400000042407100777775210705070057750007777777777777777676767777652707306716407665361635325333700077054704000007525351734303525172553035253534737353577731743071717053167153173777500000141077005777775615250575257770007777777777777777477773435270724735673725326121633736173000734214000004756572737571613472573257125777273171257713430353521613707316361616176000040060530027777771614377725437741017777777777777767774347361437573467342530713373361337300067425400000401653715257303425357705302537717577617776161735252535241736534171737750000004106700577777777435477752577704777777777777777773337325277462567134312733727353373733400171443404000741745635217753524735737171637773713777717161435353431360512712073577700000004217300777777771603577743077700777777777777774346164775637572126127373633733273370733006721040000000747375735250717134731707031527565703757725363434361655372510717073077400004054075007777777775743477747077750777777777777337357736473402163713731733573537316333700017547040000051617436525377616571743717563577377775737170153537171325052070707147375000000001720077777777777051777705777005777777777776164625653343337373373273273233633737373004770605000004060471753752171770367125752317777537167771617637053436503735371737335700004007427100777777777777476577500777007777777777757735733252373731327337335337373523731734007701424000007147430743717071755707737357707777777771721613537073513752525252525777000000401437007777777777777053577614774047777777777625620707373361727336137337335333731723300037525004000007057717147677072705353434375735775775375717617073527703717173533521774000000400730077777777777777456777403770077777777775733737337353733731737327336336373723737300772434000000447675637717177153652757737073577777777737731743577170750707052503577000000402407500777777777777777251777147770177777777720703333613273363363733732533735233371730005705405000005357177170743416365351271577356377777771653565317217371273735271777704000000050532007777777777777775467776017740777777777737336173377317317331271373373333537323700067007244000004776574173577355734777172357375357775773763737635634375353435370777000000404002710477777777777777777147775077700777777773333337373337237337373363373072732717733700177141000004034717372532516375734352541257377773777777177535735735271617070777740000000025057000777777777777777776147774077704777777736177336374337336327337373273373373323173000716064040000473617577053617527757773375375307177777177737773734377173753777175000000000404330077777777777777777777077770577437777777337333713333631731733633137337317373737270043705500000004775776175301712557765357432525777777777737657257537707161677577770000004040033400777777777777777777774177770777077777777336363377373723733371372735732733631733320047406040000005723573077770353253177273573737177717777753735363753777771777303400000000050471007777777777777777777774077770777577777733713372336173732730373373323733613732737300017014204000025707170014774353043417753575777776777777777777577777777777774353000000040403700477777777777777777777775077743777777777363373173733371373737327373731733733733517000770605400000477716527021775707353771763736573535357777777777777757317777530740000040020070007777777777777777777777770577747777777373372336333536336132733533163363373363172270004350500004000571205710170120775735077170717253777771775777773707374775743070000000004507100477777777777777777777777770777773752536773177337363733737371633727337337343136175370005704244000000775207770052501030437177777777777567777777777757756177777352500000040400071007777777777777777777777777777777763777757336337137333713337333733737137123347436327570007705340040004375301772102161430525071717775363717777777777777777777352017400000002401700077777777777777777777777777734373577777777337723635363727127373731323612547323575716300053404044000004770707170014121043035377773537577777777577777777777775251700000000450070007777777777777777777777777370777577767727337133373337333733737300272561252361756363637400077007000000005771616570612525352527753777777777777177777777777771725364000004040007100677777777777777777777777534777776777353756723673353633773733030735073076777776777735773700437405604000004771610771701020353717677577777777577775777777777773537100004000404370007777777777777777777753736777777737257777773373372333730312163434261677353535737775777773400437005040040000771630777775753757617537475777757145735777777777777774000000400017000777777777777777777773775777777161757777767773353373733437256143737163534372737573777777777000570524140000045775771614361674217343563777777534735777777777777714000004040407710077777777777777716353653677753437776777767777372334330343704307234256352737353773757377377777000770416004000007777577777577535747773757377516043577757777577753400004000005370007777777777777777777777777772777777777777777773373336161720736714737357737537373777277777777777000572407404040007777775777777773731777374777753557577777777757741040000650427100077777777777777777777777473757777767776777767734334072525734716300077371737737353773735777777777400353416050000407777777775777777473475377753502537577777577777361040400407710047777777771657777777777777777777777777777775337336137252721630616737717673633437361773773777777777040770407060400057777777777757777753777575752757757777537717775004161400771004777735256161352535777777777767776777777353637474072725256163073733752773317173737737177377777777777000777054142400077777777777775717777777777175535777536575757534704142573100776150505001050041430375777777777777777257677777737253525236177173477771353737317131737377777777777777400177206414240047777777777777777757405147537777716553577777405256053700007150000000040041001414125377777777737177777777777725207337177372373773777353014307471657075373777777777424057516414340000577777777777777000065217575777616757177707074017770006500000000000010000100210525275777777777777572534333525737373337337377371301201637737373737725477577777777500077701654045042525743452540500400534577777775751777750474057770005010000000000100001050215050105177777777777763773737707333707377273773737525034373731737777771513707757777777740007774006524004000000000000000007507357577771777754707017370000100000000010000010100001000030712107577777777537377373737373736335370343533125373501434143113170755757657777777774004377500416504040434000000000043565737777742570525405775000040000000000000100000010140121411053503177777373773237373707373737336172777043731003471077756740010217717777777777777004137770416165240404040400400043575757775756164007773000141000000000000100010110010100501421052507177777773775737373737371725616252127530047741647077657777435005775757777777777400407773404054165210207040404247177777534004537771000460000000000000000000000001000010121143017107137737777373727373730636163735717753057777064704775357477706135777777777777777740000577771600404444540525041404757752407573752000447140000000010000000000101010011410416105710713577773737373737371671437170763653007004374014707764652574404431577777777777777777400001777773500000004040600000001757777740000477740000000100010012011000001001000121103530171053117777773737330631637436370343743704074774060565735656571606470757777777777777777774000041777777776716350747777777725000004477777400000000101010510010350101041034143501537171070737737773737671477073616177770340416007706560077440617764040435377777777777777777777440000004161753757775352507000000407777777700000010110121013013525201705103501210712507071171773773772731637212525777777075000610477040056775775776504746475777777777777777777777777404000000000000000000000404777777777770400101001201010701210111171013041035070351717127147777377173777077777777777770524041470775076005761474756765777677777777777777777777777777777765616442406146567477777777777777410010101010101010105112530172053171417155071717503177377737373212577777777777735004200420764054065767470757776577771777777777777777777777777777777777777577773577777777777777734010000101010000000000010035153101731713071352513543777737737377777777777777774360404041457704204074543474765677656577777777777777777777777777777777777473043547777777777777777410001010000000000000000001403016171071653161717752177737773637377777777777777735040004160077004702524246056565765656777777777777777777777777777777565173516170034173777777777771000100000000000000000000000105010001711317170735017737773737373777777777777777470040400070774000404004147677775777775777777777777777777777777777777777052710734537575777777777771014100000000000010001010000001061520343435353537017773777373777777777777777777354002404040770400474256157577777757347577777777777777777777777777777777150705010527771775777777775210100000010100001000001010001000140151435357153073773773723777777777777777777004040016016040040005057677757675775734717777777777777777777777775374347070034273417347777777777777530000000000010100010100201601014134303534307705374373173577777777777777777752400040640404004140524775775775777535553575777777777777777777777707535712016531750774737377577777777740001000101020014010011101125030411753411711077737567777777777777777777777712404040160404424240534175376175357563743525777777777757777777777000473417013400301717574577777777777775000300001010010014004004101413061071701077377777777777777777777777777777752400040525024141700434165757075347577577577777777777774777777770071403016701250077073737707575777777777700170500410010010101030521615171307777177757737773737777777777777777777300040000406502524141435716175717537573743757777777777777577777025420350011077006516174771777777777777777750010011041043016161052141034377777777767727777377777777777777777777777174246740440750050343570717521617757575757777775757577777777777503505000000734717217717577717777777777777777161000100105010105214377777577773777773777777563777777777777777777777014777777700050304101034161755705277777757777777777716377777777740300000401413714770737057735777777777777777777770716125252525777777777775777773777717373777777777777777777777777125777777570340102407537161617775417577777777777777757077777777104034000720407217714717365771757777777777777777777777737777777777717637737737757357777777777777777777777777763536535074752050014251716757173565777743757577777777777777535777756010010037053505771771657717677377777777777777737377377777777772536777777777757377777770777777777777777673717176777034347205007061125071307545773777775737777777777777777773777703400007041272125367165341773575777777777777737777777777773773777777377777377377777370777777777777775253747776776777735075703414104025347753731757357776577777775777777777757777410000171005714734177177743577767737777777777777777777777777777777377537367777677347777777777777673677657776773717074777714710034375373312301610307707577575777377777777777773773474040061730037716170773776177177577777777777777777777777737773775737777777673577777777777777777577577777253475677777767771067377337107351171310110713577777775777777777777757752100000173407750777077357717777737757777777777777777777777773777377777771735777777777777353673676772763617767767776776573425736530712730303601013031165375777777777777777777777605200716152570177716534777775177577777777777777777777377377577177777773777777777777777737777577777773757657777777776777571773533377731713101173011103125375777777777735777777777005721712073706136173525347767707737777777777777777777777773777777772577777777777375737777776777437477777677767677777776077373563167723010767753031101134377777777777777777777777701703417161177417761777177177077577577777777777737773773777777253777777777777775377775677777777777777677767777767717617725363353713111771110101410310135357777777757777777775770340147350167701673577707737777757737757777777737777775777677377777777777777277377777477177437776777767777777371716761771737135361774765213031713371431016777777757777777777777774034217236530777143761772577177377577777777777777777777735377777777777772737167767167337677777777767777767757677777343737037635330135771011101215073537353777777777777777777377377041605753053770757177752577757707777777777777777777737777777777777377375777777577737477776777777777707777677767675775277717325136127773012115301102114353777777777777777777777777353731257770177307771777073777777777777777777777377777777777777376377777677673725777777777777437777777777753717327537177735373517157741311210125311613077771777377777777537777735671477730077716571277717757777537777777777777777777777777773717357747777171765777677777777777776777770737363737577373637103016330371770121313530567101777567575777777773777377777167301677716377347571773437777757777777777777777777777377257677777773737777777777767777477777777773373437372733735253127353710534371353101017713533125777777677777777777777777777716771771617771737077577707777777777777777777777777774377777777677365777677777657377777777777353743733737173727773353530343773135161253531277030103527777777777777771777777777777717670777741677525723757771777777777777777777757353777777777717347776777777437371777777737257273737773737373577716303771717170121311727031731135312577777777777771777777777777777771771717377177773577377577777777777777777773727777775763527777777777777373707677777773477737373737336373737377331734770307353177163513177503031253777777777777177777777777777777777072777716177177057777777777777777777757377777777277177777777777732537347777727737777373737737637773727373343523131371307773477353703437313431477777777777125777777777777777777777570707777167777376177777777777777737377577777477377777777677637773657777735773477377777737373737373737367373561343071703477375301713101713167777777770125777777777777777777777777773752537171777177777777777775737777576777773757776777777735737577777347637777377737373567353737371737337373316131371173773537730353330350717776101577777777777777777777777773737775377776772577777777777753777747776777352777677777773437737677737776371777377773777773737373537373537735335731352536313572163531234117077771717777777777677777777777777777777777777716173757777777777773777777777737737777777767777377752777377761735777777733753737373736372736372733363730525373535273173173435137253677777777777753777777777777777767357777777767777577777777777753777767777767735677777777735377172757757725377777777773773773737373737373737373763731731125737331343152173727101057357777777753777737777777774377377737777737177777777777775637777777777737177777777777737736167777777361777777777773753773773727373737373737373373727352112521637336377353116167777777773637777777777377773777757777767527777777777777773737777777775370777767777671771707777777572343777777777775373777373253735373537353713735373736377250575350531710705617377377376177577777377776573577773777767737777777777777772777777776777377777777777777376377777773772357777777777777737773777377373727363727327363736373737337333016177161071737777776356177773737377775373776777776777717777777777777373771777777775377767776777775277717677773752177777777777777253637373377377373737373737737373737373737317373737074377777737252177377737777756717377777777774734377777777777777275271777747743767777777777776375347773770743777777777777716357375777377737377373737373733737373737073034725616527377434361617377733737773737373777777777373737777777777777773707377767767373777777777777712717277736577373777777777777713737737737377373777373737373737373737373737377773773773737773737373737773777737377777777777777777777777777777777773777777777777737777777777777373777777777773737777777777777373777777777777737000000000000000000000105000000000000A2AD05FE) +INSERT "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(7,'Produce','Dried fruit and bean curd',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF0000000000000033273373337373373373172177765677143477212657777776567776777777747077777777777777777777757777754757777777777777777777377777777777777777777777377777777777777777102136770007770000373373373233373373372173613777767773617717725777776777777677777777771777777777777757777777707746757777777777777777777777777777777777777777777777737777777777777752412576706033277337317373737237337373303763470777675672730737677777677767777777777777777777777777775777740447575677777777777777777777777377777777777777777777777777777777777777771252637616373333733733373333733737337373137377565777574777271756777767776777777777777777777777757777706070047565477777777777777777777777777777777777777777777777777777777777777777701043777337733732737317373373233737337375236377276777617677374347777777676777777777777777577777777405771065772577777777777777777777777737777777777777777777777777777777777777777777300333733732733737237373173733737363373535275752777775367377774777777777777777777777577777777404177774065746577777777777777777777777777777737777737777777777777777777777377777777770733773773373373733273373773733373373733123375656767574737377767777777777777777777775777406546746750074756577777777777777777777777777777777777777777777777777777777777777777777773732333337337333737337333233377377373737734373777776777477737357777777777777577577777560654257757750475656577777777777777777777777777777777777777777777777777377777777777777777773777373732733773337333773737337333372733737343707777777616577737777777777777777777760475604047770640465756567777777777777777777777777777777377777777777777777777737777777777777333337333733733373737633373737337376373773737373770776777777777777777777777777777770045253404047475240434756152767777777777777777777777777777777377777777777777777777777737777777373337273373372373333737337237327337373373737377377717777777777777777577757757774040404645256561764571656747671374767777777777777777777777777777777777777777777377777777777777737333737337137337237373733733737373733737373737737737777777777777777777757777771404250041435614044406774475475277635177777777777777777777777777777777777777777777777737777777377337273337337237337337337273773737337373737373733737737737777777777777777777777642404040040404044000447770477465635267252477777777777777777777777777777777777737777777777777777773737373737337337317337337333733737373736373737773737737777777777777777577777741450404241000000007440777770475747475257353701777777777777777777777777777777777777777777777777777773333373337337337336337337733773373373737373733377373773777777777777577777704067000014104000000740067775740474747765624721676577777777777777777777777777777777777737777777377777373737363733733633737373733373337367373737377377737777377737777775777777770474757645650000000444005776563704657452777752567312047777777777777777777777777777777777773777777777773373337373273733373337333727372737337373737737737737377777777777777777774052474775347050100557000477757447750076544347772524677300677777777777777777777777777777377777777777777737367737373333737377337373737373737373737733737737777377377777777777777006440424675747446577604077774607446774476564342477717077731257777777777777777777777777777777777777777777337333337373733733337237337373373737373733773773737377777777577577777404704250450476400247400407777405440045704056547707047677404673025677777777777777777777777777777777777377777737377737373273363737373733737373737337377377377777737377777777777400474040405246750045404040757040640045426504674763736342567773447312107677777777777777777777777777777777777733333333737373373373337337373373373736737737377373737777777777777740045404040464144244343440577644044040060456714074454775256347477256256313077777777777777777777777777777777777377725213737377377373737273727372737337733737377377773777575777770004061604040564044047440777740040000444040444654565275677365267347356346243066377777777777777777777777777777773333737721235337333373733333737373737733773737737737377377777774004240474104340404004750775674074004140000040407706565477767537124765674716527135677777777777777777777777777777725217470773733733777333777773737373733377377373773777777577774004414043414004770040047777465047504070400004074757744656565777652532126167653652463150767777777777777777777777777737773773470723730337773333373737373777737377773777377777773400004647751000004740000467774164074000500000007404777714742567677777656116347747677167273705777777777777777777777777470163573777561735323577773737373773373777373773777737777740434004041601000016400005777704157700414000000040477777604756565677777776617307247167734203630357777777777777777777773777743675273776727173333737373773777373737777377377777740000470004351140004440007760746576770400000000004077777775504654747676767477765325727756565743070727777777777777777777163572777437577717777637753637737373737777777377777777770004047416405040000400005774054056507440040000044424777657652447565257674767646777430347656376347632531677777777777777777743353437777252773537656371737777777773737377773777777000000507471401100000400776140424075600770040004000577575750657006565647765777776777777737274074771643673134777777777777772777737125277777476777377777737377373777777773777777777000404404743400004000477547465140005405640044000477764774250756506565677767776747677777701277160677743466330147777777777353473777737132537777177777777777737777377773777777777777000000040040004400057706704100000561404040000457760536047740640456474767764765677676767761216770043777114636334176777777737777373777777771777777777777777777777773777777777777771000040004050400047777444410400004044000000057671457654565340477047474356777767647677474777610036764647673652437213677773773337773777773777777777777777777752544644647777777777771000044004770004774340007410000400404250747775440675000044000477447437271667777765777676777773531212716471673707243177777377777773777777377777777776756040400000000000657677777776000004000400177454740001000001400404777777737400770000040404770567473475375677767777656777767470712616674747657343063337733773737377777737777775250000000000100500400040147777771000040000577407604044140000070000077777414440475010000000077774047747276167347767675675646767677251213434717274767377777777377777737777777765000040500725656572571414004004537770000044716565604500401000000404005777750640057105000000447775704776775616735636567767676777747677767343732667477356733776177777777777777775000400070775777777577677777525000405770000004774041406470700000070004064777740040247105000040777770400775677671663570747777676777747477774761617136346657777377373777777777775000002577775774757776575656757777741600570000004704040414040500000440005074477140044041100000077774400043737765675743632342771656766767665676767616137353676177777777777777771400007777656565777773577765475647577774140470000004042407404400000040004774405676564004100000007754000007377771777767765656353077674777767567777677776530343377377777777777777040007774747775777757056175357640757675777701040000004040447340050004004474040065750400471000004750400007777777777070756565361607603436747776677574767777677337777777777777777740000747774145770775311110535375744654567775765000000005040047740400404034074161440675040044040757440000577777777777776372765677761743613716777676776576767464777777777777777770000777744776452577525343010105071741650575777777450000040400440404000004465406560045640040000777400000067665677677777756753774360767253652716056776776756777776777777777777777000177543474453457757115115014100165665676565657777000000040040040000474047500040045000474004757400000054745064040604656777674377574707675247273734677777677777677777777777777100457756744045657775315773701211400157575757575777777500000044000007577404710400005240043777574340000747664646476474464042407777406373465436734342437147677656665677777777777774003776054656161657775771775351521014377777777777565777740000004405047473404400000044160447616504000044747475675656476566546404467770437327657474773432737167657767777777777777000577056404047577757735775571353510015777777777777775777710000000777407446100000000074400775404000056767656674664676474566474424064776035307276676567476163437277777777777777740017747475675774757777773430014116171077777777777777776757740000044750605014100000007040475040400047747474656477475656666747467464046475727307135256353617253617477777777777771004770747477577177777775351117113105105777775357757377575777700000004740560400000004754707504000005674767677777767767677574746746546400066435332523725665765670723030777777777700077775777177177177777775071010141107127777777717777777777757740000007704071000000414604740400004677777777776767777777767676774746656464047663733703071725661671747677777777774007774775777176175357777711075531305105577757175717577777777777700000045704461405040405714400000777776776776777776776777777776767656656474040561733373030721765467253677777777700177577777177535377777771035312150110127775737370753517775657577740000074400040060407740400000777777777777777777777777677676777777765665646044642737373372163127345765777777770047757771717717777577777701515715310300577777754153534775777777777000000470004004047754040000777777767777777777757777777777777767676776566564600470733337333312525272567777777500077675777735717573577771103031710514100775771731356571717775775777000000040040405777400000077777777777767676466656747477677777777777676566564640463737337173733321252777777777007775777535707773577177761511430713012102777775534317775635734775775400000470400777540000077777777777656404405416414707407460656777677776566565604460737033363737373303777577700077577753771717577356177530161151715351057535773515777711577475777770150000405777400000077777777776400441753777111373511701454206467776776506746400452337373333233337337777775004777777775075777375711573117111214311110777777150377717077775777577704770000044540000077777777764004167377777710535751305157335501044677776640656540663733337335373533777707770077757571735717575777771056111715315707017717157357753471757477167777700770000000000007777777764000535357737773131173315121717533757100406777746066400473372536333233633775077500777777775701772535777777157141215217500007777357777413575357477577577505770000000007777777774014171717375777771121753121525733513317711404776756164640407333337337333737770770007775777531771517573577777731315131530011075777777773777307777757757776007770000005777777760407773131617737737131113351151173153051713771004277674674404633737333733733377507700577777717057053756357777777141717077501000177577771715715757575677777750577770000777777764053577115171353777753010377101217351313131353177300467764067404373733163352337770077000775775771317161715777757757170717537011100177777775735777777777575777700777773477777777412537177312135357377331111311315353311511050117357710007777446044333277373337337700770047775777575017571777715353757175753501070100577775775725771777577777577705777747777777440513537371117131335377112117311130357131311317153737737004767065044373333373337377007700077477757353573577775121514377173750351010017777777777577475777777757775077777777777740713712575730311435137313111035301115331011011503717113535006776442407373737273733770077004777777775357757777531510135757775357507103777777777777353527577577777704777767777764171371535337111131303531713013131134337113135303171701711777000767640433372333332377700770007717575777777777773010034131777777773101157777777777757504153777775777705777577777517371113537737312531713433111015131111517111111153531131537377500774640673371737173377007710077777777777777777751711010415377757575177765743577777773534747777777775167777777744357371703111171711311111053131037121303131313012173111103577373700677440173373333373770077400777577775737777777131001011205777777777770171715347777741417175777757760577777774173735121153737331310121101316113753111151111011717310301773317577104767046373373637337710771004777777177575377750100100501577777777777417501534157775350747777777777157777777413535737113131101171113112111111353735103134353131311111173115353777106764413336333732777407770007757575377777777171010013101057777777701777701010015735250153757757774077777734171733713141053171035317313134135371773110113713535312103171301353777107762437337173733771077740017777775075357777171001075317137777577577775340311025775340757777777754777775431311753711313111131131357717131031737777131713773771111173111301353777006740437333333737770777300077577177177777711101005315014577777753777530111400537534110777775777417777743535371371731111210113101373311111173573731713743157131107111311535253777007643337373633377747775000777775715257777170101173503173777777377710153701300753515257775777711777770311317137373110301131315377315313035317353121071317337101311301113131757775076073732373373777377771000771537771177777170053510150157777775747105341141101773705357765777647777541735213530353311110110131117331111013737313513135311577717311312134173777770065233737373377775777770000777575756177777710153100050357357761710717101370065757165777777775177776171313533171353313131311073717121313103533512153535313777771211115135777777775265233333373377777777700004756377375757771753010010315375775110531717161517737357737775777507777705353531353131311317711171113731311111353713111213130777777771130537733535373700703507173373777777777700005304735171777147710105001435047137351741410117777575737575177752577770537313131211312135771103105371153112131331301137173535313131131013531151317577146742333216337777777777700004004577017743105310111011161077505301101014357777777577767777741777543717135171131311037771111301173313111101711112113173313110131117773171314317177106374247313277777777777500004000537417101005710001071540473525357100017761775777577577775177777013737133133111311717373011131153113131317313117373111111311010177113110715377537014377342061777777777777000004000753504110771011353561317751050012177757175777577657777507777701713533113110311173737111131013110771101777101735313130110131137713510351351737770673434356167777777777777000040004775311657170777410110477777535757775777107777755777764177777071713435311131013353537301011311053713377353537531110113013113571713135135277577700343473616377777777577777000005000617571777577751757751177777777777777057753576777775517777741313531316133171353133531311010101373735317337773111313153117077731105137135173777506363061617777777737277777400061000425655377777701777765777777777777757053577557775700777777525713153131531131352513531311010153735737317135371301113353317777735317175735777777417163563607777777777536773000057000441657577771777777104777777775774777770747777560577777770533171317133113113113170171031311253533135313135771135271315351753531737331737777770277352341677737757777771775000007500044753771417775750407777575777577553575777716153777777437117125313110312101353113017125135373717131351177313131101121131377373511153575777717737735373777733777777777737000000771004465753507770142407777371753573747177777450777777777477313111313531111171303111311130117371335311301257011131131111101577711312110313777003733333377757773437377777777140000577300042571153750054465775771770541177777040177777777750771713131713131301131153011311110335371313711311317131131011213533771301111311141777433777727333773373716777767777300000057535014304351005243543477474071777777404177777777777707113153101313101133413111301031017173134311311131313512131371353571311110130170113501373733737773477373737177775777740000007777535011000464444644450517577775040435777777777770771353317130113135311311301131101737317331130103535353335317135373331112533511113577127327373333373337273737253736777735000000477777735315141615353777777770404001777737777777770171315213135311135311211310101317317311113131317737335317135131775112113513737713174007134377377377737373737370735735773700000004057777737777777777777744040005777777777777777561335313517131313131311311131101775717371311111777717135313131577737113533511535777771216337257337233737373737333723527377770000000004056575757474440400000017377777777777777777057113153335353501773531031113177573313131310177731131131716173777713513101313073777007634605327737377373737373773773372537177700000000000000000000000000567777777777777777777770731705315113131357773113105311577371311210137773113103111177777531311311131115357770773561362533737337373737373373377373736371773521000000000000041074777777777737537777777777704711131336317111373535351331130375775311131737353713113121157777131131131112101777506167374356377337373733737373373373737373727777777770707134373777777777777777777773772577777707731141111113017777331011170117131177375777531313713113113017737171161135111101776072525276377337737373773732737373373737373733077777777737671777767777777777777777777777737775077713135313111357735171371131433531357777713105111135311301057713131113533530177717352527525237373373737337373637377737373737377307777777777776537373777777777777777777777773770477713111310131373713011013113353101771337711131213733131111377353537377751111771477777352161737337372733737333736333373373737337737077756777777777775375777777776777777777777730777353301531171171311317311317313111035110353111110177531301577737353531377777770777777777373373737373773737733737772773737377733737343773477377675777737777767777777777777777714757353131171121171711111301735353313131311353131131037371107777373313110177777477777777777737373737373372733733733373373737333773737370347374777776777773477777777677777777777433735317133131113131031311173573311111131111317131101353131377735311300115777750777777777777737373733737737373773377377337373773337737377333433073777777777737377777777776777677057131713511101017131110173373331731307113010731711311173537777131130111217775277777777777773737337373733733732337337337737373377733737337373737352352777777777777777767777777777037531310313110217131313177171731111137311111531311121177757733131537311777765777777777777773737337333773773773737377337337373337737377337373737377373437777777737777777777777775013535311110111371711177373371373107173531037171311110171317531031777711777077777777777777337336337773333373373737337736337376333737337373373373337373734356777777753777777677760713131131010351131373717171331113533713101177317131131311113113177531777707777777777777777337313723337777337373637733737737333773737727337337377737373773735775777777343777767710771717113135303513535313173533313177131137577717173531521301315737777771777777777777777736336363163712337737373733773733737373273733733637736333737373373737273677777773737777740773717353731713103131353113535371317713512577717173531111101337777777747777777777777777313777176163737337337373773373733737373737733773337337737373773737737353736777777771767760753507353531113107171117103531371317773713577313537135311105777777770777777777777777776363737777752527316737373373373763337373733773377337733737373373733373737171777767767173100753535373531711131313311113171131135353151253111107131131137777776577777777777777777777177476377377756733173737377373336737337377337333733377373727737277737373736161757777777400711535313121107135351130107313121777315305351030117353113577777717777777777777777777737737134347777373567133737337373733733737337737273377337373733737333737273737373637777677700773535353131317131253131117371111375311311371110017317101777774777777777777777777777476777773725277777376753437137373733772737733737373372737373737377737273737377373752735637740771311353111317131311101017331307737715341351310017131137777077777777777777777777737137373737737167737735273327237373733373733773737363373737373735333737337373337373373433477300777131313053535351353111735310117771701315331101617135777547777777777777777777777777770737373777373477777756537430373737373773377373737373737373733773373737377737377337373307500477711111301313131311333531311777173171537110101777777540357367777777777777777777373737677577777377347727737473774343537373377337373737373637373373357373737333737337733373733730077773535353711171310573711113777353112157110077777734376347377777777777777777770733437033237377373737527773767377727032353337737373737373737367373373737337733737333777373737370006773131111353011131713713011777353513773110177770457436343436177777777777777737677777747537377777773716161777773777757273733733737337373737337363373637323733737733317373737371214375313531311317565351311177177311357775377700063767757777716252773777777773437716577372761716373777737373436747737725252173373737737373737737373733373737363732373637327332737000435713111131537773121013777753535777777550475353617676777271634343434777777777737074771772737373737377773713707477777777072373533737373733737373737337733733377373337337373733730000757777577577575113577777777777776740247677761707375675674777616732617716577777370777777747743477373777773737343773777756172733737373773737373737333733773337373737337333737373700050577777777777577777777777777010747777677767765271671676347774770727737777777773434743737373725361737337773777074736377252521637373373737373737373733373733733733737373373373371240441675777777777777735614045676777676767776777763434354776076576577777777777777737377777777777373777773777737737777777777773733737373737373737373737373373373373337337337337337333161434565747475656561616377777677777767777677777677637257777677777700000000000000000000010500000000000092AD05FE) +INSERT "Categories"("CategoryID","CategoryName","Description","Picture") VALUES(8,'Seafood','Seaweed and fish',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E5069637475726500010500000200000007000000504272757368000000000000000000A0290000424D98290000000000005600000028000000AC00000078000000010004000000000000000000880B0000880B00000800000008000000FFFFFF0000FFFF00FF00FF000000FF00FFFF000000FF0000FF0000000000000021312121001212103012101120511213001003031000000000001001201000031434130127125003036131617112161707121633525212434101612140103000000001000010000001000000000000010000000000000000100102120005212143012525002070011030101770000000000001001200070431030521125306171134303436170643125351431717043523421052136001002010020100200001020100010000000000000100000021310316114104031050307010303401035203003073000000000001002101000031071430161771407072535353717341752534363761634352153525252411700000002100000100000100000000000000010010003000100114211021201343030103430100312121010301710000000001020010001007007021316161302717353434371734367377371717173525257616137171360000100104002100007000000000000000010000200000100316211203104250103016101125061614121201437600000000000103003004101313534313177500717373535773534717535377777174071301216516165170070600030100000000100000000000000000001000000014211251007100212107012306121001303410301371000000000000001001006124252134343137437775373737777707737775375377370477777532735327124010100000001000002001001000000000000000001000211230303112041352101214130106121071211037500000000100010020102043513353437177703753737753537773477777377737537563010103471634716412520210121020001001000000000000100000000000001251014304204120016125013016001413001243772000000000012001012054303614353717371747377777377777347777777777777756357777777177171610252141060000000000000000000000000000000010210130303030311006171212130305210121341301317710000000000000120010025351734353777770777777777777777577777777750602004000000016124371675252161010410002010000000000000000001000000000014316100253000125050030301204120300341377000000000300100121034070361373753777377777777777777767672525004241447420704046004100400435353070212000400000300100000100000000002100003030310351204352121217050341420150350337770000000100010210103007171375357377777477777777777752705464464604766640446464644606460704024347125001000010030000000000000001000010003016100021021001214130103030120013021037577000000012010010121610657375737377777777777777774040644466567600406400040006000000476746424400212534120430000000000000000000000000003000310313521705241212016310161003503143533770000014010030216101341735737777777777777774740404647460406040042040004620040000000440240467504040025000000000001000000000000000030000000021001001200214316110701030402143031777700000212010010107161347737737777777777727000606676764000000047047640000444644640002040000466464040020041200012000000000000000000001010013523121311041310112530303042112035373770000001010201034312170773777777777777600444664404040070416000000750000000000000000046400560000046744004200001001000000000000100000002000001000525060120430612011610015217135377700000520001121011071737777777777774040476767400000206400640425675200000000000000064000046440000046767400101000000000000000000001201010043121312121124131031215201216025125371770000024012120161637353477777777770464676440000700004740400777777700000000000000000007747600674640000446740002000000000000000000001002000000520012121006030011211201007021317377700003070010121311717353777777524476777600067046404006730331777716101031000000000000047777704040000000044664014121000000001001000000100421312113041706011413705205312101350717373000104030120534371717347777444676460420000464006421171531537133131313133130100000000077700000006740000067400002000000000000000000030041000012241130001321300121130404034333717100000603016113137173775775647767400047400470000703417133113313713131135313133100000000160000000000000650467460010000400000000000010000020013041302112430520712161033007135353637000131430314343537371737674766765000420476000065713337113301311317337333737313110010000100000000000000640046540000002000100000020010001010241101306110431110353125013002537351710000161410331353535377747664004067607400404777521111113101353313337737373337333301011300110100000000000000006620100000000001000100200020001302305112003161212102533404353353737000137061371535373777764677000702444660000077760103131212133337311773737377717310313130130213011000000000000476400060100000000010010040010001300121216142125350713001025335371700003703173173737777767777640046740000470527777012112101317352710033773331773001331371011011101301113000000006774000000010000000201200121020305116125000351210330107124137173527000713547357377777777746464000006460000677777730113111203131311300013777373172101073131030121301313011200000004674004000000000001000000000100121301031250215214136103106117173531001733717377777777676400000075000000057777776101313311133737337310003777377317271373130113101310312111100000004460000002001000003004210000016121031304071211213012507017373617000371753777777777767670006746460000773737377300131373733773001717000003377733721037310131213131213013031300000006740000010000001200010003030301007061002121025341703300737171700017537277777777777767400074006777377170737735013137773373100000330000017177773103373013101303031311301110000060474000300000000301000200100001031131121417017110303114343537373016333771777777777664000066470171331333331737720013177773770000000730000002003773737330003121131313331303310000006764000000001000000041002010007060021520013012730707210073777771017533777777777675000000002533131737173737337100113377773773310100110000010001043735300101133133735371101210040047764000100000030001200100210131135132106107251013101777777777073713777177777747760066000173307371313331337373000311377773777770017200000001000331031000031313737731000131012774066400012000001000020120030000021012010612310123716173716577717171777717777777776006500077317133333373733737710013133777777777310031000000000131303130001313373750000000101304600474000000000000007010101001035131215300114313501210370712530777373737777777666440764617337333017371313730333700013113370737777301170100000013131373010001337377300000000310000000460100001001200000020021020012021210706030612353017710712531377777777777777400064001737131373213337331371733000013013510437377773332101007770131343000001777371710170000030040476520012000200041210010000101215141210013011215213710131253075777373717777760000000073733737371217133521333770000100313000347777307310207777100600010000131777373737310013104607764000000001000100061201200021213030300705321521435207701347777777777777766704760007333533733335313313337173300010010312000103773731031177310211111700000127773777777001210070067600010010000420210101000100141203150430120512121370070077131677377777774776007461033733733717333335317133337000000013113000053717731003375311303373700003113777377737101004670447400200000000101020000300303030142130433130717037001701700771177737777766000006043173733733737371303033525373000000013113131313331031177731311153777710003031000077733714000400642000000000012041012100000003152112103050031211770070070077007377777776400474404333733731733331331313132133331000000013131130311213037773131333377777771311021001373773000000076410100000005001020000210100142111250241307125377103107701700377737777740000060031753353373735337130303013353530000000011313311131131377313537377777101107003112121777300600027640000010000020303012100020002112341304170314313770077073037007737777766700067427533373377333337137131313352333531000000131311333123537373313137377777373713103011100070067600474600200000010100400000010100011250301202170307317300701700700137777777777400040442153773337371333131303052317121212100000001311131133137773313777373737737717133313100040047000674101000000202121030120020000341330701407035317770073070077007737377776400200000053333373737337173130313313312131030231201301213523173377111217377773737737733111210000645644046600200001004110102040010100400301010300313521737205701701701773777777460047400601317177373313713313371361371213002113173130331303353337733333137373337373723734331001000066427641001001200210602010121000020330703431140703171771031063077003757777767400246407643737337353733371711131331335213112030217313071301337777310103123777737337370330101001000400465603000000001201050020000200410010303072121717373702560500700173737777767004006046013537333313531333330731731213030317131212353303737337717313131113230717735350733100101000000764000300000001021210101210401213431103100431217177053017037007173777774676470000700533737373733373171731333131303530303031313210313333713731210130311010313133333130100310000064003010000000702500002000000034003070710613353737301300700700173777777767406464046653353735331317137333132712521313211313035311337373731217371000000000000000000103010005600054404300205210210010012000100243413103111210417353535007012071037373737777640006700004217313333737333537317313131303011730301231230133133131213773000100000000000000000420064046676030535301001021212010142041012200710217302412173730300710300435377777765600056400744737371713137313317335313031713231313331331337137131311337777003500000000000000007406400076434777777777773500016030100006015011211210143371217007013007053173737777767000600064072531333373713737337333733121311030310331217133313131337710001003000000000000560040670004677777737337373777353001002000413421217307034215071710700700700317353777774764000052006653535353373373333733531353312133135337131333313131353770000130101000000000466460000600247773733373737337336165102500601200121210117104333173001030042143717377777767000006650040033333371337373533733733313713103033112173131313121333000177773301100000016400077404444777373373333333333337326100010301430007032121214127171070030140313035377377764000000600005735373371737373733731717331373131123312133131313133771137777777721300024600004660067673737373373737373373333107202410421070117110710433512103035000007161737377777400000046460463533135333733733533733331731333733131313073121131373377777777733131110400004640004767777373373333333337337312301401203007012121071243341253070100702317173537777747600250000000771353733373373373373737173121731353533131310076037177777773421713131201240007000067777773737337373737333312330020160500707010713031041371343134310505303173537737766704640400066121273735337373317137333313131373333353031771771002777773770001313101000000046146777777373337333333333327206676160120121021071217070250361343130700305352173717777576000006700041111353337333735337317373735303353131331377777770017777070110313131311101000476777777737377337373733367764747476764106161403031013004335170307071021734317353773776640047606000131271237337373131733737313131313337121035777737701677700016131313131000300006777777773737333733333376767656476747416010030317073701631433031713125052131635373777774000064000003011313533737333731373137337333537313131777733777740100000013131313000310000677777777773737373737276767767767676765601243400013010301433143431617006316171735377357776604000067053073133353337353737373737313533313313137777771777700000000001313111310160647777777777777737333337770746776777777760341212103701711600523131613037105317034377177377756700000006000161053371733333337331337313133353130013733137770600000000000012301316777777777777777777777777575652105274777677740250400010301271073516161343500612527173537357477764600076400007117373333717373537377337335353130017373707310040000000000000311130676777777777777777777775252000040705010677764705203000711635004301235317171253171717353717737373560000640404771331371713335333335333533533313121231131313000470000000060004003447777777777777777777772524040406170707061057776124100041271037125371521612534247373717377737477777744000007600135371333737331737333733313113131001137171057200674056000400067746777777777777777777777440442400004070707165207474030000035005030425231713713716171753777777777777777747640040007131311713537333317331717333717121021121200064004604600000005666777777777777777777775652560404004124143507175707074000430037133516135353071253714373777777777777777777746700000717135331313137171735373331513331101000040006500670067404204467777777777777777777777765646046527424470743707070706021402005030150243534373535734637777777777777777777777746000024373313513173537333333135133371012121000675004646560042777466777777777777777777777764564654746440407065254525257750000010133512335061350353731735777777777777777777777777774404400071313313113313171717133171707000464064460067006000047667777777777777777777777774776565646142400041525273535253774020000150215307073371717777777777777777777777777777777776767600000113537353353313131171060000007604700000040047444677777777777777777777777777777777777746440604061615067617057734161202335721607171737373777777777767677776767676677767774465600007117353371313313132006504640000006000000007766767777777777777777777777777777777777777774740402525637141747257700014115303171617177177777777777647777767677774747766776777464047776025335313171317750076467000000000666040666477777777777777777777777777777777777777777777404041653450772535777701202721617125373737377777777677777777777767676767777677677777464674001731313137004600000046004000007777647777777777773777777777777777777777766676567777777774065257274357707770205013171735205371777777777777777767465445465446506447677676777774646476775210476400004762000676744664677777777777737373733737377777777777720456446474676777777075257174717157750020017121735373737377777477777746476766767466746652704667677677777747647465467674206476740447464767777777777777777737373773737777777777720456444747665474777746165705253676777701012735273707777777777777777476777775777676774765644470047767767777774776766746465447464764765777717777777777777373773737337377777777774046646676765646464777707560725771517770207001735353567373777777777476777777664765656465644767474000767767777774777777777767672574567773777777777777777777373373737737377777777004654656767665646444677563570573472777750106173703733537777777777767777747654765647656065644646476444247677777777777777777177576727137777737777777777777773773773730707777777740076647676767664746404477562537473557777030300353571743773777777767777774764264424244406424740656446765647767777777777777167707717536537773777777777777737377274340577777777774006656767676764746442460656156743143777752505213733373353777777777777746466404402465427650424074240474765007767777777777016750770773753567777777777777777777414121437777777777000765676776767674644644040771635356777772010321471747374777777777777764670404720744067406470004656560464767407767777777756777360777753763577777777777777777616034103077777777740056767776676746465464464640775774357777417070521373317377377777777767464400004446700467400656706606474240767647777777777007757177777761742577777777777777765010121410777777777024667766777676776666464440460734357777770203030527374737177777777774760000464420044474646744642474577065064777427677777770757767774752577173737777777777776121216030301777777747567776776766766674400000000047577777774010141430117373777777777777464404600002466067067476464747466646566540677647777777652775775737377617756777377777773010104101050167777771676776767676677675000000000000077777772000252020343737173717777777746400474606444044040046440046046147416740670477527777770077737737057017727737777777777750306030252120177777647656777777777767664000000000000777777410010000140143777173737777776564020640407600000000006056424066706465724470677477777752477747573077077177017773777776100101011010520777771657677777742460000000000000000007775610000010100212073717735777777746406440060440474241200046460404744470724477465676477777007077773777107716776777777777710342125203021013777567767775402050004014000000000000061430020100202001000173733777777776400044246404604665424000004656476467656452742564777777774747777771710637777517737377773020105010141101257760776776020605224707421604200000000042014100214010000057735753777777747400240040604707466456000004656647647677656740770774777737777777737731777136743777737341052120302124210777756777040414524570617461670700040000010020310010010000233773771777776046074740044424464467601000004656465640477600700646777777477777777777703776537771717776121010150510110703770777740016724724256425641474700007001250100612030030041753773777777754604464600606406470440464000000647467042763476525756777770777777773373377733743173733753403430212030201057547760017605434165070520742434760400000030701014007000303771373777377660472000614040646464706072000000046746174147616476677777777777777777777777775737353175200300101001410102736370056760562506506076474257425700470010000125210300070473775375777775474444044644004044046440640000000037777776747477077477777777777777777773777372517377737500010217030216105756561614163416470616052435607424760670030107100210061031373737377777764600064000607400060076745676100000337777777777477477777777777737777337777777773617137737214210001010012121770047607407430434075250461643560704740042007000430061605375371777377740046706064464006746406046004200004777777765406747767777777777777777773721377353737753744001070120010000167043650743470463434424427074346165647301010301012040301337377177777777460044446446060474404006774761000710677777767677767757777777777777777775014777737527377700000012503021014352525270343434341643430745616434706574000250002010071434371737357377774470604650654042464240046464047100671077777747567476777777777777777777733133573573577773700000000104102034607470564742434060743465261653461656771210303010061021037177173657377376465624644644644004600424065246301277077777676565777777777777777777777737773173773771777560000002112150135616526160743434343461605652470743477701000000010071034037353717377777746564406760674240647407000464777040577777777476167777777777777777777777377777657375377737140000000000212461616507074340656146165770470475256775242101012061025031173673477737377706400676404604404060244052677765330777777776774776777777777777777777737777771335737736770606100000301005356461647006165216705256043063424077721014200004016112143717173437777777446004440604006000444424645667777731777777774076577777777777777777777733777776521617716165752561614161764253461605745275641674252565147077777521210121007212052373477357735377737164002404656444646460464644567777731377777774676777777777777777777777777777737537703353063773777777777756470343420204025250614052066340477743050240103001413050173435253537737777470404740640065646444040606476777713737777677477777777777777777777777377773712501705252573771617617435607444652547525000605256056140077777161211303040703043037357525277773777777646466440006646000600464650477777347776774747777777777777777777777777777773070372525247075271771342570442700056200605670524203616047777706134124050030301303435253347137171737375744000024454040040400044666077777777746776777777777777777777777777717777773070503121437735370377070374240642005470725052535654007777770135216113200414160521525257077173777757367764560406600740766400004506460677777676747777777777777777777777777377777771032506161435370357071470314040404200404024242400025747776120417136141212030130523347307077353737375737576600040464644442464076406574477777654777737777777777777777777777777777325052317063536177217302171634000404002104000500776567774116153212512300417012012157071707134735735727573744406400042000047402440656647777777727777771734777777777777777777777737012341420707253521771657061010400004040612570674657656161601205071614043121705214307030613531731733563773777747604740000046440604644746777777457371777735777777777777777777777015250123505371361171210303112521000000040442467477525252121125303003300352501211211707616563434735734143353775347564600240400604004246746777776377771735737777777777777777777777210270503607071725275346160703071300100000640507472420105025001617141000212161205230611003113531612527375371737736165644740664074644756357737616717373530777777777777777777771705251030340713521735324215130141024070210420170703010052021103161212300615214305301616534707343071371617136173617056577734765416567173635371771653734717371747777777777777771021030343435025252170530501632070212140305021017021050041201104216113434071120121030431003001310317070140617535353737037353435373777073717135275347377137343527077777777777777761525350343025435316172573061053071250210121003021103030210142131030603100016170143413034703424250313136341230370317124437253734353771473716735337047357135307134217537777774777302120352171302525312533070163010010304250121001421701000710300070113143043012170303430001300711214242510061535035617102517352535271243170711635720735234363537004730737737137750714170353070434316173525306107071241000121412121121030400030171034207104216121034130143424070125031311206112303703124253734353073525216171277170142537537153616173071777343046321033034307170713735252534010303000134252102001016107002103143003031530201012507103052000714036130070525053614341716105252531617343704352125217356072530703617100717173773352010507143530703024343431712125630503030000212110307212100012502125341403014303611212143043070124112532132120003310321213407171613071717061353535343314173531713037060703273070316030302100713571435353431617001430341071050500610010510300410341301231343000501201252103004036434350152516142505251525070243061707034370070343070347025252160707502431705347171404341716170343242703421743524343070303024212121210712030012030305251425316070341705214340724110121030301210003121212103005317130713537007135307135310437135313531241352130312120030121213071735071353170312100301010101001210101030301000001010121303130000121030121030030434300000000000000000000010500000000000094AD05FE) +go +set identity_insert "Categories" off +go +ALTER TABLE "Categories" CHECK CONSTRAINT ALL +go +set quoted_identifier on +go +ALTER TABLE "Customers" NOCHECK CONSTRAINT ALL +go +INSERT "Customers" VALUES('ALFKI','Alfreds Futterkiste','Maria Anders','Sales Representative','Obere Str. 57','Berlin',NULL,'12209','Germany','030-0074321','030-0076545') +INSERT "Customers" VALUES('ANATR','Ana Trujillo Emparedados y helados','Ana Trujillo','Owner','Avda. de la Constitución 2222','México D.F.',NULL,'05021','Mexico','(5) 555-4729','(5) 555-3745') +INSERT "Customers" VALUES('ANTON','Antonio Moreno Taquería','Antonio Moreno','Owner','Mataderos 2312','México D.F.',NULL,'05023','Mexico','(5) 555-3932',NULL) +INSERT "Customers" VALUES('AROUT','Around the Horn','Thomas Hardy','Sales Representative','120 Hanover Sq.','London',NULL,'WA1 1DP','UK','(171) 555-7788','(171) 555-6750') +INSERT "Customers" VALUES('BERGS','Berglunds snabbköp','Christina Berglund','Order Administrator','Berguvsvägen 8','Luleå',NULL,'S-958 22','Sweden','0921-12 34 65','0921-12 34 67') +INSERT "Customers" VALUES('BLAUS','Blauer See Delikatessen','Hanna Moos','Sales Representative','Forsterstr. 57','Mannheim',NULL,'68306','Germany','0621-08460','0621-08924') +INSERT "Customers" VALUES('BLONP','Blondesddsl père et fils','Frédérique Citeaux','Marketing Manager','24, place Kléber','Strasbourg',NULL,'67000','France','88.60.15.31','88.60.15.32') +INSERT "Customers" VALUES('BOLID','Bólido Comidas preparadas','Martín Sommer','Owner','C/ Araquil, 67','Madrid',NULL,'28023','Spain','(91) 555 22 82','(91) 555 91 99') +INSERT "Customers" VALUES('BONAP','Bon app''','Laurence Lebihan','Owner','12, rue des Bouchers','Marseille',NULL,'13008','France','91.24.45.40','91.24.45.41') +INSERT "Customers" VALUES('BOTTM','Bottom-Dollar Markets','Elizabeth Lincoln','Accounting Manager','23 Tsawassen Blvd.','Tsawassen','BC','T2F 8M4','Canada','(604) 555-4729','(604) 555-3745') +go +INSERT "Customers" VALUES('BSBEV','B''s Beverages','Victoria Ashworth','Sales Representative','Fauntleroy Circus','London',NULL,'EC2 5NT','UK','(171) 555-1212',NULL) +INSERT "Customers" VALUES('CACTU','Cactus Comidas para llevar','Patricio Simpson','Sales Agent','Cerrito 333','Buenos Aires',NULL,'1010','Argentina','(1) 135-5555','(1) 135-4892') +INSERT "Customers" VALUES('CENTC','Centro comercial Moctezuma','Francisco Chang','Marketing Manager','Sierras de Granada 9993','México D.F.',NULL,'05022','Mexico','(5) 555-3392','(5) 555-7293') +INSERT "Customers" VALUES('CHOPS','Chop-suey Chinese','Yang Wang','Owner','Hauptstr. 29','Bern',NULL,'3012','Switzerland','0452-076545',NULL) +INSERT "Customers" VALUES('COMMI','Comércio Mineiro','Pedro Afonso','Sales Associate','Av. dos Lusíadas, 23','Sao Paulo','SP','05432-043','Brazil','(11) 555-7647',NULL) +INSERT "Customers" VALUES('CONSH','Consolidated Holdings','Elizabeth Brown','Sales Representative','Berkeley Gardens 12 Brewery','London',NULL,'WX1 6LT','UK','(171) 555-2282','(171) 555-9199') +INSERT "Customers" VALUES('DRACD','Drachenblut Delikatessen','Sven Ottlieb','Order Administrator','Walserweg 21','Aachen',NULL,'52066','Germany','0241-039123','0241-059428') +INSERT "Customers" VALUES('DUMON','Du monde entier','Janine Labrune','Owner','67, rue des Cinquante Otages','Nantes',NULL,'44000','France','40.67.88.88','40.67.89.89') +INSERT "Customers" VALUES('EASTC','Eastern Connection','Ann Devon','Sales Agent','35 King George','London',NULL,'WX3 6FW','UK','(171) 555-0297','(171) 555-3373') +INSERT "Customers" VALUES('ERNSH','Ernst Handel','Roland Mendel','Sales Manager','Kirchgasse 6','Graz',NULL,'8010','Austria','7675-3425','7675-3426') +go +INSERT "Customers" VALUES('FAMIA','Familia Arquibaldo','Aria Cruz','Marketing Assistant','Rua Orós, 92','Sao Paulo','SP','05442-030','Brazil','(11) 555-9857',NULL) +INSERT "Customers" VALUES('FISSA','FISSA Fabrica Inter. Salchichas S.A.','Diego Roel','Accounting Manager','C/ Moralzarzal, 86','Madrid',NULL,'28034','Spain','(91) 555 94 44','(91) 555 55 93') +INSERT "Customers" VALUES('FOLIG','Folies gourmandes','Martine Rancé','Assistant Sales Agent','184, chaussée de Tournai','Lille',NULL,'59000','France','20.16.10.16','20.16.10.17') +INSERT "Customers" VALUES('FOLKO','Folk och fä HB','Maria Larsson','Owner','Åkergatan 24','Bräcke',NULL,'S-844 67','Sweden','0695-34 67 21',NULL) +INSERT "Customers" VALUES('FRANK','Frankenversand','Peter Franken','Marketing Manager','Berliner Platz 43','München',NULL,'80805','Germany','089-0877310','089-0877451') +INSERT "Customers" VALUES('FRANR','France restauration','Carine Schmitt','Marketing Manager','54, rue Royale','Nantes',NULL,'44000','France','40.32.21.21','40.32.21.20') +INSERT "Customers" VALUES('FRANS','Franchi S.p.A.','Paolo Accorti','Sales Representative','Via Monte Bianco 34','Torino',NULL,'10100','Italy','011-4988260','011-4988261') +INSERT "Customers" VALUES('FURIB','Furia Bacalhau e Frutos do Mar','Lino Rodriguez','Sales Manager','Jardim das rosas n. 32','Lisboa',NULL,'1675','Portugal','(1) 354-2534','(1) 354-2535') +INSERT "Customers" VALUES('GALED','Galería del gastrónomo','Eduardo Saavedra','Marketing Manager','Rambla de Cataluña, 23','Barcelona',NULL,'08022','Spain','(93) 203 4560','(93) 203 4561') +INSERT "Customers" VALUES('GODOS','Godos Cocina Típica','José Pedro Freyre','Sales Manager','C/ Romero, 33','Sevilla',NULL,'41101','Spain','(95) 555 82 82',NULL) +go +INSERT "Customers" VALUES('GOURL','Gourmet Lanchonetes','André Fonseca','Sales Associate','Av. Brasil, 442','Campinas','SP','04876-786','Brazil','(11) 555-9482',NULL) +INSERT "Customers" VALUES('GREAL','Great Lakes Food Market','Howard Snyder','Marketing Manager','2732 Baker Blvd.','Eugene','OR','97403','USA','(503) 555-7555',NULL) +INSERT "Customers" VALUES('GROSR','GROSELLA-Restaurante','Manuel Pereira','Owner','5ª Ave. Los Palos Grandes','Caracas','DF','1081','Venezuela','(2) 283-2951','(2) 283-3397') +INSERT "Customers" VALUES('HANAR','Hanari Carnes','Mario Pontes','Accounting Manager','Rua do Paço, 67','Rio de Janeiro','RJ','05454-876','Brazil','(21) 555-0091','(21) 555-8765') +INSERT "Customers" VALUES('HILAA','HILARION-Abastos','Carlos Hernández','Sales Representative','Carrera 22 con Ave. Carlos Soublette #8-35','San Cristóbal','Táchira','5022','Venezuela','(5) 555-1340','(5) 555-1948') +INSERT "Customers" VALUES('HUNGC','Hungry Coyote Import Store','Yoshi Latimer','Sales Representative','City Center Plaza 516 Main St.','Elgin','OR','97827','USA','(503) 555-6874','(503) 555-2376') +INSERT "Customers" VALUES('HUNGO','Hungry Owl All-Night Grocers','Patricia McKenna','Sales Associate','8 Johnstown Road','Cork','Co. Cork',NULL,'Ireland','2967 542','2967 3333') +INSERT "Customers" VALUES('ISLAT','Island Trading','Helen Bennett','Marketing Manager','Garden House Crowther Way','Cowes','Isle of Wight','PO31 7PJ','UK','(198) 555-8888',NULL) +INSERT "Customers" VALUES('KOENE','Königlich Essen','Philip Cramer','Sales Associate','Maubelstr. 90','Brandenburg',NULL,'14776','Germany','0555-09876',NULL) +INSERT "Customers" VALUES('LACOR','La corne d''abondance','Daniel Tonini','Sales Representative','67, avenue de l''Europe','Versailles',NULL,'78000','France','30.59.84.10','30.59.85.11') +go +INSERT "Customers" VALUES('LAMAI','La maison d''Asie','Annette Roulet','Sales Manager','1 rue Alsace-Lorraine','Toulouse',NULL,'31000','France','61.77.61.10','61.77.61.11') +INSERT "Customers" VALUES('LAUGB','Laughing Bacchus Wine Cellars','Yoshi Tannamuri','Marketing Assistant','1900 Oak St.','Vancouver','BC','V3F 2K1','Canada','(604) 555-3392','(604) 555-7293') +INSERT "Customers" VALUES('LAZYK','Lazy K Kountry Store','John Steel','Marketing Manager','12 Orchestra Terrace','Walla Walla','WA','99362','USA','(509) 555-7969','(509) 555-6221') +INSERT "Customers" VALUES('LEHMS','Lehmanns Marktstand','Renate Messner','Sales Representative','Magazinweg 7','Frankfurt a.M.',NULL,'60528','Germany','069-0245984','069-0245874') +INSERT "Customers" VALUES('LETSS','Let''s Stop N Shop','Jaime Yorres','Owner','87 Polk St. Suite 5','San Francisco','CA','94117','USA','(415) 555-5938',NULL) +INSERT "Customers" VALUES('LILAS','LILA-Supermercado','Carlos González','Accounting Manager','Carrera 52 con Ave. Bolívar #65-98 Llano Largo','Barquisimeto','Lara','3508','Venezuela','(9) 331-6954','(9) 331-7256') +INSERT "Customers" VALUES('LINOD','LINO-Delicateses','Felipe Izquierdo','Owner','Ave. 5 de Mayo Porlamar','I. de Margarita','Nueva Esparta','4980','Venezuela','(8) 34-56-12','(8) 34-93-93') +INSERT "Customers" VALUES('LONEP','Lonesome Pine Restaurant','Fran Wilson','Sales Manager','89 Chiaroscuro Rd.','Portland','OR','97219','USA','(503) 555-9573','(503) 555-9646') +INSERT "Customers" VALUES('MAGAA','Magazzini Alimentari Riuniti','Giovanni Rovelli','Marketing Manager','Via Ludovico il Moro 22','Bergamo',NULL,'24100','Italy','035-640230','035-640231') +INSERT "Customers" VALUES('MAISD','Maison Dewey','Catherine Dewey','Sales Agent','Rue Joseph-Bens 532','Bruxelles',NULL,'B-1180','Belgium','(02) 201 24 67','(02) 201 24 68') +go +INSERT "Customers" VALUES('MEREP','Mère Paillarde','Jean Fresnière','Marketing Assistant','43 rue St. Laurent','Montréal','Québec','H1J 1C3','Canada','(514) 555-8054','(514) 555-8055') +INSERT "Customers" VALUES('MORGK','Morgenstern Gesundkost','Alexander Feuer','Marketing Assistant','Heerstr. 22','Leipzig',NULL,'04179','Germany','0342-023176',NULL) +INSERT "Customers" VALUES('NORTS','North/South','Simon Crowther','Sales Associate','South House 300 Queensbridge','London',NULL,'SW7 1RZ','UK','(171) 555-7733','(171) 555-2530') +INSERT "Customers" VALUES('OCEAN','Océano Atlántico Ltda.','Yvonne Moncada','Sales Agent','Ing. Gustavo Moncada 8585 Piso 20-A','Buenos Aires',NULL,'1010','Argentina','(1) 135-5333','(1) 135-5535') +INSERT "Customers" VALUES('OLDWO','Old World Delicatessen','Rene Phillips','Sales Representative','2743 Bering St.','Anchorage','AK','99508','USA','(907) 555-7584','(907) 555-2880') +INSERT "Customers" VALUES('OTTIK','Ottilies Käseladen','Henriette Pfalzheim','Owner','Mehrheimerstr. 369','Köln',NULL,'50739','Germany','0221-0644327','0221-0765721') +INSERT "Customers" VALUES('PARIS','Paris spécialités','Marie Bertrand','Owner','265, boulevard Charonne','Paris',NULL,'75012','France','(1) 42.34.22.66','(1) 42.34.22.77') +INSERT "Customers" VALUES('PERIC','Pericles Comidas clásicas','Guillermo Fernández','Sales Representative','Calle Dr. Jorge Cash 321','México D.F.',NULL,'05033','Mexico','(5) 552-3745','(5) 545-3745') +INSERT "Customers" VALUES('PICCO','Piccolo und mehr','Georg Pipps','Sales Manager','Geislweg 14','Salzburg',NULL,'5020','Austria','6562-9722','6562-9723') +INSERT "Customers" VALUES('PRINI','Princesa Isabel Vinhos','Isabel de Castro','Sales Representative','Estrada da saúde n. 58','Lisboa',NULL,'1756','Portugal','(1) 356-5634',NULL) +go +INSERT "Customers" VALUES('QUEDE','Que Delícia','Bernardo Batista','Accounting Manager','Rua da Panificadora, 12','Rio de Janeiro','RJ','02389-673','Brazil','(21) 555-4252','(21) 555-4545') +INSERT "Customers" VALUES('QUEEN','Queen Cozinha','Lúcia Carvalho','Marketing Assistant','Alameda dos Canàrios, 891','Sao Paulo','SP','05487-020','Brazil','(11) 555-1189',NULL) +INSERT "Customers" VALUES('QUICK','QUICK-Stop','Horst Kloss','Accounting Manager','Taucherstraße 10','Cunewalde',NULL,'01307','Germany','0372-035188',NULL) +INSERT "Customers" VALUES('RANCH','Rancho grande','Sergio Gutiérrez','Sales Representative','Av. del Libertador 900','Buenos Aires',NULL,'1010','Argentina','(1) 123-5555','(1) 123-5556') +INSERT "Customers" VALUES('RATTC','Rattlesnake Canyon Grocery','Paula Wilson','Assistant Sales Representative','2817 Milton Dr.','Albuquerque','NM','87110','USA','(505) 555-5939','(505) 555-3620') +INSERT "Customers" VALUES('REGGC','Reggiani Caseifici','Maurizio Moroni','Sales Associate','Strada Provinciale 124','Reggio Emilia',NULL,'42100','Italy','0522-556721','0522-556722') +INSERT "Customers" VALUES('RICAR','Ricardo Adocicados','Janete Limeira','Assistant Sales Agent','Av. Copacabana, 267','Rio de Janeiro','RJ','02389-890','Brazil','(21) 555-3412',NULL) +INSERT "Customers" VALUES('RICSU','Richter Supermarkt','Michael Holz','Sales Manager','Grenzacherweg 237','Genève',NULL,'1203','Switzerland','0897-034214',NULL) +INSERT "Customers" VALUES('ROMEY','Romero y tomillo','Alejandra Camino','Accounting Manager','Gran Vía, 1','Madrid',NULL,'28001','Spain','(91) 745 6200','(91) 745 6210') +INSERT "Customers" VALUES('SANTG','Santé Gourmet','Jonas Bergulfsen','Owner','Erling Skakkes gate 78','Stavern',NULL,'4110','Norway','07-98 92 35','07-98 92 47') +go +INSERT "Customers" VALUES('SAVEA','Save-a-lot Markets','Jose Pavarotti','Sales Representative','187 Suffolk Ln.','Boise','ID','83720','USA','(208) 555-8097',NULL) +INSERT "Customers" VALUES('SEVES','Seven Seas Imports','Hari Kumar','Sales Manager','90 Wadhurst Rd.','London',NULL,'OX15 4NB','UK','(171) 555-1717','(171) 555-5646') +INSERT "Customers" VALUES('SIMOB','Simons bistro','Jytte Petersen','Owner','Vinbæltet 34','Kobenhavn',NULL,'1734','Denmark','31 12 34 56','31 13 35 57') +INSERT "Customers" VALUES('SPECD','Spécialités du monde','Dominique Perrier','Marketing Manager','25, rue Lauriston','Paris',NULL,'75016','France','(1) 47.55.60.10','(1) 47.55.60.20') +INSERT "Customers" VALUES('SPLIR','Split Rail Beer & Ale','Art Braunschweiger','Sales Manager','P.O. Box 555','Lander','WY','82520','USA','(307) 555-4680','(307) 555-6525') +INSERT "Customers" VALUES('SUPRD','Suprêmes délices','Pascale Cartrain','Accounting Manager','Boulevard Tirou, 255','Charleroi',NULL,'B-6000','Belgium','(071) 23 67 22 20','(071) 23 67 22 21') +INSERT "Customers" VALUES('THEBI','The Big Cheese','Liz Nixon','Marketing Manager','89 Jefferson Way Suite 2','Portland','OR','97201','USA','(503) 555-3612',NULL) +INSERT "Customers" VALUES('THECR','The Cracker Box','Liu Wong','Marketing Assistant','55 Grizzly Peak Rd.','Butte','MT','59801','USA','(406) 555-5834','(406) 555-8083') +INSERT "Customers" VALUES('TOMSP','Toms Spezialitäten','Karin Josephs','Marketing Manager','Luisenstr. 48','Münster',NULL,'44087','Germany','0251-031259','0251-035695') +INSERT "Customers" VALUES('TORTU','Tortuga Restaurante','Miguel Angel Paolino','Owner','Avda. Azteca 123','México D.F.',NULL,'05033','Mexico','(5) 555-2933',NULL) +go +INSERT "Customers" VALUES('TRADH','Tradição Hipermercados','Anabela Domingues','Sales Representative','Av. Inês de Castro, 414','Sao Paulo','SP','05634-030','Brazil','(11) 555-2167','(11) 555-2168') +INSERT "Customers" VALUES('TRAIH','Trail''s Head Gourmet Provisioners','Helvetius Nagy','Sales Associate','722 DaVinci Blvd.','Kirkland','WA','98034','USA','(206) 555-8257','(206) 555-2174') +INSERT "Customers" VALUES('VAFFE','Vaffeljernet','Palle Ibsen','Sales Manager','Smagsloget 45','Århus',NULL,'8200','Denmark','86 21 32 43','86 22 33 44') +INSERT "Customers" VALUES('VICTE','Victuailles en stock','Mary Saveley','Sales Agent','2, rue du Commerce','Lyon',NULL,'69004','France','78.32.54.86','78.32.54.87') +INSERT "Customers" VALUES('VINET','Vins et alcools Chevalier','Paul Henriot','Accounting Manager','59 rue de l''Abbaye','Reims',NULL,'51100','France','26.47.15.10','26.47.15.11') +INSERT "Customers" VALUES('WANDK','Die Wandernde Kuh','Rita Müller','Sales Representative','Adenauerallee 900','Stuttgart',NULL,'70563','Germany','0711-020361','0711-035428') +INSERT "Customers" VALUES('WARTH','Wartian Herkku','Pirkko Koskitalo','Accounting Manager','Torikatu 38','Oulu',NULL,'90110','Finland','981-443655','981-443655') +INSERT "Customers" VALUES('WELLI','Wellington Importadora','Paula Parente','Sales Manager','Rua do Mercado, 12','Resende','SP','08737-363','Brazil','(14) 555-8122',NULL) +INSERT "Customers" VALUES('WHITC','White Clover Markets','Karl Jablonski','Owner','305 - 14th Ave. S. Suite 3B','Seattle','WA','98128','USA','(206) 555-4112','(206) 555-4115') +INSERT "Customers" VALUES('WILMK','Wilman Kala','Matti Karttunen','Owner/Marketing Assistant','Keskuskatu 45','Helsinki',NULL,'21240','Finland','90-224 8858','90-224 8858') +go +INSERT "Customers" VALUES('WOLZA','Wolski Zajazd','Zbyszek Piestrzeniewicz','Owner','ul. Filtrowa 68','Warszawa',NULL,'01-012','Poland','(26) 642-7012','(26) 642-7012') +go +ALTER TABLE "Customers" CHECK CONSTRAINT ALL +go +set quoted_identifier on +go +set identity_insert "Employees" on +go +ALTER TABLE "Employees" NOCHECK CONSTRAINT ALL +go +INSERT "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(1,'Davolio','Nancy','Sales Representative','Ms.','12/08/1948','05/01/1992','507 - 20th Ave. E. +Apt. 2A','Seattle','WA','98122','USA','(206) 555-9857','5467',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FF0CB0C9000B090900000A009009000000000909A09A900B09000A90A00000000FFFEFFFFFFFFFFFFFFFFFCB9CFCFEFAFFFFFFFFEDFFFEDEFFDEFEFCFFFFDADA00D900009009009000000000090A00090BC0000900900000000A00ACA0E0E0E0F0E9CA9000A9CB0C00009090E0000009090B0000D009009000000900009A000FFFFFFFFFFFFEFFFFFFFFFCADEBDBDFDFDFFFFFFFFFEFEDFFFEFFFFFFFEFCAF0C9A0A0D00009A0000000000000009090A000B009A9000090000900C0900900900FA90ADA00090B00B000000009000090000009009A9B009009A00000000C000BFFFFFFFFEFFFFFFFFFFFFCF9FBCBEFBFFEBFFFFFFFEFDFFFEFDFFCFFEFFF9BC0B00909000900009000000000000900000909009A0C0B00000B00009A00E0E0E0EFCADA0C90000CB009000009A9A09A000B0090090900D00A9090009090A0000FFFFFFFEFFFEFFFFFFFFFFF0F0FFDFEDADFDFFFFFFFFFEFEFDEFEFFCFDEFEC0F0C9AC00A00A09000000090000000090A900A00009090000A00000CA00C09009090F900DA009A9000DA00D0000009C090000090B000A9A9B090000000AC00000BFFEFFFFFFFFFFFFFFFFFEDA9DF0FF9FFFFFFF0FFFFFFFFFDFEFFDEFFEFDFF9A9A0090909009000900000000000090A9000909A9000A90D090000A9000B0E0CACA0FAE9A9CA000A99A90B00000090B000909000090090D00009A900009000009FFFFFFFFFFFFFEFFFFFFEDADEBCFDEFFDADADFFFFFFFFFFEFEFCBEFDEDBEFCAD0D0E00A000000900000000000009009009000000009000A000090000000009A900DF090CA9009090E90900B00090A9009000090B009A09A90909000090B0009FFFFFFFFFFFEFFFFFFFFFD09E9CFBFBF0FFFFFEFFDEFFFFFFFFDFFDFEBFEFDA90B0A90900A9009000000000000000000000090900090A909000A0000ACB00B0C0E0AF0F0BC09000009ADA9090000090F0000900909009909A9A0900000000000FFFEFFFFEFFFEFFEFFFFEA9E9FBFDEDFFFDFFFDFFFFFCFFFFFEFEFEDFCFDEFC000D0000900000000000000000000009009000A0090090000B00900009000C00A09C0FF0F0BCA0B0A00090F0A9A900090B0900900090000B0D090A900009A000BFFFFFFFFFFFFFFFFFFFFD0F9E9F0FBEF0FAFCBFEFFDFFFFFFFFFDFFAFFAF9EFBC0A9C0A00909000900000000009000000000900000000B0000000A000000B0C90A00F0B0F009C0009000B009C000B00AD000B0099A909A90B00990000009C00FFFFFFFEFFFEFFEFFFFFCA90F0FCFFDFDFFDFFFDFDBEFFFDFFFFFEFCFCFDFEFC00900A9000000A090000000000000000B000900900000900909AC90000A9000A0C09CF00F00DA0090000909F0B909C0099A09009A00000090909A0090009A09FFFFFFFFFFFFFFFDFFFEE99CF0FDBE9EFAFCBE9EFBEFFFDEBFDBFFFFFFF0FEDF0A90AD0009009090000000000000000090090000000000009A00900090000DA0900A0AFADADB009AC900000009000A9009AD00090090909BCB09C9900090009AFFFFFFFFFEFFFEFEFEFFDACB0FDADFFBDF9FFDFDFDFDFFFFFFEFFFFFEFCF0FBED0E9009C0000000000000000000000000000000900000000009A00000090B0C00E9C00FDA90E9AC9A0A90A90A9A909AD009B900AD0A90009090B0A90000090BDFFFFFFFFFFFFFFFFFFFC09AD0B0F0BEDAFE9EFAFBEBFDAFDFFFDBFFFFFFFFCFFE9009A0B00000090A90000000000000090090000000000090009B000000000B0000AD0FADEB9E9000D00090090D0B099A9A0F09009009090B09099000000009EFFFFFFFFFFEFFFFCFFC0F0DAFCF9FD9FDF9FF9FDFDFEFFFFEFDFEDFFFFEFCFFEDE9E09000090000090000000000000000000090090000000099C00900000F000090000FDBADCADA900A9000000B009CA9C099A00B0090A9E900B00A0009009FBFFFFFFFEFFFFEFEFFC0B09AD09ADEBEFE9EF0FCBEF9FBDFFFFFFFFFFFFFFFFEFF000900090000900000000000000000900900000009009009A0A9000000900000ACA0AFAEDABF9ADA900DA9C909E9A99A9C9A9990900900909909900000000BCFFFFFFFFFEFFFDFFCBC0F0DA9EDBFDF9FF9DFBFF9FEDFFEBDFFEDBFFFFFEFFFFEC09ACB00000000909000000000000000000900900000090009000009000A0000000D0FDBEDACFBCBCBA09A0A00909AC9BA99E0A9A90090B00BCA9000000009BFFFFFFFFFFFFFEFF00909E9CB9EDAFCF0FEBCF0FE9FBCFDFFBFFFFCFFFFFFFFFFFE09009000000A0000000000000000000000000000000009A0909000090900000000BFFE9FDBC9E9BC900909900B09B0D9A0999C00090909A0909000090090FFFFFFEFFFFEFFFFC90A900B0DADBDFBFFDBDB9FDBFCFFBFFEDFDBFFBFFFFFFFFFE900B0C009090900900000000000000009000000900000AD090A0009A000000909A09F9FFEBEBEBDADBAD0BCA09C0BCB0BC9B00A9090B0F0990B000000000B9FFFFFFFFFFFDEFCA0C9CAD0DADBEBEDADBEDAFCBFCBDBCFDFFEFFCFDFFFFFFFFED00009A9000000090000000000000000000000000000090000090900000F0900000DAFEADBFDBDF0FAD0A9090B0B0090B0BD0B990000090000900000090090FFFFFFFFEFFEFFFD09A0090B0F0FDF9FFEDBFDFBCBFFFFFAFFBFFFBFBFFFFFFFFFFE09000000000900000000000000000000000000000000900900000909000000A9A9AF9DADAFCBFBCBF9F0B0F090B9A9C90B90E909090B909B0900000000090BFFEFFFFFFFFEFE00909AD0BCBDAFE9FDBCBE9FFDADAFDF9FDFDFFCF9FFFFFFFFFC000090909000B009000000000000009000000900009A009A90000000B09E0900C90FEADADFBF0DBDAF0BC090F90000B0B0DB90B00090000090B0000000009FFFFFFFFFFEFFF090C0AC9ADBDAFDBFEBEFFDFF0FFFFDBFFEFFBFFFFEFFFFFFFFEB000000A0000000000000000000000000000000000B090000009009A9000000090A9F0DFAF0FE9EBEBDBE9B0B0BC090BD09A9A9009A90090B000000009009BFFFFFFEFFFFDFC000A9090F9EFBDBEDBFDF9FE9FFBDBEFFFDBFCFF9F9FFFFFFFFD000000090009090000000000000000000000000009C0000A909A0000009009A00A9CFEA0D0FDBFBC9CADBF090D0B00990B09B9E90090B009090900000000000FEFFFFFFFEFEF00090DAF0F9EDEDBFCFBFE9FFADFEFDFCBFFFFFFFEF9FFFFFFFE90000900000000090000000000000000000000090B000009000000B0F0A0000F0D0BFDFFAFAFEDBFBF9E9EF0BA9ADA0A9C9AD09A0900090000000000000009BDFFFFFFEFFFFE0900A909F0FBFBFDBFDEFFFFDFFBDFBFFFE9FDBDF9FEFFFFFFFFC090000090000000000000000000000000000000F00000909A9090090909AD000000FBEFDFFDBFE9E9A9B9BD09DB90D09B090B909009000B090900000090900FFFEFFFFFFFED000D0CBCBDADEDEFFFFF9FDAFF9FFEDF9FDFEFEFFFF9F9FFFFF9B00000000090090000000000000000000000000B090009000900009F0AC00000A0BCFCF0BEDAFF9F9ADF0FFA9AB00B09E9A9A9E90090900900000000000000FBEFFFFFFFEDF009009B0F0FDFBFBFCBDFFEFFDEFEDFBFFEFBF9FBDF0FFEFFFFFE00000000000000000000000000000000000009F000000009BCA900B00909A0AD0D09FA9EC9AF9EF0ADBAD0BDF9C9F0B09090999A900A09000009000000000909FFFFFFEFFEFC00B0E0F9FFAFDFDFFFFAFDBFFBDFBDFCF9FCFFDFBFFBDBFFFFFD9A0000B0000000900000000000000000000BCB0B000009A0090009E9E0000900A0A0FFCBFEDAF9BFDADBBF0B0BB099DA9F0BCB0D0009009090000000000090B0DFFFEFFFFFF000099F0F0FDFAFEBDFFDFFFCFFFFFEBFFFFBDEBCF9FCBDADFFFAD0000000000000000000000000000000000090D000090090B009F09090B00C090D09FEBFCBADBEF0BDADA9FDBC9FA0B90090099A909000A00000090000000009AFEDFFFFEFC09090E9F9FBEBDFFFFBFFFFFFBDE9FFDF0F0FFBDFBEFBFFDBFFFF0900000000000000000000000000000000B9A9A00090090900FA0BCA0000B0B0E0A0F0F0BEDFEF9BCADADFA9A9A9099E99B0B9A900009009000000000000009ADFFFFDEFFDA000F0BDAFCFDFFF9FFCFFE9FFFFFFF9EBFDFFADEBFDBCBCBE9EF09A00009C000000000000000000000000090C0900900A900B0F909000900D000C090DFACFEDAF9F9EBDB9A9BDBDBDB0B9A90990D0B09009000900000000000909ADEFEFFFEF009009F0F9FBFCBFEFFFF9FFF9FCF9EFFDAF0FDBFD0FDBDBD9F9FF009000A00000000000000000000000000B090E9009090B9C9A00E090C00A000B0CB0FDB0F0F0FBE9CBCF9EDA9A9ADBCB9ADA0B0909A9000900000900000000009BFDFFFFFFC009ACBDAFDEBFFDFBDBFFFDEFFBFF9FAFDFF0F9EBFBEFEFADADBE9000090000000000000000000000000009A090000090B0ABD090900B0A900F0CB0E9F0EDAF9E9E9BBCB9EBBDBDBDB09AD0999090090009000000000000000009A0FFFEFEF00000DBCBDFBFDF0FBDEFFFFBFFDEDFEFDFADADFE9FCBDBD9FBD0BD0B0000CB0000000000000000000000009C90A900A90BC9D00A000B0009C0B09AC090F0B9ADADBF0BCBBCB9DADA9A90BDA9B0A9A09A00900090000090000000909DBEFFFFDE090DB0FBFBEDEBFFFFFFDADFDFBFBFBDFADBFFADBCBDADBEF90BD009000900000000000000000000000009A000900999A90B0A090B9C90F00BC0AC0B0EFB0C09ADA9FDBFCB9EBB9BDBDB90B9099C900990090000000009000000000ADFEDFEF0000A9F0FCFDBDFDFDFBFFFFFBEFDFCFADFBC9ADADBCBF0F90FBCBE9AC000AC0000000000000000000000009A090E90A09E900900BCA9A00B0090090009FDBB0F09F0B0B9BCB9C9E9B0BCB9CBDA9B0900B00090000000000000000090A9FADFEF0090E9F9FAFFBEBEBFDFFFFFFDFEBFDFBCFFEDBDADBCBDAFD0F90909000090000000000000000000000009009090099E900F00909909C900000A9A9E90FBCDF0BE9BDBDADB9E9BBDADB909BB090900090909009000000090000009090FEDFED009ADBCBE9FDADFDFFFEFDBDEDBFDFCBFCBCBDADADB0F9E99AF0BDA00B009000000000000000000000000900900A9B00909B09ADA0E00A00D0B0D0C0000F09BA9F9BCBB0F0BE9BBCBF9B0F9AD90B009090000000000090000000000009E9EF9E000D9ADBDFDAFFFBF9FFBFFFFFFFAFBFCBDBDADADACBDADBCF99E0D090000A0000000000000000000000000B0009000B09A000000900000000C000B00A9FFAD9CB0F9ADBBDB9F0DBF9ADB0B90B99A9A00B09090090000009000000090B9E9EF009A9ADBCBEBFDBDEFFFFDFFFBFFDFDE9FCBE0F9E9DBCB9F0B0DA99A000000D00000000000000000000900900009A90900000090900909090B09A0000900F9FABBDB0F9AD0BCB9B09AF9A9BCBBCBC90900900000000000900000000000009E9CF009E9ADBD9E9FEBFDFFFFFFCFDAFBFFFAFDBDADBE9CBCB0F0BE9E9DA09000000000000000000000000000A9090000009000000A000A000A000009000090FF9FDFBE9BF9BF9B9E9FBD9BD9CB9090B090900090009000000000900000090B09EB009C90F0FEBDFBDFDBFFBFF9FFFFDFCBCF0F0F0F0DA9E9CB0D0909A09000009A000000000000000009000900000909000000909000909009000000090DADFAFFFADBDADBF0F9E9BADBBE9AB09F9B90B0009B009000000009000000000000DAD0D0A09ADBCBDFADFBEFFCFDEFFFF9FEBDF9F0F0F0DA9E90BC9ADA9E0900000000000000000000000000009A009A9000000000000000000000000900900B0BF9EBFFF0BDA9FBDB9AD9BCF9B99B0B09E9009000000009000000000000000909ADA00090F9ADBDADFAFDFFFFFFBFF9FEBFDBEFCBDAD0F0F09E90F090990F0900009000000000000000009009090000000000000900009000000009A090A9BDBFFBDF9FFF9FFBDBEBDBBCBB9F0F0DB9B090900909090000000000090000000000009E00090CBCBFFBDFBFBDBFFFFFFEFFDFADBCBCBCBA9E9E90F09E9E0B000000000000000000000000000000A0090090900000000090009000900009A90BCB9FFEBEFFB0FA9FAF9FBD0BF0FA9B9A9E99A9A90009A000900900000000000000090BC909AC9B0F9E9EBFDEFFFDFFDFFFFDEBDFEBDBCBCDCBC9EB0DA90900D0B009000000000000000000090090900009000000000000000000000A909090F0BFEFF9F9BF0FB9FFF9FBCBBF9F99F9E90B9E90900090009000000000000090000090AC000009A0F9E9FDFDBFDFFFFFFF9FDBFDFE9DACBCB0A90B0D0F009E09A90000000000000000000000900B0900900000000000000000909009090B0F0B09F9F9FBEFC9F90FB9BF0FB9F9E9BFA99F99090900900090000900000000000000000909000900D90F9FAFBEFFBFFFFFFFFFEFFAF9FEF9E90F9E9CA0B09E090000090000000000000000000000000A00090000900090090900000A90B009090DBFBEBFFDFBFEBFF9CFDBF9FADBFBCBDBA9ADB0B0B009000909000009000000000000000000009A0BDADBDFFDBFFFFFFFFFFFFFDFFE9F0F0FA0D0A9D0CB0900B00900000000000000000000000090909000009000000000000900900009ADA9A90F9F9EFA9EDBDB9EBBAF9ABDBE9DB9B0DB9A99C9090009000000090000000000000009090000A90D0BF0FBCBFDFFFFFFFDE9F9EF0FF0F0F0DE9AD0A9A0F9E90D000900000000000000000000900000000000000000000009000B00909E909C9AF9E9E9F9FFAFBEFDBDFDBFDBF9FBE9E9B0BDB09A900090A909090000000000000000000A00909C9AFC9FFDBFFFFFFFFFFFFFEFF9FDADAD0DA9AC9E9C9C90000A090000000000000000000000009A900009000009000909000090090B0090B0BF9E9ADAF00BDBF9BBEBFADBBDAB9F9B9E9DA90B090090009000000000000000000000090900000B0D9BE9AFFDFBFFFFDFFFF9F9EFAFDADA9A9C0B00B0A9A0BD090000900000000000000000009000009000900900900000009A090A9C0B0F0F90F0BDA0BF0FADFFDF9F9FBCBFDBE9E9B9A99F90B090A90009009000900000000000000000000090B0E9FFDBFFFFDFFFFFF9EFEF9CDADBCF0DA9C09E0D0C9C0A009A000000000000000000000000090000000000000000009009009CB090909AFB0F0F09F0B0FFBFBFEBFBDBF0BDBBDBC9F0B0B0D0B09009000900900000000090000009090009A9C9BDADBEDBFFFFFFFFFEF9F0FBBDAF09E0D0A9E09A0B0B09C90090000000000000000000000900000000009009000000A0900B90090B0BBD9CB0F09EF9ADB9FFCB9FF9EBDBDBEDB0BB099F0909090900009009000009000000000000000090009ADADBDFFFFFFFFFFFDF9F0FBCDAF09E0B0AD00900D0D0D00A0900000000000000000000090009000900000000000909090A900A9A9C9FDAFA9BCBE9F0F9FE9BFFF9EBDBBEBF9BF909F0B09A9A9000909000000000000000000000000900009F0F9FBEFBFFDFBFFF9FBEF0F9CBAD0DA0D0D00D0ADB0B0A0B0900009000000000000000000009000000009000909000000090E9090DA9A9AD09FCB9CBE9AF9FFF9AFF9FBDBDF0F0BEDA9BCB90990B90000909000900000009000000090000000090F0DBDF9FBFFDFFFED9FF0F0D0F0BCB0A0F0A900C0C90D0CA9C00000000000000000000000000000000000000000090B0090A9CB09ADBDAF00BCA9FB09FE9A9FFDBFE9E9FBB9F9B9BC9B9CB00900B090A0009000909000000000000090009A9AD0FBFAFFFFCFBFCBDBE90BCB9E9AC9C9C900D0E90B0A9A9090A90000000000000000000090090000000009000B009000900090B90BDA9A90BD0F9FFD0BE9ADEBDBEF9FBFBE9F0FCBC9A90B0A99C90900909000000000090000000009000900D0BFBCFDFE9FBFEDBFDAD9EDA9E09C90B0B0CB0B00B0C9C00A09000000000000000000000000000000000000090000000900B90B0CBC0BCBCBDAF9FFFB0BDBDB9EBFDBFADBDBC9B9B90B9CB99DA0B00009000000900000000000000000000009AD9ADBBF9FFFF9FBDEBDBE9A9C9DA9E0C0CB00C090C90A0F0D0E9009000000000000000000000000000000900009090900A90E9C9B0BDB9E9FEDFFFFFF00ADADBDBEBDF9FAFFBCBCBF90B90F09909090009000900009000900000000090009009AD9FCFEF9F9FFFFF9FF0DF9EBCBC90B09009A90E90AD0900A900B000000000000000000000900000000000090000000B000909A09F0ADF0F0BFDFFFFF0DBCBF0F99FBEF9F9F9BF9090F0B909A090B009A009000009000900000000000000009E9AF0F9F9FFFFFDFFFE9FB0FD0F09E9C9A0D000090E90A0909090C090000000000000000000000000000000000B000B0009DA9A99E9F9A0F9FDFFFFFFB0B0BF0FBEFADBDAFBCBE9A9EB909C9AD9A90090090000090000900000000000000909A90F9FBFBFFFFFFFFDF9FEDFF0BDBE09A0C9A0D0B009000DAC0CA0090000000000000000000900000000090900900900009A009C9E9A9EBDBAFFFFFFDFF00DADF0F9BDBFBF9FBD9BDB9DA90B0900909009009000000900000000000000900000D0F9E9FDFFFFFFFFFBFF9FBCBDEBC9F0D0BC09A00DA00F0009A90B0A0B0000000000000000000000000000000000000909090B09A9AD0BDADF9FFFFFFFF0A9FA9F0FCBDADBE9FBE9E9A99F090B9BC0B09A900909000009090000000000000090B0ADBFBFFFFFFFFFFDFFEDFFDBDEBCBDAD09E09C0090009A00000C90C000000000000000000000000000000009A090000A00909A9F0BBCBDAFFFDFFFFFF09F09E9E9BDAFBF9F0F9B9BDAF09A900099000900900000909000000000000000000009DBDFFFFFFFFFFFFFFF9F9FADBDDF0F9ADA90E9A90CB00C9ADA900090900000000000000009000000000090900000909090BC90F0F0D9FA9FBDBFFFFFB09E9E9A9BFAF9F9EDBFADADA999A9C90B9A09B009A0000900009000000000000009099FBFFFFFFFFFFFFFFFFDFFEFDFFEB0FDAD909E900CA90090000000A9A00000000000000000000000000090000009000A000B00ADA9E9ABE9FDFBEFDFFDF00BF0BDAC9F9FBFBBCBDB9B9CBC90B09000900909009000090900000000000000000EBFFFFFFFFFFFFFFFFFFFF9F9FADBDF9ADACF09ADA9009E0B090909C0090A00000000000000000000000000A90900909090D0909ADB0BDE9AFB9EDBFFFFF000BDA9FBCBEDBCFBF9AFCB0B9A909B0909090B009000090000900000000000000099F9FFFFFFFFFFFFFFFFFFFFFFDFFCBDE9F9B0F0909CBC090CBCA0E0900AD090000000000000900000000009000000000000B00BCB0F90BDBDADEB0E9FCBE0009ADADABDBBFB9F9FDB9F90BD0BC090F0009090A90000090B000000000000000BBFFFFFFFFFFFFFFFFDFFFDFCF9EBDBDADF0FCD9ADADA09BCA9009090A09000000000000000000000000000000009009090B0009090F00F9ADE9A90F9EBFEB009ADBDAD9FADF0F0FA9BCB0F90B909B09099A900900009000000000000000000BDFFFFFFFFFFFFFFFFFFFFFFBFBFDDADEDB0FDB0AD09AC9AC090CBC90009C00B000000000000000000000090900900000A00090900BCB0BB0F0B0F0F0FEFC0F0000A0BDBE9FFBF9F9FADBD90B090B0090B0090A9009000B09000000000000009BFFFFFFFFFFFFFFFFFFFFFFDFDFDAFF9FBCF0BCBD9AD0BC90BCA900A0F00A90000000000000000000000000000009009090B000A090B9C9CB0F0F09AB0FDBFE90BC900BDBE9FDAF0B9F0BBE99F0D090B0090909090000900090000000000009FFBFFFFFFFFFFFFFFFFFFFDFFFFCBD9FE9FBDF0FCBE9AD0BCB09D0F0D00900009000000000000009000009000000000009000909C0B0DAB0BCF0B0BC9CB0ADAB0C0B0A9E9E9FBFBDBDE9F9C9BE9B0B09090A90B09A900000900000000000009FBDFFFFFFFFFFFFFFFFFFFFFFFFDBFFEF9F0FA9F9BC90DA9CB0DA0A09A0BCA9CA00900000000000000000000900090009A0A900009009A9CBCB9CBC0B0B0FDADF00BC0DBCBFBDAF9EB0B9B0BF09900909009900909000090900000000000009BFFFFFFFFFFFFFFFFFFFFFFDFF9EBFC9F9EDF09FCBC9ADA9CB0DA9E99E0D009009CA0000000000000000009000000000900090000B00BCBCB0F9EA90B0E9E9A9AF0000B00B0DAFDFF9FDBE9F90BCA99A9C9A009009009000000900000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9FF0F9A9DE09ADADBC9F0DAD09CA09ADACB00090000000000000000000000009000009000090009090F090E990F0F9B0F0F0F009C0BC9A9FBFBFFBE9F0BF9B99A0D0B0909A900B00900900000000000009BDBFFFFFFFFFFFFFFFFFFFFFFF0FF9E9F9EDDAB9E90B90E9A0B09ADA9C9E9090C9A00000000000000000000000000000B00A900009000B0B0E9BCACA9F0E0F0B0BB000A90A09E9CBDF0F9F9BD0F0DAD90B0900090900900000090000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EBF0F9ABD0F0F0C0F9CBD0DADA9E9A9CBCB9AD0DA90000000000000009000000009009000900A09A0D0BD0A9DB9E0B9F0BC90F0A09CB0DA9EBFAFBDBFAF0B09A9B0B09A9090900900000090000000000BDBFFFFFFFFFFFFFFFFFFFFFFFFFDBDAD9C9090D0F009E9B90AD0FADA9C9A9CA9000C0B0000000000000000000000090000000000000090090BC0A9DA0E9F9E00B0BEFC900BC0BCB9F9F9FBCBDBDB9F9090909C90000B0090009000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9A99A090909F090CAD9AF09E9E9ADA09E9E9A9009E900000000000000009000009009009000900090BCB0D0A9F9ADAD0F0F09B0AC90B0DA0DAF9F0FBCBCBCB0F9E9ADA909A9009009000090000000009DBDFFFFFFFFFFFFFFFDFFFFFFFFFDBE9C90D9D09A0009E9B0AD09E99E9E90DBC9A9C9E9E00A000000000000000000000000000000000090A009CB09DA0FBF00B0B0F0D00B00F0A9FA9FAFBF9FBF9F9F0B909090BC9090090000000000000009FBFFFFFFFFFFFFFFFDBFFFFFFFFD9FC9F9BDA90BC9D09000C9C0F09E9F09E9A0BCBCA9009090D00000000000900000009009000000900000909A009A0BDBCA9E09E900A09FCB0099E9CBF9FDADBDB0B0B9E90B0909000090000000000000000BBFFFFFFFFFFFFFF9FBFFFFFFFDBDFF9F90D090D9090000909A9B0BCB0F0F0F0D0909DACBCBCA0000000000000000000000000900900009A900E90DA0F9E9E9F09E90F0D000B0F00A9BF9FFAFFBDAF9F9CB9BD09A909A9009090000900000009DFDFFFFFFFFFFFFFFFFDFBFFFDBDB99C9E909090090909000090C9CBDF0F9E90BCADA009000909C00000000000000000000900000000900000900B0999E9E9E0DA9A000B0009E9E90E9FADBF9FABDBE9A9CB0B9090B090900000000000000000BFBFFFFFFFFFFFFFF9FAFDFFDBD0D009990F9CBBC9E0909090090A90ADBCBDBE90D0DAD0F0F0A0B00000000000000000090000000000009090A909A0E90F0B9A0F0C900DA0009E9AC9A9FBFDFBDFADBDF9B0F9CB090900009000000000000009BDFFFFFFFFFFFFFFFFFDBFF90009A9FBEFFFEF9CBE0900000000090F9ADBCBC9E9A9A90B0909D000000000000000000900009000009000000090BC909ADAD0E9C090000A9A00B0BDB0BCBDEBBFFBDBFA9B099AB090DA9090000000000000000FFFFFFFFFFFFFFFFFDADAD090099BF0FFFFFFF9AFF09E0F00000000090F9ADA9A9C9E9CB0CBC0A0F000000000000000000000009000009009090F0B0DAD0F0E90B0E0000F00009ADADE9BFBFFDF9EBDB9F0F0BD9DA9090009090000000000009BDBFFFFFFFFFFFFFFFFBDA900000FDFBFDBFEBC9E9E0900000900000ADAFDBDCD0B09A9CA90A9C90000000000000000000900000090000000DA090DA09A9009A0C9000009FA90C09A9BC0FF9FAFF9FADFB9BD0BA99A909900000000000000000BFFDFFFFFFFFFFFFFF9FF9CAD0090B0DAD9BD0B09090090090000090909ADAABCBCBC9E9DAD0A9E9A0000000000000000000900000090090B090A90909DA9E0D00000000E900A9AC9E0BF9FBFFDBFFDBADE90B9DBC90B0A9000000000000000BDBFFFFFFFFFFFFFFFDFF9E99909090999000090900090009000000000BC9ADD9AD009A90A9A9C900D000000000000000000000000000000A000F09ACB0A0C900A0009009B0A90009A0BF9EFFCFBFF0BD9FB9BD0B0B9090900900000000000009FFFBFFFFFFFFFFFFFBF0FFFFFF99090F09BD99C900900990009A90DAD00BDB0AD0BDBC9E9C9E0A0F0A00000000000000900000090000009090909ADB090DB0B0C9000C9EF90A9ADAD000FB9FBDF9FFFAF9BCB0BDBDA9E909000000000000009B9FDFFFFFFFFFFFFFFDFFBDBFFFFFDF99BC909A909D0BC0C90BC0DA090BD0BCBD0F000A909A099C909000000000000000000000000000B0000A0BCB0000B0C0090000B0F00FA009A9AC909EFFFBFE9FBDBCB9DB0B9A90900B000000000000000FFBFFFFFFFFFFFFFFFF9FFADFFFFFFFFFDBDBC9FDA9C9B9ADADB00D0E00AD0BCB09F9C9E9E9E0A9AC0F0000000000000000000900009009090909ADBC90C9A9CA0A90CBCBF00B0A00A9A00B9FADFBFBDBFBDA9AD9ADB9A9090900000000000009BFFBFFFFFFFFFFFFFFFF9FFBFFFFFFFFFFFDFF0BDFBDE0D0900DA0B09F9ADCB0F000B0909099C0D0B0000000000000000090000000000000009A9A090A9AD0B090CA90A090B000B0D000B0FFFFBDBCBF9CB9F99ADBD090D0000000000000009FFDFFFFFFFFFFFDBFDBF9FDBDFFFFFDFFDFFFB09FCBCB099E9E9A9AD0F00DBB0D09E90D0F0F0E0B0B0C000000000000000000000009009009A9E9C909A9000BC0CA0F0E90FA00A90B0BC00DBFF9EFFFF0FBDA9ADB9B0F909A909000000000009BFFFDFFFFFFFFFFFFFFDEBFFFFFFFFFFFFBFFC9E9BDBC9E0900D0D09A9DBAC0F9E99E9A090090900C90B00000000900000000000000000000909ABCB0C00F09A9ADFAF00B0DA90A00B0B0A00BFF9F9FBFDA9F99ADADB09A900000000000000009FBFBFFFFFFFFFFFFDBF9F0F9FDFFFFFFFDFFFF9E9F0B090A9B0B0F0DA0D9BD0A9E909CB0F0CB0F09AD0000000000000090000000000900900BC90909A99000D0AFFDFBC0FA90A90B0DAD09ADEBFFEBDFBFF0BC9B9BBDA909090000000000009FDFFFFFFFFFFFFFDFBFDF9DBFFFFFFFFFFFFDBD09F0D09E9C0C90D0B0DB0F0BFD090F090D09A9C09E00BC0000009A0000000000000000000090B0F09E90A09A0BDFFFECB0B00A00A00B0BCA09BDE9BDFBFF9BDBB0DBD0909A900000000000009BFBDFFFDFFFFFFFFFFDFADBFCBFFFFFFFFFFBFCBE909E0000B9AD0B0DB0F09C90B0F00BCB0A9C0B009F00090009000000000000900900090BCBDA90F09AC90CBCFFFEDBCACB00B09A9AF0F0F0FBFFFA9E9FFEB0DBA9BF9E9009090000000000BDFFFFFFFFFFFFFFFDBFBDBC9BDBFDFFFFDFFFDBD9E9009090000B0D0BCB9CBBCBC90BD090C90B00DA0009C0090A000000000000000009000090A9CB0BC0BCB00F0FDFACB0BCB00A00090B0F0F0F9FEDBFFBF9FB0DBCB09909A00000000000000BDBFFBFFFFFFFFFFFFDF9FBC9BDFFFFFFBFDFBFF99E9000090C90B0D09CB9C9BDBCBCADA9BC0D0B09E90A909E09C00009000000000000090B0990BC9CBC0BCB0BF0E9F9E0EB00A0A9A0A0F09AF0FBDBCB0F9FBDBB99FFB0B0990900000000009BFFFDFFFFFFFFFFFFFFFF9DB9CB9FBDFD09B9FDB0F9000000090009A0F90F9E9E99CB909C09B0090C90E90B00900B000000000000000000009E9E90B009ADA9E00BCA0A09900B0900009A9A009FADAFF9FFFFDAD0FFB90D0900000000000000BDBDBFFFFFFFFFFFFFFDBDBE9CBDFFFFF99F9FDB0FD0E99A909A90DBC990F9E9CB9EBD0CB0B0C0F0A9A09000CB09F000000000000009090909E9A90B0CBCBCBCB0B0B0F09AFB000A0A0A09AC9E09FFFDBEDAFBFFBF9A9FB9AD0B0909000000009BFFFFFFFFFFFFFFFFFFFFDF9B0909FFFFFFFFFFDBFBDAC90F0DA0009F0F0F9FBDE9D0B9C9CB090C9009CADA90E009000000000000000000B09A9EBCBE9ADACB0A0CA00A000FA9009090A09A09A09AFADBBFDFFBDBF9F9E909009000000000009DBDBDFFFFFFFFFFFFFFFFBDFDF9F9FFFFFFFFFFFDADB9AC90B0D09A90BDBCBC9ADA9FCB9A9CB0B009E090090909E0F000000000000000900BC909CBCBCF0B0E9CB09A90B0F00A0A0A0A90A0B0090F9FFFDFBFBDFE9FBE9F9A900090000000000BFFFFFFFFFFFFFFFFDFFFDFBF0F0F9FFFFFFFFFDFFFCD99E9CB009C9E9ADBDBFDBDBA9C0DB09C09E090A90CA09A09009000000009000900909ADA900FFACF0B0A00A00A0090B00900900A090ADAF0FBCBFAFFFFBDBDBDB90909A900000000099F9FBFFFFFFFFFFFFFFFDFFBFDF9F9FFFFFFFFFFFFDB9B0E9CB00B09E9FDADAD0BCBC9DBDB0CB0B090B0D0A909E9D0F9E000000000090009A9ADA9ACBDADF0B0F0B0BCBCB0FA0A0A0A0A090A90B09ADBFFDFFF9FFBFAFBF0B0900090900000009BFDFFFFFFFFFFFFFFFFFBFDFBFFDBFFFDFFFFFFFFFEDE99AD0C90DA9DA9FBDBFDF9FEBCBC9BC9CA9C000D009090A90000000000000000B0D09A9C0BDADA0FCA00E9E9E9EA0F909009000A00A00A900CBFBF9FF0FFF9FDBFDBC9900000000000ADBFFFFFFFFFFFFFFFFFFDFFFDFBFDBDFFFFFFFFFDFDBDE09A9009ADA9F0DAD0B0F099DB0F0CB0900BCB0A9CA00B0F090F000000000090009AD9ABDAFCADA0BDBB0F0FAFDFF0A0A0A0A9A09A09A9E0B0BCFFFFBFBFDFBBF9B09A09090000000099FDBFFFFFFFFFFFFFFFFFFFDFFDFFFFFFFFFFFFFFFBDA9DAC0B0BC90F0FBDBFDF9FFE9E90F90DADA090900A9C90D0BCB000000000900090B0BED0BF00900F0A0CB0F0D0EAB00B09009000A09A000900FFFBFFFFDFBF9EDBCB909000900000009FBFFFFFFFFFFFFFFFFFFFFDBFFFFBFFFFFFFFFFFFFDE9DA099C9CBBFF9E9DADABCB090F9F9ADBC909CAC00900009AD00090000000009A0B09F9AFC0D0EBDA9ADBACBEAFBDCB00A0A0A0A090A0B0B0E900FFF9FFBFFBFBBF9AD09090000000009BFFFFFFFFFFFFFFFFFFDFFFFFBDFFFFFFFFFFFFFFFFBDAD9E00B09C90F9EBDBFDBDFFF9E9AD909ADA099A0090B0000BDA00000090000900FADAD0B0A90C0F09A0DB09000ABCB09009009A00900B0B0EB09AFFFFFBFDFDFBDB9A9A0909000000099FFFFFFFFFFFFFFFDFFFFFFDFFFDFFFFFFFFFFFFDFCBDA09B9CBCBF9E9DADF0FDA9DAF9EDAE9E90DA0C900000909009C900000000900909FADAC0090B0B0F09A00E0BC909A00A0A0A0A00A0A9A00B00CADFBFFDF9FBF9ADBC99090000000009BFFFFFFFFFFFFFFFFFFBFDBDFF9FFFFFFFFFFFFFFFFBDADBC0CB0B09E9EBDB0F9ADFAD9E9BD9E9ADAD0B00000000009A9A0000000000B0DB09A9A90CAC0F00BC9AD0B0A0AE90A0B090B09A909A09ADADA09BDFBFBFBF0BFFB90A900909000009CBFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFDFCBC9009B0D0DE9F9DBCFDADFA9DAF9E9E9AD09A90C00000900909C0000000090909ABCBC000A090B00B00A90B009A99E09000A00A00A0A0B0B0A9000EBFFFFDA9F99B0F99090000000009BDBFFFFFFFFFFFFFFFFFFFDFBFDFFFFFFFFFFFFFFFFF90F0F0C9ADB9E0FEDB0BDA9DEBD0F9E9ADABC9E9A9000000000A9E00000000000F9CB0BC00D00009AC9ADAC0F0E00A9A0A900B09A9009A0A0B0E9090DBFDBFF9BF0DB9E9DA90900000009BDFFFFFFFFFFFFFFFFFFFFFDFFFDBDFFFFFFFFFFF9EFF090B0D0ACBDB9BEFDAFDA99EBDADBDE9DA9E9C000000009090909000000090B0ABC0009A000ACA0B09A9A9A90B0DA090A0A00A00EB0CB9CA90A000BFFBFF9E90BB9E99A9000090000909FBFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFF90F0D09A9DBC9EFC90BD0BDE99CADACB9E9CB09A900000090000BC000009090009D0B009A0090090900E9EDAC0AC0A90A00090A09A900B00A9CA0900BCBDBFFBDB90DB9A090090000900BDBFFFFFFFFFFFFFFFDFFFFDFFFDFFFFFFFFFFFFFDE9CF09A0A9DACBAD09BFECBDA9ACBF9BDBCBCBC9E9C000000000A9C9A0000000A9B0A00CB0C900C9A0A0A9A9A09A90BDA00A9A0A9A00A0B09A9A09A0909FFFFBF9AD0B90F99090090000900B9FFFFFFFFFFFFFFFFFF0FAFDBEBDFDFFFFFFFFFFFFB0D00D9CADBCDADAC099BC9EDB9CBCBCBCB09E9A000000000909A0C0000009000C9A900000A9A0009090DAC9E0A00AD0B0000000B09E0EADA9A09A0000BDADFF9B909B9ADB090009000990F9BFFFFFFFFFFFBDBE9FDBCBDDFAFBFDFFFFFFFDBCDB0B0A0B009A9DADBCAC0A900FA9CBCBDADFA9C9E9000009000C9B00000000090B0C0BC0B0C09A0A0A0B09A0090B0F0A00B0B0B00EA0B09A0E90ADADA9AFFBFBE9E9A9C9B0900900000009B9FFFFFFFFFFDFDFF9F0BC90A90D9EDBFFFFFFFFFFBC00D090C9E0CA900909090B90DA9DBC9F09CBA900000000090B0C900000009A900B000900B0E0900090A9CB0A0000B00A000000A909ACA9A90A9A900CBDBFDF9990909BC9A9000000099F0DBFDFFFFFFFFFBF0FCBD0BC90F9ADBFFFFFFFFFCBC9090AC0B09099C0BCBCAC0C0CB9EBCBAC9EBC9CA000090AD0A9CB00000090000CB09CB00F009A0A9A0AD0A0BC90AF0B090B0A0B0A0E0B0E9A99E9ACB00BDFAFFA9B0B09B909B0909000099A9BFFFFFFFF9FDFF9BDAD09A90090F9FFFFFFFFFDAC0A09090009E0AD00090B090B0E9CB0DBAD09E9C900000909CB00B900000909A90CA09E9ADA09000909A9AD00A90BC00A00A90090A90E90A0EB0F0BCBC9ADBDBDAD09CB0BC0900000909A9DBCBFDBFFFBFFBCBC009000909ADB0F9FFFFFFFDF9900D0BC9CB09000090000000090B09E0D0BCB0B00000000A0B0F0C000000000DA9BDA0000A0A0A0A00A900A900A0CB0A09A00A0A09A09AD0B00A0B0B0B0BFFBFF99B0909DB900900000909A9BDBFFDBFDF0F0909E0A9C0B0D09DBFBFFFFFFFACA090A00B00DAD0B00000000090009E9B0F0BCBCB0000009C90D00B000009A09A9CA09CBE909009090B00AD0E0BC9B0B00A09A9009A0BE0ABC9A9F0F0F0D0BDBDBCB09B09A9A090900909B99BF9FBDA9DB0909E0000D009C90ADB0FDFFFFFDAD909E090900F0000C00C0090000090F090E90D0F0C000009A00DA90900000009A9CB0F0B0000A0A0A0A00A90A9A00AF009A9A00A0A00000BC0AAD0A9AA0B0F0BFBFB9F0090909B000000009AD09EBDBDA0090FFF00C0000A009009FBFFFFFFFFA000900C0090BC000000000000000009E09EB0F09A00000009A90000000009009EBC90F0A9A00090000A90EB0009E90FA0009A0090A9A000B09A0BCBD9BCB0F9E9FF9B90B09F00F090900909B9999EBD90009BFFE0000AC9E009009F9FFFFFFDFDA009A90000EF0A00000000000009A09F09CB0F0D00000090C0F00F0000000BC90BF0AD0000B0A0B090A900E9A0A0F00B0A00B0A00009A00E0CB0B0AACB0BCBFBF9EBF9090099090000009090BCB9FBE900009C09E0000009009BE9FFFFFFFF09090C000B09000C0000000000009A9CA0BCB0CBCA000000009A0090000090909AFC0E9A0A0B000000A00A0B00090009A0A09A000B00A0090B0B0A0CB990DADBDBFFBD90F099A009A909090B0BDB09FF9D0B0000000000009000BC9FFBFFFFF0F0C00B0090000000000000009009C0CB09DA9CB09000000009A0900900000009AFCB090009000A9A0A09A0900B0A0BFA909A009A00A900A0A0CA00B00EABADBAFDBF9FA9090009A090000090D90BDB9FFA90FF0000000090009F9BF9FFFFFFFF0B0B009C009E900000000000000A9A9CBCACA9CAC0000000009C090A000090B0F9000A0A0A0A000909A000A0A000009E0A09A0A0B00A09009A90F00B090CB09DBBFFF9FB09B090900B090909A99090B9FDF909E9C00090090000FD0F9FFFFFDFE9C00909A0000F09000090900A90C9A90B99CB90B000000000B0000900000090AF00C90900909A0A0A0A9A0090A9A0F0B00A009000B00A0A000A00A00A9A9AFADFF9FBF9F09000090090000B90F9F09FFBEDA909A909000009BDBEBFFFFFDFEBD0B09E0A9C09000E09E000009C0E9AC0F0CABCAD00000000000DAD900000900BD000A0A0A9A0A0000090009A0A00000B00A09A0A0B00A00900B00B09A9A9AD09FFBFFFDB09090900090A9099090B0B9F9F9BFDAD00AC0909BADBCBDF9F9FFFBD0BC0090D090000909009A909E9A90D9B0CB9C09A000000000009A9E00009A0BC0000909A9000009A9A0A00A00090A0F0A09A09A9A0A909A0A00B00A0A00E90B0BFF9FBFFB90B000900990000B099D90BFFFDEBFBFF99BCB0D9E9F9BCBFFFBFCFAD0F0000A0F0BC00A900CADA90D0F0AC0BCA9F0C0000000000009F0000000D09A09A0A000A0A9A000000A900B0A000AD0A00A000F0CAA0009A00A0909A90BE9F9FFFFFBDFA909900000A99909B0B0B99B9FBDF9F9FEF0BDA9E90BC9BDADFF9F9DA90F009000009A9CADB9CBCAD0B0D9AD09E00B00000000000000000000900BC0009A9A0B09000A0A0A90A00000A009A90B09A9A0BA9CBA9A0A90BCA00A009AB0FFBF9FFBD9B009090090A090D099C0BDFBDBDE9E9909009009F09E9ADBFCFFBE9F090F0090000009000E9E9DAF0F0AD0BC9DAC000000000000000000000A90B00CA00CB00AE0B090D00A09A0B009AF0A000A00ADAD0A000009CA0A09A9A9EBC9FBDFFFBF0BC9B00009099909A9B09BDA99CB09A9000009009A09F9BDFBDBFBC9FCBEF090009000000909009A09C9AD0BCB0A0900000000000000000009090BC00B0B0B0CA90900A0A0A90A00000A0AD0A0A0A90A0AE9A9A9A0A909A0000A90BBEFFBFBDFF9B909000000BC90990B9099EB90B09CBC9CBC9E9DBDADF0BDFFFDFE9BD99CBCB00090090A000B0D0F0BCBC0BC0DA000000000000900000000B0F00CB0C0A00B0A0A0A0B0BC0AC9A0A0009AB09090A0909A0CA009A0A0A9E0B09AF0DBFFFFFBFFDAD0B90000909A9A99CB9AD9CBC9CB09A990BF9A9ADB0FFDAFDAF9FCBEFADADCB0F0DA09C900C9A90F0F0BD0B00D00000000000000090009009AD0A0B0B0F00E90DA90000B00A00C9ADABC0A0A0A9A0A00B09A0A0F0BC00B0AC00BA9FBFDBDFBF9B90D090000B909CB9099BFB9B090F9C9AFDAFDFF9FF9EBFDBFDFBBDBDFBDBBDF0FADBE0E9F0ADFE9F0F0AD0DA0000000000000000000900F0F0AD0A00A00B0A0A0ACB0E0A90B0B00A0F0A900B000B00B0AA0F09000A0B0C0B0F09FFDFBFFBFDF0A9A0000099C09B90B0FADBCF0BF9E9BFDBF9F9BCF9F9F9BDFF0FCFDE9DEFCF0FAD9E9F9BCBDF09F0F09DA0B00000000000000000000009090000A90B09A009A090B0A9A9CA0A00A900B00A00A9A0A00A0900A0A9A9A0A9A0A0BE9FAFFDBCBFBD909909A009B900BD9999BDB9D99F9F0DBFDFBCFF9EFFDEFF0FFDBFBFEBF9F9F9DEBDF0FCBE90FE0F0BCAD0C0000000000000000000090ADAD00B0CA0CA09A000A0000000A0900B0CAF0B00B00A090B09A0AB000A00900A900909A9FBFBFBF9EBF0BC909000099B0B0B0D9BDABCB0F9B0F9E9FBDBF9F0F9DBF9FBCFDBDF0FEDAF0DEBCF9FDFFF9F9E9E9B0B000000000000000000000A90B000A0B09A90A00A900A00B0A09ACB0CA90BE00A0A90B0A0A00B000B000A0A00A0A0A0DADFFFDF9FFDBD09A009A99AC0999DB0BCBD9B9F9C9F9FBDBDBCBF9FBFADFADEBDADADFDBFDBFB9DBFCBE9E9E9E9E9C0D000000000000000000009009AF09AD000A00A9A900A909A0090A0A00B00AD09A0900A0A9A90B009A000B0090B009A09A9BFBDBABDBBF9A9090099E99BDA9A9099B0BCBCB9BF9E9FAFDBFCBDAD9F9DFBDBFFFBFBEDBCFCFEFCBE9F9E9E9E9CA9A0000000000000000000000DAD00E00B0A90A90CA0A0A0A00A0A0090A0A90BA000A0B09A000A00A000A0000A000A090A0BC9FFFFDBFDEBDB0090009A9099F9B09E9F99BF9E90F9BDDB9E9BCBDAF9EBC9FCBDBDEDFADBDBF9DBFDADE9F0F9CB9C00000000000000000000009A90F009A000A00A0B0009000A9000B0A9090A0CBA90000A09A0B0B09A09000A00A090A00090BCBFF9E9BF9FBFF909A099F9A9A9D09090F090B9F9BCFB9FF9FDBDBDAF9FBEB9FEDBFBDFFEBCFEBCBDFBDADBCBACA90000000000000000000000A9E9E9AC9A900B0000A9A0A9000A90000A0A000BC9A0A9000A09A00A000A0A900900A000B00A09BDBFFFDBFBDBDAD09000B0DB9FB9A9099BDBD09ADB9EF0BDBADADF9DADF9FEF9FCFDFADBDBDBDFBE9EADBCBC99C00000000000000000000090D09A000B000A000B0A000090A9A00A9A00009A0F0A0000A0A90A00B00A00000A0A0B00B000B099EFFFBDABFDAFB99A90099FB0DB0090B0F09A9BBDB9F9BDBCBDF9F0BFFF9EDF9EFBFAFDFDEDAFE9EDBDDBCBC9E0A00000000000000000000000A0BC9CB00A0000A0090A9A0A0000A00009A0A009B00B00090A90B00A90B0A00000000000A000A09A9FFBFCBFF0FFADA99A09DBA9F900099F9DAD09E9E9CBDBDA9E9FF0F0FFBFF9FDFDBFAFBFDBDF9EDABCBC9A9C0000000000000000000000909F0BA00A09A9A09A0A000900B0A090A0A000000E9A000A0000A00A90A00090A090A0A0A09A09000DBFDFBFDBDF9FDBDAD9E0BDDB9F9900B0B99B9F99BF9BCB9F9BDADBDF9FCBFFBEBFCFDFDAFCBEF9FDE9E9EDA909000000000000000000000A09FC0B00A000000090A0A0A0009A00900A0B0A0BF0B0A00A0000B0A09A0A0000A0090090000A0B9A0BFFFFBFFBE9FFADAB990BA9EB0B0909DAF0B0FBC9DA9BCBCFBDBCBBCFBDE9FDFDBDBCBF9FDDBE9E9F9E9AC0A000000000000000000000909E90BCA900A0A0A0A0090000A0000A0A9000000E000090090A9A0009A0900A0000A00A0A0A00900C9FFBDBCBFFDBFBDBD09E9BDFB9D090B9A999CB909BA9FCBDBBCBCFBCFBDFBFCBFAFFEFFCFFEBE9F9F0E9AD0D000000000000000000909AC9EBCA00000A900900000A00B0000A090000B0A9AB9A0A0A0A00000B0A0A0A00B0A00000000900A0B000FFFFFFBFFF0FBCBDB9E9B9F9A909CBD9E9BDA9E9D0B9F9EDBDBFDFBDAFCFBDFF9F9F9F0F9FDEFADF9EDA0A90000000000000000000090A900C0B0B00000A000B0000000A09A0A9A000000CB09000000A0B00009000900009A0B00B00A09009A90BFBDBDBFFFDF9ABCB9E9E9F9E9A90BA909AD99A9F0F0F9BCBDAF9EFDBFDEBDCFEF0FFF9E9F9CFADA9ED90C00000000000000000000090BC0B0000A00A000A0000A00A900000000B00A00BCA0A090A00000A0B0A9A0A00000000000A00A09AC0BDFFFEBDADBFAFDF9F0F9FBCB9099BD9F0990BE9F0BD9BCBDBE9FEBDAFDBFDFBF9FFDADEFF0FF9FADE9ACB00900000000000000909A00BCA000A0A09A00A0900A0900000A0A9A0A00A900DA9000A09009A09000000000A0A00A0A0009000A0900BF9FBDBFBFFFDA99A9B0F9F9E90BCBE90F0BC990BD0BE9F0F9FDBDFF9FE9FAFDFCFADFBD0FF0F0DF0BC900000000000000000000009DA9009A9090A090000A0000A0A0A000009000000AB0A0A000A0A00A0A0A9A0A9009000900B0A0A9009AD00FFFFFCBDBDFBFEFDADB0FBF9AC9B99A99099A0F90BD9E9F9EF0FF0FE9FEDFDAFBDF0FCBFA9FCBF0BCB000000000000000009009C90AD0CA00A0A0000A9A0000A00000090A0A0A9A0A00CF090B0000000009000090A0A00A0A00000000A0000A90BDBFF9EBBCF9FBFDADB9DAF99ADAD9A09E9990BD0ADB9CF9BF0FF9FF9FBEFDFCBFF9FCFDE9FCBCDAC9E90000000000000000A00A90A909E9000B0A00000A090A9A0B0A090000009000B00A000A900A9A0A0B0A000000A9000B0A9A0009A9AD00BFF9FF9FDBFFF0FBDBCBBDBE909B9AD0B9A0C900B9ADAB9EDFF9CF0FEFDBDADBFCBCBF9EBEDBDBAD9A0000000000009000009009CBC0AA0A0B00090A0A090A000000000A0B0A0A0A0ACB0000A00A00000000000A90A000A9A000009A00000009E9FBEBFCBF0F9FDADAFBCBF990F9E90909C9B0E9D0DB9CFB0F9EFBFB9DBEFFBFCBDFF9EFD9F0E0D0AC90090000000000900900B0B09AC909A00A00A90D0A0009A0B0A9A0A009A00000BCA9A09000B000A90A0B000009A0000A0A9A00A0A9A9C09BDFDF9FA9FAFBFFBDBDBD0FA90B99F0B0000990A9B0FB0DF0FBDCFCFADF9EDBFFEBCFBDAF0F9DAC9000000000009000090A09C0DAC90A0A0F00B00A0A00A0A00000000909A000B0B0B00000A0A000A90A000000A00009A0909000A090000A900EBFBFFBDB9DBCBDFADAFB9FDAF9E900DB09000900C90DB0BF0FBF9BDFA9F9FCBDDF9EDBDADACB9B0F000000000000900090CA9A09A0D0BC00A00A90B0A9090A9A0B0A0A0A0A9A0000CB0A0000900A00000B0A0B00A0A000A0A0A900A0A0900A09CBFDADFCFBC9FAFDBF9FF0BC9A9A9F0000A90009B0DADBC9F9CBCFADFDEFAFDEBFEDBCF9E9F0C00009000000000000B00090009E0CA00A9A90A0A0A00E0A00000009000090000A0AB0000A000A9000A9A000000900000A0009000B0090A0A900BFFFBFBFA99EBDBFE9FE9BFDBDAD90009090009B00B0909EBCFADBDADAF9F9EBDADBEDBCBD0A9090000000000909A900A90A9DA90B00B0000A09009CB009A0A0B0A0A0B0A0A0B090CB00009A0000A900000B0A0A000B000B0A0A0000A00900F909FFFDFBDEF9CBCBDF9BFDB9EB900A9000090000D090CBC9CB9DBCBDBD0F0F9EFDEF9F0F0AC9CA09000000900A000009C09C0A9E00B00A9A090A0A0A09A0009000900000009000A0BC0A000000A00A0A0B0009000A000B00000900A000A09A00E0BDFBCBF9FAF9BFAFFDBFEF9CFBC9009000000B000B09A99CACADADAF9FDAD9A9F0F0F0D90A9000000000009009C90A90A909E9CACB00A0A00009A0A00A9A0A0A0A9A0A0A0A00009A900A000B000009000A00A0900A000A0B0A0A90A900A09A909AFFFDBFFDBE9FDBCBE9F9EB909A9C0009000090000000E9999ADAD0F0ADAFDE9F0F0F0AC9009000000000009A00B00090BCBCA900A00090A9A00900B000090000000900009A0AE000000A0000A9A0A0A90A00A00000A900000000000A09A0090FDFFBEBDAFDFCBFFF9FBFBD0F090A009000090090909090ACAC909A9ADBC90B9E9F00909000000009090909009B0D0F0F0F09000A909A0A00000A0A000A0A0A0B0A00A00A009090A0A09000A000000000009000B0A900A0A0B0A0A000000B0E00BBDFFDBDBFBFFDBFFFCBDAB0BC09000000000000000009090BCBC9C9009E9C090090E00000000000000ACA9E0C0A90B0F0BC0A900A0000000B00900A0900090009A00A9000A0E90000A00009A0A9A9A0A0A0A0000A000900000900B00A0090B0CBFBDFEBDEDBEBF0FBFFFDF90B00B009000900000000000090000A00F009A9E0F0E90900000000000B090909B090F0F90000000A00A9A09A00A0A090A00B0A0A00009000A000BCA90000A9A000000000900090A0000B0A0B0A0A0A00A90A000090FFFBDFBFBDFFDFFFF9FBE9E909000000000000000000000090909000900090009000000000000900C0BCB009E90900F0F000A9000000A0000900A000A000900A0A0A0A09A0CB00A0A000000B0A0A0A0A0A0A090A0000000090000000000A9A0F9FBFFBCBCF9FFF9F0FFF9F99E00909A0000900000000000000000090009000900000000000090A099B090C9E90BCAF0900A0000A00A0000A0A0A090B00B0A0A90000000000B0000090000A000090900009000A09A0A0B00A0A0B0A000A9009000FFDFFFFFBE9BFFFFBCBFBCB09000090000000000000000000000000000000000000000000009C9A0000A9A9AD0BD9AC00900A09000000090009A0A0A0000900A9A009A0A0CBA0A00A0A09A0B0A0A0A0A0A900A009000A900000090A900A0A0909AFBDFBDFFEDAFFFFFFDFBCBCB00000000000000000000000000000000000000000000000000009E9C9C9C09AD0AC0B000A0000A09A0B0A0A0A09009A0B0A000009A00090BC090000900000000009090000E900A0A0000A09A000A00A00009A0E9FFFBFFBDBDBDBFFDBEBDB909C90090000000000000000000000000000000000000000090A9A9090BA9AB9E9EBDA9C0A0090A00000000009000A0A0000000B0A0A00A0A0C90A00A00A0A00A0B0A0A0A90A9A0B0009A0A00A00A00000090A00090FBDFDBFFFFCBCBFFFDFFBCBCA000009009000000000000000000000000000000000009A09C90F0BC9DADCB0900C0B0000A09000A0000A00A0B00900B0A9A00000009000BA00A90A0000090009C0000A00000CA9A0000900090A0A9A0A000B0A90FAFFFCBFFBFFDBFFBF0F9B090900000000000000000000000000000000000000000000F0B0F0F9BEBDBB0F0F0B0000B0000A000A0A09000000A0A0000000B0A9A0A0A0CB0000090A09A0A00A0B0B00A9A0B0000A9A0A0A0A090000000B0009A09FBFBFDADFFBEFDFFFFBC9F000A900000000000000000000000000000000000000090090DA9BCF9F0FC9E9F0C09EB0000A00A900000A0A90A00000A9A0A00000000000BC0B0A0A00000009A0000009000000A0F0000009000A0A0A9A000A000BC0FDFFBFBFDFFBFFF9FFBF09F090090900000000000000000000000000000000009E90F0BDFEB9E9F0BE9BCAB9E9CA0A900000A09000000009A00B000900B0A0A9A090CB00000009A0A90AC9A0A0A0A00A9A9000A0B0A0A0B00900000A090A900B9AFFFDEDBFFFFFFFF0FCBF000000000000000000000000000000000000000000000F0F0FA99EDBE9F9FC0BDCF0A9000A9A0000A0A000A0A009A00A0A0A00090000A0B0A00A90A0000A09A09009000A9000A9A090090000000A0A0A900A00A0B0E9AFFFFBE9FFFBFFFFDBC9AD09000000000000000000000000000000000000900BDA9DFBDEFFADF9EF0BD0FA0F0A9A00000A000009A00000A0000090090A0A00A000E90B00A00A0900A00A0A0A00900A00000A0A0A0A9A0B0009000A000000090990BFFDFBC9EFDFFFBEBDB0F0A9000909000000000000000000000000000000000FABCFB9F9FAFF9EDAFF0F000000A00A009A000000A09000A0A00A0A0900A009A09E000000900A0090B009000A0A009A0A9009009000000A00A0A90A9A09A0A0E0DBFFFCBF9FBFFFFDFADB09C0090000000000000000000000000000000090DBC9DFBDEFEFFDF0FFBFDA00A9A00090090A000A0A00900A000090A0000A0090A000E90A0B0A0A000A0A000A0A00009A00900A0A0A0A0A0A090A090000000000090B0BDBFFFCBCFFFFFFBFDADE9A900000000000000000000000009009000900B0BFEBCBFF9F9EBFF9EDE0CB0009A00A0A000000000A00A00B00A0900A0000A090A09A000000000A90000B00000B0A00000A0090090000900A090A0A0A000A090A90F0FE9FBFDFADBFFEDEBF9BC9CA90900000000000000000000000009000BC0FCBDFFF0FFEFFDADEFAFB0000A00A000000A0A9A000000000A000A009A0B00A0000E9A9A0A00A00A0B0000A0900000A9009A0A0A0A0B0A000A00000900B000A00A09A9BFEDEF9FFCBDFBDFCF0B09000000000000000000000000009A00A000B0BDEBCBFF9FF9EFFF090C0F0B000000A00A9000000B0A09A0009A00B00000000A0A0BC00009000900000BCA90A000B000A00000900900000B000A9A0A00000A00000A09CA9FBFFE9FFFFFFBF9FCBCBC90000000000000900000900900909090DADABDBFDFEF9FFDA09E0BA0000A9A00090000A00000000000A0000000A000A090000CB00A0A0B0A00A0A0000000A000B000A09A0A0A0A09A000B000000A0A9009A0B09A09FFDFFFFE9EFFEDEFA9F009A000900000000000090000DA0D000000AD0BDEF9EBF9EF9A0DA09C90A0A0009A00A0A000A00A00A0A0900A0A0000B000A09A0B0A09000000A90909A0A0A09A0000A90A00009009A000A000A0A00900A0A0000000B000BFFFFFF9F9FF9FDF0DB0DA9000009090900000009A09A0A9E9E9D0FCBDAFDF0F9E0FA000A0A009000A00A00000A90A0000090A0A0090A9A000B000000F09A0A9A0000A0A0009000000B0A000000A9A0A0000A90B090090A000000A00A0A000B0009F9FFEFFFFFFBEFADE99CB0B09C0000A9090F009F090D0009AEB9F0BDAFBFCBF90F09E9A90A0A9000000A09000000A9A000000A000000A0000A0A009E0000000B000009A0A0B0A000009A0A9A000000A9A00A00A0A0A00A90090000000A90000BCFFFFFFFFFFDF9FB9ACB0D0DA0B09090E0909A90F0F0BDAC99CFADFEDBCBF0CAC00A0000A0000A0B00900A000A090000A000000A0A0090A0009000E90A90A0A00A0B0AC0000090A0A0A0000000A9A00009A09A009000000A0A09A09A0000A900FBFFDFFFBEFFFFEDEDFBDA9A090D0ADA99F0BDEF0F0BCABDBEFADFA9BCBCBCB090090B0A900A00000A0A000A000A00A000B00B000900A000A00A0A9A90A00900090000B0B0A0A0090900B0A0B00009A0A00CA0B0A009A0000000000090A90000009FBEFFDFFFFFFFFBDBEDBD9E9AF99CBE9FCBB9F9FDBDDAFDBCBCFDE9E9E9E000A0A0000B000B0A000000009A000009A00A000000A000A09A0000E0A00B0A0A0A0A9000009000A0A0A000900A0A00090A90000000A00A9A00A00A00A0000A90A000FBDFFFFAFFFFFFEDBEBFADF9FEB9DB0BDFCF0F0BFAFDAFDBDBE0BCBDAC9E00900B0A000A00009A00A0B000000A00000000A0A00A0090000A00DBC9A0009000900A9A0A0A9A000090A0A000900A0A090A9ADA9A0000000900000A00A0A900900009EBFFFFFFDBFFFFFDFCFBEFE9FEBCFFAFBFFFFFCF9AFDAFEDBFCBCA09A00B0A00090A900A000009000000A0A90A00A0A009000900A0A00900A00AC0B0A0A0A0ADA09000009A9A0A9000B0A0A90000A00000000B000A0A09A0000090000A00000009FFFFFFEFFFFFBFFFBFDBDBDBDBF9FFDFF9E9FBEFDAFF90FCB0F0DAC0000090A0A000B00A0A0A00A0A000000009009000A00A0A00000A0ADB00B000009009000CA0A9A0A0090009A0000900A0B00B0A0B0A000A09000000A90A000A0090A0000009FDFFFFFFCFFCBDFFFFFEFEFFFFFFBEFFFFEDBDADBCFF0BC0000000B0A0A00000A0009000000000009000A0A0A000A00B0000009A0000ACB00A0A0A0A0A0B0B090AC90A0A90A000A00A00900A0009000D0A000A00A00900000A9000A0000000000AF9FFFFFFFFFFFFFFF9F9FFFFFFFDBF9FFFEFFEFF0E0CBC0000B0009000A9009A00A0A90A0B009A0A00000000A000000A009A000A00F90A090900000900000A009A09000A00B009A09A0A009A00A0A0A90A000900A00A0000000A00B00A00000900F9FFFFFFFFE9F0FFFFFFFADFBFFEFFFFDFFF0BF9F000A0A900A0A0A900A0000A000000000A00000B0090A000B0A0009A000A0900A0E900A0A9A90A0A0B0090A000A0A90A000A00A0009A000A090900A900A0A000000A000A090000909090000F0BC9BFFFFFFFFFFFFFFFDFFFFFFFFFDEBFC09E0E0CB009000A9000000A00A09000A0A00A00000A0000A0090A00900A000A090A0AF90CA000000A000900A0A009A9090A900A0000090A000A0900A0A000A900090A00090A00A000A0A0A009A0000CBFCBCBF9FFFFFFFFFFFFFFCFFDFEA9F0F009FDB00F0A0A900A9A0A00090A0A0090000000A09000A0000A000A0A900A900A0000CAB00B09A0000B00A0900B000E0A00A009A9A0A0000A90A0A000CB0000A00A000B00009000A090000A0000B0090AD0FCFFFFFDEDFFFFFBDBFFFE9FDE0FCA00BEDF000000A00000900B0A0000A0A00B00A900A000000A000A9000A000A0000A90BD0A000A09A9A00B09A0A00B09ADA909A0000900A900000009A9A0A9A0000000A00A00A000000A09000A9000B0AD0B0B0BCA0FBFFFEF0FEFCBC9E00BCB09CBCBFADA9A9000B0A0A0A0000B0090000000000000A09A090A000A9A00B000B0A00AC0A090A00A0000B00A0C90B0FADA9E0A000A00A000A0A0B0A0000000009A00A000000000A90A000A0B000A0A0090AC900CBDFBCB00909E90BCBC00BC9E0EB0BDADA0000A0A009000000B000A0A0A00A00A0A000000000090AD009A000A0009A0BB00A09A900E9ACBE9A9AF0F9FFFF09C0B09A009A00900009A0A9ADA0A00009000B0A9A000000B00000A009000A090ACB0000000000000000000F000A9090ACBDA9A0A00900A0A9A9A00A9E90000000000000B00A000A00A9A0BE0BE9000A000CF090A00A090A9BDBCB0DBFFFFFFFFA9A0AC09A000A0A0A00090E00090A00A00A000000B0A0A000B00090A00B00A0A90000000000000000000A00BCB0A0A09A0AC0009A0A090000000B00A9EB0B0A90A9009000000A009A00F00BDCBE9E90A909A0A090E90A09ADBFF0FFFFFFFFFFFCF09CB0A00A9000900A0A009A0A090A00A00A0A000009000A00A0A000A0090090A9A9A0000000A0900B09CB00009009A090B0B000000A09A0A0000B0F9F00000A00A0A00A000000A0DA0BFCBFF0F0A000AE9E900A90A09ADFFFCBDBFFFFFFFFFFA9EBA0DA900A9A0A900090A09C00A0900900900A000A0A0000000000000A00A0000000A0B090000A0000A0A0B0A0A0000A0000A00A000A0090A9ADFBF0E0A0000000000000A90A09ABDFCBFFDFFADA9A0B000A90A09CA9ABDFBF0FBFFFFFFFFBDF9FDFA00A000000A0B0A000A0B000A0A0A00A900B0000B009A00A9A0A00A00A9A00A090000A0B009ADA909000009A0B00B0A000900B0000A0009A9FCB0900A00A0000A90000090AC9EBFFFFFFDF0E000DBA90A90A0B00DAFBCBBEDFBFBFFFDFBFFFFFDAD0A90A90000009A9000A9000000A000A00A00000A00090000900009000A90A0A0A0000A0A000A0A0A0A00000A00000B0A0000A9000A0A9E9BCA000000000A0000A00A009AB9E9FDFFFFFF9F00BC00A9E9CB00B09F0F0C9BFDE9FBEBFDFFFF9E9A000A00A9A0B0A00A0B0E0B0A9009A000000B000000A00000A009A0A09000000909A0F0909A900090090A00009A0B00000A0000A09000DADA090A09A00A90000A00000A000E9FFFFFFFF0E0A0CA9E90B0B00B0BF0F0DBBE9A9B0F9F9FBFFFEDA00B090B00000000B09000000000A0000A9A000A00A000A0A000A00000A0A0B00A0A0900A0A00A00A00A000A9A0000000B009A0A00A0A9A0B0F0A000090000A000000A0900F9FFFFFFFBCE9090B9A9AF0F09AC9E9FFBEF0DADADF9EB0BDFFDBADA00A0ACA0A0B0B000A0A0B0A0A0000B00000000900900009000000A900000000000A0A00000009000000B0000A0A00A000A00009000009FFF9F000A00A00000A09A000A0B0ABFDFFFEDB0A0A0CF090A90E09A9BFFFF9FFBDBFBFBDADA0BBEDB009A909090900C0BCBC0900009009A000A00A0A0A000A0B000A90A00A0A9000A0B09090B0B00A0A0A0B0000A00090A90A0000A00A0A9A0A9FFE9E9000000A0000000090000BC9BFFFFDAC90000BA9AF9EB90A0FFFFFFFF0FADFDFFCB0BDFDBF0E9A00A0A0A0ADABCB0A9A0B0A0A0A00A09009000000A00000A00A0900000A0B0000A0A00000A90000000A0A90A000000090A0090000009BFFFFF0A00A00000A90A00A0A0A90BEDFEFDA0B0A9A09DAF90B0CA9FBFFFFFDA9F9FBFFDBE9FBFFFFCB000A9E9C9ADABDFBE9E0000900000900A0A00A00A00000A0000000A00A000000A000000A000000A90A09000090A00A00A09000A00A00BEDF9F00000900A90000000000090EBDBF9FA0F000000EB09EBCB09A9FFFFFFFF0A9FFFFFF9FFFFFFFBC0B090BABE9BDFFFDF090B0A0A0B0A0A0000009009009A00B00A9A0000900B0A90A900B00B0A0A00A00A0A0A0A00A09A00A00A00B00B009BBE00A9A000000A00A09A009A0A90EBCF0DA0A0A0009EB90B9E0A9ADFFFFF0DBCA9FFFFFFFFFFFFDFBC00AC9DBDFFFFFFFEFA0009000000090A90A00A00A0000000000009A00A00000000A0000009009000900909000900009000900000000A0C09A900000A00000000000A0090A900B0A0909090A0F90E9E09A9CBBFFFFBFA09BFFFFFFFFFFFFFFF0B0B0BBFFFFFFFFFFF9CB0A0A9A0B0A0A00A00A00A00A00A00A00A0A00A00A00A00A00A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0B09A9A00A00A000A00A00A00A00A0A9A0B0A9A0A0A0A00B0A9A09A00B9FFFFFF000B0FFFFFFFFFFFFFFF9E00BDFFFFFFFFFFFF0A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000105000000000000B4AD05FE,'Education includes a BA in psychology from Colorado State University in 1970. She also completed "The Art of the Cold Call." Nancy is a member of Toastmasters International.',2,'http://accweb/emmployees/davolio.bmp') +GO +INSERT "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(2,'Fuller','Andrew','Vice President, Sales','Dr.','02/19/1952','08/14/1992','908 W. Capital Way','Tacoma','WA','98401','USA','(206) 555-9482','3457',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00F00000000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000C00BFE000000A9000FFFFFFFFFFCFFFFFFFC009FFC00000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB09F00000000FCBFFE9E0BFFFFFFFFFF0FFFFFFC09FFFE0000000000000000000900000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000009009F09FFC0BFFFFFFFFFF0FFFFFFFFEFFFC00000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0B00000FF0000000BFFFFFFFFFFFDFFFFFF0F9FE0000000000000000000000000000000900000000F00000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE09FFFC0A9F0000FC00BFFFFFFFFFFFEBFFFFCFFEFC00000000000000000000900000090000000000000F0000000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009CBE09C00000000BFFFFFFFFFFFFFDFFFCBFC90000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0009FF0BFA9F0A9BFFFFFFFFFFFFFEFFFFFFC000000000000000009000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009FCBC0DFFFFDFFFFFFFFFFFFFFFF9F0FC000000000000000000C0000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00AF0000000000BFFFFFFFFFFFFFFFEFE0000000000000000000D000000000000000000000000000000F00000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FC00BF0090BFFFFFFFFFFFFFFFFDFC00000000000000000C00000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD09EBFC9ADAFFFFFFFFFFFFFFFFFFFE000000000000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000009FFFFFFFFFFFFFFFFFFFC00000000000000009C0000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BFDBFFFFFFFFFFFFFFFFFFFFFFF00000000000000090000000000000000000000000000000000000F00000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FDB9FFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDBFFFBFFF99FFFFFFFFFFFFFFFFFFFFFC00000009000000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBBFFF9FDFBDFFF9BFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000F00000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FBFFDFBDFFBFFFBFFFF9FFFFFFFFFFFFFFFFFF0000000000000000000000000090A0009CB0DA9A9AF9E9BE900A00F0000000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFFFFBFFBFBFDFBFFFFF9BFFFFFFFFFFFFFFFFE00000000000000009CA90A90F00C90BDA9ADA9FF9F9E9BD9B0C9C0F0000000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFFBDFFF9FD0F9F9DFBFFFFF9FFFFFFFFFFFFFFFC0000000000000DADA99E09CB0F9BCBDAD9F9BDB0BCB9ADAFCB9A9FF000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFFBF9FFBDA9F0AD0B0A09DB9BFFFBFFFFFFFFFFFFFFE0900000009CB0B9BDA99F9BDB0F9B0B9AB0F9ADF9BDADB99BCBDA9F00000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFDBFBFDBFCF0F0FDFCBDAD0D9F0BEFDFBFFFFFFFFFFFFFFFFC000000000009CBCF0BCB0F0BDB9E9F9E9DB9E9B0F0BDB0FE9B9ADBF0000000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFDBFFFF9FF0F9FFBCB0BD0F9A9E00D090BDFBFFFFFFFFFFFFFFC0000000C0B9FB9B9BDB9F9BDA9E9B9E99A9E9ADF99F9ADB99F0F9EF0000000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFBDBDBDADEADBDA9C9F9F0FBDADA9DB0F0F9E9DBFFF9FFFFFFFFFE000000B09DA9CBCF09E9A9E9F9BD0F9ADBDB9F9A9E9ADADBE9F0F9F000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFBE9FBFBE9FDBDBCBCBFBC9E9F9E0DBDA0DB09E09E9CB9FFFFFFFFFFFC00009000A9FB99B9F09F9F9B0F0B99E9ADADA9E9F9F9B9AD9A9B0FF00000000000000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFFFDF9FDFBCDFDADA9E90B9C9CBFBCBFDBF0F9FBC9E99E9AD0FFFF9FFFFFFFE0000C0DBDB0DAD0F0BC9BCBCF9BCBC9BDB9BDB9F0B0F0F9BE9E9F9F00000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFFFFDBBBFFB9CFB0BCB0F09FDE9FA90DB9CBD0F9E9CBF99E90F9A90BFF9FFFFFFC00000B9A9ADB9BF0BDBBCB9B9BCBDBBDA9EDA9E9B9F9F0BC9B9F9AF0000000000000000000000000000000000000000000000000000000009FFFFFFFFFFFFFF9F9BDFCB0DCB0DBC9DBDBF0A9E99FF0FCB0FB9E9FBC9EB0F09EDBCF9BF9BFFFF000909CBDBDB0F09BCB0DBDADADB9A9CBDB9B9F9E9E9A9BDBFCB0F9F9F0F0D000000000000000000000000000000000000000000000000000FFFFFFFFFFFFD9BF9FFB9FCB0BCB0DBE9E90DBDB9E09CB09AD0DBDA9DBD9C99E99E9B0F0FFFFFFFC0F0A9BCBCBCB9F0B9DB0B0F9B9E9DB9B0F0DA9F9F9F9E9A9B9DB0FF9F99BBF990C000000000000000000000000000000000000000000000FFFFFFFFFFFB0BFF0FBCDADBC9E9BCB0D09AF09E0D9F9A9F0DA9E09D0A00F0BCBDA9F0F0F0FB9FFF00009CBDB9F9BCBDF0B0F9F90FCBCB0F0F9BF9F0BCB0F9F9F9EB0F9FB0BDAFDBCF9AD09A0CBCB0000000000000000000000000000000000BFFFFFFFFF0BD9FF9F9C9ADA09F09C9CB0BFD09E99FA9AD9E9F9F99F0F9F99BD9B0FD0FF9F9E9FFFF009ADA9B0F0BCB9B0B0F9E9AF9B9B9F0B90F90B9F9BDB0BCBCB9DB0F9F0BD9A9B0F90F0DB909FF000000000000000000000000000000009FFFFFFFBC9F9EF9F0F0BC9A9DA99E9A9CBD0BFD9E90DFDA9F9BCBCBCBDBCBEDBEDF9BF99F0F9E9BFFC00009C9F9BDB9E9F9D0B9F90F9E9E9F0DB0FBCF0BCBC9F9BFC9A9FBCBDABDBC9B9EB9BADBFA9AF0000000000000000000000000000000FFFFFFE90BDADBF9E90D0BC9E90E90F0F90BD0BA9FFB9A9F9E9F9F9F9F0DBDBCB9FBE9EF0BF9E9E9FF009090B0BCB0D9BCBA9BCB0F9BCB99A9F0BD09B9F9B9BA9E99BE9A9FF909DADB0DB9DAD9BC9DBD9C00000000000000000000000000000FFFFFD09BDFB9F0BC9E9A9C9A90F9CB090BDA9F9DF09FD9FDADBCBDBDE9BFBDFBDCBD9DB9FDFFBFD9FE000E000D0B9FBADBDDADB9F0BCBDAD9F0BCBFBCB9E9E9DB9FAD9BDBF9A9FAB90DA9F0B9ADB9BE9ABC000000000000000000000000000BFFFFCB9BCFB0FD0D0A909CB09CB9CB0FDBCBDF9EBDBF0BE9BDBDBF9E9BFFD0FBDFBF0FB0DBF0FFDBE90009090B0B0DB0D9A9A99EDAD9BDA9BAB9F9B9CB9E9F9F0BCBDBADA9F9DA9D9E9B9E9BC9FA9E99F9CBC00000000000000000000000009FFFE99DADB0DF0B0BD00F0B0FA9C0B9DB0DBDA9F90F9FFFDBDBFFDFF9FDBDBF9FBFDBFF9FBCBF9FAF9FBC000AC00C9ADB0BDBDADB9B0F0BDAD9CF0BCFBDF9B0B0F9BDAD9BDAFABDABD9ADB9E9BC9F99E9AF99B0000000000000000000000000FFF99EBDBDFB09E9C00F09FC90DBDB0F0DBADBD0BFF9F99FBFFDB9B9FFBDFBDBF9F9FDBDFDBDDFFDFFAFDBF090090009A9F0BCB9ADADB9F0BDAB9BDB9F0B0FDBDB0BCB9AD0BDF9DA9DABD0BDBD0B0F9E9BD9AD0F00000000000000000000000BFF09E99ADB0DB0009A99F009BDBCB0F9A9CDBCBFDBDF0FF9BDBFDFFFF9FFBDFFDFFFBFFFBFFBA9FBF9F9FCBC009A090E9C9BDB9CB9F9CB9F909DADADA9F9F9ADADBDBF0F0BCBBDA9FA9D0BCB9AB9F9A9BCBE9BF9B0000000000000000000009FE09F9DAD9ADA0D0F0D9E09FF0F0B9F9E9DBA9DBDB9EBFDBFDFFDBF9F9FFF9FBFBF9FFDBDFF9FDFBDFFDAFBFB0000000909ADA9CBBCB0BBCBCBEB9BDB9F9E9ADB9BC9A9F9BDB9DBDA9DBAF9BCBD0DA9F0DB99E90D0F00000000000000000000FF99BCB0F0E90DA090B0A9DB09F9FDE9E9DA9DEBDADFFDBFDBFBFBFFFFFF9FFFFFDFBDFBFF9FFFF9FFBDBFDBCFF009CB00AC99FB9C9BDBC9F9B990FCB0F0F9BDB0F09BDF0BC9ADFCB9E9D90F9BDA9BDA9F0DA99EB9BCB000000000000000000BF00DB0DB9B0F0090BC9D0BCBDA9A9B9E9A9FBF9F9FB9FBDBFDFDFDFF9FFFFFFFDFFFFFDFBFFBDBFBFDBEFBFFBD9F00000900AC9FABC9ADB0BC9E9B9BDB9F0F0F9F0FA9A9F9BF9AFB9E9BEBD0BDADBCB9F0B9F0F99E9BDF00000000000000000FC0BD0F90D0D00F0D09A9F9BDADBDF0F9F9F0D0F9FBDFFDF9FFBFBFBFFFF9FF9FFBFDFFBFDFFDFFFFFFF9FDBDFBEBF0090C0909B0D9B9F90F9BF0BCBCB0F9BDB9E9BD0F9F0F09E9F9E99E990BDADB0B9E99BDADB9E99F0B0000000000000000BF0BDA99ADA0B0909A9F0F09E9FBCB9F9CBC9FBF9FBDFBDABDBFDFFDFDF9FFBFFFFFFBF9FFFFBFBFDFFDBFFBFEBFFDF0000B00A9ADBA9E9E9B0F09DBDB9F9ADA9E9BDA9BDADB9E9FDB90F9BCBCBDB0DADBCBCB990F9EA9F9F000000000000000FC0DADBC9009C9E0F9CB9F9F9F09FDADBF9FBDBDFF9EBDBFDBDBFF9FBFFFFFDF9F9FDFFFFFBFDFFFBFFBFFFDBDF9FAFF0000909C9A9DBDB9E9F9F9A9BCF0FDB9F9F0BDBCB9F0F9B0BEDB0F0B090BDB9DB0BDBDAF9A99DA9EBC9000000000000BFC09D09AD0DA0099A0BCB0F0F9F9BDF9CBF9E9F09FF9FF9FBDBDBFF9FDF9F9FFFBFFBDFBDFFFFBDFFFFFFDBFFBDFBDBDF0900C0009E9A9E99A9E9F9E9B9B0BCF0F9F9A9BDA9B0F9FF9B0F9BD0BDB0F0BDBD09AD9E9F0B9F999AC00000000000FE09A9BC90B0090F0D9DBDBDBDBFCFBB9B9C9BDBFF9FDBDBDBDBDF9BDBFBFFFF9FDBDFFBFFBDF9FFBDBFBDFFFDFFBDFFBFE00B09A9C90DB9F0DBDB0B9F0F0F9B9BDA9E9F0BDBCB9E9FB0F9BC0BCB0F9BCBDA9BF9A9B0F9E9ADADB0000000000FF0DA9F09000C9E9ADB9EB0FBDAF9BBFCFFCBBDADBDBCB9F9FDBDA9FDBF9FFDB9FFBDBFBFDBFFBFFBFFFDFFBFBFBBDBFF9FF0000000B0FBADADB0B0F9E9F9F9BCBCB9F9F0BDBCB9E9BDF99ADBD09BDBCBBDBDAD0BD0F909BDB090BD000000000FFF09C9E09E9B09F09AF99F0F9F9FDDBDB9BDFDBDFBDBDFBDADF9BDB9F9F9FBDFBDFFDBFDBDFBDBDFDBFFBFFDFFDFFF0FFBDF0000D00909DB9A9F9F0F9F9A9ADBDB0F0F09E9BFCB9BCBCF9DA9A9CBDB9D0B0BDBDABD0FBC9ADBDBCB9000000009FFC9B0900000F09F9DBE9F9FF9FABDBBCFF9BE9BC9FFBDBD9B0FDADBDBDF9FF9FBDBFDFBFBDFFFBFBFBFFFBFBFBF9FF9FFBFF090A09E9A9E9D0BCB90B0F9F9F0F9F9B9FB9E9BDBCBBFB9A9DBDA90BCB0BDBDA9BD0B9909BDB0B09F0E00000000BCA09F0C90D090F0FBC9F9F0BFDDFBFC99BEDBFDBF9D9EBFBDB9F9BDBDB9FF9FDFBDBFBDFFFBDBDFDFDF9FFFFDF9FB9FF0FDF000900009F9F0BDB9E9F9BCBCBB9E9ADA90F9F9ADBD0F9E9FADA9CBDBDBCBD0B9E9BDBE9AF9E9C9FB09000000000099F00B0B0BE9BDBC9F0BF9F0BBBDF9BFFDBDB9F9FBBF9C9F9F99FD0BDFB9FFBFFFFFDF9FBDFBFFBFBFFFF9FBFFF9FF9FBFBC0000D09E9B0BDA9E9DA9E9B9BCF99F9F9F9ADADBE9FF9B099BD0B9E9A99A9F0DBC9A99F90F9B0A9CBC0000000000CB0B000DBC9CBC9BFBFC9F9FFDDF9FF9BBFBDFBF9FD9FBF9F9FFBBDB999F9F9F9F9BFBFDBBFDBDFFFFFFFFFFBFFFFBFFFFFF009A0A09CBD0B9F9A9BDB0DADB9AF0BCB0F9BF9BDA9FEDBCBCBD09BDBCBDA9F0B9E9E90F9AD9D9B99BC900000009AD9C0DA09BF99BFDBD9FBFF9BFBBF9FFDFDBF9F9FBFBDBDB9F9FD9F9FF9F9F9DBDFD9F9FDFBFFFBDBFF9FBFDFDBFFDBBFDBFF009009A9EBD0F0F9ADADB9F9E9DBDB9E9ADB0F0BDADB90B9F9A9E9BC9A9F90BDA99BDB0BDB0BADAF09AC000000099A0909DAD0F0F9BCBFBDADFF9FDBFBDBFBDBFFF9FDFBDBFF9F9BF9F09F0F9EBDB9FF9FFBFFFBFFFFDBFFFFBFBF9FBFDFBFFF000C900999A9BDB0DBDB0F0B9FA9ADB9F9BDB9F9E9FBCB9E9A9CB9E9B9DB0BDA9FBCB09CB0F0D9F99E900000009CBC0B0F0B9F9FDADF9FDBDBF9FDBFBDBDFDFFF99BDBBDBDF9FBFFD9F9F9F9F99F9FF9BFBDBDFFBFBFFFFBDBDFF9FFFDFBDFFF000B00B0FAD0F0BCBA9ADBDBCBDBDB0F0F0F0F0F9BF99E99BDA99F9E9EB0F09F909F9E9BDB99AB9CB9F90900000B909C99BC9A9FBDBBDBF9BF9FFBFDFFFBFB9F9FFFBDFBFFBF9F9FBFDBDBDB0FF9F9FBFDFFFFBDFFDFFBDFFFF9FBDBFBFFFF9FF00000C909BB9F9BD9FDA9ADB9BDA9F9B9BDB9F0BCBE99E9E99E0B9BD9F9BDA9FB0B99E9ADAD9CBBCB0F0A90009CBCA9AC0F9FD0F0DFBFDF9FF9BDFF9F9FFDBFF9F9FBFDBDBFFFF9FBBDBDBD99BDBC9DBF9FBFFFFBFBDFFBDBFBFFFFDFFFFBFFFB09C90AD0D0F0F0B0B9F9F9E9EBDB0F0F9BCB9F9BFDBC9B9BC9BDADA9A9E99F0DBDE99BDB9B0B9CB9F9F9CB909B9090D9B9F0BBDBF9F9FBFBDFFBFBFBFBDFF9BFFF9FDBFBFDBF9FFDFBDADBC9CB9BFBDBFDFFFFBFFFBFBFFBDFDFBFFBF9FFFFBC00A0090B0B9F9E9F9E9A9E9FDB0FDBD0BCBDA9E9FB09BE9E9BDADB9F9F99EB9BF0B9ADADA0DBCB9E9A90B0C0BDA09E9ADADBDFDBDBFFBD9FFFBDBDBDFDBF9FFDB9FDBF9FDBFDBF9F9DBDBDBFB9FDBDBDFBFFBFDF9FDFDFBDFBFBFDBDFFFFF9FF009090BC9BCB09B9E9BDBDB9A9F9A9ABDBDA9F9FF9DAD9F9DA9DBC9ADBCB9CBC9BDADBDBD9A9BD0BDBDBDB90DAD009F9F9F0B9FA9DBDFBFDBDFFFFFFFBFDBDBFDBFBDFFBFFDBDFBFFFBDBDBD9FDBDBDBFDBDFFFBFFBFBDFBFFFFFFFFBFFBFFFF0000E00B0F9F9F0F9F0BCB0F9F0F9F9DBCB9F0B0FFA9A9BA9DA9BBD9A9BCB9FBDA99A9A9AD9CB9F0BCB0BCB0990DA9CB0F9FDADFBFDBDFBFFBDBFFBFDFBFBF9BFF9FB9FDBDBFBDBDBD99F9DBDBDBD9FD9BFBFFFF9FDBFFBDBDBDBFBFDFBDFBFFF0090909C9A9E9B0F9F9BDB0F9F0F0F0BBCB9FDBF09F9FC9DA9F0DA9DBCB9E90BDBC9DBD9A9B9E99F99F9900BE9A9CBDB9E9BFBFDBFFFBDF9FBFF9FFBFFFDFFBD9FBDF9FBFF9FBDB9FFFFFFFF9F9FB9BFDFFFFFBFFBFDBDFFFFFFFFFFBFFFFFBF0000AC9A9F9B9CB9E9E9ADB9EB9FB9BDFBDA9ADF9F09A9BA9FBDB9EB0B9CB9BCBCB9BE9A9CBC9BF0BF0F0F9C90C9B9CBD9FD9D9BFDB9FFBFFDFFFFFFFBDBB9DBFBDFBBFDB9F0DF9FDBFFDBDFDBF9DFFDBFFF9FFF9BDBFFFBF9FF9FFBFFFFFFFF00090909CBCBCB9F9F9BDB0F99F09E9E90BDBDBFB0DBDBC9CBDADA9DBC9BDE9F9BDAD9BDA99BF09F09B0909BCB9ACB9FAF9BFBFDBFFF9FDBFBFBFBFBDFFFDFBDF9F9FD9F0D9B9FD9BDB9F9BF9FDFBDBFFFFFE99FFFDBFBFDFFFFFFDFFFBF9FFF900C0A0B9BDA9CB9E9ADADBDBE9BF9F9BFCBCB0BCBA9ADB9B0F9BDA9F9E9B9A9E9BDAF09DAD90F09F0DBD09F00D9BCB9DBCF9FBF9F9DFBBDFFFDFFDFBFBFFBDBBF9FBF09B9D9F9BD9FDBDFDBDBF9FFDFFFFF9009F9BD9FBBFBFBFBFFFFFFFBDFE09A90C0F0BDB9E9BDB9F0B0F9F0F0BCB9BDBDBDF9DBDBCADB9FE99F0B99E9DB9F0B99FB09B0F9BDA9B0B0FB09A0DBDBBDB9E9FF9FFB9FDFBF9FBDBFFFDFBDBDFDBD9DBD9CB99BDBF9BDB9FDB9DBD9BD990000909ADBF9DFDFDFFFFBF9FFFFFBF00000909BDA9E9BCBCF0F9F9ADB9F9BDE9A9ADFA9ADADB9B9F099E9BD0F9FB0F0BDBE909E9F9BCB9F09CB9C9E9DBF0FDA9FDBF9FBFDFDBFFFFFFFFF9FFBDF9F900000909B9CBD9D99C90909090900909009DBDCBD9F9FFBFFBFDFFFFFFBFFFFF009CB0B9E9BD9ADBDB9B9F0BDB0F0BCB9BDBDAF9C9B9AD0DADBDA9ADA9AF0DB9F9AD9BDA90BCB9E90DB09F0099A9DBF9FF9BFDBF9BFBFFBDFFBDBFFFF9FBDB900B090900909009000909C9AD09099CB09F9BDBBDBFBFF9F9FFBFBF9FFFDFBFFF000000CB9E9ADBDBA9E9E9FDA9F9BDB9FCBCB9FBBC9F9B9BDB0BD09BD99BF0F0BDBBCB9DBDB9CB9E90090BF9AD9F0FDB9EDBDBDFFDBDBDFFBFFFF9FFBFDFBDA9D9BDB0D90D0909B9DBD9BD99F9F9F9DBD9F9FDBF9FDFBFBF9FFFFFFFFFBFFFBFC09A9090F9F9A9AD9F9F9B0BDA9E9ADA9B9BCBFC9BA9F0F0BDF9A9F0B0F09B9F909CB9E90B0FB9E90000FD00DABCB9BDF9BDBFBFBFDBFBFFFFFFBFFBDFBF9F9FBFDBDF9BDB9DBD9F99BD9F9F9BDBDBBDFBDFBFF9FFBFFDFFFF9F9FBFBFFFF9FFB00C0A0F0B0F9F9BE9A9E9FF9BDBDB9F9E9E99B9BC9CB90BDA9AD90B0DBDBFCBCBFB9E90F9DB9C9000099B09B9DB9F0F9BDBF9DBDFFBFDFBDBF9FDBDBFF9F9FBFDBF9BFDB9FBDBDBDBDFBD9DBD9F9DDBF9FBDF9FF9FF9FBDBFFFFFDFFFDBFFFFC09A9099BDF9E9BC9F9F9BCB0F0F0BCBCB9BCBFD09BBDAD0B9F90FBD9A9BC9BDB090F9F90ABC9B9F9F90E90BC9ADF9FCBFF0FFBFF9F9FBFFFFFFFBFFF9FFFFFDBFDFFDBFDF9DBDBDBDBDFFFBDFBDBFBDBFFFBFF9FFFFFFFFFF9FBFBFFBFFFFBFF00000CBCB0B9F9FA9A9ADB9F9B9BDBDB0FCB0BEBC9CB9B9CB0F909AD9E9BF0BCB9F0B0F9D9BD9FDF9F99E9CBF9A9E9BD0FBD9DBFBFF9FDBFDBDFDB9FF9FBFDBDBF9F9F9FFF9FFDBDFFFFFFFFBDFF9FFFFFFF9FFBFDBFDBFDBFDFDFBFFFF9FFBF009CB00BDBCB0F9FDBD9ADF0F0F0B0BDB9BDBF99B0B9E9CB9F9E9F9BA9F09F9B9E9BDB09A9DBFFBFFFF090A90F9F9F9BF9FBFF9FDDBFFBFBFFBFBFFF9FFFDBFF9FFFBDBF9FF9F9FFBFB9F9DBDFBDFFFBFFFFFF9FDBFFFFFBFFBFBFDFFBFFFBDFF000009B0F9F9FA9ADABDB9F9F9BDBDADADA9F0F0D9E90B9E9A99A9C9DA9FBCBCB9E90DAD9FF9DFFDBF90F9DF9E9EBDF9F9DBDFBFBBF9FDFBDF9FDF9FFBDBFDBFFB9FF9F9F9F9BF9FBDFBDBFF9FFFBFDFDBFF9FFBFF9FBFFF9F9FFFBFFFBFFFFF09A09F0F9B0FBD9F9BD9AF9E9ADAF0F9B9F0DB09AB9F9CB9F9E9DAB0BDB0DB99CB9F9B9BF9FFBDBFFDF09E9AD9B9CB9F0FBFBF9FDFFFFBDFBFFFBFFBDFFBDBDBFDF9FF9FBF9FF9FDF9FDBF9FBFBFDBFFBF9FFF9F9FFFDF9FFFFFBFFDFFFDFBFFC09C009BC9FBCBE9ADAF9E9B9F9BDB0F0F0BBDBC9DA9A9E90B9A9D9F0BDB0FA9BCB0F0D9FF9FFBDBFFF909F9AD9FBDE9F9FD9FF9BF9FFFBDBDBFDBDFBDBDBFFD9BDBDBF9DBF9FFBFFFBFDFFFDFDBDFBFDBFF9FFFFF9FBFF9FF9FFFFFFBFFBFFFF0090BC0BB0DBDBD9BD9F9F0F0F0BDB9F9F9FB09B0F9C99BDBC9F0B0BDA9F9DADB9F99FBDBF9BDF9FBF0DB0BDBC9F9BDBF9BFF9FF9FF9BDFFFF9FBFBFBFFFDBBFD9E9F9EBDBFF9FF09FFBFFDBFBFFBDBFDF9FBDBDBFFFDBFBDFBDBFBFFFFFF9FF00A009BD0FB9F9AF0BA9E9BDB9F9F0F0BCBF0DB0DB0B9BCB09B0F09DA9DB0BDB9E90FF9DBDFFF9DBFD0B0FDBCBBF9F9F9FFDB9F9FF9FFFFBDBFBDFFDFDF9FBDDBF99DBD9F9F9FF9FBDBDB9BFD9F9FFDBF9FBDFFFFDBDBFFDBFFFF9FFFBFFFFFFC090F0DA9BDEB0F9F9DF9BCB0F0F0B9FDB9DB9CBB0D9E9BDBC9F9FA9F9ADBCB0F9DB9DBDB9F9FFBDF0DBD9ADB9D0BDBFE9BBFDBF9FFBDBDFBDBDBDBFBFBF9FFBDBBFBDBF9E9FBDF9DBF9FDFDBFBF9FBDFF9FFB9FBFFBFDBFFBDFFFFFFFF9FBFFF0000B0FBCBBDF9B0FAB0F9F9BDBBCF0BCFADA9C9BA99ADB0B0B09DA9F9A9BDB0B09FBFFDBFF9FFBFB00BDB0DABDF0F99FD9FBDBF9FFBFBFDBFFFBD9FDFDBD9FBDFDF0DBDB9D9BFFF9EFBFBFDBDFFDBFBDF9FFFFDBDF9FDBDFBFBFFBFFFFFF9FFA0900909BD9A9E9F9DBDA9BCB0D9B9F9B9FBD0B9C9F0D9AD9C9F9A9F09DBCB0DBDBD99BFF9FFF9FDC9F09F0BD9A9F9FF9FBDFBFDBF9FDF9FFDBDFFFBBFBFFFBDBDB9FB0F9FBFD9F9F99DBDFBFFFBFDBDBFFBDBDBFFBFBFFFBFDFFFFFFFFFBDBFC000DADBCBF9F9F9EBDB9F0F9FBEDA9E9EF90B9E9B09BAD9A9B9E9F09FB0B9DA9BDBFFFDFFBFFFDB0B09F0BDBE9F9BF9FBDBBDDBFDFFFBFF9FFB99BDF9FF9F9F9FBDBDF9FDBDBFFF09CB0F9FFFBD9FFFFDBDFFBDF9FDFDFBDFFFFFFFFFBFFD9FF009A090BF0F0B0FB9E9CB9B9AD9B9F9F99E9C99AD9AD9B0DADA90BDB0D9F0B9FDFDBDBF9FFF9FBF09FE9F9E99F9FCBFBDBFDBBDBF9F9F9FFBDFFFFDBF9FF9F9F9F9DB99BFDBFD99F9B9DBF999FFBDBDBFFFB9FBFFFBFBDFFBFBFFBFFFFFFBFFF000090F9DB9F9F9ADBFB0F0F9BE9E9E9BF9A9EB9AD9AD0B09BDBD0BDBA9ADA9BBFFF9F9FF9FFFDBD009ADB9E9DA9F9FCBDBFDBF9FFBFFF9FFBDF9BF9DBFBFFBF9FE9DBFD9BDBF009FDB9DBFC0909BDBDBDFFFDF9F9FFFBFDFFFFFFFFFBFFFFBFD009E90ABDA9E9F9F09F9BDBC9BDB9F0FFE9099E99ADBBDBC909A9F09DBD99DFDBDBF9FFBFF909F0BDBDB0D9BE9FBDB9FBDBF9FFBDFDBDFF9FFBFF9FF9FDFBDFF99B09DBC0009DB9B9FFBDFB99F9DBF9FF9BDBBFFFBDFFFBFFFFFFFFFFFBDBDFE09A00F9DBBDB9E9BFF0BCB0BF0BCB9F9B99F9E9DADA9C90B0BF9F0BCB09A9FBF9FF9DF9FC909FB0DAD0FD9BE9F9DBFDBDBF9FF9DBFBFF9FFF9FF9FBDB9FBDFB90F9FDB09B9D9AD9FFDBDBBFFF9FBFFFFB9FFFDFDBDBF9FFFFFFFFFFFFFFFFFFF0000909AFCB0F9BCB99F9F9F9FDB9E9BFCB0B9B09BDB9AD9F090BD9BDBC9FBDFF9FFA9F9909BFDA9B9B0BAD99BFBF9BFF9FF9FBFBDF9FFFBFF9FFDFBDF9FBDFDF9FFBDBDBDBD9BFD9FFFDFF9FFFFFFDBDFB9BFBFFFFFFFDBFFFFFFBFFFBDBFFF0090E9BF9BDF9E9BCBE9BCB0FA9ADB0F9F0D0F0F09BCB9A99F9F0BC9A9A99FF9DBFFDB9DBFDBFC9CBDE9C9BE9DA9FFD9BF9FF9FDFBFFF9FFDFFFFBDFBDBBDF9BDBDBDBFFDBCBD9FBFFBFBDFF9BFFFFF9BDDFDFFF9FDBDFFFBFFFFFFFFFFF9FFF90E900D0F0B0BDBDBDBCB9F99FBDADB9FB9A99B9ADA9F0DA90B09F9ADBD9FF9FBFF99DBFFF9FF9A9DA9DBFC9FBDF9BFFF9F9BFBF9FDBFFFFBFFF9FFBDBDDBBFDB9FBDFD9BF99BF9FFFDFFBFFFFFFFF99FBBFFBDBFFFFFBFFFFFFFFFFFFFF9BFFC0909A9B9F9F9ADABF9BDA9AF9FBDBCBF90DBCBC9B9F09B9CBD9F9AD9B0BFBDBDBD9FBDFF9FFD09DA9BE999BF9F9FFDB9FBFDFFDFFBDBDBDFFF9FF9FF9FBFDF09FD9FB9FFD9FF9FFFFF9FFFFFFFFFF9FFFDF9FFFDFBF9FFFFFFFFFFFBFFBDFFBF00AC09EDADA9F9BD09E9F9F9E9CB0BDBCB90B09F0F0F0DA90B0BC9B0D9FDDBFFD9BDFBFFFDBF0B0DBD9BCBDBCBF9FBDFBDFBDBF9F9FFFFBDFFFFFFDBFF99F9F99FF99F90BF9FF9FF9FFDBFFFFBFF9FF9FFBFF9FBFFFFFFFFFFFFFFFFFFF9FDFF0909A9B9B9BDAF0BFF9BCB0F9FB9FDBFBCBDBDA99B99B09F9C99BC9BA9BFB9FFBF9BDF9FFBFF9CBBCBE9F9ADBDBF9FBDFBDFBDBFDF9F9FFF9FBDFFFF9FFBDBDB09BFDBDBDBF9FF9FBDBDFFFFFFFFB9FF9FFFFFFFFDBFFFFFFFFFFFFFFFF9FFFFA0009CADADA9DBD90BCB9F9BF0F0B0FF99090B9CBCBC0F90B9BE99AD9FFD9FFFDFFDBFFFB9FD009C999F09F9FBDFBDBF9FBFDFF9FBFFFBDBFFDFBFBDFF9FFFBD9F99BCBDBD9F99FFDBFFBFFBDBF9FFFBFFF9FFDBFFFFDFBFFFFFFFFFBFFBFFBFD09E099BDBDBA9AFFB9F0BCB0F9FDB9BDA9EB9CB09B9B90F0F099E99BDB9BDFFB9F9FDBFDFFF0BDB0FF0BF0F99FBDBFDBDFDBBDBFFDB9FFFFFFBFDFFBF9FDBD9F09FDB9F9DBF9FFDBFDBFFFFFFFF9FBFDFBFFBFFFDBFFFFFFFFFFFBFFFBDF9FFF0009A9E9A9F9F9F90F0BDB9F9E9A9FF9C99C9A99F0D0CB990BCB90F9FF9FBFFDFBDBFF9F99F090FB09F9DB9FFBDBDFBFBFBDFBD99FFFDBDF9FDBFBDFDFBFFFBDBDA9C9F9A9DBDBFDBFFFFFFFBDBFFDFBDFFFDBFFBFFFFFFFFFFFFFFFFDBFF9FF0090CB9F9E9E9F0BF9F9ADBE9BBDE9EB9A0BD9E90B9B9CB0F99ADB09BDF9FFFBDFBDFFFBFF9F0D9F9F9EBDB9F9FFBD9FDBFBDFFFBDBDFFFBFBFDFFFBF9F9FBDBDBDBB90F9F9FBDBFDBFFFFFFFFFFFBFFBF9FFFFDFFFBFFFFFFFFFFFFFBFFDBFF9A0A90F0B9F9A9FDADADB0DBCDA9BFF9C9D0B090F9E90B9D0B0D099FFF09FBFFF9F9BFDF09F09A90F9F99BCB9FBDFBF9BFDFFBDBDBFBF9BDFFDBF9FDFFBFFDFFFDBDDF99F9F9DBF9FFFFFFBFFFFF9FFDFFFF9FFBFFFFFFFFFFFFFFFFFFFDF9FF0D090F9BD0BFDF9ADB9BCBBDBBDBCBF90B0B9DADB090BD0B09DA90F9B99FBDFFFFF9FFF99F00DBDBDA90FDBDFF9F9FBDFDBDBDFFFFDBDBDFBDBFBDBBF9FD9BFBF9F9AB9FDF9FBFDFBDFFFFFFFFFFFBFBFFFFFFBFFBFFFFFFFBFFFFBFFBFFBDBFF0009B0F0FF9B0BF9ADE9BDA9CBCBDBE9CBCB0909DBC0BD0F9A9A99FDFF9FFFFBDBD9FFCB9F9A90F9BF9B9F9B9FBF9FDBFBFFFBFF9BDFBFBDBF9FFDF9F9BF9FDBF9F9DF9B9BDF9F9FBFFFFFFFBDFBDFDBFDBFFDBDFFFFFFFFFFBFFFFFF0BDBFFC09ACBDB9B9E9FD0F9B9ADBDFB9F9BD9A999ADA9A99B09A900D9D09BF9F9BFBDFFDB0BFD9F00DBDBC9FD0B9FDBDBDBFBDBDBDBDBDFFBDFDF9DFF9BFF9FFDBDBF9FBDB0BD9F9BDB9F9FBFFFF9FFF9FFBFDFBFDBFFBFDBFFBFFFFDFFFBFFC99DBFFE0909BCBCBF9ABF9E9F9A9A9F0BCBBF90E9D09C90E9DADA9B9A00BFF9FD99FFBFBFD99BF00009E9B99AD9EBBDFF9F9FDBFFBDFFBFDFBFBFFBF9FDBDBF9B9F9DBFDBDFDBCBDFBFDBDFFFFFBFF9BFF9FFBBDBFF9FFFFFFBFFFFFFBFFFFFF09BFFD090ADA9F9B0F9F0F9F0F9FF9ADB9FF0CB99A9B0BF9B0999C9C9B99FF9F9BFFBDFFFFF0F900C9BDBDF0F9BD9CFB9FBDBBFDBDBF9F9FBDBDB9F9F9FBFF9FDF9FB9F9BDB99F9F99DBFFBFFFFDF9FFF9FF9FDFDA9FDBF9FFDFFF9FFFFFFFF009DFF0F00DB9F9ADF9F9F9A9B0F90BDB0F9DB90BE9C0D9090BCB0B0BC009BF9FD0BDFF9FFBDF9F09009ADA9B9F9FBB9FD9FBDFDBFFFDFBFF9F9FDF9F9F9F9FFBFBF9DBDBC9BCB9F9FBFF99FFFBFB9FBD9F9ADA9B9F9FBDBFBFBFFFFBFFFBFBFF09BFF00A9A9F0BDB0F0F0F9E9F0FBDADBCBBCBD09B9A0F9AD09C9C99B909FFDBF99BBDF9FF9BF00000999FDDBDA9DF9BF9FDBBF9F9BBD9BDADB0B0F9EBF9F9BDBDBF9F0FBCBDF9DBDF9FFFBFFFFDBDFBFCF9BDFDB9F9FBDBDFFDBFFFFFFFFFF0099FF0D009E9FCBF9BBF9BCB09B9E9F0B9FDB00BC9C990BDA9B9A9AD0D09BF9FDBDFDFBFF0BFD00E900F99A9F09FB9FDBFFBDFBFBFDFBFDBDBDBDF9BD99DBFDBDBDFF9F99F9B9FBDB9FBDFFFFF0BFF9E9BDBDB9BDBF9F9FFBFFBFFFBFFFFFFBF090FF0009E9B9BDAF0DBFCBDBCBDFB9FDA9BC9BD9B0B0BD090DAD0909A90FFDBFD9BFBFDF9DF00900E9BCFBDB9F9FDBBFDB9F9D9FDBB9DA9F9F9F9BDB9EB099BFDBDB9F9F9BFDADBDFF9FBFFFD9FC9BD9F9BDBFFFFFFFFFBFDBFF9FFFFBFFFFC9FFBF0A9E9BCBCBD9FBF0B9B0BDAB0F0B9FFBC00B0D0D9A9F0B909CBD009BFF9F9E9FFFFDBFB0000900DB9DBCF9E9BDBDBDF9FBF9BC9FBDB9FBDBFFBDF9DBDAD9AFBFDBDBC9DBDBDBDBFF9BFFADBB9F9F9BDBDF9BDBFFFFFBFFFFFBFFFFFFFF0B9FFDC909BDBDB9FA9CBDBDAD0BDBDBDADBDB99ADB0B0F9090DA9A90B90F99FF9F99FFFB9FDAD000E09ADABDB9F9F9F9FFBF9DBDF9BF0DBDBDBFDBDFBDBF9BDBD99DBBDADB9BDBDBDBDBDFFFF90DFBDBD9FFDBFFD909A9FFFF9909F9FFFFFFFAD0BFA9E9ADADADA9FFB9E9ADB0DADADBDADF9E0990D0900F0B99C90BC090BFF99FDBBDBDF0BD00009009B9DA9F9FBDBFDBDFBF9BAF0DB9BCBDBDBDB0DBD99DBDBBF9FDBDBDE9BDBFBDBFFBFF09FBFDADBFFFFFD90BDBDFBD0000BDBFBFFFFFF00BFADA90D9BF9BDF0BDE9BDA9F9B9F9AF9BF009BCB0B0DB90D0F0BC99B0B9DF9FF99CBDF9BDA0000009DEDB9F9AD9FBDBBFBF9BD999B9E99BC9FF9FDBF9FFF9DBDDBDBDBDB99DBF9DBFBFDFF9BF9909909090000FFFF900000F9DBFFFFFBFF09E90C90DABAF9ADA9BDA9BCB9F0BCF9AD9BCDB9C09D00B09E90B0909AD09C9BFF99E9BDBF00900000000B9ADBDBDBFADBDFDBDBDBCF0D09F9FF009F9FF9F090BE9EBFBFBFBDF0BD9FBDFDBFFE9DBC09FFF00000909FFF0009090FBFDBF9FFFFF09E900A99D9DBDB9FCBDBCBCB09FB0BDBADBBCB9A0B9C9F09A9DBC909A90B099FF9BDBFDBD00090009000F9BDADBD9F9FBBFF9EDB9900000999BF0000009FFD9999909FDBDBDF9BF9FBFBDBFDA99BB09FF009FE000FC009FFF099DBBDFFBFFFD0000A9CA0BE9E9E9BDA9F9B9EB09F9E9DFADF9C09D09A90BC9CB0B0E990F9F00F9FDBDA900000000000090D0BDBDEB9F9FDB9F9BC9E9900000BFC0000090FFFFFD099F9BD0B9BDF9F9F9FFFFFD0FD9D09000090000000FBFF090BBDFBFDFFFF0ADBC9009C99BF9BDABDB0F0F9DBC9ADBA99BF0B9B0BC90F990B09D099E9090099FB9FFD0000000000009CBB9F9BDB9FDE9BFDBFF9B90A9C9C0000009FC00BFF000BDBDFDBBDFDBBFFFFFFFFFB09BFBFBDBD0C009009F9FF000BDBDFADFBFBFE09B000A90A9AF0BCB9DB0F0F90BCBBF9AD9EFBD000D0BCB90E90DB0B0B9E9AD9A009F990000000000000009CB9F0BDFBB9FF9FB99FCBD909A9DE900009000000AD99F9BF09DB9BDFF9FFBF9FFDF090D9DADBF9FFFFF9BFA90B9FBFF9F9BFFFF9000E0900D09D9BDBCBE9F9B9AF0B0D0BDAF9BFBD9A99090F99A9AD9C9C9909A9C90000009000900900909009CBDBDBD0F090BDFE9BDBEDB0DB090FFDBC009BC99BF99F09FADBDFBDFFF9FFFDBFF9E9A99DBD9FBFFBD00D09F9FC9FBFFF9FFFFF09F9E090A00A9DA9BDBCBDE99BC9BBDA99AD9BD0AD9E9CB09E9C9B0B0B0F90C900000000000B0C000000A0DBBD0F9FBFD9BDF909F9F99BBDB09CB99FFF9FFDBFFDBCB09F9F9FFBDBF9FFFFFBFF9F9BD0B090B990909BF9BF9FBFF0F9CBFFBFFBC00F0DAC90B0F0F9E9BF9A9F0DB0D0BDAD9BEF0B99A90B09F9A9B0D09C900B9B0000000000000B00009C09BC90F9BF9DBADA90BF9E90FDFCBDFBDDA909AD09AD090909F9F9BDBDBFFFFF9FFFF9FB0D0FCBDBC9EDBDBFDBFDAD9E9F9A9BFFFFFFF09FB009000D0B9CB9F0F9F0FB0DABDADBAF9F90F0DA90F090D0D0B90BCB99C0B000000000D09C0900000F0BDB9FCBFA9DBDAD9009F9F09BDFBDFBDBFD9BBD99F9F9FF099E9F9FFFDBFFFFF9FFDDFBB9909F9B9BFFDBFDBFDBFBDBFFF0DBFFFF00BC0F009E90BDABDADB9E9B0DBAD0B9AD9CBBF90B99E99FA9A9B9CB0990E9B00D0C09000000A0000909009CBDA9BD9FF9DB9A0D9E909F099ADB9FBDBFFDFBFF90B999FBDBDBF9D9FFFFF9FFBFBBC9CB9F000C9009BDBF9BD0900090009BFFFFF90F09FE000A00D0BDBCB9E9F09DBDAD9AB9FF9CBC9E90A99C909E90DA0B90D90A0000000C09009C00A009F9B9FDBFBDBFAD0D9A090F00BF0D9E99FFDB9FBD090F9CB09DA9BC9FBBF9F9FFF9FDFD9090D0AD0000000000C00900D00009FFFBFF00BF0F00909C9A9ADA9BDE9B0BCB0BDAF9DA9F0B09B90F9DA9ADA90B09D90F0AC90000000900C000009C9A9BCBDB9F9FBC9FB00090F00BD09BF0F090B0D0000F090B0C9B0DF9BFFDFFFFFFFFFFBFBE0000900900000090000ACB0A909BFBDFFFE9C09E90E00A0D0DB9FDA9BCBDBCBDA909ADFBD0BD0E909AD9009F9C9A9E99090090090000000900900B0DADBDAFCBDBD9F9DF0000909009E0990F00D9000000000C900C990909BFBDFFBFFFDBDBD990000900F0D0000909090909C9BFFFFFFF90BF09E9000900A90FA9F0F90B09B0DBCBDABFBD0B99B0F9ADB9090B0D09E9F00000000000900A00000C09F9EF9BDBFDA9FB0BD000000D009C009090A00D09F090090090A09FF99FFFBFFBDFFFFFFF099E000900000C0A000F0C09A9FFFBFFFFFAD0BF0F0BC0090BC9DA9F0FBCBCBDA9B0BD9F90BC9E0D9AD00DBCB09A9A900900000000000009C0B090B0BDB9FDBDB9F9BDFDBF90009000009E0C009C9A0C0000000000D9FF9FFF9FFDFDFBFFBDBFF9090C000009099C9FB09BBC9FFDFFFFFFD09ADF0F0009AC009BAD0B909B090BF0DADAFF0BC9A999AD9B9B090D099C90F000F0000000000000C0A0DBCB9F0B9E9F9FDBF9AD9F000009A9099A90000090900000009909BFFFDBFFFFFFBFFFDFFF9FFDB900000A09EBF009DADBFFBFF9FFFFA9E9FFF09C000900F0D9F9E9E9CBBD09A99F9BD09B0DAC9A9C0CBDA9ADA9A90000009000000900090090099F0DBDBDBFF9BD0BDBE9BD0009FEBCBCBC909000C9000909BDBFDF9FFFFFFBFFFFFFFBDBDBFFFFFBDBD9DF990BDBE99FFFFFFFBFFFD0B0BF00F0B000090B9A9A909A9C90BC9CB0BFBD0DB99BCB9B9090909090D0BC0000C0000000C0000D09ACBDBF9FDBD9FF0FBDBD9EDBF90909F9090BCBC0F000099DBDFFFBFFFFFFDBFFFDFFFFFFFFFFFFFF9FF9FFBFFFDF9F9BFFFFFBFFFFFFA9C90FF0F00D000000E9ADA9C9A90F0B0B0F0DA0B09E0990F0DBCBCBCBCB0900900000000000090000A0D00A9FE9BFFF99F9FADBF99FFF0009000090BF9B99F9FFFBFFBDFFFFFFF9FFFFFFBFFBDFFBFFF9F9FFFFFBFFFBFFFFFFFFFFFFFFFFFBDA0AFBCBCB0A00000909C90DA9C9E09C90D09BC909E99F0F09B0990909090E900000000000000000090C9B99DB99E9B90F9F9FDB09FBCBFD09E9FDBDF9BDFFBDBFFFFFFFFFFBFFFFFFDFFFFFFFFFFFF9FFFFFFDBFDFDFFFBFFFFFFFBFFFBFFFF09BD9CB0F0C00000000000000000090000000F000090000900000000000090000000090090000009000900F0BDFF9FDF9BF0F9BFDAD9F9BFF99DB9FFBDFFFFFFFBDFFFFFBDFFFF9FFFFBFFFDFFFFFBFFFFFFFBFDBFFBFFFFFFFFFFFFFFFFFFFDE00FAFD09A9000000000000000000000000000F000000000000000000000000F00000000000009000000090D0B09FB9AD9DBDF9BDBBF9FF9FFBFFF99FBDFBDF9FFFBFF9FFFFFFFFFFBFFFFFFBFFFFDFF9FDBFDBFFFFFFFFFFFFFFFFFFBFFFFFB90090BE9EDE00000000000000000000000000F0000000000000000000000009000C00000000D00000000BC09BD9FBDFD9A9FBDEDBDF9FF9F9FDBDBFFFFFBFFBFF9FFFFFFFFFFFFFF9FFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9CB009F0B9A9E9C000000000000000000000009E000000000000000000000000009A000000900000C000900B009AF0DB0BDFBDB9BFF9FF9FBFFBFBDFF99BDFFFDBFFDBFFFFFBFDBFFFFF9FFF9FFFBFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCB000BCBDEDF00000000000000000000000000E9A09000000000000000000000C0000900000000A900090C900D099DB9FDBBCBFFDBDB9BDBDF9FDBF9FFFFBDBFFFFFFFBFFFDFFFFF9FFFFFBFFFBFDFFFBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC009F9F0B0BCB000000000000000000000000BC00A0000000000000000000090009000000000000000000AD0BD0BF0F9BC9F999F9FFDBFFBDFBFDFFBDBDFFFDBFDBFFFFDBFBFFBFFBFFFFDFFDFFFBFFFFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFDA90000BE9F09F0C00000000000000000000000CB00000000000000000000000000000000900009C009000909000BC9BDADBF9FFEDFBDBFDBDBFDBFBFDFFFBFFBFFBFDBFFFFFDFFFF9FFBF9FBFBFFBFF9FFFF9FFF9FFBFFFFFFFFFFFFFFFFFFFBF0090BC9BC0BC0B00000000000000000000000BC0000000000B00000000000000C000C00000000000000000FAC909BC9DBD9FDB9BBDBDFBFFFBFFDFDBFBFFDFFFDFFFFF9FFFFFBDBFFDFFFFFFFFFFDBFFFBDBFFFFFDFFFFFFFFFFFFFFFFFFFBD00900FDAC0BF0BD00000000000000000000000CB009A0C00000000000000009E0900090000000090000000009F09C9BA9BFB0BDFFDBFB9F9BDFDBFBFFFFDFBDFBFFFFFFFBFFBDFFFFFFFFFFFFDBDBFFFD9FFFFFBFFFDBFFFFFFFFFFFFFFFFFDAF0E09AF9F00F0DAE0000000000000000000000BC00000900000C00E00A000009000900000000000000D000900B90BC9F9C9FDBF9BF9DFFDFBFBFDFDBF9FBFFBFFF9FBDBFFDFFBFFDBFFBFFFDBFFFFFF9BF99DBFDFBFBFFFFFFFFFFFFFFFFFFF909009F00ADBF0BD00000000000000000000000E9A0000A00000B009009000000000000000000000090A0090009E90B90FBDA9F9FD9FBF9BFDFDBFBFF9FFFDBDF9FFFFFFDFFBDFFFFFFFFDBFBFFBFF9FDE99FBF9FBFFDF9FFFFFFFFFFFFFFFF9E9A090DB0D0F0BFE00000000000000000000000BC0000000000000000000000000000C000000000000090000D009BC90F909FDB9FBFBFDBFDBFBFFDBFFFF9FFBFFFBDBDFBFBFFFFBFFFFBFFFFDFFF9F0099E99FF9FFDBBFFFBFFFFFFFFFFFFBF0BC0F0A00BE9BCD000000000000000000000000DA00A090000000ACA0000009000009000000000000000C0900BC90BC90BF90BDBF9FDBFDFBF9FDBFFDBDBFBFFDBDFFFBFFFDFFBFFFFFDFFFFFBFBD090B9F99F9FFF9BFD999C9B99FFFFFFFFFCF0900090D09C0BE900000000000000000000000E9C000000000009000CA0000000000000000000000000900A09ADC9BBD9CB99ED9F9FDBDBFDFBFF9FFFFFFF9FFFBDBFF9FBFBFDFDBF9BFF9F9FFC99099F09BFDBF9FF9BFE9000FBCBFFFFFFF9F0090FC0BF0BCF00F0000000000000000000000F0A00000A00000000B0000900000000000000000090000009C09A909C0B9F0F9BF9BF9FBFDBDFDBFFBDBDBFFFBFFFFDFFFDFFDBFFFDFFFBFFFF0B00FBF09FDFBD9F09FF090B9D9099FFFFFF9A0BC0A90BC009B0BC00000000000000000000000AC9000000000000E0000000000000000000000000000000900009CBC9B9CBDB9FDBFDFBFDBFBFBFDBDBFFFDFBDFF9FFBFFBFFFFFFBFFDFF0B00909B9D0BBFFBD9B09F909090CA00FFFFFFFF0F9C909CB0F09AC9D0C0000000000000000000000DA00C00000009A090E0000000000000000000000000909000BD0A90B9CB9CBD9FBC9BDFDBDBDBDFBFFDF9FBFFFBFFBFF9FFFDBFFFDFFB9F9D9900C9F09DF9D0B09FBDAD0BC09009BFFFFFFF900A09A0C90BC9B0A000000000000000000C00000F9E0A00000900000009E00000000000000000000000000000009C090FBCB9BCBCBFF9BFBFFDBFBDFDBBFFDF9FFDFFDFFFFFFFFFFB9B9F900B0C99BF09F09FB9FDA9F000900B0009FBFFFFF0F09C0BC9AC9BEF0F9F000000000000000C0000000F0090000000A000AC0000000000000000000000000000009C09F090F09F9E9B9F9DBDF9F9FBDFFFB9FDFBFBFF9FFBFFFFBFBFFF00C09009F009AF909B9FF09C90900909009009BF9FFFFFFF000B000099AC90DA0000000000000000000000C000E00E000000000009A0000000000000000000000000000009000BF090F0BDBCF9FBFF9F9FBDBBD9FFFFBF9FFDFBFFFBFFFDFFBD099BD0BF09DBD9C9F9E9090B09BC90000BC909E9FBFFFF90909C000D0AC9F0B0D0000000000000C0000000000F090000000000000000000000000000000000000000C0AD00A0909CB909E9DB9F9F99FBFFDBDFFBDFBDFDFBFBFF9FFFDBFBFF099BC9A9C9D0B0B09BC9900090BC0000090000E9BFFFFBF9E00000090A90B00BC9A000000000000A00000000000F0A00A00000000000090000000000000000000000009090F090C0090FD09A9F9F9FFF9F9BFDB9FFBDFBFBFFDFFFFFF9FFFFD0F00FF9CB9A009FD0B00A09DBC00900009A90A90B9FF99FFF9000000E900C9F09A9C000000000000000C00C00000AD00900000000000A00A00000000000000000000000000000009A90DA9BF9F0FBF99BDBFDBFFFF9FBFDF9FFBFFFFF9FF99F0B09F90099C099F000D09D90A09090009E0C009DADF900BFF000DA00900000B00E0DA0C000000C00C000000000000DA00C000000000000000000090000000000000000900000090F09CB09DE90F9BDE9FFFBDBF9F9FBDFDBFFF9FF9FFDBF99F09C9E909BC0009F99DB0B00A09000000B00909C0B9FA09FF0000900900009DBC0B99B0000000000000000000000000AD00A0000000000000000000000000000000000000009C000000A09B0B9DF9FDF9F9F9FFF9FFBDFFBFFF9FFFFFFB0BCBF00900900C0B00BCA0000D00D0D09DAD0D0D00009B0F0909F0909A00000000A00900AC0F000000000000000000000000F0A0000000000000000000000000000000000000000000900090D00D9CBA9E9BBDBFBF9BFDB9FBDBDB9FFBDBFFFDBD99F0909BD0909000999CB0900B0000E90B0B009A9E09F0F09F90A00D0000000909000D9B00000000000000000000000000F0D00000000000000000000000000000000000000900000BC0000B00B09DB9F9FBD9DBFDBFFFFDBFFFFFFDFFFF0090F00000F0000AC009AC0900009C090B00F0C9CBAD099BE900F00C909A009000000E00F0ACBC0000000000000000000000000A0000000000000000000000000000000000000000000000000909C909FB0F9ED9FFBFDBDBDBDBFBDBDBDBF9F9090F9090F9000090909C90900D09A09E90C90090B0D9ADAD90BD0009000000000909090F00D900000000000000000000000000F0000000000000000000000000000000000000000000900900C000ADBC0DF9F9BFBDBDBFBFFBFFDFF9FFF9FFF009F90C090000900F0009A00000AC00000909ADA9C9AC99B0E90A09000A90D0000000E0000B0AD0000000000000000000000000AD0000000000000000000000000000000000000000000000000009009B0BDADF0DBFDAD9F9DF9BF9FF9BFFBFC0909CB00AD000009000B00D00900909000000900090900E9B9C9000909C00000000A900090D90A0000000000000A00000000000DA000000000000000000000000000000000000000000C0000900900F0DB0BDB9FBDAFDBF9FB9FF9FF9FDB9FD0B0DA900090000090009C0900000D0000000000090000BF90C0A009A0A0900A000090000B0A0AD0000000000000000000900E000AD0A0A0000000000000000000000000000000000090090000009E0090B0DBDBDF9BD9BFDBF9FF9FBBDBFFFD090909C009000909C00900900900000000909000000AD9C9C009090C9090A00909000C0090C90D000000000A000A000090E000000DA0909CA900000000009A000000000000000000000000009000009000DB9E9FA9FDBFF9F9E9F9F9FDBFBDBF0BC9A09000000000000090000000909090000000F09000B00B00009A0C0D09C00000000000000B000000000090090000000900000E9E0A090000000000CA0C9A0C000000000000000000000000000000909E99F9F9BDF9BF9BDBFFBDBFC9F9FC9900D000090000009000090000900000000000900009000F90E90E0090A00000000900000090BC00000000000A00A000000CA0000F0090CA00C000E9A0909A000B0000000000000000000000000000000009F00F9FCB9FCBDFF9F9FBFDFBDBF00A0D000900000090000000000900000C00000A0000000BD0009009090E90090000000090F00BC00000000000000000000090000000F000B090A0B000C0A0A00F0000000000000000000000000000000000009F9BCB99E9BDAF9BDBDFDB99FF099C9A90000000090000009000000000900090D0090090BD0AD000F00E90009A000900000000BC0B0000000000000000009E0000000F000000E090C0B0A9C00D00000000000000000000000000900000000090009F9F0F9FDBD9FDBFFAFBCBD900A000000000000000000000000000900000000000000F00000BD0090909000009000000009009000000000000A00000000000000000F000090A0A90C90A09A0A0000B000000000000000000000000000000000900F9F9F99EB9ADBF99D9F9BCBD09090900000000000000000000000000090009000000F090900B00F00009C000000009A00F00F0000000000000000000090000000F000A0A09C00A0A090A0090F000000000000000000000000000000000000009DA9E9AF9DFB9F9FFBF9FDB000AC000009000000000000000000000000000000090090000E9BC9F00000A09000900D009009F000000000000000000000000000000A00909C0A0B0909CA00D0E0000000000000000000009000000000000900009ADBDBDBDBBD0F9F9FDADBC0909000000000000000000000000009000000000000090000090C0B000AD009AC0000A000009E000000000000000000000000000000F0DAC00A09000ACA00D0A0000009000000000000000000000000900000000009BDA9F0FC9E99FADBFDBCB0000090000000000000000000000000000000000000BC0000BC090C00900F0009A0009009CB0B0000000A0000000000000000000000DA009A00A0A0D009A0000000000000000000000000C00900000000000009000C09DADB9F99E9FDBF9F9BC0090000000000000000000000000000000000000000000909000A9009E9000000C090000A00D0000000000000000000000000000000AD00A00D090DA0BC0000000000000000000000000009000000000090000000090A9DBDAFCB090FBDBCBC90000900000000000000000000000009000000009000009A00009000B0000090090000C9A90F0000000000000A000000000000000000F0B0C09A0A0A0000000000000000B0000000900000000000000000000000000009CA9E99BC9BF909C9000090000000000000000000000000000000000000000900000009A9E900900F00000B00900C9000000000000000000000000000000000F00A9A0009C90F000000000000A000000000000900F000000000000000000009000909BC09C00AD0B0F90000000000000000000000000000000000000000090E90000000C00090E900000000000B09A0000000000009000000000000000000000F000DADA00A000000000000000009C000000000000009000000000000000000000000090A9090BC90000000000000000000000000000000000000000090CA900000D090B900E9000090BC90090C00D0000000000000A9A00000000000000000F00F0A00000000000000000000000A00000A0900000000000000000000000000009000000D000D00BC90000000000000000000000000000000000000000090000090000AC00D00000AC000000CA90A0000000000000A00C000000900000000000F000000000000000A000000000000009009C00B000000000000000000000000000090009000900900000000000000000000000000000000000000000000000C90C0009090B000BC090A09A09A90090000000B0000B0CB0A00000A0000000000F0B0A900000000000090A0000000009A00000000909000000000000000000000000000000000000000000000000000000000000000000000000000000000009000000BC0AC090009A0090000C000F000000000A00009A0900000000000000000BC0000C00C00900B00A00000B0000000000009000000FE0000000000000000000000000000000000000000000000000000000000000000000000000000900000000090090000CBC09C009C09000900000000000000E09ACA0000000000000000FA90CA0B009000A000000000000000000C90AC0000000C00D090000000000000000000000000000000000000000000000000000000000000000900090000000000000000909A900000000A000BC00000000A09000090E09000000000000000009C0A90000A00A00000000000000000009000900DA00900000000009000000000000000000000000000000000000000000000000000000000000009000000900E9000000AC0000090000000900000000000000A009A0A9AC00000000000000000EBC000000000090000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000900000C9090B0C0000B00F0009C000000000090000009C09A00000000000000000DA9A000000000A0000000000000000000A000B00000000000000000000000000000000000000000000000000000000000000000000000000000900000000000000DA0000000900A009000CB0B0000000000A000000A0AC000000000000000000F0C00000000000C0A000000000A000000000000E900CB0000000000000000000000000000000000000000000000000000000000000000000090C00000000000090009E90000A09C00000B0000000000000000000A00909A00000000000000000DA00000A0000900900000000000000000000009000900090AC09000000000000000000000000000000000000000000000000000000000000000000000000009000090000909000090009C0000000000000A000000900A0000000000000000000F00D00009A0000A0000000000000000000000000000000009000900900000000000000000000000000000000000000000000000000000000000000000090000000000000C0AC90000CB00000000000000090000000A00000000000A000000000AF00A00000CAF0000000000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009A90000000B0000000000000000000A000A009A000A9C0A0000000A000F000000A0900000000000000000A0000000000000000900000000000000000000000000000000000000000000000000000000000000009009000000000000900009000C000900090000000000000000000A0000900000000C0A090F000B09C000C0000900A000000000009A000000000000A00000B00C0000000000000000000000000000000000000000000000000000000090D00000000000000000000000000E0BDA909E0900BC0000000A00000000000000009A0000B0A900A00000CA000F00000A0000000000000000000000000000000000009A00000000000000000000000000000000000000000000000000000000000009000000009C00900000000009C0000E0000BC000000000000000000000000A0000A000000F0C00000B0000AD000000000B0000000A00000000000000000000000009000000000000000000000000000000000000000000000000000000000090000000000009000000000000009009009000000000000000000000000000000000090A9E00B0000000EBC0DA0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C0000000000000000000000000090900BCA0009ACB00000000000000000000000000000A09E0C009A0000000A90A0A900000000000000000000000000000000000000000A0C09009C00000000000000000000000000000000000000000000000000000000000000009C00000000000AD00900CB0900000000000000000000000000000090A0B0B0AC000000900F00DA000000000000000000000A0000000000000000000090A00000900000000000000000000000000000000000000000000000900000000000000000A90009CA0F090B000900C000000000000000000000000000A0B0A0D0000009000000ADA000F00000000000000000090A00000000000000A000A0900000F00AC0B0000000000000000000000000000000000000000000000000000000900009A000000009000000D000B00000000000000000000000000900C0CBCA0A00000A000000000F00F0000000000000000000C90009000000000000000000A0900090000C9C00000000000000000000090000000900000009E000000900090000F000C9C0A90B0C00BC00000BC000000000000000000000000000CA9A9009009A0B0000000000B0000F0000000000000000B000AC0A000000000000DA00A0900000000090000000000000000000900000090C0000A0000000090900000000009000900009C0000B090000B0F000000000000000000000000000A0A90000A00000000000A9009A00A0F0000000000000A00000B0090000A00000A09A00C900CA00B00000000000000000000000000009000090009000D00C90000000000000000090A0B000090000000090C90000000000000000000000A0000009000A00000A0000000000A0C000000F0000000000000D00000CA0C0A000000000000B0A000000000B000A090A0D0000009000000000C000000000D0000000000000000090000000000090AC09C000DBCB00000000000000000000000000009A00A00000000000A00000000A0BCB00F00000000000000A00000090A90000A00000000000CB000000C000900009000A000000000090009000000000000090000AD0000900000D00E090DADA9000090F000000000000000000000000A000900A000000000000000090000E9A9000000000000000000009E00A00000000009000000000B0CB000009E9A00000000C0000009000D000009A00C0000000000000009000BC0ACB0F00A0900000000000B00000000000000000000000000000A00A0000000000000000000C90A90CAC9A00A0F00000000000A09009C0000A0000A00900A000000000000000009A0000A900090000000A90E0000090C0B0000F000000000000090000900000000000009000CB0000000000000000000000A0900000000000000000000C0A00A000A09A00A900F0000000000000A0C00A000000A000000000000000000A00A9E000C0B000000000090A9C009000D0A900000900000000000000000000009000C90900F00DA900000000000000000000000000E00000000000000000AC00B09A9AD0DA00000000F000000000090009A0090C090000000A0000000A90009009000BCB00000000B000E0000000000B00000090E0000900900090900009000C009000000900B0000000000000000000000000000000000000000000909A00B00CA0C0A0A0000000A00F000000000A000000000B0E00000000000000000A0A00000EBC00000CB0000090000CB000A0C0009C00A09000000000000000900000090000A9E0BC0BC00000000000000000000000000A0900000000009A9AC0E00B0E9A090A90000B000000F0000000E9000DA000000000090C00000000000000900000A90A9A00B000B000A090B000BC9090A000B0D00009C09C000000000900000A900D00900000000000000000000000000000000000A00000000AC000AB0B0C00000A000000000000000F0900090000A000000000000A09A00000000000000000009E9C00F0000C0090C0AC0ADA0ACA090DA0C0000C0A000000B00000000D09000CA000000000000000000000000000000000000000000A00B000B0E9C00CB09A090000000000000000F00000A000AD00000000000000000000000000000000000000A0B00000B000A09A00BC00D090CA000900B09090090009000900F00A0A00090000000000000000000000000000A0000000000009000000B0009A0B0A00A00A0000000A000A00000A0000000000000000000000000000000000A900000000000B0BC0A0000000000090009A0A0A900900A9C0A000C0A0000C0E0B00BC9C0000000000000000000000000000000000000000000A00A090A0009A00000000000000000000000000A0F000A00009000000000000000000000000000000000000A900C0A9C90009E000000E0A000C9C0AC0AC00000C0A90C0000A909C0F0A000A0000000000000000000000000000000000000000000000A0090A00A90A09A000000000000900000000F0F000CB000A00000000AC00000000000000000000000000B0B00A0A00A009090A09090E9A0009000090A90B00000000900A0B00F00000DA00000000000000000000000000000000000000000000000A000000000000000000000000A0000000F00009A00A00900000000090000000000000000000000A0C0000F000000000A0090A0E00000B00A900A00000000A90000000C0E9000B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000F00AC00C9000000000000A00000000000000009000900900ADA000000000B0CBCBCA900000000000900DA000090009A00090B00000C0B000A000A00000BC000000000000000000000000000000000000000A000000000000000000000000000F0090A90A0000A0000000000000000000000000A000A000A900000B0000B0CB00A09ACB00BC00000A00A00000000000000000090000B0C000000D00000009AC000000000000000000000000000000A000A9000000A0000000000000000000000ADA0000000E09000000000000A00000090DA9AC00C000000000090000900B00B09A09000000009000000009000000000000A00E0A900A90090DA00000000000BC0000000000000000000000000000C00000000000000000000000000000A0000F000000A9090C00A0090A000000000A90AA0C009A9009A000A9A0000A0000AD0CAC9E000000B00A090090A000000000009090B09000F00A00A000000000A0900000000000000000000000000000B0900000000A00000000000000000000000000AC0000000A0A00000A090090000090CA9C9A09A00A0000000000A0900A9E9A0B09A0000000000C000E00000000000B0CA0CAC0ACB0000000000000000000A00A09000000000000000000000090C0A00000A0000000000000000000000000000F09A0000000000D0000000A000000A9A90A00000C000000900C0000000000000000009A09A0009A9A00000000000000900090BC900E90000000000000000000000A0C00000000000000000000A0BC000000000000000000000A0000000000000F0000000000090A000000000A90000C0AD0F00B0B000000ACB0A90A00000B0F000BC00C00C9A0000C90B000B0000000A09A000A0B00A000000000000000000000000A000000000000000000000009E00000000000000000000000000000000000F0000000000A00000000000000A9A9ADA0000000000000000000000000000000000B00B0A00000B0A0000A0000000000000B09C0CBC00000000000000000000000000A000000000000000000000A00000000000000000000000000000000000F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010500000000000089AD05FE,'Andrew received his BTS commercial in 1974 and a Ph.D. in international marketing from the University of Dallas in 1981. He is fluent in French and Italian and reads German. He joined the company as a sales representative, was promoted to sales manager in January 1992 and to vice president of sales in March 1993. Andrew is a member of the Sales Management Roundtable, the Seattle Chamber of Commerce, and the Pacific Rim Importers Association.',NULL,'http://accweb/emmployees/fuller.bmp') +GO +INSERT "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(3,'Leverling','Janet','Sales Representative','Ms.','08/30/1963','04/01/1992','722 Moss Bay Blvd.','Kirkland','WA','98033','USA','(206) 555-3412','3355',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000080540000424D80540000000000007600000028000000C0000000E0000000010004000000000000540000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFB009A00A9009A9AA9A900009AA9ABE9EB0B0BB09A0AB0A9A9B0FA0FA0CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFE9A09A9EBEBFBB0BB0AB09AC9090AB0BCB0BA9E9AA9A90B000009AAB09009BEB0BAD0EB9E9F9B0C0B0FADB0F0BEB0FCBC0BCBFB0F0BBE0B09BA0BBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFA9DABEBFFFADFFADBF0BEBBAFAF0FBBAB9ADABADBE0AB0BCBFBC090E0A9AFA9BC90BB9AFABEE0BB0FA9ABEBE9B0FBA9AB9A9A0FB09E0BDAFA0DBE9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFB0FABFFFAFAFEABCBAA9F09AF0B9BBCBE9EBE9ADA9A990FAB0000BFA9090B09E0BAF00A9ADAB9BCBE9F0BCF0BE9FA9EB9CA90FBEAF0BFBA9ADBA9ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FE99A9FAFFFFEBDA9ADBCBFA9BA9EAFACB0B9AF9A9AFAEB0900BB9A0000A9AF0BBCB0B9E9BADAFAB0BABEBBBC9EAA9EBEABBE90B9B0B0BCBE9A9FADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBAFBA9BEBE09ABFEBABAB0F0F0F9DBFBBAFAB0FAF0B090BCBC00090B0B0A0BBE9B0BCA9AF9A9BC9E9FAD00ABAB9FA9CB9C90B0FABFF09ADBFEB00B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBE9ABDEFBDBBFFCAB0F0D0FB0BBA0ABF0FDA9F0A90009A09A0B00000000D0BDA9AFADA9BDBEBFABABBADABFBDA9E0BEB9EBABE9A9EB0FE9AB09FAFBAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B9E9FABADAFEB0BBDE9BABBA9FEDBBF0BFABC0A900BFE0BC0900B090B0B0BFAFE9A9A900A0B0E9CF0C0B0F0CADABF0F0ABBCB0B0BCBEB0A9AFA9A9E9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFABA9F9FAF0FCBCAB0BE90EDABBABCBFA090B090FBFEF009A0B00A000F0B00B0BE9EBAF9FBFBBBBABB09FABB0F9AFA9FBCFBCB0E9B9A9FAC9F0BC9F0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBF0DA0A0FBEBABBDEF9AFBBADA9CB0A0BCA00BAF0BFFE9BA9009090B09ACBBAFF0BADB0A0BADACBDE9CA0BC0BAAF0FBAEB00B0B9A0F9EB9ABAFABABBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BA9BFBACB9EDAB0BAF9AE9A9FA90900090B0F0BFBFE000CB0A00009A9B0ADB0BE900A99ADABFBABEA99A0BF0F9AF0FF0BFADA0E9BABBEBC90BC9E0BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9E9AF00FBFEBA9EBBC9A09BCA000A09A9ABCB9BFFEE9AF0B009090BAFBEB9BAF0BAFF9ACB0BFACBDBBE0DBFAF9EB0B0BE909A99B00BF0B0AABCBABDBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BA9AFBCBCBBEBBCABAD000090909009AC90B0AA9FF090B0B00A0BC90F090F9EBCB0AF9ABF0B9BAA9CB0A00FAABCBEBDAFAF0E09BE90FBF9CBB0BCA0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0FBDA0BABE90CB9B0FA9AB000A00B0A9A9A9F9EBFE0BC00090900BA9BEB0BABCB0FB0BCB0FBEBDBFA9E9BFADBCBA9A0BE90BBB0E9AFA90FA00BE9A9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A0B0EBFBCB9EBBAF0F0BC90B0090000909A9E0BBFEE900B0DA000900FA0B0B0BBE9B0BEB0B0AB0A0F0BBC0A99ABAD0BFF9EB0C009A909EBA9E9F0BCADBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9BDBFBB00BE0BAC9AFA9ABFE09A00909A0BCBA9AEBE90AB00A90A9ABFBE9F00FC9AEBC909ADB9EBFB0BC0B09AE9CB0F0A0A90B9EB090FAB0FA9A0FA90ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0A000CBE9BE99BFA90F090AB00000009090F0BFBFE0B0DA900090BCBA90AB0BEB90BAFADBA0FB0EBEBABEBC9AA9A9ABF90FA009A9EB09E9AFADA9CA9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB9FB9A9AE9BEFAF9A9ABEB9EBCB00000A0B0BE9AFF0FA090B00A90B0FADB009BAE9ADBAB0FFB0FBF09BF00B0D0F0EB00AB09EB0DA90A9AF0B0B0CB00B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0A00EBCB9BEB0BA0F0B09AE90B00B00090A909FFF09009A00090A0F9A9BAB0B0BFADA0D0F0B0BA9A9E00AF0A0BA9BC9E909AB09A09A9CA9ADACA90B0BCFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9B9BB0BE9E9E909F0BCBEB90B9CB00900BB0FAABEE0B9E090B0BDBBAF0E90C9AE90B0BAB09AFDABE9ADB9A909A9E00A90E90D0A09E0B09A9A090A00009BFE000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CACBE0BA9A9AB00B0B0BC0BCAB0B0000009AFBE9A9E090A0009ABEFABBAB009BADAF09ABE9ABBDAFBAFA9E9AD090B0A90A0A9CB0900B0DADB0B000900BC90000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB9ADBE9FA9E9EB00F0F9A9E900BCB0B900F90FBEDA9A09090A9A90BC0DB0B09AFB00BCBCB0BCBEB0BDA9E0BC0A0BC090A9090B09A9B00B0A00009000900000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A9AA9A0BF0B0BFBA90ACB0B0F0B0B00A90ABAFE90ADA0A0090DAFB0BA0BC0AFAC0BCB0BADAB0B0FEBA90B00B0900BCA9CB0A00A0000B09090900000000009000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9BF0F9FADA0BBFF0E90A99ABCB090B0E9000B9FE90E9009009AFAA9A9A9F0A909BBB0B0BC9A9EBDB0B9E0BCA9000BA009A0090B0909A900A0000000000000000090009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9A9AB0BBF0F0B0B9EBDAE90B0E0BC9AF0B00E9F0A9A9A090A9A9FAFCBB0B0B00FAF0E9AB0B0BAB0F0BBF0B0A9A909A9090A0000000009090000000000090009000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBE9AF0F09AFAF0A9EA90A90B090B09A90B0BAF090009A0909BE9BA9AFBBC0A90F0B0A9CB0F0DAFABE0000900000000A0A9090A9A900A0000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09A9ADBF0BBE9B0BBE90BBCA909A009A9AC9A0BEBA0F0009A0BEBBE09F0009A90BABE090B0B0BABBCB090B000090009090900A090000900009000000090000000009009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9A9F0A00ABE9B0FA09ABC0B9E0A9F9ADA9A9E9D00C90A9000F0BDA0DA0FBBE9E09F9FA0B0E0BCBCBAD0A009000000000000009000000090000000000000000000900000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA9A0B9DA9CB9EB0BDAD0BBC0B09000A90BF0BAA9A9A9009A90BAAFFABBA0A9A9A0A0BDAC9B09A9BE9A909000000000000009000900900000090000000000000000000900FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9ADA0A09AB0A0BE0B0A9E0B00B0B0B0A900F09E09000B000B0BFF0B0F9F9BE9A9E9BEA9BA0DA9E09E9000000000000000000000000000000000000000000000900000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE09A9BC9A9CBE9E9F0F0B09A9AD00B09C0B0B0BC9AA9A009A9ADABFADAABABCBCB09EB9C009A9A09B0A00000000009000000000000900000000000000000090000000909C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09A9C00A90A09A9A0A0BCBA0D0A0BC9A9A900BE9AC90090BCBFAFABCBADA9BA9A0A9BCAB0F0B090A0090000090900000009000000000090000000009000900000000000BE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFE90A9A90A90B090909A9A0DBA0990B00B9E09F0A9A09A000B0BFDEBE9FBEBEFAD9000B0090A0F0BCB000009000000009000000000000000000000900000000000009000BF0BFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBFFA09000090090000000909A009A0A00B00A90A0F009A09A9ADA0BADBB0A9F09B9A0F0BADB0A990BCB0000900000000000000000000000000009000000000000000000009FE0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA909090009000000000000000009A00909A09BC0BFF09AC090090BFF0FAE0BF9ABBEE0B0A9F00A900A090090900000090000000000000000000000000000000000009000900BF09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF909090000000000000000000000900090BF009E00B0BA0A90B0A9AFA9ABA9BFABAD00BFF0900BA9DA0F0B0B00000090900000000000000000000000000000000900000000009A9ED0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000090000000000000900000009000000B0B0B0BECBDA0090CB9EBFF0F009CBBAB0BEBE909E0A9009000B00090000000900000000000000000000000000000000000090000900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00909000000000900000000000000000009009009A09BF0A090A0B0ABBEBEFAFEBBCB9ADAF00A9AF090A9A9E9009000900000000000000000000000000000000000000900000090009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09000000900000000000000000000000000000A9A009FEA9BCA9090BB0FFFFABF0BCBEAB0BFEB09E9A0A90009000009000000000000000000000000000000000000000000090090090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000000000000000000000000090000000009000909AF0DA090E0F0FFFEBEDFA9EBA99AF0BF09ABE09009A9A09090000000000000000000000000000000090000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00009009000000900000000900000000000000009A00BF0BA09A99BBFAABFFBB0BE9BCBA90F0FE090BCA9A0009A000000000000000000000000000090000000000900900000000090D0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9000000000090000000000000000000000000000090A0BC9AD00A000BFBCBCBEF0BAFBCBAB0BABCBAF09009A9A0900900000000000000090000000000000000000000000000000900A9FEFFFFFFFFFFFFFFCBF9FF9FFFFFFFFD99F9FFFFFFFF000900090000000000000900000000000000000000009BEBE90A909E9F0BBFFA9EBC9B0B0BCF09EF0BC9A09A00090000000000000000000000090000000000000000000000090090A99EBFFFFFFFEF9A9BF9FF9F9F0F0BDBFFFB0FB9F09FFFFE00000900000000000000000000000000000000000090BAE900A90BABBAFAFEA9EB0BAAF0FEB00AFBE9A0900909A00000000000000000000000000000000000000000000000000009C0A9FFFFFFFB9DBDFDBFDBFBF9FBDBE999DDB9CB99A990FF090000900000000000000000000000000000000900009FBAF09A09E9E9E90BCB0E9EBDAB0DAF9CAFFE9E0B0A0090909000000000000000000000000000000000000000009000000B0900BFFFE90DB0FBFFDBFDF9FBD9F9BFFABDBFBDBDB0F90900000009090009000900090000000009000000000000A9E90A09F0BFAFAFEBBCB9E9EBF0BAF0AB9BAFA9A0909A00000000000000000000000000000000000000000000000000000000BCBFC9909B0FBDBFFF9FBE9DAF9FDB9DBBDBDBCBF99ADA00000000000000000000000000000000000000000009BEFA09A00BF0BE9A9E0B0A9A9E0B009EF0E0FE9AC90A000900000900000000000000009000000000000000000000000000900B09009ACBF0F9DBDAF9FBDFFBF9ADB9FFBCBDBDBF09F0909090000000000000000000000000000000000000009A9A909AD0B00ADCB0F0900909A9A9E0A90BFFA9EB0A090900090000000090009000000000000000000000000000000009000909009A09909F9FBFFF9F9FF99F9FDF9FB9DBDA9B99DB0B9000000000000000000000000000009000000000000000AF0E90ABCBFBEB0E9A0B00A000900C90000BEF0F9ADA000900000000000000000000000000000090000000000000000000000000090A9F09B9F9BFBFF9BFF9FBBDBDFFB9F9F9FABD9CB0909090000000000000000000000000000000000000909A90A90DA009BCBB0F00F090900B0000B0009AF0AF009A9000000000000000000009000000000000000000900000000000090009009009BFBCBFDBDF9FCB9FBDF9FB9ADF9F9B0D9A9B90000000909009000009009009000000000000009000009E0B0F0A9FAEAB0CB0B000000000900D0009009AF00B000009090000900090090000000000000000000000000090000000000900090BDBC99FBDBFBF9FB9EF9FBFF0F9F0F9ADF9BBD9E9A90900000000000000000000000000000000000000A9A0BCB0ADA009F0EB0009A900B009AC000000000009A0F0090000000000000000000000000009000000000000000000009000000900090B9AFBDBFFDBF9FDBDFF9F9FFDBF9BDB9BD0B09000000900000000000000000000000000009000000900090009009ADA0B90BCB000090900009C0D00000000090B0009000090000000000000000090000000000000000000000000000000090B9CB9DBFF99F9FB9F9B9FFFB9BF9BE9F0BCBD0B9B9090900900000000000000000000000000000000000B0A9A9A9A09A9E0AD0B09009ACA00000090090000009000090000000009000000000000900000000000000000000000000000000090909B9EBDB9FBFFBCFBFFFBDBDFF9EF9F9FDBB9BD0D0B000000009000090000000000000000000000009090090000009A090900A000A9A90909000000C00090000000000000000000090000090000000000009000000900000000000000900900A9DA9F9F9FF0F9BDB9F9BDBEBF9BD9B9E9B9C99A9A09090900000000000000000000000000000090000A00B00B09A9A09A0A9A9090900090000090090900000000009000009000000000900009000000000000000000000900000000000000099A99F9B0F9BF9FDB9F9FFF9F9FFFFBEDBCF9B0F9C9B09A00090000900000009000900000090000000000900090A00090009000000009090B090000000E000000000000000000900900900000000000000900000000000000000000900000000009E9ADBBDF9B9B9F0BF9B9FBF9B99F9F9B9EDBCB909C090900000000000090000000000900000000009009A0009090009000900909A00A0000000900009000000000000900000000090000900009000000000000000000000000000000000909AD9BDB9DB0F9E9F9F9BDF9BDBFDEF9F0FDB9B9B9CB0B9090090900000000000000000000000000000000A000A0000000000000000009090900900C0D09C09000000000000900000000009000900000000000900000000000000000000000000099BDB9EB9F9F9B0B9F9FB0F9F0BB9ADB9B09E9E9A9090A00900000009000000000000900000000000009009090000000000000900090000009A090A00C0000009000090000000009000000000000009009000000000000000000000000090099A9A9E99DB9B9BDBDB9E99F9A9BDBDF9AFDF9B99C9B0090900000900000000000000000000000000090009000000900000000000090000909A000C0D0D0F0909000900000000090000090000000009000000009000000000900000000090000009DB99FB90DADA9B9F9FB9B9F9BDBA9F99A9EDB0B0D9A900900900000000009000000000000000000000000900900000000090000009090009090900CAC0C0000000000000000000000000000000000000000000000000000000000000000009A9A9F990F9B99BD0B9090D0F9FCBD9F0BE9F990F9B0A9CA90000000000000000090000000009000000000000000000000000000090000009000E0C0C9C909000900009000900000000000009000000000000000000000000000900000000000909D9ADAF9AD0BD0BD0BDB9F9A9B90B0DF990BAF090D9009009000000009000000000909000000000000009000000000000000000000090B00F0D009A000C090000000009000009000000000009009000000900000000090000000000000000909A9BDB99099F0B90BD9B0B0BD0F9F9B9ADABD99BDA9A9009000090000000000000000000000000000000000000900900000000090090000900DE900D0D000000090090000000000009000000000000000000000090000000000000009000000BC9BC9B0BDA9090F90B0C9D90B90B09CB99D0B09CB90D0B00909000000000000000000000000000000000000090000000000000000000009ADAD00C000009C00000000000090000090000900000000000000000000000000000000000000000909B0B9C99090B9F9AB9F9B0BBD0B9F9B90B0F0F0B0F0B0909000000000000000000000000000900000000000000000000000000000000900C0DAD090C90C00000000000000009090000000000900000090000900000000000000000000000090B90D9A9ACB0BD0909C90B0BD90BD00A9CBDA999099909000000000090000000000000000900000000000000000000000000000000000000009ECF0E00C09000090090000900000000900900000000900000000000000000000000000000090090F9BC90999D9A9ADA9A90D09A9A9FBD0B909F0AD00BCB09090909000000009000090000000000000000000000000000000000000000000090009C90D0900009000000090000000000000000900090000000000000000900000000000000000009090B0B0B00B90999909A9B09C9090BD0F9A9990B00909A00000000000000000000000000000000000000000000000000000000000000000009E9C00CAC09C00000000000000090000900900000000090009000900000000000900000900000B0B090099C9BD0F0B0F9F990DB9BDA909B90D0F09090A9C9090000000000000000000000000000000000000000000000000000000090000000900C09E9090000090900000900900000000900900900900000000000000000000000000000000990D009BDA9A90B9BDB90B0F9B9ADADB9E9EB9B09ADA990B0000900900000000000000000000000000000000000009000000000000000000000000FC000C0C0090C0A009000000000900000000000000000000000000090000000000900000090090B9090999B9C999CBD99BC9F9BDBDE909DADA99090090090000000090000000000000000000009000000000900000900009000000090090000909C9090090009C0D000000000900000009009090909009000900000000000000000000000090B009BE90F0DB9BE9B9ADF9B9BDBBDBFFF0B9BDAC9A9A090090090000000000000000000000000000000000000000000000000900000000009000C00AC0C000C9009000000000000000000009000000000000000000000000000000000000009A099B099B9B90F99B9F9B9BDBDBDFFF9F0FDADA99A9C900B0000000000000000000000000000000000000900000000000000000009000000000909C9C9A90C9000C0E90090000900009000000009000009000000000000000000000000000090990B0D0BC9F9F99BDF9BDFDB9BFFFBDFFFB099F9AD90B09009009000000000000000000000900900000000000000000000900090000090909000CCAC00C00000CB0D0C00000000009000900000000900000000000000000009000000090009A90E909B999B09BDBDB9F9BBFFDF9FDFBF9FDFCB0F90A9000900000009000000000000000000000000000000000000000900000009090000000090B0C9E90D0D0B0C0CBC900090000000000090090000900900900009009000000000000000009099BD09FBDF9BDB9BDB9FD99BFFFFFFDFFFBFBDB0F99E9A909090000000000000000000000000000000000000000000000000000000909009A000C9F0C0CAC00C09C9C0E090000090009000000000900000000000000000000000000000000909F09A9B09B9F9F9F9B9DBBFFFDBFDBFFFFBDFDEDB9E9909C00000900000090000000000000000000000000000000000000009000000000000090C9CC0C90909C9CE9E0C9C00009000900009009A0000000000000000000000000000000000900B09BDBD9F0F9FB9BDBDBFD9BDBDFFFFF9FDFFBDB0F9BCB0B0090000000000000000000000000000000000000000000000000000009000090900CBCA0F0CAC0CAC90C9CBC9E9000000009000000090090900090000000000000009009000000B9DB09B09B99B9D9F9BDB99BFDBFBFFFFFFFBF9FE9F0F0BC9090009000000000000000000000000000000000000000000000000090000090000909C0DC0F090D090E9CAC0C0C0C900900000009000000000000000000000090000000000000090B09F0DBF0BD0BB99F9BDBD9BBDBDBF0DB99FFFDBFF9BD9B0BC9000000900000000000000000000900000000000009000000000000000000900000FC0FC0C0C0E0C9C0D0F09C9A0000000090000900090000000009000000000000000000009A999B9B9099DB9D9E90BDA9B9D99F9E9FBDFFF9FBFDBFCBADBC9A09000000000000000000000000000000000000000000000000000009000000000C0DEC0DAD009C9CA9E0C0CA0C09000900009000000009000000000000090000000000000909ADAD9E9F9FB0B9B99B909909A9B0999BDBBBDBFF9E9E9BD909B090000000000000000000000000000000090000000000000000900000090000909C9E90FC0E9EC0E9C09C9009C9CAD000A00009000090009000000009000090000000000000BD9B90B9B9B09DBE9DBCBB90F990D9F0F9FDFDBF9FFBF9F9EB9FC9E0000000000000090000000000000000000000000000000900000000000000000BCCDC0F0D0DAD0E9CA0C9C0009CAD0909000090900000000000000000000000000090000D0B09F9DA99BDB999B0999CBB9EBB0B9B9E9BFF9FBDF9FDAD9E9AB099900000000000000000000000000090000000000000000000000000000900000C9ACBCCADEADE0D0AD0AC00D0C0D0A000090000A000000000000000000000000000000090B9F9A9B9F0DB9ADBC9BCB99D099D9F9F9BF9F9FFDFB9EBDBBDBD9FCA0000900000000000000090000000000000000000000000000009000000009090EDCCCBDE0D0C9CAD0CD0BC00E9E0D009A00000909000000000000000000000090000090B9DB9DBDA99B9F9B99BF9B9F0BDA9B09FFFDFFFFFFBDFF9FBCBDBF0B90D0000000000000000000090090000000000000000000000000009000000000CD0BB0CE0FCADAD00F000C0C90C9E0F000900900000000900000000000000000000000BD9EB90B09B9F9F09F9F999D099999999F99FFFFFF9FFFBDB9F9FBC9F9E900000000090000000000000009000000000000000000000000000000000000DACCC9E9C0FC0CAD00DAD09ACBC0D00BC00B00090009000000000000900000000000000B99B9F9BD9F9B9F9BB9F9A9B9BD9BDF99F99FFFFFFFDFF0F09BCBF9CBDA900000000000000000000000000009000000009000000000000000000000090DAD9E9CAD0BCF0DAD0C0C0C90CB0E9C9A000900009000000000000000000000000009BDAD9E9BF0B0BDB9BDD99999D9D9F999DB9DBDFFFFFDFF9F9BFFBDBFBF0F0F090000000000000000000000000000000000000000000000000000000090C0DCC0E0D0EC90CAC0E0DAC90E90C9C0E90900A0900000000000000000000900000099E9B9B99F99BDB9BDB9B99F9990909999099FDFDFFFFFB9FB9F9BDBF0F9F990000000000000000000000090000000090000000000000000000090009000CBC0AD0F0D09ECBCBC9C0DA0D0EDA0BC900A009000009000000000000000000000090B9F9FDBF9BF99DBDA99CB09999B9B09BF99999FFFDFFDFD90B9FFBDF9DBDBE90000000000000000000000000000000000000000000000000000000000009CF09EC0E0C090C9CA0F0CD0E90CDC00E9009000B090000000000090000000000000BDA9F9BDBD9BE999BDF9999900B9F9BFFFF099099DFDFBFBDBDB9FFBFFBDADF0F0900000000000000000000000000000000000000000000000000000000900CDC9E9C90F0E9E0DC0CB0C9CE9A9AD00F00A9000000000000000000000000000909F9F9AF9BFBD9BE9B9909090B9BFBFFFBFFFFFF9D9B9FD90B90BFFDFDBFFFFBF0000000000000000000000000900000000000000000000000000000000000F0C9E9E0AC0C9C0F0909CC9E090C0D00F0090009000000000000000000000000009F99BDF99F9DBAD99CB090B9F9FFFFFBFFFFFFFFF00999BFBD9F9FFFFFFDBDFC9C90000000000000000000090000000000000000000000000009000000900D0CBECCD0D09E0F0C0CAC0BC0F0E9E0BC0900090009090000000000000000000009A9AF9B9BF9BBD9B9B909009BFF9FFFF9FFFFBFFFFF0000999A99BDBFBF9FFFFFFB0A000000009000000090000000000000000000000000000000000900000EDFC9E9AC0DA9C0F0F009C0BC0D009C0BCE9000090000000000000000000000000BDBDBDBF9BFDFBD0F090009BDBF9BFBC0BDBD09B90B909000990BDBDFDFFFFF9FDF99000000000000000000000000000900090009000090090000090000090000FE9EC9E0CCBDCD00DA9CC9E0F0E0FC090090000900009000000000000000000DB99BDB99F9B9DB9090000B090090909990909909D0000009A09F9BFFFBFFDBFFE9E0000000000000000000000000000000000000009000000000000009000DED09CC9E0D0BCCA0AD0CCE9A0D0C9D009E0000090000000000000000000000099A9FBDB9DA9B9FB009000909909B90999B0F9BDEF90999F9A9C9999BF9BDFDBFFF9F090000000000000000000000000000000000000000000000000009A000DAD0FECBC9CADE0BCDCADA90CDCADACACFC90009000090000000000000000000009F909F9FBDBDF9DB90B9F090909099090999099999F9FFFFDB09F0BDBFDFBBF9FDFBDA900009000000009000000090000000000000000000000000900009000C0F00BCACBC0DCCB0D00CE9A0F0CD0D00E0900009000000000000000000000000B9FB99A99B9B9B99E90B9F9BCB9DA9DB9FDBDF9FFFFFFF9FFDB09BDBDBB9FDDBFBEDBD00000000000000000009000009009000000000000000900000900009A9DCFDC9C9C0F0E9CCA0D09CC90CB0F0FC900000000900000000000000000000090F9DBD9BD9F0F9BC9BD9B9DB99F999B9F9BDBFFBFDFFFFFF9A9DB099BDDB9FBFDFFDBCB0000000000000000000000000000090000000000000000900000090CCAD0CA0F0CBC0D0E90DA0CA9ACF0CC0C000090900000009000000000009BF0099BB9B9BFDBB9B9B99B90BC9B99F9DBF9F9BDBF9DF9FFFF9F0F99B9DBBDABFDBDFBFFFE90090000000000000000000000009000000000090000000000900000C9AD0F0DC0F0C9CAD0CA09C90CD00DA9EDE90000000900000000000000000BF000BD0F0F09B9C9F9DA90BD99A9F9B9B99B9DB999BBFFFFDFF9F9F0D0B9DB9D9FBFD9FDBDF900000000000000000000900000000000090000009000900000009CBCDED000F00F0E9CAD0D0E0E9A0F0CC090C00090090000000000000000000909090B99B9BD9BB99A9D9F9B09D09BC99F9DA90F9D09B9FDBDF99A99B99F9DBF9DFBFFFFFBEDA900000009000009000000000000000000000000009000000000C0C0E9EFC90C90C9C0D00A0909C0D0DA9ECE90000000000000000000000000000000BDBD9F9B0D9F9DB9B909BF9BD09B0B9B99F90B9FDFBDFA9F9F9F0DB9B9F9FFBDFFFFDFDB00090000000000000000000900900900000090000000000090090D0D9C9C0AC9ACB0E90CBC9CACADACE9CC900009000000090000000000000000909B99CB9AD9F9F09B9AD09BD9090B999D99CB09B9FFFFDBFDF0BD09BB9F9FBDFFDFFFFDFFED0900000000000000000000000000000000000000000009000000C0F0CADECD0C900D00F00CA909C0D09CB0C909000900000000000000000000000009CBB9F9DB9B99F9D99B909B9B99E99A9B9090D9BD9FFDBDBDB9B99DB9F9DBDFFFFFFFFDBBC00900000000000000009000000900000900000090000009009E9C0FCDA9AC9E0FC0F0CF09CEDA9E0DE0CDA00000000000000009000009000009090F9DFF9B99F9F99B9BD9F909D9F99A99009B090B0B90FBDF9BD90F9BDBDBFFFFFFFFFFFFDE9900000000000000000000000000009000009000000900000000C9C0BCFCD0E9C09E0DA0DE0900C9CA9CB09000090000090000000000000000000090BB99BDBF9F99F9BDA99090B0990900990990BC90099DB9BDB0999F9F9F9FDFFFFFFFFDFBCA0909000000000009000000090090000000000000000090090D0E9CC9CBCAD0E9E0DACDE0DACAD0E9C0C000900000000000000000000000000909A9BD9BDBD9BDFBDBDB9DA9B909B09C90B099CB99F0909B9BC909B9F9B9FBFFFFFFFFFFFFED0900000000009000000000000000000900000009000009009AC0C90C9EBC0DAC9C0F0C9E0F0C9DAD0CADA90000000900000000900000000000000090DBF9F9FBDB9DBDBDB9D09AD909B00D9B0B99F999BDFFD9B9B99F99FFFDFFFFFFFFFFFFDFF00090000000000000000000000900000000000000090000C0DCBCDACDCF9C9ACBC0F0E9C0F0AC0AD0D0C0090009000000000000000000000000009B99B9FBDFBDBF9BDBDBBD990B0999B09D99B99BDFFFFFF0D09DB9F99FFFFFFFFFFFFFFFFCDA90000000000000000000000000009000000000090000909C09C0CDA9E0CA0CD09E0D0CBC0DC9ED0E0F090000900000000000000009000000090909FFF9BDBDBDBDBDB9F9D9A999099BD9B9BDDF9FFFFFFFC9B9F9BDBFFFDFFFFFFFFFFFFFFFB00000900000000000000000000000000000900000009000A9EC9EBCDE9F09C9A0E0DACBC0DA9AC0F0DC00009000000000000000000000000900009BF9BDF9FBDBDBDBDF9F9B9DB099AD9BDBF9FBFFFFFFFFDB9DB9F9BDBDFFFFFFFFFFFFFFD90D0090000900000000009000000000009000000000000000DCDAF0D0F0FCC0AC0D0BC90C9E0CCDAD0E9AD090A00009009000000000000000000009A99F9F9FBDB9BDBDB9FBF9F90B0999BDBD9BBDFFFFFFFF0D9B9FFFFFFFBFFFFFFFFFFFFFFFF00000000000000000000000000009000000000000000009ADADC9EF0FCB0D09E0D0ED0F090B00DADCE0C0A09009000000000000000000000000909F9BFBF9DBDF9F9BDF9D9F9BD990F90BDBD9FBFFFFFFFF9BDF9BDBDF9FDFFFFFFFFFFFFFFCBF000000000000009000000000090000000000009000000000DAFE9EF0FE000C0DAD00E0CAC0DA0D0BCDE909000000000000900000000000000000B0BD9F9FBDB9B9F9F9FBF9BDB9E999BDB9BD99FFFFFFFD9BBBFDFFFBFFFFFFFFFFFFFFFFFBD0900000000000000000000000000009000000000000000009ED0FF0FFAD0C9ADAC0DE9C9C9A0C9CACDA9C000090000000000000000000900900099F9FFF9F9F9F9F9BDBF9DBDBDB99A9D99F9B9FFFFFFFFFFDFDFFBFDFDBDBDFFFFFFFFFFFDF9E00090000000000000000000000000000900000000900900CB0FE0FF0FF90C00D0F00C0A00D0BCADF0CF09090000090000000000000000000009A99F99FBDBDBDBFDB9F9FBDB9BDBD9B0FB9DBDBDFFFFFFFFFFFBFDFBFFFFFFFFFFFFFFFFFFDE9000000000009000000000000000000000000000000000909CFF9FDAFDAC90E9E00DA0D0C9AC09C00F0CE00000090000090000900000000000009A9FFBDF9F9FDFDF9F9F9BDBF9B9BF999DBD9BDBFFFFFFFFFFFDFFFDF9F99FBDFFFFFFFFFFFF0900000000000000090000000909000000000000000090CAC9CAFAFDAFF00C9C9EDAC90CB0C9ACBCFCE90900090000090000000000000000000009F9FDFBF9B9BD9FB9F9F9BD9F9F90BDB99B9DBDFFFFFFFFFDFFFFFF9F9FFBDFFFFFFFFFFFDE90000000000000000000000000000000000000000000009C9EBDCF0BFCB0E9E0E9C0D0E90C9AC9CBC090000900000000000000000900000000099BDBDBBDDBDBDBFD9B9B99F9F9B99F9A99F9F9BFFFFFFFFFFFFFB9F9F9F9BDBFBFDFFFFFFFE9000000009090000000000900000000000000000009090DE9ECD0EBCFCBFD00D0D0ADAD00DA0D0E9CADE90000000000000000000000000090090009BDBFDBBDBDBDB9FDDBDB99BF9DF9F9DB999F9BFFFFFFFFFFDEDF0F9FBFFFDFDFFFFFFFF9F000000090000000000000000900000900000000000000000C90BC9CDABCF0CF0ACD0C0ECD0DAC9CE9C0000900000090000009000000000000000090BBDBFDBF9F9BDA9BBDA9F099A9B09B99F9F9FDFFFFFFFFFCB9B9F9F9DFFFFBFFFFFBFFFE9090090000000000000009000000900000000000090000090FCDCBCBCDCBC090DC9ADAD09AC0C9E0DCBDE900009000000000000000000000000000009FFBDBDBBDBDB9D0909D09E9D99F9D9F9BDB9BFFFFFFF99BDBC9090B90B9BDFFDFFFFFFD000000000000000000000000000000000000090000009000C0000C0C9E9EFCAC0A0CC0CBCC9E9E0D0AC00000000000000000000000000000000000909B9F9B9BDB9BD9A9A990B0990B0B9AB9BDBDFFFFFFDD0BC990A90B090B9FEFF9FBFDFA9000000000000000000000000000000000000000000000000090DAD0DAD0FC99C9C9CB0F0C0BC0C0DACD0FC9090000000090000000000000000900000909FCBF9F90F9A99D99A9090A90909D0D9BDBF9FFFFEB909A09909C99F9F9F9FFFDBFBDB00090000000000090000000000900000000000000900000900C0C00CDAC9EF0CAC00C90DAC0BCBC0DACD00E000900090000090000000900000000000090BBDBCBFB9D9B0B09099A9909090B9B9DBDBFFFFFD0E909000909A09B0FDFBDEBCBDBC09000000900000000000000090000000000000000000000000900DA0CDAD0FF0D09E9CA0D0D0D0DE0D9ADF090000900000000000000000000000000090099B9B99DB9A9D090B009000A909099FBFBDFFFFDA9909090B9A999CDFBF0F9999B9A0900000000000000000009000000000000000000000009000000C90CD00DE9EC0CAC9C0CDACACACA0D0ECC000009000000000000000000000000000000090B9F0B0B0BD909BC90BD09990B090F99BDFFFFDF090B009090000AFB0D099A09ADBC900000000000000000000000000900000000009000000000000000C90EDE9ED0F0D00ADA0C9C9C9CDAC9E9ED09A0000090000000000000000000000000000909D090900B0F00090BFA00909A99BFDBFFFFE99F00090F0009090DF000099F9B0B0000090000000090000000000000009090000000900000000909C90CC9C0DEBD0CAC9C0D09AC0FCBCDAC9E9CA0D09000000090009000000000090000090090B0B90909090B0900009DF00909099BBDBFFF9E099090BC9000000A9009B090F0D0900000000000000000900000900000000009000000009090C0000C9A0CBCBCDCAD09C09A0E09E00C0ADF0CCB0DA000900909000000000000000000000000000990B0B000BC0000F0BE009A909A9F9FFFFFF99A09009A00909090009E909B90B000000000000000000000000000000000000009000090000C90F0D0C0D0CDCBE09C0E0BC0D0D0C9EDADC0EDBCDE090B0C9A000000000000000000000000000909AD090900900909A090990090B9DBBDBFFF9E009009000000000009E909E9CB009000000000009000000000000009090A90900000900000DA0C0C000D0CBCBED0CBC9C0BC0CA9E090DCAFDAC0E9E000AB0C0000000000000000000000000000909A90099C000000900000900099B9FFBF9FF90909009009000009FE90A99A90900090000000000000000000900000009000000000000090009009E9C0E9CBC9FE9CAC9C0DA9C09CECA9C0EDBE9C9F0DDEB090000000000000000000000000000909ADB0B09090000099B009090F9B9F9FFBDF9CA090090009C9FBD00990BCB009000000090000000000009000900000009009009000000090C9C00C9C0C9CF0F90D0DA9CADC0FCA90DCBC9E0DE9ECBFAFC000090000000000000000000000000090909009BDAD9CB9A0009A09B99FFBFF9F0B9B0900909B0B9A0009BCBF0909000000000000000000000000000009000000000900090000C00009C000DACBCFCCACAC0CE9CAFC09CFCAC9ECDE9ECBDAFC090A000000090000000000000900000909A90B09009A0B000909009B09FB99F9FF9F00900900000900909A09009000000000000000000000009000000000009000900000900909090D0C090D0C9CBCB0D0DAD09CAD0ADE009CBED0F0EDBEFFF900D9C90000000000000000000000000090990D9E0909900900909909DB99FBFF9F90DB0090909090090B09090900000000090000000090000000000090000000900090000000C00C000900E0DACF0FE0E9C0ADAD0FCFADEDE9C9ADAF9EDFBEFEF0A9A009000000000000000000000000000A9A990B000990900000B090F99F9B9E9B0900000009090090000000000000000000009000000900000000000090000000009009090D09C0C0AD0D0D0DE9FC9CADCC00E0F0DADACADEFFDEFBFAFFBDADFED0000000000000000000000009009099090A9090900000900009FB9BF9FFF9F9DAD000000000090909000000090000000000000000000000090000090009090900000000E0C00909C000C0F0DE99CAD00BCF0D0FEF0E9DEBEBEBFEFFFFFEDFADA09A09000000000000000000000000000909090000090000999B999F9FBF9DA9B99A90900000000000000000000009000090000000000009000090000900000000000009C909C00C09CF0F0DE9EE9C0FCC90DAD0D0ED0E9FDFFFFBFFFEFFADFAD009000000090000000000000000909B0009000900009090BE9DADB9F9F9FB9F0F09000090090000000000000000000000000090009009000000000B00900090090009C000C00D090C00D0CF0FFCBED0BCE0C0ADADBEDE0CBEFFEFFEFFBFFEBDA0009009000000000000000000000909B9A09000090CA9C9D9B9B9F9FBDF9F9DB9F9BD9F090090000000000000000009000000000000000000900D00D00A90000009009CD09C00C0C9C0C9E0F0FADCBEC90DADC0CAC9ADCBCBFBFFFFFFEFFBFE0D000A900000000000000000000000909C99A9DBDA999B9FB9FDF9BDBDBFF9BBDB9E90B00090000000000900900000000000000000000000000C9A9FA9ED009090000C0A00C09C00B00BCE9CDADDFAFC9EDE0C9E9C9EDCBCFDFEFFFFBFFFFEFE9000900000000000000009000009090B9B9B9DB9BF9FBDFB9DB9B9FBFFFF9FFDBDF9B9009000900900000000000000000009000000000009000FADFCBDE90F000090090D0D00C090C0DC09CFADFEADBFE9E9CBC0E9E9EADC9AFFFEFFEFFFFFF9E90009A090000000000000000000009099ADB09F99BF9FBDFFBFDF9F9F9FFF9BF0B9FC9009000000090000000000000000000009000000000900DEBFEFBEF0DCB0000C0000D090C09C00FCB0DFA9DECBFEBEDCBC90C0DCACFC9FFFFFFFFEBFEFEFE9009000000000000000000009090B0D9BDBDBF9DBF9FB9BD9FBFBF9FB9FF9F9F09B00000000000000000000000000000009000000090000090DFBFFE9EDACC9CA909C000C090C00D00DCF0DFCADBF0FFFABC0EDADA9CBCBEBFFFFFFFFFFFBFC9000009009000000000000000000909B90B9B99FBD9FBDFFBFBDBDBDBCB9DA9BDB0009000000000000000000009009000000000000000000000FAFFFBFDAD0F0C9C0C09C900C09CDACD0E9EBC9C9ECFFF0FCDE90CC9EFC9EDFEFFEFFEFFFFFCB000909A00000090000000900000909B09F9FF9FB9FBDBDB99F9FDFFBDBD9A9D090909000000000000000000000000009000000000900009000DBDFAFCFADAD0C9C0C90C000D09C000DAC9CBCFCBCF9E9EF0FA9EDEBCC0BCDADBFFFFFFFFFEFBC0900000000000000090000000090909DA9B99B9DBDFBDBDBF9F9B9BDBDBC9B09A90000009009000000900009000000000000000900009000090FAFFBF0FC0C9CAC90C090D000CA0DC0DADEDF0EDACBCF9EFDECBC9CBDCCADCADFBFFFFFEFFFEF00009009000000000000000000009A999F0F9FBBDB9FB9BDB9F9F9CB9A9B00909090000000000000900000000000000000000900000000C0000DFFFFFF0FDE0DC0CB0C000D0D0D00F0CD0F0FFFADFCF0F9FAFBCFACCADADADCFAFFFEFBFFFFFF0F09009000900000000000000000009A99B9B0DDBDBDBDBF9DB9EB99F9D0090B000000000000000000000000000000900900000009000900909EBFFEBCF0C0D009C0C90D000C00C9C9CAD0F0FFFFAFBFEF0FFCF0CDADAD0C0DADFEFFFFFBEFBEF0000000000000900000000000090909DA9DBDBBB9B9F9F99BBD99DB09B0909009090090000000000009000000090000000000000009000000CBFFFBDF0DAD0E9C009C00C0D00D0C0CADCF0FFFBFFFEFBFFEBE9EF0D0DE0F9EDADBFFFEFFFFFFDF0909009000000000000000090009A9BDB9F9F9DBDBDB9DBC99A9B0F09A000900000000000000900000000090000000000090090000009000BDFFFFEBEDC0D0C09C00D09E09E0DAD0DADADF0FEFFFFFEFBDF9E9EBCE0DCCC00DECBFFFFFFFFFAFC0A090000000000000000000000090090B9B9BBDB9BDBB9B9BD0990909090090000000000090000000000000000090000000000000000090CBFFFFFCBCBC0D0C09C00E09C0D00D0E0D0F0FFFFFEBFFDFEEBEFFDEDBDADA9FCAD9FCBFFEFFEFFF090000000000000000900000000909B9BDBDBC9B9F9BD0F9F9A9F09A900090009000900000000090000000000000000090000009009000009EFFFFFBCBCCBC0BCC09C9C00D0CD0C9DE9CF0FFFBFFDAFADBDFBFAFACECADCC0D0ECBEFFBFFFFADAC090009000000000000000009009B0D099B99BDB9BE9B9B0D9900900909090000000000000000000000000009000000000000000B009CC9FFFFEFBCFCC90C9C0A9C000CD00F00FCE0DE9FC9EFCBEDADAFAFEFFFFBDBDADADE9C9CD0FFFFFFFEF9C00900000000000000000000090099BCBDBBDBDAD99BC99A009B09000000000000000000000000000090000000900000090009000000BCFBFFBFEF9E9ED0C0D0C09CD0A9C0CD0D0DE9EFBE9EBC9EDEDFFFBFFFFFEFEDADADE9E0FC9EFBEFFFAFBC00000000000000000000000090A09B09C9B9B9BBD9BC999A090090900090000000000000000000000000000000900000000000900009EFFFFFBFE9C00D0C0C9C00AD0C9C9ACADA9E9CFCFC9EF0FBFAFFFEBFEFFBFFFFFE9EDBCBCBDFFFFBFFCA9000009000000000000000090999009B9BC9BD0D0B90B00900090000900009000090090009000900000090000000900000909000900CBFFFFFFCBEDED0E90D0AD0D0C9CACD0DCDE9EFB0F0FE9FBEFFFAFFFFFBFFFAFFAFFFBEDF0FEFBFEFEDA90090000000000000000090000000A990D09BD9B9B9A900B09090090000000009000000000000000000000000000000000900000000DBFFFFFFEBF0D00D0CC00D0C0C9E0C9C9E9E9EDBCF0F9FFEFFFBFFFFFFFFEFFFFFFFBEFFBEFDBEFFFFBFFC0000000000009000000000009090900B9B099A909C9090900000000090090000000000000000000900900009009000900000000900ADBFFFFFFFCF0CF0D09AD0D0F0C9C9CADCF0DEAFFFFEFAF9FAFEFFFFFFFFFFFFFFFFFFFFFFBEFFBFFFEFBF090000090000000000000000000909009CB0D9BDA99A090090090090000000000000000900000000000090000000000000000900090EFFFFFFFBF0F0C0CC0C0C0C0D0C9E9C0E9EBDF0FFAFBFFEFFFBFFEFBEFFFFBFEFFEFFFEFFFFBFFEFFFBCF00090000000000000000000009000090B099A9C9900900090090000000000009000900000009000000000090090090009000900090DBFFFFFFFFFE9E9CB0D0DAD0D0E9C0C9E9C9CE9FFFDFFCFBFFFFFFFFFFFFFEFFFBFFFFBFFEFFFEFFFBFCFB0900000000000000000000000000090090B090B09A9009000000000090000000000000000000090009000000000000900090000B0EFFFFFFFFFFE9CD0D0C0C0D0E0C9C0CDADCFEFBFFAAF0FBEFFAFFFFFFFFFBFFFFFFFFFFFFFFFFFFFBFEFBFC0A0900000900000000000009000900900909A90B00900090090009000090000000000900000000000000900009000A0090090AD0FDBFFFFFFFFFFFE0C0C9CBC00D0D0D0F0CDA0DADADFFBFEFFBFFFFEBFFFBFFFFFFFFFFFFFFBFFBFFFFFFFEBF09000009000090000000000000000000900090909000900000000000000090009000000090000000000000000009090000000DADAFFFFFFFFFFFFF9F0F0C0C9C90C0CAD0DACDE9CFFAFFEFFBFEFFFFFFFEFFEFFFFBFEFBFFEFFFFEFFFFFFFFFC90090900000000090009000000000900009000090909000900090000000000000000000000090090000000900000000009009AFFFFFFFFFFFFFFFFECD0C9C90CAC9E9C0C0D0F0FBCBDFFFBFFFFFFFBFFFFFFFBFEFFFFFEFBFFEFFFFFEFBFAFCBC0B0000000000000000000000000000000009090000000000000009000000000000000000000000090900000909AC9090009EFFFBFFFFFFFFFFFFE9F00DAC0C9C9C0C0D0F0F0DECBFFAFFFEFFFBFEFFFFFBFFFFBFFFFFFFFFFFBFFFBFFFFFFBE9000B00000900000000000900000000909000000090009000090000000000000000900009000000000000900000900009000BFFFFFFFFFFFFFFFFFC0FC0D0D0C0C9C9CAD0CCFADBFCBFFFFFFFFFFFFFEBFFFFFFFFFFFBFFFFBFFFFFFFFFFFEFF0900090000000000000000000000000000000009000000000000000000000009000000000000009000000000900009000090BDAFFFFFFFFFFFFFFBFC0D0C0CB0CBC0E9C0DA9CDACBFCFFFBFFBEFFBFFFFFEFBEFFFFAFFFFFEFFFFFEFFFAFFBDAC009000900000090000000000009000000000000009000009000000900000900000000900009000000000009009000009000CBFFFFFFFFFFFFFFFEDAD0F0D0C0D0C9C0D0EDCB0FDADBFFFFFFFFFFFFFFFFFFFFFBFFFFFEFBFFFEBFFFFFFFEFFE90900090000000000000000000000000000000000000000000000000000000000000000000000000090009000AC0090B000DBFFFFFFFFFFFFFFFADAD0C0C0C0D0C9C0DAC9CADEDAFFFAFFFAFFFBFEFBFFBFFFFFEFFFFFFFFFFFFFFFFAFFFFFAD00009A00000000000000000000000000000090000000009000000000000000000009000000000009000000090909A000000BCBFFFFFFFFFFFFFFF0DC0D0DAD0CB0CBC0D0E9DCB0FDADFFFFFFFFFFFFFFEFFFFFFFFFFFBFFFFFFFFFBFFFFFFFFEFC00090B09090000000900000000000000000009000000000000900000900000900000009000090000900000000009090900BFFFFFFFFFFFFFFEFF0DAC9C0C9CC9C0D0C9CCADEDAFFAFFFFFFBEFFBFFFFFFEBFFFFBEFFFFFFEBFFFFFFFFEFFFF0B0900000000009000000000900000000000000000900000000000000000090000000009009000000000909000909000000DFFFFFFFFFFFFFFFFBCF0C9E0D0E09C0D0F0E9AD0F0FCBDFFFFFFFFFFFFFFBFFFFFBFFFFFFEFBFFFFFEFFBFFBFFF0FC000909000000000000000000000000000000000000000000000000000000000000000000000000900000009000000B09FBFFFFFFFFFFFFFFFFDE9ED0C9C0C9C0F0C0C9CDCF0FCBFFAFBEFFFFFFFEFFFFFFFFFFFFFBFFFFFFFFFFFFEFFFFEFFBDE9000009000000000000000000000000900000000009000000000090000000009009000000900000000000000009000AFFFFFFFFFFFFFFFFFEF0CD0C9C0D0C0D0C9C9CE0F0FCBF0FFFFFFBFFFBFFFFFEFFFFEFFFFFFFFFFFFFFBFFFFFFFBFEFBCA9090000900000000000000000000900000900000000000000090000900009000000009000000009000B0090900009FFFFFFFFFFFFFFFFFFFBF0ADAC9E0DAC0DAC9E90F0F0FCFF0FFFFFFEFFEFFBFFFBFFFFFBEFFFFFFEBFEFFFFFBFFFFFFBCF9C0A09000000009009000000009000000000009000000090090000000000900000900000000000000900000000099FFFFFFFFFFFFFFFFFFFFFCFD0C9C0D0C9C0D0C0CDC9CF9ADAFFFFFFFFFFFFFFFFFFFBFFFFFBEFBFFFFFFFFFFFFEFFFFBEFBCA909000000900000009000000000000000000000000000000000000000000000000900000009009000909009090FFFFFFFFFFFFFFFFFFFFFEBC0C9CAD0C9C0F0C9CBCADEBCFFFFBFFFBFFBFFBFFFBFFFEFFFFFFFFEFFFFFBFFEFFFFFBEFFFFCF90C009090000000000000000000000000000000000000000009000000900009009000009090090000000000000BFFFFFFFFFFFFFFFFFFFFFBCBCBC9C0D0E9C0D0E9C9DE9CFBCBCFFBEFFFFFFFEFFEFFFFFFBFFFFFFFBFFFFFFBFFFFFFFFFFBFAFB0900000009009000000900000000000900000000090000000000000000000000000900000000009000090909FFFFFFFFFFFFFFFFFFFFFFDFC9C0C9C0D0C9C0D0CAC0DE9CFBFBFFFFFFFEFFFFBFFFBFFBFEFFBFFFFFFFEFFFFFFBFFFFFAFFFFDE9E0909000000000000000000009000000000090900009000000000000090000009000000900900009090000FFFFFFFFFFFFFFFFFFFFFFFFADE9CBC0D00D0E9C9C9CFA9EF0FCFFFFFFBFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFEFFEBFFFEFBEBE09000090000000900000090000000000009000000000000009009000000000000000900000009A9000000FBFFFFFFFFFFFFFFFFFFFFFEBCD0C9C0DACDAC9C0E9ED0DCF0FBFFAFFFFFFFFBFFFFBFEFFFFFFFFFFFFEFFFBFFAFFFFFFFFFFFFFFDBDA09000009000000009000000009000000000000000000000000000000000900009000909090000000090FFFFFFFFFFFFFFFFFFFFFFFDFCADAC9C0D00D0C9C9CCBCEB0FEDADFFFFFFFBFFFFEFFFFFFBFFBFFFFEFFFBFFFFFFFFFFFFFFFFBEFEFADBC09000009000900000000000000090000000000000000000000000000000090000000000C90C9C90CBFFFFFFFFFFFFFFFFFFFFFFFBE9D0D0CBC0D0C9CAD0D0C9CDE9FBFBFFFBEFFFFEFFFFFFFBFEFFFFFFFFBFFFFEFFFFFBFFBFEFBFFFBFBDBCA9000000000000900000000000000000000900090000900000009000900000000090000B000B0A00BFFFFFFFFFFFFFFFFFFFFFFFFEFCED0E9C0DAD0E9C0F0ADE9ADE9EDEFFFFFFEFFFFBFFFFFFFFFEFFFBFFFFBFFFBFFFFFEFFFFFEFFFFFFEFE9009000000000000090090000000000900000000000000900000000000000000900009000BC0009FFFFFFFFFFFFFFFFFFFFFFFFFFF9E90C9C0D0C0C9C0D0CDC9EDE9EFBFBFFFFBFFFFFFFFEBFFFFFBFFFEFFFFEFFFFFEFFFFFFFBFFFEBFEFBF9EF0090000900000000000909090900000000000000000000000000000000900000090090009090AFFFFFFFFFFFFFFFFFFFFFFFFFFFE9CF0C9E0C9C9C0DAC9CBC9E9FF0FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFBFFFBFCFF9EDA0090000000900000000000000000000000000090000000000000009000090000000090000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9CD0C9C0E9CBC0D0E9CFCBC0FFBFFFFFFFFFBFFFFBFFFFAFFFFFFFFFBFFFFFFFFFFFBFFEFFFFFFFFFFBEFFAD090000009000000090000000900090000090000000009009000090000000000909000090FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCF0E9C0D0D0C0D0C9CCBCBCFF0FCBFFFBEFFFFFFEFFFFFFFFFBFEBFFFEFFFFEFBFFFEFFBFFFFFFFEFFAFFDBCF0C000000000000900000090000000090000000000000000000000000090009000009090CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF0C9CAD0E0D0D0ADACBC9CBF0FBFFFFFFFFBEFFFFFFFEFFFFFFFFFFBFFFFBFFFFFFFFFFFFFFEFBFFBFFFBEFBFA909090000090000009000000000000000000000090000000090000000000000090000BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FD00D0C9C0DACD0C9C0FED0FDE9EBFFFFFFFFFBFFFBFFBFFFFFFFFFFFFFFFFFFFFBFFFFFFBFFFFFFFFFFFBCFCBCA000000000000900900900090000000000000000000000000000900090090000090CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFC0CF0C9C0D0C90C9CADD09EF0FBFFFFFFFFFFFFFFFFFFFFFFAFFFFFFFBFFFFFFFEFFFFEFFFFFFFFFFEBFFEFFBFCB09090000000000000A000900009000009000000000009000009000000000090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9F0C9E0D00F0CDAC9D0EDE9CFADE9FFFFFBFFBFFFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFFFFFFEFFFFFEFFBFFCBC9C0009000090009090900000000009000000000090000000000000900909000ACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9E0C9C0DACD0CF00DACE9CBCBE9FBFFFFFFFFFFFEFFFFFFEFFFFFEFBFFFFFFFBFFFFFFFFFBEFFBFFBFFFFBFFEBFFFFBE9009000000000000B00900000000000000900000000009000900000000909BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAED0DAC90C90C90CD0C9DE9CF0DFCFBFFFFEFFFEFFFFFFBFFBFFFFFFFFFFFFBFEFFBFEFBFFFFFFFFFFFFFFFFFFFEBCBCBCBC0000000090090000009000000000900000000900900900E0009000000CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBCD0D0ED0CBCC90E9CA0DE9EFAFBDEFFFBFFFBFFBFFBEFFFFFFFFBFFFBFFFFFFFFFFFFFFFFFBFFFFFEFBFFEBFFBFFFFFBE9AD0900900A9009090000090000000000000000000000090900009000DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEDADE0D00D0C90E9C0DCDE9E9CDBCFBFFFFFFFFFFFFFFFFFFFFEFFFFFFFFBFFFFFFFFFFFFFFFFFEFFFFFEFFFFFFFFFBFBFFFF0B009A0990C9AC00090000090000090090090009090000009000C9FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDAD0C9C0DE0D0C9C0DA9E9CBDEBEFBFFFEFFBFFFFFFFFFFFFFFBFFFEBFFEFFFFBFFFFFFFEBFFFFFFFBFFFFFFFFFFAFFFFFBFBFEBC09FACB9E9BC9000900009090000000000900000909000090B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBC9CBC09C0F0C0F0CD0DE9E9F9EDAFFFFFFFEBFFEBFFFBFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFFBFFFFFFBFFFFFFBFFBFFFFFBFB9A9DACB9EBFA9E0C0900000000000900000900000090090CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9E0C9CC9C0D0D0DACF0DE9ECFBFFFFFBFFFFFFFFFFFFFEFFFFFBFFFFBFFFFFFFBFFFBFFFEBFFFFFEFFFEFFEBFFFFBFFFFBFFFFEDABDBFEFDADE9FBCA9A909009090009000009000000F0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FC9C9E09C09CBC0D0D0DADE9BCF0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFEFBFFFBFFFFFBFBFDE9FBFBFFBFFCBDAC00A09000000000090009090F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9E0D0C9EC9C0C0F0CBCBCF0FCFBFFFFFFEBFFFFFBFFBFFFBFFAFFFBFFFEFFFFFFFFFEFFFFFFFEFFBFFFFFFFFFFBFFFBFFFFFBFFFFAFBEFFFEDAFEBFFEDBF09C0009A90900000000ACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC0D9E0D009CAD0D0C9CE9E9EDBBCFBFFFFFFFFFAFFFFEFFFFFFFFFFEFBFFFFFFFFFFBFFFFFFFFBFFFFFFFFFFFFFFFBFFFFBFFFFFBFFFFBFBFBFDBDFAFBE9EF0BDAD00C0AD09000D09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE0D0CDCC9C0DAD0F0DCDE9ECFBDEFFFBFFFBFFFFFFFFBFFFFFFFFFFFFFBFEBFFEFFFFFAFFFFFFFEFFFEFFFFFEFBFFBFFFFFFFBFFBFBFFFEFFAFFBFFFFFF0FCADAF0BFCAACC99AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0BD0C9A009C09C0D0CDADA9E9F0FBFBFFFFFFFFFFFBFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFBFFFFFFFBFFFBFFFFFFFBFFBFFFBFFFFFFEFBFBFBFFAFFFBEF0FFADBFCBFCBFDFBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FCCCBCDCFC0BCC9CADADADCFDAFDEFFFFFFFEFFBFFEFFFFEFBFFFFFFFFBFFFFFFBFFFBFFFFFFEFFBFFFFFFFEFFBFBFFFFFFBFFFFBFBFBFFEFFEBFFFBFFBFFBCFBCEBDEBCFAFEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9A9C00000DC9AC0D0C9CFADADEBDBFFFBFFFFFFFFFFFFBFFFFFEFFFFEFFFBFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFBFBFFFFFFFFFFFFFFBFBFFFFBFFFFFFADBCFBDEBDFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FCD0DEDCD00CC9CBCBCF0DCBCBDEBFFFFFFFBFFFFBFFFFFFFFFBFFFBFFFFEFFFEFFFFFFFBEFFFFFEFFFEFFFFFFEFFFFFFBFFBFBFFFFBFBFFFFBFFFFFFFFEFFEBEDEBCAFCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E9E0909AC909C90CD0CF0BCBDEBDEBFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFBFFFFFFBFFFFBFFFBFFFFFBFFBFFFFFFFFFBFBFFFFFFFFFFFFFFFFFBE9E9EBCBFDBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F9C0DCCCC9ECCACC9ACF9EDEDE9EBFFFFFBFFFBFFFFFFBFFBFFFFFFFFFFFBFFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFFFFFFFFFFFFFFFFFFFFFFFFFFAFE9EDBCF9EDAFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE9C00B09C909C9BCD90CF09E9FDFBFFFFEFFFFEFBFEFFEFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFFEFBFFFBFBFBFBFFFFFFFFFFFFFFFFFFDBDE9ECBCE9EDADEFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD0FCDCC0CCD0CC00ECF0CFCBCBE9FFFFFFFFFFFFFFFFFFFFFEFFBFFBFEFFFEFFFEFFFEFFEBFFEBFFEFBFEBFFFFBFFFBFFFFFFFFFBFFFFFFFFFFFFFEFBEF0FCBDE9FCBCFBFFEFBEFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBECF00090B09A090DD09CF9CBCFE9FEBFFFBFFBFFFFFFBFFBFFBFFFFFFFFBFFBFFBFFBFFBFFFFFFFFBFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFBFBCF9EDADA0F0ADA9E9ADBEDBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED90DCFCCCCCCDECCACDE9CADCB9EDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFBFFFFBFBFBFBFFFFFFFFFFFFBFEFFBECB0DCEDCEDCEDCEFCE9EDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0EC0009090900909CBC0CED0FCFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFFFFFFFFFFFFFFFFFFBFFBFBEDBFCFAD9E9DAD9E9DADBC9ECBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DEDCCDCCCDCCD0DCBDBDADADADEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE9E9CAC9E0DAC9E0DAC9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CA900B00B00B00E00C0C0DADADBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEFDEFDEFDEFDFFFFFFFFFFFFFFF000000000000000000000105000000000000A9AD05FE,'Janet has a BS degree in chemistry from Boston College (1984). She has also completed a certificate program in food retailing management. Janet was hired as a sales associate in 1991 and promoted to sales representative in February 1992.',2,'http://accweb/emmployees/leverling.bmp') +GO +INSERT "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(4,'Peacock','Margaret','Sales Representative','Mrs.','09/19/1937','05/03/1993','4110 Old Redmond Rd.','Redmond','WA','98052','USA','(206) 555-8122','5176',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FDB9BFBFFBFB9FBDBBBFDBF9FBFBFBFBFBFBDBFBDBFBBFBFBFFD0000000000000000000000000000000000000000000000000000000000000000BBDBF9BDBF9BB9BFB9FBFB9FB9BBFBBBBFBBFB9F9B9FB9BF9BF9BFBBFBBFBDBF9FBDBF9F9BDBFBFBF9FBB9BDBB9BBF9BBFBFBFBFBFBFBFBFBFBFBFBFFBFBFBBA00000000000000000000000000000000000000000000000000000000000000009BFB9FBB9BBDBFB9BFB9BFFBDBF9BDBDBBDBBFFBFBFBFFBBFFBBF9F9BDB9BBFBBFBBFBFBFBBFFB9F9BB9FBFBB9FBDBFBFBFBF9FBFBDBF9BFBFBFBFBF9FFBFBD00000000000000000000000000000000000000000000000000000000000000000BFB9FBB9FBDBB9BBFBDBF9BBBFBBFBBB9FBBDBB9BFBF9BBDBB9FBFBBFBFBFF9BDB9FB9BDB9F9FBFBBFBFBDB9FB9BB9BFBF9FBFBDBFBFBFBF9FBFBFBFBFBF9FB000000000000000000000000000000000000000000000000000000000000000009BFFBBDBB9B9FBDBDBBFBBF9FBDF9BDBFBDFBBFBF9BFBFFBFBFBDBFF9BFB9BBFBFB9FBFBBFBBF9BDB9FBBBFBBDBDBF9BDBFBFBFBFBFBFBFBFBFBDBFBFBFBFBF0000000000000000000000000000000000000000000000000000000000000000009BBF9BDBF9B9FBBBDB9F9BF9BBBFBB9BBBBF9BFBFB9BB9FBDBFBB9BFB9FBF9BDBFB9F9F9BDBFBFBBFBDBFB9FBBB9BBFBBBDBFBFBDBF9FBFBF9FBFBFBFBFFB0000000000000000000000000000000000000000000000000000000000000000000BDB9FBB9BBFB9BDBBBFBBFBFBDB9BDBF9F9BFF9FBDBFFBFBBFBDBFB9FBBDBFBBB9BFBBBBFBBFB9BDB9BF9BFB9F9FBF9BFFBFBDBFBFBFBDBFBFBFBFBFFBF9BF0000000000000000000000000000000000000000000000000000000000000000009BBFBB9FBDB9BFBBBDB9F9B9FBBBFBB9FBBF9BBBFBFB9BB9F9BBFB9FBBDBBBDBDBFB9FBDB9FFBFBBFBFBFB9FBBBB9BBF9BFBFBFBFBFBFBFBFBFBFBDFBFBFF90000000000000000000000000000000000000000000000000000000000000000000BF9BDB9BB9FB9F9FBBFBFBFBDF9B9FBBF9BBFBF9B9FBFBFBF9F9FBBDBBF9FBFBF9FBDBBFB9FDB9F9B9F9FBBDBDBF9FBFBDBBFBDBF9FBF9FBFBFBFBFBFBBBE00000000000000000000000000000000000000000000000000000000000000000009BFBBFBDBB9FBBB9F9B9BDBBBBBDB9F9BF9FBDBFBFBB9F9BBFBB9FBBDBBF9B9BBB9BBDB9FBFBBFBFBFBBBDBFBBB9BB9BFBF9BBFBFBFBFBFBDBFBFBFFBDFF90000000000000000000000000000000000000000000000000000000000000000000BDBDB90B9FBB9F9FBBFBFBF9F9FBBFBBFBBFBBF9F9F9FBFBDBDBFB9FBBDBBFBF9FBF9BAF9BFBDB9BDB9BDBFB9BDBBDBFBFBFFFBFBFBFBFBFBFBDBFBFBFB9A00000000000000000000000000000000000000000000000000000000000000000009BBBBBFBF9B9FBBB9F9F9B9FBBB9F9BDB9F9BDBBBBBFBB9FBBBFB9FBBDBBDBB9EBB9FBF9BFFBBFBFBFBFBB9BFBBF9BB9FBDBBBDBFBDBF9FBFBFBFBFBFBFF000000000000000000000000000000000000000000000000000000000000000000000BDBDB9B0BFB9F9FBBBBFBFBDBDBBBFBBFBBFBDBDBDBDBF9F9F9FBBDBBDBBDBF9F9E9B9FA9FDB9F9B9F9FBFB9F9BF9FB9BBFFBFBDBFBFBFBFBFBFBFBFBBF0000000000000000000000000000000000000000000000000000000000000000000009BBBDBDB9BDBBB9F9BDBB9BB9BDB9BBDBDB9BBBBFBBB9BBBFBB9FBBDBB9FB9BBBBBF0B9FBFBBFBBFBFBBDB9FBBF9B9BFFFB9FBFBFBFBFBFBDBFBF9FBDF9A000000000000000000000000000000000000000000000000000000000000000000000BDBBBB9FB9BDBFBBFBBDBF9F9BBFBDBBBBFBDBDB9F9FBDB9BDBB9FBF9FB9F9F9E9BBFA00F9FB9F9FB9FBBFBFDBBBFB9B9BFBBFBF9FBDBFBFBFBFBFBFBB0000000000000000000000000090BCBC9F0A9E000000000000000000000000000000009BF9F0FB9BFB9B9F9BDBB9B9BBF9BBFBDFBDBBB9FBFB9BBF9AF9FAB9AB9FAB0B9FBC0000FB9FFBB9FB9F9BDBB9F9BDBFBFBBF9FBFBFBF9FBF9FBFBFBF9000000000000000000000000DA0F0BCBF0FDF9FBFEB00000000000000000000000000009BB9BB9FB9BFBFBFBBDBF9BF9BBDB9BB9BBF9FBB9B9F9E9FB9B9F9FBDAB9DBFA0000000F0B0BDAF9FBBFBBFBFBFBB9BFBDFBFBFBFBFBFBFBFBF9FBDBE00000000000000000000009ABDFDFFBDFF9FAFDF9FDFFAF00000000000000000000000009F9F9A9FBDBB9BBDBB9BF9BF9FBFBDBF9B9B9FBF9ABB9B9FBFA9B0BBDBEB0000000000F0000090B0BDADB9F9B9F9FB9FBBDBBDBBDBFBFBFBFBFBFBF9000000000000000000009EFFDBFA9FDFB9FDF9FAFFBF9F9E9090000000000000000000000BB0BF9B9BBDBF9BBDB99BB9BB9B9BB0BFBFA9A9BDBCBFA9A9BF9FBCA0000000000000B000000000000B0FBFFFBFB9BFBFBFFBFFBFBFBDBFBFBFBFB0000000000000000009BBFFBCBEBDFFFADFEBBFBDF9F9FFFBFFAC000000000000000000000BDBF9BBFBDB9BBE9B0BFBDBF9F9FBDBF09B9BDBCBBB9B9BDBF0A00000000000000000F00000A00000000009A9BDBFFBF9FBBF9BFBDBFBF9FBFBF9BC0000000000000000BEDF9FDFDBDFBF9FF9BDFDFBFFFFDBDFCBDBCB00000000000000000000B9BBDB9BBFBDB9F9F9B9BB9BBB9AB9BBF9E9A9B0F9FBE9A000000000000000000000F000A0000000000000000B0B9FBFBF9FFBFBFBFBFBFF9FBFBB00000000000000BC9BFFEBFBFDAFDFF9FFDBEBDF9E9FFFBFFDBDBCBDAC00000000000000000F0BBDB9FB9BFB9B9BDBBDBDBDBD9E99A9BDBFBF9A00000000000000000000000000D000000000000000000000000B0FBDBBBF9FBF9FBFBBFBFBD00000000000000BCBFFDBDBDE9BF9FADFBCBDBDFBFFBF0BDF9BEBCBDADB0D0000000000000099BD9BBFB9FB99E9BB9BD9BB0B0BB9BFBF0B00000000000000000000000000000000A000000000000000000000000009BFBFDBBF9FBFBF9FBFBDA0000000000000ADBDFDAFFDFBFFDFBDBADBFBDB9FF9FDFFF9FFD9F9A9F0F0A90000000000000BFBBBF9BFBDBFB9F0FB0BADBDBBDBE0000000000000000000000000000000000000F00000000000A0000000000000000BFBBFFBFBFBFBFBF9FA000000000009C9F0FBFBFDBE9FDAFBDFFDBDBCBFF0FFFBF9FF0FBF0F9E9F9F9E90000000000000B9F9BF9B9BB09B9BBDBF9A9BE9A000000000000000000000000000000000000000F000000000000000000000000000000FB9FBFBFB9FBFBFBF00000000000A9E9F9EDFBFDBF0FDBFADBFFF9FDADF9FDFBFBDF9F9F9F90BCBCBCB0000000000009A9FB9FBBC9F0FBDA0000000000000000000000000000000000000000000000000D0000000000000000000000000000009FBBDBF9FBFBDBBF00000000009BCB9BCFBFBDFBDBFBFFDFBD9E9F9BDBBFFBFDFDBFBCB9E9EBDB9F9AD0F00000000009FBB9FB9FBB0B00000000000000000000000000000000000000000000000000000A0000000000000000000000000000000BFFBFBFBFBFBFF90000000000FCBDEFF9FDFEBDAFDFBDFBDAFBF9ADB0FDBFDBFBF0DBDE9F9D0BCBCBDA09E00000000B9B9FB9F0000000000000000000000000000000000000000000000000000000000F000000000000000000000000000000009BFBDBFBDBFBB000000000009BCFBCBFAF9F9FDBBDEBBCBDBD0BDA9F9BDFBEDADBF0B9F9AFBDB9F0B9F09C00000000FBF9FBA0000000000000000000000000000000000000000000000000000000000F000000000000A000000000000000000000BFBFBFBF9FFE0000000000E9BDFBDFDBFFFBFDFBDFDBDADBF0BD00F0B0DBDB0DBDADAD99E9E9BD0F0F0B0000000099BB9F00000000000000000000000000000000000000000000000000000000000D000000000A00000000000000000000000099FBDBFBFBB000000000909FEBFDAFBFDBDF9BFCBFAFBDBC9BCB9F09CB09A9DA09099A9E9B9F0BF9B9E9E0000000BF9FB000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000BFBFBFBFBD00000000000BCBDAFFFDFAFFAFFDBF9F9C9E9BC90F09FBDBE9DA9BDBFA9F090F09F90FCB90D000000B9BB0000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000BFFBDBFB0000000000C9FFFDBDBFBDBDF9FAD9F0FBF9E9FBF9FF09A909A9C9A90D0BBDB9F9ADB9B9E9AD000000FBC0000000000000000000000000000000000000000000000000000000000000F000000000000000000000000000000000000009BFBFBFC00000000B0A9BFFEFFDFFFBFF9FBEFBD0F9FBDBDA99F0DBDBDA9F9E9B9C9ADB0F9ADADA9F0AC0000B9A000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000FBFBDBA00000000009FFE9F9FAF9FDBFF9F9F0FBFBDFADADBE9FBCBDBDF9E9BCF9BDBCB9E9BDB9E9BDA00000F000000000000000000000000000000000000000000000000000000000000000E00000000000000A00C090C000000000000000009BFBFBD000000009CFEF9FBFFFDFFBFD9E9E9F9FBDEBDBF9FDBC9FBCBF0BDBDB9BCBCB9F9BC9ADB9CA90000B00000000000000000000C0000000000000000000000000000000000000000000F0C00A000000A0900A000A0000000C0000000000009FBDA000000000B9BFFFCF9FBFBDBAFBDBFFBDFF9DBFDF0BFBFDBFD9FDBDADADB9B0F0BDBF9ADAB9E0000000000000000000000CA000000000000000000000000000000000000000000000F0A000C00AC090C0000A000AC0AC000A0A0000AC000BFBF00000000A0FDBCBFBFFF9FFDBDAF9BDFBCBFBCBBDFD9F9FDBFDBFDBDBDADF9F9F0F0F9F9DE99E0000000000A000000C0A0000000E0000000A0C0000000000000000000000000000009000000A000000A00C9C0C900090A0900C9AC00000E9AFB000000000DAFFFFDFF9FFF0FDBDBFFFBDF9FDBFDBFBFFFFBDFBF9F9F9F9B0F0F9F9F9FCBB9FA900000000000000000000000C0A000CA000C000A00000000000000000000000000000E000A000000A00000A0A0A0C0AC00C0C00000B00A000DBF000000000BFFADBFE9FFDBFBBEBFFCBDFBFFBFDBDBFDBDBDFBFDF0F9FBCBDBDBCB0B0FBBCDAD00000000000000AC0A000C0A000000000CA0000000000000000000000000000000000F0000000000000000000000A000A00A0A0AC00C0C90A09BE00000000FBDFFF9FFBFADBDF9F9FBFBDF9FDFBFFDBFFFFFFFDBDBFDE9FDBCB9F9F9F9FDBBDBE000000000000000000A00000000CA0C00000AC000000000000000000000000000000F00000000000000000000000000000000000A00A00C00C0B000000009EBFCBFBDFDFBCBFFFFBDFFBFFBFDF9FFDF9FFF9FBFFDBF9F9ADBDE9E9E9B0FCBBD9F0000000000000000C000000AC00000A00AC00000000000000000000000000000000B0000000A00000A00000000000000000000000000A00A00C00000000FDFFBFDFFBE9FBF9F9FDBF9F9FDFBFFF9FBFF9FFFDF9FDBF9FDBCB9F9F9F0F9BDDAF9E00000000AC00000000E00C000A0000C0C00A000000000000A00000000000000000C0000000000000000000000000000000000000000000000A00000009BFFADFFBCF9FBFDFBFFBF9FFFFFBFDF9FFDFDFFF9FBFF9FDBCB9F9F9CBDADB9FFBF9E9000000C00000CA0000000A0000C0E00A0A0C000000000A00000000000000000000F0000000000000000000000000000000000000000000000000000000FBDFFBDFBFFBDFBFF9FDFFF9F9FDFBFFDBFFBF9FFFDBDBE9F9FFDBCBF0F9F0F0BC9FBDF0000A0000A00000E0000000E000000C00000000A0000000000000000000000000B0000000000000000000000000000000000000000000000000000000FEFBDFF9F9FFBDF9FFBF9FFFFFBFDF9FBDBDFFF9F9F9FDBDBD9ABF9DBDBCBDBDBFBDBBCBC0000000000000000E00C000A00A000C00A00000C0009000000A000000000000F000000000000000000000000000000000000000000000000000000ADBFFEBFEBFF9FFBFF9FFFF9F9FDFBFFFDFFF9F9FFFFF9F9FDAFDF9FBCBDBDBCBD9FEDFBDA00000000000A0000000A00C0C0C0A0A000000000A00E00A00000000000A0000C0000000000000000000000000000000000000000000000000000009FFDF9FDBDF9FBFFDBFFBDBFFFFFBFDF9FBDBFFFFF9F9FFBCBF9F9FE9F9F0F0F9EBF9FBDAD00000A00CA0C0A0C000000000A00C0000000A000000000C00A000A000000000B000000000000000000000000000000000000000000000000000000BBFAFFBFFFBFFFDBFDBDFFFDBF9FDFBFFDFFDF9F9FFFF9FDBD9F0FDBDBCBDBF9F9F9FBDFBDA0000C00000000000AC0CA0A000A00000000000000000000000C00000000A00F000000000000A000000000000000000000000000000000000000000FFDBDE9FBDBDBFDBFFBF9FFDFFBFFDBFBFBFFFFFFBDFF9FFBFBDBF9FBDBE9FBCF9E9FBDFBDBE000000000C000000000C0C0C000000A00000A00A000A0C0000000A000000F0000000000000000000000000000000000000000000000000000009FBFFFBFBDFFFFFBF9FFFFFBFBDFDBFFDFDFDBFFDFDFBDFBDFDFBDADBCBDBDADBDBFDBDBFDAD00000AC000A00E000A009A0B000A900000000000C000000A00A00000000000000000000000000000000000000000000000000000000000000009EFDE9BFDFFFBF9FDFFFDBDBDFDBFBFDFBFFBFFDBFBFBDFBDB0FBDBDBDBDADBDBDBF9F0FFDBF9E000000A0000000E00CA0C0C0E0C0E00CA0B0C0000000000000000000A000F000000000000000000000000000000000000000000000000000000BFBFEDFBF9FDFFBF9FBFFFFFBFFFDFBFDBFDFBFFDFDFBDEBDF9DAF9F0F9F9EBDBCDBFF0BFF9E9E0A0000000C000000000A0A000A00CA00C0A0A0A0A0A0000000C00000000F0000000000000000000000000000000000000000000000000000000FDBFF9FFFBFBDFFFFDF9FDBDBDBFFDBFDBFDF9FBFF9FBDFBFFBD9E9F0F0F9DBFBFDBDF9FFF9F90C000C00A00A00C0A0C9C0BC0D0A9CA9A0C0D0C9C0D0E0E00A00A000000B0000000000000000000000000000000000000000000000000000009BFE9BFF9FDFFFBDBFFBFFBFFFFFDBFFFFFFBFFFDF9FFDBDF9DFFBDBDBDBDAF0FDBFFBDBDBFF9EB000A000000C00A00CA0A0C0A0AC0A0C0CB0A0A0A0A00009C000C0A00E0C000000000000000000000000000000000000000000000000000000FEF9FDF9FFBFF9FFFDBF9FDF9F9FBFFDFBDFFDBDFBFFDBFF0FBA9CBF0F0F0BDBDBF9FDBCBFDBCBD00000000000000009000D0A90C9AC90A00C0C00C00C0BCA0ACA0BC0D00B000000000000000000000000000000000000000000000000000000BDBFFBFFBDF9FFBDBFDFFBFBFFFFDFFBFFBFFFFBFFDBFFDBF9FDFBD9F9F9BDBDBDFFBFF9DBFFF9E9AC00AC0A00B000A0000A00C0A000AC9E0B0ADA0E9AC000C900C00A0A0F000000000000000000000000000000000000000000000000000009EBCBDF9FFBFF9FFFDBFDBDFDFBDBFBDFFDFDBFDFDBFDBFFDBF9BDBEBCBCBDADADB9FDBFBE9FF9F9E90000000C000C000E00000A000C0000000000090000ACA0AC9A0C00C0F00000000000000000000000000000000000000000000000000000E9FFBFBFF9FDBFF9FBF9BFFBFBDFFDFFFBFFBFDBFBDFBDF9FDAFCBD9DBDBDAD9F9EFBFFDF9BDBFFDBCA0000000000A0000000000000A000A0C0AC0AC0AC9009C00AC0B0E9A00000000000000000000000000000000000000000000000000000A9BF9FFDF9FFBFF9FFFDFFDBFDFFBFBFBDFF9FDBFDDAD0F99E99DBDEBFADBCB9F0BF9FDFB9EDFDF9ADA9C00A00A00000000000A000A00000000000000000AC0000000000000F00000000000000000000000000000000000000000000000000000FDEF9FBFFF9F9FFBDBF9FBDBFBDFDFDFBDBEDBF9FBDBD9AD99E9099C99E9BDADBD9FFBDFF9BABFFDBF009000000A000000A0000000000A000A00000000000A00AC00AC0000F00000000000000000000000000000000000000000000000000090BBDBFFDF9FFFFBDFFDBFDFFFDFFBFBFFDEDBD0DFDFFFFDDAD99DBC9BC9F0DBDADBF9FFBDFFDDBDBFD9FAC00000000000A000000000000000000000A0000000000009000A0000000000000000000000000000000000000000000000000000000ADEBFDBFBFF9F9FFBDBDBFBDBFBDFFDF9F9D9FDBFFFDF9F9D9AD0D9BC9A9DBCB9BCBDBDFFBDBBDBFCBE9DA0000000000000000000000000000000A0000A00000000A0000000F0000000000000000000000000000000000000000000000000009FF9FDBFFDF9FFFFBDFBFFBDFFBDFE9FBD0F9E99F9C9090D0B0D09A0C9C9D00BDADBDBFBDBDBFCDBDBF9DA000A00000000000000000000000000000000000A000A0000000000A000000000000000000000000000000000000000000000000000ADBFBFFDFBFFBDBDFFBDF9FFBDFFBDF0DBD0D9FD09B9FDB9BDFBFBDF9AB00BD09DBDBE9FFFFBDBBDBDBEBDBC0000000A0000000000000000000000000000000000000000A000D0000000000000000000000000000000000000000000000000009ADFDBFBFDF9FFFBDBDBFF9FFBDFF9DF0D0B09BFFDFFBFFFFFFFDFBFFDFF009E909BD9F9BDFFFDEBDFD9F0B0C000000000000000000000000000000000000000000000A00000F000000000000000000000000000000000000000000000000000FFBEBFDFFFBFF9FFFFAD9FFF9FF0DF0900BDFFFFFBFFFFDBFFFFBFFFFBF0F0090DBCBFDFDBF9FB9F0BBF0FDB0000A00000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000009BF9F9FDBFF9FF9FF9F9DFAFF9FF9F9090F9FFBFFFFFFFFFBEFFFFFFFFBDFFB0900B09BDB0BFDFBDFDBDEDBDA00A00000000000000000000000000000000000000000000000000D0000000000000000000000000000000000000000000000000ADAFFFBFF9FFDBFBDF9FB9F9FFBC90E9EF0FBFDFFFFFBFFFF9BFFFFFFFFFFFC9E090DBCBFFDBF9FF9ADB9BDA9FC000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000BDBDFF9FFBFFDFFBFBDE99F9EDBD90B9FF9FFBBFFFDFBFCF0DB9F9BDBDADBF090C0099099F9FF9FFDBCF0FDA9AC0000A000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000BCBFBF9FFFDFBFBDFDF9BDBBF9F00A9FFF9EFFCF9E9B0D9B9DBC90C90DADBC900A909CADBF0FBDFBDBDB9F9AD9F0A000000000000000000000000000000000000000A00000A0000000000000000000000000000000000000000000000000000BDBFDFDFF9FBFDFDF9F9ADAFC9F090DFFE9E9B990BD90D9E9CB09AD99E909090E9909A99BE9DF9F9F0FA9DADF9E0000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000ADBFBFBFFFDBFBFBFBDF9D9B90C00B09F099C9E9DADF0BDDBDFDDBAD9BDADBF9F0F0DBC99FB0BDBDBD9EBDA9E9BC00000000000000000000000000000000000000000000000000E000000000A000000000000000000000000000000000000009FADFFDF9FFFFDF9FDFBDBAD0F99BD0F09FE9BF9F9F9FDFBFDBFBFDFBCF9F9CBDAD9B0DBDA9DFDBCBDBD90BDA9EDA90A0000A00000000000000000000000000000A0000000000009000000000000A0000000000000000000000000000000000CABDFBDBFFFBDBFBFFBF9E9DB9ADADBF9FF9BFDFFFFFFFBFDFBFDF9F9FF9F0FBDADBC9F09A9FB9ADBDA9AF9DA9F9A9C000000000000000000000000000000000000000000A000000E0000000000000000000000000000000000000000000909A9BDFBFFFFF9FFFFDFBDF9F9BCBDBDBE9FF9FFDFBF9FDBDFDFBFDFBFFFDBDADF0F9DA9E9BF9DF0FDBDB9FD99A9E9E9CA0000A00000000000000000000000000000A000000000A0000900000000000000000000000000000000000000000000BFFFFBFDF9F9FFFBDBF9FF9E90FBDBCBDFFDAFDBFBDFFBFFBFBFDFBDE9F9ADBDBDBD0BDB90D0FA9F0B9F0F9BCBD990F0BCB00000000000000000000000000000000000000A000000000E000000000000000000000000000000000000000009ADBF9F9EBFFFBF9FDFBDFF9E9FBD9DADBDB9FBDBFDFFBDFDBDFDFBF9FBDFFFFF0FB0FBFCBCB9BD9F99F9E9F9E9BDADA9AD00CA00000000000000000000000000000000000000000000000B00000000000000000000000000000000000000000ADFFDFEFFDF9FDFFFBFDBF9F9F9C9ABD9F9EF9DFF9FBDFFBFFFBFBDFFFDBF9F9DB9DF9C9BD9DE9A90F0BDBDBDBDBC9BC9CBCB0D00000A0000000000000000000000000000000000A000A00C0000000000000000000000000000000000000000BDFBFFBF9FBFFFFBF9FDBF9F9F9E9B9D9BE9F9FBF9FFDFFBDFDBDFDFFBDBF9FF9FADE90FBDA9A9BDBF9BD9F9E9F0F9BCB0B0BC9A00A0000000000000000000000000000000A000000000000B0000000000000000000000000000000000000009FBFFFFDFFDFBF9FDFFBFD9F9F0F9BDA9AD9F9F9E9FDBFBDFFBFFFBF9FDAD9F09E9DB9BF90BDBD9DAD0F0FBDBDBDBDAD9BC9E00FC00000000000000000000000000000000000000000000000E00000000000000000000000000000000000000ADFDFBFFBFBEFDFFBF9FDBEFF0FBDFCBDF9A90F9F9FBFDBDB9DF9F9FFFBDB9E9F99E9FC90FD09CB0BDB99F9EDBFDBDBDADCB09CB0BC0000000000000000000000000000000000000A000B0000900000000000000000000000000000000000009FFBFBFDFFDFFBFBDFFFFBF9F9F9DBB9F9AD9DB9E9F9E9FFFFFBFFFFF9DFBCBBDADA990B9F9A9F9DBD0DAF9DBBDBCBD9F9BBC9EBC0DA00000000000000000000000000000000000A0000000000E000000000000000000000000000000000000BBFBDFFFFBFFBDFDFFF9F9FDF9FBFFBDFDBDF0B0F9F9F9FBDBDBDBD9F9FFADBDCBF9F9E09C909F0BAD0BBD9FFBDFDBDAF0F9C9A900BA00A000000000000000000000000000000000000000000009000000000000000000000000000000000000DFDFFBDFFFDFFBFFFBFFFFBFBFDBDBDF9BF9BF9D0BDBDF9FBDADF9FB9F9F9FDFBF9F0F9F0B0F09D9DBBD9FBDBDF9BF9F9F9E9AD0F00D000000000000000000000000000000000A0000000A00A00E000000000000000000000000000000000000BFBFDFFBFFBFCFFBFDF9F9FDF9FFFDBFFDFFDFBF9CB0BDBDFFF9AD0DADADFBF9FDFF9F09F0F9FA9A9D0BC9FBDBFFDBF9F9F9F9AD0ADAD00A00000000000000000000000000000000000A0000000B000000000000000000000000000000000009F9FDBFFFDFFFBF9FFFBFFEFBFFDBDBDBDBF9F9F9FB9DF9FBC99FDBFFBDBFBDFFFBF9F0F9E99E99C9F0BDFBFDBFDBFD9EDADADADA0D00A0000000000000000000000000000000000A00000090C00C00000000000000000000000000000000000BFFFBFF9FFFF9FFFF9FFDBDBDBDBFBFFFFDBFFF9FD9E9A9F9FBFFBFDBDFFFDFFFFDFFF9F090FB9E9B0F9F9FDBFDBFDBFF9F9F9F90F00BC00000000000000000000000000000000000000000A00A0B00000000000000000000000000000000000FDBDFFFFFBFFF9FAFFFBFFFFFFFFDFDBDBFDF9FFFBF9F9CBD9F9FDBFFFF9FBFFDBF9F9E9F0F0DE90DB9F9FBFDBC90BDB9F9F0F0E90BC0900000000000000000000000000000000000000A0000900E00000000000000000000000000000000000BFFBF9FFFFF9FEFDFBFDBDBF9F9FBFFFFDBFFFBFDF9F9B9EB9CFBFDFBDBFDF9FFDFF9F9F0D0B99E90F9FFD0900BCBC0D0BCBD9F9E90B0E0E0000000000000000000000000000000A000000000000900000000000000000000000000000000009FBDFDFFBFDAFBDBFFCFFFFFDFFFFFDBFBFFDFFDFFFFFFDF9DA9BDFBFDFDAF9FE9FBDFCBCB0BCBC09F9E90BCBDBDBDBF0BC90FADA9CAC09000000000000000000000000000000000000A000A00A00E0000000000000000000000000000000000FDFFBFBFFDFBDFFFFFBFBF9FBFBDBDBFDFFFFBFFBFF9F9F99ADBDF9FDBEBD9FF9FFDBDBDBC9C90B9F0F9CBDBDBDBFDF9FFD0F09DBCB909E0000000000000000000000000000000000000000000000B0000000000000000000000000000000000BFBDFDFDBF9FFF9EBDFFDFFDFFFFFFFFBDF9FFDFFDFFFFBFFDBCB0F9BDBDBFF9FBDBCBDADB09E9C9AD0F9E9F0FBDFBFFD9FBDE9A0BCCA00000A000000000000000000000000000000000000000000C00000000000000000000000000000000000FFBFBDBDADBFFFFFBFBEBFFBDF9FFBDFBFFFFFFBF9F0FDBDBDBDBCF0FDBDADFDFBDBDBDADA90B0F09BCBDBDBDFBDF9FBE9F0BC9C0B9DAC0BC0000000000000000000000000000000000000000000F0000000000000000000000000000000000BDFDFFFFBDBFFBF9FEDFDFDBFFFFFDFFFDFFF9F9CDADF9EDBCBDADB9F9F0FDBFBDFBFDADBC9E9C909E9F9F9FF9BDFBFF9FF9FDBF0BCA0090000000000000000000000000000000000000000000000A0000000000000000000000000000000009FFBFFBDBDBFFFDEFFFBFBFBFDFBFFBFFFBFB9FCFFBF9BDFBDFFF9F9F0FBFDBF9DF9EDBDBC9A9DA90F9F9FF0F9FFFBDF9FF9FFBDCBC090F0ACA0000000000000000000000000000000000000000000D0000000000000000000000000000000000BDF9FFFCBDFDBFBFBDFFFDFFFFDFDFFBDFCDCBBF9FDFFFBDF9FFFDEBDBDFBFDEFBFDBDADA9D0E9E9BDBE9BDBFDBDFBFF9FF9BCBBDBDE0000000000000000000000000000000000000000000000000A0000000000000000000000000000000000BFFFFDBDBFBFFDFDFAF9EBF9FBFFBFDFF0BBFDF9F9F9F9FBFBDBFFFDBDBCDBF9FDBFDBDBDE9B909E9E9DFDBDBFFBDF9FF9FFDFDE9EBFCB0F000000000000000000000000000000000000000000000F0000000000000000000000000000000000FDBFBFFF9FFFEBEBFDFFFDFFFFFFFFFE9FDF9F9FFFBFFFFDFDFBDBDFEBCBBDBF9FFDADADA90C0F99F9FBFBFFF9FFFBFF9FF0FBDBFDBDF0C00000000000000000000000000000000000000000000000000000000000000000000000000000000BFBFDFFF9BFFFBDFFDFBDBFFBDBDFF9E9FBF9FBF9FBDFDBDBFFBDFFBFFD9F9CBDFFDBF9F909E9B0BE9FBDBDBDBFFDBFDBFF9FBDBFCBCBE00AC00000000000000000000000000000000000000000000F0000000000000000000000000000000009FDFFFF9FC9F9EBDABFEFFBDFFFFBEF9FDF9F9FDBDFFBFFFFBDFFBDFF9EBCFBCBF0FF9F0FDA90C9D9F9FFFFFFFDBFFFFFDBFBDFCFBDAD9E0900000000000000000000000000000000000000000000000000000000000000000000000000000000BFBF9FFBFB0F9EFDF9FBDFFBDFFFD0FBFFFFFBFFBFDF9FBDFBFDFF9FFFDBFDBDFF9FFDB00DA9ADADAF9F9FF9FFF9FDBCBDADBBF9E9FACBC0A00000000000000000000000000000000000000000000F000000000000000000000000000000000FFDFDFFDF9DBC9B0BEFFDEBDFFBFDBFFDFBDB9F9FDFBFFFFFBFFBFBFF9FFFCBFBDBFDADFDBAD0DABDBDFBFF9FF9FFFBFFBFDBCF9E9E9DBC00000000000000000000000000000000000000000000A00A000000000000000000000000000000000BDFBFBFFBCADABCFDF9FBFFFBFFDAFDBFBDFFFFFFBFDFBFDBDFDFDFF9FFBCBDBCBFDBFF0B0D00BDDBDBBCF9FDAFFBDFF9F9ADB9E9F9EBE9009C0000000000000000000000000000000000000000000D000000000000000000000000000000009FBFFFFF9F99A9CB0BFFFFBDFFDBFDBFFDFFBDBDBDFBFFDBFFFBFBF9FFBDFFF0DBDBFDBDBCB00D0BADADDF9EBFDBDFBD0F0FDAD0B9E9F09EC00A0000000000000000000000000000000000000000000E000000000000000000000000000000000FDBDFFFFFFF0A9ED0FBFDFBFBFFADFFFBFBFFFBFFBDFBFDBFDF9FFF9FFBBDFCBCBFDBCF9F0DAADDBDBA9BF9F9FFBDFFBDB0BDAD0F9E9F09A0000000000000000000000000000000000000000000000B000000000000000000000000000000000BFFFBDFFFFAD009ABFDEBFDFDFCDAF9FFDFDBDFDBDFBDBFFDBFF9F9FBDFDBFF9FBDBFFBDADA9DABCBDFFF9FFFFFFEBDFADFC09B0BCBDADAC0000000000000000000000000000000000000000000000C00000000000000000000000000000000BFDBFFFF9FDF09AFADFFBFEFBFBFBFFFFFBFBFFFBFBFFFFFDBF99E9FBCBDBEF0DADFFDBDE9F09E9DFFF9F9EFDBF9DBDF0FDA9BF0FC9FADA900000000000000000000000000000000000000000000000B000000000000000000000000000000009FFFDFFFFFBDE000DA9FFDBDFFFC9F9F9FDFDBDBDFF9FFFFBDBFFBF9DBFFF9BE9FB0FBFBDB09E9EB9F0FBD9FBCFFEF0BD0BC9C9F0BF0DBC000000000000000000000000000000000000000000000000F000000000000000000000000000000000B9FABFFFFFADA0F0DAFFFFFBDBFEFFBF9BBFFBFBDFFFFBDFFCBD9FAF9F9FFDF0DFF9FDF9EFDAD0DAD90CAF9E90909CA9FCB0BCBD0BF0CBC000000000000000A0000000000000000000000000000000E000000000000000000000000000000009FF9FDFFDBFDF0000BF9EFFBFEFC9BDE9EDF9FFDFFBDBDFFADBDBE99DFFFF0F0FFBDFBF9E90000B0F0ADB9C00E0E0009CA90D0BC0F09BF0000000000000000000000000000000000000000000000000900000000000000000000000000000000BD09FBFBFFCB0000BF0FFBDFFDBFBCFBFB9AFFDBFBDFEFCBDBCBC99EB09B9FBDA9CFBFDA00090BCD9FDB0CF0F0900E9CA9C00BD0B09EC0C000000000000000000000000000000000000000000000000E000000000000000000000000000000000FBF09FFDBFBE900C0FBFFFFBFF0DBFDFDFDBDADBDFBDBFDA9F9F0F99FEDE9FE9EBFDFFD09ADADBE9BFFFB0CADE0000AD09A9CAC9CA99A0E00000000000000000A00C00000000000000000000000000F00000000000000000000000000000000BDF9F09BED0D0E00B00FDBEDFBFFE9FBFAF9AF9FFFCBC000C0CBCB0F09B9BDADBDFBFFBFFF9F9E9FFFFFFDA900000000000DA90B09CAC0900000000000000000900A0A0000000000000000000000000B000000000000000000000000000000000FBFCBC09A9A900000BDAFDBED009EBDF9FFD9AD0A0C0A90A0BDF0D0BCF0DAD0FFBDFBFDBDE9FBDADFBFFC0EDAD0AC09ADA00CBCBCB000E00000000000000090C0090000000000000000000000000A0C000000000000000000000000000000000BFCB009AD0000000ADAF9FAD0BFFBDE9FF0BED0BFDB09CAD0DA0DA9E9B9EBCBF9FFFDFBFFBF9EDBFFFDB0F90BCAD09ADAC9CBC09000DA00000000000000000A00E00000A0000000000000000000000B0000000000000000000000000000000000FBC0000000000000000A0FBFCFFCFBFE9FD9BFDFFFFE0000AD009F9FCF9CBDFFFBFBFFDBD9F9BDBDBFEDACBCBDACBC090A909E00E9AC9C000000000000CA00090000000000000000000000C0A00C0F000000000000000000000000000000000009A0000000000000000CBDEBFEBF0F9FFAFE90BFFFF0F00000BCBCF9BCB0FBF9FDFF9FFFFADF9E9F0F9FF0F0CADBCBCAD0E0000F0F9A0A0000000000000909E000000000000000000000A000000A0C00000000000A0000000000000000000000AC000000000000000BDBDAFDE9FFF0FDADF9EF9FBFDFDADADBCBCB9EDAC9FDFFFBFDFF9BDF9BE9F9BDA9CE9E9C0000000090F9F9F0C9C000000000000000E0000A00A00000000000000C00A0CA000B000000000A00000000000000000000000090000000000000009E9EBFFFBFFDADEBFF9E99EDFFEFADF9F0F9F9EDA99FBFBDBDFBF9FDFBFFDBF0F0F9F9BC0A00F0DBCBCF0F9E9EB0A00000000000009A000000000000000000000A0A0D00000C0F0000000000000000000000000000000000000000000000000009FFFFCFF9EBFCBCF0F9EFDBE9DBDAFD0F0E0F09CBE9F9FFFBFDFFBFBDBDBDF9FF9F0BCB9D9F9E9AF9FBF0F9E90C900000000000000C09A00000000A000000000000A0AC0A0A0E000000000000000000000000000000000A0000000000000000A00BCFBFEFDFBFCBCF0E9EADBEBCFDAE9F9F00E9BDFBDF9FDFBF9FDBDFFBFBFF9F0F9F9EFADADBC9AD0DADA09E9A0E000000000000A900000000000000000000000C000A00D00D000000000000000000000000000000000000900000000000009CBFFBFDBFFADBBCBDFBDFDFEDCB9AD9E0C00F0FCB9FFBFBFBDFFFBFFBDFDFDBFBF9E9E999BDADBC9A9BF09F0000090000000000000000000AC00000000000000000AC009E0A0B00000000000000000000000000000000A0000A00000000000000BDADFEFDADFCFFFAFDEBFFFDBFCEDAC90BDBDB9FFF9FDFDFFF9FFDBDBFBFBFDFDF9FB9FEF0F9ADADAC09E0E0DA9E000000000000000000000A00000000000000A090ACA000CE000000000000000000000000000000009E00000000000000000BCBFFBFBFFBFBDBDFCBDEF0FFFCBDADBCBC9A9FFF9FFBFFBDBFFDBFFFFFFFDFBFBFFDFF9F9F9FF9F9F9BC909A0C0000000000000000A000000000A000000000000CAC90C0CA0F00000000000000000000000000000000009E00000000000000009CBCFDEDBDEDBCBDBFBD9F9ADBCBCB0BDBFDF9FFFBDF9FFFFDBFF9F9FBDFBFDFDBFBDFFFFFF0FF9FEDBADAC9A9E9E0000000000CA00000A000000000A0000000000A0A0A900B000000000000000000000000000000000A00000000000000000A0BFFBFBFEFBFFBFBCBCBE9EDADBDBDFDBF9FBFF9FDFFFF9F9FFDFFFFFFFFFFBFFFDFFBDBDBDFF9EF9FCDADBC9E9C0000000000B0000000000A0000A00000000A0000C0900E0E00000000000000000000000000000000AD00BC00000000000000DADAFDFFBDF0FDEDBDFBDBFBDBFBDFBFFFFFFDFFFFFBF9FFFBFBFBF9FFFF9FFFFDBFBDFFFDBF9FF9E9BBF9ACB00A000000000000900000000000A0C9000ACA0000E0A0E0E00F0000000000000000000000000000000000A00000000000000009ADBDFFADFBFFBFBFFBCFFFDFFDFFFFFFDFFDFBF9FBFDFFF9FDFDFDFFFDFFFFDBFFFDFFBDBFDBFCBDBEDC9EDBCBD0000000000000000A00000000000ACAC0009CA009C0009A0F00000000000000000000000000000000B0C0009A00000000000000FB0FFBFE9FFDF9FFBDBFFFBFFDBFFFBFFBFFFFFDFF9FBFBFBFBFBDBFBFFFFFFFBFBDFADBFCBDFADBFBE9E9ACAC000000000000A000000000000000000A0A0000A0ADAC0C090000000000600000000000A00000000000A9A000000000000000A90FFBDEDBFF0FBE9FDFFFBDFFBFFFDFFFFFFDFFBFBFFFDFDFDFDFFFFFFDFBFF9FFFDFBDFDFBDBFDBCBDBF9EF90B00000000000000000000000A0DA0A000C0CA00C00000A0AE00000A000000A000A0000000A000000A9AD00C000000000000009CBDBCFFBFDFFFFDFBFFBDFFFDFFFFFBFDFFFBFDFFDF9FBFBFFBFBDBFDFBFFDFFFDBFBDFBFBDFE9ADF9ED0F090AC0000000000000000000A0000000D0C0A90A0C0A0AC0F0C0F00000000A00000000000A00000000000000A0A000000000000000A9EBFF9EFFBF9FBFFFDFBFDFBFF9FFFFFBDFFFFFFFFFFDFDBDFDFFFFBFF9FBFBFFDFDBF9FDAF9FFCBDFBF0DAC90000000000000000000000F00000A0AC0E0C0A90C9A000B0F0000000000A000000000000000000000E00C90000000000000000009E9BF9FFFFFFFF9FFFFFBFFFFFFDFFFFFFFDBF9FBDBFBFFBFBFBDFFFFFFFFDFBFBFDFF9FDBF9FBEB9E9FA9A0000000000000000000B0C000ACA0009A00A90CA0A0CAC0C0B00A000000000A00000A000A00000000909A0000A000000000000009E9EDFFF0FFF9FFFFBDFFFFDBDFBFFBDFFFBFFFFFFFFDF9FFDFDFFBFDBFDFFFBDFDFBF9FFBFCF9F9DE9FC9C0000000000000000000000A000009C9E0C0F0CA00C0CB09A0AE0000A00AC00000000000000000000A0C0AC9A0000000000000000B0A9FBE9FFF9FFFFFFFFFBDFFFFFFFFFFFBFDFFDBDBDBFBFDBFBFBDFFFFFBF9FFFBFBF9FF0FDB9E9FEBDA9A00000000000000000000C0000A9C0A0A000A00A0CB00A0CAC0CF0000000000A0000A0000A0000000000A00000C09000000000000000D9E9FFBFFFFF9FBDFFFFFBFFBFFBDFFFDFFFBFFFFFDFDBFFDFFFFFFF9FFFFF9FDFDFFDBFDBEF9F9BDA9C0000000000000000A00000AD0000A0C00E9E9E0CB0CA9CA000B0F0000000000000000000000000A000009E9A000A00E00000000000000A9E9EDBDBFFFFFFF9FFFFFDFFDFFBDBFFBFDBDFBFBFFF9FBFFDBF9FFF9FFFFBFBF9FBDBBDBDADE9FDA900000000000000000000A00000C009A900A000B0CA0CA0DACAC0900A00000A0000A0000A000A0000000A000C0B000090009000000000B0F9FBFFFFDBFDFBFFFFDFFFFFFFFFFFF9FDFFFFDFDF9FFFDFDBFFFFFFFF9FFFDFFFFDEDFBDADBFF0A9C0000000000000000000AC90A0A0A0E0CAD0F0E0CAD0A0CA0900AE0000A00000AC000000000000C00000009A9AC000000A00A000000000C9AFE9FBFFFFBFFFFFBFFFBFFBFFDFFFFFFBFFBFFFBFFDBFBFFFFFBDBFFFF9FFF9F9FBB9CBDBDB09D0A0000000000000000000000C00D00000B00A0E00B00A9CB00E0BCF000000AC00000000A0C00F000000A00AC0C900B0A000C00000000000BCBDBFCF9FFFFFDFFDFFFDFFFDFBFFF9FFFFFFDFBDFDBFFFFFFBDFFFFF9FFFFBFFFFBDDFBCBDADF0A900000000000000000000000A0000BCBC0E0C00BC0E0CA00CB0E0AF00000C00000000A00900000A00A000C90A00A0C090090090000000090B0F9FBFFFBDFFBFBFFFBFFBFFFFFBFFFFFFDFFFFFBFDFBDFFDFFFFF9FFFFFFFDFBDFBE9F9FF9B0D0C9A00000000000000000A000000A0000A90B0F00A00B0CA0AC09C0B00A000000A000C0000A0A00C00000000A00A09A0C0A00A000000000000DADADBF9FFBFFFFFFFFFFDFFFDFFFFFBDFBFFFDBFFBFFFFBFFFBFDFFFBDFFFBFDFBDBFDB0BCF0A9A0000000000000000000000000000CAC0E0CA0CAD0E0CB0F00ACA0E000000A0000A00000000000000000A90C90C0000A000000000000000ADA9FBFDFFFFFDFFDFBDFFFFFBFFFDFFFFFFFFFBFFDFFFDBFDFBFDFFFBDFFBFDFFBF9FF9ADFDB0F90C0000000000000000000000A9C090A90B00BC0B00A90A0C00ADA0DF0000000000000000AC000C0A0000000A0A9000B0900009C0000000009A9F0FDBEBF9FFFBFFFFFDBFFFFFFFBDFFFFFFDFBFF9FFFFFFFFFFFBFFBFFDBF9FDFFDBDFA9A09C0B0090000000000000000000000A0E00CAC9E00E0DAC0E9CA0E00C0AF000A0000000000A000000A00CA00C00000A9AC00CB0DA00B0000000000CBDAFFDFFFFBFFFFFFBFFFFFFFBFFFFFFFFFFFDFFFFFFFBFFFFFFFDFFFBFFFFFBDFBEBDF9D09B000000000000000000000000000000B000A00F00A0CB00A09E9ADAD0D0000C0000A0C000000A009000000A0009C00C9A0A00000000000000000B0BF9FBFFBDFFDBFDFFFF9FFDFFFFFFFFFDBFFFBFFF9FDFF9FFFFFBFDFFF9FF9FFBDF9F0B00AC000A00000000000000000000000000C0F0DAC0E9CA00E0CAC00CA00AA000000A0000A00000000E00A000090BCA00B000900000000000000009C90F9EFDF9FFFFFFFBFFFFFFFFFDFFFBFFBFFF9FFDBFFFBFFFFFBDFFFBF9FFF9FFBDFBFDBCF99000900000000000000000000000A09A0A00A00A00AC9E90B00F0A90E0F000A000000000000A00000C0000E00000B0C0A00000B0000000000000A0F0F9FBFFFF9FBFFFFDBFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFDFFBDFFFFF9FFBDFFBDFADF0B00000000000000000000000A000000C09C9E0CBCBC9A00AC0E00E0CA9CF00000000000000A00C000A0000900E00000B0900E90000B0000000000090BCBCBDBFFFFFDFFBFFDBFFBFFFFFFFFDFFFFFFFFFFFFDBFBFFFFFBFDBFF9FFBFDFBD009D9E9000000A000000000000000000000A00A00F0000AC0AC9A09E09A0CA0F000000000A0000C0000A000A00A00900F0F0CA000000000000090000090A09F9FFF9FBDBFBDFFFFFFFFDFBFFFFBFBFDBFF9FFFDFFFDFFF9FFFDBFDBFF9FDBF0F0EB0A00000009000A000000A900F000000000A0CA00E9E0B0DAC0E00BC0E90EA00000A000000A0000A000C00000000A00000B0090000000000A000A0000D9F0BE90FEDFFFFFFFFBFDFFFFFDBFDFFFFFFDBFFBFBFBFFF9FFF9FBFDBFF9FFBF0BFB9C09000A0000009000000000A0000A000000D0B00F0A0C0CA00A90AC0A9CA9F00A0000A0000000000000A0C000E000D0BCBC9C0A0000000000000090A00A0BC9FF9BFADBDBFBDFFFFFBFFFFBFFFDFBFFFFFFDFFF9FFFF9FFFDFBFDBF9FDB0DBCF9AC0000900A0000000E00000000C000090A0E0CA00CBA0A0CBC0E90F0CAC0F00000000000000A00000900000090A0A0000A0A009A0900000000000009090DB09AD0BDBFFDFFFFFFBFDFBDFFDBFBFDFBDF9FBF9FFBDBFF9FBFFDBFFDFBAD0F0B0C900900A0009E00090000A09E0A00C000E900A9CAD0C0D0B00AD0AC0A90B0D00000C0000A000000AC0000A00000090CB0BC9090C000000000000000000ACA0DADAF9EFDBFBDBF9FFFFFFFBFBFDFFFBDFFFFFDFF9FFFDBFFDB9FF9EBDFD0D9D09A00A00D00D000090E0009C0C09000A00A00E9CA00A0A0AAC0E00AC9ACAC0EA000A000A000000000000E0000A00E00A00C0BC0A0A0000A00000000009AD0909A0909CB9BEBDFFFFFF9FBDFFDFFFF9FFFFBF9FBF9FFBDBDBDBEFF9F9DA90B0A0AC00D00A000A0000A00000A09A0ACB009000F00A09E0F0D0C9A90AD0AC900F0F0000000000000E000000000C00000000A9ADAAD0090C0000000000000000A0000F0F0BDEDBDAF9FF9FFFFFBFFBDBFFBDBFDFFDE9FDBDAFDAF9F99E9AF9E9C09C9090A90D0B0000B0C900A00000D000E0E0F00AC9E0000A0A0AC0E00E90ACA00F0000000000000000A0000A0000000009C000D0AC000B000000000000000000F00090F0B9E9F9FF0FFBDBFDF9FFFF9FFEDBF0BF9FBF9FDBF9E9FE9FFD0F09A0000AC90CA00C00000000090D0AD0A000900A0BC0A00E9E0CAD0CA09E00E00BCB0F0000A00000A00000000A0C0A0000A0C000A0AD9A9A00000000000000000009009A0F00DA9BCBD0FBDFEFDBFFF9E9E9F9BC9FD0BD09F0BF0F9F09F09AD00E090A0000A909A0009000A0ACA0A00A0D0A0E9C0C0AD0E9A09A0A0B0F00BCBCBC00EA0000000A0000000000000000000000A0A090F0A0C0000000000000000AD00000AC900FADDE9E9FBDADBDBF9F0F9F9F0BCBCB0BDAFF0FF09E9ADFADBCB0900000D09AD0AC009A0CA90C900C900000AC0000A0BC0A0C0CAC90E0C00AC0000ACB0F00A0000000000A000E000A0000A0900090ADAFC9A000000000000000000A000009EF0900B9B9E90F9BDBCFADBC9ACB9CB0BCBDA909F09DF90DA900090E0000000A000C900000000C9A009A00E900009A0E9E00AC9A0A9ACA90A0E9A0E0F0AC0F000000000000000000000C000000E0000C0090AC9ADACA000000000009009AC00090E0DAC0CA9E9ADACB90F00BF900E9C909E9CBF09FAA0F09CA9F0A9000900090F00A000000090A0C0AC00000E09A0C9000F09AC0F00C0CAD0B0C9A9A0C9A0D00000A0000A00000000A000A000000ADA09ACBDB0C009090000000000AC000090BE909A09A90090F0DB0E909F00CBC90B0F090BC90F0D9F09E09C00D00A0000A0000900000A00A0009090BC000000C0A00E000E0A00ADA9A00E0E0E0C0F0E0DA00000000000CA000A00000000000000000AC90A0E9A9E0AC000000000009000A0C90E0000000F0E90B0C9A9E0C9B09AF0F0F0AD9ADADBE0A009A00B0009C00C90F0000C0A09C90C90A0E000B000B00BC0E900E090DAC00AC0E909A009A0A90AF00A0000A0000000000009E000000A900A09A0E9E9ADE9C90A9000000F00AC0000BFE900000F0009CADABC9CB0BC0E9C0DB00F9A0DB00090D000090CA0000A90E0000A9A0D00000A0C00000000000000B00ACA9ACA00B0E0B00ACAC9EAC9CAC0F00000000000000000000000000000CA9C00CB009E09AFAE9CA0000D000000009000FEC09E00090A9C0D0BE9CB0BC9A9E0CB00C9A0CBCBCA09000E90000BC00B0F009C000000A0900B000BC000000CAC0E90BC009CA0CA9C0AD0A9A00DA0BCB0D0000000000A000A000CA00A000000000A0A90CBE9AE9C9F0B0DA00000000000AC9E9A9000000A000B0AD0DA0F0CBADA9B00DA90D0B09090CA00900009C009AD000F0000B0AD00E0000F000A00A0A900B00E00BCAA0F00E0AD0AC0CBCA0CA00CA0000A000000000000000000000A00A0009C00A090C90BAF0FCA00A00A0000BC09A9FC0A00000C9CBCAD0E9ADADB0D0D0C0B090E0BC0A0E9000000000A0B0E000B000A9C00000000000000000009C0CAC0E09AC009C00F0BC0ACB0B0A9CB00FAF0000000A000000000A0000C0000009CACA9E09CBEB0E9C0F0BDAD00000000000ACBCBC0000B00A00909A9AD09E0DA0A9AD0CA090009C90A000000000D0C09000C9A9CA9AC900A9000A00E009C0A0A090A90E0A0E0BCA0C00E90E0CAC0AC9E00F000000000000A000000000A0000000090009A0000CB0EB0FE0F0FAD00000000090E9E9E9000090F0A0E0C0BE09A0DAD000B0D0E90A0000000000000A009A00DA00CA90C00AC000C000900000A9CBCA0C0E00D0B0C0ADA0E90E09A0DA9CA00F0D00A00000000000000000A000000000A0A0A0C00BCB0F00F09F0F0DA0F0000000009E9E00C00CAC00D090B0C09E0F090ADAC0A0000D00AD00000000090A00DA00900000B09000000A0CA000A000A009E0B0F0A0CA9AC00E90E0BC0F00E09EA00A000000000000000000A0C00000000A0D09C0B0BCA0F00F0AF0E9EBED0A90A00000F0E900A0B0090B0ACA0DA9E0900E0D0090090000000000000090AC0D0DA090CA90AC00CA00A000090009C0F00D0E000C0AC0B00CA9E9CA9AC0A00E90E090FF0000A00000A0000A0000000A0000090ACA9E0C09ADADA00D0BDE9C9AD0C00900000A9EE090CBCAC0C090F0C09E0F090A000B00CB00B0000000000009A0A0000A000C900A0C09000000A0C0A00E0A90ACB0AC9E0E0BCA00AC0CBC9CB0CA9E0E0F00000000000000000000000000000C0900A9A0E090F0F0E0E0B0FACBE9A0C0A000AD0900E9A0090A9E000B0E0900CA9CB0C0CB0000000000000A0000D0D000C000A0A09090AC0E0000D0A09A090CAC9AC09A09C9E00DA0DA9A0AA0CA9CA0DA0D0000000A00000A0000A00A0000A09A00AD0C0900E00DAD09AD0E9CBC9AC90AC00000ACA090D0F0AD009E9C090E0B000000B000000000000000000F0A0A00A9000D09C0E00A900000A00000C0CA0B0A0CA9E0CA0A0BE00F0CAC9C9E9CA0DA00CB00000000000000000000000C0000A00F000B0E0A9AFA9E0AD0E9AF00AC9A09090C0BC9000E0A00DA09E00A00E90C09E000000000000000000000000D0000000A9A0A0900C000B00900A000B0A9C0C0CB0E00B0E90C09E00A90E0A0AA9CA0BCBE0A00000000000000000C000A0009C0000A0C0900C009EDBCA09AD0BC9AC000C0A0000E00009C9E00F09AD0F00090A00000000000000000000A09A00000000C00C0D0CA0A9000C00AC000BC00C0A0B0AC00DAC00E9ACA0CBCAC9E0C9C0AD0E00F0000A000000A0000000A0000000A000BC0B0E0F0A9E00ADADBC0AD0AC9A9E0A0900009E9000A09AC0FE0A009E00000000000000000000000090C0DA000090A09A00A90C00ADA0000000C00A9A0C0CB0ADA00ADA0C0BCB0CA9A00B0A0F0A09E0D000000000000000A0000000000AC0B00090090009009F0AD0E9ADA9CBAC0090CACA00000A0000C09A09C9CA0000000000000000000000A00000000000A00009C00000A900C000BC0B0B0000C00B0A0C0A0CBCA0F0BC0ACBC0CAD0E9CAC9E00BB00000000A00000000A000A000090000C0ACA0E0A0E0E0ADAADADA0DA0D0B0CA000900A000009A09AC9E0A09C0000000000000000000090C0CA09A000C00CA00A09E9C00A9A0AC00000C00A90A0C00E9A0DA009C0AC0AD00A0BC0A0CA90A09E0E000000000000000000000000000E000B0009000D0909ADA9CBCBDA0CB0ACB009000A000C0000C00CBE9C00000A000000000000000000000B09A0C09A090009C0000A0BC0C0909A9E000A0C00CB0E90AD0AD0EA0E90F00AF0E09E9CBCAC9CA9CF0000A00000000A0000000000A0000E0000A0E9A00E0000DA00E0EDA00F00CB0E0AC90C9A0000A0B000A000A000000000000000000000A00000C9A0C9ACA90A09A0D000A9A0E0C0009A0900A00000AC0AC0A90DA0E00E90090E00A00A9A0ACA0D00000000000000000000A00000000000CB0C00C0B00A00A0DA909ADAC00F00C90000A000000009C0F0D000000D000000000000000000C090E9A0C9A0C90CA000C0A0E90C0D00A0000C0E0BC0A0CBC9ACB0CACAC90E09E0E0E9CBCBC0C0F09E0B00000000000000000A000000000A000A000B00B0C09C0B0DAC0FACAD09A00B0A0DA0C0000000000B000A00C00A0000000000000000090B0E90C9A0C900A09C90A90900CB0A0B0CA0E0A9000000A00AC90CB009A0E90E0B0F00A0AC0B0A0CA09E000000000A000000000000000000000000C0AC0A0A000C0A0BA0DA9EE0D00C0CA00000A0000000000F0D0000000000000000000C0BCAD0E9E9AC9A0A009CA0AC00CACB00C0C09009090C0E00AD0CAD0E0ACBCACB0CA9AC00F0F0CB0CBC9AD0EF000000000000000000000A00000000000A00000D000A0000C0DA0F09AF0F0B009ADA00C00A000A0CA0A0F0A000000900000009A0BCB9AD9A9E9AC90C9E000090B0A90CA90B0E0ACACA0A000C00A90A90AD00A90CA9C09ACA000B00E00A0CA00F00000A0000000A000000C0000A0000009000E0A00009CA9A0B0C90FAD0A0ACAF0C000900000000009C0000000000E00C0DAC0E0D000C0A0C00000000A00AD00AC0D0A00CA000090000D000A90AC0E0CADACBCACBCA0AC0BCBCACAD0BC0E90F090000000A0000000A000A0000000000000E900900AC00000C00CBAE0C0ADDF0D00FADA0A000000000A09E0AD0CA0000A0B009A900ADA9A9C9A9C09A0000900A0CB00AC90B0C9ACACB0A00A000000A90BC00A00DA009AD0BC00AC900AC0B00E00E000000000000000000000000000000000000AC0000A0A0A9E9AC9C9AF0A0ADACB0DAC00D000000000000D00A9C900090CA0C00E90000C0A0CA0A0CA900CA0CB000090AC00A009000C000C000CA90E0CB0F0F0A0F0E0AC0A0E90E9E90E0DA09EF0000000000000000000000A00000000A00A000A000000D000E9A0AC00D0F0E9ACA0DADA0AC0CA0000000A0F0A0E0F0E90DA9E90ADADA90DA9C900000E0009000BCAC09AC0DACA00000C000A0000E9AA0E000E900A9C0BC0B0EA0A0E90A0CA00F000A0000000000000A0000000000000000000000000000A0D0E9E9A9E0A009ADADA0DA9C90A0000000A00000D09A0BCADACB0E0D00000E000A0E09CB09E0A0E0009A9E09A0090C0A000B00C090E00C9C0ADA0E0F0E0AC0F0C90D0E00E9E90F0900000000000000000000000000000000000000000000A000A0BC0ADE09CADAC09A0DA0E0A000000AC00C00C0A0E09C09AC90E09A0CBCB090F0090A000E09C090F0AC000AC0AC0A000A000000A000F0A0F0AC90B0C0BC9A00A0E0A90E9A00E00E000000000A000A000000A000000000000000A000000000000000F00BE0B0A0BCAC9ACB0D0F0D0E00000000A9009CA0AC00A0900CB000C0E00C0AD00E0900B0E00D00CA900900090C00C00A0000F0A0DA0C9ACAC0BE0AC0E9CB0F0CB0C0CB0CAF000000000000000000000000000000000A0000000000000000000E909C0F09CB00E90C0A000A09000A9A0900E0000D0A90D00CA00F0A0090A900A0090A0E090F0ACA90C00E00A00A00000C00000C9A0CB0E090AC00D0A90A0C00A0CA9A0CA90F00000A000000000000A000000000000000000000000000000000000ACAF00E00CB00E9AD0E00000E00C00A0000AC9A0D0E0A0A9000090A0000AC0DA00C900E00009000A00000C00000A0000ACA0A0CB00E90EADACA0AD0E9E0AD0F00E0DA0CA900000000000000000000000000000000000000000000000000000A0DA909E09EB0FE9AC0A90E0A009000C00C9000AC00A0BC90C0E00E0D0E9C09A00C0B00F00BC00CA000A000A0000000A0000900DAC0E90E9000B09CACA00BC0A00E90A0DACE000000000000000000000A0000000000000A000000000000000000000E0E9E00C009E0BD0E090C000A0A000A0E0900F09C00E0A90F090A000A00000B00E00000A0A0009C0009000CA000000000E0A09A0CA0CADACACA090DAC9E0CB0CAD0A90FA000000000000000000000000000000000000000000000000000000A00B0E9E9ADA09E0A09ACA90AC9C00B00000E000E0AC909C0000E000A90AC9E00F00BCAC0000B0CA00A0C00A00000000A000D0E00F09E90AD00ADA0E00A00F0CB00AC0E0D000000000000A0000A000000000000000A00000000000000000000000D0090A0CA0DE0F0F0C90CAD0A0BC0CBCB000F00090ACA0A0A000D00C090A00C0000009AC00C0A000000A00000CA0000CA0A09AD0AC0AC0A0F000E90F0DA00A0CBC9A00B000000000000000000000000000000000000000000000000000000000A0A0E9CB0DA090E0F0ADA90AC9CADA000E0F00BC0ACB0D0D0C9A0A0A00AC09A0AC0B0E00A90000000000000000000000090CAC0AC0BC9A9C0A9E90E00A00E9CA00AC9EE0000A000000000000000A00000000000000000000000000000000000000C900AC0A9CAC900BCA0CBC9EB009E9E900AC0AD0000A0A9AC00D0DAD09AC009A0C00900CA000C0A000000A00000000ACB09AC0B0CAC0E0F0C0E00AC9E90A0DAC9A00F00000000A000000000000000000000000000000000000000000000000000A009AD0A09A0E009C0BCA09CF0E000E0D0000ACBC0C0C09ADA0A000A000A0C0B0AC0000000000000A000000000A0000CAC0BC0A09A0900A900F09A00E0DA00AC0F0D000000000000000000000000000000000A00000000000000000000000A000C0AC0ADAC0F09E0A9E0DACA009ADA9A0ADA0090A9A9A0C000C000AC0F00DA0C000A000000A00000000000A00000000A90AC0F0DAC0E0E9E0E0CAC0F00A0CBC9A00B00000000000000000A00000000000000000000000000000000000000000000000BC009A00E009E90A0B0ADAC000CBC00DACA0C00C0A0A00B0E90000A00000900CA0000000000000000000000A9E0CAD0B00A00F0B000A90A90B00F0CB00AC0EE00000000000000000000A00000000000000A000000000000000000000000A00000B0E00CB0BCA0E09C0D0009ADA00BCA000C900A0000D0000000A0000000ACA0000A0000000A000A0000A000000B000AC0E0DA00CACBC0E0E0CAC0A0CAC0A90F000000000000A0000000000000000000000000000000000000000000000000A000090E9AC00BC09E0A0AE90C00090090F00A0E0DA09000AC00C000000CA0000000000000A0000000000000000000E9C0B09A0CB0AD00A0900B00BC9A09AD0E0D00000000000000000000000000000000000000000000000000000000000000000C0AE9C00AC00A000D0D00A0A00E0E0E00F0000000E000000A0000E0000000000000000000000000000000000E0E9A0AC0E0DA0C0A0E9CACAC0E00AC0E00A00B000000000000000000000000000000000A000000000000000000000000000000A00D00A00900B0D0B0A000C90C000900000000A00000A000000000000000000A000000000000C0000000000A00900CAD0A09A0C0B0D00A0B00B00BC0B00AD0FE0000000A00000000A0000000000000000000000000000000000000000000000000A0F009ACA0C0AC0C000A0000B0000ADA000000CA00000000000000000A00000000A000000A00A000A0000000ACA90AC9E0CA9AC0A0E9C0F0CAC0A0CAD0A00F000A0000000000000000A0000000000000000000000000000000000000000000000000E000000000A00A0000A0000E0000CA00000000000A000A0000000000000000000000000000000000000C09CAC9A00B0CA09E090A000A09AC9A00AC9E0D000000000000000000000000000000000000000000000000000000000000000000000A000000A000000000000C000000A0000000000000000000000A000000000000000A0000000000000A000A00A0A0C9E0CAD0E0CAC0F0E9CAC0AC9E00A00A00000000000000000000000000000000000A000000000000000000000000000000000000000000000000000A00A00000C0000000A00000000000000000000000000000000000000000000000090E9C9C0A00B00A00B09A000A00A9C0A09AC9EF00000000000000000000000000000000A000000000000000000000000000000000000000A0000000000000000000A00A00000A00000A000000000000000000A000A00000000A0000000000000E00A0A9E9E0CAC0F0CAC0CAC9E9CA0BCAC0A00F000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000A0000000A00000000000000000000A000000000F0C0A000B09A00A90A909A000A0C009AC9E0D000000000000000A0000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000000000000000A00000000000000000A000A9ACACAC0E0DAC0E0E0E0E0E9E9ACA0A000A00000000000000000A0000000000000000A000000000000000000000000000000000000000000000000A000000000000000000000000000000000000A0000000000000000000000000000000009E0C09090A090A09A090009090000000D0C9EF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000A000000000000000000A0000E009ACACAD0E0E0E0CACADACACACBCADA0A0A0F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000A00000000000000000000000000000000000000000000A000A000000000000E0090A00A90090A090000A00000A00CBC0D0D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000A0000A000A00000000A000000000000000000000000009A00E0E9CAC0E0E0DACACAD0DADAC0DA000A0AA000000000000000000A00000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000000000A0000000000000000000AC0DA9000A09A0900A000B000A00090A00CA9C0F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0CADAC9E0CACAD0CBC0CAC0E0E0E0E0BCA0AF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090A000A000B000A000A090B090900090000D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ACADACBCADACADACBCADACACACACADACADACA0F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010500000000000020AD05FE,'Margaret holds a BA in English literature from Concordia College (1958) and an MA from the American Institute of Culinary Arts (1966). She was assigned to the London office temporarily from July through November 1992.',2,'http://accweb/emmployees/peacock.bmp') +GO +INSERT "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(5,'Buchanan','Steven','Sales Manager','Mr.','03/04/1955','10/17/1993','14 Garrett Hill','London',NULL,'SW1 8JR','UK','(71) 555-4848','3453',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D20540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C00000000000000A0000000000000000000000E900000000C9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D000C000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000A90000000000000000000000CA0000000E900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000C00000000C00000000000000090000000000000000C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000A000000000000000000000CA00000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C00000000000000000000000000000000909000000000000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090000000000000000CA0000C000000000000000000C000000E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000C90000000000000000CA9000000E90900000000000000D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000AC0000000000009000000A0000E0E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000900CA0000000000000000B00E900CB0900000000C00000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C000000E000000000000000000CA00F0000DA00000000000000000CACA90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009CA0000000000000000C0000000A90CA9C9090000009000C0C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0000C0B0000000000CA000E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000CA09009000000000000E9000000000000000000000000000000000000000000000000000009A0000000000000000000000000000000000000000000000000000000000000000000000000000000000C0000C90000000000000000000000000C000DA09000000000000C9CE0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C000000000000C0CA00000000CB0D000000000000000EA9000000000000000000000000000000000000000000000000000A0B000000000000000000000000000000000000000000000000000000000000000000000000000B00000000000A000000000C0000C0000C0D00C0F09CB0B09000000000000DE0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D0000000000000CA9E9F0B0F0B9CBCB0D0000000000000000CF0000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000000000000000000C00000000000000000000000CB9C0D0A9C9ADCB9AD0B090000000000000EFA9000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000C0A90000000000A00000000E0DE90CB9AD9CB0DB0F0DBC900000000000000000C000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000000000090000B0000000000000C0000000C9CA90F9AD0DA9AD9AD90F00BCB09000000000000C00000000000000000000000000000000000000000000000000000A9A0000000000B000A00000000000000000000000000000000000000000000000000000000000000000000000009000E0F0BDCB0F9A9A9C90BC9AD0F9C909000000000000000E000000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000000000000000C0C90DAD0B0D0C9C9CBCBC9A9CB9CB0E900000000000000E0900000000000000000000000000000000000000000000000000B00B00000000A000900A00000000000000000000000000000000000000000000000000E00000000000000000000A0B0E9A9AD0F0B9A9A90909ADF99CBC99CA900000000000C0C0000000000000000000000000000000000000000000000000B00A0000000000000A0000B0000000000000000000000000000000000000000000000A000900000000C0000000000C0CB0D0D9A99C0D0D9E9E9C900FCBDBE99C09000000000000A0000000000000000000000000000000000000000000000090C00900000000000090000C000000A0000000000000000000000000000000000000000C0900000000000000C0000C09090DA9AC9CA9B0B009090B0F90BC0D9E9B00000000000000D0000000000000000000000000000000000000000009A900A0090A0000000000A0A00000A000000000000000000000000000000000000000000000000E0E000000000000000C000ADADA90DB9A9D0C90F9E0F0D90F0DBFADAC9000000000000CA000000000000000000000000000000000000000900000000DA0000000A0A0B0090000000000A0000E90000000000000000000000000000000000ACB000900000000000C0000AD090090DA9C0D00B9E900990B0E90DBC0DBDBC90000000000DAD000000000000000000000000000000000000C0A000000CB0090000C0F090000A000000A900009A000A900000000000000000000000000000000C90000000000000000000CA9000ADADA9CB9A9BC0090B00E90D9EBC9F9EDADB0900000000CACA0000000000000000000000000000000090A0B0000B0DA000A000ECBA00A0A009000000000A0000000C0000000000000000000000000000000000000000A0000000000000000090D09090B0C9009A90C0D090F0A9C9ACB9ADBCF000000000000D00000000000000000000000000A0B0CB0C000090000000090D00FF0C9E9090A00000000000000000CB00000900000000000000000000000000CB000000C900000000000090CBCB0BCBC9C9B00F0D00B909AD009C9BC9FCDBE9B0900000000EDA00000000000000000000000ADAC90090009000ACB000090E00A00EBEA0ACA9000000A00A009A00000E90000EB000000000000000000000000000000000000000000900E0090009C909A9A00C909A9D00AD009F0BC0ADA9BC9FCB000000000000000000000000000000000EFDFBDADA00A009A9000009A009A90000C9EF9ACA0000A90090000000000ACB0000F000000000000000000000000CA0000000000000E000E9000A9F0B0F00D09DA9AC900A9D0A9E00D0BD9ADE9FE9FC9000000000C0000000000000000009EFFFFEBCB0090090A0009009A000000C0000AEF0E090000A000A000A0000000CB00000CB0000000000000000000000009000000000000009E0000909C09C909A09CA9C900F90CA9C099F0F00ED09E0DBCBB00000000CA000000000000000CEFEFFFFFBDF0DA0000090C0A0000090E09A00000DEBC9A00B0000A90A000000000FE90000A90000000000000000000000000000000000900000090F0BCB0B0B09AD9A09090B900A99090F0009AD9A9E9F9EDE90000000CA90000000000000CFFFFFFFEFDEFA0B090E9000B0090A9000900090000A0EB00A009A9000009000000000FF00000E0000000000000000000000CA000000000A09A9E00000D0909C90BC900C9ADA9CAD09000F90E9F0DA0DAD0FADBDE90000000C000000000000CEFFFFFFFFFFBF9FD00A900A0000000C00A0009E00000000000DAE000A0A9A000000000ECBC90000B00000000000000000000090900000000C0C0000F09B0B0DA09C0B09A900900900BC9F0009000B0DA9DAD0F0E9F0000000000000000000CFFFFFFFFFFFFFFEF0BC9000090900F09000900A09000900000A0E09ACA090000000000000FFB00000CB0000000000000000000E0E0000000009A0000909E909C909A900D090F90E9A09090090BC990C9A9CBCBCDBFDA90000000E000000CFEFFFFFFFFFFFFEFFFF9FA9A09A9C0A0000A090009C0A0000A09A00FA9AC90B0A00000000000EFE9A0000A00A0000000000000000C0900000000000090ADA9E90DA9A9C90F90AC900090C909A09AD000E09E9CBCBCB0EDADB000000C0000CFFFFFFFEFFFFFFFFFFFEDFAC0D09000000900900A0CA000D000000000000CFFEAC00900000000000FFF9000009000A00000000000000ADA9000000000E000909099A909090A90A99B00B009000C09C009A90900F0F09EDF9EDFC000000000EFFFFFFFFFFFFFFFFEFFFFFBFDBB0A00000B000A00900090B0A0A0000A00000ACADB0A0A0000900000C0FFEB0000A0000000000000000000C0E000000000900DA9CBC9C9AC9A90C90C0090090A90B09A90BC0090F0090F09A0F9A9B000000E0CFFFFFFFFFFFFEFFFFFFFFFFFEBC9D00DA90000900A009000009000A0090000000F0E09000000A000000FEFF900B00000000000000000000CA9000000000000B909B09A90990C90B09A90F090C900000000009AC009E0F0FCFDADFCF900000D0FFFFFFFFFFFFFFFFFFFFFEFDF9FFA0B0000090F009C9000A0D0E000900A00000A000A9A000000000000CEFFE9A00000A900000000000000CB00000000000ACBD0F0C9099A90A900900900000A900090900900000ADA090D0B9A9E9E900000CAEFFFFFFFFFFFEFFFFFFFFFFFEBEF00D09A09A000000000A0900A900A00009000900A00000000090000000FFDB00000000A0000000000000000F0000000000990B99B90BC0DAC90B0C0BC909090009000000090909000D0E9EDEDE9E9F000000CFFFFFFFFFFFFFFFFFFFFFFFFFFDBF9A000000900090A00900090000000A0A00000090000C0000E0900000E0B000A09A0D0B0000000000000AC0F00000000CADBCBC0BC99A0990009A90909A009000090090000000000A90B00B0FCBCFB0000CFFFFFFFFFFFFFFFFFFFFFFFFFFFADAD0B0909CA09A09090000A09E0090A0900000A0A00000A90000A00000B000B0000000A00000000000000DE900000000C9B90999909A090A09090900A0009000900000000000009000C0C9EDE9F0F090000EFFFFFFFFFFFFFFFFFFFFFFFEFBFFFB0B00CA0009000000A0DA9C0090A00000A9A00000000A9000B000000000000000000000000000000000CE9A0000000E9BD0F9A0E9AD90D090BC0009090900900000000000000000909A9AD09AE9E9E900CFFFFFFFFFFFFFFFEFFFFFFFFFFEDB9CBC90090900009A009000000B000090A0C00000B000000A000D09A00A00A0000EB00A0EB00000000000CBC09C000099F09B9C99909009A900090B000000000000000000000000000000C0A0FD9E9E9000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFA900B000A90B0009009000B0C00A0A009A9A90000A00000000A00000900000CAF0B00CFFF9000000000ACBE000000E99F9CB9E9A909A900F09A0090900090000090000000000000000000DA0AD0F9E90CEFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDBCB000900000C900E00A9000B0090000A00000A0090009A0E909A0B00A090EBE90000FFFFB00000000C0F0900000F9BF9B99090D0B0D0990900900000000009000000000000000000900900D0AD0EDA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADB009A00C9A90A0909000C09000A090A00000009A0000E0F9ACA00000000A0090000EFFFFFF00000000FE9E0009DB9E9DADADA9A9C90B0000090090090900000000000000000000000000C00BC9E9B0DEFFFFFFFFFFFFFFFEFFFFFFFFFFEFBEBF0CB0090B000009A000000BC00000A09090A00A0C0A000F0ECBDADA0A9000B000A0CFFFFFFFFB00000E0F00900CAFDBDB99909C909A90090B0000000000000000000000000000000000009AC00E9ECFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC9B0C0000000090000090B000B00B000A0A000000A9000000B0CA009000A0000A000FFFFFFFFFFFF9000C0FA0009F9F9BCBDA9A90B090DB000909090000009009000000000000000000000009C09A909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBE9B909A9009A0B0090A0090000000B000000009000E900A000A9E0AC0A09A09000EFFFFFFFFFFFFF000AF09000F9FBF9B9A9D090D00B000900000A0909090000000000009090000000000000A9C0DACCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCBC00A000A9000C0B00900CA09000A000A90000A0A00A00C90A9CA900B00000000FFFFFFFFFFFFFFFB00C90000FFFBD9F09D9A90B0B9090900900909A00000000000090000000000900000E090C0B00FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBD0B09090D009090C0000A090A0A09009000A00000B0DA00AC00ADEFA09E0B00EFFFFFFFFFFFFFFFFF90CA000CF9F9FB9F0BC9AD09C0090A900900000909000900090009009A90900A90090C00B0CAD0CFFFFFFFFFFFFFFFFFEFFFFFFFFFFFBFBA90000A000A00A009A090009009E00A00A90090000A00000B00000EDF0000EFFFFFFFFFFFFFFFFFFFFB0D0009FFFBDBDBD9B090B09B009009A090900000090090009C0090000DA90009009A9C09000B0CFFFFFFFFFFFFFFFFFFFFFFFFFFEFDEDADBCB090B0909090090090A000A90B00A000A00A0009A9000CA9A90AA0FFFFFFFFFFFFFFFFFFFFFFFFF9A000EFBFDBDB09AD9E909009009000900009090B00900DA09090D090000909C9C09CA9E9AD0DAFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBDA090C000000A00A000A0009009CA00009A0D0000B0ACA000A9C00AC9CBEFFFFFFEFFFFFFFFFFFFFFFFBC090FFFDBBCBDBD0A9090090A90909009090A09009009009A909A9E9099AD0B0A9CA9C00C00ADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBC9A00B090B090909090C900A9A09E09A0000A900C009C0000E0BC9A0ACBDFFFFBFFFFFFFFFFFFFFFFFFBC00FFFBFDB909A9909ACB0C90A00090A00909E990A9A90C90BC9090B0C9090D9E09CBCB0BC90DFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB0B009000A000CA000A000A09009E09E00A0A9C0B00A0A0B0009E0A0D0F0AEBEFBCFFFFFFFFFFFFFFFFA90B0CFFFF9BDFBD9E9909009009090BC9090F090AD90D09B9AD0BCBD0DB0DB0F0B9FE9CBCD0BCA0FFFFFFFFFFFFFFFEFFFFFFFFFFFBEFF09A090909C909009009000000C90E9A90900A9C0B0900000A00F0DA000D00CB0EFFFFFFFFFFF9FA90000C0BFFDBFDB9CB090E90090A9090000909A90F990ADA9E9C99F9BD0B0C9B0D0FDE9DEBDA9AC90DEFFFFFFFFFFFFFFFFFFFFFFFFFAFDB0DA90A0000A000A9000A090A9090A9A000A00D0A90C0A09A000E0EA9CBFABCB0B09E9CAD0A900A00000000BCFFBFDBBDB99E990B9090900F909A0F0DB09CBD99C90BDA90D0BD09B0DBF9CBDEBDECBC9ADA0FFFFFFFFFFFFFFFFFFFFFFFFFFDBADB0C0909A909A9000090000000A9C0C9A00A0A09E9A90A0090900D0A0C0DEB0C00A00B0A900000090009000CFFFDBFDA9E990A900A9000900F0990B9CBCB9ADA9BD09DBDBD9ADBCB0D0FBCFFDADBCBC90DACFFFFFFFFFFFFFFFFFFFFFFFFFBFDA009A00C000000D09A009A9090CA90AC909090E00C0E9000A0A00AFCB0E0F9A0FFCB00000A9A90000CFA900CFFBFBDBDB90E9090D0090B09009E0D0A99BC99AD90BDA9090BC90D9D9AD0D0F0FDADF0BCB09ACFFFFFFFFFFFEFFFFFFFFFFFFFAFDB00909A90B0900A0090000E00090A90A0A00090B0B00B0A0000AD09E09A00CFFFFFFBCB0000CA9ACB900000FFFFDFBDBCB99C0B090A9C90B9A99A9DBC9B9E9B0F9B9DBDBDBDB9A9E99F9F9FFADF0FDADAD09EFFFFFFFFFFFFFFFFFFFFFFEDF9ADA90A000000A090900A0909009E0D0A09000A0E09C0F0C909A000AFE9AC90FFFFFFFFFFFFFFB9D0DA000000FFBDBBDB09900A909090900B0C9DA9DB09F9C909D90D9A9ADBC9BC9F99E9E9EDADF0FF0BC909E9FFFFFFFFFFFFFFFFFFFFFFFBFAD0900090090909000A0D00A00B090A0D0A0A9009CA9A00B0E009A9C0BE90A0CBEFFFFFFFFFFFFF0BEF90000CFFFFFDB9DBCB09090A090A9C99B0DB09F090B9F9ADB9F9D909B0D9F9EF9F9F9F9E9FE9EDB0F09ACFFFFFFFFFFFFFFFFFFFFFFF9F0B0AD0A9A0A0000B09009090900E900AD0000A0A0D090C0B0F00CA0C0FEFDA009ADAFFFFFFFADA0CFFF90000FBF9FBDA909090DA99C0990B0F0B09F0BDBD090F990F9A9F90DB0B0D9EBD0FCBCBD0DF9EDB9E0D9AFFFFFFFFFFFFFFFFFFFFBFE9F0D00900909C9A000000A00E00090E900A9E00C0B0A0CA9C00BCBCBFFFFFFFFBC00000CB0BC9A9CFFFF00000FFFFFDBDBCB0F009009B0C90909DBC990909BDB9ADB90D909F00D0DA9990F99F9DAFF0F90FC9F0ACDFFFFFFFFEFFFFFFFFFFFFBF0B0B00090000A09C9A9090909A9E090A0D009A0B0C90A9CA9FCBCBFFEFFFFFFFFFFFFEBCFE9E9EBFFDA9000CFFBDB9A9090900B90B000B0F0BCB0B9E9A9F0B09D99C9A90900900B0D9EDBDE9FCBD0FD0F09B00D9EFFFFFFFFFFFFFFFFFFFF0F0BC900A9A0A90900A0000AC0A09090AD09A9A0D0C9A0BCA0DA09EFDEFFFFFFFFFFFFFFFFFFFFFFBCFFBDA0000FFFBFD90F0B0090C9090909099909D099D09D9DB0B0B900F009A90D0B09BC9BCBBCBF9AF0FADADA09EFFFFFFFFFFFFFFFFFFFFFF90A090009C0A09090909090D00CA900AC00DA0B0C9C09CB0DAC9AFFFFFFFFFFFFFFFFFFFFFBDFF9CFFF99000FFDFBBC909090090A9CB0DA9E9ADA9BCB0B0B909D9D0D9009000C9A9C9E9BCBDDBD0FCDBD09090DA9CFFFFFFFFFFFFFFFFFFFFBDE9DA09C0090900A000A000A0B0A90E909A900D09A0B0F00FADAFCFEFFFFFFFFFFFFFFFFFFFFFF9EBFFF0000CFBFBDB9A90F09A090900909090D90D099D9D9CB9A909A0900090900CB090DBDAF0FF9FADA9E9E9BCF09EFFFFFFFFFFFFFFFFF9EB9A009A0B0A00A9090909A090009C090A0C0E9A0E0D0E00F0D0F0FFFFFFFFFFFFFFFFFFFFFFFFEBDFFF0B0000FFDFB9C0DA9090DB09A90B909A9A9A9E9A9A9B9C99A9090909000009090DADAD9FF9F0DB9E9C9AC90BCFFFFFFFFFFFFFFFFFFFF9E909009000909000A00C0900F00BCA0D0B090C909A090F00FADEFFFFFFFFFFFFFFFFFFFFFFFBDF9ACB90000CFFF9F09B09090B000090D0A00D09C9999D99C09BD09C90000C9090900F0BC9DFFD9E9FF9E90B0D9E9CBCFFFFFFFFFFFFFFFFBF0B0F00B000900A0DA909A900E90900900A9C0A0B0E0DACB0F00F0FEFFFFFFFFFFFFFFFFFFFFFDFFEFBDEF90000FFBF9F09BCB0D099BC0B090D0A90B0E0B0DB99C90B090B9090A9090F90D0FA90FAFDF9AD9E9CB0A9E9CBEFFFFFFFFFFFFFFFFFFF90B009E0A90D00000000B000A09E0AD00A9C9C090A09C00F09EFFFFFFFFFFFFFFFFFFFFFFFFADBD0B090000EFFFDA9BC9999A9A00990909090909999D9B090B9F9DB900D099CBDA90F9F9DFF9FDBDEDB090B0D9E9EBD0FFFFFFFFFFFFFFFFFBDAF00900900A00B09A090009AD0000909E90A09ACBC9CB0F0FEFFFFFFFFFFFFFFFFFFFFFFFFFF9E9E9C00000DFB9B99C90F0AD90D09A09A09A9E9E90F0B0D9BC909A9CBDB9BCB90DBDF9E9FBCFDBCBB90BCBCB0E9CBD0FFFFFFFFFFFFFFFFFBCF900BCA90A900900009A009E000E90CA000C9AC900B0A0F00F9EFFFFFFFFFFFFFFFFFFFFFFFFFFBDA09A0000EFFF9CA9A90990090900D009C90909A999D9BC9BDBD9F9909C99C9F9CB0DBDEDBF0FF9DAD09F0C99BCADADEFFFFFFFFFFFFFFFFBA9E9090090090A90B0009A009A990B09C9A0C90E9C0D090F00EDFFFFFFFFFFFFFFFFFFFFFFFFFFCBDB009000DFBDBBD99F9E9B090B90B09A90B0909CA9B09BD099A99E9DB9DA9F0F9DBEDBDFDFF9FE990F09F9EADBCBCB9FFFFFFFFFFFFFFFFFDA9A0090A9CA900C09A009000C00E000A009A0A90A9A0F00F0FBEFFFFFFFFFFFFFFFFFFFFFFFFBFF0F090000EFF90DA9E9099C90B0C9090909D0BC9B9D0DBCBDBD9DB99A9CB9D090DAD9FCFADE9F99DA90DADA9DADBDBCFEFFFFFFFFFFFFFFF0F9C90B0A9009009A9009C0A9A900909AD0F00C90E9C0F00F0FDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF900000CFF9ADBD990BDA9B0D09B09E90B0090B0909A99909BCB900909000090909CADF9F9F0BCA9DA9BDBDADACBCB0FFFFFFFFFFFFFFF9FB0B0BC0900B00B000090A09C00B0AC000000B0E900B00E90F0EFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDE900000FFBDA9ADAD9AD09B0B00909AD09B0909CB99DADBC9909090000990000000909C000D0990090DA9CBC9FDBCF09EFFFFFFFFFFFFFEDAD00900F00B0CB090A09000BC0D09ADA9AC090E9C0F09E00F9EFFFFFFFFFFFFFFFFFFFFFFFFFFFEBFF90000FFBDF9DB9AD9BD0D09BCB090B0D000DB00F099009000000909C0AD0BC909C0A909000009A0F9FA99F0F0F9F0F9EFFFFFFFFFFFFBF9A9A0B009009000A90009A90B00A00000C9AC090A900E99F0EFFFFFFFFFFFFFFFFFFFFFFFFFFFF99E9A090CFBCB9FB0D9BC9A9B9C990DA99DA9B900990900090090D09C9C999909009A99C9E9A900000D009D0F0F0F9E9F0FDFFFFFFFFFFFBF9E9C0900B009A9090C0B000C00009C90F09A00B0E9C0F09E0EFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EF0909000F9DBDA9DBBC9B9D0A9A09A9C9A900009000000909B0B0909A9B0F0F9F9FD9E9BDAD0B090DB0BF0F0F9F9EDBCFFFFFFFFFFFFFFFCB090B0A900B000A09A90CB0B09E0A0A00000D0C900A90BC0F9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BE90B900AFF9F9BC99BD0B9D09BC99A9909909000909BCB09D9BDBD9D0909909E9AF9FCBDB0D0DAD09C9B9DADADFADBCFDFFFFFFFFFFFBFBDA90D00B0CA90D000090000A09D09C9A9E0A9A0F0C0E0B0E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD99FD099C9BCBDADBDADBD0B99E99E99E90000000009C990F0BC909A9A9E90E909D9CF9F0FDB0A90BF09EDAF9FDADF0F9FFFFFFFFFFFFFFADADA0A90C9090A09A90A9090DA00A000C00900C900B09C0F0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9B9B909FDBDBDB0BF9B0BC0B90B90B9090D0A909E0B0F99999B9C90D090900BCBCBDADFCB0D9DED09E9BD9E9EDBEDBCBDFFFFFFFFFFFFDBB09C90A9A9A909A00A90AC009009C9A90B0CA9A0F0CE9E9ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDBD09CFBDBDADBD9FCBD9BD0F90F9090A909C00990D09AD0AD0B09000009D09CBDADBCB9E9ACB9B099EDAF9F9EDBCBDBFFFFFFFFFFFBFBC9A9A0900000A0900D0009A9AC00A0CA0C0900D009A9A0DE9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBDB99B0BDB9EBDBDBE9B09A9A99E909CB090909A9009A9090D909090090900ADADAD9ECBDE9D9BD0C9EF9BD0DAFDBEDE9FFDFFFFFFFFFFCBAD009B0A9E90D009A009A00009F090909A0ADA0BC0D0DA0ADFEFFFFFFFFFFFFFFFFFFFFFFFFFFBFB9F9F999FFFBDB9E9F9F9F9D0DA99B9B9090DA90909AD0BDA909E99A90000909090DADBDA9DA0FCB90990F0FBFD0BCBF9E9FFFFFFFFFFFFBDBAB00C9C090A0BC090A0909CA000E0AC00D000D09A0A0D0F0EFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DB9F9F9CFBDFBDA9F0F9F0B0B99F0D09090009C909E9090990B0900D0909000C9E9AD0DADF0D9090090F99F9C9EFDFD0FDFF9FFFFFFFFFFFF0D09B0A9A0B0900B009C0A0A900A90909A00E9A0E0D0F0F0FBDFFFFFFFFFFFFFFFFFFFFFFFFFFBDB9F9FB9FBDFBDBDF9F9FBD9F9CB09B9F9A0900B0A9090B0DAD0990B0090090DB090DCBCBD0B9CA90BCB9CFADBFBDADAFF0F9FEFFFFFFFFB0B9A9E009009C00A900B00A9C9009C00CA0D0900D09A0F00F0DEFFFFFFFFFFFFFFFFFFFFFFFFFF9DBDBDB9DBDFFBDBCB9BDAF9A90B99F0D0909909009D0909C9090900D0900C90000D0F0BDAD0BCA990C90C9B9DBCD0FDBDADFB0DFFFFFFFFFFFCBD09CB0BCA9A90A9C0090000F0A90B090A0E9A0E0D00F0BE0FEFFFFFFFFFFFFFFFFFFFFFFFFBA9F9FBDB9BDFBFF9F9F0F9DF9F9CB09B9B0900F0900009E09A90B0DB0909A909090A90DCBDADD9DA9909B9C9E9FBFDBEFFDBCFF0DFFFFFFFFFBF0BA0900090090D0A900A90B000000C0AC9090C909ACB0C0DADBFFFFFFFFFFFFFFFFFFFFFFFF9D990D9BDBDFFFDBF9F0F9FB9F9B99F90D0DB99090090B0990D09090090909090909D0F0BD0DB0B09CA90D0B9DBCDFBCF9CBEF909FFFFFFFFFBFDBC90A9E9A0B0A0900A900C00B00F0A90900E0B00E090E9FADEFFFFFFFFFFFFFFFFFFFFFFFF9B0B0FBBF99BFFFBF9E9F9FB0F9AD9E9F99B90CA9009009C90B09F9099090D090BD0F0F99C0FF0F9D099C90BCDADFBEDF9FBFD9FBDEFFFFFFFFFCBA09AD0900D0C09A09000A90BC900900ACB0900F09CAD0A0DADEFFFFFFFFFFFFFFFFFFFFFFFF9909DBD9BFFFFFF9F9F9FBDF9F9BDB99AD0B9990990B009A9C900090009A9B9D0B99D9EDB9099090B009A9D9BDBFDF9FFCF0FADF9DFFFFFFFFFBD9F00B0A9B0B0B09CA9090000009A09C900CAD009E09AD0F0FAFFFFFFFFFFFFFFFFFFFFFFFFB90909FBD90DFFFFF9F9F0DBFF9F0BDAD9B9C9A9D009090009099909099C90DA9D9E9ADBFDAD0F9E90900DA9E9FD9FFF0FF9FDB0FBFFFFFFFFBFBEB0B009C000090CA900E090F0B00C90A0CB090ADA09E0ADAD0DEFFFFFFFFFFFFFFFFFFFFFFF90DBDB9090DBFFF9FF0F9FBDB9FBDB9F9BD9B9D9A9B0909090B000B0DADB9F9DB0F9FFDFDFDFB909090F909D9F0FFF9FDF9EDADFF9CFFFFFFFFFF9BC9CB0B0F0B0B0909090A000000B0E90B00AC9009E90DA9EBEFFFFFFFFFFFFFFFFFFFFFFFB9DB909090B0FFFFFF9FDBFDBDFF9F9F9BDB0D9A999C90C909090DB9DB9BDBDBB9DBDBDBFFFFBD0DA90990DF0BDFFFDFFFBEDBF9F9DBFFFFFFFFF9BCA9A900909C0000A0A000909AD0009C009C90E0F00ADA0DBCFFFFFFFFFFFFFFFFFFFFFFFF90999909090DFFFFFBF9BDFBFF99F9F9BD0DBBD9F0909990B000909DBD9F9DB9DFBDBDFFDFFFDFB990DACBB9FDBDFFFDFDFDBDE9EFBDFFFFFFFFBFEB9000E9A0A0B0F09090B0CA0009E00A9A0A090009E90DAE0F0FFFFFFFFFFFFFFFFFFFFFFFB9CBCB090909FFFFFDFFFBDF9FFBDF9F9BB9D9B09DBDA9A909D909A99BD9FBDB99DBDBDFFFDFFF90DA999D0DADFFDFFFBFFBDBDB9FD0FFFFFFFFE9BCBDB9009C900900AC000909CB000909C9C9CA0F0E09EAD0F0FFFFFFFFFFFFFFFFFFFFFFFF99B99990909FFFFFFBF9FDBFF9FDBFDB9DDBBD9F9A999D09D0A09C9DBD0BD9F9F9BDBDBDFFFFDBDA99CBCBDBDBFDFFFFFDEDFEF0DFB9FFFFFFFFBFF9A00CB9A9A9E0A9090B00A000009AC0A0A0B0D0009E090F0FFEFFFFFFFFFFFFFFFFFFFFFB9C9DB90090F9FFFFFFDFFBDF9F9BF9BDF9B9D9B9D9BC9A99A999B09A9B9DBF9F9BDADFDFFDBDBD090DB9F9F9FDFFFFFDFFBFDB9DBF9CFFFFFFFFFF0BC90B00000090909A00009090BAC0B09C90C0A90F00F0F0F0FFFFFFFFFFFFFFFFFFFFFFF999FB909900DBDFFFFFBDBDBFFBFF9FDB9F9F9BD9AD9B99C9090D099D0DB9C9F9F99DB9FFFFFEDBDBF0FDBDBCFFDFDFFFDFDBFDEBDFB9DFFFFFFFF9F09AD0ADA9E9A0A0C009E000E00909C0A00B009E00F00F0F0FEFFFFFFFFFFFFFFFFFFFFFBF909DBD0990FBFFFFFFFFFFF9F9FDB9FDB9F9F9BD9BD9E9B9DB9A9CB9B9CB9F9F9F9BDFDFDFDBDAD9DB9F0FDBDFBFFDFBFFFDAF9E9FFBCFFFFFFBFFAF09A90090009C90A90090B00900A00909AC0F090F09ECA9E9FFFFFFFFFFFFFFFFFFFFFFF999FB909009CBDFFFFFFFFF9FF9FBDF9BDF9F9BD9BD9A99C9A9D99B9C9DB9DBDB9DBDB9FFFBFFFDBEBDEDBDBDBDFDFFFDFDFFFDF9FF999FFFFFFFF0F9CB00F9A9A90A0090A000009A00D0BCAC00900CA00E0B9E9EFEFFFFFFFFFFFFFFFFFFFFB9ADBD9B9090FFFFFFFFF9F9FF9FF9F9BDB9B9BD9F90B9DB9B9DA9E9DBDB9FBDB9FB99DFDFDFDFDBF9DF9BDBDFDFFFFBDFFFBD9F0FFFB0FDFFFFFFBFB0B0E9000C90A90B0009009A0000A00090B0ACB0DAD0D0E0F0FFFFFFFFFFFFFFFFFFFFFF9D99FBD9A9090FFFFFFFFFFFDBDB9F9BD9BDDBDBB0DBDB9D0DA99990B9BD9C99FD9DBFBDFFFFFFFFDFF9FCBDE9FBDBDFFDFDFFEBFDFFD99FFFFFFFFF0F0900B0B0A9C0000000A009C9090DA000C9090A09A9ADAD0FCFFFFFFFFFFFFFFFFFFFFFB90F9FB9D09009BFFFFFFFFBFFFDB9FDBDB9BD9D9B999CB9B9DBCBD9D9CBB9FB9BF9D9F9FDBDFFF9FDADBF9F9F0DFFF9FFFBDBD9EFFFBDADFFFFFFF9F0F0B9C00900B0F00B0900C00A00A00D0B00CAC9CAC0DA9ADAFFFFFFFFFFFFFFFFFFFFFF9999DBDB9B909CFFFFFFFFFFDB9BDF9BE9DBDB9B9DBDB99D09B0990B0B9D9F9DBD9BBD9FDFFFF9FFFBDBD9F9BDBF9F9FF9FFEFFFDFFFF99FFFFFFF0FBA90C0B0F0A900009000090A9000D090AC0B0090A90FA9EDADEFFFFFFFFFFFFFFFFFFFF99E9FBFBD9909A9FFFFFFFFFDBFFDB9BD99B999F0DB099BCB9F99F9F9D9F9BD9BDBF9D9F9FFFDFFDDADBDFAD0F0F9FDFFDFFDFDADAFFF99EDFFFFFFFF09CB0B09009C90B000000A000000A0E9090CB0AD0CB00D0ADEFFFFFFFFFFFFFFFFFFFFFB9999DBDBF9F99C9FFFFFFFFFFF9BDBDBDBDBDB9B99DAD99D90F09090B99F0BBDBD9F9BDFFDFBDBFBDBF09DBD9F9CBE9FFFFFBFFFF9FFF09FFFFFFFBDFA90900CB0A0A0000A09000909090900CA900D0A9ACBCAF0B0FFFFFFFFFFFFFFFFFFFFFF99E99FBDBF9BF9FFFFFFFFFBDFF9F9BDB99DAD9DB999A9B0B99F9BDBDAD9D9DA9F9BD9BDFFDFFDEDBD9F0B0A90FBDFF9FDFDFDBDFFF9F909FFFFFFFADAB0E9A00D09090900000900CA00C0B0B00A9A9C0C9CBC0FCFEFFFFFFFFFFFFFFFFFFFFB9099F9DB9DBD9B9DFFFFFFFFFBFDB9DB9F0B99B09CB99D09D0B09C99099B9BD9F9F99FDFFFFF9F9BDA909C9DAD9CFBDFFBFFFFFF0FCF9F90FFFFFFBFBD0C9090B0A0E0A00900A00A0000B00C09C90C0A0B0B0DB0FAFFFFFFFFFFFFFFFFFFFFF9D90F9FBFDBB9F0FBFFFFFFFDBFDBBDB0D9BD9F9D9B9CB0B9A9C909B0F9BCBD9B99F9F9BFF9F0FA9D00D0B09A90ADBCF0DFDBCF9009FB090FEFFFFFFE90B9A0E0090909C00000000909000B090A0E9AD0D0E9EA0F0FDFFFFFFFFFFFFFFFFFFFFBB99099F9B9DF9F09000FFFFFFFBFDBD9BD0B090B0DA9090C9090B0C99C999B9F9F9B9DFDFFBD990099AD09C9E9DADF9FBFFFFFFB0EDFF909FFFFFF9F9E00090B0AC000090090090000090C0AD09000A9A90C9EDADAEFFFFFFFFFFFFFFFFFFFFF909AD9BDB9B9B9F09000FFFBDFDBF9BD0B99DB9090909C909A09C9000B09E909F9FDB9FFFDFBCBDA09009A9090BDADEDE9FDF9FC90FFFF90DFFFFBFEB9E9E09C909A9A00A0000000E000F09000A0D0D0C0FA090F0DFFFFFFFFFFFFFFFFFFFFFFF99D9ADBDBDFBD90009DFFFFFBBF9FB9B9C9A0DB0909A909009090B0909C99F99F9BDBDFFF9990090009090BCBDADBDBDF0FFFFB0E9FFFFFFFFFFFF9BC9090A000A00090000000A90900000ACBC9A0A09A90DAE9EBEFFFFFFFFFFFFFFFFFFFFFB90909090F9B99A0BCBEFFFFFDFDBD9C9CB999909AD090A9090000090090B09BF9BDBDFF9B0F009090909E9C9CADBCBEDADFBCF0D90BFFFFFFFFFFBFCA9A0A90BC90D0000900090000090B09000090DAC9ECBC9ACFFFFFFFFFFFFFFFFFFFFFFFF99090BDB9F9F00D000DFFFFFFBB9BB9B90BC9A909A90990D09090909A090F9C9BDBDBDFFD90090000000009A9D0FBC9ADAFDFFB0EFDBDFFFFFFFFDA9B0C900C0A000A0900000000A00AC0CA90B0E009A09A0F0F9A9EFFFFFFFFFFFFFFFFFFFFFFB9BDDBDB990900F0F0FF9FBFDBD9C90099B0DBD09DA0D0900B0000090090B9F9F9F9FFBFB9ADB90D0BD9BC90A90DBD90DEBEDF9EFFFFFFFFFFFBFF0F0B0DA9090B090A0009000009009A90C0C090BC0DAC9AD0EDEFFFFFFFFFFFFFFFFFFFFFFFFFDBB9B9F00009000FFFFFFFBDBA9B9000C9B09B0099A0B0D090909C900909BDBDBDFDF90D9000909000000F0DE9CA0CBDFDFB0CFFFFFFFFFFFFEBF0900A00AC000C0090000A0D0000000B0B09AC009AC9AD0AF0FFFFFFFFFFFFFFFFFFFFFFFFFFB9DBD900000A00F9FFFF9FDB9D9D09009B0D900900090909090009A99E9FDB9F9FFFBC9A09090A00000000DA9A090BCFBEFC0FFFFFFFFFFFFF9F090E90D090B09A90000009000A09A9C000A09ADAC90BC0F90F0FFFFFFFFFFFFFFFFFFFFFFFFFFFB90009000C90CFFFFFFFBD0B0B90900090A9000000CA90000900900909B9FBDBDF9B0DB000009000000CAD09000CBCDFFB9EFFFFFFFFFFFFFADA900A0A000C000C0A9000000900C0B0D09C0009ADACB00E09E9EFFFFFFFFFFFFFFFFFFFFFFFFFF090000090000FFFFFFFFBD9F0BD090000900000000DEB900090090BD0FD9DBDFFF9B00900900000000ACB00C09CFBE9FF0CFFFFFFFFFFFFBDBCA9090DA90B00A9000000000000B000A0E0BCBC00090F090E9EFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000F0FFFF9F9FB9A99C9B0900000000000DA9000900090AC9B9BBF9FBDF9C900090000000000900090CBD0DEF00FFFFFFFFFFFFBDEB090E00000A009000900900B000000AD09090009ACB0E090E90FADFFFFFFFFFFFFFFFFFFFFFFFFB000900000000FFFFFFFF9F9D0BB0D000900000000000009009000999ADFD9FFDFB09A0900009000000000090E9FCBF0F90CFFFFFFFFFFFFFB09CA90B09C90CA00A00000000E09C9000A00E9AC90C909E09AD0FFEFFFFFFFFFFFFFFFFFFFFFFF90000000009C9EFFFFBDFF90B90D9B0900900000000009000000909E9F9BBF9FBFDBD90090000000900009ACBDF0F0CFDA9EFFFFFFFFFFFBCBDA9000C00A009000900A000009000A90D0900090A90AC09AC0AD0FFFFFFFFFFFFFFFFFFFFFFFFF900000000000A9FFFFDFBFBD0F0BCBDBD000090000090000B009009090F9D9F9F9F9A9D0A990090000D0C099EFBF9F0EF90CFFFFFFFFFFFFFDADA9CB0B0900A0D0009000090000B0CA0ACA90E0D0BC9AC090DADADFFFFFFFFFFFFFFFFFFFFFFFB000900900000CFFFFBFDFFB909090909B99DA0909A0C9A9009A09A0BD9FBFDBFF9E90A90CA9D00909A9BF0FDBC9E0DF9A0CFFFFFFFFFFFFBE900000000CA9000A0000090A0000C0090909C009A0000009ACA0FFFFFFFFFFFFFFFFFFFFFFFFFF9000000000900FFFFBDFFBD9CB0CB0F9E9CB099B0D09B0900900909D09AD9DBDF9B990909090A09ADADAD0DA9E9E0DEBE900FFFFFFFFFFFBE90E9A90D0A90C00090000000C0B090B00AC00A9A00F09ADA0909FADFFFFFFFFFFFFFFFFFFFFFFFF90000000000000FFFFFFFFFB900909009A90BCBCB0B0090900900900F9FBAF9B9F0F0F000009090909090B0D00009ADF900CEFFFFFFFFFFFBDB00CA0A900000B00009000000000009090BC90D000AC0090E00CFAFFFFFFFFFFFFFFFFFFFFFFFFB000000000CA90CFFFFBFFFFF9B00A9009009090909090009009009A090D99F9E9F99099A90000000000000090DAC9EEF000FFFFFFFFFFFDFADB009000CB0B0000A00000090000B0CA00000A0AD090B00C90FADFFFFFFFFFFFFFFFFFFFFFFFFF90000090009000FFFFFFDFF9F9C90900900900000000000000000BC9DBDA9E9E9FDBDB0D0090000000000000A0009EDF9000EFFFFFFFFFFFADA0DA0C0B000000D0900090A000000009C90B09C900AC0CA9ADADBFFFFFFFFFFFFFFFFFFFFFFFFFB000000000000E9FFFFFFFFFFB90D0000000000000000000909C9090B099F9BDBDB0BC9A99C0900000000C90C9ADEDFB0000FFFFFFFFFFFBFDA9090A90090C90A000000000A909CB00A00C0A00AD09A900CBEFEFFFFFFFFFFFFFFFFFFFFFFFFF900000000000900FFFFFBFFFF9FB09909A90090900000090C0B0BCBD9FAD0FDBDADBD9F9F0B909C90900900F0FCFFFFF9000EFFFFFFFFFFF9A9CA0D000E0A0A00000000090000000909CB09CB00A0C0A9E9C9FFFFFFFFFFFFFFFFFFFFFFFFFFF9000000000000900FFFFFFFFFF9F9AD9C90900A009090009BC9F990BC9DB9BCBF9BCBF9E9F0F9EBE9CBCADADFFFFFFFFA900DFFFFFFFFFFFEDA900A09090090090B0900000000090E00A00000C9C9A9C00EAFEFFFFFFFFFFFFFFFFFFFFFFFFFF900000000009AC0BDFFFFFFFFFBDBDB0B0F0BD909CB09F9E9FBCBDBDBFBCFDBFDFDBDBF9BF9FF9F9FBDBDFFFFFFFFFF90000EFFFFFFFFFFFBF9CB090CA00C00A00000000000900A0909009E90B0A00C0BCBDFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000000000C090D0FFFFBFFFFDBDFBDBD9BC90F9BCBDBDBDB9F9BDADBDBDBF9B9BDBDFDFDFF9FFFDFFFFFDFFFFFFFDE900CFFFFFFFFFFFBC9A0000A9000B00D0000000009A000900A0DA00E00D0F0B0CBCEBFFFFFFFFFFFFFFFFFFFFFFFFFFF900000000009A90A9FFFFFFFFFBFBBDBDBF9BF9BCB9BF9E9F9F9EDBDBDBF9F9FFDFFBFBFBF9FFF9FFFFFDFFFFFFFFBFB0000FFFFFFFFFFFFFAD0F0D000B009A00C9000900000000C9C0090909A000009ACBDEFFFFFFFFFFFFFFFFFFFFFFFFFFB000000000000C09CA9BFFDBFFFFDF9F9BDBDDBFDBDFDADBDBCB9BDBF9FDBF9F9FB9FDFDBDFFDBDF9FFFFFFFFFFFFFDFFB000EFFFFFFFFFFBDAB000A90C00C00090A09000000000B000B0C0A00C9A9E9E09EAFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000000000909A090FDFFFFFFFFBFBDBF9FBBDBBDB9BDB9BDBDBDBDF9FBDFFFF9FF9F9FFFBDBFFBFFFDFFFFFFFFFFFF9C90CFFFFFFFFFFFFF9CB0900A90B0090A000000000090000B000A90DA9AC00009E9DFEFFFFFFFFFFFFFFFFFFFFFFFFFB000000000000AC90FCBF9FFDFF9F9DBF9F9FDB9DB9FDB9FDBDBDF9F9FBDFBDBDBF9FBFF9FDFF9FDFDFFFFFFFFFFFDFBCB000FFFFFFFFFFBEBCB00CAC900000E0009000000B00009009C90C000C909E9E00EADFFFFFFFFFFFFFFFFFFFFFFFFFFF90090000000009E09ADFFFBFFFF9FBF9F9F9BDBF9F9BDF9B9ADB9FBDF9FBDBDBDBF9F9FFBF9FFFBFBFFFFFFFFFFFFEDBD00CFFFFFFFFFFFDB9CB00900A0CB09090000090000000AC00A00B0B000E0009E9DAEFFFFFFFFFFFFFFFFFFFFFFFFFFF900000000000D09C09ADBDFFFFFBD9F9F9BFDBD9F9F9BDF9FDBDBDBF9F9F9FBDBD9F9FDBDFFDBFDFDFFFFFFFFFFFFFFFAD000FFFFFFFFFFFEB0C9A0009000000A00A900000000009A909000C0B090F0000E9DAFFFFFFFFFFFFFFFFFFFFFFFFFF000000000900000B0F9FFFBDBF9FBB9F9F9BBDBF9B9FDB9DB9F9F9F9FBCBF9FBDBFBDBBDFBDBF9FBFFFFFFFFFFFFDFFFB000EFFFFFFFFFFBF9CB0C90BC0B00AC09000000000900900000E90A9C0E000ADADAEFFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000B00F0D9E9FBDFFFFB9DDBF9FDF9BDBDF9B9FB9F9F9F9FF9DBDF9F9F9DBFDFBDBFDFFFDFFFFFFFFFFFFFFD0900FFFFFFFFFFFDBCB009A00000C90900000000090000CA0CB000D00A909AD00DADBFFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000C0090ADBF9FFBF9F9FBBD9F9B9FDB9B9F9F99F9F9BDBF9FBF9BF9F9FBD9FBDBF9FBDBFFDFFFFFFFFFFFFFF000CFFFFFFFFFBF0F09A0C90B09A00A000009000A000A90900090A9C00AC0A9E0AEDEFFFFFFFFFFFFFFFFFFFFFFFFFFB900E00000009E0BCBC9F9FDFFBF9DBBDBFDB9BDFDBDB9FF9F9FDBDDBD9FF9DBDBDBFBDBFDFBDFFDBFFFFFFFFFFFFFFF0F000EBFFFFFFFFFF0BC90A00C0009000B000000000000000090A000A9C909C009C9EFFFFFFFFFFFFFFFFFFFFFFFFFFF900090000009009C9FBFFBFBF9F9FBD9F9B9FF9B9BDBDBF9F9F9BDBBDBF9FFBDBDBDBDBDBBFDBBDBFDFFFFFFFFFFFFFF9000ADEFFFFFFFFF9BCA0090E09AC0C9000900009009000B00E0C90D00A0E0A0F0FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000000900E09E9EBDF9FDFDFBF9DBB9BDF99BDBDB9B9DF9F9BDBBD9F9F9B9F9F9F9BDBDFDBFDFF9FFFFFFFFFFFFFFE0000DFFFFFFFFFBCBC909E00900090A0000000000000000C909000A0B0D090D0009DEFFFFFFFFFFFFFFFFFFFFFFFFFFFB000C0000009E90BDFBFFBFBFBD9FB9DFDB9FF9FDB9F9F9B9BDBF9FBF9FBFDFBDBF9FDBDB9BDBF9FFFFFFFFFFFFFFFF99000EF9EFFFFFFFBF0B000B00B00A090E900000000000B00A000B000C0A0E0ADACA0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFB000D0000000F0DADF9FDFDFFBF9FB9B9FB9F9B9F9FB9F9F9F99FBDBDBDBF9FBDBF9FBDFF9FDBF9FDFFFFFFFFFFFFFF00000EFDFFFFFFF9F0DA90C00C09000000A90009009000090C0900D09090909009F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000A00000CB0F0FBFFBFBFBDF9F9FBDF9F9BDBFDB99F9F9F9FBDBF9F9DBDBDBFD9FBDBF9F9FFDFFFFFFFFFFFFFFFF0B000CFBEFFFFFFBEFB00CA90B00AC9A900000000000A000009A000A0A0E00E0E9E0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000090000000DBFDF9FDFDFFBF9F9DB9BDBDBF99BDFB9B9F9BDBD9FBDBFBDFBDBFF9FF9FFFF9F9FFFFFFFFFFFFFFB9000DBF9EFFFFFFFF90CB090000090000000000000000090B0000F090D090909000FDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000000000D0BCFBFFBFBFFBD9F9FBDBDBFBD9FBDB9DF9F9BDBDBBDBFF9DF9FBDBDF9BF9F9FFFFDFFFFFFFFFFFFFC00000EF0DFFFFFBF0FB00A00AD0A00A00A9009000000900C000D0000A00A0E0E9E0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000000090A9CBDF9FFDFBDFBF9F9FBDBD9FBF9F9FBB9F9FDBDBDF9D9BFB9F9FBDBFFDFFFFDBDBFFFFFFFFFFFFFDB900000CBEFFFFFFFF0F9D090000D0900D00000000900000009A000B0D0D0D09000DCEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009C0000000000FFFFBFFFFBDBF9F9DBDBF9F9F9F9F9F9F9BDBD9BFBFDBDFBFDBFDBDBF9F9FFFFDFFFFFFFFFFFFB000000FF0FFFFFFFF9F0A00CA90A00AC90000000000000009A00090C000A00A00E9EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB900000000009EDBDBFDFFFBDBF9F9FBFBF9BDB9F9F9F9BDBF9E9FF9F9BDBDBDBFDBFFDBFDBF9FDFFFFFFFFFFFFD000000FE9FCFFFFFF9EF0DA900C090090A00B0000000090000009C0B00A90B09E900EDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A0000000009A9FDBFDBDFFF9F9FBD9F9FDBDBDB9F9BDBF9F9FA9F9FF9FBDFBDBFDBFDFBDFFBFFFFFFFFFFFFFB00000C0FEBFFFFFFFFB9B00A09A00AC0009000900000000000D00A0009C0C0C000F09AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9090000000000CBADBFFBDBDFBF9FBF9FB9FBDBF9BDFBD9F9F9DBDB9FF9FBDFBDBBDBF9FBDFFDFFFFFFFFFFFF0900000F0DFEFFFFFFFEDAD09C090009A00000000000000000B009000000B09A0BC00EDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00C000000000909DBDBDFBFBDF9F9F9F9FFBDBDBFDB9FBF9DBFBDBDF9FF9DBBDFFDFF9FFDFBDBFFFFFFFFFFF900000000BEFFFFFFFFFB9E9A00A0CB0009CA90000900900000000009ADA000A09C00BCBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000000000000DA9F0FBDBDB9FBF9FBFDB9F9F9DB9F9F9FBF99F9FBFB9FBFDFB9FB9FF9FBDFFFDFFFFFFFBD00000000FEDBFFFFFFFBDE900090900000000C0000000009000009E0000909C9C00B0CBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9000000000009ADA9DBDBDBFFBDBF9F9BFF9FBFB9F9F9BDBDBF9F9F9DF9F9FBDFBDFF9FFDBF9FFFFFFFFCF00000000D0FFFFFFFFFFFA9AC9AC0A009E9A900A900000000000900900000E0A09A00CBCBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00900B000000009C9ADB9E99E9FDBF9FDB9F9F9FDBF9FDBDBDBDBDBFBDFBF9FBDFBF9F9BFDFF9FDADFFFFB90000000ACFBEFFFFFFBFDF9A00900D000000A900000000000000A000B0009000C0D0B0ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00E000000000000BC90F9FF9DBBD9FBBDFBF9F9B9FB9BDB9F9FBF9DBFBD9F9FBDF9FBFDBF9FFFFFFF0F9000000000CFBCFFFFFFFFFBAC9C9A00A0A900C00000000090090009000C0BC00D0B00A0CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90000C900000090900BC90B99FBDFBF9DB9F9BDBDF9DBDBDF9FBD9FBF9DBFBFBDB9F9FDBF9FFE9F9F0F9090000000ADADEFFFFFFFBF0DB0A0C09090C00B000090000000000000A90000B0A00A9C9EAFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0090000000000000909AD9CB9CB9D9FBDBDBDBDB9FBDBDB9BFDBFBDDBF9FDBDBFEBFDBD9E9F9F0F090000000000C9EF9FFFFFFFFFFFAC90090AC000B0009A00000000000000900A900090D0C0A09CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90C000000000000000090A9CB9FBAD9FBDADBADBF0F9F9FF99BC9FBBDBF9ADF9BD9DBEBF9E9F0F0F090000000000CBEEFFFFFFFFF9F9BCB0A090A900C0A000000000090009AC000C00C00A090D0EBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0009009000000000900090B0D09DB099B9BD9BD9F9F9F99FFDBF9CFBD9FDBBFDBFB9D90F09CB090000000000000FC9FFFFFFFFFFFBE900C900000A90900090000000000000009000B0A090CA00FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000CA0000000000009009090BDB0BCBC9D0BD0BDB9F0BFB09B90B990B09AD09AD0DA0F09CA0000000000000CCEFBFEFFFFFFFFF9E90E900CA0D0000A000000009000000009000B0009C0A90DA9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000C0000000000000000000000909090AD00BDA9E9F009DBC0F9CBC9CBDB0F00B0900000909000000000000BFBCFFFFFFFFFFFFBE90A0B0900BC090C9A0000000000000000A0000C009C0A0C0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000900900000000000000900900900A909A90090909F0B00B90B009A000900900009009000000000000000CEFDEFFFFFFFFFFFEDBE9C00000000A000000900000090009A009C009A0A0090CBEFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFF90000000000000000900000900000900009090000000900900000900900000009000000000000000000000FB0FFFFFFFFFFFFBFBC9A090ACB009000A000000000000000000009AC090DA0E9EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000C00000000000000009000009090009000000900090090009090090090090000000000000000000009CEBCFFFFFFFFFFFFFFDE9A90AC9000A0C090900000000000000009A000000000900FEFFFFFFFFFFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFF009A00000000000000000000000009009009000090000000000000000000000000000000000000000E0FFFFEFFFFFFFFFFFFFBBF0C9000009009A00000000000000000900000900F0ACADA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A0C0000000000000000009009000000000000000000000000000000000000000000000000000000C0F09CFFFFFFFFFFFFFFFFD0B0A09A0AC0A000A090090000090000A00C9A009009000CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF900900000000000000000000009000000000000000000000000000000000000000000000000000000CEFEFFFFFFFFFFFFFFF9EBC9C0C09009000D0000000000000000009000C0A00C0BCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000ACFFFFFFFFFFFFFFFFFFFFFEBD0A9000000009A0000000000000000090A000090C0B000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC00000000000000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFBDBA90A9A00B0AC0000A90000000900000000009A009000CB0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDAC9000000000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFDAD0C009C00900009000000000000000009000000AC90B0CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFBAF0B009A00000B0000000000000000090000000C900A0C0FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFBCD9000000090E000C00900000000000000000E09A00900BCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9A000000000000000000000000000000000000000000000000000000000000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFBAE9A9E000A009009A0000000000900000B0090000A0C000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCD00000000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB0C0090C09000A0000A000009000000000000009C0A90E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA0B00000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AD0B00A0900E000090090000000000009000009000900C9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D9C000000000000000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEDA900000000090000000000000000000000900A000A90A0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A9E090000000000000000000000000000000000000000000000000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDB9CA09C900B000AD0A00000000009000000A0000C9000C9C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0090C00000000000000000000000000000000000000000000000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFB90CA00AC0000000000900000000000090000900A0C0A00FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E90A9A09000000000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFBDADA9000000090000900000000000000000000009009000FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9CAD00D00A90000000000000000000000000000000000000000000CFFFFFFFFFFFFFFFFFFFFFFFBEFFFFFFFFFFBFDAD000090090AC0900000000000000000000090A0000A09E0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDA9009A0A900D0E000000000000C00000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFB0B9000E0000000A0000000000000000009000000D00000D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9E9E0D0C0F0A9009C90000C90CA000C0000000000000000C00DEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FC0E9A00000900000900000000090000900000900A00C0A0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA900B0B9A0D0E0F0A0CBCBADA90C90000CBC9000000000CBFDAFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFB9B0000900000900000000000000000000000000000909C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9CAD0C0C0F0B090B0DBE9FDA9BCBEFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFCFFFFFFFFFFBFFB0DAC09000A000A0000000000000000000000090009000A00E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDA09A9A9A900C9E0C9A0DAB0BC0F9FFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFBFFB09000000900000900000000000000000090000000000009E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBC00C0DADA9A9A90DA0DEBDB9A9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEFFFFFFFFFFDBDE9E9A090000090000000000000000000000000000090000C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA09ADA9A009C0C90E09EB9E9E9DEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFBFEB9A900000000000000000000000000000000000000000090BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC09E0090C0F0A0B0E90F0DEDBF9EBFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFF0FFBFFFFFBFFEFB9E900000000000000000000000000000000000090000000C0CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F0090E9A909C9C900F0FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFF9FBDBC9E09000090000900000000000000000000000000000000A9ACBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9E0E900DACA9A0ADA9E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCFFFFF9FFFFBFB09A009000000000000000000000000000000000000090000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD09090E9A909C9C900CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF9FFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBDFFEBF9E9E9E9000000000000000000000000000000000000000000000FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADA0E090C00E0A0ADAF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FEFFBEFFFFFFFFFFFFFFFFFFFBFCFBFFFBFBDFFBF9A900009900000000000000000000000000000000000000DADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB90909ACB0B0909C909CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E90DADFBFFFFFFFFFFFFFFFFFFFDFBCF0FBEDFBE9E9AD00000000000000000000000000000000000000000000000ADFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E0C900C0DACA9E0A9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEB0DADF0FBFFFFFFFFFFFFFFFFEBFBFFFDBBEDBF9F9A9090000000000000000000000000000000000000000000ADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0B09A0ADA9A090009C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9CA9A0F0DEBEFFFFFFFFFFFFBFDFCBFBFFDBBDBE9AD0A00000000000000000000000000000000000000000000D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD00E90D0000D0E0BCAF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDA0A90CBCBEBDFFFFFFFFFFFFFFFBEBFDFADBFCBE9BDA0900000000000000000000000000000000000000000000ADADBFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA9E900A0A9E9A90D090DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9CB009009E9ADBFFFFFFFFF9EDBDAF9FADBBF9E90900000000000000000000000000000000000000000000000BCBDBDEBFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF09A9C09C000CA0ACA0ACDAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9E90DA0BC9ACBEDBEBFBFFDFFBF0F9AFDBFCBCB9E9A90900000000000000000000000000000000000000000090C0BCBFBDBF9FFFBFFDFFFFFFFFFFFFFFFFFFFFFFBFFFFFBDB0F0C0A9A0BCB09C909C9ABFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9FDA9E09C000C909ADBDEFEBFBCF0F0FD9AD0BDB9E9AD000000000000000000000000000000000000000000000009ADAF0DAD0BCB0F9EBF9FBEDFBFFFFFBFFBFFFFFFFFBFBFEBC90B09C0D000C0A00E9ACDEDBFFFBFAFEBFFFEFFFBFFFFFBFDBEDA9E99A90B09ADADADE9FBDFCB0B90F0AF0BF0BCB090A0000000000000000000000000000000000000000000000000909A09ADA9E9E9E0FADBDADAD0F0F0F0F9CBC9E9CBC9090A00E0B0A0F0B0DA90009A9AC9E9CBD99E9ADB0F0F0F0B0F0BCB0F09A0C000C000000A9A0DAB09C0E90BD9AD0FCBC9E90900000000000000000000000000000000000000000000000000090000000000900000A009A09A09AD0A09A00B00BCB0C9C90C09C90C0900CBCA0D09A09A00ACB0F0ACB0F0F0F0F0F0BCB0F0D0B0D0B0D0BC90C9E9C0F0B090E0AD0B0B09B090000000000000000000000000000000000000000000000000000000009009000900900900900000900000900900000000B0A0A9A0A0A9A0ADA0090A0009009000000090000000000000000000A000A000A000A09A00A900000A9090BCBCBC0F0A9000000000000000000000000000000000000000000000000000000000000000000000000009000000900000000900BC009C90C90C90C090009C0090000000900090009009009009009009009009009009009000009009009000E0C09A90B0090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009E0ACB0E9ACA9E0E9E0A90000000000000000000000000000000000000000000000000009000000000090B0BC9E9CB000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090009009000900090000000000000000000000000000000000000000000000000000000000000000000090B09A9090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFADFBCFBDEBDFADFBCFBDFBEDBF00000000000000000000010500000000000076AD05FE,'Steven Buchanan graduated from St. Andrews University, Scotland, with a BSC degree in 1976. Upon joining the company as a sales representative in 1992, he spent 6 months in an orientation program at the Seattle office and then returned to his permanent post in London. He was promoted to sales manager in March 1993. Mr. Buchanan has completed the courses "Successful Telemarketing" and "International Sales Management." He is fluent in French.',2,'http://accweb/emmployees/buchanan.bmp') +GO +INSERT "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(6,'Suyama','Michael','Sales Representative','Mr.','07/02/1963','10/17/1993','Coventry House +Miner Rd.','London',NULL,'EC2 7JR','UK','(71) 555-7773','428',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF9A9FBCBFFD0000000000000C0BCF9BDF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FCF0EFDE9A00000000000000BCB0FCA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A9A9F9EBFC0000000000000AD0BCF0BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0DACBE9F0A000000000000090BCB0BCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0F0DA0FD000000000000000ADADE90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC909A9F0A000000000000000000B0EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A0C0000000000000000000BCBC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0DA9E9000000000000000000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000B00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF900B0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000BEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000009AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000A0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000A0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000BF9ED0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000900A0A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF090FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000B0E909000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000009A0A00000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90090F0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000A0BC0900B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBC009090000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000090A9A0A00000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE909A0DA9B0900DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000009A090000009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF090B09909009A90BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A0000000000000BE9A000000009A9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD09A09090A9090909009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0090000000000A009E9E000000000AA90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00909D09A9909A090090009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA0F0A000B000000090A09A9A9000000009AF0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09A9A09A900090900B00B0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000F009A0000000000000ACB0A00A00009AD0A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0B0D09900909A00009009090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000900F00A000000000000090B0E9E900009A0BA90B0ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9090909B0090B00900B0090900A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0A9A0A0F0000000000000000A009A9A0A000009F0BC090900FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90B090B000B0009009009000A09909009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB0B000000F09A000000000000000000090CB000A0ADABA0A00009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0909A90990090000000009A09000909009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0B0A0FA9A90F0A0900000000A90000A00A00B0000090A0C9ADA9A000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0909F0909A0090A909A090000900B000A9000FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A090F0B00E00AF090E0000000000A00000000B0000000A909A0000000A9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFF0909A090B0D0B0090900900B0900900B9900B09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A90BCAA9E9A09A0F00B0B0A900000000090000000A00000000A0B0B000BCBAA90FFFFFFFFFFFFFFFFFFFFFFFFF009F099A909A90BC00A09A90C9A9AC90000090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA090AC0B0DA0ADA000F0A0DAF9EBCB00000000000000900000000090E09A0090DA00009FFFFFFFFFFFFFFFFFFFFF09B09B099E909AC09A900000B000909A9C90B09CB090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE90DA009A00A00F0A9AF0F000A90F0B00000000A00000000A0000000B0A9A0000ABA900900FBFFFFFFFFFFFFFFFFFF09B09B09AD09E09000000B00900B0A9A90B0909A909090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A9A0A000A0DADAB0ADAC0AF0009AFAF0A00000000000000A09000009A00F00A00B0D00A00A9B0FFFFFFFFFFFFFFFFFF0B0DB0DA9B0B0900B009000900900D09CA9A900090B0DA9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A90CB090090A00000F0A0B0F00000090F0A00000000A00009A00000000BB0B00900A0BC00000F0B00BFFFFFFFFFFFFF0999A99A9DAD00A90090A090A00A09A0B090DA9B9A90B90909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF009A9EBBF00000ADABADA00B00AF00A09A00009A0000A900900000B00000A00DACB00009A0B0A09A0F0B0000FFFFFFFFFFE9BE99AF9A909A90090A09000900900900B0B09E099090B0B90BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00A000B0F0FFA00A000C0A9A0CAD0F0900000B00000000000000000BCA9A009AFA900000000BA90900BA000000BFFFFFFFFF9BC90BD9ADA9A900B009000B000900900909C9A9BCA9F09909B09FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00A9000A9FBFFF0009CA9ABC0CBA9A0F0A0000000B0090A000A00A00B0A90090A9090A00A000B9E9A00E900000B0F0FFFFFFFA9F9BBF0B09090DA900900090009A09A9ADA90B090B9B099A9F09BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00000000ADFFFFF00000A90E00AB0000AF00000000000A00090009000000BCA0A00A0A000900FADA9E0A090A9000090BFFFFFFFDB0BC90BCB9E9A909B90B0B0909009009090B00B0F09E9AD909B0909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000A90000009AFFFFFF00000A000B00A9EB0F0000000000000000A00000000B0B9000B09000A0A90BADA909A0BCA00000B0BFFFFFFBF9FBAD9B0B909A9C0B0909A09A9CB9A90B09B0D90B09B9A9B09B9B90FFFFFFFFFFFFFFFFFFFFFFFFFD0000A000000A0009BFFFFF000A9CA9A0F0E00CAF00B0000000000000000A000000BCA00900A000909EBDBA9A0009A09000A000FFFFFF9F9A90DB0F09A9F9AB99A9B0D9A90B09D0B09AD9A0BC9ADADBC9AD09A9BDFFFFFFFFFFFFFFFFFFFFF000A0090000A090000AFFFFFF00090A90CA009ABA9F0000000A000000A0000000000BDA9000AB0B00A0A90A0000000A09A00000B0BFFFFFBCBF9FB0B09F9A9AD99E9F090B0DB09A0B0FA99A9B90B9099A9B99BE999AFFFFFFFFFFFFFFFFFFF0000090000900000000BDFFFFF0000AC0A0A90A0E0C0F00A9A0000900000009A0900000A00A0B000000000A9000000A90F0000000009FFFF9FB90B09F99B09DB9BEB99ADBB09B09BDB9999DA90DA99EB0F9F0B099B0F90FFFFFFFFFFFFFFFFF0000A000A000A00000000BFFFFFE0000B0CB00E9A90BAF09009A090A00A09A000A0A000B0B0000BFA9A0B090009A00000A0BCA090A000FFFFE9EBD0B09AD0BA9AD99EB9B90DB09F09A9AFA9A9B9A9E090B0B9F0F099B9B9BFFFFFFFFFFFFFFFE0009000000A0090A00A000BFFFFFA0000B00F0000A000F000A0A9AE90B00009A0900000000000B0A9A9A00A0A000009009FA900000009FFFF9B99ABDB09A99DB9A9A99E9AB0BDA9BBDBD99BBD0B909B9F090A9B9B9E9ADA99FFFFFFFFFFFFFF000A000A00900000000090FFFFFF9009A00A00AB0E09E0F0A09090A90A009A000000009000000B0F9B0F00F0900000000FAA90A9A09000FFFCB0FAD900F99B0A909099A99D9990B9D0BB0BBC90BDA9B090B9F9BDADA90B9B9EBFFFFFFFFFFFF0A900000900000A00000000BFFFFFE0000CAD0BC0090A00F0000A0AD0B0B0A0FA00A0000A00A000B0BEB0BB0CA000000A9AD9A00000A000BFFBDB990B9B0A9C9909A9B0D0B0ADA9DA9BC9BC9B0B00900F0BC9A90B9B9B9DBDBBDBFFFFFFFFFFF000A09A0000A0000090A00ADFFFFF9000A90A0A0FA0A0A0F09A09A9AB0A09A90B0900A000B009000B0B0BCBB0000000000BAF0F0B0000A00F0B0FB0BC0999A9A9E090D0B099099A99A9B90B09F9B9B99099B09F90F0BCB09AD9B9BFFFFFFFFFFC0000000A00000000A00009ABFFFFF00000B009000F0C90F0A0000000F0BADABCBAF000F9ADA00A009A9AB0FA00000A00BDF090000B0900B9F9F90F9B9A9E9B0999A909090A9009099090B99A909E9A9B0B0B09AF09F9F9B9BBCBDBFFFFFFFF00A90A00900090000000090ADFFFFFE0000E0A0E0B00A0A0FA9CB00B0B09A90BCB9E909B9ADA9A090BAB0F0F090000090BEBA00A09A00A0B0F9A9AB9090DA9909B0A90B009090099A9E99B09E9A9B90DB09DB9DB999BB0B0BCBDB9B0FFFFFFFC9A00E90A000A00A0B000A000BFFFFF0000B00C09A0CA900AF9AB0B00B0BADAF0B0F0FAACAFB0A90A0090B0B9A090A000ADBC9A09A009A9BDB0F9F9CB0A9A9B0BD09990909A009A00909B0DB99B9C9A9B09A900B0F0BC9DBD9B9B9FBDBFFFFFF0A9A90A0000000000000900A9FFFFFFF0000A0B0A00A00E90F09ADADA0C90B0BB00A9090B9ADBDABCB0AB0B0A9E0009A00A9A00000B0000EBDB9A9B9990909090B9ADA909090009090909B09A90B9B0909A9B99B99B0B0B0BE9E9F0BB9BFFFFFAC0CA09E9A000000000A000000FFFFDA0000D00ACB09A00A0F00A9A009A0ADBC00000A0000F0A000B0A90B0ADA9ABDA0090009000000A0F9FBCBDB0BE9BCB0F9B9099090A00090000A90909BD9BDA9DB0F90DA90FA9F9BDB99BB9BBDF0FFFFF00B0B0F000000000B000000000BFFFFFF000A0A0090E009A00F009009A0009A00B0A9000A0B0A90BB09B0A0090B0BDA0D0A00A0A00B0090B0B0B9A9F99009099AD0B9A9A909090009090B09B09A9A99A099A9A9DB999B0B09EBC9DBDBB9BFFFE0F0A0A0A00009000000000000BFFFFFF0009009CB0A000A09EF000A00000000B00000A09000000A0CBA00900A00BFADBA00009E9B00A0A9FBDBDBDB0B0B9A9A999B9C9090909A909A0090B0DB99B9B099A90999A90BE9DBDB99BAB0B9FADFFF000AD0D090A000A0000B0009A00FFFFFFA000E0A00E00B0C0A0F0000000900B00A0B0F9A00000000B00DBA0B000009BE9F0B0B09EBF0900B9CB9A9A9BD90909DAB0DBB9BDB9F9DB99D9B090B09E9CBDB0F0BDA9A9B999BA9A9E9D9F9FB99BFFDB0B0A0A000000000000000A00009FFFFDF0000B0A90B0CA9A9AF0000000000000090FBADA00A00000BBA09A00000A0F9A0A000BFBDFA00BDBB9F9F9F0B0F0B0B9DB909ADB9E9B09F0B999B99B99B99A9B990909D90F0B09BDB9A9A9A9BEBFFFE00CBCB00A0900000A0000000009AFFFFFA00000C0AACA0000C0F0009A00A0000090BBADB0B000009AD009A0000B0DB0000900BFFFFADA9F0F0DA9B9A99909C990B9ADBDB9F9BDBF9B9E9F9CB90B09A9909A9A99A9B9BD9F9A909BDBDBDB9FFF00AB0A0000000A00900A0000000AFFFFFE0000B0A9E90090A0BAF000000000B000A0ADBEFBC0900A00BAFA900000A00A00000BDBFFFDA9A9B9BB9BCBDABA909A9F0B9B99BDB9F9F9F9F9B0B9C9BDB9DA9F09090B9ADA9A9A99BDB09A9A9FBFF09AD0E90F0BCA900000009A000009BFFFFFD0000D0A00A0AC9AC0F000000900000000B0BB9ABA0000000900A0B0009A09000000ADBFFFFDBDA9CBDB9B99D00B09099C90F9F0F9B999BDBDBDBB9B0B0BB9A9B0B0F099B9F9B9F0B09F09F9B9BFFAC0A9AE00A0BCACA0A0B00000A00ADFFFFFA0000A9CB09A00A0B0F0000000000000900B0DAF09A0090B0A0900000B0000000000BFFFFBFA9B9B9B0BDABB0B909A0B0B9F9B09990090099BDB9D9F99F909D909C909B0B9B9E90BD9B09B09E9FF090B0E909ADBCA9090000CB0A09000BFFFFFD00A00AA00E09A0000F000A900A0000000B0BAB9FA000000000A000000000000000BDFFFFEF9F0F0F0BDA9D090000090909090990BC9A090009BDBB09B0B9B0A9A9A9B0F9E90B9B90B09B0DB9BE0ACA0E9A0E0A0A90A00000A0000000BEFFFFA00009E90CB00E00FABF0000000009000A90A90FB0FB000000900000B000000A00000BFFFFBDA9B9B9B9B99A9A900900000090C0A90B990F0B9090D9F9D90D0990909A9B9B9FB99C9B9BC9B0BCB90009A9E0B09AD0A0CA09A0900B00A09FFFFFF0000A00BA00B09A000F000000000A00000B0A90FBF0FA000A0000000A9A0000900000DBFFDBDA9E9ADB0FB90DA9A000000009B90F90E9A9BCB909099A9A9B0A90B099CB9A99BEB9A9C9B0999BCB0B00CA9E0AC0A9C9000000A00000000BFFFFFF0009A0CA9E0AE0BE0F0090A0900000090A9A0BBCBF00900000000B0000090000000BFFFFFB9BDB9DB0B909A909090000000000B00B909099BE90B00909009000090A99F9BAD99F9B9B09F0B0B9A0CB0BCB0D0B00A0A0000000000000ADFFFFF0000ACB09A0B09A00BF000000009000A0A9090BCBF0B00000000B000900000000009FFFFF09E9A9AB0BD0B0909000090B09A909099000090BC90B09000009009090B99B09F99BBA90B0DB090B9C09A0BCBE9AA0DA0909A000000000009FFFFFE0000090EACB0CA0DA0F000000A00009009A0A90B0B00A0A090000090A000A000000A9FFFFFB9BDBD990B9DA9A9A9A9090BC90909009099A90B009000000000000A909ADBB0BB0D99F9B099B9C9B0A9ADADAF9CBADA0E09A0000A00000AFFFFFF000B0AB09AC0A90A0AF000009000A0009A9B0A000DA900900A0000A0000000000009EBFFF9E9A90B0F90B0909C9090B099B9A9A990B909009090A909090000000909A990F90FBA9A909B0BCB9A9B0CBAFBCAFBCBADA9AC009009000009BFFFFFF0000C0A09A90A0090F000B0000900A000A09A9A9A9ACB0AD00B0F0900090000A0009FFFDB9BDBB9B90B9B09A9A90B09F0B9D990BC90F09909099900B00A0009009E90B99BB999BDBBD09B99A9C9A90DADBDACBFCB0FA9A00A00000000FFFFFF00000B0CA000E0BCA0F00000A90A0090A9B9E9C9E09090C90BC0900A00000090000BFFFBA9F0B0D090BD090B0999A90B09E9BB0B9B9B99B09A9F9A9B909000B00B090F9ABC99AF0B090B9F9AD9BADAEBFEBEBF9EB0F0C0000000A00B0FBFFFF00009A00B0F0A900A00F0A0090A009A009A0A90A90B0F0A9A009A0BC090A0A00090A9BFFFDB9BD9B9F90B0BC9B0F09E90B99AD9F9E9F9FBDBBDB0B9D009009009090B90B99B0F99B99BBDB0B9B099ADBCBFDBCFEDFE9AB000A9A090000BFFFFFF00000F00A000A0B09AF009A00900000A0909A90A900090090B0900B00090900A0900AFFFBDA9B09A9A99B9B0990B09BD0A99A9B99B0B9A9DB9BDBA9B0A900900B090B99E99B0B09AD09A9BDB0B0F9ABFCBEFBFBFADAD0F000000A00000FFFFFFF000A0BC0ADA000E00F0000000A909A90ABA0009009A0000000A0B00A0000A090A0BDFFF9A9F0FB999F0909B9A99B090BD0BDB0DA9D00DBA9E909D0099CB0A9A9DA90DA9BA99F9BDBBD9BCB0F9B09FDEBFFBCFDEDADAA0000000000A09BFFFFF000A000A90A09EB00AF00009A090A090A9009A000A000009A0B09009090A0090A909FBF0B9F9B90DAB09B9A9E9CBC9AB90B0909A90A99B0D99B9B0B9B0B099909A909A990D9A9A9A990B0B9B9BC9BFEBFF0FFBEBAF0F09A00A0000900FFFFFF000090FA90A90A000B0F00B00CB0B0B0ADA0B0900900900A099C000000A0090A0000BEFFBDB0B0B9B999BC999B9B9BBD0F90B0B90909A009B0B0BCB90C9090F0B909B99A9B0B9B9F9A9BDB9BDA99B0BFFFFFFEFFDF0B0E000009A00000BFFFFFF0000A000E00E0B0E00FB000B0BCF9ADB0B00A0A009A00900A9B0B00B009000090009BDF9A9F9F9F0BDA9B0F090BC99B9A9F99CB0B0090B09B0D090B9B0B0B0B0F90DA99A990F090BDA9A9F0BDABCB0DBEFFF9FAF0F0B9A09000000A000BFFFFFA0009A0B0B0900B0B0F09A909FBBCB00B09B09090A90B00900000000000A000A000A9FABDB9A9A9B9A9F9B9B9F9BBEBDB9A9A909C0B0C90F09B0B9CB0BDBD99F9A9A9BC99A99BBB90B99B9B9B99B9BAFDBEBFEDBE9ACAC00A00000000BDFFFFF000A0AD0A0A0AC000AF9F09EBE9DA90B00A000B0A90B00B0A90B00B00B0009000A99FB9DB0BDBDB0DB990B09A90BD99ABC90D00B09090B090B0BD0B9F99A9BA909B99099E99A9C90B9DABCBCBCB0DADFBEDFE9BE0BCB09A00000A9000FFFFFF00000D00AC09A9AADA9FA9A0B9BFA90B0F09A90009AD090009000000000000A09000FBCBB9F9B0B9BBDAFB99F99B0BFBD9B9A9A900B00900B0D909F9F9EBDA9DB9B0DA9B09AD99B9F90B99B9B9B99B0B0FFBCBFE9F0ADA0000900000B0BFFFFFF0000A0B0B0E0090A00FBE9B0F9ADA00B0B00A09009A9A9000B09A90B00B0000A00B9FBDA9ADB9F0DB999BFA9A9C990BBD0900909009A90909A9B0BB0B9B9FA90B09A909B99A9A9A9BB0F0BDBA9F0BD0F0FFBCBDADA9ADA00A0A00A0000FFFFFFB0009AC00B0A0E09A0F0900F0BCB09E0000B00A00909009A900000A000009090090BF9B9F9B9F9BB9FBAD99B99B9A9900B0090A090900A09A90DB9DBDBDB99BBD9B99BD0B09BD9B90DB9B9B0F9A9B0BAFBCFBFAFA9E9A090000900000BFFFFFE000A00B0A009A90AC0F0B0B0B0909A090B000000B0DA090090B0B0909A9A0A0A00BF9B9FB9BE9BF9FAD9BABD0B009D0B900000900A009090090B9FAB9ABA9BC90B09A90BDB9A9AD0BB0B9E9F99F9E9ADBCFAF0F09E9AD0A00000A09A0BFFFFF900000F0AD00E00A0BAF00000000A090A00B009000B09A0B0A900000A000000909ADBBCBB0F99BF0BB9BF9D9BD99B9A9909000009909000090090099DBD9D099BB9BD99B99AD9B99BD9BDB9B9AB0B9B9AFFBDAF9EB0E9A000A9A00000BDFFFFFE0009A00A0AB00AD000F0090009000A0900000A0009AD9909DA909A09A9A0B00A09BDB9F9FBFBDBDBDBDBBB0B9A90990BDB09000A0909A900000900B09B0B9A909D0B0BDA99B0DBA9A9A9BCB9DBDA9E9DAFCBDAF0F9ADADA900009A000ABFFFFF900A0F09000A90A0B0F00A090A09090A000000090A90A0B0A90A0090000900B00BEFBF9B9B9FBFBFBFB0F9F9A9F9A0B9A99A9F999A990000A99BDB09A09099B9B0B9B9A9BE9BB9DB9F9B0B9AB9B9F9B0B9BFAF0F0ADA9A00A00A0000ADFFFFFE000000A0EB0DA09AC0F0900000000000000A09A0A90B09009A009A0A09A00B009F9B09BFBCFBDB9F9F9F9B9BDB90999F9FA9B90BC90B09A990B09099099B0F9E9B9F9F9FB99BD0BB0B9E9BDBDA9F0B0BD0F0BDA9ADABCA0B09A90A9A9BFFFFF9000BCA9A900A00A00AF0009009000A09009000909A09A00B009A0909A09B009A9BBDBF09FB9FBFFBFBFBF9EB90B9B0BFB99D0B9B9B99F99BDBD9B90A9BC9B99B0F9B90B9DBE9BF9DBDB9B9A9B9B9B9F9BB9BCBADA9E9AD00A00000000FFFFFFE000090E00EA90F00B0F00A00000B09000A00B0A9ADA09A00B009A00A9A00B000B0DB9BFB9FBBDB9F9F9F9F9FB9F0D909FFAB9BC9B0FA9B0B0BBF0BD909B09A9B9B9EBDBAB9BF9BB99A9BDB9F0F9E9A9BDBF9BC9ACB0F9ABC9A00A00000FFFFFF0000A90B090E00BC0AF0900900A0000A09000090B09A09A90B0A09B009A90B0BDB9AF9B9FBDFBFFBFBFBFBB9FB9B9A9FB9F9FDBBDB99F9F9FBDBF9A9909BDBDBDBF9BB9F9FB9E9FABDBCB9FB9B0B9F9FADBBDBE9A0F0AD00A09009A09BFFFFFB000A00A0EA090A0A90F00090A9090A9090A90B0B09A09AD0B0B09A00BA9A0009B0BF9B9FBDB9BF9F9F9F9BDF09F0B99BDF9FFBBDBFBFBFBFBDFB9909A9B9B9B0BB9FBDF9FB9F9BBD9BB9B0B09F9BDA9B9B9F9A9ADB0ADA0A000A0000AFFFFFFC0009CBCB009AACB00AF0B0A9909A900000000090A09A09AB0B09A09B0D00B0BF9F9BDAF9FBBFDBFBFBFBFFBBFBBDBCB9BBFBBDFBF9F9F9F9FB9FF0B99BDBCBF9F9F9FBBBDBFBDBDBBC9F9F9FB0B0B9F9F9F9FBDA0E9FA90090000A090FFFFFFB000A0A00B0E09A0AD0F9099EBB09A9B9A90090A9DA09A090B0B09A00A0B00909B9FBBDBB9F9BF9FBDBDB9BFDBDBB9B9E9FFDFBF9FBFFBFFB9FB9090BDA9BBDBBBFBFBDFBF9FBFBBDBB9AB9B9B9F9A9B90B9A9B0F9A09EAD0A0A0900A09FFFFFF00009A9E0B0A09E0AAF0B9A9B0BF9000000A0A90A90A90A9CB0B09A90909A0BF0F9F9BDBEBFB9FBDBFBFFF9BFBDBF9F9B9BFBDBFF9FBFBDFF9DB9B99B9F9FBDBDBDBDBBF9FBDBDFADBF9DBE9F9B9DBCBBBDBDBF0ADAF09A00090A0900BFFFFFC000A0CA0BCADA00B00F90B9B9BB0BA9B0909090A9B090A9AB09A9A900A0A09F99BB9FFBF99F9FBDBBDBDB9FFD9FADBBFBFDFFBFDBFFDFDBB9AB9E9DABFBFBDBFBFBFFBDFBF9FBFB9B9B9BB9B0BCBAB9BD09B9B9E90B0DA0090A00000BFFFFFFA0009CB0F0A9A9EB0CBFA9AFBBCBB09000A000A0900A0909099A9A90B09090A9B9F0F9BDBBFBF9BF9FBFBFF9BBFB9BBDBDBB9FDBFFBFBFBF9FBDB9BBDF9B9FBF9F9FBDBF9FFBF9BDBDBDBE9F9F9B990F9BBBDAF9BCADAA900A00090A09FFFFFFD000A0A00BCACA0CBA0F9090B9B90B0B0900B090A9090A0B0AA9A9A90B0B090BDA9FBFBFDBF9FBDBF9A9B9BFDB9FF9FBCBDFBFBFFBDFFBF9FBDBFBDBB9FFBF9FBFF9FBFBFB9FBFBBDBA9B9B9A9B0BF9B09DA99BCBB0BD0E900000A0000AFFFFFE00009CBCA9A90B009AF0A9A90B0B0000A09000090B0A900B999A9E9B0B00A9F09FB9F9BBF9BBDBB0F9F9E9BB9FB9FF9BFBBDBFDBFFBDBDBF9BF9FBDBFB9F9BF9FBFBDBDBDFBDBDFBDBF9F9F9F9F90BDB0B9FBDB9CACAF00000B00000B9FFFFFB0000A0A09E0AC0AF00F09000A00000000000000A000900B90AA9B0BA9B0B9B9B9B9FBF9F9BFDBB9DB9B099B0FB9FB9BF9BDBFBFFBFFFFBF9BFDBBDBFBDBFBF9FBBDBFFFBF9BF9BB9BF9B0BB9B9A9BDB099FB0B99AB9B00A0000000900FFFFFF0009AD00DA0090A900FFA0900090000000900009009A00B00B99A9BB9EB9A0F90FBFBDBBFBDBBBDAB9A9B9AD9A9EBDAF9FBFBDFBFDBF9BDBBDBBDFB0BDBDB9FFBDFBDB9BDBBDBBFDBF9BFBD9BCB9A9B9F0B9BD90F90E0F0090000000A9FFFFFFC00000B0A09E0B0E0A0F9A0A90000000900090A09B09A90B00A90B0BA90B9B0B909FBBFDBFBFCBBDB9F0DB9A9999B9F9B9D0FBBDBFFFFFBDBFDBB9FBDBBBFB9FBBDBFFFBBDFBDBBBDBF99BBE9B9F9E9A9F9FBBB90BDB0A00A000000000BFFFFFBA000AC09A00AC09A90FA9900000B00A000A0090A00B00B0B09AB9BB9BA00BDB9BFBDF9BF9F9BF9B9A99B0990F0B0B9BDBBB9F9FFBF9B9FBF9BF9FB9B9F9BDA9F9B9B9BDFBBDBDF9BF9EBD9BBDA99B9FB9A99C99B9A0F0F000000B0009FFFFFFC000A9A9E09A90B00CAF90A00B0B009000090B0B09B00B0009ABDBE9A099B099CBF9FBBF9FBBD9F0F99B099A9090D9BE9A99FBFFBDFBFFBF9AF9EB9F9F0BCB9B9ADBDAFB9BDBBB9BF9BB9BFBD9B9BE9B909009BE9A9F0B00000B000A9AFFFFFF00090C0A09AC0A0E0B0FA09A00009A000B0A00B09A00B0A9A009A9BADBA00B09B9BFBFDBE9BDBBB9B0B09E909A90B099F9FB9F9BFBF9B9F9FB9B9F9BA9B9B9BCB9A9B9BDBFBDBDBF9BF9FB99AB9E99F9FB09B099F9A0F00A9A000A90A9FFFFFFA000A9E90E09AD0B000F9A0900B009A00000B00B0BBA09000B0A9A9B00B0BD909F9F9BF9BFBBDADBDBDB90B0909090B0B90BDBFF9FBFFB9B9DBF9BD9B0D909B9BDB9F9FB9BDBFBDBFDBB9FBF9F9BB0BB09F099A99F9B0F0000B0B0EB0A9FFFFDF0000A0A90AA0A00BE0F0900A90B0009009000B0B0090A0B0009ADA0B0090B09ABFBFF9F9909A9B0B0000909A90B09090B99BB9BFBDB9FADBB0B9A9AD9B0BD090B9AB9BDBFBBDBBF9BF9F9B9B9BDBDBC9B090009A90F0B0B0000ADB0DBFFFFFFA00009E9E0D09CBC00BF00A090A90B00A0000B0009A0A90000B0A9A90A9AB0909F9BF9AB9A090909009A900000000B09B9FAD9FF9FFBF99BB9DB0DB90B0900B9F09BDAFBDBFDBBFDBF9BBE9BFBCB0B99B090A999F9B0B0E00A0A9A0FAFFFFFFF000B0EB0B0A0AB0A0B0F9009A99E009090A00009A09000000000900A9000D9009BFDBFBDB9F000000000A00000090000D099BA9BFB9F9BF9DAB0B9009090B9909BDB9B9BBDBBFDBBBDBF9BF909B9B0F00B00900B9BCBCA9000900DBE90FFFFFFC00009EBCB0BC0A9AC0FA9000A909A00000000A09A00000000000B00A9A9AB09A0BF9BDB090B00000009000000000009A9A99F9F9FFBF9BA99D90B9A900000A909B0BDBCBBDBBBDFBBF9F9BFBFB9F9B9009009009B9A9E0A9000A00BEBBFFFFFB000AD9EB0E0B0CA0B0F000A9CA9A09A900090000000000000000000000090909DB9FFF0FB9090000000000000000000990DA9BBFB9B9BC9B0B0000009A90909A90F9BB9BDBFDFBBDBDBBFDB9B0F09F090009099F9A9E9A00A0000B000FFFFFFC0009AE0BE9A0A90F0AF00090A90090000000000000000000000000B000000000BBFFB9B9909A900000000000000000B009B9BBDB9F0F09B0B9000090000000000B9B0DBFBF9BBBDBFBBF9B9F9F9BB000009090B09F0BC00000000009BFFFFFB000A0E9BC000F00A000F09A0000000A000000000000000000000A90000B0000009EB9F0FADB90B0909A00000000000909B090D9ADB9B9B09D0090000B0000000900009A9909BF9FB9F9F9BE9BB0B0DB90090B0999A9E0B0B00000000A0FFFFFF00009A0A0A9A0AC9ADAF0000A90A9009A00000000000000000000000B0000000099DBFB9BB0F90B0B090D99A90900900009A9A9B9AD09DB0B90A000000000000000000000B090B9EBBFBF9BF9BDB9B09B9A90B0F990BDAC000009A0009BFFFFFF0000D0CB000900A000F0090000000000090000000000000000000A00000000000FB9BDBD0B9A999090B000900A09A090909990D099B0B09009090000000000000000009A99B9FB9F9BDBBDBBCB9A9FBC99F999B09B0A90A0000000000FFFFFF000A0A0A00E0A0A00A0F000090A00A00000000000000000000000090000000000BB9E9FA9BF09DA09A909A90090900909A9AD0B9B9A0909009090090000000000000090099ADBB9BFBDBBDBBDB9ADB099B090FB099E0BCB0000000000BFFFFFE000900B00B00CA9CB09F000A000090000000000000000000000000000000000000DBBF99F09B0B9B0DA90900B00009000909A9900099B09A9A9A9009090909A9A9A9909B0B90BCBDB9BDBBF9A9E90B9A90B9B9090B9E9AC90A0000000BFFFFFDA000E00AC00B000A0A0F0A90009000090000000000000000000000000000000009AD9FA90B0DB0D0B090B099090B00B0909090B9BDA9090909090B00A9A9A9D09090CB09D0B9B9BBFFBBCB9BDB9B90BDB090FB0090B0E9A00000000000BFFFFFD0000BC0B0A0B0B0C9AF00000A00000000000000000000000000000000000000009BB090009A9B0B90B090A000909009A9B09B090909A90090009090909C90B9A9A9B09A9B9E9BC9B9ADBDBF9AD0AD0909AD900999E9A9CB0000A0000BDFFFFFA00B00A90AD0E00A9A0F00009000A0000000000000000000000000000000000000BE9F0000000000000000090B009A900909BC90B9B9C9A90A90B00909A9A900909909B9B0B9BDBBFBDBBBB09B0B990B9099B0909A9A9EA000B000A90FFFFFF000000F0ACB0A09ADA0FF090A0000900000000000000000000000000A000000000099B9F00000000000000000009A090B9CB09B9F909A909009090090B0909A9B0F0B9AD0BD9F0BF9BDB9DBDBE9900A90A9B00000B9ADA09A000009000BFFFFFF0000A09A9A0B0A0A0B0F00000090000A09000000000000000000000900000000000F9B0B000000000000000000090B90B99B09A9BD09B0B090A090A909A909A99990B9B99AB9F9BE9BFBA9B99A9A9009009900099E90FBC09A00A00B00BFFFFFF0009ACB0F9CBCB0F0BF000900A00009000000000000000000000000000000000009ADBD00000000000000000000BD0B90BCB9B90B9B090D0B0900900909E990B0BF9E9AD99A9BF9FB9BDBDA00000000000A099DA00A00B0000900000BFFFFFE0009E0B0E0A0A00E0ACF000009009000000000000000000000000900000000000009B9A9A000000000000000009090B9EB9B9D09F9BCB09A90900B00B0A909CB9F0909A909ADBD9BBDADB9A90000000000009B0B00BCBF0A00000B00BDFFFFFB00000B0F9A9E90B0B0BF090A000000000000000000009000000000A00000000000000F9F9C000000000000900A0F9B0B99F9AB9A9A999F90B00B00900090B0B0B0B0B090B09B9ABF9B9B9B900000000000000090000B00D009A000000BFFFFFF000A9E00ACA00AC0AC0F0A090A90A9A90A900000009000000000000000000000000009A9AB90900000000A009909AD9EB9AD9BDB9DB0B0B90900000000000090090000000009F9F9E9BCBCB00000000000000000090AFA0B0000000000FFFFFCB00009E9A90AD0A90B0F009000000000000000900000000000000000000000000000099F99ADA9A9F0F0B99B0F9B9BB99F9BBDA9B9A9F99E9A9000000000000000000000009A9B9BB9F9B90000000000000000009A0D09E000000B000BFFFFFF0000A0A00A0CA00E00AF00A0090090009000000000000000000000000000000000009A9A9E9B9F9F0B99BDAFDB9ADA9DBA9BC9B9E9BDB0B909000000000000000000000009FBDBCBDBB090000000000000000000AC9ABE0000000000BCFFFFFA0000090CBC0B09A00BCF0900000A009A090090A00000A900A009009000000000000009F9B9BDA9E9BDAF9BF9A9FB9DBAD9F9BBDB9F9B9F0B9F0990000000000000000909A9A9B9B9B0D9A000000000000000000009AD00B0000000000BFFFFFF000B0E9A0A00A0CB00AF00090A900A000A00000900000000090000A0000000000000009ADA9BDBBF9BDBE9BF9F9FBBDBB9BF9BADB9F0B9BDA9BA9A900900900000000009DBDBCBF9F9A9000000000000000000000A0ABC0B0000000000FFFFFDB00000A009AC0A00E90F00A000000909A900A00000900000900A00000000000000000A99B9B0B9DABFB9FBF9BFB0F9F9F0F9BDFBBCBBDBDB9F0DB9F0B00000090000B9FAB9B9B99A9A900000000000000000000009E9CB000000A0000BFFFFFE0000F00DA009A00A00AF0000A90A00A0000009000A0090B000090090000000000000090BC9E9F0BBDB9F9BDAFB9F9FA9BF9BCBB9DBBDB0B9FB9BBCB9D09ADA90009B9EB99E9F9BE99000000000000000000000009A00B0E0000000009FFFFFFB000A000A0C0A0DA90E0F090900909000909000A090000009A00000A00000000000000090B9909BD9BDABF9BF9DBFB9FBF9FBB9FBBF9BF9FB09FADBDABBF9B90FBDB0F99FB9B9E990000000000000000000000000ADA9E09A000000000BFFFFFC00090E90A9A0A00A09AF00A00A0000BCA0A000000090A00009A0900000000000000009A90B0B09A90B9DAF9BBBDBDB9B9F0F9B9CB9E9BBDBBF9BB9BDBD9FBFB9B0F9BFB0BDAB9B0B000000000000000000000000000A9AC00000000000FFFFFFB000A00E00C90AC0A00F0009000A000090909000A000900000000000000000000000000000090B09F9FB9BF9F0B9ABDBDBB9BDBB9F9BDBA9F9BD9FBF9AFBCBDAF9BBDB0F9B9F9E900000000000000000000000000BAD0F0B000000000BFFFFFE000009A09A0A090B0CAF090000900B0B0A00A0B0900A00A90000000000000000000000000000009B0B09BDB0B9FB9DB0BB99E9ADBBBDBB9F9BDBFA99BFBDBDBF9FBDA9F9BCB9A900000000000000000000000000F0C0B0A00000000A9FFFFFF9000BCA00A0000CA00B0F0A0A0A000000909000000B090000A0000A0000000000000000000000000099BF9ADBDB9C9A9B09CB99B99C9A9DB9FBA9BDBFB9DBBBB9BA9BF9B9B99F90900000000000000000000000000B0B0E9000A000000BFFFFFE0000900BCACA9A0E00AF00909009A9ADA000900000000900000000000000000000000000000000000090B9B9A9A99909F9B0B09A9B99BADB0DBF9B9BFBBDBD9F9DB9BDBCBB0B9A00000000000000000000000000A0F0B0AC0000000000FFFFFF900A0AC000900090BC0F00000A90000009A0A09A9A9A0A0090009000000000000000000000000000009FBCB09090A0B090099F99B0BC99B9BB9B9FBC9DAB9AB9BBBCBB9B9DBDA90000000000000000000000000B0F00AD0B000000000FFFFFFE000009A0B0A0E0A000AF00B0A90000B0B009090000C0909A00A00000000000000000000009A0000009A909000000090909BDA90B0D9B9BADBDB0FB9BBBB9FBDAF9DBBDADBA9A9000000000000000000000000000F00BDAA000000000B9FFFFF9000BCA00CA009AC00A9F0009000A900009A000A00A9A0A0000000000000000000000000000090900009B000000000000B09099BD9AB9AD9B0BDBBCBF9F9FB9BB9ABF9B9B9DB9000000000000000000000000000B0B00A9C0000000000FFFFFFE0000000B00DA00B0BCAF900A9E000A9AC090B09090090DA900000A00000000000000000000000A90000000000000009009A9A90B99BDBB9FB9BDB9B9F9B9F9F9F9B9E9F9AB0F9B0000000000000000000000000CA0F0CA9A000000000AFFFFFF000A9AC0A000A000000F0090009000009A0000A000A0A000A0900900000000000000000000009009A900000009000000090990B0BCB09CB99E9B9FBDABDA9A9B9BDB9B0BD990000000000000000000000000000B0F09A9E00000000009FFFFFB0000C09A09A0D0E0A9AF0A00B00A9009A00B0B09A90909A09000000000000000000000000090A090000000000000000900B9CB999909BB90B9B0F90B9DBB9FBF0FB9BDB9A9A900000000000000000000000000BCB0AA9E09A0000000BFFFFFFC00B0B0A0E00A0A090E0F0090000009A0000000000000A09C0A0000B000000000000000000000090B000000000000000A009A990F0B9F909BDBDB9BBDBBBDB9B9BB0F9AD0909A000000000000000000000000000BCB0DA9AC90000A000FFFFFFA00000C009E00090A000F90A00A90A00B0BC9A9E909A900A90009A0000000000000000000000000900000000A0009A00900090A99B0B0BDB0B0BDADBBDB0BFBCBDB9BB9A9A0090000000000000000000000000000BCA09E9A00B0009A9BFFFFFF000A0B0A00BCAA0CB0AF00909000090C000000000A00E900A9000000000000000000000000000900090909A9000090000090B99A9D9B9A9F9B9B9B9CB9F999B9B9F9CB9090000000000000000000000000000000E9BCA9E9EB0E9AC00FFFFFFF0009CAC9AF0A9CB0AC9F0A00A0B09A00B00B0B0B009090A0900009A00000000000000000000090A00A0000000000000000A90DA9A9A9E9B9BCB9FBDBBF9BBEB9E9B0B90B0000000000000000000000000000000B9ACA9E9A9CA90F0BFFFFFFF00000A9BEF0AFCBE9E9AF09AC00C000B00900000090A0A090000B000000000000000000000000009009000009090000000909B099DB99BD9E9BDBA9BF99AD9BDB9E9B9AD909000000000000000000000000000000E9A9E9E9EBDAF0BCBFFFFFFF00ADAECB0FDABE9E9AFF000B09A09009A0B09E90009090A90A00000B00000000000000000000000090B090B09E900900000099A9A9E90BB9B9AD9F0BF9FBF9BF9BE9D9A9A000000000000000000000000000000B0F00A9ADACBCBCA9CBFFFFDA000099EFFAFDADAFEDAF09000009A0909000A00A9000000009000B0000000000000000000000000000000090B09A00000009A090909B990BCB9BB9BDBB9B9AD9B99B0B9090000000000000000000000000000000F0BCBCBE9FADA9FAFFFFFFFF0000AE9F0F9EFBF0BFFF0A0A9A9009A0E0A900900A00A9CA0009000C000000000000000000000000090009A000900000000009A09A9ADAF99BDBCBDBE9F0BF9BADB090000000000000000000000000000000000BCBCB0AF9FADAFFE9FFFFFFF000B0F9FAFFAF0FCBFE0F909C000B0009090C0A0A00090A09C00A00B00000000000000000000000000000009090A90000000000900909999ADB0B99BF9B9F99A990090A9000000000000000000000000000000000B0A0BDAF0FBF9E9F0FFFFFFE0000EBCF0FDFFBFEDBFF0B0B0F009A00B00B00C09000000A090000000000000000000000000000000000000009000000000000000000A099A9DB0B0BDA9ABD9E9B0A900000000000000000000000000000000000CBDACB9EBCF0FBEBFFFFFFFB000B0FBFFBEBCF0FADFF0000000B009000000B000A0009000A00900B000000000000000000000000000000000000000000000000000090A090B0F9F9B9D990B90909000000000000000000000000000000000000BA09A0CBCBAFBCF0FBFFFFFC0000BCFEBCFFFBFFFFAF00B00B00000000B0000B00900A0090000A0000000000000000000000000000000000000000000000000000000009A0909A900B09A900A000000000000000000000000000000000000009E09E0FBE9ADE9E9ADFFFFFF000A9EBF9FFBCBEF0F0FF00090000090A9000B0000000000A0000000000000000000000000000000000000000000000000000000000000000090B090B90B09A909000000000000000000000000000000000000000BCA0B009E9A9EBCBAFFFFFFA000CBCFAF0FFFDBFFFFF900000090A00000000000000909000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0B00CBE0ACBE9E00DBFFFFFD009A0BCDAF0FAFCBE9EF0CB0B09AC900009090BC900A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0CBA09ADADEBCB0AFFFFFFA0000BEBAE9EBDEBE9EBFAB9EDAB09A9B0B0FAF0B0BF90B09A9F0ADAF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F09A00DAF0BFADA00FFFFFFF0000F0CBC9E9FEBF0FADFDFFFBDFFBFCB09FBDBFDFF0FFCB0DADF9FF9F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0A09ABDAFE9FA0A0BFFFFFF00000ABCAEBEF9E0F0FAFBFFFFFBDFBFFFADFFFFBFFFBDBFBFBFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ADADA0C0ADBFEDE90D0FFFFFFF00A9CA90BCBEF9EAF0FFFFFFFFFFFFFFBDBFFFFFFFFFFFDBCFFFFFFFFE000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0B00F0BFAFCBFA0EABFFFFFF00000A9EADAFDAADADAFFFDFFFFFEBFDBDAFFFFFFFFFFFFAFFBFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BCAC0B00BCFFFFE9FADFFFFFFF0009CBCA9E9FAEDA0FAFFBEBFFBDBDFAF09FBFFFDFFF9F9F9BDFFFFBFBF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B9BC0A9EBDEBE9EADADFFFFFF000A0A0F0BEDE9A9FADFF9BC9F0F0B9F0B00DADAF0FBE9E9A9A9FADFCFDA00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E0A090E9EBFCBE9EBEBFFFFFFF0009CA0FCBEBE0E0FAFF00B00A90000900B09A90B0090B0D00B09A9A9A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0F0BACB0BCBADAE9E9FFFFFFF0000A0BCABFCF0F0FADFF00000000A9000000000000000000A9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0B0BC090ADABCEBDA9EFFFFFFCA0090BCAFDEBABCBADFAF0900090000A000900900009A0090909A0900A090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0E09A0BDACE9A0ACABFFFFFFF000ACAFDBEBDEDACFAFFF000B00090000900A00A09A0090A00A00000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F00B0BC9E0A9B0E9E9AD0BFFFFFFF00090AAFDEBAFFAFDAFF0A0000A000900A009000000000000909000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009A9ACBCAA0BCACB0E0ACAFEFFFFFF0000A0FDAFBCF0ADBEFFF090909009000009000000000000900A00A0000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009E0E0B0A90D0B0F0F0BCBF9FFFFFFB000ADBFADFCFBEFFE9E0F0000A00000A0000000900900B000A0909090090900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A09AD0F00A0ACB0A9ACB0EBFFFFFFF00000E0FEAFACBDAFFBFF09A900B0B00900000A0000A00000900A000A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FA09A00BC0B09ADACBACBCA9FFFFFFE009A9F9FDBFBEFDADEBF0000090000000A900000A00000000090909000A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B09E00F00A900ACA9AC0B09EFFFFFFE90000EAEFAE0E9EBFEBCF000B000000000000900000000900B0A00A009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0CA09A0A9000E9A9E00B00E9BFFFFF9000ACB9F9ADB9FAFCB9EF00000B0090A00000000900900A000090909A0009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AB09A0C90ACA900CA0B0CA00ADFFFFFF0009A0E0ACACACA9ACA0F0090009A00000090A000000A00000000A9090900A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0DAE0CB0A09000A9090CA009A9AFFFFFEF0009A9E9A9A9ADA9ADAF00A0900000090A00090A0000000900B090000A00000900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009A90B00090A00A00ACA090A000FFFFFFF000A0CA0ACACACA0E0A0F0009A0009000000000000A009000A0000A0B090A900A0BC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0EACA0A00E000900B00000AC00ADBFFFF90000CB09E90A9A9E9E0FF0900009A00A00900900909000A00090909000090000009FF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009AD00A90000000C00B0000A09FFFFFFE000B0ACA0ADACACA0B00F00B09A000900000A00A000000000000A0090B0000B09A0BFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0F00A0D00A9A00A0A0000A0090A0FFFFFF9A0090BCB0A9A0BCA0FAF000000909009A00009000A09000900090A0000B0000009FFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000E9090AF00A00000009009000090000FFFFFFF000CACA0AC0E0F0A9E00F9009A90A0A00009000009000C000A900009A9000900A9ADFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000009A00A0AF00B00BC0A000000A0000A0A9FBFFFF0000A0B09E9A09A0BCA0FFADBE9AD909F9B0F9ADB0E9AB0BBC9ADA9AD0F9B0CBC90FBFFFFFA00000000000000000000000000000000000000000000000000000000000000000000000000A000A009ADAD0BACB00A9090A0A0000A00000FFFFFFF000900EA00B0E9E0ADA0FB0F9FFAFBCBCFDAFDADB9FDFF0FBE9FFF9ABF0F9A9BFADFFFFFFDB00000000000000000000000000000000000000000000000000000000000000000000A0000000ADACA00BAFC9A0E90A0E0090A9A0D0A90A9FFFFFF90A0E90DA0CB0A9E9ADAFFFFFF9FDAFBFBFFDBFBEFFBFDFFDFFF9FEDF0FBE9FE9FBFFFFFF0E0B000000000A000000000000000000000000000000000000000000000000000000A00000009E9A0B0FACB0BE9E9AE9A09A0E90CB0A9CA9FFFFFFE00009A0A0B00E9E0BCADFFFFFFFFBFDFFFFFFFFDFFFFFFBFFFFFFFBFBFFDFBDBFFFFFFFF0FBDE0000000000000000000000000000000000000000000000000000000000A9000000000A0BE0A9CBCBCB0FE9E9AF90F0ADA90EBACBCA9EFFFFFFB0000ACB0F0EA9A0BCA9AF9FBFFFFFBFFFFDBFFFBF9FFFFFFFBFFFFDFFFBF9EFFFDBFFFFFF00A9FAC00000000000000000000000000000000000000000000000000000A9CA0A0090A9C9E90F0FAFADA9EB9EB0F0AE9F0A9EFBCFBEBFEBFFFFFFC000B0BCA0A90E9E0A9E0FFFDFBFFDFFDBFFFFFFFFFFFFFFFFFFFFFBF9FFFF9FBBEFFFFFFFFBCACBA000000000000000000000000000000000000000000000000000000AA900BCA09AA0AEB0BCBCFAFE9EF0FE0F9A0A9E90AFBCF9E9F0FFFFFFFB000CA9E9EA9A0BC0A9AFFBFFFFFBFBFFFFFFFFDFBFFFFFFFFFFFBFFFFFFBFBCF9BFFFFFF0CB0BCF00000000000000000000000000000000000000000000000000000F0DACBCA9EAC9E900F0FBFADA9E9AFA9B0E9E9E0AF9EFBEFFAFFFFFFFFE0000B0CBA9CBCBCBADACFBFFFFFFFFFFFFBFFFFBFFFFFFFFBFFFFFFDFBFFFDBFBFFFFFFF0FB0ACB0AC00000000000000000000000000000000000000000000000000FA0A0B0A9E909AB0EFBEBCE9E9EBEDA9CACB0B0A9F9EDBCBDAFCBFFFFFF9009E0FBEDEBEAE9ADA0BFFDBFFFFF9FBFFFFFFFFFFFFFFFFFFFFFFFBFFFFFBCBDBDFFFFFF00F0B0F0BA000000000000000000000000000000000000000000000000B0BCBE0F9E0BEAD0FB0F0FBBFBEBDFADAA9A0E09CA0ABAFBFADBBFBFFFFFE0000B0E9A9E9BDAE9AF0FFFF9FFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFFFFFBF00F0F0E9CB0000000000000000000000000000000000000000000000BCBCB09E0A9E09ABE0EBCBEDE9E9EA0FADAC9A9A0B0F0CBCBCBEDEFFFFFFFF00A0CB0FAF0ECBDBEDAFFFBFFFBFFBFBFFFFFFFBFFFFFFFFFFFFFFFFBDFBFBDBCFFFFFFFFCBF0F0FBEBCB0C000000000000000000000000000000000000000000BCBE0EBE9E9E9BE9E9FBCAF9AFEBE9FFADA9A00000000BADBEBE9AB0FFFFFFB0000B0F0F0FBBEACBADAFFFFFFFFBDFFFFDFBFFFFFFFFFFFFFFFBFBFFFFDFDABFBFFFFFFF0B0FBEBCF0F0FA900000000000000000000000000000000000000ACBCBCA9BC9A9EB0E0F0FACBFDAFF9F0FAE9EBCBC0B0CA9A9CBE0F0FADFFFFFFFC000B0E0B0E9ACA9FADADFFF9FBDFFFBFBFBFFDFFFFFFFFFDBFFFFFDFFFBFBFFDBDFFFFF9E9EF0FDFBFBFF9EDAD0000000000000000000000000000000000A90B0A9ADACBEDABCBDBEBCBF0FAFDAFAFBDBFADA0B00A900EAFADBCBADABFFFFFFB00009ABCA9ACB9EA9EB0FFFFFFFFBFFDFFFFBFBFFFFFFFFFFFFFFFFFBFFFFFBFBFBFFFFFFA90FAFBCFCBEFBEBEFBE90000A000000000000000000A9009AC0AF0F0EDA9A9A9EDAEADAFBCAF0FAFFCBCAE9EDADA0F00AB09ADFAFBCB0F0FFFFFFF00A0C0A9E0B00E9CB0FAFFFFBFBFDF9FBFFFFFFFFBFFFFBFFFFDBFBFFDFFBFDFF9FFFFFFEDAF9F9EBFBFDADBDF0E9EBE9E9000A000A009A00090AC0AA00B0D0A0B0A9EFCAF0BDBDADADBF9EBDA9FEFBDEBAFADA0AF0CBE9EBDACBEA9FBFFFFFE009CBADA9ACAF0AB0E00FFFFDFFFFAFFFF9FF9FFFFFFFFFFFFBFFDFFFFBDFFBF0FFFFFFF9BADAFEFFCFCBFFEFAFBFDADAF0E9E09009CAC09A0A090A9C9AC00A09E0F0E9ABDAFAEAFADAF0EBDAFFE9BCAF0FC9ADAF09BE9EBCBEB9E9FEFFFFFF9000A0CBCAD0B00F0E90BFFFBFF9FBFBF9FFBFFFFFFFFBDFFFFFFFBFFFFFFFFFFFBBFFFFFE0DAF9F0FBFBEDADBDF0BEFBCBDBE9FADA0A99A09000A900A009A09E00B0B9ADFEBCDBDADADAF9FADBCBFEBDAF0BACB09EAE0BCBFE9FEBEBFFFFFFFE0000FBCB0AACAF0EBCA0FFFFFFFFDFDFFBFFFBFFFFFFFFBFFFFFFFFBFFFFBFDBFDFFFFFFBF09EBFF0FDEBFFAFAFFCBEDBEBCBE9EBCBCAE9EACBC0E0B09A00000B00E0E0B00BAA0F0FAF0AF0FAFBE9E0F9EBCB0FEADB0F0BCBFEADFBCBFFFFFFB00B00EBCF09ADAF90BCAFFFFFFBFBFBFFDF9FFFFFFFFFFFFFFFFDBFFFFFFFFBFFBFFFFFDF0BFBCFAFBEBDADFDF0FBF9EF9EBDBADA9A9F9E9F9A9B0BC0A000A0000F0B0BCAF0DADAA9E9F9EAF9EF9EBDAE9E9AF0BDA0DA9EBE9BDBEDFFFFFFFFC000CB0EB0FADADAEBCA9FFFFFFFDFFFFBFBFFFFFFFFFFFFFFFBFFFFFFFFFFDFF9FBFFFFFA0F0CFBDFEDFEFBEBEBFADAF9EBCBEDADACF0EBF0EDAE0F0BC0B090A9A000A00900A90A9CB0AE0BDAF0FADAADB0EF0BCAADA0E9ADFEFEBFAFFFFFFFB00A9ADB0FADAFADBCA9EFFFFFFFBF9FFDFFFFFFFFFFFFFFFFFFFBFDFFFFFBFFBEDFFFFFF0F0FB0FADBE9FBCFDBCFDADFADBFCBBCBDBAF9FCFB0F9F0F0BC00A00C90A9C9A0A90A9C0A0E90F0E9FACB0E9AEF9AFCBC9A9A9EFEBFBFCFF0FFFFFFC000ACA0F0FADADAE9AF0FFFFFFFFFFFBFBDBFFFFFFFFFBFFFFFFFFBFFFFFFFBDBFBFFFFFF0B0FBEDADBE9FBEBEBEBFADBEDABCE9EAD9EBABCFBCB0F0F0B090B0ACBCA0A9C0AC0A0B090A00B0ADB0E90F9ACF0B0BAC0ACB0B9EDEBFAFFFFFFFFB0090BCBEBCBEBE9EBCAFFFFFFFFFFBFFFFBFFBFFFFFFFFFFFFFFDFFFFFFFDFFFFDFFFFFF9E9EDADBFEBDACDBCBDBCBDADABDE9BE9BAF0FDEBF0FADAF0BCACAC9A9A90BCA0B0B09000E090BC09A0F0A0ACBA9E0E0CB0DA0FFEFBFDEF0FBFFFFFE000A0BCBCBE9E9E9CBDAFFFFFFFBDFDBF9FDBFFFFFFFFFFFFFFBFBFFBFFFFBFBFBFFFFF9EB0FBFFFEBCBEBBAF9EAF9EBEBDEBBEDACF0F9EBF0FADAF0BCB09A9ADADAFC9ADAC0F0E0B09A00ABE0F0A0DA9AD0A9A0B0A0BDE0FBEDAF9FFFFFFFF00A0C9EBCBE9E9EBEABEBFFFFFFFFBFBDEBFBDFFFFFFBFFFFFFFFFFFFFFBFFFFFDFFFFFFE90FEDFEBDFBE9FCF0E9F0EB0FDABDE9ADB0FBE9F0F0F0BCBCBCA0DACADAF0BEDA9AB0A9ACA00E90090A9CA00E00F00D0009E0ABF9CBEB0FAFFFFFFF9009AB0FADAFAE9E9FCFCFFFFFFFFDBFBFDBFBFDBFFFDFFFFFFFFBF9FFFFFFF9FBFBFFFFFFA9FBFDFFFDFFAF9FBE9F0DA0ADABCFAADB0CBEBFAF0F0BCB0BCB09B0F09E9ABCBC9E9E90BCB0A9E0F0A90A90B00A0A0F0A09C0AAF00FACB0FFFFFFE0000CBCBE9CB0F0EBABFFFFFFFFFBE9FBFF9FBFFFFBFFBFFFFFFFDFFBDFFBFFFE9FFFFFF0DADEFBEFAFBDFFEFFDEFBADBDAD0B0D9ACBBDBCBDBCBE9BF0F00F0E9AFA9EDABCBADA9EBCB0E9E9AB0F0A90A00B09000009A0BC90AD00B0FFFFFFFF000A9EBCBEBCFAFBCFCAFFFFFBDBFDBFDF9EBDFFBDFFFFFFFBF9FBFBFFBFFFFF9FFFFFFE9A9FBFFFFFFEFEFBDEBF0FCB0EA9EBCBAE9BCBEBCBEBCBCE0F00B0A9ADADE9A9CBCF0BE9CA9E9A9AF0F0BC0BC9E00A0A000000000A000B0CBFFFFFF000BCAB0F0ADABCBCFAB9FFFFFFFFBFFFBFBDBFBFFFFBFFFFFFFFFFFDFFFFFFDBFBFFFFF9E0FEFCFFDFFFFFFFFFFFFBFFF9FFADAC09ACB0BDADA9E9BBDA9AC9EBCBCB0F0FADA9AD0BA9E9ADAD0FAD0BCA0A9AD0D00B0A0900090A000A9FFFFFF00009C9E9ADAFCBEB0FCAFFFFFFFDF9FFDFFFBDFDBFFFFFFFFFFFDBFBFFFFFFFFFDBFFFFF9A9BFBFAFADFF9EFBDEFDEBCBF0FDBFBF0F9EDAF9ADA9ECBE9E9A09A9EBCB0F0F0F0FAF0F0BCB0FAF0FAF0BCBDA0A0A900C0000A00090090AFFFFFFF000A0A0ACA9ABCBCB0BCFFFFFFBFBFFBFBDBDBFBFFFFFFFFFFFBFFFFFFFFFFBF9FFFFFFCBC0F0FFFFFFAFFFFEFBFFFFFFEFFAFCBCB0A9A9E0F0BCBBCBCBC0F0F0F0BCBE9AF0BCB0F0BCB0F0BCBDADACBCA9E9E9EB0B0B0A90A00A0009FFFFFFA00A9CB0DA9CBCBCBCBCBFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFB00BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0F0BCBCB00B0B0F0BCBCB0F0BCB0F0BCB0F0BCBFADA9A9A9E9A9A00000000000000000BFFFFFF00000A00A00A00A0A0A0A000000000000000000000105000000000000D4AD05FE,'Michael is a graduate of Sussex University (MA, economics, 1983) and the University of California at Los Angeles (MBA, marketing, 1986). He has also taken the courses "Multi-Cultural Selling" and "Time Management for the Sales Professional." He is fluent in Japanese and can read and write French, Portuguese, and Spanish.',5,'http://accweb/emmployees/davolio.bmp') +GO +INSERT "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(7,'King','Robert','Sales Representative','Mr.','05/29/1960','01/02/1994','Edgeham Hollow +Winchester Way','London',NULL,'RG1 9SP','UK','(71) 555-5598','465',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00FEDECDACFEFCEADE0ECECBCE0CEFEFECFFEFCFEEEDEFEFEFCDEBCEFFEFCFEDEFCFEFECFDEFFC000C0A0C0CE0EDFE0FCE9FDFCBF9F9FCFCEFCF0FC000000EFCE0CE0CE0FCBE0F0EDECACBCAECACEF0FCE0FCCACE9E0FEEDE0E0E0EEDACEC0CEDEFCACAECE0CAEDEECFCACFCEDEFE0EDEFECFCFEDFFEFFFCFEEECEEFCE0EFEDFEDEFFEDFEFEFE900000C9E9CADEFE0FCBDFCBDBD0FCF9F9FFDEFFCAF0000C0CADCAC0E9ECACCFCECACADECEDEFCF0EECACECAEDE0ECECEDACFCFCEDEACF0FEF0EEFACEDCADEFED0ECBCADEEEFAEEDEFEEFCFEEFEFEEFEFEFEDACBCF0EFEDE0FEFEFECFEEFEFFF00C0CE0EC0EDEFACFCBDBCBDFE9FDB9E9E90EFFCAC0CA00C0EFCACCECEC0ECACE0FCEDECBCAC0E0ED0CEDEBCDE0FCF0E9EEFEE0E9E0DE0ECACEFDFCCCAFCEECFEEFCECECE9ECFCFEFCE9EEFEDEDEFDEFFFEDEDECEEFEDFEFEFEFFCFFEFDEFDEFF00000DE9ECEFEDE9EDADFDAF9F09EDF99CF9EFFFCAC0900CC0EC0E9CACE9CF0EC0F0E0ECFCFECFCEEBCACCEACECACECECFCBCFCECEECFCEDEDEEFEBCECBC0FCFCAF0F0ECEDEEFCFEFEFEDEFEFEFEFFEEFFEACEFCFCEEFFCFEFCFEEFEEFFEFFEFB0C0E0F00DEBCE9E9FDADBDCF0F99ADEB90D0FEFFDECA000ACDAC0ECDACE0EC9ECECFCFE0ECBECADCECEBCCE9ECECADEACECFACBEC9EE0FCEADEF0CEFECEFEEBEFCECEDACAEDEAFCEDECFEDACFEFEEDFEDFCE9EE0EDFEEFEDEFEFDEDFEFFEFFF00000C0CFEFCDAD9E9EDBCFBDF9CBD99C9F0FCFDEFBCC000CCACFC0EACCACCACCACAC0E0FCECCBCEADACCE9ECE9E9ECEDEFEDEFCCBECDEEBEDEFFCAC0CEFEFDECCCAC0EECEDECFCFFEFFEFEFFEDEFFFEFEAEDEECFEFEEFFFFEBEDEEFEFFCFEFCF000CAEEDEBCBC9E9CBDADBDE9A9C9CE9E09D0FEFCFE9A00CACF00E0CCADCADEADEDEEDECE0FEECFCECFE0ECE0ECECF0ECADEECFEECFAEDEDEFEFFCBCAC0CEEFEBEDEF0CBCAEFEFEEF0EDEDECFEFEFEFDEDCAEDACFEFFDEFEFCFEFFFEEFFEDEFFBC00CDFAFCBDAD9CBD0FDCBFDF90A99C9FCBCBCEFCFED000CACECCEDACE0E0CCACAC0EDAFCAC9E0E9E0DECACFCACACEDEFEE9E0F9EECFEEFEEDFFFEFCBC0C0CECEACEFECECCECEFDEFEEFEFEFEFDEFEFEEFCCECEFFCFEFEDEEDEECFFDEFFFEFEFBC0EEDCBC9C9E9D0FDAF9CBDAD9C0BD090D0D90EE9EFE900CBCBC0EC0CECE0ECECFE0ECECFECEFCECEACEDE0ECFCE0ECE9EEDEEEDEF0FCFFFAFFEDFEFEFBCAD0CCE0EDF0FACFFEEFCFCFCEDEDEFEFFEF0EEF0EFDEFEFEDEFFEFFFEFEFEFEDEFFC00CB0BC9E9E9E9F09D9EDDADBC90C0FCF0F0E0DCEDEF000CCEC0E0CE0C9CECBCACCFCBCBC0F0CACADCE9CACC9E0FCFADECFECFCEBCEEFEB00FEFEEDFCFCEDEECA9CCEEECCFECEDEFEFAEFEFEFEFFEDFEDACEFFEFFFEFFEFCEFCEFEFEFCFEFFEFFCE0FC9E9E9CDBC9E9E9FADF09A90B9090D099CAFEEDA900EF0E0CE0CACE0DECFCBEECECEECEECDECE0CECFAEECE0ECEEFACBCEFCEDFFB000FFCFFEEFEEFEE9FCEF0C0CFE0EFFEFEDEDE0FEFEFFEFE0ECEDEFEFEFEDFEDEFFEFFEFCFFEFFFCFEFF0D09E9D0F9ACBD0F9E9DE9F99C9C0DAD0BC09C0CFEF00CECFCE0C0ECACEACACEED0EDAC0F0DAE0E9EACACC0CBCECFEDEDEEFACFFEF0C0E0FEFECFFCFDEDEEEFCEEBCE0EDEEDEEFEFEFECFCFEFFFFECBCEFEFFFEFEFEFECFFEFCFFEDEEFEFEFCAF0F0DADBCF9DADBC9F0F9E9E0909A0DAD09E00E0CFEB00CFAD0E0C0CC0DEDEF0EEFCACECCECCECECCCFCACECCACBCF0EEDECFCEFFEB000EFFEDFECBEEBEFDECBEDEE9C0ECFEFDEFEDEDEEFEFEDECFECEFCFEFCFCFEDEFFEDFEFFEFFFFFCFEDAD0D0F0DAD90F0D0DBC0F09F09DA00D0090F0909CEFED000FEDEC0CACACECACECED0CACDACACAC0F0E0E0ECACACFCEEEFE9E0FEFFBC90E0F0FEFEEFFEEDEDAEEFEDEEDEFE0CE0FEEDEFEEFCFEFFEFFACEFFFEFEFFEFEFEFEFEEFFEFEFEFEFBCADAD0F0DE9DADF9E9F0DBD9FC9F09C909F0D0900CEFF0CACFEF0E0E0C0CE9ECF0F0ECACEACEDACCE0ECE0EC0CCE0E0FCBCFCEFEFFACA0E0E00FCFCFCEDFEFEDEDECE9EFEDEF0ECEFFEFCADEFEFEFFECF0FEFEFDEFEFCFEFCFEFFFEDEFCFEDECFC0D0F0DBC9E9E0D9F0DBC9E99F0F0BC0000B0C9000CEFFCFE9EF0C0C0E0CEDACECF0EDACCCACCE0EC00CC9EDEBCFCFEFCE0EFDE9E9000000A0FFEFAFEEDECFEFAFEFEDEFACFE9E0CEFEFDECEDEDEFFECEFDEFEFEFCFEFCEFEDEFEFFEFEFFEFCA9CBC9F0F9F9F9F0F0F0DBC9E0D90D09B0D0C90A900FCEFFEFECCFE0E0CE0ECFCACAC0ECA0FCAC0C0ECEBEECACCE0ECCACFFDEFFFA0A00A0000FEFCFCF0EF0ECEDEDEEFECFFECFEFCACFEEEBEFEFFEF0FEFEFDFEDEFEDEFFEFFFEFDEFCFCEFCB0C9CF0DF9EF0FCBDBD9F0D0F9F9E9A9C0D009A90C000EDEFCFCBE0C0CCACEF0E0DECCE0CCEC0C0EFE0C0CC0BC0E0CCBEFFEFEFEA00000000000FFFEEEFEFCEFE9EEFEDECBCECFEDE9C0EFFDEDEFFEFCEFCFEFEEFEFCFEFFEDFEEFFEEFEFEFCF0F9EB9DEBCF9DF9F0F0F0F0F9C9E9C9CA90A900C0900CEBCFEBEEDE0CA0CE9CE0EE0E00CCAC0E0EC0C0E0E0ECEECFFEFEDEFCFF0900000000000FCFFFDEDEEFCEEDE0FEFFEEFEFEFEFFFCCEEEFEFEFFEFEFCFEFFEDEFEFCFEFEFDFEFFCFEDE0909C9DEBDDB0FADE9FDBDBD99E9E9F0F99C900D0900000CEEFDEDECAC0CE0CEACC0CC0ECA0C0ECE0CACECEDEDEDAFE0FCFEFEF00A00A000000000FACFEFEFE9EF9ECEFCEEDEDEDACFCEEFAF0DEEDEFEDEFFEEDFCFEFFCFEFEFEDEFEFCFEDEFBCBCADADDEBCDFDDBDE9E9E9EDAD0D09D0F0B0D00A0090000DCEFECBEDAC0CFC0CACE0EC0ECEEC0C0CACBCBCE0E0EDEDEFECFCFEB00A000000000A0FCF0FFEFCFECEFE9CEDAEFEFEFFEFFDEFCECADEFFEFEFCFFEEFFFEFEFFEDFEFFEFEFEFFE009C99FDBE9DBF0FADF9FDF9F9BDF9ADADB0D0DA90D090000CEAFCADECEC0CACACC0C0E00E0C0C0EADEDECCECADECEEFEFCFFEBA0A0A0000000000C0FE900EFFFECFFEDEFAEDEDEDEDECFEEFFEF0CEEFEFFCFEFEFFFEEDEFCEFEEFFEFDEFCFE09FCBCFCBD9FFEDFFDFBEDF9EF9ED09CBC90D0F09C000000000EDCEFE9E90EEDAC0AC0ECDECC0E9EFCCACADACBCECFADEDEFEAE0000000A000000000AF0F0000FEFFECFAECFCEEFEEFEFFCFFEFFEFF0CCFEFFEDEFCFEDFEFEFFCFFFCFFEFEF0C9C09CBDBDEFE9FBDFBDFDBEDBCFDBDE9D9ADBD0F09090C00000CEBCFCECEC0C0C0CCECF0E0CADCE0CBEDECECECEDAEDEBEDAFC9A0A0A0000A00B00A90BE0A000CFEFFFCFEFCFDECF0EFEFFEDEFCFEDEACCFFEFEFFFEFEFEDEFEFEFEFEFEDEEF9A9CBDEDEDBDFFDFEDFE9FDBFDBDADB9E9CDADAD0F0CA90900000CE0EF0F0FCACACA0CA0C0E0EE0FECCAE0F0E9E0ECFECEEFCAA0C9000A0000000A00A0F09000000DFEFEFCAFEAFEEFEDEFEFEFEFEFEFD0EFEFEDEFEFEFCEFFCFEFEFEFCFEFD00D0FCBDBFBDFBCFFBFFFFFFDEBDF9FCF9FA9D0DAD0990000000000CFE0FCECAC0C0CCACCACECD0EC0FEDCFCEDECFCBC0FFCEA9C0A0A00000000A009A0AF0A000000FEFFEDEFFCFCF0FCFEFDEFFCFCFEFFEFFFCFEFEFCFEFFEEFEFCFFCFEFA90E9CBCBDEFDEFFFFFFDFBDFBCFBDE9E9F9F0DDADBD09F0009000000CE0CFCEAD0CACACACCADE9E0EDACE0CEACE0E0E0ECFECA9000BC0000000000000A090FF0C0090009EFFFECEFEFEFEEFEFEFCFEFEDFEEFFEEFFFEDFEDEFEDFEFFEDEFEFCFC09E9FDFF9FFDFEDFFFFFFFDFBFDBDBDF0F0DB09E9CBC0AD0C090000ACFEE0FCE0C0CCCCADE0CECE0ECBCFACCBCCFCECFEF0B0A0A00A900000000000000A0FEB09A00A0000AFFFECFCFCFFEDEFEFEFEFEFDEFFDEFEFFEEFEFCFEFDEFFEFEDEF0BC90F0F0FFDFBFFFFFFFFFFFFDFADFCBDF9FBCFD9E9DBD9090000000C0C9EF0E9E0CAF0FCACE0F0EDACE0CE9ECAE0CFE9EACA0900AC0A000000000000A000FEDA000090000ECFEDEFAEFECFEEDEFEDFEFEEFEFEFEFDEFDEFFFEFEFFEFEDEFE09C9EFCFDFFEBFFDFFFDFFDFFBCBFDBDBDADAD0B9AC9AD00F0E90000000E0ECECFCC0ECCACACDACCEC0CE0EC0ECADCEFE9E90000A0900A00B0A0A00A0A00000F9A000900000000EFFFEDEDEFFEFFEDEFEDEFFFFCFFFEFEFEFEFEFEFFEDEFEF090D0F9DBFFFFDFDEFFFFFFFFFDFFFDBDEDADBD9FC0D9FDADF9090090000CC0E0FCACACFCACEDCAC0E00CE0CC0ECADEEBCB0A0A9000000A09A000000000000000BE90900A00000000EEFFEFEFEFFCEFEF0EEFCFEFFEDEFEFFEFFEFDEFEFEFCFE9CBCBCFEFDF0FFFFFFFFFFFFBFFBF9FEB9BDBC9E99F9E90F09AD0D000000CACFCADEFCAC0DE0CACEC0ECE0EF0E9ECECFDA000000AD00E000A0A0A000A0E0F0B00F0A00A090000000000CFEDFEFCFFFCFEFDEFEFFEFFEFFFCFFEFFEFFEFFFEFEDA0D0F9FDFAFFFFFFFFDFFFFFDFFDFF9FDEDADBF9E90F9ED9FC90B0B000000C0CFCAC0FCACACFEC00EC0E0D0CECECFFBE0F0A000E0AF009A000000A00000A00000F90009000000000000ACFEEDEFEFEFEDEEFCFFEDFEFFEEFFEFFEFEFFCFEFED00DADCFCBFDFFDFFFFFFFFFDFFFFFFDEF9F9F9C9E9E9D09AD0BDE9C09000000EE0EDEFCADECE0C0EC0AC0ECEC0FEB00C0FA0000ADFC9EBE0A0B0A000000000A0A000090000000000000000EFFFEFFEDFEFEF0FEFFFEFFEFFFEFFEDFFFEFEFDE90DADBFFFFFFFFFFFDFFFFFFFFFFF9FBF9F9E9E9E999DA9ED9BC09909000000EC0CFCACADE0C0C0EC0ECCF0E0EFE90000A00000AC0A0A00009A0A000A0000000009F000000000000000000000EFFFEFEEFFEDEEFEFEFEFFEDEFEFFEEFEFEDEE00E9DEDEBDFFFFFFFFFFFFFFFFFFDFFDFDF0F9F9F9ECF09C9BCDBDBCBC900000C0FE0ECFCE0CE0E0CAC0DACECFE900000000000000A000E0F0A0000A0000000000A0AB000000000000000000000ACFFFFFCEFEDECFFFFFEFFEFFFEFFFEDFFEDF9C9E9FBDFFFDFFFDFFFFFFFFFFBFFBEFBFFDBDAD09990F0BC0B0DAD909A900000C0ECBCAFCAC0CCE0CEECECFFCB0000000000000000000000A0BA0000AC000000000D00000000000000000000000ACFEFEFFFFEFEFEFEFFFEFFEFDEFEFEFEFE00DADFCFFFFFFFFFFFFFFFFFFFFFFDFDFFCBFEF9FF9EDB9CD9F0F90BCBC9000000EC9CECFC0C0E0E0ED0CEFB00000000A0A000000000000A0E90000A0AC0A00000000A0000000000000000000000000EFFFFEFEDEFFFEFFFEFFEFFEFFFFFEDA90DADEFFFFFFFFFFFFFFFFFFFFFDFFFFBFDBFDF9F99E900DA9A0D90FD9C9000000CC0EEDACACAC0F0CCAEFB000000000C0000000000000000000A00A0009A0000A00A09A000000000000000000000000000EFFFFFEFEFFFEFFEFFEFFEFEFEFE90DADFDBFDFFDFFFFFFFFFFFFFFFFFF9FDFFF9F9EDEF9F9F09C9DACF9A0BCB900000ADC0ECF0CCACCCAFCF0000000000A0A000A000000000A00A00A090ACA0000000000E9000000000000C0B0A00000000000EFFEFFFFFEFFFEFEFDEFFEFFDEF00D0FAFDFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFF9F9F0F09F0BC99B0D9C99C09000C0E0DADECACCACECFA90000000000C090A0000000000000000900AC90CBCA000A900BE000000000E009A0000000000000000EFFEFEFFFEFFFFFEFFEFEFEF00DAFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF09FF9F9F99E99C9E9C9ADBCA99000000C0ECEBC0CACFAF00000000000000AC000000A00000000A0A00000A000090A90000F09000A0A0E9CB00000000000000000C9EFFFFFEFFFFEFEFFEFFFEF09E9EDFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FDF9FFF0F0FC9E99E9A9C9AD909D9E00000E0EC0FC0DEEDAD0000000000000A000A0E0000000000000000A00000A00A0000000FCA00000000A00A0000000000000000A0000EFFFEFEFFFFEFFEFEDF000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF9F9FBDB9F9F090D0BC9BCBDA099000C0C0CEACEE9E90000000000000000A0AC000A000000000000A00A0A0000000000000AF0000000A00A000000000000000000000000CFFFFFFEFEFEFFFFEA9CBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDAFF9E9DADA909F9E9C9BC9909DBCB0000C0CBCDE9E9000000000000000000000A0A000000A000A000000000A0E0000900000FE9A000000000000000000A00000000C0A0000FEFEFEFFFFFEFEFF900DFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFBFF9FE9FB99F9F09090B0C9ACBCB0909000ACACEA0A0000000000000000000A0AA00000A0A000A0000000A00AC090A00000000FA00000A0A0A00000000A000A0000A0A0C0000CFFFFFFFEFEFFFFC0CFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FDF9F99F9C9E0D09ADAD0D9AD9D90DAD0000C0CCAD0000000000000000000000000000A000000000000000000000A0900000000FF00000000000A0A0000000000000000A000A00CFFEFEFFFFFEFCB9ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFBDB0F90BC990BC9090B00900BCBD9B000C0E0FCA000A000000A0000000000A0A0A00000A0A0A00A000000000A00A00A000000FEB0000000000000000000A00000000C0A0C0000CFFFFEFEFFFEF00CFFFFFFFFFFFFDFFFFFFFFFFFFFFFFDFFDFDAF9F9E9DBCBC9BCBC9DBC9BC090AD09000C0CE0E000009A00000A0A000000000000000000000000000A000000000000000000FBC00000000000A0000000000A00000A00CA0009EFEFFFFFFEFFE90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBF99EDADBE99DB9C9DBDAD9A090C9D0F000C00E0DA9A00FAC9A0000000A000000A00A000A000A0A00000000000000000000A000FEB0000000000000000A000000000000C0B00E00CFFFFFEFEFFE90FFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFBDBC9EFDBDF9DBDADE9FBC9F9FC99E900A990C0ACCFA000CFAC9AC90A00A00000000000000000000000A00000000000000000A0C0AF000000000000000A000000A00000000AC0E00A00EFFEFFFFEFCE9CFFFFFFFFFFFFFFFFDFFFFFFFFFFDBDBDF9FF9FADF0FF0F9B9F0DFE9E99F090BC9C0000CAC0CA00A0CBE90A0CA000000000000A00000000000000A00000000000000000A00FFB000000000000000000A00000000000A00E0CA09CFFFEFFFFF90FFFFFFFFFFFFFFFFFBFFFFFFFF9FFFF0BCF0FFDFBFF9FFFCFDBFBDBDFF9F9E9090B090C0CEB00A00A000A009ACB0A0A0000000000A0000000000000A00A0000A00000000A0B00000000000000000A000C0A000000000CA9CA9CA0EFFFFEFEB0EFFFFFFFFFFFFFFFDFFFFFDFBDFFF90FFDBFFFDBFDFDFF9FBFBCDFFFFBCF9F9DBC90D0C00F9000000000009A000000000000A00000000000000000000000000000A00000A00F0000000000000000000A0A0000000A000A0EA0CADADFFEFFFFC9CFFFFFFFFFFFFFFFFFFFDFFFFFAF0FFFDBFFDBFFFFBFBDFFDFDFBE9FDFF9EBDA90BCB0B0EC0000000000000000A000B000A00000000000000000000000A00A00A0000A00000AD000000A00000000000000A000000C0A00C00DA0000CFFFFEFB0FFFFFFFFFFFFFFFFFFFFFFBFF9FDFBDBFFDFFFFDFFDFFFFFFFBFDFFBF9FFDDB9F9D09C9CCB00000A0000E0ACB000A000E9000A0000000A000000A000A00E90A000000000000FADA00A000A00000000000000A0A0000DA00ACACB0000CFEFFFE9CFFFFFFFFFFFFFFFFBFFFFFDBFFBDFFFFFFFFFFFFFFFDFFFFFDFBDFDFF9FBFDE9A9F09A9A9000000000A0E9ACB0000A00A000000000A0000A00000000000E00000A000A0000FFA00000000000000000000A9C0000A0A00A000000A000FFFFED0EFFFFFFFFFFFFFFFFFDFBFBFFDBDFFDFFFFFFFFFFFFFFFFDFBFFFFBFF9E9F0F9FDB0DAD0D000A00000A0CBCE90A00A00A00A00A00A00000000000CA000CA00A0A0000000000FA00000A0000000000000A0C00AC0A00000000A0A00000EFFEFB0DFFFFFFFFFFFFFFFFFFFDFDFFFFFFBFFFFFFFFFFFFFFFFFBFDFFDFDF9FFFDBDBF9ADB99CB00000A00000ACA9A00000000000CA00A00000A00000A00000A000000000A000000FF90A00000000000000000A0A00A00C000000000000009CFFFFC00FFFFFFFFFFFFFFFFFFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFDFBFBFFDBDBDBC9FDB0DA90D00A000000000AC0A00A00A000A00F0000A000000A00000A0000A0000000000000FCA000000000000A000000000A00A0A0A000000000A000A0DEFFBCFFFFFFFFFFFFFFFFFBDBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFDBFDBCF9FF0F9F0DB09A9000000A0000A000000000A00E00A0A000A00A000A00C0000000000000000000AB0000A000000000000A00000000000C000000000000A000EFFED0FFFFFFFFFFFFFFFFDFFFDFFFFFFFFFFFFFFFFFFFFFFFFFDFFFDFFFBFDBFF9F99F9F99BC9F000A0A0A00A0000A00000AC00A00A0000E000A000000A000A0000000000000000F00A00000000A0E0A00000000000A0A0A0000000CB00000CDEFF0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FDBE9DBDADBCBCBCB909DA000000E000A0000A0ACA9A0A000A0A0A0A000A00000A0000000000000000000E0CA0000000C0AC9A000000000000000000A90A0C0F009A0FEFE9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FDFF9F9DBF0F9F9BDB99DADA09000A0A00A0000000000EA000A0000000000A00000A0000000A00000A000000B9A0CB00000A0E9A000A0A00000000A000A000090B000A00ACFFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBF9F9FBD9F9FBCFDADAF099DAD0A00000ACB0A0A00A0000A0000A0A0A00A000000000A00A000000000000000E000AC0A000000A000A0000000000A0000000000A00A0000CBCFEBCFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFDFFFBDF9F9F0DAF9F9CB9BDBD9BDA990B0000A000000000000A0A0A0A0000000A000A00000000000000E0A00000000B00AC0B00000A000A000000000000000A00900A000000000ACAFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FDF9E9F99F999C9B9FCBF9ADA9C9E900A000A0A0A00A00000000000A0A0A00000000A000000000000A000000000E0000AC0B0A000A00C0E0A000000000000000000000000A00ADCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FBDBD9E99F0F9FDCB9D0BDBD9B09D09C00000000A0000A00A0A0A000000A00000A00A000000000A000A00000009A0000AC000000000A900000000000A0000000000A00000000A0EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FBD9F09D0B0B9DEBDDADAD0F0B0A0B0A000000A0A000000000A00A000000000000000000A0000A000000000E0000000A000000A00CACA0000000C00000A000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDBF9F999F9DB99D9D0B9DABDBDB999C9D000000A000000000000A0000000000000A0A000000000000000A000000090000A0000A0000000A009000000E0B00000CA00000A0000000A0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBD9D90DF0B909DA90BD0F9D9E9F09E9F0A00000000A0A0000000000000000000000C0A0000000000A0A000000000E0A0000A000000A0AC0F0ECB0A0000EB000A0C00A0000000000009CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBDBF9FDB9D9F9F999D09F09EB9F9F090099000000000000000000000000000000000A90000000A0000000A00A0000B0000A00A000A00A0A000ACE9000A0C0E9C09A0C0A0A0A90A00000AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDFFDFF9FDBDF9D9FCB99C9F99DADB9F9F90F0A0A00A00000A00A000000000000000000E0A000000000000000000000CA00000000A00000000EADA9E00000A000A0AC0B0C00C00000000ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFDBD9F9FDB9F0B999CB909CB9DBCF9090F090000000A0A000000000A0000000000A0000000A0000A00A0A0A000000B0000000000000A0A0A000E00A000000A00D00AC00B0A0A000A9E0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFDB9BDBF9F9B0D99D090990BDB9EBDF90F9F090A0A00A00000A0A000000000000000000E0ADA0000A0000000000A0000E0000000000000000A0A0A0A00A0000000A0AD00E0C00900A0000AEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFBFDBFDFD9D9FFFDFBE9B90DB0D09C99CB9FF9099E90000000A0A00000A00000A00000000000000000000000000E0A0000009A0000A0000000000000A000A0000000000000A09A0F00A000A009CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFDFFDB99FFFFFFFBDFFDEFB0D90909E9BDADBF9E99E90A0A000000A0A0000000000000000A00ACA0000000A000A00D0A00A0E9000A00000A00000A0A00A000A0A00000000A0DAC000E00E900A0AFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9FDFFDFFFBDBDFFFFFFFFFFFFFBDF9FB0009090DBDBF9E9F090000000A00A00000000000A00000000000000A00A00000A0CA0A00000B0000000000C90A000000A0A0A000000000A000A00B0E90E00CAD0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD9DEFFFFFFFFFFF9FFF9EB9E9900009DBC9F9F990DADA0000000A000A00000A00000000A00ACA0A000000000000A0E00CA00E00A0000A0A0A000000A000000A0A0A0000000B0B0000CB09EB0ACBFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F9FBDF9DAFBFFFBFFFBDFFFBDB9B9C99CB00000099E9E9F0F90900000A0000A000000000000000000000C0000000A0A00000CADA90A0DB00000000CADA0A0000A0A0A00000000A000A0A0A000ACAC9CB0ACFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEFDFFBF9DFDBFFFDBFFBFB990D0D0900909000000B9F9FDB0F9F0A0A000A000A0000A00A00ACA000000A0CAC0A0000000000ACACA000EACA00000000000000A0900000A0A0A0A090A00000000000A0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB9FF9009EFBDFF9BD90D9CBD9B9B909F0909090090D0F9B9D090900000000A000A0000000000000A0A000A00B0000000000A000AC9A0F00000A0000A0A000000A00A0A000A00000A00000000A00B09000F0FFFFFFFFFFFFFFFFFFFFFFFFFFF9BDF909090F99FF9F9DBDBDBDB9C9D0BD090D09A99000B90FDA9ADA90A00A0000A000000A000A0A0A0C00000CAC09A00A0000000A00A00EBE0E09A0A0000A000000000000A0000A0A0000A000000000A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFBFDB0F900009F9F9F9FBDBDBDBDFBF9FDB9DB9BD9D0D99CBD9BD9C9CA000000A000A000A000A00C0000A0000A000E0CA000A0CA00000000FCB00E009000000000A00A00E009E9A0000A9A090A0000B000B00ACFFFFFFFFFFFFFFFFFFFFFFFFFFFB9DB99BD9DBDF9FDF9FFFFFF9F9DBF99E9E9C9ADA9A0909AD9B0B9900A0000000000000000000A0A000A0A000A00EADA0C0A00F0000000FBCEB0F0A0A00000A000900F0BE00A00A0B0000A000B0000900000FFFFFFFFFFFFFFFFFFFFFFFFFFFF9DB9CBDBFFFFFFFFFFFFFDBDF0FBD0FBDB9FB9DB9D9990F99E9D9E9B0000A000000000000000A0000A000000000A0CA0F0AC0E00A00000FCB00C0A9C9000009000A0F0AC00B000900E0A000B000A00A00A0FEFFFFFFFFFFFFFFFFFFFFFFFFFFB9A9CBDFFFFFFFFFFFFF9FBFFBDBC9F9C99E9DCB0DBCBCB90F9F9A9C000A00000000000000000000A0000000000000A9E0E09A0A0000000AB0DA9AD0ACA00A00A90000E90B0000A0A09E900000A00900B0900FFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9BDFFFFFFFFFFFFFFFFDF9DBD9B099E99A9B9DA9909C990F0D9CB900000A0000000A0000000000A0A00A000000000000A0C90A000000DEA0000A90B00000000A0000A000A00000E00EB0A000F0A000ACBCEFFFFFFFFFFFFFFFFFFFFFFFFFBDB0BD0BDFFFFFFFFFFFFFBFBFBDAD99A0909D09CBDADB9BCBD9B0B90DA000000A090000000000A0000000000A0A00A00A09CA0E090A0000A90000000ACADA00A0AC0B00000000000A0AD00009AE0E90A00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF990FFFFFFFFFFFFFFFFDFDBDBDB9C990F009E990990D0990FDBD0F0900000000A00CADA000000000000000C000000000A00F0A0000000F000A000A909A00000DAF0000000000A09C0A00A0AC9EBCA00A0AFEFFFFFFFFFFFFFFFFFFFFFFFFBDF990FF9FFFFFFFFFFFFBDBFBDBDBD0B909009909E9F0F9B90F9090F99000A00A0A00E9A00000AC0000A0A00A00A000000AC0E00000000009A00900900A0000000AC0A09A0000000A0B00A00000E0EA900000CFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF990F9FFFDFFFDFBDFBD9DBDBFBD9E9099E090909909CBD9F9F990F090000000000AC9A0A000ADA0900000A0009000000B0A00A0000E0E9A00B000090A900000AC9A000A00000000E009A00A0EDEEB000A0FFFFFFFFFFFFFFFFFFFFFFFFFFFDBDF999F9FFBFFBFFFBD9B9BDFFDBF9DB9C990DA99E9F990F90F0F9D0B0F0A00A0A000AA0000A0000ACA0A00CACA00900A00000000B0E9EB000000B00000CA000090A00A000A0A0A0A90E00000CA0E9E9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F09FBDFDFFF9FDBFFDFFBDFF9FBDA9AD9BD9C9909E99EDBD9E9BDD0000A0000A0000A0A00A0A0090000A09000A0000000A000C0CACA09A0F00000ADA90000A00CF0E9A00000900E9A0A00A0E9ECA0E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFDF9F90DFFBFDBFFFFFFFFFFFF9FBDBD9D9BCB09A09E99F9B9DB9F0D9A9A00000000A0A0000A00000E0A0A0CA0A900C0EABC90A0A0ACFF0000090A000A000000000A0F0E00A0A0A0B0AC9090000A0BCB0CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBF9F9A9FDBFDFFFFFFFFFFFFFFDFF9E9AD9BF99DB9DF0FDFADE9DABD0000000A0A00000A00000009000C0BC9C000B09C0A00000EDAE9A000ACB0F0C90A900000BCEFF0F000000A009A0A0A000000ADB9DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9F9F99AFDBFFFFFFFFFFFFFFFBDFBDBDBCD9E90DB9F9B9D9BDB9DCBDB000A0000A000000A0000A000A000A0ACB00A0BC9A00000ACFE9000DACF09A0AC0090A9CAF0FA00A00B00A0A000000A000FDBDFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9DBDFFFFFFFFFFFFFFFFFBDBDADBBF99FBCF9FDEBFDBDE9BDA00A0000A0000A0A000A00000A09A00C090E90000A0000A0CB0B00A0ACB00A000900AC9CAD0F09CB0CA00A90000A0B090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFBDBDBFBDFFFFFFFFFFFFFFBFDF9F9DBD90F0D9BCB9BDDB0F9BDF0B00000A000A090000000A0A900000A0BEE90F0009000000A0ECA0D0000A000000A900A0B0A0E0E0EB0E900A000000CADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FBDFFFFFFFFFFFFFFFFDFBDBC9E9E9F9FBFDBDFDBBDF9FDA9F00000000A000E9E9A00000000A00000C0FFE9A000000000000BDA0A0A000A00A0000900009E9ADADE9A0AC90A09A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFBDFF9FFFFFFFFFFFFFFFF9F9B99E9F9F9FDB9FDE9FF0FDADA90000000A000000000A00A00900000AC0EBE9A00000000000CA0000000A000D0B0A0A90000000A0A0000B0AD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDFBFFFFFFFFFFFFFFFF9FBDBC9F9F0F9E9BDF0F9FDBF9BDB0000000A000A0A0A0A000000A00A00009A9C9000900000A00AB000A00AC090A0B0C9C900A0A0A000000CACAD0A0CFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFDFFFFFFFFFFFFFFBDFBDAD9F0F9BDBDBDF9F9F9BC9FC9AD0A0000000A00000000000000000000A0000A090A000A000ACE9000000A0A090009A0E000900000A00A0F0FAF0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFFFFFFFFFFFFFFFFBDBDB09F9FDBDBDF0F9F9FDBF99F9AD0A0A00A00A00000900A00900900A9000B09A000A00000000FAB0A0A0E0CA0B0A0090A000E90A000000EEFCB00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFF9FF9BDF9F0BDADFB9F9F9EBD9CFA909A9090A00A000A00A0A000A00A0A00E9E9CAC9A0000000A0A0BD0000009EB000090B0090A000A0000A0ACBCB0CBFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFFDFFFFFFFFFFFFFFFFFFF9FDA9E9F9FDB9CF9F9F9DBFB99F909E0E000A00A000000C0B09009009E000A09A000A0000A0000F0A9A0A0E0009000000A0A00A0000A000CBEB0E9EFF9FFFFFB9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFF9F0B9F9F9F9B9FB9BD0F9FAD9CF09CB0B000A00A0A0000A0B00ACBC0A0000A00A000000A00000A0A90000000A90090000000000000A0000A000000ADFFFFFFFF9FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFF9FFFFDBFFFFFFFFFFFF9FF9F9D09E9E9C90D9CB9E9D9E9B9DA90000A00E00000A9090000909A90A0A000000A00000000A00AFE9A9A0A000A00009000000000000A000A0A0000FFFFF9FFBD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FFDBFF9FFBFFDFFFFFFFFFFFFF9F9A9F99F9B9F90B9099A999E9E99F9A000A00ADA090A0A0B0A0E0E000000000000000000000A00B909000000A0DA9A000000000000000000000A09FFFB9FDFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FF9FFF9FFFFFFFFFFFFFFFFFFBC9D0F990909090D9BC9DADBD9BC90000009E0A0A0AD000C0900909A000000000000000A00000AF0A00000A00DAC0D0000000000000A0A000A000CFF9D9FBFBF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFB9F9BDBF9FFFFBFFFFFFFFFFFBDBD9B0B90C90D0BC90BC99AD9D0BC9A9A0CA0E000000DAB0A9ACADACA00A0000000000000000A0A0A909A00000A0A9A0B000A000000000000A00000FFF9BDDFFDFFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBCBDBC9F9F9FDFFFFFFFFFFFFBDB0D9D0B909BD99BD99AD90B0BDB0D00B0CA00A000A00CBCADADA9000000000000A0000A0000000DA0000000000000000A0000A000000000000A00CFFF9AF9FFFFFFBFFF0FFFFFFFFFFFFFFFFFFFFFFFBDB9DBDB909B90F9FBFFBDBFFFFFFFFDBDB009009F099E9CBD09A99C909DB0F00A0CB000A00A0000CACACA0A00000000000000000A000A0A90090000000A00A00000A000000A0A0000A000FFFB9D9F9BDFFFBDB09DFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F9F9C9B909C9FDFFFFFFFFFBFF9099A99099F099B90BD9CB09F090D0F0CFACA0000000A0A0A0A00000A0000000A0000000000000F00A000000000000000A00000000000CA9A00CFFFF9D9B9DFFBDB9E90FEFFFFFFFFFFFFFFFFFFBFFF9FF9F9FDB9F9BD0999B9FBFDFFFFFFDF909F0C9ED9F0F9E9CBD90B0DB09E90B0A0A000A00000000000000A0000000000A0000000000000A0F090A0000000A0A0A000A000000A0A000C9CBFFFFBB9CB9F9FFDF9B09FFFFFFFFFFFFFFFFFFFFF9FFBFFFFFBFF9F99B9F09CBDBFFFFFFFFBF90099990E990909900090900D09E9C00000A000000A00A00A00000A0A0000A00000A0A0A00A000B0A000000000000000A0000000A0000A0A0A0CF9FFFDB990F09FBF0900DFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9E9CBC9099DBDBDFFFFFFF9F9F9000A990000000090000090B00909A0A00000A00000000000A000000A0000000A0000000000A0E900000000A0A0A0A000A00A0000A00000000FBFFFFF9F9999F9F9909CFFFFFFFFFFFFFFFFFFF9FFFFFDFFFFF9F9F9B9F9A99E9F9FFFFFFFFA90090D00000000000000C90909F9000000000000A0A00000000000000000000A00000A0A0A0000B000A000000000000A0A00A0000000A00A0DFBDDFFFFFF990FFF9CA90ADFFFFFFFFFFFFFFFBF9FFFF9FFBDB9909090D0909CB9F9FFFFFFFF9D9090000000900000C090B00F0D0000000A000A0A000000000A00A0000A00A000000A0000000A00A0000000000000A0A000A000A0A0000000A0EDBFFFFFFFFB9090B9900DBFFFFFFFFFFFFFBF9FFB999B0090000000009009090D0FFFFFFFF9FB090090900000000909E909090B9B0000000A00000A0A000000E90E0A00000000A000A0A0A00000DA0000000000A0000A0E0F00000000000000FFDFFFFFFBF9E990000900DFFFFFFFFFFFFFDFF9FDBE9DBD0900000000090B090B99FDFFFFFF9F9E900009E909ADBCB9090090D0C090000000A0A000000000000A000CA0000000000000000A0000A00000000000000A000000A0A00000000000E9F9FFFFB090900909000D0FFFFFFFFFFFFFBFFFFBD9FBDBFBD0900B00BC909099CFBFFFFFFFF99909090009CBC90900909BCB09B900000000000A0A00000A0A0C0A0A00A0A0000A00A0A0000A0000000000000000000A0A0A0000000000000ADF9FDBFB0D09009000009AFFFFFFFFFFFFFFFF9F9FFB9CFFDFFFB9D0D9090909E9FBDFBFFFDB0F0F9A90090009090909CAC00909C00000000A00A0000000000C00A0000000000A00000000A0000AF00000000000000000000000000000000000FBDFFFD99000900000000CDFFFFFFFFFFFFFFFFFFFF9F999F99FDFB9A909090F9DBDBFDF9FBFDB90D90090909009ACB0999990DA0900000000A000A0000A0000A000000A0000000000A0A00A0A00A000000000000000000A00000000000000000FB9DBF099900009000009AFFFFFFFFFFFFFFFFFF9FFBF9A9F0B09C990090F99BF9E9FBFF9F99FF9ADB90009090990DBCBCADB0900900000000A0000A00000A00A0A0A000A0A000A0000000000A0F00000000000000000000000000000000000F9DBF999E009A90000909ADFFFFFFFFFFFFFFFFFFFF9FFFDF9F9F9B09DBCB9AD09F9F9F9FF0FF09F990DA90000000909909900900000000000000A000000A0000C000000000000000A0A0A000000000000000000000A00000000000000000000E9BD9C9E99F9900000000CDFFFFFFFFFFFFFFFFDFFFFFDBFBF9F9FDBDA9990D09F0B0F9FF9FF9FF9F0F990900000000000000900009000000000000A00A000ACA0A0A00A000000000000000A00A0A00000000000000000000000000000000000DF9E9BDBDF9E9900000009AFFFFFFFFFFFFFFFFBFBDFFFFDFDFBDA909000090F90D9DBC9FFF9FF9E9F9F0DAD0000000000000000CB0000000000000000000000000000000A0A0A00A00A0A00A0CAB00000A0000000000000000000000A0000000E9990DFBF990009000000D9FFFFFFFFFFFFFFFFDFADBDFBB090090009090DA9E90F0FBF9FDFBDF9FDADB09099A90000000000090990000000000000000A0A0A0A0A000000000000000000000000CA00000000000000000000000000000000000FBDEFFBD90090000000000FFFFFFFFFFFFFFFFFF9DBDA9D090090090000009D9FF9FDFDFFBFDFBFFBDBFDBDAD09C900009000C09C0000000000000000A00000000000A0000A0A000A0A00A0A0A0A0000000000000000A00000000000000000000999990909000000000090FCFFFFFFFFFFFFFFFFFB909009E09C0F0BC9E9FFFFF9FFFFBFDFDBFDFBDBD0BF0F9FDB0D0F9E0909B0A900000000000000000000000B00000A0A0000000000A0000009E00A000000000A000000000000000000000000000090000000000000009FFFFFFFFFFFFFFFFFFFFDF9F99DBBD9FDBDBDF9F9FFDFFFDBFBFFBFDFFFFFFDBDF0BC9A9009D0F00C90000000000000000000A00A000A000000A0A0A000A000A0A00A90000A0A000A000000000000000A00000000000000000000000000000009FFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFBFF9FFFFFFDFFBFDF9F9FDADF9BD99F90B009090900000000000000000000000A000A9A00000000A00A0000000EA0A0000000A0000A0A000000000000009000000000000000000090000000DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFDFDBFFDFFBFFFFFBDB9C9A9E90C9090000000000000000000000000A00000A0000A0A0A0000000A0A000B0000A0000A000A000000000000A000000000000000000000000000000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFDFF9FDBDBD09BD0900B090009000000000000000000000000A0A0000A00000000000A00000A0E00A00A0A000000000000000A0000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FFDFFFFFFFFBDB09F09090909000B000900000000000000000000A0009A0A000A0A0A0000000A000009A00000000A0A00A0A00000000B00000000900000000000000000000000009CBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFF9FFF9DB09909A0C90900090000000000000000000000000A00000A00000000A00000000000E000A00A0A00000000000000A00000000000000000000000000000000000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFFF9FFDFDFFFF99B0909E909DB9000900900000000000000000000000A00A0A000A0A0A00000A00000000B00000000000A000000A0A0000000000000009000000000000000000000000BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFBFFDFB9F0D9F990DA900090C0900900000000000000000000000000000A000000A0000000000000A0000A0A0A000A0A000009A0B000000000000000000000000000000000090D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFDFFFBF9D099B09A909D099009A900000000000000000000000000A00A0A00A00A0000A00000A00A0F000A0000000000000ACA000000000000000000000000000000000000090C90AD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFDFFBB900090D09A99E90009009000000000000000000000000000000A00A000A00000A00000000A000000000A0000000090A0A00000000D000900000000000000000000009A9DBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFBFDFFBF9D90DB9DB90BC9A90090909000000000000000000000000A0A00A000A000A0000A0000000E0F0000A0A0A00000A000A0A0900000009000900000000900000000000900909DA9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFDFFFBFDF9A0DB9CB900D9909090000000000000000000000000000000000000A00A0000A000000A0A90AB00000000000A000A00000A09009000090000009000000000000000009E9E9DEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FDFFB99DBC9BDA9990A90000909000000000000000000000000000A00A0A0A0000000000A000000ACA0A000000000000000A0A00A00000000000909000000000000000000C0909A99DADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBF00BDBF09900F99090900009000000000000000000000000A000000C000A00A00A0000000A00B0000A0A0A00A00A00000000000000000090000000000000000000900900F0D9EFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF9FFFFFF99D9F09F9CB909AD0909090000000000000000000000000000A0000A0AE9000000CA00A00000A000000000000000000B0A0A00009000000000000000009000000000DAD9090FBDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFBDBF99E9E99F9A990F09090000000000000000000000000000000A00000E0CF000A09E0B00000A00AF0000000000000000A000900090000000000000900000000090000000900B0F0DEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF9F099BDA9C90909009A09090000000000000000000000000090A00A00BE0FA0C0E0E09A00000000A00000000000A0A00A00A00A00000000090090000000000000000000B09C90F9FBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBDFF9B0D0BDB9BDA9099090000000000000000000000000000000C0F000000E0DA9ACBCA00A000000F0000A00A00000000A00A00A00900000090000000000000000900000D09A90D0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFBDF9C9F909C909C9AC909090000000000000000000000000000ACA0A0A0F0EA000A0A9A000A0A00A00000000000A00A000A09A09000900000009000900000000000000000C000FBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFDBDFB0B9ADBDB9B909090000000000000000000000000000000CACBE090C00A9000A0000000A0000A900A000000000000A0000ACA00000090009000000000000000000090090909C9F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFBD90D909090DA90900909000000000000000000000000000A9E0FCE0B0ACA0A00000A0A0000A00EA000A0A0A000A0000000090A90000090C00000000000000000090000000CB0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDBDFBF9ADBCB9909CB09000000000000000000000000000000000A0A9AECB000C00A000000A000000B0000000000000000000A0A000000000090900000000000000000000000900DAFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBFBDF9F90999CA9099090900000000000000000000000000000A090CEE9A00A0A0A000A0A090A090A000A0A0000000000000000000000000000000000000900000000000009000DAFDAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFDFDF0F90DBC909DA90000000900000000000000000000000000C0ACAA9A0A00AC00000000C0A90A00E000000A000A000000000000A00000000000000900000000009009090000009DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFBF9FBDB909A900900900000000000000000000000000000CA0A000000000A00A9A09A00A9E9A00A0B00000000000000000000A0000000000000900000000000000000000009090CADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBDBDFBFDBDF0F909B00900090000000000000000000000000000CE9A00BCA0A00A0C0CA00000A0E9E900CA0000000A0000000A00000000000000090000000000000000009000900000BDAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFFFFBD9BDB09909C090009000000090000000000000000000009A0AC0A000000A00A0ACACA900EDA9A0AA000A00E090A0000000A000A00000000000000000000000900000090000090D0FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FBDFAF0F9F0B0090090000000000000000000000000000000A0C09A0A0A90A00A0AD0B000ACB0A0090B0000000AA000A000000000000000000009000000000000000000000090000ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFFF9FFFDB9D99909D90909009000000000000900000000000000000CA0E000000A00A00000AC9A090E9C9A0ACA0000A000E9000000000000A0090000000900000000000000900000000900909EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFBDBFFFBFF9F090B00000000000090090000009000000000000900B0A90A000A90A0A000AC0A000A00090B0000000AC0A000000000A00000A0000090C090909000000000000000000090DEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FF9E9F09A99AD09009000090090000000000000000000000900E0C00A00E0CA000000A00B00E0E9A0A000A0000AC0A00A000A00900A000090000000BC90C000909000000000090A90ADBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBDBDFF9F9F9DBD9090909000900000000000000000000000000000AC90A9AC0B00A000A00A09AC0ADADA0000E000A0000A9A000A900A0A900000000000090900909000000000000000909C90DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFDFFFFBDBF9F9A909CB0900009000000000900900000000000000009C9A0E0000ACAE09A00009CA00ACACA0E9A0B00000A00C00A0C0A00000A0A0000900000000000000000000000000000C0090BC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF9FBDBDBE9F9F9B090090900000000090000000900000000000000000009A000009E00E09A00CAC0E0BCB0000E0A0A00CA0A000A000A0A0000000000000C09000000900000000000090090B0C9FFFDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBCBD99090909009000009090009C0900000000000000000090B0A0A000B0E0E0B000A0CA90B0A9CA00ACBA00C000A00000000A0000000000000000090CA90000009000000000000000C0B9E9FFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFF9FDB0BDB909A9090090900090000000000B009090000000000000000000000A0000B0000FAD0B0CAC00CA0A0CA09E0ADA000A9A0A00000000A00A90000900009000000000000000000000009090C9F9FFDFFFFFFFFFFFFFFFFFFFFFFFFFFF9FFFBF9F9090909000090000900909000909000DA9CB0000000000009C900A0A0C0A0E00B0E0CA00E00ADA0000A90AA900A00AC000000A000A0000000909000000090909000000000000000090000090DBDBFFFFFFFFFFFFFFFFFFFFFFFFFDBFFBDBD9F9F90B00090900090000000009000090009009009000000000000A00C0A9AC00E0000FADAE0ED0ADA9A90A00E0A000A00A0A00A00B00000000CA00000000000000090000000000000000000900BCBDF9FBFDFFFFFFFFFFFFFFBFBDFBFDADBCFA9909D09900000900000090909000000000000009000000000090B00E0FCACB0F0F0BE00E09A0AECAAC0CACA0B000A00000000000E00000000A099E90090000000000000000000000000D0090A9C9BCBFFFFFFFFFFFFFFFFFFFDFFFBFDBF9F999DAD9A900090000000909000000000900900900009000000090E90CE0FA0A90E0E0E00CE90E00EDADC0EA0900E0000000A00000A000A00000090C09E9000000090C900900000000000000900C90BC9F0D9F9F9FBFFFFBFFBDFBF9F9F9BD9F0BCB09B090090000000000000900000000000000000009000090090A0A9EEDEDEA9E0F0E9A0E00AC0ACAAE90E0A09A0000A000000000A000000000A9EC90F00090000000000000000000000000000090099AD0FBFDF9F0FDB9FB0DBF9E9F9B099990900909009000000000090000000090090900000000900000009C00E0AEBA9CA9E0F0E0B0A9CACACCDAEC0AC0E0000000000000000000000A000009E900D000900900000000000000090090909C0BD0AD0BD09A9E9F9BCB9CB9099990009000000900000000000000000000000000000000000000000090090B09AC0FCBCCEF0CA0E00E00CA00ACAAAC0ABC0A9A000000000000A000000A900A0A9E900F909000000900000000000000000000009000909009AD9909009009009000000900900900090090000090000000000000900009000000000900000A9C0E09A0ACEAF0AADEDAF000AC0ECCACC0E0C0ACA000000000000000000000009000000909E90D0090009000000000090000000090090900009090009009090090090009000000000000000000000000000000009000090000000000000909C9CBCBCA0ECBCF0E9CACAC0A0F00E0BAC0AE0E0E00F0A00000000000000A00000A0000A090009E9A9A090000000000000000000000000000090000090009000000000009000000000000000000000000000000009000090E9000900000009000B09CACB090ACAEFEADEBEBCA00E0ECCAE0C9A0A0E0A0000000000000000000A0B09A0000A09C090D0D9CA909000000000000000000009009000900900900009090090000000000000000000000000000000000000000900909A9CA00900CA90D0DADEBCA0E9EEDE9EACE00E9CE0E0A0C0EA0C0C000A000000000000000000000000000000000B0DA9A009C00090000000000000000000000000000000000900000000000000000000000000000000000000000000090009000009090009090B09A0E00F0D0E0FAFEFDEB0F00E0ADACE0AC0CA0A0A0F00000000000000000A0900A00A00A0E90DA0D0D9F09AD000900000000000000000000090090009000000000000000090000000000000000000000000009009009CB000090090D090B0D090C09EFAEAE0ECEEDAEBCE00E0ACACA0E00A00000000A00000000000000A000A00000009000A00DB0F0090C9A900C09000000000000090000000000900090090000000000000000000900000000000009000000000900909090000009AD090B0E9A000EDADAF0EFAFFCEBCACADE0CACACBC0ACA0000F000000000000000000A0000000A0A0A9CB00D0DB0F90C0DA900090900000000000090000000000000000000000000000000000000900000000000000000090C9A0000000000B090B0D0D0000EEDAFECAEBCFEEFFE9E0CA0ECAC0AC0AC000A000000000000000000000000000A0000000A00DBCBCD0009B090009A0000000000000000000000000900900000000000000900000000009009000000000900F0090909000000B090E9C9A9A90ADADAEE0F0ECEFEFFACAC0E0ECA0E0E0E0A0A0000A00000000000000A00000A000000A00A0000009CB0F9D0C909C90D9000000900009000000900900000000000000900900000900000000000909000000009009A90000000D09C099A90D00A00ACACE9EACFAFEFFEFFA9E0E0A0DA00000C0000009A0000000000000000000000000000000A9A0E9AD90E9B0F090DA0DA09000000000900000000000909C0090090C000009C00009000900900000000000D0090D0900090B00009BC0DADAD00000E0F0E0E0ECAFEFFEFCA0E0E9E0CACA0A0A00A00E00000000000000000A00000000000000000090DADB9E0D0DAFA9DA99000000009000900000000900090900000009C9000B0000090000000000090900A090B000090C0090B9009B090E0A0CA09E0E0E9E0EFEFFEFE9E00E0E00A0000C0000000000000000000000000000000000000000A0A0ACAD09C9DB0F9C9DA9D000900009009000000090C00C909A0090909000090009A09C000009090900000909AD0900B00090000CB9F09CF009E90CEACAF0E0FECFFEFE9E00E0000E00A00A00AC0A0B000000000000000A00000000000000A000000090BCB0F0D9E9B09CBCB00900000F090090000009A90A0D0900000A09C090D090009009000000000000D09000900090090DB9C909CA0F0E0E0B0CBC0E0E0FEEFFFFEBCA0A0E0000C0000000000E000A00000000A000A0A000A0000000000A0B0A0009C90F090C9E90090D000000009C90C0900900009C909E9090D090900000C9000000009000090090B0090009090900B0DBB0BC9CACADA9E0E0EACADACADEFEFFEDAC0C00A0A00A00A00A000B0A0000000000000000000000000000000000000E0B0F90F0F9090C9CB090900D09A9A90900000900C0B0090F0909E9E9D0B090A90900900090900F090DB090F000A09F0F0D0D090ACBCACE0F0F0CBCACAEEFEFFEDA0A0A000000000A00C00A0A000000A0000A00A00A00A0000000000A0ADA0B0900D00F9F9CBCB9A909AC009A0C9C900090090009090C9CF0D0AD0909A0090C90CA000009E9E0909F090009009C9DB099B09A9A09E0E0E9E0E0EAC0E0EDEFFEFFEAD0C00AC00E00C000A00C0F0000A000A00000000000000000000000000000A0EB0BD0C9A909D0D09C90900090B0F9B0090C090000909A99AD9090F099D0A9009090F0D0909F9F00B0090009A90BC9E9CB090CAC0ACBCACBCAD0EACBCAFEFFEFBC0A0A000A000A0AC00A0A00A0A0000000A0A0000A0A0B0A00A0A0000A0A0A000C9CB9BCDE9E0B0DA9CB09C9AD0D0C9D0A990090900F0D0E90F0F090E0090090090090BCBD090990090A9090DBD0B90F9CBCB09ACF0EACACACAC00E0ACAFEFFEFEF0C0CA000A0000A00C000F00000A0A0A00000A000000000000000A00000D0F0B0A0D0B99F99C9AD0A90CB0D09A9BCBBD00B0C9E9F09A909E909DAD99009000900B9C990B9E9A0D909D0FBDB0A9D0F9E0DA0CACA0E0CBCADACADA0ACEDEFFEFF00A0A000E00CA0000A000AA000A000900000A00000A00A00A00000000BCA0A0AC00F0BDADE9E9AD9A9D090D0B00DCB9C90F0D9E90090D09E9DBDA9900AD090F009C0B9AD9C9ADDBADB0F9C90D9F0BCBCBAC9EAD0ECBACA0E0A0A0C0CAEFFEFFE9E0C00A000A000CA000A009A00000A000A000000A00A00000000A00A000DA9000B00E9ADB9FBD9A0D00BCB090D0B0CF9AD99A09F9BC900090A0BDE9F990F090DB09BCBDA0BD99AD90DB90B0F0F0F90DA0DAE0CAF0ACCACA00D0CA0A0CFEFFFEBE0A0E0C0A0000A000A0C00E00000000A000A00A00090000000000000ACAC0E9A0CA900F0E9C9BC990F909DADA09C9B0F9AC9DF09C9ADB09C99C099A9E990DA90DBC99C9D90BCB9ADB0DA9DB9F9F0FA0FE0CAF0CAC0A000DA0A00000A0EFEFFFEDAC00A000CA0000AC000A09A0000000000000A00A0A0A000000A00A9009A90000000A00090B0CB0E900C0E909CA90C90D99E90F0BD9ADBC9A090009C9000B9CBBC9BCB0BCBDB0D9BCB99CB0E9E0F09E00FACCAAC0BCACA00000A00C0E9EFFEFFADA0E00A0A00E00000A000A0000A00A0A0A00000000000000A090A0000A0A0A0A0A0009A0A00B0D99CB909C9E99009ADA9E9E909D0AD9C9B0D09E900B0909009C9BCB9DF9BCBDBEDBDBCB0ADACBC9EB0EAC0A0D0AC09000ACA000A0ACEFEFFFACAC000AC000000CA0AC0A0E00000000C0000A000A000000000CA0900A0000090000A0A000000000CA90AD0B09A0D0C909C909C90AD9B0B9C90B00DBD09A9CB00B0F90FA9EDBDA99A9A9A9ADA0F0BAC0E9C0BC0AE0A0A0E00000AC00CBEFFFFEFF0ACA0000E0A0A000000009A0000A0A9A00000A000A0E9000000E0A000000A0A0000000A000A00A90C900D0D0D09A909A9CB09E900C09CA909090009AD9009D00D0FD9F9BCB9DB0DB0DA0F0F0ADCBAF0E0E0AC009C00000A00C00A00CEEFEFFE9E900E0A000C00A0A00A00E00A00C90000A00000000000A00A0B090000A000000A00A0A00A00000CA90C9A9A90BC90F0D0BD0F90F9B9090DAD0090DADB0990B9DBF9AF0F9BDA9ADA0FA9F0B0F9ABC0CADA00CB0E0A0A0A000A0A000ACAFFFFEFE0CA00000A0A000C0CA0CE90000A0A00A00000000000B000000C0A00A000A0A00000000000000A0A909A90DC9C00BC990AD0BD0F90C0F0DA90ADE9099CBFCBC9E9CBD9FDADA90F0BDB0FA9EDA0EC0EACA0F0A0000000C00E000000E0EFFFEFFEB0ACA0ACA0000A0A0A0FE0A9000090A0000A000000A00A000A9A000000000000A00A0A90A00000D0CE09C9A9A90900CADD9EDAD0F9BD0F0DE9D09E9CA9C9BDBF9FF9EF0BDB9EB0BCBEBCBE9ACF0AE09AC0AC0ACA0E0A0A000A0CA000CEEFFFFFCE00C0000C0AC0C0ECE0FEEA0A0A0000000000000000000000009A0000000000000090E00A00A0A0A9E0AD0E90F090900ADBCBFBDADAD9F0DA9F0F9FDB0F0F09E9BF99FDACB9E9EB0BCBCADA0EC90E00BC0B00000000000A00A00A0A0FEFFEFCBDA0A0A00A00ACAE9EFEEFB000900A00A0000A00000B0A00000A000A00A00A000000AC0BC90A0000F0AD0A090F0DADCFF90DBC9CAD9F9E9FBDF0BCF0BCF990DF9F090F0ADBE0BA0FADA09E0CB0AAC9AC0A0C0A0A00ACA0000C0000C0EEFFFFFBEACAC0C0A0CACACFEFEFFFC00A0A0000000A000A00A00000A0A0000000000000000AC0BE0A00000A00F0A900E0CBCBA909E9E90B99A9EBDBC9A9DBDBDF99ADB9A909E9ADB00B0DB090A9E0EB0E9C0A00A000A0000E0000CA0A00A00ACFEFEFFEF0900A0ACEBCFEFFEFFFFEBE000000000A0000000000000000090A009000000A0A009AC090A00A00A0000CA009A0B0D0F0909B90DADB9DADBF9CBCBCB9FFDBCBDADA9ADACEBCBACB0ADA0B0CB00A90E00DA00C0A00000A0000A0CA0CAEFFFFFF00E0E0ECBCEEFEFEFEFEFF0B0B0A00A0000A0A0DA0A000000000000A0A000000000000B0A000009000A0B009A0000A000A0E00C90900909E9CBF9BDBDA09EFBCB0FBCB09A9CBC9A0F00F0CB0CB00E00B000A0A00A00A00A000C0000ACFEFFFEFFE0E9E9EEFFEFFFFFFFFEFBC000000000A00900A0000A000000A00900000A00090A0A0C000A0BCA00B0000A000A0000B09090B0A0009E0B09B09E9E9A9FA9ADBCFBCBCBE9EFEBE9EBFFBFBFFBE9A90AC0A0C0000C0AC00C0A0A0A00CBCFFFFFFACBCEEEFFEFFFEFEFFEFFFE0A0A0A00A0000A0BC0B0000000A000CA0000000A0A00C00A0A9C0000CAC0CB0000000A0A000A0A0090A9A09C0E00F0B0BCB09BCBEFBFBFBF9EFADADBFFFFFFFFFFB9A0A00A000A0A0A000A0A000000CA0EEFEFFEFEFEEFFFFEFEFEFFFFEFFEFB00090000000A0000A000000000000B000A000000000B0A09000A0A0A09A9A0E9A00000090A090000A00000A0B0BCADADABCBACBFBFFFFFFBFBDFEFEFFFFFFFFFFFFF90CA90CA000C000A0000A0AC0A00E0FFFEFFFFEFFEFEFFFFFFFFEFFFFFFCB0A0A9A00A00000000A0A00A00A0000B009A0000000009A0A0000D0DAC0E900009A09A00090A00B00A0A090E0F0B0B0BCB009ADFFFFFFFFFFFAFCBFFFFFFFFFFFFFBFA90A000B0A0A0C00E00C00A000E0EEFFFFFFEFEFFFFEFFEFFEFFFEFEFFF0A000000B00A0A00A9000000000CACA00A000A00A0A0000000A0A0AA0B000E9A0000000A0A09000009090E09A0ADAF0FB0B9EBAFFFFFFFFFFFFFFEFFFFFFFFFFFFFF9A0AC0B0C00000A0A00A0A000E0BCEFEFFFFFFFFFEFFFFEFFEFFFEFFFEBA009A000A0000000000A000A0000A0B0CADA000000900A000B0090C9C90A9A9000A00A090090A0000A0E0A90AC9F0F0BBCBDABDFFBFFFFFFBFFFFAFFFFFFFFFFFFFFBA9C90A00A00A0A00C0A000C0E0ECEFFFFFFEFEFEFFFEFFFFFFFFEBFACBCF0A000A0000A0000A0000A0000A0D0CA900DA0000000000A000ACA0A0A0000A0A90090A0BCA00A0A000090A909A0B0BE9BEBDAFBFFFFFBFFFFBFEF0F9FBFFFFFFFFFF9A0A00E00A00C000A00CACAF0FEFFFEFFFFFFFFFFEFFFEFEFEFAFCCFACAA900A000A0000A0000B00000A000A0900A000B000A0A000000A0900000B00000C0A00000009E090000B0AD0A0A9CAD0BE9FBFF9E9FBFBFBFBFFFFFFAFBFBFFFFFFFFBE900E90A00E0A0E00E0ACBCEEFFEFFFFFFFFFFFEFFFEFFFFEFADABA0000F0A0000000A000000000000B000A00A0A90A000A0000000A0A9CA0B0B000A0A00A00A00B0A009A0A0A0CB0A9000A9ABDBFFFBFBFBFBFFFFBFBFFEFECBCBFFFFFFFFFB9A0B0A00DA000000E9ECFEFFFEFFFEFFFFFFFEFFFEFFFEAF0BCAC0C0E0AA0000A0A0000000A0A00A0000000000000009009000A0B00000A000000A00900A90909000900A000900B09000A900FDAFBFBFBFFFFFFBFBFFFFEFF0BFBFFFFFFFFFFBCB0C00CA0090E9EE9EEFEFEFEFFEFFFEFFFFFFFBEFFECAF00E000A0A00CF00A0000A000A00000000ACA0B00A000000A00A0000000A9A0A9A9A0A000ACA900A0A0A0A0A90A9A0A000A9A900B9ABFFFFFFFBFFBFBFBFBFBFFFEFDAFFBFFFFFFFFA900A0A90AE0E0E0FEFFFFFFFFFFFEFFFFFFFFEFEFACABC0EA0E0AC0CACA0B000A0000A0000009000090000000A00A0000009A000000000000000A90000E00000009000A0000090A0900E9E0E9FBFFBFBFFBFFFFFFFFFFFFFBEBF0FFFFFFFFFFBF0B0D0AC90E9EFFEFEFEFFEFFEFFFFFFFFFFFFEF0FAC0A00C00C0ACACACF0A0A0A0A00000A0A0A0A0A0A0A0A0000000A0A0A000A0A0A0A0A0A0B0A0B0B0B0B0B0B0A9A0B0A9A0A90A0F9BB9BFFFFFFFFFFFFBFBFBFBFBFFEFFCBFBFFFFFFFFFF0B0E0ADAEEFEFEFFFFFFFFFFEFFEFEFFFFFFFE9EE0E0E0E0A0E0E0E0ECAA00000000000000000000000000000000000000000000000000000000000000000000000000000000000A9FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBFBFFFFFFFFFFB9ACBCFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE0E0E0E0E0E0E0E0E0A000000000000000000000010500000000000070AD05FE,'Robert King served in the Peace Corps and traveled extensively before completing his degree in English at the University of Michigan in 1992, the year he joined the company. After completing a course entitled "Selling in Europe," he was transferred to the London office in March 1993.',5,'http://accweb/emmployees/davolio.bmp') +GO +INSERT "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(8,'Callahan','Laura','Inside Sales Coordinator','Ms.','01/09/1958','03/05/1994','4726 - 11th Ave. N.E.','Seattle','WA','98105','USA','(206) 555-1189','2344',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00F00900000000000009090FB0000900000090000000909BFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0009C90C0F9E9BE000090009000D09009009000000000000000B0900000000900000FF009CD00000009000090900000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B0D0900909E9FC9000900900FBFA90000000090000909000000D00B0000000000009000009B00000000090900000909BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0900B00009E9E09000900F9DFFFF090009000090000090090B09090000000000009F00000F0000009000009000000BFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AC90009009090C9000099E00D0FFFE900000000090009000F000000000000000009E90090F00000090090900009C9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00900000000900900009F00090909ED009090900000090090000090000000000009E0009F0000000000000909E90FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFFFFFFFFFFFF90D00909090909000900BC90900009BDA90000000000BEFFE00000000000000000090F09A0009000090000900090BFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFCBBF00000000000090009FE00000000FFC000900909DFBD0B0000000000000000000099ED00009000090009F00009BFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFC9F000000909000000099E00000090B0090090000BFC00D00000000909A00000000009000000000000900BF009ADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFBFFFFFFFFFFF9E9FF90000009090090009BD0B0909C900000090900900B00000000000900000000000009000090000000900009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFBFFFFFFFFF09F0009000900000000000FBC9000A00909000009F000F0000000090000900000000000000000000900009F009EFBFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFEFFFFF0F009000000900000000090DAFDBD0900009009FE000900000000009000900000000000000000000009090FC9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBDFBFFFFFBFFFFFFF0000000000000000009000090000000000000090000F000000000000000900000000000000000000000090009FFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFBFFFFFFFFFFFF090909090090000000000009000900090000000000B0090000000009000A0000000000000000F00009000900BFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBFFBFDFFFDFBFFBFFFF00000000000000009090090000900000009BF00990F00000000090000909000000000000000900F9E0009009FDFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCBDFFBDBFFFDFFFBFFC000900900000000000000000900090009CFC9FF0EB09090000000900000000000000000009009009A000009BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFBFFFEBFFFFDFFFFFD0009009090DBDB00000000000000090FBFFADAD0F90009A00900009090900000000000000F00090D9000000FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFBFFFBFDFF9FFFDBFBFFFEF9EB00000000F0FADFBCBC90000090000BCFFCF0F00F0090090900909000000000000000000090000000009009BFFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDFFBFFFFFFFFFFFFBFBFFD000900099A9DF0FFFFBCF000000090BD0B09000B09A90900090A090900000000000000009E00009000009AFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDAFFFFFFFFFFF9FBDBFBDFBDFDFBCBA000099FEDFE09F0D0FFBC00000900D0A9C0000F0BDA09A9000900009000000000000000099E000B0090099FDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9AFDBFFBDBFEFFFFCFBDFAFBCFFDFD00000FFF0F9C009E09CBC00009E9AFD000000F900D009C09009000090900900000000000090000000000BFBFBFBFFFFFFFFFFDFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDBEF9FFEF9F9F9FBDFADF9FBDBEBFE909009BD009B0F9FE9F0900009C900000000B09F0090B900000900000000000000000000090990000009FFFFFFFFFFFFFFBFFBFFFFFFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFFFFBFF9F099EB9F9FBCBE9FABDBFEFFEFFDFBC00090FE9AFEF9E09F000000000000000000F0900B09000090000009090000009000000000000000009FF9FBFFFDFBFFBDFCBFFFBFFF0FFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFEFFFFBE90FDFADBF9F9FDFCBFDBF9FBFFF00000090DBDFFED00000000000000000000B0B909F090B000000000000000000A90000000000009000BFFFDBFFBFDBDFBFBFDBFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFBFFDFBDBE9F9F9B0BDFF0FBEFAFBDBFDFFFFFEFF0009000000909090090000000000000000F9CB00BFC90900900000909009009C0900000000000000099FAFF9FF0FAB0F9FBEF9FFFDBFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFBFFDFBFFFFFFFFEFCB0B9FBDF9FDBFFEBFAFFFBDBFF000900090000000000000000000009000F09099E90B00900000000000900909ADA900000000000090BFDB9E90B9D9F9ADBDBFFFBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFBFFFFBFFBFF9FADBDBDBCBCFBAFBBE9F9FFDFBCFFFFFF90000000000000000000000000000000B0A9E099E9C090B090000090009000900000000000000000909BC99BCDBEBFFFFFFFFADFFFFFFFFFFFFFFFFFFBFFFBFFFFFFFFFFFFFFFBFFFBFFCFBFFFFDFBFFDBFFFAF90B9FFDFFDFFFFBFFFFFFFBDAC0000000000000000000000000000000F9090B0090B0009A000000009000C000900000000000000000009AE9BBF9FDBFBFBFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFBFFDFFFDFFBDFBDBFAFDEBFFBCBDEBD9E9FBCBFBFADFFBFFFBFEFF909F0000000000000000000000000090FC909C900909000909009090000B9090C0900000000000000000999E9CBFAFDFDFFFFDBFFFFFFFFFFFFFFFFFFFFBFF9FFFBFFFFFFFFFBFF0FFBFFBFFFEDFBFDFADFBDBDBEF9F0FFF0FDFFBFCFBDEDBDAF009F9F9000000000000000000000000FB09A90A90000900900900009090000A9000000000000000000000B9FBDBDBFBFBFFDBFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFBDFEFBFFBDFADF9FBFBDFBFDBEDAFBCBDAFBF9FFFBF9EDBFFFBFFFF9F000000090000000000000000000000B0F0900900B0900000B009090B00090900000090000000000900099CBCBDBFADFFFFBFFFFFFFFFFFFFFFFFFFFFFDFBFBF9FDFBFFFFFF9FFF9FFBDFBEFF9FEBE9BE9BF9CBFBF9F0FADBCBFFBFFF0FF0F9E0000000000000000000000000000090F09F0A90090000090909E0000000000000900000000000000000000B9BDAF9FFBFBFFFFFFFFFFFFFFFFFFFFFFFFBFFDFFFFBFFDBDFBFF9FBFF0FFBDBDBE9FDFFDBFF0FBF9E9EDBDBFFFDBDFE9FFDBFBC9FA00000000000000000000000000000F90BD9E9009000000000909090909000900000009000000000000090E9BDBF9FFFDF9FBFFFFFFFFFFFFFFFFFFFFFBFFBDFFFFBFFBFCBFFDF0FF9EFADBDBFBB9AF9ADBCBCBDBBEBF09BFAFBDBF0FAD0FBC9D09000000000000000000000009000B090B0909A009000909009A0000000090009000000000000000000099ADADAFBDBFABFFFFFFFFFFFFFFFFFFFFBFDFF9FFB9F9FFFFFBFDABFFBDFB9FBEBDADEFDBEDF0BDBFADF9F0F0F0FDEFF9FBDBF09B0A90000000000000000000000000000F00B0DA9090000000009000090090000000000000000009000000009ADB9BDBCBEDBDFFFFFFFFFFFFFFFFFFFFFFFFBFFE9FEFF9FF9FDBFFCBDAF9FE9F9E9FB9BADB0BDADADBDAFF9F9FFB9B0F9E9F0DBC0900000000000000000000000000000F09CB09AD0B00000000090900900000000009000000090009000000090F9E9FBDBF0BFBFFFFFFFFFFFFFFFFFFFFBFCF9FFDBDBF9FFBFE9FBFBF9EB9F0F9FADEFDBCBCB9F9FABDB0FAF0BDEFF0F9E0B00B9000000000000000000000000000090BE9009090909009000000009009009000000000000000E00009000009B0F9B0FBDBDBDFFBFFFFFFFFFFFFFFFFFFFFBFFBFFFBCBE9FE9FF0DBCBDBDE9FADB9B9BCB9DBCB0F9FDADBDB9F0A90F9ADBC9F000000000000000000000000000000000F90B00F0B0C00900900900900900B09000000900000909000000000000DBC9F9CBF0BFBFFFBFFFFFFFFFFFFFFFFDFFFBFCBDFFFDFB9FB9FBDBFADA9F0DBCFCFCBDAA99ADBE9ADBCBCF099FBBCB099A0900000000000000000000000000000000B0F09B0909B09000000009000009000090000000009000000000900009BA9FADBF09EBDFBFFFFFFFFFFFFFFFFFFFBF9FDBFEBF9FBDFF0FF9E9E9F9F0FB0F9B0BB0F9DADBC9BDBE9F9B9E009C90DA009000000000000000000000000009000000F09BC09A900900900900009A000009B0000000900000909000090F00090DA99ABCB9BEBDFFFFFFFFFFFFFFFFFBFFFFFEBF9BDFF0FBCBFDAF9F9F9ADF09F9ADBC9F09A9A9BADA9DA9E9E9900BCB00900000000000000000000000000000000900F009B09C0B00B0000009000090000009000000000000000090009000009BDAD9DBC9D9FADFBFFFFFFFFFFFFFFFFFDBFDFCFFADBFDFBDBF9FADB0F9A9F0BD9ADBE9F0D0D09DADA9F9B09ACB090090000000000000000000000000000000000000F09A0F099090D0900000090900090090B00000090000000000000900000009A0B0B0BF9FBFFFFBFFFFFFFFFFFFFBFFFBFBF9FBDBF0FBE9FBDBCBDADB0F0BE9F09B0B0B0BDA9BBCBC0F0D90009000000000000000000000000000000000900000B00D990B0009A000009090000900000000000000000000000000000000099B9F9F09ADBFBDBFFFFFFFFFFFFFFFFFFF0FDF0FBCBE9FBD9F0DADBDADB0F9BC9DA9E9E9C9BDA90D0990B909A0000000000000000000000000000000000000000000F09A0A090B00900000000909000000909000000090000000000000000000000909E9DAF9FEFBFFFFFFFFFFFFFFFDBFFFA9F0DBF9FBDBEBFBF0F0B0DB0D0B0B0F9A90B0009CB0F0A9C0B009000000000000000000000000000000000000090000FB09909E9C900900009000000000000009090000000000000000000000000900B090BDBE9BFFFFFFFFFFFFFFFFFFF9FFDFBFBCBDE9E9F9CF9F9F9FADB0F9E9F0D9F099F0B09909D0B00900000000000000000000000000000000000000000000F00009A90B0B000009009000900000000000000000000000000000000000000909A09AD9FF9FBFFFFFFFFFFFFFBEFFF0FADBCBDA9BFBCBB9E9A9E99B0F09B90BAB0BCA09C9ACB0A9090000000000000000000000000000000000000000000000F99E909DA9000900000B0000009009009090009000000000000000000000000009090BDBE9FFFFFFFFFFFFFFFFFF9E9F9DBCB9EBDF0DBFDE9F9F90F0DADBC0F0D0D00990A9090090000000000000000000000000000000900000000009090009BE09A9A0DAD900000900990000000000000900000900000000000000000000000000090B9FBFFFFFFFFFFFFFFFFFFFFBFADB0F9DA9FAD0B9F0DA9F0B90B09B09B0B090AD909A9009000000000000000000000000000000000900000000009000F9F0909B09AB000000900A900000009000000000000000000000000000000000000090BCBCBFBFFFFFFFFFFFFFFBDBDADFADF0B9F0DBF9E9FBADA9F0F9CB0DB0DAD9A9000B000900000000000000000000000000000000090000000000000000F0B0F0000F9C900000090900900000000090900000000000000000000000000000000009B9FDFFFFFFFFFFFFFFFEFEBDB0DB0FAD0BA90FDB0D9BF09B0B99E9ADA90AD09B00090000000000000000000000000000000000000000000900090000B00F90B0B90B0000099AD0000000090900000000090000000000000000000000000000090FFBFFFFFFFFFFFFFFDBDBDB0FB0F9D0F0D9F0B0DBAD0DBCBC0E909090F9000009000000000000000000000000000000000000090900000000000000F909A9090CBC90000000B0909009000000090900000000000000000000000000000000009A9FFFFFFFFFFFFFFFFFBF09F0DB0B0B9B0B0BDBAD0B9A9B09B9BCBCB0000B0900900000000000000000000000000000000000000000000000900000FA9ADA90B9A9A9000090000000000090900000000000000000000000000000000000000009FBFFFFFFFFFFFFFFBDE9FE9B0DBCB0F09C909C9BD0F9C9E9C90909C9B9900090000000000000000000000000000000000009090000000000090000F0009ADA009C900B00009A90090009000000090900900000000000000000000000000000009FFFFFFFFFFFFFFFFFBF09BC9A990D09E9ADA9A9A90B0B9A9ADA9A9AC0009000000000000000000000000000000000000000000000009009000000B09BBD0909A9AC909000090000000009000090000000000000000000000000000000000009BFFFFFFFFFFFFFBEBDBC9BC9AD0E9A9A909B09D0D0BCB9C9AD09C90909A90000000000000000000000000000000000000009000000900000000000F000CBFAD00C9B090A0900000090009A000000900000000000000000000000000000000000BFFFFFFFFFFFDFD9FADBF0B90B990D0D0BC0DA0B0F09CB0F9A9A90F090000000000000000000000000000000000000000000000000000009090000F9A9090B0B0B00F099000000000090090900000090000000000000000000000000000000009FFFFFFFFBD9A9E90D090D0BD0A9A90B099A99C909B090B0D09CB090A9090000000000000000000000000000000000000000000000000000000000F090B0BDBC90090BC009000000000090900000900090000000000000000000000000000009BFFFFFF9FCBFDB9BDB9B0B9C0BD090B0DA090A9A90C9AD90B0B09CB0D0000000000000000000000000000000000000000000000000000009000000B0AF0D0BCB9A90BCB090090000000900A90000000000000000000000000000000000000000BFFFFDFBDBFCB9EDB0FC99CB9900BC90909CB900DA9B090F09C9A90900090000000000000000000000000000000000000000000000009090000090F9090B0F9BC900090F00000000090000909000000000000000000000000000000000000009FFFFFBFFFDBFFFB0FDB9FA90BCB909A90B0900DB090C9E90F0BC90B00B000000000000000000000000000000000000000000000900000000000000FA90BCB0F0BE909A9A9F000000000909000B00090900000000000000000000000000000000BFFFFFDFFFF9FFDFBFE99F9F090CB0DA9CB09A09A9B090B09909A9C900900000000000000000000000000000000000000000000000000900000900F9E0909E9F99AD090DA9090000000000090009000000000000000000000000000000000009BFFFFFBFBDFFF9FBDF9FE9F09E9B090909090900D009A9C9ACB0D0B090000000000000000000000000000000000000000000000000000000090000F09B00A99A9E9B0CB09E900000000000900090000000000000000000000000000000000009FFFFFFFFFFBDBFFFFBFF9FA9F9BC9B0A9A90F09A90F090B90990B09000900000000000000000000000000000000000000000000000090000000009BAC0909ACBE9FCB90A90B09090000000009000909000000000000000000000000000000009FFFFFFFFFFFFFFF9FEDBFDFF0F0BC0D90D0909090090F90CB0E9090E90000000000000000000000000000000000000000000000000000000090900F9B0AD09099A9BCB9C009CA00000000000090000009000000000000000000000000000000BFFFFFFFFFFFFDFFFF9FDAF9FBDF9B9A90B0A9E90B09000B09909E09009000000000000000000000000000000000000000000000000000000000090F0AD90A0B0ADBCB0F9A90B90900000000090009000000000000000000000000000000000BFFFFFFFFFFFFFFBFFBFFBFDBFDA9E9E90F09D0900D00B09090A0909B09A000000000000000000000000000000000000000000000000000000900000B0990A9D009BCB9F00909000000000000009B00000000000000000000000000000000009FFFFFFFFFFFFFFFFDFDF9F9BFCBFDBDB0F909A09A9009090DA0D9A090C09000000000000000000000000000000000000000000000000000000009090F00AC90A9F00BCB09B09E90900090000000009000900000000000000000000000000009BFFFFFFFFFFFFFFFFFBFBFEFDFBDFADBCB00F09B9C90B009A099A09F00900000000000000000000000000000000000000000000000000000000000009AB099A900BD09ADAD0F090000000000000000000000000000000000000000000000000BFFFFFFFFFFFFFFFDBFDEDBDBE9FB9FBCBDBB0F0C0B0909E09000900090A90900000000000000000000000000000000000000000000090000000090900F0A0A09A90A909B9A909A090000000000000009000000000000000000000000000000BFFFFFFFFFFFFFFFBFFDBF9FBDB9EDFBCBDAD0D0B9B0DBC90909A9CB09A090000000000000000000000000000000000000000000000000000009000009BB00909E9E99F0F0E90F09000000000000000000000000000000000000000000000009BFFFFFFFFFFFBDBDFBDAF9FAD9EDB9A9F9E9ADBBDAC9A09A90A09000900D009000000000000000000000000000000000000000000000900009000909A9CF0A0B0009A00B099F00B0000009000000000000000000000000000000000000000009FFFFFFFFFFFFFFFADF9F9E9DA9B0ADBD0F9BDB0DA9BC9B0909090909E0909A000000000000000000000000000000000000000000000000000000000990BB0090B9A09A9CBE09B0D000000090000000000000000000000000000000000000009FFFFFFFFFFFFBDF9F9BE9F9EBDAD9B0DA9AD0BCBBDE9B0DADA9C000B090A0090900000000000000000000000000000000000000000000000000900000AD0F00A00ADA0D0B09BC9DA90000000000000000000009000000000000000000000009BFFFFFFFFFFFFFEBF9F0DB099099A9C9B0D9A9DB0DA9F0DA9090B09000090900000000000000000000000000000000000000000000000000000000000B09BA0009A99090A9CBCB0A90000009090000000000000000000000000000000000000BFFBFFFFFFFFFFDBD0DADB09F0F9AD09BCB9A9CBADB9F09A909E9090090900000900000000000000000000000000000000000000000000000000900090D0BCF0A0A9AA9A09A9A90F900000000000090000000000000000000000000000000009FFFFFFFFFFFFFBFDBFB990F0909C90F09090D0B9DADADFF90F09E9090000A90B000000000000000000000000000000000000000000000000000009000B0B09B009009AD0BC09CB90BD000000000900000000090000000000000000000000000BBFFFBFFFFFFFDFBC90DAD990F90B090BCBCB090E99B9A9DA909A90F09A090000909000000000000000000000000000000000000000000000000000009090F0B00A0A0B0BC9A9A9E9CB000000909000090000000000000000000000000000009FFFFFFFFFFFFFF9DB9F9DBCF99090DAD09090DA990F0F9FADA9AD0B9000900090000000000000000000000000000000000000000000000000000909009ADB00E000090B000B009E9AB900000000009000090090000000000000000000000009FFFDFBFFFFFFDF9FBDFFDBFDBDADA9099A9BC9B0D0B0B9EBDB9C90BCA90900090090000000000000000000000000000000000000000000000000000A0B090009B0000A90BB00DA09BD0E9000000090090000000000000000000000000000000BBFFBFDFFFFFFBFFDFFDBFFDBDBD9DB9009C9A9C9AD09C99FADA9A9099CB009000009000000000000000000000000000000000000000000000000009090F0090BB00A00A000B0A9F00B99A0000000090A0000009000000000000000000000009FFFFFBFBFFFFFFFFFDBC9009090B09CBDB0909A909A9A9ADBDBD0D0BCB0090009000000000000000000000000000000000000000000000000000000090909A090F0A00A9A9A099009F0FAD09000000009090009A00000000000000000000009FFFFF9E9FFFFFFFDBCB09BD9A9AD09E9090DAD090F09C90909BFAB0BC90DB0E90009000900000000000000000000000000000000000000000000000900F00090CBA0000000A09A0E9B0B0909000900009000000000000000000000000000000BFFBF9F9FFFFFFFDBC99FFFFADFF9E909009099ADB09A9ADA9BCF9D090B0B00900000000000000000000000000000000000000000000000000000000009090B09B0B00A00B00B0B09ACBDE9A9E90000000090000909000000000000000000009FBFFDA9BFBFFFBD9BFFFFFFFFFFEFF0F090A900900F0D090909B9EB0F09C90909090009000000000000000000000000000000000000000000000000909A0000000BF0000A0A0000B09B0B9C909A900900000090000000000000000000000000BFFFFBDA9FFFFFD0BFFFFFFFFFFFFFF9BFAD9AD00990B0F0BC9ADBDF90B0B0DA9A009000000000000000000000000000000000000000000000000000090909090900B000A0900A0B0B00F9E90B09C09000000900009900000000000000000009FFBF0F99FFFFF00BFFFFFFFFF9EBFF0BCFDA9F009000909909AD0BEB0F0909A90C90000000000000000000000000000000000000000000000000000000B0000A009AA000000A00000BCB9E9A90C9A90000000000000A0000000000000000009FFFFFF90BF9A9909FFFFFF9F009BDB0F0FBA9CB09AD00909E9A90BDB9D0BDA9090909A900000000000000000000000000000000000000000000000000090009090BA9F0A00A000A0B00B00B09A9B09A000000000900990000000000000000009BFDF990BDFFDF09BFFF9E9E99D000090909C0B0F009A000090DA99ADFA990DA9E9A0000000000000000000000000000000000000000000000000000009A900000009AB00000B00000A90F90F0D09A9D9000000000000E909000000000000000BFFBFE9A9B090900F9F9F9F9E9BD9B0CB090900909009090090090F9B0F00B0909090900900000000000000000000000000000000000000000000000090009009000B0F0000B0000000A9A0B09A9E9E0A9000000000009000000000000000009FFFF0909D09A909B9F9F9F9F9FCB0D99090B09909090000000090B00DFBDBC9ADA9CB00900000000000000000000000000000000000000000000000000090000009BCBB00A000A000A9A9AD09E9F90999C09000009009A90900000000000009FFF90B9F9A9FDFBFFFFFFFFFFFFBFDBF0BDA9CB0A90AD909090909909B90009A9090900900000000000000000000000000000000000000000000000009000000900B0A0A0000A00A00000B0BDA90ADB00A900000000000000000000000000000BFBE9090F9FFBFFFFFFFFFFFBFFDBF09F09DA9BD9E99A09A9A9A9ACB09E9B9AD09A9A09A0000000000000000000000000000000000000000000000090009000009009A9F00000B0000A00A00BCBD9ADBD00B0900009090909000000000000009FDF9900B0FADFFFFFFFFFFBDF9FBCBF09F0BDADA99E9DA9C90D099090B9C0D90B09C90D090900000000000000000000000000000000000000000000000000000009A00AB00A0000A000000B0B9A9ADA9A9009A0000000000000000000000000BFFBBCB099BDBFBFFFFFFBFFFAF9FBD09A0909909F09A99E9A9A90090900B9A0F09A990A90000000000000000000000000000000000000000000000000090000090A0B09F0000A9A0000A0B009ADADA9AD09000000090009090000000000000BFFDBC9909BCBFFFFFFFFFFFDBD9F0D0B9C99ADA9F09AD0F090D09E9B09E9900990D09A09009000000000000000000000000000000000000000000900000000090BC9000AA000000000000000B0DBDB0D09E9E909000000000000000000000099FBFDBF0BC099BDBFBFFFFDFBCA909A9009AC909B0BD0B90B0B0B0990F90B0F9E0B0B0C909A000000000000000000000000000000000000000000000000000900009A9AB0B0A000A000A00B000000BCBADA909A0090000000009000000000000BFFFBDBD9B9A9FADFFFFFFF9F99E09009A99A9B0C9CBD0F0D9C90B0FB0BD0909900909B00C90909000000000000000000000000000000000000000000000000009000A90BF0000A90000000000A9B0BD0B09E909000000000090000000000009FFFFFFFBF09D09FFBDFFFFBE9F099009000090C9B9A9A99B0B9BD9F90D0B9E9A0BDA9009A90000000000000000000000000000000000000000000000000009009ADA90A00B000000A0000A0A00900FF0B0DA90F000000000000000000000009BFFFBFDBD0DBA9BF9FFFFF9FDBE9B00900909009BC0DBD0F09CBC9E90F9BDA909D9009E9090A9000000000000000000000000000000000000000000000009000900900B0FBA0A00B000000000A00A90B9E9A9E90B00000000009090000000000FFFFFFFFBFBD9E99FBFFFFFBFDF9C9BC9B09C9B009B09A90F9BDBFBDB9E90DADB0A9B09A90900900000000000000000000000000000000000000000000000090A90A0B0B0AF00000A000000000009A9CBDAD09AD090000000000000000000009BFFFFFBDFDBE99F0BDBFFFFFFBFFBC9B0DA9A090909F09F90F0F99CBCB9F9B90D9C0D0900F0900090000000909000000000000000000000000000000000009009090B00AB9B0000A0000000A00B0A9A90B9A9E90BC000000000009000000000BFFFFFFFFBFF9FE9BDBFFFFFFFFDBCBD0F09D9F0F09A09E90FBDBEFBDBDA9E9E9A9B9A9A90900B0900009009E9ADA0000000000000000000000000000000000A900AB0A900EA0000900000000000A0B09E9E9F09A900000000000900000000009FFFFFFBFFF9FF9BCBDFFFFFFFFBFDB0B09F0B099009DB9BFBDBF9BDB0F9F9B9F9AD0D09C9009000009000B0909090000000000000000000000000000000090909A9009A9ABF0A0A0A00000000A09000A90BCBCBD09000000000000909000000FFFFFFFFF9FFF9FDBFBFFFFFFFFDFADF9DB0BC9E0D9A9CBD9DBCBFDBDF9E9E9E9C9A9A9A9A9A0900900009C909009B00000000000000000000000000000000900A90ABE0A00B0000A9000000000A0A0B0BC9A9B0AF0000000000000000000009BFFFFFFFFFFFBFBFDBDBFFFFFFFFBDB0F0DBDBB99A09B9EBEBFBF9FE9FBDB9F9B9BDB0D9090900900009009A90B00C90000000000000000000000000000000A909A990B00B0F00009A00A0A0000000900B0BCBCBD00900000000009000000000BFFFFFFFFFBDFFF9FFFFFFFFFFFBDFFDB9A909C9A99FCBDBDF9FDF9BFBC9F9ADE9E90F0BD0B09A00900009090C909B00000000000000000000000000000009009E0A0B00B0AA0A00A0A0909000A9A0A0B0F09A9B0B9E09000000000000000009FFFFFFFFFFFFF9FFFFBFFFFFFFFDFBCB9E9CBCB0D0F0B9F9FBF9FAFFDBDBE9F9B99CB990A9C9000900909A09090F000000000000000000000000000000000090BA90B00B0A0F0000B009AAA0000000000B0A90C9C009A0000000000900000000BFFFFFFFFFBFFFFBFFFFFFFFFFFBDDBDE90B909B0B9BDF9EBDEFBDF9ADBF9F0F0F0BC9E9DA900900000009000B09090000000000000000000000000000009A9AD0A9AA00A00B0A000BAE9000000A000090B9E9A09B90D9000000000000000009FFFFFFFFFFFFFBFFFFFFFFFFFFFFBE9A9F90FBCBD0F9A9F9FBDBFBDFF9F0F9F9F9F9B09A909A90909000009A90BCB00000000000000000000000000000000909A90090B00B0F0000B0B0A0A0A0A000A0A0A09A99AC09A0900000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFDF9F9F0BD09909B9CBDADBDBFDFBDBF9F9F09E90BC9F9E9E900A000909009C909000000000000000000000000000000009CADA0B0A000B00A000A0A00000000000000090BBC9E090BCB000000000000000009FFFFFFFFFFFFFFFBFFFFFFFFFFFFBCBD0BD0BDADB0FBDBFFFFDBFBDBF0F9F0BDB0BD9A9090909090900000900000900000000000000000000900000000009A90900A09A000AB000000000000A000A0000A000B09B09090B00000009000000009BFFFFFFFFFFFFFFFFFFFFFFFFFFFDF0BDA0F9A9BCB0DAF9BCBFCBDEBDBFE9F9AD9CBADADA9A9E9000000090B000000000000000000000000000000000009009A0B09A00A0A0F0000000A0A0000A0000A00A9A9F0D009A9C90000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFBF9F09DB09D099DBDBDFFBDBFFBDBFDB9F9F9BA9D909B0D09009090000000900000000000000000000000000000000000B00900A00B0009AA000000000009A000A00000000A0B9A9000B0000000000000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBDA09F9A9E9A9ADAF9FFF9FDBFDADFADAD0DB0BDAD9A909A000090000900000000000000000000000000000000009009E0A900A00A9A0B000000A0A00A000A000000B0B9BCAC00090C9000009000000009FFFFFFFFFDBFFBFFFFFFFFFFFFFFDBDA99F0AD0909FDBD9F0B0F0BFCB9FB9DB9FB0BDA9A090F0909000000900B00000000000000000000000000000009009009000A90A0000E00A0A090000000A9000A000A0A0B99090A90A00000000000009BFFFFFFBFFFFFFFFFFFFFFFFFFFFBF909F00990B9FA9ADBEBDBD9BD9BDFBDFADE90F099C9F09090DA90000000900000000000000000000000090000000A09A90A9A900A9A9A0B000000A0000A000A0A00000B0F0ACB0090090900009090000000BFFFFFFFFBDADBDBFFBFFFFFFFFDFFFA9BDADBC09FDBC99DADAF0BE9BDEBDB9BF99F0BB09A9A9A0000000000090000000000000000000000000000000900C0B000A0A000A00F00000A0000A000B0A0000A00BA90B00909000000000000000009FFFFFFFFBCB9B0BC9FDFFFFFFFFFF09D0909099BC9A9B0F0F9D9FD9FCB9DADFC9AD0BD0F0D09C9909000000000000000000000000000000000000000909A9900B00000A900AB0A00B0000A000A0A000A000B000B0DA00A009000009090000009FFFFFFFF9F9F0D99BDAFBFFFFFFFF9F0BCB0BCBC9A9C0F9B0B0A90B0B9FABDA9BDABD0B909A909A0000000000000000000000000000000000000000000090A0B0A00A90A0B0A00A000A0000000090A0000A0A9A9A0D009900000000000000009BFFFFFFFFFFBF9E90B99FDBFFFFF9E90909C909A909B90D0D09909090909DA9DABD09F0CB0D0B0090000000000000000000000000000000009000009099AC9A090B00A0B000F090A00000A00000A9A00009A000A9A0900AC0900900090000000BFFFFFFFFFEDBF9F9CBCBFFFFFFFFDBDB0B90B090DAD0B0B0F0FBCBCBC9A99E9D0F9A9B909A9090000000000000000000000000000000000000000000A09B09A0A00B000A00A9A000000A0000A00A00A00A00A09A90B00990000000900000000FFFFDFFFF9FBCBCBCB99F9FFFFFFFBE909C09C90B090BC9F9BD0090909AD0B9B0B9ADAD0F090CB09000000000000000000000000000000000000000090DA0A090B0A0A9A90AB0000A00A0000090A00000B00009ADAD0C900A000009000000009BFF9BBFF0FBC909099ACBDBFFFFFBD99CB09A9AC9BCBDBBD0F0F9BCB0909ADACBDAD990B090B90000000000000000000000000000000000009000009A9A9009AA00009A0A00FA000000000000A000000A0000A0BA9A9BC9090000000000000009FFFC909FFC0000000990B9BFFFFFADA9090009900909C0FBC900090BCB09099909ADAD09A90009000000000000000000000000000000000000000B0C9A0B0A090B0A000000B0A0A00A0000000A0000000A00000F0F00B0F0900000000000000BFF90090BFF00000000090FDFFFFDFBCB0E99000B090B9F0FE00000090090000090909A9C90DA900000000000000000000000000000000000000090B909A0F9A0A0A9A0B0A0F000000000000A0000000000000A9AA9BD0B09A000090000000009FBCB0009EF0900000090F9BFFFFFBD9099000B9D00900BFF00000000900090B0A9A9A9CB0B0900000000000000000000000000000000000900090900EB09A00B009A9A0000B00000A00000000000000A000A09E090F0ADAD000000000000000FFFFDA9009000000099A9B0FFFFFBC9A090009000BD009FFC0900000000000909D090D9A909000900000000000000000000000000000000000900DAC9B00A9AB0B0A0A9A000F0A0A000A0000000000000A0000ABFAB0F909A9000090900000099FFFBDA9000000900009C9FBFFFFFFE9DA0F009090A9F000F000000000009A0900B09A0900009000000000000000000000000000000000900009A09B00BE9A00A000B000A00B00000A000000000000000000000009AB0F09C00900000A900000ADBFFFFBD0B0900909C9B09FFFFFFBDA9900900D090090900000000009000900B09E99CA909000000000000000000000000000000000000090009000B00B09A90BA00A090A0F000000000000000000A00000000BAA90F9E9A900000009000009BFFFBFDFFBDF0F0A99A9CBFFFFFF9FF9CB09A90A90090F0F090009000090909090C90A900000000000000000000000000000000000000000000900BD0B0A0A9A0000A90A000A00A00000000000000000A00000A0090A9A090090000000000000BFFFFFFBE9E9B9F9DA9DBBDFBFFFFE9CB0C90099009000909CA9900D99CB09AD0B90B909000000000000000000000000000000000000009000000090A0B0A9ACAB0A90A0000B0000000000000000000000000009A0A9ADBE90000090009000090F9FFBFDF9F9E90B099A9FFFFFBFF9FBC9B00900090B0909A99CA990A0909C9A9CA90C00900000000000000000000000000000000000000000090B0A9A0B00AB0000A000000F0000A0000000000000000000000A9A00009009090000000000009FAF9E9ADA0909009AC9E9BFFFFFBFCBB0C9F0F0B09090BC90B99CB990B0B0090900B0900000000000000000000000000000000000000000000000D0A9A0B000B00A9A0A000B0A000000000000000000000000A0A09A90ADB00009B000090009BFF9E9C9090000090D9B9FFFFFDFFFBD0F9A090900000909A9C9A900E90D09F09A9D09A900000000000000000000000000000000000000900009090A9A090A9A00A00000000A000A00000000000000000000000900A0009000909000000000009FFFF9B00000909ADBAFFDFBFFBFFADAF90090000090909AD09ADBCB99E9A000090A00000000000000000000000000000000000000000000000000A9A0B0A9A00A00A0A0000F0A000000000000000000000000A0A000B0009000090900090900BFFFFFFFBDB9FBFFBDF9FBFF9FFFDFBDFE990090900000090BC90090009090909E090909000000000000000000000000000000000000000000909ADA900B000A00000000000B00A000000000000000000000000B0A9000F00B9000A0900000909FFFFFFFFFFFFFF9FBFFFFFFFFFFBFFBF9EBD0A000000000009A9A9CB000000B0900000000000000000000000000000000000000000000000000090A0A9EBA09A0A00000000F00000A00000000000000000000B0000A090090C0909000000000BFFFFFFFFFFFFFFFFFFFBFFFFBFFFFFDFFFDAF99090900900900D00900909090900909090000000000000000000000000000000000000000009A90A9E9A900AA000000A0000A0A00000000000000000000000A000A00000B009B000090000009FFFFFFFFFFFFFFBFFFFFFFFFFFFFFFBFFFBFFFDEF0B009009009009009CB09000000000000000000000000000000000000000000000000000000009A9A0A0A900A000000000F00A00000000000000000000000BA900A00900B00F090009000909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFBDBCBDA09A09A09A90B00000000000090000000000000000000000000000000000000900009090FA00090000A00000000000B00000000000000000000000000000A900009009009E9A0009009FFFFFFFFFFFFFFFFFFFFFFFBFFFBFFFFFFFFFBFFFFBCBDBC9F0900009090000000000000000000000000000000000000000000000000000900A0900B0A00A00000000000000E00000000000000000000000000B0A00A0000090B00909909009ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADFF9E9B0000090900000900000000000000000000000000000000000000000000000090090DA0B0A90A000000000000000B0A00000000000000000000000A0A000000A9B0090B0BCA00A909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFDFFB9EBD0090900000000000000000000000000000000000000000000000000000000090000B09A0090A0000000000000000F000000000000000000000000000000000000099AD0D09090900BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFBF9EF9009009090900000000000000000000000000000000000000000000000000009000090DA00B0A000000000000000000A0000000000000000000000000000000000000AC9A90B000009C9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBFFFF9DE900900A090000009000000000000000000000000000000000000000000009000090A909A90B0A00000000000000000F00000000000000000000000000000000000090909CB0D0B0009BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFDAF9EB900DA90900000090000000000000000000000000000000000000000000000000000090BC90A00000000000000000000B000000000000000000000000000000000000A90B0B09A90090B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFBF9F9000B0900090009000000000000000000000000000000000000000000000090000090A9AD00B000000000000000000000E00000000000000000000000000000000000090090DAD0900009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBDFDBCB090090909000000000900000000000000000000000000000000000000000000000009C90BA0A00000000000000000000B00000000000000000000000000000000000009ADA90B00F009A9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0BCBD0090B00B09000900900090000000000000000000000000000000000000900000900A90BD090000000000000000000000F00000000000000000000000000000000000A009090BCBD090009FFFFFFFFFFFBFFFFFFFFFFFFFFFFFFBFFFA90F9DB9A090D00900009000000000000000000000000000000000000000000000000000900090F00A0A000000000000000000000A0000000000000000000000000000000000000B0B0F0900B0099BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FF9DA9C0909A90090000090900900000000000000000000000000000000000009000000000BDA9A9000000000000000000000000B000000000000000000000000000000A00000909C909EBD00B0C9BFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFBD909EBDA90009009009009000000000000000000000000000000000000000000000000090090009C00B00000000000000A00000000E000000000000000000000000000000000000009ADB090AD009A0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9FBDB0F0900B900900000909000090000000000000000000000000000000000000000000009BCA9A0000000000000000000A00000B000000000000000000000000000000000000B0A909F9F9A900999FFFFFFFFFBFFFFFFFFFFFFFFFFFFFFFFDA9FADF90009C0000900900000900000000000000000000000000000000000009000090000B00990900A0000000000000000000000A00000000000000000000000000000000000000D0BE9A00DAD090BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF090F9F90009A9090B0090090090000009000000000000000000000000000000000000009AD9E90E00A000000000000000000000000F00000000000000000000000000000000000B09A909E9F9A909A9E9FFFFFFFF9FFFFFFFFFFFFFFFFFFFDFF09F9F9A900090009000009090000900000000000000000000000000000000000000000000A09009000000000000000000000000000A000000000000000000000000000000000000009E9E9A9C9E90909BDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9E9ED000909000900900009090000000000000000000000000000000000090000000099D0A9A0A09A00000000000000000000000B00000000000000000000000000000000000A09A909F9E9A90F09BCBFFFFFFFDBFFFFFFFFFFFFFFFFFFFFBC09BDA90909A00090000090900A0900009000000000000000000000000000000000000BCA009C9000A000000000000000000000000E0000000000000000000000000000000000099AD00B0A9E9E90BC0B9FBFFFFFAFFFFFFFFFFFFFFFFFFF9FC99FDA9000090909000909A0009090009000000000000009000000000000090000000090090B0B0A009000000000000000000000000B000000000000000000000000000000000A0A0DAFD099E909E90BD0F9FFFFFFDBFFFFFFFFFFFFFFFFFFFBF009A909009E0009A9000090900000000000090000000000000000000000000000009A0F009CBC000A00A0000000000000000000000B000000000000000000000000000000000090B09A9AC99FA99AD0B9ADABFFFFBFFFFFFFFFFFFFFFFFFFFDE900D0009009900000090900090909009000000000000000009000000000000000000D9009A90B00090000000000000000000000000E000000000000000A000000000000000000000DADADB0E9DAD09BC09BDF9FFFF9FFFFFFFFFFFFFFFFFFFAF099B09000B000909000009090000000000900090000000000000000000090000000B0AD0B0DA00000A000000000000000000000000B00000000000000000000000000000000000A9B0BDB0E9FADA9BCBDBCB9FFFF0FFFFFFFFFFFFFFFFFBF9FD0BC0009009009A900090900A09A9000900000000000000000000000000000000099C090B0DA9A09A00000000000000000000000000A00A0000000000A00000000000000A0000000009CB0F9B09F9E9B0B09ADBFFFFDBFFFFFFFFBFFFFFFFFFF0C0B0B000909000009000009090000900000090000009A0090000000000000000000BDA9C9A000A0000A00000000000000000000000F0000000000000000A0000000000000000000BCA9CBCF0F0BCBCE9CB0DADBFFFADBFFFDFFFFFFBFFFDBDFB09C909009E0900900090900009090000000000000000900009000000009000000B0009A0F9A009A000000000000000000000000000B00000000000000000000A00000A0000000000090B9B0F9E909B99A9CB9A9FFBDBFFDFBFFFFFFFFFFBEFBC9A900000090009000000009090000090009000009000000000000000B0000000909E90D90009A00000000000000000000000000000A0000000000000000000000A000000000A0000B000C0FDA90BCBCAFDB90FDFBDCBFFFFFFFDFFFDFBDFDBC9090B090090909009090909000A9000000000909000A900009000000900000009ADA90F00A0B0000000A00000000000000000000000F00000000000000A000000000000000000000000B0909ADF090DBD9A9E99A9FFB9FFBFFBFBFBFBFDAFBDB0000000090A0000000000000090009000009000A0090000000000000C90000900909E90B00000A00000000000000000000000000000B00000000000000000A00A000A000000000A000000A909ADF0B0FADDA9EBDA9FED9FF9FDFFFFDFAF9DAFCB0090000090900900000900900900000900009090000009000000090A00000009A090E900A9A0000A00000000000000000000000000A000000000000A000A0000000000A000000000A009000A9A0F0F9FAB9C90B9EDB9A9FFFBFADBFFD9EBDB9C090090090000900009000000000000000909000009009000900000090000000AD0F090A90000000000000000000000000000000000F000000000000000000000000000000000000009A009E9C9F9F0F0D0DA9E9C9B9E9FFDBDFDFFDB9A99F9E90000000000900000000009090090009000A000000000000900000090000000990B09A000A00000A0000A0000000A00000000000000A00000000000000A00000000000000000A0000000B0090B00B0F9FAFAD09A9E9E9ADBBEFBF9FBED0FF0F0000900009000000000009000000000000909000009A90000000009A0000900BCAD0A00A00000A00000000000A00000000000000A000B00000000000000000000A0000A00000000000A0000B00090CBCAD9F9A9C90909C9ADF9FDBF0F9A90BD9F00000000090090000000000000000900B00C09090000000900000090000009090A90B009A0000000000000000000000000000000000E000000000000A00A00A0000000000A0000000000A9009E0B09F9AF0DF09ADA9A909B0F9ADAF9E99F9A909090000000000000000000900009000900B000000900090000009000009009E0900A00B0000000A000000A00000000000000A0A0000B000000000000000000000000000000009000A000000B00909ADAD09A09A909C90E90DB0FDBDBC9E9A9DA00000009000000000090000009000A900D09009C90E900000009A0090900DA09A0B09A0000B00000000000000000000000000000000A00000000000000000B00000B000A0000A0A009000B00900C000BEDADBC9CB0009090BC9B0BC9B090DA090000000000000000000000000009090E9A0090A0A900000000000000000B00B0B00A0000A000A0000A0000000000000000000000000B000000000000000A000A0A00000000000009000A000A00B009099A90F0B0CB0B00090BC9D0BC9ADB0900000000000000000000000000900000900900090900900000009000900BC0B0B00F09A9A00000900A000A000A000000000000A000A00E000000000000A0000A00000A0A000A000000A00000000900B00009E90FCB09C0090E909A0BC9A9009000000000000000000000000090000B09A9D0B9E0000B00000009000000F00B000F0A0A000900A0A00090000000000000A000000000000B000000000000000000000000000A000A00A0000000000009009E9E90F0B0D0A900A90000909AD090000900000000000000000000000A09D0DAC9A00000009C00000900A009E900B0BEB0A909A9A0A09000A00A0000000000A00000000000000A0000000000000000A0000A000000090000000A000A000000090090CB0C9CBC9C9FD0009000009E000000000000009000900000009090900B0900090D009E9000000A0909A09A9B0A90090A0A000000A00000000000A000000900000090A0000F0000000000000000000A00000A000A00000009000000A00000B00B0F9B0B09A000AD00000090090000000000900000D009009000A00D0B0090BCBCB00B00000000900000DAD0ACBCA9A0B09000A9A000A00B0000000000000A0A00000000000A00000000000A000000A09000A000A000A000000A00000900000000900C00DAD09FF00000000E9000000000000009CB0000000090909A90DADA90900090000009000009CB090B0B0A90E9ACA0B000009009000A0000000000000000000A00000B0000000000000A00A900A0A000000000000A9A00000000A0000909A0FBC9A90FF000000000090009090000090C9A0000B00BC9A9E9E90CB000000000009009000009B0B0D0A0B009AA900B000A9A00A00A00000A000000000000000A0000000E000000000000000000A90000009A00A0000000000000A09A9000009090B0DCB00F090000090009A0009009000B00909000900BC9009CB0000000000000090A000900C9CB0B0DA9A0900B009A9000000B00A0A000000000A00A0000000000000B0000000000A000000000A00A000000000A0009A0000000000A00000000DAA9CB00009CB00C9AD0909E090CB0000000099E0F9000BCA0000009000000900A90000E9A9A9C9EB0000BCB00A000A0B0A00000900000000000000000000000A0000A0000000A00000A0000A009000A00A09A090A0000A0000000A90000090F09D0BC90B0E90FDBAD0ACBC09A0900D0D0B0F0E90000BC009000090000000900D00090900D0DA9B00B0FB0A00B0B0A090009000A000A000000000000000000A000000F000000000000000A000000A00000000000000A000000000000A0A000A0900A09AD009BE9A0C9AD9C0B0C9009A90BC90090D0E90090000000000090F00B00000A0BDA9A9AC0BCB0000B00000900A00A0A000A0000A0000A00A000A0000000000A00000A0000A000000000A00A000B00A000A0000000000000000000B0900B0D9EDA0D009C9DBC9A0B9CB0EBDADAD00AD000A9000000C009000000A000D000009C9009E9E9A90A0B0B00A9A9A0B00A00090A00000000000000000000000000000B0000000000000A00B00000900A000090A00000000000A00000000000A000A0B0FDAAF0F0A00ADDACB0D90E90000AD000AD00000009A000000000909A0090B00B0F09B09A0A9000A0B0000000000900A0090A90A000000000000000000A00000E0000000A0000B00000A9A0A000000A000000A000009000000000000009A0900B0BDD0D09D099A0BD0E0AD000009000009000000000090000000D0E0090A0C90C90BE0A00900A9A0900B0A0B0A000A000A0000000B0A000A000A0A0A00000000B0000000000A0000A00000000000A0000000000000A00000000000000A0090A0000FABEBEACA0C9C0A9090000000000900000000909000000909A90900C909ADBAF0090B0A0B0009A0A00900009A0009A90A0A00000000000000009000000000A000000000000A0000A9A9A00A000000A00A090A00000000A00000000000A09A9A909C9C9DBD09A09C00CB000000090000000000000000000AC00000D0BCBC9A090B0A000900A9A0009A0A0A9A0009A00A09009A000000000000B0A000000000B00000000000009A000A000B0000000900000A0000000A000000A0000000000000A0A9A0A00BE090A90090F090900A00000000000000000BC9090900A9090BE9AAC090A9A0A90000A00090B0009A000B09A0A000000A00000000009A00A00000E00000000000B0A000009A000000A00A000900000000000000000000000000A00000900909FC9CADC0F00009E000909AD0A000000009CB0000A0AC9E90F0F0B0D0B0A0900900A09000A9E000B0A00A000A0900A00A0000000000A9A000000000B000000000A000000A90A0000A00000000A0A0000000000000000000000000000000A00A0A0BFADB0B09CB0F00C00000009000009ADA00C9CB09C9A90F0BA90A0B0B090A0A0000A0B09A009A00000900B000A90000000000000B0000000000A0A00000000000A0A00000000A000B00A900000000A00A00A00A000000000000000000000009000DADEDE0AC90F9B000000000909BC909F09A90D0B09E9AF0DA09A0000A00000A90000A00B0A90A09A0A00900000000000000000000A0A0000090B00000000000000900A0A090B0000000A00900A000000000000A00A00000000A00000000000B0B0B0BD090000ACBCB09090DADADAFCA9E9CB0AD0FE9E90BA9A09A9A000000000A09A9A00B0AF9A00000A0A000A00000A000A00000900000A000E00000000000000A0A0909A000B0A90000A0000009A000000000000000A0000000A00A0000A0000000ADA0B00D90F0DADAFADADAD9BDE9FADFDAF09A9A00000000009A00000000000A0B00BB0A00B0B00000000000A0000000000A000000000AB0000000000000A000000A0A9A0000A00000A009A00000000000000000000A00000000000000A9A0B0900D0DB0ACB0F9E90D0F9ADAE0BDAD9A0B09A000000B0A00B0A000A90000B0B090A9ACB09A00009000000000000000000A000A000009A9A0000000000A0090B00A9A90000B00090A9000000000A09000000A0000000000A000090A000900000000B09A0D09C9ACBCB0B0ADAD9F0A90A0B0A09A9A9A0000B009000000A0A00000A00A9A0A009A0A0A00A000A0000000000000000000A000B0000000000000A0000000A0A900A00A000A9A0A000000A000000000A00A000000000A00000A00B0A0B00A09A09A009000000D090A009000900000000009A0900A0A0B00000090A9A90A9009009A009000000000000B000000009A90A0000000E000000000000000A000A90090A9000009A9009000A0000000A0009000000000000A0000000000009000900A09A0900A9A009A0A090A0A9A00090A00A00000A000000000A9A9A00000A90A0A00A09A0A9A090000A9A00A000A00A00000000A00B00000000000A00000A900A0A00009A0B00A0A00B00000000000A00A0000000000000000A0000009A0A0A0B09A0A00B00090A09000A909AC0A0A090009A00000009A9A0B0000009A0B00A0909A90A009000A0A090000B000000A90A0000A0000A0000000000000A00000A0900B00A0000A90900000090A00A00000000A00000000000A00009A0A0009090000A909000000A09A00B090A00B009000A000000B00A00000009A0A0A0000B090A0A0A009AA0B000000A00BA0A00000009A00000B00F00000000000000000009A0A00A90B0B00A0A0B000A0000000000000900A0000A00000009000090A0A000B090A000B000000A9A00A0B0B00B0A0B009A000000900A9A0A9A90090A9A00A00000909A090000A90009A0090000000A00000000000A0000000000000000A0A00090B0A00000B090000B00000B0000A00A0000000000000009A0A0900A9000A000A000A000B0B0090000900000B009000A000B0000A00000900A0A9A09A0B090B0B0A0A09A09A090A0A0000A0000A00000000000A00B000000000000000000900B0A0090A0B0000A90A0090A0009A0000000A0000A000000A00000A0A0000009A0090000A00000A0A9A00A0B0B0000A9A9000000A000009A0A9009009A9000A000009009A0BA00A0009000000A0000000A0000A0000E00000000000000000A0B0000B0A0900B0A90A0900A0000A0000090009000090000A900000900900A90A09A000A09000A00090000000000A0A900000B0A00090A0A000000A0A0A0A9A90A0A9A0A0A0BC9A900000A000B000000A0090A00009A0B000000000000000000000A900090A00000000A0000009000000A00A0A0000000A0000000A00A00000000000A000A00900000A000000009090A00A00009000A0900000000090900000A09000000090BA00A0B0A090000A9A00000A000000A000A0000000000000000000A900A9A0A90B0000B000A90A00000A000000900A000A0000A000B00090A90A09A0000090000000A00000B0000A0A0009A90A0A00A000000A09A090A0A0A90B0BA0A0B09A0A09A9000000A000A90000009000000009A0F000000000000000000000A000009A000B00009000000A00900009A000009A00009000A0000A000000000090000A000A000009000000B009009A0009000000B0A00000000A009090A0B0090000A0909A00A9A0A900A0B0A00000000A00000A00A0000000000000000000000A9A9A00B000A0000A00A9000A0000A0000A00000000A000900090A00A09A000A00A000B00000000A00A00000A0A00000A000000000B000A0A0090A00A9B0BA0B0B000A0ADA9000900A09009AB00A00A0000000000B0000000000000000000A09000A9A00A900B00000000000000B0000A900A0090A000A00A0A0000090009A000000000009A00A000000B0000090A9A009A000A0B00A0090900A900A0ABADB00A0B090A900A0B0A0000A0B0BCB000000000000000E000000000000000000000A0009A09A90A000A000000A000000009A000900A000000900900009A0A0A00000A90A900A00000000009000A9000A0009A000A9000BA90A0A0A000A09090BA0AB0000A09A0B000000B00000A9A0000009A00000A00B00000000000000000000000A9A09A00A09000000A0000A00A00A0000A009000000A00A0000A0090090A000000000B00A000000A0A00000A0B090A000000009ABCA0009009A0900A0FA00909A0B09A0B000A09A00A09A9A0A0000A0000000000A0000000000000000000000000DA009A9A0A00000000000000000000900A00A00A9000000A9000000000B0B0A00A00090000A009009A0B00000A90A00000A0A90B009A0A000A0A09A009A0A0900A09AC0B09A09A09A0000090A00000A00A0000B000000000000000000000A9A0A9A000090000A0000A00000000900A00000000000A090A000A9A0A0A00000090090A0A0A00000000000000B0B0A909A000900A9A90A909A09090A09A0A9000A090A09A00A00A0B0000A0B0A00B000000000000E0000000000000000000000009A0009A9A000000000000000A00A0000A900000A0090A009000000900900A0000A00900090B00A0A9A09A0B00A9A0A000A0000000AADA0A00A00A90A0900E9A90AC90A09A90B0900A9A90009AB000A00000A000B0000000000000000000A00A9A009A000000A000000000A0000000A0000A09A0090A00000A900A00A00A900A0090A00B00A009000000A0000A9000000000A0B0A9A90A900000A90A90A0A9A00A9A0A09A00A000A000000A9E000A0000A00000BA000000000000000A000090000B000A00A00000000000000000A09009A00A0000A0000A0000A090900000A09A0A00000A0000A00B0B090B0B0A9A9A9A0090000009AA9A9A9A90A90A09A9A9A900B09A00B090A0009A0B09A9A00000009A00000F000000000000000000000A9A00A0000000000000000000000000A00009090A9000B0900B0090A0A09A9090000090B0009A90000000A0000009A000000A000009A090A00000A90A09A000009A090AA0B00A009000A090A00A9A090000000000AA00000000000000000000A0000000000000000000000000000000000A0A00A00A9A00A0000A000000A00A0A9A9A0A00B0A00A9A9A9A90B0B0B09A9A00B00A00A00B0A9A9A0B00B0B09A9A9A00BA909000B00A0A0B09AB0BA9A000A0B0A0000A9B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A000A00A000000000000000000000B00B0A00A000A00B000A0A9A000000000A000000000000000000000000000000000000000000105000000000000DFAD05FE,'Laura received a BA in psychology from the University of Washington. She has also completed a course in business French. She reads and writes French.',2,'http://accweb/emmployees/davolio.bmp') +GO +INSERT "Employees"("EmployeeID","LastName","FirstName","Title","TitleOfCourtesy","BirthDate","HireDate","Address","City","Region","PostalCode","Country","HomePhone","Extension","Photo","Notes","ReportsTo","PhotoPath") VALUES(9,'Dodsworth','Anne','Sales Representative','Ms.','01/27/1966','11/15/1994','7 Houndstooth Rd.','London',NULL,'WG2 7LT','UK','(71) 555-4444','452',0x151C2F00020000000D000E0014002100FFFFFFFF4269746D617020496D616765005061696E742E506963747572650001050000020000000700000050427275736800000000000000000020540000424D16540000000000007600000028000000C0000000DF0000000100040000000000A0530000CE0E0000D80E0000000000000000000000000000000080000080000000808000800000008000800080800000C0C0C000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00D999D999999D9D999DB99DD9F9D9D9D99D99D9F9D999BD9FD9D9D9D9D9DFD9F9F9DBDBD9DBD9DB9FD9FDFFFFFFFFFFFFFFFFFFF9D9F9DB9D9DFD9DB9F9BDF9F9D9DBD9BD9F99DBD99999999D9DBDBD9BDDD9F9DBDBD9F9D9D99D9BD999D99D9D99DB99D999D9F9D9F9D9D9999D9B9BDBD99F9D9999D9DBD9FDBDBDBDBDBD9F9D9DBD9D99FD9F9DD9FDD9FFFFFFFFFFFFFFFFFFDBDF9DBDD9F9DBD9DD9DD9D9DDBD9D9DD9D9D99D99999D99D9F9D9D9DD99BD9D9D9D9F9DBD9FD9DD999DB9DBD99D99D999D999D9BD9D9DBDBDD9D9DD9D9DD999999999FD9F9D9FD9D9D9D9F9D9F9D9DBDF99F9DF9F9F9FFFFFFFFFFFFFFFFFFFFD99DF9DB9DF9D9D9F9F9F9F9BD9F99F9F9DBDF9D99D999D9D9D9D9F99BDD9D9F9F9F9D9D9D99BD999999D9D9F99D999999D9F9D9D99F99DD99B9D999D9B99D999D9D99FD9DBDD9DFDBDBD9D9D9F9F9D99DF9FD9FD9FDFFFFFFFFFFFFFFFFFFFFBDF99D9DFD9F9DBD9D9D9D9DD9D9DD9D9D9D99F99999999B9DBDBD9D9D99DBD9D9D9D9F9F9D9D9BD999D9F9D99DBD9D999BD9D99D9D9D999D9D99F9F9D9DB9D9999BD99F9DDB9F99D9DD9F9F9D9D9DBD99D9DBD9FD9FFFFFFFFFFFFFFFFFFFFFD9DDBDB9DBD9F9DBDBDBDBD99F9F99F9F9F9D99D9999D99D99D9D9DBD9F9D99F9DBDBD9D9DBD9DD9F99999DBD9999999F9D9DBD9BDBD9FD9BD99D9D9D9D9D999999D9DFD9F9DD9DF9F9DBD9D9F9D9D9D9FDF9DFD9FDDFFFFFFFFFFFFFFFFFFFFF9F9D9DDBD9F9D9D9D9D9D9FD9D9DF9D9D9DBD9F999999D99D9DBD9D9D9DBD9D9D9D9DBD9D9D9B9D999D9D9D99D9D9999D9F99D9D9D99D99D99F9D99DB999999D9D9DF99F9DDBDF9D9DBD9D9F9DBDBDBDDB9DBD9F9FFFFFFFFFFFFFFFFFFFFFFFD9FDBDBDBD9D9DBDBDF9F9D9BD9F9D9F9F9D9D999D9D999DBDBD9F9DBD9D9F9DBD9F9D9F9DBD9D9D9999BD9F9B99999D99D9D9BD9D9D9BD99D9D9BD99D99D999F9F99FD9DBD9D9D9F9D9DBD9D9D9D9D99DDBDF9DD9FFFFFFFFFFFFFFFFFFFFFF9F99D9D9DFD9F9D9DD9DD9FDD9D9DBD9D9D9DBD999999D99D9D9D9D9DBD9D9D9DBD9F9D9D9D99D9F999D9D9DD9D99999FD9F9D9D9BDBDD9DF99F9D9D9BD99999D9DD9D9F9DBDBDBD9F9F9D9F9F9F9DBD9BDDBDF9FDFFFFFFFFFFFFFFFFFFFFFFDDF9FDBD9DBD9DBDB9F9BD99F9F9D9D9F9DBD9FD999D9BD99D9F9DBD9D9F9DBD9D9D9DBD9F9D9BD9D99999F99D999D9D99D9DB99FD9D99D99DD9D9DB9D9999DBDDB9DBD9DBDDD9D9D9D9DBD9D9D9DBD9FD9FD9DF9FFFFFFFFFFFFFFFFFFFFFFFFBDD9DD9F9D9D9D9DD9DD9FD9D9D9F9F9D9D9D9999D99D9D99F9D9D9F9D9DBD9F9DBDBD9D9DB9D9F99999D9D999999DBDF9D99D9D99D9F9BDDB9DBD9D99D9D9D9B9DBD9DBDDB9F9F9F9FD9D9F9F9F9D9D9FDBDF9DFFFFFFFFFFFFFFFFFFFFFFFFD99F99F9DBDBDF9F9FDB9D99F9F9D9D9DBD9F9D9999D999BD9D9F9F9D9F9D9D9DBD9D9DBD9DD9D9D999D9D9D999D99D99DB9DBD9D9F9D9D99DBD99D9999B9DBDDD9DDF9DF9DDD9D9DD9BDBD9D9D9DBDBDBDDBDFFFFFFFFFFFFFFFFFFFFFFFFFFDFD9FDDBD9D9D9D9DD9DF9FD9D9F9D9F9D9D9F99D9DB9D9D99BD9D9DBD9DBDBD9DD9DF9DBD99F9F9D9999F999999F99D9D9D9D9DBD9D9D9FD9D9D9BD9D99D9D9BD9B9D999F9F9F9F99DD9DBDBDBD9D9D9DBDD9DDFFFFFFFFFFFFFFFFFFFFFFFFF9FD9BDDBD9F9F9F9BD99D9F9D9D9F9D9DB9D9D99B9D99D9DD99F9D9DBD9D9DBDB9F99D9D9F99D9DB99999D99999D9F9F9DBD9F9D9F9F9D99D9DBD99999D9DBDDD9DDBDFD9D9D9D9DF99F9D9D9D9F9F9F9DF9F9FFFFFFFFFFFFFFFFFFFFFFFFFFD9DFDBDD9D9D9D9DD9DF9D9DBD9D9D9BD9D9F99D9D9F99F99D9D9F9DD9F9F9D9DD9DF9F9D9DD99F9D99D9999D9F9D9D9D9D9D9D9D9D99D9F9D9D9D999D9F9D99B9F99D9D9F9F9F9F99F9D9F9F9F9D9D9DF9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBD9DB9F9F9FDBDBDB9DBDBD9F9DBDD9D9F9D99999D9D99D9FDBD9F9BD9D9DBDBDB9D9DBD9B9D9D9999BD999D9DBD9DBD9DBD9DBD9D9F9D9BD9999D9BD9F9FDD9DFDBDBDD9DD9D99D9DBD9D9D9DBD9DBDF99FFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBDFDD9D9DD9D9D9DD9D9D9D9D9D99F9D9DB9D9DF9D99DBD99D9D9DDDBDF9D9D9DD9F9D9D9D9F9D999D9999BD9D9F9D9F9D9F9D9DBD9D9D9DF9D99D9D9DD9BD999DD9D99F9DBDFD9D9D9F9F9D9DBDBD9DFDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD9DB9DBDB9F9F9F9BDBD9F9DBD9D9DDB9DD99999DBDD999D9FDBDBD9D9DBDBDB9FD9D9F9DBD9DBD999D99D9D9D9D9DBD9F9D9DBD9D9F9D999999D9D9F9BDD99DF99DBDF9DBD999F9F9D99D9F9FD9D9F9DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9BDBDD9D9DD9D9D9DD9D9F9D9D9F9D99D99F9D9DDD99BD9DBD99D9D9F9F9D9DDDD9DF9F9D9D9DBD999D99D9DBDBD9F9D9D9DF9F9D9F9D9BD9D99D9BDBD9DD999F99FD9D9DBD9D9D9D9D9FD9F9D99F9F9FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDD9DB9F9DBDBDF9F9F9FD9DBD9D9F9D9DF999F9B99DD9D9D9FD9DBD9D9D9FDB9BDB9D9DF9DBD9DD999B9B9D9D99D9F9D9F99D9D9D99D9D999D9BD9D9DD9BD99DDD99F9F9D9DBDBDBDBD9BD9D9FD99DFD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9FD9D9F9D9DD9D9D9DD9F9DBD9D9F9F99D9D99DDF99DB9D999F9DBDBDBDD9DDD9DD9FD9D99DBDBD99D9D99F9DBD99DBDDDBD9DBDD9BD9F999D99D9F9BDD999B9DF9D9D9DBD9D9D9D9FDD9F9F9FDF9FFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD9FD9D9DBDB9F9F9F9BD9D9D9F9D9D9D9F99D999D9F9D9BDDD9D9D9D9DB9F9BDDBDF9BDBD9D99DBD9999DF9D9D9DF9D9F9D9F9D9BD99D99D999DBD9DD9BD99DD99D9F9F99D9BDBDBD99BD9D9D9D99D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F99F9DBD9DD9D9D9DD9F9F99D999D99DD9DBD9D9D9D9DD9B9DBDBDBD9DD9DDDBD99DD9D9F9DDBD9999DF99DBDBD9D9F9DBD99D9DD9D99D99BD9DDBDBDD999DB9DBD9D9DDBDD9D9D9FDD9F9F9F9BDFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9DBD9DBDBDBDBDBD9D9DD9FDF99F9BD9D9DBDBD9F999DD9D9D9D9F9F9F9BD9FDDBDBD9DB9D9D99D99DF9D9D9DBD9D9D9D9F999DB9D99D9D9F9D9D99D99D9D9D9DBDB9D9BDBDBD99BD9D9D9DD9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9F9F9D9F9D9D9DD9D99F9F9BD9999D9DDB99F9D99D99DBD99BD9BDBD9D9DDDDBD9F9DD9DBD9DBDBD9DF9D9DBD9F9DBD9F9DBD9DF99D99F99DBD9DBD9DB999BD9DBD9D9D99D9D9D9DFD9F9F9FDBD9FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD99DBD9F9F9F9F9FDD9D9DD9DD9D9999D9D9D9DDBDD9D9FD99DD9DBDBDB99FDBD9F9F9D9D9D9D9D9BDDBD9D9D9D9D9F9D9D9D99D999D99D9D9F9D9BD9D99D999D9F9D9F99D9F9F999D9D9D9DD9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9DBD9D9D9D9D9D9DBDBD99F9BD9F9DDF99DBDB9D9BD9D99DDB9D9D9D9DDF9D9DF9D9DBDBDBDFDBDDDBD9F9F9F9F9F9DBD9F9FD9F9D9D9F9D9D9F9D9999D99DF9D9DBD9DBDBD9D9DDBDBDBDB9F9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9F9D9F9F9F9F9F9F9D9D9FD99D9D9DB99D9D9D9D99D9DB9DB99D9F9F9F9F9F9DF9F9DBD9D99D99DBF9DF9DD9DD9DD9D9D9D9D99D99F99D9D9F9D9D99D999BD99DBD99D99D9D9DBDB9D9D9D9DD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9DBD9D9D9D9D9D9F9F9D999D9F9999DF99F9D9F9F9D99D9D9DBD9D9D9D9D9FD9D9FDD9F9DDBDFDDDF9DF99F9BDB9F9F9DBD9D99D99DBD9FD9F9D9DB9D99D9D99D9FD9F99F9F9D9D9F9F9F99F9BDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9DBDBDBDBD9F9D9D9F9DDF9D9DFD99DF9D9BD9D9DBDDBD9D9D9DBDBDBD9F9BDBD9BD9D9B9D99BDF9DF9DF9DDDDD9D9DD9DBDBD99D9D9D99D9DB999D999D99BD9D99D99D9D9DBDBD9D9D9DF9DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9D9D9D9D9F9DBD9D9DB99D9D999D99D99DD9F9D9D999DB9D9F9D9DD9DBDDD9D9FDDF9DDDBDFD9DDF9DF9DBDB9BDBDB9F9D9D9D9F9DBD9FD999D9D9999F99D9DB9D99DBDB9F9D9DBDBDBD99F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBD9F9F9F9D9D9DBDBD9DD9F99DDB9DB9DB9D9DBDBD9D99D9D99DBDBDBDDB9F9FD9F9DBDBD9D9F9F9F99FDD9DDD9D9DD9D9D9DBD9D9D9D99F9D9D9BD9D99D9D99D9F9D99DD9DBD9D9D9D9FD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9F9DD9D9F9F9F9D9D9DB9D99DB99D9D99DF9F9D9D9F9FD9F99D9D9D9DF9DD9D99F9F9D9DBDBDDFDDDFD9F9DB9FDBDBDF9F9F9D9DBDBDBD99D999D9999D999BDDBD999D9BDBD9DB9DBDBD9BD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9DBDBD9D9DD9F9F9F9DF9DF9D9D99FD99D9D9F9D9D999D9D9F9BDBD99F9F9FD9DD9F9FD9DDBDDBDBDBD9DBDD9DD9D9DD9D9D9F9D9D9D9D99DBD99D99BD9FD99D9DDB9D99D9F9D9BD9D9FD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBDBD9D9F9DB9F9D9D9D99D99D9F99D99D999F9D9F9DBDDB9F99DD9D9FD9D9D9DF9BDD9DBDF9DFFDFDDDFDF9D9F99F9F9BDBD9F9D9F9D9DB9D99D9F99DD9D999F99B99D9D9F9D9BDDDBDBD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99D9D9F9D9F9DD9D9F9DBDDBD9D99DB9D99FD9DBD9D9D999D99D999F9D9F9F9DB9DDDBDBDF9DBD9F9F9F9D9DF9DFD9D9DDD99D9DBD9D9F9D99D9999D999B99DD9D9D9D9DBD999DD9B9D9D9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF9DBD9F99D999F9D9D9D99D9B99D99DB9D99F9D9DBD9D9D9D999FD9DBD9D9F9DDBDBD9DD9FDFDFDFDF9FDF9DF9DBDBDB9FDBDD9D9DBD9D9D99F9D9BD9D9D9B9D9D9D9B9D9DDB99DD9F9F9DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DBD9D9DDF9DF9D9F9DBDF99DDD9B9D9D99D99DBD9D9F9F9F9DF999D9D9F9D9F99D9DBDBDF9DBDDBDBDFDBDDBDDBDDD9DD99D9BD9DBD9D9F99D9D99D999D99DDB9F9BDD99DB9D9DB9F9D9DBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9F9F999D99DBD9D9D99DF99BD9D99D999D9F9D9F9D99D9DB9D9F9F9F9DBD9DFDBDDBDD9FFDFFFDFDF9DDBD9F9DB9FDB9DF9DDBD9D9BD99F9999D999F99D999D99D999F99D9DBDD9DBDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDBD9D9FDF9FD9DBDBD9FD99DD9D999F99DB9D9F9D9D9D99D9D9D9D9D9DBD9DBD9DDBDDBDBD9F9DFDBDF9FDF9DF9DD99DD99DB9D9D9DD9D99D9DB9D999D99DBD9D9D9D99D9999D99F9D9DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9DBD999D99F9D9DBD99FDB9D9BD9D999D99D9DBD9F9F9F99F99DD9F9D9F9D9F9FDDBDFDFFD009FDFDF9FDF9DF9DFDBDF9DD9F9F9BD9F9D999D9BD9D9D99D99F99B9D9BD9F99F9D9F99FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DB9DBDDBD9D9D9D9D9D999D9BD99D9D999D9BD9DBD9D9D9DD9DB9BD9F9DD9F9DF9F9DF9FDFF909BDF9FDF9DFD9DBD9D99DB9D9D9DD99D99F9D99D99F99BD9F999D9DB9D9999F9DBD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DD9D99D9FD9F9BD9F9DD99D99D9B9F99DB9D99D9DBD99F9BD9D9D9D9DBDF9FD9FDFD9FDBDF09909FFFDBDFDBDFD9F9FDF9DF9DBD9BD99D9999D99D999D999D9D9D99D99D9D9D9D9FD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9DB9DBDBD9999D9D9D9DB9DB9D999D99D99D9DF9F9D9F9D9D9D9D9F9DBD99DD9F9DBDFDFDFD90D999DDFDF9FD9DBDD9D99D99D9D99D9DB9D9F99D999D999D9999B9999D9B99F9BD999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99D9D9D99DFD9D9BD999D9D9BD9D9D999D9B99D9F9D9DBD9DBDBD9F9DDFDF9FDDFDBDBFDFF0B00D09B9FFD9FF9DBDBDF9FD9F99FD9D9D99D9D9B9DB9D9B9D9F9D99D99D9D99DDBDF9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DDBD9D9F9999F9D99F9DB99D99999F99D9D9D9D99DBD9D9F9D9D9D9DB9DBDF9FF9FDFDFFDFC9D9099009DFFD9DF9DD99D99D9DF99F9D99D9999D999D99D9999999DB999999D99D99DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9BDDB9D9D9D99DBD99D9D9D9D9D9BD9DB999DB9DDBD9D9BD9DBD9F9FDDBD9DFD9FDF9FDFFF9B9099C900BD9FDF9DF9FDF9FD9D99D9D9BD9B9D99999999999D9999999DBD9D9BD99F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D999DB99F99D999D9D99DB99B99D9999D9D99D999D9F9D9DBD9F9D9DBDDFBDBFDBDFDFFFD00E909909009F9FDF9D9D99D99DB9D99D9D99D99D999D9999D9999D99D99999BD99FD9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9F9D9D9D9BD9D999BD9DD9D9999D9D9DB9D9BDDB9D9D9D9D9D9FDBDDBDDFDDFDFFDFDFFB990DA9D0900099B9FF9DFD9DBD9DBD9B999999999D999D99999999999999D9D9D99D99FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9BD999D9999D999DBD9999999D9D9BD9B9D99D99D9D9F9F9F9F9D9FDBD9F9FBFDF9FFDFDF00CB990990DB00009D9F999F9D9D9D99D999D99D9999999999999999999D99999BD9B9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9F99DBD9DBD99999B9999999BD99D99D9BD99DF9D9D9D9D9FD9FDDFDFDDDBDFDFFFFF9DB000990F00009E90BD9FD9D99F999D99D9999999999999999999999D9999BD9D99DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD99BD99F9D999999999D9DBD999D99D999DB9D99F999D9F9F9F9D9FD9F9F9FFFFFDFFDFDFDA909090999000090909999DBD999D9999999999999999999999999999999D9999F999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D99D9999999D999D9999999B99D99D9F99D99D99DDBD9D9DDF9F9DFDFDFDBDFDFDFFFFF09000909090099009000999999D999999999999999999990990999999999999D9D9D99FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999D999DB999999D99999D999F9999D999F9D9B9DBDBDB9DF9F9FDBDFDFFDFFFDFFFF909A9090F09D000000900099999999999099999909999999909909999999D99999999DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9F9999D99999D99999D99999999D999F9D999F9D9D9D9DDBDDDFDBDF9FFDFFDFFFFF99000000C990B0900900000009999999999909999999099090909999999999999BD9F9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999D99999D999999999D99D9D999D999999D9D9DBDBDDBDDBF9FDFDFFDFFDFFFFD9D9A0009DB0090000000000000000000099999909999999090909090909999999D99999DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9999D99F99D999999999999999999999999D9DBD9BD9D9F9D9FDDF9F9FDFFDFFFF9B9BF9C900E909099009A900000000000000000099909090990000909999999999999999D9BFFFFFFFFFFFFBFFFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9B99999999999999999999999999999999999D9DBDD9FFD9F9DFDFDFDFFFFF99DC9D0900B090000900000000000000000000000000909090000900909099909999999D999DFFFFFFFFBFFBDF9FFDFF9FBF9FFBFFFFFFFFFFFFFFFFFFFFFFFD9999D99999999999999909999999999099999D99D9D9BD9DBFDFF9FFDFFFF999C9A9FF9909090A0990090900000000000000000000000000000000090909909999999999999FFFFFFFBFFFBFFBBFBFFBFBF9FB9BDBDBF9FFBFFFFFFFFFFFFFFF99999999999D9999909999990990999999D99BDF9F9FDFDBDDDBDFFDFFF909F09FDFF990B00B09000990A000000000000000000000000000000009009990999909099999999FFFFFFDF9FBF9BDFFFBBDBDBFBDBF9BBDBFBDFDBBDBFFFFFFFFFFD99D999999999909999999999090909999999D99D9D9D9BDDBFDFDFFB909909DF9BDFF9D09000B0900B90900000000000000000000000000000000900909090999909999999DFFFFBBFFBDFFFBDBFDFBFBDBFBDBFDBDBDBBBFDBFF9BFBFFFFFFF9999999D99909999990990909090990999999D9F9F9FDDBDDFFFF090900090B9C9B9D909000909E9BC09000000000000000000000000000000000009099909909990990999FFFFB9DB9FFBF9FBFDBBDBDBDBDBF9BFBFBDFDBFF9FFF9FBDBFFFF999999999999999909990999999999999999DBD9D9D99FDBF999099000900B0DB0D0B09090D000900990000000000000000000000000000000000000090099099099909909FFF99FBFFFBF9FBF9FBDBFBFBFBDBBDF9F9FBBBF9FBF9BF9F9FFFF999999999999999099900990999999999D999D9F9DBDFDBD9900900090009099090BD99C09BDA90900B0000000000000000000000000000000000000000900909909999990BFFA9B9BDBDBFBDBFB9F9F9FDBDBDFBFBFFBDFDBFBDBFDBFBF9BFF990999999099999990999999999909999B9D9F9DBD9999990000090909090900909D909B000990000090900000000000000000000000000000000000000090090990990999DF999BDBBFBDBFBDBFFBFBF9BFBFB9F9F9FBFBF9F9F9BBDBDBF9DBF9990999999999099909999909099099D99999999900900009000090000900B90F0AD0909990CF909090000000000000000000000000000000000000000000900909999909FB09B0B9F9FBF9FBF9BDBDBFF9FFFFBFFBFDBDBFBFBFDBBF9F9BB9099999999990999990909099999999999999990900000000000000090F900900099D990D9000B9A0000900000000000000000000000000000000000000000000909909999F0090999FDBFBDBDBDBDFBFBF9FF9FBDF9FDBFBFDBDBDB9F9BF9F990909999990999090999999990999999999900000000000000000009099009099B90909900009090BC900000000000000000000000000000000000000000000000000909099F909B9B9BBDBBFBFBFBBDBDBFBFF9FFBFFBFBDBFFFBFBF9FB9B9A990990990999999990090999999990990900000000090909009000009AD090B000F0F909DB09090C9009090000000000000000000000000000000000000000000000099990DB090090BDBBDBDBDBDFBFBFFFDBFBF9F9FF9FF9FB9F9FB9BDBD99A9909909990909099990990999099990900000000000000000000009099A90099099CB90B00000B90B000000000000000000000000000000000000000000000000000000909000909B9BBDBFBFBFBBDFDBF9BF9F9FBFBDFBFFBDFBF9FFDB9BB99909099909999999090990999090000000000000000009000000000000090990AD0F9D09090909909009009000000000000000000000000000000000000000000000000900900909099BDBDBDFBDBDFBBF9FF9FBFBDF9FBFDBDFBF9FB9B9F99DB0909090990909909009099909000000000000000000000090900000909009A099B9FBD09A000009090090000000000000000000000000000000000000000000000000000000000090BDBBFBF9FBFFBFDBF9BBB9BDBBFBDBFFFBDBF9DBFB99A909000909099990909090909000000000000000000000000000000000090A909900CF0DBD9900900B009A090090000000000000000000000000000000000000000000000090000000090B9F9FBF9F9FB9BDBF9DBF9BDB9FBDB9FBF9FBBD9FB99B9B99090990909009000090000000000000000000000000000090090000900DADB999FB909E90A09090090000000000000000000000000000000000000000000000000000000000009099F9FBDBFBFBDBFB9BBB99BDBDBBDBFFFDFBF9FBF9DB090900009009090900090000000000000000000000000000090900000090090B90D00B9D09999909A90090009090000000000000000000000000000000000000000000000000000000009BBFBDBFBDBDBDB9F9D99FB9B9BDBBDB9BBBDB9F9BB999B00909009909000090000000000000000000000000000000000000090A90990F909DCB9090C90090B0009A0000000000000000000000000000000000000000000000000000000000090DBDBFBDBBDBB9F99BB9B999BDB9F9BFFFDFBDBBF9DB090900009000000090000000000000000000000000000000000000090009090A90F90B90909B9090B009000909009000000000000000000000000000000000000000000000000000000099BF9BFBDBF9F9BBD99B9BDB9B9B9F99B9BF9F99FBBDB090900000900090000000000000000000000000000000000000000009009A9909090DFBA9009A90909009000000000000000000000000000000000000000000000000000000000000900BF9FBDBF99B9BD9B9BDBDB9F9F9F9BF9FB9FBFB9F9B9909000000000000000000000000000000000000000000000000090000A909C0B0F9CB9D900B009C00A9000090B0000000000000000000000000000000000000000000000000000000009B9FBDBB9BBBDB9B9BDBDBDF9BF9F9F99B9F99B9FF9B00900000000000000000000000000000000000000000000000090009090909A9099090DF09009A9B90909090000900000000000000000000000000000000000000000000000000000000BDB9FBF9F9D9B9B9F9BDBDBBFDBF9F9FBDB9FF9F9BF9B9000000000000000000000000000000000000000000000000000000000009099BC9F9AD90090900990900A90090000000000000000000000000000000000000000000000000000000000BFBDB9B9BB99D9F9F9BFFDFBFDBFBF9F9DB9BF9F9BF9090000000000000000000000000000000000000000000000000000009090A9AD09AD99FB0909A9B00A00990B000900000000000000000000000000000000000000000000000000000009BDBBDBDB9DB9BB9FFFFDBFFFFFFDFFFBFBF9F9BB9F9B90000000000000000000000000000000000000000000000090000090000BD090BD9FE9F9C90B9A90999F000909000000000000000000000000000000000000000000000000000000009BDBBDB9B99B9FBDFFBDFBFFBDBFFBFF9FDF9F9BD9FBDB00000000000000000000000000000000000000000900000000000000090900B9DAF990FB90B09090F0B0D0B00090000000000000000000000000000000000000000000000000000000ADBDBB9B9DB9F9FF9FFBFFFFFFFFFFFFFFBFFFBDBB9B9F9000000000000000000000000000000000000000000000900000000090009900F9DFD9D0B90D00A90909B00090000000000000000000000000000000000000000000000000000000009B9BDBDB9B9FBF9FFFFFFFFFFFFFFFFFFFFFBDFBD9BDB9B0000000000000000000000000000000000000000009000000090090A9000BD9DF9FA99909DA9B9E909A909000900000000000000000000000000000000000000000000000000000009BFB9B999BDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDB9F900000000000000000000000000000000000000009000009090000AC900B000B0FDFD9C099A9B00990A909090000000000000000000000000000000000000000000009000000000009F9BDB09BBDBFBFFBFFFFFFFFFFFFFFFFFFFFFFBDBDBDB9000000000000000000000000000000000000009000090900C0000909909090999FFF909BB0900090090090B009000000000000000000000000000000000000000000B0F00000000000BF9BD9BD9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBDB9000000000000000000000000000000000000000090000F9F0090090A09CBDBC9DFDBD99BB99A90B0000A9C90090000000000000000000000000000000000000000009AF000000000B9BDB9B9BFDBDFBFDBFFFFFBFFFFFFFFFFFFFFFFFFFF9F9B0000000000000000000000000000000000000000009000F0900000990B0909909FF9E9B900A90B900090099000000000000000000000000000000000000000000000090F000000009F9B9B9FBDBFFBFFFFFFFFFFFFBFFBFBFFFFFBFFFFFDFBFD00000000900000000000000000000000000000000900909000B09000D09ADF0F9F9E9900BD9DB00900009A009000000000000000000000000000000000000000000AD0FB90000000F9BBDBDBDBFFFFFFBFFBFFBFF9FF9FFFFFFBFFDFBFFBF9FB9000000000000000000000000000000000000909009B000009090009A9ADB9F9C9E9909F0B0B0900B009009000000000000000000000000000000000000000000909A090CF000009BBD9B9FBFFFBFFBDFBDFBFDBFFBFFBF9FBDFFFBFFFFFFF9FF00000000000000000000000000000000000000A900009090000090BD9DBDE9F999BC9D9F9F9FAB009CA90A90000000000000000000000000000000000000000000090FB9BB000009BB9DB9FBFFFBFFBFFBFDBFF9FF9FFFFFFFBFFFFBFFFFFFBDF0000009B0000000000000000000000000000000090000090900090F09DBDFFCBC9BDAF9B09090B0A990900090000000000000000000000000000000000000009AF9A90FF000009F99FBFFFFDBFDFBFBDFFBFDBFFBFF9F9FBFFDBFFDFBF9F9FFB90000000000000000000000000000000900009090090900000090F9B0BDBD9F99DF999D0909BA9E990000900000000000000000000000000000000000000009E09009EF900009BB9FBDBDBFBFFFBDFDBF9FFBFDBDB9FBFFFDBFFDFBFFFFFFFBDF90000D000000000000000000000000000090000000000009090F9909D0FBFF9CB9CBDB99A90DA9A09BB0A9000000000000000000000000000000000000000B9B090FFF00000099F9BFBFFFFFFBFFBFFFFB9DB99B9F9DBDBFFFFBFFBDBFBF9FFBF0000B000000000000000000000000000009000909090900B090B0FCBDFDDBF9E99ABC9D00B999900909000000000000000000000000000000000000000000000A9FF9000000F9BFDBDBF9FBFDBDFBF9BDB99B9DB9B99BDBDBFFFFFFFFFFF9BDBF00090000000000000000000000000000009000000A009009A9099FF9FBD0F9909B99B09B090A099A0009000000000000000000000000000000000000000000000FB0000009B9F9BFBFFFFF9FFBFDBF9B9FDDFBDFDFFDBDBFDBDBDBDBDBFFFFFDA000000000000000000000000000000000000900909009909090F9FFD9E9FF990BDA9DB0B9090B00090000000000000000000000000000000000000000000009B90000000BDFBFF9FBDBF9FFBF9BD99FDFBFBDBDBBDBFFDFBFFFBFBFFFF9F9FB90000000000000000000000000000090090A9009C090B9A90BCB9DBFFFDFD00ADA9BB0990B0090A900090000000000000000000000000000000000000000000000000000DBB9F9BFDFBFBFFBDBDB9FFFBDBDFFBFFDBF99B9DBDBDBDBF9FFFFFFF909000000000000000000000000000000900090B9F99C9BC999CB990FBFFBD9FB0DAB009B9B09009B000000900000000000000000000000000000000000000900000000BDFBFF9FBDFFDBF9F9BDB99DBFFBFFDBFFFFF9F99B9FB9BDBFBFBFBFDF000000000000000000000000000000000900A90B00B909B0A9BDADBDF9FFFDF9BB90DBBFB9009B9A90000000000000000000000000000000000000000000000000000BDB9F9BFBFBF9BF9F9F999FB9FFBFFFBFFF9FFFFBD099909BFFFDFDFFBF00000000000000000000000000000090000BD0909990BD0B9C99DFDBDFF9FBD9A9B0B9FB9B0B00090000000000000000000000000000000000000000000000000000BDBFFFFFFDFFDBF9F9B999BF9FFBDFFB9FBFFFFBFF900099BFFDBFBFBDFF9000000000000000000000009000000009090B09A9CBD0B909B0F9FFDF9F090BBB0B0B9B0B9090B09A000000900000000000000000000000000000000000000000009BDBF9FBFBFBFB99B9900BDBF9F9B9B9999B99F9BB900009F9FBFFFFFFBFB0000000000000000000000000090000009E90BD0B90B990B0D99F9FFBFFD990BEB09099A9B9A9CB0900090000000000000000000000000000000000000009000000FBF9FFBDBDFDBDB9900090BFB9B9999D9B999999999999F9BBFDBFBDBFDFFD0000000000000000000000000000909090BD0A90F90DA90B090F909DBDB09BDB90A9A9B009DA99A9A900000000000000000000000000000000000000000000000BF9FFFBFFFBFBFB990000099999999BD9B9D9F9B9D9DBFB9BDBDBBDFFFFBFFBB000000000000000000000009000000009D0B9B09A9B09A99FD9EBFBCB0900BB0A909B0DB9A99A9B0000009000000000000000000000000000000000000F90000F9FFB9F9FBDBF99F9B9D999999999F9FBFDBF9F9FBDFBFDBDBDBFDBF9F9FFFD000000000000000000000090000090A9F9AF90C9A9090B9B0F9F9D0099D09B9A9BFA9A9B0F9F0900B000000000000000000000000000000000000000000000000BFBFFFFBDBBDBFB9BDBBDB9FDBFFFFBDB9B9FBFFDFBFDFBF9B9B9B9FBBFFFBFD00000000000000000000000009000900FD0DB9B09B0B0BC9FFCBAB9A90B00B00A9B09A9BB909F9A9B09000900000000000000000000000000000000000B00009F9F9FBDBBD9B99FBDBDBFDFBFDBF9B9B09999B9FBFFBFBDBF9BDB9F9FDBBDFFB0000000000000000000000000A9000909BD909DBCBD9F9B00F9D90090B9F09ABDB090990009AB09000009000000000000000000000000000000000000090000BFBFFBDBDBBF9FB9B9B9F9FBFFBF9F0999F9BD9F9F9FFFDBDB99B9F9F9BDFBFF9A0000000000000000000000090000009F09090F0BDAF9F099FF9E9F9EDE90ABDAC900000090B909A909A0000000000000000000000000000000000000000009F9FDBDBFB9F99B9DBDBFBFBFDBDB9B9BDB99F9B9BFFF9FBDB99F9F9F9BFF9FFFBD00000000000000000009009000909B90999CBD9F9B9B00B09DBDF9A9B99B09A9B9A09A000900B00A0009090000000000000000000000000000000000F0000ABFBFBB9F9F9FBDB9B9F99FDBFBF9B999B9FF9F9F999BF9FB9B9BDBFBFDF9FBFFF9000000000000000000009000900000C9E9A90F9F0909090DABC9FDFF9A9000000F9A090000000B090900A000000000000000000000000000000000009B9B9D9FBDFDB9B9F9FBDB99BFFBF9F9B99999F9FFFFF9F9F9FF9F99F9FDBDBFBF9F9FF9000000000000000000000000090009090909900FD00A9A9FDDBDBFDFDFF0000099A9A00090000000A009900000000000000000000000000000000009F9F9FBFBDBB9BDBF9F9FBF9B99BDBFBF9F9FBFFFFFFFFFFFFFDBB99B9FFBFFFDFFFFFFFF00000000000000000000009000009A90909A09F90B09C9F9FBFF9CBFFFD000999AB00000000009009090009000000000000000000000000000000F0FFBFFBDF9FBDBF9F9FFBDF9F99BDBF9F9F9FFDFFFFFFFFFFFFFFBDB9DFDBFDFFBF9FF9FBDA000000000000000000090000000000BDA9090909090B9BCBD9999F9FFF000000090000900000000000090000000000000000000000000000000099FBDFBDBBFBDBF9BFBF9FFBF9F9999FB9FFFFBFFFFFFFFFFFFFFF999BFBFFFFBDFFFFFFFFF900000000000000000000000900909909C90000B009BD0D9FB09A9DFFDF00009000000900000A0009A09A90090000000000000000000000000000B9FFBFFBDBDBF9FFDBDFFBDFFFFFB9B9DB9FFFFFFFFFFFFFFFFFFFB9F9FFFFFFFFFFFFFFFFFF0000000000000000000009000000E99F9E9090DB0D0F999D0BC90BDBBF009000F009A00009A900000900000000000000000000000000000000009FF9FB9DBFBF9FBDBFFBDFFBDFF9FF99B9FFFBDFFFFFFFFFFFFFF999FFFFFFFFFFFFFFFFFBFB000000000000000000000000090090FCB909FA90DB990D09F09BD9ADDF00009A9E00090000000090900000000000000000000000000000000000FFBFB9FBF9FDBFFBFFFFFBFFFBFFF9F999FBDFFFFFFFFFFFFFFFDBFFFFFFFFFFFFFFFFFFFFDF90000000000000000009000900090BDBDE9EBD9DBC0099B9F90F9090BF00000909A090000A000000A0900900000000000000000000000000000BDBDBDB9BDBFBF9FFDBFDFF9FFFFFFFFBF99FBFFBFFFFFFFFFFFBF9FFFFFFFFFFFFFFFFFFFFFFB00000000000000000000900000C9090B9F9D909DF9B009D0BD0F9009909A900009909000900000090090000000000000000000000000000000FBFFFBDBDBDBDBFBFFFFBFFFFFFFFFFFFFBF9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF0000000000000000000000000B00B09090B0B90BDFDFF0990BDF0B9C900000B09000009A000000909000000900000000000000000000000009BDFB9FB9BBFBFFFDFFFFFFFFFFFFFFFFFFFFF9FBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB00000000000000000090900909900B0D909009CFFDF90B09090909B90000B00A09009A9A0000900A09090000000000000000000000000000BDFBDB9B9FDBDBDBFFBFFFFFFFFFFFFFFFFFDBFFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF90000000000000000000009A9009909B09A9F9BB9BB9090909AB0F090000090900B000090090A909000A0000000000000000000000000000FBFFB9FDB9BFFFFFFFFFFBFFBFFFFFFFFFFBFFBDBFDFFFFFFFFFFFFFFFFFFBDFFFFFFFFFFFFFFFDBF00000000000000009000909A0B00B09DB90909C900A9CB9B090F9B0B000A000900B0B009A09C90090909090000000000000000000000009FF9F9BB99B9BFFBFBFDFFDFFFFFFFFFFFDFFF9FFFBFFFFFFFFFFFFFFFFBFFFFBFFFFFFFFFFFFFFBDB00000000000009000090A909909E9F0DCBDADBBF99CB90C09A9CBD900B0900009A0900B00909A90A000000000000000000000000000000FB9B9BDBB90FFDBFFFFBFBFFFFFFBFDBFFBFFBFFBDFFBFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFF9BD0000000000000000000090F0A9F9909B9FD9F0D90FFDADB9A9FB90B0B0B00B09A09A0B0A9CA90090090B09000000000000000000000009FBDB9F9F90F9FBFDF9FFFFFBFFFFDFBFF9FFBDF9FFF9FFFFFFFFFFFFBF9FBDFFBFBFFFFFFFFFFFF99B0000000000000000900B0909DB9A90B0DFBFFDBDDF9A9B90DFF9CF00009B009090A9A090B0909A0000000000000000000000000000000FF9B90BB099BFFFFBFFBF9FFFDBFBBFFDBFB9FBFF9FBFFFFFFFFFBFDBDBF9FB99F9FBFFFFFFFFFFFB0F900000000000000000900B0A9009C909B0D9DBDFBFDF90DB90FDB9BB0A0B90000B009A00AB090900B09090000000000000000000000009B9B9909B009FBFFFBFFFFBDFFFFDFB9BDBDBDB9BFDFBDFFFFFFFFFBFB9B999B99BDF9FFBFFFFFFFD9B0000000000000000900990990BDB9A9C9B90DFFFDBDB090D99DB0C90000B00909CBA90BFB90B009A00A00000000000000000000000000F9090909009B9FDBDFF9FBFFBF9BB99B9A9B9B9F9BBFDBFFFFFFFDBD9BD9B9BDB9F9BFBFDFFFFFFFB9F9000000000000090009A090AD0B0D90B000BFF9DBDF9D09FD9A9D9A0A9B0BF0BABADBA9A90A9A9A90909000000000000000000000000BB0900090909FFFBFFBFFBFDBF9BD99F999999909BDF9BFFFFFFFBBFBB99B9BD9BDBBFFDFFFFFFFFF90B000000000000000009009DAD9B0909090B9D99DA9DB09BDF9099A900000B09B0F9FBCBB9A90B9A9A0A9A900000000000000000000000990909000000B9FFBFF9FDFBDBF9B9B9A9F9B099B9B9FFDFFFFFFDF999B90990B9A9D9BBFBFFFBFFF9F9B0000000000000090090B09B00B09A9090099CBDFF090D9FF9009A900A9AB0B0BB0FB9A9A00B00B90900A000000000000000000000000990D0909009DB9FDFBFBFBFB9B09B999B9999B9090B9BBBFFFFFBFF0909FB090090B99999B9FFFFF0B900000000000009000BC909E9F90F090B0FA9DBDBDBD090D9DAD0DDFA09A90B0B90BFFA9A9B000B00B00B9000000000000000000000009A9BB9A90000BFFBFB9F9B9999099090909ADB909B99F9FDFFFFFDB9B90BD09000009000DB9F9FFFF9909000000000000000009A90909EB90B09C9909D9EFDB0099FF99BBF909BA9B0B00AFFF900F0A0000B090000000000000000000000000909F9F9090009F9BDF9F9B990000000000009F0009099BDBBFBFFFB909090B00009000009A9DBFFFFF000000000000000000999090F009B9CBC9FBF09F9BD900090FF9CA090B0A0900A9AB0BBFEBBFF0B00B0BA9A9000000000000000000000090B9B09000009BFFBFBFBDBDB000000000000B990090B9BDFFFFBDBDB90900000000000DB9BFFFFFFB00000000000000009000A9A90B9009B9FBC9DBD0D0BDB90B9ADB999E99B000B00A9A90DFFCBFFFCFA9ADBCDA0000000000000000000000909B990900000DBDBDBF9BFB9F900000000000009009CB9B9FBFFFFBD09090900000A9B90999FBFFFF90000000000009000B99C909D0B90D0909FBC99999D90090DFFDBC99A9000A00A9A9ABBB9BFFFFBB0FFFFBB090000000000000000000000990000000000BBF9BFDFF9F9B9090900000009000999B9FBFDF9FBDBB9009909A9B9900B9FBDFFFFD000000000000000090009A9E99C0D0B09A90BD9DAD09D9FFFFDFDBDA900B090BB9A9B9009A9BBBBDFFFF0FD000000000000000000000009000900000009BD9ABDBB9B9B909B00090090000A9B0B9F9F9FBFBDB990B000099000099DBF9FBFFFB0000000000009009009B09090F9DB900090BD90B909FFFFDBFBFBC9D0900FBA9E0F000BA000909BABB9FBFA000C000000000000000000090900000000009BBD9B9090909B909B90900900990999B9FBFBDBDBBDB999990009099A9B90FBDFFF90000000000000000A900909090F909909AD9099D90FFDF9A9009DBDB09A9A9E9BBA9A00B00A0009900A90B909A9A9000000000000000000BA9000000000099B9900000000090909090099099B0DB999F9BFBDB9FBC9A99000900909B990B9FFF900000000000000900B09A9F090F9009C9FFFF09CBDFBDF9FFF0909D900FBFBFADBAC9AD0B00B0A00000000000000000000000000000000990000000009B9B000090090009000000009009A909B9FBF9F9BDB9F99B990090000909090BFDFFB900000000000000B009C90D909BD90F9FDFDF9099DF9FDF9FDBD0F909090BB09A9B0B9AB0B0000000A0090900000900000000000000000000000000000009000099B000090000000000009090DBDB9F9BDBDBDBBDA90909000900009ADFDBFF9F0000000000000900909B0B09F0FFFDFFBBBFD90FF9FBF9BDBC9F9CB099BCBB000A90A9000000000009A00A00090A09000000000000000000000000000000900B0B0F90000000000000000909A9B9F9F9B9B9BD9BD99A90A90A009D099BFF9FB900000000090000900A90D0B009099A999C0DBE9D9FC99C90990F9F9F09BB000000000B00B0000009009A0900009000000000000000000000000000000000000999909B0000000009009A90B99BDB9B9F9F9B9B9BBFBDBD9F99FDA9FBE9BDBDB0900000000000000B009A909B09909DBCB990D90FD9B00BDB0BD9E9F9F90BB000000000000000000A0000F0CB0000B00000000000000000000000000000000090B0B9B0900909909D09BDB909F99BDBDB9B909DAD990BDBF9FF9BDB9099FB0B900000000000000B0090090B099A0F909909A99099BD09D909090BDBD090000000000000000000000000FFFFF0A009000000000000000000000000000000000009099099000090009A9B09909B9B0F9B9B9DA99B99BFBF9F9FB9BDB90B9F099900000000000000900D09B09C9AC9990B9C90D0000BD0BC9E9AD09990090900000000B00000000000009AFFFFFFDA000000000000000000000000000000000000009A9B0B9000009A999090B90909B9BDBDA99900909999B9F90909909909B900900000000000000090A000B9E9BE9E900B0B09B0909D99F9FDBD000B9AD0000000000A000000000000ADFFFFFFFDF0000000000000000000000000000000000000090990900000090B99B9000090090B9B9BB9000B00B9F9BFB9000B09090B9B0000000000000009A99090099099F9E99090909909F90D9F9ADBD900DBD9000000BA9000000000000A9FFFFFFFFFB000000000000000000000000000000000000099090000009000909A909900009099A9D9009909909D0BD99000B99A90B090000000000000090000090DB0F0BD9F9E0A9DA9A0DBDA9909C9FF9A9DBC9B00000B0000000000000B09ABBBFFDEBF0000000000000000000000000000000000000000000000090090009909B00009009F99A90900CB090B9F9B09009909090900900000000000000909B00B0909D0A9FDBD0BC909B009D09DBFDBD09A9990000000B0000000000000A000900BFBD900090000000000000000000000000000000000000000000090099000909F90000909B990090B99B009B99090B090B900009000000000000000B00909099A9909900BDA9F9F0B09B9B90BDFF90B09A90900000A0B00000000000B000000000BA00000F000000000000000000000000000000000000000000909009900B909900090B0DA909009A9C900FB900909A9009090000000000000000009A0B0B090DA90990FFDB0F9BDBC900D90FF9F9DA9DAD9000000000000000000B00000AC09A09009FF000D00000000000000000000000000000000000000B090B9000990B9B0090099B9900099DBB9099900B09090900000090000000000000000909090B0990DA0BFFB0FF09ADBDBDF0990FDFFFDA99000000000A00090000000000BCB0A09009EB09A9A0000000000000000000000000000000000000909099000B0909900000909090009A9A99090B09099B090000009000000000000000090900B0F099A9099FFFFDF99DF9FDFDBD90F9E9FFFF90B0000A0009A00A00000000000B0909A000BDB0000000000000000000000000000000000000000009000000909A9000000009A9000099999090F9009B09000000000000000000000000000A90999CBEDA99E9FF9A9F0BDF9F0BD0B09D90F9FFD9000009A0000B00B00000000009A000090000F09E90000000000000000000000000000000000090009090900909909000009090B00000000BC90B9009B9900000000000000000000000009000E0B99FBDADFEBD099090B90D9DB990B0B0BCBFBCB000000000000B000000000B00000000009B09E900B000000000000000000000000000000000009000000090B000B00009000990009099B9B999009B00000090000000000000000090000090990FCBDAF9B9FA9FA0B09099FF9F99C9909B9C9BD00000B00000B00000000A0000000000000ADA0B000000000000000000000000000000000000000009090909909900009009090900009A9090000009909009000000000000000000009009A000BDBDBF90FFFDFF999009FDF0B90A99A0F0DB9CB0000B0000A00000000A00B0000000000009A9BCBD00000000000000000000000000000000000009000000900000900009000000000009090B09000000000009000000000000000000000009B90FFB090B09FBFFF0A9B099DBDA990BD99F9C9B000000A9000000000000B0000000000A0009AC9BCBE90000000000000000000000000000000000000090000B900000000090000090090000090090000090900000000000000000000000900000B9FDE909FF9DFFFFD00FC9FDBDA99EBE9FFBCF900B0090A0900000000000000000000900009B0FBDB0000000000000000000000000000000000000000090900009000000000000000009090009000000000000090000000000000000090090900FFB90BEFFFFFFDFA9FBDBDBC9F9A9D9FFBCBDA0000A0A9A00000000000000000000B0090000090B000000000000000000000000000000000000000090000909000090A90000909B0000009000000000000090000090000000000900900A00009BFF90B99FFFFFBFDFFDF9D99F909DB0B99F9FD0000000090000000000000000A0A00000000000000000000000000000000000000000000000000000000900009090090D09900A9099009000900000000000000000A900000000000A00090909A09FCB0FA9FF9F9BFDFB9D0D90D9E9FD9FA9CBB00A9A90A0000000000000000090900B09000A00000000000000000000000000000000000000000000000090000B090090B09F9009AC990B090009000000000000000000000000900909000090900BFDFDFFFFFF099F0DB990FDFDBF9F009B090000000A9A00000000000000000A0A900A0B009000000000000000000000000000000000000000000000090000000009A999A90990990B09000900000000000000009000090000000000A900A00009FFFFFFFFDBF0FBDBC9DBDB9AD9FA9B0DBCB0000B0009000000A000000000A9090A90900900B0A900000000000000000000000000000000000000000000009909009900999A009A909009000000000000000000000000000000090090099C9000FFFBFFFFBF09ADF09DB999ADB0B9D09A9A900000B000000000000A9A0000000000000B0A00090C9000000000000000000000000000000000000000000000009090009B0B0D90090090900B00000000000000900000000000000000009A0B00000BFDBFFBCD99DBDFD909E90BCBDBA90909000A0000000000000000B0B000000A090A0090900A9A0A9000000000000000000000000000000000000000000000000990099090B009900A0909090000000000000000000000090090009009C0F9009F0FCB9FB90A99FFBDB09BD999CDB0900F00000B000A00000A09A9A9000000A00009000000B00909000000000000000000000000000000000000000000000000900B0000B09090A9090000000000000000000000000000000000900090B90B000A9BB9ED09BD9E9FD9DBD09E9CB90F09B09000B00A090000009A9A00000000090A0000000000900000000000000000000000000000000000000000000000000000900909909000909000090000000000000000000000000909000009A900AD000D9000B90F0BF9DFF90909F9FF90B90FCBF0000B09A0000000A00000000000000900090A0900000000000000000000000000000000000000000000000000000090090000090B0900000900000000000000000000000000000A000B00009090B00BEFF99099D00FBDFF9A909FDBB09A99BFD000000A9A0000000B0000A000000A00A90A090000000000000000000000000000000000000000000000000000000000009009A900009000000000000000000000000000000000009000090BCB009009FFFE9F0AFBD0FBD9C90F09FD0BC9EB09F00A000900000000000A09090000090090000000090B00000000000000000000000000000000000000000000000000000000900009000090000000000000000000000000000900900090900C9009A09FFFFFF0BDFFFB9DB09DF9909ABDBF90FF9000000A0000000B0BA900A000000000000909090A0000000000000000000000000000900000000000000000000000000000000900000000000000000000000000009000000000009A000A090B0090CFFFFFFF9BFFB09A09DBBD0F9FDFFF0FFDB000000000A9A0000000B9000000000B0B000A9A900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090909A90DA09BFFFFFFB0A9FFFF990B00BDF0BFBDBF9BFD0000000B00000B0B09A0A00A0000A00009A90000090000000000000000000900090000000000000000000000000000000000000000000000000000000000000000000900000000900090000FB0D0CFFFFFFF99C909FBA909BDDFB90DDF09F09F0000A9A00000A000A009000009A90000A0000B0F00009000000000000000B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000A90BD00FBFFFFFFFF9AFB09BF9B0FBCBFB90FBE9BFADF9000009A9A00B900B000000000A000009090A90C9000000000000000000900009000000000000000000000000000000000000000000000000000000000000000000000000000000009090C90BDBDFFFFFFFFFDF90BE9F9FB9B9B09A9F9FDEDBD9000A9A0009A0AB00000A00000090B000A0900BFAF0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B0B09EFF9FFFFFFFFFFB099FFFFFC9009ADA990B9B0B900000000000900000A090A9000A000A09A0B0FDFBC0000000000000000000900A00000000000000000000000000000000000009000000000000000000000000000000000000000009A9090E9B09FFFFFFFFFFFF909FDFF99F9B0999009009D000009A9A9A00000000900000000900009A900A9EBD9A90000000000000000900009000000000000000000000000000000000000000000000000000000000000000000000000000900000F0B900BE9ADFFFFFFFFFFF09B9A9E9009E000D0DB0A99090A000A000A00000A0A000A000A00A0F00B9F9F0A000000000000000090000900000900000000090000000000000000000900000000000000000000000000000000000000000009C9B009000099FFFFFFFFFFFFFF09A9D9BD9F9B0B0B90D99A0A00BB09000090A09000A9090B009090B0B000A09090000000000000000A0000000000000000000000000000000000000000000A9000000000000000000000000000000000000000B0090009000A9BFFFFFFFFFFFFF0D9AD0F90F090D0909F0900000BA00000A090A0090A0A00B0A000000B099A09A9000000000000000090000000000000090000000000000000000000000000C0900000000000000000000000000000000000009F00900000090CFFFFFFFFFFFFBB0BDB90F90BDABB09F0F00000B09A000090A090B0A900B000000000900A099A000000000000000090000000000000000000000000000000000000000000090B000000000000000000000000000000000A00090090A009000009BFFFFFFFFFF90990BD9F90B909D0BC9F990009A9A90000A009AA09000B00B090000A0009BEA090000000000000000000B0000000000000000000000000000000000000000A0000000000000000000000000000000000090000B90090900090B00B9B9F9BF990A00AD0D00B0D0B0B0BB09A000A000000A900A090B009A09A000A0B009A9A099000000900900000000000000000000000000B00000000000000000000000900000000000000000000000000000000000000900900F000009000090009A9A90A00000999A900B0B0B099CB90900900000000009A00000A9A09BA0900B90009A0A000000000000000000000009000A0000000000900B0000000000000000000009000000000000000000000000000000000000000909900000B09000000009A9000000A09009B0B909A0B90900A00A00A000A0BA90000A9A90A0900A90A0B0A090900909000000000009000900A0900000000000A0000000000000000000000000000000000000000000000000000000000009009A90A00000090B0000000000000000090B9A0BDA90F9EB00B0000000000009A9A00900000B0B0A009A909AD0000000000900000000000000009000C00900000090000000000000000000000000000000000000000000000000000000009A90A900009000099E900000000A0000000900BD00B9BBDBDB9B0B9A0A900000000A9B00A0009A9ADA90B0A9E9A9A09000B0000A900000000000000000009000000000000900000000000000000000000000000000000000000000000000000000009009F09C009A09A000000009A0A0000A0090900A9FBF00B99CB0900A0A000A09AF0B9A90A000B0A9E9B0B0B09A0B00000B0000000000000000000000A00009000000000000000000000000000000000000000000000000000000000000009009090009A909090990000000000900A000909B0909A9B99ACB0900A0B0009A09AB0BB0B00A9A9AB09EB0A9AF0F09000909000009000000000090000090000000000000000000000000000000000000000000000000000000000000000090090A9ACADA9090B0009A0000000000A0A900F90AD090009A90B99090B009A9A9A0BBA9BB0B00B9A9AB9BA90909A9B0A0090A000009000000000000000000000900000000000000000000000000000000000000000000000000000000000000A0B009090909000D090F00900000000009000F0099090A09000B09A90BB09A9A9A9BF09A9A90BA9A9A9BE9BB0BBA9A0909A00009A90A0000000000000000000000000000000000000000000000000000000000000009000000000000000000A909090F0F09A9009A9090B9A900000000A0B0B09B009F000A0009A9C9A99BA9A09AB0BBE9A9A009A9A9A9BA9AF0F0F9A000000900000090000090000000000000000000000000000000000000000000000A000000000A00000000000000000900900C0909F9C9A009CB0B09000000000000000AC09A00F99000009A90DAB09AB0AF9FB0BB9A9A9AA9B0FA99BF9BB9A090A90900A90090000090000090000000000000000000000000000000C0B0000000F000000AD0000000000000000000000000B0B0B090B0D09A90090000000000009A00099B00999A000000F9E9A99BAB90B9BA9BB0A9A9AB9BEBB9BAB0BB00A9000000A090000000900A0000009000000000000000009FD000000009000000009A00C0F0000090000000D0090F00009009E9C90D090BDB0B009090B0000000000A0000B0A0A90DA000009B00B9BDA9F0BFAFB9A0B09A9AB9A9B9BA9B9B009A90A09090900009A909A90090000000900000009000000000A9A90A0000A90000A00C909A00000A000000A009A0009090A9009A9A9A9AD09CB0DA90A090A00000000000B0090900A90DB00000BB0A9A9ABB0B9BA9BA9A0FB9EB9ABA9B0B09ADADA90000A009A90000A000900A9009A0000000000000000009000000900900C000DEF00AC90C900000000009009F0B00A900B00909A9C9A90BDB09A990A909A00000009A0B9A0A90900090B0000DB9E909A9BFBA9B0900BB0BB9A9B9A9A9A09A9A9A009A90A0000009009A0A900000090B090000000000000000000000C0ADBDEFFFFFDFFEFF0E90C09CA900A900909A9C090090B090B90DB9009AD00B00000900000A00BCA09D000999E90000BA9A99BA9ABB09A0A00BBCBB9ABB9A9A000BA9A0B009000000000A0009A00909A0B00000000000009000000000900000B0D0A0B0F9B9BF99B9A90F90CB9C0090E9ADAD0B9A09A000DA9E9B0009090A9090009A0009000B0B09B0A009A09A000009090A09A909A00090B0BBB0B09AB0B09A9000090A00A0000090009A000900A090090A0900000000000000000009A0900E90C9C9AD0A000A009A90A0B00B9EA090909A90090099A9A990009D00A0900A00B0009A00A9A00A9A090A9C9B00900000A0B9BB9A9A90000A9B0BFBBB090A0B09A9A9A0900000000A0A90000A00A900A90A090A09A9000000A00090000090A0900B0BACB0BC9A90000009090B0009CB0F0B09A9AC9A00909E99A90B0090A90900099009A09A9A90A9A0090BC9B0090B00900A90A9A00A00A90A9B0B000A090A0A000000A0B0900B000000000900000B0009000900000090090000000000C909E9F0909B0BCB000000000A0A00F0B0B090B0DA9090B09A0B090A909990009000A90A00900B0A09AF0A9A90B09A000A000A0A90AB9B0B000000A9A0B09A0000A90000000B0B00A000000000A90A0000000000A09A0A9A00000009090AD0F9A9EB09A0F0B0A9A90B000000A9090B0B0009ABC9A9CA9A09AD9099AD9A0D009000A090009B0B0B0B0BA9A9A90A09900B0090A9090A90A0B0090000000B0A00900B00B000000000A90B00A90B00000000000000B09A0090090A00F00A0A900B00909C9A9B0F9A9CB0000A00000CA0A9009A9AD0B9DAB9A9A090ADA090AD9A9000A0090A9B00900B0B9E9A9ADA90900B0090A90A00A909BA900A0A09A0B0B0B0A0B0B0000009A0B0A000090000000000000A00000A090A0B0A9000009090A909BAF0A90BCA9A0DA90B0000900B0B0B0AB0A9A0B90BA90FAD0B0B99990B9AD9D09090BA9009B09B0F9AB9A90A9AAD0BD0B0000A90B00A9A900A00090A09000B0B0B0B0B0A90B0000090B0A00A00000000000000A0909A909009E9E9A9A0B09B0A0D0BDAF0B9E9BB0AB0B090A0000A90BC9A9ADB0A909EFBDABCB00A0CB00909A9090B090B9E90BCBBAB9A90A9A9B0B09B0B0B09A00009AB0A0009A0A900A0BCB0B9A9A009AA0A09A9AA0090090A0A00A009A90A90A0A00A009A9A90000B0AB0A99BAFAFDAF0B0B0B90009AA909AB9AB0BA9E9B0F9F0BFBDEBDBB0BDB99A90B099E90909E9A9B9E9B0BDAB0A9ADB0B09A0B0000A0000B090900B0A090A9009EBDB0A9A9A9A0909A00A90B0A00A00909000A00A90A9009A90B0A9A90A9A9CBF0B9A0009FFFFDB0BCB0ADABA90AA000A9CB09A9B0BB0BFBDFF9FAFCB0B0F0B000F9A999A9A9AB0B0BA0B9A90BCB0BA9E9A9F0A00000B000A9A0B0009AA90A0A0BEFFB9A9A9A9A0B00B00A9A9A9A0B0A0A0000B00A90A9000000B0B0A9000A909B009A0B0FFFFFEF0B0B0B09AB909B0B0AB0B0B0A90A90B0FBFFFFFBFB09990B909A9AABC9BDB9F9F9BB0BBA9AB0B0BB0BDA9B09A09000009A0B0B0B009A0090B9FF9EBF9A90A9A00B00B00B0BE9B0B0B09A9000B0A900000B0B0B0B00A909ABA09A0090BFFFFFFFF0B0A0BE90EBA0B0B90A9A0B9AB9AB0BBCFBDFFFF0F0B0F9EB0DB999BA9ABA9ABA90B90A9B0B0B00B0A9A9A000A00A09A9A9A0B0A9A00B0A9EFFEFF0A9AA90B0B00B0AB0B90BCB0A09A00A0B009A00A0B0B0B0B09A90A0B009A00B0BFFFFFFFFF0B099A9ABB90B9A00A9A0B90A9CADFADFFEFFFFFFFF0BBFB9DBBFBEBDB9A9B9A9BBA0A90A9A9A9A9A90BE090B00909ADB9A9A0A9A9A9A9BBFBFFFFFF009AB0B0FA0B00F0AB0B0A90A0B0900ABA9A99A0BCB0B0A000A9B0B0A90B0A9EFFFFFFFFF0B0A9A9A9EB0A9B09A090AB9BBFFFFFFFFFFFFFFFF909B9A9BFB9B9AFA9A9A9A9009000B0B0000000A90B0A0B0A0A9B0000909A0B0B0F0FCFFFFFFFBA90B0E90B00A9A90BCABCA9A90AA9009A9A0A9A9B0B0F9B0B0A0B0B0B0A9BB9FFFFFFFFFACB0A9ADA90B0A9AA9AA900BCBFFFFFFFDFFFFFFFFB009A909B9EBB9B9ADAB0BAB00000000B0090009A90B00009A9ABBB0B0A00B0FFFBFBFFFFFFFFEDBA9A9A000F9A9AC0A90A9A9EB90ABBE9A9B0A9ACBCB0A0F0B9BD0A9A9B0BCBFFFFFFFFFF9A09ADA9AB0B0A09A90A0BFBFFFFFFFFFBFFFFFFF000A9CB0BFB9EB0F9A90B09000000000000A000000A00B0BA9A9A90A0009ADFFFBCFFFFFFFFFFFB0000000E9A0AC0A900E90A9A90AF909A9A0A900B0B0B09A0BCB0B9B0BADBF9FFFFFFFFFFE9FA9A90E09A9E9AADA9FFFFFFFFFFFBFDFFFFFFF00090B0BDA9A99B00B0BA9A900000000000909000090B0BCBDA909FFBB0ADAFFFFFDFEFFFFFFFF00F00000000B0B00A0000B0A90A90AFABC09000E0E0F0E00F0B0B0A0B09AF9EFFFFFFFFFF9A00E0A090ACBFFF9AFFFFFFFFFFFFFDFEFFFFFFF0000B090B9B9A00A90B0900000000000000000000000BCBF0B0000FFCFB0BFFFFFBEBDFFFFFFFFF00A00A00A0C00C00CA900D0A9CA90090B0A000009A9A9E00BCBC90BCBB9EF9BFFFFFFFFFFDA909C0AC9ACFFFFFFFFFFFFFFFFFBFF9FFFFFFFB000000000009A90000000000000000000000000000A0B0FF00000FFFB0FFFFFFFDFFFFFFFFFFFE0000000000A00A00A0CA00AC0A0CA0E00000000E0F0F00F0CB09A9E900CBDEDFFFFFFFFF0A0E0A0A00A0FFFFFFFFFFFFFFFFFFDE9FFFFFFFF0000000000000000000000000000000000000000000090DADB0000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000B0F00E00A90B0000A9BFFFBFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFBFFFFFFFFF0000000000000000000000000000000000000000000000BFF00000000000000000000000000105000000000000AEAD05FE,'Anne has a BA degree in English from St. Lawrence College. She is fluent in French and German.',5,'http://accweb/emmployees/davolio.bmp') +go +set identity_insert "Employees" off +go +ALTER TABLE "Employees" CHECK CONSTRAINT ALL +go +set quoted_identifier on +go +ALTER TABLE "Order Details" NOCHECK CONSTRAINT ALL +go +INSERT "Order Details" VALUES(10248,11,14,12,0) +INSERT "Order Details" VALUES(10248,42,9.8,10,0) +INSERT "Order Details" VALUES(10248,72,34.8,5,0) +INSERT "Order Details" VALUES(10249,14,18.6,9,0) +INSERT "Order Details" VALUES(10249,51,42.4,40,0) +INSERT "Order Details" VALUES(10250,41,7.7,10,0) +INSERT "Order Details" VALUES(10250,51,42.4,35,0.15) +INSERT "Order Details" VALUES(10250,65,16.8,15,0.15) +INSERT "Order Details" VALUES(10251,22,16.8,6,0.05) +INSERT "Order Details" VALUES(10251,57,15.6,15,0.05) +go +INSERT "Order Details" VALUES(10251,65,16.8,20,0) +INSERT "Order Details" VALUES(10252,20,64.8,40,0.05) +INSERT "Order Details" VALUES(10252,33,2,25,0.05) +INSERT "Order Details" VALUES(10252,60,27.2,40,0) +INSERT "Order Details" VALUES(10253,31,10,20,0) +INSERT "Order Details" VALUES(10253,39,14.4,42,0) +INSERT "Order Details" VALUES(10253,49,16,40,0) +INSERT "Order Details" VALUES(10254,24,3.6,15,0.15) +INSERT "Order Details" VALUES(10254,55,19.2,21,0.15) +INSERT "Order Details" VALUES(10254,74,8,21,0) +go +INSERT "Order Details" VALUES(10255,2,15.2,20,0) +INSERT "Order Details" VALUES(10255,16,13.9,35,0) +INSERT "Order Details" VALUES(10255,36,15.2,25,0) +INSERT "Order Details" VALUES(10255,59,44,30,0) +INSERT "Order Details" VALUES(10256,53,26.2,15,0) +INSERT "Order Details" VALUES(10256,77,10.4,12,0) +INSERT "Order Details" VALUES(10257,27,35.1,25,0) +INSERT "Order Details" VALUES(10257,39,14.4,6,0) +INSERT "Order Details" VALUES(10257,77,10.4,15,0) +INSERT "Order Details" VALUES(10258,2,15.2,50,0.2) +go +INSERT "Order Details" VALUES(10258,5,17,65,0.2) +INSERT "Order Details" VALUES(10258,32,25.6,6,0.2) +INSERT "Order Details" VALUES(10259,21,8,10,0) +INSERT "Order Details" VALUES(10259,37,20.8,1,0) +INSERT "Order Details" VALUES(10260,41,7.7,16,0.25) +INSERT "Order Details" VALUES(10260,57,15.6,50,0) +INSERT "Order Details" VALUES(10260,62,39.4,15,0.25) +INSERT "Order Details" VALUES(10260,70,12,21,0.25) +INSERT "Order Details" VALUES(10261,21,8,20,0) +INSERT "Order Details" VALUES(10261,35,14.4,20,0) +go +INSERT "Order Details" VALUES(10262,5,17,12,0.2) +INSERT "Order Details" VALUES(10262,7,24,15,0) +INSERT "Order Details" VALUES(10262,56,30.4,2,0) +INSERT "Order Details" VALUES(10263,16,13.9,60,0.25) +INSERT "Order Details" VALUES(10263,24,3.6,28,0) +INSERT "Order Details" VALUES(10263,30,20.7,60,0.25) +INSERT "Order Details" VALUES(10263,74,8,36,0.25) +INSERT "Order Details" VALUES(10264,2,15.2,35,0) +INSERT "Order Details" VALUES(10264,41,7.7,25,0.15) +INSERT "Order Details" VALUES(10265,17,31.2,30,0) +go +INSERT "Order Details" VALUES(10265,70,12,20,0) +INSERT "Order Details" VALUES(10266,12,30.4,12,0.05) +INSERT "Order Details" VALUES(10267,40,14.7,50,0) +INSERT "Order Details" VALUES(10267,59,44,70,0.15) +INSERT "Order Details" VALUES(10267,76,14.4,15,0.15) +INSERT "Order Details" VALUES(10268,29,99,10,0) +INSERT "Order Details" VALUES(10268,72,27.8,4,0) +INSERT "Order Details" VALUES(10269,33,2,60,0.05) +INSERT "Order Details" VALUES(10269,72,27.8,20,0.05) +INSERT "Order Details" VALUES(10270,36,15.2,30,0) +go +INSERT "Order Details" VALUES(10270,43,36.8,25,0) +INSERT "Order Details" VALUES(10271,33,2,24,0) +INSERT "Order Details" VALUES(10272,20,64.8,6,0) +INSERT "Order Details" VALUES(10272,31,10,40,0) +INSERT "Order Details" VALUES(10272,72,27.8,24,0) +INSERT "Order Details" VALUES(10273,10,24.8,24,0.05) +INSERT "Order Details" VALUES(10273,31,10,15,0.05) +INSERT "Order Details" VALUES(10273,33,2,20,0) +INSERT "Order Details" VALUES(10273,40,14.7,60,0.05) +INSERT "Order Details" VALUES(10273,76,14.4,33,0.05) +go +INSERT "Order Details" VALUES(10274,71,17.2,20,0) +INSERT "Order Details" VALUES(10274,72,27.8,7,0) +INSERT "Order Details" VALUES(10275,24,3.6,12,0.05) +INSERT "Order Details" VALUES(10275,59,44,6,0.05) +INSERT "Order Details" VALUES(10276,10,24.8,15,0) +INSERT "Order Details" VALUES(10276,13,4.8,10,0) +INSERT "Order Details" VALUES(10277,28,36.4,20,0) +INSERT "Order Details" VALUES(10277,62,39.4,12,0) +INSERT "Order Details" VALUES(10278,44,15.5,16,0) +INSERT "Order Details" VALUES(10278,59,44,15,0) +go +INSERT "Order Details" VALUES(10278,63,35.1,8,0) +INSERT "Order Details" VALUES(10278,73,12,25,0) +INSERT "Order Details" VALUES(10279,17,31.2,15,0.25) +INSERT "Order Details" VALUES(10280,24,3.6,12,0) +INSERT "Order Details" VALUES(10280,55,19.2,20,0) +INSERT "Order Details" VALUES(10280,75,6.2,30,0) +INSERT "Order Details" VALUES(10281,19,7.3,1,0) +INSERT "Order Details" VALUES(10281,24,3.6,6,0) +INSERT "Order Details" VALUES(10281,35,14.4,4,0) +INSERT "Order Details" VALUES(10282,30,20.7,6,0) +go +INSERT "Order Details" VALUES(10282,57,15.6,2,0) +INSERT "Order Details" VALUES(10283,15,12.4,20,0) +INSERT "Order Details" VALUES(10283,19,7.3,18,0) +INSERT "Order Details" VALUES(10283,60,27.2,35,0) +INSERT "Order Details" VALUES(10283,72,27.8,3,0) +INSERT "Order Details" VALUES(10284,27,35.1,15,0.25) +INSERT "Order Details" VALUES(10284,44,15.5,21,0) +INSERT "Order Details" VALUES(10284,60,27.2,20,0.25) +INSERT "Order Details" VALUES(10284,67,11.2,5,0.25) +INSERT "Order Details" VALUES(10285,1,14.4,45,0.2) +go +INSERT "Order Details" VALUES(10285,40,14.7,40,0.2) +INSERT "Order Details" VALUES(10285,53,26.2,36,0.2) +INSERT "Order Details" VALUES(10286,35,14.4,100,0) +INSERT "Order Details" VALUES(10286,62,39.4,40,0) +INSERT "Order Details" VALUES(10287,16,13.9,40,0.15) +INSERT "Order Details" VALUES(10287,34,11.2,20,0) +INSERT "Order Details" VALUES(10287,46,9.6,15,0.15) +INSERT "Order Details" VALUES(10288,54,5.9,10,0.1) +INSERT "Order Details" VALUES(10288,68,10,3,0.1) +INSERT "Order Details" VALUES(10289,3,8,30,0) +go +INSERT "Order Details" VALUES(10289,64,26.6,9,0) +INSERT "Order Details" VALUES(10290,5,17,20,0) +INSERT "Order Details" VALUES(10290,29,99,15,0) +INSERT "Order Details" VALUES(10290,49,16,15,0) +INSERT "Order Details" VALUES(10290,77,10.4,10,0) +INSERT "Order Details" VALUES(10291,13,4.8,20,0.1) +INSERT "Order Details" VALUES(10291,44,15.5,24,0.1) +INSERT "Order Details" VALUES(10291,51,42.4,2,0.1) +INSERT "Order Details" VALUES(10292,20,64.8,20,0) +INSERT "Order Details" VALUES(10293,18,50,12,0) +go +INSERT "Order Details" VALUES(10293,24,3.6,10,0) +INSERT "Order Details" VALUES(10293,63,35.1,5,0) +INSERT "Order Details" VALUES(10293,75,6.2,6,0) +INSERT "Order Details" VALUES(10294,1,14.4,18,0) +INSERT "Order Details" VALUES(10294,17,31.2,15,0) +INSERT "Order Details" VALUES(10294,43,36.8,15,0) +INSERT "Order Details" VALUES(10294,60,27.2,21,0) +INSERT "Order Details" VALUES(10294,75,6.2,6,0) +INSERT "Order Details" VALUES(10295,56,30.4,4,0) +INSERT "Order Details" VALUES(10296,11,16.8,12,0) +go +INSERT "Order Details" VALUES(10296,16,13.9,30,0) +INSERT "Order Details" VALUES(10296,69,28.8,15,0) +INSERT "Order Details" VALUES(10297,39,14.4,60,0) +INSERT "Order Details" VALUES(10297,72,27.8,20,0) +INSERT "Order Details" VALUES(10298,2,15.2,40,0) +INSERT "Order Details" VALUES(10298,36,15.2,40,0.25) +INSERT "Order Details" VALUES(10298,59,44,30,0.25) +INSERT "Order Details" VALUES(10298,62,39.4,15,0) +INSERT "Order Details" VALUES(10299,19,7.3,15,0) +INSERT "Order Details" VALUES(10299,70,12,20,0) +go +INSERT "Order Details" VALUES(10300,66,13.6,30,0) +INSERT "Order Details" VALUES(10300,68,10,20,0) +INSERT "Order Details" VALUES(10301,40,14.7,10,0) +INSERT "Order Details" VALUES(10301,56,30.4,20,0) +INSERT "Order Details" VALUES(10302,17,31.2,40,0) +INSERT "Order Details" VALUES(10302,28,36.4,28,0) +INSERT "Order Details" VALUES(10302,43,36.8,12,0) +INSERT "Order Details" VALUES(10303,40,14.7,40,0.1) +INSERT "Order Details" VALUES(10303,65,16.8,30,0.1) +INSERT "Order Details" VALUES(10303,68,10,15,0.1) +go +INSERT "Order Details" VALUES(10304,49,16,30,0) +INSERT "Order Details" VALUES(10304,59,44,10,0) +INSERT "Order Details" VALUES(10304,71,17.2,2,0) +INSERT "Order Details" VALUES(10305,18,50,25,0.1) +INSERT "Order Details" VALUES(10305,29,99,25,0.1) +INSERT "Order Details" VALUES(10305,39,14.4,30,0.1) +INSERT "Order Details" VALUES(10306,30,20.7,10,0) +INSERT "Order Details" VALUES(10306,53,26.2,10,0) +INSERT "Order Details" VALUES(10306,54,5.9,5,0) +INSERT "Order Details" VALUES(10307,62,39.4,10,0) +go +INSERT "Order Details" VALUES(10307,68,10,3,0) +INSERT "Order Details" VALUES(10308,69,28.8,1,0) +INSERT "Order Details" VALUES(10308,70,12,5,0) +INSERT "Order Details" VALUES(10309,4,17.6,20,0) +INSERT "Order Details" VALUES(10309,6,20,30,0) +INSERT "Order Details" VALUES(10309,42,11.2,2,0) +INSERT "Order Details" VALUES(10309,43,36.8,20,0) +INSERT "Order Details" VALUES(10309,71,17.2,3,0) +INSERT "Order Details" VALUES(10310,16,13.9,10,0) +INSERT "Order Details" VALUES(10310,62,39.4,5,0) +go +INSERT "Order Details" VALUES(10311,42,11.2,6,0) +INSERT "Order Details" VALUES(10311,69,28.8,7,0) +INSERT "Order Details" VALUES(10312,28,36.4,4,0) +INSERT "Order Details" VALUES(10312,43,36.8,24,0) +INSERT "Order Details" VALUES(10312,53,26.2,20,0) +INSERT "Order Details" VALUES(10312,75,6.2,10,0) +INSERT "Order Details" VALUES(10313,36,15.2,12,0) +INSERT "Order Details" VALUES(10314,32,25.6,40,0.1) +INSERT "Order Details" VALUES(10314,58,10.6,30,0.1) +INSERT "Order Details" VALUES(10314,62,39.4,25,0.1) +go +INSERT "Order Details" VALUES(10315,34,11.2,14,0) +INSERT "Order Details" VALUES(10315,70,12,30,0) +INSERT "Order Details" VALUES(10316,41,7.7,10,0) +INSERT "Order Details" VALUES(10316,62,39.4,70,0) +INSERT "Order Details" VALUES(10317,1,14.4,20,0) +INSERT "Order Details" VALUES(10318,41,7.7,20,0) +INSERT "Order Details" VALUES(10318,76,14.4,6,0) +INSERT "Order Details" VALUES(10319,17,31.2,8,0) +INSERT "Order Details" VALUES(10319,28,36.4,14,0) +INSERT "Order Details" VALUES(10319,76,14.4,30,0) +go +INSERT "Order Details" VALUES(10320,71,17.2,30,0) +INSERT "Order Details" VALUES(10321,35,14.4,10,0) +INSERT "Order Details" VALUES(10322,52,5.6,20,0) +INSERT "Order Details" VALUES(10323,15,12.4,5,0) +INSERT "Order Details" VALUES(10323,25,11.2,4,0) +INSERT "Order Details" VALUES(10323,39,14.4,4,0) +INSERT "Order Details" VALUES(10324,16,13.9,21,0.15) +INSERT "Order Details" VALUES(10324,35,14.4,70,0.15) +INSERT "Order Details" VALUES(10324,46,9.6,30,0) +INSERT "Order Details" VALUES(10324,59,44,40,0.15) +go +INSERT "Order Details" VALUES(10324,63,35.1,80,0.15) +INSERT "Order Details" VALUES(10325,6,20,6,0) +INSERT "Order Details" VALUES(10325,13,4.8,12,0) +INSERT "Order Details" VALUES(10325,14,18.6,9,0) +INSERT "Order Details" VALUES(10325,31,10,4,0) +INSERT "Order Details" VALUES(10325,72,27.8,40,0) +INSERT "Order Details" VALUES(10326,4,17.6,24,0) +INSERT "Order Details" VALUES(10326,57,15.6,16,0) +INSERT "Order Details" VALUES(10326,75,6.2,50,0) +INSERT "Order Details" VALUES(10327,2,15.2,25,0.2) +go +INSERT "Order Details" VALUES(10327,11,16.8,50,0.2) +INSERT "Order Details" VALUES(10327,30,20.7,35,0.2) +INSERT "Order Details" VALUES(10327,58,10.6,30,0.2) +INSERT "Order Details" VALUES(10328,59,44,9,0) +INSERT "Order Details" VALUES(10328,65,16.8,40,0) +INSERT "Order Details" VALUES(10328,68,10,10,0) +INSERT "Order Details" VALUES(10329,19,7.3,10,0.05) +INSERT "Order Details" VALUES(10329,30,20.7,8,0.05) +INSERT "Order Details" VALUES(10329,38,210.8,20,0.05) +INSERT "Order Details" VALUES(10329,56,30.4,12,0.05) +go +INSERT "Order Details" VALUES(10330,26,24.9,50,0.15) +INSERT "Order Details" VALUES(10330,72,27.8,25,0.15) +INSERT "Order Details" VALUES(10331,54,5.9,15,0) +INSERT "Order Details" VALUES(10332,18,50,40,0.2) +INSERT "Order Details" VALUES(10332,42,11.2,10,0.2) +INSERT "Order Details" VALUES(10332,47,7.6,16,0.2) +INSERT "Order Details" VALUES(10333,14,18.6,10,0) +INSERT "Order Details" VALUES(10333,21,8,10,0.1) +INSERT "Order Details" VALUES(10333,71,17.2,40,0.1) +INSERT "Order Details" VALUES(10334,52,5.6,8,0) +go +INSERT "Order Details" VALUES(10334,68,10,10,0) +INSERT "Order Details" VALUES(10335,2,15.2,7,0.2) +INSERT "Order Details" VALUES(10335,31,10,25,0.2) +INSERT "Order Details" VALUES(10335,32,25.6,6,0.2) +INSERT "Order Details" VALUES(10335,51,42.4,48,0.2) +INSERT "Order Details" VALUES(10336,4,17.6,18,0.1) +INSERT "Order Details" VALUES(10337,23,7.2,40,0) +INSERT "Order Details" VALUES(10337,26,24.9,24,0) +INSERT "Order Details" VALUES(10337,36,15.2,20,0) +INSERT "Order Details" VALUES(10337,37,20.8,28,0) +go +INSERT "Order Details" VALUES(10337,72,27.8,25,0) +INSERT "Order Details" VALUES(10338,17,31.2,20,0) +INSERT "Order Details" VALUES(10338,30,20.7,15,0) +INSERT "Order Details" VALUES(10339,4,17.6,10,0) +INSERT "Order Details" VALUES(10339,17,31.2,70,0.05) +INSERT "Order Details" VALUES(10339,62,39.4,28,0) +INSERT "Order Details" VALUES(10340,18,50,20,0.05) +INSERT "Order Details" VALUES(10340,41,7.7,12,0.05) +INSERT "Order Details" VALUES(10340,43,36.8,40,0.05) +INSERT "Order Details" VALUES(10341,33,2,8,0) +go +INSERT "Order Details" VALUES(10341,59,44,9,0.15) +INSERT "Order Details" VALUES(10342,2,15.2,24,0.2) +INSERT "Order Details" VALUES(10342,31,10,56,0.2) +INSERT "Order Details" VALUES(10342,36,15.2,40,0.2) +INSERT "Order Details" VALUES(10342,55,19.2,40,0.2) +INSERT "Order Details" VALUES(10343,64,26.6,50,0) +INSERT "Order Details" VALUES(10343,68,10,4,0.05) +INSERT "Order Details" VALUES(10343,76,14.4,15,0) +INSERT "Order Details" VALUES(10344,4,17.6,35,0) +INSERT "Order Details" VALUES(10344,8,32,70,0.25) +go +INSERT "Order Details" VALUES(10345,8,32,70,0) +INSERT "Order Details" VALUES(10345,19,7.3,80,0) +INSERT "Order Details" VALUES(10345,42,11.2,9,0) +INSERT "Order Details" VALUES(10346,17,31.2,36,0.1) +INSERT "Order Details" VALUES(10346,56,30.4,20,0) +INSERT "Order Details" VALUES(10347,25,11.2,10,0) +INSERT "Order Details" VALUES(10347,39,14.4,50,0.15) +INSERT "Order Details" VALUES(10347,40,14.7,4,0) +INSERT "Order Details" VALUES(10347,75,6.2,6,0.15) +INSERT "Order Details" VALUES(10348,1,14.4,15,0.15) +go +INSERT "Order Details" VALUES(10348,23,7.2,25,0) +INSERT "Order Details" VALUES(10349,54,5.9,24,0) +INSERT "Order Details" VALUES(10350,50,13,15,0.1) +INSERT "Order Details" VALUES(10350,69,28.8,18,0.1) +INSERT "Order Details" VALUES(10351,38,210.8,20,0.05) +INSERT "Order Details" VALUES(10351,41,7.7,13,0) +INSERT "Order Details" VALUES(10351,44,15.5,77,0.05) +INSERT "Order Details" VALUES(10351,65,16.8,10,0.05) +INSERT "Order Details" VALUES(10352,24,3.6,10,0) +INSERT "Order Details" VALUES(10352,54,5.9,20,0.15) +go +INSERT "Order Details" VALUES(10353,11,16.8,12,0.2) +INSERT "Order Details" VALUES(10353,38,210.8,50,0.2) +INSERT "Order Details" VALUES(10354,1,14.4,12,0) +INSERT "Order Details" VALUES(10354,29,99,4,0) +INSERT "Order Details" VALUES(10355,24,3.6,25,0) +INSERT "Order Details" VALUES(10355,57,15.6,25,0) +INSERT "Order Details" VALUES(10356,31,10,30,0) +INSERT "Order Details" VALUES(10356,55,19.2,12,0) +INSERT "Order Details" VALUES(10356,69,28.8,20,0) +INSERT "Order Details" VALUES(10357,10,24.8,30,0.2) +go +INSERT "Order Details" VALUES(10357,26,24.9,16,0) +INSERT "Order Details" VALUES(10357,60,27.2,8,0.2) +INSERT "Order Details" VALUES(10358,24,3.6,10,0.05) +INSERT "Order Details" VALUES(10358,34,11.2,10,0.05) +INSERT "Order Details" VALUES(10358,36,15.2,20,0.05) +INSERT "Order Details" VALUES(10359,16,13.9,56,0.05) +INSERT "Order Details" VALUES(10359,31,10,70,0.05) +INSERT "Order Details" VALUES(10359,60,27.2,80,0.05) +INSERT "Order Details" VALUES(10360,28,36.4,30,0) +INSERT "Order Details" VALUES(10360,29,99,35,0) +go +INSERT "Order Details" VALUES(10360,38,210.8,10,0) +INSERT "Order Details" VALUES(10360,49,16,35,0) +INSERT "Order Details" VALUES(10360,54,5.9,28,0) +INSERT "Order Details" VALUES(10361,39,14.4,54,0.1) +INSERT "Order Details" VALUES(10361,60,27.2,55,0.1) +INSERT "Order Details" VALUES(10362,25,11.2,50,0) +INSERT "Order Details" VALUES(10362,51,42.4,20,0) +INSERT "Order Details" VALUES(10362,54,5.9,24,0) +INSERT "Order Details" VALUES(10363,31,10,20,0) +INSERT "Order Details" VALUES(10363,75,6.2,12,0) +go +INSERT "Order Details" VALUES(10363,76,14.4,12,0) +INSERT "Order Details" VALUES(10364,69,28.8,30,0) +INSERT "Order Details" VALUES(10364,71,17.2,5,0) +INSERT "Order Details" VALUES(10365,11,16.8,24,0) +INSERT "Order Details" VALUES(10366,65,16.8,5,0) +INSERT "Order Details" VALUES(10366,77,10.4,5,0) +INSERT "Order Details" VALUES(10367,34,11.2,36,0) +INSERT "Order Details" VALUES(10367,54,5.9,18,0) +INSERT "Order Details" VALUES(10367,65,16.8,15,0) +INSERT "Order Details" VALUES(10367,77,10.4,7,0) +go +INSERT "Order Details" VALUES(10368,21,8,5,0.1) +INSERT "Order Details" VALUES(10368,28,36.4,13,0.1) +INSERT "Order Details" VALUES(10368,57,15.6,25,0) +INSERT "Order Details" VALUES(10368,64,26.6,35,0.1) +INSERT "Order Details" VALUES(10369,29,99,20,0) +INSERT "Order Details" VALUES(10369,56,30.4,18,0.25) +INSERT "Order Details" VALUES(10370,1,14.4,15,0.15) +INSERT "Order Details" VALUES(10370,64,26.6,30,0) +INSERT "Order Details" VALUES(10370,74,8,20,0.15) +INSERT "Order Details" VALUES(10371,36,15.2,6,0.2) +go +INSERT "Order Details" VALUES(10372,20,64.8,12,0.25) +INSERT "Order Details" VALUES(10372,38,210.8,40,0.25) +INSERT "Order Details" VALUES(10372,60,27.2,70,0.25) +INSERT "Order Details" VALUES(10372,72,27.8,42,0.25) +INSERT "Order Details" VALUES(10373,58,10.6,80,0.2) +INSERT "Order Details" VALUES(10373,71,17.2,50,0.2) +INSERT "Order Details" VALUES(10374,31,10,30,0) +INSERT "Order Details" VALUES(10374,58,10.6,15,0) +INSERT "Order Details" VALUES(10375,14,18.6,15,0) +INSERT "Order Details" VALUES(10375,54,5.9,10,0) +go +INSERT "Order Details" VALUES(10376,31,10,42,0.05) +INSERT "Order Details" VALUES(10377,28,36.4,20,0.15) +INSERT "Order Details" VALUES(10377,39,14.4,20,0.15) +INSERT "Order Details" VALUES(10378,71,17.2,6,0) +INSERT "Order Details" VALUES(10379,41,7.7,8,0.1) +INSERT "Order Details" VALUES(10379,63,35.1,16,0.1) +INSERT "Order Details" VALUES(10379,65,16.8,20,0.1) +INSERT "Order Details" VALUES(10380,30,20.7,18,0.1) +INSERT "Order Details" VALUES(10380,53,26.2,20,0.1) +INSERT "Order Details" VALUES(10380,60,27.2,6,0.1) +go +INSERT "Order Details" VALUES(10380,70,12,30,0) +INSERT "Order Details" VALUES(10381,74,8,14,0) +INSERT "Order Details" VALUES(10382,5,17,32,0) +INSERT "Order Details" VALUES(10382,18,50,9,0) +INSERT "Order Details" VALUES(10382,29,99,14,0) +INSERT "Order Details" VALUES(10382,33,2,60,0) +INSERT "Order Details" VALUES(10382,74,8,50,0) +INSERT "Order Details" VALUES(10383,13,4.8,20,0) +INSERT "Order Details" VALUES(10383,50,13,15,0) +INSERT "Order Details" VALUES(10383,56,30.4,20,0) +go +INSERT "Order Details" VALUES(10384,20,64.8,28,0) +INSERT "Order Details" VALUES(10384,60,27.2,15,0) +INSERT "Order Details" VALUES(10385,7,24,10,0.2) +INSERT "Order Details" VALUES(10385,60,27.2,20,0.2) +INSERT "Order Details" VALUES(10385,68,10,8,0.2) +INSERT "Order Details" VALUES(10386,24,3.6,15,0) +INSERT "Order Details" VALUES(10386,34,11.2,10,0) +INSERT "Order Details" VALUES(10387,24,3.6,15,0) +INSERT "Order Details" VALUES(10387,28,36.4,6,0) +INSERT "Order Details" VALUES(10387,59,44,12,0) +go +INSERT "Order Details" VALUES(10387,71,17.2,15,0) +INSERT "Order Details" VALUES(10388,45,7.6,15,0.2) +INSERT "Order Details" VALUES(10388,52,5.6,20,0.2) +INSERT "Order Details" VALUES(10388,53,26.2,40,0) +INSERT "Order Details" VALUES(10389,10,24.8,16,0) +INSERT "Order Details" VALUES(10389,55,19.2,15,0) +INSERT "Order Details" VALUES(10389,62,39.4,20,0) +INSERT "Order Details" VALUES(10389,70,12,30,0) +INSERT "Order Details" VALUES(10390,31,10,60,0.1) +INSERT "Order Details" VALUES(10390,35,14.4,40,0.1) +go +INSERT "Order Details" VALUES(10390,46,9.6,45,0) +INSERT "Order Details" VALUES(10390,72,27.8,24,0.1) +INSERT "Order Details" VALUES(10391,13,4.8,18,0) +INSERT "Order Details" VALUES(10392,69,28.8,50,0) +INSERT "Order Details" VALUES(10393,2,15.2,25,0.25) +INSERT "Order Details" VALUES(10393,14,18.6,42,0.25) +INSERT "Order Details" VALUES(10393,25,11.2,7,0.25) +INSERT "Order Details" VALUES(10393,26,24.9,70,0.25) +INSERT "Order Details" VALUES(10393,31,10,32,0) +INSERT "Order Details" VALUES(10394,13,4.8,10,0) +go +INSERT "Order Details" VALUES(10394,62,39.4,10,0) +INSERT "Order Details" VALUES(10395,46,9.6,28,0.1) +INSERT "Order Details" VALUES(10395,53,26.2,70,0.1) +INSERT "Order Details" VALUES(10395,69,28.8,8,0) +INSERT "Order Details" VALUES(10396,23,7.2,40,0) +INSERT "Order Details" VALUES(10396,71,17.2,60,0) +INSERT "Order Details" VALUES(10396,72,27.8,21,0) +INSERT "Order Details" VALUES(10397,21,8,10,0.15) +INSERT "Order Details" VALUES(10397,51,42.4,18,0.15) +INSERT "Order Details" VALUES(10398,35,14.4,30,0) +go +INSERT "Order Details" VALUES(10398,55,19.2,120,0.1) +INSERT "Order Details" VALUES(10399,68,10,60,0) +INSERT "Order Details" VALUES(10399,71,17.2,30,0) +INSERT "Order Details" VALUES(10399,76,14.4,35,0) +INSERT "Order Details" VALUES(10399,77,10.4,14,0) +INSERT "Order Details" VALUES(10400,29,99,21,0) +INSERT "Order Details" VALUES(10400,35,14.4,35,0) +INSERT "Order Details" VALUES(10400,49,16,30,0) +INSERT "Order Details" VALUES(10401,30,20.7,18,0) +INSERT "Order Details" VALUES(10401,56,30.4,70,0) +go +INSERT "Order Details" VALUES(10401,65,16.8,20,0) +INSERT "Order Details" VALUES(10401,71,17.2,60,0) +INSERT "Order Details" VALUES(10402,23,7.2,60,0) +INSERT "Order Details" VALUES(10402,63,35.1,65,0) +INSERT "Order Details" VALUES(10403,16,13.9,21,0.15) +INSERT "Order Details" VALUES(10403,48,10.2,70,0.15) +INSERT "Order Details" VALUES(10404,26,24.9,30,0.05) +INSERT "Order Details" VALUES(10404,42,11.2,40,0.05) +INSERT "Order Details" VALUES(10404,49,16,30,0.05) +INSERT "Order Details" VALUES(10405,3,8,50,0) +go +INSERT "Order Details" VALUES(10406,1,14.4,10,0) +INSERT "Order Details" VALUES(10406,21,8,30,0.1) +INSERT "Order Details" VALUES(10406,28,36.4,42,0.1) +INSERT "Order Details" VALUES(10406,36,15.2,5,0.1) +INSERT "Order Details" VALUES(10406,40,14.7,2,0.1) +INSERT "Order Details" VALUES(10407,11,16.8,30,0) +INSERT "Order Details" VALUES(10407,69,28.8,15,0) +INSERT "Order Details" VALUES(10407,71,17.2,15,0) +INSERT "Order Details" VALUES(10408,37,20.8,10,0) +INSERT "Order Details" VALUES(10408,54,5.9,6,0) +go +INSERT "Order Details" VALUES(10408,62,39.4,35,0) +INSERT "Order Details" VALUES(10409,14,18.6,12,0) +INSERT "Order Details" VALUES(10409,21,8,12,0) +INSERT "Order Details" VALUES(10410,33,2,49,0) +INSERT "Order Details" VALUES(10410,59,44,16,0) +INSERT "Order Details" VALUES(10411,41,7.7,25,0.2) +INSERT "Order Details" VALUES(10411,44,15.5,40,0.2) +INSERT "Order Details" VALUES(10411,59,44,9,0.2) +INSERT "Order Details" VALUES(10412,14,18.6,20,0.1) +INSERT "Order Details" VALUES(10413,1,14.4,24,0) +go +INSERT "Order Details" VALUES(10413,62,39.4,40,0) +INSERT "Order Details" VALUES(10413,76,14.4,14,0) +INSERT "Order Details" VALUES(10414,19,7.3,18,0.05) +INSERT "Order Details" VALUES(10414,33,2,50,0) +INSERT "Order Details" VALUES(10415,17,31.2,2,0) +INSERT "Order Details" VALUES(10415,33,2,20,0) +INSERT "Order Details" VALUES(10416,19,7.3,20,0) +INSERT "Order Details" VALUES(10416,53,26.2,10,0) +INSERT "Order Details" VALUES(10416,57,15.6,20,0) +INSERT "Order Details" VALUES(10417,38,210.8,50,0) +go +INSERT "Order Details" VALUES(10417,46,9.6,2,0.25) +INSERT "Order Details" VALUES(10417,68,10,36,0.25) +INSERT "Order Details" VALUES(10417,77,10.4,35,0) +INSERT "Order Details" VALUES(10418,2,15.2,60,0) +INSERT "Order Details" VALUES(10418,47,7.6,55,0) +INSERT "Order Details" VALUES(10418,61,22.8,16,0) +INSERT "Order Details" VALUES(10418,74,8,15,0) +INSERT "Order Details" VALUES(10419,60,27.2,60,0.05) +INSERT "Order Details" VALUES(10419,69,28.8,20,0.05) +INSERT "Order Details" VALUES(10420,9,77.6,20,0.1) +go +INSERT "Order Details" VALUES(10420,13,4.8,2,0.1) +INSERT "Order Details" VALUES(10420,70,12,8,0.1) +INSERT "Order Details" VALUES(10420,73,12,20,0.1) +INSERT "Order Details" VALUES(10421,19,7.3,4,0.15) +INSERT "Order Details" VALUES(10421,26,24.9,30,0) +INSERT "Order Details" VALUES(10421,53,26.2,15,0.15) +INSERT "Order Details" VALUES(10421,77,10.4,10,0.15) +INSERT "Order Details" VALUES(10422,26,24.9,2,0) +INSERT "Order Details" VALUES(10423,31,10,14,0) +INSERT "Order Details" VALUES(10423,59,44,20,0) +go +INSERT "Order Details" VALUES(10424,35,14.4,60,0.2) +INSERT "Order Details" VALUES(10424,38,210.8,49,0.2) +INSERT "Order Details" VALUES(10424,68,10,30,0.2) +INSERT "Order Details" VALUES(10425,55,19.2,10,0.25) +INSERT "Order Details" VALUES(10425,76,14.4,20,0.25) +INSERT "Order Details" VALUES(10426,56,30.4,5,0) +INSERT "Order Details" VALUES(10426,64,26.6,7,0) +INSERT "Order Details" VALUES(10427,14,18.6,35,0) +INSERT "Order Details" VALUES(10428,46,9.6,20,0) +INSERT "Order Details" VALUES(10429,50,13,40,0) +go +INSERT "Order Details" VALUES(10429,63,35.1,35,0.25) +INSERT "Order Details" VALUES(10430,17,31.2,45,0.2) +INSERT "Order Details" VALUES(10430,21,8,50,0) +INSERT "Order Details" VALUES(10430,56,30.4,30,0) +INSERT "Order Details" VALUES(10430,59,44,70,0.2) +INSERT "Order Details" VALUES(10431,17,31.2,50,0.25) +INSERT "Order Details" VALUES(10431,40,14.7,50,0.25) +INSERT "Order Details" VALUES(10431,47,7.6,30,0.25) +INSERT "Order Details" VALUES(10432,26,24.9,10,0) +INSERT "Order Details" VALUES(10432,54,5.9,40,0) +go +INSERT "Order Details" VALUES(10433,56,30.4,28,0) +INSERT "Order Details" VALUES(10434,11,16.8,6,0) +INSERT "Order Details" VALUES(10434,76,14.4,18,0.15) +INSERT "Order Details" VALUES(10435,2,15.2,10,0) +INSERT "Order Details" VALUES(10435,22,16.8,12,0) +INSERT "Order Details" VALUES(10435,72,27.8,10,0) +INSERT "Order Details" VALUES(10436,46,9.6,5,0) +INSERT "Order Details" VALUES(10436,56,30.4,40,0.1) +INSERT "Order Details" VALUES(10436,64,26.6,30,0.1) +INSERT "Order Details" VALUES(10436,75,6.2,24,0.1) +go +INSERT "Order Details" VALUES(10437,53,26.2,15,0) +INSERT "Order Details" VALUES(10438,19,7.3,15,0.2) +INSERT "Order Details" VALUES(10438,34,11.2,20,0.2) +INSERT "Order Details" VALUES(10438,57,15.6,15,0.2) +INSERT "Order Details" VALUES(10439,12,30.4,15,0) +INSERT "Order Details" VALUES(10439,16,13.9,16,0) +INSERT "Order Details" VALUES(10439,64,26.6,6,0) +INSERT "Order Details" VALUES(10439,74,8,30,0) +INSERT "Order Details" VALUES(10440,2,15.2,45,0.15) +INSERT "Order Details" VALUES(10440,16,13.9,49,0.15) +go +INSERT "Order Details" VALUES(10440,29,99,24,0.15) +INSERT "Order Details" VALUES(10440,61,22.8,90,0.15) +INSERT "Order Details" VALUES(10441,27,35.1,50,0) +INSERT "Order Details" VALUES(10442,11,16.8,30,0) +INSERT "Order Details" VALUES(10442,54,5.9,80,0) +INSERT "Order Details" VALUES(10442,66,13.6,60,0) +INSERT "Order Details" VALUES(10443,11,16.8,6,0.2) +INSERT "Order Details" VALUES(10443,28,36.4,12,0) +INSERT "Order Details" VALUES(10444,17,31.2,10,0) +INSERT "Order Details" VALUES(10444,26,24.9,15,0) +go +INSERT "Order Details" VALUES(10444,35,14.4,8,0) +INSERT "Order Details" VALUES(10444,41,7.7,30,0) +INSERT "Order Details" VALUES(10445,39,14.4,6,0) +INSERT "Order Details" VALUES(10445,54,5.9,15,0) +INSERT "Order Details" VALUES(10446,19,7.3,12,0.1) +INSERT "Order Details" VALUES(10446,24,3.6,20,0.1) +INSERT "Order Details" VALUES(10446,31,10,3,0.1) +INSERT "Order Details" VALUES(10446,52,5.6,15,0.1) +INSERT "Order Details" VALUES(10447,19,7.3,40,0) +INSERT "Order Details" VALUES(10447,65,16.8,35,0) +go +INSERT "Order Details" VALUES(10447,71,17.2,2,0) +INSERT "Order Details" VALUES(10448,26,24.9,6,0) +INSERT "Order Details" VALUES(10448,40,14.7,20,0) +INSERT "Order Details" VALUES(10449,10,24.8,14,0) +INSERT "Order Details" VALUES(10449,52,5.6,20,0) +INSERT "Order Details" VALUES(10449,62,39.4,35,0) +INSERT "Order Details" VALUES(10450,10,24.8,20,0.2) +INSERT "Order Details" VALUES(10450,54,5.9,6,0.2) +INSERT "Order Details" VALUES(10451,55,19.2,120,0.1) +INSERT "Order Details" VALUES(10451,64,26.6,35,0.1) +go +INSERT "Order Details" VALUES(10451,65,16.8,28,0.1) +INSERT "Order Details" VALUES(10451,77,10.4,55,0.1) +INSERT "Order Details" VALUES(10452,28,36.4,15,0) +INSERT "Order Details" VALUES(10452,44,15.5,100,0.05) +INSERT "Order Details" VALUES(10453,48,10.2,15,0.1) +INSERT "Order Details" VALUES(10453,70,12,25,0.1) +INSERT "Order Details" VALUES(10454,16,13.9,20,0.2) +INSERT "Order Details" VALUES(10454,33,2,20,0.2) +INSERT "Order Details" VALUES(10454,46,9.6,10,0.2) +INSERT "Order Details" VALUES(10455,39,14.4,20,0) +go +INSERT "Order Details" VALUES(10455,53,26.2,50,0) +INSERT "Order Details" VALUES(10455,61,22.8,25,0) +INSERT "Order Details" VALUES(10455,71,17.2,30,0) +INSERT "Order Details" VALUES(10456,21,8,40,0.15) +INSERT "Order Details" VALUES(10456,49,16,21,0.15) +INSERT "Order Details" VALUES(10457,59,44,36,0) +INSERT "Order Details" VALUES(10458,26,24.9,30,0) +INSERT "Order Details" VALUES(10458,28,36.4,30,0) +INSERT "Order Details" VALUES(10458,43,36.8,20,0) +INSERT "Order Details" VALUES(10458,56,30.4,15,0) +go +INSERT "Order Details" VALUES(10458,71,17.2,50,0) +INSERT "Order Details" VALUES(10459,7,24,16,0.05) +INSERT "Order Details" VALUES(10459,46,9.6,20,0.05) +INSERT "Order Details" VALUES(10459,72,27.8,40,0) +INSERT "Order Details" VALUES(10460,68,10,21,0.25) +INSERT "Order Details" VALUES(10460,75,6.2,4,0.25) +INSERT "Order Details" VALUES(10461,21,8,40,0.25) +INSERT "Order Details" VALUES(10461,30,20.7,28,0.25) +INSERT "Order Details" VALUES(10461,55,19.2,60,0.25) +INSERT "Order Details" VALUES(10462,13,4.8,1,0) +go +INSERT "Order Details" VALUES(10462,23,7.2,21,0) +INSERT "Order Details" VALUES(10463,19,7.3,21,0) +INSERT "Order Details" VALUES(10463,42,11.2,50,0) +INSERT "Order Details" VALUES(10464,4,17.6,16,0.2) +INSERT "Order Details" VALUES(10464,43,36.8,3,0) +INSERT "Order Details" VALUES(10464,56,30.4,30,0.2) +INSERT "Order Details" VALUES(10464,60,27.2,20,0) +INSERT "Order Details" VALUES(10465,24,3.6,25,0) +INSERT "Order Details" VALUES(10465,29,99,18,0.1) +INSERT "Order Details" VALUES(10465,40,14.7,20,0) +go +INSERT "Order Details" VALUES(10465,45,7.6,30,0.1) +INSERT "Order Details" VALUES(10465,50,13,25,0) +INSERT "Order Details" VALUES(10466,11,16.8,10,0) +INSERT "Order Details" VALUES(10466,46,9.6,5,0) +INSERT "Order Details" VALUES(10467,24,3.6,28,0) +INSERT "Order Details" VALUES(10467,25,11.2,12,0) +INSERT "Order Details" VALUES(10468,30,20.7,8,0) +INSERT "Order Details" VALUES(10468,43,36.8,15,0) +INSERT "Order Details" VALUES(10469,2,15.2,40,0.15) +INSERT "Order Details" VALUES(10469,16,13.9,35,0.15) +go +INSERT "Order Details" VALUES(10469,44,15.5,2,0.15) +INSERT "Order Details" VALUES(10470,18,50,30,0) +INSERT "Order Details" VALUES(10470,23,7.2,15,0) +INSERT "Order Details" VALUES(10470,64,26.6,8,0) +INSERT "Order Details" VALUES(10471,7,24,30,0) +INSERT "Order Details" VALUES(10471,56,30.4,20,0) +INSERT "Order Details" VALUES(10472,24,3.6,80,0.05) +INSERT "Order Details" VALUES(10472,51,42.4,18,0) +INSERT "Order Details" VALUES(10473,33,2,12,0) +INSERT "Order Details" VALUES(10473,71,17.2,12,0) +go +INSERT "Order Details" VALUES(10474,14,18.6,12,0) +INSERT "Order Details" VALUES(10474,28,36.4,18,0) +INSERT "Order Details" VALUES(10474,40,14.7,21,0) +INSERT "Order Details" VALUES(10474,75,6.2,10,0) +INSERT "Order Details" VALUES(10475,31,10,35,0.15) +INSERT "Order Details" VALUES(10475,66,13.6,60,0.15) +INSERT "Order Details" VALUES(10475,76,14.4,42,0.15) +INSERT "Order Details" VALUES(10476,55,19.2,2,0.05) +INSERT "Order Details" VALUES(10476,70,12,12,0) +INSERT "Order Details" VALUES(10477,1,14.4,15,0) +go +INSERT "Order Details" VALUES(10477,21,8,21,0.25) +INSERT "Order Details" VALUES(10477,39,14.4,20,0.25) +INSERT "Order Details" VALUES(10478,10,24.8,20,0.05) +INSERT "Order Details" VALUES(10479,38,210.8,30,0) +INSERT "Order Details" VALUES(10479,53,26.2,28,0) +INSERT "Order Details" VALUES(10479,59,44,60,0) +INSERT "Order Details" VALUES(10479,64,26.6,30,0) +INSERT "Order Details" VALUES(10480,47,7.6,30,0) +INSERT "Order Details" VALUES(10480,59,44,12,0) +INSERT "Order Details" VALUES(10481,49,16,24,0) +go +INSERT "Order Details" VALUES(10481,60,27.2,40,0) +INSERT "Order Details" VALUES(10482,40,14.7,10,0) +INSERT "Order Details" VALUES(10483,34,11.2,35,0.05) +INSERT "Order Details" VALUES(10483,77,10.4,30,0.05) +INSERT "Order Details" VALUES(10484,21,8,14,0) +INSERT "Order Details" VALUES(10484,40,14.7,10,0) +INSERT "Order Details" VALUES(10484,51,42.4,3,0) +INSERT "Order Details" VALUES(10485,2,15.2,20,0.1) +INSERT "Order Details" VALUES(10485,3,8,20,0.1) +INSERT "Order Details" VALUES(10485,55,19.2,30,0.1) +go +INSERT "Order Details" VALUES(10485,70,12,60,0.1) +INSERT "Order Details" VALUES(10486,11,16.8,5,0) +INSERT "Order Details" VALUES(10486,51,42.4,25,0) +INSERT "Order Details" VALUES(10486,74,8,16,0) +INSERT "Order Details" VALUES(10487,19,7.3,5,0) +INSERT "Order Details" VALUES(10487,26,24.9,30,0) +INSERT "Order Details" VALUES(10487,54,5.9,24,0.25) +INSERT "Order Details" VALUES(10488,59,44,30,0) +INSERT "Order Details" VALUES(10488,73,12,20,0.2) +INSERT "Order Details" VALUES(10489,11,16.8,15,0.25) +go +INSERT "Order Details" VALUES(10489,16,13.9,18,0) +INSERT "Order Details" VALUES(10490,59,44,60,0) +INSERT "Order Details" VALUES(10490,68,10,30,0) +INSERT "Order Details" VALUES(10490,75,6.2,36,0) +INSERT "Order Details" VALUES(10491,44,15.5,15,0.15) +INSERT "Order Details" VALUES(10491,77,10.4,7,0.15) +INSERT "Order Details" VALUES(10492,25,11.2,60,0.05) +INSERT "Order Details" VALUES(10492,42,11.2,20,0.05) +INSERT "Order Details" VALUES(10493,65,16.8,15,0.1) +INSERT "Order Details" VALUES(10493,66,13.6,10,0.1) +go +INSERT "Order Details" VALUES(10493,69,28.8,10,0.1) +INSERT "Order Details" VALUES(10494,56,30.4,30,0) +INSERT "Order Details" VALUES(10495,23,7.2,10,0) +INSERT "Order Details" VALUES(10495,41,7.7,20,0) +INSERT "Order Details" VALUES(10495,77,10.4,5,0) +INSERT "Order Details" VALUES(10496,31,10,20,0.05) +INSERT "Order Details" VALUES(10497,56,30.4,14,0) +INSERT "Order Details" VALUES(10497,72,27.8,25,0) +INSERT "Order Details" VALUES(10497,77,10.4,25,0) +INSERT "Order Details" VALUES(10498,24,4.5,14,0) +go +INSERT "Order Details" VALUES(10498,40,18.4,5,0) +INSERT "Order Details" VALUES(10498,42,14,30,0) +INSERT "Order Details" VALUES(10499,28,45.6,20,0) +INSERT "Order Details" VALUES(10499,49,20,25,0) +INSERT "Order Details" VALUES(10500,15,15.5,12,0.05) +INSERT "Order Details" VALUES(10500,28,45.6,8,0.05) +INSERT "Order Details" VALUES(10501,54,7.45,20,0) +INSERT "Order Details" VALUES(10502,45,9.5,21,0) +INSERT "Order Details" VALUES(10502,53,32.8,6,0) +INSERT "Order Details" VALUES(10502,67,14,30,0) +go +INSERT "Order Details" VALUES(10503,14,23.25,70,0) +INSERT "Order Details" VALUES(10503,65,21.05,20,0) +INSERT "Order Details" VALUES(10504,2,19,12,0) +INSERT "Order Details" VALUES(10504,21,10,12,0) +INSERT "Order Details" VALUES(10504,53,32.8,10,0) +INSERT "Order Details" VALUES(10504,61,28.5,25,0) +INSERT "Order Details" VALUES(10505,62,49.3,3,0) +INSERT "Order Details" VALUES(10506,25,14,18,0.1) +INSERT "Order Details" VALUES(10506,70,15,14,0.1) +INSERT "Order Details" VALUES(10507,43,46,15,0.15) +go +INSERT "Order Details" VALUES(10507,48,12.75,15,0.15) +INSERT "Order Details" VALUES(10508,13,6,10,0) +INSERT "Order Details" VALUES(10508,39,18,10,0) +INSERT "Order Details" VALUES(10509,28,45.6,3,0) +INSERT "Order Details" VALUES(10510,29,123.79,36,0) +INSERT "Order Details" VALUES(10510,75,7.75,36,0.1) +INSERT "Order Details" VALUES(10511,4,22,50,0.15) +INSERT "Order Details" VALUES(10511,7,30,50,0.15) +INSERT "Order Details" VALUES(10511,8,40,10,0.15) +INSERT "Order Details" VALUES(10512,24,4.5,10,0.15) +go +INSERT "Order Details" VALUES(10512,46,12,9,0.15) +INSERT "Order Details" VALUES(10512,47,9.5,6,0.15) +INSERT "Order Details" VALUES(10512,60,34,12,0.15) +INSERT "Order Details" VALUES(10513,21,10,40,0.2) +INSERT "Order Details" VALUES(10513,32,32,50,0.2) +INSERT "Order Details" VALUES(10513,61,28.5,15,0.2) +INSERT "Order Details" VALUES(10514,20,81,39,0) +INSERT "Order Details" VALUES(10514,28,45.6,35,0) +INSERT "Order Details" VALUES(10514,56,38,70,0) +INSERT "Order Details" VALUES(10514,65,21.05,39,0) +go +INSERT "Order Details" VALUES(10514,75,7.75,50,0) +INSERT "Order Details" VALUES(10515,9,97,16,0.15) +INSERT "Order Details" VALUES(10515,16,17.45,50,0) +INSERT "Order Details" VALUES(10515,27,43.9,120,0) +INSERT "Order Details" VALUES(10515,33,2.5,16,0.15) +INSERT "Order Details" VALUES(10515,60,34,84,0.15) +INSERT "Order Details" VALUES(10516,18,62.5,25,0.1) +INSERT "Order Details" VALUES(10516,41,9.65,80,0.1) +INSERT "Order Details" VALUES(10516,42,14,20,0) +INSERT "Order Details" VALUES(10517,52,7,6,0) +go +INSERT "Order Details" VALUES(10517,59,55,4,0) +INSERT "Order Details" VALUES(10517,70,15,6,0) +INSERT "Order Details" VALUES(10518,24,4.5,5,0) +INSERT "Order Details" VALUES(10518,38,263.5,15,0) +INSERT "Order Details" VALUES(10518,44,19.45,9,0) +INSERT "Order Details" VALUES(10519,10,31,16,0.05) +INSERT "Order Details" VALUES(10519,56,38,40,0) +INSERT "Order Details" VALUES(10519,60,34,10,0.05) +INSERT "Order Details" VALUES(10520,24,4.5,8,0) +INSERT "Order Details" VALUES(10520,53,32.8,5,0) +go +INSERT "Order Details" VALUES(10521,35,18,3,0) +INSERT "Order Details" VALUES(10521,41,9.65,10,0) +INSERT "Order Details" VALUES(10521,68,12.5,6,0) +INSERT "Order Details" VALUES(10522,1,18,40,0.2) +INSERT "Order Details" VALUES(10522,8,40,24,0) +INSERT "Order Details" VALUES(10522,30,25.89,20,0.2) +INSERT "Order Details" VALUES(10522,40,18.4,25,0.2) +INSERT "Order Details" VALUES(10523,17,39,25,0.1) +INSERT "Order Details" VALUES(10523,20,81,15,0.1) +INSERT "Order Details" VALUES(10523,37,26,18,0.1) +go +INSERT "Order Details" VALUES(10523,41,9.65,6,0.1) +INSERT "Order Details" VALUES(10524,10,31,2,0) +INSERT "Order Details" VALUES(10524,30,25.89,10,0) +INSERT "Order Details" VALUES(10524,43,46,60,0) +INSERT "Order Details" VALUES(10524,54,7.45,15,0) +INSERT "Order Details" VALUES(10525,36,19,30,0) +INSERT "Order Details" VALUES(10525,40,18.4,15,0.1) +INSERT "Order Details" VALUES(10526,1,18,8,0.15) +INSERT "Order Details" VALUES(10526,13,6,10,0) +INSERT "Order Details" VALUES(10526,56,38,30,0.15) +go +INSERT "Order Details" VALUES(10527,4,22,50,0.1) +INSERT "Order Details" VALUES(10527,36,19,30,0.1) +INSERT "Order Details" VALUES(10528,11,21,3,0) +INSERT "Order Details" VALUES(10528,33,2.5,8,0.2) +INSERT "Order Details" VALUES(10528,72,34.8,9,0) +INSERT "Order Details" VALUES(10529,55,24,14,0) +INSERT "Order Details" VALUES(10529,68,12.5,20,0) +INSERT "Order Details" VALUES(10529,69,36,10,0) +INSERT "Order Details" VALUES(10530,17,39,40,0) +INSERT "Order Details" VALUES(10530,43,46,25,0) +go +INSERT "Order Details" VALUES(10530,61,28.5,20,0) +INSERT "Order Details" VALUES(10530,76,18,50,0) +INSERT "Order Details" VALUES(10531,59,55,2,0) +INSERT "Order Details" VALUES(10532,30,25.89,15,0) +INSERT "Order Details" VALUES(10532,66,17,24,0) +INSERT "Order Details" VALUES(10533,4,22,50,0.05) +INSERT "Order Details" VALUES(10533,72,34.8,24,0) +INSERT "Order Details" VALUES(10533,73,15,24,0.05) +INSERT "Order Details" VALUES(10534,30,25.89,10,0) +INSERT "Order Details" VALUES(10534,40,18.4,10,0.2) +go +INSERT "Order Details" VALUES(10534,54,7.45,10,0.2) +INSERT "Order Details" VALUES(10535,11,21,50,0.1) +INSERT "Order Details" VALUES(10535,40,18.4,10,0.1) +INSERT "Order Details" VALUES(10535,57,19.5,5,0.1) +INSERT "Order Details" VALUES(10535,59,55,15,0.1) +INSERT "Order Details" VALUES(10536,12,38,15,0.25) +INSERT "Order Details" VALUES(10536,31,12.5,20,0) +INSERT "Order Details" VALUES(10536,33,2.5,30,0) +INSERT "Order Details" VALUES(10536,60,34,35,0.25) +INSERT "Order Details" VALUES(10537,31,12.5,30,0) +go +INSERT "Order Details" VALUES(10537,51,53,6,0) +INSERT "Order Details" VALUES(10537,58,13.25,20,0) +INSERT "Order Details" VALUES(10537,72,34.8,21,0) +INSERT "Order Details" VALUES(10537,73,15,9,0) +INSERT "Order Details" VALUES(10538,70,15,7,0) +INSERT "Order Details" VALUES(10538,72,34.8,1,0) +INSERT "Order Details" VALUES(10539,13,6,8,0) +INSERT "Order Details" VALUES(10539,21,10,15,0) +INSERT "Order Details" VALUES(10539,33,2.5,15,0) +INSERT "Order Details" VALUES(10539,49,20,6,0) +go +INSERT "Order Details" VALUES(10540,3,10,60,0) +INSERT "Order Details" VALUES(10540,26,31.23,40,0) +INSERT "Order Details" VALUES(10540,38,263.5,30,0) +INSERT "Order Details" VALUES(10540,68,12.5,35,0) +INSERT "Order Details" VALUES(10541,24,4.5,35,0.1) +INSERT "Order Details" VALUES(10541,38,263.5,4,0.1) +INSERT "Order Details" VALUES(10541,65,21.05,36,0.1) +INSERT "Order Details" VALUES(10541,71,21.5,9,0.1) +INSERT "Order Details" VALUES(10542,11,21,15,0.05) +INSERT "Order Details" VALUES(10542,54,7.45,24,0.05) +go +INSERT "Order Details" VALUES(10543,12,38,30,0.15) +INSERT "Order Details" VALUES(10543,23,9,70,0.15) +INSERT "Order Details" VALUES(10544,28,45.6,7,0) +INSERT "Order Details" VALUES(10544,67,14,7,0) +INSERT "Order Details" VALUES(10545,11,21,10,0) +INSERT "Order Details" VALUES(10546,7,30,10,0) +INSERT "Order Details" VALUES(10546,35,18,30,0) +INSERT "Order Details" VALUES(10546,62,49.3,40,0) +INSERT "Order Details" VALUES(10547,32,32,24,0.15) +INSERT "Order Details" VALUES(10547,36,19,60,0) +go +INSERT "Order Details" VALUES(10548,34,14,10,0.25) +INSERT "Order Details" VALUES(10548,41,9.65,14,0) +INSERT "Order Details" VALUES(10549,31,12.5,55,0.15) +INSERT "Order Details" VALUES(10549,45,9.5,100,0.15) +INSERT "Order Details" VALUES(10549,51,53,48,0.15) +INSERT "Order Details" VALUES(10550,17,39,8,0.1) +INSERT "Order Details" VALUES(10550,19,9.2,10,0) +INSERT "Order Details" VALUES(10550,21,10,6,0.1) +INSERT "Order Details" VALUES(10550,61,28.5,10,0.1) +INSERT "Order Details" VALUES(10551,16,17.45,40,0.15) +go +INSERT "Order Details" VALUES(10551,35,18,20,0.15) +INSERT "Order Details" VALUES(10551,44,19.45,40,0) +INSERT "Order Details" VALUES(10552,69,36,18,0) +INSERT "Order Details" VALUES(10552,75,7.75,30,0) +INSERT "Order Details" VALUES(10553,11,21,15,0) +INSERT "Order Details" VALUES(10553,16,17.45,14,0) +INSERT "Order Details" VALUES(10553,22,21,24,0) +INSERT "Order Details" VALUES(10553,31,12.5,30,0) +INSERT "Order Details" VALUES(10553,35,18,6,0) +INSERT "Order Details" VALUES(10554,16,17.45,30,0.05) +go +INSERT "Order Details" VALUES(10554,23,9,20,0.05) +INSERT "Order Details" VALUES(10554,62,49.3,20,0.05) +INSERT "Order Details" VALUES(10554,77,13,10,0.05) +INSERT "Order Details" VALUES(10555,14,23.25,30,0.2) +INSERT "Order Details" VALUES(10555,19,9.2,35,0.2) +INSERT "Order Details" VALUES(10555,24,4.5,18,0.2) +INSERT "Order Details" VALUES(10555,51,53,20,0.2) +INSERT "Order Details" VALUES(10555,56,38,40,0.2) +INSERT "Order Details" VALUES(10556,72,34.8,24,0) +INSERT "Order Details" VALUES(10557,64,33.25,30,0) +go +INSERT "Order Details" VALUES(10557,75,7.75,20,0) +INSERT "Order Details" VALUES(10558,47,9.5,25,0) +INSERT "Order Details" VALUES(10558,51,53,20,0) +INSERT "Order Details" VALUES(10558,52,7,30,0) +INSERT "Order Details" VALUES(10558,53,32.8,18,0) +INSERT "Order Details" VALUES(10558,73,15,3,0) +INSERT "Order Details" VALUES(10559,41,9.65,12,0.05) +INSERT "Order Details" VALUES(10559,55,24,18,0.05) +INSERT "Order Details" VALUES(10560,30,25.89,20,0) +INSERT "Order Details" VALUES(10560,62,49.3,15,0.25) +go +INSERT "Order Details" VALUES(10561,44,19.45,10,0) +INSERT "Order Details" VALUES(10561,51,53,50,0) +INSERT "Order Details" VALUES(10562,33,2.5,20,0.1) +INSERT "Order Details" VALUES(10562,62,49.3,10,0.1) +INSERT "Order Details" VALUES(10563,36,19,25,0) +INSERT "Order Details" VALUES(10563,52,7,70,0) +INSERT "Order Details" VALUES(10564,17,39,16,0.05) +INSERT "Order Details" VALUES(10564,31,12.5,6,0.05) +INSERT "Order Details" VALUES(10564,55,24,25,0.05) +INSERT "Order Details" VALUES(10565,24,4.5,25,0.1) +go +INSERT "Order Details" VALUES(10565,64,33.25,18,0.1) +INSERT "Order Details" VALUES(10566,11,21,35,0.15) +INSERT "Order Details" VALUES(10566,18,62.5,18,0.15) +INSERT "Order Details" VALUES(10566,76,18,10,0) +INSERT "Order Details" VALUES(10567,31,12.5,60,0.2) +INSERT "Order Details" VALUES(10567,51,53,3,0) +INSERT "Order Details" VALUES(10567,59,55,40,0.2) +INSERT "Order Details" VALUES(10568,10,31,5,0) +INSERT "Order Details" VALUES(10569,31,12.5,35,0.2) +INSERT "Order Details" VALUES(10569,76,18,30,0) +go +INSERT "Order Details" VALUES(10570,11,21,15,0.05) +INSERT "Order Details" VALUES(10570,56,38,60,0.05) +INSERT "Order Details" VALUES(10571,14,23.25,11,0.15) +INSERT "Order Details" VALUES(10571,42,14,28,0.15) +INSERT "Order Details" VALUES(10572,16,17.45,12,0.1) +INSERT "Order Details" VALUES(10572,32,32,10,0.1) +INSERT "Order Details" VALUES(10572,40,18.4,50,0) +INSERT "Order Details" VALUES(10572,75,7.75,15,0.1) +INSERT "Order Details" VALUES(10573,17,39,18,0) +INSERT "Order Details" VALUES(10573,34,14,40,0) +go +INSERT "Order Details" VALUES(10573,53,32.8,25,0) +INSERT "Order Details" VALUES(10574,33,2.5,14,0) +INSERT "Order Details" VALUES(10574,40,18.4,2,0) +INSERT "Order Details" VALUES(10574,62,49.3,10,0) +INSERT "Order Details" VALUES(10574,64,33.25,6,0) +INSERT "Order Details" VALUES(10575,59,55,12,0) +INSERT "Order Details" VALUES(10575,63,43.9,6,0) +INSERT "Order Details" VALUES(10575,72,34.8,30,0) +INSERT "Order Details" VALUES(10575,76,18,10,0) +INSERT "Order Details" VALUES(10576,1,18,10,0) +go +INSERT "Order Details" VALUES(10576,31,12.5,20,0) +INSERT "Order Details" VALUES(10576,44,19.45,21,0) +INSERT "Order Details" VALUES(10577,39,18,10,0) +INSERT "Order Details" VALUES(10577,75,7.75,20,0) +INSERT "Order Details" VALUES(10577,77,13,18,0) +INSERT "Order Details" VALUES(10578,35,18,20,0) +INSERT "Order Details" VALUES(10578,57,19.5,6,0) +INSERT "Order Details" VALUES(10579,15,15.5,10,0) +INSERT "Order Details" VALUES(10579,75,7.75,21,0) +INSERT "Order Details" VALUES(10580,14,23.25,15,0.05) +go +INSERT "Order Details" VALUES(10580,41,9.65,9,0.05) +INSERT "Order Details" VALUES(10580,65,21.05,30,0.05) +INSERT "Order Details" VALUES(10581,75,7.75,50,0.2) +INSERT "Order Details" VALUES(10582,57,19.5,4,0) +INSERT "Order Details" VALUES(10582,76,18,14,0) +INSERT "Order Details" VALUES(10583,29,123.79,10,0) +INSERT "Order Details" VALUES(10583,60,34,24,0.15) +INSERT "Order Details" VALUES(10583,69,36,10,0.15) +INSERT "Order Details" VALUES(10584,31,12.5,50,0.05) +INSERT "Order Details" VALUES(10585,47,9.5,15,0) +go +INSERT "Order Details" VALUES(10586,52,7,4,0.15) +INSERT "Order Details" VALUES(10587,26,31.23,6,0) +INSERT "Order Details" VALUES(10587,35,18,20,0) +INSERT "Order Details" VALUES(10587,77,13,20,0) +INSERT "Order Details" VALUES(10588,18,62.5,40,0.2) +INSERT "Order Details" VALUES(10588,42,14,100,0.2) +INSERT "Order Details" VALUES(10589,35,18,4,0) +INSERT "Order Details" VALUES(10590,1,18,20,0) +INSERT "Order Details" VALUES(10590,77,13,60,0.05) +INSERT "Order Details" VALUES(10591,3,10,14,0) +go +INSERT "Order Details" VALUES(10591,7,30,10,0) +INSERT "Order Details" VALUES(10591,54,7.45,50,0) +INSERT "Order Details" VALUES(10592,15,15.5,25,0.05) +INSERT "Order Details" VALUES(10592,26,31.23,5,0.05) +INSERT "Order Details" VALUES(10593,20,81,21,0.2) +INSERT "Order Details" VALUES(10593,69,36,20,0.2) +INSERT "Order Details" VALUES(10593,76,18,4,0.2) +INSERT "Order Details" VALUES(10594,52,7,24,0) +INSERT "Order Details" VALUES(10594,58,13.25,30,0) +INSERT "Order Details" VALUES(10595,35,18,30,0.25) +go +INSERT "Order Details" VALUES(10595,61,28.5,120,0.25) +INSERT "Order Details" VALUES(10595,69,36,65,0.25) +INSERT "Order Details" VALUES(10596,56,38,5,0.2) +INSERT "Order Details" VALUES(10596,63,43.9,24,0.2) +INSERT "Order Details" VALUES(10596,75,7.75,30,0.2) +INSERT "Order Details" VALUES(10597,24,4.5,35,0.2) +INSERT "Order Details" VALUES(10597,57,19.5,20,0) +INSERT "Order Details" VALUES(10597,65,21.05,12,0.2) +INSERT "Order Details" VALUES(10598,27,43.9,50,0) +INSERT "Order Details" VALUES(10598,71,21.5,9,0) +go +INSERT "Order Details" VALUES(10599,62,49.3,10,0) +INSERT "Order Details" VALUES(10600,54,7.45,4,0) +INSERT "Order Details" VALUES(10600,73,15,30,0) +INSERT "Order Details" VALUES(10601,13,6,60,0) +INSERT "Order Details" VALUES(10601,59,55,35,0) +INSERT "Order Details" VALUES(10602,77,13,5,0.25) +INSERT "Order Details" VALUES(10603,22,21,48,0) +INSERT "Order Details" VALUES(10603,49,20,25,0.05) +INSERT "Order Details" VALUES(10604,48,12.75,6,0.1) +INSERT "Order Details" VALUES(10604,76,18,10,0.1) +go +INSERT "Order Details" VALUES(10605,16,17.45,30,0.05) +INSERT "Order Details" VALUES(10605,59,55,20,0.05) +INSERT "Order Details" VALUES(10605,60,34,70,0.05) +INSERT "Order Details" VALUES(10605,71,21.5,15,0.05) +INSERT "Order Details" VALUES(10606,4,22,20,0.2) +INSERT "Order Details" VALUES(10606,55,24,20,0.2) +INSERT "Order Details" VALUES(10606,62,49.3,10,0.2) +INSERT "Order Details" VALUES(10607,7,30,45,0) +INSERT "Order Details" VALUES(10607,17,39,100,0) +INSERT "Order Details" VALUES(10607,33,2.5,14,0) +go +INSERT "Order Details" VALUES(10607,40,18.4,42,0) +INSERT "Order Details" VALUES(10607,72,34.8,12,0) +INSERT "Order Details" VALUES(10608,56,38,28,0) +INSERT "Order Details" VALUES(10609,1,18,3,0) +INSERT "Order Details" VALUES(10609,10,31,10,0) +INSERT "Order Details" VALUES(10609,21,10,6,0) +INSERT "Order Details" VALUES(10610,36,19,21,0.25) +INSERT "Order Details" VALUES(10611,1,18,6,0) +INSERT "Order Details" VALUES(10611,2,19,10,0) +INSERT "Order Details" VALUES(10611,60,34,15,0) +go +INSERT "Order Details" VALUES(10612,10,31,70,0) +INSERT "Order Details" VALUES(10612,36,19,55,0) +INSERT "Order Details" VALUES(10612,49,20,18,0) +INSERT "Order Details" VALUES(10612,60,34,40,0) +INSERT "Order Details" VALUES(10612,76,18,80,0) +INSERT "Order Details" VALUES(10613,13,6,8,0.1) +INSERT "Order Details" VALUES(10613,75,7.75,40,0) +INSERT "Order Details" VALUES(10614,11,21,14,0) +INSERT "Order Details" VALUES(10614,21,10,8,0) +INSERT "Order Details" VALUES(10614,39,18,5,0) +go +INSERT "Order Details" VALUES(10615,55,24,5,0) +INSERT "Order Details" VALUES(10616,38,263.5,15,0.05) +INSERT "Order Details" VALUES(10616,56,38,14,0) +INSERT "Order Details" VALUES(10616,70,15,15,0.05) +INSERT "Order Details" VALUES(10616,71,21.5,15,0.05) +INSERT "Order Details" VALUES(10617,59,55,30,0.15) +INSERT "Order Details" VALUES(10618,6,25,70,0) +INSERT "Order Details" VALUES(10618,56,38,20,0) +INSERT "Order Details" VALUES(10618,68,12.5,15,0) +INSERT "Order Details" VALUES(10619,21,10,42,0) +go +INSERT "Order Details" VALUES(10619,22,21,40,0) +INSERT "Order Details" VALUES(10620,24,4.5,5,0) +INSERT "Order Details" VALUES(10620,52,7,5,0) +INSERT "Order Details" VALUES(10621,19,9.2,5,0) +INSERT "Order Details" VALUES(10621,23,9,10,0) +INSERT "Order Details" VALUES(10621,70,15,20,0) +INSERT "Order Details" VALUES(10621,71,21.5,15,0) +INSERT "Order Details" VALUES(10622,2,19,20,0) +INSERT "Order Details" VALUES(10622,68,12.5,18,0.2) +INSERT "Order Details" VALUES(10623,14,23.25,21,0) +go +INSERT "Order Details" VALUES(10623,19,9.2,15,0.1) +INSERT "Order Details" VALUES(10623,21,10,25,0.1) +INSERT "Order Details" VALUES(10623,24,4.5,3,0) +INSERT "Order Details" VALUES(10623,35,18,30,0.1) +INSERT "Order Details" VALUES(10624,28,45.6,10,0) +INSERT "Order Details" VALUES(10624,29,123.79,6,0) +INSERT "Order Details" VALUES(10624,44,19.45,10,0) +INSERT "Order Details" VALUES(10625,14,23.25,3,0) +INSERT "Order Details" VALUES(10625,42,14,5,0) +INSERT "Order Details" VALUES(10625,60,34,10,0) +go +INSERT "Order Details" VALUES(10626,53,32.8,12,0) +INSERT "Order Details" VALUES(10626,60,34,20,0) +INSERT "Order Details" VALUES(10626,71,21.5,20,0) +INSERT "Order Details" VALUES(10627,62,49.3,15,0) +INSERT "Order Details" VALUES(10627,73,15,35,0.15) +INSERT "Order Details" VALUES(10628,1,18,25,0) +INSERT "Order Details" VALUES(10629,29,123.79,20,0) +INSERT "Order Details" VALUES(10629,64,33.25,9,0) +INSERT "Order Details" VALUES(10630,55,24,12,0.05) +INSERT "Order Details" VALUES(10630,76,18,35,0) +go +INSERT "Order Details" VALUES(10631,75,7.75,8,0.1) +INSERT "Order Details" VALUES(10632,2,19,30,0.05) +INSERT "Order Details" VALUES(10632,33,2.5,20,0.05) +INSERT "Order Details" VALUES(10633,12,38,36,0.15) +INSERT "Order Details" VALUES(10633,13,6,13,0.15) +INSERT "Order Details" VALUES(10633,26,31.23,35,0.15) +INSERT "Order Details" VALUES(10633,62,49.3,80,0.15) +INSERT "Order Details" VALUES(10634,7,30,35,0) +INSERT "Order Details" VALUES(10634,18,62.5,50,0) +INSERT "Order Details" VALUES(10634,51,53,15,0) +go +INSERT "Order Details" VALUES(10634,75,7.75,2,0) +INSERT "Order Details" VALUES(10635,4,22,10,0.1) +INSERT "Order Details" VALUES(10635,5,21.35,15,0.1) +INSERT "Order Details" VALUES(10635,22,21,40,0) +INSERT "Order Details" VALUES(10636,4,22,25,0) +INSERT "Order Details" VALUES(10636,58,13.25,6,0) +INSERT "Order Details" VALUES(10637,11,21,10,0) +INSERT "Order Details" VALUES(10637,50,16.25,25,0.05) +INSERT "Order Details" VALUES(10637,56,38,60,0.05) +INSERT "Order Details" VALUES(10638,45,9.5,20,0) +go +INSERT "Order Details" VALUES(10638,65,21.05,21,0) +INSERT "Order Details" VALUES(10638,72,34.8,60,0) +INSERT "Order Details" VALUES(10639,18,62.5,8,0) +INSERT "Order Details" VALUES(10640,69,36,20,0.25) +INSERT "Order Details" VALUES(10640,70,15,15,0.25) +INSERT "Order Details" VALUES(10641,2,19,50,0) +INSERT "Order Details" VALUES(10641,40,18.4,60,0) +INSERT "Order Details" VALUES(10642,21,10,30,0.2) +INSERT "Order Details" VALUES(10642,61,28.5,20,0.2) +INSERT "Order Details" VALUES(10643,28,45.6,15,0.25) +go +INSERT "Order Details" VALUES(10643,39,18,21,0.25) +INSERT "Order Details" VALUES(10643,46,12,2,0.25) +INSERT "Order Details" VALUES(10644,18,62.5,4,0.1) +INSERT "Order Details" VALUES(10644,43,46,20,0) +INSERT "Order Details" VALUES(10644,46,12,21,0.1) +INSERT "Order Details" VALUES(10645,18,62.5,20,0) +INSERT "Order Details" VALUES(10645,36,19,15,0) +INSERT "Order Details" VALUES(10646,1,18,15,0.25) +INSERT "Order Details" VALUES(10646,10,31,18,0.25) +INSERT "Order Details" VALUES(10646,71,21.5,30,0.25) +go +INSERT "Order Details" VALUES(10646,77,13,35,0.25) +INSERT "Order Details" VALUES(10647,19,9.2,30,0) +INSERT "Order Details" VALUES(10647,39,18,20,0) +INSERT "Order Details" VALUES(10648,22,21,15,0) +INSERT "Order Details" VALUES(10648,24,4.5,15,0.15) +INSERT "Order Details" VALUES(10649,28,45.6,20,0) +INSERT "Order Details" VALUES(10649,72,34.8,15,0) +INSERT "Order Details" VALUES(10650,30,25.89,30,0) +INSERT "Order Details" VALUES(10650,53,32.8,25,0.05) +INSERT "Order Details" VALUES(10650,54,7.45,30,0) +go +INSERT "Order Details" VALUES(10651,19,9.2,12,0.25) +INSERT "Order Details" VALUES(10651,22,21,20,0.25) +INSERT "Order Details" VALUES(10652,30,25.89,2,0.25) +INSERT "Order Details" VALUES(10652,42,14,20,0) +INSERT "Order Details" VALUES(10653,16,17.45,30,0.1) +INSERT "Order Details" VALUES(10653,60,34,20,0.1) +INSERT "Order Details" VALUES(10654,4,22,12,0.1) +INSERT "Order Details" VALUES(10654,39,18,20,0.1) +INSERT "Order Details" VALUES(10654,54,7.45,6,0.1) +INSERT "Order Details" VALUES(10655,41,9.65,20,0.2) +go +INSERT "Order Details" VALUES(10656,14,23.25,3,0.1) +INSERT "Order Details" VALUES(10656,44,19.45,28,0.1) +INSERT "Order Details" VALUES(10656,47,9.5,6,0.1) +INSERT "Order Details" VALUES(10657,15,15.5,50,0) +INSERT "Order Details" VALUES(10657,41,9.65,24,0) +INSERT "Order Details" VALUES(10657,46,12,45,0) +INSERT "Order Details" VALUES(10657,47,9.5,10,0) +INSERT "Order Details" VALUES(10657,56,38,45,0) +INSERT "Order Details" VALUES(10657,60,34,30,0) +INSERT "Order Details" VALUES(10658,21,10,60,0) +go +INSERT "Order Details" VALUES(10658,40,18.4,70,0.05) +INSERT "Order Details" VALUES(10658,60,34,55,0.05) +INSERT "Order Details" VALUES(10658,77,13,70,0.05) +INSERT "Order Details" VALUES(10659,31,12.5,20,0.05) +INSERT "Order Details" VALUES(10659,40,18.4,24,0.05) +INSERT "Order Details" VALUES(10659,70,15,40,0.05) +INSERT "Order Details" VALUES(10660,20,81,21,0) +INSERT "Order Details" VALUES(10661,39,18,3,0.2) +INSERT "Order Details" VALUES(10661,58,13.25,49,0.2) +INSERT "Order Details" VALUES(10662,68,12.5,10,0) +go +INSERT "Order Details" VALUES(10663,40,18.4,30,0.05) +INSERT "Order Details" VALUES(10663,42,14,30,0.05) +INSERT "Order Details" VALUES(10663,51,53,20,0.05) +INSERT "Order Details" VALUES(10664,10,31,24,0.15) +INSERT "Order Details" VALUES(10664,56,38,12,0.15) +INSERT "Order Details" VALUES(10664,65,21.05,15,0.15) +INSERT "Order Details" VALUES(10665,51,53,20,0) +INSERT "Order Details" VALUES(10665,59,55,1,0) +INSERT "Order Details" VALUES(10665,76,18,10,0) +INSERT "Order Details" VALUES(10666,29,123.79,36,0) +go +INSERT "Order Details" VALUES(10666,65,21.05,10,0) +INSERT "Order Details" VALUES(10667,69,36,45,0.2) +INSERT "Order Details" VALUES(10667,71,21.5,14,0.2) +INSERT "Order Details" VALUES(10668,31,12.5,8,0.1) +INSERT "Order Details" VALUES(10668,55,24,4,0.1) +INSERT "Order Details" VALUES(10668,64,33.25,15,0.1) +INSERT "Order Details" VALUES(10669,36,19,30,0) +INSERT "Order Details" VALUES(10670,23,9,32,0) +INSERT "Order Details" VALUES(10670,46,12,60,0) +INSERT "Order Details" VALUES(10670,67,14,25,0) +go +INSERT "Order Details" VALUES(10670,73,15,50,0) +INSERT "Order Details" VALUES(10670,75,7.75,25,0) +INSERT "Order Details" VALUES(10671,16,17.45,10,0) +INSERT "Order Details" VALUES(10671,62,49.3,10,0) +INSERT "Order Details" VALUES(10671,65,21.05,12,0) +INSERT "Order Details" VALUES(10672,38,263.5,15,0.1) +INSERT "Order Details" VALUES(10672,71,21.5,12,0) +INSERT "Order Details" VALUES(10673,16,17.45,3,0) +INSERT "Order Details" VALUES(10673,42,14,6,0) +INSERT "Order Details" VALUES(10673,43,46,6,0) +go +INSERT "Order Details" VALUES(10674,23,9,5,0) +INSERT "Order Details" VALUES(10675,14,23.25,30,0) +INSERT "Order Details" VALUES(10675,53,32.8,10,0) +INSERT "Order Details" VALUES(10675,58,13.25,30,0) +INSERT "Order Details" VALUES(10676,10,31,2,0) +INSERT "Order Details" VALUES(10676,19,9.2,7,0) +INSERT "Order Details" VALUES(10676,44,19.45,21,0) +INSERT "Order Details" VALUES(10677,26,31.23,30,0.15) +INSERT "Order Details" VALUES(10677,33,2.5,8,0.15) +INSERT "Order Details" VALUES(10678,12,38,100,0) +go +INSERT "Order Details" VALUES(10678,33,2.5,30,0) +INSERT "Order Details" VALUES(10678,41,9.65,120,0) +INSERT "Order Details" VALUES(10678,54,7.45,30,0) +INSERT "Order Details" VALUES(10679,59,55,12,0) +INSERT "Order Details" VALUES(10680,16,17.45,50,0.25) +INSERT "Order Details" VALUES(10680,31,12.5,20,0.25) +INSERT "Order Details" VALUES(10680,42,14,40,0.25) +INSERT "Order Details" VALUES(10681,19,9.2,30,0.1) +INSERT "Order Details" VALUES(10681,21,10,12,0.1) +INSERT "Order Details" VALUES(10681,64,33.25,28,0) +go +INSERT "Order Details" VALUES(10682,33,2.5,30,0) +INSERT "Order Details" VALUES(10682,66,17,4,0) +INSERT "Order Details" VALUES(10682,75,7.75,30,0) +INSERT "Order Details" VALUES(10683,52,7,9,0) +INSERT "Order Details" VALUES(10684,40,18.4,20,0) +INSERT "Order Details" VALUES(10684,47,9.5,40,0) +INSERT "Order Details" VALUES(10684,60,34,30,0) +INSERT "Order Details" VALUES(10685,10,31,20,0) +INSERT "Order Details" VALUES(10685,41,9.65,4,0) +INSERT "Order Details" VALUES(10685,47,9.5,15,0) +go +INSERT "Order Details" VALUES(10686,17,39,30,0.2) +INSERT "Order Details" VALUES(10686,26,31.23,15,0) +INSERT "Order Details" VALUES(10687,9,97,50,0.25) +INSERT "Order Details" VALUES(10687,29,123.79,10,0) +INSERT "Order Details" VALUES(10687,36,19,6,0.25) +INSERT "Order Details" VALUES(10688,10,31,18,0.1) +INSERT "Order Details" VALUES(10688,28,45.6,60,0.1) +INSERT "Order Details" VALUES(10688,34,14,14,0) +INSERT "Order Details" VALUES(10689,1,18,35,0.25) +INSERT "Order Details" VALUES(10690,56,38,20,0.25) +go +INSERT "Order Details" VALUES(10690,77,13,30,0.25) +INSERT "Order Details" VALUES(10691,1,18,30,0) +INSERT "Order Details" VALUES(10691,29,123.79,40,0) +INSERT "Order Details" VALUES(10691,43,46,40,0) +INSERT "Order Details" VALUES(10691,44,19.45,24,0) +INSERT "Order Details" VALUES(10691,62,49.3,48,0) +INSERT "Order Details" VALUES(10692,63,43.9,20,0) +INSERT "Order Details" VALUES(10693,9,97,6,0) +INSERT "Order Details" VALUES(10693,54,7.45,60,0.15) +INSERT "Order Details" VALUES(10693,69,36,30,0.15) +go +INSERT "Order Details" VALUES(10693,73,15,15,0.15) +INSERT "Order Details" VALUES(10694,7,30,90,0) +INSERT "Order Details" VALUES(10694,59,55,25,0) +INSERT "Order Details" VALUES(10694,70,15,50,0) +INSERT "Order Details" VALUES(10695,8,40,10,0) +INSERT "Order Details" VALUES(10695,12,38,4,0) +INSERT "Order Details" VALUES(10695,24,4.5,20,0) +INSERT "Order Details" VALUES(10696,17,39,20,0) +INSERT "Order Details" VALUES(10696,46,12,18,0) +INSERT "Order Details" VALUES(10697,19,9.2,7,0.25) +go +INSERT "Order Details" VALUES(10697,35,18,9,0.25) +INSERT "Order Details" VALUES(10697,58,13.25,30,0.25) +INSERT "Order Details" VALUES(10697,70,15,30,0.25) +INSERT "Order Details" VALUES(10698,11,21,15,0) +INSERT "Order Details" VALUES(10698,17,39,8,0.05) +INSERT "Order Details" VALUES(10698,29,123.79,12,0.05) +INSERT "Order Details" VALUES(10698,65,21.05,65,0.05) +INSERT "Order Details" VALUES(10698,70,15,8,0.05) +INSERT "Order Details" VALUES(10699,47,9.5,12,0) +INSERT "Order Details" VALUES(10700,1,18,5,0.2) +go +INSERT "Order Details" VALUES(10700,34,14,12,0.2) +INSERT "Order Details" VALUES(10700,68,12.5,40,0.2) +INSERT "Order Details" VALUES(10700,71,21.5,60,0.2) +INSERT "Order Details" VALUES(10701,59,55,42,0.15) +INSERT "Order Details" VALUES(10701,71,21.5,20,0.15) +INSERT "Order Details" VALUES(10701,76,18,35,0.15) +INSERT "Order Details" VALUES(10702,3,10,6,0) +INSERT "Order Details" VALUES(10702,76,18,15,0) +INSERT "Order Details" VALUES(10703,2,19,5,0) +INSERT "Order Details" VALUES(10703,59,55,35,0) +go +INSERT "Order Details" VALUES(10703,73,15,35,0) +INSERT "Order Details" VALUES(10704,4,22,6,0) +INSERT "Order Details" VALUES(10704,24,4.5,35,0) +INSERT "Order Details" VALUES(10704,48,12.75,24,0) +INSERT "Order Details" VALUES(10705,31,12.5,20,0) +INSERT "Order Details" VALUES(10705,32,32,4,0) +INSERT "Order Details" VALUES(10706,16,17.45,20,0) +INSERT "Order Details" VALUES(10706,43,46,24,0) +INSERT "Order Details" VALUES(10706,59,55,8,0) +INSERT "Order Details" VALUES(10707,55,24,21,0) +go +INSERT "Order Details" VALUES(10707,57,19.5,40,0) +INSERT "Order Details" VALUES(10707,70,15,28,0.15) +INSERT "Order Details" VALUES(10708,5,21.35,4,0) +INSERT "Order Details" VALUES(10708,36,19,5,0) +INSERT "Order Details" VALUES(10709,8,40,40,0) +INSERT "Order Details" VALUES(10709,51,53,28,0) +INSERT "Order Details" VALUES(10709,60,34,10,0) +INSERT "Order Details" VALUES(10710,19,9.2,5,0) +INSERT "Order Details" VALUES(10710,47,9.5,5,0) +INSERT "Order Details" VALUES(10711,19,9.2,12,0) +go +INSERT "Order Details" VALUES(10711,41,9.65,42,0) +INSERT "Order Details" VALUES(10711,53,32.8,120,0) +INSERT "Order Details" VALUES(10712,53,32.8,3,0.05) +INSERT "Order Details" VALUES(10712,56,38,30,0) +INSERT "Order Details" VALUES(10713,10,31,18,0) +INSERT "Order Details" VALUES(10713,26,31.23,30,0) +INSERT "Order Details" VALUES(10713,45,9.5,110,0) +INSERT "Order Details" VALUES(10713,46,12,24,0) +INSERT "Order Details" VALUES(10714,2,19,30,0.25) +INSERT "Order Details" VALUES(10714,17,39,27,0.25) +go +INSERT "Order Details" VALUES(10714,47,9.5,50,0.25) +INSERT "Order Details" VALUES(10714,56,38,18,0.25) +INSERT "Order Details" VALUES(10714,58,13.25,12,0.25) +INSERT "Order Details" VALUES(10715,10,31,21,0) +INSERT "Order Details" VALUES(10715,71,21.5,30,0) +INSERT "Order Details" VALUES(10716,21,10,5,0) +INSERT "Order Details" VALUES(10716,51,53,7,0) +INSERT "Order Details" VALUES(10716,61,28.5,10,0) +INSERT "Order Details" VALUES(10717,21,10,32,0.05) +INSERT "Order Details" VALUES(10717,54,7.45,15,0) +go +INSERT "Order Details" VALUES(10717,69,36,25,0.05) +INSERT "Order Details" VALUES(10718,12,38,36,0) +INSERT "Order Details" VALUES(10718,16,17.45,20,0) +INSERT "Order Details" VALUES(10718,36,19,40,0) +INSERT "Order Details" VALUES(10718,62,49.3,20,0) +INSERT "Order Details" VALUES(10719,18,62.5,12,0.25) +INSERT "Order Details" VALUES(10719,30,25.89,3,0.25) +INSERT "Order Details" VALUES(10719,54,7.45,40,0.25) +INSERT "Order Details" VALUES(10720,35,18,21,0) +INSERT "Order Details" VALUES(10720,71,21.5,8,0) +go +INSERT "Order Details" VALUES(10721,44,19.45,50,0.05) +INSERT "Order Details" VALUES(10722,2,19,3,0) +INSERT "Order Details" VALUES(10722,31,12.5,50,0) +INSERT "Order Details" VALUES(10722,68,12.5,45,0) +INSERT "Order Details" VALUES(10722,75,7.75,42,0) +INSERT "Order Details" VALUES(10723,26,31.23,15,0) +INSERT "Order Details" VALUES(10724,10,31,16,0) +INSERT "Order Details" VALUES(10724,61,28.5,5,0) +INSERT "Order Details" VALUES(10725,41,9.65,12,0) +INSERT "Order Details" VALUES(10725,52,7,4,0) +go +INSERT "Order Details" VALUES(10725,55,24,6,0) +INSERT "Order Details" VALUES(10726,4,22,25,0) +INSERT "Order Details" VALUES(10726,11,21,5,0) +INSERT "Order Details" VALUES(10727,17,39,20,0.05) +INSERT "Order Details" VALUES(10727,56,38,10,0.05) +INSERT "Order Details" VALUES(10727,59,55,10,0.05) +INSERT "Order Details" VALUES(10728,30,25.89,15,0) +INSERT "Order Details" VALUES(10728,40,18.4,6,0) +INSERT "Order Details" VALUES(10728,55,24,12,0) +INSERT "Order Details" VALUES(10728,60,34,15,0) +go +INSERT "Order Details" VALUES(10729,1,18,50,0) +INSERT "Order Details" VALUES(10729,21,10,30,0) +INSERT "Order Details" VALUES(10729,50,16.25,40,0) +INSERT "Order Details" VALUES(10730,16,17.45,15,0.05) +INSERT "Order Details" VALUES(10730,31,12.5,3,0.05) +INSERT "Order Details" VALUES(10730,65,21.05,10,0.05) +INSERT "Order Details" VALUES(10731,21,10,40,0.05) +INSERT "Order Details" VALUES(10731,51,53,30,0.05) +INSERT "Order Details" VALUES(10732,76,18,20,0) +INSERT "Order Details" VALUES(10733,14,23.25,16,0) +go +INSERT "Order Details" VALUES(10733,28,45.6,20,0) +INSERT "Order Details" VALUES(10733,52,7,25,0) +INSERT "Order Details" VALUES(10734,6,25,30,0) +INSERT "Order Details" VALUES(10734,30,25.89,15,0) +INSERT "Order Details" VALUES(10734,76,18,20,0) +INSERT "Order Details" VALUES(10735,61,28.5,20,0.1) +INSERT "Order Details" VALUES(10735,77,13,2,0.1) +INSERT "Order Details" VALUES(10736,65,21.05,40,0) +INSERT "Order Details" VALUES(10736,75,7.75,20,0) +INSERT "Order Details" VALUES(10737,13,6,4,0) +go +INSERT "Order Details" VALUES(10737,41,9.65,12,0) +INSERT "Order Details" VALUES(10738,16,17.45,3,0) +INSERT "Order Details" VALUES(10739,36,19,6,0) +INSERT "Order Details" VALUES(10739,52,7,18,0) +INSERT "Order Details" VALUES(10740,28,45.6,5,0.2) +INSERT "Order Details" VALUES(10740,35,18,35,0.2) +INSERT "Order Details" VALUES(10740,45,9.5,40,0.2) +INSERT "Order Details" VALUES(10740,56,38,14,0.2) +INSERT "Order Details" VALUES(10741,2,19,15,0.2) +INSERT "Order Details" VALUES(10742,3,10,20,0) +go +INSERT "Order Details" VALUES(10742,60,34,50,0) +INSERT "Order Details" VALUES(10742,72,34.8,35,0) +INSERT "Order Details" VALUES(10743,46,12,28,0.05) +INSERT "Order Details" VALUES(10744,40,18.4,50,0.2) +INSERT "Order Details" VALUES(10745,18,62.5,24,0) +INSERT "Order Details" VALUES(10745,44,19.45,16,0) +INSERT "Order Details" VALUES(10745,59,55,45,0) +INSERT "Order Details" VALUES(10745,72,34.8,7,0) +INSERT "Order Details" VALUES(10746,13,6,6,0) +INSERT "Order Details" VALUES(10746,42,14,28,0) +go +INSERT "Order Details" VALUES(10746,62,49.3,9,0) +INSERT "Order Details" VALUES(10746,69,36,40,0) +INSERT "Order Details" VALUES(10747,31,12.5,8,0) +INSERT "Order Details" VALUES(10747,41,9.65,35,0) +INSERT "Order Details" VALUES(10747,63,43.9,9,0) +INSERT "Order Details" VALUES(10747,69,36,30,0) +INSERT "Order Details" VALUES(10748,23,9,44,0) +INSERT "Order Details" VALUES(10748,40,18.4,40,0) +INSERT "Order Details" VALUES(10748,56,38,28,0) +INSERT "Order Details" VALUES(10749,56,38,15,0) +go +INSERT "Order Details" VALUES(10749,59,55,6,0) +INSERT "Order Details" VALUES(10749,76,18,10,0) +INSERT "Order Details" VALUES(10750,14,23.25,5,0.15) +INSERT "Order Details" VALUES(10750,45,9.5,40,0.15) +INSERT "Order Details" VALUES(10750,59,55,25,0.15) +INSERT "Order Details" VALUES(10751,26,31.23,12,0.1) +INSERT "Order Details" VALUES(10751,30,25.89,30,0) +INSERT "Order Details" VALUES(10751,50,16.25,20,0.1) +INSERT "Order Details" VALUES(10751,73,15,15,0) +INSERT "Order Details" VALUES(10752,1,18,8,0) +go +INSERT "Order Details" VALUES(10752,69,36,3,0) +INSERT "Order Details" VALUES(10753,45,9.5,4,0) +INSERT "Order Details" VALUES(10753,74,10,5,0) +INSERT "Order Details" VALUES(10754,40,18.4,3,0) +INSERT "Order Details" VALUES(10755,47,9.5,30,0.25) +INSERT "Order Details" VALUES(10755,56,38,30,0.25) +INSERT "Order Details" VALUES(10755,57,19.5,14,0.25) +INSERT "Order Details" VALUES(10755,69,36,25,0.25) +INSERT "Order Details" VALUES(10756,18,62.5,21,0.2) +INSERT "Order Details" VALUES(10756,36,19,20,0.2) +go +INSERT "Order Details" VALUES(10756,68,12.5,6,0.2) +INSERT "Order Details" VALUES(10756,69,36,20,0.2) +INSERT "Order Details" VALUES(10757,34,14,30,0) +INSERT "Order Details" VALUES(10757,59,55,7,0) +INSERT "Order Details" VALUES(10757,62,49.3,30,0) +INSERT "Order Details" VALUES(10757,64,33.25,24,0) +INSERT "Order Details" VALUES(10758,26,31.23,20,0) +INSERT "Order Details" VALUES(10758,52,7,60,0) +INSERT "Order Details" VALUES(10758,70,15,40,0) +INSERT "Order Details" VALUES(10759,32,32,10,0) +go +INSERT "Order Details" VALUES(10760,25,14,12,0.25) +INSERT "Order Details" VALUES(10760,27,43.9,40,0) +INSERT "Order Details" VALUES(10760,43,46,30,0.25) +INSERT "Order Details" VALUES(10761,25,14,35,0.25) +INSERT "Order Details" VALUES(10761,75,7.75,18,0) +INSERT "Order Details" VALUES(10762,39,18,16,0) +INSERT "Order Details" VALUES(10762,47,9.5,30,0) +INSERT "Order Details" VALUES(10762,51,53,28,0) +INSERT "Order Details" VALUES(10762,56,38,60,0) +INSERT "Order Details" VALUES(10763,21,10,40,0) +go +INSERT "Order Details" VALUES(10763,22,21,6,0) +INSERT "Order Details" VALUES(10763,24,4.5,20,0) +INSERT "Order Details" VALUES(10764,3,10,20,0.1) +INSERT "Order Details" VALUES(10764,39,18,130,0.1) +INSERT "Order Details" VALUES(10765,65,21.05,80,0.1) +INSERT "Order Details" VALUES(10766,2,19,40,0) +INSERT "Order Details" VALUES(10766,7,30,35,0) +INSERT "Order Details" VALUES(10766,68,12.5,40,0) +INSERT "Order Details" VALUES(10767,42,14,2,0) +INSERT "Order Details" VALUES(10768,22,21,4,0) +go +INSERT "Order Details" VALUES(10768,31,12.5,50,0) +INSERT "Order Details" VALUES(10768,60,34,15,0) +INSERT "Order Details" VALUES(10768,71,21.5,12,0) +INSERT "Order Details" VALUES(10769,41,9.65,30,0.05) +INSERT "Order Details" VALUES(10769,52,7,15,0.05) +INSERT "Order Details" VALUES(10769,61,28.5,20,0) +INSERT "Order Details" VALUES(10769,62,49.3,15,0) +INSERT "Order Details" VALUES(10770,11,21,15,0.25) +INSERT "Order Details" VALUES(10771,71,21.5,16,0) +INSERT "Order Details" VALUES(10772,29,123.79,18,0) +go +INSERT "Order Details" VALUES(10772,59,55,25,0) +INSERT "Order Details" VALUES(10773,17,39,33,0) +INSERT "Order Details" VALUES(10773,31,12.5,70,0.2) +INSERT "Order Details" VALUES(10773,75,7.75,7,0.2) +INSERT "Order Details" VALUES(10774,31,12.5,2,0.25) +INSERT "Order Details" VALUES(10774,66,17,50,0) +INSERT "Order Details" VALUES(10775,10,31,6,0) +INSERT "Order Details" VALUES(10775,67,14,3,0) +INSERT "Order Details" VALUES(10776,31,12.5,16,0.05) +INSERT "Order Details" VALUES(10776,42,14,12,0.05) +go +INSERT "Order Details" VALUES(10776,45,9.5,27,0.05) +INSERT "Order Details" VALUES(10776,51,53,120,0.05) +INSERT "Order Details" VALUES(10777,42,14,20,0.2) +INSERT "Order Details" VALUES(10778,41,9.65,10,0) +INSERT "Order Details" VALUES(10779,16,17.45,20,0) +INSERT "Order Details" VALUES(10779,62,49.3,20,0) +INSERT "Order Details" VALUES(10780,70,15,35,0) +INSERT "Order Details" VALUES(10780,77,13,15,0) +INSERT "Order Details" VALUES(10781,54,7.45,3,0.2) +INSERT "Order Details" VALUES(10781,56,38,20,0.2) +go +INSERT "Order Details" VALUES(10781,74,10,35,0) +INSERT "Order Details" VALUES(10782,31,12.5,1,0) +INSERT "Order Details" VALUES(10783,31,12.5,10,0) +INSERT "Order Details" VALUES(10783,38,263.5,5,0) +INSERT "Order Details" VALUES(10784,36,19,30,0) +INSERT "Order Details" VALUES(10784,39,18,2,0.15) +INSERT "Order Details" VALUES(10784,72,34.8,30,0.15) +INSERT "Order Details" VALUES(10785,10,31,10,0) +INSERT "Order Details" VALUES(10785,75,7.75,10,0) +INSERT "Order Details" VALUES(10786,8,40,30,0.2) +go +INSERT "Order Details" VALUES(10786,30,25.89,15,0.2) +INSERT "Order Details" VALUES(10786,75,7.75,42,0.2) +INSERT "Order Details" VALUES(10787,2,19,15,0.05) +INSERT "Order Details" VALUES(10787,29,123.79,20,0.05) +INSERT "Order Details" VALUES(10788,19,9.2,50,0.05) +INSERT "Order Details" VALUES(10788,75,7.75,40,0.05) +INSERT "Order Details" VALUES(10789,18,62.5,30,0) +INSERT "Order Details" VALUES(10789,35,18,15,0) +INSERT "Order Details" VALUES(10789,63,43.9,30,0) +INSERT "Order Details" VALUES(10789,68,12.5,18,0) +go +INSERT "Order Details" VALUES(10790,7,30,3,0.15) +INSERT "Order Details" VALUES(10790,56,38,20,0.15) +INSERT "Order Details" VALUES(10791,29,123.79,14,0.05) +INSERT "Order Details" VALUES(10791,41,9.65,20,0.05) +INSERT "Order Details" VALUES(10792,2,19,10,0) +INSERT "Order Details" VALUES(10792,54,7.45,3,0) +INSERT "Order Details" VALUES(10792,68,12.5,15,0) +INSERT "Order Details" VALUES(10793,41,9.65,14,0) +INSERT "Order Details" VALUES(10793,52,7,8,0) +INSERT "Order Details" VALUES(10794,14,23.25,15,0.2) +go +INSERT "Order Details" VALUES(10794,54,7.45,6,0.2) +INSERT "Order Details" VALUES(10795,16,17.45,65,0) +INSERT "Order Details" VALUES(10795,17,39,35,0.25) +INSERT "Order Details" VALUES(10796,26,31.23,21,0.2) +INSERT "Order Details" VALUES(10796,44,19.45,10,0) +INSERT "Order Details" VALUES(10796,64,33.25,35,0.2) +INSERT "Order Details" VALUES(10796,69,36,24,0.2) +INSERT "Order Details" VALUES(10797,11,21,20,0) +INSERT "Order Details" VALUES(10798,62,49.3,2,0) +INSERT "Order Details" VALUES(10798,72,34.8,10,0) +go +INSERT "Order Details" VALUES(10799,13,6,20,0.15) +INSERT "Order Details" VALUES(10799,24,4.5,20,0.15) +INSERT "Order Details" VALUES(10799,59,55,25,0) +INSERT "Order Details" VALUES(10800,11,21,50,0.1) +INSERT "Order Details" VALUES(10800,51,53,10,0.1) +INSERT "Order Details" VALUES(10800,54,7.45,7,0.1) +INSERT "Order Details" VALUES(10801,17,39,40,0.25) +INSERT "Order Details" VALUES(10801,29,123.79,20,0.25) +INSERT "Order Details" VALUES(10802,30,25.89,25,0.25) +INSERT "Order Details" VALUES(10802,51,53,30,0.25) +go +INSERT "Order Details" VALUES(10802,55,24,60,0.25) +INSERT "Order Details" VALUES(10802,62,49.3,5,0.25) +INSERT "Order Details" VALUES(10803,19,9.2,24,0.05) +INSERT "Order Details" VALUES(10803,25,14,15,0.05) +INSERT "Order Details" VALUES(10803,59,55,15,0.05) +INSERT "Order Details" VALUES(10804,10,31,36,0) +INSERT "Order Details" VALUES(10804,28,45.6,24,0) +INSERT "Order Details" VALUES(10804,49,20,4,0.15) +INSERT "Order Details" VALUES(10805,34,14,10,0) +INSERT "Order Details" VALUES(10805,38,263.5,10,0) +go +INSERT "Order Details" VALUES(10806,2,19,20,0.25) +INSERT "Order Details" VALUES(10806,65,21.05,2,0) +INSERT "Order Details" VALUES(10806,74,10,15,0.25) +INSERT "Order Details" VALUES(10807,40,18.4,1,0) +INSERT "Order Details" VALUES(10808,56,38,20,0.15) +INSERT "Order Details" VALUES(10808,76,18,50,0.15) +INSERT "Order Details" VALUES(10809,52,7,20,0) +INSERT "Order Details" VALUES(10810,13,6,7,0) +INSERT "Order Details" VALUES(10810,25,14,5,0) +INSERT "Order Details" VALUES(10810,70,15,5,0) +go +INSERT "Order Details" VALUES(10811,19,9.2,15,0) +INSERT "Order Details" VALUES(10811,23,9,18,0) +INSERT "Order Details" VALUES(10811,40,18.4,30,0) +INSERT "Order Details" VALUES(10812,31,12.5,16,0.1) +INSERT "Order Details" VALUES(10812,72,34.8,40,0.1) +INSERT "Order Details" VALUES(10812,77,13,20,0) +INSERT "Order Details" VALUES(10813,2,19,12,0.2) +INSERT "Order Details" VALUES(10813,46,12,35,0) +INSERT "Order Details" VALUES(10814,41,9.65,20,0) +INSERT "Order Details" VALUES(10814,43,46,20,0.15) +go +INSERT "Order Details" VALUES(10814,48,12.75,8,0.15) +INSERT "Order Details" VALUES(10814,61,28.5,30,0.15) +INSERT "Order Details" VALUES(10815,33,2.5,16,0) +INSERT "Order Details" VALUES(10816,38,263.5,30,0.05) +INSERT "Order Details" VALUES(10816,62,49.3,20,0.05) +INSERT "Order Details" VALUES(10817,26,31.23,40,0.15) +INSERT "Order Details" VALUES(10817,38,263.5,30,0) +INSERT "Order Details" VALUES(10817,40,18.4,60,0.15) +INSERT "Order Details" VALUES(10817,62,49.3,25,0.15) +INSERT "Order Details" VALUES(10818,32,32,20,0) +go +INSERT "Order Details" VALUES(10818,41,9.65,20,0) +INSERT "Order Details" VALUES(10819,43,46,7,0) +INSERT "Order Details" VALUES(10819,75,7.75,20,0) +INSERT "Order Details" VALUES(10820,56,38,30,0) +INSERT "Order Details" VALUES(10821,35,18,20,0) +INSERT "Order Details" VALUES(10821,51,53,6,0) +INSERT "Order Details" VALUES(10822,62,49.3,3,0) +INSERT "Order Details" VALUES(10822,70,15,6,0) +INSERT "Order Details" VALUES(10823,11,21,20,0.1) +INSERT "Order Details" VALUES(10823,57,19.5,15,0) +go +INSERT "Order Details" VALUES(10823,59,55,40,0.1) +INSERT "Order Details" VALUES(10823,77,13,15,0.1) +INSERT "Order Details" VALUES(10824,41,9.65,12,0) +INSERT "Order Details" VALUES(10824,70,15,9,0) +INSERT "Order Details" VALUES(10825,26,31.23,12,0) +INSERT "Order Details" VALUES(10825,53,32.8,20,0) +INSERT "Order Details" VALUES(10826,31,12.5,35,0) +INSERT "Order Details" VALUES(10826,57,19.5,15,0) +INSERT "Order Details" VALUES(10827,10,31,15,0) +INSERT "Order Details" VALUES(10827,39,18,21,0) +go +INSERT "Order Details" VALUES(10828,20,81,5,0) +INSERT "Order Details" VALUES(10828,38,263.5,2,0) +INSERT "Order Details" VALUES(10829,2,19,10,0) +INSERT "Order Details" VALUES(10829,8,40,20,0) +INSERT "Order Details" VALUES(10829,13,6,10,0) +INSERT "Order Details" VALUES(10829,60,34,21,0) +INSERT "Order Details" VALUES(10830,6,25,6,0) +INSERT "Order Details" VALUES(10830,39,18,28,0) +INSERT "Order Details" VALUES(10830,60,34,30,0) +INSERT "Order Details" VALUES(10830,68,12.5,24,0) +go +INSERT "Order Details" VALUES(10831,19,9.2,2,0) +INSERT "Order Details" VALUES(10831,35,18,8,0) +INSERT "Order Details" VALUES(10831,38,263.5,8,0) +INSERT "Order Details" VALUES(10831,43,46,9,0) +INSERT "Order Details" VALUES(10832,13,6,3,0.2) +INSERT "Order Details" VALUES(10832,25,14,10,0.2) +INSERT "Order Details" VALUES(10832,44,19.45,16,0.2) +INSERT "Order Details" VALUES(10832,64,33.25,3,0) +INSERT "Order Details" VALUES(10833,7,30,20,0.1) +INSERT "Order Details" VALUES(10833,31,12.5,9,0.1) +go +INSERT "Order Details" VALUES(10833,53,32.8,9,0.1) +INSERT "Order Details" VALUES(10834,29,123.79,8,0.05) +INSERT "Order Details" VALUES(10834,30,25.89,20,0.05) +INSERT "Order Details" VALUES(10835,59,55,15,0) +INSERT "Order Details" VALUES(10835,77,13,2,0.2) +INSERT "Order Details" VALUES(10836,22,21,52,0) +INSERT "Order Details" VALUES(10836,35,18,6,0) +INSERT "Order Details" VALUES(10836,57,19.5,24,0) +INSERT "Order Details" VALUES(10836,60,34,60,0) +INSERT "Order Details" VALUES(10836,64,33.25,30,0) +go +INSERT "Order Details" VALUES(10837,13,6,6,0) +INSERT "Order Details" VALUES(10837,40,18.4,25,0) +INSERT "Order Details" VALUES(10837,47,9.5,40,0.25) +INSERT "Order Details" VALUES(10837,76,18,21,0.25) +INSERT "Order Details" VALUES(10838,1,18,4,0.25) +INSERT "Order Details" VALUES(10838,18,62.5,25,0.25) +INSERT "Order Details" VALUES(10838,36,19,50,0.25) +INSERT "Order Details" VALUES(10839,58,13.25,30,0.1) +INSERT "Order Details" VALUES(10839,72,34.8,15,0.1) +INSERT "Order Details" VALUES(10840,25,14,6,0.2) +go +INSERT "Order Details" VALUES(10840,39,18,10,0.2) +INSERT "Order Details" VALUES(10841,10,31,16,0) +INSERT "Order Details" VALUES(10841,56,38,30,0) +INSERT "Order Details" VALUES(10841,59,55,50,0) +INSERT "Order Details" VALUES(10841,77,13,15,0) +INSERT "Order Details" VALUES(10842,11,21,15,0) +INSERT "Order Details" VALUES(10842,43,46,5,0) +INSERT "Order Details" VALUES(10842,68,12.5,20,0) +INSERT "Order Details" VALUES(10842,70,15,12,0) +INSERT "Order Details" VALUES(10843,51,53,4,0.25) +go +INSERT "Order Details" VALUES(10844,22,21,35,0) +INSERT "Order Details" VALUES(10845,23,9,70,0.1) +INSERT "Order Details" VALUES(10845,35,18,25,0.1) +INSERT "Order Details" VALUES(10845,42,14,42,0.1) +INSERT "Order Details" VALUES(10845,58,13.25,60,0.1) +INSERT "Order Details" VALUES(10845,64,33.25,48,0) +INSERT "Order Details" VALUES(10846,4,22,21,0) +INSERT "Order Details" VALUES(10846,70,15,30,0) +INSERT "Order Details" VALUES(10846,74,10,20,0) +INSERT "Order Details" VALUES(10847,1,18,80,0.2) +go +INSERT "Order Details" VALUES(10847,19,9.2,12,0.2) +INSERT "Order Details" VALUES(10847,37,26,60,0.2) +INSERT "Order Details" VALUES(10847,45,9.5,36,0.2) +INSERT "Order Details" VALUES(10847,60,34,45,0.2) +INSERT "Order Details" VALUES(10847,71,21.5,55,0.2) +INSERT "Order Details" VALUES(10848,5,21.35,30,0) +INSERT "Order Details" VALUES(10848,9,97,3,0) +INSERT "Order Details" VALUES(10849,3,10,49,0) +INSERT "Order Details" VALUES(10849,26,31.23,18,0.15) +INSERT "Order Details" VALUES(10850,25,14,20,0.15) +go +INSERT "Order Details" VALUES(10850,33,2.5,4,0.15) +INSERT "Order Details" VALUES(10850,70,15,30,0.15) +INSERT "Order Details" VALUES(10851,2,19,5,0.05) +INSERT "Order Details" VALUES(10851,25,14,10,0.05) +INSERT "Order Details" VALUES(10851,57,19.5,10,0.05) +INSERT "Order Details" VALUES(10851,59,55,42,0.05) +INSERT "Order Details" VALUES(10852,2,19,15,0) +INSERT "Order Details" VALUES(10852,17,39,6,0) +INSERT "Order Details" VALUES(10852,62,49.3,50,0) +INSERT "Order Details" VALUES(10853,18,62.5,10,0) +go +INSERT "Order Details" VALUES(10854,10,31,100,0.15) +INSERT "Order Details" VALUES(10854,13,6,65,0.15) +INSERT "Order Details" VALUES(10855,16,17.45,50,0) +INSERT "Order Details" VALUES(10855,31,12.5,14,0) +INSERT "Order Details" VALUES(10855,56,38,24,0) +INSERT "Order Details" VALUES(10855,65,21.05,15,0.15) +INSERT "Order Details" VALUES(10856,2,19,20,0) +INSERT "Order Details" VALUES(10856,42,14,20,0) +INSERT "Order Details" VALUES(10857,3,10,30,0) +INSERT "Order Details" VALUES(10857,26,31.23,35,0.25) +go +INSERT "Order Details" VALUES(10857,29,123.79,10,0.25) +INSERT "Order Details" VALUES(10858,7,30,5,0) +INSERT "Order Details" VALUES(10858,27,43.9,10,0) +INSERT "Order Details" VALUES(10858,70,15,4,0) +INSERT "Order Details" VALUES(10859,24,4.5,40,0.25) +INSERT "Order Details" VALUES(10859,54,7.45,35,0.25) +INSERT "Order Details" VALUES(10859,64,33.25,30,0.25) +INSERT "Order Details" VALUES(10860,51,53,3,0) +INSERT "Order Details" VALUES(10860,76,18,20,0) +INSERT "Order Details" VALUES(10861,17,39,42,0) +go +INSERT "Order Details" VALUES(10861,18,62.5,20,0) +INSERT "Order Details" VALUES(10861,21,10,40,0) +INSERT "Order Details" VALUES(10861,33,2.5,35,0) +INSERT "Order Details" VALUES(10861,62,49.3,3,0) +INSERT "Order Details" VALUES(10862,11,21,25,0) +INSERT "Order Details" VALUES(10862,52,7,8,0) +INSERT "Order Details" VALUES(10863,1,18,20,0.15) +INSERT "Order Details" VALUES(10863,58,13.25,12,0.15) +INSERT "Order Details" VALUES(10864,35,18,4,0) +INSERT "Order Details" VALUES(10864,67,14,15,0) +go +INSERT "Order Details" VALUES(10865,38,263.5,60,0.05) +INSERT "Order Details" VALUES(10865,39,18,80,0.05) +INSERT "Order Details" VALUES(10866,2,19,21,0.25) +INSERT "Order Details" VALUES(10866,24,4.5,6,0.25) +INSERT "Order Details" VALUES(10866,30,25.89,40,0.25) +INSERT "Order Details" VALUES(10867,53,32.8,3,0) +INSERT "Order Details" VALUES(10868,26,31.23,20,0) +INSERT "Order Details" VALUES(10868,35,18,30,0) +INSERT "Order Details" VALUES(10868,49,20,42,0.1) +INSERT "Order Details" VALUES(10869,1,18,40,0) +go +INSERT "Order Details" VALUES(10869,11,21,10,0) +INSERT "Order Details" VALUES(10869,23,9,50,0) +INSERT "Order Details" VALUES(10869,68,12.5,20,0) +INSERT "Order Details" VALUES(10870,35,18,3,0) +INSERT "Order Details" VALUES(10870,51,53,2,0) +INSERT "Order Details" VALUES(10871,6,25,50,0.05) +INSERT "Order Details" VALUES(10871,16,17.45,12,0.05) +INSERT "Order Details" VALUES(10871,17,39,16,0.05) +INSERT "Order Details" VALUES(10872,55,24,10,0.05) +INSERT "Order Details" VALUES(10872,62,49.3,20,0.05) +go +INSERT "Order Details" VALUES(10872,64,33.25,15,0.05) +INSERT "Order Details" VALUES(10872,65,21.05,21,0.05) +INSERT "Order Details" VALUES(10873,21,10,20,0) +INSERT "Order Details" VALUES(10873,28,45.6,3,0) +INSERT "Order Details" VALUES(10874,10,31,10,0) +INSERT "Order Details" VALUES(10875,19,9.2,25,0) +INSERT "Order Details" VALUES(10875,47,9.5,21,0.1) +INSERT "Order Details" VALUES(10875,49,20,15,0) +INSERT "Order Details" VALUES(10876,46,12,21,0) +INSERT "Order Details" VALUES(10876,64,33.25,20,0) +go +INSERT "Order Details" VALUES(10877,16,17.45,30,0.25) +INSERT "Order Details" VALUES(10877,18,62.5,25,0) +INSERT "Order Details" VALUES(10878,20,81,20,0.05) +INSERT "Order Details" VALUES(10879,40,18.4,12,0) +INSERT "Order Details" VALUES(10879,65,21.05,10,0) +INSERT "Order Details" VALUES(10879,76,18,10,0) +INSERT "Order Details" VALUES(10880,23,9,30,0.2) +INSERT "Order Details" VALUES(10880,61,28.5,30,0.2) +INSERT "Order Details" VALUES(10880,70,15,50,0.2) +INSERT "Order Details" VALUES(10881,73,15,10,0) +go +INSERT "Order Details" VALUES(10882,42,14,25,0) +INSERT "Order Details" VALUES(10882,49,20,20,0.15) +INSERT "Order Details" VALUES(10882,54,7.45,32,0.15) +INSERT "Order Details" VALUES(10883,24,4.5,8,0) +INSERT "Order Details" VALUES(10884,21,10,40,0.05) +INSERT "Order Details" VALUES(10884,56,38,21,0.05) +INSERT "Order Details" VALUES(10884,65,21.05,12,0.05) +INSERT "Order Details" VALUES(10885,2,19,20,0) +INSERT "Order Details" VALUES(10885,24,4.5,12,0) +INSERT "Order Details" VALUES(10885,70,15,30,0) +go +INSERT "Order Details" VALUES(10885,77,13,25,0) +INSERT "Order Details" VALUES(10886,10,31,70,0) +INSERT "Order Details" VALUES(10886,31,12.5,35,0) +INSERT "Order Details" VALUES(10886,77,13,40,0) +INSERT "Order Details" VALUES(10887,25,14,5,0) +INSERT "Order Details" VALUES(10888,2,19,20,0) +INSERT "Order Details" VALUES(10888,68,12.5,18,0) +INSERT "Order Details" VALUES(10889,11,21,40,0) +INSERT "Order Details" VALUES(10889,38,263.5,40,0) +INSERT "Order Details" VALUES(10890,17,39,15,0) +go +INSERT "Order Details" VALUES(10890,34,14,10,0) +INSERT "Order Details" VALUES(10890,41,9.65,14,0) +INSERT "Order Details" VALUES(10891,30,25.89,15,0.05) +INSERT "Order Details" VALUES(10892,59,55,40,0.05) +INSERT "Order Details" VALUES(10893,8,40,30,0) +INSERT "Order Details" VALUES(10893,24,4.5,10,0) +INSERT "Order Details" VALUES(10893,29,123.79,24,0) +INSERT "Order Details" VALUES(10893,30,25.89,35,0) +INSERT "Order Details" VALUES(10893,36,19,20,0) +INSERT "Order Details" VALUES(10894,13,6,28,0.05) +go +INSERT "Order Details" VALUES(10894,69,36,50,0.05) +INSERT "Order Details" VALUES(10894,75,7.75,120,0.05) +INSERT "Order Details" VALUES(10895,24,4.5,110,0) +INSERT "Order Details" VALUES(10895,39,18,45,0) +INSERT "Order Details" VALUES(10895,40,18.4,91,0) +INSERT "Order Details" VALUES(10895,60,34,100,0) +INSERT "Order Details" VALUES(10896,45,9.5,15,0) +INSERT "Order Details" VALUES(10896,56,38,16,0) +INSERT "Order Details" VALUES(10897,29,123.79,80,0) +INSERT "Order Details" VALUES(10897,30,25.89,36,0) +go +INSERT "Order Details" VALUES(10898,13,6,5,0) +INSERT "Order Details" VALUES(10899,39,18,8,0.15) +INSERT "Order Details" VALUES(10900,70,15,3,0.25) +INSERT "Order Details" VALUES(10901,41,9.65,30,0) +INSERT "Order Details" VALUES(10901,71,21.5,30,0) +INSERT "Order Details" VALUES(10902,55,24,30,0.15) +INSERT "Order Details" VALUES(10902,62,49.3,6,0.15) +INSERT "Order Details" VALUES(10903,13,6,40,0) +INSERT "Order Details" VALUES(10903,65,21.05,21,0) +INSERT "Order Details" VALUES(10903,68,12.5,20,0) +go +INSERT "Order Details" VALUES(10904,58,13.25,15,0) +INSERT "Order Details" VALUES(10904,62,49.3,35,0) +INSERT "Order Details" VALUES(10905,1,18,20,0.05) +INSERT "Order Details" VALUES(10906,61,28.5,15,0) +INSERT "Order Details" VALUES(10907,75,7.75,14,0) +INSERT "Order Details" VALUES(10908,7,30,20,0.05) +INSERT "Order Details" VALUES(10908,52,7,14,0.05) +INSERT "Order Details" VALUES(10909,7,30,12,0) +INSERT "Order Details" VALUES(10909,16,17.45,15,0) +INSERT "Order Details" VALUES(10909,41,9.65,5,0) +go +INSERT "Order Details" VALUES(10910,19,9.2,12,0) +INSERT "Order Details" VALUES(10910,49,20,10,0) +INSERT "Order Details" VALUES(10910,61,28.5,5,0) +INSERT "Order Details" VALUES(10911,1,18,10,0) +INSERT "Order Details" VALUES(10911,17,39,12,0) +INSERT "Order Details" VALUES(10911,67,14,15,0) +INSERT "Order Details" VALUES(10912,11,21,40,0.25) +INSERT "Order Details" VALUES(10912,29,123.79,60,0.25) +INSERT "Order Details" VALUES(10913,4,22,30,0.25) +INSERT "Order Details" VALUES(10913,33,2.5,40,0.25) +go +INSERT "Order Details" VALUES(10913,58,13.25,15,0) +INSERT "Order Details" VALUES(10914,71,21.5,25,0) +INSERT "Order Details" VALUES(10915,17,39,10,0) +INSERT "Order Details" VALUES(10915,33,2.5,30,0) +INSERT "Order Details" VALUES(10915,54,7.45,10,0) +INSERT "Order Details" VALUES(10916,16,17.45,6,0) +INSERT "Order Details" VALUES(10916,32,32,6,0) +INSERT "Order Details" VALUES(10916,57,19.5,20,0) +INSERT "Order Details" VALUES(10917,30,25.89,1,0) +INSERT "Order Details" VALUES(10917,60,34,10,0) +go +INSERT "Order Details" VALUES(10918,1,18,60,0.25) +INSERT "Order Details" VALUES(10918,60,34,25,0.25) +INSERT "Order Details" VALUES(10919,16,17.45,24,0) +INSERT "Order Details" VALUES(10919,25,14,24,0) +INSERT "Order Details" VALUES(10919,40,18.4,20,0) +INSERT "Order Details" VALUES(10920,50,16.25,24,0) +INSERT "Order Details" VALUES(10921,35,18,10,0) +INSERT "Order Details" VALUES(10921,63,43.9,40,0) +INSERT "Order Details" VALUES(10922,17,39,15,0) +INSERT "Order Details" VALUES(10922,24,4.5,35,0) +go +INSERT "Order Details" VALUES(10923,42,14,10,0.2) +INSERT "Order Details" VALUES(10923,43,46,10,0.2) +INSERT "Order Details" VALUES(10923,67,14,24,0.2) +INSERT "Order Details" VALUES(10924,10,31,20,0.1) +INSERT "Order Details" VALUES(10924,28,45.6,30,0.1) +INSERT "Order Details" VALUES(10924,75,7.75,6,0) +INSERT "Order Details" VALUES(10925,36,19,25,0.15) +INSERT "Order Details" VALUES(10925,52,7,12,0.15) +INSERT "Order Details" VALUES(10926,11,21,2,0) +INSERT "Order Details" VALUES(10926,13,6,10,0) +go +INSERT "Order Details" VALUES(10926,19,9.2,7,0) +INSERT "Order Details" VALUES(10926,72,34.8,10,0) +INSERT "Order Details" VALUES(10927,20,81,5,0) +INSERT "Order Details" VALUES(10927,52,7,5,0) +INSERT "Order Details" VALUES(10927,76,18,20,0) +INSERT "Order Details" VALUES(10928,47,9.5,5,0) +INSERT "Order Details" VALUES(10928,76,18,5,0) +INSERT "Order Details" VALUES(10929,21,10,60,0) +INSERT "Order Details" VALUES(10929,75,7.75,49,0) +INSERT "Order Details" VALUES(10929,77,13,15,0) +go +INSERT "Order Details" VALUES(10930,21,10,36,0) +INSERT "Order Details" VALUES(10930,27,43.9,25,0) +INSERT "Order Details" VALUES(10930,55,24,25,0.2) +INSERT "Order Details" VALUES(10930,58,13.25,30,0.2) +INSERT "Order Details" VALUES(10931,13,6,42,0.15) +INSERT "Order Details" VALUES(10931,57,19.5,30,0) +INSERT "Order Details" VALUES(10932,16,17.45,30,0.1) +INSERT "Order Details" VALUES(10932,62,49.3,14,0.1) +INSERT "Order Details" VALUES(10932,72,34.8,16,0) +INSERT "Order Details" VALUES(10932,75,7.75,20,0.1) +go +INSERT "Order Details" VALUES(10933,53,32.8,2,0) +INSERT "Order Details" VALUES(10933,61,28.5,30,0) +INSERT "Order Details" VALUES(10934,6,25,20,0) +INSERT "Order Details" VALUES(10935,1,18,21,0) +INSERT "Order Details" VALUES(10935,18,62.5,4,0.25) +INSERT "Order Details" VALUES(10935,23,9,8,0.25) +INSERT "Order Details" VALUES(10936,36,19,30,0.2) +INSERT "Order Details" VALUES(10937,28,45.6,8,0) +INSERT "Order Details" VALUES(10937,34,14,20,0) +INSERT "Order Details" VALUES(10938,13,6,20,0.25) +go +INSERT "Order Details" VALUES(10938,43,46,24,0.25) +INSERT "Order Details" VALUES(10938,60,34,49,0.25) +INSERT "Order Details" VALUES(10938,71,21.5,35,0.25) +INSERT "Order Details" VALUES(10939,2,19,10,0.15) +INSERT "Order Details" VALUES(10939,67,14,40,0.15) +INSERT "Order Details" VALUES(10940,7,30,8,0) +INSERT "Order Details" VALUES(10940,13,6,20,0) +INSERT "Order Details" VALUES(10941,31,12.5,44,0.25) +INSERT "Order Details" VALUES(10941,62,49.3,30,0.25) +INSERT "Order Details" VALUES(10941,68,12.5,80,0.25) +go +INSERT "Order Details" VALUES(10941,72,34.8,50,0) +INSERT "Order Details" VALUES(10942,49,20,28,0) +INSERT "Order Details" VALUES(10943,13,6,15,0) +INSERT "Order Details" VALUES(10943,22,21,21,0) +INSERT "Order Details" VALUES(10943,46,12,15,0) +INSERT "Order Details" VALUES(10944,11,21,5,0.25) +INSERT "Order Details" VALUES(10944,44,19.45,18,0.25) +INSERT "Order Details" VALUES(10944,56,38,18,0) +INSERT "Order Details" VALUES(10945,13,6,20,0) +INSERT "Order Details" VALUES(10945,31,12.5,10,0) +go +INSERT "Order Details" VALUES(10946,10,31,25,0) +INSERT "Order Details" VALUES(10946,24,4.5,25,0) +INSERT "Order Details" VALUES(10946,77,13,40,0) +INSERT "Order Details" VALUES(10947,59,55,4,0) +INSERT "Order Details" VALUES(10948,50,16.25,9,0) +INSERT "Order Details" VALUES(10948,51,53,40,0) +INSERT "Order Details" VALUES(10948,55,24,4,0) +INSERT "Order Details" VALUES(10949,6,25,12,0) +INSERT "Order Details" VALUES(10949,10,31,30,0) +INSERT "Order Details" VALUES(10949,17,39,6,0) +go +INSERT "Order Details" VALUES(10949,62,49.3,60,0) +INSERT "Order Details" VALUES(10950,4,22,5,0) +INSERT "Order Details" VALUES(10951,33,2.5,15,0.05) +INSERT "Order Details" VALUES(10951,41,9.65,6,0.05) +INSERT "Order Details" VALUES(10951,75,7.75,50,0.05) +INSERT "Order Details" VALUES(10952,6,25,16,0.05) +INSERT "Order Details" VALUES(10952,28,45.6,2,0) +INSERT "Order Details" VALUES(10953,20,81,50,0.05) +INSERT "Order Details" VALUES(10953,31,12.5,50,0.05) +INSERT "Order Details" VALUES(10954,16,17.45,28,0.15) +go +INSERT "Order Details" VALUES(10954,31,12.5,25,0.15) +INSERT "Order Details" VALUES(10954,45,9.5,30,0) +INSERT "Order Details" VALUES(10954,60,34,24,0.15) +INSERT "Order Details" VALUES(10955,75,7.75,12,0.2) +INSERT "Order Details" VALUES(10956,21,10,12,0) +INSERT "Order Details" VALUES(10956,47,9.5,14,0) +INSERT "Order Details" VALUES(10956,51,53,8,0) +INSERT "Order Details" VALUES(10957,30,25.89,30,0) +INSERT "Order Details" VALUES(10957,35,18,40,0) +INSERT "Order Details" VALUES(10957,64,33.25,8,0) +go +INSERT "Order Details" VALUES(10958,5,21.35,20,0) +INSERT "Order Details" VALUES(10958,7,30,6,0) +INSERT "Order Details" VALUES(10958,72,34.8,5,0) +INSERT "Order Details" VALUES(10959,75,7.75,20,0.15) +INSERT "Order Details" VALUES(10960,24,4.5,10,0.25) +INSERT "Order Details" VALUES(10960,41,9.65,24,0) +INSERT "Order Details" VALUES(10961,52,7,6,0.05) +INSERT "Order Details" VALUES(10961,76,18,60,0) +INSERT "Order Details" VALUES(10962,7,30,45,0) +INSERT "Order Details" VALUES(10962,13,6,77,0) +go +INSERT "Order Details" VALUES(10962,53,32.8,20,0) +INSERT "Order Details" VALUES(10962,69,36,9,0) +INSERT "Order Details" VALUES(10962,76,18,44,0) +INSERT "Order Details" VALUES(10963,60,34,2,0.15) +INSERT "Order Details" VALUES(10964,18,62.5,6,0) +INSERT "Order Details" VALUES(10964,38,263.5,5,0) +INSERT "Order Details" VALUES(10964,69,36,10,0) +INSERT "Order Details" VALUES(10965,51,53,16,0) +INSERT "Order Details" VALUES(10966,37,26,8,0) +INSERT "Order Details" VALUES(10966,56,38,12,0.15) +go +INSERT "Order Details" VALUES(10966,62,49.3,12,0.15) +INSERT "Order Details" VALUES(10967,19,9.2,12,0) +INSERT "Order Details" VALUES(10967,49,20,40,0) +INSERT "Order Details" VALUES(10968,12,38,30,0) +INSERT "Order Details" VALUES(10968,24,4.5,30,0) +INSERT "Order Details" VALUES(10968,64,33.25,4,0) +INSERT "Order Details" VALUES(10969,46,12,9,0) +INSERT "Order Details" VALUES(10970,52,7,40,0.2) +INSERT "Order Details" VALUES(10971,29,123.79,14,0) +INSERT "Order Details" VALUES(10972,17,39,6,0) +go +INSERT "Order Details" VALUES(10972,33,2.5,7,0) +INSERT "Order Details" VALUES(10973,26,31.23,5,0) +INSERT "Order Details" VALUES(10973,41,9.65,6,0) +INSERT "Order Details" VALUES(10973,75,7.75,10,0) +INSERT "Order Details" VALUES(10974,63,43.9,10,0) +INSERT "Order Details" VALUES(10975,8,40,16,0) +INSERT "Order Details" VALUES(10975,75,7.75,10,0) +INSERT "Order Details" VALUES(10976,28,45.6,20,0) +INSERT "Order Details" VALUES(10977,39,18,30,0) +INSERT "Order Details" VALUES(10977,47,9.5,30,0) +go +INSERT "Order Details" VALUES(10977,51,53,10,0) +INSERT "Order Details" VALUES(10977,63,43.9,20,0) +INSERT "Order Details" VALUES(10978,8,40,20,0.15) +INSERT "Order Details" VALUES(10978,21,10,40,0.15) +INSERT "Order Details" VALUES(10978,40,18.4,10,0) +INSERT "Order Details" VALUES(10978,44,19.45,6,0.15) +INSERT "Order Details" VALUES(10979,7,30,18,0) +INSERT "Order Details" VALUES(10979,12,38,20,0) +INSERT "Order Details" VALUES(10979,24,4.5,80,0) +INSERT "Order Details" VALUES(10979,27,43.9,30,0) +go +INSERT "Order Details" VALUES(10979,31,12.5,24,0) +INSERT "Order Details" VALUES(10979,63,43.9,35,0) +INSERT "Order Details" VALUES(10980,75,7.75,40,0.2) +INSERT "Order Details" VALUES(10981,38,263.5,60,0) +INSERT "Order Details" VALUES(10982,7,30,20,0) +INSERT "Order Details" VALUES(10982,43,46,9,0) +INSERT "Order Details" VALUES(10983,13,6,84,0.15) +INSERT "Order Details" VALUES(10983,57,19.5,15,0) +INSERT "Order Details" VALUES(10984,16,17.45,55,0) +INSERT "Order Details" VALUES(10984,24,4.5,20,0) +go +INSERT "Order Details" VALUES(10984,36,19,40,0) +INSERT "Order Details" VALUES(10985,16,17.45,36,0.1) +INSERT "Order Details" VALUES(10985,18,62.5,8,0.1) +INSERT "Order Details" VALUES(10985,32,32,35,0.1) +INSERT "Order Details" VALUES(10986,11,21,30,0) +INSERT "Order Details" VALUES(10986,20,81,15,0) +INSERT "Order Details" VALUES(10986,76,18,10,0) +INSERT "Order Details" VALUES(10986,77,13,15,0) +INSERT "Order Details" VALUES(10987,7,30,60,0) +INSERT "Order Details" VALUES(10987,43,46,6,0) +go +INSERT "Order Details" VALUES(10987,72,34.8,20,0) +INSERT "Order Details" VALUES(10988,7,30,60,0) +INSERT "Order Details" VALUES(10988,62,49.3,40,0.1) +INSERT "Order Details" VALUES(10989,6,25,40,0) +INSERT "Order Details" VALUES(10989,11,21,15,0) +INSERT "Order Details" VALUES(10989,41,9.65,4,0) +INSERT "Order Details" VALUES(10990,21,10,65,0) +INSERT "Order Details" VALUES(10990,34,14,60,0.15) +INSERT "Order Details" VALUES(10990,55,24,65,0.15) +INSERT "Order Details" VALUES(10990,61,28.5,66,0.15) +go +INSERT "Order Details" VALUES(10991,2,19,50,0.2) +INSERT "Order Details" VALUES(10991,70,15,20,0.2) +INSERT "Order Details" VALUES(10991,76,18,90,0.2) +INSERT "Order Details" VALUES(10992,72,34.8,2,0) +INSERT "Order Details" VALUES(10993,29,123.79,50,0.25) +INSERT "Order Details" VALUES(10993,41,9.65,35,0.25) +INSERT "Order Details" VALUES(10994,59,55,18,0.05) +INSERT "Order Details" VALUES(10995,51,53,20,0) +INSERT "Order Details" VALUES(10995,60,34,4,0) +INSERT "Order Details" VALUES(10996,42,14,40,0) +go +INSERT "Order Details" VALUES(10997,32,32,50,0) +INSERT "Order Details" VALUES(10997,46,12,20,0.25) +INSERT "Order Details" VALUES(10997,52,7,20,0.25) +INSERT "Order Details" VALUES(10998,24,4.5,12,0) +INSERT "Order Details" VALUES(10998,61,28.5,7,0) +INSERT "Order Details" VALUES(10998,74,10,20,0) +INSERT "Order Details" VALUES(10998,75,7.75,30,0) +INSERT "Order Details" VALUES(10999,41,9.65,20,0.05) +INSERT "Order Details" VALUES(10999,51,53,15,0.05) +INSERT "Order Details" VALUES(10999,77,13,21,0.05) +go +INSERT "Order Details" VALUES(11000,4,22,25,0.25) +INSERT "Order Details" VALUES(11000,24,4.5,30,0.25) +INSERT "Order Details" VALUES(11000,77,13,30,0) +INSERT "Order Details" VALUES(11001,7,30,60,0) +INSERT "Order Details" VALUES(11001,22,21,25,0) +INSERT "Order Details" VALUES(11001,46,12,25,0) +INSERT "Order Details" VALUES(11001,55,24,6,0) +INSERT "Order Details" VALUES(11002,13,6,56,0) +INSERT "Order Details" VALUES(11002,35,18,15,0.15) +INSERT "Order Details" VALUES(11002,42,14,24,0.15) +go +INSERT "Order Details" VALUES(11002,55,24,40,0) +INSERT "Order Details" VALUES(11003,1,18,4,0) +INSERT "Order Details" VALUES(11003,40,18.4,10,0) +INSERT "Order Details" VALUES(11003,52,7,10,0) +INSERT "Order Details" VALUES(11004,26,31.23,6,0) +INSERT "Order Details" VALUES(11004,76,18,6,0) +INSERT "Order Details" VALUES(11005,1,18,2,0) +INSERT "Order Details" VALUES(11005,59,55,10,0) +INSERT "Order Details" VALUES(11006,1,18,8,0) +INSERT "Order Details" VALUES(11006,29,123.79,2,0.25) +go +INSERT "Order Details" VALUES(11007,8,40,30,0) +INSERT "Order Details" VALUES(11007,29,123.79,10,0) +INSERT "Order Details" VALUES(11007,42,14,14,0) +INSERT "Order Details" VALUES(11008,28,45.6,70,0.05) +INSERT "Order Details" VALUES(11008,34,14,90,0.05) +INSERT "Order Details" VALUES(11008,71,21.5,21,0) +INSERT "Order Details" VALUES(11009,24,4.5,12,0) +INSERT "Order Details" VALUES(11009,36,19,18,0.25) +INSERT "Order Details" VALUES(11009,60,34,9,0) +INSERT "Order Details" VALUES(11010,7,30,20,0) +go +INSERT "Order Details" VALUES(11010,24,4.5,10,0) +INSERT "Order Details" VALUES(11011,58,13.25,40,0.05) +INSERT "Order Details" VALUES(11011,71,21.5,20,0) +INSERT "Order Details" VALUES(11012,19,9.2,50,0.05) +INSERT "Order Details" VALUES(11012,60,34,36,0.05) +INSERT "Order Details" VALUES(11012,71,21.5,60,0.05) +INSERT "Order Details" VALUES(11013,23,9,10,0) +INSERT "Order Details" VALUES(11013,42,14,4,0) +INSERT "Order Details" VALUES(11013,45,9.5,20,0) +INSERT "Order Details" VALUES(11013,68,12.5,2,0) +go +INSERT "Order Details" VALUES(11014,41,9.65,28,0.1) +INSERT "Order Details" VALUES(11015,30,25.89,15,0) +INSERT "Order Details" VALUES(11015,77,13,18,0) +INSERT "Order Details" VALUES(11016,31,12.5,15,0) +INSERT "Order Details" VALUES(11016,36,19,16,0) +INSERT "Order Details" VALUES(11017,3,10,25,0) +INSERT "Order Details" VALUES(11017,59,55,110,0) +INSERT "Order Details" VALUES(11017,70,15,30,0) +INSERT "Order Details" VALUES(11018,12,38,20,0) +INSERT "Order Details" VALUES(11018,18,62.5,10,0) +go +INSERT "Order Details" VALUES(11018,56,38,5,0) +INSERT "Order Details" VALUES(11019,46,12,3,0) +INSERT "Order Details" VALUES(11019,49,20,2,0) +INSERT "Order Details" VALUES(11020,10,31,24,0.15) +INSERT "Order Details" VALUES(11021,2,19,11,0.25) +INSERT "Order Details" VALUES(11021,20,81,15,0) +INSERT "Order Details" VALUES(11021,26,31.23,63,0) +INSERT "Order Details" VALUES(11021,51,53,44,0.25) +INSERT "Order Details" VALUES(11021,72,34.8,35,0) +INSERT "Order Details" VALUES(11022,19,9.2,35,0) +go +INSERT "Order Details" VALUES(11022,69,36,30,0) +INSERT "Order Details" VALUES(11023,7,30,4,0) +INSERT "Order Details" VALUES(11023,43,46,30,0) +INSERT "Order Details" VALUES(11024,26,31.23,12,0) +INSERT "Order Details" VALUES(11024,33,2.5,30,0) +INSERT "Order Details" VALUES(11024,65,21.05,21,0) +INSERT "Order Details" VALUES(11024,71,21.5,50,0) +INSERT "Order Details" VALUES(11025,1,18,10,0.1) +INSERT "Order Details" VALUES(11025,13,6,20,0.1) +INSERT "Order Details" VALUES(11026,18,62.5,8,0) +go +INSERT "Order Details" VALUES(11026,51,53,10,0) +INSERT "Order Details" VALUES(11027,24,4.5,30,0.25) +INSERT "Order Details" VALUES(11027,62,49.3,21,0.25) +INSERT "Order Details" VALUES(11028,55,24,35,0) +INSERT "Order Details" VALUES(11028,59,55,24,0) +INSERT "Order Details" VALUES(11029,56,38,20,0) +INSERT "Order Details" VALUES(11029,63,43.9,12,0) +INSERT "Order Details" VALUES(11030,2,19,100,0.25) +INSERT "Order Details" VALUES(11030,5,21.35,70,0) +INSERT "Order Details" VALUES(11030,29,123.79,60,0.25) +go +INSERT "Order Details" VALUES(11030,59,55,100,0.25) +INSERT "Order Details" VALUES(11031,1,18,45,0) +INSERT "Order Details" VALUES(11031,13,6,80,0) +INSERT "Order Details" VALUES(11031,24,4.5,21,0) +INSERT "Order Details" VALUES(11031,64,33.25,20,0) +INSERT "Order Details" VALUES(11031,71,21.5,16,0) +INSERT "Order Details" VALUES(11032,36,19,35,0) +INSERT "Order Details" VALUES(11032,38,263.5,25,0) +INSERT "Order Details" VALUES(11032,59,55,30,0) +INSERT "Order Details" VALUES(11033,53,32.8,70,0.1) +go +INSERT "Order Details" VALUES(11033,69,36,36,0.1) +INSERT "Order Details" VALUES(11034,21,10,15,0.1) +INSERT "Order Details" VALUES(11034,44,19.45,12,0) +INSERT "Order Details" VALUES(11034,61,28.5,6,0) +INSERT "Order Details" VALUES(11035,1,18,10,0) +INSERT "Order Details" VALUES(11035,35,18,60,0) +INSERT "Order Details" VALUES(11035,42,14,30,0) +INSERT "Order Details" VALUES(11035,54,7.45,10,0) +INSERT "Order Details" VALUES(11036,13,6,7,0) +INSERT "Order Details" VALUES(11036,59,55,30,0) +go +INSERT "Order Details" VALUES(11037,70,15,4,0) +INSERT "Order Details" VALUES(11038,40,18.4,5,0.2) +INSERT "Order Details" VALUES(11038,52,7,2,0) +INSERT "Order Details" VALUES(11038,71,21.5,30,0) +INSERT "Order Details" VALUES(11039,28,45.6,20,0) +INSERT "Order Details" VALUES(11039,35,18,24,0) +INSERT "Order Details" VALUES(11039,49,20,60,0) +INSERT "Order Details" VALUES(11039,57,19.5,28,0) +INSERT "Order Details" VALUES(11040,21,10,20,0) +INSERT "Order Details" VALUES(11041,2,19,30,0.2) +go +INSERT "Order Details" VALUES(11041,63,43.9,30,0) +INSERT "Order Details" VALUES(11042,44,19.45,15,0) +INSERT "Order Details" VALUES(11042,61,28.5,4,0) +INSERT "Order Details" VALUES(11043,11,21,10,0) +INSERT "Order Details" VALUES(11044,62,49.3,12,0) +INSERT "Order Details" VALUES(11045,33,2.5,15,0) +INSERT "Order Details" VALUES(11045,51,53,24,0) +INSERT "Order Details" VALUES(11046,12,38,20,0.05) +INSERT "Order Details" VALUES(11046,32,32,15,0.05) +INSERT "Order Details" VALUES(11046,35,18,18,0.05) +go +INSERT "Order Details" VALUES(11047,1,18,25,0.25) +INSERT "Order Details" VALUES(11047,5,21.35,30,0.25) +INSERT "Order Details" VALUES(11048,68,12.5,42,0) +INSERT "Order Details" VALUES(11049,2,19,10,0.2) +INSERT "Order Details" VALUES(11049,12,38,4,0.2) +INSERT "Order Details" VALUES(11050,76,18,50,0.1) +INSERT "Order Details" VALUES(11051,24,4.5,10,0.2) +INSERT "Order Details" VALUES(11052,43,46,30,0.2) +INSERT "Order Details" VALUES(11052,61,28.5,10,0.2) +INSERT "Order Details" VALUES(11053,18,62.5,35,0.2) +go +INSERT "Order Details" VALUES(11053,32,32,20,0) +INSERT "Order Details" VALUES(11053,64,33.25,25,0.2) +INSERT "Order Details" VALUES(11054,33,2.5,10,0) +INSERT "Order Details" VALUES(11054,67,14,20,0) +INSERT "Order Details" VALUES(11055,24,4.5,15,0) +INSERT "Order Details" VALUES(11055,25,14,15,0) +INSERT "Order Details" VALUES(11055,51,53,20,0) +INSERT "Order Details" VALUES(11055,57,19.5,20,0) +INSERT "Order Details" VALUES(11056,7,30,40,0) +INSERT "Order Details" VALUES(11056,55,24,35,0) +go +INSERT "Order Details" VALUES(11056,60,34,50,0) +INSERT "Order Details" VALUES(11057,70,15,3,0) +INSERT "Order Details" VALUES(11058,21,10,3,0) +INSERT "Order Details" VALUES(11058,60,34,21,0) +INSERT "Order Details" VALUES(11058,61,28.5,4,0) +INSERT "Order Details" VALUES(11059,13,6,30,0) +INSERT "Order Details" VALUES(11059,17,39,12,0) +INSERT "Order Details" VALUES(11059,60,34,35,0) +INSERT "Order Details" VALUES(11060,60,34,4,0) +INSERT "Order Details" VALUES(11060,77,13,10,0) +go +INSERT "Order Details" VALUES(11061,60,34,15,0) +INSERT "Order Details" VALUES(11062,53,32.8,10,0.2) +INSERT "Order Details" VALUES(11062,70,15,12,0.2) +INSERT "Order Details" VALUES(11063,34,14,30,0) +INSERT "Order Details" VALUES(11063,40,18.4,40,0.1) +INSERT "Order Details" VALUES(11063,41,9.65,30,0.1) +INSERT "Order Details" VALUES(11064,17,39,77,0.1) +INSERT "Order Details" VALUES(11064,41,9.65,12,0) +INSERT "Order Details" VALUES(11064,53,32.8,25,0.1) +INSERT "Order Details" VALUES(11064,55,24,4,0.1) +go +INSERT "Order Details" VALUES(11064,68,12.5,55,0) +INSERT "Order Details" VALUES(11065,30,25.89,4,0.25) +INSERT "Order Details" VALUES(11065,54,7.45,20,0.25) +INSERT "Order Details" VALUES(11066,16,17.45,3,0) +INSERT "Order Details" VALUES(11066,19,9.2,42,0) +INSERT "Order Details" VALUES(11066,34,14,35,0) +INSERT "Order Details" VALUES(11067,41,9.65,9,0) +INSERT "Order Details" VALUES(11068,28,45.6,8,0.15) +INSERT "Order Details" VALUES(11068,43,46,36,0.15) +INSERT "Order Details" VALUES(11068,77,13,28,0.15) +go +INSERT "Order Details" VALUES(11069,39,18,20,0) +INSERT "Order Details" VALUES(11070,1,18,40,0.15) +INSERT "Order Details" VALUES(11070,2,19,20,0.15) +INSERT "Order Details" VALUES(11070,16,17.45,30,0.15) +INSERT "Order Details" VALUES(11070,31,12.5,20,0) +INSERT "Order Details" VALUES(11071,7,30,15,0.05) +INSERT "Order Details" VALUES(11071,13,6,10,0.05) +INSERT "Order Details" VALUES(11072,2,19,8,0) +INSERT "Order Details" VALUES(11072,41,9.65,40,0) +INSERT "Order Details" VALUES(11072,50,16.25,22,0) +go +INSERT "Order Details" VALUES(11072,64,33.25,130,0) +INSERT "Order Details" VALUES(11073,11,21,10,0) +INSERT "Order Details" VALUES(11073,24,4.5,20,0) +INSERT "Order Details" VALUES(11074,16,17.45,14,0.05) +INSERT "Order Details" VALUES(11075,2,19,10,0.15) +INSERT "Order Details" VALUES(11075,46,12,30,0.15) +INSERT "Order Details" VALUES(11075,76,18,2,0.15) +INSERT "Order Details" VALUES(11076,6,25,20,0.25) +INSERT "Order Details" VALUES(11076,14,23.25,20,0.25) +INSERT "Order Details" VALUES(11076,19,9.2,10,0.25) +go +INSERT "Order Details" VALUES(11077,2,19,24,0.2) +INSERT "Order Details" VALUES(11077,3,10,4,0) +INSERT "Order Details" VALUES(11077,4,22,1,0) +INSERT "Order Details" VALUES(11077,6,25,1,0.02) +INSERT "Order Details" VALUES(11077,7,30,1,0.05) +INSERT "Order Details" VALUES(11077,8,40,2,0.1) +INSERT "Order Details" VALUES(11077,10,31,1,0) +INSERT "Order Details" VALUES(11077,12,38,2,0.05) +INSERT "Order Details" VALUES(11077,13,6,4,0) +INSERT "Order Details" VALUES(11077,14,23.25,1,0.03) +go +INSERT "Order Details" VALUES(11077,16,17.45,2,0.03) +INSERT "Order Details" VALUES(11077,20,81,1,0.04) +INSERT "Order Details" VALUES(11077,23,9,2,0) +INSERT "Order Details" VALUES(11077,32,32,1,0) +INSERT "Order Details" VALUES(11077,39,18,2,0.05) +INSERT "Order Details" VALUES(11077,41,9.65,3,0) +INSERT "Order Details" VALUES(11077,46,12,3,0.02) +INSERT "Order Details" VALUES(11077,52,7,2,0) +INSERT "Order Details" VALUES(11077,55,24,2,0) +INSERT "Order Details" VALUES(11077,60,34,2,0.06) +go +INSERT "Order Details" VALUES(11077,64,33.25,2,0.03) +INSERT "Order Details" VALUES(11077,66,17,1,0) +INSERT "Order Details" VALUES(11077,73,15,2,0.01) +INSERT "Order Details" VALUES(11077,75,7.75,4,0) +INSERT "Order Details" VALUES(11077,77,13,2,0) +go +ALTER TABLE "Order Details" CHECK CONSTRAINT ALL +go +set quoted_identifier on +go +set identity_insert "Orders" on +go +ALTER TABLE "Orders" NOCHECK CONSTRAINT ALL +go +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10248,N'VINET',5,'7/4/1996','8/1/1996','7/16/1996',3,32.38, + N'Vins et alcools Chevalier',N'59 rue de l''Abbaye',N'Reims', + NULL,N'51100',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10249,N'TOMSP',6,'7/5/1996','8/16/1996','7/10/1996',1,11.61, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10250,N'HANAR',4,'7/8/1996','8/5/1996','7/12/1996',2,65.83, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10251,N'VICTE',3,'7/8/1996','8/5/1996','7/15/1996',1,41.34, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10252,N'SUPRD',4,'7/9/1996','8/6/1996','7/11/1996',2,51.30, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10253,N'HANAR',3,'7/10/1996','7/24/1996','7/16/1996',2,58.17, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10254,N'CHOPS',5,'7/11/1996','8/8/1996','7/23/1996',2,22.98, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10255,N'RICSU',9,'7/12/1996','8/9/1996','7/15/1996',3,148.33, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10256,N'WELLI',3,'7/15/1996','8/12/1996','7/17/1996',2,13.97, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10257,N'HILAA',4,'7/16/1996','8/13/1996','7/22/1996',3,81.91, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10258,N'ERNSH',1,'7/17/1996','8/14/1996','7/23/1996',1,140.51, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10259,N'CENTC',4,'7/18/1996','8/15/1996','7/25/1996',3,3.25, + N'Centro comercial Moctezuma',N'Sierras de Granada 9993',N'México D.F.', + NULL,N'05022',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10260,N'OTTIK',4,'7/19/1996','8/16/1996','7/29/1996',1,55.09, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10261,N'QUEDE',4,'7/19/1996','8/16/1996','7/30/1996',2,3.05, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10262,N'RATTC',8,'7/22/1996','8/19/1996','7/25/1996',3,48.29, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10263,N'ERNSH',9,'7/23/1996','8/20/1996','7/31/1996',3,146.06, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10264,N'FOLKO',6,'7/24/1996','8/21/1996','8/23/1996',3,3.67, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10265,N'BLONP',2,'7/25/1996','8/22/1996','8/12/1996',1,55.28, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10266,N'WARTH',3,'7/26/1996','9/6/1996','7/31/1996',3,25.73, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10267,N'FRANK',4,'7/29/1996','8/26/1996','8/6/1996',1,208.58, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10268,N'GROSR',8,'7/30/1996','8/27/1996','8/2/1996',3,66.29, + N'GROSELLA-Restaurante',N'5ª Ave. Los Palos Grandes',N'Caracas', + N'DF',N'1081',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10269,N'WHITC',5,'7/31/1996','8/14/1996','8/9/1996',1,4.56, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10270,N'WARTH',1,'8/1/1996','8/29/1996','8/2/1996',1,136.54, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10271,N'SPLIR',6,'8/1/1996','8/29/1996','8/30/1996',2,4.54, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10272,N'RATTC',6,'8/2/1996','8/30/1996','8/6/1996',2,98.03, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10273,N'QUICK',3,'8/5/1996','9/2/1996','8/12/1996',3,76.07, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10274,N'VINET',6,'8/6/1996','9/3/1996','8/16/1996',1,6.01, + N'Vins et alcools Chevalier',N'59 rue de l''Abbaye',N'Reims', + NULL,N'51100',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10275,N'MAGAA',1,'8/7/1996','9/4/1996','8/9/1996',1,26.93, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10276,N'TORTU',8,'8/8/1996','8/22/1996','8/14/1996',3,13.84, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10277,N'MORGK',2,'8/9/1996','9/6/1996','8/13/1996',3,125.77, + N'Morgenstern Gesundkost',N'Heerstr. 22',N'Leipzig', + NULL,N'04179',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10278,N'BERGS',8,'8/12/1996','9/9/1996','8/16/1996',2,92.69, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10279,N'LEHMS',8,'8/13/1996','9/10/1996','8/16/1996',2,25.83, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10280,N'BERGS',2,'8/14/1996','9/11/1996','9/12/1996',1,8.98, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10281,N'ROMEY',4,'8/14/1996','8/28/1996','8/21/1996',1,2.94, + N'Romero y tomillo',N'Gran Vía, 1',N'Madrid', + NULL,N'28001',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10282,N'ROMEY',4,'8/15/1996','9/12/1996','8/21/1996',1,12.69, + N'Romero y tomillo',N'Gran Vía, 1',N'Madrid', + NULL,N'28001',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10283,N'LILAS',3,'8/16/1996','9/13/1996','8/23/1996',3,84.81, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10284,N'LEHMS',4,'8/19/1996','9/16/1996','8/27/1996',1,76.56, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10285,N'QUICK',1,'8/20/1996','9/17/1996','8/26/1996',2,76.83, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10286,N'QUICK',8,'8/21/1996','9/18/1996','8/30/1996',3,229.24, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10287,N'RICAR',8,'8/22/1996','9/19/1996','8/28/1996',3,12.76, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10288,N'REGGC',4,'8/23/1996','9/20/1996','9/3/1996',1,7.45, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10289,N'BSBEV',7,'8/26/1996','9/23/1996','8/28/1996',3,22.77, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10290,N'COMMI',8,'8/27/1996','9/24/1996','9/3/1996',1,79.70, + N'Comércio Mineiro',N'Av. dos Lusíadas, 23',N'Sao Paulo', + N'SP',N'05432-043',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10291,N'QUEDE',6,'8/27/1996','9/24/1996','9/4/1996',2,6.40, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10292,N'TRADH',1,'8/28/1996','9/25/1996','9/2/1996',2,1.35, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10293,N'TORTU',1,'8/29/1996','9/26/1996','9/11/1996',3,21.18, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10294,N'RATTC',4,'8/30/1996','9/27/1996','9/5/1996',2,147.26, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10295,N'VINET',2,'9/2/1996','9/30/1996','9/10/1996',2,1.15, + N'Vins et alcools Chevalier',N'59 rue de l''Abbaye',N'Reims', + NULL,N'51100',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10296,N'LILAS',6,'9/3/1996','10/1/1996','9/11/1996',1,0.12, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10297,N'BLONP',5,'9/4/1996','10/16/1996','9/10/1996',2,5.74, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10298,N'HUNGO',6,'9/5/1996','10/3/1996','9/11/1996',2,168.22, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10299,N'RICAR',4,'9/6/1996','10/4/1996','9/13/1996',2,29.76, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10300,N'MAGAA',2,'9/9/1996','10/7/1996','9/18/1996',2,17.68, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10301,N'WANDK',8,'9/9/1996','10/7/1996','9/17/1996',2,45.08, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10302,N'SUPRD',4,'9/10/1996','10/8/1996','10/9/1996',2,6.27, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10303,N'GODOS',7,'9/11/1996','10/9/1996','9/18/1996',2,107.83, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10304,N'TORTU',1,'9/12/1996','10/10/1996','9/17/1996',2,63.79, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10305,N'OLDWO',8,'9/13/1996','10/11/1996','10/9/1996',3,257.62, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10306,N'ROMEY',1,'9/16/1996','10/14/1996','9/23/1996',3,7.56, + N'Romero y tomillo',N'Gran Vía, 1',N'Madrid', + NULL,N'28001',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10307,N'LONEP',2,'9/17/1996','10/15/1996','9/25/1996',2,0.56, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10308,N'ANATR',7,'9/18/1996','10/16/1996','9/24/1996',3,1.61, + N'Ana Trujillo Emparedados y helados',N'Avda. de la Constitución 2222',N'México D.F.', + NULL,N'05021',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10309,N'HUNGO',3,'9/19/1996','10/17/1996','10/23/1996',1,47.30, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10310,N'THEBI',8,'9/20/1996','10/18/1996','9/27/1996',2,17.52, + N'The Big Cheese',N'89 Jefferson Way Suite 2',N'Portland', + N'OR',N'97201',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10311,N'DUMON',1,'9/20/1996','10/4/1996','9/26/1996',3,24.69, + N'Du monde entier',N'67, rue des Cinquante Otages',N'Nantes', + NULL,N'44000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10312,N'WANDK',2,'9/23/1996','10/21/1996','10/3/1996',2,40.26, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10313,N'QUICK',2,'9/24/1996','10/22/1996','10/4/1996',2,1.96, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10314,N'RATTC',1,'9/25/1996','10/23/1996','10/4/1996',2,74.16, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10315,N'ISLAT',4,'9/26/1996','10/24/1996','10/3/1996',2,41.76, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10316,N'RATTC',1,'9/27/1996','10/25/1996','10/8/1996',3,150.15, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10317,N'LONEP',6,'9/30/1996','10/28/1996','10/10/1996',1,12.69, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10318,N'ISLAT',8,'10/1/1996','10/29/1996','10/4/1996',2,4.73, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10319,N'TORTU',7,'10/2/1996','10/30/1996','10/11/1996',3,64.50, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10320,N'WARTH',5,'10/3/1996','10/17/1996','10/18/1996',3,34.57, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10321,N'ISLAT',3,'10/3/1996','10/31/1996','10/11/1996',2,3.43, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10322,N'PERIC',7,'10/4/1996','11/1/1996','10/23/1996',3,0.40, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10323,N'KOENE',4,'10/7/1996','11/4/1996','10/14/1996',1,4.88, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10324,N'SAVEA',9,'10/8/1996','11/5/1996','10/10/1996',1,214.27, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10325,N'KOENE',1,'10/9/1996','10/23/1996','10/14/1996',3,64.86, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10326,N'BOLID',4,'10/10/1996','11/7/1996','10/14/1996',2,77.92, + N'Bólido Comidas preparadas',N'C/ Araquil, 67',N'Madrid', + NULL,N'28023',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10327,N'FOLKO',2,'10/11/1996','11/8/1996','10/14/1996',1,63.36, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10328,N'FURIB',4,'10/14/1996','11/11/1996','10/17/1996',3,87.03, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10329,N'SPLIR',4,'10/15/1996','11/26/1996','10/23/1996',2,191.67, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10330,N'LILAS',3,'10/16/1996','11/13/1996','10/28/1996',1,12.75, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10331,N'BONAP',9,'10/16/1996','11/27/1996','10/21/1996',1,10.19, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10332,N'MEREP',3,'10/17/1996','11/28/1996','10/21/1996',2,52.84, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10333,N'WARTH',5,'10/18/1996','11/15/1996','10/25/1996',3,0.59, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10334,N'VICTE',8,'10/21/1996','11/18/1996','10/28/1996',2,8.56, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10335,N'HUNGO',7,'10/22/1996','11/19/1996','10/24/1996',2,42.11, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10336,N'PRINI',7,'10/23/1996','11/20/1996','10/25/1996',2,15.51, + N'Princesa Isabel Vinhos',N'Estrada da saúde n. 58',N'Lisboa', + NULL,N'1756',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10337,N'FRANK',4,'10/24/1996','11/21/1996','10/29/1996',3,108.26, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10338,N'OLDWO',4,'10/25/1996','11/22/1996','10/29/1996',3,84.21, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10339,N'MEREP',2,'10/28/1996','11/25/1996','11/4/1996',2,15.66, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10340,N'BONAP',1,'10/29/1996','11/26/1996','11/8/1996',3,166.31, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10341,N'SIMOB',7,'10/29/1996','11/26/1996','11/5/1996',3,26.78, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10342,N'FRANK',4,'10/30/1996','11/13/1996','11/4/1996',2,54.83, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10343,N'LEHMS',4,'10/31/1996','11/28/1996','11/6/1996',1,110.37, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10344,N'WHITC',4,'11/1/1996','11/29/1996','11/5/1996',2,23.29, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10345,N'QUICK',2,'11/4/1996','12/2/1996','11/11/1996',2,249.06, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10346,N'RATTC',3,'11/5/1996','12/17/1996','11/8/1996',3,142.08, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10347,N'FAMIA',4,'11/6/1996','12/4/1996','11/8/1996',3,3.10, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10348,N'WANDK',4,'11/7/1996','12/5/1996','11/15/1996',2,0.78, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10349,N'SPLIR',7,'11/8/1996','12/6/1996','11/15/1996',1,8.63, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10350,N'LAMAI',6,'11/11/1996','12/9/1996','12/3/1996',2,64.19, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10351,N'ERNSH',1,'11/11/1996','12/9/1996','11/20/1996',1,162.33, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10352,N'FURIB',3,'11/12/1996','11/26/1996','11/18/1996',3,1.30, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10353,N'PICCO',7,'11/13/1996','12/11/1996','11/25/1996',3,360.63, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10354,N'PERIC',8,'11/14/1996','12/12/1996','11/20/1996',3,53.80, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10355,N'AROUT',6,'11/15/1996','12/13/1996','11/20/1996',1,41.95, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10356,N'WANDK',6,'11/18/1996','12/16/1996','11/27/1996',2,36.71, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10357,N'LILAS',1,'11/19/1996','12/17/1996','12/2/1996',3,34.88, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10358,N'LAMAI',5,'11/20/1996','12/18/1996','11/27/1996',1,19.64, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10359,N'SEVES',5,'11/21/1996','12/19/1996','11/26/1996',3,288.43, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10360,N'BLONP',4,'11/22/1996','12/20/1996','12/2/1996',3,131.70, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10361,N'QUICK',1,'11/22/1996','12/20/1996','12/3/1996',2,183.17, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10362,N'BONAP',3,'11/25/1996','12/23/1996','11/28/1996',1,96.04, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10363,N'DRACD',4,'11/26/1996','12/24/1996','12/4/1996',3,30.54, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10364,N'EASTC',1,'11/26/1996','1/7/1997','12/4/1996',1,71.97, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10365,N'ANTON',3,'11/27/1996','12/25/1996','12/2/1996',2,22.00, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10366,N'GALED',8,'11/28/1996','1/9/1997','12/30/1996',2,10.14, + N'Galería del gastronómo',N'Rambla de Cataluña, 23',N'Barcelona', + NULL,N'8022',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10367,N'VAFFE',7,'11/28/1996','12/26/1996','12/2/1996',3,13.55, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10368,N'ERNSH',2,'11/29/1996','12/27/1996','12/2/1996',2,101.95, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10369,N'SPLIR',8,'12/2/1996','12/30/1996','12/9/1996',2,195.68, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10370,N'CHOPS',6,'12/3/1996','12/31/1996','12/27/1996',2,1.17, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10371,N'LAMAI',1,'12/3/1996','12/31/1996','12/24/1996',1,0.45, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10372,N'QUEEN',5,'12/4/1996','1/1/1997','12/9/1996',2,890.78, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10373,N'HUNGO',4,'12/5/1996','1/2/1997','12/11/1996',3,124.12, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10374,N'WOLZA',1,'12/5/1996','1/2/1997','12/9/1996',3,3.94, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10375,N'HUNGC',3,'12/6/1996','1/3/1997','12/9/1996',2,20.12, + N'Hungry Coyote Import Store',N'City Center Plaza 516 Main St.',N'Elgin', + N'OR',N'97827',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10376,N'MEREP',1,'12/9/1996','1/6/1997','12/13/1996',2,20.39, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10377,N'SEVES',1,'12/9/1996','1/6/1997','12/13/1996',3,22.21, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10378,N'FOLKO',5,'12/10/1996','1/7/1997','12/19/1996',3,5.44, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10379,N'QUEDE',2,'12/11/1996','1/8/1997','12/13/1996',1,45.03, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10380,N'HUNGO',8,'12/12/1996','1/9/1997','1/16/1997',3,35.03, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10381,N'LILAS',3,'12/12/1996','1/9/1997','12/13/1996',3,7.99, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10382,N'ERNSH',4,'12/13/1996','1/10/1997','12/16/1996',1,94.77, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10383,N'AROUT',8,'12/16/1996','1/13/1997','12/18/1996',3,34.24, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10384,N'BERGS',3,'12/16/1996','1/13/1997','12/20/1996',3,168.64, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10385,N'SPLIR',1,'12/17/1996','1/14/1997','12/23/1996',2,30.96, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10386,N'FAMIA',9,'12/18/1996','1/1/1997','12/25/1996',3,13.99, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10387,N'SANTG',1,'12/18/1996','1/15/1997','12/20/1996',2,93.63, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10388,N'SEVES',2,'12/19/1996','1/16/1997','12/20/1996',1,34.86, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10389,N'BOTTM',4,'12/20/1996','1/17/1997','12/24/1996',2,47.42, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10390,N'ERNSH',6,'12/23/1996','1/20/1997','12/26/1996',1,126.38, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10391,N'DRACD',3,'12/23/1996','1/20/1997','12/31/1996',3,5.45, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10392,N'PICCO',2,'12/24/1996','1/21/1997','1/1/1997',3,122.46, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10393,N'SAVEA',1,'12/25/1996','1/22/1997','1/3/1997',3,126.56, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10394,N'HUNGC',1,'12/25/1996','1/22/1997','1/3/1997',3,30.34, + N'Hungry Coyote Import Store',N'City Center Plaza 516 Main St.',N'Elgin', + N'OR',N'97827',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10395,N'HILAA',6,'12/26/1996','1/23/1997','1/3/1997',1,184.41, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10396,N'FRANK',1,'12/27/1996','1/10/1997','1/6/1997',3,135.35, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10397,N'PRINI',5,'12/27/1996','1/24/1997','1/2/1997',1,60.26, + N'Princesa Isabel Vinhos',N'Estrada da saúde n. 58',N'Lisboa', + NULL,N'1756',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10398,N'SAVEA',2,'12/30/1996','1/27/1997','1/9/1997',3,89.16, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10399,N'VAFFE',8,'12/31/1996','1/14/1997','1/8/1997',3,27.36, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10400,N'EASTC',1,'1/1/1997','1/29/1997','1/16/1997',3,83.93, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10401,N'RATTC',1,'1/1/1997','1/29/1997','1/10/1997',1,12.51, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10402,N'ERNSH',8,'1/2/1997','2/13/1997','1/10/1997',2,67.88, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10403,N'ERNSH',4,'1/3/1997','1/31/1997','1/9/1997',3,73.79, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10404,N'MAGAA',2,'1/3/1997','1/31/1997','1/8/1997',1,155.97, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10405,N'LINOD',1,'1/6/1997','2/3/1997','1/22/1997',1,34.82, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10406,N'QUEEN',7,'1/7/1997','2/18/1997','1/13/1997',1,108.04, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10407,N'OTTIK',2,'1/7/1997','2/4/1997','1/30/1997',2,91.48, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10408,N'FOLIG',8,'1/8/1997','2/5/1997','1/14/1997',1,11.26, + N'Folies gourmandes',N'184, chaussée de Tournai',N'Lille', + NULL,N'59000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10409,N'OCEAN',3,'1/9/1997','2/6/1997','1/14/1997',1,29.83, + N'Océano Atlántico Ltda.',N'Ing. Gustavo Moncada 8585 Piso 20-A',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10410,N'BOTTM',3,'1/10/1997','2/7/1997','1/15/1997',3,2.40, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10411,N'BOTTM',9,'1/10/1997','2/7/1997','1/21/1997',3,23.65, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10412,N'WARTH',8,'1/13/1997','2/10/1997','1/15/1997',2,3.77, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10413,N'LAMAI',3,'1/14/1997','2/11/1997','1/16/1997',2,95.66, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10414,N'FAMIA',2,'1/14/1997','2/11/1997','1/17/1997',3,21.48, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10415,N'HUNGC',3,'1/15/1997','2/12/1997','1/24/1997',1,0.20, + N'Hungry Coyote Import Store',N'City Center Plaza 516 Main St.',N'Elgin', + N'OR',N'97827',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10416,N'WARTH',8,'1/16/1997','2/13/1997','1/27/1997',3,22.72, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10417,N'SIMOB',4,'1/16/1997','2/13/1997','1/28/1997',3,70.29, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10418,N'QUICK',4,'1/17/1997','2/14/1997','1/24/1997',1,17.55, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10419,N'RICSU',4,'1/20/1997','2/17/1997','1/30/1997',2,137.35, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10420,N'WELLI',3,'1/21/1997','2/18/1997','1/27/1997',1,44.12, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10421,N'QUEDE',8,'1/21/1997','3/4/1997','1/27/1997',1,99.23, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10422,N'FRANS',2,'1/22/1997','2/19/1997','1/31/1997',1,3.02, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10423,N'GOURL',6,'1/23/1997','2/6/1997','2/24/1997',3,24.50, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10424,N'MEREP',7,'1/23/1997','2/20/1997','1/27/1997',2,370.61, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10425,N'LAMAI',6,'1/24/1997','2/21/1997','2/14/1997',2,7.93, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10426,N'GALED',4,'1/27/1997','2/24/1997','2/6/1997',1,18.69, + N'Galería del gastronómo',N'Rambla de Cataluña, 23',N'Barcelona', + NULL,N'8022',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10427,N'PICCO',4,'1/27/1997','2/24/1997','3/3/1997',2,31.29, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10428,N'REGGC',7,'1/28/1997','2/25/1997','2/4/1997',1,11.09, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10429,N'HUNGO',3,'1/29/1997','3/12/1997','2/7/1997',2,56.63, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10430,N'ERNSH',4,'1/30/1997','2/13/1997','2/3/1997',1,458.78, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10431,N'BOTTM',4,'1/30/1997','2/13/1997','2/7/1997',2,44.17, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10432,N'SPLIR',3,'1/31/1997','2/14/1997','2/7/1997',2,4.34, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10433,N'PRINI',3,'2/3/1997','3/3/1997','3/4/1997',3,73.83, + N'Princesa Isabel Vinhos',N'Estrada da saúde n. 58',N'Lisboa', + NULL,N'1756',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10434,N'FOLKO',3,'2/3/1997','3/3/1997','2/13/1997',2,17.92, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10435,N'CONSH',8,'2/4/1997','3/18/1997','2/7/1997',2,9.21, + N'Consolidated Holdings',N'Berkeley Gardens 12 Brewery',N'London', + NULL,N'WX1 6LT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10436,N'BLONP',3,'2/5/1997','3/5/1997','2/11/1997',2,156.66, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10437,N'WARTH',8,'2/5/1997','3/5/1997','2/12/1997',1,19.97, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10438,N'TOMSP',3,'2/6/1997','3/6/1997','2/14/1997',2,8.24, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10439,N'MEREP',6,'2/7/1997','3/7/1997','2/10/1997',3,4.07, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10440,N'SAVEA',4,'2/10/1997','3/10/1997','2/28/1997',2,86.53, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10441,N'OLDWO',3,'2/10/1997','3/24/1997','3/14/1997',2,73.02, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10442,N'ERNSH',3,'2/11/1997','3/11/1997','2/18/1997',2,47.94, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10443,N'REGGC',8,'2/12/1997','3/12/1997','2/14/1997',1,13.95, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10444,N'BERGS',3,'2/12/1997','3/12/1997','2/21/1997',3,3.50, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10445,N'BERGS',3,'2/13/1997','3/13/1997','2/20/1997',1,9.30, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10446,N'TOMSP',6,'2/14/1997','3/14/1997','2/19/1997',1,14.68, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10447,N'RICAR',4,'2/14/1997','3/14/1997','3/7/1997',2,68.66, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10448,N'RANCH',4,'2/17/1997','3/17/1997','2/24/1997',2,38.82, + N'Rancho grande',N'Av. del Libertador 900',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10449,N'BLONP',3,'2/18/1997','3/18/1997','2/27/1997',2,53.30, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10450,N'VICTE',8,'2/19/1997','3/19/1997','3/11/1997',2,7.23, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10451,N'QUICK',4,'2/19/1997','3/5/1997','3/12/1997',3,189.09, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10452,N'SAVEA',8,'2/20/1997','3/20/1997','2/26/1997',1,140.26, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10453,N'AROUT',1,'2/21/1997','3/21/1997','2/26/1997',2,25.36, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10454,N'LAMAI',4,'2/21/1997','3/21/1997','2/25/1997',3,2.74, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10455,N'WARTH',8,'2/24/1997','4/7/1997','3/3/1997',2,180.45, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10456,N'KOENE',8,'2/25/1997','4/8/1997','2/28/1997',2,8.12, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10457,N'KOENE',2,'2/25/1997','3/25/1997','3/3/1997',1,11.57, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10458,N'SUPRD',7,'2/26/1997','3/26/1997','3/4/1997',3,147.06, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10459,N'VICTE',4,'2/27/1997','3/27/1997','2/28/1997',2,25.09, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10460,N'FOLKO',8,'2/28/1997','3/28/1997','3/3/1997',1,16.27, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10461,N'LILAS',1,'2/28/1997','3/28/1997','3/5/1997',3,148.61, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10462,N'CONSH',2,'3/3/1997','3/31/1997','3/18/1997',1,6.17, + N'Consolidated Holdings',N'Berkeley Gardens 12 Brewery',N'London', + NULL,N'WX1 6LT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10463,N'SUPRD',5,'3/4/1997','4/1/1997','3/6/1997',3,14.78, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10464,N'FURIB',4,'3/4/1997','4/1/1997','3/14/1997',2,89.00, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10465,N'VAFFE',1,'3/5/1997','4/2/1997','3/14/1997',3,145.04, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10466,N'COMMI',4,'3/6/1997','4/3/1997','3/13/1997',1,11.93, + N'Comércio Mineiro',N'Av. dos Lusíadas, 23',N'Sao Paulo', + N'SP',N'05432-043',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10467,N'MAGAA',8,'3/6/1997','4/3/1997','3/11/1997',2,4.93, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10468,N'KOENE',3,'3/7/1997','4/4/1997','3/12/1997',3,44.12, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10469,N'WHITC',1,'3/10/1997','4/7/1997','3/14/1997',1,60.18, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10470,N'BONAP',4,'3/11/1997','4/8/1997','3/14/1997',2,64.56, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10471,N'BSBEV',2,'3/11/1997','4/8/1997','3/18/1997',3,45.59, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10472,N'SEVES',8,'3/12/1997','4/9/1997','3/19/1997',1,4.20, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10473,N'ISLAT',1,'3/13/1997','3/27/1997','3/21/1997',3,16.37, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10474,N'PERIC',5,'3/13/1997','4/10/1997','3/21/1997',2,83.49, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10475,N'SUPRD',9,'3/14/1997','4/11/1997','4/4/1997',1,68.52, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10476,N'HILAA',8,'3/17/1997','4/14/1997','3/24/1997',3,4.41, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10477,N'PRINI',5,'3/17/1997','4/14/1997','3/25/1997',2,13.02, + N'Princesa Isabel Vinhos',N'Estrada da saúde n. 58',N'Lisboa', + NULL,N'1756',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10478,N'VICTE',2,'3/18/1997','4/1/1997','3/26/1997',3,4.81, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10479,N'RATTC',3,'3/19/1997','4/16/1997','3/21/1997',3,708.95, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10480,N'FOLIG',6,'3/20/1997','4/17/1997','3/24/1997',2,1.35, + N'Folies gourmandes',N'184, chaussée de Tournai',N'Lille', + NULL,N'59000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10481,N'RICAR',8,'3/20/1997','4/17/1997','3/25/1997',2,64.33, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10482,N'LAZYK',1,'3/21/1997','4/18/1997','4/10/1997',3,7.48, + N'Lazy K Kountry Store',N'12 Orchestra Terrace',N'Walla Walla', + N'WA',N'99362',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10483,N'WHITC',7,'3/24/1997','4/21/1997','4/25/1997',2,15.28, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10484,N'BSBEV',3,'3/24/1997','4/21/1997','4/1/1997',3,6.88, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10485,N'LINOD',4,'3/25/1997','4/8/1997','3/31/1997',2,64.45, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10486,N'HILAA',1,'3/26/1997','4/23/1997','4/2/1997',2,30.53, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10487,N'QUEEN',2,'3/26/1997','4/23/1997','3/28/1997',2,71.07, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10488,N'FRANK',8,'3/27/1997','4/24/1997','4/2/1997',2,4.93, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10489,N'PICCO',6,'3/28/1997','4/25/1997','4/9/1997',2,5.29, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10490,N'HILAA',7,'3/31/1997','4/28/1997','4/3/1997',2,210.19, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10491,N'FURIB',8,'3/31/1997','4/28/1997','4/8/1997',3,16.96, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10492,N'BOTTM',3,'4/1/1997','4/29/1997','4/11/1997',1,62.89, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10493,N'LAMAI',4,'4/2/1997','4/30/1997','4/10/1997',3,10.64, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10494,N'COMMI',4,'4/2/1997','4/30/1997','4/9/1997',2,65.99, + N'Comércio Mineiro',N'Av. dos Lusíadas, 23',N'Sao Paulo', + N'SP',N'05432-043',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10495,N'LAUGB',3,'4/3/1997','5/1/1997','4/11/1997',3,4.65, + N'Laughing Bacchus Wine Cellars',N'2319 Elm St.',N'Vancouver', + N'BC',N'V3F 2K1',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10496,N'TRADH',7,'4/4/1997','5/2/1997','4/7/1997',2,46.77, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10497,N'LEHMS',7,'4/4/1997','5/2/1997','4/7/1997',1,36.21, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10498,N'HILAA',8,'4/7/1997','5/5/1997','4/11/1997',2,29.75, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10499,N'LILAS',4,'4/8/1997','5/6/1997','4/16/1997',2,102.02, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10500,N'LAMAI',6,'4/9/1997','5/7/1997','4/17/1997',1,42.68, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10501,N'BLAUS',9,'4/9/1997','5/7/1997','4/16/1997',3,8.85, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10502,N'PERIC',2,'4/10/1997','5/8/1997','4/29/1997',1,69.32, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10503,N'HUNGO',6,'4/11/1997','5/9/1997','4/16/1997',2,16.74, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10504,N'WHITC',4,'4/11/1997','5/9/1997','4/18/1997',3,59.13, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10505,N'MEREP',3,'4/14/1997','5/12/1997','4/21/1997',3,7.13, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10506,N'KOENE',9,'4/15/1997','5/13/1997','5/2/1997',2,21.19, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10507,N'ANTON',7,'4/15/1997','5/13/1997','4/22/1997',1,47.45, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10508,N'OTTIK',1,'4/16/1997','5/14/1997','5/13/1997',2,4.99, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10509,N'BLAUS',4,'4/17/1997','5/15/1997','4/29/1997',1,0.15, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10510,N'SAVEA',6,'4/18/1997','5/16/1997','4/28/1997',3,367.63, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10511,N'BONAP',4,'4/18/1997','5/16/1997','4/21/1997',3,350.64, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10512,N'FAMIA',7,'4/21/1997','5/19/1997','4/24/1997',2,3.53, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10513,N'WANDK',7,'4/22/1997','6/3/1997','4/28/1997',1,105.65, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10514,N'ERNSH',3,'4/22/1997','5/20/1997','5/16/1997',2,789.95, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10515,N'QUICK',2,'4/23/1997','5/7/1997','5/23/1997',1,204.47, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10516,N'HUNGO',2,'4/24/1997','5/22/1997','5/1/1997',3,62.78, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10517,N'NORTS',3,'4/24/1997','5/22/1997','4/29/1997',3,32.07, + N'North/South',N'South House 300 Queensbridge',N'London', + NULL,N'SW7 1RZ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10518,N'TORTU',4,'4/25/1997','5/9/1997','5/5/1997',2,218.15, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10519,N'CHOPS',6,'4/28/1997','5/26/1997','5/1/1997',3,91.76, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10520,N'SANTG',7,'4/29/1997','5/27/1997','5/1/1997',1,13.37, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10521,N'CACTU',8,'4/29/1997','5/27/1997','5/2/1997',2,17.22, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10522,N'LEHMS',4,'4/30/1997','5/28/1997','5/6/1997',1,45.33, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10523,N'SEVES',7,'5/1/1997','5/29/1997','5/30/1997',2,77.63, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10524,N'BERGS',1,'5/1/1997','5/29/1997','5/7/1997',2,244.79, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10525,N'BONAP',1,'5/2/1997','5/30/1997','5/23/1997',2,11.06, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10526,N'WARTH',4,'5/5/1997','6/2/1997','5/15/1997',2,58.59, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10527,N'QUICK',7,'5/5/1997','6/2/1997','5/7/1997',1,41.90, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10528,N'GREAL',6,'5/6/1997','5/20/1997','5/9/1997',2,3.35, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10529,N'MAISD',5,'5/7/1997','6/4/1997','5/9/1997',2,66.69, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10530,N'PICCO',3,'5/8/1997','6/5/1997','5/12/1997',2,339.22, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10531,N'OCEAN',7,'5/8/1997','6/5/1997','5/19/1997',1,8.12, + N'Océano Atlántico Ltda.',N'Ing. Gustavo Moncada 8585 Piso 20-A',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10532,N'EASTC',7,'5/9/1997','6/6/1997','5/12/1997',3,74.46, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10533,N'FOLKO',8,'5/12/1997','6/9/1997','5/22/1997',1,188.04, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10534,N'LEHMS',8,'5/12/1997','6/9/1997','5/14/1997',2,27.94, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10535,N'ANTON',4,'5/13/1997','6/10/1997','5/21/1997',1,15.64, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10536,N'LEHMS',3,'5/14/1997','6/11/1997','6/6/1997',2,58.88, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10537,N'RICSU',1,'5/14/1997','5/28/1997','5/19/1997',1,78.85, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10538,N'BSBEV',9,'5/15/1997','6/12/1997','5/16/1997',3,4.87, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10539,N'BSBEV',6,'5/16/1997','6/13/1997','5/23/1997',3,12.36, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10540,N'QUICK',3,'5/19/1997','6/16/1997','6/13/1997',3,1007.64, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10541,N'HANAR',2,'5/19/1997','6/16/1997','5/29/1997',1,68.65, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10542,N'KOENE',1,'5/20/1997','6/17/1997','5/26/1997',3,10.95, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10543,N'LILAS',8,'5/21/1997','6/18/1997','5/23/1997',2,48.17, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10544,N'LONEP',4,'5/21/1997','6/18/1997','5/30/1997',1,24.91, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10545,N'LAZYK',8,'5/22/1997','6/19/1997','6/26/1997',2,11.92, + N'Lazy K Kountry Store',N'12 Orchestra Terrace',N'Walla Walla', + N'WA',N'99362',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10546,N'VICTE',1,'5/23/1997','6/20/1997','5/27/1997',3,194.72, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10547,N'SEVES',3,'5/23/1997','6/20/1997','6/2/1997',2,178.43, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10548,N'TOMSP',3,'5/26/1997','6/23/1997','6/2/1997',2,1.43, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10549,N'QUICK',5,'5/27/1997','6/10/1997','5/30/1997',1,171.24, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10550,N'GODOS',7,'5/28/1997','6/25/1997','6/6/1997',3,4.32, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10551,N'FURIB',4,'5/28/1997','7/9/1997','6/6/1997',3,72.95, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10552,N'HILAA',2,'5/29/1997','6/26/1997','6/5/1997',1,83.22, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10553,N'WARTH',2,'5/30/1997','6/27/1997','6/3/1997',2,149.49, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10554,N'OTTIK',4,'5/30/1997','6/27/1997','6/5/1997',3,120.97, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10555,N'SAVEA',6,'6/2/1997','6/30/1997','6/4/1997',3,252.49, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10556,N'SIMOB',2,'6/3/1997','7/15/1997','6/13/1997',1,9.80, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10557,N'LEHMS',9,'6/3/1997','6/17/1997','6/6/1997',2,96.72, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10558,N'AROUT',1,'6/4/1997','7/2/1997','6/10/1997',2,72.97, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10559,N'BLONP',6,'6/5/1997','7/3/1997','6/13/1997',1,8.05, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10560,N'FRANK',8,'6/6/1997','7/4/1997','6/9/1997',1,36.65, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10561,N'FOLKO',2,'6/6/1997','7/4/1997','6/9/1997',2,242.21, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10562,N'REGGC',1,'6/9/1997','7/7/1997','6/12/1997',1,22.95, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10563,N'RICAR',2,'6/10/1997','7/22/1997','6/24/1997',2,60.43, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10564,N'RATTC',4,'6/10/1997','7/8/1997','6/16/1997',3,13.75, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10565,N'MEREP',8,'6/11/1997','7/9/1997','6/18/1997',2,7.15, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10566,N'BLONP',9,'6/12/1997','7/10/1997','6/18/1997',1,88.40, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10567,N'HUNGO',1,'6/12/1997','7/10/1997','6/17/1997',1,33.97, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10568,N'GALED',3,'6/13/1997','7/11/1997','7/9/1997',3,6.54, + N'Galería del gastronómo',N'Rambla de Cataluña, 23',N'Barcelona', + NULL,N'8022',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10569,N'RATTC',5,'6/16/1997','7/14/1997','7/11/1997',1,58.98, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10570,N'MEREP',3,'6/17/1997','7/15/1997','6/19/1997',3,188.99, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10571,N'ERNSH',8,'6/17/1997','7/29/1997','7/4/1997',3,26.06, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10572,N'BERGS',3,'6/18/1997','7/16/1997','6/25/1997',2,116.43, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10573,N'ANTON',7,'6/19/1997','7/17/1997','6/20/1997',3,84.84, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10574,N'TRAIH',4,'6/19/1997','7/17/1997','6/30/1997',2,37.60, + N'Trail''s Head Gourmet Provisioners',N'722 DaVinci Blvd.',N'Kirkland', + N'WA',N'98034',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10575,N'MORGK',5,'6/20/1997','7/4/1997','6/30/1997',1,127.34, + N'Morgenstern Gesundkost',N'Heerstr. 22',N'Leipzig', + NULL,N'04179',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10576,N'TORTU',3,'6/23/1997','7/7/1997','6/30/1997',3,18.56, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10577,N'TRAIH',9,'6/23/1997','8/4/1997','6/30/1997',2,25.41, + N'Trail''s Head Gourmet Provisioners',N'722 DaVinci Blvd.',N'Kirkland', + N'WA',N'98034',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10578,N'BSBEV',4,'6/24/1997','7/22/1997','7/25/1997',3,29.60, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10579,N'LETSS',1,'6/25/1997','7/23/1997','7/4/1997',2,13.73, + N'Let''s Stop N Shop',N'87 Polk St. Suite 5',N'San Francisco', + N'CA',N'94117',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10580,N'OTTIK',4,'6/26/1997','7/24/1997','7/1/1997',3,75.89, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10581,N'FAMIA',3,'6/26/1997','7/24/1997','7/2/1997',1,3.01, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10582,N'BLAUS',3,'6/27/1997','7/25/1997','7/14/1997',2,27.71, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10583,N'WARTH',2,'6/30/1997','7/28/1997','7/4/1997',2,7.28, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10584,N'BLONP',4,'6/30/1997','7/28/1997','7/4/1997',1,59.14, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10585,N'WELLI',7,'7/1/1997','7/29/1997','7/10/1997',1,13.41, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10586,N'REGGC',9,'7/2/1997','7/30/1997','7/9/1997',1,0.48, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10587,N'QUEDE',1,'7/2/1997','7/30/1997','7/9/1997',1,62.52, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10588,N'QUICK',2,'7/3/1997','7/31/1997','7/10/1997',3,194.67, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10589,N'GREAL',8,'7/4/1997','8/1/1997','7/14/1997',2,4.42, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10590,N'MEREP',4,'7/7/1997','8/4/1997','7/14/1997',3,44.77, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10591,N'VAFFE',1,'7/7/1997','7/21/1997','7/16/1997',1,55.92, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10592,N'LEHMS',3,'7/8/1997','8/5/1997','7/16/1997',1,32.10, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10593,N'LEHMS',7,'7/9/1997','8/6/1997','8/13/1997',2,174.20, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10594,N'OLDWO',3,'7/9/1997','8/6/1997','7/16/1997',2,5.24, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10595,N'ERNSH',2,'7/10/1997','8/7/1997','7/14/1997',1,96.78, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10596,N'WHITC',8,'7/11/1997','8/8/1997','8/12/1997',1,16.34, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10597,N'PICCO',7,'7/11/1997','8/8/1997','7/18/1997',3,35.12, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10598,N'RATTC',1,'7/14/1997','8/11/1997','7/18/1997',3,44.42, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10599,N'BSBEV',6,'7/15/1997','8/26/1997','7/21/1997',3,29.98, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10600,N'HUNGC',4,'7/16/1997','8/13/1997','7/21/1997',1,45.13, + N'Hungry Coyote Import Store',N'City Center Plaza 516 Main St.',N'Elgin', + N'OR',N'97827',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10601,N'HILAA',7,'7/16/1997','8/27/1997','7/22/1997',1,58.30, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10602,N'VAFFE',8,'7/17/1997','8/14/1997','7/22/1997',2,2.92, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10603,N'SAVEA',8,'7/18/1997','8/15/1997','8/8/1997',2,48.77, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10604,N'FURIB',1,'7/18/1997','8/15/1997','7/29/1997',1,7.46, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10605,N'MEREP',1,'7/21/1997','8/18/1997','7/29/1997',2,379.13, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10606,N'TRADH',4,'7/22/1997','8/19/1997','7/31/1997',3,79.40, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10607,N'SAVEA',5,'7/22/1997','8/19/1997','7/25/1997',1,200.24, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10608,N'TOMSP',4,'7/23/1997','8/20/1997','8/1/1997',2,27.79, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10609,N'DUMON',7,'7/24/1997','8/21/1997','7/30/1997',2,1.85, + N'Du monde entier',N'67, rue des Cinquante Otages',N'Nantes', + NULL,N'44000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10610,N'LAMAI',8,'7/25/1997','8/22/1997','8/6/1997',1,26.78, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10611,N'WOLZA',6,'7/25/1997','8/22/1997','8/1/1997',2,80.65, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10612,N'SAVEA',1,'7/28/1997','8/25/1997','8/1/1997',2,544.08, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10613,N'HILAA',4,'7/29/1997','8/26/1997','8/1/1997',2,8.11, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10614,N'BLAUS',8,'7/29/1997','8/26/1997','8/1/1997',3,1.93, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10615,N'WILMK',2,'7/30/1997','8/27/1997','8/6/1997',3,0.75, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10616,N'GREAL',1,'7/31/1997','8/28/1997','8/5/1997',2,116.53, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10617,N'GREAL',4,'7/31/1997','8/28/1997','8/4/1997',2,18.53, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10618,N'MEREP',1,'8/1/1997','9/12/1997','8/8/1997',1,154.68, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10619,N'MEREP',3,'8/4/1997','9/1/1997','8/7/1997',3,91.05, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10620,N'LAUGB',2,'8/5/1997','9/2/1997','8/14/1997',3,0.94, + N'Laughing Bacchus Wine Cellars',N'2319 Elm St.',N'Vancouver', + N'BC',N'V3F 2K1',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10621,N'ISLAT',4,'8/5/1997','9/2/1997','8/11/1997',2,23.73, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10622,N'RICAR',4,'8/6/1997','9/3/1997','8/11/1997',3,50.97, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10623,N'FRANK',8,'8/7/1997','9/4/1997','8/12/1997',2,97.18, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10624,N'THECR',4,'8/7/1997','9/4/1997','8/19/1997',2,94.80, + N'The Cracker Box',N'55 Grizzly Peak Rd.',N'Butte', + N'MT',N'59801',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10625,N'ANATR',3,'8/8/1997','9/5/1997','8/14/1997',1,43.90, + N'Ana Trujillo Emparedados y helados',N'Avda. de la Constitución 2222',N'México D.F.', + NULL,N'05021',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10626,N'BERGS',1,'8/11/1997','9/8/1997','8/20/1997',2,138.69, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10627,N'SAVEA',8,'8/11/1997','9/22/1997','8/21/1997',3,107.46, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10628,N'BLONP',4,'8/12/1997','9/9/1997','8/20/1997',3,30.36, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10629,N'GODOS',4,'8/12/1997','9/9/1997','8/20/1997',3,85.46, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10630,N'KOENE',1,'8/13/1997','9/10/1997','8/19/1997',2,32.35, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10631,N'LAMAI',8,'8/14/1997','9/11/1997','8/15/1997',1,0.87, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10632,N'WANDK',8,'8/14/1997','9/11/1997','8/19/1997',1,41.38, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10633,N'ERNSH',7,'8/15/1997','9/12/1997','8/18/1997',3,477.90, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10634,N'FOLIG',4,'8/15/1997','9/12/1997','8/21/1997',3,487.38, + N'Folies gourmandes',N'184, chaussée de Tournai',N'Lille', + NULL,N'59000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10635,N'MAGAA',8,'8/18/1997','9/15/1997','8/21/1997',3,47.46, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10636,N'WARTH',4,'8/19/1997','9/16/1997','8/26/1997',1,1.15, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10637,N'QUEEN',6,'8/19/1997','9/16/1997','8/26/1997',1,201.29, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10638,N'LINOD',3,'8/20/1997','9/17/1997','9/1/1997',1,158.44, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10639,N'SANTG',7,'8/20/1997','9/17/1997','8/27/1997',3,38.64, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10640,N'WANDK',4,'8/21/1997','9/18/1997','8/28/1997',1,23.55, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10641,N'HILAA',4,'8/22/1997','9/19/1997','8/26/1997',2,179.61, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10642,N'SIMOB',7,'8/22/1997','9/19/1997','9/5/1997',3,41.89, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10643,N'ALFKI',6,'8/25/1997','9/22/1997','9/2/1997',1,29.46, + N'Alfreds Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10644,N'WELLI',3,'8/25/1997','9/22/1997','9/1/1997',2,0.14, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10645,N'HANAR',4,'8/26/1997','9/23/1997','9/2/1997',1,12.41, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10646,N'HUNGO',9,'8/27/1997','10/8/1997','9/3/1997',3,142.33, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10647,N'QUEDE',4,'8/27/1997','9/10/1997','9/3/1997',2,45.54, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10648,N'RICAR',5,'8/28/1997','10/9/1997','9/9/1997',2,14.25, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10649,N'MAISD',5,'8/28/1997','9/25/1997','8/29/1997',3,6.20, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10650,N'FAMIA',5,'8/29/1997','9/26/1997','9/3/1997',3,176.81, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10651,N'WANDK',8,'9/1/1997','9/29/1997','9/11/1997',2,20.60, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10652,N'GOURL',4,'9/1/1997','9/29/1997','9/8/1997',2,7.14, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10653,N'FRANK',1,'9/2/1997','9/30/1997','9/19/1997',1,93.25, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10654,N'BERGS',5,'9/2/1997','9/30/1997','9/11/1997',1,55.26, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10655,N'REGGC',1,'9/3/1997','10/1/1997','9/11/1997',2,4.41, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10656,N'GREAL',6,'9/4/1997','10/2/1997','9/10/1997',1,57.15, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10657,N'SAVEA',2,'9/4/1997','10/2/1997','9/15/1997',2,352.69, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10658,N'QUICK',4,'9/5/1997','10/3/1997','9/8/1997',1,364.15, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10659,N'QUEEN',7,'9/5/1997','10/3/1997','9/10/1997',2,105.81, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10660,N'HUNGC',8,'9/8/1997','10/6/1997','10/15/1997',1,111.29, + N'Hungry Coyote Import Store',N'City Center Plaza 516 Main St.',N'Elgin', + N'OR',N'97827',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10661,N'HUNGO',7,'9/9/1997','10/7/1997','9/15/1997',3,17.55, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10662,N'LONEP',3,'9/9/1997','10/7/1997','9/18/1997',2,1.28, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10663,N'BONAP',2,'9/10/1997','9/24/1997','10/3/1997',2,113.15, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10664,N'FURIB',1,'9/10/1997','10/8/1997','9/19/1997',3,1.27, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10665,N'LONEP',1,'9/11/1997','10/9/1997','9/17/1997',2,26.31, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10666,N'RICSU',7,'9/12/1997','10/10/1997','9/22/1997',2,232.42, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10667,N'ERNSH',7,'9/12/1997','10/10/1997','9/19/1997',1,78.09, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10668,N'WANDK',1,'9/15/1997','10/13/1997','9/23/1997',2,47.22, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10669,N'SIMOB',2,'9/15/1997','10/13/1997','9/22/1997',1,24.39, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10670,N'FRANK',4,'9/16/1997','10/14/1997','9/18/1997',1,203.48, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10671,N'FRANR',1,'9/17/1997','10/15/1997','9/24/1997',1,30.34, + N'France restauration',N'54, rue Royale',N'Nantes', + NULL,N'44000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10672,N'BERGS',9,'9/17/1997','10/1/1997','9/26/1997',2,95.75, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10673,N'WILMK',2,'9/18/1997','10/16/1997','9/19/1997',1,22.76, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10674,N'ISLAT',4,'9/18/1997','10/16/1997','9/30/1997',2,0.90, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10675,N'FRANK',5,'9/19/1997','10/17/1997','9/23/1997',2,31.85, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10676,N'TORTU',2,'9/22/1997','10/20/1997','9/29/1997',2,2.01, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10677,N'ANTON',1,'9/22/1997','10/20/1997','9/26/1997',3,4.03, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10678,N'SAVEA',7,'9/23/1997','10/21/1997','10/16/1997',3,388.98, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10679,N'BLONP',8,'9/23/1997','10/21/1997','9/30/1997',3,27.94, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10680,N'OLDWO',1,'9/24/1997','10/22/1997','9/26/1997',1,26.61, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10681,N'GREAL',3,'9/25/1997','10/23/1997','9/30/1997',3,76.13, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10682,N'ANTON',3,'9/25/1997','10/23/1997','10/1/1997',2,36.13, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10683,N'DUMON',2,'9/26/1997','10/24/1997','10/1/1997',1,4.40, + N'Du monde entier',N'67, rue des Cinquante Otages',N'Nantes', + NULL,N'44000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10684,N'OTTIK',3,'9/26/1997','10/24/1997','9/30/1997',1,145.63, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10685,N'GOURL',4,'9/29/1997','10/13/1997','10/3/1997',2,33.75, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10686,N'PICCO',2,'9/30/1997','10/28/1997','10/8/1997',1,96.50, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10687,N'HUNGO',9,'9/30/1997','10/28/1997','10/30/1997',2,296.43, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10688,N'VAFFE',4,'10/1/1997','10/15/1997','10/7/1997',2,299.09, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10689,N'BERGS',1,'10/1/1997','10/29/1997','10/7/1997',2,13.42, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10690,N'HANAR',1,'10/2/1997','10/30/1997','10/3/1997',1,15.80, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10691,N'QUICK',2,'10/3/1997','11/14/1997','10/22/1997',2,810.05, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10692,N'ALFKI',4,'10/3/1997','10/31/1997','10/13/1997',2,61.02, + N'Alfred''s Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10693,N'WHITC',3,'10/6/1997','10/20/1997','10/10/1997',3,139.34, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10694,N'QUICK',8,'10/6/1997','11/3/1997','10/9/1997',3,398.36, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10695,N'WILMK',7,'10/7/1997','11/18/1997','10/14/1997',1,16.72, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10696,N'WHITC',8,'10/8/1997','11/19/1997','10/14/1997',3,102.55, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10697,N'LINOD',3,'10/8/1997','11/5/1997','10/14/1997',1,45.52, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10698,N'ERNSH',4,'10/9/1997','11/6/1997','10/17/1997',1,272.47, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10699,N'MORGK',3,'10/9/1997','11/6/1997','10/13/1997',3,0.58, + N'Morgenstern Gesundkost',N'Heerstr. 22',N'Leipzig', + NULL,N'04179',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10700,N'SAVEA',3,'10/10/1997','11/7/1997','10/16/1997',1,65.10, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10701,N'HUNGO',6,'10/13/1997','10/27/1997','10/15/1997',3,220.31, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10702,N'ALFKI',4,'10/13/1997','11/24/1997','10/21/1997',1,23.94, + N'Alfred''s Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10703,N'FOLKO',6,'10/14/1997','11/11/1997','10/20/1997',2,152.30, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10704,N'QUEEN',6,'10/14/1997','11/11/1997','11/7/1997',1,4.78, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10705,N'HILAA',9,'10/15/1997','11/12/1997','11/18/1997',2,3.52, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10706,N'OLDWO',8,'10/16/1997','11/13/1997','10/21/1997',3,135.63, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10707,N'AROUT',4,'10/16/1997','10/30/1997','10/23/1997',3,21.74, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10708,N'THEBI',6,'10/17/1997','11/28/1997','11/5/1997',2,2.96, + N'The Big Cheese',N'89 Jefferson Way Suite 2',N'Portland', + N'OR',N'97201',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10709,N'GOURL',1,'10/17/1997','11/14/1997','11/20/1997',3,210.80, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10710,N'FRANS',1,'10/20/1997','11/17/1997','10/23/1997',1,4.98, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10711,N'SAVEA',5,'10/21/1997','12/2/1997','10/29/1997',2,52.41, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10712,N'HUNGO',3,'10/21/1997','11/18/1997','10/31/1997',1,89.93, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10713,N'SAVEA',1,'10/22/1997','11/19/1997','10/24/1997',1,167.05, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10714,N'SAVEA',5,'10/22/1997','11/19/1997','10/27/1997',3,24.49, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10715,N'BONAP',3,'10/23/1997','11/6/1997','10/29/1997',1,63.20, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10716,N'RANCH',4,'10/24/1997','11/21/1997','10/27/1997',2,22.57, + N'Rancho grande',N'Av. del Libertador 900',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10717,N'FRANK',1,'10/24/1997','11/21/1997','10/29/1997',2,59.25, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10718,N'KOENE',1,'10/27/1997','11/24/1997','10/29/1997',3,170.88, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10719,N'LETSS',8,'10/27/1997','11/24/1997','11/5/1997',2,51.44, + N'Let''s Stop N Shop',N'87 Polk St. Suite 5',N'San Francisco', + N'CA',N'94117',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10720,N'QUEDE',8,'10/28/1997','11/11/1997','11/5/1997',2,9.53, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10721,N'QUICK',5,'10/29/1997','11/26/1997','10/31/1997',3,48.92, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10722,N'SAVEA',8,'10/29/1997','12/10/1997','11/4/1997',1,74.58, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10723,N'WHITC',3,'10/30/1997','11/27/1997','11/25/1997',1,21.72, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10724,N'MEREP',8,'10/30/1997','12/11/1997','11/5/1997',2,57.75, + N'Mère Paillarde',N'43 rue St. Laurent',N'Montréal', + N'Québec',N'H1J 1C3',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10725,N'FAMIA',4,'10/31/1997','11/28/1997','11/5/1997',3,10.83, + N'Familia Arquibaldo',N'Rua Orós, 92',N'Sao Paulo', + N'SP',N'05442-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10726,N'EASTC',4,'11/3/1997','11/17/1997','12/5/1997',1,16.56, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10727,N'REGGC',2,'11/3/1997','12/1/1997','12/5/1997',1,89.90, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10728,N'QUEEN',4,'11/4/1997','12/2/1997','11/11/1997',2,58.33, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10729,N'LINOD',8,'11/4/1997','12/16/1997','11/14/1997',3,141.06, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10730,N'BONAP',5,'11/5/1997','12/3/1997','11/14/1997',1,20.12, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10731,N'CHOPS',7,'11/6/1997','12/4/1997','11/14/1997',1,96.65, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10732,N'BONAP',3,'11/6/1997','12/4/1997','11/7/1997',1,16.97, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10733,N'BERGS',1,'11/7/1997','12/5/1997','11/10/1997',3,110.11, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10734,N'GOURL',2,'11/7/1997','12/5/1997','11/12/1997',3,1.63, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10735,N'LETSS',6,'11/10/1997','12/8/1997','11/21/1997',2,45.97, + N'Let''s Stop N Shop',N'87 Polk St. Suite 5',N'San Francisco', + N'CA',N'94117',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10736,N'HUNGO',9,'11/11/1997','12/9/1997','11/21/1997',2,44.10, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10737,N'VINET',2,'11/11/1997','12/9/1997','11/18/1997',2,7.79, + N'Vins et alcools Chevalier',N'59 rue de l''Abbaye',N'Reims', + NULL,N'51100',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10738,N'SPECD',2,'11/12/1997','12/10/1997','11/18/1997',1,2.91, + N'Spécialités du monde',N'25, rue Lauriston',N'Paris', + NULL,N'75016',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10739,N'VINET',3,'11/12/1997','12/10/1997','11/17/1997',3,11.08, + N'Vins et alcools Chevalier',N'59 rue de l''Abbaye',N'Reims', + NULL,N'51100',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10740,N'WHITC',4,'11/13/1997','12/11/1997','11/25/1997',2,81.88, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10741,N'AROUT',4,'11/14/1997','11/28/1997','11/18/1997',3,10.96, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10742,N'BOTTM',3,'11/14/1997','12/12/1997','11/18/1997',3,243.73, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10743,N'AROUT',1,'11/17/1997','12/15/1997','11/21/1997',2,23.72, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10744,N'VAFFE',6,'11/17/1997','12/15/1997','11/24/1997',1,69.19, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10745,N'QUICK',9,'11/18/1997','12/16/1997','11/27/1997',1,3.52, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10746,N'CHOPS',1,'11/19/1997','12/17/1997','11/21/1997',3,31.43, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10747,N'PICCO',6,'11/19/1997','12/17/1997','11/26/1997',1,117.33, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10748,N'SAVEA',3,'11/20/1997','12/18/1997','11/28/1997',1,232.55, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10749,N'ISLAT',4,'11/20/1997','12/18/1997','12/19/1997',2,61.53, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10750,N'WARTH',9,'11/21/1997','12/19/1997','11/24/1997',1,79.30, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10751,N'RICSU',3,'11/24/1997','12/22/1997','12/3/1997',3,130.79, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10752,N'NORTS',2,'11/24/1997','12/22/1997','11/28/1997',3,1.39, + N'North/South',N'South House 300 Queensbridge',N'London', + NULL,N'SW7 1RZ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10753,N'FRANS',3,'11/25/1997','12/23/1997','11/27/1997',1,7.70, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10754,N'MAGAA',6,'11/25/1997','12/23/1997','11/27/1997',3,2.38, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10755,N'BONAP',4,'11/26/1997','12/24/1997','11/28/1997',2,16.71, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10756,N'SPLIR',8,'11/27/1997','12/25/1997','12/2/1997',2,73.21, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10757,N'SAVEA',6,'11/27/1997','12/25/1997','12/15/1997',1,8.19, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10758,N'RICSU',3,'11/28/1997','12/26/1997','12/4/1997',3,138.17, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10759,N'ANATR',3,'11/28/1997','12/26/1997','12/12/1997',3,11.99, + N'Ana Trujillo Emparedados y helados',N'Avda. de la Constitución 2222',N'México D.F.', + NULL,N'05021',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10760,N'MAISD',4,'12/1/1997','12/29/1997','12/10/1997',1,155.64, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10761,N'RATTC',5,'12/2/1997','12/30/1997','12/8/1997',2,18.66, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10762,N'FOLKO',3,'12/2/1997','12/30/1997','12/9/1997',1,328.74, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10763,N'FOLIG',3,'12/3/1997','12/31/1997','12/8/1997',3,37.35, + N'Folies gourmandes',N'184, chaussée de Tournai',N'Lille', + NULL,N'59000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10764,N'ERNSH',6,'12/3/1997','12/31/1997','12/8/1997',3,145.45, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10765,N'QUICK',3,'12/4/1997','1/1/1998','12/9/1997',3,42.74, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10766,N'OTTIK',4,'12/5/1997','1/2/1998','12/9/1997',1,157.55, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10767,N'SUPRD',4,'12/5/1997','1/2/1998','12/15/1997',3,1.59, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10768,N'AROUT',3,'12/8/1997','1/5/1998','12/15/1997',2,146.32, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10769,N'VAFFE',3,'12/8/1997','1/5/1998','12/12/1997',1,65.06, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10770,N'HANAR',8,'12/9/1997','1/6/1998','12/17/1997',3,5.32, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10771,N'ERNSH',9,'12/10/1997','1/7/1998','1/2/1998',2,11.19, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10772,N'LEHMS',3,'12/10/1997','1/7/1998','12/19/1997',2,91.28, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10773,N'ERNSH',1,'12/11/1997','1/8/1998','12/16/1997',3,96.43, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10774,N'FOLKO',4,'12/11/1997','12/25/1997','12/12/1997',1,48.20, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10775,N'THECR',7,'12/12/1997','1/9/1998','12/26/1997',1,20.25, + N'The Cracker Box',N'55 Grizzly Peak Rd.',N'Butte', + N'MT',N'59801',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10776,N'ERNSH',1,'12/15/1997','1/12/1998','12/18/1997',3,351.53, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10777,N'GOURL',7,'12/15/1997','12/29/1997','1/21/1998',2,3.01, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10778,N'BERGS',3,'12/16/1997','1/13/1998','12/24/1997',1,6.79, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10779,N'MORGK',3,'12/16/1997','1/13/1998','1/14/1998',2,58.13, + N'Morgenstern Gesundkost',N'Heerstr. 22',N'Leipzig', + NULL,N'04179',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10780,N'LILAS',2,'12/16/1997','12/30/1997','12/25/1997',1,42.13, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10781,N'WARTH',2,'12/17/1997','1/14/1998','12/19/1997',3,73.16, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10782,N'CACTU',9,'12/17/1997','1/14/1998','12/22/1997',3,1.10, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10783,N'HANAR',4,'12/18/1997','1/15/1998','12/19/1997',2,124.98, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10784,N'MAGAA',4,'12/18/1997','1/15/1998','12/22/1997',3,70.09, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10785,N'GROSR',1,'12/18/1997','1/15/1998','12/24/1997',3,1.51, + N'GROSELLA-Restaurante',N'5ª Ave. Los Palos Grandes',N'Caracas', + N'DF',N'1081',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10786,N'QUEEN',8,'12/19/1997','1/16/1998','12/23/1997',1,110.87, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10787,N'LAMAI',2,'12/19/1997','1/2/1998','12/26/1997',1,249.93, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10788,N'QUICK',1,'12/22/1997','1/19/1998','1/19/1998',2,42.70, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10789,N'FOLIG',1,'12/22/1997','1/19/1998','12/31/1997',2,100.60, + N'Folies gourmandes',N'184, chaussée de Tournai',N'Lille', + NULL,N'59000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10790,N'GOURL',6,'12/22/1997','1/19/1998','12/26/1997',1,28.23, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10791,N'FRANK',6,'12/23/1997','1/20/1998','1/1/1998',2,16.85, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10792,N'WOLZA',1,'12/23/1997','1/20/1998','12/31/1997',3,23.79, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10793,N'AROUT',3,'12/24/1997','1/21/1998','1/8/1998',3,4.52, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10794,N'QUEDE',6,'12/24/1997','1/21/1998','1/2/1998',1,21.49, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10795,N'ERNSH',8,'12/24/1997','1/21/1998','1/20/1998',2,126.66, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10796,N'HILAA',3,'12/25/1997','1/22/1998','1/14/1998',1,26.52, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10797,N'DRACD',7,'12/25/1997','1/22/1998','1/5/1998',2,33.35, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10798,N'ISLAT',2,'12/26/1997','1/23/1998','1/5/1998',1,2.33, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10799,N'KOENE',9,'12/26/1997','2/6/1998','1/5/1998',3,30.76, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10800,N'SEVES',1,'12/26/1997','1/23/1998','1/5/1998',3,137.44, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10801,N'BOLID',4,'12/29/1997','1/26/1998','12/31/1997',2,97.09, + N'Bólido Comidas preparadas',N'C/ Araquil, 67',N'Madrid', + NULL,N'28023',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10802,N'SIMOB',4,'12/29/1997','1/26/1998','1/2/1998',2,257.26, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10803,N'WELLI',4,'12/30/1997','1/27/1998','1/6/1998',1,55.23, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10804,N'SEVES',6,'12/30/1997','1/27/1998','1/7/1998',2,27.33, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10805,N'THEBI',2,'12/30/1997','1/27/1998','1/9/1998',3,237.34, + N'The Big Cheese',N'89 Jefferson Way Suite 2',N'Portland', + N'OR',N'97201',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10806,N'VICTE',3,'12/31/1997','1/28/1998','1/5/1998',2,22.11, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10807,N'FRANS',4,'12/31/1997','1/28/1998','1/30/1998',1,1.36, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10808,N'OLDWO',2,'1/1/1998','1/29/1998','1/9/1998',3,45.53, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10809,N'WELLI',7,'1/1/1998','1/29/1998','1/7/1998',1,4.87, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10810,N'LAUGB',2,'1/1/1998','1/29/1998','1/7/1998',3,4.33, + N'Laughing Bacchus Wine Cellars',N'2319 Elm St.',N'Vancouver', + N'BC',N'V3F 2K1',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10811,N'LINOD',8,'1/2/1998','1/30/1998','1/8/1998',1,31.22, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10812,N'REGGC',5,'1/2/1998','1/30/1998','1/12/1998',1,59.78, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10813,N'RICAR',1,'1/5/1998','2/2/1998','1/9/1998',1,47.38, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10814,N'VICTE',3,'1/5/1998','2/2/1998','1/14/1998',3,130.94, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10815,N'SAVEA',2,'1/5/1998','2/2/1998','1/14/1998',3,14.62, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10816,N'GREAL',4,'1/6/1998','2/3/1998','2/4/1998',2,719.78, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10817,N'KOENE',3,'1/6/1998','1/20/1998','1/13/1998',2,306.07, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10818,N'MAGAA',7,'1/7/1998','2/4/1998','1/12/1998',3,65.48, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10819,N'CACTU',2,'1/7/1998','2/4/1998','1/16/1998',3,19.76, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10820,N'RATTC',3,'1/7/1998','2/4/1998','1/13/1998',2,37.52, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10821,N'SPLIR',1,'1/8/1998','2/5/1998','1/15/1998',1,36.68, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10822,N'TRAIH',6,'1/8/1998','2/5/1998','1/16/1998',3,7.00, + N'Trail''s Head Gourmet Provisioners',N'722 DaVinci Blvd.',N'Kirkland', + N'WA',N'98034',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10823,N'LILAS',5,'1/9/1998','2/6/1998','1/13/1998',2,163.97, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10824,N'FOLKO',8,'1/9/1998','2/6/1998','1/30/1998',1,1.23, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10825,N'DRACD',1,'1/9/1998','2/6/1998','1/14/1998',1,79.25, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10826,N'BLONP',6,'1/12/1998','2/9/1998','2/6/1998',1,7.09, + N'Blondel père et fils',N'24, place Kléber',N'Strasbourg', + NULL,N'67000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10827,N'BONAP',1,'1/12/1998','1/26/1998','2/6/1998',2,63.54, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10828,N'RANCH',9,'1/13/1998','1/27/1998','2/4/1998',1,90.85, + N'Rancho grande',N'Av. del Libertador 900',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10829,N'ISLAT',9,'1/13/1998','2/10/1998','1/23/1998',1,154.72, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10830,N'TRADH',4,'1/13/1998','2/24/1998','1/21/1998',2,81.83, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10831,N'SANTG',3,'1/14/1998','2/11/1998','1/23/1998',2,72.19, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10832,N'LAMAI',2,'1/14/1998','2/11/1998','1/19/1998',2,43.26, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10833,N'OTTIK',6,'1/15/1998','2/12/1998','1/23/1998',2,71.49, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10834,N'TRADH',1,'1/15/1998','2/12/1998','1/19/1998',3,29.78, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10835,N'ALFKI',1,'1/15/1998','2/12/1998','1/21/1998',3,69.53, + N'Alfred''s Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10836,N'ERNSH',7,'1/16/1998','2/13/1998','1/21/1998',1,411.88, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10837,N'BERGS',9,'1/16/1998','2/13/1998','1/23/1998',3,13.32, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10838,N'LINOD',3,'1/19/1998','2/16/1998','1/23/1998',3,59.28, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10839,N'TRADH',3,'1/19/1998','2/16/1998','1/22/1998',3,35.43, + N'Tradiçao Hipermercados',N'Av. Inês de Castro, 414',N'Sao Paulo', + N'SP',N'05634-030',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10840,N'LINOD',4,'1/19/1998','3/2/1998','2/16/1998',2,2.71, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10841,N'SUPRD',5,'1/20/1998','2/17/1998','1/29/1998',2,424.30, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10842,N'TORTU',1,'1/20/1998','2/17/1998','1/29/1998',3,54.42, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10843,N'VICTE',4,'1/21/1998','2/18/1998','1/26/1998',2,9.26, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10844,N'PICCO',8,'1/21/1998','2/18/1998','1/26/1998',2,25.22, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10845,N'QUICK',8,'1/21/1998','2/4/1998','1/30/1998',1,212.98, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10846,N'SUPRD',2,'1/22/1998','3/5/1998','1/23/1998',3,56.46, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10847,N'SAVEA',4,'1/22/1998','2/5/1998','2/10/1998',3,487.57, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10848,N'CONSH',7,'1/23/1998','2/20/1998','1/29/1998',2,38.24, + N'Consolidated Holdings',N'Berkeley Gardens 12 Brewery',N'London', + NULL,N'WX1 6LT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10849,N'KOENE',9,'1/23/1998','2/20/1998','1/30/1998',2,0.56, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10850,N'VICTE',1,'1/23/1998','3/6/1998','1/30/1998',1,49.19, + N'Victuailles en stock',N'2, rue du Commerce',N'Lyon', + NULL,N'69004',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10851,N'RICAR',5,'1/26/1998','2/23/1998','2/2/1998',1,160.55, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10852,N'RATTC',8,'1/26/1998','2/9/1998','1/30/1998',1,174.05, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10853,N'BLAUS',9,'1/27/1998','2/24/1998','2/3/1998',2,53.83, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10854,N'ERNSH',3,'1/27/1998','2/24/1998','2/5/1998',2,100.22, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10855,N'OLDWO',3,'1/27/1998','2/24/1998','2/4/1998',1,170.97, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10856,N'ANTON',3,'1/28/1998','2/25/1998','2/10/1998',2,58.43, + N'Antonio Moreno Taquería',N'Mataderos 2312',N'México D.F.', + NULL,N'05023',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10857,N'BERGS',8,'1/28/1998','2/25/1998','2/6/1998',2,188.85, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10858,N'LACOR',2,'1/29/1998','2/26/1998','2/3/1998',1,52.51, + N'La corne d''abondance',N'67, avenue de l''Europe',N'Versailles', + NULL,N'78000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10859,N'FRANK',1,'1/29/1998','2/26/1998','2/2/1998',2,76.10, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10860,N'FRANR',3,'1/29/1998','2/26/1998','2/4/1998',3,19.26, + N'France restauration',N'54, rue Royale',N'Nantes', + NULL,N'44000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10861,N'WHITC',4,'1/30/1998','2/27/1998','2/17/1998',2,14.93, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10862,N'LEHMS',8,'1/30/1998','3/13/1998','2/2/1998',2,53.23, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10863,N'HILAA',4,'2/2/1998','3/2/1998','2/17/1998',2,30.26, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10864,N'AROUT',4,'2/2/1998','3/2/1998','2/9/1998',2,3.04, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10865,N'QUICK',2,'2/2/1998','2/16/1998','2/12/1998',1,348.14, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10866,N'BERGS',5,'2/3/1998','3/3/1998','2/12/1998',1,109.11, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10867,N'LONEP',6,'2/3/1998','3/17/1998','2/11/1998',1,1.93, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10868,N'QUEEN',7,'2/4/1998','3/4/1998','2/23/1998',2,191.27, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10869,N'SEVES',5,'2/4/1998','3/4/1998','2/9/1998',1,143.28, + N'Seven Seas Imports',N'90 Wadhurst Rd.',N'London', + NULL,N'OX15 4NB',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10870,N'WOLZA',5,'2/4/1998','3/4/1998','2/13/1998',3,12.04, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10871,N'BONAP',9,'2/5/1998','3/5/1998','2/10/1998',2,112.27, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10872,N'GODOS',5,'2/5/1998','3/5/1998','2/9/1998',2,175.32, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10873,N'WILMK',4,'2/6/1998','3/6/1998','2/9/1998',1,0.82, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10874,N'GODOS',5,'2/6/1998','3/6/1998','2/11/1998',2,19.58, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10875,N'BERGS',4,'2/6/1998','3/6/1998','3/3/1998',2,32.37, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10876,N'BONAP',7,'2/9/1998','3/9/1998','2/12/1998',3,60.42, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10877,N'RICAR',1,'2/9/1998','3/9/1998','2/19/1998',1,38.06, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10878,N'QUICK',4,'2/10/1998','3/10/1998','2/12/1998',1,46.69, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10879,N'WILMK',3,'2/10/1998','3/10/1998','2/12/1998',3,8.50, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10880,N'FOLKO',7,'2/10/1998','3/24/1998','2/18/1998',1,88.01, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10881,N'CACTU',4,'2/11/1998','3/11/1998','2/18/1998',1,2.84, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10882,N'SAVEA',4,'2/11/1998','3/11/1998','2/20/1998',3,23.10, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10883,N'LONEP',8,'2/12/1998','3/12/1998','2/20/1998',3,0.53, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10884,N'LETSS',4,'2/12/1998','3/12/1998','2/13/1998',2,90.97, + N'Let''s Stop N Shop',N'87 Polk St. Suite 5',N'San Francisco', + N'CA',N'94117',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10885,N'SUPRD',6,'2/12/1998','3/12/1998','2/18/1998',3,5.64, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10886,N'HANAR',1,'2/13/1998','3/13/1998','3/2/1998',1,4.99, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10887,N'GALED',8,'2/13/1998','3/13/1998','2/16/1998',3,1.25, + N'Galería del gastronómo',N'Rambla de Cataluña, 23',N'Barcelona', + NULL,N'8022',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10888,N'GODOS',1,'2/16/1998','3/16/1998','2/23/1998',2,51.87, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10889,N'RATTC',9,'2/16/1998','3/16/1998','2/23/1998',3,280.61, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10890,N'DUMON',7,'2/16/1998','3/16/1998','2/18/1998',1,32.76, + N'Du monde entier',N'67, rue des Cinquante Otages',N'Nantes', + NULL,N'44000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10891,N'LEHMS',7,'2/17/1998','3/17/1998','2/19/1998',2,20.37, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10892,N'MAISD',4,'2/17/1998','3/17/1998','2/19/1998',2,120.27, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10893,N'KOENE',9,'2/18/1998','3/18/1998','2/20/1998',2,77.78, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10894,N'SAVEA',1,'2/18/1998','3/18/1998','2/20/1998',1,116.13, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10895,N'ERNSH',3,'2/18/1998','3/18/1998','2/23/1998',1,162.75, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10896,N'MAISD',7,'2/19/1998','3/19/1998','2/27/1998',3,32.45, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10897,N'HUNGO',3,'2/19/1998','3/19/1998','2/25/1998',2,603.54, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10898,N'OCEAN',4,'2/20/1998','3/20/1998','3/6/1998',2,1.27, + N'Océano Atlántico Ltda.',N'Ing. Gustavo Moncada 8585 Piso 20-A',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10899,N'LILAS',5,'2/20/1998','3/20/1998','2/26/1998',3,1.21, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10900,N'WELLI',1,'2/20/1998','3/20/1998','3/4/1998',2,1.66, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10901,N'HILAA',4,'2/23/1998','3/23/1998','2/26/1998',1,62.09, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10902,N'FOLKO',1,'2/23/1998','3/23/1998','3/3/1998',1,44.15, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10903,N'HANAR',3,'2/24/1998','3/24/1998','3/4/1998',3,36.71, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10904,N'WHITC',3,'2/24/1998','3/24/1998','2/27/1998',3,162.95, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10905,N'WELLI',9,'2/24/1998','3/24/1998','3/6/1998',2,13.72, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10906,N'WOLZA',4,'2/25/1998','3/11/1998','3/3/1998',3,26.29, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10907,N'SPECD',6,'2/25/1998','3/25/1998','2/27/1998',3,9.19, + N'Spécialités du monde',N'25, rue Lauriston',N'Paris', + NULL,N'75016',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10908,N'REGGC',4,'2/26/1998','3/26/1998','3/6/1998',2,32.96, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10909,N'SANTG',1,'2/26/1998','3/26/1998','3/10/1998',2,53.05, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10910,N'WILMK',1,'2/26/1998','3/26/1998','3/4/1998',3,38.11, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10911,N'GODOS',3,'2/26/1998','3/26/1998','3/5/1998',1,38.19, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10912,N'HUNGO',2,'2/26/1998','3/26/1998','3/18/1998',2,580.91, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10913,N'QUEEN',4,'2/26/1998','3/26/1998','3/4/1998',1,33.05, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10914,N'QUEEN',6,'2/27/1998','3/27/1998','3/2/1998',1,21.19, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10915,N'TORTU',2,'2/27/1998','3/27/1998','3/2/1998',2,3.51, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10916,N'RANCH',1,'2/27/1998','3/27/1998','3/9/1998',2,63.77, + N'Rancho grande',N'Av. del Libertador 900',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10917,N'ROMEY',4,'3/2/1998','3/30/1998','3/11/1998',2,8.29, + N'Romero y tomillo',N'Gran Vía, 1',N'Madrid', + NULL,N'28001',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10918,N'BOTTM',3,'3/2/1998','3/30/1998','3/11/1998',3,48.83, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10919,N'LINOD',2,'3/2/1998','3/30/1998','3/4/1998',2,19.80, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10920,N'AROUT',4,'3/3/1998','3/31/1998','3/9/1998',2,29.61, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10921,N'VAFFE',1,'3/3/1998','4/14/1998','3/9/1998',1,176.48, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10922,N'HANAR',5,'3/3/1998','3/31/1998','3/5/1998',3,62.74, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10923,N'LAMAI',7,'3/3/1998','4/14/1998','3/13/1998',3,68.26, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10924,N'BERGS',3,'3/4/1998','4/1/1998','4/8/1998',2,151.52, + N'Berglunds snabbköp',N'Berguvsvägen 8',N'Luleå', + NULL,N'S-958 22',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10925,N'HANAR',3,'3/4/1998','4/1/1998','3/13/1998',1,2.27, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10926,N'ANATR',4,'3/4/1998','4/1/1998','3/11/1998',3,39.92, + N'Ana Trujillo Emparedados y helados',N'Avda. de la Constitución 2222',N'México D.F.', + NULL,N'05021',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10927,N'LACOR',4,'3/5/1998','4/2/1998','4/8/1998',1,19.79, + N'La corne d''abondance',N'67, avenue de l''Europe',N'Versailles', + NULL,N'78000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10928,N'GALED',1,'3/5/1998','4/2/1998','3/18/1998',1,1.36, + N'Galería del gastronómo',N'Rambla de Cataluña, 23',N'Barcelona', + NULL,N'8022',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10929,N'FRANK',6,'3/5/1998','4/2/1998','3/12/1998',1,33.93, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10930,N'SUPRD',4,'3/6/1998','4/17/1998','3/18/1998',3,15.55, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10931,N'RICSU',4,'3/6/1998','3/20/1998','3/19/1998',2,13.60, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10932,N'BONAP',8,'3/6/1998','4/3/1998','3/24/1998',1,134.64, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10933,N'ISLAT',6,'3/6/1998','4/3/1998','3/16/1998',3,54.15, + N'Island Trading',N'Garden House Crowther Way',N'Cowes', + N'Isle of Wight',N'PO31 7PJ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10934,N'LEHMS',3,'3/9/1998','4/6/1998','3/12/1998',3,32.01, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10935,N'WELLI',4,'3/9/1998','4/6/1998','3/18/1998',3,47.59, + N'Wellington Importadora',N'Rua do Mercado, 12',N'Resende', + N'SP',N'08737-363',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10936,N'GREAL',3,'3/9/1998','4/6/1998','3/18/1998',2,33.68, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10937,N'CACTU',7,'3/10/1998','3/24/1998','3/13/1998',3,31.51, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10938,N'QUICK',3,'3/10/1998','4/7/1998','3/16/1998',2,31.89, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10939,N'MAGAA',2,'3/10/1998','4/7/1998','3/13/1998',2,76.33, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10940,N'BONAP',8,'3/11/1998','4/8/1998','3/23/1998',3,19.77, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10941,N'SAVEA',7,'3/11/1998','4/8/1998','3/20/1998',2,400.81, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10942,N'REGGC',9,'3/11/1998','4/8/1998','3/18/1998',3,17.95, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10943,N'BSBEV',4,'3/11/1998','4/8/1998','3/19/1998',2,2.17, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10944,N'BOTTM',6,'3/12/1998','3/26/1998','3/13/1998',3,52.92, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10945,N'MORGK',4,'3/12/1998','4/9/1998','3/18/1998',1,10.22, + N'Morgenstern Gesundkost',N'Heerstr. 22',N'Leipzig', + NULL,N'04179',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10946,N'VAFFE',1,'3/12/1998','4/9/1998','3/19/1998',2,27.20, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10947,N'BSBEV',3,'3/13/1998','4/10/1998','3/16/1998',2,3.26, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10948,N'GODOS',3,'3/13/1998','4/10/1998','3/19/1998',3,23.39, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10949,N'BOTTM',2,'3/13/1998','4/10/1998','3/17/1998',3,74.44, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10950,N'MAGAA',1,'3/16/1998','4/13/1998','3/23/1998',2,2.50, + N'Magazzini Alimentari Riuniti',N'Via Ludovico il Moro 22',N'Bergamo', + NULL,N'24100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10951,N'RICSU',9,'3/16/1998','4/27/1998','4/7/1998',2,30.85, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10952,N'ALFKI',1,'3/16/1998','4/27/1998','3/24/1998',1,40.42, + N'Alfred''s Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10953,N'AROUT',9,'3/16/1998','3/30/1998','3/25/1998',2,23.72, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10954,N'LINOD',5,'3/17/1998','4/28/1998','3/20/1998',1,27.91, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10955,N'FOLKO',8,'3/17/1998','4/14/1998','3/20/1998',2,3.26, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10956,N'BLAUS',6,'3/17/1998','4/28/1998','3/20/1998',2,44.65, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10957,N'HILAA',8,'3/18/1998','4/15/1998','3/27/1998',3,105.36, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10958,N'OCEAN',7,'3/18/1998','4/15/1998','3/27/1998',2,49.56, + N'Océano Atlántico Ltda.',N'Ing. Gustavo Moncada 8585 Piso 20-A',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10959,N'GOURL',6,'3/18/1998','4/29/1998','3/23/1998',2,4.98, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10960,N'HILAA',3,'3/19/1998','4/2/1998','4/8/1998',1,2.08, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10961,N'QUEEN',8,'3/19/1998','4/16/1998','3/30/1998',1,104.47, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10962,N'QUICK',8,'3/19/1998','4/16/1998','3/23/1998',2,275.79, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10963,N'FURIB',9,'3/19/1998','4/16/1998','3/26/1998',3,2.70, + N'Furia Bacalhau e Frutos do Mar',N'Jardim das rosas n. 32',N'Lisboa', + NULL,N'1675',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10964,N'SPECD',3,'3/20/1998','4/17/1998','3/24/1998',2,87.38, + N'Spécialités du monde',N'25, rue Lauriston',N'Paris', + NULL,N'75016',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10965,N'OLDWO',6,'3/20/1998','4/17/1998','3/30/1998',3,144.38, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10966,N'CHOPS',4,'3/20/1998','4/17/1998','4/8/1998',1,27.19, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10967,N'TOMSP',2,'3/23/1998','4/20/1998','4/2/1998',2,62.22, + N'Toms Spezialitäten',N'Luisenstr. 48',N'Münster', + NULL,N'44087',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10968,N'ERNSH',1,'3/23/1998','4/20/1998','4/1/1998',3,74.60, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10969,N'COMMI',1,'3/23/1998','4/20/1998','3/30/1998',2,0.21, + N'Comércio Mineiro',N'Av. dos Lusíadas, 23',N'Sao Paulo', + N'SP',N'05432-043',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10970,N'BOLID',9,'3/24/1998','4/7/1998','4/24/1998',1,16.16, + N'Bólido Comidas preparadas',N'C/ Araquil, 67',N'Madrid', + NULL,N'28023',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10971,N'FRANR',2,'3/24/1998','4/21/1998','4/2/1998',2,121.82, + N'France restauration',N'54, rue Royale',N'Nantes', + NULL,N'44000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10972,N'LACOR',4,'3/24/1998','4/21/1998','3/26/1998',2,0.02, + N'La corne d''abondance',N'67, avenue de l''Europe',N'Versailles', + NULL,N'78000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10973,N'LACOR',6,'3/24/1998','4/21/1998','3/27/1998',2,15.17, + N'La corne d''abondance',N'67, avenue de l''Europe',N'Versailles', + NULL,N'78000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10974,N'SPLIR',3,'3/25/1998','4/8/1998','4/3/1998',3,12.96, + N'Split Rail Beer & Ale',N'P.O. Box 555',N'Lander', + N'WY',N'82520',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10975,N'BOTTM',1,'3/25/1998','4/22/1998','3/27/1998',3,32.27, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10976,N'HILAA',1,'3/25/1998','5/6/1998','4/3/1998',1,37.97, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10977,N'FOLKO',8,'3/26/1998','4/23/1998','4/10/1998',3,208.50, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10978,N'MAISD',9,'3/26/1998','4/23/1998','4/23/1998',2,32.82, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10979,N'ERNSH',8,'3/26/1998','4/23/1998','3/31/1998',2,353.07, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10980,N'FOLKO',4,'3/27/1998','5/8/1998','4/17/1998',1,1.26, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10981,N'HANAR',1,'3/27/1998','4/24/1998','4/2/1998',2,193.37, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10982,N'BOTTM',2,'3/27/1998','4/24/1998','4/8/1998',1,14.01, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10983,N'SAVEA',2,'3/27/1998','4/24/1998','4/6/1998',2,657.54, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10984,N'SAVEA',1,'3/30/1998','4/27/1998','4/3/1998',3,211.22, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10985,N'HUNGO',2,'3/30/1998','4/27/1998','4/2/1998',1,91.51, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10986,N'OCEAN',8,'3/30/1998','4/27/1998','4/21/1998',2,217.86, + N'Océano Atlántico Ltda.',N'Ing. Gustavo Moncada 8585 Piso 20-A',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10987,N'EASTC',8,'3/31/1998','4/28/1998','4/6/1998',1,185.48, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10988,N'RATTC',3,'3/31/1998','4/28/1998','4/10/1998',2,61.14, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10989,N'QUEDE',2,'3/31/1998','4/28/1998','4/2/1998',1,34.76, + N'Que Delícia',N'Rua da Panificadora, 12',N'Rio de Janeiro', + N'RJ',N'02389-673',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10990,N'ERNSH',2,'4/1/1998','5/13/1998','4/7/1998',3,117.61, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10991,N'QUICK',1,'4/1/1998','4/29/1998','4/7/1998',1,38.51, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10992,N'THEBI',1,'4/1/1998','4/29/1998','4/3/1998',3,4.27, + N'The Big Cheese',N'89 Jefferson Way Suite 2',N'Portland', + N'OR',N'97201',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10993,N'FOLKO',7,'4/1/1998','4/29/1998','4/10/1998',3,8.81, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10994,N'VAFFE',2,'4/2/1998','4/16/1998','4/9/1998',3,65.53, + N'Vaffeljernet',N'Smagsloget 45',N'Århus', + NULL,N'8200',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10995,N'PERIC',1,'4/2/1998','4/30/1998','4/6/1998',3,46.00, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10996,N'QUICK',4,'4/2/1998','4/30/1998','4/10/1998',2,1.12, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10997,N'LILAS',8,'4/3/1998','5/15/1998','4/13/1998',2,73.91, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10998,N'WOLZA',8,'4/3/1998','4/17/1998','4/17/1998',2,20.31, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (10999,N'OTTIK',6,'4/3/1998','5/1/1998','4/10/1998',2,96.35, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11000,N'RATTC',2,'4/6/1998','5/4/1998','4/14/1998',3,55.12, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11001,N'FOLKO',2,'4/6/1998','5/4/1998','4/14/1998',2,197.30, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11002,N'SAVEA',4,'4/6/1998','5/4/1998','4/16/1998',1,141.16, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11003,N'THECR',3,'4/6/1998','5/4/1998','4/8/1998',3,14.91, + N'The Cracker Box',N'55 Grizzly Peak Rd.',N'Butte', + N'MT',N'59801',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11004,N'MAISD',3,'4/7/1998','5/5/1998','4/20/1998',1,44.84, + N'Maison Dewey',N'Rue Joseph-Bens 532',N'Bruxelles', + NULL,N'B-1180',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11005,N'WILMK',2,'4/7/1998','5/5/1998','4/10/1998',1,0.75, + N'Wilman Kala',N'Keskuskatu 45',N'Helsinki', + NULL,N'21240',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11006,N'GREAL',3,'4/7/1998','5/5/1998','4/15/1998',2,25.19, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11007,N'PRINI',8,'4/8/1998','5/6/1998','4/13/1998',2,202.24, + N'Princesa Isabel Vinhos',N'Estrada da saúde n. 58',N'Lisboa', + NULL,N'1756',N'Portugal') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11008,N'ERNSH',7,'4/8/1998','5/6/1998',NULL,3,79.46, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11009,N'GODOS',2,'4/8/1998','5/6/1998','4/10/1998',1,59.11, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11010,N'REGGC',2,'4/9/1998','5/7/1998','4/21/1998',2,28.71, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11011,N'ALFKI',3,'4/9/1998','5/7/1998','4/13/1998',1,1.21, + N'Alfred''s Futterkiste',N'Obere Str. 57',N'Berlin', + NULL,N'12209',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11012,N'FRANK',1,'4/9/1998','4/23/1998','4/17/1998',3,242.95, + N'Frankenversand',N'Berliner Platz 43',N'München', + NULL,N'80805',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11013,N'ROMEY',2,'4/9/1998','5/7/1998','4/10/1998',1,32.99, + N'Romero y tomillo',N'Gran Vía, 1',N'Madrid', + NULL,N'28001',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11014,N'LINOD',2,'4/10/1998','5/8/1998','4/15/1998',3,23.60, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11015,N'SANTG',2,'4/10/1998','4/24/1998','4/20/1998',2,4.62, + N'Santé Gourmet',N'Erling Skakkes gate 78',N'Stavern', + NULL,N'4110',N'Norway') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11016,N'AROUT',9,'4/10/1998','5/8/1998','4/13/1998',2,33.80, + N'Around the Horn',N'Brook Farm Stratford St. Mary',N'Colchester', + N'Essex',N'CO7 6JX',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11017,N'ERNSH',9,'4/13/1998','5/11/1998','4/20/1998',2,754.26, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11018,N'LONEP',4,'4/13/1998','5/11/1998','4/16/1998',2,11.65, + N'Lonesome Pine Restaurant',N'89 Chiaroscuro Rd.',N'Portland', + N'OR',N'97219',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11019,N'RANCH',6,'4/13/1998','5/11/1998',NULL,3,3.17, + N'Rancho grande',N'Av. del Libertador 900',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11020,N'OTTIK',2,'4/14/1998','5/12/1998','4/16/1998',2,43.30, + N'Ottilies Käseladen',N'Mehrheimerstr. 369',N'Köln', + NULL,N'50739',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11021,N'QUICK',3,'4/14/1998','5/12/1998','4/21/1998',1,297.18, + N'QUICK-Stop',N'Taucherstraße 10',N'Cunewalde', + NULL,N'01307',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11022,N'HANAR',9,'4/14/1998','5/12/1998','5/4/1998',2,6.27, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11023,N'BSBEV',1,'4/14/1998','4/28/1998','4/24/1998',2,123.83, + N'B''s Beverages',N'Fauntleroy Circus',N'London', + NULL,N'EC2 5NT',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11024,N'EASTC',4,'4/15/1998','5/13/1998','4/20/1998',1,74.36, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11025,N'WARTH',6,'4/15/1998','5/13/1998','4/24/1998',3,29.17, + N'Wartian Herkku',N'Torikatu 38',N'Oulu', + NULL,N'90110',N'Finland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11026,N'FRANS',4,'4/15/1998','5/13/1998','4/28/1998',1,47.09, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11027,N'BOTTM',1,'4/16/1998','5/14/1998','4/20/1998',1,52.52, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11028,N'KOENE',2,'4/16/1998','5/14/1998','4/22/1998',1,29.59, + N'Königlich Essen',N'Maubelstr. 90',N'Brandenburg', + NULL,N'14776',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11029,N'CHOPS',4,'4/16/1998','5/14/1998','4/27/1998',1,47.84, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11030,N'SAVEA',7,'4/17/1998','5/15/1998','4/27/1998',2,830.75, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11031,N'SAVEA',6,'4/17/1998','5/15/1998','4/24/1998',2,227.22, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11032,N'WHITC',2,'4/17/1998','5/15/1998','4/23/1998',3,606.19, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11033,N'RICSU',7,'4/17/1998','5/15/1998','4/23/1998',3,84.74, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11034,N'OLDWO',8,'4/20/1998','6/1/1998','4/27/1998',1,40.32, + N'Old World Delicatessen',N'2743 Bering St.',N'Anchorage', + N'AK',N'99508',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11035,N'SUPRD',2,'4/20/1998','5/18/1998','4/24/1998',2,0.17, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11036,N'DRACD',8,'4/20/1998','5/18/1998','4/22/1998',3,149.47, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11037,N'GODOS',7,'4/21/1998','5/19/1998','4/27/1998',1,3.20, + N'Godos Cocina Típica',N'C/ Romero, 33',N'Sevilla', + NULL,N'41101',N'Spain') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11038,N'SUPRD',1,'4/21/1998','5/19/1998','4/30/1998',2,29.59, + N'Suprêmes délices',N'Boulevard Tirou, 255',N'Charleroi', + NULL,N'B-6000',N'Belgium') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11039,N'LINOD',1,'4/21/1998','5/19/1998',NULL,2,65.00, + N'LINO-Delicateses',N'Ave. 5 de Mayo Porlamar',N'I. de Margarita', + N'Nueva Esparta',N'4980',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11040,N'GREAL',4,'4/22/1998','5/20/1998',NULL,3,18.84, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11041,N'CHOPS',3,'4/22/1998','5/20/1998','4/28/1998',2,48.22, + N'Chop-suey Chinese',N'Hauptstr. 31',N'Bern', + NULL,N'3012',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11042,N'COMMI',2,'4/22/1998','5/6/1998','5/1/1998',1,29.99, + N'Comércio Mineiro',N'Av. dos Lusíadas, 23',N'Sao Paulo', + N'SP',N'05432-043',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11043,N'SPECD',5,'4/22/1998','5/20/1998','4/29/1998',2,8.80, + N'Spécialités du monde',N'25, rue Lauriston',N'Paris', + NULL,N'75016',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11044,N'WOLZA',4,'4/23/1998','5/21/1998','5/1/1998',1,8.72, + N'Wolski Zajazd',N'ul. Filtrowa 68',N'Warszawa', + NULL,N'01-012',N'Poland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11045,N'BOTTM',6,'4/23/1998','5/21/1998',NULL,2,70.58, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11046,N'WANDK',8,'4/23/1998','5/21/1998','4/24/1998',2,71.64, + N'Die Wandernde Kuh',N'Adenauerallee 900',N'Stuttgart', + NULL,N'70563',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11047,N'EASTC',7,'4/24/1998','5/22/1998','5/1/1998',3,46.62, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11048,N'BOTTM',7,'4/24/1998','5/22/1998','4/30/1998',3,24.12, + N'Bottom-Dollar Markets',N'23 Tsawassen Blvd.',N'Tsawassen', + N'BC',N'T2F 8M4',N'Canada') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11049,N'GOURL',3,'4/24/1998','5/22/1998','5/4/1998',1,8.34, + N'Gourmet Lanchonetes',N'Av. Brasil, 442',N'Campinas', + N'SP',N'04876-786',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11050,N'FOLKO',8,'4/27/1998','5/25/1998','5/5/1998',2,59.41, + N'Folk och fä HB',N'Åkergatan 24',N'Bräcke', + NULL,N'S-844 67',N'Sweden') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11051,N'LAMAI',7,'4/27/1998','5/25/1998',NULL,3,2.79, + N'La maison d''Asie',N'1 rue Alsace-Lorraine',N'Toulouse', + NULL,N'31000',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11052,N'HANAR',3,'4/27/1998','5/25/1998','5/1/1998',1,67.26, + N'Hanari Carnes',N'Rua do Paço, 67',N'Rio de Janeiro', + N'RJ',N'05454-876',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11053,N'PICCO',2,'4/27/1998','5/25/1998','4/29/1998',2,53.05, + N'Piccolo und mehr',N'Geislweg 14',N'Salzburg', + NULL,N'5020',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11054,N'CACTU',8,'4/28/1998','5/26/1998',NULL,1,0.33, + N'Cactus Comidas para llevar',N'Cerrito 333',N'Buenos Aires', + NULL,N'1010',N'Argentina') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11055,N'HILAA',7,'4/28/1998','5/26/1998','5/5/1998',2,120.92, + N'HILARION-Abastos',N'Carrera 22 con Ave. Carlos Soublette #8-35',N'San Cristóbal', + N'Táchira',N'5022',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11056,N'EASTC',8,'4/28/1998','5/12/1998','5/1/1998',2,278.96, + N'Eastern Connection',N'35 King George',N'London', + NULL,N'WX3 6FW',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11057,N'NORTS',3,'4/29/1998','5/27/1998','5/1/1998',3,4.13, + N'North/South',N'South House 300 Queensbridge',N'London', + NULL,N'SW7 1RZ',N'UK') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11058,N'BLAUS',9,'4/29/1998','5/27/1998',NULL,3,31.14, + N'Blauer See Delikatessen',N'Forsterstr. 57',N'Mannheim', + NULL,N'68306',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11059,N'RICAR',2,'4/29/1998','6/10/1998',NULL,2,85.80, + N'Ricardo Adocicados',N'Av. Copacabana, 267',N'Rio de Janeiro', + N'RJ',N'02389-890',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11060,N'FRANS',2,'4/30/1998','5/28/1998','5/4/1998',2,10.98, + N'Franchi S.p.A.',N'Via Monte Bianco 34',N'Torino', + NULL,N'10100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11061,N'GREAL',4,'4/30/1998','6/11/1998',NULL,3,14.01, + N'Great Lakes Food Market',N'2732 Baker Blvd.',N'Eugene', + N'OR',N'97403',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11062,N'REGGC',4,'4/30/1998','5/28/1998',NULL,2,29.93, + N'Reggiani Caseifici',N'Strada Provinciale 124',N'Reggio Emilia', + NULL,N'42100',N'Italy') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11063,N'HUNGO',3,'4/30/1998','5/28/1998','5/6/1998',2,81.73, + N'Hungry Owl All-Night Grocers',N'8 Johnstown Road',N'Cork', + N'Co. Cork',NULL,N'Ireland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11064,N'SAVEA',1,'5/1/1998','5/29/1998','5/4/1998',1,30.09, + N'Save-a-lot Markets',N'187 Suffolk Ln.',N'Boise', + N'ID',N'83720',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11065,N'LILAS',8,'5/1/1998','5/29/1998',NULL,1,12.91, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11066,N'WHITC',7,'5/1/1998','5/29/1998','5/4/1998',2,44.72, + N'White Clover Markets',N'1029 - 12th Ave. S.',N'Seattle', + N'WA',N'98124',N'USA') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11067,N'DRACD',1,'5/4/1998','5/18/1998','5/6/1998',2,7.98, + N'Drachenblut Delikatessen',N'Walserweg 21',N'Aachen', + NULL,N'52066',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11068,N'QUEEN',8,'5/4/1998','6/1/1998',NULL,2,81.75, + N'Queen Cozinha',N'Alameda dos Canàrios, 891',N'Sao Paulo', + N'SP',N'05487-020',N'Brazil') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11069,N'TORTU',1,'5/4/1998','6/1/1998','5/6/1998',2,15.67, + N'Tortuga Restaurante',N'Avda. Azteca 123',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11070,N'LEHMS',2,'5/5/1998','6/2/1998',NULL,1,136.00, + N'Lehmanns Marktstand',N'Magazinweg 7',N'Frankfurt a.M.', + NULL,N'60528',N'Germany') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11071,N'LILAS',1,'5/5/1998','6/2/1998',NULL,1,0.93, + N'LILA-Supermercado',N'Carrera 52 con Ave. Bolívar #65-98 Llano Largo',N'Barquisimeto', + N'Lara',N'3508',N'Venezuela') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11072,N'ERNSH',4,'5/5/1998','6/2/1998',NULL,2,258.64, + N'Ernst Handel',N'Kirchgasse 6',N'Graz', + NULL,N'8010',N'Austria') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11073,N'PERIC',2,'5/5/1998','6/2/1998',NULL,2,24.95, + N'Pericles Comidas clásicas',N'Calle Dr. Jorge Cash 321',N'México D.F.', + NULL,N'05033',N'Mexico') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11074,N'SIMOB',7,'5/6/1998','6/3/1998',NULL,2,18.44, + N'Simons bistro',N'Vinbæltet 34',N'Kobenhavn', + NULL,N'1734',N'Denmark') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11075,N'RICSU',8,'5/6/1998','6/3/1998',NULL,2,6.19, + N'Richter Supermarkt',N'Starenweg 5',N'Genève', + NULL,N'1204',N'Switzerland') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11076,N'BONAP',4,'5/6/1998','6/3/1998',NULL,2,38.28, + N'Bon app''',N'12, rue des Bouchers',N'Marseille', + NULL,N'13008',N'France') +INSERT INTO "Orders" +("OrderID","CustomerID","EmployeeID","OrderDate","RequiredDate", + "ShippedDate","ShipVia","Freight","ShipName","ShipAddress", + "ShipCity","ShipRegion","ShipPostalCode","ShipCountry") +VALUES (11077,N'RATTC',1,'5/6/1998','6/3/1998',NULL,2,8.53, + N'Rattlesnake Canyon Grocery',N'2817 Milton Dr.',N'Albuquerque', + N'NM',N'87110',N'USA') +go +set identity_insert "Orders" off +go +ALTER TABLE "Orders" CHECK CONSTRAINT ALL +go +set quoted_identifier on +go +set identity_insert "Products" on +go +ALTER TABLE "Products" NOCHECK CONSTRAINT ALL +go +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(1,'Chai',1,1,'10 boxes x 20 bags',18,39,0,10,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(2,'Chang',1,1,'24 - 12 oz bottles',19,17,40,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(3,'Aniseed Syrup',1,2,'12 - 550 ml bottles',10,13,70,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(4,'Chef Anton''s Cajun Seasoning',2,2,'48 - 6 oz jars',22,53,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(5,'Chef Anton''s Gumbo Mix',2,2,'36 boxes',21.35,0,0,0,1) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(6,'Grandma''s Boysenberry Spread',3,2,'12 - 8 oz jars',25,120,0,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(7,'Uncle Bob''s Organic Dried Pears',3,7,'12 - 1 lb pkgs.',30,15,0,10,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(8,'Northwoods Cranberry Sauce',3,2,'12 - 12 oz jars',40,6,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(9,'Mishi Kobe Niku',4,6,'18 - 500 g pkgs.',97,29,0,0,1) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(10,'Ikura',4,8,'12 - 200 ml jars',31,31,0,0,0) +go +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(11,'Queso Cabrales',5,4,'1 kg pkg.',21,22,30,30,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(12,'Queso Manchego La Pastora',5,4,'10 - 500 g pkgs.',38,86,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(13,'Konbu',6,8,'2 kg box',6,24,0,5,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(14,'Tofu',6,7,'40 - 100 g pkgs.',23.25,35,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(15,'Genen Shouyu',6,2,'24 - 250 ml bottles',15.5,39,0,5,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(16,'Pavlova',7,3,'32 - 500 g boxes',17.45,29,0,10,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(17,'Alice Mutton',7,6,'20 - 1 kg tins',39,0,0,0,1) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(18,'Carnarvon Tigers',7,8,'16 kg pkg.',62.5,42,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(19,'Teatime Chocolate Biscuits',8,3,'10 boxes x 12 pieces',9.2,25,0,5,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(20,'Sir Rodney''s Marmalade',8,3,'30 gift boxes',81,40,0,0,0) +go +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(21,'Sir Rodney''s Scones',8,3,'24 pkgs. x 4 pieces',10,3,40,5,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(22,'Gustaf''s Knäckebröd',9,5,'24 - 500 g pkgs.',21,104,0,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(23,'Tunnbröd',9,5,'12 - 250 g pkgs.',9,61,0,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(24,'Guaraná Fantástica',10,1,'12 - 355 ml cans',4.5,20,0,0,1) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(25,'NuNuCa Nuß-Nougat-Creme',11,3,'20 - 450 g glasses',14,76,0,30,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(26,'Gumbär Gummibärchen',11,3,'100 - 250 g bags',31.23,15,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(27,'Schoggi Schokolade',11,3,'100 - 100 g pieces',43.9,49,0,30,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(28,'Rössle Sauerkraut',12,7,'25 - 825 g cans',45.6,26,0,0,1) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(29,'Thüringer Rostbratwurst',12,6,'50 bags x 30 sausgs.',123.79,0,0,0,1) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(30,'Nord-Ost Matjeshering',13,8,'10 - 200 g glasses',25.89,10,0,15,0) +go +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(31,'Gorgonzola Telino',14,4,'12 - 100 g pkgs',12.5,0,70,20,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(32,'Mascarpone Fabioli',14,4,'24 - 200 g pkgs.',32,9,40,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(33,'Geitost',15,4,'500 g',2.5,112,0,20,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(34,'Sasquatch Ale',16,1,'24 - 12 oz bottles',14,111,0,15,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(35,'Steeleye Stout',16,1,'24 - 12 oz bottles',18,20,0,15,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(36,'Inlagd Sill',17,8,'24 - 250 g jars',19,112,0,20,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(37,'Gravad lax',17,8,'12 - 500 g pkgs.',26,11,50,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(38,'Côte de Blaye',18,1,'12 - 75 cl bottles',263.5,17,0,15,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(39,'Chartreuse verte',18,1,'750 cc per bottle',18,69,0,5,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(40,'Boston Crab Meat',19,8,'24 - 4 oz tins',18.4,123,0,30,0) +go +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(41,'Jack''s New England Clam Chowder',19,8,'12 - 12 oz cans',9.65,85,0,10,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(42,'Singaporean Hokkien Fried Mee',20,5,'32 - 1 kg pkgs.',14,26,0,0,1) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(43,'Ipoh Coffee',20,1,'16 - 500 g tins',46,17,10,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(44,'Gula Malacca',20,2,'20 - 2 kg bags',19.45,27,0,15,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(45,'Rogede sild',21,8,'1k pkg.',9.5,5,70,15,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(46,'Spegesild',21,8,'4 - 450 g glasses',12,95,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(47,'Zaanse koeken',22,3,'10 - 4 oz boxes',9.5,36,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(48,'Chocolade',22,3,'10 pkgs.',12.75,15,70,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(49,'Maxilaku',23,3,'24 - 50 g pkgs.',20,10,60,15,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(50,'Valkoinen suklaa',23,3,'12 - 100 g bars',16.25,65,0,30,0) +go +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(51,'Manjimup Dried Apples',24,7,'50 - 300 g pkgs.',53,20,0,10,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(52,'Filo Mix',24,5,'16 - 2 kg boxes',7,38,0,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(53,'Perth Pasties',24,6,'48 pieces',32.8,0,0,0,1) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(54,'Tourtière',25,6,'16 pies',7.45,21,0,10,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(55,'Pâté chinois',25,6,'24 boxes x 2 pies',24,115,0,20,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(56,'Gnocchi di nonna Alice',26,5,'24 - 250 g pkgs.',38,21,10,30,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(57,'Ravioli Angelo',26,5,'24 - 250 g pkgs.',19.5,36,0,20,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(58,'Escargots de Bourgogne',27,8,'24 pieces',13.25,62,0,20,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(59,'Raclette Courdavault',28,4,'5 kg pkg.',55,79,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(60,'Camembert Pierrot',28,4,'15 - 300 g rounds',34,19,0,0,0) +go +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(61,'Sirop d''érable',29,2,'24 - 500 ml bottles',28.5,113,0,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(62,'Tarte au sucre',29,3,'48 pies',49.3,17,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(63,'Vegie-spread',7,2,'15 - 625 g jars',43.9,24,0,5,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(64,'Wimmers gute Semmelknödel',12,5,'20 bags x 4 pieces',33.25,22,80,30,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(65,'Louisiana Fiery Hot Pepper Sauce',2,2,'32 - 8 oz bottles',21.05,76,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(66,'Louisiana Hot Spiced Okra',2,2,'24 - 8 oz jars',17,4,100,20,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(67,'Laughing Lumberjack Lager',16,1,'24 - 12 oz bottles',14,52,0,10,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(68,'Scottish Longbreads',8,3,'10 boxes x 8 pieces',12.5,6,10,15,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(69,'Gudbrandsdalsost',15,4,'10 kg pkg.',36,26,0,15,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(70,'Outback Lager',7,1,'24 - 355 ml bottles',15,15,10,30,0) +go +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(71,'Flotemysost',15,4,'10 - 500 g pkgs.',21.5,26,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(72,'Mozzarella di Giovanni',14,4,'24 - 200 g pkgs.',34.8,14,0,0,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(73,'Röd Kaviar',17,8,'24 - 150 g jars',15,101,0,5,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(74,'Longlife Tofu',4,7,'5 kg pkg.',10,4,20,5,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(75,'Rhönbräu Klosterbier',12,1,'24 - 0.5 l bottles',7.75,125,0,25,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(76,'Lakkalikööri',23,1,'500 ml',18,57,0,20,0) +INSERT "Products"("ProductID","ProductName","SupplierID","CategoryID","QuantityPerUnit","UnitPrice","UnitsInStock","UnitsOnOrder","ReorderLevel","Discontinued") VALUES(77,'Original Frankfurter grüne Soße',12,2,'12 boxes',13,32,0,15,0) +go +set identity_insert "Products" off +go +ALTER TABLE "Products" CHECK CONSTRAINT ALL +go +set quoted_identifier on +go +set identity_insert "Shippers" on +go +ALTER TABLE "Shippers" NOCHECK CONSTRAINT ALL +go +INSERT "Shippers"("ShipperID","CompanyName","Phone") VALUES(1,'Speedy Express','(503) 555-9831') +INSERT "Shippers"("ShipperID","CompanyName","Phone") VALUES(2,'United Package','(503) 555-3199') +INSERT "Shippers"("ShipperID","CompanyName","Phone") VALUES(3,'Federal Shipping','(503) 555-9931') +go +set identity_insert "Shippers" off +go +ALTER TABLE "Shippers" CHECK CONSTRAINT ALL +go +set quoted_identifier on +go +set identity_insert "Suppliers" on +go +ALTER TABLE "Suppliers" NOCHECK CONSTRAINT ALL +go +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(1,'Exotic Liquids','Charlotte Cooper','Purchasing Manager','49 Gilbert St.','London',NULL,'EC1 4SD','UK','(171) 555-2222',NULL,NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(2,'New Orleans Cajun Delights','Shelley Burke','Order Administrator','P.O. Box 78934','New Orleans','LA','70117','USA','(100) 555-4822',NULL,'#CAJUN.HTM#') +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(3,'Grandma Kelly''s Homestead','Regina Murphy','Sales Representative','707 Oxford Rd.','Ann Arbor','MI','48104','USA','(313) 555-5735','(313) 555-3349',NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(4,'Tokyo Traders','Yoshi Nagase','Marketing Manager','9-8 Sekimai Musashino-shi','Tokyo',NULL,'100','Japan','(03) 3555-5011',NULL,NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(5,'Cooperativa de Quesos ''Las Cabras''','Antonio del Valle Saavedra','Export Administrator','Calle del Rosal 4','Oviedo','Asturias','33007','Spain','(98) 598 76 54',NULL,NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(6,'Mayumi''s','Mayumi Ohno','Marketing Representative','92 Setsuko Chuo-ku','Osaka',NULL,'545','Japan','(06) 431-7877',NULL,'Mayumi''s (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/mayumi.htm#') +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(7,'Pavlova, Ltd.','Ian Devling','Marketing Manager','74 Rose St. Moonie Ponds','Melbourne','Victoria','3058','Australia','(03) 444-2343','(03) 444-6588',NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(8,'Specialty Biscuits, Ltd.','Peter Wilson','Sales Representative','29 King''s Way','Manchester',NULL,'M14 GSD','UK','(161) 555-4448',NULL,NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(9,'PB Knäckebröd AB','Lars Peterson','Sales Agent','Kaloadagatan 13','Göteborg',NULL,'S-345 67','Sweden','031-987 65 43','031-987 65 91',NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(10,'Refrescos Americanas LTDA','Carlos Diaz','Marketing Manager','Av. das Americanas 12.890','Sao Paulo',NULL,'5442','Brazil','(11) 555 4640',NULL,NULL) +go +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(11,'Heli Süßwaren GmbH & Co. KG','Petra Winkler','Sales Manager','Tiergartenstraße 5','Berlin',NULL,'10785','Germany','(010) 9984510',NULL,NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(12,'Plutzer Lebensmittelgroßmärkte AG','Martin Bein','International Marketing Mgr.','Bogenallee 51','Frankfurt',NULL,'60439','Germany','(069) 992755',NULL,'Plutzer (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/plutzer.htm#') +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(13,'Nord-Ost-Fisch Handelsgesellschaft mbH','Sven Petersen','Coordinator Foreign Markets','Frahmredder 112a','Cuxhaven',NULL,'27478','Germany','(04721) 8713','(04721) 8714',NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(14,'Formaggi Fortini s.r.l.','Elio Rossi','Sales Representative','Viale Dante, 75','Ravenna',NULL,'48100','Italy','(0544) 60323','(0544) 60603','#FORMAGGI.HTM#') +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(15,'Norske Meierier','Beate Vileid','Marketing Manager','Hatlevegen 5','Sandvika',NULL,'1320','Norway','(0)2-953010',NULL,NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(16,'Bigfoot Breweries','Cheryl Saylor','Regional Account Rep.','3400 - 8th Avenue Suite 210','Bend','OR','97101','USA','(503) 555-9931',NULL,NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(17,'Svensk Sjöföda AB','Michael Björn','Sales Representative','Brovallavägen 231','Stockholm',NULL,'S-123 45','Sweden','08-123 45 67',NULL,NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(18,'Aux joyeux ecclésiastiques','Guylène Nodier','Sales Manager','203, Rue des Francs-Bourgeois','Paris',NULL,'75004','France','(1) 03.83.00.68','(1) 03.83.00.62',NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(19,'New England Seafood Cannery','Robb Merchant','Wholesale Account Agent','Order Processing Dept. 2100 Paul Revere Blvd.','Boston','MA','02134','USA','(617) 555-3267','(617) 555-3389',NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(20,'Leka Trading','Chandra Leka','Owner','471 Serangoon Loop, Suite #402','Singapore',NULL,'0512','Singapore','555-8787',NULL,NULL) +go +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(21,'Lyngbysild','Niels Petersen','Sales Manager','Lyngbysild Fiskebakken 10','Lyngby',NULL,'2800','Denmark','43844108','43844115',NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(22,'Zaanse Snoepfabriek','Dirk Luchte','Accounting Manager','Verkoop Rijnweg 22','Zaandam',NULL,'9999 ZZ','Netherlands','(12345) 1212','(12345) 1210',NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(23,'Karkki Oy','Anne Heikkonen','Product Manager','Valtakatu 12','Lappeenranta',NULL,'53120','Finland','(953) 10956',NULL,NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(24,'G''day, Mate','Wendy Mackenzie','Sales Representative','170 Prince Edward Parade Hunter''s Hill','Sydney','NSW','2042','Australia','(02) 555-5914','(02) 555-4873','G''day Mate (on the World Wide Web)#http://www.microsoft.com/accessdev/sampleapps/gdaymate.htm#') +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(25,'Ma Maison','Jean-Guy Lauzon','Marketing Manager','2960 Rue St. Laurent','Montréal','Québec','H1J 1C3','Canada','(514) 555-9022',NULL,NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(26,'Pasta Buttini s.r.l.','Giovanni Giudici','Order Administrator','Via dei Gelsomini, 153','Salerno',NULL,'84100','Italy','(089) 6547665','(089) 6547667',NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(27,'Escargots Nouveaux','Marie Delamare','Sales Manager','22, rue H. Voiron','Montceau',NULL,'71300','France','85.57.00.07',NULL,NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(28,'Gai pâturage','Eliane Noz','Sales Representative','Bat. B 3, rue des Alpes','Annecy',NULL,'74000','France','38.76.98.06','38.76.98.58',NULL) +INSERT "Suppliers"("SupplierID","CompanyName","ContactName","ContactTitle","Address","City","Region","PostalCode","Country","Phone","Fax","HomePage") VALUES(29,'Forêts d''érables','Chantal Goulet','Accounting Manager','148 rue Chasseur','Ste-Hyacinthe','Québec','J2S 7S8','Canada','(514) 555-2955','(514) 555-2921',NULL) +go +set identity_insert "Suppliers" off +go +ALTER TABLE "Suppliers" CHECK CONSTRAINT ALL +go + + +/* The following adds stored procedures */ + +if exists (select * from sysobjects where id = object_id('dbo.CustOrdersDetail')) + drop procedure dbo.CustOrdersDetail +GO + +CREATE PROCEDURE CustOrdersDetail @OrderID int +AS +SELECT ProductName, + UnitPrice=ROUND(Od.UnitPrice, 2), + Quantity, + Discount=CONVERT(int, Discount * 100), + ExtendedPrice=ROUND(CONVERT(money, Quantity * (1 - Discount) * Od.UnitPrice), 2) +FROM Products P, [Order Details] Od +WHERE Od.ProductID = P.ProductID and Od.OrderID = @OrderID +go + + +if exists (select * from sysobjects where id = object_id('dbo.CustOrdersOrders')) + drop procedure dbo.CustOrdersOrders +GO + +CREATE PROCEDURE CustOrdersOrders @CustomerID nchar(5) +AS +SELECT OrderID, + OrderDate, + RequiredDate, + ShippedDate +FROM Orders +WHERE CustomerID = @CustomerID +ORDER BY OrderID +GO + + +if exists (select * from sysobjects where id = object_id('dbo.CustOrderHist') and sysstat & 0xf = 4) + drop procedure dbo.CustOrderHist +GO +CREATE PROCEDURE CustOrderHist @CustomerID nchar(5) +AS +SELECT ProductName, Total=SUM(Quantity) +FROM Products P, [Order Details] OD, Orders O, Customers C +WHERE C.CustomerID = @CustomerID +AND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID +GROUP BY ProductName +GO + +if exists (select * from sysobjects where id = object_id('dbo.SalesByCategory') and sysstat & 0xf = 4) + drop procedure dbo.SalesByCategory +GO +CREATE PROCEDURE SalesByCategory + @CategoryName nvarchar(15), @OrdYear nvarchar(4) = '1998' +AS +IF @OrdYear != '1996' AND @OrdYear != '1997' AND @OrdYear != '1998' +BEGIN + SELECT @OrdYear = '1998' +END + +SELECT ProductName, + TotalPurchase=ROUND(SUM(CONVERT(decimal(14,2), OD.Quantity * (1-OD.Discount) * OD.UnitPrice)), 0) +FROM [Order Details] OD, Orders O, Products P, Categories C +WHERE OD.OrderID = O.OrderID + AND OD.ProductID = P.ProductID + AND P.CategoryID = C.CategoryID + AND C.CategoryName = @CategoryName + AND SUBSTRING(CONVERT(nvarchar(22), O.OrderDate, 111), 1, 4) = @OrdYear +GROUP BY ProductName +ORDER BY ProductName +GO + + +/* The follwing adds tables to the Northwind database */ + + +CREATE TABLE [dbo].[CustomerCustomerDemo] + ([CustomerID] nchar (5) NOT NULL, + [CustomerTypeID] [nchar] (10) NOT NULL +) ON [PRIMARY] +GO + +CREATE TABLE [dbo].[CustomerDemographics] + ([CustomerTypeID] [nchar] (10) NOT NULL , + [CustomerDesc] [ntext] NULL +) ON [PRIMARY] +GO + +CREATE TABLE [dbo].[Region] + ( [RegionID] [int] NOT NULL , + [RegionDescription] [nchar] (50) NOT NULL +) ON [PRIMARY] +GO + +CREATE TABLE [dbo].[Territories] + ([TerritoryID] [nvarchar] (20) NOT NULL , + [TerritoryDescription] [nchar] (50) NOT NULL , + [RegionID] [int] NOT NULL +) ON [PRIMARY] +GO + +CREATE TABLE [dbo].[EmployeeTerritories] + ([EmployeeID] [int] NOT NULL, + [TerritoryID] [nvarchar] (20) NOT NULL +) ON [PRIMARY] + +-- The following adds data to the tables just created. + +Insert Into Region Values (1,'Eastern') +Insert Into Region Values (2,'Western') +Insert Into Region Values (3,'Northern') +Insert Into Region Values (4,'Southern') +Go + +Insert Into Territories Values ('01581','Westboro',1) +Insert Into Territories Values ('01730','Bedford',1) +Insert Into Territories Values ('01833','Georgetow',1) +Insert Into Territories Values ('02116','Boston',1) +Insert Into Territories Values ('02139','Cambridge',1) +Insert Into Territories Values ('02184','Braintree',1) +Insert Into Territories Values ('02903','Providence',1) +Insert Into Territories Values ('03049','Hollis',3) +Insert Into Territories Values ('03801','Portsmouth',3) +Insert Into Territories Values ('06897','Wilton',1) +Insert Into Territories Values ('07960','Morristown',1) +Insert Into Territories Values ('08837','Edison',1) +Insert Into Territories Values ('10019','New York',1) +Insert Into Territories Values ('10038','New York',1) +Insert Into Territories Values ('11747','Mellvile',1) +Insert Into Territories Values ('14450','Fairport',1) +Insert Into Territories Values ('19428','Philadelphia',3) +Insert Into Territories Values ('19713','Neward',1) +Insert Into Territories Values ('20852','Rockville',1) +Insert Into Territories Values ('27403','Greensboro',1) +Insert Into Territories Values ('27511','Cary',1) +Insert Into Territories Values ('29202','Columbia',4) +Insert Into Territories Values ('30346','Atlanta',4) +Insert Into Territories Values ('31406','Savannah',4) +Insert Into Territories Values ('32859','Orlando',4) +Insert Into Territories Values ('33607','Tampa',4) +Insert Into Territories Values ('40222','Louisville',1) +Insert Into Territories Values ('44122','Beachwood',3) +Insert Into Territories Values ('45839','Findlay',3) +Insert Into Territories Values ('48075','Southfield',3) +Insert Into Territories Values ('48084','Troy',3) +Insert Into Territories Values ('48304','Bloomfield Hills',3) +Insert Into Territories Values ('53404','Racine',3) +Insert Into Territories Values ('55113','Roseville',3) +Insert Into Territories Values ('55439','Minneapolis',3) +Insert Into Territories Values ('60179','Hoffman Estates',2) +Insert Into Territories Values ('60601','Chicago',2) +Insert Into Territories Values ('72716','Bentonville',4) +Insert Into Territories Values ('75234','Dallas',4) +Insert Into Territories Values ('78759','Austin',4) +Insert Into Territories Values ('80202','Denver',2) +Insert Into Territories Values ('80909','Colorado Springs',2) +Insert Into Territories Values ('85014','Phoenix',2) +Insert Into Territories Values ('85251','Scottsdale',2) +Insert Into Territories Values ('90405','Santa Monica',2) +Insert Into Territories Values ('94025','Menlo Park',2) +Insert Into Territories Values ('94105','San Francisco',2) +Insert Into Territories Values ('95008','Campbell',2) +Insert Into Territories Values ('95054','Santa Clara',2) +Insert Into Territories Values ('95060','Santa Cruz',2) +Insert Into Territories Values ('98004','Bellevue',2) +Insert Into Territories Values ('98052','Redmond',2) +Insert Into Territories Values ('98104','Seattle',2) +Go + +Insert Into EmployeeTerritories Values (1,'06897') +Insert Into EmployeeTerritories Values (1,'19713') +Insert Into EmployeeTerritories Values (2,'01581') +Insert Into EmployeeTerritories Values (2,'01730') +Insert Into EmployeeTerritories Values (2,'01833') +Insert Into EmployeeTerritories Values (2,'02116') +Insert Into EmployeeTerritories Values (2,'02139') +Insert Into EmployeeTerritories Values (2,'02184') +Insert Into EmployeeTerritories Values (2,'40222') +Insert Into EmployeeTerritories Values (3,'30346') +Insert Into EmployeeTerritories Values (3,'31406') +Insert Into EmployeeTerritories Values (3,'32859') +Insert Into EmployeeTerritories Values (3,'33607') +Insert Into EmployeeTerritories Values (4,'20852') +Insert Into EmployeeTerritories Values (4,'27403') +Insert Into EmployeeTerritories Values (4,'27511') +Insert Into EmployeeTerritories Values (5,'02903') +Insert Into EmployeeTerritories Values (5,'07960') +Insert Into EmployeeTerritories Values (5,'08837') +Insert Into EmployeeTerritories Values (5,'10019') +Insert Into EmployeeTerritories Values (5,'10038') +Insert Into EmployeeTerritories Values (5,'11747') +Insert Into EmployeeTerritories Values (5,'14450') +Insert Into EmployeeTerritories Values (6,'85014') +Insert Into EmployeeTerritories Values (6,'85251') +Insert Into EmployeeTerritories Values (6,'98004') +Insert Into EmployeeTerritories Values (6,'98052') +Insert Into EmployeeTerritories Values (6,'98104') +Insert Into EmployeeTerritories Values (7,'60179') +Insert Into EmployeeTerritories Values (7,'60601') +Insert Into EmployeeTerritories Values (7,'80202') +Insert Into EmployeeTerritories Values (7,'80909') +Insert Into EmployeeTerritories Values (7,'90405') +Insert Into EmployeeTerritories Values (7,'94025') +Insert Into EmployeeTerritories Values (7,'94105') +Insert Into EmployeeTerritories Values (7,'95008') +Insert Into EmployeeTerritories Values (7,'95054') +Insert Into EmployeeTerritories Values (7,'95060') +Insert Into EmployeeTerritories Values (8,'19428') +Insert Into EmployeeTerritories Values (8,'44122') +Insert Into EmployeeTerritories Values (8,'45839') +Insert Into EmployeeTerritories Values (8,'53404') +Insert Into EmployeeTerritories Values (9,'03049') +Insert Into EmployeeTerritories Values (9,'03801') +Insert Into EmployeeTerritories Values (9,'48075') +Insert Into EmployeeTerritories Values (9,'48084') +Insert Into EmployeeTerritories Values (9,'48304') +Insert Into EmployeeTerritories Values (9,'55113') +Insert Into EmployeeTerritories Values (9,'55439') +GO + + + +-- The following adds constraints to the Northwind database + +ALTER TABLE CustomerCustomerDemo + ADD CONSTRAINT [PK_CustomerCustomerDemo] PRIMARY KEY NONCLUSTERED + ( + [CustomerID], + [CustomerTypeID] + ) ON [PRIMARY] +GO + +ALTER TABLE CustomerDemographics + ADD CONSTRAINT [PK_CustomerDemographics] PRIMARY KEY NONCLUSTERED + ( + [CustomerTypeID] + ) ON [PRIMARY] +GO + +ALTER TABLE CustomerCustomerDemo + ADD CONSTRAINT [FK_CustomerCustomerDemo] FOREIGN KEY + ( + [CustomerTypeID] + ) REFERENCES [dbo].[CustomerDemographics] ( + [CustomerTypeID] + ) +GO + +ALTER TABLE CustomerCustomerDemo + ADD CONSTRAINT [FK_CustomerCustomerDemo_Customers] FOREIGN KEY + ( + [CustomerID] + ) REFERENCES [dbo].[Customers] ( + [CustomerID] + ) +GO + +ALTER TABLE Region + ADD CONSTRAINT [PK_Region] PRIMARY KEY NONCLUSTERED + ( + [RegionID] + ) ON [PRIMARY] +GO + +ALTER TABLE Territories + ADD CONSTRAINT [PK_Territories] PRIMARY KEY NONCLUSTERED + ( + [TerritoryID] + ) ON [PRIMARY] +GO + +ALTER TABLE Territories + ADD CONSTRAINT [FK_Territories_Region] FOREIGN KEY + ( + [RegionID] + ) REFERENCES [dbo].[Region] ( + [RegionID] + ) +GO + +ALTER TABLE EmployeeTerritories + ADD CONSTRAINT [PK_EmployeeTerritories] PRIMARY KEY NONCLUSTERED + ( + [EmployeeID], + [TerritoryID] + ) ON [PRIMARY] +GO + +ALTER TABLE EmployeeTerritories + ADD CONSTRAINT [FK_EmployeeTerritories_Employees] FOREIGN KEY + ( + [EmployeeID] + ) REFERENCES [dbo].[Employees] ( + [EmployeeID] + ) +GO + + +ALTER TABLE EmployeeTerritories + ADD CONSTRAINT [FK_EmployeeTerritories_Territories] FOREIGN KEY + ( + [TerritoryID] + ) REFERENCES [dbo].[Territories] ( + [TerritoryID] + ) +GO diff --git a/mcs/class/System.Data/Test/System.Data.Common/ChangeLog b/mcs/class/System.Data/Test/System.Data.Common/ChangeLog index 1ea95d8564d..f9d2261c8ae 100644 --- a/mcs/class/System.Data/Test/System.Data.Common/ChangeLog +++ b/mcs/class/System.Data/Test/System.Data.Common/ChangeLog @@ -1,3 +1,9 @@ +2009-07-13 Atsushi Enomoto + + * DataContainerTest.cs, DataColumnMappingCollectionTest.cs, + DataTableMappingCollectionTest.cs : + migration to newer nunit style. + 2009-01-03 Gert Driesen * DbCommandBuilderTest.cs: Added test for QuoteIdentifier. diff --git a/mcs/class/System.Data/Test/System.Data.Common/DataColumnMappingCollectionTest.cs b/mcs/class/System.Data/Test/System.Data.Common/DataColumnMappingCollectionTest.cs index ce061c744be..d34d6d46076 100644 --- a/mcs/class/System.Data/Test/System.Data.Common/DataColumnMappingCollectionTest.cs +++ b/mcs/class/System.Data/Test/System.Data.Common/DataColumnMappingCollectionTest.cs @@ -36,7 +36,7 @@ using System.Data.Common; namespace MonoTests.System.Data.Common { [TestFixture] - public class DataColumnMappingCollectionTest : Assertion + public class DataColumnMappingCollectionTest { //DataTableMapping tableMap; DataColumnMappingCollection columnMapCollection; @@ -46,11 +46,11 @@ namespace MonoTests.System.Data.Common public void GetReady() { cols=new DataColumnMapping[5]; - cols[0]=new DataColumnMapping("sourceName","dataSetName"); - cols[1]=new DataColumnMapping("sourceID","dataSetID"); - cols[2]=new DataColumnMapping("sourceAddress","dataSetAddress"); - cols[3]=new DataColumnMapping("sourcePhone","dataSetPhone"); - cols[4]=new DataColumnMapping("sourcePIN","dataSetPIN"); + cols[0]=new DataColumnMapping("sourceName", "dataSetName"); + cols[1]=new DataColumnMapping("sourceID", "dataSetID"); + cols[2]=new DataColumnMapping("sourceAddress", "dataSetAddress"); + cols[3]=new DataColumnMapping("sourcePhone", "dataSetPhone"); + cols[4]=new DataColumnMapping("sourcePIN", "dataSetPIN"); columnMapCollection=new DataColumnMappingCollection(); } @@ -63,17 +63,17 @@ namespace MonoTests.System.Data.Common [Test] public void Add() { - DataColumnMapping col1=new DataColumnMapping("sourceName","dataSetName"); + DataColumnMapping col1=new DataColumnMapping("sourceName", "dataSetName"); int t=columnMapCollection.Add((Object)col1); - AssertEquals("test1",0,t); + Assert.AreEqual (0, t, "test1"); bool eq1=col1.Equals(columnMapCollection[0]); - AssertEquals("test2",true,eq1); - AssertEquals("test3",1,columnMapCollection.Count); + Assert.AreEqual (true, eq1, "test2"); + Assert.AreEqual (1, columnMapCollection.Count, "test3"); DataColumnMapping col2; - col2=columnMapCollection.Add("sourceID","dataSetID"); + col2=columnMapCollection.Add("sourceID", "dataSetID"); bool eq2=col2.Equals(columnMapCollection[1]); - AssertEquals("test4",true,eq2); - AssertEquals("test5",2,columnMapCollection.Count); + Assert.AreEqual (true, eq2, "test4"); + Assert.AreEqual (2, columnMapCollection.Count, "test5"); } [Test] @@ -87,65 +87,65 @@ namespace MonoTests.System.Data.Common [Test] public void AddRange() { - columnMapCollection.Add(new DataColumnMapping("sourceAge","dataSetAge")); - AssertEquals("test1",1,columnMapCollection.Count); + columnMapCollection.Add(new DataColumnMapping("sourceAge", "dataSetAge")); + Assert.AreEqual (1, columnMapCollection.Count, "test1"); columnMapCollection.AddRange(cols); - AssertEquals("test2",6,columnMapCollection.Count); + Assert.AreEqual (6, columnMapCollection.Count, "test2"); bool eq; eq=cols[0].Equals(columnMapCollection[1]); - AssertEquals("test3",true,eq); + Assert.AreEqual (true, eq, "test3"); eq=cols[1].Equals(columnMapCollection[2]); - AssertEquals("test4",true,eq); + Assert.AreEqual (true, eq, "test4"); eq=cols[0].Equals(columnMapCollection[0]); - AssertEquals("test5",false,eq); + Assert.AreEqual (false, eq, "test5"); eq=cols[1].Equals(columnMapCollection[0]); - AssertEquals("test6",false,eq); + Assert.AreEqual (false, eq, "test6"); } [Test] public void Clear() { - DataColumnMapping col1=new DataColumnMapping("sourceName","dataSetName"); + DataColumnMapping col1=new DataColumnMapping("sourceName", "dataSetName"); columnMapCollection.Add((Object)col1); - AssertEquals("test1",1,columnMapCollection.Count); + Assert.AreEqual (1, columnMapCollection.Count, "test1"); columnMapCollection.Clear(); - AssertEquals("test2",0,columnMapCollection.Count); + Assert.AreEqual (0, columnMapCollection.Count, "test2"); columnMapCollection.AddRange(cols); - AssertEquals("test3",5,columnMapCollection.Count); + Assert.AreEqual (5, columnMapCollection.Count, "test3"); columnMapCollection.Clear(); - AssertEquals("test4",0,columnMapCollection.Count); + Assert.AreEqual (0, columnMapCollection.Count, "test4"); } [Test] public void Contains() { - DataColumnMapping col1=new DataColumnMapping("sourceName","dataSetName"); + DataColumnMapping col1=new DataColumnMapping("sourceName", "dataSetName"); columnMapCollection.AddRange(cols); bool eq; eq=columnMapCollection.Contains((Object)cols[0]); - AssertEquals("test1",true,eq); + Assert.AreEqual (true, eq, "test1"); eq=columnMapCollection.Contains((Object)cols[1]); - AssertEquals("test2",true,eq); + Assert.AreEqual (true, eq, "test2"); eq=columnMapCollection.Contains((Object)col1); - AssertEquals("test3",false,eq); + Assert.AreEqual (false, eq, "test3"); eq=columnMapCollection.Contains(cols[0].SourceColumn); - AssertEquals("test4",true,eq); + Assert.AreEqual (true, eq, "test4"); eq=columnMapCollection.Contains(cols[1].SourceColumn); - AssertEquals("test5",true,eq); + Assert.AreEqual (true, eq, "test5"); eq=columnMapCollection.Contains(col1.SourceColumn); - AssertEquals("test6",true,eq); + Assert.AreEqual (true, eq, "test6"); eq=columnMapCollection.Contains(cols[0].DataSetColumn); - AssertEquals("test7",false,eq); + Assert.AreEqual (false, eq, "test7"); eq=columnMapCollection.Contains(cols[1].DataSetColumn); - AssertEquals("test8",false,eq); + Assert.AreEqual (false, eq, "test8"); eq=columnMapCollection.Contains(col1.DataSetColumn); - AssertEquals("test9",false,eq); + Assert.AreEqual (false, eq, "test9"); } [Test] @@ -161,25 +161,25 @@ namespace MonoTests.System.Data.Common { DataColumnMapping [] colcops=new DataColumnMapping[5]; columnMapCollection.AddRange(cols); - columnMapCollection.CopyTo(colcops,0); + columnMapCollection.CopyTo(colcops, 0); bool eq; for (int i=0;i<5;i++) { eq=columnMapCollection[i].Equals(colcops[i]); - AssertEquals("test1"+i,true,eq); + Assert.AreEqual (true, eq, "test1" + i); } colcops=null; colcops=new DataColumnMapping[7]; - columnMapCollection.CopyTo(colcops,2); + columnMapCollection.CopyTo(colcops, 2); for (int i=0;i<5;i++) { eq=columnMapCollection[i].Equals(colcops[i+2]); - AssertEquals("test2"+i,true,eq); + Assert.AreEqual (true, eq, "test2" + i); } eq=columnMapCollection[0].Equals(colcops[0]); - AssertEquals("test31",false,eq); + Assert.AreEqual (false, eq, "test31"); eq=columnMapCollection[0].Equals(colcops[1]); - AssertEquals("test32",false,eq); + Assert.AreEqual (false, eq, "test32"); } [Test] @@ -191,31 +191,31 @@ namespace MonoTests.System.Data.Common DataColumnMappingCollection copy1; copy1=columnMapCollection; -// AssertEquals("test1",false,columnMapCollection.Equals(collect2)); - AssertEquals("test2",true,columnMapCollection.Equals(copy1)); -// AssertEquals("test3",false,collect2.Equals(columnMapCollection)); - AssertEquals("test4",true,copy1.Equals(columnMapCollection)); -// AssertEquals("test5",false,collect2.Equals(copy1)); - AssertEquals("test6",true,copy1.Equals(columnMapCollection)); - AssertEquals("test7",true,columnMapCollection.Equals(columnMapCollection)); -// AssertEquals("test8",true,collect2.Equals(collect2)); - AssertEquals("test9",true,copy1.Equals(copy1)); +// Assert.AreEqual (false, columnMapCollection.Equals(collect2), "test1"); + Assert.AreEqual (true, columnMapCollection.Equals(copy1), "test2"); +// Assert.AreEqual (false, collect2.Equals(columnMapCollection), "test3"); + Assert.AreEqual (true, copy1.Equals(columnMapCollection), "test4"); +// Assert.AreEqual (false, collect2.Equals(copy1), "test5"); + Assert.AreEqual (true, copy1.Equals(columnMapCollection), "test6"); + Assert.AreEqual (true, columnMapCollection.Equals(columnMapCollection), "test7"); +// Assert.AreEqual (true, collect2.Equals(collect2), "test8"); + Assert.AreEqual (true, copy1.Equals(copy1), "test9"); -// AssertEquals("test10",false,Object.Equals(collect2,columnMapCollection)); - AssertEquals("test11",true,Object.Equals(copy1,columnMapCollection)); -// AssertEquals("test12",false,Object.Equals(columnMapCollection,collect2)); - AssertEquals("test13",true,Object.Equals(columnMapCollection,copy1)); -// AssertEquals("test14",false,Object.Equals(copy1,collect2)); - AssertEquals("test15",true,Object.Equals(columnMapCollection,copy1)); - AssertEquals("test16",true,Object.Equals(columnMapCollection,columnMapCollection)); -// AssertEquals("test17",true,Object.Equals(collect2,collect2)); - AssertEquals("test18",true,Object.Equals(copy1,copy1)); -// AssertEquals("test10",false,Object.Equals(columnMapCollection,collect2)); - AssertEquals("test11",true,Object.Equals(columnMapCollection,copy1)); -// AssertEquals("test12",false,Object.Equals(collect2,columnMapCollection)); - AssertEquals("test13",true,Object.Equals(copy1,columnMapCollection)); -// AssertEquals("test14",false,Object.Equals(collect2,copy1)); - AssertEquals("test15",true,Object.Equals(copy1,columnMapCollection)); +// Assert.AreEqual (false, Object.Equals(collect2, columnMapCollection), "test10"); + Assert.AreEqual (true, Object.Equals(copy1, columnMapCollection), "test11"); +// Assert.AreEqual (false, Object.Equals(columnMapCollection, collect2), "test12"); + Assert.AreEqual (true, Object.Equals(columnMapCollection, copy1), "test13"); +// Assert.AreEqual (false, Object.Equals(copy1, collect2), "test14"); + Assert.AreEqual (true, Object.Equals(columnMapCollection, copy1), "test15"); + Assert.AreEqual (true, Object.Equals(columnMapCollection, columnMapCollection), "test16"); +// Assert.AreEqual (true, Object.Equals(collect2, collect2), "test17"); + Assert.AreEqual (true, Object.Equals(copy1, copy1), "test18"); +// Assert.AreEqual (false, Object.Equals(columnMapCollection, collect2), "test10"); + Assert.AreEqual (true, Object.Equals(columnMapCollection, copy1), "test11"); +// Assert.AreEqual (false, Object.Equals(collect2, columnMapCollection), "test12"); + Assert.AreEqual (true, Object.Equals(copy1, columnMapCollection), "test13"); +// Assert.AreEqual (false, Object.Equals(collect2, copy1), "test14"); + Assert.AreEqual (true, Object.Equals(copy1, columnMapCollection), "test15"); } [Test] @@ -226,17 +226,17 @@ namespace MonoTests.System.Data.Common DataColumnMapping col1; col1=columnMapCollection.GetByDataSetColumn("dataSetName"); eq=(col1.DataSetColumn.Equals("dataSetName") && col1.SourceColumn.Equals("sourceName")); - AssertEquals("test1",true,eq); + Assert.AreEqual (true, eq, "test1"); col1=columnMapCollection.GetByDataSetColumn("dataSetID"); eq=(col1.DataSetColumn.Equals("dataSetID") && col1.SourceColumn.Equals("sourceID")); - AssertEquals("test2",true,eq); + Assert.AreEqual (true, eq, "test2"); col1=columnMapCollection.GetByDataSetColumn("datasetname"); eq=(col1.DataSetColumn.Equals("dataSetName") && col1.SourceColumn.Equals("sourceName")); - AssertEquals("test3",true,eq); + Assert.AreEqual (true, eq, "test3"); col1=columnMapCollection.GetByDataSetColumn("datasetid"); eq=(col1.DataSetColumn.Equals("dataSetID") && col1.SourceColumn.Equals("sourceID")); - AssertEquals("test4",true,eq); + Assert.AreEqual (true, eq, "test4"); } [Test] @@ -245,27 +245,27 @@ namespace MonoTests.System.Data.Common columnMapCollection.AddRange(cols); bool eq; DataColumnMapping col1; - col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection,"sourceName",MissingMappingAction.Passthrough); + col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection, "sourceName", MissingMappingAction.Passthrough); eq=(col1.DataSetColumn.Equals("dataSetName") && col1.SourceColumn.Equals("sourceName")); - AssertEquals("test1",true,eq); - col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection,"sourceID",MissingMappingAction.Passthrough); + Assert.AreEqual (true, eq, "test1"); + col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection, "sourceID", MissingMappingAction.Passthrough); eq=(col1.DataSetColumn.Equals("dataSetID") && col1.SourceColumn.Equals("sourceID")); - AssertEquals("test2",true,eq); + Assert.AreEqual (true, eq, "test2"); - col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection,"sourceData",MissingMappingAction.Passthrough); + col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection, "sourceData", MissingMappingAction.Passthrough); eq=(col1.DataSetColumn.Equals("sourceData") && col1.SourceColumn.Equals("sourceData")); - AssertEquals("test3",true,eq); + Assert.AreEqual (true, eq, "test3"); eq=columnMapCollection.Contains(col1); - AssertEquals("test4",false,eq); - col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection,"sourceData",MissingMappingAction.Ignore); - AssertEquals("test5",null,col1); + Assert.AreEqual (false, eq, "test4"); + col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection, "sourceData", MissingMappingAction.Ignore); + Assert.AreEqual (null, col1, "test5"); } [Test] [ExpectedException(typeof(InvalidOperationException))] public void GetColumnMappingBySchemaActionException1() { - DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection,"sourceName",MissingMappingAction.Error); + DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection, "sourceName", MissingMappingAction.Error); } [Test] @@ -274,14 +274,14 @@ namespace MonoTests.System.Data.Common columnMapCollection.AddRange(cols); int ind; ind=columnMapCollection.IndexOf(cols[0]); - AssertEquals("test1",0,ind); + Assert.AreEqual (0, ind, "test1"); ind=columnMapCollection.IndexOf(cols[1]); - AssertEquals("test2",1,ind); + Assert.AreEqual (1, ind, "test2"); ind=columnMapCollection.IndexOf(cols[0].SourceColumn); - AssertEquals("test3",0,ind); + Assert.AreEqual (0, ind, "test3"); ind=columnMapCollection.IndexOf(cols[1].SourceColumn); - AssertEquals("test4",1,ind); + Assert.AreEqual (1, ind, "test4"); } [Test] @@ -290,27 +290,27 @@ namespace MonoTests.System.Data.Common columnMapCollection.AddRange(cols); int ind; ind=columnMapCollection.IndexOfDataSetColumn(cols[0].DataSetColumn); - AssertEquals("test1",0,ind); + Assert.AreEqual (0, ind, "test1"); ind=columnMapCollection.IndexOfDataSetColumn(cols[1].DataSetColumn); - AssertEquals("test2",1,ind); + Assert.AreEqual (1, ind, "test2"); ind=columnMapCollection.IndexOfDataSetColumn("datasetname"); - AssertEquals("test3",0,ind); + Assert.AreEqual (0, ind, "test3"); ind=columnMapCollection.IndexOfDataSetColumn("datasetid"); - AssertEquals("test4",1,ind); + Assert.AreEqual (1, ind, "test4"); ind=columnMapCollection.IndexOfDataSetColumn("sourcedeter"); - AssertEquals("test5",-1,ind); + Assert.AreEqual (-1, ind, "test5"); } [Test] public void Insert() { columnMapCollection.AddRange(cols); - DataColumnMapping mymap=new DataColumnMapping("sourceAge","dataSetAge"); - columnMapCollection.Insert(3,mymap); + DataColumnMapping mymap=new DataColumnMapping("sourceAge", "dataSetAge"); + columnMapCollection.Insert(3, mymap); int ind=columnMapCollection.IndexOfDataSetColumn("dataSetAge"); - AssertEquals("test1",3,ind); + Assert.AreEqual (3, ind, "test1"); } [Test] @@ -318,11 +318,11 @@ namespace MonoTests.System.Data.Common public void Remove() { columnMapCollection.AddRange(cols); - DataColumnMapping mymap=new DataColumnMapping("sourceName","dataSetName"); + DataColumnMapping mymap=new DataColumnMapping("sourceName", "dataSetName"); columnMapCollection.Add(mymap); columnMapCollection.Remove((Object)mymap); bool eq=columnMapCollection.Contains((Object)mymap); - AssertEquals("test1",false,eq); + Assert.AreEqual (false, eq, "test1"); } [Test] @@ -339,7 +339,7 @@ namespace MonoTests.System.Data.Common public void RemoveException2() { columnMapCollection.AddRange(cols); - DataColumnMapping mymap=new DataColumnMapping("sourceAge","dataSetAge"); + DataColumnMapping mymap=new DataColumnMapping("sourceAge", "dataSetAge"); columnMapCollection.Remove(mymap); } @@ -350,15 +350,15 @@ namespace MonoTests.System.Data.Common bool eq; columnMapCollection.RemoveAt(0); eq=columnMapCollection.Contains(cols[0]); - AssertEquals("test1",false,eq); + Assert.AreEqual (false, eq, "test1"); eq=columnMapCollection.Contains(cols[1]); - AssertEquals("test2",true,eq); + Assert.AreEqual (true, eq, "test2"); columnMapCollection.RemoveAt("sourceID"); eq=columnMapCollection.Contains(cols[1]); - AssertEquals("test3",false,eq); + Assert.AreEqual (false, eq, "test3"); eq=columnMapCollection.Contains(cols[2]); - AssertEquals("test4",true,eq); + Assert.AreEqual (true, eq, "test4"); } [Test] @@ -381,7 +381,7 @@ namespace MonoTests.System.Data.Common #endif public void ToStringTest() { - AssertEquals("test1","System.Data.Common.DataColumnMappingCollection",columnMapCollection.ToString()); + Assert.AreEqual ("System.Data.Common.DataColumnMappingCollection", columnMapCollection.ToString(), "test1"); } } } diff --git a/mcs/class/System.Data/Test/System.Data.Common/DataContainerTest.cs b/mcs/class/System.Data/Test/System.Data.Common/DataContainerTest.cs index 353b099d905..cf0ec82d7e3 100644 --- a/mcs/class/System.Data/Test/System.Data.Common/DataContainerTest.cs +++ b/mcs/class/System.Data/Test/System.Data.Common/DataContainerTest.cs @@ -61,7 +61,7 @@ namespace MonoTests.System.Data.Common DataTable dt = new DataTable (); myadapter.Fill (dt); - Assertion.AssertEquals ("Row count must be three", 3, dt.Rows.Count); + Assert.AreEqual (3, dt.Rows.Count, "Row count must be three"); } finally { CleanTestSetup (); CloseConnection (); diff --git a/mcs/class/System.Data/Test/System.Data.Common/DataTableMappingCollectionTest.cs b/mcs/class/System.Data/Test/System.Data.Common/DataTableMappingCollectionTest.cs index e9b2be98fe6..a14c3f85ab3 100644 --- a/mcs/class/System.Data/Test/System.Data.Common/DataTableMappingCollectionTest.cs +++ b/mcs/class/System.Data/Test/System.Data.Common/DataTableMappingCollectionTest.cs @@ -36,7 +36,7 @@ using System.Data.Common; namespace MonoTests.System.Data.Common { [TestFixture] - public class DataTableMappingCollectionTest : Assertion + public class DataTableMappingCollectionTest { DataTableMappingCollection tableMapCollection; DataTableMapping [] tabs; @@ -44,11 +44,11 @@ namespace MonoTests.System.Data.Common public void GetReady() { tabs=new DataTableMapping[5]; - tabs[0]=new DataTableMapping("sourceCustomers","dataSetCustomers"); - tabs[1]=new DataTableMapping("sourceEmployees","dataSetEmployees"); - tabs[2]=new DataTableMapping("sourceBooks","dataSetBooks"); - tabs[3]=new DataTableMapping("sourceStore","dataSetStore"); - tabs[4]=new DataTableMapping("sourceInventory","dataSetInventory"); + tabs[0]=new DataTableMapping("sourceCustomers", "dataSetCustomers"); + tabs[1]=new DataTableMapping("sourceEmployees", "dataSetEmployees"); + tabs[2]=new DataTableMapping("sourceBooks", "dataSetBooks"); + tabs[3]=new DataTableMapping("sourceStore", "dataSetStore"); + tabs[4]=new DataTableMapping("sourceInventory", "dataSetInventory"); tableMapCollection=new DataTableMappingCollection(); } @@ -62,15 +62,15 @@ namespace MonoTests.System.Data.Common public void Add() { int t=tableMapCollection.Add((Object)tabs[0]); - AssertEquals("test1",0,t); + Assert.AreEqual(0, t, "test1"); bool eq1=tabs[0].Equals(tableMapCollection[0]); - AssertEquals("test2",true,eq1); - AssertEquals("test3",1,tableMapCollection.Count); + Assert.AreEqual(true, eq1, "test2"); + Assert.AreEqual(1, tableMapCollection.Count, "test3"); DataTableMapping tab2; - tab2=tableMapCollection.Add("sourceEmployees","dataSetEmployees"); + tab2=tableMapCollection.Add("sourceEmployees", "dataSetEmployees"); bool eq2=tab2.Equals(tableMapCollection[1]); - AssertEquals("test4",true,eq2); - AssertEquals("test5",2,tableMapCollection.Count); + Assert.AreEqual(true, eq2, "test4"); + Assert.AreEqual(2, tableMapCollection.Count, "test5"); } [Test] @@ -84,59 +84,59 @@ namespace MonoTests.System.Data.Common [Test] public void AddRange() { - tableMapCollection.Add(new DataTableMapping("sourceFactory","dataSetFactory")); - AssertEquals("test1",1,tableMapCollection.Count); + tableMapCollection.Add(new DataTableMapping("sourceFactory", "dataSetFactory")); + Assert.AreEqual(1, tableMapCollection.Count, "test1"); tableMapCollection.AddRange(tabs); - AssertEquals("test2",6,tableMapCollection.Count); + Assert.AreEqual(6, tableMapCollection.Count, "test2"); bool eq; eq=tabs[0].Equals(tableMapCollection[1]); - AssertEquals("test3",true,eq); + Assert.AreEqual(true, eq, "test3"); eq=tabs[1].Equals(tableMapCollection[2]); - AssertEquals("test4",true,eq); + Assert.AreEqual(true, eq, "test4"); eq=tabs[0].Equals(tableMapCollection[0]); - AssertEquals("test5",false,eq); + Assert.AreEqual(false, eq, "test5"); eq=tabs[1].Equals(tableMapCollection[0]); - AssertEquals("test6",false,eq); + Assert.AreEqual(false, eq, "test6"); } [Test] public void Clear() { - DataTableMapping tab1=new DataTableMapping("sourceSuppliers","dataSetSuppliers"); + DataTableMapping tab1=new DataTableMapping("sourceSuppliers", "dataSetSuppliers"); tableMapCollection.Add((Object)tab1); - AssertEquals("test1",1,tableMapCollection.Count); + Assert.AreEqual(1, tableMapCollection.Count, "test1"); tableMapCollection.Clear(); - AssertEquals("test2",0,tableMapCollection.Count); + Assert.AreEqual(0, tableMapCollection.Count, "test2"); tableMapCollection.AddRange(tabs); - AssertEquals("test3",5,tableMapCollection.Count); + Assert.AreEqual(5, tableMapCollection.Count, "test3"); tableMapCollection.Clear(); - AssertEquals("test4",0,tableMapCollection.Count); + Assert.AreEqual(0, tableMapCollection.Count, "test4"); } [Test] public void Contains() { - DataTableMapping tab1=new DataTableMapping("sourceCustomers","dataSetCustomers"); + DataTableMapping tab1=new DataTableMapping("sourceCustomers", "dataSetCustomers"); tableMapCollection.AddRange(tabs); bool eq; eq=tableMapCollection.Contains((Object)tabs[0]); - AssertEquals("test1",true,eq); + Assert.AreEqual(true, eq, "test1"); eq=tableMapCollection.Contains((Object)tabs[1]); - AssertEquals("test2",true,eq); + Assert.AreEqual(true, eq, "test2"); eq=tableMapCollection.Contains((Object)tab1); - AssertEquals("test3",false,eq); + Assert.AreEqual(false, eq, "test3"); eq=tableMapCollection.Contains(tabs[0].SourceTable); - AssertEquals("test4",true,eq); + Assert.AreEqual(true, eq, "test4"); eq=tableMapCollection.Contains(tabs[1].SourceTable); - AssertEquals("test5",true,eq); + Assert.AreEqual(true, eq, "test5"); eq=tableMapCollection.Contains(tab1.SourceTable); - AssertEquals("test6",true,eq); + Assert.AreEqual(true, eq, "test6"); eq=tableMapCollection.Contains(tabs[0].DataSetTable); - AssertEquals("test7",false,eq); + Assert.AreEqual(false, eq, "test7"); eq=tableMapCollection.Contains(tabs[1].DataSetTable); - AssertEquals("test8",false,eq); + Assert.AreEqual(false, eq, "test8"); eq=tableMapCollection.Contains(tab1.DataSetTable); - AssertEquals("test9",false,eq); + Assert.AreEqual(false, eq, "test9"); } [Test] @@ -144,25 +144,25 @@ namespace MonoTests.System.Data.Common { DataTableMapping [] tabcops=new DataTableMapping[5]; tableMapCollection.AddRange(tabs); - tableMapCollection.CopyTo(tabcops,0); + tableMapCollection.CopyTo(tabcops, 0); bool eq; for (int i=0;i<5;i++) { eq=tableMapCollection[i].Equals(tabcops[i]); - AssertEquals("test1"+i,true,eq); + Assert.AreEqual (true, eq, "test1" + i); } tabcops=null; tabcops=new DataTableMapping[7]; - tableMapCollection.CopyTo(tabcops,2); + tableMapCollection.CopyTo(tabcops, 2); for (int i=0;i<5;i++) { eq=tableMapCollection[i].Equals(tabcops[i+2]); - AssertEquals("test2"+i,true,eq); + Assert.AreEqual (true, eq, "test2" + i); } eq=tableMapCollection[0].Equals(tabcops[0]); - AssertEquals("test31",false,eq); + Assert.AreEqual (false, eq, "test31"); eq=tableMapCollection[0].Equals(tabcops[1]); - AssertEquals("test32",false,eq); + Assert.AreEqual (false, eq, "test32"); } [Test] @@ -174,31 +174,31 @@ namespace MonoTests.System.Data.Common DataTableMappingCollection copy1; copy1=tableMapCollection; -// AssertEquals("test1",false,tableMapCollection.Equals(collect2)); - AssertEquals("test2",true,tableMapCollection.Equals(copy1)); -// AssertEquals("test3",false,collect2.Equals(tableMapCollection)); - AssertEquals("test4",true,copy1.Equals(tableMapCollection)); -// AssertEquals("test5",false,collect2.Equals(copy1)); - AssertEquals("test6",true,copy1.Equals(tableMapCollection)); - AssertEquals("test7",true,tableMapCollection.Equals(tableMapCollection)); -// AssertEquals("test8",true,collect2.Equals(collect2)); - AssertEquals("test9",true,copy1.Equals(copy1)); +// Assert.AreEqual(false, tableMapCollection.Equals(collect2), "test1"); + Assert.AreEqual(true, tableMapCollection.Equals(copy1), "test2"); +// Assert.AreEqual(false, collect2.Equals(tableMapCollection), "test3"); + Assert.AreEqual(true, copy1.Equals(tableMapCollection), "test4"); +// Assert.AreEqual(false, collect2.Equals(copy1), "test5"); + Assert.AreEqual(true, copy1.Equals(tableMapCollection), "test6"); + Assert.AreEqual(true, tableMapCollection.Equals(tableMapCollection), "test7"); +// Assert.AreEqual(true, collect2.Equals(collect2), "test8"); + Assert.AreEqual(true, copy1.Equals(copy1), "test9"); -// AssertEquals("test10",false,Object.Equals(collect2,tableMapCollection)); - AssertEquals("test11",true,Object.Equals(copy1,tableMapCollection)); -// AssertEquals("test12",false,Object.Equals(tableMapCollection,collect2)); - AssertEquals("test13",true,Object.Equals(tableMapCollection,copy1)); -// AssertEquals("test14",false,Object.Equals(copy1,collect2)); - AssertEquals("test15",true,Object.Equals(tableMapCollection,copy1)); - AssertEquals("test16",true,Object.Equals(tableMapCollection,tableMapCollection)); -// AssertEquals("test17",true,Object.Equals(collect2,collect2)); - AssertEquals("test18",true,Object.Equals(copy1,copy1)); -// AssertEquals("test10",false,Object.Equals(tableMapCollection,collect2)); - AssertEquals("test11",true,Object.Equals(tableMapCollection,copy1)); -// AssertEquals("test12",false,Object.Equals(collect2,tableMapCollection)); - AssertEquals("test13",true,Object.Equals(copy1,tableMapCollection)); -// AssertEquals("test14",false,Object.Equals(collect2,copy1)); - AssertEquals("test15",true,Object.Equals(copy1,tableMapCollection)); +// Assert.AreEqual(false, Object.Equals(collect2, tableMapCollection), "test10"); + Assert.AreEqual(true, Object.Equals(copy1, tableMapCollection), "test11"); +// Assert.AreEqual(false, Object.Equals(tableMapCollection, collect2), "test12"); + Assert.AreEqual(true, Object.Equals(tableMapCollection, copy1), "test13"); +// Assert.AreEqual(false, Object.Equals(copy1, collect2), "test14"); + Assert.AreEqual(true, Object.Equals(tableMapCollection, copy1), "test15"); + Assert.AreEqual(true, Object.Equals(tableMapCollection, tableMapCollection), "test16"); +// Assert.AreEqual(true, Object.Equals(collect2, collect2), "test17"); + Assert.AreEqual(true, Object.Equals(copy1, copy1), "test18"); +// Assert.AreEqual(false, Object.Equals(tableMapCollection, collect2), "test10"); + Assert.AreEqual(true, Object.Equals(tableMapCollection, copy1), "test11"); +// Assert.AreEqual(false, Object.Equals(collect2, tableMapCollection), "test12"); + Assert.AreEqual(true, Object.Equals(copy1, tableMapCollection), "test13"); +// Assert.AreEqual(false, Object.Equals(collect2, copy1), "test14"); + Assert.AreEqual(true, Object.Equals(copy1, tableMapCollection), "test15"); } [Test] @@ -209,17 +209,17 @@ namespace MonoTests.System.Data.Common DataTableMapping tab1; tab1=tableMapCollection.GetByDataSetTable("dataSetCustomers"); eq=(tab1.DataSetTable.Equals("dataSetCustomers") && tab1.SourceTable.Equals("sourceCustomers")); - AssertEquals("test1",true,eq); + Assert.AreEqual(true, eq, "test1"); tab1=tableMapCollection.GetByDataSetTable("dataSetEmployees"); eq=(tab1.DataSetTable.Equals("dataSetEmployees") && tab1.SourceTable.Equals("sourceEmployees")); - AssertEquals("test2",true,eq); + Assert.AreEqual(true, eq, "test2"); tab1=tableMapCollection.GetByDataSetTable("datasetcustomers"); eq=(tab1.DataSetTable.Equals("dataSetCustomers") && tab1.SourceTable.Equals("sourceCustomers")); - AssertEquals("test3",true,eq); + Assert.AreEqual(true, eq, "test3"); tab1=tableMapCollection.GetByDataSetTable("datasetemployees"); eq=(tab1.DataSetTable.Equals("dataSetEmployees") && tab1.SourceTable.Equals("sourceEmployees")); - AssertEquals("test4",true,eq); + Assert.AreEqual(true, eq, "test4"); } @@ -229,27 +229,27 @@ namespace MonoTests.System.Data.Common tableMapCollection.AddRange(tabs); bool eq; DataTableMapping tab1; - tab1=DataTableMappingCollection.GetTableMappingBySchemaAction(tableMapCollection,"sourceCustomers","dataSetCustomers",MissingMappingAction.Passthrough); + tab1=DataTableMappingCollection.GetTableMappingBySchemaAction(tableMapCollection, "sourceCustomers", "dataSetCustomers", MissingMappingAction.Passthrough); eq=(tab1.DataSetTable.Equals("dataSetCustomers") && tab1.SourceTable.Equals("sourceCustomers")); - AssertEquals("test1",true,eq); - tab1=DataTableMappingCollection.GetTableMappingBySchemaAction(tableMapCollection,"sourceEmployees","dataSetEmployees",MissingMappingAction.Passthrough); + Assert.AreEqual(true, eq, "test1"); + tab1=DataTableMappingCollection.GetTableMappingBySchemaAction(tableMapCollection, "sourceEmployees", "dataSetEmployees", MissingMappingAction.Passthrough); eq=(tab1.DataSetTable.Equals("dataSetEmployees") && tab1.SourceTable.Equals("sourceEmployees")); - AssertEquals("test2",true,eq); + Assert.AreEqual(true, eq, "test2"); - tab1=DataTableMappingCollection.GetTableMappingBySchemaAction(tableMapCollection,"sourceData","dataSetData",MissingMappingAction.Passthrough); + tab1=DataTableMappingCollection.GetTableMappingBySchemaAction(tableMapCollection, "sourceData", "dataSetData", MissingMappingAction.Passthrough); eq=(tab1.DataSetTable.Equals("sourceData") && tab1.SourceTable.Equals("dataSetData")); - AssertEquals("test3",false, eq); + Assert.AreEqual(false, eq, "test3"); eq=tableMapCollection.Contains(tab1); - AssertEquals("test4",false,eq); - tab1=DataTableMappingCollection.GetTableMappingBySchemaAction(tableMapCollection,"sourceData","dataSetData",MissingMappingAction.Ignore); - AssertEquals("test5",null,tab1); + Assert.AreEqual(false, eq, "test4"); + tab1=DataTableMappingCollection.GetTableMappingBySchemaAction(tableMapCollection, "sourceData", "dataSetData", MissingMappingAction.Ignore); + Assert.AreEqual(null, tab1, "test5"); } [Test] [ExpectedException(typeof(InvalidOperationException))] public void GetTableMappingBySchemaActionException1() { - DataTableMappingCollection.GetTableMappingBySchemaAction(tableMapCollection,"sourceCustomers","dataSetCustomers",MissingMappingAction.Error); + DataTableMappingCollection.GetTableMappingBySchemaAction(tableMapCollection, "sourceCustomers", "dataSetCustomers", MissingMappingAction.Error); } [Test] @@ -258,14 +258,14 @@ namespace MonoTests.System.Data.Common tableMapCollection.AddRange(tabs); int ind; ind=tableMapCollection.IndexOf(tabs[0]); - AssertEquals("test1",0,ind); + Assert.AreEqual(0, ind, "test1"); ind=tableMapCollection.IndexOf(tabs[1]); - AssertEquals("test2",1,ind); + Assert.AreEqual(1, ind, "test2"); ind=tableMapCollection.IndexOf(tabs[0].SourceTable); - AssertEquals("test3",0,ind); + Assert.AreEqual(0, ind, "test3"); ind=tableMapCollection.IndexOf(tabs[1].SourceTable); - AssertEquals("test4",1,ind); + Assert.AreEqual(1, ind, "test4"); } [Test] @@ -274,27 +274,27 @@ namespace MonoTests.System.Data.Common tableMapCollection.AddRange(tabs); int ind; ind=tableMapCollection.IndexOfDataSetTable(tabs[0].DataSetTable); - AssertEquals("test1",0,ind); + Assert.AreEqual(0, ind, "test1"); ind=tableMapCollection.IndexOfDataSetTable(tabs[1].DataSetTable); - AssertEquals("test2",1,ind); + Assert.AreEqual(1, ind, "test2"); ind=tableMapCollection.IndexOfDataSetTable("datasetcustomers"); - AssertEquals("test3",0,ind); + Assert.AreEqual(0, ind, "test3"); ind=tableMapCollection.IndexOfDataSetTable("datasetemployees"); - AssertEquals("test4",1,ind); + Assert.AreEqual(1, ind, "test4"); ind=tableMapCollection.IndexOfDataSetTable("sourcedeter"); - AssertEquals("test5",-1,ind); + Assert.AreEqual(-1, ind, "test5"); } [Test] public void Insert() { tableMapCollection.AddRange(tabs); - DataTableMapping mymap=new DataTableMapping("sourceTestAge","datatestSetAge"); - tableMapCollection.Insert(3,mymap); + DataTableMapping mymap=new DataTableMapping("sourceTestAge", "datatestSetAge"); + tableMapCollection.Insert(3, mymap); int ind=tableMapCollection.IndexOfDataSetTable("datatestSetAge"); - AssertEquals("test1",3,ind); + Assert.AreEqual(3, ind, "test1"); } [Test] @@ -302,11 +302,11 @@ namespace MonoTests.System.Data.Common public void Remove() { tableMapCollection.AddRange(tabs); - DataTableMapping mymap=new DataTableMapping("sourceCustomers","dataSetCustomers"); + DataTableMapping mymap=new DataTableMapping("sourceCustomers", "dataSetCustomers"); tableMapCollection.Add(mymap); tableMapCollection.Remove((Object)mymap); bool eq=tableMapCollection.Contains((Object)mymap); - AssertEquals("test1",false,eq); + Assert.AreEqual(false, eq, "test1"); } [Test] @@ -323,7 +323,7 @@ namespace MonoTests.System.Data.Common public void RemoveException2() { tableMapCollection.AddRange(tabs); - DataTableMapping mymap=new DataTableMapping("sourceAge","dataSetAge"); + DataTableMapping mymap=new DataTableMapping("sourceAge", "dataSetAge"); tableMapCollection.Remove(mymap); } @@ -334,15 +334,15 @@ namespace MonoTests.System.Data.Common bool eq; tableMapCollection.RemoveAt(0); eq=tableMapCollection.Contains(tabs[0]); - AssertEquals("test1",false,eq); + Assert.AreEqual(false, eq, "test1"); eq=tableMapCollection.Contains(tabs[1]); - AssertEquals("test2",true,eq); + Assert.AreEqual(true, eq, "test2"); tableMapCollection.RemoveAt("sourceEmployees"); eq=tableMapCollection.Contains(tabs[1]); - AssertEquals("test3",false,eq); + Assert.AreEqual(false, eq, "test3"); eq=tableMapCollection.Contains(tabs[2]); - AssertEquals("test4",true,eq); + Assert.AreEqual(true, eq, "test4"); } [Test] @@ -365,7 +365,7 @@ namespace MonoTests.System.Data.Common #endif public void ToStringTest() { - AssertEquals("test1","System.Data.Common.DataTableMappingCollection",tableMapCollection.ToString()); + Assert.AreEqual("System.Data.Common.DataTableMappingCollection", tableMapCollection.ToString(), "test1"); } } } diff --git a/mcs/class/System.Data/Test/System.Data.Odbc/ChangeLog b/mcs/class/System.Data/Test/System.Data.Odbc/ChangeLog index 6f5abb686b7..8adc133735c 100644 --- a/mcs/class/System.Data/Test/System.Data.Odbc/ChangeLog +++ b/mcs/class/System.Data/Test/System.Data.Odbc/ChangeLog @@ -1,3 +1,7 @@ +2009-07-13 Atsushi Enomoto + + * OdbcDataReaderTest.cs : migration to newer nunit style. + 2009-01-18 Gert Driesen * OdbcCommandTest.cs: Added tests for CommandTimeout, diff --git a/mcs/class/System.Data/Test/System.Data.Odbc/OdbcDataReaderTest.cs b/mcs/class/System.Data/Test/System.Data.Odbc/OdbcDataReaderTest.cs index 15de3722cc1..5899043c34b 100644 --- a/mcs/class/System.Data/Test/System.Data.Odbc/OdbcDataReaderTest.cs +++ b/mcs/class/System.Data/Test/System.Data.Odbc/OdbcDataReaderTest.cs @@ -73,9 +73,9 @@ namespace MonoTests.System.Data.Odbc reader = cmd.ExecuteReader (); if (reader.Read ()) { byte b = reader.GetByte (0); - Assertion.AssertEquals ("GetByte returns wrong result!", 0xff, b); + Assert.AreEqual (0xff, b, "GetByte returns wrong result!"); } else // This should not happen while testing - Assertion.AssertEquals ("test table doens not have a test data!", true, true); + Assert.AreEqual (true, true, "test table doens not have a test data!"); } finally { // try/catch is necessary to gracefully close connections if (reader != null && reader.IsClosed) reader.Close (); @@ -96,23 +96,17 @@ namespace MonoTests.System.Data.Odbc dbcmd.CommandText = sql; IDataReader reader = dbcmd.ExecuteReader (); try { - Assertion.AssertEquals ("GetDataTypeName returns invalid Type for column #1", - "TinyInt", reader.GetDataTypeName (0)); - Assertion.AssertEquals ("GetDataTypeName returns invalid Type for column #2", - "VarChar", reader.GetDataTypeName (1)); + Assert.AreEqual ("TinyInt", reader.GetDataTypeName (0), "GetDataTypeName returns invalid Type for column #1"); + Assert.AreEqual ("VarChar", reader.GetDataTypeName (1), "GetDataTypeName returns invalid Type for column #2"); // Test via method GetFieldType.ToString - Assertion.AssertEquals ("GetFieldType returns invalid Type for column #1", - "System.Byte", reader.GetFieldType (0).ToString ()); - Assertion.AssertEquals ("GetFieldType returns invalid Type for column #2", - "System.String", reader.GetFieldType (1).ToString ()); + Assert.AreEqual ("System.Byte", reader.GetFieldType (0).ToString (), "GetFieldType returns invalid Type for column #1"); + Assert.AreEqual ("System.String", reader.GetFieldType (1).ToString (), "GetFieldType returns invalid Type for column #2"); // Test via method GetSchemaTable reader = dbcmd.ExecuteReader (); DataTable schemaTable = reader.GetSchemaTable (); - Assertion.AssertEquals ("GetSchemaTable.ColumnDataType failes for column #1", - typeof (Byte), schemaTable.Rows [0]["DataType"]); - Assertion.AssertEquals ("GetSchemaTable.ColumnDataType failes for column #1", - typeof (String), schemaTable.Rows [1]["DataType"]); + Assert.AreEqual (typeof (Byte), schemaTable.Rows [0]["DataType"], "GetSchemaTable.ColumnDataType failes for column #1"); + Assert.AreEqual (typeof (String), schemaTable.Rows [1]["DataType"], "GetSchemaTable.ColumnDataType failes for column #1"); } finally { // clean up if (reader != null && !reader.IsClosed) @@ -131,7 +125,7 @@ namespace MonoTests.System.Data.Odbc dbcmd.CommandText = sql; OdbcDataReader reader = dbcmd.ExecuteReader (); try { - Assertion.AssertEquals ("GetName failes ", "pk_tint", reader.GetName (0)); + Assert.AreEqual ("pk_tint", reader.GetName (0), "GetName failes "); } finally { // clean up if (reader != null && !reader.IsClosed) @@ -169,8 +163,7 @@ namespace MonoTests.System.Data.Odbc // assemble here. string col = Encoding.Default.GetString (val, 0, buffstart); - Assertion.AssertEquals ("The assembled value length does not match", - 39, col.Length); + Assert.AreEqual (39, col.Length, "The assembled value length does not match"); } } finally { // clean up @@ -191,15 +184,12 @@ namespace MonoTests.System.Data.Odbc OdbcDataReader reader = cmd.ExecuteReader (CommandBehavior.SequentialAccess); try { if (reader.Read ()) { - Assertion.AssertEquals ("GetBytes on a fixed length column does not work!", - 11, reader.GetBytes (1,0,null,0,0)); - Assertion.AssertEquals ("GetBytes with non null column does not work!", - 39, reader.GetBytes (3,0,null,0,0)); + Assert.AreEqual (11, reader.GetBytes (1,0,null,0,0), "GetBytes on a fixed length column does not work!"); + Assert.AreEqual (39, reader.GetBytes (3,0,null,0,0), "GetBytes with non null column does not work!"); } // for null value, length in bytes should return 0 if (reader.Read ()) - Assertion.AssertEquals ("GetBytes with null column does not return -1" , - -1, reader.GetBytes (3,0,null,0,0)); + AssertEquals ("GetBytes with null column does not return -1" , -1, reader.GetBytes (3,0,null,0,0)); } finally { // clean up if (reader != null && !reader.IsClosed ) @@ -220,8 +210,7 @@ namespace MonoTests.System.Data.Odbc try { if (reader.Read ()) { object ob = reader.GetValue (3); - Assertion.AssertEquals ("Type of binary column is wrong!", - "System.Byte[]", ob.GetType ().ToString () ); + Assert.AreEqual ("System.Byte[]", ob.GetType ().ToString () , "Type of binary column is wrong!"); } } finally { // clean up @@ -243,23 +232,20 @@ namespace MonoTests.System.Data.Odbc try { if (reader.Read ()) { object ob = reader["col_datetime"]; - Assertion.AssertEquals ("Type of datetime column is wrong!", - "System.DateTime", ob.GetType ().ToString () ); + Assert.AreEqual ("System.DateTime", ob.GetType ().ToString () , "Type of datetime column is wrong!"); ob = reader["col_date"]; - Assertion.AssertEquals ("Type of date column is wrong!", - "System.DateTime", ob.GetType ().ToString () ); + Assert.AreEqual ("System.DateTime", ob.GetType ().ToString () , "Type of date column is wrong!"); // FIXME : Once TIME data type is fixed, enable this check //ob = reader["col_time"]; - //Assertion.AssertEquals ("Type of time column is wrong!", - //"System.DateTime", ob.GetType ().ToString () ); + //Assert.AreEqual ("System.DateTime", ob.GetType ().ToString () , "Type of time column is wrong!"); DateTime dt = reader.GetDateTime (4); - Assertion.AssertEquals ("DateValue (SQL_TIMESTAMP) is wrong", new DateTime (2004, 8, 22, 0, 0, 0), dt); + Assert.AreEqual (new DateTime (2004, 8, 22, 0, 0, 0), dt, "DateValue (SQL_TIMESTAMP) is wrong"); dt = reader.GetDateTime (5); - Assertion.AssertEquals ("DateValue (SQL_DATE) is wrong", new DateTime (2004, 8, 22, 0, 0, 0), dt); + Assert.AreEqual (new DateTime (2004, 8, 22, 0, 0, 0), dt, "DateValue (SQL_DATE) is wrong"); // FIXME : Once TIME data type is fixed, enable this check //dt = reader.GetDateTime (7); - //Assertion.AssertEquals ("DateValue is wrong", "2004-08-22", dt.ToString ()); + //Assert.AreEqual ("2004-08-22", dt.ToString (), "DateValue is wrong"); } } finally { // clean up @@ -320,10 +306,8 @@ namespace MonoTests.System.Data.Odbc try { if (reader.Read ()) { object ob = reader.GetValue (0); - Assertion.AssertEquals ("Type of tinyInt column is wrong!", - "System.Byte", ob.GetType ().ToString () ); - Assertion.AssertEquals ("Value of tinyInt column is wrong!", - 1, Convert.ToInt16(ob) ); + Assert.AreEqual ("System.Byte", ob.GetType ().ToString () , "Type of tinyInt column is wrong!"); + Assert.AreEqual (1, Convert.ToInt16(ob) , "Value of tinyInt column is wrong!"); } } finally { // clean up diff --git a/mcs/class/System.Data/Test/System.Data.SqlTypes/ChangeLog b/mcs/class/System.Data/Test/System.Data.SqlTypes/ChangeLog index 533a963d73d..1eca37d3e38 100644 --- a/mcs/class/System.Data/Test/System.Data.SqlTypes/ChangeLog +++ b/mcs/class/System.Data/Test/System.Data.SqlTypes/ChangeLog @@ -1,3 +1,8 @@ +2009-07-13 Atsushi Enomoto + + * SqlGuidTest.cs, SqlDateTimeTest.cs, SqlBinaryTest.cs : + migration to newer nunit style. + 2008-12-30 Gert Driesen * SqlXmlTest.cs: Minor improvements to tests. Marked tests as diff --git a/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlBinaryTest.cs b/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlBinaryTest.cs index f8327b674dd..04e8d7ef788 100644 --- a/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlBinaryTest.cs +++ b/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlBinaryTest.cs @@ -40,7 +40,7 @@ using System.Data.SqlTypes; namespace MonoTests.System.Data.SqlTypes { [TestFixture] - public class SqlBinaryTest : Assertion { + public class SqlBinaryTest { SqlBinary Test1; SqlBinary Test2; @@ -72,14 +72,14 @@ namespace MonoTests.System.Data.SqlTypes { byte [] b = new byte [3]; SqlBinary Test = new SqlBinary (b); - Assert ("#A01", !(Test.IsNull)); + Assert.IsTrue (!(Test.IsNull) , "#A01"); } // Test public fields [Test] public void PublicFields() { - Assert ("#B01", SqlBinary.Null.IsNull); + Assert.IsTrue (SqlBinary.Null.IsNull, "#B01"); } // Test properties @@ -93,51 +93,47 @@ namespace MonoTests.System.Data.SqlTypes SqlBinary TestBinary = new SqlBinary (b); // IsNull - Assert ("#C01", SqlBinary.Null.IsNull); + Assert.IsTrue (SqlBinary.Null.IsNull, "#C01"); // Item - AssertEquals ("#C02", (byte)128, TestBinary [1]); - AssertEquals ("#C03", (byte)64, TestBinary [0]); + Assert.AreEqual ((byte)128, TestBinary [1], "#C02"); + Assert.AreEqual ((byte)64, TestBinary [0], "#C03"); // FIXME: MSDN says that should throw SqlNullValueException // but throws IndexOutOfRangeException try { byte test = TestBinary [TestBinary.Length]; - Fail ("#C04"); + Assert.Fail ("#C04"); } catch (Exception e) { - AssertEquals ("#C05", typeof (IndexOutOfRangeException), - e.GetType ()); + Assert.AreEqual (typeof (IndexOutOfRangeException), e.GetType (), "#C05"); } try { byte test = SqlBinary.Null [2]; - Fail ("#C06"); + Assert.Fail ("#C06"); } catch (Exception e) { - AssertEquals ("#C07", typeof (SqlNullValueException), - e.GetType ()); + Assert.AreEqual (typeof (SqlNullValueException), e.GetType (), "#C07"); } // Length - AssertEquals ("#C08", 2, TestBinary.Length); + Assert.AreEqual (2, TestBinary.Length, "#C08"); try { int test = SqlBinary.Null.Length; - Fail ("#C09"); + Assert.Fail ("#C09"); } catch (Exception e) { - AssertEquals ("#C10", typeof (SqlNullValueException), - e.GetType ()); + Assert.AreEqual (typeof (SqlNullValueException), e.GetType (), "#C10"); } // Value - AssertEquals ("#C11", (byte)128, TestBinary [1]); - AssertEquals ("#C12", (byte)64, TestBinary [0]); + Assert.AreEqual ((byte)128, TestBinary [1], "#C11"); + Assert.AreEqual ((byte)64, TestBinary [0], "#C12"); try { Byte [] test = SqlBinary.Null.Value; - Fail ("#C13"); + Assert.Fail ("#C13"); } catch (Exception e) { - AssertEquals ("#C14", typeof (SqlNullValueException), - e.GetType ()); + Assert.AreEqual (typeof (SqlNullValueException), e.GetType (), "#C14"); } } @@ -146,34 +142,34 @@ namespace MonoTests.System.Data.SqlTypes public void ComparisonMethods() { // GreaterThan - Assert ("#D01", SqlBinary.GreaterThan (Test1, Test2).Value); - Assert ("#D02", SqlBinary.GreaterThan (Test3, Test2).Value); - Assert ("#D03", !SqlBinary.GreaterThan (Test2, Test1).Value); + Assert.IsTrue (SqlBinary.GreaterThan (Test1, Test2).Value, "#D01"); + Assert.IsTrue (SqlBinary.GreaterThan (Test3, Test2).Value, "#D02"); + Assert.IsTrue (!SqlBinary.GreaterThan (Test2, Test1).Value, "#D03"); // GreaterThanOrEqual - Assert ("#D04", SqlBinary.GreaterThanOrEqual (Test1, Test2).Value); - Assert ("#D05", SqlBinary.GreaterThanOrEqual (Test1, Test2).Value); - Assert ("#D06", !SqlBinary.GreaterThanOrEqual (Test2, Test1).Value); + Assert.IsTrue (SqlBinary.GreaterThanOrEqual (Test1, Test2).Value, "#D04"); + Assert.IsTrue (SqlBinary.GreaterThanOrEqual (Test1, Test2).Value, "#D05"); + Assert.IsTrue (!SqlBinary.GreaterThanOrEqual (Test2, Test1).Value, "#D06"); // LessThan - Assert ("#D07", !SqlBinary.LessThan (Test1, Test2).Value); - Assert ("#D08", !SqlBinary.LessThan (Test3, Test2).Value); - Assert ("#D09", SqlBinary.LessThan (Test2, Test1).Value); + Assert.IsTrue (!SqlBinary.LessThan (Test1, Test2).Value, "#D07"); + Assert.IsTrue (!SqlBinary.LessThan (Test3, Test2).Value, "#D08"); + Assert.IsTrue (SqlBinary.LessThan (Test2, Test1).Value, "#D09"); // LessThanOrEqual - Assert ("#D10", !SqlBinary.LessThanOrEqual (Test1, Test2).Value); - Assert ("#D11", SqlBinary.LessThanOrEqual (Test3, Test1).Value); - Assert ("#D12", SqlBinary.LessThanOrEqual (Test2, Test1).Value); + Assert.IsTrue (!SqlBinary.LessThanOrEqual (Test1, Test2).Value, "#D10"); + Assert.IsTrue (SqlBinary.LessThanOrEqual (Test3, Test1).Value, "#D11"); + Assert.IsTrue (SqlBinary.LessThanOrEqual (Test2, Test1).Value, "#D12"); // Equals - Assert ("#D13", !Test1.Equals (Test2)); - Assert ("#D14", !Test3.Equals (Test2)); - Assert ("#D15", Test3.Equals (Test1)); + Assert.IsTrue (!Test1.Equals (Test2), "#D13"); + Assert.IsTrue (!Test3.Equals (Test2), "#D14"); + Assert.IsTrue (Test3.Equals (Test1), "#D15"); // NotEquals - Assert ("#D16", SqlBinary.NotEquals (Test1, Test2).Value); - Assert ("#D17", !SqlBinary.NotEquals (Test3, Test1).Value); - Assert ("#D18", SqlBinary.NotEquals (Test2, Test1).Value); + Assert.IsTrue (SqlBinary.NotEquals (Test1, Test2).Value, "#D16"); + Assert.IsTrue (!SqlBinary.NotEquals (Test3, Test1).Value, "#D17"); + Assert.IsTrue (SqlBinary.NotEquals (Test2, Test1).Value, "#D18"); } [Test] @@ -181,30 +177,29 @@ namespace MonoTests.System.Data.SqlTypes { SqlString TestString = new SqlString ("This is a test"); - Assert ("#E01", Test1.CompareTo(Test2) > 0); - Assert ("#E02", Test2.CompareTo(Test1) < 0); - Assert ("#E03", Test1.CompareTo(Test3) == 0); + Assert.IsTrue (Test1.CompareTo(Test2) > 0, "#E01"); + Assert.IsTrue (Test2.CompareTo(Test1) < 0, "#E02"); + Assert.IsTrue (Test1.CompareTo(Test3) == 0, "#E03"); try { Test1.CompareTo (TestString); - Fail ("#E04"); + Assert.Fail ("#E04"); } catch(Exception e) { - AssertEquals ("#E05", typeof (ArgumentException), e.GetType ()); - } + Assert.AreEqual (typeof (ArgumentException), e.GetType (), "#E05"); + } } [Test] public void GetHashCodeTest() { - AssertEquals ("#F01", Test1.GetHashCode (), Test1.GetHashCode ()); - Assert ("#F02", Test2.GetHashCode () != Test1.GetHashCode ()); + Assert.AreEqual (Test1.GetHashCode (), Test1.GetHashCode (), "#F01"); + Assert.IsTrue (Test2.GetHashCode () != Test1.GetHashCode (), "#F02"); } [Test] public void GetTypeTest() { - AssertEquals("#G01", "System.Data.SqlTypes.SqlBinary", - Test1.GetType().ToString()); + Assert.AreEqual ("System.Data.SqlTypes.SqlBinary", Test1.GetType().ToString(), "#G01"); } [Test] @@ -213,11 +208,11 @@ namespace MonoTests.System.Data.SqlTypes SqlBinary TestBinary; TestBinary = SqlBinary.Concat (Test2, Test3); - AssertEquals ("H01", (byte)15, TestBinary [4]); + Assert.AreEqual ((byte)15, TestBinary [4], "H01"); TestBinary = SqlBinary.Concat (Test1, Test2); - AssertEquals ("#H02", (byte)240, TestBinary [0]); - AssertEquals ("#H03", (byte)15, TestBinary [1]); + Assert.AreEqual ((byte)240, TestBinary [0], "#H02"); + Assert.AreEqual ((byte)15, TestBinary [1], "#H03"); } [Test] @@ -225,14 +220,14 @@ namespace MonoTests.System.Data.SqlTypes { SqlBinary TestBinary = new SqlBinary (new byte [16]); SqlGuid TestGuid = TestBinary.ToSqlGuid (); - Assert ("#I01", !TestGuid.IsNull); + Assert.IsTrue (!TestGuid.IsNull, "#I01"); } [Test] public void ToStringTest() { - AssertEquals ("#J01", "SqlBinary(3)", Test2.ToString ()); - AssertEquals ("#J02", "SqlBinary(2)", Test1.ToString ()); + Assert.AreEqual ("SqlBinary(3)", Test2.ToString (), "#J01"); + Assert.AreEqual ("SqlBinary(2)", Test1.ToString (), "#J02"); } // OPERATORS @@ -240,43 +235,43 @@ namespace MonoTests.System.Data.SqlTypes public void AdditionOperator() { SqlBinary TestBinary = Test1 + Test2; - AssertEquals ("#K01", (byte)240, TestBinary [0]); - AssertEquals ("#K02", (byte)15, TestBinary [1]); + Assert.AreEqual ((byte)240, TestBinary [0], "#K01"); + Assert.AreEqual ((byte)15, TestBinary [1], "#K02"); } [Test] public void ComparisonOperators() { // Equality - Assert ("#L01", !(Test1 == Test2).Value); - Assert ("#L02", (Test3 == Test1).Value); + Assert.IsTrue (!(Test1 == Test2).Value, "#L01"); + Assert.IsTrue ((Test3 == Test1).Value, "#L02"); // Greater than - Assert ("#L03", (Test1 > Test2).Value); - Assert ("#L04", !(Test3 > Test1).Value); + Assert.IsTrue ((Test1 > Test2).Value, "#L03"); + Assert.IsTrue (!(Test3 > Test1).Value, "#L04"); // Greater than or equal - Assert ("#L05", (Test1 >= Test2).Value); - Assert ("#L06", (Test3 >= Test2).Value); + Assert.IsTrue ((Test1 >= Test2).Value, "#L05"); + Assert.IsTrue ((Test3 >= Test2).Value, "#L06"); // Inequality - Assert ("#L07", (Test1 != Test2).Value); - Assert ("#L08", !(Test3 != Test1).Value); + Assert.IsTrue ((Test1 != Test2).Value, "#L07"); + Assert.IsTrue (!(Test3 != Test1).Value, "#L08"); // Less than - Assert ("#L09", !(Test1 < Test2).Value); - Assert ("#L10", !(Test3 < Test2).Value); + Assert.IsTrue (!(Test1 < Test2).Value, "#L09"); + Assert.IsTrue (!(Test3 < Test2).Value, "#L10"); // Less than or equal - Assert ("#L11", !(Test1 <= Test2).Value); - Assert ("#L12", (Test3 <= Test1).Value); + Assert.IsTrue (!(Test1 <= Test2).Value, "#L11"); + Assert.IsTrue ((Test3 <= Test1).Value, "#L12"); } [Test] public void SqlBinaryToByteArray() { byte [] TestByteArray = (Byte[])Test1; - AssertEquals ("#M01", (byte)240, TestByteArray[0]); + Assert.AreEqual ((byte)240, TestByteArray[0], "#M01"); } [Test] @@ -288,7 +283,7 @@ namespace MonoTests.System.Data.SqlTypes SqlGuid TestGuid = new SqlGuid (TestByteArray); SqlBinary TestBinary = (SqlBinary)TestGuid; - AssertEquals ("#N01", (byte)15, TestBinary [0]); + Assert.AreEqual ((byte)15, TestBinary [0], "#N01"); } [Test] @@ -298,14 +293,14 @@ namespace MonoTests.System.Data.SqlTypes TestByteArray [0] = 15; TestByteArray [1] = 200; SqlBinary TestBinary = (SqlBinary)TestByteArray; - AssertEquals ("#O1", (byte)15, TestBinary [0]); + Assert.AreEqual ((byte)15, TestBinary [0], "#O1"); } #if NET_2_0 [Test] public void GetXsdTypeTest () { XmlQualifiedName qualifiedName = SqlBinary.GetXsdType (null); - NUnit.Framework.Assert.AreEqual ("base64Binary", qualifiedName.Name, "#A01"); + Assert.AreEqual ("base64Binary", qualifiedName.Name, "#A01"); } #endif } diff --git a/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlDateTimeTest.cs b/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlDateTimeTest.cs index e7bcb5eda05..8d157f3ef02 100644 --- a/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlDateTimeTest.cs +++ b/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlDateTimeTest.cs @@ -42,7 +42,7 @@ using System.Globalization; namespace MonoTests.System.Data.SqlTypes { [TestFixture] - public class SqlDateTimeTest : Assertion { + public class SqlDateTimeTest { private long[] myTicks = { 631501920000000000L, // 25 Feb 2002 - 00:00:00 @@ -74,49 +74,48 @@ namespace MonoTests.System.Data.SqlTypes // SqlDateTime (DateTime) SqlDateTime CTest = new SqlDateTime ( new DateTime (2002, 5, 19, 3, 34, 0)); - AssertEquals ("#A01", 2002, CTest.Value.Year); + Assert.AreEqual (2002, CTest.Value.Year, "#A01"); // SqlDateTime (int, int) CTest = new SqlDateTime (0, 0); // SqlDateTime (int, int, int) - AssertEquals ("#A02", 1900, CTest.Value.Year); - AssertEquals ("#A03", 1, CTest.Value.Month); - AssertEquals ("#A04", 1, CTest.Value.Day); - AssertEquals ("#A05", 0, CTest.Value.Hour); + Assert.AreEqual (1900, CTest.Value.Year, "#A02"); + Assert.AreEqual (1, CTest.Value.Month, "#A03"); + Assert.AreEqual (1, CTest.Value.Day, "#A04"); + Assert.AreEqual (0, CTest.Value.Hour, "#A05"); // SqlDateTime (int, int, int, int, int, int) CTest = new SqlDateTime (5000, 12, 31); - AssertEquals ("#A06", 5000, CTest.Value.Year); - AssertEquals ("#A07", 12, CTest.Value.Month); - AssertEquals ("#A08", 31, CTest.Value.Day); + Assert.AreEqual (5000, CTest.Value.Year, "#A06"); + Assert.AreEqual (12, CTest.Value.Month, "#A07"); + Assert.AreEqual (31, CTest.Value.Day, "#A08"); // SqlDateTime (int, int, int, int, int, int, double) CTest = new SqlDateTime (1978, 5, 19, 3, 34, 0); - AssertEquals ("#A09", 1978, CTest.Value.Year); - AssertEquals ("#A10", 5, CTest.Value.Month); - AssertEquals ("#A11", 19, CTest.Value.Day); - AssertEquals ("#A12", 3, CTest.Value.Hour); - AssertEquals ("#A13", 34, CTest.Value.Minute); - AssertEquals ("#A14", 0, CTest.Value.Second); + Assert.AreEqual (1978, CTest.Value.Year, "#A09"); + Assert.AreEqual (5, CTest.Value.Month, "#A10"); + Assert.AreEqual (19, CTest.Value.Day, "#A11"); + Assert.AreEqual (3, CTest.Value.Hour, "#A12"); + Assert.AreEqual (34, CTest.Value.Minute, "#A13"); + Assert.AreEqual (0, CTest.Value.Second, "#A14"); try { CTest = new SqlDateTime (10000, 12, 31); - Fail ("#A15"); + Assert.Fail ("#A15"); } catch (Exception e) { - AssertEquals ("#A16", typeof (SqlTypeException), - e.GetType ()); + Assert.AreEqual (typeof (SqlTypeException), e.GetType (), "#A16"); } // SqlDateTime (int, int, int, int, int, int, int) CTest = new SqlDateTime (1978, 5, 19, 3, 34, 0, 12); - AssertEquals ("#A17", 1978, CTest.Value.Year); - AssertEquals ("#A18", 5, CTest.Value.Month); - AssertEquals ("#A19", 19, CTest.Value.Day); - AssertEquals ("#A20", 3, CTest.Value.Hour); - AssertEquals ("#A21", 34, CTest.Value.Minute); - AssertEquals ("#A22", 0, CTest.Value.Second); - AssertEquals ("#A23", 0, CTest.Value.Millisecond); + Assert.AreEqual (1978, CTest.Value.Year, "#A17"); + Assert.AreEqual (5, CTest.Value.Month, "#A18"); + Assert.AreEqual (19, CTest.Value.Day, "#A19"); + Assert.AreEqual (3, CTest.Value.Hour, "#A20"); + Assert.AreEqual (34, CTest.Value.Minute, "#A21"); + Assert.AreEqual (0, CTest.Value.Second, "#A22"); + Assert.AreEqual (0, CTest.Value.Millisecond, "#A23"); } // Test public fields @@ -124,32 +123,32 @@ namespace MonoTests.System.Data.SqlTypes public void PublicFields() { // MaxValue - AssertEquals ("#B01", 9999, SqlDateTime.MaxValue.Value.Year); - AssertEquals ("#B02", 12, SqlDateTime.MaxValue.Value.Month); - AssertEquals ("#B03", 31, SqlDateTime.MaxValue.Value.Day); - AssertEquals ("#B04", 23, SqlDateTime.MaxValue.Value.Hour); - AssertEquals ("#B05", 59, SqlDateTime.MaxValue.Value.Minute); - AssertEquals ("#B06", 59, SqlDateTime.MaxValue.Value.Second); + Assert.AreEqual (9999, SqlDateTime.MaxValue.Value.Year, "#B01"); + Assert.AreEqual (12, SqlDateTime.MaxValue.Value.Month, "#B02"); + Assert.AreEqual (31, SqlDateTime.MaxValue.Value.Day, "#B03"); + Assert.AreEqual (23, SqlDateTime.MaxValue.Value.Hour, "#B04"); + Assert.AreEqual (59, SqlDateTime.MaxValue.Value.Minute, "#B05"); + Assert.AreEqual (59, SqlDateTime.MaxValue.Value.Second, "#B06"); // MinValue - AssertEquals ("#B07", 1753, SqlDateTime.MinValue.Value.Year); - AssertEquals ("#B08", 1, SqlDateTime.MinValue.Value.Month); - AssertEquals ("#B09", 1, SqlDateTime.MinValue.Value.Day); - AssertEquals ("#B10", 0, SqlDateTime.MinValue.Value.Hour); - AssertEquals ("#B11", 0, SqlDateTime.MinValue.Value.Minute); - AssertEquals ("#B12", 0, SqlDateTime.MinValue.Value.Second); + Assert.AreEqual (1753, SqlDateTime.MinValue.Value.Year, "#B07"); + Assert.AreEqual (1, SqlDateTime.MinValue.Value.Month, "#B08"); + Assert.AreEqual (1, SqlDateTime.MinValue.Value.Day, "#B09"); + Assert.AreEqual (0, SqlDateTime.MinValue.Value.Hour, "#B10"); + Assert.AreEqual (0, SqlDateTime.MinValue.Value.Minute, "#B11"); + Assert.AreEqual (0, SqlDateTime.MinValue.Value.Second, "#B12"); // Null - Assert ("#B13", SqlDateTime.Null.IsNull); + Assert.IsTrue (SqlDateTime.Null.IsNull, "#B13"); // SQLTicksPerHour - AssertEquals ("#B14", 1080000, SqlDateTime.SQLTicksPerHour); + Assert.AreEqual (1080000, SqlDateTime.SQLTicksPerHour, "#B14"); // SQLTicksPerMinute - AssertEquals ("#B15", 18000, SqlDateTime.SQLTicksPerMinute); + Assert.AreEqual (18000, SqlDateTime.SQLTicksPerMinute, "#B15"); // SQLTicksPerSecond - AssertEquals ("#B16", 300, SqlDateTime.SQLTicksPerSecond); + Assert.AreEqual (300, SqlDateTime.SQLTicksPerSecond, "#B16"); } // Test properties @@ -157,34 +156,32 @@ namespace MonoTests.System.Data.SqlTypes public void Properties() { // DayTicks - AssertEquals ("#C01", 37546, Test1.DayTicks); + Assert.AreEqual (37546, Test1.DayTicks, "#C01"); try { int test = SqlDateTime.Null.DayTicks; - Fail ("#C02"); + Assert.Fail ("#C02"); } catch (Exception e) { - AssertEquals ("#C03", typeof (SqlNullValueException), - e.GetType ()); + Assert.AreEqual (typeof (SqlNullValueException), e.GetType (), "#C03"); } // IsNull - Assert ("#C04", SqlDateTime.Null.IsNull); - Assert ("#C05", !Test2.IsNull); + Assert.IsTrue (SqlDateTime.Null.IsNull, "#C04"); + Assert.IsTrue (!Test2.IsNull, "#C05"); // TimeTicks - AssertEquals ("#C06", 10440000, Test1.TimeTicks); + Assert.AreEqual (10440000, Test1.TimeTicks, "#C06"); try { int test = SqlDateTime.Null.TimeTicks; - Fail ("#C07"); + Assert.Fail ("#C07"); } catch (Exception e) { - AssertEquals ("#C08", typeof (SqlNullValueException), - e.GetType ()); + Assert.AreEqual (typeof (SqlNullValueException), e.GetType (), "#C08"); } // Value - AssertEquals ("#C09", 2003, Test2.Value.Year); - AssertEquals ("#C10", 2002, Test1.Value.Year); + Assert.AreEqual (2003, Test2.Value.Year, "#C09"); + Assert.AreEqual (2002, Test1.Value.Year, "#C10"); } // PUBLIC METHODS @@ -194,84 +191,82 @@ namespace MonoTests.System.Data.SqlTypes { SqlString TestString = new SqlString ("This is a test"); - Assert ("#D01", Test1.CompareTo (Test3) < 0); - Assert ("#D02", Test2.CompareTo (Test1) > 0); - Assert ("#D03", Test2.CompareTo (Test3) == 0); - Assert ("#D04", Test1.CompareTo (SqlDateTime.Null) > 0); + Assert.IsTrue (Test1.CompareTo (Test3) < 0, "#D01"); + Assert.IsTrue (Test2.CompareTo (Test1) > 0, "#D02"); + Assert.IsTrue (Test2.CompareTo (Test3) == 0, "#D03"); + Assert.IsTrue (Test1.CompareTo (SqlDateTime.Null) > 0, "#D04"); try { Test1.CompareTo (TestString); - Fail("#D05"); + Assert.Fail("#D05"); } catch(Exception e) { - AssertEquals ("#D06", typeof (ArgumentException), e.GetType ()); + Assert.AreEqual (typeof (ArgumentException), e.GetType (), "#D06"); } } [Test] public void EqualsMethods() { - Assert ("#E01", !Test1.Equals (Test2)); - Assert ("#E03", !Test2.Equals (new SqlString ("TEST"))); - Assert ("#E04", Test2.Equals (Test3)); + Assert.IsTrue (!Test1.Equals (Test2), "#E01"); + Assert.IsTrue (!Test2.Equals (new SqlString ("TEST")), "#E03"); + Assert.IsTrue (Test2.Equals (Test3), "#E04"); // Static Equals()-method - Assert ("#E05", SqlDateTime.Equals (Test2, Test3).Value); - Assert ("#E06", !SqlDateTime.Equals (Test1, Test2).Value); + Assert.IsTrue (SqlDateTime.Equals (Test2, Test3).Value, "#E05"); + Assert.IsTrue (!SqlDateTime.Equals (Test1, Test2).Value, "#E06"); } [Test] public void GetHashCodeTest() { // FIXME: Better way to test HashCode - AssertEquals ("#F01", Test1.GetHashCode (), Test1.GetHashCode ()); - Assert ("#F02", Test2.GetHashCode () != Test1.GetHashCode ()); + Assert.AreEqual (Test1.GetHashCode (), Test1.GetHashCode (), "#F01"); + Assert.IsTrue (Test2.GetHashCode () != Test1.GetHashCode (), "#F02"); } [Test] public void GetTypeTest() { - AssertEquals ("#G01", "System.Data.SqlTypes.SqlDateTime", - Test1.GetType ().ToString ()); - AssertEquals ("#G02", "System.DateTime", - Test1.Value.GetType ().ToString ()); + Assert.AreEqual ("System.Data.SqlTypes.SqlDateTime", Test1.GetType ().ToString (), "#G01"); + Assert.AreEqual ("System.DateTime", Test1.Value.GetType ().ToString (), "#G02"); } [Test] public void Greaters() { // GreateThan () - Assert ("#H01", !SqlDateTime.GreaterThan (Test1, Test2).Value); - Assert ("#H02", SqlDateTime.GreaterThan (Test2, Test1).Value); - Assert ("#H03", !SqlDateTime.GreaterThan (Test2, Test3).Value); + Assert.IsTrue (!SqlDateTime.GreaterThan (Test1, Test2).Value, "#H01"); + Assert.IsTrue (SqlDateTime.GreaterThan (Test2, Test1).Value, "#H02"); + Assert.IsTrue (!SqlDateTime.GreaterThan (Test2, Test3).Value, "#H03"); // GreaterTharOrEqual () - Assert ("#H04", !SqlDateTime.GreaterThanOrEqual (Test1, Test2).Value); - Assert ("#H05", SqlDateTime.GreaterThanOrEqual (Test2, Test1).Value); - Assert ("#H06", SqlDateTime.GreaterThanOrEqual (Test2, Test3).Value); + Assert.IsTrue (!SqlDateTime.GreaterThanOrEqual (Test1, Test2).Value, "#H04"); + Assert.IsTrue (SqlDateTime.GreaterThanOrEqual (Test2, Test1).Value, "#H05"); + Assert.IsTrue (SqlDateTime.GreaterThanOrEqual (Test2, Test3).Value, "#H06"); } [Test] public void Lessers() { // LessThan() - Assert ("#I01", !SqlDateTime.LessThan (Test2, Test3).Value); - Assert ("#I02", !SqlDateTime.LessThan (Test2, Test1).Value); - Assert ("#I03", SqlDateTime.LessThan (Test1, Test3).Value); + Assert.IsTrue (!SqlDateTime.LessThan (Test2, Test3).Value, "#I01"); + Assert.IsTrue (!SqlDateTime.LessThan (Test2, Test1).Value, "#I02"); + Assert.IsTrue (SqlDateTime.LessThan (Test1, Test3).Value, "#I03"); // LessThanOrEqual () - Assert ("#I04", SqlDateTime.LessThanOrEqual (Test1, Test2).Value); - Assert ("#I05", !SqlDateTime.LessThanOrEqual (Test2, Test1).Value); - Assert ("#I06", SqlDateTime.LessThanOrEqual (Test3, Test2).Value); - Assert ("#I07", SqlDateTime.LessThanOrEqual (Test1, SqlDateTime.Null).IsNull); + Assert.IsTrue (SqlDateTime.LessThanOrEqual (Test1, Test2).Value, "#I04"); + Assert.IsTrue (!SqlDateTime.LessThanOrEqual (Test2, Test1).Value, "#I05"); + Assert.IsTrue (SqlDateTime.LessThanOrEqual (Test3, Test2).Value, "#I06"); + Assert.IsTrue (SqlDateTime.LessThanOrEqual (Test1, SqlDateTime.Null).IsNull, "#I07"); } [Test] public void NotEquals() { - Assert ("#J01", SqlDateTime.NotEquals (Test1, Test2).Value); - Assert ("#J02", SqlDateTime.NotEquals (Test3, Test1).Value); - Assert ("#J03", !SqlDateTime.NotEquals (Test2, Test3).Value); - Assert ("#J04", SqlDateTime.NotEquals (SqlDateTime.Null, Test2).IsNull); + Assert.IsTrue (SqlDateTime.NotEquals (Test1, Test2).Value, "#J01"); + Assert.IsTrue (SqlDateTime.NotEquals (Test3, Test1).Value, "#J02"); + Assert.IsTrue (!SqlDateTime.NotEquals (Test2, Test3).Value, "#J03"); + Assert.IsTrue (SqlDateTime.NotEquals (SqlDateTime.Null, Test2).IsNull, "#J04"); } [Test] @@ -279,90 +274,88 @@ namespace MonoTests.System.Data.SqlTypes { try { SqlDateTime.Parse (null); - Fail ("#K01"); + Assert.Fail ("#K01"); } catch (Exception e) { - AssertEquals ("#K02", typeof (ArgumentNullException), - e.GetType ()); + Assert.AreEqual (typeof (ArgumentNullException), e.GetType (), "#K02"); } try { SqlDateTime.Parse ("not-a-number"); - Fail ("#K03"); + Assert.Fail ("#K03"); } catch (Exception e) { - AssertEquals ("#K04", typeof (FormatException), - e.GetType ()); + Assert.AreEqual (typeof (FormatException), e.GetType (), "#K04"); } SqlDateTime t1 = SqlDateTime.Parse ("02/25/2002"); - AssertEquals ("#K05", myTicks[0], t1.Value.Ticks); + Assert.AreEqual (myTicks[0], t1.Value.Ticks, "#K05"); try { t1 = SqlDateTime.Parse ("2002-02-25"); } catch (Exception e) { - Fail ("#K06 " + e); + Assert.Fail ("#K06 " + e); } // Thanks for Martin Baulig for these (DateTimeTest.cs) - AssertEquals ("#K07", myTicks[0], t1.Value.Ticks); + Assert.AreEqual (myTicks[0], t1.Value.Ticks, "#K07"); t1 = SqlDateTime.Parse ("Monday, 25 February 2002"); - AssertEquals ("#K08", myTicks[0], t1.Value.Ticks); + Assert.AreEqual (myTicks[0], t1.Value.Ticks, "#K08"); t1 = SqlDateTime.Parse ("Monday, 25 February 2002 05:25"); - AssertEquals ("#K09", myTicks[3], t1.Value.Ticks); + Assert.AreEqual (myTicks[3], t1.Value.Ticks, "#K09"); t1 = SqlDateTime.Parse ("Monday, 25 February 2002 05:25:13"); - AssertEquals ("#K10", myTicks[4], t1.Value.Ticks); + Assert.AreEqual (myTicks[4], t1.Value.Ticks, "#K10"); t1 = SqlDateTime.Parse ("02/25/2002 05:25"); - AssertEquals ("#K11", myTicks[3], t1.Value.Ticks); + Assert.AreEqual (myTicks[3], t1.Value.Ticks, "#K11"); t1 = SqlDateTime.Parse ("02/25/2002 05:25:13"); - AssertEquals ("#K12", myTicks[4], t1.Value.Ticks); + Assert.AreEqual (myTicks[4], t1.Value.Ticks, "#K12"); t1 = SqlDateTime.Parse ("2002-02-25 04:25:13Z"); t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1.Value); - AssertEquals ("#K13", 2002, t1.Value.Year); - AssertEquals ("#K14", 02, t1.Value.Month); - AssertEquals ("#K15", 25, t1.Value.Day); - AssertEquals ("#K16", 04, t1.Value.Hour); - AssertEquals ("#K17", 25, t1.Value.Minute); - AssertEquals ("#K18", 13, t1.Value.Second); + Assert.AreEqual (2002, t1.Value.Year, "#K13"); + Assert.AreEqual (02, t1.Value.Month, "#K14"); + Assert.AreEqual (25, t1.Value.Day, "#K15"); + Assert.AreEqual (04, t1.Value.Hour, "#K16"); + Assert.AreEqual (25, t1.Value.Minute, "#K17"); + Assert.AreEqual (13, t1.Value.Second, "#K18"); SqlDateTime t2 = new SqlDateTime (DateTime.Today.Year, 2, 25); t1 = SqlDateTime.Parse ("February 25"); - AssertEquals ("#K19", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual (t2.Value.Ticks, t1.Value.Ticks, "#K19"); t2 = new SqlDateTime (DateTime.Today.Year, 2, 8); t1 = SqlDateTime.Parse ("February 08"); - AssertEquals ("#K20", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual (t2.Value.Ticks, t1.Value.Ticks, "#K20"); t1 = SqlDateTime.Parse ("Mon, 25 Feb 2002 04:25:13 GMT"); t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1.Value); - AssertEquals ("#K21", 2002, t1.Value.Year); - AssertEquals ("#K22", 02, t1.Value.Month); - AssertEquals ("#K23", 25, t1.Value.Day); - AssertEquals ("#K24", 04, t1.Value.Hour); - AssertEquals ("#K25", 25, t1.Value.Minute); - AssertEquals ("#K26", 13, t1.Value.Second); + Assert.AreEqual (2002, t1.Value.Year, "#K21"); + Assert.AreEqual (02, t1.Value.Month, "#K22"); + Assert.AreEqual (25, t1.Value.Day, "#K23"); + Assert.AreEqual (04, t1.Value.Hour, "#K24"); + Assert.AreEqual (25, t1.Value.Minute, "#K25"); + Assert.AreEqual (13, t1.Value.Second, "#K26"); t1 = SqlDateTime.Parse ("2002-02-25T05:25:13"); - AssertEquals ("#K27", myTicks[4], t1.Value.Ticks); + Assert.AreEqual (myTicks[4], t1.Value.Ticks, "#K27"); t2 = DateTime.Today + new TimeSpan (5,25,0); t1 = SqlDateTime.Parse ("05:25"); - AssertEquals("#K28", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual(t2.Value.Ticks, t1.Value.Ticks, "#K28"); t2 = DateTime.Today + new TimeSpan (5,25,13); t1 = SqlDateTime.Parse ("05:25:13"); - AssertEquals("#K29", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual(t2.Value.Ticks, t1.Value.Ticks, "#K29"); t2 = new SqlDateTime (2002, 2, 1); t1 = SqlDateTime.Parse ("2002 February"); - AssertEquals ("#K30", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual (t2.Value.Ticks, t1.Value.Ticks, "#K30"); t2 = new SqlDateTime (2002, 2, 1); t1 = SqlDateTime.Parse ("2002 February"); - AssertEquals ("#K31", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual (t2.Value.Ticks, t1.Value.Ticks, "#K31"); t2 = new SqlDateTime (DateTime.Today.Year, 2, 8); t1 = SqlDateTime.Parse ("February 8"); - AssertEquals ("#K32", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual (t2.Value.Ticks, t1.Value.Ticks, "#K32"); } [Test] @@ -377,8 +370,8 @@ namespace MonoTests.System.Data.SqlTypes SqlDateTime t2 = new SqlDateTime (2002, 2, 25, 15, 25, 13); // Standard patterns - AssertEquals("L01", "2/25/2002 5:25:13 AM", t1.ToString ()); - AssertEquals("L02", (SqlString)"2/25/2002 5:25:13 AM", t1.ToSqlString ()); + Assert.AreEqual("2/25/2002 5:25:13 AM", t1.ToString (), "L01"); + Assert.AreEqual((SqlString)"2/25/2002 5:25:13 AM", t1.ToSqlString (), "L02"); } // OPERATORS @@ -390,34 +383,34 @@ namespace MonoTests.System.Data.SqlTypes // "+"-operator ResultDateTime = Test1 + TestSpan; - AssertEquals ("#M01", 2002, ResultDateTime.Value.Year); - AssertEquals ("#M02", 8, ResultDateTime.Value.Day); - AssertEquals ("#M03", 11, ResultDateTime.Value.Hour); - AssertEquals ("#M04", 0, ResultDateTime.Value.Minute); - AssertEquals ("#M05", 20, ResultDateTime.Value.Second); - Assert ("#M06", (SqlDateTime.Null + TestSpan).IsNull); + Assert.AreEqual (2002, ResultDateTime.Value.Year, "#M01"); + Assert.AreEqual (8, ResultDateTime.Value.Day, "#M02"); + Assert.AreEqual (11, ResultDateTime.Value.Hour, "#M03"); + Assert.AreEqual (0, ResultDateTime.Value.Minute, "#M04"); + Assert.AreEqual (20, ResultDateTime.Value.Second, "#M05"); + Assert.IsTrue ((SqlDateTime.Null + TestSpan).IsNull, "#M06"); try { ResultDateTime = SqlDateTime.MaxValue + TestSpan; - Fail ("#M07"); + Assert.Fail ("#M07"); } catch (Exception e) { - AssertEquals ("#M08", typeof (ArgumentOutOfRangeException), e.GetType ()); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), e.GetType (), "#M08"); } // "-"-operator ResultDateTime = Test1 - TestSpan; - AssertEquals ("#M09", 2002, ResultDateTime.Value.Year); - AssertEquals ("#M10", 29, ResultDateTime.Value.Day); - AssertEquals ("#M11", 8, ResultDateTime.Value.Hour); - AssertEquals ("#M12", 19, ResultDateTime.Value.Minute); - AssertEquals ("#M13", 40, ResultDateTime.Value.Second); - Assert ("#M14", (SqlDateTime.Null - TestSpan).IsNull); + Assert.AreEqual (2002, ResultDateTime.Value.Year, "#M09"); + Assert.AreEqual (29, ResultDateTime.Value.Day, "#M10"); + Assert.AreEqual (8, ResultDateTime.Value.Hour, "#M11"); + Assert.AreEqual (19, ResultDateTime.Value.Minute, "#M12"); + Assert.AreEqual (40, ResultDateTime.Value.Second, "#M13"); + Assert.IsTrue ((SqlDateTime.Null - TestSpan).IsNull, "#M14"); try { ResultDateTime = SqlDateTime.MinValue - TestSpan; - Fail ("#M15"); + Assert.Fail ("#M15"); } catch (Exception e) { - AssertEquals ("#M16", typeof (SqlTypeException), e.GetType ()); + Assert.AreEqual (typeof (SqlTypeException), e.GetType (), "#M16"); } } @@ -425,49 +418,49 @@ namespace MonoTests.System.Data.SqlTypes public void ThanOrEqualOperators() { // == -operator - Assert ("#N01", (Test2 == Test3).Value); - Assert ("#N02", !(Test1 == Test2).Value); - Assert ("#N03", (Test1 == SqlDateTime.Null).IsNull); + Assert.IsTrue ((Test2 == Test3).Value, "#N01"); + Assert.IsTrue (!(Test1 == Test2).Value, "#N02"); + Assert.IsTrue ((Test1 == SqlDateTime.Null).IsNull, "#N03"); // != -operator - Assert ("#N04", !(Test2 != Test3).Value); - Assert ("#N05", (Test1 != Test3).Value); - Assert ("#N06", (Test1 != SqlDateTime.Null).IsNull); + Assert.IsTrue (!(Test2 != Test3).Value, "#N04"); + Assert.IsTrue ((Test1 != Test3).Value, "#N05"); + Assert.IsTrue ((Test1 != SqlDateTime.Null).IsNull, "#N06"); // > -operator - Assert ("#N07", (Test2 > Test1).Value); - Assert ("#N08", !(Test3 > Test2).Value); - Assert ("#N09", (Test1 > SqlDateTime.Null).IsNull); + Assert.IsTrue ((Test2 > Test1).Value, "#N07"); + Assert.IsTrue (!(Test3 > Test2).Value, "#N08"); + Assert.IsTrue ((Test1 > SqlDateTime.Null).IsNull, "#N09"); // >= -operator - Assert ("#N10", !(Test1 >= Test3).Value); - Assert ("#N11", (Test3 >= Test1).Value); - Assert ("#N12", (Test2 >= Test3).Value); - Assert ("#N13", (Test1 >= SqlDateTime.Null).IsNull); + Assert.IsTrue (!(Test1 >= Test3).Value, "#N10"); + Assert.IsTrue ((Test3 >= Test1).Value, "#N11"); + Assert.IsTrue ((Test2 >= Test3).Value, "#N12"); + Assert.IsTrue ((Test1 >= SqlDateTime.Null).IsNull, "#N13"); // < -operator - Assert ("#N14", !(Test2 < Test1).Value); - Assert ("#N15", (Test1 < Test3).Value); - Assert ("#N16", !(Test2 < Test3).Value); - Assert ("#N17", (Test1 < SqlDateTime.Null).IsNull); + Assert.IsTrue (!(Test2 < Test1).Value, "#N14"); + Assert.IsTrue ((Test1 < Test3).Value, "#N15"); + Assert.IsTrue (!(Test2 < Test3).Value, "#N16"); + Assert.IsTrue ((Test1 < SqlDateTime.Null).IsNull, "#N17"); // <= -operator - Assert ("#N18", (Test1 <= Test3).Value); - Assert ("#N19", !(Test3 <= Test1).Value); - Assert ("#N20", (Test2 <= Test3).Value); - Assert ("#N21", (Test1 <= SqlDateTime.Null).IsNull); + Assert.IsTrue ((Test1 <= Test3).Value, "#N18"); + Assert.IsTrue (!(Test3 <= Test1).Value, "#N19"); + Assert.IsTrue ((Test2 <= Test3).Value, "#N20"); + Assert.IsTrue ((Test1 <= SqlDateTime.Null).IsNull, "#N21"); } [Test] public void SqlDateTimeToDateTime() { - AssertEquals ("O01", 2002, ((DateTime)Test1).Year); - AssertEquals ("O03", 2003, ((DateTime)Test2).Year); - AssertEquals ("O04", 10, ((DateTime)Test1).Month); - AssertEquals ("O05", 19, ((DateTime)Test1).Day); - AssertEquals ("O06", 9, ((DateTime)Test1).Hour); - AssertEquals ("O07", 40, ((DateTime)Test1).Minute); - AssertEquals ("O08", 0, ((DateTime)Test1).Second); + Assert.AreEqual (2002, ((DateTime)Test1).Year, "O01"); + Assert.AreEqual (2003, ((DateTime)Test2).Year, "O03"); + Assert.AreEqual (10, ((DateTime)Test1).Month, "O04"); + Assert.AreEqual (19, ((DateTime)Test1).Day, "O05"); + Assert.AreEqual (9, ((DateTime)Test1).Hour, "O06"); + Assert.AreEqual (40, ((DateTime)Test1).Minute, "O07"); + Assert.AreEqual (0, ((DateTime)Test1).Second, "O08"); } [Test] @@ -477,69 +470,69 @@ namespace MonoTests.System.Data.SqlTypes SqlString TestString = new SqlString ("02/25/2002"); SqlDateTime t1 = (SqlDateTime)TestString; - AssertEquals ("#P01", myTicks[0], t1.Value.Ticks); + Assert.AreEqual (myTicks[0], t1.Value.Ticks, "#P01"); // Thanks for Martin Baulig for these (DateTimeTest.cs) - AssertEquals ("#P02", myTicks[0], t1.Value.Ticks); + Assert.AreEqual (myTicks[0], t1.Value.Ticks, "#P02"); t1 = (SqlDateTime) new SqlString ("Monday, 25 February 2002"); - AssertEquals ("#P04", myTicks[0], t1.Value.Ticks); + Assert.AreEqual (myTicks[0], t1.Value.Ticks, "#P04"); t1 = (SqlDateTime) new SqlString ("Monday, 25 February 2002 05:25"); - AssertEquals ("#P05", myTicks[3], t1.Value.Ticks); + Assert.AreEqual (myTicks[3], t1.Value.Ticks, "#P05"); t1 = (SqlDateTime) new SqlString ("Monday, 25 February 2002 05:25:13"); - AssertEquals ("#P05", myTicks[4], t1.Value.Ticks); + Assert.AreEqual (myTicks[4], t1.Value.Ticks, "#P05"); t1 = (SqlDateTime) new SqlString ("02/25/2002 05:25"); - AssertEquals ("#P06", myTicks[3], t1.Value.Ticks); + Assert.AreEqual (myTicks[3], t1.Value.Ticks, "#P06"); t1 = (SqlDateTime) new SqlString ("02/25/2002 05:25:13"); - AssertEquals ("#P07", myTicks[4], t1.Value.Ticks); + Assert.AreEqual (myTicks[4], t1.Value.Ticks, "#P07"); t1 = (SqlDateTime) new SqlString ("2002-02-25 04:25:13Z"); t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1.Value); - AssertEquals ("#P08", 2002, t1.Value.Year); - AssertEquals ("#P09", 02, t1.Value.Month); - AssertEquals ("#P10", 25, t1.Value.Day); - AssertEquals ("#P11", 04, t1.Value.Hour); - AssertEquals ("#P12", 25, t1.Value.Minute); - AssertEquals ("#P13", 13, t1.Value.Second); + Assert.AreEqual (2002, t1.Value.Year, "#P08"); + Assert.AreEqual (02, t1.Value.Month, "#P09"); + Assert.AreEqual (25, t1.Value.Day, "#P10"); + Assert.AreEqual (04, t1.Value.Hour, "#P11"); + Assert.AreEqual (25, t1.Value.Minute, "#P12"); + Assert.AreEqual (13, t1.Value.Second, "#P13"); SqlDateTime t2 = new SqlDateTime (DateTime.Today.Year, 2, 25); t1 = (SqlDateTime) new SqlString ("February 25"); - AssertEquals ("#P14", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual (t2.Value.Ticks, t1.Value.Ticks, "#P14"); t2 = new SqlDateTime (DateTime.Today.Year, 2, 8); t1 = (SqlDateTime) new SqlString ("February 08"); - AssertEquals ("#P15", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual (t2.Value.Ticks, t1.Value.Ticks, "#P15"); t1 = (SqlDateTime) new SqlString ("Mon, 25 Feb 2002 04:25:13 GMT"); t1 = TimeZone.CurrentTimeZone.ToUniversalTime(t1.Value); - AssertEquals ("#P16", 2002, t1.Value.Year); - AssertEquals ("#P17", 02, t1.Value.Month); - AssertEquals ("#P18", 25, t1.Value.Day); - AssertEquals ("#P19", 04, t1.Value.Hour); - AssertEquals ("#P20", 25, t1.Value.Minute); - AssertEquals ("#P21", 13, t1.Value.Second); + Assert.AreEqual (2002, t1.Value.Year, "#P16"); + Assert.AreEqual (02, t1.Value.Month, "#P17"); + Assert.AreEqual (25, t1.Value.Day, "#P18"); + Assert.AreEqual (04, t1.Value.Hour, "#P19"); + Assert.AreEqual (25, t1.Value.Minute, "#P20"); + Assert.AreEqual (13, t1.Value.Second, "#P21"); t1 = (SqlDateTime) new SqlString ("2002-02-25T05:25:13"); - AssertEquals ("#P22", myTicks[4], t1.Value.Ticks); + Assert.AreEqual (myTicks[4], t1.Value.Ticks, "#P22"); t2 = DateTime.Today + new TimeSpan (5,25,0); t1 = (SqlDateTime) new SqlString ("05:25"); - AssertEquals("#P23", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual(t2.Value.Ticks, t1.Value.Ticks, "#P23"); t2 = DateTime.Today + new TimeSpan (5,25,13); t1 = (SqlDateTime) new SqlString ("05:25:13"); - AssertEquals("#P24", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual(t2.Value.Ticks, t1.Value.Ticks, "#P24"); t2 = new SqlDateTime (2002, 2, 1); t1 = (SqlDateTime) new SqlString ("2002 February"); - AssertEquals ("#P25", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual (t2.Value.Ticks, t1.Value.Ticks, "#P25"); t2 = new SqlDateTime (2002, 2, 1); t1 = (SqlDateTime) new SqlString ("2002 February"); - AssertEquals ("#P26", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual (t2.Value.Ticks, t1.Value.Ticks, "#P26"); t2 = new SqlDateTime (DateTime.Today.Year, 2, 8); t1 = (SqlDateTime) new SqlString ("February 8"); - AssertEquals ("#P27", t2.Value.Ticks, t1.Value.Ticks); + Assert.AreEqual (t2.Value.Ticks, t1.Value.Ticks, "#P27"); } [Test] @@ -547,12 +540,12 @@ namespace MonoTests.System.Data.SqlTypes { DateTime DateTimeTest = new DateTime (2002, 10, 19, 11, 53, 4); SqlDateTime Result = (SqlDateTime)DateTimeTest; - AssertEquals ("#Q01", 2002, Result.Value.Year); - AssertEquals ("#Q02", 10, Result.Value.Month); - AssertEquals ("#Q03", 19, Result.Value.Day); - AssertEquals ("#Q04", 11, Result.Value.Hour); - AssertEquals ("#Q05", 53, Result.Value.Minute); - AssertEquals ("#Q06", 4, Result.Value.Second); + Assert.AreEqual (2002, Result.Value.Year, "#Q01"); + Assert.AreEqual (10, Result.Value.Month, "#Q02"); + Assert.AreEqual (19, Result.Value.Day, "#Q03"); + Assert.AreEqual (11, Result.Value.Hour, "#Q04"); + Assert.AreEqual (53, Result.Value.Minute, "#Q05"); + Assert.AreEqual (4, Result.Value.Second, "#Q06"); } [Test] @@ -561,13 +554,13 @@ namespace MonoTests.System.Data.SqlTypes SqlDateTime d1 = new SqlDateTime (2007, 05, 04, 18, 02, 40, 398.25); SqlDateTime d2 = new SqlDateTime (d1.DayTicks, d1.TimeTicks); - AssertEquals ("#R01", 39204, d1.DayTicks); - AssertEquals ("#R02", 19488119, d1.TimeTicks); - AssertEquals ("#R03", 633138985603970000, d1.Value.Ticks); - AssertEquals ("#R04", d1.DayTicks, d2.DayTicks); - AssertEquals ("#R05", d1.TimeTicks, d2.TimeTicks); - AssertEquals ("#R06", d1.Value.Ticks, d2.Value.Ticks); - AssertEquals ("#R07", d1, d2); + Assert.AreEqual (39204, d1.DayTicks, "#R01"); + Assert.AreEqual (19488119, d1.TimeTicks, "#R02"); + Assert.AreEqual (633138985603970000, d1.Value.Ticks, "#R03"); + Assert.AreEqual (d1.DayTicks, d2.DayTicks, "#R04"); + Assert.AreEqual (d1.TimeTicks, d2.TimeTicks, "#R05"); + Assert.AreEqual (d1.Value.Ticks, d2.Value.Ticks, "#R06"); + Assert.AreEqual (d1, d2, "#R07"); } [Test] @@ -575,9 +568,9 @@ namespace MonoTests.System.Data.SqlTypes { SqlDateTime d1 = new SqlDateTime (2007, 05, 04, 18, 02, 40, 398252); - AssertEquals ("#S01", 39204, d1.DayTicks); - AssertEquals ("#S02", 19488119, d1.TimeTicks); - AssertEquals ("#R03", 633138985603970000, d1.Value.Ticks); + Assert.AreEqual (39204, d1.DayTicks, "#S01"); + Assert.AreEqual (19488119, d1.TimeTicks, "#S02"); + Assert.AreEqual (633138985603970000, d1.Value.Ticks, "#R03"); } #if NET_2_0 diff --git a/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlGuidTest.cs b/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlGuidTest.cs index ed1085e81ab..a2986aa534d 100644 --- a/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlGuidTest.cs +++ b/mcs/class/System.Data/Test/System.Data.SqlTypes/SqlGuidTest.cs @@ -40,7 +40,7 @@ using System.Data.SqlTypes; namespace MonoTests.System.Data.SqlTypes { [TestFixture] - public class SqlGuidTest : Assertion { + public class SqlGuidTest { // 00000a01-0000-0000-0000-000000000000 private SqlGuid Test1; @@ -98,7 +98,7 @@ namespace MonoTests.System.Data.SqlTypes Test = new SqlGuid (10, 1, 2, 13, 14, 15, 16, 17, 19, 20 ,21); } catch (Exception e) { - Fail ("#A01 " + e); + Assert.Fail ("#A01 " + e); } } @@ -106,7 +106,7 @@ namespace MonoTests.System.Data.SqlTypes [Test] public void PublicFields() { - Assert ("#B01", SqlGuid.Null.IsNull); + Assert.IsTrue (SqlGuid.Null.IsNull, "#B01"); } // Test properties @@ -114,9 +114,9 @@ namespace MonoTests.System.Data.SqlTypes public void Properties() { Guid ResultGuid = new Guid ("00000f64-0000-0000-0000-000000000000"); - Assert ("#C01", !Test1.IsNull); - Assert ("#C02", SqlGuid.Null.IsNull); - AssertEquals ("#C03", ResultGuid, Test2.Value); + Assert.IsTrue (!Test1.IsNull, "#C01"); + Assert.IsTrue (SqlGuid.Null.IsNull, "#C02"); + Assert.AreEqual (ResultGuid, Test2.Value, "#C03"); } // PUBLIC METHODS @@ -127,85 +127,85 @@ namespace MonoTests.System.Data.SqlTypes SqlGuid test1 = new SqlGuid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE"); SqlGuid test2 = new SqlGuid("1AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"); SqlGuid test3 = new SqlGuid("1AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"); - Assert ("#D01", Test1.CompareTo (Test3) < 0); - Assert ("#D02", Test4.CompareTo (Test1) > 0); - Assert ("#D03", Test3.CompareTo (Test2) == 0); - Assert ("#D04", Test4.CompareTo (SqlGuid.Null) > 0); - Assert ("#D05", test1.CompareTo (test2) > 0); - Assert ("#D06", test3.CompareTo (test2) < 0); + Assert.IsTrue (Test1.CompareTo (Test3) < 0, "#D01"); + Assert.IsTrue (Test4.CompareTo (Test1) > 0, "#D02"); + Assert.IsTrue (Test3.CompareTo (Test2) == 0, "#D03"); + Assert.IsTrue (Test4.CompareTo (SqlGuid.Null) > 0, "#D04"); + Assert.IsTrue (test1.CompareTo (test2) > 0, "#D05"); + Assert.IsTrue (test3.CompareTo (test2) < 0, "#D06"); try { Test1.CompareTo (TestString); - Fail("#D05"); + Assert.Fail("#D05"); } catch(Exception e) { - AssertEquals ("#D06", typeof (ArgumentException), e.GetType ()); + Assert.AreEqual (typeof (ArgumentException), e.GetType (), "#D06"); } } [Test] public void EqualsMethods() { - Assert ("#E01", !Test1.Equals (Test2)); - Assert ("#E02", !Test2.Equals (Test4)); - Assert ("#E03", !Test2.Equals (new SqlString ("TEST"))); - Assert ("#E04", Test2.Equals (Test3)); + Assert.IsTrue (!Test1.Equals (Test2), "#E01"); + Assert.IsTrue (!Test2.Equals (Test4), "#E02"); + Assert.IsTrue (!Test2.Equals (new SqlString ("TEST")), "#E03"); + Assert.IsTrue (Test2.Equals (Test3), "#E04"); // Static Equals()-method - Assert ("#E05", SqlGuid.Equals (Test2, Test3).Value); - Assert ("#E06", !SqlGuid.Equals (Test1, Test2).Value); + Assert.IsTrue (SqlGuid.Equals (Test2, Test3).Value, "#E05"); + Assert.IsTrue (!SqlGuid.Equals (Test1, Test2).Value, "#E06"); } [Test] public void GetHashCodeTest() { - AssertEquals ("#F01", Test1.GetHashCode (), Test1.GetHashCode ()); - Assert ("#F02", Test1.GetHashCode () != Test2.GetHashCode ()); - AssertEquals ("#F02", Test3.GetHashCode (), Test2.GetHashCode ()); + Assert.AreEqual (Test1.GetHashCode (), Test1.GetHashCode (), "#F01"); + Assert.IsTrue (Test1.GetHashCode () != Test2.GetHashCode (), "#F02"); + Assert.AreEqual (Test3.GetHashCode (), Test2.GetHashCode (), "#F02"); } [Test] public void GetTypeTest() { - AssertEquals ("#G01", "System.Data.SqlTypes.SqlGuid", Test1.GetType ().ToString ()); - AssertEquals ("#G02", "System.Guid", Test3.Value.GetType ().ToString ()); + Assert.AreEqual ("System.Data.SqlTypes.SqlGuid", Test1.GetType ().ToString (), "#G01"); + Assert.AreEqual ("System.Guid", Test3.Value.GetType ().ToString (), "#G02"); } [Test] public void Greaters() { // GreateThan () - Assert ("#H01", !SqlGuid.GreaterThan (Test1, Test2).Value); - Assert ("#H02", SqlGuid.GreaterThan (Test2, Test1).Value); - Assert ("#H03", !SqlGuid.GreaterThan (Test2, Test3).Value); + Assert.IsTrue (!SqlGuid.GreaterThan (Test1, Test2).Value, "#H01"); + Assert.IsTrue (SqlGuid.GreaterThan (Test2, Test1).Value, "#H02"); + Assert.IsTrue (!SqlGuid.GreaterThan (Test2, Test3).Value, "#H03"); // GreaterTharOrEqual () - Assert ("#H04", !SqlGuid.GreaterThanOrEqual (Test1, Test2).Value); - Assert ("#H05", SqlGuid.GreaterThanOrEqual (Test2, Test1).Value); - Assert ("#H06", SqlGuid.GreaterThanOrEqual (Test2, Test3).Value); + Assert.IsTrue (!SqlGuid.GreaterThanOrEqual (Test1, Test2).Value, "#H04"); + Assert.IsTrue (SqlGuid.GreaterThanOrEqual (Test2, Test1).Value, "#H05"); + Assert.IsTrue (SqlGuid.GreaterThanOrEqual (Test2, Test3).Value, "#H06"); } [Test] public void Lessers() { // LessThan() - Assert ("#I01", !SqlGuid.LessThan (Test2, Test3).Value); - Assert ("#I02", !SqlGuid.LessThan (Test2, Test1).Value); - Assert ("#I03", SqlGuid.LessThan (Test1, Test2).Value); + Assert.IsTrue (!SqlGuid.LessThan (Test2, Test3).Value, "#I01"); + Assert.IsTrue (!SqlGuid.LessThan (Test2, Test1).Value, "#I02"); + Assert.IsTrue (SqlGuid.LessThan (Test1, Test2).Value, "#I03"); // LessThanOrEqual () - Assert ("#I04", SqlGuid.LessThanOrEqual (Test1, Test2).Value); - Assert ("#I05", !SqlGuid.LessThanOrEqual (Test2, Test1).Value); - Assert ("#I06", SqlGuid.LessThanOrEqual (Test2, Test3).Value); - Assert ("#I07", SqlGuid.LessThanOrEqual (Test4, SqlGuid.Null).IsNull); + Assert.IsTrue (SqlGuid.LessThanOrEqual (Test1, Test2).Value, "#I04"); + Assert.IsTrue (!SqlGuid.LessThanOrEqual (Test2, Test1).Value, "#I05"); + Assert.IsTrue (SqlGuid.LessThanOrEqual (Test2, Test3).Value, "#I06"); + Assert.IsTrue (SqlGuid.LessThanOrEqual (Test4, SqlGuid.Null).IsNull, "#I07"); } [Test] public void NotEquals() { - Assert ("#J01", SqlGuid.NotEquals (Test1, Test2).Value); - Assert ("#J02", SqlGuid.NotEquals (Test2, Test1).Value); - Assert ("#J03", SqlGuid.NotEquals (Test3, Test1).Value); - Assert ("#J04", !SqlGuid.NotEquals (Test3, Test2).Value); - Assert ("#J05", SqlGuid.NotEquals (SqlGuid.Null, Test2).IsNull); + Assert.IsTrue (SqlGuid.NotEquals (Test1, Test2).Value, "#J01"); + Assert.IsTrue (SqlGuid.NotEquals (Test2, Test1).Value, "#J02"); + Assert.IsTrue (SqlGuid.NotEquals (Test3, Test1).Value, "#J03"); + Assert.IsTrue (!SqlGuid.NotEquals (Test3, Test2).Value, "#J04"); + Assert.IsTrue (SqlGuid.NotEquals (SqlGuid.Null, Test2).IsNull, "#J05"); } [Test] @@ -213,54 +213,49 @@ namespace MonoTests.System.Data.SqlTypes { try { SqlGuid.Parse (null); - Fail ("#K01"); + Assert.Fail ("#K01"); } catch (Exception e) { - AssertEquals ("#K02", typeof (ArgumentNullException), e.GetType ()); + Assert.AreEqual (typeof (ArgumentNullException), e.GetType (), "#K02"); } try { SqlGuid.Parse ("not-a-number"); - Fail ("#K03"); + Assert.Fail ("#K03"); } catch (Exception e) { - AssertEquals ("#K04", typeof (FormatException), e.GetType ()); + Assert.AreEqual (typeof (FormatException), e.GetType (), "#K04"); } try { SqlGuid.Parse ("9e400"); - Fail ("#K05"); + Assert.Fail ("#K05"); } catch (Exception e) { - AssertEquals ("#K06", typeof (FormatException), e.GetType ()); + Assert.AreEqual (typeof (FormatException), e.GetType (), "#K06"); } - AssertEquals("#K07", new Guid("87654321-0000-0000-0000-000000000000"), - SqlGuid.Parse ("87654321-0000-0000-0000-000000000000").Value); + Assert.AreEqual(new Guid("87654321-0000-0000-0000-000000000000"), SqlGuid.Parse ("87654321-0000-0000-0000-000000000000").Value, "#K07"); } [Test] public void Conversions() { // ToByteArray () - AssertEquals ("#L01", (byte)1, Test1.ToByteArray () [0]); - AssertEquals ("#L02", (byte)15, Test2.ToByteArray () [1]); + Assert.AreEqual ((byte)1, Test1.ToByteArray () [0], "#L01"); + Assert.AreEqual ((byte)15, Test2.ToByteArray () [1], "#L02"); // ToSqlBinary () byte [] b = new byte [2]; b [0] = 100; b [1] = 15; - AssertEquals ("#L03", new SqlBinary (b), Test3.ToSqlBinary ()); + Assert.AreEqual (new SqlBinary (b), Test3.ToSqlBinary (), "#L03"); // ToSqlString () - AssertEquals ("#L04", "00000a01-0000-0000-0000-000000000000", - Test1.ToSqlString ().Value); - AssertEquals ("#L05", "0000fafa-0000-0000-0000-000000000000", - Test4.ToSqlString ().Value); + Assert.AreEqual ("00000a01-0000-0000-0000-000000000000", Test1.ToSqlString ().Value, "#L04"); + Assert.AreEqual ("0000fafa-0000-0000-0000-000000000000", Test4.ToSqlString ().Value, "#L05"); // ToString () - AssertEquals ("#L06", "00000a01-0000-0000-0000-000000000000", - Test1.ToString ()); - AssertEquals ("#L07", "0000fafa-0000-0000-0000-000000000000", - Test4.ToString ()); + Assert.AreEqual ("00000a01-0000-0000-0000-000000000000", Test1.ToString (), "#L06"); + Assert.AreEqual ("0000fafa-0000-0000-0000-000000000000", Test4.ToString (), "#L07"); } // OPERATORS @@ -269,38 +264,38 @@ namespace MonoTests.System.Data.SqlTypes public void ThanOrEqualOperators() { // == -operator - Assert ("#M01", (Test3 == Test2).Value); - Assert ("#M02", !(Test1 == Test2).Value); - Assert ("#M03", (Test1 == SqlGuid.Null).IsNull); + Assert.IsTrue ((Test3 == Test2).Value, "#M01"); + Assert.IsTrue (!(Test1 == Test2).Value, "#M02"); + Assert.IsTrue ((Test1 == SqlGuid.Null).IsNull, "#M03"); // != -operator - Assert ("#M04", !(Test2 != Test3).Value); - Assert ("#M05", (Test1 != Test3).Value); - Assert ("#M06", (Test1 != SqlGuid.Null).IsNull); + Assert.IsTrue (!(Test2 != Test3).Value, "#M04"); + Assert.IsTrue ((Test1 != Test3).Value, "#M05"); + Assert.IsTrue ((Test1 != SqlGuid.Null).IsNull, "#M06"); // > -operator - Assert ("#M07", (Test2 > Test1).Value); - Assert ("#M08", !(Test1 > Test3).Value); - Assert ("#M09", !(Test3 > Test2).Value); - Assert ("#M10", (Test1 > SqlGuid.Null).IsNull); + Assert.IsTrue ((Test2 > Test1).Value, "#M07"); + Assert.IsTrue (!(Test1 > Test3).Value, "#M08"); + Assert.IsTrue (!(Test3 > Test2).Value, "#M09"); + Assert.IsTrue ((Test1 > SqlGuid.Null).IsNull, "#M10"); // >= -operator - Assert ("#M12", !(Test1 >= Test3).Value); - Assert ("#M13", (Test3 >= Test1).Value); - Assert ("#M14", (Test3 >= Test2).Value); - Assert ("#M15", (Test1 >= SqlGuid.Null).IsNull); + Assert.IsTrue (!(Test1 >= Test3).Value, "#M12"); + Assert.IsTrue ((Test3 >= Test1).Value, "#M13"); + Assert.IsTrue ((Test3 >= Test2).Value, "#M14"); + Assert.IsTrue ((Test1 >= SqlGuid.Null).IsNull, "#M15"); // < -operator - Assert ("#M16", !(Test2 < Test1).Value); - Assert ("#M17", (Test1 < Test3).Value); - Assert ("#M18", !(Test2 < Test3).Value); - Assert ("#M19", (Test1 < SqlGuid.Null).IsNull); + Assert.IsTrue (!(Test2 < Test1).Value, "#M16"); + Assert.IsTrue ((Test1 < Test3).Value, "#M17"); + Assert.IsTrue (!(Test2 < Test3).Value, "#M18"); + Assert.IsTrue ((Test1 < SqlGuid.Null).IsNull, "#M19"); // <= -operator - Assert ("#M20", (Test1 <= Test3).Value); - Assert ("#M21", !(Test3 <= Test1).Value); - Assert ("#M22", (Test2 <= Test3).Value); - Assert ("#M23", (Test1 <= SqlGuid.Null).IsNull); + Assert.IsTrue ((Test1 <= Test3).Value, "#M20"); + Assert.IsTrue (!(Test3 <= Test1).Value, "#M21"); + Assert.IsTrue ((Test2 <= Test3).Value, "#M22"); + Assert.IsTrue ((Test1 <= SqlGuid.Null).IsNull, "#M23"); } [Test] @@ -311,17 +306,14 @@ namespace MonoTests.System.Data.SqlTypes b [1] = 200; SqlBinary TestBinary = new SqlBinary (b); - AssertEquals ("#N01", new Guid("0000c864-0000-0000-0000-000000000000"), - ((SqlGuid)TestBinary).Value); + Assert.AreEqual (new Guid("0000c864-0000-0000-0000-000000000000"), ((SqlGuid)TestBinary).Value, "#N01"); } [Test] public void SqlGuidToGuid() { - AssertEquals ("#O01", new Guid("00000a01-0000-0000-0000-000000000000"), - (Guid)Test1); - AssertEquals ("#O02", new Guid("00000f64-0000-0000-0000-000000000000"), - (Guid)Test2); + Assert.AreEqual (new Guid("00000a01-0000-0000-0000-000000000000"), (Guid)Test1, "#O01"); + Assert.AreEqual (new Guid("00000f64-0000-0000-0000-000000000000"), (Guid)Test2, "#O02"); } [Test] @@ -330,14 +322,13 @@ namespace MonoTests.System.Data.SqlTypes SqlString TestString = new SqlString ("Test string"); SqlString TestString100 = new SqlString ("0000c864-0000-0000-0000-000000000000"); - AssertEquals ("#P01", new Guid("0000c864-0000-0000-0000-000000000000"), - ((SqlGuid)TestString100).Value); + Assert.AreEqual (new Guid("0000c864-0000-0000-0000-000000000000"), ((SqlGuid)TestString100).Value, "#P01"); try { SqlGuid test = (SqlGuid)TestString; - Fail ("#P02"); + Assert.Fail ("#P02"); } catch(Exception e) { - AssertEquals ("#P03", typeof (FormatException), e.GetType ()); + Assert.AreEqual (typeof (FormatException), e.GetType (), "#P03"); } } @@ -345,15 +336,14 @@ namespace MonoTests.System.Data.SqlTypes public void GuidToSqlGuid() { Guid TestGuid = new Guid("0000c864-0000-0000-0000-000007650000"); - AssertEquals ("#Q01", new SqlGuid("0000c864-0000-0000-0000-000007650000"), - (SqlGuid)TestGuid); + Assert.AreEqual (new SqlGuid("0000c864-0000-0000-0000-000007650000"), (SqlGuid)TestGuid, "#Q01"); } #if NET_2_0 [Test] public void GetXsdTypeTest () { XmlQualifiedName qualifiedName = SqlGuid.GetXsdType (null); - NUnit.Framework.Assert.AreEqual ("string", qualifiedName.Name, "#A01"); + Assert.AreEqual ("string", qualifiedName.Name, "#A01"); } #endif } diff --git a/mcs/class/System.Drawing/ChangeLog b/mcs/class/System.Drawing/ChangeLog index 9022a901b21..8eed992592e 100644 --- a/mcs/class/System.Drawing/ChangeLog +++ b/mcs/class/System.Drawing/ChangeLog @@ -1,3 +1,8 @@ +2009-07-08 Carlos Alberto Cortez + + * System.Drawing_test.dll.sources: Add PageSourceTest.cs and + PaperSizeTest.cs. + 2008-08-08 Gert Driesen * Makefile: Add 415581.ico. diff --git a/mcs/class/System.Drawing/System.Drawing.Printing/ChangeLog b/mcs/class/System.Drawing/System.Drawing.Printing/ChangeLog index 9e56b9a7b85..b15a05ff671 100644 --- a/mcs/class/System.Drawing/System.Drawing.Printing/ChangeLog +++ b/mcs/class/System.Drawing/System.Drawing.Printing/ChangeLog @@ -1,3 +1,19 @@ +2009-07-08 Carlos Alberto Cortez + + * PaperSource.cs: Implement RawKind. + Fixes the remaining bits of #507739. + +2009-07-08 Carlos Alberto Cortez + + * PaperSize.cs: Implement support for RawKind. + Patch by Andy Hume (andyhume32@yahoo.co.uk). + Fixes part of #507739. + +2009-07-07 Carlos Alberto Cortez + + * PaperSize.cs: Actually implement RawKind by retrieving and setting + the kind field. + 2008-11-01 Sebastien Pouliot * PrintingServicesUnix.cs: Fix potential crash on 64bit OS. Gendarme diff --git a/mcs/class/System.Drawing/System.Drawing.Printing/PaperSize.cs b/mcs/class/System.Drawing/System.Drawing.Printing/PaperSize.cs index 6bb50280731..0b5f32a351f 100644 --- a/mcs/class/System.Drawing/System.Drawing.Printing/PaperSize.cs +++ b/mcs/class/System.Drawing/System.Drawing.Printing/PaperSize.cs @@ -74,7 +74,7 @@ namespace System.Drawing.Printing return width; }set { - if (Kind != PaperKind.Custom) + if (kind != PaperKind.Custom) throw new ArgumentException(); width = value; } @@ -84,7 +84,7 @@ namespace System.Drawing.Printing return height; }set { - if (Kind != PaperKind.Custom) + if (kind != PaperKind.Custom) throw new ArgumentException(); height = value; } @@ -95,7 +95,7 @@ namespace System.Drawing.Printing return name; } set{ - if (Kind != PaperKind.Custom) + if (kind != PaperKind.Custom) throw new ArgumentException(); name = value; } @@ -103,15 +103,23 @@ namespace System.Drawing.Printing public PaperKind Kind{ get{ + // .net ignores the values that are less than 0 + // the value returned is not used internally, however. + if (kind > PaperKind.PrcEnvelopeNumber10Rotated) + return PaperKind.Custom; + return kind; } } #if NET_2_0 - [MonoTODO] public int RawKind { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } + get { + return (int)kind; + } + set { + kind = (PaperKind)value; + } + } #endif diff --git a/mcs/class/System.Drawing/System.Drawing.Printing/PaperSource.cs b/mcs/class/System.Drawing/System.Drawing.Printing/PaperSource.cs index b44db7bc5b9..ffd339cac35 100644 --- a/mcs/class/System.Drawing/System.Drawing.Printing/PaperSource.cs +++ b/mcs/class/System.Drawing/System.Drawing.Printing/PaperSource.cs @@ -68,6 +68,11 @@ namespace System.Drawing.Printing public PaperSourceKind Kind{ get { + // Exactly at 256 (as opposed to Custom, which is 257 and the max value of PaperSourceKind), + // we must return Custom always. + if ((int)kind >= 256) + return PaperSourceKind.Custom; + return this.kind; } } @@ -83,13 +88,12 @@ namespace System.Drawing.Printing } #if NET_2_0 - [MonoTODO] public int RawKind { get { - throw new NotImplementedException (); + return (int)kind; } set { - throw new NotImplementedException (); + kind = (PaperSourceKind)value; } } #endif diff --git a/mcs/class/System.Drawing/System.Drawing_test.dll.sources b/mcs/class/System.Drawing/System.Drawing_test.dll.sources index c5e8c04cb4a..83e8ca47378 100644 --- a/mcs/class/System.Drawing/System.Drawing_test.dll.sources +++ b/mcs/class/System.Drawing/System.Drawing_test.dll.sources @@ -67,6 +67,8 @@ System.Drawing.Imaging/TiffCodecTest.cs System.Drawing.Imaging/WmfPlaceableFileHeaderTest.cs System.Drawing.Printing/MarginsTest.cs System.Drawing.Printing/PageSettingsTest.cs +System.Drawing.Printing/PageSourceTest.cs +System.Drawing.Printing/PaperSizeTest.cs System.Drawing.Printing/PrinterUnitConvertTest.cs System.Drawing.Printing/PrintingPermissionAttributeTest.cs System.Drawing.Printing/PrintingPermissionTest.cs diff --git a/mcs/class/System.Drawing/Test/System.Drawing.Printing/ChangeLog b/mcs/class/System.Drawing/Test/System.Drawing.Printing/ChangeLog index 11fec64938f..92c9a8ef6f7 100644 --- a/mcs/class/System.Drawing/Test/System.Drawing.Printing/ChangeLog +++ b/mcs/class/System.Drawing/Test/System.Drawing.Printing/ChangeLog @@ -1,3 +1,17 @@ +2009-07-09 Carlos Alberto Cortez + + * PageSourceTest.cs: + * PaperSizeTest.cs: Include the new tests in NET_2_0 define, to fix + the 1.1 build. + +2009-07-08 Carlos Alberto Cortez + + * PageSourceTest.cs: New file, by Andy Hume + +2009-07-08 Carlos Alberto Cortez + + * PaperSizeTest.cs: New file, by Andy Hume + 2007-07-03 Sebastien Pouliot * MarginsTest.cs: Remove operator tests before 2.0. Fix bots failures. diff --git a/mcs/class/System.Drawing/Test/System.Drawing.Printing/PageSourceTest.cs b/mcs/class/System.Drawing/Test/System.Drawing.Printing/PageSourceTest.cs new file mode 100644 index 00000000000..d1e3ce78106 --- /dev/null +++ b/mcs/class/System.Drawing/Test/System.Drawing.Printing/PageSourceTest.cs @@ -0,0 +1,99 @@ +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// Author: +// Andy Hume +// + +using NUnit.Framework; +using System; +using System.Drawing; +using System.Drawing.Printing; + +namespace MonoTests.System.Drawing.Printing +{ + [TestFixture] + public class PaperSourceTest + { +#if NET_2_0 + [Test] + public void KindTest () + { + PaperSource ps = new PaperSource (); + + // + // Set Custom + ps.RawKind = (int)PaperSourceKind.Custom; + Assert.AreEqual (PaperSourceKind.Custom, ps.Kind, "Kind #8"); + Assert.AreEqual (257, ps.RawKind, "RawKind #8"); + + // + // An integer value of 256 and above returns Custom (0x257) + ps.RawKind = 256; + Assert.AreEqual (256, ps.RawKind, "out: #" + 256); + Assert.AreEqual (PaperSourceKind.Custom, ps.Kind, "kind is custom: #" + 256); + + // + // Zero + ps.RawKind = 0; + Assert.AreEqual ((PaperSourceKind)0, ps.Kind, "Kind #1"); + Assert.AreEqual (0, ps.RawKind, "RawKind #1"); + + // + // Well-known + ps.RawKind = (int)PaperSourceKind.Upper; + Assert.AreEqual (PaperSourceKind.Upper, ps.Kind, "Kind #2"); + Assert.AreEqual ((int)PaperSourceKind.Upper, ps.RawKind, "RawKind #2"); + + // + ps.RawKind = (int)PaperSourceKind.FormSource; + Assert.AreEqual (PaperSourceKind.FormSource, ps.Kind, "Kind #3"); + Assert.AreEqual ((int)PaperSourceKind.FormSource, ps.RawKind, "RawKind #3"); + + // + // Too Big + ps.RawKind = 999999; + Assert.AreEqual (PaperSourceKind.Custom, ps.Kind, "Kind #4"); + Assert.AreEqual (999999, ps.RawKind, "RawKind #4"); + + // + ps.RawKind = int.MaxValue; + Assert.AreEqual (PaperSourceKind.Custom, ps.Kind, "Kind #5"); + Assert.AreEqual (int.MaxValue, ps.RawKind, "RawKind #5"); + + // + // Negative -- Looks as if MSFT forgot to check for negative! + ps.RawKind = -1; + Assert.AreEqual ((PaperSourceKind)(-1), ps.Kind, "Kind #6"); + Assert.AreEqual (-1, ps.RawKind, "RawKind #6"); + + // + ps.RawKind = int.MinValue; + Assert.AreEqual ((PaperSourceKind)(int.MinValue), ps.Kind, "Kind #7"); + Assert.AreEqual (int.MinValue, ps.RawKind, "RawKind #7"); + } +#endif + + } + +} + diff --git a/mcs/class/System.Drawing/Test/System.Drawing.Printing/PaperSizeTest.cs b/mcs/class/System.Drawing/Test/System.Drawing.Printing/PaperSizeTest.cs new file mode 100644 index 00000000000..5fe9db57868 --- /dev/null +++ b/mcs/class/System.Drawing/Test/System.Drawing.Printing/PaperSizeTest.cs @@ -0,0 +1,138 @@ +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// Author: +// Andy Hume +// + +using NUnit.Framework; +using System; +using System.Drawing; +using System.Drawing.Printing; + +namespace MonoTests.System.Drawing.Printing +{ + [TestFixture] + public class PaperSizeTest + { +#if NET_2_0 + [Test] + public void PaperSizeKindTest() + { + // set_RawKind seems to accept any value (no ArgEx seen), but get_Kind + // returns "Custom" when it's set to a value bigger than the biggest enum. + // + PaperSize ps = new PaperSize ("foo", 100, 100); + + // + // Zero == Custom + Assert.AreEqual(PaperKind.Custom, ps.Kind, "Kind #1"); + Assert.AreEqual(0, ps.RawKind, "RawKind #1"); + + try { + ps.Height = 1; + Assert.AreEqual (1 , ps.Height, "get_Height #1"); + } catch (ArgumentException) { + Assert.Fail ("should not have thrown #1"); + } + + // + // Well-known + ps.RawKind = (int)PaperKind.A4; + Assert.AreEqual (PaperKind.A4, ps.Kind, "Kind #2"); + Assert.AreEqual ((int)PaperKind.A4, ps.RawKind, "RawKind #2"); + + try { + ps.Height = 2; + Assert.Fail("should have thrown #2"); + } catch (ArgumentException) { + } + + // + ps.RawKind = (int)PaperKind.JapaneseEnvelopeKakuNumber3; + Assert.AreEqual (PaperKind.JapaneseEnvelopeKakuNumber3, ps.Kind, "Kind #3"); + Assert.AreEqual ((int)PaperKind.JapaneseEnvelopeKakuNumber3, ps.RawKind, "RawKind #3"); + + // + // Too Big + ps.RawKind = 999999; + Assert.AreEqual (PaperKind.Custom, ps.Kind, "Kind #4"); + Assert.AreEqual (999999, ps.RawKind, "RawKind #4"); + + // The properties can be changed only when the *real* Kind is Custom + // and not when is 'effectively' Custom. + try { + ps.Height = 4; + Assert.Fail("should have thrown #4"); + } catch (ArgumentException) { + } + + // + ps.RawKind = int.MaxValue; + Assert.AreEqual (PaperKind.Custom, ps.Kind, "Kind #5"); + Assert.AreEqual (int.MaxValue, ps.RawKind, "RawKind #5"); + + // + // Negative -- Looks as if MSFT forgot to check for negative! + ps.RawKind = -1; + Assert.AreEqual ((PaperKind)(-1), ps.Kind, "Kind #6"); + Assert.AreEqual (-1, ps.RawKind, "RawKind #6"); + + // + ps.RawKind = int.MinValue; + Assert.AreEqual ((PaperKind)(int.MinValue), ps.Kind, "Kind #7"); + Assert.AreEqual (int.MinValue, ps.RawKind, "RawKind #7"); + + // + // Where's the top limit? + ps.RawKind = (int)PaperKind.PrcEnvelopeNumber10Rotated; + Assert.AreEqual (PaperKind.PrcEnvelopeNumber10Rotated, ps.Kind, "Kind #8"); + Assert.AreEqual ((int)PaperKind.PrcEnvelopeNumber10Rotated, ps.RawKind, "RawKind #8"); + + // +1 + ps.RawKind = 1 + (int)PaperKind.PrcEnvelopeNumber10Rotated; + Assert.AreEqual (PaperKind.Custom, ps.Kind, "Kind #9"); + Assert.AreEqual (1 + (int)PaperKind.PrcEnvelopeNumber10Rotated, ps.RawKind, "RawKind #9"); + + try { + ps.Height = 9; + Assert.Fail("should have thrown #9"); + } catch (ArgumentException) { + } + + // Set Custom + ps.RawKind = (int)PaperKind.Custom; + Assert.AreEqual (PaperKind.Custom, ps.Kind, "Kind #1b"); + Assert.AreEqual (0, ps.RawKind, "RawKind #1b"); + + try { + ps.Height = 1; + Assert.AreEqual (1 , ps.Height, "get_Height #1b"); + } catch (ArgumentException) { + Assert.Fail ("should not have thrown #1b"); + } + } +#endif + + } +} + diff --git a/mcs/class/System.Dynamic/Assembly/AssemblyInfo.cs b/mcs/class/System.Dynamic/Assembly/AssemblyInfo.cs new file mode 100644 index 00000000000..314ff860f0e --- /dev/null +++ b/mcs/class/System.Dynamic/Assembly/AssemblyInfo.cs @@ -0,0 +1,61 @@ +// +// AssemblyInfo.cs +// +// Authors: +// Marek Safar (marek.safar@gmail.com) +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Reflection; +using System.Resources; +using System.Security; +using System.Security.Permissions; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about the assembly + +[assembly: AssemblyTitle ("System.Dynamic.dll")] +[assembly: AssemblyDescription ("System.Dynamic.dll")] +[assembly: AssemblyDefaultAlias ("System.Dynamic.dll")] + +[assembly: AssemblyCompany (Consts.MonoCompany)] +[assembly: AssemblyProduct (Consts.MonoProduct)] +[assembly: AssemblyCopyright (Consts.MonoCopyright)] +[assembly: AssemblyVersion (Consts.FxVersion)] +[assembly: SatelliteContractVersion (Consts.FxVersion)] +[assembly: AssemblyInformationalVersion (Consts.FxFileVersion)] +[assembly: AssemblyFileVersion (Consts.FxFileVersion)] + +[assembly: NeutralResourcesLanguage ("en-US")] +[assembly: CLSCompliant (true)] +[assembly: AssemblyDelaySign (true)] + +[assembly: AssemblyKeyFile ("../ecma.pub")] + +[assembly: SecurityCritical] + +[assembly: ComVisible (false)] + diff --git a/mcs/class/System.Dynamic/Assembly/ChangeLog b/mcs/class/System.Dynamic/Assembly/ChangeLog new file mode 100644 index 00000000000..5ae38b37f80 --- /dev/null +++ b/mcs/class/System.Dynamic/Assembly/ChangeLog @@ -0,0 +1,4 @@ +2009-06-29 Marek Safar + + * ChangeLog: Added + diff --git a/mcs/class/System.Dynamic/ChangeLog b/mcs/class/System.Dynamic/ChangeLog new file mode 100644 index 00000000000..ca620acba8d --- /dev/null +++ b/mcs/class/System.Dynamic/ChangeLog @@ -0,0 +1,3 @@ +2009-07-02 Marek Safar + + * Makefile: Initial commit. diff --git a/mcs/class/System.Dynamic/Makefile b/mcs/class/System.Dynamic/Makefile new file mode 100644 index 00000000000..7b0988bde21 --- /dev/null +++ b/mcs/class/System.Dynamic/Makefile @@ -0,0 +1,10 @@ +thisdir = class/System.Dynamic +SUBDIRS = +include ../../build/rules.make + +LIBRARY = System.Dynamic.dll + +LIB_MCS_FLAGS = -unsafe -d:CODEPLEX_40 -d:MICROSOFT_DYNAMIC -r:System.Core.dll -r:System.dll + +include ../../build/library.make + diff --git a/mcs/class/System.Dynamic/System.Dynamic.dll.sources b/mcs/class/System.Dynamic/System.Dynamic.dll.sources new file mode 100644 index 00000000000..5dff03a7c0f --- /dev/null +++ b/mcs/class/System.Dynamic/System.Dynamic.dll.sources @@ -0,0 +1,55 @@ +../../build/common/Consts.cs +../../build/common/Locale.cs +../../build/common/MonoTODOAttribute.cs +Assembly/AssemblyInfo.cs +../dlr/Runtime/Microsoft.Dynamic/ArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/Assert.cs +../dlr/Runtime/Microsoft.Dynamic/BoolArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/BoundDispEvent.cs +../dlr/Runtime/Microsoft.Dynamic/CollectionExtensions.cs +../dlr/Runtime/Microsoft.Dynamic/ComBinder.cs +../dlr/Runtime/Microsoft.Dynamic/ComBinderHelpers.cs +../dlr/Runtime/Microsoft.Dynamic/ComDispIds.cs +../dlr/Runtime/Microsoft.Dynamic/ComEventDesc.cs +../dlr/Runtime/Microsoft.Dynamic/ComEventSink.cs +../dlr/Runtime/Microsoft.Dynamic/ComEventSinkProxy.cs +../dlr/Runtime/Microsoft.Dynamic/ComEventSinksContainer.cs +../dlr/Runtime/Microsoft.Dynamic/ComFallbackMetaObject.cs +../dlr/Runtime/Microsoft.Dynamic/ComHresults.cs +../dlr/Runtime/Microsoft.Dynamic/ComInterop.cs +../dlr/Runtime/Microsoft.Dynamic/ComInvokeAction.cs +../dlr/Runtime/Microsoft.Dynamic/ComInvokeBinder.cs +../dlr/Runtime/Microsoft.Dynamic/ComMetaObject.cs +../dlr/Runtime/Microsoft.Dynamic/ComMethodDesc.cs +../dlr/Runtime/Microsoft.Dynamic/ComObject.cs +../dlr/Runtime/Microsoft.Dynamic/ComRuntimeHelpers.cs +../dlr/Runtime/Microsoft.Dynamic/ComTypeClassDesc.cs +../dlr/Runtime/Microsoft.Dynamic/ComTypeDesc.cs +../dlr/Runtime/Microsoft.Dynamic/ComTypeEnumDesc.cs +../dlr/Runtime/Microsoft.Dynamic/ComTypeLibDesc.cs +../dlr/Runtime/Microsoft.Dynamic/ContractUtils.cs +../dlr/Runtime/Microsoft.Dynamic/ConversionArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/ConvertArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/ConvertibleArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/CurrencyArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/DateTimeArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/DispatchArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/DispCallable.cs +../dlr/Runtime/Microsoft.Dynamic/DispCallableMetaObject.cs +../dlr/Runtime/Microsoft.Dynamic/Errors.cs +../dlr/Runtime/Microsoft.Dynamic/ErrorArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/ExcepInfo.cs +../dlr/Runtime/Microsoft.Dynamic/Helpers.cs +../dlr/Runtime/Microsoft.Dynamic/IDispatchComObject.cs +../dlr/Runtime/Microsoft.Dynamic/IDispatchMetaObject.cs +../dlr/Runtime/Microsoft.Dynamic/NullArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/SimpleArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/SplatCallSite.cs +../dlr/Runtime/Microsoft.Dynamic/StringArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/TypeUtils.cs +../dlr/Runtime/Microsoft.Dynamic/UnknownArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/VarEnumSelector.cs +../dlr/Runtime/Microsoft.Dynamic/Variant.cs +../dlr/Runtime/Microsoft.Dynamic/VariantArgBuilder.cs +../dlr/Runtime/Microsoft.Dynamic/VariantArray.cs +../dlr/Runtime/Microsoft.Dynamic/VariantBuilder.cs diff --git a/mcs/class/System.Messaging/System.Messaging/ChangeLog b/mcs/class/System.Messaging/System.Messaging/ChangeLog index 4b2c8833b08..e5fcc897f0c 100644 --- a/mcs/class/System.Messaging/System.Messaging/ChangeLog +++ b/mcs/class/System.Messaging/System.Messaging/ChangeLog @@ -1,3 +1,7 @@ +2009-07-11 Michael Barker + + * MessageQueueException.cs: Removed MonoTODO. + 2009-05-23 Michael Barker * MessageEnumerator.cs: Added calls to the delegate IMessageEnumerator diff --git a/mcs/class/System.Messaging/System.Messaging/MessageQueueException.cs b/mcs/class/System.Messaging/System.Messaging/MessageQueueException.cs index 4621760d09a..b9a6452ed92 100644 --- a/mcs/class/System.Messaging/System.Messaging/MessageQueueException.cs +++ b/mcs/class/System.Messaging/System.Messaging/MessageQueueException.cs @@ -63,7 +63,6 @@ namespace System.Messaging return "UnknownError"; } - [MonoTODO] public override string Message { get { return base.Message; } diff --git a/mcs/class/System.Net/System.Net/ChangeLog b/mcs/class/System.Net/System.Net/ChangeLog index 46e66589bc5..a7ee36b4996 100644 --- a/mcs/class/System.Net/System.Net/ChangeLog +++ b/mcs/class/System.Net/System.Net/ChangeLog @@ -1,3 +1,8 @@ +2009-06-17 Sebastien Pouliot + + * WebClient_2_1.cs: Fix BaseAddress and remove dual base[Address| + String] variables. + 2009-06-05 Sebastien Pouliot * WebClient_2_1.cs: Make sure *CompletedEventArgs gets called diff --git a/mcs/class/System.Net/System.Net/WebClient_2_1.cs b/mcs/class/System.Net/System.Net/WebClient_2_1.cs index 01f2022e890..8e52a547b88 100644 --- a/mcs/class/System.Net/System.Net/WebClient_2_1.cs +++ b/mcs/class/System.Net/System.Net/WebClient_2_1.cs @@ -44,8 +44,7 @@ namespace System.Net { WebHeaderCollection headers; WebHeaderCollection responseHeaders; - Uri baseAddress; - string baseString; + string baseAddress; bool is_busy; Encoding encoding = Encoding.UTF8; bool allow_read_buffering = true; @@ -58,28 +57,23 @@ namespace System.Net { // but without adding dependency on System.Windows.dll. GetData is [SecurityCritical] // this makes the default .ctor [SecuritySafeCritical] which would be a problem (inheritance) // but it happens that MS SL2 also has this default .ctor as SSC :-) - baseAddress = new Uri (AppDomain.CurrentDomain.GetData ("xap_uri") as string); + baseAddress = (AppDomain.CurrentDomain.GetData ("xap_uri") as string); locker = new object (); } // Properties public string BaseAddress { - get { - if (baseString == null) { - if (baseAddress == null) - return String.Empty; - else - baseString = baseAddress.ToString (); - } - return baseString; - } - + get { return baseAddress; } set { if (String.IsNullOrEmpty (value)) { - baseAddress = null; + baseAddress = String.Empty; } else { - baseAddress = new Uri (value); + Uri uri = null; + if (!Uri.TryCreate (value, UriKind.Absolute, out uri)) + throw new ArgumentException ("Invalid URI"); + + baseAddress = Uri.UnescapeDataString (uri.AbsoluteUri); } } } @@ -483,7 +477,7 @@ namespace System.Net { throw new ArgumentNullException ("address"); // if the URI is relative then we use our base address URI to make an absolute one - Uri uri = address.IsAbsoluteUri ? address : new Uri (baseAddress, address); + Uri uri = address.IsAbsoluteUri ? address : new Uri (new Uri (baseAddress), address); WebRequest request = WebRequest.Create (uri); diff --git a/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/ChangeLog b/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/ChangeLog index 5108f0a5e06..de175f23e06 100755 --- a/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/ChangeLog +++ b/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/ChangeLog @@ -1,3 +1,14 @@ +2009-07-07 Atsushi Enomoto + + * XmlFormatterDeserializer.cs, SerializationMap.cs : IXmlSerializable + were not deserialized correctly as it has mismatch on wrapper + element. This fixes PeerNodeAddress.EndpointAddress deserialization. + +2009-06-26 Atsushi Enomoto + + * XmlFormatterDeserializer.cs : verifyObjectName rather blocked + correct names provided as the root names. + 2009-06-01 Atsushi Enomoto * XmlFormatterSerializer.cs, KnownTypeCollection.cs : collection diff --git a/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/SerializationMap.cs b/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/SerializationMap.cs index 8edbf9ebf39..c2e0b46dc9c 100644 --- a/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/SerializationMap.cs +++ b/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/SerializationMap.cs @@ -336,8 +336,26 @@ namespace System.Runtime.Serialization serializer.WriteEndElement (); } } - - /* Deserialize non-primitive types */ + + public virtual object DeserializeObject (XmlReader reader, XmlFormatterDeserializer deserializer) + { + bool isEmpty = reader.IsEmptyElement; + reader.ReadStartElement (); + + object res; + + if (isEmpty) + res = DeserializeEmptyContent (reader, deserializer); + else + res = DeserializeContent (reader, deserializer); + + reader.MoveToContent (); + if (!isEmpty && reader.NodeType == XmlNodeType.EndElement) + reader.ReadEndElement (); + else if (!isEmpty && reader.NodeType != XmlNodeType.None) + throw new SerializationException (String.Format ("Deserializing type '{3}'. Expecting state 'EndElement'. Encountered state '{0}' with name '{1}' with namespace '{2}'.", reader.NodeType, reader.Name, reader.NamespaceURI, RuntimeType.FullName)); + return res; + } // This is sort of hack. The argument reader already moved ahead of // the actual empty element.It's just for historical consistency. @@ -440,6 +458,13 @@ namespace System.Runtime.Serialization ixs.WriteXml (serializer.Writer); } + public override object DeserializeObject (XmlReader reader, XmlFormatterDeserializer deserializer) + { + IXmlSerializable ixs = (IXmlSerializable) FormatterServices.GetUninitializedObject (RuntimeType); + ixs.ReadXml (reader); + return ixs; + } + #if !NET_2_1 // FIXME: verify return value sanity. public override XmlSchemaType GetSchemaType (XmlSchemaSet schemas, Dictionary generated_schema_types) diff --git a/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/XmlFormatterDeserializer.cs b/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/XmlFormatterDeserializer.cs index 8e45553c7b5..e6eae077a45 100644 --- a/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/XmlFormatterDeserializer.cs +++ b/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/XmlFormatterDeserializer.cs @@ -51,11 +51,15 @@ namespace System.Runtime.Serialization public static object Deserialize (XmlReader reader, Type type, KnownTypeCollection knownTypes, IDataContractSurrogate surrogate, - string name, string Namespace, bool verifyObjectName) + string name, string ns, bool verifyObjectName) { - reader.MoveToContent(); + reader.MoveToContent (); if (verifyObjectName) - Verify (knownTypes, type, name, Namespace, reader); + if (reader.NodeType != XmlNodeType.Element || + reader.LocalName != name || + reader.NamespaceURI != ns) + throw new SerializationException (String.Format ("Expected element '{0}' in namespace '{1}', but found {2} node '{3}' in namespace '{4}'", name, ns, reader.NodeType, reader.LocalName, reader.NamespaceURI)); +// Verify (knownTypes, type, name, ns, reader); return new XmlFormatterDeserializer (knownTypes, surrogate).Deserialize (type, reader); } @@ -140,24 +144,9 @@ namespace System.Runtime.Serialization throw new SerializationException (String.Format ("Value type {0} cannot be null.", type)); } - bool isEmpty = reader.IsEmptyElement; - reader.ReadStartElement (); - - object res = DeserializeContent (graph_qname, type, reader, isEmpty); - - reader.MoveToContent (); - if (!isEmpty && reader.NodeType == XmlNodeType.EndElement) - reader.ReadEndElement (); - else if (!isEmpty && reader.NodeType != XmlNodeType.None) - throw new SerializationException (String.Format ("Deserializing type '{3}'. Expecting state 'EndElement'. Encountered state '{0}' with name '{1}' with namespace '{2}'.", reader.NodeType, reader.Name, reader.NamespaceURI, type.FullName)); - return res; - } - - object DeserializeContent (QName name, Type type, XmlReader reader, bool isEmpty) - { - if (KnownTypeCollection.GetPrimitiveTypeFromName (name.Name) != null) { + if (KnownTypeCollection.GetPrimitiveTypeFromName (graph_qname.Name) != null) { string value; - if (isEmpty) { + if (reader.IsEmptyElement) { if (type.IsValueType) return Activator.CreateInstance (type); else @@ -165,10 +154,15 @@ namespace System.Runtime.Serialization value = String.Empty; } else - value = reader.ReadContentAsString (); - return KnownTypeCollection.PredefinedTypeStringToObject (value, name.Name, reader); + value = reader.ReadElementContentAsString (); + return KnownTypeCollection.PredefinedTypeStringToObject (value, graph_qname.Name, reader); } + return DeserializeByMap (graph_qname, type, reader); + } + + object DeserializeByMap (QName name, Type type, XmlReader reader) + { SerializationMap map = types.FindUserMap (name); if (map == null && (name.Namespace == KnownTypeCollection.MSArraysNamespace || name.Namespace.StartsWith (KnownTypeCollection.DefaultClrNamespaceBase, StringComparison.Ordinal))) { @@ -179,10 +173,7 @@ namespace System.Runtime.Serialization if (map == null) throw new SerializationException (String.Format ("Unknown type {0} is used for DataContract with reference of name {1}. Any derived types of a data contract or a data member should be added to KnownTypes.", type, name)); - if (isEmpty) - return map.DeserializeEmptyContent (reader, this); - else - return map.DeserializeContent (reader, this); + return map.DeserializeObject (reader, this); } Type GetTypeFromNamePair (string name, string ns) diff --git a/mcs/class/System.Runtime.Serialization/System.Xml/ChangeLog b/mcs/class/System.Runtime.Serialization/System.Xml/ChangeLog index 6c9d8fc90b6..eb0cf8a83c7 100755 --- a/mcs/class/System.Runtime.Serialization/System.Xml/ChangeLog +++ b/mcs/class/System.Runtime.Serialization/System.Xml/ChangeLog @@ -1,3 +1,8 @@ +2009-07-07 Atsushi Enomoto + + * XmlSimpleDictionaryWriter.cs : fix bogus import of + XmlWriter.WriteNode() to handle more than two elements. + 2009-06-05 Atsushi Enomoto * XmlBinaryDictionaryReader.cs : fix GetAttribute() that returns diff --git a/mcs/class/System.Runtime.Serialization/System.Xml/XmlDictionaryWriter.cs b/mcs/class/System.Runtime.Serialization/System.Xml/XmlDictionaryWriter.cs index 83865a8b250..207a2a8ce04 100644 --- a/mcs/class/System.Runtime.Serialization/System.Xml/XmlDictionaryWriter.cs +++ b/mcs/class/System.Runtime.Serialization/System.Xml/XmlDictionaryWriter.cs @@ -208,8 +208,19 @@ namespace System.Xml } reader.MoveToElement (); } + if (reader.IsEmptyElement) + WriteEndElement (); + else { + int depth = reader.Depth; + reader.Read (); + if (reader.NodeType != XmlNodeType.EndElement) { + do { + WriteNode (reader, defattr); + } while (depth < reader.Depth); + } + WriteFullEndElement (); + } reader.Read (); - WriteNode (reader, defattr); break; case XmlNodeType.Attribute: case XmlNodeType.Text: diff --git a/mcs/class/System.Runtime.Serialization/Test/System.Xml/ChangeLog b/mcs/class/System.Runtime.Serialization/Test/System.Xml/ChangeLog index 96d0399bc7a..cc4e99db702 100644 --- a/mcs/class/System.Runtime.Serialization/Test/System.Xml/ChangeLog +++ b/mcs/class/System.Runtime.Serialization/Test/System.Xml/ChangeLog @@ -1,3 +1,8 @@ +2009-07-07 Atsushi Enomoto + + * XmlSimpleDictionaryWriterTest.cs : test WriteNode() to not skip more + than two nodes in an element. + 2009-06-05 Atsushi Enomoto * XmlBinaryDictionaryReaderTest.cs : verify that end element has diff --git a/mcs/class/System.Runtime.Serialization/Test/System.Xml/XmlSimpleDictionaryWriterTest.cs b/mcs/class/System.Runtime.Serialization/Test/System.Xml/XmlSimpleDictionaryWriterTest.cs index 83fb1240cef..967ecbb4eaf 100644 --- a/mcs/class/System.Runtime.Serialization/Test/System.Xml/XmlSimpleDictionaryWriterTest.cs +++ b/mcs/class/System.Runtime.Serialization/Test/System.Xml/XmlSimpleDictionaryWriterTest.cs @@ -1293,5 +1293,19 @@ namespace MonoTests.System.Xml xw.WriteArray ("", "root", "", array, 1, 3); Assert.AreEqual ("falsetruetrue", Output, "#1"); } + + [Test] + public void WriteNode () + { + string s = @"79310c9f-18d4-4337-a95a-1865ca54a66e3amesh".Replace ('\'', '"'); + var sw = new StringWriter (); + var xw = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (sw, new XmlWriterSettings () { OmitXmlDeclaration = true })); + var xr = XmlDictionaryReader.CreateDictionaryReader (XmlReader.Create (new StringReader (s))); + xr.MoveToContent (); + while (!xr.EOF && xr.NodeType != XmlNodeType.EndElement) + xw.WriteNode (xr, false); + xw.Flush (); + Assert.AreEqual (s, sw.ToString ()); + } } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/ChangeLog b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/ChangeLog index 81e50eb39c0..6d222505d7a 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/ChangeLog +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/ChangeLog @@ -1,3 +1,7 @@ +2009-06-26 Robert Jordan + + * *.cs: Upgrade to new NUnit style. + 2008-11-01 Sebastien Pouliot * CmsRecipientCollectionTest.cs: Verify NRE behavior of ctor. diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CmsRecipientTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CmsRecipientTest.cs index 9cafb543721..c05141afb35 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CmsRecipientTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CmsRecipientTest.cs @@ -41,7 +41,7 @@ using System.Security.Cryptography.Xml; namespace MonoTests.System.Security.Cryptography.Pkcs { [TestFixture] - public class CmsRecipientTest : Assertion { + public class CmsRecipientTest { static public byte [] farscape_p12_pfx = { 0x30, 0x82, 0x07, 0x17, 0x02, 0x01, 0x03, 0x30, 0x82, 0x06, 0xD3, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82, 0x06, 0xC4, 0x04, 0x82, 0x06, 0xC0, 0x30, 0x82, 0x06, 0xBC, 0x30, 0x82, 0x03, 0xCD, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82, 0x03, 0xBE, 0x04, 0x82, 0x03, 0xBA, 0x30, 0x82, 0x03, 0xB6, 0x30, 0x82, 0x03, 0xB2, 0x06, 0x0B, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x0A, 0x01, 0x02, 0xA0, 0x82, 0x02, 0xB6, 0x30, 0x82, 0x02, 0xB2, 0x30, 0x1C, 0x06, 0x0A, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x03, 0x30, @@ -74,8 +74,8 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { X509Certificate2 x509 = GetCertificate (true); CmsRecipient p7r = new CmsRecipient (SubjectIdentifierType.IssuerAndSerialNumber, x509); - AssertEquals ("RecipientIdentifierType", SubjectIdentifierType.IssuerAndSerialNumber, p7r.RecipientIdentifierType); - AssertEquals ("Certificate", x509.Thumbprint, p7r.Certificate.Thumbprint); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, p7r.RecipientIdentifierType, "RecipientIdentifierType"); + Assert.AreEqual (x509.Thumbprint, p7r.Certificate.Thumbprint, "Certificate"); } [Test] @@ -83,8 +83,8 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { X509Certificate2 x509 = GetCertificate (true); CmsRecipient p7r = new CmsRecipient (SubjectIdentifierType.SubjectKeyIdentifier, x509); - AssertEquals ("RecipientIdentifierType", SubjectIdentifierType.SubjectKeyIdentifier, p7r.RecipientIdentifierType); - AssertEquals ("Certificate", x509.Thumbprint, p7r.Certificate.Thumbprint); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, p7r.RecipientIdentifierType, "RecipientIdentifierType"); + Assert.AreEqual (x509.Thumbprint, p7r.Certificate.Thumbprint, "Certificate"); } [Test] @@ -92,8 +92,8 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { X509Certificate2 x509 = GetCertificate (true); CmsRecipient p7r = new CmsRecipient (SubjectIdentifierType.Unknown, x509); - AssertEquals ("RecipientIdentifierType", SubjectIdentifierType.IssuerAndSerialNumber, p7r.RecipientIdentifierType); - AssertEquals ("Certificate", x509.Thumbprint, p7r.Certificate.Thumbprint); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, p7r.RecipientIdentifierType, "RecipientIdentifierType"); + Assert.AreEqual (x509.Thumbprint, p7r.Certificate.Thumbprint, "Certificate"); } [Test] diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CmsSignerTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CmsSignerTest.cs index 9082ee26a39..0f7b21b3bfc 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CmsSignerTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CmsSignerTest.cs @@ -40,7 +40,7 @@ using System.Security.Cryptography.X509Certificates; namespace MonoTests.System.Security.Cryptography.Pkcs { [TestFixture] - public class CmsSignerTest : Assertion { + public class CmsSignerTest { static byte[] asnNull = { 0x05, 0x00 }; static string sha1Oid = "1.3.14.3.2.26"; @@ -53,13 +53,13 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { CmsSigner ps = new CmsSigner (); // default properties - AssertEquals ("SignedAttributes", 0, ps.SignedAttributes.Count); - AssertNull ("Certificate", ps.Certificate); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, ps.DigestAlgorithm.Value); - AssertEquals ("IncludeOption", X509IncludeOption.ExcludeRoot, ps.IncludeOption); - AssertEquals ("SignerIdentifierType", SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType); - AssertEquals ("UnsignedAttributes", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNull (ps.Certificate, "Certificate"); + Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption"); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType"); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes"); } [Test] @@ -67,13 +67,13 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { CmsSigner ps = new CmsSigner (SubjectIdentifierType.IssuerAndSerialNumber); // default properties - AssertEquals ("SignedAttributes", 0, ps.SignedAttributes.Count); - AssertNull ("Certificate", ps.Certificate); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, ps.DigestAlgorithm.Value); - AssertEquals ("IncludeOption", X509IncludeOption.ExcludeRoot, ps.IncludeOption); - AssertEquals ("SignerIdentifierType", SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType); - AssertEquals ("UnsignedAttributes", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNull (ps.Certificate, "Certificate"); + Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption"); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType"); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes"); } [Test] @@ -81,13 +81,13 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { CmsSigner ps = new CmsSigner (SubjectIdentifierType.SubjectKeyIdentifier); // default properties - AssertEquals ("SignedAttributes", 0, ps.SignedAttributes.Count); - AssertNull ("Certificate", ps.Certificate); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, ps.DigestAlgorithm.Value); - AssertEquals ("IncludeOption", X509IncludeOption.ExcludeRoot, ps.IncludeOption); - AssertEquals ("SignerIdentifierType", SubjectIdentifierType.SubjectKeyIdentifier, ps.SignerIdentifierType); - AssertEquals ("UnsignedAttributes", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNull (ps.Certificate, "Certificate"); + Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption"); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, ps.SignerIdentifierType, "SignerIdentifierType"); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes"); } [Test] @@ -95,14 +95,14 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { CmsSigner ps = new CmsSigner (SubjectIdentifierType.Unknown); // default properties - AssertEquals ("SignedAttributes", 0, ps.SignedAttributes.Count); - AssertNull ("Certificate", ps.Certificate); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, ps.DigestAlgorithm.Value); - AssertEquals ("IncludeOption", X509IncludeOption.ExcludeRoot, ps.IncludeOption); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNull (ps.Certificate, "Certificate"); + Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption"); // Unknown is converted to IssuerAndSerialNumber - AssertEquals ("SignerIdentifierType", SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType); - AssertEquals ("UnsignedAttributes", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType"); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes"); } // TODO: return valid x509 certifiate with private key @@ -118,13 +118,13 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { X509Certificate2 x509 = GetValidCertificateWithPrivateKey (); CmsSigner ps = new CmsSigner (x509); // default properties - AssertEquals ("SignedAttributes", 0, ps.SignedAttributes.Count); - AssertNotNull ("Certificate", ps.Certificate); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, ps.DigestAlgorithm.Value); - AssertEquals ("IncludeOption", X509IncludeOption.ExcludeRoot, ps.IncludeOption); - AssertEquals ("SignerIdentifierType", SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType); - AssertEquals ("UnsignedAttributes", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNotNull (ps.Certificate, "Certificate"); + Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption"); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType"); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes"); } [Test] @@ -133,13 +133,13 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { X509Certificate2 x509 = new X509Certificate2 (); // empty CmsSigner ps = new CmsSigner (x509); // default properties - AssertEquals ("SignedAttributes", 0, ps.SignedAttributes.Count); - AssertNotNull ("Certificate", ps.Certificate); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, ps.DigestAlgorithm.Value); - AssertEquals ("IncludeOption", X509IncludeOption.ExcludeRoot, ps.IncludeOption); - AssertEquals ("SignerIdentifierType", SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType); - AssertEquals ("UnsignedAttributes", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNotNull (ps.Certificate, "Certificate"); + Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption"); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType"); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes"); } [Test] @@ -149,13 +149,13 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { X509Certificate2 x509 = null; CmsSigner ps = new CmsSigner (x509); // default properties - AssertEquals ("SignedAttributes", 0, ps.SignedAttributes.Count); - AssertNull ("Certificate", ps.Certificate); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, ps.DigestAlgorithm.Value); - AssertEquals ("IncludeOption", X509IncludeOption.ExcludeRoot, ps.IncludeOption); - AssertEquals ("SignerIdentifierType", SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType); - AssertEquals ("UnsignedAttributes", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNull (ps.Certificate, "Certificate"); + Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption"); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType"); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes"); } [Test] @@ -164,13 +164,13 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { X509Certificate2 x509 = GetValidCertificateWithPrivateKey (); CmsSigner ps = new CmsSigner (SubjectIdentifierType.IssuerAndSerialNumber, x509); // default properties - AssertEquals ("SignedAttributes", 0, ps.SignedAttributes.Count); - AssertNotNull ("Certificate", ps.Certificate); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, ps.DigestAlgorithm.Value); - AssertEquals ("IncludeOption", X509IncludeOption.ExcludeRoot, ps.IncludeOption); - AssertEquals ("SignerIdentifierType", SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType); - AssertEquals ("UnsignedAttributes", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNotNull (ps.Certificate, "Certificate"); + Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption"); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType"); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes"); } [Test] @@ -179,13 +179,13 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { X509Certificate2 x509 = GetValidCertificateWithPrivateKey (); CmsSigner ps = new CmsSigner (SubjectIdentifierType.SubjectKeyIdentifier, x509); // default properties - AssertEquals ("SignedAttributes", 0, ps.SignedAttributes.Count); - AssertNotNull ("Certificate", ps.Certificate); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, ps.DigestAlgorithm.Value); - AssertEquals ("IncludeOption", X509IncludeOption.ExcludeRoot, ps.IncludeOption); - AssertEquals ("SignerIdentifierType", SubjectIdentifierType.SubjectKeyIdentifier, ps.SignerIdentifierType); - AssertEquals ("UnsignedAttributes", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNotNull (ps.Certificate, "Certificate"); + Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption"); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, ps.SignerIdentifierType, "SignerIdentifierType"); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes"); } [Test] @@ -194,14 +194,14 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { X509Certificate2 x509 = GetValidCertificateWithPrivateKey (); CmsSigner ps = new CmsSigner (SubjectIdentifierType.Unknown, x509); // default properties - AssertEquals ("SignedAttributes", 0, ps.SignedAttributes.Count); - AssertNotNull ("Certificate", ps.Certificate); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, ps.DigestAlgorithm.Value); - AssertEquals ("IncludeOption", X509IncludeOption.ExcludeRoot, ps.IncludeOption); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNotNull (ps.Certificate, "Certificate"); + Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption"); // Unknown is converted to IssuerAndSerialNumber - AssertEquals ("SignerIdentifierType", SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType); - AssertEquals ("UnsignedAttributes", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType"); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes"); } [Test] @@ -210,33 +210,33 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { CmsSigner ps = new CmsSigner (SubjectIdentifierType.IssuerAndSerialNumber, null); // default properties - AssertEquals ("SignedAttributes", 0, ps.SignedAttributes.Count); - AssertNull ("Certificate", ps.Certificate); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, ps.DigestAlgorithm.Value); - AssertEquals ("IncludeOption", X509IncludeOption.ExcludeRoot, ps.IncludeOption); - AssertEquals ("SignerIdentifierType", SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType); - AssertEquals ("UnsignedAttributes", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNull (ps.Certificate, "Certificate"); + Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption"); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType"); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes"); } [Test] public void SignedAttributes () { CmsSigner ps = new CmsSigner (); - AssertEquals ("SignedAttributes=0", 0, ps.SignedAttributes.Count); + Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes=0"); ps.SignedAttributes.Add (new Pkcs9DocumentDescription ("mono")); - AssertEquals ("SignedAttributes=1", 1, ps.SignedAttributes.Count); + Assert.AreEqual (1, ps.SignedAttributes.Count, "SignedAttributes=1"); } [Test] public void Certificate () { CmsSigner ps = new CmsSigner (); - AssertNull ("Certificate=default(null)", ps.Certificate); + Assert.IsNull (ps.Certificate, "Certificate=default(null)"); ps.Certificate = GetValidCertificateWithPrivateKey (); - AssertNotNull ("Certificate!=null", ps.Certificate); + Assert.IsNotNull (ps.Certificate, "Certificate!=null"); ps.Certificate = null; - AssertNull ("Certificate=null", ps.Certificate); + Assert.IsNull (ps.Certificate, "Certificate=null"); } [Test] @@ -244,10 +244,10 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { CmsSigner ps = new CmsSigner (); ps.DigestAlgorithm = new Oid ("1.2.840.113549.2.5"); - AssertEquals ("DigestAlgorithm.FriendlyName", "md5", ps.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", "1.2.840.113549.2.5", ps.DigestAlgorithm.Value); + Assert.AreEqual ("md5", ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual ("1.2.840.113549.2.5", ps.DigestAlgorithm.Value, "DigestAlgorithm.Value"); ps.DigestAlgorithm = null; - AssertNull ("DigestAlgorithm=null", ps.DigestAlgorithm); + Assert.IsNull (ps.DigestAlgorithm, "DigestAlgorithm=null"); } [Test] @@ -255,13 +255,13 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { CmsSigner ps = new CmsSigner (); ps.IncludeOption = X509IncludeOption.EndCertOnly; - AssertEquals ("EndCertOnly", X509IncludeOption.EndCertOnly, ps.IncludeOption); + Assert.AreEqual (X509IncludeOption.EndCertOnly, ps.IncludeOption, "EndCertOnly"); ps.IncludeOption = X509IncludeOption.ExcludeRoot; - AssertEquals ("ExcludeRoot", X509IncludeOption.ExcludeRoot, ps.IncludeOption); + Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "ExcludeRoot"); ps.IncludeOption = X509IncludeOption.None; - AssertEquals ("None", X509IncludeOption.None, ps.IncludeOption); + Assert.AreEqual (X509IncludeOption.None, ps.IncludeOption, "None"); ps.IncludeOption = X509IncludeOption.WholeChain; - AssertEquals ("WholeChain", X509IncludeOption.WholeChain, ps.IncludeOption); + Assert.AreEqual (X509IncludeOption.WholeChain, ps.IncludeOption, "WholeChain"); } [Test] @@ -269,9 +269,9 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { CmsSigner ps = new CmsSigner (); ps.SignerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber; - AssertEquals ("IssuerAndSerialNumber", SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "IssuerAndSerialNumber"); ps.SignerIdentifierType = SubjectIdentifierType.SubjectKeyIdentifier; - AssertEquals ("SubjectKeyIdentifier", SubjectIdentifierType.SubjectKeyIdentifier, ps.SignerIdentifierType); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, ps.SignerIdentifierType, "SubjectKeyIdentifier"); } [Test] @@ -286,9 +286,9 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { public void UnauthenticatedAttributes () { CmsSigner ps = new CmsSigner (); - AssertEquals ("UnsignedAttributes=0", 0, ps.UnsignedAttributes.Count); + Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes=0"); ps.UnsignedAttributes.Add (new Pkcs9DocumentDescription ("mono")); - AssertEquals ("UnsignedAttributes=1", 1, ps.UnsignedAttributes.Count); + Assert.AreEqual (1, ps.UnsignedAttributes.Count, "UnsignedAttributes=1"); } } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CryptographicAttributeTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CryptographicAttributeTest.cs index 4d3aba0c111..a7fcd841707 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CryptographicAttributeTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/CryptographicAttributeTest.cs @@ -19,7 +19,7 @@ using System.Security.Cryptography.Pkcs; namespace MonoTests.System.Security.Cryptography.Pkcs { [TestFixture] - public class CryptographicAttributeTest : Assertion { + public class CryptographicAttributeTest { static string defaultOid = "1.2.840.113549.1.7.1"; static string defaultName = "PKCS 7 Data"; @@ -29,9 +29,9 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { Oid o = new Oid (defaultOid); CryptographicAttribute ca = new CryptographicAttribute (o); - AssertEquals ("Oid.FriendlyName", defaultName, ca.Oid.FriendlyName); - AssertEquals ("Oid.Value", defaultOid, ca.Oid.Value); - AssertEquals ("Values", 0, ca.Values.Count); + Assert.AreEqual (defaultName, ca.Oid.FriendlyName, "Oid.FriendlyName"); + Assert.AreEqual (defaultOid, ca.Oid.Value, "Oid.Value"); + Assert.AreEqual (0, ca.Values.Count, "Values"); } [Test] @@ -47,9 +47,9 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { Oid o = new Oid (defaultOid); ArrayList al = new ArrayList (); CryptographicAttribute ca = new CryptographicAttribute (o, al); - AssertEquals ("Oid.FriendlyName", defaultName, ca.Oid.FriendlyName); - AssertEquals ("Oid.Value", defaultOid, ca.Oid.Value); - AssertEquals ("Values", 0, ca.Values.Count); + Assert.AreEqual (defaultName, ca.Oid.FriendlyName, "Oid.FriendlyName"); + Assert.AreEqual (defaultOid, ca.Oid.Value, "Oid.Value"); + Assert.AreEqual (0, ca.Values.Count, "Values"); } [Test] @@ -75,9 +75,9 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { Oid o = new Oid (defaultOid); CryptographicAttribute ca = new CryptographicAttribute (o, o); - AssertEquals ("Oid.FriendlyName", defaultName, ca.Oid.FriendlyName); - AssertEquals ("Oid.Value", defaultOid, ca.Oid.Value); - AssertEquals ("Values", 1, ca.Values.Count); + Assert.AreEqual (defaultName, ca.Oid.FriendlyName, "Oid.FriendlyName"); + Assert.AreEqual (defaultOid, ca.Oid.Value, "Oid.Value"); + Assert.AreEqual (1, ca.Values.Count, "Values"); } [Test] diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/EnvelopedCmsTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/EnvelopedCmsTest.cs index d6febb0a5b5..2706cdfb034 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/EnvelopedCmsTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/EnvelopedCmsTest.cs @@ -41,7 +41,7 @@ using System.Security.Cryptography.X509Certificates; namespace MonoTests.System.Security.Cryptography.Pkcs { [TestFixture] - public class EnvelopedCmsTest : Assertion { + public class EnvelopedCmsTest { static byte[] asnNull = { 0x05, 0x00 }; static string tdesOid = "1.2.840.113549.3.7"; @@ -72,17 +72,17 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { private void DefaultProperties (EnvelopedCms ep, int contentLength, int version) { - AssertEquals ("Certificates", 0, ep.Certificates.Count); - AssertEquals ("ContentEncryptionAlgorithm.KeyLength", 0, ep.ContentEncryptionAlgorithm.KeyLength); - AssertEquals ("ContentEncryptionAlgorithm.Oid.FriendlyName", tdesName, ep.ContentEncryptionAlgorithm.Oid.FriendlyName); - AssertEquals ("ContentEncryptionAlgorithm.Oid.Value", tdesOid, ep.ContentEncryptionAlgorithm.Oid.Value); - AssertEquals ("ContentEncryptionAlgorithm.Parameters", 0, ep.ContentEncryptionAlgorithm.Parameters.Length); - AssertEquals ("ContentInfo.ContentType.FriendlyName", p7DataName, ep.ContentInfo.ContentType.FriendlyName); - AssertEquals ("ContentInfo.ContentType.Value", p7DataOid, ep.ContentInfo.ContentType.Value); - AssertEquals ("ContentInfo.Content", contentLength, ep.ContentInfo.Content.Length); - AssertEquals ("RecipientInfos", 0, ep.RecipientInfos.Count); - AssertEquals ("UnprotectedAttributes", 0, ep.UnprotectedAttributes.Count); - AssertEquals ("Version", version, ep.Version); + Assert.AreEqual (0, ep.Certificates.Count, "Certificates"); + Assert.AreEqual (0, ep.ContentEncryptionAlgorithm.KeyLength, "ContentEncryptionAlgorithm.KeyLength"); + Assert.AreEqual (tdesName, ep.ContentEncryptionAlgorithm.Oid.FriendlyName, "ContentEncryptionAlgorithm.Oid.FriendlyName"); + Assert.AreEqual (tdesOid, ep.ContentEncryptionAlgorithm.Oid.Value, "ContentEncryptionAlgorithm.Oid.Value"); + Assert.AreEqual (0, ep.ContentEncryptionAlgorithm.Parameters.Length, "ContentEncryptionAlgorithm.Parameters"); + Assert.AreEqual (p7DataName, ep.ContentInfo.ContentType.FriendlyName, "ContentInfo.ContentType.FriendlyName"); + Assert.AreEqual (p7DataOid, ep.ContentInfo.ContentType.Value, "ContentInfo.ContentType.Value"); + Assert.AreEqual (contentLength, ep.ContentInfo.Content.Length, "ContentInfo.Content"); + Assert.AreEqual (0, ep.RecipientInfos.Count, "RecipientInfos"); + Assert.AreEqual (0, ep.UnprotectedAttributes.Count, "UnprotectedAttributes"); + Assert.AreEqual (version, ep.Version, "Version"); } private X509Certificate2 GetCertificate (bool includePrivateKey) @@ -196,19 +196,19 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { EnvelopedCms ep = new EnvelopedCms (); ep.Decode (encoded); // properties - AssertEquals ("Certificates", 0, ep.Certificates.Count); - AssertEquals ("ContentEncryptionAlgorithm.KeyLength", 192, ep.ContentEncryptionAlgorithm.KeyLength); - AssertEquals ("ContentEncryptionAlgorithm.Oid.FriendlyName", tdesName, ep.ContentEncryptionAlgorithm.Oid.FriendlyName); - AssertEquals ("ContentEncryptionAlgorithm.Oid.Value", tdesOid, ep.ContentEncryptionAlgorithm.Oid.Value); - AssertEquals ("ContentEncryptionAlgorithm.Parameters", 16, ep.ContentEncryptionAlgorithm.Parameters.Length); - AssertEquals ("ContentInfo.ContentType.FriendlyName", p7DataName, ep.ContentInfo.ContentType.FriendlyName); - AssertEquals ("ContentInfo.ContentType.Value", p7DataOid, ep.ContentInfo.ContentType.Value); - AssertEquals ("ContentInfo.Content", 14, ep.ContentInfo.Content.Length); - AssertEquals ("RecipientInfos", 1, ep.RecipientInfos.Count); + Assert.AreEqual (0, ep.Certificates.Count, "Certificates"); + Assert.AreEqual (192, ep.ContentEncryptionAlgorithm.KeyLength, "ContentEncryptionAlgorithm.KeyLength"); + Assert.AreEqual (tdesName, ep.ContentEncryptionAlgorithm.Oid.FriendlyName, "ContentEncryptionAlgorithm.Oid.FriendlyName"); + Assert.AreEqual (tdesOid, ep.ContentEncryptionAlgorithm.Oid.Value, "ContentEncryptionAlgorithm.Oid.Value"); + Assert.AreEqual (16, ep.ContentEncryptionAlgorithm.Parameters.Length, "ContentEncryptionAlgorithm.Parameters"); + Assert.AreEqual (p7DataName, ep.ContentInfo.ContentType.FriendlyName, "ContentInfo.ContentType.FriendlyName"); + Assert.AreEqual (p7DataOid, ep.ContentInfo.ContentType.Value, "ContentInfo.ContentType.Value"); + Assert.AreEqual (14, ep.ContentInfo.Content.Length, "ContentInfo.Content"); + Assert.AreEqual (1, ep.RecipientInfos.Count, "RecipientInfos"); RecipientInfo ri = ep.RecipientInfos [0]; - Assert ("RecipientInfos is KeyTransRecipientInfo", (ri is KeyTransRecipientInfo)); - AssertEquals ("UnprotectedAttributes", 0, ep.UnprotectedAttributes.Count); - AssertEquals ("Version", 0, ep.Version); + Assert.IsTrue ((ri is KeyTransRecipientInfo), "RecipientInfos is KeyTransRecipientInfo"); + Assert.AreEqual (0, ep.UnprotectedAttributes.Count, "UnprotectedAttributes"); + Assert.AreEqual (0, ep.Version, "Version"); } [Test] @@ -240,17 +240,17 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { xc.Add (x509); ep.Decrypt (xc); // properties - AssertEquals ("Certificates", 0, ep.Certificates.Count); - AssertEquals ("ContentEncryptionAlgorithm.KeyLength", 192, ep.ContentEncryptionAlgorithm.KeyLength); - AssertEquals ("ContentEncryptionAlgorithm.Oid.FriendlyName", tdesName, ep.ContentEncryptionAlgorithm.Oid.FriendlyName); - AssertEquals ("ContentEncryptionAlgorithm.Oid.Value", tdesOid, ep.ContentEncryptionAlgorithm.Oid.Value); - AssertEquals ("ContentEncryptionAlgorithm.Parameters", 16, ep.ContentEncryptionAlgorithm.Parameters.Length); - AssertEquals ("ContentInfo.ContentType.FriendlyName", p7DataName, ep.ContentInfo.ContentType.FriendlyName); - AssertEquals ("ContentInfo.ContentType.Value", p7DataOid, ep.ContentInfo.ContentType.Value); - AssertEquals ("ContentInfo.Content", "05-00", BitConverter.ToString (ep.ContentInfo.Content)); - AssertEquals ("RecipientInfos", 1, ep.RecipientInfos.Count); - AssertEquals ("UnprotectedAttributes", 0, ep.UnprotectedAttributes.Count); - AssertEquals ("Version", 0, ep.Version); + Assert.AreEqual (0, ep.Certificates.Count, "Certificates"); + Assert.AreEqual (192, ep.ContentEncryptionAlgorithm.KeyLength, "ContentEncryptionAlgorithm.KeyLength"); + Assert.AreEqual (tdesName, ep.ContentEncryptionAlgorithm.Oid.FriendlyName, "ContentEncryptionAlgorithm.Oid.FriendlyName"); + Assert.AreEqual (tdesOid, ep.ContentEncryptionAlgorithm.Oid.Value, "ContentEncryptionAlgorithm.Oid.Value"); + Assert.AreEqual (16, ep.ContentEncryptionAlgorithm.Parameters.Length, "ContentEncryptionAlgorithm.Parameters"); + Assert.AreEqual (p7DataName, ep.ContentInfo.ContentType.FriendlyName, "ContentInfo.ContentType.FriendlyName"); + Assert.AreEqual (p7DataOid, ep.ContentInfo.ContentType.Value, "ContentInfo.ContentType.Value"); + Assert.AreEqual ("05-00", BitConverter.ToString (ep.ContentInfo.Content), "ContentInfo.Content"); + Assert.AreEqual (1, ep.RecipientInfos.Count, "RecipientInfos"); + Assert.AreEqual (0, ep.UnprotectedAttributes.Count, "UnprotectedAttributes"); + Assert.AreEqual (0, ep.Version, "Version"); } [Test] @@ -304,7 +304,7 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { EnvelopedCms ep = new EnvelopedCms (); ep.Decode (encoded); ep.Decrypt (xc); - AssertEquals ("ContentInfo.Content", "05-00", BitConverter.ToString (ep.ContentInfo.Content)); + Assert.AreEqual ("05-00", BitConverter.ToString (ep.ContentInfo.Content), "ContentInfo.Content"); } [Test] diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/KeyTransRecipientInfoTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/KeyTransRecipientInfoTest.cs index 8e9765ad444..20b86b1e442 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/KeyTransRecipientInfoTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/KeyTransRecipientInfoTest.cs @@ -41,7 +41,7 @@ using System.Security.Cryptography.Xml; namespace MonoTests.System.Security.Cryptography.Pkcs { [TestFixture] - public class KeyTransRecipientInfoTest : Assertion { + public class KeyTransRecipientInfoTest { static private byte[] issuerAndSerialNumber = { 0x30, 0x82, 0x01, 0x1C, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x03, 0xA0, 0x82, 0x01, 0x0D, 0x30, 0x82, 0x01, 0x09, 0x02, 0x01, 0x00, 0x31, 0x81, 0xD6, 0x30, 0x81, 0xD3, 0x02, 0x01, 0x00, 0x30, 0x3C, 0x30, 0x28, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1D, 0x4D, 0x6F, 0x74, 0x75, 0x73, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, 0x69, 0x65, 0x73, 0x20, 0x69, 0x6E, 0x63, 0x2E, 0x28, 0x74, 0x65, 0x73, 0x74, 0x29, 0x02, 0x10, 0x91, 0xC4, 0x4B, 0x0D, 0xB7, 0xD8, 0x10, 0x84, 0x42, 0x26, 0x71, 0xB3, 0x97, 0xB5, 0x00, 0x97, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x81, 0x80, 0xCA, 0x4B, 0x97, 0x9C, 0xAB, 0x79, 0xC6, 0xDF, 0x6A, 0x27, 0xC7, 0x24, 0xC4, 0x5E, 0x3B, 0x31, 0xAD, 0xBC, 0x25, 0xE6, 0x38, 0x5E, 0x79, 0x26, 0x0E, 0x68, 0x46, 0x1D, 0x21, 0x81, 0x38, 0x92, 0xEC, 0xCB, 0x7C, 0x91, 0xD6, 0x09, 0x38, 0x91, 0xCE, 0x50, 0x5B, 0x70, 0x31, 0xB0, 0x9F, 0xFC, 0xE2, 0xEE, 0x45, 0xBC, 0x4B, 0xF8, 0x9A, 0xD9, 0xEE, 0xE7, 0x4A, 0x3D, 0xCD, 0x8D, 0xFF, 0x10, 0xAB, 0xC8, 0x19, 0x05, 0x54, 0x5E, 0x40, 0x7A, 0xBE, 0x2B, 0xD7, 0x22, 0x97, 0xF3, 0x23, 0xAF, 0x50, 0xF5, 0xEB, 0x43, 0x06, 0xC3, 0xFB, 0x17, 0xCA, 0xBD, 0xAD, 0x28, 0xD8, 0x10, 0x0F, 0x61, 0xCE, 0xF8, 0x25, 0x70, 0xF6, 0xC8, 0x1E, 0x7F, 0x82, 0xE5, 0x94, 0xEB, 0x11, 0xBF, 0xB8, 0x6F, 0xEE, 0x79, 0xCD, 0x63, 0xDD, 0x59, 0x8D, 0x25, 0x0E, 0x78, 0x55, 0xCE, 0x21, 0xBA, 0x13, 0x6B, 0x30, 0x2B, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0x30, 0x14, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x03, 0x07, 0x04, 0x08, 0x8C, 0x5D, 0xC9, 0x87, 0x88, 0x9C, 0x05, 0x72, 0x80, 0x08, 0x2C, 0xAF, 0x82, 0x91, 0xEC, 0xAD, 0xC5, 0xB5 }; static private byte[] subjectKeyIdentifier = { 0x30, 0x81, 0xF2, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x03, 0xA0, 0x81, 0xE4, 0x30, 0x81, 0xE1, 0x02, 0x01, 0x02, 0x31, 0x81, 0xAE, 0x30, 0x81, 0xAB, 0x02, 0x01, 0x02, 0x80, 0x14, 0x02, 0xE1, 0xA7, 0x32, 0x54, 0xAE, 0xFD, 0xC0, 0xA4, 0x32, 0x36, 0xF6, 0xFE, 0x23, 0x6A, 0x03, 0x72, 0x28, 0xB1, 0xF7, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x81, 0x80, 0x4E, 0x0C, 0xA0, 0x9D, 0x79, 0xD0, 0x31, 0x12, 0x96, 0x32, 0xD5, 0x9B, 0x51, 0x49, 0xDC, 0xC5, 0xC4, 0xFB, 0xFE, 0xE8, 0x33, 0x11, 0x13, 0xBE, 0x48, 0x02, 0x5D, 0x99, 0x9D, 0xB5, 0xAC, 0x52, 0xA3, 0xE3, 0xDE, 0x1B, 0x88, 0x00, 0x7C, 0x3E, 0xD4, 0xFE, 0x93, 0x6A, 0x93, 0x03, 0x04, 0x73, 0xA9, 0x22, 0x3E, 0xD5, 0x2A, 0xEE, 0xD7, 0xFC, 0xFB, 0xB4, 0xFF, 0xD4, 0x9B, 0x32, 0x4F, 0xB3, 0x1E, 0x8E, 0xBA, 0xF7, 0xD3, 0x12, 0x07, 0x19, 0xB8, 0x28, 0x57, 0xC4, 0x54, 0x33, 0x14, 0x83, 0x77, 0xA6, 0x14, 0x00, 0xF2, 0x02, 0xA9, 0x9B, 0x45, 0xF3, 0xAB, 0x41, 0x00, 0x69, 0xE2, 0xB3, 0xD0, 0xB9, 0xA3, 0x2D, 0x9E, 0x29, 0x7F, 0xBC, 0xAE, 0x92, 0x05, 0x11, 0x5A, 0x06, 0xB7, 0x26, 0x83, 0x0A, 0x33, 0x32, 0x6E, 0x5F, 0x4A, 0x5D, 0x32, 0x2E, 0x51, 0xD4, 0xE9, 0xD5, 0x17, 0xC9, 0x30, 0x2B, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0x30, 0x14, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x03, 0x07, 0x04, 0x08, 0x55, 0x62, 0xB4, 0x77, 0x9A, 0x99, 0x39, 0xEF, 0x80, 0x08, 0x76, 0x3A, 0x9B, 0x63, 0x46, 0x95, 0xDB, 0xFA }; @@ -57,17 +57,17 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { public void IssuerAndSerialNumber () { KeyTransRecipientInfo ktri = GetKeyTransRecipientInfo (issuerAndSerialNumber); - AssertEquals ("EncryptedKey", "CA-4B-97-9C-AB-79-C6-DF-6A-27-C7-24-C4-5E-3B-31-AD-BC-25-E6-38-5E-79-26-0E-68-46-1D-21-81-38-92-EC-CB-7C-91-D6-09-38-91-CE-50-5B-70-31-B0-9F-FC-E2-EE-45-BC-4B-F8-9A-D9-EE-E7-4A-3D-CD-8D-FF-10-AB-C8-19-05-54-5E-40-7A-BE-2B-D7-22-97-F3-23-AF-50-F5-EB-43-06-C3-FB-17-CA-BD-AD-28-D8-10-0F-61-CE-F8-25-70-F6-C8-1E-7F-82-E5-94-EB-11-BF-B8-6F-EE-79-CD-63-DD-59-8D-25-0E-78-55-CE-21-BA-13-6B", BitConverter.ToString (ktri.EncryptedKey)); - AssertEquals ("KeyEncryptionAlgorithm.KeyLength", 0, ktri.KeyEncryptionAlgorithm.KeyLength); - AssertEquals ("KeyEncryptionAlgorithm.Oid.FriendlyName", "RSA", ktri.KeyEncryptionAlgorithm.Oid.FriendlyName); - AssertEquals ("KeyEncryptionAlgorithm.Oid.Value", "1.2.840.113549.1.1.1", ktri.KeyEncryptionAlgorithm.Oid.Value); - AssertEquals ("KeyEncryptionAlgorithm.Parameters", 0, ktri.KeyEncryptionAlgorithm.Parameters.Length); - AssertEquals ("RecipientIdentifier.Type", SubjectIdentifierType.IssuerAndSerialNumber, ktri.RecipientIdentifier.Type); + Assert.AreEqual ("CA-4B-97-9C-AB-79-C6-DF-6A-27-C7-24-C4-5E-3B-31-AD-BC-25-E6-38-5E-79-26-0E-68-46-1D-21-81-38-92-EC-CB-7C-91-D6-09-38-91-CE-50-5B-70-31-B0-9F-FC-E2-EE-45-BC-4B-F8-9A-D9-EE-E7-4A-3D-CD-8D-FF-10-AB-C8-19-05-54-5E-40-7A-BE-2B-D7-22-97-F3-23-AF-50-F5-EB-43-06-C3-FB-17-CA-BD-AD-28-D8-10-0F-61-CE-F8-25-70-F6-C8-1E-7F-82-E5-94-EB-11-BF-B8-6F-EE-79-CD-63-DD-59-8D-25-0E-78-55-CE-21-BA-13-6B", BitConverter.ToString (ktri.EncryptedKey), "EncryptedKey"); + Assert.AreEqual (0, ktri.KeyEncryptionAlgorithm.KeyLength, "KeyEncryptionAlgorithm.KeyLength"); + Assert.AreEqual ("RSA", ktri.KeyEncryptionAlgorithm.Oid.FriendlyName, "KeyEncryptionAlgorithm.Oid.FriendlyName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", ktri.KeyEncryptionAlgorithm.Oid.Value, "KeyEncryptionAlgorithm.Oid.Value"); + Assert.AreEqual (0, ktri.KeyEncryptionAlgorithm.Parameters.Length, "KeyEncryptionAlgorithm.Parameters"); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ktri.RecipientIdentifier.Type, "RecipientIdentifier.Type"); X509IssuerSerial xis = (X509IssuerSerial) ktri.RecipientIdentifier.Value; - AssertEquals ("RecipientIdentifier.Value.IssuerName", "CN=Motus Technologies inc.(test)", xis.IssuerName); - AssertEquals ("RecipientIdentifier.Value.SerialNumber", "91C44B0DB7D81084422671B397B50097", xis.SerialNumber); - AssertEquals ("Type", RecipientInfoType.KeyTransport, ktri.Type); - AssertEquals ("Version", 0, ktri.Version); + Assert.AreEqual ("CN=Motus Technologies inc.(test)", xis.IssuerName, "RecipientIdentifier.Value.IssuerName"); + Assert.AreEqual ("91C44B0DB7D81084422671B397B50097", xis.SerialNumber, "RecipientIdentifier.Value.SerialNumber"); + Assert.AreEqual (RecipientInfoType.KeyTransport, ktri.Type, "Type"); + Assert.AreEqual (0, ktri.Version, "Version"); } [Test] @@ -75,24 +75,24 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { public void SubjectKeyIdentifier () { KeyTransRecipientInfo ktri = GetKeyTransRecipientInfo (subjectKeyIdentifier); - AssertEquals ("EncryptedKey", "4E-0C-A0-9D-79-D0-31-12-96-32-D5-9B-51-49-DC-C5-C4-FB-FE-E8-33-11-13-BE-48-02-5D-99-9D-B5-AC-52-A3-E3-DE-1B-88-00-7C-3E-D4-FE-93-6A-93-03-04-73-A9-22-3E-D5-2A-EE-D7-FC-FB-B4-FF-D4-9B-32-4F-B3-1E-8E-BA-F7-D3-12-07-19-B8-28-57-C4-54-33-14-83-77-A6-14-00-F2-02-A9-9B-45-F3-AB-41-00-69-E2-B3-D0-B9-A3-2D-9E-29-7F-BC-AE-92-05-11-5A-06-B7-26-83-0A-33-32-6E-5F-4A-5D-32-2E-51-D4-E9-D5-17-C9", BitConverter.ToString (ktri.EncryptedKey)); - AssertEquals ("KeyEncryptionAlgorithm.KeyLength", 0, ktri.KeyEncryptionAlgorithm.KeyLength); - AssertEquals ("KeyEncryptionAlgorithm.Oid.FriendlyName", "RSA", ktri.KeyEncryptionAlgorithm.Oid.FriendlyName); - AssertEquals ("KeyEncryptionAlgorithm.Oid.Value", "1.2.840.113549.1.1.1", ktri.KeyEncryptionAlgorithm.Oid.Value); - AssertEquals ("KeyEncryptionAlgorithm.Parameters", 0, ktri.KeyEncryptionAlgorithm.Parameters.Length); - AssertEquals ("RecipientIdentifier.Type", SubjectIdentifierType.SubjectKeyIdentifier, ktri.RecipientIdentifier.Type); - AssertEquals ("RecipientIdentifier.Value", "02E1A73254AEFDC0A43236F6FE236A037228B1F7", (string)ktri.RecipientIdentifier.Value); - AssertEquals ("Type", RecipientInfoType.KeyTransport, ktri.Type); - AssertEquals ("Version", 2, ktri.Version); + Assert.AreEqual ("4E-0C-A0-9D-79-D0-31-12-96-32-D5-9B-51-49-DC-C5-C4-FB-FE-E8-33-11-13-BE-48-02-5D-99-9D-B5-AC-52-A3-E3-DE-1B-88-00-7C-3E-D4-FE-93-6A-93-03-04-73-A9-22-3E-D5-2A-EE-D7-FC-FB-B4-FF-D4-9B-32-4F-B3-1E-8E-BA-F7-D3-12-07-19-B8-28-57-C4-54-33-14-83-77-A6-14-00-F2-02-A9-9B-45-F3-AB-41-00-69-E2-B3-D0-B9-A3-2D-9E-29-7F-BC-AE-92-05-11-5A-06-B7-26-83-0A-33-32-6E-5F-4A-5D-32-2E-51-D4-E9-D5-17-C9", BitConverter.ToString (ktri.EncryptedKey), "EncryptedKey"); + Assert.AreEqual (0, ktri.KeyEncryptionAlgorithm.KeyLength, "KeyEncryptionAlgorithm.KeyLength"); + Assert.AreEqual ("RSA", ktri.KeyEncryptionAlgorithm.Oid.FriendlyName, "KeyEncryptionAlgorithm.Oid.FriendlyName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", ktri.KeyEncryptionAlgorithm.Oid.Value, "KeyEncryptionAlgorithm.Oid.Value"); + Assert.AreEqual (0, ktri.KeyEncryptionAlgorithm.Parameters.Length, "KeyEncryptionAlgorithm.Parameters"); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, ktri.RecipientIdentifier.Type, "RecipientIdentifier.Type"); + Assert.AreEqual ("02E1A73254AEFDC0A43236F6FE236A037228B1F7", (string)ktri.RecipientIdentifier.Value, "RecipientIdentifier.Value"); + Assert.AreEqual (RecipientInfoType.KeyTransport, ktri.Type, "Type"); + Assert.AreEqual (2, ktri.Version, "Version"); } [Test] public void EncryptedKey_ModifyContent () { KeyTransRecipientInfo ktri = GetKeyTransRecipientInfo (issuerAndSerialNumber); - AssertEquals ("EncryptedKey", "CA-4B-97-9C-AB-79-C6-DF-6A-27-C7-24-C4-5E-3B-31-AD-BC-25-E6-38-5E-79-26-0E-68-46-1D-21-81-38-92-EC-CB-7C-91-D6-09-38-91-CE-50-5B-70-31-B0-9F-FC-E2-EE-45-BC-4B-F8-9A-D9-EE-E7-4A-3D-CD-8D-FF-10-AB-C8-19-05-54-5E-40-7A-BE-2B-D7-22-97-F3-23-AF-50-F5-EB-43-06-C3-FB-17-CA-BD-AD-28-D8-10-0F-61-CE-F8-25-70-F6-C8-1E-7F-82-E5-94-EB-11-BF-B8-6F-EE-79-CD-63-DD-59-8D-25-0E-78-55-CE-21-BA-13-6B", BitConverter.ToString (ktri.EncryptedKey)); + Assert.AreEqual ("CA-4B-97-9C-AB-79-C6-DF-6A-27-C7-24-C4-5E-3B-31-AD-BC-25-E6-38-5E-79-26-0E-68-46-1D-21-81-38-92-EC-CB-7C-91-D6-09-38-91-CE-50-5B-70-31-B0-9F-FC-E2-EE-45-BC-4B-F8-9A-D9-EE-E7-4A-3D-CD-8D-FF-10-AB-C8-19-05-54-5E-40-7A-BE-2B-D7-22-97-F3-23-AF-50-F5-EB-43-06-C3-FB-17-CA-BD-AD-28-D8-10-0F-61-CE-F8-25-70-F6-C8-1E-7F-82-E5-94-EB-11-BF-B8-6F-EE-79-CD-63-DD-59-8D-25-0E-78-55-CE-21-BA-13-6B", BitConverter.ToString (ktri.EncryptedKey), "EncryptedKey"); ktri.EncryptedKey[0] = 0x00; - AssertEquals ("EncryptedKey", "00-4B-97-9C-AB-79-C6-DF-6A-27-C7-24-C4-5E-3B-31-AD-BC-25-E6-38-5E-79-26-0E-68-46-1D-21-81-38-92-EC-CB-7C-91-D6-09-38-91-CE-50-5B-70-31-B0-9F-FC-E2-EE-45-BC-4B-F8-9A-D9-EE-E7-4A-3D-CD-8D-FF-10-AB-C8-19-05-54-5E-40-7A-BE-2B-D7-22-97-F3-23-AF-50-F5-EB-43-06-C3-FB-17-CA-BD-AD-28-D8-10-0F-61-CE-F8-25-70-F6-C8-1E-7F-82-E5-94-EB-11-BF-B8-6F-EE-79-CD-63-DD-59-8D-25-0E-78-55-CE-21-BA-13-6B", BitConverter.ToString (ktri.EncryptedKey)); + Assert.AreEqual ("00-4B-97-9C-AB-79-C6-DF-6A-27-C7-24-C4-5E-3B-31-AD-BC-25-E6-38-5E-79-26-0E-68-46-1D-21-81-38-92-EC-CB-7C-91-D6-09-38-91-CE-50-5B-70-31-B0-9F-FC-E2-EE-45-BC-4B-F8-9A-D9-EE-E7-4A-3D-CD-8D-FF-10-AB-C8-19-05-54-5E-40-7A-BE-2B-D7-22-97-F3-23-AF-50-F5-EB-43-06-C3-FB-17-CA-BD-AD-28-D8-10-0F-61-CE-F8-25-70-F6-C8-1E-7F-82-E5-94-EB-11-BF-B8-6F-EE-79-CD-63-DD-59-8D-25-0E-78-55-CE-21-BA-13-6B", BitConverter.ToString (ktri.EncryptedKey), "EncryptedKey"); // this is a reference (not a copy) of the key } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SignedCmsTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SignedCmsTest.cs index 7a3594bcc13..dadcd67219f 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SignedCmsTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SignedCmsTest.cs @@ -41,7 +41,7 @@ using System.Security.Cryptography.X509Certificates; namespace MonoTests.System.Security.Cryptography.Pkcs { [TestFixture] - public class SignedCmsTest : Assertion { + public class SignedCmsTest { static byte[] asnNull = { 0x05, 0x00 }; static string pkcs7Oid = "1.2.840.113549.1.7.1"; @@ -87,9 +87,9 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { private void DefaultProperties (SignedCms sp, int version) { // unaffected by constructors - AssertEquals ("Certificates", 0, sp.Certificates.Count); - AssertEquals ("SignerInfos", 0, sp.SignerInfos.Count); - AssertEquals ("Version", version, sp.Version); + Assert.AreEqual (0, sp.Certificates.Count, "Certificates"); + Assert.AreEqual (0, sp.SignerInfos.Count, "SignerInfos"); + Assert.AreEqual (version, sp.Version, "Version"); } private X509Certificate2 GetCertificate (bool includePrivateKey) @@ -108,10 +108,10 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { SignedCms sp = new SignedCms (); // default properties - AssertEquals ("ContentInfo.ContentType.FriendlyName", pkcs7Name, sp.ContentInfo.ContentType.FriendlyName); - AssertEquals ("ContentInfo.ContentType.Value", pkcs7Oid, sp.ContentInfo.ContentType.Value); - AssertEquals ("ContentInfo.Content", 0, sp.ContentInfo.Content.Length); - Assert ("Detached", !sp.Detached); + Assert.AreEqual (pkcs7Name, sp.ContentInfo.ContentType.FriendlyName, "ContentInfo.ContentType.FriendlyName"); + Assert.AreEqual (pkcs7Oid, sp.ContentInfo.ContentType.Value, "ContentInfo.ContentType.Value"); + Assert.AreEqual (0, sp.ContentInfo.Content.Length, "ContentInfo.Content"); + Assert.IsTrue (!sp.Detached, "Detached"); DefaultProperties (sp, 0); } @@ -122,10 +122,10 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { ContentInfo ci = new ContentInfo (oid, asnNull); SignedCms sp = new SignedCms (ci); // default properties - AssertEquals ("ContentInfo.ContentType.FriendlyName", rsaName, sp.ContentInfo.ContentType.FriendlyName); - AssertEquals ("ContentInfo.ContentType.Value", rsaOid, sp.ContentInfo.ContentType.Value); - AssertEquals ("ContentInfo.Content", 2, sp.ContentInfo.Content.Length); - Assert ("Detached", !sp.Detached); + Assert.AreEqual (rsaName, sp.ContentInfo.ContentType.FriendlyName, "ContentInfo.ContentType.FriendlyName"); + Assert.AreEqual (rsaOid, sp.ContentInfo.ContentType.Value, "ContentInfo.ContentType.Value"); + Assert.AreEqual (2, sp.ContentInfo.Content.Length, "ContentInfo.Content"); + Assert.IsTrue (!sp.Detached, "Detached"); DefaultProperties (sp, 0); } @@ -143,10 +143,10 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { ContentInfo ci = new ContentInfo (oid, asnNull); SignedCms sp = new SignedCms (ci, true); // default properties - AssertEquals ("ContentInfo.ContentType.FriendlyName", rsaName, sp.ContentInfo.ContentType.FriendlyName); - AssertEquals ("ContentInfo.ContentType.Value", rsaOid, sp.ContentInfo.ContentType.Value); - AssertEquals ("ContentInfo.Content", 2, sp.ContentInfo.Content.Length); - Assert ("Detached", sp.Detached); + Assert.AreEqual (rsaName, sp.ContentInfo.ContentType.FriendlyName, "ContentInfo.ContentType.FriendlyName"); + Assert.AreEqual (rsaOid, sp.ContentInfo.ContentType.Value, "ContentInfo.ContentType.Value"); + Assert.AreEqual (2, sp.ContentInfo.Content.Length, "ContentInfo.Content"); + Assert.IsTrue (sp.Detached, "Detached"); DefaultProperties (sp, 0); } @@ -157,10 +157,10 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { ContentInfo ci = new ContentInfo (oid, asnNull); SignedCms sp = new SignedCms (ci, false); // default properties - AssertEquals ("ContentInfo.ContentType.FriendlyName", rsaName, sp.ContentInfo.ContentType.FriendlyName); - AssertEquals ("ContentInfo.ContentType.Value", rsaOid, sp.ContentInfo.ContentType.Value); - AssertEquals ("ContentInfo.Content", 2, sp.ContentInfo.Content.Length); - Assert ("Detached", !sp.Detached); + Assert.AreEqual (rsaName, sp.ContentInfo.ContentType.FriendlyName, "ContentInfo.ContentType.FriendlyName"); + Assert.AreEqual (rsaOid, sp.ContentInfo.ContentType.Value, "ContentInfo.ContentType.Value"); + Assert.AreEqual (2, sp.ContentInfo.Content.Length, "ContentInfo.Content"); + Assert.IsTrue (!sp.Detached, "Detached"); } [Test] @@ -172,10 +172,10 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { private void DefaultSubjectIdentifierTypePropertiesCms (SignedCms sp, int version) { - AssertEquals ("ContentInfo.ContentType.FriendlyName", pkcs7Name, sp.ContentInfo.ContentType.FriendlyName); - AssertEquals ("ContentInfo.ContentType.Value", pkcs7Oid, sp.ContentInfo.ContentType.Value); - AssertEquals ("ContentInfo.Content", 0, sp.ContentInfo.Content.Length); - Assert ("Detached", !sp.Detached); + Assert.AreEqual (pkcs7Name, sp.ContentInfo.ContentType.FriendlyName, "ContentInfo.ContentType.FriendlyName"); + Assert.AreEqual (pkcs7Oid, sp.ContentInfo.ContentType.Value, "ContentInfo.ContentType.Value"); + Assert.AreEqual (0, sp.ContentInfo.Content.Length, "ContentInfo.Content"); + Assert.IsTrue (!sp.Detached, "Detached"); DefaultProperties (sp, version); } @@ -205,9 +205,9 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { private void DefaultSubjectIdentifierTypeProperties (SignedCms sp, int version) { - AssertEquals ("ContentInfo.ContentType.FriendlyName", rsaName, sp.ContentInfo.ContentType.FriendlyName); - AssertEquals ("ContentInfo.ContentType.Value", rsaOid, sp.ContentInfo.ContentType.Value); - AssertEquals ("ContentInfo.Content", 2, sp.ContentInfo.Content.Length); + Assert.AreEqual (rsaName, sp.ContentInfo.ContentType.FriendlyName, "ContentInfo.ContentType.FriendlyName"); + Assert.AreEqual (rsaOid, sp.ContentInfo.ContentType.Value, "ContentInfo.ContentType.Value"); + Assert.AreEqual (2, sp.ContentInfo.Content.Length, "ContentInfo.Content"); DefaultProperties (sp, version); } @@ -218,7 +218,7 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { ContentInfo ci = new ContentInfo (oid, asnNull); SignedCms sp = new SignedCms (SubjectIdentifierType.IssuerAndSerialNumber, ci); // default properties - Assert ("Detached", !sp.Detached); + Assert.IsTrue (!sp.Detached, "Detached"); DefaultSubjectIdentifierTypeProperties (sp, 0); } @@ -229,7 +229,7 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { ContentInfo ci = new ContentInfo (oid, asnNull); SignedCms sp = new SignedCms (SubjectIdentifierType.SubjectKeyIdentifier, ci); // default properties - Assert ("Detached", !sp.Detached); + Assert.IsTrue (!sp.Detached, "Detached"); DefaultSubjectIdentifierTypeProperties (sp, 0); } @@ -240,7 +240,7 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { ContentInfo ci = new ContentInfo (oid, asnNull); SignedCms sp = new SignedCms (SubjectIdentifierType.Unknown, ci); // default properties - Assert ("Detached", !sp.Detached); + Assert.IsTrue (!sp.Detached, "Detached"); DefaultSubjectIdentifierTypeProperties (sp, 0); } @@ -258,7 +258,7 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { ContentInfo ci = new ContentInfo (oid, asnNull); SignedCms sp = new SignedCms (SubjectIdentifierType.IssuerAndSerialNumber, ci, true); // default properties - Assert ("Detached", sp.Detached); + Assert.IsTrue (sp.Detached, "Detached"); DefaultSubjectIdentifierTypeProperties (sp, 0); } @@ -269,7 +269,7 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { ContentInfo ci = new ContentInfo (oid, asnNull); SignedCms sp = new SignedCms (SubjectIdentifierType.SubjectKeyIdentifier, ci, true); // default properties - Assert ("Detached", sp.Detached); + Assert.IsTrue (sp.Detached, "Detached"); DefaultSubjectIdentifierTypeProperties (sp, 0); } @@ -280,7 +280,7 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { ContentInfo ci = new ContentInfo (oid, asnNull); SignedCms sp = new SignedCms (SubjectIdentifierType.Unknown, ci, true); // default properties - Assert ("Detached", sp.Detached); + Assert.IsTrue (sp.Detached, "Detached"); DefaultSubjectIdentifierTypeProperties (sp, 0); } @@ -383,11 +383,11 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { private void CheckSignatureProperties (SignedCms sp, int version) { - AssertEquals ("Certificates", 1, sp.Certificates.Count); - AssertEquals ("ContentInfo.Content", 2, sp.ContentInfo.Content.Length); - Assert ("Detached", !sp.Detached); - AssertEquals ("SignerInfos", 1, sp.SignerInfos.Count); - AssertEquals ("Version", version, sp.Version); + Assert.AreEqual (1, sp.Certificates.Count, "Certificates"); + Assert.AreEqual (2, sp.ContentInfo.Content.Length, "ContentInfo.Content"); + Assert.IsTrue (!sp.Detached, "Detached"); + Assert.AreEqual (1, sp.SignerInfos.Count, "SignerInfos"); + Assert.AreEqual (version, sp.Version, "Version"); } [Test] diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SignerInfoTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SignerInfoTest.cs index 689f52b6e0b..96e0d58f5e4 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SignerInfoTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SignerInfoTest.cs @@ -41,7 +41,7 @@ using System.Security.Cryptography.Xml; namespace MonoTests.System.Security.Cryptography.Pkcs { [TestFixture] - public class SignerInfoTest : Assertion { + public class SignerInfoTest { static byte[] asnNull = { 0x05, 0x00 }; static string sha1Oid = "1.3.14.3.2.26"; @@ -75,15 +75,15 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { SignerInfo si = GetSignerInfo (issuerAndSerialNumberSignature); // default properties - AssertEquals ("SignedAttributes", 0, si.SignedAttributes.Count); - AssertNotNull ("Certificate", si.Certificate); - AssertEquals ("CounterSignerInfos", 0, si.CounterSignerInfos.Count); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, si.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, si.DigestAlgorithm.Value); - AssertEquals ("SignerIdentifier.Type", SubjectIdentifierType.IssuerAndSerialNumber, si.SignerIdentifier.Type); - Assert ("SignerIdentifier.Value", (si.SignerIdentifier.Value.GetType () == typeof (X509IssuerSerial))); - AssertEquals ("UnsignedAttributes", 0, si.UnsignedAttributes.Count); - AssertEquals ("Version", 1, si.Version); + Assert.AreEqual (0, si.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNotNull (si.Certificate, "Certificate"); + Assert.AreEqual (0, si.CounterSignerInfos.Count, "CounterSignerInfos"); + Assert.AreEqual (sha1Name, si.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, si.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, si.SignerIdentifier.Type, "SignerIdentifier.Type"); + Assert.IsTrue ((si.SignerIdentifier.Value.GetType () == typeof (X509IssuerSerial)), "SignerIdentifier.Value"); + Assert.AreEqual (0, si.UnsignedAttributes.Count, "UnsignedAttributes"); + Assert.AreEqual (1, si.Version, "Version"); } [Test] @@ -91,15 +91,15 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { { SignerInfo si = GetSignerInfo (subjectKeyIdentifierSignature); // default properties - AssertEquals ("SignedAttributes", 0, si.SignedAttributes.Count); - AssertNotNull ("Certificate", si.Certificate); - AssertEquals ("CounterSignerInfos", 0, si.CounterSignerInfos.Count); - AssertEquals ("DigestAlgorithm.FriendlyName", sha1Name, si.DigestAlgorithm.FriendlyName); - AssertEquals ("DigestAlgorithm.Value", sha1Oid, si.DigestAlgorithm.Value); - AssertEquals ("SignerIdentifier.Type", SubjectIdentifierType.SubjectKeyIdentifier, si.SignerIdentifier.Type); - AssertEquals ("SignerIdentifier.Value", "02E1A73254AEFDC0A43236F6FE236A037228B1F7", (string)si.SignerIdentifier.Value); - AssertEquals ("UnsignedAttributes", 0, si.UnsignedAttributes.Count); - AssertEquals ("Version", 3, si.Version); + Assert.AreEqual (0, si.SignedAttributes.Count, "SignedAttributes"); + Assert.IsNotNull (si.Certificate, "Certificate"); + Assert.AreEqual (0, si.CounterSignerInfos.Count, "CounterSignerInfos"); + Assert.AreEqual (sha1Name, si.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName"); + Assert.AreEqual (sha1Oid, si.DigestAlgorithm.Value, "DigestAlgorithm.Value"); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, si.SignerIdentifier.Type, "SignerIdentifier.Type"); + Assert.AreEqual ("02E1A73254AEFDC0A43236F6FE236A037228B1F7", (string)si.SignerIdentifier.Value, "SignerIdentifier.Value"); + Assert.AreEqual (0, si.UnsignedAttributes.Count, "UnsignedAttributes"); + Assert.AreEqual (3, si.Version, "Version"); } } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SubjectIdentifierTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SubjectIdentifierTest.cs index 8400f3bffd3..9a8f1a50f9d 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SubjectIdentifierTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Pkcs/SubjectIdentifierTest.cs @@ -41,7 +41,7 @@ using System.Security.Cryptography.Xml; namespace MonoTests.System.Security.Cryptography.Pkcs { [TestFixture] - public class SubjectIdentifierTest : Assertion { + public class SubjectIdentifierTest { static byte[] issuerAndSerialNumberSignature = { 0x30, 0x82, 0x03, 0x4C, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02, 0xA0, 0x82, 0x03, 0x3D, 0x30, 0x82, 0x03, 0x39, 0x02, 0x01, 0x01, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x30, 0x11, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0xA0, 0x04, 0x04, 0x02, 0x05, 0x00, 0xA0, 0x82, 0x02, 0x2E, 0x30, 0x82, 0x02, 0x2A, 0x30, 0x82, 0x01, 0x97, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x91, 0xC4, 0x4B, 0x0D, 0xB7, 0xD8, 0x10, 0x84, 0x42, 0x26, 0x71, 0xB3, 0x97, 0xB5, 0x00, 0x97, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1D, 0x05, 0x00, 0x30, 0x28, 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x1D, 0x4D, 0x6F, 0x74, 0x75, 0x73, 0x20, 0x54, 0x65, 0x63, 0x68, 0x6E, 0x6F, 0x6C, 0x6F, 0x67, 0x69, 0x65, 0x73, 0x20, 0x69, 0x6E, 0x63, 0x2E, 0x28, 0x74, 0x65, 0x73, 0x74, 0x29, 0x30, 0x1E, 0x17, 0x0D, 0x30, 0x33, 0x30, 0x38, 0x31, 0x33, 0x30, 0x30, 0x34, 0x33, 0x34, 0x37, 0x5A, 0x17, 0x0D, 0x33, 0x39, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5A, 0x30, 0x13, 0x31, 0x11, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x08, 0x46, 0x41, 0x52, 0x53, 0x43, 0x41, 0x50, 0x45, 0x30, 0x81, 0x9F, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8D, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xD2, 0xCB, 0x47, 0x21, 0xF5, 0x62, 0xDD, 0x35, 0xBF, 0x1D, 0xEC, 0x9A, 0x4C, 0x07, 0x2C, 0x01, 0xF0, 0x28, 0xC2, 0x82, 0x17, 0x8E, 0x58, 0x32, @@ -70,19 +70,19 @@ namespace MonoTests.System.Security.Cryptography.Pkcs { public void IssuerAndSerialNumber () { SubjectIdentifier si = GetSubjectIdentifier (issuerAndSerialNumberSignature); - AssertEquals ("SignerIdentifier.Type", SubjectIdentifierType.IssuerAndSerialNumber, si.Type); - Assert ("SignerIdentifier.Value", (si.Value.GetType () == typeof (X509IssuerSerial))); + Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, si.Type, "SignerIdentifier.Type"); + Assert.IsTrue ((si.Value.GetType () == typeof (X509IssuerSerial)), "SignerIdentifier.Value"); X509IssuerSerial xis = (X509IssuerSerial) si.Value; - AssertEquals ("X509IssuerSerial.IssuerName", "CN=Motus Technologies inc.(test)", xis.IssuerName); - AssertEquals ("X509IssuerSerial.SerialNumber", "91C44B0DB7D81084422671B397B50097", xis.SerialNumber); + Assert.AreEqual ("CN=Motus Technologies inc.(test)", xis.IssuerName, "X509IssuerSerial.IssuerName"); + Assert.AreEqual ("91C44B0DB7D81084422671B397B50097", xis.SerialNumber, "X509IssuerSerial.SerialNumber"); } [Test] public void SubjectKeyIdentifier () { SubjectIdentifier si = GetSubjectIdentifier (subjectKeyIdentifierSignature); - AssertEquals ("Type", SubjectIdentifierType.SubjectKeyIdentifier, si.Type); - AssertEquals ("SignerIdentifier.Value", "02E1A73254AEFDC0A43236F6FE236A037228B1F7", (string)si.Value); + Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, si.Type, "Type"); + Assert.AreEqual ("02E1A73254AEFDC0A43236F6FE236A037228B1F7", (string)si.Value, "SignerIdentifier.Value"); } } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/AssertCrypto.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/AssertCrypto.cs index 52086318e7d..68faddc904a 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/AssertCrypto.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/AssertCrypto.cs @@ -15,7 +15,7 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { - public class AssertCrypto : Assertion { + public class AssertCrypto { // because most crypto stuff works with byte[] buffers static public void AssertEquals (string msg, byte[] array1, byte[] array2) @@ -23,9 +23,9 @@ namespace MonoTests.System.Security.Cryptography.Xml { if ((array1 == null) && (array2 == null)) return; if (array1 == null) - Fail (msg + " -> First array is NULL"); + Assert.Fail (msg + " -> First array is NULL"); if (array2 == null) - Fail (msg + " -> Second array is NULL"); + Assert.Fail (msg + " -> Second array is NULL"); bool a = (array1.Length == array2.Length); if (a) { @@ -38,7 +38,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { } msg += " -> Expected " + BitConverter.ToString (array1, 0); msg += " is different than " + BitConverter.ToString (array2, 0); - Assert (msg, a); + Assert.IsTrue (a, msg); } private const string xmldsig = " xmlns=\"http://www.w3.org/2000/09/xmldsig#\""; @@ -48,7 +48,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { { expected = expected.Replace (xmldsig, String.Empty); actual = actual.Replace (xmldsig, String.Empty); - AssertEquals (msg, expected, actual); + Assert.AreEqual (expected, actual, msg); } } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/ChangeLog b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/ChangeLog index 2a0a2dd3d3b..83c42484667 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/ChangeLog +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/ChangeLog @@ -1,3 +1,7 @@ +2009-06-26 Robert Jordan + + * *.cs: Upgrade to new NUnit style. + 2008-11-01 Sebastien Pouliot * EncryptedXmlTest.cs: Add null check test cases for many methods. diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/DSAKeyValueTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/DSAKeyValueTest.cs index 28e5a464bd7..7f7bd03a97d 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/DSAKeyValueTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/DSAKeyValueTest.cs @@ -17,24 +17,24 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] - public class DSAKeyValueTest : Assertion { + public class DSAKeyValueTest { [Test] public void GenerateKey () { DSAKeyValue dsa1 = new DSAKeyValue (); - AssertNotNull ("Key", dsa1.Key); + Assert.IsNotNull (dsa1.Key, "Key"); XmlElement xmlkey = dsa1.GetXml (); DSAKeyValue dsa2 = new DSAKeyValue (); dsa2.LoadXml (xmlkey); - Assert ("dsa1==dsa2", (dsa1.GetXml ().OuterXml) == (dsa2.GetXml ().OuterXml)); + Assert.IsTrue ((dsa1.GetXml ().OuterXml) == (dsa2.GetXml ().OuterXml), "dsa1==dsa2"); DSA key = dsa1.Key; DSAKeyValue dsa3 = new DSAKeyValue (key); - Assert ("dsa3==dsa1", (dsa3.GetXml ().OuterXml) == (dsa1.GetXml ().OuterXml)); - Assert ("dsa3==dsa2", (dsa3.GetXml ().OuterXml) == (dsa2.GetXml ().OuterXml)); + Assert.IsTrue ((dsa3.GetXml ().OuterXml) == (dsa1.GetXml ().OuterXml), "dsa3==dsa1"); + Assert.IsTrue ((dsa3.GetXml ().OuterXml) == (dsa2.GetXml ().OuterXml), "dsa3==dsa2"); } [Test] @@ -48,7 +48,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { dsa1.LoadXml (doc.DocumentElement); string s = (dsa1.GetXml ().OuterXml); - AssertEquals ("DSA Key", dsaKey, s); + Assert.AreEqual (dsaKey, s, "DSA Key"); } [Test] diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/DataObjectTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/DataObjectTest.cs index 27c1cd7b84c..e1bd2cebbd4 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/DataObjectTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/DataObjectTest.cs @@ -19,7 +19,7 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] - public class DataObjectTest : Assertion { + public class DataObjectTest { [Test] public void NewDataObject () @@ -29,25 +29,25 @@ namespace MonoTests.System.Security.Cryptography.Xml { doc.LoadXml (test); DataObject obj1 = new DataObject (); - Assert ("Data.Count==0", (obj1.Data.Count == 0)); - AssertEquals ("Just constructed", "", (obj1.GetXml ().OuterXml)); + Assert.IsTrue ((obj1.Data.Count == 0), "Data.Count==0"); + Assert.AreEqual ("", (obj1.GetXml ().OuterXml), "Just constructed"); obj1.Id = "id"; obj1.MimeType = "mime"; obj1.Encoding = "encoding"; - AssertEquals ("Only attributes", "", (obj1.GetXml ().OuterXml)); + Assert.AreEqual ("", (obj1.GetXml ().OuterXml), "Only attributes"); obj1.Data = doc.ChildNodes; - Assert ("Data.Count==1", (obj1.Data.Count == 1)); + Assert.IsTrue ((obj1.Data.Count == 1), "Data.Count==1"); XmlElement xel = obj1.GetXml (); DataObject obj2 = new DataObject (); obj2.LoadXml (xel); - AssertEquals ("obj1==obj2", (obj1.GetXml ().OuterXml), (obj2.GetXml ().OuterXml)); + Assert.AreEqual ((obj1.GetXml ().OuterXml), (obj2.GetXml ().OuterXml), "obj1==obj2"); DataObject obj3 = new DataObject (obj1.Id, obj1.MimeType, obj1.Encoding, doc.DocumentElement); - AssertEquals ("obj2==obj3", (obj2.GetXml ().OuterXml), (obj3.GetXml ().OuterXml)); + Assert.AreEqual ((obj2.GetXml ().OuterXml), (obj3.GetXml ().OuterXml), "obj2==obj3"); } [Test] @@ -59,10 +59,10 @@ namespace MonoTests.System.Security.Cryptography.Xml { DataObject obj1 = new DataObject (); obj1.LoadXml (doc.DocumentElement); - Assert ("Data.Count==2", (obj1.Data.Count == 2)); + Assert.IsTrue ((obj1.Data.Count == 2), "Data.Count==2"); string s = (obj1.GetXml ().OuterXml); - AssertEquals ("DataObject 1", value1, s); + Assert.AreEqual (value1, s, "DataObject 1"); string value2 = ""; doc = new XmlDocument (); @@ -72,7 +72,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { obj2.LoadXml (doc.DocumentElement); s = (obj2.GetXml ().OuterXml); - AssertEquals ("DataObject 2", value2, s); + Assert.AreEqual (value2, s, "DataObject 2"); string value3 = ""; doc = new XmlDocument (); @@ -82,7 +82,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { obj3.LoadXml (doc.DocumentElement); s = (obj3.GetXml ().OuterXml); - AssertEquals ("DataObject 3", value3, s); + Assert.AreEqual (value3, s, "DataObject 3"); string value4 = ""; doc = new XmlDocument (); @@ -92,7 +92,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { obj4.LoadXml (doc.DocumentElement); s = (obj4.GetXml ().OuterXml); - AssertEquals ("DataObject 4", value4, s); + Assert.AreEqual (value4, s, "DataObject 4"); } [Test] @@ -122,7 +122,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { doc.LoadXml (value); obj1.LoadXml (doc.DocumentElement); string s = (obj1.GetXml ().OuterXml); - AssertEquals ("DataObject Bad", value, s); + Assert.AreEqual (value, s, "DataObject Bad"); } [Test] @@ -135,7 +135,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { obj.LoadXml (doc.DocumentElement); // obj.Id = "hogehoge"; XmlElement el2 = obj.GetXml (); - AssertEquals ("Document is kept unless setting properties", doc, el2.OwnerDocument); + Assert.AreEqual (doc, el2.OwnerDocument, "Document is kept unless setting properties"); } [Test] @@ -148,7 +148,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { obj.LoadXml (doc.DocumentElement); obj.Id = "hogehoge"; XmlElement el2 = obj.GetXml (); - Assert ("Document is not kept when properties are set", doc != el2.OwnerDocument); + Assert.IsTrue (doc != el2.OwnerDocument, "Document is not kept when properties are set"); } [Test] @@ -162,11 +162,11 @@ namespace MonoTests.System.Security.Cryptography.Xml { obj.MimeType = "application/octet-stream"; obj.Encoding = "euc-kr"; XmlElement el1 = obj.GetXml (); - AssertEquals ("test", el1.OuterXml); + Assert.AreEqual ("test", el1.OuterXml); /* looks curious? but the element does not look to be appended to the document. Just commented out since it is not fixed. - AssertEquals (String.Empty, el1.OwnerDocument.OuterXml); + Assert.AreEqual (String.Empty, el1.OwnerDocument.OuterXml); */ } @@ -177,7 +177,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlElement el = new XmlDocument ().CreateElement ("foo"); d.Id = "id:1"; d.Data = el.SelectNodes ("."); - AssertEquals ("id:1", d.Id); + Assert.AreEqual ("id:1", d.Id); } [Test] @@ -186,7 +186,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlElement el = new XmlDocument ().CreateElement ("foo"); DataObject d = new DataObject ("id:1", null, null, el); d.MimeType = "text/html"; - AssertEquals ("id:1", d.Id); + Assert.AreEqual ("id:1", d.Id); } } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoNameTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoNameTest.cs index 17ab583e10c..1c6bf09108c 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoNameTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoNameTest.cs @@ -17,7 +17,7 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] - public class KeyInfoNameTest : Assertion { + public class KeyInfoNameTest { [Test] public void NewKeyValue () @@ -30,8 +30,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { KeyInfoName name2 = new KeyInfoName (); name2.LoadXml (xel); - AssertEquals ("newKeyValue==value", newKeyValue, name1.Value); - AssertEquals ("name1==name2", (name1.GetXml ().OuterXml), (name2.GetXml ().OuterXml)); + Assert.AreEqual (newKeyValue, name1.Value, "newKeyValue==value"); + Assert.AreEqual ((name1.GetXml ().OuterXml), (name2.GetXml ().OuterXml), "name1==name2"); } [Test] @@ -43,8 +43,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { KeyInfoName name = new KeyInfoName (); name.LoadXml (doc.DocumentElement); - AssertEquals ("import.Name", "Mono::", name.Value); - AssertEquals ("import.GetXml", value, name.GetXml ().OuterXml); + Assert.AreEqual ("Mono::", name.Value, "import.Name"); + Assert.AreEqual (value, name.GetXml ().OuterXml, "import.GetXml"); } [Test] @@ -68,8 +68,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { KeyInfoName name = new KeyInfoName (); name.LoadXml (doc.DocumentElement); - AssertEquals ("invalid.Name", "", name.Value); - AssertEquals ("invalid.GetXml", "", (name.GetXml ().OuterXml)); + Assert.AreEqual ("", name.Value, "invalid.Name"); + Assert.AreEqual ("", (name.GetXml ().OuterXml), "invalid.GetXml"); } } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoNodeTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoNodeTest.cs index 5f27cf1fd2c..f0886c90d5f 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoNodeTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoNodeTest.cs @@ -17,7 +17,7 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] - public class KeyInfoNodeTest : Assertion { + public class KeyInfoNodeTest { [Test] public void NewKeyNode () @@ -33,7 +33,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { KeyInfoNode node2 = new KeyInfoNode (node1.Value); node2.LoadXml (xel); - AssertEquals ("node1==node2", (node1.GetXml ().OuterXml), (node2.GetXml ().OuterXml)); + Assert.AreEqual ((node1.GetXml ().OuterXml), (node2.GetXml ().OuterXml), "node1==node2"); } [Test] @@ -48,7 +48,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { node1.LoadXml (doc.DocumentElement); string s = (node1.GetXml ().OuterXml); - AssertEquals ("Node", value, s); + Assert.AreEqual (value, s, "Node"); } // well there's no invalid value - unless you read the doc ;-) @@ -62,7 +62,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { KeyInfoNode node1 = new KeyInfoNode (); // LAMESPEC: No ArgumentNullException is thrown if value == null node1.LoadXml (null); - AssertNull ("Value==null", node1.Value); + Assert.IsNull (node1.Value, "Value==null"); } } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoRetrievalMethodTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoRetrievalMethodTest.cs index cdef016e07b..589cdbc5204 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoRetrievalMethodTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoRetrievalMethodTest.cs @@ -18,16 +18,16 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] - public class KeyInfoRetrievalMethodTest : Assertion { + public class KeyInfoRetrievalMethodTest { [Test] public void TestNewEmptyKeyNode () { KeyInfoRetrievalMethod uri1 = new KeyInfoRetrievalMethod (); #if NET_1_0 - AssertEquals ("Empty", "", (uri1.GetXml ().OuterXml)); + Assert.AreEqual ("", (uri1.GetXml ().OuterXml), "Empty"); #else - AssertEquals ("Empty", "", (uri1.GetXml ().OuterXml)); + Assert.AreEqual ("", (uri1.GetXml ().OuterXml), "Empty"); #endif } @@ -42,8 +42,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { KeyInfoRetrievalMethod uri2 = new KeyInfoRetrievalMethod (uri1.Uri); uri2.LoadXml (xel); - AssertEquals ("uri1==uri2", (uri1.GetXml ().OuterXml), (uri2.GetXml ().OuterXml)); - AssertEquals ("uri==Uri", uri, uri1.Uri); + Assert.AreEqual ((uri1.GetXml ().OuterXml), (uri2.GetXml ().OuterXml), "uri1==uri2"); + Assert.AreEqual (uri, uri1.Uri, "uri==Uri"); } [Test] @@ -62,10 +62,10 @@ namespace MonoTests.System.Security.Cryptography.Xml { // verify that proper XML is generated (equals to original) string s = (uri1.GetXml ().OuterXml); - AssertEquals ("Xml", value, s); + Assert.AreEqual (value, s, "Xml"); // verify that property is parsed correctly - AssertEquals ("Uri", "http://www.go-mono.com/", uri1.Uri); + Assert.AreEqual ("http://www.go-mono.com/", uri1.Uri, "Uri"); } [Test] @@ -90,10 +90,10 @@ namespace MonoTests.System.Security.Cryptography.Xml { AssertCrypto.AssertXmlEquals ("invalid", "", (uri1.GetXml ().OuterXml)); #elif NET_1_1 // note that URI="" is present (unlike a empty Uri) - AssertEquals("invalid", "", (uri1.GetXml ().OuterXml)); + Assert.AreEqual ("", (uri1.GetXml ().OuterXml), "invalid"); #else // Fx 1.0 misnamed the tag name - AssertEquals("invalid", "", (uri1.GetXml ().OuterXml)); + Assert.AreEqual ("", (uri1.GetXml ().OuterXml), "invalid"); #endif } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoTest.cs index 96a3e31f118..dba7a39ae9b 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/KeyInfoTest.cs @@ -19,7 +19,7 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] - public class KeyInfoTest : Assertion { + public class KeyInfoTest { private KeyInfo info; @@ -32,8 +32,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { [Test] public void EmptyKeyInfo () { - AssertEquals ("empty", "", (info.GetXml ().OuterXml)); - AssertEquals ("empty count", 0, info.Count); + Assert.AreEqual ("", (info.GetXml ().OuterXml), "empty"); + Assert.AreEqual (0, info.Count, "empty count"); } [Test] @@ -42,8 +42,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { KeyInfoName name = new KeyInfoName (); name.Value = "Mono::"; info.AddClause (name); - AssertEquals ("name", "Mono::", (info.GetXml ().OuterXml)); - AssertEquals ("name count", 1, info.Count); + Assert.AreEqual ("Mono::", (info.GetXml ().OuterXml), "name"); + Assert.AreEqual (1, info.Count, "name count"); } [Test] @@ -55,8 +55,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { KeyInfoNode node = new KeyInfoNode (doc.DocumentElement); info.AddClause (node); - AssertEquals ("node", "KeyInfoNode", (info.GetXml ().OuterXml)); - AssertEquals ("node count", 1, info.Count); + Assert.AreEqual ("KeyInfoNode", (info.GetXml ().OuterXml), "node"); + Assert.AreEqual (1, info.Count, "node count"); } string xmlDSA = "

rjxsMU368YOCTQejWkiuO9e/vUVwkLtq1jKiU3TtJ53hBJqjFRuTa228vZe+BH2su9RPn/vYFWfQDv6zgBYe3eNdu4Afw+Ny0FatX6dl3E77Ra6Tsd3MmLXBiGSQ1mMNd5G2XQGpbt9zsGlUaexXekeMLxIufgfZLwYp67M+2WM=

tf0K9rMyvUrU4cIkwbCrDRhQAJk=S8Z+1pGCed00w6DtVcqZLKjfqlCJ7JsugEFIgSy/Vxtu9YGCMclV4ijGEbPo/jU8YOSMuD7E9M7UaopMRcmKQjoKZzoJjkgVFP48Ohxl1f08lERnButsxanx3+OstFwUGQ8XNaGg3KrIoZt1FUnfxN3RHHTvVhjzNSHxMGULGaU=LnrxxRGLYeV2XLtK3SYz8RQHlHFZYrtznDZyMotuRfO5uC5YODhSFyLXvb1qB3WeGtF4h3Eo4KzHgMgfN2ZMlffxFRhJgTtH3ctbL8lfQoDkjeiPPnYGhspdJxr0tyZmiy0gkjJG3vwHYrLnvZWx9Wm/unqiOlGBPNuxJ+hOeP8=9RhE5TycDtdEIXxS3HfxFyXYgpy81zY5lVjwD6E9JP37MWEi80BlX6ab1YPm6xYSEoqReMPP9RgGiW6DuACpgI7+8vgCr4i/7VhzModJAA56PwvTu6UMt9xxKU/fT672v8ucREkMWoc7lEeyHxW3N4RHWVgqDQKuGg7iJTUTiCs=Asw=
"; @@ -69,7 +69,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { DSAKeyValue dsa = new DSAKeyValue (key); info.AddClause (dsa); AssertCrypto.AssertXmlEquals ("dsa", "" + xmlDSA + "", (info.GetXml ().OuterXml)); - AssertEquals ("dsa count", 1, info.Count); + Assert.AreEqual (1, info.Count, "dsa count"); } static string xmlRSA = "9DC4XNdQJwMRnz5pP2a6U51MHCODRilaIoVXqUPhCUb0lJdGroeqVYT84ZyIVrcarzD7Tqs3aEOIa3rKox0N1bxQpZPqayVQeLAkjLLtzJW/ScRJx3uEDJdgT1JnM1FH0GZTinmEdCUXdLc7+Y/c/qqIkTfbwHbRZjW0bBJyExM=AQAB"; @@ -82,7 +82,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { RSAKeyValue rsa = new RSAKeyValue (key); info.AddClause (rsa); AssertCrypto.AssertXmlEquals ("rsa", "" + xmlRSA + "", (info.GetXml ().OuterXml)); - AssertEquals ("rsa count", 1, info.Count); + Assert.AreEqual (1, info.Count, "rsa count"); } [Test] @@ -92,11 +92,11 @@ namespace MonoTests.System.Security.Cryptography.Xml { retrieval.Uri = "http://www.go-mono.org/"; info.AddClause (retrieval); #if NET_1_0 - AssertEquals ("RetrievalMethod", "", (info.GetXml ().OuterXml)); + Assert.AreEqual ("", (info.GetXml ().OuterXml), "RetrievalMethod"); #else - AssertEquals ("RetrievalMethod", "", (info.GetXml ().OuterXml)); + Assert.AreEqual ("", (info.GetXml ().OuterXml), "RetrievalMethod"); #endif - AssertEquals ("RetrievalMethod count", 1, info.Count); + Assert.AreEqual (1, info.Count, "RetrievalMethod count"); } static byte[] cert = { 0x30,0x82,0x02,0x1D,0x30,0x82,0x01,0x86,0x02,0x01,0x14,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x04,0x05,0x00,0x30,0x58,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x43,0x41,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x03,0x13,0x16,0x4B,0x65,0x79,0x77,0x69,0x74,0x6E,0x65,0x73,0x73,0x20,0x43,0x61,0x6E,0x61,0x64,0x61,0x20,0x49,0x6E,0x63,0x2E,0x31,0x28,0x30,0x26,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01,0x2A,0x02,0x0B,0x02,0x01,0x13,0x18,0x6B,0x65,0x79,0x77,0x69,0x74,0x6E,0x65,0x73, @@ -113,7 +113,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { KeyInfoX509Data x509data = new KeyInfoX509Data (x509); info.AddClause (x509data); AssertCrypto.AssertXmlEquals ("X509Data", "MIICHTCCAYYCARQwDQYJKoZIhvcNAQEEBQAwWDELMAkGA1UEBhMCQ0ExHzAdBgNVBAMTFktleXdpdG5lc3MgQ2FuYWRhIEluYy4xKDAmBgorBgEEASoCCwIBExhrZXl3aXRuZXNzQGtleXdpdG5lc3MuY2EwHhcNOTYwNTA3MDAwMDAwWhcNOTkwNTA3MDAwMDAwWjBYMQswCQYDVQQGEwJDQTEfMB0GA1UEAxMWS2V5d2l0bmVzcyBDYW5hZGEgSW5jLjEoMCYGCisGAQQBKgILAgETGGtleXdpdG5lc3NAa2V5d2l0bmVzcy5jYTCBnTANBgkqhkiG9w0BAQEFAAOBiwAwgYcCgYEAzSP6KuHtmPTp0JM+13qAAkzMwQKvXLYff/pXQm8w0SDFtSEHQCyphsLzZISuPYUu7YW9VLAYKO9q+BvnCxYfkyVPx/iOw7nKmIQOVdAv73h3xXIoX2C/GSvRcqK32D/glzRaAb0EnMh4Rc2TjRXydhARq7hbLp5S3YE+nGTIKZMCAQMwDQYJKoZIhvcNAQEEBQADgYEAMho1ur9DJ9a01Lh25eObTWzAhsl3NbprFi0TRkqwMlOhW1rpmeIMhogXTg3+gqxOR+/7/zms7jXI+lI3CkmtWa3iiqkcxl8f+G9zfs2gMegMvvVN2bKrihK2MHhoEXwN8UlNo/2y6f8d8JH6VIX/M5Dowb+km6RiRr1hElmYQYk=", (info.GetXml ().OuterXml)); - AssertEquals ("X509Data count", 1, info.Count); + Assert.AreEqual (1, info.Count, "X509Data count"); } [Test] @@ -151,7 +151,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { s += ""; s += "MIICHTCCAYYCARQwDQYJKoZIhvcNAQEEBQAwWDELMAkGA1UEBhMCQ0ExHzAdBgNVBAMTFktleXdpdG5lc3MgQ2FuYWRhIEluYy4xKDAmBgorBgEEASoCCwIBExhrZXl3aXRuZXNzQGtleXdpdG5lc3MuY2EwHhcNOTYwNTA3MDAwMDAwWhcNOTkwNTA3MDAwMDAwWjBYMQswCQYDVQQGEwJDQTEfMB0GA1UEAxMWS2V5d2l0bmVzcyBDYW5hZGEgSW5jLjEoMCYGCisGAQQBKgILAgETGGtleXdpdG5lc3NAa2V5d2l0bmVzcy5jYTCBnTANBgkqhkiG9w0BAQEFAAOBiwAwgYcCgYEAzSP6KuHtmPTp0JM+13qAAkzMwQKvXLYff/pXQm8w0SDFtSEHQCyphsLzZISuPYUu7YW9VLAYKO9q+BvnCxYfkyVPx/iOw7nKmIQOVdAv73h3xXIoX2C/GSvRcqK32D/glzRaAb0EnMh4Rc2TjRXydhARq7hbLp5S3YE+nGTIKZMCAQMwDQYJKoZIhvcNAQEEBQADgYEAMho1ur9DJ9a01Lh25eObTWzAhsl3NbprFi0TRkqwMlOhW1rpmeIMhogXTg3+gqxOR+/7/zms7jXI+lI3CkmtWa3iiqkcxl8f+G9zfs2gMegMvvVN2bKrihK2MHhoEXwN8UlNo/2y6f8d8JH6VIX/M5Dowb+km6RiRr1hElmYQYk=
"; AssertCrypto.AssertXmlEquals ("Complex", s, (info.GetXml ().OuterXml)); - AssertEquals ("RetrievalMethod count", 5, info.Count); + Assert.AreEqual (5, info.Count, "RetrievalMethod count"); } [Test] @@ -165,17 +165,17 @@ namespace MonoTests.System.Security.Cryptography.Xml { info.LoadXml (doc.DocumentElement); AssertCrypto.AssertXmlEquals ("Import", value, (info.GetXml ().OuterXml)); - AssertEquals ("Import count", 5, info.Count); + Assert.AreEqual (5, info.Count, "Import count"); } [Test] [ExpectedException (typeof (NullReferenceException))] public void NullClause () { - AssertEquals ("empty count", 0, info.Count); + Assert.AreEqual (0, info.Count, "empty count"); // null is accepted... info.AddClause (null); - AssertEquals ("null count", 1, info.Count); + Assert.AreEqual (1, info.Count, "null count"); // but can't get XML out if it! XmlElement xel = info.GetXml (); } @@ -195,8 +195,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { doc.LoadXml (bad); info.LoadXml (doc.DocumentElement); // LAMESPEC: no expection but Xml isn't loaded - AssertEquals ("invalid", "", (info.GetXml ().OuterXml)); - AssertEquals ("invalid count", 0, info.Count); + Assert.AreEqual ("", (info.GetXml ().OuterXml), "invalid"); + Assert.AreEqual (0, info.Count, "invalid count"); } } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/RSAKeyValueTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/RSAKeyValueTest.cs index 340da0d6092..4a8cdf8e133 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/RSAKeyValueTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/RSAKeyValueTest.cs @@ -17,24 +17,24 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] - public class RSAKeyValueTest : Assertion { + public class RSAKeyValueTest { [Test] public void GeneratedKey () { RSAKeyValue rsa1 = new RSAKeyValue (); - AssertNotNull ("Key", rsa1.Key); + Assert.IsNotNull (rsa1.Key, "Key"); XmlElement xmlkey = rsa1.GetXml (); RSAKeyValue rsa2 = new RSAKeyValue (); rsa2.LoadXml (xmlkey); - Assert ("rsa1==rsa2", (rsa1.GetXml ().OuterXml) == (rsa2.GetXml ().OuterXml)); + Assert.IsTrue ((rsa1.GetXml ().OuterXml) == (rsa2.GetXml ().OuterXml), "rsa1==rsa2"); RSA key = rsa1.Key; RSAKeyValue rsa3 = new RSAKeyValue (key); - Assert ("rsa3==rsa1", (rsa3.GetXml ().OuterXml) == (rsa1.GetXml ().OuterXml)); - Assert ("rsa3==rsa2", (rsa3.GetXml ().OuterXml) == (rsa2.GetXml ().OuterXml)); + Assert.IsTrue ((rsa3.GetXml ().OuterXml) == (rsa1.GetXml ().OuterXml), "rsa3==rsa1"); + Assert.IsTrue ((rsa3.GetXml ().OuterXml) == (rsa2.GetXml ().OuterXml), "rsa3==rsa2"); } [Test] @@ -48,7 +48,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { rsa1.LoadXml (doc.DocumentElement); string s = (rsa1.GetXml ().OuterXml); - AssertEquals ("RSA Key", rsaKey, s); + Assert.AreEqual (rsaKey, s, "RSA Key"); } [Test] diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/ReferenceTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/ReferenceTest.cs index 01f36abc658..a776b19274f 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/ReferenceTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/ReferenceTest.cs @@ -18,7 +18,7 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] - public class ReferenceTest : Assertion { + public class ReferenceTest { protected Reference reference; @@ -31,17 +31,17 @@ namespace MonoTests.System.Security.Cryptography.Xml { [Test] public void Properties () { - AssertNull ("Uri (null)", reference.Uri); - AssertNotNull ("TransformChain", reference.TransformChain); - AssertEquals ("ToString()", "System.Security.Cryptography.Xml.Reference", reference.ToString ()); + Assert.IsNull (reference.Uri, "Uri (null)"); + Assert.IsNotNull (reference.TransformChain, "TransformChain"); + Assert.AreEqual ("System.Security.Cryptography.Xml.Reference", reference.ToString (), "ToString()"); // test uri constructor string uri = "uri"; reference = new Reference (uri); - AssertEquals ("DigestMethod", "http://www.w3.org/2000/09/xmldsig#sha1", reference.DigestMethod); - AssertNull ("DigestValue", reference.DigestValue); - AssertNull ("Id", reference.Id); - AssertNull ("Type", reference.Type); - AssertEquals ("Uri", uri, reference.Uri); + Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig#sha1", reference.DigestMethod, "DigestMethod"); + Assert.IsNull (reference.DigestValue, "DigestValue"); + Assert.IsNull (reference.Id, "Id"); + Assert.IsNull (reference.Type, "Type"); + Assert.AreEqual (uri, reference.Uri, "Uri"); } [Test] @@ -51,11 +51,11 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDocument doc = new XmlDocument (); doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); - AssertEquals ("Load-Xml", test, (reference.GetXml().OuterXml)); - AssertEquals ("Load-URI", "#MyObjectId", reference.Uri); + Assert.AreEqual (test, (reference.GetXml().OuterXml), "Load-Xml"); + Assert.AreEqual ("#MyObjectId", reference.Uri, "Load-URI"); byte[] hash = { 0xFD, 0x5B, 0xEA, 0xEA, 0xC5, 0xC4, 0x55, 0xBB, 0x59, 0x0B, 0xC1, 0xB0, 0x36, 0xD2, 0xD0, 0x9C, 0x63, 0xB2, 0xFD, 0x52 }; AssertCrypto.AssertEquals("Load-Digest", hash, reference.DigestValue); - AssertEquals ("Load-#Transform", 0, reference.TransformChain.Count); + Assert.AreEqual (0, reference.TransformChain.Count, "Load-#Transform"); } [Test] @@ -65,8 +65,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDocument doc = new XmlDocument (); doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); - AssertEquals ("Load-Base64", test, (reference.GetXml().OuterXml)); - AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); + Assert.AreEqual (test, (reference.GetXml().OuterXml), "Load-Base64"); + Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform"); } [Test] @@ -76,8 +76,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDocument doc = new XmlDocument (); doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); - AssertEquals ("Load-C14N", test, (reference.GetXml().OuterXml)); - AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); + Assert.AreEqual (test, (reference.GetXml().OuterXml), "Load-C14N"); + Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform"); } [Test] @@ -87,8 +87,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDocument doc = new XmlDocument (); doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); - AssertEquals ("Load-C14NWithComments", test, (reference.GetXml().OuterXml)); - AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); + Assert.AreEqual (test, (reference.GetXml().OuterXml), "Load-C14NWithComments"); + Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform"); } [Test] @@ -98,8 +98,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDocument doc = new XmlDocument (); doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); - AssertEquals ("Load-Enveloped", test, (reference.GetXml().OuterXml)); - AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); + Assert.AreEqual (test, (reference.GetXml().OuterXml), "Load-Enveloped"); + Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform"); } [Test] @@ -112,8 +112,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { doc.LoadXml (test1); reference.LoadXml (doc.DocumentElement); string result = (reference.GetXml().OuterXml); - Assert (result, ((test1 == result) || (test2 == result))); - AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); + Assert.IsTrue (((test1 == result) || (test2 == result)), result); + Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform"); } [Test] @@ -132,8 +132,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); string result = reference.GetXml().OuterXml; - AssertEquals (result, test, result); - AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); + Assert.AreEqual (test, result, result); + Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform"); } [Test] @@ -153,8 +153,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { doc.LoadXml (test1); reference.LoadXml (doc.DocumentElement); string result = reference.GetXml().OuterXml; - Assert (result, ((result == test1) || (result == test2))); - AssertEquals ("Load-#Transform", 6, reference.TransformChain.Count); + Assert.IsTrue (((result == test1) || (result == test2)), result); + Assert.AreEqual (6, reference.TransformChain.Count, "Load-#Transform"); } [Test] @@ -170,7 +170,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { reference.DigestValue = hash; XmlElement xel = reference.GetXml (); // this is the minimal Reference (DigestValue)! - AssertNotNull ("GetXml", xel); + Assert.IsNotNull (xel, "GetXml"); reference.AddTransform (new XmlDsigBase64Transform ()); reference.AddTransform (new XmlDsigC14NTransform ()); @@ -184,7 +184,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { // Mono's result (xml is equivalent but not identical) string test2 = test1.Replace ("", ""); string result = reference.GetXml().OuterXml; - Assert (result, ((result == test1) || (result == test2))); + Assert.IsTrue (((result == test1) || (result == test2)), result); // however this value cannot be loaded as it's missing some transform (xslt) parameters // can we add them again ? @@ -196,7 +196,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { reference.AddTransform (new XmlDsigXsltTransform ()); // seems so ;-) - AssertEquals ("# Transforms", 12, reference.TransformChain.Count); + Assert.AreEqual (12, reference.TransformChain.Count, "# Transforms"); } [Test] @@ -204,7 +204,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { { // null DigestMethod -> "" DigestMethod !!! reference.DigestMethod = null; - AssertNull ("DigestMethod null", reference.DigestMethod); + Assert.IsNull (reference.DigestMethod, "DigestMethod null"); } [Test] @@ -244,9 +244,9 @@ namespace MonoTests.System.Security.Cryptography.Xml { Reference r = new Reference (); r.LoadXml (org); XmlElement el = r.GetXml (); - AssertEquals (doc, el.OwnerDocument); - AssertEquals (org, el); - AssertEquals (result, el.OuterXml); + Assert.AreEqual (doc, el.OwnerDocument); + Assert.AreEqual (org, el); + Assert.AreEqual (result, el.OuterXml); } } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignatureTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignatureTest.cs index ff34814c9c6..021caf05a9c 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignatureTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignatureTest.cs @@ -18,7 +18,7 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] - public class SignatureTest : Assertion { + public class SignatureTest { protected Signature signature; diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignedInfoTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignedInfoTest.cs index f673a95b89d..217c154bc53 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignedInfoTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignedInfoTest.cs @@ -18,7 +18,7 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] - public class SignedInfoTest : Assertion { + public class SignedInfoTest { protected SignedInfo info; @@ -31,13 +31,13 @@ namespace MonoTests.System.Security.Cryptography.Xml { [Test] public void Empty () { - AssertEquals ("CanonicalizationMethod", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", info.CanonicalizationMethod); - AssertNull ("Id", info.Id); - AssertNotNull ("References", info.References); - AssertEquals ("References.Count", 0, info.References.Count); - AssertNull ("SignatureLength", info.SignatureLength); - AssertNull ("SignatureMethod", info.SignatureMethod); - AssertEquals ("ToString()", "System.Security.Cryptography.Xml.SignedInfo", info.ToString ()); + Assert.AreEqual ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", info.CanonicalizationMethod, "CanonicalizationMethod"); + Assert.IsNull (info.Id, "Id"); + Assert.IsNotNull (info.References, "References"); + Assert.AreEqual (0, info.References.Count, "References.Count"); + Assert.IsNull (info.SignatureLength, "SignatureLength"); + Assert.IsNull (info.SignatureMethod, "SignatureMethod"); + Assert.AreEqual ("System.Security.Cryptography.Xml.SignedInfo", info.ToString (), "ToString()"); } [Test] @@ -51,9 +51,9 @@ namespace MonoTests.System.Security.Cryptography.Xml { public void Properties () { info.CanonicalizationMethod = "http://www.go-mono.com/"; - AssertEquals ("CanonicalizationMethod", "http://www.go-mono.com/", info.CanonicalizationMethod); + Assert.AreEqual ("http://www.go-mono.com/", info.CanonicalizationMethod, "CanonicalizationMethod"); info.Id = "Mono::"; - AssertEquals ("Id", "Mono::", info.Id); + Assert.AreEqual ("Mono::", info.Id, "Id"); } [Test] @@ -63,12 +63,12 @@ namespace MonoTests.System.Security.Cryptography.Xml { r1.Uri = "http://www.go-mono.com/"; r1.AddTransform (new XmlDsigBase64Transform ()); info.AddReference (r1); - AssertEquals ("References.Count 1", 1, info.References.Count); + Assert.AreEqual (1, info.References.Count, "References.Count 1"); Reference r2 = new Reference ("http://www.motus.com/"); r2.AddTransform (new XmlDsigBase64Transform ()); info.AddReference (r2); - AssertEquals ("References.Count 2", 2, info.References.Count); + Assert.AreEqual (2, info.References.Count, "References.Count 2"); info.SignatureMethod = "http://www.w3.org/2000/09/xmldsig#dsa-sha1"; } @@ -80,10 +80,10 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDocument doc = new XmlDocument (); doc.LoadXml (xml); info.LoadXml (doc.DocumentElement); - AssertEquals ("LoadXml", xml, (info.GetXml ().OuterXml)); - AssertEquals ("LoadXml-C14N", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", info.CanonicalizationMethod); - AssertEquals ("LoadXml-Algo", "http://www.w3.org/2000/09/xmldsig#rsa-sha1", info.SignatureMethod); - AssertEquals ("LoadXml-Ref1", 1, info.References.Count); + Assert.AreEqual (xml, (info.GetXml ().OuterXml), "LoadXml"); + Assert.AreEqual ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", info.CanonicalizationMethod, "LoadXml-C14N"); + Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig#rsa-sha1", info.SignatureMethod, "LoadXml-Algo"); + Assert.AreEqual (1, info.References.Count, "LoadXml-Ref1"); } // there are many (documented) not supported methods in SignedInfo @@ -142,8 +142,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { SignedInfo sig = new SignedInfo (); sig.LoadXml ((XmlElement) doc.SelectSingleNode ("//*[local-name()='SignedInfo']")); XmlElement el = sig.GetXml (); - AssertEquals ("#GetXmlWOSetProperty.document", doc, el.OwnerDocument); - AssertEquals ("#GetXmlWOSetProperty.outerxml", result, el.OuterXml); + Assert.AreEqual (doc, el.OwnerDocument, "#GetXmlWOSetProperty.document"); + Assert.AreEqual (result, el.OuterXml, "#GetXmlWOSetProperty.outerxml"); } [Test] @@ -160,7 +160,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { sig.LoadXml ((XmlElement) doc.SelectSingleNode ("//*[local-name()='SignedInfo']")); sig.CanonicalizationMethod = "urn:foo"; XmlElement el = sig.GetXml (); - Assert ("#GetXmlWithSetProperty.document", doc != el.OwnerDocument); + Assert.IsTrue (doc != el.OwnerDocument, "#GetXmlWithSetProperty.document"); } [Test] // never fails diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignedXmlTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignedXmlTest.cs index 40b89969512..f952470513b 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignedXmlTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/SignedXmlTest.cs @@ -31,21 +31,21 @@ namespace MonoTests.System.Security.Cryptography.Xml { } [TestFixture] - public class SignedXmlTest : Assertion { + public class SignedXmlTest { private const string signature = "CTnnhjxUQHJmD+t1MjVXrOW+MCA=dbFt6Zw3vR+Xh7LbM/vuifyFA7gPh/NlDM2Glz/SJBsveISieuTBpZlk/zavAeuXR/Nu0Ztt4OP4tCOg09a2RNlrTP0dhkeEfL1jTzpnVaLHuQbCiwOWCgbRif7Xt7N12FuiHYb3BltP/YyXS4E12NxlGlqnDiFA1v/mkK5+C1o=hEfTJNa2idz2u+fSYDDG4Lx/xuk4aBbvOPVNqgc1l9Y8t7Pt+ZyF+kkF3uUl8Y0700BFGAsprnhwrWENK+PGdtvM5796ZKxCCa0ooKkofiT4355HqK26hpV8dvj38vq/rkJe1jHZgkTKa+c/0vjcYZOI/RT/IZv9JfXxVWLuLxk=EQ=="; [Test] public void StaticValues () { - AssertEquals ("XmlDsigCanonicalizationUrl", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", SignedXml.XmlDsigCanonicalizationUrl); - AssertEquals ("XmlDsigCanonicalizationWithCommentsUrl", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments", SignedXml.XmlDsigCanonicalizationWithCommentsUrl); - AssertEquals ("XmlDsigDSAUrl", "http://www.w3.org/2000/09/xmldsig#dsa-sha1", SignedXml.XmlDsigDSAUrl); - AssertEquals ("XmlDsigHMACSHA1Url", "http://www.w3.org/2000/09/xmldsig#hmac-sha1", SignedXml.XmlDsigHMACSHA1Url); - AssertEquals ("XmlDsigMinimalCanonicalizationUrl", "http://www.w3.org/2000/09/xmldsig#minimal", SignedXml.XmlDsigMinimalCanonicalizationUrl); - AssertEquals ("XmlDsigNamespaceUrl", "http://www.w3.org/2000/09/xmldsig#", SignedXml.XmlDsigNamespaceUrl); - AssertEquals ("XmlDsigRSASHA1Url", "http://www.w3.org/2000/09/xmldsig#rsa-sha1", SignedXml.XmlDsigRSASHA1Url); - AssertEquals ("XmlDsigSHA1Url", "http://www.w3.org/2000/09/xmldsig#sha1", SignedXml.XmlDsigSHA1Url); + Assert.AreEqual ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", SignedXml.XmlDsigCanonicalizationUrl, "XmlDsigCanonicalizationUrl"); + Assert.AreEqual ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments", SignedXml.XmlDsigCanonicalizationWithCommentsUrl, "XmlDsigCanonicalizationWithCommentsUrl"); + Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig#dsa-sha1", SignedXml.XmlDsigDSAUrl, "XmlDsigDSAUrl"); + Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig#hmac-sha1", SignedXml.XmlDsigHMACSHA1Url, "XmlDsigHMACSHA1Url"); + Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig#minimal", SignedXml.XmlDsigMinimalCanonicalizationUrl, "XmlDsigMinimalCanonicalizationUrl"); + Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig#", SignedXml.XmlDsigNamespaceUrl, "XmlDsigNamespaceUrl"); + Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig#rsa-sha1", SignedXml.XmlDsigRSASHA1Url, "XmlDsigRSASHA1Url"); + Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig#sha1", SignedXml.XmlDsigSHA1Url, "XmlDsigSHA1Url"); } [Test] @@ -58,7 +58,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { SignedXml sx = new SignedXml (doc); sx.LoadXml (xel); - Assert ("CheckSignature", sx.CheckSignature ()); + Assert.IsTrue (sx.CheckSignature (), "CheckSignature"); } [Test] @@ -71,7 +71,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { SignedXml sx = new SignedXml (doc); sx.LoadXml (doc.DocumentElement); - Assert ("CheckSignature", sx.CheckSignature ()); + Assert.IsTrue (sx.CheckSignature (), "CheckSignature"); } [Test] @@ -96,7 +96,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { SignedXml sx = new SignedXml (doc.DocumentElement); sx.LoadXml (xel); - Assert ("CheckSignature", sx.CheckSignature ()); + Assert.IsTrue (sx.CheckSignature (), "CheckSignature"); } [Test] @@ -111,7 +111,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlElement xel = (XmlElement) xnl [0]; SignedXml sx = new SignedXml (doc.DocumentElement); - Assert ("!CheckSignature", !sx.CheckSignature ()); + Assert.IsTrue (!sx.CheckSignature (), "!CheckSignature"); // SignedXml (XmlElement) != SignedXml () + LoadXml (XmlElement) } @@ -169,7 +169,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { keyInfo.AddClause (new RSAKeyValue (key)); signedXml.KeyInfo = keyInfo; - AssertNotNull ("SignatureMethod", signedXml.SignatureMethod); + Assert.IsNotNull (signedXml.SignatureMethod, "SignatureMethod"); // Compute the signature - causes unsupported algorithm by the key. signedXml.ComputeSignature (); } @@ -187,19 +187,19 @@ namespace MonoTests.System.Security.Cryptography.Xml { keyInfo.AddClause (new RSAKeyValue (key)); signedXml.KeyInfo = keyInfo; - AssertEquals ("KeyInfo", 1, signedXml.KeyInfo.Count); - AssertNull ("SignatureLength", signedXml.SignatureLength); - AssertNull ("SignatureMethod", signedXml.SignatureMethod); - AssertNull ("SignatureValue", signedXml.SignatureValue); - AssertNull ("SigningKeyName", signedXml.SigningKeyName); + Assert.AreEqual (1, signedXml.KeyInfo.Count, "KeyInfo"); + Assert.IsNull (signedXml.SignatureLength, "SignatureLength"); + Assert.IsNull (signedXml.SignatureMethod, "SignatureMethod"); + Assert.IsNull (signedXml.SignatureValue, "SignatureValue"); + Assert.IsNull (signedXml.SigningKeyName, "SigningKeyName"); // Compute the signature. signedXml.ComputeSignature (); - AssertNull ("SigningKeyName", signedXml.SigningKeyName); - AssertEquals ("SignatureMethod", SignedXml.XmlDsigRSASHA1Url, signedXml.SignatureMethod); - AssertEquals ("SignatureValue", 128, signedXml.SignatureValue.Length); - AssertNull ("SigningKeyName", signedXml.SigningKeyName); + Assert.IsNull (signedXml.SigningKeyName, "SigningKeyName"); + Assert.AreEqual (SignedXml.XmlDsigRSASHA1Url, signedXml.SignatureMethod, "SignatureMethod"); + Assert.AreEqual (128, signedXml.SignatureValue.Length, "SignatureValue"); + Assert.IsNull (signedXml.SigningKeyName, "SigningKeyName"); // Get the XML representation of the signature. XmlElement xmlSignature = signedXml.GetXml (); @@ -210,7 +210,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { vrfy.LoadXml (xmlSignature); // assert that we can verify our own signature - Assert ("RSA-Compute/Verify", vrfy.CheckSignature ()); + Assert.IsTrue (vrfy.CheckSignature (), "RSA-Compute/Verify"); } [Test] @@ -226,19 +226,19 @@ namespace MonoTests.System.Security.Cryptography.Xml { keyInfo.AddClause (new DSAKeyValue (key)); signedXml.KeyInfo = keyInfo; - AssertEquals ("KeyInfo", 1, signedXml.KeyInfo.Count); - AssertNull ("SignatureLength", signedXml.SignatureLength); - AssertNull ("SignatureMethod", signedXml.SignatureMethod); - AssertNull ("SignatureValue", signedXml.SignatureValue); - AssertNull ("SigningKeyName", signedXml.SigningKeyName); + Assert.AreEqual (1, signedXml.KeyInfo.Count, "KeyInfo"); + Assert.IsNull (signedXml.SignatureLength, "SignatureLength"); + Assert.IsNull (signedXml.SignatureMethod, "SignatureMethod"); + Assert.IsNull (signedXml.SignatureValue, "SignatureValue"); + Assert.IsNull (signedXml.SigningKeyName, "SigningKeyName"); // Compute the signature. signedXml.ComputeSignature (); - AssertNull ("SignatureLength", signedXml.SignatureLength); - AssertEquals ("SignatureMethod", SignedXml.XmlDsigDSAUrl, signedXml.SignatureMethod); - AssertEquals ("SignatureValue", 40, signedXml.SignatureValue.Length); - AssertNull ("SigningKeyName", signedXml.SigningKeyName); + Assert.IsNull (signedXml.SignatureLength, "SignatureLength"); + Assert.AreEqual (SignedXml.XmlDsigDSAUrl, signedXml.SignatureMethod, "SignatureMethod"); + Assert.AreEqual (40, signedXml.SignatureValue.Length, "SignatureValue"); + Assert.IsNull (signedXml.SigningKeyName, "SigningKeyName"); // Get the XML representation of the signature. XmlElement xmlSignature = signedXml.GetXml (); @@ -249,7 +249,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { vrfy.LoadXml (xmlSignature); // assert that we can verify our own signature - Assert ("DSA-Compute/Verify", vrfy.CheckSignature ()); + Assert.IsTrue (vrfy.CheckSignature (), "DSA-Compute/Verify"); } [Test] @@ -261,26 +261,26 @@ namespace MonoTests.System.Security.Cryptography.Xml { byte[] secretkey = Encoding.Default.GetBytes ("password"); HMACSHA1 hmac = new HMACSHA1 (secretkey); #if NET_2_0 - AssertEquals ("KeyInfo", 0, signedXml.KeyInfo.Count); + Assert.AreEqual (0, signedXml.KeyInfo.Count, "KeyInfo"); #else - AssertNull ("KeyInfo", signedXml.KeyInfo); + Assert.IsNull (signedXml.KeyInfo, "KeyInfo"); #endif - AssertNull ("SignatureLength", signedXml.SignatureLength); - AssertNull ("SignatureMethod", signedXml.SignatureMethod); - AssertNull ("SignatureValue", signedXml.SignatureValue); - AssertNull ("SigningKeyName", signedXml.SigningKeyName); + Assert.IsNull (signedXml.SignatureLength, "SignatureLength"); + Assert.IsNull (signedXml.SignatureMethod, "SignatureMethod"); + Assert.IsNull (signedXml.SignatureValue, "SignatureValue"); + Assert.IsNull (signedXml.SigningKeyName, "SigningKeyName"); signedXml.ComputeSignature (hmac); #if NET_2_0 - AssertEquals ("KeyInfo", 0, signedXml.KeyInfo.Count); + Assert.AreEqual (0, signedXml.KeyInfo.Count, "KeyInfo"); #else - AssertNull ("KeyInfo", signedXml.KeyInfo); + Assert.IsNull (signedXml.KeyInfo, "KeyInfo"); #endif - AssertNull ("SignatureLength", signedXml.SignatureLength); - AssertEquals ("SignatureMethod", SignedXml.XmlDsigHMACSHA1Url, signedXml.SignatureMethod); - AssertEquals ("SignatureValue", 20, signedXml.SignatureValue.Length); - AssertNull ("SigningKeyName", signedXml.SigningKeyName); + Assert.IsNull (signedXml.SignatureLength, "SignatureLength"); + Assert.AreEqual (SignedXml.XmlDsigHMACSHA1Url, signedXml.SignatureMethod, "SignatureMethod"); + Assert.AreEqual (20, signedXml.SignatureValue.Length, "SignatureValue"); + Assert.IsNull (signedXml.SigningKeyName, "SigningKeyName"); // Get the XML representation of the signature. XmlElement xmlSignature = signedXml.GetXml (); @@ -291,7 +291,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { vrfy.LoadXml (xmlSignature); // assert that we can verify our own signature - Assert ("HMACSHA1-Compute/Verify", vrfy.CheckSignature (hmac)); + Assert.IsTrue (vrfy.CheckSignature (hmac), "HMACSHA1-Compute/Verify"); } [Test] @@ -316,17 +316,17 @@ namespace MonoTests.System.Security.Cryptography.Xml { SignedXml v1 = new SignedXml (); v1.LoadXml (doc.DocumentElement); - Assert ("RSA-CheckSignature()", v1.CheckSignature ()); + Assert.IsTrue (v1.CheckSignature (), "RSA-CheckSignature()"); SignedXml v2 = new SignedXml (); v2.LoadXml (doc.DocumentElement); AsymmetricAlgorithm key = null; bool vrfy = v2.CheckSignatureReturningKey (out key); - Assert ("RSA-CheckSignatureReturningKey()", vrfy); + Assert.IsTrue (vrfy, "RSA-CheckSignatureReturningKey()"); SignedXml v3 = new SignedXml (); v3.LoadXml (doc.DocumentElement); - Assert ("RSA-CheckSignature(key)", v3.CheckSignature (key)); + Assert.IsTrue (v3.CheckSignature (key), "RSA-CheckSignature(key)"); } // Using empty constructor @@ -340,17 +340,17 @@ namespace MonoTests.System.Security.Cryptography.Xml { SignedXml v1 = new SignedXml (); v1.LoadXml (doc.DocumentElement); - Assert ("DSA-CheckSignature()", v1.CheckSignature ()); + Assert.IsTrue (v1.CheckSignature (), "DSA-CheckSignature()"); SignedXml v2 = new SignedXml (); v2.LoadXml (doc.DocumentElement); AsymmetricAlgorithm key = null; bool vrfy = v2.CheckSignatureReturningKey (out key); - Assert ("DSA-CheckSignatureReturningKey()", vrfy); + Assert.IsTrue (vrfy, "DSA-CheckSignatureReturningKey()"); SignedXml v3 = new SignedXml (); v3.LoadXml (doc.DocumentElement); - Assert ("DSA-CheckSignature(key)", v3.CheckSignature (key)); + Assert.IsTrue (v3.CheckSignature (key), "DSA-CheckSignature(key)"); } [Test] @@ -366,7 +366,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { byte[] secretkey = Encoding.Default.GetBytes ("password"); HMACSHA1 hmac = new HMACSHA1 (secretkey); - Assert ("HMACSHA1-CheckSignature(key)", v1.CheckSignature (hmac)); + Assert.IsTrue (v1.CheckSignature (hmac), "HMACSHA1-CheckSignature(key)"); } [Test] @@ -378,10 +378,10 @@ namespace MonoTests.System.Security.Cryptography.Xml { SignedXml v1 = new SignedXml (); v1.LoadXml (doc.DocumentElement); - Assert ("CheckSignature", v1.CheckSignature ()); + Assert.IsTrue (v1.CheckSignature (), "CheckSignature"); XmlElement xel = v1.GetIdElement (doc, "MyObjectId"); - Assert ("GetIdElement", xel.InnerXml.StartsWith (" \n Brussels \n", output); + Assert.AreEqual (" \n Brussels \n", output, "#1"); s.Position = 0; HashAlgorithm hash = HashAlgorithm.Create ("System.Security.Cryptography.SHA1CryptoServiceProvider"); byte[] digest = hash.ComputeHash (s); - AssertEquals ("#2", "IKbfdK2/DMfXyezCf5QggVCXfk8=", Convert.ToBase64String (digest)); + Assert.AreEqual ("IKbfdK2/DMfXyezCf5QggVCXfk8=", Convert.ToBase64String (digest), "#2"); X509Certificate2 cert = new X509Certificate2 (_pkcs12, "mono"); SignedXml signedXml = new SignedXml (doc); @@ -640,9 +640,9 @@ namespace MonoTests.System.Security.Cryptography.Xml { signedXml.ComputeSignature (); digest = reference.DigestValue; - AssertEquals ("#3", "e3dsi1xK8FAx1vsug7J203JbEAU=", Convert.ToBase64String (digest)); + Assert.AreEqual ("e3dsi1xK8FAx1vsug7J203JbEAU=", Convert.ToBase64String (digest), "#3"); - AssertEquals ("#4", "" + Assert.AreEqual ("" + "" + "" + "" @@ -652,7 +652,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { + "" + "e3dsi1xK8FAx1vsug7J203JbEAU=" + "" - + "", signedXml.SignedInfo.GetXml ().OuterXml); + + "", signedXml.SignedInfo.GetXml ().OuterXml, "#4"); } [Test] @@ -663,13 +663,13 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInput (doc); Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); - AssertEquals ("#1", "\n Brussels\n", output); + Assert.AreEqual ("\n Brussels\n", output, "#1"); s.Position = 0; HashAlgorithm hash = HashAlgorithm.Create ("System.Security.Cryptography.SHA1CryptoServiceProvider"); byte[] digest = hash.ComputeHash (s); - AssertEquals ("#2", "e3dsi1xK8FAx1vsug7J203JbEAU=", Convert.ToBase64String (digest)); + Assert.AreEqual ("e3dsi1xK8FAx1vsug7J203JbEAU=", Convert.ToBase64String (digest), "#2"); X509Certificate2 cert = new X509Certificate2 (_pkcs12, "mono"); SignedXml signedXml = new SignedXml (doc); @@ -693,9 +693,9 @@ namespace MonoTests.System.Security.Cryptography.Xml { signedXml.ComputeSignature (); digest = reference.DigestValue; - AssertEquals ("#3", "e3dsi1xK8FAx1vsug7J203JbEAU=", Convert.ToBase64String (digest)); + Assert.AreEqual ("e3dsi1xK8FAx1vsug7J203JbEAU=", Convert.ToBase64String (digest), "#3"); - AssertEquals ("#4", "" + Assert.AreEqual ("" + "" + "" + "" @@ -705,7 +705,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { + "" + "e3dsi1xK8FAx1vsug7J203JbEAU=" + "" - + "", signedXml.SignedInfo.GetXml ().OuterXml); + + "", signedXml.SignedInfo.GetXml ().OuterXml, "#4"); } [Test] @@ -769,7 +769,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { SignedXml signedXml = new SignedXml (doc); XmlNodeList nodeList = doc.GetElementsByTagName ("Signature"); signedXml.LoadXml ((XmlElement) nodeList [0]); - Assert ("#2", !signedXml.CheckSignature ()); + Assert.IsTrue (!signedXml.CheckSignature (), "#2"); } [Test] @@ -779,8 +779,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { X509Certificate2 cert = new X509Certificate2 (_pkcs12, "mono"); XmlDocument doc = CreateSignedXml (cert, SignedXml.XmlDsigExcC14NTransformUrl, "\r\n"); - AssertEquals ("#1", string.Format (CultureInfo.InvariantCulture, - "{0}" + + Assert.AreEqual (string.Format (CultureInfo.InvariantCulture, "{0}" + " Brussels{0}" + "" + "" + @@ -828,7 +827,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { "" + "" + "" + - "", "\r\n"), doc.OuterXml); + "", "\r\n"), doc.OuterXml, "#1"); } [Test] @@ -838,8 +837,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { X509Certificate2 cert = new X509Certificate2 (_pkcs12, "mono"); XmlDocument doc = CreateSignedXml (cert, SignedXml.XmlDsigExcC14NTransformUrl, "\n"); - AssertEquals ("#1", string.Format (CultureInfo.InvariantCulture, - "{0}" + + Assert.AreEqual (string.Format (CultureInfo.InvariantCulture, "{0}" + " Brussels{0}" + "" + "" + @@ -887,7 +885,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { "" + "" + "" + - "", "\n"), doc.OuterXml); + "", "\n"), doc.OuterXml, "#1"); } [Test] // part of bug #79454 @@ -897,16 +895,16 @@ namespace MonoTests.System.Security.Cryptography.Xml { X509Certificate2 cert = new X509Certificate2 (_pkcs12, "mono"); doc = CreateSignedXml (cert, SignedXml.XmlDsigExcC14NTransformUrl, "\n"); - Assert ("#1", VerifySignedXml (doc)); + Assert.IsTrue (VerifySignedXml (doc), "#1"); doc = CreateSignedXml (cert, SignedXml.XmlDsigExcC14NWithCommentsTransformUrl, "\n"); - Assert ("#2", VerifySignedXml (doc)); + Assert.IsTrue (VerifySignedXml (doc), "#2"); doc = CreateSignedXml (cert, SignedXml.XmlDsigCanonicalizationUrl, "\n"); - Assert ("#3", VerifySignedXml (doc)); + Assert.IsTrue (VerifySignedXml (doc), "#3"); doc = CreateSignedXml (cert, SignedXml.XmlDsigCanonicalizationWithCommentsUrl, "\n"); - Assert ("#4", VerifySignedXml (doc)); + Assert.IsTrue (VerifySignedXml (doc), "#4"); } // creates a signed XML document with two certificates in the X509Data @@ -1168,7 +1166,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { // doc.Save (System.Console.Out); sig.LoadXml (doc.DocumentElement ["Signature"]); - AssertEquals ("CheckSignature", ok, sig.CheckSignature (mac)); + Assert.AreEqual (ok, sig.CheckSignature (mac), "CheckSignature"); return sig; } @@ -1182,14 +1180,14 @@ namespace MonoTests.System.Security.Cryptography.Xml { public void SignHMAC_SHA256 () { SignedXml sign = SignHMAC (EncryptedXml.XmlEncSHA256Url, new HMACSHA256 (hmackey), true); - AssertEquals ("SignatureMethod", more256, sign.SignatureMethod); + Assert.AreEqual (more256, sign.SignatureMethod, "SignatureMethod"); } [Test] public void SignHMAC_SHA256_Bad () { SignedXml sign = SignHMAC (more256, new HMACSHA256 (hmackey), false); - AssertEquals ("SignatureMethod", more256, sign.SignatureMethod); + Assert.AreEqual (more256, sign.SignatureMethod, "SignatureMethod"); } [Test] @@ -1203,21 +1201,21 @@ namespace MonoTests.System.Security.Cryptography.Xml { sign.LoadXml (doc.DocumentElement ["Signature"]); // verify MS-generated signature - Assert (sign.CheckSignature (new HMACSHA256 (hmackey))); + Assert.IsTrue (sign.CheckSignature (new HMACSHA256 (hmackey))); } [Test] public void SignHMAC_SHA512 () { SignedXml sign = SignHMAC (EncryptedXml.XmlEncSHA512Url, new HMACSHA512 (hmackey), true); - AssertEquals ("SignatureMethod", more512, sign.SignatureMethod); + Assert.AreEqual (more512, sign.SignatureMethod, "SignatureMethod"); } [Test] public void SignHMAC_SHA512_Bad () { SignedXml sign = SignHMAC (more512, new HMACSHA512 (hmackey), false); - AssertEquals ("SignatureMethod", more512, sign.SignatureMethod); + Assert.AreEqual (more512, sign.SignatureMethod, "SignatureMethod"); } [Test] @@ -1231,7 +1229,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { sign.LoadXml (doc.DocumentElement ["Signature"]); // verify MS-generated signature - Assert (sign.CheckSignature (new HMACSHA512 (hmackey))); + Assert.IsTrue (sign.CheckSignature (new HMACSHA512 (hmackey))); } [Test] @@ -1240,7 +1238,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { // works as long as the string can be used by CryptoConfig to create // an instance of the required hash algorithm SignedXml sign = SignHMAC ("SHA384", new HMACSHA384 (hmackey), true); - AssertEquals ("SignatureMethod", more384, sign.SignatureMethod); + Assert.AreEqual (more384, sign.SignatureMethod, "SignatureMethod"); } [Test] @@ -1248,7 +1246,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { { // we can't verity the signature if the URI is used SignedXml sign = SignHMAC (more384, new HMACSHA384 (hmackey), false); - AssertEquals ("SignatureMethod", more384, sign.SignatureMethod); + Assert.AreEqual (more384, sign.SignatureMethod, "SignatureMethod"); } [Test] @@ -1262,7 +1260,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { sign.LoadXml (doc.DocumentElement ["Signature"]); // verify MS-generated signature - Assert (sign.CheckSignature (new HMACSHA384 (hmackey))); + Assert.IsTrue (sign.CheckSignature (new HMACSHA384 (hmackey))); } [Test] @@ -1271,7 +1269,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { // works as long as the string can be used by CryptoConfig to create // an instance of the required hash algorithm SignedXml sign = SignHMAC ("RIPEMD160", new HMACRIPEMD160 (hmackey), true); - AssertEquals ("SignatureMethod", moreripe, sign.SignatureMethod); + Assert.AreEqual (moreripe, sign.SignatureMethod, "SignatureMethod"); } [Test] @@ -1279,7 +1277,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { { // we can't verity the signature if the URI is used SignedXml sign = SignHMAC (moreripe, new HMACRIPEMD160 (hmackey), false); - AssertEquals ("SignatureMethod", moreripe, sign.SignatureMethod); + Assert.AreEqual (moreripe, sign.SignatureMethod, "SignatureMethod"); } [Test] @@ -1293,7 +1291,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { sign.LoadXml (doc.DocumentElement ["Signature"]); // verify MS-generated signature - Assert (sign.CheckSignature (new HMACRIPEMD160 (hmackey))); + Assert.IsTrue (sign.CheckSignature (new HMACRIPEMD160 (hmackey))); } #endif } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/TransformChainTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/TransformChainTest.cs index 1fc613cd52f..5f9684470e6 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/TransformChainTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/TransformChainTest.cs @@ -17,15 +17,15 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] - public class TransformChainTest : Assertion { + public class TransformChainTest { [Test] public void EmptyChain () { TransformChain chain = new TransformChain (); - AssertEquals ("empty count", 0, chain.Count); - AssertNotNull ("IEnumerator", chain.GetEnumerator ()); - AssertEquals ("ToString()", "System.Security.Cryptography.Xml.TransformChain", chain.ToString ()); + Assert.AreEqual (0, chain.Count, "empty count"); + Assert.IsNotNull (chain.GetEnumerator (), "IEnumerator"); + Assert.AreEqual ("System.Security.Cryptography.Xml.TransformChain", chain.ToString (), "ToString()"); } [Test] @@ -35,33 +35,33 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDsigBase64Transform base64 = new XmlDsigBase64Transform (); chain.Add (base64); - AssertEquals ("XmlDsigBase64Transform", base64, chain[0]); - AssertEquals ("count 1", 1, chain.Count); + Assert.AreEqual (base64, chain[0], "XmlDsigBase64Transform"); + Assert.AreEqual (1, chain.Count, "count 1"); XmlDsigC14NTransform c14n = new XmlDsigC14NTransform (); chain.Add (c14n); - AssertEquals ("XmlDsigC14NTransform", c14n, chain[1]); - AssertEquals ("count 2", 2, chain.Count); + Assert.AreEqual (c14n, chain[1], "XmlDsigC14NTransform"); + Assert.AreEqual (2, chain.Count, "count 2"); XmlDsigC14NWithCommentsTransform c14nc = new XmlDsigC14NWithCommentsTransform (); chain.Add (c14nc); - AssertEquals ("XmlDsigC14NWithCommentsTransform", c14nc, chain[2]); - AssertEquals ("count 3", 3, chain.Count); + Assert.AreEqual (c14nc, chain[2], "XmlDsigC14NWithCommentsTransform"); + Assert.AreEqual (3, chain.Count, "count 3"); XmlDsigEnvelopedSignatureTransform esign = new XmlDsigEnvelopedSignatureTransform (); chain.Add (esign); - AssertEquals ("XmlDsigEnvelopedSignatureTransform", esign, chain[3]); - AssertEquals ("count 4", 4, chain.Count); + Assert.AreEqual (esign, chain[3], "XmlDsigEnvelopedSignatureTransform"); + Assert.AreEqual (4, chain.Count, "count 4"); XmlDsigXPathTransform xpath = new XmlDsigXPathTransform (); chain.Add (xpath); - AssertEquals ("XmlDsigXPathTransform", xpath, chain[4]); - AssertEquals ("count 5", 5, chain.Count); + Assert.AreEqual (xpath, chain[4], "XmlDsigXPathTransform"); + Assert.AreEqual (5, chain.Count, "count 5"); XmlDsigXsltTransform xslt = new XmlDsigXsltTransform (); chain.Add (xslt); - AssertEquals ("XmlDsigXsltTransform", xslt, chain[5]); - AssertEquals ("count 6", 6, chain.Count); + Assert.AreEqual (xslt, chain[5], "XmlDsigXsltTransform"); + Assert.AreEqual (6, chain.Count, "count 6"); } } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigBase64TransformTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigBase64TransformTest.cs index f553a44d920..e1a847ae549 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigBase64TransformTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigBase64TransformTest.cs @@ -29,7 +29,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { } [TestFixture] - public class XmlDsigBase64TransformTest : Assertion { + public class XmlDsigBase64TransformTest { protected UnprotectedXmlDsigBase64Transform transform; @@ -43,10 +43,10 @@ namespace MonoTests.System.Security.Cryptography.Xml { [Test] public void Properties () { - AssertEquals ("Algorithm", "http://www.w3.org/2000/09/xmldsig#base64", transform.Algorithm); + Assert.AreEqual ("http://www.w3.org/2000/09/xmldsig#base64", transform.Algorithm, "Algorithm"); Type[] input = transform.InputTypes; - Assert ("Input #", (input.Length == 3)); + Assert.IsTrue ((input.Length == 3), "Input #"); // check presence of every supported input types bool istream = false; bool ixmldoc = false; @@ -59,19 +59,19 @@ namespace MonoTests.System.Security.Cryptography.Xml { if (t.ToString () == "System.Xml.XmlNodeList") ixmlnl = true; } - Assert ("Input Stream", istream); - Assert ("Input XmlDocument", ixmldoc); - Assert ("Input XmlNodeList", ixmlnl); + Assert.IsTrue (istream, "Input Stream"); + Assert.IsTrue (ixmldoc, "Input XmlDocument"); + Assert.IsTrue (ixmlnl, "Input XmlNodeList"); Type[] output = transform.OutputTypes; - Assert ("Output #", (output.Length == 1)); + Assert.IsTrue ((output.Length == 1), "Output #"); // check presence of every supported output types bool ostream = false; foreach (Type t in input) { if (t.ToString () == "System.IO.Stream") ostream = true; } - Assert ("Output Stream", ostream); + Assert.IsTrue (ostream, "Output Stream"); } [Test] @@ -83,12 +83,12 @@ namespace MonoTests.System.Security.Cryptography.Xml { input [2] = null; // property does not return a clone foreach (Type t in transform.InputTypes) { - AssertNull (t); + Assert.IsNull (t); } // it's not a static array XmlDsigBase64Transform t2 = new XmlDsigBase64Transform (); foreach (Type t in t2.InputTypes) { - AssertNotNull (t); + Assert.IsNotNull (t); } } @@ -96,7 +96,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { public void GetInnerXml () { XmlNodeList xnl = transform.UnprotectedGetInnerXml (); - AssertNull ("Default InnerXml", xnl); + Assert.IsNull (xnl, "Default InnerXml"); } private string Stream2String (Stream s) @@ -123,7 +123,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInput (doc); Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); - AssertEquals("XmlDocument", base64, output); + Assert.AreEqual (base64, output, "XmlDocument"); } [Test] @@ -131,11 +131,11 @@ namespace MonoTests.System.Security.Cryptography.Xml { { XmlDocument doc = GetDoc (); XmlNodeList xpath = doc.SelectNodes ("//."); - AssertEquals("XPathNodeList.Count", 3, xpath.Count); + Assert.AreEqual (3, xpath.Count, "XPathNodeList.Count"); transform.LoadInput (xpath); Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); - AssertEquals ("XPathNodeList", base64, output); + Assert.AreEqual (base64, output, "XPathNodeList"); } [Test] @@ -146,7 +146,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); // Note that ChildNodes does not contain the text node. - AssertEquals ("XmlChildNodes", String.Empty, output); + Assert.AreEqual (String.Empty, output, "XmlChildNodes"); } [Test] @@ -159,7 +159,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInput (ms); Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); - AssertEquals ("MemoryStream", base64, output); + Assert.AreEqual (base64, output, "MemoryStream"); } [Test] diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigC14NTransformTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigC14NTransformTest.cs index 99c4480534b..8ddba56c7e1 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigC14NTransformTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigC14NTransformTest.cs @@ -38,7 +38,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { } [TestFixture] - public class XmlDsigC14NTransformTest : Assertion { + public class XmlDsigC14NTransformTest { protected UnprotectedXmlDsigC14NTransform transform; @@ -63,7 +63,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { [Test] // ctor () public void Constructor1 () { - AssertEquals ("Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", transform.Algorithm); + Assert.AreEqual ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", transform.Algorithm, "Algorithm"); CheckProperties (transform); } @@ -71,18 +71,18 @@ namespace MonoTests.System.Security.Cryptography.Xml { public void Constructor2 () { transform = new UnprotectedXmlDsigC14NTransform (true); - AssertEquals ("Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments", transform.Algorithm); + Assert.AreEqual ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments", transform.Algorithm, "Algorithm"); CheckProperties (transform); transform = new UnprotectedXmlDsigC14NTransform (false); - AssertEquals ("Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", transform.Algorithm); + Assert.AreEqual ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", transform.Algorithm, "Algorithm"); CheckProperties (transform); } void CheckProperties (XmlDsigC14NTransform transform) { Type[] input = transform.InputTypes; - Assert ("Input #", (input.Length == 3)); + Assert.IsTrue ((input.Length == 3), "Input #"); // check presence of every supported input types bool istream = false; bool ixmldoc = false; @@ -95,26 +95,26 @@ namespace MonoTests.System.Security.Cryptography.Xml { if (t.ToString () == "System.Xml.XmlNodeList") ixmlnl = true; } - Assert ("Input Stream", istream); - Assert ("Input XmlDocument", ixmldoc); - Assert ("Input XmlNodeList", ixmlnl); + Assert.IsTrue (istream, "Input Stream"); + Assert.IsTrue (ixmldoc, "Input XmlDocument"); + Assert.IsTrue (ixmlnl, "Input XmlNodeList"); Type[] output = transform.OutputTypes; - Assert ("Output #", (output.Length == 1)); + Assert.IsTrue ((output.Length == 1), "Output #"); // check presence of every supported output types bool ostream = false; foreach (Type t in output) { if (t.ToString () == "System.IO.Stream") ostream = true; } - Assert ("Output Stream", ostream); + Assert.IsTrue (ostream, "Output Stream"); } [Test] public void GetInnerXml () { XmlNodeList xnl = transform.UnprotectedGetInnerXml (); - AssertNull ("Default InnerXml", xnl); + Assert.IsNull (xnl, "Default InnerXml"); } private string Stream2String (Stream s) @@ -154,10 +154,10 @@ namespace MonoTests.System.Security.Cryptography.Xml { Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); #if NET_1_1 - AssertEquals("XmlDocument", c14xml3, output); + Assert.AreEqual (c14xml3, output, "XmlDocument"); #else // .NET 1.0 keeps the \r\n (0x0D, 0x0A) - bug - AssertEquals("XmlDocument", c14xml1, output); + Assert.AreEqual (c14xml1, output, "XmlDocument"); #endif } @@ -173,7 +173,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInput (doc.ChildNodes); Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); - AssertEquals ("XmlChildNodes", "", output); + Assert.AreEqual ("", output, "XmlChildNodes"); } [Test] @@ -188,7 +188,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); string expected = @""; - AssertEquals ("XmlChildNodes", expected, output); + Assert.AreEqual (expected, output, "XmlChildNodes"); } [Test] @@ -201,7 +201,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInput (ms); Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); - AssertEquals ("MemoryStream", c14xml2, output); + Assert.AreEqual (c14xml2, output, "MemoryStream"); } [Test] @@ -232,24 +232,21 @@ namespace MonoTests.System.Security.Cryptography.Xml { sw.Close (); } string res = ExecuteXmlDSigC14NTransform (C14NSpecExample1Input); - AssertEquals ("Example 1 from c14n spec - PIs, Comments, and Outside of Document Element (without comments)", - C14NSpecExample1Output, res); + Assert.AreEqual (C14NSpecExample1Output, res, "Example 1 from c14n spec - PIs, Comments, and Outside of Document Element (without comments)"); } [Test] public void C14NSpecExample2 () { string res = ExecuteXmlDSigC14NTransform (C14NSpecExample2Input); - AssertEquals ("Example 2 from c14n spec - Whitespace in Document Content (without comments)", - C14NSpecExample2Output, res); + Assert.AreEqual (C14NSpecExample2Output, res, "Example 2 from c14n spec - Whitespace in Document Content (without comments)"); } [Test] public void C14NSpecExample3 () { string res = ExecuteXmlDSigC14NTransform (C14NSpecExample3Input); - AssertEquals ("Example 3 from c14n spec - Start and End Tags (without comments)", - C14NSpecExample3Output, res); + Assert.AreEqual (C14NSpecExample3Output, res, "Example 3 from c14n spec - Start and End Tags (without comments)"); } [Test] @@ -257,8 +254,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { public void C14NSpecExample4 () { string res = ExecuteXmlDSigC14NTransform (C14NSpecExample4Input); - AssertEquals ("Example 4 from c14n spec - Character Modifications and Character References (without comments)", - C14NSpecExample4Output, res); + Assert.AreEqual (C14NSpecExample4Output, res, "Example 4 from c14n spec - Character Modifications and Character References (without comments)"); } [Test] @@ -269,16 +265,14 @@ namespace MonoTests.System.Security.Cryptography.Xml { sw.Close (); } string res = ExecuteXmlDSigC14NTransform (C14NSpecExample5Input); - AssertEquals ("Example 5 from c14n spec - Entity References (without comments)", - C14NSpecExample5Output, res); + Assert.AreEqual (C14NSpecExample5Output, res, "Example 5 from c14n spec - Entity References (without comments)"); } [Test] public void C14NSpecExample6 () { string res = ExecuteXmlDSigC14NTransform (C14NSpecExample6Input); - AssertEquals ("Example 6 from c14n spec - UTF-8 Encoding (without comments)", - C14NSpecExample6Output, res); + Assert.AreEqual (C14NSpecExample6Output, res, "Example 6 from c14n spec - UTF-8 Encoding (without comments)"); } private string ExecuteXmlDSigC14NTransform (string InputXml) @@ -508,7 +502,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDsigC14NTransform t = new XmlDsigC14NTransform (); t.LoadInput (doc); Stream s = t.GetOutput () as Stream; - AssertEquals (expected, new StreamReader (s, Encoding.UTF8).ReadToEnd ()); + Assert.AreEqual (new StreamReader (s, Encoding.UTF8).ReadToEnd (), expected); } #if NET_2_0 @@ -518,12 +512,12 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDocument doc = new XmlDocument (); doc.AppendChild (doc.CreateElement ("foo", "urn:foo")); doc.DocumentElement.AppendChild (doc.CreateElement ("bar", "urn:bar")); - AssertEquals ("#1", String.Empty, doc.DocumentElement.GetAttribute ("xmlns")); + Assert.AreEqual (String.Empty, doc.DocumentElement.GetAttribute ("xmlns"), "#1"); XmlDsigC14NTransform t = new XmlDsigC14NTransform (); t.LoadInput (doc); Stream s = t.GetOutput () as Stream; - AssertEquals ("", new StreamReader (s, Encoding.UTF8).ReadToEnd ()); - AssertEquals ("#2", "urn:foo", doc.DocumentElement.GetAttribute ("xmlns")); + Assert.AreEqual (new StreamReader (s, Encoding.UTF8).ReadToEnd (), ""); + Assert.AreEqual ("urn:foo", doc.DocumentElement.GetAttribute ("xmlns"), "#2"); } [Test] @@ -533,14 +527,14 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDocument doc = new XmlDocument (); doc.AppendChild (doc.CreateElement ("foo", "urn:foo")); doc.DocumentElement.AppendChild (doc.CreateElement ("bar", "urn:bar")); - AssertEquals ("#1", String.Empty, doc.DocumentElement.GetAttribute ("xmlns:f")); + Assert.AreEqual (String.Empty, doc.DocumentElement.GetAttribute ("xmlns:f"), "#1"); XmlDsigExcC14NTransform t = new XmlDsigExcC14NTransform (); t.LoadInput (doc); t.PropagatedNamespaces.Add ("f", "urn:foo"); t.PropagatedNamespaces.Add ("b", "urn:bar"); Stream s = t.GetOutput () as Stream; - AssertEquals ("", new StreamReader (s, Encoding.UTF8).ReadToEnd ()); - AssertEquals ("#2", "urn:foo", doc.DocumentElement.GetAttribute ("xmlns:f")); + Assert.AreEqual (new StreamReader (s, Encoding.UTF8).ReadToEnd (), ""); + Assert.AreEqual ("urn:foo", doc.DocumentElement.GetAttribute ("xmlns:f"), "#2"); } [Test] diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigC14NWithCommentsTransformTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigC14NWithCommentsTransformTest.cs index 0a15c196568..a97701123cf 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigC14NWithCommentsTransformTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigC14NWithCommentsTransformTest.cs @@ -30,7 +30,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { } [TestFixture] - public class XmlDsigC14NWithCommentsTransformTest : Assertion { + public class XmlDsigC14NWithCommentsTransformTest { protected UnprotectedXmlDsigC14NWithCommentsTransform transform; @@ -59,10 +59,10 @@ namespace MonoTests.System.Security.Cryptography.Xml { [Test] public void Properties () { - AssertEquals ("Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments", transform.Algorithm); + Assert.AreEqual ("http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments", transform.Algorithm, "Algorithm"); Type[] input = transform.InputTypes; - Assert ("Input #", (input.Length == 3)); + Assert.IsTrue ((input.Length == 3), "Input #"); // check presence of every supported input types bool istream = false; bool ixmldoc = false; @@ -75,26 +75,26 @@ namespace MonoTests.System.Security.Cryptography.Xml { if (t.ToString () == "System.Xml.XmlNodeList") ixmlnl = true; } - Assert ("Input Stream", istream); - Assert ("Input XmlDocument", ixmldoc); - Assert ("Input XmlNodeList", ixmlnl); + Assert.IsTrue (istream, "Input Stream"); + Assert.IsTrue (ixmldoc, "Input XmlDocument"); + Assert.IsTrue (ixmlnl, "Input XmlNodeList"); Type[] output = transform.OutputTypes; - Assert ("Output #", (output.Length == 1)); + Assert.IsTrue ((output.Length == 1), "Output #"); // check presence of every supported output types bool ostream = false; foreach (Type t in output) { if (t.ToString () == "System.IO.Stream") ostream = true; } - Assert ("Output Stream", ostream); + Assert.IsTrue (ostream, "Output Stream"); } [Test] public void GetInnerXml () { XmlNodeList xnl = transform.UnprotectedGetInnerXml (); - AssertEquals ("Default InnerXml", null, xnl); + Assert.AreEqual (null, xnl, "Default InnerXml"); } #if NET_2_0 @@ -125,8 +125,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { sw.Close (); } string res = ExecuteXmlDSigC14NTransform (C14NSpecExample1Input, true); - AssertEquals ("Example 1 from c14n spec - PIs, Comments, and Outside of Document Element (with comments)", - C14NSpecExample1Output, res); + Assert.AreEqual (C14NSpecExample1Output, res, "Example 1 from c14n spec - PIs, Comments, and Outside of Document Element (with comments)"); } [Test] @@ -144,32 +143,28 @@ namespace MonoTests.System.Security.Cryptography.Xml { NUnit.Framework.Assert.Ignore ("SecurityManager isn't enabled."); #endif string res = ExecuteXmlDSigC14NTransform (C14NSpecExample1Input, false); - AssertEquals ("Example 1 from c14n spec - PIs, Comments, and Outside of Document Element (with comments)", - C14NSpecExample1Output, res); + Assert.AreEqual (C14NSpecExample1Output, res, "Example 1 from c14n spec - PIs, Comments, and Outside of Document Element (with comments)"); } [Test] public void C14NSpecExample2 () { string res = ExecuteXmlDSigC14NTransform (C14NSpecExample2Input, false); - AssertEquals ("Example 2 from c14n spec - Whitespace in Document Content (with comments)", - C14NSpecExample2Output, res); + Assert.AreEqual (C14NSpecExample2Output, res, "Example 2 from c14n spec - Whitespace in Document Content (with comments)"); } [Test] public void C14NSpecExample3 () { string res = ExecuteXmlDSigC14NTransform (C14NSpecExample3Input, false); - AssertEquals ("Example 3 from c14n spec - Start and End Tags (with comments)", - C14NSpecExample3Output, res); + Assert.AreEqual (C14NSpecExample3Output, res, "Example 3 from c14n spec - Start and End Tags (with comments)"); } [Test] public void C14NSpecExample4 () { string res = ExecuteXmlDSigC14NTransform (C14NSpecExample4Input, false); - AssertEquals ("Example 4 from c14n spec - Character Modifications and Character References (with comments)", - C14NSpecExample4Output, res); + Assert.AreEqual (C14NSpecExample4Output, res, "Example 4 from c14n spec - Character Modifications and Character References (with comments)"); } [Test] @@ -182,16 +177,14 @@ namespace MonoTests.System.Security.Cryptography.Xml { } } string res = ExecuteXmlDSigC14NTransform (C14NSpecExample5Input, false); - AssertEquals ("Example 5 from c14n spec - Entity References (with comments)", - C14NSpecExample5Output, res); + Assert.AreEqual (C14NSpecExample5Output, res, "Example 5 from c14n spec - Entity References (with comments)"); } [Test] public void C14NSpecExample6 () { string res = ExecuteXmlDSigC14NTransform (C14NSpecExample6Input, false); - AssertEquals ("Example 6 from c14n spec - UTF-8 Encoding (with comments)", - C14NSpecExample6Output, res); + Assert.AreEqual (C14NSpecExample6Output, res, "Example 6 from c14n spec - UTF-8 Encoding (with comments)"); } private string ExecuteXmlDSigC14NTransform (string InputXml, bool resolver) diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigExcC14NTransformTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigExcC14NTransformTest.cs index 118caa48fbb..bd70d9b2b60 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigExcC14NTransformTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigExcC14NTransformTest.cs @@ -59,7 +59,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { } [TestFixture] - public class XmlDsigExcC14NTransformTest : Assertion { + public class XmlDsigExcC14NTransformTest { protected UnprotectedXmlDsigExcC14NTransform transform; @@ -84,8 +84,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { [Test] // ctor () public void Constructor1 () { - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm); - AssertNull ("InclusiveNamespacesPrefixList", transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm, "Algorithm"); + Assert.IsNull (transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); } @@ -93,13 +93,13 @@ namespace MonoTests.System.Security.Cryptography.Xml { public void Constructor2 () { transform = new UnprotectedXmlDsigExcC14NTransform (true); - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#WithComments", transform.Algorithm); - AssertNull ("InclusiveNamespacesPrefixList", transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#WithComments", transform.Algorithm, "Algorithm"); + Assert.IsNull (transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); transform = new UnprotectedXmlDsigExcC14NTransform (false); - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm); - AssertNull ("InclusiveNamespacesPrefixList", transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm, "Algorithm"); + Assert.IsNull (transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); } @@ -107,18 +107,18 @@ namespace MonoTests.System.Security.Cryptography.Xml { public void Constructor3 () { transform = new UnprotectedXmlDsigExcC14NTransform (null); - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm); - AssertNull ("InclusiveNamespacesPrefixList", transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm, "Algorithm"); + Assert.IsNull (transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); transform = new UnprotectedXmlDsigExcC14NTransform (string.Empty); - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm); - AssertEquals ("InclusiveNamespacesPrefixList", string.Empty, transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm, "Algorithm"); + Assert.AreEqual (string.Empty, transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); transform = new UnprotectedXmlDsigExcC14NTransform ("#default xsd"); - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm); - AssertEquals ("InclusiveNamespacesPrefixList", "#default xsd", transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm, "Algorithm"); + Assert.AreEqual ("#default xsd", transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); } @@ -126,40 +126,40 @@ namespace MonoTests.System.Security.Cryptography.Xml { public void Constructor4 () { transform = new UnprotectedXmlDsigExcC14NTransform (true, null); - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#WithComments", transform.Algorithm); - AssertNull ("InclusiveNamespacesPrefixList", transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#WithComments", transform.Algorithm, "Algorithm"); + Assert.IsNull (transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); transform = new UnprotectedXmlDsigExcC14NTransform (true, string.Empty); - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#WithComments", transform.Algorithm); - AssertEquals ("InclusiveNamespacesPrefixList", string.Empty, transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#WithComments", transform.Algorithm, "Algorithm"); + Assert.AreEqual (string.Empty, transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); transform = new UnprotectedXmlDsigExcC14NTransform (true, "#default xsd"); - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#WithComments", transform.Algorithm); - AssertEquals ("InclusiveNamespacesPrefixList", "#default xsd", transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#WithComments", transform.Algorithm, "Algorithm"); + Assert.AreEqual ("#default xsd", transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); transform = new UnprotectedXmlDsigExcC14NTransform (false, null); - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm); - AssertNull ("InclusiveNamespacesPrefixList", transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm, "Algorithm"); + Assert.IsNull (transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); transform = new UnprotectedXmlDsigExcC14NTransform (false, string.Empty); - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm); - AssertEquals ("InclusiveNamespacesPrefixList", string.Empty, transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm, "Algorithm"); + Assert.AreEqual (string.Empty, transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); transform = new UnprotectedXmlDsigExcC14NTransform (false, "#default xsd"); - AssertEquals ("Algorithm", "http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm); - AssertEquals ("InclusiveNamespacesPrefixList", "#default xsd", transform.InclusiveNamespacesPrefixList); + Assert.AreEqual ("http://www.w3.org/2001/10/xml-exc-c14n#", transform.Algorithm, "Algorithm"); + Assert.AreEqual ("#default xsd", transform.InclusiveNamespacesPrefixList, "InclusiveNamespacesPrefixList"); CheckProperties (transform); } void CheckProperties (XmlDsigExcC14NTransform transform) { Type[] input = transform.InputTypes; - Assert ("Input #", (input.Length == 3)); + Assert.IsTrue ((input.Length == 3), "Input #"); // check presence of every supported input types bool istream = false; bool ixmldoc = false; @@ -172,19 +172,19 @@ namespace MonoTests.System.Security.Cryptography.Xml { if (t.ToString () == "System.Xml.XmlNodeList") ixmlnl = true; } - Assert ("Input Stream", istream); - Assert ("Input XmlDocument", ixmldoc); - Assert ("Input XmlNodeList", ixmlnl); + Assert.IsTrue (istream, "Input Stream"); + Assert.IsTrue (ixmldoc, "Input XmlDocument"); + Assert.IsTrue (ixmlnl, "Input XmlNodeList"); Type[] output = transform.OutputTypes; - Assert ("Output #", (output.Length == 1)); + Assert.IsTrue ((output.Length == 1), "Output #"); // check presence of every supported output types bool ostream = false; foreach (Type t in output) { if (t.ToString () == "System.IO.Stream") ostream = true; } - Assert ("Output Stream", ostream); + Assert.IsTrue (ostream, "Output Stream"); } [Test] @@ -196,12 +196,12 @@ namespace MonoTests.System.Security.Cryptography.Xml { input [2] = null; // property does not return a clone foreach (Type t in transform.InputTypes) { - AssertNull (t); + Assert.IsNull (t); } // it's not a static array XmlDsigExcC14NTransform t2 = new XmlDsigExcC14NTransform (); foreach (Type t in t2.InputTypes) { - AssertNotNull (t); + Assert.IsNotNull (t); } } @@ -209,7 +209,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { public void GetInnerXml () { XmlNodeList xnl = transform.UnprotectedGetInnerXml (); - AssertNull ("Default InnerXml", xnl); + Assert.IsNull (xnl, "Default InnerXml"); } private string Stream2String (Stream s) @@ -249,10 +249,10 @@ namespace MonoTests.System.Security.Cryptography.Xml { Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); #if NET_1_1 - AssertEquals("XmlDocument", c14xml3, output); + Assert.AreEqual (c14xml3, output, "XmlDocument"); #else // .NET 1.0 keeps the \r\n (0x0D, 0x0A) - bug - AssertEquals("XmlDocument", c14xml1, output); + Assert.AreEqual (c14xml1, output, "XmlDocument"); #endif } @@ -268,7 +268,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInput (doc.ChildNodes); Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); - AssertEquals ("XmlChildNodes", "", output); + Assert.AreEqual ("", output, "XmlChildNodes"); } [Test] @@ -283,7 +283,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); string expected = @""; - AssertEquals ("XmlChildNodes", expected, output); + Assert.AreEqual (expected, output, "XmlChildNodes"); } [Test] @@ -296,7 +296,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInput (ms); Stream s = (Stream) transform.GetOutput (); string output = Stream2String (s); - AssertEquals ("MemoryStream", c14xml2, output); + Assert.AreEqual (c14xml2, output, "MemoryStream"); } [Test] @@ -323,24 +323,21 @@ namespace MonoTests.System.Security.Cryptography.Xml { sw.Close (); } string res = ExecuteXmlDSigExcC14NTransform (ExcC14NSpecExample1Input); - AssertEquals ("Example 1 from c14n spec - PIs, Comments, and Outside of Document Element (without comments)", - ExcC14NSpecExample1Output, res); + Assert.AreEqual (ExcC14NSpecExample1Output, res, "Example 1 from c14n spec - PIs, Comments, and Outside of Document Element (without comments)"); } [Test] public void ExcC14NSpecExample2 () { string res = ExecuteXmlDSigExcC14NTransform (ExcC14NSpecExample2Input); - AssertEquals ("Example 2 from c14n spec - Whitespace in Document Content (without comments)", - ExcC14NSpecExample2Output, res); + Assert.AreEqual (ExcC14NSpecExample2Output, res, "Example 2 from c14n spec - Whitespace in Document Content (without comments)"); } [Test] public void ExcC14NSpecExample3 () { string res = ExecuteXmlDSigExcC14NTransform (ExcC14NSpecExample3Input); - AssertEquals ("Example 3 from c14n spec - Start and End Tags (without comments)", - ExcC14NSpecExample3Output, res); + Assert.AreEqual (ExcC14NSpecExample3Output, res, "Example 3 from c14n spec - Start and End Tags (without comments)"); } [Test] @@ -348,8 +345,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { public void ExcC14NSpecExample4 () { string res = ExecuteXmlDSigExcC14NTransform (ExcC14NSpecExample4Input); - AssertEquals ("Example 4 from c14n spec - Character Modifications and Character References (without comments)", - ExcC14NSpecExample4Output, res); + Assert.AreEqual (ExcC14NSpecExample4Output, res, "Example 4 from c14n spec - Character Modifications and Character References (without comments)"); } [Test] @@ -360,16 +356,14 @@ namespace MonoTests.System.Security.Cryptography.Xml { sw.Close (); } string res = ExecuteXmlDSigExcC14NTransform (ExcC14NSpecExample5Input); - AssertEquals ("Example 5 from c14n spec - Entity References (without comments)", - ExcC14NSpecExample5Output, res); + Assert.AreEqual (ExcC14NSpecExample5Output, res, "Example 5 from c14n spec - Entity References (without comments)"); } [Test] public void ExcC14NSpecExample6 () { string res = ExecuteXmlDSigExcC14NTransform (ExcC14NSpecExample6Input); - AssertEquals ("Example 6 from c14n spec - UTF-8 Encoding (without comments)", - ExcC14NSpecExample6Output, res); + Assert.AreEqual (ExcC14NSpecExample6Output, res, "Example 6 from c14n spec - UTF-8 Encoding (without comments)"); } private string ExecuteXmlDSigExcC14NTransform (string InputXml) @@ -599,7 +593,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDsigExcC14NTransform t = new XmlDsigExcC14NTransform (); t.LoadInput (doc); Stream s = t.GetOutput () as Stream; - AssertEquals (expected, new StreamReader (s, Encoding.UTF8).ReadToEnd ()); + Assert.AreEqual (new StreamReader (s, Encoding.UTF8).ReadToEnd (), expected); } [Test] diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigXPathTransformTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigXPathTransformTest.cs index 26cdfaab395..a3fa4215609 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigXPathTransformTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigXPathTransformTest.cs @@ -32,7 +32,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { } [TestFixture] - public class XmlDsigXPathTransformTest : Assertion { + public class XmlDsigXPathTransformTest { protected UnprotectedXmlDsigXPathTransform transform; @@ -45,10 +45,10 @@ namespace MonoTests.System.Security.Cryptography.Xml { [Test] public void Properties () { - AssertEquals ("Algorithm", "http://www.w3.org/TR/1999/REC-xpath-19991116", transform.Algorithm); + Assert.AreEqual ("http://www.w3.org/TR/1999/REC-xpath-19991116", transform.Algorithm, "Algorithm"); Type[] input = transform.InputTypes; - Assert ("Input #", (input.Length == 3)); + Assert.IsTrue ((input.Length == 3), "Input #"); // check presence of every supported input types bool istream = false; bool ixmldoc = false; @@ -61,28 +61,28 @@ namespace MonoTests.System.Security.Cryptography.Xml { if (t.ToString () == "System.Xml.XmlNodeList") ixmlnl = true; } - Assert ("Input Stream", istream); - Assert ("Input XmlDocument", ixmldoc); - Assert ("Input XmlNodeList", ixmlnl); + Assert.IsTrue (istream, "Input Stream"); + Assert.IsTrue (ixmldoc, "Input XmlDocument"); + Assert.IsTrue (ixmlnl, "Input XmlNodeList"); Type[] output = transform.OutputTypes; - Assert ("Output #", (output.Length == 1)); + Assert.IsTrue ((output.Length == 1), "Output #"); // check presence of every supported output types bool oxmlnl = false; foreach (Type t in output) { if (t.ToString () == "System.Xml.XmlNodeList") oxmlnl = true; } - Assert ("Output XmlNodeList", oxmlnl); + Assert.IsTrue (oxmlnl, "Output XmlNodeList"); } - protected void AssertEquals (string msg, XmlNodeList expected, XmlNodeList actual) + protected void AreEqual (string msg, XmlNodeList expected, XmlNodeList actual) { for (int i=0; i < expected.Count; i++) { if (expected [i].OuterXml != actual [i].OuterXml) - Fail (msg + " [" + i + "] expected " + expected[i].OuterXml + " bug got " + actual[i].OuterXml); + Assert.Fail (msg + " [" + i + "] expected " + expected[i].OuterXml + " bug got " + actual[i].OuterXml); } - AssertEquals (expected.Count, actual.Count); + Assert.AreEqual (expected.Count, actual.Count); } [Test] @@ -92,8 +92,8 @@ namespace MonoTests.System.Security.Cryptography.Xml { public void GetInnerXml () { XmlNodeList xnl = transform.UnprotectedGetInnerXml (); - AssertEquals ("Default InnerXml.Count", 1, xnl.Count); - AssertEquals ("Default InnerXml.OuterXml", "", xnl [0].OuterXml); + Assert.AreEqual (1, xnl.Count, "Default InnerXml.Count"); + Assert.AreEqual ("", xnl [0].OuterXml, "Default InnerXml.OuterXml"); } [Test] @@ -106,7 +106,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInnerXml (inner); XmlNodeList xnl = (XmlNodeList) transform.GetOutput (); #if NET_2_0 - AssertEquals ("Count", 0, xnl.Count); + Assert.AreEqual (0, xnl.Count, "Count"); #endif } @@ -143,9 +143,9 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInnerXml (inner); XmlNodeList xnl = (XmlNodeList) transform.GetOutput (); #if NET_2_0 - AssertEquals (73, xnl.Count); + Assert.AreEqual (73, xnl.Count); #else - AssertEquals (47, xnl.Count); + Assert.AreEqual (47, xnl.Count); #endif } @@ -156,7 +156,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInput (doc); // empty means no LoadInnerXml XmlNodeList xnl = (XmlNodeList) transform.GetOutput (); - AssertEquals ("Empy Result", 0, xnl.Count); + Assert.AreEqual (0, xnl.Count, "Empy Result"); } [Test] @@ -168,7 +168,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlNodeList inner = InnerXml ("//*/title"); transform.LoadInnerXml (inner); XmlNodeList xnl = (XmlNodeList) transform.GetOutput (); - AssertEquals (1, xnl.Count); + Assert.AreEqual (1, xnl.Count); } [Test] @@ -178,7 +178,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInput (doc.ChildNodes); // empty means no LoadInnerXml XmlNodeList xnl = (XmlNodeList) transform.GetOutput (); - AssertEquals ("Empy Result", 0, xnl.Count); + Assert.AreEqual (0, xnl.Count, "Empy Result"); } [Test] @@ -197,9 +197,9 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInnerXml (inner); XmlNodeList xnl = (XmlNodeList) transform.GetOutput (); #if NET_2_0 - AssertEquals (73, xnl.Count); + Assert.AreEqual (73, xnl.Count); #else - AssertEquals (47, xnl.Count); + Assert.AreEqual (47, xnl.Count); #endif } @@ -213,7 +213,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { transform.LoadInput (ms); // empty means no LoadInnerXml XmlNodeList xnl = (XmlNodeList) transform.GetOutput (); - AssertEquals ("Empy Result", 0, xnl.Count); + Assert.AreEqual (0, xnl.Count, "Empy Result"); } [Test] @@ -222,7 +222,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlNodeList inner = InnerXml ("//*"); transform.LoadInnerXml (inner); XmlNodeList xnl = transform.UnprotectedGetInnerXml (); - AssertEquals ("LoadInnerXml", inner, xnl); + Assert.AreEqual (inner, xnl, "LoadInnerXml"); } [Test] @@ -254,18 +254,18 @@ namespace MonoTests.System.Security.Cryptography.Xml { doc.LoadXml ("test"); t.LoadInput (doc); XmlNodeList nl = (XmlNodeList) t.GetOutput (); - AssertEquals (XmlNodeType.Document, nl [0].NodeType); - AssertEquals (XmlNodeType.Element, nl [1].NodeType); - AssertEquals ("element", nl [1].LocalName); - AssertEquals (XmlNodeType.Element, nl [2].NodeType); - AssertEquals ("foo", nl [2].LocalName); - AssertEquals (XmlNodeType.Element, nl [3].NodeType); - AssertEquals ("bar", nl [3].LocalName); + Assert.AreEqual (XmlNodeType.Document, nl [0].NodeType); + Assert.AreEqual (XmlNodeType.Element, nl [1].NodeType); + Assert.AreEqual ("element", nl [1].LocalName); + Assert.AreEqual (XmlNodeType.Element, nl [2].NodeType); + Assert.AreEqual ("foo", nl [2].LocalName); + Assert.AreEqual (XmlNodeType.Element, nl [3].NodeType); + Assert.AreEqual ("bar", nl [3].LocalName); // MS.NET bug - ms.net returns ns node even when the // current node is ns node (it is like returning // attribute from attribute nodes). -// AssertEquals (XmlNodeType.Attribute, nl [4].NodeType); -// AssertEquals ("xmlns", nl [4].LocalName); +// Assert.AreEqual (XmlNodeType.Attribute, nl [4].NodeType); +// Assert.AreEqual ("xmlns", nl [4].LocalName); } [Test] @@ -286,43 +286,43 @@ namespace MonoTests.System.Security.Cryptography.Xml { t.LoadInput (doc); XmlNodeList nl = (XmlNodeList) t.GetOutput (); - AssertEquals ("0", 0, nl.Count); + Assert.AreEqual (0, nl.Count, "0"); doc.LoadXml ("test"); t.LoadInput (doc); nl = (XmlNodeList) t.GetOutput (); #if NET_2_0 - AssertEquals ("1", 0, nl.Count); + Assert.AreEqual (0, nl.Count, "1"); #else - AssertEquals ("1", 1, nl.Count); + Assert.AreEqual (1, nl.Count, "1"); #endif doc.LoadXml ("test"); t.LoadInput (doc); nl = (XmlNodeList) t.GetOutput (); #if NET_2_0 - AssertEquals ("2", 0, nl.Count); + Assert.AreEqual (0, nl.Count, "2"); #else - AssertEquals ("2", 2, nl.Count); + Assert.AreEqual (2, nl.Count, "2"); #endif doc.LoadXml ("test"); t.LoadInput (doc); nl = (XmlNodeList) t.GetOutput (); #if NET_2_0 - AssertEquals ("3", 0, nl.Count); + Assert.AreEqual (0, nl.Count, "3"); #else - AssertEquals ("3", 3, nl.Count); + Assert.AreEqual (3, nl.Count, "3"); #endif doc.LoadXml ("blah"); t.LoadInput (doc); nl = (XmlNodeList) t.GetOutput (); #if NET_2_0 - AssertEquals ("4", 0, nl.Count); + Assert.AreEqual (0, nl.Count, "4"); #else - AssertEquals ("4", 1, nl.Count); - AssertEquals ("NodeType", XmlNodeType.Attribute, nl [0].NodeType); + Assert.AreEqual (1, nl.Count, "4"); + Assert.AreEqual (XmlNodeType.Attribute, nl [0].NodeType, "NodeType"); #endif } } diff --git a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigXsltTransformTest.cs b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigXsltTransformTest.cs index 568023c8ac1..2074c79333b 100644 --- a/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigXsltTransformTest.cs +++ b/mcs/class/System.Security/Test/System.Security.Cryptography.Xml/XmlDsigXsltTransformTest.cs @@ -39,7 +39,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { } [TestFixture] - public class XmlDsigXsltTransformTest : Assertion { + public class XmlDsigXsltTransformTest { protected UnprotectedXmlDsigXsltTransform transform; @@ -66,10 +66,10 @@ namespace MonoTests.System.Security.Cryptography.Xml { void CheckProperties (XmlDsigXsltTransform transform) { - AssertEquals ("Algorithm", "http://www.w3.org/TR/1999/REC-xslt-19991116", transform.Algorithm); + Assert.AreEqual ("http://www.w3.org/TR/1999/REC-xslt-19991116", transform.Algorithm, "Algorithm"); Type[] input = transform.InputTypes; - Assert ("Input #", (input.Length == 3)); + Assert.IsTrue ((input.Length == 3), "Input #"); // check presence of every supported input types bool istream = false; bool ixmldoc = false; @@ -82,26 +82,26 @@ namespace MonoTests.System.Security.Cryptography.Xml { if (t.ToString () == "System.Xml.XmlNodeList") ixmlnl = true; } - Assert ("Input Stream", istream); - Assert ("Input XmlDocument", ixmldoc); - Assert ("Input XmlNodeList", ixmlnl); + Assert.IsTrue (istream, "Input Stream"); + Assert.IsTrue (ixmldoc, "Input XmlDocument"); + Assert.IsTrue (ixmlnl, "Input XmlNodeList"); Type[] output = transform.OutputTypes; - Assert ("Output #", (output.Length == 1)); + Assert.IsTrue ((output.Length == 1), "Output #"); // check presence of every supported output types bool ostream = false; foreach (Type t in output) { if (t.ToString () == "System.IO.Stream") ostream = true; } - Assert ("Output Stream", ostream); + Assert.IsTrue (ostream, "Output Stream"); } [Test] public void GetInnerXml () { XmlNodeList xnl = transform.UnprotectedGetInnerXml (); - AssertNull ("Default InnerXml", xnl); + Assert.IsNull (xnl, "Default InnerXml"); } private string Stream2Array (Stream s) @@ -169,7 +169,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { #endif } finally { - Assert ("Exception not thrown", result); + Assert.IsTrue (result, "Exception not thrown"); } } @@ -242,11 +242,11 @@ namespace MonoTests.System.Security.Cryptography.Xml { string output = Stream2Array (s); } - protected void AssertEquals (string msg, XmlNodeList expected, XmlNodeList actual) + protected void AreEqual (string msg, XmlNodeList expected, XmlNodeList actual) { for (int i=0; i < expected.Count; i++) { if (expected[i].OuterXml != actual[i].OuterXml) - Fail (msg + " [" + i + "] expected " + expected[i].OuterXml + " bug got " + actual[i].OuterXml); + Assert.Fail (msg + " [" + i + "] expected " + expected[i].OuterXml + " bug got " + actual[i].OuterXml); } } @@ -256,7 +256,7 @@ namespace MonoTests.System.Security.Cryptography.Xml { XmlDocument doc = GetXslDoc (); transform.LoadInnerXml (doc.DocumentElement.ChildNodes); XmlNodeList xnl = transform.UnprotectedGetInnerXml (); - AssertEquals ("LoadInnerXml", doc.DocumentElement.ChildNodes, xnl); + Assert.AreEqual (doc.DocumentElement.ChildNodes, xnl, "LoadInnerXml"); } [Test] diff --git a/mcs/class/System.ServiceModel/ChangeLog b/mcs/class/System.ServiceModel/ChangeLog index f240d089561..d9b764e5985 100755 --- a/mcs/class/System.ServiceModel/ChangeLog +++ b/mcs/class/System.ServiceModel/ChangeLog @@ -1,3 +1,18 @@ +2009-07-07 Astushi Enomoto + + * System.ServiceModel.dll.sources: + Added new custom peer resolver files. + +2009-07-07 Astushi Enomoto + + * System.ServiceModel_test.dll.sources: + add PeerNodeAddressTest.cs. + +2009-06-25 Astushi Enomoto + + * System.ServiceModel.dll.sources: + add SessionInstanceContextProvider.cs. + 2009-06-09 Astushi Enomoto * System.ServiceModel_test.dll.sources: diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog index 76bb506e94b..6b7a7fc910e 100755 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog @@ -1,3 +1,114 @@ +2009-07-10 Atsushi Enomoto + + * PeerDuplexChannel.cs : now it implements some of node management + functionality and Send operation. The receiver part is not yet. + +2009-07-10 Atsushi Enomoto + + * TcpChannelListener.cs, TcpDuplexSessionChannel.cs : do not pass + timeout to channel constructor. it does not make sense. + +2009-07-10 Atsushi Enomoto + + * PeerChannelFactory.cs, PeerChannelListener.cs : add MessageEncoder + as common interface member, and use binary encoder (not text). + +2009-07-09 Atsushi Enomoto + + * PeerDuplexChannel.cs : PeerNode constructor argument changes. + +2009-07-08 Atsushi Enomoto + + * PeerDuplexChannel.cs, PeerChannelListener.cs, PeerOutputChannel.cs, + PeerInputChannel.cs, PeerChannelFactory.cs : those channels are + going to be unified to PeerDuplexChannel. And it is likely that + input and output functionalities are to be unified too. + +2009-07-08 Atsushi Enomoto + + * TcpChannelFactory.cs : (TcpChannelInfo) ease type restriction. I + may have to reuse it for peer transport. + * PeerChannelListener.cs : add binding member. + * PeerDuplexChannel.cs : remove NIE overrides. Fill fields a bit. + +2009-07-08 Atsushi Enomoto + + * ChannelFactoryBase.cs, HttpChannelFactory.cs, + PeerChannelFactory.cs : close opened channels at OnClose() as + documented. Implement async methods. + * PeerChannelListener.cs : removed some NIE overrides. + +2009-07-02 Atsushi Enomoto + + * DuplexChannelBase.cs : some more async methods. + +2009-06-29 Atsushi Enomoto + + * TcpDuplexSessionChannel.cs : on Abort(), do just Close() within + (almost) no time. + * TcpChannelListener.cs : accept multiple channels at a time. + +2009-06-29 Atsushi Enomoto + + * TcpDuplexSessionChannel.cs : do not output all (stored) writer + session strings but output only those new ones in current message. + This fixes inconsistent body output in repetitive use of sender. + +2009-06-26 Atsushi Enomoto + + * TcpDuplexSessionChannel.cs : handle EndRecord for repetitive + operation that does not involve session. + Preserve writer session as well as reader session. + * MessageHeaders.cs : take name and namespace into consideration + when creating a serializer. + +2009-06-25 Atsushi Enomoto + + * TcpChannelListener.cs, TcpDuplexSessionChannel.cs : + Made required changes for repeated use of message exchanges. + Hold binary reader session. The channels use it incrementally. + Preambles are handled at Open, and EndRecords are handled at + Close, Add session shutdown hook here (not working yet though). + +2009-06-18 Atsushi Enomoto + + * ChannelListenerBase_1.cs : added cancellation hook here too. + HttpChannelListener.cs : use above. + Do not allow parallel channel creation (this listener does not + allow more than one AcceptChannel(). + +2009-06-18 Atsushi Enomoto + + * ReplyChannelBase.cs, HttpReplyChannel.cs : + Add cancellation hook for async TryReceiveRequest. + +2009-06-18 Atsushi Enomoto + + * HttpChannelListener.cs, HttpListenerManager.cs : + slightly improved BuildChannelListener(). + Implement OnAbort() and differentiate it from OnClose(). + +2009-06-18 Atsushi Enomoto + + * TcpDuplexSessionChannel.cs : remove NIE stubs. + +2009-06-18 Atsushi Enomoto + + * DuplexChannelBase.cs : simple async delegate calls here too. + +2009-06-16 Atsushi Enomoto + + * ReplyChannelBase.cs : cosmetic dependency reduction on listener. + +2009-06-16 Atsushi Enomoto + + * HttpReplyChannel.cs : cosometic simplification. + +2009-06-16 Atsushi Enomoto + + * HttpRequestChannel.cs : Fixed timeout handling. It was causing + infinite block in 2.0 profile. + 2009-06-12 Atsushi Enomoto * TcpChannelListener.cs, TcpDuplexSessionChannel.cs : diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChannelFactoryBase.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChannelFactoryBase.cs index 46c6609470d..0b08e71b39b 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChannelFactoryBase.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChannelFactoryBase.cs @@ -37,7 +37,8 @@ namespace System.ServiceModel.Channels public abstract class ChannelFactoryBase : ChannelFactoryBase, IChannelFactory { - [MonoTODO] + List channels = new List (); + protected ChannelFactoryBase () : this (DefaultCommunicationTimeouts.Instance) { @@ -59,34 +60,45 @@ namespace System.ServiceModel.Channels EndpointAddress remoteAddress, Uri via) { ValidateCreateChannel (); - return OnCreateChannel (remoteAddress, via); + var ch = OnCreateChannel (remoteAddress, via); + channels.Add (ch); + return ch; } protected abstract TChannel OnCreateChannel ( EndpointAddress remoteAddress, Uri via); - [MonoTODO ("find out what to do here.")] protected override void OnAbort () { + // this implicitly premises: TChannel is IChannel + foreach (IChannel ch in channels) + ch.Abort (); base.OnAbort (); } - [MonoTODO ("find out what to do here.")] protected override void OnClose (TimeSpan timeout) { - base.OnClose (timeout); + DateTime start = DateTime.Now; + // this implicitly premises: TChannel is IChannel + foreach (IChannel ch in channels) + ch.Close (timeout - (DateTime.Now - start)); + base.OnClose (timeout - (DateTime.Now - start)); } - [MonoTODO ("find out what to do here.")] + Action close_delegate; + protected override IAsyncResult OnBeginClose (TimeSpan timeout, AsyncCallback callback, object state) { - return base.OnBeginClose (timeout, callback, state); + if (close_delegate == null) + close_delegate = new Action (OnClose); + return close_delegate.BeginInvoke (timeout, callback, state); } - [MonoTODO ("find out what to do here.")] protected override void OnEndClose (IAsyncResult result) { - base.OnEndClose (result); + if (close_delegate == null) + throw new InvalidOperationException ("Async close operation has not started"); + close_delegate.EndInvoke (result); } protected void ValidateCreateChannel () @@ -102,7 +114,6 @@ namespace System.ServiceModel.Channels { TimeSpan open_timeout, close_timeout, receive_timeout, send_timeout; - [MonoTODO] protected ChannelFactoryBase () : this (DefaultCommunicationTimeouts.Instance) { @@ -138,27 +149,30 @@ namespace System.ServiceModel.Channels return null; } - [MonoTODO ("find out what to do here.")] protected override void OnAbort () { + // what should we do here? } - [MonoTODO] - protected override IAsyncResult OnBeginClose (TimeSpan timeout, - AsyncCallback callback, object state) + Action close_delegate; + + protected override IAsyncResult OnBeginClose (TimeSpan timeout, AsyncCallback callback, object state) { - throw new NotImplementedException (); + if (close_delegate == null) + close_delegate = new Action (OnClose); + return close_delegate.BeginInvoke (timeout, callback, state); } - [MonoTODO] protected override void OnEndClose (IAsyncResult result) { - throw new NotImplementedException (); + if (close_delegate == null) + throw new InvalidOperationException ("Async close operation has not started"); + close_delegate.EndInvoke (result); } - [MonoTODO] protected override void OnClose (TimeSpan timeout) { + // what should we do here? } } } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChannelListenerBase_1.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChannelListenerBase_1.cs index 9268afefbed..928a34728ec 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChannelListenerBase_1.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ChannelListenerBase_1.cs @@ -27,6 +27,7 @@ using System; using System.Collections.Generic; using System.ServiceModel; +using System.Threading; namespace System.ServiceModel.Channels { @@ -48,19 +49,64 @@ namespace System.ServiceModel.Channels Func wait_delegate; Action open_delegate, close_delegate; + protected Thread CurrentAsyncThread { get; private set; } + protected IAsyncResult CurrentAsyncResult { get; private set; } + + protected override void OnAbort () + { + if (CurrentAsyncThread != null) + CurrentAsyncThread.Abort (); // it is not beautiful but there is no other way to stop it. + } + + protected override void OnClose (TimeSpan timeout) + { + if (CurrentAsyncThread != null) + if (!CancelAsync (timeout)) + if (CurrentAsyncThread != null) // being careful + CurrentAsyncThread.Abort (); // it is not beautiful but there is no other way to stop it. + } + + // cancel ongoing async operations and return if it was + // completed successfully. If not, it will abort. + public virtual bool CancelAsync (TimeSpan timeout) + { + return CurrentAsyncResult == null || CurrentAsyncResult.AsyncWaitHandle.WaitOne (timeout); + } + protected override IAsyncResult OnBeginAcceptChannel ( TimeSpan timeout, AsyncCallback callback, object asyncState) { + //if (CurrentAsyncResult != null) + // throw new InvalidOperationException ("Another AcceptChannel operation is in progress"); + + ManualResetEvent wait = new ManualResetEvent (false); + if (accept_channel_delegate == null) - accept_channel_delegate = new Func (OnAcceptChannel); - return accept_channel_delegate.BeginInvoke (timeout, callback, asyncState); + accept_channel_delegate = new Func (delegate (TimeSpan tout) { + wait.WaitOne (); // make sure that CurrentAsyncResult is set. + CurrentAsyncThread = Thread.CurrentThread; + + try { + return OnAcceptChannel (tout); + } finally { + CurrentAsyncThread = null; + CurrentAsyncResult = null; + } + }); + + CurrentAsyncResult = accept_channel_delegate.BeginInvoke (timeout, callback, asyncState); + wait.Set (); + return CurrentAsyncResult; } protected override TChannel OnEndAcceptChannel (IAsyncResult result) { if (accept_channel_delegate == null) throw new InvalidOperationException ("Async AcceptChannel operation has not started"); + // FIXME: what's wrong with this? + //if (CurrentAsyncResult == null) + // throw new InvalidOperationException ("Async AcceptChannel operation has not started. Argument result was: " + result); return accept_channel_delegate.EndInvoke (result); } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/DuplexChannelBase.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/DuplexChannelBase.cs index 07db03f040b..d5e01dc3ce9 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/DuplexChannelBase.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/DuplexChannelBase.cs @@ -68,9 +68,38 @@ namespace System.ServiceModel.Channels void SetupDelegates () { + open_handler = new Action (Open); + close_handler = new Action (Close); send_handler = new AsyncSendHandler (Send); receive_handler = new AsyncReceiveHandler (Receive); wait_handler = new AsyncWaitForMessageHandler (WaitForMessage); + try_receive_handler = new TryReceiveHandler (TryReceive); + } + + // Open + Action open_handler; + + protected override IAsyncResult OnBeginOpen (TimeSpan timeout, AsyncCallback callback, object state) + { + return open_handler.BeginInvoke (timeout, callback, state); + } + + protected override void OnEndOpen (IAsyncResult result) + { + open_handler.EndInvoke (result); + } + + // Close + Action close_handler; + + protected override IAsyncResult OnBeginClose (TimeSpan timeout, AsyncCallback callback, object state) + { + return close_handler.BeginInvoke (timeout, callback, state); + } + + protected override void OnEndClose (IAsyncResult result) + { + close_handler.EndInvoke (result); } // Send @@ -128,11 +157,20 @@ namespace System.ServiceModel.Channels public abstract Message Receive (TimeSpan timeout); // TryReceive - // FIXME: apply those "async to call sync" pattern too (but how?) - public abstract IAsyncResult BeginTryReceive (TimeSpan timeout, AsyncCallback callback, object state); + delegate bool TryReceiveHandler (TimeSpan timeout, out Message msg); + TryReceiveHandler try_receive_handler; + + public virtual IAsyncResult BeginTryReceive (TimeSpan timeout, AsyncCallback callback, object state) + { + Message dummy; + return try_receive_handler.BeginInvoke (timeout, out dummy, callback, state); + } - public abstract bool EndTryReceive (IAsyncResult result, out Message message); + public virtual bool EndTryReceive (IAsyncResult result, out Message message) + { + return try_receive_handler.EndInvoke (out message, result); + } public virtual bool TryReceive (TimeSpan timeout, out Message message) { diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelFactory.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelFactory.cs index c59b395255c..048ad4bbc57 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelFactory.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelFactory.cs @@ -77,15 +77,21 @@ namespace System.ServiceModel.Channels throw new InvalidOperationException (String.Format ("channel type {0} is not supported.", typeof (TChannel).Name)); } + Action open_delegate; + protected override IAsyncResult OnBeginOpen (TimeSpan timeout, AsyncCallback callback, object state) { - throw new NotImplementedException (); + if (open_delegate == null) + open_delegate = new Action (OnOpen); + return open_delegate.BeginInvoke (timeout, callback, state); } protected override void OnEndOpen (IAsyncResult result) { - throw new NotImplementedException (); + if (open_delegate == null) + throw new InvalidOperationException ("Async open operation has not started"); + open_delegate.EndInvoke (result); } protected override void OnOpen (TimeSpan timeout) diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelListener.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelListener.cs index 38fd6fc0d3f..eb7bc27bfec 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelListener.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpChannelListener.cs @@ -52,13 +52,24 @@ namespace System.ServiceModel.Channels get { return httpChannelManager.HttpListener; } } + object creator_lock = new object (); + protected override TChannel CreateChannel (TimeSpan timeout) + { + lock (creator_lock) { + return CreateChannelCore (timeout); + } + } + + TChannel CreateChannelCore (TimeSpan timeout) { if (typeof (TChannel) == typeof (IReplyChannel)) return (TChannel) (object) new HttpSimpleReplyChannel ((HttpSimpleChannelListener) (object) this); + // FIXME: session channel support + if (typeof (TChannel) == typeof (IReplySessionChannel)) + throw new NotImplementedException (); - // FIXME: implement more - throw new NotImplementedException (); + throw new NotSupportedException (String.Format ("Channel type {0} is not supported", typeof (TChannel))); } protected override void OnOpen (TimeSpan timeout) @@ -67,12 +78,20 @@ namespace System.ServiceModel.Channels StartListening (timeout); } + protected override void OnAbort () + { + httpChannelManager.Stop (true); + } + protected override void OnClose (TimeSpan timeout) { if (State == CommunicationState.Closed) return; base.OnClose (timeout); - httpChannelManager.Stop (); + // FIXME: it is said that channels are not closed + // when the channel listener is closed. + // http://blogs.msdn.com/drnick/archive/2006/03/22/557642.aspx + httpChannelManager.Stop (false); } void StartListening (TimeSpan timeout) @@ -95,9 +114,11 @@ namespace System.ServiceModel.Channels { if (typeof (TChannel) == typeof (IReplyChannel)) return (TChannel) (object) new AspNetReplyChannel ((AspNetChannelListener) (object) this); + // FIXME: session channel support + if (typeof (TChannel) == typeof (IReplySessionChannel)) + throw new NotImplementedException (); - // FIXME: implement more - throw new NotImplementedException (); + throw new NotSupportedException (String.Format ("Channel type {0} is not supported", typeof (TChannel))); } } @@ -156,9 +177,9 @@ namespace System.ServiceModel.Channels throw new NotImplementedException (); } - [MonoTODO ("find out what to do here.")] protected override void OnAbort () { + OnClose (TimeSpan.Zero); } protected override void OnOpen (TimeSpan timeout) @@ -167,8 +188,10 @@ namespace System.ServiceModel.Channels protected override void OnClose (TimeSpan timeout) { + DateTime start = DateTime.Now; foreach (TChannel ch in Channels) - ch.Close(timeout); + ch.Close (timeout - (DateTime.Now - start)); + base.OnClose (timeout - (DateTime.Now - start)); } } } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpListenerManager.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpListenerManager.cs index a662d299bd7..5abdc748dac 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpListenerManager.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpListenerManager.cs @@ -72,7 +72,7 @@ namespace System.ServiceModel.Channels } } - public void Stop () + public void Stop (bool abort) { lock (opened_listeners) { if (http_listener == null) @@ -80,8 +80,12 @@ namespace System.ServiceModel.Channels List> channelsList = registered_channels [channel_listener.Uri]; channelsList.Remove (channel_listener); if (channelsList.Count == 0) { - if (http_listener.IsListening) - http_listener.Stop (); + if (http_listener.IsListening) { + if (abort) + http_listener.Abort (); + else + http_listener.Close (); + } ((IDisposable) http_listener).Dispose (); opened_listeners.Remove (channel_listener.Uri); diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpReplyChannel.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpReplyChannel.cs index 21fff1fa755..d30f8c30f6e 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpReplyChannel.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpReplyChannel.cs @@ -50,8 +50,10 @@ namespace System.ServiceModel.Channels protected override void OnClose (TimeSpan timeout) { + DateTime start = DateTime.Now; if (reqctx != null) - reqctx.Close (); + reqctx.Close (timeout); + base.OnClose (timeout - (DateTime.Now - start)); } public override bool TryReceiveRequest (TimeSpan timeout, out RequestContext context) @@ -93,14 +95,14 @@ namespace System.ServiceModel.Channels msg = Encoder.ReadMessage ( ctx.Request.InputStream, maxSizeOfHeaders); - if (source.MessageEncoder.MessageVersion.Envelope == EnvelopeVersion.Soap11 || - source.MessageEncoder.MessageVersion.Addressing == AddressingVersion.None) { + if (MessageVersion.Envelope == EnvelopeVersion.Soap11 || + MessageVersion.Addressing == AddressingVersion.None) { string action = GetHeaderItem (ctx.Request.Headers ["SOAPAction"]); if (action != null) msg.Headers.Action = action; } } else if (ctx.Request.HttpMethod == "GET") { - msg = Message.CreateMessage (source.MessageEncoder.MessageVersion, null); + msg = Message.CreateMessage (MessageVersion, null); } msg.Headers.To = ctx.Request.Url; @@ -176,6 +178,10 @@ w.Close (); get { return local_address; } } + internal MessageVersion MessageVersion { + get { return source.MessageEncoder.MessageVersion; } + } + public override RequestContext ReceiveRequest (TimeSpan timeout) { RequestContext ctx; @@ -185,12 +191,14 @@ w.Close (); protected override void OnAbort () { + base.OnAbort (); foreach (HttpListenerContext ctx in waiting) ctx.Request.InputStream.Close (); } protected override void OnClose (TimeSpan timeout) { + base.OnClose (timeout); // FIXME: consider timeout foreach (HttpListenerContext ctx in waiting) ctx.Request.InputStream.Close (); diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpRequestChannel.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpRequestChannel.cs index 199f33d41bf..c203f8f2a6f 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpRequestChannel.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/HttpRequestChannel.cs @@ -340,8 +340,8 @@ w.Close (); // FIXME: Do we need to use the timeout? If so, what happens when the timeout is reached. // Is the current request cancelled and an exception thrown? If so we need to pass the // exception to the Complete () method and allow the result to complete 'normally'. - //wait.WaitOne (Timeout, true); - wait.WaitOne (); + if (!wait.WaitOne (Timeout, true)) + throw new TimeoutException (); } if (error != null) throw error; diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/MessageHeaders.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/MessageHeaders.cs index 3e23033d1f9..34dde7b58c1 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/MessageHeaders.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/MessageHeaders.cs @@ -148,10 +148,10 @@ namespace System.ServiceModel.Channels return l.GetEnumerator (); } - XmlObjectSerializer GetSerializer () + XmlObjectSerializer GetSerializer (int headerIndex) { if (!serializers.ContainsKey (typeof (T))) - serializers [typeof (T)] = new DataContractSerializer (typeof (T)); + serializers [typeof (T)] = new DataContractSerializer (typeof (T), this [headerIndex].Name, this [headerIndex].Namespace); return serializers [typeof (T)]; } @@ -162,7 +162,7 @@ namespace System.ServiceModel.Channels return (T) (object) new EndpointAddress (r.ReadElementContentAsString ()); } else - return GetHeader (index, GetSerializer ()); + return GetHeader (index, GetSerializer (index)); } public T GetHeader (int index, XmlObjectSerializer serializer) diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerChannelFactory.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerChannelFactory.cs index 749d61a9fbf..6f58b88da10 100755 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerChannelFactory.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerChannelFactory.cs @@ -36,7 +36,14 @@ using System.Text; namespace System.ServiceModel.Channels { - internal class PeerChannelFactory : ChannelFactoryBase + internal interface IPeerChannelManager + { + PeerTransportBindingElement Source { get; } + PeerResolver Resolver { get; } + MessageEncoder MessageEncoder { get; } + } + + internal class PeerChannelFactory : ChannelFactoryBase, IPeerChannelManager { PeerTransportBindingElement source; MessageEncoder encoder; @@ -52,7 +59,7 @@ namespace System.ServiceModel.Channels } } if (encoder == null) - encoder = new TextMessageEncoder (MessageVersion.Default, Encoding.UTF8); + encoder = new BinaryMessageEncoder (); } public PeerResolver Resolver { get; set; } @@ -75,21 +82,27 @@ namespace System.ServiceModel.Channels Type t = typeof (TChannel); if (t == typeof (IOutputChannel)) - return (TChannel) (object) new PeerOutputChannel ((PeerChannelFactory) (object) this, address, via, Resolver); + return (TChannel) (object) new PeerDuplexChannel (this, address, via, Resolver); if (t == typeof (IDuplexChannel)) - return (TChannel) (object) new PeerDuplexChannel ((PeerChannelFactory) (object) this, address, via, Resolver); + return (TChannel) (object) new PeerDuplexChannel (this, address, via, Resolver); throw new InvalidOperationException (String.Format ("channel type {0} is not supported.", typeof (TChannel).Name)); } + Action open_delegate; + protected override IAsyncResult OnBeginOpen (TimeSpan timeout, AsyncCallback callback, object state) { - throw new NotImplementedException (); + if (open_delegate == null) + open_delegate = new Action (OnOpen); + return open_delegate.BeginInvoke (timeout, callback, state); } protected override void OnEndOpen (IAsyncResult result) { - throw new NotImplementedException (); + if (open_delegate == null) + throw new InvalidOperationException ("Async open operation has not started"); + open_delegate.EndInvoke (result); } protected override void OnOpen (TimeSpan timeout) diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerChannelListener.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerChannelListener.cs index 6b559150148..4f3ee5a7968 100755 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerChannelListener.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerChannelListener.cs @@ -37,7 +37,7 @@ using System.Text; namespace System.ServiceModel.Channels { - internal class PeerChannelListener : ChannelListenerBase + internal class PeerChannelListener : InternalChannelListenerBase, IPeerChannelManager where TChannel : class, IChannel { PeerTransportBindingElement source; @@ -62,11 +62,15 @@ namespace System.ServiceModel.Channels } } if (encoder == null) - encoder = new TextMessageEncoder (MessageVersion.Default, Encoding.UTF8); + encoder = new BinaryMessageEncoder (); } public PeerResolver Resolver { get; set; } + public PeerTransportBindingElement Source { + get { return source; } + } + public MessageEncoder MessageEncoder { get { return encoder; } } @@ -85,37 +89,14 @@ namespace System.ServiceModel.Channels TChannel PopulateChannel (TimeSpan timeout) { if (typeof (TChannel) == typeof (IInputChannel)) - return (TChannel) (object) new PeerInputChannel ((PeerChannelListener) (object) this, timeout); + return (TChannel) (object) new PeerDuplexChannel (this); // FIXME: handle timeout somehow. if (typeof (TChannel) == typeof (IDuplexChannel)) - return (TChannel) (object) new PeerDuplexChannel ((PeerChannelListener) (object) this); + return (TChannel) (object) new PeerDuplexChannel (this); throw new InvalidOperationException (String.Format ("Not supported channel '{0}' (mono bug; it is incorrectly allowed at construction time)", typeof (TChannel))); } - protected override IAsyncResult OnBeginAcceptChannel ( - TimeSpan timeout, AsyncCallback callback, - object asyncState) - { - throw new NotImplementedException (); - } - - protected override TChannel OnEndAcceptChannel (IAsyncResult result) - { - throw new NotImplementedException (); - } - - protected override IAsyncResult OnBeginWaitForChannel ( - TimeSpan timeout, AsyncCallback callback, object state) - { - throw new NotImplementedException (); - } - - protected override bool OnEndWaitForChannel (IAsyncResult result) - { - throw new NotImplementedException (); - } - protected override bool OnWaitForChannel (TimeSpan timeout) { throw new NotImplementedException (); @@ -126,17 +107,6 @@ namespace System.ServiceModel.Channels throw new NotImplementedException (); } - protected override IAsyncResult OnBeginOpen (TimeSpan timeout, - AsyncCallback callback, object state) - { - throw new NotImplementedException (); - } - - protected override void OnEndOpen (IAsyncResult result) - { - throw new NotImplementedException (); - } - protected override void OnClose (TimeSpan timeout) { if (ServiceHostingEnvironment.InAspNet) @@ -146,19 +116,6 @@ namespace System.ServiceModel.Channels ch.Close(timeout); } - [MonoTODO] - protected override IAsyncResult OnBeginClose (TimeSpan timeout, - AsyncCallback callback, object state) - { - throw new NotImplementedException (); - } - - [MonoTODO] - protected override void OnEndClose (IAsyncResult result) - { - throw new NotImplementedException (); - } - [MonoTODO ("find out what to do here.")] protected override void OnAbort () { diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerDuplexChannel.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerDuplexChannel.cs index f28a9edd6db..2bc8f030659 100755 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerDuplexChannel.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerDuplexChannel.cs @@ -27,9 +27,11 @@ // using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.IO; using System.Net; using System.Net.Security; +using System.Net.Sockets; using System.ServiceModel; using System.ServiceModel.Description; using System.ServiceModel.Security; @@ -37,32 +39,45 @@ using System.Threading; namespace System.ServiceModel.Channels { + + // PeerDuplexChannel can be created either from PeerChannelFactory + // (as IOutputChannel) or PeerChannelListener (as IInputChannel). + // + // PeerNode has to be created before Open() (at least at client side). + // On open, it tries to resolve the nodes in the mesh (and do something + // - but what?). Then registers itself to the mesh and refreshes it. + internal class PeerDuplexChannel : DuplexChannelBase { - PeerChannelFactory factory; - PeerChannelListener listener; + PeerTransportBindingElement binding; EndpointAddress local_address; PeerResolver resolver; PeerNode node; + TcpListener listener; + TcpChannelInfo info; + List peers = new List (); - public PeerDuplexChannel (PeerChannelFactory factory, EndpointAddress address, Uri via, PeerResolver resolver) - : base (factory, address, via) + public PeerDuplexChannel (IPeerChannelManager factory, EndpointAddress address, Uri via, PeerResolver resolver) + : base ((ChannelFactoryBase) factory, address, via) { - this.factory = factory; - this.resolver = resolver; + binding = factory.Source; + this.resolver = factory.Resolver; + info = new TcpChannelInfo (binding, factory.MessageEncoder, null); // FIXME: fill properties correctly. // It could be opened even with empty list of PeerNodeAddresses. // So, do not create PeerNode per PeerNodeAddress, but do it with PeerNodeAddress[]. - node = new PeerNodeImpl (resolver, RemoteAddress, factory.Source.Port); + node = new PeerNodeImpl (RemoteAddress, factory.Source.ListenIPAddress, factory.Source.Port); } // FIXME: receive local_address too - public PeerDuplexChannel (PeerChannelListener listener) - : base (listener) + public PeerDuplexChannel (IPeerChannelManager listener) + : base ((ChannelListenerBase) listener) { - this.listener = listener; + binding = listener.Source; + this.resolver = listener.Resolver; + info = new TcpChannelInfo (binding, listener.MessageEncoder, null); // FIXME: fill properties correctly. - // FIXME: set resolver and node. + node = new PeerNodeImpl (null, listener.Source.ListenIPAddress, listener.Source.Port); } public override EndpointAddress LocalAddress { @@ -78,74 +93,77 @@ namespace System.ServiceModel.Channels // DuplexChannelBase - public override void Send (Message message, TimeSpan timeout) + TcpDuplexSessionChannel CreateInnerChannel (PeerNodeAddress pna) { - throw new NotImplementedException (); + var cfb = Manager as ChannelFactoryBase; + if (cfb != null) + return new TcpDuplexSessionChannel (cfb, info, pna.EndpointAddress, Via); + else + return new TcpDuplexSessionChannel ((ChannelListenerBase) Manager, info, listener.AcceptTcpClient ()); } - public override Message Receive (TimeSpan timeout) + public override void Send (Message message, TimeSpan timeout) { - throw new NotImplementedException (); - } + ThrowIfDisposedOrNotOpen (); - public override IAsyncResult BeginTryReceive (TimeSpan timeout, AsyncCallback callback, object state) - { - throw new NotImplementedException (); + DateTime start = DateTime.Now; + + foreach (var pna in peers) { + var inner = CreateInnerChannel (pna); + inner.Open (timeout - (DateTime.Now - start)); + inner.Send (message, timeout); + } } - public override bool EndTryReceive (IAsyncResult result, out Message message) + public override Message Receive (TimeSpan timeout) { + ThrowIfDisposedOrNotOpen (); + throw new NotImplementedException (); } public override bool WaitForMessage (TimeSpan timeout) { + ThrowIfDisposedOrNotOpen (); + throw new NotImplementedException (); } // CommunicationObject - [MonoTODO] protected override void OnAbort () { - throw new NotImplementedException (); + OnClose (TimeSpan.Zero); } - [MonoTODO] - protected override IAsyncResult OnBeginClose (TimeSpan timeout, - AsyncCallback callback, object state) + protected override void OnClose (TimeSpan timeout) { - throw new NotImplementedException (); + DateTime start = DateTime.Now; + peers.Clear (); + resolver.Unregister (node.RegisteredId, timeout - (DateTime.Now - start)); + node.SetOffline (); + if (listener != null) + listener.Stop (); + node.RegisteredId = null; } - [MonoTODO] - protected override IAsyncResult OnBeginOpen (TimeSpan timeout, - AsyncCallback callback, object state) + protected override void OnOpen (TimeSpan timeout) { - throw new NotImplementedException (); - } + DateTime start = DateTime.Now; - protected override void OnClose (TimeSpan timeout) - { - node.Close (timeout); - } - - [MonoTODO] - protected override void OnEndClose (IAsyncResult result) - { - throw new NotImplementedException (); - } + // FIXME: supply maxAddresses + peers.AddRange (resolver.Resolve (node.MeshId, 3, timeout)); - [MonoTODO] - protected override void OnEndOpen (IAsyncResult result) - { - throw new NotImplementedException (); - } + listener = node.GetTcpListener (); + var ep = (IPEndPoint) listener.LocalEndpoint; + string name = Dns.GetHostName (); + var nid = new Random ().Next (0, int.MaxValue); + var ea = new EndpointAddress ("net.tcp://" + name + ":" + ep.Port + "/PeerChannelEndpoints/" + Guid.NewGuid ()); + var pna = new PeerNodeAddress (ea, new ReadOnlyCollection (Dns.GetHostEntry (ep.Address).AddressList)); + node.RegisteredId = resolver.Register (node.MeshId, pna, timeout - (DateTime.Now - start)); + node.NodeId = nid; - // At some stage I should unify this class with PeerOutputChannel (and probably PeerInputChannel). Too much duplicate. - protected override void OnOpen (TimeSpan timeout) - { - node.Open (timeout); + node.SetOnline (); } } } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerInputChannel.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerInputChannel.cs index ce153725d34..b635e51299a 100755 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerInputChannel.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerInputChannel.cs @@ -1,3 +1,4 @@ +#if false // // PeerInputChannel.cs // @@ -130,3 +131,4 @@ namespace System.ServiceModel.Channels } } } +#endif diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerOutputChannel.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerOutputChannel.cs index a75927f44e9..82a1ee0434c 100755 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerOutputChannel.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/PeerOutputChannel.cs @@ -1,3 +1,4 @@ +#if false // // PeerOutputChannel.cs // @@ -111,3 +112,4 @@ namespace System.ServiceModel.Channels } } } +#endif diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ReplyChannelBase.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ReplyChannelBase.cs index 0b286d6172c..069c17e49cb 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ReplyChannelBase.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/ReplyChannelBase.cs @@ -33,25 +33,42 @@ using System.Net.Security; using System.ServiceModel; using System.ServiceModel.Description; using System.ServiceModel.Security; +using System.Threading; namespace System.ServiceModel.Channels { internal abstract class ReplyChannelBase : ChannelBase, IReplyChannel { - ChannelListenerBase channel_listener; - public ReplyChannelBase (ChannelListenerBase listener) : base (listener) { - this.channel_listener = listener; } public abstract EndpointAddress LocalAddress { get; } + protected override void OnAbort () + { + OnClose (TimeSpan.Zero); + } + + protected override void OnClose (TimeSpan timeout) + { + if (CurrentAsyncThread != null) + if (!CancelAsync (timeout)) + CurrentAsyncThread.Abort (); + } + + public virtual bool CancelAsync (TimeSpan timeout) + { + // FIXME: It should wait for the actual completion. + return CurrentAsyncResult == null; + //return CurrentAsyncResult == null || CurrentAsyncResult.AsyncWaitHandle.WaitOne (timeout); + } + public virtual bool TryReceiveRequest () { RequestContext dummy; - return TryReceiveRequest (channel_listener.DefaultReceiveTimeout, out dummy); + return TryReceiveRequest (DefaultReceiveTimeout, out dummy); } public abstract bool TryReceiveRequest (TimeSpan timeout, out RequestContext context); @@ -59,12 +76,27 @@ namespace System.ServiceModel.Channels delegate bool TryReceiveDelegate (TimeSpan timeout, out RequestContext context); TryReceiveDelegate try_recv_delegate; + protected Thread CurrentAsyncThread { get; private set; } + protected IAsyncResult CurrentAsyncResult { get; private set; } + public virtual IAsyncResult BeginTryReceiveRequest (TimeSpan timeout, AsyncCallback callback, object state) { + if (CurrentAsyncResult != null) + throw new InvalidOperationException ("Another async TryReceiveRequest operation is in progress"); if (try_recv_delegate == null) - try_recv_delegate = new TryReceiveDelegate (TryReceiveRequest); + try_recv_delegate = new TryReceiveDelegate (delegate (TimeSpan tout, out RequestContext ctx) { + if (CurrentAsyncResult != null) + CurrentAsyncThread = Thread.CurrentThread; + try { + return TryReceiveRequest (tout, out ctx); + } finally { + CurrentAsyncResult = null; + CurrentAsyncThread = null; + } + }); RequestContext dummy; - return try_recv_delegate.BeginInvoke (timeout, out dummy, callback, state); + CurrentAsyncResult = try_recv_delegate.BeginInvoke (timeout, out dummy, callback, state); + return CurrentAsyncResult; } public virtual bool EndTryReceiveRequest (IAsyncResult result) @@ -82,7 +114,7 @@ namespace System.ServiceModel.Channels public virtual bool WaitForRequest () { - return WaitForRequest (channel_listener.DefaultReceiveTimeout); + return WaitForRequest (DefaultReceiveTimeout); } public abstract bool WaitForRequest (TimeSpan timeout); @@ -106,14 +138,14 @@ namespace System.ServiceModel.Channels public virtual RequestContext ReceiveRequest () { - return ReceiveRequest (channel_listener.DefaultReceiveTimeout); + return ReceiveRequest (DefaultReceiveTimeout); } public abstract RequestContext ReceiveRequest (TimeSpan timeout); public virtual IAsyncResult BeginReceiveRequest (AsyncCallback callback, object state) { - return BeginReceiveRequest (channel_listener.DefaultReceiveTimeout, callback, state); + return BeginReceiveRequest (DefaultReceiveTimeout, callback, state); } Func recv_delegate; diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpChannelFactory.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpChannelFactory.cs index c7c82bb7ce0..6ea42139640 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpChannelFactory.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpChannelFactory.cs @@ -21,14 +21,14 @@ namespace System.ServiceModel.Channels { internal class TcpChannelInfo { - public TcpChannelInfo (TcpTransportBindingElement element, MessageEncoder encoder, XmlDictionaryReaderQuotas readerQuotas) + public TcpChannelInfo (TransportBindingElement element, MessageEncoder encoder, XmlDictionaryReaderQuotas readerQuotas) { this.BindingElement = element; this.MessageEncoder = encoder; this.ReaderQuotas = readerQuotas ?? new XmlDictionaryReaderQuotas (); } - public TcpTransportBindingElement BindingElement { get; private set; } + public TransportBindingElement BindingElement { get; private set; } public MessageEncoder MessageEncoder { get; private set; } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpChannelListener.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpChannelListener.cs index 19ba19a3f5f..c13ada5ca29 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpChannelListener.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpChannelListener.cs @@ -14,6 +14,7 @@ using System.Net; using System.Net.Sockets; using System.ServiceModel.Description; using System.Text; +using System.Threading; using System.Xml; namespace System.ServiceModel.Channels @@ -21,14 +22,12 @@ namespace System.ServiceModel.Channels internal class TcpChannelListener : InternalChannelListenerBase where TChannel : class, IChannel { - List channels = new List (); BindingContext context; TcpChannelInfo info; IDuplexSession session; Uri listen_uri; TcpListener tcp_listener; - [MonoTODO] public TcpChannelListener (TcpTransportBindingElement source, BindingContext context) : base (context.Binding) { @@ -61,20 +60,31 @@ namespace System.ServiceModel.Channels public override Uri Uri { get { return listen_uri; } } - - [MonoTODO] + + List accept_handles = new List (); + protected override TChannel OnAcceptChannel (TimeSpan timeout) { - TChannel channel = PopulateChannel (timeout); - channels.Add (channel); - return channel; - } - - TChannel PopulateChannel (TimeSpan timeout) - { - // FIXME: pass delegate or something to remove the channel instance from "channels" when it is closed. + TcpClient client = null; + if (tcp_listener.Pending ()) { + client = tcp_listener.AcceptTcpClient (); + } else { + var wait = new ManualResetEvent (false); + tcp_listener.BeginAcceptTcpClient (delegate (IAsyncResult result) { + client = tcp_listener.EndAcceptTcpClient (result); + wait.Set (); + accept_handles.Remove (wait); + }, null); + if (State == CommunicationState.Closing) + return null; + accept_handles.Add (wait); + wait.WaitOne (timeout); + } + if (client == null) + return null; // onclose + if (typeof (TChannel) == typeof (IDuplexSessionChannel)) - return (TChannel) (object) new TcpDuplexSessionChannel (this, info, tcp_listener, timeout); + return (TChannel) (object) new TcpDuplexSessionChannel (this, info, client); // FIXME: To implement more. throw new NotImplementedException (); @@ -106,11 +116,14 @@ namespace System.ServiceModel.Channels { if (tcp_listener == null) throw new InvalidOperationException ("Current state is " + State); + lock (accept_handles) { + foreach (var wait in accept_handles) + wait.Set (); + } tcp_listener.Stop (); tcp_listener = null; } - [MonoTODO] protected override void OnOpen (TimeSpan timeout) { IPHostEntry entry = Dns.GetHostEntry (listen_uri.Host); diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpDuplexSessionChannel.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpDuplexSessionChannel.cs index ef85095b2ef..b91ce6cb659 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpDuplexSessionChannel.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Channels/TcpDuplexSessionChannel.cs @@ -60,8 +60,7 @@ namespace System.ServiceModel.Channels public override void Close (TimeSpan timeout) { - // FIXME: what to do here? - throw new NotImplementedException (); + owner.DiscardSession (); } } @@ -69,27 +68,22 @@ namespace System.ServiceModel.Channels TcpClient client; bool is_service_side; EndpointAddress local_address; - TcpListener tcp_listener; - TimeSpan timeout; TcpBinaryFrameManager frame; - TcpDuplexSession session; + TcpDuplexSession session; // do not use this directly. Use Session instead. public TcpDuplexSessionChannel (ChannelFactoryBase factory, TcpChannelInfo info, EndpointAddress address, Uri via) : base (factory, address, via) { is_service_side = false; this.info = info; - session = new TcpDuplexSession (this); } - public TcpDuplexSessionChannel (ChannelListenerBase listener, TcpChannelInfo info, TcpListener tcpListener, TimeSpan timeout) + public TcpDuplexSessionChannel (ChannelListenerBase listener, TcpChannelInfo info, TcpClient client) : base (listener) { is_service_side = true; - tcp_listener = tcpListener; + this.client = client; this.info = info; - session = new TcpDuplexSession (this); - this.timeout = timeout; } public MessageEncoder Encoder { @@ -101,7 +95,17 @@ namespace System.ServiceModel.Channels } public IDuplexSession Session { - get { return session; } + get { + if (session == null) + session = new TcpDuplexSession (this); + return session; + } + } + + void DiscardSession () + { + frame.ProcessEndRecordInitiator (); + session = null; } public override void Send (Message message) @@ -131,18 +135,6 @@ namespace System.ServiceModel.Channels // frame.ProcessEndRecordRecipient (); } - [MonoTODO] - public override IAsyncResult BeginTryReceive (TimeSpan timeout, AsyncCallback callback, object state) - { - throw new NotImplementedException (); - } - - [MonoTODO] - public override bool EndTryReceive (IAsyncResult result, out Message message) - { - throw new NotImplementedException (); - } - public override Message Receive () { return Receive (DefaultReceiveTimeout); @@ -159,8 +151,14 @@ namespace System.ServiceModel.Channels public override bool TryReceive (TimeSpan timeout, out Message message) { try { + DateTime start = DateTime.Now; message = Receive (timeout); - return true; + if (message != null) + return true; + // received EndRecord, so close the session and return false instead. + // (Closing channel here might not be a good idea, but right now I have no better way.) + Close (timeout - (DateTime.Now - start)); + return false; } catch (TimeoutException) { message = null; return false; @@ -186,8 +184,7 @@ namespace System.ServiceModel.Channels [MonoTODO] protected override void OnAbort () { - if (client != null) - client.Close (); + Close (TimeSpan.FromTicks (1)); } [MonoTODO] @@ -207,6 +204,10 @@ namespace System.ServiceModel.Channels [MonoTODO] protected override void OnClose (TimeSpan timeout) { + if (!is_service_side) + if (session != null) + session.Close (timeout); + if (client != null) client.Close (); } @@ -235,15 +236,18 @@ namespace System.ServiceModel.Channels frame = new TcpBinaryFrameManager (TcpBinaryFrameManager.DuplexMode, ns, is_service_side) { Encoder = this.Encoder, Via = RemoteAddress.Uri }; + frame.ProcessPreambleInitiator (); + frame.ProcessPreambleAckInitiator (); } else { // server side - client = tcp_listener.AcceptTcpClient (); Stream s = client.GetStream (); frame = new TcpBinaryFrameManager (TcpBinaryFrameManager.DuplexMode, s, is_service_side) { Encoder = this.Encoder }; // FIXME: use retrieved record properties in the request processing. + frame.ProcessPreambleRecipient (); + frame.ProcessPreambleAckRecipient (); } } @@ -383,8 +387,10 @@ namespace System.ServiceModel.Channels writer.Write (data, 0, data.Length); } - void ProcessPreambleInitiator () + public void ProcessPreambleInitiator () { + ResetWriteBuffer (); + buffer.WriteByte (VersionRecord); buffer.WriteByte (1); buffer.WriteByte (0); @@ -396,9 +402,11 @@ namespace System.ServiceModel.Channels buffer.WriteByte ((byte) EncodingRecord); buffer.WriteByte (PreambleEndRecord); buffer.Flush (); + s.Write (buffer.GetBuffer (), 0, (int) buffer.Position); + s.Flush (); } - void ProcessPreambleAckInitiator () + public void ProcessPreambleAckInitiator () { int b = s.ReadByte (); switch (b) { @@ -411,12 +419,12 @@ namespace System.ServiceModel.Channels } } - void ProcessPreambleAckRecipient () + public void ProcessPreambleAckRecipient () { s.WriteByte (PreambleAckRecord); } - void ProcessPreambleRecipient (bool allowEndRecord) + public void ProcessPreambleRecipient () { bool preambleEnd = false; while (!preambleEnd) { @@ -439,36 +447,30 @@ namespace System.ServiceModel.Channels EncodingRecord = (byte) s.ReadByte (); break; case ExtendingEncodingRecord: - throw new NotImplementedException (); + throw new NotImplementedException ("ExtendingEncodingRecord"); case UpgradeRequestRecord: - throw new NotImplementedException (); + throw new NotImplementedException ("UpgradeRequetRecord"); case UpgradeResponseRecord: - throw new NotImplementedException (); + throw new NotImplementedException ("UpgradeResponseRecord"); case PreambleEndRecord: preambleEnd = true; break; - case EndRecord: - if (allowEndRecord) - break; - goto default; default: throw new ProtocolException (String.Format ("Unexpected record type {0:X2}", b)); } } } - bool message_already_read_once; + XmlBinaryReaderSession reader_session; + int reader_session_items; public Message ReadSizedMessage () { // FIXME: implement full [MC-NMF]. - if (is_service_side) { - ProcessPreambleRecipient (message_already_read_once); - message_already_read_once = true; - ProcessPreambleAckRecipient (); - } var packetType = s.ReadByte (); + if (packetType == EndRecord) + return null; if (packetType != SizedEnvelopeRecord) throw new NotImplementedException (String.Format ("Packet type {0:X} is not implemented", packetType)); @@ -484,39 +486,39 @@ namespace System.ServiceModel.Channels // the returned buffer consists of a serialized reader // session and the binary xml body. - var session = new XmlBinaryReaderSession (); + var session = reader_session ?? new XmlBinaryReaderSession (); + reader_session = session; byte [] rsbuf = new TcpBinaryFrameManager (0, ms, is_service_side).ReadSizedChunk (); - int count = 0; using (var rms = new MemoryStream (rsbuf, 0, rsbuf.Length)) { var rbr = new BinaryReader (rms, Encoding.UTF8); while (rms.Position < rms.Length) - session.Add (count++, rbr.ReadString ()); + session.Add (reader_session_items++, rbr.ReadString ()); } var benc = Encoder as BinaryMessageEncoder; if (benc != null) benc.CurrentReaderSession = session; + // FIXME: supply maxSizeOfHeaders. Message msg = Encoder.ReadMessage (ms, 0x10000); if (benc != null) benc.CurrentReaderSession = null; - if (!is_service_side) - if (s.Read (eof_buffer, 0, 1) == 1) - if (eof_buffer [0] != EndRecord) - throw new ProtocolException (String.Format ("Expected EndRecord message, got {0:X02}", eof_buffer [0])); +// if (!is_service_side) +// if (s.Read (eof_buffer, 0, 1) == 1) +// if (eof_buffer [0] != EndRecord) +// throw new ProtocolException (String.Format ("Expected EndRecord message, got {0:X02}", eof_buffer [0])); +// return msg; } byte [] eof_buffer = new byte [1]; + MyXmlBinaryWriterSession writer_session; public void WriteSizedMessage (Message message) { ResetWriteBuffer (); - if (!is_service_side) - ProcessPreambleInitiator (); - // FIXME: implement full [MC-NMF] protocol. if (EncodingRecord != 8) @@ -525,7 +527,9 @@ namespace System.ServiceModel.Channels buffer.WriteByte (SizedEnvelopeRecord); MemoryStream ms = new MemoryStream (); - var session = new MyXmlBinaryWriterSession (); + var session = writer_session ?? new MyXmlBinaryWriterSession (); + writer_session = session; + int writer_session_count = session.List.Count; var benc = Encoder as BinaryMessageEncoder; try { if (benc != null) @@ -538,8 +542,8 @@ namespace System.ServiceModel.Channels // dictionary MemoryStream msd = new MemoryStream (); BinaryWriter dw = new BinaryWriter (msd); - foreach (var ds in session.List) - dw.Write (ds.Value); + for (int i = writer_session_count; i < session.List.Count; i++) + dw.Write (session.List [i].Value); dw.Flush (); int length = (int) (msd.Position + ms.Position); @@ -556,11 +560,10 @@ namespace System.ServiceModel.Channels s.Write (buffer.GetBuffer (), 0, (int) buffer.Position); s.Flush (); + } - // It is processed at *this* late. - if (!is_service_side) - ProcessPreambleAckInitiator (); - + public void ProcessEndRecordInitiator () + { s.WriteByte (EndRecord); // it is required s.Flush (); } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Description/ChangeLog b/mcs/class/System.ServiceModel/System.ServiceModel.Description/ChangeLog index 21df37fcdf2..8b01c8108b3 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Description/ChangeLog +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Description/ChangeLog @@ -1,3 +1,13 @@ +2009-07-02 Atsushi Enomoto + + * ContractDescriptionGenerator.cs : actually it had to fill all of + the interface methods (and implementation methods). + +2009-07-02 Atsushi Enomoto + + * ContractDescriptionGenerator.cs : do not reject derived service + contract from another service contract type. + 2009-06-10 Atsushi Enomoto * ServiceThrottlingBehavior.cs : implement Validate() (nothing to do diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Description/ContractDescriptionGenerator.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Description/ContractDescriptionGenerator.cs index e50bc8f2a78..6126ff6db24 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Description/ContractDescriptionGenerator.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Description/ContractDescriptionGenerator.cs @@ -109,8 +109,10 @@ namespace System.ServiceModel.Description } else { foreach (Type t in contracts.Keys) if (t.IsAssignableFrom(givenContractType)) { - if (sca != null) - throw new InvalidOperationException("The contract type of " + givenContractType + " is ambiguous: can be either " + exactContractType + " or " + t); + if (t.IsAssignableFrom (exactContractType)) // exact = IDerived, t = IBase + continue; + if (sca != null && (exactContractType == null || !exactContractType.IsAssignableFrom (t))) // t = IDerived, exact = IBase + throw new InvalidOperationException ("The contract type of " + givenContractType + " is ambiguous: can be either " + exactContractType + " or " + t); exactContractType = t; sca = contracts [t]; } @@ -134,10 +136,13 @@ namespace System.ServiceModel.Description cd.ProtectionLevel = sca.ProtectionLevel; // FIXME: load Behaviors - MethodInfo [] contractMethods = exactContractType.GetMethods (); + MethodInfo [] contractMethods = exactContractType.IsInterface ? GetAllMethods (exactContractType) : exactContractType.GetMethods (); MethodInfo [] serviceMethods = contractMethods; if (givenServiceType != null && exactContractType.IsInterface) { - serviceMethods = givenServiceType.GetInterfaceMap (exactContractType).TargetMethods; + var l = new List (); + foreach (Type t in GetAllInterfaceTypes (exactContractType)) + l.AddRange (givenServiceType.GetInterfaceMap (t).TargetMethods); + serviceMethods = l.ToArray (); } for (int i = 0; i < contractMethods.Length; ++i) @@ -174,6 +179,22 @@ namespace System.ServiceModel.Description return cd; } + static MethodInfo [] GetAllMethods (Type type) + { + var l = new List (); + foreach (var t in GetAllInterfaceTypes (type)) + l.AddRange (t.GetMethods ()); + return l.ToArray (); + } + + static IEnumerable GetAllInterfaceTypes (Type type) + { + yield return type; + foreach (var t in type.GetInterfaces ()) + foreach (var tt in GetAllInterfaceTypes (t)) + yield return tt; + } + static OperationDescription GetOrCreateOperation ( ContractDescription cd, MethodInfo mi, MethodInfo serviceMethod, OperationContractAttribute oca, diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChangeLog b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChangeLog index 78a3a6f4230..567f2f60a4d 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChangeLog +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChangeLog @@ -1,3 +1,47 @@ +2009-07-02 Atsushi Enomoto + + * ChannelDispatcher.cs : when service instance is provided to the + ServiceHost, do not reject Type-less state. + +2009-06-29 Atsushi Enomoto + + * ChannelDispatcher.cs : do not iterate extra channel acceptance + and hence close channels a bit more gracefully. + +2009-06-25 Atsushi Enomoto + + * ChannelDispatcher.cs : instead of discarding channels, reuse them + unless it is closed by session manager (session manager does not + work, so channels are not actually closed automatically yet). + +2009-06-25 Atsushi Enomoto + + * SessionInstanceContextProvider.cs : new instance context provider. + +2009-06-23 Atsushi Enomoto + + * DispatchRuntime.cs : do not fill InstanceContextProvider here. + * ChannelDispatcher.cs : do it here instead. + * ChannelDispatcherCollection.cs : remove TODOs. + +2009-06-23 Atsushi Enomoto + + * InputOrReplyRequestProcessor.cs : bogus initialization. + +2009-06-18 Atsushi Enomoto + + * ChannelDispatcher.cs : significant changes: + - simplified Open/Close async. + - implement OnAbort(). + - create ServiceThrottle when it is null. + - Channels are accepted as much as the throttle allows, and + process requests when accepted an input (now it holds more than + one channel). + - Support ReceiveSynchronously and use Begin/EndAcceptChannel() + for async pattern. + - Close all channels and the listener when it is closed. + - Cosmetic simplification on channel acceptor delegate creation. + 2009-06-09 Atsushi Enomoto * ChannelDispatcher.cs : avoid NRE (actually it should eliminate diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcher.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcher.cs index fab2b434569..cd759ed073f 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcher.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcher.cs @@ -4,7 +4,7 @@ // Author: // Atsushi Enomoto // -// Copyright (C) 2005 Novell, Inc. http://www.novell.com +// Copyright (C) 2005,2009 Novell, Inc. http://www.novell.com // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the @@ -58,7 +58,6 @@ namespace System.ServiceModel.Dispatcher Guid identifier = Guid.NewGuid (); ManualResetEvent async_event = new ManualResetEvent (false); - EndpointListenerAsyncResult async_result; ListenerLoopManager loop_manager; SynchronizedCollection endpoints; @@ -154,7 +153,10 @@ namespace System.ServiceModel.Dispatcher public bool ReceiveSynchronously { get { return receive_sync; } - set { receive_sync = value; } + set { + ThrowIfDisposedOrImmutable (); + receive_sync = value; + } } public bool IncludeExceptionDetailInFaults { @@ -184,18 +186,8 @@ namespace System.ServiceModel.Dispatcher public override void CloseInput () { - if (State == CommunicationState.Closed) - return; - try { - try { - listener.Close (); - } finally { - listener = null; - } - } finally { - if (async_result != null) - async_result.Complete (false); - } + if (loop_manager != null) + loop_manager.CloseInput (); } protected internal override void Detach (ServiceHostBase host) @@ -205,32 +197,33 @@ namespace System.ServiceModel.Dispatcher protected override void OnAbort () { - throw new NotImplementedException (); + if (loop_manager != null) + loop_manager.Stop (TimeSpan.FromTicks (1)); } + Action open_delegate; + Action close_delegate; + protected override IAsyncResult OnBeginClose (TimeSpan timeout, AsyncCallback callback, object state) { - async_event.Reset (); - async_result = new CloseAsyncResult ( - async_event, identifier, timeout, - callback, state); - return async_result; + if (close_delegate == null) + close_delegate = new Action (OnClose); + return close_delegate.BeginInvoke (timeout, callback, state); } protected override IAsyncResult OnBeginOpen (TimeSpan timeout, AsyncCallback callback, object state) { - async_event.Reset (); - async_result = new OpenAsyncResult ( - async_event, identifier, timeout, - callback, state); - return async_result; + if (open_delegate == null) + open_delegate = new Action (OnClose); + return open_delegate.BeginInvoke (timeout, callback, state); } protected override void OnClose (TimeSpan timeout) { - ProcessClose (timeout); + if (loop_manager != null) + loop_manager.Stop (timeout); } protected override void OnClosed () @@ -242,24 +235,12 @@ namespace System.ServiceModel.Dispatcher protected override void OnEndClose (IAsyncResult result) { - if (result == null) - throw new ArgumentNullException ("result"); - OpenAsyncResult or = result as OpenAsyncResult; - if (or == null) - throw new ArgumentException ("Pass an IAsyncResult instance that is returned from BeginOpen()."); - CloseInput (); - or.AsyncWaitHandle.WaitOne (); + close_delegate.EndInvoke (result); } - [MonoTODO ("this is not a real async method.")] protected override void OnEndOpen (IAsyncResult result) { - if (result == null) - throw new ArgumentNullException ("result"); - OpenAsyncResult or = result as OpenAsyncResult; - if (or == null) - throw new ArgumentException ("Pass an IAsyncResult instance that is returned from BeginOpen()."); - or.AsyncWaitHandle.WaitOne (); + open_delegate.EndInvoke (result); } protected override void OnOpen (TimeSpan timeout) @@ -267,7 +248,6 @@ namespace System.ServiceModel.Dispatcher if (Host == null || MessageVersion == null) throw new InvalidOperationException ("Service host is not attached to this ChannelDispatcher."); - // FIXME: hack, just to make it runnable loop_manager = new ListenerLoopManager (this, timeout); } @@ -278,28 +258,15 @@ namespace System.ServiceModel.Dispatcher protected override void OnOpened () { - ProcessOpened (); - } - - void ProcessClose (TimeSpan timeout) - { - if (loop_manager != null) - loop_manager.Stop (timeout); - CloseInput (); - } - - void ProcessOpened () - { - try { - loop_manager.Setup (); - } finally { - if (async_result != null) - async_result.Complete (false); - } + loop_manager.Setup (); } internal void StartLoop () { + // FIXME: not sure if it should be filled here. + if (ServiceThrottle == null) + ServiceThrottle = new ServiceThrottle (); + loop_manager.Start (); } @@ -322,16 +289,15 @@ namespace System.ServiceModel.Dispatcher class ListenerLoopManager { - delegate IChannel ChannelAcceptor (); - ChannelDispatcher owner; - AutoResetEvent handle; - IReplyChannel reply; - IInputChannel input; + AutoResetEvent handle = new AutoResetEvent (false); + AutoResetEvent creator_handle = new AutoResetEvent (false); + ManualResetEvent stop_handle = new ManualResetEvent (false); bool loop; Thread loop_thread; TimeSpan open_timeout; - ChannelAcceptor channel_acceptor; + Func channel_acceptor; + List channels = new List (); public ListenerLoopManager (ChannelDispatcher owner, TimeSpan openTimeout) { @@ -346,107 +312,202 @@ namespace System.ServiceModel.Dispatcher // It is tested at Open(), but strangely it is not instantiated at this point. foreach (var ed in owner.Endpoints) - if (ed.DispatchRuntime.Type == null || ed.DispatchRuntime.Type.GetConstructor (Type.EmptyTypes) == null) + if (ed.DispatchRuntime.InstanceContextProvider == null && (ed.DispatchRuntime.Type == null || ed.DispatchRuntime.Type.GetConstructor (Type.EmptyTypes) == null)) throw new InvalidOperationException ("There is no default constructor for the service Type in the DispatchRuntime"); - SetupChannel (); + SetupChannelAcceptor (); } public void Start () { + foreach (var ed in owner.Endpoints) + if (ed.DispatchRuntime.InstanceContextProvider == null) + ed.DispatchRuntime.InstanceContextProvider = new DefaultInstanceContextProvider (); + if (loop_thread == null) - loop_thread = new Thread (new ThreadStart (StartLoop)); + loop_thread = new Thread (new ThreadStart (Loop)); loop_thread.Start (); } - void SetupChannel () + Func CreateAcceptor (IChannelListener l) where TChannel : class, IChannel { - IChannelListener r = owner.Listener as IChannelListener; - if (r != null) { - channel_acceptor = delegate { return r.AcceptChannel (); }; - return; - } - IChannelListener rs = owner.Listener as IChannelListener; - if (rs != null) { - channel_acceptor = delegate { return rs.AcceptChannel (); }; - return; - } - IChannelListener i = owner.Listener as IChannelListener; - if (i != null) { - channel_acceptor = delegate { return i.AcceptChannel (); }; - return; - } - IChannelListener iss = owner.Listener as IChannelListener; - if (iss != null) { - channel_acceptor = delegate { return iss.AcceptChannel (); }; - return; - } - IChannelListener d = owner.Listener as IChannelListener; - if (d != null) { - channel_acceptor = delegate { return d.AcceptChannel (); }; - return; - } - IChannelListener ds = owner.Listener as IChannelListener; - if (ds != null) { - channel_acceptor = delegate { return ds.AcceptChannel (); }; - return; - } + IChannelListener r = l as IChannelListener; + if (r == null) + return null; + AsyncCallback callback = delegate (IAsyncResult result) { + try { + ChannelAccepted (r.EndAcceptChannel (result)); + } catch (Exception ex) { + Console.WriteLine ("Exception during finishing channel acceptance."); + Console.WriteLine (ex); + } + }; + return delegate { + try { + return r.BeginAcceptChannel (callback, null); + } catch (Exception ex) { + Console.WriteLine ("Exception during accepting channel."); + Console.WriteLine (ex); + throw; + } + }; + } - throw new InvalidOperationException (String.Format ("Unrecognized channel listener type: {0}", owner.Listener.GetType ())); + void SetupChannelAcceptor () + { + var l = owner.Listener; + channel_acceptor = + CreateAcceptor (l) ?? + CreateAcceptor (l) ?? + CreateAcceptor (l) ?? + CreateAcceptor (l) ?? + CreateAcceptor (l) ?? + CreateAcceptor (l); + if (channel_acceptor == null) + throw new InvalidOperationException (String.Format ("Unrecognized channel listener type: {0}", l.GetType ())); } public void Stop (TimeSpan timeout) { - StopLoop (); - owner.Listener.Close (); + loop = false; + creator_handle.Set (); + handle.Set (); + if (stop_handle != null) { + stop_handle.WaitOne (timeout > TimeSpan.Zero ? timeout : TimeSpan.FromTicks (1)); + stop_handle.Close (); + stop_handle = null; + } + if (owner.Listener.State != CommunicationState.Closed) + owner.Listener.Abort (); if (loop_thread != null && loop_thread.IsAlive) loop_thread.Abort (); loop_thread = null; } - void StartLoop () + public void CloseInput () + { + foreach (var ch in channels.ToArray ()) { + if (ch.State == CommunicationState.Closed) + channels.Remove (ch); // zonbie, if exists + else + ch.Close (); + } + } + + void Loop () { try { - StartLoopCore (); - } catch (ThreadAbortException) { - Thread.ResetAbort (); + LoopCore (); + } catch (Exception ex) { + // FIXME: log it + Console.WriteLine ("ChannelDispatcher caught an exception inside dispatcher loop, which is likely thrown by the channel listener {0}", owner.Listener); + Console.WriteLine (ex); + } finally { + if (stop_handle != null) + stop_handle.Set (); } } - void StartLoopCore () + void LoopCore () { loop = true; - // FIXME: It should iterate (Begin)AcceptChannel - // calls until the amount of the channels - // reach ServiceThrottle.MaxConcurrentSessions. - - // FIXME: use async WaitForBlah() method so - // that we can stop them at our own will. + // FIXME: use WaitForChannel() for (*only* for) transacted channel listeners. + // http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/3faa4a5e-8602-4dbe-a181-73b3f581835e - //FIXME: The logic here should be entirely different as follows: + //FIXME: The logic here should be somewhat different as follows: //1. Get the message //2. Get the appropriate EndPointDispatcher that can handle the message // which is done using the filters (AddressFilter, ContractFilter). //3. Let the appropriate endpoint handle the request. - IChannel ch = channel_acceptor (); - ch.Open (owner.timeouts.OpenTimeout); - reply = ch as IReplyChannel; - input = ch as IInputChannel; + while (loop) { + while (loop && channels.Count < owner.ServiceThrottle.MaxConcurrentSessions) { + channel_acceptor (); + creator_handle.WaitOne (); // released by ChannelAccepted() + creator_handle.Reset (); + } + if (!loop) + break; + handle.WaitOne (); // released by IChannel.Close() + handle.Reset (); + } + owner.Listener.Close (); + owner.CloseInput (); + } + + void ChannelAccepted (IChannel ch) + { + try { + if (ch == null) // could happen when it was aborted + return; + if (!loop) { + var dis = ch as IDisposable; + if (dis != null) + dis.Dispose (); + return; + } + + channels.Add (ch); + ch.Opened += delegate { + ch.Faulted += delegate { + if (channels.Contains (ch)) + channels.Remove (ch); + handle.Set (); // release loop wait lock. + }; + ch.Closed += delegate { + if (channels.Contains (ch)) + channels.Remove (ch); + handle.Set (); // release loop wait lock. + }; + }; + } finally { + creator_handle.Set (); + } + + ch.Open (); + ProcessRequestOrInput (ch); + } + + void ProcessRequestOrInput (IChannel ch) + { + var reply = ch as IReplyChannel; + var input = ch as IInputChannel; if (reply != null) { - while (loop) { - if (reply.WaitForRequest (owner.timeouts.ReceiveTimeout)) - ProcessRequest (); + if (owner.ReceiveSynchronously) { + RequestContext rc; + if (reply.TryReceiveRequest (owner.timeouts.ReceiveTimeout, out rc)) + ProcessRequest (reply, rc); + } else { + reply.BeginTryReceiveRequest (owner.timeouts.ReceiveTimeout, TryReceiveRequestDone, reply); } } else if (input != null) { - while (loop) { - if (input.WaitForMessage (owner.timeouts.ReceiveTimeout)) - ProcessInput (); + if (owner.ReceiveSynchronously) { + Message msg; + if (input.TryReceive (owner.timeouts.ReceiveTimeout, out msg)) + ProcessInput (input, msg); + } else { + input.BeginTryReceive (owner.timeouts.ReceiveTimeout, TryReceiveDone, input); } } } + void TryReceiveRequestDone (IAsyncResult result) + { + RequestContext rc; + var reply = (IReplyChannel) result.AsyncState; + if (reply.EndTryReceiveRequest (result, out rc)) + ProcessRequest (reply, rc); + } + + void TryReceiveDone (IAsyncResult result) + { + Message msg; + var input = (IInputChannel) result.AsyncState; + if (input.EndTryReceive (result, out msg)) + ProcessInput (input, msg); + } + void SendEndpointNotFound (RequestContext rc, EndpointNotFoundException ex) { try { @@ -459,14 +520,9 @@ namespace System.ServiceModel.Dispatcher catch (Exception e) { } } - void ProcessRequest () + void ProcessRequest (IReplyChannel reply, RequestContext rc) { - RequestContext rc = null; try { - rc = reply.ReceiveRequest (owner.timeouts.ReceiveTimeout); - if (rc == null) - throw new InvalidOperationException ("The reply channel didn't return RequestContext"); - EndpointDispatcher candidate = FindEndpointDispatcher (rc.RequestMessage); new InputOrReplyRequestProcessor (candidate.DispatchRuntime, reply). ProcessReply (rc); @@ -475,21 +531,28 @@ namespace System.ServiceModel.Dispatcher } catch (Exception ex) { // FIXME: log it. Console.WriteLine (ex); + } finally { + // unless it is closed by session/call manager, move it back to the loop to receive the next message. + if (reply.State != CommunicationState.Closed) + ProcessRequestOrInput (reply); } } - void ProcessInput () + void ProcessInput (IInputChannel input, Message message) { try { - Message message = input.Receive (); EndpointDispatcher candidate = null; candidate = FindEndpointDispatcher (message); new InputOrReplyRequestProcessor (candidate.DispatchRuntime, input). - ProcessInput(message); + ProcessInput (message); } catch (Exception ex) { // FIXME: log it. Console.WriteLine (ex); + } finally { + // unless it is closed by session/call manager, move it back to the loop to receive the next message. + if (input.State != CommunicationState.Closed) + ProcessRequestOrInput (input); } } @@ -505,87 +568,6 @@ namespace System.ServiceModel.Dispatcher throw new EndpointNotFoundException (String.Format ("The request message has the target '{0}' which is not reachable in this service contract", message.Headers.To)); return candidate; } - - void StopLoop () - { - loop = false; - // FIXME: send manual stop for reply or input channel. - } - } - - #region AsyncResult classes - - class CloseAsyncResult : EndpointListenerAsyncResult - { - public CloseAsyncResult (ManualResetEvent asyncEvent, - Guid identifier, TimeSpan timeout, - AsyncCallback callback, object state) - : base (asyncEvent, identifier, timeout, - callback, state) - { - } - } - - class OpenAsyncResult : EndpointListenerAsyncResult - { - public OpenAsyncResult (ManualResetEvent asyncEvent, - Guid identifier, TimeSpan timeout, - AsyncCallback callback, object state) - : base (asyncEvent, identifier, timeout, - callback, state) - { - } - } - - abstract class EndpointListenerAsyncResult : IAsyncResult - { - ManualResetEvent async_event; - Guid identifier; - TimeSpan timeout; - AsyncCallback callback; - object state; - bool completed, completed_async; - - public EndpointListenerAsyncResult ( - ManualResetEvent asyncEvent, - Guid identifier, TimeSpan timeout, - AsyncCallback callback, object state) - { - async_event = asyncEvent; - this.identifier = identifier; - this.timeout = timeout; - this.callback = callback; - this.state = state; - } - - public WaitHandle AsyncWaitHandle { - get { return async_event; } - } - - public bool IsCompleted { - get { return completed; } - } - - public TimeSpan Timeout { - get { return timeout; } - } - - public void Complete (bool async) - { - completed_async = async; - if (callback != null) - callback (this); - async_event.Set (); - } - - public object AsyncState { - get { return state; } - } - - public bool CompletedSynchronously { - get { return completed_async; } - } } - #endregion } } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcherCollection.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcherCollection.cs index 1a0461b4af7..006beac37a8 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcherCollection.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/ChannelDispatcherCollection.cs @@ -47,7 +47,6 @@ namespace System.ServiceModel.Dispatcher { } - [MonoTODO ("What to do here?")] protected override void ClearItems () { ChannelDispatcherBase[] channels = this.InnerList.ToArray (); @@ -60,14 +59,12 @@ namespace System.ServiceModel.Dispatcher get { return Items; } } - [MonoTODO ("What to do here?")] protected override void InsertItem (int index, ChannelDispatcherBase item) { item.Attach (_service); base.InsertItem (index, item); } - [MonoTODO ("What to do here?")] protected override void RemoveItem (int index) { ChannelDispatcherBase removed = this [index]; @@ -76,7 +73,6 @@ namespace System.ServiceModel.Dispatcher } - [MonoTODO ("What to do here?")] protected override void SetItem (int index, ChannelDispatcherBase item) { item.Attach (_service); diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/DispatchRuntime.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/DispatchRuntime.cs index d0ed0dc1d61..ed338b86d7e 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/DispatchRuntime.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/DispatchRuntime.cs @@ -84,8 +84,6 @@ namespace System.ServiceModel.Dispatcher callback_client_runtime = new ClientRuntime (this); unhandled_dispatch_oper = new DispatchOperation ( this, "*", "*", "*"); - // FIXME: this should be null by default. - instance_context_provider = new DefaultInstanceContextProvider (); } public AuditLogLocation SecurityAuditLogLocation { diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/InputOrReplyRequestProcessor.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/InputOrReplyRequestProcessor.cs index d4085f3f03c..f97a2acb40c 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/InputOrReplyRequestProcessor.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/InputOrReplyRequestProcessor.cs @@ -15,7 +15,7 @@ namespace System.ServiceModel.Dispatcher public InputOrReplyRequestProcessor (DispatchRuntime runtime, IChannel replyOrInput) { - Init (runtime, reply_or_input); + Init (runtime, replyOrInput); //initialization InitializeChain.AddHandler (new InitializingHandler ()); diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/SessionInstanceContextProvider.cs b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/SessionInstanceContextProvider.cs new file mode 100644 index 00000000000..c5c64bb293c --- /dev/null +++ b/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/SessionInstanceContextProvider.cs @@ -0,0 +1,71 @@ +// +// SessionInstanceContextProvider.cs +// +// Author: +// Atsushi Enomoto +// +// Copyright (C) 2009 Novell, Inc. http://www.novell.com +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +using System; +using System.Collections.Generic; +using System.ServiceModel; +using System.ServiceModel.Channels; +using System.Xml; + +namespace System.ServiceModel.Dispatcher +{ + internal class SessionInstanceContextProvider : IInstanceContextProvider + { + ServiceHostBase host; + Dictionary pool = new Dictionary (); + + public SessionInstanceContextProvider (ServiceHostBase host) + { + this.host = host; + } + + public InstanceContext GetExistingInstanceContext (Message message, IContextChannel channel) + { + InstanceContext ctx; + var key = message.Headers.RelatesTo; + return key != null && pool.TryGetValue (key, out ctx) ? ctx : null; + } + + public void InitializeInstanceContext (InstanceContext instanceContext, Message message, IContextChannel channel) + { + var key = message.Headers.MessageId; + if (key != null) + pool [key] = instanceContext; + } + + public bool IsIdle (InstanceContext instanceContext) + { + // FIXME: implement + return false; + } + + public void NotifyIdle (InstanceContextIdleCallback callback, InstanceContext instanceContext) + { + // FIXME: implement + } + } +} diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/ChangeLog b/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/ChangeLog index e7f12bda331..97154ea2539 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/ChangeLog +++ b/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/ChangeLog @@ -1,3 +1,15 @@ +2009-07-09 Atsushi Enomoto + + * LocalPeerResolverService.cs : fix RegistrationLifetime to return. + +2009-07-07 Atsushi Enomoto + + * CustomPeerResolverService.cs, LocalPeerResolverService.cs, + ICustomPeerResolverContract.cs : add local machine peer resolver + implementation that can work across appdomains (based on + dispatching peer resolver that communicates with a ServiceHost + which is either locally started or running as a different process). + 2009-06-01 Atsushi Enomoto * CustomPeerResolverService.cs : Refresh() now gives readable reply. diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/CustomPeerResolverService.cs b/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/CustomPeerResolverService.cs index ce9e772d784..a1856d1bc88 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/CustomPeerResolverService.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/CustomPeerResolverService.cs @@ -30,12 +30,15 @@ // using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Net.Sockets; using System.Transactions; using System.Timers; namespace System.ServiceModel.PeerResolvers { +#if false [MonoTODO ("Implement cleanup and refresh")] // FIXME: TransactionTimeout must be null by-default. [ServiceBehavior (AutomaticSessionShutdown = true, ConcurrencyMode = ConcurrencyMode.Multiple, @@ -228,4 +231,181 @@ namespace System.ServiceModel.PeerResolvers public Guid RegistrationId { get; set; } public PeerNodeAddress NodeAddress { get; set; } } + +#else + [MonoTODO ("Implement cleanup and refresh")] + // FIXME: TransactionTimeout must be null by-default. + [ServiceBehavior (AutomaticSessionShutdown = true, ConcurrencyMode = ConcurrencyMode.Multiple, + InstanceContextMode = InstanceContextMode.Single, ReleaseServiceInstanceOnTransactionComplete = true, + TransactionIsolationLevel = IsolationLevel.Unspecified, /*TransactionTimeout = null, */ + UseSynchronizationContext = false, ValidateMustUnderstand = true)] + public class CustomPeerResolverService : IPeerResolverContract + { + static ServiceHost localhost; + + static void SetupCustomPeerResolverServiceHost () + { + // launch peer resolver service locally only when it does not seem to be running ... + var t = new TcpListener (8931); + try { + t.Start (); + t.Stop (); + } catch { + return; + } + Console.WriteLine ("WARNING: it is running peer resolver service locally. This means, the node registration is valid only within this application domain..."); + var host = new ServiceHost (new LocalPeerResolverService (TextWriter.Null)); + host.Description.Behaviors.Find ().InstanceContextMode = InstanceContextMode.Single; + host.AddServiceEndpoint (typeof (ICustomPeerResolverContract), new BasicHttpBinding (), "http://localhost:8931"); + localhost = host; + host.Open (); + } + + ICustomPeerResolverClient client; + bool control_shape, opened; + TimeSpan refresh_interval, cleanup_interval; + + public CustomPeerResolverService () + { + client = ChannelFactory.CreateChannel (new BasicHttpBinding (), new EndpointAddress ("http://localhost:8931")); + + refresh_interval = new TimeSpan (0, 10, 0); + cleanup_interval = new TimeSpan (0, 1, 0); + } + + public TimeSpan CleanupInterval { + get { return cleanup_interval; } + set { + if ((value < TimeSpan.Zero) || (value > TimeSpan.MaxValue)) + throw new ArgumentOutOfRangeException ( + "The interval is either zero or greater than max value."); + if (opened) + throw new InvalidOperationException ("The interval must be set before it is opened"); + + cleanup_interval = value; + } + } + + public bool ControlShape { + get { return control_shape; } + set { + if (opened) + throw new InvalidOperationException ("The interval must be set before it is opened"); + control_shape = value; + } + } + + public TimeSpan RefreshInterval { + get { return refresh_interval; } + set { + if ((value < TimeSpan.Zero) || (value > TimeSpan.MaxValue)) + throw new ArgumentOutOfRangeException ( + "The interval is either zero or greater than max value."); + if (opened) + throw new InvalidOperationException ("The interval must be set before it is opened"); + + refresh_interval = value; + } + } + + [MonoTODO ("Do we have to unregister nodes here?")] + public virtual void Close () + { + if (! opened) + throw new InvalidOperationException ("The service has never been opened or it was closed by a previous call to this method."); + client.Close (); + opened = false; + + if (localhost != null) { + localhost.Close (); + localhost = null; + } + } + + public virtual ServiceSettingsResponseInfo GetServiceSettings () + { + if (! opened) + throw new InvalidOperationException ("The service has never been opened or it was closed previously."); + + return client.GetServiceSettings (); + } + + public virtual void Open () + { + if (localhost == null) + SetupCustomPeerResolverServiceHost (); + + if ((CleanupInterval == TimeSpan.Zero) || (RefreshInterval == TimeSpan.Zero)) + throw new ArgumentException ("Cleanup interval or refresh interval are set to a time span interval of zero."); + + if (opened) + throw new InvalidOperationException ("The service has been started by a previous call to this method."); + + opened = true; + + client.Open (); + client.SetCustomServiceSettings (new PeerServiceSettingsInfo () { ControlMeshShape = control_shape, RefreshInterval = refresh_interval, CleanupInterval = cleanup_interval }); + } + + public virtual RefreshResponseInfo Refresh (RefreshInfo refreshInfo) + { + if (refreshInfo == null) + throw new ArgumentException ("Refresh info cannot be null."); + + if (! opened) + throw new InvalidOperationException ("The service has never been opened or it was closed previously."); + + return client.Refresh (refreshInfo); + } + + public virtual RegisterResponseInfo Register (RegisterInfo registerInfo) + { + if (registerInfo == null) + throw new ArgumentException ("Register info cannot be null."); + + if (! opened) + throw new InvalidOperationException ("The service has never been opened or it was closed previously."); + + return client.Register (registerInfo); + } + + public virtual RegisterResponseInfo Register (Guid clientId, string meshId, PeerNodeAddress address) + { + return Register (new RegisterInfo (clientId, meshId, address)); + } + + public virtual ResolveResponseInfo Resolve (ResolveInfo resolveInfo) + { + if (resolveInfo == null) + throw new ArgumentException ("Resolve info cannot be null."); + + if (! opened) + throw new InvalidOperationException ("The service has never been opened or it was closed previously."); + + return client.Resolve (resolveInfo); + } + + public virtual void Unregister (UnregisterInfo unregisterInfo) + { + if (unregisterInfo == null) + throw new ArgumentException ("Unregister info cannot be null."); + + if (! opened) + throw new InvalidOperationException ("The service has never been opened or it was closed previously."); + + client.Unregister (unregisterInfo); + } + + public virtual RegisterResponseInfo Update (UpdateInfo updateInfo) + { + if (updateInfo == null) + throw new ArgumentException ("Update info cannot be null."); + + if (! opened) + throw new InvalidOperationException ("The service has never been opened or it was closed previously."); + + return client.Update (updateInfo); + } + } +#endif } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/ICustomPeerResolverContract.cs b/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/ICustomPeerResolverContract.cs new file mode 100755 index 00000000000..c3b7c270a27 --- /dev/null +++ b/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/ICustomPeerResolverContract.cs @@ -0,0 +1,32 @@ +using System; +using System.Runtime.Serialization; +using System.ServiceModel; +using System.ServiceModel.PeerResolvers; +using System.ServiceModel.Description; + +namespace System.ServiceModel.PeerResolvers +{ + [DataContract (Namespace = "http://mono-project.com/ns/2008/07/peer-resolver")] + class PeerServiceSettingsInfo + { + [DataMember] + public TimeSpan RefreshInterval { get; set; } + [DataMember] + public TimeSpan CleanupInterval { get; set; } + [DataMember] + public bool ControlMeshShape { get; set; } + } + + [ServiceContract] + interface ICustomPeerResolverContract : IPeerResolverContract + { + [OperationContract] + PeerServiceSettingsInfo GetCustomServiceSettings (); + [OperationContract] + void SetCustomServiceSettings (PeerServiceSettingsInfo info); + } + + interface ICustomPeerResolverClient : ICustomPeerResolverContract, IClientChannel + { + } +} diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/LocalPeerResolverService.cs b/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/LocalPeerResolverService.cs new file mode 100755 index 00000000000..3a5134a6be8 --- /dev/null +++ b/mcs/class/System.ServiceModel/System.ServiceModel.PeerResolvers/LocalPeerResolverService.cs @@ -0,0 +1,212 @@ +// +// LocalPeerResolverService.cs +// +// Author: +// Atsushi Enomoto +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +#if true +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.Serialization; +using System.ServiceModel; +using System.ServiceModel.PeerResolvers; + +namespace System.ServiceModel.PeerResolvers +{ + // This implementation of peer resolver should open up node + // registration to some extent, say, valid within the same machine. + // + // A correct implementation should be using something like zeroconf + // to register the local machine as a peer node. + + class LocalPeerResolverService : ICustomPeerResolverContract + { + public LocalPeerResolverService (TextWriter log) + { + this.log = log ?? TextWriter.Null; + } + + TextWriter log; + Dictionary mesh_map = new Dictionary (); + + // CustomPeerResolverService delegation + + // Open(), Close(), ControlShape, RefreshInterval, CleanupInterval + + public bool ControlShape { get; set; } + public TimeSpan RefreshInterval { get; set; } + public TimeSpan CleanupInterval { get; set; } + + // (internal) ICustomPeerResolverContract implementation + + public PeerServiceSettingsInfo GetCustomServiceSettings () + { + log.WriteLine ("REQUEST: GetCustomServiceSettings"); + return new PeerServiceSettingsInfo () { + ControlMeshShape = this.ControlShape, + RefreshInterval = this.RefreshInterval, + CleanupInterval = this.CleanupInterval }; + } + + public void SetCustomServiceSettings (PeerServiceSettingsInfo info) + { + log.WriteLine ("REQUEST: SetCustomServiceSettings(ControlMeshShape:{0}, RefreshInterval:{1}, CleanupInterval:{2}", info.ControlMeshShape, info.RefreshInterval, info.CleanupInterval); + ControlShape = info.ControlMeshShape; + RefreshInterval = info.RefreshInterval; + CleanupInterval = info.CleanupInterval; + } + + // IPeerResolverContract implementation + + public ServiceSettingsResponseInfo GetServiceSettings () + { + return new ServiceSettingsResponseInfo () { ControlMeshShape = this.ControlShape }; + } + + public RefreshResponseInfo Refresh (RefreshInfo refreshInfo) + { + var r = refreshInfo; + log.WriteLine ("REQUEST: Refresh (Mesh: {0}, Registraion: {1})", r.MeshId, r.RegistrationId); + var mesh = GetExistingMesh (r.MeshId); + var node = mesh.FirstOrDefault (n => n.RegistrationId == r.RegistrationId); + if (node == null) + return new RefreshResponseInfo () { Result = RefreshResult.RegistrationNotFound }; + node.Refresh (); + return new RefreshResponseInfo () { Result = RefreshResult.Success, RegistrationLifetime = RefreshInterval - (DateTime.Now - node.LastRefreshTime) }; + } + + public RegisterResponseInfo Register (RegisterInfo registerInfo) + { + var r = registerInfo; + log.WriteLine ("REQUEST: Register (Mesh: {0}, Client: {1}, NodeAddress: endpoint {2})", r.MeshId, r.ClientId, r.NodeAddress.EndpointAddress); + Mesh mesh; + if (!mesh_map.TryGetValue (r.MeshId, out mesh)) { + mesh = new Mesh (r.MeshId); + mesh_map.Add (r.MeshId, mesh); + } + var node = RegisterNode (mesh, r.ClientId, r.NodeAddress); + return new RegisterResponseInfo () { RegistrationId = node.RegistrationId }; + } + + public ResolveResponseInfo Resolve (ResolveInfo resolveInfo) + { + var r = resolveInfo; + log.WriteLine ("REQUEST: Resolve (Mesh: {0}, Client: {1}, MaxAddresses: {2})", r.MeshId, r.ClientId, r.MaxAddresses); + Mesh mesh; + var rr = new ResolveResponseInfo (); + if (!mesh_map.TryGetValue (r.MeshId, out mesh)) + return rr; + foreach (var node in mesh.TakeWhile (n => n.ClientId == r.ClientId)) { + rr.Addresses.Add (node.Address); + if (rr.Addresses.Count == r.MaxAddresses) + break; + } + return rr; + } + + public void Unregister (UnregisterInfo unregisterInfo) + { + var u = unregisterInfo; + log.WriteLine ("REQUEST: Unregister (Mesh: {0}, Registration: {1})", u.MeshId, u.RegistrationId); + Mesh mesh = GetExistingMesh (u.MeshId); + lock (mesh) { + var node = mesh.GetRegisteredNode (u.RegistrationId); + mesh.Remove (node); + } + } + + public RegisterResponseInfo Update (UpdateInfo updateInfo) + { + var u = updateInfo; + log.WriteLine ("REQUEST: Update (Mesh: {0}, Registration: {1}, NodeAddress:)", u.MeshId, u.RegistrationId, u.NodeAddress); + var mesh = GetExistingMesh (u.MeshId); + var node = mesh.GetRegisteredNode (u.RegistrationId); + node.Update (u.NodeAddress); + return new RegisterResponseInfo () { RegistrationId = node.RegistrationId }; + } + + Mesh GetExistingMesh (string meshId) + { + Mesh mesh; + if (!mesh_map.TryGetValue (meshId, out mesh)) + throw new InvalidOperationException (String.Format ("Specified mesh {0} does not exist", meshId)); + return mesh; + } + + Node RegisterNode (Mesh mesh, Guid clientId, PeerNodeAddress addr) + { + lock (mesh) { + var node = new Node () { ClientId = clientId, Address = addr }; + mesh.Add (node); + node.LastRefreshTime = DateTime.Now; + return node; + } + } + } + + class Mesh : List + { + public Mesh (string id) + { + Id = id; + } + + public string Id { get; private set; } + + public Node GetRegisteredNode (Guid registrationId) + { + var node = this.FirstOrDefault (n => n.RegistrationId == registrationId); + if (node == null) + throw new InvalidOperationException (String.Format ("Node with registration Id {0} does not exist in the specified mesh {0}", registrationId, Id)); + return node; + } + } + + class Node + { + public Node () + { + RegistrationId = Guid.NewGuid (); + } + + public Guid RegistrationId { get; private set; } + public Guid ClientId { get; set; } + public PeerNodeAddress Address { get; set; } + public DateTime LastRefreshTime { get; set; } + + public void Refresh () + { + LastRefreshTime = DateTime.Now; + } + + public void Update (PeerNodeAddress addr) + { + Address = addr; + LastRefreshTime = DateTime.Now; + } + } +} +#endif diff --git a/mcs/class/System.ServiceModel/System.ServiceModel.dll.sources b/mcs/class/System.ServiceModel/System.ServiceModel.dll.sources index 50001d20721..2a41e2c0cc8 100755 --- a/mcs/class/System.ServiceModel/System.ServiceModel.dll.sources +++ b/mcs/class/System.ServiceModel/System.ServiceModel.dll.sources @@ -658,6 +658,7 @@ System.ServiceModel.Dispatcher/ReplyHandler.cs System.ServiceModel.Dispatcher/SecurityHandler.cs System.ServiceModel.Dispatcher/SeekableXPathNavigator.cs System.ServiceModel.Dispatcher/ServiceThrottle.cs +System.ServiceModel.Dispatcher/SessionInstanceContextProvider.cs System.ServiceModel.Dispatcher/SingletonInstanceContextProvider.cs System.ServiceModel.Dispatcher/XPathMessageContext.cs System.ServiceModel.Dispatcher/XPathMessageFilter.cs @@ -670,7 +671,9 @@ System.ServiceModel.MsmqIntegration/MsmqIntegrationMessageProperty.cs System.ServiceModel.MsmqIntegration/MsmqIntegrationSecurity.cs System.ServiceModel.MsmqIntegration/MsmqMessage.cs System.ServiceModel.PeerResolvers/CustomPeerResolverService.cs +System.ServiceModel.PeerResolvers/ICustomPeerResolverContract.cs System.ServiceModel.PeerResolvers/IPeerResolverContract.cs +System.ServiceModel.PeerResolvers/LocalPeerResolverService.cs System.ServiceModel.PeerResolvers/PeerCustomResolverSettings.cs System.ServiceModel.PeerResolvers/PeerReferralPolicy.cs System.ServiceModel.PeerResolvers/PeerResolverMode.cs diff --git a/mcs/class/System.ServiceModel/System.ServiceModel/ChangeLog b/mcs/class/System.ServiceModel/System.ServiceModel/ChangeLog index 028aa0fe0ac..b33e73a348b 100755 --- a/mcs/class/System.ServiceModel/System.ServiceModel/ChangeLog +++ b/mcs/class/System.ServiceModel/System.ServiceModel/ChangeLog @@ -1,3 +1,60 @@ +2009-07-10 Atsushi Enomoto + + * DuplexClientBase.cs : oops, fix build. + +2009-07-10 Atsushi Enomoto + + * DuplexClientBase.cs : add missing members here too. + +2009-07-10 Atsushi Enomoto + + * ClientBase.cs : some of Silverlight API are backported to full CLR. + +2009-07-10 Atsushi Enomoto + + * DuplexChannelFactory.cs : fill missing members. + +2009-07-10 Atsushi Enomoto + + * PeerNode.cs : significant refactoring. It does not call resolver + to manage the node itself but rather hold its state. + +2009-07-09 Atsushi Enomoto + + * PeerNode.cs : some implementation cleanup before significant + refactoring. Mesh state is not maintained here. Use optionally + fixed listener address and port. Set offline status when closed. + +2009-07-08 Atsushi Enomoto + + * NetPeerTcpBinding.cs : Fix interface implementations. + +2009-07-02 Atsushi Enomoto + + * ServiceBehaviorAttribute.cs : fill SingletonInstanceContext on + opening the host. + +2009-06-25 Atsushi Enomoto + + * InstanceContext.cs : add missing member / cosmetic API fix. + * ServiceBehaviorAttribute.cs : InstanceContextMode is per-session + by default. + +2009-06-23 Atsushi Enomoto + + * ServiceHostBase.cs : remove more TODO. + +2009-06-23 Atsushi Enomoto + + * OperationContext.cs : implement SessionId. + * ServiceHostBase.cs : implement open/close async methods. + remove some TODOs. + +2009-06-23 Atsushi Enomoto + + * ServiceRuntimeChannel.cs : remove some NIEs for actual use. + Dispose->Close. + 2009-06-12 Atsushi Enomoto * ChannelFactory.cs : no need for NIE at OnAbort() (at least so far). diff --git a/mcs/class/System.ServiceModel/System.ServiceModel/ClientBase.cs b/mcs/class/System.ServiceModel/System.ServiceModel/ClientBase.cs index 3f053741f66..1d01ad0e8be 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel/ClientBase.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel/ClientBase.cs @@ -214,7 +214,6 @@ namespace System.ServiceModel InnerChannel.DisplayInitializationUI (); } -#if NET_2_1 protected T GetDefaultValueForInitialization () { return default (T); @@ -224,6 +223,9 @@ namespace System.ServiceModel void RunCompletedCallback (SendOrPostCallback callback, InvokeAsyncCompletedEventArgs args) { +#if !NET_2_1 + callback (args); +#else object dispatcher = dispatcher_main_property.GetValue (null, null); if (dispatcher == null) { callback (args); @@ -239,6 +241,7 @@ namespace System.ServiceModel } }; dispatcher_begin_invoke_method.Invoke (dispatcher, new object [] {a, new object [] {this, new EventArgs ()}}); +#endif } protected void InvokeAsync (BeginOperationDelegate beginOperationDelegate, @@ -273,7 +276,8 @@ namespace System.ServiceModel begin_async_result = beginOperationDelegate (inValues, cb, userState); } IAsyncResult begin_async_result; -#else + +#if !NET_2_1 void IDisposable.Dispose () { Close (); @@ -358,12 +362,7 @@ namespace System.ServiceModel #endregion -#if NET_2_1 - protected -#else - internal -#endif - class InvokeAsyncCompletedEventArgs : AsyncCompletedEventArgs + protected class InvokeAsyncCompletedEventArgs : AsyncCompletedEventArgs { internal InvokeAsyncCompletedEventArgs (object [] results, Exception error, bool cancelled, object userState) : base (error, cancelled, userState) diff --git a/mcs/class/System.ServiceModel/System.ServiceModel/DuplexChannelFactory.cs b/mcs/class/System.ServiceModel/System.ServiceModel/DuplexChannelFactory.cs index 59607f829a4..93db8b632df 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel/DuplexChannelFactory.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel/DuplexChannelFactory.cs @@ -39,7 +39,59 @@ namespace System.ServiceModel public class DuplexChannelFactory : ChannelFactory { InstanceContext callback_instance; - + Type callback_instance_type; + + public DuplexChannelFactory (Type callbackInstanceType) + : base () + { + callback_instance_type = callbackInstanceType; + } + + public DuplexChannelFactory (Type callbackInstanceType, + string endpointConfigurationName) + : base (endpointConfigurationName) + { + callback_instance_type = callbackInstanceType; + } + + public DuplexChannelFactory (Type callbackInstanceType, + string endpointConfigurationName, + EndpointAddress remoteAddress) + : base (endpointConfigurationName, remoteAddress) + { + callback_instance_type = callbackInstanceType; + } + + public DuplexChannelFactory (Type callbackInstanceType, + ServiceEndpoint endpoint) + : base (endpoint) + { + callback_instance_type = callbackInstanceType; + } + + public DuplexChannelFactory (Type callbackInstanceType, + Binding binding) + : base (binding) + { + callback_instance_type = callbackInstanceType; + } + + public DuplexChannelFactory (Type callbackInstanceType, + Binding binding, + string remoteAddress) + : base (binding, new EndpointAddress (remoteAddress)) + { + callback_instance_type = callbackInstanceType; + } + + public DuplexChannelFactory (Type callbackInstanceType, + Binding binding, + EndpointAddress remoteAddress) + : base (binding, remoteAddress) + { + callback_instance_type = callbackInstanceType; + } + public DuplexChannelFactory (object callbackInstance) : this (new InstanceContext (callbackInstance)) { @@ -70,6 +122,13 @@ namespace System.ServiceModel { } + public DuplexChannelFactory (object callbackInstance, + Binding binding, + string remoteAddress) + : this (callbackInstance, binding, new EndpointAddress (remoteAddress)) + { + } + public DuplexChannelFactory (object callbackInstance, Binding binding, EndpointAddress remoteAddress) @@ -77,6 +136,12 @@ namespace System.ServiceModel { } + public DuplexChannelFactory (InstanceContext callbackInstance) + : base () + { + callback_instance = callbackInstance; + } + public DuplexChannelFactory (InstanceContext callbackInstance, Binding binding) : base (binding) @@ -84,6 +149,13 @@ namespace System.ServiceModel callback_instance = callbackInstance; } + public DuplexChannelFactory (InstanceContext callbackInstance, + Binding binding, + string remoteAddress) + : this (callbackInstance, binding, new EndpointAddress (remoteAddress)) + { + } + public DuplexChannelFactory (InstanceContext callbackInstance, Binding binding, EndpointAddress remoteAddress) @@ -113,12 +185,61 @@ namespace System.ServiceModel { callback_instance = callbackInstance; } - - public static TChannel CreateChannel (InstanceContext callbackInstance, - Binding binding, - EndpointAddress endpointAddress) + + // CreateChannel() instance methods + + public TChannel CreateChannel (InstanceContext callbackInstance) + { + return CreateChannel (callbackInstance, Endpoint.Address, null); + } + + public override TChannel CreateChannel (EndpointAddress address, Uri via) + { + return CreateChannel (callback_instance, address, via); + } + + public TChannel CreateChannel (InstanceContext callbackInstance, EndpointAddress address) + { + return CreateChannel (callbackInstance, address, null); + } + + public virtual TChannel CreateChannel (InstanceContext callbackInstance, EndpointAddress address, Uri via) + { + // FIXME: supply callbackInstance + return base.CreateChannel (address, via); + } + + // CreateChannel() factory methods + + public static TChannel CreateChannel (object callbackObject, string endpointConfigurationName) + { + return CreateChannel (new InstanceContext (callbackObject), endpointConfigurationName); + } + + public static TChannel CreateChannel (InstanceContext callbackInstance, string endpointConfigurationName) + { + return new DuplexChannelFactory (callbackInstance, endpointConfigurationName).CreateChannel (callbackInstance); + } + + public static TChannel CreateChannel (object callbackObject, Binding binding, EndpointAddress endpointAddress) + { + return CreateChannel (new InstanceContext (callbackObject), binding, endpointAddress); + } + + public static TChannel CreateChannel (InstanceContext callbackInstance, Binding binding, EndpointAddress endpointAddress) + { + return new DuplexChannelFactory (callbackInstance, binding, endpointAddress).CreateChannel (callbackInstance); + } + + public static TChannel CreateChannel (object callbackObject, Binding binding, EndpointAddress endpointAddress, Uri via) { - return new DuplexChannelFactory (callbackInstance, binding, endpointAddress).CreateChannel (); + return CreateChannel (new InstanceContext (callbackObject), binding, endpointAddress, via); } + + public static TChannel CreateChannel (InstanceContext callbackInstance, Binding binding, EndpointAddress endpointAddress, Uri via) + { + return new DuplexChannelFactory (callbackInstance, binding, endpointAddress).CreateChannel (callbackInstance, endpointAddress, via); + } + } } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel/DuplexClientBase.cs b/mcs/class/System.ServiceModel/System.ServiceModel/DuplexClientBase.cs index fa400917593..649bb771a4c 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel/DuplexClientBase.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel/DuplexClientBase.cs @@ -4,7 +4,7 @@ // Author: // Atsushi Enomoto // -// Copyright (C) 2005 Novell, Inc. http://www.novell.com +// Copyright (C) 2005,2009 Novell, Inc. http://www.novell.com // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the @@ -33,29 +33,58 @@ namespace System.ServiceModel { public class DuplexClientBase : ClientBase where TChannel : class { + protected DuplexClientBase (object instance) + : this (new InstanceContext (instance), (Binding) null, null) + { + } + + protected DuplexClientBase (object instance, + Binding binding, EndpointAddress address) + : this (new InstanceContext (instance), binding, address) + { + } + + protected DuplexClientBase (object instance, + string configurationName) + : this (new InstanceContext (instance), configurationName) + { + } + + protected DuplexClientBase (object instance, + string bindingConfigurationName, EndpointAddress address) + : this (new InstanceContext (instance), bindingConfigurationName, address) + { + } + protected DuplexClientBase (InstanceContext instance) - : this (instance, (Binding) null, null) + : base () { + this.instance = instance; } protected DuplexClientBase (InstanceContext instance, Binding binding, EndpointAddress address) + : base (binding, address) { - throw new NotImplementedException (); + this.instance = instance; } protected DuplexClientBase (InstanceContext instance, string configurationName) + : base (configurationName) { - throw new NotImplementedException (); + this.instance = instance; } protected DuplexClientBase (InstanceContext instance, string configurationName, EndpointAddress address) + : base (configurationName, address) { - throw new NotImplementedException (); + this.instance = instance; } + InstanceContext instance; + public IDuplexContextChannel InnerDuplexChannel { get { throw new NotImplementedException (); } } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel/InstanceContext.cs b/mcs/class/System.ServiceModel/System.ServiceModel/InstanceContext.cs index f04de622abc..2768a2178cc 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel/InstanceContext.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel/InstanceContext.cs @@ -130,7 +130,7 @@ namespace System.ServiceModel return implementation; } - public void IncrementManualFlowControlLimit (int incrementBy) + public int IncrementManualFlowControlLimit (int incrementBy) { throw new NotImplementedException (); } @@ -167,6 +167,11 @@ namespace System.ServiceModel { } + [MonoTODO] + protected override void OnFaulted () + { + } + protected override void OnClosed () { base.OnClosed (); diff --git a/mcs/class/System.ServiceModel/System.ServiceModel/NetPeerTcpBinding.cs b/mcs/class/System.ServiceModel/System.ServiceModel/NetPeerTcpBinding.cs index 134a88fa22f..a59ef1515b7 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel/NetPeerTcpBinding.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel/NetPeerTcpBinding.cs @@ -39,9 +39,7 @@ using System.Xml; namespace System.ServiceModel { - public class NetPeerTcpBinding : Binding, - IBindingDeliveryCapabilities, IBindingMulticastCapabilities, - ISecurityCapabilities, IBindingRuntimePreferences + public class NetPeerTcpBinding : Binding, IBindingRuntimePreferences { // We don't support PNRP public static bool IsPnrpAvailable { @@ -125,48 +123,8 @@ namespace System.ServiceModel // explicit interface implementations - [MonoTODO] - bool IBindingDeliveryCapabilities.AssuresOrderedDelivery { - get { throw new NotImplementedException (); } - } - - [MonoTODO] - bool IBindingDeliveryCapabilities.QueuedDelivery { - get { throw new NotImplementedException (); } - } - - [MonoTODO] bool IBindingRuntimePreferences.ReceiveSynchronously { - get { throw new NotImplementedException (); } - } - - bool IBindingMulticastCapabilities.IsMulticast { - get { throw new NotImplementedException (); } - } - - [MonoTODO] - ProtectionLevel ISecurityCapabilities.SupportedRequestProtectionLevel { - get { throw new NotImplementedException (); } - } - - [MonoTODO] - ProtectionLevel ISecurityCapabilities.SupportedResponseProtectionLevel { - get { throw new NotImplementedException (); } - } - - [MonoTODO] - bool ISecurityCapabilities.SupportsClientAuthentication { - get { throw new NotImplementedException (); } - } - - [MonoTODO] - bool ISecurityCapabilities.SupportsClientWindowsIdentity { - get { throw new NotImplementedException (); } - } - - [MonoTODO] - bool ISecurityCapabilities.SupportsServerAuthentication { - get { throw new NotImplementedException (); } + get { return false; } } } } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel/OperationContext.cs b/mcs/class/System.ServiceModel/System.ServiceModel/OperationContext.cs index 634bf6b0c24..4bb6e8f1620 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel/OperationContext.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel/OperationContext.cs @@ -139,9 +139,8 @@ namespace System.ServiceModel set { request_ctx = value; } } - [MonoTODO] public string SessionId { - get { throw new NotImplementedException (); } + get { return Channel.SessionId; } } #if !NET_2_1 diff --git a/mcs/class/System.ServiceModel/System.ServiceModel/PeerNode.cs b/mcs/class/System.ServiceModel/System.ServiceModel/PeerNode.cs index 623854d0191..f7fa41335f5 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel/PeerNode.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel/PeerNode.cs @@ -51,14 +51,17 @@ namespace System.ServiceModel internal int NodeId { get; set; } - internal abstract bool IsOpen { get; } + internal bool IsOpen { + get { return RegisteredId != null; } + } + + internal object RegisteredId { get; set; } public int Port { get; private set; } public abstract PeerMessagePropagationFilter MessagePropagationFilter { get; set; } - internal abstract void Open (TimeSpan timeout); - internal abstract void Close (TimeSpan timeout); + internal abstract TcpListener GetTcpListener (); public void RefreshConnection () { @@ -92,70 +95,40 @@ namespace System.ServiceModel public PeerNodeAddress Address { get; set; } } - Dictionary mesh_map = new Dictionary (); - - internal PeerNodeImpl (PeerResolver resolver, EndpointAddress remoteAddress, int port) + internal PeerNodeImpl (EndpointAddress remoteAddress, IPAddress fixedListenAddress, int port) : base (remoteAddress.Uri.Host, port) { - this.resolver = resolver; + this.listen_address = fixedListenAddress ?? IPAddress.Any; this.remote_address = remoteAddress; } - PeerResolver resolver; EndpointAddress remote_address; - object registered_id; - TcpListener listener; // FIXME: not sure if it is actually used ... + IPAddress listen_address; // FIXME: implement public override PeerMessagePropagationFilter MessagePropagationFilter { get; set; } - internal override bool IsOpen { - get { return registered_id != null; } - } - - internal override void Open (TimeSpan timeout) + internal override TcpListener GetTcpListener () { - DateTime startTime = DateTime.Now; - - int maxAddresses = 3; // FIXME: get it from somewhere - - NodeInfo info; - if (!mesh_map.TryGetValue (MeshId, out info)) { - var rnd = new Random (); - // FIXME: not sure how I should handle addresses - foreach (var address in resolver.Resolve (MeshId, maxAddresses, timeout)) { - info = new NodeInfo () { Id = rnd.Next (), Address = address }; - break; - } - if (info == null) { // there was no resolved IP for the MeshId, so create a new peer ... - int p = rnd.Next (50000, 60000); - while (p < 60000) { - try { - listener = new TcpListener (p); - break; - } catch { - } - } - if (listener == null) - throw new Exception ("No port is available for a peer node to listen"); + int p = Port; + var rnd = Port != 0 ? null : new Random (); + TcpListener listener = null; + while (p < 51000) { + if (rnd != null) + p = rnd.Next (50000, 51000); // This range is picked up sorta randomly. + listener = new TcpListener (listen_address, p); + try { listener.Start (); - var ep = (IPEndPoint) listener.LocalEndpoint; - string name = Dns.GetHostName (); - info = new NodeInfo () { Id = new Random ().Next (0, int.MaxValue), Address = new PeerNodeAddress (new EndpointAddress ("net.tcp://" + name + ":" + ep.Port + "/PeerChannelEndpoints/" + Guid.NewGuid ()), new ReadOnlyCollection (Dns.GetHostEntry (name).AddressList)) }; + break; + } catch (SocketException) { + listener = null; + if (rnd == null) + break; } } - registered_id = resolver.Register (MeshId, info.Address, timeout - (DateTime.Now - startTime)); - mesh_map [MeshId] = info; - NodeId = info.Id; - SetOnline (); - } - - internal override void Close (TimeSpan timeout) - { - resolver.Unregister (registered_id, timeout); - if (listener != null) - listener.Stop (); - registered_id = null; + if (listener == null) + throw new InvalidOperationException (String.Format ("The specified endpoint is available for a peer node to listen. IP address: {0}, Port {1}", listen_address, Port)); + return listener; } } } diff --git a/mcs/class/System.ServiceModel/System.ServiceModel/ServiceBehaviorAttribute.cs b/mcs/class/System.ServiceModel/System.ServiceModel/ServiceBehaviorAttribute.cs index 19fa4afeaab..f366bff8d1d 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel/ServiceBehaviorAttribute.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel/ServiceBehaviorAttribute.cs @@ -42,15 +42,18 @@ namespace System.ServiceModel { public ServiceBehaviorAttribute () { + // FIXME: it should be PerSession as documented. + InstanceContextMode = InstanceContextMode.PerSession; + + SessionMode = SessionMode.Allowed; } bool auto_session_shutdown, ignore_ext_data, release, inc_fault_details, - use_sync_ctx, tx_close, validate_must_understand; + use_sync_ctx = true, tx_close, validate_must_understand; ConcurrencyMode concurrency; IsolationLevel tx_level; string tx_timeout; - InstanceContextMode context_mode = InstanceContextMode.PerCall; object singleton; [MonoTODO] @@ -71,10 +74,7 @@ namespace System.ServiceModel set { ignore_ext_data = value; } } - public InstanceContextMode InstanceContextMode { - get { return context_mode; } - set { context_mode = value; } - } + public InstanceContextMode InstanceContextMode { get; set; } public bool ReleaseServiceInstanceOnTransactionComplete { get { return release; } @@ -88,6 +88,8 @@ namespace System.ServiceModel } [MonoTODO] + public SessionMode SessionMode { get; set; } + public bool UseSynchronizationContext { get { return use_sync_ctx; } set { use_sync_ctx = value; } @@ -147,7 +149,7 @@ namespace System.ServiceModel ServiceDescription description, ServiceHostBase serviceHostBase) { - if (singleton != null && context_mode != InstanceContextMode.Single) + if (singleton != null && InstanceContextMode != InstanceContextMode.Single) throw new InvalidOperationException ("When creating a Service host with a service instance, use InstanceContext.Mode.Single in the ServiceBehaviorAttribute."); foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers) { @@ -156,19 +158,26 @@ namespace System.ServiceModel continue; if (IncludeExceptionDetailInFaults) // may be set also in ServiceDebugBehaviorAttribute cd.IncludeExceptionDetailInFaults = true; - foreach (EndpointDispatcher ed in cd.Endpoints) - ed.DispatchRuntime.InstanceContextProvider = CreateInstanceContextProvider (serviceHostBase); + foreach (EndpointDispatcher ed in cd.Endpoints) { + if (InstanceContextMode == InstanceContextMode.Single) + ed.DispatchRuntime.SingletonInstanceContext = CreateSingletonInstanceContext (serviceHostBase); + ed.DispatchRuntime.InstanceContextProvider = CreateInstanceContextProvider (serviceHostBase, ed.DispatchRuntime); + } } } - IInstanceContextProvider CreateInstanceContextProvider (ServiceHostBase host) + InstanceContext CreateSingletonInstanceContext (ServiceHostBase host) + { + return new InstanceContext (host, GetWellKnownSingleton ()); + } + + IInstanceContextProvider CreateInstanceContextProvider (ServiceHostBase host, DispatchRuntime runtime) { switch (InstanceContextMode) { case InstanceContextMode.Single: - return new SingletonInstanceContextProvider (new InstanceContext (host, GetWellKnownSingleton ())); + return new SingletonInstanceContextProvider (runtime.SingletonInstanceContext); case InstanceContextMode.PerSession: - // FIXME: implement - throw new NotImplementedException (); + return new SessionInstanceContextProvider (host); //case InstanceContextMode.PerCall: default: return null; // default diff --git a/mcs/class/System.ServiceModel/System.ServiceModel/ServiceHostBase.cs b/mcs/class/System.ServiceModel/System.ServiceModel/ServiceHostBase.cs index 39b5db6baf5..ff263bf12a4 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel/ServiceHostBase.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel/ServiceHostBase.cs @@ -83,7 +83,6 @@ namespace System.ServiceModel return new Uri (baseUri, relatieUri); } - [MonoTODO] public ChannelDispatcherCollection ChannelDispatchers { get { return channel_dispatchers; } } @@ -146,7 +145,6 @@ namespace System.ServiceModel new Uri (address, UriKind.RelativeOrAbsolute)); } - [MonoTODO] public ServiceEndpoint AddServiceEndpoint ( string implementedContract, Binding binding, string address, Uri listenUri) @@ -156,7 +154,6 @@ namespace System.ServiceModel implementedContract, binding, uri, uri); } - [MonoTODO] public ServiceEndpoint AddServiceEndpoint ( string implementedContract, Binding binding, Uri address) @@ -164,7 +161,6 @@ namespace System.ServiceModel return AddServiceEndpoint (implementedContract, binding, address, address); } - [MonoTODO] public ServiceEndpoint AddServiceEndpoint ( string implementedContract, Binding binding, Uri address, Uri listenUri) @@ -332,7 +328,6 @@ namespace System.ServiceModel protected abstract ServiceDescription CreateDescription ( out IDictionary implementedContracts); - [MonoTODO] protected void InitializeDescription (UriSchemeKeyedCollection baseAddresses) { this.base_addresses = baseAddresses; @@ -343,7 +338,6 @@ namespace System.ServiceModel ApplyConfiguration (); } - [MonoTODO] protected virtual void InitializeRuntime () { //First validate the description, which should call all behaviors @@ -375,7 +369,8 @@ namespace System.ServiceModel ApplyDispatchBehavior(val.Value, val.Key); } - private void ValidateDescription () { + private void ValidateDescription () + { foreach (IServiceBehavior b in Description.Behaviors) b.Validate (Description, this); foreach (ServiceEndpoint endPoint in Description.Endpoints) @@ -540,18 +535,23 @@ namespace System.ServiceModel { } - [MonoTODO] + Action close_delegate; + Action open_delegate; + protected override sealed IAsyncResult OnBeginClose ( TimeSpan timeout, AsyncCallback callback, object state) { - throw new NotImplementedException (); + if (close_delegate != null) + close_delegate = new Action (OnClose); + return close_delegate.BeginInvoke (timeout, callback, state); } - [MonoTODO] protected override sealed IAsyncResult OnBeginOpen ( TimeSpan timeout, AsyncCallback callback, object state) { - throw new NotImplementedException (); + if (open_delegate == null) + open_delegate = new Action (OnOpen); + return open_delegate.BeginInvoke (timeout, callback, state); } protected override void OnClose (TimeSpan timeout) @@ -579,16 +579,18 @@ namespace System.ServiceModel DoOpen (timeout); } - [MonoTODO] protected override void OnEndClose (IAsyncResult result) { - throw new NotImplementedException (); + if (close_delegate == null) + throw new InvalidOperationException ("Async close operation has not started"); + close_delegate.EndInvoke (result); } - [MonoTODO] protected override sealed void OnEndOpen (IAsyncResult result) { - throw new NotImplementedException (); + if (open_delegate == null) + throw new InvalidOperationException ("Aync open operation has not started"); + open_delegate.EndInvoke (result); } protected override void OnOpened () diff --git a/mcs/class/System.ServiceModel/System.ServiceModel/ServiceRuntimeChannel.cs b/mcs/class/System.ServiceModel/System.ServiceModel/ServiceRuntimeChannel.cs index 8478f565486..556c0a1c175 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel/ServiceRuntimeChannel.cs +++ b/mcs/class/System.ServiceModel/System.ServiceModel/ServiceRuntimeChannel.cs @@ -53,10 +53,7 @@ namespace System.ServiceModel #region IContextChannel [MonoTODO] - public bool AllowOutputBatching { - get { throw new NotImplementedException (); } - set { throw new NotImplementedException (); } - } + public bool AllowOutputBatching { get; set; } public IInputSession InputSession { get { @@ -79,10 +76,7 @@ namespace System.ServiceModel } [MonoTODO] - public TimeSpan OperationTimeout { - get { throw new NotImplementedException (); } - set { throw new NotImplementedException (); } - } + public TimeSpan OperationTimeout { get; set; } public IOutputSession OutputSession { get { @@ -209,8 +203,9 @@ namespace System.ServiceModel #region IDisposable Members - public void Dispose () { - throw new NotImplementedException (); + public void Dispose () + { + Close (); } #endregion diff --git a/mcs/class/System.ServiceModel/System.ServiceModel_test.dll.sources b/mcs/class/System.ServiceModel/System.ServiceModel_test.dll.sources index b2ebc9c71ee..e94bbc5509e 100644 --- a/mcs/class/System.ServiceModel/System.ServiceModel_test.dll.sources +++ b/mcs/class/System.ServiceModel/System.ServiceModel_test.dll.sources @@ -129,6 +129,7 @@ System.ServiceModel/MessageSecurityVersionTest.cs System.ServiceModel/NetMsmqBindingTest.cs System.ServiceModel/NetTcpBindingTest.cs System.ServiceModel/NetPeerTcpBindingTest.cs +System.ServiceModel/PeerNodeAddressTest.cs System.ServiceModel/ServiceAssert.cs System.ServiceModel/ServiceEndpointCollectionTest.cs System.ServiceModel/ServiceEndpointTest.cs diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ChangeLog b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ChangeLog index 82cba2fb639..bf75a94b18b 100755 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ChangeLog +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ChangeLog @@ -1,3 +1,12 @@ +2009-07-02 Atsushi Enomoto + + * ContractDescriptionTest.cs : make sure the contract actually + contains operations from the base types. + +2009-07-02 Atsushi Enomoto + + * ContractDescriptionTest.cs : added test for derived contract type. + 2009-06-09 Atsushi Enomoto * ServiceThrottlingBehaviorTest.cs : new. diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ContractDescriptionTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ContractDescriptionTest.cs index fbc0bd86d07..310c396dc54 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ContractDescriptionTest.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Description/ContractDescriptionTest.cs @@ -34,7 +34,7 @@ using System.ServiceModel.Channels; using System.ServiceModel.Description; using NUnit.Framework; -namespace MonoTests.System.ServiceModel +namespace MonoTests.System.ServiceModel.Description { [TestFixture] public class ContractDescriptionTest @@ -410,6 +410,17 @@ namespace MonoTests.System.ServiceModel ReleaseInstanceMode.AfterCall, "#5"); } + [Test] + public void GetDerivedContract () + { + var cd = ContractDescription.GetContract (typeof (IFoo3)); + Assert.AreEqual (typeof (IFoo3), cd.ContractType, "#1"); + Assert.AreEqual (3, cd.Operations.Count, "#2"); + cd = ContractDescription.GetContract (typeof (Foo3)); + Assert.AreEqual (typeof (IFoo3), cd.ContractType, "#3"); + Assert.AreEqual (3, cd.Operations.Count, "#4"); + } + // It is for testing attribute search in interfaces. public class Foo : IFoo { @@ -467,6 +478,21 @@ namespace MonoTests.System.ServiceModel Mona NewMona (Mona source); } + [ServiceContract] + public interface IFoo3 : IFoo + { + [OperationContract] + string HeyMan (string msg, string msg2); + } + + public class Foo3 : Foo, IFoo3 + { + public string HeyMan (string msg, string msg2) + { + return msg + msg2; + } + } + [ServiceContract] public interface IBar { diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/ChangeLog b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/ChangeLog index b36af62dd83..d7d7e43fe0f 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/ChangeLog +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/ChangeLog @@ -1,3 +1,25 @@ +2009-07-02 Atsushi Enomoto + + * ChannelDispatcherTest.cs : add singleton instance context test + (but disabled, for some weird conflict). + +2009-06-25 Atsushi Enomoto + + * ChannelDispatcherTest.cs : add some instance provider tests. + +2009-06-23 Atsushi Enomoto + + * ChannelDispatcherTest.cs : make sure that the port to be in use is + available before running the tests. Check attach state. + * DispatchRuntimeTest.cs : make sure that it runs through all the + behavior tests. + +2009-06-16 Atsushi Enomoto + + * DispatchRuntimeTest.cs : add reasonable timeout and close client + appropriately. Objects are disposed in different ways than .NET. + Do not expect things automatically disposed as just time goes by. + 2009-06-12 Atsushi Enomoto * ChannelDispatcherTest.cs : make sure to close service host, diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/ChannelDispatcherTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/ChannelDispatcherTest.cs index b3ffb9c3092..911e7601d89 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/ChannelDispatcherTest.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/ChannelDispatcherTest.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Net; +using System.Net.Sockets; using System.Text; using NUnit.Framework; using System.ServiceModel; @@ -14,6 +15,19 @@ namespace MonoTests.System.ServiceModel.Dispatcher [TestFixture] public class ChannelDispatcherTest { + Uri CreateAvailableUri (string uriString) + { + var uri = new Uri (uriString); + try { + var t = new TcpListener (uri.Port); + t.Start (); + t.Stop (); + } catch (Exception ex) { + Assert.Fail ("Port {0} is not open. It is likely previous tests have failed and the port is kept opened"); + } + return uri; + } + [Test] public void ConstructorNullBindingName () { @@ -28,7 +42,7 @@ namespace MonoTests.System.ServiceModel.Dispatcher var st = cd.ServiceThrottle; Assert.IsNull (st, "#0"); - var uri = new Uri ("http://localhost:37564"); + var uri = CreateAvailableUri ("http://localhost:37564"); ServiceHost h = new ServiceHost (typeof (TestContract), uri); h.AddServiceEndpoint (typeof (TestContract).FullName, new BasicHttpBinding (), "address"); h.ChannelDispatchers.Add (cd); @@ -53,7 +67,7 @@ namespace MonoTests.System.ServiceModel.Dispatcher [Test] public void Collection_Add_Remove () { Console.WriteLine ("STart test Collection_Add_Remove"); - var uri = new Uri ("http://localhost:37564"); + var uri = CreateAvailableUri ("http://localhost:37564"); ServiceHost h = new ServiceHost (typeof (TestContract), uri); h.AddServiceEndpoint (typeof (TestContract).FullName, new BasicHttpBinding (), "address"); MyChannelDispatcher d = new MyChannelDispatcher (new MyChannelListener (uri)); @@ -71,7 +85,7 @@ namespace MonoTests.System.ServiceModel.Dispatcher [Test] public void EndpointDispatcherAddTest () { - var uri = new Uri ("http://localhost:8080"); + var uri = CreateAvailableUri ("http://localhost:37564"); MyChannelDispatcher d = new MyChannelDispatcher (new MyChannelListener (uri)); d.Endpoints.Add (new EndpointDispatcher (new EndpointAddress (uri), "", "")); } @@ -79,7 +93,7 @@ namespace MonoTests.System.ServiceModel.Dispatcher [Test] [ExpectedException (typeof (InvalidOperationException))] public void EndpointDispatcherAddTest2 () { - var uri = new Uri ("http://localhost:8080"); + var uri = CreateAvailableUri ("http://localhost:37564"); MyChannelDispatcher d = new MyChannelDispatcher (new MyChannelListener (uri)); d.Endpoints.Add (new EndpointDispatcher (new EndpointAddress (uri), "", "")); d.Open (); // the dispatcher must be attached. @@ -89,7 +103,7 @@ namespace MonoTests.System.ServiceModel.Dispatcher [ExpectedException (typeof (InvalidOperationException))] public void EndpointDispatcherAddTest3 () { - var uri = new Uri ("http://localhost:37564"); + var uri = CreateAvailableUri ("http://localhost:37564"); ServiceHost h = new ServiceHost (typeof (TestContract), uri); MyChannelDispatcher d = new MyChannelDispatcher (new MyChannelListener (uri)); d.Endpoints.Add (new EndpointDispatcher (new EndpointAddress (uri), "", "")); @@ -101,7 +115,7 @@ namespace MonoTests.System.ServiceModel.Dispatcher [ExpectedException (typeof (InvalidOperationException))] // i.e. it is thrown synchronously in current thread. public void EndpointDispatcherAddTest4 () { - var uri = new Uri ("http://localhost:37564"); + var uri = CreateAvailableUri ("http://localhost:37564"); ServiceHost h = new ServiceHost (typeof (TestContract), uri); var listener = new MyChannelListener (uri); MyChannelDispatcher d = new MyChannelDispatcher (listener); @@ -109,6 +123,7 @@ namespace MonoTests.System.ServiceModel.Dispatcher Assert.IsNotNull (ed.DispatchRuntime, "#1"); Assert.IsNull (ed.DispatchRuntime.InstanceProvider, "#2"); Assert.IsNull (ed.DispatchRuntime.InstanceContextProvider, "#3"); + Assert.IsNull (ed.DispatchRuntime.InstanceProvider, "#3.2"); Assert.IsNull (ed.DispatchRuntime.SingletonInstanceContext, "#4"); d.Endpoints.Add (ed); d.MessageVersion = MessageVersion.Default; @@ -132,7 +147,7 @@ namespace MonoTests.System.ServiceModel.Dispatcher [ExpectedException (typeof (InvalidOperationException))] // i.e. it is thrown synchronously in current thread. public void EndpointDispatcherAddTest5 () { - var uri = new Uri ("http://localhost:37564"); + var uri = CreateAvailableUri ("http://localhost:37564"); ServiceHost h = new ServiceHost (typeof (TestContract), uri); var binding = new BasicHttpBinding (); var listener = new MyChannelListener (uri); @@ -154,25 +169,28 @@ namespace MonoTests.System.ServiceModel.Dispatcher [Test] public void EndpointDispatcherAddTest6 () { - var uri = new Uri ("http://localhost:37564"); + var uri = CreateAvailableUri ("http://localhost:37564"); ServiceHost h = new ServiceHost (typeof (TestContract), uri); var binding = new BasicHttpBinding (); var listener = new MyChannelListener (uri); MyChannelDispatcher d = new MyChannelDispatcher (listener); var ed = new EndpointDispatcher (new EndpointAddress (uri), "", ""); d.Endpoints.Add (ed); + Assert.IsFalse (d.Attached, "#x1"); ed.DispatchRuntime.Type = typeof (TestContract); d.MessageVersion = MessageVersion.Default; h.ChannelDispatchers.Add (d); + Assert.IsTrue (d.Attached, "#x2"); d.Open (); // At this state, it does *not* call AcceptChannel() yet. Assert.IsFalse (listener.AcceptChannelTried, "#1"); Assert.IsFalse (listener.WaitForChannelTried, "#2"); Assert.IsNotNull (ed.DispatchRuntime, "#3"); Assert.IsNull (ed.DispatchRuntime.InstanceProvider, "#4"); - Assert.IsNull (ed.DispatchRuntime.InstanceContextProvider, "#5"); // it is not set after ChannelDispatcher.Open(). + Assert.IsNull (ed.DispatchRuntime.InstanceContextProvider, "#5"); // it is not still set after ChannelDispatcher.Open(). + Assert.IsNull (ed.DispatchRuntime.InstanceProvider, "#5.2"); Assert.IsNull (ed.DispatchRuntime.SingletonInstanceContext, "#6"); d.Close (); // we don't have to even close it. @@ -182,7 +200,7 @@ namespace MonoTests.System.ServiceModel.Dispatcher [ExpectedException (typeof (InvalidOperationException))] public void EndpointDispatcherAddTest7 () { - var uri = new Uri ("http://localhost:37564"); + var uri = CreateAvailableUri ("http://localhost:37564"); ServiceHost h = new ServiceHost (typeof (TestContract), uri); var binding = new BasicHttpBinding (); var listener = new MyChannelListener (uri); @@ -211,9 +229,8 @@ namespace MonoTests.System.ServiceModel.Dispatcher [Test] public void EndpointDispatcherAddTest8 () { - var uri = new Uri ("http://localhost:37564"); + var uri = CreateAvailableUri ("http://localhost:37564"); ServiceHost h = new ServiceHost (typeof (TestContract), uri); - var binding = new BasicHttpBinding (); var listener = new MyChannelListener (uri); MyChannelDispatcher d = new MyChannelDispatcher (listener); var ed = new EndpointDispatcher (new EndpointAddress (uri), "", ""); @@ -247,7 +264,37 @@ namespace MonoTests.System.ServiceModel.Dispatcher l.Stop (); */ } finally { - h.Close (); + h.Close (TimeSpan.FromSeconds (10)); + h.Abort (); + } + } + + // FIXME: this test itself indeed passes, but some weird conflict that blocks correspoding port happens between this and somewhere (probably above) +// [Test] + public void EndpointDispatcherAddTest9 () // test singleton service + { + var uri = CreateAvailableUri ("http://localhost:37564"); + ServiceHost h = new ServiceHost (new TestContract (), uri); + h.Description.Behaviors.Find ().InstanceContextMode = InstanceContextMode.Single; + var listener = new MyChannelListener (uri); + MyChannelDispatcher d = new MyChannelDispatcher (listener); + var ed = new EndpointDispatcher (new EndpointAddress (uri), "", ""); + d.Endpoints.Add (ed); + ed.DispatchRuntime.Type = typeof (TestContract); + d.MessageVersion = MessageVersion.Default; + h.AddServiceEndpoint (typeof (TestContract), new BasicHttpBinding (), uri.ToString ()); + h.ChannelDispatchers.Clear (); + Assert.IsNull (ed.DispatchRuntime.SingletonInstanceContext, "#1"); + h.ChannelDispatchers.Add (d); + Assert.IsNull (ed.DispatchRuntime.SingletonInstanceContext, "#2"); + try { + h.Open (TimeSpan.FromSeconds (10)); + Assert.IsNull (ed.DispatchRuntime.InstanceProvider, "#4"); + Assert.IsNotNull (ed.DispatchRuntime.InstanceContextProvider, "#5"); // it was set after ServiceHost.Open(). + Assert.IsNotNull (ed.DispatchRuntime.SingletonInstanceContext, "#6"); + } finally { + h.Close (TimeSpan.FromSeconds (10)); + h.Abort (); } } diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/DispatchRuntimeTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/DispatchRuntimeTest.cs index 97aedf9c16c..ffaa9a99628 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/DispatchRuntimeTest.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel.Dispatcher/DispatchRuntimeTest.cs @@ -103,11 +103,12 @@ namespace MonoTests.System.ServiceModel.Dispatcher b.msgInspect = new MyMessageInspector (res); string expected = "GetExistingInstanceContext , InitializeInstanceContext , OperationContext , InstanceContext = Opening , Initialize , OperationContext , InstanceContext = Opening , AfterReceiveRequest , OperationContext , InstanceContext = Opened , BeforeSendReply , OperationContext , InstanceContext = Opened , IsIdle , OperationContext , InstanceContext = Opened , NotifyIdle , OperationContext , InstanceContext = Opened , "; TestInstanceBehavior (b, expected, res, 1); + Assert.IsTrue (res.Done, "done"); } - [Test] - public void TestInstanceBehavior2 () { - + [Test] + public void TestInstanceBehavior2 () + { Result res = new Result (); MessageInspectBehavior b = new MessageInspectBehavior (); b.instanceCtxInitializer = new MyInstanceContextInitializer (res); @@ -116,11 +117,12 @@ namespace MonoTests.System.ServiceModel.Dispatcher b.msgInspect = new MyMessageInspector (res); string expected = "GetExistingInstanceContext , InitializeInstanceContext , OperationContext , InstanceContext = Opening , Initialize , OperationContext , InstanceContext = Opening , AfterReceiveRequest , OperationContext , InstanceContext = Opened , GetInstance1 , OperationContext , InstanceContext = Opened , BeforeSendReply , OperationContext , InstanceContext = Opened , ReleaseInstance , OperationContext , InstanceContext = Opened , IsIdle , OperationContext , InstanceContext = Opened , NotifyIdle , OperationContext , InstanceContext = Opened , "; TestInstanceBehavior (b, expected, res, 1); + Assert.IsTrue (res.Done, "done"); } - [Test] - public void TestInstanceBehavior3 () { - + [Test] + public void TestInstanceBehavior3 () + { Result res = new Result (); MessageInspectBehavior b = new MessageInspectBehavior (); b.instanceCtxInitializer = new MyInstanceContextInitializer (res); @@ -131,13 +133,13 @@ namespace MonoTests.System.ServiceModel.Dispatcher b.instanceProvider = new MyInstanceProvider (new AllActions (res), res); b.msgInspect = new MyMessageInspector (res); string expected = "GetExistingInstanceContext , InitializeInstanceContext , OperationContext , InstanceContext = Opening , Initialize , OperationContext , InstanceContext = Opening , AfterReceiveRequest , OperationContext , InstanceContext = Opened , BeforeSendReply , OperationContext , InstanceContext = Opened , "; - TestInstanceBehavior (b, expected, res, 1); + TestInstanceBehavior (b, expected, res, 1); Assert.IsTrue (res.Done, "done"); } [Test] [Category ("NotWorking")] - public void TestInstanceBehavior4 () { - + public void TestInstanceBehavior4 () + { Result res = new Result (); MessageInspectBehavior b = new MessageInspectBehavior (); b.instanceCtxInitializer = new MyInstanceContextInitializer (res); @@ -146,10 +148,11 @@ namespace MonoTests.System.ServiceModel.Dispatcher b.instanceProvider = new MyInstanceProvider (new AllActions (res), res); b.msgInspect = new MyMessageInspector (res); string expected = "GetExistingInstanceContext , InitializeInstanceContext , OperationContext , InstanceContext = Opening , Initialize , OperationContext , InstanceContext = Opening , AfterReceiveRequest , OperationContext , InstanceContext = Opened , GetInstance1 , OperationContext , InstanceContext = Opened , BeforeSendReply , OperationContext , InstanceContext = Opened , ReleaseInstance , OperationContext , InstanceContext = Opened , IsIdle , OperationContext , InstanceContext = Opened , NotifyIdle , OperationContext , InstanceContext = Opened , GetExistingInstanceContext , InitializeInstanceContext , OperationContext , InstanceContext = Opening , Initialize , OperationContext , InstanceContext = Opening , AfterReceiveRequest , OperationContext , InstanceContext = Opened , GetInstance1 , OperationContext , InstanceContext = Opened , BeforeSendReply , OperationContext , InstanceContext = Opened , ReleaseInstance , OperationContext , InstanceContext = Opened , IsIdle , OperationContext , InstanceContext = Opened , NotifyIdle , OperationContext , InstanceContext = Opened , "; - TestInstanceBehavior (b, expected, res, 2); + TestInstanceBehavior (b, expected, res, 2); Assert.IsTrue (res.Done, "done"); } - void TestInstanceBehavior (MessageInspectBehavior b, string expected, Result actual, int invocations) { + void TestInstanceBehavior (MessageInspectBehavior b, string expected, Result actual, int invocations) + { ServiceHost h = new ServiceHost (typeof (AllActions), new Uri ("http://localhost:8080")); try { h.AddServiceEndpoint (typeof (IAllActions).FullName, new BasicHttpBinding (), "AllActions"); @@ -157,14 +160,17 @@ namespace MonoTests.System.ServiceModel.Dispatcher ServiceDebugBehavior db = h.Description.Behaviors.Find (); db.IncludeExceptionDetailInFaults = true; h.Open (); - AllActionsProxy p = new AllActionsProxy (new BasicHttpBinding (), new EndpointAddress ("http://localhost:8080/AllActions")); + AllActionsProxy p = new AllActionsProxy (new BasicHttpBinding () { SendTimeout = TimeSpan.FromSeconds (5), ReceiveTimeout = TimeSpan.FromSeconds (5) }, new EndpointAddress ("http://localhost:8080/AllActions")); for (int i = 0; i < invocations; ++i) p.Get (10); + p.Close (); //let ther server finish his work Thread.Sleep (100); +Console.WriteLine (actual.string_res); Assert.AreEqual (expected, actual.string_res); + actual.Done = true; } finally { h.Close (); @@ -326,6 +332,7 @@ namespace MonoTests.System.ServiceModel.Dispatcher public class Result { + public bool Done; public string string_res = ""; public void AddCurrentOperationContextInfo() diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel/ChangeLog b/mcs/class/System.ServiceModel/Test/System.ServiceModel/ChangeLog index 7146b9ce7e4..6c59a787678 100755 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel/ChangeLog +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel/ChangeLog @@ -1,3 +1,20 @@ +2009-07-08 Atsushi Enomoto + + * NetTcpBindingTest.cs : added simple connection test. It somehow + stops for a while (without failing) though... + +2009-07-08 Atsushi Enomoto + + * NetPeerTcpBindingTest.cs : a bit of interface implementation test. + +2009-07-07 Atsushi Enomoto + + * EndpointAddress10Test.cs : added a few more serialization tests. + +2009-07-07 Atsushi Enomoto + + * PeerNodeAddressTest.cs : new test. + 2009-04-21 Atsushi Enomoto * NetPeerTcpBindingTest.cs : fix build. diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel/EndpointAddress10Test.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel/EndpointAddress10Test.cs index b7d446bd3ce..322f097c333 100755 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel/EndpointAddress10Test.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel/EndpointAddress10Test.cs @@ -56,6 +56,19 @@ namespace MonoTests.System.ServiceModel using (XmlReader xr = XmlReader.Create (sr)) { ((IXmlSerializable) e).ReadXml (xr); } + + sr = new StringReader (@"
http://localhost:8080/
"); + using (XmlReader xr = XmlReader.Create (sr)) + EndpointAddress.ReadFrom (AddressingVersion.WSAddressing10, xr); + } + + [Test] + [ExpectedException (typeof (XmlException))] + public void ReadWriteXml2 () + { + var sr = new StringReader (@"
http://localhost:8080/
"); + using (XmlReader xr = XmlReader.Create (sr)) + EndpointAddress.ReadFrom (AddressingVersion.WSAddressing10, xr); } [Test] diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel/NetPeerTcpBindingTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel/NetPeerTcpBindingTest.cs index 4977c123996..9255b87ba4e 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel/NetPeerTcpBindingTest.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel/NetPeerTcpBindingTest.cs @@ -74,6 +74,8 @@ namespace MonoTests.System.ServiceModel Assert.AreEqual (0, n.Port, "#4"); Assert.IsNotNull (n.ReaderQuotas, "#5"); + Assert.IsFalse (((IBindingRuntimePreferences) n).ReceiveSynchronously, "#6"); + var bec = n.CreateBindingElements (); Assert.IsNotNull (bec.Find (), "#bec0"); Assert.IsNotNull (bec.Find (), "#bec1"); diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel/NetTcpBindingTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel/NetTcpBindingTest.cs index 9b2ebd673b5..7d00d48a32d 100644 --- a/mcs/class/System.ServiceModel/Test/System.ServiceModel/NetTcpBindingTest.cs +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel/NetTcpBindingTest.cs @@ -27,10 +27,12 @@ // using System; using System.Collections.ObjectModel; +using System.Net.Sockets; using System.Net.Security; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Security; +using System.Threading; using NUnit.Framework; namespace MonoTests.System.ServiceModel @@ -50,6 +52,65 @@ namespace MonoTests.System.ServiceModel Assert.IsNotNull (tr, "#tr1"); Assert.AreEqual (false, tr.TeredoEnabled, "#tr2"); Assert.AreEqual ("net.tcp", tr.Scheme, "#tr3"); + + Assert.IsFalse (n.TransactionFlow, "#4"); + var tx = n.CreateBindingElements ().Find (); + Assert.IsNotNull (tx, "#tx1"); + } + + [Test] + public void SimpleConnection () + { + var host = new ServiceHost (typeof (Foo)); + var bindingsvc = new NetTcpBinding (); + bindingsvc.Security.Mode = SecurityMode.None; + host.AddServiceEndpoint (typeof (IFoo), bindingsvc, "net.tcp://localhost/"); + host.Open (TimeSpan.FromSeconds (5)); + try { + var bindingcli = new NetTcpBinding (); + bindingcli.Security.Mode = SecurityMode.None; + var cli = new ChannelFactory (bindingcli, new EndpointAddress ("net.tcp://localhost/")).CreateChannel (); + Assert.AreEqual (5, cli.Add (1, 4)); + Assert.AreEqual ("monkey science", cli.Join ("monkey", "science")); + } finally { + host.Close (TimeSpan.FromSeconds (5)); + var t = new TcpListener (808); + t.Start (); + t.Stop (); + } + Assert.IsTrue (Foo.AddCalled, "#1"); + Assert.IsTrue (Foo.JoinCalled, "#2"); + } + + [ServiceContract] + public interface IFoo + { + [OperationContract] + int Add (short s, int i); + [OperationContract] + string Join (string s1, string s2); + } + + public interface IFooClient : IFoo, IClientChannel + { + } + + public class Foo : IFoo + { + public static bool AddCalled; + public static bool JoinCalled; + + public int Add (short s, int i) + { + AddCalled = true; + return s + i; + } + + public string Join (string s1, string s2) + { + JoinCalled = true; + return s1 + " " + s2; + } } } } diff --git a/mcs/class/System.ServiceModel/Test/System.ServiceModel/PeerNodeAddressTest.cs b/mcs/class/System.ServiceModel/Test/System.ServiceModel/PeerNodeAddressTest.cs new file mode 100644 index 00000000000..28454cfca8d --- /dev/null +++ b/mcs/class/System.ServiceModel/Test/System.ServiceModel/PeerNodeAddressTest.cs @@ -0,0 +1,54 @@ +// +// PeerNodeAddressTest.cs +// +// Author: +// Atsushi Enomoto +// +// Copyright (C) 2009 Novell, Inc. http://www.novell.com +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +using System; +using System.IO; +using System.Runtime.Serialization; +using System.ServiceModel; +using System.ServiceModel.Channels; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; +using NUnit.Framework; + +namespace MonoTests.System.ServiceModel +{ + [TestFixture] + public class PeerNodeAddressTest + { + [Test] + public void ReadWriteXml () + { + string nas = @"
net.tcp://atsushi-pc:37564/PeerChannelEndpoints/b2b137a4-3fdf-4366-a9e4-70d0ab6f2bff
"; + + var ser = new DataContractSerializer (typeof (PeerNodeAddress)); + var na = (PeerNodeAddress) ser.ReadObject (XmlReader.Create (new StringReader (nas))); + Assert.IsNotNull (na.EndpointAddress, "#1"); + Assert.IsNotNull (na.EndpointAddress.Uri, "#2"); + } + } +} diff --git a/mcs/class/System.Web.Abstractions/ChangeLog b/mcs/class/System.Web.Abstractions/ChangeLog index d3f025fa02e..ce5e70a41ce 100644 --- a/mcs/class/System.Web.Abstractions/ChangeLog +++ b/mcs/class/System.Web.Abstractions/ChangeLog @@ -1,3 +1,9 @@ +2009-06-16 Marek Habersack + + * net_4_0_System.Web.Abstractions.dll.sources: added. In the 4.0 + profile all classes are compiled into System.Web, + System.Web.Abstractions becomes an empty assembly. + 2008-09-09 Atsushi Enomoto * System.Web.Abstractions_test.dll.sources: new. diff --git a/mcs/class/System.Web.Abstractions/System.Web/ChangeLog b/mcs/class/System.Web.Abstractions/System.Web/ChangeLog index 8a2c3f45c78..0956e3275eb 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/ChangeLog +++ b/mcs/class/System.Web.Abstractions/System.Web/ChangeLog @@ -1,3 +1,8 @@ +2009-06-16 Marek Habersack + + * Decorated all classes with the TypeForwardedFrom attribute for + the 4.0 profile. + 2008-09-09 Atsushi Enomoto * HttpApplicationStateBase.cs diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpApplicationStateBase.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpApplicationStateBase.cs index a645f5585c1..f0c6bd07c55 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpApplicationStateBase.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpApplicationStateBase.cs @@ -32,12 +32,16 @@ using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class HttpApplicationStateBase : NameObjectCollectionBase, ICollection, IEnumerable diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpApplicationStateWrapper.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpApplicationStateWrapper.cs index cd9c722b18b..c9c5a6732bb 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpApplicationStateWrapper.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpApplicationStateWrapper.cs @@ -32,6 +32,7 @@ using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; +using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Security.Permissions; using System.Security.Principal; @@ -39,6 +40,9 @@ using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpApplicationStateWrapper : HttpApplicationStateBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpBrowserCapabilitiesBase.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpBrowserCapabilitiesBase.cs index 8a13b3a5e61..2a6376ce3a6 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpBrowserCapabilitiesBase.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpBrowserCapabilitiesBase.cs @@ -32,6 +32,7 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; @@ -39,6 +40,9 @@ using System.Web.UI; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class HttpBrowserCapabilitiesBase : IFilterResolutionService diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpBrowserCapabilitiesWrapper.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpBrowserCapabilitiesWrapper.cs index 6ca7bd1ebd5..9185dae33a4 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpBrowserCapabilitiesWrapper.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpBrowserCapabilitiesWrapper.cs @@ -32,6 +32,7 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; @@ -39,6 +40,9 @@ using System.Web.UI; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpBrowserCapabilitiesWrapper : HttpBrowserCapabilitiesBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpCachePolicyBase.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpCachePolicyBase.cs index 324852b793e..6f99f8970ff 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpCachePolicyBase.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpCachePolicyBase.cs @@ -31,12 +31,16 @@ using System; using System.Collections; using System.Collections.Generic; using System.Globalization; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class HttpCachePolicyBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpCachePolicyWrapper.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpCachePolicyWrapper.cs index 337af5e4da0..e604fc7ce0b 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpCachePolicyWrapper.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpCachePolicyWrapper.cs @@ -31,12 +31,16 @@ using System; using System.Collections; using System.Collections.Generic; using System.Globalization; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpCachePolicyWrapper : HttpCachePolicyBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpContextBase.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpContextBase.cs index 117e55d7165..5b9d0de0a89 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpContextBase.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpContextBase.cs @@ -31,6 +31,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Globalization; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; @@ -38,6 +39,9 @@ using System.Web.Profile; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class HttpContextBase : IServiceProvider diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpContextWrapper.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpContextWrapper.cs index 1607f0d9eda..4476eaa8ebb 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpContextWrapper.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpContextWrapper.cs @@ -31,6 +31,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Globalization; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; @@ -38,6 +39,9 @@ using System.Web.Profile; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpContextWrapper : HttpContextBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpFileCollectionBase.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpFileCollectionBase.cs index 5e28c7aec4b..d542aa33447 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpFileCollectionBase.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpFileCollectionBase.cs @@ -32,12 +32,16 @@ using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class HttpFileCollectionBase : NameObjectCollectionBase, ICollection, IEnumerable diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpFileCollectionWrapper.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpFileCollectionWrapper.cs index e18799e82b5..adabe2f09a8 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpFileCollectionWrapper.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpFileCollectionWrapper.cs @@ -32,6 +32,7 @@ using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; +using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Security.Permissions; using System.Security.Principal; @@ -39,6 +40,9 @@ using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpFileCollectionWrapper : HttpFileCollectionBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpPostedFileBase.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpPostedFileBase.cs index e2b9c32fa22..96b59dad4df 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpPostedFileBase.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpPostedFileBase.cs @@ -31,12 +31,16 @@ using System; using System.Collections; using System.Collections.Generic; using System.IO; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class HttpPostedFileBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpPostedFileWrapper.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpPostedFileWrapper.cs index 7644e855f94..5aea5a5663a 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpPostedFileWrapper.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpPostedFileWrapper.cs @@ -31,12 +31,16 @@ using System; using System.Collections; using System.Collections.Generic; using System.IO; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpPostedFileWrapper : HttpPostedFileBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpRequestBase.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpRequestBase.cs index a8386250b1a..7330cca8eae 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpRequestBase.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpRequestBase.cs @@ -33,6 +33,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Security.Permissions; using System.Security.Principal; @@ -41,6 +42,9 @@ using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class HttpRequestBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpRequestWrapper.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpRequestWrapper.cs index 666948192b8..5fe42d1cb73 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpRequestWrapper.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpRequestWrapper.cs @@ -33,6 +33,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Security.Permissions; using System.Security.Principal; @@ -41,6 +42,9 @@ using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpRequestWrapper : HttpRequestBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpResponseBase.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpResponseBase.cs index bcd2f1a1acf..4feeaa48401 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpResponseBase.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpResponseBase.cs @@ -33,6 +33,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Security.Permissions; using System.Security.Principal; @@ -41,6 +42,9 @@ using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class HttpResponseBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpResponseWrapper.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpResponseWrapper.cs index f6028c6db5e..88a7b2ce833 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpResponseWrapper.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpResponseWrapper.cs @@ -33,6 +33,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Security.Permissions; using System.Security.Principal; @@ -41,6 +42,9 @@ using System.Web.Caching; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpResponseWrapper : HttpResponseBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpServerUtilityBase.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpServerUtilityBase.cs index 6e56eb9c876..33cd857f8ff 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpServerUtilityBase.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpServerUtilityBase.cs @@ -33,6 +33,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; @@ -40,6 +41,9 @@ using System.Web.Profile; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class HttpServerUtilityBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpServerUtilityWrapper.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpServerUtilityWrapper.cs index 4dad3d096bd..8fef0a47cff 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpServerUtilityWrapper.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpServerUtilityWrapper.cs @@ -33,6 +33,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; @@ -40,6 +41,9 @@ using System.Web.Profile; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpServerUtilityWrapper : HttpServerUtilityBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpSessionStateBase.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpSessionStateBase.cs index 079a97badf8..1c15c2f260b 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpSessionStateBase.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpSessionStateBase.cs @@ -33,6 +33,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; @@ -40,6 +41,9 @@ using System.Web.SessionState; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class HttpSessionStateBase : ICollection, IEnumerable diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpSessionStateWrapper.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpSessionStateWrapper.cs index cc335392325..149513512d1 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpSessionStateWrapper.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpSessionStateWrapper.cs @@ -33,6 +33,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; @@ -40,6 +41,9 @@ using System.Web.SessionState; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpSessionStateWrapper : HttpSessionStateBase diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpStaticObjectsCollectionBase.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpStaticObjectsCollectionBase.cs index 20467aaed93..9f425977480 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpStaticObjectsCollectionBase.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpStaticObjectsCollectionBase.cs @@ -33,6 +33,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; @@ -40,6 +41,9 @@ using System.Web.SessionState; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class HttpStaticObjectsCollectionBase : ICollection, IEnumerable diff --git a/mcs/class/System.Web.Abstractions/System.Web/HttpStaticObjectsCollectionWrapper.cs b/mcs/class/System.Web.Abstractions/System.Web/HttpStaticObjectsCollectionWrapper.cs index 905d6fac0b2..504996807c0 100644 --- a/mcs/class/System.Web.Abstractions/System.Web/HttpStaticObjectsCollectionWrapper.cs +++ b/mcs/class/System.Web.Abstractions/System.Web/HttpStaticObjectsCollectionWrapper.cs @@ -33,6 +33,7 @@ using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Security.Principal; using System.Web.Caching; @@ -40,6 +41,9 @@ using System.Web.SessionState; namespace System.Web { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpStaticObjectsCollectionWrapper : HttpStaticObjectsCollectionBase diff --git a/mcs/class/System.Web.Abstractions/net_4_0_System.Web.Abstractions.dll.sources b/mcs/class/System.Web.Abstractions/net_4_0_System.Web.Abstractions.dll.sources new file mode 100644 index 00000000000..c030663c148 --- /dev/null +++ b/mcs/class/System.Web.Abstractions/net_4_0_System.Web.Abstractions.dll.sources @@ -0,0 +1,3 @@ +../../build/common/Consts.cs +../../build/common/MonoTODOAttribute.cs +Assembly/AssemblyInfo.cs diff --git a/mcs/class/System.Web.DynamicData/ChangeLog b/mcs/class/System.Web.DynamicData/ChangeLog index 77a2208516b..d2bbacdb059 100644 --- a/mcs/class/System.Web.DynamicData/ChangeLog +++ b/mcs/class/System.Web.DynamicData/ChangeLog @@ -1,3 +1,25 @@ +2009-07-06 Marek Habersack + + * Makefile (TEST_RESOURCE_FILES): added new test resources + +2009-07-06 Raja R Harinath + + * Makefile (TEST_MCS_FLAGS): Reference SystemWebTestShim. + +2009-07-03 Marek Habersack + + * Makefile: added more resources to the test assembly + +2009-06-18 Marek Habersack + + * Test/DataSource/DynamicDataColumn.cs: added Sortable property. + +2009-06-17 Marek Habersack + + * System.Web.DynamicData_test.dll.sources: added + Common/FooNoScaffold.cs, Common/TestDataContext2.cs, + ModelProviders/DynamicDataStringLengthAttribute.cs + 2009-06-12 Marek Habersack * Test/DataSource/DynamicDataColumn.cs: added table association diff --git a/mcs/class/System.Web.DynamicData/Makefile b/mcs/class/System.Web.DynamicData/Makefile index 49a7e29d68a..9610c955492 100644 --- a/mcs/class/System.Web.DynamicData/Makefile +++ b/mcs/class/System.Web.DynamicData/Makefile @@ -20,19 +20,137 @@ ifeq (2.0, $(FRAMEWORK_VERSION)) LIB_MCS_FLAGS += -d:NET_3_5 endif +# Use genresources.sh to generate the list below TEST_RESOURCE_FILES = \ - ../System.Web/Test/mainsoft/NunitWeb/NunitWeb/Resources/Global.asax \ - ../System.Web/Test/mainsoft/NunitWeb/NunitWeb/Resources/Global.asax.cs \ - ../System.Web/Test/mainsoft/NunitWeb/NunitWeb/Resources/My.ashx \ - ../System.Web/Test/mainsoft/NunitWeb/NunitWeb/Resources/My.master \ - ../System.Web/Test/mainsoft/NunitWeb/NunitWeb/Resources/MyPage.aspx \ - ../System.Web/Test/mainsoft/NunitWeb/NunitWeb/Resources/MyPage.aspx.cs \ - ../System.Web/Test/mainsoft/NunitWeb/NunitWeb/Resources/MyPageWithMaster.aspx \ - ../System.Web/Test/mainsoft/NunitWeb/NunitWeb/Resources/Web.mono.config + Test/WebPages/DynamicData/Content/FilterUserControl.ascx,MonoTests.WebPages.DynamicData.Content.FilterUserControl.ascx \ + Test/WebPages/DynamicData/Content/FilterUserControl.ascx.cs,MonoTests.WebPages.DynamicData.Content.FilterUserControl.ascx.cs \ + Test/WebPages/DynamicData/Content/GridViewPager.ascx,MonoTests.WebPages.DynamicData.Content.GridViewPager.ascx \ + Test/WebPages/DynamicData/Content/GridViewPager.ascx.cs,MonoTests.WebPages.DynamicData.Content.GridViewPager.ascx.cs \ + Test/WebPages/DynamicData/Content/Images/Back.gif,MonoTests.WebPages.DynamicData.Content.Images.Back.gif \ + Test/WebPages/DynamicData/Content/Images/header_back.gif,MonoTests.WebPages.DynamicData.Content.Images.header_back.gif \ + Test/WebPages/DynamicData/Content/Images/PgFirst.gif,MonoTests.WebPages.DynamicData.Content.Images.PgFirst.gif \ + Test/WebPages/DynamicData/Content/Images/PgLast.gif,MonoTests.WebPages.DynamicData.Content.Images.PgLast.gif \ + Test/WebPages/DynamicData/Content/Images/PgNext.gif,MonoTests.WebPages.DynamicData.Content.Images.PgNext.gif \ + Test/WebPages/DynamicData/Content/Images/PgPrev.gif,MonoTests.WebPages.DynamicData.Content.Images.PgPrev.gif \ + Test/WebPages/DynamicData/Content/Images/plus.gif,MonoTests.WebPages.DynamicData.Content.Images.plus.gif \ + Test/WebPages/DynamicData/FieldTemplates/Boolean.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.Boolean.ascx \ + Test/WebPages/DynamicData/FieldTemplates/Boolean.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.Boolean.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/Boolean_Edit.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.Boolean_Edit.ascx \ + Test/WebPages/DynamicData/FieldTemplates/Boolean_Edit.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.Boolean_Edit.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/Children.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.Children.ascx \ + Test/WebPages/DynamicData/FieldTemplates/Children.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.Children.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/CustomFieldTemplate.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.CustomFieldTemplate.ascx \ + Test/WebPages/DynamicData/FieldTemplates/CustomFieldTemplate.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.CustomFieldTemplate.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/DateTime.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.DateTime.ascx \ + Test/WebPages/DynamicData/FieldTemplates/DateTime.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.DateTime.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/DateTime_Edit.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.DateTime_Edit.ascx \ + Test/WebPages/DynamicData/FieldTemplates/DateTime_Edit.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.DateTime_Edit.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/Decimal_Edit.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.Decimal_Edit.ascx \ + Test/WebPages/DynamicData/FieldTemplates/Decimal_Edit.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.Decimal_Edit.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/ForeignKey.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.ForeignKey.ascx \ + Test/WebPages/DynamicData/FieldTemplates/ForeignKey.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.ForeignKey.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/ForeignKey_Edit.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.ForeignKey_Edit.ascx \ + Test/WebPages/DynamicData/FieldTemplates/ForeignKey_Edit.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.ForeignKey_Edit.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/Integer_Edit.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.Integer_Edit.ascx \ + Test/WebPages/DynamicData/FieldTemplates/Integer_Edit.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.Integer_Edit.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/MultilineText_Edit.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.MultilineText_Edit.ascx \ + Test/WebPages/DynamicData/FieldTemplates/MultilineText_Edit.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.MultilineText_Edit.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/MyCustomUIHintTemplate_Text.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.MyCustomUIHintTemplate_Text.ascx \ + Test/WebPages/DynamicData/FieldTemplates/MyCustomUIHintTemplate_Text.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.MyCustomUIHintTemplate_Text.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Boolean.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Boolean.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Boolean.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Boolean.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Byte.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte[].ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Byte[].ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Byte.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte[].ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Byte[].ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Char.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Char.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Char.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Char.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/FooEmpty.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.FooEmpty.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/FooEmpty.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.FooEmpty.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/ICollection.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.ICollection.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/ICollection.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.ICollection.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int16.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Int16.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int16.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Int16.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int32.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Int32.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int32.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Int32.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int64.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Int64.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int64.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Int64.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/MonoTests.Common.FooEmpty.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.MonoTests.Common.FooEmpty.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/MonoTests.Common.FooEmpty.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.MonoTests.Common.FooEmpty.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Object.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Object.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/Object.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.Object.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/SByte.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.SByte.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/SByte.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.SByte.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/String.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.String.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/String.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.String.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Boolean.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Boolean.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Boolean.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Boolean.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Byte.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte[].ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Byte[].ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Byte.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte[].ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Byte[].ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Char.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Char.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Char.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Char.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.Generic.List\`1[System.String].ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Collections.Generic.List\`1[System.String].ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.Generic.List\`1[System.String].ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Collections.Generic.List\`1[System.String].ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.ICollection.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Collections.ICollection.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.ICollection.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Collections.ICollection.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int16.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Int16.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int16.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Int16.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int32.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Int32.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int32.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Int32.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int64.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Int64.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int64.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Int64.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Object.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Object.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Object.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.Object.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.SByte.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.SByte.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.SByte.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.SByte.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.String.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.String.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.String.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.String.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt16.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.UInt16.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt16.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.UInt16.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt32.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.UInt32.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt32.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.UInt32.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt64.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.UInt64.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt64.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.System.UInt64.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt16.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.UInt16.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt16.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.UInt16.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt32.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.UInt32.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt32.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.UInt32.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt64.ascx,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.UInt64.ascx \ + Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt64.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault.UInt64.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/Text.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.Text.ascx \ + Test/WebPages/DynamicData/FieldTemplates/Text.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.Text.ascx.cs \ + Test/WebPages/DynamicData/FieldTemplates/Text_Edit.ascx,MonoTests.WebPages.DynamicData.FieldTemplates.Text_Edit.ascx \ + Test/WebPages/DynamicData/FieldTemplates/Text_Edit.ascx.cs,MonoTests.WebPages.DynamicData.FieldTemplates.Text_Edit.ascx.cs \ + Test/WebPages/DynamicData/PageTemplates/Details.aspx,MonoTests.WebPages.DynamicData.PageTemplates.Details.aspx \ + Test/WebPages/DynamicData/PageTemplates/Details.aspx.cs,MonoTests.WebPages.DynamicData.PageTemplates.Details.aspx.cs \ + Test/WebPages/DynamicData/PageTemplates/Edit.aspx,MonoTests.WebPages.DynamicData.PageTemplates.Edit.aspx \ + Test/WebPages/DynamicData/PageTemplates/Edit.aspx.cs,MonoTests.WebPages.DynamicData.PageTemplates.Edit.aspx.cs \ + Test/WebPages/DynamicData/PageTemplates/Insert.aspx,MonoTests.WebPages.DynamicData.PageTemplates.Insert.aspx \ + Test/WebPages/DynamicData/PageTemplates/Insert.aspx.cs,MonoTests.WebPages.DynamicData.PageTemplates.Insert.aspx.cs \ + Test/WebPages/DynamicData/PageTemplates/List.aspx,MonoTests.WebPages.DynamicData.PageTemplates.List.aspx \ + Test/WebPages/DynamicData/PageTemplates/List.aspx.cs,MonoTests.WebPages.DynamicData.PageTemplates.List.aspx.cs \ + Test/WebPages/DynamicData/PageTemplates/ListDetails.aspx,MonoTests.WebPages.DynamicData.PageTemplates.ListDetails.aspx \ + Test/WebPages/DynamicData/PageTemplates/ListDetails.aspx.cs,MonoTests.WebPages.DynamicData.PageTemplates.ListDetails.aspx.cs \ + Test/WebPages/DynamicData/web.config,MonoTests.WebPages.DynamicData.web.config \ + Test/WebPages/Global.asax,MonoTests.WebPages.Global.asax \ + Test/WebPages/ListView_DynamicControl_01.aspx,MonoTests.WebPages.ListView_DynamicControl_01.aspx \ + Test/WebPages/ListView_DynamicControl_01.aspx.cs,MonoTests.WebPages.ListView_DynamicControl_01.aspx.cs \ + Test/WebPages/ListView_DynamicControl_02.aspx,MonoTests.WebPages.ListView_DynamicControl_02.aspx \ + Test/WebPages/ListView_DynamicControl_02.aspx.cs,MonoTests.WebPages.ListView_DynamicControl_02.aspx.cs \ + Test/WebPages/ListView_DynamicControl_03.aspx,MonoTests.WebPages.ListView_DynamicControl_03.aspx \ + Test/WebPages/ListView_DynamicControl_03.aspx.cs,MonoTests.WebPages.ListView_DynamicControl_03.aspx.cs \ + Test/WebPages/ListView_DynamicControl_04.aspx,MonoTests.WebPages.ListView_DynamicControl_04.aspx \ + Test/WebPages/ListView_DynamicControl_04.aspx.cs,MonoTests.WebPages.ListView_DynamicControl_04.aspx.cs \ + Test/WebPages/Site.css,MonoTests.WebPages.Site.css \ + Test/WebPages/Site.master,MonoTests.WebPages.Site.master \ + Test/WebPages/Site.master.cs,MonoTests.WebPages.Site.master.cs \ + Test/WebPages/web.config,MonoTests.WebPages.web.config NUNIT_RESOURCE_FILES = $(TEST_RESOURCE_FILES) -TEST_MCS_FLAGS = $(LIB_MCS_FLAGS) -r:System.ComponentModel.DataAnnotations.dll -r:System.Configuration.dll $(NUNIT_RESOURCE_FILES:%=/resource:%) +TEST_MCS_FLAGS = $(LIB_MCS_FLAGS) -r:System.ComponentModel.DataAnnotations.dll -r:System.Configuration.dll $(NUNIT_RESOURCE_FILES:%=/resource:%) -r:SystemWebTestShim.dll EXTRA_DISTFILES = diff --git a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/ChangeLog b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/ChangeLog index 4d11d1a7fc5..fe4d66769dc 100644 --- a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/ChangeLog +++ b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/ChangeLog @@ -1,3 +1,102 @@ +2009-06-27 Marek Habersack + + * DynamicDataExtensions.cs: implemented ConvertEditedValue + + * MetaModel.cs: implemented DynamicDataFolderVirtualPath + + * DynamicDataRouteHandler.cs: implemented SetRequestMetaTable, + GetCustomPageVirtualPath, GetScaffoldPageVirtualPath and + guessed at implementation of CreateHandler. + +2009-06-26 Marek Habersack + + * MetaModel.cs: RegisterContextCore preserves already registered + tables. + + * DynamicDataRouteHandler.cs: GetRequestContext must not retrieve + route data from the routes collection (if the matching route + happened to be an instance of DynamicDataRoute it would initialize + its RouteHandler's Model property, which is not correct, according + to tests). Instead a new RouteData instance is created each time + we don't find any cached context. + + * DynamicDataRoute.cs: the associated route handler is set its + Model property when we initialize for the first time. + GetRouteData checks whether route data returned by base class + relates to a table which exists in the current context. If no such + table exists, null is returned. + +2009-06-25 Marek Habersack + + * MetaTable.cs: Fixes to make tests succeed. + + * MetaModel.cs: added the GetDataFieldAttributes method for + retrieving attributes associated with data type/field. + Fixes to make tests succeed. + + * MetaColumn.cs: refactoring - use + MetaModel.GetDataFieldAttributes instead of the local version. + + * DynamicDataRouteHandler.cs: implemented GetRequestContext, + GetRequestMetaTable. + + * DynamicDataRoute.cs: when the Action and Table properties are + set before one of GetVirtualPath or GetRouteData methods are + called for the first time, a check is made whether the Defaults + collection exists and whether it contains entries for Action and + Table. Initialization code makes sure those entries are inserted + into the dictionary in those cases. + +2009-06-23 Marek Habersack + + * MetaTable.cs: constructor now takes ContextConfiguration instead + of a boolean and uses the config to determine value of the + ScaffoldAllTables property. Also, if context config is present, + makes sure to register the associated type description provider + (if any) with TypeDescriptor. + + * MetaModel.cs: no longer uses local cache for description + providers. Uses TypeDescriptor.{Add,Get}Provider now. + + * MetaColumn.cs: fixed Scaffold to match tests - IsGenerated and + IsCustomProperty take precedence over Table.ScaffoldAllTables. + GetDataFieldAttribute doesn't use AttributeCollection indexer, as + the latter would create a default instance of the requested + attribute, which is not what we want here. + +2009-06-17 Marek Habersack + + * MetaTable.cs: fixed Scaffold implementation. + Added internal ScaffoldAllTables property. + + * MetaColumn.cs: fixed TypeCode, MaxLength, Scaffold, UIHint + implementations. + Implemented IsLongString, IsBinaryData, IsReadOnly, + NullDisplayText, RequiredErrorMessage + +2009-06-16 Marek Habersack + + * DynamicDataManager.cs, DynamicDataExtensions.cs: use new + DataBoundControl.DataSourceObject instead of + InternalGetDataSource. + +2009-06-15 Marek Habersack + + * MetaColumn.cs: implemented ApplyFormatInEditMode, Attributes, + ConvertEmptyStringToNull, DataFormatString, DataTypeAttribute, + DefaultValue, Description, DisplayName, IsRequired, + IsFloatingPoint, IsInteger, IsString, TypeCode + + * MetaTable.cs: use MetaModel.GetTypeDescriptor to retrieve + associated entity type attributes. + + * MetaModel.cs: implemented registration of type metadata + cache. Metadata is provided by a set of TypeDescriptionProvider + instances (if ContextConfig is present for given model provider) + or by default type description provider (note that this + functionality is not implemented in + System.ComponentModel.TypeDescriptor yet!). + 2009-06-12 Marek Habersack * MetaTable.cs: implemented correct detection of foreign key diff --git a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicControl.cs b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicControl.cs index e623c54eea4..29746dc0a1f 100644 --- a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicControl.cs +++ b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicControl.cs @@ -142,6 +142,9 @@ namespace System.Web.DynamicData [MonoTODO] protected override void OnInit (EventArgs e) { + // It seems _all_ the properties are initialized _only_ here. Further user's + // actions to set the Column property don't affect the other properties + // which derive their values from the associated MetaColumn. base.OnInit (e); } diff --git a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataExtensions.cs b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataExtensions.cs index e00a7af77a4..84e572413e4 100644 --- a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataExtensions.cs +++ b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataExtensions.cs @@ -1,10 +1,11 @@ // // DynamicDataExtensions.cs // -// Author: +// Authors: // Atsushi Enomoto +// Marek Habersack // -// Copyright (C) 2008 Novell Inc. http://novell.com +// Copyright (C) 2008-2009 Novell Inc. http://novell.com // // @@ -44,10 +45,22 @@ namespace System.Web.DynamicData [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public static class DynamicDataExtensions { - [MonoTODO] public static object ConvertEditedValue (this IFieldFormattingOptions formattingOptions, string value) { - throw new NotImplementedException (); + // Not a surprise anymore... + if (formattingOptions == null) + throw new NullReferenceException (); + + if (String.IsNullOrEmpty (value)) { + if (formattingOptions.ConvertEmptyStringToNull) + return null; + } else { + string nullDisplayText = formattingOptions.NullDisplayText; + if (!String.IsNullOrEmpty (nullDisplayText) && String.Compare (value, nullDisplayText, StringComparison.Ordinal) == 0) + return null; + } + + return value; } [MonoTODO] @@ -83,7 +96,7 @@ namespace System.Web.DynamicData while (current != null) { DataBoundControl dbc = current as DataBoundControl; if (dbc != null) { - IDynamicDataSource dds = dbc.InternalGetDataSource () as IDynamicDataSource; + IDynamicDataSource dds = dbc.DataSourceObject as IDynamicDataSource; if (dds != null) return dds.GetTable (); } diff --git a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataManager.cs b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataManager.cs index 372a5673ade..2da68ac4467 100644 --- a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataManager.cs +++ b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataManager.cs @@ -118,7 +118,7 @@ namespace System.Web.DynamicData DataBoundControl dbc = control as DataBoundControl; if (dbc != null) { - IDynamicDataSource dds = dbc.InternalGetDataSource () as IDynamicDataSource; + IDynamicDataSource dds = dbc.DataSourceObject as IDynamicDataSource; if (dds == null) return; diff --git a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataRoute.cs b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataRoute.cs index 763f8985542..d73ca5e07f0 100644 --- a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataRoute.cs +++ b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataRoute.cs @@ -1,10 +1,11 @@ // // DynamicDataRoute.cs // -// Author: +// Authors: // Atsushi Enomoto +// Marek Habersack // -// Copyright (C) 2008 Novell Inc. http://novell.com +// Copyright (C) 2008-2009 Novell Inc. http://novell.com // // @@ -43,6 +44,9 @@ namespace System.Web.DynamicData [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class DynamicDataRoute : Route { + static readonly object initLock = new object (); + bool initDone; + public DynamicDataRoute (string url) : base (url, null) { @@ -55,7 +59,7 @@ namespace System.Web.DynamicData public MetaModel Model { get; set; } public DynamicDataRouteHandler RouteHandler { - get { return (DynamicDataRouteHandler) base.RouteHandler; } + get { return base.RouteHandler as DynamicDataRouteHandler; } set { base.RouteHandler = value; } } @@ -63,6 +67,52 @@ namespace System.Web.DynamicData public string ViewName { get; set; } + void EnsureInitialized () + { + if (initDone) + return; + + // We need to lock since we might be stored in the RouteTable.Routes + // collection which might be accessed from many concurrent requests. + lock (initLock) { + if (initDone) + return; + + initDone = true; + + DynamicDataRouteHandler rh = RouteHandler; + if (rh != null) + rh.Model = Model; + + string action = Action, table = Table; + if (action == null && table == null) + return; + + RouteValueDictionary defaults = Defaults; + if (defaults == null) + Defaults = defaults = new RouteValueDictionary (); + + if (table != null) { + // Force check for table existence + MetaModel model = Model ?? MetaModel.Default; + if (model != null) + Model.GetTable (table); + + if (defaults.ContainsKey ("Table")) + defaults ["Table"] = table; + else + defaults.Add ("Table", table); + } + + if (action != null) { + if (defaults.ContainsKey ("Action")) + defaults ["Action"] = action; + else + defaults.Add ("Action", action); + } + } + } + public string GetActionFromRouteData (RouteData routeData) { if (routeData == null) @@ -72,8 +122,17 @@ namespace System.Web.DynamicData public override RouteData GetRouteData (HttpContextBase httpContext) { - var rd = base.GetRouteData (httpContext); - // FIXME: something to do here? + EnsureInitialized (); + RouteData rd = base.GetRouteData (httpContext); + + if (rd == null) + return null; + + MetaModel model = Model ?? MetaModel.Default; + MetaTable table; + if (model == null || !model.TryGetTable (rd.GetRequiredString ("Table"), out table)) + return null; + return rd; } @@ -90,11 +149,8 @@ namespace System.Web.DynamicData public override VirtualPathData GetVirtualPath (RequestContext requestContext, RouteValueDictionary values) { - var rd = requestContext.RouteData; - var t = GetTableFromRouteData (rd); - var a = GetActionFromRouteData (rd); - var vp = String.Concat (t.GetActionPath (a)); - return new VirtualPathData (this, vp); + EnsureInitialized (); + return base.GetVirtualPath (requestContext, values); } } } diff --git a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataRouteHandler.cs b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataRouteHandler.cs index b443096eba6..0fe003fbc90 100644 --- a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataRouteHandler.cs +++ b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/DynamicDataRouteHandler.cs @@ -1,10 +1,11 @@ // // DynamicDataRouteHandler.cs // -// Author: +// Authors: // Atsushi Enomoto +// Marek Habersack // -// Copyright (C) 2008 Novell Inc. http://novell.com +// Copyright (C) 2008-2009 Novell Inc. http://novell.com // // @@ -35,8 +36,10 @@ using System.Data.Linq.Mapping; using System.Globalization; using System.Security.Permissions; using System.Security.Principal; +using System.Threading; using System.Web.Caching; using System.Web.Compilation; +using System.Web.Hosting; using System.Web.Routing; using System.Web.UI; @@ -46,23 +49,83 @@ namespace System.Web.DynamicData [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class DynamicDataRouteHandler : IRouteHandler { - [MonoTODO] + static ReaderWriterLockSlim contextsLock = new ReaderWriterLockSlim (); + + static Dictionary contexts = new Dictionary (); + Dictionary handlers; + + Dictionary Handlers { + get { + if (handlers == null) + handlers = new Dictionary (); + + return handlers; + } + } + + static RouteContext GetOrCreateRouteContext (HttpContext httpContext) + { + RouteContext rc = null; + bool locked = false; + try { + contextsLock.EnterReadLock (); + locked = true; + if (contexts.TryGetValue (httpContext, out rc) && rc != null) + return rc; + } finally { + if (locked) + contextsLock.ExitReadLock (); + } + + locked = false; + try { + contextsLock.EnterWriteLock (); + locked = true; + rc = MakeRouteContext (new RequestContext (new HttpContextWrapper (httpContext), new RouteData ()), null, null, null); + contexts.Add (httpContext, rc); + } finally { + if (locked) + contextsLock.ExitWriteLock (); + } + + return rc; + } + public static RequestContext GetRequestContext (HttpContext httpContext) { - // HttpRequestBase.QueryString - throw new NotImplementedException (); + if (httpContext == null) + throw new ArgumentNullException ("httpContext"); + + return GetOrCreateRouteContext (httpContext).Context; } - [MonoTODO] public static MetaTable GetRequestMetaTable (HttpContext httpContext) { - throw new NotImplementedException (); + if (httpContext == null) + throw new ArgumentNullException ("httpContext"); + + RouteContext rc; + bool locked = false; + try { + contextsLock.EnterReadLock (); + locked = true; + if (contexts.TryGetValue (httpContext, out rc) && rc != null) + return rc.Table; + } finally { + if (locked) + contextsLock.ExitReadLock (); + } + + return null; } - [MonoTODO] public static void SetRequestMetaTable (HttpContext httpContext, MetaTable table) { - throw new NotImplementedException (); + // And tradiationally... some .NET emulation code + if (httpContext == null) + throw new NullReferenceException (); + + GetOrCreateRouteContext (httpContext).Table = table; } public DynamicDataRouteHandler () @@ -71,23 +134,60 @@ namespace System.Web.DynamicData public MetaModel Model { get; internal set; } - [MonoTODO] + [MonoTODO ("Needs a working test")] public virtual IHttpHandler CreateHandler (DynamicDataRoute route, MetaTable table, string action) { - var vp = String.Concat (String.Concat (HttpContext.Current.Request.ApplicationPath, "DynamicData/PageTemplates/", action, ".aspx")); - return (IHttpHandler) BuildManager.CreateInstanceFromVirtualPath (vp, typeof (Page)); + // .NET bug emulation mode + if (route == null || table == null || action == null) + throw new NullReferenceException (); + + // NOTE: all code below is a result of guessing as no tests succeed for this + // call so far! + + IHttpHandler ret = null; + + // Give custom pages a chance + string viewName = String.IsNullOrEmpty (action) ? route.ViewName : action; + string path = GetCustomPageVirtualPath (table, viewName); + + // Pages might be in app resources, need to use a VPP + VirtualPathProvider vpp = HostingEnvironment.VirtualPathProvider; + + if (vpp != null && vpp.FileExists (path)) + ret = BuildManager.CreateInstanceFromVirtualPath (path, typeof (Page)) as IHttpHandler; + + if (ret != null) + return ret; + + path = GetScaffoldPageVirtualPath (table, viewName); + if (vpp != null && vpp.FileExists (path)) + ret = BuildManager.CreateInstanceFromVirtualPath (path, typeof (Page)) as IHttpHandler; + + return ret; } - [MonoTODO] protected virtual string GetCustomPageVirtualPath (MetaTable table, string viewName) { - throw new NotImplementedException (); + // No such checks are made in .NET, we won't follow the pattern... + MetaModel model = Model; + if (table == null || model == null) + throw new NullReferenceException (); // yuck + + // Believe it or not, this is what .NET does - pass a null/empty viewName + // and you get /.aspx at the end... + return model.DynamicDataFolderVirtualPath + "CustomPages/" + table.Name + "/" + viewName + ".aspx"; } - [MonoTODO] protected virtual string GetScaffoldPageVirtualPath (MetaTable table, string viewName) { - throw new NotImplementedException (); + // No such checks are made in .NET, we won't follow the pattern... + MetaModel model = Model; + if (table == null || model == null) + throw new NullReferenceException (); // yuck + + // Believe it or not, this is what .NET does - pass a null/empty viewName + // and you get /.aspx at the end... + return model.DynamicDataFolderVirtualPath + "PageTemplates/" + viewName + ".aspx"; } IHttpHandler IRouteHandler.GetHttpHandler (RequestContext requestContext) @@ -95,39 +195,77 @@ namespace System.Web.DynamicData if (requestContext == null) throw new ArgumentNullException ("requestContext"); RouteData rd = requestContext.RouteData; - DynamicDataRoute dr = rd.Route as DynamicDataRoute; + var dr = rd.Route as DynamicDataRoute; if (dr == null) throw new ArgumentException ("The argument RequestContext does not have DynamicDataRoute in its RouteData"); - var action = dr.GetActionFromRouteData (rd); - var mt = dr.GetTableFromRouteData (rd); - - var rc = new RouteContext () { Route = dr, Action = action, Table = mt }; + string action = dr.GetActionFromRouteData (rd); + MetaTable mt = dr.GetTableFromRouteData (rd); + RouteContext rc = MakeRouteContext (requestContext, dr, action, mt); IHttpHandler h; + + Dictionary handlers = Handlers; if (handlers.TryGetValue (rc, out h)) return h; h = CreateHandler (dr, mt, action); - handlers [rc] = h; + handlers.Add (rc, h); return h; } - class RouteContext + static RouteContext MakeRouteContext (RequestContext context, DynamicDataRoute route, string action, MetaTable table) + { + RouteData rd = null; + + if (route == null) { + rd = context.RouteData; + route = rd.Route as DynamicDataRoute; + } + + if (route != null) { + if (action == null) { + if (rd == null) + rd = context.RouteData; + action = route.GetActionFromRouteData (rd); + } + + if (table == null) { + if (rd == null) + rd = context.RouteData; + + table = route.GetTableFromRouteData (rd); + } + } + + return new RouteContext () { + Route = route, + Action = action, + Table = table, + Context = context}; + } + + sealed class RouteContext { public DynamicDataRoute Route; public string Action; public MetaTable Table; + public RequestContext Context; + public RouteContext () + { + } + public override bool Equals (object obj) { RouteContext other = obj as RouteContext; - return other.Route == Route & other.Action == Action && other.Table == Table; + return other.Route == Route & other.Action == Action && other.Table == Table && other.Context == Context; } public override int GetHashCode () { - return (Route.GetHashCode () << 19) + (Action.GetHashCode () << 9) + Table.GetHashCode (); + return (Route != null ? Route.GetHashCode () << 27 : 0) + + (Action != null ? Action.GetHashCode () << 19 : 0) + + (Table != null ? Table.GetHashCode () << 9 : 0) + + (Context != null ? Context.GetHashCode () : 0); } } - - Dictionary handlers = new Dictionary (); } } diff --git a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaColumn.cs b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaColumn.cs index f623c87fdab..9939fe8c402 100644 --- a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaColumn.cs +++ b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaColumn.cs @@ -35,6 +35,7 @@ using System.Collections.Specialized; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Globalization; +using System.Linq; using System.Reflection; using System.Security.Permissions; using System.Security.Principal; @@ -47,62 +48,177 @@ namespace System.Web.DynamicData [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class MetaColumn : IFieldFormattingOptions { - MemberInfo dataFieldInfo; - string uiHint; + // (Int32.MaxValue / 2) - 5 + const int SHORT_STRING_MAX_LENGTH = 0x3ffffffa; + bool? scaffold; bool? scaffoldReflected; + bool? applyFormatInEditMode; + bool? convertEmptyStringToNull; + bool dataTypeReflected; + bool defaultValueReflected; + bool descriptionReflected; + bool requiredReflected; + bool uiHintReflected; + + string dataFormatString; + PropertyDescriptor property; + object defaultValue; + string description; + string displayName; + bool? readOnly; + int? maxLength; + string nullDisplayText; + string requiredErrorMessage; + string uiHint; + + // Attributes + AttributeCollection attributes; + + DisplayFormatAttribute displayFormatAttr; + DataTypeAttribute dataTypeAttr; + ScaffoldColumnAttribute scaffoldAttr; + RequiredAttribute requiredAttr; internal MetaColumn (MetaTable table, ColumnProvider provider) { Table = table; Provider = provider; Model = table.Model; + HtmlEncode = true; + + Type columnType = ColumnType; + TypeCode code = Type.GetTypeCode (columnType); + TypeCode = code; + switch (code) { + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + IsFloatingPoint = true; + break; + + case TypeCode.Byte: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + IsInteger = true; + break; + + case TypeCode.String: + IsString = true; + break; + + case TypeCode.Object: + // So far only byte[] seems to be treated as a binary type + if (columnType.IsArray && columnType.GetArrayRank () == 1 && columnType.GetElementType () == typeof (byte)) + IsBinaryData = true; + break; + + default: + TypeCode = TypeCode.Object; + break; + } + + IsLongString = MaxLength > SHORT_STRING_MAX_LENGTH; } - [MonoTODO] - public bool ApplyFormatInEditMode { get; private set; } + public bool ApplyFormatInEditMode { + get { + if (applyFormatInEditMode == null) + applyFormatInEditMode = CheckApplyFormatInEditMode (); - [MonoTODO] - public AttributeCollection Attributes { get; private set; } + return (bool)applyFormatInEditMode; + } + } + + public AttributeCollection Attributes { + get { + if (attributes == null) + attributes = LoadAttributes (); + + return attributes; + } + + } public Type ColumnType { get { return Provider.ColumnType; } } - [MonoTODO] - public bool ConvertEmptyStringToNull { get; private set; } + public bool ConvertEmptyStringToNull { + get { + if (convertEmptyStringToNull == null) + convertEmptyStringToNull = CheckConvertEmptyStringToNull (); + + return (bool)convertEmptyStringToNull; + } + + } - [MonoTODO] - public string DataFormatString { get; private set; } + public string DataFormatString { + get { + if (dataFormatString == null) + dataFormatString = CheckDataFormatString (); + + return dataFormatString; + } + } - [MonoTODO] - public DataTypeAttribute DataTypeAttribute { get; internal set; } + public DataTypeAttribute DataTypeAttribute { + get { + if (!dataTypeReflected && dataTypeAttr == null) + dataTypeAttr = CheckDataTypeAttribute (); + + return dataTypeAttr; + } + + } + + public Object DefaultValue { + get { + if (!defaultValueReflected && defaultValue == null) { + DefaultValueAttribute defaultValueAttr = CheckDefaultValueAttribute (); + if (defaultValueAttr != null) + defaultValue = defaultValueAttr.Value; + } + + return defaultValue; + } + } - [MonoTODO] - public Object DefaultValue { get; private set; } + public string Description { + get { + if (!descriptionReflected && description == null) { + DescriptionAttribute descriptionAttr = CheckDescriptionAttribute (); + if (descriptionAttr != null) + description = descriptionAttr.Description; + } - [MonoTODO] - public string Description { get; private set; } + return description; + } + } public string DisplayName { - get { return Provider.Name; } + get { + if (displayName == null) + displayName = CheckDisplayName (); + + return displayName; + } } public PropertyInfo EntityTypeProperty { get { return Provider.EntityTypeProperty; } } - [MonoTODO] public bool HtmlEncode { get; private set; } - [MonoTODO] public bool IsBinaryData { get; private set; } public bool IsCustomProperty { get { return Provider.IsCustomProperty; } } - [MonoTODO] public bool IsFloatingPoint { get; private set; } public bool IsForeignKeyComponent { @@ -113,27 +229,46 @@ namespace System.Web.DynamicData get { return Provider.IsGenerated; } } - [MonoTODO] public bool IsInteger { get; private set; } - [MonoTODO] public bool IsLongString { get; private set; } public bool IsPrimaryKey { get { return Provider.IsPrimaryKey; } } - [MonoTODO] - public bool IsReadOnly { get; private set; } + public bool IsReadOnly { + get { + if (readOnly == null) + readOnly = CheckReadOnlyAttribute (); + + return (bool)readOnly; + } + } + + // It appears that all columns are required unless Provider.Nullable is true for + // them. We could skip checking for the RequiredAttribute for that reason, but that + // way we wouldn't be forward-compatible. + // What's more, it appears that a RequiredAttribute instance is always included in + // Attributes, whether or not the corresponding field is decorataed with it. + public bool IsRequired { + get { + if (!requiredReflected && requiredAttr == null) + requiredAttr = CheckRequiredAttribute (); - [MonoTODO] - public bool IsRequired { get; private set; } + return requiredAttr != null; + } + } - [MonoTODO] public bool IsString { get; private set; } public int MaxLength { - get { return Provider.MaxLength; } + get { + if (maxLength == null) + maxLength = CheckMaxLength (); + + return (int)maxLength; + } } public MetaModel Model { get; private set; } @@ -142,31 +277,52 @@ namespace System.Web.DynamicData get { return Provider.Name; } } - [MonoTODO] - public string NullDisplayText { get; private set; } + public string NullDisplayText { + get { + if (nullDisplayText == null) + nullDisplayText = CheckNullDisplayText (); + + return nullDisplayText; + } + } public ColumnProvider Provider { get; private set; } - [MonoTODO] - public string RequiredErrorMessage { get; private set; } + public string RequiredErrorMessage { + get { + if (requiredErrorMessage == null) { + RequiredAttribute attr = CheckRequiredAttribute (); + if (attr == null) + requiredErrorMessage = String.Empty; + else + requiredErrorMessage = attr.ErrorMessage; + } + + return requiredErrorMessage; + } + } public bool Scaffold { get { if (scaffold != null) return (bool)scaffold; if (scaffoldReflected != null) - return (bool)scaffoldReflected; - - ScaffoldColumnAttribute attr = GetDataFieldAttribute (); - if (attr != null) { - scaffoldReflected = attr.Scaffold; + return (bool)scaffoldReflected; + + MetaModel.GetDataFieldAttribute (Attributes, ref scaffoldAttr); + if (scaffoldAttr != null) { + scaffoldReflected = scaffoldAttr.Scaffold; return (bool)scaffoldReflected; } - if (UIHint.Length > 0) + string uiHint = UIHint; + if (!String.IsNullOrEmpty (uiHint)) scaffoldReflected = true; - else if (IsCustomProperty || IsGenerated || IsCustomProperty) + // LAMESPEC: IsForeignKeyComponent does NOT set Scaffold=false + else if (IsGenerated || IsCustomProperty) scaffoldReflected = false; + else if (Table.ScaffoldAllTables) + scaffoldReflected = true; else scaffoldReflected = true; @@ -188,75 +344,182 @@ namespace System.Web.DynamicData public MetaTable Table { get; private set; } - [MonoTODO] public TypeCode TypeCode { get; private set; } + // LAMESPEC: if there's no attribute, null is returned public string UIHint { get { - if (uiHint != null) - return uiHint; - - UIHintAttribute attr = GetDataFieldAttribute (); - if (attr == null) { - uiHint = String.Empty; - return uiHint; - } - - uiHint = attr.UIHint; + if (!uiHintReflected && uiHint == null) + uiHint = CheckUIHintAttribute (); + return uiHint; } } - T GetDataFieldAttribute () where T: Attribute + string CheckUIHintAttribute () { - MemberInfo mi = LoadFieldInfo (); - if (mi == null) - return null; + if (uiHintReflected) + return uiHint; + + uiHintReflected = true; + UIHintAttribute attr = null; + MetaModel.GetDataFieldAttribute (Attributes, ref attr); - object[] attrs = mi.GetCustomAttributes (typeof (T), true); - if (attrs.Length == 0) + if (attr == null) return null; - return attrs [0] as T; + return attr.UIHint; } + + bool CheckApplyFormatInEditMode () + { + var displayFormat = GetDisplayFormat (); + if (displayFormat == null) + return false; - const BindingFlags DATA_FIELD_BINDING_FLAGS = BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy; - MemberInfo LoadFieldInfo () + return displayFormat.ApplyFormatInEditMode; + } + + bool CheckConvertEmptyStringToNull () { - if (dataFieldInfo != null) - return dataFieldInfo; + var displayFormat = GetDisplayFormat (); + if (displayFormat == null) + return true; - MetaTable table = Table; - Type contextType = table.DataContextType; - if (contextType == null) - return null; + return displayFormat.ConvertEmptyStringToNull; + } + + string CheckDataFormatString () + { + var displayFormat = GetDisplayFormat (); + if (displayFormat == null) + return String.Empty; + + return displayFormat.DataFormatString; + } + + DataTypeAttribute CheckDataTypeAttribute () + { + if (dataTypeReflected) + return dataTypeAttr; - PropertyInfo pi = contextType.GetProperty (table.DataContextPropertyName, DATA_FIELD_BINDING_FLAGS); - if (pi == null) + dataTypeReflected = true; + MetaModel.GetDataFieldAttribute (Attributes, ref dataTypeAttr); + if (dataTypeAttr == null && (ColumnType == typeof (string))) + return new DataTypeAttribute (DataType.Text); + + return dataTypeAttr; + } + + DefaultValueAttribute CheckDefaultValueAttribute () + { + defaultValueReflected = true; + DefaultValueAttribute dummy = null; + MetaModel.GetDataFieldAttribute (Attributes, ref dummy); + if (dummy == null) return null; - contextType = pi.PropertyType; - if (contextType.IsGenericTypeDefinition) + + return dummy; + } + + DescriptionAttribute CheckDescriptionAttribute () + { + descriptionReflected = true; + DescriptionAttribute dummy = null; + MetaModel.GetDataFieldAttribute (Attributes, ref dummy); + if (dummy == null) return null; - if (contextType.IsGenericType) { - try { - Type[] types = contextType.GetGenericArguments (); - if (types.Length == 0) - return null; - contextType = types [0]; - } catch (Exception ex) { - return null; - } + + return dummy; + } + + string CheckDisplayName () + { + DisplayNameAttribute attr = null; + MetaModel.GetDataFieldAttribute (Attributes, ref attr); + if (attr != null) + return attr.DisplayName; + + return Name; + } + + RequiredAttribute CheckRequiredAttribute () + { + if (requiredReflected) + return requiredAttr; + + requiredReflected = true; + MetaModel.GetDataFieldAttribute (Attributes, ref requiredAttr); + + return requiredAttr; + } + + bool CheckReadOnlyAttribute () + { + ReadOnlyAttribute attr = null; + MetaModel.GetDataFieldAttribute (Attributes, ref attr); + + // Apparently attr.IsReadOnly and/or comparisons to + // ReadOnlyAttribute.{Yes,No} don't matter. The sole presence of the + // attribute marks column as read-only + return attr != null; + } + + int CheckMaxLength () + { + StringLengthAttribute attr = null; + MetaModel.GetDataFieldAttribute (Attributes, ref attr); + + if (attr != null) + return attr.MaximumLength; + + return Provider.MaxLength; + } + + string CheckNullDisplayText () + { + DisplayFormatAttribute displayFormat = GetDisplayFormat (); + + if (displayFormat == null) + return String.Empty; + + return displayFormat.NullDisplayText; + } + + DisplayFormatAttribute GetDisplayFormat () + { + MetaModel.GetDataFieldAttribute (Attributes, ref displayFormatAttr); + if (displayFormatAttr == null) { + var dta = DataTypeAttribute; + displayFormatAttr = dta == null ? null : dta.DisplayFormat; } - - MemberInfo[] mis = contextType.GetMember (Name, MemberTypes.Field | MemberTypes.Property, DATA_FIELD_BINDING_FLAGS); - if (mis.Length == 0) - return null; - dataFieldInfo = mis [0]; - return dataFieldInfo; + return displayFormatAttr; + } + + AttributeCollection LoadAttributes () + { + var props = MetaModel.GetTypeDescriptor (Table.EntityType).GetProperties (); + AttributeCollection reflected; + + int propsCount = props == null ? 0 : props.Count; + if (propsCount == 0) + reflected = AttributeCollection.Empty; + else { + var property = props.Find (Name, true); + if (property == null) + reflected = AttributeCollection.Empty; + else + reflected = property.Attributes; + } + + if (!Provider.Nullable && reflected.OfType ().Count () == 0) + reflected = AttributeCollection.FromExisting (reflected, new Attribute[] { new RequiredAttribute () }); + + return reflected; } - public override string ToString () + public override string ToString () { return Name; } diff --git a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaModel.cs b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaModel.cs index 19a3b7f5e6e..f3a4a709dc9 100644 --- a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaModel.cs +++ b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaModel.cs @@ -1,8 +1,9 @@ // // MetaModel.cs // -// Author: +// Authors: // Atsushi Enomoto +// Marek Habersack // // Copyright (C) 2008 Novell Inc. http://novell.com // @@ -45,10 +46,17 @@ namespace System.Web.DynamicData [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class MetaModel { + const string DEFAULT_DYNAMIC_DATA_VIRTUAL_FOLDER_PATH = "~/DynamicData/"; + + static object registered_models_lock = new object (); + static MetaModel default_model; static Exception registration_exception; - static Dictionary registered_models = new Dictionary (); + static Dictionary registered_models; + DataModelProvider provider; + string dynamicDataFolderVirtualPath; + public static MetaModel Default { get { return default_model; } internal set { default_model = value; } @@ -60,9 +68,10 @@ namespace System.Web.DynamicData throw new ArgumentNullException ("contextType"); MetaModel m; - if (registered_models.TryGetValue (contextType, out m)) - return m; - throw new InvalidOperationException (String.Format ("Type '{0}' is not registered as a MetaModel", contextType)); + if (!TryGetModel (contextType, out m)) + throw new InvalidOperationException (String.Format ("Type '{0}' is not registered as a MetaModel", contextType)); + + return m; } public static void ResetRegistrationException () @@ -75,16 +84,26 @@ namespace System.Web.DynamicData if (default_model == null) default_model = this; - DynamicDataFolderVirtualPath = "~/DynamicData/"; FieldTemplateFactory = new FieldTemplateFactory (); Tables = new ReadOnlyCollection (new MetaTable [0]); VisibleTables = new List (); } - DataModelProvider provider; - + public string DynamicDataFolderVirtualPath { + get { + if (dynamicDataFolderVirtualPath == null) + return DEFAULT_DYNAMIC_DATA_VIRTUAL_FOLDER_PATH; - public string DynamicDataFolderVirtualPath { get; set; } + return dynamicDataFolderVirtualPath; + } + + set { + if (!String.IsNullOrEmpty (value)) + dynamicDataFolderVirtualPath = VirtualPathUtility.AppendTrailingSlash (value); + else + dynamicDataFolderVirtualPath = value; + } + } public IFieldTemplateFactory FieldTemplateFactory { get; set; } @@ -92,24 +111,31 @@ namespace System.Web.DynamicData public List VisibleTables { get; private set; } + void CheckRegistrationError () + { + if (registration_exception != null) + throw new InvalidOperationException ("An error occured during context model registration", registration_exception); + } + public string GetActionPath (string tableName, string action, object row) { return GetTable (tableName).GetActionPath (action, row); } - public bool TryGetTable (string uniqueTableName, out MetaTable table) + internal static void GetDataFieldAttribute (AttributeCollection attributes, ref T backingField) where T: Attribute { - if (uniqueTableName == null) - throw new ArgumentNullException ("uniqueTableName"); - foreach (var t in Tables) - if (t.Name == uniqueTableName) { - table = t; - return true; - } - table = null; - return false; - } + if (backingField != null) + return; + + foreach (Attribute attr in attributes) { + if (attr == null || !typeof (T).IsAssignableFrom (attr.GetType ())) + continue; + backingField = attr as T; + break; + } + } + public MetaTable GetTable (string uniqueTableName) { MetaTable mt; @@ -122,22 +148,30 @@ namespace System.Web.DynamicData { if (entityType == null) throw new ArgumentNullException ("entityType"); - if (provider != null) - foreach (var t in Tables) - if (t.EntityType == entityType) - return t; + + foreach (var t in Tables) { + if (t.EntityType == entityType) + return t; + } + throw new ArgumentException (String.Format ("Entity type '{0}' does not exist in registered context", entityType)); } public MetaTable GetTable (string tableName, Type contextType) { + if (tableName == null) + throw new ArgumentNullException ("tableName"); + + MetaModel model; + if (contextType != null && !TryGetModel (contextType, out model)) + throw new ArgumentException ("Unknown context type '" + contextType + "'. This context type has not been registered."); + return GetModel (contextType).GetTable (tableName); } - - void CheckRegistrationError () + + internal static ICustomTypeDescriptor GetTypeDescriptor (Type type) { - if (registration_exception != null) - throw new InvalidOperationException ("An error occured during context model registration", registration_exception); + return TypeDescriptor.GetProvider (type).GetTypeDescriptor (type); } public void RegisterContext (Func contextFactory) @@ -161,7 +195,7 @@ namespace System.Web.DynamicData throw new ArgumentNullException ("contextType"); CheckRegistrationError (); RegisterContext (() => Activator.CreateInstance (contextType), configuration); - registered_models [contextType] = this; + RegisterModel (contextType, this, configuration); } public void RegisterContext (Func contextFactory, ContextConfiguration configuration) @@ -193,11 +227,63 @@ namespace System.Web.DynamicData void RegisterContextCore (DataModelProvider dataModelProvider, ContextConfiguration configuration) { - var l = new List (); + var l = new List (Tables); foreach (var t in dataModelProvider.Tables) - l.Add (new MetaTable (this, t, configuration != null && configuration.ScaffoldAllTables)); + l.Add (new MetaTable (this, t, configuration)); + Tables = new ReadOnlyCollection (l); VisibleTables = l; + RegisterModel (dataModelProvider.ContextType, this, configuration); + } + + static void RegisterModel (Type contextType, MetaModel model, ContextConfiguration configuration) + { + lock (registered_models_lock) { + if (registered_models == null) + registered_models = new Dictionary (); + + if (registered_models.ContainsKey (contextType)) + return; + + registered_models.Add (contextType, model); + } + RegisterTypeDescriptionProvider (contextType, configuration); + } + + static void RegisterTypeDescriptionProvider (Type type, ContextConfiguration config) + { + Func factory = config == null ? null : config.MetadataProviderFactory; + if (config == null || factory == null) + return; + + TypeDescriptionProvider provider = factory (type); + if (provider == null) + return; + + TypeDescriptor.AddProvider (provider, type); + } + + public bool TryGetTable (string uniqueTableName, out MetaTable table) + { + if (uniqueTableName == null) + throw new ArgumentNullException ("uniqueTableName"); + foreach (var t in Tables) + if (t.Name == uniqueTableName) { + table = t; + return true; + } + table = null; + return false; + } + + static bool TryGetModel (Type contextType, out MetaModel model) + { + model = null; + if (registered_models != null && registered_models.TryGetValue (contextType, out model)) + return model != null; + + return false; } + } } diff --git a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaTable.cs b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaTable.cs index cc25b594d75..0acb5f5554b 100644 --- a/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaTable.cs +++ b/mcs/class/System.Web.DynamicData/System.Web.DynamicData/MetaTable.cs @@ -63,12 +63,28 @@ namespace System.Web.DynamicData bool displayColumnChecked; bool sortColumnChecked; - internal MetaTable (MetaModel model, TableProvider provider, bool scaffold) + internal MetaTable (MetaModel model, TableProvider provider, ContextConfiguration configuration) { + bool scaffoldAllTables; + this.model = model; Provider = provider; - Scaffold = scaffold; - + if (configuration != null) { + ScaffoldAllTables = scaffoldAllTables = configuration.ScaffoldAllTables; + Func factory = configuration.MetadataProviderFactory; + if (factory != null) { + Type t = EntityType; + TypeDescriptionProvider p = factory (t); + if (p != null) + TypeDescriptor.AddProvider (p, t); + } + } else + scaffoldAllTables = false; + + ScaffoldTableAttribute attr = null; + MetaModel.GetDataFieldAttribute (Attributes, ref attr); + Scaffold = attr != null ? attr.Scaffold : scaffoldAllTables; + var columns = new List (); var primaryKeyColumns = new List (); var foreignKeyColumnNames = new List (); @@ -126,9 +142,9 @@ namespace System.Web.DynamicData public global::System.ComponentModel.AttributeCollection Attributes { get { if (attributes == null) { - attributes = TypeDescriptor.GetAttributes (EntityType); - if (attributes == null) - attributes = new global::System.ComponentModel.AttributeCollection (null); + ICustomTypeDescriptor descriptor = MetaModel.GetTypeDescriptor (EntityType); + if (descriptor != null) + attributes = descriptor.GetAttributes (); } return attributes; @@ -172,7 +188,7 @@ namespace System.Web.DynamicData public bool IsReadOnly { get; private set; } public string ListActionPath { - get { return GetActionPath ("List"); } + get { return GetActionPath (PageAction.List); } } public MetaModel Model { @@ -189,6 +205,8 @@ namespace System.Web.DynamicData public bool Scaffold { get; private set; } + internal bool ScaffoldAllTables { get; private set; } + public MetaColumn SortColumn { get { if (sortColumn == null) @@ -207,29 +225,54 @@ namespace System.Web.DynamicData } } + string BuildActionPath (string path, RouteValueDictionary values) + { + var sb = new StringBuilder (); + + sb.Append (path); + if (values != null && values.Count > 0) { + sb.Append ('?'); + + bool first = true; + foreach (var de in values) { + if (first) + first = false; + else + sb.Append ('&'); + + sb.Append (Uri.EscapeDataString (de.Key)); + sb.Append ('='); + + object parameterValue = de.Value; + if (parameterValue != null) + sb.Append (Uri.EscapeDataString (parameterValue.ToString ())); + } + } + + return sb.ToString (); + } + public object CreateContext () { - return Activator.CreateInstance (EntityType); + return Activator.CreateInstance (DataContextType); } string DetermineDisplayName () { - DisplayNameAttribute attr = Attributes [typeof (DisplayNameAttribute)] as DisplayNameAttribute; + DisplayNameAttribute attr = null; + MetaModel.GetDataFieldAttribute (Attributes, ref attr); if (attr == null) return Name; - - string name = attr.DisplayName; - if (name == null) - return String.Empty; - - return name; + + return attr.DisplayName; } bool DetermineSortDescending () { - DisplayColumnAttribute attr = Attributes [typeof (DisplayColumnAttribute)] as DisplayColumnAttribute; - + DisplayColumnAttribute attr = null; + + MetaModel.GetDataFieldAttribute (Attributes, ref attr); if (attr == null) return false; @@ -278,10 +321,11 @@ namespace System.Web.DynamicData } // 2. The first string column that is not in the primary key. + // LAMESPEC: also a column which is not a custom one ReadOnlyCollection pkc = PrimaryKeyColumns; bool havePkc = pkc.Count > 0; foreach (MetaColumn mc in columns) { - if (havePkc && pkc.Contains (mc)) + if (mc.IsCustomProperty || (havePkc && pkc.Contains (mc))) continue; if (mc.ColumnType == typeof (string)) return mc; @@ -352,6 +396,9 @@ namespace System.Web.DynamicData public string GetActionPath (string action, IList primaryKeyValues) { + if (String.IsNullOrEmpty (action)) + return String.Empty; + var values = new RouteValueDictionary (); values.Add ("Action", action); values.Add ("Table", Name); @@ -374,6 +421,9 @@ namespace System.Web.DynamicData public string GetActionPath (string action, RouteValueDictionary routeValues) { + if (String.IsNullOrEmpty (action)) + return String.Empty; + // .NET doesn't check whether routeValues is null, we'll just "implement" // the behavior here... if (routeValues == null) @@ -391,16 +441,12 @@ namespace System.Web.DynamicData public string GetActionPath (string action, IList primaryKeyValues, string path) { + if (String.IsNullOrEmpty (path)) + return GetActionPath (action, primaryKeyValues); + var values = new RouteValueDictionary (); - values.Add ("Action", String.IsNullOrEmpty (path) ? action : path); - values.Add ("Table", Name); - FillWithPrimaryKeys (values, primaryKeyValues); - - // To see that this internal method is called, comment out setting of - // HttpContext in the GetActionPath_Action_PrimaryKeyValues test and look at - // the stack trace - return GetActionPathFromRoutes (values); + return BuildActionPath (path, values); } public string GetActionPath (string action, object row, string path) @@ -525,7 +571,7 @@ namespace System.Web.DynamicData public bool TryGetColumn (string columnName, out MetaColumn column) { - if (String.IsNullOrEmpty (columnName)) + if (columnName == null) throw new ArgumentNullException ("columnName"); foreach (var m in Columns) diff --git a/mcs/class/System.Web.DynamicData/System.Web.DynamicData_test.dll.sources b/mcs/class/System.Web.DynamicData/System.Web.DynamicData_test.dll.sources index 0b403238fe9..ae31f25cebd 100644 --- a/mcs/class/System.Web.DynamicData/System.Web.DynamicData_test.dll.sources +++ b/mcs/class/System.Web.DynamicData/System.Web.DynamicData_test.dll.sources @@ -1,4 +1,3 @@ -../../System.Web/Test/mainsoft/MainsoftWebTest/HtmlAgilityPack/AssemblyInfo.cs ../../System.Web/Test/mainsoft/MainsoftWebTest/HtmlAgilityPack/crc32.cs ../../System.Web/Test/mainsoft/MainsoftWebTest/HtmlAgilityPack/Header.cs ../../System.Web/Test/mainsoft/MainsoftWebTest/HtmlAgilityPack/HtmlAttribute.cs @@ -33,13 +32,21 @@ ../../System.Web/Test/mainsoft/NunitWeb/NunitWeb/Response.cs ../../System.Web/Test/mainsoft/NunitWeb/NunitWeb/StandardUrl.cs ../../System.Web/Test/mainsoft/NunitWeb/NunitWeb/WebTest.cs +../../System.Web/Test/mainsoft/NunitWeb/NunitWeb/WebTestResourcesSetupAttribute.cs +Assembly/AssemblyInfo.cs +Common/AFieldTemplate.cs Common/AssertExtensions.cs Common/AssociatedBar.cs Common/AssociatedFoo.cs +Common/BazColumnAttributes.cs Common/Baz.cs +Common/BazDataTypeDefaultTypes.cs Common/BazNoStrings.cs Common/BazNoStringsNoPrimary.cs +Common/EmployeesDataContext.cs Common/FakeHttpWorkerRequest.cs +Common/FieldFormattingOptions.cs +Common/FooBarNoScaffold.cs Common/FooDisplayColumnAttribute.cs Common/FooDisplayName.cs Common/FooDisplayNameEmptyName.cs @@ -54,14 +61,23 @@ Common/FooNoScaffold.cs Common/FooReadOnly.cs Common/FooSettableDefaults.cs Common/FooWithDefaults.cs +Common/FooWithMetadataType.cs Common/FooWithToString.cs Common/ITestDataContext.cs Common/KnownResponseHeader.cs +Common/MiscExtensions.cs Common/Mocks.cs +Common/MyDynamicDataRouteHandler.cs +Common/MyHttpContextWrapper.cs +Common/MyHttpRequestWrapper.cs +Common/PokerDynamicControl.cs Common/TestDataColumn.cs Common/TestDataContainer.cs +Common/TestDataContext2.cs Common/TestDataContext.cs Common/TestDataTable.cs +Common/TestsBasePage.cs +Common/TestsSetup.cs Common/TestStubTypes.cs Common/UnknownResponseHeader.cs Common/Utils.cs @@ -69,6 +85,7 @@ DataObjects/EmployeeColumn.cs DataObjects/Employee.cs DataObjects/EmployeeDynamicDataContainer.cs DataObjects/EmployeeTable.cs +DataObjects/SeasonalEmployee.cs DataSource/DynamicDataColumn.cs DataSource/DynamicDataContainer.cs DataSource/DynamicDataSource.cs @@ -80,10 +97,15 @@ ModelProviders/DynamicDataAssociationProvider.cs ModelProviders/DynamicDataContainerColumnProvider.cs ModelProviders/DynamicDataContainerModelProvider.cs ModelProviders/DynamicDataContainerTableProvider.cs +ModelProviders/DynamicDataSortableAttribute.cs +ModelProviders/DynamicDataStringLengthAttribute.cs System.Web.DynamicData/ContextConfigurationTest.cs +System.Web.DynamicData/DynamicControlTest.cs System.Web.DynamicData/DynamicDataExtensionsTest.cs System.Web.DynamicData/DynamicDataManagerTest.cs +System.Web.DynamicData/DynamicDataRouteHandlerTest.cs System.Web.DynamicData/DynamicDataRouteTest.cs +System.Web.DynamicData/MetaColumnTest.cs System.Web.DynamicData/MetaModelTest.cs System.Web.DynamicData/MetaTableTest.cs System.Web.DynamicData.ModelProviders/TableProviderTest.cs diff --git a/mcs/class/System.Web.DynamicData/Test/Assembly/AssemblyInfo.cs b/mcs/class/System.Web.DynamicData/Test/Assembly/AssemblyInfo.cs new file mode 100644 index 00000000000..1157af998de --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Assembly/AssemblyInfo.cs @@ -0,0 +1,44 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using MonoTests.SystemWeb.Framework; +using MonoTests.Common; + +[assembly: WebTestResourcesSetup (typeof (TestsSetup), "CopyResources")] + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle ("System.Web.DynamicData_tests_net_2_0")] +[assembly: AssemblyDescription ("System.Web.DynamicData tests_net_2_0")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("Novell, Inc")] +[assembly: AssemblyProduct ("System.Web.DynamicData_tests_net_2_0")] +[assembly: AssemblyCopyright ("Copyright © 2009 Novell, Inc")] +[assembly: AssemblyTrademark ("")] +[assembly: AssemblyCulture ("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible (false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid ("ad6fbbb5-3518-439f-987e-c930d83e7acf")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +//[assembly: AssemblyVersion ("1.0.0.0")] +//[assembly: AssemblyFileVersion ("1.0.0.0")] +#if !TARGET_DOTNET +[assembly: AssemblyDelaySign (true)] +[assembly: AssemblyKeyFile ("../winfx.pub")] +#endif diff --git a/mcs/class/System.Web.DynamicData/Test/Assembly/ChangeLog b/mcs/class/System.Web.DynamicData/Test/Assembly/ChangeLog new file mode 100644 index 00000000000..5f598e6170b --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Assembly/ChangeLog @@ -0,0 +1,6 @@ +2009-07-03 Marek Habersack + + * AssemblyInfo.cs: added. Necessary, because we need to set up + WebTest environment and it is done via an assembly-level custom + attribute. + diff --git a/mcs/class/System.Web.DynamicData/Test/ChangeLog b/mcs/class/System.Web.DynamicData/Test/ChangeLog new file mode 100644 index 00000000000..9c9edfdbbdf --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/ChangeLog @@ -0,0 +1,5 @@ +2009-07-03 Marek Habersack + + * Added some resources to WebPages - a test web page for + DynamicControlTest and the required DynamicData scaffolding. + diff --git a/mcs/class/System.Web.DynamicData/Test/Common/AFieldTemplate.cs b/mcs/class/System.Web.DynamicData/Test/Common/AFieldTemplate.cs new file mode 100644 index 00000000000..a5c0c508000 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/AFieldTemplate.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; +using System.Web.UI; + +namespace MonoTests.Common +{ + class AFieldTemplate : ITemplate + { + public List Controls { get; private set; } + + public AFieldTemplate () + { + Controls = new List (); + } + + public void InstantiateIn (Control container) + { + if (container == null) + return; + + List controls = Controls; + if (controls.Count == 0) + return; + + foreach (Control c in controls) + container.Controls.Add (c); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/AssertExtensions.cs b/mcs/class/System.Web.DynamicData/Test/Common/AssertExtensions.cs index dd2d5c72b7e..f41d261d008 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/AssertExtensions.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/AssertExtensions.cs @@ -5,35 +5,45 @@ using NUnit.Framework; namespace MonoTests.Common { - delegate void AssertThrowsDelegate (); - - static class AssertExtensions - { - public static void Throws (AssertThrowsDelegate code, string message) - { - Throws (typeof (ET), code, message); - } - - public static void Throws (Type exceptionType, AssertThrowsDelegate code, string message) - { - if (code == null) - Assert.Fail ("No code provided for the test."); - if (exceptionType == null) - Assert.Fail ("Exception type missing for the test."); - - Exception exception = null; - try { - code (); - } catch (Exception ex) { - exception = ex; - } - - if (exception == null || exception.GetType () != exceptionType) - Assert.Fail ("{0}{1}Expected: {2}{1}But was: {3}{1}", - message, - Environment.NewLine, - exceptionType, - exception == null ? "null" : exception.GetType ().ToString ()); - } - } + delegate void AssertThrowsDelegate (); + + static class AssertExtensions + { + public static void Throws (AssertThrowsDelegate code, string message) + { + Throws (typeof (ET), code, message); + } + + public static void Throws (Type exceptionType, AssertThrowsDelegate code, string message) + { + if (code == null) + Assert.Fail ("No code provided for the test."); + + Exception exception = null; + try { + code (); + } catch (Exception ex) { + exception = ex; + } + + if (exceptionType == null) { + if (exception == null) + Assert.Fail ("{0}{1}Expected: any exception thrown{1}But was: no exception thrown{1}", + message, Environment.NewLine); + return; + } + + if (exception == null || exception.GetType () != exceptionType) + Assert.Fail ("{0}{1}Expected: {2}{1}But was: {3}{1}", + message, + Environment.NewLine, + exceptionType, + exception == null ? "null" : exception.GetType ().ToString ()); + } + + public static void Throws (AssertThrowsDelegate code, string message) + { + Throws (null, code, message); + } + } } diff --git a/mcs/class/System.Web.DynamicData/Test/Common/AssociatedFoo.cs b/mcs/class/System.Web.DynamicData/Test/Common/AssociatedFoo.cs index 3040d2c0ec0..d031aec9896 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/AssociatedFoo.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/AssociatedFoo.cs @@ -19,8 +19,6 @@ namespace MonoTests.Common [DynamicDataAssociation ("AssociatedBarTable.Column2", AssociationDirection.OneToMany)] public int PrimarykeyColumn2 { get; set; } - public AssociatedFoo () - { - } + public int Column1 { get; set; } } } diff --git a/mcs/class/System.Web.DynamicData/Test/Common/Baz.cs b/mcs/class/System.Web.DynamicData/Test/Common/Baz.cs index 2f38d41c140..c816329102f 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/Baz.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/Baz.cs @@ -1,17 +1,52 @@ using System; using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; +using MonoTests.ModelProviders; + namespace MonoTests.Common { class Baz { // DO NOT change the order of properties - tests depend on it + // DO NOT change the column types - tests depend on it public int Column1 { get; set; } public int PrimaryKeyColumn1 { get; set; } public string PrimaryKeyColumn2 { get; set; } public bool PrimaryKeyColumn3 { get; set; } + public string CustomPropertyColumn1 { get; set; } + + [UIHint ("UI Hint")] + public string CustomPropertyColumn2 { get; set; } + + public int GeneratedColumn1 { get; set; } + + [UIHint ("UI Hint")] + public int GeneratedColumn2 { get; set; } + + [ReadOnly (true)] + public int ReadOnlyColumn { get; private set; } + + [ReadOnly (false)] + public int ReadWriteColumn { get; private set; } + + [DisplayFormat (NullDisplayText="Text")] + public DateTime NullDisplayTextColumn { get; set; } + + [Required (ErrorMessage = "Custom error message")] + public int ErrorMessageColumn1 { get; set; } + + [Required (ErrorMessage = "s")] + public int ErrorMessageColumn2 { get; set; } + + [UIHint ("")] + public int EmptyHintColumn { get; set; } + + [DynamicDataSortable (true)] + public int SortableColumn1 { get; set; } public Baz () { diff --git a/mcs/class/System.Web.DynamicData/Test/Common/BazColumnAttributes.cs b/mcs/class/System.Web.DynamicData/Test/Common/BazColumnAttributes.cs new file mode 100644 index 00000000000..c3008e78d8b --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/BazColumnAttributes.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; + +namespace MonoTests.Common +{ + class BazColumnAttributes + { + public string ColumnNoAttributes { get; set; } + + [DisplayFormat ( + ApplyFormatInEditMode=true, + ConvertEmptyStringToNull=true, + DataFormatString="Item: {0}" + )] + public string ColumnFormatInEditMode { get; set; } + + [DataType (DataType.EmailAddress)] + public string ColumnWithDataType { get; set; } + + [DefaultValue (12345L)] + public long ColumnWithDefaultLongValue { get; set; } + + [DefaultValue ("Value")] + public string ColumnWithDefaultStringValue { get; set; } + + [Description ("Description")] + public string ColumnWithDescription { get; set; } + + [DisplayName ("Display Name")] + public string ColumnWithDisplayName { get; set; } + + [ScaffoldColumn (false)] + public string NoScaffoldColumn { get; set; } + + [ScaffoldColumn (true)] + public string ScaffoldAttributeColumn { get; set; } + + [UIHint ("UI Hint")] + public string UIHintColumn { get; set; } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/BazDataTypeDefaultTypes.cs b/mcs/class/System.Web.DynamicData/Test/Common/BazDataTypeDefaultTypes.cs new file mode 100644 index 00000000000..19825e86ec9 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/BazDataTypeDefaultTypes.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; + +using MonoTests.ModelProviders; + +namespace MonoTests.Common +{ + public class BazDataTypeDefaultTypes + { + public char Char_Column { get; set; } + public byte Byte_Column { get; set; } + public int Int_Column { get; set; } + public long Long_Column { get; set; } + public bool Bool_Column { get; set; } + public string String_Column { get; set; } + public float Float_Column { get; set; } + public Single Single_Column { get; set; } + public double Double_Column { get; set; } + public decimal Decimal_Column { get; set; } + public sbyte SByte_Column { get; set; } + public uint UInt_Column { get; set; } + public ulong ULong_Column { get; set; } + public short Short_Column { get; set; } + public ushort UShort_Column { get; set; } + public DateTime DateTime_Column { get; set; } + public FooEmpty FooEmpty_Column { get; set; } + public object Object_Column { get; set; } + public byte[] ByteArray_Column { get; set; } + public int[] IntArray_Column { get; set; } + public string[] StringArray_Column { get; set; } + public object[] ObjectArray_Column { get; set; } + public List StringList_Column { get; set; } + public Dictionary Dictionary_Column { get; set; } + public ICollection ICollection_Column { get; set; } + public IEnumerable IEnumerable_Column { get; set; } + public ICollection ICollectionByte_Column { get; set; } + public IEnumerable IEnumerableByte_Column { get; set; } + public byte[,] ByteMultiArray_Column { get; set; } + public bool[] BoolArray_Column { get; set; } + + [DynamicDataStringLength (Int32.MaxValue)] + public string MaximumLength_Column1 { get; set; } + + [DynamicDataStringLength (Int32.MinValue)] + public string MaximumLength_Column2 { get; set; } + + // This is the highest length at which string is considered to be short + [DynamicDataStringLength ((Int32.MaxValue / 2) - 5)] + public string MaximumLength_Column3 { get; set; } + + // This is the lowest length at which string is considered to be long + [DynamicDataStringLength ((Int32.MaxValue / 2) - 4)] + public string MaximumLength_Column4 { get; set; } + + [StringLength (255)] + [DynamicDataStringLength (512)] + public string MaximumLength_Column5 { get; set; } + + public BazDataTypeDefaultTypes () : this (false) + {} + + public BazDataTypeDefaultTypes (bool fillValues) + { + if (fillValues) { + Char_Column = 'a'; + String_Column = "string"; + } + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/ChangeLog b/mcs/class/System.Web.DynamicData/Test/Common/ChangeLog index 3f612ad3710..a51d138435d 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/ChangeLog +++ b/mcs/class/System.Web.DynamicData/Test/Common/ChangeLog @@ -1,3 +1,35 @@ +2009-07-08 Marek Habersack + + * TestsSetup.cs: added the BuildPath helper method which converts + unix-style filesystem paths to the os-specific format. + +2009-07-03 Marek Habersack + + * TestsSetup.cs: custom WebTest setup for DynamicData + + * TestsBasePage.cs: a base class for all the web pages used by the + tests. + + * MiscExtensions.cs: added some helper extensions for fishing out + controls from control trees. + + * ITestDataContext.cs: GetTableData gets full set of query + arguments. + +2009-06-18 Marek Habersack + + * TestDataColumn.cs: mark the column as sortable based on value of + the DynamicDataSortable attribute. + + * Baz.cs: added a sortable column. + +2009-06-15 Marek Habersack + + * TestDataContext.cs: added new tables + + * BazColumnAttributes.cs, BazDataTypeDefaultTypes.cs, + FooWithMetadataType.cs: added + 2009-06-12 Marek Habersack * TestDataContainer.cs: GetTables uses an object of the associated diff --git a/mcs/class/System.Web.DynamicData/Test/Common/EmployeesDataContext.cs b/mcs/class/System.Web.DynamicData/Test/Common/EmployeesDataContext.cs new file mode 100644 index 00000000000..8605a0883c1 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/EmployeesDataContext.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Web.DynamicData; +using System.Web.DynamicData.ModelProviders; +using System.Web.UI; +using System.Web.UI.WebControls; + +using MonoTests.System.Web.DynamicData; +using MonoTests.ModelProviders; +using MonoTests.DataSource; +using MonoTests.DataObjects; + +namespace MonoTests.Common +{ + public class EmployeesDataContext : ITestDataContext + { + List employees; + List seasonalEmployees; + List defaultDataTypes; + + public List Employees { + get { + if (employees == null) + employees = new List (); + + return employees; + } + } + + public List SeasonalEmployees { + get + { + if (seasonalEmployees == null) + seasonalEmployees = new List (); + return seasonalEmployees; + } + } + + public List DefaultDataTypes { + get { + if (defaultDataTypes == null) + defaultDataTypes = new List (); + return defaultDataTypes; + } + } + + public IList GetTableData (string tableName, DataSourceSelectArguments args, string where, ParameterCollection whereParams) + { + if (String.Compare (tableName, "EmployeeTable", StringComparison.OrdinalIgnoreCase) == 0) + return Employees; + + if (String.Compare (tableName, "SeasonalEmployeeTable", StringComparison.OrdinalIgnoreCase) == 0) + return SeasonalEmployees; + + if (String.Compare (tableName, "BazDataTypeDefaultTypesTable", StringComparison.OrdinalIgnoreCase) == 0) + return DefaultDataTypes; + + return null; + } + + public List GetTables () + { + var ret = new List (); + + ret.Add (new TestDataTable ()); + ret.Add (new TestDataTable ()); + ret.Add (new TestDataTable ()); + + return ret; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/FakeHttpWorkerRequest.cs b/mcs/class/System.Web.DynamicData/Test/Common/FakeHttpWorkerRequest.cs index 29674e94cf0..be9fa36c559 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/FakeHttpWorkerRequest.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/FakeHttpWorkerRequest.cs @@ -38,6 +38,7 @@ namespace MonoTests.Common public class FakeHttpWorkerRequest : HttpWorkerRequest { + const string appPath = "/"; string queryString; public Hashtable KnownResponseHeaders; public Hashtable UnknownResponseHeaders; @@ -46,6 +47,8 @@ namespace MonoTests.Common public FakeHttpWorkerRequest () : this (1) { + // for Mono + AppDomain.CurrentDomain.SetData (".appVPath", appPath); } public FakeHttpWorkerRequest (int re) @@ -58,9 +61,14 @@ namespace MonoTests.Common public override string GetUriPath () { - return "/fake"; + return appPath; } + public override string GetFilePath () + { + return GetUriPath (); + } + public override string GetQueryString () { return queryString; @@ -106,7 +114,7 @@ namespace MonoTests.Common public override string GetAppPath () { - return "AppPath"; + return appPath; } public override int GetLocalPort () @@ -114,6 +122,15 @@ namespace MonoTests.Common return 2020; } + public override string MapPath (string virtualPath) + { +#if TARGET_DOTNET + return "c:\\fakefile"; +#else + return "/fakefile"; +#endif + } + public bool status_sent; public int status_code; public string status_string; diff --git a/mcs/class/System.Web.DynamicData/Test/Common/FieldFormattingOptions.cs b/mcs/class/System.Web.DynamicData/Test/Common/FieldFormattingOptions.cs new file mode 100644 index 00000000000..adf66bc4a60 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/FieldFormattingOptions.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web.DynamicData; + +namespace MonoTests.Common +{ + class FieldFormattingOptions : IFieldFormattingOptions + { + Dictionary propertyValues = new Dictionary (); + + public bool ApplyFormatInEditMode + { + get { return GetProperty ("ApplyFormatInEditMode"); } + } + + public bool ConvertEmptyStringToNull + { + get { return GetProperty ("ConvertEmptyStringToNull"); } + } + + public string DataFormatString + { + get { return GetProperty ("DataFormatString"); } + } + + public bool HtmlEncode + { + get { return GetProperty ("HtmlEncode"); } + } + + public string NullDisplayText + { + get { return GetProperty ("NullDisplayText"); } + } + + T GetProperty (string name) + { + if (String.IsNullOrEmpty (name)) + throw new ArgumentNullException ("name"); + + object v; + if (propertyValues.TryGetValue (name, out v)) { + if (v == null) + return default (T); + if (typeof (T).IsAssignableFrom (v.GetType ())) { + return (T) v; + } + + throw new InvalidOperationException ("Invalid value type. Expected '" + typeof (T) + "' and got '" + v.GetType () + "'"); + } + + return default (T); + } + + public void SetProperty (string name, object value) + { + if (String.IsNullOrEmpty (name)) + return; + + if (propertyValues.ContainsKey (name)) + propertyValues[name] = value; + else + propertyValues.Add (name, value); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/FooBarNoScaffold.cs b/mcs/class/System.Web.DynamicData/Test/Common/FooBarNoScaffold.cs new file mode 100644 index 00000000000..e53b3b7a985 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/FooBarNoScaffold.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Web.DynamicData.ModelProviders; + +using MonoTests.ModelProviders; + +namespace MonoTests.Common +{ + [ScaffoldTable (false)] + class FooBarNoScaffold + { + public string Column1 { get; set; } + + public string CustomPropertyColumn1 { get; set; } + + [UIHint ("UI Hint")] + public string CustomPropertyColumn2 { get; set; } + + public int GeneratedColumn1 { get; set; } + + [UIHint ("UI Hint")] + public int GeneratedColumn2 { get; set; } + + [DynamicDataAssociation ("AssociatedBarTable.Column1", AssociationDirection.OneToOne)] + public string ForeignKeyColumn1 { get; set; } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/FooEmpty.cs b/mcs/class/System.Web.DynamicData/Test/Common/FooEmpty.cs index 7e3610e4a34..74529977e32 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/FooEmpty.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/FooEmpty.cs @@ -7,7 +7,7 @@ using System.Text; namespace MonoTests.Common { - class FooEmpty + public class FooEmpty { } } diff --git a/mcs/class/System.Web.DynamicData/Test/Common/FooNoScaffold.cs b/mcs/class/System.Web.DynamicData/Test/Common/FooNoScaffold.cs index 13cf5882ff7..56821f029b3 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/FooNoScaffold.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/FooNoScaffold.cs @@ -9,5 +9,6 @@ namespace MonoTests.Common [ScaffoldTable(false)] class FooNoScaffold { + public string Column1 { get; set; } } } diff --git a/mcs/class/System.Web.DynamicData/Test/Common/FooWithMetadataType.cs b/mcs/class/System.Web.DynamicData/Test/Common/FooWithMetadataType.cs new file mode 100644 index 00000000000..6e8bc09b02b --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/FooWithMetadataType.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; + +namespace MonoTests.Common +{ + [MetadataType (typeof (FooMetaDataType))] + class FooWithMetadataType + { + [DefaultValue ("Value")] + [Description ("Description")] + public string Column1 { get; set; } + public string Column2 { get; set; } + + [DisplayName ("Column three")] + public string Column3 { get; set; } + public string Column4 { get; set; } + + [Required] + public bool Column5 { get; set; } + + // This will cause the column to be treated the way nullable database + // columns are - that is, its associated MetaColumn.IsRequired will + // return false (this is thanks to our test DynamicDataContainerColumnProvider + public bool? Column6 { get; set; } + public string Column7 { get; set; } + } + + [DisplayColumn ("Column2")] + class FooMetaDataType + { + [DisplayFormat ( + ApplyFormatInEditMode = true, + ConvertEmptyStringToNull=true, + DataFormatString="Item: {0}" + )] + public string Column1; + + [DefaultValue ("Value")] + [DataType (DataType.Time)] + public string Column2; + + [DefaultValue (123)] + [DataType (DataType.Currency)] + [Description ("Description")] + public int Column3; + + [DisplayName ("Column four")] + public string Column4 { get; set; } + + [Required] + public string Column7; + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/ITestDataContext.cs b/mcs/class/System.Web.DynamicData/Test/Common/ITestDataContext.cs index e3426f90405..2103dc5839d 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/ITestDataContext.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/ITestDataContext.cs @@ -1,7 +1,10 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Web.UI; +using System.Web.UI.WebControls; using MonoTests.System.Web.DynamicData; using MonoTests.ModelProviders; @@ -9,8 +12,9 @@ using MonoTests.DataSource; namespace MonoTests.Common { - interface ITestDataContext + public interface ITestDataContext { + IList GetTableData (string tableName, DataSourceSelectArguments args, string where, ParameterCollection whereParams); List GetTables (); } } diff --git a/mcs/class/System.Web.DynamicData/Test/Common/MiscExtensions.cs b/mcs/class/System.Web.DynamicData/Test/Common/MiscExtensions.cs new file mode 100644 index 00000000000..b83b4f2e3aa --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/MiscExtensions.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; +using System.Web.UI; + +namespace MonoTests.Common +{ + public static class MiscExtensions + { + public static TChild FindChild (this Control parent) where TChild: class + { + return FindChild (parent, null); + } + + public static TChild FindChild (this Control parent, string id) where TChild: class + { + if (parent == null) + return null; + + foreach (Control child in parent.Controls) { + if (child == null) + continue; + + if (typeof (TChild).IsAssignableFrom (child.GetType ())) { + if (String.IsNullOrEmpty (id)) + return child as TChild; + if (String.Compare (child.ID, id, StringComparison.OrdinalIgnoreCase) == 0) + return child as TChild; + } + + TChild ret = child.FindChild (id); + if (ret != null) + return ret; + } + + return null; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/MyDynamicDataRouteHandler.cs b/mcs/class/System.Web.DynamicData/Test/Common/MyDynamicDataRouteHandler.cs new file mode 100644 index 00000000000..0cc44b07cd6 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/MyDynamicDataRouteHandler.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; +using System.Web.UI; +using System.Web.DynamicData; + +namespace MonoTests.Common +{ + class MyDynamicDataRouteHandler : DynamicDataRouteHandler + { + public string DoGetCustomPageVirtualPath (MetaTable table, string viewName) + { + return GetCustomPageVirtualPath (table, viewName); + } + + public string DoGetScaffoldPageVirtualPath (MetaTable table, string viewName) + { + return GetScaffoldPageVirtualPath (table, viewName); + } + + public override IHttpHandler CreateHandler (DynamicDataRoute route, MetaTable table, string action) + { + return new Page () as IHttpHandler; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/MyHttpContextWrapper.cs b/mcs/class/System.Web.DynamicData/Test/Common/MyHttpContextWrapper.cs new file mode 100644 index 00000000000..0bf9ed27eec --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/MyHttpContextWrapper.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; + +namespace MonoTests.Common +{ + class MyHttpContextWrapper : HttpContextBase + { + MyHttpRequestWrapper request; + + public override HttpRequestBase Request { + get { + if (request == null) + request = new MyHttpRequestWrapper (); + + return request; + } + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/MyHttpRequestWrapper.cs b/mcs/class/System.Web.DynamicData/Test/Common/MyHttpRequestWrapper.cs new file mode 100644 index 00000000000..c8c361a70a8 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/MyHttpRequestWrapper.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Web; + +namespace MonoTests.Common +{ + class MyHttpRequestWrapper : HttpRequestBase + { + Dictionary propertyValues = new Dictionary (); + + public override string AppRelativeCurrentExecutionFilePath + { + get + { + string value; + if (!GetProperty ("AppRelativeCurrentExecutionFilePath", out value)) + return base.AppRelativeCurrentExecutionFilePath; + + return value; + } + } + + public override string PathInfo + { + get + { + string value; + if (!GetProperty ("PathInfo", out value)) + return base.PathInfo; + + return value; + } + } + + public override NameValueCollection QueryString + { + get + { + NameValueCollection value; + if (!GetProperty ("QueryString", out value)) + return base.QueryString; + + return value; + } + } + + bool GetProperty (string name, out T value) + { + if (String.IsNullOrEmpty (name)) + throw new ArgumentNullException ("name"); + + value = default (T); + object v; + if (propertyValues.TryGetValue (name, out v)) { + if (v == null) + return true; + if (typeof (T).IsAssignableFrom (v.GetType ())) { + value = (T) v; + return true; + } + + throw new InvalidOperationException ("Invalid value type. Expected '" + typeof (T) + "' and got '" + v.GetType () + "'"); + } + + return false; + } + + public void SetProperty (string name, object value) + { + if (String.IsNullOrEmpty (name)) + return; + + if (propertyValues.ContainsKey (name)) + propertyValues[name] = value; + else + propertyValues.Add (name, value); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/PokerDynamicControl.cs b/mcs/class/System.Web.DynamicData/Test/Common/PokerDynamicControl.cs new file mode 100644 index 00000000000..2847fa2cee3 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/PokerDynamicControl.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web; +using System.Web.DynamicData; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace MonoTests.Common +{ + public class PokerDynamicControl : DynamicControl + { + public override string ID { + get { + string id = base.ID; + if (String.IsNullOrEmpty (id)) + return DataField; + + return id; + } + + set { base.ID = value; } + } + + public object GetViewState () + { + return SaveViewState (); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/TestDataColumn.cs b/mcs/class/System.Web.DynamicData/Test/Common/TestDataColumn.cs index 41f5a2af5d4..f1148518dd8 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/TestDataColumn.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/TestDataColumn.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Reflection; using System.Text; @@ -8,7 +9,7 @@ using MonoTests.ModelProviders; namespace MonoTests.Common { - public class TestDataColumn : DynamicDataColumn + public class TestDataColumn : DynamicDataColumn { public TestDataColumn (MemberInfo member) { @@ -32,14 +33,33 @@ namespace MonoTests.Common } this.PrimaryKey = name.StartsWith ("PrimaryKeyColumn", StringComparison.Ordinal); - object[] attrs = member.GetCustomAttributes (typeof (DynamicDataAssociationAttribute), true); - if (attrs != null && attrs.Length > 0) { - var attr = attrs[0] as DynamicDataAssociationAttribute; - if (attr != null) { - AssociatedTo = attr.ColumnName; - AssociationDirection = attr.Direction; - } + this.CustomProperty = name.StartsWith ("CustomProperty", StringComparison.Ordinal); + this.Generated = name.StartsWith ("GeneratedColumn", StringComparison.Ordinal); + + object[] attrs = member.GetCustomAttributes (true); + DynamicDataAssociationAttribute associationAttr; + + try { + associationAttr = attrs.OfType ().First (); + } catch (InvalidOperationException) { + associationAttr = null; + } + + if (associationAttr != null) { + AssociatedTo = associationAttr.ColumnName; + AssociationDirection = associationAttr.Direction; } + + DynamicDataSortableAttribute sortableAttr; + + try { + sortableAttr = attrs.OfType ().First (); + } catch (InvalidOperationException) { + sortableAttr = null; + } + + if (sortableAttr != null) + Sortable = sortableAttr.Sortable; } } } diff --git a/mcs/class/System.Web.DynamicData/Test/Common/TestDataContainer.cs b/mcs/class/System.Web.DynamicData/Test/Common/TestDataContainer.cs index b6fa94ccc32..8d58c4df425 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/TestDataContainer.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/TestDataContainer.cs @@ -3,20 +3,20 @@ using System.Collections; using System.Collections.Generic; using System.Text; using System.Web.UI; +using System.Web.UI.WebControls; using MonoTests.DataSource; using MonoTests.ModelProviders; namespace MonoTests.Common { - class TestDataContainer : DynamicDataContainer where DataType: ITestDataContext + public class TestDataContainer : DynamicDataContainer where TContext: ITestDataContext { public TestDataContainer () - : this (default (DataType)) { } - public TestDataContainer (DataType data) - : base (data) + public TestDataContainer (string tableName) + : base (tableName) { } public override int Update (IDictionary keys, IDictionary values, IDictionary oldValues) @@ -34,16 +34,15 @@ namespace MonoTests.Common throw new NotImplementedException (); } - public override IEnumerable Select (DataSourceSelectArguments args, string where, global::System.Web.UI.WebControls.ParameterCollection whereParams) + public override IEnumerable Select (DataSourceSelectArguments args, string where, ParameterCollection whereParams) { - throw new NotImplementedException (); + TContext contextInstance = ContainedTypeInstance; + return ContainedTypeInstance.GetTableData (TableName, args, where, whereParams); } public override List GetTables () { - DataType data = Data; - if (data == null) - data = Activator.CreateInstance (); + var data = Activator.CreateInstance (); return data.GetTables (); } } diff --git a/mcs/class/System.Web.DynamicData/Test/Common/TestDataContext.cs b/mcs/class/System.Web.DynamicData/Test/Common/TestDataContext.cs index 2a610b4042d..ffab6dedfb4 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/TestDataContext.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/TestDataContext.cs @@ -1,10 +1,13 @@ using System; +using System.Collections; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Web.DynamicData; using System.Web.DynamicData.ModelProviders; +using System.Web.UI; +using System.Web.UI.WebControls; using MonoTests.System.Web.DynamicData; using MonoTests.ModelProviders; @@ -35,6 +38,9 @@ namespace MonoTests.Common public const int TableFooMisnamedSortColumn = 18; public const int TableFooEmptySortColumn = 19; public const int TableFooNoScaffold = 20; + public const int TableBazColumnAttributes = 21; + public const int TableFooWithMetadataType = 22; + public const int TableBazDataTypeDefaultTypes = 23; public FooWithDefaults FooWithDefaults { get; set; } public FooNoPrimaryColumns FooNoPrimaryColumns { get; set; } @@ -57,9 +63,17 @@ namespace MonoTests.Common public FooMisnamedSortColumn FooMissingSortColumn { get; set; } public FooEmptySortColumn FooEmptySortColumn { get; set; } public FooNoScaffold FooNoScaffold { get; set; } + public BazColumnAttributes BazColumnAttributes { get; set; } + public FooWithMetadataType FooWithMetadataType { get; set; } + public BazDataTypeDefaultTypes BazDataTypeDefaultTypes { get; set; } #region ITestDataContext Members + public IList GetTableData (string tableName, DataSourceSelectArguments args, string where, ParameterCollection whereParams) + { + return null; + } + public List GetTables () { var ret = new List (); @@ -85,6 +99,9 @@ namespace MonoTests.Common ret.Add (new TestDataTable ()); ret.Add (new TestDataTable ()); ret.Add (new TestDataTable ()); + ret.Add (new TestDataTable ()); + ret.Add (new TestDataTable ()); + ret.Add (new TestDataTable ()); return ret; } diff --git a/mcs/class/System.Web.DynamicData/Test/Common/TestDataContext2.cs b/mcs/class/System.Web.DynamicData/Test/Common/TestDataContext2.cs new file mode 100644 index 00000000000..204090ac83c --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/TestDataContext2.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Web.DynamicData; +using System.Web.DynamicData.ModelProviders; +using System.Web.UI; +using System.Web.UI.WebControls; + +using MonoTests.System.Web.DynamicData; +using MonoTests.ModelProviders; +using MonoTests.DataSource; + +namespace MonoTests.Common +{ + class TestDataContext2 : ITestDataContext + { + public const int TableFooBarNoScaffold = 0; + public const int TableAssociatedBar = 1; + + public FooBarNoScaffold FooBarNoScaffold { get; set; } + public AssociatedBar AssociatedBar { get; set; } + + #region ITestDataContext Members + + public IList GetTableData (string tableName, DataSourceSelectArguments args, string where, ParameterCollection whereParams) + { + return null; + } + + public List GetTables () + { + var ret = new List (); + + ret.Add (new TestDataTable ()); + ret.Add (new TestDataTable ()); + + return ret; + } + + #endregion + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/TestStubTypes.cs b/mcs/class/System.Web.DynamicData/Test/Common/TestStubTypes.cs index 35bd154fe11..18f327a108e 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/TestStubTypes.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/TestStubTypes.cs @@ -60,7 +60,7 @@ namespace MonoTests.System.Web.DynamicData get; private set; } - public bool Called { + public bool GetVirtualPathCalled { get; set; } @@ -72,19 +72,11 @@ namespace MonoTests.System.Web.DynamicData public override VirtualPathData GetVirtualPath (RequestContext requestContext, RouteValueDictionary values) { GetVirtualPathValues = values; - Called = true; + GetVirtualPathCalled = true; return base.GetVirtualPath (requestContext, values); } } - class MyDynamicDataRouteHandler : DynamicDataRouteHandler - { - public override IHttpHandler CreateHandler (DynamicDataRoute route, MetaTable table, string action) - { - return new Page () as IHttpHandler; - } - } - class MyDataContext1 : DataContext { public MyDataContext1 () diff --git a/mcs/class/System.Web.DynamicData/Test/Common/TestsBasePage.cs b/mcs/class/System.Web.DynamicData/Test/Common/TestsBasePage.cs new file mode 100644 index 00000000000..1a26a916c52 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/TestsBasePage.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.Web.Configuration; +using System.Web.DynamicData; +using System.Web.UI; + +using MonoTests.SystemWeb.Framework; +using MonoTests.DataSource; + +namespace MonoTests.Common +{ + public class TestsBasePage : global::System.Web.UI.Page where DataContextType: new() + { + Type containerType; + bool? outsideTestSuite; + + public bool OutsideTestSuite { + get { + if (outsideTestSuite == null) { + object o = WebConfigurationManager.AppSettings["OutsideTestSuite"]; + string s = o as string; + bool b; + if (s == null) + outsideTestSuite = false; + else if (Boolean.TryParse (s, out b)) + outsideTestSuite = b; + else + outsideTestSuite = false; + } + + return (bool) outsideTestSuite; + } + + set { + outsideTestSuite = value; + } + } + + public virtual Type ContextType { + get { return typeof (DataContextType); } + } + + public virtual Type ContainerType { + get { + if (containerType == null) { + Type genType = typeof (TestDataContainer<>).GetGenericTypeDefinition (); + containerType = genType.MakeGenericType (new Type[] { ContextType }); + } + + return containerType; + } + } + + public virtual string ContainerTypeName { + get { return ContainerType.AssemblyQualifiedName; } + } + + protected virtual IDynamicDataContainer CreateContainerInstance () + { + return Activator.CreateInstance (ContainerType) as IDynamicDataContainer ; + } + + protected virtual void InitializeDataSource (DynamicDataSource ds, string tableName) + { + ds.DataContainerTypeName = ContainerTypeName; + ds.EntitySetName = tableName; + ds.ContextType = typeof (DataContextType); + ds.DataContainerInstance = CreateContainerInstance (); + + PopulateDataSource (ds); + } + + protected virtual void PopulateDataSource (DynamicDataSource ds) + { + } + + protected override void OnPreInit (EventArgs e) + { + if (!OutsideTestSuite) { + WebTest t = WebTest.CurrentTest; + if (t != null) + t.Invoke (this); + } + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/TestsSetup.cs b/mcs/class/System.Web.DynamicData/Test/Common/TestsSetup.cs new file mode 100644 index 00000000000..403829d2ece --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/Common/TestsSetup.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +using MonoTests.SystemWeb.Framework; + +namespace MonoTests.Common +{ + public static class TestsSetup + { + static readonly char[] buildPathSplitChars = { '/' }; + + public static string BuildPath (string path) + { + if (String.IsNullOrEmpty (path)) + return String.Empty; + + StringBuilder ret = new StringBuilder (); + bool first = true; + foreach (string s in path.Split (buildPathSplitChars)) { + if (!first) + ret.Append (Path.DirectorySeparatorChar); + else + first = false; + ret.Append (s); + } + + return ret.ToString (); + } + + public static void CopyResources () + { + Type type = typeof (TestsSetup); + WebTest.CopyResource (type, "MonoTests.WebPages.Global.asax", "Global.asax"); + WebTest.CopyResource (type, "MonoTests.WebPages.web.config", "web.config"); + WebTest.CopyResource (type, "MonoTests.WebPages.Site.css", "Site.css"); + WebTest.CopyResource (type, "MonoTests.WebPages.Site.master", "Site.master"); + WebTest.CopyResource (type, "MonoTests.WebPages.Site.master.cs", "Site.master.cs"); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.web.config", BuildPath ("DynamicData/web.config")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.Content.FilterUserControl.ascx", BuildPath ("DynamicData/Content/FilterUserControl.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.Content.FilterUserControl.ascx.cs", BuildPath ("DynamicData/Content/FilterUserControl.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.Content.GridViewPager.ascx", BuildPath ("DynamicData/Content/GridViewPager.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.Content.GridViewPager.ascx.cs", BuildPath ("DynamicData/Content/GridViewPager.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.Content.Images.Back.gif", BuildPath ("DynamicData/Content/Images/Back.gif")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.Content.Images.header_back.gif", BuildPath ("DynamicData/Content/Images/header_back.gif")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.Content.Images.PgFirst.gif", BuildPath ("DynamicData/Content/Images/PgFirst.gif")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.Content.Images.PgLast.gif", BuildPath ("DynamicData/Content/Images/PgLast.gif")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.Content.Images.PgNext.gif", BuildPath ("DynamicData/Content/Images/PgNext.gif")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.Content.Images.PgPrev.gif", BuildPath ("DynamicData/Content/Images/PgPrev.gif")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.Content.Images.plus.gif", BuildPath ("DynamicData/Content/Images/plus.gif")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Boolean.ascx", BuildPath ("DynamicData/FieldTemplates/Boolean.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Boolean.ascx.cs", BuildPath ("DynamicData/FieldTemplates/Boolean.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Boolean_Edit.ascx", BuildPath ("DynamicData/FieldTemplates/Boolean_Edit.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Boolean_Edit.ascx.cs", BuildPath ("DynamicData/FieldTemplates/Boolean_Edit.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Children.ascx", BuildPath ("DynamicData/FieldTemplates/Children.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Children.ascx.cs", BuildPath ("DynamicData/FieldTemplates/Children.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.DateTime.ascx", BuildPath ("DynamicData/FieldTemplates/DateTime.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.DateTime.ascx.cs", BuildPath ("DynamicData/FieldTemplates/DateTime.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.DateTime_Edit.ascx", BuildPath ("DynamicData/FieldTemplates/DateTime_Edit.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.DateTime_Edit.ascx.cs", BuildPath ("DynamicData/FieldTemplates/DateTime_Edit.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Decimal_Edit.ascx", BuildPath ("DynamicData/FieldTemplates/Decimal_Edit.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Decimal_Edit.ascx.cs", BuildPath ("DynamicData/FieldTemplates/Decimal_Edit.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.ForeignKey.ascx", BuildPath ("DynamicData/FieldTemplates/ForeignKey.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.ForeignKey.ascx.cs", BuildPath ("DynamicData/FieldTemplates/ForeignKey.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.ForeignKey_Edit.ascx", BuildPath ("DynamicData/FieldTemplates/ForeignKey_Edit.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.ForeignKey_Edit.ascx.cs", BuildPath ("DynamicData/FieldTemplates/ForeignKey_Edit.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Integer_Edit.ascx", BuildPath ("DynamicData/FieldTemplates/Integer_Edit.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Integer_Edit.ascx.cs", BuildPath ("DynamicData/FieldTemplates/Integer_Edit.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.MultilineText_Edit.ascx", BuildPath ("DynamicData/FieldTemplates/MultilineText_Edit.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.MultilineText_Edit.ascx.cs", BuildPath ("DynamicData/FieldTemplates/MultilineText_Edit.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Text.ascx", BuildPath ("DynamicData/FieldTemplates/Text.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Text.ascx.cs", BuildPath ("DynamicData/FieldTemplates/Text.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Text_Edit.ascx", BuildPath ("DynamicData/FieldTemplates/Text_Edit.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.Text_Edit.ascx.cs", BuildPath ("DynamicData/FieldTemplates/Text_Edit.ascx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.PageTemplates.Details.aspx", BuildPath ("DynamicData/PageTemplates/Details.aspx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.PageTemplates.Details.aspx.cs", BuildPath ("DynamicData/PageTemplates/Details.aspx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.PageTemplates.Edit.aspx", BuildPath ("DynamicData/PageTemplates/Edit.aspx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.PageTemplates.Edit.aspx.cs", BuildPath ("DynamicData/PageTemplates/Edit.aspx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.PageTemplates.Insert.aspx", BuildPath ("DynamicData/PageTemplates/Insert.aspx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.PageTemplates.Insert.aspx.cs", BuildPath ("DynamicData/PageTemplates/Insert.aspx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.PageTemplates.List.aspx", BuildPath ("DynamicData/PageTemplates/List.aspx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.PageTemplates.List.aspx.cs", BuildPath ("DynamicData/PageTemplates/List.aspx.cs")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.PageTemplates.ListDetails.aspx", BuildPath ("DynamicData/PageTemplates/ListDetails.aspx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.PageTemplates.ListDetails.aspx.cs", BuildPath ("DynamicData/PageTemplates/ListDetails.aspx.cs")); + + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.CustomFieldTemplate.ascx", BuildPath ("DynamicData/FieldTemplates/CustomFieldTemplate.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.CustomFieldTemplate.ascx.cs", BuildPath ("DynamicData/FieldTemplates/CustomFieldTemplate.ascx.cs")); + + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.MyCustomUIHintTemplate_Text.ascx", BuildPath ("DynamicData/FieldTemplates/MyCustomUIHintTemplate_Text.ascx")); + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates.MyCustomUIHintTemplate_Text.ascx.cs", BuildPath ("DynamicData/FieldTemplates/MyCustomUIHintTemplate_Text.ascx.cs")); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/Common/Utils.cs b/mcs/class/System.Web.DynamicData/Test/Common/Utils.cs index 493b29b6770..5f0a3378ac1 100644 --- a/mcs/class/System.Web.DynamicData/Test/Common/Utils.cs +++ b/mcs/class/System.Web.DynamicData/Test/Common/Utils.cs @@ -2,13 +2,51 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Web; using System.Web.DynamicData; using System.Web.DynamicData.ModelProviders; +using System.Web.Routing; + +using MonoTests.System.Web.DynamicData; namespace MonoTests.Common { - static class Utils + public static class Utils { + public static MetaModel CommonInitialize () + { + return CommonInitialize (false); + } + + public static MetaModel CommonInitialize (bool myDynamicDataRoute) + { + MetaModel m = MetaModel.Default; + + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + + RouteCollection routes = RouteTable.Routes; + routes.Clear (); + if (myDynamicDataRoute) { + routes.Add ( + new MyDynamicDataRoute ("{table}/{action}.aspx") { + Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }); + } else { + routes.Add ( + new DynamicDataRoute ("{table}/{action}.aspx") { + Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }); + } + + return m; + } + public static MetaModel GetModel () { // This is really, really dumb but we need that since if the type has already @@ -32,18 +70,82 @@ namespace MonoTests.Common RegisterContext (model, null); } + public static void RegisterContext (Type contextType) + { + RegisterContext (contextType, null); + } + public static void RegisterContext (DataModelProvider model, ContextConfiguration config) + { + RegisterContext (model, config, true); + } + + public static void RegisterContext (Type contextType, ContextConfiguration config) + { + RegisterContext (contextType, config, true); + } + + public static void RegisterContext (DataModelProvider model, ContextConfiguration config, bool defaultModel) + { + // Just in case no model has been created yet + MetaModel m = new MetaModel (); + + if (defaultModel) + m = MetaModel.Default; + + Exception exception = null; + MetaModel registered = null; + + try { + registered = MetaModel.GetModel (model.ContextType); + } catch (Exception) { + // ignore + } + + try { + if (registered == null) + m.RegisterContext (model, config); + } catch (InvalidOperationException ex) { + exception = ex; + } + + if (exception != null) { + Console.WriteLine ("RegisterContext exception:"); + Console.WriteLine (exception); + } + } + + public static void RegisterContext (Type contextType, ContextConfiguration config, bool defaultModel) { // Just in case no model has been created yet MetaModel m = new MetaModel (); - // And get the default model instead, whatever it is - m = MetaModel.Default; + if (defaultModel) + m = MetaModel.Default; + + Exception exception = null; + MetaModel registered = null; + try { - m.RegisterContext (model, config); + registered = MetaModel.GetModel (contextType); + } catch (Exception) { + // ignore + } + + try { + if (registered == null) { + if (config != null) + m.RegisterContext (contextType, config); + else + m.RegisterContext (contextType); + } } catch (InvalidOperationException ex) { + exception = ex; + } + + if (exception != null) { Console.WriteLine ("RegisterContext exception:"); - Console.WriteLine (ex); + Console.WriteLine (exception); } } diff --git a/mcs/class/System.Web.DynamicData/Test/DataObjects/Employee.cs b/mcs/class/System.Web.DynamicData/Test/DataObjects/Employee.cs index cfcced42649..e3664427ab3 100644 --- a/mcs/class/System.Web.DynamicData/Test/DataObjects/Employee.cs +++ b/mcs/class/System.Web.DynamicData/Test/DataObjects/Employee.cs @@ -1,22 +1,21 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; +using System.Web.DynamicData; namespace MonoTests.DataObjects { - public class Employee - { - public string FirstName - { - get; - set; - } + public class Employee + { + public string FirstName { get; set; } - public string LastName - { - get; - set; - } - } + [UIHint ("CustomFieldTemplate")] + [DisplayFormat (ConvertEmptyStringToNull=true, NullDisplayText="No value for this column")] + public string LastName { get; set; } + + [DisplayFormat (ApplyFormatInEditMode=true, DataFormatString="Boolean value: {0}")] + public bool Active { get; set; } + } } diff --git a/mcs/class/System.Web.DynamicData/Test/DataObjects/EmployeeDynamicDataContainer.cs b/mcs/class/System.Web.DynamicData/Test/DataObjects/EmployeeDynamicDataContainer.cs index e71a996afaa..8c2760a2b0c 100644 --- a/mcs/class/System.Web.DynamicData/Test/DataObjects/EmployeeDynamicDataContainer.cs +++ b/mcs/class/System.Web.DynamicData/Test/DataObjects/EmployeeDynamicDataContainer.cs @@ -10,7 +10,7 @@ using MonoTests.DataSource; namespace MonoTests.DataObjects { - public class EmployeeDynamicDataContainer : DynamicDataContainer > + public class EmployeeDynamicDataContainer : DynamicDataContainer { public override Type ContainedType { @@ -25,20 +25,11 @@ namespace MonoTests.DataObjects { } - public EmployeeDynamicDataContainer (List data) - : base (data) + public EmployeeDynamicDataContainer (string tableName) + : base (tableName) { - if (data == null) - PopulateWithData (); } - - void PopulateWithData () - { - Data = new List { - new Employee { FirstName = "Marek", LastName = "Habersack" } - }; - } - + public override int Update (IDictionary keys, IDictionary values, IDictionary oldValues) { throw new NotImplementedException (); @@ -56,25 +47,7 @@ namespace MonoTests.DataObjects public override IEnumerable Select (DataSourceSelectArguments args, string where, ParameterCollection whereParams) { - List data = Data; - int count = data == null ? 0 : data.Count; - - if (args.RetrieveTotalRowCount) - args.TotalRowCount = count; - - int startIndex = args.StartRowIndex; - if (count == 0 || count < startIndex) - return new Employee[0]; - - int max = args.MaximumRows; - if (max == 0 || max > count) - max = count; - max -= startIndex; - - var ret = new List (); - ret.AddRange (data.GetRange (args.StartRowIndex, max)); - - return ret; + throw new NotImplementedException (); } public override List GetTables () diff --git a/mcs/class/System.Web.DynamicData/Test/DataObjects/SeasonalEmployee.cs b/mcs/class/System.Web.DynamicData/Test/DataObjects/SeasonalEmployee.cs new file mode 100644 index 00000000000..83556f184ab --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/DataObjects/SeasonalEmployee.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MonoTests.DataObjects +{ + public class SeasonalEmployee : Employee + { + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/DataSource/ChangeLog b/mcs/class/System.Web.DynamicData/Test/DataSource/ChangeLog new file mode 100644 index 00000000000..982a882dd64 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/DataSource/ChangeLog @@ -0,0 +1,10 @@ +2009-07-03 Marek Habersack + + * IDynamicDataContainer.cs: became a generic interface. + + * DynamicDataSource.cs; some reformatting. + DynamicDataSourceView is a generic class now. + + * DynamicDataContainer.cs: IDynamicDataContainer is a generic + interface now. + diff --git a/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataColumn.cs b/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataColumn.cs index 2baaf7e46ae..45b2f67d9c9 100644 --- a/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataColumn.cs +++ b/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataColumn.cs @@ -13,5 +13,8 @@ namespace MonoTests.DataSource public bool PrimaryKey { get; protected set; } public string AssociatedTo { get; protected set; } public AssociationDirection AssociationDirection { get; protected set; } + public bool CustomProperty { get; protected set; } + public bool Generated { get; protected set; } + public bool Sortable { get; protected set; } } } diff --git a/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataContainer.cs b/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataContainer.cs index eca578d64e8..48e746e967b 100644 --- a/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataContainer.cs +++ b/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataContainer.cs @@ -8,29 +8,45 @@ using System.Web.UI.WebControls; namespace MonoTests.DataSource { - public abstract class DynamicDataContainer : IDynamicDataContainer - { - public T Data { - get; - set; - } + public abstract class DynamicDataContainer : IDynamicDataContainer + { + T containedTypeInstance; - public virtual Type ContainedType - { - get { return typeof (T); } - } + public string TableName { + get; + set; + } - public DynamicDataContainer (T data) - { - this.Data = data; - } + public T ContainedTypeInstance { + get { return containedTypeInstance; } + set { + if (value == null) + throw new InvalidOperationException ("Null type instance is not allowed."); + containedTypeInstance = value; + } + } - #region IDynamicDataContainer Members - public abstract int Update (IDictionary keys, IDictionary values, IDictionary oldValues); - public abstract int Insert(IDictionary values); - public abstract int Delete(IDictionary keys, IDictionary oldValues); - public abstract IEnumerable Select(DataSourceSelectArguments args, string where, ParameterCollection whereParams); - public abstract List GetTables (); - #endregion - } + public DynamicDataContainer () + : this (null) + { } + + public DynamicDataContainer (string tableName) + { + TableName = tableName; + ContainedTypeInstance = Activator.CreateInstance (); + } + + public virtual Type ContainedType + { + get { return typeof (T); } + } + + #region IDynamicDataContainer Members + public abstract int Update (IDictionary keys, IDictionary values, IDictionary oldValues); + public abstract int Insert (IDictionary values); + public abstract int Delete (IDictionary keys, IDictionary oldValues); + public abstract IEnumerable Select (DataSourceSelectArguments args, string where, ParameterCollection whereParams); + public abstract List GetTables (); + #endregion + } } diff --git a/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataSource.cs b/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataSource.cs index 123e77587aa..1378f61cdaa 100644 --- a/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataSource.cs +++ b/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataSource.cs @@ -9,117 +9,142 @@ using System.Web.UI.WebControls; namespace MonoTests.DataSource { - [PersistChildren(false)] - [ParseChildren(true)] - public class DynamicDataSource : DataSourceControl, IDynamicDataSource - { - const string DEFAULT_VIEW_NAME = "DefaultView"; - static readonly string[] emptyNames = new string[] { "DefaultView" }; - - DynamicDataSourceView defaultView; - ParameterCollection whereCollection; - - public DynamicDataSourceView DefaultView - { - get - { - if (defaultView == null) - defaultView = new DynamicDataSourceView (this, DEFAULT_VIEW_NAME); - return defaultView; - } - } - - public string DataContainerTypeName - { - get; - set; - } - - public object DataContainerInstance - { - get; - set; - } - - #region DataSourceControl Members - protected override DataSourceView GetView (string viewName) - { - if (String.IsNullOrEmpty (viewName)) - return DefaultView; - - return new DynamicDataSourceView (this, viewName); - } - #endregion - - #region IDynamicDataSource Members - - public bool AutoGenerateWhereClause - { - get; - set; - } - - public Type ContextType - { - get; - set; - } - - public bool EnableDelete - { - get; - set; - } - - public bool EnableInsert - { - get; - set; - } - - public bool EnableUpdate - { - get; - set; - } - - public string EntitySetName - { - get; - set; - } - - public event EventHandler Exception; - - public string Where - { - get; - set; - } - - [PersistenceMode (PersistenceMode.InnerProperty)] - public ParameterCollection WhereParameters - { - get { - if (whereCollection == null) - whereCollection = new ParameterCollection (); - return whereCollection; - } - } - - #endregion - - #region IDataSource Members - DataSourceView IDataSource.GetView (string viewName) - { - return GetView (viewName); - } - - ICollection IDataSource.GetViewNames () - { - return emptyNames; - } - - #endregion - } + [PersistChildren (false)] + [ParseChildren (true)] + public class DynamicDataSource : DataSourceControl, IDynamicDataSource + { + const string DEFAULT_VIEW_NAME = "DefaultView"; + static readonly string[] emptyNames = new string[] { "DefaultView" }; + + DataSourceView defaultView; + ParameterCollection whereCollection; + Type dataContainerType; + + public DynamicDataSource () + : this (null) + { + } + + public DynamicDataSource (string dataContainerTypeName) + { + this.DataContainerTypeName = dataContainerTypeName; + } + + public DataSourceView DefaultView { + get { + if (defaultView == null) + defaultView = CreateView (DEFAULT_VIEW_NAME); + return defaultView; + } + } + + public Type DataContainerType { + get { + if (dataContainerType == null) + dataContainerType = Type.GetType (DataContainerTypeName, true); + + return dataContainerType; + } + } + + public string DataContainerTypeName { + get; + set; + } + + public object DataContainerInstance + { + get; + set; + } + + DataSourceView CreateView (string viewName) + { + Type genType = typeof (DynamicDataSourceView<>).GetGenericTypeDefinition (); + + return Activator.CreateInstance (genType.MakeGenericType (new Type[] { ContextType }), this, viewName) as DataSourceView; + } + + #region DataSourceControl Members + protected override DataSourceView GetView (string viewName) + { + if (String.IsNullOrEmpty (viewName)) + return DefaultView; + + return CreateView (viewName); + } + #endregion + + #region IDynamicDataSource Members + + public bool AutoGenerateWhereClause + { + get; + set; + } + + public Type ContextType + { + get; + set; + } + + public bool EnableDelete + { + get; + set; + } + + public bool EnableInsert + { + get; + set; + } + + public bool EnableUpdate + { + get; + set; + } + + public string EntitySetName + { + get; + set; + } + + public event EventHandler Exception; + + public string Where + { + get; + set; + } + + [PersistenceMode (PersistenceMode.InnerProperty)] + public ParameterCollection WhereParameters + { + get + { + if (whereCollection == null) + whereCollection = new ParameterCollection (); + return whereCollection; + } + } + + #endregion + + #region IDataSource Members + DataSourceView IDataSource.GetView (string viewName) + { + return GetView (viewName); + } + + ICollection IDataSource.GetViewNames () + { + return emptyNames; + } + + #endregion + } } diff --git a/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataSourceView.cs b/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataSourceView.cs index e782e723145..f5fa1880149 100644 --- a/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataSourceView.cs +++ b/mcs/class/System.Web.DynamicData/Test/DataSource/DynamicDataSourceView.cs @@ -9,104 +9,106 @@ using System.Web.UI.WebControls; namespace MonoTests.DataSource { - public class DynamicDataSourceView : DataSourceView - { - #region Private fields - DynamicDataSource owner; - IDynamicDataContainer dataContainer; - #endregion - - #region Can* overrides - public override bool CanDelete - { - get { return true; } - } - - public override bool CanInsert - { - get { return true; } - } - - public override bool CanPage - { - get { return true; } - } - - public override bool CanRetrieveTotalRowCount - { - get { return true; } - } - - public override bool CanSort - { - get { return true; } - } - - public override bool CanUpdate - { - get { return true; } - } - #endregion - - public IDynamicDataContainer DataContainerInstance - { - get - { - if (dataContainer != null) - return dataContainer; - - object inst = owner.DataContainerInstance; - if (inst != null) { - dataContainer = inst as IDynamicDataContainer; - if (inst == null) - throw new InvalidOperationException ( - "DynamicDataSource.DataContainerInstance must be set to an instance of IDynamicDataContainer."); - return dataContainer; - } - - string typeName = owner.DataContainerTypeName; - if (String.IsNullOrEmpty (typeName)) - throw new InvalidOperationException ("DynamicDataSource '" + owner.ID + "' does not specify either data container instance or its type name."); - - Type type = Type.GetType (typeName, true); - if (!typeof (IDynamicDataContainer).IsAssignableFrom (type)) - throw new InvalidOperationException ("Data container type '" + typeName + "' specified by DynamicDataSource '" + owner.ID + "' does not implement the IDynamicDataContainer interface."); - dataContainer = Activator.CreateInstance (type) as IDynamicDataContainer; - if (dataContainer == null) - throw new InvalidOperationException ("Failed to create instance of data container type '" + typeName + "'."); - return dataContainer; - } - } - - #region Constructors - public DynamicDataSourceView (DynamicDataSource owner, string viewName) - : base (owner, viewName) - { - this.owner = owner; - } - - #endregion - - #region DataSourceView methods - protected override int ExecuteDelete (IDictionary keys, IDictionary oldValues) - { - return DataContainerInstance.Delete (keys, oldValues); - } - - protected override int ExecuteInsert (IDictionary values) - { - return DataContainerInstance.Insert (values); - } - - protected override int ExecuteUpdate (IDictionary keys, IDictionary values, IDictionary oldValues) - { - return DataContainerInstance.Update (keys, values, oldValues); - } - - protected override IEnumerable ExecuteSelect (DataSourceSelectArguments arguments) - { - return DataContainerInstance.Select (arguments, owner.Where, owner.WhereParameters); - } - #endregion - } + public class DynamicDataSourceView : DataSourceView + { + #region Private fields + DynamicDataSource owner; + IDynamicDataContainer dataContainer; + #endregion + + #region Can* overrides + public override bool CanDelete + { + get { return true; } + } + + public override bool CanInsert + { + get { return true; } + } + + public override bool CanPage + { + get { return true; } + } + + public override bool CanRetrieveTotalRowCount + { + get { return true; } + } + + public override bool CanSort + { + get { return true; } + } + + public override bool CanUpdate + { + get { return true; } + } + #endregion + + public IDynamicDataContainer DataContainerInstance + { + get + { + if (dataContainer != null) + return dataContainer; + + object inst = owner.DataContainerInstance; + if (inst != null) { + dataContainer = inst as IDynamicDataContainer; + if (dataContainer == null) + throw new InvalidOperationException ( + "DynamicDataSource.DataContainerInstance must be set to an instance of '" + typeof (IDynamicDataContainer ) + "'."); + if (String.IsNullOrEmpty (dataContainer.TableName)) + dataContainer.TableName = owner.EntitySetName; + return dataContainer; + } + + string typeName = owner.DataContainerTypeName; + if (String.IsNullOrEmpty (typeName)) + throw new InvalidOperationException ("DynamicDataSource '" + owner.ID + "' does not specify either data container instance or its type name."); + + Type type = Type.GetType (typeName, true); + if (!typeof (IDynamicDataContainer).IsAssignableFrom (type)) + throw new InvalidOperationException ("Data container type '" + typeName + "' specified by DynamicDataSource '" + owner.ID + "' does not implement the IDynamicDataContainer interface."); + dataContainer = Activator.CreateInstance (type, owner.EntitySetName) as IDynamicDataContainer; + if (dataContainer == null) + throw new InvalidOperationException ("Failed to create instance of data container type '" + typeName + "'."); + return dataContainer; + } + } + + #region Constructors + public DynamicDataSourceView (DynamicDataSource owner, string viewName) + : base (owner, viewName) + { + this.owner = owner; + } + + #endregion + + #region DataSourceView methods + protected override int ExecuteDelete (IDictionary keys, IDictionary oldValues) + { + return DataContainerInstance.Delete (keys, oldValues); + } + + protected override int ExecuteInsert (IDictionary values) + { + return DataContainerInstance.Insert (values); + } + + protected override int ExecuteUpdate (IDictionary keys, IDictionary values, IDictionary oldValues) + { + return DataContainerInstance.Update (keys, values, oldValues); + } + + protected override IEnumerable ExecuteSelect (DataSourceSelectArguments arguments) + { + return DataContainerInstance.Select (arguments, owner.Where, owner.WhereParameters); + } + #endregion + } } diff --git a/mcs/class/System.Web.DynamicData/Test/DataSource/IDynamicDataContainer.cs b/mcs/class/System.Web.DynamicData/Test/DataSource/IDynamicDataContainer.cs index 7969e88d3e3..26575433a0d 100644 --- a/mcs/class/System.Web.DynamicData/Test/DataSource/IDynamicDataContainer.cs +++ b/mcs/class/System.Web.DynamicData/Test/DataSource/IDynamicDataContainer.cs @@ -8,17 +8,16 @@ using System.Web.UI.WebControls; namespace MonoTests.DataSource { - public interface IDynamicDataContainer - { - Type ContainedType - { - get; - } + public interface IDynamicDataContainer + { + T ContainedTypeInstance { get; set; } + Type ContainedType { get; } + string TableName { get; set; } - int Update (IDictionary keys, IDictionary values, IDictionary oldValues); - int Insert (IDictionary values); - int Delete (IDictionary keys, IDictionary oldValues); - IEnumerable Select (DataSourceSelectArguments args, string where, ParameterCollection whereParams); - List GetTables (); - } + int Update (IDictionary keys, IDictionary values, IDictionary oldValues); + int Insert (IDictionary values); + int Delete (IDictionary keys, IDictionary oldValues); + IEnumerable Select (DataSourceSelectArguments args, string where, ParameterCollection whereParams); + List GetTables (); + } } diff --git a/mcs/class/System.Web.DynamicData/Test/ModelProviders/ChangeLog b/mcs/class/System.Web.DynamicData/Test/ModelProviders/ChangeLog index 95dda228289..ba6cca90bbc 100644 --- a/mcs/class/System.Web.DynamicData/Test/ModelProviders/ChangeLog +++ b/mcs/class/System.Web.DynamicData/Test/ModelProviders/ChangeLog @@ -1,3 +1,20 @@ +2009-07-03 Marek Habersack + + * DynamicDataContainerModelProvider.cs, + DynamicDataContainerTableProvider.cs: are generic classes now. + +2009-06-18 Marek Habersack + + * DynamicDataContainerColumnProvider.cs: added setting of + IsSortable + +2009-06-17 Marek Habersack + + * DynamicDataStringLengthAttribute.cs: added + + * DynamicDataContainerColumnProvider.cs: implemented + EntityTypeProperty, IsCustomProperty, IsGenerated, MaxLength. + 2009-06-12 Marek Habersack * DynamicDataContainerColumnProvider.cs: implemented table diff --git a/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerColumnProvider.cs b/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerColumnProvider.cs index d95a151cc90..1619ffbe19e 100644 --- a/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerColumnProvider.cs +++ b/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerColumnProvider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Web; using System.Web.DynamicData; using System.Web.DynamicData.ModelProviders; @@ -9,7 +10,7 @@ using MonoTests.DataSource; namespace MonoTests.ModelProviders { - public class DynamicDataContainerColumnProvider : ColumnProvider + public class DynamicDataContainerColumnProvider : ColumnProvider { DynamicDataColumn column; bool associationResolved; @@ -25,7 +26,7 @@ namespace MonoTests.ModelProviders } } - public DynamicDataContainerColumnProvider (DynamicDataContainerTableProvider owner, DynamicDataColumn column) + public DynamicDataContainerColumnProvider (DynamicDataContainerTableProvider owner, DynamicDataColumn column) : base (owner) { if (column == null) @@ -35,12 +36,17 @@ namespace MonoTests.ModelProviders Type columnType = column.DataType; if (columnType == null) - throw new InvalidOperationException ("column.DataType must not be null for column '" + column.Name + "'"); + throw new InvalidOperationException ("column.TContext must not be null for column '" + column.Name + "'"); Name = column.Name; ColumnType = columnType; Nullable = columnType.IsGenericType && typeof (Nullable<>).IsAssignableFrom (columnType.GetGenericTypeDefinition ()); IsPrimaryKey = column.PrimaryKey; + EntityTypeProperty = GetPropertyInfo (owner.EntityType, Name); + IsCustomProperty = column.CustomProperty; + IsGenerated = column.Generated; + MaxLength = GetMaxLength (EntityTypeProperty); + IsSortable = column.Sortable; } public void ResolveAssociations () @@ -91,5 +97,37 @@ namespace MonoTests.ModelProviders IsForeignKeyComponent = true; Association = new DynamicDataAssociationProvider (column.AssociationDirection, this, toColumn); } + + int GetMaxLength (PropertyInfo pi) + { + if (pi == null) + return 0; + + object[] attrs = pi.GetCustomAttributes (typeof (DynamicDataStringLengthAttribute), true); + if (attrs == null || attrs.Length == 0) + return 0; + + var attr = attrs[0] as DynamicDataStringLengthAttribute; + if (attr == null) + return 0; + + return attr.MaxLength; + } + + PropertyInfo GetPropertyInfo (Type type, string name) + { + try { + PropertyInfo ret = type.GetProperties (BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy). + First ((pi) => { + if (String.Compare (pi.Name, name, StringComparison.Ordinal) == 0) + return true; + return false; + } + ); + return ret; + } catch (InvalidOperationException ex) { + return null; + } + } } } diff --git a/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerModelProvider.cs b/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerModelProvider.cs index ed53959337a..64f05ec072f 100644 --- a/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerModelProvider.cs +++ b/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerModelProvider.cs @@ -7,23 +7,24 @@ using System.Web.DynamicData; using System.Web.DynamicData.ModelProviders; using MonoTests.DataSource; +using MonoTests.Common; namespace MonoTests.ModelProviders { - public class DynamicDataContainerModelProvider : DataModelProvider + public class DynamicDataContainerModelProvider : DataModelProvider { - IDynamicDataContainer container; + IDynamicDataContainer container; Type containerType; ReadOnlyCollection tables; - IDynamicDataContainer Container + public IDynamicDataContainer Container { get { if (container != null) return container; - container = Activator.CreateInstance (containerType) as IDynamicDataContainer; + container = Activator.CreateInstance (containerType) as IDynamicDataContainer ; if (container == null) throw new InvalidOperationException ("Failed to create an instance of container type '" + ContextType + "'."); @@ -35,7 +36,7 @@ namespace MonoTests.ModelProviders { get { - return Container.ContainedType; + return typeof (TContext); } protected set { @@ -43,18 +44,13 @@ namespace MonoTests.ModelProviders } } - public DynamicDataContainerModelProvider (Type containerType) + public DynamicDataContainerModelProvider () { - if (containerType == null) - throw new ArgumentNullException ("contextType"); - - if (!typeof (IDynamicDataContainer).IsAssignableFrom (containerType)) - throw new ArgumentException ("Container type must implement the IDynamicDataContainer interface.", "contextType"); - - this.containerType = containerType; + Type genType = typeof (TestDataContainer<>).GetGenericTypeDefinition (); + this.containerType = genType.MakeGenericType (new Type[] { ContextType }); } - public DynamicDataContainerModelProvider (IDynamicDataContainer container) + public DynamicDataContainerModelProvider (IDynamicDataContainer container) { if (container == null) throw new ArgumentNullException ("container"); @@ -82,7 +78,7 @@ namespace MonoTests.ModelProviders void ResolveAssociations () { foreach (var t in Tables) { - var table = t as DynamicDataContainerTableProvider; + var table = t as DynamicDataContainerTableProvider ; if (t == null) continue; table.ResolveAssociations (); @@ -98,7 +94,7 @@ namespace MonoTests.ModelProviders var tables = new List (); foreach (var table in containerTables) - tables.Add (new DynamicDataContainerTableProvider (this, table)); + tables.Add (new DynamicDataContainerTableProvider (this, table)); return new ReadOnlyCollection (tables); } diff --git a/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerTableProvider.cs b/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerTableProvider.cs index 12c39d9b715..ed02519876c 100644 --- a/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerTableProvider.cs +++ b/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataContainerTableProvider.cs @@ -10,12 +10,12 @@ using MonoTests.DataSource; namespace MonoTests.ModelProviders { - public class DynamicDataContainerTableProvider : TableProvider + public class DynamicDataContainerTableProvider : TableProvider { ReadOnlyCollection columns; DynamicDataTable table; - public DynamicDataContainerTableProvider (DynamicDataContainerModelProvider owner, DynamicDataTable table) + public DynamicDataContainerTableProvider (DynamicDataContainerModelProvider owner, DynamicDataTable table) : base (owner) { if (table == null) @@ -52,16 +52,16 @@ namespace MonoTests.ModelProviders var columns = new List (); foreach (var column in containerColumns) - columns.Add (new DynamicDataContainerColumnProvider (this, column)); + columns.Add (new DynamicDataContainerColumnProvider (this, column)); return new ReadOnlyCollection (columns); } public void ResolveAssociations () { - DynamicDataContainerColumnProvider column; + DynamicDataContainerColumnProvider column; foreach (var cp in Columns) { - column = cp as DynamicDataContainerColumnProvider; + column = cp as DynamicDataContainerColumnProvider ; if (column == null) continue; column.ResolveAssociations (); diff --git a/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataSortableAttribute.cs b/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataSortableAttribute.cs new file mode 100644 index 00000000000..04ab907941c --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataSortableAttribute.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web.DynamicData.ModelProviders; + +namespace MonoTests.ModelProviders +{ + [AttributeUsage (AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] + class DynamicDataSortableAttribute : Attribute + { + public bool Sortable { get; private set; } + + public DynamicDataSortableAttribute (bool sortable) + { + Sortable = sortable; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataStringLengthAttribute.cs b/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataStringLengthAttribute.cs new file mode 100644 index 00000000000..1611d1e7d6c --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/ModelProviders/DynamicDataStringLengthAttribute.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web.DynamicData.ModelProviders; + +namespace MonoTests.ModelProviders +{ + [AttributeUsage (AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] + class DynamicDataStringLengthAttribute : Attribute + { + public int MaxLength { get; private set; } + + public DynamicDataStringLengthAttribute (int maxLength) + { + MaxLength = maxLength; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/ChangeLog b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/ChangeLog index 09cf2bb0446..e545ddc4e7c 100644 --- a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/ChangeLog +++ b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/ChangeLog @@ -1,3 +1,61 @@ +2009-07-08 Marek Habersack + + * DynamicControlTest.cs: added tests for ApplyFormatInEditMode, + Column, ConvertEmptyStringToNull, CssClass, DataField, + DataFormatString, FieldTemplate, Table, UIHint + +2009-07-03 Marek Habersack + + * DynamicControlTest.cs: added + +2009-06-27 Marek Habersack + + * DynamicDataExtensionsTest.cs: added test for ConvertEditedValue + + * MetaModelTest.cs: added test for DynamicDataFolderVirtualPath + + * DynamicDataRouteHandlerTest.cs: implemented tests for + CreateHandler (one of them isn't working atm), + GetCustomVirtualPagePath, GetScaffoldVirtualPagePath, + GetRequestMetaTable, SetRequestMetaTable + +2009-06-26 Marek Habersack + + * DynamicDataRouteTest.cs: MyDataContext3 is safely registered in + the fixture setup method. + Enabled the GetTableFromRouteData3 and GetRouteData tests - the + work fine now. + Added test for the RouteHandler property. + + * DynamicDataRouteHandlerTest.cs: added tests for the constructor + and the Model property. + +2009-06-25 Marek Habersack + + * MetaTableTest.cs: new GetVirtualPath tests. + + * DynamicDataRouteTest.cs: added tests for route.Defaults + modifications on class init. + + * DynamicDataRouteHandlerTest.cs: added + +2009-06-18 Marek Habersack + + * MetaColumnTest.cs: added test for SortExpression + +2009-06-17 Marek Habersack + + * MetaColumnTest.cs: added another data context. + Added tests for EntityTypeProperty, HtmlEncode, IsBinaryData, + IsCustomProperty, IsFloatingPoint, IsForeignKeyComponent, + IsGenerated, IsInteger, IsLongString, IsPrimaryKey, IsReadOnly, + IsString, MaxLength, Model, Name, NullDisplayText, Provider, + RequiredErrorMessage, Scaffold, Table, TypeCode, UIHint. + +2009-06-15 Marek Habersack + + * MetaColumnTest.cs: added + 2009-06-12 Marek Habersack * MetaTableTest.cs: tests use single data model provider now. diff --git a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicControlTest.cs b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicControlTest.cs new file mode 100644 index 00000000000..3a29e1b5c7a --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicControlTest.cs @@ -0,0 +1,894 @@ +// +// MetaModelTest.cs +// +// Authors: +// Marek Habersack +// +// Copyright (C) 2009 Novell Inc. http://novell.com +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel.DataAnnotations; +using System.Data.SqlClient; +using System.Data.Linq; +using System.Data.Linq.Mapping; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Security.Permissions; +using System.Security.Principal; +using System.Web; +using System.Web.UI; +using System.Web.DynamicData; +using System.Web.DynamicData.ModelProviders; +using System.Web.Routing; +using System.Web.UI.HtmlControls; +using System.Web.UI.WebControls; +using System.IO; + +using NUnit.Framework; +using NUnit.Mocks; +using MonoTests.stand_alone.WebHarness; +using MonoTests.SystemWeb.Framework; +using MonoTests.Common; +using MonoTests.DataSource; +using MonoTests.DataObjects; + +using MetaModel = System.Web.DynamicData.MetaModel; +using MetaTable = System.Web.DynamicData.MetaTable; + +namespace MonoTests.System.Web.DynamicData +{ + [TestFixture] + public class DynamicControlTest + { + sealed class FieldTemplateTestDescription + { + public string ColumnName { get; private set; } + public string ControlVirtualPath { get; private set; } + public bool IsNull { get; private set; } + + public FieldTemplateTestDescription (string columnName) + : this (columnName, String.Empty, true) + { } + + public FieldTemplateTestDescription (string columnName, string virtualPath) + : this (columnName, virtualPath, false) + { } + + public FieldTemplateTestDescription (string columnName, string virtualPath, bool isNull) + { + ColumnName = columnName; + ControlVirtualPath = virtualPath; + IsNull = isNull; + } + } + + [SetUp] + public void PerTestSetUp () + { + // This is ran before every test + CleanUp_FullTypeNameTemplates (); + CleanUp_ShortTypeNameTemplates (); + } + + [TestFixtureSetUp] + public void SetUp () + { + Type type = GetType (); + WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_01.aspx", "ListView_DynamicControl_01.aspx"); + WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_01.aspx.cs", "ListView_DynamicControl_01.aspx.cs"); + WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_02.aspx", "ListView_DynamicControl_02.aspx"); + WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_02.aspx.cs", "ListView_DynamicControl_02.aspx.cs"); + WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_03.aspx", "ListView_DynamicControl_03.aspx"); + WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_03.aspx.cs", "ListView_DynamicControl_03.aspx.cs"); + WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_04.aspx", "ListView_DynamicControl_04.aspx"); + WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_04.aspx.cs", "ListView_DynamicControl_04.aspx.cs"); + } + + [Test] + public void Defaults () + { + var dc = new DynamicControl (); + + Assert.AreEqual (false, dc.ApplyFormatInEditMode, "#A1"); + Assert.AreEqual (null, dc.Column, "#A2"); + Assert.AreEqual (false, dc.ConvertEmptyStringToNull, "#A3"); + Assert.AreEqual (String.Empty, dc.CssClass, "#A4"); + Assert.AreEqual (String.Empty, dc.DataField, "#A5"); + Assert.AreEqual (String.Empty, dc.DataFormatString, "#A6"); + Assert.AreEqual (null, dc.FieldTemplate, "#A7"); + Assert.AreEqual (true, dc.HtmlEncode, "#A8"); + Assert.AreEqual (dc, ((IFieldTemplateHost) dc).FormattingOptions, "#A9"); + Assert.AreEqual (DataBoundControlMode.ReadOnly, dc.Mode, "#A10"); + Assert.AreEqual (String.Empty, dc.NullDisplayText, "#A11"); + // Throws NREX on .NET .... (why am I still surprised by this?) + // Calls DynamicDataExtensions.FindMetaTable which is where the exception is thrown from + // Assert.AreEqual (null, dc.Table, "#A12"); + Assert.AreEqual (String.Empty, dc.UIHint, "#A13"); + Assert.AreEqual (String.Empty, dc.ValidationGroup, "#A14"); + } + + [Test] + public void ApplyFormatInEditMode () + { + var test = new WebTest ("ListView_DynamicControl_01.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (ApplyFormatInEditMode_OnLoad); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + } + + static void ApplyFormatInEditMode_OnLoad (Page p) + { + var lc = p.FindControl ("ListView1") as ListView; + Assert.IsNotNull (lc, "#A1"); + + var dc = lc.FindChild ("FirstName"); + Assert.IsNotNull (dc, "#B1-1"); + Assert.AreEqual ("FirstName", dc.ID, "#B1-2"); + Assert.AreEqual (false, dc.Column.ApplyFormatInEditMode, "#B1-3"); + Assert.AreEqual (false, dc.ApplyFormatInEditMode, "#B1-4"); + + dc = lc.FindChild ("Active"); + Assert.IsNotNull (dc, "#C1"); + Assert.AreEqual ("Active", dc.ID, "#C1-1"); + Assert.AreEqual (true, dc.Column.ApplyFormatInEditMode, "#C1-2"); + Assert.AreEqual (true, dc.ApplyFormatInEditMode, "#C1-3"); + + dc.ApplyFormatInEditMode = false; + Assert.AreEqual (false, dc.ApplyFormatInEditMode, "#C1-4"); + Assert.AreEqual (true, dc.Column.ApplyFormatInEditMode, "#C1-5"); + } + + [Test] + public void Column () + { + var test = new WebTest ("ListView_DynamicControl_01.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (Column_OnLoad); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + } + + static void Column_OnLoad (Page p) + { + var lc = p.FindControl ("ListView1") as ListView; + Assert.IsNotNull (lc, "#A1"); + + var dc = lc.FindChild ("FirstName"); + Assert.IsNotNull (dc, "#A1-1"); + Assert.IsNotNull (dc.Column, "#B1"); + + // Safe not to check for GetModel's return value - it throws if model isn't found, same + // goes for GetTable and GetColumn + MetaTable table = MetaModel.GetModel (typeof (EmployeesDataContext)).GetTable ("EmployeeTable"); + MetaColumn column = table.GetColumn ("FirstName"); + Assert.AreEqual (column, dc.Column, "#B1-1"); + Assert.AreEqual (dc.Column.Table, dc.Table, "#B1-2"); + + dc.Column = column; + Assert.AreEqual (column, dc.Column, "#C1-3"); + + column = table.GetColumn ("Active"); + dc.Column = column; + Assert.AreEqual (column, dc.Column, "#C1-4"); + + // Talk about consistency... + table = MetaModel.GetModel (typeof (EmployeesDataContext)).GetTable ("SeasonalEmployeeTable"); + column = table.GetColumn ("FirstName"); + dc.Column = column; + + Assert.AreNotEqual (dc.Column.Table, dc.Table, "#C1-5"); + } + + [Test] + public void ConvertEmptyStringToNull () + { + var test = new WebTest ("ListView_DynamicControl_01.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (ConvertEmptyStringToNull_OnLoad); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + } + + static void ConvertEmptyStringToNull_OnLoad (Page p) + { + var lc = p.FindControl ("ListView1") as ListView; + Assert.IsNotNull (lc, "#A1"); + + var dc = lc.FindChild ("FirstName"); + Assert.IsNotNull (dc, "#B1-1"); + Assert.AreEqual ("FirstName", dc.ID, "#B1-2"); + Assert.AreEqual (true, dc.Column.ConvertEmptyStringToNull, "#B1-3"); + Assert.AreEqual (true, dc.ConvertEmptyStringToNull, "#B1-4"); + + dc = lc.FindChild ("LastName"); + Assert.IsNotNull (dc, "#C1"); + Assert.AreEqual (true, dc.ConvertEmptyStringToNull, "#C1-1"); + + dc.ConvertEmptyStringToNull = false; + Assert.AreEqual (false, dc.ConvertEmptyStringToNull, "#C1-2"); + Assert.AreEqual (true, dc.Column.ConvertEmptyStringToNull, "#C1-3"); + } + + [Test] + public void CssClass () + { + var dc = new DynamicControl (); + dc.CssClass = "MyCssClass"; + Assert.AreEqual ("MyCssClass", dc.CssClass, "#A1"); + + var test = new WebTest ("ListView_DynamicControl_01.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (CssClass_OnLoad); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + + string html = @" + +Active:"; + Assert.IsTrue (p.IndexOf (html) != -1, "#Y1"); + } + + static void CssClass_OnLoad (Page p) + { + var lc = p.FindControl ("ListView1") as ListView; + Assert.IsNotNull (lc, "#B1"); + + var dc = lc.FindChild ("Active"); + Assert.IsNotNull (dc, "#C1"); + Assert.AreEqual ("Active", dc.DataField, "#C1-1"); + Assert.AreEqual ("activeCssClass", dc.CssClass, "#C1-2"); + } + + [Test] + public void DataField () + { + var dc = new DynamicControl (); + + Assert.AreEqual (String.Empty, dc.DataField, "#A1"); + dc.DataField = "MyField"; + Assert.AreEqual ("MyField", dc.DataField, "#A2"); + } + + [Test] + public void DataField_1 () + { + var test = new WebTest ("ListView_DynamicControl_01.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (DataField_OnLoad_1); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + } + + static void DataField_OnLoad_1 (Page p) + { + var lc = p.FindControl ("ListView1") as ListView; + Assert.IsNotNull (lc, "#A1"); + + var dc = lc.FindChild ("FirstName"); + Assert.IsNotNull (dc, "#A1-1"); + Assert.IsNotNull (dc.DataField, "#A1-2"); + Assert.AreEqual("FirstName", dc.DataField, "#A1-3"); + + // Column and Table aren't set on DataField assignment... + dc.DataField = "Active"; + Assert.AreEqual ("Active", dc.DataField, "#B1"); + Assert.AreEqual ("FirstName", dc.Column.Name, "#B1-1"); + } + + [Test] + public void DataFormatString () + { + var test = new WebTest ("ListView_DynamicControl_01.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (DataFormatString_OnLoad); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + } + + static void DataFormatString_OnLoad (Page p) + { + var lc = p.FindControl ("ListView1") as ListView; + Assert.IsNotNull (lc, "#A1"); + + var dc = lc.FindChild ("FirstName"); + Assert.IsNotNull (dc, "#B1-1"); + Assert.AreEqual ("FirstName", dc.ID, "#B1-2"); + Assert.AreEqual (String.Empty, dc.Column.DataFormatString, "#B1-3"); + Assert.AreEqual (String.Empty, dc.DataFormatString, "#B1-4"); + + dc = lc.FindChild ("Active"); + Assert.IsNotNull (dc, "#C1"); + Assert.AreEqual ("Active", dc.ID, "#C1-1"); + Assert.AreEqual ("Boolean value: {0}", dc.Column.DataFormatString, "#C1-2"); + Assert.AreEqual ("Boolean value: {0}", dc.DataFormatString, "#C1-3"); + + dc.DataFormatString = String.Empty; + Assert.AreEqual (String.Empty, dc.DataFormatString, "#C1-4"); + Assert.AreEqual ("Boolean value: {0}", dc.Column.DataFormatString, "#C1-5"); + } + + [Test] + public void FieldTemplate () + { + var test = new WebTest ("ListView_DynamicControl_03.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + } + + static List fieldTemplateReadOnlyColumns = new List () + { + new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/Boolean.ascx"), + new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("SByte_Column"), + new FieldTemplateTestDescription ("UInt_Column"), + new FieldTemplateTestDescription ("ULong_Column"), + new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("UShort_Column"), + new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime.ascx"), + new FieldTemplateTestDescription ("FooEmpty_Column"), + new FieldTemplateTestDescription ("Object_Column"), + new FieldTemplateTestDescription ("ByteArray_Column"), + new FieldTemplateTestDescription ("IntArray_Column"), + new FieldTemplateTestDescription ("StringArray_Column"), + new FieldTemplateTestDescription ("ObjectArray_Column"), + new FieldTemplateTestDescription ("StringList_Column"), + new FieldTemplateTestDescription ("Dictionary_Column"), + new FieldTemplateTestDescription ("ICollection_Column"), + new FieldTemplateTestDescription ("IEnumerable_Column"), + new FieldTemplateTestDescription ("ICollectionByte_Column"), + new FieldTemplateTestDescription ("IEnumerableByte_Column"), + new FieldTemplateTestDescription ("ByteMultiArray_Column"), + new FieldTemplateTestDescription ("BoolArray_Column"), + new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/Text.ascx"), + }; + + static void FieldTemplate_OnLoad (Page p) + { + var lc = p.FindControl ("ListView3") as ListView; + Assert.IsNotNull (lc, "#A1"); + + int counter = 1; + foreach (var entry in fieldTemplateReadOnlyColumns) { + string columnName = entry.ColumnName; + var dc = lc.FindChild (columnName); + Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1}", counter, columnName)); + Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName)); + + var templateControl = dc.FieldTemplate; + var template = templateControl as FieldTemplateUserControl; + if (entry.IsNull) { + Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName)); + Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName)); + } else { + Assert.IsNotNull (templateControl, String.Format ("#B{0}-5 ({1})", counter, columnName)); + Assert.IsNotNull (template, String.Format ("#B{0}-6 ({1})", counter, columnName)); + Assert.AreEqual (entry.ControlVirtualPath, template.AppRelativeVirtualPath, String.Format ("#B{0}-7 ({1})", counter, columnName)); + } + + counter++; + } + } + + [Test] + public void FieldTemplate_1 () + { + var test = new WebTest ("ListView_DynamicControl_04.aspx"); + var p = test.Run (); + + // Fake post-back + var delegates = new PageDelegates (); + delegates.PreRenderComplete = FieldTemplate_OnPreRenderComplete_1; + test.Invoker = new PageInvoker (delegates); + var fr = new FormRequest (test.Response, "form1"); + fr.Controls.Add ("ListView4$ctrl0$editMe"); + fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit"; + test.Request = fr; + p = test.Run (); + + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + } + + static List fieldTemplateEditColumns = new List () + { + new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/Text_Edit.ascx"), + new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"), + new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"), + new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"), + new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/Boolean_Edit.ascx"), + new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text_Edit.ascx"), + new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"), + new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"), + new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"), + new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/Decimal_Edit.ascx"), + new FieldTemplateTestDescription ("SByte_Column"), + new FieldTemplateTestDescription ("UInt_Column"), + new FieldTemplateTestDescription ("ULong_Column"), + new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/Integer_Edit.ascx"), + new FieldTemplateTestDescription ("UShort_Column"), + new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime_Edit.ascx"), + new FieldTemplateTestDescription ("FooEmpty_Column"), + new FieldTemplateTestDescription ("Object_Column"), + new FieldTemplateTestDescription ("ByteArray_Column"), + new FieldTemplateTestDescription ("IntArray_Column"), + new FieldTemplateTestDescription ("StringArray_Column"), + new FieldTemplateTestDescription ("ObjectArray_Column"), + new FieldTemplateTestDescription ("StringList_Column"), + new FieldTemplateTestDescription ("Dictionary_Column"), + new FieldTemplateTestDescription ("ICollection_Column"), + new FieldTemplateTestDescription ("IEnumerable_Column"), + new FieldTemplateTestDescription ("ICollectionByte_Column"), + new FieldTemplateTestDescription ("IEnumerableByte_Column"), + new FieldTemplateTestDescription ("ByteMultiArray_Column"), + new FieldTemplateTestDescription ("BoolArray_Column"), + new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/MultilineText_Edit.ascx"), + }; + + static void FieldTemplate_OnPreRenderComplete_1 (Page p) + { + var lc = p.FindControl ("ListView4") as ListView; + Assert.IsNotNull (lc, "#A1"); + + int counter = 1; + foreach (var entry in fieldTemplateEditColumns) { + string columnName = entry.ColumnName; + var dc = lc.FindChild (columnName); + Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName)); + Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName)); + + var templateControl = dc.FieldTemplate; + var template = templateControl as FieldTemplateUserControl; + if (entry.IsNull) { + Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName)); + Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName)); + } else { + Assert.IsNotNull (templateControl, String.Format ("#B{0}-5 ({1})", counter, columnName)); + Assert.IsNotNull (template, String.Format ("#B{0}-6 ({1})", counter, columnName)); + Assert.AreEqual (entry.ControlVirtualPath, template.AppRelativeVirtualPath, String.Format ("#B{0}-7 ({1})", counter, columnName)); + } + + counter++; + } + } + + // This tests full type name templates + [Test] + public void FieldTemplate_2 () + { + try { + SetUp_FullTypeNameTemplates (); + var test = new WebTest ("ListView_DynamicControl_03.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad_2); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + } finally { + + } + } + + static List nonDefaultFullTypeNameTemplates = new List () { + "System.Char.ascx", + "System.Char.ascx.cs", + "System.Byte.ascx", + "System.Byte.ascx.cs", + "System.Boolean.ascx", + "System.Boolean.ascx.cs", + "System.Int16.ascx", + "System.Int16.ascx.cs", + "System.Int32.ascx", + "System.Int32.ascx.cs", + "System.Int64.ascx", + "System.Int64.ascx.cs", + "System.String.ascx", + "System.String.ascx.cs", + "System.UInt16.ascx", + "System.UInt16.ascx.cs", + "System.UInt32.ascx", + "System.UInt32.ascx.cs", + "System.UInt64.ascx", + "System.UInt64.ascx.cs", + "System.SByte.ascx", + "System.SByte.ascx.cs", + "System.Object.ascx", + "System.Object.ascx.cs", + "System.Byte[].ascx", + "System.Byte[].ascx.cs", + "System.Collections.Generic.List`1[System.String].ascx", + "System.Collections.Generic.List`1[System.String].ascx.cs", + "MonoTests.Common.FooEmpty.ascx", + "MonoTests.Common.FooEmpty.ascx.cs", + "System.Collections.ICollection.ascx", + "System.Collections.ICollection.ascx.cs", + }; + + void SetUp_FullTypeNameTemplates () + { + Type type = GetType (); + foreach (string tname in nonDefaultFullTypeNameTemplates) + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault." + tname, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname)); + } + + void CleanUp_FullTypeNameTemplates () + { + string baseDir = WebTest.TestBaseDir; + string filePath; + + foreach (string tname in nonDefaultFullTypeNameTemplates) { + filePath = Path.Combine (baseDir, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname)); + try { + if (File.Exists (filePath)) + File.Delete (filePath); + } catch { + // ignore + } + } + } + + static List fieldTemplateNonDefaultColumns = new List () + { + new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/System.Char.ascx"), + new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/System.Byte.ascx"), + new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/System.Int32.ascx"), + new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/System.Int64.ascx"), + new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/System.Boolean.ascx"), + new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/System.String.ascx"), + new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/System.String.ascx"), + new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/System.String.ascx"), + new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/System.String.ascx"), + new FieldTemplateTestDescription ("SByte_Column", "~/DynamicData/FieldTemplates/System.SByte.ascx"), + new FieldTemplateTestDescription ("UInt_Column", "~/DynamicData/FieldTemplates/System.UInt32.ascx"), + new FieldTemplateTestDescription ("ULong_Column", "~/DynamicData/FieldTemplates/System.UInt64.ascx"), + new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/System.Int16.ascx"), + new FieldTemplateTestDescription ("UShort_Column", "~/DynamicData/FieldTemplates/System.UInt16.ascx"), + new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime.ascx"), + new FieldTemplateTestDescription ("FooEmpty_Column", "~/DynamicData/FieldTemplates/MonoTests.Common.FooEmpty.ascx"), + new FieldTemplateTestDescription ("Object_Column", "~/DynamicData/FieldTemplates/System.Object.ascx"), + new FieldTemplateTestDescription ("ByteArray_Column", "~/DynamicData/FieldTemplates/System.Byte[].ascx"), + new FieldTemplateTestDescription ("IntArray_Column"), + new FieldTemplateTestDescription ("StringArray_Column"), + new FieldTemplateTestDescription ("ObjectArray_Column"), + new FieldTemplateTestDescription ("StringList_Column"), + + // Doesn't work for some reason + //new FieldTemplateTestDescription ("StringList_Column", "~/DynamicData/FieldTemplates/System.Collections.Generic.List`1[System.String].ascx"), + new FieldTemplateTestDescription ("Dictionary_Column"), + new FieldTemplateTestDescription ("ICollection_Column", "~/DynamicData/FieldTemplates/System.Collections.ICollection.ascx"), + new FieldTemplateTestDescription ("IEnumerable_Column"), + new FieldTemplateTestDescription ("ICollectionByte_Column"), + new FieldTemplateTestDescription ("IEnumerableByte_Column"), + new FieldTemplateTestDescription ("ByteMultiArray_Column"), + new FieldTemplateTestDescription ("BoolArray_Column"), + new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/System.String.ascx"), + }; + + static void FieldTemplate_OnLoad_2 (Page p) + { + var lc = p.FindControl ("ListView3") as ListView; + Assert.IsNotNull (lc, "#A1"); + + int counter = 1; + foreach (var entry in fieldTemplateNonDefaultColumns) { + string columnName = entry.ColumnName; + var dc = lc.FindChild (columnName); + Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName)); + Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName)); + + var templateControl = dc.FieldTemplate; + var template = templateControl as FieldTemplateUserControl; + if (entry.IsNull) { + Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName)); + Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName)); + } else { + Assert.IsNotNull (templateControl, String.Format ("#B{0}-5 ({1})", counter, columnName)); + Assert.IsNotNull (template, String.Format ("#B{0}-6 ({1})", counter, columnName)); + Assert.AreEqual (entry.ControlVirtualPath, template.AppRelativeVirtualPath, String.Format ("#B{0}-7 ({1})", counter, columnName)); + } + + counter++; + } + } + + // This tests short type name templates + [Test] + public void FieldTemplate_3 () + { + try { + SetUp_ShortTypeNameTemplates (); + var test = new WebTest ("ListView_DynamicControl_03.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (FieldTemplate_OnLoad_3); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + } finally { + + } + } + + static List nonDefaultShortTypeNameTemplates = new List () { + "Char.ascx", + "Char.ascx.cs", + "Byte.ascx", + "Byte.ascx.cs", + "Boolean.ascx", + "Boolean.ascx.cs", + "Int16.ascx", + "Int16.ascx.cs", + "Int32.ascx", + "Int32.ascx.cs", + "Int64.ascx", + "Int64.ascx.cs", + "String.ascx", + "String.ascx.cs", + "UInt16.ascx", + "UInt16.ascx.cs", + "UInt32.ascx", + "UInt32.ascx.cs", + "UInt64.ascx", + "UInt64.ascx.cs", + "SByte.ascx", + "SByte.ascx.cs", + "Object.ascx", + "Object.ascx.cs", + "Byte[].ascx", + "Byte[].ascx.cs", + "FooEmpty.ascx", + "FooEmpty.ascx.cs", + "ICollection.ascx", + "ICollection.ascx.cs", + }; + + void SetUp_ShortTypeNameTemplates () + { + Type type = GetType (); + foreach (string tname in nonDefaultShortTypeNameTemplates) + WebTest.CopyResource (type, "MonoTests.WebPages.DynamicData.FieldTemplates_NonDefault." + tname, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname)); + } + + void CleanUp_ShortTypeNameTemplates () + { + string baseDir = WebTest.TestBaseDir; + string filePath; + + foreach (string tname in nonDefaultShortTypeNameTemplates) { + filePath = Path.Combine (baseDir, TestsSetup.BuildPath ("DynamicData/FieldTemplates/" + tname)); + try { + if (File.Exists (filePath)) + File.Delete (filePath); + } catch { + // ignore + } + } + } + + static List fieldTemplateNonDefaultShortColumns = new List () + { + new FieldTemplateTestDescription ("FooEmpty_Column", "~/DynamicData/FieldTemplates/FooEmpty.ascx"), + new FieldTemplateTestDescription ("Char_Column", "~/DynamicData/FieldTemplates/Char.ascx"), + new FieldTemplateTestDescription ("Byte_Column", "~/DynamicData/FieldTemplates/Byte.ascx"), + new FieldTemplateTestDescription ("Int_Column", "~/DynamicData/FieldTemplates/Int32.ascx"), + new FieldTemplateTestDescription ("Long_Column", "~/DynamicData/FieldTemplates/Int64.ascx"), + new FieldTemplateTestDescription ("Bool_Column", "~/DynamicData/FieldTemplates/Boolean.ascx"), + new FieldTemplateTestDescription ("String_Column", "~/DynamicData/FieldTemplates/Text.ascx"), + new FieldTemplateTestDescription ("Float_Column", "~/DynamicData/FieldTemplates/String.ascx"), + new FieldTemplateTestDescription ("Single_Column", "~/DynamicData/FieldTemplates/String.ascx"), + new FieldTemplateTestDescription ("Double_Column", "~/DynamicData/FieldTemplates/String.ascx"), + new FieldTemplateTestDescription ("Decimal_Column", "~/DynamicData/FieldTemplates/String.ascx"), + new FieldTemplateTestDescription ("SByte_Column", "~/DynamicData/FieldTemplates/SByte.ascx"), + new FieldTemplateTestDescription ("UInt_Column", "~/DynamicData/FieldTemplates/UInt32.ascx"), + new FieldTemplateTestDescription ("ULong_Column", "~/DynamicData/FieldTemplates/UInt64.ascx"), + new FieldTemplateTestDescription ("Short_Column", "~/DynamicData/FieldTemplates/Int16.ascx"), + new FieldTemplateTestDescription ("UShort_Column", "~/DynamicData/FieldTemplates/UInt16.ascx"), + new FieldTemplateTestDescription ("DateTime_Column", "~/DynamicData/FieldTemplates/DateTime.ascx"), + new FieldTemplateTestDescription ("Object_Column", "~/DynamicData/FieldTemplates/Object.ascx"), + new FieldTemplateTestDescription ("ByteArray_Column", "~/DynamicData/FieldTemplates/Byte[].ascx"), + new FieldTemplateTestDescription ("IntArray_Column"), + new FieldTemplateTestDescription ("StringArray_Column"), + new FieldTemplateTestDescription ("ObjectArray_Column"), + new FieldTemplateTestDescription ("StringList_Column"), + + // Doesn't work for some reason + //new FieldTemplateTestDescription ("StringList_Column", "~/DynamicData/FieldTemplates/List`1[System.String].ascx"), + new FieldTemplateTestDescription ("Dictionary_Column"), + new FieldTemplateTestDescription ("ICollection_Column", "~/DynamicData/FieldTemplates/ICollection.ascx"), + new FieldTemplateTestDescription ("IEnumerable_Column"), + new FieldTemplateTestDescription ("ICollectionByte_Column"), + new FieldTemplateTestDescription ("IEnumerableByte_Column"), + new FieldTemplateTestDescription ("ByteMultiArray_Column"), + new FieldTemplateTestDescription ("BoolArray_Column"), + new FieldTemplateTestDescription ("MaximumLength_Column4", "~/DynamicData/FieldTemplates/String.ascx"), + }; + + static void FieldTemplate_OnLoad_3 (Page p) + { + var lc = p.FindControl ("ListView3") as ListView; + Assert.IsNotNull (lc, "#A1"); + + int counter = 1; + foreach (var entry in fieldTemplateNonDefaultShortColumns) { + string columnName = entry.ColumnName; + var dc = lc.FindChild (columnName); + Assert.IsNotNull (dc, String.Format ("#B{0}-1 ({1})", counter, columnName)); + Assert.AreEqual (columnName, dc.ID, String.Format ("#B{0}-2 ({1})", counter, columnName)); + + var templateControl = dc.FieldTemplate; + var template = templateControl as FieldTemplateUserControl; + if (entry.IsNull) { + Assert.IsNull (templateControl, String.Format ("#B{0}-3 ({1})", counter, columnName)); + Assert.IsNull (template, String.Format ("#B{0}-4 ({1})", counter, columnName)); + } else { + Assert.IsNotNull (templateControl, String.Format ("#B{0}-5 ({1})", counter, columnName)); + Assert.IsNotNull (template, String.Format ("#B{0}-6 ({1})", counter, columnName)); + Assert.AreEqual (entry.ControlVirtualPath, template.AppRelativeVirtualPath, String.Format ("#B{0}-7 ({1})", counter, columnName)); + } + + counter++; + } + } + + [Test] + public void Table () + { + var test = new WebTest ("ListView_DynamicControl_01.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (Table_OnLoad); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + } + + static void Table_OnLoad (Page p) + { + var lc = p.FindControl ("ListView1") as ListView; + Assert.IsNotNull (lc, "#A1"); + + var dc = lc.FindChild ("FirstName"); + Assert.IsNotNull (dc, "#A1-1"); + Assert.IsNotNull (dc.Table, "#B1"); + + // Safe not to check for GetModel's return value - it throws if model isn't found, same + // goes for GetTable + MetaTable table = MetaModel.GetModel (typeof (EmployeesDataContext)).GetTable ("EmployeeTable"); + Assert.AreEqual (table, dc.Table, "#B1-1"); + Assert.AreEqual (dc.Table, dc.Column.Table, "#B1-2"); + } + + [Test] + public void UIHint () + { + var test = new WebTest ("ListView_DynamicControl_01.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (UIHint_OnLoad); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + + Assert.IsTrue (p.IndexOf ("LastName: ") != -1, "#Y1"); + Assert.IsTrue (p.IndexOf ("FirstName: ") != -1, "#Y1-1"); + } + + static void UIHint_OnLoad (Page p) + { + var lc = p.FindControl ("ListView1") as ListView; + Assert.IsNotNull (lc, "#A1"); + + var dc = lc.FindChild ("FirstName"); + Assert.IsNotNull (dc, "#B1"); + Assert.AreEqual ("FirstName", dc.DataField, "#B1-1"); + + // Changes below won't affect rendering - we're being called too late in the process + // This is just to test if the property is settable, what are the defaults and whether + // they can be overriden + + // No UIHint attribute on the associated field, no explicit setting + Assert.AreEqual (String.Empty, dc.UIHint, "#C1"); + dc.UIHint = "MyCustomUIHintTemplate_Text"; + Assert.AreEqual ("MyCustomUIHintTemplate_Text", dc.UIHint, "#C1-1"); + + dc = lc.FindChild ("LastName"); + Assert.IsNotNull (dc, "#D1"); + Assert.AreEqual ("LastName", dc.DataField, "#D1-1"); + + // UIHint attribute found on the associated field + Assert.AreEqual ("CustomFieldTemplate", dc.UIHint, "#D1-2"); + dc.UIHint = "MyCustomUIHintTemplate_Text"; + Assert.AreEqual ("MyCustomUIHintTemplate_Text", dc.UIHint, "#D1-3"); + } + + [Test] + public void UIHint_1 () + { + var test = new WebTest ("ListView_DynamicControl_02.aspx"); + test.Invoker = PageInvoker.CreateOnLoad (UIHint_OnLoad_1); + var p = test.Run (); + Assert.IsNotNull (test.Response, "#X1"); + Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p); + Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3"); + + Assert.IsTrue (p.IndexOf ("LastName: ") != -1, "#Y1"); + Assert.IsTrue (p.IndexOf ("FirstName: ") != -1, "#Y1-1"); + } + + static void UIHint_OnLoad_1 (Page p) + { + var lc = p.FindControl ("ListView2") as ListView; + Assert.IsNotNull (lc, "#A1"); + + var dc = lc.FindChild ("FirstName2"); + Assert.IsNotNull (dc, "#B1"); + Assert.AreEqual ("FirstName", dc.DataField, "#B1-1"); + + // No UIHint attribute on the associated field, no explicit setting + Assert.AreEqual (String.Empty, dc.UIHint, "#C1"); + + dc = lc.FindChild ("LastName2"); + Assert.IsNotNull (dc, "#D1"); + Assert.AreEqual ("LastName", dc.DataField, "#D1-1"); + + // UIHint attribute found on the associated field but overriden in the page + Assert.AreEqual ("MyCustomUIHintTemplate_Text", dc.UIHint, "#D1-2"); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicDataExtensionsTest.cs b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicDataExtensionsTest.cs index 6b832d75d97..1f57541ed63 100644 --- a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicDataExtensionsTest.cs +++ b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicDataExtensionsTest.cs @@ -36,6 +36,8 @@ using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using NUnit.Framework; +using MonoTests.Common; + namespace MonoTests.System.Web.DynamicData { class FakeWorkerRequest : HttpWorkerRequest @@ -121,6 +123,38 @@ namespace MonoTests.System.Web.DynamicData [TestFixture] public class DynamicDataExtensionsTest { + [Test] + public void ConvertEditedValue () + { + FieldFormattingOptions fld = null; + + AssertExtensions.Throws (() => { + fld.ConvertEditedValue (null); + }, "#A1"); + + fld = new FieldFormattingOptions (); + fld.SetProperty ("ConvertEmptyStringToNull", false); + Assert.AreEqual (null, fld.ConvertEditedValue (null), "#A2"); + Assert.AreEqual (String.Empty, fld.ConvertEditedValue (String.Empty), "#A2-1"); + Assert.AreEqual ("stuff", fld.ConvertEditedValue ("stuff"), "#A2-2"); + + fld.SetProperty ("ConvertEmptyStringToNull", true); + Assert.AreEqual (null, fld.ConvertEditedValue (null), "#A3"); + Assert.AreEqual (null, fld.ConvertEditedValue (String.Empty), "#A3-1"); + Assert.AreEqual ("stuff", fld.ConvertEditedValue ("stuff"), "#A3-2"); + + fld.SetProperty ("ConvertEmptyStringToNull", false); + fld.SetProperty ("NullDisplayText", "NULL"); + Assert.AreEqual (null, fld.ConvertEditedValue (null), "#A4"); + Assert.AreEqual (String.Empty, fld.ConvertEditedValue (String.Empty), "#A4-1"); + Assert.AreEqual (null, fld.ConvertEditedValue ("NULL"), "#A4-2"); + Assert.AreEqual ("stuff", fld.ConvertEditedValue ("stuff"), "#A4-3"); + + fld.SetProperty ("ConvertEmptyStringToNull", false); + fld.SetProperty ("NullDisplayText", String.Empty); + Assert.AreEqual (String.Empty, fld.ConvertEditedValue (String.Empty), "#A5"); + } + [Test] public void DynamicDataExtensions_GetTable_Test () { diff --git a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicDataRouteHandlerTest.cs b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicDataRouteHandlerTest.cs new file mode 100644 index 00000000000..b144e17e4ed --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicDataRouteHandlerTest.cs @@ -0,0 +1,361 @@ +// +// DynamicDataRouteHandlerTest.cs +// +// Authors: +// Marek Habersack +// +// Copyright (C) 2009 Novell Inc. http://novell.com +// +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel.DataAnnotations; +using System.Data.SqlClient; +using System.Data.Linq; +using System.Data.Linq.Mapping; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Security.Permissions; +using System.Security.Principal; +using System.Web; +using System.Web.UI; +using System.Web.DynamicData; +using System.Web.DynamicData.ModelProviders; +using System.Web.Routing; + +using NUnit.Framework; +using NUnit.Mocks; +using MonoTests.stand_alone.WebHarness; +using MonoTests.SystemWeb.Framework; +using MonoTests.Common; +using MonoTests.ModelProviders; + +using MetaModel = System.Web.DynamicData.MetaModel; +using MetaTable = System.Web.DynamicData.MetaTable; + +namespace MonoTests.System.Web.DynamicData +{ + [TestFixture] + public class DynamicDataRouteHandlerTest + { + DynamicDataContainerModelProvider dynamicModelProvider; + + [TestFixtureSetUp] + public void SetUp () + { + dynamicModelProvider = new DynamicDataContainerModelProvider (); + Utils.RegisterContext (dynamicModelProvider, new ContextConfiguration () { ScaffoldAllTables = true }); + } + + [Test] + public void Constructor () + { + var ddrh = new DynamicDataRouteHandler (); + + Assert.AreEqual (null, ddrh.Model, "#A1"); + } + + [Test] + public void CreateHandlerParams () + { + MetaModel m = Utils.CommonInitialize (); + + var route = RouteTable.Routes[0] as DynamicDataRoute; + MetaTable t = m.Tables[TestDataContext.TableFooEmpty]; + var handler = route.RouteHandler = new DynamicDataRouteHandler (); + + // No null check is made, of course - throws from some internal method + AssertExtensions.Throws (() => { + handler.CreateHandler (null, t, PageAction.Details); + }, "#A1"); + + // No null check again - this time throws from GetCustomPageVirtualPath + AssertExtensions.Throws (() => { + handler.CreateHandler (route, null, PageAction.Details); + }, "#A2"); + + // And once again, no null check and thrown from GetCustomPageVirtualPath as well + AssertExtensions.Throws (() => { + handler.CreateHandler (route, t, null); + }, "#A3"); + } + + [Test] + [Ignore ("Throws NREX on .NET - no idea why and how to make it work. Probably needs full request emulation (using Mainsoft test suite)")] + // Probably need to simulate a full reqest using similar environment as System.Web tests + public void CreateHandler () + { + MetaModel m = Utils.CommonInitialize (); + + var route = RouteTable.Routes[0] as DynamicDataRoute; + MetaTable t = m.Tables[TestDataContext.TableFooEmpty]; + Assert.IsNotNull (t, "#A1"); + + var handler = route.RouteHandler = new DynamicDataRouteHandler (); + var wrapper = new MyHttpContextWrapper (); + var request = wrapper.Request as MyHttpRequestWrapper; + request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/FooEmptyTable/List.aspx"); + request.SetProperty ("PathInfo", String.Empty); + + // This must be non-null because DynamicData doesn't care to check whether the returned + // value is null or not... + request.SetProperty ("QueryString", new NameValueCollection ()); + + // This will assign the route handler's Model property + RouteData rd = route.GetRouteData (wrapper); + Assert.IsNotNull (handler.Model, "#A2"); + + // Throws a NREX from some internal method - no slightest idea why, as none of the parameters + // passed are null + IHttpHandler h = handler.CreateHandler (route, t, PageAction.Details); + Assert.IsNotNull (h, "#A3"); + Assert.AreEqual (typeof (Page), h.GetType (), "#A3-1"); + + var page = h as Page; + Assert.AreEqual (String.Empty, page.AppRelativeVirtualPath, "#A3-2"); + } + + [Test] + public void GetCustomPageVirtualPath () + { + MetaModel m = Utils.CommonInitialize (); + var route = RouteTable.Routes[0] as DynamicDataRoute; + + MetaTable t = m.Tables[TestDataContext.TableFooEmpty]; + Assert.IsNotNull (t, "#A1"); + + // We neeed the handler to have its Model property set + route.RouteHandler = new MyDynamicDataRouteHandler (); + var handler = route.RouteHandler as MyDynamicDataRouteHandler; + Assert.IsNotNull (handler, "#A2"); + + // Lack of null check (for table) + AssertExtensions.Throws (() => { + handler.DoGetCustomPageVirtualPath (null, null); + }, "#A2-1"); + + // Another missing null check (this time for Model)... Are null checks + // out of fashion? + AssertExtensions.Throws (() => { + handler.DoGetCustomPageVirtualPath (t, String.Empty); + }, "#A2-2"); + + var wrapper = new MyHttpContextWrapper (); + var request = wrapper.Request as MyHttpRequestWrapper; + request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/FooEmptyTable/List.aspx"); + request.SetProperty ("PathInfo", String.Empty); + + // This must be non-null because DynamicData doesn't care to check whether the returned + // value is null or not... + request.SetProperty ("QueryString", new NameValueCollection ()); + + // This will assign the route handler's Model property + RouteData rd = route.GetRouteData (wrapper); + Assert.IsNotNull (handler.Model, "#A3"); + + Assert.AreEqual (handler.Model.DynamicDataFolderVirtualPath + "CustomPages/" + t.Name + "/MyCustomPage.aspx", + handler.DoGetCustomPageVirtualPath (t, "MyCustomPage"), "#A4"); + + handler.Model.DynamicDataFolderVirtualPath = "~/MyFolder"; + Assert.AreEqual (handler.Model.DynamicDataFolderVirtualPath + "CustomPages/" + t.Name + "/MyCustomPage.aspx", + handler.DoGetCustomPageVirtualPath (t, "MyCustomPage"), "#A5"); + + // doh! + Assert.AreEqual (handler.Model.DynamicDataFolderVirtualPath + "CustomPages/" + t.Name + "/.aspx", + handler.DoGetCustomPageVirtualPath (t, null), "#A6"); + + Assert.AreEqual (handler.Model.DynamicDataFolderVirtualPath + "CustomPages/" + t.Name + "/.aspx", + handler.DoGetCustomPageVirtualPath (t, String.Empty), "#A7"); + } + + [Test] + public void GetRequestContext () + { + AssertExtensions.Throws (() => { + DynamicDataRouteHandler.GetRequestContext (null); + }, "#A1"); + + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + + RequestContext rc = DynamicDataRouteHandler.GetRequestContext (ctx); + Assert.IsNotNull (rc, "#B1"); + Assert.IsNotNull (rc.HttpContext, "#B1-1"); + Assert.IsNotNull (rc.RouteData, "#B1-2"); + + Assert.IsNull (rc.RouteData.Route, "#C1"); + Assert.IsNull (rc.RouteData.RouteHandler, "#C1-1"); + Assert.IsNotNull (rc.RouteData.Values, "#C1-2"); + Assert.AreEqual (0, rc.RouteData.Values.Count, "#C1-3"); + } + + [Test] + public void GetRequestMetaTable () + { + MetaModel m = Utils.CommonInitialize (); + var route = RouteTable.Routes[0] as DynamicDataRoute; + MetaTable t = m.Tables[TestDataContext.TableFooDisplayName]; + Assert.IsNotNull (t, "#A1"); + + // Surprise! A null check is present! + AssertExtensions.Throws (() => { + DynamicDataRouteHandler.GetRequestMetaTable (null); + }, "#A2"); + + MetaTable t2 = DynamicDataRouteHandler.GetRequestMetaTable (HttpContext.Current); + Assert.IsNull (t2, "#A3"); + + DynamicDataRouteHandler.SetRequestMetaTable (HttpContext.Current, t); + t2 = DynamicDataRouteHandler.GetRequestMetaTable (HttpContext.Current); + Assert.IsNotNull (t2, "#A4"); + Assert.AreEqual (t, t2, "#A4-1"); + } + + [Test] + public void GetScaffoldPageVirtualPath () + { + MetaModel m = Utils.CommonInitialize (); + var route = RouteTable.Routes[0] as DynamicDataRoute; + + MetaTable t = m.Tables[TestDataContext.TableFooDisplayName]; + Assert.IsNotNull (t, "#A1"); + + // We neeed the handler to have its Model property set + route.RouteHandler = new MyDynamicDataRouteHandler (); + var handler = route.RouteHandler as MyDynamicDataRouteHandler; + Assert.IsNotNull (handler, "#A2"); + + // Lack of null check (for table) + AssertExtensions.Throws (() => { + handler.DoGetScaffoldPageVirtualPath (null, null); + }, "#A2-1"); + + // Another missing null check (this time for Model)... Are null checks + // out of fashion? + AssertExtensions.Throws (() => { + handler.DoGetScaffoldPageVirtualPath (t, String.Empty); + }, "#A2-2"); + + var wrapper = new MyHttpContextWrapper (); + var request = wrapper.Request as MyHttpRequestWrapper; + request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/FooDisplayNameTable/List.aspx"); + request.SetProperty ("PathInfo", String.Empty); + + // This must be non-null because DynamicData doesn't care to check whether the returned + // value is null or not... + request.SetProperty ("QueryString", new NameValueCollection ()); + + // This will assign the route handler's Model property + RouteData rd = route.GetRouteData (wrapper); + Assert.IsNotNull (handler.Model, "#A3"); + + Assert.AreEqual (handler.Model.DynamicDataFolderVirtualPath + "PageTemplates/" + "MyCustomPage.aspx", + handler.DoGetScaffoldPageVirtualPath (t, "MyCustomPage"), "#A4"); + + handler.Model.DynamicDataFolderVirtualPath = "~/MyFolder"; + Assert.AreEqual (handler.Model.DynamicDataFolderVirtualPath + "PageTemplates/" + "MyCustomPage.aspx", + handler.DoGetScaffoldPageVirtualPath (t, "MyCustomPage"), "#A5"); + + // doh! + Assert.AreEqual (handler.Model.DynamicDataFolderVirtualPath + "PageTemplates/" + ".aspx", + handler.DoGetScaffoldPageVirtualPath (t, null), "#A6"); + + Assert.AreEqual (handler.Model.DynamicDataFolderVirtualPath + "PageTemplates/" + ".aspx", + handler.DoGetScaffoldPageVirtualPath (t, String.Empty), "#A7"); + } + + [Test] + public void Model () + { + MetaModel m = Utils.CommonInitialize (); + var route = RouteTable.Routes[0] as DynamicDataRoute; + + Assert.IsNotNull (route, "#A1"); + Assert.IsNotNull (route.Model, "#A1-1"); + var handler = route.RouteHandler; + + Assert.IsNotNull (handler, "#A2"); + Assert.IsTrue (handler.GetType () == typeof (MyDynamicDataRouteHandler), "#A2-1"); + Assert.IsNull (handler.Model, "#A2-2"); + + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + + RequestContext rc = DynamicDataRouteHandler.GetRequestContext (ctx); + Assert.IsNotNull (rc, "#B1"); + Assert.IsNull (handler.Model, "#B1-2"); + + var wrapper = new MyHttpContextWrapper (); + var request = wrapper.Request as MyHttpRequestWrapper; + + // It appears .NET checks whether the indicated table exists - if not, GetRouteData will return + // null (even though the Route class will find a match) + request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/NoSuchTable/List.aspx"); + request.SetProperty ("PathInfo", String.Empty); + + // This must be non-null because DynamicData doesn't care to check whether the returned + // value is null or not... + request.SetProperty ("QueryString", new NameValueCollection ()); + + // No table FooTable in the context - returns null + RouteData rd = route.GetRouteData (wrapper); + Assert.IsNull (rd, "#C1"); + + // Apparently Model is set in the above call even though it returns null + Assert.IsNotNull (handler.Model, "#C1-1"); + Assert.AreEqual (route.Model, handler.Model, "#C1-2"); + + request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/BarTable/List.aspx"); + rd = route.GetRouteData (wrapper); + Assert.IsNotNull (rd, "#D1"); + Assert.IsNotNull (handler.Model, "#D1-1"); + Assert.AreEqual (route.Model, handler.Model, "#D1-2"); + } + + [Test] + public void SetRequestMetaTable () + { + MetaModel m = Utils.CommonInitialize (); + var route = RouteTable.Routes[0] as DynamicDataRoute; + MetaTable t = m.Tables[TestDataContext.TableFooDisplayName]; + Assert.IsNotNull (t, "#A1"); + + // And following the tradition... [drum roll] - NO NULL CHECK! + AssertExtensions.Throws (() => { + DynamicDataRouteHandler.SetRequestMetaTable (null, t); + }, "#A2"); + + DynamicDataRouteHandler.SetRequestMetaTable (HttpContext.Current, t); + MetaTable t2 = DynamicDataRouteHandler.GetRequestMetaTable (HttpContext.Current); + Assert.IsNotNull (t2, "#A3"); + Assert.AreEqual (t, t2, "#A3-1"); + + DynamicDataRouteHandler.SetRequestMetaTable (HttpContext.Current, null); + t2 = DynamicDataRouteHandler.GetRequestMetaTable (HttpContext.Current); + Assert.IsNull (t2, "#A4"); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicDataRouteTest.cs b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicDataRouteTest.cs index 2b3e01005ad..3954861970b 100644 --- a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicDataRouteTest.cs +++ b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/DynamicDataRouteTest.cs @@ -1,10 +1,11 @@ // // DynamicDataRouteTest.cs // -// Author: +// Authors: // Atsushi Enomoto +// Marek Habersack // -// Copyright (C) 2008 Novell Inc. http://novell.com +// Copyright (C) 2008-2009 Novell Inc. http://novell.com // // @@ -28,16 +29,47 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel.DataAnnotations; +using System.Data.SqlClient; +using System.Data.Linq; +using System.Data.Linq.Mapping; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Security.Permissions; +using System.Security.Principal; using System.Web; +using System.Web.UI; using System.Web.DynamicData; +using System.Web.DynamicData.ModelProviders; using System.Web.Routing; + using NUnit.Framework; +using NUnit.Mocks; +using MonoTests.stand_alone.WebHarness; +using MonoTests.SystemWeb.Framework; +using MonoTests.Common; +using MonoTests.ModelProviders; +using MetaModel = System.Web.DynamicData.MetaModel; +using MetaTable = System.Web.DynamicData.MetaTable; namespace MonoTests.System.Web.DynamicData { [TestFixture] public class DynamicDataRouteTest { + [TestFixtureSetUp] + public void SetUp () + { + var dynamicModelProvider = new DynamicDataContainerModelProvider (); + Utils.RegisterContext (dynamicModelProvider, new ContextConfiguration () { ScaffoldAllTables = true }); + Utils.RegisterContext (typeof (MyDataContext3)); + } + [Test] public void ConstructorNull () { @@ -60,13 +92,16 @@ namespace MonoTests.System.Web.DynamicData Assert.IsNull (r.Table, "#3"); Assert.IsNull (r.ViewName, "#4"); Assert.IsNotNull (r.RouteHandler, "#5"); - Assert.IsNull (r.RouteHandler.Model, "#6"); + Assert.IsNotNull (r.Model, "#6"); Assert.IsNull (r.RouteHandler.Model, "#7"); // irrelevant to route's MetaModel } [Test] [ExpectedException (typeof (ArgumentNullException))] [Category ("NotDotNet")] // .NET throws NRE. yuck. +#if TARGET_DOTNET + [Ignore ("Throws a NREX on .NET...")] +#endif public void GetActionFromRouteDataNullArg () { new DynamicDataRoute ("x").GetActionFromRouteData (null); @@ -87,7 +122,7 @@ namespace MonoTests.System.Web.DynamicData { var r = new DynamicDataRoute ("x"); var rd = new RouteData (); - rd.Values ["Action"] = "y"; + rd.Values["Action"] = "y"; var a = r.GetActionFromRouteData (rd); Assert.AreEqual ("y", a); } @@ -95,6 +130,9 @@ namespace MonoTests.System.Web.DynamicData [Test] [ExpectedException (typeof (ArgumentNullException))] [Category ("NotDotNet")] // .NET throws NRE. yuck. +#if TARGET_DOTNET + [Ignore ("Throws a NREX on .NET...")] +#endif public void GetTableFromRouteDataNullArg () { new DynamicDataRoute ("x").GetTableFromRouteData (null); @@ -117,29 +155,377 @@ namespace MonoTests.System.Web.DynamicData var r = new DynamicDataRoute ("x"); r.Model = new MetaModel (); var rd = new RouteData (); - rd.Values ["Table"] = "y"; + rd.Values["Table"] = "y"; r.GetTableFromRouteData (rd); // no such table } [Test] - [Category ("NotWorking")] public void GetTableFromRouteData3 () { var r = new DynamicDataRoute ("x"); - r.Model.RegisterContext (typeof (MyDataContext3)); var rd = new RouteData (); - rd.Values ["Table"] = "FooTable"; + rd.Values["Table"] = "FooTable"; var t = r.GetTableFromRouteData (rd); } [Test] - [Ignore ("it requires working HttpContext, and it's somehow not working on both mono and .net")] public void GetRouteData () { var r = new DynamicDataRoute ("{table}/{action}.aspx"); - HttpContext.Current = new HttpContext (new MyHttpWorkerRequest ()); - RouteData rd = r.GetRouteData (new HttpContextStub ("~/FooTable/List.aspx", String.Empty)); - Assert.IsNotNull (rd.RouteHandler, "#1"); + + // We need one which overloads CreateHandler + r.RouteHandler = new MyDynamicDataRouteHandler (); + + var wrapper = new MyHttpContextWrapper (); + var request = wrapper.Request as MyHttpRequestWrapper; + request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/NoSuchTable/List.aspx"); + request.SetProperty ("PathInfo", String.Empty); + + // This must be non-null because DynamicData doesn't care to check whether the returned + // value is null or not... + request.SetProperty ("QueryString", new NameValueCollection ()); + + // It appears .NET checks whether the indicated table exists - if not, GetRouteData will return + // null (even though the Route class will find a match) + RouteData rd = r.GetRouteData (wrapper); + Assert.IsNull (rd, "#A1"); + + request.SetProperty ("AppRelativeCurrentExecutionFilePath", "~/BazTable/List.aspx"); + rd = r.GetRouteData (wrapper); + Assert.IsNotNull (rd, "#B1"); + } + + [Test] + public void RouteHandler () + { + var r = new DynamicDataRoute ("{table}/{action}.aspx"); + + Assert.IsNotNull (r.RouteHandler, "#A1"); + Assert.AreEqual (typeof (DynamicDataRouteHandler), r.RouteHandler.GetType (), "#A1-1"); + + r.RouteHandler = null; + Assert.IsNull (r.RouteHandler, "#A2"); + } + + [Test] + public void BaseDefaultsModification_1 () + { + MetaModel m = MetaModel.Default; + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + + RouteCollection routes = RouteTable.Routes; + routes.Clear (); + + var ddr = new DynamicDataRoute ("{table}/{action}.aspx") { + Action = PageAction.Details, + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }; + + routes.Add (ddr); + + Assert.IsNotNull (ddr, "#A1"); + Assert.IsNull (ddr.Defaults, "#A1-1"); + var rd = new RouteData (); + var hc = new HttpContextWrapper (HttpContext.Current); + + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNotNull (ddr.Defaults, "#B1"); + Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1"); + Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2"); + + ddr.Action = "MyAction"; + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNotNull (ddr.Defaults, "#C1"); + Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1"); + Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2"); + } + + [Test] + public void BaseDefaultsModification_2 () + { + MetaModel m = MetaModel.Default; + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + + RouteCollection routes = RouteTable.Routes; + routes.Clear (); + + var ddr = new DynamicDataRoute ("{table}/{action}.aspx") { + Table = "BazTable", + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }; + + routes.Add (ddr); + + Assert.IsNotNull (ddr, "#A1"); + Assert.IsNull (ddr.Defaults, "#A1-1"); + var rd = new RouteData (); + var hc = new HttpContextWrapper (HttpContext.Current); + + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNotNull (ddr.Defaults, "#B1"); + Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1"); + Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#B1-2"); + + ddr.Table = "AnotherTable"; + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNotNull (ddr.Defaults, "#C1"); + Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1"); + Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#C1-2"); + } + + [Test] + public void BaseDefaultsModification_3 () + { + MetaModel m = MetaModel.Default; + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + + RouteCollection routes = RouteTable.Routes; + routes.Clear (); + + var ddr = new DynamicDataRoute ("{table}/{action}.aspx") { + Table = "MyTable", + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }; + routes.Add (ddr); + var rd = new RouteData (); + var hc = new HttpContextWrapper (HttpContext.Current); + + AssertExtensions.Throws (() => { + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + }, "#A1"); + } + + [Test] + public void BaseDefaultsModification_4 () + { + MetaModel m = MetaModel.Default; + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + + RouteCollection routes = RouteTable.Routes; + routes.Clear (); + + var ddr = new DynamicDataRoute ("{table}/{action}.aspx") { + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }; + routes.Add (ddr); + var rd = new RouteData (); + var hc = new HttpContextWrapper (HttpContext.Current); + + Assert.IsNull (ddr.Defaults, "#A1"); + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNull (ddr.Defaults, "#A2"); + } + + [Test] + public void BaseDefaultsModification_5 () + { + MetaModel m = MetaModel.Default; + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + + RouteCollection routes = RouteTable.Routes; + routes.Clear (); + + var ddr = new DynamicDataRoute ("{table}/{action}.aspx") { + Action = null, + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }; + + routes.Add (ddr); + + Assert.IsNotNull (ddr, "#A1"); + Assert.IsNull (ddr.Defaults, "#A1-1"); + var rd = new RouteData (); + var hc = new HttpContextWrapper (HttpContext.Current); + + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNull (ddr.Defaults, "#B1"); + + ddr.Action = "MyAction"; + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNull (ddr.Defaults, "#C1"); + } + + [Test] + public void BaseDefaultsModification_6 () + { + MetaModel m = MetaModel.Default; + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + + RouteCollection routes = RouteTable.Routes; + routes.Clear (); + + var ddr = new DynamicDataRoute ("{table}/{action}.aspx") { + Action = String.Empty, + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }; + + routes.Add (ddr); + + Assert.IsNotNull (ddr, "#A1"); + Assert.IsNull (ddr.Defaults, "#A1-1"); + var rd = new RouteData (); + var hc = new HttpContextWrapper (HttpContext.Current); + + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNotNull (ddr.Defaults, "#B1"); + Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1"); + Assert.AreEqual (String.Empty, ddr.Defaults["Action"], "#B1-2"); + + ddr.Action = "MyAction"; + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNotNull (ddr.Defaults, "#C1"); + Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1"); + Assert.AreEqual (String.Empty, ddr.Defaults["Action"], "#B1-2"); + } + + [Test] + public void BaseDefaultsModification_7 () + { + MetaModel m = MetaModel.Default; + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + + RouteCollection routes = RouteTable.Routes; + routes.Clear (); + + var ddr = new DynamicDataRoute ("{table}/{action}.aspx") { + Table = null, + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }; + + routes.Add (ddr); + + Assert.IsNotNull (ddr, "#A1"); + Assert.IsNull (ddr.Defaults, "#A1-1"); + var rd = new RouteData (); + var hc = new HttpContextWrapper (HttpContext.Current); + + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNull (ddr.Defaults, "#B1"); + } + + [Test] + public void BaseDefaultsModification_8 () + { + MetaModel m = MetaModel.Default; + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + + RouteCollection routes = RouteTable.Routes; + routes.Clear (); + + var ddr = new DynamicDataRoute ("{table}/{action}.aspx") { + Table = String.Empty, + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }; + + routes.Add (ddr); + var rd = new RouteData (); + var hc = new HttpContextWrapper (HttpContext.Current); + + AssertExtensions.Throws (() => { + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + }, "#A1"); + } + + [Test] + public void BaseDefaultsModification_9 () + { + MetaModel m = MetaModel.Default; + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + + RouteCollection routes = RouteTable.Routes; + routes.Clear (); + + var ddr = new DynamicDataRoute ("{table}/{action}.aspx") { + Defaults = new RouteValueDictionary () { + {"Action", "InitialAction"} + }, + Action = PageAction.Details, + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }; + + routes.Add (ddr); + + Assert.IsNotNull (ddr, "#A1"); + Assert.IsNotNull (ddr.Defaults, "#A1-1"); + var rd = new RouteData (); + var hc = new HttpContextWrapper (HttpContext.Current); + + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNotNull (ddr.Defaults, "#B1"); + Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1"); + Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2"); + + ddr.Action = "MyAction"; + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNotNull (ddr.Defaults, "#C1"); + Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1"); + Assert.AreEqual (PageAction.Details, ddr.Defaults["Action"], "#B1-2"); + } + + [Test] + public void BaseDefaultsModification_10 () + { + MetaModel m = MetaModel.Default; + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + + RouteCollection routes = RouteTable.Routes; + routes.Clear (); + + var ddr = new DynamicDataRoute ("{table}/{action}.aspx") { + Defaults = new RouteValueDictionary () { + {"Table", "FooWithDefaultsTable"} + }, + Table = "BazTable", + Model = m, + RouteHandler = new MyDynamicDataRouteHandler () + }; + + routes.Add (ddr); + + Assert.IsNotNull (ddr, "#A1"); + Assert.IsNotNull (ddr.Defaults, "#A1-1"); + var rd = new RouteData (); + var hc = new HttpContextWrapper (HttpContext.Current); + + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNotNull (ddr.Defaults, "#B1"); + Assert.AreEqual (1, ddr.Defaults.Count, "#B1-1"); + Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#B1-2"); + + ddr.Table = "AnotherTable"; + ddr.GetVirtualPath (new RequestContext (hc, rd), null); + Assert.IsNotNull (ddr.Defaults, "#C1"); + Assert.AreEqual (1, ddr.Defaults.Count, "#C1-1"); + Assert.AreEqual ("BazTable", ddr.Defaults["Table"], "#C1-2"); } } } diff --git a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/MetaColumnTest.cs b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/MetaColumnTest.cs new file mode 100644 index 00000000000..8d5b0fb6f1f --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/MetaColumnTest.cs @@ -0,0 +1,1100 @@ +// +// MetaColumnTest.cs +// +// Authors: +// Marek Habersack +// +// Copyright (C) 2009 Novell Inc. http://novell.com +// +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel.DataAnnotations; +using System.Data.SqlClient; +using System.Data.Linq; +using System.Data.Linq.Mapping; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Security.Permissions; +using System.Security.Principal; +using System.Web; +using System.Web.UI; +using System.Web.DynamicData; +using System.Web.DynamicData.ModelProviders; +using System.Web.Routing; + +using NUnit.Framework; +using NUnit.Mocks; +using MonoTests.stand_alone.WebHarness; +using MonoTests.SystemWeb.Framework; +using MonoTests.Common; +using MonoTests.ModelProviders; + +using MetaModel = System.Web.DynamicData.MetaModel; +using MetaTable = System.Web.DynamicData.MetaTable; + +namespace MonoTests.System.Web.DynamicData +{ + // IMPORTANT + // + // ALL tests which make use of RouteTable.Routes _MUST_ clear the collection before running + // + [TestFixture] + public class MetaColumnTest + { + DynamicDataContainerModelProvider dynamicModelProvider; + DynamicDataContainerModelProvider dynamicModelProviderNoScaffold; + + [TestFixtureSetUp] + public void SetUp () + { + dynamicModelProvider = new DynamicDataContainerModelProvider (); + Utils.RegisterContext (dynamicModelProvider, new ContextConfiguration () { ScaffoldAllTables = true }); + + dynamicModelProviderNoScaffold = new DynamicDataContainerModelProvider (); + Utils.RegisterContext (dynamicModelProviderNoScaffold, new ContextConfiguration () { ScaffoldAllTables = false }, false); + } + + [Test] + public void ApplyFormattingInEditMode () + { + MetaModel m = Utils.CommonInitialize (); + MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes]; + MetaColumn mc = t.GetColumn ("ColumnNoAttributes"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (false, mc.ApplyFormatInEditMode, "#A1-1"); + + mc = t.GetColumn ("ColumnFormatInEditMode"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual (true, mc.ApplyFormatInEditMode, "#A2-1"); + + t = m.Tables[TestDataContext.TableFooWithMetadataType]; + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#C1"); + Assert.AreEqual (true, mc.ApplyFormatInEditMode, "#C1-1"); + + mc = t.GetColumn ("Column2"); + Assert.IsNotNull (mc, "#C2"); + Assert.AreEqual (true, mc.ApplyFormatInEditMode, "#C2-1"); + } + + [Test] + public void Attributes () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes]; + MetaColumn mc = t.GetColumn ("ColumnNoAttributes"); + Assert.IsNotNull (mc, "#A1"); + Assert.IsNotNull (mc.Attributes, "#A2"); + Assert.AreEqual (6, mc.Attributes.Count, "#A3"); + Assert.IsTrue (mc.IsRequired, "#A3-1"); + + mc = t.GetColumn ("ColumnFormatInEditMode"); + Assert.IsNotNull (mc, "#A4"); + Assert.IsNotNull (mc.Attributes, "#A4-1"); + Assert.AreEqual (7, mc.Attributes.Count, "#A4-2"); + Assert.AreEqual (1, mc.Attributes.OfType ().Count (), "#A4-3"); + + mc = t.GetColumn ("ColumnWithDataType"); + Assert.IsNotNull (mc, "#A5"); + Assert.IsNotNull (mc.Attributes, "#A5-1"); + Assert.AreEqual (7, mc.Attributes.Count, "#A5-2"); + Assert.AreEqual (1, mc.Attributes.OfType ().Count (), "#A5-3"); + + t = m.Tables[TestDataContext.TableFooWithMetadataType]; + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#B1"); + Assert.IsNotNull (mc.Attributes, "#B1-1"); + Assert.AreEqual (9, mc.Attributes.Count, "#B1-2"); + Assert.AreEqual (1, mc.Attributes.OfType ().Count (), "#B1-3"); + + mc = t.GetColumn ("Column2"); + Assert.IsNotNull (mc, "#B2"); + Assert.IsNotNull (mc.Attributes, "#B2-1"); + Assert.AreEqual (8, mc.Attributes.Count, "#B2-2"); + Assert.AreEqual (1, mc.Attributes.OfType ().Count (), "#B2-3"); + } + + [Test] + public void ColumnType () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes]; + MetaColumn mc = t.GetColumn ("ColumnNoAttributes"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (typeof (string), mc.ColumnType, "#A3"); + + mc = t.GetColumn ("ColumnFormatInEditMode"); + Assert.IsNotNull (mc, "#A4"); + Assert.IsNotNull (mc.Attributes, "#A4-1"); + Assert.AreEqual (typeof (string), mc.ColumnType, "#A4-2"); + + mc = t.GetColumn ("ColumnWithDataType"); + Assert.IsNotNull (mc, "#A5"); + Assert.IsNotNull (mc.Attributes, "#A5-1"); + Assert.AreEqual (typeof (string), mc.ColumnType, "#A5-2"); + + t = m.Tables[TestDataContext.TableFooWithMetadataType]; + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#B1"); + Assert.IsNotNull (mc.Attributes, "#B1-1"); + Assert.AreEqual (typeof (string), mc.ColumnType, "#B1-2"); + + mc = t.GetColumn ("Column2"); + Assert.IsNotNull (mc, "#B2"); + Assert.IsNotNull (mc.Attributes, "#B2-1"); + Assert.AreEqual (typeof (string), mc.ColumnType, "#B2-2"); + + mc = t.GetColumn ("Column3"); + Assert.IsNotNull (mc, "#C2"); + Assert.IsNotNull (mc.Attributes, "#C2-1"); + Assert.AreEqual (typeof (string), mc.ColumnType, "#C2-2"); + } + + [Test] + public void ConvertEmptyStringToNull () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes]; + MetaColumn mc = t.GetColumn ("ColumnNoAttributes"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (true, mc.ConvertEmptyStringToNull, "#A1-1"); + + mc = t.GetColumn ("ColumnFormatInEditMode"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual (true, mc.ConvertEmptyStringToNull, "#A2-1"); + + t = m.Tables[TestDataContext.TableFooWithMetadataType]; + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#C1"); + Assert.AreEqual (true, mc.ConvertEmptyStringToNull, "#C1-1"); + + mc = t.GetColumn ("Column2"); + Assert.IsNotNull (mc, "#C2"); + Assert.AreEqual (true, mc.ConvertEmptyStringToNull, "#C2-1"); + } + + [Test] + public void DataFormatString () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes]; + MetaColumn mc = t.GetColumn ("ColumnNoAttributes"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (String.Empty, mc.DataFormatString, "#A1-1"); + + mc = t.GetColumn ("ColumnFormatInEditMode"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual ("Item: {0}", mc.DataFormatString, "#A2-1"); + + t = m.Tables[TestDataContext.TableFooWithMetadataType]; + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#C1"); + Assert.AreEqual ("Item: {0}", mc.DataFormatString, "#C1-1"); + + mc = t.GetColumn ("Column2"); + Assert.IsNotNull (mc, "#C2"); + Assert.AreEqual ("{0:t}", mc.DataFormatString, "#C2-1"); + } + + [Test] + public void DataTypeAttribute () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes]; + MetaColumn mc = t.GetColumn ("ColumnNoAttributes"); + + Assert.IsNotNull (mc, "#A1"); + Assert.IsNotNull (mc.DataTypeAttribute, "#A1-1"); + + mc = t.GetColumn ("ColumnWithDataType"); + Assert.IsNotNull (mc, "#A2"); + Assert.IsNotNull (mc.DataTypeAttribute, "#A2-1"); + Assert.AreEqual (DataType.EmailAddress, mc.DataTypeAttribute.DataType, "#A2-2"); + + t = m.Tables[TestDataContext.TableFooWithMetadataType]; + mc = t.GetColumn ("Column2"); + Assert.IsNotNull (mc, "#C1"); + Assert.IsNotNull (mc.DataTypeAttribute, "#C1-1"); + Assert.AreEqual (DataType.Time, mc.DataTypeAttribute.DataType, "#C1-2"); + + mc = t.GetColumn ("Column3"); + Assert.IsNotNull (mc, "#C2"); + Assert.IsNotNull (mc.DataTypeAttribute, "#C2-1"); + Assert.AreEqual (DataType.Currency, mc.DataTypeAttribute.DataType, "#C2-2"); + + // Check default types for columns not decorated with the attribute + t = m.Tables[TestDataContext.TableBazDataTypeDefaultTypes]; + mc = t.GetColumn ("Char_Column"); + Assert.IsNotNull (mc, "#D1"); + Assert.IsNull (mc.DataTypeAttribute, "#D1-1"); + + mc = t.GetColumn ("Byte_Column"); + Assert.IsNotNull (mc, "#D2"); + Assert.IsNull (mc.DataTypeAttribute, "#D2-1"); + + mc = t.GetColumn ("Int_Column"); + Assert.IsNotNull (mc, "#D3"); + Assert.IsNull (mc.DataTypeAttribute, "#D3-1"); + + mc = t.GetColumn ("Long_Column"); + Assert.IsNotNull (mc, "#D4"); + Assert.IsNull (mc.DataTypeAttribute, "#D4-1"); + + mc = t.GetColumn ("Bool_Column"); + Assert.IsNotNull (mc, "#D5"); + Assert.IsNull (mc.DataTypeAttribute, "#D5-1"); + + mc = t.GetColumn ("String_Column"); + Assert.IsNotNull (mc, "#D6"); + Assert.IsNotNull (mc.DataTypeAttribute, "#D6-1"); + Assert.AreEqual (DataType.Text, mc.DataTypeAttribute.DataType, "#D6-2"); + + mc = t.GetColumn ("DateTime_Column"); + Assert.IsNotNull (mc, "#D7"); + Assert.IsNull (mc.DataTypeAttribute, "#D7-1"); + + mc = t.GetColumn ("FooEmpty_Column"); + Assert.IsNotNull (mc, "#D7"); + Assert.IsNull (mc.DataTypeAttribute, "#D7-1"); + } + + [Test] + public void DefaultValue () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes]; + MetaColumn mc = t.GetColumn ("ColumnFormatInEditMode"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (null, mc.DefaultValue, "#A1-1"); + + mc = t.GetColumn ("ColumnWithDefaultStringValue"); + Assert.IsNotNull (mc, "#A2"); + Assert.IsNotNull (mc.DefaultValue, "#A2-1"); + Assert.AreEqual (typeof (string), mc.DefaultValue.GetType (), "#A2-2"); + Assert.AreEqual ("Value", mc.DefaultValue, "#A2-3"); + + mc = t.GetColumn ("ColumnWithDefaultLongValue"); + Assert.IsNotNull (mc, "#A3"); + Assert.IsNotNull (mc.DefaultValue, "#A3-1"); + Assert.AreEqual (typeof (long), mc.DefaultValue.GetType (), "#A3-2"); + Assert.AreEqual (12345, mc.DefaultValue, "#A3-3"); + + t = m.Tables[TestDataContext.TableFooWithMetadataType]; + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#B1"); + Assert.IsNotNull (mc.DefaultValue, "#B1-1"); + Assert.AreEqual (typeof (string), mc.DefaultValue.GetType (), "#B1-2"); + Assert.AreEqual ("Value", mc.DefaultValue, "#B1-3"); + + mc = t.GetColumn ("Column2"); + Assert.IsNotNull (mc, "#B2"); + Assert.IsNotNull (mc.DefaultValue, "#B2-1"); + Assert.AreEqual (typeof (string), mc.DefaultValue.GetType (), "#B2-2"); + Assert.AreEqual ("Value", mc.DefaultValue, "#B2-3"); + + mc = t.GetColumn ("Column3"); + Assert.IsNotNull (mc, "#B3"); + Assert.IsNotNull (mc.DefaultValue, "#B3-1"); + Assert.AreEqual (typeof (int), mc.DefaultValue.GetType (), "#B3-2"); + Assert.AreEqual (123, mc.DefaultValue, "#B3-3"); + } + + [Test] + public void Description () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes]; + MetaColumn mc = t.GetColumn ("ColumnWithDescription"); + Assert.IsNotNull (mc, "#A1"); + Assert.IsNotNull (mc.Description, "#A1-1"); + Assert.AreEqual ("Description", mc.Description, "#A1-2"); + + t = m.Tables[TestDataContext.TableFooWithMetadataType]; + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#B1"); + Assert.IsNotNull (mc.Description, "#B1-1"); + Assert.AreEqual ("Description", mc.Description, "#B1-2"); + + mc = t.GetColumn ("Column3"); + Assert.IsNotNull (mc, "#B2"); + Assert.IsNotNull (mc.Description, "#B2-1"); + Assert.AreEqual ("Description", mc.Description, "#B2-2"); + } + + [Test] + public void DisplayName () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes]; + MetaColumn mc = t.GetColumn ("ColumnWithDisplayName"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual ("Display Name", mc.DisplayName, "#A1-1"); + + mc = t.GetColumn ("ColumnNoAttributes"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual ("ColumnNoAttributes", mc.DisplayName, "#A2-1"); + + t = m.Tables[TestDataContext.TableFooWithMetadataType]; + mc = t.GetColumn ("Column3"); + Assert.IsNotNull (mc, "#B1"); + Assert.AreEqual ("Column three", mc.DisplayName, "#B1-1"); + + mc = t.GetColumn ("Column4"); + Assert.IsNotNull (mc, "#B2"); + Assert.AreEqual ("Column four", mc.DisplayName, "#B2-1"); + } + + [Test] + public void EntityTypeProperty () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableFooWithMetadataType]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.IsNotNull (mc.EntityTypeProperty, "#A2"); + Assert.AreEqual ("Column1", mc.EntityTypeProperty.Name, "#A3"); + Assert.AreEqual (mc.Provider.EntityTypeProperty, mc.EntityTypeProperty, "#A4"); + } + + [Test] + public void HtmlEncode () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableFooWithMetadataType]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (true, mc.HtmlEncode, "#A1-1"); + + mc = t.GetColumn ("Column2"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual (true, mc.HtmlEncode, "#A2-1"); + + mc = t.GetColumn ("Column3"); + Assert.IsNotNull (mc, "#A3"); + Assert.AreEqual (true, mc.HtmlEncode, "#A3-1"); + + mc = t.GetColumn ("Column4"); + Assert.IsNotNull (mc, "#A4"); + Assert.AreEqual (true, mc.HtmlEncode, "#A4-1"); + } + + [Test] + public void IsBinaryData () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazDataTypeDefaultTypes]; + MetaColumn mc = t.GetColumn ("Char_Column"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (false, mc.IsBinaryData, "#A2"); + + mc = t.GetColumn ("Byte_Column"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual (false, mc.IsBinaryData, "#A2-1"); + + mc = t.GetColumn ("Int_Column"); + Assert.IsNotNull (mc, "#A3"); + Assert.AreEqual (false, mc.IsBinaryData, "#A3-1"); + + mc = t.GetColumn ("Long_Column"); + Assert.IsNotNull (mc, "#A4"); + Assert.AreEqual (false, mc.IsBinaryData, "#A4-1"); + + mc = t.GetColumn ("Bool_Column"); + Assert.IsNotNull (mc, "#A5"); + Assert.AreEqual (false, mc.IsBinaryData, "#A5-1"); + + mc = t.GetColumn ("String_Column"); + Assert.IsNotNull (mc, "#A6"); + Assert.AreEqual (false, mc.IsBinaryData, "#A6-1"); + + mc = t.GetColumn ("DateTime_Column"); + Assert.IsNotNull (mc, "#A7"); + Assert.AreEqual (false, mc.IsBinaryData, "#A7-1"); + + mc = t.GetColumn ("FooEmpty_Column"); + Assert.IsNotNull (mc, "#A8"); + Assert.AreEqual (false, mc.IsBinaryData, "#A8-1"); + + mc = t.GetColumn ("Object_Column"); + Assert.IsNotNull (mc, "#A9"); + Assert.AreEqual (false, mc.IsBinaryData, "#A9-1"); + + mc = t.GetColumn ("ByteArray_Column"); + Assert.IsNotNull (mc, "#A10"); + Assert.AreEqual (true, mc.IsBinaryData, "#A10-1"); + + mc = t.GetColumn ("IntArray_Column"); + Assert.IsNotNull (mc, "#A11"); + Assert.AreEqual (false, mc.IsBinaryData, "#A11-1"); + + mc = t.GetColumn ("StringArray_Column"); + Assert.IsNotNull (mc, "#A12"); + Assert.AreEqual (false, mc.IsBinaryData, "#A12-1"); + + mc = t.GetColumn ("ObjectArray_Column"); + Assert.IsNotNull (mc, "#A13"); + Assert.AreEqual (false, mc.IsBinaryData, "#A13-1"); + + mc = t.GetColumn ("StringList_Column"); + Assert.IsNotNull (mc, "#A14"); + Assert.AreEqual (false, mc.IsBinaryData, "#A14-1"); + + mc = t.GetColumn ("Dictionary_Column"); + Assert.IsNotNull (mc, "#A15"); + Assert.AreEqual (false, mc.IsBinaryData, "#A15-1"); + + mc = t.GetColumn ("ICollection_Column"); + Assert.IsNotNull (mc, "#A16"); + Assert.AreEqual (false, mc.IsBinaryData, "#A16-1"); + + mc = t.GetColumn ("IEnumerable_Column"); + Assert.IsNotNull (mc, "#A17"); + Assert.AreEqual (false, mc.IsBinaryData, "#A17-1"); + + mc = t.GetColumn ("ICollectionByte_Column"); + Assert.IsNotNull (mc, "#A18"); + Assert.AreEqual (false, mc.IsBinaryData, "#A18-1"); + + mc = t.GetColumn ("IEnumerableByte_Column"); + Assert.IsNotNull (mc, "#A19"); + Assert.AreEqual (false, mc.IsBinaryData, "#A19-1"); + + mc = t.GetColumn ("ByteMultiArray_Column"); + Assert.IsNotNull (mc, "#A20"); + Assert.AreEqual (false, mc.IsBinaryData, "#A20-1"); + + mc = t.GetColumn ("BoolArray_Column"); + Assert.IsNotNull (mc, "#A21"); + Assert.AreEqual (false, mc.IsBinaryData, "#A21-1"); + } + + [Test] + public void IsCustomProperty () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("CustomPropertyColumn1"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (true, mc.IsCustomProperty, "#A1-1"); + Assert.AreEqual (mc.Provider.IsCustomProperty, mc.IsCustomProperty, "#A1-2"); + + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#B1"); + Assert.AreEqual (false, mc.IsCustomProperty, "#B1-1"); + Assert.AreEqual (mc.Provider.IsCustomProperty, mc.IsCustomProperty, "#B1-2"); + } + + [Test] + public void IsFloatingPoint () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazDataTypeDefaultTypes]; + MetaColumn mc = t.GetColumn ("Int_Column"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (false, mc.IsFloatingPoint, "#A1-1"); + + mc = t.GetColumn ("Long_Column"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual (false, mc.IsFloatingPoint, "#A2-1"); + + mc = t.GetColumn ("Bool_Column"); + Assert.IsNotNull (mc, "#A3"); + Assert.AreEqual (false, mc.IsFloatingPoint, "#A3-1"); + + mc = t.GetColumn ("Single_Column"); + Assert.IsNotNull (mc, "#A4"); + Assert.AreEqual (true, mc.IsFloatingPoint, "#A4-1"); + + mc = t.GetColumn ("Float_Column"); + Assert.IsNotNull (mc, "#A5"); + Assert.AreEqual (true, mc.IsFloatingPoint, "#A5-1"); + + mc = t.GetColumn ("Double_Column"); + Assert.IsNotNull (mc, "#A6"); + Assert.AreEqual (true, mc.IsFloatingPoint, "#A6-1"); + + mc = t.GetColumn ("Decimal_Column"); + Assert.IsNotNull (mc, "#A7"); + Assert.AreEqual (true, mc.IsFloatingPoint, "#A7-1"); + } + + [Test] + public void IsForeignKeyComponent () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (false, mc.IsForeignKeyComponent, "#A1-1"); + + t = m.Tables[TestDataContext.TableAssociatedFoo]; + mc = t.GetColumn ("ForeignKeyColumn1"); + Assert.IsNotNull (mc, "#B1"); + Assert.AreEqual (true, mc.IsForeignKeyComponent, "#B1-1"); + + mc = t.GetColumn ("PrimaryKeyColumn1"); + Assert.IsNotNull (mc, "#B2"); + Assert.AreEqual (true, mc.IsForeignKeyComponent, "#B2-1"); + + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#B3"); + Assert.AreEqual (false, mc.IsForeignKeyComponent, "#B3-1"); + } + + [Test] + public void IsGenerated () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (false, mc.IsGenerated, "#A1-1"); + + mc = t.GetColumn ("GeneratedColumn1"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual (true, mc.IsGenerated, "#A2-1"); + } + + [Test] + public void IsInteger () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazDataTypeDefaultTypes]; + MetaColumn mc = t.GetColumn ("Char_Column"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (false, mc.IsInteger, "#A1-1"); + + mc = t.GetColumn ("Byte_Column"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual (true, mc.IsInteger, "#A2-1"); + + mc = t.GetColumn ("SByte_Column"); + Assert.IsNotNull (mc, "#A3"); + Assert.AreEqual (false, mc.IsInteger, "#A3-1"); + + mc = t.GetColumn ("SByte_Column"); + Assert.IsNotNull (mc, "#A3"); + Assert.AreEqual (false, mc.IsInteger, "#A3-1"); + + mc = t.GetColumn ("Int_Column"); + Assert.IsNotNull (mc, "#A4"); + Assert.AreEqual (true, mc.IsInteger, "#A4-1"); + + mc = t.GetColumn ("UInt_Column"); + Assert.IsNotNull (mc, "#A5"); + Assert.AreEqual (false, mc.IsInteger, "#A5-1"); + + mc = t.GetColumn ("Long_Column"); + Assert.IsNotNull (mc, "#A6"); + Assert.AreEqual (true, mc.IsInteger, "#A6-1"); + + mc = t.GetColumn ("ULong_Column"); + Assert.IsNotNull (mc, "#A7"); + Assert.AreEqual (false, mc.IsInteger, "#A7-1"); + + mc = t.GetColumn ("Short_Column"); + Assert.IsNotNull (mc, "#A8"); + Assert.AreEqual (true, mc.IsInteger, "#A8-1"); + + mc = t.GetColumn ("UShort_Column"); + Assert.IsNotNull (mc, "#A9"); + Assert.AreEqual (false, mc.IsInteger, "#A9-1"); + + mc = t.GetColumn ("DateTime_Column"); + Assert.IsNotNull (mc, "#A10"); + Assert.AreEqual (false, mc.IsInteger, "#A10-1"); + + mc = t.GetColumn ("Float_Column"); + Assert.IsNotNull (mc, "#A11"); + Assert.AreEqual (false, mc.IsInteger, "#A11-1"); + } + + [Test] + public void IsLongString () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazDataTypeDefaultTypes]; + MetaColumn mc = t.GetColumn ("String_Column"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (true, mc.IsString, "#A1-1"); + Assert.AreEqual (false, mc.IsLongString, "#A1-2"); + Assert.AreEqual (0, mc.MaxLength, "#A1-3"); + + mc = t.GetColumn ("MaximumLength_Column1"); + Assert.IsNotNull (mc, "#B1"); + Assert.AreEqual (true, mc.IsString, "#B1-1"); + Assert.AreEqual (true, mc.IsLongString, "#B1-2"); + Assert.AreEqual (Int32.MaxValue, mc.MaxLength, "#B1-3"); + + // It appears .NET allows for negative maximum lengths... + mc = t.GetColumn ("MaximumLength_Column2"); + Assert.IsNotNull (mc, "#C1"); + Assert.AreEqual (true, mc.IsString, "#C1-1"); + Assert.AreEqual (false, mc.IsLongString, "#C1-2"); + Assert.AreEqual (Int32.MinValue, mc.MaxLength, "#C1-3"); + + // This is the highest length at which string is considered to be short + mc = t.GetColumn ("MaximumLength_Column3"); + Assert.IsNotNull (mc, "#D1"); + Assert.AreEqual (true, mc.IsString, "#D1-1"); + Assert.AreEqual (false, mc.IsLongString, "#D1-2"); + Assert.AreEqual ((Int32.MaxValue / 2) - 5, mc.MaxLength, "#D1-3"); + + // This is the lowest length at which string is considered to be short + mc = t.GetColumn ("MaximumLength_Column4"); + Assert.IsNotNull (mc, "#E1"); + Assert.AreEqual (true, mc.IsString, "#E1-1"); + Assert.AreEqual (true, mc.IsLongString, "#E1-2"); + Assert.AreEqual ((Int32.MaxValue / 2) - 4, mc.MaxLength, "#E1-3"); + } + + [Test] + public void IsPrimaryKey () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (false, mc.IsPrimaryKey, "#A1-1"); + Assert.AreEqual (mc.Provider.IsPrimaryKey, mc.IsPrimaryKey, "#A1-2"); + + mc = t.GetColumn ("PrimaryKeyColumn1"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual (true, mc.IsPrimaryKey, "#A2-1"); + Assert.AreEqual (mc.Provider.IsPrimaryKey, mc.IsPrimaryKey, "#A2-2"); + + t = m.Tables[TestDataContext.TableAssociatedFoo]; + mc = t.GetColumn ("ForeignKeyColumn1"); + Assert.IsNotNull (mc, "#B1"); + Assert.AreEqual (false, mc.IsPrimaryKey, "#B1-1"); + Assert.AreEqual (mc.Provider.IsPrimaryKey, mc.IsPrimaryKey, "#B1-2"); + + mc = t.GetColumn ("PrimaryKeyColumn1"); + Assert.IsNotNull (mc, "#B2"); + Assert.AreEqual (true, mc.IsPrimaryKey, "#B2-1"); + Assert.AreEqual (mc.Provider.IsPrimaryKey, mc.IsPrimaryKey, "#B2-2"); + } + + [Test] + public void IsReadOnly () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("ReadOnlyColumn"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (true, mc.IsReadOnly, "#A1-1"); + + // Apparently it value passed to ReadOnlyAttribute's constructor doesn't matter. + // The only presence of it marks the column as read-only + mc = t.GetColumn ("ReadWriteColumn"); + Assert.IsNotNull (mc, "#B1"); + Assert.AreEqual (true, mc.IsReadOnly, "#B1-1"); + + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#C1"); + Assert.AreEqual (false, mc.IsReadOnly, "#C1-1"); + } + + [Test] + public void IsRequired () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableFooWithMetadataType]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.IsTrue (mc.IsRequired, "#A1-1"); + Assert.AreEqual (1, mc.Attributes.OfType ().Count (), "#A1-2"); + + mc = t.GetColumn ("Column5"); + Assert.IsNotNull (mc, "#B1"); + Assert.IsTrue (mc.IsRequired, "#B1-1"); + Assert.AreEqual (1, mc.Attributes.OfType ().Count (), "#B1-2"); + + // This one is made nullable by the test column provider + mc = t.GetColumn ("Column6"); + Assert.IsNotNull (mc, "#C1"); + Assert.IsFalse (mc.IsRequired, "#C1-1"); + Assert.AreEqual (0, mc.Attributes.OfType ().Count (), "#C1-2"); + + mc = t.GetColumn ("Column7"); + Assert.IsNotNull (mc, "#D1"); + Assert.IsTrue (mc.IsRequired, "#D1-1"); + Assert.AreEqual (1, mc.Attributes.OfType ().Count (), "#D1-2"); + + mc = t.GetColumn ("Column2"); + Assert.IsNotNull (mc, "#E1"); + Assert.IsTrue (mc.IsRequired, "#F1-1"); + Assert.AreEqual (1, mc.Attributes.OfType ().Count (), "#E1-2"); + } + + [Test] + public void IsString () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazDataTypeDefaultTypes]; + MetaColumn mc = t.GetColumn ("Char_Column"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (false, mc.IsString, "#A1-1"); + + mc = t.GetColumn ("Int_Column"); + Assert.IsNotNull (mc, "#B1"); + Assert.AreEqual (false, mc.IsString, "#B1-1"); + + mc = t.GetColumn ("String_Column"); + Assert.IsNotNull (mc, "#C1"); + Assert.AreEqual (true, mc.IsString, "#C1-1"); + } + + [Test] + public void MaxLength () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazDataTypeDefaultTypes]; + MetaColumn mc = t.GetColumn ("Char_Column"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (0, mc.MaxLength, "#A1-1"); + + mc = t.GetColumn ("String_Column"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual (0, mc.MaxLength, "#A2-1"); + + mc = t.GetColumn ("MaximumLength_Column1"); + Assert.IsNotNull (mc, "#A3"); + Assert.AreEqual (Int32.MaxValue, mc.MaxLength, "#A3-1"); + + mc = t.GetColumn ("MaximumLength_Column2"); + Assert.IsNotNull (mc, "#A4"); + Assert.AreEqual (Int32.MinValue, mc.MaxLength, "#A4-1"); + + mc = t.GetColumn ("MaximumLength_Column3"); + Assert.IsNotNull (mc, "#A5"); + Assert.AreEqual ((Int32.MaxValue / 2) - 5, mc.MaxLength, "#A5-1"); + + mc = t.GetColumn ("MaximumLength_Column4"); + Assert.IsNotNull (mc, "#A6"); + Assert.AreEqual ((Int32.MaxValue / 2) - 4, mc.MaxLength, "#A6-1"); + + mc = t.GetColumn ("MaximumLength_Column5"); + Assert.IsNotNull (mc, "#A7"); + Assert.AreEqual (255, mc.MaxLength, "#A7-1"); + Assert.AreEqual (512, mc.Provider.MaxLength, "#A7-2"); + Assert.IsTrue (mc.MaxLength != mc.Provider.MaxLength, "#A7-3"); + } + + [Test] + public void Model () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.IsTrue (mc.Model == m, "#A2"); + } + + [Test] + public void Name () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual ("Column1", mc.Name, "#A2"); + } + + [Test] + public void NullDisplayText () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (String.Empty, mc.NullDisplayText, "#A1-1"); + + mc = t.GetColumn ("NullDisplayTextColumn"); + Assert.IsNotNull (mc, "#A2"); + Assert.AreEqual ("Text", mc.NullDisplayText, "#A2-1"); + } + + [Test] + public void Provider () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.IsNotNull (mc.Provider, "#A2"); + } + + [Test] + public void RequiredErrorMessage () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.IsFalse (String.IsNullOrEmpty (mc.RequiredErrorMessage), "#A2"); + + mc = t.GetColumn ("ErrorMessageColumn1"); + Assert.IsNotNull (mc, "#B1"); + Assert.IsFalse (String.IsNullOrEmpty (mc.RequiredErrorMessage), "#B2"); + Assert.AreEqual ("Custom error message", mc.RequiredErrorMessage, "#B3"); + + mc = t.GetColumn ("ErrorMessageColumn2"); + Assert.IsNotNull (mc, "#C1"); + Assert.IsFalse (String.IsNullOrEmpty (mc.RequiredErrorMessage), "#C2"); + + t = m.Tables[TestDataContext.TableFooWithMetadataType]; + mc = t.GetColumn ("Column6"); + Assert.IsNotNull (mc, "#D1"); + Assert.IsFalse (mc.IsRequired, "#D1-1"); + Assert.AreEqual (0, mc.Attributes.OfType ().Count (), "#D1-2"); + Assert.AreEqual (String.Empty, mc.RequiredErrorMessage, "#D1-3"); + } + + [Test] + public void Scaffold () + { + // + // ScaffoldAllTables=true is in effect for this model + // + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes]; + MetaColumn mc = t.GetColumn ("NoScaffoldColumn"); + Assert.IsNotNull (mc, "#1"); + Assert.AreEqual (false, mc.Scaffold, "#1-1"); + + mc = t.GetColumn ("ScaffoldAttributeColumn"); + Assert.IsNotNull (mc, "#2"); + Assert.AreEqual (true, mc.Scaffold, "#2-1"); + + mc = t.GetColumn ("ColumnNoAttributes"); + Assert.IsNotNull (mc, "#3"); + Assert.AreEqual (true, mc.Scaffold, "#3-1"); + + // No attribute cases + mc = t.GetColumn ("UIHintColumn"); + Assert.IsNotNull (mc, "#4"); + Assert.AreEqual (true, mc.Scaffold, "#4-1"); + + t = m.Tables[TestDataContext.TableFooNoScaffold]; + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#5"); + Assert.AreEqual (true, mc.Scaffold, "#5-1"); + + t = m.Tables[TestDataContext.TableBaz]; + mc = t.GetColumn ("GeneratedColumn1"); + Assert.IsNotNull (mc, "#6"); + Assert.AreEqual (false, mc.Scaffold, "#6-1"); + + mc = t.GetColumn ("GeneratedColumn2"); + Assert.IsNotNull (mc, "#7"); + Assert.AreEqual (true, mc.Scaffold, "#7-1"); + + mc = t.GetColumn ("CustomPropertyColumn1"); + Assert.IsNotNull (mc, "#8"); + Assert.AreEqual (false, mc.Scaffold, "#8-1"); + + mc = t.GetColumn ("CustomPropertyColumn2"); + Assert.IsNotNull (mc, "#9"); + Assert.AreEqual (true, mc.Scaffold, "#9-1"); + + t = m.Tables[TestDataContext.TableAssociatedFoo]; + mc = t.GetColumn ("ForeignKeyColumn1"); + Assert.IsNotNull (mc, "#10"); + Assert.AreEqual (true, mc.IsForeignKeyComponent, "#10-1"); + Assert.AreEqual (true, mc.Scaffold, "#11-2"); + + m = MetaModel.GetModel (dynamicModelProviderNoScaffold.ContextType); + t = m.Tables[TestDataContext2.TableFooBarNoScaffold]; + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#12"); + Assert.AreEqual (true, mc.Scaffold, "#12-1"); + + mc = t.GetColumn ("CustomPropertyColumn1"); + Assert.IsNotNull (mc, "#13"); + Assert.AreEqual (false, mc.Scaffold, "#13-1"); + + mc = t.GetColumn ("CustomPropertyColumn2"); + Assert.IsNotNull (mc, "#14"); + Assert.AreEqual (true, mc.Scaffold, "#14-1"); + + mc = t.GetColumn ("GeneratedColumn1"); + Assert.IsNotNull (mc, "#15"); + Assert.AreEqual (false, mc.Scaffold, "#15-1"); + + mc = t.GetColumn ("GeneratedColumn2"); + Assert.IsNotNull (mc, "#16"); + Assert.AreEqual (true, mc.Scaffold, "#16-1"); + + mc = t.GetColumn ("ForeignKeyColumn1"); + Assert.IsNotNull (mc, "#17"); + Assert.AreEqual (true, mc.IsForeignKeyComponent, "#17-1"); + Assert.AreEqual (true, mc.Scaffold, "#17-2"); + } + + [Test] + public void SortExpression () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (false, mc.Provider.IsSortable, "#A1-1"); + Assert.AreEqual (String.Empty, mc.SortExpression, "#A1-2"); + + mc = t.GetColumn ("SortableColumn1"); + Assert.IsNotNull (mc, "#B1"); + Assert.AreEqual (true, mc.Provider.IsSortable, "#B1-1"); + Assert.AreEqual ("SortableColumn1", mc.SortExpression, "#B1-2"); + } + + [Test] + public void Table () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#A1"); + Assert.IsTrue (mc.Table == t, "#A2"); + } + + [Test] + public void TypeCodeTest () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBazDataTypeDefaultTypes]; + MetaColumn mc = t.GetColumn ("Char_Column"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (typeof (char), mc.ColumnType, "#A1-1"); + Assert.AreEqual (TypeCode.Object, mc.TypeCode, "#A1-2"); + + mc = t.GetColumn ("String_Column"); + Assert.IsNotNull (mc, "#B1"); + Assert.AreEqual (typeof (string), mc.ColumnType, "#B1-1"); + Assert.AreEqual (TypeCode.String, mc.TypeCode, "#B1-2"); + + mc = t.GetColumn ("Byte_Column"); + Assert.IsNotNull (mc, "#C1"); + Assert.AreEqual (typeof (byte), mc.ColumnType, "#C1-1"); + Assert.AreEqual (TypeCode.Byte, mc.TypeCode, "#C1-2"); + + mc = t.GetColumn ("SByte_Column"); + Assert.IsNotNull (mc, "#D1"); + Assert.AreEqual (typeof (sbyte), mc.ColumnType, "#d1-1"); + Assert.AreEqual (TypeCode.Object, mc.TypeCode, "#D1-2"); + + mc = t.GetColumn ("Int_Column"); + Assert.IsNotNull (mc, "#E1"); + Assert.AreEqual (typeof (int), mc.ColumnType, "#E1-1"); + Assert.AreEqual (TypeCode.Int32, mc.TypeCode, "#E1-2"); + + mc = t.GetColumn ("UInt_Column"); + Assert.IsNotNull (mc, "#F1"); + Assert.AreEqual (typeof (uint), mc.ColumnType, "#F1-1"); + Assert.AreEqual (TypeCode.Object, mc.TypeCode, "#F1-2"); + + mc = t.GetColumn ("Long_Column"); + Assert.IsNotNull (mc, "#G1"); + Assert.AreEqual (typeof (long), mc.ColumnType, "#G1-1"); + Assert.AreEqual (TypeCode.Int64, mc.TypeCode, "#G1-2"); + + mc = t.GetColumn ("Float_Column"); + Assert.IsNotNull (mc, "#H1"); + Assert.AreEqual (typeof (float), mc.ColumnType, "#H1-1"); + Assert.AreEqual (TypeCode.Single, mc.TypeCode, "#H1-2"); + + mc = t.GetColumn ("Double_Column"); + Assert.IsNotNull (mc, "#I1"); + Assert.AreEqual (typeof (double), mc.ColumnType, "#I1-1"); + Assert.AreEqual (TypeCode.Double, mc.TypeCode, "#I1-2"); + + mc = t.GetColumn ("Decimal_Column"); + Assert.IsNotNull (mc, "#J1"); + Assert.AreEqual (typeof (decimal), mc.ColumnType, "#J1-1"); + Assert.AreEqual (TypeCode.Decimal, mc.TypeCode, "#J1-2"); + + mc = t.GetColumn ("StringArray_Column"); + Assert.IsNotNull (mc, "#K1"); + Assert.AreEqual (typeof (string[]), mc.ColumnType, "#K1-1"); + Assert.AreEqual (TypeCode.Object, mc.TypeCode, "#K1-2"); + } + + [Test] + public void UIHint () + { + MetaModel m = Utils.CommonInitialize (); + + MetaTable t = m.Tables[TestDataContext.TableBaz]; + MetaColumn mc = t.GetColumn ("CustomPropertyColumn1"); + Assert.IsNotNull (mc, "#A1"); + Assert.AreEqual (null, mc.UIHint, "#A2"); + + mc = t.GetColumn ("Column1"); + Assert.IsNotNull (mc, "#B1"); + Assert.AreEqual (null, mc.UIHint, "#B2"); + + mc = t.GetColumn ("CustomPropertyColumn2"); + Assert.IsNotNull (mc, "#C1"); + Assert.AreEqual ("UI Hint", mc.UIHint, "#C2"); + + mc = t.GetColumn ("EmptyHintColumn"); + Assert.IsNotNull (mc, "#D1"); + Assert.AreEqual (String.Empty, mc.UIHint, "#D2"); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/MetaModelTest.cs b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/MetaModelTest.cs index 0b28dc26113..fe43459bfc7 100644 --- a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/MetaModelTest.cs +++ b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/MetaModelTest.cs @@ -87,6 +87,26 @@ namespace MonoTests.System.Web.DynamicData Assert.AreEqual (typeof (FieldTemplateFactory), model.FieldTemplateFactory.GetType (), "#B3"); } + [Test] + public void DynamicDataFolderVirtualPath () + { + var model = new MetaModel (); + + Assert.AreEqual ("~/DynamicData/", model.DynamicDataFolderVirtualPath, "#A1"); + model.DynamicDataFolderVirtualPath = null; + Assert.AreEqual ("~/DynamicData/", model.DynamicDataFolderVirtualPath, "#A2"); + model.DynamicDataFolderVirtualPath = String.Empty; + Assert.AreEqual (String.Empty, model.DynamicDataFolderVirtualPath, "#A3"); + model.DynamicDataFolderVirtualPath = "~/FolderNoTrailingSlash"; + Assert.AreEqual ("~/FolderNoTrailingSlash/", model.DynamicDataFolderVirtualPath, "#A4"); + model.DynamicDataFolderVirtualPath = "AnotherFolder"; + Assert.AreEqual ("AnotherFolder/", model.DynamicDataFolderVirtualPath, "#A5"); + model.DynamicDataFolderVirtualPath = "/YetAnotherFolder"; + Assert.AreEqual ("/YetAnotherFolder/", model.DynamicDataFolderVirtualPath, "#A6"); + model.DynamicDataFolderVirtualPath = null; + Assert.AreEqual ("~/DynamicData/", model.DynamicDataFolderVirtualPath, "#A7"); + } + [Test] [ExpectedException (typeof (ArgumentNullException))] public void GetTableNull () diff --git a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/MetaTableTest.cs b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/MetaTableTest.cs index 919b0353520..cac8ebba685 100644 --- a/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/MetaTableTest.cs +++ b/mcs/class/System.Web.DynamicData/Test/System.Web.DynamicData/MetaTableTest.cs @@ -65,32 +65,19 @@ namespace MonoTests.System.Web.DynamicData [TestFixture] public class MetaTableTest { - DynamicDataContainerModelProvider dynamicModelProvider; + DynamicDataContainerModelProvider dynamicModelProvider; [TestFixtureSetUp] public void SetUp () { - dynamicModelProvider = new DynamicDataContainerModelProvider (typeof (TestDataContainer)); + dynamicModelProvider = new DynamicDataContainerModelProvider (); Utils.RegisterContext (dynamicModelProvider, new ContextConfiguration () { ScaffoldAllTables = true }); } [Test] public void Attributes () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooEmpty]; Assert.IsNotNull (t.Attributes, "#A1"); @@ -100,20 +87,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void Columns () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooEmpty]; Assert.IsNotNull (t.Columns, "#A1"); @@ -161,20 +135,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void DataContextPropertyName () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooEmpty]; Assert.AreEqual ("FooEmptyTable", t.DataContextPropertyName, "#A1"); @@ -184,20 +145,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void DataContextType () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooEmpty]; Assert.IsTrue (t.DataContextType == typeof (TestDataContext), "#A1"); @@ -206,20 +154,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void DisplayColumn () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooDisplayColumnAttribute]; MetaColumn mc = t.DisplayColumn; @@ -254,25 +189,17 @@ namespace MonoTests.System.Web.DynamicData AssertExtensions.Throws (() => mc = t.DisplayColumn, "#G1"); t = m.Tables[TestDataContext.TableFooEmptyDisplayColumnAttribute]; AssertExtensions.Throws (() => mc = t.DisplayColumn, "#G2"); + + t = m.Tables[TestDataContext.TableFooWithMetadataType]; + mc = t.DisplayColumn; + Assert.IsNotNull (mc, "#E1"); + Assert.AreEqual ("Column2", mc.Name, "#E2"); } [Test] public void DisplayName () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.AreEqual ("FooWithDefaultsTable", t.DisplayName, "#A1"); @@ -287,20 +214,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void EntityType () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.IsTrue (t.EntityType == typeof (FooWithDefaults), "#A1"); @@ -315,20 +229,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void ForeignKeyColumnNames () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableAssociatedFoo]; Assert.IsNotNull (t.ForeignKeyColumnsNames, "#A1"); @@ -339,20 +240,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetActionPath_Action () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; @@ -364,20 +252,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetActionPath_Action_2 () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; @@ -446,20 +321,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetActionPath_Action_PrimaryKeyValues () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.AreEqual (String.Empty, t.GetActionPath (null, (IList) null), "#A1"); @@ -470,20 +332,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetActionPath_Action_PrimaryKeyValues_2 () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.AreEqual (Utils.BuildActionName (t, PageAction.Details), t.GetActionPath (PageAction.Details, (IList) null), "#A1"); @@ -500,20 +350,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetActionPath_Action_PrimaryKeyValues_3 () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; @@ -549,20 +387,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetActionPath_Action_RouteValues () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; var values = new RouteValueDictionary (); @@ -589,20 +415,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetActionPath_Action_Row () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; @@ -613,26 +427,29 @@ namespace MonoTests.System.Web.DynamicData t = m.Tables[TestDataContext.TableFooNoDefaultsWithPrimaryKey]; var foo2 = new FooNoDefaultsWithPrimaryKey (); + route.GetVirtualPathCalled = false; Assert.AreEqual (Utils.BuildActionName (t, PageAction.Details), t.GetActionPath (PageAction.Details, foo2), "#B1"); + Assert.AreEqual (true, route.GetVirtualPathCalled, "#B1-1"); + Assert.AreEqual (3, route.GetVirtualPathValues.Count, "#B1-2"); + + route.GetVirtualPathCalled = false; + foo2.PrimaryKeyColumn1 = String.Empty; + Assert.AreEqual (Utils.BuildActionName (t, PageAction.Details), t.GetActionPath (PageAction.Details, foo2), "#C1"); + Assert.AreEqual (true, route.GetVirtualPathCalled, "#C1-1"); + Assert.AreEqual (3, route.GetVirtualPathValues.Count, "#C1-2"); + + route.GetVirtualPathCalled = false; + foo2.PrimaryKeyColumn1 = "SomeValue"; + Assert.AreEqual (Utils.BuildActionName (t, PageAction.Details, "PrimaryKeyColumn1=SomeValue"), t.GetActionPath (PageAction.Details, foo2), "#D1"); + Assert.AreEqual (true, route.GetVirtualPathCalled, "#D1-1"); + Assert.AreEqual (3, route.GetVirtualPathValues.Count, "#D1-2"); } [Test] public void GetActionPath_Action_Row_Path () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; @@ -653,20 +470,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetActionPath_Action_PrimaryKeyValues_Path () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; @@ -683,34 +488,48 @@ namespace MonoTests.System.Web.DynamicData dataList.Add (2); dataList.Add (false); + route.GetVirtualPathCalled = false; Assert.AreEqual (Utils.BuildActionName (t, PageAction.Details, "PrimaryKeyColumn1=first%20item&PrimaryKeyColumn2=2&PrimaryKeyColumn3=False"), t.GetActionPath (PageAction.Details, dataList, null), "#A4"); + Assert.AreEqual (true, route.GetVirtualPathCalled, "#A4-1"); + + route.GetVirtualPathCalled = false; Assert.AreEqual ("~/SomePath.aspx", t.GetActionPath (null, (IList) null, "~/SomePath.aspx"), "#A5"); + Assert.AreEqual (false, route.GetVirtualPathCalled, "#A5-1"); + + route.GetVirtualPathCalled = false; Assert.AreEqual ("~/SomePath.aspx?PrimaryKeyColumn1=first%20item&PrimaryKeyColumn2=2&PrimaryKeyColumn3=False", t.GetActionPath (null, dataList, "~/SomePath.aspx"), "#A6"); + Assert.AreEqual (false, route.GetVirtualPathCalled, "#A6-1"); + + route.GetVirtualPathCalled = false; Assert.AreEqual ("~/SomePath.aspx", t.GetActionPath (PageAction.Details, (IList) null, "~/SomePath.aspx"), "#A7"); + Assert.AreEqual (false, route.GetVirtualPathCalled, "#A7-1"); + + route.GetVirtualPathCalled = false; Assert.AreEqual ("~/SomePath.aspx?PrimaryKeyColumn1=first%20item&PrimaryKeyColumn2=2&PrimaryKeyColumn3=False", t.GetActionPath (PageAction.Details, dataList, "~/SomePath.aspx"), "#A8"); + Assert.AreEqual (false, route.GetVirtualPathCalled, "#A8-1"); + + route.GetVirtualPathCalled = false; Assert.AreEqual (Utils.BuildActionName (t, PageAction.Details), t.GetActionPath (PageAction.Details, (IList) null, null), "#A9"); + Assert.AreEqual (true, route.GetVirtualPathCalled, "#A9-1"); + + route.GetVirtualPathCalled = false; Assert.AreEqual (Utils.BuildActionName (t, PageAction.Details, "PrimaryKeyColumn1=first%20item&PrimaryKeyColumn2=2&PrimaryKeyColumn3=False"), t.GetActionPath (PageAction.Details, dataList, null), "#A10"); + Assert.AreEqual (true, route.GetVirtualPathCalled, "#A10-1"); + + route.GetVirtualPathCalled = false; Assert.AreEqual (Utils.BuildActionName (t, PageAction.Details), t.GetActionPath (PageAction.Details, (IList) null, String.Empty), "#A11"); + Assert.AreEqual (true, route.GetVirtualPathCalled, "#A11-1"); + + route.GetVirtualPathCalled = false; Assert.AreEqual (Utils.BuildActionName (t, PageAction.Details, "PrimaryKeyColumn1=first%20item&PrimaryKeyColumn2=2&PrimaryKeyColumn3=False"), t.GetActionPath (PageAction.Details, dataList, String.Empty), "#A12"); + Assert.AreEqual (true, route.GetVirtualPathCalled, "#A12-1"); } [Test] public void GetColumn () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; @@ -726,20 +545,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetDisplayString () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; var foo = new FooWithDefaults (); @@ -769,20 +576,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetPrimaryKeyString_PrimaryKeyValues () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; var values = new List (); @@ -833,20 +628,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetPrimaryKeyString_Row () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; var foo = new FooWithDefaults (); @@ -871,20 +654,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void GetPrimaryKeyValues () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; var foo = new FooWithDefaults (); @@ -960,26 +731,13 @@ namespace MonoTests.System.Web.DynamicData Assert.IsTrue (query.GetType () == typeof (Table), "#A2"); var foo = new Foo (true); - AssertExtensions.Throws (() => t.GetQuery (foo), "#B1"); + AssertExtensions.Throws (() => t.GetQuery (foo), "#B1"); } [Test] public void HasPrimaryKey () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.IsTrue (t.HasPrimaryKey, "#A1"); @@ -991,20 +749,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void IsReadOnly () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); // According to this thread http://forums.asp.net/t/1388561.aspx IsReadOnly is set // whenever a table doesn't have a primary key. @@ -1020,20 +765,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void ListActionPath () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.AreEqual (Utils.BuildActionName (t, PageAction.List), t.ListActionPath, "#A1"); @@ -1045,20 +777,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void Model () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.IsTrue (t.Model == m, "#A1"); @@ -1067,20 +786,7 @@ namespace MonoTests.System.Web.DynamicData [Test] public void Name () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - routes.Add ( - new DynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }); + MetaModel m = Utils.CommonInitialize (); MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.IsNotNull (t.Name, "#A1"); @@ -1091,20 +797,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void PrimaryKeyColumns () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; @@ -1123,20 +817,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void Provider () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.IsTrue (t.Provider != null, "#A1"); @@ -1146,20 +828,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void Scaffold () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.AreEqual (true, t.Scaffold, "#A1"); @@ -1171,20 +841,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void SortColumn () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.IsNull (t.SortColumn, "#A1"); @@ -1204,20 +862,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void SortDescending () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; Assert.AreEqual (false, t.SortDescending, "#A1"); @@ -1229,20 +875,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void ToStringTest () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableBar]; Assert.AreEqual (t.Name, t.ToString (), "#A1"); @@ -1254,20 +888,8 @@ namespace MonoTests.System.Web.DynamicData [Test] public void TryGetColumn () { - MetaModel m = MetaModel.Default; - - var req = new FakeHttpWorkerRequest (); - var ctx = new HttpContext (req); - HttpContext.Current = ctx; - - RouteCollection routes = RouteTable.Routes; - routes.Clear (); - var route = new MyDynamicDataRoute ("{table}/{action}.aspx") { - Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), - Model = m, - RouteHandler = new MyDynamicDataRouteHandler () - }; - routes.Add (route); + MetaModel m = Utils.CommonInitialize (true); + var route = RouteTable.Routes[0] as MyDynamicDataRoute; MetaTable t = m.Tables[TestDataContext.TableFooWithDefaults]; MetaColumn mc = null; diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/FilterUserControl.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/FilterUserControl.ascx new file mode 100644 index 00000000000..6d4bd5e5943 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/FilterUserControl.ascx @@ -0,0 +1,5 @@ +<%@ Control Language="C#" CodeFile="FilterUserControl.ascx.cs" Inherits="FilterUserControl" %> + + + + diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/FilterUserControl.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/FilterUserControl.ascx.cs new file mode 100644 index 00000000000..70e9b764128 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/FilterUserControl.ascx.cs @@ -0,0 +1,41 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class FilterUserControl : System.Web.DynamicData.FilterUserControlBase { + public event EventHandler SelectedIndexChanged { + add { + DropDownList1.SelectedIndexChanged += value; + } + remove { + DropDownList1.SelectedIndexChanged -= value; + } + } + + public override string SelectedValue { + get { + return DropDownList1.SelectedValue; + } + } + + protected void Page_Init(object sender, EventArgs e) { + if (!Page.IsPostBack) { + PopulateListControl(DropDownList1); + + // Set the initial value if there is one + if (!String.IsNullOrEmpty(InitialValue)) + DropDownList1.SelectedValue = InitialValue; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/GridViewPager.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/GridViewPager.ascx new file mode 100644 index 00000000000..c3feb30b30d --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/GridViewPager.ascx @@ -0,0 +1,27 @@ +<%@ Control Language="C#" CodeFile="GridViewPager.ascx.cs" Inherits="GridViewPager" %> + +
+ + +   + +   + + + of + +   + +   + + + + + + + + + + + +
diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/GridViewPager.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/GridViewPager.ascx.cs new file mode 100644 index 00000000000..46f54b521f4 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/GridViewPager.ascx.cs @@ -0,0 +1,68 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class GridViewPager : System.Web.UI.UserControl { + private GridView _gridView; + + protected void Page_Load(object sender, EventArgs e) { + Control c = Parent; + while (c != null) { + if (c is GridView) { + _gridView = (GridView)c; + break; + } + c = c.Parent; + } + } + + protected void TextBoxPage_TextChanged(object sender, EventArgs e) { + if (_gridView == null) { + return; + } + int page; + if (int.TryParse(TextBoxPage.Text.Trim(), out page)) { + if (page <= 0) { + page = 1; + } + if (page > _gridView.PageCount) { + page = _gridView.PageCount; + } + _gridView.PageIndex = page - 1; + } + TextBoxPage.Text = (_gridView.PageIndex + 1).ToString(); + } + + protected void DropDownListPageSize_SelectedIndexChanged(object sender, EventArgs e) { + if (_gridView == null) { + return; + } + DropDownList dropdownlistpagersize = (DropDownList)sender; + _gridView.PageSize = Convert.ToInt32(dropdownlistpagersize.SelectedValue); + int pageindex = _gridView.PageIndex; + _gridView.DataBind(); + if (_gridView.PageIndex != pageindex) { + //if page index changed it means the previous page was not valid and was adjusted. Rebind to fill control with adjusted page + _gridView.DataBind(); + } + } + + protected void Page_PreRender(object sender, EventArgs e) { + if (_gridView != null) { + LabelNumberOfPages.Text = _gridView.PageCount.ToString(); + TextBoxPage.Text = (_gridView.PageIndex + 1).ToString(); + DropDownListPageSize.SelectedValue = _gridView.PageSize.ToString(); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/Back.gif b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/Back.gif new file mode 100644 index 00000000000..a4d72853cbd Binary files /dev/null and b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/Back.gif differ diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgFirst.gif b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgFirst.gif new file mode 100644 index 00000000000..f58b4be3fd6 Binary files /dev/null and b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgFirst.gif differ diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgLast.gif b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgLast.gif new file mode 100644 index 00000000000..9f4b7e2c80f Binary files /dev/null and b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgLast.gif differ diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgNext.gif b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgNext.gif new file mode 100644 index 00000000000..ec8e3754cf7 Binary files /dev/null and b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgNext.gif differ diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgPrev.gif b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgPrev.gif new file mode 100644 index 00000000000..e9ca1bb56d0 Binary files /dev/null and b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/PgPrev.gif differ diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/header_back.gif b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/header_back.gif new file mode 100644 index 00000000000..ec5ff2d2b67 Binary files /dev/null and b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/header_back.gif differ diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/plus.gif b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/plus.gif new file mode 100644 index 00000000000..2a5c267f4e6 Binary files /dev/null and b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/Content/Images/plus.gif differ diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean.ascx new file mode 100644 index 00000000000..5e9befb6714 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Boolean.ascx.cs" Inherits="BooleanField" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean.ascx.cs new file mode 100644 index 00000000000..8b57ca104bb --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean.ascx.cs @@ -0,0 +1,30 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class BooleanField : System.Web.DynamicData.FieldTemplateUserControl { + protected override void OnDataBinding(EventArgs e) { + base.OnDataBinding(e); + + object val = FieldValue; + if (val != null) + CheckBox1.Checked = (bool) val; + } + + public override Control DataControl { + get { + return CheckBox1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean_Edit.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean_Edit.ascx new file mode 100644 index 00000000000..99522b4437f --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean_Edit.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Boolean_Edit.ascx.cs" Inherits="Boolean_EditField" %> + + \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean_Edit.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean_Edit.ascx.cs new file mode 100644 index 00000000000..5c3c56188b9 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Boolean_Edit.ascx.cs @@ -0,0 +1,34 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Boolean_EditField : System.Web.DynamicData.FieldTemplateUserControl { + protected override void OnDataBinding(EventArgs e) { + base.OnDataBinding(e); + + object val = FieldValue; + if (val != null) + CheckBox1.Checked = (bool) val; + } + + protected override void ExtractValues(IOrderedDictionary dictionary) { + dictionary[Column.Name] = CheckBox1.Checked; + } + + public override Control DataControl { + get { + return CheckBox1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Children.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Children.ascx new file mode 100644 index 00000000000..a38219fd3e3 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Children.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Children.ascx.cs" Inherits="ChildrenField" %> + + \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Children.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Children.ascx.cs new file mode 100644 index 00000000000..c282462be55 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Children.ascx.cs @@ -0,0 +1,60 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class ChildrenField : System.Web.DynamicData.FieldTemplateUserControl { + private bool _allowNavigation = true; + private string _navigateUrl; + + public string NavigateUrl { + get { + return _navigateUrl; + } + set { + _navigateUrl = value; + } + } + + public bool AllowNavigation { + get { + return _allowNavigation; + } + set { + _allowNavigation = value; + } + } + + protected void Page_Load(object sender, EventArgs e) { + HyperLink1.Text = "View " + ChildrenColumn.ChildTable.DisplayName; + } + + protected string GetChildrenPath() { + if (!AllowNavigation) { + return null; + } + + if (String.IsNullOrEmpty(NavigateUrl)) { + return ChildrenPath; + } + else { + return BuildChildrenPath(NavigateUrl); + } + } + + public override Control DataControl { + get { + return HyperLink1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/CustomFieldTemplate.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/CustomFieldTemplate.ascx new file mode 100644 index 00000000000..b1ea3127c13 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/CustomFieldTemplate.ascx @@ -0,0 +1,2 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomFieldTemplate.ascx.cs" Inherits="DynamicData_FieldTemplates_CustomFieldTemplate" %> +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/CustomFieldTemplate.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/CustomFieldTemplate.ascx.cs new file mode 100644 index 00000000000..823382a2946 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/CustomFieldTemplate.ascx.cs @@ -0,0 +1,25 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class DynamicData_FieldTemplates_CustomFieldTemplate : System.Web.DynamicData.FieldTemplateUserControl +{ + public override Control DataControl + { + get + { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime.ascx new file mode 100644 index 00000000000..a05a6e454a8 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="DateTime.ascx.cs" Inherits="DateTimeField" %> + + \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime.ascx.cs new file mode 100644 index 00000000000..87059574ee1 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class DateTimeField : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime_Edit.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime_Edit.ascx new file mode 100644 index 00000000000..7b3b6b361d4 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime_Edit.ascx @@ -0,0 +1,7 @@ +<%@ Control Language="C#" CodeFile="DateTime_Edit.ascx.cs" Inherits="DateTime_EditField" %> + + + + + + \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime_Edit.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime_Edit.ascx.cs new file mode 100644 index 00000000000..5b1cbc1d90e --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/DateTime_Edit.ascx.cs @@ -0,0 +1,34 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class DateTime_EditField : System.Web.DynamicData.FieldTemplateUserControl { + protected void Page_Load(object sender, EventArgs e) { + TextBox1.ToolTip = Column.Description; + + SetUpValidator(RequiredFieldValidator1); + SetUpValidator(RegularExpressionValidator1); + SetUpValidator(DynamicValidator1); + } + + protected override void ExtractValues(IOrderedDictionary dictionary) { + dictionary[Column.Name] = ConvertEditedValue(TextBox1.Text); + } + + public override Control DataControl { + get { + return TextBox1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Decimal_Edit.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Decimal_Edit.ascx new file mode 100644 index 00000000000..9791384246b --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Decimal_Edit.ascx @@ -0,0 +1,11 @@ +<%@ Control Language="C#" CodeFile="Decimal_Edit.ascx.cs" Inherits="Decimal_EditField" %> + + + + + + + + \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Decimal_Edit.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Decimal_Edit.ascx.cs new file mode 100644 index 00000000000..9a73e6272a6 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Decimal_Edit.ascx.cs @@ -0,0 +1,36 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Decimal_EditField : System.Web.DynamicData.FieldTemplateUserControl { + protected void Page_Load(object sender, EventArgs e) { + TextBox1.ToolTip = Column.Description; + + SetUpValidator(RequiredFieldValidator1); + SetUpValidator(CompareValidator1); + SetUpValidator(RegularExpressionValidator1); + SetUpValidator(RangeValidator1); + SetUpValidator(DynamicValidator1); + } + + protected override void ExtractValues(IOrderedDictionary dictionary) { + dictionary[Column.Name] = ConvertEditedValue(TextBox1.Text); + } + + public override Control DataControl { + get { + return TextBox1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey.ascx new file mode 100644 index 00000000000..6da1a802424 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey.ascx @@ -0,0 +1,5 @@ +<%@ Control Language="C#" CodeFile="ForeignKey.ascx.cs" Inherits="ForeignKeyField" %> + + \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey.ascx.cs new file mode 100644 index 00000000000..29357e33328 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey.ascx.cs @@ -0,0 +1,60 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class ForeignKeyField : System.Web.DynamicData.FieldTemplateUserControl { + private bool _allowNavigation = true; + private string _navigateUrl; + + public string NavigateUrl { + get { + return _navigateUrl; + } + set { + _navigateUrl = value; + } + } + + public bool AllowNavigation { + get { + return _allowNavigation; + } + set { + _allowNavigation = value; + } + } + + protected string GetDisplayString() { + return FormatFieldValue(ForeignKeyColumn.ParentTable.GetDisplayString(FieldValue)); + } + + protected string GetNavigateUrl() { + if (!AllowNavigation) { + return null; + } + + if (String.IsNullOrEmpty(NavigateUrl)) { + return ForeignKeyPath; + } + else { + return BuildForeignKeyPath(NavigateUrl); + } + } + + public override Control DataControl { + get { + return HyperLink1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey_Edit.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey_Edit.ascx new file mode 100644 index 00000000000..cbd6b4132ee --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey_Edit.ascx @@ -0,0 +1,4 @@ +<%@ Control Language="C#" CodeFile="ForeignKey_Edit.ascx.cs" Inherits="ForeignKey_EditField" %> + + + \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey_Edit.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey_Edit.ascx.cs new file mode 100644 index 00000000000..5488157f2f5 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/ForeignKey_Edit.ascx.cs @@ -0,0 +1,53 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class ForeignKey_EditField : System.Web.DynamicData.FieldTemplateUserControl { + protected void Page_Load(object sender, EventArgs e) { + if (DropDownList1.Items.Count == 0) { + if (!Column.IsRequired) { + DropDownList1.Items.Add(new ListItem("[Not Set]", "")); + } + + PopulateListControl(DropDownList1); + } + } + + protected override void OnDataBinding(EventArgs e) { + base.OnDataBinding(e); + + if (Mode == DataBoundControlMode.Edit) { + string foreignkey = ForeignKeyColumn.GetForeignKeyString(Row); + ListItem item = DropDownList1.Items.FindByValue(foreignkey); + if (item != null) { + DropDownList1.SelectedValue = foreignkey; + } + } + } + + protected override void ExtractValues(IOrderedDictionary dictionary) { + // If it's an empty string, change it to null + string val = DropDownList1.SelectedValue; + if (val == String.Empty) + val = null; + + ExtractForeignKey(dictionary, val); + } + + public override Control DataControl { + get { + return DropDownList1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Integer_Edit.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Integer_Edit.ascx new file mode 100644 index 00000000000..785878f1592 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Integer_Edit.ascx @@ -0,0 +1,11 @@ +<%@ Control Language="C#" CodeFile="Integer_Edit.ascx.cs" Inherits="Integer_EditField" %> + + + + + + + + \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Integer_Edit.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Integer_Edit.ascx.cs new file mode 100644 index 00000000000..745de313813 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Integer_Edit.ascx.cs @@ -0,0 +1,36 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Integer_EditField : System.Web.DynamicData.FieldTemplateUserControl { + protected void Page_Load(object sender, EventArgs e) { + TextBox1.ToolTip = Column.Description; + + SetUpValidator(RequiredFieldValidator1); + SetUpValidator(CompareValidator1); + SetUpValidator(RegularExpressionValidator1); + SetUpValidator(RangeValidator1); + SetUpValidator(DynamicValidator1); + } + + protected override void ExtractValues(IOrderedDictionary dictionary) { + dictionary[Column.Name] = ConvertEditedValue(TextBox1.Text); + } + + public override Control DataControl { + get { + return TextBox1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MultilineText_Edit.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MultilineText_Edit.ascx new file mode 100644 index 00000000000..e8cc873eff4 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MultilineText_Edit.ascx @@ -0,0 +1,7 @@ +<%@ Control Language="C#" CodeFile="MultilineText_Edit.ascx.cs" Inherits="MultilineText_EditField" %> + + + + + + \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MultilineText_Edit.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MultilineText_Edit.ascx.cs new file mode 100644 index 00000000000..18816ce98f3 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MultilineText_Edit.ascx.cs @@ -0,0 +1,35 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class MultilineText_EditField : System.Web.DynamicData.FieldTemplateUserControl { + protected void Page_Load(object sender, EventArgs e) { + TextBox1.MaxLength = Column.MaxLength; + TextBox1.ToolTip = Column.Description; + + SetUpValidator(RequiredFieldValidator1); + SetUpValidator(RegularExpressionValidator1); + SetUpValidator(DynamicValidator1); + } + + protected override void ExtractValues(IOrderedDictionary dictionary) { + dictionary[Column.Name] = ConvertEditedValue(TextBox1.Text); + } + + public override Control DataControl { + get { + return TextBox1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MyCustomUIHintTemplate_Text.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MyCustomUIHintTemplate_Text.ascx new file mode 100644 index 00000000000..a2862846530 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MyCustomUIHintTemplate_Text.ascx @@ -0,0 +1,2 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MyCustomUIHintTemplate_Text.ascx.cs" Inherits="DynamicData_FieldTemplates_MyCustomUIHintTemplate_Text" %> +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MyCustomUIHintTemplate_Text.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MyCustomUIHintTemplate_Text.ascx.cs new file mode 100644 index 00000000000..ad4439bbc55 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/MyCustomUIHintTemplate_Text.ascx.cs @@ -0,0 +1,25 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class DynamicData_FieldTemplates_MyCustomUIHintTemplate_Text : System.Web.DynamicData.FieldTemplateUserControl +{ + public override Control DataControl + { + get + { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text.ascx new file mode 100644 index 00000000000..89511990b03 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Text.ascx.cs" Inherits="TextField" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text.ascx.cs new file mode 100644 index 00000000000..96cfc3cdb35 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class TextField : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text_Edit.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text_Edit.ascx new file mode 100644 index 00000000000..1f06a70a969 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text_Edit.ascx @@ -0,0 +1,7 @@ +<%@ Control Language="C#" CodeFile="Text_Edit.ascx.cs" Inherits="Text_EditField" %> + + + + + + \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text_Edit.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text_Edit.ascx.cs new file mode 100644 index 00000000000..b3e894afdb5 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates/Text_Edit.ascx.cs @@ -0,0 +1,37 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Text_EditField : System.Web.DynamicData.FieldTemplateUserControl { + protected void Page_Load(object sender, EventArgs e) { + TextBox1.MaxLength = Column.MaxLength; + if (Column.MaxLength < 20) + TextBox1.Columns = Column.MaxLength; + TextBox1.ToolTip = Column.Description; + + SetUpValidator(RequiredFieldValidator1); + SetUpValidator(RegularExpressionValidator1); + SetUpValidator(DynamicValidator1); + } + + protected override void ExtractValues(IOrderedDictionary dictionary) { + dictionary[Column.Name] = ConvertEditedValue(TextBox1.Text); + } + + public override Control DataControl { + get { + return TextBox1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Boolean.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Boolean.ascx new file mode 100644 index 00000000000..9e3ae319e02 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Boolean.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Boolean.ascx.cs" Inherits="Boolean_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Boolean.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Boolean.ascx.cs new file mode 100644 index 00000000000..a252df536e8 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Boolean.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Boolean_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte.ascx new file mode 100644 index 00000000000..ee8a30c1348 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Byte.ascx.cs" Inherits="Byte_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte.ascx.cs new file mode 100644 index 00000000000..8668d6cac42 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Byte_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte[].ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte[].ascx new file mode 100644 index 00000000000..283cca474e1 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte[].ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Byte[].ascx.cs" Inherits="ByteArray_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte[].ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte[].ascx.cs new file mode 100644 index 00000000000..14c602b47ff --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Byte[].ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class ByteArray_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Char.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Char.ascx new file mode 100644 index 00000000000..347acb39176 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Char.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Char.ascx.cs" Inherits="Char_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Char.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Char.ascx.cs new file mode 100644 index 00000000000..c62770f063d --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Char.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Char_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/FooEmpty.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/FooEmpty.ascx new file mode 100644 index 00000000000..fccf91611d8 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/FooEmpty.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="FooEmpty.ascx.cs" Inherits="FooEmpty_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/FooEmpty.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/FooEmpty.ascx.cs new file mode 100644 index 00000000000..abf9a017852 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/FooEmpty.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class FooEmpty_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/ICollection.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/ICollection.ascx new file mode 100644 index 00000000000..8057b88e427 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/ICollection.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="ICollection.ascx.cs" Inherits="ICollection_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/ICollection.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/ICollection.ascx.cs new file mode 100644 index 00000000000..fafa77dfa68 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/ICollection.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class ICollection_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int16.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int16.ascx new file mode 100644 index 00000000000..b94d8697f42 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int16.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Int16.ascx.cs" Inherits="Int16_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int16.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int16.ascx.cs new file mode 100644 index 00000000000..f49be873e25 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int16.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Int16_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int32.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int32.ascx new file mode 100644 index 00000000000..3ff6dcaf1fc --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int32.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Int32.ascx.cs" Inherits="Int32_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int32.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int32.ascx.cs new file mode 100644 index 00000000000..0b938a8fb7a --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int32.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Int32_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int64.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int64.ascx new file mode 100644 index 00000000000..ee3e15ff351 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int64.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Int64.ascx.cs" Inherits="Int64_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int64.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int64.ascx.cs new file mode 100644 index 00000000000..478a58b5bb0 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Int64.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Int64_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/MonoTests.Common.FooEmpty.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/MonoTests.Common.FooEmpty.ascx new file mode 100644 index 00000000000..c992ea8bc76 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/MonoTests.Common.FooEmpty.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="MonoTests.Common.FooEmpty.ascx.cs" Inherits="MonoTestsCommonFooEmpty_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/MonoTests.Common.FooEmpty.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/MonoTests.Common.FooEmpty.ascx.cs new file mode 100644 index 00000000000..300802e4d0f --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/MonoTests.Common.FooEmpty.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class MonoTestsCommonFooEmpty_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Object.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Object.ascx new file mode 100644 index 00000000000..fc2f5ec53e9 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Object.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="Object.ascx.cs" Inherits="Object_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Object.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Object.ascx.cs new file mode 100644 index 00000000000..94605509179 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/Object.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Object_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/SByte.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/SByte.ascx new file mode 100644 index 00000000000..7f65a9c03d2 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/SByte.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="SByte.ascx.cs" Inherits="SByte_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/SByte.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/SByte.ascx.cs new file mode 100644 index 00000000000..d847b73bad3 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/SByte.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SByte_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/String.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/String.ascx new file mode 100644 index 00000000000..b4b3245edc9 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/String.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="String.ascx.cs" Inherits="String_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/String.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/String.ascx.cs new file mode 100644 index 00000000000..91e6989c89b --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/String.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class String_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Boolean.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Boolean.ascx new file mode 100644 index 00000000000..ff1b003c6cb --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Boolean.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.Boolean.ascx.cs" Inherits="SystemBoolean_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Boolean.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Boolean.ascx.cs new file mode 100644 index 00000000000..20b974ff852 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Boolean.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemBoolean_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte.ascx new file mode 100644 index 00000000000..8589ab0250f --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.Byte.ascx.cs" Inherits="SystemByte_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte.ascx.cs new file mode 100644 index 00000000000..46306d27832 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemByte_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte[].ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte[].ascx new file mode 100644 index 00000000000..c9f9abe727e --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte[].ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.Byte[].ascx.cs" Inherits="SystemByteArray_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte[].ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte[].ascx.cs new file mode 100644 index 00000000000..bc45fc54092 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Byte[].ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemByteArray_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Char.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Char.ascx new file mode 100644 index 00000000000..149774a9b2d --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Char.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.Char.ascx.cs" Inherits="SystemChar_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Char.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Char.ascx.cs new file mode 100644 index 00000000000..4c33af1356f --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Char.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemChar_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.Generic.List`1[System.String].ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.Generic.List`1[System.String].ascx new file mode 100644 index 00000000000..f3181236f5a --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.Generic.List`1[System.String].ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.Collections.Generic.List`1[System.String].ascx.cs" Inherits="SystemStringList_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.Generic.List`1[System.String].ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.Generic.List`1[System.String].ascx.cs new file mode 100644 index 00000000000..077ea9bef17 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.Generic.List`1[System.String].ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemStringList_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.ICollection.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.ICollection.ascx new file mode 100644 index 00000000000..c68bd4df163 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.ICollection.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.Collections.ICollection.ascx.cs" Inherits="SystemCollectionsICollection_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.ICollection.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.ICollection.ascx.cs new file mode 100644 index 00000000000..ead4f554030 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Collections.ICollection.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemCollectionsICollection_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int16.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int16.ascx new file mode 100644 index 00000000000..a3f673121fa --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int16.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.Int16.ascx.cs" Inherits="SystemInt16_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int16.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int16.ascx.cs new file mode 100644 index 00000000000..3192c848818 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int16.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemInt16_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int32.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int32.ascx new file mode 100644 index 00000000000..a9ef096e121 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int32.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.Int32.ascx.cs" Inherits="SystemInt32_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int32.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int32.ascx.cs new file mode 100644 index 00000000000..1a55c869328 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int32.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemInt32_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int64.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int64.ascx new file mode 100644 index 00000000000..d26376ad8a6 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int64.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.Int64.ascx.cs" Inherits="SystemInt64_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int64.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int64.ascx.cs new file mode 100644 index 00000000000..850aabb29c1 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Int64.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemInt64_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Object.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Object.ascx new file mode 100644 index 00000000000..075946c8642 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Object.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.Object.ascx.cs" Inherits="SystemObject_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Object.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Object.ascx.cs new file mode 100644 index 00000000000..fe4ad1888d9 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.Object.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemObject_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.SByte.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.SByte.ascx new file mode 100644 index 00000000000..750c465e323 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.SByte.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.SByte.ascx.cs" Inherits="SystemSByte_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.SByte.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.SByte.ascx.cs new file mode 100644 index 00000000000..3fa33d9936b --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.SByte.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemSByte_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.String.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.String.ascx new file mode 100644 index 00000000000..962aff21318 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.String.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.String.ascx.cs" Inherits="SystemString_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.String.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.String.ascx.cs new file mode 100644 index 00000000000..df22641e1ef --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.String.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemString_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt16.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt16.ascx new file mode 100644 index 00000000000..846c63d7af9 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt16.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.UInt16.ascx.cs" Inherits="SystemUInt16_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt16.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt16.ascx.cs new file mode 100644 index 00000000000..f8b94363b53 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt16.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemUInt16_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt32.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt32.ascx new file mode 100644 index 00000000000..7fa5cd12bc9 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt32.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.UInt32.ascx.cs" Inherits="SystemUInt32_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt32.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt32.ascx.cs new file mode 100644 index 00000000000..95e5477b55e --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt32.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemUInt32_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt64.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt64.ascx new file mode 100644 index 00000000000..d9aa60de984 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt64.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="System.UInt64.ascx.cs" Inherits="SystemUInt64_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt64.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt64.ascx.cs new file mode 100644 index 00000000000..b48ea79a21f --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/System.UInt64.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class SystemUInt64_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt16.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt16.ascx new file mode 100644 index 00000000000..32c7c45ca57 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt16.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="UInt16.ascx.cs" Inherits="UInt16_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt16.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt16.ascx.cs new file mode 100644 index 00000000000..86678cbe746 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt16.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class UInt16_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt32.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt32.ascx new file mode 100644 index 00000000000..123a3f9aab8 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt32.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="UInt32.ascx.cs" Inherits="UInt32_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt32.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt32.ascx.cs new file mode 100644 index 00000000000..4ab945e0dd2 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt32.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class UInt32_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt64.ascx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt64.ascx new file mode 100644 index 00000000000..dbacfb85ec8 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt64.ascx @@ -0,0 +1,3 @@ +<%@ Control Language="C#" CodeFile="UInt64.ascx.cs" Inherits="UInt64_Field" %> + +<%= Column.Name %>: \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt64.ascx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt64.ascx.cs new file mode 100644 index 00000000000..7b4ad3c81ae --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/FieldTemplates_NonDefault/UInt64.ascx.cs @@ -0,0 +1,22 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Collections.Specialized; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class UInt64_Field : System.Web.DynamicData.FieldTemplateUserControl { + public override Control DataControl { + get { + return Literal1; + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Details.aspx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Details.aspx new file mode 100644 index 00000000000..79472c6ea87 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Details.aspx @@ -0,0 +1,46 @@ +<%@ Page Language="C#" MasterPageFile="~/Site.master" CodeFile="Details.aspx.cs" Inherits="Details" %> + + + + + +

Entry from table <%= table.DisplayName %>

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Details.aspx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Details.aspx.cs new file mode 100644 index 00000000000..484fa2944af --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Details.aspx.cs @@ -0,0 +1,34 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Details : System.Web.UI.Page { + protected MetaTable table; + + protected void Page_Init(object sender, EventArgs e) { + DynamicDataManager1.RegisterControl(DetailsView1); + } + + protected void Page_Load(object sender, EventArgs e) { + table = DetailsDataSource.GetTable(); + Title = table.DisplayName; + + ListHyperLink.NavigateUrl = table.ListActionPath; + } + + protected void DetailsView1_ItemDeleted(object sender, DetailsViewDeletedEventArgs e) { + if (e.Exception == null || e.ExceptionHandled) { + Response.Redirect(table.ListActionPath); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Edit.aspx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Edit.aspx new file mode 100644 index 00000000000..266e8d71c45 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Edit.aspx @@ -0,0 +1,29 @@ +<%@ Page Language="C#" MasterPageFile="~/Site.master" CodeFile="Edit.aspx.cs" Inherits="Edit" %> + + + + + +

Edit entry from table <%= table.DisplayName %>

+ + + + + + + + + + + + + + + + + + +
diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Edit.aspx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Edit.aspx.cs new file mode 100644 index 00000000000..7f10dd900e4 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Edit.aspx.cs @@ -0,0 +1,39 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Edit : System.Web.UI.Page { + protected MetaTable table; + + protected void Page_Init(object sender, EventArgs e) { + DynamicDataManager1.RegisterControl(DetailsView1); + } + + protected void Page_Load(object sender, EventArgs e) { + table = DetailsDataSource.GetTable(); + Title = table.DisplayName; + + } + + protected void DetailsView1_ItemCommand(object sender, DetailsViewCommandEventArgs e) { + if (e.CommandName == DataControlCommands.CancelCommandName) { + Response.Redirect(table.ListActionPath); + } + } + + protected void DetailsView1_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e) { + if (e.Exception == null || e.ExceptionHandled) { + Response.Redirect(table.ListActionPath); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Insert.aspx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Insert.aspx new file mode 100644 index 00000000000..9be644e9fad --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Insert.aspx @@ -0,0 +1,26 @@ +<%@ Page Language="C#" MasterPageFile="~/Site.master" CodeFile="Insert.aspx.cs" Inherits="Insert" %> + + + + + +

Add new entry to table <%= table.DisplayName %>

+ + + + + + + + + + + + + + + +
diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Insert.aspx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Insert.aspx.cs new file mode 100644 index 00000000000..f203094eb6f --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/Insert.aspx.cs @@ -0,0 +1,38 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Insert : System.Web.UI.Page { + protected MetaTable table; + + protected void Page_Init(object sender, EventArgs e) { + DynamicDataManager1.RegisterControl(DetailsView1); + } + + protected void Page_Load(object sender, EventArgs e) { + table = DetailsDataSource.GetTable(); + Title = table.DisplayName; + } + + protected void DetailsView1_ItemCommand(object sender, DetailsViewCommandEventArgs e) { + if (e.CommandName == DataControlCommands.CancelCommandName) { + Response.Redirect(table.ListActionPath); + } + } + + protected void DetailsView1_ItemInserted(object sender, DetailsViewInsertedEventArgs e) { + if (e.Exception == null || e.ExceptionHandled) { + Response.Redirect(table.ListActionPath); + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/List.aspx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/List.aspx new file mode 100644 index 00000000000..379c3e4c563 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/List.aspx @@ -0,0 +1,66 @@ +<%@ Page Language="C#" MasterPageFile="~/Site.master" CodeFile="List.aspx.cs" Inherits="List" %> + +<%@ Register src="~/DynamicData/Content/GridViewPager.ascx" tagname="GridViewPager" tagprefix="asp" %> +<%@ Register src="~/DynamicData/Content/FilterUserControl.ascx" tagname="DynamicFilter" tagprefix="asp" %> + + + + +

<%= table.DisplayName%>

+ + + + + + + + + + + + + +

+
+ + + + + +    + + + + + + + + + + There are currently no items in this table. + + + + + + + + + +
+ + +
+
+
diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/List.aspx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/List.aspx.cs new file mode 100644 index 00000000000..18657ceee18 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/List.aspx.cs @@ -0,0 +1,38 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class List : System.Web.UI.Page { + protected MetaTable table; + + protected void Page_Init(object sender, EventArgs e) { + DynamicDataManager1.RegisterControl(GridView1, true /*setSelectionFromUrl*/); + } + + protected void Page_Load(object sender, EventArgs e) { + table = GridDataSource.GetTable(); + Title = table.DisplayName; + + InsertHyperLink.NavigateUrl = table.GetActionPath(PageAction.Insert); + + // Disable various options if the table is readonly + if (table.IsReadOnly) { + GridView1.Columns[0].Visible = false; + InsertHyperLink.Visible = false; + } + } + + protected void OnFilterSelectedIndexChanged(object sender, EventArgs e) { + GridView1.PageIndex = 0; + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/ListDetails.aspx b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/ListDetails.aspx new file mode 100644 index 00000000000..7f4fdac01ee --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/ListDetails.aspx @@ -0,0 +1,68 @@ +<%@ Page Language="C#" MasterPageFile="~/Site.master" CodeFile="ListDetails.aspx.cs" Inherits="ListDetails" %> + +<%@ Register src="~/DynamicData/Content/GridViewPager.ascx" tagname="GridViewPager" tagprefix="asp" %> +<%@ Register src="~/DynamicData/Content/FilterUserControl.ascx" tagname="DynamicFilter" tagprefix="asp" %> + + + + +

<%= GridDataSource.GetTable().DisplayName %>

+ + + + + + + + + + + + + + +

+
+ + + + + + + + + + There are currently no items in this table. + + + + + + + + + + +

+ + + + + + + + + +
+
+
+
diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/ListDetails.aspx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/ListDetails.aspx.cs new file mode 100644 index 00000000000..5cf2e38d70a --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/PageTemplates/ListDetails.aspx.cs @@ -0,0 +1,100 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class ListDetails : System.Web.UI.Page { + protected void Page_Init(object sender, EventArgs e) { + DynamicDataManager1.RegisterControl(GridView1, true /*setSelectionFromUrl*/); + DynamicDataManager1.RegisterControl(DetailsView1); + } + + protected void Page_Load(object sender, EventArgs e) { + MetaTable table = GridDataSource.GetTable(); + Title = table.DisplayName; + + + + // Disable various options if the table is readonly + if (table.IsReadOnly) { + DetailsPanel.Visible = false; + GridView1.AutoGenerateSelectButton = false; + GridView1.AutoGenerateEditButton = false; + GridView1.AutoGenerateDeleteButton = false; + } + } + protected void OnGridViewDataBound(object sender, EventArgs e) { + if (GridView1.Rows.Count == 0) { + DetailsView1.ChangeMode(DetailsViewMode.Insert); + } + } + protected void OnFilterSelectedIndexChanged(object sender, EventArgs e) { + GridView1.EditIndex = -1; + GridView1.PageIndex = 0; + DetailsView1.ChangeMode(DetailsViewMode.ReadOnly); + } + protected void OnGridViewRowEditing(object sender, EventArgs e) { + DetailsView1.ChangeMode(DetailsViewMode.ReadOnly); + } + protected void OnGridViewSelectedIndexChanging(object sender, EventArgs e) { + GridView1.EditIndex = -1; + DetailsView1.ChangeMode(DetailsViewMode.ReadOnly); + } + + protected void OnGridViewRowCreated(object sender, GridViewRowEventArgs e) { + SetDeleteConfirmation(e.Row); + } + + protected void OnGridViewRowDeleted(object sender, GridViewDeletedEventArgs e) { + DetailsView1.DataBind(); + } + + protected void OnGridViewRowUpdated(object sender, GridViewUpdatedEventArgs e) { + DetailsView1.DataBind(); + } + + protected void OnDetailsViewItemDeleted(object sender, DetailsViewDeletedEventArgs e) { + GridView1.DataBind(); + } + + protected void OnDetailsViewItemUpdated(object sender, DetailsViewUpdatedEventArgs e) { + GridView1.DataBind(); + } + + protected void OnDetailsViewItemInserted(object sender, DetailsViewInsertedEventArgs e) { + GridView1.DataBind(); + } + + protected void OnDetailsViewModeChanging(object sender, DetailsViewModeEventArgs e) { + if (e.NewMode != DetailsViewMode.ReadOnly) { + GridView1.EditIndex = -1; + } + } + + protected void OnDetailsViewPreRender(object sender, EventArgs e) { + int rowCount = DetailsView1.Rows.Count; + if (rowCount > 0) { + SetDeleteConfirmation(DetailsView1.Rows[rowCount - 1]); + } + } + + private void SetDeleteConfirmation(TableRow row) { + foreach (Control c in row.Cells[0].Controls) { + if (c is LinkButton) { + LinkButton btn = (LinkButton)c; + if (btn.CommandName == DataControlCommands.DeleteCommandName) { + btn.OnClientClick = "return confirm('Are you sure you want to delete this item?');"; + } + } + } + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/web.config b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/web.config new file mode 100644 index 00000000000..9785140c20d --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/DynamicData/web.config @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/Global.asax b/mcs/class/System.Web.DynamicData/Test/WebPages/Global.asax new file mode 100644 index 00000000000..d30417207f6 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/Global.asax @@ -0,0 +1,26 @@ +<%@ Application Language="C#" %> +<%@ Import Namespace="System.Web.Routing" %> +<%@ Import Namespace="System.Web.DynamicData" %> +<%@ Import Namespace="MonoTests.DataObjects" %> +<%@ Import Namespace="MonoTests.DataSource" %> +<%@ Import Namespace="MonoTests.ModelProviders" %> +<%@ Import Namespace="MonoTests.Common" %> + + + diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_01.aspx b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_01.aspx new file mode 100644 index 00000000000..43aab82ceeb --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_01.aspx @@ -0,0 +1,29 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ListView_DynamicControl_01.aspx.cs" Inherits="ListView_DynamicControl_01" %> + + + + + DynamicControl Sample + + +
+
+ + + +
+ + +
+ + + +
+
+ + + +
+ + + diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_01.aspx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_01.aspx.cs new file mode 100644 index 00000000000..16b7f3569a2 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_01.aspx.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +using MonoTests.DataObjects; +using MonoTests.Common; +using MonoTests.SystemWeb.Framework; +using MonoTests.DataSource; + +public partial class ListView_DynamicControl_01 : TestsBasePage +{ + protected override void PopulateDataSource (DynamicDataSource ds) + { + var container = ds.DataContainerInstance as TestDataContainer; + if (container == null) + return; + + List employees = container.ContainedTypeInstance.Employees; + employees.Add (new Employee { + FirstName = "Marek", + LastName = "Habersack" + }); + } + + protected void Page_Init (object sender, EventArgs e) + { + InitializeDataSource (DynamicDataSource1, "EmployeeTable"); + DynamicDataManager1.RegisterControl (ListView1); + } + + protected void Page_Load (object sender, EventArgs e) + { + + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_02.aspx b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_02.aspx new file mode 100644 index 00000000000..65ddf72eafb --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_02.aspx @@ -0,0 +1,28 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ListView_DynamicControl_02.aspx.cs" Inherits="ListView_DynamicControl_02" %> + + + + + DynamicControl Sample + + +
+
+ + + +
+ + +
+ + +
+
+ + + +
+ + + diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_02.aspx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_02.aspx.cs new file mode 100644 index 00000000000..a2a7b1b19b3 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_02.aspx.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +using MonoTests.DataObjects; +using MonoTests.Common; +using MonoTests.SystemWeb.Framework; +using MonoTests.DataSource; + +public partial class ListView_DynamicControl_02 : TestsBasePage +{ + protected override void PopulateDataSource (DynamicDataSource ds) + { + var container = ds.DataContainerInstance as TestDataContainer; + if (container == null) + return; + + List employees = container.ContainedTypeInstance.Employees; + employees.Add (new Employee { + FirstName = "Marek", + LastName = "Habersack" + }); + } + + protected void Page_Init (object sender, EventArgs e) + { + InitializeDataSource (DynamicDataSource2, "EmployeeTable"); + DynamicDataManager2.RegisterControl (ListView2); + } + + protected void Page_Load (object sender, EventArgs e) + { + + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_03.aspx b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_03.aspx new file mode 100644 index 00000000000..3674e61be8b --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_03.aspx @@ -0,0 +1,61 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ListView_DynamicControl_03.aspx.cs" Inherits="ListView_DynamicControl_03" %> + + + + + DynamicControl Sample + + +
+
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_03.aspx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_03.aspx.cs new file mode 100644 index 00000000000..1771a092f2c --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_03.aspx.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +using MonoTests.DataObjects; +using MonoTests.Common; +using MonoTests.SystemWeb.Framework; +using MonoTests.DataSource; + +public partial class ListView_DynamicControl_03 : TestsBasePage +{ + protected override void PopulateDataSource (DynamicDataSource ds) + { + var container = ds.DataContainerInstance as TestDataContainer; + if (container == null) + return; + + List defaultDataTypes = container.ContainedTypeInstance.DefaultDataTypes; + defaultDataTypes.Add (new BazDataTypeDefaultTypes ()); + } + + protected void Page_Init (object sender, EventArgs e) + { + InitializeDataSource (DynamicDataSource3, "BazDataTypeDefaultTypesTable"); + DynamicDataManager3.RegisterControl (ListView3); + } + + protected void Page_Load (object sender, EventArgs e) + { + + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_04.aspx b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_04.aspx new file mode 100644 index 00000000000..22d2fc10a50 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_04.aspx @@ -0,0 +1,93 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ListView_DynamicControl_04.aspx.cs" Inherits="ListView_DynamicControl_04" %> + + + + + DynamicControl Sample + + +
+
+ + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_04.aspx.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_04.aspx.cs new file mode 100644 index 00000000000..668068685c8 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/ListView_DynamicControl_04.aspx.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +using MonoTests.DataObjects; +using MonoTests.Common; +using MonoTests.SystemWeb.Framework; +using MonoTests.DataSource; + +public partial class ListView_DynamicControl_04 : TestsBasePage +{ + protected override void PopulateDataSource (DynamicDataSource ds) + { + var container = ds.DataContainerInstance as TestDataContainer; + if (container == null) + return; + + List defaultDataTypes = container.ContainedTypeInstance.DefaultDataTypes; + defaultDataTypes.Add (new BazDataTypeDefaultTypes (true)); + } + + protected void Page_Init (object sender, EventArgs e) + { + InitializeDataSource (DynamicDataSource4, "BazDataTypeDefaultTypesTable"); + DynamicDataManager4.RegisterControl (ListView4); + } + + protected void Page_Load (object sender, EventArgs e) + { + + } + + protected void ListView4_ItemCommand (object sender, ListViewCommandEventArgs e) + { + } +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/Site.css b/mcs/class/System.Web.DynamicData/Test/WebPages/Site.css new file mode 100644 index 00000000000..d850f2ca378 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/Site.css @@ -0,0 +1,272 @@ +/* Cascading Stylesheet for Common Elements */ + +/* Begin: General */ +body.template +{ + padding-left: 8px; + padding-right: 8px; + font-family: Tahoma, Arial, sans-serif; + font-size: 75%; + color: #666666; +} +body.template h1 +{ + padding-bottom: 12px; + border-bottom: 1px dotted #bbbbbb; + font-size: 2.2em; + font-family: Trebuchet MS, Arial, sans-serif; + color: #888888; +} +span.allcaps +{ + font-variant: small-caps; +} +body.template h2 +{ + margin-bottom: 10px; + font-family: Trebuchet MS, Arial, sans-serif; + font-size: 1.65em; + color: #888888; +} +div.back +{ + margin-bottom: -20px; + position: relative; + top: -28px; + padding-left: 5px; + padding-bottom: 5px; +} +div.back img +{ + position: relative; + margin-top: 0em; + padding-left: 8px; + padding-right: 8px; + border: none; + background-color: #ffffff; +} +div.back a:link, +div.back a:visited +{ + color: #839ce7; + text-decoration: none; + background-color: #ffffff; + padding-right: 8px; + top: -.2em; + left: .25em; +} +div.back a:hover +{ + color: #000099; + text-decoration: underline !important; +} +/* End: General */ + +/* Begin: Tables */ +body.template table.listview, table.gridview, table.detailstable +{ + border: 1px solid #dbddff; + border-bottom: 3px solid #dbddff; + border-collapse: collapse; + font-family: Tahoma, Arial, sans-serif; + color: #666666; + font-size: 95%; + +} + +body.template table.listview th, table.gridview th, table.detailstable th, +body.template table.listview td, table.gridview td, table.detailstable td +{ + padding-top: 6px; + padding-bottom: 6px; + padding-left: 10px; + padding-right: 10px; + line-height: 1.1em; +} + +body.template table.listview th, table.gridview th, table.detailstable th +{ + background-position: 1px 1px; + background-repeat: repeat-x; + background-color: #ffffff; + font-size: 100%; + text-align: left; + line-height: 1.3em; + color: #666666; + border-left: 1px solid #dbddff; + border-right: 1px solid #dbddff; + border-bottom: 1px solid #dbddff; +} + +body.template table.listview td, table.gridview td, table.detailstable td +{ + border-left: 0px; + border-right: 0px; + border-bottom: 1px dotted #dadada; +} + +body.template td.bold { + font-weight:bold; +} + +body.template th a:link, +body.template th a:visited, +body.template th a:hover +{ + color: #666666; + text-decoration: none; +} + +body.template td a:link, +body.template td a:visited +{ + color: #718ABE; + text-decoration: none; + padding-right: 6px; +} +body.template td a:hover +{ + color: #000099; + text-decoration: underline !important; +} +table.gridview +{ + width: 100%; +} +table.gridview table td +{ + padding-left: .5em; + padding-right: .5em; +} + +table.gridview th { + background-image:url(DynamicData/Content/Images/header_back.gif); +} + +table.listview +{ + width: 100%; +} +table.listview td a:link, +table.listview td a:visited +{ + font-size: 100%; +} +table.listview table td +{ + padding-left: .5em; + padding-right: .5em; +} + +table.listview th { + background-image:url(DynamicData/Content/Images/header_back.gif); +} + +table.detailstable td +{ + border-left: 1px solid #dbddff; + border-right: 1px solid #dbddff; + vertical-align:top; +} + +table.detailstable th +{ + background: #FCFDFE; + vertical-align:top; +} + +td.nowrap +{ + white-space: nowrap; +} +/* The following modifies the details table */ +body.template tr +{ + background: #FCFDFE; +} +/* The following modifies the controls in the list table footer */ +tr.footer td +{ + background: #dbddff; + height: 1.5em; +} + +/* The following modifies the selected row in the list table */ +tr.selected td +{ + background: #fdffb8; +} + +/* End: Tables */ + +/* The following modifies the page number control which exists under the main table */ +div.pager +{ + padding: 0px; + padding-left: 6px; + padding-right: 6px; +} +span.results1 +{ + float:left; +} +span.results2 +{ + float:right; +} +/* The following modifies the results per page control which exists under the main table */ +div.results +{ + display: inline; + position: relative; + padding: 0px; + padding-left: 6px; + padding-right: 6px; + margin-top: -1.75em; + float:right; +} +/* Set's the appearance of the drop down control*/ +.droplist +{ + padding: 0px; + font-family: Tahoma, Arial, Sans-Serif; + font-size: .95em; + color: #666666; +} +/* Bottom hyperlink design*/ +div.bottomhyperlink +{ + font-family: Tahoma, Arial, Sans-Serif; + font-size: 100%; + margin-top: -3px; +} +div.bottomhyperlink a:link, +div.bottomhyperlink a:visited +{ + color: #839ce7; + text-decoration: none; + + font-family: Tahoma, Arial, Sans-Serif; + + font-size: 100%; + + margin-top: -3px; +} +div.bottomhyperlink a:hover +{ + + color: #000099; + + text-decoration: underline !important; + + font-family: Tahoma, Arial, Sans-Serif; + + font-size: 100%; +} +div.bottomhyperlink img +{ + position: relative; + top: 0em; + padding-right: .4em; + border: none; +} \ No newline at end of file diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/Site.master b/mcs/class/System.Web.DynamicData/Test/WebPages/Site.master new file mode 100644 index 00000000000..a7687e22a3a --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/Site.master @@ -0,0 +1,25 @@ +<%@ Master Language="C#" CodeFile="Site.master.cs" Inherits="Site" %> + + + + + + Dynamic Data Site + + + +

Dynamic Data Site

+ + +
+
+ + + + +
+ + + diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/Site.master.cs b/mcs/class/System.Web.DynamicData/Test/WebPages/Site.master.cs new file mode 100644 index 00000000000..fb75663ad68 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/Site.master.cs @@ -0,0 +1,17 @@ +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using System.Xml.Linq; +using System.Web.DynamicData; + +public partial class Site : System.Web.UI.MasterPage { + +} diff --git a/mcs/class/System.Web.DynamicData/Test/WebPages/web.config b/mcs/class/System.Web.DynamicData/Test/WebPages/web.config new file mode 100644 index 00000000000..09b0d2862d0 --- /dev/null +++ b/mcs/class/System.Web.DynamicData/Test/WebPages/web.config @@ -0,0 +1,135 @@ + + + + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mcs/class/System.Web.DynamicData/genresources.sh b/mcs/class/System.Web.DynamicData/genresources.sh new file mode 100755 index 00000000000..14df1dd053d --- /dev/null +++ b/mcs/class/System.Web.DynamicData/genresources.sh @@ -0,0 +1,16 @@ +#!/bin/sh +# +# A little script to ease the pain of adding new resources to the test suite +# +genres () +{ + local line + + read line + while test -n "$line"; do + echo "\t$line,MonoTests.`echo $line | tr / . | cut -d '.' -f 2-`\t\\" + read line + done +} + +find Test/WebPages -name "*" -type f | sort | genres diff --git a/mcs/class/System.Web.Extensions/ChangeLog b/mcs/class/System.Web.Extensions/ChangeLog index 7c4a1277635..7b5310788d9 100644 --- a/mcs/class/System.Web.Extensions/ChangeLog +++ b/mcs/class/System.Web.Extensions/ChangeLog @@ -1,3 +1,7 @@ +2009-07-06 Raja R Harinath + + * Makefile (TEST_MCS_FLAGS): Reference SystemWebTestShim. + 2009-05-26 Marek Habersack * Test/System.Web.UI/ScriptReferenceBaseTest.cs: added tests for diff --git a/mcs/class/System.Web.Extensions/Makefile b/mcs/class/System.Web.Extensions/Makefile index d5211a5afa3..f8df1d1824f 100644 --- a/mcs/class/System.Web.Extensions/Makefile +++ b/mcs/class/System.Web.Extensions/Makefile @@ -51,7 +51,7 @@ LIB_MCS_FLAGS = \ $(OTHER_LIB_MCS_FLAGS) \ $(RESOURCE_FILES:%=/resource:%) -TEST_MCS_FLAGS = $(LIB_MCS_FLAGS) -doc:$(test_lib:.dll=.xml) -nowarn:219,169,1591 $(NUNIT_RESOURCE_FILES:%=/resource:%) +TEST_MCS_FLAGS = $(LIB_MCS_FLAGS) -doc:$(test_lib:.dll=.xml) -nowarn:219,169,1591 $(NUNIT_RESOURCE_FILES:%=/resource:%) -r:SystemWebTestShim.dll EXTRA_DISTFILES = $(RESOURCE_FILES_DIST) $(NUNIT_RESOURCE_FILES) diff --git a/mcs/class/System.Web.Extensions/System.Web.Extensions_test.dll.sources b/mcs/class/System.Web.Extensions/System.Web.Extensions_test.dll.sources index 0f0f0e6bbbd..88dd7498d2e 100644 --- a/mcs/class/System.Web.Extensions/System.Web.Extensions_test.dll.sources +++ b/mcs/class/System.Web.Extensions/System.Web.Extensions_test.dll.sources @@ -32,6 +32,7 @@ ../../System.Web/Test/mainsoft/NunitWeb/NunitWeb/Response.cs ../../System.Web/Test/mainsoft/NunitWeb/NunitWeb/StandardUrl.cs ../../System.Web/Test/mainsoft/NunitWeb/NunitWeb/WebTest.cs +../../System.Web/Test/mainsoft/NunitWeb/NunitWeb/WebTestResourcesSetupAttribute.cs code/Country.cs code/CountryCollection.cs System.Web.Script.Serialization/JavaScriptSerializerTest.cs diff --git a/mcs/class/System.Web.Extensions/System.Web.Script.Services/ChangeLog b/mcs/class/System.Web.Extensions/System.Web.Script.Services/ChangeLog index 6533b8e0308..c96e6c34152 100644 --- a/mcs/class/System.Web.Extensions/System.Web.Script.Services/ChangeLog +++ b/mcs/class/System.Web.Extensions/System.Web.Script.Services/ChangeLog @@ -1,3 +1,7 @@ +2009-06-14 Robert Jordan + + * ScriptHandlerFactory.cs: handle precompiled web services. + 2009-04-07 Gonzalo Paniagua Javier * ClientProxyHandler.cs: set cacheability to public. diff --git a/mcs/class/System.Web.Extensions/System.Web.Script.Services/ScriptHandlerFactory.cs b/mcs/class/System.Web.Extensions/System.Web.Script.Services/ScriptHandlerFactory.cs index d1bb30b513b..77279e7b0e2 100644 --- a/mcs/class/System.Web.Extensions/System.Web.Script.Services/ScriptHandlerFactory.cs +++ b/mcs/class/System.Web.Extensions/System.Web.Script.Services/ScriptHandlerFactory.cs @@ -30,6 +30,7 @@ using System; using System.Collections.Generic; using System.Text; +using System.Web.Compilation; using System.Web.Services.Protocols; using System.Web.UI; @@ -47,14 +48,20 @@ namespace System.Web.Script.Services HttpRequest request = context.Request; string contentType = request.ContentType; if (!String.IsNullOrEmpty (contentType) && contentType.StartsWith ("application/json", StringComparison.OrdinalIgnoreCase)) { - Type handlerType; + Type handlerType = null; if (url.EndsWith (ProfileService.DefaultWebServicePath, StringComparison.Ordinal)) handlerType = typeof (ProfileService); else if (url.EndsWith (AuthenticationService.DefaultWebServicePath, StringComparison.Ordinal)) handlerType = typeof(AuthenticationService); - else - handlerType = WebServiceParser.GetCompiledType (url, context); + else { +#if !TARGET_JVM + handlerType = BuildManager.GetCompiledType (url); +#endif + if (handlerType == null) + handlerType = WebServiceParser.GetCompiledType (url, context); + } + return RestHandler.GetHandler (context, handlerType, url); } if (request.PathInfo.StartsWith ("/js", StringComparison.OrdinalIgnoreCase)) diff --git a/mcs/class/System.Web.Extensions/System.Web.UI.WebControls/ChangeLog b/mcs/class/System.Web.Extensions/System.Web.UI.WebControls/ChangeLog index 3bff03a91a4..93b7e7fe0e8 100644 --- a/mcs/class/System.Web.Extensions/System.Web.UI.WebControls/ChangeLog +++ b/mcs/class/System.Web.Extensions/System.Web.UI.WebControls/ChangeLog @@ -1,3 +1,9 @@ +2009-06-25 Marek Habersack + + * LinqDataSource.cs: make ContextType not throw an exception when + ContextTypeName is not set, but rather return a null in that + case. + 2009-03-03 Marek Habersack * ListView.cs: SetPageProperties invoked the diff --git a/mcs/class/System.Web.Extensions/System.Web.UI.WebControls/LinqDataSource.cs b/mcs/class/System.Web.Extensions/System.Web.UI.WebControls/LinqDataSource.cs index 422abc63002..74bd261daff 100644 --- a/mcs/class/System.Web.Extensions/System.Web.UI.WebControls/LinqDataSource.cs +++ b/mcs/class/System.Web.Extensions/System.Web.UI.WebControls/LinqDataSource.cs @@ -151,7 +151,8 @@ namespace System.Web.UI.WebControls return context_type; if (String.IsNullOrEmpty (ContextTypeName)) - throw new ArgumentException ("ContextTypeName is not set"); + return null; + // FIXME: retrieve type from BuildProvider or whatever. context_type = LoadType (ContextTypeName); if (context_type == null) diff --git a/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/ChangeLog b/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/ChangeLog index d1e26b979f9..f34b6c0c373 100644 --- a/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/ChangeLog +++ b/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/ChangeLog @@ -1,3 +1,9 @@ +2009-06-18 Marek Habersack + + * JavaScriptSerializerTest.cs: added comparison with the + .NET-generated serialization result in TestDeserialize and + TestDeserializeTypeResolver tests. + 2009-03-17 Marek Habersack * JavaScriptSerializerTest.cs: added tests for conversion to diff --git a/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/JavaScriptSerializerTest.cs b/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/JavaScriptSerializerTest.cs index 3d057c522af..1ead748a6a9 100644 --- a/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/JavaScriptSerializerTest.cs +++ b/mcs/class/System.Web.Extensions/Test/System.Web.Script.Serialization/JavaScriptSerializerTest.cs @@ -45,7 +45,7 @@ using System.Web.UI.WebControls; using System.Collections.ObjectModel; -namespace Tests.System.Web.Script.Serialization +namespace MonoTests.System.Web.Script.Serialization { [TestFixture] public class JavaScriptSerializerTest @@ -398,8 +398,11 @@ namespace Tests.System.Web.Script.Serialization X s = new X (); s.Init (); string x = ser.Serialize (s); + + Assert.AreEqual ("{\"z\":8,\"ch\":\"v\",\"ch_null\":null,\"str\":\"vwF59g\",\"b\":253,\"sb\":-48,\"sh\":-32740,\"ush\":65511,\"i\":-234235453,\"ui\":4294733061,\"l\":-9223372036854775780,\"ul\":18446744073709551612,\"f\":NaN,\"f1\":-Infinity,\"f2\":Infinity,\"f3\":-3.40282347E+38,\"f4\":3.40282347E+38,\"d\":NaN,\"d1\":-Infinity,\"d2\":Infinity,\"d3\":-1.7976931348623157E+308,\"d4\":1.7976931348623157E+308,\"de\":-1,\"de1\":0,\"de2\":1,\"de3\":-79228162514264337593543950335,\"de4\":79228162514264337593543950335,\"g\":\"000000ea-0002-0162-0102-030405060708\",\"nb\":null,\"dbn\":null,\"uri\":\"http://kostat@mainsoft/adfasdf/asdfasdf.aspx/asda/ads?a=b&c=d\",\"hash\":{\"mykey\":{\"BB\":10}},\"point\":{\"IsEmpty\":false,\"X\":150,\"Y\":150},\"MyEnum\":[1,10,345],\"MyEnum1\":[1,10,345],\"AA\":5,\"AA1\":[{\"BB\":10},{\"BB\":10}],\"BB\":18446744073709551610,\"YY\":[{\"BB\":10},{\"BB\":10}]}", x, "#A1"); + X n = ser.Deserialize (x); - Assert.AreEqual (s, n); + Assert.AreEqual (s, n, "#A2"); //string json = "\\uFF56"; //string result = ser.Deserialize (json); @@ -416,8 +419,11 @@ namespace Tests.System.Web.Script.Serialization x.Init (); string s = ser.Serialize (x); + Console.WriteLine (s); + Assert.AreEqual ("{\"__type\":\"MonoTests.System.Web.Script.Serialization.JavaScriptSerializerTest+X, System.Web.Extensions_test_net_2_0, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\",\"z\":8,\"ch\":\"v\",\"ch_null\":null,\"str\":\"vwF59g\",\"b\":253,\"sb\":-48,\"sh\":-32740,\"ush\":65511,\"i\":-234235453,\"ui\":4294733061,\"l\":-9223372036854775780,\"ul\":18446744073709551612,\"f\":NaN,\"f1\":-Infinity,\"f2\":Infinity,\"f3\":-3.40282347E+38,\"f4\":3.40282347E+38,\"d\":NaN,\"d1\":-Infinity,\"d2\":Infinity,\"d3\":-1.7976931348623157E+308,\"d4\":1.7976931348623157E+308,\"de\":-1,\"de1\":0,\"de2\":1,\"de3\":-79228162514264337593543950335,\"de4\":79228162514264337593543950335,\"g\":\"000000ea-0002-0162-0102-030405060708\",\"nb\":null,\"dbn\":null,\"uri\":\"http://kostat@mainsoft/adfasdf/asdfasdf.aspx/asda/ads?a=b&c=d\",\"hash\":{\"mykey\":{\"__type\":\"MonoTests.System.Web.Script.Serialization.JavaScriptSerializerTest+Y, System.Web.Extensions_test_net_2_0, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\",\"BB\":10}},\"point\":{\"__type\":\"System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\",\"IsEmpty\":false,\"X\":150,\"Y\":150},\"MyEnum\":[1,10,345],\"MyEnum1\":[1,10,345],\"AA\":5,\"AA1\":[{\"__type\":\"MonoTests.System.Web.Script.Serialization.JavaScriptSerializerTest+Y, System.Web.Extensions_test_net_2_0, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\",\"BB\":10},{\"__type\":\"MonoTests.System.Web.Script.Serialization.JavaScriptSerializerTest+Y, System.Web.Extensions_test_net_2_0, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\",\"BB\":10}],\"BB\":18446744073709551610,\"YY\":[{\"__type\":\"MonoTests.System.Web.Script.Serialization.JavaScriptSerializerTest+Y, System.Web.Extensions_test_net_2_0, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\",\"BB\":10},{\"__type\":\"MonoTests.System.Web.Script.Serialization.JavaScriptSerializerTest+Y, System.Web.Extensions_test_net_2_0, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\",\"BB\":10}]}", s, "#A1"); + X x2 = ser.Deserialize (s); - Assert.AreEqual (x, x2); + Assert.AreEqual (x, x2, "#A2"); } [Test] diff --git a/mcs/class/System.Web.Extensions/Test/System.Web.UI.WebControls/ChangeLog b/mcs/class/System.Web.Extensions/Test/System.Web.UI.WebControls/ChangeLog index 3f43dc5151e..f32a2e2bdfc 100644 --- a/mcs/class/System.Web.Extensions/Test/System.Web.UI.WebControls/ChangeLog +++ b/mcs/class/System.Web.Extensions/Test/System.Web.UI.WebControls/ChangeLog @@ -1,3 +1,7 @@ +2009-06-18 Marek Habersack + + * ListViewTest.cs: hushed the output in ListView_Edit () + 2008-11-20 Marek Habersack * ListViewTest.cs: added tests for several properties. diff --git a/mcs/class/System.Web.Extensions/Test/System.Web.UI.WebControls/ListViewTest.cs b/mcs/class/System.Web.Extensions/Test/System.Web.UI.WebControls/ListViewTest.cs index 3323c32cedd..be9da9bfdb6 100644 --- a/mcs/class/System.Web.Extensions/Test/System.Web.UI.WebControls/ListViewTest.cs +++ b/mcs/class/System.Web.Extensions/Test/System.Web.UI.WebControls/ListViewTest.cs @@ -1197,12 +1197,7 @@ namespace Tests.System.Web.UI.WebControls EventRecorder events = new EventRecorder(); t.UserData = events; - t.Run (); - - Console.WriteLine ("recorded events:"); - events = t.UserData as EventRecorder; - foreach (string e in events) - Console.WriteLine ("\t{0}", e); + t.Run (); } public static void ListView_Edit_OnInit (Page p) diff --git a/mcs/class/System.Web.Routing/ChangeLog b/mcs/class/System.Web.Routing/ChangeLog index 2fa743e4a9e..72b98f8c657 100644 --- a/mcs/class/System.Web.Routing/ChangeLog +++ b/mcs/class/System.Web.Routing/ChangeLog @@ -1,3 +1,11 @@ +2009-06-16 Marek Habersack + + * Makefile (LIB_MCS_FLAGS): define SYSTEMCORE_DEP + + * net_4_0_System.Web.Routing.dll.sources: added. In the 4.0 + profile all classes are compiled into System.Web, + System.Web.Routing becomes an empty assembly. + 2009-05-27 Marek Habersack * Makefile (LIB_MCS_FLAGS): added support for defining the DEBUG diff --git a/mcs/class/System.Web.Routing/Makefile b/mcs/class/System.Web.Routing/Makefile index 5b81c9c7bf7..941668fbe87 100644 --- a/mcs/class/System.Web.Routing/Makefile +++ b/mcs/class/System.Web.Routing/Makefile @@ -11,7 +11,7 @@ LIB_MCS_FLAGS = \ ifeq (2.0, $(FRAMEWORK_VERSION)) # This is a .NET 3.5 only assembly, but built during the 2.0 build -LIB_MCS_FLAGS += -d:NET_3_5 +LIB_MCS_FLAGS += -d:NET_3_5 -d:SYSTEMCORE_DEP endif ifdef DEBUG diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/ChangeLog b/mcs/class/System.Web.Routing/System.Web.Routing/ChangeLog index 6f20c67c13d..c71e62eea25 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/ChangeLog +++ b/mcs/class/System.Web.Routing/System.Web.Routing/ChangeLog @@ -1,3 +1,21 @@ +2009-06-25 Marek Habersack + + * PatternParser.cs: parameter name lookups must be + case-insensitive. + Null and empty (string) parameters are skipped when building query + part of the action path. + +2009-06-16 Marek Habersack + + * RouteValueDictionaryExtensions.cs: do not compile if + SYSTEMCORE_DEP is not defined + + * PatternParser.cs: if SYSTEMCORE_DEP is not defined, do not + compile parts which require RouteValueDictionaryExtensions. + + * Decorated all classes with the TypeForwardedFrom attribute for + the 4.0 profile. + 2009-06-04 Marek Habersack * RouteValueDictionaryExtensions.cs: if both values are strings in diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/HttpMethodConstraint.cs b/mcs/class/System.Web.Routing/System.Web.Routing/HttpMethodConstraint.cs index a3505e42ac9..f12ec329484 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/HttpMethodConstraint.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/HttpMethodConstraint.cs @@ -30,11 +30,15 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class HttpMethodConstraint : IRouteConstraint diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/IRouteConstraint.cs b/mcs/class/System.Web.Routing/System.Web.Routing/IRouteConstraint.cs index 59056a7fc4d..b98548c1c33 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/IRouteConstraint.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/IRouteConstraint.cs @@ -28,13 +28,18 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#else [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] +#endif public interface IRouteConstraint { bool Match (HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection); diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/IRouteHandler.cs b/mcs/class/System.Web.Routing/System.Web.Routing/IRouteHandler.cs index 293d3405472..9a1b14a16ab 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/IRouteHandler.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/IRouteHandler.cs @@ -28,13 +28,18 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#else [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] +#endif public interface IRouteHandler { IHttpHandler GetHttpHandler (RequestContext requestContext); diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/PatternParser.cs b/mcs/class/System.Web.Routing/System.Web.Routing/PatternParser.cs index d3a31866367..713446053d2 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/PatternParser.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/PatternParser.cs @@ -82,7 +82,7 @@ namespace System.Web.Routing PatternToken tmpToken; segments = new PatternSegment [partsCount]; - parameterNames = new Dictionary (); + parameterNames = new Dictionary (StringComparer.OrdinalIgnoreCase); for (int i = 0; i < partsCount; i++) { if (haveSegmentWithCatchAll) @@ -453,6 +453,7 @@ namespace System.Web.Routing string parameterName = token.Name; object tokenValue; +#if SYSTEMCORE_DEP if (userValues.GetValue (parameterName, out tokenValue)) { if (!defaultValues.Has (parameterName, tokenValue)) { canTrim = false; @@ -482,6 +483,7 @@ namespace System.Web.Routing ret.Insert (0, tokenValue.ToString ()); continue; } +#endif } // All the values specified in userValues that aren't part of the original @@ -492,16 +494,26 @@ namespace System.Web.Routing foreach (var de in userValues) { string parameterName = de.Key; +#if SYSTEMCORE_DEP if (parameterNames.ContainsKey (parameterName) || defaultValues.Has (parameterName) || constraints.Has (parameterName)) continue; +#endif + object parameterValue = de.Value; + if (parameterValue == null) + continue; + + var parameterValueAsString = parameterValue as string; + if (parameterValueAsString != null && parameterValueAsString.Length == 0) + continue; + if (first) { ret.Append ('?'); first = false; } else ret.Append ('&'); - object parameterValue = de.Value; + ret.Append (Uri.EscapeDataString (parameterName)); ret.Append ('='); if (parameterValue != null) diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/RequestContext.cs b/mcs/class/System.Web.Routing/System.Web.Routing/RequestContext.cs index 8cb73a40fae..c0c573f8761 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/RequestContext.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/RequestContext.cs @@ -28,11 +28,15 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class RequestContext diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/Route.cs b/mcs/class/System.Web.Routing/System.Web.Routing/Route.cs index 753d6061159..432b316c952 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/Route.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/Route.cs @@ -28,12 +28,16 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Text.RegularExpressions; using System.Web; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class Route : RouteBase diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/RouteBase.cs b/mcs/class/System.Web.Routing/System.Web.Routing/RouteBase.cs index 36258c286ed..077f987529e 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/RouteBase.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/RouteBase.cs @@ -28,11 +28,15 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class RouteBase diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/RouteCollection.cs b/mcs/class/System.Web.Routing/System.Web.Routing/RouteCollection.cs index 920ed9c76cb..67d3543a159 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/RouteCollection.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/RouteCollection.cs @@ -32,12 +32,16 @@ using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; using System.Web.Hosting; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class RouteCollection : Collection diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/RouteData.cs b/mcs/class/System.Web.Routing/System.Web.Routing/RouteData.cs index a3d28aa07c0..f6412ff2aa6 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/RouteData.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/RouteData.cs @@ -28,11 +28,15 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class RouteData diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/RouteDirection.cs b/mcs/class/System.Web.Routing/System.Web.Routing/RouteDirection.cs index c017fd8d4f4..ad3c8bf4439 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/RouteDirection.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/RouteDirection.cs @@ -27,8 +27,13 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +using System.Runtime.CompilerServices; + namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif public enum RouteDirection { IncomingRequest, diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/RouteTable.cs b/mcs/class/System.Web.Routing/System.Web.Routing/RouteTable.cs index 5ab3369ad0c..6d15a46795e 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/RouteTable.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/RouteTable.cs @@ -28,12 +28,15 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; namespace System.Web.Routing { - +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class RouteTable diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/RouteValueDictionary.cs b/mcs/class/System.Web.Routing/System.Web.Routing/RouteValueDictionary.cs index 5d807db90c2..8fe583d7f98 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/RouteValueDictionary.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/RouteValueDictionary.cs @@ -31,6 +31,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Globalization; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; @@ -38,6 +39,9 @@ using PairCollection = System.Collections.Generic.ICollection diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/RouteValueDictionaryExtensions.cs b/mcs/class/System.Web.Routing/System.Web.Routing/RouteValueDictionaryExtensions.cs index 1a1126b910b..f73a6a47a7e 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/RouteValueDictionaryExtensions.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/RouteValueDictionaryExtensions.cs @@ -27,6 +27,7 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +#if SYSTEMCORE_DEP using System; using System.Collections.Generic; using System.Diagnostics; @@ -97,3 +98,4 @@ namespace System.Web.Routing } } } +#endif \ No newline at end of file diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/StopRoutingHandler.cs b/mcs/class/System.Web.Routing/System.Web.Routing/StopRoutingHandler.cs index 5549563dcc9..3edc78dd3f4 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/StopRoutingHandler.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/StopRoutingHandler.cs @@ -28,11 +28,15 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class StopRoutingHandler : IRouteHandler diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/UrlRoutingHandler.cs b/mcs/class/System.Web.Routing/System.Web.Routing/UrlRoutingHandler.cs index 24c491cee4a..4191b75bf85 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/UrlRoutingHandler.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/UrlRoutingHandler.cs @@ -28,11 +28,15 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public abstract class UrlRoutingHandler : IHttpHandler diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/UrlRoutingModule.cs b/mcs/class/System.Web.Routing/System.Web.Routing/UrlRoutingModule.cs index f3c7b55319d..0f73020672c 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/UrlRoutingModule.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/UrlRoutingModule.cs @@ -28,12 +28,16 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Threading; using System.Web; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class UrlRoutingModule : IHttpModule diff --git a/mcs/class/System.Web.Routing/System.Web.Routing/VirtualPathData.cs b/mcs/class/System.Web.Routing/System.Web.Routing/VirtualPathData.cs index 05af30095c2..81371d106b9 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing/VirtualPathData.cs +++ b/mcs/class/System.Web.Routing/System.Web.Routing/VirtualPathData.cs @@ -28,11 +28,15 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; +using System.Runtime.CompilerServices; using System.Security.Permissions; using System.Web; namespace System.Web.Routing { +#if NET_4_0 + [TypeForwardedFrom ("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] +#endif [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class VirtualPathData diff --git a/mcs/class/System.Web.Routing/System.Web.Routing_test.dll.sources b/mcs/class/System.Web.Routing/System.Web.Routing_test.dll.sources index d55d50a3045..5efc7e624c1 100644 --- a/mcs/class/System.Web.Routing/System.Web.Routing_test.dll.sources +++ b/mcs/class/System.Web.Routing/System.Web.Routing_test.dll.sources @@ -1,11 +1,14 @@ System.Web.Routing/AssertExtensions.cs +System.Web.Routing/FakeHttpWorkerRequest.cs System.Web.Routing/HttpMethodConstraintTest.cs +System.Web.Routing/KnownResponseHeader.cs System.Web.Routing/RouteCollectionTest.cs System.Web.Routing/RouteDataTest.cs System.Web.Routing/RouteTest.cs System.Web.Routing/RouteValueDictionaryTest.cs System.Web.Routing/StopRoutingHandlerTest.cs System.Web.Routing/TestStubTypes.cs +System.Web.Routing/UnknownResponseHeader.cs System.Web.Routing/UrlRoutingHandlerTest.cs System.Web.Routing/UrlRoutingModuleTest.cs System.Web.Routing/VirtualPathDataTest.cs diff --git a/mcs/class/System.Web.Routing/Test/System.Web.Routing/ChangeLog b/mcs/class/System.Web.Routing/Test/System.Web.Routing/ChangeLog index 53548f2bb16..a37598da676 100644 --- a/mcs/class/System.Web.Routing/Test/System.Web.Routing/ChangeLog +++ b/mcs/class/System.Web.Routing/Test/System.Web.Routing/ChangeLog @@ -1,3 +1,8 @@ +2009-06-25 Marek Habersack + + * RouteCollectionTest.cs, RouteTest.cs: added new tests for + GetVirtualPath + 2009-06-04 Marek Habersack * RouteCollectionTest.cs: added two more test cases to the bug diff --git a/mcs/class/System.Web.Routing/Test/System.Web.Routing/FakeHttpWorkerRequest.cs b/mcs/class/System.Web.Routing/Test/System.Web.Routing/FakeHttpWorkerRequest.cs new file mode 100644 index 00000000000..fc087ce5860 --- /dev/null +++ b/mcs/class/System.Web.Routing/Test/System.Web.Routing/FakeHttpWorkerRequest.cs @@ -0,0 +1,223 @@ +// +// System.Web.HttpResponseTest.cs - Unit tests for System.Web.HttpResponse +// +// Author: +// Miguel de Icaza +// +// Copyright (C) 2005-2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System.Text; +using System.Web; +using System; +using System.Collections; +using System.Collections.Specialized; +using NUnit.Framework; + +namespace MonoTests.Common +{ + + public class FakeHttpWorkerRequest : HttpWorkerRequest + { + const string appPath = "/"; + string queryString; + public Hashtable KnownResponseHeaders; + public Hashtable UnknownResponseHeaders; + public int return_kind; + + public FakeHttpWorkerRequest () + : this (1) + { + // for Mono + AppDomain.CurrentDomain.SetData (".appVPath", appPath); + } + + public FakeHttpWorkerRequest (int re) + { + KnownResponseHeaders = CollectionsUtil.CreateCaseInsensitiveHashtable (); + UnknownResponseHeaders = CollectionsUtil.CreateCaseInsensitiveHashtable (); + return_kind = re; + queryString = String.Empty; + } + + public override string GetUriPath () + { + return "/fake"; + } + + public override string GetFilePath () + { + return GetUriPath (); + } + + public override string GetQueryString () + { + return queryString; + } + + public void SetQueryString (string queryString) + { + this.queryString = queryString; + } + + public override string GetRawUrl () + { + return "GetRawUrl"; + } + + public override string GetHttpVerbName () + { + return "GET"; + } + + public override string GetHttpVersion () + { + if (return_kind == 1) + return "HTTP/1.0"; + else + return "HTTP/1.1"; + } + + public override string GetRemoteAddress () + { + return "__GetRemoteAddress"; + } + + public override int GetRemotePort () + { + return 1010; + } + + public override string GetLocalAddress () + { + return "GetLocalAddress"; + } + + public override string GetAppPath () + { + return appPath; + } + + public override int GetLocalPort () + { + return 2020; + } + + public override string MapPath (string virtualPath) + { +#if TARGET_DOTNET + return "c:\\fakefile"; +#else + return "/fakefile"; +#endif + } + + public bool status_sent; + public int status_code; + public string status_string; + + public override void SendStatus (int s, string x) + { + status_sent = true; + status_code = s; + status_string = x; + } + + void AddHeader (Hashtable table, string header_name, object header) + { + object o = table[header_name]; + if (o == null) + table.Add (header_name, header); + else { + ArrayList al = o as ArrayList; + if (al == null) { + al = new ArrayList (); + al.Add (o); + table[header_name] = al; + } else + al = o as ArrayList; + + al.Add (header); + } + } + + bool headers_sent; + public override void SendKnownResponseHeader (int x, string j) + { + string header_name = HttpWorkerRequest.GetKnownRequestHeaderName (x); + AddHeader (KnownResponseHeaders, header_name, new KnownResponseHeader (x, j)); + headers_sent = true; + } + + public override void SendUnknownResponseHeader (string a, string b) + { + AddHeader (UnknownResponseHeaders, a, new UnknownResponseHeader (a, b)); + headers_sent = true; + } + + bool data_sent; + public byte[] data; + public int data_len; + public int total = 0; + + public override void SendResponseFromMemory (byte[] arr, int x) + { + data_sent = true; + data = new byte[x]; + for (int i = 0; i < x; i++) + data[i] = arr[i]; + data_len = x; + total += data_len; + } + + public override void SendResponseFromFile (string a, long b, long c) + { + data_sent = true; + } + + public override void SendResponseFromFile (IntPtr a, long b, long c) + { + data_sent = true; + } + + public override void FlushResponse (bool x) + { + } + + public override void EndOfRequest () + { + } + + public override string GetKnownRequestHeader (int index) + { + return null; + } + + public bool OutputProduced + { + get + { + return headers_sent || data_sent; + } + } + } +} diff --git a/mcs/class/System.Web.Routing/Test/System.Web.Routing/KnownResponseHeader.cs b/mcs/class/System.Web.Routing/Test/System.Web.Routing/KnownResponseHeader.cs new file mode 100644 index 00000000000..71806c33f74 --- /dev/null +++ b/mcs/class/System.Web.Routing/Test/System.Web.Routing/KnownResponseHeader.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MonoTests.Common +{ + class KnownResponseHeader + { + private int index; + private string value; + + public KnownResponseHeader (int index, string value) + { + this.index = index; + this.value = value; + } + + public int Index + { + get { return index; } + } + + public string Value + { + get { return value; } + } + } +} diff --git a/mcs/class/System.Web.Routing/Test/System.Web.Routing/RouteCollectionTest.cs b/mcs/class/System.Web.Routing/Test/System.Web.Routing/RouteCollectionTest.cs index 50dfd88696a..7631d86d29b 100644 --- a/mcs/class/System.Web.Routing/Test/System.Web.Routing/RouteCollectionTest.cs +++ b/mcs/class/System.Web.Routing/Test/System.Web.Routing/RouteCollectionTest.cs @@ -32,6 +32,8 @@ using System.Web; using System.Web.Routing; using NUnit.Framework; +using MonoTests.Common; + namespace MonoTests.System.Web.Routing { [TestFixture] @@ -484,7 +486,45 @@ namespace MonoTests.System.Web.Routing ); Assert.IsNull (vp, "#5"); } - + + [Test] + public void GetVirtualPath7 () + { + var c = new RouteCollection (); + + c.Add (new MyRoute ("{table}/{action}.aspx", new MyRouteHandler ()) { + Constraints = new RouteValueDictionary (new { action = "List|Details|Edit|Insert" }), + }); + + var req = new FakeHttpWorkerRequest (); + var ctx = new HttpContext (req); + HttpContext.Current = ctx; + var rd = new RouteData (); + var hc = new HttpContextWrapper (ctx); + + var vp = c.GetVirtualPath (new RequestContext (hc, rd), new RouteValueDictionary { + {"Table", "FooTable"}, + {"Action", "Details"} + }); + + Assert.IsNotNull (vp, "#A1"); + Assert.AreEqual ("/FooTable/Details.aspx", vp.VirtualPath, "#A1-1"); + + vp = c.GetVirtualPath (new RequestContext (hc, rd), new RouteValueDictionary { + {"Table", "FooTable"}, + {"Action", String.Empty} + }); + + Assert.IsNull (vp, "#B1"); + + vp = c.GetVirtualPath (new RequestContext (hc, rd), new RouteValueDictionary { + {"Table", "FooTable"}, + {"Action", null} + }); + + Assert.IsNull (vp, "#C1"); + } + [Test] [Ignore ("looks like RouteExistingFiles ( = false) does not affect... so this test needs more investigation")] public void GetVirtualPathToExistingFile () diff --git a/mcs/class/System.Web.Routing/Test/System.Web.Routing/RouteTest.cs b/mcs/class/System.Web.Routing/Test/System.Web.Routing/RouteTest.cs index 748b560633e..cf88935d21f 100644 --- a/mcs/class/System.Web.Routing/Test/System.Web.Routing/RouteTest.cs +++ b/mcs/class/System.Web.Routing/Test/System.Web.Routing/RouteTest.cs @@ -934,7 +934,32 @@ namespace MonoTests.System.Web.Routing var vp = r.GetVirtualPath (new RequestContext (hc, rd), values); Assert.IsNull (vp); } - + + [Test] + public void GetVirtualPath14 () + { + var r = new MyRoute ("{table}/{action}.aspx", new MyRouteHandler ()); + var hc = new HttpContextStub2 ("~/x/y.aspx", String.Empty); + var rd = r.GetRouteData (hc); + + // override a value incompletely + var values = new RouteValueDictionary (new { + emptyValue = String.Empty, + nullValue = (string)null, + nonEmptyValue = "SomeValue" + }); + + var vp = r.GetVirtualPath (new RequestContext (hc, rd), values); + Assert.IsNotNull (vp, "#A1"); + Assert.AreEqual ("x/y.aspx?nonEmptyValue=SomeValue", vp.VirtualPath, "#A1-1"); + + values["nonEmptyValue"] = "Some Value + encoding &"; + vp = r.GetVirtualPath (new RequestContext (hc, rd), values); + Assert.IsNotNull (vp, "#B1"); + Assert.AreEqual ("x/y.aspx?nonEmptyValue=Some%20Value%20%2B%20encoding%20%26", vp.VirtualPath, "#B1-1"); + + } + // Bug #500739 [Test] public void RouteGetRequiredStringWithDefaults () diff --git a/mcs/class/System.Web.Routing/Test/System.Web.Routing/UnknownResponseHeader.cs b/mcs/class/System.Web.Routing/Test/System.Web.Routing/UnknownResponseHeader.cs new file mode 100644 index 00000000000..20d3ce0a290 --- /dev/null +++ b/mcs/class/System.Web.Routing/Test/System.Web.Routing/UnknownResponseHeader.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MonoTests.Common +{ + class UnknownResponseHeader + { + private string name; + private string value; + + public UnknownResponseHeader (string name, string value) + { + this.name = name; + this.value = value; + } + + public string Name + { + get { return name; } + } + + public string Value + { + get { return value; } + } + } +} diff --git a/mcs/class/System.Web.Routing/net_4_0_System.Web.Routing.dll.sources b/mcs/class/System.Web.Routing/net_4_0_System.Web.Routing.dll.sources new file mode 100644 index 00000000000..c030663c148 --- /dev/null +++ b/mcs/class/System.Web.Routing/net_4_0_System.Web.Routing.dll.sources @@ -0,0 +1,3 @@ +../../build/common/Consts.cs +../../build/common/MonoTODOAttribute.cs +Assembly/AssemblyInfo.cs diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Configuration/ChangeLog b/mcs/class/System.Web.Services/Test/System.Web.Services.Configuration/ChangeLog index f26805d9f23..9830f2b9888 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Configuration/ChangeLog +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Configuration/ChangeLog @@ -1,3 +1,7 @@ +2009-06-26 Robert Jordan + + * *.cs: Upgrade to new NUnit style. + 2007-10-03 Atsushi Enomoto * TypeElement.cs : disable a test that causes NRE on .NET. diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Configuration/XmlFormatExtensionAttributeTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Configuration/XmlFormatExtensionAttributeTest.cs index 19443838507..9c6bb27cd34 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Configuration/XmlFormatExtensionAttributeTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Configuration/XmlFormatExtensionAttributeTest.cs @@ -17,7 +17,7 @@ using System.Web.Services.Description; namespace MonoTests.System.Web.Services.Configuration { [TestFixture] - public class XmlFormatExtensionAttributeTest : Assertion { + public class XmlFormatExtensionAttributeTest { [Test] @@ -26,38 +26,38 @@ namespace MonoTests.System.Web.Services.Configuration { XmlFormatExtensionAttribute attribute; /* attribute = new XmlFormatExtensionAttribute (); - AssertEquals (String.Empty, attribute.ElementName); - AssertEquals (null, attribute.ExtensionPoints); - AssertEquals (String.Empty, attribute.Namespace); + Assert.AreEqual (String.Empty, attribute.ElementName); + Assert.AreEqual (null, attribute.ExtensionPoints); + Assert.AreEqual (String.Empty, attribute.Namespace); string elementName = "binding"; string ns = "http://schemas.xmlsoap.org/wsdl/http/"; Type[] types = new Type[4] {typeof (Binding), typeof (Binding), typeof (Binding), typeof (Binding)}; attribute = new XmlFormatExtensionAttribute (elementName, ns, types[0]); - AssertEquals (elementName, attribute.ElementName); - AssertEquals (new Type[1] {types[0]}, attribute.ExtensionPoints); - AssertEquals (ns, attribute.Namespace); + Assert.AreEqual (elementName, attribute.ElementName); + Assert.AreEqual (new Type[1] {types[0]}, attribute.ExtensionPoints); + Assert.AreEqual (ns, attribute.Namespace); attribute = new XmlFormatExtensionAttribute (elementName, ns, types[0], types[1]); - AssertEquals (elementName, attribute.ElementName); - AssertEquals (new Type[2] {types[0], types[1]}, attribute.ExtensionPoints); - AssertEquals (ns, attribute.Namespace); + Assert.AreEqual (elementName, attribute.ElementName); + Assert.AreEqual (types[1]}, attribute.ExtensionPoints, new Type[2] {types[0]); + Assert.AreEqual (ns, attribute.Namespace); attribute = new XmlFormatExtensionAttribute (elementName, ns, types[0], types[1], types[2]); - AssertEquals (elementName, attribute.ElementName); - AssertEquals (new Type[3] {types[0], types[1], types[2]}, attribute.ExtensionPoints); - AssertEquals (ns, attribute.Namespace); + Assert.AreEqual (elementName, attribute.ElementName); + Assert.AreEqual (types[1], types[2]}, attribute.ExtensionPoints, new Type[3] {types[0]); + Assert.AreEqual (ns, attribute.Namespace); attribute = new XmlFormatExtensionAttribute (elementName, ns, types[0], types[1], types[2], types[3]); - AssertEquals (elementName, attribute.ElementName); - AssertEquals (new Type[4] {types[0], types[1], types[2], types[3]}, attribute.ExtensionPoints); - AssertEquals (ns, attribute.Namespace); + Assert.AreEqual (elementName, attribute.ElementName); + Assert.AreEqual (types[1], types[2], types[3]}, attribute.ExtensionPoints, new Type[4] {types[0]); + Assert.AreEqual (ns, attribute.Namespace); attribute = new XmlFormatExtensionAttribute (elementName, ns, types); - AssertEquals (elementName, attribute.ElementName); - AssertEquals (types, attribute.ExtensionPoints); - AssertEquals (ns, attribute.Namespace);*/ + Assert.AreEqual (elementName, attribute.ElementName); + Assert.AreEqual (types, attribute.ExtensionPoints); + Assert.AreEqual (ns, attribute.Namespace);*/ } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/BindingCollectionTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/BindingCollectionTest.cs index dc289825292..82dc304abb3 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/BindingCollectionTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/BindingCollectionTest.cs @@ -30,8 +30,8 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertNull (bc["hello"]); - Assertion.AssertEquals (0, bc.Count); + Assert.IsNull (bc["hello"]); + Assert.AreEqual (0, bc.Count); } [Test] @@ -44,8 +44,8 @@ namespace MonoTests.System.Web.Services.Description bc.Add (b); - Assertion.AssertEquals (1, bc.Count); - Assertion.AssertEquals (b, bc[bindingName]); + Assert.AreEqual (1, bc.Count); + Assert.AreEqual (b, bc[bindingName]); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ChangeLog b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ChangeLog index 2e9cf7e5a82..5bc256ee049 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ChangeLog +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ChangeLog @@ -1,3 +1,7 @@ +2009-06-26 Robert Jordan + + * *.cs: Upgrade to new NUnit style. + 2008-12-09 Atsushi Enomoto * 443095.wsdl, WebServicesInteroperabilityTest.cs : added diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/DocumentableItemTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/DocumentableItemTest.cs index dd1b8fb484b..2f6aa02adc4 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/DocumentableItemTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/DocumentableItemTest.cs @@ -29,14 +29,14 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertEquals(String.Empty, item.Documentation); + Assert.AreEqual (String.Empty, item.Documentation); } [Test] public void TestNullDocumentationString() { item.Documentation = null; - Assertion.AssertEquals(String.Empty, item.Documentation); + Assert.AreEqual (String.Empty, item.Documentation); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationCollectionTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationCollectionTest.cs index 233f5693d48..9c5bf899eb0 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationCollectionTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationCollectionTest.cs @@ -30,7 +30,7 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertEquals(0, operations.Count); + Assert.AreEqual (0, operations.Count); } [Test] @@ -44,7 +44,7 @@ namespace MonoTests.System.Web.Services.Description public void TestAddValidOperation() { operations.Add(new Operation()); - Assertion.AssertEquals(1, operations.Count); + Assert.AreEqual (1, operations.Count); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationMessageCollectionTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationMessageCollectionTest.cs index f73513d8d29..621a36338bc 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationMessageCollectionTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationMessageCollectionTest.cs @@ -31,10 +31,10 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertEquals(OperationFlow.None, operations.Flow); - Assertion.AssertNull(operations.Input); - Assertion.AssertNull(operations.Output); - Assertion.AssertEquals(0, operations.Count); + Assert.AreEqual (OperationFlow.None, operations.Flow); + Assert.IsNull (operations.Input); + Assert.IsNull (operations.Output); + Assert.AreEqual (0, operations.Count); } [Test] @@ -42,10 +42,10 @@ namespace MonoTests.System.Web.Services.Description { operations.Add(new OperationInput()); - Assertion.AssertEquals(OperationFlow.OneWay, operations.Flow); - Assertion.AssertNotNull(operations.Input); - Assertion.AssertNull(operations.Output); - Assertion.AssertEquals(1, operations.Count); + Assert.AreEqual (OperationFlow.OneWay, operations.Flow); + Assert.IsNotNull (operations.Input); + Assert.IsNull (operations.Output); + Assert.AreEqual (1, operations.Count); } [Test] @@ -53,10 +53,10 @@ namespace MonoTests.System.Web.Services.Description { operations.Add(new OperationOutput()); - Assertion.AssertEquals(OperationFlow.Notification, operations.Flow); - Assertion.AssertNull(operations.Input); - Assertion.AssertNotNull(operations.Output); - Assertion.AssertEquals(1, operations.Count); + Assert.AreEqual (OperationFlow.Notification, operations.Flow); + Assert.IsNull (operations.Input); + Assert.IsNotNull (operations.Output); + Assert.AreEqual (1, operations.Count); } [Test] @@ -65,10 +65,10 @@ namespace MonoTests.System.Web.Services.Description operations.Add(new OperationInput()); operations.Add(new OperationOutput()); - Assertion.AssertEquals(OperationFlow.RequestResponse, operations.Flow); - Assertion.AssertNotNull(operations.Input); - Assertion.AssertNotNull(operations.Output); - Assertion.AssertEquals(2, operations.Count); + Assert.AreEqual (OperationFlow.RequestResponse, operations.Flow); + Assert.IsNotNull (operations.Input); + Assert.IsNotNull (operations.Output); + Assert.AreEqual (2, operations.Count); } [Test] @@ -77,10 +77,10 @@ namespace MonoTests.System.Web.Services.Description operations.Add(new OperationOutput()); operations.Add(new OperationInput()); - Assertion.AssertEquals(OperationFlow.SolicitResponse, operations.Flow); - Assertion.AssertNotNull(operations.Input); - Assertion.AssertNotNull(operations.Output); - Assertion.AssertEquals(2, operations.Count); + Assert.AreEqual (OperationFlow.SolicitResponse, operations.Flow); + Assert.IsNotNull (operations.Input); + Assert.IsNotNull (operations.Output); + Assert.AreEqual (2, operations.Count); } [Test] diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationMessageTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationMessageTest.cs index 0f2ddb176a4..c623d65f29c 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationMessageTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/OperationMessageTest.cs @@ -30,10 +30,10 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertEquals(String.Empty, operation.Documentation); - Assertion.AssertNull(operation.Name); - Assertion.AssertEquals(XmlQualifiedName.Empty, operation.Message); - Assertion.AssertNull(operation.Operation); + Assert.AreEqual (String.Empty, operation.Documentation); + Assert.IsNull (operation.Name); + Assert.AreEqual (XmlQualifiedName.Empty, operation.Message); + Assert.IsNull (operation.Operation); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/PortTypeCollectionTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/PortTypeCollectionTest.cs index cc853f4a635..82da537bee9 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/PortTypeCollectionTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/PortTypeCollectionTest.cs @@ -30,8 +30,8 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertNull (ptc["hello"]); - Assertion.AssertEquals (0, ptc.Count); + Assert.IsNull (ptc["hello"]); + Assert.AreEqual (0, ptc.Count); } [Test] @@ -44,8 +44,8 @@ namespace MonoTests.System.Web.Services.Description ptc.Add (p); - Assertion.AssertEquals (1, ptc.Count); - Assertion.AssertEquals (p, ptc[portTypeName]); + Assert.AreEqual (1, ptc.Count); + Assert.AreEqual (p, ptc[portTypeName]); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/PortTypeTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/PortTypeTest.cs index 1f5bb347161..be8a1ffde43 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/PortTypeTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/PortTypeTest.cs @@ -28,17 +28,17 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertNull(portType.Name); - Assertion.AssertNotNull(portType.Operations); - Assertion.AssertEquals(0, portType.Operations.Count); - Assertion.AssertNull(portType.ServiceDescription); + Assert.IsNull (portType.Name); + Assert.IsNotNull (portType.Operations); + Assert.AreEqual (0, portType.Operations.Count); + Assert.IsNull (portType.ServiceDescription); } [Test] public void TestEmptyName() { portType.Name = String.Empty; - Assertion.AssertEquals(String.Empty, portType.Name); + Assert.AreEqual (String.Empty, portType.Name); } [Test] @@ -46,7 +46,7 @@ namespace MonoTests.System.Web.Services.Description { const string LongName = "abcdefghijklmnopqrstuvwxyz"; portType.Name = LongName; - Assertion.AssertEquals(LongName, portType.Name); + Assert.AreEqual (LongName, portType.Name); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ServiceCollectionTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ServiceCollectionTest.cs index 8834d4bbd28..8268c4acd0e 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ServiceCollectionTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ServiceCollectionTest.cs @@ -30,8 +30,8 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertNull (sc["hello"]); - Assertion.AssertEquals (0, sc.Count); + Assert.IsNull (sc["hello"]); + Assert.AreEqual (0, sc.Count); } [Test] @@ -44,8 +44,8 @@ namespace MonoTests.System.Web.Services.Description sc.Add (s); - Assertion.AssertEquals (1, sc.Count); - Assertion.AssertEquals (s, sc[serviceName]); + Assert.AreEqual (1, sc.Count); + Assert.AreEqual (s, sc[serviceName]); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ServiceDescriptionCollectionTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ServiceDescriptionCollectionTest.cs index e652a6cd2f0..5c8b5308685 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ServiceDescriptionCollectionTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/ServiceDescriptionCollectionTest.cs @@ -28,8 +28,8 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertNull (sdc["hello"]); - Assertion.AssertEquals (0, sdc.Count); + Assert.IsNull (sdc["hello"]); + Assert.AreEqual (0, sdc.Count); } [Test] @@ -40,8 +40,8 @@ namespace MonoTests.System.Web.Services.Description ServiceDescription sd = new ServiceDescription (); sdc.Add (sd); - Assertion.AssertEquals (1, sdc.Count); - Assertion.AssertNull (sdc[serviceDescriptionNamespace]); + Assert.AreEqual (1, sdc.Count); + Assert.IsNull (sdc[serviceDescriptionNamespace]); } [Test] @@ -54,8 +54,8 @@ namespace MonoTests.System.Web.Services.Description sdc.Add (sd); - Assertion.AssertEquals (1, sdc.Count); - Assertion.AssertEquals (sd, sdc[serviceDescriptionNamespace]); + Assert.AreEqual (1, sdc.Count); + Assert.AreEqual (sd, sdc[serviceDescriptionNamespace]); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/SoapBodyBindingTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/SoapBodyBindingTest.cs index 13cb935e020..4a100e80b3f 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/SoapBodyBindingTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/SoapBodyBindingTest.cs @@ -28,28 +28,28 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertEquals(String.Empty, sbb.Encoding); - Assertion.AssertNull(sbb.Parts); - Assertion.AssertNull(sbb.PartsString); - Assertion.AssertEquals(String.Empty, sbb.Namespace); - Assertion.AssertEquals(SoapBindingUse.Default, sbb.Use); + Assert.AreEqual (String.Empty, sbb.Encoding); + Assert.IsNull (sbb.Parts); + Assert.IsNull (sbb.PartsString); + Assert.AreEqual (String.Empty, sbb.Namespace); + Assert.AreEqual (SoapBindingUse.Default, sbb.Use); } [Test] public void TestAssignNullPartsString() { sbb.PartsString = null; - Assertion.AssertNull(sbb.Parts); - Assertion.AssertEquals(null, sbb.PartsString); + Assert.IsNull (sbb.Parts); + Assert.AreEqual (null, sbb.PartsString); } [Test] public void TestAssignEmptyPartsString() { sbb.PartsString = String.Empty; - Assertion.AssertNotNull(sbb.Parts); - Assertion.AssertEquals(1, sbb.Parts.Length); - Assertion.AssertEquals(String.Empty, sbb.PartsString); + Assert.IsNotNull (sbb.Parts); + Assert.AreEqual (1, sbb.Parts.Length); + Assert.AreEqual (String.Empty, sbb.PartsString); } [Test] @@ -57,17 +57,17 @@ namespace MonoTests.System.Web.Services.Description { const string Spaces = " "; sbb.PartsString = Spaces; - Assertion.AssertNotNull(sbb.Parts); - Assertion.AssertEquals(2, sbb.Parts.Length); - Assertion.AssertEquals(Spaces, sbb.PartsString); + Assert.IsNotNull (sbb.Parts); + Assert.AreEqual (2, sbb.Parts.Length); + Assert.AreEqual (Spaces, sbb.PartsString); } [Test] public void TestAssignNullParts() { sbb.Parts = null; - Assertion.AssertNull(sbb.Parts); - Assertion.AssertNull(sbb.PartsString); + Assert.IsNull (sbb.Parts); + Assert.IsNull (sbb.PartsString); } [Test] @@ -75,8 +75,8 @@ namespace MonoTests.System.Web.Services.Description { string[] vals = {"a", "b"}; sbb.Parts = vals; - Assertion.AssertNotNull(sbb.Parts); - Assertion.AssertEquals("a b", sbb.PartsString); + Assert.IsNotNull (sbb.Parts); + Assert.AreEqual ("a b", sbb.PartsString); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/SoapOperationBindingTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/SoapOperationBindingTest.cs index 0a159f67d4e..ee63341bd9b 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/SoapOperationBindingTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/SoapOperationBindingTest.cs @@ -28,11 +28,11 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertEquals(String.Empty, sob.SoapAction); - Assertion.AssertEquals(SoapBindingStyle.Default, sob.Style); - Assertion.AssertEquals(false, sob.Required); - Assertion.AssertNull(sob.Parent); - Assertion.AssertEquals(false, sob.Handled); + Assert.AreEqual (String.Empty, sob.SoapAction); + Assert.AreEqual (SoapBindingStyle.Default, sob.Style); + Assert.AreEqual (false, sob.Required); + Assert.IsNull (sob.Parent); + Assert.AreEqual (false, sob.Handled); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/TypesTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/TypesTest.cs index d348d61cbde..f3bf9c15456 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Description/TypesTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Description/TypesTest.cs @@ -29,11 +29,11 @@ namespace MonoTests.System.Web.Services.Description [Test] public void TestDefaultProperties() { - Assertion.AssertEquals(String.Empty, types.Documentation); - Assertion.AssertNotNull(types.Schemas); - Assertion.AssertEquals(0, types.Schemas.Count); - Assertion.AssertNotNull(types.Extensions); - Assertion.AssertEquals(0, types.Extensions.Count); + Assert.AreEqual (String.Empty, types.Documentation); + Assert.IsNotNull (types.Schemas); + Assert.AreEqual (0, types.Schemas.Count); + Assert.IsNotNull (types.Extensions); + Assert.AreEqual (0, types.Extensions.Count); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Discovery/ChangeLog b/mcs/class/System.Web.Services/Test/System.Web.Services.Discovery/ChangeLog index 305a1b0fdd8..9878569ed64 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Discovery/ChangeLog +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Discovery/ChangeLog @@ -1,3 +1,7 @@ +2009-06-26 Robert Jordan + + * *.cs: Upgrade to new NUnit style. + 2003-05-13 Martin Willemoes Hansen * ContractReferenceTest.cs: Inherits from Assertion and Assertion. prefixes removed. diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Discovery/ContractReferenceTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Discovery/ContractReferenceTest.cs index 4198b352489..8f0f31ee395 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services.Discovery/ContractReferenceTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services.Discovery/ContractReferenceTest.cs @@ -16,7 +16,7 @@ using System.Web.Services.Discovery; namespace MonoTests.System.Web.Services.Discovery { [TestFixture] - public class ContractReferenceTest : Assertion { + public class ContractReferenceTest { [Test] public void TestConstructors () @@ -27,7 +27,7 @@ namespace MonoTests.System.Web.Services.Discovery { [Test] public void TestConstants () { - AssertEquals ("http://schemas.xmlsoap.org/disco/scl/", ContractReference.Namespace); + Assert.AreEqual ("http://schemas.xmlsoap.org/disco/scl/", ContractReference.Namespace); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services/ChangeLog b/mcs/class/System.Web.Services/Test/System.Web.Services/ChangeLog index c158b930d7d..11f237fbf35 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services/ChangeLog +++ b/mcs/class/System.Web.Services/Test/System.Web.Services/ChangeLog @@ -1,3 +1,7 @@ +2009-06-26 Robert Jordan + + * *.cs: Upgrade to new NUnit style. + 2007-10-05 Atsushi Enomoto * WebServiceTest.cs : new test (for bug #331183). diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services/WebMethodAttributeTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services/WebMethodAttributeTest.cs index 0023bbf64f1..a9d94e83766 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services/WebMethodAttributeTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services/WebMethodAttributeTest.cs @@ -17,7 +17,7 @@ using System.EnterpriseServices; namespace MonoTests.System.Web.Services { [TestFixture] - public class WebMethodAttributeTest : Assertion { + public class WebMethodAttributeTest { [Test] public void TestConstructors () @@ -25,12 +25,12 @@ namespace MonoTests.System.Web.Services { WebMethodAttribute attribute; attribute = new WebMethodAttribute (); - AssertEquals (true, attribute.BufferResponse); - AssertEquals (0, attribute.CacheDuration); - AssertEquals (String.Empty, attribute.Description); - AssertEquals (false, attribute.EnableSession); - AssertEquals (String.Empty, attribute.MessageName); - AssertEquals (TransactionOption.Disabled, attribute.TransactionOption); + Assert.AreEqual (true, attribute.BufferResponse); + Assert.AreEqual (0, attribute.CacheDuration); + Assert.AreEqual (String.Empty, attribute.Description); + Assert.AreEqual (false, attribute.EnableSession); + Assert.AreEqual (String.Empty, attribute.MessageName); + Assert.AreEqual (TransactionOption.Disabled, attribute.TransactionOption); } } } diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services/WebServiceAttributeTest.cs b/mcs/class/System.Web.Services/Test/System.Web.Services/WebServiceAttributeTest.cs index 1eb952b678e..884bd07986e 100644 --- a/mcs/class/System.Web.Services/Test/System.Web.Services/WebServiceAttributeTest.cs +++ b/mcs/class/System.Web.Services/Test/System.Web.Services/WebServiceAttributeTest.cs @@ -16,7 +16,7 @@ using System.Web.Services; namespace MonoTests.System.Web.Services { [TestFixture] - public class WebServiceAttributeTest : Assertion { + public class WebServiceAttributeTest { [Test] public void TestConstructors () @@ -24,9 +24,9 @@ namespace MonoTests.System.Web.Services { WebServiceAttribute attribute; attribute = new WebServiceAttribute (); - AssertEquals (String.Empty, attribute.Description); - AssertEquals (String.Empty, attribute.Name); - AssertEquals ("http://tempuri.org/", attribute.Namespace); + Assert.AreEqual (String.Empty, attribute.Description); + Assert.AreEqual (String.Empty, attribute.Name); + Assert.AreEqual ("http://tempuri.org/", attribute.Namespace); } } } diff --git a/mcs/class/System.Web/Assembly/AssemblyInfo.cs b/mcs/class/System.Web/Assembly/AssemblyInfo.cs index 5c78abf3070..b1e6f1ecf66 100644 --- a/mcs/class/System.Web/Assembly/AssemblyInfo.cs +++ b/mcs/class/System.Web/Assembly/AssemblyInfo.cs @@ -66,10 +66,9 @@ using System.Web.UI; #if NET_2_0 [assembly: InternalsVisibleTo ("System.Web.Extensions, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")] -[assembly: InternalsVisibleTo ("System.Web_test_net_2_0, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")] -[assembly: InternalsVisibleTo ("System.Web.Extensions_test_net_2_0, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")] [assembly: InternalsVisibleTo ("System.Web.DynamicData, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")] -[assembly: InternalsVisibleTo ("System.Web.DynamicData_test_net_2_0, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")] + +[assembly: InternalsVisibleTo ("SystemWebTestShim, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")] #endif #endif diff --git a/mcs/class/System.Web/Assembly/ChangeLog b/mcs/class/System.Web/Assembly/ChangeLog index ef013e48954..3ae7da1ead0 100644 --- a/mcs/class/System.Web/Assembly/ChangeLog +++ b/mcs/class/System.Web/Assembly/ChangeLog @@ -1,3 +1,12 @@ +2009-07-07 Raja R Harinath + + * AssemblyInfo.cs: Don't make internals visible to System.Web_test. + +2009-07-06 Raja R Harinath + + * AssemblyInfo.cs: Don't make internals visible to + System.Web.Extensions_test and System.Web.DynamicData_test. + 2009-04-29 Marek Habersack * AssemblyInfo.cs: added InternalsVisibleTo for diff --git a/mcs/class/System.Web/ChangeLog b/mcs/class/System.Web/ChangeLog index c3a55197c8d..bec76f5e0a5 100644 --- a/mcs/class/System.Web/ChangeLog +++ b/mcs/class/System.Web/ChangeLog @@ -1,3 +1,36 @@ +2009-07-08 Marek Habersack + + * Makefile (TEST_RESOURCE_FILES): added + Test/mainsoft/NunitWebResources/PreprocessorDirectivesInMarkup.aspx + +2009-07-06 Raja R Harinath + + * Makefile (TEST_MCS_FLAGS): Reference SystemWebTestShim. + +2009-06-30 Marek Habersack + + * Makefile (TEST_RESOURCE_FILES): added + Test/mainsoft/NunitWebResources/ServerControlInClientSideComment.aspx + +2009-06-18 Marek Habersack + + * browscap.ini.diff: updated to match the latest upstream + version. + +2009-06-16 Marek Habersack + + * Makefile: warn if the 4.0 assembly is compiled without + System.Core + + * net_4_0_System.Web.dll.sources: added. System.Web.Routing and + System.Web.Abstractions are part of System.Web.dll in the 4.0 + profile. + Added System.Web.Routing/PageRouteHandler.cs, + System.Web.UI.WebControls/IDataBoundControl.cs, + System.Web.UI.WebControls/IDataBoundItemControl.cs, + System.Web.UI.WebControls/IDataBoundListControl.cs,, + System.Web.UI.WebControls/IFieldControl.cs + 2009-06-04 Marek Habersack * Makefile (TEST_RESOURCE_FILES): added diff --git a/mcs/class/System.Web/Makefile b/mcs/class/System.Web/Makefile index d3f18d7b18f..73f8477ef22 100644 --- a/mcs/class/System.Web/Makefile +++ b/mcs/class/System.Web/Makefile @@ -169,7 +169,9 @@ TEST_RESOURCE_FILES = \ Test/mainsoft/NunitWebResources/NoBindForMethodsWithBindInName.aspx \ Test/mainsoft/NunitWebResources/LinkInHeadWithEmbeddedExpression.aspx \ Test/mainsoft/NunitWebResources/ExpressionInListControl.aspx \ - Test/mainsoft/NunitWebResources/ServerSideControlsInScriptBlock.aspx + Test/mainsoft/NunitWebResources/ServerSideControlsInScriptBlock.aspx \ + Test/mainsoft/NunitWebResources/ServerControlInClientSideComment.aspx \ + Test/mainsoft/NunitWebResources/PreprocessorDirectivesInMarkup.aspx RESX_DIST = resources/TranslationResources.resx ifneq (1, $(FRAMEWORK_VERSION_MAJOR)) @@ -198,8 +200,8 @@ LIB_MCS_FLAGS = \ ifneq ($(CYCLIC_DEPS:%=../lib/$(PROFILE)/%), $(CYCLIC_DEP_FILES)) NO_SIGN_ASSEMBLY = yes NO_INSTALL = yes -all-local: System.Web/UplevelHelper.cs resources/TranslationResources.resources echo-warning -.PHONY: echo-warning +all-local: System.Web/UplevelHelper.cs resources/TranslationResources.resources echo-warning echo-warning-systemcore +.PHONY: echo-warning echo-warning-systemcore ifeq (, $(strip $(CYCLIC_DEP_FILES))) echo-warning: @@ -207,7 +209,14 @@ echo-warning: endif endif -TEST_MCS_FLAGS = $(LIB_MCS_FLAGS) -doc:$(test_lib:.dll=.xml) -nowarn:219,169,1591 $(NUNIT_RESOURCE_FILES:%=/resource:%) +ifeq (4, $(FRAMEWORK_VERSION_MAJOR)) +ifndef SYSTEMCORE_DEP_FILE +echo-warning-systemcore: + @echo "** Warning: System.Web.dll built without parts that depend on $(SYSTEMCORE_DEP)" +endif +endif + +TEST_MCS_FLAGS = $(LIB_MCS_FLAGS) -doc:$(test_lib:.dll=.xml) -nowarn:219,169,1591 $(NUNIT_RESOURCE_FILES:%=/resource:%) -r:SystemWebTestShim.dll ifeq (net_2_0, $(PROFILE)) TEST_MCS_FLAGS += -r:System.Web.Extensions.dll endif diff --git a/mcs/class/System.Web/System.Web.Compilation/AppCodeCompiler.cs b/mcs/class/System.Web/System.Web.Compilation/AppCodeCompiler.cs index 71ac1d1452e..2e6b3155b87 100644 --- a/mcs/class/System.Web/System.Web.Compilation/AppCodeCompiler.cs +++ b/mcs/class/System.Web/System.Web.Compilation/AppCodeCompiler.cs @@ -668,9 +668,17 @@ namespace System.Web.Compilation } else return; - if (HttpApplication.LoadTypeFromBin (providerTypeName) == null) - throw new HttpException (String.Format ("Profile provider type not found: {0}", - providerTypeName)); + Exception noTypeException = null; + Type ptype = null; + + try { + ptype = HttpApplication.LoadTypeFromBin (providerTypeName); + } catch (Exception ex) { + noTypeException = ex; + } + + if (ptype == null) + throw new HttpException (String.Format ("Profile provider type not found: {0}", providerTypeName), noTypeException); } } diff --git a/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs b/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs index faab002630b..5a12d32dbf1 100644 --- a/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs +++ b/mcs/class/System.Web/System.Web.Compilation/AspGenerator.cs @@ -42,6 +42,10 @@ using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.Util; +#if NET_2_0 +using System.Collections.Generic; +#endif + namespace System.Web.Compilation { class BuilderLocation @@ -458,6 +462,9 @@ namespace System.Web.Compilation void CreateRootBuilder (Stream inputStream, string filename) { + if (rootBuilder != null) + return; + Type rootBuilderType = GetRootBuilderType (inputStream, filename); rootBuilder = Activator.CreateInstance (rootBuilderType) as RootBuilder; if (rootBuilder == null) @@ -949,6 +956,77 @@ namespace System.Web.Compilation { if (ignore_text) return; + + // Another gross hack - get rid of comments in the parsed text + int textLen = text.Length; + int textMaxIndex = textLen - 1; + int commentStart = text.IndexOf ("", commentStart); + + if (commentEnd == -1) { + if (commentStart == 0) + return; + commentEnd = textMaxIndex; + } + + if (commentRanges == null) { +#if NET_2_0 + commentRanges = new List (); +#else + commentRanges = new ArrayList (); +#endif + } + + if (commentStart > commentLastStart) { + commentRanges.Add (commentLastStart); + commentRanges.Add (commentStart); + } + + if (commentEnd == textMaxIndex) + break; + + commentLastStart = commentEnd + 3; + if (commentLastStart > textMaxIndex) + break; + + commentStart = text.IndexOf (" +
+ + + + + + diff --git a/mcs/class/System.Web/browscap.ini.diff b/mcs/class/System.Web/browscap.ini.diff index 7d7f504cff6..57e0da655f6 100644 --- a/mcs/class/System.Web/browscap.ini.diff +++ b/mcs/class/System.Web/browscap.ini.diff @@ -1,17 +1,17 @@ -Index: browscap.ini -=================================================================== ---- browscap.ini (revision 75460) -+++ browscap.ini (working copy) -@@ -43,6 +43,8 @@ +diff --git a/data/browscap.ini b/data/browscap.ini +index 120eb6c..1267e1d 100644 +--- a/data/browscap.ini ++++ b/data/browscap.ini +@@ -36,6 +36,8 @@ CssVersion=0 + supportsCSS=false + AOL=false aolVersion=0 - netCLR=false - ClrVersion=0 +ECMAScriptVersion=0.0 +W3CDOMVersion=0.0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ask -@@ -4918,7 +4920,7 @@ +@@ -4808,7 +4810,7 @@ Parent=Version Checkers Parent=Version Checkers Browser=Gary Keith's Version Checker @@ -20,8 +20,8 @@ Index: browscap.ini Parent=Version Checkers Browser=TKC AutoDownloader -@@ -9721,6 +9723,8 @@ - CSS=2 +@@ -8844,6 +8846,8 @@ JavaApplets=true + JavaScript=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.3 @@ -29,8 +29,8 @@ Index: browscap.ini [Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/100*] Parent=Safari -@@ -12205,6 +12209,8 @@ - CSS=2 +@@ -10575,6 +10579,8 @@ JavaApplets=true + JavaScript=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.3 @@ -38,8 +38,8 @@ Index: browscap.ini [Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.5*] Parent=Opera 8.5 -@@ -12406,6 +12412,8 @@ - CSS=2 +@@ -10775,6 +10781,8 @@ JavaApplets=true + JavaScript=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.5 @@ -47,8 +47,8 @@ Index: browscap.ini [Mozilla/* (compatible; MSIE*; Linux*) Opera 9.0*] Parent=Opera 9.0 -@@ -14640,6 +14648,8 @@ - CSS=2 +@@ -14416,6 +14424,8 @@ JavaApplets=true + JavaScript=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.3 @@ -56,8 +56,8 @@ Index: browscap.ini [Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*] Parent=Firefox -@@ -14782,6 +14792,8 @@ - CSS=2 +@@ -14557,6 +14567,8 @@ JavaApplets=true + JavaScript=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.3 @@ -65,8 +65,8 @@ Index: browscap.ini [Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*] Parent=Firefox 1.0 -@@ -14888,6 +14900,8 @@ - CSS=2 +@@ -14662,6 +14674,8 @@ JavaApplets=true + JavaScript=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.3 @@ -74,8 +74,8 @@ Index: browscap.ini [Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*] Parent=Firefox 1.4 -@@ -14982,6 +14996,8 @@ - CSS=2 +@@ -14755,6 +14769,8 @@ JavaApplets=true + JavaScript=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.5 @@ -83,8 +83,8 @@ Index: browscap.ini [Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*] Parent=Firefox 1.5 -@@ -15088,6 +15104,8 @@ - CSS=2 +@@ -14855,6 +14871,8 @@ JavaApplets=true + JavaScript=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.5 @@ -92,17 +92,17 @@ Index: browscap.ini [Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*] Parent=Firefox 2.0 -@@ -15210,6 +15228,8 @@ - CSS=2 - CssVersion=2 +@@ -14951,6 +14969,8 @@ JavaApplets=true + JavaScript=true + CssVersion=3 supportsCSS=true +ecmascriptversion=1.5 +w3cdomversion=1.0 - [Mozilla/5.0 (Linux; *; PPC*; *; rv:1.9*) Gecko/* Firefox/3.0*] + [Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*] Parent=Firefox 3.0 -@@ -15728,6 +15748,8 @@ - CSS=2 +@@ -15621,6 +15641,8 @@ JavaApplets=true + JavaScript=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.5 @@ -110,8 +110,8 @@ Index: browscap.ini [Mozilla/5.0 (*rv:1.7*) Gecko/*] Parent=Mozilla 1.7 -@@ -15815,6 +15837,8 @@ - CSS=2 +@@ -15707,6 +15729,8 @@ JavaApplets=true + JavaScript=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.5 @@ -119,7 +119,7 @@ Index: browscap.ini [Mozilla/5.0 (*rv:1.8*) Gecko/*] Parent=Mozilla 1.8 -@@ -16013,6 +16037,8 @@ +@@ -15932,6 +15956,8 @@ CssVersion=2 supportsCSS=true AOL=true aolVersion=9.0 @@ -128,7 +128,7 @@ Index: browscap.ini [Mozilla/?.* (?compatible; *MSIE 5.5; *AOL 9.0*)*] Parent=AOL 9.0/IE 5.5 -@@ -16245,6 +16271,8 @@ +@@ -16108,6 +16134,8 @@ CssVersion=2 supportsCSS=true AOL=true aolVersion=9.0 @@ -137,8 +137,8 @@ Index: browscap.ini [Mozilla/?.* (?compatible; *MSIE 6.0; *AOL 9.0*)*] Parent=AOL 9.0/IE 6.0 -@@ -17025,6 +17053,8 @@ - CSS=2 +@@ -16636,6 +16664,8 @@ JavaScript=true + ActiveXControls=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.2 @@ -146,8 +146,8 @@ Index: browscap.ini [Mozilla/?.* (?compatible; *MSIE 5.5*)*] Parent=IE 5.5 -@@ -17250,6 +17280,9 @@ - CSS=2 +@@ -16692,6 +16722,9 @@ JavaScript=true + ActiveXControls=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.2 @@ -156,8 +156,8 @@ Index: browscap.ini [Mozilla/?.* (?compatible; *MSIE 6.0*)*] Parent=IE 6.0 -@@ -17890,6 +17923,9 @@ - CSS=2 +@@ -16762,6 +16795,9 @@ JavaScript=true + ActiveXControls=true CssVersion=2 supportsCSS=true +ecmascriptversion=1.2 @@ -166,9 +166,13 @@ Index: browscap.ini [Mozilla/?.* (?compatible; *MSIE 7.0*)*] Parent=IE 7.0 -@@ -18568,3 +18604,5 @@ - aolVersion=0 - netCLR=false - ClrVersion=0 -+ECMAScriptVersion=0.0 -+W3CDOMVersion=0.0 +@@ -16836,6 +16872,9 @@ JavaScript=true + ActiveXControls=true + CssVersion=3 + supportsCSS=true ++ecmascriptversion=1.2 ++msdomversion=8.0 ++w3cdomversion=1.0 + + [Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0*)*] + Parent=IE 8.0 diff --git a/mcs/class/System.Web/net_4_0_System.Web.dll.sources b/mcs/class/System.Web/net_4_0_System.Web.dll.sources new file mode 100644 index 00000000000..42473e46064 --- /dev/null +++ b/mcs/class/System.Web/net_4_0_System.Web.dll.sources @@ -0,0 +1,1258 @@ +Assembly/AssemblyInfo.cs +../../build/common/Consts.cs +../../build/common/Locale.cs +../../build/common/MonoTODOAttribute.cs +../Managed.Windows.Forms/System.Resources/ResXResourceReader.cs +../Managed.Windows.Forms/System.Resources/ResXResourceWriter.cs +../Managed.Windows.Forms/System.Resources/ResXFileRef.cs +../Managed.Windows.Forms/System.Resources/ResXDataNode.cs +../Managed.Windows.Forms/System.Resources/ResXNullRef.cs +System.Web.Configuration_2.0/CapabilitiesBuild.cs +System.Web.Configuration_2.0/CapabilitiesResult.cs +System.Web.Configuration_2.0/ICapabilitiesProcess.cs +System.Web.Configuration_2.0/nBrowser/Result.cs +System.Web.Configuration_2.0/nBrowser/NodeTypes.cs +System.Web.Configuration_2.0/nBrowser/Identification.cs +System.Web.Configuration_2.0/nBrowser/File.cs +System.Web.Configuration_2.0/nBrowser/Build.cs +System.Web.Configuration_2.0/nBrowser/Node.cs +System.Web.Configuration_2.0/nBrowser/Exception.cs +System.Web/ApplicationShutdownReason.cs +System.Web/BeginEventHandler.cs +System.Web.Caching/AggregateCacheDependency.cs +System.Web.Caching/Cache.cs +System.Web.Caching/CacheDependency.cs +System.Web.Caching/CacheItemPriority.cs +System.Web.Caching/CacheItemRemovedCallback.cs +System.Web.Caching/CacheItemRemovedReason.cs +System.Web.Caching/CachedRawResponse.cs +System.Web.Caching/CachedVaryBy.cs +System.Web.Caching/OutputCacheModule.cs +System.Web.Caching/SqlCacheDependency.cs +System.Web/CapabilitiesLoader.cs +System.Web/BrowserCapabilities.cs +System.Web.Compilation/ApplicationFileBuildProvider.cs +System.Web.Compilation/AppSettingsExpressionBuilder.cs +System.Web.Compilation/AspComponent.cs +System.Web.Compilation/AspComponentFoundry.cs +System.Web.Compilation/AppCodeCompiler.cs +System.Web.Compilation/AppResourceFileInfo.cs +System.Web.Compilation/AppResourceFilesCollection.cs +System.Web.Compilation/AppResourcesAssemblyBuilder.cs +System.Web.Compilation/AppResourcesCompiler.cs +System.Web.Compilation/AppWebReferencesCompiler.cs +System.Web.Compilation/AspGenerator.cs +System.Web.Compilation/AspParser.cs +System.Web.Compilation/AspTokenizer.cs +System.Web.Compilation/AssemblyBuilder.cs +System.Web.Compilation/BaseCompiler.cs +System.Web.Compilation/BuildDependencySet.cs +System.Web.Compilation/BuildManager.cs +System.Web.Compilation/BuildManagerCacheItem.cs +System.Web.Compilation/BuildManagerDirectoryBuilder.cs +System.Web.Compilation/BuildManagerRemoveEntryEventHandler.cs +System.Web.Compilation/BuildManagerHostUnloadEventArgs.cs +System.Web.Compilation/BuildManagerHostUnloadEventHandler.cs +System.Web.Compilation/BuildProviderAppliesToAttribute.cs +System.Web.Compilation/BuildProviderAppliesTo.cs +System.Web.Compilation/BuildProviderGroup.cs +System.Web.Compilation/BuildProviderResultFlags.cs +System.Web.Compilation/BuildProvider.cs +System.Web.Compilation/CachingCompiler.cs +System.Web.Compilation/ClientBuildManagerCallback.cs +System.Web.Compilation/ClientBuildManagerParameter.cs +System.Web.Compilation/ClientBuildManager.cs +System.Web.Compilation/CompilationException.cs +System.Web.Compilation/CompilerType.cs +System.Web.Compilation/ConnectionStringsExpressionBuilder.cs +System.Web.Compilation/DefaultResourceProviderFactory.cs +System.Web.Compilation/DefaultResourceProvider.cs +System.Web.Compilation/DesignTimeResourceProviderFactoryAttribute.cs +System.Web.Compilation/Directive.cs +System.Web.Compilation/ExpressionBuilderContext.cs +System.Web.Compilation/ExpressionBuilder.cs +System.Web.Compilation/ExpressionEditorAttribute.cs +System.Web.Compilation/ExpressionPrefixAttribute.cs +System.Web.Compilation/ForceCopyBuildProvider.cs +System.Web.Compilation/GenericBuildProvider.cs +System.Web.Compilation/GlobalAsaxCompiler.cs +System.Web.Compilation/IAssemblyPostProcessor.cs +System.Web.Compilation/IgnoreFileBuildProvider.cs +System.Web.Compilation/IImplicitResourceProvider.cs +System.Web.Compilation/ILocation.cs +System.Web.Compilation/ImplicitResourceKey.cs +System.Web.Compilation/IResourceProvider.cs +System.Web.Compilation/LinePragmaCodeInfo.cs +System.Web.Compilation/Location.cs +System.Web.Compilation/MasterPageBuildProvider.cs +System.Web.Compilation/MasterPageCompiler.cs +System.Web.Compilation/PageBuildProvider.cs +System.Web.Compilation/PageCompiler.cs +System.Web.Compilation/PageThemeCompiler.cs +System.Web.Compilation/ParseException.cs +System.Web.Compilation/PrecompilationFlags.cs +System.Web.Compilation/PreservationFile.cs +System.Web.Compilation/ResourceExpressionBuilder.cs +System.Web.Compilation/ResourceExpressionFields.cs +System.Web.Compilation/ResourceProviderFactory.cs +System.Web.Compilation/SimpleBuildProvider.cs +System.Web.Compilation/TagAttributes.cs +System.Web.Compilation/TagType.cs +System.Web.Compilation/TemplateBuildProvider.cs +System.Web.Compilation/TemplateControlCompiler.cs +System.Web.Compilation/ThemeDirectoryBuildProvider.cs +System.Web.Compilation/ThemeDirectoryCompiler.cs +System.Web.Compilation/UserControlBuildProvider.cs +System.Web.Compilation/UserControlCompiler.cs +System.Web.Compilation/WebServiceCompiler.cs +System.Web.Compilation/WebHandlerBuildProvider.cs +System.Web.Compilation/WebServiceBuildProvider.cs +System.Web.Compilation/WsdlBuildProvider.cs +System.Web.Compilation/XsdBuildProvider.cs +System.Web.Configuration/AuthConfig.cs +System.Web.Configuration/AuthenticationConfigHandler.cs +System.Web.Configuration/AuthenticationMode.cs +System.Web.Configuration/AuthorizationConfig.cs +System.Web.Configuration/AuthorizationConfigHandler.cs +System.Web.Configuration/ClientTargetSectionHandler.cs +System.Web.Configuration/CompilationConfiguration.cs +System.Web.Configuration/CompilationConfigurationHandler.cs +System.Web.Configuration/CompilerCollection.cs +System.Web.Configuration/Compiler.cs +System.Web.Configuration/CustomErrorsConfigHandler.cs +System.Web.Configuration/FileMatchingInfo.cs +System.Web.Configuration/FormsAuthPasswordFormat.cs +System.Web.Configuration/FormsProtectionEnum.cs +System.Web.Configuration/GlobalizationConfiguration.cs +System.Web.Configuration/GlobalizationConfigurationHandler.cs +System.Web.Configuration/HandlerFactoryConfiguration.cs +System.Web.Configuration/HttpCapabilitiesBase.cs +System.Web.Configuration/HttpConfigurationContext.cs +System.Web.Configuration/HttpHandlersSectionHandler.cs +System.Web.Configuration/HttpModulesConfigurationHandler.cs +System.Web.Configuration/HttpRuntimeConfig.cs +System.Web.Configuration/HttpRuntimeConfigurationHandler.cs +System.Web.Configuration/MachineKeyConfig.cs +System.Web.Configuration/MachineKeyConfigHandler.cs +System.Web.Configuration/MachineKeyRegistryStorage.cs +System.Web.Configuration/MachineKeyValidation.cs +System.Web.Configuration/ModulesConfiguration.cs +System.Web.Configuration/PagesConfiguration.cs +System.Web.Configuration/PagesConfigurationHandler.cs +System.Web.Configuration/TraceConfig.cs +System.Web.Configuration/TraceConfigurationHandler.cs +System.Web.Configuration/WebConfigurationSettings.cs +System.Web.Configuration/WebControlsSectionHandler.cs +System.Web.Configuration_2.0/AdapterDictionary.cs +System.Web.Configuration_2.0/AnonymousIdentificationSection.cs +System.Web.Configuration_2.0/ApplicationSettingsConfigurationFileMap.cs +System.Web.Configuration_2.0/AssemblyCollection.cs +System.Web.Configuration_2.0/AssemblyInfo.cs +System.Web.Configuration_2.0/AuthenticationSection.cs +System.Web.Configuration_2.0/AuthorizationRuleAction.cs +System.Web.Configuration_2.0/AuthorizationRule.cs +System.Web.Configuration_2.0/AuthorizationRuleCollection.cs +System.Web.Configuration_2.0/AuthorizationSection.cs +System.Web.Configuration_2.0/BufferModesCollection.cs +System.Web.Configuration_2.0/BufferModeSettings.cs +System.Web.Configuration_2.0/BuildProviderCollection.cs +System.Web.Configuration_2.0/BuildProvider.cs +System.Web.Configuration_2.0/ClientTarget.cs +System.Web.Configuration_2.0/ClientTargetCollection.cs +System.Web.Configuration_2.0/ClientTargetSection.cs +System.Web.Configuration_2.0/CacheSection.cs +System.Web.Configuration_2.0/CodeSubDirectoriesCollection.cs +System.Web.Configuration_2.0/CodeSubDirectory.cs +System.Web.Configuration_2.0/CompilationSection.cs +System.Web.Configuration_2.0/Compiler.cs +System.Web.Configuration_2.0/CompilerCollection.cs +System.Web.Configuration_2.0/CustomError.cs +System.Web.Configuration_2.0/CustomErrorCollection.cs +System.Web.Configuration_2.0/CustomErrorsMode.cs +System.Web.Configuration_2.0/CustomErrorsSection.cs +System.Web.Configuration_2.0/DeploymentSection.cs +System.Web.Configuration_2.0/EventMappingSettings.cs +System.Web.Configuration_2.0/EventMappingSettingsCollection.cs +System.Web.Configuration_2.0/ExpressionBuilderCollection.cs +System.Web.Configuration_2.0/ExpressionBuilder.cs +System.Web.Configuration_2.0/FormsAuthenticationConfiguration.cs +System.Web.Configuration_2.0/FormsAuthenticationCredentials.cs +System.Web.Configuration_2.0/FormsAuthenticationUser.cs +System.Web.Configuration_2.0/FormsAuthenticationUserCollection.cs +System.Web.Configuration_2.0/GlobalizationSection.cs +System.Web.Configuration_2.0/HealthMonitoringSection.cs +System.Web.Configuration_2.0/HostingEnvironmentSection.cs +System.Web.Configuration_2.0/HttpCapabilitiesBase.cs +System.Web.Configuration_2.0/HttpCookiesSection.cs +System.Web.Configuration_2.0/HttpConfigurationSystem.cs +System.Web.Configuration_2.0/HttpHandlerAction.cs +System.Web.Configuration_2.0/HttpHandlerActionCollection.cs +System.Web.Configuration_2.0/HttpHandlersSection.cs +System.Web.Configuration_2.0/HttpModuleAction.cs +System.Web.Configuration_2.0/HttpModuleActionCollection.cs +System.Web.Configuration_2.0/HttpModulesSection.cs +System.Web.Configuration_2.0/HttpRuntimeSection.cs +System.Web.Configuration_2.0/IdentitySection.cs +System.Web.Configuration_2.0/IConfigMapPath.cs +System.Web.Configuration_2.0/IConfigMapPathFactory.cs +System.Web.Configuration_2.0/IRemoteWebConfigurationHostServer.cs +System.Web.Configuration_2.0/LowerCaseStringConverter.cs +System.Web.Configuration_2.0/MachineKeySection.cs +System.Web.Configuration_2.0/MachineKeySectionUtils.cs +System.Web.Configuration_2.0/MachineKeyValidationConverter.cs +System.Web.Configuration_2.0/MembershipSection.cs +System.Web.Configuration_2.0/MonoSettingsSection.cs +System.Web.Configuration_2.0/NamespaceCollection.cs +System.Web.Configuration_2.0/NamespaceInfo.cs +System.Web.Configuration_2.0/NullableStringValidator.cs +System.Web.Configuration_2.0/OutputCacheProfile.cs +System.Web.Configuration_2.0/OutputCacheProfileCollection.cs +System.Web.Configuration_2.0/OutputCacheSection.cs +System.Web.Configuration_2.0/OutputCacheSettingsSection.cs +System.Web.Configuration_2.0/PagesEnableSessionState.cs +System.Web.Configuration_2.0/PagesSection.cs +System.Web.Configuration_2.0/PassportAuthentication.cs +System.Web.Configuration_2.0/ProcessModelSection.cs +System.Web.Configuration_2.0/ProcessModelComAuthenticationLevel.cs +System.Web.Configuration_2.0/ProcessModelComImpersonationLevel.cs +System.Web.Configuration_2.0/ProcessModelLogLevel.cs +System.Web.Configuration_2.0/ProfileGroupSettings.cs +System.Web.Configuration_2.0/ProfileGroupSettingsCollection.cs +System.Web.Configuration_2.0/ProfilePropertyNameValidator.cs +System.Web.Configuration_2.0/ProfilePropertySettings.cs +System.Web.Configuration_2.0/ProfilePropertySettingsCollection.cs +System.Web.Configuration_2.0/ProfileSection.cs +System.Web.Configuration_2.0/ProfileSettings.cs +System.Web.Configuration_2.0/ProfileSettingsCollection.cs +System.Web.Configuration_2.0/PropertyHelper.cs +System.Web.Configuration_2.0/ProvidersHelper.cs +System.Web.Configuration_2.0/RegexWorker.cs +System.Web.Configuration_2.0/RoleManagerSection.cs +System.Web.Configuration_2.0/RootProfilePropertySettingsCollection.cs +System.Web.Configuration_2.0/RuleSettings.cs +System.Web.Configuration_2.0/RuleSettingsCollection.cs +System.Web.Configuration_2.0/SerializationMode.cs +System.Web.Configuration_2.0/SecurityPolicySection.cs +System.Web.Configuration_2.0/SessionPageStateSection.cs +System.Web.Configuration_2.0/SessionStateSection.cs +System.Web.Configuration_2.0/SiteMapSection.cs +System.Web.Configuration_2.0/SqlCacheDependencyDatabase.cs +System.Web.Configuration_2.0/SqlCacheDependencyDatabaseCollection.cs +System.Web.Configuration_2.0/SqlCacheDependencySection.cs +System.Web.Configuration_2.0/SystemWebCachingSectionGroup.cs +System.Web.Configuration_2.0/SystemWebSectionGroup.cs +System.Web.Configuration_2.0/TagMapCollection.cs +System.Web.Configuration_2.0/TagMapInfo.cs +System.Web.Configuration_2.0/TagPrefixCollection.cs +System.Web.Configuration_2.0/TagPrefixInfo.cs +System.Web.Configuration_2.0/TraceDisplayMode.cs +System.Web.Configuration_2.0/TraceSection.cs +System.Web.Configuration_2.0/TransformerInfo.cs +System.Web.Configuration_2.0/TransformerInfoCollection.cs +System.Web.Configuration_2.0/TrustLevel.cs +System.Web.Configuration_2.0/TrustLevelCollection.cs +System.Web.Configuration_2.0/TrustSection.cs +System.Web.Configuration_2.0/UrlMapping.cs +System.Web.Configuration_2.0/UrlMappingCollection.cs +System.Web.Configuration_2.0/UrlMappingsSection.cs +System.Web.Configuration_2.0/VirtualDirectoryMappingCollection.cs +System.Web.Configuration_2.0/VirtualDirectoryMapping.cs +System.Web.Configuration_2.0/WebApplicationLevel.cs +System.Web.Configuration_2.0/WebConfigurationFileMap.cs +System.Web.Configuration_2.0/WebConfigurationHost.cs +System.Web.Configuration_2.0/WebConfigurationManager.cs +System.Web.Configuration_2.0/WebControlsSection.cs +System.Web.Configuration_2.0/WebContext.cs +System.Web.Configuration_2.0/WebPartsPersonalization.cs +System.Web.Configuration_2.0/WebPartsPersonalizationAuthorization.cs +System.Web.Configuration_2.0/WebPartsSection.cs +System.Web.Configuration_2.0/XhtmlConformanceMode.cs +System.Web.Configuration_2.0/XhtmlConformanceSection.cs +System.Web.Configuration.Internal/IInternalConfigWebHost.cs +System.Web/DefaultHttpHandler.cs +System.Web/EndEventHandler.cs +System.Web.Handlers/AssemblyResourceLoader.cs +System.Web.Handlers/TraceHandler.cs +System.Web.Hosting/AppDomainFactory.cs +System.Web.Hosting/AppManagerAppDomainFactory.cs +System.Web.Hosting/ApplicationInfo.cs +System.Web.Hosting/ApplicationHost.cs +System.Web.Hosting/ApplicationManager.cs +System.Web.Hosting/BareApplicationHost.cs +System.Web.Hosting/DefaultVirtualDirectory.cs +System.Web.Hosting/DefaultVirtualFile.cs +System.Web.Hosting/DefaultVirtualPathProvider.cs +System.Web.Hosting/HostingEnvironment.cs +System.Web.Hosting/IAppDomainFactory.cs +System.Web.Hosting/IAppManagerAppDomainFactory.cs +System.Web.Hosting/IISAPIRuntime.cs +System.Web.Hosting/IRegisteredObject.cs +System.Web.Hosting/ISAPIRuntime.cs +System.Web.Hosting/SimpleWorkerRequest.cs +System.Web.Hosting/VirtualDirectory.cs +System.Web.Hosting/VirtualFileBase.cs +System.Web.Hosting/VirtualFile.cs +System.Web.Hosting/VirtualPathProvider.cs +System.Web/BaseParamsCollection.cs +System.Web/HeadersCollection.cs +System.Web/HtmlizedException.cs +System.Web/HttpApplication.cs +System.Web/HttpApplicationFactory.cs +System.Web/HttpApplicationState.cs +System.Web/HttpBrowserCapabilities.cs +System.Web/HttpCacheability.cs +System.Web/HttpCachePolicy.cs +System.Web/HttpCacheRevalidation.cs +System.Web/HttpCacheValidateHandler.cs +System.Web/HttpCacheVaryByContentEncodings.cs +System.Web/HttpCacheVaryByHeaders.cs +System.Web/HttpCacheVaryByParams.cs +System.Web/HttpClientCertificate.cs +System.Web/HttpCompileException.cs +System.Web/HttpContext.cs +System.Web/HttpCookieCollection.cs +System.Web/HttpCookie.cs +System.Web/HttpCookieMode.cs +System.Web/HttpException.cs +System.Web/HttpFileCollection.cs +System.Web/HttpForbiddenHandler.cs +System.Web/HttpMethodNotAllowedHandler.cs +System.Web/HttpModuleCollection.cs +System.Web/HttpParamsCollection.cs +System.Web/HttpParseException.cs +System.Web/HttpPostedFile.cs +System.Web/HttpRequest.cs +System.Web/HttpRequestValidationException.cs +System.Web/HttpResponseHeader.cs +System.Web/HttpResponseStream.cs +System.Web/HttpResponseSubstitutionCallback.cs +System.Web/HttpResponse.cs +System.Web/HttpRuntime.cs +System.Web/HttpServerUtility.cs +System.Web/HttpStaticObjectsCollection.cs +System.Web/HttpUnhandledException.cs +System.Web/HttpUtility.cs +System.Web/HttpValidationStatus.cs +System.Web/HttpWorkerRequest.cs +System.Web/HttpWriter.cs +System.Web/IntPtrStream.cs +System.Web/IHttpAsyncHandler.cs +System.Web/IHttpHandler.cs +System.Web/IHttpHandlerFactory.cs +System.Web/IHttpMapPath.cs +System.Web/IHttpModule.cs +System.Web/IisTraceListener.cs +System.Web/IPartitionResolver.cs +System.Web/InputFilterStream.cs +System.Web/OutputFilterStream.cs +System.Web/RequestNotification.cs +System.Web/RequestNotificationStatus.cs +System.Web.Mail/Base64AttachmentEncoder.cs +System.Web.Mail/IAttachmentEncoder.cs +System.Web.Mail/MailAddressCollection.cs +System.Web.Mail/MailAddress.cs +System.Web.Mail/MailAttachment.cs +System.Web.Mail/MailEncoding.cs +System.Web.Mail/MailFormat.cs +System.Web.Mail/MailHeader.cs +System.Web.Mail/MailMessage.cs +System.Web.Mail/MailMessageWrapper.cs +System.Web.Mail/MailPriority.cs +System.Web.Mail/MailUtil.cs +System.Web.Mail/SmtpClient.cs +System.Web.Mail/SmtpException.cs +System.Web.Mail/SmtpMail.cs +System.Web.Mail/SmtpResponse.cs +System.Web.Mail/SmtpStream.cs +System.Web.Mail/ToUUEncodingTransform.cs +System.Web.Mail/UUAttachmentEncoder.cs +System.Web.Management/EventNotificationType.cs +System.Web.Management/IRegiisUtility.cs +System.Web.Management/IWebEventCustomEvaluator.cs +System.Web.Management/RuleFiringRecord.cs +System.Web.Management/SessionStateType.cs +System.Web.Management/SqlFeatures.cs +System.Web.Management/WebApplicationInformation.cs +System.Web.Management/WebBaseEvent.cs +System.Web.Management/WebEventCodes.cs +System.Web.Management/WebEventFormatter.cs +System.Web/MimeTypes.cs +System.Web/NoParamsInvoker.cs +System.Web/ParserErrorCollection.cs +System.Web/ParserError.cs +System.Web/ProcessInfo.cs +System.Web/ProcessModelInfo.cs +System.Web/ProcessShutdownReason.cs +System.Web/ProcessStatus.cs +System.Web.Profile/CustomProviderDataAttribute.cs +System.Web.Profile/DefaultProfile.cs +System.Web.Profile/ProfileAuthenticationOption.cs +System.Web.Profile/ProfileAutoSaveEventArgs.cs +System.Web.Profile/ProfileAutoSaveEventHandler.cs +System.Web.Profile/ProfileBase.cs +System.Web.Profile/ProfileEventArgs.cs +System.Web.Profile/ProfileEventHandler.cs +System.Web.Profile/ProfileGroupBase.cs +System.Web.Profile/ProfileInfoCollection.cs +System.Web.Profile/ProfileInfo.cs +System.Web.Profile/ProfileManager.cs +System.Web.Profile/ProfileMigrateEventArgs.cs +System.Web.Profile/ProfileMigrateEventHandler.cs +System.Web.Profile/ProfileModule.cs +System.Web.Profile/ProfileParser.cs +System.Web.Profile/ProfileProviderAttribute.cs +System.Web.Profile/ProfileProviderCollection.cs +System.Web.Profile/ProfileProvider.cs +System.Web.Profile/SettingsAllowAnonymousAttribute.cs +System.Web.Profile/SqliteProfileProvider.cs +System.Web.Profile/SqlProfileProvider.cs +System.Web.Properties/TranslationProperties.Designer.cs +System.Web/QueueManager.cs +System.Web.Routing/PageRouteHandler.cs +System.Web.Security/AspNetDBSchemaChecker.cs +System.Web.Security/ActiveDirectoryConnectionProtection.cs +System.Web.Security/ActiveDirectoryMembershipProvider.cs +System.Web.Security/AnonymousIdentificationEventArgs.cs +System.Web.Security/AnonymousIdentificationEventHandler.cs +System.Web.Security/AnonymousIdentificationModule.cs +System.Web.Security/CookieProtection.cs +System.Web.Security/DefaultAuthenticationEventArgs.cs +System.Web.Security/DefaultAuthenticationEventHandler.cs +System.Web.Security/DefaultAuthenticationModule.cs +System.Web.Security/FileAuthorizationModule.cs +System.Web.Security/FormsAuthentication.cs +System.Web.Security/FormsAuthenticationEventArgs.cs +System.Web.Security/FormsAuthenticationEventHandler.cs +System.Web.Security/FormsAuthenticationModule.cs +System.Web.Security/FormsAuthenticationTicket.cs +System.Web.Security/FormsIdentity.cs +System.Web.Security/MembershipCreateStatus.cs +System.Web.Security/MembershipCreateUserException.cs +System.Web.Security/Membership.cs +System.Web.Security/MembershipPasswordException.cs +System.Web.Security/MembershipPasswordFormat.cs +System.Web.Security/MembershipProviderCollection.cs +System.Web.Security/MembershipProvider.cs +System.Web.Security/MembershipUserCollection.cs +System.Web.Security/MembershipUser.cs +System.Web.Security/MembershipValidatePasswordEventHandler.cs +System.Web.Security/PassportAuthenticationEventArgs.cs +System.Web.Security/PassportAuthenticationEventHandler.cs +System.Web.Security/PassportAuthenticationModule.cs +System.Web.Security/PassportIdentity.cs +System.Web.Security/RoleManagerEventArgs.cs +System.Web.Security/RoleManagerEventHandler.cs +System.Web.Security/RoleManagerModule.cs +System.Web.Security/RolePrincipal.cs +System.Web.Security/RoleProviderCollection.cs +System.Web.Security/RoleProvider.cs +System.Web.Security/Roles.cs +System.Web.Security/SqliteMembershipProvider.cs +System.Web.Security/SqliteRoleProvider.cs +System.Web.Security/SqlMembershipProvider.cs +System.Web.Security/SqlRoleProvider.cs +System.Web.Security/UrlAuthorizationModule.cs +System.Web.Security/ValidatePasswordEventArgs.cs +System.Web.Security/WindowsAuthenticationEventArgs.cs +System.Web.Security/WindowsAuthenticationEventHandler.cs +System.Web.Security/WindowsAuthenticationModule.cs +System.Web/ServerVariablesCollection.cs +System.Web.SessionState/HttpSessionState.cs +System.Web.SessionState/IReadOnlySessionState.cs +System.Web.SessionState/IRequiresSessionState.cs +System.Web.SessionState/ISessionHandler.cs +System.Web.SessionState/IStateRuntime.cs +System.Web.SessionState/RemoteStateServer.cs +System.Web.SessionState/SessionConfig.cs +System.Web.SessionState/SessionDictionary.cs +System.Web.SessionState/SessionId.cs +System.Web.SessionState/SessionInProcHandler.cs +System.Web.SessionState/SessionSQLServerHandler.cs +System.Web.SessionState/SessionStateMode.cs +System.Web.SessionState/SessionStateModule.cs +System.Web.SessionState/SessionStateSectionHandler.cs +System.Web.SessionState/SessionStateServerHandler.cs +System.Web.SessionState/StateRuntime.cs +System.Web.SessionState/StateServerItem.cs +System.Web.SessionState_2.0/HttpSessionStateContainer.cs +System.Web.SessionState_2.0/HttpSessionState.cs +System.Web.SessionState_2.0/IHttpSessionState.cs +System.Web.SessionState_2.0/ISessionIDManager.cs +System.Web.SessionState_2.0/ISessionStateItemCollection.cs +System.Web.SessionState_2.0/RemoteStateServer.cs +System.Web.SessionState_2.0/SessionIDManager.cs +System.Web.SessionState_2.0/SessionInProcHandler.cs +System.Web.SessionState_2.0/SessionSQLServerHandler.cs +System.Web.SessionState_2.0/SessionStateActions.cs +System.Web.SessionState_2.0/SessionStateItemCollection.cs +System.Web.SessionState_2.0/SessionStateItemExpireCallback.cs +System.Web.SessionState_2.0/SessionStateModule.cs +System.Web.SessionState_2.0/SessionStateServerHandler.cs +System.Web.SessionState_2.0/SessionStateStoreData.cs +System.Web.SessionState_2.0/SessionStateStoreProviderBase.cs +System.Web.SessionState_2.0/SessionStateUtility.cs +System.Web.SessionState_2.0/StateServerItem.cs +System.Web/SiteMap.cs +System.Web/SiteMapNodeCollection.cs +System.Web/SiteMapNode.cs +System.Web/SiteMapProviderCollection.cs +System.Web/SiteMapProvider.cs +System.Web/SiteMapResolveEventArgs.cs +System.Web/StaticFileHandler.cs +System.Web/StaticSiteMapProvider.cs +System.Web/TempFileStream.cs +System.Web/TraceContext.cs +System.Web/TraceContextEventArgs.cs +System.Web/TraceContextEventHandler.cs +System.Web/TraceContextRecord.cs +System.Web/TraceData.cs +System.Web/TraceManager.cs +System.Web/TraceMode.cs +System.Web.UI.Adapters/ControlAdapter.cs +System.Web.UI.Adapters/PageAdapter.cs +System.Web.UI.Adapters/WmlPostFieldType.cs +System.Web.UI/ApplicationFileParser.cs +System.Web.UI/AttributeCollection.cs +System.Web.UI/BaseParser.cs +System.Web.UI/BasePartialCachingControl.cs +System.Web.UI/BaseTemplateParser.cs +System.Web.UI/BoundPropertyEntry.cs +System.Web.UI/BuilderPropertyEntry.cs +System.Web.UI/BuildMethod.cs +System.Web.UI/BuildTemplateMethod.cs +System.Web.UI/ClientScriptManager.cs +System.Web.UI/ChtmlTextWriter.cs +System.Web.UI/CodeBuilder.cs +System.Web.UI/CodeConstructType.cs +System.Web.UI/CodeRenderBuilder.cs +System.Web.UI/CollectionBuilder.cs +System.Web.UI/CompilationMode.cs +System.Web.UI/CompiledBindableTemplateBuilder.cs +System.Web.UI/CompiledTemplateBuilder.cs +System.Web.UI/ComplexPropertyEntry.cs +System.Web.UI/ConflictOptions.cs +System.Web.UI/ConstructorNeedsTagAttribute.cs +System.Web.UI/ControlBuilderAttribute.cs +System.Web.UI/ControlBuilder.cs +System.Web.UI/ControlCachePolicy.cs +System.Web.UI/ControlCollection.cs +System.Web.UI/Control.cs +System.Web.UI/ControlSkin.cs +System.Web.UI/ControlSkinDelegate.cs +System.Web.UI/ControlValuePropertyAttribute.cs +System.Web.UI/CssClassPropertyAttribute.cs +System.Web.UI/CssStyleCollection.cs +System.Web.UI/DataBinder.cs +System.Web.UI/DataBindingBuilder.cs +System.Web.UI/DataBindingCollection.cs +System.Web.UI/DataBinding.cs +System.Web.UI/DataBindingHandlerAttribute.cs +System.Web.UI/DataBoundLiteralControl.cs +System.Web.UI/DataSourceCacheDurationConverter.cs +System.Web.UI/DataSourceCacheExpiry.cs +System.Web.UI/DataSourceCapabilities.cs +System.Web.UI/DataSourceControl.cs +System.Web.UI/DataSourceControlBuilder.cs +System.Web.UI/DataSourceOperation.cs +System.Web.UI/DataSourceSelectArguments.cs +System.Web.UI/DataSourceView.cs +System.Web.UI/DataSourceViewOperationCallback.cs +System.Web.UI/DataSourceViewSelectCallback.cs +System.Web.UI/DesignerDataBoundLiteralControl.cs +System.Web.UI/DesignTimeParseData.cs +System.Web.UI/DesignTimeTemplateParser.cs +System.Web.UI/EmptyControlCollection.cs +System.Web.UI/EventEntry.cs +System.Web.UI/ExpressionBindingCollection.cs +System.Web.UI/ExpressionBinding.cs +System.Web.UI/ExtractTemplateValuesMethod.cs +System.Web.UI/FileLevelUserControlBuilder.cs +System.Web.UI/FileLevelControlBuilderAttribute.cs +System.Web.UI/FileLevelPageControlBuilder.cs +System.Web.UI/FilterableAttribute.cs +System.Web.UI/HiddenFieldPageStatePersister.cs +System.Web.UI/HierarchicalDataSourceControl.cs +System.Web.UI/HierarchicalDataSourceView.cs +System.Web.UI/Html32TextWriter.cs +System.Web.UI/HtmlControlPersistableAttribute.cs +System.Web.UI.HtmlControls/HtmlAnchor.cs +System.Web.UI.HtmlControls/HtmlButton.cs +System.Web.UI.HtmlControls/HtmlContainerControl.cs +System.Web.UI.HtmlControls/HtmlControlBuilder.cs +System.Web.UI.HtmlControls/HtmlControl.cs +System.Web.UI.HtmlControls/HtmlEmptyTagControlBuilder.cs +System.Web.UI.HtmlControls/HtmlForm.cs +System.Web.UI.HtmlControls/HtmlGenericControl.cs +System.Web.UI.HtmlControls/HtmlHeadBuilder.cs +System.Web.UI.HtmlControls/HtmlHead.cs +System.Web.UI.HtmlControls/HtmlImage.cs +System.Web.UI.HtmlControls/HtmlInputButton.cs +System.Web.UI.HtmlControls/HtmlInputCheckBox.cs +System.Web.UI.HtmlControls/HtmlInputControl.cs +System.Web.UI.HtmlControls/HtmlInputFile.cs +System.Web.UI.HtmlControls/HtmlInputHidden.cs +System.Web.UI.HtmlControls/HtmlInputImage.cs +System.Web.UI.HtmlControls/HtmlInputPassword.cs +System.Web.UI.HtmlControls/HtmlInputRadioButton.cs +System.Web.UI.HtmlControls/HtmlInputReset.cs +System.Web.UI.HtmlControls/HtmlInputSubmit.cs +System.Web.UI.HtmlControls/HtmlInputText.cs +System.Web.UI.HtmlControls/HtmlLink.cs +System.Web.UI.HtmlControls/HtmlMeta.cs +System.Web.UI.HtmlControls/HtmlSelectBuilder.cs +System.Web.UI.HtmlControls/HtmlSelect.cs +System.Web.UI.HtmlControls/HtmlTableCellCollection.cs +System.Web.UI.HtmlControls/HtmlTableCell.cs +System.Web.UI.HtmlControls/HtmlTable.cs +System.Web.UI.HtmlControls/HtmlTableRowCollection.cs +System.Web.UI.HtmlControls/HtmlTableRow.cs +System.Web.UI.HtmlControls/HtmlTextArea.cs +System.Web.UI.HtmlControls/HtmlTitle.cs +System.Web.UI/HtmlTextWriterAttribute.cs +System.Web.UI/HtmlTextWriter.cs +System.Web.UI/HtmlTextWriterStyle.cs +System.Web.UI/HtmlTextWriterTag.cs +System.Web.UI/IAttributeAccessor.cs +System.Web.UI/IAutoFieldGenerator.cs +System.Web.UI/IBindableControl.cs +System.Web.UI/IBindableTemplate.cs +System.Web.UI/ICallbackEventHandler.cs +System.Web.UI/ICheckBoxControl.cs +System.Web.UI/IControlBuilderAccessor.cs +System.Web.UI/IControlDesignerAccessor.cs +System.Web.UI/IDataBindingsAccessor.cs +System.Web.UI/IDataItemContainer.cs +System.Web.UI/IDataSource.cs +System.Web.UI/IDataSourceViewSchemaAccessor.cs +System.Web.UI/IDReferencePropertyAttribute.cs +System.Web.UI/IEditableTextControl.cs +System.Web.UI/IExpressionsAccessor.cs +System.Web.UI/IFilterResolutionService.cs +System.Web.UI/IgnoreUnknownContentAttribute.cs +System.Web.UI/IHierarchicalDataSource.cs +System.Web.UI/IHierarchicalEnumerable.cs +System.Web.UI/IHierarchyData.cs +System.Web.UI/ImageClickEventArgs.cs +System.Web.UI/ImageClickEventHandler.cs +System.Web.UI/IndexedString.cs +System.Web.UI/INamingContainer.cs +System.Web.UI/INonBindingContainer.cs +System.Web.UI/INavigateUIData.cs +System.Web.UI/IParserAccessor.cs +System.Web.UI/IPostBackDataHandler.cs +System.Web.UI/IPostBackEventHandler.cs +System.Web.UI/IResourceUrlGenerator.cs +System.Web.UI/IStateFormatter.cs +System.Web.UI/IStateManager.cs +System.Web.UI/IScriptManager.cs +System.Web.UI/IStyleSheet.cs +System.Web.UI/ITagNameToTypeMapper.cs +System.Web.UI/ITemplate.cs +System.Web.UI/ITextControl.cs +System.Web.UI/IThemeResolutionService.cs +System.Web.UI/IUrlResolutionService.cs +System.Web.UI/IUserControlDesignerAccessor.cs +System.Web.UI/IUserControlTypeResolutionService.cs +System.Web.UI/IValidator.cs +System.Web.UI/KeyedList.cs +System.Web.UI/KeyedListEnumerator.cs +System.Web.UI/ListSourceHelper.cs +System.Web.UI/LiteralControl.cs +System.Web.UI/LosFormatter.cs +System.Web.UI/MasterPage.cs +System.Web.UI/MasterPageControlBuilder.cs +System.Web.UI/MasterPageParser.cs +System.Web.UI/MinimizableAttributeTypeConverter.cs +System.Web.UI/NonVisualControlAttribute.cs +System.Web.UI/ObjectConverter.cs +System.Web.UI/ObjectPersistData.cs +System.Web.UI/ObjectStateFormatter.cs +System.Web.UI/ObjectTagBuilder.cs +System.Web.UI/ObjectTag.cs +System.Web.UI/OutputCacheLocation.cs +System.Web.UI/OutputCacheParameters.cs +System.Web.UI/Page.cs +System.Web.UI/PageAsyncTask.cs +System.Web.UI/PageHandlerFactory.cs +System.Web.UI/PageLifeCycle.cs +System.Web.UI/PageParser.cs +System.Web.UI/PageParserFilter.cs +System.Web.UI/PageStatePersister.cs +System.Web.UI/PageTheme.cs +System.Web.UI/PageThemeBuilder.cs +System.Web.UI/PageThemeFileParser.cs +System.Web.UI/PageThemeParser.cs +System.Web.UI/Pair.cs +System.Web.UI/ParseChildrenAttribute.cs +System.Web.UI/PartialCachingAttribute.cs +System.Web.UI/PartialCachingControl.cs +System.Web.UI/PersistChildrenAttribute.cs +System.Web.UI/PersistenceModeAttribute.cs +System.Web.UI/PersistenceMode.cs +System.Web.UI/PostBackOptions.cs +System.Web.UI/PropertyConverter.cs +System.Web.UI/PropertyEntry.cs +System.Web.UI/ReadOnlyDataSourceView.cs +System.Web.UI/RenderMethod.cs +System.Web.UI/ResourceBasedLiteralControl.cs +System.Web.UI/RootBuilder.cs +System.Web.UI/SessionPageStatePersister.cs +System.Web.UI/SimpleHandlerFactory.cs +System.Web.UI/SimplePropertyEntry.cs +System.Web.UI/SimpleWebHandlerParser.cs +System.Web.UI/SkinBuilder.cs +System.Web.UI/StateBag.cs +System.Web.UI/StateItem.cs +System.Web.UI/StateManagedCollection.cs +System.Web.UI/StaticPartialCachingControl.cs +System.Web.UI/StringPropertyBuilder.cs +System.Web.UI/SupportsEventValidationAttribute.cs +System.Web.UI/TagPrefixAttribute.cs +System.Web.UI/TemplateBuilder.cs +System.Web.UI/TemplateContainerAttribute.cs +System.Web.UI/TemplateControl.cs +System.Web.UI/TemplateControlParser.cs +System.Web.UI/TemplateInstance.cs +System.Web.UI/TemplateInstanceAttribute.cs +System.Web.UI/TemplateParser.cs +System.Web.UI/TemplatePropertyEntry.cs +System.Web.UI/ThemeableAttribute.cs +System.Web.UI/ThemeProvider.cs +System.Web.UI/ToolboxDataAttribute.cs +System.Web.UI/Triplet.cs +System.Web.UI/UnknownAttributeDescriptor.cs +System.Web.UI/UrlPropertyAttribute.cs +System.Web.UI/UserControlControlBuilder.cs +System.Web.UI/UserControl.cs +System.Web.UI/UserControlParser.cs +System.Web.UI/ValidationPropertyAttribute.cs +System.Web.UI/ValidatorCollection.cs +System.Web.UI/VerificationAttribute.cs +System.Web.UI/VerificationConditionalOperator.cs +System.Web.UI/VerificationReportLevel.cs +System.Web.UI/VerificationRule.cs +System.Web.UI/ViewStateEncryptionMode.cs +System.Web.UI/ViewStateException.cs +System.Web.UI/ViewStateModeByIdAttribute.cs +System.Web.UI/VirtualReferenceType.cs +System.Web.UI.WebControls.Adapters/DataBoundControlAdapter.cs +System.Web.UI.WebControls.Adapters/HideDisabledControlAdapter.cs +System.Web.UI.WebControls.Adapters/HierarchicalDataBoundControlAdapter.cs +System.Web.UI.WebControls.Adapters/MenuAdapter.cs +System.Web.UI.WebControls.Adapters/WebControlAdapter.cs +System.Web.UI.WebControls/AccessDataSource.cs +System.Web.UI.WebControls/AccessDataSourceView.cs +System.Web.UI.WebControls/AdCreatedEventArgs.cs +System.Web.UI.WebControls/AdCreatedEventHandler.cs +System.Web.UI.WebControls/AdRotator.cs +System.Web.UI.WebControls/AssociatedControlConverter.cs +System.Web.UI.WebControls/AuthenticateEventArgs.cs +System.Web.UI.WebControls/AuthenticateEventHandler.cs +System.Web.UI.WebControls/AutoCompleteType.cs +System.Web.UI.WebControls/AutoGeneratedField.cs +System.Web.UI.WebControls/AutoGeneratedFieldProperties.cs +System.Web.UI.WebControls/BaseCompareValidator.cs +System.Web.UI.WebControls/BaseDataBoundControl.cs +System.Web.UI.WebControls/BaseDataList.cs +System.Web.UI.WebControls/BaseValidator.cs +System.Web.UI.WebControls/BorderStyle.cs +System.Web.UI.WebControls/BoundColumn.cs +System.Web.UI.WebControls/BoundField.cs +System.Web.UI.WebControls/BulletedList.cs +System.Web.UI.WebControls/BulletedListDisplayMode.cs +System.Web.UI.WebControls/BulletedListEventArgs.cs +System.Web.UI.WebControls/BulletedListEventHandler.cs +System.Web.UI.WebControls/BulletStyle.cs +System.Web.UI.WebControls/ButtonColumn.cs +System.Web.UI.WebControls/ButtonColumnType.cs +System.Web.UI.WebControls/Button.cs +System.Web.UI.WebControls/ButtonFieldBase.cs +System.Web.UI.WebControls/ButtonField.cs +System.Web.UI.WebControls/ButtonType.cs +System.Web.UI.WebControls/Calendar.cs +System.Web.UI.WebControls/CalendarDay.cs +System.Web.UI.WebControls/CalendarSelectionMode.cs +System.Web.UI.WebControls/ChangePassword.cs +System.Web.UI.WebControls/CheckBox.cs +System.Web.UI.WebControls/CheckBoxField.cs +System.Web.UI.WebControls/CheckBoxList.cs +System.Web.UI.WebControls/ChildTable.cs +System.Web.UI.WebControls/CircleHotSpot.cs +System.Web.UI.WebControls/CollectionDataSource.cs +System.Web.UI.WebControls/CommandEventArgs.cs +System.Web.UI.WebControls/CommandEventHandler.cs +System.Web.UI.WebControls/CommandField.cs +System.Web.UI.WebControls/CompareValidator.cs +System.Web.UI.WebControls/CompleteWizardStep.cs +System.Web.UI.WebControls/CompositeControl.cs +System.Web.UI.WebControls/CompositeDataBoundControl.cs +System.Web.UI.WebControls/ContainedTable.cs +System.Web.UI.WebControls/ContentControlBuilderInternal.cs +System.Web.UI.WebControls/Content.cs +System.Web.UI.WebControls/ContentDirection.cs +System.Web.UI.WebControls/ContentPlaceHolderBuilder.cs +System.Web.UI.WebControls/ContentPlaceHolder.cs +System.Web.UI.WebControls/ControlIDConverter.cs +System.Web.UI.WebControls/ControlParameter.cs +System.Web.UI.WebControls/ControlPropertyNameConverter.cs +System.Web.UI.WebControls/CookieParameter.cs +System.Web.UI.WebControls/CreateUserErrorEventArgs.cs +System.Web.UI.WebControls/CreateUserErrorEventHandler.cs +System.Web.UI.WebControls/CreateUserWizard.cs +System.Web.UI.WebControls/CreateUserWizardStep.cs +System.Web.UI.WebControls/CustomValidator.cs +System.Web.UI.WebControls/DataBoundControl.cs +System.Web.UI.WebControls/DataBoundControlMode.cs +System.Web.UI.WebControls/DataControlButton.cs +System.Web.UI.WebControls/DataControlCellType.cs +System.Web.UI.WebControls/DataControlCommands.cs +System.Web.UI.WebControls/DataControlFieldCell.cs +System.Web.UI.WebControls/DataControlFieldCollection.cs +System.Web.UI.WebControls/DataControlField.cs +System.Web.UI.WebControls/DataControlFieldHeaderCell.cs +System.Web.UI.WebControls/DataControlRowState.cs +System.Web.UI.WebControls/DataControlRowType.cs +System.Web.UI.WebControls/DataGridColumnCollection.cs +System.Web.UI.WebControls/DataGridColumn.cs +System.Web.UI.WebControls/DataGridCommandEventArgs.cs +System.Web.UI.WebControls/DataGridCommandEventHandler.cs +System.Web.UI.WebControls/DataGrid.cs +System.Web.UI.WebControls/DataGridItemCollection.cs +System.Web.UI.WebControls/DataGridItem.cs +System.Web.UI.WebControls/DataGridItemEventArgs.cs +System.Web.UI.WebControls/DataGridItemEventHandler.cs +System.Web.UI.WebControls/DataGridPageChangedEventArgs.cs +System.Web.UI.WebControls/DataGridPageChangedEventHandler.cs +System.Web.UI.WebControls/DataGridPagerStyle.cs +System.Web.UI.WebControls/DataGridSortCommandEventArgs.cs +System.Web.UI.WebControls/DataGridSortCommandEventHandler.cs +System.Web.UI.WebControls/DataKeyArray.cs +System.Web.UI.WebControls/DataKeyCollection.cs +System.Web.UI.WebControls/DataKey.cs +System.Web.UI.WebControls/DataListCommandEventArgs.cs +System.Web.UI.WebControls/DataListCommandEventHandler.cs +System.Web.UI.WebControls/DataList.cs +System.Web.UI.WebControls/DataListItemCollection.cs +System.Web.UI.WebControls/DataListItem.cs +System.Web.UI.WebControls/DataListItemEventArgs.cs +System.Web.UI.WebControls/DataListItemEventHandler.cs +System.Web.UI.WebControls/DataSourceCacheManager.cs +System.Web.UI.WebControls/DayNameFormat.cs +System.Web.UI.WebControls/DayRenderEventArgs.cs +System.Web.UI.WebControls/DayRenderEventHandler.cs +System.Web.UI.WebControls/DetailsViewCommandEventArgs.cs +System.Web.UI.WebControls/DetailsViewCommandEventHandler.cs +System.Web.UI.WebControls/DetailsView.cs +System.Web.UI.WebControls/DetailsViewDeletedEventArgs.cs +System.Web.UI.WebControls/DetailsViewDeletedEventHandler.cs +System.Web.UI.WebControls/DetailsViewDeleteEventArgs.cs +System.Web.UI.WebControls/DetailsViewDeleteEventHandler.cs +System.Web.UI.WebControls/DetailsViewInsertedEventArgs.cs +System.Web.UI.WebControls/DetailsViewInsertedEventHandler.cs +System.Web.UI.WebControls/DetailsViewInsertEventArgs.cs +System.Web.UI.WebControls/DetailsViewInsertEventHandler.cs +System.Web.UI.WebControls/DetailsViewMode.cs +System.Web.UI.WebControls/DetailsViewModeEventArgs.cs +System.Web.UI.WebControls/DetailsViewModeEventHandler.cs +System.Web.UI.WebControls/DetailsViewPageEventArgs.cs +System.Web.UI.WebControls/DetailsViewPageEventHandler.cs +System.Web.UI.WebControls/DetailsViewPagerRow.cs +System.Web.UI.WebControls/DetailsViewRowCollection.cs +System.Web.UI.WebControls/DetailsViewRow.cs +System.Web.UI.WebControls/DetailsViewUpdatedEventArgs.cs +System.Web.UI.WebControls/DetailsViewUpdatedEventHandler.cs +System.Web.UI.WebControls/DetailsViewUpdateEventArgs.cs +System.Web.UI.WebControls/DetailsViewUpdateEventHandler.cs +System.Web.UI.WebControls/DropDownList.cs +System.Web.UI.WebControls/EditCommandColumn.cs +System.Web.UI.WebControls/EmbeddedMailObject.cs +System.Web.UI.WebControls/EmbeddedMailObjectsCollection.cs +System.Web.UI.WebControls/FileUpload.cs +System.Web.UI.WebControls/FirstDayOfWeek.cs +System.Web.UI.WebControls/FontInfo.cs +System.Web.UI.WebControls/FontNamesConverter.cs +System.Web.UI.WebControls/FontSize.cs +System.Web.UI.WebControls/FontUnitConverter.cs +System.Web.UI.WebControls/FontUnit.cs +System.Web.UI.WebControls/FormParameter.cs +System.Web.UI.WebControls/FormViewCommandEventArgs.cs +System.Web.UI.WebControls/FormViewCommandEventHandler.cs +System.Web.UI.WebControls/FormView.cs +System.Web.UI.WebControls/FormViewDeletedEventArgs.cs +System.Web.UI.WebControls/FormViewDeletedEventHandler.cs +System.Web.UI.WebControls/FormViewDeleteEventArgs.cs +System.Web.UI.WebControls/FormViewDeleteEventHandler.cs +System.Web.UI.WebControls/FormViewInsertedEventArgs.cs +System.Web.UI.WebControls/FormViewInsertedEventHandler.cs +System.Web.UI.WebControls/FormViewInsertEventArgs.cs +System.Web.UI.WebControls/FormViewInsertEventHandler.cs +System.Web.UI.WebControls/FormViewMode.cs +System.Web.UI.WebControls/FormViewModeEventArgs.cs +System.Web.UI.WebControls/FormViewModeEventHandler.cs +System.Web.UI.WebControls/FormViewPageEventArgs.cs +System.Web.UI.WebControls/FormViewPageEventHandler.cs +System.Web.UI.WebControls/FormViewRow.cs +System.Web.UI.WebControls/FormViewPagerRow.cs +System.Web.UI.WebControls/FormViewUpdatedEventArgs.cs +System.Web.UI.WebControls/FormViewUpdatedEventHandler.cs +System.Web.UI.WebControls/FormViewUpdateEventArgs.cs +System.Web.UI.WebControls/FormViewUpdateEventHandler.cs +System.Web.UI.WebControls/GridLines.cs +System.Web.UI.WebControls/GridViewCancelEditEventArgs.cs +System.Web.UI.WebControls/GridViewCancelEditEventHandler.cs +System.Web.UI.WebControls/GridViewCommandEventArgs.cs +System.Web.UI.WebControls/GridViewCommandEventHandler.cs +System.Web.UI.WebControls/GridView.cs +System.Web.UI.WebControls/GridViewDeletedEventArgs.cs +System.Web.UI.WebControls/GridViewDeletedEventHandler.cs +System.Web.UI.WebControls/GridViewDeleteEventArgs.cs +System.Web.UI.WebControls/GridViewDeleteEventHandler.cs +System.Web.UI.WebControls/GridViewEditEventArgs.cs +System.Web.UI.WebControls/GridViewEditEventHandler.cs +System.Web.UI.WebControls/GridViewPageEventArgs.cs +System.Web.UI.WebControls/GridViewPageEventHandler.cs +System.Web.UI.WebControls/GridViewRowCollection.cs +System.Web.UI.WebControls/GridViewRow.cs +System.Web.UI.WebControls/GridViewRowEventArgs.cs +System.Web.UI.WebControls/GridViewRowEventHandler.cs +System.Web.UI.WebControls/GridViewSelectEventArgs.cs +System.Web.UI.WebControls/GridViewSelectEventHandler.cs +System.Web.UI.WebControls/GridViewSortEventArgs.cs +System.Web.UI.WebControls/GridViewSortEventHandler.cs +System.Web.UI.WebControls/GridViewUpdatedEventArgs.cs +System.Web.UI.WebControls/GridViewUpdatedEventHandler.cs +System.Web.UI.WebControls/GridViewUpdateEventArgs.cs +System.Web.UI.WebControls/GridViewUpdateEventHandler.cs +System.Web.UI.WebControls/HiddenField.cs +System.Web.UI.WebControls/HierarchicalDataBoundControl.cs +System.Web.UI.WebControls/HorizontalAlignConverter.cs +System.Web.UI.WebControls/HorizontalAlign.cs +System.Web.UI.WebControls/HotSpotCollection.cs +System.Web.UI.WebControls/HotSpot.cs +System.Web.UI.WebControls/HotSpotMode.cs +System.Web.UI.WebControls/HyperLinkColumn.cs +System.Web.UI.WebControls/HyperLinkControlBuilder.cs +System.Web.UI.WebControls/HyperLink.cs +System.Web.UI.WebControls/HyperLinkField.cs +System.Web.UI.WebControls/IButtonControl.cs +System.Web.UI.WebControls/ICallbackContainer.cs +System.Web.UI.WebControls/ICompositeControlDesignerAccessor.cs +System.Web.UI.WebControls/IDataBoundControl.cs +System.Web.UI.WebControls/IDataBoundItemControl.cs +System.Web.UI.WebControls/IDataBoundListControl.cs +System.Web.UI.WebControls/IFieldControl.cs +System.Web.UI.WebControls/ImageAlign.cs +System.Web.UI.WebControls/ImageButton.cs +System.Web.UI.WebControls/Image.cs +System.Web.UI.WebControls/ImageField.cs +System.Web.UI.WebControls/ImageMap.cs +System.Web.UI.WebControls/ImageMapEventArgs.cs +System.Web.UI.WebControls/ImageMapEventHandler.cs +System.Web.UI.WebControls/IPersistedSelector.cs +System.Web.UI.WebControls/IPostBackContainer.cs +System.Web.UI.WebControls/IRepeatInfoUser.cs +System.Web.UI.WebControls/LabelControlBuilder.cs +System.Web.UI.WebControls/Label.cs +System.Web.UI.WebControls/LinkButtonControlBuilder.cs +System.Web.UI.WebControls/LinkButton.cs +System.Web.UI.WebControls/ListBox.cs +System.Web.UI.WebControls/ListControl.cs +System.Web.UI.WebControls/ListItemCollection.cs +System.Web.UI.WebControls/ListItemControlBuilder.cs +System.Web.UI.WebControls/ListItem.cs +System.Web.UI.WebControls/ListItemType.cs +System.Web.UI.WebControls/ListSelectionMode.cs +System.Web.UI.WebControls/LiteralControlBuilder.cs +System.Web.UI.WebControls/Literal.cs +System.Web.UI.WebControls/LiteralMode.cs +System.Web.UI.WebControls/Localize.cs +System.Web.UI.WebControls/Login.cs +System.Web.UI.WebControls/LoginCancelEventArgs.cs +System.Web.UI.WebControls/LoginCancelEventHandler.cs +System.Web.UI.WebControls/LoginFailureAction.cs +System.Web.UI.WebControls/LoginName.cs +System.Web.UI.WebControls/LoginStatus.cs +System.Web.UI.WebControls/LoginTextLayout.cs +System.Web.UI.WebControls/LoginView.cs +System.Web.UI.WebControls/LogoutAction.cs +System.Web.UI.WebControls/MailDefinition.cs +System.Web.UI.WebControls/MailMessageEventArgs.cs +System.Web.UI.WebControls/MailMessageEventHandler.cs +System.Web.UI.WebControls/Menu.cs +System.Web.UI.WebControls/MenuEventArgs.cs +System.Web.UI.WebControls/MenuEventHandler.cs +System.Web.UI.WebControls/MenuItemBindingCollection.cs +System.Web.UI.WebControls/MenuItemBinding.cs +System.Web.UI.WebControls/MenuItemCollection.cs +System.Web.UI.WebControls/MenuItem.cs +System.Web.UI.WebControls/MenuItemStyleCollection.cs +System.Web.UI.WebControls/MenuItemStyle.cs +System.Web.UI.WebControls/MenuItemTemplateContainer.cs +System.Web.UI.WebControls/MonthChangedEventArgs.cs +System.Web.UI.WebControls/MonthChangedEventHandler.cs +System.Web.UI.WebControls/MultiView.cs +System.Web.UI.WebControls/NextPrevFormat.cs +System.Web.UI.WebControls/ObjectDataSource.cs +System.Web.UI.WebControls/ObjectDataSourceDisposingEventArgs.cs +System.Web.UI.WebControls/ObjectDataSourceDisposingEventHandler.cs +System.Web.UI.WebControls/ObjectDataSourceEventArgs.cs +System.Web.UI.WebControls/ObjectDataSourceEventHandler.cs +System.Web.UI.WebControls/ObjectDataSourceFilteringEventArgs.cs +System.Web.UI.WebControls/ObjectDataSourceFilteringEventHandler.cs +System.Web.UI.WebControls/ObjectDataSourceMethodEventArgs.cs +System.Web.UI.WebControls/ObjectDataSourceMethodEventHandler.cs +System.Web.UI.WebControls/ObjectDataSourceSelectingEventArgs.cs +System.Web.UI.WebControls/ObjectDataSourceSelectingEventHandler.cs +System.Web.UI.WebControls/ObjectDataSourceStatusEventArgs.cs +System.Web.UI.WebControls/ObjectDataSourceStatusEventHandler.cs +System.Web.UI.WebControls/ObjectDataSourceView.cs +System.Web.UI.WebControls/Orientation.cs +System.Web.UI.WebControls/PagedDataSource.cs +System.Web.UI.WebControls/PagerButtons.cs +System.Web.UI.WebControls/PagerMode.cs +System.Web.UI.WebControls/PagerPosition.cs +System.Web.UI.WebControls/PagerSettings.cs +System.Web.UI.WebControls/Panel.cs +System.Web.UI.WebControls/PanelStyle.cs +System.Web.UI.WebControls/ParameterCollection.cs +System.Web.UI.WebControls/Parameter.cs +System.Web.UI.WebControls/PasswordRecovery.cs +System.Web.UI.WebControls/PathDirection.cs +System.Web.UI.WebControls/PlaceHolderControlBuilder.cs +System.Web.UI.WebControls/PlaceHolder.cs +System.Web.UI.WebControls/PolygonHotSpot.cs +System.Web.UI.WebControls/ProfileParameter.cs +System.Web.UI.WebControls/QueryStringParameter.cs +System.Web.UI.WebControls/RadioButton.cs +System.Web.UI.WebControls/RadioButtonList.cs +System.Web.UI.WebControls/RangeValidator.cs +System.Web.UI.WebControls/RectangleHotSpot.cs +System.Web.UI.WebControls/RegularExpressionValidator.cs +System.Web.UI.WebControls/RepeatDirection.cs +System.Web.UI.WebControls/RepeaterCommandEventArgs.cs +System.Web.UI.WebControls/RepeaterCommandEventHandler.cs +System.Web.UI.WebControls/Repeater.cs +System.Web.UI.WebControls/RepeaterItemCollection.cs +System.Web.UI.WebControls/RepeaterItem.cs +System.Web.UI.WebControls/RepeaterItemEventArgs.cs +System.Web.UI.WebControls/RepeaterItemEventHandler.cs +System.Web.UI.WebControls/RepeatInfo.cs +System.Web.UI.WebControls/RepeatLayout.cs +System.Web.UI.WebControls/RequiredFieldValidator.cs +System.Web.UI.WebControls/RoleGroup.cs +System.Web.UI.WebControls/RoleGroupCollection.cs +System.Web.UI.WebControls/ScrollBars.cs +System.Web.UI.WebControls/SelectedDatesCollection.cs +System.Web.UI.WebControls/SendMailErrorEventArgs.cs +System.Web.UI.WebControls/SendMailErrorEventHandler.cs +System.Web.UI.WebControls/ServerValidateEventArgs.cs +System.Web.UI.WebControls/ServerValidateEventHandler.cs +System.Web.UI.WebControls/SessionParameter.cs +System.Web.UI.WebControls/SiteMapDataSource.cs +System.Web.UI.WebControls/SiteMapDataSourceView.cs +System.Web.UI.WebControls/SiteMapHierarchicalDataSourceView.cs +System.Web.UI.WebControls/SiteMapNodeItem.cs +System.Web.UI.WebControls/SiteMapNodeItemEventArgs.cs +System.Web.UI.WebControls/SiteMapNodeItemEventHandler.cs +System.Web.UI.WebControls/SiteMapNodeItemType.cs +System.Web.UI.WebControls/SiteMapPath.cs +System.Web.UI.WebControls/SortDirection.cs +System.Web.UI.WebControls/SqlDataSourceCommandEventArgs.cs +System.Web.UI.WebControls/SqlDataSourceCommandEventHandler.cs +System.Web.UI.WebControls/SqlDataSourceCommandType.cs +System.Web.UI.WebControls/SqlDataSourceFilteringEventHandler.cs +System.Web.UI.WebControls/SqlDataSourceFilteringEventArgs.cs +System.Web.UI.WebControls/SqlDataSource.cs +System.Web.UI.WebControls/SqlDataSourceMode.cs +System.Web.UI.WebControls/SqlDataSourceSelectingEventHandler.cs +System.Web.UI.WebControls/SqlDataSourceSelectingEventArgs.cs +System.Web.UI.WebControls/SqlDataSourceStatusEventArgs.cs +System.Web.UI.WebControls/SqlDataSourceStatusEventHandler.cs +System.Web.UI.WebControls/SqlDataSourceView.cs +System.Web.UI.WebControls/StringArrayConverter.cs +System.Web.UI.WebControls/Style.cs +System.Web.UI.WebControls/SubMenuStyleCollection.cs +System.Web.UI.WebControls/SubMenuStyle.cs +System.Web.UI.WebControls/Substitution.cs +System.Web.UI.WebControls/TableCaptionAlign.cs +System.Web.UI.WebControls/TableCellCollection.cs +System.Web.UI.WebControls/TableCellControlBuilder.cs +System.Web.UI.WebControls/TableCell.cs +System.Web.UI.WebControls/Table.cs +System.Web.UI.WebControls/TableFooterRow.cs +System.Web.UI.WebControls/TableHeaderCell.cs +System.Web.UI.WebControls/TableHeaderRow.cs +System.Web.UI.WebControls/TableHeaderScope.cs +System.Web.UI.WebControls/TableItemStyle.cs +System.Web.UI.WebControls/TableRowCollection.cs +System.Web.UI.WebControls/TableRow.cs +System.Web.UI.WebControls/TableRowSection.cs +System.Web.UI.WebControls/TableSectionStyle.cs +System.Web.UI.WebControls/TableStyle.cs +System.Web.UI.WebControls/TargetConverter.cs +System.Web.UI.WebControls/TemplateColumn.cs +System.Web.UI.WebControls/TemplatedWizardStep.cs +System.Web.UI.WebControls/TemplateField.cs +System.Web.UI.WebControls/TextAlign.cs +System.Web.UI.WebControls/TextBoxControlBuilder.cs +System.Web.UI.WebControls/TextBox.cs +System.Web.UI.WebControls/TextBoxMode.cs +System.Web.UI.WebControls/TitleFormat.cs +System.Web.UI.WebControls/TreeNodeBindingCollection.cs +System.Web.UI.WebControls/TreeNodeBinding.cs +System.Web.UI.WebControls/TreeNodeCollection.cs +System.Web.UI.WebControls/TreeNode.cs +System.Web.UI.WebControls/TreeNodeEventArgs.cs +System.Web.UI.WebControls/TreeNodeEventHandler.cs +System.Web.UI.WebControls/TreeNodeSelectAction.cs +System.Web.UI.WebControls/TreeNodeStyleCollection.cs +System.Web.UI.WebControls/TreeNodeStyle.cs +System.Web.UI.WebControls/TreeNodeTypes.cs +System.Web.UI.WebControls/TreeView.cs +System.Web.UI.WebControls/TreeViewImageSet.cs +System.Web.UI.WebControls/UnitConverter.cs +System.Web.UI.WebControls/Unit.cs +System.Web.UI.WebControls/UnitType.cs +System.Web.UI.WebControls/ValidatedControlConverter.cs +System.Web.UI.WebControls/ValidationCompareOperator.cs +System.Web.UI.WebControls/ValidationDataType.cs +System.Web.UI.WebControls/ValidationSummary.cs +System.Web.UI.WebControls/ValidationSummaryDisplayMode.cs +System.Web.UI.WebControls/ValidatorDisplay.cs +System.Web.UI.WebControls/VerticalAlignConverter.cs +System.Web.UI.WebControls/VerticalAlign.cs +System.Web.UI.WebControls/ViewCollection.cs +System.Web.UI.WebControls/View.cs +System.Web.UI.WebControls/WebColorConverter.cs +System.Web.UI.WebControls/WebControl.cs +System.Web.UI.WebControls.WebParts/ConnectionConsumerCallback.cs +System.Web.UI.WebControls.WebParts/ConnectionInterfaceCollection.cs +System.Web.UI.WebControls.WebParts/ConnectionPoint.cs +System.Web.UI.WebControls.WebParts/ConnectionPointType.cs +System.Web.UI.WebControls.WebParts/ConnectionProviderCallback.cs +System.Web.UI.WebControls.WebParts/ConsumerConnectionPoint.cs +System.Web.UI.WebControls.WebParts/EditorPart.cs +System.Web.UI.WebControls.WebParts/EditorPartCollection.cs +System.Web.UI.WebControls.WebParts/IPersonalizable.cs +System.Web.UI.WebControls.WebParts/ITrackingPersonalizable.cs +System.Web.UI.WebControls.WebParts/ITransformerConfigurationControl.cs +System.Web.UI.WebControls.WebParts/IVersioningPersonalizable.cs +System.Web.UI.WebControls.WebParts/IWebActionable.cs +System.Web.UI.WebControls.WebParts/IWebEditable.cs +System.Web.UI.WebControls.WebParts/IWebPart.cs +System.Web.UI.WebControls.WebParts/IWebPartField.cs +System.Web.UI.WebControls.WebParts/IWebPartParameters.cs +System.Web.UI.WebControls.WebParts/IWebPartRow.cs +System.Web.UI.WebControls.WebParts/IWebPartTable.cs +System.Web.UI.WebControls.WebParts/Part.cs +System.Web.UI.WebControls.WebParts/PartChromeState.cs +System.Web.UI.WebControls.WebParts/PartChromeType.cs +System.Web.UI.WebControls.WebParts/PersonalizableAttribute.cs +System.Web.UI.WebControls.WebParts/PersonalizationScope.cs +System.Web.UI.WebControls.WebParts/ProviderConnectionPoint.cs +System.Web.UI.WebControls.WebParts/TypeCollection.cs +System.Web.UI.WebControls.WebParts/WebPart.cs +System.Web.UI.WebControls.WebParts/WebPartAuthorizationEventArgs.cs +System.Web.UI.WebControls.WebParts/WebPartAuthorizationEventHandler.cs +System.Web.UI.WebControls.WebParts/WebPartCancelEventArgs.cs +System.Web.UI.WebControls.WebParts/WebPartCancelEventHandler.cs +System.Web.UI.WebControls.WebParts/WebPartEventArgs.cs +System.Web.UI.WebControls.WebParts/WebPartEventHandler.cs +System.Web.UI.WebControls.WebParts/WebPartExportMode.cs +System.Web.UI.WebControls.WebParts/WebPartHelpMode.cs +System.Web.UI.WebControls.WebParts/WebPartPageMenuMode.cs +System.Web.UI.WebControls.WebParts/WebPartVerbCollection.cs +System.Web.UI.WebControls.WebParts/WebPartVerb.cs +System.Web.UI.WebControls.WebParts/WebPartVerbsEventArgs.cs +System.Web.UI.WebControls.WebParts/WebPartVerbsEventHandler.cs +System.Web.UI.WebControls/Wizard.cs +System.Web.UI.WebControls/WizardNavigationEventArgs.cs +System.Web.UI.WebControls/WizardNavigationEventHandler.cs +System.Web.UI.WebControls/WizardStepBase.cs +System.Web.UI.WebControls/WizardStepCollection.cs +System.Web.UI.WebControls/WizardStepControlBuilder.cs +System.Web.UI.WebControls/WizardStep.cs +System.Web.UI.WebControls/WizardStepType.cs +System.Web.UI.WebControls/XmlBuilder.cs +System.Web.UI.WebControls/Xml.cs +System.Web.UI.WebControls/XmlDataSource.cs +System.Web.UI.WebControls/XmlDataSourceNodeDescriptor.cs +System.Web.UI.WebControls/XmlDataSourcePropertyDescriptor.cs +System.Web.UI.WebControls/XmlDataSourceView.cs +System.Web.UI.WebControls/XmlHierarchicalDataSourceView.cs +System.Web.UI.WebControls/XmlHierarchicalEnumerable.cs +System.Web.UI.WebControls/XmlHierarchyData.cs +System.Web.UI/WebHandlerParser.cs +System.Web.UI/WebResourceAttribute.cs +System.Web.UI/WebServiceParser.cs +System.Web.UI/XhtmlMobileDocType.cs +System.Web.UI/XhtmlTextWriter.cs +System.Web.UI/XPathBinder.cs +System.Web.Util/AltSerialization.cs +System.Web.Util/DataSourceHelper.cs +System.Web.Util/DataSourceResolver.cs +System.Web.Util/FileUtils.cs +System.Web.Util/ICalls.cs +System.Web.Util/IWebObjectFactory.cs +System.Web.Util/IWebPropertyAccessor.cs +System.Web.Util/SearchPattern.cs +System.Web.Util/SerializationHelper.cs +System.Web.Util/StrUtils.cs +System.Web.Util/TimeUtil.cs +System.Web.Util/TransactedCallback.cs +System.Web.Util/Transactions.cs +System.Web.Util/UrlUtils.cs +System.Web.Util/WebEncoding.cs +System.Web.Util/WebTrace.cs +System.Web.Util/WorkItemCallback.cs +System.Web.Util/WorkItem.cs +System.Web/VirtualPath.cs +System.Web/VirtualPathUtility.cs +System.Web/WebCategoryAttribute.cs +System.Web/WebPageTraceListener.cs +System.Web/WebROCollection.cs +System.Web/WebSysDescriptionAttribute.cs +System.Web/XmlSiteMapProvider.cs + +../System.Web.Routing/System.Web.Routing/HttpMethodConstraint.cs +../System.Web.Routing/System.Web.Routing/IRouteConstraint.cs +../System.Web.Routing/System.Web.Routing/IRouteHandler.cs +../System.Web.Routing/System.Web.Routing/PatternParser.cs +../System.Web.Routing/System.Web.Routing/PatternToken.cs +../System.Web.Routing/System.Web.Routing/PatternTokenType.cs +../System.Web.Routing/System.Web.Routing/RequestContext.cs +../System.Web.Routing/System.Web.Routing/Route.cs +../System.Web.Routing/System.Web.Routing/RouteBase.cs +../System.Web.Routing/System.Web.Routing/RouteCollection.cs +../System.Web.Routing/System.Web.Routing/RouteData.cs +../System.Web.Routing/System.Web.Routing/RouteDirection.cs +../System.Web.Routing/System.Web.Routing/RouteTable.cs +../System.Web.Routing/System.Web.Routing/RouteValueDictionary.cs +../System.Web.Routing/System.Web.Routing/RouteValueDictionaryExtensions.cs +../System.Web.Routing/System.Web.Routing/StopRoutingHandler.cs +../System.Web.Routing/System.Web.Routing/UrlRoutingHandler.cs +../System.Web.Routing/System.Web.Routing/UrlRoutingModule.cs +../System.Web.Routing/System.Web.Routing/VirtualPathData.cs + +../System.Web.Abstractions/System.Web/HttpApplicationStateBase.cs +../System.Web.Abstractions/System.Web/HttpApplicationStateWrapper.cs +../System.Web.Abstractions/System.Web/HttpBrowserCapabilitiesBase.cs +../System.Web.Abstractions/System.Web/HttpBrowserCapabilitiesWrapper.cs +../System.Web.Abstractions/System.Web/HttpCachePolicyBase.cs +../System.Web.Abstractions/System.Web/HttpCachePolicyWrapper.cs +../System.Web.Abstractions/System.Web/HttpContextBase.cs +../System.Web.Abstractions/System.Web/HttpContextWrapper.cs +../System.Web.Abstractions/System.Web/HttpFileCollectionBase.cs +../System.Web.Abstractions/System.Web/HttpFileCollectionWrapper.cs +../System.Web.Abstractions/System.Web/HttpPostedFileBase.cs +../System.Web.Abstractions/System.Web/HttpPostedFileWrapper.cs +../System.Web.Abstractions/System.Web/HttpRequestBase.cs +../System.Web.Abstractions/System.Web/HttpRequestWrapper.cs +../System.Web.Abstractions/System.Web/HttpResponseBase.cs +../System.Web.Abstractions/System.Web/HttpResponseWrapper.cs +../System.Web.Abstractions/System.Web/HttpServerUtilityBase.cs +../System.Web.Abstractions/System.Web/HttpServerUtilityWrapper.cs +../System.Web.Abstractions/System.Web/HttpSessionStateBase.cs +../System.Web.Abstractions/System.Web/HttpSessionStateWrapper.cs +../System.Web.Abstractions/System.Web/HttpStaticObjectsCollectionBase.cs +../System.Web.Abstractions/System.Web/HttpStaticObjectsCollectionWrapper.cs diff --git a/mcs/class/System.XML/Test/System.Xml.Schema/ChangeLog b/mcs/class/System.XML/Test/System.Xml.Schema/ChangeLog index bbab16234d6..924c81fe12a 100644 --- a/mcs/class/System.XML/Test/System.Xml.Schema/ChangeLog +++ b/mcs/class/System.XML/Test/System.Xml.Schema/ChangeLog @@ -1,3 +1,18 @@ +2009-07-09 Gert Driesen + + * XmlSchemaTests.cs: Fixed tests for bug #502115. + +2009-07-09 Atsushi Enomoto + + * XmlSchemaTests.cs : disabled wrong tests. I will revert them + unless it gets better shape. + +2009-06-23 Atsushi Enomoto + + * XmlSchemaAssertion.cs, XmlSchemaTests.cs : migrate from Assertion + to Assert (it still uses XmlSchemaAssertion as the base class, + but XmlSchemaAssertion is not based on Assertion anymore). + 2009-05-21 Gert Driesen * XmlSchemaTests.cs: added tests for bug #502115. diff --git a/mcs/class/System.XML/Test/System.Xml.Schema/XmlSchemaAssertion.cs b/mcs/class/System.XML/Test/System.Xml.Schema/XmlSchemaAssertion.cs index 7e55ed0ed77..d614b39bf8e 100644 --- a/mcs/class/System.XML/Test/System.Xml.Schema/XmlSchemaAssertion.cs +++ b/mcs/class/System.XML/Test/System.Xml.Schema/XmlSchemaAssertion.cs @@ -15,10 +15,9 @@ using NUnit.Framework; namespace MonoTests.System.Xml { - [TestFixture] - public class XmlSchemaAssertion : Assertion + public class XmlSchemaAssertion { - protected XmlSchema GetSchema (string path) + public static XmlSchema GetSchema (string path) { XmlTextReader reader = new XmlTextReader (path); XmlSchema schema = XmlSchema.Read (reader, null); @@ -26,77 +25,77 @@ namespace MonoTests.System.Xml return schema; } - protected XmlQualifiedName QName (string name, string ns) + public static XmlQualifiedName QName (string name, string ns) { return new XmlQualifiedName (name, ns); } - protected void AssertElement (XmlSchemaElement element, + public static void AssertElement (XmlSchemaElement element, string name, XmlQualifiedName refName, string id, XmlQualifiedName schemaTypeName, XmlSchemaType schemaType) { - AssertNotNull (element); - AssertEquals (name, element.Name); - AssertEquals (refName, element.RefName); - AssertEquals (id, element.Id); - AssertEquals (schemaTypeName, element.SchemaTypeName); - AssertEquals (schemaType, element.SchemaType); + Assert.IsNotNull (element); + Assert.AreEqual (name, element.Name); + Assert.AreEqual (refName, element.RefName); + Assert.AreEqual (id, element.Id); + Assert.AreEqual (schemaTypeName, element.SchemaTypeName); + Assert.AreEqual (schemaType, element.SchemaType); } - protected void AssertElementEx (XmlSchemaElement element, + public static void AssertElementEx (XmlSchemaElement element, XmlSchemaDerivationMethod block, XmlSchemaDerivationMethod final, string defaultValue, string fixedValue, XmlSchemaForm form, bool isAbstract, bool isNillable, XmlQualifiedName substGroup) { - AssertNotNull (element); - AssertEquals (block, element.Block); - AssertEquals (final, element.Final); - AssertEquals (defaultValue, element.DefaultValue); - AssertEquals (fixedValue, element.FixedValue); - AssertEquals (form, element.Form); - AssertEquals (isAbstract, element.IsAbstract); - AssertEquals (isNillable, element.IsNillable); - AssertEquals (substGroup, element.SubstitutionGroup); + Assert.IsNotNull (element); + Assert.AreEqual (block, element.Block); + Assert.AreEqual (final, element.Final); + Assert.AreEqual (defaultValue, element.DefaultValue); + Assert.AreEqual (fixedValue, element.FixedValue); + Assert.AreEqual (form, element.Form); + Assert.AreEqual (isAbstract, element.IsAbstract); + Assert.AreEqual (isNillable, element.IsNillable); + Assert.AreEqual (substGroup, element.SubstitutionGroup); } - protected void AssertCompiledComplexType (XmlSchemaComplexType cType, + public static void AssertCompiledComplexType (XmlSchemaComplexType cType, XmlQualifiedName name, int attributesCount, int attributeUsesCount, bool existsAny, Type contentModelType, bool hasContentTypeParticle, XmlSchemaContentType contentType) { - AssertNotNull (cType); - AssertEquals (name.Name, cType.Name); - AssertEquals (name, cType.QualifiedName); - AssertEquals (attributesCount, cType.Attributes.Count); - AssertEquals (attributeUsesCount, cType.AttributeUses.Count); - Assert (existsAny == (cType.AttributeWildcard != null)); + Assert.IsNotNull (cType); + Assert.AreEqual (name.Name, cType.Name); + Assert.AreEqual (name, cType.QualifiedName); + Assert.AreEqual (attributesCount, cType.Attributes.Count); + Assert.AreEqual (attributeUsesCount, cType.AttributeUses.Count); + Assert.IsTrue (existsAny == (cType.AttributeWildcard != null)); if (contentModelType == null) - AssertNull (cType.ContentModel); + Assert.IsNull (cType.ContentModel); else - AssertEquals (contentModelType, cType.ContentModel.GetType ()); - AssertEquals (hasContentTypeParticle, cType.ContentTypeParticle != null); - AssertEquals (contentType, cType.ContentType); + Assert.AreEqual (contentModelType, cType.ContentModel.GetType ()); + Assert.AreEqual (hasContentTypeParticle, cType.ContentTypeParticle != null); + Assert.AreEqual (contentType, cType.ContentType); } - protected void AssertCompiledComplexContentExtension (XmlSchemaComplexContentExtension xccx, + public static void AssertCompiledComplexContentExtension (XmlSchemaComplexContentExtension xccx, int attributeCount, bool hasAnyAttribute, XmlQualifiedName baseTypeName) { - AssertNotNull (xccx); - AssertEquals (attributeCount, xccx.Attributes.Count); - AssertEquals (hasAnyAttribute, xccx.AnyAttribute != null); - AssertEquals (baseTypeName, xccx.BaseTypeName); - AssertNotNull (xccx.Particle); + Assert.IsNotNull (xccx); + Assert.AreEqual (attributeCount, xccx.Attributes.Count); + Assert.AreEqual (hasAnyAttribute, xccx.AnyAttribute != null); + Assert.AreEqual (baseTypeName, xccx.BaseTypeName); + Assert.IsNotNull (xccx.Particle); } - protected void AssertCompiledElement (XmlSchemaElement element, + public static void AssertCompiledElement (XmlSchemaElement element, XmlQualifiedName name, object elementType) { - AssertNotNull (element); - AssertEquals (name, element.QualifiedName); - AssertEquals (elementType, element.ElementType); + Assert.IsNotNull (element); + Assert.AreEqual (name, element.QualifiedName); + Assert.AreEqual (elementType, element.ElementType); } } diff --git a/mcs/class/System.XML/Test/System.Xml.Schema/XmlSchemaTests.cs b/mcs/class/System.XML/Test/System.Xml.Schema/XmlSchemaTests.cs index d719a6a876d..cc8eed201b3 100644 --- a/mcs/class/System.XML/Test/System.Xml.Schema/XmlSchemaTests.cs +++ b/mcs/class/System.XML/Test/System.Xml.Schema/XmlSchemaTests.cs @@ -26,7 +26,7 @@ namespace MonoTests.System.Xml public void TestRead () { XmlSchema schema = GetSchema ("Test/XmlFiles/xsd/1.xsd"); - AssertEquals (6, schema.Items.Count); + Assert.AreEqual (6, schema.Items.Count); bool fooValidated = false; bool barValidated = false; @@ -48,8 +48,8 @@ namespace MonoTests.System.Xml barValidated = true; } } - Assert (fooValidated); - Assert (barValidated); + Assert.IsTrue (fooValidated); + Assert.IsTrue (barValidated); } [Test] @@ -58,12 +58,12 @@ namespace MonoTests.System.Xml XmlSchema schema = GetSchema ("Test/XmlFiles/xsd/2.xsd"); schema.Compile (null); XmlSchemaElement el = schema.Items [0] as XmlSchemaElement; - AssertNotNull (el); - AssertEquals (XmlSchemaDerivationMethod.Extension, el.Block); + Assert.IsNotNull (el); + Assert.AreEqual (XmlSchemaDerivationMethod.Extension, el.Block); el = schema.Items [1] as XmlSchemaElement; - AssertNotNull (el); - AssertEquals (XmlSchemaDerivationMethod.Extension | + Assert.IsNotNull (el); + Assert.AreEqual (XmlSchemaDerivationMethod.Extension | XmlSchemaDerivationMethod.Restriction, el.Block); } @@ -85,33 +85,33 @@ namespace MonoTests.System.Xml XmlSchemaSequence seq; XmlSchema schema = GetSchema ("Test/XmlFiles/xsd/1.xsd"); -// Assert (!schema.IsCompiled); +// Assert.IsTrue (!schema.IsCompiled); schema.Compile (null); - Assert (schema.IsCompiled); + Assert.IsTrue (schema.IsCompiled); string ns = "urn:bar"; XmlSchemaElement foo = (XmlSchemaElement) schema.Elements [QName ("Foo", ns)]; - AssertNotNull (foo); + Assert.IsNotNull (foo); XmlSchemaDatatype stringDatatype = foo.ElementType as XmlSchemaDatatype; - AssertNotNull (stringDatatype); + Assert.IsNotNull (stringDatatype); // HogeType qname = QName ("HogeType", ns); cType = schema.SchemaTypes [qname] as XmlSchemaComplexType; - AssertNotNull (cType); - AssertNull (cType.ContentModel); + Assert.IsNotNull (cType); + Assert.IsNull (cType.ContentModel); AssertCompiledComplexType (cType, qname, 0, 0, false, null, true, XmlSchemaContentType.ElementOnly); seq = cType.ContentTypeParticle as XmlSchemaSequence; - AssertNotNull (seq); - AssertEquals (2, seq.Items.Count); + Assert.IsNotNull (seq); + Assert.AreEqual (2, seq.Items.Count); XmlSchemaElement refFoo = seq.Items [0] as XmlSchemaElement; AssertCompiledElement (refFoo, QName ("Foo", ns), stringDatatype); // FugaType qname = QName ("FugaType", ns); cType = schema.SchemaTypes [qname] as XmlSchemaComplexType; - AssertNotNull (cType); + Assert.IsNotNull (cType); xccx = cType.ContentModel.Content as XmlSchemaComplexContentExtension; AssertCompiledComplexContentExtension ( xccx, 0, false, QName ("HogeType", ns)); @@ -119,13 +119,13 @@ namespace MonoTests.System.Xml AssertCompiledComplexType (cType, qname, 0, 0, false, typeof (XmlSchemaComplexContent), true, XmlSchemaContentType.ElementOnly); - AssertNotNull (cType.BaseSchemaType); + Assert.IsNotNull (cType.BaseSchemaType); seq = xccx.Particle as XmlSchemaSequence; - AssertNotNull (seq); - AssertEquals (1, seq.Items.Count); + Assert.IsNotNull (seq); + Assert.AreEqual (1, seq.Items.Count); XmlSchemaElement refBaz = seq.Items [0] as XmlSchemaElement; - AssertNotNull (refBaz); + Assert.IsNotNull (refBaz); AssertCompiledElement (refBaz, QName ("Baz", ""), stringDatatype); qname = QName ("Bar", ns); @@ -139,7 +139,7 @@ namespace MonoTests.System.Xml { XmlSchema schema = new XmlSchema (); schema.TargetNamespace = string.Empty; - Assert (!schema.IsCompiled); + Assert.IsTrue (!schema.IsCompiled); // MS.NET 1.x: The Namespace '' is an invalid URI. // MS.NET 2.0: The targetNamespace attribute cannot have empty string as its value. @@ -159,16 +159,16 @@ namespace MonoTests.System.Xml public void TestSimpleImport () { XmlSchema schema = XmlSchema.Read (new XmlTextReader ("Test/XmlFiles/xsd/3.xsd"), null); - AssertEquals ("urn:foo", schema.TargetNamespace); + Assert.AreEqual ("urn:foo", schema.TargetNamespace); XmlSchemaImport import = schema.Includes [0] as XmlSchemaImport; - AssertNotNull (import); + Assert.IsNotNull (import); schema.Compile (null); - AssertEquals (4, schema.Elements.Count); - AssertNotNull (schema.Elements [QName ("Foo", "urn:foo")]); - AssertNotNull (schema.Elements [QName ("Bar", "urn:foo")]); - AssertNotNull (schema.Elements [QName ("Foo", "urn:bar")]); - AssertNotNull (schema.Elements [QName ("Bar", "urn:bar")]); + Assert.AreEqual (4, schema.Elements.Count); + Assert.IsNotNull (schema.Elements [QName ("Foo", "urn:foo")]); + Assert.IsNotNull (schema.Elements [QName ("Bar", "urn:foo")]); + Assert.IsNotNull (schema.Elements [QName ("Foo", "urn:bar")]); + Assert.IsNotNull (schema.Elements [QName ("Bar", "urn:bar")]); } @@ -189,20 +189,20 @@ namespace MonoTests.System.Xml XmlSchema schema = XmlSchema.Read (new XmlTextReader ("Test/XmlFiles/xsd/5.xsd"), null); schema.Compile (null); XmlSchemaElement el = schema.Elements [QName ("Foo", "urn:bar")] as XmlSchemaElement; - AssertNotNull (el); + Assert.IsNotNull (el); XmlSchemaComplexType ct = el.ElementType as XmlSchemaComplexType; XmlSchemaSequence seq = ct.ContentTypeParticle as XmlSchemaSequence; XmlSchemaElement elp = seq.Items [0] as XmlSchemaElement; - AssertEquals (QName ("Bar", ""), elp.QualifiedName); + Assert.AreEqual (QName ("Bar", ""), elp.QualifiedName); schema = XmlSchema.Read (new XmlTextReader ("Test/XmlFiles/xsd/6.xsd"), null); schema.Compile (null); el = schema.Elements [QName ("Foo", "urn:bar")] as XmlSchemaElement; - AssertNotNull (el); + Assert.IsNotNull (el); ct = el.ElementType as XmlSchemaComplexType; seq = ct.ContentTypeParticle as XmlSchemaSequence; elp = seq.Items [0] as XmlSchemaElement; - AssertEquals (QName ("Bar", "urn:bar"), elp.QualifiedName); + Assert.AreEqual (QName ("Bar", "urn:bar"), elp.QualifiedName); } [Test] @@ -219,7 +219,7 @@ namespace MonoTests.System.Xml xw = new XmlTextWriter (sw); xs.Write (xw); doc.LoadXml (sw.ToString ()); - AssertEquals ("#1", "", doc.DocumentElement.OuterXml); + Assert.AreEqual ("", doc.DocumentElement.OuterXml, "#1"); // TargetNamespace xs = new XmlSchema (); @@ -228,7 +228,7 @@ namespace MonoTests.System.Xml xs.TargetNamespace = "urn:foo"; xs.Write (xw); doc.LoadXml (sw.ToString ()); - AssertEquals ("#2", "", doc.DocumentElement.OuterXml); + Assert.AreEqual ("", doc.DocumentElement.OuterXml, "#2"); // Zero-length TargetNamespace xs = new XmlSchema (); @@ -237,7 +237,7 @@ namespace MonoTests.System.Xml xs.TargetNamespace = string.Empty; xs.Write (xw); doc.LoadXml (sw.ToString ()); - AssertEquals ("#2b", "", doc.DocumentElement.OuterXml); + Assert.AreEqual ("", doc.DocumentElement.OuterXml, "#2b"); // XmlSerializerNamespaces xs = new XmlSchema (); @@ -247,7 +247,7 @@ namespace MonoTests.System.Xml xs.Write (xw); doc.LoadXml (sw.ToString ()); // commenting out. .NET 2.0 outputs xs:schema instead of schema, that also makes sense. - // AssertEquals ("#3", "", doc.DocumentElement.OuterXml); + // Assert.AreEqual ("", doc.DocumentElement.OuterXml, "#3"); // TargetNamespace + XmlSerializerNamespaces xs = new XmlSchema (); @@ -258,7 +258,7 @@ namespace MonoTests.System.Xml xs.Write (xw); doc.LoadXml (sw.ToString ()); // commenting out. .NET 2.0 outputs xs:schema instead of schema, that also makes sense. - // AssertEquals ("#4", "", doc.DocumentElement.OuterXml); + // Assert.AreEqual ("", doc.DocumentElement.OuterXml, "#4"); // Add XmlSchema.Namespace to XmlSerializerNamespaces xs = new XmlSchema (); @@ -267,7 +267,7 @@ namespace MonoTests.System.Xml xs.Namespaces.Add ("a", XmlSchema.Namespace); xs.Write (xw); doc.LoadXml (sw.ToString ()); - AssertEquals ("#5", "", doc.DocumentElement.OuterXml); + Assert.AreEqual ("", doc.DocumentElement.OuterXml, "#5"); // UnhandledAttributes + XmlSerializerNamespaces xs = new XmlSchema (); @@ -279,7 +279,7 @@ namespace MonoTests.System.Xml xs.Write (xw); doc.LoadXml (sw.ToString ()); // commenting out. .NET 2.0 outputs xs:schema instead of schema, that also makes sense. - // AssertEquals ("#6", "", doc.DocumentElement.OuterXml); + // Assert.AreEqual ("", doc.DocumentElement.OuterXml, "#6"); // Adding xmlns to UnhandledAttributes -> no output xs = new XmlSchema (); @@ -290,7 +290,7 @@ namespace MonoTests.System.Xml xs.UnhandledAttributes = new XmlAttribute [] {attr}; xs.Write (xw); doc.LoadXml (sw.ToString ()); - AssertEquals ("#7", "", doc.DocumentElement.OuterXml); + Assert.AreEqual ("", doc.DocumentElement.OuterXml, "#7"); } [Category ("NotWorking")] @@ -304,32 +304,32 @@ namespace MonoTests.System.Xml StringWriter sw; sw = new StringWriter (); xs.Write (new XmlTextWriter (sw)); - AssertEquals ("#1", xmldecl + "", sw.ToString ()); + Assert.AreEqual (xmldecl + "", sw.ToString (), "#1"); xs.Namespaces = nss; sw = new StringWriter (); xs.Write (new XmlTextWriter (sw)); - AssertEquals ("#2", xmldecl + "", sw.ToString ()); + Assert.AreEqual (xmldecl + "", sw.ToString (), "#2"); nss.Add ("foo", "urn:foo"); sw = new StringWriter (); xs.Write (new XmlTextWriter (sw)); // commenting out. .NET 2.0 outputs xs:schema instead of schema, that also makes sense. - // AssertEquals ("#3", xmldecl + "", sw.ToString ()); + // Assert.AreEqual (xmldecl + "", sw.ToString (), "#3"); nss.Add ("", "urn:foo"); sw = new StringWriter (); xs.Write (new XmlTextWriter (sw)); // commenting out. .NET 2.0 outputs xs:schema instead of q1:schema, that also makes sense. - // AssertEquals ("#4", xmldecl + "", sw.ToString ()); + // Assert.AreEqual (xmldecl + "", sw.ToString (), "#4"); nss.Add ("q1", "urn:q1"); sw = new StringWriter (); xs.Write (new XmlTextWriter (sw)); //Not sure if testing for exact order of these name spaces is // relevent, so using less strict test that passes on MS.NET - //AssertEquals (xmldecl + "", sw.ToString ()); - Assert("q1", sw.ToString ().IndexOf ("xmlns:q1=\"urn:q1\"") != -1); + //Assert.AreEqual (xmldecl + "", sw.ToString ()); + Assert.IsTrue (sw.ToString ().IndexOf ("xmlns:q1=\"urn:q1\"") != -1, "q1"); } [Test] @@ -339,7 +339,7 @@ namespace MonoTests.System.Xml XmlTextReader xtr = new XmlTextReader (xsd, XmlNodeType.Document, null); xtr.Read (); XmlSchema xs = XmlSchema.Read (xtr, null); - AssertEquals (XmlNodeType.EndElement, xtr.NodeType); + Assert.AreEqual (XmlNodeType.EndElement, xtr.NodeType); } [Test] @@ -375,7 +375,7 @@ namespace MonoTests.System.Xml XmlSchemaAnnotation annotation = element.Annotation; XmlSchemaDocumentation doc = annotation.Items [0] as XmlSchemaDocumentation; - AssertEquals (0, doc.Markup.Length); + Assert.AreEqual (0, doc.Markup.Length); } @@ -388,10 +388,10 @@ namespace MonoTests.System.Xml XmlSchema schema = XmlSchema.Read (tr, null); XmlSchemaInclude inc = (XmlSchemaInclude) schema.Includes [0]; - AssertNull (inc.Schema); + Assert.IsNull (inc.Schema); schema.Compile (null); tr.Close (); - AssertNotNull (inc.Schema); + Assert.IsNotNull (inc.Schema); } [Test] @@ -437,7 +437,7 @@ namespace MonoTests.System.Xml } else { try { xss.Compile (); - Fail (); + Assert.Fail (); } catch (XmlSchemaException) { } return; @@ -455,9 +455,10 @@ namespace MonoTests.System.Xml } else { try { schema.Compile (null); - Fail (); + Assert.Fail (); } catch (XmlSchemaException) { } + return; } XmlValidatingReader vr = new XmlValidatingReader (xml, @@ -468,7 +469,7 @@ namespace MonoTests.System.Xml try { vr.Read (); - Fail (); + Assert.Fail (); } catch (XmlSchemaException) { } } @@ -518,7 +519,7 @@ namespace MonoTests.System.Xml } else { try { xss.Compile (); - Fail (); + Assert.Fail (); } catch (XmlSchemaException) { } return; @@ -536,9 +537,10 @@ namespace MonoTests.System.Xml } else { try { schema.Compile (null); - Fail (); + Assert.Fail (); } catch (XmlSchemaException) { } + return; } XmlValidatingReader vr = new XmlValidatingReader (xml, @@ -605,7 +607,7 @@ namespace MonoTests.System.Xml // GetEntity method. } - AssertEquals ("assembly://MyAssembly.Name/MyProjectNameSpace/objects.xsd", resolver.ReceivedUri.OriginalString); + Assert.AreEqual ("assembly://MyAssembly.Name/MyProjectNameSpace/objects.xsd", resolver.ReceivedUri.OriginalString); } [Test] diff --git a/mcs/class/System.XML/Test/System.Xml.XPath/ChangeLog b/mcs/class/System.XML/Test/System.Xml.XPath/ChangeLog index 89f9ee4f520..37c580d1784 100644 --- a/mcs/class/System.XML/Test/System.Xml.XPath/ChangeLog +++ b/mcs/class/System.XML/Test/System.Xml.XPath/ChangeLog @@ -1,3 +1,16 @@ +2009-06-30 Raja R Harinath + + * XPathNavigatorTests.cs (XPathDocumentMoveToId) [!NET_2_0]: + Fix compile. + +2009-06-26 Atsushi Enomoto + + * SelectNodesTests.cs + XPathNavigatorCommonTests.cs + XPathAtomicValueTests.cs + XPathNavigatorTests.cs + XPathNavigatorEvaluateTests.cs : convert to newer nunit style. + 2009-05-15 Atsushi Enomoto * XPathNavigatorCommonTests.cs : test that LookupNamespace() in diff --git a/mcs/class/System.XML/Test/System.Xml.XPath/SelectNodesTests.cs b/mcs/class/System.XML/Test/System.Xml.XPath/SelectNodesTests.cs index 18cee67985f..03c29dc072a 100644 --- a/mcs/class/System.XML/Test/System.Xml.XPath/SelectNodesTests.cs +++ b/mcs/class/System.XML/Test/System.Xml.XPath/SelectNodesTests.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml.XPath { [TestFixture] - public class SelectNodesTests : Assertion + public class SelectNodesTests { [Test] @@ -25,8 +25,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/"); - AssertEquals (1, nodes.Count); - AssertSame (document, nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document, nodes [0], "#2"); } [Test] @@ -35,8 +35,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo"); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement, nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement, nodes [0], "#2"); } [Test] @@ -45,7 +45,7 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/bar"); - AssertEquals (0, nodes.Count); + Assert.AreEqual (0, nodes.Count, "#1"); } [Test] @@ -54,9 +54,9 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/*"); - AssertEquals (2, nodes.Count); - AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]); - AssertSame (document.DocumentElement.ChildNodes [1], nodes [1]); + Assert.AreEqual (2, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2"); + Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [1], "#3"); } [Test] @@ -65,8 +65,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/bar"); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2"); } [Test] @@ -75,8 +75,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/baz"); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement.ChildNodes [1], nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [0]); } [Test] @@ -85,8 +85,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml ("bar"); XmlNodeList nodes = document.SelectNodes ("/foo/text()"); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0]); } [Test] @@ -95,9 +95,9 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml ("barquux"); XmlNodeList nodes = document.SelectNodes ("/foo/text()"); - AssertEquals (2, nodes.Count); - AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]); - AssertSame (document.DocumentElement.ChildNodes [2], nodes [1]); + Assert.AreEqual (2, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2"); + Assert.AreSame (document.DocumentElement.ChildNodes [2], nodes [1], "#3"); } [Test] @@ -106,8 +106,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/bar/.."); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement, nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement, nodes [0], "#2"); } [Test] @@ -116,8 +116,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/bar/parent::node()"); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement, nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement, nodes [0], "#2"); } [Test] @@ -126,8 +126,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/@bar"); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement.Attributes ["bar"], nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.Attributes ["bar"], nodes [0], "#2"); } [Test] @@ -136,8 +136,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/attribute::bar"); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement.Attributes ["bar"], nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.Attributes ["bar"], nodes [0], "#2"); } [Test] @@ -146,10 +146,10 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/@*"); - AssertEquals (2, nodes.Count); + Assert.AreEqual (2, nodes.Count, "#1"); // are the attributes guanteed to be ordered in the node list? - AssertSame (document.DocumentElement.Attributes ["bar"], nodes [0]); - AssertSame (document.DocumentElement.Attributes ["quux"], nodes [1]); + Assert.AreSame (document.DocumentElement.Attributes ["bar"], nodes [0], "#2"); + Assert.AreSame (document.DocumentElement.Attributes ["quux"], nodes [1], "#3"); } [Test] @@ -158,8 +158,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/@bar/.."); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement, nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement, nodes [0], "#2"); } [Test] @@ -168,9 +168,9 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/bar|/foo/baz"); - AssertEquals (2, nodes.Count); - AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]); - AssertSame (document.DocumentElement.ChildNodes [1], nodes [1]); + Assert.AreEqual (2, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2"); + Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [1], "#3"); } [Test] @@ -179,10 +179,10 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml ("baz"); XmlNodeList nodes = document.SelectNodes ("/foo/node()"); - AssertEquals (3, nodes.Count); - AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]); - AssertSame (document.DocumentElement.ChildNodes [1], nodes [1]); - AssertSame (document.DocumentElement.ChildNodes [2], nodes [2]); + Assert.AreEqual (3, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2"); + Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [1], "#3"); + Assert.AreSame (document.DocumentElement.ChildNodes [2], nodes [2], "#4"); } [Test] @@ -191,8 +191,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml ("12"); XmlNodeList nodes = document.SelectNodes ("/foo/bar[1]"); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement.ChildNodes [0], nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.ChildNodes [0], nodes [0], "#2"); } [Test] @@ -201,9 +201,9 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/bar/following-sibling::*"); - AssertEquals (2, nodes.Count); - AssertSame (document.DocumentElement.ChildNodes [1], nodes [0]); - AssertSame (document.DocumentElement.ChildNodes [2], nodes [1]); + Assert.AreEqual (2, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [0], "#2"); + Assert.AreSame (document.DocumentElement.ChildNodes [2], nodes [1], "#3"); } [Test] @@ -212,8 +212,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/bar/following-sibling::baz"); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement.ChildNodes [1], nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.ChildNodes [1], nodes [0], "#2"); } [Test] @@ -222,8 +222,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo/bar/following-sibling::quux"); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement.ChildNodes [2], nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement.ChildNodes [2], nodes [0], "#2"); } [Test] @@ -232,8 +232,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("(/foo) | (/foo)"); - AssertEquals (1, nodes.Count); // bug #27548 - AssertSame (document.DocumentElement, nodes [0]); + Assert.AreEqual (1, nodes.Count); // bug #27548, "#1"); + Assert.AreSame (document.DocumentElement, nodes [0], "#1"); } [Test] @@ -242,8 +242,8 @@ namespace MonoTests.System.Xml.XPath XmlDocument document = new XmlDocument (); document.LoadXml (""); XmlNodeList nodes = document.SelectNodes ("/foo1"); - AssertEquals (1, nodes.Count); - AssertSame (document.DocumentElement, nodes [0]); + Assert.AreEqual (1, nodes.Count, "#1"); + Assert.AreSame (document.DocumentElement, nodes [0], "#2"); } [Test] @@ -254,44 +254,44 @@ namespace MonoTests.System.Xml.XPath XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable); nsmgr.AddNamespace("foons", "urn:foo1:foo2"); XmlNodeList nodes = document.SelectNodes ("/foons:root", nsmgr); - AssertEquals (1, nodes.Count); + Assert.AreEqual (1, nodes.Count, "#1"); } [Test] public void NamespaceSelectWithNsElasure () { - XmlDocument doc = new XmlDocument (); - - doc.LoadXml (""); - XmlNode n = doc.FirstChild.FirstChild.FirstChild.FirstChild; //baz - XmlNodeList nl = n.SelectNodes ("namespace::*"); - AssertEquals ("hoge", nl [0].LocalName); - AssertEquals ("xml", nl [1].LocalName); - AssertEquals (2, nl.Count); - - n = doc.FirstChild.FirstChild; // foo - nl = n.SelectNodes ("namespace::*"); - Console.WriteLine ("at foo::"); - AssertEquals ("xmlns", nl [0].LocalName); - AssertEquals ("hoge", nl [1].LocalName); - AssertEquals ("xml", nl [2].LocalName); - AssertEquals (3, nl.Count); - } - - [Test] - public void AncestorAxis () { - XmlDocument doc = new XmlDocument (); - doc.LoadXml (""); - - XmlNode bar = doc.GetElementsByTagName ("bar") [0]; - XmlElement barClone = (XmlElement) bar.CloneNode (true); - XmlNodeList baxs = barClone.GetElementsByTagName ("bax"); - - XmlNode bax = baxs [0]; - XmlNodeList ans = bax.SelectNodes ("ancestor::*"); - AssertEquals (2, ans.Count); - AssertEquals ("bar", ans [0].Name); - AssertEquals ("baz", ans [1].Name); + XmlDocument doc = new XmlDocument (); + + doc.LoadXml (""); + XmlNode n = doc.FirstChild.FirstChild.FirstChild.FirstChild; //baz + XmlNodeList nl = n.SelectNodes ("namespace::*"); + Assert.AreEqual ("hoge", nl [0].LocalName, "#1"); + Assert.AreEqual ("xml", nl [1].LocalName, "#2"); + Assert.AreEqual (2, nl.Count, "#3"); + + n = doc.FirstChild.FirstChild; // foo + nl = n.SelectNodes ("namespace::*"); + Console.WriteLine ("at foo::"); + Assert.AreEqual ("xmlns", nl [0].LocalName, "#1"); + Assert.AreEqual ("hoge", nl [1].LocalName, "#2"); + Assert.AreEqual ("xml", nl [2].LocalName, "#3"); + Assert.AreEqual (3, nl.Count, "#4"); + } + + [Test] + public void AncestorAxis () { + XmlDocument doc = new XmlDocument (); + doc.LoadXml (""); + + XmlNode bar = doc.GetElementsByTagName ("bar") [0]; + XmlElement barClone = (XmlElement) bar.CloneNode (true); + XmlNodeList baxs = barClone.GetElementsByTagName ("bax"); + + XmlNode bax = baxs [0]; + XmlNodeList ans = bax.SelectNodes ("ancestor::*"); + Assert.AreEqual (2, ans.Count, "#1"); + Assert.AreEqual ("bar", ans [0].Name, "#2"); + Assert.AreEqual ("baz", ans [1].Name, "#3"); } [Test] // bug #458245 @@ -313,7 +313,7 @@ namespace MonoTests.System.Xml.XPath ns.AddNamespace ("_", "urn:foo"); string xpath = "//_:div//_:div//_:div"; var nodes = doc.SelectNodes (xpath, ns); - AssertEquals (4, nodes.Count); + Assert.AreEqual (4, nodes.Count, "#1"); } [Test] @@ -340,9 +340,9 @@ namespace MonoTests.System.Xml.XPath ns.AddNamespace ("_", "http://www.w3.org/1999/xhtml"); XmlNode n = doc.SelectSingleNode ("//_:html", ns); - Assert ("#1", n != null); + Assert.IsTrue (n != null, "#1"); XmlNodeList nodes = n.SelectNodes (".//_:div//_:div", ns); - AssertEquals ("#2", 5, nodes.Count); + Assert.AreEqual (5, nodes.Count, "#2"); } } } diff --git a/mcs/class/System.XML/Test/System.Xml.XPath/XPathAtomicValueTests.cs b/mcs/class/System.XML/Test/System.Xml.XPath/XPathAtomicValueTests.cs index 052954c4d95..a67e91072a8 100644 --- a/mcs/class/System.XML/Test/System.Xml.XPath/XPathAtomicValueTests.cs +++ b/mcs/class/System.XML/Test/System.Xml.XPath/XPathAtomicValueTests.cs @@ -40,7 +40,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XPathAtomicValueTests : Assertion + public class XPathAtomicValueTests { internal const string XdtNamespace = "http://www.w3.org/2003/11/xpath-datatypes"; @@ -158,18 +158,18 @@ namespace MonoTests.System.Xml object singleValue, int listCount) { - AssertEquals ("IsNode", isNode, av.IsNode); - AssertEquals ("ValueType", valueType, av.ValueType); - AssertEquals ("XmlType", xmlType, av.XmlType); - AssertEquals ("TypedValue", typedValue, av.TypedValue); - AssertEquals ("typedValue.GetType()", typedValueType, typedValue.GetType ()); + Assert.AreEqual (isNode, av.IsNode, "IsNode"); + Assert.AreEqual (valueType, av.ValueType, "ValueType"); + Assert.AreEqual (xmlType, av.XmlType, "XmlType"); + Assert.AreEqual (typedValue, av.TypedValue, "TypedValue"); + Assert.AreEqual (typedValueType, typedValue.GetType (), "typedValue.GetType()"); if (value != null) - AssertEquals ("Value", value, av.Value); + Assert.AreEqual (value, av.Value, "Value"); else { try { value = av.Value; - Fail ("not supported conversion to String."); + Assert.Fail ("not supported conversion to String."); } catch (InvalidCastException) { } } @@ -177,83 +177,83 @@ namespace MonoTests.System.Xml // FIXME: Failure cases could not be tested; // any kind of Exceptions are thrown as yet. if (boolValue != null) - AssertEquals ("ValueAsBoolean", boolValue, av.ValueAsBoolean); + Assert.AreEqual (boolValue, av.ValueAsBoolean, "ValueAsBoolean"); /* else { try { boolValue = av.ValueAsBoolean; - Fail ("not supported conversion to Boolean."); + Assert.Fail ("not supported conversion to Boolean."); } catch (InvalidCastException) { } } */ if (dateValue != null) - AssertEquals ("ValueAsDateTime", dateValue, av.ValueAsDateTime); + Assert.AreEqual (dateValue, av.ValueAsDateTime, "ValueAsDateTime"); /* else { try { dateValue = av.ValueAsDateTime; - Fail ("not supported conversion to DateTime."); + Assert.Fail ("not supported conversion to DateTime."); } catch (InvalidCastException) { } } */ if (decimalValue != null) - AssertEquals ("ValueAsDecimal", decimalValue, av.ValueAsDecimal); + Assert.AreEqual (decimalValue, av.ValueAsDecimal, "ValueAsDecimal"); /* else { try { decimalValue = av.ValueAsDecimal; - Fail ("not supported conversion to Decimal."); + Assert.Fail ("not supported conversion to Decimal."); } catch (InvalidCastException) { } } */ if (doubleValue != null) - AssertEquals ("ValueAsDouble", doubleValue, av.ValueAsDouble); + Assert.AreEqual (doubleValue, av.ValueAsDouble, "ValueAsDouble"); /* else { try { doubleValue = av.ValueAsDouble; - Fail ("not supported conversion to Double."); + Assert.Fail ("not supported conversion to Double."); } catch (InvalidCastException) { } } */ if (int32Value != null) - AssertEquals ("ValueAsInt32", int32Value, av.ValueAsInt32); + Assert.AreEqual (int32Value, av.ValueAsInt32, "ValueAsInt32"); /* else { try { int32Value = av.ValueAsInt32; - Fail ("not supported conversion to Int32."); + Assert.Fail ("not supported conversion to Int32."); } catch (InvalidCastException) { } } */ if (int64Value != null) - AssertEquals ("ValueAsInt64", int64Value, av.ValueAsInt64); + Assert.AreEqual (int64Value, av.ValueAsInt64, "ValueAsInt64"); /* else { try { int64Value = av.ValueAsInt64; - Fail ("not supported conversion to Int64."); + Assert.Fail ("not supported conversion to Int64."); } catch (InvalidCastException) { } } */ if (singleValue != null) - AssertEquals ("ValueAsSingle", singleValue, av.ValueAsSingle); + Assert.AreEqual (singleValue, av.ValueAsSingle, "ValueAsSingle"); /* else { try { singleValue = av.ValueAsSingle; - Fail ("not supported conversion to Single."); + Assert.Fail ("not supported conversion to Single."); } catch (InvalidCastException) { } } */ - AssertEquals ("ValueAsList.Count", listCount, av.ValueAsList.Count); + Assert.AreEqual (listCount, av.ValueAsList.Count, "ValueAsList.Count"); } [Test] @@ -471,7 +471,7 @@ namespace MonoTests.System.Xml av = new XPathAtomicValue (new bool [] {true, false}, xstype); try { object o = av.ValueAsBoolean; - Fail ("ArrayList must contain just one item to be castable to bool"); + Assert.Fail ("ArrayList must contain just one item to be castable to bool"); } catch (InvalidCastException) { } @@ -479,7 +479,7 @@ namespace MonoTests.System.Xml av = new XPathAtomicValue (new ArrayList (), xstype); try { object o = av.ValueAsBoolean; - Fail ("ArrayList must contain just one item to be castable to bool"); + Assert.Fail ("ArrayList must contain just one item to be castable to bool"); } catch (InvalidCastException) { } @@ -487,7 +487,7 @@ namespace MonoTests.System.Xml av = new XPathAtomicValue ("True", xstype); try { object o = av.ValueAsBoolean; - Fail ("\"True\" is not a boolean representation (\"true\" is)."); + Assert.Fail ("\"True\" is not a boolean representation (\"true\" is)."); } catch (InvalidCastException) { } @@ -495,7 +495,7 @@ namespace MonoTests.System.Xml av = new XPathAtomicValue (DateTime.Now, xstype); try { object o = av.ValueAsBoolean; - Fail ("DateTime should not be castable to bool."); + Assert.Fail ("DateTime should not be castable to bool."); } catch (InvalidCastException) { } @@ -506,7 +506,7 @@ namespace MonoTests.System.Xml av = new XPathAtomicValue (node, xstype); try { object o = av.ValueAsBoolean; - Fail ("XmlText cannot be castable to bool."); + Assert.Fail ("XmlText cannot be castable to bool."); } catch (InvalidCastException) { } @@ -516,7 +516,7 @@ namespace MonoTests.System.Xml xstype); try { object o = av.ValueAsBoolean; - Fail ("XmlText cannot be castable to bool."); + Assert.Fail ("XmlText cannot be castable to bool."); } catch (InvalidCastException) { } } diff --git a/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorCommonTests.cs b/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorCommonTests.cs index 08afa61e313..accde913026 100644 --- a/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorCommonTests.cs +++ b/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorCommonTests.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XPathNavigatorCommonTests : Assertion + public class XPathNavigatorCommonTests { XmlDocument document; XPathNavigator nav; @@ -51,15 +51,15 @@ namespace MonoTests.System.Xml private void AssertNavigator (string label, XPathNavigator nav, XPathNodeType type, string prefix, string localName, string ns, string name, string value, bool hasAttributes, bool hasChildren, bool isEmptyElement) { label += nav.GetType (); - AssertEquals (label + "NodeType", type, nav.NodeType); - AssertEquals (label + "Prefix", prefix, nav.Prefix); - AssertEquals (label + "LocalName", localName, nav.LocalName); - AssertEquals (label + "Namespace", ns, nav.NamespaceURI); - AssertEquals (label + "Name", name, nav.Name); - AssertEquals (label + "Value", value, nav.Value); - AssertEquals (label + "HasAttributes", hasAttributes, nav.HasAttributes); - AssertEquals (label + "HasChildren", hasChildren, nav.HasChildren); - AssertEquals (label + "IsEmptyElement", isEmptyElement, nav.IsEmptyElement); + Assert.AreEqual (type, nav.NodeType, label + "NodeType"); + Assert.AreEqual (prefix, nav.Prefix, label + "Prefix"); + Assert.AreEqual (localName, nav.LocalName, label + "LocalName"); + Assert.AreEqual (ns, nav.NamespaceURI, label + "Namespace"); + Assert.AreEqual (name, nav.Name, label + "Name"); + Assert.AreEqual (value, nav.Value, label + "Value"); + Assert.AreEqual (hasAttributes, nav.HasAttributes, label + "HasAttributes"); + Assert.AreEqual (hasChildren, nav.HasChildren, label + "HasChildren"); + Assert.AreEqual (isEmptyElement, nav.IsEmptyElement, label + "IsEmptyElement"); } [Test] @@ -92,9 +92,9 @@ namespace MonoTests.System.Xml public void DocumentWithProcessingInstruction (XPathNavigator nav) { - Assert (nav.MoveToFirstChild ()); + Assert.IsTrue (nav.MoveToFirstChild ()); AssertNavigator ("#1", nav, XPathNodeType.ProcessingInstruction, "", "xml-stylesheet", "", "xml-stylesheet", "href='foo.xsl' type='text/xsl' ", false, false, false); - Assert (!nav.MoveToFirstChild ()); + Assert.IsTrue (!nav.MoveToFirstChild ()); } [Test] @@ -111,14 +111,14 @@ namespace MonoTests.System.Xml private void XmlRootElementOnly (XPathNavigator nav) { AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false); - Assert (nav.MoveToFirstChild ()); + Assert.IsTrue (nav.MoveToFirstChild ()); AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, false, true); - Assert (!nav.MoveToFirstChild ()); - Assert (!nav.MoveToNext ()); - Assert (!nav.MoveToPrevious ()); + Assert.IsTrue (!nav.MoveToFirstChild ()); + Assert.IsTrue (!nav.MoveToNext ()); + Assert.IsTrue (!nav.MoveToPrevious ()); nav.MoveToRoot (); AssertNavigator ("#3", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false); - Assert (!nav.MoveToNext ()); + Assert.IsTrue (!nav.MoveToNext ()); } [Test] @@ -135,24 +135,24 @@ namespace MonoTests.System.Xml private void XmlSimpleTextContent (XPathNavigator nav) { AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "Test.", false, true, false); - Assert (nav.MoveToFirstChild ()); + Assert.IsTrue (nav.MoveToFirstChild ()); AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "Test.", false, true, false); - Assert (!nav.MoveToNext ()); - Assert (!nav.MoveToPrevious ()); - Assert (nav.MoveToFirstChild ()); + Assert.IsTrue (!nav.MoveToNext ()); + Assert.IsTrue (!nav.MoveToPrevious ()); + Assert.IsTrue (nav.MoveToFirstChild ()); AssertNavigator ("#3", nav, XPathNodeType.Text, "", "", "", "", "Test.", false, false, false); - Assert (nav.MoveToParent ()); + Assert.IsTrue (nav.MoveToParent ()); AssertNavigator ("#4", nav, XPathNodeType.Element, "", "foo", "", "foo", "Test.", false, true, false); - Assert (nav.MoveToParent ()); + Assert.IsTrue (nav.MoveToParent ()); AssertNavigator ("#5", nav, XPathNodeType.Root, "", "", "", "", "Test.", false, true, false); nav.MoveToFirstChild (); nav.MoveToFirstChild (); nav.MoveToRoot (); AssertNavigator ("#6", nav, XPathNodeType.Root, "", "", "", "", "Test.", false, true, false); - Assert (!nav.MoveToNext ()); + Assert.IsTrue (!nav.MoveToNext ()); } [Test] @@ -169,20 +169,20 @@ namespace MonoTests.System.Xml private void XmlSimpleElementContent (XPathNavigator nav) { AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false); - Assert (nav.MoveToFirstChild ()); + Assert.IsTrue (nav.MoveToFirstChild ()); AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, true, false); - Assert (!nav.MoveToNext ()); - Assert (!nav.MoveToPrevious ()); + Assert.IsTrue (!nav.MoveToNext ()); + Assert.IsTrue (!nav.MoveToPrevious ()); - Assert (nav.MoveToFirstChild ()); + Assert.IsTrue (nav.MoveToFirstChild ()); AssertNavigator ("#3", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true); - Assert (nav.MoveToParent ()); + Assert.IsTrue (nav.MoveToParent ()); AssertNavigator ("#4", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, true, false); nav.MoveToRoot (); AssertNavigator ("#5", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false); - Assert (!nav.MoveToNext ()); + Assert.IsTrue (!nav.MoveToNext ()); } [Test] @@ -200,25 +200,25 @@ namespace MonoTests.System.Xml { AssertNavigator ("#1", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false); - Assert (nav.MoveToFirstChild ()); + Assert.IsTrue (nav.MoveToFirstChild ()); AssertNavigator ("#2", nav, XPathNodeType.Element, "", "foo", "", "foo", "", false, true, false); - Assert (!nav.MoveToNext ()); - Assert (!nav.MoveToPrevious ()); + Assert.IsTrue (!nav.MoveToNext ()); + Assert.IsTrue (!nav.MoveToPrevious ()); - Assert (nav.MoveToFirstChild ()); + Assert.IsTrue (nav.MoveToFirstChild ()); AssertNavigator ("#3", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true); - Assert (!nav.MoveToFirstChild ()); + Assert.IsTrue (!nav.MoveToFirstChild ()); - Assert (nav.MoveToNext ()); + Assert.IsTrue (nav.MoveToNext ()); AssertNavigator ("#4", nav, XPathNodeType.Element, "", "baz", "", "baz", "", false, false, true); - Assert (!nav.MoveToFirstChild ()); + Assert.IsTrue (!nav.MoveToFirstChild ()); - Assert (nav.MoveToPrevious ()); + Assert.IsTrue (nav.MoveToPrevious ()); AssertNavigator ("#5", nav, XPathNodeType.Element, "", "bar", "", "bar", "", false, false, true); nav.MoveToRoot (); AssertNavigator ("#6", nav, XPathNodeType.Root, "", "", "", "", "", false, true, false); - Assert (!nav.MoveToNext ()); + Assert.IsTrue (!nav.MoveToNext ()); } [Test] @@ -236,25 +236,25 @@ namespace MonoTests.System.Xml { nav.MoveToFirstChild (); AssertNavigator ("#1", nav, XPathNodeType.Element, "", "img", "", "img", "", true, false, true); - Assert (!nav.MoveToNext ()); - Assert (!nav.MoveToPrevious ()); + Assert.IsTrue (!nav.MoveToNext ()); + Assert.IsTrue (!nav.MoveToPrevious ()); - Assert (nav.MoveToFirstAttribute ()); + Assert.IsTrue (nav.MoveToFirstAttribute ()); AssertNavigator ("#2", nav, XPathNodeType.Attribute, "", "src", "", "src", "foo.png", false, false, false); - Assert (!nav.MoveToFirstAttribute ()); // On attributes, it fails. + Assert.IsTrue (!nav.MoveToFirstAttribute ()); // On attributes, it fails. - Assert (nav.MoveToNextAttribute ()); + Assert.IsTrue (nav.MoveToNextAttribute ()); AssertNavigator ("#3", nav, XPathNodeType.Attribute, "", "alt", "", "alt", "image Fooooooo!", false, false, false); - Assert (!nav.MoveToNextAttribute ()); + Assert.IsTrue (!nav.MoveToNextAttribute ()); - Assert (nav.MoveToParent ()); + Assert.IsTrue (nav.MoveToParent ()); AssertNavigator ("#4", nav, XPathNodeType.Element, "", "img", "", "img", "", true, false, true); - Assert (nav.MoveToAttribute ("alt", "")); + Assert.IsTrue (nav.MoveToAttribute ("alt", "")); AssertNavigator ("#5", nav, XPathNodeType.Attribute, "", "alt", "", "alt", "image Fooooooo!", false, false, false); - Assert (!nav.MoveToAttribute ("src", "")); // On attributes, it fails. - Assert (nav.MoveToParent ()); - Assert (nav.MoveToAttribute ("src", "")); + Assert.IsTrue (!nav.MoveToAttribute ("src", "")); // On attributes, it fails. + Assert.IsTrue (nav.MoveToParent ()); + Assert.IsTrue (nav.MoveToAttribute ("src", "")); AssertNavigator ("#6", nav, XPathNodeType.Attribute, "", "src", "", "src", "foo.png", false, false, false); nav.MoveToRoot (); @@ -283,20 +283,20 @@ namespace MonoTests.System.Xml nav.MoveToFirstChild (); AssertNavigator ("#1", nav, XPathNodeType.Element, "", "html", xhtml, "html", "test.", false, true, false); - Assert (nav.MoveToFirstNamespace (XPathNamespaceScope.Local)); + Assert.IsTrue (nav.MoveToFirstNamespace (XPathNamespaceScope.Local)); AssertNavigator ("#2", nav, XPathNodeType.Namespace, "", "", "", "", xhtml, false, false, false); // Test difference between Local, ExcludeXml and All. - Assert (!nav.MoveToNextNamespace (XPathNamespaceScope.Local)); - Assert (!nav.MoveToNextNamespace (XPathNamespaceScope.ExcludeXml)); + Assert.IsTrue (!nav.MoveToNextNamespace (XPathNamespaceScope.Local)); + Assert.IsTrue (!nav.MoveToNextNamespace (XPathNamespaceScope.ExcludeXml)); // LAMESPEC: MS.NET 1.0 XmlDocument seems to have some bugs around here. // see http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q316808 #if true - Assert (nav.MoveToNextNamespace (XPathNamespaceScope.All)); + Assert.IsTrue (nav.MoveToNextNamespace (XPathNamespaceScope.All)); AssertNavigator ("#3", nav, XPathNodeType.Namespace, "", "xml", "", "xml", xmlNS, false, false, false); - Assert (!nav.MoveToNextNamespace (XPathNamespaceScope.All)); + Assert.IsTrue (!nav.MoveToNextNamespace (XPathNamespaceScope.All)); #endif // Test to check if MoveToRoot() resets Namespace node status. nav.MoveToRoot (); @@ -304,29 +304,27 @@ namespace MonoTests.System.Xml nav.MoveToFirstChild (); // Test without XPathNamespaceScope argument. - Assert (nav.MoveToFirstNamespace ()); - Assert (nav.MoveToNextNamespace ()); + Assert.IsTrue (nav.MoveToFirstNamespace ()); + Assert.IsTrue (nav.MoveToNextNamespace ()); AssertNavigator ("#5", nav, XPathNodeType.Namespace, "", "xml", "", "xml", xmlNS, false, false, false); // Test MoveToParent() - Assert (nav.MoveToParent ()); + Assert.IsTrue (nav.MoveToParent ()); AssertNavigator ("#6", nav, XPathNodeType.Element, "", "html", xhtml, "html", "test.", false, true, false); nav.MoveToFirstChild (); // body // Test difference between Local and ExcludeXml - Assert ("Local should fail", - !nav.MoveToFirstNamespace (XPathNamespaceScope.Local)); - Assert ("ExcludeXml should succeed", - nav.MoveToFirstNamespace (XPathNamespaceScope.ExcludeXml)); + Assert.IsTrue (!nav.MoveToFirstNamespace (XPathNamespaceScope.Local), "Local should fail"); + Assert.IsTrue (nav.MoveToFirstNamespace (XPathNamespaceScope.ExcludeXml), "ExcludeXml should succeed"); AssertNavigator ("#7", nav, XPathNodeType.Namespace, "", "", "", "", xhtml, false, false, false); - Assert (nav.MoveToNextNamespace (XPathNamespaceScope.All)); + Assert.IsTrue (nav.MoveToNextNamespace (XPathNamespaceScope.All)); AssertNavigator ("#8", nav, XPathNodeType.Namespace, "", "xml", "", "xml", xmlNS, false, false, false); - Assert (nav.MoveToParent ()); + Assert.IsTrue (nav.MoveToParent ()); AssertNavigator ("#9", nav, XPathNodeType.Element, "", "body", xhtml, "body", "test.", false, true, false); @@ -350,11 +348,11 @@ namespace MonoTests.System.Xml XPathNodeIterator iter = nav.Select ("//e"); iter.MoveNext (); nav.MoveTo (iter.Current); - AssertEquals ("e", nav.Name); + Assert.AreEqual ("e", nav.Name, "#1"); nav.MoveToFirstNamespace (); - AssertEquals ("x", nav.Name); + Assert.AreEqual ("x", nav.Name, "#2"); nav.MoveToNextNamespace (); - AssertEquals ("xml", nav.Name); + Assert.AreEqual ("xml", nav.Name, "#3"); } [Test] @@ -373,20 +371,20 @@ namespace MonoTests.System.Xml XPathNavigator tmp = nav.Clone (); XPathNodeIterator iter = nav.Select ("//e"); iter.MoveNext (); - Assert (nav.MoveTo (iter.Current)); - Assert (nav.MoveToFirstAttribute ()); - AssertEquals ("attr", nav.Name); - AssertEquals ("", tmp.Name); - Assert (tmp.IsDescendant (nav)); - Assert (!nav.IsDescendant (tmp)); + Assert.IsTrue (nav.MoveTo (iter.Current), "#1"); + Assert.IsTrue (nav.MoveToFirstAttribute (), "#2"); + Assert.AreEqual ("attr", nav.Name, "#3"); + Assert.AreEqual ("", tmp.Name, "#4"); + Assert.IsTrue (tmp.IsDescendant (nav), "#5"); + Assert.IsTrue (!nav.IsDescendant (tmp), "#6"); tmp.MoveToFirstChild (); - AssertEquals ("a", tmp.Name); - Assert (tmp.IsDescendant (nav)); - Assert (!nav.IsDescendant (tmp)); + Assert.AreEqual ("a", tmp.Name, "#7"); + Assert.IsTrue (tmp.IsDescendant (nav), "#8"); + Assert.IsTrue (!nav.IsDescendant (tmp), "#9"); tmp.MoveTo (iter.Current); - AssertEquals ("e", tmp.Name); - Assert (tmp.IsDescendant (nav)); - Assert (!nav.IsDescendant (tmp)); + Assert.AreEqual ("e", tmp.Name, "#10"); + Assert.IsTrue (tmp.IsDescendant (nav), "#11"); + Assert.IsTrue (!nav.IsDescendant (tmp), "#12"); } [Test] @@ -404,8 +402,8 @@ namespace MonoTests.System.Xml { nav.MoveToFirstChild (); nav.MoveToFirstChild (); - AssertEquals (XPathNodeType.Text, nav.NodeType); - AssertEquals ("test string", nav.Value); + Assert.AreEqual (XPathNodeType.Text, nav.NodeType, "#1"); + Assert.AreEqual ("test string", nav.Value, "#2"); } // bug #75609 @@ -424,7 +422,7 @@ namespace MonoTests.System.Xml { nav.MoveToFirstChild (); // root XPathNodeIterator iter = nav.SelectChildren ("foo", "urn:foo"); - AssertEquals (2, iter.Count); + Assert.AreEqual (2, iter.Count, "#1"); } #if NET_2_0 @@ -449,7 +447,7 @@ namespace MonoTests.System.Xml string ret = @" Some data. "; - AssertEquals (ret, nav.OuterXml.Replace ("\r\n", "\n")); + Assert.AreEqual (ret, nav.OuterXml.Replace ("\r\n", "\n"), "#1"); } [Test] @@ -462,7 +460,7 @@ namespace MonoTests.System.Xml var xr = nav.ReadSubtree (); xr.MoveToContent (); xr.Read (); // should be at x:val - AssertEquals ("urn:x", xr.LookupNamespace ("x")); + Assert.AreEqual ("urn:x", xr.LookupNamespace ("x"), "#1"); } #endif @@ -483,10 +481,10 @@ namespace MonoTests.System.Xml nav.MoveToFirstChild (); nav.MoveToFirstChild (); nav.MoveToNext (); - AssertEquals ("#1." + nav.GetType (), "ns1", nav.GetNamespace ("")); + Assert.AreEqual ("ns1", nav.GetNamespace (""), "#1." + nav.GetType ()); nav.MoveToNext (); nav.MoveToNext (); - AssertEquals ("#2." + nav.GetType (), "", nav.GetNamespace ("")); + Assert.AreEqual ("", nav.GetNamespace (""), "#2." + nav.GetType ()); } } } \ No newline at end of file diff --git a/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorEvaluateTests.cs b/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorEvaluateTests.cs index 359ba7197ac..6d302889a72 100644 --- a/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorEvaluateTests.cs +++ b/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorEvaluateTests.cs @@ -18,7 +18,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XPathNavigatorEvaluateTests : Assertion + public class XPathNavigatorEvaluateTests { XmlDocument document; XPathNavigator navigator; @@ -59,13 +59,13 @@ namespace MonoTests.System.Xml { expression = navigator.Compile("last()"); iterator = navigator.Select("/foo"); - AssertEquals ("1", navigator.Evaluate ("last()").ToString()); - AssertEquals ("1", navigator.Evaluate (expression, null).ToString ()); - AssertEquals ("1", navigator.Evaluate (expression, iterator).ToString ()); + Assert.AreEqual ("1", navigator.Evaluate ("last()").ToString(), "#1"); + Assert.AreEqual ("1", navigator.Evaluate (expression, null).ToString (), "#2"); + Assert.AreEqual ("1", navigator.Evaluate (expression, iterator).ToString (), "#3"); iterator = navigator.Select("/foo/*"); - AssertEquals ("4", navigator.Evaluate (expression, iterator).ToString ()); + Assert.AreEqual ("4", navigator.Evaluate (expression, iterator).ToString (), "#4"); - AssertEquals("3", navigator2.Evaluate ("string(//bar[last()]/@baz)")); + Assert.AreEqual("3", navigator2.Evaluate ("string(//bar[last()]/@baz)"), "#5"); } [Test] @@ -82,28 +82,28 @@ namespace MonoTests.System.Xml { expression = navigator.Compile("position()"); iterator = navigator.Select("/foo"); - AssertEquals ("#1", "1", navigator.Evaluate ("position()").ToString ()); - AssertEquals ("#2", "1", navigator.Evaluate (expression, null).ToString ()); - AssertEquals ("#3", "0", navigator.Evaluate (expression, iterator).ToString ()); + Assert.AreEqual ("1", navigator.Evaluate ("position()").ToString (), "#1"); + Assert.AreEqual ("1", navigator.Evaluate (expression, null).ToString (), "#2"); + Assert.AreEqual ("0", navigator.Evaluate (expression, iterator).ToString (), "#3"); iterator = navigator.Select("/foo/*"); - AssertEquals ("#4", "0", navigator.Evaluate (expression, iterator).ToString ()); + Assert.AreEqual ("0", navigator.Evaluate (expression, iterator).ToString (), "#4"); iterator.MoveNext(); - AssertEquals ("#5", "1", navigator.Evaluate (expression, iterator).ToString ()); + Assert.AreEqual ("1", navigator.Evaluate (expression, iterator).ToString (), "#5"); iterator.MoveNext (); - AssertEquals ("#6", "2", navigator.Evaluate (expression, iterator).ToString ()); + Assert.AreEqual ("2", navigator.Evaluate (expression, iterator).ToString (), "#6"); iterator.MoveNext (); - AssertEquals ("#7", "3", navigator.Evaluate (expression, iterator).ToString ()); + Assert.AreEqual ("3", navigator.Evaluate (expression, iterator).ToString (), "#7"); } [Test] public void CoreFunctionNodeSetCount () { - AssertEquals ("5", navigator.Evaluate ("count(//*)").ToString ()); - AssertEquals ("1", navigator.Evaluate ("count(//foo)").ToString ()); - AssertEquals ("1", navigator.Evaluate ("count(/foo)").ToString ()); - AssertEquals ("1", navigator.Evaluate ("count(/foo/bar)").ToString ()); + Assert.AreEqual ("5", navigator.Evaluate ("count(//*)").ToString (), "#1"); + Assert.AreEqual ("1", navigator.Evaluate ("count(//foo)").ToString (), "#2"); + Assert.AreEqual ("1", navigator.Evaluate ("count(/foo)").ToString (), "#3"); + Assert.AreEqual ("1", navigator.Evaluate ("count(/foo/bar)").ToString (), "#4"); - AssertEquals ("3", navigator2.Evaluate ("count(//bar)").ToString ()); + Assert.AreEqual ("3", navigator2.Evaluate ("count(//bar)").ToString (), "#5"); } public void saveTestCoreFunctionNodeSetID () @@ -117,17 +117,17 @@ namespace MonoTests.System.Xml ""); navigator = document.CreateNavigator(); - AssertEquals ("hello", navigator.Evaluate ("string(id('1')/@qux)").ToString ()); - AssertEquals ("world", navigator.Evaluate ("string(id('2')/@qux)").ToString ()); + Assert.AreEqual ("hello", navigator.Evaluate ("string(id('1')/@qux)").ToString (), "#1"); + Assert.AreEqual ("world", navigator.Evaluate ("string(id('2')/@qux)").ToString (), "#2"); } [Test] public void CoreFunctionLocalName () { - AssertEquals ("", navigator.Evaluate ("local-name()").ToString ()); - AssertEquals ("", navigator.Evaluate ("local-name(/bogus)").ToString ()); - AssertEquals ("foo", navigator.Evaluate ("local-name(/foo)").ToString ()); - AssertEquals ("bar", navigator3.Evaluate ("local-name(/foo/*)").ToString ()); + Assert.AreEqual ("", navigator.Evaluate ("local-name()").ToString (), "#1"); + Assert.AreEqual ("", navigator.Evaluate ("local-name(/bogus)").ToString (), "#2"); + Assert.AreEqual ("foo", navigator.Evaluate ("local-name(/foo)").ToString (), "#3"); + Assert.AreEqual ("bar", navigator3.Evaluate ("local-name(/foo/*)").ToString (), "#4"); } // TODO: umm. Unable to make this return a namespace-uri so far... @@ -137,10 +137,10 @@ namespace MonoTests.System.Xml document.LoadXml (""); navigator = document.CreateNavigator (); - AssertEquals ("", navigator.Evaluate ("namespace-uri()").ToString ()); - AssertEquals ("", navigator.Evaluate ("namespace-uri(/bogus)").ToString ()); - //AssertEquals("foo", navigator.Evaluate ("namespace-uri(/bar)").ToString ()); - AssertEquals ("", navigator2.Evaluate ("namespace-uri(//bar)").ToString ()); + Assert.AreEqual ("", navigator.Evaluate ("namespace-uri()").ToString (), "#1"); + Assert.AreEqual ("", navigator.Evaluate ("namespace-uri(/bogus)").ToString (), "#2"); + //Assert.AreEqual("foo", navigator.Evaluate ("namespace-uri(/bar)").ToString (), "#3"); + Assert.AreEqual ("", navigator2.Evaluate ("namespace-uri(//bar)").ToString (), "#4"); } public void saveTestCoreFunctionString () @@ -148,28 +148,28 @@ namespace MonoTests.System.Xml document.LoadXml ("helloworldhow are you"); navigator = document.CreateNavigator (); - AssertEquals ("world", navigator.Evaluate ("string(/foo/*)").ToString ()); - AssertEquals ("NaN", navigator.Evaluate ("string(0 div 0)").ToString ()); + Assert.AreEqual ("world", navigator.Evaluate ("string(/foo/*)").ToString (), "#1"); + Assert.AreEqual ("NaN", navigator.Evaluate ("string(0 div 0)").ToString (), "#2"); try { navigator.Evaluate ("string(+0)"); - Fail ("Expected an XPathException to be thrown."); + Assert.Fail ("Expected an XPathException to be thrown."); } catch (XPathException) {} - AssertEquals ("0", navigator.Evaluate ("string(-0)").ToString ()); - AssertEquals ("Infinity", navigator.Evaluate ("string(1 div 0)").ToString ()); - AssertEquals ("-Infinity", navigator.Evaluate ("string(-1 div 0)").ToString ()); - AssertEquals ("45", navigator.Evaluate ("string(45)").ToString ()); - AssertEquals ("-22", navigator.Evaluate ("string(-22)").ToString ()); - AssertEquals ("0.25", navigator.Evaluate ("string(.25)").ToString ()); - AssertEquals ("-0.25", navigator.Evaluate ("string(-.25)").ToString ()); - AssertEquals ("2", navigator.Evaluate ("string(2.0)").ToString ()); - AssertEquals ("2.01", navigator.Evaluate ("string(2.01)").ToString ()); - AssertEquals ("-3", navigator.Evaluate ("string(-3.0)").ToString ()); - AssertEquals ("3.45", navigator.Evaluate ("string(3.45)").ToString ()); + Assert.AreEqual ("0", navigator.Evaluate ("string(-0)").ToString (), "#3"); + Assert.AreEqual ("Infinity", navigator.Evaluate ("string(1 div 0)").ToString (), "#4"); + Assert.AreEqual ("-Infinity", navigator.Evaluate ("string(-1 div 0)").ToString (), "#5"); + Assert.AreEqual ("45", navigator.Evaluate ("string(45)").ToString (), "#6"); + Assert.AreEqual ("-22", navigator.Evaluate ("string(-22)").ToString (), "#7"); + Assert.AreEqual ("0.25", navigator.Evaluate ("string(.25)").ToString (), "#8"); + Assert.AreEqual ("-0.25", navigator.Evaluate ("string(-.25)").ToString (), "#9"); + Assert.AreEqual ("2", navigator.Evaluate ("string(2.0)").ToString (), "#10"); + Assert.AreEqual ("2.01", navigator.Evaluate ("string(2.01)").ToString (), "#11"); + Assert.AreEqual ("-3", navigator.Evaluate ("string(-3.0)").ToString (), "#12"); + Assert.AreEqual ("3.45", navigator.Evaluate ("string(3.45)").ToString (), "#13"); // Wonder what this will look like under a different platform. - AssertEquals("0.33333333333333331", navigator.Evaluate ("string(1 div 3)").ToString ()); + Assert.AreEqual("0.33333333333333331", navigator.Evaluate ("string(1 div 3)").ToString (), "#14"); } [Test] @@ -177,18 +177,18 @@ namespace MonoTests.System.Xml { try { navigator.Evaluate ("concat()"); - Fail ("Expected an XPathException to be thrown."); + Assert.Fail ("Expected an XPathException to be thrown."); } catch (XPathException) {} try { navigator.Evaluate ("concat('foo')"); - Fail ("Expected an XPathException to be thrown."); + Assert.Fail ("Expected an XPathException to be thrown."); } catch (XPathException) {} - AssertEquals ("foobar", navigator.Evaluate ("concat('foo', 'bar')").ToString ()); - AssertEquals ("foobarbaz", navigator.Evaluate ("concat('foo', 'bar', 'baz')").ToString ()); - AssertEquals ("foobarbazqux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux')").ToString ()); - AssertEquals ("foobarbazquxquux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux', 'quux')").ToString ()); + Assert.AreEqual ("foobar", navigator.Evaluate ("concat('foo', 'bar')").ToString (), "#1"); + Assert.AreEqual ("foobarbaz", navigator.Evaluate ("concat('foo', 'bar', 'baz')").ToString (), "#2"); + Assert.AreEqual ("foobarbazqux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux')").ToString (), "#3"); + Assert.AreEqual ("foobarbazquxquux", navigator.Evaluate ("concat('foo', 'bar', 'baz', 'qux', 'quux')").ToString (), "#4"); } [Test] @@ -196,21 +196,21 @@ namespace MonoTests.System.Xml { try { navigator.Evaluate ("starts-with()"); - Fail ("Expected an XPathException to be thrown."); + Assert.Fail ("Expected an XPathException to be thrown."); } catch (XPathException) {} try { navigator.Evaluate ("starts-with('foo')"); - Fail ("Expected an XPathException to be thrown."); + Assert.Fail ("Expected an XPathException to be thrown."); } catch (XPathException) {} try { navigator.Evaluate ("starts-with('foo', 'bar', 'baz')"); - Fail ("Expected an XPathException to be thrown."); + Assert.Fail ("Expected an XPathException to be thrown."); } catch (XPathException) {} - Assert ((bool)navigator.Evaluate ("starts-with('foobar', 'foo')")); - Assert (!(bool)navigator.Evaluate ("starts-with('foobar', 'bar')")); + Assert.IsTrue ((bool)navigator.Evaluate ("starts-with('foobar', 'foo')")); + Assert.IsTrue (!(bool)navigator.Evaluate ("starts-with('foobar', 'bar')")); } [Test] @@ -218,21 +218,21 @@ namespace MonoTests.System.Xml { try { navigator.Evaluate ("contains()"); - Fail ("Expected an XPathException to be thrown."); + Assert.Fail ("Expected an XPathException to be thrown."); } catch (XPathException) {} try { navigator.Evaluate ("contains('foo')"); - Fail ("Expected an XPathException to be thrown."); + Assert.Fail ("Expected an XPathException to be thrown."); } catch (XPathException) {} try { navigator.Evaluate ("contains('foobar', 'oob', 'baz')"); - Fail ("Expected an XPathException to be thrown."); + Assert.Fail ("Expected an XPathException to be thrown."); } catch (XPathException) {} - Assert ((bool)navigator.Evaluate ("contains('foobar', 'oob')")); - Assert (!(bool)navigator.Evaluate ("contains('foobar', 'baz')")); + Assert.IsTrue ((bool)navigator.Evaluate ("contains('foobar', 'oob')")); + Assert.IsTrue (!(bool)navigator.Evaluate ("contains('foobar', 'baz')")); } } } diff --git a/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorTests.cs b/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorTests.cs index 4dfe25a39c5..09ebe7ebc50 100644 --- a/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorTests.cs +++ b/mcs/class/System.XML/Test/System.Xml.XPath/XPathNavigatorTests.cs @@ -22,7 +22,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XPathNavigatorTests : Assertion + public class XPathNavigatorTests { XmlDocument document; XPathNavigator navigator; @@ -38,7 +38,7 @@ namespace MonoTests.System.Xml { document.LoadXml (""); navigator = document.CreateNavigator (); - AssertNotNull (navigator); + Assert.IsNotNull (navigator); } [Test] @@ -47,14 +47,14 @@ namespace MonoTests.System.Xml document.LoadXml (""); navigator = document.CreateNavigator (); - AssertEquals (XPathNodeType.Root, navigator.NodeType); - AssertEquals (String.Empty, navigator.Name); - AssertEquals (String.Empty, navigator.LocalName); - AssertEquals (String.Empty, navigator.NamespaceURI); - AssertEquals (String.Empty, navigator.Prefix); - Assert (!navigator.HasAttributes); - Assert (navigator.HasChildren); - Assert (!navigator.IsEmptyElement); + Assert.AreEqual (XPathNodeType.Root, navigator.NodeType, "#1"); + Assert.AreEqual (String.Empty, navigator.Name, "#2"); + Assert.AreEqual (String.Empty, navigator.LocalName, "#3"); + Assert.AreEqual (String.Empty, navigator.NamespaceURI, "#4"); + Assert.AreEqual (String.Empty, navigator.Prefix, "#5"); + Assert.IsTrue (!navigator.HasAttributes, "#6"); + Assert.IsTrue (navigator.HasChildren, "#7"); + Assert.IsTrue (!navigator.IsEmptyElement, "#8"); } [Test] @@ -63,14 +63,14 @@ namespace MonoTests.System.Xml document.LoadXml (""); navigator = document.DocumentElement.CreateNavigator (); - AssertEquals (XPathNodeType.Element, navigator.NodeType); - AssertEquals ("foo:bar", navigator.Name); - AssertEquals ("bar", navigator.LocalName); - AssertEquals ("#foo", navigator.NamespaceURI); - AssertEquals ("foo", navigator.Prefix); - Assert (!navigator.HasAttributes); - Assert (!navigator.HasChildren); - Assert (navigator.IsEmptyElement); + Assert.AreEqual (XPathNodeType.Element, navigator.NodeType, "#1"); + Assert.AreEqual ("foo:bar", navigator.Name, "#2"); + Assert.AreEqual ("bar", navigator.LocalName, "#3"); + Assert.AreEqual ("#foo", navigator.NamespaceURI, "#4"); + Assert.AreEqual ("foo", navigator.Prefix, "#5"); + Assert.IsTrue (!navigator.HasAttributes, "#6"); + Assert.IsTrue (!navigator.HasChildren, "#7"); + Assert.IsTrue (navigator.IsEmptyElement, "#8"); } [Test] @@ -79,22 +79,22 @@ namespace MonoTests.System.Xml document.LoadXml (""); navigator = document.DocumentElement.GetAttributeNode("baz", "#bar").CreateNavigator (); - AssertEquals (XPathNodeType.Attribute, navigator.NodeType); - AssertEquals ("bar:baz", navigator.Name); - AssertEquals ("baz", navigator.LocalName); - AssertEquals ("#bar", navigator.NamespaceURI); - AssertEquals ("bar", navigator.Prefix); - Assert (!navigator.HasAttributes); - Assert (!navigator.HasChildren); - Assert (!navigator.IsEmptyElement); + Assert.AreEqual (XPathNodeType.Attribute, navigator.NodeType, "#1"); + Assert.AreEqual ("bar:baz", navigator.Name, "#2"); + Assert.AreEqual ("baz", navigator.LocalName, "#3"); + Assert.AreEqual ("#bar", navigator.NamespaceURI, "#4"); + Assert.AreEqual ("bar", navigator.Prefix, "#5"); + Assert.IsTrue (!navigator.HasAttributes, "#6"); + Assert.IsTrue (!navigator.HasChildren, "#7"); + Assert.IsTrue (!navigator.IsEmptyElement, "#8"); } [Test] public void PropertiesOnNamespace () { - document.LoadXml (""); - navigator = document.DocumentElement.Attributes [0].CreateNavigator (); - AssertEquals (XPathNodeType.Namespace, navigator.NodeType); + document.LoadXml (""); + navigator = document.DocumentElement.Attributes [0].CreateNavigator (); + Assert.AreEqual (XPathNodeType.Namespace, navigator.NodeType, "#1"); } [Test] @@ -103,32 +103,32 @@ namespace MonoTests.System.Xml document.LoadXml (""); navigator = document.DocumentElement.CreateNavigator (); - AssertEquals ("foo", navigator.Name); - Assert (navigator.MoveToFirstChild ()); - AssertEquals ("bar", navigator.Name); - Assert (navigator.MoveToNext ()); - AssertEquals ("baz", navigator.Name); - Assert (!navigator.MoveToNext ()); - AssertEquals ("baz", navigator.Name); - Assert (navigator.MoveToPrevious ()); - AssertEquals ("bar", navigator.Name); - Assert (!navigator.MoveToPrevious ()); - Assert (navigator.MoveToParent ()); - AssertEquals ("foo", navigator.Name); + Assert.AreEqual ("foo", navigator.Name, "#1"); + Assert.IsTrue (navigator.MoveToFirstChild (), "#2"); + Assert.AreEqual ("bar", navigator.Name, "#3"); + Assert.IsTrue (navigator.MoveToNext (), "#4"); + Assert.AreEqual ("baz", navigator.Name, "#5"); + Assert.IsTrue (!navigator.MoveToNext (), "#6"); + Assert.AreEqual ("baz", navigator.Name, "#7"); + Assert.IsTrue (navigator.MoveToPrevious (), "#8"); + Assert.AreEqual ("bar", navigator.Name, "#9"); + Assert.IsTrue (!navigator.MoveToPrevious (), "#10"); + Assert.IsTrue (navigator.MoveToParent (), "#11"); + Assert.AreEqual ("foo", navigator.Name, "#12"); navigator.MoveToRoot (); - AssertEquals (XPathNodeType.Root, navigator.NodeType); - Assert (!navigator.MoveToParent ()); - AssertEquals (XPathNodeType.Root, navigator.NodeType); - Assert (navigator.MoveToFirstChild ()); - AssertEquals ("foo", navigator.Name); - Assert (navigator.MoveToFirst ()); - AssertEquals ("foo", navigator.Name); - Assert (navigator.MoveToFirstChild ()); - AssertEquals ("bar", navigator.Name); - Assert (navigator.MoveToNext ()); - AssertEquals ("baz", navigator.Name); - Assert (navigator.MoveToFirst ()); - AssertEquals ("bar", navigator.Name); + Assert.AreEqual (XPathNodeType.Root, navigator.NodeType, "#13"); + Assert.IsTrue (!navigator.MoveToParent (), "#14"); + Assert.AreEqual (XPathNodeType.Root, navigator.NodeType, "#15"); + Assert.IsTrue (navigator.MoveToFirstChild (), "#16"); + Assert.AreEqual ("foo", navigator.Name, "#17"); + Assert.IsTrue (navigator.MoveToFirst (), "#18"); + Assert.AreEqual ("foo", navigator.Name, "#19"); + Assert.IsTrue (navigator.MoveToFirstChild (), "#20"); + Assert.AreEqual ("bar", navigator.Name, "#21"); + Assert.IsTrue (navigator.MoveToNext (), "#22"); + Assert.AreEqual ("baz", navigator.Name, "#23"); + Assert.IsTrue (navigator.MoveToFirst (), "#24"); + Assert.AreEqual ("bar", navigator.Name, "#25"); } [Test] @@ -143,20 +143,20 @@ namespace MonoTests.System.Xml document2.LoadXml (""); XPathNavigator navigator2 = document2.DocumentElement.CreateNavigator (); - AssertEquals ("foo", navigator1a.Name); - Assert (navigator1a.MoveToFirstChild ()); - AssertEquals ("bar", navigator1a.Name); + Assert.AreEqual ("foo", navigator1a.Name, "#1"); + Assert.IsTrue (navigator1a.MoveToFirstChild (), "#2"); + Assert.AreEqual ("bar", navigator1a.Name, "#3"); - Assert (!navigator1b.IsSamePosition (navigator1a)); - AssertEquals ("foo", navigator1b.Name); - Assert (navigator1b.MoveTo (navigator1a)); - Assert (navigator1b.IsSamePosition (navigator1a)); - AssertEquals ("bar", navigator1b.Name); + Assert.IsTrue (!navigator1b.IsSamePosition (navigator1a), "#4"); + Assert.AreEqual ("foo", navigator1b.Name, "#5"); + Assert.IsTrue (navigator1b.MoveTo (navigator1a), "#6"); + Assert.IsTrue (navigator1b.IsSamePosition (navigator1a), "#7"); + Assert.AreEqual ("bar", navigator1b.Name, "#8"); - Assert (!navigator2.IsSamePosition (navigator1a)); - AssertEquals ("foo", navigator2.Name); - Assert (!navigator2.MoveTo (navigator1a)); - AssertEquals ("foo", navigator2.Name); + Assert.IsTrue (!navigator2.IsSamePosition (navigator1a), "#9"); + Assert.AreEqual ("foo", navigator2.Name, "#10"); + Assert.IsTrue (!navigator2.MoveTo (navigator1a), "#11"); + Assert.AreEqual ("foo", navigator2.Name, "#12"); } [Test] @@ -165,16 +165,16 @@ namespace MonoTests.System.Xml document.LoadXml (""); navigator = document.DocumentElement.CreateNavigator (); - AssertEquals (XPathNodeType.Element, navigator.NodeType); - AssertEquals ("foo", navigator.Name); - Assert (navigator.MoveToFirstAttribute ()); - AssertEquals (XPathNodeType.Attribute, navigator.NodeType); - AssertEquals ("bar", navigator.Name); - AssertEquals ("baz", navigator.Value); - Assert (navigator.MoveToNextAttribute ()); - AssertEquals (XPathNodeType.Attribute, navigator.NodeType); - AssertEquals ("quux", navigator.Name); - AssertEquals ("quuux", navigator.Value); + Assert.AreEqual (XPathNodeType.Element, navigator.NodeType, "#1"); + Assert.AreEqual ("foo", navigator.Name, "#2"); + Assert.IsTrue (navigator.MoveToFirstAttribute (), "#3"); + Assert.AreEqual (XPathNodeType.Attribute, navigator.NodeType, "#4"); + Assert.AreEqual ("bar", navigator.Name, "#5"); + Assert.AreEqual ("baz", navigator.Value, "#6"); + Assert.IsTrue (navigator.MoveToNextAttribute (), "#7"); + Assert.AreEqual (XPathNodeType.Attribute, navigator.NodeType, "#8"); + Assert.AreEqual ("quux", navigator.Name, "#9"); + Assert.AreEqual ("quuux", navigator.Value, "#10"); } [Test] @@ -183,12 +183,12 @@ namespace MonoTests.System.Xml document.LoadXml ("bazquuux"); navigator = document.DocumentElement.CreateNavigator (); - AssertEquals (XPathNodeType.Element, navigator.NodeType); - AssertEquals ("foo", navigator.Name); - //AssertEquals ("bazquuux", navigator.Value); + Assert.AreEqual (XPathNodeType.Element, navigator.NodeType, "#1"); + Assert.AreEqual ("foo", navigator.Name, "#2"); + //Assert.AreEqual ("bazquuux", navigator.Value, "#3"); navigator.MoveToRoot (); - //AssertEquals ("bazquuux", navigator.Value); + //Assert.AreEqual ("bazquuux", navigator.Value, "#4"); } [Test] @@ -199,8 +199,8 @@ namespace MonoTests.System.Xml navigator.MoveToRoot (); navigator.MoveToFirstChild (); - AssertEquals (XPathNodeType.Element, navigator.NodeType); - AssertEquals ("Root", navigator.Name); + Assert.AreEqual (XPathNodeType.Element, navigator.NodeType, "#1"); + Assert.AreEqual ("Root", navigator.Name, "#2"); } [Test] @@ -209,12 +209,12 @@ namespace MonoTests.System.Xml document.LoadXml (""); navigator = document.CreateNavigator (); - Assert (navigator.MoveToFirstChild ()); - AssertEquals (XPathNodeType.ProcessingInstruction, navigator.NodeType); - AssertEquals ("xml-stylesheet", navigator.Name); + Assert.IsTrue (navigator.MoveToFirstChild ()); + Assert.AreEqual (XPathNodeType.ProcessingInstruction, navigator.NodeType, "#1"); + Assert.AreEqual ("xml-stylesheet", navigator.Name, "#2"); XPathNodeIterator iter = navigator.SelectChildren (XPathNodeType.Element); - AssertEquals (0, iter.Count); + Assert.AreEqual (0, iter.Count, "#3"); } [Test] @@ -228,7 +228,7 @@ namespace MonoTests.System.Xml node.InnerXml = ""; XmlNode new_include = node.SelectSingleNode ("//include"); - AssertEquals ("", new_include.OuterXml); + Assert.AreEqual ("", new_include.OuterXml, "#1"); // In this case 'node2' has parent 'node' doc = new XmlDocument (); @@ -240,31 +240,31 @@ namespace MonoTests.System.Xml node2.InnerXml = ""; new_include = node2.SelectSingleNode ("/"); - AssertEquals ("", - new_include.OuterXml); + Assert.AreEqual ("", + new_include.OuterXml, "#2"); } [Test] public void XPathDocumentMoveToId () { - string dtd = "]>"; - string xml = dtd + ""; - StringReader sr = new StringReader (xml); - XPathNavigator nav = new XPathDocument (sr).CreateNavigator (); - Assert ("ctor() from TextReader", nav.MoveToId ("aaa")); + string dtd = "]>"; + string xml = dtd + ""; + StringReader sr = new StringReader (xml); + XPathNavigator nav = new XPathDocument (sr).CreateNavigator (); + Assert.IsTrue (nav.MoveToId ("aaa"), "ctor() from TextReader"); - XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); - nav = new XPathDocument (xvr).CreateNavigator (); - Assert ("ctor() from XmlValidatingReader", nav.MoveToId ("aaa")); + XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); + nav = new XPathDocument (xvr).CreateNavigator (); + Assert.IsTrue (nav.MoveToId ("aaa"), "ctor() from XmlValidatingReader"); // FIXME: it seems to result in different in .NET 2.0. #if NET_2_0 #else // When it is XmlTextReader, XPathDocument fails. - XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); - nav = new XPathDocument (xtr).CreateNavigator (); - Assert ("ctor() from XmlTextReader", !nav.MoveToId ("aaa")); - xtr.Close (); + XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); + nav = new XPathDocument (xtr).CreateNavigator (); + Assert.IsTrue (!nav.MoveToId ("aaa"), "ctor() from XmlTextReader"); + xtr.Close (); #endif } @@ -280,11 +280,11 @@ namespace MonoTests.System.Xml XmlSpace.Preserve).CreateNavigator (); nav.MoveToFirstChild (); nav.MoveToFirstChild (); - AssertEquals ("#1", XPathNodeType.Whitespace, nav.NodeType); + Assert.AreEqual (XPathNodeType.Whitespace, nav.NodeType, "#1"); nav.MoveToNext (); nav.MoveToFirstChild (); - AssertEquals ("#2", XPathNodeType.SignificantWhitespace, - nav.NodeType); + Assert.AreEqual (XPathNodeType.SignificantWhitespace, + nav.NodeType, "#2"); } [Test] @@ -304,7 +304,7 @@ namespace MonoTests.System.Xml XPathNodeIterator iter = nav.Select ("/root"); iter.MoveNext (); - AssertEquals ("e", iter.Current.Evaluate (expr)); + Assert.AreEqual ("e", iter.Current.Evaluate (expr), "#1"); } class MyContext : XsltContext @@ -420,11 +420,11 @@ namespace MonoTests.System.Xml nav.MoveToFirstChild (); // root nav.MoveToFirstChild (); // ws nav.MoveToFirstChild (); // ' ' - AssertEquals ("#1", true, nav.Matches ("text()")); + Assert.AreEqual (true, nav.Matches ("text()"), "#1"); nav.MoveToParent (); nav.MoveToNext (); // sws nav.MoveToFirstChild (); // ' ' - AssertEquals ("#2", true, nav.Matches ("text()")); + Assert.AreEqual (true, nav.Matches ("text()"), "#2"); } [Test] @@ -438,9 +438,9 @@ namespace MonoTests.System.Xml var i = nav.Select ("descendant::*"); // without this call to get_Count() the bug does not reproduce. - AssertEquals ("#1", 1, i.Count); + Assert.AreEqual (1, i.Count, "#1"); - Assert ("#2", i.MoveNext ()); + Assert.IsTrue (i.MoveNext (), "#2"); } #if NET_2_0 @@ -452,9 +452,9 @@ namespace MonoTests.System.Xml doc.LoadXml (xml); XPathNavigator nav = doc.CreateNavigator (); nav.MoveToFirstChild (); - AssertEquals ("#1", true, nav.ValueAsBoolean); + Assert.AreEqual (true, nav.ValueAsBoolean, "#1"); nav.MoveToFirstChild (); - AssertEquals ("#2", true, nav.ValueAsBoolean); + Assert.AreEqual (true, nav.ValueAsBoolean, "#2"); } [Test] @@ -478,9 +478,9 @@ namespace MonoTests.System.Xml doc.LoadXml (xml); XPathNavigator nav = doc.CreateNavigator (); nav.MoveToFirstChild (); - AssertEquals ("#1", time, nav.ValueAsDateTime); + Assert.AreEqual (time, nav.ValueAsDateTime, "#1"); nav.MoveToFirstChild (); - AssertEquals ("#2", time, nav.ValueAsDateTime); + Assert.AreEqual (time, nav.ValueAsDateTime, "#2"); } [Test] @@ -503,9 +503,9 @@ namespace MonoTests.System.Xml doc.LoadXml (xml); XPathNavigator nav = doc.CreateNavigator (); nav.MoveToFirstChild (); - AssertEquals ("#1", 3.14159265359, nav.ValueAsDouble); + Assert.AreEqual (3.14159265359, nav.ValueAsDouble, "#1"); nav.MoveToFirstChild (); - AssertEquals ("#2", 3.14159265359, nav.ValueAsDouble); + Assert.AreEqual (3.14159265359, nav.ValueAsDouble, "#2"); } [Test] @@ -528,9 +528,9 @@ namespace MonoTests.System.Xml doc.LoadXml (xml); XPathNavigator nav = doc.CreateNavigator (); nav.MoveToFirstChild (); - AssertEquals ("#1", 1, nav.ValueAsInt); + Assert.AreEqual (1, nav.ValueAsInt, "#1"); nav.MoveToFirstChild (); - AssertEquals ("#2", 1, nav.ValueAsInt); + Assert.AreEqual (1, nav.ValueAsInt, "#2"); } [Test] @@ -554,9 +554,9 @@ namespace MonoTests.System.Xml doc.LoadXml (xml); XPathNavigator nav = doc.CreateNavigator (); nav.MoveToFirstChild (); - AssertEquals ("#1", 10000000000000000, nav.ValueAsLong); + Assert.AreEqual (10000000000000000, nav.ValueAsLong, "#1"); nav.MoveToFirstChild (); - AssertEquals ("#2", 10000000000000000, nav.ValueAsLong); + Assert.AreEqual (10000000000000000, nav.ValueAsLong, "#2"); } [Test] @@ -580,12 +580,12 @@ namespace MonoTests.System.Xml XPathNavigator nav = doc.CreateNavigator (); XPathNodeIterator iter = nav.Select ("/Abc/Foo"); iter.MoveNext (); - AssertEquals ("#1", "Hello", iter.Current.InnerXml); - AssertEquals ("#2", "Hello", iter.Current.OuterXml); + Assert.AreEqual ("Hello", iter.Current.InnerXml, "#1"); + Assert.AreEqual ("Hello", iter.Current.OuterXml, "#2"); iter = nav.Select ("/Abc/Foo/text()"); iter.MoveNext (); - AssertEquals ("#3", String.Empty, iter.Current.InnerXml); - AssertEquals ("#4", "Hello", iter.Current.OuterXml); + Assert.AreEqual (String.Empty, iter.Current.InnerXml, "#3"); + Assert.AreEqual ("Hello", iter.Current.OuterXml, "#4"); } [Test] // bug #79875 @@ -597,7 +597,7 @@ namespace MonoTests.System.Xml XPathNodeIterator iter = nav.Select ("/Abc/Foo/@attr"); iter.MoveNext (); - AssertEquals ("val1", iter.Current.InnerXml); + Assert.AreEqual ("val1", iter.Current.InnerXml, "#1"); } [Test] @@ -608,12 +608,12 @@ namespace MonoTests.System.Xml XPathNavigator nav = doc.CreateNavigator (); XPathNodeIterator iter = nav.Select ("/Abc/Foo"); iter.MoveNext (); - AssertEquals ("#1", "Hello<\r\nInnerXml", iter.Current.InnerXml); - AssertEquals ("#2", "Hello<\r\nInnerXml", iter.Current.OuterXml); + Assert.AreEqual ("Hello<\r\nInnerXml", iter.Current.InnerXml, "#1"); + Assert.AreEqual ("Hello<\r\nInnerXml", iter.Current.OuterXml, "#2"); iter = nav.Select ("/Abc/Foo/text()"); iter.MoveNext (); - AssertEquals ("#3", String.Empty, iter.Current.InnerXml); - AssertEquals ("#4", "Hello<\r\nInnerXml", iter.Current.OuterXml); + Assert.AreEqual (String.Empty, iter.Current.InnerXml, "#3"); + Assert.AreEqual ("Hello<\r\nInnerXml", iter.Current.OuterXml, "#4"); } [Test] @@ -626,7 +626,7 @@ namespace MonoTests.System.Xml XPathNodeIterator iter = nav.Select ("/Abc/Foo/@attr"); iter.MoveNext (); - AssertEquals ("val"1 >", iter.Current.InnerXml); + Assert.AreEqual ("val"1 >", iter.Current.InnerXml, "#1"); } [Test] @@ -636,14 +636,14 @@ namespace MonoTests.System.Xml XmlWriter w = doc.CreateNavigator ().AppendChild (); w.WriteStartElement ("foo"); w.WriteAttributeString ("xmlns", "x", "http://www.w3.org/2000/xmlns/", "urn:foo"); - AssertEquals ("#0", "x", w.LookupPrefix ("urn:foo")); + Assert.AreEqual ("x", w.LookupPrefix ("urn:foo"), "#0"); w.WriteStartElement (null, "bar", "urn:foo"); w.WriteAttributeString (null, "ext", "urn:foo", "bah"); w.WriteEndElement (); w.WriteEndElement (); w.Close (); - AssertEquals ("#1", "x", doc.FirstChild.FirstChild.Prefix); - AssertEquals ("#2", "x", doc.FirstChild.FirstChild.Attributes [0].Prefix); + Assert.AreEqual ("x", doc.FirstChild.FirstChild.Prefix, "#1"); + Assert.AreEqual ("x", doc.FirstChild.FirstChild.Attributes [0].Prefix, "#2"); } [Test] @@ -653,8 +653,8 @@ namespace MonoTests.System.Xml XPathNavigator nav = new XPathDocument (XmlReader.Create (new StringReader (xml))).CreateNavigator (); nav.MoveToFirstChild (); nav.MoveToFirstChild (); - AssertEquals ("1", nav.ValueAs (typeof (string), null)); - AssertEquals (1, nav.ValueAs (typeof (int), null)); + Assert.AreEqual ("1", nav.ValueAs (typeof (string), null), "#1"); + Assert.AreEqual (1, nav.ValueAs (typeof (int), null), "#2"); } [Test] @@ -663,11 +663,11 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.LoadXml (""); XPathNavigator nav = doc.CreateNavigator (); - Assert ("#1", nav.MoveToFollowing (XPathNodeType.All)); - Assert ("#2", nav.MoveToFollowing (XPathNodeType.All)); - AssertEquals ("#3", "child", nav.LocalName); - Assert ("#4", nav.MoveToNext (XPathNodeType.All)); - AssertEquals ("#5", "child2", nav.LocalName); + Assert.IsTrue (nav.MoveToFollowing (XPathNodeType.All), "#1"); + Assert.IsTrue (nav.MoveToFollowing (XPathNodeType.All), "#2"); + Assert.AreEqual ("child", nav.LocalName, "#3"); + Assert.IsTrue (nav.MoveToNext (XPathNodeType.All), "#4"); + Assert.AreEqual ("child2", nav.LocalName, "#5"); } [Test] // bug #324606. @@ -688,7 +688,7 @@ namespace MonoTests.System.Xml "; - AssertEquals (result, n.OuterXml.Replace ("\r\n", "\n")); + Assert.AreEqual (result, n.OuterXml.Replace ("\r\n", "\n"), "#1"); } [Test] // bug #376191 @@ -702,7 +702,7 @@ namespace MonoTests.System.Xml q "); XPathNavigator navigator = document.CreateNavigator(); - AssertEquals (navigator.OuterXml, navigator.InnerXml); + Assert.AreEqual (navigator.OuterXml, navigator.InnerXml, "#1"); } #endif } diff --git a/mcs/class/System.XML/Test/System.Xml/ChangeLog b/mcs/class/System.XML/Test/System.Xml/ChangeLog index d2914d9c149..bb14776fe43 100644 --- a/mcs/class/System.XML/Test/System.Xml/ChangeLog +++ b/mcs/class/System.XML/Test/System.Xml/ChangeLog @@ -1,3 +1,7 @@ +2009-06-26 Robert Jordan + + * *.cs: Upgrade to new NUnit style. + 2009-05-22 Gert Driesen * XmlResolverTest.cs: Fix ResolveUri test on Windows when current diff --git a/mcs/class/System.XML/Test/System.Xml/NameTableTests.cs b/mcs/class/System.XML/Test/System.Xml/NameTableTests.cs index 16cb2ccd246..659a45414a1 100644 --- a/mcs/class/System.XML/Test/System.Xml/NameTableTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/NameTableTests.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class NameTableTests : Assertion + public class NameTableTests { NameTable table; @@ -34,12 +34,12 @@ namespace MonoTests.System.Xml { string add = "add1"; string testAdd = table.Add (add); - AssertEquals ("#1", add, testAdd); - AssertSame ("#2", add, testAdd); + Assert.AreEqual (add, testAdd, "#1"); + Assert.AreSame (add, testAdd, "#2"); testAdd = table.Add (""); - AssertEquals ("#3", string.Empty, testAdd); - AssertSame ("#4", string.Empty, testAdd); + Assert.AreEqual (string.Empty, testAdd, "#3"); + Assert.AreSame (string.Empty, testAdd, "#4"); } [Test] @@ -60,15 +60,15 @@ namespace MonoTests.System.Xml int length = 3; // "add" string testAdd = table.Add (test, index, length); - AssertEquals ("#1", "add", testAdd); + Assert.AreEqual ("add", testAdd, "#1"); testAdd = table.Add ((char[]) null, 0, 0); - AssertEquals ("#2", string.Empty, testAdd); - AssertSame ("#3", string.Empty, testAdd); + Assert.AreEqual (string.Empty, testAdd, "#2"); + Assert.AreSame (string.Empty, testAdd, "#3"); testAdd = table.Add (new char[0], 0, 0); - AssertEquals ("#4", string.Empty, testAdd); - AssertSame ("#5", string.Empty, testAdd); + Assert.AreEqual (string.Empty, testAdd, "#4"); + Assert.AreSame (string.Empty, testAdd, "#5"); } [Test] @@ -100,14 +100,14 @@ namespace MonoTests.System.Xml { string get1 = "get1"; string testGet = table.Add (get1); - AssertEquals ("#1", "get1", testGet); + Assert.AreEqual ("get1", testGet, "#1"); - AssertEquals ("#2", testGet, table.Get (get1)); - AssertSame ("#3", get1, testGet ); + Assert.AreEqual (testGet, table.Get (get1), "#2"); + Assert.AreSame (get1, testGet, "#3"); testGet = table.Get (""); - AssertEquals ("#1", string.Empty, testGet); - AssertSame ("#2", string.Empty, testGet); + Assert.AreEqual (string.Empty, testGet, "#1"); + Assert.AreSame (string.Empty, testGet, "#2"); } [Test] @@ -128,10 +128,10 @@ namespace MonoTests.System.Xml int length = 3; // "get" string testGet = table.Add (test, index, length); - AssertEquals ("#1", "get", testGet); + Assert.AreEqual ("get", testGet, "#1"); - AssertEquals ("#2", testGet, table.Get ("get")); - AssertEquals ("#3", testGet, table.Get (test, index, length)); + Assert.AreEqual (testGet, table.Get ("get"), "#2"); + Assert.AreEqual (testGet, table.Get (test, index, length), "#3"); } [Test] @@ -164,16 +164,16 @@ namespace MonoTests.System.Xml string testGet = null; testGet = table.Get ((char[]) null, 10, 0); - AssertEquals ("#1", string.Empty, testGet); - AssertSame ("#2", string.Empty, testGet); + Assert.AreEqual (string.Empty, testGet, "#1"); + Assert.AreSame (string.Empty, testGet, "#2"); testGet = table.Get (new char[0], 2, 0); - AssertEquals ("#3", string.Empty, testGet); - AssertSame ("#4", string.Empty, testGet); + Assert.AreEqual (string.Empty, testGet, "#3"); + Assert.AreSame (string.Empty, testGet, "#4"); testGet = table.Get (new char[3] { 'a', 'b', 'c' }, 5, 0); - AssertEquals ("#5", string.Empty, testGet); - AssertSame ("#6", string.Empty, testGet); + Assert.AreEqual (string.Empty, testGet, "#5"); + Assert.AreSame (string.Empty, testGet, "#6"); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlAttributeCollectionTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlAttributeCollectionTests.cs index 39c060742f7..4193f805396 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlAttributeCollectionTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlAttributeCollectionTests.cs @@ -17,7 +17,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlAttributeCollectionTests : Assertion + public class XmlAttributeCollectionTests { private XmlDocument document; @@ -43,7 +43,7 @@ namespace MonoTests.System.Xml XmlElement xmlElement = xmlNode as XmlElement; XmlAttributeCollection attributes = xmlElement.Attributes; attributes.RemoveAll (); - AssertEquals ("not all attributes removed.", false, xmlElement.HasAttribute ("type")); + Assert.AreEqual (false, xmlElement.HasAttribute ("type"), "not all attributes removed."); } [Test] @@ -56,8 +56,8 @@ namespace MonoTests.System.Xml XmlAttribute xmlAttribute3 = xmlNode as XmlAttribute; XmlAttributeCollection attributeCol = xmlEl.Attributes; xmlAttribute3 = attributeCol.Append (xmlAttribute3); - AssertEquals ("attribute name not properly created.", true, xmlAttribute3.Name.Equals ("attr3")); - AssertEquals ("attribute namespace not properly created.", true, xmlAttribute3.NamespaceURI.Equals ("namespace1")); + Assert.AreEqual (true, xmlAttribute3.Name.Equals ("attr3"), "attribute name not properly created."); + Assert.AreEqual (true, xmlAttribute3.NamespaceURI.Equals ("namespace1"), "attribute namespace not properly created."); } [Test] @@ -68,13 +68,13 @@ namespace MonoTests.System.Xml XmlAttributeCollection col = xmlDoc.DocumentElement.Attributes; XmlAttribute[] array = new XmlAttribute[24]; col.CopyTo(array, 0); - AssertEquals("garnet", array[0].Value); - AssertEquals("moonstone", array[8].Value); - AssertEquals("turquoize", array[11].Value); + Assert.AreEqual ("garnet", array[0].Value); + Assert.AreEqual ("moonstone", array[8].Value); + Assert.AreEqual ("turquoize", array[11].Value); col.CopyTo(array, 12); - AssertEquals("garnet", array[12].Value); - AssertEquals("moonstone", array[20].Value); - AssertEquals("turquoize", array[23].Value); + Assert.AreEqual ("garnet", array[12].Value); + Assert.AreEqual ("moonstone", array[20].Value); + Assert.AreEqual ("turquoize", array[23].Value); } [Test] @@ -88,14 +88,14 @@ namespace MonoTests.System.Xml XmlAttribute attr = xmlDoc.CreateAttribute("b3"); attr.Value = "bloodstone"; col.SetNamedItem(attr); - AssertEquals("SetNamedItem.Normal", "bloodstone", el.GetAttribute("b3")); + Assert.AreEqual ("bloodstone", el.GetAttribute("b3"), "SetNamedItem.Normal"); attr = xmlDoc.CreateAttribute("b3"); attr.Value = "aquamaline"; col.SetNamedItem(attr); - AssertEquals("SetNamedItem.Override", "aquamaline", el.GetAttribute("b3")); - AssertEquals("SetNamedItem.Override.Count.1", 1, el.Attributes.Count); - AssertEquals("SetNamedItem.Override.Count.2", 1, col.Count); + Assert.AreEqual ("aquamaline", el.GetAttribute("b3"), "SetNamedItem.Override"); + Assert.AreEqual (1, el.Attributes.Count, "SetNamedItem.Override.Count.1"); + Assert.AreEqual (1, col.Count, "SetNamedItem.Override.Count.2"); } [Test] @@ -108,31 +108,31 @@ namespace MonoTests.System.Xml XmlAttribute attr = xmlDoc.CreateAttribute("b1"); attr.Value = "garnet"; col.InsertAfter(attr, null); - AssertEquals("InsertAfterNull", "garnet", el.GetAttributeNode("b1").Value); - AssertEquals("InsertAfterNull.Pos", el.GetAttribute("b1"), col[0].Value); + Assert.AreEqual ("garnet", el.GetAttributeNode("b1").Value, "InsertAfterNull"); + Assert.AreEqual (el.GetAttribute("b1"), col[0].Value, "InsertAfterNull.Pos"); attr = xmlDoc.CreateAttribute("b3"); attr.Value = "bloodstone"; col.InsertAfter(attr, el.GetAttributeNode("b2")); - AssertEquals("InsertAfterAttr", "bloodstone", el.GetAttributeNode("b3").Value); - AssertEquals("InsertAfterAttr.Pos", el.GetAttribute("b3"), col[2].Value); + Assert.AreEqual ("bloodstone", el.GetAttributeNode("b3").Value, "InsertAfterAttr"); + Assert.AreEqual (el.GetAttribute("b3"), col[2].Value, "InsertAfterAttr.Pos"); attr = xmlDoc.CreateAttribute("b4"); attr.Value = "diamond"; col.InsertBefore(attr, null); - AssertEquals("InsertBeforeNull", "diamond", el.GetAttributeNode("b4").Value); - AssertEquals("InsertBeforeNull.Pos", el.GetAttribute("b4"), col[3].Value); + Assert.AreEqual ("diamond", el.GetAttributeNode("b4").Value, "InsertBeforeNull"); + Assert.AreEqual (el.GetAttribute("b4"), col[3].Value, "InsertBeforeNull.Pos"); attr = xmlDoc.CreateAttribute("warning"); attr.Value = "mixed modern and traditional;-)"; col.InsertBefore(attr, el.GetAttributeNode("b1")); - AssertEquals("InsertBeforeAttr", "mixed modern and traditional;-)", el.GetAttributeNode("warning").Value); - AssertEquals("InsertBeforeAttr.Pos", el.GetAttributeNode("warning").Value, col[0].Value); + Assert.AreEqual ("mixed modern and traditional;-)", el.GetAttributeNode("warning").Value, "InsertBeforeAttr"); + Assert.AreEqual (el.GetAttributeNode("warning").Value, col[0].Value, "InsertBeforeAttr.Pos"); attr = xmlDoc.CreateAttribute("about"); attr.Value = "lists of birthstone."; col.Prepend(attr); - AssertEquals("Prepend", "lists of birthstone.", col[0].Value); + Assert.AreEqual ("lists of birthstone.", col[0].Value, "Prepend"); } [Test] @@ -168,9 +168,9 @@ namespace MonoTests.System.Xml outOfOrder.Value = "Should still be second attribute"; testElement.Attributes.InsertAfter (outOfOrder, testElement.Attributes [0]); - AssertEquals ("First attribute", testElement.Attributes [0].Value); - AssertEquals ("Should still be second attribute", testElement.Attributes [1].Value); - AssertEquals ("Third attribute", testElement.Attributes [2].Value); + Assert.AreEqual ("First attribute", testElement.Attributes [0].Value); + Assert.AreEqual ("Should still be second attribute", testElement.Attributes [1].Value); + Assert.AreEqual ("Third attribute", testElement.Attributes [2].Value); } [Test] @@ -183,13 +183,13 @@ namespace MonoTests.System.Xml // Remove XmlAttribute attr = col.Remove(el.GetAttributeNode("a12")); - AssertEquals("Remove", 11, col.Count); - AssertEquals("Remove.Removed", "a12", attr.Name); + Assert.AreEqual (11, col.Count, "Remove"); + Assert.AreEqual ("a12", attr.Name, "Remove.Removed"); // RemoveAt attr = col.RemoveAt(5); - AssertEquals("RemoveAt", null, el.GetAttributeNode("a6")); - AssertEquals("Remove.Removed", "pearl", attr.Value); + Assert.AreEqual (null, el.GetAttributeNode("a6"), "RemoveAt"); + Assert.AreEqual ("pearl", attr.Value, "Remove.Removed"); } [Test] @@ -207,11 +207,11 @@ namespace MonoTests.System.Xml doc.DocumentElement.RemoveAttribute("attr"); XmlAttribute defAttr = doc.DocumentElement.Attributes ["attr"]; - AssertNotNull (defAttr); - AssertEquals ("default", defAttr.Value); + Assert.IsNotNull (defAttr); + Assert.AreEqual ("default", defAttr.Value); defAttr.Value = "default"; // same value as default - AssertEquals (true, defAttr.Specified); + Assert.AreEqual (true, defAttr.Specified); } [Test] diff --git a/mcs/class/System.XML/Test/System.Xml/XmlCDataSectionTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlCDataSectionTests.cs index a1ca07b9148..acbc93f6b92 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlCDataSectionTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlCDataSectionTests.cs @@ -17,7 +17,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlCDataSectionTests : Assertion + public class XmlCDataSectionTests { XmlDocument document; XmlCDataSection section; @@ -35,46 +35,41 @@ namespace MonoTests.System.Xml internal void XmlNodeBaseProperties (XmlNode original, XmlNode cloned) { - // AssertEquals (original.nodetype + " was incorrectly cloned.", - // original.baseuri, cloned.baseuri); - AssertNull (cloned.ParentNode); - Assert ("Copies, not pointers", !Object.ReferenceEquals (original,cloned)); + // Assert.AreEqual (// original.baseuri, cloned.baseuri, original.nodetype + " was incorrectly cloned."); + Assert.IsNull (cloned.ParentNode); + Assert.IsTrue (!Object.ReferenceEquals (original, cloned), "Copies, not pointers"); } [Test] public void XmlCDataSectionInnerAndOuterXml () { section = document.CreateCDataSection ("foo"); - AssertEquals (String.Empty, section.InnerXml); - AssertEquals ("", section.OuterXml); + Assert.AreEqual (String.Empty, section.InnerXml); + Assert.AreEqual ("", section.OuterXml); } [Test] public void XmlCDataSectionName () { - AssertEquals (section.NodeType + " Name property broken", - section.Name, "#cdata-section"); + Assert.AreEqual (section.Name, "#cdata-section", section.NodeType + " Name property broken"); } [Test] public void XmlCDataSectionLocalName () { - AssertEquals (section.NodeType + " LocalName property broken", - section.LocalName, "#cdata-section"); + Assert.AreEqual (section.LocalName, "#cdata-section", section.NodeType + " LocalName property broken"); } [Test] public void XmlCDataSectionNodeType () { - AssertEquals ("XmlCDataSection NodeType property broken", - section.NodeType.ToString (), "CDATA"); + Assert.AreEqual (section.NodeType.ToString (), "CDATA", "XmlCDataSection NodeType property broken"); } [Test] public void XmlCDataSectionIsReadOnly () { - AssertEquals ("XmlCDataSection IsReadOnly property broken", - section.IsReadOnly, false); + Assert.AreEqual (section.IsReadOnly, false, "XmlCDataSection IsReadOnly property broken"); } [Test] @@ -84,16 +79,13 @@ namespace MonoTests.System.Xml shallow = section.CloneNode (false); // shallow XmlNodeBaseProperties (original, shallow); - AssertEquals ("Value incorrectly cloned", - original.Value, shallow.Value); + Assert.AreEqual (original.Value, shallow.Value, "Value incorrectly cloned"); deep = section.CloneNode (true); // deep XmlNodeBaseProperties (original, deep); - AssertEquals ("Value incorrectly cloned", - original.Value, deep.Value); + Assert.AreEqual (original.Value, deep.Value, "Value incorrectly cloned"); - AssertEquals ("deep cloning differs from shallow cloning", - deep.OuterXml, shallow.OuterXml); + Assert.AreEqual (deep.OuterXml, shallow.OuterXml, "deep cloning differs from shallow cloning"); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlCharTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlCharTests.cs index f2b43ae46f2..ec137e7274b 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlCharTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlCharTests.cs @@ -22,7 +22,8 @@ using NUnit.Framework; namespace MonoTests.System.Xml { - public class XmlCharTests : Assertion + [TestFixture] + public class XmlCharTests { #if false @@ -30,8 +31,7 @@ namespace MonoTests.System.Xml public void IsFirstNameCharTest () { for (int ch = 0; ch <= 0xFFFF; ++ch) { - Assert ( - XmlChar.IsFirstNameChar (ch) == + Assert.IsTrue (XmlChar.IsFirstNameChar (ch) == IsFirstNameChar (ch)); } } @@ -40,8 +40,7 @@ namespace MonoTests.System.Xml public void IsNameCharTest () { for (int ch = 0; ch <= 0xFFFF; ++ch) { - Assert ( - XmlChar.IsNameChar (ch) == + Assert.IsTrue (XmlChar.IsNameChar (ch) == IsNameChar (ch)); } } @@ -426,4 +425,4 @@ namespace MonoTests.System.Xml } #endif } -} \ No newline at end of file +} diff --git a/mcs/class/System.XML/Test/System.Xml/XmlCharacterDataTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlCharacterDataTests.cs index f0a780788ce..de32cc456ee 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlCharacterDataTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlCharacterDataTests.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlCharacterDataTests : Assertion + public class XmlCharacterDataTests { XmlDocument document; XmlComment comment; @@ -48,13 +48,13 @@ namespace MonoTests.System.Xml changed = false; changing = false; comment.AppendData ("bar"); - Assert (changed); - Assert (changing); - AssertEquals ("foobar", comment.Data); + Assert.IsTrue (changed); + Assert.IsTrue (changing); + Assert.AreEqual ("foobar", comment.Data); comment.Value = "foo"; comment.AppendData (null); - AssertEquals ("foo", comment.Data); + Assert.AreEqual ("foo", comment.Data); } [Test] @@ -64,25 +64,25 @@ namespace MonoTests.System.Xml changed = false; changing = false; comment.DeleteData (1, 1); - Assert (changed); - Assert (changing); - AssertEquals ("br", comment.Data); + Assert.IsTrue (changed); + Assert.IsTrue (changing); + Assert.AreEqual ("br", comment.Data); try { comment.Value = "foo"; comment.DeleteData(-1, 1); - Fail ("Expected an ArgumentOutOfRangeException to be thrown."); + Assert.Fail ("Expected an ArgumentOutOfRangeException to be thrown."); } catch (ArgumentOutOfRangeException) {} comment.Value = "foo"; comment.DeleteData(1, 5); - AssertEquals("f", comment.Data); + Assert.AreEqual ("f", comment.Data); comment.Value = "foo"; comment.DeleteData(3, 10); - AssertEquals("foo", comment.Data); + Assert.AreEqual ("foo", comment.Data); } [Test] @@ -95,27 +95,27 @@ namespace MonoTests.System.Xml changed = false; changing = false; comment.InsertData (3, "bar"); - Assert (changed); - Assert (changing); - AssertEquals ("foobarbaz", comment.Data); + Assert.IsTrue (changed); + Assert.IsTrue (changing); + Assert.AreEqual ("foobarbaz", comment.Data); try { comment.Value = "foo"; comment.InsertData (-1, "bar"); - Fail ("Expected an ArgumentOutOfRangeException to be thrown."); + Assert.Fail ("Expected an ArgumentOutOfRangeException to be thrown."); } catch (ArgumentOutOfRangeException) {} comment.Value = "foo"; comment.InsertData (3, "bar"); - AssertEquals ("foobar", comment.Data); + Assert.AreEqual ("foobar", comment.Data); try { comment.Value = "foo"; comment.InsertData (4, "bar"); - Fail ("Expected an ArgumentOutOfRangeException to be thrown."); + Assert.Fail ("Expected an ArgumentOutOfRangeException to be thrown."); } catch (ArgumentOutOfRangeException) {} @@ -123,7 +123,7 @@ namespace MonoTests.System.Xml { comment.Value = "foo"; comment.InsertData (1, null); - Fail ("Expected an ArgumentNullException to be thrown."); + Assert.Fail ("Expected an ArgumentNullException to be thrown."); } catch (ArgumentNullException) {} } @@ -137,23 +137,23 @@ namespace MonoTests.System.Xml changed = false; changing = false; comment.ReplaceData (0, 3, "bar"); - Assert (changed); - Assert (changing); - AssertEquals ("bar", comment.Data); + Assert.IsTrue (changed); + Assert.IsTrue (changing); + Assert.AreEqual ("bar", comment.Data); comment.Value = "foo"; comment.ReplaceData (2, 3, "bar"); - AssertEquals ("fobar", comment.Data); + Assert.AreEqual ("fobar", comment.Data); comment.Value = "foo"; comment.ReplaceData (3, 3, "bar"); - AssertEquals ("foobar", comment.Data); + Assert.AreEqual ("foobar", comment.Data); try { comment.Value = "foo"; comment.ReplaceData (4, 3, "bar"); - Fail ("Expected an ArgumentOutOfRangeException to be thrown."); + Assert.Fail ("Expected an ArgumentOutOfRangeException to be thrown."); } catch (ArgumentOutOfRangeException) {} @@ -161,23 +161,23 @@ namespace MonoTests.System.Xml { comment.Value = "foo"; comment.ReplaceData (-1, 3, "bar"); - Fail ("Expected an ArgumentOutOfRangeException to be thrown."); + Assert.Fail ("Expected an ArgumentOutOfRangeException to be thrown."); } catch (ArgumentOutOfRangeException) {} comment.Value = "foo"; comment.ReplaceData (0, 2, "bar"); - AssertEquals ("baro", comment.Data); + Assert.AreEqual ("baro", comment.Data); comment.Value = "foo"; comment.ReplaceData (0, 5, "bar"); - AssertEquals ("bar", comment.Data); + Assert.AreEqual ("bar", comment.Data); try { comment.Value = "foo"; comment.ReplaceData (1, 1, null); - Fail ("Expected an ArgumentNullException to be thrown."); + Assert.Fail ("Expected an ArgumentNullException to be thrown."); } catch (ArgumentNullException) {} } @@ -186,7 +186,7 @@ namespace MonoTests.System.Xml public void Substring () { comment.Value = "test string"; - AssertEquals ("test string", comment.Substring (0, 50)); + Assert.AreEqual (comment.Substring (0, 50), "test string"); } [Test] diff --git a/mcs/class/System.XML/Test/System.Xml/XmlCommentTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlCommentTests.cs index b877dc11ffa..627ee66e543 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlCommentTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlCommentTests.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlCommentTests : Assertion + public class XmlCommentTests { XmlDocument document; XmlComment comment; @@ -42,19 +42,17 @@ namespace MonoTests.System.Xml deep = comment.CloneNode (true); // deep XmlNodeBaseProperties (original, deep); - AssertEquals ("Value incorrectly cloned", - original.Value, deep.Value); + Assert.AreEqual (original.Value, deep.Value, "Value incorrectly cloned"); - AssertEquals ("deep cloning differs from shallow cloning", - deep.OuterXml, shallow.OuterXml); + Assert.AreEqual (deep.OuterXml, shallow.OuterXml, "deep cloning differs from shallow cloning"); } [Test] public void XmlCommentInnerAndOuterXml () { comment = document.CreateComment ("foo"); - AssertEquals (String.Empty, comment.InnerXml); - AssertEquals ("", comment.OuterXml); + Assert.AreEqual (String.Empty, comment.InnerXml); + Assert.AreEqual ("", comment.OuterXml); } [Test] @@ -62,8 +60,7 @@ namespace MonoTests.System.Xml { document.LoadXml (""); comment = document.CreateComment ("Comment"); - AssertEquals ("XmlComment IsReadOnly property broken", - comment.IsReadOnly, false); + Assert.AreEqual (comment.IsReadOnly, false, "XmlComment IsReadOnly property broken"); } [Test] @@ -71,8 +68,7 @@ namespace MonoTests.System.Xml { document.LoadXml (""); comment = document.CreateComment ("Comment"); - AssertEquals (comment.NodeType + " LocalName property broken", - comment.LocalName, "#comment"); + Assert.AreEqual (comment.LocalName, "#comment", comment.NodeType + " LocalName property broken"); } [Test] @@ -80,8 +76,7 @@ namespace MonoTests.System.Xml { document.LoadXml (""); comment = document.CreateComment ("Comment"); - AssertEquals (comment.NodeType + " Name property broken", - comment.Name, "#comment"); + Assert.AreEqual (comment.Name, "#comment", comment.NodeType + " Name property broken"); } [Test] @@ -89,8 +84,7 @@ namespace MonoTests.System.Xml { document.LoadXml (""); comment = document.CreateComment ("Comment"); - AssertEquals ("XmlComment NodeType property broken", - comment.NodeType.ToString (), "Comment"); + Assert.AreEqual (comment.NodeType.ToString (), "Comment", "XmlComment NodeType property broken"); } internal void XmlNodeBaseProperties (XmlNode original, XmlNode cloned) @@ -101,11 +95,10 @@ namespace MonoTests.System.Xml // assertequals (original.nodetype + " was incorrectly cloned.", // original.baseuri, cloned.baseuri); - AssertNull (cloned.ParentNode); - AssertEquals ("Value incorrectly cloned", - original.Value, cloned.Value); + Assert.IsNull (cloned.ParentNode); + Assert.AreEqual (original.Value, cloned.Value, "Value incorrectly cloned"); - Assert ("Copies, not pointers", !Object.ReferenceEquals (original,cloned)); + Assert.IsTrue (!Object.ReferenceEquals (original, cloned), "Copies, not pointers"); } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlConvertTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlConvertTests.cs index dea62cd2251..50b5ab5d73a 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlConvertTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlConvertTests.cs @@ -11,51 +11,49 @@ using System.Globalization; using System.Xml; using NUnit.Framework; -using AssertType = NUnit.Framework.Assert; - namespace MonoTests.System.Xml { [TestFixture] - public class XmlConvertTests : Assertion + public class XmlConvertTests { private void AssertName (string result, string source) { - AssertEquals (result, + Assert.AreEqual (result, XmlConvert.EncodeName (source)); } private void AssertNmToken (string result, string source) { - AssertEquals (result, + Assert.AreEqual (result, XmlConvert.EncodeNmToken (source)); } [Test] public void DecodeName () { - AssertEquals (null, XmlConvert.DecodeName (null)); - AssertEquals ("", XmlConvert.DecodeName ("")); - AssertEquals ("Test", XmlConvert.DecodeName ("Test")); - AssertEquals ("_Test", XmlConvert.DecodeName ("_Test")); - AssertEquals ("_hello_friends", XmlConvert.DecodeName ("_hello_friends")); - AssertEquals ("_hello friends", XmlConvert.DecodeName ("_hello friends")); - AssertEquals (" ", XmlConvert.DecodeName ("_x0020_")); + Assert.AreEqual (null, XmlConvert.DecodeName (null)); + Assert.AreEqual ("", XmlConvert.DecodeName ("")); + Assert.AreEqual ("Test", XmlConvert.DecodeName ("Test")); + Assert.AreEqual ("_Test", XmlConvert.DecodeName ("_Test")); + Assert.AreEqual ("_hello_friends", XmlConvert.DecodeName ("_hello_friends")); + Assert.AreEqual ("_hello friends", XmlConvert.DecodeName ("_hello friends")); + Assert.AreEqual (" ", XmlConvert.DecodeName ("_x0020_")); } [Test] public void EncodeLocalName () { - AssertNull (XmlConvert.EncodeLocalName (null)); - AssertEquals (String.Empty, XmlConvert.EncodeLocalName (String.Empty)); - AssertEquals ("Hello_x003A__x0020_", XmlConvert.EncodeLocalName ("Hello: ")); - AssertEquals ("Hello", XmlConvert.EncodeLocalName ("Hello")); + Assert.IsNull (XmlConvert.EncodeLocalName (null)); + Assert.AreEqual (String.Empty, XmlConvert.EncodeLocalName (String.Empty)); + Assert.AreEqual ("Hello_x003A__x0020_", XmlConvert.EncodeLocalName ("Hello: ")); + Assert.AreEqual ("Hello", XmlConvert.EncodeLocalName ("Hello")); } [Test] public void EncodeName () { - AssertNull (XmlConvert.EncodeName (null)); - AssertEquals (String.Empty, XmlConvert.EncodeName (String.Empty)); + Assert.IsNull (XmlConvert.EncodeName (null)); + Assert.AreEqual (String.Empty, XmlConvert.EncodeName (String.Empty)); AssertName ("Test", "Test"); AssertName ("Hello_x0020_my_x0020_friends.", "Hello my friends."); AssertName ("_x0031_23", "123"); @@ -65,7 +63,7 @@ namespace MonoTests.System.Xml [Test] public void EncodeNmToken () { - AssertNull (XmlConvert.EncodeNmToken (null)); + Assert.IsNull (XmlConvert.EncodeNmToken (null)); AssertNmToken ("Test", "Test"); AssertNmToken ("Hello_x0020_my_x0020_friends.", "Hello my friends."); AssertNmToken ("123", "123"); @@ -82,13 +80,13 @@ namespace MonoTests.System.Xml [Test] public void ToBoolean () { - AssertEquals (true, XmlConvert.ToBoolean (" 1 ")); - AssertEquals (true, XmlConvert.ToBoolean (" true ")); - AssertEquals (false, XmlConvert.ToBoolean (" 0 ")); - AssertEquals (false, XmlConvert.ToBoolean (" false ")); + Assert.AreEqual (true, XmlConvert.ToBoolean (" 1 ")); + Assert.AreEqual (true, XmlConvert.ToBoolean (" true ")); + Assert.AreEqual (false, XmlConvert.ToBoolean (" 0 ")); + Assert.AreEqual (false, XmlConvert.ToBoolean (" false ")); try { - AssertEquals (false, XmlConvert.ToBoolean (" invalid ")); + Assert.AreEqual (false, XmlConvert.ToBoolean (" invalid ")); } catch (FormatException) { @@ -98,98 +96,98 @@ namespace MonoTests.System.Xml [Test] public void ToByte () { - AssertEquals (255, XmlConvert.ToByte ("255")); + Assert.AreEqual (255, XmlConvert.ToByte ("255")); } [Test] public void ToChar () { - AssertEquals ('x', XmlConvert.ToChar ("x")); + Assert.AreEqual ('x', XmlConvert.ToChar ("x")); } [Test] public void ToDateTime () { //dateTime - AssertEquals (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00").Ticks); - AssertEquals (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0").Ticks); - AssertEquals (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00").Ticks); - AssertEquals (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000").Ticks); - AssertEquals (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000").Ticks); - AssertEquals (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00000").Ticks); - AssertEquals (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000000").Ticks); - AssertEquals (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000000").Ticks); + Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00").Ticks); + Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0").Ticks); + Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00").Ticks); + Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000").Ticks); + Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000").Ticks); + Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00000").Ticks); + Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000000").Ticks); + Assert.AreEqual (632001798000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000000").Ticks); /* // These tests also failed on MS.NET - AssertEquals (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00+13:00").Ticks); - AssertEquals (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0+13:00").Ticks); - AssertEquals (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00+13:00").Ticks); - AssertEquals (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000+13:00").Ticks); - AssertEquals (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000+13:00").Ticks); - AssertEquals (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00000+13:00").Ticks); - AssertEquals (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000000+13:00").Ticks); - AssertEquals (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000000+13:00").Ticks); - AssertEquals (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00Z").Ticks); - AssertEquals (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0Z").Ticks); - AssertEquals (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00Z").Ticks); - AssertEquals (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000Z").Ticks); - AssertEquals (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000Z").Ticks); - AssertEquals (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00000Z").Ticks); - AssertEquals (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000000Z").Ticks); - AssertEquals (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000000Z").Ticks); + Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00+13:00").Ticks); + Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0+13:00").Ticks); + Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00+13:00").Ticks); + Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000+13:00").Ticks); + Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000+13:00").Ticks); + Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00000+13:00").Ticks); + Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000000+13:00").Ticks); + Assert.AreEqual (632001150000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000000+13:00").Ticks); + Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00Z").Ticks); + Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0Z").Ticks); + Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00Z").Ticks); + Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000Z").Ticks); + Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000Z").Ticks); + Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.00000Z").Ticks); + Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.000000Z").Ticks); + Assert.AreEqual (632001618000000000L, XmlConvert.ToDateTime ("2003-09-26T13:30:00.0000000Z").Ticks); */ //time DateTime t1 = new DateTime (DateTime.Today.Year, 1, 1); t1 = DateTime.Today + new TimeSpan (12,0,0); - AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00").Ticks); - AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.0").Ticks); - AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.00").Ticks); - AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.000").Ticks); - AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.0000").Ticks); - AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.00000").Ticks); - AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.000000").Ticks); - AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.0000000").Ticks); - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00+13:00").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.f+13:00").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ff+13:00").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fff+13:00").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffff+13:00").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffff+13:00").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffffff+13:00").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffffff+13:00").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00Z").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fZ").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffZ").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffZ").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffffZ").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffffZ").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffffffZ").Ticks);//doesn't work on .NET - //AssertEquals (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffffffZ").Ticks);//doesn't work on .NET + Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00").Ticks); + Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.0").Ticks); + Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.00").Ticks); + Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.000").Ticks); + Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.0000").Ticks); + Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.00000").Ticks); + Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.000000").Ticks); + Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.0000000").Ticks); + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00+13:00").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.f+13:00").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ff+13:00").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fff+13:00").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffff+13:00").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffff+13:00").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffffff+13:00").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffffff+13:00").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00Z").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fZ").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffZ").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffZ").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffffZ").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffffZ").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.ffffffZ").Ticks);//doesn't work on .NET + //Assert.AreEqual (t1.Ticks, XmlConvert.ToDateTime ("12:00:00.fffffffZ").Ticks);//doesn't work on .NET //date - AssertEquals (632001312000000000L, XmlConvert.ToDateTime ("2003-09-26").Ticks); -// AssertEquals (632000664000000000L, XmlConvert.ToDateTime ("2003-09-26+13:00").Ticks); -// AssertEquals (632001132000000000L, XmlConvert.ToDateTime ("2003-09-26Z").Ticks); + Assert.AreEqual (632001312000000000L, XmlConvert.ToDateTime ("2003-09-26").Ticks); +// Assert.AreEqual (632000664000000000L, XmlConvert.ToDateTime ("2003-09-26+13:00").Ticks); +// Assert.AreEqual (632001132000000000L, XmlConvert.ToDateTime ("2003-09-26Z").Ticks); //gYearMonth - AssertEquals (631979712000000000L, XmlConvert.ToDateTime ("2003-09").Ticks); -// AssertEquals (631979064000000000L, XmlConvert.ToDateTime ("2003-09+13:00").Ticks); -// AssertEquals (631979532000000000L, XmlConvert.ToDateTime ("2003-09Z").Ticks); + Assert.AreEqual (631979712000000000L, XmlConvert.ToDateTime ("2003-09").Ticks); +// Assert.AreEqual (631979064000000000L, XmlConvert.ToDateTime ("2003-09+13:00").Ticks); +// Assert.AreEqual (631979532000000000L, XmlConvert.ToDateTime ("2003-09Z").Ticks); //gYear - AssertEquals (631769760000000000L, XmlConvert.ToDateTime ("2003").Ticks); -// AssertEquals (631769076000000000L, XmlConvert.ToDateTime ("2003+13:00").Ticks); -// AssertEquals (631769544000000000L, XmlConvert.ToDateTime ("2003Z").Ticks); + Assert.AreEqual (631769760000000000L, XmlConvert.ToDateTime ("2003").Ticks); +// Assert.AreEqual (631769076000000000L, XmlConvert.ToDateTime ("2003+13:00").Ticks); +// Assert.AreEqual (631769544000000000L, XmlConvert.ToDateTime ("2003Z").Ticks); //gMonthDay // Don't try locale-dependent test -// AssertEquals (632001312000000000L, XmlConvert.ToDateTime ("--09-26").Ticks);//shouldn't have a hardcoded value -// AssertEquals (632000664000000000L, XmlConvert.ToDateTime ("--09-26+13:00").Ticks);//shouldn't have a hardcoded value -// AssertEquals (632001132000000000L, XmlConvert.ToDateTime ("--09-26Z").Ticks);//shouldn't have a hardcoded value +// Assert.AreEqual (632001312000000000L, XmlConvert.ToDateTime ("--09-26").Ticks);//shouldn't have a hardcoded value +// Assert.AreEqual (632000664000000000L, XmlConvert.ToDateTime ("--09-26+13:00").Ticks);//shouldn't have a hardcoded value +// Assert.AreEqual (632001132000000000L, XmlConvert.ToDateTime ("--09-26Z").Ticks);//shouldn't have a hardcoded value //gDay // Don't try locale-dependent test -// AssertEquals (631791360000000000L, XmlConvert.ToDateTime ("---26").Ticks);//shouldn't have a hardcoded value -// AssertEquals (631790676000000000L, XmlConvert.ToDateTime ("---26+13:00").Ticks);//shouldn't have a hardcoded value -// AssertEquals (631791144000000000L, XmlConvert.ToDateTime ("---26Z").Ticks);//shouldn't have a hardcoded value +// Assert.AreEqual (631791360000000000L, XmlConvert.ToDateTime ("---26").Ticks);//shouldn't have a hardcoded value +// Assert.AreEqual (631790676000000000L, XmlConvert.ToDateTime ("---26+13:00").Ticks);//shouldn't have a hardcoded value +// Assert.AreEqual (631791144000000000L, XmlConvert.ToDateTime ("---26Z").Ticks);//shouldn't have a hardcoded value try { - AssertEquals (45L, XmlConvert.ToDateTime (";ljdfas;kl").Ticks); + Assert.AreEqual (45L, XmlConvert.ToDateTime (";ljdfas;kl").Ticks); } catch (Exception) { @@ -199,16 +197,16 @@ namespace MonoTests.System.Xml [Test] public void ToDecimal () { - AssertEquals (1.987, XmlConvert.ToDecimal ("1.987")); + Assert.AreEqual (1.987, XmlConvert.ToDecimal ("1.987")); } [Test] public void ToDouble () { - AssertEquals (1.0d/0.0d, XmlConvert.ToDouble ("INF")); - AssertEquals (-1.0d/0.0d, XmlConvert.ToDouble ("-INF")); - AssertEquals (0.0d/0.0d, XmlConvert.ToDouble ("NaN")); - AssertEquals (789324, XmlConvert.ToDouble ("789324")); + Assert.AreEqual (1.0d/0.0d, XmlConvert.ToDouble ("INF")); + Assert.AreEqual (-1.0d/0.0d, XmlConvert.ToDouble ("-INF")); + Assert.AreEqual (0.0d/0.0d, XmlConvert.ToDouble ("NaN")); + Assert.AreEqual (789324, XmlConvert.ToDouble ("789324")); } [Test] @@ -216,36 +214,36 @@ namespace MonoTests.System.Xml { // bug #320424 string s = XmlConvert.ToString (double.MaxValue); - AssertEquals (double.MaxValue, XmlConvert.ToDouble (s)); + Assert.AreEqual (double.MaxValue, XmlConvert.ToDouble (s)); } [Test] public void ToGuid () { - AssertEquals (new Guid ("ca761232-ed42-11ce-bacd-00aa0057b223"), XmlConvert.ToGuid ("ca761232-ed42-11ce-bacd-00aa0057b223")); + Assert.AreEqual (new Guid ("ca761232-ed42-11ce-bacd-00aa0057b223"), XmlConvert.ToGuid ("ca761232-ed42-11ce-bacd-00aa0057b223")); } [Test] public void ToInt16 () { - AssertType.AreEqual (0, XmlConvert.ToInt16 ("0"), "0"); - AssertType.AreEqual (-1, XmlConvert.ToInt16 ("-1"), "-1"); - AssertType.AreEqual (1, XmlConvert.ToInt16 ("1"), "1"); - AssertType.AreEqual (32767, XmlConvert.ToInt16 ("32767"), "32767"); - AssertType.AreEqual (-32768, XmlConvert.ToInt16 ("-32768"), "-32768"); + Assert.AreEqual (0, XmlConvert.ToInt16 ("0"), "0"); + Assert.AreEqual (-1, XmlConvert.ToInt16 ("-1"), "-1"); + Assert.AreEqual (1, XmlConvert.ToInt16 ("1"), "1"); + Assert.AreEqual (32767, XmlConvert.ToInt16 ("32767"), "32767"); + Assert.AreEqual (-32768, XmlConvert.ToInt16 ("-32768"), "-32768"); try { XmlConvert.ToInt16 ("32768"); - AssertType.Fail ("32768"); + Assert.Fail ("32768"); } catch (OverflowException) { } try { XmlConvert.ToInt16 ("-32769"); - AssertType.Fail ("-32769"); + Assert.Fail ("-32769"); } catch (OverflowException) { } try { XmlConvert.ToInt16 ("0x100"); - AssertType.Fail ("0x100"); + Assert.Fail ("0x100"); } catch (FormatException) { } } @@ -253,34 +251,34 @@ namespace MonoTests.System.Xml [Test] public void ToInt32 () { - AssertType.AreEqual (0, XmlConvert.ToInt32 ("0"), "0"); - AssertType.AreEqual (-1, XmlConvert.ToInt32 ("-1"), "-1"); - AssertType.AreEqual (1, XmlConvert.ToInt32 ("1"), "1"); - AssertType.AreEqual (int.MaxValue, XmlConvert.ToInt32 ("2147483647"), "2147483647"); - AssertType.AreEqual (int.MinValue, XmlConvert.ToInt32 ("-2147483648"), "-2147483648"); + Assert.AreEqual (0, XmlConvert.ToInt32 ("0"), "0"); + Assert.AreEqual (-1, XmlConvert.ToInt32 ("-1"), "-1"); + Assert.AreEqual (1, XmlConvert.ToInt32 ("1"), "1"); + Assert.AreEqual (int.MaxValue, XmlConvert.ToInt32 ("2147483647"), "2147483647"); + Assert.AreEqual (int.MinValue, XmlConvert.ToInt32 ("-2147483648"), "-2147483648"); try { int.Parse ("2147483648", CultureInfo.CurrentCulture); - AssertType.Fail ("int.Parse(current culture)"); + Assert.Fail ("int.Parse(current culture)"); } catch (OverflowException) { } try { int.Parse ("2147483648", CultureInfo.InvariantCulture); - AssertType.Fail ("int.Parse(invariant culture)"); + Assert.Fail ("int.Parse(invariant culture)"); } catch (OverflowException) { } try { XmlConvert.ToInt32 ("2147483648"); - AssertType.Fail ("2147483648"); + Assert.Fail ("2147483648"); } catch (OverflowException) { } try { XmlConvert.ToInt32 ("-2147483649"); - AssertType.Fail ("-2147483649"); + Assert.Fail ("-2147483649"); } catch (OverflowException) { } try { XmlConvert.ToInt32 ("0x10000"); - AssertType.Fail ("0x10000"); + Assert.Fail ("0x10000"); } catch (FormatException) { } } @@ -288,24 +286,24 @@ namespace MonoTests.System.Xml [Test] public void ToInt64 () { - AssertType.AreEqual (0, XmlConvert.ToInt64 ("0"), "0"); - AssertType.AreEqual (-1, XmlConvert.ToInt64 ("-1"), "-1"); - AssertType.AreEqual (1, XmlConvert.ToInt64 ("1"), "1"); - AssertType.AreEqual (long.MaxValue, XmlConvert.ToInt64 ("9223372036854775807"), "9223372036854775807"); - AssertType.AreEqual (long.MinValue, XmlConvert.ToInt64 ("-9223372036854775808"), "-9223372036854775808"); + Assert.AreEqual (0, XmlConvert.ToInt64 ("0"), "0"); + Assert.AreEqual (-1, XmlConvert.ToInt64 ("-1"), "-1"); + Assert.AreEqual (1, XmlConvert.ToInt64 ("1"), "1"); + Assert.AreEqual (long.MaxValue, XmlConvert.ToInt64 ("9223372036854775807"), "9223372036854775807"); + Assert.AreEqual (long.MinValue, XmlConvert.ToInt64 ("-9223372036854775808"), "-9223372036854775808"); try { XmlConvert.ToInt64 ("9223372036854775808"); - AssertType.Fail ("9223372036854775808"); + Assert.Fail ("9223372036854775808"); } catch (OverflowException) { } try { XmlConvert.ToInt64 ("-9223372036854775809"); - AssertType.Fail ("-9223372036854775809"); + Assert.Fail ("-9223372036854775809"); } catch (OverflowException) { } try { XmlConvert.ToInt64 ("0x10000"); - AssertType.Fail ("0x10000"); + Assert.Fail ("0x10000"); } catch (FormatException) { } } @@ -313,24 +311,24 @@ namespace MonoTests.System.Xml [Test] public void ToSByte () { - AssertType.AreEqual (0, XmlConvert.ToSByte ("0"), "0"); - AssertType.AreEqual (-1, XmlConvert.ToSByte ("-1"), "-1"); - AssertType.AreEqual (1, XmlConvert.ToSByte ("1"), "1"); - AssertType.AreEqual (127, XmlConvert.ToSByte ("127"), "127"); - AssertType.AreEqual (-128, XmlConvert.ToSByte ("-128"), "-128"); + Assert.AreEqual (0, XmlConvert.ToSByte ("0"), "0"); + Assert.AreEqual (-1, XmlConvert.ToSByte ("-1"), "-1"); + Assert.AreEqual (1, XmlConvert.ToSByte ("1"), "1"); + Assert.AreEqual (127, XmlConvert.ToSByte ("127"), "127"); + Assert.AreEqual (-128, XmlConvert.ToSByte ("-128"), "-128"); try { XmlConvert.ToSByte ("128"); - AssertType.Fail ("128"); + Assert.Fail ("128"); } catch (OverflowException) { } try { XmlConvert.ToSByte ("-129"); - AssertType.Fail ("-129"); + Assert.Fail ("-129"); } catch (OverflowException) { } try { XmlConvert.ToSByte ("0x80"); - AssertType.Fail ("0x80"); + Assert.Fail ("0x80"); } catch (FormatException) { } } @@ -347,8 +345,8 @@ namespace MonoTests.System.Xml // Don't include TimeZone value for test value. string dateString = XmlConvert.ToString (new DateTime (2003, 5, 5)); - AssertEquals (33, dateString.Length); - AssertEquals ("2003-05-05T00:00:00.0000000", dateString.Substring (0, 27)); + Assert.AreEqual (33, dateString.Length); + Assert.AreEqual (dateString.Substring (0, 27), "2003-05-05T00:00:00.0000000"); } [Test] @@ -357,62 +355,51 @@ namespace MonoTests.System.Xml // bug #77252 TimeSpan t1 = TimeSpan.FromTicks ( TimeSpan.TicksPerSecond + 1); - AssertEquals ("PT1.0000001S", XmlConvert.ToString (t1)); + Assert.AreEqual ("PT1.0000001S", XmlConvert.ToString (t1)); } [Test] public void ToTimeSpan () { - AssertEquals ("#1", new TimeSpan (0, 0, 0, 0, 1), - XmlConvert.ToTimeSpan ("PT0.001S")); + Assert.AreEqual (new TimeSpan (0, 0, 0, 0, 1), XmlConvert.ToTimeSpan ("PT0.001S"), "#1"); // bug #76328 - AssertEquals ("#2", new TimeSpan (0, 0, 0, 0, 100), - XmlConvert.ToTimeSpan ("PT0.1S")); - AssertEquals ("#3", new TimeSpan (0, 0, 0, 0, 100), - XmlConvert.ToTimeSpan ("PT0.100S")); - AssertEquals ("#4", new TimeSpan (0, 0, 0, 0, 10), - XmlConvert.ToTimeSpan ("PT0.010S")); - AssertEquals ("#5", new TimeSpan (0, 0, 0, 0, 10), - XmlConvert.ToTimeSpan ("PT0.01S")); + Assert.AreEqual (new TimeSpan (0, 0, 0, 0, 100), XmlConvert.ToTimeSpan ("PT0.1S"), "#2"); + Assert.AreEqual (new TimeSpan (0, 0, 0, 0, 100), XmlConvert.ToTimeSpan ("PT0.100S"), "#3"); + Assert.AreEqual (new TimeSpan (0, 0, 0, 0, 10), XmlConvert.ToTimeSpan ("PT0.010S"), "#4"); + Assert.AreEqual (new TimeSpan (0, 0, 0, 0, 10), XmlConvert.ToTimeSpan ("PT0.01S"), "#5"); // bug #77252 - AssertEquals ("#6", - TimeSpan.FromTicks (TimeSpan.TicksPerSecond + 1), - XmlConvert.ToTimeSpan ("PT1.0000001S")); + Assert.AreEqual (TimeSpan.FromTicks (TimeSpan.TicksPerSecond + 1), XmlConvert.ToTimeSpan ("PT1.0000001S"), "#6"); - AssertEquals ("#7", - TimeSpan.MinValue, - XmlConvert.ToTimeSpan ("-P10675199DT2H48M5.4775808S")); + Assert.AreEqual (TimeSpan.MinValue, XmlConvert.ToTimeSpan ("-P10675199DT2H48M5.4775808S"), "#7"); - AssertEquals ("#8", - TimeSpan.MaxValue, - XmlConvert.ToTimeSpan ("P10675199DT2H48M5.4775807S")); + Assert.AreEqual (TimeSpan.MaxValue, XmlConvert.ToTimeSpan ("P10675199DT2H48M5.4775807S"), "#8"); } [Test] public void ToUInt16 () { - AssertType.AreEqual (0, XmlConvert.ToUInt16 ("0"), "0"); - AssertType.AreEqual (1, XmlConvert.ToUInt16 ("1"), "1"); - AssertType.AreEqual (ushort.MaxValue, XmlConvert.ToUInt16 ("65535"), "65535"); + Assert.AreEqual (0, XmlConvert.ToUInt16 ("0"), "0"); + Assert.AreEqual (1, XmlConvert.ToUInt16 ("1"), "1"); + Assert.AreEqual (ushort.MaxValue, XmlConvert.ToUInt16 ("65535"), "65535"); try { ushort.Parse ("65536", CultureInfo.CurrentCulture); - AssertType.Fail ("ushort.Parse(current culture)"); + Assert.Fail ("ushort.Parse(current culture)"); } catch (OverflowException) { } try { ushort.Parse ("65536", CultureInfo.InvariantCulture); - AssertType.Fail ("ushort.Parse(invariant culture)"); + Assert.Fail ("ushort.Parse(invariant culture)"); } catch (OverflowException) { } try { XmlConvert.ToUInt16 ("65536"); - AssertType.Fail ("65536"); + Assert.Fail ("65536"); } catch (OverflowException) { } try { XmlConvert.ToUInt16 ("0x10000"); - AssertType.Fail ("0x10000"); + Assert.Fail ("0x10000"); } catch (FormatException) { } } @@ -420,27 +407,27 @@ namespace MonoTests.System.Xml [Test] public void ToUInt32 () { - AssertType.AreEqual (0, XmlConvert.ToUInt32 ("0"), "0"); - AssertType.AreEqual (1, XmlConvert.ToUInt32 ("1"), "1"); - AssertType.AreEqual (uint.MaxValue, XmlConvert.ToUInt32 ("4294967295"), "4294967295"); + Assert.AreEqual (0, XmlConvert.ToUInt32 ("0"), "0"); + Assert.AreEqual (1, XmlConvert.ToUInt32 ("1"), "1"); + Assert.AreEqual (uint.MaxValue, XmlConvert.ToUInt32 ("4294967295"), "4294967295"); try { uint.Parse ("4294967296", CultureInfo.CurrentCulture); - AssertType.Fail ("uint.Parse(current culture)"); + Assert.Fail ("uint.Parse(current culture)"); } catch (OverflowException) { } try { uint.Parse ("4294967296", CultureInfo.InvariantCulture); - AssertType.Fail ("uint.Parse(invariant culture)"); + Assert.Fail ("uint.Parse(invariant culture)"); } catch (OverflowException) { } try { XmlConvert.ToUInt32 ("4294967296"); - AssertType.Fail ("4294967296"); + Assert.Fail ("4294967296"); } catch (OverflowException) { } try { XmlConvert.ToUInt32 ("0x10000"); - AssertType.Fail ("0x10000"); + Assert.Fail ("0x10000"); } catch (FormatException) { } } @@ -448,27 +435,27 @@ namespace MonoTests.System.Xml [Test] public void ToUInt64 () { - AssertType.AreEqual (0, XmlConvert.ToUInt64 ("0"), "0"); - AssertType.AreEqual (1, XmlConvert.ToUInt64 ("1"), "1"); - AssertType.AreEqual (ulong.MaxValue, XmlConvert.ToUInt64 ("18446744073709551615"), "18446744073709551615"); + Assert.AreEqual (0, XmlConvert.ToUInt64 ("0"), "0"); + Assert.AreEqual (1, XmlConvert.ToUInt64 ("1"), "1"); + Assert.AreEqual (ulong.MaxValue, XmlConvert.ToUInt64 ("18446744073709551615"), "18446744073709551615"); try { ulong.Parse ("18446744073709551616", CultureInfo.CurrentCulture); - AssertType.Fail ("ulong.Parse(current culture)"); + Assert.Fail ("ulong.Parse(current culture)"); } catch (OverflowException) { } try { ulong.Parse ("18446744073709551616", CultureInfo.InvariantCulture); - AssertType.Fail ("ulong.Parse(invariant culture)"); + Assert.Fail ("ulong.Parse(invariant culture)"); } catch (OverflowException) { } try { XmlConvert.ToUInt64 ("18446744073709551616"); - AssertType.Fail ("18446744073709551616"); + Assert.Fail ("18446744073709551616"); } catch (OverflowException) { } try { XmlConvert.ToUInt64 ("0x10000"); - AssertType.Fail ("0x10000"); + Assert.Fail ("0x10000"); } catch (FormatException) { } } @@ -516,7 +503,7 @@ namespace MonoTests.System.Xml try { XmlConvert.VerifyName (value); } catch (XmlException) { - AssertType.Fail (String.Format ("'{0}'", value)); + Assert.Fail (String.Format ("'{0}'", value)); } } @@ -524,7 +511,7 @@ namespace MonoTests.System.Xml { try { XmlConvert.VerifyName (value); - AssertType.Fail (value); + Assert.Fail (value); } catch (XmlException) { } } @@ -532,22 +519,22 @@ namespace MonoTests.System.Xml [Test] public void VerifyNCName () { - AssertEquals ("foo", XmlConvert.VerifyNCName ("foo")); + Assert.AreEqual ("foo", XmlConvert.VerifyNCName ("foo")); try { XmlConvert.VerifyNCName ("?foo"); - Fail (); + Assert.Fail (); } catch (XmlException) {} try { XmlConvert.VerifyNCName (":foo"); - Fail (); + Assert.Fail (); } catch (XmlException) {} try { XmlConvert.VerifyNCName ("foo:bar"); - Fail (); + Assert.Fail (); } catch (XmlException) {} try { XmlConvert.VerifyNCName ("foo:bar:baz"); - Fail (); + Assert.Fail (); } catch (XmlException) {} } @@ -568,7 +555,7 @@ namespace MonoTests.System.Xml [Test] public void DurationZero () // bug #77350 { - AssertEquals ("PT0S", XmlConvert.ToString (TimeSpan.FromSeconds (0))); + Assert.AreEqual ("PT0S", XmlConvert.ToString (TimeSpan.FromSeconds (0))); } #if NET_2_0 @@ -594,23 +581,23 @@ namespace MonoTests.System.Xml XmlConvert.VerifyTOKEN (s); if (success) return; - AssertType.Fail (s + "should fail"); + Assert.Fail (s + "should fail"); } catch (XmlException ex) { if (success) - AssertType.Fail (s + "should not fail"); + Assert.Fail (s + "should not fail"); } } [Test] public void XmlDateTimeSerializationModeAndMaxValue () { - AssertEquals ("#1", "9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.Unspecified).Substring (0, 27)); - AssertEquals ("#2", "9999-12-31T23:59:59.9999999Z", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.Utc)); - AssertEquals ("#3", "9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.RoundtripKind)); - AssertEquals ("#4", "9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.Local).Substring (0, 27)); + Assert.AreEqual ("9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.Unspecified).Substring (0, 27), "#1"); + Assert.AreEqual ("9999-12-31T23:59:59.9999999Z", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.Utc), "#2"); + Assert.AreEqual ("9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.RoundtripKind), "#3"); + Assert.AreEqual ("9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, XmlDateTimeSerializationMode.Local).Substring (0, 27), "#4"); // direct formatting string - no difference - AssertEquals ("#5", "9999-12-31T23:59:59.9999999Z", XmlConvert.ToString (DateTime.MaxValue, "yyyy-MM-ddTHH:mm:ss.FFFFFFFZ")); - AssertEquals ("#6", "9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, "yyyy-MM-ddTHH:mm:ss.FFFFFFFzzz").Substring (0, 27)); + Assert.AreEqual ("9999-12-31T23:59:59.9999999Z", XmlConvert.ToString (DateTime.MaxValue, "yyyy-MM-ddTHH:mm:ss.FFFFFFFZ"), "#5"); + Assert.AreEqual ("9999-12-31T23:59:59.9999999", XmlConvert.ToString (DateTime.MaxValue, "yyyy-MM-ddTHH:mm:ss.FFFFFFFzzz").Substring (0, 27), "#6"); } [Test] @@ -618,23 +605,23 @@ namespace MonoTests.System.Xml { string format = "yyyy-MM-ddTHH:mm:ss.FFFFFFFK"; string s = XmlConvert.ToString (DateTime.UtcNow, format); - AssertType.AreEqual ('Z', s [s.Length -1], "#1-1"); + Assert.AreEqual ('Z', s [s.Length -1], "#1-1"); // LAMESPEC: .NET has a bug here that 'K' in format string does not reflect 'Z' as Utc Kind. // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=307694 - //AssertType.AreEqual (DateTimeKind.Utc, XmlConvert.ToDateTime (s, format).Kind, "#1-2"); + //Assert.AreEqual (DateTimeKind.Utc, XmlConvert.ToDateTime (s, format).Kind, "#1-2"); s = XmlConvert.ToString (DateTime.UtcNow, XmlDateTimeSerializationMode.RoundtripKind); - AssertType.AreEqual ('Z', s [s.Length -1], "#2-1"); - AssertType.AreEqual (DateTimeKind.Utc, XmlConvert.ToDateTime (s, XmlDateTimeSerializationMode.RoundtripKind).Kind, "#2-2"); + Assert.AreEqual ('Z', s [s.Length -1], "#2-1"); + Assert.AreEqual (DateTimeKind.Utc, XmlConvert.ToDateTime (s, XmlDateTimeSerializationMode.RoundtripKind).Kind, "#2-2"); } [Test] public void XmlDateTimeSerializationModeUnspecified () { - AssertEquals ("#1", 27, XmlConvert.ToString (new DateTime (DateTime.MaxValue.Ticks, DateTimeKind.Utc), XmlDateTimeSerializationMode.Unspecified).Length); + Assert.AreEqual (27, XmlConvert.ToString (new DateTime (DateTime.MaxValue.Ticks, DateTimeKind.Utc), XmlDateTimeSerializationMode.Unspecified).Length, "#1"); DateTime dt1 = XmlConvert.ToDateTime ("0001-02-03T10:20:30.0000+02:00", XmlDateTimeSerializationMode.Unspecified); DateTime dt2 = XmlConvert.ToDateTime ("0001-02-03T10:20:30.0000", XmlDateTimeSerializationMode.Unspecified); - AssertEquals ("#2", false, dt1 == dt2); + Assert.AreEqual (false, dt1 == dt2, "#2"); XmlConvert.ToDateTime ("2006-05-30T09:48:32.0Z", XmlDateTimeSerializationMode.Unspecified); string format = "yyyy-MM-ddTHH:mm:ss.FFFFFFFK"; XmlConvert.ToDateTime (XmlConvert.ToString (DateTime.UtcNow, format), XmlDateTimeSerializationMode.Unspecified); @@ -643,10 +630,10 @@ namespace MonoTests.System.Xml [Test] public void XmlDateTimeSerializationModeUtc () { - AssertEquals ("#1", 27, XmlConvert.ToString (new DateTime (DateTime.MaxValue.Ticks, DateTimeKind.Utc), XmlDateTimeSerializationMode.Unspecified).Length); + Assert.AreEqual (27, XmlConvert.ToString (new DateTime (DateTime.MaxValue.Ticks, DateTimeKind.Utc), XmlDateTimeSerializationMode.Unspecified).Length, "#1"); DateTime dt1 = XmlConvert.ToDateTime ("0001-02-03T10:20:30.0000+02:00", XmlDateTimeSerializationMode.Utc); DateTime dt2 = XmlConvert.ToDateTime ("0001-02-03T10:20:30.0000", XmlDateTimeSerializationMode.Utc); - AssertEquals ("#2", false, dt1 == dt2); + Assert.AreEqual (false, dt1 == dt2, "#2"); XmlConvert.ToDateTime ("2006-05-30T09:48:32.0Z", XmlDateTimeSerializationMode.Utc); XmlConvert.ToDateTime ("2006-05-30T09:48:32.0+02:00", XmlDateTimeSerializationMode.Utc); XmlConvert.ToDateTime ("2008-06-11T11:09:47.125Z", XmlDateTimeSerializationMode.Utc); @@ -686,17 +673,17 @@ namespace MonoTests.System.Xml try { XmlConvert.ToDateTime ("0001-02-03T", m); - AssertType.Fail ("#1"); + Assert.Fail ("#1"); } catch (FormatException) { } try { XmlConvert.ToDateTime ("0001-02-03T10:20", m); - AssertType.Fail ("#2"); + Assert.Fail ("#2"); } catch (FormatException) { } try { XmlConvert.ToDateTime ("0001-02-03T10:20:30.", m); - AssertType.Fail ("#3"); + Assert.Fail ("#3"); } catch (FormatException) { } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlDeclarationTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlDeclarationTests.cs index 58f8b0361f3..de6d27604a2 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlDeclarationTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlDeclarationTests.cs @@ -17,7 +17,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlDeclarationTests : Assertion + public class XmlDeclarationTests { XmlDocument document; XmlDeclaration declaration; @@ -34,32 +34,31 @@ namespace MonoTests.System.Xml public void InnerAndOuterXml () { declaration = document.CreateXmlDeclaration ("1.0", null, null); - AssertEquals (String.Empty, declaration.InnerXml); - AssertEquals ("", declaration.OuterXml); + Assert.AreEqual (String.Empty, declaration.InnerXml); + Assert.AreEqual ("", declaration.OuterXml); declaration = document.CreateXmlDeclaration ("1.0", "doesn't check", null); - AssertEquals (String.Empty, declaration.InnerXml); - AssertEquals ("", declaration.OuterXml); + Assert.AreEqual (String.Empty, declaration.InnerXml); + Assert.AreEqual ("", declaration.OuterXml); declaration = document.CreateXmlDeclaration ("1.0", null, "yes"); - AssertEquals (String.Empty, declaration.InnerXml); - AssertEquals ("", declaration.OuterXml); + Assert.AreEqual (String.Empty, declaration.InnerXml); + Assert.AreEqual ("", declaration.OuterXml); declaration = document.CreateXmlDeclaration ("1.0", "foo", "no"); - AssertEquals (String.Empty, declaration.InnerXml); - AssertEquals ("", declaration.OuterXml); + Assert.AreEqual (String.Empty, declaration.InnerXml); + Assert.AreEqual ("", declaration.OuterXml); } internal void XmlNodeBaseProperties (XmlNode original, XmlNode cloned) { // assertequals (original.nodetype + " was incorrectly cloned.", // original.baseuri, cloned.baseuri); - AssertNull (cloned.ParentNode); + Assert.IsNull (cloned.ParentNode); - AssertEquals ("Value incorrectly cloned", - original.Value, cloned.Value); + Assert.AreEqual (original.Value, cloned.Value, "Value incorrectly cloned"); - Assert ("Copies, not pointers", !Object.ReferenceEquals (original,cloned)); + Assert.IsTrue (!Object.ReferenceEquals (original, cloned), "Copies, not pointers"); } [Test] @@ -71,31 +70,31 @@ namespace MonoTests.System.Xml return; } catch (Exception e) { - Fail("first arg null, wrong exception: " + e.ToString()); + Assert.Fail ("first arg null, wrong exception: " + e.ToString()); } } [Test] public void NodeType () { - AssertEquals ("incorrect NodeType returned", XmlNodeType.XmlDeclaration, declaration.NodeType); + Assert.AreEqual (XmlNodeType.XmlDeclaration, declaration.NodeType, "incorrect NodeType returned"); } [Test] public void Names () { - AssertEquals ("Name is incorrect", "xml", declaration.Name); - AssertEquals ("LocalName is incorrect", "xml", declaration.LocalName); + Assert.AreEqual ("xml", declaration.Name, "Name is incorrect"); + Assert.AreEqual ("xml", declaration.LocalName, "LocalName is incorrect"); } [Test] public void EncodingProperty () { XmlDeclaration d1 = document.CreateXmlDeclaration ("1.0", "foo", null); - AssertEquals ("Encoding property", "foo", d1.Encoding); + Assert.AreEqual ("foo", d1.Encoding, "Encoding property"); XmlDeclaration d2 = document.CreateXmlDeclaration ("1.0", null, null); - AssertEquals ("null Encoding property", String.Empty, d2.Encoding); + Assert.AreEqual (String.Empty, d2.Encoding, "null Encoding property"); } [Test] @@ -161,13 +160,13 @@ namespace MonoTests.System.Xml public void StandaloneProperty () { XmlDeclaration d1 = document.CreateXmlDeclaration ("1.0", null, "yes"); - AssertEquals ("Yes standalone property", "yes", d1.Standalone); + Assert.AreEqual ("yes", d1.Standalone, "Yes standalone property"); XmlDeclaration d2 = document.CreateXmlDeclaration ("1.0", null, "no"); - AssertEquals ("No standalone property", "no", d2.Standalone); + Assert.AreEqual ("no", d2.Standalone, "No standalone property"); XmlDeclaration d3 = document.CreateXmlDeclaration ("1.0", null, null); - AssertEquals ("null Standalone property", String.Empty, d3.Standalone); + Assert.AreEqual (String.Empty, d3.Standalone, "null Standalone property"); } [Test] @@ -176,28 +175,28 @@ namespace MonoTests.System.Xml string expected = "version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"" ; XmlDeclaration d = document.CreateXmlDeclaration ("1.0", "ISO-8859-1", "yes"); - AssertEquals ("Value property", expected, d.Value); + Assert.AreEqual (expected, d.Value, "Value property"); d.Value = expected; - AssertEquals ("Value round-trip", expected, d.Value); + Assert.AreEqual (expected, d.Value, "Value round-trip"); d.Value = " " + expected; - AssertEquals ("Value round-trip (padded)", expected, d.Value); + Assert.AreEqual (expected, d.Value, "Value round-trip (padded)"); d.Value = "version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"" ; - AssertEquals ("Value round-trip (padded 2)", expected, d.Value); + Assert.AreEqual (expected, d.Value, "Value round-trip (padded 2)"); d.Value = "version=\"1.0\"\tencoding=\"ISO-8859-1\" standalone=\"yes\"" ; - AssertEquals ("Value round-trip (\\t)", expected, d.Value); + Assert.AreEqual (expected, d.Value, "Value round-trip (\\t)"); d.Value = "version=\"1.0\"\n encoding=\"ISO-8859-1\" standalone=\"yes\"" ; - AssertEquals ("Value round-trip (\\n)", expected, d.Value); + Assert.AreEqual (expected, d.Value, "Value round-trip (\\n)"); d.Value = "version=\"1.0\" encoding = \"ISO-8859-1\" standalone = \"yes\"" ; - AssertEquals ("Value round-trip (spaces)", expected, d.Value); + Assert.AreEqual (expected, d.Value, "Value round-trip (spaces)"); d.Value = "version='1.0' encoding='ISO-8859-1' standalone='yes'" ; - AssertEquals ("Value round-trip ('s)", expected, d.Value); + Assert.AreEqual (expected, d.Value, "Value round-trip ('s)"); } [Test] @@ -212,7 +211,7 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.LoadXml (sw.ToString ()); - AssertEquals ("", doc.OuterXml); + Assert.AreEqual ("", doc.OuterXml); } [Test] @@ -226,8 +225,7 @@ namespace MonoTests.System.Xml XmlNode deep = declaration.CloneNode (true); // deep XmlNodeBaseProperties (original, deep); - AssertEquals ("deep cloning differs from shallow cloning", - deep.OuterXml, shallow.OuterXml); + Assert.AreEqual (deep.OuterXml, shallow.OuterXml, "deep cloning differs from shallow cloning"); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlDocumentEventTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlDocumentEventTests.cs index bd667db8cf1..4df96725fbb 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlDocumentEventTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlDocumentEventTests.cs @@ -16,7 +16,7 @@ using System.Xml; namespace MonoTests.System.Xml { [TestFixture] - public class XmlDocumentEventTests : Assertion + public class XmlDocumentEventTests { public static void Main () { @@ -89,8 +89,7 @@ namespace MonoTests.System.Xml XmlElement el = document.CreateElement ("root"); el.AppendChild (document.CreateTextNode ("simple text node.")); document.AppendChild (el); - AssertEquals ( - "Inserting: Text into Element.\n" + + Assert.AreEqual ("Inserting: Text into Element.\n" + "Inserted: Text into Element.\n" + "Inserting: Element into Document.\n" + "Inserted: Element into Document.\n", @@ -104,8 +103,7 @@ namespace MonoTests.System.Xml doc.LoadXml ("]>"); SetEvents (doc); doc.DocumentElement.RemoveAll (); - AssertEquals ( - "Removing: Attribute from Element.\n" + + Assert.AreEqual ("Removing: Attribute from Element.\n" + "Removed: Attribute from Element.\n" + "Inserting: Text into Attribute.\n" + "Inserted: Text into Attribute.\n" + diff --git a/mcs/class/System.XML/Test/System.Xml/XmlDocumentFragmentTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlDocumentFragmentTests.cs index 95b37ffbc67..c61f72dfce1 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlDocumentFragmentTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlDocumentFragmentTests.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlDocumentFragmentTests : Assertion + public class XmlDocumentFragmentTests { XmlDocument document; XmlDocumentFragment fragment; @@ -26,8 +26,8 @@ namespace MonoTests.System.Xml { XmlDocument d = new XmlDocument (); XmlDocumentFragment df = d.CreateDocumentFragment (); - AssertEquals ("#Constructor.NodeName", "#document-fragment", df.Name); - AssertEquals ("#Constructor.NodeType", XmlNodeType.DocumentFragment, df.NodeType); + Assert.AreEqual ("#document-fragment", df.Name, "#Constructor.NodeName"); + Assert.AreEqual (XmlNodeType.DocumentFragment, df.NodeType, "#Constructor.NodeType"); } [Test] @@ -41,9 +41,9 @@ namespace MonoTests.System.Xml // appending element to fragment fragment.AppendChild (el); - AssertNotNull ("#AppendChildToFragment.Element", fragment.FirstChild); - AssertNotNull ("#AppendChildToFragment.Element.Children", fragment.FirstChild.FirstChild); - AssertEquals ("#AppendChildToFragment.Element.Child.Text", "Test Paragraph", fragment.FirstChild.FirstChild.Value); + Assert.IsNotNull (fragment.FirstChild, "#AppendChildToFragment.Element"); + Assert.IsNotNull (fragment.FirstChild.FirstChild, "#AppendChildToFragment.Element.Children"); + Assert.AreEqual ("Test Paragraph", fragment.FirstChild.FirstChild.Value, "#AppendChildToFragment.Element.Child.Text"); } [Test] @@ -58,10 +58,10 @@ namespace MonoTests.System.Xml // appending fragment to element body.AppendChild (fragment); - AssertNotNull ("#AppendFragmentToElement.Exist", body.FirstChild); - AssertEquals ("#AppendFragmentToElement.ChildIsElement", XmlNodeType.Element, body.FirstChild.NodeType); - AssertEquals ("#AppendFragmentToElement.FirstChild", "p", body.FirstChild.Name); - AssertEquals ("#AppendFragmentToElement.LastChild", "div", body.LastChild.Name); + Assert.IsNotNull (body.FirstChild, "#AppendFragmentToElement.Exist"); + Assert.AreEqual (XmlNodeType.Element, body.FirstChild.NodeType, "#AppendFragmentToElement.ChildIsElement"); + Assert.AreEqual ("p", body.FirstChild.Name, "#AppendFragmentToElement.FirstChild"); + Assert.AreEqual ("div", body.LastChild.Name, "#AppendFragmentToElement.LastChild"); } [Test] @@ -74,7 +74,7 @@ namespace MonoTests.System.Xml fragment.AppendChild (document.CreateElement ("foo")); fragment.AppendChild (document.CreateElement ("bar")); fragment.AppendChild (document.CreateElement ("baz")); - AssertEquals ("#Simple", "", fragment.InnerXml); + Assert.AreEqual ("", fragment.InnerXml, "#Simple"); } [Test] @@ -83,10 +83,10 @@ namespace MonoTests.System.Xml document = new XmlDocument (); fragment = document.CreateDocumentFragment (); fragment.InnerXml = ""; - AssertEquals ("foo", fragment.FirstChild.Name); - AssertEquals ("bar", fragment.FirstChild.NextSibling.Name); - AssertEquals ("child", fragment.FirstChild.NextSibling.FirstChild.Name); - AssertEquals ("baz", fragment.LastChild.Name); + Assert.AreEqual ("foo", fragment.FirstChild.Name); + Assert.AreEqual ("bar", fragment.FirstChild.NextSibling.Name); + Assert.AreEqual ("child", fragment.FirstChild.NextSibling.FirstChild.Name); + Assert.AreEqual ("baz", fragment.LastChild.Name); } [Test] @@ -96,7 +96,7 @@ namespace MonoTests.System.Xml fragment = document.CreateDocumentFragment (); string text = ""; fragment.InnerText = text; - AssertEquals (text, fragment.InnerText); + Assert.AreEqual (text, fragment.InnerText); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlDocumentTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlDocumentTests.cs index 4ecfd7c405e..65b0b104ecf 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlDocumentTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlDocumentTests.cs @@ -27,7 +27,7 @@ using InvalidNodeTypeArgException = System.ArgumentOutOfRangeException; namespace MonoTests.System.Xml { [TestFixture] - public class XmlDocumentTests : Assertion + public class XmlDocumentTests { private XmlDocument document; private ArrayList eventStrings = new ArrayList(); @@ -99,32 +99,32 @@ namespace MonoTests.System.Xml { try { document.CreateNode (null, null, null); - Fail ("Expected an ArgumentException to be thrown."); + Assert.Fail ("Expected an ArgumentException to be thrown."); } catch (ArgumentException) {} try { document.CreateNode ("attribute", null, null); - Fail ("Expected a NullReferenceException to be thrown."); + Assert.Fail ("Expected a NullReferenceException to be thrown."); } catch (NullReferenceException) {} try { document.CreateNode ("attribute", "", null); - Fail ("Expected an ArgumentException to be thrown."); + Assert.Fail ("Expected an ArgumentException to be thrown."); } catch (ArgumentException) {} try { document.CreateNode ("element", null, null); - Fail ("Expected a NullReferenceException to be thrown."); + Assert.Fail ("Expected a NullReferenceException to be thrown."); } catch (NullReferenceException) {} try { document.CreateNode ("element", "", null); - Fail ("Expected an ArgumentException to be thrown."); + Assert.Fail ("Expected an ArgumentException to be thrown."); } catch (ArgumentException) {} try { document.CreateNode ("entityreference", null, null); - Fail ("Expected a NullReferenceException to be thrown."); + Assert.Fail ("Expected a NullReferenceException to be thrown."); } catch (NullReferenceException) {} } @@ -135,32 +135,32 @@ namespace MonoTests.System.Xml try { node = document.CreateNode (XmlNodeType.EndElement, null, null); - Fail ("Expected an ArgumentOutOfRangeException to be thrown."); + Assert.Fail ("Expected an ArgumentOutOfRangeException to be thrown."); } catch (InvalidNodeTypeArgException) {} try { node = document.CreateNode (XmlNodeType.EndEntity, null, null); - Fail ("Expected an ArgumentOutOfRangeException to be thrown."); + Assert.Fail ("Expected an ArgumentOutOfRangeException to be thrown."); } catch (InvalidNodeTypeArgException) {} try { node = document.CreateNode (XmlNodeType.Entity, null, null); - Fail ("Expected an ArgumentOutOfRangeException to be thrown."); + Assert.Fail ("Expected an ArgumentOutOfRangeException to be thrown."); } catch (InvalidNodeTypeArgException) {} try { node = document.CreateNode (XmlNodeType.None, null, null); - Fail ("Expected an ArgumentOutOfRangeException to be thrown."); + Assert.Fail ("Expected an ArgumentOutOfRangeException to be thrown."); } catch (InvalidNodeTypeArgException) {} try { node = document.CreateNode (XmlNodeType.Notation, null, null); - Fail ("Expected an ArgumentOutOfRangeException to be thrown."); + Assert.Fail ("Expected an ArgumentOutOfRangeException to be thrown."); } catch (InvalidNodeTypeArgException) {} // TODO: undocumented allowable type. node = document.CreateNode (XmlNodeType.XmlDeclaration, null, null); - AssertEquals (XmlNodeType.XmlDeclaration, node.NodeType); + Assert.AreEqual (XmlNodeType.XmlDeclaration, node.NodeType); } [Test] @@ -171,33 +171,33 @@ namespace MonoTests.System.Xml // No constructor params for Document, DocumentFragment. node = document.CreateNode (XmlNodeType.CDATA, "a", "b", "c"); - AssertEquals (String.Empty, ((XmlCDataSection)node).Value); + Assert.AreEqual (String.Empty, ((XmlCDataSection)node).Value); node = document.CreateNode (XmlNodeType.Comment, "a", "b", "c"); - AssertEquals (String.Empty, ((XmlComment)node).Value); + Assert.AreEqual (String.Empty, ((XmlComment)node).Value); node = document.CreateNode (XmlNodeType.DocumentType, "a", "b", "c"); - AssertNull (((XmlDocumentType)node).Value); + Assert.IsNull (((XmlDocumentType)node).Value); // TODO: add this back in to test when it's implemented. // node = document.CreateNode (XmlNodeType.EntityReference, "a", "b", "c"); -// AssertNull (((XmlEntityReference)node).Value); +// Assert.IsNull (((XmlEntityReference)node).Value); // TODO: add this back in to test when it's implemented. // node = document.CreateNode (XmlNodeType.ProcessingInstruction, "a", "b", "c"); -// AssertEquals (String.Empty, ((XmlProcessingInstruction)node).Value); +// Assert.AreEqual (String.Empty, ((XmlProcessingInstruction)node).Value); node = document.CreateNode (XmlNodeType.SignificantWhitespace, "a", "b", "c"); - AssertEquals (String.Empty, ((XmlSignificantWhitespace)node).Value); + Assert.AreEqual (String.Empty, ((XmlSignificantWhitespace)node).Value); node = document.CreateNode (XmlNodeType.Text, "a", "b", "c"); - AssertEquals (String.Empty, ((XmlText)node).Value); + Assert.AreEqual (String.Empty, ((XmlText)node).Value); node = document.CreateNode (XmlNodeType.Whitespace, "a", "b", "c"); - AssertEquals (String.Empty, ((XmlWhitespace)node).Value); + Assert.AreEqual (String.Empty, ((XmlWhitespace)node).Value); node = document.CreateNode (XmlNodeType.XmlDeclaration, "a", "b", "c"); - AssertEquals ("version=\"1.0\"", ((XmlDeclaration)node).Value); + Assert.AreEqual ("version=\"1.0\"", ((XmlDeclaration)node).Value); } [Test] @@ -210,74 +210,74 @@ namespace MonoTests.System.Xml try { node = document.CreateNode ("foo", null, null); - Fail ("Expected an ArgumentException to be thrown."); + Assert.Fail ("Expected an ArgumentException to be thrown."); } catch (ArgumentException) {} // .NET 2.0 fails here. node = document.CreateNode("attribute", "foo", null); - AssertEquals (XmlNodeType.Attribute, node.NodeType); + Assert.AreEqual (XmlNodeType.Attribute, node.NodeType); node = document.CreateNode("cdatasection", null, null); - AssertEquals (XmlNodeType.CDATA, node.NodeType); + Assert.AreEqual (XmlNodeType.CDATA, node.NodeType); node = document.CreateNode("comment", null, null); - AssertEquals (XmlNodeType.Comment, node.NodeType); + Assert.AreEqual (XmlNodeType.Comment, node.NodeType); node = document.CreateNode("document", null, null); - AssertEquals (XmlNodeType.Document, node.NodeType); + Assert.AreEqual (XmlNodeType.Document, node.NodeType); // TODO: test which constructor this ended up calling, // i.e. reuse underlying NameTable or not? node = document.CreateNode("documentfragment", null, null); - AssertEquals (XmlNodeType.DocumentFragment, node.NodeType); + Assert.AreEqual (XmlNodeType.DocumentFragment, node.NodeType); node = document.CreateNode("documenttype", null, null); - AssertEquals (XmlNodeType.DocumentType, node.NodeType); + Assert.AreEqual (XmlNodeType.DocumentType, node.NodeType); node = document.CreateNode("element", "foo", null); - AssertEquals (XmlNodeType.Element, node.NodeType); + Assert.AreEqual (XmlNodeType.Element, node.NodeType); // TODO: add this back in to test when it's implemented. // ---> It is implemented, but it is LAMESPEC that allows null entity reference name. // node = document.CreateNode("entityreference", "foo", null); -// AssertEquals (XmlNodeType.EntityReference, node.NodeType); +// Assert.AreEqual (XmlNodeType.EntityReference, node.NodeType); // LAMESPEC: null PI name is silly. // node = document.CreateNode("processinginstruction", null, null); -// AssertEquals (XmlNodeType.ProcessingInstruction, node.NodeType); +// Assert.AreEqual (XmlNodeType.ProcessingInstruction, node.NodeType); node = document.CreateNode("significantwhitespace", null, null); - AssertEquals (XmlNodeType.SignificantWhitespace, node.NodeType); + Assert.AreEqual (XmlNodeType.SignificantWhitespace, node.NodeType); node = document.CreateNode("text", null, null); - AssertEquals (XmlNodeType.Text, node.NodeType); + Assert.AreEqual (XmlNodeType.Text, node.NodeType); node = document.CreateNode("whitespace", null, null); - AssertEquals (XmlNodeType.Whitespace, node.NodeType); + Assert.AreEqual (XmlNodeType.Whitespace, node.NodeType); } [Test] public void DocumentElement () { - AssertNull (document.DocumentElement); + Assert.IsNull (document.DocumentElement); XmlElement element = document.CreateElement ("foo", "bar", "http://foo/"); - AssertNotNull (element); + Assert.IsNotNull (element); - AssertEquals ("foo", element.Prefix); - AssertEquals ("bar", element.LocalName); - AssertEquals ("http://foo/", element.NamespaceURI); + Assert.AreEqual ("foo", element.Prefix); + Assert.AreEqual ("bar", element.LocalName); + Assert.AreEqual ("http://foo/", element.NamespaceURI); - AssertEquals ("foo:bar", element.Name); + Assert.AreEqual ("foo:bar", element.Name); - AssertSame (element, document.AppendChild (element)); + Assert.AreSame (element, document.AppendChild (element)); - AssertSame (element, document.DocumentElement); + Assert.AreSame (element, document.DocumentElement); } [Test] public void DocumentEmpty() { - AssertEquals ("Incorrect output for empty document.", "", document.OuterXml); + Assert.AreEqual ("", document.OuterXml, "Incorrect output for empty document."); } [Test] @@ -292,19 +292,19 @@ namespace MonoTests.System.Xml document.AppendChild (document.CreateElement ("foo")); comment = document.CreateComment ("bar"); document.DocumentElement.AppendChild (comment); - AssertEquals ("", document.DocumentElement.InnerXml); + Assert.AreEqual ("", document.DocumentElement.InnerXml); comment.Value = "baz"; - Assert (eventStrings.Contains ("NodeChanged, Change, , foo, foo")); - AssertEquals ("", document.DocumentElement.InnerXml); + Assert.IsTrue (eventStrings.Contains ("NodeChanged, Change, , foo, foo")); + Assert.AreEqual ("", document.DocumentElement.InnerXml); // Node that isn't part of the document but created by the document. element = document.CreateElement ("foo"); comment = document.CreateComment ("bar"); element.AppendChild (comment); - AssertEquals ("", element.InnerXml); + Assert.AreEqual ("", element.InnerXml); comment.Value = "baz"; - Assert (eventStrings.Contains ("NodeChanged, Change, , foo, foo")); - AssertEquals ("", element.InnerXml); + Assert.IsTrue (eventStrings.Contains ("NodeChanged, Change, , foo, foo")); + Assert.AreEqual ("", element.InnerXml); /* TODO: Insert this when XmlNode.InnerText() and XmlNode.InnerXml() have been implemented. @@ -314,13 +314,13 @@ namespace MonoTests.System.Xml element.InnerText = "bar"; document.AppendChild(element); element.InnerText = "baz"; - Assert(eventStrings.Contains("NodeChanged, Change, baz, foo, foo")); + Assert.IsTrue (eventStrings.Contains("NodeChanged, Change, baz, foo, foo")); // Node that isn't part of the document but created by the document. element = document.CreateElement("qux"); element.InnerText = "quux"; element.InnerText = "quuux"; - Assert(eventStrings.Contains("NodeChanged, Change, quuux, qux, qux")); + Assert.IsTrue (eventStrings.Contains("NodeChanged, Change, quuux, qux, qux")); */ } @@ -336,32 +336,32 @@ namespace MonoTests.System.Xml document.AppendChild (document.CreateElement ("foo")); comment = document.CreateComment ("bar"); document.DocumentElement.AppendChild (comment); - AssertEquals ("", document.DocumentElement.InnerXml); + Assert.AreEqual ("", document.DocumentElement.InnerXml); comment.Value = "baz"; - Assert (eventStrings.Contains ("NodeChanging, Change, , foo, foo")); - AssertEquals ("", document.DocumentElement.InnerXml); + Assert.IsTrue (eventStrings.Contains ("NodeChanging, Change, , foo, foo")); + Assert.AreEqual ("", document.DocumentElement.InnerXml); // Node that isn't part of the document but created by the document. element = document.CreateElement ("foo"); comment = document.CreateComment ("bar"); element.AppendChild (comment); - AssertEquals ("", element.InnerXml); + Assert.AreEqual ("", element.InnerXml); comment.Value = "baz"; - Assert (eventStrings.Contains ("NodeChanging, Change, , foo, foo")); - AssertEquals ("", element.InnerXml); + Assert.IsTrue (eventStrings.Contains ("NodeChanging, Change, , foo, foo")); + Assert.AreEqual ("", element.InnerXml); // If an exception is thrown the Document returns to original state. document.NodeChanging += new XmlNodeChangedEventHandler (this.EventNodeChangingException); element = document.CreateElement("foo"); comment = document.CreateComment ("bar"); element.AppendChild (comment); - AssertEquals ("", element.InnerXml); + Assert.AreEqual ("", element.InnerXml); try { comment.Value = "baz"; - Fail("Expected an exception to be thrown by the NodeChanging event handler method EventNodeChangingException()."); + Assert.Fail ("Expected an exception to be thrown by the NodeChanging event handler method EventNodeChangingException()."); } catch (Exception) {} - AssertEquals ("", element.InnerXml); + Assert.AreEqual ("", element.InnerXml); // Yes it's a bit anal but this tests whether the node changing event exception fires before the // ArgumentOutOfRangeException. Turns out it does so that means our implementation needs to raise @@ -369,7 +369,7 @@ namespace MonoTests.System.Xml try { comment.ReplaceData(-1, 0, "qux"); - Fail("Expected an ArgumentOutOfRangeException to be thrown."); + Assert.Fail ("Expected an ArgumentOutOfRangeException to be thrown."); } catch (Exception) {} @@ -381,13 +381,13 @@ namespace MonoTests.System.Xml element.InnerText = "bar"; document.AppendChild(element); element.InnerText = "baz"; - Assert(eventStrings.Contains("NodeChanging, Change, bar, foo, foo")); + Assert.IsTrue (eventStrings.Contains("NodeChanging, Change, bar, foo, foo")); // Node that isn't part of the document but created by the document. element = document.CreateElement("foo"); element.InnerText = "bar"; element.InnerText = "baz"; - Assert(eventStrings.Contains("NodeChanging, Change, bar, foo, foo")); + Assert.IsTrue (eventStrings.Contains("NodeChanging, Change, bar, foo, foo")); // If an exception is thrown the Document returns to original state. document.NodeChanging += new XmlNodeChangedEventHandler (this.EventNodeChangingException); @@ -395,9 +395,9 @@ namespace MonoTests.System.Xml element.InnerText = "bar"; try { element.InnerText = "baz"; - Fail("Expected an exception to be thrown by the NodeChanging event handler method EventNodeChangingException()."); + Assert.Fail ("Expected an exception to be thrown by the NodeChanging event handler method EventNodeChangingException()."); } catch (Exception) {} - AssertEquals("bar", element.InnerText); + Assert.AreEqual ("bar", element.InnerText); */ } @@ -411,17 +411,17 @@ namespace MonoTests.System.Xml // Inserted 'foo' element to the document. element = document.CreateElement ("foo"); document.AppendChild (element); - Assert (eventStrings.Contains ("NodeInserted, Insert, , , #document")); + Assert.IsTrue (eventStrings.Contains ("NodeInserted, Insert, , , #document")); // Append child on node in document element = document.CreateElement ("foo"); document.DocumentElement.AppendChild (element); - Assert (eventStrings.Contains ("NodeInserted, Insert, , , foo")); + Assert.IsTrue (eventStrings.Contains ("NodeInserted, Insert, , , foo")); // Append child on node not in document but created by document element = document.CreateElement ("bar"); element.AppendChild(document.CreateElement ("bar")); - Assert(eventStrings.Contains("NodeInserted, Insert, , , bar")); + Assert.IsTrue (eventStrings.Contains("NodeInserted, Insert, , , bar")); } [Test] @@ -434,30 +434,30 @@ namespace MonoTests.System.Xml // Inserting 'foo' element to the document. element = document.CreateElement ("foo"); document.AppendChild (element); - Assert (eventStrings.Contains ("NodeInserting, Insert, , , #document")); + Assert.IsTrue (eventStrings.Contains ("NodeInserting, Insert, , , #document")); // Append child on node in document element = document.CreateElement ("foo"); document.DocumentElement.AppendChild (element); - Assert(eventStrings.Contains ("NodeInserting, Insert, , , foo")); + Assert.IsTrue (eventStrings.Contains ("NodeInserting, Insert, , , foo")); // Append child on node not in document but created by document element = document.CreateElement ("bar"); - AssertEquals (0, element.ChildNodes.Count); + Assert.AreEqual (0, element.ChildNodes.Count); element.AppendChild (document.CreateElement ("bar")); - Assert (eventStrings.Contains ("NodeInserting, Insert, , , bar")); - AssertEquals (1, element.ChildNodes.Count); + Assert.IsTrue (eventStrings.Contains ("NodeInserting, Insert, , , bar")); + Assert.AreEqual (1, element.ChildNodes.Count); // If an exception is thrown the Document returns to original state. document.NodeInserting += new XmlNodeChangedEventHandler (this.EventNodeInsertingException); - AssertEquals (1, element.ChildNodes.Count); + Assert.AreEqual (1, element.ChildNodes.Count); try { element.AppendChild (document.CreateElement("baz")); - Fail ("Expected an exception to be thrown by the NodeInserting event handler method EventNodeInsertingException()."); + Assert.Fail ("Expected an exception to be thrown by the NodeInserting event handler method EventNodeInsertingException()."); } catch (Exception) {} - AssertEquals (1, element.ChildNodes.Count); + Assert.AreEqual (1, element.ChildNodes.Count); } [Test] @@ -472,10 +472,10 @@ namespace MonoTests.System.Xml element = document.CreateElement ("foo"); element2 = document.CreateElement ("bar"); element.AppendChild (element2); - AssertEquals (1, element.ChildNodes.Count); + Assert.AreEqual (1, element.ChildNodes.Count); element.RemoveChild (element2); - Assert (eventStrings.Contains ("NodeRemoved, Remove, , foo, ")); - AssertEquals (0, element.ChildNodes.Count); + Assert.IsTrue (eventStrings.Contains ("NodeRemoved, Remove, , foo, ")); + Assert.AreEqual (0, element.ChildNodes.Count); /* * TODO: put this test back in when AttributeCollection.RemoveAll() is implemented. @@ -484,10 +484,10 @@ namespace MonoTests.System.Xml element = document.CreateElement ("foo"); element2 = document.CreateElement ("bar"); element.AppendChild(element2); - AssertEquals(1, element.ChildNodes.Count); + Assert.AreEqual (1, element.ChildNodes.Count); element.RemoveAll(); - Assert (eventStrings.Contains ("NodeRemoved, Remove, , foo, ")); - AssertEquals(0, element.ChildNodes.Count); + Assert.IsTrue (eventStrings.Contains ("NodeRemoved, Remove, , foo, ")); + Assert.AreEqual (0, element.ChildNodes.Count); */ // Removed 'bar' element from 'foo' inside document. @@ -495,10 +495,10 @@ namespace MonoTests.System.Xml document.AppendChild (element); element = document.CreateElement ("bar"); document.DocumentElement.AppendChild (element); - AssertEquals (1, document.DocumentElement.ChildNodes.Count); + Assert.AreEqual (1, document.DocumentElement.ChildNodes.Count); document.DocumentElement.RemoveChild (element); - Assert (eventStrings.Contains ("NodeRemoved, Remove, , foo, ")); - AssertEquals (0, document.DocumentElement.ChildNodes.Count); + Assert.IsTrue (eventStrings.Contains ("NodeRemoved, Remove, , foo, ")); + Assert.AreEqual (0, document.DocumentElement.ChildNodes.Count); } [Test] @@ -513,10 +513,10 @@ namespace MonoTests.System.Xml element = document.CreateElement ("foo"); element2 = document.CreateElement ("bar"); element.AppendChild (element2); - AssertEquals (1, element.ChildNodes.Count); + Assert.AreEqual (1, element.ChildNodes.Count); element.RemoveChild (element2); - Assert (eventStrings.Contains ("NodeRemoving, Remove, , foo, ")); - AssertEquals (0, element.ChildNodes.Count); + Assert.IsTrue (eventStrings.Contains ("NodeRemoving, Remove, , foo, ")); + Assert.AreEqual (0, element.ChildNodes.Count); /* * TODO: put this test back in when AttributeCollection.RemoveAll() is implemented. @@ -525,10 +525,10 @@ namespace MonoTests.System.Xml element = document.CreateElement ("foo"); element2 = document.CreateElement ("bar"); element.AppendChild(element2); - AssertEquals(1, element.ChildNodes.Count); + Assert.AreEqual (1, element.ChildNodes.Count); element.RemoveAll(); - Assert (eventStrings.Contains ("NodeRemoving, Remove, , foo, ")); - AssertEquals(0, element.ChildNodes.Count); + Assert.IsTrue (eventStrings.Contains ("NodeRemoving, Remove, , foo, ")); + Assert.AreEqual (0, element.ChildNodes.Count); */ // Removing 'bar' element from 'foo' inside document. @@ -536,22 +536,22 @@ namespace MonoTests.System.Xml document.AppendChild (element); element = document.CreateElement ("bar"); document.DocumentElement.AppendChild (element); - AssertEquals (1, document.DocumentElement.ChildNodes.Count); + Assert.AreEqual (1, document.DocumentElement.ChildNodes.Count); document.DocumentElement.RemoveChild (element); - Assert (eventStrings.Contains ("NodeRemoving, Remove, , foo, ")); - AssertEquals (0, document.DocumentElement.ChildNodes.Count); + Assert.IsTrue (eventStrings.Contains ("NodeRemoving, Remove, , foo, ")); + Assert.AreEqual (0, document.DocumentElement.ChildNodes.Count); // If an exception is thrown the Document returns to original state. document.NodeRemoving += new XmlNodeChangedEventHandler (this.EventNodeRemovingException); element.AppendChild (element2); - AssertEquals (1, element.ChildNodes.Count); + Assert.AreEqual (1, element.ChildNodes.Count); try { element.RemoveChild(element2); - Fail ("Expected an exception to be thrown by the NodeRemoving event handler method EventNodeRemovingException()."); + Assert.Fail ("Expected an exception to be thrown by the NodeRemoving event handler method EventNodeRemovingException()."); } catch (Exception) {} - AssertEquals (1, element.ChildNodes.Count); + Assert.AreEqual (1, element.ChildNodes.Count); } [Test] @@ -569,7 +569,7 @@ namespace MonoTests.System.Xml document = new XmlDocument (); document.Load (memoryStream); XmlNodeList bookList = document.GetElementsByTagName ("book"); - AssertEquals ("GetElementsByTagName (string) returned incorrect count.", 4, bookList.Count); + Assert.AreEqual (4, bookList.Count, "GetElementsByTagName (string) returned incorrect count."); } [Test] @@ -593,7 +593,7 @@ namespace MonoTests.System.Xml document = new XmlDocument (); document.Load (memoryStream); XmlNodeList bookList = document.GetElementsByTagName ("book", "http://www.goo.com"); - AssertEquals ("GetElementsByTagName (string, uri) returned incorrect count.", 2, bookList.Count); + Assert.AreEqual (2, bookList.Count, "GetElementsByTagName (string, uri) returned incorrect count."); } [Test] @@ -612,89 +612,89 @@ namespace MonoTests.System.Xml // id='b' has different prefix. Should not caught by (name), // while should caught by (name, ns). XmlNodeList nl = document.GetElementsByTagName ("x:a"); - AssertEquals (2, nl.Count); - AssertEquals ("a", nl [0].Attributes ["id"].Value); - AssertEquals ("c", nl [1].Attributes ["id"].Value); + Assert.AreEqual (2, nl.Count); + Assert.AreEqual ("a", nl [0].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [1].Attributes ["id"].Value); nl = document.GetElementsByTagName ("a", "urn:foo"); - AssertEquals (3, nl.Count); - AssertEquals ("a", nl [0].Attributes ["id"].Value); - AssertEquals ("b", nl [1].Attributes ["id"].Value); - AssertEquals ("c", nl [2].Attributes ["id"].Value); + Assert.AreEqual (3, nl.Count); + Assert.AreEqual ("a", nl [0].Attributes ["id"].Value); + Assert.AreEqual ("b", nl [1].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [2].Attributes ["id"].Value); // name wildcard nl = document.GetElementsByTagName ("*"); - AssertEquals (6, nl.Count); - AssertEquals ("root", nl [0].Name); - AssertEquals ("a", nl [1].Attributes ["id"].Value); - AssertEquals ("b", nl [2].Attributes ["id"].Value); - AssertEquals ("c", nl [3].Attributes ["id"].Value); - AssertEquals ("d", nl [4].Attributes ["id"].Value); - AssertEquals ("e", nl [5].Attributes ["id"].Value); + Assert.AreEqual (6, nl.Count); + Assert.AreEqual ("root", nl [0].Name); + Assert.AreEqual ("a", nl [1].Attributes ["id"].Value); + Assert.AreEqual ("b", nl [2].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [3].Attributes ["id"].Value); + Assert.AreEqual ("d", nl [4].Attributes ["id"].Value); + Assert.AreEqual ("e", nl [5].Attributes ["id"].Value); // wildcard - local and ns nl = document.GetElementsByTagName ("*", "*"); - AssertEquals (6, nl.Count); - AssertEquals ("root", nl [0].Name); - AssertEquals ("a", nl [1].Attributes ["id"].Value); - AssertEquals ("b", nl [2].Attributes ["id"].Value); - AssertEquals ("c", nl [3].Attributes ["id"].Value); - AssertEquals ("d", nl [4].Attributes ["id"].Value); - AssertEquals ("e", nl [5].Attributes ["id"].Value); + Assert.AreEqual (6, nl.Count); + Assert.AreEqual ("root", nl [0].Name); + Assert.AreEqual ("a", nl [1].Attributes ["id"].Value); + Assert.AreEqual ("b", nl [2].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [3].Attributes ["id"].Value); + Assert.AreEqual ("d", nl [4].Attributes ["id"].Value); + Assert.AreEqual ("e", nl [5].Attributes ["id"].Value); // namespace wildcard - namespace nl = document.GetElementsByTagName ("*", "urn:foo"); - AssertEquals (4, nl.Count); - AssertEquals ("a", nl [0].Attributes ["id"].Value); - AssertEquals ("b", nl [1].Attributes ["id"].Value); - AssertEquals ("c", nl [2].Attributes ["id"].Value); - AssertEquals ("e", nl [3].Attributes ["id"].Value); + Assert.AreEqual (4, nl.Count); + Assert.AreEqual ("a", nl [0].Attributes ["id"].Value); + Assert.AreEqual ("b", nl [1].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [2].Attributes ["id"].Value); + Assert.AreEqual ("e", nl [3].Attributes ["id"].Value); // namespace wildcard - local only. I dare say, such usage is not XML-ish! nl = document.GetElementsByTagName ("a", "*"); - AssertEquals (3, nl.Count); - AssertEquals ("a", nl [0].Attributes ["id"].Value); - AssertEquals ("b", nl [1].Attributes ["id"].Value); - AssertEquals ("c", nl [2].Attributes ["id"].Value); + Assert.AreEqual (3, nl.Count); + Assert.AreEqual ("a", nl [0].Attributes ["id"].Value); + Assert.AreEqual ("b", nl [1].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [2].Attributes ["id"].Value); } [Test] public void Implementation () { - AssertNotNull (new XmlDocument ().Implementation); + Assert.IsNotNull (new XmlDocument ().Implementation); } [Test] public void InnerAndOuterXml () { - AssertEquals (String.Empty, document.InnerXml); - AssertEquals (document.InnerXml, document.OuterXml); + Assert.AreEqual (String.Empty, document.InnerXml); + Assert.AreEqual (document.InnerXml, document.OuterXml); XmlDeclaration declaration = document.CreateXmlDeclaration ("1.0", null, null); document.AppendChild (declaration); - AssertEquals ("", document.InnerXml); - AssertEquals (document.InnerXml, document.OuterXml); + Assert.AreEqual ("", document.InnerXml); + Assert.AreEqual (document.InnerXml, document.OuterXml); XmlElement element = document.CreateElement ("foo"); document.AppendChild (element); - AssertEquals ("", document.InnerXml); - AssertEquals (document.InnerXml, document.OuterXml); + Assert.AreEqual ("", document.InnerXml); + Assert.AreEqual (document.InnerXml, document.OuterXml); XmlComment comment = document.CreateComment ("bar"); document.DocumentElement.AppendChild (comment); - AssertEquals ("", document.InnerXml); - AssertEquals (document.InnerXml, document.OuterXml); + Assert.AreEqual ("", document.InnerXml); + Assert.AreEqual (document.InnerXml, document.OuterXml); XmlText text = document.CreateTextNode ("baz"); document.DocumentElement.AppendChild (text); - AssertEquals ("baz", document.InnerXml); - AssertEquals (document.InnerXml, document.OuterXml); + Assert.AreEqual ("baz", document.InnerXml); + Assert.AreEqual (document.InnerXml, document.OuterXml); element = document.CreateElement ("quux"); element.SetAttribute ("quuux", "squonk"); document.DocumentElement.AppendChild (element); - AssertEquals ("baz", document.InnerXml); - AssertEquals (document.InnerXml, document.OuterXml); + Assert.AreEqual ("baz", document.InnerXml); + Assert.AreEqual (document.InnerXml, document.OuterXml); } [Test] @@ -711,7 +711,7 @@ namespace MonoTests.System.Xml MemoryStream memoryStream = new MemoryStream (Encoding.UTF8.GetBytes (xml)); document = new XmlDocument (); document.Load (memoryStream); - AssertEquals ("Not Loaded From IOStream", true, document.HasChildNodes); + Assert.AreEqual (true, document.HasChildNodes, "Not Loaded From IOStream"); } [Test] @@ -727,8 +727,8 @@ namespace MonoTests.System.Xml public void LoadXmlCDATA () { document.LoadXml (""); - Assert (document.DocumentElement.FirstChild.NodeType == XmlNodeType.CDATA); - AssertEquals ("bar", document.DocumentElement.FirstChild.Value); + Assert.IsTrue (document.DocumentElement.FirstChild.NodeType == XmlNodeType.CDATA); + Assert.AreEqual ("bar", document.DocumentElement.FirstChild.Value); } [Test] @@ -737,88 +737,88 @@ namespace MonoTests.System.Xml // XmlTextReader needs to throw this exception // try { // document.LoadXml(""); -// Fail("XmlException should have been thrown."); +// Assert.Fail ("XmlException should have been thrown."); // } // catch (XmlException e) { -// AssertEquals("Exception message doesn't match.", "The root element is missing.", e.Message); +// Assert.AreEqual ("The root element is missing.", e.Message, "Exception message doesn't match."); // } document.LoadXml (""); - Assert (document.DocumentElement.FirstChild.NodeType == XmlNodeType.Comment); - AssertEquals ("Comment", document.DocumentElement.FirstChild.Value); + Assert.IsTrue (document.DocumentElement.FirstChild.NodeType == XmlNodeType.Comment); + Assert.AreEqual ("Comment", document.DocumentElement.FirstChild.Value); document.LoadXml (@""); - AssertEquals ("Incorrect target.", "bar", ((XmlComment)document.FirstChild.FirstChild).Data); + Assert.AreEqual ("bar", ((XmlComment)document.FirstChild.FirstChild).Data, "Incorrect target."); } [Test] public void LoadXmlElementSingle () { - AssertNull (document.DocumentElement); + Assert.IsNull (document.DocumentElement); document.LoadXml (""); - AssertNotNull (document.DocumentElement); - AssertSame (document.FirstChild, document.DocumentElement); + Assert.IsNotNull (document.DocumentElement); + Assert.AreSame (document.FirstChild, document.DocumentElement); - AssertEquals (String.Empty, document.DocumentElement.Prefix); - AssertEquals ("foo", document.DocumentElement.LocalName); - AssertEquals (String.Empty, document.DocumentElement.NamespaceURI); - AssertEquals ("foo", document.DocumentElement.Name); + Assert.AreEqual (String.Empty, document.DocumentElement.Prefix); + Assert.AreEqual ("foo", document.DocumentElement.LocalName); + Assert.AreEqual (String.Empty, document.DocumentElement.NamespaceURI); + Assert.AreEqual ("foo", document.DocumentElement.Name); } [Test] public void LoadXmlElementWithAttributes () { - AssertNull (document.DocumentElement); + Assert.IsNull (document.DocumentElement); document.LoadXml (""); XmlElement documentElement = document.DocumentElement; - AssertEquals ("baz", documentElement.GetAttribute ("bar")); - AssertEquals ("quuux", documentElement.GetAttribute ("quux")); - AssertEquals ("hello & world", documentElement.GetAttribute ("hoge")); - AssertEquals ("hello & world", documentElement.Attributes ["hoge"].Value); - AssertEquals (1, documentElement.GetAttributeNode ("hoge").ChildNodes.Count); + Assert.AreEqual ("baz", documentElement.GetAttribute ("bar")); + Assert.AreEqual ("quuux", documentElement.GetAttribute ("quux")); + Assert.AreEqual ("hello & world", documentElement.GetAttribute ("hoge")); + Assert.AreEqual ("hello & world", documentElement.Attributes ["hoge"].Value); + Assert.AreEqual (1, documentElement.GetAttributeNode ("hoge").ChildNodes.Count); } [Test] public void LoadXmlElementWithChildElement () { document.LoadXml (""); - Assert (document.ChildNodes.Count == 1); - Assert (document.FirstChild.ChildNodes.Count == 1); - AssertEquals ("foo", document.DocumentElement.LocalName); - AssertEquals ("bar", document.DocumentElement.FirstChild.LocalName); + Assert.IsTrue (document.ChildNodes.Count == 1); + Assert.IsTrue (document.FirstChild.ChildNodes.Count == 1); + Assert.AreEqual ("foo", document.DocumentElement.LocalName); + Assert.AreEqual ("bar", document.DocumentElement.FirstChild.LocalName); } [Test] public void LoadXmlElementWithTextNode () { document.LoadXml ("bar"); - Assert (document.DocumentElement.FirstChild.NodeType == XmlNodeType.Text); - AssertEquals ("bar", document.DocumentElement.FirstChild.Value); + Assert.IsTrue (document.DocumentElement.FirstChild.NodeType == XmlNodeType.Text); + Assert.AreEqual ("bar", document.DocumentElement.FirstChild.Value); } [Test] public void LoadXmlExceptionClearsDocument () { document.LoadXml (""); - Assert (document.FirstChild != null); + Assert.IsTrue (document.FirstChild != null); try { document.LoadXml ("<123/>"); - Fail ("An XmlException should have been thrown."); + Assert.Fail ("An XmlException should have been thrown."); } catch (XmlException) {} - Assert (document.FirstChild == null); + Assert.IsTrue (document.FirstChild == null); } [Test] public void LoadXmlProcessingInstruction () { document.LoadXml (@""); - AssertEquals ("Incorrect target.", "foo", ((XmlProcessingInstruction)document.FirstChild).Target); - AssertEquals ("Incorrect data.", "bar='baaz' quux='quuux'", ((XmlProcessingInstruction)document.FirstChild).Data); + Assert.AreEqual ("foo", ((XmlProcessingInstruction)document.FirstChild).Target, "Incorrect target."); + Assert.AreEqual ("bar='baaz' quux='quuux'", ((XmlProcessingInstruction)document.FirstChild).Data, "Incorrect data."); } [Test] @@ -828,15 +828,15 @@ namespace MonoTests.System.Xml xml = ""; document.LoadXml (xml); - AssertEquals("XmlDocument with cdata OuterXml is incorrect.", xml, document.OuterXml); + Assert.AreEqual (xml, document.OuterXml, "XmlDocument with cdata OuterXml is incorrect."); xml = ""; document.LoadXml (xml); - AssertEquals("XmlDocument with comment OuterXml is incorrect.", xml, document.OuterXml); + Assert.AreEqual (xml, document.OuterXml, "XmlDocument with comment OuterXml is incorrect."); xml = ""; document.LoadXml (xml); - AssertEquals("XmlDocument with processing instruction OuterXml is incorrect.", xml, document.OuterXml); + Assert.AreEqual (xml, document.OuterXml, "XmlDocument with processing instruction OuterXml is incorrect."); } [Test] @@ -844,11 +844,11 @@ namespace MonoTests.System.Xml { document.LoadXml (""); XmlNode node = document.FirstChild.FirstChild.FirstChild; - AssertEquals ("Wrong child found.", "baz", node.LocalName); - AssertEquals ("Wrong parent.", "bar", node.ParentNode.LocalName); - AssertEquals ("Wrong parent.", "foo", node.ParentNode.ParentNode.LocalName); - AssertEquals ("Wrong parent.", "#document", node.ParentNode.ParentNode.ParentNode.LocalName); - AssertNull ("Expected parent to be null.", node.ParentNode.ParentNode.ParentNode.ParentNode); + Assert.AreEqual ("baz", node.LocalName, "Wrong child found."); + Assert.AreEqual ("bar", node.ParentNode.LocalName, "Wrong parent."); + Assert.AreEqual ("foo", node.ParentNode.ParentNode.LocalName, "Wrong parent."); + Assert.AreEqual ("#document", node.ParentNode.ParentNode.ParentNode.LocalName, "Wrong parent."); + Assert.IsNull (node.ParentNode.ParentNode.ParentNode.ParentNode, "Expected parent to be null."); } [Test] @@ -861,7 +861,7 @@ namespace MonoTests.System.Xml node = document.DocumentElement.FirstChild; document.DocumentElement.RemoveChild (node); nextSibling = node.NextSibling; - AssertNull ("Expected removed node's next sibling to be null.", nextSibling); + Assert.IsNull (nextSibling, "Expected removed node's next sibling to be null."); } // ImportNode @@ -879,50 +879,50 @@ namespace MonoTests.System.Xml // Attribute n = newDoc.ImportNode(bar.GetAttributeNode("href", xlinkURI), true); - AssertEquals("#ImportNode.Attr.NS.LocalName", "href", n.LocalName); - AssertEquals("#ImportNode.Attr.NS.NSURI", xlinkURI, n.NamespaceURI); - AssertEquals("#ImportNode.Attr.NS.Value", "#foo", n.Value); + Assert.AreEqual ("href", n.LocalName, "#ImportNode.Attr.NS.LocalName"); + Assert.AreEqual (xlinkURI, n.NamespaceURI, "#ImportNode.Attr.NS.NSURI"); + Assert.AreEqual ("#foo", n.Value, "#ImportNode.Attr.NS.Value"); // CDATA n = newDoc.ImportNode(bar.FirstChild.FirstChild, true); - AssertEquals("#ImportNode.CDATA", "cdata section.\n\titem 1\n\titem 2\n", n.Value); + Assert.AreEqual ("cdata section.\n\titem 1\n\titem 2\n", n.Value, "#ImportNode.CDATA"); // Element XmlElement e = newDoc.ImportNode(bar, true) as XmlElement; - AssertEquals("#ImportNode.Element.Name", "bar", e.Name); - AssertEquals("#ImportNode.Element.Attr", "#foo", e.GetAttribute("href", xlinkURI)); - AssertEquals("#ImportNode.Element.deep", "baz", e.FirstChild.Name); + Assert.AreEqual ("bar", e.Name, "#ImportNode.Element.Name"); + Assert.AreEqual ("#foo", e.GetAttribute("href", xlinkURI), "#ImportNode.Element.Attr"); + Assert.AreEqual ("baz", e.FirstChild.Name, "#ImportNode.Element.deep"); // Entity Reference: // [2002/10/14] CreateEntityReference was not implemented. // document.LoadXml("]>&FOOENT;"); // n = newDoc.ImportNode(document.DocumentElement.FirstChild); -// AssertEquals("#ImportNode.EntityReference", "FOOENT", n.Name); -// AssertEquals("#ImportNode.EntityReference", "foo_", n.Value); +// Assert.AreEqual ("FOOENT", n.Name, "#ImportNode.EntityReference"); +// Assert.AreEqual ("foo_", n.Value, "#ImportNode.EntityReference"); // Processing Instruction document.LoadXml(""); XmlProcessingInstruction pi = (XmlProcessingInstruction)newDoc.ImportNode(document.DocumentElement.FirstChild, false); - AssertEquals("#ImportNode.ProcessingInstruction.Name", "xml-stylesheet", pi.Name); - AssertEquals("#ImportNode.ProcessingInstruction.Data", "href='foo.xsl'", pi.Data.Trim()); + Assert.AreEqual ("xml-stylesheet", pi.Name, "#ImportNode.ProcessingInstruction.Name"); + Assert.AreEqual ("href='foo.xsl'", pi.Data.Trim(), "#ImportNode.ProcessingInstruction.Data"); // Text document.LoadXml(xml1); n = newDoc.ImportNode((XmlText)bar.FirstChild.ChildNodes[1], true); - AssertEquals("#ImportNode.Text", "From here, simple text node.", n.Value); + Assert.AreEqual ("From here, simple text node.", n.Value, "#ImportNode.Text"); // XmlDeclaration document.LoadXml(xml1); XmlDeclaration decl = (XmlDeclaration)newDoc.ImportNode(document.FirstChild, false); - AssertEquals("#ImportNode.XmlDeclaration.Type", XmlNodeType.XmlDeclaration, decl.NodeType); - AssertEquals("#ImportNode.XmlDeclaration.Encoding", "utf-8", decl.Encoding); + Assert.AreEqual (XmlNodeType.XmlDeclaration, decl.NodeType, "#ImportNode.XmlDeclaration.Type"); + Assert.AreEqual ("utf-8", decl.Encoding, "#ImportNode.XmlDeclaration.Encoding"); } [Test] public void NameTable() { XmlDocument doc = new XmlDocument(); - AssertNotNull(doc.NameTable); + Assert.IsNotNull (doc.NameTable); } [Test] @@ -930,7 +930,7 @@ namespace MonoTests.System.Xml { XmlDocument doc = new XmlDocument(); doc.LoadXml(""); - AssertNotNull(doc.DocumentElement); + Assert.IsNotNull (doc.DocumentElement); } [Test] @@ -939,18 +939,18 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); // In fact it is invalid, but it doesn't fail with MS.NET 1.0. doc.LoadXml (""); - AssertNotNull (doc.DocumentType); + Assert.IsNotNull (doc.DocumentType); #if NetworkEnabled try { doc.LoadXml (""); } catch (XmlException) { - Fail("#DoctypeDecl.System"); + Assert.Fail ("#DoctypeDecl.System"); } try { doc.LoadXml (""); } catch (XmlException) { - Fail ("#DoctypeDecl.Public"); + Assert.Fail ("#DoctypeDecl.Public"); } #endif // Should this be commented out? @@ -963,9 +963,9 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.LoadXml ("TEST Text"); XmlDocument doc2 = (XmlDocument)doc.CloneNode (false); - AssertEquals ("ShallowCopy", 0, doc2.ChildNodes.Count); + Assert.AreEqual (0, doc2.ChildNodes.Count, "ShallowCopy"); doc2 = (XmlDocument)doc.CloneNode (true); - AssertEquals ("DeepCopy", "foo", doc2.DocumentElement.Name); + Assert.AreEqual ("foo", doc2.DocumentElement.Name, "DeepCopy"); } [Test] @@ -973,7 +973,7 @@ namespace MonoTests.System.Xml { XmlDocument doc = new XmlDocument (); doc.LoadXml (""); - AssertEquals ("", doc.OuterXml); + Assert.AreEqual ("", doc.OuterXml); } [Test] @@ -986,22 +986,22 @@ namespace MonoTests.System.Xml XmlTextReader reader = new XmlTextReader (new StringReader (input)); dom.Load (reader); - AssertEquals (XmlNodeType.Element, dom.FirstChild.NextSibling.NextSibling.NodeType); + Assert.AreEqual (XmlNodeType.Element, dom.FirstChild.NextSibling.NextSibling.NodeType); } [Test] public void PreserveWhitespace2 () { XmlDocument doc = new XmlDocument (); - Assert (!doc.PreserveWhitespace); + Assert.IsTrue (!doc.PreserveWhitespace); doc.PreserveWhitespace = true; XmlDocument d2 = doc.Clone () as XmlDocument; - Assert (!d2.PreserveWhitespace); // i.e. not cloned + Assert.IsTrue (!d2.PreserveWhitespace); // i.e. not cloned d2.AppendChild (d2.CreateElement ("root")); d2.DocumentElement.AppendChild (d2.CreateWhitespace (" ")); StringWriter sw = new StringWriter (); d2.WriteTo (new XmlTextWriter (sw)); - AssertEquals (" ", sw.ToString ()); + Assert.AreEqual (" ", sw.ToString ()); } [Test] @@ -1012,8 +1012,8 @@ namespace MonoTests.System.Xml // Check that null prefix and namespace are allowed and // equivalent to "" XmlAttribute attr = dom.CreateAttribute (null, "FOO", null); - AssertEquals (attr.Prefix, ""); - AssertEquals (attr.NamespaceURI, ""); + Assert.AreEqual (attr.Prefix, ""); + Assert.AreEqual (attr.NamespaceURI, ""); } [Test] @@ -1024,15 +1024,15 @@ namespace MonoTests.System.Xml string xml = dtd + "&foo;"; XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); document.Load (xvr); - AssertNotNull (document.DocumentType); - AssertEquals (1, document.DocumentType.Entities.Count); + Assert.IsNotNull (document.DocumentType); + Assert.AreEqual (1, document.DocumentType.Entities.Count); XmlEntity foo = document.DocumentType.Entities.GetNamedItem ("foo") as XmlEntity; - AssertNotNull (foo); - AssertNotNull (document.DocumentType.Entities.GetNamedItem ("foo", "")); - AssertEquals ("foo", foo.Name); - AssertNull (foo.Value); - AssertEquals ("foo-ent", foo.InnerText); + Assert.IsNotNull (foo); + Assert.IsNotNull (document.DocumentType.Entities.GetNamedItem ("foo", "")); + Assert.AreEqual ("foo", foo.Name); + Assert.IsNull (foo.Value); + Assert.AreEqual ("foo-ent", foo.InnerText); } [Test] @@ -1045,8 +1045,8 @@ namespace MonoTests.System.Xml xvr.ValidationType = ValidationType.None; document.Load (xvr); // Don't include default attributes here. - AssertEquals (xml, document.OuterXml); - AssertEquals ("hoge-def", document.DocumentElement.GetAttribute ("hoge")); + Assert.AreEqual (xml, document.OuterXml); + Assert.AreEqual ("hoge-def", document.DocumentElement.GetAttribute ("hoge")); } // [Test] Comment out in the meantime. @@ -1091,10 +1091,8 @@ namespace MonoTests.System.Xml XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null); XmlDocument doc = new XmlDocument (); doc.Load (xtr); - AssertEquals ("#text node", XmlNodeType.EntityReference, - doc.DocumentElement.FirstChild.NodeType); - AssertEquals ("#attribute", XmlNodeType.EntityReference, - doc.DocumentElement.Attributes [0].ChildNodes [1].NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, doc.DocumentElement.FirstChild.NodeType, "#text node"); + Assert.AreEqual (XmlNodeType.EntityReference, doc.DocumentElement.Attributes [0].ChildNodes [1].NodeType, "#attribute"); } [Test] @@ -1104,7 +1102,7 @@ namespace MonoTests.System.Xml xr.Read (); Console.WriteLine (xr.NodeType); XmlNode n = document.ReadNode (xr); - AssertNull (n); + Assert.IsNull (n); } [Test] @@ -1115,8 +1113,8 @@ namespace MonoTests.System.Xml Console.WriteLine (xr.NodeType); document.PreserveWhitespace = false; // Note this line. XmlNode n = document.ReadNode (xr); - AssertNotNull (n); - AssertEquals (XmlNodeType.Whitespace, n.NodeType); + Assert.IsNotNull (n); + Assert.AreEqual (XmlNodeType.Whitespace, n.NodeType); } [Test] @@ -1128,13 +1126,13 @@ namespace MonoTests.System.Xml doc.LoadXml (xml); StringWriter sw = new StringWriter (); doc.Save (sw); - AssertEquals ("" + xml, sw.ToString ()); + Assert.AreEqual ("" + xml, sw.ToString ()); doc.PreserveWhitespace = false; sw = new StringWriter (); doc.Save (sw); string NEL = Environment.NewLine; - AssertEquals ("" + Assert.AreEqual ("" + NEL + " text" + "\n", sw.ToString ()); @@ -1159,7 +1157,7 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.Load (reader); - AssertEquals (1, + Assert.AreEqual (1, doc.DocumentElement.FirstChild.ChildNodes.Count); } @@ -1169,7 +1167,7 @@ namespace MonoTests.System.Xml string xml = @"]>"; XmlDocument doc = new XmlDocument (); doc.Load (new StringReader (xml)); - AssertEquals ("urn:foo", doc.DocumentElement.NamespaceURI); + Assert.AreEqual ("urn:foo", doc.DocumentElement.NamespaceURI); } [Test] @@ -1197,8 +1195,8 @@ namespace MonoTests.System.Xml { XmlDocument doc = new MyXmlDocument (); doc.LoadXml (""); - AssertNotNull (doc.DocumentElement.GetAttributeNode ("hijacked")); - AssertNull (doc.DocumentElement.GetAttributeNode ("a")); + Assert.IsNotNull (doc.DocumentElement.GetAttributeNode ("hijacked")); + Assert.IsNull (doc.DocumentElement.GetAttributeNode ("a")); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlDocumentTypeTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlDocumentTypeTests.cs index c19442cfcea..c80d2a56882 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlDocumentTypeTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlDocumentTypeTests.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlDocumentTypeTests : Assertion + public class XmlDocumentTypeTests { XmlDocument document; XmlDocumentType docType; @@ -34,30 +34,28 @@ namespace MonoTests.System.Xml // assertequals (original.nodetype + " was incorrectly cloned.", // original.baseuri, cloned.baseuri); - AssertNull (cloned.ParentNode); - AssertEquals ("Value incorrectly cloned", - original.Value, cloned.Value); + Assert.IsNull (cloned.ParentNode); + Assert.AreEqual (original.Value, cloned.Value, "Value incorrectly cloned"); - Assert ("Copies, not pointers", !Object.ReferenceEquals (original, cloned)); + Assert.IsTrue (!Object.ReferenceEquals (original, cloned), "Copies, not pointers"); } [Test] public void Name () { - AssertEquals ("Getting Name property", "book", docType.Name); + Assert.AreEqual ("book", docType.Name, "Getting Name property"); } [Test] public void LocalName () { - AssertEquals ("Getting LocalName property", "book", docType.LocalName); + Assert.AreEqual ("book", docType.LocalName, "Getting LocalName property"); } [Test] public void InternalSubset () { - AssertEquals ("Getting Internal Subset property", - "", docType.InternalSubset); + Assert.AreEqual ("", docType.InternalSubset, "Getting Internal Subset property"); } [Test] @@ -71,21 +69,20 @@ namespace MonoTests.System.Xml return; } catch (Exception) { - Fail ("Incorrect Exception thrown."); + Assert.Fail ("Incorrect Exception thrown."); } } [Test] public void NodeType () { - AssertEquals ("NodeType property broken", - docType.NodeType.ToString (), "DocumentType"); + Assert.AreEqual (docType.NodeType.ToString (), "DocumentType", "NodeType property broken"); } [Test] public void IsReadOnly () { - AssertEquals ("IsReadOnly property", "True", docType.IsReadOnly.ToString ()); + Assert.AreEqual ("True", docType.IsReadOnly.ToString (), "IsReadOnly property"); } [Test] @@ -112,7 +109,7 @@ namespace MonoTests.System.Xml XmlNode cloned2 = docType.CloneNode (false); XmlNodeBaseProperties (original, cloned2); - AssertEquals ("Deep and shallow cloning", cloned1.Value, cloned2.Value); + Assert.AreEqual (cloned1.Value, cloned2.Value, "Deep and shallow cloning"); } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlElementTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlElementTests.cs index ff6d8f7bb34..efba9113bde 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlElementTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlElementTests.cs @@ -19,7 +19,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlElementTests : Assertion + public class XmlElementTests { private XmlDocument document; @@ -33,11 +33,11 @@ namespace MonoTests.System.Xml string localName, string namespaceURI, int attributesCount) { - AssertEquals (prefix != String.Empty ? prefix + ":" + localName : localName, element.Name); - AssertEquals (prefix, element.Prefix); - AssertEquals (localName, element.LocalName); - AssertEquals (namespaceURI, element.NamespaceURI); - //AssertEquals (attributesCount, element.Attributes.Count); + Assert.AreEqual (prefix != String.Empty ? prefix + ":" + localName : localName, element.Name); + Assert.AreEqual (prefix, element.Prefix); + Assert.AreEqual (localName, element.LocalName); + Assert.AreEqual (namespaceURI, element.NamespaceURI); + //Assert.AreEqual (attributesCount, element.Attributes.Count); } // for NodeInserted Event @@ -76,14 +76,14 @@ namespace MonoTests.System.Xml document.AppendChild (element); XmlNode deep = element.CloneNode (true); - // AssertEquals ("These should be the same", deep.OuterXml, element.OuterXml); - AssertNull ("This is not null", deep.ParentNode); - Assert ("Copies, not pointers", !Object.ReferenceEquals (element,deep)); + // Assert.AreEqual (deep.OuterXml, element.OuterXml, "These should be the same"); + Assert.IsNull (deep.ParentNode, "This is not null"); + Assert.IsTrue (!Object.ReferenceEquals (element, deep), "Copies, not pointers"); XmlNode shallow = element.CloneNode (false); - AssertNull ("This is not null", shallow.ParentNode); - Assert ("Copies, not pointers", !Object.ReferenceEquals (element,shallow)); - AssertEquals ("Shallow clones shalt have no children!", false, shallow.HasChildNodes); + Assert.IsNull (shallow.ParentNode, "This is not null"); + Assert.IsTrue (!Object.ReferenceEquals (element, shallow), "Copies, not pointers"); + Assert.AreEqual (false, shallow.HasChildNodes, "Shallow clones shalt have no children!"); } [Test] @@ -151,26 +151,26 @@ namespace MonoTests.System.Xml XmlComment comment; element = document.CreateElement ("foo"); - AssertEquals (String.Empty, element.InnerXml); - AssertEquals ("", element.OuterXml); + Assert.AreEqual (String.Empty, element.InnerXml); + Assert.AreEqual ("", element.OuterXml); text = document.CreateTextNode ("bar"); element.AppendChild (text); - AssertEquals ("bar", element.InnerXml); - AssertEquals ("bar", element.OuterXml); + Assert.AreEqual ("bar", element.InnerXml); + Assert.AreEqual ("bar", element.OuterXml); element.SetAttribute ("baz", "quux"); - AssertEquals ("bar", element.InnerXml); - AssertEquals ("bar", element.OuterXml); + Assert.AreEqual ("bar", element.InnerXml); + Assert.AreEqual ("bar", element.OuterXml); comment = document.CreateComment ("squonk"); element.AppendChild (comment); - AssertEquals ("bar", element.InnerXml); - AssertEquals ("bar", element.OuterXml); + Assert.AreEqual ("bar", element.InnerXml); + Assert.AreEqual ("bar", element.OuterXml); element.RemoveAll(); element.AppendChild(document.CreateElement("hoge")); - AssertEquals ("", element.InnerXml); + Assert.AreEqual ("", element.InnerXml); } [Test] @@ -179,8 +179,8 @@ namespace MonoTests.System.Xml XmlElement element = document.CreateElement ("foo"); element.SetAttribute ("attr1", "val1"); element.SetAttribute ("attr2", "val2"); - AssertEquals ("val1", element.GetAttribute ("attr1")); - AssertEquals ("val2", element.GetAttribute ("attr2")); + Assert.AreEqual ("val1", element.GetAttribute ("attr1")); + Assert.AreEqual ("val2", element.GetAttribute ("attr2")); } [Test] @@ -201,7 +201,7 @@ namespace MonoTests.System.Xml XmlNode xmlNode = libraryList.Item (0); XmlElement xmlElement = xmlNode as XmlElement; XmlNodeList bookList = xmlElement.GetElementsByTagName ("book"); - AssertEquals ("GetElementsByTagName (string) returned incorrect count.", 4, bookList.Count); + Assert.AreEqual (4, bookList.Count, "GetElementsByTagName (string) returned incorrect count."); } [Test] @@ -228,7 +228,7 @@ namespace MonoTests.System.Xml XmlNode xmlNode = libraryList.Item (0); XmlElement xmlElement = xmlNode as XmlElement; XmlNodeList bookList = xmlElement.GetElementsByTagName ("book", "http://www.foo.com"); - AssertEquals ("GetElementsByTagName (string, uri) returned incorrect count.", 1, bookList.Count); + Assert.AreEqual (1, bookList.Count, "GetElementsByTagName (string, uri) returned incorrect count."); } [Test] @@ -247,55 +247,55 @@ namespace MonoTests.System.Xml // id='b' has different prefix. Should not caught by (name), // while should caught by (name, ns). XmlNodeList nl = document.DocumentElement.GetElementsByTagName ("x:a"); - AssertEquals (2, nl.Count); - AssertEquals ("a", nl [0].Attributes ["id"].Value); - AssertEquals ("c", nl [1].Attributes ["id"].Value); + Assert.AreEqual (2, nl.Count); + Assert.AreEqual ("a", nl [0].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [1].Attributes ["id"].Value); nl = document.DocumentElement.GetElementsByTagName ("a", "urn:foo"); - AssertEquals (3, nl.Count); - AssertEquals ("a", nl [0].Attributes ["id"].Value); - AssertEquals ("b", nl [1].Attributes ["id"].Value); - AssertEquals ("c", nl [2].Attributes ["id"].Value); + Assert.AreEqual (3, nl.Count); + Assert.AreEqual ("a", nl [0].Attributes ["id"].Value); + Assert.AreEqual ("b", nl [1].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [2].Attributes ["id"].Value); // name wildcard nl = document.DocumentElement.GetElementsByTagName ("*"); - AssertEquals (5, nl.Count); - AssertEquals ("a", nl [0].Attributes ["id"].Value); - AssertEquals ("b", nl [1].Attributes ["id"].Value); - AssertEquals ("c", nl [2].Attributes ["id"].Value); - AssertEquals ("d", nl [3].Attributes ["id"].Value); - AssertEquals ("e", nl [4].Attributes ["id"].Value); + Assert.AreEqual (5, nl.Count); + Assert.AreEqual ("a", nl [0].Attributes ["id"].Value); + Assert.AreEqual ("b", nl [1].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [2].Attributes ["id"].Value); + Assert.AreEqual ("d", nl [3].Attributes ["id"].Value); + Assert.AreEqual ("e", nl [4].Attributes ["id"].Value); // wildcard - local and ns nl = document.DocumentElement.GetElementsByTagName ("*", "*"); - AssertEquals (5, nl.Count); - AssertEquals ("a", nl [0].Attributes ["id"].Value); - AssertEquals ("b", nl [1].Attributes ["id"].Value); - AssertEquals ("c", nl [2].Attributes ["id"].Value); - AssertEquals ("d", nl [3].Attributes ["id"].Value); - AssertEquals ("e", nl [4].Attributes ["id"].Value); + Assert.AreEqual (5, nl.Count); + Assert.AreEqual ("a", nl [0].Attributes ["id"].Value); + Assert.AreEqual ("b", nl [1].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [2].Attributes ["id"].Value); + Assert.AreEqual ("d", nl [3].Attributes ["id"].Value); + Assert.AreEqual ("e", nl [4].Attributes ["id"].Value); // namespace wildcard - namespace nl = document.DocumentElement.GetElementsByTagName ("*", "urn:foo"); - AssertEquals (4, nl.Count); - AssertEquals ("a", nl [0].Attributes ["id"].Value); - AssertEquals ("b", nl [1].Attributes ["id"].Value); - AssertEquals ("c", nl [2].Attributes ["id"].Value); - AssertEquals ("e", nl [3].Attributes ["id"].Value); + Assert.AreEqual (4, nl.Count); + Assert.AreEqual ("a", nl [0].Attributes ["id"].Value); + Assert.AreEqual ("b", nl [1].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [2].Attributes ["id"].Value); + Assert.AreEqual ("e", nl [3].Attributes ["id"].Value); // namespace wildcard - local only. I dare say, such usage is not XML-ish! nl = document.DocumentElement.GetElementsByTagName ("a", "*"); - AssertEquals (3, nl.Count); - AssertEquals ("a", nl [0].Attributes ["id"].Value); - AssertEquals ("b", nl [1].Attributes ["id"].Value); - AssertEquals ("c", nl [2].Attributes ["id"].Value); + Assert.AreEqual (3, nl.Count); + Assert.AreEqual ("a", nl [0].Attributes ["id"].Value); + Assert.AreEqual ("b", nl [1].Attributes ["id"].Value); + Assert.AreEqual ("c", nl [2].Attributes ["id"].Value); } [Test] public void OuterXmlWithNamespace () { XmlElement element = document.CreateElement ("foo", "bar", "#foo"); - AssertEquals ("", element.OuterXml); + Assert.AreEqual ("", element.OuterXml); } [Test] @@ -313,7 +313,7 @@ namespace MonoTests.System.Xml XmlNode xmlNode = bookList.Item (0); XmlElement xmlElement = xmlNode as XmlElement; xmlElement.RemoveAllAttributes (); - AssertEquals ("attributes not properly removed.", false, xmlElement.HasAttribute ("type")); + Assert.AreEqual (false, xmlElement.HasAttribute ("type"), "attributes not properly removed."); } [Test] @@ -327,51 +327,51 @@ namespace MonoTests.System.Xml XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); document.Load (xvr); // RemoveAll - AssertNotNull (document.DocumentElement); - AssertEquals ("attrCount #01", 2, document.DocumentElement.Attributes.Count); - AssertEquals ("baz", document.DocumentElement.GetAttribute ("bar")); - AssertEquals ("def", document.DocumentElement.GetAttribute ("foo")); - AssertEquals (false, document.DocumentElement.GetAttributeNode ("foo").Specified); + Assert.IsNotNull (document.DocumentElement); + Assert.AreEqual (2, document.DocumentElement.Attributes.Count, "attrCount #01"); + Assert.AreEqual ("baz", document.DocumentElement.GetAttribute ("bar")); + Assert.AreEqual ("def", document.DocumentElement.GetAttribute ("foo")); + Assert.AreEqual (false, document.DocumentElement.GetAttributeNode ("foo").Specified); document.DocumentElement.RemoveAll (); - AssertEquals ("attrCount #02", 1, document.DocumentElement.Attributes.Count); - AssertEquals ("def", document.DocumentElement.GetAttribute ("foo")); - AssertEquals (String.Empty, document.DocumentElement.GetAttribute ("bar")); + Assert.AreEqual (1, document.DocumentElement.Attributes.Count, "attrCount #02"); + Assert.AreEqual ("def", document.DocumentElement.GetAttribute ("foo")); + Assert.AreEqual (String.Empty, document.DocumentElement.GetAttribute ("bar")); // RemoveAllAttributes xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); document.Load (xvr); document.DocumentElement.RemoveAllAttributes (); - AssertEquals ("attrCount #03", 1, document.DocumentElement.Attributes.Count); + Assert.AreEqual (1, document.DocumentElement.Attributes.Count, "attrCount #03"); // RemoveAttribute(name) xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); document.Load (xvr); document.DocumentElement.RemoveAttribute ("foo"); - AssertEquals ("attrCount #04", 2, document.DocumentElement.Attributes.Count); + Assert.AreEqual (2, document.DocumentElement.Attributes.Count, "attrCount #04"); // RemoveAttribute(name, ns) xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); document.Load (xvr); document.DocumentElement.RemoveAttribute ("foo", String.Empty); - AssertEquals ("attrCount #05", 2, document.DocumentElement.Attributes.Count); + Assert.AreEqual (2, document.DocumentElement.Attributes.Count, "attrCount #05"); // RemoveAttributeAt xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); document.Load (xvr); document.DocumentElement.RemoveAttributeAt (1); - AssertEquals ("attrCount #06", 2, document.DocumentElement.Attributes.Count); + Assert.AreEqual (2, document.DocumentElement.Attributes.Count, "attrCount #06"); // RemoveAttributeNode xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); document.Load (xvr); document.DocumentElement.RemoveAttributeNode (document.DocumentElement.Attributes [1]); - AssertEquals ("attrCount #07", 2, document.DocumentElement.Attributes.Count); + Assert.AreEqual (2, document.DocumentElement.Attributes.Count, "attrCount #07"); // RemoveAttributeNode(name, ns) xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null); document.Load (xvr); document.DocumentElement.RemoveAttributeNode ("foo", String.Empty); - AssertEquals ("attrCount #08", 2, document.DocumentElement.Attributes.Count); + Assert.AreEqual (2, document.DocumentElement.Attributes.Count, "attrCount #08"); } [Test] @@ -381,8 +381,8 @@ namespace MonoTests.System.Xml XmlElement xmlEl = xmlDoc.CreateElement ("TestElement"); XmlAttribute xmlAttribute = xmlEl.SetAttributeNode ("attr1", "namespace1"); XmlAttribute xmlAttribute2 = xmlEl.SetAttributeNode ("attr2", "namespace2"); - AssertEquals ("attribute name not properly created.", true, xmlAttribute.Name.Equals ("attr1")); - AssertEquals ("attribute namespace not properly created.", true, xmlAttribute.NamespaceURI.Equals ("namespace1")); + Assert.AreEqual (true, xmlAttribute.Name.Equals ("attr1"), "attribute name not properly created."); + Assert.AreEqual (true, xmlAttribute.NamespaceURI.Equals ("namespace1"), "attribute namespace not properly created."); } [Test] @@ -400,7 +400,7 @@ namespace MonoTests.System.Xml // should not affect Element node's xmlns XmlElement el = document.CreateElement ("root"); el.SetAttribute ("xmlns", "urn:foo"); - AssertEquals (String.Empty, el.NamespaceURI); + Assert.AreEqual (String.Empty, el.NamespaceURI); } [Test] @@ -415,18 +415,18 @@ namespace MonoTests.System.Xml // If only one child of the element is Text node, // then no events are fired. doc.DocumentElement.FirstChild.InnerText = "no events fired."; - AssertEquals ("NoInsertEventFired", false, Inserted); - AssertEquals ("NoRemoveEventFired", false, Removed); - AssertEquals ("SetInnerTextToSingleText", "no events fired.", doc.DocumentElement.FirstChild.InnerText); + Assert.AreEqual (false, Inserted, "NoInsertEventFired"); + Assert.AreEqual (false, Removed, "NoRemoveEventFired"); + Assert.AreEqual ("no events fired.", doc.DocumentElement.FirstChild.InnerText, "SetInnerTextToSingleText"); Inserted = false; Removed = false; // if only one child of the element is CDataSection, // then events are fired. doc.DocumentElement.LastChild.InnerText = "events are fired."; - AssertEquals ("InsertedEventFired", true, Inserted); - AssertEquals ("RemovedEventFired", true, Removed); - AssertEquals ("SetInnerTextToCDataSection", "events are fired.", doc.DocumentElement.LastChild.InnerText); + Assert.AreEqual (true, Inserted, "InsertedEventFired"); + Assert.AreEqual (true, Removed, "RemovedEventFired"); + Assert.AreEqual ("events are fired.", doc.DocumentElement.LastChild.InnerText, "SetInnerTextToCDataSection"); } [Test] @@ -435,27 +435,27 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.LoadXml (""); XmlElement el = doc.DocumentElement; - AssertNull ("#Simple", el.FirstChild); + Assert.IsNull (el.FirstChild, "#Simple"); el.InnerXml = ""; XmlElement child = el.FirstChild as XmlElement; - AssertNotNull ("#Simple.Child", child); - AssertEquals ("#Simple.Child.Name", "foo", child.LocalName); + Assert.IsNotNull (child, "#Simple.Child"); + Assert.AreEqual ("foo", child.LocalName, "#Simple.Child.Name"); XmlElement grandchild = child.FirstChild as XmlElement; - AssertNotNull ("#Simple.GrandChild", grandchild); - AssertEquals ("#Simple.GrandChild.Name", "bar", grandchild.LocalName); - AssertEquals ("#Simple.GrandChild.Attr", "baz", grandchild.GetAttribute ("att")); + Assert.IsNotNull (grandchild, "#Simple.GrandChild"); + Assert.AreEqual ("bar", grandchild.LocalName, "#Simple.GrandChild.Name"); + Assert.AreEqual ("baz", grandchild.GetAttribute ("att"), "#Simple.GrandChild.Attr"); doc.LoadXml (""); el = doc.DocumentElement.FirstChild.NextSibling as XmlElement; // ns1:bar - AssertNull ("#Namespaced.Prepare", el.FirstChild); + Assert.IsNull (el.FirstChild, "#Namespaced.Prepare"); el.InnerXml = ""; - AssertNotNull ("#Namespaced.Child", el.FirstChild); - AssertEquals ("#Namespaced.Child.Name", "baz", el.FirstChild.LocalName); - AssertEquals ("#Namespaced.Child.NSURI", "NS1", el.FirstChild.NamespaceURI); // important! + Assert.IsNotNull (el.FirstChild, "#Namespaced.Child"); + Assert.AreEqual ("baz", el.FirstChild.LocalName, "#Namespaced.Child.Name"); + Assert.AreEqual ("NS1", el.FirstChild.NamespaceURI, "#Namespaced.Child.NSURI"); // important! el.InnerXml = ""; - AssertEquals ("#Namespaced.VerifyPreviousCleared", "hoge", el.FirstChild.Name); + Assert.AreEqual ("hoge", el.FirstChild.Name, "#Namespaced.VerifyPreviousCleared"); } [Test] @@ -471,15 +471,15 @@ namespace MonoTests.System.Xml "); XmlElement typeNode = doc.DocumentElement; typeNode.InnerText = "QPair"; - AssertEquals ("QPair", typeNode.InnerText); + Assert.AreEqual ("QPair", typeNode.InnerText); } [Test] public void IsEmpty () { document.LoadXml (""); - Assertion.AssertEquals ("Empty", true, ((XmlElement) document.DocumentElement.FirstChild).IsEmpty); - Assertion.AssertEquals ("Empty", false, ((XmlElement) document.DocumentElement.LastChild).IsEmpty); + Assert.AreEqual (true, ((XmlElement) document.DocumentElement.FirstChild).IsEmpty, "Empty"); + Assert.AreEqual (false, ((XmlElement) document.DocumentElement.LastChild).IsEmpty, "Empty"); } [Test] @@ -491,11 +491,11 @@ namespace MonoTests.System.Xml XmlElement el = doc.DocumentElement; el.RemoveAttribute ("a1"); - AssertNull ("RemoveAttribute", el.GetAttributeNode ("a1")); + Assert.IsNull (el.GetAttributeNode ("a1"), "RemoveAttribute"); el.RemoveAttribute ("xlink:href"); - AssertNull ("RemoveAttribute", el.GetAttributeNode ("href", xlinkURI)); + Assert.IsNull (el.GetAttributeNode ("href", xlinkURI), "RemoveAttribute"); el.RemoveAllAttributes (); - AssertNull ("RemoveAllAttributes", el.GetAttributeNode ("a2")); + Assert.IsNull (el.GetAttributeNode ("a2"), "RemoveAllAttributes"); } [Test] @@ -506,7 +506,7 @@ namespace MonoTests.System.Xml StringWriter sw = new StringWriter (); XmlTextWriter xtw = new XmlTextWriter (sw); doc.DocumentElement.WriteTo (xtw); - AssertEquals ("", sw.ToString()); + Assert.AreEqual ("", sw.ToString()); } [Test] @@ -522,7 +522,7 @@ namespace MonoTests.System.Xml x.AppendChild (b); XmlElement b2 = d.CreateElement ("p2", "b2", ""); b.AppendChild (b2); - AssertEquals ("", d.OuterXml); + Assert.AreEqual ("", d.OuterXml); } [Test] @@ -532,7 +532,7 @@ namespace MonoTests.System.Xml doc.LoadXml (""); doc.DocumentElement.RemoveAllAttributes (); - Assert (doc.DocumentElement.FirstChild.OuterXml.IndexOf("xmlns:foo") > 0); + Assert.IsTrue (doc.DocumentElement.FirstChild.OuterXml.IndexOf("xmlns:foo") > 0); } [Test] @@ -540,7 +540,7 @@ namespace MonoTests.System.Xml { XmlDocument doc = new XmlDocument (); doc.LoadXml (""); - Assert (doc.OuterXml.IndexOf ("xmlns:html=\"http://www.w3.org/1999/xhtml\"") > 0); + Assert.IsTrue (doc.OuterXml.IndexOf ("xmlns:html=\"http://www.w3.org/1999/xhtml\"") > 0); } [Test] @@ -557,7 +557,7 @@ namespace MonoTests.System.Xml StringWriter sw = new StringWriter (); XmlTextWriter xtw = new XmlTextWriter (sw); document.DocumentElement.WriteTo (xtw); - AssertEquals ("&foo;", sw.ToString ()); + Assert.AreEqual ("&foo;", sw.ToString ()); } [Test] @@ -571,7 +571,7 @@ namespace MonoTests.System.Xml doc.DocumentElement.Prefix = null; #if NET_2_0 - AssertEquals ("#1", string.Empty, doc.DocumentElement.Prefix); + Assert.AreEqual (string.Empty, doc.DocumentElement.Prefix, "#1"); AssertClearPrefix ((string) null); #endif } @@ -582,7 +582,7 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.LoadXml (""); doc.DocumentElement.Prefix = String.Empty; - AssertEquals ("#1", string.Empty, doc.DocumentElement.Prefix); + Assert.AreEqual (string.Empty, doc.DocumentElement.Prefix, "#1"); AssertClearPrefix (string.Empty); @@ -592,17 +592,13 @@ namespace MonoTests.System.Xml { XmlDocument doc = new XmlDocument (); doc.LoadXml (""); - AssertEquals ("#Clear1", "", - doc.OuterXml); - AssertEquals ("#Clear2", "", - doc.DocumentElement.OuterXml); - AssertEquals ("#Clear3", "x", doc.DocumentElement.Prefix); + Assert.AreEqual ("", doc.OuterXml, "#Clear1"); + Assert.AreEqual ("", doc.DocumentElement.OuterXml, "#Clear2"); + Assert.AreEqual ("x", doc.DocumentElement.Prefix, "#Clear3"); doc.DocumentElement.Prefix = newPrefix; - AssertEquals ("#Clear4", "", - doc.OuterXml); - AssertEquals ("#Clear5", "", - doc.DocumentElement.OuterXml); - AssertEquals ("#Clear6", string.Empty, doc.DocumentElement.Prefix); + Assert.AreEqual ("", doc.OuterXml, "#Clear4"); + Assert.AreEqual ("", doc.DocumentElement.OuterXml, "#Clear5"); + Assert.AreEqual (string.Empty, doc.DocumentElement.Prefix, "#Clear6"); } [Test] @@ -636,7 +632,7 @@ namespace MonoTests.System.Xml changed = true; }; doc.DocumentElement.SetAttribute ("Key", ""); - Assert (changed); + Assert.IsTrue (changed); } class MyXmlElement : XmlElement diff --git a/mcs/class/System.XML/Test/System.Xml/XmlEntityReferenceTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlEntityReferenceTests.cs index 612135a2167..efa681faf21 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlEntityReferenceTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlEntityReferenceTests.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlEntityReferenceTests : Assertion + public class XmlEntityReferenceTests { [Test] public void WriteTo () @@ -25,8 +25,8 @@ namespace MonoTests.System.Xml doc.LoadXml(""); XmlEntityReference er = doc.CreateEntityReference("foo"); doc.DocumentElement.AppendChild(er); - AssertEquals ("Name", "foo", er.Name); - AssertEquals ("WriteTo", "&foo;", doc.DocumentElement.OuterXml); + Assert.AreEqual ("foo", er.Name, "Name"); + Assert.AreEqual ("&foo;", doc.DocumentElement.OuterXml, "WriteTo"); } [Test] @@ -41,10 +41,10 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.Load (xtr); XmlEntity ent = (XmlEntity) doc.DocumentType.Entities.GetNamedItem ("ent2"); - AssertEquals ("ent2", ent.Name); - AssertEquals ("my ", ent.FirstChild.Value); - AssertNotNull (ent.FirstChild.NextSibling.FirstChild); - AssertEquals ("value", ent.FirstChild.NextSibling.FirstChild.Value); + Assert.AreEqual ("ent2", ent.Name); + Assert.AreEqual ("my ", ent.FirstChild.Value); + Assert.IsNotNull (ent.FirstChild.NextSibling.FirstChild); + Assert.AreEqual ("value", ent.FirstChild.NextSibling.FirstChild.Value); } [Test] @@ -57,26 +57,26 @@ namespace MonoTests.System.Xml doc.Load (xtr); XmlEntityReference ent = doc.CreateEntityReference ("ent"); // ChildNodes are not added yet. - AssertNull (ent.FirstChild); + Assert.IsNull (ent.FirstChild); doc.DocumentElement.AppendChild (ent); // ChildNodes are added here. - AssertNotNull (ent.FirstChild); + Assert.IsNotNull (ent.FirstChild); ent = doc.CreateEntityReference ("foo"); - AssertNull (ent.FirstChild); + Assert.IsNull (ent.FirstChild); // Entity value is empty when the matching DTD entity // node does not exist. doc.DocumentElement.AppendChild (ent); - AssertNotNull (ent.FirstChild); + Assert.IsNotNull (ent.FirstChild); - AssertEquals (String.Empty, ent.FirstChild.Value); + Assert.AreEqual (String.Empty, ent.FirstChild.Value); ent = doc.CreateEntityReference ("el"); - AssertEquals ("", ent.InnerText); + Assert.AreEqual ("", ent.InnerText); doc.DocumentElement.AppendChild (ent); - AssertEquals ("hoge", ent.InnerXml); - AssertEquals ("hoge", ent.InnerText); - AssertEquals (XmlNodeType.Element, ent.FirstChild.NodeType); + Assert.AreEqual ("hoge", ent.InnerXml); + Assert.AreEqual ("hoge", ent.InnerText); + Assert.AreEqual (XmlNodeType.Element, ent.FirstChild.NodeType); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlEntityTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlEntityTests.cs index c90772ac1f4..ca778b28018 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlEntityTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlEntityTests.cs @@ -14,7 +14,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlEntityTests : Assertion + public class XmlEntityTests { XmlDocument document; XmlDocumentType docType; @@ -34,15 +34,15 @@ namespace MonoTests.System.Xml document.Load (xtr); xtr.Close (); docType = document.DocumentType; - AssertEquals (2, docType.Entities.Count); + Assert.AreEqual (2, docType.Entities.Count); XmlEntity foo = docType.Entities.Item (0) as XmlEntity; XmlEntity bar = docType.Entities.Item (1) as XmlEntity; - AssertEquals ("foo", foo.Name); - AssertNull (bar.Value); - AssertEquals (1, foo.ChildNodes.Count); - AssertEquals ("bar", bar.Name); - AssertNull (bar.Value); - AssertEquals (1, foo.ChildNodes.Count); + Assert.AreEqual ("foo", foo.Name); + Assert.IsNull (bar.Value); + Assert.AreEqual (1, foo.ChildNodes.Count); + Assert.AreEqual ("bar", bar.Name); + Assert.IsNull (bar.Value); + Assert.AreEqual (1, foo.ChildNodes.Count); } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlNamespaceManagerTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlNamespaceManagerTests.cs index 53ac29aacc4..d2ff3a86aa8 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlNamespaceManagerTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlNamespaceManagerTests.cs @@ -17,7 +17,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlNamespaceManagerTests : Assertion + public class XmlNamespaceManagerTests { private XmlNameTable nameTable; private XmlNamespaceManager namespaceManager; @@ -33,7 +33,7 @@ namespace MonoTests.System.Xml public void NewNamespaceManager () { // make sure that you can call PopScope when there aren't any to pop. - Assert (!namespaceManager.PopScope ()); + Assert.IsTrue (!namespaceManager.PopScope ()); // the following strings should have been added to the name table by the // namespace manager. @@ -44,30 +44,30 @@ namespace MonoTests.System.Xml string xmlNamespace = "http://www.w3.org/XML/1998/namespace"; // none of them should be null. - AssertNotNull (xmlnsPrefix); - AssertNotNull (xmlPrefix); - AssertNotNull (stringEmpty); - AssertNotNull (xmlnsNamespace); - AssertNotNull (xmlNamespace); + Assert.IsNotNull (xmlnsPrefix); + Assert.IsNotNull (xmlPrefix); + Assert.IsNotNull (stringEmpty); + Assert.IsNotNull (xmlnsNamespace); + Assert.IsNotNull (xmlNamespace); // Microsoft's XmlNamespaceManager reports that these three // namespaces aren't declared for some reason. - Assert (!namespaceManager.HasNamespace ("xmlns")); - Assert (!namespaceManager.HasNamespace ("xml")); - Assert (!namespaceManager.HasNamespace (String.Empty)); + Assert.IsTrue (!namespaceManager.HasNamespace ("xmlns")); + Assert.IsTrue (!namespaceManager.HasNamespace ("xml")); + Assert.IsTrue (!namespaceManager.HasNamespace (String.Empty)); // these three namespaces are declared by default. - AssertEquals ("http://www.w3.org/2000/xmlns/", namespaceManager.LookupNamespace ("xmlns")); - AssertEquals ("http://www.w3.org/XML/1998/namespace", namespaceManager.LookupNamespace ("xml")); - AssertEquals (String.Empty, namespaceManager.LookupNamespace (String.Empty)); + Assert.AreEqual ("http://www.w3.org/2000/xmlns/", namespaceManager.LookupNamespace ("xmlns")); + Assert.AreEqual ("http://www.w3.org/XML/1998/namespace", namespaceManager.LookupNamespace ("xml")); + Assert.AreEqual (String.Empty, namespaceManager.LookupNamespace (String.Empty)); // the namespaces should be the same references found in the name table. - AssertSame (xmlnsNamespace, namespaceManager.LookupNamespace ("xmlns")); - AssertSame (xmlNamespace, namespaceManager.LookupNamespace ("xml")); - AssertSame (stringEmpty, namespaceManager.LookupNamespace (String.Empty)); + Assert.AreSame (xmlnsNamespace, namespaceManager.LookupNamespace ("xmlns")); + Assert.AreSame (xmlNamespace, namespaceManager.LookupNamespace ("xml")); + Assert.AreSame (stringEmpty, namespaceManager.LookupNamespace (String.Empty)); // looking up undeclared namespaces should return null. - AssertNull (namespaceManager.LookupNamespace ("foo")); + Assert.IsNull (namespaceManager.LookupNamespace ("foo")); } [Test] @@ -76,12 +76,12 @@ namespace MonoTests.System.Xml // add a new namespace. namespaceManager.AddNamespace ("foo", "http://foo/"); // make sure the new namespace is there. - Assert (namespaceManager.HasNamespace ("foo")); - AssertEquals ("http://foo/", namespaceManager.LookupNamespace ("foo")); + Assert.IsTrue (namespaceManager.HasNamespace ("foo")); + Assert.AreEqual ("http://foo/", namespaceManager.LookupNamespace ("foo")); // adding a different namespace with the same prefix // is allowed. namespaceManager.AddNamespace ("foo", "http://foo1/"); - AssertEquals ("http://foo1/", namespaceManager.LookupNamespace ("foo")); + Assert.AreEqual ("http://foo1/", namespaceManager.LookupNamespace ("foo")); } [Test] @@ -96,13 +96,13 @@ namespace MonoTests.System.Xml fooNamespace2 += "foo/"; // the references must be different in order for this test to prove anything. - Assert (!Object.ReferenceEquals (fooNamespace, fooNamespace2)); + Assert.IsTrue (!Object.ReferenceEquals (fooNamespace, fooNamespace2)); // add the namespace with the reference that's not in the name table. namespaceManager.AddNamespace ("foo", fooNamespace2); // the returned reference should be the same one that's in the name table. - AssertSame (fooNamespace, namespaceManager.LookupNamespace ("foo")); + Assert.AreSame (fooNamespace, namespaceManager.LookupNamespace ("foo")); } [Test] @@ -126,19 +126,19 @@ namespace MonoTests.System.Xml // add a new namespace. namespaceManager.AddNamespace ("foo", "http://foo/"); // make sure the new namespace is there. - Assert (namespaceManager.HasNamespace ("foo")); - AssertEquals ("http://foo/", namespaceManager.LookupNamespace ("foo")); + Assert.IsTrue (namespaceManager.HasNamespace ("foo")); + Assert.AreEqual ("http://foo/", namespaceManager.LookupNamespace ("foo")); // push a new scope. namespaceManager.PushScope (); // add a new namespace. namespaceManager.AddNamespace ("bar", "http://bar/"); // make sure the old namespace is not in this new scope. - Assert (!namespaceManager.HasNamespace ("foo")); + Assert.IsTrue (!namespaceManager.HasNamespace ("foo")); // but we're still supposed to be able to lookup the old namespace. - AssertEquals ("http://foo/", namespaceManager.LookupNamespace ("foo")); + Assert.AreEqual ("http://foo/", namespaceManager.LookupNamespace ("foo")); // make sure the new namespace is there. - Assert (namespaceManager.HasNamespace ("bar")); - AssertEquals ("http://bar/", namespaceManager.LookupNamespace ("bar")); + Assert.IsTrue (namespaceManager.HasNamespace ("bar")); + Assert.AreEqual ("http://bar/", namespaceManager.LookupNamespace ("bar")); } [Test] @@ -147,17 +147,17 @@ namespace MonoTests.System.Xml // add some namespaces and a scope. PushScope (); // pop the scope. - Assert (namespaceManager.PopScope ()); + Assert.IsTrue (namespaceManager.PopScope ()); // make sure the first namespace is still there. - Assert (namespaceManager.HasNamespace ("foo")); - AssertEquals ("http://foo/", namespaceManager.LookupNamespace ("foo")); + Assert.IsTrue (namespaceManager.HasNamespace ("foo")); + Assert.AreEqual ("http://foo/", namespaceManager.LookupNamespace ("foo")); // make sure the second namespace is no longer there. - Assert (!namespaceManager.HasNamespace ("bar")); - AssertNull (namespaceManager.LookupNamespace ("bar")); + Assert.IsTrue (!namespaceManager.HasNamespace ("bar")); + Assert.IsNull (namespaceManager.LookupNamespace ("bar")); // make sure there are no more scopes to pop. - Assert (!namespaceManager.PopScope ()); + Assert.IsTrue (!namespaceManager.PopScope ()); // make sure that popping again doesn't cause an exception. - Assert (!namespaceManager.PopScope ()); + Assert.IsTrue (!namespaceManager.PopScope ()); } [Test] @@ -171,8 +171,8 @@ namespace MonoTests.System.Xml namespaceManager .PopScope (); // 2 namespaceManager .PopScope (); // 1 namespaceManager .PopScope (); // 0 - AssertEquals ("urn:foo", namespaceManager.LookupNamespace ("foo")); - AssertEquals ("urn:bar", namespaceManager.LookupNamespace ("bar")); + Assert.AreEqual ("urn:foo", namespaceManager.LookupNamespace ("foo")); + Assert.AreEqual ("urn:bar", namespaceManager.LookupNamespace ("bar")); } [Test] @@ -182,13 +182,13 @@ namespace MonoTests.System.Xml new XmlNamespaceManager (new NameTable ()); string ns = nsmgr.NameTable.Add ("urn:foo"); nsmgr.AddNamespace ("foo", ns); - AssertEquals ("foo", nsmgr.LookupPrefix (ns)); + Assert.AreEqual ("foo", nsmgr.LookupPrefix (ns)); nsmgr.PushScope (); - AssertEquals ("foo", nsmgr.LookupPrefix (ns)); + Assert.AreEqual ("foo", nsmgr.LookupPrefix (ns)); nsmgr.PopScope (); - AssertEquals ("foo", nsmgr.LookupPrefix (ns)); + Assert.AreEqual ("foo", nsmgr.LookupPrefix (ns)); nsmgr.RemoveNamespace ("foo", ns); - AssertNull (nsmgr.LookupPrefix (ns)); + Assert.IsNull (nsmgr.LookupPrefix (ns)); } [Test] @@ -200,8 +200,8 @@ namespace MonoTests.System.Xml nsmgr.NameTable.Add ("urn:hoge"); nsmgr.NameTable.Add ("urn:fuga"); nsmgr.AddNamespace (string.Empty, "urn:hoge"); - AssertNull (nsmgr.LookupPrefix ("urn:fuga")); - AssertEquals (String.Empty, nsmgr.LookupPrefix ("urn:hoge")); + Assert.IsNull (nsmgr.LookupPrefix ("urn:fuga")); + Assert.AreEqual (String.Empty, nsmgr.LookupPrefix ("urn:hoge")); } string suffix = "oo"; @@ -214,9 +214,9 @@ namespace MonoTests.System.Xml XmlNamespaceManager nsmgr = new XmlNamespaceManager (new NameTable ()); nsmgr.AddNamespace ("foo", "urn:foo"); - AssertNotNull (nsmgr.LookupPrefix ("urn:foo")); + Assert.IsNotNull (nsmgr.LookupPrefix ("urn:foo")); // FIXME: This returns registered URI inconsistently. -// AssertNull ("It is not atomized and thus should be failed", nsmgr.LookupPrefix ("urn:f" + suffix)); +// Assert.IsNull (nsmgr.LookupPrefix ("urn:f" + suffix), "It is not atomized and thus should be failed"); } #if NET_2_0 @@ -231,39 +231,39 @@ namespace MonoTests.System.Xml XmlNamespaceManager nsmgr = new XmlNamespaceManager (new NameTable ()); - AssertEquals ("#1", 0, nsmgr.GetNamespacesInScope (l).Count); - AssertEquals ("#2", 0, nsmgr.GetNamespacesInScope (x).Count); - AssertEquals ("#3", 1, nsmgr.GetNamespacesInScope (a).Count); + Assert.AreEqual (0, nsmgr.GetNamespacesInScope (l).Count, "#1"); + Assert.AreEqual (0, nsmgr.GetNamespacesInScope (x).Count, "#2"); + Assert.AreEqual (1, nsmgr.GetNamespacesInScope (a).Count, "#3"); nsmgr.AddNamespace ("foo", "urn:foo"); - AssertEquals ("#4", 1, nsmgr.GetNamespacesInScope (l).Count); - AssertEquals ("#5", 1, nsmgr.GetNamespacesInScope (x).Count); - AssertEquals ("#6", 2, nsmgr.GetNamespacesInScope (a).Count); + Assert.AreEqual (1, nsmgr.GetNamespacesInScope (l).Count, "#4"); + Assert.AreEqual (1, nsmgr.GetNamespacesInScope (x).Count, "#5"); + Assert.AreEqual (2, nsmgr.GetNamespacesInScope (a).Count, "#6"); // default namespace nsmgr.AddNamespace ("", "urn:empty"); - AssertEquals ("#7", 2, nsmgr.GetNamespacesInScope (l).Count); - AssertEquals ("#8", 2, nsmgr.GetNamespacesInScope (x).Count); - AssertEquals ("#9", 3, nsmgr.GetNamespacesInScope (a).Count); + Assert.AreEqual (2, nsmgr.GetNamespacesInScope (l).Count, "#7"); + Assert.AreEqual (2, nsmgr.GetNamespacesInScope (x).Count, "#8"); + Assert.AreEqual (3, nsmgr.GetNamespacesInScope (a).Count, "#9"); // PushScope nsmgr.AddNamespace ("foo", "urn:foo"); nsmgr.PushScope (); - AssertEquals ("#10", 0, nsmgr.GetNamespacesInScope (l).Count); - AssertEquals ("#11", 2, nsmgr.GetNamespacesInScope (x).Count); - AssertEquals ("#12", 3, nsmgr.GetNamespacesInScope (a).Count); + Assert.AreEqual (0, nsmgr.GetNamespacesInScope (l).Count, "#10"); + Assert.AreEqual (2, nsmgr.GetNamespacesInScope (x).Count, "#11"); + Assert.AreEqual (3, nsmgr.GetNamespacesInScope (a).Count, "#12"); // PopScope nsmgr.PopScope (); - AssertEquals ("#13", 2, nsmgr.GetNamespacesInScope (l).Count); - AssertEquals ("#14", 2, nsmgr.GetNamespacesInScope (x).Count); - AssertEquals ("#15", 3, nsmgr.GetNamespacesInScope (a).Count); + Assert.AreEqual (2, nsmgr.GetNamespacesInScope (l).Count, "#13"); + Assert.AreEqual (2, nsmgr.GetNamespacesInScope (x).Count, "#14"); + Assert.AreEqual (3, nsmgr.GetNamespacesInScope (a).Count, "#15"); nsmgr.AddNamespace ("", ""); // MS bug - it should return 1 for .Local but it returns 2 instead. - AssertEquals ("#16", 1, nsmgr.GetNamespacesInScope (l).Count); - AssertEquals ("#17", 1, nsmgr.GetNamespacesInScope (x).Count); - AssertEquals ("#18", 2, nsmgr.GetNamespacesInScope (a).Count); + Assert.AreEqual (1, nsmgr.GetNamespacesInScope (l).Count, "#16"); + Assert.AreEqual (1, nsmgr.GetNamespacesInScope (x).Count, "#17"); + Assert.AreEqual (2, nsmgr.GetNamespacesInScope (a).Count, "#18"); } #endif } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlNodeListTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlNodeListTests.cs index 3cab445df30..cfcef40d925 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlNodeListTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlNodeListTests.cs @@ -18,7 +18,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlNodeListTests : Assertion + public class XmlNodeListTests { XmlDocument document; XmlElement documentElement; @@ -40,10 +40,10 @@ namespace MonoTests.System.Xml document.LoadXml ("bar"); documentElement = document.DocumentElement; node = documentElement.FirstChild; - AssertEquals ("Expected a text node.", node.NodeType, XmlNodeType.Text); - AssertEquals ("Shouldn't have children.", node.HasChildNodes, false); - AssertEquals ("Should be empty node list.", node.ChildNodes.Count, 0); - AssertEquals ("Should be empty node list.", node.GetEnumerator().MoveNext(), false); + Assert.AreEqual (node.NodeType, XmlNodeType.Text, "Expected a text node."); + Assert.AreEqual (node.HasChildNodes, false, "Shouldn't have children."); + Assert.AreEqual (node.ChildNodes.Count, 0, "Should be empty node list."); + Assert.AreEqual (node.GetEnumerator().MoveNext(), false, "Should be empty node list."); } [Test] @@ -51,7 +51,7 @@ namespace MonoTests.System.Xml { document.LoadXml (""); documentElement = document.DocumentElement; - AssertEquals ("Should be empty node list.", documentElement.GetEnumerator().MoveNext(), false); + Assert.AreEqual (documentElement.GetEnumerator().MoveNext(), false, "Should be empty node list."); } [Test] @@ -59,14 +59,14 @@ namespace MonoTests.System.Xml { document.LoadXml (""); documentElement = document.DocumentElement; - AssertEquals ("Incorrect number of children returned from Count property.", documentElement.ChildNodes.Count, 1); + Assert.AreEqual (documentElement.ChildNodes.Count, 1, "Incorrect number of children returned from Count property."); index = 1; foreach (XmlNode childNode in documentElement.ChildNodes) { - AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName); + Assert.AreEqual ("child" + index.ToString(), childNode.LocalName, "Enumerator didn't return correct node."); index++; } - AssertEquals ("foreach didn't loop over all children correctly.", index, 2); + Assert.AreEqual (index, 2, "foreach didn't loop over all children correctly."); } [Test] @@ -74,21 +74,21 @@ namespace MonoTests.System.Xml { document.LoadXml (""); element = document.DocumentElement; - AssertEquals ("Incorrect number of children returned from Count property.", element.ChildNodes.Count, 3); - AssertNull ("Index less than zero should have returned null.", element.ChildNodes [-1]); - AssertNull ("Index greater than or equal to Count should have returned null.", element.ChildNodes [3]); - AssertEquals ("Didn't return the correct child.", element.FirstChild, element.ChildNodes[0]); - AssertEquals ("Didn't return the correct child.", "child1", element.ChildNodes[0].LocalName); - AssertEquals ("Didn't return the correct child.", "child2", element.ChildNodes[1].LocalName); - AssertEquals ("Didn't return the correct child.", "child3", element.ChildNodes[2].LocalName); + Assert.AreEqual (element.ChildNodes.Count, 3, "Incorrect number of children returned from Count property."); + Assert.IsNull (element.ChildNodes [-1], "Index less than zero should have returned null."); + Assert.IsNull (element.ChildNodes [3], "Index greater than or equal to Count should have returned null."); + Assert.AreEqual (element.FirstChild, element.ChildNodes[0], "Didn't return the correct child."); + Assert.AreEqual ("child1", element.ChildNodes[0].LocalName, "Didn't return the correct child."); + Assert.AreEqual ("child2", element.ChildNodes[1].LocalName, "Didn't return the correct child."); + Assert.AreEqual ("child3", element.ChildNodes[2].LocalName, "Didn't return the correct child."); index = 1; foreach (XmlNode childNode in element.ChildNodes) { - AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName); + Assert.AreEqual ("child" + index.ToString(), childNode.LocalName, "Enumerator didn't return correct node."); index++; } - AssertEquals ("foreach didn't loop over all children correctly.", index, 4); + Assert.AreEqual (index, 4, "foreach didn't loop over all children correctly."); } [Test] @@ -97,13 +97,13 @@ namespace MonoTests.System.Xml document.LoadXml (""); element = document.DocumentElement; enumerator = element.GetEnumerator(); - AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true); - AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false); + Assert.AreEqual (enumerator.MoveNext(), true, "MoveNext should have succeeded."); + Assert.AreEqual (enumerator.MoveNext(), false, "MoveNext should have failed."); enumerator.Reset(); - AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true); + Assert.AreEqual (enumerator.MoveNext(), true, "MoveNext should have succeeded."); element.AppendChild(document.CreateElement("child2")); - AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true); - AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false); + Assert.AreEqual (enumerator.MoveNext(), true, "MoveNext should have succeeded."); + Assert.AreEqual (enumerator.MoveNext(), false, "MoveNext should have failed."); } [Test] @@ -114,7 +114,7 @@ namespace MonoTests.System.Xml enumerator = element.GetEnumerator(); element.RemoveChild(element.FirstChild); enumerator.MoveNext(); - AssertEquals ("Expected child2 element.", ((XmlElement)enumerator.Current).LocalName, "child2"); + Assert.AreEqual (((XmlElement)enumerator.Current).LocalName, "child2", "Expected child2 element."); } [Test] @@ -125,14 +125,14 @@ namespace MonoTests.System.Xml enumerator = element.GetEnumerator (); enumerator.MoveNext (); enumerator.MoveNext (); - AssertEquals ("Expected child2 element.", "child2", ((XmlElement)enumerator.Current).LocalName); - AssertEquals ("Expected child2 element.", "child2", element.FirstChild.NextSibling.LocalName); + Assert.AreEqual ("child2", ((XmlElement)enumerator.Current).LocalName, "Expected child2 element."); + Assert.AreEqual ("child2", element.FirstChild.NextSibling.LocalName, "Expected child2 element."); element.RemoveChild (element.FirstChild.NextSibling); enumerator.MoveNext (); try { element = (XmlElement) enumerator.Current; - Fail ("Expected an InvalidOperationException."); + Assert.Fail ("Expected an InvalidOperationException."); } catch (InvalidOperationException) { } } @@ -144,11 +144,11 @@ namespace MonoTests.System.Xml element = document.DocumentElement; node = document.CreateElement("child3"); enumerator = element.GetEnumerator(); - AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true); + Assert.AreEqual (enumerator.MoveNext(), true, "MoveNext should have succeeded."); element.ReplaceChild(node, element.LastChild); enumerator.MoveNext(); - AssertEquals ("Expected child3 element.", ((XmlElement)enumerator.Current).LocalName, "child3"); - AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false); + Assert.AreEqual (((XmlElement)enumerator.Current).LocalName, "child3", "Expected child3 element."); + Assert.AreEqual (enumerator.MoveNext(), false, "MoveNext should have failed."); } [Test] @@ -158,7 +158,7 @@ namespace MonoTests.System.Xml element = document.DocumentElement; enumerator = element.GetEnumerator(); element.RemoveChild(element.FirstChild); - AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false); + Assert.AreEqual (enumerator.MoveNext(), false, "MoveNext should have failed."); } // TODO: Take the word save off front of this method when XmlNode.RemoveAll() is fully implemented. @@ -168,10 +168,10 @@ namespace MonoTests.System.Xml document.LoadXml (""); element = document.DocumentElement; enumerator = element.GetEnumerator(); - AssertEquals ("Expected 3 children.", element.ChildNodes.Count, 3); - AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true); + Assert.AreEqual (element.ChildNodes.Count, 3, "Expected 3 children."); + Assert.AreEqual (enumerator.MoveNext(), true, "MoveNext should have succeeded."); element.RemoveAll(); - AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false); + Assert.AreEqual (enumerator.MoveNext(), false, "MoveNext should have failed."); } [Test] @@ -183,7 +183,7 @@ namespace MonoTests.System.Xml try { obj = enumerator.Current; - Fail ("Calling Current property before first node in list should have thrown InvalidOperationException."); + Assert.Fail ("Calling Current property before first node in list should have thrown InvalidOperationException."); } catch (InvalidOperationException) { } } @@ -198,7 +198,7 @@ namespace MonoTests.System.Xml try { obj = enumerator.Current; - Fail ("Calling Current property after last node in list should have thrown InvalidOperationException."); + Assert.Fail ("Calling Current property after last node in list should have thrown InvalidOperationException."); } catch (InvalidOperationException) { } } @@ -210,7 +210,7 @@ namespace MonoTests.System.Xml element = document.DocumentElement; enumerator = element.GetEnumerator(); enumerator.MoveNext(); - AssertEquals("Consecutive calls to Current property should yield same reference.", Object.ReferenceEquals(enumerator.Current, enumerator.Current), true); + Assert.AreEqual (Object.ReferenceEquals(enumerator.Current, enumerator.Current), true, "Consecutive calls to Current property should yield same reference."); } [Test] @@ -221,10 +221,10 @@ namespace MonoTests.System.Xml enumerator = element.GetEnumerator(); enumerator.MoveNext(); enumerator.MoveNext(); - AssertEquals("Expected child2.", ((XmlElement)enumerator.Current).LocalName, "child2"); + Assert.AreEqual (((XmlElement)enumerator.Current).LocalName, "child2", "Expected child2."); enumerator.Reset(); enumerator.MoveNext(); - AssertEquals("Expected child1.", ((XmlElement)enumerator.Current).LocalName, "child1"); + Assert.AreEqual (((XmlElement)enumerator.Current).LocalName, "child1", "Expected child1."); } [Test] @@ -232,13 +232,13 @@ namespace MonoTests.System.Xml { document.LoadXml (""); XmlNodeList nl = document.DocumentElement.GetElementsByTagName ("bar"); - AssertEquals ("empty list. count", 0, nl.Count); + Assert.AreEqual (0, nl.Count, "empty list. count"); try { - AssertNull ("index 0", nl [0]); - AssertNull ("index 1", nl [1]); - AssertNull ("index -1", nl [-1]); + Assert.IsNull (nl [0], "index 0"); + Assert.IsNull (nl [1], "index 1"); + Assert.IsNull (nl [-1], "index -1"); } catch (ArgumentOutOfRangeException) { - Fail ("don't throw index out of range."); + Assert.Fail ("don't throw index out of range."); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlNodeReaderTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlNodeReaderTests.cs index 25eae6f31f7..9f76a4c422d 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlNodeReaderTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlNodeReaderTests.cs @@ -20,7 +20,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlNodeReaderTests : Assertion + public class XmlNodeReaderTests { [SetUp] public void GetReady () @@ -36,19 +36,19 @@ namespace MonoTests.System.Xml XmlNodeReader nrdr; try { nrdr = new XmlNodeReader (null); - Fail ("null reference exception is preferable."); + Assert.Fail ("null reference exception is preferable."); } catch (NullReferenceException) { } nrdr = new XmlNodeReader (new XmlDocument ()); nrdr.Read (); - AssertEquals ("newDoc.ReadState", ReadState.Error, nrdr.ReadState); - AssertEquals ("newDoc.EOF", true, nrdr.EOF); - AssertEquals ("newDoc.NodeType", XmlNodeType.None, nrdr.NodeType); + Assert.AreEqual (ReadState.Error, nrdr.ReadState, "newDoc.ReadState"); + Assert.AreEqual (true, nrdr.EOF, "newDoc.EOF"); + Assert.AreEqual (XmlNodeType.None, nrdr.NodeType, "newDoc.NodeType"); nrdr = new XmlNodeReader (document.CreateDocumentFragment ()); nrdr.Read (); - AssertEquals ("Fragment.ReadState", ReadState.Error, nrdr.ReadState); - AssertEquals ("Fragment.EOF", true, nrdr.EOF); - AssertEquals ("Fragment.NodeType", XmlNodeType.None, nrdr.NodeType); + Assert.AreEqual (ReadState.Error, nrdr.ReadState, "Fragment.ReadState"); + Assert.AreEqual (true, nrdr.EOF, "Fragment.EOF"); + Assert.AreEqual (XmlNodeType.None, nrdr.NodeType, "Fragment.NodeType"); } [Test] @@ -56,10 +56,10 @@ namespace MonoTests.System.Xml { XmlNodeReader nrdr = new XmlNodeReader (document.DocumentElement); nrdr.Read (); - AssertEquals (".NodeType", XmlNodeType.Element, nrdr.NodeType); - AssertEquals (".Name", "root", nrdr.Name); - AssertEquals (".ReadState", ReadState.Interactive, nrdr.ReadState); - AssertEquals (".Depth", 0, nrdr.Depth); + Assert.AreEqual (XmlNodeType.Element, nrdr.NodeType, ".NodeType"); + Assert.AreEqual ("root", nrdr.Name, ".Name"); + Assert.AreEqual (ReadState.Interactive, nrdr.ReadState, ".ReadState"); + Assert.AreEqual (0, nrdr.Depth, ".Depth"); } @@ -69,9 +69,9 @@ namespace MonoTests.System.Xml document.LoadXml ("test of mixed string."); XmlNodeReader nrdr = new XmlNodeReader (document); nrdr.ReadInnerXml (); - AssertEquals ("initial.ReadState", ReadState.Initial, nrdr.ReadState); - AssertEquals ("initial.EOF", false, nrdr.EOF); - AssertEquals ("initial.NodeType", XmlNodeType.None, nrdr.NodeType); + Assert.AreEqual (ReadState.Initial, nrdr.ReadState, "initial.ReadState"); + Assert.AreEqual (false, nrdr.EOF, "initial.EOF"); + Assert.AreEqual (XmlNodeType.None, nrdr.NodeType, "initial.NodeType"); } [Test] @@ -82,38 +82,38 @@ namespace MonoTests.System.Xml string dtd = "" + ent1 + ent2; string xml = dtd + "&ent;&ent2;"; document.LoadXml (xml); - AssertEquals (xml, document.OuterXml); + Assert.AreEqual (xml, document.OuterXml); XmlNodeReader nr = new XmlNodeReader (document); nr.Read (); // DTD nr.Read (); // root nr.Read (); // &ent; - AssertEquals (XmlNodeType.EntityReference, nr.NodeType); - AssertEquals ("depth#1", 1, nr.Depth); + Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType); + Assert.AreEqual (1, nr.Depth, "depth#1"); nr.ResolveEntity (); // It is still entity reference. - AssertEquals (XmlNodeType.EntityReference, nr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType); nr.Read (); - AssertEquals (XmlNodeType.Text, nr.NodeType); - AssertEquals ("depth#2", 2, nr.Depth); - AssertEquals ("entity string", nr.Value); + Assert.AreEqual (XmlNodeType.Text, nr.NodeType); + Assert.AreEqual (2, nr.Depth, "depth#2"); + Assert.AreEqual ("entity string", nr.Value); nr.Read (); - AssertEquals (XmlNodeType.EndEntity, nr.NodeType); - AssertEquals ("depth#3", 1, nr.Depth); - AssertEquals ("", nr.Value); + Assert.AreEqual (XmlNodeType.EndEntity, nr.NodeType); + Assert.AreEqual (1, nr.Depth, "depth#3"); + Assert.AreEqual ("", nr.Value); nr.Read (); // &ent2; - AssertEquals (XmlNodeType.EntityReference, nr.NodeType); - AssertEquals ("depth#4", 1, nr.Depth); + Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType); + Assert.AreEqual (1, nr.Depth, "depth#4"); nr.ResolveEntity (); - AssertEquals (xml, document.OuterXml); + Assert.AreEqual (xml, document.OuterXml); // It is still entity reference. - AssertEquals (XmlNodeType.EntityReference, nr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType); // It now became element node. nr.Read (); - AssertEquals (XmlNodeType.Element, nr.NodeType); - AssertEquals ("depth#5", 2, nr.Depth); + Assert.AreEqual (XmlNodeType.Element, nr.NodeType); + Assert.AreEqual (2, nr.Depth, "depth#5"); - AssertEquals (xml, document.OuterXml); + Assert.AreEqual (xml, document.OuterXml); } [Test] @@ -132,24 +132,24 @@ namespace MonoTests.System.Xml document.AppendChild (document.ReadNode (xtr)); document.AppendChild (document.ReadNode (xtr)); xtr.Close (); - AssertEquals (xml, document.OuterXml); + Assert.AreEqual (xml, document.OuterXml); XmlNodeReader nr = new XmlNodeReader (document); nr.Read (); // DTD nr.Read (); // root nr.Read (); // &ent3; - AssertEquals (XmlNodeType.EntityReference, nr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType); // ent3 does not exists in this dtd. nr.ResolveEntity (); - AssertEquals (XmlNodeType.EntityReference, nr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType); nr.Read (); #if false // Hmm... MS.NET returned as it is a Text node. - AssertEquals (XmlNodeType.Text, nr.NodeType); - AssertEquals (String.Empty, nr.Value); + Assert.AreEqual (XmlNodeType.Text, nr.NodeType); + Assert.AreEqual (String.Empty, nr.Value); nr.Read (); // Really!? - AssertEquals (XmlNodeType.EndEntity, nr.NodeType); - AssertEquals (String.Empty, nr.Value); + Assert.AreEqual (XmlNodeType.EndEntity, nr.NodeType); + Assert.AreEqual (String.Empty, nr.Value); #endif } @@ -165,11 +165,11 @@ namespace MonoTests.System.Xml xtr.Read (); document.AppendChild (document.ReadNode (xtr)); xtr.Close (); - AssertEquals (xml, document.OuterXml); + Assert.AreEqual (xml, document.OuterXml); XmlNodeReader nr = new XmlNodeReader (document); nr.Read (); // root nr.Read (); // &ent; - AssertEquals (XmlNodeType.EntityReference, nr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType); // ent does not exists in this dtd. nr.ResolveEntity (); } @@ -181,16 +181,16 @@ namespace MonoTests.System.Xml XmlNodeReader nr = new XmlNodeReader ( document.DocumentElement.FirstChild); nr.Read (); - AssertEquals ("#0", true, nr.IsEmptyElement); - Assert ("#1", !nr.Read ()); + Assert.AreEqual (true, nr.IsEmptyElement, "#0"); + Assert.IsTrue (!nr.Read (), "#1"); document.LoadXml (""); nr = new XmlNodeReader ( document.DocumentElement.FirstChild); nr.Read (); - Assert ("#2", nr.Read ()); - AssertEquals ("#2.2", false, nr.IsEmptyElement); - Assert ("#3", !nr.Read ()); + Assert.IsTrue (nr.Read (), "#2"); + Assert.AreEqual (false, nr.IsEmptyElement, "#2.2"); + Assert.IsTrue (!nr.Read (), "#3"); } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlNodeTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlNodeTests.cs index 849041bdbfd..41aa9bf10c9 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlNodeTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlNodeTests.cs @@ -19,7 +19,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlNodeTests : Assertion + public class XmlNodeTests { XmlDocument document; XmlElement element; @@ -81,40 +81,40 @@ namespace MonoTests.System.Xml inserted = false; inserting = false; element.AppendChild (element2); - Assert (inserted); - Assert (inserting); + Assert.IsTrue (inserted); + Assert.IsTrue (inserting); // Can only append to elements, documents, and attributes try { comment = document.CreateComment ("baz"); comment.AppendChild (element2); - Fail ("Expected an InvalidOperationException to be thrown."); + Assert.Fail ("Expected an InvalidOperationException to be thrown."); } catch (InvalidOperationException) {} // Can't append a node from one document into another document. XmlDocument document2 = new XmlDocument(); - AssertEquals (1, element.ChildNodes.Count); + Assert.AreEqual (1, element.ChildNodes.Count); try { element2 = document2.CreateElement ("qux"); element.AppendChild (element2); - Fail ("Expected an ArgumentException to be thrown."); + Assert.Fail ("Expected an ArgumentException to be thrown."); } catch (ArgumentException) {} - AssertEquals (1, element.ChildNodes.Count); + Assert.AreEqual (1, element.ChildNodes.Count); // Can't append to a readonly node. /* TODO put this in when I figure out how to create a read-only node. try { XmlElement element3 = (XmlElement)element.CloneNode (false); - Assert (!element.IsReadOnly); - Assert (element3.IsReadOnly); + Assert.IsTrue (!element.IsReadOnly); + Assert.IsTrue (element3.IsReadOnly); element2 = document.CreateElement ("quux"); element3.AppendChild (element2); - Fail ("Expected an ArgumentException to be thrown."); + Assert.Fail ("Expected an ArgumentException to be thrown."); } catch (ArgumentException) {} */ @@ -126,27 +126,27 @@ namespace MonoTests.System.Xml document.LoadXml ("text node"); XmlNode n = document.DocumentElement; - AssertEquals ("#1", "urn:default", n.GetNamespaceOfPrefix (String.Empty)); - AssertEquals ("#2", "urn:foo", n.GetNamespaceOfPrefix ("foo")); - AssertEquals ("#3", String.Empty, n.GetNamespaceOfPrefix ("bar")); + Assert.AreEqual ("urn:default", n.GetNamespaceOfPrefix (String.Empty), "#1"); + Assert.AreEqual ("urn:foo", n.GetNamespaceOfPrefix ("foo"), "#2"); + Assert.AreEqual (String.Empty, n.GetNamespaceOfPrefix ("bar"), "#3"); #if NET_2_0 - AssertEquals ("#4", "http://www.w3.org/XML/1998/namespace", n.GetNamespaceOfPrefix ("xml")); - AssertEquals ("#5", "http://www.w3.org/2000/xmlns/", n.GetNamespaceOfPrefix ("xmlns")); + Assert.AreEqual ("http://www.w3.org/XML/1998/namespace", n.GetNamespaceOfPrefix ("xml"), "#4"); + Assert.AreEqual ("http://www.w3.org/2000/xmlns/", n.GetNamespaceOfPrefix ("xmlns"), "#5"); #else - AssertEquals ("#4", String.Empty, n.GetNamespaceOfPrefix ("xml")); - AssertEquals ("#5", String.Empty, n.GetNamespaceOfPrefix ("xmlns")); + Assert.AreEqual (String.Empty, n.GetNamespaceOfPrefix ("xml"), "#4"); + Assert.AreEqual (String.Empty, n.GetNamespaceOfPrefix ("xmlns"), "#5"); #endif n = document.DocumentElement.FirstChild; - AssertEquals ("#6", "urn:default", n.GetNamespaceOfPrefix (String.Empty)); - AssertEquals ("#7", "urn:foo", n.GetNamespaceOfPrefix ("foo")); - AssertEquals ("#8", String.Empty, n.GetNamespaceOfPrefix ("bar")); + Assert.AreEqual ("urn:default", n.GetNamespaceOfPrefix (String.Empty), "#6"); + Assert.AreEqual ("urn:foo", n.GetNamespaceOfPrefix ("foo"), "#7"); + Assert.AreEqual (String.Empty, n.GetNamespaceOfPrefix ("bar"), "#8"); #if NET_2_0 - AssertEquals ("#9", "http://www.w3.org/XML/1998/namespace", n.GetNamespaceOfPrefix ("xml")); - AssertEquals ("#10", "http://www.w3.org/2000/xmlns/", n.GetNamespaceOfPrefix ("xmlns")); + Assert.AreEqual ("http://www.w3.org/XML/1998/namespace", n.GetNamespaceOfPrefix ("xml"), "#9"); + Assert.AreEqual ("http://www.w3.org/2000/xmlns/", n.GetNamespaceOfPrefix ("xmlns"), "#10"); #else - AssertEquals ("#9", String.Empty, n.GetNamespaceOfPrefix ("xml")); - AssertEquals ("#10", String.Empty, n.GetNamespaceOfPrefix ("xmlns")); + Assert.AreEqual (String.Empty, n.GetNamespaceOfPrefix ("xml"), "#9"); + Assert.AreEqual (String.Empty, n.GetNamespaceOfPrefix ("xmlns"), "#10"); #endif } @@ -164,11 +164,11 @@ namespace MonoTests.System.Xml document.LoadXml(""); XmlElement docelem = document.DocumentElement; docelem.InsertBefore(document.CreateElement("good_child"), docelem.FirstChild); - AssertEquals("InsertBefore.Normal", "good_child", docelem.FirstChild.Name); + Assert.AreEqual ("good_child", docelem.FirstChild.Name, "InsertBefore.Normal"); // These are required for .NET 1.0 but not for .NET 1.1. try { document.InsertBefore (document.CreateElement ("BAD_MAN"), docelem); - Fail ("#InsertBefore.BadPositionButNoError.1"); + Assert.Fail ("#InsertBefore.BadPositionButNoError.1"); } catch (Exception) {} } @@ -181,19 +181,17 @@ namespace MonoTests.System.Xml XmlElement docelem = document.DocumentElement; XmlElement newelem = document.CreateElement("good_child"); docelem.InsertAfter(newelem, docelem.FirstChild); - AssertEquals("InsertAfter.Normal", 3, docelem.ChildNodes.Count); - AssertEquals("InsertAfter.First", "sub1", docelem.FirstChild.Name); - AssertEquals("InsertAfter.Last", "sub2", docelem.LastChild.Name); - AssertEquals("InsertAfter.Prev", "good_child", docelem.FirstChild.NextSibling.Name); - AssertEquals("InsertAfter.Next", "good_child", docelem.LastChild.PreviousSibling.Name); + Assert.AreEqual (3, docelem.ChildNodes.Count, "InsertAfter.Normal"); + Assert.AreEqual ("sub1", docelem.FirstChild.Name, "InsertAfter.First"); + Assert.AreEqual ("sub2", docelem.LastChild.Name, "InsertAfter.Last"); + Assert.AreEqual ("good_child", docelem.FirstChild.NextSibling.Name, "InsertAfter.Prev"); + Assert.AreEqual ("good_child", docelem.LastChild.PreviousSibling.Name, "InsertAfter.Next"); // this doesn't throw any exception *only on .NET 1.1* // .NET 1.0 throws an exception. try { document.InsertAfter(document.CreateElement("BAD_MAN"), docelem); #if USE_VERSION_1_1 - AssertEquals("InsertAfter with bad location", - "", - document.InnerXml); + Assert.AreEqual ("", document.InnerXml, "InsertAfter with bad location"); } catch (XmlException ex) { throw ex; } @@ -211,31 +209,31 @@ namespace MonoTests.System.Xml doc.NodeChanged += new XmlNodeChangedEventHandler (EventNodeChanged); doc.NodeRemoved += new XmlNodeChangedEventHandler (EventNodeRemoved); - AssertEquals (3, doc.DocumentElement.ChildNodes.Count); + Assert.AreEqual (3, doc.DocumentElement.ChildNodes.Count); doc.DocumentElement.Normalize (); - AssertEquals (3, doc.DocumentElement.ChildNodes.Count); - Assert (changed); + Assert.AreEqual (3, doc.DocumentElement.ChildNodes.Count); + Assert.IsTrue (changed); inserted = changed = removed = false; doc.DocumentElement.AppendChild (doc.CreateTextNode ("Addendum.")); - AssertEquals (4, doc.DocumentElement.ChildNodes.Count); + Assert.AreEqual (4, doc.DocumentElement.ChildNodes.Count); inserted = changed = removed = false; doc.DocumentElement.Normalize (); - AssertEquals (3, doc.DocumentElement.ChildNodes.Count); - Assert (changed); - Assert (removed); + Assert.AreEqual (3, doc.DocumentElement.ChildNodes.Count); + Assert.IsTrue (changed); + Assert.IsTrue (removed); inserted = changed = removed = false; doc.DocumentElement.SetAttribute ("attr", ""); XmlAttribute attr = doc.DocumentElement.Attributes [0] as XmlAttribute; - AssertEquals (1, attr.ChildNodes.Count); + Assert.AreEqual (1, attr.ChildNodes.Count); inserted = changed = removed = false; attr.Normalize (); // Such behavior violates DOM Level 2 Node#normalize(), // but MS DOM is designed as such. - AssertEquals (1, attr.ChildNodes.Count); + Assert.AreEqual (1, attr.ChildNodes.Count); } [Test] @@ -252,10 +250,10 @@ namespace MonoTests.System.Xml doc.NodeInserted += new XmlNodeChangedEventHandler (OnChange); doc.NodeChanged += new XmlNodeChangedEventHandler (OnChange); doc.NodeRemoved += new XmlNodeChangedEventHandler (OnChange); - AssertEquals ("Before Normalize()", 5, root.ChildNodes.Count); + Assert.AreEqual (5, root.ChildNodes.Count, "Before Normalize()"); root.Normalize (); - AssertEquals (" foobar baz", root.OuterXml); - AssertEquals ("After Normalize()", 1, root.ChildNodes.Count); + Assert.AreEqual (" foobar baz", root.OuterXml); + Assert.AreEqual (1, root.ChildNodes.Count, "After Normalize()"); } int normalize2Count; @@ -264,27 +262,27 @@ namespace MonoTests.System.Xml { switch (normalize2Count) { case 0: - AssertEquals ("Action0", XmlNodeChangedAction.Remove, e.Action); - AssertEquals ("Value0", " ", e.Node.Value); + Assert.AreEqual (XmlNodeChangedAction.Remove, e.Action, "Action0"); + Assert.AreEqual (" ", e.Node.Value, "Value0"); break; case 1: - AssertEquals ("Action1", XmlNodeChangedAction.Remove, e.Action); - AssertEquals ("Value1", "bar", e.Node.Value); + Assert.AreEqual (XmlNodeChangedAction.Remove, e.Action, "Action1"); + Assert.AreEqual ("bar", e.Node.Value, "Value1"); break; case 2: - AssertEquals ("Action2", XmlNodeChangedAction.Remove, e.Action); - AssertEquals ("Value2", " ", e.Node.Value); + Assert.AreEqual (XmlNodeChangedAction.Remove, e.Action, "Action2"); + Assert.AreEqual (" ", e.Node.Value, "Value2"); break; case 3: - AssertEquals ("Action3", XmlNodeChangedAction.Remove, e.Action); - AssertEquals ("Value3", "baz", e.Node.Value); + Assert.AreEqual (XmlNodeChangedAction.Remove, e.Action, "Action3"); + Assert.AreEqual ("baz", e.Node.Value, "Value3"); break; case 4: - AssertEquals ("Action4", XmlNodeChangedAction.Change, e.Action); - AssertEquals ("Value4", " foobar baz", e.Node.Value); + Assert.AreEqual (XmlNodeChangedAction.Change, e.Action, "Action4"); + Assert.AreEqual (" foobar baz", e.Node.Value, "Value4"); break; default: - Fail (String.Format ("Unexpected event. Action = {0}, node type = {1}, node name = {2}, node value = {3}", e.Action, e.Node.NodeType, e.Node.Name, e.Node.Value)); + Assert.Fail (String.Format ("Unexpected event. Action = {0}, node type = {1}, node name = {2}, node value = {3}", e.Action, e.Node.NodeType, e.Node.Name, e.Node.Value)); break; } normalize2Count++; @@ -297,7 +295,7 @@ namespace MonoTests.System.Xml document.LoadXml(""); XmlElement docelem = document.DocumentElement; docelem.PrependChild(document.CreateElement("prepender")); - AssertEquals("PrependChild", "prepender", docelem.FirstChild.Name); + Assert.AreEqual ("prepender", docelem.FirstChild.Name, "PrependChild"); } public void saveTestRemoveAll () @@ -307,8 +305,8 @@ namespace MonoTests.System.Xml removed = false; removing = false; element.RemoveAll (); - Assert (removed); - Assert (removing); + Assert.IsTrue (removed); + Assert.IsTrue (removing); } [Test] @@ -318,8 +316,8 @@ namespace MonoTests.System.Xml removed = false; removing = false; element.RemoveChild (element2); - Assert (removed); - Assert (removing); + Assert.IsTrue (removed); + Assert.IsTrue (removing); } [Test] @@ -327,25 +325,25 @@ namespace MonoTests.System.Xml { element.InnerXml = ""; element.RemoveChild (element.LastChild); - AssertNotNull (element.FirstChild); + Assert.IsNotNull (element.FirstChild); } [Test] public void GetPrefixOfNamespace () { document.LoadXml (""); - AssertEquals ("root", String.Empty, document.DocumentElement.GetPrefixOfNamespace ("urn:foo")); - AssertEquals ("c1", String.Empty, document.DocumentElement.GetPrefixOfNamespace ("urn:foo")); - AssertEquals ("c2", String.Empty, document.DocumentElement.FirstChild.GetPrefixOfNamespace ("urn:foo")); - AssertEquals ("c3", "foo", document.DocumentElement.FirstChild.FirstChild.GetPrefixOfNamespace ("urn:foo")); + Assert.AreEqual (String.Empty, document.DocumentElement.GetPrefixOfNamespace ("urn:foo"), "root"); + Assert.AreEqual (String.Empty, document.DocumentElement.GetPrefixOfNamespace ("urn:foo"), "c1"); + Assert.AreEqual (String.Empty, document.DocumentElement.FirstChild.GetPrefixOfNamespace ("urn:foo"), "c2"); + Assert.AreEqual ("foo", document.DocumentElement.FirstChild.FirstChild.GetPrefixOfNamespace ("urn:foo"), "c3"); // disconnected nodes. XmlNode n = document.CreateElement ("foo"); - AssertEquals (String.Empty, n.GetPrefixOfNamespace ("foo")); + Assert.AreEqual (String.Empty, n.GetPrefixOfNamespace ("foo")); n = document.CreateTextNode ("text"); // does not have Attributes - AssertEquals (String.Empty, n.GetPrefixOfNamespace ("foo")); + Assert.AreEqual (String.Empty, n.GetPrefixOfNamespace ("foo")); n = document.CreateXmlDeclaration ("1.0", null, null); // does not have Attributes - AssertEquals (String.Empty, n.GetPrefixOfNamespace ("foo")); + Assert.AreEqual (String.Empty, n.GetPrefixOfNamespace ("foo")); } [Test] @@ -358,7 +356,7 @@ namespace MonoTests.System.Xml doc.DocumentElement.Attributes [0].Value = "urn:foo"; XmlElement el = doc.CreateElement ("bar"); doc.DocumentElement.AppendChild (el); - AssertEquals ("u", el.GetPrefixOfNamespace ("urn:foo")); + Assert.AreEqual ("u", el.GetPrefixOfNamespace ("urn:foo")); } [Test] @@ -371,9 +369,9 @@ namespace MonoTests.System.Xml inserted = changed = removed = false; XmlElement el = document.CreateElement("root2"); document.ReplaceChild (el, document.DocumentElement); - AssertEquals ("root2", document.DocumentElement.Name); - AssertEquals (1, document.ChildNodes.Count); - Assert (inserted && removed && !changed); + Assert.AreEqual ("root2", document.DocumentElement.Name); + Assert.AreEqual (1, document.ChildNodes.Count); + Assert.IsTrue (inserted && removed && !changed); } [Test] @@ -382,10 +380,10 @@ namespace MonoTests.System.Xml document.LoadXml ("This is mixed content. Also includes ."); string total = "This is mixed content. Also includes CDATA section."; XmlNode elemB = document.DocumentElement.ChildNodes [1]; - AssertEquals ("mixed", elemB.FirstChild.InnerText); // text node - AssertEquals ("mixed", elemB.InnerText); // element b - AssertEquals (total, document.DocumentElement.InnerText); // element root - AssertEquals (total, document.InnerText); // whole document + Assert.AreEqual ("mixed", elemB.FirstChild.InnerText); // text node + Assert.AreEqual ("mixed", elemB.InnerText); // element b + Assert.AreEqual (total, document.DocumentElement.InnerText); // element root + Assert.AreEqual (total, document.InnerText); // whole document } [Test] @@ -396,7 +394,7 @@ namespace MonoTests.System.Xml xel.SetAttribute ("xmlns", "http://www.w3.org/2000/09/xmldsig#"); xel.InnerXml = "blablabla"; string expected = "blablabla"; - AssertEquals (expected, xel.OuterXml); + Assert.AreEqual (expected, xel.OuterXml); } [Test] @@ -407,22 +405,22 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.LoadXml ("test"); XmlNodeList nl = doc.SelectNodes (xpath); - AssertEquals (6, nl.Count); + Assert.AreEqual (6, nl.Count); // BTW, as for namespace nodes, Node does not exist // in the tree, so the return value should be // implementation dependent. - AssertEquals ("#1", XmlNodeType.Attribute, nl [0].NodeType); - AssertEquals ("#2", XmlNodeType.Attribute, nl [1].NodeType); - AssertEquals ("#3", XmlNodeType.Attribute, nl [2].NodeType); - AssertEquals ("#4", XmlNodeType.Attribute, nl [3].NodeType); - AssertEquals ("#5", XmlNodeType.Attribute, nl [4].NodeType); - AssertEquals ("#6", XmlNodeType.Attribute, nl [5].NodeType); - AssertEquals ("xmlns", nl [0].LocalName); - AssertEquals ("xml", nl [1].LocalName); - AssertEquals ("xmlns", nl [2].LocalName); - AssertEquals ("xml", nl [3].LocalName); - AssertEquals ("xmlns", nl [4].LocalName); - AssertEquals ("xml", nl [5].LocalName); + Assert.AreEqual (XmlNodeType.Attribute, nl [0].NodeType, "#1"); + Assert.AreEqual (XmlNodeType.Attribute, nl [1].NodeType, "#2"); + Assert.AreEqual (XmlNodeType.Attribute, nl [2].NodeType, "#3"); + Assert.AreEqual (XmlNodeType.Attribute, nl [3].NodeType, "#4"); + Assert.AreEqual (XmlNodeType.Attribute, nl [4].NodeType, "#5"); + Assert.AreEqual (XmlNodeType.Attribute, nl [5].NodeType, "#6"); + Assert.AreEqual ("xmlns", nl [0].LocalName); + Assert.AreEqual ("xml", nl [1].LocalName); + Assert.AreEqual ("xmlns", nl [2].LocalName); + Assert.AreEqual ("xml", nl [3].LocalName); + Assert.AreEqual ("xmlns", nl [4].LocalName); + Assert.AreEqual ("xml", nl [5].LocalName); } [Test] @@ -434,25 +432,25 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.LoadXml ("test"); XmlNodeList nl = doc.SelectNodes (xpath); - AssertEquals (9, nl.Count); - AssertEquals (XmlNodeType.Element, nl [0].NodeType); - AssertEquals (XmlNodeType.Attribute, nl [1].NodeType); - AssertEquals (XmlNodeType.Attribute, nl [2].NodeType); - AssertEquals (XmlNodeType.Element, nl [3].NodeType); - AssertEquals (XmlNodeType.Attribute, nl [4].NodeType); - AssertEquals (XmlNodeType.Attribute, nl [5].NodeType); - AssertEquals (XmlNodeType.Element, nl [6].NodeType); - AssertEquals (XmlNodeType.Attribute, nl [7].NodeType); - AssertEquals (XmlNodeType.Attribute, nl [8].NodeType); - AssertEquals ("element", nl [0].LocalName); - AssertEquals ("xmlns", nl [1].LocalName); - AssertEquals ("xml", nl [2].LocalName); - AssertEquals ("foo", nl [3].LocalName); - AssertEquals ("xmlns", nl [4].LocalName); - AssertEquals ("xml", nl [5].LocalName); - AssertEquals ("bar", nl [6].LocalName); - AssertEquals ("xmlns", nl [7].LocalName); - AssertEquals ("xml", nl [8].LocalName); + Assert.AreEqual (9, nl.Count); + Assert.AreEqual (XmlNodeType.Element, nl [0].NodeType); + Assert.AreEqual (XmlNodeType.Attribute, nl [1].NodeType); + Assert.AreEqual (XmlNodeType.Attribute, nl [2].NodeType); + Assert.AreEqual (XmlNodeType.Element, nl [3].NodeType); + Assert.AreEqual (XmlNodeType.Attribute, nl [4].NodeType); + Assert.AreEqual (XmlNodeType.Attribute, nl [5].NodeType); + Assert.AreEqual (XmlNodeType.Element, nl [6].NodeType); + Assert.AreEqual (XmlNodeType.Attribute, nl [7].NodeType); + Assert.AreEqual (XmlNodeType.Attribute, nl [8].NodeType); + Assert.AreEqual ("element", nl [0].LocalName); + Assert.AreEqual ("xmlns", nl [1].LocalName); + Assert.AreEqual ("xml", nl [2].LocalName); + Assert.AreEqual ("foo", nl [3].LocalName); + Assert.AreEqual ("xmlns", nl [4].LocalName); + Assert.AreEqual ("xml", nl [5].LocalName); + Assert.AreEqual ("bar", nl [6].LocalName); + Assert.AreEqual ("xmlns", nl [7].LocalName); + Assert.AreEqual ("xml", nl [8].LocalName); } [Test] @@ -462,11 +460,11 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.Load ("Test/XmlFiles/simple.xml"); XmlElement el = doc.CreateElement ("foo"); - AssertEquals (String.Empty, el.BaseURI); + Assert.AreEqual (String.Empty, el.BaseURI); doc.DocumentElement.AppendChild (el); - Assert (String.Empty != el.BaseURI); + Assert.IsTrue (String.Empty != el.BaseURI); XmlAttribute attr = doc.CreateAttribute ("attr"); - AssertEquals (String.Empty, attr.BaseURI); + Assert.AreEqual (String.Empty, attr.BaseURI); } [Test] @@ -482,8 +480,8 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.LoadXml (xml); XmlNode n = doc.DocumentElement.FirstChild.FirstChild; - Assert ("#1", n.IsReadOnly); - Assert ("#2", !n.CloneNode (true).IsReadOnly); + Assert.IsTrue (n.IsReadOnly, "#1"); + Assert.IsTrue (!n.CloneNode (true).IsReadOnly, "#2"); } [Test] // bug #80233 @@ -491,7 +489,7 @@ namespace MonoTests.System.Xml { XmlDocument doc = new XmlDocument (); doc.LoadXml (""); - AssertEquals (String.Empty, doc.InnerText); + Assert.AreEqual (String.Empty, doc.InnerText); } [Test] // part of bug #80331 diff --git a/mcs/class/System.XML/Test/System.Xml/XmlProcessingInstructionTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlProcessingInstructionTests.cs index df655345e84..1b767d354dc 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlProcessingInstructionTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlProcessingInstructionTests.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlProcessingInstructionTests : Assertion + public class XmlProcessingInstructionTests { XmlDocument document; XmlProcessingInstruction pi; @@ -31,8 +31,8 @@ namespace MonoTests.System.Xml public void InnerAndOuterXml () { pi = document.CreateProcessingInstruction ("foo", "bar"); - AssertEquals (String.Empty, pi.InnerXml); - AssertEquals ("", pi.OuterXml); + Assert.AreEqual (String.Empty, pi.InnerXml); + Assert.AreEqual ("", pi.OuterXml); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlReaderCommonTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlReaderCommonTests.cs index 41f1534873f..c0f3096bd03 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlReaderCommonTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlReaderCommonTests.cs @@ -21,7 +21,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlReaderTests : Assertion + public class XmlReaderTests { [SetUp] public void GetReady () @@ -41,10 +41,10 @@ namespace MonoTests.System.Xml // copy from XmlTextReaderTests private void AssertStartDocument (XmlReader xmlReader) { - Assert (xmlReader.ReadState == ReadState.Initial); - Assert (xmlReader.NodeType == XmlNodeType.None); - Assert (xmlReader.Depth == 0); - Assert (!xmlReader.EOF); + Assert.IsTrue (xmlReader.ReadState == ReadState.Initial); + Assert.IsTrue (xmlReader.NodeType == XmlNodeType.None); + Assert.IsTrue (xmlReader.Depth == 0); + Assert.IsTrue (!xmlReader.EOF); } private void AssertNode ( @@ -77,9 +77,9 @@ namespace MonoTests.System.Xml string value, int attributeCount) { - Assert (label + " Read() return value", xmlReader.Read ()); - Assert (label + " ReadState", xmlReader.ReadState == ReadState.Interactive); - Assert (label + " !EOF", !xmlReader.EOF); + Assert.IsTrue (xmlReader.Read (), label + " Read() return value"); + Assert.IsTrue (xmlReader.ReadState == ReadState.Interactive, label + " ReadState"); + Assert.IsTrue (!xmlReader.EOF, label + " !EOF"); AssertNodeValues (label, xmlReader, nodeType, depth, isEmptyElement, name, prefix, localName, namespaceURI, value, value != String.Empty, @@ -121,26 +121,26 @@ namespace MonoTests.System.Xml bool hasAttributes) { label = String.Concat (label, "(", xmlReader.GetType ().Name, ")"); - AssertEquals (label + ": NodeType", nodeType, xmlReader.NodeType); - AssertEquals (label + ": IsEmptyElement", isEmptyElement, xmlReader.IsEmptyElement); + Assert.AreEqual (nodeType, xmlReader.NodeType, label + ": NodeType"); + Assert.AreEqual (isEmptyElement, xmlReader.IsEmptyElement, label + ": IsEmptyElement"); - AssertEquals (label + ": name", name, xmlReader.Name); + Assert.AreEqual (name, xmlReader.Name, label + ": name"); - AssertEquals (label + ": prefix", prefix, xmlReader.Prefix); + Assert.AreEqual (prefix, xmlReader.Prefix, label + ": prefix"); - AssertEquals (label + ": localName", localName, xmlReader.LocalName); + Assert.AreEqual (localName, xmlReader.LocalName, label + ": localName"); - AssertEquals (label + ": namespaceURI", namespaceURI, xmlReader.NamespaceURI); + Assert.AreEqual (namespaceURI, xmlReader.NamespaceURI, label + ": namespaceURI"); - AssertEquals (label + ": Depth", depth, xmlReader.Depth); + Assert.AreEqual (depth, xmlReader.Depth, label + ": Depth"); - AssertEquals (label + ": hasValue", hasValue, xmlReader.HasValue); + Assert.AreEqual (hasValue, xmlReader.HasValue, label + ": hasValue"); - AssertEquals (label + ": Value", value, xmlReader.Value); + Assert.AreEqual (value, xmlReader.Value, label + ": Value"); - AssertEquals (label + ": hasAttributes", hasAttributes, xmlReader.HasAttributes); + Assert.AreEqual (hasAttributes, xmlReader.HasAttributes, label + ": hasAttributes"); - AssertEquals (label + ": attributeCount", attributeCount, xmlReader.AttributeCount); + Assert.AreEqual (attributeCount, xmlReader.AttributeCount, label + ": attributeCount"); } private void AssertAttribute ( @@ -151,26 +151,26 @@ namespace MonoTests.System.Xml string namespaceURI, string value) { - AssertEquals ("value", value, xmlReader [name]); + Assert.AreEqual (value, xmlReader [name], "value"); - Assert (xmlReader.GetAttribute (name) == value); + Assert.IsTrue (xmlReader.GetAttribute (name) == value); if (namespaceURI != String.Empty) { - Assert (xmlReader[localName, namespaceURI] == value); - Assert (xmlReader.GetAttribute (localName, namespaceURI) == value); + Assert.IsTrue (xmlReader[localName, namespaceURI] == value); + Assert.IsTrue (xmlReader.GetAttribute (localName, namespaceURI) == value); } } private void AssertEndDocument (XmlReader xmlReader) { - Assert ("could read", !xmlReader.Read ()); - AssertEquals ("NodeType is not XmlNodeType.None", XmlNodeType.None, xmlReader.NodeType); - AssertEquals ("Depth is not 0", 0, xmlReader.Depth); - AssertEquals ("ReadState is not ReadState.EndOfFile", ReadState.EndOfFile, xmlReader.ReadState); - Assert ("not EOF", xmlReader.EOF); + Assert.IsTrue (!xmlReader.Read (), "could read"); + Assert.AreEqual (XmlNodeType.None, xmlReader.NodeType, "NodeType is not XmlNodeType.None"); + Assert.AreEqual (0, xmlReader.Depth, "Depth is not 0"); + Assert.AreEqual (ReadState.EndOfFile, xmlReader.ReadState, "ReadState is not ReadState.EndOfFile"); + Assert.IsTrue (xmlReader.EOF, "not EOF"); xmlReader.Close (); - AssertEquals ("ReadState is not ReadState.Cosed", ReadState.Closed, xmlReader.ReadState); + Assert.AreEqual (ReadState.Closed, xmlReader.ReadState, "ReadState is not ReadState.Cosed"); } private delegate void TestMethod (XmlReader reader); @@ -219,13 +219,13 @@ namespace MonoTests.System.Xml private void InitialState (XmlReader reader) { - AssertEquals ("Depth", 0, reader.Depth); - AssertEquals ("EOF", false, reader.EOF); - AssertEquals ("HasValue", false, reader.HasValue); - AssertEquals ("IsEmptyElement", false, reader.IsEmptyElement); - AssertEquals ("LocalName", String.Empty, reader.LocalName); - AssertEquals ("NodeType", XmlNodeType.None, reader.NodeType); - AssertEquals ("ReadState", ReadState.Initial, reader.ReadState); + Assert.AreEqual (0, reader.Depth, "Depth"); + Assert.AreEqual (false, reader.EOF, "EOF"); + Assert.AreEqual (false, reader.HasValue, "HasValue"); + Assert.AreEqual (false, reader.IsEmptyElement, "IsEmptyElement"); + Assert.AreEqual (String.Empty, reader.LocalName, "LocalName"); + Assert.AreEqual (XmlNodeType.None, reader.NodeType, "NodeType"); + Assert.AreEqual (ReadState.Initial, reader.ReadState, "ReadState"); } [Test] @@ -237,25 +237,25 @@ namespace MonoTests.System.Xml public void Read (XmlReader reader) { reader.Read (); - AssertEquals (".NodeType", XmlNodeType.Element, reader.NodeType); - AssertEquals (".Name", "root", reader.Name); - AssertEquals (".ReadState", ReadState.Interactive, reader.ReadState); - AssertEquals (".Depth", 0, reader.Depth); + Assert.AreEqual (XmlNodeType.Element, reader.NodeType, ".NodeType"); + Assert.AreEqual ("root", reader.Name, ".Name"); + Assert.AreEqual (ReadState.Interactive, reader.ReadState, ".ReadState"); + Assert.AreEqual (0, reader.Depth, ".Depth"); // move to 'child' reader.Read (); - AssertEquals (".Depth", 1, reader.Depth); - AssertEquals (".NodeType", XmlNodeType.Element, reader.NodeType); - AssertEquals (".Name", "child", reader.Name); + Assert.AreEqual (1, reader.Depth, ".Depth"); + Assert.AreEqual (XmlNodeType.Element, reader.NodeType, ".NodeType"); + Assert.AreEqual ("child", reader.Name, ".Name"); reader.Read (); - AssertEquals (".Depth", 0, reader.Depth); - AssertEquals (".NodeType", XmlNodeType.EndElement, reader.NodeType); - AssertEquals (".Name", "root", reader.Name); + Assert.AreEqual (0, reader.Depth, ".Depth"); + Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, ".NodeType"); + Assert.AreEqual ("root", reader.Name, ".Name"); reader.Read (); - AssertEquals ("end.EOF", true, reader.EOF); - AssertEquals ("end.NodeType", XmlNodeType.None, reader.NodeType); + Assert.AreEqual (true, reader.EOF, "end.EOF"); + Assert.AreEqual (XmlNodeType.None, reader.NodeType, "end.NodeType"); } [Test] @@ -268,19 +268,19 @@ namespace MonoTests.System.Xml public void ReadAttributeValue (XmlReader reader) { reader.Read (); // root - Assert (reader.MoveToFirstAttribute ()); + Assert.IsTrue (reader.MoveToFirstAttribute ()); // It looks like that MS.NET shows AttributeCount and // HasAttributes as the same as element node! this.AssertNodeValues ("#1", reader, XmlNodeType.Attribute, 1, false, "attr", "", "attr", "", "", true, 1, true); - Assert (reader.ReadAttributeValue ()); + Assert.IsTrue (reader.ReadAttributeValue ()); // MS.NET XmlTextReader fails. Its Prefix returns // null instead of "". It is fixed in MS.NET 2.0. this.AssertNodeValues ("#2", reader, XmlNodeType.Text, 2, false, "", "", "", "", "", true, 1, true); - Assert (reader.MoveToElement ()); + Assert.IsTrue (reader.MoveToElement ()); this.AssertNodeValues ("#3", reader, XmlNodeType.Element, 0, true, "root", "", "root", "", "", false, 1, true); @@ -295,13 +295,13 @@ namespace MonoTests.System.Xml public void ReadEmptyElement (XmlReader reader) { reader.Read (); // root - AssertEquals (false, reader.IsEmptyElement); + Assert.AreEqual (false, reader.IsEmptyElement); reader.Read (); // foo - AssertEquals ("foo", reader.Name); - AssertEquals (true, reader.IsEmptyElement); + Assert.AreEqual ("foo", reader.Name); + Assert.AreEqual (true, reader.IsEmptyElement); reader.Read (); // bar - AssertEquals ("bar", reader.Name); - AssertEquals (false, reader.IsEmptyElement); + Assert.AreEqual ("bar", reader.Name); + Assert.AreEqual (false, reader.IsEmptyElement); } [Test] @@ -320,20 +320,20 @@ namespace MonoTests.System.Xml reader.Read (); string s = reader.ReadString (); - AssertEquals ("readString.1.ret_val", " test of ", s); - AssertEquals ("readString.1.Name", "b", reader.Name); + Assert.AreEqual (" test of ", s, "readString.1.ret_val"); + Assert.AreEqual ("b", reader.Name, "readString.1.Name"); s = reader.ReadString (); - AssertEquals ("readString.2.ret_val", "mixed", s); - AssertEquals ("readString.2.NodeType", XmlNodeType.EndElement, reader.NodeType); + Assert.AreEqual ("mixed", s, "readString.2.ret_val"); + Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "readString.2.NodeType"); s = reader.ReadString (); // never proceeds. - AssertEquals ("readString.3.ret_val", String.Empty, s); - AssertEquals ("readString.3.NodeType", XmlNodeType.EndElement, reader.NodeType); + Assert.AreEqual (String.Empty, s, "readString.3.ret_val"); + Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "readString.3.NodeType"); reader.Read (); - AssertEquals ("readString.4.NodeType", XmlNodeType.Text, reader.NodeType); - AssertEquals ("readString.4.Value", " string.", reader.Value); + Assert.AreEqual (XmlNodeType.Text, reader.NodeType, "readString.4.NodeType"); + Assert.AreEqual (" string.", reader.Value, "readString.4.Value"); s = reader.ReadString (); // reads the same Text node. - AssertEquals ("readString.5.ret_val", " string. cdata string.", s); - AssertEquals ("readString.5.NodeType", XmlNodeType.EndElement, reader.NodeType); + Assert.AreEqual (" string. cdata string.", s, "readString.5.ret_val"); + Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "readString.5.NodeType"); } [Test] @@ -347,13 +347,13 @@ namespace MonoTests.System.Xml { reader.Read (); reader.Read (); - AssertEquals ("initial.ReadState", ReadState.Interactive, reader.ReadState); - AssertEquals ("initial.EOF", false, reader.EOF); - AssertEquals ("initial.NodeType", XmlNodeType.Element, reader.NodeType); + Assert.AreEqual (ReadState.Interactive, reader.ReadState, "initial.ReadState"); + Assert.AreEqual (false, reader.EOF, "initial.EOF"); + Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "initial.NodeType"); string s = reader.ReadInnerXml (); - AssertEquals ("read_all", "test of mixed string.", s); - AssertEquals ("after.Name", "bar", reader.Name); - AssertEquals ("after.NodeType", XmlNodeType.Element, reader.NodeType); + Assert.AreEqual ("test of mixed string.", s, "read_all"); + Assert.AreEqual ("bar", reader.Name, "after.Name"); + Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "after.NodeType"); } @@ -910,7 +910,7 @@ namespace MonoTests.System.Xml "http://foo/" // value ); - AssertEquals ("http://foo/", xmlReader.LookupNamespace (String.Empty)); + Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace (String.Empty)); AssertEndDocument (xmlReader); } @@ -948,7 +948,7 @@ namespace MonoTests.System.Xml "http://foo/" // value ); - AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo")); + Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo")); AssertNode ( xmlReader, // xmlReader @@ -972,8 +972,8 @@ namespace MonoTests.System.Xml "http://baz/" // value ); - AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo")); - AssertEquals ("http://baz/", xmlReader.LookupNamespace ("baz")); + Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo")); + Assert.AreEqual ("http://baz/", xmlReader.LookupNamespace ("baz")); AssertNode ( xmlReader, // xmlReader @@ -988,8 +988,8 @@ namespace MonoTests.System.Xml 0 // attributeCount ); - AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo")); - AssertNull (xmlReader.LookupNamespace ("baz")); + Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo")); + Assert.IsNull (xmlReader.LookupNamespace ("baz")); AssertEndDocument (xmlReader); } @@ -1027,7 +1027,7 @@ namespace MonoTests.System.Xml "http://foo/" // value ); - AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo")); + Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo")); AssertNode ( xmlReader, // xmlReader @@ -1051,8 +1051,8 @@ namespace MonoTests.System.Xml "http://baz/" // value ); - AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo")); - AssertEquals ("http://baz/", xmlReader.LookupNamespace (String.Empty)); + Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo")); + Assert.AreEqual ("http://baz/", xmlReader.LookupNamespace (String.Empty)); AssertNode ( xmlReader, // xmlReader @@ -1067,7 +1067,7 @@ namespace MonoTests.System.Xml 0 // attributeCount ); - AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo")); + Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo")); AssertEndDocument (xmlReader); } @@ -1114,7 +1114,7 @@ namespace MonoTests.System.Xml "http://bar/" // value ); - AssertEquals ("http://bar/", xmlReader.LookupNamespace ("bar")); + Assert.AreEqual ("http://bar/", xmlReader.LookupNamespace ("bar")); AssertEndDocument (xmlReader); } @@ -1128,12 +1128,12 @@ namespace MonoTests.System.Xml public void MoveToElementFromAttribute (XmlReader xmlReader) { - Assert (xmlReader.Read ()); - AssertEquals (XmlNodeType.Element, xmlReader.NodeType); - Assert (xmlReader.MoveToFirstAttribute ()); - AssertEquals (XmlNodeType.Attribute, xmlReader.NodeType); - Assert (xmlReader.MoveToElement ()); - AssertEquals (XmlNodeType.Element, xmlReader.NodeType); + Assert.IsTrue (xmlReader.Read ()); + Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType); + Assert.IsTrue (xmlReader.MoveToFirstAttribute ()); + Assert.AreEqual (XmlNodeType.Attribute, xmlReader.NodeType); + Assert.IsTrue (xmlReader.MoveToElement ()); + Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType); } [Test] @@ -1145,10 +1145,10 @@ namespace MonoTests.System.Xml public void MoveToElementFromElement (XmlReader xmlReader) { - Assert (xmlReader.Read ()); - AssertEquals (XmlNodeType.Element, xmlReader.NodeType); - Assert (!xmlReader.MoveToElement ()); - AssertEquals (XmlNodeType.Element, xmlReader.NodeType); + Assert.IsTrue (xmlReader.Read ()); + Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType); + Assert.IsTrue (!xmlReader.MoveToElement ()); + Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType); } [Test] @@ -1160,10 +1160,10 @@ namespace MonoTests.System.Xml public void MoveToFirstAttributeWithNoAttributes (XmlReader xmlReader) { - Assert (xmlReader.Read ()); - AssertEquals (XmlNodeType.Element, xmlReader.NodeType); - Assert (!xmlReader.MoveToFirstAttribute ()); - AssertEquals (XmlNodeType.Element, xmlReader.NodeType); + Assert.IsTrue (xmlReader.Read ()); + Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType); + Assert.IsTrue (!xmlReader.MoveToFirstAttribute ()); + Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType); } [Test] @@ -1175,10 +1175,10 @@ namespace MonoTests.System.Xml public void MoveToNextAttributeWithNoAttributes (XmlReader xmlReader) { - Assert (xmlReader.Read ()); - AssertEquals (XmlNodeType.Element, xmlReader.NodeType); - Assert (!xmlReader.MoveToNextAttribute ()); - AssertEquals (XmlNodeType.Element, xmlReader.NodeType); + Assert.IsTrue (xmlReader.Read ()); + Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType); + Assert.IsTrue (!xmlReader.MoveToNextAttribute ()); + Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType); } [Test] @@ -1223,17 +1223,17 @@ namespace MonoTests.System.Xml "quuux" // value ); - Assert (xmlReader.MoveToNextAttribute ()); - AssertEquals ("bar", xmlReader.Name); - AssertEquals ("baz", xmlReader.Value); + Assert.IsTrue (xmlReader.MoveToNextAttribute ()); + Assert.AreEqual ("bar", xmlReader.Name); + Assert.AreEqual ("baz", xmlReader.Value); - Assert (xmlReader.MoveToNextAttribute ()); - AssertEquals ("quux", xmlReader.Name); - AssertEquals ("quuux", xmlReader.Value); + Assert.IsTrue (xmlReader.MoveToNextAttribute ()); + Assert.AreEqual ("quux", xmlReader.Name); + Assert.AreEqual ("quuux", xmlReader.Value); - Assert (!xmlReader.MoveToNextAttribute ()); + Assert.IsTrue (!xmlReader.MoveToNextAttribute ()); - Assert (xmlReader.MoveToElement ()); + Assert.IsTrue (xmlReader.MoveToElement ()); AssertNodeValues ( "#1", @@ -1274,8 +1274,7 @@ namespace MonoTests.System.Xml String.Empty, "version=\"1.0\" standalone=\"yes\"", 2); - Assert ("MoveToFirstAttribute", - xmlReader.MoveToFirstAttribute ()); + Assert.IsTrue (xmlReader.MoveToFirstAttribute (), "MoveToFirstAttribute"); this.AssertNodeValues ("#2", xmlReader, XmlNodeType.Attribute, 0, // FIXME: might be 1 @@ -1330,17 +1329,17 @@ namespace MonoTests.System.Xml public void AttributeOrder (XmlReader xmlReader) { - Assert (xmlReader.Read ()); - AssertEquals (XmlNodeType.Element, xmlReader.NodeType); + Assert.IsTrue (xmlReader.Read ()); + Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType); - Assert (xmlReader.MoveToFirstAttribute ()); - AssertEquals ("_1", xmlReader.Name); - Assert (xmlReader.MoveToNextAttribute ()); - AssertEquals ("_2", xmlReader.Name); - Assert (xmlReader.MoveToNextAttribute ()); - AssertEquals ("_3", xmlReader.Name); + Assert.IsTrue (xmlReader.MoveToFirstAttribute ()); + Assert.AreEqual ("_1", xmlReader.Name); + Assert.IsTrue (xmlReader.MoveToNextAttribute ()); + Assert.AreEqual ("_2", xmlReader.Name); + Assert.IsTrue (xmlReader.MoveToNextAttribute ()); + Assert.AreEqual ("_3", xmlReader.Name); - Assert (!xmlReader.MoveToNextAttribute ()); + Assert.IsTrue (!xmlReader.MoveToNextAttribute ()); } [Test] @@ -1353,34 +1352,34 @@ namespace MonoTests.System.Xml public void IndexerAndAttributes (XmlReader xmlReader) { - Assert (xmlReader.Read ()); - AssertEquals ("1.0", xmlReader ["version"]); - AssertEquals ("1.0", xmlReader.GetAttribute ("version")); + Assert.IsTrue (xmlReader.Read ()); + Assert.AreEqual ("1.0", xmlReader ["version"]); + Assert.AreEqual ("1.0", xmlReader.GetAttribute ("version")); // .NET 1.1 BUG. XmlTextReader returns null, while XmlNodeReader returns "". - AssertEquals (null, xmlReader ["encoding"]); - AssertEquals (null, xmlReader.GetAttribute ("encoding")); - AssertEquals ("no", xmlReader ["standalone"]); - AssertEquals ("no", xmlReader.GetAttribute ("standalone")); - AssertEquals ("1.0", xmlReader [0]); - AssertEquals ("1.0", xmlReader.GetAttribute (0)); - AssertEquals ("no", xmlReader [1]); - AssertEquals ("no", xmlReader.GetAttribute (1)); + Assert.AreEqual (null, xmlReader ["encoding"]); + Assert.AreEqual (null, xmlReader.GetAttribute ("encoding")); + Assert.AreEqual ("no", xmlReader ["standalone"]); + Assert.AreEqual ("no", xmlReader.GetAttribute ("standalone")); + Assert.AreEqual ("1.0", xmlReader [0]); + Assert.AreEqual ("1.0", xmlReader.GetAttribute (0)); + Assert.AreEqual ("no", xmlReader [1]); + Assert.AreEqual ("no", xmlReader.GetAttribute (1)); - Assert (xmlReader.Read ()); - AssertEquals (XmlNodeType.Element, xmlReader.NodeType); - AssertEquals ("1", xmlReader ["_1"]); + Assert.IsTrue (xmlReader.Read ()); + Assert.AreEqual (XmlNodeType.Element, xmlReader.NodeType); + Assert.AreEqual ("1", xmlReader ["_1"]); - Assert (xmlReader.MoveToFirstAttribute ()); - AssertEquals ("_1", xmlReader.Name); - AssertEquals ("1", xmlReader ["_1"]); - Assert (xmlReader.MoveToNextAttribute ()); - AssertEquals ("_2", xmlReader.Name); - AssertEquals ("1", xmlReader ["_1"]); - Assert (xmlReader.MoveToNextAttribute ()); - AssertEquals ("_3", xmlReader.Name); - AssertEquals ("1", xmlReader ["_1"]); + Assert.IsTrue (xmlReader.MoveToFirstAttribute ()); + Assert.AreEqual ("_1", xmlReader.Name); + Assert.AreEqual ("1", xmlReader ["_1"]); + Assert.IsTrue (xmlReader.MoveToNextAttribute ()); + Assert.AreEqual ("_2", xmlReader.Name); + Assert.AreEqual ("1", xmlReader ["_1"]); + Assert.IsTrue (xmlReader.MoveToNextAttribute ()); + Assert.AreEqual ("_3", xmlReader.Name); + Assert.AreEqual ("1", xmlReader ["_1"]); - Assert (!xmlReader.MoveToNextAttribute ()); + Assert.IsTrue (!xmlReader.MoveToNextAttribute ()); } [Test] @@ -1414,11 +1413,11 @@ namespace MonoTests.System.Xml public void SurrogatePairContent (XmlReader xmlReader) { xmlReader.Read (); - AssertEquals (true, xmlReader.MoveToAttribute ("xmlns")); - AssertEquals ("xmlns", xmlReader.Name); - AssertEquals (2, xmlReader.Value.Length); - AssertEquals (0xD800, (int) xmlReader.Value [0]); - AssertEquals (0xDD00, (int) xmlReader.Value [1]); + Assert.AreEqual (true, xmlReader.MoveToAttribute ("xmlns")); + Assert.AreEqual ("xmlns", xmlReader.Name); + Assert.AreEqual (2, xmlReader.Value.Length); + Assert.AreEqual (0xD800, (int) xmlReader.Value [0]); + Assert.AreEqual (0xDD00, (int) xmlReader.Value [1]); } [Test] @@ -1433,7 +1432,7 @@ namespace MonoTests.System.Xml xmlReader.Read (); xmlReader.Read (); xmlReader.Read (); - AssertEquals (String.Empty, xmlReader.ReadOuterXml ()); + Assert.AreEqual (String.Empty, xmlReader.ReadOuterXml ()); } [Test] @@ -1448,7 +1447,7 @@ namespace MonoTests.System.Xml xmlReader.Read (); xmlReader.Read (); xmlReader.Read (); - AssertEquals (String.Empty, xmlReader.ReadInnerXml ()); + Assert.AreEqual (String.Empty, xmlReader.ReadInnerXml ()); } [Test] @@ -1461,7 +1460,7 @@ namespace MonoTests.System.Xml void LookupEmptyPrefix (XmlReader xmlReader) { xmlReader.Read (); - AssertNull (xmlReader.LookupNamespace (String.Empty)); + Assert.IsNull (xmlReader.LookupNamespace (String.Empty)); } [Test] @@ -1476,7 +1475,7 @@ namespace MonoTests.System.Xml xr.Read (); xr.ReadStartElement (); // consume Element node. - AssertEquals (XmlNodeType.Text, xr.NodeType); + Assert.AreEqual (XmlNodeType.Text, xr.NodeType); } [Test] @@ -1489,11 +1488,11 @@ namespace MonoTests.System.Xml void LookupNamespaceAtEndElement (XmlReader reader) { reader.Read (); - AssertEquals ("#1", "urn:foo", reader.LookupNamespace ("x")); + Assert.AreEqual ("urn:foo", reader.LookupNamespace ("x"), "#1"); reader.Read (); - AssertEquals ("#2", "urn:foo", reader.LookupNamespace ("x")); + Assert.AreEqual ("urn:foo", reader.LookupNamespace ("x"), "#2"); reader.Read (); - AssertEquals ("#3", "urn:foo", reader.LookupNamespace ("x")); + Assert.AreEqual ("urn:foo", reader.LookupNamespace ("x"), "#3"); } [Test] @@ -1518,11 +1517,11 @@ namespace MonoTests.System.Xml s.ProhibitDtd = false; XmlReader xr = XmlReader.Create ("Test/XmlFiles/nested-dtd-test.xml", s); xr.Read (); - AssertEquals ("#1", XmlNodeType.DocumentType, xr.NodeType); + Assert.AreEqual (XmlNodeType.DocumentType, xr.NodeType, "#1"); xr.Read (); - AssertEquals ("#2", XmlNodeType.Whitespace, xr.NodeType); + Assert.AreEqual (XmlNodeType.Whitespace, xr.NodeType, "#2"); xr.Read (); - AssertEquals ("#3", XmlNodeType.Element, xr.NodeType); + Assert.AreEqual (XmlNodeType.Element, xr.NodeType, "#3"); } [Test] @@ -1592,20 +1591,20 @@ namespace MonoTests.System.Xml void ReadToDescendant (XmlReader xmlReader) { // move to first - Assert ("#1", xmlReader.ReadToDescendant ("bar")); + Assert.IsTrue (xmlReader.ReadToDescendant ("bar"), "#1"); // no children in . It is empty. - Assert ("#2", !xmlReader.ReadToDescendant ("bar")); - AssertEquals ("#2-2", "bar", xmlReader.Name); + Assert.IsTrue (!xmlReader.ReadToDescendant ("bar"), "#2"); + Assert.AreEqual ("bar", xmlReader.Name, "#2-2"); // move to the second xmlReader.Read (); // move to the second - Assert ("#3", xmlReader.ReadToDescendant ("bar")); + Assert.IsTrue (xmlReader.ReadToDescendant ("bar"), "#3"); // move to inside ... - Assert ("#4", xmlReader.ReadToDescendant ("bar")); + Assert.IsTrue (xmlReader.ReadToDescendant ("bar"), "#4"); // the next is EndElement of , so no move. - Assert ("#5", !xmlReader.ReadToDescendant ("bar")); - AssertEquals ("#5-2", XmlNodeType.EndElement, xmlReader.NodeType); + Assert.IsTrue (!xmlReader.ReadToDescendant ("bar"), "#5"); + Assert.AreEqual (XmlNodeType.EndElement, xmlReader.NodeType, "#5-2"); } [Test] @@ -1618,7 +1617,7 @@ namespace MonoTests.System.Xml void ReadToDescendant2 (XmlReader xmlReader) { // make sure that it works when the reader is at Initial state. - Assert (xmlReader.ReadToDescendant ("root")); + Assert.IsTrue (xmlReader.ReadToDescendant ("root")); } [Test] @@ -1630,12 +1629,12 @@ namespace MonoTests.System.Xml public void ReadToFollowing (XmlReader xmlReader) { - Assert ("#1", xmlReader.ReadToFollowing ("bar")); - Assert ("#2", xmlReader.ReadToFollowing ("bar")); - AssertEquals ("#2-2", 2, xmlReader.Depth); - Assert ("#3", xmlReader.ReadToFollowing ("bar")); - AssertEquals ("#3-2", 3, xmlReader.Depth); - Assert ("#4", !xmlReader.ReadToFollowing ("bar")); + Assert.IsTrue (xmlReader.ReadToFollowing ("bar"), "#1"); + Assert.IsTrue (xmlReader.ReadToFollowing ("bar"), "#2"); + Assert.AreEqual (2, xmlReader.Depth, "#2-2"); + Assert.IsTrue (xmlReader.ReadToFollowing ("bar"), "#3"); + Assert.AreEqual (3, xmlReader.Depth, "#3-2"); + Assert.IsTrue (!xmlReader.ReadToFollowing ("bar"), "#4"); } [Test] @@ -1648,8 +1647,8 @@ namespace MonoTests.System.Xml void ReadToNextSiblingAtInitialState (XmlReader xmlReader) { - Assert ("#1", !xmlReader.ReadToNextSibling ("bar")); - Assert ("#2", !xmlReader.ReadToNextSibling ("root")); + Assert.IsTrue (!xmlReader.ReadToNextSibling ("bar"), "#1"); + Assert.IsTrue (!xmlReader.ReadToNextSibling ("root"), "#2"); } [Test] @@ -1665,16 +1664,16 @@ namespace MonoTests.System.Xml xmlReader.Read (); // root xmlReader.Read (); // foo - Assert ("#3", xmlReader.ReadToNextSibling ("bar")); + Assert.IsTrue (xmlReader.ReadToNextSibling ("bar"), "#3"); - AssertEquals ("#3-2", "value", xmlReader.GetAttribute ("attr")); + Assert.AreEqual ("value", xmlReader.GetAttribute ("attr"), "#3-2"); xmlReader.Read (); // foo xmlReader.Read (); // pooh - Assert ("#4", xmlReader.ReadToNextSibling ("bar")); - Assert ("#4-2", !xmlReader.IsEmptyElement); - Assert ("#5", xmlReader.ReadToNextSibling ("bar")); - Assert ("#5-2", xmlReader.IsEmptyElement); - Assert ("#6", xmlReader.Read ()); // /foo + Assert.IsTrue (xmlReader.ReadToNextSibling ("bar"), "#4"); + Assert.IsTrue (!xmlReader.IsEmptyElement, "#4-2"); + Assert.IsTrue (xmlReader.ReadToNextSibling ("bar"), "#5"); + Assert.IsTrue (xmlReader.IsEmptyElement, "#5-2"); + Assert.IsTrue (xmlReader.Read (), "#6"); // /foo AssertNodeValues ("#7", xmlReader, XmlNodeType.EndElement, @@ -1703,12 +1702,12 @@ namespace MonoTests.System.Xml r.MoveToContent (); // ->root r.Read (); // root->baz r.Read (); // baz->bar - Assert ("#1", r.ReadToNextSibling ("foo")); - AssertEquals ("#2", "value2", r.GetAttribute ("attr")); + Assert.IsTrue (r.ReadToNextSibling ("foo"), "#1"); + Assert.AreEqual ("value2", r.GetAttribute ("attr"), "#2"); r.Read (); // foo[@value='value2']->bar - Assert ("#3", !r.ReadToNextSibling ("foo")); - AssertEquals ("#4", XmlNodeType.EndElement, r.NodeType); - AssertEquals ("#5", "foo", r.LocalName); + Assert.IsTrue (!r.ReadToNextSibling ("foo"), "#3"); + Assert.AreEqual (XmlNodeType.EndElement, r.NodeType, "#4"); + Assert.AreEqual ("foo", r.LocalName, "#5"); } // bug #347768 @@ -1752,7 +1751,7 @@ namespace MonoTests.System.Xml 0, // AttributeCount false); // HasAttributes */ - AssertEquals ("#1", XmlNodeType.None, st.NodeType); + Assert.AreEqual (XmlNodeType.None, st.NodeType, "#1"); st.Read (); AssertNodeValues ("#2", st, @@ -1768,7 +1767,7 @@ namespace MonoTests.System.Xml 0, // AttributeCount false); // HasAttributes - Assert ("#3", !st.Read ()); + Assert.IsTrue (!st.Read (), "#3"); // At this state, reader is not positioned on yet AssertNodeValues ("#3-2", reader, @@ -1841,7 +1840,7 @@ namespace MonoTests.System.Xml 0, // AttributeCount false); // HasAttributes - Assert ("#7", !st.Read ()); + Assert.IsTrue (!st.Read (), "#7"); } [Test] @@ -1852,7 +1851,7 @@ namespace MonoTests.System.Xml xr = XmlReader.Create (new StringReader (xml1)); xr.Read (); - AssertEquals ("#1", "1", xr.ReadElementContentAsString ()); + Assert.AreEqual ("1", xr.ReadElementContentAsString (), "#1"); AssertNodeValues ("#1-2", xr, XmlNodeType.None, @@ -1870,20 +1869,20 @@ namespace MonoTests.System.Xml xr = XmlReader.Create (new StringReader (xml1)); xr.Read (); // this XmlReader has no schema, thus the value is untyped - AssertEquals ("#2", "1", xr.ReadElementContentAsObject ()); + Assert.AreEqual ("1", xr.ReadElementContentAsObject (), "#2"); xr = XmlReader.Create (new StringReader (xml1)); xr.Read (); xr.Read (); - AssertEquals ("#3", "1", xr.ReadContentAsString ()); + Assert.AreEqual ("1", xr.ReadContentAsString (), "#3"); xr = XmlReader.Create (new StringReader (xml1)); xr.Read (); - AssertEquals ("#4", 1, xr.ReadElementContentAsInt ()); + Assert.AreEqual (1, xr.ReadElementContentAsInt (), "#4"); xr = XmlReader.Create (new StringReader (xml1)); xr.Read (); - AssertEquals ("#5", 1, xr.ReadElementContentAs (typeof (int), null)); + Assert.AreEqual (1, xr.ReadElementContentAs (typeof (int), null), "#5"); } [Test] @@ -1906,21 +1905,20 @@ namespace MonoTests.System.Xml xr = XmlReader.Create (new StringReader (xml1)); xr.Read (); // this XmlReader has no schema, thus the value is untyped - AssertEquals ("#1", "2006-01-02T03:04:56", - xr.ReadElementContentAsString ()); + Assert.AreEqual ("2006-01-02T03:04:56", xr.ReadElementContentAsString (), "#1"); xr = XmlReader.Create (new StringReader (xml1)); xr.Read (); xr.Read (); - AssertEquals ("#2", time, xr.ReadContentAsDateTime ()); + Assert.AreEqual (time, xr.ReadContentAsDateTime (), "#2"); xr = XmlReader.Create (new StringReader (xml1)); xr.Read (); - AssertEquals ("#3", time, xr.ReadElementContentAsDateTime ()); + Assert.AreEqual (time, xr.ReadElementContentAsDateTime (), "#3"); xr = XmlReader.Create (new StringReader (xml1)); xr.Read (); - AssertEquals ("#4", time, xr.ReadElementContentAs (typeof (DateTime), null)); + Assert.AreEqual (time, xr.ReadElementContentAs (typeof (DateTime), null), "#4"); } [Test] @@ -1943,10 +1941,9 @@ namespace MonoTests.System.Xml typeof (XmlQualifiedName), null); // without IXmlNamespaceResolver, it still resolves // x:el as valid QName. - AssertNotNull ("#1", o); + Assert.IsNotNull (o, "#1"); XmlQualifiedName q = o as XmlQualifiedName; - AssertEquals ("#2 : " + o.GetType (), - new XmlQualifiedName ("el", "urn:foo"), q); + Assert.AreEqual (new XmlQualifiedName ("el", "urn:foo"), q, "#2 : " + o.GetType ()); } [Test] @@ -1965,7 +1962,7 @@ namespace MonoTests.System.Xml xr.Read (); xr.Read (); xr.Read (); - AssertEquals (String.Empty, xr.ReadContentAsString ()); // does not fail, unlike at Element! + Assert.AreEqual (String.Empty, xr.ReadContentAsString ()); // does not fail, unlike at Element! } [Test] @@ -1973,7 +1970,7 @@ namespace MonoTests.System.Xml { XmlReader xr = XmlReader.Create (new StringReader ("test")); xr.Read (); - AssertEquals (String.Empty, xr.ReadContentAsString ()); + Assert.AreEqual (String.Empty, xr.ReadContentAsString ()); } [Test] @@ -1982,7 +1979,7 @@ namespace MonoTests.System.Xml { XmlReader xr = XmlReader.Create (new StringReader ("test")); xr.Read (); - AssertEquals (XmlNodeType.ProcessingInstruction, xr.NodeType); + Assert.AreEqual (XmlNodeType.ProcessingInstruction, xr.NodeType); xr.ReadElementContentAsString (); } @@ -2005,8 +2002,8 @@ namespace MonoTests.System.Xml xr.Read (); xr.Read (); // from Text "123" string s = xr.ReadContentAsString (); - AssertEquals ("#1", "123", s); - AssertEquals ("#2", XmlNodeType.Element, xr.NodeType); + Assert.AreEqual ("123", s, "#1"); + Assert.AreEqual (XmlNodeType.Element, xr.NodeType, "#2"); } [Test] @@ -2015,10 +2012,8 @@ namespace MonoTests.System.Xml XmlTextReader r = new XmlTextReader ( "", XmlNodeType.Document, null); r.Read (); - AssertEquals ("#1", - String.Empty, r.ReadElementContentAsString ()); - AssertEquals ("#2", - XmlNodeType.None, r.NodeType); + Assert.AreEqual (String.Empty, r.ReadElementContentAsString (), "#1"); + Assert.AreEqual (XmlNodeType.None, r.NodeType, "#2"); } [Test] @@ -2029,18 +2024,14 @@ namespace MonoTests.System.Xml XmlTextReader r = new XmlTextReader ( "", XmlNodeType.Document, null); r.Read (); - AssertEquals ("#1", - String.Empty, r.ReadElementContentAs (typeof (object), null)); - AssertEquals ("#2", - XmlNodeType.None, r.NodeType); + Assert.AreEqual (String.Empty, r.ReadElementContentAs (typeof (object), null), "#1"); + Assert.AreEqual (XmlNodeType.None, r.NodeType, "#2"); // regardless of its value, the return value is string. r = new XmlTextReader ("1", XmlNodeType.Document, null); r.Read (); - AssertEquals ("#3", - "1", r.ReadElementContentAs (typeof (object), null)); - AssertEquals ("#4", - XmlNodeType.None, r.NodeType); + Assert.AreEqual ("1", r.ReadElementContentAs (typeof (object), null), "#3"); + Assert.AreEqual (XmlNodeType.None, r.NodeType, "#4"); } [Test] @@ -2053,8 +2044,8 @@ namespace MonoTests.System.Xml void ReadContentStringOnAttribute (XmlReader reader) { reader.Read (); - Assert (reader.MoveToAttribute ("id")); - AssertEquals ("myId", reader.ReadContentAsString ()); + Assert.IsTrue (reader.MoveToAttribute ("id")); + Assert.AreEqual ("myId", reader.ReadContentAsString ()); } [Test] @@ -2068,8 +2059,8 @@ namespace MonoTests.System.Xml { reader.MoveToContent (); reader.Read (); - AssertEquals (String.Empty, reader.ReadElementContentAsString ("sample", "")); - AssertEquals (XmlNodeType.EndElement, reader.NodeType); + Assert.AreEqual (String.Empty, reader.ReadElementContentAsString ("sample", "")); + Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType); } [Test] @@ -2086,8 +2077,8 @@ namespace MonoTests.System.Xml XmlReader sub = reader.ReadSubtree (); sub.ReadToDescendant ("item"); sub.Close (); - AssertEquals ("#1", XmlNodeType.EndElement, reader.NodeType); - AssertEquals ("#2", "item-list", reader.Name); + Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "#1"); + Assert.AreEqual ("item-list", reader.Name, "#2"); } [Test] @@ -2117,10 +2108,10 @@ namespace MonoTests.System.Xml XmlReader r = XmlReader.Create (new StringReader (xml)); r.Read (); XmlReader s = r.ReadSubtree (); - Assert ("#1", s.Read ()); - AssertEquals ("#2", XmlNodeType.Element, s.NodeType); - Assert ("#3", !s.Read ()); - AssertEquals ("#4", XmlNodeType.None, s.NodeType); + Assert.IsTrue (s.Read (), "#1"); + Assert.AreEqual (XmlNodeType.Element, s.NodeType, "#2"); + Assert.IsTrue (!s.Read (), "#3"); + Assert.AreEqual (XmlNodeType.None, s.NodeType, "#4"); } [Test] @@ -2135,14 +2126,14 @@ namespace MonoTests.System.Xml r2.Read (); XmlReader r3 = r2.ReadSubtree (); r2.MoveToFirstAttribute (); - Assert ("#1", !r.IsEmptyElement); - Assert ("#2", !r2.IsEmptyElement); + Assert.IsTrue (!r.IsEmptyElement, "#1"); + Assert.IsTrue (!r2.IsEmptyElement, "#2"); r3.Close (); - Assert ("#3", r.IsEmptyElement); - Assert ("#4", r2.IsEmptyElement); + Assert.IsTrue (r.IsEmptyElement, "#3"); + Assert.IsTrue (r2.IsEmptyElement, "#4"); r2.Close (); - Assert ("#5", r.IsEmptyElement); - Assert ("#6", r2.IsEmptyElement); + Assert.IsTrue (r.IsEmptyElement, "#5"); + Assert.IsTrue (r2.IsEmptyElement, "#6"); } [Test] @@ -2163,11 +2154,11 @@ namespace MonoTests.System.Xml xmlReader.ReadStartElement (); readBytes = xmlReader.ReadContentAsBase64 (buffer, 0, buffer.Length); - AssertEquals ("#1", 24, readBytes); - AssertEquals ("#2", 0, xmlReader.ReadContentAsBase64 (buffer, 0, buffer.Length)); + Assert.AreEqual (24, readBytes, "#1"); + Assert.AreEqual (0, xmlReader.ReadContentAsBase64 (buffer, 0, buffer.Length), "#2"); StringWriter sw = new StringWriter (); foreach (byte b in buffer) sw.Write ("{0:X02}", b); - AssertEquals ("#3", "000102030405060708090A0B0C0D0E0F1011121314151617", sw.ToString ()); + Assert.AreEqual ("000102030405060708090A0B0C0D0E0F1011121314151617", sw.ToString (), "#3"); } [Test] @@ -2183,9 +2174,9 @@ namespace MonoTests.System.Xml const int bufferLength = 1024; byte [] buffer = new byte [bufferLength]; readerXml.ReadContentAsBase64 (buffer, 0, bufferLength); - AssertEquals ("#1", XmlNodeType.EndElement, readerXml.NodeType); + Assert.AreEqual (XmlNodeType.EndElement, readerXml.NodeType, "#1"); readerXml.Read (); - AssertEquals ("#2", XmlNodeType.Element, readerXml.NodeType); + Assert.AreEqual (XmlNodeType.Element, readerXml.NodeType, "#2"); } } #endif diff --git a/mcs/class/System.XML/Test/System.Xml/XmlReaderSettingsTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlReaderSettingsTests.cs index 82303051514..33115994bca 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlReaderSettingsTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlReaderSettingsTests.cs @@ -22,7 +22,7 @@ using AssertType = NUnit.Framework.Assert; namespace MonoTests.System.Xml { [TestFixture] - public class XmlReaderSettingsTests : Assertion + public class XmlReaderSettingsTests { public Stream CreateStream (string xml) { @@ -33,29 +33,28 @@ namespace MonoTests.System.Xml public void DefaultValue () { XmlReaderSettings s = new XmlReaderSettings (); - AssertEquals ("CheckCharacters", true, s.CheckCharacters); - AssertEquals ("ConformanceLevel", ConformanceLevel.Document, - s.ConformanceLevel); - AssertEquals ("ValidationType", ValidationType.None, s.ValidationType); - AssertEquals ("IgnoreComments", false, s.IgnoreComments); - Assert ("ProcessInlineSchema", 0 == (s.ValidationFlags & - ValidationFlags.ProcessInlineSchema)); - AssertEquals ("IgnorePI", false, s.IgnoreProcessingInstructions); - Assert ("ProcessSchemaLocation", 0 == (s.ValidationFlags & - ValidationFlags.ProcessSchemaLocation)); - Assert ("ReportValidationWarnings", 0 == (s.ValidationFlags & - ValidationFlags.ReportValidationWarnings)); - Assert ("ProcessIdentityConstraints", 0 != (s.ValidationFlags & - ValidationFlags.ProcessIdentityConstraints)); + Assert.AreEqual (true, s.CheckCharacters, "CheckCharacters"); + Assert.AreEqual (ConformanceLevel.Document, s.ConformanceLevel, "ConformanceLevel"); + Assert.AreEqual (ValidationType.None, s.ValidationType, "ValidationType"); + Assert.AreEqual (false, s.IgnoreComments, "IgnoreComments"); + Assert.IsTrue (0 == (s.ValidationFlags & + ValidationFlags.ProcessInlineSchema), "ProcessInlineSchema"); + Assert.AreEqual (false, s.IgnoreProcessingInstructions, "IgnorePI"); + Assert.IsTrue (0 == (s.ValidationFlags & + ValidationFlags.ProcessSchemaLocation), "ProcessSchemaLocation"); + Assert.IsTrue (0 == (s.ValidationFlags & + ValidationFlags.ReportValidationWarnings), "ReportValidationWarnings"); + Assert.IsTrue (0 != (s.ValidationFlags & + ValidationFlags.ProcessIdentityConstraints), "ProcessIdentityConstraints"); // No one should use this flag BTW if someone wants // code to be conformant to W3C XML Schema standard. - Assert ("AllowXmlAttributes", 0 != (s.ValidationFlags & - ValidationFlags.AllowXmlAttributes)); - AssertEquals ("IgnoreWhitespace", false, s.IgnoreWhitespace); - AssertEquals ("LineNumberOffset", 0, s.LineNumberOffset); - AssertEquals ("LinePositionOffset", 0, s.LinePositionOffset); - AssertNull ("NameTable", s.NameTable); - AssertEquals ("Schemas.Count", 0, s.Schemas.Count); + Assert.IsTrue (0 != (s.ValidationFlags & + ValidationFlags.AllowXmlAttributes), "AllowXmlAttributes"); + Assert.AreEqual (false, s.IgnoreWhitespace, "IgnoreWhitespace"); + Assert.AreEqual (0, s.LineNumberOffset, "LineNumberOffset"); + Assert.AreEqual (0, s.LinePositionOffset, "LinePositionOffset"); + Assert.IsNull (s.NameTable, "NameTable"); + Assert.AreEqual (0, s.Schemas.Count, "Schemas.Count"); } [Test] @@ -94,10 +93,10 @@ namespace MonoTests.System.Xml sr, settings); xtr.Read (); xtr.MoveToFirstAttribute (); - AssertEquals (" value ", xtr.Value); + Assert.AreEqual (" value ", xtr.Value); xtr.Read (); // Text string is normalized - AssertEquals ("test\nstring", xtr.Value); + Assert.AreEqual ("test\nstring", xtr.Value); } [Test] @@ -116,9 +115,9 @@ namespace MonoTests.System.Xml settings.CheckCharacters = false; xtr.Read (); xtr.MoveToFirstAttribute (); - AssertEquals ("\0", xtr.Value); + Assert.AreEqual ("\0", xtr.Value); xtr.Read (); - AssertEquals ("\0", xtr.Value); + Assert.AreEqual ("\0", xtr.Value); } // Hmm, does it really make sense? :-/ @@ -143,16 +142,16 @@ namespace MonoTests.System.Xml // But it won't work against XmlNodeReader. xr.Read (); xr.MoveToFirstAttribute (); - AssertEquals ("\0", xr.Value); + Assert.AreEqual ("\0", xr.Value); xr.Read (); - AssertEquals ("\0", xr.Value); + Assert.AreEqual ("\0", xr.Value); } [Test] public void CreateAndSettings () { - AssertNotNull (XmlReader.Create (CreateStream ("")).Settings); - AssertNotNull (XmlReader.Create ("Test/XmlFiles/simple.xml").Settings); + Assert.IsNotNull (XmlReader.Create (CreateStream ("")).Settings); + Assert.IsNotNull (XmlReader.Create ("Test/XmlFiles/simple.xml").Settings); } [Test] @@ -387,9 +386,9 @@ namespace MonoTests.System.Xml r.Read (); r.Read (); // not EntityReference but Text - AssertEquals ("#1", XmlNodeType.Text, r.NodeType); + Assert.AreEqual (XmlNodeType.Text, r.NodeType, "#1"); r.Read (); - AssertEquals ("#2", XmlNodeType.EndElement, r.NodeType); + Assert.AreEqual (XmlNodeType.EndElement, r.NodeType, "#2"); } public class XmlResolver81000 : XmlResolver @@ -411,14 +410,14 @@ namespace MonoTests.System.Xml XmlReader r = XmlReader.Create (new StringReader (xml), s); r.Read (); r.Read (); - AssertEquals (String.Empty, r.Value); // should not be at the comment node. + Assert.AreEqual (String.Empty, r.Value); // should not be at the comment node. } [Test] public void CreateSetsBaseUri () // bug #392385 { XmlReader r = XmlReader.Create (new StringReader (""), new XmlReaderSettings (), "urn:foo"); - AssertEquals ("urn:foo", r.BaseURI); + Assert.AreEqual ("urn:foo", r.BaseURI); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlSignificantWhitespaceTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlSignificantWhitespaceTests.cs index 31383fcdaac..7d631df30b6 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlSignificantWhitespaceTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlSignificantWhitespaceTests.cs @@ -17,7 +17,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlSignificantWhitespaceTests : Assertion + public class XmlSignificantWhitespaceTests { XmlDocument document; XmlDocument doc2; @@ -43,8 +43,8 @@ namespace MonoTests.System.Xml public void InnerAndOuterXml () { whitespace = doc2.CreateSignificantWhitespace ("\r\n\t "); - AssertEquals (String.Empty, whitespace.InnerXml); - AssertEquals ("\r\n\t ", whitespace.OuterXml); + Assert.AreEqual (String.Empty, whitespace.InnerXml); + Assert.AreEqual ("\r\n\t ", whitespace.OuterXml); } [Test] @@ -52,21 +52,20 @@ namespace MonoTests.System.Xml { string val = "\t\t\r\n "; whitespace = doc2.CreateSignificantWhitespace (val); - AssertEquals ("#DataValue.1", val, whitespace.Data); - AssertEquals ("#DataValue.2", val, whitespace.Value); + Assert.AreEqual (val, whitespace.Data, "#DataValue.1"); + Assert.AreEqual (val, whitespace.Value, "#DataValue.2"); whitespace.Value = val + "\t"; - AssertEquals ("#DataValue.3", val + "\t", whitespace.Data); + Assert.AreEqual (val + "\t", whitespace.Data, "#DataValue.3"); } internal void XmlNodeBaseProperties (XmlNode original, XmlNode cloned) { // assertequals (original.nodetype + " was incorrectly cloned.", // original.baseuri, cloned.baseuri); - AssertNull (cloned.ParentNode); - AssertEquals ("Value incorrectly cloned", - cloned.Value, original.Value); + Assert.IsNull (cloned.ParentNode); + Assert.AreEqual (cloned.Value, original.Value, "Value incorrectly cloned"); - Assert ("Copies, not pointers", !Object.ReferenceEquals (original,cloned)); + Assert.IsTrue (!Object.ReferenceEquals (original, cloned), "Copies, not pointers"); } [Test] @@ -79,43 +78,38 @@ namespace MonoTests.System.Xml return; } catch (Exception) { - Fail ("Incorrect Exception thrown."); + Assert.Fail ("Incorrect Exception thrown."); } } [Test] public void XmlSignificantWhitespaceConstructor () { - AssertEquals ("whitespace char didn't get copied right", - "\r\n", whitespace.Data); + Assert.AreEqual ("\r\n", whitespace.Data, "whitespace char didn't get copied right"); } [Test] public void XmlSignificantWhitespaceName () { - AssertEquals (whitespace.NodeType + " Name property broken", - whitespace.Name, "#significant-whitespace"); + Assert.AreEqual (whitespace.Name, "#significant-whitespace", whitespace.NodeType + " Name property broken"); } [Test] public void XmlSignificantWhitespaceLocalName () { - AssertEquals (whitespace.NodeType + " LocalName property broken", - whitespace.LocalName, "#significant-whitespace"); + Assert.AreEqual (whitespace.LocalName, "#significant-whitespace", whitespace.NodeType + " LocalName property broken"); } [Test] public void XmlSignificantWhitespaceNodeType () { - AssertEquals ("XmlSignificantWhitespace NodeType property broken", - whitespace.NodeType.ToString (), "SignificantWhitespace"); + Assert.AreEqual (whitespace.NodeType.ToString (), "SignificantWhitespace", "XmlSignificantWhitespace NodeType property broken"); } [Test] public void XmlSignificantWhitespaceIsReadOnly () { - AssertEquals ("XmlSignificantWhitespace IsReadOnly property broken", - whitespace.IsReadOnly, false); + Assert.AreEqual (whitespace.IsReadOnly, false, "XmlSignificantWhitespace IsReadOnly property broken"); } [Test] @@ -129,8 +123,7 @@ namespace MonoTests.System.Xml deep = whitespace.CloneNode (true); // deep XmlNodeBaseProperties (original, deep); - AssertEquals ("deep cloning differs from shallow cloning", - deep.OuterXml, shallow.OuterXml); + Assert.AreEqual (deep.OuterXml, shallow.OuterXml, "deep cloning differs from shallow cloning"); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlTextReaderTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlTextReaderTests.cs index 32149858398..0f708e88cc9 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlTextReaderTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlTextReaderTests.cs @@ -18,14 +18,14 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlTextReaderTests : Assertion + public class XmlTextReaderTests { private void AssertStartDocument (XmlReader xmlReader) { - Assert (xmlReader.ReadState == ReadState.Initial); - Assert (xmlReader.NodeType == XmlNodeType.None); - Assert (xmlReader.Depth == 0); - Assert (!xmlReader.EOF); + Assert.IsTrue (xmlReader.ReadState == ReadState.Initial); + Assert.IsTrue (xmlReader.NodeType == XmlNodeType.None); + Assert.IsTrue (xmlReader.Depth == 0); + Assert.IsTrue (!xmlReader.EOF); } private void AssertNode ( @@ -40,9 +40,9 @@ namespace MonoTests.System.Xml string value, int attributeCount) { - Assert ("#Read", xmlReader.Read ()); - Assert ("#ReadState", xmlReader.ReadState == ReadState.Interactive); - Assert (!xmlReader.EOF); + Assert.IsTrue (xmlReader.Read (), "#Read"); + Assert.IsTrue (xmlReader.ReadState == ReadState.Interactive, "#ReadState"); + Assert.IsTrue (!xmlReader.EOF); AssertNodeValues (xmlReader, nodeType, depth, isEmptyElement, name, prefix, localName, namespaceURI, value, attributeCount); } @@ -58,25 +58,25 @@ namespace MonoTests.System.Xml string value, int attributeCount) { - AssertEquals ("NodeType", nodeType, xmlReader.NodeType); - AssertEquals ("Depth", depth, xmlReader.Depth); - AssertEquals ("IsEmptyElement", isEmptyElement, xmlReader.IsEmptyElement); + Assert.AreEqual (nodeType, xmlReader.NodeType, "NodeType"); + Assert.AreEqual (depth, xmlReader.Depth, "Depth"); + Assert.AreEqual (isEmptyElement, xmlReader.IsEmptyElement, "IsEmptyElement"); - AssertEquals ("name", name, xmlReader.Name); + Assert.AreEqual (name, xmlReader.Name, "name"); - AssertEquals ("prefix", prefix, xmlReader.Prefix); + Assert.AreEqual (prefix, xmlReader.Prefix, "prefix"); - AssertEquals ("localName", localName, xmlReader.LocalName); + Assert.AreEqual (localName, xmlReader.LocalName, "localName"); - AssertEquals ("namespaceURI", namespaceURI, xmlReader.NamespaceURI); + Assert.AreEqual (namespaceURI, xmlReader.NamespaceURI, "namespaceURI"); - AssertEquals ("hasValue", (value != String.Empty), xmlReader.HasValue); + Assert.AreEqual ((value != String.Empty), xmlReader.HasValue, "hasValue"); - AssertEquals ("Value", value, xmlReader.Value); + Assert.AreEqual (value, xmlReader.Value, "Value"); - AssertEquals ("hasAttributes", attributeCount > 0, xmlReader.HasAttributes); + Assert.AreEqual (attributeCount > 0, xmlReader.HasAttributes, "hasAttributes"); - AssertEquals ("attributeCount", attributeCount, xmlReader.AttributeCount); + Assert.AreEqual (attributeCount, xmlReader.AttributeCount, "attributeCount"); } private void AssertAttribute ( @@ -87,26 +87,26 @@ namespace MonoTests.System.Xml string namespaceURI, string value) { - AssertEquals ("value.Indexer", value, xmlReader [name]); + Assert.AreEqual (value, xmlReader [name], "value.Indexer"); - AssertEquals ("value.GetAttribute", value, xmlReader.GetAttribute (name)); + Assert.AreEqual (value, xmlReader.GetAttribute (name), "value.GetAttribute"); if (namespaceURI != String.Empty) { - Assert (xmlReader[localName, namespaceURI] == value); - Assert (xmlReader.GetAttribute (localName, namespaceURI) == value); + Assert.IsTrue (xmlReader[localName, namespaceURI] == value); + Assert.IsTrue (xmlReader.GetAttribute (localName, namespaceURI) == value); } } private void AssertEndDocument (XmlReader xmlReader) { - Assert ("could read", !xmlReader.Read ()); - AssertEquals ("NodeType is not XmlNodeType.None", XmlNodeType.None, xmlReader.NodeType); - AssertEquals ("Depth is not 0", 0, xmlReader.Depth); - AssertEquals ("ReadState is not ReadState.EndOfFile", ReadState.EndOfFile, xmlReader.ReadState); - Assert ("not EOF", xmlReader.EOF); + Assert.IsTrue (!xmlReader.Read (), "could read"); + Assert.AreEqual (XmlNodeType.None, xmlReader.NodeType, "NodeType is not XmlNodeType.None"); + Assert.AreEqual (0, xmlReader.Depth, "Depth is not 0"); + Assert.AreEqual (ReadState.EndOfFile, xmlReader.ReadState, "ReadState is not ReadState.EndOfFile"); + Assert.IsTrue (xmlReader.EOF, "not EOF"); xmlReader.Close (); - AssertEquals ("ReadState is not ReadState.Cosed", ReadState.Closed, xmlReader.ReadState); + Assert.AreEqual (ReadState.Closed, xmlReader.ReadState, "ReadState is not ReadState.Cosed"); } [Test] @@ -172,7 +172,7 @@ namespace MonoTests.System.Xml caughtXmlException = true; } - Assert(caughtXmlException); + Assert.IsTrue (caughtXmlException); } [Test] @@ -317,7 +317,7 @@ namespace MonoTests.System.Xml "http://foo/" // value ); - AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo")); + Assert.AreEqual ("http://foo/", xmlReader.LookupNamespace ("foo")); AssertEndDocument (xmlReader); } @@ -359,17 +359,17 @@ namespace MonoTests.System.Xml [Test] public void IsName () { - Assert (XmlReader.IsName ("foo")); - Assert (!XmlReader.IsName ("1foo")); - Assert (!XmlReader.IsName (" foo")); + Assert.IsTrue (XmlReader.IsName ("foo")); + Assert.IsTrue (!XmlReader.IsName ("1foo")); + Assert.IsTrue (!XmlReader.IsName (" foo")); } [Test] public void IsNameToken () { - Assert (XmlReader.IsNameToken ("foo")); - Assert (XmlReader.IsNameToken ("1foo")); - Assert (!XmlReader.IsNameToken (" foo")); + Assert.IsTrue (XmlReader.IsNameToken ("foo")); + Assert.IsTrue (XmlReader.IsNameToken ("1foo")); + Assert.IsTrue (!XmlReader.IsNameToken (" foo")); } [Test] @@ -405,7 +405,7 @@ namespace MonoTests.System.Xml XmlReader xmlReader = new XmlTextReader (new StringReader (xml)); xmlReader.Read (); - AssertEquals ("hello & world", xmlReader ["value"]); + Assert.AreEqual ("hello & world", xmlReader ["value"]); } [Test] @@ -417,19 +417,19 @@ namespace MonoTests.System.Xml xmlReader.Read (); xmlReader.MoveToFirstAttribute (); xmlReader.ReadAttributeValue (); - AssertEquals ("hello ", xmlReader.Value); - Assert (xmlReader.ReadAttributeValue ()); - AssertEquals (XmlNodeType.EntityReference, xmlReader.NodeType); - AssertEquals ("ent", xmlReader.Name); - AssertEquals (XmlNodeType.EntityReference, xmlReader.NodeType); - Assert (xmlReader.ReadAttributeValue ()); - AssertEquals (" world", xmlReader.Value); - AssertEquals (XmlNodeType.Text, xmlReader.NodeType); - Assert (!xmlReader.ReadAttributeValue ()); - AssertEquals (" world", xmlReader.Value); // remains - AssertEquals (XmlNodeType.Text, xmlReader.NodeType); + Assert.AreEqual ("hello ", xmlReader.Value); + Assert.IsTrue (xmlReader.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.EntityReference, xmlReader.NodeType); + Assert.AreEqual ("ent", xmlReader.Name); + Assert.AreEqual (XmlNodeType.EntityReference, xmlReader.NodeType); + Assert.IsTrue (xmlReader.ReadAttributeValue ()); + Assert.AreEqual (" world", xmlReader.Value); + Assert.AreEqual (XmlNodeType.Text, xmlReader.NodeType); + Assert.IsTrue (!xmlReader.ReadAttributeValue ()); + Assert.AreEqual (" world", xmlReader.Value); // remains + Assert.AreEqual (XmlNodeType.Text, xmlReader.NodeType); xmlReader.ReadAttributeValue (); - AssertEquals (XmlNodeType.Text, xmlReader.NodeType); + Assert.AreEqual (XmlNodeType.Text, xmlReader.NodeType); } [Test] @@ -440,11 +440,11 @@ namespace MonoTests.System.Xml new XmlTextReader (new StringReader (xml)); xmlReader.Read (); xmlReader.MoveToFirstAttribute (); - AssertEquals ("First", '\'', xmlReader.QuoteChar); + Assert.AreEqual ('\'', xmlReader.QuoteChar, "First"); xmlReader.MoveToNextAttribute (); - AssertEquals ("Next", '"', xmlReader.QuoteChar); + Assert.AreEqual ('"', xmlReader.QuoteChar, "Next"); xmlReader.MoveToFirstAttribute (); - AssertEquals ("First.Again", '\'', xmlReader.QuoteChar); + Assert.AreEqual ('\'', xmlReader.QuoteChar, "First.Again"); } [Test] @@ -453,9 +453,9 @@ namespace MonoTests.System.Xml // This behavior is different from XmlNodeReader. XmlReader reader = new XmlTextReader (new StringReader ("test of mixed string.")); reader.ReadInnerXml (); - AssertEquals ("initial.ReadState", ReadState.Initial, reader.ReadState); - AssertEquals ("initial.EOF", false, reader.EOF); - AssertEquals ("initial.NodeType", XmlNodeType.None, reader.NodeType); + Assert.AreEqual (ReadState.Initial, reader.ReadState, "initial.ReadState"); + Assert.AreEqual (false, reader.EOF, "initial.EOF"); + Assert.AreEqual (XmlNodeType.None, reader.NodeType, "initial.NodeType"); } [Test] @@ -716,8 +716,8 @@ namespace MonoTests.System.Xml XmlDocument doc = new XmlDocument (); doc.LoadXml (xml); XmlEntity foo = doc.DocumentType.Entities.GetNamedItem ("foo") as XmlEntity; - AssertNotNull (foo); - AssertEquals ("foo-def", foo.InnerText); + Assert.IsNotNull (foo); + Assert.AreEqual ("foo-def", foo.InnerText); } [Test] @@ -740,17 +740,17 @@ namespace MonoTests.System.Xml xtr.Read (); // foo this.AssertNodeValues (xtr, XmlNodeType.Element, 1, false, "foo", String.Empty, "foo", String.Empty, String.Empty, 0); - AssertEquals (6, xtr.ReadBase64 (bytes2, 0, 10)); + Assert.AreEqual (6, xtr.ReadBase64 (bytes2, 0, 10)); this.AssertNodeValues (xtr, XmlNodeType.EndElement, 0, false, "root", String.Empty, "root", String.Empty, String.Empty, 0); - Assert (!xtr.Read ()); - AssertEquals (4, bytes2 [0]); - AssertEquals (14, bytes2 [1]); - AssertEquals (54, bytes2 [2]); - AssertEquals (114, bytes2 [3]); - AssertEquals (134, bytes2 [4]); - AssertEquals (184, bytes2 [5]); - AssertEquals (0, bytes2 [6]); + Assert.IsTrue (!xtr.Read ()); + Assert.AreEqual (4, bytes2 [0]); + Assert.AreEqual (14, bytes2 [1]); + Assert.AreEqual (54, bytes2 [2]); + Assert.AreEqual (114, bytes2 [3]); + Assert.AreEqual (134, bytes2 [4]); + Assert.AreEqual (184, bytes2 [5]); + Assert.AreEqual (0, bytes2 [6]); xtr.Close (); xtr = new XmlTextReader (base64, XmlNodeType.Document, null); @@ -761,21 +761,21 @@ namespace MonoTests.System.Xml "foo", String.Empty, String.Empty, 0); // Read less than 4 (i.e. one Base64 block) - AssertEquals (1, xtr.ReadBase64 (bytes2, 0, 1)); + Assert.AreEqual (1, xtr.ReadBase64 (bytes2, 0, 1)); this.AssertNodeValues (xtr, XmlNodeType.Element, 1, false, "foo", String.Empty, "foo", String.Empty, String.Empty, 0); - AssertEquals (4, bytes2 [0]); + Assert.AreEqual (4, bytes2 [0]); - AssertEquals (5, xtr.ReadBase64 (bytes2, 0, 10)); + Assert.AreEqual (5, xtr.ReadBase64 (bytes2, 0, 10)); this.AssertNodeValues (xtr, XmlNodeType.EndElement, 0, false, "root", String.Empty, "root", String.Empty, String.Empty, 0); - Assert (!xtr.Read ()); - AssertEquals (14, bytes2 [0]); - AssertEquals (54, bytes2 [1]); - AssertEquals (114, bytes2 [2]); - AssertEquals (134, bytes2 [3]); - AssertEquals (184, bytes2 [4]); - AssertEquals (0, bytes2 [5]); + Assert.IsTrue (!xtr.Read ()); + Assert.AreEqual (14, bytes2 [0]); + Assert.AreEqual (54, bytes2 [1]); + Assert.AreEqual (114, bytes2 [2]); + Assert.AreEqual (134, bytes2 [3]); + Assert.AreEqual (184, bytes2 [4]); + Assert.AreEqual (0, bytes2 [5]); while (!xtr.EOF) xtr.Read (); xtr.Close (); @@ -839,7 +839,7 @@ namespace MonoTests.System.Xml r.Normalization = true; s = r.ReadElementString ("hi"); - AssertEquals ("One\ntwo\nthree\nfour", s); + Assert.AreEqual ("One\ntwo\nthree\nfour", s); } [Test] @@ -852,7 +852,7 @@ namespace MonoTests.System.Xml xtr.Read (); xtr.Read (); xtr.MoveToFirstAttribute (); - AssertEquals (" value ", xtr.Value); + Assert.AreEqual (" value ", xtr.Value); } [Test] @@ -862,7 +862,7 @@ namespace MonoTests.System.Xml XmlTextReader xtr = new XmlTextReader ( new StringReader ("")); xtr.Close (); - Assert (!xtr.EOF); // Close() != EOF + Assert.IsTrue (!xtr.EOF); // Close() != EOF } [Test] @@ -870,7 +870,7 @@ namespace MonoTests.System.Xml { XmlTextReader xtr = new XmlTextReader ("Test/XmlFiles/simple.xml"); xtr.Close (); - Assert (!xtr.EOF); // Close() != EOF + Assert.IsTrue (!xtr.EOF); // Close() != EOF } [Test] @@ -879,26 +879,26 @@ namespace MonoTests.System.Xml // See bug #63507 XmlTextReader aux = new XmlTextReader ( new StringReader ("")); - AssertEquals (0, aux.LineNumber); - AssertEquals (0, aux.LinePosition); + Assert.AreEqual (0, aux.LineNumber); + Assert.AreEqual (0, aux.LinePosition); aux.MoveToContent(); - AssertEquals (1, aux.LineNumber); - AssertEquals (2, aux.LinePosition); + Assert.AreEqual (1, aux.LineNumber); + Assert.AreEqual (2, aux.LinePosition); aux.Read(); - AssertEquals (1, aux.LineNumber); - AssertEquals (7, aux.LinePosition); + Assert.AreEqual (1, aux.LineNumber); + Assert.AreEqual (7, aux.LinePosition); aux.ReadOuterXml(); - AssertEquals (1, aux.LineNumber); - AssertEquals (22, aux.LinePosition); + Assert.AreEqual (1, aux.LineNumber); + Assert.AreEqual (22, aux.LinePosition); aux.ReadInnerXml(); - AssertEquals (1, aux.LineNumber); - AssertEquals (34, aux.LinePosition); + Assert.AreEqual (1, aux.LineNumber); + Assert.AreEqual (34, aux.LinePosition); aux.Read(); - AssertEquals (1, aux.LineNumber); - AssertEquals (38, aux.LinePosition); + Assert.AreEqual (1, aux.LineNumber); + Assert.AreEqual (38, aux.LinePosition); aux.Close(); - AssertEquals (0, aux.LineNumber); - AssertEquals (0, aux.LinePosition); + Assert.AreEqual (0, aux.LineNumber); + Assert.AreEqual (0, aux.LinePosition); } [Test] @@ -912,7 +912,7 @@ namespace MonoTests.System.Xml XmlValidatingReader xvr = new XmlValidatingReader (xtr); xvr.Read (); xvr.MoveToFirstAttribute (); - AssertEquals (" value string", xvr.Value); + Assert.AreEqual (" value string", xvr.Value); } [Test] @@ -930,7 +930,7 @@ namespace MonoTests.System.Xml public void Settings () { XmlTextReader xtr = new XmlTextReader ("", XmlNodeType.Document, null); - AssertNull (xtr.Settings); + Assert.IsNull (xtr.Settings); } // Copied from XmlValidatingReaderTests.cs @@ -944,15 +944,15 @@ namespace MonoTests.System.Xml dvr.EntityHandling = EntityHandling.ExpandEntities; dvr.Read (); // DTD dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals ("root", dvr.Name); - Assert (dvr.MoveToFirstAttribute ()); - AssertEquals ("foo", dvr.Name); - AssertEquals ("entity string", dvr.Value); - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("bar", dvr.Name); - AssertEquals ("internal entity string value", dvr.Value); - AssertEquals ("entity string", dvr.ReadString ()); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual ("root", dvr.Name); + Assert.IsTrue (dvr.MoveToFirstAttribute ()); + Assert.AreEqual ("foo", dvr.Name); + Assert.AreEqual ("entity string", dvr.Value); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("bar", dvr.Name); + Assert.AreEqual ("internal entity string value", dvr.Value); + Assert.AreEqual ("entity string", dvr.ReadString ()); } [Test] @@ -965,36 +965,36 @@ namespace MonoTests.System.Xml dvr.EntityHandling = EntityHandling.ExpandCharEntities; dvr.Read (); // DTD dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals ("root", dvr.Name); - Assert (dvr.MoveToFirstAttribute ()); - AssertEquals ("foo", dvr.Name); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual ("root", dvr.Name); + Assert.IsTrue (dvr.MoveToFirstAttribute ()); + Assert.AreEqual ("foo", dvr.Name); // MS BUG: it returns "entity string", however, entity should not be exanded. - AssertEquals ("&ent;", dvr.Value); + Assert.AreEqual ("&ent;", dvr.Value); // ReadAttributeValue() - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals ("ent", dvr.Name); - AssertEquals ("", dvr.Value); - Assert (!dvr.ReadAttributeValue ()); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual ("ent", dvr.Name); + Assert.AreEqual ("", dvr.Value); + Assert.IsTrue (!dvr.ReadAttributeValue ()); // bar - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("bar", dvr.Name); - AssertEquals ("internal &ent; value", dvr.Value); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("bar", dvr.Name); + Assert.AreEqual ("internal &ent; value", dvr.Value); // ReadAttributeValue() - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals ("", dvr.Name); - AssertEquals ("internal ", dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals ("ent", dvr.Name); - AssertEquals ("", dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals ("", dvr.Name); - AssertEquals (" value", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual ("", dvr.Name); + Assert.AreEqual ("internal ", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual ("ent", dvr.Name); + Assert.AreEqual ("", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual ("", dvr.Name); + Assert.AreEqual (" value", dvr.Value); } @@ -1034,30 +1034,30 @@ namespace MonoTests.System.Xml dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // &ent; - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals (1, dvr.Depth); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (1, dvr.Depth); dvr.ResolveEntity (); // It is still entity reference. - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); dvr.Read (); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (2, dvr.Depth); - AssertEquals ("entity string", dvr.Value); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (2, dvr.Depth); + Assert.AreEqual ("entity string", dvr.Value); dvr.Read (); - AssertEquals (XmlNodeType.EndEntity, dvr.NodeType); - AssertEquals (1, dvr.Depth); - AssertEquals ("", dvr.Value); + Assert.AreEqual (XmlNodeType.EndEntity, dvr.NodeType); + Assert.AreEqual (1, dvr.Depth); + Assert.AreEqual ("", dvr.Value); dvr.Read (); // &ent2; - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals (1, dvr.Depth); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (1, dvr.Depth); dvr.ResolveEntity (); // It is still entity reference. - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); // It now became element node. dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals (2, dvr.Depth); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual (2, dvr.Depth); } // mostly copied from XmlValidatingReaderTests. @@ -1073,12 +1073,12 @@ namespace MonoTests.System.Xml dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // &ent3; - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); // ent3 does not exists in this dtd. - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); try { dvr.ResolveEntity (); - Fail ("Attempt to resolve undeclared entity should fail."); + Assert.Fail ("Attempt to resolve undeclared entity should fail."); } catch (XmlException) { } } @@ -1097,8 +1097,8 @@ namespace MonoTests.System.Xml r.Read (); r.Read (); r.Read (); - AssertEquals ("#1", 0xf090, (int) r.Value [0]); - AssertEquals ("#1", 0x8080, (int) r.Value [1]); + Assert.AreEqual (0xf090, (int) r.Value [0], "#1"); + Assert.AreEqual (0x8080, (int) r.Value [1], "#1"); } [Test] @@ -1142,7 +1142,7 @@ namespace MonoTests.System.Xml int [] arr = new int [line.Length]; for (int i = 0; i < line.Length; i++) arr [i] = (int) line [i]; - AssertEquals (new int [] {0xd862, 0xddc0}, arr); + Assert.AreEqual (new int [] {0xd862, 0xddc0}, arr); } [Test] @@ -1159,9 +1159,9 @@ namespace MonoTests.System.Xml { string xml = "\n\n\nvalue\n\n"; XmlTextReader xr = new XmlTextReader (xml, XmlNodeType.Document, null); - AssertNull ("#1", xr.Encoding); + Assert.IsNull (xr.Encoding, "#1"); xr.Read (); - AssertEquals ("#2", Encoding.Unicode, xr.Encoding); + Assert.AreEqual (Encoding.Unicode, xr.Encoding, "#2"); } [Test] @@ -1173,21 +1173,21 @@ namespace MonoTests.System.Xml xtr.Read (); // root xtr.Read (); // child. skip whitespaces - AssertEquals ("#1", XmlNodeType.Element, xtr.NodeType); + Assert.AreEqual (XmlNodeType.Element, xtr.NodeType, "#1"); xtr.Read (); // significant whitespaces - AssertEquals ("#2", XmlNodeType.SignificantWhitespace, xtr.NodeType); + Assert.AreEqual (XmlNodeType.SignificantWhitespace, xtr.NodeType, "#2"); xtr.Read (); - AssertEquals ("#3", "descendant", xtr.LocalName); + Assert.AreEqual ("descendant", xtr.LocalName, "#3"); xtr.Read (); // end of descendant. skip whitespaces - AssertEquals ("#4", XmlNodeType.EndElement, xtr.NodeType); + Assert.AreEqual (XmlNodeType.EndElement, xtr.NodeType, "#4"); xtr.Read (); // significant whitespaces - AssertEquals ("#5", XmlNodeType.SignificantWhitespace, xtr.NodeType); + Assert.AreEqual (XmlNodeType.SignificantWhitespace, xtr.NodeType, "#5"); xtr.Read (); // end of child xtr.Read (); // child xtr.Read (); // end of child. skip whitespaces - AssertEquals ("#6", XmlNodeType.EndElement, xtr.NodeType); + Assert.AreEqual (XmlNodeType.EndElement, xtr.NodeType, "#6"); xtr.Read (); // end of root. skip whitespaces - AssertEquals ("#7", XmlNodeType.EndElement, xtr.NodeType); + Assert.AreEqual (XmlNodeType.EndElement, xtr.NodeType, "#7"); } [Test] @@ -1199,17 +1199,17 @@ namespace MonoTests.System.Xml xtr.Read (); // root xtr.Read (); // child. skip whitespaces - AssertEquals ("#1", XmlNodeType.Element, xtr.NodeType); + Assert.AreEqual (XmlNodeType.Element, xtr.NodeType, "#1"); xtr.Read (); // descendant. skip significant whitespaces - AssertEquals ("#2", "descendant", xtr.LocalName); + Assert.AreEqual ("descendant", xtr.LocalName, "#2"); xtr.Read (); // end of descendant. skip whitespaces - AssertEquals ("#3", XmlNodeType.EndElement, xtr.NodeType); + Assert.AreEqual (XmlNodeType.EndElement, xtr.NodeType, "#3"); xtr.Read (); // end of child. skip significant whitespaces xtr.Read (); // child xtr.Read (); // end of child. skip whitespaces - AssertEquals ("#6", XmlNodeType.EndElement, xtr.NodeType); + Assert.AreEqual (XmlNodeType.EndElement, xtr.NodeType, "#6"); xtr.Read (); // end of root. skip whitespaces - AssertEquals ("#7", XmlNodeType.EndElement, xtr.NodeType); + Assert.AreEqual (XmlNodeType.EndElement, xtr.NodeType, "#7"); } [Test] @@ -1220,8 +1220,8 @@ namespace MonoTests.System.Xml XmlNodeType.Element, null); xtr.Read (); - AssertEquals ("#1", XmlNodeType.Whitespace, xtr.NodeType); - AssertEquals ("#2", " ", xtr.Value); + Assert.AreEqual (XmlNodeType.Whitespace, xtr.NodeType, "#1"); + Assert.AreEqual (" ", xtr.Value, "#2"); } // bug #79683 @@ -1248,10 +1248,8 @@ namespace MonoTests.System.Xml while (r.Read ()) if (r.NodeType == XmlNodeType.Element) while ((c = r.ReadChars (buf, 0, buf.Length)) > 0) - AssertEquals ("at " + n, - strings [n++], - new string (buf, 0, c)); - AssertEquals ("total lines", 5, n); + Assert.AreEqual (strings [n++], new string (buf, 0, c), "at " + n); + Assert.AreEqual (5, n, "total lines"); } [Test] // bug #81294 @@ -1279,10 +1277,10 @@ namespace MonoTests.System.Xml string s = ""; MemoryStream stream = new MemoryStream (Encoding.UTF8.GetBytes(s)); XmlParserContext ctx = new XmlParserContext (null, null, null, XmlSpace.Default); - AssertNull ("#1", ctx.NamespaceManager); - AssertNull ("#2", ctx.NameTable); + Assert.IsNull (ctx.NamespaceManager, "#1"); + Assert.IsNull (ctx.NameTable, "#2"); XmlReader reader = new XmlTextReader (stream, XmlNodeType.Element, ctx); - AssertNull ("#1", ctx.NamespaceManager); + Assert.IsNull (ctx.NamespaceManager, "#1"); reader.Read (); // should not raise NRE. } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlTextTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlTextTests.cs index a677e89473b..b1c0ce7cfb9 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlTextTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlTextTests.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlTextTests : Assertion + public class XmlTextTests { XmlDocument document; XmlText text; @@ -67,8 +67,8 @@ namespace MonoTests.System.Xml public void InnerAndOuterXml () { text = document.CreateTextNode ("&<>\"'"); - AssertEquals (String.Empty, text.InnerXml); - AssertEquals ("&<>\"'", text.OuterXml); + Assert.AreEqual (String.Empty, text.InnerXml); + Assert.AreEqual ("&<>\"'", text.OuterXml); } [Test] @@ -80,12 +80,12 @@ namespace MonoTests.System.Xml document.NodeRemoved += new XmlNodeChangedEventHandler(EventNodeRemoved); XmlText t = document.DocumentElement.FirstChild as XmlText; t.SplitText (5); - AssertNotNull (t.NextSibling); - AssertEquals ("test ", t.Value); - AssertEquals ("text.", t.NextSibling.Value); - Assert (changed); - Assert (inserted); - Assert (!removed); + Assert.IsNotNull (t.NextSibling); + Assert.AreEqual ("test ", t.Value); + Assert.AreEqual ("text.", t.NextSibling.Value); + Assert.IsTrue (changed); + Assert.IsTrue (inserted); + Assert.IsTrue (!removed); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlUrlResolverTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlUrlResolverTests.cs index 72ceeb6a8dc..31d720ccfbc 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlUrlResolverTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlUrlResolverTests.cs @@ -14,7 +14,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlUrlResolverTests : Assertion + public class XmlUrlResolverTests { XmlUrlResolver resolver; @@ -28,7 +28,7 @@ namespace MonoTests.System.Xml public void FileUri () { Uri resolved = resolver.ResolveUri (null, "Test/XmlFiles/xsd/xml.xsd"); - AssertEquals ("file", resolved.Scheme); + Assert.AreEqual ("file", resolved.Scheme); Stream s = resolver.GetEntity (resolved, null, typeof (Stream)) as Stream; } @@ -36,23 +36,23 @@ namespace MonoTests.System.Xml [Category ("NotDotNet")] public void FileUri2 () { - AssertEquals ("file://usr/local/src", resolver.ResolveUri (new Uri ("file://usr/local/src"), null).ToString ()); + Assert.AreEqual (resolver.ResolveUri (new Uri ("file://usr/local/src"), null).ToString (), "file://usr/local/src"); // MS.NET returns the Uri.ToString() as // file://usr/local/src, but it is apparently // incorrect in the context of Unix path. - AssertEquals ("file:///usr/local/src", resolver.ResolveUri (new Uri ("file:///usr/local/src"), null).ToString ()); + Assert.AreEqual (resolver.ResolveUri (new Uri ("file:///usr/local/src"), null).ToString (), "file:///usr/local/src"); } [Test] public void HttpUri () { - AssertEquals ("http://test.xml/", resolver.ResolveUri (null, "http://test.xml").ToString ()); + Assert.AreEqual (resolver.ResolveUri (null, "http://test.xml").ToString (), "http://test.xml/"); } [Test] public void HttpUri2 () { - AssertEquals ("http://go-mono.com/", resolver.ResolveUri (new Uri ("http://go-mono.com"), null).ToString ()); + Assert.AreEqual (resolver.ResolveUri (new Uri ("http://go-mono.com"), null).ToString (), "http://go-mono.com/"); } [Test] @@ -63,7 +63,7 @@ namespace MonoTests.System.Xml public void ResolveUriWithNullArgs () { resolver.ResolveUri (null, null); - Fail ("Should be error (MS.NET throws ArgumentException here)."); + Assert.Fail ("Should be error (MS.NET throws ArgumentException here)."); } // [Test] Uncomment if you want to test. diff --git a/mcs/class/System.XML/Test/System.Xml/XmlValidatingReaderTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlValidatingReaderTests.cs index 2cf13b34bc1..552060abdff 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlValidatingReaderTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlValidatingReaderTests.cs @@ -15,7 +15,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlValidatingReaderTests : Assertion + public class XmlValidatingReaderTests { public XmlValidatingReaderTests () { @@ -48,7 +48,7 @@ namespace MonoTests.System.Xml dvr.Read (); // DTD try { dvr.Read (); // invalid element. - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } @@ -58,7 +58,7 @@ namespace MonoTests.System.Xml dvr.Read (); // root try { dvr.Read (); // invalid text - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } @@ -68,7 +68,7 @@ namespace MonoTests.System.Xml dvr.Read (); // root try { dvr.Read (); // invalid child - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } @@ -83,7 +83,7 @@ namespace MonoTests.System.Xml dvr.Read (); // DTD try { dvr.Read (); // root: invalid end - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } @@ -93,7 +93,7 @@ namespace MonoTests.System.Xml dvr.Read (); // root try { dvr.Read (); // invalid end - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } @@ -109,7 +109,7 @@ namespace MonoTests.System.Xml dvr.Read (); // root try { dvr.Read (); // invalid element - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } @@ -149,7 +149,7 @@ namespace MonoTests.System.Xml dvr.Read (); // valid #PCDATA try { dvr.Read (); // invalid element - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } @@ -174,7 +174,7 @@ namespace MonoTests.System.Xml dvr.Read (); // foo try { dvr.Read (); // invalid end root - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } @@ -184,7 +184,7 @@ namespace MonoTests.System.Xml dvr.Read (); // root try { dvr.Read (); // invalid element bar - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } @@ -201,7 +201,7 @@ namespace MonoTests.System.Xml dvr.Read (); // foo try { dvr.Read (); // invalid element bar - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } @@ -226,7 +226,7 @@ namespace MonoTests.System.Xml dvr.Read (); // foo try { dvr.Read (); // invalid text - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } @@ -264,7 +264,7 @@ namespace MonoTests.System.Xml dvr.Read (); // root try { dvr.Read (); // bar: invalid (undeclared) element - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } @@ -305,7 +305,7 @@ namespace MonoTests.System.Xml dvr.Read (); // DTD try { dvr.Read (); // missing attributes - Fail ("should be failed."); // MS.NET fails to fail this test. + Assert.Fail ("should be failed."); // MS.NET fails to fail this test. } catch (XmlSchemaException) { } @@ -318,7 +318,7 @@ namespace MonoTests.System.Xml dvr.Read (); // DTD try { dvr.Read (); // missing attributes - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } @@ -339,7 +339,7 @@ namespace MonoTests.System.Xml dvr.Read (); // DTD try { dvr.Read (); // undeclared attribute baz - Fail ("should be failed."); + Assert.Fail ("should be failed."); } catch (XmlSchemaException) { } } @@ -364,29 +364,29 @@ namespace MonoTests.System.Xml { dvr.Read (); // DTD dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals ("root", dvr.Name); - AssertEquals (2, dvr.AttributeCount); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual ("root", dvr.Name); + Assert.AreEqual (2, dvr.AttributeCount); // foo - Assert (dvr.MoveToFirstAttribute ()); - AssertEquals ("foo", dvr.Name); - AssertEquals ("foo-def", dvr ["foo"]); - AssertNotNull (dvr ["bar"]); - AssertEquals ("foo-def", dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (String.Empty, dvr.Name); - AssertEquals ("foo-def", dvr.Value); + Assert.IsTrue (dvr.MoveToFirstAttribute ()); + Assert.AreEqual ("foo", dvr.Name); + Assert.AreEqual ("foo-def", dvr ["foo"]); + Assert.IsNotNull (dvr ["bar"]); + Assert.AreEqual ("foo-def", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (String.Empty, dvr.Name); + Assert.AreEqual ("foo-def", dvr.Value); // bar - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("bar", dvr.Name); - AssertEquals ("foo-def", dvr ["foo"]); - AssertNotNull (dvr ["bar"]); - AssertEquals ("bar-def", dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (String.Empty, dvr.Name); - AssertEquals ("bar-def", dvr.Value); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("bar", dvr.Name); + Assert.AreEqual ("foo-def", dvr ["foo"]); + Assert.IsNotNull (dvr ["bar"]); + Assert.AreEqual ("bar-def", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (String.Empty, dvr.Name); + Assert.AreEqual ("bar-def", dvr.Value); } [Test] @@ -399,15 +399,15 @@ namespace MonoTests.System.Xml dvr.EntityHandling = EntityHandling.ExpandEntities; dvr.Read (); // DTD dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals ("root", dvr.Name); - Assert (dvr.MoveToFirstAttribute ()); - AssertEquals ("foo", dvr.Name); - AssertEquals ("entity string", dvr.Value); - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("bar", dvr.Name); - AssertEquals ("internal entity string value", dvr.Value); - AssertEquals ("entity string", dvr.ReadString ()); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual ("root", dvr.Name); + Assert.IsTrue (dvr.MoveToFirstAttribute ()); + Assert.AreEqual ("foo", dvr.Name); + Assert.AreEqual ("entity string", dvr.Value); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("bar", dvr.Name); + Assert.AreEqual ("internal entity string value", dvr.Value); + Assert.AreEqual ("entity string", dvr.ReadString ()); // ValidationType = None @@ -416,17 +416,17 @@ namespace MonoTests.System.Xml dvr.ValidationType = ValidationType.None; dvr.Read (); // DTD dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals ("root", dvr.Name); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual ("root", dvr.Name); - Assert (dvr.MoveToFirstAttribute ()); - AssertEquals ("foo", dvr.Name); - AssertEquals ("entity string", dvr.Value); + Assert.IsTrue (dvr.MoveToFirstAttribute ()); + Assert.AreEqual ("foo", dvr.Name); + Assert.AreEqual ("entity string", dvr.Value); - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("bar", dvr.Name); - AssertEquals ("internal entity string value", dvr.Value); - AssertEquals ("entity string", dvr.ReadString ()); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("bar", dvr.Name); + Assert.AreEqual ("internal entity string value", dvr.Value); + Assert.AreEqual ("entity string", dvr.ReadString ()); } [Test] @@ -439,34 +439,34 @@ namespace MonoTests.System.Xml dvr.EntityHandling = EntityHandling.ExpandCharEntities; dvr.Read (); // DTD dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals ("root", dvr.Name); - Assert (dvr.MoveToFirstAttribute ()); - AssertEquals ("foo", dvr.Name); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual ("root", dvr.Name); + Assert.IsTrue (dvr.MoveToFirstAttribute ()); + Assert.AreEqual ("foo", dvr.Name); // MS BUG: it returns "entity string", however, entity should not be exanded. // ReadAttributeValue() - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals ("ent", dvr.Name); - AssertEquals (String.Empty, dvr.Value); - Assert (!dvr.ReadAttributeValue ()); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual ("ent", dvr.Name); + Assert.AreEqual (String.Empty, dvr.Value); + Assert.IsTrue (!dvr.ReadAttributeValue ()); // bar - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("bar", dvr.Name); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("bar", dvr.Name); // ReadAttributeValue() - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (String.Empty, dvr.Name); - AssertEquals ("internal ", dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals ("ent", dvr.Name); - AssertEquals (String.Empty, dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (String.Empty, dvr.Name); - AssertEquals (" value", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (String.Empty, dvr.Name); + Assert.AreEqual ("internal ", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual ("ent", dvr.Name); + Assert.AreEqual (String.Empty, dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (String.Empty, dvr.Name); + Assert.AreEqual (" value", dvr.Value); // ValidationType = None @@ -475,35 +475,35 @@ namespace MonoTests.System.Xml dvr.ValidationType = ValidationType.None; dvr.Read (); // DTD dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals ("root", dvr.Name); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual ("root", dvr.Name); // foo - Assert (dvr.MoveToFirstAttribute ()); - AssertEquals ("foo", dvr.Name); + Assert.IsTrue (dvr.MoveToFirstAttribute ()); + Assert.AreEqual ("foo", dvr.Name); // ReadAttributeValue() - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals ("ent", dvr.Name); - AssertEquals (String.Empty, dvr.Value); - Assert (!dvr.ReadAttributeValue ()); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual ("ent", dvr.Name); + Assert.AreEqual (String.Empty, dvr.Value); + Assert.IsTrue (!dvr.ReadAttributeValue ()); // bar - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("bar", dvr.Name); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("bar", dvr.Name); // ReadAttributeValue() - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (String.Empty, dvr.Name); - AssertEquals ("internal ", dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals ("ent", dvr.Name); - AssertEquals (String.Empty, dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (String.Empty, dvr.Name); - AssertEquals (" value", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (String.Empty, dvr.Name); + Assert.AreEqual ("internal ", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual ("ent", dvr.Name); + Assert.AreEqual (String.Empty, dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (String.Empty, dvr.Name); + Assert.AreEqual (" value", dvr.Value); } [Test] @@ -517,35 +517,35 @@ namespace MonoTests.System.Xml dvr.EntityHandling = EntityHandling.ExpandCharEntities; dvr.Read (); // DTD dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals ("root", dvr.Name); - Assert (dvr.MoveToFirstAttribute ()); - AssertEquals ("foo", dvr.Name); - AssertEquals ("entity string", dvr.Value); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual ("root", dvr.Name); + Assert.IsTrue (dvr.MoveToFirstAttribute ()); + Assert.AreEqual ("foo", dvr.Name); + Assert.AreEqual ("entity string", dvr.Value); // ReadAttributeValue() - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals ("ent", dvr.Name); - AssertEquals (String.Empty, dvr.Value); - Assert (!dvr.ReadAttributeValue ()); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual ("ent", dvr.Name); + Assert.AreEqual (String.Empty, dvr.Value); + Assert.IsTrue (!dvr.ReadAttributeValue ()); // bar - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("bar", dvr.Name); - AssertEquals ("internal entity string value", dvr.Value); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("bar", dvr.Name); + Assert.AreEqual ("internal entity string value", dvr.Value); // ReadAttributeValue() - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (String.Empty, dvr.Name); - AssertEquals ("internal ", dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals ("ent", dvr.Name); - AssertEquals (String.Empty, dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (String.Empty, dvr.Name); - AssertEquals (" value", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (String.Empty, dvr.Name); + Assert.AreEqual ("internal ", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual ("ent", dvr.Name); + Assert.AreEqual (String.Empty, dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (String.Empty, dvr.Name); + Assert.AreEqual (" value", dvr.Value); // ValidationType = None @@ -554,37 +554,37 @@ namespace MonoTests.System.Xml dvr.ValidationType = ValidationType.None; dvr.Read (); // DTD dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals ("root", dvr.Name); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual ("root", dvr.Name); // foo - Assert (dvr.MoveToFirstAttribute ()); - AssertEquals ("foo", dvr.Name); - AssertEquals ("entity string", dvr.Value); + Assert.IsTrue (dvr.MoveToFirstAttribute ()); + Assert.AreEqual ("foo", dvr.Name); + Assert.AreEqual ("entity string", dvr.Value); // ReadAttributeValue() - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals ("ent", dvr.Name); - AssertEquals (String.Empty, dvr.Value); - Assert (!dvr.ReadAttributeValue ()); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual ("ent", dvr.Name); + Assert.AreEqual (String.Empty, dvr.Value); + Assert.IsTrue (!dvr.ReadAttributeValue ()); // bar - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("bar", dvr.Name); - AssertEquals ("internal entity string value", dvr.Value); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("bar", dvr.Name); + Assert.AreEqual ("internal entity string value", dvr.Value); // ReadAttributeValue() - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (String.Empty, dvr.Name); - AssertEquals ("internal ", dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals ("ent", dvr.Name); - AssertEquals (String.Empty, dvr.Value); - Assert (dvr.ReadAttributeValue ()); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (String.Empty, dvr.Name); - AssertEquals (" value", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (String.Empty, dvr.Name); + Assert.AreEqual ("internal ", dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual ("ent", dvr.Name); + Assert.AreEqual (String.Empty, dvr.Value); + Assert.IsTrue (dvr.ReadAttributeValue ()); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (String.Empty, dvr.Name); + Assert.AreEqual (" value", dvr.Value); } [Test] @@ -602,20 +602,20 @@ namespace MonoTests.System.Xml dvr.EntityHandling = EntityHandling.ExpandEntities; dvr.Read (); // DTD dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals ("root", dvr.Name); - Assert (dvr.MoveToFirstAttribute ()); - AssertEquals ("foo", dvr.Name); - AssertEquals ("id1", dvr.Value); - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("bar", dvr.Name); - AssertEquals ("nameToken", dvr.Value); - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("baz", dvr.Name); - AssertEquals ("list of name token", dvr.Value); - Assert (dvr.MoveToNextAttribute ()); - AssertEquals ("quux", dvr.Name); - AssertEquals (" quuux quuux ", dvr.Value); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual ("root", dvr.Name); + Assert.IsTrue (dvr.MoveToFirstAttribute ()); + Assert.AreEqual ("foo", dvr.Name); + Assert.AreEqual ("id1", dvr.Value); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("bar", dvr.Name); + Assert.AreEqual ("nameToken", dvr.Value); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("baz", dvr.Name); + Assert.AreEqual ("list of name token", dvr.Value); + Assert.IsTrue (dvr.MoveToNextAttribute ()); + Assert.AreEqual ("quux", dvr.Name); + Assert.AreEqual (" quuux quuux ", dvr.Value); } [Test] @@ -629,17 +629,17 @@ namespace MonoTests.System.Xml dvr.ValidationEventHandler += new ValidationEventHandler (OnInvalidityFound); dvr.ValidationType = ValidationType.DTD; dvr.Read (); // DTD - Assert (dvr.Read ()); // invalid foo - Assert (eventFired); - AssertEquals ("foo", dvr.Name); - Assert (dvr.Read ()); // invalid bar - AssertEquals ("bar", dvr.Name); - Assert (dvr.MoveToFirstAttribute ()); // att - AssertEquals ("att", dvr.Name); - Assert (dvr.Read ()); // invalid end foo - AssertEquals ("foo", dvr.Name); - AssertEquals (XmlNodeType.EndElement, dvr.NodeType); - Assert (!dvr.Read ()); + Assert.IsTrue (dvr.Read ()); // invalid foo + Assert.IsTrue (eventFired); + Assert.AreEqual ("foo", dvr.Name); + Assert.IsTrue (dvr.Read ()); // invalid bar + Assert.AreEqual ("bar", dvr.Name); + Assert.IsTrue (dvr.MoveToFirstAttribute ()); // att + Assert.AreEqual ("att", dvr.Name); + Assert.IsTrue (dvr.Read ()); // invalid end foo + Assert.AreEqual ("foo", dvr.Name); + Assert.AreEqual (XmlNodeType.EndElement, dvr.NodeType); + Assert.IsTrue (!dvr.Read ()); // When ValidationType is None, event should not be fired, eventFired = false; @@ -647,8 +647,8 @@ namespace MonoTests.System.Xml dvr.ValidationEventHandler += new ValidationEventHandler (OnInvalidityFound); dvr.ValidationType = ValidationType.None; dvr.Read (); // DTD - Assert (dvr.Read ()); // invalid foo - Assert (!eventFired); + Assert.IsTrue (dvr.Read ()); // invalid foo + Assert.IsTrue (!eventFired); } private bool eventFired; @@ -668,7 +668,7 @@ namespace MonoTests.System.Xml dvr.Read (); // DTD try { dvr.Read (); // root misses attribute foo - Fail (); + Assert.Fail (); } catch (XmlSchemaException) { } @@ -682,7 +682,7 @@ namespace MonoTests.System.Xml dvr.Read (); // c[1] try { dvr.Read (); // c[2] - Fail (); + Assert.Fail (); } catch (XmlSchemaException) { } @@ -693,7 +693,7 @@ namespace MonoTests.System.Xml dvr.Read (); // c[1] try { dvr.Read (); // c[2] - Fail (); + Assert.Fail (); } catch (XmlSchemaException) { } } @@ -712,30 +712,30 @@ namespace MonoTests.System.Xml dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // &ent; - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals (1, dvr.Depth); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (1, dvr.Depth); dvr.ResolveEntity (); // It is still entity reference. - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); dvr.Read (); - AssertEquals (XmlNodeType.Text, dvr.NodeType); - AssertEquals (2, dvr.Depth); - AssertEquals ("entity string", dvr.Value); + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); + Assert.AreEqual (2, dvr.Depth); + Assert.AreEqual ("entity string", dvr.Value); dvr.Read (); - AssertEquals (XmlNodeType.EndEntity, dvr.NodeType); - AssertEquals (1, dvr.Depth); - AssertEquals (String.Empty, dvr.Value); + Assert.AreEqual (XmlNodeType.EndEntity, dvr.NodeType); + Assert.AreEqual (1, dvr.Depth); + Assert.AreEqual (String.Empty, dvr.Value); dvr.Read (); // &ent2; - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); - AssertEquals (1, dvr.Depth); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (1, dvr.Depth); dvr.ResolveEntity (); // It is still entity reference. - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); // It now became element node. dvr.Read (); - AssertEquals (XmlNodeType.Element, dvr.NodeType); - AssertEquals (2, dvr.Depth); + Assert.AreEqual (XmlNodeType.Element, dvr.NodeType); + Assert.AreEqual (2, dvr.Depth); } [Test] @@ -751,22 +751,22 @@ namespace MonoTests.System.Xml dvr.Read (); // DTD dvr.Read (); // root dvr.Read (); // &ent3; - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); #if NET_2_0 // under .NET 2.0, an error is raised here. // under .NET 1.1, the error is thrown on the next read. try { dvr.ResolveEntity (); - Fail ("Attempt to resolve undeclared entity should fail."); + Assert.Fail ("Attempt to resolve undeclared entity should fail."); } catch (XmlException) { } #else // ent3 does not exist in this dtd. dvr.ResolveEntity (); - AssertEquals (XmlNodeType.EntityReference, dvr.NodeType); + Assert.AreEqual (XmlNodeType.EntityReference, dvr.NodeType); try { dvr.Read (); - Fail ("Attempt to resolve undeclared entity should fail."); + Assert.Fail ("Attempt to resolve undeclared entity should fail."); } catch (XmlException) { } #endif @@ -791,10 +791,10 @@ namespace MonoTests.System.Xml dvr.Read (); // doctype dvr.Read (); // root dvr.MoveToAttribute (0); // attr - Assert (dvr.ReadAttributeValue ()); // Should read expanded text - AssertEquals (XmlNodeType.Text, dvr.NodeType); // not EntityReference - AssertEquals ("entity string text", dvr.Value); - Assert (!dvr.ReadAttributeValue ()); + Assert.IsTrue (dvr.ReadAttributeValue ()); // Should read expanded text + Assert.AreEqual (XmlNodeType.Text, dvr.NodeType); // not EntityReference + Assert.AreEqual ("entity string text", dvr.Value); + Assert.IsTrue (!dvr.ReadAttributeValue ()); } [Test] @@ -813,7 +813,7 @@ namespace MonoTests.System.Xml r.Read (); r.Read (); r.Read (); - AssertEquals (refOut, r.ReadOuterXml ()); + Assert.AreEqual (refOut, r.ReadOuterXml ()); } [Test] @@ -888,37 +888,37 @@ namespace MonoTests.System.Xml xvr.Read (); // DTD xvr.Read (); // whitespace xvr.Read (); - AssertEquals ("#1-1", "urn:foo", xvr.LookupNamespace (String.Empty)); - AssertEquals ("#1-2", "urn:bar", xvr.LookupNamespace ("bar")); + Assert.AreEqual ("urn:foo", xvr.LookupNamespace (String.Empty), "#1-1"); + Assert.AreEqual ("urn:bar", xvr.LookupNamespace ("bar"), "#1-2"); - AssertEquals ("#1-a", "urn:baz", xvr.LookupNamespace ("baz")); - Assert ("#1-b", xvr.MoveToAttribute ("baz:dummy")); - AssertEquals ("#1-c", "urn:baz", xvr.NamespaceURI); + Assert.AreEqual ("urn:baz", xvr.LookupNamespace ("baz"), "#1-a"); + Assert.IsTrue (xvr.MoveToAttribute ("baz:dummy"), "#1-b"); + Assert.AreEqual ("urn:baz", xvr.NamespaceURI, "#1-c"); - Assert ("#1-d", xvr.MoveToAttribute ("dummy")); - AssertEquals ("#1-e", String.Empty, xvr.NamespaceURI); + Assert.IsTrue (xvr.MoveToAttribute ("dummy"), "#1-d"); + Assert.AreEqual (String.Empty, xvr.NamespaceURI, "#1-e"); xvr.Read (); // first Y, empty element - AssertEquals ("#2-1", "urn:foo", xvr.LookupNamespace (String.Empty)); - AssertEquals ("#2-2", "urn:bar", xvr.LookupNamespace ("bar")); + Assert.AreEqual ("urn:foo", xvr.LookupNamespace (String.Empty), "#2-1"); + Assert.AreEqual ("urn:bar", xvr.LookupNamespace ("bar"), "#2-2"); xvr.Read (); // second Y, start element - AssertEquals ("#3-1", "urn:foo", xvr.LookupNamespace (String.Empty)); - AssertEquals ("#3-2", "urn:bar", xvr.LookupNamespace ("bar")); + Assert.AreEqual ("urn:foo", xvr.LookupNamespace (String.Empty), "#3-1"); + Assert.AreEqual ("urn:bar", xvr.LookupNamespace ("bar"), "#3-2"); xvr.Read (); // inside normal Y. Check inheritance - AssertEquals ("#4-1", "urn:foo", xvr.LookupNamespace (String.Empty)); - AssertEquals ("#4-2", "urn:bar", xvr.LookupNamespace ("bar")); + Assert.AreEqual ("urn:foo", xvr.LookupNamespace (String.Empty), "#4-1"); + Assert.AreEqual ("urn:bar", xvr.LookupNamespace ("bar"), "#4-2"); xvr.Read (); // second Y, end element - AssertEquals ("#5-1", "urn:foo", xvr.LookupNamespace (String.Empty)); - AssertEquals ("#5-2", "urn:bar", xvr.LookupNamespace ("bar")); + Assert.AreEqual ("urn:foo", xvr.LookupNamespace (String.Empty), "#5-1"); + Assert.AreEqual ("urn:bar", xvr.LookupNamespace ("bar"), "#5-2"); xvr.Read (); // third Y, suppresses default namespaces - AssertEquals ("#6-1", null, xvr.LookupNamespace (String.Empty)); - AssertEquals ("#6-2", "urn:hoge", xvr.LookupNamespace ("bar")); + Assert.AreEqual (null, xvr.LookupNamespace (String.Empty), "#6-1"); + Assert.AreEqual ("urn:hoge", xvr.LookupNamespace ("bar"), "#6-2"); xvr.Read (); // inside suppressing Y. Check inheritance - AssertEquals ("#7-1", null, xvr.LookupNamespace (String.Empty)); - AssertEquals ("#7-2", "urn:hoge", xvr.LookupNamespace ("bar")); + Assert.AreEqual (null, xvr.LookupNamespace (String.Empty), "#7-1"); + Assert.AreEqual ("urn:hoge", xvr.LookupNamespace ("bar"), "#7-2"); xvr.Read (); // end of suppressing element - AssertEquals ("#8-1", null, xvr.LookupNamespace (String.Empty)); - AssertEquals ("#8-2", "urn:hoge", xvr.LookupNamespace ("bar")); + Assert.AreEqual (null, xvr.LookupNamespace (String.Empty), "#8-1"); + Assert.AreEqual ("urn:hoge", xvr.LookupNamespace ("bar"), "#8-2"); } #if NET_2_0 diff --git a/mcs/class/System.XML/Test/System.Xml/XmlWhiteSpaceTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlWhiteSpaceTests.cs index 7672789729b..a4fac53d553 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlWhiteSpaceTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlWhiteSpaceTests.cs @@ -17,7 +17,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlWhiteSpaceTests : Assertion + public class XmlWhiteSpaceTests { XmlDocument document; XmlDocument doc2; @@ -44,19 +44,18 @@ namespace MonoTests.System.Xml public void InnerAndOuterXml () { whitespace = doc2.CreateWhitespace ("\r\n\t "); - AssertEquals (String.Empty, whitespace.InnerXml); - AssertEquals ("\r\n\t ", whitespace.OuterXml); + Assert.AreEqual (String.Empty, whitespace.InnerXml); + Assert.AreEqual ("\r\n\t ", whitespace.OuterXml); } internal void XmlNodeBaseProperties (XmlNode original, XmlNode cloned) { // assertequals (original.nodetype + " was incorrectly cloned.", // original.baseuri, cloned.baseuri); - AssertNull (cloned.ParentNode); - AssertEquals ("Value incorrectly cloned", - cloned.Value, original.Value); + Assert.IsNull (cloned.ParentNode); + Assert.AreEqual (cloned.Value, original.Value, "Value incorrectly cloned"); - Assert ("Copies, not pointers", !Object.ReferenceEquals (original,cloned)); + Assert.IsTrue (!Object.ReferenceEquals (original, cloned), "Copies, not pointers"); } [Test] @@ -69,36 +68,31 @@ namespace MonoTests.System.Xml [Test] public void XmlWhitespaceConstructor () { - AssertEquals ("whitespace char didn't get copied right", - "\r\n", whitespace.Data); + Assert.AreEqual ("\r\n", whitespace.Data, "whitespace char didn't get copied right"); } [Test] public void XmlWhitespaceName () { - AssertEquals (whitespace.NodeType + " Name property broken", - whitespace.Name, "#whitespace"); + Assert.AreEqual (whitespace.Name, "#whitespace", whitespace.NodeType + " Name property broken"); } [Test] public void XmlWhitespaceLocalName () { - AssertEquals (whitespace.NodeType + " LocalName property broken", - whitespace.LocalName, "#whitespace"); + Assert.AreEqual (whitespace.LocalName, "#whitespace", whitespace.NodeType + " LocalName property broken"); } [Test] public void XmlWhitespaceNodeType () { - AssertEquals ("XmlWhitespace NodeType property broken", - whitespace.NodeType.ToString (), "Whitespace"); + Assert.AreEqual (whitespace.NodeType.ToString (), "Whitespace", "XmlWhitespace NodeType property broken"); } [Test] public void XmlWhitespaceIsReadOnly () { - AssertEquals ("XmlWhitespace IsReadOnly property broken", - whitespace.IsReadOnly, false); + Assert.AreEqual (whitespace.IsReadOnly, false, "XmlWhitespace IsReadOnly property broken"); } [Test] @@ -112,8 +106,7 @@ namespace MonoTests.System.Xml deep = whitespace.CloneNode (true); // deep XmlNodeBaseProperties (original, deep); - AssertEquals ("deep cloning differs from shallow cloning", - deep.OuterXml, shallow.OuterXml); + Assert.AreEqual (deep.OuterXml, shallow.OuterXml, "deep cloning differs from shallow cloning"); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XmlWriterSettingsTests.cs b/mcs/class/System.XML/Test/System.Xml/XmlWriterSettingsTests.cs index 79a6736bcc0..b5bd9b2c070 100644 --- a/mcs/class/System.XML/Test/System.Xml/XmlWriterSettingsTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XmlWriterSettingsTests.cs @@ -18,7 +18,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XmlWriterSettingsTests : Assertion + public class XmlWriterSettingsTests { [Test] public void DefaultValue () @@ -31,15 +31,15 @@ namespace MonoTests.System.Xml private void DefaultValue (XmlWriterSettings s) { - AssertEquals (true, s.CheckCharacters); - AssertEquals (false, s.CloseOutput); - AssertEquals (ConformanceLevel.Document, s.ConformanceLevel); - AssertEquals (Encoding.UTF8, s.Encoding); - AssertEquals (false, s.Indent); - AssertEquals (" ", s.IndentChars); - AssertEquals (Environment.NewLine, s.NewLineChars); - AssertEquals (false, s.NewLineOnAttributes); - AssertEquals (false, s.OmitXmlDeclaration); + Assert.AreEqual (true, s.CheckCharacters); + Assert.AreEqual (false, s.CloseOutput); + Assert.AreEqual (ConformanceLevel.Document, s.ConformanceLevel); + Assert.AreEqual (Encoding.UTF8, s.Encoding); + Assert.AreEqual (false, s.Indent); + Assert.AreEqual (" ", s.IndentChars); + Assert.AreEqual (Environment.NewLine, s.NewLineChars); + Assert.AreEqual (false, s.NewLineOnAttributes); + Assert.AreEqual (false, s.OmitXmlDeclaration); } [Test] @@ -54,9 +54,9 @@ namespace MonoTests.System.Xml w.WriteEndElement (); w.Close (); byte [] data = ms.ToArray (); - Assert (data.Length != 0); + Assert.IsTrue (data.Length != 0); string str = s.Encoding.GetString (data); - AssertEquals ("", str); + Assert.AreEqual ("", str); // For TextWriter it does not make sense StringWriter sw = new StringWriter (); @@ -64,7 +64,7 @@ namespace MonoTests.System.Xml w.WriteStartElement ("root"); w.WriteEndElement (); w.Close (); - AssertEquals ("", sw.ToString ()); + Assert.AreEqual ("", sw.ToString ()); } [Test] @@ -126,7 +126,7 @@ namespace MonoTests.System.Xml XmlWriter w = XmlWriter.Create (sw, s); w.WriteElementString ("foo", ""); w.Close (); - AssertEquals ("", sw.ToString ()); + Assert.AreEqual ("", sw.ToString ()); } [Test] @@ -139,7 +139,7 @@ namespace MonoTests.System.Xml w.WriteStartDocument (); w.WriteElementString ("foo", ""); w.Close (); - AssertEquals ("", sw.ToString ()); + Assert.AreEqual ("", sw.ToString ()); } [Test] @@ -153,7 +153,7 @@ namespace MonoTests.System.Xml w.WriteStartDocument (); w.WriteElementString ("foo", ""); w.Close (); - AssertEquals ("", sw.ToString ()); + Assert.AreEqual ("", sw.ToString ()); } [Test] @@ -173,7 +173,7 @@ namespace MonoTests.System.Xml XmlWriter w = XmlWriter.Create (sw, s); w.WriteElementString ("foo", ""); w.Close (); - AssertEquals ("", sw.ToString ()); + Assert.AreEqual ("", sw.ToString ()); } [Test] @@ -198,7 +198,7 @@ namespace MonoTests.System.Xml w.WriteEndElement (); w.WriteEndElement (); w.Close (); - AssertEquals (output, sw.ToString ()); + Assert.AreEqual (output, sw.ToString ()); } [Test] @@ -229,7 +229,7 @@ namespace MonoTests.System.Xml w.WriteStartElement ("root"); w.WriteEndElement (); w.Flush (); - AssertEquals ("", sb.ToString ()); + Assert.AreEqual ("", sb.ToString ()); } [Test] @@ -246,7 +246,7 @@ namespace MonoTests.System.Xml w.WriteString ("some string"); w.WriteEndElement (); w.Close (); - AssertEquals ("#1", "some string", sw.ToString ()); + Assert.AreEqual ("some string", sw.ToString (), "#1"); // mixed content: bug #81770 string expected = "some stringsome string"; @@ -262,7 +262,7 @@ namespace MonoTests.System.Xml w.WriteEndElement (); w.WriteEndElement (); w.Close (); - AssertEquals ("#2", expected, sw.ToString ().Replace ("\r\n", "\n")); + Assert.AreEqual (expected, sw.ToString ().Replace ("\r\n", "\n"), "#2"); } [Test] @@ -282,7 +282,7 @@ namespace MonoTests.System.Xml doc.Save (xw); } // no heading newline. - AssertEquals ("", sw.ToString ()); + Assert.AreEqual ("", sw.ToString ()); } } } diff --git a/mcs/class/System.XML/Test/System.Xml/XsdParticleValidationTests.cs b/mcs/class/System.XML/Test/System.Xml/XsdParticleValidationTests.cs index b7d4342e28f..92d72231134 100644 --- a/mcs/class/System.XML/Test/System.Xml/XsdParticleValidationTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XsdParticleValidationTests.cs @@ -22,7 +22,7 @@ namespace MonoTests.System.Xml // using XmlValidatingReader = XmlTextReader; [TestFixture] - public class XsdParticleValidationTests : Assertion + public class XsdParticleValidationTests { XmlSchema schema; XmlReader xr; diff --git a/mcs/class/System.XML/Test/System.Xml/XsdValidatingReaderTests.cs b/mcs/class/System.XML/Test/System.Xml/XsdValidatingReaderTests.cs index 9cad92514d3..e129d43ee5c 100644 --- a/mcs/class/System.XML/Test/System.Xml/XsdValidatingReaderTests.cs +++ b/mcs/class/System.XML/Test/System.Xml/XsdValidatingReaderTests.cs @@ -17,7 +17,7 @@ using NUnit.Framework; namespace MonoTests.System.Xml { [TestFixture] - public class XsdValidatingReaderTests : Assertion + public class XsdValidatingReaderTests { public XsdValidatingReaderTests () { @@ -50,14 +50,14 @@ namespace MonoTests.System.Xml { string xml = ""; xvr = PrepareXmlReader (xml); - AssertEquals (ValidationType.Auto, xvr.ValidationType); + Assert.AreEqual (ValidationType.Auto, xvr.ValidationType); XmlSchema schema = new XmlSchema (); XmlSchemaElement elem = new XmlSchemaElement (); elem.Name = "root"; schema.Items.Add (elem); xvr.Schemas.Add (schema); xvr.Read (); // root - AssertEquals (ValidationType.Auto, xvr.ValidationType); + Assert.AreEqual (ValidationType.Auto, xvr.ValidationType); xvr.Read (); // EOF xml = ""; @@ -65,7 +65,7 @@ namespace MonoTests.System.Xml xvr.Schemas.Add (schema); try { xvr.Read (); - Fail ("element mismatch is incorrectly allowed"); + Assert.Fail ("element mismatch is incorrectly allowed"); } catch (XmlSchemaException) { } @@ -74,7 +74,7 @@ namespace MonoTests.System.Xml xvr.Schemas.Add (schema); try { xvr.Read (); - Fail ("Element in different namespace is incorrectly allowed."); + Assert.Fail ("Element in different namespace is incorrectly allowed."); } catch (XmlSchemaException) { } } @@ -95,22 +95,22 @@ namespace MonoTests.System.Xml xvr.Schemas.Add (schema); // Read directly from root. object o = xvr.ReadTypedValue (); - AssertEquals (ReadState.Initial, xvr.ReadState); - AssertNull (o); + Assert.AreEqual (ReadState.Initial, xvr.ReadState); + Assert.IsNull (o); xvr.Read (); // element root - AssertEquals (XmlNodeType.Element, xvr.NodeType); - AssertNotNull (xvr.SchemaType); - Assert (xvr.SchemaType is XmlSchemaDatatype); + Assert.AreEqual (XmlNodeType.Element, xvr.NodeType); + Assert.IsNotNull (xvr.SchemaType); + Assert.IsTrue (xvr.SchemaType is XmlSchemaDatatype); o = xvr.ReadTypedValue (); // read "12" - AssertEquals (XmlNodeType.EndElement, xvr.NodeType); - AssertNotNull (o); - AssertEquals (typeof (decimal), o.GetType ()); + Assert.AreEqual (XmlNodeType.EndElement, xvr.NodeType); + Assert.IsNotNull (o); + Assert.AreEqual (typeof (decimal), o.GetType ()); decimal n = (decimal) o; - AssertEquals (12, n); - Assert (!xvr.EOF); - AssertEquals ("root", xvr.Name); - AssertNull (xvr.SchemaType); // EndElement's type + Assert.AreEqual (12, n); + Assert.IsTrue (!xvr.EOF); + Assert.AreEqual ("root", xvr.Name); + Assert.IsNull (xvr.SchemaType); // EndElement's type // Lap 2: @@ -118,14 +118,14 @@ namespace MonoTests.System.Xml xvr.Schemas.Add (schema); xvr.Read (); // root XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype; - AssertNotNull (dt); - AssertEquals (typeof (decimal), dt.ValueType); - AssertEquals (XmlTokenizedType.None, dt.TokenizedType); + Assert.IsNotNull (dt); + Assert.AreEqual (typeof (decimal), dt.ValueType); + Assert.AreEqual (XmlTokenizedType.None, dt.TokenizedType); xvr.Read (); // text "12" - AssertNull (xvr.SchemaType); + Assert.IsNull (xvr.SchemaType); o = xvr.ReadTypedValue (); // ReadTypedValue is different from ReadString(). - AssertNull (o); + Assert.IsNull (o); } [Test] @@ -138,7 +138,7 @@ namespace MonoTests.System.Xml string xml = ""; xvr = PrepareXmlReader (xml); xvr.Namespaces = false; - AssertEquals (ValidationType.Auto, xvr.ValidationType); + Assert.AreEqual (ValidationType.Auto, xvr.ValidationType); XmlSchema schema = new XmlSchema (); schema.TargetNamespace = "urn:foo"; XmlSchemaElement elem = new XmlSchemaElement (); @@ -146,12 +146,12 @@ namespace MonoTests.System.Xml schema.Items.Add (elem); xvr.Schemas.Add (schema); xvr.Read (); // root - Assert (!xvr.Namespaces); - AssertEquals ("x:root", xvr.Name); + Assert.IsTrue (!xvr.Namespaces); + Assert.AreEqual ("x:root", xvr.Name); // LocalName may contain colons. - AssertEquals ("x:root", xvr.LocalName); + Assert.AreEqual ("x:root", xvr.LocalName); // NamespaceURI is not supplied. - AssertEquals ("", xvr.NamespaceURI); + Assert.AreEqual ("", xvr.NamespaceURI); } [Test] @@ -172,19 +172,19 @@ namespace MonoTests.System.Xml xvr = PrepareXmlReader (xml); xvr.Schemas.Add (schema); xvr.Read (); - AssertEquals ("root", xvr.Name); - Assert (xvr.MoveToNextAttribute ()); // attr - AssertEquals ("attr", xvr.Name); + Assert.AreEqual ("root", xvr.Name); + Assert.IsTrue (xvr.MoveToNextAttribute ()); // attr + Assert.AreEqual ("attr", xvr.Name); XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype; - AssertNotNull (dt); - AssertEquals (typeof (int), dt.ValueType); - AssertEquals (XmlTokenizedType.None, dt.TokenizedType); + Assert.IsNotNull (dt); + Assert.AreEqual (typeof (int), dt.ValueType); + Assert.AreEqual (XmlTokenizedType.None, dt.TokenizedType); object o = xvr.ReadTypedValue (); - AssertEquals (XmlNodeType.Attribute, xvr.NodeType); - AssertEquals (typeof (int), o.GetType ()); + Assert.AreEqual (XmlNodeType.Attribute, xvr.NodeType); + Assert.AreEqual (typeof (int), o.GetType ()); int n = (int) o; - AssertEquals (12, n); - Assert (xvr.ReadAttributeValue ()); // can read = seems not proceed. + Assert.AreEqual (12, n); + Assert.IsTrue (xvr.ReadAttributeValue ()); // can read = seems not proceed. } [Test] @@ -220,15 +220,15 @@ namespace MonoTests.System.Xml xml, XmlNodeType.Document, null); vr.Read (); vr.Read (); // whitespace - AssertEquals ("#1", String.Empty, vr.NamespaceURI); + Assert.AreEqual (String.Empty, vr.NamespaceURI, "#1"); vr.Read (); // foo - AssertEquals ("#2", "urn:a", vr.NamespaceURI); + Assert.AreEqual ("urn:a", vr.NamespaceURI, "#2"); vr.Read (); // whitespace vr.Read (); // a:bar - AssertEquals ("#3", "urn:a", vr.NamespaceURI); + Assert.AreEqual ("urn:a", vr.NamespaceURI, "#3"); vr.Read (); // whitespace vr.Read (); // bug - AssertEquals ("#4", "urn:a", vr.NamespaceURI); + Assert.AreEqual ("urn:a", vr.NamespaceURI, "#4"); } [Test] @@ -261,8 +261,8 @@ namespace MonoTests.System.Xml XmlValidatingReader vr = new XmlValidatingReader (xir); vr.Schemas.Add (XmlSchema.Read (xsr, null)); vr.Read (); // root - AssertEquals ("xx", vr.ReadTypedValue ()); - AssertEquals (XmlNodeType.EndElement, vr.NodeType); + Assert.AreEqual ("xx", vr.ReadTypedValue ()); + Assert.AreEqual (XmlNodeType.EndElement, vr.NodeType); } // If we normalize string before validating with facets, @@ -289,8 +289,8 @@ namespace MonoTests.System.Xml XmlValidatingReader vr = new XmlValidatingReader (xir); vr.Schemas.Add (XmlSchema.Read (xsr, null)); vr.Read (); // root - AssertEquals (" ", vr.ReadTypedValue ()); - AssertEquals (XmlNodeType.EndElement, vr.NodeType); + Assert.AreEqual (" ", vr.ReadTypedValue ()); + Assert.AreEqual (XmlNodeType.EndElement, vr.NodeType); } [Test] // bug #77241 @@ -402,7 +402,7 @@ namespace MonoTests.System.Xml XmlReader r = XmlReader.Create (new StringReader (xml), s); r.Read (); r.MoveToFirstAttribute (); // default attribute - AssertEquals (String.Empty, r.Prefix); + Assert.AreEqual (String.Empty, r.Prefix); } #endif diff --git a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Attr/Attr.cs b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Attr/Attr.cs index d33a55c95f3..38a20db8200 100644 --- a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Attr/Attr.cs +++ b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Attr/Attr.cs @@ -20,7 +20,7 @@ using NUnit.Framework; namespace nist_dom.fundamental { [TestFixture] - public class AttrTest : Assertion//, ITest + public class AttrTest//, ITest { public static int i = 1; /* @@ -80,7 +80,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -135,7 +135,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -187,7 +187,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -248,7 +248,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -299,7 +299,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -359,7 +359,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -408,7 +408,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -460,7 +460,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -514,7 +514,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -571,7 +571,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -630,7 +630,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -684,7 +684,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -740,7 +740,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } @@ -803,7 +803,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); // return results; } //------------------------ End test case core-0014A -------------------------- diff --git a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/CharacterData/CharacterData.cs b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/CharacterData/CharacterData.cs index f5f418f0966..3bf39544353 100644 --- a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/CharacterData/CharacterData.cs +++ b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/CharacterData/CharacterData.cs @@ -21,7 +21,7 @@ using NUnit.Framework; namespace nist_dom.fundamental { [TestFixture] - public class CharacterDataTest : Assertion//,ITest + public class CharacterDataTest//,ITest { public static int i = 2; /* @@ -84,7 +84,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0001C -------------------------- @@ -137,7 +137,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0002C -------------------------- @@ -193,7 +193,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0003C -------------------------- @@ -245,7 +245,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0004C -------------------------- @@ -299,7 +299,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0005C -------------------------- @@ -353,7 +353,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0006C -------------------------- @@ -409,7 +409,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0007C -------------------------- @@ -463,7 +463,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0008C -------------------------- @@ -517,7 +517,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0009C -------------------------- @@ -571,7 +571,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0010C -------------------------- @@ -625,7 +625,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0011C -------------------------- @@ -679,7 +679,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0012C -------------------------- @@ -733,7 +733,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0013C -------------------------- @@ -793,7 +793,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0014C -------------------------- @@ -853,7 +853,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0015C -------------------------- @@ -908,7 +908,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0016C -------------------------- @@ -962,7 +962,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0017C -------------------------- @@ -1017,7 +1017,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0018C -------------------------- @@ -1075,7 +1075,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0019C -------------------------- @@ -1133,7 +1133,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0020C -------------------------- @@ -1195,7 +1195,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0021C -------------------------- @@ -1259,7 +1259,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0022C -------------------------- @@ -1322,7 +1322,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0023C -------------------------- @@ -1386,7 +1386,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0024C -------------------------- @@ -1450,7 +1450,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0025C -------------------------- @@ -1511,7 +1511,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0026C -------------------------- @@ -1575,7 +1575,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0027C -------------------------- @@ -1633,7 +1633,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0028C -------------------------- @@ -1695,7 +1695,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0029C -------------------------- @@ -1761,7 +1761,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0030C -------------------------- @@ -1824,7 +1824,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0031C -------------------------- @@ -1888,7 +1888,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0032C -------------------------- @@ -1955,7 +1955,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0033C -------------------------- @@ -2019,7 +2019,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0034C -------------------------- @@ -2081,7 +2081,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0035C -------------------------- @@ -2147,7 +2147,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0036C -------------------------- diff --git a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Comment/Comment.cs b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Comment/Comment.cs index 7eed05a250f..6aa5940e2ce 100644 --- a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Comment/Comment.cs +++ b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Comment/Comment.cs @@ -23,7 +23,7 @@ namespace nist_dom.fundamental /// Summary description for Comment. /// [TestFixture] - public class CommentTest : Assertion//,ITest + public class CommentTest//,ITest { public static int i = 1; /* @@ -69,7 +69,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0001CO -------------------------- diff --git a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/DOMImplementation/DOMImplementation.cs b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/DOMImplementation/DOMImplementation.cs index 052f8398e3d..c7c0f7cb2fe 100644 --- a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/DOMImplementation/DOMImplementation.cs +++ b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/DOMImplementation/DOMImplementation.cs @@ -22,7 +22,7 @@ namespace nist_dom.fundamental /// Summary description for Comment. /// [TestFixture] - public class DOMImplementationTest : Assertion + public class DOMImplementationTest { public static int i = 2; /* @@ -73,7 +73,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0001DI -------------------------- // @@ -117,7 +117,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0002DI -------------------------- // @@ -163,7 +163,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0003DI -------------------------- // @@ -208,7 +208,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0004DI -------------------------- // @@ -255,7 +255,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0005DI -------------------------- } diff --git a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Document/Document.cs b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Document/Document.cs index 68a61a864ed..d3d433295d9 100644 --- a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Document/Document.cs +++ b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Document/Document.cs @@ -21,7 +21,7 @@ using NUnit.Framework; namespace nist_dom.fundamental { [TestFixture] - public class DocumentTest : Assertion + public class DocumentTest { public static int i = 2; /* @@ -78,7 +78,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0001D -------------------------- @@ -117,7 +117,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0002D -------------------------- @@ -157,7 +157,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0003D -------------------------- @@ -204,7 +204,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0004D -------------------------- @@ -250,7 +250,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0005D -------------------------- @@ -296,7 +296,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0006D -------------------------- @@ -346,7 +346,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0007D -------------------------- @@ -404,7 +404,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0008D -------------------------- @@ -455,7 +455,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0009D -------------------------- @@ -505,7 +505,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0010D -------------------------- @@ -555,7 +555,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0011D -------------------------- @@ -607,7 +607,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0012D -------------------------- @@ -659,7 +659,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0013D -------------------------- @@ -710,7 +710,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0014D -------------------------- @@ -762,7 +762,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0015D -------------------------- @@ -810,7 +810,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0016D -------------------------- @@ -860,7 +860,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0017D -------------------------- @@ -913,7 +913,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0018D -------------------------- @@ -972,7 +972,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0019D ------------------------- @@ -1031,7 +1031,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0020D ------------------------- @@ -1089,7 +1089,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0021D ------------------------- @@ -1149,7 +1149,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0022D ------------------------- @@ -1207,7 +1207,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0023D ------------------------- @@ -1264,7 +1264,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0024D ------------------------- @@ -1323,7 +1323,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0025D ------------------------- diff --git a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Element/Element.cs b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Element/Element.cs index 4a5a10a59a7..0ac43c1167a 100644 --- a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Element/Element.cs +++ b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Element/Element.cs @@ -21,7 +21,7 @@ using NUnit.Framework; namespace nist_dom.fundamental { [TestFixture] - public class ElementTest : Assertion + public class ElementTest { public static int i = 2; /* @@ -93,7 +93,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0001E -------------------------- // @@ -151,7 +151,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0002E -------------------------- @@ -201,7 +201,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0003E -------------------------- @@ -247,7 +247,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0004E -------------------------- @@ -312,7 +312,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0005E -------------------------- @@ -372,7 +372,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0006E -------------------------- @@ -434,7 +434,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0007E -------------------------- @@ -504,7 +504,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0008E -------------------------- @@ -563,7 +563,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0009E -------------------------- @@ -615,7 +615,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0010E -------------------------- @@ -674,7 +674,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0011E -------------------------- @@ -740,7 +740,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0012E -------------------------- @@ -810,7 +810,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0013E -------------------------- @@ -871,7 +871,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0014E -------------------------- @@ -940,7 +940,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0015E -------------------------- @@ -1008,7 +1008,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0016E -------------------------- @@ -1071,7 +1071,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0017E -------------------------- @@ -1119,7 +1119,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0018E -------------------------- @@ -1169,7 +1169,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0019E -------------------------- @@ -1229,7 +1229,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0020E -------------------------- @@ -1279,7 +1279,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0021E -------------------------- @@ -1339,7 +1339,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0022E -------------------------- @@ -1398,7 +1398,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0023E -------------------------- @@ -1459,7 +1459,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0024E -------------------------- @@ -1519,7 +1519,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0025E -------------------------- @@ -1581,7 +1581,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0026E -------------------------- @@ -1645,7 +1645,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0027E -------------------------- @@ -1712,7 +1712,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0028E -------------------------- @@ -1782,7 +1782,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0029E ------------------------- @@ -1843,7 +1843,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0030E -------------------------- diff --git a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/NamedNodeMap/NamedNodeMap.cs b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/NamedNodeMap/NamedNodeMap.cs index 2380ef476b6..2b538893e7a 100644 --- a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/NamedNodeMap/NamedNodeMap.cs +++ b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/NamedNodeMap/NamedNodeMap.cs @@ -21,7 +21,7 @@ using NUnit.Framework; namespace nist_dom.fundamental { [TestFixture] - public class NamedNodeMapTest : Assertion + public class NamedNodeMapTest { public static int i = 2; /* @@ -84,7 +84,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0001M -------------------------- @@ -136,7 +136,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0002M -------------------------- @@ -187,7 +187,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0003M -------------------------- @@ -248,7 +248,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0004M -------------------------- @@ -311,7 +311,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0005M -------------------------- @@ -373,7 +373,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0006M -------------------------- @@ -429,7 +429,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0007M -------------------------- @@ -485,7 +485,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0008M -------------------------- @@ -544,7 +544,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0009M -------------------------- @@ -600,7 +600,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0010M -------------------------- @@ -651,7 +651,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0011M -------------------------- @@ -707,7 +707,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0012M -------------------------- @@ -759,7 +759,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0013M -------------------------- @@ -811,7 +811,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0014M -------------------------- @@ -861,7 +861,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0015M -------------------------- @@ -908,7 +908,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0016M -------------------------- @@ -961,7 +961,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0017M -------------------------- @@ -1021,7 +1021,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0018M -------------------------- @@ -1078,7 +1078,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0019M -------------------------- @@ -1145,7 +1145,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0020M -------------------------- @@ -1208,7 +1208,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0021M -------------------------- diff --git a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Node/Node.cs b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Node/Node.cs index 93502d06063..2788ebde63e 100644 --- a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Node/Node.cs +++ b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Node/Node.cs @@ -21,7 +21,7 @@ using NUnit.Framework; namespace nist_dom.fundamental { [TestFixture] - public class NodeTest : Assertion + public class NodeTest { public static int i = 2; /* @@ -89,7 +89,7 @@ namespace nist_dom.fundamental // results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0001NO -------------------------- @@ -137,7 +137,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0002NO -------------------------- @@ -189,7 +189,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0003NO -------------------------- @@ -241,7 +241,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0004NO -------------------------- @@ -293,7 +293,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0005NO -------------------------- @@ -336,7 +336,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0006NO -------------------------- @@ -376,7 +376,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0007NO -------------------------- @@ -418,7 +418,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0008NO -------------------------- @@ -459,7 +459,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0009NO -------------------------- @@ -501,7 +501,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0010NO -------------------------- @@ -544,7 +544,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0011NO -------------------------- @@ -593,7 +593,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0012NO -------------------------- @@ -630,7 +630,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0013NO -------------------------- @@ -681,7 +681,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0014NO -------------------------- @@ -732,7 +732,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0015NO -------------------------- @@ -783,7 +783,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0016NO -------------------------- @@ -834,7 +834,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0017NO -------------------------- // @@ -876,7 +876,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0018NO -------------------------- @@ -918,7 +918,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0019NO -------------------------- @@ -960,7 +960,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0020NO -------------------------- @@ -1001,7 +1001,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0021NO -------------------------- @@ -1043,7 +1043,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0022NO ------------------------ @@ -1086,7 +1086,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0023NO -------------------------- @@ -1135,7 +1135,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0024NO -------------------------- @@ -1172,7 +1172,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0025NO -------------------------- @@ -1223,7 +1223,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0026NO -------------------------- @@ -1275,7 +1275,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0027NO -------------------------- @@ -1327,7 +1327,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0028NO -------------------------- @@ -1378,7 +1378,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0029NO -------------------------- @@ -1421,7 +1421,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0030NO -------------------------- @@ -1463,7 +1463,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0031NO -------------------------- @@ -1505,7 +1505,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0032NO -------------------------- @@ -1546,7 +1546,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0033NO -------------------------- @@ -1588,7 +1588,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0034NO ------------------------ @@ -1631,7 +1631,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0035NO -------------------------- @@ -1680,7 +1680,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0036NO -------------------------- @@ -1736,7 +1736,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0037NO -------------------------- @@ -1787,7 +1787,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0038NO -------------------------- @@ -1838,7 +1838,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0039NO -------------------------- @@ -1890,7 +1890,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0040NO -------------------------- @@ -1941,7 +1941,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0041NO -------------------------- // @@ -1984,7 +1984,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0042NO -------------------------- @@ -2027,7 +2027,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0043NO -------------------------- @@ -2070,7 +2070,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0044NO -------------------------- @@ -2112,7 +2112,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0045NO -------------------------- @@ -2155,7 +2155,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0046NO ------------------------ @@ -2198,7 +2198,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0047NO -------------------------- @@ -2247,7 +2247,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0048NO -------------------------- @@ -2298,7 +2298,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0049NO -------------------------- @@ -2342,7 +2342,7 @@ namespace nist_dom.fundamental results.actual = (computedValue == null).ToString(); util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0050NO -------------------------- @@ -2385,7 +2385,7 @@ namespace nist_dom.fundamental results.actual = (computedValue == null).ToString(); util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0051NO -------------------------- @@ -2428,7 +2428,7 @@ namespace nist_dom.fundamental results.expected = expectedValue.ToString(); results.actual = computedValue.ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0052NO -------------------------- @@ -2479,7 +2479,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0053NO -------------------------- @@ -2529,7 +2529,7 @@ namespace nist_dom.fundamental results.actual = computedValue.ToString(); util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0054NO -------------------------- @@ -2574,7 +2574,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0055NO -------------------------- @@ -2626,7 +2626,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0056NO -------------------------- @@ -2671,7 +2671,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0057NO -------------------------- @@ -2722,7 +2722,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0058NO -------------------------- @@ -2774,7 +2774,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0059NO -------------------------- @@ -2825,7 +2825,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0060NO -------------------------- @@ -2877,7 +2877,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0061NO -------------------------- @@ -2927,7 +2927,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0062NO -------------------------- @@ -2973,7 +2973,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0063NO -------------------------- @@ -3017,7 +3017,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0064NO -------------------------- @@ -3075,7 +3075,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0065NO -------------------------- @@ -3130,7 +3130,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0066NO -------------------------- @@ -3195,7 +3195,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0067NO -------------------------- @@ -3253,7 +3253,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0068NO -------------------------- @@ -3315,7 +3315,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0069NO -------------------------- @@ -3373,7 +3373,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0070NO ------------------------ @@ -3435,7 +3435,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0071NO -------------------------- @@ -3494,7 +3494,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0072NO -------------------------- @@ -3551,7 +3551,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0073NO -------------------------- @@ -3607,7 +3607,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0074NO -------------------------- @@ -3662,7 +3662,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0075NO ------------------------ @@ -3720,7 +3720,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0076NO -------------------------- @@ -3781,7 +3781,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0077NO -------------------------- @@ -3829,7 +3829,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0078NO -------------------------- @@ -3869,7 +3869,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0079NO -------------------------- @@ -3917,7 +3917,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0080NO -------------------------- @@ -3971,7 +3971,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0081NO -------------------------- @@ -4028,7 +4028,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0082NO -------------------------- @@ -4081,7 +4081,7 @@ namespace nist_dom.fundamental results.actual = (computedValue == null).ToString(); util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0083NO -------------------------- @@ -4134,7 +4134,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0084NO -------------------------- @@ -4186,7 +4186,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0085NO -------------------------- @@ -4250,7 +4250,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0086NO -------------------------- @@ -4310,7 +4310,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0087NO ------------------------- @@ -4376,7 +4376,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0088NO ------------------------- @@ -4442,7 +4442,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0089NO ------------------------- @@ -4506,7 +4506,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0090NO ------------------------- @@ -4570,7 +4570,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0091NO ------------------------- @@ -4633,7 +4633,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0092NO ------------------------- @@ -4696,7 +4696,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0093NO ------------------------- @@ -4759,7 +4759,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0094NO ------------------------- @@ -4823,7 +4823,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0095NO ------------------------- @@ -4884,7 +4884,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0096NO ------------------------- @@ -4944,7 +4944,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0097NO ------------------------- @@ -5005,7 +5005,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0098NO ----------------------- @@ -5065,7 +5065,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0099NO ----------------------- @@ -5124,7 +5124,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0100NO ----------------------- @@ -5189,7 +5189,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0101NO ----------------------- @@ -5253,7 +5253,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0102NO ----------------------- @@ -5314,7 +5314,7 @@ namespace nist_dom.fundamental results.actual = computedValue; util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0103NO ----------------------- diff --git a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/NodeList/NodeList.cs b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/NodeList/NodeList.cs index f4b994554df..70f398dcccb 100644 --- a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/NodeList/NodeList.cs +++ b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/NodeList/NodeList.cs @@ -21,7 +21,7 @@ using NUnit.Framework; namespace nist_dom.fundamental { [TestFixture] - public class NodeListTest : Assertion + public class NodeListTest { public static int i = 2; /* @@ -82,7 +82,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0001N -------------------------- @@ -133,7 +133,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0002N -------------------------- @@ -184,7 +184,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0003N -------------------------- @@ -236,7 +236,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0004N -------------------------- @@ -285,7 +285,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0005N -------------------------- @@ -333,7 +333,7 @@ namespace nist_dom.fundamental results.expected = (expectedValue == null).ToString(); results.actual = (computedValue == null).ToString(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0006N -------------------------- @@ -379,7 +379,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0007N -------------------------- @@ -429,7 +429,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0008N -------------------------- @@ -482,7 +482,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0009N -------------------------- diff --git a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Text/Text.cs b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Text/Text.cs index 18690353454..9da0bbaeaf8 100644 --- a/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Text/Text.cs +++ b/mcs/class/System.XML/Test/System.Xml/nist_dom/fundamental/Text/Text.cs @@ -21,7 +21,7 @@ using NUnit.Framework; namespace nist_dom.fundamental { [TestFixture] - public class TextTest : Assertion + public class TextTest { public static int i = 2; /* @@ -86,7 +86,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0001T -------------------------- @@ -153,7 +153,7 @@ namespace nist_dom.fundamental results.expected = expectedValue; results.actual = computedValue; - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0002 -------------------------- @@ -213,7 +213,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0003T -------------------------- @@ -273,7 +273,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0004T -------------------------- @@ -335,7 +335,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0005T -------------------------- @@ -394,7 +394,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0006T -------------------------- @@ -457,7 +457,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0007T -------------------------- // @@ -520,7 +520,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0008T -------------------------- // @@ -582,7 +582,7 @@ namespace nist_dom.fundamental util.resetData(); - AssertEquals (results.expected, results.actual); + Assert.AreEqual (results.expected, results.actual); } //------------------------ End test case core-0009T -------------------------- diff --git a/mcs/class/System/Assembly/AssemblyInfo.cs b/mcs/class/System/Assembly/AssemblyInfo.cs index 98d625d3514..64dfb4c0218 100644 --- a/mcs/class/System/Assembly/AssemblyInfo.cs +++ b/mcs/class/System/Assembly/AssemblyInfo.cs @@ -67,6 +67,7 @@ using System.Runtime.InteropServices; #endif #if NET_2_0 + [assembly: InternalsVisibleTo ("System.ComponentModel.DataAnnotations, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9")] [assembly: AssemblyFileVersion (Consts.FxFileVersion)] [assembly: Debuggable (DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: CompilationRelaxations (CompilationRelaxations.NoStringInterning)] diff --git a/mcs/class/System/Assembly/ChangeLog b/mcs/class/System/Assembly/ChangeLog index d3e1be17a91..1de430b90be 100644 --- a/mcs/class/System/Assembly/ChangeLog +++ b/mcs/class/System/Assembly/ChangeLog @@ -1,3 +1,9 @@ +2009-06-23 Marek Habersack + + * AssemblyInfo.cs: added InternalsVisibleTo for + System.ComponentModel.DataAnnotations (needs + ReflectionPropertyDescriptor) + 2009-04-23 Sebastien Pouliot * AssemblyInfo.cs: Remove InternalsVisibleTo on Mono.Moonlight diff --git a/mcs/class/System/ChangeLog b/mcs/class/System/ChangeLog index 95649ab87b1..810f4a6265f 100644 --- a/mcs/class/System/ChangeLog +++ b/mcs/class/System/ChangeLog @@ -1,3 +1,8 @@ +2009-06-28 Gert Driesen + + * System_test.dll.sources: Added IPv6MulticastOptionTest.cs and + MulticastOptionTest.cs. + 2009-05-14 Jonathan Pryor * Makefile: Distribute Test/test-config-file-net-2.0. diff --git a/mcs/class/System/System.ComponentModel/AttributeCollection.cs b/mcs/class/System/System.ComponentModel/AttributeCollection.cs index 56f3464fffe..2c35cebe509 100644 --- a/mcs/class/System/System.ComponentModel/AttributeCollection.cs +++ b/mcs/class/System/System.ComponentModel/AttributeCollection.cs @@ -44,7 +44,8 @@ namespace System.ComponentModel internal AttributeCollection (ArrayList attributes) { - attrList = attributes; + if (attributes != null) + attrList = attributes; } #if NET_2_0 @@ -161,7 +162,7 @@ namespace System.ComponentModel public int Count { get { - return attrList.Count; + return attrList != null ? attrList.Count : 0; } } diff --git a/mcs/class/System/System.ComponentModel/ChangeLog b/mcs/class/System/System.ComponentModel/ChangeLog index 8561892c47e..a6fe9c83664 100644 --- a/mcs/class/System/System.ComponentModel/ChangeLog +++ b/mcs/class/System/System.ComponentModel/ChangeLog @@ -1,3 +1,27 @@ +2009-06-29 Gonzalo Paniagua Javier + + * LicenseProviderAttribute.cs: avoid nullref when provider has not + been set or cannot be loaded. + +2009-06-23 Marek Habersack + + * TypeDescriptor.cs: do not wrap DefaultTypeDescriptionProvider. + Implemented GetAttributes and GetProperties in + DefaultTypeDescriptor. + + * AttributeCollection.cs: make sure that attrList is never null. + +2009-06-22 Marek Habersack + + * WeakObjectWrapper.cs, WeakObjectWrapperComparer.cs: added - used + by TypeDescriptor for storage of type description providers. + + * TypeDescriptor.cs: implemented part of the 2.0+ API which deals + with adding/removing/getting type description providers. + + * AttributeCollection.cs: do not throw NREX when attrList is + null in Count. + 2009-05-14 Jonathan Pryor * ListChangedEventArgs.cs: Fix .NET compatibility problems (discovered diff --git a/mcs/class/System/System.ComponentModel/LicenseProviderAttribute.cs b/mcs/class/System/System.ComponentModel/LicenseProviderAttribute.cs index 791fb80dfb4..bba46f05b50 100644 --- a/mcs/class/System/System.ComponentModel/LicenseProviderAttribute.cs +++ b/mcs/class/System/System.ComponentModel/LicenseProviderAttribute.cs @@ -61,7 +61,7 @@ namespace System.ComponentModel public override object TypeId { get { // Seems to be MS implementation - return (base.ToString() + Provider.ToString()); + return (base.ToString() + (Provider != null ? Provider.ToString() : null)); } } diff --git a/mcs/class/System/System.ComponentModel/TypeDescriptor.cs b/mcs/class/System/System.ComponentModel/TypeDescriptor.cs index 2a9f4b29a24..ab40a250170 100644 --- a/mcs/class/System/System.ComponentModel/TypeDescriptor.cs +++ b/mcs/class/System/System.ComponentModel/TypeDescriptor.cs @@ -39,6 +39,10 @@ using System.Globalization; using System.ComponentModel.Design; using System.Security.Permissions; +#if NET_2_0 +using System.Collections.Generic; +#endif + namespace System.ComponentModel { @@ -51,43 +55,98 @@ public sealed class TypeDescriptor private static Hashtable typeTable = new Hashtable (); private static Hashtable editors; +#if NET_2_0 + static object typeDescriptionProvidersLock = new object (); + static Dictionary > typeDescriptionProviders; + + static object componentDescriptionProvidersLock = new object (); + static Dictionary > componentDescriptionProviders; + + static TypeDescriptor () + { + typeDescriptionProviders = new Dictionary > (); + componentDescriptionProviders = new Dictionary > (new WeakObjectWrapperComparer ()); + } +#endif private TypeDescriptor () { } #if NET_2_0 - [MonoNotSupported ("")] + [MonoNotSupported ("Mono does not support COM")] [EditorBrowsable (EditorBrowsableState.Advanced)] public static Type ComObjectType { get { throw new NotImplementedException (); } } - [MonoNotSupported("")] [EditorBrowsable (EditorBrowsableState.Advanced)] public static TypeDescriptionProvider AddAttributes (object instance, params Attribute [] attributes) { - throw new NotImplementedException (); + if (instance == null) + throw new ArgumentNullException ("instance"); + if (attributes == null) + throw new ArgumentNullException ("attributes"); + + var ret = new AttributeProvider (attributes, GetProvider (instance)); + AddProvider (ret, instance); + + return ret; } - [MonoNotSupported("")] [EditorBrowsable (EditorBrowsableState.Advanced)] public static TypeDescriptionProvider AddAttributes (Type type, params Attribute [] attributes) { - throw new NotImplementedException (); - } + if (type == null) + throw new ArgumentNullException ("type"); + if (attributes == null) + throw new ArgumentNullException ("attributes"); - [MonoNotSupported("")] + var ret = new AttributeProvider (attributes, GetProvider (type)); + AddProvider (ret, type); + + return ret; + } + [EditorBrowsable (EditorBrowsableState.Advanced)] public static void AddProvider (TypeDescriptionProvider provider, object instance) { - throw new NotImplementedException (); + if (provider == null) + throw new ArgumentNullException ("provider"); + if (instance == null) + throw new ArgumentNullException ("instance"); + + lock (componentDescriptionProvidersLock) { + LinkedList plist; + WeakObjectWrapper instanceWrapper = new WeakObjectWrapper (instance); + + if (!componentDescriptionProviders.TryGetValue (instanceWrapper, out plist)) { + plist = new LinkedList (); + componentDescriptionProviders.Add (new WeakObjectWrapper (instance), plist); + } + + plist.AddLast (provider); + instanceWrapper = null; + } } - [MonoNotSupported("")] [EditorBrowsable (EditorBrowsableState.Advanced)] public static void AddProvider (TypeDescriptionProvider provider, Type type) { - throw new NotImplementedException (); + if (provider == null) + throw new ArgumentNullException ("provider"); + if (type == null) + throw new ArgumentNullException ("type"); + + lock (typeDescriptionProvidersLock) { + LinkedList plist; + + if (!typeDescriptionProviders.TryGetValue (type, out plist)) { + plist = new LinkedList (); + typeDescriptionProviders.Add (type, plist); + } + + plist.AddLast (provider); + } } [MonoTODO] @@ -695,32 +754,65 @@ public sealed class TypeDescriptor } #if NET_2_0 - [MonoNotSupported ("")] [EditorBrowsable (EditorBrowsableState.Advanced)] public static TypeDescriptionProvider GetProvider (object instance) { - throw new NotImplementedException (); + if (instance == null) + throw new ArgumentNullException ("instance"); + + TypeDescriptionProvider ret = null; + lock (componentDescriptionProvidersLock) { + LinkedList plist; + WeakObjectWrapper instanceWrapper = new WeakObjectWrapper (instance); + + if (componentDescriptionProviders.TryGetValue (instanceWrapper, out plist) && plist.Count > 0) + ret = plist.Last.Value; + + instanceWrapper = null; + } + + if (ret == null) + return new DefaultTypeDescriptionProvider (); + else + return new WrappedTypeDescriptionProvider (ret); } - [MonoNotSupported ("")] [EditorBrowsable (EditorBrowsableState.Advanced)] public static TypeDescriptionProvider GetProvider (Type type) { - throw new NotImplementedException (); + if (type == null) + throw new ArgumentNullException ("type"); + + TypeDescriptionProvider ret = null; + lock (typeDescriptionProvidersLock) { + LinkedList plist; + + if (typeDescriptionProviders.TryGetValue (type, out plist) && plist.Count > 0) + ret = plist.Last.Value; + } + + if (ret == null) + return new DefaultTypeDescriptionProvider (); + else + return new WrappedTypeDescriptionProvider (ret); } - [MonoNotSupported ("")] [EditorBrowsable (EditorBrowsableState.Advanced)] public static Type GetReflectionType (object instance) { - throw new NotImplementedException (); + if (instance == null) + throw new ArgumentNullException ("instance"); + + return instance.GetType (); } - [MonoNotSupported ("")] [EditorBrowsable (EditorBrowsableState.Advanced)] public static Type GetReflectionType (Type type) { - throw new NotImplementedException (); + if (type == null) + throw new ArgumentNullException ("type"); + + return type; } [MonoNotSupported("Associations not supported")] @@ -751,18 +843,73 @@ public sealed class TypeDescriptor throw new NotImplementedException (); } - [MonoNotSupported ("")] [EditorBrowsable (EditorBrowsableState.Advanced)] public static void RemoveProvider (TypeDescriptionProvider provider, object instance) { - throw new NotImplementedException (); + if (provider == null) + throw new ArgumentNullException ("provider"); + if (instance == null) + throw new ArgumentNullException ("instance"); + + bool removed = false; + lock (componentDescriptionProvidersLock) { + LinkedList plist; + WeakObjectWrapper instanceWrapper = new WeakObjectWrapper (instance); + + if (componentDescriptionProviders.TryGetValue (instanceWrapper, out plist) && plist.Count > 0) { + RemoveProvider (provider, plist); + removed = true; + } + + instanceWrapper = null; + } + + var refreshed = Refreshed; + if (refreshed != null) + refreshed (new RefreshEventArgs (instance)); } - [MonoNotSupported ("")] [EditorBrowsable (EditorBrowsableState.Advanced)] public static void RemoveProvider (TypeDescriptionProvider provider, Type type) { - throw new NotImplementedException (); + if (provider == null) + throw new ArgumentNullException ("provider"); + if (type == null) + throw new ArgumentNullException ("type"); + + bool removed = false; + lock (typeDescriptionProvidersLock) { + LinkedList plist; + + if (typeDescriptionProviders.TryGetValue (type, out plist) && plist.Count > 0) { + RemoveProvider (provider, plist); + removed = true; + } + } + + var refreshed = Refreshed; + if (refreshed != null) + refreshed (new RefreshEventArgs (type)); + } + + static void RemoveProvider (TypeDescriptionProvider provider, LinkedList plist) + { + LinkedListNode node = plist.Last; + LinkedListNode first = plist.First; + TypeDescriptionProvider p; + + do { + p = node.Value; + if (p == provider) { + plist.Remove (node); + break; + } + if (node == first) + break; + + node = node.Previous; + + } while (true); } #endif @@ -874,6 +1021,197 @@ public sealed class TypeDescriptor type = Type.GetType (typeName); return type; } + +#if NET_2_0 + sealed class AttributeProvider : TypeDescriptionProvider + { + Attribute[] attributes; + + public AttributeProvider (Attribute[] attributes, TypeDescriptionProvider parent) + : base (parent) + { + this.attributes = attributes; + } + + public override ICustomTypeDescriptor GetTypeDescriptor (Type type, object instance) + { + return new AttributeTypeDescriptor (base.GetTypeDescriptor (type, instance), attributes); + } + + sealed class AttributeTypeDescriptor : CustomTypeDescriptor + { + Attribute[] attributes; + + public AttributeTypeDescriptor (ICustomTypeDescriptor parent, Attribute[] attributes) + : base (parent) + { + this.attributes = attributes; + } + + public override AttributeCollection GetAttributes () + { + AttributeCollection attrs = base.GetAttributes (); + + if (attrs != null && attrs.Count > 0) + return AttributeCollection.FromExisting (attrs, attributes); + else + return new AttributeCollection (attributes); + } + } + } + + sealed class WrappedTypeDescriptionProvider : TypeDescriptionProvider + { + public TypeDescriptionProvider Wrapped { get; private set; } + + public WrappedTypeDescriptionProvider (TypeDescriptionProvider wrapped) + { + Wrapped = wrapped; + } + + public override object CreateInstance (IServiceProvider provider, Type objectType, Type[] argTypes, object[] args) + { + TypeDescriptionProvider wrapped = Wrapped; + + if (wrapped == null) + return base.CreateInstance (provider, objectType, argTypes, args); + + return wrapped.CreateInstance (provider, objectType, argTypes, args); + } + + public override IDictionary GetCache (object instance) + { + TypeDescriptionProvider wrapped = Wrapped; + + if (wrapped == null) + return base.GetCache (instance); + + return wrapped.GetCache (instance); + } + + public override ICustomTypeDescriptor GetExtendedTypeDescriptor (object instance) + { + return new DefaultTypeDescriptor (this, null, instance); + } + + public override string GetFullComponentName (object component) + { + TypeDescriptionProvider wrapped = Wrapped; + + if (wrapped == null) + return base.GetFullComponentName (component); + + return wrapped.GetFullComponentName (component); + } + + public override Type GetReflectionType (Type type, object instance) + { + TypeDescriptionProvider wrapped = Wrapped; + + if (wrapped == null) + return base.GetReflectionType (type, instance); + + return wrapped.GetReflectionType (type, instance); + } + + public override ICustomTypeDescriptor GetTypeDescriptor (Type objectType, object instance) + { + return new DefaultTypeDescriptor (this, objectType, instance); + } + } + + // TODO: this needs more work + sealed class DefaultTypeDescriptor : CustomTypeDescriptor + { + TypeDescriptionProvider owner; + Type objectType; + object instance; + + public DefaultTypeDescriptor (TypeDescriptionProvider owner, Type objectType, object instance) + { + this.owner = owner; + this.objectType = objectType; + this.instance = instance; + } + + public override AttributeCollection GetAttributes () + { + var wrapped = owner as WrappedTypeDescriptionProvider; + + if (wrapped != null) + return wrapped.Wrapped.GetTypeDescriptor (objectType, instance).GetAttributes (); + + if (instance != null) + return TypeDescriptor.GetAttributes (instance, false); + + if (objectType != null) + return TypeDescriptor.GetTypeInfo (objectType).GetAttributes (); + + return base.GetAttributes (); + } + + public override string GetClassName () + { + var wrapped = owner as WrappedTypeDescriptionProvider; + + if (wrapped != null) + return wrapped.Wrapped.GetTypeDescriptor (objectType, instance).GetClassName (); + + return base.GetClassName (); + } + + public override PropertyDescriptor GetDefaultProperty () + { + var wrapped = owner as WrappedTypeDescriptionProvider; + + if (wrapped != null) + return wrapped.Wrapped.GetTypeDescriptor (objectType, instance).GetDefaultProperty (); + + PropertyDescriptor ret; + if (objectType != null) + ret = TypeDescriptor.GetTypeInfo (objectType).GetDefaultProperty (); + else if (instance != null) + ret = TypeDescriptor.GetTypeInfo (instance.GetType ()).GetDefaultProperty (); + else + ret = base.GetDefaultProperty (); + + return ret; + } + + public override PropertyDescriptorCollection GetProperties () + { + var wrapped = owner as WrappedTypeDescriptionProvider; + + if (wrapped != null) + return wrapped.Wrapped.GetTypeDescriptor (objectType, instance).GetProperties (); + + if (instance != null) + return TypeDescriptor.GetProperties (instance, null, false); + + if (objectType != null) + return TypeDescriptor.GetTypeInfo (objectType).GetProperties (null); + + return base.GetProperties (); + } + } + + sealed class DefaultTypeDescriptionProvider : TypeDescriptionProvider + { + public DefaultTypeDescriptionProvider () + { + } + + public override ICustomTypeDescriptor GetExtendedTypeDescriptor (object instance) + { + return new DefaultTypeDescriptor (this, null, instance); + } + + public override ICustomTypeDescriptor GetTypeDescriptor (Type objectType, object instance) + { + return new DefaultTypeDescriptor (this, objectType, instance); + } + } +#endif } internal abstract class Info diff --git a/mcs/class/System/System.ComponentModel/WeakObjectWrapper.cs b/mcs/class/System/System.ComponentModel/WeakObjectWrapper.cs new file mode 100644 index 00000000000..8bf426906f8 --- /dev/null +++ b/mcs/class/System/System.ComponentModel/WeakObjectWrapper.cs @@ -0,0 +1,51 @@ +// +// System.ComponentModel.WeakObjectWrapper.cs +// +// Authors: +// Marek Habersack +// +// +// (C) 2009 Novell, Inc (http://novell.com) +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if NET_2_0 +using System; +using System.Collections; +using System.Collections.Generic; + +namespace System.ComponentModel +{ + sealed class WeakObjectWrapper + { + public int TargetHashCode { get; private set; } + public WeakReference Weak { get; private set; } + + public WeakObjectWrapper (object target) + { + TargetHashCode = target.GetHashCode (); + Weak = new WeakReference (target); + } + } +} +#endif \ No newline at end of file diff --git a/mcs/class/System/System.ComponentModel/WeakObjectWrapperComparer.cs b/mcs/class/System/System.ComponentModel/WeakObjectWrapperComparer.cs new file mode 100644 index 00000000000..830ced2a920 --- /dev/null +++ b/mcs/class/System/System.ComponentModel/WeakObjectWrapperComparer.cs @@ -0,0 +1,67 @@ +// +// System.ComponentModel.WeakObjectWrapperComparer.cs +// +// Authors: +// Marek Habersack +// +// +// (C) 2009 Novell, Inc (http://novell.com) +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if NET_2_0 +using System; +using System.Collections; +using System.Collections.Generic; + +namespace System.ComponentModel +{ + sealed class WeakObjectWrapperComparer : EqualityComparer + { + public override bool Equals (WeakObjectWrapper x, WeakObjectWrapper y) + { + if (x == null && y == null) + return false; + + if (x == null || y == null) + return false; + + WeakReference xWeak = x.Weak; + WeakReference yWeak = y.Weak; + + if (!xWeak.IsAlive && !yWeak.IsAlive) + return false; + + return xWeak.Target == yWeak.Target; + } + + public override int GetHashCode (WeakObjectWrapper obj) + { + if (obj == null) + return 0; + + return obj.TargetHashCode; + } + } +} +#endif diff --git a/mcs/class/System/System.Configuration/ChangeLog b/mcs/class/System/System.Configuration/ChangeLog index 8656d476393..261a378fe80 100644 --- a/mcs/class/System/System.Configuration/ChangeLog +++ b/mcs/class/System/System.Configuration/ChangeLog @@ -1,3 +1,9 @@ +2009-06-18 Gonzalo Paniagua Javier + + * IriParsingElement.cs: + * UriSection.cs: + * IdnElement.cs: new files that parse and subelements. + 2009-06-05 Marek Safar * DictionarySectionHandler.cs, NameValueSectionHandler.cs, diff --git a/mcs/class/System/System.Configuration/IdnElement.cs b/mcs/class/System/System.Configuration/IdnElement.cs new file mode 100644 index 00000000000..eaef8fb9e5f --- /dev/null +++ b/mcs/class/System/System.Configuration/IdnElement.cs @@ -0,0 +1,79 @@ +// +// System.Configuration.IdnElement.cs +// +// Authors: +// Gonzalo Paniagua Javier (gonzalo@novell.com) +// +// (c) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if NET_2_0 && CONFIGURATION_DEP +using System; + +namespace System.Configuration +{ + public sealed class IdnElement : ConfigurationElement + { + static ConfigurationPropertyCollection properties; + static ConfigurationProperty enabled_prop; + + static IdnElement () + { + enabled_prop = new ConfigurationProperty ("enabled", typeof (UriIdnScope), UriIdnScope.None, ConfigurationPropertyOptions.IsRequired | ConfigurationPropertyOptions.IsKey); + properties = new ConfigurationPropertyCollection (); + properties.Add (enabled_prop); + } + + public IdnElement () + { + } + + [ConfigurationPropertyAttribute("enabled", DefaultValue = UriIdnScope.None, + Options = ConfigurationPropertyOptions.IsRequired | ConfigurationPropertyOptions.IsKey)] + public UriIdnScope Enabled { + get { return (UriIdnScope) base [enabled_prop]; } + set { base [enabled_prop] = value; } + } + + protected override ConfigurationPropertyCollection Properties { + get { return properties; } + } + + public override bool Equals (object o) + { + IdnElement e = o as IdnElement; + if (e == null) + return false; + + return e.Enabled == Enabled; + } + + public override int GetHashCode () + { + return (int) Enabled ^ 0x7F; + } + } + +} + +#endif + diff --git a/mcs/class/System/System.Configuration/IriParsingElement.cs b/mcs/class/System/System.Configuration/IriParsingElement.cs new file mode 100644 index 00000000000..38dddbf523c --- /dev/null +++ b/mcs/class/System/System.Configuration/IriParsingElement.cs @@ -0,0 +1,79 @@ +// +// System.Configuration.IriParsingElement.cs +// +// Authors: +// Gonzalo Paniagua Javier (gonzalo@novell.com) +// +// (c) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if NET_2_0 && CONFIGURATION_DEP +using System; + +namespace System.Configuration +{ + public sealed class IriParsingElement : ConfigurationElement + { + static ConfigurationPropertyCollection properties; + static ConfigurationProperty enabled_prop; + + static IriParsingElement () + { + enabled_prop = new ConfigurationProperty ("enabled", typeof (bool), false, ConfigurationPropertyOptions.IsRequired | ConfigurationPropertyOptions.IsKey); + properties = new ConfigurationPropertyCollection (); + properties.Add (enabled_prop); + } + + public IriParsingElement () + { + } + + [ConfigurationProperty ("enabled", DefaultValue = false, + Options = ConfigurationPropertyOptions.IsRequired | ConfigurationPropertyOptions.IsKey)] + public bool Enabled { + get { return (bool) base [enabled_prop]; } + set { base [enabled_prop] = value; } + } + + protected override ConfigurationPropertyCollection Properties { + get { return properties; } + } + + public override bool Equals (object o) + { + IriParsingElement e = o as IriParsingElement; + if (e == null) + return false; + + return e.Enabled == Enabled; + } + + public override int GetHashCode () + { + return Convert.ToInt32 (Enabled) ^ 0x7F; + } + } + +} + +#endif + diff --git a/mcs/class/System/System.Configuration/UriSection.cs b/mcs/class/System/System.Configuration/UriSection.cs new file mode 100644 index 00000000000..ab9ac841945 --- /dev/null +++ b/mcs/class/System/System.Configuration/UriSection.cs @@ -0,0 +1,83 @@ +// +// UriSection.cs +// +// Authors: +// Gonzalo Paniagua Javier (gonzalo@novell.com) +// +// (c) 2009 Novell, Inc. (http://www.novell.com) +// +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if NET_2_0 && CONFIGURATION_DEP + +using System.Configuration; + +namespace System.Configuration +{ + public sealed class UriSection : ConfigurationSection + { + #region Fields + + static ConfigurationPropertyCollection properties; + static ConfigurationProperty idn_prop; + static ConfigurationProperty iriParsing_prop; + + #endregion // Fields + + #region Constructors + + static UriSection () + { + idn_prop = new ConfigurationProperty ("idn", typeof (IdnElement), null); + iriParsing_prop = new ConfigurationProperty ( "iriParsing", typeof (IriParsingElement), null); + properties = new ConfigurationPropertyCollection (); + properties.Add (idn_prop); + properties.Add (iriParsing_prop); + } + + public UriSection () + { + } + + #endregion // Constructors + + #region Properties + + [ConfigurationProperty ("idn")] + public IdnElement Idn { + get { return (IdnElement) base [idn_prop]; } + } + + [ConfigurationProperty ("iriParsing")] + public IriParsingElement IriParsing { + get { return (IriParsingElement) base [iriParsing_prop]; } + } + + protected override ConfigurationPropertyCollection Properties { + get { return properties; } + } + + #endregion // Properties + } +} + +#endif diff --git a/mcs/class/System/System.Diagnostics/ChangeLog b/mcs/class/System/System.Diagnostics/ChangeLog index c96354eabd2..ec1b366bb92 100644 --- a/mcs/class/System/System.Diagnostics/ChangeLog +++ b/mcs/class/System/System.Diagnostics/ChangeLog @@ -1,3 +1,8 @@ +2009-07-10 Gonzalo Paniagua Javier + + * ProcessStartInfo.cs: HaveEnvVars is enabled by just using the + EnvironmentVariables property. Bug #520650 fixed. + 2009-05-12 Jonathan Pryor * DiagnosticsConfigurationHandler.cs: Use the new diff --git a/mcs/class/System/System.Diagnostics/ProcessStartInfo.cs b/mcs/class/System/System.Diagnostics/ProcessStartInfo.cs index f47c402696b..1d7e4fe63a6 100644 --- a/mcs/class/System/System.Diagnostics/ProcessStartInfo.cs +++ b/mcs/class/System/System.Diagnostics/ProcessStartInfo.cs @@ -131,7 +131,7 @@ namespace System.Diagnostics } internal bool HaveEnvVars { - get { return (envVars != null && envVars.Count > 0); } + get { return (envVars != null); } } [DefaultValue (false)] diff --git a/mcs/class/System/System.Net.NetworkInformation/IPInterfaceProperties.cs b/mcs/class/System/System.Net.NetworkInformation/IPInterfaceProperties.cs index 1c795162892..84c5d994bea 100644 --- a/mcs/class/System/System.Net.NetworkInformation/IPInterfaceProperties.cs +++ b/mcs/class/System/System.Net.NetworkInformation/IPInterfaceProperties.cs @@ -142,7 +142,6 @@ namespace System.Net.NetworkInformation { } } - [MonoTODO ("Always returns an empty collection.")] public override IPAddressCollection DnsAddresses { get { ParseResolvConf (); @@ -150,7 +149,6 @@ namespace System.Net.NetworkInformation { } } - [MonoTODO ("Does not return anything.")] public override string DnsSuffix { get { ParseResolvConf (); diff --git a/mcs/class/System/System.Net.Security/RemoteCertificateValidationCallback.cs b/mcs/class/System/System.Net.Security/RemoteCertificateValidationCallback.cs index a23d8607d7c..c7ab73a319a 100644 --- a/mcs/class/System/System.Net.Security/RemoteCertificateValidationCallback.cs +++ b/mcs/class/System/System.Net.Security/RemoteCertificateValidationCallback.cs @@ -29,17 +29,26 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // -#if NET_2_0 && SECURITY_DEP +#if NET_2_0 using System.Security.Cryptography.X509Certificates; namespace System.Net.Security { - public delegate bool RemoteCertificateValidationCallback ( +#if !NET_2_1 + public +#endif + delegate bool RemoteCertificateValidationCallback ( object sender, +#if !NET_2_1 X509Certificate certificate, X509Chain chain, +#else + object certificate, + object chain, +#endif SslPolicyErrors sslPolicyErrors); } #endif + diff --git a/mcs/class/System/System.Net.Sockets/ChangeLog b/mcs/class/System/System.Net.Sockets/ChangeLog index 0c40cec58cd..718eb826055 100644 --- a/mcs/class/System/System.Net.Sockets/ChangeLog +++ b/mcs/class/System/System.Net.Sockets/ChangeLog @@ -1,3 +1,41 @@ +2009-06-28 Gert Driesen + + * Socket.cs: Modified some argument names to match MS. Moved disposed + check before argument checks in Receive. Use SocketError.InvalidArgument + instead of using magic numbers. Added back comments that was + accidentally removed in my previous commit. + * Socket_2_1.cs: Modified some argument names to match MS. + +2009-06-28 Gert Driesen + + * Socket.cs: In GetSocketOption, throw SocketException when (byte []) + option value is null. Use SocketError fields instead of using "magic" + number. In SetSocketOption (SocketOptionLevel, SocketOptionName, object) + only accept Linger, AddMembership, DropMembership and verify option + value. + * MulticastOption.cs: Added argument checks. Save interfaceIndex that is + passed to .ctor, and removed MonoTODO. Renamed arguments to match MS. + Reset InterfaceIndex when LocalAddress is modified, and reset + LocalAddress when InterfaceIndex is modified. + * UdpClient.cs: Modified exception to more closely match MS. Fixed + (int, AddressFamily) .ctor to construct IPv6 endpoint when family is + InterNetworkV6. Added null check for multicastAddr to (IPAddress) + JoinMulticastGroup overload. In (int, IPAddress) and (IPAddress, + IPAddress) overloads of JoinMulticastGroup throw SocketException when + client is IPv4. Added null check for multicastAddr to (IPAddress, int), + overload, and moved JoinMulticastGroup call after argument checks. + * IPv6MulticastOption.cs: Renamed argument names to match MS. Added + null check to set_Group. Added range check to set_InterfaceIndex. + +2009-06-27 Gonzalo Paniagua Javier + + * Socket.cs: turn WSAEINVAL into ArgumentException. + +2009-06-26 Gonzalo Paniagua Javier + + * Socket.cs: MS throws a SocketException in the byte[] overload when + the value is null. + 2009-05-22 Sebastien Pouliot * Socket_2_1.cs: Do not throw a SecurityException if the security diff --git a/mcs/class/System/System.Net.Sockets/IPv6MulticastOption.cs b/mcs/class/System/System.Net.Sockets/IPv6MulticastOption.cs index fec4b7d7808..9b3631bd4a9 100644 --- a/mcs/class/System/System.Net.Sockets/IPv6MulticastOption.cs +++ b/mcs/class/System/System.Net.Sockets/IPv6MulticastOption.cs @@ -47,28 +47,37 @@ namespace System.Net.Sockets public IPv6MulticastOption (IPAddress group) : this (group, 0) { - } - public IPv6MulticastOption (IPAddress group, long ifIndex) + public IPv6MulticastOption (IPAddress group, long ifindex) { if (group == null) - throw new ArgumentNullException ("grp"); + throw new ArgumentNullException ("group"); + if (ifindex < 0 || ifindex > 0xffffffff) + throw new ArgumentOutOfRangeException ("ifindex"); this.group = group; - this.ifIndex = ifIndex; + this.ifIndex = ifindex; } public IPAddress Group { get { return group; } - set { group = value; } + set { + if (value == null) + throw new ArgumentNullException ("value"); + group = value; + } } public long InterfaceIndex { get { return ifIndex; } - set { ifIndex = value; } + set { + if (value < 0 || value > 0xffffffff) + throw new ArgumentOutOfRangeException ("value"); + ifIndex = value; + } } } #endif diff --git a/mcs/class/System/System.Net.Sockets/MulticastOption.cs b/mcs/class/System/System.Net.Sockets/MulticastOption.cs index 35a8a360d55..68f2d76b95c 100644 --- a/mcs/class/System/System.Net.Sockets/MulticastOption.cs +++ b/mcs/class/System/System.Net.Sockets/MulticastOption.cs @@ -46,28 +46,33 @@ namespace System.Net.Sockets int iface_index; #endif - public MulticastOption (IPAddress grp) - : this (grp, IPAddress.Any) + public MulticastOption (IPAddress group) + : this (group, IPAddress.Any) { - group = grp; } + #if NET_2_0 - [MonoTODO ("Get interface IP from interface index")] public MulticastOption (IPAddress group, int interfaceIndex) { + if (group == null) + throw new ArgumentNullException ("group"); + if (interfaceIndex < 0 || interfaceIndex > 0xffffff) + throw new ArgumentOutOfRangeException ("interfaceIndex"); + this.group = group; + this.iface_index = interfaceIndex; } #endif - public MulticastOption (IPAddress grp, IPAddress addr) - { - if (grp == null) - throw new ArgumentNullException ("grp"); - if (addr == null) - throw new ArgumentNullException ("addr"); + public MulticastOption (IPAddress group, IPAddress mcint) + { + if (group == null) + throw new ArgumentNullException ("group"); + if (mcint == null) + throw new ArgumentNullException ("mcint"); - group = grp; - local = addr; + this.group = group; + this.local = mcint; } public IPAddress Group { @@ -77,13 +82,23 @@ namespace System.Net.Sockets public IPAddress LocalAddress { get { return local; } - set { local = value; } + set { + local = value; +#if NET_2_0 + iface_index = 0; +#endif + } } #if NET_2_0 public int InterfaceIndex { get { return iface_index; } - set { iface_index = value; } + set { + if (value < 0 || value > 0xffffff) + throw new ArgumentOutOfRangeException ("value"); + iface_index = value; + local = null; + } } #endif } diff --git a/mcs/class/System/System.Net.Sockets/Socket.cs b/mcs/class/System/System.Net.Sockets/Socket.cs index 8f0c98d3a49..2435e1ba914 100644 --- a/mcs/class/System/System.Net.Sockets/Socket.cs +++ b/mcs/class/System/System.Net.Sockets/Socket.cs @@ -2172,28 +2172,32 @@ namespace System.Net.Sockets SocketOptionLevel level, SocketOptionName name, ref byte[] byte_val, out int error); - public void GetSocketOption (SocketOptionLevel level, SocketOptionName name, byte [] opt_value) + public void GetSocketOption (SocketOptionLevel optionLevel, SocketOptionName optionName, byte [] optionValue) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); + if (optionValue == null) + throw new SocketException ((int) SocketError.Fault, + "Error trying to dereference an invalid pointer"); + int error; - - GetSocketOption_arr_internal(socket, level, name, ref opt_value, + + GetSocketOption_arr_internal (socket, optionLevel, optionName, ref optionValue, out error); if (error != 0) throw new SocketException (error); } - public byte [] GetSocketOption (SocketOptionLevel level, SocketOptionName name, int length) + public byte [] GetSocketOption (SocketOptionLevel optionLevel, SocketOptionName optionName, int length) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); byte[] byte_val=new byte[length]; int error; - - GetSocketOption_arr_internal(socket, level, name, ref byte_val, + + GetSocketOption_arr_internal (socket, optionLevel, optionName, ref byte_val, out error); if (error != 0) throw new SocketException (error); @@ -2298,17 +2302,17 @@ namespace System.Net.Sockets return result; } - public int Receive (byte [] buf) + public int Receive (byte [] buffer) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - if (buf == null) - throw new ArgumentNullException ("buf"); + if (buffer == null) + throw new ArgumentNullException ("buffer"); SocketError error; - int ret = Receive_nochecks (buf, 0, buf.Length, SocketFlags.None, out error); + int ret = Receive_nochecks (buffer, 0, buffer.Length, SocketFlags.None, out error); if (error != SocketError.Success) throw new SocketException ((int) error); @@ -2316,17 +2320,17 @@ namespace System.Net.Sockets return ret; } - public int Receive (byte [] buf, SocketFlags flags) + public int Receive (byte [] buffer, SocketFlags flags) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - if (buf == null) - throw new ArgumentNullException ("buf"); + if (buffer == null) + throw new ArgumentNullException ("buffer"); SocketError error; - int ret = Receive_nochecks (buf, 0, buf.Length, flags, out error); + int ret = Receive_nochecks (buffer, 0, buffer.Length, flags, out error); if (error != SocketError.Success) { if (error == SocketError.WouldBlock && blocking) // This might happen when ReceiveTimeout is set @@ -2337,20 +2341,20 @@ namespace System.Net.Sockets return ret; } - public int Receive (byte [] buf, int size, SocketFlags flags) + public int Receive (byte [] buffer, int size, SocketFlags flags) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - if (buf == null) - throw new ArgumentNullException ("buf"); + if (buffer == null) + throw new ArgumentNullException ("buffer"); - if (size < 0 || size > buf.Length) + if (size < 0 || size > buffer.Length) throw new ArgumentOutOfRangeException ("size"); SocketError error; - int ret = Receive_nochecks (buf, 0, size, flags, out error); + int ret = Receive_nochecks (buffer, 0, size, flags, out error); if (error != SocketError.Success) { if (error == SocketError.WouldBlock && blocking) // This might happen when ReceiveTimeout is set @@ -2361,23 +2365,23 @@ namespace System.Net.Sockets return ret; } - public int Receive (byte [] buf, int offset, int size, SocketFlags flags) + public int Receive (byte [] buffer, int offset, int size, SocketFlags flags) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - if (buf == null) - throw new ArgumentNullException ("buf"); + if (buffer == null) + throw new ArgumentNullException ("buffer"); - if (offset < 0 || offset > buf.Length) + if (offset < 0 || offset > buffer.Length) throw new ArgumentOutOfRangeException ("offset"); - if (size < 0 || offset + size > buf.Length) + if (size < 0 || offset + size > buffer.Length) throw new ArgumentOutOfRangeException ("size"); SocketError error; - int ret = Receive_nochecks (buf, offset, size, flags, out error); + int ret = Receive_nochecks (buffer, offset, size, flags, out error); if (error != SocketError.Success) { if (error == SocketError.WouldBlock && blocking) // This might happen when ReceiveTimeout is set @@ -2389,21 +2393,21 @@ namespace System.Net.Sockets } #if NET_2_0 - public int Receive (byte [] buf, int offset, int size, SocketFlags flags, out SocketError error) + public int Receive (byte [] buffer, int offset, int size, SocketFlags flags, out SocketError error) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - if (buf == null) - throw new ArgumentNullException ("buf"); + if (buffer == null) + throw new ArgumentNullException ("buffer"); - if (offset < 0 || offset > buf.Length) + if (offset < 0 || offset > buffer.Length) throw new ArgumentOutOfRangeException ("offset"); - if (size < 0 || offset + size > buf.Length) + if (size < 0 || offset + size > buffer.Length) throw new ArgumentOutOfRangeException ("size"); - return Receive_nochecks (buf, offset, size, flags, out error); + return Receive_nochecks (buffer, offset, size, flags, out error); } [MethodImplAttribute (MethodImplOptions.InternalCall)] @@ -2445,18 +2449,17 @@ namespace System.Net.Sockets SocketFlags socketFlags, out SocketError errorCode) { + if (disposed && closed) + throw new ObjectDisposedException (GetType ().ToString ()); + if (buffers == null || buffers.Count == 0) { throw new ArgumentNullException ("buffers"); } - - if (disposed && closed) { - throw new ObjectDisposedException (GetType ().ToString ()); - } int numsegments = buffers.Count; int nativeError; - int ret; + int ret; /* Only example I can find of sending a byte * array reference directly into an internal @@ -2509,51 +2512,51 @@ namespace System.Net.Sockets return true; } #endif - - public int ReceiveFrom (byte [] buf, ref EndPoint remote_end) + + public int ReceiveFrom (byte [] buffer, ref EndPoint remoteEP) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - if (buf == null) - throw new ArgumentNullException ("buf"); + if (buffer == null) + throw new ArgumentNullException ("buffer"); - if (remote_end == null) - throw new ArgumentNullException ("remote_end"); + if (remoteEP == null) + throw new ArgumentNullException ("remoteEP"); - return ReceiveFrom_nochecks (buf, 0, buf.Length, SocketFlags.None, ref remote_end); + return ReceiveFrom_nochecks (buffer, 0, buffer.Length, SocketFlags.None, ref remoteEP); } - public int ReceiveFrom (byte [] buf, SocketFlags flags, ref EndPoint remote_end) + public int ReceiveFrom (byte [] buffer, SocketFlags flags, ref EndPoint remoteEP) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - if (buf == null) - throw new ArgumentNullException ("buf"); + if (buffer == null) + throw new ArgumentNullException ("buffer"); - if (remote_end == null) - throw new ArgumentNullException ("remote_end"); + if (remoteEP == null) + throw new ArgumentNullException ("remoteEP"); - return ReceiveFrom_nochecks (buf, 0, buf.Length, flags, ref remote_end); + return ReceiveFrom_nochecks (buffer, 0, buffer.Length, flags, ref remoteEP); } - public int ReceiveFrom (byte [] buf, int size, SocketFlags flags, - ref EndPoint remote_end) + public int ReceiveFrom (byte [] buffer, int size, SocketFlags flags, + ref EndPoint remoteEP) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - if (buf == null) - throw new ArgumentNullException ("buf"); + if (buffer == null) + throw new ArgumentNullException ("buffer"); - if (remote_end == null) - throw new ArgumentNullException ("remote_end"); + if (remoteEP == null) + throw new ArgumentNullException ("remoteEP"); - if (size < 0 || size > buf.Length) + if (size < 0 || size > buffer.Length) throw new ArgumentOutOfRangeException ("size"); - return ReceiveFrom_nochecks (buf, 0, size, flags, ref remote_end); + return ReceiveFrom_nochecks (buffer, 0, size, flags, ref remoteEP); } [MethodImplAttribute(MethodImplOptions.InternalCall)] @@ -2565,25 +2568,25 @@ namespace System.Net.Sockets ref SocketAddress sockaddr, out int error); - public int ReceiveFrom (byte [] buf, int offset, int size, SocketFlags flags, - ref EndPoint remote_end) + public int ReceiveFrom (byte [] buffer, int offset, int size, SocketFlags flags, + ref EndPoint remoteEP) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - if (buf == null) - throw new ArgumentNullException ("buf"); + if (buffer == null) + throw new ArgumentNullException ("buffer"); - if (remote_end == null) - throw new ArgumentNullException ("remote_end"); + if (remoteEP == null) + throw new ArgumentNullException ("remoteEP"); - if (offset < 0 || offset > buf.Length) + if (offset < 0 || offset > buffer.Length) throw new ArgumentOutOfRangeException ("offset"); - if (size < 0 || offset + size > buf.Length) + if (size < 0 || offset + size > buffer.Length) throw new ArgumentOutOfRangeException ("size"); - return ReceiveFrom_nochecks (buf, offset, size, flags, ref remote_end); + return ReceiveFrom_nochecks (buffer, offset, size, flags, ref remoteEP); } internal int ReceiveFrom_nochecks (byte [] buf, int offset, int size, SocketFlags flags, @@ -3024,65 +3027,95 @@ namespace System.Net.Sockets return ret; } - public void SetSocketOption (SocketOptionLevel level, SocketOptionName name, byte[] opt_value) + public void SetSocketOption (SocketOptionLevel optionLevel, SocketOptionName optionName, byte [] optionValue) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - int error; + // I'd throw an ArgumentNullException, but this is what MS does. + if (optionValue == null) + throw new SocketException ((int) SocketError.Fault, + "Error trying to dereference an invalid pointer"); - SetSocketOption_internal(socket, level, name, null, - opt_value, 0, out error); + int error; - if (error != 0) + SetSocketOption_internal (socket, optionLevel, optionName, null, + optionValue, 0, out error); + + if (error != 0) { + if (error == (int) SocketError.InvalidArgument) + throw new ArgumentException (); throw new SocketException (error); + } } - public void SetSocketOption (SocketOptionLevel level, SocketOptionName name, object opt_value) + public void SetSocketOption (SocketOptionLevel optionLevel, SocketOptionName optionName, object optionValue) { - if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - if (opt_value == null) - throw new ArgumentNullException("opt_value"); + // NOTE: if a null is passed, the byte[] overload is used instead... + if (optionValue == null) + throw new ArgumentNullException("optionValue"); int error; - /* From MS documentation on SetSocketOption: "For an - * option with a Boolean data type, specify a nonzero - * value to enable the option, and a zero value to - * disable the option." - * Booleans are only handled in 2.0 - */ - if (opt_value is System.Boolean) { + if (optionLevel == SocketOptionLevel.Socket && optionName == SocketOptionName.Linger) { + LingerOption linger = optionValue as LingerOption; + if (linger == null) #if NET_2_0 - bool bool_val = (bool) opt_value; - int int_val = (bool_val) ? 1 : 0; - - SetSocketOption_internal (socket, level, name, null, null, int_val, out error); + throw new ArgumentException ("A 'LingerOption' value must be specified.", "optionValue"); +#else + throw new ArgumentException ("optionValue"); +#endif + SetSocketOption_internal (socket, optionLevel, optionName, linger, null, 0, out error); + } else if (optionLevel == SocketOptionLevel.IP && (optionName == SocketOptionName.AddMembership || optionName == SocketOptionName.DropMembership)) { + MulticastOption multicast = optionValue as MulticastOption; + if (multicast == null) +#if NET_2_0 + throw new ArgumentException ("A 'MulticastOption' value must be specified.", "optionValue"); +#else + throw new ArgumentException ("optionValue"); +#endif + SetSocketOption_internal (socket, optionLevel, optionName, multicast, null, 0, out error); + } else if (optionLevel == SocketOptionLevel.IPv6 && (optionName == SocketOptionName.AddMembership || optionName == SocketOptionName.DropMembership)) { + IPv6MulticastOption multicast = optionValue as IPv6MulticastOption; + if (multicast == null) +#if NET_2_0 + throw new ArgumentException ("A 'IPv6MulticastOption' value must be specified.", "optionValue"); #else - throw new ArgumentException ("Use an integer 1 (true) or 0 (false) instead of a boolean.", "opt_value"); + throw new ArgumentException ("optionValue"); #endif + SetSocketOption_internal (socket, optionLevel, optionName, multicast, null, 0, out error); } else { - SetSocketOption_internal (socket, level, name, opt_value, null, 0, out error); +#if NET_2_0 + throw new ArgumentException ("Invalid value specified.", "optionValue"); +#else + throw new ArgumentException ("optionValue"); +#endif } - if (error != 0) + if (error != 0) { + if (error == (int) SocketError.InvalidArgument) + throw new ArgumentException (); throw new SocketException (error); + } } #if NET_2_0 - public void SetSocketOption (SocketOptionLevel level, SocketOptionName name, bool optionValue) + public void SetSocketOption (SocketOptionLevel optionLevel, SocketOptionName optionName, bool optionValue) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); int error; int int_val = (optionValue) ? 1 : 0; - SetSocketOption_internal (socket, level, name, null, null, int_val, out error); - if (error != 0) + SetSocketOption_internal (socket, optionLevel, optionName, null, null, int_val, out error); + if (error != 0) { + if (error == (int) SocketError.InvalidArgument) + throw new ArgumentException (); throw new SocketException (error); + } } #endif diff --git a/mcs/class/System/System.Net.Sockets/Socket_2_1.cs b/mcs/class/System/System.Net.Sockets/Socket_2_1.cs index cf91f60c3a4..619a9d49b3b 100644 --- a/mcs/class/System/System.Net.Sockets/Socket_2_1.cs +++ b/mcs/class/System/System.Net.Sockets/Socket_2_1.cs @@ -426,38 +426,38 @@ namespace System.Net.Sockets { SocketAddress sa, out int error); - public void Connect (EndPoint remote_end) + public void Connect (EndPoint remoteEP) { SocketAddress serial = null; if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); - if (remote_end == null) - throw new ArgumentNullException("remote_end"); + if (remoteEP == null) + throw new ArgumentNullException ("remoteEP"); - if (remote_end is IPEndPoint) { - IPEndPoint ep = (IPEndPoint) remote_end; + IPEndPoint ep = remoteEP as IPEndPoint; + if (ep != null) if (ep.Address.Equals (IPAddress.Any) || ep.Address.Equals (IPAddress.IPv6Any)) throw new SocketException ((int) SocketError.AddressNotAvailable); - } + #if NET_2_1 if (protocol_type != ProtocolType.Tcp) throw new SocketException ((int) SocketError.AccessDenied); - DnsEndPoint dep = (remote_end as DnsEndPoint); + DnsEndPoint dep = (remoteEP as DnsEndPoint); if (dep != null) serial = dep.AsIPEndPoint ().Serialize (); else - serial = remote_end.Serialize (); + serial = remoteEP.Serialize (); #elif NET_2_0 /* TODO: check this for the 1.1 profile too */ if (islistening) throw new InvalidOperationException (); - serial = remote_end.Serialize (); + serial = remoteEP.Serialize (); #else - serial = remote_end.Serialize (); + serial = remoteEP.Serialize (); #endif int error = 0; @@ -482,8 +482,8 @@ namespace System.Net.Sockets { #if NET_2_0 isbound = true; #endif - - seed_endpoint = remote_end; + + seed_endpoint = remoteEP; } #if NET_2_0 @@ -615,23 +615,23 @@ namespace System.Net.Sockets { return ret; } - public object GetSocketOption (SocketOptionLevel level, SocketOptionName name) + public object GetSocketOption (SocketOptionLevel optionLevel, SocketOptionName optionName) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); object obj_val; int error; - - GetSocketOption_obj_internal(socket, level, name, out obj_val, + + GetSocketOption_obj_internal (socket, optionLevel, optionName, out obj_val, out error); if (error != 0) throw new SocketException (error); - - if (name == SocketOptionName.Linger) { + + if (optionName == SocketOptionName.Linger) { return((LingerOption)obj_val); - } else if (name==SocketOptionName.AddMembership || - name==SocketOptionName.DropMembership) { + } else if (optionName == SocketOptionName.AddMembership || + optionName == SocketOptionName.DropMembership) { return((MulticastOption)obj_val); } else if (obj_val is int) { return((int)obj_val); @@ -662,15 +662,15 @@ namespace System.Net.Sockets { byte [] byte_val, int int_val, out int error); - public void SetSocketOption (SocketOptionLevel level, SocketOptionName name, int opt_value) + public void SetSocketOption (SocketOptionLevel optionLevel, SocketOptionName optionName, int optionValue) { if (disposed && closed) throw new ObjectDisposedException (GetType ().ToString ()); int error; - - SetSocketOption_internal(socket, level, name, null, - null, opt_value, out error); + + SetSocketOption_internal (socket, optionLevel, optionName, null, + null, optionValue, out error); if (error != 0) throw new SocketException (error); diff --git a/mcs/class/System/System.Net.Sockets/UdpClient.cs b/mcs/class/System/System.Net.Sockets/UdpClient.cs index 5102cae40bc..d800b57a92a 100644 --- a/mcs/class/System/System.Net.Sockets/UdpClient.cs +++ b/mcs/class/System/System.Net.Sockets/UdpClient.cs @@ -53,7 +53,11 @@ namespace System.Net.Sockets public UdpClient(AddressFamily family) { if(family != AddressFamily.InterNetwork && family != AddressFamily.InterNetworkV6) - throw new ArgumentException("Family must be InterNetwork or InterNetworkV6", "family"); +#if NET_2_0 + throw new ArgumentException ("Family must be InterNetwork or InterNetworkV6", "family"); +#else + throw new ArgumentException ("family"); +#endif this.family = family; InitSocket (null); @@ -84,23 +88,30 @@ namespace System.Net.Sockets #if NET_1_1 public UdpClient (int port, AddressFamily family) { - if (family != AddressFamily.InterNetwork && - family != AddressFamily.InterNetworkV6) { + if (family != AddressFamily.InterNetwork && family != AddressFamily.InterNetworkV6) +#if NET_2_0 throw new ArgumentException ("Family must be InterNetwork or InterNetworkV6", "family"); - } - +#else + throw new ArgumentException ("family"); +#endif + if (port < IPEndPoint.MinPort || port > IPEndPoint.MaxPort) { throw new ArgumentOutOfRangeException ("port"); } - + this.family = family; - IPEndPoint localEP = new IPEndPoint (IPAddress.Any, port); + IPEndPoint localEP; + + if (family == AddressFamily.InterNetwork) + localEP = new IPEndPoint (IPAddress.Any, port); + else + localEP = new IPEndPoint (IPAddress.IPv6Any, port); InitSocket (localEP); } #endif - + public UdpClient (string hostname, int port) { if (hostname == null) @@ -245,6 +256,13 @@ namespace System.Net.Sockets { CheckDisposed (); + if (multicastAddr == null) +#if NET_2_0 + throw new ArgumentNullException ("multicastAddr"); +#else + throw new NullReferenceException (); +#endif + if(family == AddressFamily.InterNetwork) socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption (multicastAddr)); @@ -261,24 +279,25 @@ namespace System.Net.Sockets { CheckDisposed (); - /* Does this overload only apply to IPv6? - * Only the IPv6MulticastOption has an - * ifindex-using constructor. The MS docs - * don't say. - */ - if (family == AddressFamily.InterNetworkV6) { + if (multicastAddr == null) + throw new ArgumentNullException ("multicastAddr"); + + if (family == AddressFamily.InterNetworkV6) socket.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership, new IPv6MulticastOption (multicastAddr, ifindex)); - } + else + throw new SocketException ((int) SocketError.OperationNotSupported); } #endif - + public void JoinMulticastGroup (IPAddress multicastAddr, int timeToLive) { CheckDisposed (); - JoinMulticastGroup (multicastAddr); + if (multicastAddr == null) + throw new ArgumentNullException ("multicastAddr"); if (timeToLive < 0 || timeToLive > 255) throw new ArgumentOutOfRangeException ("timeToLive"); + JoinMulticastGroup (multicastAddr); if(family == AddressFamily.InterNetwork) socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, timeToLive); @@ -295,16 +314,15 @@ namespace System.Net.Sockets { CheckDisposed (); - if (family == AddressFamily.InterNetwork) { + if (family == AddressFamily.InterNetwork) socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption (multicastAddr, localAddress)); - } else if (family == AddressFamily.InterNetworkV6) { - socket.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership, new MulticastOption (multicastAddr, localAddress)); - } + else + throw new SocketException ((int) SocketError.OperationNotSupported); } #endif - + #endregion -#region Data I/O + #region Data I/O public byte [] Receive (ref IPEndPoint remoteEP) { CheckDisposed (); diff --git a/mcs/class/System/System.Net/ChangeLog b/mcs/class/System/System.Net/ChangeLog index ceccc3ab544..c03e4002d68 100644 --- a/mcs/class/System/System.Net/ChangeLog +++ b/mcs/class/System/System.Net/ChangeLog @@ -1,3 +1,154 @@ +2009-07-10 Gonzalo Paniagua Javier + + * WebClient.cs: implement GetWebRequest and GetWebResponse. Use them + instead of SetupRequest and ProcessResponse. + +2009-07-07 Gonzalo Paniagua Javier + + * WebClient.cs: set the content length when uploading values. This + allows reusing the connection. + * WebConnectionStream.cs: SetHeaders() takes ownership of the buffer + and does not need to copy it any more. WriteRequest() wasn't always + setting 'requestWritten' to true. + * HttpWebRequest.cs: change in SetHeaders call. + +2009-07-06 Gert Driesen + + * WebConnectionStream.cs: Move and improve argument checks to match MS. + Modified CanRead and CanWrite to return false when instance is disposed. + +2009-07-02 Gonzalo Paniagua Javier + + * WebConnection.cs: provide better error message when there's an error + writing. + * WebConnectionStream.cs: don't nullify the buffer until + CheckFinalStatus() decides that there are no more authentication + retries or redirects. + +2009-07-02 Gonzalo Paniagua Javier + + * ServicePointManager.cs: implement ServerCertificateValidationCallback. + * DefaultCertificatePolicy.cs: if there's a SCVC registered, don't do + normal error checking.a + +2009-07-02 Gonzalo Paniagua Javier + + * HttpWebRequest.cs: avoid duplicating Accept-Encoding if GetHeaders() + is called twice. + * WebConnectionStream.cs: don't send a 0 content length for non-write + requests. + +2009-07-02 Gonzalo Paniagua Javier + + * WebConnection.cs: must use the 'int' version in 1.1. + +2009-07-01 Gonzalo Paniagua Javier + + * WebConnection.cs: + * ServicePoint.cs: UseNagleAlgorithm determines NoDelay value. + +2009-06-28 Gonzalo Paniagua Javier + + * HttpWebRequest.cs: fix 1.1 only test. + +2009-06-28 Gonzalo Paniagua Javier + + * WebConnectionStream.cs: when buffering the response, we have to set + the internal length and regenerate the headers. + +2009-06-26 Gonzalo Paniagua Javier + + * HttpWebRequest.cs: don't send Content-Length header when SendChunked + is enabled. + * WebConnectionStream.cs: send the headers immediately when possible. + When writing the request before a Close(), if there was an exception + it was lost. + +2009-06-26 Gonzalo Paniagua Javier + + * HttpConnection.cs: + * HttpListenerResponse.cs: force closing the socket when the response + is aborted. + +2009-06-25 Gonzalo Paniagua Javier + + * WebAsyncResult.cs: new field that tells us if the request is being + written automatically because we reached the content length. + * WebConnection.cs: + * WebConnectionStream.cs: make sure we only access the NetworkStream + while we own it. Automatically write the request when we reach + ContentLength number of bytes. Kill the write buffer as soon as + possible. Don't use the buffer at all when chunked encoding is + enabled. + + Fixes bugs #515931 and #510642. + +2009-06-24 Gonzalo Paniagua Javier + + * WebConnection.cs: 'socket' and 'Data' where being changed by 2 + threads at the same time when there were queued requests and the + current one was aborted in Connect(). + * HttpWebRequest.cs: 'aborted' is now an int and we use Interlocked to + access it. Added WebConnection field used when aborting the request. + + Fixes bug #514591 for good. + +2009-06-21 Gonzalo Paniagua Javier + + * HttpWebRequest.cs: check for an aborted request in Begin* before + proceeding. Fixes bug #511851. + +2009-06-21 Gonzalo Paniagua Javier + + * WebConnectionStream.cs: close the underlying socket if there's an + exception when closing the stream. Fixes bug #514996. + +2009-06-20 Gert Driesen + + * WebConnectionStream.cs: Keep count of all bytes written, and perform + write overflow check in both buffered and non-buffered writing (if + not using chunked transfer encoding). Fixes bug #510642. + +2009-06-20 Gert Driesen + + * WebClient.cs: Use lowercase hex bytes to match MS. Avoid using + zero-length string literal. Fixed exception argument name to match + MS. + * WebConnectionStream.cs: Throw a WebException that wraps an + IOException when closing the stream before all bytes are written. + +2009-06-19 Gonzalo Paniagua Javier + + * WebConnection.cs: make sure we don't open a new socket if the + request is aborted before we establish the connection. Fixes bug + #514591. + + * HttpWebRequest.cs: new property to return abort status. Invoke the + abort handler before doing anything else when Abort() is called for + the first time. + +2009-06-17 Gonzalo Paniagua Javier + + * EndPointListener.cs: call CheckIfRemove() after removing a regular + prefix. Fixes bug #513849. + * EndPointManager.cs: make sure we use the right lock when one prefix + of a collection fails to be added and we need to remove all of the + prefixes. + Clear the ip_to_endpoints hashtable if there are no more prefixes + listening on that address. + +2009-06-16 Andrés G. Aragoneses + + * WebConnection.cs: propagate the exception to the request. + * WebException.cs: new internal ctor. + * HttpWebRequest.cs: use new ctor to encapsulate the innerException. + Fixes #323452. + +2009-06-15 Gonzalo Paniagua Javier + + * HttpWebRequest.cs: for unknown methods, always send the request once + we are connected even if there's no writeStream. Fixes bug #513087. + 2009-06-09 Gonzalo Paniagua Javier * HttpWebRequest.cs: ProtocolViolationException is not thrown in diff --git a/mcs/class/System/System.Net/DefaultCertificatePolicy.cs b/mcs/class/System/System.Net/DefaultCertificatePolicy.cs index 12d3602d888..82d3369389b 100644 --- a/mcs/class/System/System.Net/DefaultCertificatePolicy.cs +++ b/mcs/class/System/System.Net/DefaultCertificatePolicy.cs @@ -39,6 +39,11 @@ namespace System.Net { // but) expired certificates. public bool CheckValidationResult (ServicePoint point, X509Certificate certificate, WebRequest request, int certificateProblem) { +#if NET_2_0 && SECURITY_DEP + // If using default policy and the new callback is there, ignore this + if (ServicePointManager.ServerCertificateValidationCallback != null) + return true; +#endif switch (certificateProblem) { case 0: // No error case -2146762495: // CERT_E_EXPIRED 0x800B0101 (WinError.h) @@ -49,3 +54,4 @@ namespace System.Net { } } } + diff --git a/mcs/class/System/System.Net/EndPointListener.cs b/mcs/class/System/System.Net/EndPointListener.cs index 23aff2518c2..16f4ea0e331 100644 --- a/mcs/class/System/System.Net/EndPointListener.cs +++ b/mcs/class/System/System.Net/EndPointListener.cs @@ -307,6 +307,7 @@ namespace System.Net { if (prefixes.ContainsKey (prefix)) { prefixes.Remove (prefix); + CheckIfRemove (); } } } diff --git a/mcs/class/System/System.Net/EndPointManager.cs b/mcs/class/System/System.Net/EndPointManager.cs index ea33ff93701..33c5940b432 100644 --- a/mcs/class/System/System.Net/EndPointManager.cs +++ b/mcs/class/System/System.Net/EndPointManager.cs @@ -52,7 +52,7 @@ namespace System.Net { } } catch { foreach (string prefix in added) { - RemovePrefixInternal (prefix, listener); + RemovePrefix (prefix, listener); } throw; } @@ -107,6 +107,9 @@ namespace System.Net { Hashtable p = null; p = (Hashtable) ip_to_endpoints [ep.Address]; p.Remove (ep.Port); + if (p.Count == 0) { + ip_to_endpoints.Remove (ep.Address); + } epl.Close (); } } diff --git a/mcs/class/System/System.Net/HttpConnection.cs b/mcs/class/System/System.Net/HttpConnection.cs index 76df53adc8d..cbf7787b102 100644 --- a/mcs/class/System/System.Net/HttpConnection.cs +++ b/mcs/class/System/System.Net/HttpConnection.cs @@ -311,6 +311,11 @@ namespace System.Net { } public void Close () + { + Close (false); + } + + internal void Close (bool force_close) { if (sock != null) { Stream st = GetResponseStream (); @@ -319,7 +324,7 @@ namespace System.Net { } if (sock != null) { - if (chunked && context.Response.ForceCloseChunked == false) { + if (!force_close && chunked && context.Response.ForceCloseChunked == false) { // Don't close. Keep working. chunked_uses++; Unbind (); @@ -328,7 +333,7 @@ namespace System.Net { return; } - if (context.Response.Headers ["connection"] == "close") { + if (force_close || context.Response.Headers ["connection"] == "close") { Socket s = sock; sock = null; try { diff --git a/mcs/class/System/System.Net/HttpListenerResponse.cs b/mcs/class/System/System.Net/HttpListenerResponse.cs index 0b4bf744cdf..413326ff837 100644 --- a/mcs/class/System/System.Net/HttpListenerResponse.cs +++ b/mcs/class/System/System.Net/HttpListenerResponse.cs @@ -331,8 +331,7 @@ namespace System.Net { void Close (bool force) { - // TODO: use the 'force' argument - context.Connection.Close (); + context.Connection.Close (force); disposed = true; } diff --git a/mcs/class/System/System.Net/HttpWebRequest.cs b/mcs/class/System/System.Net/HttpWebRequest.cs index eed82a23ba0..ef0d8bbc7bb 100644 --- a/mcs/class/System/System.Net/HttpWebRequest.cs +++ b/mcs/class/System/System.Net/HttpWebRequest.cs @@ -86,7 +86,7 @@ namespace System.Net WebAsyncResult asyncWrite; WebAsyncResult asyncRead; EventHandler abortHandler; - bool aborted; + int aborted; bool gotRequestStream; int redirects; bool expectContinue; @@ -98,6 +98,7 @@ namespace System.Net object locker = new object (); bool is_ntlm_auth; bool finished_reading; + internal WebConnection WebConnection; #if NET_2_0 DecompressionMethods auto_decomp; #endif @@ -642,8 +643,8 @@ namespace System.Net public override IAsyncResult BeginGetRequestStream (AsyncCallback callback, object state) { - if (aborted) - throw new WebException ("The request was previosly aborted."); + if (Aborted) + throw new WebException ("The request was canceled.", WebExceptionStatus.RequestCanceled); bool send = !(method == "GET" || method == "CONNECT" || method == "HEAD" || method == "TRACE" || method == "DELETE"); @@ -656,7 +657,7 @@ namespace System.Net string transferEncoding = TransferEncoding; if (!sendChunked && transferEncoding != null && transferEncoding.Trim () != "") throw new ProtocolViolationException ("SendChunked should be true."); - + lock (locker) { if (asyncWrite != null) { @@ -734,11 +735,15 @@ namespace System.Net public override IAsyncResult BeginGetResponse (AsyncCallback callback, object state) { + if (Aborted) + throw new WebException ("The request was canceled.", WebExceptionStatus.RequestCanceled); + if (method == null) throw new ProtocolViolationException ("Method is null."); #if !NET_2_0 - bool send = (method == "PUT" || method == "POST"); + bool send = !(method == "GET" || method == "CONNECT" || method == "HEAD" || + method == "TRACE" || method == "DELETE"); if (send && contentLength < 0 && !sendChunked && !allowBuffering && KeepAlive) throw new ProtocolViolationException ("Buffering is disabled, ContentLength is negative and SendChunked is disabled."); @@ -823,16 +828,26 @@ namespace System.Net set { finished_reading = value; } } + internal bool Aborted { + get { return Interlocked.CompareExchange (ref aborted, 0, 0) == 1; } + } + public override void Abort () { - if (aborted) + if (Interlocked.CompareExchange (ref aborted, 1, 0) == 1) return; - aborted = true; if (haveResponse && finished_reading) return; haveResponse = true; + if (abortHandler != null) { + try { + abortHandler (this, EventArgs.Empty); + } catch (Exception) {} + abortHandler = null; + } + if (asyncWrite != null) { WebAsyncResult r = asyncWrite; if (!r.IsCompleted) { @@ -857,13 +872,6 @@ namespace System.Net asyncRead = null; } - if (abortHandler != null) { - try { - abortHandler (this, EventArgs.Empty); - } catch (Exception) {} - abortHandler = null; - } - if (writeStream != null) { try { writeStream.Close (); @@ -989,15 +997,15 @@ namespace System.Net string GetHeaders () { bool continue100 = false; - if (contentLength != -1) { + if (sendChunked) { + continue100 = true; + webHeaders.RemoveAndAdd ("Transfer-Encoding", "chunked"); + webHeaders.RemoveInternal ("Content-Length"); + } else if (contentLength != -1) { if (contentLength > 0) continue100 = true; webHeaders.SetInternal ("Content-Length", contentLength.ToString ()); webHeaders.RemoveInternal ("Transfer-Encoding"); - } else if (sendChunked) { - continue100 = true; - webHeaders.RemoveAndAdd ("Transfer-Encoding", "chunked"); - webHeaders.RemoveInternal ("Content-Length"); } if (actualVersion == HttpVersion.Version11 && continue100 && @@ -1035,7 +1043,7 @@ namespace System.Net if ((auto_decomp & DecompressionMethods.Deflate) != 0) accept_encoding = accept_encoding != null ? "gzip, deflate" : "deflate"; if (accept_encoding != null) - webHeaders.SetInternal ("Accept-Encoding", accept_encoding); + webHeaders.RemoveAndAdd ("Accept-Encoding", accept_encoding); #endif if (!usedPreAuth && preAuthenticate) DoPreAuthenticate (); @@ -1065,7 +1073,7 @@ namespace System.Net internal void SetWriteStreamError (WebExceptionStatus status, Exception exc) { - if (aborted) + if (Aborted) return; WebAsyncResult r = asyncWrite; @@ -1074,11 +1082,15 @@ namespace System.Net if (r != null) { string msg; - if (exc == null) + WebException wex; + if (exc == null) { msg = "Error: " + status; - else + wex = new WebException (msg, status); + } else { msg = String.Format ("Error: {0} ({1})", status, exc.Message); - r.SetCompleted (false, new WebException (msg, status)); + wex = new WebException (msg, exc, status); + } + r.SetCompleted (false, wex); r.DoCallback (); } } @@ -1112,7 +1124,7 @@ namespace System.Net string reqstr = req.ToString (); byte [] bytes = Encoding.UTF8.GetBytes (reqstr); try { - writeStream.SetHeaders (bytes, 0, bytes.Length); + writeStream.SetHeaders (bytes); } catch (WebException wexc) { SetWriteStreamError (wexc.Status); } catch (Exception) { @@ -1122,7 +1134,7 @@ namespace System.Net internal void SetWriteStream (WebConnectionStream stream) { - if (aborted) + if (Aborted) return; writeStream = stream; @@ -1142,7 +1154,8 @@ namespace System.Net writeStream.Write (bodyBuffer, 0, bodyBufferLength); bodyBuffer = null; writeStream.Close (); - } else if (method == "PUT" || method == "POST" || method == "OPTIONS") { + } else if (method != "HEAD" && method != "GET" && method != "MKCOL" && method != "CONNECT" && + method != "DELETE" && method != "TRACE") { if (getResponseCalled && !writeStream.RequestWritten) writeStream.WriteRequest (); } @@ -1156,7 +1169,7 @@ namespace System.Net internal void SetResponseError (WebExceptionStatus status, Exception e, string where) { - if (aborted) + if (Aborted) return; lock (locker) { string msg = String.Format ("Error getting response stream ({0}): {1}", where, status); @@ -1226,7 +1239,7 @@ namespace System.Net internal void SetResponseData (WebConnectionData data) { lock (locker) { - if (aborted) { + if (Aborted) { if (data.stream != null) data.stream.Close (); return; diff --git a/mcs/class/System/System.Net/ServicePoint.cs b/mcs/class/System/System.Net/ServicePoint.cs index f9bc2a7f148..3a7de6b3f5b 100644 --- a/mcs/class/System/System.Net/ServicePoint.cs +++ b/mcs/class/System/System.Net/ServicePoint.cs @@ -179,7 +179,6 @@ namespace System.Net set { SendContinue = value; } } - [MonoTODO ("Use me")] public bool UseNagleAlgorithm { get { return useNagle; } set { useNagle = value; } diff --git a/mcs/class/System/System.Net/ServicePointManager.cs b/mcs/class/System/System.Net/ServicePointManager.cs index bea42e48cc3..22926e35fc9 100644 --- a/mcs/class/System/System.Net/ServicePointManager.cs +++ b/mcs/class/System/System.Net/ServicePointManager.cs @@ -109,6 +109,9 @@ namespace System.Net #endif static bool useNagle; #endif +#if NET_2_0 + static RemoteCertificateValidationCallback server_cert_cb; +#endif // Fields @@ -240,15 +243,14 @@ namespace System.Net set { _securityProtocol = value; } } -#if NET_2_0 && SECURITY_DEP - [MonoTODO] +#if NET_2_0 public static RemoteCertificateValidationCallback ServerCertificateValidationCallback { get { - throw GetMustImplement (); + return server_cert_cb; } set { - throw GetMustImplement (); + server_cert_cb = value; } } #endif diff --git a/mcs/class/System/System.Net/WebAsyncResult.cs b/mcs/class/System/System.Net/WebAsyncResult.cs index 6d0a3f431ee..3c0a3154d47 100644 --- a/mcs/class/System/System.Net/WebAsyncResult.cs +++ b/mcs/class/System/System.Net/WebAsyncResult.cs @@ -51,6 +51,7 @@ namespace System.Net int size; object locker = new object (); public bool EndCalled; + public bool AsyncWriteAll; public WebAsyncResult (AsyncCallback cb, object state) { diff --git a/mcs/class/System/System.Net/WebClient.cs b/mcs/class/System/System.Net/WebClient.cs index 4b46f4c18a4..050f7904ea6 100644 --- a/mcs/class/System/System.Net/WebClient.cs +++ b/mcs/class/System/System.Net/WebClient.cs @@ -103,7 +103,7 @@ namespace System.Net for (int i = '0'; i <= '9'; i++, index++) hexBytes [index] = (byte) i; - for (int i = 'A'; i <= 'F'; i++, index++) + for (int i = 'a'; i <= 'f'; i++, index++) hexBytes [index] = (byte) i; } @@ -117,7 +117,7 @@ namespace System.Net get { if (baseString == null) { if (baseAddress == null) - return ""; + return string.Empty; } baseString = baseAddress.ToString (); @@ -125,7 +125,7 @@ namespace System.Net } set { - if (value == null || value == "") { + if (value == null || value.Length == 0) { baseAddress = null; } else { baseAddress = new Uri (value); @@ -196,7 +196,7 @@ namespace System.Net get { return encoding; } set { if (value == null) - throw new ArgumentNullException ("value"); + throw new ArgumentNullException ("Encoding"); encoding = value; } } @@ -272,8 +272,8 @@ namespace System.Net try { request = SetupRequest (address); - WebResponse response = request.GetResponse (); - Stream st = ProcessResponse (response); + WebResponse response = GetWebResponse (request); + Stream st = response.GetResponseStream (); return ReadAll (st, (int) response.ContentLength, userToken); } catch (ThreadInterruptedException){ if (request != null) @@ -330,8 +330,8 @@ namespace System.Net using (FileStream f = new FileStream (fileName, FileMode.Create)) { try { request = SetupRequest (address); - WebResponse response = request.GetResponse (); - Stream st = ProcessResponse (response); + WebResponse response = GetWebResponse (request); + Stream st = response.GetResponseStream (); int cLength = (int) response.ContentLength; int length = (cLength <= -1 || cLength > 32*1024) ? 32*1024 : cLength; @@ -389,8 +389,8 @@ namespace System.Net async = false; #endif request = SetupRequest (address); - WebResponse response = request.GetResponse (); - return ProcessResponse (response); + WebResponse response = GetWebResponse (request); + return response.GetResponseStream (); } catch (Exception ex) { throw new WebException ("An error occurred " + "performing a WebClient request.", ex); @@ -541,8 +541,8 @@ namespace System.Net stream.Write (data, 0, contentLength); } - WebResponse response = request.GetResponse (); - Stream st = ProcessResponse (response); + WebResponse response = GetWebResponse (request); + Stream st = response.GetResponseStream (); return ReadAll (st, (int) response.ContentLength, userToken); } catch (ThreadInterruptedException){ if (request != null) @@ -651,8 +651,8 @@ namespace System.Net reqStream.Write (realBoundary, 0, realBoundary.Length); reqStream.Close (); reqStream = null; - WebResponse response = request.GetResponse (); - Stream st = ProcessResponse (response); + WebResponse response = GetWebResponse (request); + Stream st = response.GetResponseStream (); resultBytes = ReadAll (st, (int) response.ContentLength, userToken); } catch (ThreadInterruptedException){ if (request != null) @@ -738,7 +738,6 @@ namespace System.Net Headers ["Content-Type"] = urlEncodedCType; WebRequest request = SetupRequest (uri, method, true); try { - Stream rqStream = request.GetRequestStream (); MemoryStream tmpStream = new MemoryStream (); foreach (string key in data) { byte [] bytes = Encoding.UTF8.GetBytes (key); @@ -754,12 +753,14 @@ namespace System.Net tmpStream.SetLength (--length); // remove trailing '&' byte [] buf = tmpStream.GetBuffer (); - rqStream.Write (buf, 0, length); - rqStream.Close (); + request.ContentLength = length; + using (Stream rqStream = request.GetRequestStream ()) { + rqStream.Write (buf, 0, length); + } tmpStream.Close (); - WebResponse response = request.GetResponse (); - Stream st = ProcessResponse (response); + WebResponse response = GetWebResponse (request); + Stream st = response.GetResponseStream (); return ReadAll (st, (int) response.ContentLength, userToken); } catch (ThreadInterruptedException) { request.Abort (); @@ -980,12 +981,6 @@ namespace System.Net return request; } - Stream ProcessResponse (WebResponse response) - { - responseHeaders = response.Headers; - return response.GetResponseStream (); - } - byte [] ReadAll (Stream stream, int length, object userToken) { MemoryStream ms = null; @@ -1228,8 +1223,8 @@ namespace System.Net WebRequest request = null; try { request = SetupRequest ((Uri) args [0]); - WebResponse response = request.GetResponse (); - Stream stream = ProcessResponse (response); + WebResponse response = GetWebResponse (request); + Stream stream = response.GetResponseStream (); OnOpenReadCompleted ( new OpenReadCompletedEventArgs (stream, null, false, args [1])); } catch (ThreadInterruptedException){ @@ -1533,21 +1528,32 @@ namespace System.Net UploadValuesCompleted (this, args); } - [MonoNotSupported("")] - protected virtual WebRequest GetWebRequest (Uri address) + protected virtual WebResponse GetWebResponse (WebRequest request, IAsyncResult result) { - throw new NotImplementedException (); + WebResponse response = request.EndGetResponse (result); + responseHeaders = response.Headers; + return response; } +#endif - protected virtual WebResponse GetWebResponse (WebRequest request) +#if NET_2_0 + protected virtual +#endif + WebRequest GetWebRequest (Uri address) { - return request.GetResponse (); + return SetupRequest (address); } - protected virtual WebResponse GetWebResponse (WebRequest request, IAsyncResult result) +#if NET_2_0 + protected virtual +#endif + WebResponse GetWebResponse (WebRequest request) { - return request.EndGetResponse (result); + WebResponse response = request.GetResponse (); + responseHeaders = response.Headers; + return response; } -#endif + } } + diff --git a/mcs/class/System/System.Net/WebConnection.cs b/mcs/class/System/System.Net/WebConnection.cs index af0ec2dae82..09b6f6bed05 100644 --- a/mcs/class/System/System.Net/WebConnection.cs +++ b/mcs/class/System/System.Net/WebConnection.cs @@ -45,7 +45,7 @@ namespace System.Net Headers, Content } - + class WebConnection { ServicePoint sPoint; @@ -58,6 +58,7 @@ namespace System.Net byte [] buffer; static AsyncCallback readDoneDelegate = new AsyncCallback (ReadDone); EventHandler abortHandler; + AbortHelper abortHelper; ReadState readState; internal WebConnectionData Data; bool chunkedRead; @@ -89,8 +90,22 @@ namespace System.Net readState = ReadState.None; Data = new WebConnectionData (); initConn = new WaitCallback (InitConnection); - abortHandler = new EventHandler (Abort); queue = group.Queue; + abortHelper = new AbortHelper (); + abortHelper.Connection = this; + abortHandler = new EventHandler (abortHelper.Abort); + } + + class AbortHelper { + public WebConnection Connection; + + public void Abort (object sender, EventArgs args) + { + WebConnection other = ((HttpWebRequest) sender).WebConnection; + if (other == null) + other = Connection; + other.Abort (sender, args); + } } bool CanReuse () @@ -100,7 +115,7 @@ namespace System.Net return (socket.Poll (0, SelectMode.SelectRead) == false); } - void Connect () + void Connect (HttpWebRequest request) { lock (socketLock) { if (socket != null && socket.Connected && status == WebExceptionStatus.Success) { @@ -126,13 +141,15 @@ namespace System.Net return; } + WebConnectionData data = Data; foreach (IPAddress address in hostEntry.AddressList) { socket = new Socket (address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - IPEndPoint remote = new IPEndPoint (address, sPoint.Address.Port); - +#if NET_1_1 + socket.SetSocketOption (SocketOptionLevel.Tcp, SocketOptionName.NoDelay, sPoint.UseNagleAlgorithm ? 0 : 1); +#endif #if NET_2_0 - socket.NoDelay = true; + socket.NoDelay = !sPoint.UseNagleAlgorithm; if (!sPoint.CallEndPointDelegate (socket, remote)) { socket.Close (); socket = null; @@ -140,17 +157,29 @@ namespace System.Net } else { #endif try { + if (request.Aborted) + return; socket.Connect (remote); status = WebExceptionStatus.Success; break; - } catch (SocketException exc) { - // This might be null if the request is aborted - if (socket != null) { - socket.Close (); - socket = null; + } catch (ThreadAbortException) { + // program exiting... + Socket s = socket; + socket = null; + if (s != null) + s.Close (); + return; + } catch (ObjectDisposedException exc) { + // socket closed from another thread + return; + } catch (Exception exc) { + Socket s = socket; + socket = null; + if (s != null) + s.Close (); + if (!request.Aborted) status = WebExceptionStatus.ConnectFailure; - connect_exception = exc; - } + connect_exception = exc; } #if NET_2_0 } @@ -310,7 +339,8 @@ namespace System.Net nstream = serverStream; } } catch (Exception) { - status = WebExceptionStatus.ConnectFailure; + if (!request.Aborted) + status = WebExceptionStatus.ConnectFailure; return false; } @@ -572,36 +602,38 @@ namespace System.Net void InitConnection (object state) { HttpWebRequest request = (HttpWebRequest) state; + request.WebConnection = this; - if (status == WebExceptionStatus.RequestCanceled) { - lock (this) { - busy = false; - Data = new WebConnectionData (); - SendNext (); - } + if (request.Aborted) return; - } keepAlive = request.KeepAlive; Data = new WebConnectionData (); Data.request = request; retry: - Connect (); + Connect (request); + if (request.Aborted) + return; + if (status != WebExceptionStatus.Success) { - if (status != WebExceptionStatus.RequestCanceled) { - request.SetWriteStreamError (status); + if (!request.Aborted) { + request.SetWriteStreamError (status, connect_exception); Close (true); } return; } if (!CreateStream (request)) { + if (request.Aborted) + return; + + WebExceptionStatus st = status; if (Data.Challenge != null) goto retry; Exception cnc_exc = connect_exception; connect_exception = null; - request.SetWriteStreamError (status, cnc_exc); + request.SetWriteStreamError (st, cnc_exc); Close (true); return; } @@ -612,6 +644,9 @@ namespace System.Net internal EventHandler SendRequest (HttpWebRequest request) { + if (request.Aborted) + return null; + lock (this) { if (!busy) { busy = true; @@ -706,10 +741,14 @@ namespace System.Net } - internal IAsyncResult BeginRead (byte [] buffer, int offset, int size, AsyncCallback cb, object state) + internal IAsyncResult BeginRead (HttpWebRequest request, byte [] buffer, int offset, int size, AsyncCallback cb, object state) { - if (nstream == null) - return null; + lock (this) { + if (Data.request != request) + throw new ObjectDisposedException (typeof (NetworkStream).FullName); + if (nstream == null) + return null; + } IAsyncResult result = null; if (!chunkedRead || chunkStream.WantMore) { @@ -736,10 +775,14 @@ namespace System.Net return result; } - internal int EndRead (IAsyncResult result) + internal int EndRead (HttpWebRequest request, IAsyncResult result) { - if (nstream == null) - return 0; + lock (this) { + if (Data.request != request) + throw new ObjectDisposedException (typeof (NetworkStream).FullName); + if (nstream == null) + throw new ObjectDisposedException (typeof (NetworkStream).FullName); + } int nbytes = 0; WebAsyncResult wr = null; @@ -818,12 +861,17 @@ namespace System.Net return true; } - internal IAsyncResult BeginWrite (byte [] buffer, int offset, int size, AsyncCallback cb, object state) + + internal IAsyncResult BeginWrite (HttpWebRequest request, byte [] buffer, int offset, int size, AsyncCallback cb, object state) { - IAsyncResult result = null; - if (nstream == null) - return null; + lock (this) { + if (Data.request != request) + throw new ObjectDisposedException (typeof (NetworkStream).FullName); + if (nstream == null) + return null; + } + IAsyncResult result = null; try { result = nstream.BeginWrite (buffer, offset, size, cb, state); } catch (Exception) { @@ -834,10 +882,33 @@ namespace System.Net return result; } - internal bool EndWrite (IAsyncResult result) + internal void EndWrite2 (HttpWebRequest request, IAsyncResult result) { - if (nstream == null) - return false; + lock (this) { + if (Data.request != request) + throw new ObjectDisposedException (typeof (NetworkStream).FullName); + if (nstream == null) + throw new ObjectDisposedException (typeof (NetworkStream).FullName); + } + + try { + nstream.EndWrite (result); + } catch (Exception exc) { + status = WebExceptionStatus.SendFailure; + if (exc.InnerException != null) + throw exc.InnerException; + throw; + } + } + + internal bool EndWrite (HttpWebRequest request, IAsyncResult result) + { + lock (this) { + if (Data.request != request) + throw new ObjectDisposedException (typeof (NetworkStream).FullName); + if (nstream == null) + throw new ObjectDisposedException (typeof (NetworkStream).FullName); + } try { nstream.EndWrite (result); @@ -848,10 +919,14 @@ namespace System.Net } } - internal int Read (byte [] buffer, int offset, int size) + internal int Read (HttpWebRequest request, byte [] buffer, int offset, int size) { - if (nstream == null) - return 0; + lock (this) { + if (Data.request != request) + throw new ObjectDisposedException (typeof (NetworkStream).FullName); + if (nstream == null) + return 0; + } int result = 0; try { @@ -883,10 +958,15 @@ namespace System.Net return result; } - internal bool Write (byte [] buffer, int offset, int size) + internal bool Write (HttpWebRequest request, byte [] buffer, int offset, int size, ref string err_msg) { - if (nstream == null) - return false; + err_msg = null; + lock (this) { + if (Data.request != request) + throw new ObjectDisposedException (typeof (NetworkStream).FullName); + if (nstream == null) + return false; + } try { nstream.Write (buffer, offset, size); @@ -894,8 +974,9 @@ namespace System.Net if (ssl && !certsAvailable) GetCertificates (); } catch (Exception e) { + err_msg = e.Message; WebExceptionStatus wes = WebExceptionStatus.SendFailure; - string msg = "Write"; + string msg = "Write: " + err_msg; if (e is WebException) { HandleError (wes, e, msg); return false; @@ -931,6 +1012,7 @@ namespace System.Net } busy = false; + Data = new WebConnectionData (); if (sendNext) SendNext (); } @@ -939,23 +1021,31 @@ namespace System.Net void Abort (object sender, EventArgs args) { lock (this) { - if (Data.request == sender) { - if (!Data.request.FinishedReading) - HandleError (WebExceptionStatus.RequestCanceled, null, "Abort"); - return; - } - lock (queue) { - if (queue.Count > 0 && queue.Peek () == sender) { - queue.Dequeue (); + HttpWebRequest req = (HttpWebRequest) sender; + if (Data.request == req) { + if (!req.FinishedReading) { + status = WebExceptionStatus.RequestCanceled; + Close (false); + if (queue.Count > 0) { + Data.request = (HttpWebRequest) queue.Dequeue (); + SendRequest (Data.request); + } + } return; } - object [] old = queue.ToArray (); - queue.Clear (); - for (int i = old.Length - 1; i >= 0; i--) { - if (old [i] != sender) - queue.Enqueue (old [i]); + req.FinishedReading = true; + req.SetResponseError (WebExceptionStatus.RequestCanceled, null, "User aborted"); + if (queue.Count > 0 && queue.Peek () == sender) { + queue.Dequeue (); + } else if (queue.Count > 0) { + object [] old = queue.ToArray (); + queue.Clear (); + for (int i = old.Length - 1; i >= 0; i--) { + if (old [i] != sender) + queue.Enqueue (old [i]); + } } } } diff --git a/mcs/class/System/System.Net/WebConnectionStream.cs b/mcs/class/System/System.Net/WebConnectionStream.cs index 418cfa3c07c..c973b64498e 100644 --- a/mcs/class/System/System.Net/WebConnectionStream.cs +++ b/mcs/class/System/System.Net/WebConnectionStream.cs @@ -46,6 +46,7 @@ namespace System.Net int readBufferSize; int contentLength; int totalRead; + long totalWritten; bool nextReadCalled; int pendingReads; int pendingWrites; @@ -61,7 +62,6 @@ namespace System.Net bool initRead; bool read_eof; bool complete_request_written; - long max_buffer_size; int read_timeout; int write_timeout; @@ -77,7 +77,6 @@ namespace System.Net bool chunkedRead = (contentType != null && contentType.ToLower ().IndexOf ("chunked") != -1); string clength = cnc.Data.Headers ["Content-Length"]; if (!chunkedRead && clength != null && clength != "") { - try { contentLength = Int32.Parse (clength); if (contentLength == 0 && !IsNtlmAuth ()) { @@ -100,15 +99,10 @@ namespace System.Net this.request = request; allowBuffering = request.InternalAllowBuffering; sendChunked = request.SendChunked; - if (allowBuffering) { - writeBuffer = new MemoryStream (); - max_buffer_size = request.ContentLength; - } else { - max_buffer_size = -1; - } - if (sendChunked) pending = new ManualResetEvent (true); + else if (allowBuffering) + writeBuffer = new MemoryStream (); } bool IsNtlmAuth () @@ -127,6 +121,10 @@ namespace System.Net } } + internal HttpWebRequest Request { + get { return request; } + } + internal WebConnection Connection { get { return cnc; } } @@ -245,7 +243,7 @@ namespace System.Net buffer = new byte [8192]; int read; - while ((read = cnc.Read (buffer, 0, buffer.Length)) != 0) + while ((read = cnc.Read (request, buffer, 0, buffer.Length)) != 0) ms.Write (buffer, 0, read); b = ms.GetBuffer (); @@ -264,7 +262,7 @@ namespace System.Net int remaining = new_size - diff; int r = -1; while (remaining > 0 && r != 0) { - r = cnc.Read (b, diff, remaining); + r = cnc.Read (request, b, diff, remaining); remaining -= r; diff += r; } @@ -282,7 +280,10 @@ namespace System.Net void WriteCallbackWrapper (IAsyncResult r) { - WebAsyncResult result; + WebAsyncResult result = r as WebAsyncResult; + if (result != null && result.AsyncWriteAll) + return; + if (r.AsyncState != null) { result = (WebAsyncResult) r.AsyncState; result.InnerAsyncResult = r; @@ -306,12 +307,6 @@ namespace System.Net public override int Read (byte [] buffer, int offset, int size) { - if (!isRead) - throw new NotSupportedException ("this stream does not allow reading"); - - if (totalRead >= contentLength) - return 0; - AsyncCallback cb = new AsyncCallback (ReadCallbackWrapper); WebAsyncResult res = (WebAsyncResult) BeginRead (buffer, offset, size, cb, null); if (!res.IsCompleted && !res.WaitUntilComplete (ReadTimeout, false)) { @@ -333,8 +328,10 @@ namespace System.Net throw new ArgumentNullException ("buffer"); int length = buffer.Length; - if (size < 0 || offset < 0 || length < offset || length - offset < size) - throw new ArgumentOutOfRangeException (); + if (offset < 0 || length < offset) + throw new ArgumentOutOfRangeException ("offset"); + if (size < 0 || (length - offset) < size) + throw new ArgumentOutOfRangeException ("size"); lock (locker) { pendingReads++; @@ -371,7 +368,7 @@ namespace System.Net size = contentLength - totalRead; if (!read_eof) { - result.InnerAsyncResult = cnc.BeginRead (buffer, offset, size, cb, result); + result.InnerAsyncResult = cnc.BeginRead (request, buffer, offset, size, cb, result); } else { result.SetCompleted (true, result.NBytes); result.DoCallback (); @@ -392,7 +389,7 @@ namespace System.Net if (!result.IsCompleted) { int nbytes = -1; try { - nbytes = cnc.EndRead (result); + nbytes = cnc.EndRead (request, result); } catch (Exception exc) { lock (locker) { pendingReads--; @@ -430,10 +427,35 @@ namespace System.Net int nb = result.NBytes; return (nb >= 0) ? nb : 0; } - + + void WriteRequestAsyncCB (IAsyncResult r) + { + WebAsyncResult result = (WebAsyncResult) r.AsyncState; + try { + cnc.EndWrite2 (request, r); + result.SetCompleted (false, 0); + if (!initRead) { + initRead = true; + WebConnection.InitRead (cnc); + } + } catch (Exception e) { + KillBuffer (); + nextReadCalled = true; + cnc.Close (true); + if (e is System.Net.Sockets.SocketException) + e = new IOException ("Error writing request", e); + result.SetCompleted (false, e); + } + complete_request_written = true; + result.DoCallback (); + } + public override IAsyncResult BeginWrite (byte [] buffer, int offset, int size, AsyncCallback cb, object state) { + if (request.Aborted) + throw new WebException ("The request was canceled.", null, WebExceptionStatus.RequestCanceled); + if (isRead) throw new NotSupportedException ("this stream does not allow writing"); @@ -441,8 +463,10 @@ namespace System.Net throw new ArgumentNullException ("buffer"); int length = buffer.Length; - if (size < 0 || offset < 0 || length < offset || length - offset < size) - throw new ArgumentOutOfRangeException (); + if (offset < 0 || length < offset) + throw new ArgumentOutOfRangeException ("offset"); + if (size < 0 || (length - offset) < size) + throw new ArgumentOutOfRangeException ("size"); if (sendChunked) { lock (locker) { @@ -452,22 +476,31 @@ namespace System.Net } WebAsyncResult result = new WebAsyncResult (cb, state); - if (allowBuffering) { - if (max_buffer_size >= 0) { - long avail = max_buffer_size - writeBuffer.Length; - if (size > avail) { - if (requestWritten) - throw new ProtocolViolationException ( - "The number of bytes to be written is greater than " + - "the specified ContentLength."); - } - } + if (!sendChunked) + CheckWriteOverflow (request.ContentLength, totalWritten, size); + if (allowBuffering && !sendChunked) { + if (writeBuffer == null) + writeBuffer = new MemoryStream (); writeBuffer.Write (buffer, offset, size); - if (!sendChunked) { + totalWritten += size; + if (request.ContentLength > 0 && totalWritten == request.ContentLength) { + try { + result.AsyncWriteAll = true; + result.InnerAsyncResult = WriteRequestAsync (new AsyncCallback (WriteRequestAsyncCB), result); + if (result.InnerAsyncResult == null) { + if (!result.IsCompleted) + result.SetCompleted (true, 0); + result.DoCallback (); + } + } catch (Exception exc) { + result.SetCompleted (true, exc); + result.DoCallback (); + } + } else { result.SetCompleted (true, 0); result.DoCallback (); - return result; } + return result; } AsyncCallback callback = null; @@ -490,10 +523,27 @@ namespace System.Net size = chunkSize; } - result.InnerAsyncResult = cnc.BeginWrite (buffer, offset, size, callback, result); + result.InnerAsyncResult = cnc.BeginWrite (request, buffer, offset, size, callback, result); + totalWritten += size; return result; } + void CheckWriteOverflow (long contentLength, long totalWritten, long size) + { + if (contentLength == -1) + return; + + long avail = contentLength - totalWritten; + if (size > avail) { + KillBuffer (); + nextReadCalled = true; + cnc.Close (true); + throw new ProtocolViolationException ( + "The number of bytes to be written is greater than " + + "the specified ContentLength."); + } + } + public override void EndWrite (IAsyncResult r) { if (r == null) @@ -507,6 +557,12 @@ namespace System.Net return; result.EndCalled = true; + if (result.AsyncWriteAll) { + result.WaitUntilComplete (); + if (result.GotException) + throw result.Exception; + return; + } if (allowBuffering && !sendChunked) return; @@ -514,30 +570,29 @@ namespace System.Net if (result.GotException) throw result.Exception; - try { - cnc.EndWrite (result.InnerAsyncResult); + try { + cnc.EndWrite (request, result.InnerAsyncResult); result.SetCompleted (false, 0); } catch (Exception e) { result.SetCompleted (false, e); - } - - if (sendChunked) { - lock (locker) { - pendingWrites--; - if (pendingWrites == 0) - pending.Set (); + throw; + } finally { + if (sendChunked) { + lock (locker) { + pendingWrites--; + if (pendingWrites == 0) + pending.Set (); + } } } } public override void Write (byte [] buffer, int offset, int size) { - if (isRead) - throw new NotSupportedException ("This stream does not allow writing"); - AsyncCallback cb = new AsyncCallback (WriteCallbackWrapper); WebAsyncResult res = (WebAsyncResult) BeginWrite (buffer, offset, size, cb, null); if (!res.IsCompleted && !res.WaitUntilComplete (WriteTimeout, false)) { + KillBuffer (); nextReadCalled = true; cnc.Close (true); throw new IOException ("Write timed out."); @@ -550,27 +605,24 @@ namespace System.Net { } - internal void SetHeaders (byte [] buffer, int offset, int size) + internal void SetHeaders (byte [] buffer) { if (headersSent) return; - if (!allowBuffering || sendChunked) { - headersSent = true; - if (!cnc.Connected) - throw new WebException ("Not connected", null, WebExceptionStatus.SendFailure, null); - - - if (!cnc.Write (buffer, offset, size)) - throw new WebException ("Error writing request.", null, WebExceptionStatus.SendFailure, null); - + headers = buffer; + long cl = request.ContentLength; + string method = request.Method; + bool no_writestream = (method == "GET" || method == "CONNECT" || method == "HEAD" || + method == "TRACE" || method == "DELETE"); + if (sendChunked || cl > -1 || no_writestream) { + WriteHeaders (); if (!initRead) { initRead = true; WebConnection.InitRead (cnc); } - } else { - headers = new byte [size]; - Buffer.BlockCopy (buffer, offset, headers, 0, size); + if (!sendChunked && cl == 0) + Close (); } } @@ -578,16 +630,34 @@ namespace System.Net get { return requestWritten; } } + IAsyncResult WriteRequestAsync (AsyncCallback cb, object state) + { + requestWritten = true; + byte [] bytes = writeBuffer.GetBuffer (); + int length = (int) writeBuffer.Length; + // Headers already written to the stream + return (length > 0) ? cnc.BeginWrite (request, bytes, 0, length, cb, state) : null; + } + + void WriteHeaders () + { + if (headersSent) + return; + + headersSent = true; + string err_msg = null; + if (!cnc.Write (request, headers, 0, headers.Length, ref err_msg)) + throw new WebException ("Error writing request: " + err_msg, null, WebExceptionStatus.SendFailure, null); + } + internal void WriteRequest () { if (requestWritten) return; - if (sendChunked) { - request.SendRequestHeaders (); - requestWritten = true; + requestWritten = true; + if (sendChunked) return; - } if (!allowBuffering || writeBuffer == null) return; @@ -595,56 +665,37 @@ namespace System.Net byte [] bytes = writeBuffer.GetBuffer (); int length = (int) writeBuffer.Length; if (request.ContentLength != -1 && request.ContentLength < length) { + nextReadCalled = true; + cnc.Close (true); throw new WebException ("Specified Content-Length is less than the number of bytes to write", null, WebExceptionStatus.ServerProtocolViolation, null); } - request.InternalContentLength = length; - request.SendRequestHeaders (); - requestWritten = true; - - // - // For small requests, make a copy, it will reduce the traffic, for large - // requests, the NoDelay bit on the socket should take effect (set in WebConnection). - // - if (headers.Length + length < 8192){ - byte[] b = new byte [headers.Length + length]; - - Buffer.BlockCopy (headers, 0, b, 0, headers.Length); - Buffer.BlockCopy (bytes, 0, b, headers.Length, length); - - if (!cnc.Write (b, 0, b.Length)) - throw new WebException ("Error writing request.", null, WebExceptionStatus.SendFailure, null); - - headersSent = true; - complete_request_written = true; - - if (!initRead) { - initRead = true; - WebConnection.InitRead (cnc); - } - } else { - if (!cnc.Write (headers, 0, headers.Length)) - throw new WebException ("Error writing request.", null, WebExceptionStatus.SendFailure, null); - - headersSent = true; - if (cnc.Data.StatusCode != 0 && cnc.Data.StatusCode != 100) - return; - - IAsyncResult result = null; - if (length > 0) - result = cnc.BeginWrite (bytes, 0, length, null, null); - - if (!initRead) { - initRead = true; - WebConnection.InitRead (cnc); - } + if (!headersSent) { + string method = request.Method; + bool no_writestream = (method == "GET" || method == "CONNECT" || method == "HEAD" || + method == "TRACE" || method == "DELETE"); + if (!no_writestream) + request.InternalContentLength = length; + request.SendRequestHeaders (); + } + WriteHeaders (); + if (cnc.Data.StatusCode != 0 && cnc.Data.StatusCode != 100) + return; - if (length > 0) - complete_request_written = cnc.EndWrite (result); - else - complete_request_written = true; + IAsyncResult result = null; + if (length > 0) + result = cnc.BeginWrite (request, bytes, 0, length, null, null); + + if (!initRead) { + initRead = true; + WebConnection.InitRead (cnc); } + + if (length > 0) + complete_request_written = cnc.EndWrite (request, result); + else + complete_request_written = true; } internal void InternalClose () @@ -652,20 +703,16 @@ namespace System.Net disposed = true; } - internal void ForceCloseConnection () - { - if (!disposed) { - disposed = true; - cnc.Close (true); - } - } - public override void Close () { if (sendChunked) { + if (disposed) + return; + disposed = true; pending.WaitOne (); byte [] chunk = Encoding.ASCII.GetBytes ("0\r\n\r\n"); - cnc.Write (chunk, 0, chunk.Length); + string err_msg = null; + cnc.Write (request, chunk, 0, chunk.Length, ref err_msg); return; } @@ -688,14 +735,17 @@ namespace System.Net return; } - if (disposed) + if (disposed || requestWritten) return; long length = request.ContentLength; - // writeBuffer could be null if KillBuffer was already called. - if (writeBuffer != null && length != -1 && length > writeBuffer.Length) - throw new WebException ("Cannot close the stream until all bytes are written", WebExceptionStatus.RequestCanceled); + if (!sendChunked && length != -1 && totalWritten != length) { + IOException io = new IOException ("Cannot close the stream until all bytes are written"); + nextReadCalled = true; + cnc.Close (true); + throw new WebException ("Request was cancelled.", io, WebExceptionStatus.RequestCanceled); + } WriteRequest (); disposed = true; @@ -721,11 +771,11 @@ namespace System.Net } public override bool CanRead { - get { return isRead; } + get { return !disposed && isRead; } } public override bool CanWrite { - get { return !isRead; } + get { return !disposed && !isRead; } } public override long Length { diff --git a/mcs/class/System/System.Net/WebException.cs b/mcs/class/System/System.Net/WebException.cs index 6c8c295b4c4..be4446b7a0c 100644 --- a/mcs/class/System/System.Net/WebException.cs +++ b/mcs/class/System/System.Net/WebException.cs @@ -62,6 +62,12 @@ namespace System.Net { this.status = status; } + + internal WebException (string message, Exception innerException, WebExceptionStatus status) + : base (message, innerException) + { + this.status = status; + } public WebException(string message, Exception innerException, diff --git a/mcs/class/System/System.Security.Cryptography.X509Certificates/ChangeLog b/mcs/class/System/System.Security.Cryptography.X509Certificates/ChangeLog index 49a835e0b35..c2f5dd953fd 100644 --- a/mcs/class/System/System.Security.Cryptography.X509Certificates/ChangeLog +++ b/mcs/class/System/System.Security.Cryptography.X509Certificates/ChangeLog @@ -1,3 +1,14 @@ +2009-07-10 Gonzalo Paniagua Javier + + * X509Chain.cs: revert my last change here since it caused 2 tests to + fail. + +2009-07-02 Gonzalo Paniagua Javier + + * X509Certificate2.cs: + * X509Chain.cs: changes to make everything compile with latest changes + and fixed typo in IsChainComplete(). + 2008-06-26 Sebastien Pouliot * X509Certificate2.cs: Allow password-less ctor to (try to) open diff --git a/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Certificate2.cs b/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Certificate2.cs index f6f58531b3c..ccdfa63ffb7 100644 --- a/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Certificate2.cs +++ b/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Certificate2.cs @@ -40,6 +40,12 @@ using MX = Mono.Security.X509; namespace System.Security.Cryptography.X509Certificates { public class X509Certificate2 : X509Certificate { +#if !SECURITY_DEP + // Used in Mono.Security HttpsClientStream + public X509Certificate2 (byte[] rawData) + { + } +#endif #if SECURITY_DEP private bool _archived; private X509ExtensionCollection _extensions; diff --git a/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Chain.cs b/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Chain.cs index 26da15b59e6..a35037bccdb 100644 --- a/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Chain.cs +++ b/mcs/class/System/System.Security.Cryptography.X509Certificates/X509Chain.cs @@ -761,6 +761,9 @@ namespace System.Security.Cryptography.X509Certificates { // FIXME - download and install new CRL // then you get a second chance // crl = FindCrl (ca_cert, ref valid, ref out_of_date); + + // We need to get the subjectAltName and an URI from there (or use OCSP) + // X509KeyUsageExtension subjectAltName = (X509KeyUsageExtension) ca_cert.Extensions["2.5.29.17"]; } if (crl != null) { @@ -854,5 +857,14 @@ namespace System.Security.Cryptography.X509Certificates { } } } - +#elif NET_2_0 && !NET_2_1 +namespace System.Security.Cryptography.X509Certificates { + public class X509Chain { + public bool Build (X509Certificate2 cert) + { + return false; + } + } +} #endif + diff --git a/mcs/class/System/System.dll.sources b/mcs/class/System/System.dll.sources index ef0bc2d305b..9ba50a8e5ac 100644 --- a/mcs/class/System/System.dll.sources +++ b/mcs/class/System/System.dll.sources @@ -409,6 +409,8 @@ System.ComponentModel/UInt16Converter.cs System.ComponentModel/UInt32Converter.cs System.ComponentModel/UInt64Converter.cs System.ComponentModel/WarningException.cs +System.ComponentModel/WeakObjectWrapper.cs +System.ComponentModel/WeakObjectWrapperComparer.cs System.ComponentModel/Win32Exception.cs System.Configuration/ApplicationScopedSettingAttribute.cs System.Configuration/ApplicationSettingsBase.cs @@ -426,7 +428,9 @@ System.Configuration/IApplicationSettingsProvider.cs System.Configuration/IConfigurationSectionHandler.cs System.Configuration/IConfigurationSystem.cs System.Configuration/IConfigXmlNode.cs +System.Configuration/IdnElement.cs System.Configuration/IgnoreSectionHandler.cs +System.Configuration/IriParsingElement.cs System.Configuration/IPersistComponentSettings.cs System.Configuration/ISettingsProviderService.cs System.Configuration/LocalFileSettingsProvider.cs @@ -465,6 +469,7 @@ System.Configuration/SettingsGroupNameAttribute.cs System.Configuration/SingleTagSectionHandler.cs System.Configuration/SpecialSetting.cs System.Configuration/SpecialSettingAttribute.cs +System.Configuration/UriSection.cs System.Configuration/UserSettingsGroup.cs System.Configuration/UserScopedSettingAttribute.cs System/DefaultUriParser.cs diff --git a/mcs/class/System/System_test.dll.sources b/mcs/class/System/System_test.dll.sources index a03d1a98135..eae59da5b01 100644 --- a/mcs/class/System/System_test.dll.sources +++ b/mcs/class/System/System_test.dll.sources @@ -224,6 +224,8 @@ System.Net/WebClientTest.cs System.Net.Configuration/ConnectionManagementSectionTest.cs System.Net.Configuration/HttpWebRequestElementTest.cs System.Net.Configuration/WebRequestModulesSectionTest.cs +System.Net.Sockets/IPv6MulticastOptionTest.cs +System.Net.Sockets/MulticastOptionTest.cs System.Net.Sockets/NetworkStreamTest.cs System.Net.Sockets/TcpClientTest.cs System.Net.Sockets/TcpListenerTest.cs diff --git a/mcs/class/System/Test/Microsoft.CSharp/ChangeLog b/mcs/class/System/Test/Microsoft.CSharp/ChangeLog index 4a8356ffde1..91c184e7d81 100644 --- a/mcs/class/System/Test/Microsoft.CSharp/ChangeLog +++ b/mcs/class/System/Test/Microsoft.CSharp/ChangeLog @@ -1,3 +1,7 @@ +2009-06-26 Robert Jordan + + * CodeGeneratorIdentifierTest.cs: Upgrade to new NUnit style. + 2009-06-08 Zoltan Varga * CSharpCodeProviderTest.cs: Avoid depending on the order in which diff --git a/mcs/class/System/Test/Microsoft.CSharp/CodeGeneratorIdentifierTest.cs b/mcs/class/System/Test/Microsoft.CSharp/CodeGeneratorIdentifierTest.cs index ce24eec5160..417a25cb28e 100644 --- a/mcs/class/System/Test/Microsoft.CSharp/CodeGeneratorIdentifierTest.cs +++ b/mcs/class/System/Test/Microsoft.CSharp/CodeGeneratorIdentifierTest.cs @@ -14,7 +14,7 @@ using Microsoft.CSharp; namespace MonoTests.Microsoft.CSharp { [TestFixture] - public class CodeGeneratorIdentifierTest : Assertion + public class CodeGeneratorIdentifierTest { private ICodeGenerator gen; @@ -34,18 +34,18 @@ namespace MonoTests.Microsoft.CSharp public void TestCreateValidIdentifier () { - AssertEquals ("a", gen.CreateValidIdentifier ("a")); - AssertEquals ("_int", gen.CreateValidIdentifier ("int")); - AssertEquals ("_", gen.CreateValidIdentifier ("_")); - AssertEquals ("1", gen.CreateValidIdentifier ("1")); - AssertEquals ("1a", gen.CreateValidIdentifier ("1a")); - AssertEquals ("1*2", gen.CreateValidIdentifier ("1*2")); - AssertEquals ("-", gen.CreateValidIdentifier ("-")); - AssertEquals ("+", gen.CreateValidIdentifier ("+")); - AssertEquals ("", gen.CreateValidIdentifier ("")); - AssertEquals ("--", gen.CreateValidIdentifier ("--")); - AssertEquals ("++", gen.CreateValidIdentifier ("++")); - AssertEquals ("\u3042", gen.CreateValidIdentifier ("\u3042")); + Assert.AreEqual ("a", gen.CreateValidIdentifier ("a")); + Assert.AreEqual ("_int", gen.CreateValidIdentifier ("int")); + Assert.AreEqual ("_", gen.CreateValidIdentifier ("_")); + Assert.AreEqual ("1", gen.CreateValidIdentifier ("1")); + Assert.AreEqual ("1a", gen.CreateValidIdentifier ("1a")); + Assert.AreEqual ("1*2", gen.CreateValidIdentifier ("1*2")); + Assert.AreEqual ("-", gen.CreateValidIdentifier ("-")); + Assert.AreEqual ("+", gen.CreateValidIdentifier ("+")); + Assert.AreEqual ("", gen.CreateValidIdentifier ("")); + Assert.AreEqual ("--", gen.CreateValidIdentifier ("--")); + Assert.AreEqual ("++", gen.CreateValidIdentifier ("++")); + Assert.AreEqual ("\u3042", gen.CreateValidIdentifier ("\u3042")); } [Test] @@ -59,39 +59,39 @@ namespace MonoTests.Microsoft.CSharp public void TestCreateEscapedIdentifier () { - AssertEquals ("a", gen.CreateEscapedIdentifier ("a")); - AssertEquals ("@int", gen.CreateEscapedIdentifier ("int")); - AssertEquals ("_", gen.CreateEscapedIdentifier ("_")); - AssertEquals ("1", gen.CreateEscapedIdentifier ("1")); - AssertEquals ("1a", gen.CreateEscapedIdentifier ("1a")); - AssertEquals ("1*2", gen.CreateEscapedIdentifier ("1*2")); - AssertEquals ("-", gen.CreateEscapedIdentifier ("-")); - AssertEquals ("+", gen.CreateEscapedIdentifier ("+")); - AssertEquals ("", gen.CreateEscapedIdentifier ("")); - AssertEquals ("--", gen.CreateEscapedIdentifier ("--")); - AssertEquals ("++", gen.CreateEscapedIdentifier ("++")); - AssertEquals ("\u3042", gen.CreateEscapedIdentifier ("\u3042")); + Assert.AreEqual ("a", gen.CreateEscapedIdentifier ("a")); + Assert.AreEqual ("@int", gen.CreateEscapedIdentifier ("int")); + Assert.AreEqual ("_", gen.CreateEscapedIdentifier ("_")); + Assert.AreEqual ("1", gen.CreateEscapedIdentifier ("1")); + Assert.AreEqual ("1a", gen.CreateEscapedIdentifier ("1a")); + Assert.AreEqual ("1*2", gen.CreateEscapedIdentifier ("1*2")); + Assert.AreEqual ("-", gen.CreateEscapedIdentifier ("-")); + Assert.AreEqual ("+", gen.CreateEscapedIdentifier ("+")); + Assert.AreEqual ("", gen.CreateEscapedIdentifier ("")); + Assert.AreEqual ("--", gen.CreateEscapedIdentifier ("--")); + Assert.AreEqual ("++", gen.CreateEscapedIdentifier ("++")); + Assert.AreEqual ("\u3042", gen.CreateEscapedIdentifier ("\u3042")); } [Test] public void TestIsValidIdentifier () { - AssertEquals (true, gen.IsValidIdentifier ("_a")); - AssertEquals (true, gen.IsValidIdentifier ("_")); - AssertEquals (true, gen.IsValidIdentifier ("@return")); - AssertEquals (true, gen.IsValidIdentifier ("d1")); - AssertEquals (true, gen.IsValidIdentifier ("_1")); - AssertEquals (true, gen.IsValidIdentifier ("_a_1")); - AssertEquals (true, gen.IsValidIdentifier ("@a")); - AssertEquals (false, gen.IsValidIdentifier ("1")); - AssertEquals (false, gen.IsValidIdentifier (" ")); - AssertEquals (false, gen.IsValidIdentifier ("?")); - AssertEquals (false, gen.IsValidIdentifier (":_:")); - AssertEquals (false, gen.IsValidIdentifier ("_ ")); - AssertEquals (false, gen.IsValidIdentifier ("@ ")); - AssertEquals (false, gen.IsValidIdentifier ("1*2")); - AssertEquals (false, gen.IsValidIdentifier ("1_2")); - AssertEquals (false, gen.IsValidIdentifier ("a,b")); + Assert.AreEqual (true, gen.IsValidIdentifier ("_a")); + Assert.AreEqual (true, gen.IsValidIdentifier ("_")); + Assert.AreEqual (true, gen.IsValidIdentifier ("@return")); + Assert.AreEqual (true, gen.IsValidIdentifier ("d1")); + Assert.AreEqual (true, gen.IsValidIdentifier ("_1")); + Assert.AreEqual (true, gen.IsValidIdentifier ("_a_1")); + Assert.AreEqual (true, gen.IsValidIdentifier ("@a")); + Assert.AreEqual (false, gen.IsValidIdentifier ("1")); + Assert.AreEqual (false, gen.IsValidIdentifier (" ")); + Assert.AreEqual (false, gen.IsValidIdentifier ("?")); + Assert.AreEqual (false, gen.IsValidIdentifier (":_:")); + Assert.AreEqual (false, gen.IsValidIdentifier ("_ ")); + Assert.AreEqual (false, gen.IsValidIdentifier ("@ ")); + Assert.AreEqual (false, gen.IsValidIdentifier ("1*2")); + Assert.AreEqual (false, gen.IsValidIdentifier ("1_2")); + Assert.AreEqual (gen.IsValidIdentifier ("a, b"), false); } } } diff --git a/mcs/class/System/Test/System.Collections.Specialized/BitVector32Test.cs b/mcs/class/System/Test/System.Collections.Specialized/BitVector32Test.cs index 3adb631a369..c2772cd1b38 100644 --- a/mcs/class/System/Test/System.Collections.Specialized/BitVector32Test.cs +++ b/mcs/class/System/Test/System.Collections.Specialized/BitVector32Test.cs @@ -59,20 +59,20 @@ namespace MonoTests.System.Collections.Specialized public void Indexers () { BitVector32 b = new BitVector32 (7); - Assertion.Assert ("#1", b [0]); - Assertion.Assert ("#2", b [1]); - Assertion.Assert ("#3", b [2]); - Assertion.Assert ("#4", b [4]); - Assertion.Assert ("#5", !b [8]); - Assertion.Assert ("#6", !b [16]); + Assert.IsTrue (b [0], "#1"); + Assert.IsTrue (b [1], "#2"); + Assert.IsTrue (b [2], "#3"); + Assert.IsTrue (b [4], "#4"); + Assert.IsTrue (!b [8], "#5"); + Assert.IsTrue (!b [16], "#6"); b [8] = true; - Assertion.Assert ("#7", b [4]); - Assertion.Assert ("#8", b [8]); - Assertion.Assert ("#9", !b [16]); + Assert.IsTrue (b [4], "#7"); + Assert.IsTrue (b [8], "#8"); + Assert.IsTrue (!b [16], "#9"); b [8] = false; - Assertion.Assert ("#10", b [4]); - Assertion.Assert ("#11", !b [8]); - Assertion.Assert ("#12", !b [16]); + Assert.IsTrue (b [4], "#10"); + Assert.IsTrue (!b [8], "#11"); + Assert.IsTrue (!b [16], "#12"); BitVector32.Section s = BitVector32.CreateSection (31); s = BitVector32.CreateSection (64, s); @@ -83,7 +83,7 @@ namespace MonoTests.System.Collections.Specialized BitVector32 b2 = new BitVector32 (b1 [s]); //Console.WriteLine (b1.ToString ()); //Console.WriteLine (b2.ToString ()); - Assertion.AssertEquals ("#14", 123, b1 [s]); + Assert.AreEqual (123, b1 [s], "#14"); // b1 [s] = 15; //Console.WriteLine (b1.ToString ()); @@ -112,50 +112,50 @@ namespace MonoTests.System.Collections.Specialized public void CreateSection () { BitVector32.Section s = BitVector32.CreateSection (1); - Assertion.AssertEquals ("#1", (short) 1, s.Mask); + Assert.AreEqual ((short) 1, s.Mask, "#1"); s = BitVector32.CreateSection (2); - Assertion.AssertEquals ("#2", (short) 3, s.Mask); + Assert.AreEqual ((short) 3, s.Mask, "#2"); s = BitVector32.CreateSection (3); - Assertion.AssertEquals ("#3", (short) 3, s.Mask); + Assert.AreEqual ((short) 3, s.Mask, "#3"); s = BitVector32.CreateSection (5); - Assertion.AssertEquals ("#4", (short) 7, s.Mask); + Assert.AreEqual ((short) 7, s.Mask, "#4"); s = BitVector32.CreateSection (20); - Assertion.AssertEquals ("#4", (short) 0x1f, s.Mask); + Assert.AreEqual ((short) 0x1f, s.Mask, "#4"); s = BitVector32.CreateSection (Int16.MaxValue); - Assertion.AssertEquals ("#5", (short) 0x7fff, s.Mask); + Assert.AreEqual ((short) 0x7fff, s.Mask, "#5"); s = BitVector32.CreateSection (Int16.MaxValue - 100); - Assertion.AssertEquals ("#6", (short) 0x7fff, s.Mask); + Assert.AreEqual ((short) 0x7fff, s.Mask, "#6"); try { BitVector32.Section s2 = BitVector32.CreateSection (0); - Assertion.Fail ("#7"); + Assert.Fail ("#7"); } catch (ArgumentException) {} try { BitVector32.Section s2 = BitVector32.CreateSection (-1); - Assertion.Fail ("#8"); + Assert.Fail ("#8"); } catch (ArgumentException) {} try { BitVector32.Section s2 = BitVector32.CreateSection (Int16.MinValue); - Assertion.Fail ("#9"); + Assert.Fail ("#9"); } catch (ArgumentException) {} s = BitVector32.CreateSection (20); - Assertion.AssertEquals ("#10a", (short) 0x1f, s.Mask); - Assertion.AssertEquals ("#10b", (short) 0x00, s.Offset); + Assert.AreEqual ((short) 0x1f, s.Mask, "#10a"); + Assert.AreEqual ((short) 0x00, s.Offset, "#10b"); s = BitVector32.CreateSection (120, s); - Assertion.AssertEquals ("#10c", (short) 0x7f, s.Mask); - Assertion.AssertEquals ("#10d", (short) 0x05, s.Offset); + Assert.AreEqual ((short) 0x7f, s.Mask, "#10c"); + Assert.AreEqual ((short) 0x05, s.Offset, "#10d"); s = BitVector32.CreateSection (1000, s); - Assertion.AssertEquals ("#10e", (short) 0x3ff, s.Mask); - Assertion.AssertEquals ("#10f", (short) 0x0c, s.Offset); + Assert.AreEqual ((short) 0x3ff, s.Mask, "#10e"); + Assert.AreEqual ((short) 0x0c, s.Offset, "#10f"); } [Test] @@ -217,7 +217,7 @@ namespace MonoTests.System.Collections.Specialized Assert.AreEqual (1, bv[sect], "bv[sect]"); bv [sect] = 0; - Assertion.AssertEquals ("#12a", Int32.MaxValue, bv.Data); + Assert.AreEqual (Int32.MaxValue, bv.Data, "#12a"); } [Test, ExpectedException (typeof (ArgumentException))] diff --git a/mcs/class/System/Test/System.Collections.Specialized/ChangeLog b/mcs/class/System/Test/System.Collections.Specialized/ChangeLog index 7a442b2ba83..e0cec4060c0 100644 --- a/mcs/class/System/Test/System.Collections.Specialized/ChangeLog +++ b/mcs/class/System/Test/System.Collections.Specialized/ChangeLog @@ -1,3 +1,8 @@ +2009-06-26 Robert Jordan + + * BitVector32Test.cs, NameValueCollectionTest.cs: + Upgrade to new NUnit style. + 2008-08-21 Scott Peterson * BitVector32Test.cs: Added test to make sure illegal sections cannot diff --git a/mcs/class/System/Test/System.Collections.Specialized/NameValueCollectionTest.cs b/mcs/class/System/Test/System.Collections.Specialized/NameValueCollectionTest.cs index a37c58e39bb..5b76f619181 100644 --- a/mcs/class/System/Test/System.Collections.Specialized/NameValueCollectionTest.cs +++ b/mcs/class/System/Test/System.Collections.Specialized/NameValueCollectionTest.cs @@ -18,17 +18,17 @@ using NUnit.Framework; namespace MonoTests.System.Collections.Specialized { [TestFixture] - public class NameValueCollectionTest : Assertion { + public class NameValueCollectionTest { [Test] public void GetValues () { NameValueCollection col = new NameValueCollection (); col.Add ("foo1", "bar1"); - AssertEquals ("#1", null, col.GetValues (null)); - AssertEquals ("#2", null, col.GetValues ("")); - AssertEquals ("#3", null, col.GetValues ("NotExistent")); - AssertEquals ("#4", 1, col.GetValues (0).Length); + Assert.AreEqual (null, col.GetValues (null), "#1"); + Assert.AreEqual (null, col.GetValues (""), "#2"); + Assert.AreEqual (null, col.GetValues ("NotExistent"), "#3"); + Assert.AreEqual (1, col.GetValues (0).Length, "#4"); } [Test] @@ -37,7 +37,7 @@ namespace MonoTests.System.Collections.Specialized { { NameValueCollection c = new NameValueCollection (); c.Add ("foo1", "bar1"); - AssertEquals ("#5", null, c.GetValues (1)); + Assert.AreEqual (null, c.GetValues (1), "#5"); } [Test] @@ -45,11 +45,11 @@ namespace MonoTests.System.Collections.Specialized { { NameValueCollection col = new NameValueCollection (5); col.Add ("foo1", "bar1"); - AssertEquals ("#1", null, col.Get (null)); - AssertEquals ("#2", null, col.Get ("")); - AssertEquals ("#3", null, col.Get ("NotExistent")); - AssertEquals ("#4", "bar1", col.Get ("foo1")); - AssertEquals ("#5", "bar1", col.Get (0)); + Assert.AreEqual (null, col.Get (null), "#1"); + Assert.AreEqual (null, col.Get (""), "#2"); + Assert.AreEqual (null, col.Get ("NotExistent"), "#3"); + Assert.AreEqual ("bar1", col.Get ("foo1"), "#4"); + Assert.AreEqual ("bar1", col.Get (0), "#5"); } [Test] @@ -58,7 +58,7 @@ namespace MonoTests.System.Collections.Specialized { { NameValueCollection c = new NameValueCollection (); c.Add ("foo1", "bar1"); - AssertEquals ("#6", null, c.Get (1)); + Assert.AreEqual (null, c.Get (1), "#6"); } [Test] @@ -66,7 +66,7 @@ namespace MonoTests.System.Collections.Specialized { { NameValueCollection c = new NameValueCollection (CaseInsensitiveHashCodeProvider.DefaultInvariant, CaseInsensitiveComparer.DefaultInvariant); c.Add ("foo1", "bar1"); - AssertEquals ("#1", "foo1", c.GetKey (0)); + Assert.AreEqual ("foo1", c.GetKey (0), "#1"); } [Test] @@ -75,27 +75,27 @@ namespace MonoTests.System.Collections.Specialized { { NameValueCollection c = new NameValueCollection (); c.Add ("foo1", "bar1"); - AssertEquals ("#2", null, c.GetKey (1)); + Assert.AreEqual (null, c.GetKey (1), "#2"); } [Test] public void HasKeys () { NameValueCollection c = new NameValueCollection (5, CaseInsensitiveHashCodeProvider.DefaultInvariant, CaseInsensitiveComparer.DefaultInvariant); - Assert ("#1", !c.HasKeys ()); + Assert.IsTrue (!c.HasKeys (), "#1"); c.Add ("foo1", "bar1"); - Assert ("#2", c.HasKeys ()); + Assert.IsTrue (c.HasKeys (), "#2"); } [Test] public void Clear () { NameValueCollection c = new NameValueCollection (); - AssertEquals ("#1", 0, c.Count); + Assert.AreEqual (0, c.Count, "#1"); c.Add ("foo1", "bar1"); - AssertEquals ("#2", 1, c.Count); + Assert.AreEqual (1, c.Count, "#2"); c.Clear (); - AssertEquals ("#3", 0, c.Count); + Assert.AreEqual (0, c.Count, "#3"); } [Test] @@ -105,10 +105,10 @@ namespace MonoTests.System.Collections.Specialized { c.Add ("mono", "mono"); c.Add ("!mono", null); c.Add (null, "mono!"); - AssertEquals ("Count", 3, c.Count); - AssertEquals ("mono", "mono", c ["mono"]); - AssertNull ("!mono", c ["!mono"]); - AssertEquals ("mono!", "mono!", c [null]); + Assert.AreEqual (3, c.Count, "Count"); + Assert.AreEqual ("mono", c ["mono"], "mono"); + Assert.IsNull (c ["!mono"], "!mono"); + Assert.AreEqual ("mono!", c [null], "mono!"); } [Test] @@ -118,8 +118,8 @@ namespace MonoTests.System.Collections.Specialized { c.Add ("mono", "mono"); c.Add ("mono", "mono"); c.Add ("mono", "mono"); - AssertEquals ("Count", 1, c.Count); - AssertEquals ("mono", "mono,mono,mono", c ["mono"]); + Assert.AreEqual (1, c.Count, "Count"); + Assert.AreEqual ("mono,mono,mono", c ["mono"], "mono"); } [Test] @@ -129,8 +129,8 @@ namespace MonoTests.System.Collections.Specialized { c.Add ("mono", "mono"); c.Add ("mono", null); c.Add ("mono", "mono"); - AssertEquals ("Count", 1, c.Count); - AssertEquals ("mono", "mono,mono", c ["mono"]); + Assert.AreEqual (1, c.Count, "Count"); + Assert.AreEqual ("mono,mono", c ["mono"], "mono"); } [Test] @@ -140,18 +140,18 @@ namespace MonoTests.System.Collections.Specialized { NameValueCollection c2 = new NameValueCollection (c1); c2.Add (c1); - AssertEquals ("c1.Count", 0, c1.Count); - AssertEquals ("c2.Count", 0, c2.Count); + Assert.AreEqual (0, c1.Count, "c1.Count"); + Assert.AreEqual (0, c2.Count, "c2.Count"); c1.Add ("foo", "bar"); c2.Add ("bar", "foo"); - AssertEquals ("c1.Count", 1, c1.Count); - AssertEquals ("c2.Count", 1, c2.Count); + Assert.AreEqual (1, c1.Count, "c1.Count"); + Assert.AreEqual (1, c2.Count, "c2.Count"); c2.Add (c1); - AssertEquals ("c1.Count", 1, c1.Count); - AssertEquals ("c2.Count", 2, c2.Count); + Assert.AreEqual (1, c1.Count, "c1.Count"); + Assert.AreEqual (2, c2.Count, "c2.Count"); } [Test] @@ -173,7 +173,7 @@ namespace MonoTests.System.Collections.Specialized { b.Add ("Test", null); a.Add (b); - AssertEquals ("Count", 1, a.Count); + Assert.AreEqual (1, a.Count, "Count"); } [Test] @@ -183,10 +183,10 @@ namespace MonoTests.System.Collections.Specialized { c.Set ("mono", "mono"); c.Set ("!mono", null); c.Set (null, "mono!"); - AssertEquals ("Count", 3, c.Count); - AssertEquals ("mono", "mono", c ["mono"]); - AssertNull ("!mono", c ["!mono"]); - AssertEquals ("mono!", "mono!", c [null]); + Assert.AreEqual (3, c.Count, "Count"); + Assert.AreEqual ("mono", c ["mono"], "mono"); + Assert.IsNull (c ["!mono"], "!mono"); + Assert.AreEqual ("mono!", c [null], "mono!"); } [Test] @@ -196,19 +196,19 @@ namespace MonoTests.System.Collections.Specialized { c.Add ("mono", "mono"); c.Add ("!mono", "!mono"); c.Add ("mono!", "mono!"); - AssertEquals ("Count", 3, c.Count); - AssertEquals ("mono", "mono", c ["mono"]); - AssertEquals ("!mono", "!mono", c ["!mono"]); - AssertEquals ("mono!", "mono!", c ["mono!"]); + Assert.AreEqual (3, c.Count, "Count"); + Assert.AreEqual ("mono", c ["mono"], "mono"); + Assert.AreEqual ("!mono", c ["!mono"], "!mono"); + Assert.AreEqual ("mono!", c ["mono!"], "mono!"); c.Set ("mono", "nomo"); c.Set ("!mono", null); c.Set (null, "mono!"); - AssertEquals ("Count", 4, c.Count); // mono! isn't removed - AssertEquals ("mono", "nomo", c ["mono"]); - AssertNull ("!mono", c ["!mono"]); - AssertEquals ("mono!1", "mono!", c ["mono!"]); - AssertEquals ("mono!2", "mono!", c [null]); + Assert.AreEqual (4, c.Count, "Count"); // mono! isn't removed + Assert.AreEqual ("nomo", c ["mono"], "mono"); + Assert.IsNull (c ["!mono"], "!mono"); + Assert.AreEqual ("mono!", c ["mono!"], "mono!1"); + Assert.AreEqual ("mono!", c [null], "mono!2"); } [Test] @@ -220,7 +220,7 @@ namespace MonoTests.System.Collections.Specialized { c.Add ("MoNo", "MoNo"); c.Add ("mOnO", "mOnO"); c.Add ("MONO", "MONO"); - AssertEquals ("Count", 1, c.Count); + Assert.AreEqual (1, c.Count, "Count"); } [Test] @@ -318,24 +318,24 @@ namespace MonoTests.System.Collections.Specialized { string add = "Add-" + i.ToString () + "-Count"; c.Add (items [i], add); - AssertEquals (add, 1, c.Count); + Assert.AreEqual (1, c.Count, add); c.Remove (items [0]); - AssertEquals ("Remove-0-Count", 0, c.Count); + Assert.AreEqual (0, c.Count, "Remove-0-Count"); c.Add (items [i], add); - AssertEquals (add, 1, c.Count); + Assert.AreEqual (1, c.Count, add); c.Remove (items [1]); - AssertEquals ("Remove-1-Count", 0, c.Count); + Assert.AreEqual (0, c.Count, "Remove-1-Count"); c.Add (items [i], add); - AssertEquals (add, 1, c.Count); + Assert.AreEqual (1, c.Count, add); c.Remove (items [2]); - AssertEquals ("Remove-2-Count", 0, c.Count); + Assert.AreEqual (0, c.Count, "Remove-2-Count"); c.Add (items [i], add); - AssertEquals (add , 1, c.Count); + Assert.AreEqual (1, c.Count, add); c.Remove (items [3]); - AssertEquals ("Remove-3-Count", 0, c.Count); + Assert.AreEqual (0, c.Count, "Remove-3-Count"); } } [Test] @@ -366,7 +366,7 @@ namespace MonoTests.System.Collections.Specialized { { NameValueCollection coll = new NameValueCollection (new EqualityComparer ()); coll.Add ("a", "1"); - AssertEquals ("#1", 1, coll.Count); + Assert.AreEqual (1, coll.Count, "#1"); } [Test] @@ -374,7 +374,7 @@ namespace MonoTests.System.Collections.Specialized { { NameValueCollection coll = new NameValueCollection (5, new EqualityComparer ()); coll.Add ("a", "1"); - AssertEquals ("#1", 1, coll.Count); + Assert.AreEqual (1, coll.Count, "#1"); } [Test] @@ -389,7 +389,7 @@ namespace MonoTests.System.Collections.Specialized { { NameValueCollection c1 = new NameValueCollection ((IEqualityComparer)null); c1.Add ("key", "value"); - AssertEquals ("Constructor_IEqualityComparer_Null", c1.Get ("KEY"), "value"); + Assert.AreEqual (c1.Get ("KEY"), "value", "Constructor_IEqualityComparer_Null"); c1.Remove ("key"); } @@ -399,7 +399,7 @@ namespace MonoTests.System.Collections.Specialized { NameValueCollection c1 = new NameValueCollection (StringComparer.InvariantCultureIgnoreCase); c1.Add ("key", "value"); NameValueCollection c2 = new NameValueCollection (c1); - AssertEquals ("Constructor_NameValueCollection", c2.Get ("KEY"), "value"); + Assert.AreEqual (c2.Get ("KEY"), "value", "Constructor_NameValueCollection"); c2.Remove ("key"); } #endif diff --git a/mcs/class/System/Test/System.ComponentModel/ChangeLog b/mcs/class/System/Test/System.ComponentModel/ChangeLog index 48306615b18..9c4191317dd 100644 --- a/mcs/class/System/Test/System.ComponentModel/ChangeLog +++ b/mcs/class/System/Test/System.ComponentModel/ChangeLog @@ -1,3 +1,14 @@ +2009-06-26 Robert Jordan + + * EventHandlerListTests.cs, LicenseManagerTests.cs: + Upgrade to new NUnit style. Standalone tests (#if !NUNIT) + removed. + +2009-06-22 Marek Habersack + + * TypeDescriptorTests.cs: added tests for 2.0+ APIs which deal + with adding/removing/getting type description providers. + 2009-05-14 Jonathan Pryor * ListChangedEventArgsTest.cs: Fix .NET 1.1 compile error. diff --git a/mcs/class/System/Test/System.ComponentModel/EventHandlerListTests.cs b/mcs/class/System/Test/System.ComponentModel/EventHandlerListTests.cs index ac22315f33a..d8e40b64998 100644 --- a/mcs/class/System/Test/System.ComponentModel/EventHandlerListTests.cs +++ b/mcs/class/System/Test/System.ComponentModel/EventHandlerListTests.cs @@ -9,35 +9,18 @@ // (c) 2003 Martin Willemoes Hansen // -#define NUNIT // Comment out this one if you wanna play with the test without using NUnit - -#if NUNIT using NUnit.Framework; -#else -using System.Reflection; -#endif - using System; using System.ComponentModel; namespace MonoTests.System.ComponentModel { -#if NUNIT [TestFixture] public class EventHandlerListTests { -#else - public class EventHandlerListTests - { -#endif -#if NUNIT [SetUp] public void GetReady () { -#else - static EventHandlerListTests () - { -#endif } int calls = 0; @@ -135,42 +118,6 @@ namespace MonoTests.System.ComponentModel d = list [null] as EventHandler; Assertion.Assert ("NullKey #02", d == null); } - -#if !NUNIT - void Assert (string msg, bool result) - { - if (!result) - Console.WriteLine (msg); - } - - void AssertEquals (string msg, object expected, object real) - { - if (expected == null && real == null) - return; - - if (expected != null && expected.Equals (real)) - return; - - Console.WriteLine ("{0}: expected: '{1}', got: '{2}'", msg, expected, real); - } - - void Fail (string msg) - { - Console.WriteLine ("Failed: {0}", msg); - } - - static void Main () - { - EventHandlerListTests p = new EventHandlerListTests (); - Type t = p.GetType (); - MethodInfo [] methods = t.GetMethods (); - foreach (MethodInfo m in methods) { - if (m.Name.Substring (0, 4) == "Test") { - m.Invoke (p, null); - } - } - } -#endif } } diff --git a/mcs/class/System/Test/System.ComponentModel/LicenseManagerTests.cs b/mcs/class/System/Test/System.ComponentModel/LicenseManagerTests.cs index 5af2c6cc4c1..966dfbb348d 100644 --- a/mcs/class/System/Test/System.ComponentModel/LicenseManagerTests.cs +++ b/mcs/class/System/Test/System.ComponentModel/LicenseManagerTests.cs @@ -10,14 +10,7 @@ // (c) 2003 Martin Willemoes Hansen // (c) 2004 Ivan Hamilton -#define NUNIT // Comment out this one if you wanna play with the test without using NUnit - -#if NUNIT using NUnit.Framework; -#else -using System.Reflection; -#endif - using System; using System.ComponentModel; using System.ComponentModel.Design; @@ -111,47 +104,38 @@ namespace MonoTests.System.ComponentModel } -#if NUNIT [TestFixture] - public class LicenseManagerTests : Assertion + public class LicenseManagerTests { [SetUp] public void GetReady () { -#else - public class LicenseManagerTests - { - static LicenseManagerTests () - { -#endif } -#if NUNIT [Test] -#endif public void Test () { object lockObject = new object (); //**DEFAULT CONTEXT & LicenseUsageMode** //Get CurrentContext, check default type - AssertEquals ("LicenseManager #1", "System.ComponentModel.Design.RuntimeLicenseContext", LicenseManager.CurrentContext.GetType().ToString()); + Assert.AreEqual ("System.ComponentModel.Design.RuntimeLicenseContext", LicenseManager.CurrentContext.GetType().ToString(), "LicenseManager #1"); //Read default LicenseUsageMode, check against CurrentContext (LicCont).UsageMode - AssertEquals ("LicenseManager #2", LicenseManager.CurrentContext.UsageMode, LicenseManager.UsageMode); + Assert.AreEqual (LicenseManager.CurrentContext.UsageMode, LicenseManager.UsageMode, "LicenseManager #2"); //**CHANGING CONTEXT** //Change the context and check it changes LicenseContext oldcontext = LicenseManager.CurrentContext; LicenseContext newcontext = new DesigntimeLicenseContext(); LicenseManager.CurrentContext = newcontext; - AssertEquals ("LicenseManager #3", newcontext, LicenseManager.CurrentContext); + Assert.AreEqual (newcontext, LicenseManager.CurrentContext, "LicenseManager #3"); //Check the UsageMode changed too - AssertEquals ("LicenseManager #4", newcontext.UsageMode, LicenseManager.UsageMode); + Assert.AreEqual (newcontext.UsageMode, LicenseManager.UsageMode, "LicenseManager #4"); //Set Context back to original LicenseManager.CurrentContext = oldcontext; //Check it went back - AssertEquals ("LicenseManager #5", oldcontext, LicenseManager.CurrentContext); + Assert.AreEqual (oldcontext, LicenseManager.CurrentContext, "LicenseManager #5"); //Check the UsageMode changed too - AssertEquals ("LicenseManager #6", oldcontext.UsageMode, LicenseManager.UsageMode); + Assert.AreEqual (oldcontext.UsageMode, LicenseManager.UsageMode, "LicenseManager #6"); //**CONTEXT LOCKING** //Lock the context @@ -164,18 +148,18 @@ namespace MonoTests.System.ComponentModel } catch (Exception e) { - AssertEquals ("LicenseManager #7",typeof(InvalidOperationException), e.GetType()); + Assert.AreEqual (typeof(InvalidOperationException), e.GetType(), "LicenseManager #7"); exceptionThrown = true; } //Check the exception was thrown - AssertEquals ("LicenseManager #8", true, exceptionThrown); + Assert.AreEqual (true, exceptionThrown, "LicenseManager #8"); //Check the context didn't change - AssertEquals ("LicenseManager #9", oldcontext, LicenseManager.CurrentContext); + Assert.AreEqual (oldcontext, LicenseManager.CurrentContext, "LicenseManager #9"); //Unlock it LicenseManager.UnlockContext(lockObject); //Now's unlocked, change it LicenseManager.CurrentContext=newcontext; - AssertEquals ("LicenseManager #10", newcontext, LicenseManager.CurrentContext); + Assert.AreEqual (newcontext, LicenseManager.CurrentContext, "LicenseManager #10"); //Change it back LicenseManager.CurrentContext = oldcontext; @@ -191,21 +175,21 @@ namespace MonoTests.System.ComponentModel } catch (Exception e) { - AssertEquals ("LicenseManager #11",typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "LicenseManager #11"); exceptionThrown = true; } - AssertEquals ("LicenseManager #12",true, exceptionThrown); + Assert.AreEqual (true, exceptionThrown, "LicenseManager #12"); //Unlock it LicenseManager.UnlockContext(lockObject); //** bool IsValid(Type); - AssertEquals ("LicenseManager #13", true, LicenseManager.IsLicensed (typeof (UnlicensedObject))); - AssertEquals ("LicenseManager #14", true, LicenseManager.IsLicensed (typeof (LicensedObject))); - AssertEquals ("LicenseManager #15", false, LicenseManager.IsLicensed (typeof (InvalidLicensedObject))); + Assert.AreEqual (true, LicenseManager.IsLicensed (typeof (UnlicensedObject)), "LicenseManager #13"); + Assert.AreEqual (true, LicenseManager.IsLicensed (typeof (LicensedObject)), "LicenseManager #14"); + Assert.AreEqual (false, LicenseManager.IsLicensed (typeof (InvalidLicensedObject)), "LicenseManager #15"); - AssertEquals ("LicenseManager #16", true, LicenseManager.IsValid (typeof (UnlicensedObject))); - AssertEquals ("LicenseManager #17", true, LicenseManager.IsValid (typeof (LicensedObject))); - AssertEquals ("LicenseManager #18", false, LicenseManager.IsValid (typeof (InvalidLicensedObject))); + Assert.AreEqual (true, LicenseManager.IsValid (typeof (UnlicensedObject)), "LicenseManager #16"); + Assert.AreEqual (true, LicenseManager.IsValid (typeof (LicensedObject)), "LicenseManager #17"); + Assert.AreEqual (false, LicenseManager.IsValid (typeof (InvalidLicensedObject)), "LicenseManager #18"); UnlicensedObject unlicensedObject = new UnlicensedObject (); LicensedObject licensedObject = new LicensedObject (); @@ -213,16 +197,16 @@ namespace MonoTests.System.ComponentModel //** bool IsValid(Type, object, License); License license=null; - AssertEquals ("LicenseManager #19", true, LicenseManager.IsValid (unlicensedObject.GetType (), unlicensedObject, out license)); - AssertEquals ("LicenseManager #20", null, license); + Assert.AreEqual (true, LicenseManager.IsValid (unlicensedObject.GetType (), unlicensedObject, out license), "LicenseManager #19"); + Assert.AreEqual (null, license, "LicenseManager #20"); license=null; - AssertEquals ("LicenseManager #21",true, LicenseManager.IsValid (licensedObject.GetType (), licensedObject,out license)); - AssertEquals ("LicenseManager #22", "TestLicense", license.GetType ().Name); + Assert.AreEqual (true, LicenseManager.IsValid (licensedObject.GetType (), licensedObject,out license), "LicenseManager #21"); + Assert.AreEqual ("TestLicense", license.GetType ().Name, "LicenseManager #22"); license=null; - AssertEquals ("LicenseManager #23",false, LicenseManager.IsValid (invalidLicensedObject.GetType (), invalidLicensedObject, out license)); - AssertEquals ("LicenseManager #24",null, license); + Assert.AreEqual (false, LicenseManager.IsValid (invalidLicensedObject.GetType (), invalidLicensedObject, out license), "LicenseManager #23"); + Assert.AreEqual (null, license, "LicenseManager #24"); //** void Validate(Type); //Shouldn't throw exception @@ -237,20 +221,20 @@ namespace MonoTests.System.ComponentModel } catch (Exception e) { - AssertEquals ("LicenseManager #25",typeof(LicenseException), e.GetType()); + Assert.AreEqual (typeof(LicenseException), e.GetType(), "LicenseManager #25"); exceptionThrown=true; } //Check the exception was thrown - AssertEquals ("LicenseManager #26",true, exceptionThrown); + Assert.AreEqual (true, exceptionThrown, "LicenseManager #26"); //** License Validate(Type, object); //Shouldn't throw exception, returns null license license=LicenseManager.Validate (typeof (UnlicensedObject), unlicensedObject); - AssertEquals ("LicenseManager #27", null, license); + Assert.AreEqual (null, license, "LicenseManager #27"); //Shouldn't throw exception, returns TestLicense license license=LicenseManager.Validate(typeof(LicensedObject), licensedObject); - AssertEquals ("LicenseManager #28", "TestLicense", license.GetType ().Name); + Assert.AreEqual ("TestLicense", license.GetType ().Name, "LicenseManager #28"); //Should throw exception, returns null license exceptionThrown=false; @@ -261,24 +245,24 @@ namespace MonoTests.System.ComponentModel } catch (Exception e) { - AssertEquals ("LicenseManager #29",typeof (LicenseException), e.GetType ()); + Assert.AreEqual (typeof (LicenseException), e.GetType (), "LicenseManager #29"); exceptionThrown=true; } //Check the exception was thrown - AssertEquals ("LicenseManager #30",true, exceptionThrown); - AssertEquals ("LicenseManager #31",null, license); + Assert.AreEqual (true, exceptionThrown, "LicenseManager #30"); + Assert.AreEqual (null, license, "LicenseManager #31"); //** object CreateWithContext (Type, LicenseContext); object cwc = null; //Test we can create an unlicensed object with no context cwc = LicenseManager.CreateWithContext (typeof (UnlicensedObject), null); - AssertEquals ("LicenseManager #32", "UnlicensedObject", cwc.GetType ().Name); + Assert.AreEqual ("UnlicensedObject", cwc.GetType ().Name, "LicenseManager #32"); //Test we can create RunTime with CurrentContext (runtime) cwc = null; cwc = LicenseManager.CreateWithContext (typeof (RuntimeLicensedObject), LicenseManager.CurrentContext); - AssertEquals ("LicenseManager #33", "RuntimeLicensedObject", cwc.GetType ().Name); + Assert.AreEqual ("RuntimeLicensedObject", cwc.GetType ().Name, "LicenseManager #33"); //Test we can't create DesignTime with CurrentContext (runtime) exceptionThrown=false; try @@ -288,62 +272,24 @@ namespace MonoTests.System.ComponentModel } catch (Exception e) { - AssertEquals ("LicenseManager #34",typeof (LicenseException), e.GetType ()); + Assert.AreEqual (typeof (LicenseException), e.GetType (), "LicenseManager #34"); exceptionThrown=true; } //Check the exception was thrown - AssertEquals ("LicenseManager #35",true, exceptionThrown); + Assert.AreEqual (true, exceptionThrown, "LicenseManager #35"); //Test we can create DesignTime with A new DesignTimeContext cwc = null; cwc = LicenseManager.CreateWithContext (typeof (DesigntimeLicensedObject), new DesigntimeLicenseContext ()); - AssertEquals ("LicenseManager #36", "DesigntimeLicensedObject", cwc.GetType ().Name); + Assert.AreEqual ("DesigntimeLicensedObject", cwc.GetType ().Name, "LicenseManager #36"); //** object CreateWithContext(Type, LicenseContext, object[]); //Test we can create RunTime with CurrentContext (runtime) cwc = null; cwc = LicenseManager.CreateWithContext (typeof (RuntimeLicensedObject), LicenseManager.CurrentContext, new object [] { 7 }); - AssertEquals ("LicenseManager #37", "RuntimeLicensedObject", cwc.GetType ().Name); + Assert.AreEqual ("RuntimeLicensedObject", cwc.GetType ().Name, "LicenseManager #37"); } - -#if !NUNIT - void Assert (string msg, bool result) - { - if (!result) - Console.WriteLine (msg); - } - - void AssertEquals (string msg, object expected, object real) - { - if (expected == null && real == null) - return; - - if (expected != null && expected.Equals (real)) - return; - - Console.WriteLine ("{0}: expected: '{1}', got: '{2}'", msg, expected, real); - } - - void Fail (string msg) - { - Console.WriteLine ("Failed: {0}", msg); - } - - static void Main () - { - LicenseManagerTests p = new LicenseManagerTests (); - Type t = p.GetType (); - MethodInfo [] methods = t.GetMethods (); - foreach (MethodInfo m in methods) - { - if (m.Name.Substring (0, 4) == "Test") - { - m.Invoke (p, null); - } - } - } -#endif } } diff --git a/mcs/class/System/Test/System.ComponentModel/TypeDescriptorTests.cs b/mcs/class/System/Test/System.ComponentModel/TypeDescriptorTests.cs index 4f7055db09f..82ef9917936 100644 --- a/mcs/class/System/Test/System.ComponentModel/TypeDescriptorTests.cs +++ b/mcs/class/System/Test/System.ComponentModel/TypeDescriptorTests.cs @@ -14,6 +14,10 @@ using DescriptionAttribute = System.ComponentModel.DescriptionAttribute; using System.ComponentModel.Design; using System.Globalization; +#if NET_2_0 +using System.Collections.Generic; +#endif + using NUnit.Framework; namespace MonoTests.System.ComponentModel @@ -362,7 +366,7 @@ namespace MonoTests.System.ComponentModel { public TestClass() {} - + void TestFunction () {} } @@ -390,7 +394,7 @@ namespace MonoTests.System.ComponentModel public TypeConverter GetConverter() { - return new StringConverter(); + return new StringConverter (); } public EventDescriptorCollection GetEvents(Attribute[] attributes) @@ -452,9 +456,53 @@ namespace MonoTests.System.ComponentModel public string GetClassName() { - return this.GetType().Name; + return this.GetType ().Name; + } + } + +#if NET_2_0 + class MyCustomTypeDescriptor : CustomTypeDescriptor + { + public MyTypeDescriptionProvider Provider { get; private set; } + + public MyCustomTypeDescriptor (MyTypeDescriptionProvider provider) + { + Provider = provider; + } + + public override string GetClassName () + { + return Provider.Id; + } + } + + class MyTypeDescriptionProvider : TypeDescriptionProvider + { + public string Id { get; private set; } + public bool CreateInstanceCalled { get; private set; } + + public MyTypeDescriptionProvider () + : this (null) + { + } + + public MyTypeDescriptionProvider (string id) + { + Id = id; + } + + public override ICustomTypeDescriptor GetTypeDescriptor (Type objectType, object instance) + { + return new MyCustomTypeDescriptor (this); + } + + public override object CreateInstance (IServiceProvider provider, Type objectType, Type[] argTypes, object[] args) + { + CreateInstanceCalled = true; + return base.CreateInstance (provider, objectType, argTypes, args); } } +#endif [TestFixture] public class TypeDescriptorTests @@ -464,6 +512,550 @@ namespace MonoTests.System.ComponentModel MyComponent nfscom = new MyComponent (new NoFilterSite (new MyContainer ())); AnotherComponent anothercom = new AnotherComponent (); +#if NET_2_0 + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestAddAttributes_Type_Attributes_1 () + { + TypeDescriptionProvider provider = TypeDescriptor.AddAttributes ((Type) null, null); + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestAddAttributes_Type_Attributes_2 () + { + TypeDescriptionProvider provider = TypeDescriptor.AddAttributes (typeof (string), null); + } + + [Test] + public void TestAddAttributes_Type_Attributes_3 () + { + Attribute[] new_attributes = new Attribute[] { + new ReadOnlyAttribute (true), + new BindableAttribute (true) + }; + + TypeDescriptionProvider provider = null; + ICustomTypeDescriptor descriptor; + AttributeCollection attributes; + + try { + provider = TypeDescriptor.AddAttributes (typeof (string), new Attribute[] { }); + Assert.IsNotNull (provider, "#A1"); + + descriptor = provider.GetTypeDescriptor (typeof (string)); + Assert.IsNotNull (descriptor, "#A1-1"); + + attributes = descriptor.GetAttributes (); + Assert.IsNotNull (attributes, "#A1-2"); + } finally { + if (provider != null) + TypeDescriptor.RemoveProvider (provider, typeof (string)); + } + + provider = null; + try { + provider = TypeDescriptor.AddAttributes (typeof (string), new_attributes); + Assert.IsNotNull (provider, "#B1"); + + descriptor = provider.GetTypeDescriptor (typeof (string)); + Assert.IsNotNull (descriptor, "#B1-1"); + + attributes = descriptor.GetAttributes (); + Assert.IsNotNull (attributes, "#B1-2"); + Assert.AreNotEqual (0, attributes.Count, "#B1-3"); + Assert.IsTrue (attributes.Contains (new_attributes)); + } finally { + if (provider != null) + TypeDescriptor.RemoveProvider (provider, typeof (string)); + } + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestAddAttributes_Instance_Attributes_1 () + { + TypeDescriptionProvider provider = TypeDescriptor.AddAttributes ((object) null, null); + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestAddAttributes_Instance_Attributes_2 () + { + string s = "test"; + TypeDescriptionProvider provider = TypeDescriptor.AddAttributes (s, null); + } + + [Test] + public void TestAddAttributes_Instance_Attributes_3 () + { + Attribute[] new_attributes = new Attribute[] { + new ReadOnlyAttribute (true), + new BindableAttribute (true) + }; + + TypeDescriptionProvider provider = null; + ICustomTypeDescriptor descriptor; + AttributeCollection attributes; + string s = "test"; + + try { + provider = TypeDescriptor.AddAttributes (s, new Attribute[] { }); + Assert.IsNotNull (provider, "#A1"); + + descriptor = provider.GetTypeDescriptor (s); + Assert.IsNotNull (descriptor, "#A1-1"); + + attributes = descriptor.GetAttributes (); + Assert.IsNotNull (attributes, "#A1-2"); + } finally { + if (provider != null) + TypeDescriptor.RemoveProvider (provider, s); + } + + provider = null; + try { + provider = TypeDescriptor.AddAttributes (s, new_attributes); + Assert.IsNotNull (provider, "#B1"); + + descriptor = provider.GetTypeDescriptor (s); + Assert.IsNotNull (descriptor, "#B1-1"); + + attributes = descriptor.GetAttributes (); + Assert.IsNotNull (attributes, "#B1-2"); + Assert.AreNotEqual (0, attributes.Count, "#B1-3"); + Assert.IsTrue (attributes.Contains (new_attributes)); + } finally { + if (provider != null) + TypeDescriptor.RemoveProvider (provider, s); + } + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestAddProvider_Provider_Instance_1 () + { + TypeDescriptor.AddProvider (null, (object)null); + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestAddProvider_Provider_Instance_2 () + { + var provider = new MyTypeDescriptionProvider (); + TypeDescriptor.AddProvider (provider, (object) null); + } + + [Test] + public void TestAddProvider_Provider_Instance_3 () + { + var instance = new MyComponent (); + var providers = new MyTypeDescriptionProvider[] { + new MyTypeDescriptionProvider ("One"), + new MyTypeDescriptionProvider ("Two"), + new MyTypeDescriptionProvider ("Three"), + new MyTypeDescriptionProvider ("Four") + }; + + try { + TypeDescriptionProvider provider; + ICustomTypeDescriptor descriptor; + + TypeDescriptor.AddProvider (providers[0], instance); + provider = TypeDescriptor.GetProvider (instance); + Assert.IsNotNull (provider, "#A1"); + descriptor = provider.GetTypeDescriptor (instance.GetType (), instance); + Assert.IsNotNull (descriptor, "#A1-1"); + Assert.AreEqual ("One", descriptor.GetClassName (), "#A1-2"); + Assert.AreEqual (false, providers[0].CreateInstanceCalled, "#A1-3"); + + descriptor.GetProperties (); + + TypeDescriptor.AddProvider (providers[1], instance); + provider = TypeDescriptor.GetProvider (instance); + Assert.IsNotNull (provider, "#B1"); + descriptor = provider.GetTypeDescriptor (instance.GetType (), instance); + Assert.IsNotNull (descriptor, "#B1-1"); + Assert.AreEqual ("Two", descriptor.GetClassName (), "#B1-2"); + + // Providers are stored in a stack according to docs, but it's in reality + // a FIFO linked list + TypeDescriptor.AddProvider (providers[2], instance); + TypeDescriptor.AddProvider (providers[3], instance); + provider = TypeDescriptor.GetProvider (instance); + Assert.IsNotNull (provider, "#C1"); + descriptor = provider.GetTypeDescriptor (instance.GetType (), instance); + Assert.IsNotNull (descriptor, "#C1-1"); + Assert.AreEqual ("Four", descriptor.GetClassName (), "#C1-2"); + + TypeDescriptor.RemoveProvider (providers[2], instance); + provider = TypeDescriptor.GetProvider (instance); + Assert.IsNotNull (provider, "#D1"); + descriptor = provider.GetTypeDescriptor (instance.GetType (), instance); + Assert.IsNotNull (descriptor, "#D1-1"); + Assert.AreEqual ("Four", descriptor.GetClassName (), "#D1-2"); + + TypeDescriptor.RemoveProvider (providers[3], instance); + provider = TypeDescriptor.GetProvider (instance); + Assert.IsNotNull (provider, "#E1"); + descriptor = provider.GetTypeDescriptor (instance.GetType (), instance); + Assert.IsNotNull (descriptor, "#E1-1"); + Assert.AreEqual ("Two", descriptor.GetClassName (), "#E1-2"); + + } finally { + TypeDescriptor.RemoveProvider (providers[0], instance); + TypeDescriptor.RemoveProvider (providers[1], instance); + TypeDescriptor.RemoveProvider (providers[2], instance); + TypeDescriptor.RemoveProvider (providers[3], instance); + } + } + + [Test] + public void TestAddProvider_Provider_Instance_4 () + { + var instance = new MyComponent (); + var providers = new MyTypeDescriptionProvider[] { + new MyTypeDescriptionProvider ("One"), + new MyTypeDescriptionProvider ("Two"), + new MyTypeDescriptionProvider ("Three"), + new MyTypeDescriptionProvider ("Four") + }; + + try { + TypeDescriptionProvider provider; + ICustomTypeDescriptor descriptor; + + TypeDescriptor.AddProvider (providers[0], instance); + provider = TypeDescriptor.GetProvider (instance); + Assert.IsNotNull (provider, "#A1"); + descriptor = provider.GetTypeDescriptor (instance.GetType (), instance); + Assert.IsNotNull (descriptor, "#A1-1"); + Assert.AreEqual ("One", descriptor.GetClassName (), "#A1-2"); + Assert.AreEqual (false, providers[0].CreateInstanceCalled, "#A1-3"); + + descriptor.GetProperties (); + + TypeDescriptor.AddProvider (providers[1], instance); + provider = TypeDescriptor.GetProvider (instance); + Assert.IsNotNull (provider, "#B1"); + descriptor = provider.GetTypeDescriptor (instance.GetType (), instance); + Assert.IsNotNull (descriptor, "#B1-1"); + Assert.AreEqual ("Two", descriptor.GetClassName (), "#B1-2"); + + // Providers are stored in a stack according to docs, but it's in reality + // a FIFO linked list + TypeDescriptor.AddProvider (providers[0], instance); + TypeDescriptor.AddProvider (providers[0], instance); + provider = TypeDescriptor.GetProvider (instance); + Assert.IsNotNull (provider, "#C1"); + descriptor = provider.GetTypeDescriptor (instance.GetType (), instance); + Assert.IsNotNull (descriptor, "#C1-1"); + Assert.AreEqual ("One", descriptor.GetClassName (), "#C1-2"); + + TypeDescriptor.RemoveProvider (providers[0], instance); + provider = TypeDescriptor.GetProvider (instance); + Assert.IsNotNull (provider, "#D1"); + descriptor = provider.GetTypeDescriptor (instance.GetType (), instance); + Assert.IsNotNull (descriptor, "#D1-1"); + Assert.AreEqual ("One", descriptor.GetClassName (), "#D1-2"); + + TypeDescriptor.RemoveProvider (providers[0], instance); + provider = TypeDescriptor.GetProvider (instance); + Assert.IsNotNull (provider, "#E1"); + descriptor = provider.GetTypeDescriptor (instance.GetType (), instance); + Assert.IsNotNull (descriptor, "#E1-1"); + Assert.AreEqual ("Two", descriptor.GetClassName (), "#E1-2"); + + } finally { + TypeDescriptor.RemoveProvider (providers[0], instance); + TypeDescriptor.RemoveProvider (providers[1], instance); + TypeDescriptor.RemoveProvider (providers[2], instance); + TypeDescriptor.RemoveProvider (providers[3], instance); + } + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestAddProvider_Provider_Type_1 () + { + TypeDescriptor.AddProvider (null, (Type) null); + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestAddProvider_Provider_Type_2 () + { + var provider = new MyTypeDescriptionProvider (); + TypeDescriptor.AddProvider (provider, (Type) null); + } + + [Test] + public void TestAddProvider_Provider_Type_3 () + { + var type = typeof (MyComponent); + var providers = new MyTypeDescriptionProvider[] { + new MyTypeDescriptionProvider ("One"), + new MyTypeDescriptionProvider ("Two"), + new MyTypeDescriptionProvider ("Three"), + new MyTypeDescriptionProvider ("Four") + }; + + try { + TypeDescriptionProvider provider; + ICustomTypeDescriptor descriptor; + + TypeDescriptor.AddProvider (providers[0], type); + provider = TypeDescriptor.GetProvider (type); + Assert.IsNotNull (provider, "#A1"); + descriptor = provider.GetTypeDescriptor (type); + Assert.IsNotNull (descriptor, "#A1-1"); + Assert.AreEqual ("One", descriptor.GetClassName (), "#A1-2"); + Assert.AreEqual (false, providers[0].CreateInstanceCalled, "#A1-3"); + + TypeDescriptor.AddProvider (providers[1], type); + provider = TypeDescriptor.GetProvider (type); + Assert.IsNotNull (provider, "#B1"); + descriptor = provider.GetTypeDescriptor (type.GetType (), type); + Assert.IsNotNull (descriptor, "#B1-1"); + Assert.AreEqual ("Two", descriptor.GetClassName (), "#B1-2"); + + // Providers are stored in a stack according to docs, but it's in reality + // a FIFO linked list + TypeDescriptor.AddProvider (providers[2], type); + TypeDescriptor.AddProvider (providers[3], type); + provider = TypeDescriptor.GetProvider (type); + Assert.IsNotNull (provider, "#C1"); + descriptor = provider.GetTypeDescriptor (type.GetType (), type); + Assert.IsNotNull (descriptor, "#C1-1"); + Assert.AreEqual ("Four", descriptor.GetClassName (), "#C1-2"); + + TypeDescriptor.RemoveProvider (providers[2], type); + provider = TypeDescriptor.GetProvider (type); + Assert.IsNotNull (provider, "#D1"); + descriptor = provider.GetTypeDescriptor (type.GetType (), type); + Assert.IsNotNull (descriptor, "#D1-1"); + Assert.AreEqual ("Four", descriptor.GetClassName (), "#D1-2"); + + TypeDescriptor.RemoveProvider (providers[3], type); + provider = TypeDescriptor.GetProvider (type); + Assert.IsNotNull (provider, "#E1"); + descriptor = provider.GetTypeDescriptor (type.GetType (), type); + Assert.IsNotNull (descriptor, "#E1-1"); + Assert.AreEqual ("Two", descriptor.GetClassName (), "#E1-2"); + + } finally { + TypeDescriptor.RemoveProvider (providers[0], type); + TypeDescriptor.RemoveProvider (providers[1], type); + TypeDescriptor.RemoveProvider (providers[2], type); + TypeDescriptor.RemoveProvider (providers[3], type); + } + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestGetProvider_Type_1 () + { + TypeDescriptor.GetProvider ((Type)null); + } + + [Test] + public void TestGetProvider_Type_2 () + { + TypeDescriptionProvider provider = TypeDescriptor.GetProvider (typeof (string)); + Assert.IsNotNull (provider, "#A1"); + provider = new MyTypeDescriptionProvider ("One"); + + try { + TypeDescriptor.AddProvider (provider, typeof (string)); + ICustomTypeDescriptor descriptor = provider.GetTypeDescriptor (typeof (string)); + Assert.IsNotNull (descriptor, "#B1"); + Assert.AreEqual ("One", descriptor.GetClassName (), "#B1-1"); + } finally { + TypeDescriptor.RemoveProvider (provider, typeof (string)); + } + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestGetProvider_Instance_1 () + { + TypeDescriptor.GetProvider ((object) null); + } + + [Test] + public void TestGetProvider_Instance_2 () + { + var instance = new MyComponent (); + TypeDescriptionProvider provider = TypeDescriptor.GetProvider (instance); + Assert.IsNotNull (provider, "#A1"); + provider = new MyTypeDescriptionProvider ("One"); + + try { + TypeDescriptor.AddProvider (provider, instance); + ICustomTypeDescriptor descriptor = provider.GetTypeDescriptor (instance); + Assert.IsNotNull (descriptor, "#B1"); + Assert.AreEqual ("One", descriptor.GetClassName (), "#B1-1"); + } finally { + TypeDescriptor.RemoveProvider (provider, instance); + } + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestRemoveProvider_Provider_Type_1 () + { + TypeDescriptor.RemoveProvider (null, (Type)null); + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestRemoveProvider_Provider_Type_2 () + { + var provider = new MyTypeDescriptionProvider (); + TypeDescriptor.RemoveProvider (provider, null); + } + + [Test] + public void TestRemoveProvider_Provider_Type_3 () + { + var provider = new MyTypeDescriptionProvider (); + bool refreshedCalled = false; + bool refreshedCorrectComponentChanged = false; + bool refreshedCorrectTypeChanged = false; + + RefreshEventHandler handler = (RefreshEventArgs args) => { + refreshedCalled = true; + refreshedCorrectComponentChanged = args.ComponentChanged == null; + refreshedCorrectTypeChanged = args.TypeChanged == typeof (string); + }; + + try { + TypeDescriptor.Refreshed += handler; + + TypeDescriptor.RemoveProvider (provider, typeof (string)); + Assert.AreEqual (true, refreshedCalled, "#A1"); + Assert.AreEqual (true, refreshedCorrectComponentChanged, "#A2"); + Assert.AreEqual (true, refreshedCorrectTypeChanged, "#A3"); + } finally { + TypeDescriptor.Refreshed -= handler; + } + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestRemoveProvider_Provider_Instance_1 () + { + TypeDescriptor.RemoveProvider (null, (object)null); + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestRemoveProvider_Provider_Instance_2 () + { + var provider = new MyTypeDescriptionProvider (); + TypeDescriptor.RemoveProvider (provider, (object)null); + } + + [Test] + public void TestRemoveProvider_Provider_Instance_3 () + { + var instance = new MyComponent (); + var provider = new MyTypeDescriptionProvider (); + bool refreshedCalled = false; + bool refreshedCorrectComponentChanged = false; + bool refreshedCorrectTypeChanged = false; + + RefreshEventHandler handler = (RefreshEventArgs args) => { + refreshedCalled = true; + refreshedCorrectComponentChanged = args.ComponentChanged == instance; + refreshedCorrectTypeChanged = args.TypeChanged == typeof (MyComponent); + }; + + try { + TypeDescriptor.Refreshed += handler; + + TypeDescriptor.RemoveProvider (provider, instance); + Assert.AreEqual (true, refreshedCalled, "#A1"); + Assert.AreEqual (true, refreshedCorrectComponentChanged, "#A2"); + Assert.AreEqual (true, refreshedCorrectTypeChanged, "#A3"); + } finally { + TypeDescriptor.Refreshed -= handler; + } + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestGetReflectionType_Type_1 () + { + TypeDescriptor.GetReflectionType ((Type) null); + } + + [Test] + public void TestGetReflectionType_Type_2 () + { + Type type = TypeDescriptor.GetReflectionType (typeof (string)); + Assert.IsNotNull (type, "#A1"); + Assert.AreEqual (typeof (string), type, "#A1-1"); + + type = TypeDescriptor.GetReflectionType (typeof (MyComponent)); + Assert.IsNotNull (type, "#B1"); + Assert.AreEqual (typeof (MyComponent), type, "#B1-1"); + + type = TypeDescriptor.GetReflectionType (typeof (List)); + Assert.IsNotNull (type, "#C1"); + Assert.AreEqual (typeof (List ), type, "#C1-1"); + + type = TypeDescriptor.GetReflectionType (typeof (IList<>)); + Assert.IsNotNull (type, "#D1"); + Assert.AreEqual (typeof (IList<>), type, "#D1-1"); + + type = TypeDescriptor.GetReflectionType (typeof (IDictionary<,>)); + Assert.IsNotNull (type, "#E1"); + Assert.AreEqual (typeof (IDictionary<,>), type, "#E1-1"); + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void TestGetReflectionType_Instance_1 () + { + TypeDescriptor.GetReflectionType ((object) null); + } + + [Test] + public void TestGetReflectionType_Instance_2 () + { + string s = "string"; + Type type = TypeDescriptor.GetReflectionType (s); + Assert.IsNotNull (type, "#A1"); + Assert.AreEqual (typeof (string), type, "#A1-1"); + + var mc = new MyComponent (); + type = TypeDescriptor.GetReflectionType (mc); + Assert.IsNotNull (type, "#B1"); + Assert.AreEqual (typeof (MyComponent), type, "#B1-1"); + + var l = new List (); + type = TypeDescriptor.GetReflectionType (l); + Assert.IsNotNull (type, "#C1"); + Assert.AreEqual (typeof (List), type, "#C1-1"); + + IList il = new List (); + type = TypeDescriptor.GetReflectionType (il); + Assert.IsNotNull (type, "#D1"); + Assert.AreEqual (typeof (List), type, "#D1-1"); + + IDictionary id = new Dictionary (); + type = TypeDescriptor.GetReflectionType (id); + Assert.IsNotNull (type, "#E1"); + Assert.AreEqual (typeof (Dictionary), type, "#E1-1"); + + object o = 1; + type = TypeDescriptor.GetReflectionType (o); + Assert.IsNotNull (type, "#F1"); + Assert.AreEqual (typeof (int), type, "#F1-1"); + } +#endif + [Test] public void TestICustomTypeDescriptor () { diff --git a/mcs/class/System/Test/System.Diagnostics/ChangeLog b/mcs/class/System/Test/System.Diagnostics/ChangeLog index 8a05f4a1a52..2a5e3c7a03b 100644 --- a/mcs/class/System/Test/System.Diagnostics/ChangeLog +++ b/mcs/class/System/Test/System.Diagnostics/ChangeLog @@ -1,3 +1,7 @@ +2009-06-26 Robert Jordan + + * SwitchesTest.cs, TraceTest.cs: Upgrade to new NUnit style. + 2009-02-24 Andrés G. Aragoneses * Process.cs: New tests for bug 477943. diff --git a/mcs/class/System/Test/System.Diagnostics/SwitchesTest.cs b/mcs/class/System/Test/System.Diagnostics/SwitchesTest.cs index a9813ade91d..dc82f1fa2ed 100644 --- a/mcs/class/System/Test/System.Diagnostics/SwitchesTest.cs +++ b/mcs/class/System/Test/System.Diagnostics/SwitchesTest.cs @@ -79,7 +79,7 @@ namespace MonoTests.System.Diagnostics { } [TestFixture] - public class SwitchesTest : Assertion { + public class SwitchesTest { private static BooleanSwitch bon = new BooleanSwitch ("bool-true", ""); private static BooleanSwitch bon2 = new BooleanSwitch ("bool-true-2", ""); @@ -101,11 +101,11 @@ namespace MonoTests.System.Diagnostics { [Test] public void BooleanSwitches () { - Assert ("#BS:T:1", bon.Enabled); - Assert ("#BS:T:2", bon2.Enabled); - Assert ("#BS:T:3", bon3.Enabled); - Assert ("#BS:F:1", !boff.Enabled); - Assert ("#BS:F:2", !boff2.Enabled); + Assert.IsTrue (bon.Enabled, "#BS:T:1"); + Assert.IsTrue (bon2.Enabled, "#BS:T:2"); + Assert.IsTrue (bon3.Enabled, "#BS:T:3"); + Assert.IsTrue (!boff.Enabled, "#BS:F:1"); + Assert.IsTrue (!boff2.Enabled, "#BS:F:2"); } [Test] @@ -131,10 +131,10 @@ namespace MonoTests.System.Diagnostics { private void CheckTraceSwitch (TraceSwitch ts, bool te, bool tw, bool ti, bool tv) { string desc = string.Format ("#TS:{0}", ts.DisplayName); - AssertEquals (desc + ":TraceError", te, ts.TraceError); - AssertEquals (desc + ":TraceWarning", tw, ts.TraceWarning); - AssertEquals (desc + ":TraceInfo", ti, ts.TraceInfo); - AssertEquals (desc + ":TraceVerbose", tv, ts.TraceVerbose); + Assert.AreEqual (te, ts.TraceError, desc + ":TraceError"); + Assert.AreEqual (tw, ts.TraceWarning, desc + ":TraceWarning"); + Assert.AreEqual (ti, ts.TraceInfo, desc + ":TraceInfo"); + Assert.AreEqual (tv, ts.TraceVerbose, desc + ":TraceVerbose"); } [Test] @@ -143,15 +143,15 @@ namespace MonoTests.System.Diagnostics { #endif public void NewSwitch () { - AssertEquals ("#NS:TestValue", "42", tns.TestValue); - Assert ("#NS:Validate", tns.Validate()); + Assert.AreEqual ("42", tns.TestValue, "#NS:TestValue"); + Assert.IsTrue (tns.Validate(), "#NS:Validate"); } #if NET_2_0 [Test] public void GetSupportedAttributes () { - AssertNull (tns.ExposeSupportedAttributes ()); + Assert.IsNull (tns.ExposeSupportedAttributes ()); } [Test] // no ArgumentNullException happens... @@ -164,15 +164,15 @@ namespace MonoTests.System.Diagnostics { public void BooleanSwitchValidDefaultValue () { BooleanSwitch s = new BooleanSwitch ("test", "", "2"); - Assert ("#1", s.Enabled); + Assert.IsTrue (s.Enabled, "#1"); s = new BooleanSwitch ("test", "", "0"); - Assert ("#2", !s.Enabled); + Assert.IsTrue (!s.Enabled, "#2"); s = new BooleanSwitch ("test", "", "true"); - Assert ("#3", s.Enabled); + Assert.IsTrue (s.Enabled, "#3"); s = new BooleanSwitch ("test", "", "True"); - Assert ("#4", s.Enabled); + Assert.IsTrue (s.Enabled, "#4"); s = new BooleanSwitch ("test", "", "truE"); - Assert ("#5", s.Enabled); + Assert.IsTrue (s.Enabled, "#5"); } [Test] @@ -180,7 +180,7 @@ namespace MonoTests.System.Diagnostics { public void BooleanSwitchInvalidDefaultValue () { BooleanSwitch s = new BooleanSwitch ("test", "", "hoge"); - Assert (!s.Enabled); + Assert.IsTrue (!s.Enabled); } #endif } diff --git a/mcs/class/System/Test/System.Diagnostics/TraceTest.cs b/mcs/class/System/Test/System.Diagnostics/TraceTest.cs index 1491a6a897a..25354a19ee5 100644 --- a/mcs/class/System/Test/System.Diagnostics/TraceTest.cs +++ b/mcs/class/System/Test/System.Diagnostics/TraceTest.cs @@ -61,7 +61,7 @@ namespace MonoTests.System.Diagnostics { Trace.WriteLine ("Entering Main"); Trace.WriteLine ("Exiting Main"); - Assertion.AssertEquals ("#Tr01", value, buffer.ToString ()); + Assert.AreEqual (value, buffer.ToString (), "#Tr01"); } // Make sure we get the output we expect in the presence of indenting... @@ -79,14 +79,14 @@ namespace MonoTests.System.Diagnostics { Trace.WriteLine ("List of errors:"); Trace.Indent (); - Assertion.AssertEquals (1, Trace.IndentLevel); + Assert.AreEqual (1, Trace.IndentLevel); Trace.WriteLine ("Error 1: File not found"); Trace.WriteLine ("Error 2: Directory not found"); Trace.Unindent (); - Assertion.AssertEquals (0, Trace.IndentLevel); + Assert.AreEqual (0, Trace.IndentLevel); Trace.WriteLine ("End of list of errors"); - Assertion.AssertEquals ("#In01", value, buffer.ToString()); + Assert.AreEqual (value, buffer.ToString(), "#In01"); } // Make sure that TraceListener properties (IndentLevel, IndentSize) are @@ -108,8 +108,8 @@ namespace MonoTests.System.Diagnostics { foreach (TraceListener t in Trace.Listeners) { string ids = "#TATLP-S-" + t.Name; string idl = "#TATLP-L-" + t.Name; - Assertion.AssertEquals (ids, ExpectedSize, t.IndentSize); - Assertion.AssertEquals (idl, ExpectedLevel, t.IndentLevel); + Assert.AreEqual (ExpectedSize, t.IndentSize, ids); + Assert.AreEqual (ExpectedLevel, t.IndentLevel, idl); } Trace.Listeners.Remove(t1); @@ -135,16 +135,16 @@ namespace MonoTests.System.Diagnostics { // Assertion.Assert that the listener we added has been set to the correct indent // level. - Assertion.AssertEquals ("#LATL-L", ExpectedLevel, tl.IndentLevel); - Assertion.AssertEquals ("#LATL-S", ExpectedSize, tl.IndentSize); + Assert.AreEqual (ExpectedLevel, tl.IndentLevel, "#LATL-L"); + Assert.AreEqual (ExpectedSize, tl.IndentSize, "#LATL-S"); // Assertion.Assert that all listeners in the collection have the same level. foreach (TraceListener t in Trace.Listeners) { string idl = "#LATL-L:" + t.Name; string ids = "#LATL-S:" + t.Name; - Assertion.AssertEquals(idl, ExpectedLevel, t.IndentLevel); - Assertion.AssertEquals(ids, ExpectedSize, t.IndentSize); + Assert.AreEqual (ExpectedLevel, t.IndentLevel, idl); + Assert.AreEqual (ExpectedSize, t.IndentSize, ids); } } diff --git a/mcs/class/System/Test/System.IO/ChangeLog b/mcs/class/System/Test/System.IO/ChangeLog index dc67d5f307d..b3a40b3f20b 100644 --- a/mcs/class/System/Test/System.IO/ChangeLog +++ b/mcs/class/System/Test/System.IO/ChangeLog @@ -1,3 +1,7 @@ +2009-06-26 Robert Jordan + + * FileSystemWatcherTest.cs: Upgrade to new NUnit style. + 2004-01-16 Gonzalo Paniagua Javier * FileSystemWatcherTest.cs: new test. diff --git a/mcs/class/System/Test/System.IO/FileSystemWatcherTest.cs b/mcs/class/System/Test/System.IO/FileSystemWatcherTest.cs index b3e7348544d..df257b0fc44 100644 --- a/mcs/class/System/Test/System.IO/FileSystemWatcherTest.cs +++ b/mcs/class/System/Test/System.IO/FileSystemWatcherTest.cs @@ -13,18 +13,18 @@ using System.IO; namespace MonoTests.System.IO { [TestFixture] - public class FileSystemWatcherTest : Assertion + public class FileSystemWatcherTest { [Test] public void CheckDefaults () { FileSystemWatcher fw = new FileSystemWatcher (); - AssertEquals ("#01", fw.EnableRaisingEvents, false); - AssertEquals ("#02", fw.Filter, "*.*"); - AssertEquals ("#03", fw.IncludeSubdirectories, false); - AssertEquals ("#04", fw.InternalBufferSize, 8192); - AssertEquals ("#05", fw.NotifyFilter, NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.LastWrite); - AssertEquals ("#06", fw.Path, ""); + Assert.AreEqual (fw.EnableRaisingEvents, false, "#01"); + Assert.AreEqual (fw.Filter, "*.*", "#02"); + Assert.AreEqual (fw.IncludeSubdirectories, false, "#03"); + Assert.AreEqual (fw.InternalBufferSize, 8192, "#04"); + Assert.AreEqual (fw.NotifyFilter, NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.LastWrite, "#05"); + Assert.AreEqual (fw.Path, "", "#06"); } [Test] diff --git a/mcs/class/System/Test/System.Net.Sockets/ChangeLog b/mcs/class/System/Test/System.Net.Sockets/ChangeLog index 61dc5220767..4a73df4b41f 100644 --- a/mcs/class/System/Test/System.Net.Sockets/ChangeLog +++ b/mcs/class/System/Test/System.Net.Sockets/ChangeLog @@ -1,3 +1,25 @@ +2009-06-28 Gert Driesen + + * SocketTest.cs: Added tests for argument checks, and improved tests + for disposed socket. + +2009-06-28 Gert Driesen + + * IPv6MulticastOptionTest.cs: Added .ctor and property tests. + * MulticastOptionTest.cs: Added .ctor and property tests. + * SocketTest.cs: Fixed compiler warnings. Improved tests for + closed socket. Added tests fr GetSocketOption, and SetSocketOption + overloads (for Linger, DontLinger, AddMembership and DropMembership). + * UdpClientTest.cs: Added .ctor and JoinMulticastGroup tests. + +2009-06-26 Gonzalo Paniagua Javier + + * SocketTest.cs: tests for DontLinger. + +2009-06-26 Robert Jordan + + * *.cs: Upgrade to new NUnit style. + 2009-01-26 Gonzalo Paniagua Javier * SocketTest.cs: diff --git a/mcs/class/System/Test/System.Net.Sockets/IPv6MulticastOptionTest.cs b/mcs/class/System/Test/System.Net.Sockets/IPv6MulticastOptionTest.cs new file mode 100644 index 00000000000..37a39153694 --- /dev/null +++ b/mcs/class/System/Test/System.Net.Sockets/IPv6MulticastOptionTest.cs @@ -0,0 +1,229 @@ +// System.Net.Sockets.IPv6MulticastOptionTest.cs +// +// Authors: +// Gert Driesen (drieseng@users.sourceforge.net) +// +// Copyright (c) 2009 Gert Driesen +// + +using System; +using System.Net; +using System.Net.Sockets; + +using NUnit.Framework; + +namespace MonoTests.System.Net.Sockets +{ + [TestFixture] + public class IPv6MulticastOptionTest + { + [Test] // .ctor (IPAddress) + public void Constructor1 () + { + IPv6MulticastOption option; + IPAddress group; + + group = IPAddress.Parse ("ff02::1"); + option = new IPv6MulticastOption (group); + Assert.AreSame (group, option.Group, "#A:Group"); + Assert.AreEqual (0, option.InterfaceIndex, "#A:InterfaceIndex"); + + group = IPAddress.Parse ("224.0.0.23"); + option = new IPv6MulticastOption (group); + Assert.AreSame (group, option.Group, "#B:Group"); + Assert.AreEqual (0, option.InterfaceIndex, "#B:InterfaceIndex"); + } + + [Test] // .ctor (IPAddress) + public void Constructor1_Group_Null () + { + try { + new IPv6MulticastOption ((IPAddress) null); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("group", ex.ParamName, "#5"); + } + } + + [Test] // .ctor (IPAddress, Int64) + public void Constructor2 () + { + IPv6MulticastOption option; + IPAddress group; + long interfaceIndex; + + group = IPAddress.Parse ("239.255.255.250"); + interfaceIndex = 0; + option = new IPv6MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#A:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#A:InterfaceIndex"); + + group = IPAddress.Parse ("ff02::1"); + interfaceIndex = 0; + option = new IPv6MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#B:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#B:InterfaceIndex"); + + group = IPAddress.Parse ("239.255.255.250"); + interfaceIndex = 124; + option = new IPv6MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#C:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#C:InterfaceIndex"); + + group = IPAddress.Parse ("ff02::1"); + interfaceIndex = 124; + option = new IPv6MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#D:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#D:InterfaceIndex"); + + group = IPAddress.Parse ("239.255.255.250"); + interfaceIndex = 0xFFFFFFFF; + option = new IPv6MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#E:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#E:InterfaceIndex"); + + group = IPAddress.Parse ("ff02::1"); + interfaceIndex = 0xFFFFFFFF; + option = new IPv6MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#F:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#F:InterfaceIndex"); + } + + [Test] // .ctor (IPAddress, Int64) + public void Constructor2_Group_Null () + { + IPAddress group = null; + + try { + new IPv6MulticastOption (group, 0); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("group", ex.ParamName, "#5"); + } + } + + [Test] // .ctor (IPAddress, Int64) + public void Constructor2_Ifindex_OutOfRange () + { + IPAddress group = IPAddress.Parse ("ff02::1"); + + try { + new IPv6MulticastOption (group, -1); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("ifindex", ex.ParamName, "#A5"); + } + + try { + new IPv6MulticastOption (group, 0x100000000); + Assert.Fail ("#B1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("ifindex", ex.ParamName, "#B5"); + } + } + + [Test] + public void Group () + { + IPAddress group; + IPv6MulticastOption option; + + group = IPAddress.Parse ("239.255.255.250"); + option = new IPv6MulticastOption (group, 5L); + group = IPAddress.Parse ("224.0.0.23"); + option.Group = group; + Assert.AreSame (group, option.Group, "#A1"); + Assert.AreEqual (5L, option.InterfaceIndex, "#A2"); + group = IPAddress.Parse ("239.255.255.250"); + option.Group = group; + Assert.AreSame (group, option.Group, "#B1"); + Assert.AreEqual (5L, option.InterfaceIndex, "#B2"); + group = IPAddress.Parse ("ff02::1"); + option.Group = group; + Assert.AreSame (group, option.Group, "#C1"); + Assert.AreEqual (5L, option.InterfaceIndex, "#C2"); + } + + [Test] + public void Group_Value_Null () + { + IPAddress group = IPAddress.Parse ("239.255.255.250"); + IPv6MulticastOption option = new IPv6MulticastOption (group, 10); + + try { + option.Group = null; + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("value", ex.ParamName, "#5"); + } + } + + [Test] + public void InterfaceIndex () + { + IPAddress group; + IPv6MulticastOption option; + + group = IPAddress.Parse ("239.255.255.250"); + option = new IPv6MulticastOption (group, 10); + option.InterfaceIndex = 0; + Assert.AreSame (group, option.Group, "#A1"); + Assert.AreEqual (0, option.InterfaceIndex, "#A2"); + option.InterfaceIndex = 124; + Assert.AreSame (group, option.Group, "#B1"); + Assert.AreEqual (124, option.InterfaceIndex, "#B2"); + option.InterfaceIndex = 0xFFFFFFFF; + Assert.AreSame (group, option.Group, "#C1"); + Assert.AreEqual (0xFFFFFFFF, option.InterfaceIndex, "#C3"); + } + + [Test] + public void InterfaceIndex_Value_OutOfRange () + { + IPAddress group = IPAddress.Parse ("239.255.255.250"); + IPv6MulticastOption option = new IPv6MulticastOption (group, 10); + + try { + option.InterfaceIndex = -1; + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("value", ex.ParamName, "#A5"); + } + + try { + option.InterfaceIndex = 0x100000000; + Assert.Fail ("#B1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("value", ex.ParamName, "#B5"); + } + + // ensure original value was retained + Assert.AreEqual (10, option.InterfaceIndex, "#C"); + } + } +} diff --git a/mcs/class/System/Test/System.Net.Sockets/MulticastOptionTest.cs b/mcs/class/System/Test/System.Net.Sockets/MulticastOptionTest.cs new file mode 100644 index 00000000000..684dd391f94 --- /dev/null +++ b/mcs/class/System/Test/System.Net.Sockets/MulticastOptionTest.cs @@ -0,0 +1,364 @@ +// System.Net.Sockets.MulticastOptionTest.cs +// +// Authors: +// Gert Driesen (drieseng@users.sourceforge.net) +// +// Copyright (c) 2009 Gert Driesen +// + +using System; +using System.Net; +using System.Net.Sockets; + +using NUnit.Framework; + +namespace MonoTests.System.Net.Sockets +{ + [TestFixture] + public class MulticastOptionTest + { + [Test] // .ctor (IPAddress) + public void Constructor1 () + { + MulticastOption option; + IPAddress group; + + group = IPAddress.Parse ("239.255.255.250"); + option = new MulticastOption (group); + Assert.AreSame (group, option.Group, "#A:Group"); +#if NET_2_0 + Assert.AreEqual (0, option.InterfaceIndex, "#A:InterfaceIndex"); +#endif + Assert.AreEqual (IPAddress.Any, option.LocalAddress, "#A:LocalAddress"); + + group = IPAddress.Parse ("ff02::1"); + option = new MulticastOption (group); + Assert.AreSame (group, option.Group, "#B:Group"); +#if NET_2_0 + Assert.AreEqual (0, option.InterfaceIndex, "#B:InterfaceIndex"); +#endif + Assert.AreEqual (IPAddress.Any, option.LocalAddress, "#B:LocalAddress"); + } + + [Test] // .ctor (IPAddress) + public void Constructor1_Group_Null () + { + try { + new MulticastOption ((IPAddress) null); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("group", ex.ParamName, "#5"); + } + } + + [Test] // .ctor (IPAddress, IPAddress) + public void Constructor2 () + { + MulticastOption option; + IPAddress group; + IPAddress mcint; + + group = IPAddress.Parse ("239.255.255.250"); + mcint = IPAddress.Any; + option = new MulticastOption (group, mcint); + Assert.AreSame (group, option.Group, "#A:Group"); +#if NET_2_0 + Assert.AreEqual (0, option.InterfaceIndex, "#A:InterfaceIndex"); +#endif + Assert.AreEqual (mcint, option.LocalAddress, "#A:LocalAddress"); + + group = IPAddress.Parse ("ff02::1"); + mcint = IPAddress.IPv6Any; + option = new MulticastOption (group, mcint); + Assert.AreSame (group, option.Group, "#B:Group"); +#if NET_2_0 + Assert.AreEqual (0, option.InterfaceIndex, "#B:InterfaceIndex"); +#endif + Assert.AreEqual (mcint, option.LocalAddress, "#B:LocalAddress"); + } + + [Test] // .ctor (IPAddress, IPAddress) + public void Constructor2_Group_Null () + { + IPAddress group = null; + IPAddress mcint = IPAddress.Any; + + try { + new MulticastOption (group, mcint); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("group", ex.ParamName, "#5"); + } + } + + [Test] // .ctor (IPAddress, IPAddress) + public void Constructor2_Mcint_Null () + { + IPAddress group = IPAddress.Parse ("239.255.255.250"); + IPAddress mcint = null; + + try { + new MulticastOption (group, mcint); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("mcint", ex.ParamName, "#5"); + } + } + +#if NET_2_0 + [Test] // .ctor (IPAddress, Int32) + public void Constructor3 () + { + MulticastOption option; + IPAddress group; + int interfaceIndex; + + group = IPAddress.Parse ("239.255.255.250"); + interfaceIndex = 0; + option = new MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#A:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#A:InterfaceIndex"); + Assert.AreEqual (null, option.LocalAddress, "#A:LocalAddress"); + + group = IPAddress.Parse ("ff02::1"); + interfaceIndex = 0; + option = new MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#B:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#B:InterfaceIndex"); + Assert.AreEqual (null, option.LocalAddress, "#B:LocalAddress"); + + group = IPAddress.Parse ("239.255.255.250"); + interfaceIndex = 124; + option = new MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#C:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#C:InterfaceIndex"); + Assert.AreEqual (null, option.LocalAddress, "#C:LocalAddress"); + + group = IPAddress.Parse ("ff02::1"); + interfaceIndex = 124; + option = new MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#D:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#D:InterfaceIndex"); + Assert.AreEqual (null, option.LocalAddress, "#D:LocalAddress"); + + group = IPAddress.Parse ("239.255.255.250"); + interfaceIndex = 0xFFFFFF; + option = new MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#E:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#E:InterfaceIndex"); + Assert.AreEqual (null, option.LocalAddress, "#E:LocalAddress"); + + group = IPAddress.Parse ("ff02::1"); + interfaceIndex = 0xFFFFFF; + option = new MulticastOption (group, interfaceIndex); + Assert.AreSame (group, option.Group, "#F:Group"); + Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#F:InterfaceIndex"); + Assert.AreEqual (null, option.LocalAddress, "#F:LocalAddress"); + } + + [Test] // .ctor (IPAddress, Int32) + public void Constructor3_Group_Null () + { + IPAddress group = null; + + try { + new MulticastOption (group, int.MaxValue); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("group", ex.ParamName, "#5"); + } + } + + [Test] // .ctor (IPAddress, Int32) + public void Constructor3_InterfaceIndex_OutOfRange () + { + IPAddress group = IPAddress.Parse ("239.255.255.250"); + + try { + new MulticastOption (group, -1); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("interfaceIndex", ex.ParamName, "#A5"); + } + + try { + new MulticastOption (group, 0x1000000); + Assert.Fail ("#B1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("interfaceIndex", ex.ParamName, "#B5"); + } + } +#endif + + [Test] + public void Group () + { + IPAddress group; + IPAddress local; + MulticastOption option; + +#if NET_2_0 + local = Dns.GetHostEntry (string.Empty).AddressList [0]; +#else + local = IPAddress.Loopback; +#endif + group = IPAddress.Parse ("239.255.255.250"); + option = new MulticastOption (group, local); + group = IPAddress.Parse ("224.0.0.23"); + option.Group = group; + Assert.AreSame (group, option.Group, "#A1"); + Assert.AreSame (local, option.LocalAddress, "#A2"); + group = IPAddress.Parse ("239.255.255.250"); + option.Group = group; + Assert.AreSame (group, option.Group, "#B1"); + Assert.AreSame (local, option.LocalAddress, "#B2"); + group = IPAddress.Parse ("ff02::1"); + option.Group = group; + Assert.AreSame (group, option.Group, "#C1"); + Assert.AreSame (local, option.LocalAddress, "#C2"); + option.Group = null; + Assert.IsNull (option.Group, "#D1"); + Assert.AreSame (local, option.LocalAddress, "#D2"); +#if NET_2_0 + option = new MulticastOption (group, 5); + group = IPAddress.Parse ("224.0.0.23"); + option.Group = group; + Assert.AreSame (group, option.Group, "#E1"); + Assert.AreEqual (5, option.InterfaceIndex, "#E2"); + Assert.IsNull (option.LocalAddress, "#E3"); +#endif + } + +#if NET_2_0 + [Test] + public void InterfaceIndex () + { + IPAddress group; + IPAddress local; + MulticastOption option; + + group = IPAddress.Parse ("239.255.255.250"); + option = new MulticastOption (group, 10); + option.InterfaceIndex = 0; + Assert.AreSame (group, option.Group, "#A1"); + Assert.AreEqual (0, option.InterfaceIndex, "#A2"); + Assert.IsNull (option.LocalAddress, "#A3"); + option.InterfaceIndex = 124; + Assert.AreSame (group, option.Group, "#B1"); + Assert.AreEqual (124, option.InterfaceIndex, "#B2"); + Assert.IsNull (option.LocalAddress, "#B3"); + option.InterfaceIndex = 0xFFFFFF; + Assert.AreSame (group, option.Group, "#C1"); + Assert.AreEqual (0xFFFFFF, option.InterfaceIndex, "#C2"); + Assert.IsNull (option.LocalAddress, "#C3"); + + local = Dns.GetHostEntry (string.Empty).AddressList [0]; + option = new MulticastOption (group, local); + option.InterfaceIndex = 10; + Assert.AreSame (group, option.Group, "#D1"); + Assert.AreEqual (10, option.InterfaceIndex, "#D2"); + Assert.IsNull (option.LocalAddress, "#D3"); + } + + [Test] + public void InterfaceIndex_Value_OutOfRange () + { + IPAddress group = IPAddress.Parse ("239.255.255.250"); + MulticastOption option = new MulticastOption (group, 10); + + try { + option.InterfaceIndex = -1; + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("value", ex.ParamName, "#A5"); + } + + try { + option.InterfaceIndex = 0x1000000; + Assert.Fail ("#B1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("value", ex.ParamName, "#B5"); + } + + // ensure original value was retained + Assert.AreEqual (10, option.InterfaceIndex, "#C"); + } +#endif + + [Test] + public void LocalAddress () + { + IPAddress group; + IPAddress local; + MulticastOption option; + +#if NET_2_0 + local = Dns.GetHostEntry (string.Empty).AddressList [0]; +#else + local = IPAddress.Loopback; +#endif + group = IPAddress.Parse ("239.255.255.250"); + option = new MulticastOption (group, local); + local = IPAddress.Loopback; + option.LocalAddress = local; + Assert.AreSame (group, option.Group, "#A1"); +#if NET_2_0 + Assert.AreEqual (0, option.InterfaceIndex, "#A2"); +#endif + Assert.AreSame (local, option.LocalAddress, "#A3"); +#if NET_2_0 + local = Dns.GetHostEntry (string.Empty).AddressList [0]; +#else + local = IPAddress.Loopback; +#endif + option.LocalAddress = local; + Assert.AreSame (group, option.Group, "#B1"); +#if NET_2_0 + Assert.AreEqual (0, option.InterfaceIndex, "#B2"); +#endif + Assert.AreSame (local, option.LocalAddress, "#B3"); + option.LocalAddress = null; + Assert.AreSame (group, option.Group, "#C1"); +#if NET_2_0 + Assert.AreEqual (0, option.InterfaceIndex, "#C2"); +#endif + Assert.IsNull (option.LocalAddress, "#C3"); +#if NET_2_0 + option = new MulticastOption (group, 5); + local = IPAddress.Loopback; + option.LocalAddress = local; + Assert.AreSame (group, option.Group, "#D1"); + Assert.AreEqual (0, option.InterfaceIndex, "#D2"); + Assert.AreSame (local, option.LocalAddress, "#D3"); +#endif + } + } +} diff --git a/mcs/class/System/Test/System.Net.Sockets/NetworkStreamTest.cs b/mcs/class/System/Test/System.Net.Sockets/NetworkStreamTest.cs index f8a6f8746a9..c5fe18f6acb 100644 --- a/mcs/class/System/Test/System.Net.Sockets/NetworkStreamTest.cs +++ b/mcs/class/System/Test/System.Net.Sockets/NetworkStreamTest.cs @@ -61,9 +61,7 @@ namespace MonoTests.System.Net.Sockets Assert.IsNotNull (sockex, "ReadTimeout #2"); /* Linux gives error 10035 (EWOULDBLOCK) here, whereas windows has 10060 (ETIMEDOUT) - Assertion.AssertEquals ("ReadTimeout #3", - 10060, - sockex.ErrorCode); + Assert.AreEqual (10060, sockex.ErrorCode, "ReadTimeout #3"); */ } catch { Assert.Fail ("ReadTimeout #4"); diff --git a/mcs/class/System/Test/System.Net.Sockets/SocketTest.cs b/mcs/class/System/Test/System.Net.Sockets/SocketTest.cs index dabb5f732c2..58d5c50282f 100644 --- a/mcs/class/System/Test/System.Net.Sockets/SocketTest.cs +++ b/mcs/class/System/Test/System.Net.Sockets/SocketTest.cs @@ -55,7 +55,7 @@ namespace MonoTests.System.Net.Sockets } [Test] - [Ignore ("Bug #75158")] + [Ignore ("Bug #75158")] // Looks like MS fails after the .ctor, when you try to use the socket public void IncompatibleAddress () { IPEndPoint epIPv6 = new IPEndPoint (IPAddress.IPv6Any, @@ -138,12 +138,10 @@ namespace MonoTests.System.Net.Sockets bool block; block = BlockingConnect(true); - Assertion.AssertEquals ("BlockingStatus01", - block, true); + Assert.AreEqual (block, true, "BlockingStatus01"); block = BlockingConnect(false); - Assertion.AssertEquals ("BlockingStatus02", - block, false); + Assert.AreEqual (block, false, "BlockingStatus02"); } static bool CFAConnected = false; @@ -161,6 +159,22 @@ namespace MonoTests.System.Net.Sockets CFACalledBack.Set (); } + [Test] // Connect (IPEndPoint) + public void Connect1_RemoteEP_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, + SocketType.Stream, ProtocolType.Tcp); + try { + s.Connect ((IPEndPoint) null); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("remoteEP", ex.ParamName, "#5"); + } + } + [Test] public void ConnectFailAsync () { @@ -180,8 +194,7 @@ namespace MonoTests.System.Net.Sockets sock); CFACalledBack.WaitOne (); - Assertion.AssertEquals ("ConnectFail", CFAConnected, - false); + Assert.AreEqual (CFAConnected, false, "ConnectFail"); } #if !TARGET_JVM @@ -215,14 +228,14 @@ namespace MonoTests.System.Net.Sockets ArrayList empty = new ArrayList (); list.Add (acc); Socket.Select (list, empty, empty, 100); - Assertion.AssertEquals ("#01", 0, empty.Count); - Assertion.AssertEquals ("#02", 1, list.Count); + Assert.AreEqual (0, empty.Count, "#01"); + Assert.AreEqual (1, list.Count, "#02"); Socket.Select (empty, list, empty, 100); - Assertion.AssertEquals ("#03", 0, empty.Count); - Assertion.AssertEquals ("#04", 1, list.Count); + Assert.AreEqual (0, empty.Count, "#03"); + Assert.AreEqual (1, list.Count, "#04"); Socket.Select (list, empty, empty, -1); - Assertion.AssertEquals ("#05", 0, empty.Count); - Assertion.AssertEquals ("#06", 1, list.Count); + Assert.AreEqual (0, empty.Count, "#05"); + Assert.AreEqual (1, list.Count, "#06"); // Need to read the 10 bytes from the client to avoid a RST byte [] bytes = new byte [10]; acc.Receive (bytes); @@ -267,17 +280,6 @@ namespace MonoTests.System.Net.Sockets byte[] buf = new byte[100]; - [Test] - [ExpectedException (typeof (ObjectDisposedException))] - public void Disposed1 () - { - Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - EndPoint ep = new IPEndPoint (IPAddress.Any, 31337); - s.Close(); - - s.ReceiveFrom (buf, ref ep); - } - [Test] [ExpectedException (typeof (ObjectDisposedException))] public void Disposed2 () @@ -288,36 +290,6 @@ namespace MonoTests.System.Net.Sockets s.Blocking = true; } - [Test] - [ExpectedException (typeof (ObjectDisposedException))] - public void Disposed3 () - { - Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - s.Close(); - - s.GetSocketOption (0, 0); - } - - [Test] - [ExpectedException (typeof (ObjectDisposedException))] - public void Disposed4 () - { - Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - s.Close(); - - s.GetSocketOption (0, 0, null); - } - - [Test] - [ExpectedException (typeof (ObjectDisposedException))] - public void Disposed5 () - { - Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - s.Close(); - - s.GetSocketOption (0, 0, 0); - } - [Test] [ExpectedException (typeof (ObjectDisposedException))] public void Disposed6 () @@ -338,80 +310,6 @@ namespace MonoTests.System.Net.Sockets s.Poll (100, 0); } - [Test] - [ExpectedException (typeof (ObjectDisposedException))] - public void Disposed8 () - { - Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - s.Close(); - - s.Receive (buf); - } - - [Test] - [ExpectedException (typeof (ObjectDisposedException))] - public void Disposed9 () - { - Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - s.Close(); - - s.Receive (buf, 0); - } - - [Test] - [ExpectedException (typeof (ObjectDisposedException))] - public void Disposed10 () - { - Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - s.Close(); - - s.Receive (buf, 10, 0); - } - - [Test] - [ExpectedException (typeof (ObjectDisposedException))] - public void Disposed11 () - { - Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - EndPoint ep = new IPEndPoint (IPAddress.Any, 31337); - s.Close(); - - s.Receive (buf, 0, 10, 0); - } - - [Test] - [ExpectedException (typeof (ObjectDisposedException))] - public void Disposed12 () - { - Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - EndPoint ep = new IPEndPoint (IPAddress.Any, 31337); - s.Close(); - - s.ReceiveFrom (buf, 0, ref ep); - } - - [Test] - [ExpectedException (typeof (ObjectDisposedException))] - public void Disposed13 () - { - Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - EndPoint ep = new IPEndPoint (IPAddress.Any, 31337); - s.Close(); - - s.ReceiveFrom (buf, 10, 0, ref ep); - } - - [Test] - [ExpectedException (typeof (ObjectDisposedException))] - public void Disposed14 () - { - Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - EndPoint ep = new IPEndPoint (IPAddress.Any, 31337); - s.Close(); - - s.ReceiveFrom (buf, 0, 10, 0, ref ep); - } - [Test] [ExpectedException (typeof (ObjectDisposedException))] public void Disposed15 () @@ -447,7 +345,6 @@ namespace MonoTests.System.Net.Sockets public void Disposed18 () { Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - EndPoint ep = new IPEndPoint (IPAddress.Any, 31337); s.Close(); s.Send (buf, 0, 10, 0); @@ -502,7 +399,6 @@ namespace MonoTests.System.Net.Sockets public void Disposed23 () { Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - EndPoint ep = new IPEndPoint (IPAddress.Any, 31337); s.Close(); s.Shutdown (0); @@ -548,7 +444,7 @@ namespace MonoTests.System.Net.Sockets } [Test] - public void SocketError () + public void SocketErrorTest () { Socket sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, @@ -566,18 +462,15 @@ namespace MonoTests.System.Net.Sockets Assert.Fail ("SocketError wait timed out"); } - Assertion.AssertEquals ("SocketError #1", false, - sock.Connected); + Assert.AreEqual (false, sock.Connected, "SocketError #1"); int error; error = (int)sock.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Error); - Assertion.AssertEquals ("SocketError #2", 10061, - error); + Assert.AreEqual (10061, error, "SocketError #2"); error = (int)sock.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Error); - Assertion.AssertEquals ("SocketError #3", 10061, - error); + Assert.AreEqual (10061, error, "SocketError #3"); sock.Close (); } @@ -596,8 +489,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Stream, ProtocolType.Tcp); - Assertion.AssertEquals ("DontFragmentDefaultTcp", - false, sock.DontFragment); + Assert.AreEqual (false, sock.DontFragment, "DontFragmentDefaultTcp"); sock.Close (); } @@ -612,8 +504,7 @@ namespace MonoTests.System.Net.Sockets sock.DontFragment = true; - Assertion.AssertEquals ("DontFragmentChangeTcp", - true, sock.DontFragment); + Assert.AreEqual (true, sock.DontFragment, "DontFragmentChangeTcp"); sock.Close (); } @@ -625,8 +516,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Dgram, ProtocolType.Udp); - Assertion.AssertEquals ("DontFragmentDefaultUdp", - false, sock.DontFragment); + Assert.AreEqual (false, sock.DontFragment, "DontFragmentDefaultUdp"); sock.Close (); } @@ -641,8 +531,7 @@ namespace MonoTests.System.Net.Sockets sock.DontFragment = true; - Assertion.AssertEquals ("DontFragmentChangeUdp", - true, sock.DontFragment); + Assert.AreEqual (true, sock.DontFragment, "DontFragmentChangeUdp"); sock.Close (); } @@ -705,8 +594,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Dgram, ProtocolType.Udp); - Assertion.AssertEquals ("EnableBroadcastDefaultUdp", - false, sock.EnableBroadcast); + Assert.AreEqual (false, sock.EnableBroadcast, "EnableBroadcastDefaultUdp"); sock.Close (); } @@ -739,8 +627,7 @@ namespace MonoTests.System.Net.Sockets sock.EnableBroadcast = true; - Assertion.AssertEquals ("EnableBroadcastChangeUdp", - true, sock.EnableBroadcast); + Assert.AreEqual (true, sock.EnableBroadcast, "EnableBroadcastChangeUdp"); sock.Close (); } @@ -772,9 +659,7 @@ namespace MonoTests.System.Net.Sockets sock.ExclusiveAddressUse = true; - Assertion.AssertEquals ("ExclusiveAddressUseUnbound", - true, - sock.ExclusiveAddressUse); + Assert.AreEqual (true, sock.ExclusiveAddressUse, "ExclusiveAddressUseUnbound"); sock.Close (); } @@ -815,12 +700,10 @@ namespace MonoTests.System.Net.Sockets IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, BogusPort); - Assertion.AssertEquals ("IsBoundTcp #1", false, - sock.IsBound); + Assert.AreEqual (false, sock.IsBound, "IsBoundTcp #1"); sock.Bind (ep); - Assertion.AssertEquals ("IsBoundTcp #2", true, - sock.IsBound); + Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #2"); sock.Listen (1); @@ -828,20 +711,16 @@ namespace MonoTests.System.Net.Sockets SocketType.Stream, ProtocolType.Tcp); - Assertion.AssertEquals ("IsBoundTcp #3", false, - sock2.IsBound); + Assert.AreEqual (false, sock2.IsBound, "IsBoundTcp #3"); sock2.Connect (ep); - Assertion.AssertEquals ("IsBoundTcp #4", true, - sock2.IsBound); + Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #4"); sock2.Close (); - Assertion.AssertEquals ("IsBoundTcp #5", true, - sock2.IsBound); + Assert.AreEqual (true, sock2.IsBound, "IsBoundTcp #5"); sock.Close (); - Assertion.AssertEquals ("IsBoundTcp #6", true, - sock.IsBound); + Assert.AreEqual (true, sock.IsBound, "IsBoundTcp #6"); } [Test] @@ -853,32 +732,26 @@ namespace MonoTests.System.Net.Sockets IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, BogusPort); - Assertion.AssertEquals ("IsBoundUdp #1", false, - sock.IsBound); + Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #1"); sock.Bind (ep); - Assertion.AssertEquals ("IsBoundUdp #2", true, - sock.IsBound); + Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #2"); sock.Close (); - Assertion.AssertEquals ("IsBoundUdp #3", true, - sock.IsBound); + Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #3"); sock = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - Assertion.AssertEquals ("IsBoundUdp #4", false, - sock.IsBound); + Assert.AreEqual (false, sock.IsBound, "IsBoundUdp #4"); sock.Connect (ep); - Assertion.AssertEquals ("IsBoundUdp #5", true, - sock.IsBound); + Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #5"); sock.Close (); - Assertion.AssertEquals ("IsBoundUdp #6", true, - sock.IsBound); + Assert.AreEqual (true, sock.IsBound, "IsBoundUdp #6"); } [Test] @@ -941,8 +814,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Dgram, ProtocolType.Udp); - Assertion.AssertEquals ("MulticastLoopbackDefaultUdp", - true, sock.MulticastLoopback); + Assert.AreEqual (true, sock.MulticastLoopback, "MulticastLoopbackDefaultUdp"); sock.Close (); } @@ -956,8 +828,7 @@ namespace MonoTests.System.Net.Sockets sock.MulticastLoopback = false; - Assertion.AssertEquals ("MulticastLoopbackChangeUdp", - false, sock.MulticastLoopback); + Assert.AreEqual (false, sock.MulticastLoopback, "MulticastLoopbackChangeUdp"); sock.Close (); } @@ -985,8 +856,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Stream, ProtocolType.Tcp); - Assertion.AssertEquals ("ReceiveBufferSizeDefault", - 8192, sock.ReceiveBufferSize); + Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefault"); sock.Close (); } @@ -999,8 +869,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Dgram, ProtocolType.Udp); - Assertion.AssertEquals ("ReceiveBufferSizeDefaultUdp", - 8192, sock.ReceiveBufferSize); + Assert.AreEqual (8192, sock.ReceiveBufferSize, "ReceiveBufferSizeDefaultUdp"); sock.Close (); } @@ -1014,8 +883,7 @@ namespace MonoTests.System.Net.Sockets sock.ReceiveBufferSize = 16384; - Assertion.AssertEquals ("ReceiveBufferSizeChange", - 16384, sock.ReceiveBufferSize); + Assert.AreEqual (16384, sock.ReceiveBufferSize, "ReceiveBufferSizeChange"); sock.Close (); } @@ -1041,8 +909,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Stream, ProtocolType.Tcp); - Assertion.AssertEquals ("SendBufferSizeDefault", - 8192, sock.SendBufferSize); + Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefault"); sock.Close (); } @@ -1055,8 +922,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Dgram, ProtocolType.Udp); - Assertion.AssertEquals ("SendBufferSizeDefaultUdp", - 8192, sock.SendBufferSize); + Assert.AreEqual (8192, sock.SendBufferSize, "SendBufferSizeDefaultUdp"); sock.Close (); } @@ -1070,8 +936,7 @@ namespace MonoTests.System.Net.Sockets sock.SendBufferSize = 16384; - Assertion.AssertEquals ("SendBufferSizeChange", - 16384, sock.SendBufferSize); + Assert.AreEqual (16384, sock.SendBufferSize, "SendBufferSizeChange"); sock.Close (); } @@ -1099,7 +964,7 @@ namespace MonoTests.System.Net.Sockets sock.Ttl = 255; - Assertion.AssertEquals ("TtlChange", 255, sock.Ttl); + Assert.AreEqual (255, sock.Ttl, "TtlChange"); sock.Close (); } @@ -1159,9 +1024,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Stream, ProtocolType.Tcp); - Assertion.AssertEquals ("UseOnlyOverlappedIODefault", - false, - sock.UseOnlyOverlappedIO); + Assert.AreEqual (false, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIODefault"); sock.Close (); } @@ -1189,9 +1052,7 @@ namespace MonoTests.System.Net.Sockets sock.UseOnlyOverlappedIO = true; - Assertion.AssertEquals ("UseOnlyOverlappedIOChange", - true, - sock.UseOnlyOverlappedIO); + Assert.AreEqual (true, sock.UseOnlyOverlappedIO, "UseOnlyOverlappedIOChange"); sock.Close (); } @@ -1216,8 +1077,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Stream, ProtocolType.Tcp); - Assertion.AssertEquals ("SendTimeoutDefault", - 0, sock.SendTimeout); + Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutDefault"); sock.Close (); } @@ -1233,25 +1093,20 @@ namespace MonoTests.System.Net.Sockets * the MSDN docs, but the MS runtime doesn't */ sock.SendTimeout = 50; - Assertion.AssertEquals ("SendTimeoutChange #1", - 50, Approximate (50, sock.SendTimeout)); + Assert.AreEqual (50, Approximate (50, sock.SendTimeout), "SendTimeoutChange #1"); sock.SendTimeout = 2000; - Assertion.AssertEquals ("SendTimeoutChange #2", - 2000, Approximate (2000, sock.SendTimeout)); + Assert.AreEqual (2000, Approximate (2000, sock.SendTimeout), "SendTimeoutChange #2"); sock.SendTimeout = 0; - Assertion.AssertEquals ("SendTimeoutChange #3", - 0, Approximate (0, sock.SendTimeout)); + Assert.AreEqual (0, Approximate (0, sock.SendTimeout), "SendTimeoutChange #3"); /* Should be the same as setting 0 */ sock.SendTimeout = -1; - Assertion.AssertEquals ("SendTimeoutChange #4", - 0, sock.SendTimeout); + Assert.AreEqual (0, sock.SendTimeout, "SendTimeoutChange #4"); sock.SendTimeout = 65536; - Assertion.AssertEquals ("SendTimeoutChange #5", - 65536, Approximate (65536, sock.SendTimeout)); + Assert.AreEqual (65536, Approximate (65536, sock.SendTimeout), "SendTimeoutChange #5"); try { sock.SendTimeout = -2; @@ -1284,8 +1139,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Stream, ProtocolType.Tcp); - Assertion.AssertEquals ("ReceiveTimeoutDefault", - 0, sock.ReceiveTimeout); + Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutDefault"); sock.Close (); } @@ -1298,25 +1152,20 @@ namespace MonoTests.System.Net.Sockets ProtocolType.Tcp); sock.ReceiveTimeout = 50; - Assertion.AssertEquals ("ReceiveTimeoutChange #1", - 50, Approximate (50, sock.ReceiveTimeout)); + Assert.AreEqual (50, Approximate (50, sock.ReceiveTimeout), "ReceiveTimeoutChange #1"); sock.ReceiveTimeout = 2000; - Assertion.AssertEquals ("ReceiveTimeoutChange #2", - 2000, Approximate (2000, sock.ReceiveTimeout)); + Assert.AreEqual (2000, Approximate (2000, sock.ReceiveTimeout), "ReceiveTimeoutChange #2"); sock.ReceiveTimeout = 0; - Assertion.AssertEquals ("ReceiveTimeoutChange #3", - 0, sock.ReceiveTimeout); + Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #3"); /* Should be the same as setting 0 */ sock.ReceiveTimeout = -1; - Assertion.AssertEquals ("ReceiveTimeoutChange #4", - 0, sock.ReceiveTimeout); + Assert.AreEqual (0, sock.ReceiveTimeout, "ReceiveTimeoutChange #4"); sock.ReceiveTimeout = 65536; - Assertion.AssertEquals ("ReceiveTimeoutChange #5", - 65536, Approximate (65536, sock.ReceiveTimeout)); + Assert.AreEqual (65536, Approximate (65536, sock.ReceiveTimeout), "ReceiveTimeoutChange #5"); try { sock.ReceiveTimeout = -2; @@ -1349,8 +1198,7 @@ namespace MonoTests.System.Net.Sockets SocketType.Stream, ProtocolType.Tcp); - Assertion.AssertEquals ("NoDelayDefaultTcp", false, - sock.NoDelay); + Assert.AreEqual (false, sock.NoDelay, "NoDelayDefaultTcp"); sock.Close (); } @@ -1364,8 +1212,7 @@ namespace MonoTests.System.Net.Sockets sock.NoDelay = true; - Assertion.AssertEquals ("NoDelayChangeTcp", true, - sock.NoDelay); + Assert.AreEqual (true, sock.NoDelay, "NoDelayChangeTcp"); sock.Close (); } @@ -1491,14 +1338,10 @@ namespace MonoTests.System.Net.Sockets Assert.Fail ("BeginAccept wait timed out"); } - Assertion.AssertEquals ("BeginAccept #1", true, - BAAccepted); - Assertion.AssertEquals ("BeginAccept #2", true, - BASocket.Connected); - Assertion.AssertEquals ("BeginAccept #3", false, - sock.Connected); - Assertion.AssertEquals ("BeginAccept #4", true, - conn.Connected); + Assert.AreEqual (true, BAAccepted, "BeginAccept #1"); + Assert.AreEqual (true, BASocket.Connected, "BeginAccept #2"); + Assert.AreEqual (false, sock.Connected, "BeginAccept #3"); + Assert.AreEqual (true, conn.Connected, "BeginAccept #4"); BASocket.Close (); conn.Close (); @@ -1564,17 +1407,11 @@ namespace MonoTests.System.Net.Sockets Assert.Fail ("BeginAcceptData wait timed out"); } - Assertion.AssertEquals ("BeginAcceptData #1", true, - BADAccepted); - Assertion.AssertEquals ("BeginAcceptData #2", true, - BADSocket.Connected); - Assertion.AssertEquals ("BeginAcceptData #3", false, - sock.Connected); - Assertion.AssertEquals ("BeginAcceptData #4", true, - conn.Connected); - Assertion.AssertEquals ("BeginAcceptData #5", - send_bytes.Length, - BADByteCount); + Assert.AreEqual (true, BADAccepted, "BeginAcceptData #1"); + Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptData #2"); + Assert.AreEqual (false, sock.Connected, "BeginAcceptData #3"); + Assert.AreEqual (true, conn.Connected, "BeginAcceptData #4"); + Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptData #5"); /* The MS runtime gives the returned data in a * much bigger array. TODO: investigate @@ -1585,7 +1422,7 @@ namespace MonoTests.System.Net.Sockets "BeginAcceptData #6"); for(int i = 0; i < send_bytes.Length; i++) { - Assertion.AssertEquals ("BeginAcceptData #" + (i+7).ToString (), send_bytes[i], BADBytes[i]); + Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptData #" + (i+7).ToString ()); } BADSocket.Close (); @@ -1626,7 +1463,7 @@ namespace MonoTests.System.Net.Sockets sock.BeginAccept (acc, 256, BADCallback, sock); Assert.Fail ("BeginAcceptSocketUdp #1"); } catch (SocketException ex) { - Assertion.AssertEquals ("BeginAcceptSocketUdp #2", 10022, ex.ErrorCode); + Assert.AreEqual (10022, ex.ErrorCode, "BeginAcceptSocketUdp #2"); } catch { Assert.Fail ("BeginAcceptSocketUdp #3"); } finally { @@ -1700,29 +1537,15 @@ namespace MonoTests.System.Net.Sockets Assert.Fail ("BeginAcceptSocket wait timed out"); } - Assertion.AssertEquals ("BeginAcceptSocket #1", true, - BADAccepted); - Assertion.AssertEquals ("BeginAcceptSocket #2", true, - BADSocket.Connected); - Assertion.AssertEquals ("BeginAcceptSocket #3", false, - sock.Connected); - Assertion.AssertEquals ("BeginAcceptSocket #4", true, - conn.Connected); - Assertion.AssertEquals ("BeginAcceptSocket #5", - send_bytes.Length, - BADByteCount); - Assertion.AssertEquals ("BeginAcceptSocket #6", - AddressFamily.InterNetwork, - acc.AddressFamily); - Assertion.AssertEquals ("BeginAcceptSocket #7", - SocketType.Stream, - acc.SocketType); - Assertion.AssertEquals ("BeginAcceptSocket #8", - ProtocolType.Tcp, - acc.ProtocolType); - Assertion.AssertEquals ("BeginAcceptSocket #9", - conn.LocalEndPoint, - acc.RemoteEndPoint); + Assert.AreEqual (true, BADAccepted, "BeginAcceptSocket #1"); + Assert.AreEqual (true, BADSocket.Connected, "BeginAcceptSocket #2"); + Assert.AreEqual (false, sock.Connected, "BeginAcceptSocket #3"); + Assert.AreEqual (true, conn.Connected, "BeginAcceptSocket #4"); + Assert.AreEqual (send_bytes.Length, BADByteCount, "BeginAcceptSocket #5"); + Assert.AreEqual (AddressFamily.InterNetwork, acc.AddressFamily, "BeginAcceptSocket #6"); + Assert.AreEqual (SocketType.Stream, acc.SocketType, "BeginAcceptSocket #7"); + Assert.AreEqual (ProtocolType.Tcp, acc.ProtocolType, "BeginAcceptSocket #8"); + Assert.AreEqual (conn.LocalEndPoint, acc.RemoteEndPoint, "BeginAcceptSocket #9"); /* The MS runtime gives the returned data in a * much bigger array. TODO: investigate @@ -1733,7 +1556,7 @@ namespace MonoTests.System.Net.Sockets "BeginAcceptSocket #10"); for(int i = 0; i < send_bytes.Length; i++) { - Assertion.AssertEquals ("BeginAcceptSocket #" + (i+11).ToString (), send_bytes[i], BADBytes[i]); + Assert.AreEqual (send_bytes[i], BADBytes[i], "BeginAcceptSocket #" + (i+11).ToString ()); } BADSocket.Close (); @@ -1833,8 +1656,7 @@ namespace MonoTests.System.Net.Sockets Assert.Fail ("BeginConnectAddressPort wait timed out"); } - Assertion.AssertEquals ("BeginConnectAddressPort #1", - true, BCConnected); + Assert.AreEqual (true, BCConnected, "BeginConnectAddressPort #1"); sock.Close (); listen.Close (); @@ -1932,16 +1754,11 @@ namespace MonoTests.System.Net.Sockets Assert.Fail ("BeginConnectMultiple wait failed"); } - Assertion.AssertEquals ("BeginConnectMultiple #1", - true, BCConnected); - Assertion.AssertEquals ("BeginConnectMultiple #2", - AddressFamily.InterNetwork, - sock.RemoteEndPoint.AddressFamily); + Assert.AreEqual (true, BCConnected, "BeginConnectMultiple #1"); + Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "BeginConnectMultiple #2"); IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint; - Assertion.AssertEquals ("BeginConnectMultiple #2", - IPAddress.Loopback, - remep.Address); + Assert.AreEqual (IPAddress.Loopback, remep.Address, "BeginConnectMultiple #2"); sock.Close (); listen.Close (); @@ -2123,8 +1940,7 @@ namespace MonoTests.System.Net.Sockets sock.Connect (ip, 1254); - Assertion.AssertEquals ("BeginDisconnect #1", true, - sock.Connected); + Assert.AreEqual (true, sock.Connected, "BeginDisconnect #1"); sock.Shutdown (SocketShutdown.Both); @@ -2137,10 +1953,8 @@ namespace MonoTests.System.Net.Sockets Assert.Fail ("BeginDisconnect wait timed out"); } - Assertion.AssertEquals ("BeginDisconnect #2", true, - BDDisconnected); - Assertion.AssertEquals ("BeginDisconnect #3", false, - sock.Connected); + Assert.AreEqual (true, BDDisconnected, "BeginDisconnect #2"); + Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3"); sock.Close (); listen.Close (); @@ -2184,7 +1998,7 @@ namespace MonoTests.System.Net.Sockets sock); Assert.Fail ("BeginSendNotConnected #1"); } catch (SocketException ex) { - Assertion.AssertEquals ("BeginSendNotConnected #2", 10057, ex.ErrorCode); + Assert.AreEqual (10057, ex.ErrorCode, "BeginSendNotConnected #2"); } catch { Assert.Fail ("BeginSendNotConnected #3"); } finally { @@ -2224,8 +2038,7 @@ namespace MonoTests.System.Net.Sockets sock.Bind (ep2); Assert.Fail ("BindTwice #1"); } catch (SocketException ex) { - Assertion.AssertEquals ("BindTwice #2", - 10022, ex.ErrorCode); + Assert.AreEqual (10022, ex.ErrorCode, "BindTwice #2"); } catch { Assert.Fail ("BindTwice #3"); } finally { @@ -2250,15 +2063,13 @@ namespace MonoTests.System.Net.Sockets sock.Connect (ep); - Assertion.AssertEquals ("Close #1", true, - sock.Connected); + Assert.AreEqual (true, sock.Connected, "Close #1"); sock.Close (2); Thread.Sleep (3000); - Assertion.AssertEquals ("Close #2", false, - sock.Connected); + Assert.AreEqual (false, sock.Connected, "Close #2"); listen.Close (); } @@ -2280,8 +2091,7 @@ namespace MonoTests.System.Net.Sockets sock.Connect (ip, 1249); - Assertion.AssertEquals ("ConnectAddressPort #1", - true, sock.Connected); + Assert.AreEqual (true, sock.Connected, "ConnectAddressPort #1"); sock.Close (); listen.Close (); @@ -2367,16 +2177,11 @@ namespace MonoTests.System.Net.Sockets sock.Connect (ips, 1251); - Assertion.AssertEquals ("ConnectMultiple #1", - true, sock.Connected); - Assertion.AssertEquals ("ConnectMultiple #2", - AddressFamily.InterNetwork, - sock.RemoteEndPoint.AddressFamily); + Assert.AreEqual (true, sock.Connected, "ConnectMultiple #1"); + Assert.AreEqual (AddressFamily.InterNetwork, sock.RemoteEndPoint.AddressFamily, "ConnectMultiple #2"); IPEndPoint remep = (IPEndPoint)sock.RemoteEndPoint; - Assertion.AssertEquals ("ConnectMultiple #2", - IPAddress.Loopback, - remep.Address); + Assert.AreEqual (IPAddress.Loopback, remep.Address, "ConnectMultiple #2"); sock.Close (); listen.Close (); @@ -2540,15 +2345,13 @@ namespace MonoTests.System.Net.Sockets sock.Connect (ip, 1255); - Assertion.AssertEquals ("Disconnect #1", true, - sock.Connected); + Assert.AreEqual (true, sock.Connected, "Disconnect #1"); sock.Shutdown (SocketShutdown.Both); sock.Disconnect (false); - Assertion.AssertEquals ("BeginDisconnect #3", false, - sock.Connected); + Assert.AreEqual (false, sock.Connected, "BeginDisconnect #3"); sock.Close (); listen.Close (); @@ -2690,8 +2493,7 @@ namespace MonoTests.System.Net.Sockets sock.Listen (1); Assert.Fail ("ListenNotBound #1"); } catch (SocketException ex) { - Assertion.AssertEquals ("ListenNotBound #2", - 10022, ex.ErrorCode); + Assert.AreEqual (10022, ex.ErrorCode, "ListenNotBound #2"); } catch { Assert.Fail ("ListenNotBound #3"); } finally { @@ -2756,99 +2558,1444 @@ namespace MonoTests.System.Net.Sockets NetworkStream stream = new NetworkStream (sock); readbyte = stream.ReadByte (); - Assertion.AssertEquals ("ReceiveRemoteClosed #1", - 0, readbyte); + Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #1"); stream.Read (bytes, 0, 0); readbyte = stream.ReadByte (); - Assertion.AssertEquals ("ReceiveRemoteClosed #2", - 0, readbyte); + Assert.AreEqual (0, readbyte, "ReceiveRemoteClosed #2"); stream.Read (bytes, 0, 0); readbyte = stream.ReadByte (); - Assertion.AssertEquals ("ReceiveRemoteClosed #3", - -1, readbyte); + Assert.AreEqual (-1, readbyte, "ReceiveRemoteClosed #3"); sock.Close (); RRCLastRead = true; RRCReady.Set (); } - - [Test] - public void ReceiveRemoteClosed () + + [Test] // Receive (Byte []) + public void Receive1_Buffer_Null () { - Socket sock = new Socket (AddressFamily.InterNetwork, - SocketType.Stream, - ProtocolType.Tcp); - sock.Bind (new IPEndPoint (IPAddress.Loopback, 1257)); - sock.Listen (1); - - RRCReady.Reset (); - Thread client_thread = new Thread (new ThreadStart (RRCClientThread)); - client_thread.Start (); - - Socket client = sock.Accept (); - NetworkStream stream = new NetworkStream (client); - stream.WriteByte (0x00); - stream.WriteByte (0x00); - client.Close (); - sock.Close (); + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); - RRCReady.WaitOne (1000, false); - Assert.IsTrue (RRCLastRead); + try { + s.Receive ((byte []) null); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffer", ex.ParamName, "#5"); + } finally { + s.Close (); + } } - // - // Test case for bug #471580 - [Test] - public void UdpDoubleBind () + [Test] // Receive (Byte []) + public void Receive1_Socket_Closed () { - Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); - - s.Bind (new IPEndPoint (IPAddress.Any, 12345)); - - Socket ss = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); - - ss.Bind (new IPEndPoint (IPAddress.Any, 12345)); + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + s.Close (); - // If we make it this far, we succeeded. - - ss.Close (); + try { + s.Receive ((byte []) null); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // Receive (Byte [], SocketFlags) + public void Receive2_Buffer_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + try { + s.Receive ((byte []) null, (SocketFlags) 666); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffer", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // Receive (Byte [], SocketFlags) + public void Receive2_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); s.Close (); + + try { + s.Receive ((byte []) null, (SocketFlags) 666); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } } - + + [Test] // Receive (Byte [], Int32, SocketFlags) + public void Receive3_Buffer_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + try { + s.Receive ((byte []) null, 0, (SocketFlags) 666); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffer", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // Receive (Byte [], Int32, SocketFlags) + public void Receive3_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + s.Close (); + + try { + s.Receive ((byte []) null, 0, (SocketFlags) 666); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // Receive (Byte [], Int32, Int32, SocketFlags) + public void Receive4_Buffer_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + try { + s.Receive ((byte []) null, 0, 0, (SocketFlags) 666); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffer", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // Receive (Byte [], Int32, Int32, SocketFlags) + public void Receive4_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + s.Close (); + + try { + s.Receive ((byte []) null, 0, 0, (SocketFlags) 666); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + #if NET_2_0 - [Test] - public void ConnectedProperty () - { - TcpListener listener = new TcpListener (IPAddress.Loopback, 23456); - listener.Start(); + [Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError) + public void Receive5_Buffer_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); - Socket client = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - client.Connect (IPAddress.Loopback, 23456); - Socket server = listener.AcceptSocket (); + SocketError error; + try { + s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffer", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // Receive (Byte [], Int32, Int32, SocketFlags, out SocketError) + public void Receive5_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + s.Close (); + SocketError error; try { - server.EndSend(server.BeginSend (new byte[10], 0, 10, SocketFlags.None, null, null)); - client.Close (); - try { - server.EndReceive (server.BeginReceive (new byte[10], 0, 10, SocketFlags.None, null, null)); - } catch { - } - Assert.IsTrue (!client.Connected); - Assert.IsTrue (!server.Connected); + s.Receive ((byte []) null, 0, 0, SocketFlags.None, out error); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // Receive (IList>) + public void Receive6_Buffers_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + try { + s.Receive ((IList>) null); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffers", ex.ParamName, "#5"); } finally { - listener.Stop (); - client.Close (); - server.Close (); + s.Close (); } } -#endif - } -} + [Test] // Receive (IList>) + public void Receive6_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + s.Close (); + + try { + s.Receive ((IList>) null); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // Receive (IList>, SocketFlags) + public void Receive7_Buffers_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + try { + s.Receive ((IList>) null, (SocketFlags) 666); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffers", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // Receive (IList>, SocketFlags) + public void Receive7_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + s.Close (); + + try { + s.Receive ((IList>) null, (SocketFlags) 666); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // Receive (IList>, SocketFlags, out SocketError) + public void Receive8_Buffers_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + SocketError error; + try { + s.Receive ((IList>) null, (SocketFlags) 666, + out error); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffers", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // Receive (IList>, SocketFlags, out SocketError) + public void Receive8_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + s.Close (); + + SocketError error; + try { + s.Receive ((IList>) null, (SocketFlags) 666, + out error); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } finally { + s.Close (); + } + } +#endif + + [Test] // ReceiveFrom (Byte [], ref EndPoint) + public void ReceiveFrom1_Buffer_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001); + try { + s.ReceiveFrom ((Byte []) null, ref remoteEP); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffer", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // ReceiveFrom (Byte [], ref EndPoint) + public void ReceiveFrom1_RemoteEP_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + byte [] buffer = new byte [0]; + EndPoint remoteEP = null; + try { + s.ReceiveFrom (buffer, ref remoteEP); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("remoteEP", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // ReceiveFrom (Byte [], ref EndPoint) + public void ReceiveFrom1_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + s.Close (); + + EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001); + try { + s.ReceiveFrom ((Byte []) null, ref remoteEP); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint) + public void ReceiveFrom2_Buffer_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001); + try { + s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffer", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint) + public void ReceiveFrom2_RemoteEP_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + byte [] buffer = new byte [5]; + EndPoint remoteEP = null; + try { + s.ReceiveFrom (buffer, (SocketFlags) 666, ref remoteEP); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("remoteEP", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // ReceiveFrom (Byte [], SocketFlags, ref EndPoint) + public void ReceiveFrom2_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + s.Close (); + + EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001); + try { + s.ReceiveFrom ((Byte []) null, (SocketFlags) 666, ref remoteEP); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint) + public void ReceiveFrom3_Buffer_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001); + try { + s.ReceiveFrom ((Byte []) null, -1, (SocketFlags) 666, + ref remoteEP); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffer", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint) + public void ReceiveFrom3_RemoteEP_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + + byte [] buffer = new byte [5]; + EndPoint remoteEP = null; + try { + s.ReceiveFrom (buffer, -1, (SocketFlags) 666, ref remoteEP); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("remoteEP", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint) + public void ReceiveFrom3_Size_OutOfRange () + { + Socket s; + byte [] buffer = new byte [5]; + EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001); + + // size negative + s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + try { + s.ReceiveFrom (buffer, -1, (SocketFlags) 666, ref remoteEP); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("size", ex.ParamName, "#A5"); + } finally { + s.Close (); + } + + // size > buffer length + s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + try { + s.ReceiveFrom (buffer, (buffer.Length + 1), (SocketFlags) 666, + ref remoteEP); + Assert.Fail ("#B1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("size", ex.ParamName, "#B5"); + } finally { + s.Close (); + } + } + + [Test] // ReceiveFrom (Byte [], Int32, SocketFlags, ref EndPoint) + public void ReceiveFrom3_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + s.Close (); + + EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001); + try { + s.ReceiveFrom ((Byte []) null, -1, (SocketFlags) 666, + ref remoteEP); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint) + public void ReceiveFrom4_Buffer_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001); + + try { + s.ReceiveFrom ((Byte []) null, -1, -1, (SocketFlags) 666, + ref remoteEP); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffer", ex.ParamName, "#5"); + } + } + + [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint) + public void ReceiveFrom4_Offset_OutOfRange () + { + Socket s; + byte [] buffer = new byte [5]; + EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001); + + // offset negative + s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + try { + s.ReceiveFrom (buffer, -1, 0, (SocketFlags) 666, + ref remoteEP); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("offset", ex.ParamName, "#A5"); + } finally { + s.Close (); + } + + // offset > buffer length + s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + try { + s.ReceiveFrom (buffer, (buffer.Length + 1), 0, (SocketFlags) 666, + ref remoteEP); + Assert.Fail ("#B1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("offset", ex.ParamName, "#B5"); + } finally { + s.Close (); + } + } + + [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref IPEndPoint) + public void ReceiveFrom4_RemoteEP_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + byte [] buffer = new byte [5]; + EndPoint remoteEP = null; + + try { + s.ReceiveFrom (buffer, -1, -1, (SocketFlags) 666, ref remoteEP); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("remoteEP", ex.ParamName, "#5"); + } finally { + s.Close (); + } + } + + [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, EndPoint) + public void ReceiveFrom4_Size_OutOfRange () + { + Socket s; + byte [] buffer = new byte [5]; + EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001); + + // size negative + s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + try { + s.ReceiveFrom (buffer, 0, -1, (SocketFlags) 666, + ref remoteEP); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("size", ex.ParamName, "#A5"); + } finally { + s.Close (); + } + + // size > buffer length + s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + try { + s.ReceiveFrom (buffer, 0, (buffer.Length + 1), (SocketFlags) 666, + ref remoteEP); + Assert.Fail ("#B1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("size", ex.ParamName, "#B5"); + } finally { + s.Close (); + } + + // offset + size > buffer length + s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + try { + s.ReceiveFrom (buffer, 2, 4, (SocketFlags) 666, ref remoteEP); + Assert.Fail ("#C1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.AreEqual ("size", ex.ParamName, "#C5"); + } finally { + s.Close (); + } + } + + [Test] // ReceiveFrom (Byte [], Int32, Int32, SocketFlags, ref EndPoint) + public void ReceiveFrom4_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, + ProtocolType.Tcp); + s.Close (); + + byte [] buffer = new byte [5]; + EndPoint remoteEP = new IPEndPoint (IPAddress.Loopback, 8001); + try { + s.ReceiveFrom (buffer, -1, -1, (SocketFlags) 666, + ref remoteEP); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] + public void ReceiveRemoteClosed () + { + Socket sock = new Socket (AddressFamily.InterNetwork, + SocketType.Stream, + ProtocolType.Tcp); + sock.Bind (new IPEndPoint (IPAddress.Loopback, 1257)); + sock.Listen (1); + + RRCReady.Reset (); + Thread client_thread = new Thread (new ThreadStart (RRCClientThread)); + client_thread.Start (); + + Socket client = sock.Accept (); + NetworkStream stream = new NetworkStream (client); + stream.WriteByte (0x00); + stream.WriteByte (0x00); + client.Close (); + sock.Close (); + + RRCReady.WaitOne (1000, false); + Assert.IsTrue (RRCLastRead); + } + + // + // Test case for bug #471580 + [Test] + public void UdpDoubleBind () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); + + s.Bind (new IPEndPoint (IPAddress.Any, 12345)); + + Socket ss = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + ss.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); + + ss.Bind (new IPEndPoint (IPAddress.Any, 12345)); + + // If we make it this far, we succeeded. + + ss.Close (); + s.Close (); + } + +#if NET_2_0 + [Test] + public void ConnectedProperty () + { + TcpListener listener = new TcpListener (IPAddress.Loopback, 23456); + listener.Start(); + + Socket client = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + client.Connect (IPAddress.Loopback, 23456); + Socket server = listener.AcceptSocket (); + + try { + server.EndSend(server.BeginSend (new byte[10], 0, 10, SocketFlags.None, null, null)); + client.Close (); + try { + server.EndReceive (server.BeginReceive (new byte[10], 0, 10, SocketFlags.None, null, null)); + } catch { + } + Assert.IsTrue (!client.Connected); + Assert.IsTrue (!server.Connected); + } finally { + listener.Stop (); + client.Close (); + server.Close (); + } + } +#endif + + [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName) + public void GetSocketOption1_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + s.Close (); + try { + s.GetSocketOption (0, 0); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte []) + public void GetSocketOption2_OptionValue_Null () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + try { + s.GetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, + (byte []) null); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // The system detected an invalid pointer address in attempting + // to use a pointer argument in a call + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10014, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10014, ex.NativeErrorCode, "#6"); +#if NET_2_0 + Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7"); +#endif + } + } + + [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Byte []) + public void GetSocketOption2_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + s.Close (); + try { + s.GetSocketOption (0, 0, (byte []) null); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // GetSocketOption (SocketOptionLevel, SocketOptionName, Int32) + public void GetSocketOption3_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + s.Close (); + try { + s.GetSocketOption (0, 0, 0); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte []) + public void SetSocketOption1_DontLinger () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, + new byte [] { 0x00 }); + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, + new byte [] { 0x01 }); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte []) + public void SetSocketOption1_DontLinger_Null () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + try { + s.SetSocketOption (SocketOptionLevel.Socket, + SocketOptionName.DontLinger, (byte []) null); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // The system detected an invalid pointer address in attempting + // to use a pointer argument in a call + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10014, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10014, ex.NativeErrorCode, "#6"); +#if NET_2_0 + Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7"); +#endif + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte []) + public void SetSocketOption1_Linger_Null () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + try { + s.SetSocketOption (SocketOptionLevel.Socket, + SocketOptionName.DontLinger, (byte []) null); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // The system detected an invalid pointer address in attempting + // to use a pointer argument in a call + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10014, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10014, ex.NativeErrorCode, "#6"); +#if NET_2_0 + Assert.AreEqual (SocketError.Fault, ex.SocketErrorCode, "#7"); +#endif + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Byte []) + public void SetSocketOption1_Socket_Close () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + s.Close (); + try { + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, + new byte [] { 0x00 }); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32) + public void SetSocketOption2_DontLinger () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0); + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 5); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32) + [Category ("NotWorking")] + public void SetSocketOption2_Linger () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 0); + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, 5); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Int32) + public void SetSocketOption2_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + s.Close (); + try { + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.DontLinger, 0); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_AddMembershipIPv4_IPv6MulticastOption () + { + IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250"); + + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { + s.Bind (new IPEndPoint (IPAddress.Any, 1901)); + try { + s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership, + new IPv6MulticastOption (mcast_addr)); + Assert.Fail ("#1"); + } catch (ArgumentException ex) { + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); +#if NET_2_0 + // The specified value is not a valid 'MulticastOption' + Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message); + Assert.AreEqual ("optionValue", ex.ParamName, "#6"); +#else + Assert.AreEqual ("optionValue", ex.Message, "#5"); + Assert.IsNull (ex.ParamName, "#6"); +#endif + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_AddMembershipIPv4_MulticastOption () + { + IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250"); + + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { + s.Bind (new IPEndPoint (IPAddress.Any, 1901)); + s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership, + new MulticastOption (mcast_addr)); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + [Category ("NotWorking")] + public void SetSocketOption3_AddMembershipIPv4_Socket_NotBound () + { + IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250"); + + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + try { + s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership, + new MulticastOption (mcast_addr)); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // An invalid argument was supplied + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10022, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10022, ex.NativeErrorCode, "#6"); +#if NET_2_0 + Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7"); +#endif + } finally { + s.Close (); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_AddMembershipIPv6_IPv6MulticastOption () + { +#if NET_2_0 + if (!Socket.OSSupportsIPv6) +#else + if (!Socket.SupportsIPv6) +#endif + Assert.Ignore ("IPv6 not enabled."); + + IPAddress mcast_addr = IPAddress.Parse ("ff02::1"); + + using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) { + s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902)); + s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership, + new IPv6MulticastOption (mcast_addr)); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_AddMembershipIPv6_MulticastOption () + { +#if NET_2_0 + if (!Socket.OSSupportsIPv6) +#else + if (!Socket.SupportsIPv6) +#endif + Assert.Ignore ("IPv6 not enabled."); + + IPAddress mcast_addr = IPAddress.Parse ("ff02::1"); + + using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) { + s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902)); + try { + s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership, + new MulticastOption (mcast_addr)); + Assert.Fail ("#1"); + } catch (ArgumentException ex) { + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); +#if NET_2_0 + // The specified value is not a valid 'IPv6MulticastOption' + Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message); + Assert.AreEqual ("optionValue", ex.ParamName, "#6"); +#else + Assert.AreEqual ("optionValue", ex.Message, "#5"); + Assert.IsNull (ex.ParamName, "#6"); +#endif + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + [Category ("NotWorking")] + public void SetSocketOption3_AddMembershipIPv6_Socket_NotBound () + { + IPAddress mcast_addr = IPAddress.Parse ("ff02::1"); + + Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp); + try { + s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership, + new IPv6MulticastOption (mcast_addr)); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // An invalid argument was supplied + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10022, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10022, ex.NativeErrorCode, "#6"); +#if NET_2_0 + Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7"); +#endif + } finally { + s.Close (); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_DontLinger_Boolean () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + try { + s.SetSocketOption (SocketOptionLevel.Socket, + SocketOptionName.DontLinger, (object) false); + Assert.Fail ("#1"); + } catch (ArgumentException ex) { + // The specified value is not valid + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); +#if NET_2_0 + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("optionValue", ex.ParamName, "#5"); +#else + Assert.AreEqual ("optionValue", ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); +#endif + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_DontLinger_Int32 () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + try { + s.SetSocketOption (SocketOptionLevel.Socket, + SocketOptionName.DontLinger, (object) 0); + Assert.Fail ("#1"); + } catch (ArgumentException ex) { + // The specified value is not valid + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); +#if NET_2_0 + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("optionValue", ex.ParamName, "#5"); +#else + Assert.AreEqual ("optionValue", ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); +#endif + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_DontLinger_LingerOption () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + try { + s.SetSocketOption (SocketOptionLevel.Socket, + SocketOptionName.DontLinger, new LingerOption (true, 1000)); + Assert.Fail ("#1"); + } catch (ArgumentException ex) { + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); +#if NET_2_0 + // The specified value is not valid + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("optionValue", ex.ParamName, "#5"); +#else + Assert.AreEqual ("optionValue", ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); +#endif + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_Linger_Boolean () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + try { + s.SetSocketOption (SocketOptionLevel.Socket, + SocketOptionName.Linger, (object) false); + Assert.Fail ("#1"); + } catch (ArgumentException ex) { + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); +#if NET_2_0 + // The specified value is not valid + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("optionValue", ex.ParamName, "#5"); +#else + Assert.AreEqual ("optionValue", ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); +#endif + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_Linger_Int32 () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + try { + s.SetSocketOption (SocketOptionLevel.Socket, + SocketOptionName.Linger, (object) 0); + Assert.Fail ("#1"); + } catch (ArgumentException ex) { + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); +#if NET_2_0 + // The specified value is not valid + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("optionValue", ex.ParamName, "#5"); +#else + Assert.AreEqual ("optionValue", ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); +#endif + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_Linger_LingerOption () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, + new LingerOption (false, 0)); + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, + new LingerOption (true, 0)); + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, + new LingerOption (false, 1000)); + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, + new LingerOption (true, 1000)); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_DropMembershipIPv4_IPv6MulticastOption () + { + IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250"); + + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { + s.Bind (new IPEndPoint (IPAddress.Any, 1901)); + s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership, + new MulticastOption (mcast_addr)); + try { + s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership, + new IPv6MulticastOption (mcast_addr)); + Assert.Fail ("#1"); + } catch (ArgumentException ex) { + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); +#if NET_2_0 + // The specified value is not a valid 'MulticastOption' + Assert.IsTrue (ex.Message.IndexOf ("'MulticastOption'") != -1, "#5:" + ex.Message); + Assert.AreEqual ("optionValue", ex.ParamName, "#6"); +#else + Assert.AreEqual ("optionValue", ex.Message, "#5"); + Assert.IsNull (ex.ParamName, "#6"); +#endif + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_DropMembershipIPv4_MulticastOption () + { + IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250"); + + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)) { + MulticastOption option = new MulticastOption (mcast_addr); + + s.Bind (new IPEndPoint (IPAddress.Any, 1901)); + s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.AddMembership, + option); + s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership, + option); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + [Category ("NotWorking")] + public void SetSocketOption3_DropMembershipIPv4_Socket_NotBound () + { + IPAddress mcast_addr = IPAddress.Parse ("239.255.255.250"); + + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + try { + s.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.DropMembership, + new MulticastOption (mcast_addr)); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // An invalid argument was supplied + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10022, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10022, ex.NativeErrorCode, "#6"); +#if NET_2_0 + Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7"); +#endif + } finally { + s.Close (); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_DropMembershipIPv6_IPv6MulticastOption () + { +#if NET_2_0 + if (!Socket.OSSupportsIPv6) +#else + if (!Socket.SupportsIPv6) +#endif + Assert.Ignore ("IPv6 not enabled."); + + using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) { + IPv6MulticastOption option = new IPv6MulticastOption ( + IPAddress.Parse ("ff02::1")); + + s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902)); + s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership, + option); + s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership, + option); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_DropMembershipIPv6_MulticastOption () + { +#if NET_2_0 + if (!Socket.OSSupportsIPv6) +#else + if (!Socket.SupportsIPv6) +#endif + Assert.Ignore ("IPv6 not enabled."); + + IPAddress mcast_addr = IPAddress.Parse ("ff02::1"); + + using (Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp)) { + s.Bind (new IPEndPoint (IPAddress.IPv6Any, 1902)); + s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.AddMembership, + new IPv6MulticastOption (mcast_addr)); + try { + s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership, + new MulticastOption (mcast_addr)); + Assert.Fail ("#1"); + } catch (ArgumentException ex) { + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); +#if NET_2_0 + // The specified value is not a valid 'IPv6MulticastOption' + Assert.IsTrue (ex.Message.IndexOf ("'IPv6MulticastOption'") != -1, "#5:" + ex.Message); + Assert.AreEqual ("optionValue", ex.ParamName, "#6"); +#else + Assert.AreEqual ("optionValue", ex.Message, "#5"); + Assert.IsNull (ex.ParamName, "#6"); +#endif + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + [Category ("NotWorking")] + public void SetSocketOption3_DropMembershipIPv6_Socket_NotBound () + { + IPAddress mcast_addr = IPAddress.Parse ("ff02::1"); + + Socket s = new Socket (AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp); + try { + s.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionName.DropMembership, + new IPv6MulticastOption (mcast_addr)); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // An invalid argument was supplied + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10022, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10022, ex.NativeErrorCode, "#6"); +#if NET_2_0 + Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7"); +#endif + } finally { + s.Close (); + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_OptionValue_Null () + { + using (Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { + try { + s.SetSocketOption (SocketOptionLevel.Socket, + SocketOptionName.Linger, (object) null); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("optionValue", ex.ParamName, "#5"); + } + } + } + + [Test] // SetSocketOption (SocketOptionLevel, SocketOptionName, Object) + public void SetSocketOption3_Socket_Closed () + { + Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + s.Close (); + try { + s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.Linger, + new LingerOption (false, 0)); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (Socket).FullName, ex.ObjectName, "#5"); + } + } + } +} diff --git a/mcs/class/System/Test/System.Net.Sockets/TcpClientTest.cs b/mcs/class/System/Test/System.Net.Sockets/TcpClientTest.cs index ffee12e9754..1915c3c39e9 100644 --- a/mcs/class/System/Test/System.Net.Sockets/TcpClientTest.cs +++ b/mcs/class/System/Test/System.Net.Sockets/TcpClientTest.cs @@ -58,11 +58,11 @@ namespace MonoTests.System.Net.Sockets // and see if it comes back byte[] inBuf = new Byte[len]; int ret = inSock.Receive(inBuf, 0, len, 0); - Assertion.Assert(ret != 0); + Assert.IsTrue (ret != 0); for (int i=0; i +// Gert Driesen // - using System; using System.Net; using System.Net.Sockets; using System.Threading; + using NUnit.Framework; namespace MonoTests.System.Net.Sockets { #if TARGET_JVM - [Ignore("UdpClient is not supported - since UDP sockets are not supported")] + [Ignore("UdpClient is not supported - since UDP sockets are not supported")] #endif - [TestFixture] + [TestFixture] public class UdpClientTest { + [Test] // .ctor () + public void Constructor1 () + { + MyUdpClient client; + Socket s; + + client = new MyUdpClient (); + s = client.Client; + Assert.IsNotNull (s, "Client"); + Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "Client:AddressFamily"); + Assert.IsFalse (s.Connected, "Client:Connected"); +#if NET_2_0 + Assert.IsFalse (s.IsBound, "#A:Client:IsBound"); +#endif + Assert.IsNull (s.LocalEndPoint, "Client:LocalEndPoint"); + Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "Client:ProtocolType"); + Assert.IsNull (s.RemoteEndPoint, "Client:RemoteEndPoint"); + Assert.AreEqual (SocketType.Dgram, s.SocketType, "Client:SocketType"); + Assert.IsFalse (client.Active, "Active"); +#if NET_2_0 + Assert.IsFalse (client.DontFragment, "DontFragment"); + Assert.IsFalse (client.EnableBroadcast, "EnableBroadcast"); + //Assert.IsFalse (client.ExclusiveAddressUse, "ExclusiveAddressUse"); + Assert.IsTrue (client.MulticastLoopback, "MulticastLoopback"); + //Assert.AreEqual (32, client.Ttl, "Ttl"); +#endif + } + + [Test] // .ctor (AddressFamily) + public void Constructor2 () + { + MyUdpClient client; + Socket s; + + client = new MyUdpClient (AddressFamily.InterNetwork); + s = client.Client; + Assert.IsNotNull (s, "#A:Client"); + Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#A:Client:AddressFamily"); + Assert.IsFalse (s.Connected, "#A:Client:Connected"); +#if NET_2_0 + Assert.IsFalse (s.IsBound, "#A:Client:IsBound"); +#endif + Assert.IsNull (s.LocalEndPoint, "#A:Client:LocalEndPoint"); + Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#A:Client:ProtocolType"); + Assert.IsNull (s.RemoteEndPoint, "#A:Client:RemoteEndPoint"); + Assert.AreEqual (SocketType.Dgram, s.SocketType, "#A:Client:SocketType"); + Assert.IsFalse (client.Active, "#A:Active"); +#if NET_2_0 + //Assert.IsFalse (client.DontFragment, "#A:DontFragment"); + Assert.IsFalse (client.EnableBroadcast, "#A:EnableBroadcast"); + //Assert.IsFalse (client.ExclusiveAddressUse, "#A:ExclusiveAddressUse"); + Assert.IsTrue (client.MulticastLoopback, "#A:MulticastLoopback"); + //Assert.AreEqual (32, client.Ttl, "#A:Ttl"); +#endif + + client = new MyUdpClient (AddressFamily.InterNetworkV6); + s = client.Client; + Assert.IsNotNull (s, "#B:Client"); + Assert.AreEqual (AddressFamily.InterNetworkV6, s.AddressFamily, "#B:Client:AddressFamily"); + Assert.IsFalse (s.Connected, "#B:Client:Connected"); +#if NET_2_0 + Assert.IsFalse (s.IsBound, "#A:Client:IsBound"); +#endif + Assert.IsNull (s.LocalEndPoint, "#B:Client:LocalEndPoint"); + Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#B:Client:ProtocolType"); + Assert.IsNull (s.RemoteEndPoint, "#B:Client:RemoteEndPoint"); + Assert.AreEqual (SocketType.Dgram, s.SocketType, "#B:Client:SocketType"); + Assert.IsFalse (client.Active, "#B:Active"); +#if NET_2_0 + //Assert.IsFalse (client.DontFragment, "#B:DontFragment"); + Assert.IsFalse (client.EnableBroadcast, "#B:EnableBroadcast"); + //Assert.IsFalse (client.ExclusiveAddressUse, "#B:ExclusiveAddressUse"); + Assert.IsTrue (client.MulticastLoopback, "#B:MulticastLoopback"); + //Assert.AreEqual (32, client.Ttl, "#B:Ttl"); +#endif + } + + [Test] // .ctor (AddressFamily) + public void Constructor2_Family_Invalid () + { + try { + new UdpClient (AddressFamily.NetBios); + Assert.Fail ("#A1"); + } catch (ArgumentException ex) { + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); +#if NET_2_0 + // 'UDP' Client can only accept InterNetwork or InterNetworkV6 + // addresses + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("family", ex.ParamName, "#A5"); +#else + Assert.AreEqual ("family", ex.Message, "#A4"); + Assert.IsNull (ex.ParamName, "#A5"); +#endif + } + + try { + new UdpClient ((AddressFamily) 666); + Assert.Fail ("#B1"); + } catch (ArgumentException ex) { + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); +#if NET_2_0 + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("family", ex.ParamName, "#B5"); +#else + Assert.AreEqual ("family", ex.Message, "#B4"); + Assert.IsNull (ex.ParamName, "#B5"); +#endif + } + } + + [Test] // .ctor (Int32) + public void Constructor3 () + { + MyUdpClient client; + Socket s; + IPEndPoint localEP; + + client = new MyUdpClient (IPEndPoint.MinPort); + s = client.Client; + Assert.IsNotNull (s, "#A:Client"); + Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#A:Client:AddressFamily"); + Assert.IsFalse (s.Connected, "#A:Client:Connected"); +#if NET_2_0 + Assert.IsTrue (s.IsBound, "#A:Client:IsBound"); +#endif + Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#A:Client:ProtocolType"); + Assert.AreEqual (SocketType.Dgram, s.SocketType, "#A:Client:SocketType"); + Assert.IsFalse (client.Active, "#A:Active"); +#if NET_2_0 + Assert.IsFalse (client.DontFragment, "#A:DontFragment"); + Assert.IsFalse (client.EnableBroadcast, "#A:EnableBroadcast"); + //Assert.IsFalse (client.ExclusiveAddressUse, "#A:ExclusiveAddressUse"); + Assert.IsTrue (client.MulticastLoopback, "#A:MulticastLoopback"); + //Assert.AreEqual (32, client.Ttl, "#A:Ttl"); +#endif + localEP = s.LocalEndPoint as IPEndPoint; + Assert.IsNotNull (localEP, "#A:Client:LocalEndpoint"); + Assert.AreEqual (IPAddress.Any, localEP.Address, "#A:Client:LocalEndPoint/Address"); + Assert.AreEqual (AddressFamily.InterNetwork, localEP.AddressFamily, "#A:Client:LocalEndPoint/AddressFamily"); + + client = new MyUdpClient (IPEndPoint.MaxPort); + s = client.Client; + Assert.IsNotNull (s, "#B:Client"); + Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#B:Client:AddressFamily"); + Assert.IsFalse (s.Connected, "#B:Client:Connected"); +#if NET_2_0 + Assert.IsTrue (s.IsBound, "#B:Client:IsBound"); +#endif + Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#B:Client:ProtocolType"); + Assert.AreEqual (SocketType.Dgram, s.SocketType, "#B:Client:SocketType"); + Assert.IsFalse (client.Active, "#B:Active"); +#if NET_2_0 + Assert.IsFalse (client.DontFragment, "#B:DontFragment"); + Assert.IsFalse (client.EnableBroadcast, "#B:EnableBroadcast"); + //Assert.IsFalse (client.ExclusiveAddressUse, "#B:ExclusiveAddressUse"); + Assert.IsTrue (client.MulticastLoopback, "#B:MulticastLoopback"); + //Assert.AreEqual (32, client.Ttl, "#B:Ttl"); +#endif + localEP = s.LocalEndPoint as IPEndPoint; + Assert.IsNotNull (localEP, "#B:Client:LocalEndpoint"); + Assert.AreEqual (IPAddress.Any, localEP.Address, "#B:Client:LocalEndPoint/Address"); + Assert.AreEqual (AddressFamily.InterNetwork, localEP.AddressFamily, "#B:Client:LocalEndPoint/AddressFamily"); + Assert.AreEqual (IPEndPoint.MaxPort, localEP.Port, "#B:Client:LocalEndPoint/Port"); + } + + [Test] // .ctor (Int32) + public void Constructor3_Port_OutOfRange () + { + try { + new UdpClient (IPEndPoint.MaxPort + 1); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("port", ex.ParamName, "#A5"); + } + + try { + new UdpClient (IPEndPoint.MinPort - 1); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("port", ex.ParamName, "#A5"); + } + } + + [Test] // .ctor (IPEndPoint) + public void Constructor4 () + { + MyUdpClient client; + Socket s; + IPEndPoint localEP; + IPEndPoint clientEP; + + clientEP = new IPEndPoint (IPAddress.Loopback, 8001); + client = new MyUdpClient (clientEP); + s = client.Client; + Assert.IsNotNull (s, "#A:Client"); + Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#A:Client:AddressFamily"); + Assert.IsFalse (s.Connected, "#A:Client:Connected"); +#if NET_2_0 + Assert.IsTrue (s.IsBound, "#A:Client:IsBound"); +#endif + Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#A:Client:ProtocolType"); + Assert.AreEqual (SocketType.Dgram, s.SocketType, "#A:Client:SocketType"); + Assert.IsFalse (client.Active, "#A:Active"); +#if NET_2_0 + Assert.IsFalse (client.DontFragment, "#A:DontFragment"); + Assert.IsFalse (client.EnableBroadcast, "#A:EnableBroadcast"); + //Assert.IsFalse (client.ExclusiveAddressUse, "#A:ExclusiveAddressUse"); + Assert.IsTrue (client.MulticastLoopback, "#A:MulticastLoopback"); + //Assert.AreEqual (32, client.Ttl, "#A:Ttl"); +#endif + localEP = s.LocalEndPoint as IPEndPoint; + Assert.IsNotNull (localEP, "#A:Client:LocalEndpoint"); + Assert.IsFalse (object.ReferenceEquals (clientEP, localEP), "#A:Client:LocalEndPoint/ReferenceEquality"); + Assert.AreEqual (clientEP.Address, localEP.Address, "#A:Client:LocalEndPoint/Address"); + Assert.AreEqual (clientEP.AddressFamily, localEP.AddressFamily, "#A:Client:LocalEndPoint/AddressFamily"); + Assert.AreEqual (clientEP.Port, localEP.Port, "#A:Client:LocalEndPoint/Port"); + } + + [Test] // .ctor (IPEndPoint) + public void Constructor4_LocalEP_Null () + { + try { + new UdpClient ((IPEndPoint) null); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("localEP", ex.ParamName, "#5"); + } + } + + [Test] // .ctor (Int32, AddressFamily) + public void Constructor5 () + { + MyUdpClient client; + Socket s; + IPEndPoint localEP; + + client = new MyUdpClient (IPEndPoint.MinPort, AddressFamily.InterNetwork); + s = client.Client; + Assert.IsNotNull (s, "#A:Client"); + Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#A:Client:AddressFamily"); + Assert.IsFalse (s.Connected, "#A:Client:Connected"); +#if NET_2_0 + Assert.IsTrue (s.IsBound, "#A:Client:IsBound"); +#endif + Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#A:Client:ProtocolType"); + Assert.AreEqual (SocketType.Dgram, s.SocketType, "#A:Client:SocketType"); + Assert.IsFalse (client.Active, "#A:Active"); +#if NET_2_0 + //Assert.IsFalse (client.DontFragment, "#A:DontFragment"); + Assert.IsFalse (client.EnableBroadcast, "#A:EnableBroadcast"); + //Assert.IsFalse (client.ExclusiveAddressUse, "#A:ExclusiveAddressUse"); + Assert.IsTrue (client.MulticastLoopback, "#A:MulticastLoopback"); + //Assert.AreEqual (32, client.Ttl, "#A:Ttl"); +#endif + localEP = s.LocalEndPoint as IPEndPoint; + Assert.IsNotNull (localEP, "#A:Client:LocalEndpoint"); + Assert.AreEqual (IPAddress.Any, localEP.Address, "#A:Client:LocalEndPoint/Address"); + Assert.AreEqual (AddressFamily.InterNetwork, localEP.AddressFamily, "#A:Client:LocalEndPoint/AddressFamily"); + + client = new MyUdpClient (IPEndPoint.MaxPort, AddressFamily.InterNetworkV6); + s = client.Client; + Assert.IsNotNull (s, "#B:Client"); + Assert.AreEqual (AddressFamily.InterNetworkV6, s.AddressFamily, "#B:Client:AddressFamily"); + Assert.IsFalse (s.Connected, "#B:Client:Connected"); +#if NET_2_0 + Assert.IsTrue (s.IsBound, "#B:Client:IsBound"); +#endif + Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#B:Client:ProtocolType"); + Assert.AreEqual (SocketType.Dgram, s.SocketType, "#B:Client:SocketType"); + Assert.IsFalse (client.Active, "#B:Active"); +#if NET_2_0 + //Assert.IsFalse (client.DontFragment, "#B:DontFragment"); + Assert.IsFalse (client.EnableBroadcast, "#B:EnableBroadcast"); + //Assert.IsFalse (client.ExclusiveAddressUse, "#B:ExclusiveAddressUse"); + Assert.IsTrue (client.MulticastLoopback, "#B:MulticastLoopback"); + //Assert.AreEqual (32, client.Ttl, "#B:Ttl"); +#endif + localEP = s.LocalEndPoint as IPEndPoint; + Assert.IsNotNull (localEP, "#B:Client:LocalEndpoint"); + Assert.AreEqual (IPAddress.IPv6Any, localEP.Address, "#B:Client:LocalEndPoint/Address"); + Assert.AreEqual (AddressFamily.InterNetworkV6, localEP.AddressFamily, "#B:Client:LocalEndPoint/AddressFamily"); + Assert.AreEqual (IPEndPoint.MaxPort, localEP.Port, "#B:Client:LocalEndPoint/Port"); + } + + [Test] // .ctor (Int32, AddressFamily) + public void Constructor5_Family_Invalid () + { + try { + new UdpClient (80, AddressFamily.NetBios); + Assert.Fail ("#A1"); + } catch (ArgumentException ex) { + // family + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); +#if NET_2_0 + // 'UDP' Client can only accept InterNetwork or InterNetworkV6 + // addresses + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("family", ex.ParamName, "#A5"); +#else + Assert.AreEqual ("family", ex.Message, "#A4"); + Assert.IsNull (ex.ParamName, "#A5"); +#endif + } + + try { + new UdpClient (80, (AddressFamily) 666); + Assert.Fail ("#B1"); + } catch (ArgumentException ex) { + // family + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); +#if NET_2_0 + // 'UDP' Client can only accept InterNetwork or InterNetworkV6 + // addresses + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("family", ex.ParamName, "#B5"); +#else + Assert.AreEqual ("family", ex.Message, "#B4"); + Assert.IsNull (ex.ParamName, "#B5"); +#endif + } + } + + [Test] // .ctor (Int32, AddressFamily) + public void Constructor5_Port_OutOfRange () + { + try { + new UdpClient (IPEndPoint.MaxPort + 1, AddressFamily.InterNetwork); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("port", ex.ParamName, "#A5"); + } + + try { + new UdpClient (IPEndPoint.MinPort - 1, AddressFamily.InterNetwork); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("port", ex.ParamName, "#A5"); + } + } + + [Test] // .ctor (String, Int32) + public void Constructor6 () + { + MyUdpClient client; + Socket s; + IPEndPoint localEP; + + client = new MyUdpClient ("localhost", IPEndPoint.MinPort); + s = client.Client; + Assert.IsNotNull (s, "#A:Client"); + Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#A:Client:AddressFamily"); + Assert.IsTrue (s.Connected, "#A:Client:Connected"); +#if NET_2_0 + Assert.IsTrue (s.IsBound, "#A:Client:IsBound"); +#endif + Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#A:Client:ProtocolType"); + Assert.AreEqual (SocketType.Dgram, s.SocketType, "#A:Client:SocketType"); + Assert.IsTrue (client.Active, "#A:Active"); +#if NET_2_0 + Assert.IsFalse (client.DontFragment, "#A:DontFragment"); + Assert.IsFalse (client.EnableBroadcast, "#A:EnableBroadcast"); + //Assert.IsFalse (client.ExclusiveAddressUse, "#A:ExclusiveAddressUse"); + //Assert.IsFalse (client.MulticastLoopback, "#A:MulticastLoopback"); + //Assert.AreEqual (32, client.Ttl, "#A:Ttl"); +#endif + localEP = s.LocalEndPoint as IPEndPoint; + Assert.IsNotNull (localEP, "#A:Client:LocalEndpoint"); + Assert.AreEqual (IPAddress.Loopback, localEP.Address, "#A:Client:LocalEndPoint/Address"); + Assert.AreEqual (AddressFamily.InterNetwork, localEP.AddressFamily, "#A:Client:LocalEndPoint/AddressFamily"); + + client = new MyUdpClient ("localhost", IPEndPoint.MaxPort); + s = client.Client; + Assert.IsNotNull (s, "#B:Client"); + Assert.AreEqual (AddressFamily.InterNetwork, s.AddressFamily, "#B:Client:AddressFamily"); + Assert.IsTrue (s.Connected, "#B:Client:Connected"); +#if NET_2_0 + Assert.IsTrue (s.IsBound, "#B:Client:IsBound"); +#endif + Assert.AreEqual (ProtocolType.Udp, s.ProtocolType, "#B:Client:ProtocolType"); + Assert.AreEqual (SocketType.Dgram, s.SocketType, "#B:Client:SocketType"); + Assert.IsTrue (client.Active, "#B:Active"); +#if NET_2_0 + Assert.IsFalse (client.DontFragment, "#B:DontFragment"); + Assert.IsFalse (client.EnableBroadcast, "#B:EnableBroadcast"); + //Assert.IsFalse (client.ExclusiveAddressUse, "#B:ExclusiveAddressUse"); + //Assert.IsFalse (client.MulticastLoopback, "#B:MulticastLoopback"); + //Assert.AreEqual (32, client.Ttl, "#B:Ttl"); +#endif + localEP = s.LocalEndPoint as IPEndPoint; + Assert.IsNotNull (localEP, "#B:Client:LocalEndpoint"); + Assert.AreEqual (IPAddress.Loopback, localEP.Address, "#B:Client:LocalEndPoint/Address"); + Assert.AreEqual (AddressFamily.InterNetwork, localEP.AddressFamily, "#B:Client:LocalEndPoint/AddressFamily"); + } + + [Test] // .ctor (String, Int32) + public void Constructor6_HostName_Null () + { + try { + new UdpClient ((string) null, int.MaxValue); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("hostname", ex.ParamName, "#5"); + } + } + + [Test] // .ctor (String, Int32) + public void Constructor6_Port_OutOfRange () + { + try { + new UdpClient ("local", IPEndPoint.MaxPort + 1); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("port", ex.ParamName, "#A5"); + } + + try { + new UdpClient ("local", IPEndPoint.MinPort - 1); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("port", ex.ParamName, "#A5"); + } + } + [Test] public void UdpClientBroadcastTest () { - bool exThrown = false; UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234)); byte[] bytes = new byte[] {10, 11, 12, 13}; try { client.Send (bytes, bytes.Length, new IPEndPoint (IPAddress.Broadcast, 1235)); - } catch (SocketException) { - exThrown = true; + } finally { + client.Close (); } - Assert.IsFalse(exThrown, "UdpClient Broadcast #1"); + } + [Test] // JoinMulticastGroup (IPAddress) + public void JoinMulticastGroup1_IPv4 () + { + IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23"); + + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234))) { + client.JoinMulticastGroup (mcast_addr); + } + } + + [Test] // JoinMulticastGroup (IPAddress) + public void JoinMulticastGroup1_IPv6 () + { +#if NET_2_0 + if (!Socket.OSSupportsIPv6) +#else + if (!Socket.SupportsIPv6) +#endif + Assert.Ignore ("IPv6 not enabled."); + + IPAddress mcast_addr = IPAddress.Parse ("ff02::1"); + + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234))) { + client.JoinMulticastGroup (mcast_addr); + } + } + + [Test] // JoinMulticastGroup (IPAddress) + public void JoinMulticastGroup1_MulticastAddr_Null () + { + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234))) { + try { + client.JoinMulticastGroup ((IPAddress) null); + Assert.Fail ("#1"); +#if NET_2_0 + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("multicastAddr", ex.ParamName, "#5"); + } +#else + } catch (NullReferenceException ex) { + Assert.AreEqual (typeof (NullReferenceException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + } +#endif + } + } + + [Test] // JoinMulticastGroup (IPAddress) + public void JoinMulticastGroup1_Socket_Closed () + { + IPAddress mcast_addr = null; + + UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234)); client.Close (); + try { + client.JoinMulticastGroup (mcast_addr); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (UdpClient).FullName, ex.ObjectName, "#5"); + } } + [Test] // JoinMulticastGroup (IPAddress) + [Category ("NotWorking")] + public void JoinMulticastGroup1_Socket_NotBound () + { + IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23"); + + UdpClient client = new UdpClient (AddressFamily.InterNetwork); + try { + client.JoinMulticastGroup (mcast_addr); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // An invalid argument was supplied + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10022, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10022, ex.NativeErrorCode, "#6"); #if NET_2_0 + Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7"); +#endif + } finally { + client.Close (); + } + } + + [Test] // JoinMulticastGroup (In32, IPAddress) + public void JoinMulticastGroup2_IPv4 () + { + IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23"); + + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234))) { + try { + client.JoinMulticastGroup (0, mcast_addr); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // The attempted operation is not supported for the type of + // object referenced + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10045, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10045, ex.NativeErrorCode, "#6"); +#if NET_2_0 + Assert.AreEqual (SocketError.OperationNotSupported, ex.SocketErrorCode, "#7"); +#endif + } + } + } + + [Test] // JoinMulticastGroup (In32, IPAddress) + public void JoinMulticastGroup2_IPv6 () + { +#if NET_2_0 + if (!Socket.OSSupportsIPv6) +#else + if (!Socket.SupportsIPv6) +#endif + Assert.Ignore ("IPv6 not enabled."); + + IPAddress mcast_addr = IPAddress.Parse ("ff02::1"); + + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234))) { + client.JoinMulticastGroup (0, mcast_addr); + } + } + + [Test] // JoinMulticastGroup (Int32, IPAddress) + public void JoinMulticastGroup2_MulticastAddr_Null () + { + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234))) { + try { + client.JoinMulticastGroup (0, (IPAddress) null); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("multicastAddr", ex.ParamName, "#5"); + } + } + } + + [Test] // JoinMulticastGroup (Int32, IPAddress) + public void JoinMulticastGroup2_Socket_Closed () + { + IPAddress mcast_addr = null; + + UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234)); + client.Close (); + try { + client.JoinMulticastGroup (0, mcast_addr); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (UdpClient).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // JoinMulticastGroup (Int32, IPAddress) + [Category ("NotWorking")] + public void JoinMulticastGroup2_Socket_NotBound () + { + IPAddress mcast_addr = IPAddress.Parse ("ff02::1"); + + UdpClient client = new UdpClient (AddressFamily.InterNetworkV6); + try { + client.JoinMulticastGroup (0, mcast_addr); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // An invalid argument was supplied + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10022, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10022, ex.NativeErrorCode, "#6"); +#if NET_2_0 + Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7"); +#endif + } finally { + client.Close (); + } + } + + [Test] // JoinMulticastGroup (IPAddress, Int32) + public void JoinMulticastGroup3_IPv4 () + { + IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23"); + + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234))) { + client.JoinMulticastGroup (mcast_addr, 0); + } + + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234))) { + client.JoinMulticastGroup (mcast_addr, 255); + } + } + + [Test] // JoinMulticastGroup (IPAddress, Int32) + public void JoinMulticastGroup3_IPv6 () + { +#if NET_2_0 + if (!Socket.OSSupportsIPv6) +#else + if (!Socket.SupportsIPv6) +#endif + Assert.Ignore ("IPv6 not enabled."); + + IPAddress mcast_addr = IPAddress.Parse ("ff02::1"); + + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234))) { + client.JoinMulticastGroup (mcast_addr, 0); + } + + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234))) { + client.JoinMulticastGroup (mcast_addr, 255); + } + } + + [Test] // JoinMulticastGroup (IPAddress, Int32) + public void JoinMulticastGroup3_MulticastAddr_Null () + { + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234))) { + try { + client.JoinMulticastGroup ((IPAddress) null, int.MaxValue); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("multicastAddr", ex.ParamName, "#5"); + } + } + } + + [Test] // JoinMulticastGroup (IPAddress, Int32) + public void JoinMulticastGroup3_Socket_Closed () + { + IPAddress mcast_addr = null; + + UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234)); + client.Close (); + try { + client.JoinMulticastGroup (mcast_addr, 0); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (UdpClient).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // JoinMulticastGroup (IPAddress, Int32) + [Category ("NotWorking")] + public void JoinMulticastGroup3_Socket_NotBound () + { + IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23"); + + UdpClient client = new UdpClient (AddressFamily.InterNetwork); + try { + client.JoinMulticastGroup (mcast_addr, 5); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // An invalid argument was supplied + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10022, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10022, ex.NativeErrorCode, "#6"); +#if NET_2_0 + Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7"); +#endif + } finally { + client.Close (); + } + } + +#if NET_2_0 + [Test] // JoinMulticastGroup (IPAddress, IPAddress) + public void JoinMulticastGroup4_IPv4 () + { + IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23"); + IPAddress local_addr = IPAddress.Any; + + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234))) { + client.JoinMulticastGroup (mcast_addr, local_addr); + } + } + + [Test] // JoinMulticastGroup (IPAddress, IPAddress) + public void JoinMulticastGroup4_IPv6 () + { + if (!Socket.OSSupportsIPv6) + Assert.Ignore ("IPv6 not enabled."); + + IPAddress mcast_addr = IPAddress.Parse ("ff02::1"); + IPAddress local_addr = IPAddress.IPv6Any; + + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.IPv6Any, 1234))) { + try { + client.JoinMulticastGroup (mcast_addr, local_addr); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // The attempted operation is not supported for the type of + // object referenced + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10045, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10045, ex.NativeErrorCode, "#6"); + Assert.AreEqual (SocketError.OperationNotSupported, ex.SocketErrorCode, "#7"); + } + } + } + + [Test] // JoinMulticastGroup (IPAddress, IPAddress) + public void JoinMulticastGroup4_LocalAddress_Null () + { + IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23"); + + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234))) { + try { + client.JoinMulticastGroup (mcast_addr, (IPAddress) null); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("mcint", ex.ParamName, "#5"); + } + } + } + + [Test] // JoinMulticastGroup (IPAddress, IPAddress) + public void JoinMulticastGroup4_MulticastAddr_Null () + { + using (UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Loopback, 1234))) { + try { + client.JoinMulticastGroup ((IPAddress) null, IPAddress.Loopback); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("group", ex.ParamName, "#5"); + } + } + } + + [Test] // JoinMulticastGroup (IPAddress, IPAddress) + public void JoinMulticastGroup4_Socket_Closed () + { + IPAddress mcast_addr = null; + IPAddress local_addr = null; + + UdpClient client = new UdpClient (new IPEndPoint (IPAddress.Any, 1234)); + client.Close (); + try { + client.JoinMulticastGroup (mcast_addr, local_addr); + Assert.Fail ("#1"); + } catch (ObjectDisposedException ex) { + // Cannot access a disposed object + Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual (typeof (UdpClient).FullName, ex.ObjectName, "#5"); + } + } + + [Test] // JoinMulticastGroup (IPAddress, IPAddress) + [Category ("NotWorking")] + public void JoinMulticastGroup4_Socket_NotBound () + { + IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23"); + IPAddress local_addr = Dns.GetHostEntry (string.Empty).AddressList [0]; + + UdpClient client = new UdpClient (AddressFamily.InterNetwork); + try { + client.JoinMulticastGroup (mcast_addr, local_addr); + Assert.Fail ("#1"); + } catch (SocketException ex) { + // An invalid argument was supplied + Assert.AreEqual (typeof (SocketException), ex.GetType (), "#2"); + Assert.AreEqual (10022, ex.ErrorCode, "#3"); + Assert.IsNull (ex.InnerException, "#4"); + Assert.IsNotNull (ex.Message, "#5"); + Assert.AreEqual (10022, ex.NativeErrorCode, "#6"); + Assert.AreEqual (SocketError.InvalidArgument, ex.SocketErrorCode, "#7"); + } finally { + client.Close (); + } + } + [Test] public void CloseInReceive () { @@ -56,33 +917,6 @@ namespace MonoTests.System.Net.Sockets { Assert.IsTrue (got_exc); } - [Test] - public void JoinMulticastGroup () - { - UdpClient client = new UdpClient (); - IPAddress mcast_addr = IPAddress.Parse ("224.0.0.23"); - IPAddress local_addr = Dns.GetHostEntry ("").AddressList[0]; - bool exThrown = false; - - /* So much for the documented note "You cannot - * call JoinMulticastGroup on a UdpClient - * constructed without a specific local port - * (that is, using the UdpClient or - * UdpClient(AddressFamily) constructor). - */ - try { - client.JoinMulticastGroup (mcast_addr, - local_addr); - } catch (Exception) { - exThrown = true; - } finally { - client.Close (); - } - - Assert.IsFalse (exThrown, - "UdpClient JoinMulticastGroup #1"); - } - // Test for bug 324033 [Test] public void JoinMulticastGroupWithLocal () @@ -90,19 +924,12 @@ namespace MonoTests.System.Net.Sockets { UdpClient client = new UdpClient (9001); IPAddress mcast_addr = IPAddress.Parse ("224.0.0.24"); IPAddress local_addr = IPAddress.Any; - - bool exThrown = false; - + try { - client.JoinMulticastGroup (mcast_addr, - local_addr); - } catch (Exception) { - exThrown = true; + client.JoinMulticastGroup (mcast_addr, local_addr); } finally { client.Close (); } - - Assert.IsFalse (exThrown, "UdpClient JoinMulticastGroupWithLocal #1"); } [Test] @@ -110,9 +937,7 @@ namespace MonoTests.System.Net.Sockets { public void BeginSendNull () { UdpClient client = new UdpClient (); - client.BeginSend (null, 0, null, null); - client.Close (); } @@ -152,7 +977,7 @@ namespace MonoTests.System.Net.Sockets { "BeginSend #4"); } - IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry ("").AddressList[0], 1236); + IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry (string.Empty).AddressList[0], 1236); BSCalledBack.Reset (); @@ -163,8 +988,8 @@ namespace MonoTests.System.Net.Sockets { Assert.Fail ("BeginSend wait timed out"); } - Assertion.AssertEquals ("BeginSend #5", true, BSSent); - Assertion.AssertEquals ("BeginSend #6", 4, BSBytes); + Assert.AreEqual (true, BSSent, "BeginSend #5"); + Assert.AreEqual (4, BSBytes, "BeginSend #6"); client.Close (); } @@ -193,7 +1018,7 @@ namespace MonoTests.System.Net.Sockets { client.BeginReceive (BRCallback, client); - IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry ("").AddressList[0], 1237); + IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry (string.Empty).AddressList[0], 1237); byte[] send_bytes = new byte[] {10, 11, 12, 13}; client.Send (send_bytes, send_bytes.Length, ep); @@ -201,14 +1026,10 @@ namespace MonoTests.System.Net.Sockets { Assert.Fail ("BeginReceive wait timed out"); } - Assertion.AssertEquals ("BeginReceive #1", true, - BRReceived); - Assertion.AssertEquals ("BeginReceive #2", 4, - BRBytes.Length); - Assertion.AssertEquals ("BeginReceive #3", ep. Port, - BRFrom.Port); - Assertion.AssertEquals ("BeginReceive #4", ep.Address, - BRFrom.Address); + Assert.AreEqual (true, BRReceived, "BeginReceive #1"); + Assert.AreEqual (4, BRBytes.Length, "BeginReceive #2"); + Assert.AreEqual (ep. Port, BRFrom.Port, "BeginReceive #3"); + Assert.AreEqual (ep.Address, BRFrom.Address, "BeginReceive #4"); client.Close (); } @@ -217,14 +1038,13 @@ namespace MonoTests.System.Net.Sockets { public void Available () { UdpClient client = new UdpClient (1238); - IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry ("").AddressList[0], 1238); + IPEndPoint ep = new IPEndPoint (Dns.GetHostEntry (string.Empty).AddressList[0], 1238); byte[] bytes = new byte[] {10, 11, 12, 13}; client.Send (bytes, bytes.Length, ep); int avail = client.Available; - Assertion.AssertEquals ("Available #1", bytes.Length, - avail); + Assert.AreEqual (bytes.Length, avail, "Available #1"); client.Close (); } @@ -238,8 +1058,7 @@ namespace MonoTests.System.Net.Sockets { /* Ignore the docs, testing shows the default * here is in fact false */ - Assertion.AssertEquals ("DontFragmentDefault", false, - client.DontFragment); + Assert.AreEqual (false, client.DontFragment, "DontFragmentDefault"); client.Close (); } @@ -249,8 +1068,7 @@ namespace MonoTests.System.Net.Sockets { { UdpClient client = new UdpClient (); - Assertion.AssertEquals ("EnableBroadcastDefault", - false, client.EnableBroadcast); + Assert.AreEqual (false, client.EnableBroadcast, "EnableBroadcastDefault"); client.Close (); } @@ -267,9 +1085,7 @@ namespace MonoTests.System.Net.Sockets { client.ExclusiveAddressUse = true; - Assertion.AssertEquals ("ExclusiveAddressUseUnbound", - true, - client.ExclusiveAddressUse); + Assert.AreEqual (true, client.ExclusiveAddressUse, "ExclusiveAddressUseUnbound"); client.Close (); } @@ -291,14 +1107,57 @@ namespace MonoTests.System.Net.Sockets { { UdpClient client = new UdpClient (); - Assertion.AssertEquals ("MulticastLoopbackDefault", - true, - client.MulticastLoopback); + Assert.AreEqual (true, client.MulticastLoopback, "MulticastLoopbackDefault"); client.Close (); } /* No test for Ttl default as it is platform dependent */ #endif + + class MyUdpClient : UdpClient + { + public MyUdpClient () + { + } + + public MyUdpClient (AddressFamily family) + : base (family) + { + } + + public MyUdpClient (Int32 port) + : base (port) + { + } + + + public MyUdpClient (IPEndPoint localEP) + : base (localEP) + { + } + + public MyUdpClient (int port, AddressFamily family) + : base (port, family) + { + } + + public MyUdpClient (string hostname, int port) + : base (hostname, port) + { + } + + public new bool Active { + get { return base.Active; } + set { base.Active = value; } + } + +#if ONLY_1_1 + public new Socket Client { + get { return base.Client; } + set { base.Client = value; } + } +#endif + } } } diff --git a/mcs/class/System/Test/System.Net/ChangeLog b/mcs/class/System/Test/System.Net/ChangeLog index 4aa2eff6905..2015be81b1b 100644 --- a/mcs/class/System/Test/System.Net/ChangeLog +++ b/mcs/class/System/Test/System.Net/ChangeLog @@ -1,3 +1,75 @@ +2009-07-09 Gonzalo Paniagua Javier + + * HttpWebRequestTest.cs: use different ports for different tests since + the shutdown might take a little bit and tests might conflict. + +2009-07-07 Gonzalo Paniagua Javier + + * WebClientTest.cs: if we write the 100 response, reset the output + stream writer. + +2009-07-06 Gert Driesen + + * HttpWebRequestTest.cs: Enabled tests, and removed test that is now + covered by two separate CanTimeout tests for request and response + stream. + * HttpWebResponseStreamTest.cs: Enabled tests. + +2009-07-06 Gert Driesen + + * HttpWebRequestTest.cs: Marked test notworking on 1.0 profile. + +2009-07-06 Gert Driesen + + * HttpWebRequestTest.cs: Added tests for bug #511851. Added tests + for request stream. Fixed compiler warnings, and fixed code style. + * HttpWebResponseTest.cs: Added tests for response stream. Fixed + compiler warnings. + +2009-07-06 Gonzalo Paniagua Javier + + * HttpWebRequestTest.cs: add tests for POST + redirect and 401. + +2009-06-28 Gonzalo Paniagua Javier + + * HttpWebRequestTest.cs: sleep between reads as we do in + WebClientTest. + +2009-06-27 Gonzalo Paniagua Javier + + * SocketResponder.cs: the listener might be closed right before + Accept() is called and in that case we get an EINVAL. + * WebClientTest.cs: now that we might send separate packets for + headers and body, wait a little bit before checking socket.Available. + +2009-06-26 Gonzalo Paniagua Javier + + * HttpWebRequestTest.cs: add a bunch of tests provided by + Bassan Tabbara. + +2009-06-26 Robert Jordan + + * *.cs: Upgrade to new NUnit style. + +2009-06-20 Gert Driesen + + * HttpWebRequestTest.cs: Improved and enabled test for bug #510642. + +2009-06-20 Gert Driesen + + * SocketResponder.cs: Made a little more robust. + +2009-06-20 Gert Driesen + + * HttpListener2Test.cs: Added test for bug #513849. + * HttpWebRequestTest.cs: Enabled test for bug #508027. Added test for + bug #513087. + * WebClientTest.cs: Added test for bug #484795, for Encoding property. + +2009-06-16 Andrés G. Aragoneses + + * WebRequestTest.cs: Drop NotWorking attrib, more accurate tests. + 2009-06-09 Andrés G. Aragoneses * WebRequestTest.cs: Added tests for bug #323452. diff --git a/mcs/class/System/Test/System.Net/CookieCollectionTest.cs b/mcs/class/System/Test/System.Net/CookieCollectionTest.cs index d94c2164115..87d2325bb17 100644 --- a/mcs/class/System/Test/System.Net/CookieCollectionTest.cs +++ b/mcs/class/System/Test/System.Net/CookieCollectionTest.cs @@ -33,7 +33,7 @@ public class CookieCollectionTest [Test] public void Count () { - Assertion.AssertEquals ("#1", col.Count, 3); + Assert.AreEqual (col.Count, 3, "#1"); } [Test] @@ -42,18 +42,18 @@ public class CookieCollectionTest Cookie c = null; try { c = col [-1]; - Assertion.Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException) { } try { c = col [col.Count]; - Assertion.Fail ("#2"); + Assert.Fail ("#2"); } catch (ArgumentOutOfRangeException) { } c = col ["name1"]; - Assertion.AssertEquals ("#3", c.Name, "name1"); + Assert.AreEqual (c.Name, "name1", "#3"); c = col ["NAME2"]; - Assertion.AssertEquals ("#4", c.Name, "name2"); + Assert.AreEqual (c.Name, "name2", "#4"); } [Test] @@ -62,7 +62,7 @@ public class CookieCollectionTest try { Cookie c = null; col.Add (c); - Assertion.Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException) { } @@ -70,13 +70,13 @@ public class CookieCollectionTest // so we'll have to fail to. try { col.Add (col); - Assertion.Fail ("#2"); + Assert.Fail ("#2"); } catch (Exception) { } - Assertion.AssertEquals ("#3", col.Count, 3); + Assert.AreEqual (col.Count, 3, "#3"); col.Add (new Cookie("name1", "value1")); - Assertion.AssertEquals ("#4", col.Count, 3); + Assert.AreEqual (col.Count, 3, "#4"); CookieCollection col2 = new CookieCollection(); Cookie c4 = new Cookie("name4", "value4"); @@ -84,9 +84,9 @@ public class CookieCollectionTest col2.Add (c4); col2.Add (c5); col.Add (col2); - Assertion.AssertEquals ("#5", col.Count, 5); - Assertion.AssertEquals ("#6", col ["NAME4"], c4); - Assertion.AssertEquals ("#7", col [4], c5); + Assert.AreEqual (col.Count, 5, "#5"); + Assert.AreEqual (col ["NAME4"], c4, "#6"); + Assert.AreEqual (col [4], c5, "#7"); } [Test] @@ -94,9 +94,9 @@ public class CookieCollectionTest { Array a = Array.CreateInstance (typeof (Cookie), 3); col.CopyTo (a, 0); - Assertion.AssertEquals ("#1", a.GetValue (0), col [0]); - Assertion.AssertEquals ("#2", a.GetValue (1), col [1]); - Assertion.AssertEquals ("#3", a.GetValue (2), col [2]); + Assert.AreEqual (a.GetValue (0), col [0], "#1"); + Assert.AreEqual (a.GetValue (1), col [1], "#2"); + Assert.AreEqual (a.GetValue (2), col [2], "#3"); } [Test] @@ -105,11 +105,11 @@ public class CookieCollectionTest IEnumerator enumerator = col.GetEnumerator (); enumerator.MoveNext (); Cookie c = (Cookie) enumerator.Current; - Assertion.AssertEquals ("#1", c, col [0]); + Assert.AreEqual (c, col [0], "#1"); col.Add (new Cookie ("name6", "value6")); try { enumerator.MoveNext (); - Assertion.Fail ("#2"); + Assert.Fail ("#2"); } catch (InvalidOperationException) { } } diff --git a/mcs/class/System/Test/System.Net/CookieTest.cs b/mcs/class/System/Test/System.Net/CookieTest.cs index 1bd5c64848c..b84dedb2aab 100644 --- a/mcs/class/System/Test/System.Net/CookieTest.cs +++ b/mcs/class/System/Test/System.Net/CookieTest.cs @@ -57,7 +57,7 @@ namespace MonoTests.System.Net try { c = new Cookie (null, null, null, null); - Assertion.Fail ("#1: Name cannot be null"); + Assert.Fail ("#1: Name cannot be null"); } catch (CookieException) { @@ -68,44 +68,44 @@ namespace MonoTests.System.Net public void Name () { Cookie c = new Cookie ("SomeName", "SomeValue"); - Assertion.AssertEquals ("#1", c.Name, "SomeName"); + Assert.AreEqual (c.Name, "SomeName", "#1"); try { c.Name = null; - Assertion.Fail ("#2a"); + Assert.Fail ("#2a"); } catch (CookieException) { - Assertion.AssertEquals ("#2b", "SomeName", c.Name); + Assert.AreEqual ("SomeName", c.Name, "#2b"); } try { c.Name = ""; - Assertion.Fail ("#2c"); + Assert.Fail ("#2c"); } catch (CookieException) { - Assertion.AssertEquals ("#2d", "SomeName", c.Name); + Assert.AreEqual ("SomeName", c.Name, "#2d"); } try { c.Name = " "; - Assertion.Fail ("#2e"); + Assert.Fail ("#2e"); } catch (CookieException) { // bah! this fails, yet the name is changed.. // inconsistent with previous test - Assertion.AssertEquals ("#2f", String.Empty, c.Name); + Assert.AreEqual (String.Empty, c.Name, "#2f"); } try { c.Name = "xxx\r\n"; - Assertion.Fail ("#2g"); + Assert.Fail ("#2g"); } catch (CookieException) { - Assertion.AssertEquals ("#2h", String.Empty, c.Name); + Assert.AreEqual (String.Empty, c.Name, "#2h"); } try { @@ -113,30 +113,30 @@ namespace MonoTests.System.Net } catch (CookieException) { - Assertion.Fail ("#2i"); + Assert.Fail ("#2i"); } try { c.Name = "$omeName"; - Assertion.Fail ("#3a: Name cannot start with '$' character"); + Assert.Fail ("#3a: Name cannot start with '$' character"); } catch (CookieException) { - Assertion.AssertEquals ("#3b", String.Empty, c.Name); + Assert.AreEqual (String.Empty, c.Name, "#3b"); } c.Name = "SomeName$"; - Assertion.AssertEquals ("#4", c.Name, "SomeName$"); + Assert.AreEqual (c.Name, "SomeName$", "#4"); try { c.Name = "Some=Name"; - Assertion.Fail ("#5a: Name cannot contain '=' character"); + Assert.Fail ("#5a: Name cannot contain '=' character"); } catch (CookieException) { - Assertion.AssertEquals ("#5b", String.Empty, c.Name); + Assert.AreEqual (String.Empty, c.Name, "#5b"); } c.Name = "domain"; - Assertion.AssertEquals ("#6", c.Name, "domain"); + Assert.AreEqual (c.Name, "domain", "#6"); } [Test] @@ -162,16 +162,16 @@ namespace MonoTests.System.Net Cookie c = new Cookie("SomeName", "SomeValue"); try { c.Value = "Some;Value"; - Assertion.Fail ("#1: semicolon should not be accepted"); + Assert.Fail ("#1: semicolon should not be accepted"); } catch (CookieException) { } try { c.Value = "Some,Value"; - Assertion.Fail ("#2: comma should not be accepted"); + Assert.Fail ("#2: comma should not be accepted"); } catch (CookieException) { } c.Value = "Some\tValue"; - Assertion.AssertEquals ("#3", c.Value, "Some\tValue"); + Assert.AreEqual (c.Value, "Some\tValue", "#3"); */ } @@ -182,7 +182,7 @@ namespace MonoTests.System.Net try { c.Port = "123"; - Assertion.Fail ("#1: port must start and end with double quotes"); + Assert.Fail ("#1: port must start and end with double quotes"); } catch (CookieException) { @@ -195,12 +195,12 @@ namespace MonoTests.System.Net } catch (CookieException) { - Assertion.Fail ("#2"); + Assert.Fail ("#2"); } try { c.Port = "\"123;124\""; - Assertion.Fail ("#3"); + Assert.Fail ("#3"); } catch (CookieException) { @@ -211,7 +211,7 @@ namespace MonoTests.System.Net } catch (CookieException) { - Assertion.Fail ("#4"); + Assert.Fail ("#4"); } try { @@ -219,7 +219,7 @@ namespace MonoTests.System.Net } catch (CookieException) { - Assertion.Fail ("#5"); + Assert.Fail ("#5"); } } @@ -228,12 +228,12 @@ namespace MonoTests.System.Net { Cookie c1 = new Cookie ("NAME", "VALUE", "PATH", "DOMAIN"); Cookie c2 = new Cookie ("name", "value", "path", "domain"); - Assertion.Assert ("#1", !c1.Equals (c2)); + Assert.IsTrue (!c1.Equals (c2), "#1"); c2.Value = "VALUE"; c2.Path = "PATH"; - Assertion.Assert ("#2", c1.Equals (c2)); + Assert.IsTrue (c1.Equals (c2), "#2"); c2.Version = 1; - Assertion.Assert ("#3", !c1.Equals (c2)); + Assert.IsTrue (!c1.Equals (c2), "#3"); } [Test] diff --git a/mcs/class/System/Test/System.Net/CredentialCacheTest.cs b/mcs/class/System/Test/System.Net/CredentialCacheTest.cs index c04e4429360..a1d5f79c11a 100644 --- a/mcs/class/System/Test/System.Net/CredentialCacheTest.cs +++ b/mcs/class/System/Test/System.Net/CredentialCacheTest.cs @@ -42,56 +42,56 @@ public class CredentialCacheTest try { c.Add (new Uri("http://www.ximian.com"), "Basic", cred1); - Assertion.Fail ("#1: should have failed"); + Assert.Fail ("#1: should have failed"); } catch (ArgumentException) { } c.Add (new Uri("http://www.contoso.com/"), "**Unknown**", cred1); result = c.GetCredential (new Uri("http://www.contoso.com/"), "**Unknown**"); - Assertion.AssertEquals ("#3", result, cred1); + Assert.AreEqual (result, cred1, "#3"); c.Remove (new Uri("http://www.contoso.com/"), "**Unknown**"); result = c.GetCredential (new Uri("http://www.contoso.com/"), "**Unknown**"); - Assertion.Assert ("#4", result == null); + Assert.IsTrue (result == null, "#4"); c.Add (new Uri("http://www.contoso.com/"), "**Unknown**", cred1); result = c.GetCredential (new Uri("http://www.contoso.com"), "**Unknown**"); - Assertion.AssertEquals ("#5", result, cred1); + Assert.AreEqual (result, cred1, "#5"); c.Remove (new Uri("http://www.contoso.com"), "**Unknown**"); result = c.GetCredential (new Uri("http://www.contoso.com"), "**Unknown**"); - Assertion.Assert ("#6", result == null); + Assert.IsTrue (result == null, "#6"); c.Add (new Uri("http://www.contoso.com/portal/"), "**Unknown**", cred1); result = c.GetCredential (new Uri("http://www.contoso.com/portal/foo/bar.html"), "**Unknown**"); - Assertion.AssertEquals ("#7", result, cred1); + Assert.AreEqual (result, cred1, "#7"); c.Remove (new Uri("http://www.contoso.com"), "**Unknown**"); result = c.GetCredential (new Uri("http://www.contoso.com"), "**Unknown**"); - Assertion.Assert ("#8", result == null); + Assert.IsTrue (result == null, "#8"); result = c.GetCredential (new Uri("http://www.contoso.com:80/portal/news/index.aspx"), "Basic"); - Assertion.AssertEquals ("#9", result, cred3); + Assert.AreEqual (result, cred3, "#9"); result = c.GetCredential (new Uri("http://www.contoso.com:80/portal/news/index"), "Basic"); - Assertion.AssertEquals ("#10", result, cred3); + Assert.AreEqual (result, cred3, "#10"); result = c.GetCredential (new Uri("http://www.contoso.com:80/portal/news/"), "Basic"); - Assertion.AssertEquals ("#11", result, cred3); + Assert.AreEqual (result, cred3, "#11"); result = c.GetCredential (new Uri("http://www.contoso.com:80/portal/news"), "Basic"); - Assertion.AssertEquals ("#12", result, cred4); + Assert.AreEqual (result, cred4, "#12"); result = c.GetCredential (new Uri("http://www.contoso.com:80/portal/ne"), "Basic"); - Assertion.AssertEquals ("#13", result, cred4); + Assert.AreEqual (result, cred4, "#13"); result = c.GetCredential (new Uri("http://www.contoso.com:80/portal/"), "Basic"); - Assertion.AssertEquals ("#14", result, cred4); + Assert.AreEqual (result, cred4, "#14"); result = c.GetCredential (new Uri("http://www.contoso.com:80/portal"), "Basic"); - Assertion.AssertEquals ("#15", result, cred5); + Assert.AreEqual (result, cred5, "#15"); result = c.GetCredential (new Uri("http://www.contoso.com:80/"), "Basic"); - Assertion.AssertEquals ("#16", result, cred5); + Assert.AreEqual (result, cred5, "#16"); result = c.GetCredential (new Uri("http://www.contoso.com"), "Basic"); - Assertion.AssertEquals ("#17", result, cred5); + Assert.AreEqual (result, cred5, "#17"); /* IEnumerator e = c.GetEnumerator (); @@ -101,22 +101,22 @@ public class CredentialCacheTest */ #if NET_2_0 result = c.GetCredential ("www.ximian.com", 80, "Basic"); - Assertion.Assert ("#18", result == null); + Assert.IsTrue (result == null, "#18"); c.Add ("www.ximian.com", 80, "Basic", cred1); try { c.Add ("www.ximian.com", 80, "Basic", cred1); - Assertion.Fail ("#19: should have failed"); + Assert.Fail ("#19: should have failed"); } catch (ArgumentException) { } result = c.GetCredential ("www.ximian.com", 80, "Basic"); - Assertion.AssertEquals ("#20", result, cred1); + Assert.AreEqual (result, cred1, "#20"); c.Remove (new Uri("http://www.contoso.com"), "Basic"); c.Add ("www.contoso.com", 80, "Basic", cred5); result = c.GetCredential (new Uri("http://www.contoso.com"), "Basic"); - Assertion.Assert ("#21", result == null); + Assert.IsTrue (result == null, "#21"); #endif } } diff --git a/mcs/class/System/Test/System.Net/HttpListener2Test.cs b/mcs/class/System/Test/System.Net/HttpListener2Test.cs index fcd36d91bd6..f79f1593259 100644 --- a/mcs/class/System/Test/System.Net/HttpListener2Test.cs +++ b/mcs/class/System/Test/System.Net/HttpListener2Test.cs @@ -723,7 +723,19 @@ namespace MonoTests.System.Net { listener.Close (); } - + + [Test] // bug #513849 + public void ClosePort () + { + var h = new HttpListener (); + h.Prefixes.Add ("http://127.0.0.1:8080/"); + h.Start (); + h.BeginGetContext (null, null); + h.Stop (); + TcpListener t = new TcpListener (IPAddress.Parse ("127.0.0.1"), 8080); + t.Start (); + t.Stop (); + } } } #endif diff --git a/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs b/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs index cffc59b0e1e..31ed72b93b5 100644 --- a/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs +++ b/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs @@ -32,6 +32,18 @@ namespace MonoTests.System.Net [TestFixture] public class HttpWebRequestTest { +#if NET_2_0 + private Random rand = new Random (); + private byte [] data64KB = new byte [64 * 1024]; + + [TestFixtureSetUp] + public void Setup () + { + ServicePointManager.Expect100Continue = false; + rand.NextBytes (data64KB); + } +#endif + [Test] #if TARGET_JVM [Ignore ("Ignore failures in Sys.Net")] @@ -65,7 +77,7 @@ namespace MonoTests.System.Net public void Sync () { HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://www.google.com"); - Assertion.AssertNotNull ("req:If Modified Since: ", req.IfModifiedSince); + Assert.IsNotNull (req.IfModifiedSince, "req:If Modified Since: "); req.UserAgent = "MonoClient v1.0"; Assert.AreEqual ("User-Agent", req.Headers.GetKey (0), "#A1"); @@ -90,18 +102,18 @@ namespace MonoTests.System.Net req.AddRange (50, 90); req.AddRange ("bytes", 100); req.AddRange ("bytes", 100, 120); - Assertion.AssertEquals ("#1", "bytes=10-,50-90,100-,100-120", req.Headers ["Range"]); + Assert.AreEqual ("bytes=10-,50-90,100-,100-120", req.Headers ["Range"], "#1"); try { req.AddRange ("bits", 2000); - Assertion.Fail ("#2"); + Assert.Fail ("#2"); } catch (InvalidOperationException) {} } [Test] // bug #471782 public void CloseRequestStreamAfterReadingResponse () { - IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9152); + string url = "http://" + ep.ToString () + "/test/"; using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { responder.Start (); @@ -141,19 +153,20 @@ namespace MonoTests.System.Net req.KeepAlive = false; req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv; 1.7.6) Gecko/20050317 Firefox/1.0.2"; req.CookieContainer = cookies; - Assertion.AssertEquals ("#01", 0, cookies.Count); + Assert.AreEqual (0, cookies.Count, "#01"); using (HttpWebResponse res = (HttpWebResponse) req.GetResponse()) { CookieCollection coll = req.CookieContainer.GetCookies (new Uri (url)); - Assertion.AssertEquals ("#02", 1, coll.Count); - Assertion.AssertEquals ("#03", 1, res.Cookies.Count); + Assert.AreEqual (1, coll.Count, "#02"); + Assert.AreEqual (1, res.Cookies.Count, "#03"); Cookie one = coll [0]; Cookie two = res.Cookies [0]; - Assertion.AssertEquals ("#04", true, object.ReferenceEquals (one, two)); + Assert.AreEqual (true, object.ReferenceEquals (one, two), "#04"); } } #if !TARGET_JVM //NotWorking [Test] + [Ignore ("Fails on MS.NET")] public void SslClientBlock () { // This tests that the write request/initread/write body sequence does not hang @@ -172,9 +185,9 @@ namespace MonoTests.System.Net stream.Write (bytes, 0, bytes.Length); stream.Close (); HttpWebResponse resp = (HttpWebResponse) request.GetResponse (); - Assertion.AssertEquals ("StatusCode", 200, (int) resp.StatusCode); + Assert.AreEqual (200, (int) resp.StatusCode, "StatusCode"); StreamReader sr = new StreamReader (resp.GetResponseStream (), Encoding.UTF8); - string x = sr.ReadToEnd (); + sr.ReadToEnd (); sr.Close (); resp.Close (); server.Stop (); @@ -229,7 +242,7 @@ namespace MonoTests.System.Net // Using StreamReader+UTF8Encoding here fails on MS runtime Stream stream = resp.GetResponseStream (); int nread = stream.Read (bytes, 0, 32); - Assertion.AssertEquals ("#01", 16, nread); + Assert.AreEqual (16, nread, "#01"); x = Encoding.ASCII.GetString (bytes, 0, 16); } finally { resp.Close (); @@ -239,7 +252,7 @@ namespace MonoTests.System.Net if (server.Error != null) throw server.Error; - Assertion.AssertEquals ("1234567890123456", x); + Assert.AreEqual ("1234567890123456", x); } [Test] @@ -258,12 +271,11 @@ namespace MonoTests.System.Net methods.Add ("whatever", "whatever"); methods.Add ("PUT", "PUT"); - IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9153); + string url = "http://" + ep.ToString () + "/test/"; foreach (DictionaryEntry de in methods) { - SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), - new SocketRequestHandler (EchoRequestHandler)); + SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler)); responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -289,8 +301,8 @@ namespace MonoTests.System.Net [Test] public void BeginGetRequestStream_Body_NotAllowed () { - IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9154); + string url = "http://" + ep.ToString () + "/test/"; using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { responder.Start (); @@ -328,8 +340,8 @@ namespace MonoTests.System.Net [Test] // bug #465613 public void BeginGetRequestStream_NoBuffering () { - IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8002); - string url = "http://" + IPAddress.Loopback.ToString () + ":8002/test/"; + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 11001); + string url = "http://" + ep.ToString () + "/test/"; using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { responder.Start (); @@ -381,11 +393,10 @@ namespace MonoTests.System.Net } [Test] // bug #508027 - [Category ("NotWorking")] public void BeginGetResponse () { - IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8003); - string url = "http://" + IPAddress.Loopback.ToString () + ":8003/test/"; + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8001); + string url = "http://" + ep.ToString () + "/test/"; using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { responder.Start (); @@ -520,11 +531,200 @@ namespace MonoTests.System.Net } } + [Test] // bug #511851 +#if ONLY_1_1 + [Category ("NotWorking")] +#endif + public void BeginGetRequestStream_Request_Aborted () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8002); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + req.Abort (); + +#if NET_2_0 + try { + req.BeginGetRequestStream (null, null); + Assert.Fail ("#1"); + } catch (WebException ex) { + // The request was aborted: The request was canceled + Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.Response, "#5"); + Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6"); + } +#else + IAsyncResult ar = req.BeginGetRequestStream (null, null); + try { + req.EndGetRequestStream (ar); + Assert.Fail ("#1"); + } catch (WebException ex) { + // The underlying connection was closed: the request was canceled + Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.Response, "#5"); + Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6"); + } +#endif + } + } + + [Test] // bug #511851 + public void BeginGetResponse_Request_Aborted () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9155); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + req.Abort (); + + try { + req.BeginGetResponse (null, null); + Assert.Fail ("#1"); + } catch (WebException ex) { + // The request was aborted: The request was canceled + Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.Response, "#5"); + Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6"); + } + } + } + + [Test] + public void EndGetRequestStream_AsyncResult_Null () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9156); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + req.BeginGetRequestStream (null, null); + + try { + req.EndGetRequestStream (null); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("asyncResult", ex.ParamName, "#5"); + } finally { + req.Abort (); + } + } + } + + [Test] + [Category ("NotWorking")] // do not get consistent result on MS + public void EndGetRequestStream_Request_Aborted () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8003); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + IAsyncResult ar = req.BeginGetRequestStream (null, null); + req.Abort (); + Thread.Sleep (500); + + try { + req.EndGetRequestStream (ar); + Assert.Fail ("#1"); + } catch (WebException ex) { + // The request was aborted: The request was canceled + Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.Response, "#5"); + Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6"); + } + } + } + + [Test] // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=471522 + [Category ("NotWorking")] + public void EndGetResponse_AsyncResult_Invalid () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9157); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + IAsyncResult ar = req.BeginGetRequestStream (null, null); + + // AsyncResult was not returned from call to BeginGetResponse + try { + req.EndGetResponse (ar); + Assert.Fail (); + } catch (InvalidCastException) { + } finally { + req.Abort (); + } + } + } + + [Test] + public void EndGetResponse_AsyncResult_Null () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9158); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.Method = "POST"; + IAsyncResult ar = req.BeginGetResponse (null, null); + + try { + req.EndGetResponse (null); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("asyncResult", ex.ParamName, "#5"); + } finally { + req.Abort (); + /* + using (HttpWebResponse resp = (HttpWebResponse) req.EndGetResponse (ar)) { + resp.Close (); + }*/ + } + } + } + [Test] // bug #429200 public void GetRequestStream () { - IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 10000); + string url = "http://" + ep.ToString () + "/test/"; using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { responder.Start (); @@ -544,12 +744,38 @@ namespace MonoTests.System.Net } } + [Test] // bug #511851 + public void GetRequestStream_Request_Aborted () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 10001); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + req.Abort (); + + try { + req.GetRequestStream (); + Assert.Fail ("#1"); + } catch (WebException ex) { + // The request was aborted: The request was canceled + Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.Response, "#5"); + Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6"); + } + } + } + [Test] // bug #510661 - [Category ("NotWorking")] public void GetRequestStream_Close_NotAllBytesWritten () { - IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 10002); + string url = "http://" + ep.ToString () + "/test/"; using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { responder.Start (); @@ -613,115 +839,297 @@ namespace MonoTests.System.Net } [Test] // bug #510642 - [Category ("NotWorking")] public void GetRequestStream_Write_Overflow () { - IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8001); - string url = "http://" + IPAddress.Loopback.ToString () + ":8001/test/"; + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8010); + string url = "http://" + ep.ToString () + "/test/"; + // buffered, non-chunked using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { responder.Start (); - HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); - req.ProtocolVersion = HttpVersion.Version11; + HttpWebRequest req; + Stream rs; + byte [] buffer; + + req = (HttpWebRequest) WebRequest.Create (url); req.Method = "POST"; - req.Timeout = 200; - req.ReadWriteTimeout = 100; + req.Timeout = 1000; + req.ReadWriteTimeout = 2000; req.ContentLength = 2; - Stream rs = req.GetRequestStream (); + rs = req.GetRequestStream (); + rs.WriteByte (0x2c); - byte [] buffer = new byte [] { 0x2a, 0x2c, 0x1d }; + buffer = new byte [] { 0x2a, 0x1d }; try { - rs.Write (buffer, 0, 3); - Assert.Fail ("#1"); + rs.Write (buffer, 0, buffer.Length); + Assert.Fail ("#A1"); } catch (ProtocolViolationException ex) { // Bytes to be written to the stream exceed // Content-Length bytes size specified - Assert.IsNull (ex.InnerException, "#2"); - Assert.IsNotNull (ex.Message, "#3"); + Assert.IsNull (ex.InnerException, "#A2"); + Assert.IsNotNull (ex.Message, "#A3"); } finally { req.Abort (); } - } - } - [Test] - [Ignore ("This test asserts that our code violates RFC 2616")] - public void GetRequestStream_Body_NotAllowed () - { - string [] methods = new string [] { "GET", "HEAD", "CONNECT", - "get", "HeAd", "ConNect" }; + req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + req.Timeout = 1000; + req.ReadWriteTimeout = 2000; + req.ContentLength = 2; - foreach (string method in methods) { - HttpWebRequest req = (HttpWebRequest) WebRequest.Create ( - "http://localhost:8000"); - req.Method = method; + rs = req.GetRequestStream (); + + buffer = new byte [] { 0x2a, 0x2c, 0x1d }; try { - req.GetRequestStream (); - Assert.Fail ("#1:" + method); + rs.Write (buffer, 0, buffer.Length); + Assert.Fail ("#B1"); } catch (ProtocolViolationException ex) { - Assert.AreEqual (typeof (ProtocolViolationException), ex.GetType (), "#2:" + method); - Assert.IsNull (ex.InnerException, "#3:" + method); - Assert.IsNotNull (ex.Message, "#4:" + method); + // Bytes to be written to the stream exceed + // Content-Length bytes size specified + Assert.IsNull (ex.InnerException, "#B2"); + Assert.IsNotNull (ex.Message, "#B3"); + } finally { + req.Abort (); } } - } - - [Test] -#if TARGET_JVM - [Category("NotWorking")] -#endif - [Ignore ("This does not timeout any more. That's how MS works when reading small responses")] - public void ReadTimeout () - { - IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8764); - string url = "http://" + localEP.ToString () + "/original/"; - using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) { + // buffered, chunked + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { responder.Start (); - HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + HttpWebRequest req; + Stream rs; + byte [] buffer; + + /* + req = (HttpWebRequest) WebRequest.Create (url); req.Method = "POST"; - req.AllowAutoRedirect = false; - req.Timeout = 200; - req.ReadWriteTimeout = 100; - req.KeepAlive = false; - Stream rs = req.GetRequestStream (); - rs.Close (); - using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { - try { - Stream s = resp.GetResponseStream (); - s.ReadByte (); - Assert.Fail ("#1"); - } catch (WebException ex) { - Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); - Assert.IsNull (ex.InnerException, "#3"); - Assert.IsNull (ex.Response, "#4"); - Assert.AreEqual (WebExceptionStatus.Timeout, ex.Status, "#5"); - } - } - responder.Stop (); - } - } + req.SendChunked = true; + req.Timeout = 1000; + req.ReadWriteTimeout = 2000; + req.ContentLength = 2; - [Test] // bug #324300 -#if TARGET_JVM - [Category("NotWorking")] -#endif - public void AllowAutoRedirect () - { - IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8764); - string url = "http://" + localEP.ToString () + "/original/"; + rs = req.GetRequestStream (); + rs.WriteByte (0x2c); - // allow autoredirect - using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) { - responder.Start (); + buffer = new byte [] { 0x2a, 0x1d }; + rs.Write (buffer, 0, buffer.Length); + req.Abort (); + */ - HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req = (HttpWebRequest) WebRequest.Create (url); req.Method = "POST"; - req.Timeout = 2000; - req.ReadWriteTimeout = 2000; + req.SendChunked = true; + req.Timeout = 1000; + req.ReadWriteTimeout = 2000; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + + buffer = new byte [] { 0x2a, 0x2c, 0x1d }; + rs.Write (buffer, 0, buffer.Length); + req.Abort (); + } + + // non-buffered, non-chunked + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req; + Stream rs; + byte [] buffer; + + req = (HttpWebRequest) WebRequest.Create (url); + req.AllowWriteStreamBuffering = false; + req.Method = "POST"; + req.Timeout = 1000; + req.ReadWriteTimeout = 2000; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + rs.WriteByte (0x2c); + + buffer = new byte [] { 0x2a, 0x1d }; + try { + rs.Write (buffer, 0, buffer.Length); + Assert.Fail ("#C1"); + } catch (ProtocolViolationException ex) { + // Bytes to be written to the stream exceed + // Content-Length bytes size specified + Assert.IsNull (ex.InnerException, "#C2"); + Assert.IsNotNull (ex.Message, "#3"); + } finally { + req.Abort (); + } + + req = (HttpWebRequest) WebRequest.Create (url); + req.AllowWriteStreamBuffering = false; + req.Method = "POST"; + req.Timeout = 1000; + req.ReadWriteTimeout = 2000; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + + buffer = new byte [] { 0x2a, 0x2c, 0x1d }; + try { + rs.Write (buffer, 0, buffer.Length); + Assert.Fail ("#D1"); + } catch (ProtocolViolationException ex) { + // Bytes to be written to the stream exceed + // Content-Length bytes size specified + Assert.IsNull (ex.InnerException, "#D2"); + Assert.IsNotNull (ex.Message, "#D3"); + } finally { + req.Abort (); + } + } + + // non-buffered, chunked + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req; + Stream rs; + byte [] buffer; + + req = (HttpWebRequest) WebRequest.Create (url); + req.AllowWriteStreamBuffering = false; + req.Method = "POST"; + req.SendChunked = true; + req.Timeout = 1000; + req.ReadWriteTimeout = 2000; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + rs.WriteByte (0x2c); + + buffer = new byte [] { 0x2a, 0x1d }; + rs.Write (buffer, 0, buffer.Length); + req.Abort (); + + req = (HttpWebRequest) WebRequest.Create (url); + req.AllowWriteStreamBuffering = false; + req.Method = "POST"; + req.SendChunked = true; + req.Timeout = 1000; + req.ReadWriteTimeout = 2000; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + + buffer = new byte [] { 0x2a, 0x2c, 0x1d }; + rs.Write (buffer, 0, buffer.Length); + req.Abort (); + } + } + + [Test] + [Ignore ("This test asserts that our code violates RFC 2616")] + public void GetRequestStream_Body_NotAllowed () + { + string [] methods = new string [] { "GET", "HEAD", "CONNECT", + "get", "HeAd", "ConNect" }; + + foreach (string method in methods) { + HttpWebRequest req = (HttpWebRequest) WebRequest.Create ( + "http://localhost:8000"); + req.Method = method; + try { + req.GetRequestStream (); + Assert.Fail ("#1:" + method); + } catch (ProtocolViolationException ex) { + Assert.AreEqual (typeof (ProtocolViolationException), ex.GetType (), "#2:" + method); + Assert.IsNull (ex.InnerException, "#3:" + method); + Assert.IsNotNull (ex.Message, "#4:" + method); + } + } + } + + [Test] // bug #511851 + public void GetResponse_Request_Aborted () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 10100); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + req.Abort (); + + try { + req.GetResponse (); + Assert.Fail ("#1"); + } catch (WebException ex) { + // The request was aborted: The request was canceled + Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.Response, "#5"); + Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6"); + } + } + } + + [Test] +#if TARGET_JVM + [Category("NotWorking")] +#endif + [Ignore ("This does not timeout any more. That's how MS works when reading small responses")] + public void ReadTimeout () + { + IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8764); + string url = "http://" + localEP.ToString () + "/original/"; + + using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + req.AllowAutoRedirect = false; + req.Timeout = 200; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + Stream rs = req.GetRequestStream (); + rs.Close (); + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + try { + Stream s = resp.GetResponseStream (); + s.ReadByte (); + Assert.Fail ("#1"); + } catch (WebException ex) { + Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNull (ex.Response, "#4"); + Assert.AreEqual (WebExceptionStatus.Timeout, ex.Status, "#5"); + } + } + responder.Stop (); + } + } + + [Test] // bug #324300 +#if TARGET_JVM + [Category("NotWorking")] +#endif + public void AllowAutoRedirect () + { + IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8765); + string url = "http://" + localEP.ToString () + "/original/"; + + // allow autoredirect + using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; req.KeepAlive = false; Stream rs = req.GetRequestStream (); rs.Close (); @@ -760,89 +1168,182 @@ namespace MonoTests.System.Net } } - [Test] // bug #324347 - [Category ("NotWorking")] - public void InternalServerError () + [Test] + public void PostAndRedirect_NoCL () { - IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8764); + IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8769); string url = "http://" + localEP.ToString () + "/original/"; - // POST - using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (InternalErrorHandler))) { + using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); req.Method = "POST"; req.Timeout = 2000; req.ReadWriteTimeout = 2000; - req.KeepAlive = false; Stream rs = req.GetRequestStream (); + rs.WriteByte (10); rs.Close (); + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + StreamReader sr = new StreamReader (resp.GetResponseStream (), + Encoding.UTF8); + string body = sr.ReadToEnd (); - try { - req.GetResponse (); - Assert.Fail ("#A1"); - } catch (WebException ex) { - Assert.AreEqual (typeof (WebException), ex.GetType (), "#A2"); - Assert.IsNull (ex.InnerException, "#A3"); - Assert.IsNotNull (ex.Message, "#A4"); - Assert.AreEqual (WebExceptionStatus.ProtocolError, ex.Status, "#A5"); - - HttpWebResponse webResponse = ex.Response as HttpWebResponse; - Assert.IsNotNull (webResponse, "#A6"); - Assert.AreEqual ("POST", webResponse.Method, "#A7"); - webResponse.Close (); + Assert.AreEqual (resp.StatusCode, HttpStatusCode.OK, "#A1"); + Assert.AreEqual (resp.ResponseUri.ToString (), "http://" + + localEP.ToString () + "/moved/", "#A2"); + Assert.AreEqual ("GET", resp.Method, "#A3"); + Assert.AreEqual ("LOOKS OK", body, "#A4"); } - responder.Stop (); } + } - // GET - using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (InternalErrorHandler))) { + [Test] + public void PostAndRedirect_CL () + { + IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8770); + string url = "http://" + localEP.ToString () + "/original/"; + + using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); - req.Method = "GET"; + req.Method = "POST"; req.Timeout = 2000; req.ReadWriteTimeout = 2000; - req.KeepAlive = false; - - try { - req.GetResponse (); - Assert.Fail ("#B1"); - } catch (WebException ex) { - Assert.AreEqual (typeof (WebException), ex.GetType (), "#B2"); - Assert.IsNull (ex.InnerException, "#B3"); - Assert.AreEqual (WebExceptionStatus.ProtocolError, ex.Status, "#B4"); + req.ContentLength = 1; + Stream rs = req.GetRequestStream (); + rs.WriteByte (10); + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + StreamReader sr = new StreamReader (resp.GetResponseStream (), + Encoding.UTF8); + string body = sr.ReadToEnd (); - HttpWebResponse webResponse = ex.Response as HttpWebResponse; - Assert.IsNotNull (webResponse, "#B5"); - Assert.AreEqual ("GET", webResponse.Method, "#B6"); - webResponse.Close (); + Assert.AreEqual (resp.StatusCode, HttpStatusCode.OK, "#A1"); + Assert.AreEqual (resp.ResponseUri.ToString (), "http://" + + localEP.ToString () + "/moved/", "#A2"); + Assert.AreEqual ("GET", resp.Method, "#A3"); + Assert.AreEqual ("LOOKS OK", body, "#A4"); } - responder.Stop (); } } [Test] - [Category ("NotWorking")] // #B3 fails; we get a SocketException: An existing connection was forcibly closed by the remote host - public void NoContentLength () + public void PostAnd401 () { - IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8764); + IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8771); string url = "http://" + localEP.ToString () + "/original/"; - // POST - using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (NoContentLengthHandler))) { + using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); req.Method = "POST"; req.Timeout = 2000; req.ReadWriteTimeout = 2000; - req.KeepAlive = false; + req.ContentLength = 1; Stream rs = req.GetRequestStream (); - rs.Close (); + rs.WriteByte (10); + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + StreamReader sr = new StreamReader (resp.GetResponseStream (), + Encoding.UTF8); + string body = sr.ReadToEnd (); + + Assert.AreEqual (resp.StatusCode, HttpStatusCode.OK, "#A1"); + Assert.AreEqual (resp.ResponseUri.ToString (), "http://" + + localEP.ToString () + "/moved/", "#A2"); + Assert.AreEqual ("GET", resp.Method, "#A3"); + Assert.AreEqual ("LOOKS OK", body, "#A4"); + } + responder.Stop (); + } + } + + [Test] // bug #324347 + [Category ("NotWorking")] + public void InternalServerError () + { + IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8766); + string url = "http://" + localEP.ToString () + "/original/"; + + // POST + using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (InternalErrorHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + Stream rs = req.GetRequestStream (); + rs.Close (); + + try { + req.GetResponse (); + Assert.Fail ("#A1"); + } catch (WebException ex) { + Assert.AreEqual (typeof (WebException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual (WebExceptionStatus.ProtocolError, ex.Status, "#A5"); + + HttpWebResponse webResponse = ex.Response as HttpWebResponse; + Assert.IsNotNull (webResponse, "#A6"); + Assert.AreEqual ("POST", webResponse.Method, "#A7"); + webResponse.Close (); + } + + responder.Stop (); + } + + // GET + using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (InternalErrorHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + try { + req.GetResponse (); + Assert.Fail ("#B1"); + } catch (WebException ex) { + Assert.AreEqual (typeof (WebException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.AreEqual (WebExceptionStatus.ProtocolError, ex.Status, "#B4"); + + HttpWebResponse webResponse = ex.Response as HttpWebResponse; + Assert.IsNotNull (webResponse, "#B5"); + Assert.AreEqual ("GET", webResponse.Method, "#B6"); + webResponse.Close (); + } + + responder.Stop (); + } + } + + [Test] + [Category ("NotWorking")] // #B3 fails; we get a SocketException: An existing connection was forcibly closed by the remote host + public void NoContentLength () + { + IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8767); + string url = "http://" + localEP.ToString () + "/original/"; + + // POST + using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (NoContentLengthHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + Stream rs = req.GetRequestStream (); + rs.Close (); try { req.GetResponse (); @@ -922,12 +1423,46 @@ namespace MonoTests.System.Net } } + [Test] // bug #513087 + public void NonStandardVerb () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8123); + string url = "http://" + ep.ToString () + "/moved/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (VerbEchoHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "WhatEver"; + req.KeepAlive = false; + req.Timeout = 20000; + req.ReadWriteTimeout = 20000; + + Stream rs = req.GetRequestStream (); + rs.Close (); + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + StreamReader sr = new StreamReader (resp.GetResponseStream (), + Encoding.UTF8); + string body = sr.ReadToEnd (); + + Assert.AreEqual (resp.StatusCode, HttpStatusCode.OK, "#1"); + Assert.AreEqual (resp.ResponseUri.ToString (), "http://" + + ep.ToString () + "/moved/", "#2"); + Assert.AreEqual ("WhatEver", resp.Method, "#3"); + Assert.AreEqual ("WhatEver", body, "#4"); + } + + responder.Stop (); + } + } + [Test] [Category ("NotWorking")] // Assert #2 fails - public void NotModiedSince () + public void NotModifiedSince () { - IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9123); + string url = "http://" + ep.ToString () + "/test/"; using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (NotModifiedSinceHandler))) { responder.Start (); @@ -968,38 +1503,6 @@ namespace MonoTests.System.Net } } -#if NET_2_0 - [Test] // bug #324182 -#if TARGET_JVM - [Category ("NotWorking")] -#endif - public void Stream_CanTimeout () - { - IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8764); - string url = "http://" + localEP.ToString () + "/original/"; - - // allow autoredirect - using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) { - responder.Start (); - - HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); - req.Method = "POST"; - req.Timeout = 2000; - req.ReadWriteTimeout = 2000; - req.KeepAlive = false; - Stream rs = req.GetRequestStream (); - Assert.IsTrue (rs.CanTimeout, "#1"); - rs.Close (); - using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { - Stream os = resp.GetResponseStream (); - Assert.IsTrue (os.CanTimeout, "#2"); - os.Close (); - } - responder.Stop (); - } - } -#endif - [Test] // bug #353495 [Category ("NotWorking")] public void LastModifiedKind () @@ -1008,7 +1511,7 @@ namespace MonoTests.System.Net HttpWebRequest req = (HttpWebRequest) WebRequest.Create (reqURL); HttpWebResponse resp = (HttpWebResponse) req.GetResponse (); DateTime lastMod = resp.LastModified; - string rawLastMod = resp.Headers ["Last-Modified"]; + //string rawLastMod = resp.Headers ["Last-Modified"]; resp.Close (); //Assert.AreEqual ("Tue, 15 Jan 2008 08:59:59 GMT", rawLastMod, "#1"); #if NET_2_0 @@ -1026,13 +1529,16 @@ namespace MonoTests.System.Net } } - static byte [] EchoRequestHandler (Socket socket) + internal static byte [] EchoRequestHandler (Socket socket) { MemoryStream ms = new MemoryStream (); byte [] buffer = new byte [4096]; int bytesReceived = socket.Receive (buffer); while (bytesReceived > 0) { ms.Write (buffer, 0, bytesReceived); + // We don't check for Content-Length or anything else here, so we give the client a little time to write + // after sending the headers + Thread.Sleep (200); if (socket.Available > 0) { bytesReceived = socket.Receive (buffer); } else { @@ -1062,6 +1568,9 @@ namespace MonoTests.System.Net int bytesReceived = socket.Receive (buffer); while (bytesReceived > 0) { ms.Write (buffer, 0, bytesReceived); + // We don't check for Content-Length or anything else here, so we give the client a little time to write + // after sending the headers + Thread.Sleep (200); if (socket.Available > 0) { bytesReceived = socket.Receive (buffer); } else { @@ -1078,7 +1587,8 @@ namespace MonoTests.System.Net StringWriter sw = new StringWriter (); if (statusLine.StartsWith ("POST /original/")) { sw.WriteLine ("HTTP/1.0 302 Found"); - sw.WriteLine ("Location: " + "http://" + IPAddress.Loopback.ToString () + ":8764/moved/"); + EndPoint ep = socket.LocalEndPoint; + sw.WriteLine ("Location: " + "http://" + ep.ToString () + "/moved/"); sw.WriteLine (); sw.Flush (); } else if (statusLine.StartsWith ("GET /moved/")) { @@ -1099,6 +1609,18 @@ namespace MonoTests.System.Net static byte [] InternalErrorHandler (Socket socket) { + byte [] buffer = new byte [4096]; + int bytesReceived = socket.Receive (buffer); + while (bytesReceived > 0) { + // We don't check for Content-Length or anything else here, so we give the client a little time to write + // after sending the headers + Thread.Sleep (200); + if (socket.Available > 0) { + bytesReceived = socket.Receive (buffer); + } else { + bytesReceived = 0; + } + } StringWriter sw = new StringWriter (); sw.WriteLine ("HTTP/1.1 500 Too Lazy"); sw.WriteLine ("Content-Length: 0"); @@ -1133,6 +1655,103 @@ namespace MonoTests.System.Net return Encoding.UTF8.GetBytes (sw.ToString ()); } + static byte [] VerbEchoHandler (Socket socket) + { + MemoryStream ms = new MemoryStream (); + byte [] buffer = new byte [4096]; + int bytesReceived = socket.Receive (buffer); + while (bytesReceived > 0) { + ms.Write (buffer, 0, bytesReceived); + // We don't check for Content-Length or anything else here, so we give the client a little time to write + // after sending the headers + Thread.Sleep (200); + if (socket.Available > 0) { + bytesReceived = socket.Receive (buffer); + } else { + bytesReceived = 0; + } + } + ms.Flush (); + ms.Position = 0; + string statusLine = null; + using (StreamReader sr = new StreamReader (ms, Encoding.UTF8)) { + statusLine = sr.ReadLine (); + } + + string verb = "DEFAULT"; + if (statusLine != null) { + string [] parts = statusLine.Split (' '); + if (parts.Length > 0) + verb = parts [0]; + } + + StringWriter sw = new StringWriter (); + sw.WriteLine ("HTTP/1.1 200 OK"); + sw.WriteLine ("Content-Type: text/plain"); + sw.WriteLine ("Content-Length: " + verb.Length); + sw.WriteLine (); + sw.Write (verb); + sw.Flush (); + + return Encoding.UTF8.GetBytes (sw.ToString ()); + } + + static byte [] PostAnd401Handler (Socket socket) + { + MemoryStream ms = new MemoryStream (); + byte [] buffer = new byte [4096]; + int bytesReceived = socket.Receive (buffer); + while (bytesReceived > 0) { + ms.Write (buffer, 0, bytesReceived); + // We don't check for Content-Length or anything else here, so we give the client a little time to write + // after sending the headers + Thread.Sleep (200); + if (socket.Available > 0) { + bytesReceived = socket.Receive (buffer); + } else { + bytesReceived = 0; + } + } + ms.Flush (); + ms.Position = 0; + string statusLine = null; + bool have_auth = false; + int cl = -1; + using (StreamReader sr = new StreamReader (ms, Encoding.UTF8)) { + string l; + while ((l = sr.ReadLine ()) != null) { + if (statusLine == null) { + statusLine = l; + } else if (l.StartsWith ("Authorization:")) { + have_auth = true; + } else if (l.StartsWith ("Content-Length:")) { + cl = Int32.Parse (l.Substring ("content-length: ".Length)); + } + } + } + + StringWriter sw = new StringWriter (); + if (!have_auth) { + sw.WriteLine ("HTTP/1.0 401 Invalid Credentials"); + sw.WriteLine ("WWW-Authenticate: basic Yeah"); + sw.WriteLine (); + sw.Flush (); + } else if (cl > 0 && statusLine.StartsWith ("POST ")) { + sw.WriteLine ("HTTP/1.0 200 OK"); + sw.WriteLine ("Content-Type: text/plain"); + sw.WriteLine ("Content-Length: 8"); + sw.WriteLine (); + sw.Write ("LOOKS OK"); + sw.Flush (); + } else { + sw.WriteLine ("HTTP/1.0 500 test failed"); + sw.WriteLine ("Content-Length: 0"); + sw.WriteLine (); + sw.Flush (); + } + + return Encoding.UTF8.GetBytes (sw.ToString ()); + } [Test] public void NtlmAuthentication () { @@ -1146,7 +1765,7 @@ namespace MonoTests.System.Net HttpWebResponse resp = (HttpWebResponse) request.GetResponse (); string res = null; using (StreamReader reader = new StreamReader (resp.GetResponseStream ())) { - res = reader.ReadToEnd (); + res = reader.ReadToEnd (); } resp.Close (); server.Stop (); @@ -1273,33 +1892,502 @@ namespace MonoTests.System.Net protected abstract void Run (); } -#if !TARGET_JVM - class SslHttpServer : HttpServer { - X509Certificate _certificate; - - protected override void Run () +#if NET_2_0 + [Test] + public void BeginGetRequestStream () + { + this.DoRequest ( + (r, c) => { - try { - Socket client = sock.Accept (); - NetworkStream ns = new NetworkStream (client, true); - SslServerStream s = new SslServerStream (ns, Certificate, false, false); - s.PrivateKeyCertSelectionDelegate += new PrivateKeySelectionCallback (GetPrivateKey); + r.Method = "POST"; + r.ContentLength = 0; + r.BeginGetRequestStream ((a) => + { + using (Stream s = r.EndGetRequestStream (a)) { }; + c.Set(); + }, + null); + }, + (c) => { }); + } - StreamReader reader = new StreamReader (s); - StreamWriter writer = new StreamWriter (s, Encoding.ASCII); + [Test] + public void BeginGetRequestStreamNoClose () + { + this.DoRequest ( + (r, c) => { + r.Method = "POST"; + r.ContentLength = 1; + r.BeginGetRequestStream ((a) => + { + r.EndGetRequestStream (a); + c.Set (); + }, + null); + }, + (c) => {}); + } - string line; - string hello = "

Hello World!

"; - string answer = "HTTP/1.0 200\r\n" + - "Connection: close\r\n" + - "Content-Type: text/html\r\n" + - "Content-Encoding: " + Encoding.ASCII.WebName + "\r\n" + - "Content-Length: " + hello.Length + "\r\n" + - "\r\n" + hello; + [Test] + public void BeginGetRequestStreamCancelIfNotAllBytesWritten () + { + this.DoRequest ( + (r, c) => + { + r.Method = "POST"; + r.ContentLength = 10; + r.BeginGetRequestStream ((a) => + { + WebException ex = ExceptionAssert.Throws (() => + { + using (Stream s = r.EndGetRequestStream (a)) { + } + } + ); + Assert.AreEqual (ex.Status, WebExceptionStatus.RequestCanceled); + c.Set(); + }, + null); + }, + (c) => { }); + } - // Read the headers - do { - line = reader.ReadLine (); + [Test] + public void GetRequestStream2 () + { + this.DoRequest ( + (r, c) => + { + r.Method = "POST"; + r.ContentLength = data64KB.Length; + using (Stream s = r.GetRequestStream ()) { + s.Write (data64KB, 0, data64KB.Length); + } + c.Set (); + }, + (c) => { }); + } + + [Test] + public void GetRequestStreamNotAllBytesWritten () + { + this.DoRequest ( + (r, c) => + { + r.Method = "POST"; + r.ContentLength = data64KB.Length; + WebException ex = ExceptionAssert.Throws (() => r.GetRequestStream ().Close ()); + Assert.AreEqual (ex.Status, WebExceptionStatus.RequestCanceled); + c.Set (); + }, + (c) => {}); + } + + [Test] + public void GetRequestStreamTimeout () + { + this.DoRequest ( + (r, c) => + { + r.Method = "POST"; + r.ContentLength = data64KB.Length; + r.Timeout = 100; + WebException ex = ExceptionAssert.Throws (() => r.GetRequestStream ()); + Assert.IsTrue (ex.Status == WebExceptionStatus.Timeout || ex.Status == WebExceptionStatus.ConnectFailure); + c.Set(); + }); + } + + [Test] + public void BeginWrite () + { + byte[] received = new byte[data64KB.Length]; + + this.DoRequest ( + (r, c) => + { + r.Method = "POST"; + r.ContentLength = data64KB.Length; + + Stream s = r.GetRequestStream (); + s.BeginWrite (data64KB, 0, data64KB.Length, + (a) => + { + s.EndWrite (a); + s.Close (); + r.GetResponse ().Close (); + c.Set(); + }, + null); + }, + (c) => + { + c.Request.InputStream.ReadAll (received, 0, received.Length); + c.Response.StatusCode = 204; + c.Response.Close (); + }); + + Assert.AreEqual (data64KB, received); + } + + [Test] + public void BeginWriteAfterAbort () + { + byte [] received = new byte [data64KB.Length]; + + this.DoRequest ( + (r, c) => + { + r.Method = "POST"; + r.ContentLength = data64KB.Length; + + Stream s = r.GetRequestStream (); + r.Abort(); + + WebException ex = ExceptionAssert.Throws (() => s.BeginWrite (data64KB, 0, data64KB.Length, null, null)); + Assert.AreEqual (ex.Status, WebExceptionStatus.RequestCanceled); + + c.Set(); + }, + (c) => + { + c.Request.InputStream.ReadAll (received, 0, received.Length); + c.Response.StatusCode = 204; + c.Response.Close(); + }); + } + + [Test] + public void PrematureStreamCloseAborts () + { + byte [] received = new byte [data64KB.Length]; + + this.DoRequest ( + (r, c) => + { + r.Method = "POST"; + r.ContentLength = data64KB.Length * 2; + + Stream s = r.GetRequestStream (); + s.Write (data64KB, 0, data64KB.Length); + + WebException ex = ExceptionAssert.Throws(() => s.Close()); + Assert.AreEqual(ex.Status, WebExceptionStatus.RequestCanceled); + + c.Set(); + }, + (c) => + { + c.Request.InputStream.ReadAll (received, 0, received.Length); + c.Response.StatusCode = 204; + c.Response.Close (); + }); + } + + [Test] + public void Write () + { + byte [] received = new byte [data64KB.Length]; + + this.DoRequest ( + (r, c) => + { + r.Method = "POST"; + r.ContentLength = data64KB.Length; + + using (Stream s = r.GetRequestStream ()) { + s.Write (data64KB, 0, data64KB.Length); + } + + r.GetResponse ().Close (); + c.Set (); + }, + (c) => + { + c.Request.InputStream.ReadAll (received, 0, received.Length); + c.Response.StatusCode = 204; + c.Response.Close (); + }); + + Assert.AreEqual(data64KB, received); + } + + [Test] + public void WriteServerAborts () + { + ManualResetEvent abort = new ManualResetEvent (false); + byte [] received = new byte [data64KB.Length]; + + this.DoRequest ( + (r, c) => + { + r.Method = "POST"; + r.ContentLength = data64KB.Length; + + using (Stream s = r.GetRequestStream()) { + abort.Set(); + Thread.Sleep(100); + IOException ex = ExceptionAssert.Throws (() => s.Write(data64KB, 0, data64KB.Length)); + } + + c.Set(); + }, + (c) => + { + abort.WaitOne(); + c.Response.Abort(); + }); + } + + [Test] + public void Read () + { + byte [] received = new byte [data64KB.Length]; + + this.DoRequest ( + (r, c) => + { + using (HttpWebResponse x = (HttpWebResponse) r.GetResponse ()) + using (Stream s = x.GetResponseStream()) { + s.ReadAll (received, 0, received.Length); + } + + c.Set (); + }, + (c) => + { + c.Response.StatusCode = 200; + c.Response.ContentLength64 = data64KB.Length; + c.Response.OutputStream.Write (data64KB, 0, data64KB.Length); + c.Response.OutputStream.Close (); + c.Response.Close (); + }); + + Assert.AreEqual (data64KB, received); + } + + [Test] + public void ReadTimeout2 () + { + byte [] received = new byte [data64KB.Length]; + + this.DoRequest ( + (r, c) => + { + r.ReadWriteTimeout = 10; + using (HttpWebResponse x = (HttpWebResponse) r.GetResponse ()) + using (Stream s = x.GetResponseStream ()) { + WebException ex = ExceptionAssert.Throws (() => s.ReadAll (received, 0, received.Length)); + Assert.AreEqual (ex.Status, WebExceptionStatus.Timeout); + } + + c.Set(); + }, + (c) => + { + c.Response.StatusCode = 200; + c.Response.ContentLength64 = data64KB.Length; + c.Response.OutputStream.Write (data64KB, 0, data64KB.Length / 2); + Thread.Sleep (1000); + c.Response.OutputStream.Write (data64KB, data64KB.Length / 2, data64KB.Length / 2); + c.Response.OutputStream.Close (); + c.Response.Close (); + }); + } + + [Test] + public void ReadServerAborted () + { + byte [] received = new byte [data64KB.Length]; + + this.DoRequest ( + (r, c) => + { + using (HttpWebResponse x = (HttpWebResponse) r.GetResponse ()) + using (Stream s = x.GetResponseStream ()) { + Assert.AreEqual (1, s.ReadAll (received, 0, received.Length)); + } + + c.Set(); + }, + (c) => + { + c.Response.StatusCode = 200; + c.Response.ContentLength64 = data64KB.Length; + c.Response.OutputStream.Write (data64KB, 0, 1); + c.Response.Abort (); + }); + } + + [Test] + public void BeginGetResponse2 () + { + byte [] received = new byte [data64KB.Length]; + + this.DoRequest ( + (r, c) => + { + r.BeginGetResponse ((a) => + { + using (HttpWebResponse x = (HttpWebResponse) r.EndGetResponse (a)) + using (Stream s = x.GetResponseStream ()) { + s.ReadAll (received, 0, received.Length); + } + + c.Set(); + }, null); + }, + (c) => + { + c.Response.StatusCode = 200; + c.Response.ContentLength64 = data64KB.Length; + c.Response.OutputStream.Write (data64KB, 0, data64KB.Length); + c.Response.OutputStream.Close (); + c.Response.Close (); + }); + + Assert.AreEqual (data64KB, received); + } + + [Test] + public void BeginGetResponseAborts () + { + ManualResetEvent aborted = new ManualResetEvent(false); + + this.DoRequest ( + (r, c) => + { + r.BeginGetResponse((a) => + { + WebException ex = ExceptionAssert.Throws (() => r.EndGetResponse (a)); + Assert.AreEqual (ex.Status, WebExceptionStatus.RequestCanceled); + c.Set (); + }, null); + + aborted.WaitOne (); + r.Abort (); + }, + (c) => + { + aborted.Set (); + Thread.Sleep (100); + c.Response.StatusCode = 200; + c.Response.ContentLength64 = 0; + c.Response.Close (); + }); + } + + void DoRequest (Action request) + { + int port = rand.Next (20000, 65535); + + ManualResetEvent completed = new ManualResetEvent (false); + Uri address = new Uri (string.Format ("http://localhost:{0}", port)); + HttpWebRequest client = (HttpWebRequest) WebRequest.Create (address); + + request (client, completed); + + if (!completed.WaitOne (10000)) + Assert.Fail ("Test hung"); + } + + void DoRequest (Action request, Action processor) + { + int port = rand.Next (20000, 65535); + + ManualResetEvent [] completed = new ManualResetEvent [2]; + completed [0] = new ManualResetEvent (false); + completed [1] = new ManualResetEvent (false); + + using (ListenerScope scope = new ListenerScope (processor, port, completed [0])) { + ManualResetEvent clientCompleted = new ManualResetEvent (false); + Uri address = new Uri (string.Format ("http://localhost:{0}", port)); + HttpWebRequest client = (HttpWebRequest) WebRequest.Create (address); + + ThreadPool.QueueUserWorkItem ((o) => request (client, completed [1])); + + if (!WaitHandle.WaitAll (completed, 10000)) + Assert.Fail ("Test hung."); + } + } + + class ListenerScope : IDisposable { + EventWaitHandle completed; + public HttpListener listener; + Action processor; + + public ListenerScope (Action processor, int port, EventWaitHandle completed) + { + this.processor = processor; + this.completed = completed; + + this.listener = new HttpListener (); + this.listener.Prefixes.Add (string.Format ("http://localhost:{0}/", port)); + this.listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous; + this.listener.Start (); + + this.listener.BeginGetContext (this.RequestHandler, null); + } + + void RequestHandler (IAsyncResult result) + { + HttpListenerContext context = null; + + try { + context = this.listener.EndGetContext (result); + } catch (HttpListenerException ex) { + // check if the thread has been aborted as in the case when we are shutting down. + if (ex.ErrorCode == 995) + return; + } catch (ObjectDisposedException) { + return; + } + + ThreadPool.QueueUserWorkItem ((o) => + { + try { + this.processor (context); + } catch (HttpListenerException) { + } + }); + + this.completed.Set (); + } + + public void Dispose () + { + this.listener.Stop (); + } + } +#endif + +#if !TARGET_JVM + class SslHttpServer : HttpServer { + X509Certificate _certificate; + + protected override void Run () + { + try { + Socket client = sock.Accept (); + NetworkStream ns = new NetworkStream (client, true); + SslServerStream s = new SslServerStream (ns, Certificate, false, false); + s.PrivateKeyCertSelectionDelegate += new PrivateKeySelectionCallback (GetPrivateKey); + + StreamReader reader = new StreamReader (s); + StreamWriter writer = new StreamWriter (s, Encoding.ASCII); + + string line; + string hello = "

Hello World!

"; + string answer = "HTTP/1.0 200\r\n" + + "Connection: close\r\n" + + "Content-Type: text/html\r\n" + + "Content-Encoding: " + Encoding.ASCII.WebName + "\r\n" + + "Content-Length: " + hello.Length + "\r\n" + + "\r\n" + hello; + + // Read the headers + do { + line = reader.ReadLine (); } while (line != "" && line != null && line.Length > 0); // Now the content. We know it's 100 bytes. @@ -1309,7 +2397,8 @@ namespace MonoTests.System.Net writer.Write (answer); writer.Flush (); - evt.WaitOne (50000, false); + if (evt.WaitOne (5000, false)) + error = new Exception ("Timeout when stopping the server"); } catch (Exception e) { error = e; } @@ -1408,4 +2497,596 @@ namespace MonoTests.System.Net } #endif } + + [TestFixture] + public class HttpRequestStreamTest + { + [Test] + public void BeginRead () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9124); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + byte [] buffer = new byte [10]; + try { + rs.BeginRead (buffer, 0, buffer.Length, null, null); + Assert.Fail ("#1"); + } catch (NotSupportedException ex) { + // The stream does not support reading + Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + } finally { + req.Abort (); + } + } + } + } + + [Test] + public void BeginWrite_Request_Aborted () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9125); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + req.Abort (); + try { + rs.BeginWrite (new byte [] { 0x2a, 0x2f }, 0, 2, null, null); + Assert.Fail ("#1"); + } catch (WebException ex) { + // The request was aborted: The request was canceled + Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.Response, "#5"); + Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6"); + } + } + } + } + + [Test] + public void CanRead () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9126); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + Stream rs = req.GetRequestStream (); + try { + Assert.IsFalse (rs.CanRead, "#1"); + rs.Close (); + Assert.IsFalse (rs.CanRead, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + + [Test] + public void CanSeek () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9127); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + Stream rs = req.GetRequestStream (); + try { + Assert.IsFalse (rs.CanSeek, "#1"); + rs.Close (); + Assert.IsFalse (rs.CanSeek, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + +#if NET_2_0 + [Test] // bug #324182 +#if TARGET_JVM + [Category ("NotWorking")] +#endif + public void CanTimeout () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9128); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + Stream rs = req.GetRequestStream (); + try { + Assert.IsTrue (rs.CanTimeout, "#1"); + rs.Close (); + Assert.IsTrue (rs.CanTimeout, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } +#endif + + [Test] + public void CanWrite () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9129); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + Stream rs = req.GetRequestStream (); + try { + Assert.IsTrue (rs.CanWrite, "#1"); + rs.Close (); + Assert.IsFalse (rs.CanWrite, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + + [Test] + public void Read () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9130); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + byte [] buffer = new byte [10]; + try { + rs.Read (buffer, 0, buffer.Length); + Assert.Fail ("#1"); + } catch (NotSupportedException ex) { + // The stream does not support reading + Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + } finally { + req.Abort (); + } + } + } + } + + [Test] + public void ReadByte () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9140); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + try { + rs.ReadByte (); + Assert.Fail ("#1"); + } catch (NotSupportedException ex) { + // The stream does not support reading + Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + } finally { + req.Abort (); + } + } + } + } + +#if NET_2_0 + [Test] + public void ReadTimeout () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9141); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + Stream rs = req.GetRequestStream (); + try { + Assert.AreEqual (300000, rs.ReadTimeout, "#1"); + rs.Close (); + Assert.AreEqual (300000, rs.ReadTimeout, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } +#endif + + [Test] + public void Seek () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9142); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + try { + rs.Seek (0, SeekOrigin.Current); + Assert.Fail ("#1"); + } catch (NotSupportedException ex) { + // This stream does not support seek operations + Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + } finally { + req.Abort (); + } + } + } + } + + [Test] + public void Write_Buffer_Null () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9143); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + try { + rs.Write ((byte []) null, -1, -1); + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("buffer", ex.ParamName, "#5"); + } + } + + req.Abort (); + } + } + + [Test] + public void Write_Count_Negative () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9144); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + byte [] buffer = new byte [] { 0x2a, 0x2c, 0x1d, 0x00, 0x0f }; + try { + rs.Write (buffer, 1, -1); + Assert.Fail ("#1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("size", ex.ParamName, "#A5"); + } + } + + req.Abort (); + } + } + + [Test] + public void Write_Count_Overflow () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9145); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + byte [] buffer = new byte [] { 0x2a, 0x2c, 0x1d, 0x00, 0x0f }; + try { + rs.Write (buffer, buffer.Length - 2, 3); + Assert.Fail ("#1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("size", ex.ParamName, "#5"); + } + } + + req.Abort (); + } + } + + [Test] + public void Write_Offset_Negative () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9146); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + byte [] buffer = new byte [] { 0x2a, 0x2c, 0x1d, 0x00, 0x0f }; + try { + rs.Write (buffer, -1, 0); + Assert.Fail ("#1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("offset", ex.ParamName, "#5"); + } + } + + req.Abort (); + } + } + + [Test] + public void Write_Offset_Overflow () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9147); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + byte [] buffer = new byte [] { 0x2a, 0x2c, 0x1d, 0x00, 0x0f }; + try { + rs.Write (buffer, buffer.Length + 1, 0); + Assert.Fail ("#1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("offset", ex.ParamName, "#5"); + } + } + + req.Abort (); + } + } + + [Test] + public void Write_Request_Aborted () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9148); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + req.Abort (); + try { + rs.Write (new byte [0], 0, 0); + Assert.Fail ("#1"); + } catch (WebException ex) { + // The request was aborted: The request was canceled + Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.Response, "#5"); + Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6"); + } + } + } + } + + [Test] + [Category ("NotWorking")] + public void Write_Stream_Closed () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9149); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + rs.Close (); + try { + rs.Write (new byte [0], 0, 0); + Assert.Fail ("#1"); + } catch (WebException ex) { + // The request was aborted: The connection was closed unexpectedly + Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.Response, "#5"); + Assert.AreEqual (WebExceptionStatus.ConnectionClosed, ex.Status, "#6"); + } + } + } + } + + [Test] + public void WriteByte_Request_Aborted () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9150); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + using (Stream rs = req.GetRequestStream ()) { + req.Abort (); + try { + rs.WriteByte (0x2a); + Assert.Fail ("#1"); + } catch (WebException ex) { + // The request was aborted: The request was canceled + Assert.AreEqual (typeof (WebException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.Response, "#5"); + Assert.AreEqual (WebExceptionStatus.RequestCanceled, ex.Status, "#6"); + } + } + } + } + +#if NET_2_0 + [Test] + public void WriteTimeout () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 9151); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "POST"; + + Stream rs = req.GetRequestStream (); + try { + Assert.AreEqual (300000, rs.WriteTimeout, "#1"); + rs.Close (); + Assert.AreEqual (300000, rs.WriteTimeout, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } +#endif + } + +#if NET_2_0 + public static class StreamExtensions { + public static int ReadAll(this Stream stream, byte[] buffer, int offset, int count) + { + int totalRead = 0; + + while (totalRead < count) { + int bytesRead = stream.Read (buffer, offset + totalRead, count - totalRead); + if (bytesRead == 0) + break; + + totalRead += bytesRead; + } + + return totalRead; + } + } + + public class ExceptionAssert { + /// + /// Asserts that the function throws an exception. + /// + /// A function execute that is expected to raise an exception. + /// The type of exception that is expected. + /// The exception thrown. + /// If the function does not throw an exception + /// or throws a different exception. + /// + public static T Throws (Action f) where T : Exception { + Exception actualException = null; + + try { + f (); + } catch (Exception ex) { + actualException = ex; + } + + if (actualException == null) + throw new AssertionException (string.Format ( + "No exception thrown. Expected '{0}'", + typeof (T).FullName)); + else if (typeof(T) != actualException.GetType()) + throw new AssertionException (string.Format ( + "Caught exception of type '{0}'. Expected '{1}':{2}", + actualException.GetType().FullName, + typeof (T).FullName, + Environment.NewLine + actualException)); + + return (T) actualException; + } + } +#endif } diff --git a/mcs/class/System/Test/System.Net/HttpWebResponseTest.cs b/mcs/class/System/Test/System.Net/HttpWebResponseTest.cs index 936de69c895..dd974917525 100644 --- a/mcs/class/System/Test/System.Net/HttpWebResponseTest.cs +++ b/mcs/class/System/Test/System.Net/HttpWebResponseTest.cs @@ -25,9 +25,9 @@ namespace MonoTests.System.Net public void CharacterSet_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -48,8 +48,6 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } - - responder.Stop (); } } @@ -57,9 +55,9 @@ namespace MonoTests.System.Net public void Close_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -71,8 +69,6 @@ namespace MonoTests.System.Net HttpWebResponse resp = (HttpWebResponse) req.GetResponse (); ((IDisposable) resp).Dispose (); resp.Close (); - - responder.Stop (); } } @@ -80,9 +76,9 @@ namespace MonoTests.System.Net public void ContentEncoding_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -103,8 +99,6 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } - - responder.Stop (); } } @@ -112,9 +106,9 @@ namespace MonoTests.System.Net public void ContentLength_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -127,8 +121,6 @@ namespace MonoTests.System.Net ((IDisposable) resp).Dispose (); Assert.AreEqual (9, resp.ContentLength); - - responder.Stop (); } } @@ -136,9 +128,9 @@ namespace MonoTests.System.Net public void ContentType_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -159,8 +151,6 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } - - responder.Stop (); } } @@ -168,9 +158,9 @@ namespace MonoTests.System.Net public void Cookies_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -201,8 +191,6 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#B4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#B5"); } - - responder.Stop (); } } @@ -210,9 +198,9 @@ namespace MonoTests.System.Net public void GetResponseHeader_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -233,8 +221,6 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } - - responder.Stop (); } } @@ -242,9 +228,9 @@ namespace MonoTests.System.Net public void GetResponseStream_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -265,8 +251,6 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } - - responder.Stop (); } } @@ -274,9 +258,9 @@ namespace MonoTests.System.Net public void Headers_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -308,8 +292,6 @@ namespace MonoTests.System.Net Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } #endif - - responder.Stop (); } } @@ -317,9 +299,9 @@ namespace MonoTests.System.Net public void LastModified_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -340,8 +322,6 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } - - responder.Stop (); } } @@ -349,9 +329,9 @@ namespace MonoTests.System.Net public void Method_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -372,8 +352,6 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } - - responder.Stop (); } } @@ -381,9 +359,9 @@ namespace MonoTests.System.Net public void ProtocolVersion_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -404,8 +382,6 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } - - responder.Stop (); } } @@ -413,9 +389,9 @@ namespace MonoTests.System.Net public void ResponseUri_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -436,8 +412,6 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } - - responder.Stop (); } } @@ -445,9 +419,9 @@ namespace MonoTests.System.Net public void Server_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -468,8 +442,6 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } - - responder.Stop (); } } @@ -477,9 +449,9 @@ namespace MonoTests.System.Net public void StatusCode_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -492,8 +464,6 @@ namespace MonoTests.System.Net ((IDisposable) resp).Dispose (); Assert.AreEqual (HttpStatusCode.OK, resp.StatusCode); - - responder.Stop (); } } @@ -501,9 +471,9 @@ namespace MonoTests.System.Net public void StatusDescription_Disposed () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); - string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + string url = "http://" + ep.ToString () + "/test/"; - using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) { + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) { responder.Start (); HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); @@ -524,12 +494,10 @@ namespace MonoTests.System.Net Assert.IsNotNull (ex.Message, "#4"); Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5"); } - - responder.Stop (); } } - static byte [] FullResponseHandler (Socket socket) + internal static byte [] FullResponseHandler (Socket socket) { StringWriter sw = new StringWriter (); sw.NewLine = "\r\n"; @@ -548,4 +516,675 @@ namespace MonoTests.System.Net return Encoding.UTF8.GetBytes (sw.ToString ()); } } + + [TestFixture] + public class HttpResponseStreamTest + { + [Test] + public void BeginRead_Buffer_Null () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + byte [] buffer = null; + try { + try { + rs.BeginRead (buffer, 0, 0, null, null); + Assert.Fail ("#A1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("buffer", ex.ParamName, "#A5"); + } + + // read full response + buffer = new byte [24]; + Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length)); + + buffer = null; + try { + rs.BeginRead (buffer, 0, 0, null, null); + Assert.Fail ("#B1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("buffer", ex.ParamName, "#B5"); + } + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + + [Test] + public void BeginWrite () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + byte [] buffer = new byte [5]; + try { + rs.BeginWrite (buffer, 0, buffer.Length, null, null); + Assert.Fail ("#1"); + } catch (NotSupportedException ex) { + // The stream does not support writing + Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + + [Test] + [Category ("NotWorking")] + public void CanRead () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + try { + Assert.IsTrue (rs.CanRead, "#1"); + rs.Close (); + Assert.IsFalse (rs.CanRead, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + + [Test] + public void CanSeek () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + try { + Assert.IsFalse (rs.CanSeek, "#1"); + rs.Close (); + Assert.IsFalse (rs.CanSeek, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + +#if NET_2_0 + [Test] // bug #324182 +#if TARGET_JVM + [Category ("NotWorking")] +#endif + public void CanTimeout () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + try { + Assert.IsTrue (rs.CanTimeout, "#1"); + rs.Close (); + Assert.IsTrue (rs.CanTimeout, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + } +#endif + + [Test] + public void CanWrite () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + try { + Assert.IsFalse (rs.CanWrite, "#1"); + rs.Close (); + Assert.IsFalse (rs.CanWrite, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + + [Test] + public void Read () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + byte [] buffer = new byte [5]; + try { + Assert.AreEqual (1, rs.Read (buffer, 4, 1), "#A1"); + Assert.AreEqual (new byte [] { 0x00, 0x00, 0x00, 0x00, 0x3c }, buffer, "#A2"); + Assert.AreEqual (2, rs.Read (buffer, 0, 2), "#B1"); + Assert.AreEqual (new byte [] { 0x64, 0x75, 0x00, 0x00, 0x3c }, buffer, "#B2"); + Assert.AreEqual (4, rs.Read (buffer, 1, 4), "#C1"); + Assert.AreEqual (new byte [] { 0x64, 0x6d, 0x6d, 0x79, 0x20 }, buffer, "#C2"); + Assert.AreEqual (2, rs.Read (buffer, 0, 3), "#D1"); + Assert.AreEqual (new byte [] { 0x2f, 0x3e, 0x6d, 0x79, 0x20 }, buffer, "#D2"); + Assert.AreEqual (0, rs.Read (buffer, 1, 3), "#E1"); + Assert.AreEqual (new byte [] { 0x2f, 0x3e, 0x6d, 0x79, 0x20 }, buffer, "#E2"); + Assert.AreEqual (0, rs.Read (buffer, buffer.Length, 0), "#G1"); + Assert.AreEqual (new byte [] { 0x2f, 0x3e, 0x6d, 0x79, 0x20 }, buffer, "#G2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + + [Test] + public void Read_Buffer_Null () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + byte [] buffer = null; + try { + try { + rs.Read (buffer, 0, 0); + Assert.Fail ("#A1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("buffer", ex.ParamName, "#A5"); + } + + // read full response + buffer = new byte [24]; + Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length)); + + buffer = null; + try { + rs.Read (buffer, 0, 0); + Assert.Fail ("#B1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("buffer", ex.ParamName, "#B5"); + } + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + + [Test] + public void Read_Count_Negative () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + byte [] buffer = new byte [5]; + try { + try { + rs.Read (buffer, 1, -1); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("size", ex.ParamName, "#A5"); + } + + // read full response + buffer = new byte [24]; + Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length)); + + try { + rs.Read (buffer, 1, -1); + Assert.Fail ("#B1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("size", ex.ParamName, "#B5"); + } + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + + [Test] + public void Read_Count_Overflow () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + byte [] buffer = new byte [5]; + try { + try { + rs.Read (buffer, buffer.Length - 2, 3); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("size", ex.ParamName, "#A5"); + } + + // read full response + buffer = new byte [24]; + Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length)); + + try { + rs.Read (buffer, buffer.Length - 2, 3); + Assert.Fail ("#B1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("size", ex.ParamName, "#B5"); + } + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + + [Test] + public void Read_Offset_Negative () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + byte [] buffer = new byte [5]; + try { + try { + rs.Read (buffer, -1, 0); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("offset", ex.ParamName, "#A5"); + } + + // read full response + buffer = new byte [24]; + Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length)); + + try { + rs.Read (buffer, -1, 0); + Assert.Fail ("#B1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("offset", ex.ParamName, "#B5"); + } + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + + [Test] + public void Read_Offset_Overflow () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + byte [] buffer = new byte [5]; + try { + try { + rs.Read (buffer, buffer.Length + 1, 0); + Assert.Fail ("#A1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("offset", ex.ParamName, "#A5"); + } + + // read full response + buffer = new byte [24]; + Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length)); + + try { + rs.Read (buffer, buffer.Length + 1, 0); + Assert.Fail ("#B1"); + } catch (ArgumentOutOfRangeException ex) { + // Specified argument was out of the range of valid values + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("offset", ex.ParamName, "#B5"); + } + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + + [Test] + [Category ("NotWorking")] + public void Read_Stream_Closed () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req; + + req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + rs.Close (); + try { + rs.Read (new byte [0], 0, 0); + Assert.Fail ("#A1"); + } catch (WebException ex) { + // The request was aborted: The connection was closed unexpectedly + Assert.AreEqual (typeof (WebException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.IsNull (ex.Response, "#A5"); + Assert.AreEqual (WebExceptionStatus.ConnectionClosed, ex.Status, "#A6"); + } finally { + rs.Close (); + req.Abort (); + } + } + + req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + byte [] buffer = new byte [24]; + Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length)); + rs.Close (); + try { + rs.Read (new byte [0], 0, 0); + Assert.Fail ("#B1"); + } catch (WebException ex) { + // The request was aborted: The connection was closed unexpectedly + Assert.AreEqual (typeof (WebException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.IsNull (ex.Response, "#B5"); + Assert.AreEqual (WebExceptionStatus.ConnectionClosed, ex.Status, "#B6"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + +#if NET_2_0 + [Test] + public void ReadTimeout () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + try { + Assert.AreEqual (2000, rs.ReadTimeout, "#1"); + rs.Close (); + Assert.AreEqual (2000, rs.ReadTimeout, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + } +#endif + + [Test] + public void Write () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + byte [] buffer = new byte [5]; + try { + rs.Write (buffer, 0, buffer.Length); + Assert.Fail ("#1"); + } catch (NotSupportedException ex) { + // The stream does not support writing + Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + } + +#if NET_2_0 + [Test] + public void WriteTimeout () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + ep.ToString () + "/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) { + responder.Start (); + + HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + req.Method = "GET"; + req.Timeout = 2000; + req.ReadWriteTimeout = 2000; + req.KeepAlive = false; + + using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) { + Stream rs = resp.GetResponseStream (); + try { + Assert.AreEqual (2000, rs.WriteTimeout, "#1"); + rs.Close (); + Assert.AreEqual (2000, rs.WriteTimeout, "#2"); + } finally { + rs.Close (); + req.Abort (); + } + } + } + } +#endif + } } diff --git a/mcs/class/System/Test/System.Net/IPEndPointTest.cs b/mcs/class/System/Test/System.Net/IPEndPointTest.cs index 990a988d4ad..057041ab74e 100644 --- a/mcs/class/System/Test/System.Net/IPEndPointTest.cs +++ b/mcs/class/System/Test/System.Net/IPEndPointTest.cs @@ -41,8 +41,8 @@ public class IPEndPointTest [Test] public void PublicFields () { - Assertion.AssertEquals ("MinPort", IPEndPoint.MinPort, MyMinPort); - Assertion.AssertEquals ("MaxPort", IPEndPoint.MaxPort, MyMaxPort); + Assert.AreEqual (IPEndPoint.MinPort, MyMinPort, "MinPort"); + Assert.AreEqual (IPEndPoint.MaxPort, MyMaxPort, "MaxPort"); } [Test] @@ -50,28 +50,28 @@ public class IPEndPointTest { try { new IPEndPoint (null, 0); - Assertion.Fail ("Should raise an ArgumentNullException"); + Assert.Fail ("Should raise an ArgumentNullException"); } catch (ArgumentNullException) { } try { new IPEndPoint (ipAddress, MyMinPort - 1); - Assertion.Fail ("Should raise an ArgumentOutOfRangeException #1"); + Assert.Fail ("Should raise an ArgumentOutOfRangeException #1"); } catch (ArgumentOutOfRangeException) { } try { new IPEndPoint (ipAddress, MyMaxPort + 1); - Assertion.Fail ("Should raise an ArgumentOutOfRangeException #2"); + Assert.Fail ("Should raise an ArgumentOutOfRangeException #2"); } catch (ArgumentOutOfRangeException) { } try { new IPEndPoint (ip, MyMinPort -1); - Assertion.Fail ("Should raise an ArgumentOutOfRangeException #3"); + Assert.Fail ("Should raise an ArgumentOutOfRangeException #3"); } catch (ArgumentOutOfRangeException) { } try { new IPEndPoint (ip, MyMaxPort + 1); - Assertion.Fail ("Should raise an ArgumentOutOfRangeException #4"); + Assert.Fail ("Should raise an ArgumentOutOfRangeException #4"); } catch (ArgumentOutOfRangeException) { } } @@ -81,12 +81,12 @@ public class IPEndPointTest { try { endPoint1.Port = MyMinPort - 1; - Assertion.Fail ("Should raise an ArgumentOutOfRangeException #1"); + Assert.Fail ("Should raise an ArgumentOutOfRangeException #1"); } catch (ArgumentOutOfRangeException) { } try { endPoint1.Port = MyMaxPort + 1; - Assertion.Fail ("Should raise an ArgumentOutOfRangeException #2"); + Assert.Fail ("Should raise an ArgumentOutOfRangeException #2"); } catch (ArgumentOutOfRangeException) { } } @@ -96,34 +96,34 @@ public class IPEndPointTest { SocketAddress addr = endPoint1.Serialize (); EndPoint endPoint3 = endPoint2.Create (addr); - Assertion.Assert ("#1", endPoint1.Equals (endPoint3)); + Assert.IsTrue (endPoint1.Equals (endPoint3), "#1"); IPAddress ipAddress = IPAddress.Parse ("255.255.255.255"); IPEndPoint endPoint4 = new IPEndPoint (ipAddress, MyMaxPort); addr = endPoint4.Serialize (); EndPoint endPoint5 = endPoint2.Create(addr); - Assertion.Assert ("#2", endPoint4.Equals (endPoint5)); - Assertion.AssertEquals ("#3", endPoint5.ToString (), "255.255.255.255:" + MyMaxPort); + Assert.IsTrue (endPoint4.Equals (endPoint5), "#2"); + Assert.AreEqual (endPoint5.ToString (), "255.255.255.255:" + MyMaxPort, "#3"); } [Test] public void Equals () { - Assertion.Assert("Equals", endPoint1.Equals (endPoint2)); - Assertion.Assert("Not Equals", !endPoint1.Equals (new IPEndPoint (ip, MyPort + 1))); + Assert.IsTrue (endPoint1.Equals (endPoint2), "Equals"); + Assert.IsTrue (!endPoint1.Equals (new IPEndPoint (ip, MyPort + 1)), "Not Equals"); } [Test] public void GetHashCodeTest () { - Assertion.AssertEquals(endPoint1.GetHashCode(), endPoint2.GetHashCode()); + Assert.AreEqual (endPoint1.GetHashCode(), endPoint2.GetHashCode()); } [Test] public void ToStringTest () { - Assertion.AssertEquals("ToString #1", endPoint1.ToString (), MyIPAddressString + ":" + MyPort); - Assertion.AssertEquals("ToString #2", endPoint2.ToString (), MyIPAddressString + ":" + MyPort); + Assert.AreEqual (endPoint1.ToString (), MyIPAddressString + ":" + MyPort, "ToString #1"); + Assert.AreEqual (endPoint2.ToString (), MyIPAddressString + ":" + MyPort, "ToString #2"); } } diff --git a/mcs/class/System/Test/System.Net/ServicePointManagerTest.cs b/mcs/class/System/Test/System.Net/ServicePointManagerTest.cs index a866fb5d41b..fe2f075b32e 100644 --- a/mcs/class/System/Test/System.Net/ServicePointManagerTest.cs +++ b/mcs/class/System/Test/System.Net/ServicePointManagerTest.cs @@ -19,7 +19,7 @@ namespace MonoTests.System.Net { [TestFixture] -public class ServicePointManagerTest : Assertion +public class ServicePointManagerTest { private Uri googleUri; private Uri yahooUri; @@ -49,7 +49,7 @@ public class ServicePointManagerTest : Assertion #endif public void MaxServicePointManagers () { - AssertEquals ("#1", 0, ServicePointManager.MaxServicePoints); + Assert.AreEqual (0, ServicePointManager.MaxServicePoints, "#1"); DoWebRequest (googleUri); Thread.Sleep (100); @@ -89,9 +89,9 @@ public class ServicePointManagerTest : Assertion { ServicePointManager.MaxServicePoints = 0; ServicePoint sp = ServicePointManager.FindServicePoint (googleUri, new WebProxy (apacheUri)); - AssertEquals ("#1", apacheUri, sp.Address); - AssertEquals ("#2", 2, sp.ConnectionLimit); - AssertEquals ("#3", "http", sp.ConnectionName); + Assert.AreEqual (apacheUri, sp.Address, "#1"); + Assert.AreEqual (2, sp.ConnectionLimit, "#2"); + Assert.AreEqual ("http", sp.ConnectionName, "#3"); } private void DoWebRequest (Uri uri) diff --git a/mcs/class/System/Test/System.Net/ServicePointTest.cs b/mcs/class/System/Test/System.Net/ServicePointTest.cs index 2a8983776d1..457dc5b29f1 100644 --- a/mcs/class/System/Test/System.Net/ServicePointTest.cs +++ b/mcs/class/System/Test/System.Net/ServicePointTest.cs @@ -47,7 +47,7 @@ public class ServicePointTest ServicePoint google = ServicePointManager.FindServicePoint (new Uri ("http://www.google.com")); try { ServicePoint slashdot = ServicePointManager.FindServicePoint (new Uri ("http://www.slashdot.org")); - Assertion.Fail ("#1"); + Assert.Fail ("#1"); } catch (InvalidOperationException) { } ServicePointManager.MaxServicePoints = 0; @@ -58,7 +58,7 @@ public class ServicePointTest //WriteServicePoint ("google after getting a response", google); ServicePoint google2 = ServicePointManager.FindServicePoint (new Uri ("http://www.google.com/dilbert.html")); - Assertion.AssertEquals ("#equals", google, google2); + Assert.AreEqual (google, google2, "#equals"); res.Close (); // in both instances property CurrentConnections is 0 according to ms.net. @@ -168,27 +168,27 @@ public class ServicePointTest bool called = false; #if !TARGET_JVM sp.BindIPEndPointDelegate = delegate { - Assertion.Assert(!called); + Assert.IsTrue (!called); called = true; return null; }; #endif req.GetResponse ().Close (); - Assertion.Assert (called); + Assert.IsTrue (called); req = (HttpWebRequest) WebRequest.Create (uri); called = false; #if !TARGET_JVM sp.BindIPEndPointDelegate = delegate(ServicePoint point, IPEndPoint remote, int times) { - Assertion.Assert(times < 5); + Assert.IsTrue (times < 5); called = true; return new IPEndPoint(IPAddress.Parse("0.0.0.0"), 12345 + times); }; #endif req.GetResponse ().Close (); - Assertion.Assert(called); + Assert.IsTrue (called); } #endif diff --git a/mcs/class/System/Test/System.Net/SocketResponder.cs b/mcs/class/System/Test/System.Net/SocketResponder.cs index dd932ec4df0..6ee086f6074 100644 --- a/mcs/class/System/Test/System.Net/SocketResponder.cs +++ b/mcs/class/System/Test/System.Net/SocketResponder.cs @@ -48,6 +48,7 @@ namespace MonoTests.System.Net private readonly object _syncRoot = new object (); private const int SOCKET_CLOSED = 10004; + private const int SOCKET_INVALID_ARGS = 10022; public SocketResponder (IPEndPoint localEP, SocketRequestHandler requestHandler) { @@ -97,6 +98,7 @@ namespace MonoTests.System.Net if (tcpListener != null) { tcpListener.Stop (); tcpListener = null; + Thread.Sleep (50); } } } @@ -104,20 +106,23 @@ namespace MonoTests.System.Net private void Listen () { while (!_stopped) { + Socket socket = null; try { - Socket socket = tcpListener.AcceptSocket (); + socket = tcpListener.AcceptSocket (); socket.Send (_requestHandler (socket)); try { socket.Shutdown (SocketShutdown.Receive); socket.Shutdown (SocketShutdown.Send); } catch { } - Thread.Sleep (500); - socket.Close (); } catch (SocketException ex) { // ignore interruption of blocking call - if (ex.ErrorCode != SOCKET_CLOSED) + if (ex.ErrorCode != SOCKET_CLOSED && ex.ErrorCode != SOCKET_INVALID_ARGS) throw; + } finally { + Thread.Sleep (500); + if (socket != null) + socket.Close (); } } } diff --git a/mcs/class/System/Test/System.Net/WebClientTest.cs b/mcs/class/System/Test/System.Net/WebClientTest.cs index fa57be61aec..ea87f0aa38b 100644 --- a/mcs/class/System/Test/System.Net/WebClientTest.cs +++ b/mcs/class/System/Test/System.Net/WebClientTest.cs @@ -5,12 +5,15 @@ // using System; +using System.Collections; using System.Collections.Specialized; +using System.Globalization; using System.IO; using System.Net; -using System.Collections; +using System.Net.Sockets; using System.Runtime.Serialization; - +using System.Text; +using System.Threading; using NUnit.Framework; namespace MonoTests.System.Net @@ -382,6 +385,30 @@ namespace MonoTests.System.Net Assert.IsNotNull (inner.Message, "#9"); } } + + [Test] + public void EncodingTest () + { + WebClient wc = new WebClient (); + Assert.AreSame (Encoding.Default, wc.Encoding, "#1"); + wc.Encoding = Encoding.ASCII; + Assert.AreSame (Encoding.ASCII, wc.Encoding, "#2"); + } + + [Test] + public void Encoding_Value_Null () + { + WebClient wc = new WebClient (); + try { + wc.Encoding = null; + Assert.Fail ("#1"); + } catch (ArgumentNullException ex) { + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("Encoding", ex.ParamName, "#6"); + } + } #endif [Test] // OpenRead (string) @@ -1667,6 +1694,30 @@ namespace MonoTests.System.Net } #endif + [Test] + public void UploadValues1 () + { + IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000); + string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/"; + + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + WebClient wc = new WebClient (); +#if NET_2_0 + wc.Encoding = Encoding.ASCII; +#endif + + NameValueCollection nvc = new NameValueCollection (); + nvc.Add ("Name", "\u0041\u2262\u0391\u002E"); + nvc.Add ("Address", "\u002E\u2262\u0041\u0391"); + + byte [] buffer = wc.UploadValues (url, nvc); + string response = Encoding.UTF8.GetString (buffer); + Assert.AreEqual ("Name=A%e2%89%a2%ce%91.&Address=.%e2%89%a2A%ce%91\r\n", response); + } + } + [Test] // UploadValues (string, NameValueCollection) public void UploadValues1_Address_Null () { @@ -1982,5 +2033,89 @@ namespace MonoTests.System.Net } } #endif + + static byte [] EchoRequestHandler (Socket socket) + { + MemoryStream ms = new MemoryStream (); + byte [] buffer = new byte [4096]; + int bytesReceived = socket.Receive (buffer); + while (bytesReceived > 0) { + ms.Write (buffer, 0, bytesReceived); + // We don't check for Content-Length or anything else here, so we give the client a little time to write + // after sending the headers + Thread.Sleep (200); + if (socket.Available > 0) { + bytesReceived = socket.Receive (buffer); + } else { + bytesReceived = 0; + } + } + ms.Flush (); + ms.Position = 0; + + StringBuilder sb = new StringBuilder (); + + string expect = null; + + StreamReader sr = new StreamReader (ms, Encoding.UTF8); + string line = null; + byte state = 0; + while ((line = sr.ReadLine ()) != null) { + if (state > 0) { + state = 2; + sb.Append (line); + sb.Append ("\r\n"); + } if (line.Length == 0) { + state = 1; + } else if (line.StartsWith ("Expect:")) { + expect = line.Substring (8); + } + } + + StringWriter sw = new StringWriter (); + + if (expect == "100-continue" && state != 2) { + sw.WriteLine ("HTTP/1.1 100 Continue"); + sw.WriteLine (); + sw.Flush (); + + socket.Send (Encoding.UTF8.GetBytes (sw.ToString ())); + + // receive body + ms = new MemoryStream (); + buffer = new byte [4096]; + bytesReceived = socket.Receive (buffer); + while (bytesReceived > 0) { + ms.Write (buffer, 0, bytesReceived); + Thread.Sleep (200); + if (socket.Available > 0) { + bytesReceived = socket.Receive (buffer); + } else { + bytesReceived = 0; + } + } + ms.Flush (); + ms.Position = 0; + + sb = new StringBuilder (); + sr = new StreamReader (ms, Encoding.UTF8); + line = sr.ReadLine (); + while (line != null) { + sb.Append (line); + sb.Append ("\r\n"); + line = sr.ReadLine (); + } + } + + sw = new StringWriter (); + sw.WriteLine ("HTTP/1.1 200 OK"); + sw.WriteLine ("Content-Type: text/xml"); + sw.WriteLine ("Content-Length: " + sb.Length.ToString (CultureInfo.InvariantCulture)); + sw.WriteLine (); + sw.Write (sb.ToString ()); + sw.Flush (); + + return Encoding.UTF8.GetBytes (sw.ToString ()); + } } } diff --git a/mcs/class/System/Test/System.Net/WebHeaderCollectionTest.cs b/mcs/class/System/Test/System.Net/WebHeaderCollectionTest.cs index 8d335903796..384ba0eaf3e 100644 --- a/mcs/class/System/Test/System.Net/WebHeaderCollectionTest.cs +++ b/mcs/class/System/Test/System.Net/WebHeaderCollectionTest.cs @@ -40,44 +40,44 @@ namespace MonoTests.System.Net { try { col.Add (null); - Assertion.Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException) { } try { col.Add (""); - Assertion.Fail ("#2"); + Assert.Fail ("#2"); } catch (ArgumentException) { } try { col.Add (" "); - Assertion.Fail ("#3"); + Assert.Fail ("#3"); } catch (ArgumentException) { } try { col.Add (":"); - Assertion.Fail ("#4"); + Assert.Fail ("#4"); } catch (ArgumentException) { } try { col.Add (" : "); - Assertion.Fail ("#5"); + Assert.Fail ("#5"); } catch (ArgumentException) { } try { col.Add ("XHost: foo"); } catch (ArgumentException) { - Assertion.Fail ("#7"); + Assert.Fail ("#7"); } // invalid values try { col.Add ("XHost" + ((char) 0xa9) + ": foo"); - Assertion.Fail ("#8"); + Assert.Fail ("#8"); } catch (ArgumentException) { } try { col.Add ("XHost: foo" + (char) 0xa9); } catch (ArgumentException) { - Assertion.Fail ("#9"); + Assert.Fail ("#9"); } try { col.Add ("XHost: foo" + (char) 0x7f); - Assertion.Fail ("#10"); + Assert.Fail ("#10"); } catch (ArgumentException) { } @@ -85,12 +85,12 @@ namespace MonoTests.System.Net try { col.Add ("XHost", null); } catch (ArgumentException) { - Assertion.Fail ("#11"); + Assert.Fail ("#11"); } try { col.Add ("XHost:"); } catch (ArgumentException) { - Assertion.Fail ("#12"); + Assert.Fail ("#12"); } // restricted @@ -99,7 +99,7 @@ namespace MonoTests.System.Net try { WebHeaderCollection col2 = new WebHeaderCollection (true); col2.Add ("Host: foo"); - Assertion.Fail ("#13: should fail according to spec"); + Assert.Fail ("#13: should fail according to spec"); } catch (ArgumentException) {} */ } @@ -114,61 +114,61 @@ namespace MonoTests.System.Net w.Add ("Hello", "H3,H4"); string [] sa = w.GetValues ("Hello"); - Assertion.AssertEquals ("#1", 3, sa.Length); - Assertion.AssertEquals ("#2", "H1,H2,H3,H4", w.Get ("Hello")); + Assert.AreEqual (3, sa.Length, "#1"); + Assert.AreEqual ("H1, H2,H3,H4", w.Get ("Hello"), "#2"); w = new WebHeaderCollection (); w.Add ("Accept", "H1"); w.Add ("Accept", "H2"); w.Add ("Accept", "H3,H4"); - Assertion.AssertEquals ("#3a", 3, w.GetValues (0).Length); - Assertion.AssertEquals ("#3b", 4, w.GetValues ("Accept").Length); - Assertion.AssertEquals ("#4", "H1,H2,H3,H4", w.Get ("Accept")); + Assert.AreEqual (3, w.GetValues (0).Length, "#3a"); + Assert.AreEqual (4, w.GetValues ("Accept").Length, "#3b"); + Assert.AreEqual ("H1, H2,H3,H4", w.Get ("Accept"), "#4"); w = new WebHeaderCollection (); w.Add ("Allow", "H1"); w.Add ("Allow", "H2"); w.Add ("Allow", "H3,H4"); sa = w.GetValues ("Allow"); - Assertion.AssertEquals ("#5", 4, sa.Length); - Assertion.AssertEquals ("#6", "H1,H2,H3,H4", w.Get ("Allow")); + Assert.AreEqual (4, sa.Length, "#5"); + Assert.AreEqual ("H1, H2,H3,H4", w.Get ("Allow"), "#6"); w = new WebHeaderCollection (); w.Add ("AUTHorization", "H1, H2, H3"); sa = w.GetValues ("authorization"); - Assertion.AssertEquals ("#9", 3, sa.Length); + Assert.AreEqual (3, sa.Length, "#9"); w = new WebHeaderCollection (); w.Add ("proxy-authenticate", "H1, H2, H3"); sa = w.GetValues ("Proxy-Authenticate"); - Assertion.AssertEquals ("#9", 3, sa.Length); + Assert.AreEqual (3, sa.Length, "#9"); w = new WebHeaderCollection (); w.Add ("expect", "H1,\tH2, H3 "); sa = w.GetValues ("EXPECT"); - Assertion.AssertEquals ("#10", 3, sa.Length); - Assertion.AssertEquals ("#11", "H2", sa [1]); - Assertion.AssertEquals ("#12", "H3", sa [2]); + Assert.AreEqual (3, sa.Length, "#10"); + Assert.AreEqual ("H2", sa [1], "#11"); + Assert.AreEqual ("H3", sa [2], "#12"); try { w.GetValues (null); - Assertion.Fail ("#13"); + Assert.Fail ("#13"); } catch (ArgumentNullException) { } - Assertion.AssertEquals ("#14", null, w.GetValues ("")); - Assertion.AssertEquals ("#15", null, w.GetValues ("NotExistent")); + Assert.AreEqual (null, w.GetValues (""), "#14"); + Assert.AreEqual (null, w.GetValues ("NotExistent"), "#15"); } [Test] public void Indexers () { #if NET_2_0 - Assertion.AssertEquals ("#1.1", "Value1", ((NameValueCollection)col)[0]); + Assert.AreEqual ("Value1", ((NameValueCollection)col)[0], "#1.1"); //FIXME: test also HttpRequestHeader and HttpResponseHeader #else - Assertion.AssertEquals ("#1", "Value1", col [0]); + Assert.AreEqual ("Value1", col [0], "#1"); #endif - Assertion.AssertEquals ("#2", "Value1", col ["Name1"]); - Assertion.AssertEquals ("#3", "Value1", col ["NAME1"]); + Assert.AreEqual ("Value1", col ["Name1"], "#2"); + Assert.AreEqual ("Value1", col ["NAME1"], "#3"); } [Test] @@ -176,7 +176,7 @@ namespace MonoTests.System.Net { col.Remove ("Name1"); col.Remove ("NameNotExist"); - Assertion.AssertEquals ("#1", 1, col.Count); + Assert.AreEqual (1, col.Count, "#1"); /* // this can only be tested in namespace System.Net @@ -184,7 +184,7 @@ namespace MonoTests.System.Net WebHeaderCollection col2 = new WebHeaderCollection (true); col2.Add ("Host", "foo"); col2.Remove ("Host"); - Assertion.Fail ("#2: should fail according to spec"); + Assert.Fail ("#2: should fail according to spec"); } catch (ArgumentException) {} */ } @@ -194,19 +194,19 @@ namespace MonoTests.System.Net { col.Add ("Name1", "Value1b"); col.Set ("Name1", "\t X \t"); - Assertion.AssertEquals ("#1", "X", col.Get ("Name1")); + Assert.AreEqual ("X", col.Get ("Name1"), "#1"); } [Test] public void IsRestricted () { - Assertion.Assert ("#1", !WebHeaderCollection.IsRestricted ("Xhost")); - Assertion.Assert ("#2", WebHeaderCollection.IsRestricted ("Host")); - Assertion.Assert ("#3", WebHeaderCollection.IsRestricted ("HOST")); - Assertion.Assert ("#4", WebHeaderCollection.IsRestricted ("Transfer-Encoding")); - Assertion.Assert ("#5", WebHeaderCollection.IsRestricted ("user-agent")); - Assertion.Assert ("#6", WebHeaderCollection.IsRestricted ("accept")); - Assertion.Assert ("#7", !WebHeaderCollection.IsRestricted ("accept-charset")); + Assert.IsTrue (!WebHeaderCollection.IsRestricted ("Xhost"), "#1"); + Assert.IsTrue (WebHeaderCollection.IsRestricted ("Host"), "#2"); + Assert.IsTrue (WebHeaderCollection.IsRestricted ("HOST"), "#3"); + Assert.IsTrue (WebHeaderCollection.IsRestricted ("Transfer-Encoding"), "#4"); + Assert.IsTrue (WebHeaderCollection.IsRestricted ("user-agent"), "#5"); + Assert.IsTrue (WebHeaderCollection.IsRestricted ("accept"), "#6"); + Assert.IsTrue (!WebHeaderCollection.IsRestricted ("accept-charset"), "#7"); } [Test] @@ -215,7 +215,7 @@ namespace MonoTests.System.Net col.Add ("Name1", "Value1b"); col.Add ("Name3", "Value3a\r\n Value3b"); col.Add ("Name4", " Value4 "); - Assertion.AssertEquals ("#1", "Name1: Value1,Value1b\r\nName2: Value2\r\nName3: Value3a\r\n Value3b\r\nName4: Value4\r\n\r\n", col.ToString ()); + Assert.AreEqual ("Name1: Value1,Value1b\r\nName2: Value2\r\nName3: Value3a\r\n Value3b\r\nName4: Value4\r\n\r\n", col.ToString (), "#1"); } [Test] diff --git a/mcs/class/System/Test/System.Net/WebProxyTest.cs b/mcs/class/System/Test/System.Net/WebProxyTest.cs index a73883adff9..49c7bbd7c93 100644 --- a/mcs/class/System/Test/System.Net/WebProxyTest.cs +++ b/mcs/class/System/Test/System.Net/WebProxyTest.cs @@ -29,38 +29,38 @@ namespace MonoTests.System.Net public void Constructors () { WebProxy p = new WebProxy (); - Assertion.Assert ("#1", p.Address == null); - Assertion.AssertEquals ("#2", 0, p.BypassArrayList.Count); - Assertion.AssertEquals ("#3", 0, p.BypassList.Length); - Assertion.AssertEquals ("#4", false, p.BypassProxyOnLocal); + Assert.IsTrue (p.Address == null, "#1"); + Assert.AreEqual (0, p.BypassArrayList.Count, "#2"); + Assert.AreEqual (0, p.BypassList.Length, "#3"); + Assert.AreEqual (false, p.BypassProxyOnLocal, "#4"); try { p.BypassList = null; - Assertion.Fail ("#5 not spec'd, but should follow ms.net implementation"); + Assert.Fail ("#5 not spec'd, but should follow ms.net implementation"); } catch (ArgumentNullException) { } p = new WebProxy ("webserver.com", 8080); - Assertion.AssertEquals ("#6", new Uri ("http://webserver.com:8080/"), p.Address); + Assert.AreEqual (new Uri ("http://webserver.com:8080/"), p.Address, "#6"); p = new WebProxy ("webserver"); - Assertion.AssertEquals ("#7", new Uri ("http://webserver"), p.Address); + Assert.AreEqual (new Uri ("http://webserver"), p.Address, "#7"); p = new WebProxy ("webserver.com"); - Assertion.AssertEquals ("#8", new Uri ("http://webserver.com"), p.Address); + Assert.AreEqual (new Uri ("http://webserver.com"), p.Address, "#8"); p = new WebProxy ("http://webserver.com"); - Assertion.AssertEquals ("#9", new Uri ("http://webserver.com"), p.Address); + Assert.AreEqual (new Uri ("http://webserver.com"), p.Address, "#9"); p = new WebProxy ("file://webserver"); - Assertion.AssertEquals ("#10", new Uri ("file://webserver"), p.Address); + Assert.AreEqual (new Uri ("file://webserver"), p.Address, "#10"); p = new WebProxy ("http://www.contoso.com", true, null, null); - Assertion.AssertEquals ("#11", 0, p.BypassList.Length); - Assertion.AssertEquals ("#12", 0, p.BypassArrayList.Count); + Assert.AreEqual (0, p.BypassList.Length, "#11"); + Assert.AreEqual (0, p.BypassArrayList.Count, "#12"); try { p = new WebProxy ("http://contoso.com", true, new string [] { "?^!@#$%^&}{][" }, null); - Assertion.Fail ("#13: illegal regular expression"); + Assert.Fail ("#13: illegal regular expression"); } catch (ArgumentException) { } } @@ -74,24 +74,24 @@ namespace MonoTests.System.Net WebProxy p = new WebProxy (proxy1, true); p.BypassArrayList.Add ("http://proxy2.contoso.com"); p.BypassArrayList.Add ("http://proxy2.contoso.com"); - Assertion.AssertEquals ("#1", 2, p.BypassList.Length); - Assertion.Assert ("#2", !p.IsBypassed (new Uri ("http://www.google.com"))); - Assertion.Assert ("#3", p.IsBypassed (proxy2)); - Assertion.AssertEquals ("#4", proxy2, p.GetProxy (proxy2)); + Assert.AreEqual (2, p.BypassList.Length, "#1"); + Assert.IsTrue (!p.IsBypassed (new Uri ("http://www.google.com")), "#2"); + Assert.IsTrue (p.IsBypassed (proxy2), "#3"); + Assert.AreEqual (proxy2, p.GetProxy (proxy2), "#4"); p.BypassArrayList.Add ("?^!@#$%^&}{]["); - Assertion.AssertEquals ("#10", 3, p.BypassList.Length); + Assert.AreEqual (3, p.BypassList.Length, "#10"); try { - Assertion.Assert ("#11", !p.IsBypassed (proxy2)); - Assertion.Assert ("#12", !p.IsBypassed (new Uri ("http://www.x.com"))); - Assertion.AssertEquals ("#13", proxy1, p.GetProxy (proxy2)); + Assert.IsTrue (!p.IsBypassed (proxy2), "#11"); + Assert.IsTrue (!p.IsBypassed (new Uri ("http://www.x.com")), "#12"); + Assert.AreEqual (proxy1, p.GetProxy (proxy2), "#13"); // hmm... although #11 and #13 succeeded before (#3 resp. #4), // it now fails to bypass, and the IsByPassed and GetProxy // methods do not fail.. so when an illegal regular // expression is added through this property it's ignored. // probably an ms.net bug?? :( } catch (ArgumentException) { - Assertion.Fail ("#15: illegal regular expression"); + Assert.Fail ("#15: illegal regular expression"); } } @@ -104,23 +104,23 @@ namespace MonoTests.System.Net WebProxy p = new WebProxy (proxy1, true); try { p.BypassList = new string [] { "http://proxy2.contoso.com", "?^!@#$%^&}{][" }; - Assertion.Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException) { // weird, this way invalid regex's fail again.. } - Assertion.AssertEquals ("#2", 2, p.BypassList.Length); + Assert.AreEqual (2, p.BypassList.Length, "#2"); // but it did apparenly store the regex's ! p.BypassList = new string [] { "http://www.x.com" }; - Assertion.AssertEquals ("#3", 1, p.BypassList.Length); + Assert.AreEqual (1, p.BypassList.Length, "#3"); try { p.BypassList = null; - Assertion.Fail ("#4"); + Assert.Fail ("#4"); } catch (ArgumentNullException) { } - Assertion.AssertEquals ("#4", 1, p.BypassList.Length); + Assert.AreEqual (1, p.BypassList.Length, "#4"); } [Test] @@ -132,42 +132,42 @@ namespace MonoTests.System.Net public void IsByPassed () { WebProxy p = new WebProxy ("http://proxy.contoso.com", true); - Assertion.Assert ("#1", !p.IsBypassed (new Uri ("http://www.google.com"))); - Assertion.Assert ("#2", p.IsBypassed (new Uri ("http://localhost/index.html"))); - Assertion.Assert ("#3", p.IsBypassed (new Uri ("http://localhost:8080/index.html"))); - Assertion.Assert ("#4", p.IsBypassed (new Uri ("http://loopback:8080/index.html"))); - Assertion.Assert ("#5", p.IsBypassed (new Uri ("http://127.0.0.01:8080/index.html"))); - Assertion.Assert ("#6", p.IsBypassed (new Uri ("http://webserver/index.html"))); - Assertion.Assert ("#7", !p.IsBypassed (new Uri ("http://webserver.com/index.html"))); + Assert.IsTrue (!p.IsBypassed (new Uri ("http://www.google.com")), "#1"); + Assert.IsTrue (p.IsBypassed (new Uri ("http://localhost/index.html")), "#2"); + Assert.IsTrue (p.IsBypassed (new Uri ("http://localhost:8080/index.html")), "#3"); + Assert.IsTrue (p.IsBypassed (new Uri ("http://loopback:8080/index.html")), "#4"); + Assert.IsTrue (p.IsBypassed (new Uri ("http://127.0.0.01:8080/index.html")), "#5"); + Assert.IsTrue (p.IsBypassed (new Uri ("http://webserver/index.html")), "#6"); + Assert.IsTrue (!p.IsBypassed (new Uri ("http://webserver.com/index.html")), "#7"); p = new WebProxy ("http://proxy.contoso.com", false); - Assertion.Assert ("#11", !p.IsBypassed (new Uri ("http://www.google.com"))); - Assertion.Assert ("#12: lamespec of ms.net", p.IsBypassed (new Uri ("http://localhost/index.html"))); - Assertion.Assert ("#13: lamespec of ms.net", p.IsBypassed (new Uri ("http://localhost:8080/index.html"))); - Assertion.Assert ("#14: lamespec of ms.net", p.IsBypassed (new Uri ("http://loopback:8080/index.html"))); - Assertion.Assert ("#15: lamespec of ms.net", p.IsBypassed (new Uri ("http://127.0.0.01:8080/index.html"))); - Assertion.Assert ("#16", !p.IsBypassed (new Uri ("http://webserver/index.html"))); + Assert.IsTrue (!p.IsBypassed (new Uri ("http://www.google.com")), "#11"); + Assert.IsTrue (p.IsBypassed (new Uri ("http://localhost/index.html")), "#12: lamespec of ms.net"); + Assert.IsTrue (p.IsBypassed (new Uri ("http://localhost:8080/index.html")), "#13: lamespec of ms.net"); + Assert.IsTrue (p.IsBypassed (new Uri ("http://loopback:8080/index.html")), "#14: lamespec of ms.net"); + Assert.IsTrue (p.IsBypassed (new Uri ("http://127.0.0.01:8080/index.html")), "#15: lamespec of ms.net"); + Assert.IsTrue (!p.IsBypassed (new Uri ("http://webserver/index.html")), "#16"); p.BypassList = new string [] { "google.com", "contoso.com" }; - Assertion.Assert ("#20", p.IsBypassed (new Uri ("http://www.google.com"))); - Assertion.Assert ("#21", p.IsBypassed (new Uri ("http://www.GOOGLE.com"))); - Assertion.Assert ("#22", p.IsBypassed (new Uri ("http://www.contoso.com:8080/foo/bar/index.html"))); - Assertion.Assert ("#23", !p.IsBypassed (new Uri ("http://www.contoso2.com:8080/foo/bar/index.html"))); - Assertion.Assert ("#24", !p.IsBypassed (new Uri ("http://www.foo.com:8080/contoso.com.html"))); + Assert.IsTrue (p.IsBypassed (new Uri ("http://www.google.com")), "#20"); + Assert.IsTrue (p.IsBypassed (new Uri ("http://www.GOOGLE.com")), "#21"); + Assert.IsTrue (p.IsBypassed (new Uri ("http://www.contoso.com:8080/foo/bar/index.html")), "#22"); + Assert.IsTrue (!p.IsBypassed (new Uri ("http://www.contoso2.com:8080/foo/bar/index.html")), "#23"); + Assert.IsTrue (!p.IsBypassed (new Uri ("http://www.foo.com:8080/contoso.com.html")), "#24"); p.BypassList = new string [] { "https" }; - Assertion.Assert ("#30", !p.IsBypassed (new Uri ("http://www.google.com"))); - Assertion.Assert ("#31", p.IsBypassed (new Uri ("https://www.google.com"))); + Assert.IsTrue (!p.IsBypassed (new Uri ("http://www.google.com")), "#30"); + Assert.IsTrue (p.IsBypassed (new Uri ("https://www.google.com")), "#31"); } [Test] public void IsByPassed_Address_Null () { WebProxy p = new WebProxy ((Uri) null, false); - Assertion.Assert ("#1", p.IsBypassed (new Uri ("http://www.google.com"))); + Assert.IsTrue (p.IsBypassed (new Uri ("http://www.google.com")), "#1"); p = new WebProxy ((Uri) null, true); - Assertion.Assert ("#2", p.IsBypassed (new Uri ("http://www.google.com"))); + Assert.IsTrue (p.IsBypassed (new Uri ("http://www.google.com")), "#2"); } [Test] @@ -179,7 +179,7 @@ namespace MonoTests.System.Net WebProxy p = new WebProxy ("http://proxy.contoso.com", true); try { p.IsBypassed (null); - Assertion.Fail ("#A1"); + Assert.Fail ("#A1"); #if NET_2_0 } catch (ArgumentNullException ex) { Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2"); @@ -196,7 +196,7 @@ namespace MonoTests.System.Net p = new WebProxy ((Uri) null); try { p.IsBypassed (null); - Assertion.Fail ("#B1"); + Assert.Fail ("#B1"); #if NET_2_0 } catch (ArgumentNullException ex) { Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2"); @@ -213,7 +213,7 @@ namespace MonoTests.System.Net p = new WebProxy ((Uri) null, true); try { p.IsBypassed (null); - Assertion.Fail ("#C1"); + Assert.Fail ("#C1"); #if NET_2_0 } catch (ArgumentNullException ex) { Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#C2"); diff --git a/mcs/class/System/Test/System.Net/WebRequestTest.cs b/mcs/class/System/Test/System.Net/WebRequestTest.cs index 2b218a0f106..636a88d19b3 100644 --- a/mcs/class/System/Test/System.Net/WebRequestTest.cs +++ b/mcs/class/System/Test/System.Net/WebRequestTest.cs @@ -202,41 +202,41 @@ namespace MonoTests.System.Net { public void All () { WebRequest req = WebRequest.Create ("http://www.contoso.com"); - Assertion.Assert ("#1", req is HttpWebRequest); + Assert.IsTrue (req is HttpWebRequest, "#1"); req = WebRequest.Create ("https://www.contoso.com"); - Assertion.Assert ("#2", req is HttpWebRequest); + Assert.IsTrue (req is HttpWebRequest, "#2"); req = WebRequest.Create ("file://www.contoso.com"); - Assertion.Assert ("#3", req is FileWebRequest); + Assert.IsTrue (req is FileWebRequest, "#3"); #if NET_2_0 req = WebRequest.Create ("ftp://www.contoso.com"); - Assertion.Assert ("#4", req is FtpWebRequest); + Assert.IsTrue (req is FtpWebRequest, "#4"); #endif WebRequest.RegisterPrefix ("http://www.contoso.com", new TestWebRequestCreator ()); bool ret = WebRequest.RegisterPrefix ("http://WWW.contoso.com", new TestWebRequestCreator ()); - Assertion.AssertEquals ("#5a", false, ret); + Assert.AreEqual (false, ret, "#5a"); ret = WebRequest.RegisterPrefix ("http://www.contoso.com/foo/bar", new TestWebRequestCreator2 ()); - Assertion.AssertEquals ("#5b", true, ret); + Assert.AreEqual (true, ret, "#5b"); ret = WebRequest.RegisterPrefix ("http://www", new TestWebRequestCreator3 ()); - Assertion.AssertEquals ("#5c", true, ret); + Assert.AreEqual (true, ret, "#5c"); req = WebRequest.Create ("http://WWW.contoso.com"); - Assertion.Assert ("#6", req is TestWebRequest); + Assert.IsTrue (req is TestWebRequest, "#6"); req = WebRequest.Create ("http://WWW.contoso.com/foo/bar/index.html"); - Assertion.Assert ("#7", req is TestWebRequest2); + Assert.IsTrue (req is TestWebRequest2, "#7"); req = WebRequest.Create ("http://WWW.x.com"); - Assertion.Assert ("#8", req is TestWebRequest3); + Assert.IsTrue (req is TestWebRequest3, "#8"); req = WebRequest.Create ("http://WWW.c"); - Assertion.Assert ("#9", req is TestWebRequest3); + Assert.IsTrue (req is TestWebRequest3, "#9"); req = WebRequest.CreateDefault (new Uri("http://WWW.contoso.com")); - Assertion.Assert ("#10", req is HttpWebRequest); + Assert.IsTrue (req is HttpWebRequest, "#10"); try { req = WebRequest.Create ("tcp://www.contoso.com"); - Assertion.Fail ("#11 should have failed with NotSupportedException"); + Assert.Fail ("#11 should have failed with NotSupportedException"); } catch (NotSupportedException) { } } @@ -328,18 +328,20 @@ namespace MonoTests.System.Net { } [Test] //BNC#323452 - [Category ("NotWorking")] public void TestFailedConnection () { try { WebRequest.Create ("http://127.0.0.1:0/non-existant.txt").GetResponse (); Assert.Fail ("Should have raised an exception"); } catch (Exception e) { - Assert.IsTrue (e is WebException); + Assert.IsTrue (e is WebException, "Got " + e.GetType ().Name + ": " + e.Message); //#if NET_2_0 e.Message == "Unable to connect to the remote server" //#if NET_1_1 e.Message == "The underlying connection was closed: Unable to connect to the remote server." + Assert.AreEqual (((WebException)e).Status, WebExceptionStatus.ConnectFailure); + //#if !NET_1_1 (this is not true in .NET 1.x) + Assert.IsNotNull (e.InnerException); Assert.IsTrue (e.InnerException is Socks.SocketException, "InnerException should be SocketException"); //e.Message == "The requested address is not valid in its context 127.0.0.1:0" //#endif @@ -349,14 +351,14 @@ namespace MonoTests.System.Net { [Test] //BNC#323452 public void TestFailedResolution () { - string domain = "thisdomaindoesnotexist.monotestcase.x"; try { - WebRequest.Create ("http://" + domain + "/non-existant.txt").GetResponse (); + WebRequest.Create ("http://thisdomaindoesnotexist.monotestcase.x/non-existant.txt").GetResponse (); Assert.Fail ("Should have raised an exception"); } catch (Exception e) { Assert.IsTrue (e is WebException); //#if NET_2_0 e.Message == "The underlying connection was closed: The remote name could not be resolved." //#if NET_1_1 e.Message == "The remote name could not be resolved: 'thisdomaindoesnotexist.monotestcase.x'" + Assert.AreEqual (((WebException)e).Status, WebExceptionStatus.NameResolutionFailure); Assert.IsNull (e.InnerException); } } diff --git a/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/ChangeLog b/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/ChangeLog index c1d162a92c1..5bf088696f2 100644 --- a/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/ChangeLog +++ b/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/ChangeLog @@ -1,3 +1,8 @@ +2009-06-26 Robert Jordan + + * X509CertificateCollectionTest.cs, + X509ChainPolicyTest.cs: Upgrade to new NUnit style. + 2009-03-26 Sebastien Pouliot * X509ChainPolicyTest.cs: Add a small sleep between the Reset and diff --git a/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509CertificateCollectionTest.cs b/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509CertificateCollectionTest.cs index 6affe82e944..bcb8854963a 100644 --- a/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509CertificateCollectionTest.cs +++ b/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509CertificateCollectionTest.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.X509Certificates { [TestFixture] - public class X509CertificateCollectionTest : Assertion { + public class X509CertificateCollectionTest { private static byte[] cert_a = { 0x30,0x82,0x01,0xFF,0x30,0x82,0x01,0x6C,0x02,0x05,0x02,0x72,0x00,0x06,0xE8,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x02,0x05,0x00,0x30,0x5F,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x0A,0x13,0x17,0x52,0x53,0x41,0x20,0x44,0x61,0x74,0x61,0x20,0x53,0x65,0x63,0x75,0x72,0x69,0x74,0x79,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x2E,0x30,0x2C,0x06,0x03,0x55,0x04,0x0B,0x13,0x25,0x53,0x65,0x63,0x75,0x72,0x65,0x20,0x53,0x65,0x72,0x76, 0x65,0x72,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x1E,0x17,0x0D,0x39,0x36,0x30,0x33,0x31,0x32,0x31,0x38,0x33,0x38,0x34,0x37,0x5A,0x17,0x0D,0x39,0x37,0x30,0x33,0x31,0x32,0x31,0x38,0x33,0x38,0x34,0x36,0x5A,0x30,0x61,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0A,0x43,0x61,0x6C,0x69,0x66,0x6F,0x72,0x6E,0x69,0x61,0x31,0x14,0x30,0x12,0x06,0x03, @@ -59,14 +59,14 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { public void Constructor () { X509CertificateCollection c = new X509CertificateCollection (); - AssertEquals ("Count", 0, c.Count); + Assert.AreEqual (0, c.Count, "Count"); } [Test] public void Constructor_CertificateArray () { X509CertificateCollection c = new X509CertificateCollection (range); - AssertEquals ("Count", 2, c.Count); + Assert.AreEqual (2, c.Count, "Count"); } [Test] @@ -82,7 +82,7 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { { X509CertificateCollection coll = new X509CertificateCollection (range); X509CertificateCollection c = new X509CertificateCollection (coll); - AssertEquals ("Count", 2, c.Count); + Assert.AreEqual (2, c.Count, "Count"); } [Test] @@ -97,14 +97,14 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { public void Add () { X509CertificateCollection c = new X509CertificateCollection (); - AssertEquals ("Add a", 0, c.Add (x509a)); - AssertEquals ("1", 1, c.Count); + Assert.AreEqual (0, c.Add (x509a), "Add a"); + Assert.AreEqual (1, c.Count, "1"); - AssertEquals ("Add a(dup)", 1, c.Add (x509a)); - AssertEquals ("2", 2, c.Count); + Assert.AreEqual (1, c.Add (x509a), "Add a(dup)"); + Assert.AreEqual (2, c.Count, "2"); - AssertEquals ("Add b", 2, c.Add (x509b)); - AssertEquals ("3", 3, c.Count); + Assert.AreEqual (2, c.Add (x509b), "Add b"); + Assert.AreEqual (3, c.Count, "3"); } [Test] @@ -121,13 +121,13 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { X509CertificateCollection c = new X509CertificateCollection (); c.AddRange (range); - AssertEquals ("Range(a+b)", 2, c.Count); + Assert.AreEqual (2, c.Count, "Range(a+b)"); c.AddRange (range); - AssertEquals ("Duplicate(a+b)", 4, c.Count); + Assert.AreEqual (4, c.Count, "Duplicate(a+b)"); c.Add (x509c); - AssertEquals ("New(c)", 5, c.Count); + Assert.AreEqual (5, c.Count, "New(c)"); } [Test] @@ -146,20 +146,20 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { X509CertificateCollection c = new X509CertificateCollection (); c.AddRange (c); - AssertEquals ("Self(none)", 0, c.Count); + Assert.AreEqual (0, c.Count, "Self(none)"); c.AddRange (coll); - AssertEquals ("Range(a+b)", 2, c.Count); + Assert.AreEqual (2, c.Count, "Range(a+b)"); c.AddRange (coll); - AssertEquals ("Duplicate(a+b)", 4, c.Count); + Assert.AreEqual (4, c.Count, "Duplicate(a+b)"); c.Add (x509c); - AssertEquals ("New(c)", 5, c.Count); + Assert.AreEqual (5, c.Count, "New(c)"); // This leads to an infinite loop until the runtime throws an OutOfMemoryException //c.AddRange (c); - //AssertEquals ("Self(double)", 10, c.Count); + //Assert.AreEqual (10, c.Count, "Self(double)"); } [Test] @@ -175,16 +175,16 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { public void Contains () { X509CertificateCollection c = new X509CertificateCollection (); - Assert ("Empty-A", !c.Contains (x509a)); - Assert ("Empty-Null", !c.Contains (null)); + Assert.IsTrue (!c.Contains (x509a), "Empty-A"); + Assert.IsTrue (!c.Contains (null), "Empty-Null"); c.Add (x509a); - Assert ("A-A", c.Contains (x509a)); - Assert ("A-B", !c.Contains (x509b)); + Assert.IsTrue (c.Contains (x509a), "A-A"); + Assert.IsTrue (!c.Contains (x509b), "A-B"); // works by value not by object reference X509Certificate x = new X509Certificate (cert_a); - Assert ("A-x", c.Contains (x)); + Assert.IsTrue (c.Contains (x), "A-x"); } [Test] @@ -221,27 +221,27 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { X509CertificateCollection c = new X509CertificateCollection (); c.Add (x509a); c.CopyTo (array, 0); - Assert ("CopyTo", x509a.Equals (array [0])); + Assert.IsTrue (x509a.Equals (array [0]), "CopyTo"); } [Test] public void IndexOf () { X509CertificateCollection c = new X509CertificateCollection (); - AssertEquals ("Empty-A", -1, c.IndexOf (x509a)); - AssertEquals ("Empty-Null", -1, c.IndexOf (null)); + Assert.AreEqual (-1, c.IndexOf (x509a), "Empty-A"); + Assert.AreEqual (-1, c.IndexOf (null), "Empty-Null"); c.Add (x509a); - AssertEquals ("A-A", 0, c.IndexOf (x509a)); - AssertEquals ("A-B", -1, c.IndexOf (x509b)); + Assert.AreEqual (0, c.IndexOf (x509a), "A-A"); + Assert.AreEqual (-1, c.IndexOf (x509b), "A-B"); // works by object reference (not value) X509Certificate x = new X509Certificate (cert_a); - Assert ("!ReferenceEquals", !Object.ReferenceEquals (x509a, x)); + Assert.IsTrue (!Object.ReferenceEquals (x509a, x), "!ReferenceEquals"); #if NET_2_0 - AssertEquals ("A-x", 0, c.IndexOf (x)); + Assert.AreEqual (0, c.IndexOf (x), "A-x"); #else - AssertEquals ("A-x", -1, c.IndexOf (x)); + Assert.AreEqual (-1, c.IndexOf (x), "A-x"); #endif } @@ -250,13 +250,13 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { { X509CertificateCollection c = new X509CertificateCollection (); c.Add (x509a); - AssertEquals ("a=0", 0, c.IndexOf (x509a)); + Assert.AreEqual (0, c.IndexOf (x509a), "a=0"); c.Add (x509c); - AssertEquals ("c=1", 1, c.IndexOf (x509c)); + Assert.AreEqual (1, c.IndexOf (x509c), "c=1"); c.Insert (1, x509b); - AssertEquals ("1", 1, c.IndexOf (x509b)); - AssertEquals ("2", 2, c.IndexOf (x509c)); + Assert.AreEqual (1, c.IndexOf (x509b), "1"); + Assert.AreEqual (2, c.IndexOf (x509c), "2"); } [Test] @@ -264,9 +264,9 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { { X509CertificateCollection c = new X509CertificateCollection (); c.Add (x509a); - AssertEquals ("Count==1", 1, c.Count); + Assert.AreEqual (1, c.Count, "Count==1"); c.Remove (x509a); - AssertEquals ("Remove,Count==0", 0, c.Count); + Assert.AreEqual (0, c.Count, "Remove Count==0"); } [Test] @@ -290,17 +290,17 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { try { // don't fail in this block c.Add (x509a); - AssertEquals ("Read,Count==1", 1, c.Count); + Assert.AreEqual (1, c.Count, "Read Count==1"); // works by object reference (not by value) x = new X509Certificate (cert_a); - Assert ("!ReferenceEquals", !Object.ReferenceEquals (x509a, x)); + Assert.IsTrue (!Object.ReferenceEquals (x509a, x), "!ReferenceEquals"); } catch {} // fail here! (well for 1.x) c.Remove (x); - AssertEquals ("Remove-by-value,Count==0", 0, c.Count); + Assert.AreEqual (0, c.Count, "Remove-by-value Count==0"); } [Test] diff --git a/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509ChainPolicyTest.cs b/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509ChainPolicyTest.cs index bfa0b005233..8c74173c4c6 100644 --- a/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509ChainPolicyTest.cs +++ b/mcs/class/System/Test/System.Security.Cryptography.X509Certificates/X509ChainPolicyTest.cs @@ -40,7 +40,7 @@ using System.Threading; namespace MonoTests.System.Security.Cryptography.X509Certificates { [TestFixture] - public class X509ChainPolicyTest : Assertion { + public class X509ChainPolicyTest { static string signingTimeOid = "1.2.840.113549.1.9.5"; @@ -55,15 +55,15 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { { X509ChainPolicy cp = GetPolicy (); // default properties - AssertEquals ("ApplicationPolicy", 0, cp.ApplicationPolicy.Count); - AssertEquals ("CertificatePolicy", 0, cp.CertificatePolicy.Count); - AssertEquals ("ExtraStore", 0, cp.ExtraStore.Count); - AssertEquals ("RevocationFlag", X509RevocationFlag.ExcludeRoot, cp.RevocationFlag); - AssertEquals ("RevocationMode", X509RevocationMode.Online, cp.RevocationMode); - AssertEquals ("UrlRetrievalTimeout", 0, cp.UrlRetrievalTimeout.Ticks); - AssertEquals ("VerificationFlags", X509VerificationFlags.NoFlag, cp.VerificationFlags); + Assert.AreEqual (0, cp.ApplicationPolicy.Count, "ApplicationPolicy"); + Assert.AreEqual (0, cp.CertificatePolicy.Count, "CertificatePolicy"); + Assert.AreEqual (0, cp.ExtraStore.Count, "ExtraStore"); + Assert.AreEqual (X509RevocationFlag.ExcludeRoot, cp.RevocationFlag, "RevocationFlag"); + Assert.AreEqual (X509RevocationMode.Online, cp.RevocationMode, "RevocationMode"); + Assert.AreEqual (0, cp.UrlRetrievalTimeout.Ticks, "UrlRetrievalTimeout"); + Assert.AreEqual (X509VerificationFlags.NoFlag, cp.VerificationFlags, "VerificationFlags"); DateTime vt = cp.VerificationTime; - Assert ("VerificationTime", ((vt <= DateTime.Now) && (vt > DateTime.Now.AddMinutes (-1)))); + Assert.IsTrue (((vt <= DateTime.Now) && (vt > DateTime.Now.AddMinutes (-1))), "VerificationTime"); } [Test] @@ -71,7 +71,7 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { { X509ChainPolicy cp = GetPolicy (); cp.ApplicationPolicy.Add (new Oid (signingTimeOid)); - AssertEquals ("ApplicationPolicy", 1, cp.ApplicationPolicy.Count); + Assert.AreEqual (1, cp.ApplicationPolicy.Count, "ApplicationPolicy"); } [Test] @@ -80,10 +80,10 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { X509ChainPolicy cp = GetPolicy (); cp.ApplicationPolicy.Add (new Oid (signingTimeOid)); OidCollection oc = cp.ApplicationPolicy; - AssertEquals ("ApplicationPolicy-1", 1, oc.Count); + Assert.AreEqual (1, oc.Count, "ApplicationPolicy-1"); cp.Reset (); - AssertEquals ("ApplicationPolicy-2", 1, oc.Count); - AssertEquals ("ApplicationPolicy-3", 0, cp.ApplicationPolicy.Count); + Assert.AreEqual (1, oc.Count, "ApplicationPolicy-2"); + Assert.AreEqual (0, cp.ApplicationPolicy.Count, "ApplicationPolicy-3"); } [Test] @@ -91,7 +91,7 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { { X509ChainPolicy cp = GetPolicy (); cp.CertificatePolicy.Add (new Oid (signingTimeOid)); - AssertEquals ("CertificatePolicy", 1, cp.CertificatePolicy.Count); + Assert.AreEqual (1, cp.CertificatePolicy.Count, "CertificatePolicy"); } [Test] @@ -100,10 +100,10 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { X509ChainPolicy cp = GetPolicy (); cp.CertificatePolicy.Add (new Oid (signingTimeOid)); OidCollection oc = cp.CertificatePolicy; - AssertEquals ("CertificatePolicy-1", 1, oc.Count); + Assert.AreEqual (1, oc.Count, "CertificatePolicy-1"); cp.Reset (); - AssertEquals ("CertificatePolicy-2", 1, oc.Count); - AssertEquals ("CertificatePolicy-3", 0, cp.CertificatePolicy.Count); + Assert.AreEqual (1, oc.Count, "CertificatePolicy-2"); + Assert.AreEqual (0, cp.CertificatePolicy.Count, "CertificatePolicy-3"); } [Test] @@ -111,7 +111,7 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { { X509ChainPolicy cp = GetPolicy (); cp.ExtraStore.Add (new X509Certificate2 ()); - AssertEquals ("ExtraStore", 1, cp.ExtraStore.Count); + Assert.AreEqual (1, cp.ExtraStore.Count, "ExtraStore"); } [Test] @@ -120,10 +120,10 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { X509ChainPolicy cp = GetPolicy (); cp.ExtraStore.Add (new X509Certificate2 ()); X509Certificate2Collection cc = cp.ExtraStore; - AssertEquals ("ExtraStore-1", 1, cc.Count); + Assert.AreEqual (1, cc.Count, "ExtraStore-1"); cp.Reset (); - AssertEquals ("ExtraStore-2", 1, cc.Count); - AssertEquals ("ExtraStore-3", 0, cp.ExtraStore.Count); + Assert.AreEqual (1, cc.Count, "ExtraStore-2"); + Assert.AreEqual (0, cp.ExtraStore.Count, "ExtraStore-3"); } [Test] @@ -131,11 +131,11 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { { X509ChainPolicy cp = GetPolicy (); cp.RevocationFlag = X509RevocationFlag.EndCertificateOnly; - AssertEquals ("EndCertificateOnly", X509RevocationFlag.EndCertificateOnly, cp.RevocationFlag); + Assert.AreEqual (X509RevocationFlag.EndCertificateOnly, cp.RevocationFlag, "EndCertificateOnly"); cp.RevocationFlag = X509RevocationFlag.EntireChain; - AssertEquals ("EntireChain", X509RevocationFlag.EntireChain, cp.RevocationFlag); + Assert.AreEqual (X509RevocationFlag.EntireChain, cp.RevocationFlag, "EntireChain"); cp.RevocationFlag = X509RevocationFlag.ExcludeRoot; - AssertEquals ("ExcludeRoot", X509RevocationFlag.ExcludeRoot, cp.RevocationFlag); + Assert.AreEqual (X509RevocationFlag.ExcludeRoot, cp.RevocationFlag, "ExcludeRoot"); } [Test] @@ -151,11 +151,11 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { { X509ChainPolicy cp = GetPolicy (); cp.RevocationMode = X509RevocationMode.NoCheck; - AssertEquals ("NoCheck", X509RevocationMode.NoCheck, cp.RevocationMode); + Assert.AreEqual (X509RevocationMode.NoCheck, cp.RevocationMode, "NoCheck"); cp.RevocationMode = X509RevocationMode.Offline; - AssertEquals ("Offline", X509RevocationMode.Offline, cp.RevocationMode); + Assert.AreEqual (X509RevocationMode.Offline, cp.RevocationMode, "Offline"); cp.RevocationMode = X509RevocationMode.Online; - AssertEquals ("Online", X509RevocationMode.Online, cp.RevocationMode); + Assert.AreEqual (X509RevocationMode.Online, cp.RevocationMode, "Online"); } [Test] @@ -171,13 +171,13 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { { X509ChainPolicy cp = GetPolicy (); cp.UrlRetrievalTimeout = new TimeSpan (100); - AssertEquals ("TimeSpan=100", 100, cp.UrlRetrievalTimeout.Ticks); + Assert.AreEqual (100, cp.UrlRetrievalTimeout.Ticks, "TimeSpan=100"); cp.UrlRetrievalTimeout = new TimeSpan (0); - AssertEquals ("TimeSpan=0", 0, cp.UrlRetrievalTimeout.Ticks); + Assert.AreEqual (0, cp.UrlRetrievalTimeout.Ticks, "TimeSpan=0"); cp.UrlRetrievalTimeout = TimeSpan.MinValue; - AssertEquals ("TimeSpan=MinValue", TimeSpan.MinValue, cp.UrlRetrievalTimeout); + Assert.AreEqual (TimeSpan.MinValue, cp.UrlRetrievalTimeout, "TimeSpan=MinValue"); cp.UrlRetrievalTimeout = TimeSpan.MaxValue; - AssertEquals ("TimeSpan=MaxValue", TimeSpan.MaxValue, cp.UrlRetrievalTimeout); + Assert.AreEqual (TimeSpan.MaxValue, cp.UrlRetrievalTimeout, "TimeSpan=MaxValue"); } [Test] @@ -185,33 +185,33 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { { X509ChainPolicy cp = GetPolicy (); cp.VerificationFlags = X509VerificationFlags.AllFlags; - AssertEquals ("AllFlags", X509VerificationFlags.AllFlags, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.AllFlags, cp.VerificationFlags, "AllFlags"); cp.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority; - AssertEquals ("AllowUnknownCertificateAuthority", X509VerificationFlags.AllowUnknownCertificateAuthority, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.AllowUnknownCertificateAuthority, cp.VerificationFlags, "AllowUnknownCertificateAuthority"); cp.VerificationFlags = X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown; - AssertEquals ("IgnoreCertificateAuthorityRevocationUnknown", X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown, cp.VerificationFlags, "IgnoreCertificateAuthorityRevocationUnknown"); cp.VerificationFlags = X509VerificationFlags.IgnoreCtlNotTimeValid; - AssertEquals ("IgnoreCtlNotTimeValid", X509VerificationFlags.IgnoreCtlNotTimeValid, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.IgnoreCtlNotTimeValid, cp.VerificationFlags, "IgnoreCtlNotTimeValid"); cp.VerificationFlags = X509VerificationFlags.IgnoreCtlSignerRevocationUnknown; - AssertEquals ("IgnoreCtlSignerRevocationUnknown", X509VerificationFlags.IgnoreCtlSignerRevocationUnknown, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.IgnoreCtlSignerRevocationUnknown, cp.VerificationFlags, "IgnoreCtlSignerRevocationUnknown"); cp.VerificationFlags = X509VerificationFlags.IgnoreEndRevocationUnknown; - AssertEquals ("IgnoreEndRevocationUnknown", X509VerificationFlags.IgnoreEndRevocationUnknown, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.IgnoreEndRevocationUnknown, cp.VerificationFlags, "IgnoreEndRevocationUnknown"); cp.VerificationFlags = X509VerificationFlags.IgnoreInvalidBasicConstraints; - AssertEquals ("IgnoreInvalidBasicConstraints", X509VerificationFlags.IgnoreInvalidBasicConstraints, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.IgnoreInvalidBasicConstraints, cp.VerificationFlags, "IgnoreInvalidBasicConstraints"); cp.VerificationFlags = X509VerificationFlags.IgnoreInvalidName; - AssertEquals ("IgnoreInvalidName", X509VerificationFlags.IgnoreInvalidName, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.IgnoreInvalidName, cp.VerificationFlags, "IgnoreInvalidName"); cp.VerificationFlags = X509VerificationFlags.IgnoreInvalidPolicy; - AssertEquals ("IgnoreInvalidPolicy", X509VerificationFlags.IgnoreInvalidPolicy, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.IgnoreInvalidPolicy, cp.VerificationFlags, "IgnoreInvalidPolicy"); cp.VerificationFlags = X509VerificationFlags.IgnoreNotTimeNested; - AssertEquals ("IgnoreNotTimeNested", X509VerificationFlags.IgnoreNotTimeNested, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.IgnoreNotTimeNested, cp.VerificationFlags, "IgnoreNotTimeNested"); cp.VerificationFlags = X509VerificationFlags.IgnoreNotTimeValid; - AssertEquals ("IgnoreNotTimeValid", X509VerificationFlags.IgnoreNotTimeValid, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.IgnoreNotTimeValid, cp.VerificationFlags, "IgnoreNotTimeValid"); cp.VerificationFlags = X509VerificationFlags.IgnoreRootRevocationUnknown; - AssertEquals ("IgnoreRootRevocationUnknown", X509VerificationFlags.IgnoreRootRevocationUnknown, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.IgnoreRootRevocationUnknown, cp.VerificationFlags, "IgnoreRootRevocationUnknown"); cp.VerificationFlags = X509VerificationFlags.IgnoreWrongUsage; - AssertEquals ("IgnoreWrongUsage", X509VerificationFlags.IgnoreWrongUsage, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.IgnoreWrongUsage, cp.VerificationFlags, "IgnoreWrongUsage"); cp.VerificationFlags = X509VerificationFlags.NoFlag; - AssertEquals ("NoFlag", X509VerificationFlags.NoFlag, cp.VerificationFlags); + Assert.AreEqual (X509VerificationFlags.NoFlag, cp.VerificationFlags, "NoFlag"); } [Test] @@ -226,15 +226,15 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { public void VerificationTime () { X509ChainPolicy cp = GetPolicy (); - AssertEquals ("Kind=Local", DateTimeKind.Local, cp.VerificationTime.Kind); + Assert.AreEqual (DateTimeKind.Local, cp.VerificationTime.Kind, "Kind=Local"); cp.VerificationTime = DateTime.Today; - AssertEquals ("DateTime=Today", DateTime.Today, cp.VerificationTime); + Assert.AreEqual (DateTime.Today, cp.VerificationTime, "DateTime=Today"); cp.VerificationTime = new DateTime (0); - AssertEquals ("DateTime=0", 0, cp.VerificationTime.Ticks); + Assert.AreEqual (0, cp.VerificationTime.Ticks, "DateTime=0"); cp.VerificationTime = DateTime.MinValue; - AssertEquals ("DateTime=MinValue", DateTime.MinValue, cp.VerificationTime); + Assert.AreEqual (DateTime.MinValue, cp.VerificationTime, "DateTime=MinValue"); cp.VerificationTime = DateTime.MaxValue; - AssertEquals ("DateTime=MaxValue", DateTime.MaxValue, cp.VerificationTime); + Assert.AreEqual (DateTime.MaxValue, cp.VerificationTime, "DateTime=MaxValue"); } [Test] @@ -249,21 +249,21 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { cp.UrlRetrievalTimeout = new TimeSpan (100); cp.VerificationFlags = X509VerificationFlags.AllFlags; DateTime vt = cp.VerificationTime; - Assert ("VerificationTime", ((vt <= DateTime.Now) && (vt > DateTime.Now.AddMinutes (-1)))); + Assert.IsTrue (((vt <= DateTime.Now) && (vt > DateTime.Now.AddMinutes (-1))), "VerificationTime"); // wait a bit before calling Reset, otherwise we could end up with the same time value Thread.Sleep (100); cp.Reset (); - Assert ("VerificationTime-Reset", (vt != cp.VerificationTime)); + Assert.IsTrue ((vt != cp.VerificationTime), "VerificationTime-Reset"); // default properties - AssertEquals ("ApplicationPolicy", 0, cp.ApplicationPolicy.Count); - AssertEquals ("CertificatePolicy", 0, cp.CertificatePolicy.Count); - AssertEquals ("ExtraStore", 0, cp.ExtraStore.Count); - AssertEquals ("RevocationFlag", X509RevocationFlag.ExcludeRoot, cp.RevocationFlag); - AssertEquals ("RevocationMode", X509RevocationMode.Online, cp.RevocationMode); - AssertEquals ("UrlRetrievalTimeout", 0, cp.UrlRetrievalTimeout.Ticks); - AssertEquals ("VerificationFlags", X509VerificationFlags.NoFlag, cp.VerificationFlags); + Assert.AreEqual (0, cp.ApplicationPolicy.Count, "ApplicationPolicy"); + Assert.AreEqual (0, cp.CertificatePolicy.Count, "CertificatePolicy"); + Assert.AreEqual (0, cp.ExtraStore.Count, "ExtraStore"); + Assert.AreEqual (X509RevocationFlag.ExcludeRoot, cp.RevocationFlag, "RevocationFlag"); + Assert.AreEqual (X509RevocationMode.Online, cp.RevocationMode, "RevocationMode"); + Assert.AreEqual (0, cp.UrlRetrievalTimeout.Ticks, "UrlRetrievalTimeout"); + Assert.AreEqual (X509VerificationFlags.NoFlag, cp.VerificationFlags, "VerificationFlags"); vt = cp.VerificationTime; - Assert ("VerificationTime", ((vt <= DateTime.Now) && (vt > DateTime.Now.AddMinutes (-1)))); + Assert.IsTrue (((vt <= DateTime.Now) && (vt > DateTime.Now.AddMinutes (-1))), "VerificationTime"); } } } diff --git a/mcs/class/System/Test/System.Security.Cryptography/ChangeLog b/mcs/class/System/Test/System.Security.Cryptography/ChangeLog index 43f143cdc1b..a88ddd2d572 100644 --- a/mcs/class/System/Test/System.Security.Cryptography/ChangeLog +++ b/mcs/class/System/Test/System.Security.Cryptography/ChangeLog @@ -1,3 +1,8 @@ +2009-06-26 Robert Jordan + + * OidCollectionTest.cs, OidEnumeratorTest.cs: + Upgrade to new NUnit style. + 2007-03-07 Vladimir Krasnov * AsnEncodedDataTest.cs, OidCollectionTest.cs, OidEnumeratorTest.cs, diff --git a/mcs/class/System/Test/System.Security.Cryptography/OidCollectionTest.cs b/mcs/class/System/Test/System.Security.Cryptography/OidCollectionTest.cs index e057ff4f09e..282d6999d28 100644 --- a/mcs/class/System/Test/System.Security.Cryptography/OidCollectionTest.cs +++ b/mcs/class/System/Test/System.Security.Cryptography/OidCollectionTest.cs @@ -20,7 +20,7 @@ namespace MonoTests.System.Security.Cryptography { #if TARGET_JVM [Ignore ("The class System.Security.Cryptography.OidCollection - is not supported")] #endif - public class OidCollectionTest : Assertion { + public class OidCollectionTest { #if !TARGET_JVM [Test] @@ -28,10 +28,10 @@ namespace MonoTests.System.Security.Cryptography { { OidCollection oc = new OidCollection (); // default properties - AssertEquals ("Count", 0, oc.Count); - Assert ("IsSynchronized", !oc.IsSynchronized); - AssertNotNull ("SyncRoot", oc.SyncRoot); - AssertNotNull ("GetEnumerator", oc.GetEnumerator ()); + Assert.AreEqual (0, oc.Count, "Count"); + Assert.IsTrue (!oc.IsSynchronized, "IsSynchronized"); + Assert.IsNotNull (oc.SyncRoot, "SyncRoot"); + Assert.IsNotNull (oc.GetEnumerator (), "GetEnumerator"); } [Test] @@ -39,9 +39,9 @@ namespace MonoTests.System.Security.Cryptography { { OidCollection oc = new OidCollection (); oc.Add (new Oid ("1.0")); - AssertEquals ("Count", 1, oc.Count); - AssertEquals ("[0]", "1.0", oc [0].Value); - AssertEquals ("['1.0']", "1.0", oc ["1.0"].Value); + Assert.AreEqual (1, oc.Count, "Count"); + Assert.AreEqual ("1.0", oc [0].Value, "[0]"); + Assert.AreEqual ("1.0", oc ["1.0"].Value, "['1.0']"); } [Test] @@ -50,8 +50,8 @@ namespace MonoTests.System.Security.Cryptography { { OidCollection oc = new OidCollection (); oc.Add (null); - AssertEquals ("Count", 1, oc.Count); - // AssertNull ("[0]", oc); throw NullReferenceException + Assert.AreEqual (1, oc.Count, "Count"); + // Assert.IsNull (oc, "[0]"); throw NullReferenceException } [Test] @@ -61,7 +61,7 @@ namespace MonoTests.System.Security.Cryptography { oc.Add (new Oid ("1.0")); Oid[] array = new Oid [1]; oc.CopyTo (array, 0); - AssertEquals ("CopyTo(Oid)", "1.0", array [0].Value); + Assert.AreEqual ("1.0", array [0].Value, "CopyTo(Oid)"); } [Test] diff --git a/mcs/class/System/Test/System.Security.Cryptography/OidEnumeratorTest.cs b/mcs/class/System/Test/System.Security.Cryptography/OidEnumeratorTest.cs index 2fa58d7b553..84085f13788 100644 --- a/mcs/class/System/Test/System.Security.Cryptography/OidEnumeratorTest.cs +++ b/mcs/class/System/Test/System.Security.Cryptography/OidEnumeratorTest.cs @@ -20,7 +20,7 @@ namespace MonoTests.System.Security.Cryptography { #if TARGET_JVM [Ignore ("The class System.Security.Cryptography.OidEnumerator - is not supported")] #endif - public class OidEnumeratorTest : Assertion { + public class OidEnumeratorTest { #if !TARGET_JVM private OidEnumerator GetEnumerator () { @@ -45,7 +45,7 @@ namespace MonoTests.System.Security.Cryptography { OidEnumerator enumerator = GetEnumerator (); enumerator.MoveNext (); Oid oid = enumerator.Current; - AssertNotNull ("Current", oid); + Assert.IsNotNull (oid, "Current"); } [Test] @@ -54,8 +54,8 @@ namespace MonoTests.System.Security.Cryptography { OidEnumerator enumerator = GetEnumerator (); while (enumerator.MoveNext ()); Oid oid = enumerator.Current; - AssertNotNull ("Current_AfterLastElement", oid); - AssertEquals ("Current==last", "1.2", oid.Value); + Assert.IsNotNull (oid, "Current_AfterLastElement"); + Assert.AreEqual ("1.2", oid.Value, "Current==last"); } [Test] @@ -66,7 +66,7 @@ namespace MonoTests.System.Security.Cryptography { while (enumerator.MoveNext ()) { n++; } - AssertEquals ("MoveNext", 3, n); + Assert.AreEqual (3, n, "MoveNext"); } [Test] @@ -75,9 +75,9 @@ namespace MonoTests.System.Security.Cryptography { { OidEnumerator enumerator = GetEnumerator (); enumerator.MoveNext (); - AssertNotNull ("Current before reset", enumerator.Current); + Assert.IsNotNull (enumerator.Current, "Current before reset"); enumerator.Reset (); - AssertNotNull ("Current after reset", enumerator.Current); + Assert.IsNotNull (enumerator.Current, "Current after reset"); } #endif } diff --git a/mcs/class/System/Test/System/ChangeLog b/mcs/class/System/Test/System/ChangeLog index fbef80d14c2..15b8f023bb0 100644 --- a/mcs/class/System/Test/System/ChangeLog +++ b/mcs/class/System/Test/System/ChangeLog @@ -1,3 +1,7 @@ +2009-06-25 Robert Jordan + + * UriTest.cs: Upgrade to new NUnit style. + 2009-04-21 Sebastien Pouliot * UriParserTest.cs: Ensure "tcp" is not a registred scheme diff --git a/mcs/class/System/Test/System/UriTest.cs b/mcs/class/System/Test/System/UriTest.cs index 6d82d49406e..53240885803 100644 --- a/mcs/class/System/Test/System/UriTest.cs +++ b/mcs/class/System/Test/System/UriTest.cs @@ -18,7 +18,7 @@ using System.Text; namespace MonoTests.System { [TestFixture] - public class UriTest : Assertion + public class UriTest { protected bool isWin32 = false; @@ -68,117 +68,117 @@ namespace MonoTests.System */ uri = new Uri(" \r \n http://test.com\r\n \r\r "); - AssertEquals ("#k0", "http://test.com/", uri.ToString()); + Assert.AreEqual ("http://test.com/", uri.ToString(), "#k0"); uri = new Uri ("http://contoso.com?subject=uri"); - AssertEquals ("#k1", "/", uri.AbsolutePath); - AssertEquals ("#k2", "http://contoso.com/?subject=uri", uri.AbsoluteUri); - AssertEquals ("#k3", "contoso.com", uri.Authority); - AssertEquals ("#k4", "", uri.Fragment); - AssertEquals ("#k5", "contoso.com", uri.Host); - AssertEquals ("#k6", UriHostNameType.Dns, uri.HostNameType); - AssertEquals ("#k7", true, uri.IsDefaultPort); - AssertEquals ("#k8", false, uri.IsFile); - AssertEquals ("#k9", false, uri.IsLoopback); - AssertEquals ("#k10", false, uri.IsUnc); - AssertEquals ("#k11", "/", uri.LocalPath); - AssertEquals ("#k12", "/?subject=uri", uri.PathAndQuery); - AssertEquals ("#k13", 80, uri.Port); - AssertEquals ("#k14", "?subject=uri", uri.Query); - AssertEquals ("#k15", "http", uri.Scheme); - AssertEquals ("#k16", false, uri.UserEscaped); - AssertEquals ("#k17", "", uri.UserInfo); + Assert.AreEqual ("/", uri.AbsolutePath, "#k1"); + Assert.AreEqual ("http://contoso.com/?subject=uri", uri.AbsoluteUri, "#k2"); + Assert.AreEqual ("contoso.com", uri.Authority, "#k3"); + Assert.AreEqual ("", uri.Fragment, "#k4"); + Assert.AreEqual ("contoso.com", uri.Host, "#k5"); + Assert.AreEqual (UriHostNameType.Dns, uri.HostNameType, "#k6"); + Assert.AreEqual (true, uri.IsDefaultPort, "#k7"); + Assert.AreEqual (false, uri.IsFile, "#k8"); + Assert.AreEqual (false, uri.IsLoopback, "#k9"); + Assert.AreEqual (false, uri.IsUnc, "#k10"); + Assert.AreEqual ("/", uri.LocalPath, "#k11"); + Assert.AreEqual ("/?subject=uri", uri.PathAndQuery, "#k12"); + Assert.AreEqual (80, uri.Port, "#k13"); + Assert.AreEqual ("?subject=uri", uri.Query, "#k14"); + Assert.AreEqual ("http", uri.Scheme, "#k15"); + Assert.AreEqual (false, uri.UserEscaped, "#k16"); + Assert.AreEqual ("", uri.UserInfo, "#k17"); uri = new Uri ("mailto:user:pwd@contoso.com?subject=uri"); - AssertEquals ("#m1", "", uri.AbsolutePath); - AssertEquals ("#m2", "mailto:user:pwd@contoso.com?subject=uri", uri.AbsoluteUri); - AssertEquals ("#m3", "contoso.com", uri.Authority); - AssertEquals ("#m4", "", uri.Fragment); - AssertEquals ("#m5", "contoso.com", uri.Host); - AssertEquals ("#m6", UriHostNameType.Dns, uri.HostNameType); - AssertEquals ("#m7", true, uri.IsDefaultPort); - AssertEquals ("#m8", false, uri.IsFile); - AssertEquals ("#m9", false, uri.IsLoopback); - AssertEquals ("#m10", false, uri.IsUnc); - AssertEquals ("#m11", "", uri.LocalPath); - AssertEquals ("#m12", "?subject=uri", uri.PathAndQuery); - AssertEquals ("#m13", 25, uri.Port); - AssertEquals ("#m14", "?subject=uri", uri.Query); - AssertEquals ("#m15", "mailto", uri.Scheme); - AssertEquals ("#m16", false, uri.UserEscaped); - AssertEquals ("#m17", "user:pwd", uri.UserInfo); + Assert.AreEqual ("", uri.AbsolutePath, "#m1"); + Assert.AreEqual ("mailto:user:pwd@contoso.com?subject=uri", uri.AbsoluteUri, "#m2"); + Assert.AreEqual ("contoso.com", uri.Authority, "#m3"); + Assert.AreEqual ("", uri.Fragment, "#m4"); + Assert.AreEqual ("contoso.com", uri.Host, "#m5"); + Assert.AreEqual (UriHostNameType.Dns, uri.HostNameType, "#m6"); + Assert.AreEqual (true, uri.IsDefaultPort, "#m7"); + Assert.AreEqual (false, uri.IsFile, "#m8"); + Assert.AreEqual (false, uri.IsLoopback, "#m9"); + Assert.AreEqual (false, uri.IsUnc, "#m10"); + Assert.AreEqual ("", uri.LocalPath, "#m11"); + Assert.AreEqual ("?subject=uri", uri.PathAndQuery, "#m12"); + Assert.AreEqual (25, uri.Port, "#m13"); + Assert.AreEqual ("?subject=uri", uri.Query, "#m14"); + Assert.AreEqual ("mailto", uri.Scheme, "#m15"); + Assert.AreEqual (false, uri.UserEscaped, "#m16"); + Assert.AreEqual ("user:pwd", uri.UserInfo, "#m17"); uri = new Uri("myscheme://127.0.0.1:5"); - AssertEquals("#c1", "myscheme://127.0.0.1:5/", uri.ToString()); + Assert.AreEqual ("myscheme://127.0.0.1:5/", uri.ToString(), "#c1"); uri = new Uri (@"\\myserver\mydir\mysubdir\myfile.ext"); - AssertEquals ("#n1", "/mydir/mysubdir/myfile.ext", uri.AbsolutePath); - AssertEquals ("#n2", "file://myserver/mydir/mysubdir/myfile.ext", uri.AbsoluteUri); - AssertEquals ("#n3", "myserver", uri.Authority); - AssertEquals ("#n4", "", uri.Fragment); - AssertEquals ("#n5", "myserver", uri.Host); - AssertEquals ("#n6", UriHostNameType.Dns, uri.HostNameType); - AssertEquals ("#n7", true, uri.IsDefaultPort); - AssertEquals ("#n8", true, uri.IsFile); - AssertEquals ("#n9", false, uri.IsLoopback); - AssertEquals ("#n10", true, uri.IsUnc); + Assert.AreEqual ("/mydir/mysubdir/myfile.ext", uri.AbsolutePath, "#n1"); + Assert.AreEqual ("file://myserver/mydir/mysubdir/myfile.ext", uri.AbsoluteUri, "#n2"); + Assert.AreEqual ("myserver", uri.Authority, "#n3"); + Assert.AreEqual ("", uri.Fragment, "#n4"); + Assert.AreEqual ("myserver", uri.Host, "#n5"); + Assert.AreEqual (UriHostNameType.Dns, uri.HostNameType, "#n6"); + Assert.AreEqual (true, uri.IsDefaultPort, "#n7"); + Assert.AreEqual (true, uri.IsFile, "#n8"); + Assert.AreEqual (false, uri.IsLoopback, "#n9"); + Assert.AreEqual (true, uri.IsUnc, "#n10"); if (isWin32) - AssertEquals ("#n11", @"\\myserver\mydir\mysubdir\myfile.ext", uri.LocalPath); + Assert.AreEqual (@"\\myserver\mydir\mysubdir\myfile.ext", uri.LocalPath, "#n11"); else // myserver never could be the part of Unix path. - AssertEquals ("#n11", "/mydir/mysubdir/myfile.ext", uri.LocalPath); - - AssertEquals ("#n12", "/mydir/mysubdir/myfile.ext", uri.PathAndQuery); - AssertEquals ("#n13", -1, uri.Port); - AssertEquals ("#n14", "", uri.Query); - AssertEquals ("#n15", "file", uri.Scheme); - AssertEquals ("#n16", false, uri.UserEscaped); - AssertEquals ("#n17", "", uri.UserInfo); + Assert.AreEqual ("/mydir/mysubdir/myfile.ext", uri.LocalPath, "#n11"); + + Assert.AreEqual ("/mydir/mysubdir/myfile.ext", uri.PathAndQuery, "#n12"); + Assert.AreEqual (-1, uri.Port, "#n13"); + Assert.AreEqual ("", uri.Query, "#n14"); + Assert.AreEqual ("file", uri.Scheme, "#n15"); + Assert.AreEqual (false, uri.UserEscaped, "#n16"); + Assert.AreEqual ("", uri.UserInfo, "#n17"); uri = new Uri (new Uri("http://www.contoso.com"), "Hello World.htm", true); - AssertEquals ("#rel1a", "http://www.contoso.com/Hello World.htm", uri.AbsoluteUri); - AssertEquals ("#rel1b", true, uri.UserEscaped); + Assert.AreEqual ("http://www.contoso.com/Hello World.htm", uri.AbsoluteUri, "#rel1a"); + Assert.AreEqual (true, uri.UserEscaped, "#rel1b"); uri = new Uri (new Uri("http://www.contoso.com"), "Hello World.htm", false); - AssertEquals ("#rel2a", "http://www.contoso.com/Hello%20World.htm", uri.AbsoluteUri); - AssertEquals ("#rel2b", false, uri.UserEscaped); + Assert.AreEqual ("http://www.contoso.com/Hello%20World.htm", uri.AbsoluteUri, "#rel2a"); + Assert.AreEqual (false, uri.UserEscaped, "#rel2b"); uri = new Uri (new Uri("http://www.contoso.com"), "http://www.xxx.com/Hello World.htm", false); - AssertEquals ("#rel3", "http://www.xxx.com/Hello%20World.htm", uri.AbsoluteUri); + Assert.AreEqual ("http://www.xxx.com/Hello%20World.htm", uri.AbsoluteUri, "#rel3"); uri = new Uri (new Uri("http://www.contoso.com"), "foo/bar/Hello World.htm?x=0:8", false); - AssertEquals ("#rel5", "http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri); + Assert.AreEqual ("http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri, "#rel5"); uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "foo/bar/Hello World.htm?x=0:8", false); - AssertEquals ("#rel6", "http://www.contoso.com/xxx/yyy/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri); + Assert.AreEqual ("http://www.contoso.com/xxx/yyy/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri, "#rel6"); uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "/foo/bar/Hello World.htm?x=0:8", false); - AssertEquals ("#rel7", "http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri); + Assert.AreEqual ("http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri, "#rel7"); uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "../foo/bar/Hello World.htm?x=0:8", false); - AssertEquals ("#rel8", "http://www.contoso.com/xxx/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri); + Assert.AreEqual ("http://www.contoso.com/xxx/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri, "#rel8"); uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "../../../foo/bar/Hello World.htm?x=0:8", false); #if NET_2_0 - AssertEquals ("#rel9", "http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri); + Assert.AreEqual ("http://www.contoso.com/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri, "#rel9"); #else - AssertEquals ("#rel9", "http://www.contoso.com/../foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri); + Assert.AreEqual ("http://www.contoso.com/../foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri, "#rel9"); #endif uri = new Uri (new Uri("http://www.contoso.com/xxx/yyy/index.htm"), "./foo/bar/Hello World.htm?x=0:8", false); - AssertEquals ("#rel10", "http://www.contoso.com/xxx/yyy/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri); + Assert.AreEqual ("http://www.contoso.com/xxx/yyy/foo/bar/Hello%20World.htm?x=0:8", uri.AbsoluteUri, "#rel10"); uri = new Uri (new Uri("http://www.contoso.com/foo/bar/index.html?x=0"), String.Empty, false); - AssertEquals("#22", "http://www.contoso.com/foo/bar/index.html?x=0", uri.ToString ()); + Assert.AreEqual ("http://www.contoso.com/foo/bar/index.html?x=0", uri.ToString (), "#22"); uri = new Uri (new Uri("http://www.xxx.com"), "?x=0"); - AssertEquals ("#rel30", "http://www.xxx.com/?x=0", uri.ToString()); + Assert.AreEqual ("http://www.xxx.com/?x=0", uri.ToString(), "#rel30"); uri = new Uri (new Uri("http://www.xxx.com/index.htm"), "?x=0"); - AssertEquals ("#rel31", "http://www.xxx.com/?x=0", uri.ToString()); + Assert.AreEqual ("http://www.xxx.com/?x=0", uri.ToString(), "#rel31"); uri = new Uri (new Uri("http://www.xxx.com/index.htm"), "#here"); - AssertEquals ("#rel32", "http://www.xxx.com/index.htm#here", uri.ToString()); + Assert.AreEqual ("http://www.xxx.com/index.htm#here", uri.ToString(), "#rel32"); #if NET_2_0 uri = new Uri ("relative", UriKind.Relative); uri = new Uri ("relative/abc", UriKind.Relative); uri = new Uri ("relative", UriKind.RelativeOrAbsolute); - Assert ("#rel33", !uri.IsAbsoluteUri); - AssertEquals ("#rel34", uri.OriginalString, "relative"); - Assert ("#rel35", !uri.UserEscaped); + Assert.IsTrue (!uri.IsAbsoluteUri, "#rel33"); + Assert.AreEqual (uri.OriginalString, "relative", "#rel34"); + Assert.IsTrue (!uri.UserEscaped, "#rel35"); #endif } @@ -187,32 +187,32 @@ namespace MonoTests.System { string relative = "foo:8080/bar/Hello World.htm"; Uri uri = new Uri (new Uri("http://www.contoso.com"), relative, false); - AssertEquals ("AbsolutePath", "8080/bar/Hello%20World.htm", uri.AbsolutePath); - AssertEquals ("AbsoluteUri", "foo:8080/bar/Hello%20World.htm", uri.AbsoluteUri); - AssertEquals ("Authority", String.Empty, uri.Authority); - AssertEquals ("Fragment", String.Empty, uri.Fragment); - AssertEquals ("Host", String.Empty, uri.Host); - AssertEquals ("PathAndQuery", "8080/bar/Hello%20World.htm", uri.PathAndQuery); - AssertEquals ("Port", -1, uri.Port); - AssertEquals ("Query", String.Empty, uri.Query); - AssertEquals ("Scheme", "foo", uri.Scheme); - AssertEquals ("Query", String.Empty, uri.UserInfo); - - AssertEquals ("Segments[0]", "8080/", uri.Segments[0]); - AssertEquals ("Segments[1]", "bar/", uri.Segments[1]); - AssertEquals ("Segments[2]", "Hello%20World.htm", uri.Segments[2]); - - Assert ("IsDefaultPort", uri.IsDefaultPort); - Assert ("IsFile", !uri.IsFile); - Assert ("IsLoopback", !uri.IsLoopback); - Assert ("IsUnc", !uri.IsUnc); - Assert ("UserEscaped", !uri.UserEscaped); + Assert.AreEqual ("8080/bar/Hello%20World.htm", uri.AbsolutePath, "AbsolutePath"); + Assert.AreEqual ("foo:8080/bar/Hello%20World.htm", uri.AbsoluteUri, "AbsoluteUri"); + Assert.AreEqual (String.Empty, uri.Authority, "Authority"); + Assert.AreEqual (String.Empty, uri.Fragment, "Fragment"); + Assert.AreEqual (String.Empty, uri.Host, "Host"); + Assert.AreEqual ("8080/bar/Hello%20World.htm", uri.PathAndQuery, "PathAndQuery"); + Assert.AreEqual (-1, uri.Port, "Port"); + Assert.AreEqual (String.Empty, uri.Query, "Query"); + Assert.AreEqual ("foo", uri.Scheme, "Scheme"); + Assert.AreEqual (String.Empty, uri.UserInfo, "Query"); + + Assert.AreEqual ("8080/", uri.Segments[0], "Segments[0]"); + Assert.AreEqual ("bar/", uri.Segments[1], "Segments[1]"); + Assert.AreEqual ("Hello%20World.htm", uri.Segments[2], "Segments[2]"); + + Assert.IsTrue (uri.IsDefaultPort, "IsDefaultPort"); + Assert.IsTrue (!uri.IsFile, "IsFile"); + Assert.IsTrue (!uri.IsLoopback, "IsLoopback"); + Assert.IsTrue (!uri.IsUnc, "IsUnc"); + Assert.IsTrue (!uri.UserEscaped, "UserEscaped"); #if NET_2_0 - AssertEquals ("HostNameType", UriHostNameType.Unknown, uri.HostNameType); - Assert ("IsAbsoluteUri", uri.IsAbsoluteUri); - AssertEquals ("OriginalString", relative, uri.OriginalString); + Assert.AreEqual (UriHostNameType.Unknown, uri.HostNameType, "HostNameType"); + Assert.IsTrue (uri.IsAbsoluteUri, "IsAbsoluteUri"); + Assert.AreEqual (relative, uri.OriginalString, "OriginalString"); #else - AssertEquals ("HostNameType", UriHostNameType.Basic, uri.HostNameType); + Assert.AreEqual (UriHostNameType.Basic, uri.HostNameType, "HostNameType"); #endif } @@ -241,18 +241,18 @@ namespace MonoTests.System public void RelativeCtor () { Uri b = new Uri ("http://a/b/c/d;p?q"); - AssertEquals ("#1", "http://a/g", new Uri (b, "/g").ToString ()); - AssertEquals ("#2", "http://g/", new Uri (b, "//g").ToString ()); - AssertEquals ("#3", "http://a/b/c/?y", new Uri (b, "?y").ToString ()); - Assert ("#4", new Uri (b, "#s").ToString ().EndsWith ("#s")); + Assert.AreEqual ("http://a/g", new Uri (b, "/g").ToString (), "#1"); + Assert.AreEqual ("http://g/", new Uri (b, "//g").ToString (), "#2"); + Assert.AreEqual ("http://a/b/c/?y", new Uri (b, "?y").ToString (), "#3"); + Assert.IsTrue (new Uri (b, "#s").ToString ().EndsWith ("#s"), "#4"); Uri u = new Uri (b, "/g?q=r"); - AssertEquals ("#5", "http://a/g?q=r", u.ToString ()); - AssertEquals ("#6", "?q=r", u.Query); + Assert.AreEqual ("http://a/g?q=r", u.ToString (), "#5"); + Assert.AreEqual ("?q=r", u.Query, "#6"); u = new Uri (b, "/g?q=r;. a"); - AssertEquals ("#5", "http://a/g?q=r;. a", u.ToString ()); - AssertEquals ("#6", "?q=r;.%20a", u.Query); + Assert.AreEqual ("http://a/g?q=r;. a", u.ToString (), "#5"); + Assert.AreEqual ("?q=r;.%20a", u.Query, "#6"); } #if NET_2_0 @@ -262,7 +262,7 @@ namespace MonoTests.System { Uri b = new Uri ("http://a/b/c/d;p?q"); // this causes crash under MS.NET 1.1 - AssertEquals ("g:h", "g:h", new Uri (b, "g:h").ToString ()); + Assert.AreEqual ("g:h", new Uri (b, "g:h").ToString (), "g:h"); } #endif @@ -280,8 +280,8 @@ namespace MonoTests.System public void LeadingSlashes_ShouldFailOn1x () { // doesn't (but should) fail under 1.x - AssertEquals ("#1", "file:///", new Uri ("file:///").ToString ()); - AssertEquals ("#2", "file:///", new Uri ("file://").ToString ()); + Assert.AreEqual ("file:///", new Uri ("file:///").ToString (), "#1"); + Assert.AreEqual ("file:///", new Uri ("file://").ToString (), "#2"); } [Test] @@ -294,92 +294,92 @@ namespace MonoTests.System // on Mono as 2.0 has been fixed Uri u = new Uri ("file:///foo/bar"); #if NET_2_0 - AssertEquals ("#3a", String.Empty, u.Host); - AssertEquals ("#3b", UriHostNameType.Basic, u.HostNameType); - AssertEquals ("#3c", "file:///foo/bar", u.ToString ()); - AssertEquals ("#3d", false, u.IsUnc); + Assert.AreEqual (String.Empty, u.Host, "#3a"); + Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "#3b"); + Assert.AreEqual ("file:///foo/bar", u.ToString (), "#3c"); + Assert.AreEqual (false, u.IsUnc, "#3d"); #else // 1.x misinterpret the first path element as the host name - AssertEquals ("#3a", "foo", u.Host); - AssertEquals ("#3b", UriHostNameType.Dns, u.HostNameType); - AssertEquals ("#3c", "file://foo/bar", u.ToString ()); - AssertEquals ("#3d", true, u.IsUnc); + Assert.AreEqual ("foo", u.Host, "#3a"); + Assert.AreEqual (UriHostNameType.Dns, u.HostNameType, "#3b"); + Assert.AreEqual ("file://foo/bar", u.ToString (), "#3c"); + Assert.AreEqual (true, u.IsUnc, "#3d"); #endif u = new Uri ("mailto:/foo"); #if NET_2_0 - AssertEquals ("#13a", String.Empty, u.Host); - AssertEquals ("#13b", UriHostNameType.Basic, u.HostNameType); - AssertEquals ("#13c", "mailto:/foo", u.ToString ()); + Assert.AreEqual (String.Empty, u.Host, "#13a"); + Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "#13b"); + Assert.AreEqual ("mailto:/foo", u.ToString (), "#13c"); #else // 1.x misinterpret the first path element as the host name - AssertEquals ("#13a", "foo", u.Host); - AssertEquals ("#13b", UriHostNameType.Dns, u.HostNameType); - AssertEquals ("#13c", "mailto:foo", u.ToString ()); + Assert.AreEqual ("foo", u.Host, "#13a"); + Assert.AreEqual (UriHostNameType.Dns, u.HostNameType, "#13b"); + Assert.AreEqual ("mailto:foo", u.ToString (), "#13c"); #endif u = new Uri ("mailto://foo"); #if NET_2_0 - AssertEquals ("#14a", String.Empty, u.Host); - AssertEquals ("#14b", UriHostNameType.Basic, u.HostNameType); - AssertEquals ("#14c", "mailto://foo", u.ToString ()); + Assert.AreEqual (String.Empty, u.Host, "#14a"); + Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "#14b"); + Assert.AreEqual ("mailto://foo", u.ToString (), "#14c"); #else // 1.x misinterpret the first path element as the host name - AssertEquals ("#14a", "foo", u.Host); - AssertEquals ("#14b", UriHostNameType.Dns, u.HostNameType); - AssertEquals ("#14c", "mailto://foo/", u.ToString ()); + Assert.AreEqual ("foo", u.Host, "#14a"); + Assert.AreEqual (UriHostNameType.Dns, u.HostNameType, "#14b"); + Assert.AreEqual ("mailto://foo/", u.ToString (), "#14c"); #endif u = new Uri ("news:/"); - AssertEquals ("#18a", String.Empty, u.Host); + Assert.AreEqual (String.Empty, u.Host, "#18a"); #if NET_2_0 - AssertEquals ("#18b", UriHostNameType.Unknown, u.HostNameType); - AssertEquals ("#18c", "news:/", u.ToString ()); - AssertEquals ("#18d", "/", u.AbsolutePath); - AssertEquals ("#18e", "news:/", u.AbsoluteUri); + Assert.AreEqual (UriHostNameType.Unknown, u.HostNameType, "#18b"); + Assert.AreEqual ("news:/", u.ToString (), "#18c"); + Assert.AreEqual ("/", u.AbsolutePath, "#18d"); + Assert.AreEqual ("news:/", u.AbsoluteUri, "#18e"); #else - AssertEquals ("#18b", UriHostNameType.Basic, u.HostNameType); - AssertEquals ("#18c", "news:", u.ToString ()); - AssertEquals ("#18d", String.Empty, u.AbsolutePath); - AssertEquals ("#18e", "news:", u.AbsoluteUri); + Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "#18b"); + Assert.AreEqual ("news:", u.ToString (), "#18c"); + Assert.AreEqual (String.Empty, u.AbsolutePath, "#18d"); + Assert.AreEqual ("news:", u.AbsoluteUri, "#18e"); #endif u = new Uri ("news:/foo"); - AssertEquals ("#19a", String.Empty, u.Host); + Assert.AreEqual (String.Empty, u.Host, "#19a"); #if NET_2_0 - AssertEquals ("#19b", UriHostNameType.Unknown, u.HostNameType); - AssertEquals ("#19c", "news:/foo", u.ToString ()); - AssertEquals ("#19d", "/foo", u.AbsolutePath); - AssertEquals ("#19e", "news:/foo", u.AbsoluteUri); + Assert.AreEqual (UriHostNameType.Unknown, u.HostNameType, "#19b"); + Assert.AreEqual ("news:/foo", u.ToString (), "#19c"); + Assert.AreEqual ("/foo", u.AbsolutePath, "#19d"); + Assert.AreEqual ("news:/foo", u.AbsoluteUri, "#19e"); #else - AssertEquals ("#19b", UriHostNameType.Basic, u.HostNameType); - AssertEquals ("#19c", "news:foo", u.ToString ()); - AssertEquals ("#19d", "foo", u.AbsolutePath); - AssertEquals ("#19e", "news:foo", u.AbsoluteUri); + Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "#19b"); + Assert.AreEqual ("news:foo", u.ToString (), "#19c"); + Assert.AreEqual ("foo", u.AbsolutePath, "#19d"); + Assert.AreEqual ("news:foo", u.AbsoluteUri, "#19e"); #endif u = new Uri ("news://foo"); #if NET_2_0 - AssertEquals ("#20a", String.Empty, u.Host); - AssertEquals ("#20b", UriHostNameType.Unknown, u.HostNameType); - AssertEquals ("#20c", "news://foo", u.ToString ()); - AssertEquals ("#20d", "//foo", u.AbsolutePath); - AssertEquals ("#20e", "news://foo", u.AbsoluteUri); + Assert.AreEqual (String.Empty, u.Host, "#20a"); + Assert.AreEqual (UriHostNameType.Unknown, u.HostNameType, "#20b"); + Assert.AreEqual ("news://foo", u.ToString (), "#20c"); + Assert.AreEqual ("//foo", u.AbsolutePath, "#20d"); + Assert.AreEqual ("news://foo", u.AbsoluteUri, "#20e"); #else - AssertEquals ("#20a", "foo", u.Host); - AssertEquals ("#20b", UriHostNameType.Dns, u.HostNameType); - AssertEquals ("#20c", "news://foo/", u.ToString ()); - AssertEquals ("#20d", "/", u.AbsolutePath); - AssertEquals ("#20e", "news://foo/", u.AbsoluteUri); + Assert.AreEqual ("foo", u.Host, "#20a"); + Assert.AreEqual (UriHostNameType.Dns, u.HostNameType, "#20b"); + Assert.AreEqual ("news://foo/", u.ToString (), "#20c"); + Assert.AreEqual ("/", u.AbsolutePath, "#20d"); + Assert.AreEqual ("news://foo/", u.AbsoluteUri, "#20e"); #endif u = new Uri ("news://foo/bar"); #if NET_2_0 - AssertEquals ("#22a", String.Empty, u.Host); - AssertEquals ("#22b", UriHostNameType.Unknown, u.HostNameType); - AssertEquals ("#22c", "news://foo/bar", u.ToString ()); - AssertEquals ("#22d", "//foo/bar", u.AbsolutePath); - AssertEquals ("#22e", "news://foo/bar", u.AbsoluteUri); + Assert.AreEqual (String.Empty, u.Host, "#22a"); + Assert.AreEqual (UriHostNameType.Unknown, u.HostNameType, "#22b"); + Assert.AreEqual ("news://foo/bar", u.ToString (), "#22c"); + Assert.AreEqual ("//foo/bar", u.AbsolutePath, "#22d"); + Assert.AreEqual ("news://foo/bar", u.AbsoluteUri, "#22e"); #else - AssertEquals ("#22a", "foo", u.Host); - AssertEquals ("#22b", UriHostNameType.Dns, u.HostNameType); - AssertEquals ("#22c", "news://foo/bar", u.ToString ()); - AssertEquals ("#22d", "/bar", u.AbsolutePath); - AssertEquals ("#22e", "news://foo/bar", u.AbsoluteUri); + Assert.AreEqual ("foo", u.Host, "#22a"); + Assert.AreEqual (UriHostNameType.Dns, u.HostNameType, "#22b"); + Assert.AreEqual ("news://foo/bar", u.ToString (), "#22c"); + Assert.AreEqual ("/bar", u.AbsolutePath, "#22d"); + Assert.AreEqual ("news://foo/bar", u.AbsoluteUri, "#22e"); #endif } @@ -391,33 +391,33 @@ namespace MonoTests.System { // 1.x throws an UriFormatException because it can't decode the host name Uri u = new Uri ("mailto:"); - AssertEquals ("#10a", String.Empty, u.Host); - AssertEquals ("#10b", UriHostNameType.Basic, u.HostNameType); - AssertEquals ("#10c", "mailto:", u.ToString ()); + Assert.AreEqual (String.Empty, u.Host, "#10a"); + Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "#10b"); + Assert.AreEqual ("mailto:", u.ToString (), "#10c"); // 1.x throws an UriFormatException because it can't decode the host name u = new Uri ("mailto:/"); - AssertEquals ("#12a", String.Empty, u.Host); - AssertEquals ("#12b", UriHostNameType.Basic, u.HostNameType); - AssertEquals ("#12c", "mailto:/", u.ToString ()); + Assert.AreEqual (String.Empty, u.Host, "#12a"); + Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "#12b"); + Assert.AreEqual ("mailto:/", u.ToString (), "#12c"); // 1.x throws an UriFormatException because it cannot detect the format u = new Uri ("mailto:///foo"); - AssertEquals ("#15a", String.Empty, u.Host); - AssertEquals ("#15b", UriHostNameType.Basic, u.HostNameType); - AssertEquals ("#15c", "mailto:///foo", u.ToString ()); + Assert.AreEqual (String.Empty, u.Host, "#15a"); + Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "#15b"); + Assert.AreEqual ("mailto:///foo", u.ToString (), "#15c"); // 1.x throws an UriFormatException because it cannot detect the format u = new Uri ("news:///foo"); - AssertEquals ("#21a", String.Empty, u.Host); + Assert.AreEqual (String.Empty, u.Host, "#21a"); #if NET_2_0 - AssertEquals ("#21b", UriHostNameType.Unknown, u.HostNameType); + Assert.AreEqual (UriHostNameType.Unknown, u.HostNameType, "#21b"); #else - AssertEquals ("#21b", UriHostNameType.Basic, u.HostNameType); + Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "#21b"); #endif - AssertEquals ("#21c", "news:///foo", u.ToString ()); - AssertEquals ("#21d", "///foo", u.AbsolutePath); - AssertEquals ("#21e", "news:///foo", u.AbsoluteUri); + Assert.AreEqual ("news:///foo", u.ToString (), "#21c"); + Assert.AreEqual ("///foo", u.AbsolutePath, "#21d"); + Assert.AreEqual ("news:///foo", u.AbsoluteUri, "#21e"); } [Test] @@ -425,43 +425,43 @@ namespace MonoTests.System public void LeadingSlashes () { Uri u = new Uri ("file://foo/bar"); - AssertEquals ("#5a", "foo", u.Host); - AssertEquals ("#5b", UriHostNameType.Dns, u.HostNameType); - AssertEquals ("#5c", "file://foo/bar", u.ToString ()); - AssertEquals ("#5d", true, u.IsUnc); + Assert.AreEqual ("foo", u.Host, "#5a"); + Assert.AreEqual (UriHostNameType.Dns, u.HostNameType, "#5b"); + Assert.AreEqual ("file://foo/bar", u.ToString (), "#5c"); + Assert.AreEqual (true, u.IsUnc, "#5d"); u = new Uri ("file:////foo/bar"); - AssertEquals ("#7a", "foo", u.Host); - AssertEquals ("#7b", UriHostNameType.Dns, u.HostNameType); - AssertEquals ("#7c", "file://foo/bar", u.ToString ()); - AssertEquals ("#7d", true, u.IsUnc); + Assert.AreEqual ("foo", u.Host, "#7a"); + Assert.AreEqual (UriHostNameType.Dns, u.HostNameType, "#7b"); + Assert.AreEqual ("file://foo/bar", u.ToString (), "#7c"); + Assert.AreEqual (true, u.IsUnc, "#7d"); - AssertEquals ("#9", "file://foo/bar", new Uri ("file://///foo/bar").ToString()); + Assert.AreEqual ("file://foo/bar", new Uri ("file://///foo/bar").ToString(), "#9"); u = new Uri ("mailto:foo"); - AssertEquals ("#11a", "foo", u.Host); - AssertEquals ("#11b", UriHostNameType.Dns, u.HostNameType); - AssertEquals ("#11c", "mailto:foo", u.ToString ()); + Assert.AreEqual ("foo", u.Host, "#11a"); + Assert.AreEqual (UriHostNameType.Dns, u.HostNameType, "#11b"); + Assert.AreEqual ("mailto:foo", u.ToString (), "#11c"); u = new Uri ("news:"); - AssertEquals ("#16a", String.Empty, u.Host); + Assert.AreEqual (String.Empty, u.Host, "#16a"); #if NET_2_0 - AssertEquals ("#16b", UriHostNameType.Unknown, u.HostNameType); + Assert.AreEqual (UriHostNameType.Unknown, u.HostNameType, "#16b"); #else - AssertEquals ("#16b", UriHostNameType.Basic, u.HostNameType); + Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "#16b"); #endif - AssertEquals ("#16c", "news:", u.ToString ()); + Assert.AreEqual ("news:", u.ToString (), "#16c"); u = new Uri ("news:foo"); - AssertEquals ("#17a", String.Empty, u.Host); + Assert.AreEqual (String.Empty, u.Host, "#17a"); #if NET_2_0 - AssertEquals ("#17b", UriHostNameType.Unknown, u.HostNameType); + Assert.AreEqual (UriHostNameType.Unknown, u.HostNameType, "#17b"); #else - AssertEquals ("#17b", UriHostNameType.Basic, u.HostNameType); + Assert.AreEqual (UriHostNameType.Basic, u.HostNameType, "#17b"); #endif - AssertEquals ("#17c", "news:foo", u.ToString ()); - AssertEquals ("#17d", "foo", u.AbsolutePath); - AssertEquals ("#17e", "news:foo", u.AbsoluteUri); + Assert.AreEqual ("news:foo", u.ToString (), "#17c"); + Assert.AreEqual ("foo", u.AbsolutePath, "#17d"); + Assert.AreEqual ("news:foo", u.AbsoluteUri, "#17e"); } [Test] @@ -562,7 +562,7 @@ namespace MonoTests.System for (int i = 0; i < reluris.Length; i++) { try { new Uri (reluris [i]); - Fail ("Should be failed: " + reluris [i]); + Assert.Fail ("Should be failed: " + reluris [i]); } catch (UriFormatException) { } } @@ -571,7 +571,7 @@ namespace MonoTests.System for (int i = 0; i < winRelUris.Length; i++) { try { new Uri (winRelUris [i]); - Fail ("Should be failed: " + winRelUris [i]); + Assert.Fail ("Should be failed: " + winRelUris [i]); } catch (UriFormatException) { } } @@ -582,38 +582,38 @@ namespace MonoTests.System public void LocalPath () { Uri uri = new Uri ("c:\\tmp\\hello.txt"); - AssertEquals ("#1a", "file:///c:/tmp/hello.txt", uri.ToString ()); - AssertEquals ("#1b", "c:\\tmp\\hello.txt", uri.LocalPath); - AssertEquals ("#1c", "file", uri.Scheme); - AssertEquals ("#1d", "", uri.Host); - AssertEquals ("#1e", "c:/tmp/hello.txt", uri.AbsolutePath); + Assert.AreEqual ("file:///c:/tmp/hello.txt", uri.ToString (), "#1a"); + Assert.AreEqual ("c:\\tmp\\hello.txt", uri.LocalPath, "#1b"); + Assert.AreEqual ("file", uri.Scheme, "#1c"); + Assert.AreEqual ("", uri.Host, "#1d"); + Assert.AreEqual ("c:/tmp/hello.txt", uri.AbsolutePath, "#1e"); uri = new Uri ("file:////////cygwin/tmp/hello.txt"); - AssertEquals ("#3a", "file://cygwin/tmp/hello.txt", uri.ToString ()); + Assert.AreEqual ("file://cygwin/tmp/hello.txt", uri.ToString (), "#3a"); if (isWin32) - AssertEquals ("#3b win32", "\\\\cygwin\\tmp\\hello.txt", uri.LocalPath); + Assert.AreEqual ("\\\\cygwin\\tmp\\hello.txt", uri.LocalPath, "#3b win32"); else - AssertEquals ("#3b *nix", "/tmp/hello.txt", uri.LocalPath); - AssertEquals ("#3c", "file", uri.Scheme); - AssertEquals ("#3d", "cygwin", uri.Host); - AssertEquals ("#3e", "/tmp/hello.txt", uri.AbsolutePath); + Assert.AreEqual ("/tmp/hello.txt", uri.LocalPath, "#3b *nix"); + Assert.AreEqual ("file", uri.Scheme, "#3c"); + Assert.AreEqual ("cygwin", uri.Host, "#3d"); + Assert.AreEqual ("/tmp/hello.txt", uri.AbsolutePath, "#3e"); uri = new Uri ("file://mymachine/cygwin/tmp/hello.txt"); - AssertEquals ("#4a", "file://mymachine/cygwin/tmp/hello.txt", uri.ToString ()); + Assert.AreEqual ("file://mymachine/cygwin/tmp/hello.txt", uri.ToString (), "#4a"); if (isWin32) - AssertEquals ("#4b win32", "\\\\mymachine\\cygwin\\tmp\\hello.txt", uri.LocalPath); + Assert.AreEqual ("\\\\mymachine\\cygwin\\tmp\\hello.txt", uri.LocalPath, "#4b win32"); else - AssertEquals ("#4b *nix", "/cygwin/tmp/hello.txt", uri.LocalPath); - AssertEquals ("#4c", "file", uri.Scheme); - AssertEquals ("#4d", "mymachine", uri.Host); - AssertEquals ("#4e", "/cygwin/tmp/hello.txt", uri.AbsolutePath); + Assert.AreEqual ("/cygwin/tmp/hello.txt", uri.LocalPath, "#4b *nix"); + Assert.AreEqual ("file", uri.Scheme, "#4c"); + Assert.AreEqual ("mymachine", uri.Host, "#4d"); + Assert.AreEqual ("/cygwin/tmp/hello.txt", uri.AbsolutePath, "#4e"); uri = new Uri ("file://///c:/cygwin/tmp/hello.txt"); - AssertEquals ("#5a", "file:///c:/cygwin/tmp/hello.txt", uri.ToString ()); - AssertEquals ("#5b", "c:\\cygwin\\tmp\\hello.txt", uri.LocalPath); - AssertEquals ("#5c", "file", uri.Scheme); - AssertEquals ("#5d", "", uri.Host); - AssertEquals ("#5e", "c:/cygwin/tmp/hello.txt", uri.AbsolutePath); + Assert.AreEqual ("file:///c:/cygwin/tmp/hello.txt", uri.ToString (), "#5a"); + Assert.AreEqual ("c:\\cygwin\\tmp\\hello.txt", uri.LocalPath, "#5b"); + Assert.AreEqual ("file", uri.Scheme, "#5c"); + Assert.AreEqual ("", uri.Host, "#5d"); + Assert.AreEqual ("c:/cygwin/tmp/hello.txt", uri.AbsolutePath, "#5e"); } [Test] @@ -622,38 +622,38 @@ namespace MonoTests.System // Hmm, they should be regarded just as a host name, since all URIs are base on absolute path. Uri uri = new Uri("file://one_file.txt"); #if NET_2_0 - AssertEquals("#6a", "file://one_file.txt/", uri.ToString()); - AssertEquals ("#6e", "/", uri.AbsolutePath); - AssertEquals ("#6f", "/", uri.PathAndQuery); - AssertEquals ("#6g", "file://one_file.txt/", uri.GetLeftPart (UriPartial.Path)); + Assert.AreEqual ("file://one_file.txt/", uri.ToString(), "#6a"); + Assert.AreEqual ("/", uri.AbsolutePath, "#6e"); + Assert.AreEqual ("/", uri.PathAndQuery, "#6f"); + Assert.AreEqual ("file://one_file.txt/", uri.GetLeftPart (UriPartial.Path), "#6g"); #else - AssertEquals("#6a", "file://one_file.txt", uri.ToString()); - AssertEquals("#6e", "", uri.AbsolutePath); - AssertEquals ("#6f", "", uri.PathAndQuery); - AssertEquals ("#6g", "file://one_file.txt", uri.GetLeftPart (UriPartial.Path)); + Assert.AreEqual ("file://one_file.txt", uri.ToString(), "#6a"); + Assert.AreEqual ("", uri.AbsolutePath, "#6e"); + Assert.AreEqual ("", uri.PathAndQuery, "#6f"); + Assert.AreEqual ("file://one_file.txt", uri.GetLeftPart (UriPartial.Path), "#6g"); #endif if (isWin32) - AssertEquals("#6b", "\\\\one_file.txt", uri.LocalPath); + Assert.AreEqual ("\\\\one_file.txt", uri.LocalPath, "#6b"); else - AssertEquals("#6b", "/", uri.LocalPath); - AssertEquals("#6c", "file", uri.Scheme); - AssertEquals("#6d", "one_file.txt", uri.Host); + Assert.AreEqual ("/", uri.LocalPath, "#6b"); + Assert.AreEqual ("file", uri.Scheme, "#6c"); + Assert.AreEqual ("one_file.txt", uri.Host, "#6d"); // same tests - but original Uri is now ending with a '/' uri = new Uri ("file://one_file.txt/"); - AssertEquals ("#7a", "file://one_file.txt/", uri.ToString ()); - AssertEquals ("#7e", "/", uri.AbsolutePath); - AssertEquals ("#7f", "/", uri.PathAndQuery); - AssertEquals ("#7g", "file://one_file.txt/", uri.GetLeftPart (UriPartial.Path)); + Assert.AreEqual ("file://one_file.txt/", uri.ToString (), "#7a"); + Assert.AreEqual ("/", uri.AbsolutePath, "#7e"); + Assert.AreEqual ("/", uri.PathAndQuery, "#7f"); + Assert.AreEqual ("file://one_file.txt/", uri.GetLeftPart (UriPartial.Path), "#7g"); #if !TARGET_JVM if (isWin32) - AssertEquals ("#7b", "\\\\one_file.txt\\", uri.LocalPath); + Assert.AreEqual ("\\\\one_file.txt\\", uri.LocalPath, "#7b"); else - AssertEquals ("#7b", "/", uri.LocalPath); + Assert.AreEqual ("/", uri.LocalPath, "#7b"); #endif - AssertEquals ("#7c", "file", uri.Scheme); - AssertEquals ("#7d", "one_file.txt", uri.Host); + Assert.AreEqual ("file", uri.Scheme, "#7c"); + Assert.AreEqual ("one_file.txt", uri.Host, "#7d"); } [Test] @@ -663,43 +663,43 @@ namespace MonoTests.System Uri uri = new Uri ("file:///tmp/a%20a"); if (isWin32) { #if NET_2_0 - Assert ("#7a:" + uri.LocalPath, uri.LocalPath.EndsWith ("/tmp/a a")); + Assert.IsTrue (uri.LocalPath.EndsWith ("/tmp/a a"), "#7a:" + uri.LocalPath); #else // actually MS.NET treats /// as \\ thus it fails here. - Assert ("#7a:" + uri.LocalPath, uri.LocalPath.EndsWith ("\\tmp\\a a")); + Assert.IsTrue (uri.LocalPath.EndsWith ("\\tmp\\a a"), "#7a:" + uri.LocalPath); #endif } else - AssertEquals ("#7b", "/tmp/a a", uri.LocalPath); + Assert.AreEqual ("/tmp/a a", uri.LocalPath, "#7b"); uri = new Uri ("file:///tmp/foo%25bar"); if (isWin32) { #if NET_2_0 - Assert ("#8a:" + uri.LocalPath, uri.LocalPath.EndsWith ("/tmp/foo%bar")); - Assert ("#8c:" + uri.ToString (), uri.ToString ().EndsWith ("//tmp/foo%25bar")); + Assert.IsTrue (uri.LocalPath.EndsWith ("/tmp/foo%bar"), "#8a:" + uri.LocalPath); + Assert.IsTrue (uri.ToString ().EndsWith ("//tmp/foo%25bar"), "#8c:" + uri.ToString ()); #else // actually MS.NET treats /// as \\ thus it fails here. - Assert ("#8a:" + uri.LocalPath, uri.LocalPath.EndsWith ("\\tmp\\foo%bar")); + Assert.IsTrue (uri.LocalPath.EndsWith ("\\tmp\\foo%bar"), "#8a:" + uri.LocalPath); // ditto, file://tmp/foo%25bar (bug in 1.x) - Assert ("#8c:" + uri.ToString (), uri.ToString ().EndsWith ("//tmp/foo%bar")); + Assert.IsTrue (uri.ToString ().EndsWith ("//tmp/foo%bar"), "#8c:" + uri.ToString ()); #endif } else { - AssertEquals ("#8b", "/tmp/foo%bar", uri.LocalPath); - AssertEquals ("#8d", "file:///tmp/foo%25bar", uri.ToString ()); + Assert.AreEqual ("/tmp/foo%bar", uri.LocalPath, "#8b"); + Assert.AreEqual ("file:///tmp/foo%25bar", uri.ToString (), "#8d"); } // bug #76643 uri = new Uri ("file:///foo%25bar"); if (isWin32) { #if NET_2_0 - Assert ("#9a:" + uri.LocalPath, uri.LocalPath.EndsWith ("/foo%bar")); + Assert.IsTrue (uri.LocalPath.EndsWith ("/foo%bar"), "#9a:" + uri.LocalPath); #else // actually MS.NET treats /// as \\ thus it fails here. - Assert ("#9a:" + uri.LocalPath, uri.LocalPath.EndsWith ("\\foo%25bar")); + Assert.IsTrue (uri.LocalPath.EndsWith ("\\foo%25bar"), "#9a:" + uri.LocalPath); #endif // ditto, file://tmp/foo%25bar (bug in 1.x) - Assert ("#9c:" + uri.ToString (), uri.ToString ().EndsWith ("//foo%25bar")); + Assert.IsTrue (uri.ToString ().EndsWith ("//foo%25bar"), "#9c:" + uri.ToString ()); } else { - AssertEquals ("#9b", "/foo%bar", uri.LocalPath); - AssertEquals ("#9d", "file:///foo%25bar", uri.ToString ()); + Assert.AreEqual ("/foo%bar", uri.LocalPath, "#9b"); + Assert.AreEqual ("file:///foo%25bar", uri.ToString (), "#9d"); } } @@ -710,33 +710,33 @@ namespace MonoTests.System Uri u1 = new Uri("http://localhost:8080/test.aspx?ReturnUrl=%2fSearchDoc%2fSearcher.aspx"); Uri u2 = new Uri("http://localhost:8080/test.aspx?ReturnUrl=%252fSearchDoc%252fSearcher.aspx"); - AssertEquals ("QE1", u1.ToString (), "http://localhost:8080/test.aspx?ReturnUrl=/SearchDoc/Searcher.aspx"); - AssertEquals ("QE2", u2.ToString (), "http://localhost:8080/test.aspx?ReturnUrl=%2fSearchDoc%2fSearcher.aspx"); + Assert.AreEqual (u1.ToString (), "http://localhost:8080/test.aspx?ReturnUrl=/SearchDoc/Searcher.aspx", "QE1"); + Assert.AreEqual (u2.ToString (), "http://localhost:8080/test.aspx?ReturnUrl=%2fSearchDoc%2fSearcher.aspx", "QE2"); } [Test] public void UnixPath () { if (!isWin32) - AssertEquals ("#6a", "file:///cygwin/tmp/hello.txt", new Uri ("/cygwin/tmp/hello.txt").ToString ()); + Assert.AreEqual ("file:///cygwin/tmp/hello.txt", new Uri ("/cygwin/tmp/hello.txt").ToString (), "#6a"); } [Test] public void Unc () { Uri uri = new Uri ("http://www.contoso.com"); - Assert ("#1", !uri.IsUnc); + Assert.IsTrue (!uri.IsUnc, "#1"); uri = new Uri ("news:123456@contoso.com"); - Assert ("#2", !uri.IsUnc); + Assert.IsTrue (!uri.IsUnc, "#2"); uri = new Uri ("file://server/filename.ext"); - Assert ("#3", uri.IsUnc); + Assert.IsTrue (uri.IsUnc, "#3"); uri = new Uri (@"\\server\share\filename.ext"); - Assert ("#6", uri.IsUnc); + Assert.IsTrue (uri.IsUnc, "#6"); uri = new Uri (@"a:\dir\filename.ext"); - Assert ("#8", !uri.IsUnc); + Assert.IsTrue (!uri.IsUnc, "#8"); } [Test] @@ -745,30 +745,30 @@ namespace MonoTests.System { if (!isWin32) { Uri uri = new Uri ("/home/user/dir/filename.ext"); - Assert ("#7", !uri.IsUnc); + Assert.IsTrue (!uri.IsUnc, "#7"); } } [Test] public void FromHex () { - AssertEquals ("#1", 0, Uri.FromHex ('0')); - AssertEquals ("#2", 9, Uri.FromHex ('9')); - AssertEquals ("#3", 10, Uri.FromHex ('a')); - AssertEquals ("#4", 15, Uri.FromHex ('f')); - AssertEquals ("#5", 10, Uri.FromHex ('A')); - AssertEquals ("#6", 15, Uri.FromHex ('F')); + Assert.AreEqual (0, Uri.FromHex ('0'), "#1"); + Assert.AreEqual (9, Uri.FromHex ('9'), "#2"); + Assert.AreEqual (10, Uri.FromHex ('a'), "#3"); + Assert.AreEqual (15, Uri.FromHex ('f'), "#4"); + Assert.AreEqual (10, Uri.FromHex ('A'), "#5"); + Assert.AreEqual (15, Uri.FromHex ('F'), "#6"); try { Uri.FromHex ('G'); - Fail ("#7"); + Assert.Fail ("#7"); } catch (ArgumentException) {} try { Uri.FromHex (' '); - Fail ("#8"); + Assert.Fail ("#8"); } catch (ArgumentException) {} try { Uri.FromHex ('%'); - Fail ("#8"); + Assert.Fail ("#8"); } catch (ArgumentException) {} } @@ -792,23 +792,23 @@ namespace MonoTests.System [Test] public void Unescape () { - AssertEquals ("#1", "#", UriEx.UnescapeString ("file://localhost/c#", "%23")); - AssertEquals ("#2", "c#", UriEx.UnescapeString ("file://localhost/c#", "c%23")); - AssertEquals ("#3", "\xA9", UriEx.UnescapeString ("file://localhost/c#", "%A9")); - AssertEquals ("#1", "#", UriEx.UnescapeString ("http://localhost/c#", "%23")); - AssertEquals ("#2", "c#", UriEx.UnescapeString ("http://localhost/c#", "c%23")); - AssertEquals ("#3", "\xA9", UriEx.UnescapeString ("http://localhost/c#", "%A9")); + Assert.AreEqual ("#", UriEx.UnescapeString ("file://localhost/c#", "%23"), "#1"); + Assert.AreEqual ("c#", UriEx.UnescapeString ("file://localhost/c#", "c%23"), "#2"); + Assert.AreEqual ("\xA9", UriEx.UnescapeString ("file://localhost/c#", "%A9"), "#3"); + Assert.AreEqual ("#", UriEx.UnescapeString ("http://localhost/c#", "%23"), "#1"); + Assert.AreEqual ("c#", UriEx.UnescapeString ("http://localhost/c#", "c%23"), "#2"); + Assert.AreEqual ("\xA9", UriEx.UnescapeString ("http://localhost/c#", "%A9"), "#3"); } [Test] public void HexEscape () { - AssertEquals ("#1","%20", Uri.HexEscape (' ')); - AssertEquals ("#2","%A9", Uri.HexEscape ((char) 0xa9)); - AssertEquals ("#3","%41", Uri.HexEscape ('A')); + Assert.AreEqual ("%20", Uri.HexEscape (' '), "#1"); + Assert.AreEqual ("%A9", Uri.HexEscape ((char) 0xa9), "#2"); + Assert.AreEqual ("%41", Uri.HexEscape ('A'), "#3"); try { Uri.HexEscape ((char) 0x0369); - Fail ("#4"); + Assert.Fail ("#4"); } catch (ArgumentOutOfRangeException) {} } @@ -818,33 +818,33 @@ namespace MonoTests.System string url = "http://guyc-2003-sp/wiki/wiki%20document%20library/בד%20יקה.docx"; string escapedAbsolutePath = "/wiki/wiki%20document%20library/%D7%91%D7%93%20%D7%99%D7%A7%D7%94.docx"; Uri u = new Uri(url); - AssertEquals("Escaped non-english combo", escapedAbsolutePath, u.AbsolutePath); + Assert.AreEqual (escapedAbsolutePath, u.AbsolutePath, "Escaped non-english combo"); } [Test] public void HexUnescape () { int i = 0; - AssertEquals ("#1", ' ', Uri.HexUnescape ("%20", ref i)); - AssertEquals ("#2", 3, i); + Assert.AreEqual (' ', Uri.HexUnescape ("%20", ref i), "#1"); + Assert.AreEqual (3, i, "#2"); i = 4; - AssertEquals ("#3", (char) 0xa9, Uri.HexUnescape ("test%a9test", ref i)); - AssertEquals ("#4", 7, i); - AssertEquals ("#5", 't', Uri.HexUnescape ("test%a9test", ref i)); - AssertEquals ("#6", 8, i); + Assert.AreEqual ((char) 0xa9, Uri.HexUnescape ("test%a9test", ref i), "#3"); + Assert.AreEqual (7, i, "#4"); + Assert.AreEqual ('t', Uri.HexUnescape ("test%a9test", ref i), "#5"); + Assert.AreEqual (8, i, "#6"); i = 4; - AssertEquals ("#5", '%', Uri.HexUnescape ("test%a", ref i)); - AssertEquals ("#6", 5, i); - AssertEquals ("#7", '%', Uri.HexUnescape ("testx%xx", ref i)); - AssertEquals ("#8", 6, i); + Assert.AreEqual ('%', Uri.HexUnescape ("test%a", ref i), "#5"); + Assert.AreEqual (5, i, "#6"); + Assert.AreEqual ('%', Uri.HexUnescape ("testx%xx", ref i), "#7"); + Assert.AreEqual (6, i, "#8"); // Tests from bug 74872 - don't handle multi-byte characters as multi-byte i = 1; - AssertEquals ("#9", 227, (int) Uri.HexUnescape ("a%E3%81%8B", ref i)); - AssertEquals ("#10", 4, i); + Assert.AreEqual (227, (int) Uri.HexUnescape ("a%E3%81%8B", ref i), "#9"); + Assert.AreEqual (4, i, "#10"); i = 1; - AssertEquals ("#11", 240, (int) Uri.HexUnescape ("a%F0%90%84%80", ref i)); - AssertEquals ("#12", 4, i); + Assert.AreEqual (240, (int) Uri.HexUnescape ("a%F0%90%84%80", ref i), "#11"); + Assert.AreEqual (4, i, "#12"); } #if !NET_2_0 @@ -864,110 +864,110 @@ namespace MonoTests.System // 3-byte character uri = new Uri ("file:///foo/a%E3%81%8Bb", true); path = uri.LocalPath; - AssertEquals ("#1", 8, path.Length); - AssertEquals ("#2", 0x304B, path [6]); + Assert.AreEqual (8, path.Length, "#1"); + Assert.AreEqual (0x304B, path [6], "#2"); // 4-byte character which should be handled as a surrogate uri = new Uri ("file:///foo/a%F3%A0%84%80b", true); path = uri.LocalPath; - AssertEquals ("#3", 9, path.Length); - AssertEquals ("#4", 0xDB40, path [6]); - AssertEquals ("#5", 0xDD00, path [7]); - AssertEquals ("#6", 0x62, path [8]); + Assert.AreEqual (9, path.Length, "#3"); + Assert.AreEqual (0xDB40, path [6], "#4"); + Assert.AreEqual (0xDD00, path [7], "#5"); + Assert.AreEqual (0x62, path [8], "#6"); // 2-byte escape sequence, 2 individual characters uri = new Uri ("file:///foo/a%C2%F8b", true); path = uri.LocalPath; - AssertEquals ("#7", 9, path.Length); - AssertEquals ("#8", 0xC2, path [6]); - AssertEquals ("#9", 0xF8, path [7]); + Assert.AreEqual (9, path.Length, "#7"); + Assert.AreEqual (0xC2, path [6], "#8"); + Assert.AreEqual (0xF8, path [7], "#9"); } [Test] public void IsHexDigit () { - Assert ("#1", Uri.IsHexDigit ('a')); - Assert ("#2", Uri.IsHexDigit ('f')); - Assert ("#3", !Uri.IsHexDigit ('g')); - Assert ("#4", Uri.IsHexDigit ('0')); - Assert ("#5", Uri.IsHexDigit ('9')); - Assert ("#6", Uri.IsHexDigit ('A')); - Assert ("#7", Uri.IsHexDigit ('F')); - Assert ("#8", !Uri.IsHexDigit ('G')); + Assert.IsTrue (Uri.IsHexDigit ('a'), "#1"); + Assert.IsTrue (Uri.IsHexDigit ('f'), "#2"); + Assert.IsTrue (!Uri.IsHexDigit ('g'), "#3"); + Assert.IsTrue (Uri.IsHexDigit ('0'), "#4"); + Assert.IsTrue (Uri.IsHexDigit ('9'), "#5"); + Assert.IsTrue (Uri.IsHexDigit ('A'), "#6"); + Assert.IsTrue (Uri.IsHexDigit ('F'), "#7"); + Assert.IsTrue (!Uri.IsHexDigit ('G'), "#8"); } [Test] public void IsHexEncoding () { - Assert ("#1", Uri.IsHexEncoding ("test%a9test", 4)); - Assert ("#2", !Uri.IsHexEncoding ("test%a9test", 3)); - Assert ("#3", Uri.IsHexEncoding ("test%a9", 4)); - Assert ("#4", !Uri.IsHexEncoding ("test%a", 4)); + Assert.IsTrue (Uri.IsHexEncoding ("test%a9test", 4), "#1"); + Assert.IsTrue (!Uri.IsHexEncoding ("test%a9test", 3), "#2"); + Assert.IsTrue (Uri.IsHexEncoding ("test%a9", 4), "#3"); + Assert.IsTrue (!Uri.IsHexEncoding ("test%a", 4), "#4"); } [Test] public void GetLeftPart () { Uri uri = new Uri ("http://www.contoso.com/index.htm#main"); - AssertEquals ("#1", "http://", uri.GetLeftPart (UriPartial.Scheme)); - AssertEquals ("#2", "http://www.contoso.com", uri.GetLeftPart (UriPartial.Authority)); - AssertEquals ("#3", "http://www.contoso.com/index.htm", uri.GetLeftPart (UriPartial.Path)); + Assert.AreEqual ("http://", uri.GetLeftPart (UriPartial.Scheme), "#1"); + Assert.AreEqual ("http://www.contoso.com", uri.GetLeftPart (UriPartial.Authority), "#2"); + Assert.AreEqual ("http://www.contoso.com/index.htm", uri.GetLeftPart (UriPartial.Path), "#3"); uri = new Uri ("mailto:user@contoso.com?subject=uri"); - AssertEquals ("#4", "mailto:", uri.GetLeftPart (UriPartial.Scheme)); - AssertEquals ("#5", "", uri.GetLeftPart (UriPartial.Authority)); - AssertEquals ("#6", "mailto:user@contoso.com", uri.GetLeftPart (UriPartial.Path)); + Assert.AreEqual ("mailto:", uri.GetLeftPart (UriPartial.Scheme), "#4"); + Assert.AreEqual ("", uri.GetLeftPart (UriPartial.Authority), "#5"); + Assert.AreEqual ("mailto:user@contoso.com", uri.GetLeftPart (UriPartial.Path), "#6"); uri = new Uri ("nntp://news.contoso.com/123456@contoso.com"); - AssertEquals ("#7", "nntp://", uri.GetLeftPart (UriPartial.Scheme)); - AssertEquals ("#8", "nntp://news.contoso.com", uri.GetLeftPart (UriPartial.Authority)); - AssertEquals ("#9", "nntp://news.contoso.com/123456@contoso.com", uri.GetLeftPart (UriPartial.Path)); + Assert.AreEqual ("nntp://", uri.GetLeftPart (UriPartial.Scheme), "#7"); + Assert.AreEqual ("nntp://news.contoso.com", uri.GetLeftPart (UriPartial.Authority), "#8"); + Assert.AreEqual ("nntp://news.contoso.com/123456@contoso.com", uri.GetLeftPart (UriPartial.Path), "#9"); uri = new Uri ("news:123456@contoso.com"); - AssertEquals ("#10", "news:", uri.GetLeftPart (UriPartial.Scheme)); - AssertEquals ("#11", "", uri.GetLeftPart (UriPartial.Authority)); - AssertEquals ("#12", "news:123456@contoso.com", uri.GetLeftPart (UriPartial.Path)); + Assert.AreEqual ("news:", uri.GetLeftPart (UriPartial.Scheme), "#10"); + Assert.AreEqual ("", uri.GetLeftPart (UriPartial.Authority), "#11"); + Assert.AreEqual ("news:123456@contoso.com", uri.GetLeftPart (UriPartial.Path), "#12"); uri = new Uri ("file://server/filename.ext"); - AssertEquals ("#13", "file://", uri.GetLeftPart (UriPartial.Scheme)); - AssertEquals ("#14", "file://server", uri.GetLeftPart (UriPartial.Authority)); - AssertEquals ("#15", "file://server/filename.ext", uri.GetLeftPart (UriPartial.Path)); + Assert.AreEqual ("file://", uri.GetLeftPart (UriPartial.Scheme), "#13"); + Assert.AreEqual ("file://server", uri.GetLeftPart (UriPartial.Authority), "#14"); + Assert.AreEqual ("file://server/filename.ext", uri.GetLeftPart (UriPartial.Path), "#15"); uri = new Uri (@"\\server\share\filename.ext"); - AssertEquals ("#20", "file://", uri.GetLeftPart (UriPartial.Scheme)); - AssertEquals ("#21", "file://server", uri.GetLeftPart (UriPartial.Authority)); - AssertEquals ("#22", "file://server/share/filename.ext", uri.GetLeftPart (UriPartial.Path)); + Assert.AreEqual ("file://", uri.GetLeftPart (UriPartial.Scheme), "#20"); + Assert.AreEqual ("file://server", uri.GetLeftPart (UriPartial.Authority), "#21"); + Assert.AreEqual ("file://server/share/filename.ext", uri.GetLeftPart (UriPartial.Path), "#22"); uri = new Uri ("http://www.contoso.com:8080/index.htm#main"); - AssertEquals ("#23", "http://", uri.GetLeftPart (UriPartial.Scheme)); - AssertEquals ("#24", "http://www.contoso.com:8080", uri.GetLeftPart (UriPartial.Authority)); - AssertEquals ("#25", "http://www.contoso.com:8080/index.htm", uri.GetLeftPart (UriPartial.Path)); + Assert.AreEqual ("http://", uri.GetLeftPart (UriPartial.Scheme), "#23"); + Assert.AreEqual ("http://www.contoso.com:8080", uri.GetLeftPart (UriPartial.Authority), "#24"); + Assert.AreEqual ("http://www.contoso.com:8080/index.htm", uri.GetLeftPart (UriPartial.Path), "#25"); } [Test] public void NewsDefaultPort () { Uri uri = new Uri("news://localhost:119/"); - AssertEquals ("#1", uri.IsDefaultPort, true); + Assert.AreEqual (uri.IsDefaultPort, true, "#1"); } [Test] public void Fragment_Escape () { Uri u = new Uri("http://localhost/index.asp#main#start", false); - AssertEquals ("#1", u.Fragment, "#main%23start"); + Assert.AreEqual (u.Fragment, "#main%23start", "#1"); u = new Uri("http://localhost/index.asp#main#start", true); - AssertEquals ("#2", u.Fragment, "#main#start"); + Assert.AreEqual (u.Fragment, "#main#start", "#2"); // The other code path uses a BaseUri Uri b = new Uri ("http://www.gnome.org"); Uri n = new Uri (b, "blah#main#start"); - AssertEquals ("#3", n.Fragment, "#main%23start"); + Assert.AreEqual (n.Fragment, "#main%23start", "#3"); n = new Uri (b, "blah#main#start", true); - AssertEquals ("#4", n.Fragment, "#main#start"); + Assert.AreEqual (n.Fragment, "#main#start", "#4"); } #if NET_2_0 @@ -980,12 +980,12 @@ namespace MonoTests.System try { string fragment = relativeUri.Fragment; - Fail ("#1: " + fragment); + Assert.Fail ("#1: " + fragment); } catch (InvalidOperationException ex) { // This operation is not supported for a relative URI - AssertEquals ("#2", typeof (InvalidOperationException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); + Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); } } #endif @@ -1002,93 +1002,93 @@ namespace MonoTests.System public void CheckHostName1 () { // reported to MSDN Product Feedback Center (FDBK28671) - AssertEquals ("#36 known to fail with ms.net: this is not a valid IPv6 address.", UriHostNameType.Unknown, Uri.CheckHostName (":11:22:33:44:55:66:77:88")); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName (":11:22:33:44:55:66:77:88"), "#36 known to fail with ms.net: this is not a valid IPv6 address."); } [Test] public void CheckHostName2 () { - AssertEquals ("#1", UriHostNameType.Unknown, Uri.CheckHostName (null)); - AssertEquals ("#2", UriHostNameType.Unknown, Uri.CheckHostName ("")); - AssertEquals ("#3", UriHostNameType.Unknown, Uri.CheckHostName ("^&()~`!@")); - AssertEquals ("#4", UriHostNameType.Dns, Uri.CheckHostName ("x")); - AssertEquals ("#5", UriHostNameType.IPv4, Uri.CheckHostName ("1.2.3.4")); - AssertEquals ("#6", UriHostNameType.IPv4, Uri.CheckHostName ("0001.002.03.4")); - AssertEquals ("#7", UriHostNameType.Dns, Uri.CheckHostName ("0001.002.03.256")); - AssertEquals ("#8", UriHostNameType.Dns, Uri.CheckHostName ("9001.002.03.4")); - AssertEquals ("#9", UriHostNameType.Dns, Uri.CheckHostName ("www.contoso.com")); - AssertEquals ("#10", UriHostNameType.Unknown, Uri.CheckHostName (".www.contoso.com")); - AssertEquals ("#11", UriHostNameType.Dns, Uri.CheckHostName ("www.contoso.com.")); - AssertEquals ("#12", UriHostNameType.Dns, Uri.CheckHostName ("www.con-toso.com")); - AssertEquals ("#13", UriHostNameType.Dns, Uri.CheckHostName ("www.con_toso.com")); - AssertEquals ("#14", UriHostNameType.Unknown, Uri.CheckHostName ("www.con,toso.com")); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName (null), "#1"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName (""), "#2"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("^&()~`!@"), "#3"); + Assert.AreEqual (UriHostNameType.Dns, Uri.CheckHostName ("x"), "#4"); + Assert.AreEqual (UriHostNameType.IPv4, Uri.CheckHostName ("1.2.3.4"), "#5"); + Assert.AreEqual (UriHostNameType.IPv4, Uri.CheckHostName ("0001.002.03.4"), "#6"); + Assert.AreEqual (UriHostNameType.Dns, Uri.CheckHostName ("0001.002.03.256"), "#7"); + Assert.AreEqual (UriHostNameType.Dns, Uri.CheckHostName ("9001.002.03.4"), "#8"); + Assert.AreEqual (UriHostNameType.Dns, Uri.CheckHostName ("www.contoso.com"), "#9"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName (".www.contoso.com"), "#10"); + Assert.AreEqual (UriHostNameType.Dns, Uri.CheckHostName ("www.contoso.com."), "#11"); + Assert.AreEqual (UriHostNameType.Dns, Uri.CheckHostName ("www.con-toso.com"), "#12"); + Assert.AreEqual (UriHostNameType.Dns, Uri.CheckHostName ("www.con_toso.com"), "#13"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("www.con,toso.com"), "#14"); // test IPv6 - AssertEquals ("#15", UriHostNameType.IPv6, Uri.CheckHostName ("11:22:33:44:55:66:77:88")); - AssertEquals ("#16", UriHostNameType.IPv6, Uri.CheckHostName ("11::33:44:55:66:77:88")); - AssertEquals ("#17", UriHostNameType.IPv6, Uri.CheckHostName ("::22:33:44:55:66:77:88")); - AssertEquals ("#18", UriHostNameType.IPv6, Uri.CheckHostName ("11:22:33:44:55:66:77::")); - AssertEquals ("#19", UriHostNameType.IPv6, Uri.CheckHostName ("11::88")); - AssertEquals ("#20", UriHostNameType.IPv6, Uri.CheckHostName ("11::77:88")); - AssertEquals ("#21", UriHostNameType.IPv6, Uri.CheckHostName ("11:22::88")); - AssertEquals ("#22", UriHostNameType.IPv6, Uri.CheckHostName ("11::")); - AssertEquals ("#23", UriHostNameType.IPv6, Uri.CheckHostName ("::88")); - AssertEquals ("#24", UriHostNameType.IPv6, Uri.CheckHostName ("::1")); - AssertEquals ("#25", UriHostNameType.IPv6, Uri.CheckHostName ("::")); - AssertEquals ("#26", UriHostNameType.IPv6, Uri.CheckHostName ("0:0:0:0:0:0:127.0.0.1")); - AssertEquals ("#27", UriHostNameType.IPv6, Uri.CheckHostName ("::127.0.0.1")); - AssertEquals ("#28", UriHostNameType.IPv6, Uri.CheckHostName ("::ffFF:169.32.14.5")); - AssertEquals ("#29", UriHostNameType.IPv6, Uri.CheckHostName ("2001:03A0::/35")); - AssertEquals ("#30", UriHostNameType.IPv6, Uri.CheckHostName ("[2001:03A0::/35]")); - AssertEquals ("#33", UriHostNameType.IPv6, Uri.CheckHostName ("2001::03A0:1.2.3.4")); - - AssertEquals ("#31", UriHostNameType.Unknown, Uri.CheckHostName ("2001::03A0::/35")); - AssertEquals ("#32", UriHostNameType.Unknown, Uri.CheckHostName ("2001:03A0::/35a")); - AssertEquals ("#34", UriHostNameType.Unknown, Uri.CheckHostName ("::ffff:123.256.155.43")); - AssertEquals ("#35", UriHostNameType.Unknown, Uri.CheckHostName (":127.0.0.1")); - AssertEquals ("#37", UriHostNameType.Unknown, Uri.CheckHostName ("::11:22:33:44:55:66:77:88")); - AssertEquals ("#38", UriHostNameType.Unknown, Uri.CheckHostName ("11:22:33:44:55:66:77:88::")); - AssertEquals ("#39", UriHostNameType.Unknown, Uri.CheckHostName ("11:22:33:44:55:66:77:88:")); - AssertEquals ("#40", UriHostNameType.Unknown, Uri.CheckHostName ("::acbde")); - AssertEquals ("#41", UriHostNameType.Unknown, Uri.CheckHostName ("::abce:")); - AssertEquals ("#42", UriHostNameType.Unknown, Uri.CheckHostName ("::abcg")); - AssertEquals ("#43", UriHostNameType.Unknown, Uri.CheckHostName (":::")); - AssertEquals ("#44", UriHostNameType.Unknown, Uri.CheckHostName (":")); - - AssertEquals ("#45", UriHostNameType.Unknown, Uri.CheckHostName ("*")); - AssertEquals ("#46", UriHostNameType.Unknown, Uri.CheckHostName ("*.go-mono.com")); - AssertEquals ("#47", UriHostNameType.Unknown, Uri.CheckHostName ("www*.go-mono.com")); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("11:22:33:44:55:66:77:88"), "#15"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("11::33:44:55:66:77:88"), "#16"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("::22:33:44:55:66:77:88"), "#17"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("11:22:33:44:55:66:77::"), "#18"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("11::88"), "#19"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("11::77:88"), "#20"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("11:22::88"), "#21"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("11::"), "#22"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("::88"), "#23"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("::1"), "#24"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("::"), "#25"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("0:0:0:0:0:0:127.0.0.1"), "#26"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("::127.0.0.1"), "#27"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("::ffFF:169.32.14.5"), "#28"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("2001:03A0::/35"), "#29"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("[2001:03A0::/35]"), "#30"); + Assert.AreEqual (UriHostNameType.IPv6, Uri.CheckHostName ("2001::03A0:1.2.3.4"), "#33"); + + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("2001::03A0::/35"), "#31"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("2001:03A0::/35a"), "#32"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("::ffff:123.256.155.43"), "#34"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName (":127.0.0.1"), "#35"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("::11:22:33:44:55:66:77:88"), "#37"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("11:22:33:44:55:66:77:88::"), "#38"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("11:22:33:44:55:66:77:88:"), "#39"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("::acbde"), "#40"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("::abce:"), "#41"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("::abcg"), "#42"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName (":::"), "#43"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName (":"), "#44"); + + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("*"), "#45"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("*.go-mono.com"), "#46"); + Assert.AreEqual (UriHostNameType.Unknown, Uri.CheckHostName ("www*.go-mono.com"), "#47"); } [Test] public void IsLoopback () { Uri uri = new Uri("http://loopback:8080"); - AssertEquals ("#1", true, uri.IsLoopback); + Assert.AreEqual (true, uri.IsLoopback, "#1"); uri = new Uri("http://localhost:8080"); - AssertEquals ("#2", true, uri.IsLoopback); + Assert.AreEqual (true, uri.IsLoopback, "#2"); uri = new Uri("http://127.0.0.1:8080"); - AssertEquals ("#3", true, uri.IsLoopback); + Assert.AreEqual (true, uri.IsLoopback, "#3"); uri = new Uri("http://127.0.0.001:8080"); - AssertEquals ("#4", true, uri.IsLoopback); + Assert.AreEqual (true, uri.IsLoopback, "#4"); uri = new Uri("http://[::1]"); - AssertEquals ("#5", true, uri.IsLoopback); + Assert.AreEqual (true, uri.IsLoopback, "#5"); uri = new Uri("http://[::1]:8080"); - AssertEquals ("#6", true, uri.IsLoopback); + Assert.AreEqual (true, uri.IsLoopback, "#6"); uri = new Uri("http://[::0001]:8080"); - AssertEquals ("#7", true, uri.IsLoopback); + Assert.AreEqual (true, uri.IsLoopback, "#7"); uri = new Uri("http://[0:0:0:0::1]:8080"); - AssertEquals ("#8", true, uri.IsLoopback); + Assert.AreEqual (true, uri.IsLoopback, "#8"); uri = new Uri("http://[0:0:0:0::127.0.0.1]:8080"); - AssertEquals ("#9", true, uri.IsLoopback); + Assert.AreEqual (true, uri.IsLoopback, "#9"); uri = new Uri("http://[0:0:0:0::127.11.22.33]:8080"); - AssertEquals ("#10", false, uri.IsLoopback); + Assert.AreEqual (false, uri.IsLoopback, "#10"); uri = new Uri("http://[::ffff:127.11.22.33]:8080"); - AssertEquals ("#11", false, uri.IsLoopback); + Assert.AreEqual (false, uri.IsLoopback, "#11"); uri = new Uri("http://[::ff00:7f11:2233]:8080"); - AssertEquals ("#12", false, uri.IsLoopback); + Assert.AreEqual (false, uri.IsLoopback, "#12"); uri = new Uri("http://[1:0:0:0::1]:8080"); - AssertEquals ("#13", false, uri.IsLoopback); + Assert.AreEqual (false, uri.IsLoopback, "#13"); } [Test] @@ -1096,9 +1096,9 @@ namespace MonoTests.System { Uri uri = new Uri ("file:///index.html"); #if NET_2_0 - Assert ("file", uri.IsLoopback); + Assert.IsTrue (uri.IsLoopback, "file"); #else - Assert ("file", !uri.IsLoopback); + Assert.IsTrue (!uri.IsLoopback, "file"); #endif } @@ -1107,7 +1107,7 @@ namespace MonoTests.System { string relative = "http:8080/bar/Hello World.htm"; Uri uri = new Uri (new Uri ("http://www.contoso.com"), relative, false); - Assert ("http", !uri.IsLoopback); + Assert.IsTrue (!uri.IsLoopback, "http"); } [Test] @@ -1115,7 +1115,7 @@ namespace MonoTests.System { string relative = "foo:8080/bar/Hello World.htm"; Uri uri = new Uri (new Uri ("http://www.contoso.com"), relative, false); - Assert ("foo", !uri.IsLoopback); + Assert.IsTrue (!uri.IsLoopback, "foo"); } [Test] @@ -1123,9 +1123,9 @@ namespace MonoTests.System { Uri uri1 = new Uri ("http://www.contoso.com/index.htm#main"); Uri uri2 = new Uri ("http://www.contoso.com/index.htm#fragment"); - Assert ("#1", uri1.Equals (uri2)); - Assert ("#3", !uri2.Equals ("http://www.contoso.com/index.html?x=1")); - Assert ("#4", !uri1.Equals ("http://www.contoso.com:8080/index.htm?x=1")); + Assert.IsTrue (uri1.Equals (uri2), "#1"); + Assert.IsTrue (!uri2.Equals ("http://www.contoso.com/index.html?x=1"), "#3"); + Assert.IsTrue (!uri1.Equals ("http://www.contoso.com:8080/index.htm?x=1"), "#4"); } [Test] @@ -1136,7 +1136,7 @@ namespace MonoTests.System { Uri uri1 = new Uri ("http://www.contoso.com/index.htm#main"); Uri uri2 = new Uri ("http://www.contoso.com/index.htm?x=1"); - Assert ("#2 known to fail with ms.net 1.x", !uri1.Equals (uri2)); + Assert.IsTrue (!uri1.Equals (uri2), "#2 known to fail with ms.net 1.x"); } [Test] @@ -1144,7 +1144,7 @@ namespace MonoTests.System { Uri uri1 = new Uri ("svn+ssh://atsushi@mono-cvs.ximian.com"); Uri uri2 = new Uri ("svn+ssh://anonymous@mono-cvs.ximian.com"); - Assert (uri1.Equals (uri2)); + Assert.IsTrue (uri1.Equals (uri2)); } [Test] @@ -1153,41 +1153,41 @@ namespace MonoTests.System Uri a = new Uri ("http://www.go-mono.com"); Uri b = new Uri ("http://www.go-mono.com"); - AssertEquals ("#1", a, b); + Assert.AreEqual (a, b, "#1"); a = new Uri ("mailto:user:pwd@go-mono.com?subject=uri"); b = new Uri ("MAILTO:USER:PWD@GO-MONO.COM?SUBJECT=URI"); #if NET_2_0 - Assert ("#2", a != b); - AssertEquals ("#2a", "mailto:user:pwd@go-mono.com?subject=uri", a.ToString ()); - AssertEquals ("#2b", "mailto:USER:PWD@go-mono.com?SUBJECT=URI", b.ToString ()); + Assert.IsTrue (a != b, "#2"); + Assert.AreEqual ("mailto:user:pwd@go-mono.com?subject=uri", a.ToString (), "#2a"); + Assert.AreEqual ("mailto:USER:PWD@go-mono.com?SUBJECT=URI", b.ToString (), "#2b"); #else - AssertEquals ("#2", a, b); + Assert.AreEqual (a, b, "#2"); #endif a = new Uri ("http://www.go-mono.com/ports/"); b = new Uri ("http://www.go-mono.com/PORTS/"); - Assert ("#3", !a.Equals (b)); + Assert.IsTrue (!a.Equals (b), "#3"); } [Test] public void CaseSensitivity () { Uri mailto = new Uri ("MAILTO:USER:PWD@GO-MONO.COM?SUBJECT=URI"); - AssertEquals ("#1", "mailto", mailto.Scheme); - AssertEquals ("#2", "go-mono.com", mailto.Host); - AssertEquals ("#3", "mailto:USER:PWD@go-mono.com?SUBJECT=URI", mailto.ToString ()); + Assert.AreEqual ("mailto", mailto.Scheme, "#1"); + Assert.AreEqual ("go-mono.com", mailto.Host, "#2"); + Assert.AreEqual ("mailto:USER:PWD@go-mono.com?SUBJECT=URI", mailto.ToString (), "#3"); Uri http = new Uri ("HTTP://GO-MONO.COM/INDEX.HTML"); - AssertEquals ("#4", "http", http.Scheme); - AssertEquals ("#5", "go-mono.com", http.Host); - AssertEquals ("#6", "http://go-mono.com/INDEX.HTML", http.ToString ()); + Assert.AreEqual ("http", http.Scheme, "#4"); + Assert.AreEqual ("go-mono.com", http.Host, "#5"); + Assert.AreEqual ("http://go-mono.com/INDEX.HTML", http.ToString (), "#6"); // IPv6 Address Uri ftp = new Uri ("FTP://[::ffFF:169.32.14.5]/"); - AssertEquals ("#7", "ftp", ftp.Scheme); - AssertEquals ("#8", "[0000:0000:0000:0000:0000:FFFF:A920:0E05]", ftp.Host); - AssertEquals ("#9", "ftp://[0000:0000:0000:0000:0000:FFFF:A920:0E05]/", ftp.ToString ()); + Assert.AreEqual ("ftp", ftp.Scheme, "#7"); + Assert.AreEqual ("[0000:0000:0000:0000:0000:FFFF:A920:0E05]", ftp.Host, "#8"); + Assert.AreEqual ("ftp://[0000:0000:0000:0000:0000:FFFF:A920:0E05]/", ftp.ToString (), "#9"); } [Test] @@ -1195,13 +1195,13 @@ namespace MonoTests.System { Uri uri1 = new Uri ("http://www.contoso.com/index.htm#main"); Uri uri2 = new Uri ("http://www.contoso.com/index.htm#fragment"); - AssertEquals ("#1", uri1.GetHashCode (), uri2.GetHashCode ()); + Assert.AreEqual (uri1.GetHashCode (), uri2.GetHashCode (), "#1"); uri2 = new Uri ("http://www.contoso.com/index.htm?x=1"); - Assert ("#2", uri1.GetHashCode () != uri2.GetHashCode ()); + Assert.IsTrue (uri1.GetHashCode () != uri2.GetHashCode (), "#2"); uri2 = new Uri ("http://www.contoso.com:80/index.htm"); - AssertEquals ("#3", uri1.GetHashCode (), uri2.GetHashCode ()); + Assert.AreEqual (uri1.GetHashCode (), uri2.GetHashCode (), "#3"); uri2 = new Uri ("http://www.contoso.com:8080/index.htm"); - Assert ("#4", uri1.GetHashCode () != uri2.GetHashCode ()); + Assert.IsTrue (uri1.GetHashCode () != uri2.GetHashCode (), "#4"); } #if NET_2_0 @@ -1212,16 +1212,16 @@ namespace MonoTests.System Uri uri2 = new Uri ("foo/bar", UriKind.Relative); Uri uri3 = new Uri ("bar/man", UriKind.Relative); Uri uri4 = new Uri ("BAR/MAN", UriKind.Relative); - Assert ("#1a", uri1 == uri2); - Assert ("#1b", uri1.Equals(uri2)); - Assert ("#2a", uri1 != uri3); - Assert ("#2b", !uri1.Equals(uri3)); - Assert ("#3a", uri1 == uri2); - Assert ("#3b", uri1.Equals(uri2)); - Assert ("#4a", uri1 != uri3); - Assert ("#4b", !uri1.Equals(uri3)); - Assert ("#5a", uri3 != uri4); - Assert ("#5b", !uri3.Equals(uri4)); + Assert.IsTrue (uri1 == uri2, "#1a"); + Assert.IsTrue (uri1.Equals(uri2), "#1b"); + Assert.IsTrue (uri1 != uri3, "#2a"); + Assert.IsTrue (!uri1.Equals(uri3), "#2b"); + Assert.IsTrue (uri1 == uri2, "#3a"); + Assert.IsTrue (uri1.Equals(uri2), "#3b"); + Assert.IsTrue (uri1 != uri3, "#4a"); + Assert.IsTrue (!uri1.Equals(uri3), "#4b"); + Assert.IsTrue (uri3 != uri4, "#5a"); + Assert.IsTrue (!uri3.Equals(uri4), "#5b"); } [Test] @@ -1251,11 +1251,11 @@ namespace MonoTests.System [Test] public void TestPartialToString () { - AssertEquals ("#1", new Uri ("foo", UriKind.Relative).ToString (), "foo"); - AssertEquals ("#2", new Uri ("foo#aa", UriKind.Relative).ToString (), "foo#aa"); - AssertEquals ("#3", new Uri ("foo?aa", UriKind.Relative).ToString (), "foo?aa"); - AssertEquals ("#4", new Uri ("foo#dingus?aa", UriKind.Relative).ToString (), "foo#dingus?aa"); - AssertEquals ("#4", new Uri ("foo?dingus#aa", UriKind.Relative).ToString (), "foo?dingus#aa"); + Assert.AreEqual (new Uri ("foo", UriKind.Relative).ToString (), "foo", "#1"); + Assert.AreEqual (new Uri ("foo#aa", UriKind.Relative).ToString (), "foo#aa", "#2"); + Assert.AreEqual (new Uri ("foo?aa", UriKind.Relative).ToString (), "foo?aa", "#3"); + Assert.AreEqual (new Uri ("foo#dingus?aa", UriKind.Relative).ToString (), "foo#dingus?aa", "#4"); + Assert.AreEqual (new Uri ("foo?dingus#aa", UriKind.Relative).ToString (), "foo?dingus#aa", "#4"); } [Test] @@ -1264,8 +1264,8 @@ namespace MonoTests.System Uri uri1 = new Uri ("foo/bar", UriKind.Relative); Uri uri2 = new Uri ("foo/bar", UriKind.Relative); Uri uri3 = new Uri ("bar/man", UriKind.Relative); - AssertEquals ("#1", uri1.GetHashCode(), uri2.GetHashCode()); - Assert ("#2", uri1.GetHashCode() != uri3.GetHashCode()); + Assert.AreEqual (uri1.GetHashCode(), uri2.GetHashCode(), "#1"); + Assert.IsTrue (uri1.GetHashCode() != uri3.GetHashCode(), "#2"); } #endif @@ -1281,35 +1281,33 @@ namespace MonoTests.System Uri uri7 = new Uri ("http://www.contoso2.com/bar/foo/foobar.htm?z=0&y=5"); Uri uri8 = new Uri ("http://www.xxx.com/bar/foo/foobar.htm?z=0&y=5" + (char) 0xa9); - AssertEquals ("#1", "foo/bar/index.htm", uri1.MakeRelative (uri2)); - AssertEquals ("#2", "../../index.htm", uri2.MakeRelative (uri1)); + Assert.AreEqual ("foo/bar/index.htm", uri1.MakeRelative (uri2), "#1"); + Assert.AreEqual ("../../index.htm", uri2.MakeRelative (uri1), "#2"); - AssertEquals ("#3", "../../bar/foo/index.htm", uri2.MakeRelative (uri3)); - AssertEquals ("#4", "../../foo/bar/index.htm", uri3.MakeRelative (uri2)); + Assert.AreEqual ("../../bar/foo/index.htm", uri2.MakeRelative (uri3), "#3"); + Assert.AreEqual ("../../foo/bar/index.htm", uri3.MakeRelative (uri2), "#4"); - AssertEquals ("#5", "../foo2/index.htm", uri3.MakeRelative (uri4)); - AssertEquals ("#6", "../foo/index.htm", uri4.MakeRelative (uri3)); + Assert.AreEqual ("../foo2/index.htm", uri3.MakeRelative (uri4), "#5"); + Assert.AreEqual ("../foo/index.htm", uri4.MakeRelative (uri3), "#6"); - AssertEquals ("#7", "https://www.contoso.com/bar/foo/index.htm?y=1", - uri4.MakeRelative (uri5)); + Assert.AreEqual ("https://www.contoso.com/bar/foo/index.htm?y=1", uri4.MakeRelative (uri5), "#7"); - AssertEquals ("#8", "http://www.contoso2.com/bar/foo/index.htm?x=0", - uri4.MakeRelative (uri6)); + Assert.AreEqual ("http://www.contoso2.com/bar/foo/index.htm?x=0", uri4.MakeRelative (uri6), "#8"); - AssertEquals ("#9", "", uri6.MakeRelative (uri6)); - AssertEquals ("#10", "foobar.htm", uri6.MakeRelative (uri7)); + Assert.AreEqual ("", uri6.MakeRelative (uri6), "#9"); + Assert.AreEqual ("foobar.htm", uri6.MakeRelative (uri7), "#10"); Uri uri10 = new Uri ("mailto:xxx@xxx.com"); Uri uri11 = new Uri ("mailto:xxx@xxx.com?subject=hola"); - AssertEquals ("#11", "", uri10.MakeRelative (uri11)); + Assert.AreEqual ("", uri10.MakeRelative (uri11), "#11"); Uri uri12 = new Uri ("mailto:xxx@mail.xxx.com?subject=hola"); - AssertEquals ("#12", "mailto:xxx@mail.xxx.com?subject=hola", uri10.MakeRelative (uri12)); + Assert.AreEqual ("mailto:xxx@mail.xxx.com?subject=hola", uri10.MakeRelative (uri12), "#12"); Uri uri13 = new Uri ("mailto:xxx@xxx.com/foo/bar"); - AssertEquals ("#13", "/foo/bar", uri10.MakeRelative (uri13)); + Assert.AreEqual ("/foo/bar", uri10.MakeRelative (uri13), "#13"); - AssertEquals ("#14", "http://www.xxx.com/bar/foo/foobar.htm?z=0&y=5" + (char) 0xa9, uri1.MakeRelative (uri8)); + Assert.AreEqual ("http://www.xxx.com/bar/foo/foobar.htm?z=0&y=5" + (char) 0xa9, uri1.MakeRelative (uri8), "#14"); } [Test] @@ -1317,62 +1315,62 @@ namespace MonoTests.System { Uri u = new Uri("http://localhost/../../../a"); #if NET_2_0 - AssertEquals ("http://localhost/a", u.ToString ()); + Assert.AreEqual ("http://localhost/a", u.ToString ()); #else - AssertEquals ("http://localhost/../../../a", u.ToString ()); + Assert.AreEqual ("http://localhost/../../../a", u.ToString ()); #endif u = new Uri ("http://localhost/../c/b/../a"); #if NET_2_0 - AssertEquals ("http://localhost/c/a", u.ToString ()); + Assert.AreEqual ("http://localhost/c/a", u.ToString ()); #else - AssertEquals ("http://localhost/../c/a", u.ToString ()); + Assert.AreEqual ("http://localhost/../c/a", u.ToString ()); #endif } [Test] public void RelativeUri2 () { - AssertEquals ("#1", "hoge:ext", new Uri (new Uri ("hoge:foo:bar:baz"), "hoge:ext").ToString ()); + Assert.AreEqual ("hoge:ext", new Uri (new Uri ("hoge:foo:bar:baz"), "hoge:ext").ToString (), "#1"); if (isWin32) { - AssertEquals ("#2-w", "file:///d:/myhost/ext", new Uri (new Uri ("file:///c:/localhost/bar"), "file:///d:/myhost/ext").ToString ()); - AssertEquals ("#3-w", "file:///c:/localhost/myhost/ext", new Uri (new Uri ("file:///c:/localhost/bar"), "file:myhost/ext").ToString ()); - AssertEquals ("#4-w", "uuid:ext", new Uri (new Uri ("file:///c:/localhost/bar"), "uuid:ext").ToString ()); - AssertEquals ("#5-w", "file:///c:/localhost/ext", new Uri (new Uri ("file:///c:/localhost/bar"), "file:./ext").ToString ()); + Assert.AreEqual ("file:///d:/myhost/ext", new Uri (new Uri ("file:///c:/localhost/bar"), "file:///d:/myhost/ext").ToString (), "#2-w"); + Assert.AreEqual ("file:///c:/localhost/myhost/ext", new Uri (new Uri ("file:///c:/localhost/bar"), "file:myhost/ext").ToString (), "#3-w"); + Assert.AreEqual ("uuid:ext", new Uri (new Uri ("file:///c:/localhost/bar"), "uuid:ext").ToString (), "#4-w"); + Assert.AreEqual ("file:///c:/localhost/ext", new Uri (new Uri ("file:///c:/localhost/bar"), "file:./ext").ToString (), "#5-w"); } else { - AssertEquals ("#2-u", "file:///d/myhost/ext", new Uri (new Uri ("file:///c/localhost/bar"), "file:///d/myhost/ext").ToString ()); - AssertEquals ("#3-u", "file:///c/localhost/myhost/ext", new Uri (new Uri ("file:///c/localhost/bar"), "file:myhost/ext").ToString ()); - AssertEquals ("#4-u", "uuid:ext", new Uri (new Uri ("file:///c/localhost/bar"), "uuid:ext").ToString ()); - AssertEquals ("#5-u", "file:///c/localhost/ext", new Uri (new Uri ("file:///c/localhost/bar"), "file:./ext").ToString ()); + Assert.AreEqual ("file:///d/myhost/ext", new Uri (new Uri ("file:///c/localhost/bar"), "file:///d/myhost/ext").ToString (), "#2-u"); + Assert.AreEqual ("file:///c/localhost/myhost/ext", new Uri (new Uri ("file:///c/localhost/bar"), "file:myhost/ext").ToString (), "#3-u"); + Assert.AreEqual ("uuid:ext", new Uri (new Uri ("file:///c/localhost/bar"), "uuid:ext").ToString (), "#4-u"); + Assert.AreEqual ("file:///c/localhost/ext", new Uri (new Uri ("file:///c/localhost/bar"), "file:./ext").ToString (), "#5-u"); } - AssertEquals ("#6", "http://localhost/ext", new Uri (new Uri ("http://localhost/bar"), "http:./ext").ToString ()); + Assert.AreEqual ("http://localhost/ext", new Uri (new Uri ("http://localhost/bar"), "http:./ext").ToString (), "#6"); } [Test] public void ToStringTest() { Uri uri = new Uri ("dummy://xxx"); - AssertEquals ("#1", "dummy://xxx/", uri.ToString ()); + Assert.AreEqual ("dummy://xxx/", uri.ToString (), "#1"); } [Test] public void CheckSchemeName () { - AssertEquals ("#01", false, Uri.CheckSchemeName (null)); - AssertEquals ("#02", false, Uri.CheckSchemeName ("")); - AssertEquals ("#03", true, Uri.CheckSchemeName ("http")); - AssertEquals ("#04", true, Uri.CheckSchemeName ("http-")); - AssertEquals ("#05", false, Uri.CheckSchemeName ("6http-")); - AssertEquals ("#06", true, Uri.CheckSchemeName ("http6-")); - AssertEquals ("#07", false, Uri.CheckSchemeName ("http6,")); - AssertEquals ("#08", true, Uri.CheckSchemeName ("http6.")); - AssertEquals ("#09", false, Uri.CheckSchemeName ("+http")); - AssertEquals ("#10", true, Uri.CheckSchemeName ("htt+p6")); + Assert.AreEqual (false, Uri.CheckSchemeName (null), "#01"); + Assert.AreEqual (false, Uri.CheckSchemeName (""), "#02"); + Assert.AreEqual (true, Uri.CheckSchemeName ("http"), "#03"); + Assert.AreEqual (true, Uri.CheckSchemeName ("http-"), "#04"); + Assert.AreEqual (false, Uri.CheckSchemeName ("6http-"), "#05"); + Assert.AreEqual (true, Uri.CheckSchemeName ("http6-"), "#06"); + Assert.AreEqual (false, Uri.CheckSchemeName ("http6,"), "#07"); + Assert.AreEqual (true, Uri.CheckSchemeName ("http6."), "#08"); + Assert.AreEqual (false, Uri.CheckSchemeName ("+http"), "#09"); + Assert.AreEqual (true, Uri.CheckSchemeName ("htt+p6"), "#10"); // 0x00E1 -> ã #if NET_2_0 - Assert ("#11", !Uri.CheckSchemeName ("htt\u00E1+p6")); + Assert.IsTrue (!Uri.CheckSchemeName ("htt\u00E1+p6"), "#11"); #else - Assert ("#11", Uri.CheckSchemeName ("htt\u00E1+p6")); + Assert.IsTrue (Uri.CheckSchemeName ("htt\u00E1+p6"), "#11"); #endif } @@ -1385,9 +1383,9 @@ namespace MonoTests.System bool b = Uri.CheckSchemeName (c.ToString ()); #if NET_2_0 bool valid = (((i >= 0x41) && (i <= 0x5A)) || ((i >= 0x61) && (i <= 0x7A))); - AssertEquals (s, valid, b); + Assert.AreEqual (valid, b, s); #else - AssertEquals (s, Char.IsLetter (c), b); + Assert.AreEqual (Char.IsLetter (c), b, s); #endif } } @@ -1403,9 +1401,9 @@ namespace MonoTests.System bool common = Char.IsDigit (c) || (c == '+') || (c == '-') || (c == '.'); #if NET_2_0 bool valid = (common || ((i >= 0x41) && (i <= 0x5A)) || ((i >= 0x61) && (i <= 0x7A))); - AssertEquals (s, valid, b); + Assert.AreEqual (valid, b, s); #else - AssertEquals (s, (Char.IsLetter (c) || common), b); + Assert.AreEqual ((Char.IsLetter (c) || common), b, s); #endif } } @@ -1426,29 +1424,29 @@ namespace MonoTests.System { // bug 75144 Uri uri = new Uri ("file://"); - AssertEquals ("#1", true, uri.IsFile); - AssertEquals ("#2", false, uri.IsUnc); - AssertEquals ("#3", "file", uri.Scheme); - AssertEquals ("#4", "/", uri.LocalPath); - AssertEquals ("#5", string.Empty, uri.Query); - AssertEquals ("#6", "/", uri.AbsolutePath); - AssertEquals ("#7", "file:///", uri.AbsoluteUri); - AssertEquals ("#8", string.Empty, uri.Authority); - AssertEquals ("#9", string.Empty, uri.Host); - AssertEquals ("#10", UriHostNameType.Basic, uri.HostNameType); - AssertEquals ("#11", string.Empty, uri.Fragment); - AssertEquals ("#12", true, uri.IsDefaultPort); + Assert.AreEqual (true, uri.IsFile, "#1"); + Assert.AreEqual (false, uri.IsUnc, "#2"); + Assert.AreEqual ("file", uri.Scheme, "#3"); + Assert.AreEqual ("/", uri.LocalPath, "#4"); + Assert.AreEqual (string.Empty, uri.Query, "#5"); + Assert.AreEqual ("/", uri.AbsolutePath, "#6"); + Assert.AreEqual ("file:///", uri.AbsoluteUri, "#7"); + Assert.AreEqual (string.Empty, uri.Authority, "#8"); + Assert.AreEqual (string.Empty, uri.Host, "#9"); + Assert.AreEqual (UriHostNameType.Basic, uri.HostNameType, "#10"); + Assert.AreEqual (string.Empty, uri.Fragment, "#11"); + Assert.AreEqual (true, uri.IsDefaultPort, "#12"); #if NET_2_0 - Assert ("#13", uri.IsLoopback); + Assert.IsTrue (uri.IsLoopback, "#13"); #else - Assert ("#13", !uri.IsLoopback); + Assert.IsTrue (!uri.IsLoopback, "#13"); #endif - AssertEquals ("#14", "/", uri.PathAndQuery); - AssertEquals ("#15", false, uri.UserEscaped); - AssertEquals ("#16", string.Empty, uri.UserInfo); - AssertEquals ("#17", "file://", uri.GetLeftPart (UriPartial.Authority)); - AssertEquals ("#18", "file:///", uri.GetLeftPart (UriPartial.Path)); - AssertEquals ("#19", "file://", uri.GetLeftPart (UriPartial.Scheme)); + Assert.AreEqual ("/", uri.PathAndQuery, "#14"); + Assert.AreEqual (false, uri.UserEscaped, "#15"); + Assert.AreEqual (string.Empty, uri.UserInfo, "#16"); + Assert.AreEqual ("file://", uri.GetLeftPart (UriPartial.Authority), "#17"); + Assert.AreEqual ("file:///", uri.GetLeftPart (UriPartial.Path), "#18"); + Assert.AreEqual ("file://", uri.GetLeftPart (UriPartial.Scheme), "#19"); } [Test] @@ -1456,8 +1454,8 @@ namespace MonoTests.System { Uri uri = new Uri ("http://localhost/"); string [] segments = uri.Segments; - AssertEquals ("#01", 1, segments.Length); - AssertEquals ("#02", "/", segments [0]); + Assert.AreEqual (1, segments.Length, "#01"); + Assert.AreEqual ("/", segments [0], "#02"); } [Test] @@ -1465,10 +1463,10 @@ namespace MonoTests.System { Uri uri = new Uri ("http://localhost/dir/dummypage.html"); string [] segments = uri.Segments; - AssertEquals ("#01", 3, segments.Length); - AssertEquals ("#02", "/", segments [0]); - AssertEquals ("#03", "dir/", segments [1]); - AssertEquals ("#04", "dummypage.html", segments [2]); + Assert.AreEqual (3, segments.Length, "#01"); + Assert.AreEqual ("/", segments [0], "#02"); + Assert.AreEqual ("dir/", segments [1], "#03"); + Assert.AreEqual ("dummypage.html", segments [2], "#04"); } [Test] @@ -1476,10 +1474,10 @@ namespace MonoTests.System { Uri uri = new Uri ("http://localhost/dir/dummypage/"); string [] segments = uri.Segments; - AssertEquals ("#01", 3, segments.Length); - AssertEquals ("#02", "/", segments [0]); - AssertEquals ("#03", "dir/", segments [1]); - AssertEquals ("#04", "dummypage/", segments [2]); + Assert.AreEqual (3, segments.Length, "#01"); + Assert.AreEqual ("/", segments [0], "#02"); + Assert.AreEqual ("dir/", segments [1], "#03"); + Assert.AreEqual ("dummypage/", segments [2], "#04"); } [Test] @@ -1490,15 +1488,15 @@ namespace MonoTests.System { Uri uri = new Uri ("file:///c:/hello"); string [] segments = uri.Segments; - AssertEquals ("#01", 3, segments.Length); + Assert.AreEqual (3, segments.Length, "#01"); #if NET_2_0 - AssertEquals ("#02", "/", segments [0]); - AssertEquals ("#03", "c:/", segments[1]); + Assert.AreEqual ("/", segments [0], "#02"); + Assert.AreEqual ("c:/", segments[1], "#03"); #else - AssertEquals ("#02", "c:", segments [0]); - AssertEquals ("#03", "/", segments [1]); + Assert.AreEqual ("c:", segments [0], "#02"); + Assert.AreEqual ("/", segments [1], "#03"); #endif - AssertEquals ("#04", "hello", segments [2]); + Assert.AreEqual ("hello", segments [2], "#04"); } [Test] @@ -1506,11 +1504,11 @@ namespace MonoTests.System { Uri uri = new Uri ("http://www.xxx.com/bar/foo/foobar.htm?z=0&y=5" + (char) 0xa9); string [] segments = uri.Segments; - AssertEquals ("#01", 4, segments.Length); - AssertEquals ("#02", "/", segments [0]); - AssertEquals ("#03", "bar/", segments [1]); - AssertEquals ("#04", "foo/", segments [2]); - AssertEquals ("#05", "foobar.htm", segments [3]); + Assert.AreEqual (4, segments.Length, "#01"); + Assert.AreEqual ("/", segments [0], "#02"); + Assert.AreEqual ("bar/", segments [1], "#03"); + Assert.AreEqual ("foo/", segments [2], "#04"); + Assert.AreEqual ("foobar.htm", segments [3], "#05"); } [Test] @@ -1535,7 +1533,7 @@ namespace MonoTests.System public void InvalidPort1 () { Uri uri = new Uri ("http://www.contoso.com:65536/foo/bar/"); - AssertEquals (65536, uri.Port); + Assert.AreEqual (65536, uri.Port); } #if NET_2_0 @@ -1546,7 +1544,7 @@ namespace MonoTests.System { // UInt32.MaxValue gives port == -1 !!! Uri uri = new Uri ("http://www.contoso.com:4294967295/foo/bar/"); - AssertEquals (-1, uri.Port); + Assert.AreEqual (-1, uri.Port); } #if NET_2_0 @@ -1557,7 +1555,7 @@ namespace MonoTests.System { // ((uint) Int32.MaxValue + (uint) 1) gives port == -2147483648 !!! Uri uri = new Uri ("http://www.contoso.com:2147483648/foo/bar/"); - AssertEquals (-2147483648, uri.Port); + Assert.AreEqual (-2147483648, uri.Port); } #if NET_2_0 @@ -1566,7 +1564,7 @@ namespace MonoTests.System { // on .NET 2.0 a port number is limited to UInt16.MaxValue Uri uri = new Uri ("http://www.contoso.com:65535/foo/bar/"); - AssertEquals (65535, uri.Port); + Assert.AreEqual (65535, uri.Port); } #endif @@ -1599,12 +1597,12 @@ namespace MonoTests.System // This works--the location is not part of the absolute path string path = "file://localhost/tmp/foo/bar"; Uri fileUri = new Uri( path ); - AssertEquals (path, "/tmp/foo/bar", fileUri.AbsolutePath); + Assert.AreEqual ("/tmp/foo/bar", fileUri.AbsolutePath, path); // Empty path == localhost, in theory path = "file:///c:/tmp/foo/bar"; fileUri = new Uri( path ); - AssertEquals (path, "c:/tmp/foo/bar", fileUri.AbsolutePath); + Assert.AreEqual ("c:/tmp/foo/bar", fileUri.AbsolutePath, path); } [Test] @@ -1622,10 +1620,10 @@ namespace MonoTests.System for (int i = 0; i < 128; i++) sb.Append ((char) i); - AssertEquals ("%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23%24%25%26'()*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F", + Assert.AreEqual ("%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23%24%25%26'()*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F", Uri.EscapeDataString (sb.ToString ())); - AssertEquals ("%C3%A1", Uri.EscapeDataString ("á")); + Assert.AreEqual ("%C3%A1", Uri.EscapeDataString ("á")); } [Test] public void TestEscapeUriString () @@ -1634,9 +1632,9 @@ namespace MonoTests.System for (int i = 0; i < 128; i++) sb.Append ((char) i); - AssertEquals ("%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22#$%25&'()*+,-./0123456789:;%3C=%3E?@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F", + Assert.AreEqual ("%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22#$%25&'()*+,-./0123456789:;%3C=%3E?@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F", Uri.EscapeUriString (sb.ToString ())); - AssertEquals ("%C3%A1", Uri.EscapeDataString ("á")); + Assert.AreEqual ("%C3%A1", Uri.EscapeDataString ("á")); } #endif @@ -1649,7 +1647,7 @@ namespace MonoTests.System "file:///tmp/ü (%232).jpg" }; foreach (string test in tests) - AssertEquals (test, new Uri (test).ToString ()); + Assert.AreEqual (test, new Uri (test).ToString ()); } // This test doesn't work on Linux, and arguably shouldn't work. @@ -1673,15 +1671,15 @@ namespace MonoTests.System string path = "file:///tmp/foo/bar"; Uri fileUri = new Uri( path ); //#if NET_2_0 - AssertEquals (path, "/tmp/foo/bar", fileUri.AbsolutePath); + Assert.AreEqual ("/tmp/foo/bar", fileUri.AbsolutePath, path); //#else -// AssertEquals (path, "/foo/bar", fileUri.AbsolutePath); +// Assert.AreEqual ("/foo/bar", fileUri.AbsolutePath, path); //#endif // bug #76643 string path2 = "file:///foo%25bar"; fileUri = new Uri (path2); - AssertEquals (path2, "file:///foo%25bar", fileUri.ToString ()); + Assert.AreEqual ("file:///foo%25bar", fileUri.ToString (), path2); } public static void Print (Uri uri) diff --git a/mcs/class/SystemWebTestShim/Assembly/AssemblyInfo.cs b/mcs/class/SystemWebTestShim/Assembly/AssemblyInfo.cs new file mode 100644 index 00000000000..07983444ac3 --- /dev/null +++ b/mcs/class/SystemWebTestShim/Assembly/AssemblyInfo.cs @@ -0,0 +1,49 @@ +// +// AssemblyInfo.cs +// +// Author: +// Andreas Nahr (ClassDevelopment@A-SoftTech.com) +// +// (C) 2003 Ximian, Inc. http://www.ximian.com +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using System.Reflection; +using System.Resources; +using System.Security; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about the System.Web assembly + +[assembly: AssemblyVersion (Consts.FxVersion)] +[assembly: SatelliteContractVersion (Consts.FxVersion)] + +[assembly: AssemblyTitle("SystemWebTestShim.dll")] +[assembly: AssemblyCompany("MONO development team")] +[assembly: AssemblyProduct("MONO CLI")] +[assembly: AssemblyCopyright("(c) 2003 Various Authors")] + +[assembly: AssemblyDelaySign (true)] +[assembly: AssemblyKeyFile ("../winfx.pub")] diff --git a/mcs/class/SystemWebTestShim/ChangeLog b/mcs/class/SystemWebTestShim/ChangeLog new file mode 100644 index 00000000000..b449f7b425e --- /dev/null +++ b/mcs/class/SystemWebTestShim/ChangeLog @@ -0,0 +1,19 @@ +2009-07-07 Raja R Harinath + + * SystemWebTestShim.dll.sources: Add UriUtils.cs. + +2009-07-07 Raja R Harinath + + * SystemWebTestShim.dll.sources: Add Adapters.cs. + +2009-07-06 Raja R Harinath + + * SystemWebTestShim.dll.sources: Add Page.cs. + +2009-07-06 Raja R Harinath + + * SystemWebTestShim.dll.sources: Add HttpCapabilitiesBase.cs. + +2009-07-06 Raja R Harinath + + * SystemWebTestShim.dll.sources: Add BuildManager.cs. diff --git a/mcs/class/SystemWebTestShim/Makefile b/mcs/class/SystemWebTestShim/Makefile new file mode 100644 index 00000000000..823b6e0c65f --- /dev/null +++ b/mcs/class/SystemWebTestShim/Makefile @@ -0,0 +1,11 @@ +thisdir = class/SystemWebTestShim +include ../../build/rules.make + +LIBRARY = SystemWebTestShim.dll + +LIB_MCS_FLAGS = -r:System.Web.dll + +NO_INSTALL = yes +NO_SIGN_ASSEMBLY = yes + +include $(topdir)/build/library.make diff --git a/mcs/class/SystemWebTestShim/SystemWebTestShim.dll.sources b/mcs/class/SystemWebTestShim/SystemWebTestShim.dll.sources new file mode 100644 index 00000000000..7710ca9473d --- /dev/null +++ b/mcs/class/SystemWebTestShim/SystemWebTestShim.dll.sources @@ -0,0 +1,7 @@ +Assembly/AssemblyInfo.cs +SystemWebTestShim/Adapters.cs +SystemWebTestShim/BuildManager.cs +SystemWebTestShim/HttpCapabilitiesBase.cs +SystemWebTestShim/Page.cs +SystemWebTestShim/UrlUtils.cs +../../build/common/Consts.cs diff --git a/mcs/class/SystemWebTestShim/SystemWebTestShim/Adapters.cs b/mcs/class/SystemWebTestShim/SystemWebTestShim/Adapters.cs new file mode 100644 index 00000000000..d12bc0664d8 --- /dev/null +++ b/mcs/class/SystemWebTestShim/SystemWebTestShim/Adapters.cs @@ -0,0 +1,85 @@ +// +// SystemWebTestShim/Adapters.cs +// +// Author: +// Raja R Harinath (harinath@hurrynot.org) +// +// (C) 2009 Novell, Inc (http://www.novell.com) +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if NET_2_0 + +using System.Collections; +using System.IO; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace SystemWebTestShim { + using Orig = System.Web.UI.Adapters; + + public class PageAdapter : Orig.PageAdapter { + public PageAdapter (Page p) : base (p) {} + } +} + +namespace SystemWebTestShim { + using Orig = System.Web.UI.WebControls.Adapters; + + public class DataBoundControlAdapter : Orig.DataBoundControlAdapter { + public DataBoundControlAdapter (DataBoundControl c) : base (c) {} + + public new void PerformDataBinding (IEnumerable data) + { + base.PerformDataBinding (data); + } + } + + public class HierarchicalDataBoundControlAdapter : Orig.HierarchicalDataBoundControlAdapter { + public HierarchicalDataBoundControlAdapter (HierarchicalDataBoundControl h) : base (h) {} + + public new void PerformDataBinding () + { + base.PerformDataBinding (); + } + } + + public class WebControlAdapter : Orig.WebControlAdapter { + public WebControlAdapter (WebControl c) : base (c) {} + } + + public class MenuAdapter : Orig.MenuAdapter { + public MenuAdapter (Menu c) : base (c) {} + } + + public class HideDisabledControlAdapter : Orig.HideDisabledControlAdapter { + public HideDisabledControlAdapter (WebControl c) : base (c) {} + + public new void Render (HtmlTextWriter w) + { + base.Render (w); + } + } +} + +#endif diff --git a/mcs/class/SystemWebTestShim/SystemWebTestShim/BuildManager.cs b/mcs/class/SystemWebTestShim/SystemWebTestShim/BuildManager.cs new file mode 100644 index 00000000000..13538dbd8e8 --- /dev/null +++ b/mcs/class/SystemWebTestShim/SystemWebTestShim/BuildManager.cs @@ -0,0 +1,40 @@ +// +// SystemWebTestShim/BuildManager.cs +// +// Author: +// Raja R Harinath (harinath@hurrynot.org) +// +// (C) 2009 Novell, Inc (http://www.novell.com) +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +namespace SystemWebTestShim { + public class BuildManager { + public static void SuppressDebugModeMessages () + { +#if NET_2_0 + global::System.Web.Compilation.BuildManager.suppressDebugModeMessages = true; +#endif + } + } +} diff --git a/mcs/class/SystemWebTestShim/SystemWebTestShim/ChangeLog b/mcs/class/SystemWebTestShim/SystemWebTestShim/ChangeLog new file mode 100644 index 00000000000..daa758f7c70 --- /dev/null +++ b/mcs/class/SystemWebTestShim/SystemWebTestShim/ChangeLog @@ -0,0 +1,4 @@ +2009-07-06 Raja R Harinath + + * BuildManager.cs: New. + diff --git a/mcs/class/SystemWebTestShim/SystemWebTestShim/HttpCapabilitiesBase.cs b/mcs/class/SystemWebTestShim/SystemWebTestShim/HttpCapabilitiesBase.cs new file mode 100644 index 00000000000..d4b59e18cba --- /dev/null +++ b/mcs/class/SystemWebTestShim/SystemWebTestShim/HttpCapabilitiesBase.cs @@ -0,0 +1,44 @@ +// +// SystemWebTestShim/HttpCapabilitiesBase.cs +// +// Author: +// Raja R Harinath (harinath@hurrynot.org) +// +// (C) 2009 Novell, Inc (http://www.novell.com) +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if NET_2_0 + +using Orig = System.Web.Configuration.HttpCapabilitiesBase; + +namespace SystemWebTestShim { + public class HttpCapabilitiesBase { + public static bool GetConfigCapabilities_called { + get { return Orig.GetConfigCapabilities_called; } + set { Orig.GetConfigCapabilities_called = value; } + } + } +} + +#endif diff --git a/mcs/class/SystemWebTestShim/SystemWebTestShim/Page.cs b/mcs/class/SystemWebTestShim/SystemWebTestShim/Page.cs new file mode 100644 index 00000000000..8726ddc4f26 --- /dev/null +++ b/mcs/class/SystemWebTestShim/SystemWebTestShim/Page.cs @@ -0,0 +1,47 @@ +// +// SystemWebTestShim/Page.cs +// +// Author: +// Raja R Harinath (harinath@hurrynot.org) +// +// (C) 2009 Novell, Inc (http://www.novell.com) +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using Orig = System.Web.UI; +using System.Web; + +namespace SystemWebTestShim { + public class Page : Orig.Page { +#if NET_2_0 + public new string RawViewState { + set { base.RawViewState = value; } + } + + public new void SetContext (HttpContext ctx) + { + base.SetContext (ctx); + } +#endif + } +} diff --git a/mcs/class/SystemWebTestShim/SystemWebTestShim/UrlUtils.cs b/mcs/class/SystemWebTestShim/SystemWebTestShim/UrlUtils.cs new file mode 100644 index 00000000000..2563a016975 --- /dev/null +++ b/mcs/class/SystemWebTestShim/SystemWebTestShim/UrlUtils.cs @@ -0,0 +1,44 @@ +// +// SystemWebTestShim/UrlUtils.cs +// +// Author: +// Raja R Harinath (harinath@hurrynot.org) +// +// (C) 2009 Novell, Inc (http://www.novell.com) +// + +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if NET_2_0 + +using Orig = System.Web.Util.UrlUtils; + +namespace SystemWebTestShim { + public class UrlUtils { + public static string Canonic (string path) + { + return Orig.Canonic (path); + } + } +} + +#endif \ No newline at end of file diff --git a/mcs/class/corlib/Mono.Globalization.Unicode/ChangeLog b/mcs/class/corlib/Mono.Globalization.Unicode/ChangeLog index 0716a7a42be..1c7b2f7fb3b 100644 --- a/mcs/class/corlib/Mono.Globalization.Unicode/ChangeLog +++ b/mcs/class/corlib/Mono.Globalization.Unicode/ChangeLog @@ -1,3 +1,22 @@ +2008-06-19 Atsushi Enomoto + + * Normalization.cs : + - reverted the previous index calculation change. It was correctly + implemented and I rather broke it. + - fix index calculation on combining. + - NFKD was incorrectly directed to combining path. It should not. + - Simplify quick check. + +2008-06-15 Atsushi Enomoto + + * Normalization.cs : For NFC and NFKC, IsNormalized() was not working + enough to check composed characters. It's not possible without + the actual composition, so just call Normalize() and compare them. + In Normalize() mapping helper didn't pick correct map index since + the table for index stores index for "uncompressed" numbers. + * NormalizationTableUtil.cs : updated to the latest UCD. + * Makefile : to build test, source file must be downloaded too. + 2008-11-05 Atsushi Enomoto * ucd.cs : Write type for *_count. Add notice to not edit diff --git a/mcs/class/corlib/Mono.Globalization.Unicode/Makefile b/mcs/class/corlib/Mono.Globalization.Unicode/Makefile index 73a3dcbb8ad..021a653b973 100644 --- a/mcs/class/corlib/Mono.Globalization.Unicode/Makefile +++ b/mcs/class/corlib/Mono.Globalization.Unicode/Makefile @@ -29,7 +29,7 @@ normalization: $(NORM_FILENAME) collation : $(MSCOMPAT_FILENAME) -norm-test : $(NORM_TEST_CS) +norm-test : $(NORM_TEST_CS) $(NORM_TEST) $(CS2COMPILE) $(NORM_TEST_CS) -d:TEST_STANDALONE distclean : @@ -69,11 +69,11 @@ $(COLL_ELEM_FILENAME).exe : $(COLL_TABLE_GENERATOR_SOURCES) # normalization (including combining class) $(NORM_FILENAME) : $(NORMGEN_FILENAME).exe Normalization.cs $(NORM_TABLE) $(UCD_TABLE) $(CB_CLASS_TABLE) echo "// WARNING: Do not edit this file. It is autogenerated." > $(NORM_FILENAME) - echo "#define GENERATE_TABLE" > $(NORM_FILENAME) - cat Normalization.cs >> $(NORM_FILENAME) || rm $(NORM_FILENAME) - $(RUNTIME) $(NORMGEN_FILENAME).exe >> $(NORM_FILENAME) || rm $(NORM_FILENAME) - echo " }" >> $(NORM_FILENAME) - echo "}" >> $(NORM_FILENAME) + echo "#define GENERATE_TABLE" >> $(NORM_FILENAME); \ + cat Normalization.cs >> $(NORM_FILENAME); \ + $(RUNTIME) $(NORMGEN_FILENAME).exe >> $(NORM_FILENAME); \ + echo " }" >> $(NORM_FILENAME); \ + echo "}" >> $(NORM_FILENAME) || rm $(NORM_FILENAME) NORM_TABLE_GENERATOR_SOURCES = \ $(NORMGEN_FILENAME).cs \ diff --git a/mcs/class/corlib/Mono.Globalization.Unicode/Normalization.cs b/mcs/class/corlib/Mono.Globalization.Unicode/Normalization.cs index 355315d8ed9..2da5ef144e9 100644 --- a/mcs/class/corlib/Mono.Globalization.Unicode/Normalization.cs +++ b/mcs/class/corlib/Mono.Globalization.Unicode/Normalization.cs @@ -57,7 +57,7 @@ namespace Mono.Globalization.Unicode return mapIdxToComposite [NUtil.Composite.ToIndex (src)]; } - static short GetPrimaryCompositeHelperIndex (int cp) + static int GetPrimaryCompositeHelperIndex (int cp) { return helperIndex [NUtil.Helper.ToIndex (cp)]; } @@ -148,24 +148,15 @@ namespace Mono.Globalization.Unicode private static void Combine (StringBuilder sb, int start, int checkType) { for (int i = start; i < sb.Length; i++) { - switch (QuickCheck (sb [i], checkType)) { - case NormalizationCheck.Yes: + if (QuickCheck (sb [i], checkType) == NormalizationCheck.Yes) continue; - case NormalizationCheck.No: - break; - case NormalizationCheck.Maybe: - if (i == 0) - continue; - else - break; - } int cur = i; // FIXME: It should check "blocked" too - for (;i >= 0; i--) + for (;i > 0; i--) // this loop does not check sb[0], but regardless of the condition below it should not go under 0. if (!CanBePrimaryComposite ((int) sb [i])) break; - i++; + int idx = 0; for (; i < cur; i++) { idx = GetPrimaryCompositeMapIndex (sb, (int) sb [i], i); @@ -363,6 +354,14 @@ namespace Mono.Globalization.Unicode case NormalizationCheck.No: return false; case NormalizationCheck.Maybe: + // for those forms with composition, it cannot be checked here + switch (type) { + case 0: // NFC + case 2: // NFKC + return source == Normalize (source, type); + } + // go on... + // partly copied from Combine() int cur = i; // FIXME: It should check "blocked" too @@ -388,6 +387,7 @@ namespace Mono.Globalization.Unicode case 2: return Compose (source, type); case 1: + case 3: return Decompose (source, type); } } diff --git a/mcs/class/corlib/Mono.Globalization.Unicode/NormalizationTableUtil.cs b/mcs/class/corlib/Mono.Globalization.Unicode/NormalizationTableUtil.cs index 357795a4ea3..38e47f94fdf 100644 --- a/mcs/class/corlib/Mono.Globalization.Unicode/NormalizationTableUtil.cs +++ b/mcs/class/corlib/Mono.Globalization.Unicode/NormalizationTableUtil.cs @@ -15,13 +15,13 @@ namespace Mono.Globalization.Unicode static NormalizationTableUtil () { int [] propStarts = new int [] { - 0, 0x0910, 0x1D00, 0x2460, 0x2980, - 0x2D60, 0x2E90, 0xF900, + 0, 0x0910, 0x1B00, 0x2460, 0x2980, + 0x2C70, 0x2D60, 0x2E90, 0xA770, 0xF900, // 0x1D100, 0x2f800, 0x2fa10 }; int [] propEnds = new int [] { 0x06E0, 0x1200, 0x2330, 0x2600, 0x2AE0, - 0x2D70, 0x3400, 0x10000, + 0x2C80, 0x2D70, 0x3400, 0xA780, 0x10000, // 0x1D800, 0x2f810, 0x2fa20 }; int [] mapStarts = new int [] { diff --git a/mcs/class/corlib/System.Reflection.Emit/AssemblyBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/AssemblyBuilder.cs index 1daa0f831d1..a7093ddb2f7 100644 --- a/mcs/class/corlib/System.Reflection.Emit/AssemblyBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/AssemblyBuilder.cs @@ -737,6 +737,17 @@ namespace System.Reflection.Emit } } + internal bool IsRun { + get { + return access == (uint)AssemblyBuilderAccess.Run || access == (uint)AssemblyBuilderAccess.RunAndSave +#if NET_4_0 + || access == (uint)AssemblyBuilderAccess.RunAndCollect +#endif + ; + + } + } + internal string AssemblyDir { get { return dir; diff --git a/mcs/class/corlib/System.Reflection.Emit/ChangeLog b/mcs/class/corlib/System.Reflection.Emit/ChangeLog index 262d6bf5388..5b056db9480 100644 --- a/mcs/class/corlib/System.Reflection.Emit/ChangeLog +++ b/mcs/class/corlib/System.Reflection.Emit/ChangeLog @@ -1,3 +1,55 @@ +2009-07-08 Rodrigo Kumpera + + * DerivedTypes.cs: Implemented PointerType. + + * TypeBuilder.cs (MakePointerType): Return an + instance of PointerType. + +2009-07-08 Rodrigo Kumpera + + * DerivedTypes.cs: Implemented ByRefType. + + * TypeBuilder.cs (MakeByRefType): Return an + instance of ByRefType. + +2009-07-08 Rodrigo Kumpera + + * DerivedTypes.cs: Refactor the types here to move + a lot of code to the base DerivedType in preparation + for upcomming ByRefType and PointerType puppies. + +2009-07-07 Rodrigo Kumpera + + * TypeBuilder.cs (IsArrayImpl): Return false always as a + typebuilder will never represent an array. + + * TypeBuilder.cs (MakeArrayType): Return a new instance of + ArrayType instead of calling into MonoType machinery. + + * DerivedTypes.cs: New file with all the internal types + used by SRE to represent derived types from TypeBuilder: + arrays, pointers and byrefs'. + +2009-07-02 Rodrigo Kumpera + + * AssemblyBuilder.cs: Add IsRun property that returns true if + any execute mode is enabled. + + * ModuleBuilder.cs: Add set_wrappers_type icall to define which type + is to be bound to wrappers. Create a new abstract type and call it + when the assembly is build this way. + + Replace explicit checks for global_type with calls to CreateGlobalType. + + * TypeBuilder.cs: Internal ctor now takes an extra table_idx argument. + +2009-06-25 Sylvain Dupont + + * CustomAttributeBuilder.cs: Properly handle element type for safe + arrays (SafeArraySubType marshal attribute option). + + Code is contributed under MIT/X11 license. + 2009-06-12 Jb Evain * AssemblyBuilder.cs (Save): throw a NotImplementedException diff --git a/mcs/class/corlib/System.Reflection.Emit/CustomAttributeBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/CustomAttributeBuilder.cs index 556808d3781..420c1397252 100644 --- a/mcs/class/corlib/System.Reflection.Emit/CustomAttributeBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/CustomAttributeBuilder.cs @@ -266,6 +266,12 @@ namespace System.Reflection.Emit { hasSize = true; break; case "SafeArraySubType": + value = (int)data[pos++]; + value |= ((int)data[pos++]) << 8; + value |= ((int)data[pos++]) << 16; + value |= ((int)data[pos++]) << 24; + subtype = (UnmanagedType)value; + break; case "IidParameterIndex": pos += 4; break; diff --git a/mcs/class/corlib/System.Reflection.Emit/DerivedTypes.cs b/mcs/class/corlib/System.Reflection.Emit/DerivedTypes.cs new file mode 100644 index 00000000000..d8f88bcf278 --- /dev/null +++ b/mcs/class/corlib/System.Reflection.Emit/DerivedTypes.cs @@ -0,0 +1,400 @@ +// +// System.Reflection.Emit.DerivedTypes.cs +// +// Authors: +// Rodrigo Kumpera +// +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System.Reflection; +using System.Reflection.Emit; +using System.Collections; +using System.Runtime.CompilerServices; +using System.Globalization; +using System.Runtime.InteropServices; +using System.Runtime.Serialization; +using System.Text; + + +namespace System.Reflection.Emit +{ + internal enum TypeKind : int { + SZARRAY = 0x1d, + ARRAY = 0x14 + } + + internal abstract class DerivedType : Type + { + internal Type elementType; + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern void create_unmanaged_type (Type type); + + internal DerivedType (Type elementType) + { + this.elementType = elementType; + } + + internal abstract String FormatName (string elementName); + + public override Type GetInterface (string name, bool ignoreCase) + { + throw new NotSupportedException (); + } + + public override Type[] GetInterfaces () + { + throw new NotSupportedException (); + } + + public override Type GetElementType () + { + return elementType; + } + + public override EventInfo GetEvent (string name, BindingFlags bindingAttr) + { + throw new NotSupportedException (); + } + + public override EventInfo[] GetEvents (BindingFlags bindingAttr) + { + throw new NotSupportedException (); + } + + public override FieldInfo GetField( string name, BindingFlags bindingAttr) + { + throw new NotSupportedException (); + } + + public override FieldInfo[] GetFields (BindingFlags bindingAttr) + { + throw new NotSupportedException (); + } + + public override MemberInfo[] GetMembers (BindingFlags bindingAttr) + { + throw new NotSupportedException (); + } + + protected override MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, + CallingConventions callConvention, Type[] types, + ParameterModifier[] modifiers) + { + throw new NotSupportedException (); + } + + public override MethodInfo[] GetMethods (BindingFlags bindingAttr) + { + throw new NotSupportedException (); + } + + public override Type GetNestedType (string name, BindingFlags bindingAttr) + { + throw new NotSupportedException (); + } + + public override Type[] GetNestedTypes (BindingFlags bindingAttr) + { + throw new NotSupportedException (); + } + + public override PropertyInfo[] GetProperties (BindingFlags bindingAttr) + { + throw new NotSupportedException (); + } + + protected override PropertyInfo GetPropertyImpl (string name, BindingFlags bindingAttr, Binder binder, + Type returnType, Type[] types, ParameterModifier[] modifiers) + { + throw new NotSupportedException (); + } + + protected override ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr, + Binder binder, + CallingConventions callConvention, + Type[] types, + ParameterModifier[] modifiers) + { + throw new NotSupportedException (); + } + + + protected override TypeAttributes GetAttributeFlagsImpl () + { + /*LAMEIMPL MS just return the elementType.Attributes*/ + return elementType.Attributes; + } + + protected override bool HasElementTypeImpl () + { + return true; + } + + protected override bool IsArrayImpl () + { + return false; + } + + protected override bool IsByRefImpl () + { + return false; + } + + protected override bool IsCOMObjectImpl () + { + return false; + } + + protected override bool IsPointerImpl () + { + return false; + } + + protected override bool IsPrimitiveImpl () + { + return false; + } + + + public override ConstructorInfo[] GetConstructors (BindingFlags bindingAttr) + { + throw new NotSupportedException (); + } + + public override object InvokeMember (string name, BindingFlags invokeAttr, + Binder binder, object target, object[] args, + ParameterModifier[] modifiers, + CultureInfo culture, string[] namedParameters) + { + throw new NotSupportedException (); + } + + public override InterfaceMapping GetInterfaceMap (Type interfaceType) + { + throw new NotSupportedException (); + } + + public override bool IsInstanceOfType (object o) + { + return false; + } + +#if NET_2_0 + //FIXME this should be handled by System.Type + public override Type MakeGenericType (params Type[] typeArguments) + { + throw new NotSupportedException (); + } + + public override Type MakeArrayType () + { + return MakeArrayType (1); + } + + public override Type MakeArrayType (int rank) + { + if (rank < 1) + throw new IndexOutOfRangeException (); + return new ArrayType (this, rank); + } + + public override Type MakeByRefType () + { + return new ByRefType (this); + } + + public override Type MakePointerType () + { + return new PointerType (this); + } + + public override GenericParameterAttributes GenericParameterAttributes { + get { throw new NotSupportedException (); } + } + + public override StructLayoutAttribute StructLayoutAttribute { + get { throw new NotSupportedException (); } + } +#endif + + public override Assembly Assembly { + get { return elementType.Assembly; } + } + + public override string AssemblyQualifiedName { + get { return FullName + ", " + elementType.Assembly.FullName; } + } + + + public override string FullName { + get { + return FormatName (elementType.FullName); + } + } + + public override string Name { + get { + return FormatName (elementType.Name); + } + } + + public override Guid GUID { + get { throw new NotSupportedException (); } + } + + public override Module Module { + get { return elementType.Module; } + } + + public override string Namespace { + get { return elementType.Namespace; } + } + + public override RuntimeTypeHandle TypeHandle { + get { throw new NotSupportedException (); } + } + + public override Type UnderlyingSystemType { + get { return this; } + } + + //MemberInfo + public override bool IsDefined (Type attributeType, bool inherit) + { + throw new NotSupportedException (); + } + + public override object [] GetCustomAttributes (bool inherit) + { + throw new NotSupportedException (); + } + + public override object [] GetCustomAttributes (Type attributeType, bool inherit) + { + throw new NotSupportedException (); + } + } + + internal class ArrayType : DerivedType + { + int rank; + + internal ArrayType (Type elementType, int rank) : base (elementType) + { + this.rank = rank; + } + + protected override bool IsArrayImpl () + { + return true; + } + + public override int GetArrayRank () + { + return rank; + } + + public override Type BaseType { + get { return typeof (System.Array); } + } + + internal override String FormatName (string elementName) + { + StringBuilder sb = new StringBuilder (elementName); + sb.Append ("["); + for (int i = 1; i < rank; ++i) + sb.Append (","); + sb.Append ("]"); + return sb.ToString (); + } + } + + + internal class ByRefType : DerivedType + { + internal ByRefType (Type elementType) : base (elementType) + { + } + + protected override bool IsByRefImpl () + { + return true; + } + + public override Type BaseType { + get { return null; } + } + + internal override String FormatName (string elementName) + { + return elementName + "&"; + } + +#if NET_2_0 + public override Type MakeArrayType () + { + throw new ArgumentException ("Cannot create an array type of a byref type"); + } + + public override Type MakeArrayType (int rank) + { + throw new ArgumentException ("Cannot create an array type of a byref type"); + } + + public override Type MakeByRefType () + { + throw new ArgumentException ("Cannot create a byref type of an already byref type"); + } + + public override Type MakePointerType () + { + throw new ArgumentException ("Cannot create a pointer type of a byref type"); + } +#endif + } + + + internal class PointerType : DerivedType + { + internal PointerType (Type elementType) : base (elementType) + { + } + + protected override bool IsPointerImpl () + { + return true; + } + + public override Type BaseType { + get { return null; } + } + + internal override String FormatName (string elementName) + { + return elementName + "*"; + } + } + +} diff --git a/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs index 7c4a2217faf..4e4eb8f0c57 100644 --- a/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/ModuleBuilder.cs @@ -78,6 +78,9 @@ namespace System.Reflection.Emit { [MethodImplAttribute(MethodImplOptions.InternalCall)] private static extern void basic_init (ModuleBuilder ab); + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private static extern void set_wrappers_type (ModuleBuilder mb, Type ab); + internal ModuleBuilder (AssemblyBuilder assb, string name, string fullyqname, bool emitSymbolInfo, bool transient) { this.name = this.scopename = name; this.fqname = fullyqname; @@ -92,7 +95,13 @@ namespace System.Reflection.Emit { basic_init (this); CreateGlobalType (); - + + if (assb.IsRun) { + TypeBuilder tb = new TypeBuilder (this, TypeAttributes.Abstract, 0xFFFFFF); /*last valid token*/ + Type type = tb.CreateType (); + set_wrappers_type (this, type); + } + if (emitSymbolInfo) { Assembly asm = Assembly.LoadWithPartialName ("Mono.CompilerServices.SymbolWriter"); if (asm == null) @@ -144,8 +153,7 @@ namespace System.Reflection.Emit { if ((size <= 0) || (size > 0x3f0000)) throw new ArgumentException ("size", "Data size must be > 0 and < 0x3f0000"); - if (global_type == null) - global_type = new TypeBuilder (this, 0); + CreateGlobalType (); string typeName = "$ArrayType$" + size; Type datablobtype = GetType (typeName, false, false); @@ -204,8 +212,7 @@ namespace System.Reflection.Emit { throw new ArgumentException ("global methods must be static"); if (global_type_created != null) throw new InvalidOperationException ("global methods already created"); - if (global_type == null) - global_type = new TypeBuilder (this, 0); + CreateGlobalType (); MethodBuilder mb = global_type.DefineMethod (name, attributes, callingConvention, returnType, requiredReturnTypeCustomModifiers, optionalReturnTypeCustomModifiers, parameterTypes, requiredParameterTypeCustomModifiers, optionalParameterTypeCustomModifiers); addGlobalMethod (mb); @@ -223,8 +230,7 @@ namespace System.Reflection.Emit { throw new ArgumentException ("global methods must be static"); if (global_type_created != null) throw new InvalidOperationException ("global methods already created"); - if (global_type == null) - global_type = new TypeBuilder (this, 0); + CreateGlobalType (); MethodBuilder mb = global_type.DefinePInvokeMethod (name, dllName, entryName, attributes, callingConvention, returnType, parameterTypes, nativeCallConv, nativeCharSet); addGlobalMethod (mb); @@ -787,7 +793,7 @@ namespace System.Reflection.Emit { internal void CreateGlobalType () { if (global_type == null) - global_type = new TypeBuilder (this, 0); + global_type = new TypeBuilder (this, 0, 1); } internal override Guid GetModuleVersionId () diff --git a/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs b/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs index cec55098ace..fff4030a356 100644 --- a/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs +++ b/mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs @@ -112,13 +112,13 @@ namespace System.Reflection.Emit [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern EventInfo get_event_info (EventBuilder eb); - internal TypeBuilder (ModuleBuilder mb, TypeAttributes attr) + internal TypeBuilder (ModuleBuilder mb, TypeAttributes attr, int table_idx) { this.parent = null; this.attrs = attr; this.class_size = UnspecifiedTypeSize; - this.table_idx = 1; - fullname = this.tname = ""; + this.table_idx = table_idx; + fullname = this.tname = table_idx == 1 ? "" : "type_"+table_idx; this.nspace = String.Empty; pmodule = mb; setup_internal_class (this); @@ -1347,13 +1347,12 @@ namespace System.Reflection.Emit protected override bool IsArrayImpl () { - return Type.IsArrayImpl (this); + return false; /*A TypeBuilder never represents a non typedef type.*/ } protected override bool IsByRefImpl () { - // FIXME - return false; + return false; /*A TypeBuilder never represents a non typedef type.*/ } protected override bool IsCOMObjectImpl () @@ -1363,8 +1362,7 @@ namespace System.Reflection.Emit protected override bool IsPointerImpl () { - // FIXME - return false; + return false; /*A TypeBuilder never represents a non typedef type.*/ } protected override bool IsPrimitiveImpl () @@ -1385,19 +1383,19 @@ namespace System.Reflection.Emit [MonoTODO] public override Type MakeArrayType () { - return base.MakeArrayType (); + return MakeArrayType (1); } [MonoTODO] public override Type MakeArrayType (int rank) { - return base.MakeArrayType (rank); + return new ArrayType (this, rank); } [MonoTODO] public override Type MakeByRefType () { - return base.MakeByRefType (); + return new ByRefType (this);; } [MonoTODO] @@ -1409,7 +1407,7 @@ namespace System.Reflection.Emit [MonoTODO] public override Type MakePointerType () { - return base.MakePointerType (); + return new PointerType (this); } #endif diff --git a/mcs/class/corlib/System.Reflection/Binder.cs b/mcs/class/corlib/System.Reflection/Binder.cs index 91f3bf0c794..26b426469b0 100644 --- a/mcs/class/corlib/System.Reflection/Binder.cs +++ b/mcs/class/corlib/System.Reflection/Binder.cs @@ -165,7 +165,7 @@ namespace System.Reflection types [i] = args [i].GetType (); } } - MethodBase selected = SelectMethod (bindingAttr, match, types, modifiers); + MethodBase selected = SelectMethod (bindingAttr, match, types, modifiers, true); state = null; if (names != null) ReorderParameters (names, ref args, selected); @@ -222,6 +222,8 @@ namespace System.Reflection if (type == typeof (float)) return (float)(char)value; } + if (vtype == typeof (IntPtr) && type.IsPointer) + return value; return Convert.ChangeType (value, type); } return null; @@ -349,20 +351,34 @@ namespace System.Reflection /* TODO: handle valuetype -> byref */ if (to == typeof (object) && from.IsValueType) return true; + if (to.IsPointer && from == typeof (IntPtr)) + return true; return to.IsAssignableFrom (from); } } - private static bool check_arguments (Type[] types, ParameterInfo[] args) { + private static bool check_arguments (Type[] types, ParameterInfo[] args, bool allowByRefMatch) { for (int i = 0; i < types.Length; ++i) { - if (!check_type (types [i], args [i].ParameterType)) + bool match = check_type (types [i], args [i].ParameterType); + if (!match && allowByRefMatch) { + Type param_type = args [i].ParameterType; + if (param_type.IsByRef) + match = check_type (types [i], param_type.GetElementType ()); + } + if (!match) return false; } return true; } - public override MethodBase SelectMethod (BindingFlags bindingAttr, MethodBase[] match, Type[] types, ParameterModifier[] modifiers) + public override MethodBase SelectMethod (BindingFlags bindingAttr, MethodBase [] match, Type [] types, ParameterModifier [] modifiers) + { + return SelectMethod (bindingAttr, match, types, modifiers, + false); + } + + MethodBase SelectMethod (BindingFlags bindingAttr, MethodBase[] match, Type[] types, ParameterModifier[] modifiers, bool allowByRefMatch) { MethodBase m; int i, j; @@ -417,7 +433,7 @@ namespace System.Reflection ParameterInfo[] args = m.GetParameters (); if (args.Length != types.Length) continue; - if (!check_arguments (types, args)) + if (!check_arguments (types, args, allowByRefMatch)) continue; if (result != null) diff --git a/mcs/class/corlib/System.Reflection/ChangeLog b/mcs/class/corlib/System.Reflection/ChangeLog index f5399c69ee8..b1de56396a0 100644 --- a/mcs/class/corlib/System.Reflection/ChangeLog +++ b/mcs/class/corlib/System.Reflection/ChangeLog @@ -1,3 +1,17 @@ +2009-07-12 Gert Driesen + + * Binder.cs: Only allow a type to match its byref version for + BindToMethod (and not for SelectMethod). + +2009-07-11 Zoltan Varga + + * Binder.cs: Allow conversion of IntPtr to pointer types. + +2009-07-10 Zoltan Varga + + * Binder.cs (check_arguments): Allow a type to match its byref version. + Fixes #520690. + 2009-06-12 Zoltan Varga * ParameterInfo.cs (DefaultValue): Add support for decimals, their default diff --git a/mcs/class/corlib/System.Runtime.CompilerServices/ChangeLog b/mcs/class/corlib/System.Runtime.CompilerServices/ChangeLog index d3a03a6179e..5407fcf4e30 100644 --- a/mcs/class/corlib/System.Runtime.CompilerServices/ChangeLog +++ b/mcs/class/corlib/System.Runtime.CompilerServices/ChangeLog @@ -1,3 +1,7 @@ +2009-07-02 Marek Safar + + * ConditionalWeakTable.cs: New file. + 2009-06-10 Marek Safar * InternalsVisibleToAttribute.cs: Updated to 2.0 SP2. diff --git a/mcs/class/corlib/System.Runtime.CompilerServices/ConditionalWeakTable.cs b/mcs/class/corlib/System.Runtime.CompilerServices/ConditionalWeakTable.cs new file mode 100644 index 00000000000..681fc91b90a --- /dev/null +++ b/mcs/class/corlib/System.Runtime.CompilerServices/ConditionalWeakTable.cs @@ -0,0 +1,51 @@ +// +// ConditionalWeakTable.cs +// +// Authors: +// Marek Safar +// +// Copyright (C) 2009, Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if NET_4_0 + +using System; +using System.Runtime.InteropServices; + +namespace System.Runtime.CompilerServices +{ + [ComVisible (false)] + public sealed class ConditionalWeakTable where TKey : class where TValue : class + { + public void Add (TKey key, TValue value) + { + throw new NotImplementedException (); + } + + public bool TryGetValue (TKey key, out TValue value) + { + throw new NotImplementedException (); + } + } +} + +#endif diff --git a/mcs/class/corlib/System.Threading/ChangeLog b/mcs/class/corlib/System.Threading/ChangeLog index 2454046a04e..91826f218fe 100644 --- a/mcs/class/corlib/System.Threading/ChangeLog +++ b/mcs/class/corlib/System.Threading/ChangeLog @@ -1,3 +1,13 @@ +2009-06-25 Miguel de Icaza + + * Timer.cs: Throw ArgumentNullException if the callback is null. + +2009-06-22 Bill Holmes + + * Thread.cs : Adding interrupt_on_stop field. + + Contributed under MIT/X11 license. + 2009-06-10 Rolf Bjarne Kvinge * Thread.cs: MoonlightUnhandledException: ensure there's no way to diff --git a/mcs/class/corlib/System.Threading/Thread.cs b/mcs/class/corlib/System.Threading/Thread.cs index 4a75d558252..f8691c6e5e7 100644 --- a/mcs/class/corlib/System.Threading/Thread.cs +++ b/mcs/class/corlib/System.Threading/Thread.cs @@ -107,11 +107,12 @@ namespace System.Threading { start_wrapper() in the runtime. */ private ExecutionContext ec_to_set; + private IntPtr interrupt_on_stop; + /* * These fields are used to avoid having to increment corlib versions * when a new field is added to the unmanaged MonoThread structure. */ - private IntPtr unused2; private IntPtr unused3; private IntPtr unused4; private IntPtr unused5; diff --git a/mcs/class/corlib/System.Threading/Timer.cs b/mcs/class/corlib/System.Threading/Timer.cs index 2fb09f0ba27..ba5be72eb49 100644 --- a/mcs/class/corlib/System.Threading/Timer.cs +++ b/mcs/class/corlib/System.Threading/Timer.cs @@ -178,6 +178,9 @@ namespace System.Threading void Init (TimerCallback callback, object state, long dueTime, long period) { + if (callback == null) + throw new ArgumentNullException ("callback"); + this.callback = callback; this.state = state; diff --git a/mcs/class/corlib/System/AppDomain.cs b/mcs/class/corlib/System/AppDomain.cs index 75a7160519e..cd99cefd3bb 100644 --- a/mcs/class/corlib/System/AppDomain.cs +++ b/mcs/class/corlib/System/AppDomain.cs @@ -861,7 +861,7 @@ namespace System { [MethodImplAttribute (MethodImplOptions.InternalCall)] private static extern AppDomain createDomain (string friendlyName, AppDomainSetup info); - [MonoTODO ("Currently it does not allow the setup in the other domain")] + [MonoLimitationAttribute ("Currently it does not allow the setup in the other domain")] [SecurityPermission (SecurityAction.Demand, ControlAppDomain = true)] public static AppDomain CreateDomain (string friendlyName, Evidence securityInfo, AppDomainSetup info) { @@ -1265,6 +1265,13 @@ namespace System { public event UnhandledExceptionEventHandler UnhandledException; #endif +#if NET_4_0 + [MonoTODO] + public bool IsHomogenous { + get { return false; } + } +#endif + #if NET_2_0 public event ResolveEventHandler ReflectionOnlyAssemblyResolve; diff --git a/mcs/class/corlib/System/AppDomainManager.cs b/mcs/class/corlib/System/AppDomainManager.cs index dab2eaee6b8..fab229faf61 100644 --- a/mcs/class/corlib/System/AppDomainManager.cs +++ b/mcs/class/corlib/System/AppDomainManager.cs @@ -62,9 +62,8 @@ namespace System { } } - [MonoTODO] public virtual Assembly EntryAssembly { - get { throw new NotImplementedException (); } + get { return Assembly.GetEntryAssembly (); } } [MonoTODO] diff --git a/mcs/class/corlib/System/AppDomainSetup.cs b/mcs/class/corlib/System/AppDomainSetup.cs index 5320c086cf9..4746489be16 100644 --- a/mcs/class/corlib/System/AppDomainSetup.cs +++ b/mcs/class/corlib/System/AppDomainSetup.cs @@ -231,7 +231,7 @@ namespace System } } - [MonoTODO ("In Mono this is controlled by the --share-code flag")] + [MonoLimitation ("In Mono this is controlled by the --share-code flag")] public LoaderOptimization LoaderOptimization { get { return loader_optimization; diff --git a/mcs/class/corlib/System/Array.cs b/mcs/class/corlib/System/Array.cs index 50213f6d252..3fef4d2e7e7 100644 --- a/mcs/class/corlib/System/Array.cs +++ b/mcs/class/corlib/System/Array.cs @@ -300,12 +300,12 @@ namespace System object IList.this [int index] { get { if (unchecked ((uint) index) >= unchecked ((uint) Length)) - throw new ArgumentOutOfRangeException ("index"); + throw new IndexOutOfRangeException ("index"); return GetValueImpl (index); } set { if (unchecked ((uint) index) >= unchecked ((uint) Length)) - throw new ArgumentOutOfRangeException ("index"); + throw new IndexOutOfRangeException ("index"); SetValueImpl (value, index); } } diff --git a/mcs/class/corlib/System/ChangeLog b/mcs/class/corlib/System/ChangeLog index 4ab9781fb26..9ae27c5b4f4 100644 --- a/mcs/class/corlib/System/ChangeLog +++ b/mcs/class/corlib/System/ChangeLog @@ -1,3 +1,80 @@ +2009-07-07 Rodrigo Kumpera + + * Type.cs (IsUserType): Only TypeDelegator and types + outside of corlib are unhandled usertypes. + +2009-07-02 Marek Safar + + * Type.cs, AppDomain.cs: 4.0 bits. + +2009-06-26 Gonzalo Paniagua Javier + + * DateTime.cs: if the DateTimeOffset is out of bounds, let Parse + report the error. Fix stupid harmless typo. + * DateTimeOffset.cs: report error if the UTC date/time is out of + bounds. + +2009-06-25 Miguel de Icaza + + * Array.cs: IList.this needs to throw IndexOutOfRangeException + when the index is invalid, not ArgumentOutOfRangeException. + + * Int32.cs: Do not crash if the FormatProvider returns a null + value on the call to GetFormat (Type). + + Validate the NumberStyles, passes Int/Int32Parse2.exe + + Fix regression introduced in 2005, we need to throw + ArgumentNullException on Parse. + +2009-06-25 Miguel de Icaza + + * Int32.cs: Fix regression introduced in 2005, we need to throw + ArgumentNullException on Parse. + +2009-06-23 Gonzalo Paniagua Javier + + * DateTime.cs: ignore MinValue to avoid DateTimeOffset ctor throwing + when adjusting for TZ. + +2009-06-22 Miguel de Icaza + + * String.cs: In Silverlight the whitespace characters 0x202f and + 0x205f are considered for Trim and Split purposes. + +2009-06-21 Marek Safar + + * Tuples.cs: Add Equals, GetHashCode. + +2009-06-21 Zoltan Varga + + * IntPtr.cs (.ctor): Disable the check in the long ctor until we + can figure out how to do it properly. + +2009-06-20 Zoltan Varga + + * IntPtr.cs (.ctor): Allow long values whose 31th bit is set. + +2009-06-18 Gonzalo Paniagua Javier + + * DateTime.cs: quick fix for the 1.x build. + +2009-06-18 Gonzalo Paniagua Javier + + * AppDomainSetup.cs: update attribute. + * TermInfoDriver.cs: ensure we are initialized in CheckWindowDimensions(). + * DateTimeOffset.cs: Implement Parse(). + * DateTime.cs: add 'zzz' to the list of default time formats. Return a + DateTimeOffset from _DoParse. Fixed the offset minutes when the + timezone is specified as a negative one. + * Console.cs: updates for MoveBufferArea(). + * AppDomainManager.cs: implement EntryAssembly. + * AppDomain.cs: update attribute. + +2009-06-15 Atsushi Enomoto + + * Environment.cs : bump corlib version. + 2009-06-12 Bill Holmes * Variant.cs (GetValue): Changing the bool case to use the short value. diff --git a/mcs/class/corlib/System/Console.cs b/mcs/class/corlib/System/Console.cs index 8eec60a3822..6911d01d37b 100644 --- a/mcs/class/corlib/System/Console.cs +++ b/mcs/class/corlib/System/Console.cs @@ -625,19 +625,20 @@ namespace System ConsoleDriver.Clear (); } - [MonoTODO ("Not implemented")] + [MonoLimitation ("Implemented only on Windows")] public static void MoveBufferArea (int sourceLeft, int sourceTop, int sourceWidth, int sourceHeight, int targetLeft, int targetTop) { - throw new NotImplementedException (); + ConsoleDriver.MoveBufferArea (sourceLeft, sourceTop, sourceWidth, sourceHeight, targetLeft, targetTop); } - [MonoTODO("Not implemented")] + [MonoLimitation ("Implemented only on Windows")] public static void MoveBufferArea (int sourceLeft, int sourceTop, int sourceWidth, int sourceHeight, int targetLeft, int targetTop, Char sourceChar, ConsoleColor sourceForeColor, ConsoleColor sourceBackColor) { - throw new NotImplementedException (); + ConsoleDriver.MoveBufferArea (sourceLeft, sourceTop, sourceWidth, sourceHeight, targetLeft, targetTop, + sourceChar, sourceForeColor, sourceBackColor); } public static ConsoleKeyInfo ReadKey () diff --git a/mcs/class/corlib/System/DateTime.cs b/mcs/class/corlib/System/DateTime.cs index 5d69e6a129f..5c5ad4cf097 100644 --- a/mcs/class/corlib/System/DateTime.cs +++ b/mcs/class/corlib/System/DateTime.cs @@ -54,6 +54,26 @@ namespace System #if NET_2_0 DateTimeKind kind; #endif +#if !NET_2_0 + internal struct DateTimeOffset { + public DateTime DateTime; + public TimeSpan Offset; + + public DateTimeOffset (DateTime dt) : this (dt, TimeSpan.Zero) + { + } + + public DateTimeOffset (long ticks, TimeSpan offset) : this (new DateTime (ticks), offset) + { + } + + public DateTimeOffset (DateTime dt, TimeSpan offset) + { + DateTime = dt; + Offset = offset; + } + } +#endif private const int dp400 = 146097; private const int dp100 = 36524; @@ -88,6 +108,7 @@ namespace System private static readonly string[] ParseTimeFormats = new string [] { "H:m:s.fffffffzzz", "H:m:s.fffffff", + "H:m:s tt zzz", "H:m:szzz", "H:m:s", "H:mzzz", @@ -889,8 +910,9 @@ namespace System throw new ArgumentNullException ("s"); DateTime res; + DateTimeOffset dto; Exception exception = null; - if (!CoreParse (s, provider, styles, out res, true, ref exception)) + if (!CoreParse (s, provider, styles, out res, out dto, true, ref exception)) throw exception; return res; @@ -899,8 +921,9 @@ namespace System const string formatExceptionMessage = "String was not recognized as a valid DateTime."; internal static bool CoreParse (string s, IFormatProvider provider, DateTimeStyles styles, - out DateTime result, bool setExceptionOnError, ref Exception exception) + out DateTime result, out DateTimeOffset dto, bool setExceptionOnError, ref Exception exception) { + dto = new DateTimeOffset (0, TimeSpan.Zero); if (s == null || s.Length == 0) { if (setExceptionOnError) exception = new FormatException (formatExceptionMessage); @@ -918,19 +941,19 @@ namespace System result = MinValue; return false; } - + bool longYear = false; for (int i = 0; i < allDateFormats.Length; i++) { string firstPart = allDateFormats [i]; bool incompleteFormat = false; - if (_DoParse (s, firstPart, "", false, out result, dfi, styles, true, ref incompleteFormat, ref longYear)) + if (_DoParse (s, firstPart, "", false, out result, out dto, dfi, styles, true, ref incompleteFormat, ref longYear)) return true; if (!incompleteFormat) continue; for (int j = 0; j < ParseTimeFormats.Length; j++) { - if (_DoParse (s, firstPart, ParseTimeFormats [j], false, out result, dfi, styles, true, ref incompleteFormat, ref longYear)) + if (_DoParse (s, firstPart, ParseTimeFormats [j], false, out result, out dto, dfi, styles, true, ref incompleteFormat, ref longYear)) return true; } } @@ -950,27 +973,27 @@ namespace System string[] monthDayFormats = is_day_before_month ? DayMonthShortFormats : MonthDayShortFormats; for (int i = 0; i < monthDayFormats.Length; i++) { bool incompleteFormat = false; - if (_DoParse (s, monthDayFormats[i], "", false, out result, dfi, styles, true, ref incompleteFormat, ref longYear)) + if (_DoParse (s, monthDayFormats[i], "", false, out result, out dto, dfi, styles, true, ref incompleteFormat, ref longYear)) return true; } for (int j = 0; j < ParseTimeFormats.Length; j++) { string firstPart = ParseTimeFormats [j]; bool incompleteFormat = false; - if (_DoParse (s, firstPart, "", false, out result, dfi, styles, false, ref incompleteFormat, ref longYear)) + if (_DoParse (s, firstPart, "", false, out result, out dto, dfi, styles, false, ref incompleteFormat, ref longYear)) return true; if (!incompleteFormat) continue; for (int i = 0; i < monthDayFormats.Length; i++) { - if (_DoParse (s, firstPart, monthDayFormats [i], false, out result, dfi, styles, false, ref incompleteFormat, ref longYear)) + if (_DoParse (s, firstPart, monthDayFormats [i], false, out result, out dto, dfi, styles, false, ref incompleteFormat, ref longYear)) return true; } for (int i = 0; i < allDateFormats.Length; i++) { string dateFormat = allDateFormats [i]; if (dateFormat[dateFormat.Length - 1] == 'T') continue; // T formats must be before the time part - if (_DoParse (s, firstPart, dateFormat, false, out result, dfi, styles, false, ref incompleteFormat, ref longYear)) + if (_DoParse (s, firstPart, dateFormat, false, out result, out dto, dfi, styles, false, ref incompleteFormat, ref longYear)) return true; } } @@ -1196,6 +1219,7 @@ namespace System string secondPart, bool exact, out DateTime result, + out DateTimeOffset dto, DateTimeFormatInfo dfi, DateTimeStyles style, bool firstPartIsDate, @@ -1205,6 +1229,7 @@ namespace System bool useutc = false; bool use_invariant = false; bool sloppy_parsing = false; + dto = new DateTimeOffset (0, TimeSpan.Zero); #if !NET_2_0 bool afterTimePart = firstPartIsDate && secondPart == ""; #endif @@ -1769,20 +1794,29 @@ namespace System if (dayofweek != -1 && dayofweek != (int) result.DayOfWeek) return false; - TimeSpan utcoffset; - - bool adjustToUniversal = (style & DateTimeStyles.AdjustToUniversal) != 0; - - if (tzsign != -1) { + if (tzsign == -1) { + if (result != DateTime.MinValue) { + try { + dto = new DateTimeOffset (result); + } catch { } // We handle this error in DateTimeOffset.Parse + } + } else { if (tzoffmin == -1) tzoffmin = 0; if (tzoffset == -1) tzoffset = 0; - if (tzsign == 1) + if (tzsign == 1) { tzoffset = -tzoffset; - - utcoffset = new TimeSpan (tzoffset, tzoffmin, 0); - long newticks = (result.ticks - utcoffset).Ticks; + tzoffmin = -tzoffmin; + } + try { + dto = new DateTimeOffset (result, new TimeSpan (tzoffset, tzoffmin, 0)); + } catch {} // We handle this error in DateTimeOffset.Parse + } + bool adjustToUniversal = (style & DateTimeStyles.AdjustToUniversal) != 0; + + if (tzsign != -1) { + long newticks = (result.ticks - dto.Offset).Ticks; if (newticks < 0) newticks += TimeSpan.TicksPerDay; result = new DateTime (false, new TimeSpan (newticks)); @@ -1866,8 +1900,9 @@ namespace System if (s != null){ try { Exception exception = null; + DateTimeOffset dto; - return CoreParse (s, null, DateTimeStyles.AllowWhiteSpaces, out result, false, ref exception); + return CoreParse (s, null, DateTimeStyles.AllowWhiteSpaces, out result, out dto, false, ref exception); } catch { } } result = MinValue; @@ -1879,8 +1914,9 @@ namespace System if (s != null){ try { Exception exception = null; + DateTimeOffset dto; - return CoreParse (s, provider, styles, out result, false, ref exception); + return CoreParse (s, provider, styles, out result, out dto, false, ref exception); } catch {} } result = MinValue; @@ -1926,7 +1962,8 @@ namespace System if (format == null || format == String.Empty) break; - if (_DoParse (s, formats[i], null, exact, out result, dfi, style, false, ref incompleteFormat, ref longYear)) { + DateTimeOffset dto; + if (_DoParse (s, formats[i], null, exact, out result, out dto, dfi, style, false, ref incompleteFormat, ref longYear)) { ret = result; return true; } diff --git a/mcs/class/corlib/System/DateTimeOffset.cs b/mcs/class/corlib/System/DateTimeOffset.cs index a9fb2901b6b..2a324ea8de6 100644 --- a/mcs/class/corlib/System/DateTimeOffset.cs +++ b/mcs/class/corlib/System/DateTimeOffset.cs @@ -282,13 +282,21 @@ namespace System return Parse (input, formatProvider, DateTimeStyles.AllowWhiteSpaces); } - [MonoTODO] public static DateTimeOffset Parse (string input, IFormatProvider formatProvider, DateTimeStyles styles) { if (input == null) throw new ArgumentNullException ("input"); - throw new NotImplementedException (); + DateTime d; + DateTimeOffset dto; + Exception exception = null; + if (!DateTime.CoreParse (input, formatProvider, styles, out d, out dto, true, ref exception)) + throw exception; + + if (d.Ticks != 0 && dto.Ticks == 0) + throw new ArgumentOutOfRangeException ("The UTC representation falls outside the 1-9999 year range"); + + return dto; } public static DateTimeOffset ParseExact (string input, string format, IFormatProvider formatProvider) @@ -326,7 +334,7 @@ namespace System DateTimeOffset result; if (!ParseExact (input, formats, DateTimeFormatInfo.GetInstance (formatProvider), styles, out result)) - throw new FormatException (); + throw new FormatException ("Invalid format string"); return result; } @@ -337,7 +345,7 @@ namespace System foreach (string format in formats) { if (format == null || format == String.Empty) - throw new FormatException ("Invlid Format Sting"); + throw new FormatException ("Invalid format string"); DateTimeOffset result; if (DoParse (input, format, false, out result, dfi, styles)) { diff --git a/mcs/class/corlib/System/Environment.cs b/mcs/class/corlib/System/Environment.cs index 7e7ea4a19cb..8a034027c88 100644 --- a/mcs/class/corlib/System/Environment.cs +++ b/mcs/class/corlib/System/Environment.cs @@ -63,7 +63,7 @@ namespace System { * Changes which are already detected at runtime, like the addition * of icalls, do not require an increment. */ - private const int mono_corlib_version = 77; + private const int mono_corlib_version = 78; #if NET_2_0 [ComVisible (true)] diff --git a/mcs/class/corlib/System/Int32.cs b/mcs/class/corlib/System/Int32.cs index 302ffbf9b34..712d0441f45 100644 --- a/mcs/class/corlib/System/Int32.cs +++ b/mcs/class/corlib/System/Int32.cs @@ -229,6 +229,10 @@ namespace System { "are permitted."); return false; } + } else if ((uint) style > (uint) NumberStyles.Any){ + if (!tryParse) + exc = new ArgumentException ("Not a valid number style"); + return false; } return true; @@ -327,12 +331,6 @@ namespace System { result = 0; exc = null; - if (s == null) { - if (!tryParse) - exc = GetFormatException (); - return false; - } - if (s == null) { if (!tryParse) exc = new ArgumentNullException (); @@ -345,12 +343,12 @@ namespace System { return false; } - NumberFormatInfo nfi; + NumberFormatInfo nfi = null; if (fp != null) { Type typeNFI = typeof (System.Globalization.NumberFormatInfo); nfi = (NumberFormatInfo) fp.GetFormat (typeNFI); } - else + if (nfi == null) nfi = Thread.CurrentThread.CurrentCulture.NumberFormat; if (!CheckStyle (style, tryParse, ref exc)) diff --git a/mcs/class/corlib/System/IntPtr.cs b/mcs/class/corlib/System/IntPtr.cs index ada701d961e..c75905ebf7e 100644 --- a/mcs/class/corlib/System/IntPtr.cs +++ b/mcs/class/corlib/System/IntPtr.cs @@ -74,10 +74,13 @@ namespace System #endif public IntPtr (long value) { - if (((value > Int32.MaxValue) || (value < Int32.MinValue)) && (IntPtr.Size < 8)) { + /* FIXME: Needs to figure the exact check which works on all architectures */ + /* + if (((value >> 32 > 0) || (value < 0)) && (IntPtr.Size < 8)) { throw new OverflowException ( Locale.GetText ("This isn't a 64bits machine.")); } + */ m_value = (void *) value; } diff --git a/mcs/class/corlib/System/NumberFormatter.jvm.cs b/mcs/class/corlib/System/NumberFormatter.jvm.cs index 5078eebcfba..238b11143d9 100644 --- a/mcs/class/corlib/System/NumberFormatter.jvm.cs +++ b/mcs/class/corlib/System/NumberFormatter.jvm.cs @@ -1,1020 +1,1020 @@ -// -// System.NumberFormatter.cs -// -// Author: -// Eyal Alaluf (eyala@mainsoft.com) -// -// Copyright (C) 2008 Mainsoft Co. (http://www.mainsoft.com) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -#if !TARGET_JVM -#define UNSAFE_TABLES -#endif - -namespace System -{ -#if !UNSAFE_TABLES - partial class NumberFormatter - { - static internal readonly char[] DigitLowerTable = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; - static internal readonly char[] DigitUpperTable = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - - private static readonly long[] TenPowersList = new long[] { - 1, - 10, - 100, - 1000, - 10000, - 100000, - 1000000, - 10000000, - 100000000, - 1000000000, - 10000000000, - 100000000000, - 1000000000000, - 10000000000000, - 100000000000000, - 1000000000000000, - 10000000000000000, - 100000000000000000, - 1000000000000000000 - }; - - // DecHexDigits s a translation table from a decimal number to its - // digits hexadecimal representation (e.g. DecHexDigits [34] = 0x34). - static readonly int[] DecHexDigits = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99}; - - static readonly ulong[] MantissaBitsTable = { - 4556951262222748432, 9113902524445496865, 1822780504889099373, - 3645561009778198746, 7291122019556397492, 14582244039112794984, - 2916448807822558996, 5832897615645117993, 11665795231290235987, - 2333159046258047197, 4666318092516094394, 9332636185032188789, - 1866527237006437757, 3733054474012875515, 7466108948025751031, - 14932217896051502063, 2986443579210300412, 5972887158420600825, - 11945774316841201651, 2389154863368240330, 4778309726736480660, - 9556619453472961320, 1911323890694592264, 3822647781389184528, - 7645295562778369056, 15290591125556738113, 3058118225111347622, - 6116236450222695245, 12232472900445390490, 2446494580089078098, - 4892989160178156196, 9785978320356312392, 1957195664071262478, - 3914391328142524957, 7828782656285049914, 15657565312570099828, - 3131513062514019965, 6263026125028039931, 12526052250056079862, - 2505210450011215972, 5010420900022431944, 10020841800044863889, - 2004168360008972777, 4008336720017945555, 8016673440035891111, - 16033346880071782223, 3206669376014356444, 6413338752028712889, - 12826677504057425779, 2565335500811485155, 5130671001622970311, - 10261342003245940623, 2052268400649188124, 4104536801298376249, - 8209073602596752498, 16418147205193504997, 3283629441038700999, - 6567258882077401998, 13134517764154803997, 2626903552830960799, - 5253807105661921599, 10507614211323843198, 2101522842264768639, - 4203045684529537279, 8406091369059074558, 16812182738118149117, - 3362436547623629823, 6724873095247259646, 13449746190494519293, - 2689949238098903858, 5379898476197807717, 10759796952395615435, - 2151959390479123087, 4303918780958246174, 8607837561916492348, - 17215675123832984696, 3443135024766596939, 6886270049533193878, - 13772540099066387756, 2754508019813277551, 5509016039626555102, - 11018032079253110205, 2203606415850622041, 4407212831701244082, - 8814425663402488164, 17628851326804976328, 3525770265360995265, - 7051540530721990531, 14103081061443981063, 2820616212288796212, - 5641232424577592425, 11282464849155184850, 2256492969831036970, - 4512985939662073940, 9025971879324147880, 18051943758648295760, - 3610388751729659152, 7220777503459318304, 14441555006918636608, - 2888311001383727321, 5776622002767454643, 11553244005534909286, - 2310648801106981857, 4621297602213963714, 9242595204427927429, - 1848519040885585485, 3697038081771170971, 7394076163542341943, - 14788152327084683887, 2957630465416936777, 5915260930833873554, - 11830521861667747109, 2366104372333549421, 4732208744667098843, - 9464417489334197687, 1892883497866839537, 3785766995733679075, - 7571533991467358150, 15143067982934716300, 3028613596586943260, - 6057227193173886520, 12114454386347773040, 2422890877269554608, - 4845781754539109216, 9691563509078218432, 1938312701815643686, - 3876625403631287372, 7753250807262574745, 15506501614525149491, - 3101300322905029898, 6202600645810059796, 12405201291620119593, - 2481040258324023918, 4962080516648047837, 9924161033296095674, - 1984832206659219134, 3969664413318438269, 7939328826636876539, - 15878657653273753079, 3175731530654750615, 6351463061309501231, - 12702926122619002463, 2540585224523800492, 5081170449047600985, - 10162340898095201970, 2032468179619040394, 4064936359238080788, - 8129872718476161576, 16259745436952323153, 3251949087390464630, - 6503898174780929261, 13007796349561858522, 2601559269912371704, - 5203118539824743409, 10406237079649486818, 2081247415929897363, - 4162494831859794727, 8324989663719589454, 16649979327439178909, - 3329995865487835781, 6659991730975671563, 13319983461951343127, - 2663996692390268625, 5327993384780537250, 10655986769561074501, - 2131197353912214900, 4262394707824429800, 8524789415648859601, - 17049578831297719202, 3409915766259543840, 6819831532519087681, - 13639663065038175362, 2727932613007635072, 5455865226015270144, - 10911730452030540289, 2182346090406108057, 4364692180812216115, - 8729384361624432231, 17458768723248864463, 3491753744649772892, - 6983507489299545785, 13967014978599091570, 2793402995719818314, - 5586805991439636628, 11173611982879273256, 2234722396575854651, - 4469444793151709302, 8938889586303418605, 17877779172606837210, - 3575555834521367442, 7151111669042734884, 14302223338085469768, - 2860444667617093953, 5720889335234187907, 11441778670468375814, - 2288355734093675162, 4576711468187350325, 9153422936374700651, - 1830684587274940130, 3661369174549880260, 7322738349099760521, - 14645476698199521043, 2929095339639904208, 5858190679279808417, - 11716381358559616834, 2343276271711923366, 4686552543423846733, - 9373105086847693467, 1874621017369538693, 3749242034739077387, - 7498484069478154774, 14996968138956309548, 2999393627791261909, - 5998787255582523819, 11997574511165047638, 2399514902233009527, - 4799029804466019055, 9598059608932038110, 1919611921786407622, - 3839223843572815244, 7678447687145630488, 15356895374291260977, - 3071379074858252195, 6142758149716504390, 12285516299433008781, - 2457103259886601756, 4914206519773203512, 9828413039546407025, - 1965682607909281405, 3931365215818562810, 7862730431637125620, - 15725460863274251240, 3145092172654850248, 6290184345309700496, - 12580368690619400992, 2516073738123880198, 5032147476247760397, - 10064294952495520794, 2012858990499104158, 4025717980998208317, - 8051435961996416635, 16102871923992833270, 3220574384798566654, - 6441148769597133308, 12882297539194266616, 2576459507838853323, - 5152919015677706646, 10305838031355413293, 2061167606271082658, - 4122335212542165317, 8244670425084330634, 16489340850168661269, - 3297868170033732253, 6595736340067464507, 13191472680134929015, - 2638294536026985803, 5276589072053971606, 10553178144107943212, - 2110635628821588642, 4221271257643177284, 8442542515286354569, - 16885085030572709139, 3377017006114541827, 6754034012229083655, - 13508068024458167311, 2701613604891633462, 5403227209783266924, - 10806454419566533849, 2161290883913306769, 4322581767826613539, - 8645163535653227079, 17290327071306454158, 3458065414261290831, - 6916130828522581663, 13832261657045163327, 2766452331409032665, - 5532904662818065330, 11065809325636130661, 2213161865127226132, - 4426323730254452264, 8852647460508904529, 17705294921017809058, - 3541058984203561811, 7082117968407123623, 14164235936814247246, - 2832847187362849449, 5665694374725698898, 11331388749451397797, - 2266277749890279559, 4532555499780559119, 9065110999561118238, - 1813022199912223647, 3626044399824447295, 7252088799648894590, - 14504177599297789180, 2900835519859557836, 5801671039719115672, - 11603342079438231344, 2320668415887646268, 4641336831775292537, - 9282673663550585075, 1856534732710117015, 3713069465420234030, - 7426138930840468060, 14852277861680936121, 2970455572336187224, - 5940911144672374448, 11881822289344748896, 2376364457868949779, - 4752728915737899558, 9505457831475799117, 1901091566295159823, - 3802183132590319647, 7604366265180639294, 15208732530361278588, - 3041746506072255717, 6083493012144511435, 12166986024289022870, - 2433397204857804574, 4866794409715609148, 9733588819431218296, - 1946717763886243659, 3893435527772487318, 7786871055544974637, - 15573742111089949274, 3114748422217989854, 6229496844435979709, - 12458993688871959419, 2491798737774391883, 4983597475548783767, - 9967194951097567535, 1993438990219513507, 3986877980439027014, - 7973755960878054028, 15947511921756108056, 3189502384351221611, - 6379004768702443222, 12758009537404886445, 2551601907480977289, - 5103203814961954578, 10206407629923909156, 2041281525984781831, - 4082563051969563662, 8165126103939127325, 16330252207878254650, - 3266050441575650930, 6532100883151301860, 13064201766302603720, - 2612840353260520744, 5225680706521041488, 10451361413042082976, - 2090272282608416595, 4180544565216833190, 8361089130433666380, - 16722178260867332761, 3344435652173466552, 6688871304346933104, - 13377742608693866209, 2675548521738773241, 5351097043477546483, - 10702194086955092967, 2140438817391018593, 4280877634782037187, - 8561755269564074374, 17123510539128148748, 3424702107825629749, - 6849404215651259499, 13698808431302518998, 2739761686260503799, - 5479523372521007599, 10959046745042015198, 2191809349008403039, - 4383618698016806079, 8767237396033612159, 17534474792067224318, - 3506894958413444863, 7013789916826889727, 14027579833653779454, - 2805515966730755890, 5611031933461511781, 11222063866923023563, - 2244412773384604712, 4488825546769209425, 8977651093538418850, - 17955302187076837701, 3591060437415367540, 7182120874830735080, - 14364241749661470161, 2872848349932294032, 5745696699864588064, - 11491393399729176129, 2298278679945835225, 4596557359891670451, - 9193114719783340903, 1838622943956668180, 3677245887913336361, - 7354491775826672722, 14708983551653345445, 2941796710330669089, - 5883593420661338178, 11767186841322676356, 2353437368264535271, - 4706874736529070542, 9413749473058141084, 1882749894611628216, - 3765499789223256433, 7530999578446512867, 15061999156893025735, - 3012399831378605147, 6024799662757210294, 12049599325514420588, - 2409919865102884117, 4819839730205768235, 9639679460411536470, - 1927935892082307294, 3855871784164614588, 7711743568329229176, - 15423487136658458353, 3084697427331691670, 6169394854663383341, - 12338789709326766682, 2467757941865353336, 4935515883730706673, - 9871031767461413346, 1974206353492282669, 3948412706984565338, - 7896825413969130677, 15793650827938261354, 3158730165587652270, - 6317460331175304541, 12634920662350609083, 2526984132470121816, - 5053968264940243633, 10107936529880487266, 2021587305976097453, - 4043174611952194906, 8086349223904389813, 16172698447808779626, - 3234539689561755925, 6469079379123511850, 12938158758247023701, - 2587631751649404740, 5175263503298809480, 10350527006597618960, - 2070105401319523792, 4140210802639047584, 8280421605278095168, - 16560843210556190337, 3312168642111238067, 6624337284222476135, - 13248674568444952270, 2649734913688990454, 5299469827377980908, - 10598939654755961816, 2119787930951192363, 4239575861902384726, - 8479151723804769452, 16958303447609538905, 3391660689521907781, - 6783321379043815562, 13566642758087631124, 2713328551617526224, - 5426657103235052449, 10853314206470104899, 2170662841294020979, - 4341325682588041959, 8682651365176083919, 17365302730352167839, - 3473060546070433567, 6946121092140867135, 13892242184281734271, - 2778448436856346854, 5556896873712693708, 11113793747425387417, - 2222758749485077483, 4445517498970154966, 8891034997940309933, - 17782069995880619867, 3556413999176123973, 7112827998352247947, - 14225655996704495894, 2845131199340899178, 5690262398681798357, - 11380524797363596715, 2276104959472719343, 4552209918945438686, - 9104419837890877372, 1820883967578175474, 3641767935156350948, - 7283535870312701897, 14567071740625403795, 2913414348125080759, - 5826828696250161518, 11653657392500323036, 2330731478500064607, - 4661462957000129214, 9322925914000258429, 1864585182800051685, - 3729170365600103371, 7458340731200206743, 14916681462400413486, - 2983336292480082697, 5966672584960165394, 11933345169920330789, - 2386669033984066157, 4773338067968132315, 9546676135936264631, - 1909335227187252926, 3818670454374505852, 7637340908749011705, - 15274681817498023410, 3054936363499604682, 6109872726999209364, - 12219745453998418728, 2443949090799683745, 4887898181599367491, - 9775796363198734982, 1955159272639746996, 3910318545279493993, - 7820637090558987986, 15641274181117975972, 3128254836223595194, - 6256509672447190388, 12513019344894380777, 2502603868978876155, - 5005207737957752311, 10010415475915504622, 2002083095183100924, - 4004166190366201848, 8008332380732403697, 16016664761464807395, - 3203332952292961479, 6406665904585922958, 12813331809171845916, - 2562666361834369183, 5125332723668738366, 10250665447337476733, - 2050133089467495346, 4100266178934990693, 8200532357869981386, - 16401064715739962772, 3280212943147992554, 6560425886295985109, - 13120851772591970218, 2624170354518394043, 5248340709036788087, - 10496681418073576174, 2099336283614715234, 4198672567229430469, - 8397345134458860939, 16794690268917721879, 3358938053783544375, - 6717876107567088751, 13435752215134177503, 2687150443026835500, - 5374300886053671001, 10748601772107342002, 2149720354421468400, - 4299440708842936801, 8598881417685873602, 17197762835371747204, - 3439552567074349440, 6879105134148698881, 13758210268297397763, - 2751642053659479552, 5503284107318959105, 11006568214637918210, - 2201313642927583642, 4402627285855167284, 8805254571710334568, - 17610509143420669137, 3522101828684133827, 7044203657368267654, - 14088407314736535309, 2817681462947307061, 5635362925894614123, - 11270725851789228247, 2254145170357845649, 4508290340715691299, - 9016580681431382598, 18033161362862765196, 3606632272572553039, - 7213264545145106078, 14426529090290212157, 2885305818058042431, - 5770611636116084862, 11541223272232169725, 2308244654446433945, - 4616489308892867890, 9232978617785735780, 1846595723557147156, - 3693191447114294312, 7386382894228588624, 14772765788457177249, - 2954553157691435449, 5909106315382870899, 11818212630765741799, - 2363642526153148359, 4727285052306296719, 9454570104612593439, - 1890914020922518687, 3781828041845037375, 7563656083690074751, - 15127312167380149503, 3025462433476029900, 6050924866952059801, - 12101849733904119602, 2420369946780823920, 4840739893561647841, - 9681479787123295682, 1936295957424659136, 3872591914849318272, - 7745183829698636545, 15490367659397273091, 3098073531879454618, - 6196147063758909236, 12392294127517818473, 2478458825503563694, - 4956917651007127389, 9913835302014254778, 1982767060402850955, - 3965534120805701911, 7931068241611403822, 15862136483222807645, - 3172427296644561529, 6344854593289123058, 12689709186578246116, - 2537941837315649223, 5075883674631298446, 10151767349262596893, - 2030353469852519378, 4060706939705038757, 8121413879410077514, - 16242827758820155028, 3248565551764031005, 6497131103528062011, - 12994262207056124023, 2598852441411224804, 5197704882822449609, - 10395409765644899218, 2079081953128979843, 4158163906257959687, - 8316327812515919374, 16632655625031838749, 3326531125006367749, - 6653062250012735499, 13306124500025470999, 2661224900005094199, - 5322449800010188399, 10644899600020376799, 2128979920004075359, - 4257959840008150719, 8515919680016301439, 17031839360032602879, - 3406367872006520575, 6812735744013041151, 13625471488026082303, - 2725094297605216460, 5450188595210432921, 10900377190420865842, - 2180075438084173168, 4360150876168346337, 8720301752336692674, - 17440603504673385348, 3488120700934677069, 6976241401869354139, - 13952482803738708279, 2790496560747741655, 5580993121495483311, - 11161986242990966623, 2232397248598193324, 4464794497196386649, - 8929588994392773298, 17859177988785546597, 3571835597757109319, - 7143671195514218638, 14287342391028437277, 2857468478205687455, - 5714936956411374911, 11429873912822749822, 2285974782564549964, - 4571949565129099928, 9143899130258199857, 1828779826051639971, - 3657559652103279943, 7315119304206559886, 14630238608413119772, - 2926047721682623954, 5852095443365247908, 11704190886730495817, - 2340838177346099163, 4681676354692198327, 9363352709384396654, - 1872670541876879330, 3745341083753758661, 7490682167507517323, - 14981364335015034646, 2996272867003006929, 5992545734006013858, - 11985091468012027717, 2397018293602405543, 4794036587204811087, - 9588073174409622174, 1917614634881924434, 3835229269763848869, - 7670458539527697739, 15340917079055395478, 3068183415811079095, - 6136366831622158191, 12272733663244316382, 2454546732648863276, - 4909093465297726553, 9818186930595453106, 1963637386119090621, - 3927274772238181242, 7854549544476362484, 15709099088952724969, - 3141819817790544993, 6283639635581089987, 12567279271162179975, - 2513455854232435995, 5026911708464871990, 10053823416929743980, - 2010764683385948796, 4021529366771897592, 8043058733543795184, - 16086117467087590369, 3217223493417518073, 6434446986835036147, - 12868893973670072295, 2573778794734014459, 5147557589468028918, - 10295115178936057836, 2059023035787211567, 4118046071574423134, - 8236092143148846269, 16472184286297692538, 3294436857259538507, - 6588873714519077015, 13177747429038154030, 2635549485807630806, - 5271098971615261612, 10542197943230523224, 2108439588646104644, - 4216879177292209289, 8433758354584418579, 16867516709168837158, - 3373503341833767431, 6747006683667534863, 13494013367335069727, - 2698802673467013945, 5397605346934027890, 10795210693868055781, - 2159042138773611156, 4318084277547222312, 8636168555094444625, - 17272337110188889250, 3454467422037777850, 6908934844075555700, - 13817869688151111400, 2763573937630222280, 5527147875260444560, - 11054295750520889120, 2210859150104177824, 4421718300208355648, - 8843436600416711296, 17686873200833422592, 3537374640166684518, - 7074749280333369037, 14149498560666738074, 2829899712133347614, - 5659799424266695229, 11319598848533390459, 2263919769706678091, - 4527839539413356183, 9055679078826712367, 1811135815765342473, - 3622271631530684947, 7244543263061369894, 14489086526122739788, - 2897817305224547957, 5795634610449095915, 11591269220898191830, - 2318253844179638366, 4636507688359276732, 9273015376718553464, - 1854603075343710692, 3709206150687421385, 7418412301374842771, - 14836824602749685542, 2967364920549937108, 5934729841099874217, - 11869459682199748434, 2373891936439949686, 4747783872879899373, - 9495567745759798747, 1899113549151959749, 3798227098303919498, - 7596454196607838997, 15192908393215677995, 3038581678643135599, - 6077163357286271198, 12154326714572542396, 2430865342914508479, - 4861730685829016958, 9723461371658033917, 1944692274331606783, - 3889384548663213566, 7778769097326427133, 15557538194652854267, - 3111507638930570853, 6223015277861141707, 12446030555722283414, - 2489206111144456682, 4978412222288913365, 9956824444577826731, - 1991364888915565346, 3982729777831130692, 7965459555662261385, - 15930919111324522770, 3186183822264904554, 6372367644529809108, - 12744735289059618216, 2548947057811923643, 5097894115623847286, - 10195788231247694572, 2039157646249538914, 4078315292499077829, - 8156630584998155658, 16313261169996311316, 3262652233999262263, - 6525304467998524526, 13050608935997049053, 2610121787199409810, - 5220243574398819621, 10440487148797639242, 2088097429759527848, - 4176194859519055697, 8352389719038111394, 16704779438076222788, - 3340955887615244557, 6681911775230489115, 13363823550460978230, - 2672764710092195646, 5345529420184391292, 10691058840368782584, - 2138211768073756516, 4276423536147513033, 8552847072295026067, - 17105694144590052135, 3421138828918010427, 6842277657836020854, - 13684555315672041708, 2736911063134408341, 5473822126268816683, - 10947644252537633366, 2189528850507526673, 4379057701015053346, - 8758115402030106693, 17516230804060213386, 3503246160812042677, - 7006492321624085354, 14012984643248170709, 2802596928649634141, - 5605193857299268283, 11210387714598536567, 2242077542919707313, - 4484155085839414626, 8968310171678829253, 17936620343357658507, - 3587324068671531701, 7174648137343063403, 14349296274686126806, - 2869859254937225361, 5739718509874450722, 11479437019748901445, - 2295887403949780289, 4591774807899560578, 9183549615799121156, - 1836709923159824231, 3673419846319648462, 7346839692639296924, - 14693679385278593849, 2938735877055718769, 5877471754111437539, - 11754943508222875079, 2350988701644575015, 4701977403289150031, - 9403954806578300063, 1880790961315660012, 3761581922631320025, - 7523163845262640050, 15046327690525280101, 3009265538105056020, - 6018531076210112040, 12037062152420224081, 2407412430484044816, - 4814824860968089632, 9629649721936179265, 1925929944387235853, - 3851859888774471706, 7703719777548943412, 15407439555097886824, - 3081487911019577364, 6162975822039154729, 12325951644078309459, - 2465190328815661891, 4930380657631323783, 9860761315262647567, - 1972152263052529513, 3944304526105059027, 7888609052210118054, - 15777218104420236108, 3155443620884047221, 6310887241768094443, - 12621774483536188886, 2524354896707237777, 5048709793414475554, - 10097419586828951109, 2019483917365790221, 4038967834731580443, - 8077935669463160887, 16155871338926321774, 3231174267785264354, - 6462348535570528709, 12924697071141057419, 2584939414228211483, - 5169878828456422967, 10339757656912845935, 2067951531382569187, - 4135903062765138374, 8271806125530276748, 16543612251060553497, - 3308722450212110699, 6617444900424221398, 13234889800848442797, - 2646977960169688559, 5293955920339377119, 10587911840678754238, - 2117582368135750847, 4235164736271501695, 8470329472543003390, - 16940658945086006781, 3388131789017201356, 6776263578034402712, - 13552527156068805425, 2710505431213761085, 5421010862427522170, - 10842021724855044340, 2168404344971008868, 4336808689942017736, - 8673617379884035472, 17347234759768070944, 3469446951953614188, - 6938893903907228377, 13877787807814456755, 2775557561562891351, - 5551115123125782702, 11102230246251565404, 2220446049250313080, - 4440892098500626161, 8881784197001252323, 17763568394002504646, - 3552713678800500929, 7105427357601001858, 14210854715202003717, - 2842170943040400743, 5684341886080801486, 11368683772161602973, - 2273736754432320594, 4547473508864641189, 9094947017729282379, - 1818989403545856475, 3637978807091712951, 7275957614183425903, - 14551915228366851806, 2910383045673370361, 5820766091346740722, - 11641532182693481445, 2328306436538696289, 4656612873077392578, - 9313225746154785156, 1862645149230957031, 3725290298461914062, - 7450580596923828125, 14901161193847656250, 2980232238769531250, - 5960464477539062500, 11920928955078125000, 2384185791015625000, - 4768371582031250000, 9536743164062500000, 1907348632812500000, - 3814697265625000000, 7629394531250000000, 15258789062500000000, - 3051757812500000000, 6103515625000000000, 12207031250000000000, - 2441406250000000000, 4882812500000000000, 9765625000000000000, - 1953125000000000000, 3906250000000000000, 7812500000000000000, - 15625000000000000000, 3125000000000000000, 6250000000000000000, - 12500000000000000000, 2500000000000000000, 5000000000000000000, - 10000000000000000000, 2000000000000000000, 4000000000000000000, - 8000000000000000000, 16000000000000000000, 3200000000000000000, - 6400000000000000000, 12800000000000000000, 2560000000000000000, - 5120000000000000000, 10240000000000000000, 2048000000000000000, - 4096000000000000000, 8192000000000000000, 16384000000000000000, - 3276800000000000000, 6553600000000000000, 13107200000000000000, - 2621440000000000000, 5242880000000000000, 10485760000000000000, - 2097152000000000000, 4194304000000000000, 8388608000000000000, - 16777216000000000000, 3355443200000000000, 6710886400000000000, - 13421772800000000000, 2684354560000000000, 5368709120000000000, - 10737418240000000000, 2147483648000000000, 4294967296000000000, - 8589934592000000000, 17179869184000000000, 3435973836800000000, - 6871947673600000000, 13743895347200000000, 2748779069440000000, - 5497558138880000000, 10995116277760000000, 2199023255552000000, - 4398046511104000000, 8796093022208000000, 17592186044416000000, - 3518437208883200000, 7036874417766400000, 14073748835532800000, - 2814749767106560000, 5629499534213120000, 11258999068426240000, - 2251799813685248000, 4503599627370496000, 9007199254740992000, - 18014398509481984000, 3602879701896396800, 7205759403792793600, - 14411518807585587200, 2882303761517117440, 5764607523034234880, - 11529215046068469760, 2305843009213693952, 4611686018427387904, - 9223372036854775808, 1844674407370955161, 3689348814741910323, - 7378697629483820646, 14757395258967641292, 2951479051793528258, - 5902958103587056517, 11805916207174113034, 2361183241434822606, - 4722366482869645213, 9444732965739290427, 1888946593147858085, - 3777893186295716170, 7555786372591432341, 15111572745182864683, - 3022314549036572936, 6044629098073145873, 12089258196146291747, - 2417851639229258349, 4835703278458516698, 9671406556917033397, - 1934281311383406679, 3868562622766813359, 7737125245533626718, - 15474250491067253436, 3094850098213450687, 6189700196426901374, - 12379400392853802748, 2475880078570760549, 4951760157141521099, - 9903520314283042199, 1980704062856608439, 3961408125713216879, - 7922816251426433759, 15845632502852867518, 3169126500570573503, - 6338253001141147007, 12676506002282294014, 2535301200456458802, - 5070602400912917605, 10141204801825835211, 2028240960365167042, - 4056481920730334084, 8112963841460668169, 16225927682921336339, - 3245185536584267267, 6490371073168534535, 12980742146337069071, - 2596148429267413814, 5192296858534827628, 10384593717069655257, - 2076918743413931051, 4153837486827862102, 8307674973655724205, - 16615349947311448411, 3323069989462289682, 6646139978924579364, - 13292279957849158729, 2658455991569831745, 5316911983139663491, - 10633823966279326983, 2126764793255865396, 4253529586511730793, - 8507059173023461586, 17014118346046923173, 3402823669209384634, - 6805647338418769269, 13611294676837538538, 2722258935367507707, - 5444517870735015415, 10889035741470030830, 2177807148294006166, - 4355614296588012332, 8711228593176024664, 17422457186352049329, - 3484491437270409865, 6968982874540819731, 13937965749081639463, - 2787593149816327892, 5575186299632655785, 11150372599265311570, - 2230074519853062314, 4460149039706124628, 8920298079412249256, - 17840596158824498513, 3568119231764899702, 7136238463529799405, - 14272476927059598810, 2854495385411919762, 5708990770823839524, - 11417981541647679048, 2283596308329535809, 4567192616659071619, - 9134385233318143238, 1826877046663628647, 3653754093327257295, - 7307508186654514591, 14615016373309029182, 2923003274661805836, - 5846006549323611672, 11692013098647223345, 2338402619729444669, - 4676805239458889338, 9353610478917778676, 1870722095783555735, - 3741444191567111470, 7482888383134222941, 14965776766268445882, - 2993155353253689176, 5986310706507378352, 11972621413014756705, - 2394524282602951341, 4789048565205902682, 9578097130411805364, - 1915619426082361072, 3831238852164722145, 7662477704329444291, - 15324955408658888583, 3064991081731777716, 6129982163463555433, - 12259964326927110866, 2451992865385422173, 4903985730770844346, - 9807971461541688693, 1961594292308337738, 3923188584616675477, - 7846377169233350954, 15692754338466701909, 3138550867693340381, - 6277101735386680763, 12554203470773361527, 2510840694154672305, - 5021681388309344611, 10043362776618689222, 2008672555323737844, - 4017345110647475688, 8034690221294951377, 16069380442589902755, - 3213876088517980551, 6427752177035961102, 12855504354071922204, - 2571100870814384440, 5142201741628768881, 10284403483257537763, - 2056880696651507552, 4113761393303015105, 8227522786606030210, - 16455045573212060421, 3291009114642412084, 6582018229284824168, - 13164036458569648337, 2632807291713929667, 5265614583427859334, - 10531229166855718669, 2106245833371143733, 4212491666742287467, - 8424983333484574935, 16849966666969149871, 3369993333393829974, - 6739986666787659948, 13479973333575319897, 2695994666715063979, - 5391989333430127958, 10783978666860255917, 2156795733372051183, - 4313591466744102367, 8627182933488204734, 17254365866976409468, - 3450873173395281893, 6901746346790563787, 13803492693581127574, - 2760698538716225514, 5521397077432451029, 11042794154864902059, - 2208558830972980411, 4417117661945960823, 8834235323891921647, - 17668470647783843295, 3533694129556768659, 7067388259113537318, - 14134776518227074636, 2826955303645414927, 5653910607290829854, - 11307821214581659709, 2261564242916331941, 4523128485832663883, - 9046256971665327767, 18092513943330655534, 3618502788666131106, - 7237005577332262213, 14474011154664524427, 2894802230932904885, - 5789604461865809771, 11579208923731619542, 2315841784746323908, - 4631683569492647816, 9263367138985295633, 1852673427797059126, - 3705346855594118253, 7410693711188236507, 14821387422376473014, - 2964277484475294602, 5928554968950589205, 11857109937901178411, - 2371421987580235682, 4742843975160471364, 9485687950320942729, - 1897137590064188545, 3794275180128377091, 7588550360256754183, - 15177100720513508366, 3035420144102701673, 6070840288205403346, - 12141680576410806693, 2428336115282161338, 4856672230564322677, - 9713344461128645354, 1942668892225729070, 3885337784451458141, - 7770675568902916283, 15541351137805832567, 3108270227561166513, - 6216540455122333026, 12433080910244666053, 2486616182048933210, - 4973232364097866421, 9946464728195732843, 1989292945639146568, - 3978585891278293137, 7957171782556586274, 15914343565113172548, - 3182868713022634509, 6365737426045269019, 12731474852090538039, - 2546294970418107607, 5092589940836215215, 10185179881672430431, - 2037035976334486086, 4074071952668972172, 8148143905337944345, - 16296287810675888690, 3259257562135177738, 6518515124270355476, - 13037030248540710952, 2607406049708142190, 5214812099416284380, - 10429624198832568761, 2085924839766513752, 4171849679533027504, - 8343699359066055009, 16687398718132110018, 3337479743626422003, - 6674959487252844007, 13349918974505688014, 2669983794901137602, - 5339967589802275205, 10679935179604550411, 2135987035920910082, - 4271974071841820164, 8543948143683640329, 17087896287367280659, - 3417579257473456131, 6835158514946912263, 13670317029893824527, - 2734063405978764905, 5468126811957529810, 10936253623915059621, - 2187250724783011924, 4374501449566023848, 8749002899132047697, - 17498005798264095394, 3499601159652819078, 6999202319305638157, - 13998404638611276315, 2799680927722255263, 5599361855444510526, - 11198723710889021052, 2239744742177804210, 4479489484355608421, - 8958978968711216842, 17917957937422433684, 3583591587484486736, - 7167183174968973473, 14334366349937946947, 2866873269987589389, - 5733746539975178779, 11467493079950357558, 2293498615990071511, - 4586997231980143023, 9173994463960286046, 1834798892792057209, - 3669597785584114418, 7339195571168228837, 14678391142336457674, - 2935678228467291534, 5871356456934583069, 11742712913869166139, - 2348542582773833227, 4697085165547666455, 9394170331095332911, - 1878834066219066582, 3757668132438133164, 7515336264876266329, - 15030672529752532658, 3006134505950506531, 6012269011901013063, - 12024538023802026126, 2404907604760405225, 4809815209520810450, - 9619630419041620901, 1923926083808324180, 3847852167616648360, - 7695704335233296721, 15391408670466593442, 3078281734093318688, - 6156563468186637376, 12313126936373274753, 2462625387274654950, - 4925250774549309901, 9850501549098619803, 1970100309819723960, - 3940200619639447921, 7880401239278895842, 15760802478557791684, - 3152160495711558336, 6304320991423116673, 12608641982846233347, - 2521728396569246669, 5043456793138493339, 10086913586276986678, - 2017382717255397335, 4034765434510794671, 8069530869021589342, - 16139061738043178685, 3227812347608635737, 6455624695217271474, - 12911249390434542948, 2582249878086908589, 5164499756173817179, - 10328999512347634358, 2065799902469526871, 4131599804939053743, - 8263199609878107486, 16526399219756214973, 3305279843951242994, - 6610559687902485989, 13221119375804971979, 2644223875160994395, - 5288447750321988791, 10576895500643977583, 2115379100128795516, - 4230758200257591033, 8461516400515182066, 16923032801030364133, - 3384606560206072826, 6769213120412145653, 13538426240824291306, - 2707685248164858261, 5415370496329716522, 10830740992659433045, - 2166148198531886609, 4332296397063773218, 8664592794127546436, - 17329185588255092872, 3465837117651018574, 6931674235302037148, - 13863348470604074297, 2772669694120814859, 5545339388241629719, - 11090678776483259438, 2218135755296651887, 4436271510593303775, - 8872543021186607550, 17745086042373215101, 3549017208474643020, - 7098034416949286040, 14196068833898572081, 2839213766779714416, - 5678427533559428832, 11356855067118857664, 2271371013423771532, - 4542742026847543065, 9085484053695086131, 1817096810739017226, - 3634193621478034452, 7268387242956068905, 14536774485912137810, - 2907354897182427562, 5814709794364855124, 11629419588729710248, - 2325883917745942049, 4651767835491884099, 9303535670983768199, - 1860707134196753639, 3721414268393507279, 7442828536787014559, - 14885657073574029118, 2977131414714805823, 5954262829429611647, - 11908525658859223294, 2381705131771844658, 4763410263543689317, - 9526820527087378635, 1905364105417475727, 3810728210834951454, - 7621456421669902908, 15242912843339805817, 3048582568667961163, - 6097165137335922326, 12194330274671844653, 2438866054934368930, - 4877732109868737861, 9755464219737475723, 1951092843947495144, - 3902185687894990289, 7804371375789980578, 15608742751579961156, - 3121748550315992231, 6243497100631984462, 12486994201263968925, - 2497398840252793785, 4994797680505587570, 9989595361011175140, - 1997919072202235028, 3995838144404470056, 7991676288808940112, - 15983352577617880224, 3196670515523576044, 6393341031047152089, - 12786682062094304179, 2557336412418860835, 5114672824837721671, - 10229345649675443343, 2045869129935088668, 4091738259870177337, - 8183476519740354675, 16366953039480709350, 3273390607896141870, - 6546781215792283740, 13093562431584567480, 2618712486316913496, - 5237424972633826992, 10474849945267653984, 2094969989053530796, - 4189939978107061593, 8379879956214123187, 16759759912428246374, - 3351951982485649274, 6703903964971298549, 13407807929942597099, - 2681561585988519419, 5363123171977038839, 10726246343954077679, - 2145249268790815535, 4290498537581631071, 8580997075163262143, - 17161994150326524287, 3432398830065304857, 6864797660130609714, - 13729595320261219429, 2745919064052243885, 5491838128104487771, - 10983676256208975543, 2196735251241795108, 4393470502483590217, - 8786941004967180435, 17573882009934360870, 3514776401986872174, - 7029552803973744348, 14059105607947488696, 2811821121589497739, - 5623642243178995478, 11247284486357990957, 2249456897271598191, - 4498913794543196382, 8997827589086392765, 17995655178172785531, - 3599131035634557106, 7198262071269114212, 14396524142538228424, - 2879304828507645684, 5758609657015291369, 11517219314030582739, - 2303443862806116547, 4606887725612233095, 9213775451224466191, - 1842755090244893238, 3685510180489786476, 7371020360979572953, - 14742040721959145907, 2948408144391829181, 5896816288783658362, - 11793632577567316725, 2358726515513463345, 4717453031026926690, - 9434906062053853380, 1886981212410770676, 3773962424821541352, - 7547924849643082704, 15095849699286165408, 3019169939857233081, - 6038339879714466163, 12076679759428932327, 2415335951885786465, - 4830671903771572930, 9661343807543145861, 1932268761508629172, - 3864537523017258344, 7729075046034516689, 15458150092069033378, - 3091630018413806675, 6183260036827613351, 12366520073655226703, - 2473304014731045340, 4946608029462090681, 9893216058924181362, - 1978643211784836272, 3957286423569672544, 7914572847139345089, - 15829145694278690179, 3165829138855738035, 6331658277711476071, - 12663316555422952143, 2532663311084590428, 5065326622169180857, - 10130653244338361715, 2026130648867672343, 4052261297735344686, - 8104522595470689372, 16209045190941378744, 3241809038188275748, - 6483618076376551497, 12967236152753102995, 2593447230550620599, - 5186894461101241198, 10373788922202482396, 2074757784440496479, - 4149515568880992958, 8299031137761985917, 16598062275523971834, - 3319612455104794366, 6639224910209588733, 13278449820419177467, - 2655689964083835493, 5311379928167670986, 10622759856335341973, - 2124551971267068394, 4249103942534136789, 8498207885068273579, - 16996415770136547158, 3399283154027309431, 6798566308054618863, - 13597132616109237726, 2719426523221847545, 5438853046443695090, - 10877706092887390181, 2175541218577478036, 4351082437154956072, - 8702164874309912144, 17404329748619824289, 3480865949723964857, - 6961731899447929715, 13923463798895859431, 2784692759779171886, - 5569385519558343772, 11138771039116687545, 2227754207823337509, - 4455508415646675018, 8911016831293350036, 17822033662586700072, - 3564406732517340014, 7128813465034680029, 14257626930069360058, - 2851525386013872011, 5703050772027744023, 11406101544055488046, - 2281220308811097609, 4562440617622195218, 9124881235244390437, - 1824976247048878087, 3649952494097756174, 7299904988195512349, - 14599809976391024699, 2919961995278204939, 5839923990556409879, - 11679847981112819759, 2335969596222563951, 4671939192445127903, - 9343878384890255807, 1868775676978051161, 3737551353956102323, - 7475102707912204646, 14950205415824409292, 2990041083164881858, - 5980082166329763716, 11960164332659527433, 2392032866531905486, - 4784065733063810973, 9568131466127621947, 1913626293225524389, - 3827252586451048778, 7654505172902097557, 15309010345804195115, - 3061802069160839023, 6123604138321678046, 12247208276643356092, - 2449441655328671218, 4898883310657342436, 9797766621314684873, - 1959553324262936974, 3919106648525873949, 7838213297051747899, - 15676426594103495798, 3135285318820699159, 6270570637641398319, - 12541141275282796638, 2508228255056559327, 5016456510113118655, - 10032913020226237310, 2006582604045247462, 4013165208090494924, - 8026330416180989848, 16052660832361979697, 3210532166472395939, - 6421064332944791878, 12842128665889583757, 2568425733177916751, - 5136851466355833503, 10273702932711667006, 2054740586542333401, - 4109481173084666802, 8218962346169333605, 16437924692338667210, - 3287584938467733442, 6575169876935466884, 13150339753870933768, - 2630067950774186753, 5260135901548373507, 10520271803096747014, - 2104054360619349402, 4208108721238698805, 8416217442477397611, - 16832434884954795223, 3366486976990959044, 6732973953981918089, - 13465947907963836178, 2693189581592767235, 5386379163185534471, - 10772758326371068942, 2154551665274213788, 4309103330548427577, - 8618206661096855154, 17236413322193710308, 3447282664438742061, - 6894565328877484123, 13789130657754968246, 2757826131550993649, - 5515652263101987298, 11031304526203974597, 2206260905240794919, - 4412521810481589838, 8825043620963179677, 17650087241926359355, - 3530017448385271871, 7060034896770543742, 14120069793541087484, - 2824013958708217496, 5648027917416434993, 11296055834832869987, - 2259211166966573997, 4518422333933147995, 9036844667866295990, - 18073689335732591980, 3614737867146518396, 7229475734293036792, - 14458951468586073584, 2891790293717214716, 5783580587434429433, - 11567161174868858867, 2313432234973771773, 4626864469947543547, - 9253728939895087094, 1850745787979017418, 3701491575958034837, - 7402983151916069675, 14805966303832139350, 2961193260766427870, - 5922386521532855740, 11844773043065711480, 2368954608613142296, - 4737909217226284592, 9475818434452569184, 1895163686890513836, - 3790327373781027673, 7580654747562055347, 15161309495124110694, - 3032261899024822138, 6064523798049644277, 12129047596099288555, - 2425809519219857711, 4851619038439715422, 9703238076879430844, - 1940647615375886168, 3881295230751772337, 7762590461503544675, - 15525180923007089351, 3105036184601417870, 6210072369202835740, - 12420144738405671481, 2484028947681134296, 4968057895362268592, - 9936115790724537184, 1987223158144907436, 3974446316289814873, - 7948892632579629747, 15897785265159259495, 3179557053031851899, - 6359114106063703798, 12718228212127407596, 2543645642425481519, - 5087291284850963038, 10174582569701926077, 2034916513940385215, - 4069833027880770430, 8139666055761540861, 16279332111523081723, - 3255866422304616344, 6511732844609232689, 13023465689218465379, - 2604693137843693075, 5209386275687386151, 10418772551374772303, - 2083754510274954460, 4167509020549908921, 8335018041099817842, - 16670036082199635685, 3334007216439927137, 6668014432879854274, - 13336028865759708548, 2667205773151941709, 5334411546303883419, - 10668823092607766838, 2133764618521553367, 4267529237043106735, - 8535058474086213470, 17070116948172426941, 3414023389634485388, - 6828046779268970776, 13656093558537941553, 2731218711707588310, - 5462437423415176621, 10924874846830353242, 2184974969366070648, - 4369949938732141297, 8739899877464282594, 17479799754928565188, - 3495959950985713037, 6991919901971426075, 13983839803942852150, - 2796767960788570430, 5593535921577140860, 11187071843154281720, - 2237414368630856344, 4474828737261712688, 8949657474523425376, - 17899314949046850752, 3579862989809370150, 7159725979618740301, - 14319451959237480602, 2863890391847496120, 5727780783694992240, - 11455561567389984481, 2291112313477996896, 4582224626955993792, - 9164449253911987585, 1832889850782397517, 3665779701564795034, - 7331559403129590068, 14663118806259180136, 2932623761251836027, - 5865247522503672054, 11730495045007344109, 2346099009001468821, - 4692198018002937643, 9384396036005875287, 1876879207201175057, - 3753758414402350114, 7507516828804700229, 15015033657609400459, - 3003006731521880091, 6006013463043760183, 12012026926087520367, - 2402405385217504073, 4804810770435008147, 9609621540870016294, - 1921924308174003258, 3843848616348006517, 7687697232696013035, - 15375394465392026070, 3075078893078405214, 6150157786156810428, - 12300315572313620856, 2460063114462724171, 4920126228925448342, - 9840252457850896685, 1968050491570179337, 3936100983140358674, - 7872201966280717348, 15744403932561434696, 3148880786512286939, - 6297761573024573878, 12595523146049147757, 2519104629209829551, - 5038209258419659102, 10076418516839318205, 2015283703367863641, - 4030567406735727282, 8061134813471454564, 16122269626942909129, - 3224453925388581825, 6448907850777163651, 12897815701554327303, - 2579563140310865460, 5159126280621730921, 10318252561243461842, - 2063650512248692368, 4127301024497384737, 8254602048994769474, - 16509204097989538948, 3301840819597907789, 6603681639195815579, - 13207363278391631158, 2641472655678326231, 5282945311356652463, - 10565890622713304927, 2113178124542660985, 4226356249085321970, - 8452712498170643941, 16905424996341287883, 3381084999268257576, - 6762169998536515153, 13524339997073030306, 2704867999414606061, - 5409735998829212122, 10819471997658424245, 2163894399531684849, - 4327788799063369698, 8655577598126739396, 17311155196253478792, - 3462231039250695758, 6924462078501391516, 13848924157002783033, - 2769784831400556606, 5539569662801113213, 11079139325602226427, - 2215827865120445285, 4431655730240890570, 8863311460481781141, - 17726622920963562283, 3545324584192712456, 7090649168385424913, - 14181298336770849826, 2836259667354169965, 5672519334708339930, - 11345038669416679861, 2269007733883335972, 4538015467766671944, - 9076030935533343889, 18152061871066687778, 3630412374213337555, - 7260824748426675111, 14521649496853350222, 2904329899370670044, - 5808659798741340089, 11617319597482680178, 2323463919496536035, - 4646927838993072071, 9293855677986144142, 1858771135597228828, - 3717542271194457656, 7435084542388915313, 14870169084777830627, - 2974033816955566125, 5948067633911132251, 11896135267822264502, - 2379227053564452900, 4758454107128905800, 9516908214257811601, - 1903381642851562320, 3806763285703124640, 7613526571406249281, - 15227053142812498563, 3045410628562499712, 6090821257124999425, - 12181642514249998850, 2436328502849999770, 4872657005699999540, - 9745314011399999080, 1949062802279999816, 3898125604559999632, - 7796251209119999264, 15592502418239998528, 3118500483647999705, - 6237000967295999411, 12474001934591998822, 2494800386918399764, - 4989600773836799529, 9979201547673599058, 1995840309534719811, - 3991680619069439623, 7983361238138879246, 15966722476277758493, - 3193344495255551698, 6386688990511103397, 12773377981022206794, - 2554675596204441358, 5109351192408882717, 10218702384817765435, - 2043740476963553087, 4087480953927106174, 8174961907854212348, - 16349923815708424697, 3269984763141684939, 6539969526283369878, - 13079939052566739757, 2615987810513347951, 5231975621026695903, - 10463951242053391806, 2092790248410678361, 4185580496821356722, - 8371160993642713444, 16742321987285426889, 3348464397457085377, - 6696928794914170755, 13393857589828341511, 2678771517965668302, - 5357543035931336604, 10715086071862673209, 2143017214372534641, - 4286034428745069283, 8572068857490138567, 17144137714980277135, - 3428827542996055427, 6857655085992110854, 13715310171984221708, - 2743062034396844341, 5486124068793688683, 10972248137587377366, - 2194449627517475473, 4388899255034950946, 8777798510069901893, - 17555597020139803786, 3511119404027960757, 7022238808055921514, - 14044477616111843029, 2808895523222368605, 5617791046444737211, - 11235582092889474423, 2247116418577894884, 4494232837155789769, - 8988465674311579538, 17976931348623159077, 3595386269724631815, - 7190772539449263630, 14381545078898527261, 2876309015779705452, - 5752618031559410904, 11505236063118821809, 2301047212623764361, - 4602094425247528723, 9204188850495057447, 1840837770099011489, - 3681675540198022979, 7363351080396045958, - }; - - static readonly int[] TensExponentTable = { - -323, -323, -322, -322, -322, -322, -321, -321, -321, -320, -320, -320, - -319, -319, -319, -319, -318, -318, -318, -317, -317, -317, -316, -316, - -316, -316, -315, -315, -315, -314, -314, -314, -313, -313, -313, -313, - -312, -312, -312, -311, -311, -311, -310, -310, -310, -310, -309, -309, - -309, -308, -308, -308, -307, -307, -307, -307, -306, -306, -306, -305, - -305, -305, -304, -304, -304, -304, -303, -303, -303, -302, -302, -302, - -301, -301, -301, -301, -300, -300, -300, -299, -299, -299, -298, -298, - -298, -298, -297, -297, -297, -296, -296, -296, -295, -295, -295, -295, - -294, -294, -294, -293, -293, -293, -292, -292, -292, -291, -291, -291, - -291, -290, -290, -290, -289, -289, -289, -288, -288, -288, -288, -287, - -287, -287, -286, -286, -286, -285, -285, -285, -285, -284, -284, -284, - -283, -283, -283, -282, -282, -282, -282, -281, -281, -281, -280, -280, - -280, -279, -279, -279, -279, -278, -278, -278, -277, -277, -277, -276, - -276, -276, -276, -275, -275, -275, -274, -274, -274, -273, -273, -273, - -273, -272, -272, -272, -271, -271, -271, -270, -270, -270, -270, -269, - -269, -269, -268, -268, -268, -267, -267, -267, -267, -266, -266, -266, - -265, -265, -265, -264, -264, -264, -263, -263, -263, -263, -262, -262, - -262, -261, -261, -261, -260, -260, -260, -260, -259, -259, -259, -258, - -258, -258, -257, -257, -257, -257, -256, -256, -256, -255, -255, -255, - -254, -254, -254, -254, -253, -253, -253, -252, -252, -252, -251, -251, - -251, -251, -250, -250, -250, -249, -249, -249, -248, -248, -248, -248, - -247, -247, -247, -246, -246, -246, -245, -245, -245, -245, -244, -244, - -244, -243, -243, -243, -242, -242, -242, -242, -241, -241, -241, -240, - -240, -240, -239, -239, -239, -239, -238, -238, -238, -237, -237, -237, - -236, -236, -236, -235, -235, -235, -235, -234, -234, -234, -233, -233, - -233, -232, -232, -232, -232, -231, -231, -231, -230, -230, -230, -229, - -229, -229, -229, -228, -228, -228, -227, -227, -227, -226, -226, -226, - -226, -225, -225, -225, -224, -224, -224, -223, -223, -223, -223, -222, - -222, -222, -221, -221, -221, -220, -220, -220, -220, -219, -219, -219, - -218, -218, -218, -217, -217, -217, -217, -216, -216, -216, -215, -215, - -215, -214, -214, -214, -214, -213, -213, -213, -212, -212, -212, -211, - -211, -211, -211, -210, -210, -210, -209, -209, -209, -208, -208, -208, - -208, -207, -207, -207, -206, -206, -206, -205, -205, -205, -204, -204, - -204, -204, -203, -203, -203, -202, -202, -202, -201, -201, -201, -201, - -200, -200, -200, -199, -199, -199, -198, -198, -198, -198, -197, -197, - -197, -196, -196, -196, -195, -195, -195, -195, -194, -194, -194, -193, - -193, -193, -192, -192, -192, -192, -191, -191, -191, -190, -190, -190, - -189, -189, -189, -189, -188, -188, -188, -187, -187, -187, -186, -186, - -186, -186, -185, -185, -185, -184, -184, -184, -183, -183, -183, -183, - -182, -182, -182, -181, -181, -181, -180, -180, -180, -180, -179, -179, - -179, -178, -178, -178, -177, -177, -177, -176, -176, -176, -176, -175, - -175, -175, -174, -174, -174, -173, -173, -173, -173, -172, -172, -172, - -171, -171, -171, -170, -170, -170, -170, -169, -169, -169, -168, -168, - -168, -167, -167, -167, -167, -166, -166, -166, -165, -165, -165, -164, - -164, -164, -164, -163, -163, -163, -162, -162, -162, -161, -161, -161, - -161, -160, -160, -160, -159, -159, -159, -158, -158, -158, -158, -157, - -157, -157, -156, -156, -156, -155, -155, -155, -155, -154, -154, -154, - -153, -153, -153, -152, -152, -152, -152, -151, -151, -151, -150, -150, - -150, -149, -149, -149, -149, -148, -148, -148, -147, -147, -147, -146, - -146, -146, -145, -145, -145, -145, -144, -144, -144, -143, -143, -143, - -142, -142, -142, -142, -141, -141, -141, -140, -140, -140, -139, -139, - -139, -139, -138, -138, -138, -137, -137, -137, -136, -136, -136, -136, - -135, -135, -135, -134, -134, -134, -133, -133, -133, -133, -132, -132, - -132, -131, -131, -131, -130, -130, -130, -130, -129, -129, -129, -128, - -128, -128, -127, -127, -127, -127, -126, -126, -126, -125, -125, -125, - -124, -124, -124, -124, -123, -123, -123, -122, -122, -122, -121, -121, - -121, -121, -120, -120, -120, -119, -119, -119, -118, -118, -118, -117, - -117, -117, -117, -116, -116, -116, -115, -115, -115, -114, -114, -114, - -114, -113, -113, -113, -112, -112, -112, -111, -111, -111, -111, -110, - -110, -110, -109, -109, -109, -108, -108, -108, -108, -107, -107, -107, - -106, -106, -106, -105, -105, -105, -105, -104, -104, -104, -103, -103, - -103, -102, -102, -102, -102, -101, -101, -101, -100, -100, -100, -99, - -99, -99, -99, -98, -98, -98, -97, -97, -97, -96, -96, -96, - -96, -95, -95, -95, -94, -94, -94, -93, -93, -93, -93, -92, - -92, -92, -91, -91, -91, -90, -90, -90, -89, -89, -89, -89, - -88, -88, -88, -87, -87, -87, -86, -86, -86, -86, -85, -85, - -85, -84, -84, -84, -83, -83, -83, -83, -82, -82, -82, -81, - -81, -81, -80, -80, -80, -80, -79, -79, -79, -78, -78, -78, - -77, -77, -77, -77, -76, -76, -76, -75, -75, -75, -74, -74, - -74, -74, -73, -73, -73, -72, -72, -72, -71, -71, -71, -71, - -70, -70, -70, -69, -69, -69, -68, -68, -68, -68, -67, -67, - -67, -66, -66, -66, -65, -65, -65, -65, -64, -64, -64, -63, - -63, -63, -62, -62, -62, -62, -61, -61, -61, -60, -60, -60, - -59, -59, -59, -58, -58, -58, -58, -57, -57, -57, -56, -56, - -56, -55, -55, -55, -55, -54, -54, -54, -53, -53, -53, -52, - -52, -52, -52, -51, -51, -51, -50, -50, -50, -49, -49, -49, - -49, -48, -48, -48, -47, -47, -47, -46, -46, -46, -46, -45, - -45, -45, -44, -44, -44, -43, -43, -43, -43, -42, -42, -42, - -41, -41, -41, -40, -40, -40, -40, -39, -39, -39, -38, -38, - -38, -37, -37, -37, -37, -36, -36, -36, -35, -35, -35, -34, - -34, -34, -34, -33, -33, -33, -32, -32, -32, -31, -31, -31, - -30, -30, -30, -30, -29, -29, -29, -28, -28, -28, -27, -27, - -27, -27, -26, -26, -26, -25, -25, -25, -24, -24, -24, -24, - -23, -23, -23, -22, -22, -22, -21, -21, -21, -21, -20, -20, - -20, -19, -19, -19, -18, -18, -18, -18, -17, -17, -17, -16, - -16, -16, -15, -15, -15, -15, -14, -14, -14, -13, -13, -13, - -12, -12, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9, - -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, -6, -6, - -5, -5, -5, -4, -4, -4, -3, -3, -3, -3, -2, -2, - -2, -1, -1, -1, 0, 0, 0, 1, 1, 1, 1, 2, - 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, - 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, - 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, - 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, - 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, - 20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, - 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 27, 27, - 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 31, - 31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, - 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, - 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 41, - 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, - 45, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 49, - 49, 49, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, - 53, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, - 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, - 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, - 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 66, 67, - 67, 67, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, - 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 74, 74, - 74, 75, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, - 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, - 81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 84, 85, - 85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 88, 88, - 89, 89, 89, 90, 90, 90, 91, 91, 91, 91, 92, 92, - 92, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 96, - 96, 96, 97, 97, 97, 97, 98, 98, 98, 99, 99, 99, - 100, 100, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, - 103, 103, 104, 104, 104, 105, 105, 105, 106, 106, 106, 106, - 107, 107, 107, 108, 108, 108, 109, 109, 109, 109, 110, 110, - 110, 111, 111, 111, 112, 112, 112, 112, 113, 113, 113, 114, - 114, 114, 115, 115, 115, 116, 116, 116, 116, 117, 117, 117, - 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 121, 121, - 121, 122, 122, 122, 122, 123, 123, 123, 124, 124, 124, 125, - 125, 125, 125, 126, 126, 126, 127, 127, 127, 128, 128, 128, - 128, 129, 129, 129, 130, 130, 130, 131, 131, 131, 131, 132, - 132, 132, 133, 133, 133, 134, 134, 134, 134, 135, 135, 135, - 136, 136, 136, 137, 137, 137, 137, 138, 138, 138, 139, 139, - 139, 140, 140, 140, 140, 141, 141, 141, 142, 142, 142, 143, - 143, 143, 143, 144, 144, 144, 145, 145, 145, 146, 146, 146, - 147, 147, 147, 147, 148, 148, 148, 149, 149, 149, 150, 150, - 150, 150, 151, 151, 151, 152, 152, 152, 153, 153, 153, 153, - 154, 154, 154, 155, 155, 155, 156, 156, 156, 156, 157, 157, - 157, 158, 158, 158, 159, 159, 159, 159, 160, 160, 160, 161, - 161, 161, 162, 162, 162, 162, 163, 163, 163, 164, 164, 164, - 165, 165, 165, 165, 166, 166, 166, 167, 167, 167, 168, 168, - 168, 168, 169, 169, 169, 170, 170, 170, 171, 171, 171, 171, - 172, 172, 172, 173, 173, 173, 174, 174, 174, 175, 175, 175, - 175, 176, 176, 176, 177, 177, 177, 178, 178, 178, 178, 179, - 179, 179, 180, 180, 180, 181, 181, 181, 181, 182, 182, 182, - 183, 183, 183, 184, 184, 184, 184, 185, 185, 185, 186, 186, - 186, 187, 187, 187, 187, 188, 188, 188, 189, 189, 189, 190, - 190, 190, 190, 191, 191, 191, 192, 192, 192, 193, 193, 193, - 193, 194, 194, 194, 195, 195, 195, 196, 196, 196, 196, 197, - 197, 197, 198, 198, 198, 199, 199, 199, 199, 200, 200, 200, - 201, 201, 201, 202, 202, 202, 202, 203, 203, 203, 204, 204, - 204, 205, 205, 205, 206, 206, 206, 206, 207, 207, 207, 208, - 208, 208, 209, 209, 209, 209, 210, 210, 210, 211, 211, 211, - 212, 212, 212, 212, 213, 213, 213, 214, 214, 214, 215, 215, - 215, 215, 216, 216, 216, 217, 217, 217, 218, 218, 218, 218, - 219, 219, 219, 220, 220, 220, 221, 221, 221, 221, 222, 222, - 222, 223, 223, 223, 224, 224, 224, 224, 225, 225, 225, 226, - 226, 226, 227, 227, 227, 227, 228, 228, 228, 229, 229, 229, - 230, 230, 230, 230, 231, 231, 231, 232, 232, 232, 233, 233, - 233, 234, 234, 234, 234, 235, 235, 235, 236, 236, 236, 237, - 237, 237, 237, 238, 238, 238, 239, 239, 239, 240, 240, 240, - 240, 241, 241, 241, 242, 242, 242, 243, 243, 243, 243, 244, - 244, 244, 245, 245, 245, 246, 246, 246, 246, 247, 247, 247, - 248, 248, 248, 249, 249, 249, 249, 250, 250, 250, 251, 251, - 251, 252, 252, 252, 252, 253, 253, 253, 254, 254, 254, 255, - 255, 255, 255, 256, 256, 256, 257, 257, 257, 258, 258, 258, - 258, 259, 259, 259, 260, 260, 260, 261, 261, 261, 261, 262, - 262, 262, 263, 263, 263, 264, 264, 264, 265, 265, 265, 265, - 266, 266, 266, 267, 267, 267, 268, 268, 268, 268, 269, 269, - 269, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 273, - 273, 273, 274, 274, 274, 274, 275, 275, 275, 276, 276, 276, - 277, 277, 277, 277, 278, 278, 278, 279, 279, 279, 280, 280, - 280, 280, 281, 281, 281, 282, 282, 282, 283, 283, 283, 283, - 284, 284, 284, 285, 285, 285, 286, 286, 286, 286, 287, 287, - 287, 288, 288, 288, 289, 289, 289, 289, 290, 290, 290, 291, - 291, 291, 292, 292, 292, 293, 293, 293, - }; - -#if false - #region Double exponent table construction - - // This code computes the above valus of TensExponentTable & - // MantissaBitsTable. This code is helpful when you try to optimize - // further the double ToString performance. - private const int ExponentMid = 1043; - private const int ExponentMax = 2047; - - // Ensure that values won't cause overflow when multiplied with the double Mantissa. - private const ulong UpperMapMark = UInt64.MaxValue / 2 - (1 << 57); - private const ulong LowerMapMark = UInt64.MaxValue / 5 - (1 << 56); - - // The results of 2 ^ 64 / 5 * i for i in {0 .. 4} - private static ulong[] Div5 = new ulong[] { - 0, - 0x3333333333333333, - 0x6666666666666666, - 0x9999999999999999, - 0xCCCCCCCCCCCCCCCC }; - - static NumberFormatter () - { - InitUpperMap (); - InitLowerMap (); - } - - private static void InitUpperMap () - { - ulong val = 1000000000UL << 32; - int expVal = -9; - ulong loVal = 0; - for (int i = ExponentMid; i <= ExponentMax; i++) { - MantissaBitsTable [i] = val; - TensExponentTable [i] = expVal; - if (val < UpperMapMark) { - val = (val << 1) + (uint)(loVal >> 63); - loVal = (loVal << 1); - } - else { - ulong rem = val % 5; - val /= 5; - ulong rem2 = rem + (loVal % 5); - loVal = loVal / 5 + Div5 [rem]; - if (rem2 >= 5) { - loVal++; - rem2 -= 5; - } - expVal++; - } - } - } - - private static void InitLowerMap () - { - ulong val = 1000000000UL << 32; - int expVal = -9; - ulong loVal = 0; - for (int i = ExponentMid; i >= 0; i--) { - MantissaBitsTable [i] = val; - TensExponentTable [i] = expVal; - if (val < LowerMapMark) { - val *= 5; - for (uint j = 4; j > 0; j--) { - if (loVal > Div5 [j]) { - val += j; - break; - } - } - loVal *= 5; - expVal--; - } - else { - loVal = (((ulong)val & 1) << 63) | (loVal >> 1); - val = val >> 1; - } - } - } - - #endregion Double exponent table construction -#endif - } -} -#endif // !UNSAFE_TABLES +// +// System.NumberFormatter.cs +// +// Author: +// Eyal Alaluf (eyala@mainsoft.com) +// +// Copyright (C) 2008 Mainsoft Co. (http://www.mainsoft.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +#if !TARGET_JVM +#define UNSAFE_TABLES +#endif + +namespace System +{ +#if !UNSAFE_TABLES + partial class NumberFormatter + { + static internal readonly char[] DigitLowerTable = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + static internal readonly char[] DigitUpperTable = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + + private static readonly long[] TenPowersList = new long[] { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, + 10000000000, + 100000000000, + 1000000000000, + 10000000000000, + 100000000000000, + 1000000000000000, + 10000000000000000, + 100000000000000000, + 1000000000000000000 + }; + + // DecHexDigits s a translation table from a decimal number to its + // digits hexadecimal representation (e.g. DecHexDigits [34] = 0x34). + static readonly int[] DecHexDigits = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99}; + + static readonly ulong[] MantissaBitsTable = { + 4556951262222748432, 9113902524445496865, 1822780504889099373, + 3645561009778198746, 7291122019556397492, 14582244039112794984, + 2916448807822558996, 5832897615645117993, 11665795231290235987, + 2333159046258047197, 4666318092516094394, 9332636185032188789, + 1866527237006437757, 3733054474012875515, 7466108948025751031, + 14932217896051502063, 2986443579210300412, 5972887158420600825, + 11945774316841201651, 2389154863368240330, 4778309726736480660, + 9556619453472961320, 1911323890694592264, 3822647781389184528, + 7645295562778369056, 15290591125556738113, 3058118225111347622, + 6116236450222695245, 12232472900445390490, 2446494580089078098, + 4892989160178156196, 9785978320356312392, 1957195664071262478, + 3914391328142524957, 7828782656285049914, 15657565312570099828, + 3131513062514019965, 6263026125028039931, 12526052250056079862, + 2505210450011215972, 5010420900022431944, 10020841800044863889, + 2004168360008972777, 4008336720017945555, 8016673440035891111, + 16033346880071782223, 3206669376014356444, 6413338752028712889, + 12826677504057425779, 2565335500811485155, 5130671001622970311, + 10261342003245940623, 2052268400649188124, 4104536801298376249, + 8209073602596752498, 16418147205193504997, 3283629441038700999, + 6567258882077401998, 13134517764154803997, 2626903552830960799, + 5253807105661921599, 10507614211323843198, 2101522842264768639, + 4203045684529537279, 8406091369059074558, 16812182738118149117, + 3362436547623629823, 6724873095247259646, 13449746190494519293, + 2689949238098903858, 5379898476197807717, 10759796952395615435, + 2151959390479123087, 4303918780958246174, 8607837561916492348, + 17215675123832984696, 3443135024766596939, 6886270049533193878, + 13772540099066387756, 2754508019813277551, 5509016039626555102, + 11018032079253110205, 2203606415850622041, 4407212831701244082, + 8814425663402488164, 17628851326804976328, 3525770265360995265, + 7051540530721990531, 14103081061443981063, 2820616212288796212, + 5641232424577592425, 11282464849155184850, 2256492969831036970, + 4512985939662073940, 9025971879324147880, 18051943758648295760, + 3610388751729659152, 7220777503459318304, 14441555006918636608, + 2888311001383727321, 5776622002767454643, 11553244005534909286, + 2310648801106981857, 4621297602213963714, 9242595204427927429, + 1848519040885585485, 3697038081771170971, 7394076163542341943, + 14788152327084683887, 2957630465416936777, 5915260930833873554, + 11830521861667747109, 2366104372333549421, 4732208744667098843, + 9464417489334197687, 1892883497866839537, 3785766995733679075, + 7571533991467358150, 15143067982934716300, 3028613596586943260, + 6057227193173886520, 12114454386347773040, 2422890877269554608, + 4845781754539109216, 9691563509078218432, 1938312701815643686, + 3876625403631287372, 7753250807262574745, 15506501614525149491, + 3101300322905029898, 6202600645810059796, 12405201291620119593, + 2481040258324023918, 4962080516648047837, 9924161033296095674, + 1984832206659219134, 3969664413318438269, 7939328826636876539, + 15878657653273753079, 3175731530654750615, 6351463061309501231, + 12702926122619002463, 2540585224523800492, 5081170449047600985, + 10162340898095201970, 2032468179619040394, 4064936359238080788, + 8129872718476161576, 16259745436952323153, 3251949087390464630, + 6503898174780929261, 13007796349561858522, 2601559269912371704, + 5203118539824743409, 10406237079649486818, 2081247415929897363, + 4162494831859794727, 8324989663719589454, 16649979327439178909, + 3329995865487835781, 6659991730975671563, 13319983461951343127, + 2663996692390268625, 5327993384780537250, 10655986769561074501, + 2131197353912214900, 4262394707824429800, 8524789415648859601, + 17049578831297719202, 3409915766259543840, 6819831532519087681, + 13639663065038175362, 2727932613007635072, 5455865226015270144, + 10911730452030540289, 2182346090406108057, 4364692180812216115, + 8729384361624432231, 17458768723248864463, 3491753744649772892, + 6983507489299545785, 13967014978599091570, 2793402995719818314, + 5586805991439636628, 11173611982879273256, 2234722396575854651, + 4469444793151709302, 8938889586303418605, 17877779172606837210, + 3575555834521367442, 7151111669042734884, 14302223338085469768, + 2860444667617093953, 5720889335234187907, 11441778670468375814, + 2288355734093675162, 4576711468187350325, 9153422936374700651, + 1830684587274940130, 3661369174549880260, 7322738349099760521, + 14645476698199521043, 2929095339639904208, 5858190679279808417, + 11716381358559616834, 2343276271711923366, 4686552543423846733, + 9373105086847693467, 1874621017369538693, 3749242034739077387, + 7498484069478154774, 14996968138956309548, 2999393627791261909, + 5998787255582523819, 11997574511165047638, 2399514902233009527, + 4799029804466019055, 9598059608932038110, 1919611921786407622, + 3839223843572815244, 7678447687145630488, 15356895374291260977, + 3071379074858252195, 6142758149716504390, 12285516299433008781, + 2457103259886601756, 4914206519773203512, 9828413039546407025, + 1965682607909281405, 3931365215818562810, 7862730431637125620, + 15725460863274251240, 3145092172654850248, 6290184345309700496, + 12580368690619400992, 2516073738123880198, 5032147476247760397, + 10064294952495520794, 2012858990499104158, 4025717980998208317, + 8051435961996416635, 16102871923992833270, 3220574384798566654, + 6441148769597133308, 12882297539194266616, 2576459507838853323, + 5152919015677706646, 10305838031355413293, 2061167606271082658, + 4122335212542165317, 8244670425084330634, 16489340850168661269, + 3297868170033732253, 6595736340067464507, 13191472680134929015, + 2638294536026985803, 5276589072053971606, 10553178144107943212, + 2110635628821588642, 4221271257643177284, 8442542515286354569, + 16885085030572709139, 3377017006114541827, 6754034012229083655, + 13508068024458167311, 2701613604891633462, 5403227209783266924, + 10806454419566533849, 2161290883913306769, 4322581767826613539, + 8645163535653227079, 17290327071306454158, 3458065414261290831, + 6916130828522581663, 13832261657045163327, 2766452331409032665, + 5532904662818065330, 11065809325636130661, 2213161865127226132, + 4426323730254452264, 8852647460508904529, 17705294921017809058, + 3541058984203561811, 7082117968407123623, 14164235936814247246, + 2832847187362849449, 5665694374725698898, 11331388749451397797, + 2266277749890279559, 4532555499780559119, 9065110999561118238, + 1813022199912223647, 3626044399824447295, 7252088799648894590, + 14504177599297789180, 2900835519859557836, 5801671039719115672, + 11603342079438231344, 2320668415887646268, 4641336831775292537, + 9282673663550585075, 1856534732710117015, 3713069465420234030, + 7426138930840468060, 14852277861680936121, 2970455572336187224, + 5940911144672374448, 11881822289344748896, 2376364457868949779, + 4752728915737899558, 9505457831475799117, 1901091566295159823, + 3802183132590319647, 7604366265180639294, 15208732530361278588, + 3041746506072255717, 6083493012144511435, 12166986024289022870, + 2433397204857804574, 4866794409715609148, 9733588819431218296, + 1946717763886243659, 3893435527772487318, 7786871055544974637, + 15573742111089949274, 3114748422217989854, 6229496844435979709, + 12458993688871959419, 2491798737774391883, 4983597475548783767, + 9967194951097567535, 1993438990219513507, 3986877980439027014, + 7973755960878054028, 15947511921756108056, 3189502384351221611, + 6379004768702443222, 12758009537404886445, 2551601907480977289, + 5103203814961954578, 10206407629923909156, 2041281525984781831, + 4082563051969563662, 8165126103939127325, 16330252207878254650, + 3266050441575650930, 6532100883151301860, 13064201766302603720, + 2612840353260520744, 5225680706521041488, 10451361413042082976, + 2090272282608416595, 4180544565216833190, 8361089130433666380, + 16722178260867332761, 3344435652173466552, 6688871304346933104, + 13377742608693866209, 2675548521738773241, 5351097043477546483, + 10702194086955092967, 2140438817391018593, 4280877634782037187, + 8561755269564074374, 17123510539128148748, 3424702107825629749, + 6849404215651259499, 13698808431302518998, 2739761686260503799, + 5479523372521007599, 10959046745042015198, 2191809349008403039, + 4383618698016806079, 8767237396033612159, 17534474792067224318, + 3506894958413444863, 7013789916826889727, 14027579833653779454, + 2805515966730755890, 5611031933461511781, 11222063866923023563, + 2244412773384604712, 4488825546769209425, 8977651093538418850, + 17955302187076837701, 3591060437415367540, 7182120874830735080, + 14364241749661470161, 2872848349932294032, 5745696699864588064, + 11491393399729176129, 2298278679945835225, 4596557359891670451, + 9193114719783340903, 1838622943956668180, 3677245887913336361, + 7354491775826672722, 14708983551653345445, 2941796710330669089, + 5883593420661338178, 11767186841322676356, 2353437368264535271, + 4706874736529070542, 9413749473058141084, 1882749894611628216, + 3765499789223256433, 7530999578446512867, 15061999156893025735, + 3012399831378605147, 6024799662757210294, 12049599325514420588, + 2409919865102884117, 4819839730205768235, 9639679460411536470, + 1927935892082307294, 3855871784164614588, 7711743568329229176, + 15423487136658458353, 3084697427331691670, 6169394854663383341, + 12338789709326766682, 2467757941865353336, 4935515883730706673, + 9871031767461413346, 1974206353492282669, 3948412706984565338, + 7896825413969130677, 15793650827938261354, 3158730165587652270, + 6317460331175304541, 12634920662350609083, 2526984132470121816, + 5053968264940243633, 10107936529880487266, 2021587305976097453, + 4043174611952194906, 8086349223904389813, 16172698447808779626, + 3234539689561755925, 6469079379123511850, 12938158758247023701, + 2587631751649404740, 5175263503298809480, 10350527006597618960, + 2070105401319523792, 4140210802639047584, 8280421605278095168, + 16560843210556190337, 3312168642111238067, 6624337284222476135, + 13248674568444952270, 2649734913688990454, 5299469827377980908, + 10598939654755961816, 2119787930951192363, 4239575861902384726, + 8479151723804769452, 16958303447609538905, 3391660689521907781, + 6783321379043815562, 13566642758087631124, 2713328551617526224, + 5426657103235052449, 10853314206470104899, 2170662841294020979, + 4341325682588041959, 8682651365176083919, 17365302730352167839, + 3473060546070433567, 6946121092140867135, 13892242184281734271, + 2778448436856346854, 5556896873712693708, 11113793747425387417, + 2222758749485077483, 4445517498970154966, 8891034997940309933, + 17782069995880619867, 3556413999176123973, 7112827998352247947, + 14225655996704495894, 2845131199340899178, 5690262398681798357, + 11380524797363596715, 2276104959472719343, 4552209918945438686, + 9104419837890877372, 1820883967578175474, 3641767935156350948, + 7283535870312701897, 14567071740625403795, 2913414348125080759, + 5826828696250161518, 11653657392500323036, 2330731478500064607, + 4661462957000129214, 9322925914000258429, 1864585182800051685, + 3729170365600103371, 7458340731200206743, 14916681462400413486, + 2983336292480082697, 5966672584960165394, 11933345169920330789, + 2386669033984066157, 4773338067968132315, 9546676135936264631, + 1909335227187252926, 3818670454374505852, 7637340908749011705, + 15274681817498023410, 3054936363499604682, 6109872726999209364, + 12219745453998418728, 2443949090799683745, 4887898181599367491, + 9775796363198734982, 1955159272639746996, 3910318545279493993, + 7820637090558987986, 15641274181117975972, 3128254836223595194, + 6256509672447190388, 12513019344894380777, 2502603868978876155, + 5005207737957752311, 10010415475915504622, 2002083095183100924, + 4004166190366201848, 8008332380732403697, 16016664761464807395, + 3203332952292961479, 6406665904585922958, 12813331809171845916, + 2562666361834369183, 5125332723668738366, 10250665447337476733, + 2050133089467495346, 4100266178934990693, 8200532357869981386, + 16401064715739962772, 3280212943147992554, 6560425886295985109, + 13120851772591970218, 2624170354518394043, 5248340709036788087, + 10496681418073576174, 2099336283614715234, 4198672567229430469, + 8397345134458860939, 16794690268917721879, 3358938053783544375, + 6717876107567088751, 13435752215134177503, 2687150443026835500, + 5374300886053671001, 10748601772107342002, 2149720354421468400, + 4299440708842936801, 8598881417685873602, 17197762835371747204, + 3439552567074349440, 6879105134148698881, 13758210268297397763, + 2751642053659479552, 5503284107318959105, 11006568214637918210, + 2201313642927583642, 4402627285855167284, 8805254571710334568, + 17610509143420669137, 3522101828684133827, 7044203657368267654, + 14088407314736535309, 2817681462947307061, 5635362925894614123, + 11270725851789228247, 2254145170357845649, 4508290340715691299, + 9016580681431382598, 18033161362862765196, 3606632272572553039, + 7213264545145106078, 14426529090290212157, 2885305818058042431, + 5770611636116084862, 11541223272232169725, 2308244654446433945, + 4616489308892867890, 9232978617785735780, 1846595723557147156, + 3693191447114294312, 7386382894228588624, 14772765788457177249, + 2954553157691435449, 5909106315382870899, 11818212630765741799, + 2363642526153148359, 4727285052306296719, 9454570104612593439, + 1890914020922518687, 3781828041845037375, 7563656083690074751, + 15127312167380149503, 3025462433476029900, 6050924866952059801, + 12101849733904119602, 2420369946780823920, 4840739893561647841, + 9681479787123295682, 1936295957424659136, 3872591914849318272, + 7745183829698636545, 15490367659397273091, 3098073531879454618, + 6196147063758909236, 12392294127517818473, 2478458825503563694, + 4956917651007127389, 9913835302014254778, 1982767060402850955, + 3965534120805701911, 7931068241611403822, 15862136483222807645, + 3172427296644561529, 6344854593289123058, 12689709186578246116, + 2537941837315649223, 5075883674631298446, 10151767349262596893, + 2030353469852519378, 4060706939705038757, 8121413879410077514, + 16242827758820155028, 3248565551764031005, 6497131103528062011, + 12994262207056124023, 2598852441411224804, 5197704882822449609, + 10395409765644899218, 2079081953128979843, 4158163906257959687, + 8316327812515919374, 16632655625031838749, 3326531125006367749, + 6653062250012735499, 13306124500025470999, 2661224900005094199, + 5322449800010188399, 10644899600020376799, 2128979920004075359, + 4257959840008150719, 8515919680016301439, 17031839360032602879, + 3406367872006520575, 6812735744013041151, 13625471488026082303, + 2725094297605216460, 5450188595210432921, 10900377190420865842, + 2180075438084173168, 4360150876168346337, 8720301752336692674, + 17440603504673385348, 3488120700934677069, 6976241401869354139, + 13952482803738708279, 2790496560747741655, 5580993121495483311, + 11161986242990966623, 2232397248598193324, 4464794497196386649, + 8929588994392773298, 17859177988785546597, 3571835597757109319, + 7143671195514218638, 14287342391028437277, 2857468478205687455, + 5714936956411374911, 11429873912822749822, 2285974782564549964, + 4571949565129099928, 9143899130258199857, 1828779826051639971, + 3657559652103279943, 7315119304206559886, 14630238608413119772, + 2926047721682623954, 5852095443365247908, 11704190886730495817, + 2340838177346099163, 4681676354692198327, 9363352709384396654, + 1872670541876879330, 3745341083753758661, 7490682167507517323, + 14981364335015034646, 2996272867003006929, 5992545734006013858, + 11985091468012027717, 2397018293602405543, 4794036587204811087, + 9588073174409622174, 1917614634881924434, 3835229269763848869, + 7670458539527697739, 15340917079055395478, 3068183415811079095, + 6136366831622158191, 12272733663244316382, 2454546732648863276, + 4909093465297726553, 9818186930595453106, 1963637386119090621, + 3927274772238181242, 7854549544476362484, 15709099088952724969, + 3141819817790544993, 6283639635581089987, 12567279271162179975, + 2513455854232435995, 5026911708464871990, 10053823416929743980, + 2010764683385948796, 4021529366771897592, 8043058733543795184, + 16086117467087590369, 3217223493417518073, 6434446986835036147, + 12868893973670072295, 2573778794734014459, 5147557589468028918, + 10295115178936057836, 2059023035787211567, 4118046071574423134, + 8236092143148846269, 16472184286297692538, 3294436857259538507, + 6588873714519077015, 13177747429038154030, 2635549485807630806, + 5271098971615261612, 10542197943230523224, 2108439588646104644, + 4216879177292209289, 8433758354584418579, 16867516709168837158, + 3373503341833767431, 6747006683667534863, 13494013367335069727, + 2698802673467013945, 5397605346934027890, 10795210693868055781, + 2159042138773611156, 4318084277547222312, 8636168555094444625, + 17272337110188889250, 3454467422037777850, 6908934844075555700, + 13817869688151111400, 2763573937630222280, 5527147875260444560, + 11054295750520889120, 2210859150104177824, 4421718300208355648, + 8843436600416711296, 17686873200833422592, 3537374640166684518, + 7074749280333369037, 14149498560666738074, 2829899712133347614, + 5659799424266695229, 11319598848533390459, 2263919769706678091, + 4527839539413356183, 9055679078826712367, 1811135815765342473, + 3622271631530684947, 7244543263061369894, 14489086526122739788, + 2897817305224547957, 5795634610449095915, 11591269220898191830, + 2318253844179638366, 4636507688359276732, 9273015376718553464, + 1854603075343710692, 3709206150687421385, 7418412301374842771, + 14836824602749685542, 2967364920549937108, 5934729841099874217, + 11869459682199748434, 2373891936439949686, 4747783872879899373, + 9495567745759798747, 1899113549151959749, 3798227098303919498, + 7596454196607838997, 15192908393215677995, 3038581678643135599, + 6077163357286271198, 12154326714572542396, 2430865342914508479, + 4861730685829016958, 9723461371658033917, 1944692274331606783, + 3889384548663213566, 7778769097326427133, 15557538194652854267, + 3111507638930570853, 6223015277861141707, 12446030555722283414, + 2489206111144456682, 4978412222288913365, 9956824444577826731, + 1991364888915565346, 3982729777831130692, 7965459555662261385, + 15930919111324522770, 3186183822264904554, 6372367644529809108, + 12744735289059618216, 2548947057811923643, 5097894115623847286, + 10195788231247694572, 2039157646249538914, 4078315292499077829, + 8156630584998155658, 16313261169996311316, 3262652233999262263, + 6525304467998524526, 13050608935997049053, 2610121787199409810, + 5220243574398819621, 10440487148797639242, 2088097429759527848, + 4176194859519055697, 8352389719038111394, 16704779438076222788, + 3340955887615244557, 6681911775230489115, 13363823550460978230, + 2672764710092195646, 5345529420184391292, 10691058840368782584, + 2138211768073756516, 4276423536147513033, 8552847072295026067, + 17105694144590052135, 3421138828918010427, 6842277657836020854, + 13684555315672041708, 2736911063134408341, 5473822126268816683, + 10947644252537633366, 2189528850507526673, 4379057701015053346, + 8758115402030106693, 17516230804060213386, 3503246160812042677, + 7006492321624085354, 14012984643248170709, 2802596928649634141, + 5605193857299268283, 11210387714598536567, 2242077542919707313, + 4484155085839414626, 8968310171678829253, 17936620343357658507, + 3587324068671531701, 7174648137343063403, 14349296274686126806, + 2869859254937225361, 5739718509874450722, 11479437019748901445, + 2295887403949780289, 4591774807899560578, 9183549615799121156, + 1836709923159824231, 3673419846319648462, 7346839692639296924, + 14693679385278593849, 2938735877055718769, 5877471754111437539, + 11754943508222875079, 2350988701644575015, 4701977403289150031, + 9403954806578300063, 1880790961315660012, 3761581922631320025, + 7523163845262640050, 15046327690525280101, 3009265538105056020, + 6018531076210112040, 12037062152420224081, 2407412430484044816, + 4814824860968089632, 9629649721936179265, 1925929944387235853, + 3851859888774471706, 7703719777548943412, 15407439555097886824, + 3081487911019577364, 6162975822039154729, 12325951644078309459, + 2465190328815661891, 4930380657631323783, 9860761315262647567, + 1972152263052529513, 3944304526105059027, 7888609052210118054, + 15777218104420236108, 3155443620884047221, 6310887241768094443, + 12621774483536188886, 2524354896707237777, 5048709793414475554, + 10097419586828951109, 2019483917365790221, 4038967834731580443, + 8077935669463160887, 16155871338926321774, 3231174267785264354, + 6462348535570528709, 12924697071141057419, 2584939414228211483, + 5169878828456422967, 10339757656912845935, 2067951531382569187, + 4135903062765138374, 8271806125530276748, 16543612251060553497, + 3308722450212110699, 6617444900424221398, 13234889800848442797, + 2646977960169688559, 5293955920339377119, 10587911840678754238, + 2117582368135750847, 4235164736271501695, 8470329472543003390, + 16940658945086006781, 3388131789017201356, 6776263578034402712, + 13552527156068805425, 2710505431213761085, 5421010862427522170, + 10842021724855044340, 2168404344971008868, 4336808689942017736, + 8673617379884035472, 17347234759768070944, 3469446951953614188, + 6938893903907228377, 13877787807814456755, 2775557561562891351, + 5551115123125782702, 11102230246251565404, 2220446049250313080, + 4440892098500626161, 8881784197001252323, 17763568394002504646, + 3552713678800500929, 7105427357601001858, 14210854715202003717, + 2842170943040400743, 5684341886080801486, 11368683772161602973, + 2273736754432320594, 4547473508864641189, 9094947017729282379, + 1818989403545856475, 3637978807091712951, 7275957614183425903, + 14551915228366851806, 2910383045673370361, 5820766091346740722, + 11641532182693481445, 2328306436538696289, 4656612873077392578, + 9313225746154785156, 1862645149230957031, 3725290298461914062, + 7450580596923828125, 14901161193847656250, 2980232238769531250, + 5960464477539062500, 11920928955078125000, 2384185791015625000, + 4768371582031250000, 9536743164062500000, 1907348632812500000, + 3814697265625000000, 7629394531250000000, 15258789062500000000, + 3051757812500000000, 6103515625000000000, 12207031250000000000, + 2441406250000000000, 4882812500000000000, 9765625000000000000, + 1953125000000000000, 3906250000000000000, 7812500000000000000, + 15625000000000000000, 3125000000000000000, 6250000000000000000, + 12500000000000000000, 2500000000000000000, 5000000000000000000, + 10000000000000000000, 2000000000000000000, 4000000000000000000, + 8000000000000000000, 16000000000000000000, 3200000000000000000, + 6400000000000000000, 12800000000000000000, 2560000000000000000, + 5120000000000000000, 10240000000000000000, 2048000000000000000, + 4096000000000000000, 8192000000000000000, 16384000000000000000, + 3276800000000000000, 6553600000000000000, 13107200000000000000, + 2621440000000000000, 5242880000000000000, 10485760000000000000, + 2097152000000000000, 4194304000000000000, 8388608000000000000, + 16777216000000000000, 3355443200000000000, 6710886400000000000, + 13421772800000000000, 2684354560000000000, 5368709120000000000, + 10737418240000000000, 2147483648000000000, 4294967296000000000, + 8589934592000000000, 17179869184000000000, 3435973836800000000, + 6871947673600000000, 13743895347200000000, 2748779069440000000, + 5497558138880000000, 10995116277760000000, 2199023255552000000, + 4398046511104000000, 8796093022208000000, 17592186044416000000, + 3518437208883200000, 7036874417766400000, 14073748835532800000, + 2814749767106560000, 5629499534213120000, 11258999068426240000, + 2251799813685248000, 4503599627370496000, 9007199254740992000, + 18014398509481984000, 3602879701896396800, 7205759403792793600, + 14411518807585587200, 2882303761517117440, 5764607523034234880, + 11529215046068469760, 2305843009213693952, 4611686018427387904, + 9223372036854775808, 1844674407370955161, 3689348814741910323, + 7378697629483820646, 14757395258967641292, 2951479051793528258, + 5902958103587056517, 11805916207174113034, 2361183241434822606, + 4722366482869645213, 9444732965739290427, 1888946593147858085, + 3777893186295716170, 7555786372591432341, 15111572745182864683, + 3022314549036572936, 6044629098073145873, 12089258196146291747, + 2417851639229258349, 4835703278458516698, 9671406556917033397, + 1934281311383406679, 3868562622766813359, 7737125245533626718, + 15474250491067253436, 3094850098213450687, 6189700196426901374, + 12379400392853802748, 2475880078570760549, 4951760157141521099, + 9903520314283042199, 1980704062856608439, 3961408125713216879, + 7922816251426433759, 15845632502852867518, 3169126500570573503, + 6338253001141147007, 12676506002282294014, 2535301200456458802, + 5070602400912917605, 10141204801825835211, 2028240960365167042, + 4056481920730334084, 8112963841460668169, 16225927682921336339, + 3245185536584267267, 6490371073168534535, 12980742146337069071, + 2596148429267413814, 5192296858534827628, 10384593717069655257, + 2076918743413931051, 4153837486827862102, 8307674973655724205, + 16615349947311448411, 3323069989462289682, 6646139978924579364, + 13292279957849158729, 2658455991569831745, 5316911983139663491, + 10633823966279326983, 2126764793255865396, 4253529586511730793, + 8507059173023461586, 17014118346046923173, 3402823669209384634, + 6805647338418769269, 13611294676837538538, 2722258935367507707, + 5444517870735015415, 10889035741470030830, 2177807148294006166, + 4355614296588012332, 8711228593176024664, 17422457186352049329, + 3484491437270409865, 6968982874540819731, 13937965749081639463, + 2787593149816327892, 5575186299632655785, 11150372599265311570, + 2230074519853062314, 4460149039706124628, 8920298079412249256, + 17840596158824498513, 3568119231764899702, 7136238463529799405, + 14272476927059598810, 2854495385411919762, 5708990770823839524, + 11417981541647679048, 2283596308329535809, 4567192616659071619, + 9134385233318143238, 1826877046663628647, 3653754093327257295, + 7307508186654514591, 14615016373309029182, 2923003274661805836, + 5846006549323611672, 11692013098647223345, 2338402619729444669, + 4676805239458889338, 9353610478917778676, 1870722095783555735, + 3741444191567111470, 7482888383134222941, 14965776766268445882, + 2993155353253689176, 5986310706507378352, 11972621413014756705, + 2394524282602951341, 4789048565205902682, 9578097130411805364, + 1915619426082361072, 3831238852164722145, 7662477704329444291, + 15324955408658888583, 3064991081731777716, 6129982163463555433, + 12259964326927110866, 2451992865385422173, 4903985730770844346, + 9807971461541688693, 1961594292308337738, 3923188584616675477, + 7846377169233350954, 15692754338466701909, 3138550867693340381, + 6277101735386680763, 12554203470773361527, 2510840694154672305, + 5021681388309344611, 10043362776618689222, 2008672555323737844, + 4017345110647475688, 8034690221294951377, 16069380442589902755, + 3213876088517980551, 6427752177035961102, 12855504354071922204, + 2571100870814384440, 5142201741628768881, 10284403483257537763, + 2056880696651507552, 4113761393303015105, 8227522786606030210, + 16455045573212060421, 3291009114642412084, 6582018229284824168, + 13164036458569648337, 2632807291713929667, 5265614583427859334, + 10531229166855718669, 2106245833371143733, 4212491666742287467, + 8424983333484574935, 16849966666969149871, 3369993333393829974, + 6739986666787659948, 13479973333575319897, 2695994666715063979, + 5391989333430127958, 10783978666860255917, 2156795733372051183, + 4313591466744102367, 8627182933488204734, 17254365866976409468, + 3450873173395281893, 6901746346790563787, 13803492693581127574, + 2760698538716225514, 5521397077432451029, 11042794154864902059, + 2208558830972980411, 4417117661945960823, 8834235323891921647, + 17668470647783843295, 3533694129556768659, 7067388259113537318, + 14134776518227074636, 2826955303645414927, 5653910607290829854, + 11307821214581659709, 2261564242916331941, 4523128485832663883, + 9046256971665327767, 18092513943330655534, 3618502788666131106, + 7237005577332262213, 14474011154664524427, 2894802230932904885, + 5789604461865809771, 11579208923731619542, 2315841784746323908, + 4631683569492647816, 9263367138985295633, 1852673427797059126, + 3705346855594118253, 7410693711188236507, 14821387422376473014, + 2964277484475294602, 5928554968950589205, 11857109937901178411, + 2371421987580235682, 4742843975160471364, 9485687950320942729, + 1897137590064188545, 3794275180128377091, 7588550360256754183, + 15177100720513508366, 3035420144102701673, 6070840288205403346, + 12141680576410806693, 2428336115282161338, 4856672230564322677, + 9713344461128645354, 1942668892225729070, 3885337784451458141, + 7770675568902916283, 15541351137805832567, 3108270227561166513, + 6216540455122333026, 12433080910244666053, 2486616182048933210, + 4973232364097866421, 9946464728195732843, 1989292945639146568, + 3978585891278293137, 7957171782556586274, 15914343565113172548, + 3182868713022634509, 6365737426045269019, 12731474852090538039, + 2546294970418107607, 5092589940836215215, 10185179881672430431, + 2037035976334486086, 4074071952668972172, 8148143905337944345, + 16296287810675888690, 3259257562135177738, 6518515124270355476, + 13037030248540710952, 2607406049708142190, 5214812099416284380, + 10429624198832568761, 2085924839766513752, 4171849679533027504, + 8343699359066055009, 16687398718132110018, 3337479743626422003, + 6674959487252844007, 13349918974505688014, 2669983794901137602, + 5339967589802275205, 10679935179604550411, 2135987035920910082, + 4271974071841820164, 8543948143683640329, 17087896287367280659, + 3417579257473456131, 6835158514946912263, 13670317029893824527, + 2734063405978764905, 5468126811957529810, 10936253623915059621, + 2187250724783011924, 4374501449566023848, 8749002899132047697, + 17498005798264095394, 3499601159652819078, 6999202319305638157, + 13998404638611276315, 2799680927722255263, 5599361855444510526, + 11198723710889021052, 2239744742177804210, 4479489484355608421, + 8958978968711216842, 17917957937422433684, 3583591587484486736, + 7167183174968973473, 14334366349937946947, 2866873269987589389, + 5733746539975178779, 11467493079950357558, 2293498615990071511, + 4586997231980143023, 9173994463960286046, 1834798892792057209, + 3669597785584114418, 7339195571168228837, 14678391142336457674, + 2935678228467291534, 5871356456934583069, 11742712913869166139, + 2348542582773833227, 4697085165547666455, 9394170331095332911, + 1878834066219066582, 3757668132438133164, 7515336264876266329, + 15030672529752532658, 3006134505950506531, 6012269011901013063, + 12024538023802026126, 2404907604760405225, 4809815209520810450, + 9619630419041620901, 1923926083808324180, 3847852167616648360, + 7695704335233296721, 15391408670466593442, 3078281734093318688, + 6156563468186637376, 12313126936373274753, 2462625387274654950, + 4925250774549309901, 9850501549098619803, 1970100309819723960, + 3940200619639447921, 7880401239278895842, 15760802478557791684, + 3152160495711558336, 6304320991423116673, 12608641982846233347, + 2521728396569246669, 5043456793138493339, 10086913586276986678, + 2017382717255397335, 4034765434510794671, 8069530869021589342, + 16139061738043178685, 3227812347608635737, 6455624695217271474, + 12911249390434542948, 2582249878086908589, 5164499756173817179, + 10328999512347634358, 2065799902469526871, 4131599804939053743, + 8263199609878107486, 16526399219756214973, 3305279843951242994, + 6610559687902485989, 13221119375804971979, 2644223875160994395, + 5288447750321988791, 10576895500643977583, 2115379100128795516, + 4230758200257591033, 8461516400515182066, 16923032801030364133, + 3384606560206072826, 6769213120412145653, 13538426240824291306, + 2707685248164858261, 5415370496329716522, 10830740992659433045, + 2166148198531886609, 4332296397063773218, 8664592794127546436, + 17329185588255092872, 3465837117651018574, 6931674235302037148, + 13863348470604074297, 2772669694120814859, 5545339388241629719, + 11090678776483259438, 2218135755296651887, 4436271510593303775, + 8872543021186607550, 17745086042373215101, 3549017208474643020, + 7098034416949286040, 14196068833898572081, 2839213766779714416, + 5678427533559428832, 11356855067118857664, 2271371013423771532, + 4542742026847543065, 9085484053695086131, 1817096810739017226, + 3634193621478034452, 7268387242956068905, 14536774485912137810, + 2907354897182427562, 5814709794364855124, 11629419588729710248, + 2325883917745942049, 4651767835491884099, 9303535670983768199, + 1860707134196753639, 3721414268393507279, 7442828536787014559, + 14885657073574029118, 2977131414714805823, 5954262829429611647, + 11908525658859223294, 2381705131771844658, 4763410263543689317, + 9526820527087378635, 1905364105417475727, 3810728210834951454, + 7621456421669902908, 15242912843339805817, 3048582568667961163, + 6097165137335922326, 12194330274671844653, 2438866054934368930, + 4877732109868737861, 9755464219737475723, 1951092843947495144, + 3902185687894990289, 7804371375789980578, 15608742751579961156, + 3121748550315992231, 6243497100631984462, 12486994201263968925, + 2497398840252793785, 4994797680505587570, 9989595361011175140, + 1997919072202235028, 3995838144404470056, 7991676288808940112, + 15983352577617880224, 3196670515523576044, 6393341031047152089, + 12786682062094304179, 2557336412418860835, 5114672824837721671, + 10229345649675443343, 2045869129935088668, 4091738259870177337, + 8183476519740354675, 16366953039480709350, 3273390607896141870, + 6546781215792283740, 13093562431584567480, 2618712486316913496, + 5237424972633826992, 10474849945267653984, 2094969989053530796, + 4189939978107061593, 8379879956214123187, 16759759912428246374, + 3351951982485649274, 6703903964971298549, 13407807929942597099, + 2681561585988519419, 5363123171977038839, 10726246343954077679, + 2145249268790815535, 4290498537581631071, 8580997075163262143, + 17161994150326524287, 3432398830065304857, 6864797660130609714, + 13729595320261219429, 2745919064052243885, 5491838128104487771, + 10983676256208975543, 2196735251241795108, 4393470502483590217, + 8786941004967180435, 17573882009934360870, 3514776401986872174, + 7029552803973744348, 14059105607947488696, 2811821121589497739, + 5623642243178995478, 11247284486357990957, 2249456897271598191, + 4498913794543196382, 8997827589086392765, 17995655178172785531, + 3599131035634557106, 7198262071269114212, 14396524142538228424, + 2879304828507645684, 5758609657015291369, 11517219314030582739, + 2303443862806116547, 4606887725612233095, 9213775451224466191, + 1842755090244893238, 3685510180489786476, 7371020360979572953, + 14742040721959145907, 2948408144391829181, 5896816288783658362, + 11793632577567316725, 2358726515513463345, 4717453031026926690, + 9434906062053853380, 1886981212410770676, 3773962424821541352, + 7547924849643082704, 15095849699286165408, 3019169939857233081, + 6038339879714466163, 12076679759428932327, 2415335951885786465, + 4830671903771572930, 9661343807543145861, 1932268761508629172, + 3864537523017258344, 7729075046034516689, 15458150092069033378, + 3091630018413806675, 6183260036827613351, 12366520073655226703, + 2473304014731045340, 4946608029462090681, 9893216058924181362, + 1978643211784836272, 3957286423569672544, 7914572847139345089, + 15829145694278690179, 3165829138855738035, 6331658277711476071, + 12663316555422952143, 2532663311084590428, 5065326622169180857, + 10130653244338361715, 2026130648867672343, 4052261297735344686, + 8104522595470689372, 16209045190941378744, 3241809038188275748, + 6483618076376551497, 12967236152753102995, 2593447230550620599, + 5186894461101241198, 10373788922202482396, 2074757784440496479, + 4149515568880992958, 8299031137761985917, 16598062275523971834, + 3319612455104794366, 6639224910209588733, 13278449820419177467, + 2655689964083835493, 5311379928167670986, 10622759856335341973, + 2124551971267068394, 4249103942534136789, 8498207885068273579, + 16996415770136547158, 3399283154027309431, 6798566308054618863, + 13597132616109237726, 2719426523221847545, 5438853046443695090, + 10877706092887390181, 2175541218577478036, 4351082437154956072, + 8702164874309912144, 17404329748619824289, 3480865949723964857, + 6961731899447929715, 13923463798895859431, 2784692759779171886, + 5569385519558343772, 11138771039116687545, 2227754207823337509, + 4455508415646675018, 8911016831293350036, 17822033662586700072, + 3564406732517340014, 7128813465034680029, 14257626930069360058, + 2851525386013872011, 5703050772027744023, 11406101544055488046, + 2281220308811097609, 4562440617622195218, 9124881235244390437, + 1824976247048878087, 3649952494097756174, 7299904988195512349, + 14599809976391024699, 2919961995278204939, 5839923990556409879, + 11679847981112819759, 2335969596222563951, 4671939192445127903, + 9343878384890255807, 1868775676978051161, 3737551353956102323, + 7475102707912204646, 14950205415824409292, 2990041083164881858, + 5980082166329763716, 11960164332659527433, 2392032866531905486, + 4784065733063810973, 9568131466127621947, 1913626293225524389, + 3827252586451048778, 7654505172902097557, 15309010345804195115, + 3061802069160839023, 6123604138321678046, 12247208276643356092, + 2449441655328671218, 4898883310657342436, 9797766621314684873, + 1959553324262936974, 3919106648525873949, 7838213297051747899, + 15676426594103495798, 3135285318820699159, 6270570637641398319, + 12541141275282796638, 2508228255056559327, 5016456510113118655, + 10032913020226237310, 2006582604045247462, 4013165208090494924, + 8026330416180989848, 16052660832361979697, 3210532166472395939, + 6421064332944791878, 12842128665889583757, 2568425733177916751, + 5136851466355833503, 10273702932711667006, 2054740586542333401, + 4109481173084666802, 8218962346169333605, 16437924692338667210, + 3287584938467733442, 6575169876935466884, 13150339753870933768, + 2630067950774186753, 5260135901548373507, 10520271803096747014, + 2104054360619349402, 4208108721238698805, 8416217442477397611, + 16832434884954795223, 3366486976990959044, 6732973953981918089, + 13465947907963836178, 2693189581592767235, 5386379163185534471, + 10772758326371068942, 2154551665274213788, 4309103330548427577, + 8618206661096855154, 17236413322193710308, 3447282664438742061, + 6894565328877484123, 13789130657754968246, 2757826131550993649, + 5515652263101987298, 11031304526203974597, 2206260905240794919, + 4412521810481589838, 8825043620963179677, 17650087241926359355, + 3530017448385271871, 7060034896770543742, 14120069793541087484, + 2824013958708217496, 5648027917416434993, 11296055834832869987, + 2259211166966573997, 4518422333933147995, 9036844667866295990, + 18073689335732591980, 3614737867146518396, 7229475734293036792, + 14458951468586073584, 2891790293717214716, 5783580587434429433, + 11567161174868858867, 2313432234973771773, 4626864469947543547, + 9253728939895087094, 1850745787979017418, 3701491575958034837, + 7402983151916069675, 14805966303832139350, 2961193260766427870, + 5922386521532855740, 11844773043065711480, 2368954608613142296, + 4737909217226284592, 9475818434452569184, 1895163686890513836, + 3790327373781027673, 7580654747562055347, 15161309495124110694, + 3032261899024822138, 6064523798049644277, 12129047596099288555, + 2425809519219857711, 4851619038439715422, 9703238076879430844, + 1940647615375886168, 3881295230751772337, 7762590461503544675, + 15525180923007089351, 3105036184601417870, 6210072369202835740, + 12420144738405671481, 2484028947681134296, 4968057895362268592, + 9936115790724537184, 1987223158144907436, 3974446316289814873, + 7948892632579629747, 15897785265159259495, 3179557053031851899, + 6359114106063703798, 12718228212127407596, 2543645642425481519, + 5087291284850963038, 10174582569701926077, 2034916513940385215, + 4069833027880770430, 8139666055761540861, 16279332111523081723, + 3255866422304616344, 6511732844609232689, 13023465689218465379, + 2604693137843693075, 5209386275687386151, 10418772551374772303, + 2083754510274954460, 4167509020549908921, 8335018041099817842, + 16670036082199635685, 3334007216439927137, 6668014432879854274, + 13336028865759708548, 2667205773151941709, 5334411546303883419, + 10668823092607766838, 2133764618521553367, 4267529237043106735, + 8535058474086213470, 17070116948172426941, 3414023389634485388, + 6828046779268970776, 13656093558537941553, 2731218711707588310, + 5462437423415176621, 10924874846830353242, 2184974969366070648, + 4369949938732141297, 8739899877464282594, 17479799754928565188, + 3495959950985713037, 6991919901971426075, 13983839803942852150, + 2796767960788570430, 5593535921577140860, 11187071843154281720, + 2237414368630856344, 4474828737261712688, 8949657474523425376, + 17899314949046850752, 3579862989809370150, 7159725979618740301, + 14319451959237480602, 2863890391847496120, 5727780783694992240, + 11455561567389984481, 2291112313477996896, 4582224626955993792, + 9164449253911987585, 1832889850782397517, 3665779701564795034, + 7331559403129590068, 14663118806259180136, 2932623761251836027, + 5865247522503672054, 11730495045007344109, 2346099009001468821, + 4692198018002937643, 9384396036005875287, 1876879207201175057, + 3753758414402350114, 7507516828804700229, 15015033657609400459, + 3003006731521880091, 6006013463043760183, 12012026926087520367, + 2402405385217504073, 4804810770435008147, 9609621540870016294, + 1921924308174003258, 3843848616348006517, 7687697232696013035, + 15375394465392026070, 3075078893078405214, 6150157786156810428, + 12300315572313620856, 2460063114462724171, 4920126228925448342, + 9840252457850896685, 1968050491570179337, 3936100983140358674, + 7872201966280717348, 15744403932561434696, 3148880786512286939, + 6297761573024573878, 12595523146049147757, 2519104629209829551, + 5038209258419659102, 10076418516839318205, 2015283703367863641, + 4030567406735727282, 8061134813471454564, 16122269626942909129, + 3224453925388581825, 6448907850777163651, 12897815701554327303, + 2579563140310865460, 5159126280621730921, 10318252561243461842, + 2063650512248692368, 4127301024497384737, 8254602048994769474, + 16509204097989538948, 3301840819597907789, 6603681639195815579, + 13207363278391631158, 2641472655678326231, 5282945311356652463, + 10565890622713304927, 2113178124542660985, 4226356249085321970, + 8452712498170643941, 16905424996341287883, 3381084999268257576, + 6762169998536515153, 13524339997073030306, 2704867999414606061, + 5409735998829212122, 10819471997658424245, 2163894399531684849, + 4327788799063369698, 8655577598126739396, 17311155196253478792, + 3462231039250695758, 6924462078501391516, 13848924157002783033, + 2769784831400556606, 5539569662801113213, 11079139325602226427, + 2215827865120445285, 4431655730240890570, 8863311460481781141, + 17726622920963562283, 3545324584192712456, 7090649168385424913, + 14181298336770849826, 2836259667354169965, 5672519334708339930, + 11345038669416679861, 2269007733883335972, 4538015467766671944, + 9076030935533343889, 18152061871066687778, 3630412374213337555, + 7260824748426675111, 14521649496853350222, 2904329899370670044, + 5808659798741340089, 11617319597482680178, 2323463919496536035, + 4646927838993072071, 9293855677986144142, 1858771135597228828, + 3717542271194457656, 7435084542388915313, 14870169084777830627, + 2974033816955566125, 5948067633911132251, 11896135267822264502, + 2379227053564452900, 4758454107128905800, 9516908214257811601, + 1903381642851562320, 3806763285703124640, 7613526571406249281, + 15227053142812498563, 3045410628562499712, 6090821257124999425, + 12181642514249998850, 2436328502849999770, 4872657005699999540, + 9745314011399999080, 1949062802279999816, 3898125604559999632, + 7796251209119999264, 15592502418239998528, 3118500483647999705, + 6237000967295999411, 12474001934591998822, 2494800386918399764, + 4989600773836799529, 9979201547673599058, 1995840309534719811, + 3991680619069439623, 7983361238138879246, 15966722476277758493, + 3193344495255551698, 6386688990511103397, 12773377981022206794, + 2554675596204441358, 5109351192408882717, 10218702384817765435, + 2043740476963553087, 4087480953927106174, 8174961907854212348, + 16349923815708424697, 3269984763141684939, 6539969526283369878, + 13079939052566739757, 2615987810513347951, 5231975621026695903, + 10463951242053391806, 2092790248410678361, 4185580496821356722, + 8371160993642713444, 16742321987285426889, 3348464397457085377, + 6696928794914170755, 13393857589828341511, 2678771517965668302, + 5357543035931336604, 10715086071862673209, 2143017214372534641, + 4286034428745069283, 8572068857490138567, 17144137714980277135, + 3428827542996055427, 6857655085992110854, 13715310171984221708, + 2743062034396844341, 5486124068793688683, 10972248137587377366, + 2194449627517475473, 4388899255034950946, 8777798510069901893, + 17555597020139803786, 3511119404027960757, 7022238808055921514, + 14044477616111843029, 2808895523222368605, 5617791046444737211, + 11235582092889474423, 2247116418577894884, 4494232837155789769, + 8988465674311579538, 17976931348623159077, 3595386269724631815, + 7190772539449263630, 14381545078898527261, 2876309015779705452, + 5752618031559410904, 11505236063118821809, 2301047212623764361, + 4602094425247528723, 9204188850495057447, 1840837770099011489, + 3681675540198022979, 7363351080396045958, + }; + + static readonly int[] TensExponentTable = { + -323, -323, -322, -322, -322, -322, -321, -321, -321, -320, -320, -320, + -319, -319, -319, -319, -318, -318, -318, -317, -317, -317, -316, -316, + -316, -316, -315, -315, -315, -314, -314, -314, -313, -313, -313, -313, + -312, -312, -312, -311, -311, -311, -310, -310, -310, -310, -309, -309, + -309, -308, -308, -308, -307, -307, -307, -307, -306, -306, -306, -305, + -305, -305, -304, -304, -304, -304, -303, -303, -303, -302, -302, -302, + -301, -301, -301, -301, -300, -300, -300, -299, -299, -299, -298, -298, + -298, -298, -297, -297, -297, -296, -296, -296, -295, -295, -295, -295, + -294, -294, -294, -293, -293, -293, -292, -292, -292, -291, -291, -291, + -291, -290, -290, -290, -289, -289, -289, -288, -288, -288, -288, -287, + -287, -287, -286, -286, -286, -285, -285, -285, -285, -284, -284, -284, + -283, -283, -283, -282, -282, -282, -282, -281, -281, -281, -280, -280, + -280, -279, -279, -279, -279, -278, -278, -278, -277, -277, -277, -276, + -276, -276, -276, -275, -275, -275, -274, -274, -274, -273, -273, -273, + -273, -272, -272, -272, -271, -271, -271, -270, -270, -270, -270, -269, + -269, -269, -268, -268, -268, -267, -267, -267, -267, -266, -266, -266, + -265, -265, -265, -264, -264, -264, -263, -263, -263, -263, -262, -262, + -262, -261, -261, -261, -260, -260, -260, -260, -259, -259, -259, -258, + -258, -258, -257, -257, -257, -257, -256, -256, -256, -255, -255, -255, + -254, -254, -254, -254, -253, -253, -253, -252, -252, -252, -251, -251, + -251, -251, -250, -250, -250, -249, -249, -249, -248, -248, -248, -248, + -247, -247, -247, -246, -246, -246, -245, -245, -245, -245, -244, -244, + -244, -243, -243, -243, -242, -242, -242, -242, -241, -241, -241, -240, + -240, -240, -239, -239, -239, -239, -238, -238, -238, -237, -237, -237, + -236, -236, -236, -235, -235, -235, -235, -234, -234, -234, -233, -233, + -233, -232, -232, -232, -232, -231, -231, -231, -230, -230, -230, -229, + -229, -229, -229, -228, -228, -228, -227, -227, -227, -226, -226, -226, + -226, -225, -225, -225, -224, -224, -224, -223, -223, -223, -223, -222, + -222, -222, -221, -221, -221, -220, -220, -220, -220, -219, -219, -219, + -218, -218, -218, -217, -217, -217, -217, -216, -216, -216, -215, -215, + -215, -214, -214, -214, -214, -213, -213, -213, -212, -212, -212, -211, + -211, -211, -211, -210, -210, -210, -209, -209, -209, -208, -208, -208, + -208, -207, -207, -207, -206, -206, -206, -205, -205, -205, -204, -204, + -204, -204, -203, -203, -203, -202, -202, -202, -201, -201, -201, -201, + -200, -200, -200, -199, -199, -199, -198, -198, -198, -198, -197, -197, + -197, -196, -196, -196, -195, -195, -195, -195, -194, -194, -194, -193, + -193, -193, -192, -192, -192, -192, -191, -191, -191, -190, -190, -190, + -189, -189, -189, -189, -188, -188, -188, -187, -187, -187, -186, -186, + -186, -186, -185, -185, -185, -184, -184, -184, -183, -183, -183, -183, + -182, -182, -182, -181, -181, -181, -180, -180, -180, -180, -179, -179, + -179, -178, -178, -178, -177, -177, -177, -176, -176, -176, -176, -175, + -175, -175, -174, -174, -174, -173, -173, -173, -173, -172, -172, -172, + -171, -171, -171, -170, -170, -170, -170, -169, -169, -169, -168, -168, + -168, -167, -167, -167, -167, -166, -166, -166, -165, -165, -165, -164, + -164, -164, -164, -163, -163, -163, -162, -162, -162, -161, -161, -161, + -161, -160, -160, -160, -159, -159, -159, -158, -158, -158, -158, -157, + -157, -157, -156, -156, -156, -155, -155, -155, -155, -154, -154, -154, + -153, -153, -153, -152, -152, -152, -152, -151, -151, -151, -150, -150, + -150, -149, -149, -149, -149, -148, -148, -148, -147, -147, -147, -146, + -146, -146, -145, -145, -145, -145, -144, -144, -144, -143, -143, -143, + -142, -142, -142, -142, -141, -141, -141, -140, -140, -140, -139, -139, + -139, -139, -138, -138, -138, -137, -137, -137, -136, -136, -136, -136, + -135, -135, -135, -134, -134, -134, -133, -133, -133, -133, -132, -132, + -132, -131, -131, -131, -130, -130, -130, -130, -129, -129, -129, -128, + -128, -128, -127, -127, -127, -127, -126, -126, -126, -125, -125, -125, + -124, -124, -124, -124, -123, -123, -123, -122, -122, -122, -121, -121, + -121, -121, -120, -120, -120, -119, -119, -119, -118, -118, -118, -117, + -117, -117, -117, -116, -116, -116, -115, -115, -115, -114, -114, -114, + -114, -113, -113, -113, -112, -112, -112, -111, -111, -111, -111, -110, + -110, -110, -109, -109, -109, -108, -108, -108, -108, -107, -107, -107, + -106, -106, -106, -105, -105, -105, -105, -104, -104, -104, -103, -103, + -103, -102, -102, -102, -102, -101, -101, -101, -100, -100, -100, -99, + -99, -99, -99, -98, -98, -98, -97, -97, -97, -96, -96, -96, + -96, -95, -95, -95, -94, -94, -94, -93, -93, -93, -93, -92, + -92, -92, -91, -91, -91, -90, -90, -90, -89, -89, -89, -89, + -88, -88, -88, -87, -87, -87, -86, -86, -86, -86, -85, -85, + -85, -84, -84, -84, -83, -83, -83, -83, -82, -82, -82, -81, + -81, -81, -80, -80, -80, -80, -79, -79, -79, -78, -78, -78, + -77, -77, -77, -77, -76, -76, -76, -75, -75, -75, -74, -74, + -74, -74, -73, -73, -73, -72, -72, -72, -71, -71, -71, -71, + -70, -70, -70, -69, -69, -69, -68, -68, -68, -68, -67, -67, + -67, -66, -66, -66, -65, -65, -65, -65, -64, -64, -64, -63, + -63, -63, -62, -62, -62, -62, -61, -61, -61, -60, -60, -60, + -59, -59, -59, -58, -58, -58, -58, -57, -57, -57, -56, -56, + -56, -55, -55, -55, -55, -54, -54, -54, -53, -53, -53, -52, + -52, -52, -52, -51, -51, -51, -50, -50, -50, -49, -49, -49, + -49, -48, -48, -48, -47, -47, -47, -46, -46, -46, -46, -45, + -45, -45, -44, -44, -44, -43, -43, -43, -43, -42, -42, -42, + -41, -41, -41, -40, -40, -40, -40, -39, -39, -39, -38, -38, + -38, -37, -37, -37, -37, -36, -36, -36, -35, -35, -35, -34, + -34, -34, -34, -33, -33, -33, -32, -32, -32, -31, -31, -31, + -30, -30, -30, -30, -29, -29, -29, -28, -28, -28, -27, -27, + -27, -27, -26, -26, -26, -25, -25, -25, -24, -24, -24, -24, + -23, -23, -23, -22, -22, -22, -21, -21, -21, -21, -20, -20, + -20, -19, -19, -19, -18, -18, -18, -18, -17, -17, -17, -16, + -16, -16, -15, -15, -15, -15, -14, -14, -14, -13, -13, -13, + -12, -12, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9, + -9, -9, -8, -8, -8, -7, -7, -7, -6, -6, -6, -6, + -5, -5, -5, -4, -4, -4, -3, -3, -3, -3, -2, -2, + -2, -1, -1, -1, 0, 0, 0, 1, 1, 1, 1, 2, + 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, + 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, + 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, + 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, + 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, + 20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, + 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 27, 27, + 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 31, + 31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, + 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, + 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 41, + 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, + 45, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 49, + 49, 49, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, + 53, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, + 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, + 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, + 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 66, 67, + 67, 67, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, + 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 74, 74, + 74, 75, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, + 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, + 81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 84, 85, + 85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 88, 88, + 89, 89, 89, 90, 90, 90, 91, 91, 91, 91, 92, 92, + 92, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 96, + 96, 96, 97, 97, 97, 97, 98, 98, 98, 99, 99, 99, + 100, 100, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, + 103, 103, 104, 104, 104, 105, 105, 105, 106, 106, 106, 106, + 107, 107, 107, 108, 108, 108, 109, 109, 109, 109, 110, 110, + 110, 111, 111, 111, 112, 112, 112, 112, 113, 113, 113, 114, + 114, 114, 115, 115, 115, 116, 116, 116, 116, 117, 117, 117, + 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 121, 121, + 121, 122, 122, 122, 122, 123, 123, 123, 124, 124, 124, 125, + 125, 125, 125, 126, 126, 126, 127, 127, 127, 128, 128, 128, + 128, 129, 129, 129, 130, 130, 130, 131, 131, 131, 131, 132, + 132, 132, 133, 133, 133, 134, 134, 134, 134, 135, 135, 135, + 136, 136, 136, 137, 137, 137, 137, 138, 138, 138, 139, 139, + 139, 140, 140, 140, 140, 141, 141, 141, 142, 142, 142, 143, + 143, 143, 143, 144, 144, 144, 145, 145, 145, 146, 146, 146, + 147, 147, 147, 147, 148, 148, 148, 149, 149, 149, 150, 150, + 150, 150, 151, 151, 151, 152, 152, 152, 153, 153, 153, 153, + 154, 154, 154, 155, 155, 155, 156, 156, 156, 156, 157, 157, + 157, 158, 158, 158, 159, 159, 159, 159, 160, 160, 160, 161, + 161, 161, 162, 162, 162, 162, 163, 163, 163, 164, 164, 164, + 165, 165, 165, 165, 166, 166, 166, 167, 167, 167, 168, 168, + 168, 168, 169, 169, 169, 170, 170, 170, 171, 171, 171, 171, + 172, 172, 172, 173, 173, 173, 174, 174, 174, 175, 175, 175, + 175, 176, 176, 176, 177, 177, 177, 178, 178, 178, 178, 179, + 179, 179, 180, 180, 180, 181, 181, 181, 181, 182, 182, 182, + 183, 183, 183, 184, 184, 184, 184, 185, 185, 185, 186, 186, + 186, 187, 187, 187, 187, 188, 188, 188, 189, 189, 189, 190, + 190, 190, 190, 191, 191, 191, 192, 192, 192, 193, 193, 193, + 193, 194, 194, 194, 195, 195, 195, 196, 196, 196, 196, 197, + 197, 197, 198, 198, 198, 199, 199, 199, 199, 200, 200, 200, + 201, 201, 201, 202, 202, 202, 202, 203, 203, 203, 204, 204, + 204, 205, 205, 205, 206, 206, 206, 206, 207, 207, 207, 208, + 208, 208, 209, 209, 209, 209, 210, 210, 210, 211, 211, 211, + 212, 212, 212, 212, 213, 213, 213, 214, 214, 214, 215, 215, + 215, 215, 216, 216, 216, 217, 217, 217, 218, 218, 218, 218, + 219, 219, 219, 220, 220, 220, 221, 221, 221, 221, 222, 222, + 222, 223, 223, 223, 224, 224, 224, 224, 225, 225, 225, 226, + 226, 226, 227, 227, 227, 227, 228, 228, 228, 229, 229, 229, + 230, 230, 230, 230, 231, 231, 231, 232, 232, 232, 233, 233, + 233, 234, 234, 234, 234, 235, 235, 235, 236, 236, 236, 237, + 237, 237, 237, 238, 238, 238, 239, 239, 239, 240, 240, 240, + 240, 241, 241, 241, 242, 242, 242, 243, 243, 243, 243, 244, + 244, 244, 245, 245, 245, 246, 246, 246, 246, 247, 247, 247, + 248, 248, 248, 249, 249, 249, 249, 250, 250, 250, 251, 251, + 251, 252, 252, 252, 252, 253, 253, 253, 254, 254, 254, 255, + 255, 255, 255, 256, 256, 256, 257, 257, 257, 258, 258, 258, + 258, 259, 259, 259, 260, 260, 260, 261, 261, 261, 261, 262, + 262, 262, 263, 263, 263, 264, 264, 264, 265, 265, 265, 265, + 266, 266, 266, 267, 267, 267, 268, 268, 268, 268, 269, 269, + 269, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 273, + 273, 273, 274, 274, 274, 274, 275, 275, 275, 276, 276, 276, + 277, 277, 277, 277, 278, 278, 278, 279, 279, 279, 280, 280, + 280, 280, 281, 281, 281, 282, 282, 282, 283, 283, 283, 283, + 284, 284, 284, 285, 285, 285, 286, 286, 286, 286, 287, 287, + 287, 288, 288, 288, 289, 289, 289, 289, 290, 290, 290, 291, + 291, 291, 292, 292, 292, 293, 293, 293, + }; + +#if false + #region Double exponent table construction + + // This code computes the above valus of TensExponentTable & + // MantissaBitsTable. This code is helpful when you try to optimize + // further the double ToString performance. + private const int ExponentMid = 1043; + private const int ExponentMax = 2047; + + // Ensure that values won't cause overflow when multiplied with the double Mantissa. + private const ulong UpperMapMark = UInt64.MaxValue / 2 - (1 << 57); + private const ulong LowerMapMark = UInt64.MaxValue / 5 - (1 << 56); + + // The results of 2 ^ 64 / 5 * i for i in {0 .. 4} + private static ulong[] Div5 = new ulong[] { + 0, + 0x3333333333333333, + 0x6666666666666666, + 0x9999999999999999, + 0xCCCCCCCCCCCCCCCC }; + + static NumberFormatter () + { + InitUpperMap (); + InitLowerMap (); + } + + private static void InitUpperMap () + { + ulong val = 1000000000UL << 32; + int expVal = -9; + ulong loVal = 0; + for (int i = ExponentMid; i <= ExponentMax; i++) { + MantissaBitsTable [i] = val; + TensExponentTable [i] = expVal; + if (val < UpperMapMark) { + val = (val << 1) + (uint)(loVal >> 63); + loVal = (loVal << 1); + } + else { + ulong rem = val % 5; + val /= 5; + ulong rem2 = rem + (loVal % 5); + loVal = loVal / 5 + Div5 [rem]; + if (rem2 >= 5) { + loVal++; + rem2 -= 5; + } + expVal++; + } + } + } + + private static void InitLowerMap () + { + ulong val = 1000000000UL << 32; + int expVal = -9; + ulong loVal = 0; + for (int i = ExponentMid; i >= 0; i--) { + MantissaBitsTable [i] = val; + TensExponentTable [i] = expVal; + if (val < LowerMapMark) { + val *= 5; + for (uint j = 4; j > 0; j--) { + if (loVal > Div5 [j]) { + val += j; + break; + } + } + loVal *= 5; + expVal--; + } + else { + loVal = (((ulong)val & 1) << 63) | (loVal >> 1); + val = val >> 1; + } + } + } + + #endregion Double exponent table construction +#endif + } +} +#endif // !UNSAFE_TABLES diff --git a/mcs/class/corlib/System/String.cs b/mcs/class/corlib/System/String.cs index 7533f40da25..0cd58c4799d 100644 --- a/mcs/class/corlib/System/String.cs +++ b/mcs/class/corlib/System/String.cs @@ -383,13 +383,19 @@ namespace System return tmp; } - private static readonly char[] WhiteChars = { (char) 0x9, (char) 0xA, (char) 0xB, (char) 0xC, (char) 0xD, + private static readonly char[] WhiteChars = { + (char) 0x9, (char) 0xA, (char) 0xB, (char) 0xC, (char) 0xD, #if NET_2_0 (char) 0x85, (char) 0x1680, (char) 0x2028, (char) 0x2029, #endif (char) 0x20, (char) 0xA0, (char) 0x2000, (char) 0x2001, (char) 0x2002, (char) 0x2003, (char) 0x2004, (char) 0x2005, (char) 0x2006, (char) 0x2007, (char) 0x2008, (char) 0x2009, (char) 0x200A, (char) 0x200B, - (char) 0x3000, (char) 0xFEFF }; + (char) 0x3000, (char) 0xFEFF, +#if NET_2_1 + // Silverlight + (char) 0x202f, (char) 0x205f, +#endif + }; public String Trim () { @@ -475,8 +481,13 @@ namespace System } else { if (c != 0xA0 && c != 0xFEFF && c != 0x3000) { -#if NET_2_0 - if (c != 0x85 && c != 0x1680 && c != 0x2028 && c != 0x2029) +#if NET_2_0 || NET_2_1 + if (c != 0x85 && c != 0x1680 && c != 0x2028 && c != 0x2029 +#if NET_2_1 + // On Silverlight this whitespace participates in Trim + && c != 0x202f && c != 0x205f +#endif + ) #endif if (c < 0x2000 || c > 0x200B) return pos; diff --git a/mcs/class/corlib/System/TermInfoDriver.cs b/mcs/class/corlib/System/TermInfoDriver.cs index 04d0b035c88..fb0971afc2f 100644 --- a/mcs/class/corlib/System/TermInfoDriver.cs +++ b/mcs/class/corlib/System/TermInfoDriver.cs @@ -706,6 +706,9 @@ namespace System { unsafe void CheckWindowDimensions () { + if (!inited) + Init (); + if (terminal_size == *native_terminal_size) return; diff --git a/mcs/class/corlib/System/Tuples.cs b/mcs/class/corlib/System/Tuples.cs index bc42c1d174f..47ed26f7600 100644 --- a/mcs/class/corlib/System/Tuples.cs +++ b/mcs/class/corlib/System/Tuples.cs @@ -3,6 +3,7 @@ // // Authors: // Zoltan Varga (vargaz@gmail.com) +// Marek Safar (marek.safar@gmail.com) // // Copyright (C) 2009 Novell // @@ -30,21 +31,14 @@ using System; using System.Collections; +using System.Collections.Generic; namespace System { - public class Tuple : IStructuralEquatable, IStructuralComparable, IComparable + public partial class Tuple { - T1 item1; - T2 item2; - T3 item3; - T4 item4; - T5 item5; - T6 item6; - T7 item7; - TRest rest; - - public Tuple (T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest) { + public Tuple (T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest) + { this.item1 = item1; this.item2 = item2; this.item3 = item3; @@ -65,153 +59,196 @@ namespace System if (!ok) throw new ArgumentException ("The last element of an eight element tuple must be a Tuple."); } + } - public T1 Item1 { - get { - return item1; - } - } + /* The rest is generated by the script at the bottom */ - public T2 Item2 { - get { - return item2; - } - } + [Serializable] + public class Tuple : IStructuralEquatable, IStructuralComparable, IComparable + { + T1 item1; - public T3 Item3 { - get { - return item3; - } + public Tuple (T1 item1) + { + this.item1 = item1; } - public T4 Item4 { - get { - return item4; - } + public T1 Item1 { + get { return item1; } } - public T5 Item5 { - get { - return item5; - } + public int CompareTo (object obj) + { + return CompareTo (obj, Comparer.Default); } - public T6 Item6 { - get { - return item6; - } - } + [MonoTODO] public int CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } - public T7 Item7 { - get { - return item7; - } + public override bool Equals (object obj) + { + return Equals (obj, EqualityComparer.Default); } - public TRest Rest { - get { - return rest; + public bool Equals (object other, IEqualityComparer comparer) + { + var t = other as Tuple; + if (t == null) { + if (other == null) return false; + throw new ArgumentException (); } - } - - int IComparable.CompareTo (object other) { throw new NotImplementedException (); } - int IStructuralComparable.CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } - bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer) { throw new NotImplementedException (); } - int IStructuralEquatable.GetHashCode (IEqualityComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] - public override string ToString () { - // FIXME: Merge the items from rest into the parent - return String.Format ("({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7})", Item1, Item2, Item3, Item4, Item5, Item6, Item7, Rest); + return comparer.Equals (item1, t.item1); } - } - /* The rest is generated by the script at the bottom */ - - public class Tuple : IStructuralEquatable, IStructuralComparable, IComparable - { - T1 item1; - - public Tuple (T1 item1) { - this.item1 = item1; + public override int GetHashCode () + { + return GetHashCode (EqualityComparer.Default); } - public T1 Item1 { - get { - return item1; - } + + public int GetHashCode (IEqualityComparer comparer) + { + return comparer.GetHashCode (item1); } - [MonoTODO] int IComparable.CompareTo (object other) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralEquatable.GetHashCode (IEqualityComparer comparer) { throw new NotImplementedException (); } - public override string ToString () { - return String.Format ("({0})", Item1); + + public override string ToString () + { + return String.Format ("({0})", item1); } } + [Serializable] public class Tuple : IStructuralEquatable, IStructuralComparable, IComparable { T1 item1; T2 item2; - public Tuple (T1 item1, T2 item2) { + public Tuple (T1 item1, T2 item2) + { this.item1 = item1; this.item2 = item2; } + public T1 Item1 { - get { - return item1; - } + get { return item1; } } + public T2 Item2 { - get { - return item2; + get { return item2; } + } + + public int CompareTo (object obj) + { + return CompareTo (obj, Comparer.Default); + } + + [MonoTODO] public int CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } + + public override bool Equals (object obj) + { + return Equals (obj, EqualityComparer.Default); + } + + public bool Equals (object other, IEqualityComparer comparer) + { + var t = other as Tuple; + if (t == null) { + if (other == null) return false; + throw new ArgumentException (); } + + return comparer.Equals (item1, t.item1) && + comparer.Equals (item2, t.item2); + } + + public override int GetHashCode () + { + return GetHashCode (EqualityComparer.Default); + } + + public int GetHashCode (IEqualityComparer comparer) + { + int h = comparer.GetHashCode (item1); + h = (h << 5) - h + comparer.GetHashCode (item2); + return h; } - [MonoTODO] int IComparable.CompareTo (object other) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralEquatable.GetHashCode (IEqualityComparer comparer) { throw new NotImplementedException (); } - public override string ToString () { - return String.Format ("({0}, {1})", Item1, Item2); + + public override string ToString () + { + return String.Format ("({0}, {1})", item1, item2); } } + [Serializable] public class Tuple : IStructuralEquatable, IStructuralComparable, IComparable { T1 item1; T2 item2; T3 item3; - public Tuple (T1 item1, T2 item2, T3 item3) { + public Tuple (T1 item1, T2 item2, T3 item3) + { this.item1 = item1; this.item2 = item2; this.item3 = item3; } + public T1 Item1 { - get { - return item1; - } + get { return item1; } } + public T2 Item2 { - get { - return item2; - } + get { return item2; } } + public T3 Item3 { - get { - return item3; + get { return item3; } + } + + public int CompareTo (object obj) + { + return CompareTo (obj, Comparer.Default); + } + + [MonoTODO] public int CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } + + public override bool Equals (object obj) + { + return Equals (obj, EqualityComparer.Default); + } + + public bool Equals (object other, IEqualityComparer comparer) + { + var t = other as Tuple; + if (t == null) { + if (other == null) return false; + throw new ArgumentException (); } + + return comparer.Equals (item1, t.item1) && + comparer.Equals (item2, t.item2) && + comparer.Equals (item3, t.item3); + } + + public override int GetHashCode () + { + return GetHashCode (EqualityComparer.Default); } - [MonoTODO] int IComparable.CompareTo (object other) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralEquatable.GetHashCode (IEqualityComparer comparer) { throw new NotImplementedException (); } - public override string ToString () { - return String.Format ("({0}, {1}, {2})", Item1, Item2, Item3); + + public int GetHashCode (IEqualityComparer comparer) + { + int h = comparer.GetHashCode (item1); + h = (h << 5) - h + comparer.GetHashCode (item2); + h = (h << 5) - h + comparer.GetHashCode (item3); + return h; + } + + public override string ToString () + { + return String.Format ("({0}, {1}, {2})", item1, item2, item3); } } + [Serializable] public class Tuple : IStructuralEquatable, IStructuralComparable, IComparable { T1 item1; @@ -219,41 +256,77 @@ namespace System T3 item3; T4 item4; - public Tuple (T1 item1, T2 item2, T3 item3, T4 item4) { + public Tuple (T1 item1, T2 item2, T3 item3, T4 item4) + { this.item1 = item1; this.item2 = item2; this.item3 = item3; this.item4 = item4; } + public T1 Item1 { - get { - return item1; - } + get { return item1; } } + public T2 Item2 { - get { - return item2; - } + get { return item2; } } + public T3 Item3 { - get { - return item3; - } + get { return item3; } } + public T4 Item4 { - get { - return item4; + get { return item4; } + } + + public int CompareTo (object obj) + { + return CompareTo (obj, Comparer.Default); + } + + [MonoTODO] public int CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } + + public override bool Equals (object obj) + { + return Equals (obj, EqualityComparer.Default); + } + + public bool Equals (object other, IEqualityComparer comparer) + { + var t = other as Tuple; + if (t == null) { + if (other == null) return false; + throw new ArgumentException (); } + + return comparer.Equals (item1, t.item1) && + comparer.Equals (item2, t.item2) && + comparer.Equals (item3, t.item3) && + comparer.Equals (item4, t.item4); } - [MonoTODO] int IComparable.CompareTo (object other) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralEquatable.GetHashCode (IEqualityComparer comparer) { throw new NotImplementedException (); } - public override string ToString () { - return String.Format ("({0}, {1}, {2}, {3})", Item1, Item2, Item3, Item4); + + public override int GetHashCode () + { + return GetHashCode (EqualityComparer.Default); + } + + public int GetHashCode (IEqualityComparer comparer) + { + int h = comparer.GetHashCode (item1); + h = (h << 5) - h + comparer.GetHashCode (item2); + h = (h << 5) - h + comparer.GetHashCode (item3); + h = (h << 5) - h + comparer.GetHashCode (item4); + return h; + } + + public override string ToString () + { + return String.Format ("({0}, {1}, {2}, {3})", item1, item2, item3, item4); } } + [Serializable] public class Tuple : IStructuralEquatable, IStructuralComparable, IComparable { T1 item1; @@ -262,47 +335,84 @@ namespace System T4 item4; T5 item5; - public Tuple (T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) { + public Tuple (T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) + { this.item1 = item1; this.item2 = item2; this.item3 = item3; this.item4 = item4; this.item5 = item5; } + public T1 Item1 { - get { - return item1; - } + get { return item1; } } + public T2 Item2 { - get { - return item2; - } + get { return item2; } } + public T3 Item3 { - get { - return item3; - } + get { return item3; } } + public T4 Item4 { - get { - return item4; - } + get { return item4; } } + public T5 Item5 { - get { - return item5; + get { return item5; } + } + + public int CompareTo (object obj) + { + return CompareTo (obj, Comparer.Default); + } + + [MonoTODO] public int CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } + + public override bool Equals (object obj) + { + return Equals (obj, EqualityComparer.Default); + } + + public bool Equals (object other, IEqualityComparer comparer) + { + var t = other as Tuple; + if (t == null) { + if (other == null) return false; + throw new ArgumentException (); } + + return comparer.Equals (item1, t.item1) && + comparer.Equals (item2, t.item2) && + comparer.Equals (item3, t.item3) && + comparer.Equals (item4, t.item4) && + comparer.Equals (item5, t.item5); + } + + public override int GetHashCode () + { + return GetHashCode (EqualityComparer.Default); + } + + public int GetHashCode (IEqualityComparer comparer) + { + int h = comparer.GetHashCode (item1); + h = (h << 5) - h + comparer.GetHashCode (item2); + h = (h << 5) - h + comparer.GetHashCode (item3); + h = (h << 5) - h + comparer.GetHashCode (item4); + h = (h << 5) - h + comparer.GetHashCode (item5); + return h; } - [MonoTODO] int IComparable.CompareTo (object other) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralEquatable.GetHashCode (IEqualityComparer comparer) { throw new NotImplementedException (); } - public override string ToString () { - return String.Format ("({0}, {1}, {2}, {3}, {4})", Item1, Item2, Item3, Item4, Item5); + + public override string ToString () + { + return String.Format ("({0}, {1}, {2}, {3}, {4})", item1, item2, item3, item4, item5); } } + [Serializable] public class Tuple : IStructuralEquatable, IStructuralComparable, IComparable { T1 item1; @@ -312,7 +422,8 @@ namespace System T5 item5; T6 item6; - public Tuple (T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6) { + public Tuple (T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6) + { this.item1 = item1; this.item2 = item2; this.item3 = item3; @@ -320,45 +431,82 @@ namespace System this.item5 = item5; this.item6 = item6; } + public T1 Item1 { - get { - return item1; - } + get { return item1; } } + public T2 Item2 { - get { - return item2; - } + get { return item2; } } + public T3 Item3 { - get { - return item3; - } + get { return item3; } } + public T4 Item4 { - get { - return item4; - } + get { return item4; } } + public T5 Item5 { - get { - return item5; - } + get { return item5; } } + public T6 Item6 { - get { - return item6; + get { return item6; } + } + + public int CompareTo (object obj) + { + return CompareTo (obj, Comparer.Default); + } + + [MonoTODO] public int CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } + + public override bool Equals (object obj) + { + return Equals (obj, EqualityComparer.Default); + } + + public bool Equals (object other, IEqualityComparer comparer) + { + var t = other as Tuple; + if (t == null) { + if (other == null) return false; + throw new ArgumentException (); } + + return comparer.Equals (item1, t.item1) && + comparer.Equals (item2, t.item2) && + comparer.Equals (item3, t.item3) && + comparer.Equals (item4, t.item4) && + comparer.Equals (item5, t.item5) && + comparer.Equals (item6, t.item6); + } + + public override int GetHashCode () + { + return GetHashCode (EqualityComparer.Default); + } + + public int GetHashCode (IEqualityComparer comparer) + { + int h = comparer.GetHashCode (item1); + h = (h << 5) - h + comparer.GetHashCode (item2); + h = (h << 5) - h + comparer.GetHashCode (item3); + h = (h << 5) - h + comparer.GetHashCode (item4); + h = (h << 5) - h + comparer.GetHashCode (item5); + h = (h << 5) - h + comparer.GetHashCode (item6); + return h; } - [MonoTODO] int IComparable.CompareTo (object other) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralEquatable.GetHashCode (IEqualityComparer comparer) { throw new NotImplementedException (); } - public override string ToString () { - return String.Format ("({0}, {1}, {2}, {3}, {4}, {5})", Item1, Item2, Item3, Item4, Item5, Item6); + + public override string ToString () + { + return String.Format ("({0}, {1}, {2}, {3}, {4}, {5})", item1, item2, item3, item4, item5, item6); } } + [Serializable] public class Tuple : IStructuralEquatable, IStructuralComparable, IComparable { T1 item1; @@ -369,7 +517,8 @@ namespace System T6 item6; T7 item7; - public Tuple (T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7) { + public Tuple (T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7) + { this.item1 = item1; this.item2 = item2; this.item3 = item3; @@ -378,51 +527,184 @@ namespace System this.item6 = item6; this.item7 = item7; } + public T1 Item1 { - get { - return item1; - } + get { return item1; } } + public T2 Item2 { - get { - return item2; - } + get { return item2; } } + public T3 Item3 { - get { - return item3; - } + get { return item3; } } + public T4 Item4 { - get { - return item4; - } + get { return item4; } } + public T5 Item5 { - get { - return item5; - } + get { return item5; } } + public T6 Item6 { - get { - return item6; - } + get { return item6; } } + public T7 Item7 { - get { - return item7; + get { return item7; } + } + + public int CompareTo (object obj) + { + return CompareTo (obj, Comparer.Default); + } + + [MonoTODO] public int CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } + + public override bool Equals (object obj) + { + return Equals (obj, EqualityComparer.Default); + } + + public bool Equals (object other, IEqualityComparer comparer) + { + var t = other as Tuple; + if (t == null) { + if (other == null) return false; + throw new ArgumentException (); } + + return comparer.Equals (item1, t.item1) && + comparer.Equals (item2, t.item2) && + comparer.Equals (item3, t.item3) && + comparer.Equals (item4, t.item4) && + comparer.Equals (item5, t.item5) && + comparer.Equals (item6, t.item6) && + comparer.Equals (item7, t.item7); } - [MonoTODO] int IComparable.CompareTo (object other) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer) { throw new NotImplementedException (); } - [MonoTODO] int IStructuralEquatable.GetHashCode (IEqualityComparer comparer) { throw new NotImplementedException (); } - public override string ToString () { - return String.Format ("({0}, {1}, {2}, {3}, {4}, {5}, {6})", Item1, Item2, Item3, Item4, Item5, Item6, Item7); + + public override int GetHashCode () + { + return GetHashCode (EqualityComparer.Default); + } + + public int GetHashCode (IEqualityComparer comparer) + { + int h = comparer.GetHashCode (item1); + h = (h << 5) - h + comparer.GetHashCode (item2); + h = (h << 5) - h + comparer.GetHashCode (item3); + h = (h << 5) - h + comparer.GetHashCode (item4); + h = (h << 5) - h + comparer.GetHashCode (item5); + h = (h << 5) - h + comparer.GetHashCode (item6); + h = (h << 5) - h + comparer.GetHashCode (item7); + return h; + } + + public override string ToString () + { + return String.Format ("({0}, {1}, {2}, {3}, {4}, {5}, {6})", item1, item2, item3, item4, item5, item6, item7); } } + [Serializable] + public partial class Tuple : IStructuralEquatable, IStructuralComparable, IComparable + { + T1 item1; + T2 item2; + T3 item3; + T4 item4; + T5 item5; + T6 item6; + T7 item7; + TRest rest; + + public T1 Item1 { + get { return item1; } + } + + public T2 Item2 { + get { return item2; } + } + public T3 Item3 { + get { return item3; } + } + + public T4 Item4 { + get { return item4; } + } + + public T5 Item5 { + get { return item5; } + } + + public T6 Item6 { + get { return item6; } + } + + public T7 Item7 { + get { return item7; } + } + + public TRest Rest { + get { return rest; } + } + + public int CompareTo (object obj) + { + return CompareTo (obj, Comparer.Default); + } + + [MonoTODO] public int CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); } + + public override bool Equals (object obj) + { + return Equals (obj, EqualityComparer.Default); + } + + public bool Equals (object other, IEqualityComparer comparer) + { + var t = other as Tuple; + if (t == null) { + if (other == null) return false; + throw new ArgumentException (); + } + + return comparer.Equals (item1, t.item1) && + comparer.Equals (item2, t.item2) && + comparer.Equals (item3, t.item3) && + comparer.Equals (item4, t.item4) && + comparer.Equals (item5, t.item5) && + comparer.Equals (item6, t.item6) && + comparer.Equals (item7, t.item7) && + comparer.Equals (rest, t.rest); + } + + public override int GetHashCode () + { + return GetHashCode (EqualityComparer.Default); + } + + public int GetHashCode (IEqualityComparer comparer) + { + int h = comparer.GetHashCode (item1); + h = (h << 5) - h + comparer.GetHashCode (item2); + h = (h << 5) - h + comparer.GetHashCode (item3); + h = (h << 5) - h + comparer.GetHashCode (item4); + h = (h << 5) - h + comparer.GetHashCode (item5); + h = (h << 5) - h + comparer.GetHashCode (item6); + h = (h << 5) - h + comparer.GetHashCode (item7); + h = (h << 5) - h + comparer.GetHashCode (rest); + return h; + } + + public override string ToString () + { + return String.Format ("({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7})", item1, item2, item3, item4, item5, item6, item7, rest); + } + } } #endif @@ -434,47 +716,109 @@ namespace System // using System; +using System.Text; public class TupleGen { public static void Main () { - for (int arity = 1; arity < 8; ++arity) { - Console.Write ("\tpublic class Tuple<"); - for (int i = 1; i <= arity; ++i) { - Console.Write (String.Format ("T{0}", i)); - if (i < arity) - Console.Write (", "); - } - Console.WriteLine ("> : IStructuralEquatable, IStructuralComparable, IComparable"); + for (int arity = 1; arity < 9; ++arity) { + string type_name = GetTypeName (arity); + + Console.WriteLine ("\t[Serializable]"); + Console.Write ("\tpublic {0}class ", arity < 8 ? null : "partial "); + Console.Write (type_name); + Console.WriteLine (" : IStructuralEquatable, IStructuralComparable, IComparable"); Console.WriteLine ("\t{"); for (int i = 1; i <= arity; ++i) - Console.WriteLine (String.Format ("\t\tT{0} item{0};", i)); - Console.WriteLine (); - Console.Write ("\t\tpublic Tuple ("); - for (int i = 1; i <= arity; ++i) { - Console.Write (String.Format ("T{0} item{0}", i)); - if (i < arity) - Console.Write (", "); + Console.WriteLine ("\t\t{0} {1};", GetItemTypeName (i), GetItemName (i)); + + if (arity < 8) { + Console.WriteLine (); + Console.Write ("\t\tpublic Tuple ("); + for (int i = 1; i <= arity; ++i) { + Console.Write ("{0} {1}", GetItemTypeName (i), GetItemName (i)); + if (i < arity) + Console.Write (", "); + } + Console.WriteLine (")"); + Console.WriteLine ("\t\t{"); + for (int i = 1; i <= arity; ++i) + Console.WriteLine ("\t\t\t this.{0} = {0};", GetItemName (i)); + Console.WriteLine ("\t\t}"); } - Console.WriteLine (") {"); - for (int i = 1; i <= arity; ++i) - Console.WriteLine (String.Format ("\t\t\t this.item{0} = item{0};", i)); - Console.WriteLine ("\t\t}"); for (int i = 1; i <= arity; ++i) { - Console.WriteLine (String.Format ("\t\tpublic T{0} Item{0} {{", i)); - Console.WriteLine ("\t\t\tget {"); - Console.WriteLine (String.Format ("\t\t\t\treturn item{0};", i)); - Console.WriteLine ("\t\t\t}"); + Console.WriteLine (); + Console.WriteLine ("\t\tpublic {0} {1} {{", GetItemTypeName (i), + System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase (GetItemName (i))); + Console.Write ("\t\t\tget { "); + Console.WriteLine ("return {0}; }}", GetItemName (i)); Console.WriteLine ("\t\t}"); } - Console.WriteLine ("\t\t[MonoTODO] int IComparable.CompareTo (object other) { throw new NotImplementedException (); }"); - Console.WriteLine ("\t\t[MonoTODO] int IStructuralComparable.CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); }"); - Console.WriteLine ("\t\t[MonoTODO] bool IStructuralEquatable.Equals (object other, IEqualityComparer comparer) { throw new NotImplementedException (); }"); - Console.WriteLine ("\t\t[MonoTODO] int IStructuralEquatable.GetHashCode (IEqualityComparer comparer) { throw new NotImplementedException (); }"); + Console.WriteLine (); + Console.WriteLine ("\t\tpublic int CompareTo (object obj)"); + Console.WriteLine ("\t\t{"); + Console.WriteLine ("\t\t\treturn CompareTo (obj, Comparer.Default);"); + Console.WriteLine ("\t\t}"); + + Console.WriteLine (); + Console.WriteLine ("\t\t[MonoTODO] public int CompareTo (object other, IComparer comparer) { throw new NotImplementedException (); }"); + + Console.WriteLine (); + Console.WriteLine ("\t\tpublic override bool Equals (object obj)"); + Console.WriteLine ("\t\t{"); + Console.WriteLine ("\t\t\treturn Equals (obj, EqualityComparer.Default);"); + Console.WriteLine ("\t\t}"); + + Console.WriteLine (); + Console.WriteLine ("\t\tpublic bool Equals (object other, IEqualityComparer comparer)"); + Console.WriteLine ("\t\t{"); + Console.WriteLine ("\t\t\tvar t = other as {0};", type_name); + Console.WriteLine ("\t\t\tif (t == null) {"); + Console.WriteLine ("\t\t\t\tif (other == null) return false;"); + Console.WriteLine ("\t\t\t\tthrow new ArgumentException ();"); + Console.WriteLine ("\t\t\t}"); + Console.WriteLine (); + Console.Write ("\t\t\treturn"); + + for (int i = 1; i <= arity; ++i) { + if (i == 1) + Console.Write (" "); + else + Console.Write ("\t\t\t\t"); + + Console.Write ("comparer.Equals ({0}, t.{0})", GetItemName (i)); + if (i != arity) + Console.WriteLine (" &&"); + else + Console.WriteLine (";"); + } + Console.WriteLine ("\t\t}"); + + Console.WriteLine (); + Console.WriteLine ("\t\tpublic override int GetHashCode ()"); + Console.WriteLine ("\t\t{"); + Console.WriteLine ("\t\t\treturn GetHashCode (EqualityComparer.Default);"); + Console.WriteLine ("\t\t}"); + + Console.WriteLine (); + Console.WriteLine ("\t\tpublic int GetHashCode (IEqualityComparer comparer)"); + Console.WriteLine ("\t\t{"); + if (arity == 1) { + Console.WriteLine ("\t\t\treturn comparer.GetHashCode ({0});", GetItemName (arity)); + } else { + Console.WriteLine ("\t\t\tint h = comparer.GetHashCode ({0});", GetItemName (1)); + for (int i = 2; i <= arity; ++i) + Console.WriteLine ("\t\t\th = (h << 5) - h + comparer.GetHashCode ({0});", GetItemName (i)); + Console.WriteLine ("\t\t\treturn h;"); + } + + Console.WriteLine ("\t\t}"); - Console.WriteLine ("\t\tpublic override string ToString () {"); + Console.WriteLine (); + Console.WriteLine ("\t\tpublic override string ToString ()"); + Console.WriteLine ("\t\t{"); Console.Write ("\t\t\treturn String.Format (\"("); for (int i = 1; i <= arity; ++i) { Console.Write ("{" + (i - 1) + "}"); @@ -483,7 +827,7 @@ public class TupleGen } Console.Write (")\", "); for (int i = 1; i <= arity; ++i) { - Console.Write ("Item" + i); + Console.Write (GetItemName (i)); if (i < arity) Console.Write (", "); } @@ -493,6 +837,30 @@ public class TupleGen Console.WriteLine ("\t}\n"); } } + + static string GetTypeName (int arity) + { + StringBuilder sb = new StringBuilder (); + sb.Append ("Tuple<"); + for (int i = 1; i <= arity; ++i) { + sb.Append (GetItemTypeName (i)); + if (i < arity) + sb.Append (", "); + } + sb.Append (">"); + + return sb.ToString (); + } + + static string GetItemName (int arity) + { + return arity < 8 ? "item" + arity.ToString () : "rest"; + } + + static string GetItemTypeName (int arity) + { + return arity < 8 ? "T" + arity.ToString () : "TRest"; + } } -#endif \ No newline at end of file +#endif diff --git a/mcs/class/corlib/System/Type.cs b/mcs/class/corlib/System/Type.cs index 8e95069417a..3e9bec1ebe6 100644 --- a/mcs/class/corlib/System/Type.cs +++ b/mcs/class/corlib/System/Type.cs @@ -1392,6 +1392,13 @@ namespace System { #endif +#if NET_4_0 + public virtual bool IsEquivalentTo (Type other) + { + return this == other; + } +#endif + /* * Return whenever this object is an instance of a user defined subclass * of System.Type or an instance of TypeDelegator. @@ -1402,7 +1409,8 @@ namespace System { * subclasses cannot modify _impl so if it is zero, it means the * type is not created by the runtime. */ - return _impl.Value == IntPtr.Zero; + return _impl.Value == IntPtr.Zero && + (GetType ().Assembly != typeof (Type).Assembly || GetType () == typeof (TypeDelegator)); } } diff --git a/mcs/class/corlib/Test/Mono.Math/BigIntegerSetTest.cs b/mcs/class/corlib/Test/Mono.Math/BigIntegerSetTest.cs index 989adb7697a..56cec328adb 100644 --- a/mcs/class/corlib/Test/Mono.Math/BigIntegerSetTest.cs +++ b/mcs/class/corlib/Test/Mono.Math/BigIntegerSetTest.cs @@ -22,7 +22,7 @@ namespace MonoTests.Mono.Math { protected void Expect (BigInteger actual, BigInteger expected) { - Assertion.AssertEquals (Name, expected, actual); + Assert.AreEqual (expected, actual, Name); } } } diff --git a/mcs/class/corlib/Test/Mono.Math/ChangeLog b/mcs/class/corlib/Test/Mono.Math/ChangeLog index b8f2e9f21f9..f42a1ba1b55 100644 --- a/mcs/class/corlib/Test/Mono.Math/ChangeLog +++ b/mcs/class/corlib/Test/Mono.Math/ChangeLog @@ -1,3 +1,7 @@ +2009-06-25 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2003-04-22 Sebastien Pouliot * ArithmeticBigTest.cs: New. Unit tests for BigInteger diff --git a/mcs/class/corlib/Test/Mono.Math/SearchGeneratorTest.cs b/mcs/class/corlib/Test/Mono.Math/SearchGeneratorTest.cs index 90b5137504a..63bd25c4fce 100644 --- a/mcs/class/corlib/Test/Mono.Math/SearchGeneratorTest.cs +++ b/mcs/class/corlib/Test/Mono.Math/SearchGeneratorTest.cs @@ -33,7 +33,7 @@ namespace MonoTests.Mono.Math { ContextData ctx = (ContextData)Context; - Assertion.AssertEquals (ctx.bits, bits); + Assert.AreEqual (ctx.bits, bits); uint d = ctx.testData; for (uint i = (uint)bits - 2; d > 0; i--, d >>= 1) @@ -55,10 +55,10 @@ namespace MonoTests.Mono.Math { for (int i = 0; i < 5; i++) { ContextData ctx = new ContextData (128, (uint)r.Next (int.MinValue, int.MaxValue)); BigInteger p = GenerateNewPrime (128, ctx); - Assertion.Assert (p.testBit (1)); + Assert.IsTrue (p.testBit (1)); uint d = ctx.testData; for (uint j = 128 - 2; d > 0; j--, d >>= 1) - Assertion.AssertEquals ((d&1) == 1, p.testBit (j)); + Assert.AreEqual ((d&1) == 1, p.testBit (j)); } } } diff --git a/mcs/class/corlib/Test/System.Collections/ArrayListTest.cs b/mcs/class/corlib/Test/System.Collections/ArrayListTest.cs index 21b2d43f0b3..c47b7d66f06 100644 --- a/mcs/class/corlib/Test/System.Collections/ArrayListTest.cs +++ b/mcs/class/corlib/Test/System.Collections/ArrayListTest.cs @@ -14,14 +14,14 @@ using NUnit.Framework; namespace MonoTests.System.Collections { [TestFixture] - public class ArrayListTest : Assertion + public class ArrayListTest { [Test] public void TestCtor () { { ArrayList al1 = new ArrayList (); - AssertNotNull ("no basic ArrayList", al1); + Assert.IsNotNull (al1, "no basic ArrayList"); } { bool errorThrown = false; @@ -30,24 +30,22 @@ namespace MonoTests.System.Collections } catch (ArgumentNullException) { errorThrown = true; } - Assert ("null icollection error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "null icollection error not thrown"); } { // what can I say? I like chars. [--DB] char [] coll = { 'a', 'b', 'c', 'd' }; ArrayList al1 = new ArrayList (coll); - AssertNotNull ("no icollection ArrayList", al1); + Assert.IsNotNull (al1, "no icollection ArrayList"); for (int i = 0; i < coll.Length; i++) { - AssertEquals (i + " not ctor'ed properly.", - coll [i], al1 [i]); + Assert.AreEqual (coll [i], al1 [i], i + " not ctor'ed properly."); } } { try { Char [,] c1 = new Char [2, 2]; ArrayList al1 = new ArrayList (c1); - Fail ("Should fail with multi-dimensional array in constructor."); + Assert.Fail ("Should fail with multi-dimensional array in constructor."); } catch (RankException) { } } @@ -59,8 +57,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("negative capacity error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "negative capacity error not thrown"); } } @@ -76,22 +73,18 @@ namespace MonoTests.System.Collections #endif for (int i = 1; i < 100; i++) { ArrayList al1 = new ArrayList (i); - AssertEquals ("Bad capacity of " + i, - i, al1.Capacity); + Assert.AreEqual (i, al1.Capacity, "Bad capacity of " + i); } { ArrayList al1 = new ArrayList (0); // LAMESPEC: - // AssertEquals("Bad capacity when set to 0", - // 16, al1.Capacity); + // Assert.AreEqual (// 16, al1.Capacity, "Bad capacity when set to 0"); al1.Add ("?"); - AssertEquals ("Bad capacity when set to 0", - default_capacity, al1.Capacity); + Assert.AreEqual (default_capacity, al1.Capacity, "Bad capacity when set to 0"); } { ArrayList al1 = new ArrayList (); - AssertEquals ("Bad default capacity", - unspecified_capacity, al1.Capacity); + Assert.AreEqual (unspecified_capacity, al1.Capacity, "Bad default capacity"); } } @@ -100,19 +93,16 @@ namespace MonoTests.System.Collections { { ArrayList al1 = new ArrayList (); - AssertEquals ("Bad initial count", - 0, al1.Count); + Assert.AreEqual (0, al1.Count, "Bad initial count"); for (int i = 1; i <= 100; i++) { al1.Add (i); - AssertEquals ("Bad count " + i, - i, al1.Count); + Assert.AreEqual (i, al1.Count, "Bad count " + i); } } for (int i = 0; i < 100; i++) { char [] coll = new Char [i]; ArrayList al1 = new ArrayList (coll); - AssertEquals ("Bad count for " + i, - i, al1.Count); + Assert.AreEqual (i, al1.Count, "Bad count for " + i); } } @@ -120,28 +110,27 @@ namespace MonoTests.System.Collections public void TestIsFixed () { ArrayList al1 = new ArrayList (); - Assert ("should not be fixed by default", !al1.IsFixedSize); + Assert.IsTrue (!al1.IsFixedSize, "should not be fixed by default"); ArrayList al2 = ArrayList.FixedSize (al1); - Assert ("fixed-size wrapper not working", al2.IsFixedSize); + Assert.IsTrue (al2.IsFixedSize, "fixed-size wrapper not working"); } [Test] public void TestIsReadOnly () { ArrayList al1 = new ArrayList (); - Assert ("should not be ReadOnly by default", !al1.IsReadOnly); + Assert.IsTrue (!al1.IsReadOnly, "should not be ReadOnly by default"); ArrayList al2 = ArrayList.ReadOnly (al1); - Assert ("read-only wrapper not working", al2.IsReadOnly); + Assert.IsTrue (al2.IsReadOnly, "read-only wrapper not working"); } [Test] public void TestIsSynchronized () { ArrayList al1 = new ArrayList (); - Assert ("should not be synchronized by default", - !al1.IsSynchronized); + Assert.IsTrue (!al1.IsSynchronized, "should not be synchronized by default"); ArrayList al2 = ArrayList.Synchronized (al1); - Assert ("synchronized wrapper not working", al2.IsSynchronized); + Assert.IsTrue (al2.IsSynchronized, "synchronized wrapper not working"); } [Test] @@ -155,8 +144,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("negative item error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "negative item error not thrown"); } { bool errorThrown = false; @@ -165,15 +153,13 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("past-end item error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "past-end item error not thrown"); } for (int i = 0; i <= 100; i++) { al1.Add (i); } for (int i = 0; i <= 100; i++) { - AssertEquals ("item not fetched for " + i, - i, al1 [i]); + Assert.AreEqual (i, al1 [i], "item not fetched for " + i); } } @@ -187,21 +173,20 @@ namespace MonoTests.System.Collections } catch (ArgumentNullException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 1: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 1: " + e.ToString ()); } - Assert ("null adapter error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "null adapter error not thrown"); } { char [] list = { 'a', 'b', 'c', 'd' }; ArrayList al1 = ArrayList.Adapter (list); - AssertNotNull ("Couldn't get an adapter", al1); + Assert.IsNotNull (al1, "Couldn't get an adapter"); for (int i = 0; i < list.Length; i++) { - AssertEquals ("adapter not adapting", list [i], al1 [i]); + Assert.AreEqual (list [i], al1 [i], "adapter not adapting"); } list [0] = 'z'; for (int i = 0; i < list.Length; i++) { - AssertEquals ("adapter not adapting", list [i], al1 [i]); + Assert.AreEqual (list [i], al1 [i], "adapter not adapting"); } } // Test Binary Search @@ -219,43 +204,38 @@ namespace MonoTests.System.Collections // this is what the docs say it should throw errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 1: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 1: " + e.ToString ()); } - Assert ("search-for-wrong-type error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "search-for-wrong-type error not thrown"); } { char [] arr = { 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd' }; ArrayList al1 = ArrayList.Adapter (arr); - Assert ("couldn't find elem #1", - al1.BinarySearch ('c') >= 3); - Assert ("couldn't find elem #2", - al1.BinarySearch ('c') < 6); + Assert.IsTrue (al1.BinarySearch ('c') >= 3, "couldn't find elem #1"); + Assert.IsTrue (al1.BinarySearch ('c') < 6, "couldn't find elem #2"); } { char [] arr = { 'a', 'b', 'b', 'd', 'd', 'd', 'e', 'e' }; ArrayList al1 = ArrayList.Adapter (arr); - AssertEquals ("couldn't find next-higher elem", - -4, al1.BinarySearch ('c')); + Assert.AreEqual (-4, al1.BinarySearch ('c'), "couldn't find next-higher elem"); } { char [] arr = { 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd' }; ArrayList al1 = ArrayList.Adapter (arr); - AssertEquals ("couldn't find end", - -9, al1.BinarySearch ('e')); + Assert.AreEqual (-9, al1.BinarySearch ('e'), "couldn't find end"); } // Sort { char [] starter = { 'd', 'b', 'f', 'e', 'a', 'c' }; ArrayList al1 = ArrayList.Adapter (starter); al1.Sort (); - AssertEquals ("Should be sorted", 'a', al1 [0]); - AssertEquals ("Should be sorted", 'b', al1 [1]); - AssertEquals ("Should be sorted", 'c', al1 [2]); - AssertEquals ("Should be sorted", 'd', al1 [3]); - AssertEquals ("Should be sorted", 'e', al1 [4]); - AssertEquals ("Should be sorted", 'f', al1 [5]); + Assert.AreEqual ('a', al1 [0], "Should be sorted"); + Assert.AreEqual ('b', al1 [1], "Should be sorted"); + Assert.AreEqual ('c', al1 [2], "Should be sorted"); + Assert.AreEqual ('d', al1 [3], "Should be sorted"); + Assert.AreEqual ('e', al1 [4], "Should be sorted"); + Assert.AreEqual ('f', al1 [5], "Should be sorted"); } // TODO - test other adapter types? @@ -273,10 +253,9 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 1: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 1: " + e.ToString ()); } - Assert ("add to fixed size error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "add to fixed size error not thrown"); } { bool errorThrown = false; @@ -287,19 +266,16 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 2: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 2: " + e.ToString ()); } - Assert ("add to read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "add to read only error not thrown"); } { ArrayList al1 = new ArrayList (); for (int i = 1; i <= 100; i++) { al1.Add (i); - AssertEquals ("add failed " + i, - i, al1.Count); - AssertEquals ("add failed " + i, - i, al1 [i - 1]); + Assert.AreEqual (i, al1.Count, "add failed " + i); + Assert.AreEqual (i, al1 [i - 1], "add failed " + i); } } @@ -308,7 +284,7 @@ namespace MonoTests.System.Collections ArrayList al1 = new ArrayList (strArray); al1.Add ("Hi!"); al1.Add ("Hi!"); - AssertEquals ("add failed", 2, al1.Count); + Assert.AreEqual (2, al1.Count, "add failed"); } } @@ -325,10 +301,9 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 1: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 1: " + e.ToString ()); } - Assert ("add to fixed size error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "add to fixed size error not thrown"); } { bool errorThrown = false; @@ -340,10 +315,9 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 2: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 2: " + e.ToString ()); } - Assert ("add to read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "add to read only error not thrown"); } { bool errorThrown = false; @@ -353,23 +327,19 @@ namespace MonoTests.System.Collections } catch (ArgumentNullException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 3: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 3: " + e.ToString ()); } - Assert ("add to read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "add to read only error not thrown"); } { ArrayList a1 = new ArrayList (); - AssertEquals ("ArrayList should start empty", - 0, a1.Count); + Assert.AreEqual (0, a1.Count, "ArrayList should start empty"); char [] coll = { 'a', 'b', 'c' }; a1.AddRange (coll); - AssertEquals ("ArrayList has wrong elements", - 3, a1.Count); + Assert.AreEqual (3, a1.Count, "ArrayList has wrong elements"); a1.AddRange (coll); - AssertEquals ("ArrayList has wrong elements", - 6, a1.Count); + Assert.AreEqual (6, a1.Count, "ArrayList has wrong elements"); } { @@ -379,8 +349,7 @@ namespace MonoTests.System.Collections list.Add (1); } - AssertEquals ("BinarySearch off-by-one bug", - 49, list.BinarySearch (1)); + Assert.AreEqual (49, list.BinarySearch (1), "BinarySearch off-by-one bug"); } } @@ -401,31 +370,26 @@ namespace MonoTests.System.Collections // this is what the docs say it should throw errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 1: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 1: " + e.ToString ()); } - Assert ("search-for-wrong-type error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "search-for-wrong-type error not thrown"); } { char [] arr = { 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd' }; ArrayList al1 = new ArrayList (arr); - Assert ("couldn't find elem #1", - al1.BinarySearch ('c') >= 3); - Assert ("couldn't find elem #2", - al1.BinarySearch ('c') < 6); + Assert.IsTrue (al1.BinarySearch ('c') >= 3, "couldn't find elem #1"); + Assert.IsTrue (al1.BinarySearch ('c') < 6, "couldn't find elem #2"); } { char [] arr = { 'a', 'b', 'b', 'd', 'd', 'd', 'e', 'e' }; ArrayList al1 = new ArrayList (arr); - AssertEquals ("couldn't find next-higher elem", - -4, al1.BinarySearch ('c')); + Assert.AreEqual (-4, al1.BinarySearch ('c'), "couldn't find next-higher elem"); } { char [] arr = { 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd' }; ArrayList al1 = new ArrayList (arr); - AssertEquals ("couldn't find end", - -9, al1.BinarySearch ('e')); + Assert.AreEqual (-9, al1.BinarySearch ('e'), "couldn't find end"); } } @@ -453,7 +417,7 @@ namespace MonoTests.System.Collections { ArrayList al = new ArrayList (); al.Add (this); - AssertEquals ("null", -1, al.BinarySearch (null)); + Assert.AreEqual (-1, al.BinarySearch (null), "null"); } // TODO - BinarySearch with IComparer @@ -470,8 +434,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("add to fixed size error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "add to fixed size error not thrown"); } { bool errorThrown = false; @@ -482,29 +445,23 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("add to read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "add to read only error not thrown"); } { ArrayList al1 = new ArrayList (); al1.Add ('c'); - AssertEquals ("should have one element", - 1, al1.Count); + Assert.AreEqual (1, al1.Count, "should have one element"); al1.Clear (); - AssertEquals ("should be empty", - 0, al1.Count); + Assert.AreEqual (0, al1.Count, "should be empty"); } { int [] i1 = { 1, 2, 3, 4 }; ArrayList al1 = new ArrayList (i1); - AssertEquals ("should have elements", - i1.Length, al1.Count); + Assert.AreEqual (i1.Length, al1.Count, "should have elements"); int capacity = al1.Capacity; al1.Clear (); - AssertEquals ("should be empty again", - 0, al1.Count); - AssertEquals ("capacity shouldn't have changed", - capacity, al1.Capacity); + Assert.AreEqual (0, al1.Count, "should be empty again"); + Assert.AreEqual (capacity, al1.Capacity, "capacity shouldn't have changed"); } } @@ -515,9 +472,9 @@ namespace MonoTests.System.Collections char [] c1 = { 'a', 'b', 'c' }; ArrayList al1 = new ArrayList (c1); ArrayList al2 = (ArrayList) al1.Clone (); - AssertEquals ("ArrayList match", al1 [0], al2 [0]); - AssertEquals ("ArrayList match", al1 [1], al2 [1]); - AssertEquals ("ArrayList match", al1 [2], al2 [2]); + Assert.AreEqual (al1 [0], al2 [0], "ArrayList match"); + Assert.AreEqual (al1 [1], al2 [1], "ArrayList match"); + Assert.AreEqual (al1 [2], al2 [2], "ArrayList match"); } { char [] d10 = { 'a', 'b' }; @@ -526,12 +483,12 @@ namespace MonoTests.System.Collections char [] [] d1 = { d10, d11, d12 }; ArrayList al1 = new ArrayList (d1); ArrayList al2 = (ArrayList) al1.Clone (); - AssertEquals ("Array match", al1 [0], al2 [0]); - AssertEquals ("Array match", al1 [1], al2 [1]); - AssertEquals ("Array match", al1 [2], al2 [2]); + Assert.AreEqual (al1 [0], al2 [0], "Array match"); + Assert.AreEqual (al1 [1], al2 [1], "Array match"); + Assert.AreEqual (al1 [2], al2 [2], "Array match"); ((char []) al1 [0]) [0] = 'z'; - AssertEquals ("shallow copy", al1 [0], al2 [0]); + Assert.AreEqual (al1 [0], al2 [0], "shallow copy"); } } @@ -540,9 +497,9 @@ namespace MonoTests.System.Collections { char [] c1 = { 'a', 'b', 'c' }; ArrayList al1 = new ArrayList (c1); - Assert ("never find a null", !al1.Contains (null)); - Assert ("can't find value", al1.Contains ('b')); - Assert ("shouldn't find value", !al1.Contains ('?')); + Assert.IsTrue (!al1.Contains (null), "never find a null"); + Assert.IsTrue (al1.Contains ('b'), "can't find value"); + Assert.IsTrue (!al1.Contains ('?'), "shouldn't find value"); } [Test] @@ -557,9 +514,9 @@ namespace MonoTests.System.Collections } catch (ArgumentNullException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 1: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 1: " + e.ToString ()); } - Assert ("error not thrown 1", errorThrown); + Assert.IsTrue (errorThrown, "error not thrown 1"); } { bool errorThrown = false; @@ -571,9 +528,9 @@ namespace MonoTests.System.Collections } catch (ArgumentException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 2: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 2: " + e.ToString ()); } - Assert ("error not thrown 2", errorThrown); + Assert.IsTrue (errorThrown, "error not thrown 2"); } { bool errorThrown = false; @@ -592,9 +549,9 @@ namespace MonoTests.System.Collections } catch (ArgumentException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 3: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 3: " + e.ToString ()); } - Assert ("error not thrown 3", errorThrown); + Assert.IsTrue (errorThrown, "error not thrown 3"); } { bool errorThrown = false; @@ -606,9 +563,9 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 4: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 4: " + e.ToString ()); } - Assert ("error not thrown 4", errorThrown); + Assert.IsTrue (errorThrown, "error not thrown 4"); } { bool errorThrown = false; @@ -620,9 +577,9 @@ namespace MonoTests.System.Collections } catch (ArgumentException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 5: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 5: " + e.ToString ()); } - Assert ("error not thrown 5", errorThrown); + Assert.IsTrue (errorThrown, "error not thrown 5"); } { bool errorThrown = false; @@ -634,9 +591,9 @@ namespace MonoTests.System.Collections } catch (ArgumentException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 6: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 6: " + e.ToString ()); } - Assert ("error not thrown 6", errorThrown); + Assert.IsTrue (errorThrown, "error not thrown 6"); } { bool errorThrown = false; @@ -648,9 +605,9 @@ namespace MonoTests.System.Collections } catch (InvalidCastException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 7: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 7: " + e.ToString ()); } - Assert ("error not thrown 7", errorThrown); + Assert.IsTrue (errorThrown, "error not thrown 7"); } Char [] orig = { 'a', 'b', 'c', 'd' }; @@ -658,16 +615,16 @@ namespace MonoTests.System.Collections Char [] copy = new Char [10]; Array.Clear (copy, 0, copy.Length); al.CopyTo (copy, 3); - AssertEquals ("Wrong CopyTo 0", (char) 0, copy [0]); - AssertEquals ("Wrong CopyTo 1", (char) 0, copy [1]); - AssertEquals ("Wrong CopyTo 2", (char) 0, copy [2]); - AssertEquals ("Wrong CopyTo 3", orig [0], copy [3]); - AssertEquals ("Wrong CopyTo 4", orig [1], copy [4]); - AssertEquals ("Wrong CopyTo 5", orig [2], copy [5]); - AssertEquals ("Wrong CopyTo 6", orig [3], copy [6]); - AssertEquals ("Wrong CopyTo 7", (char) 0, copy [7]); - AssertEquals ("Wrong CopyTo 8", (char) 0, copy [8]); - AssertEquals ("Wrong CopyTo 9", (char) 0, copy [9]); + Assert.AreEqual ((char) 0, copy [0], "Wrong CopyTo 0"); + Assert.AreEqual ((char) 0, copy [1], "Wrong CopyTo 1"); + Assert.AreEqual ((char) 0, copy [2], "Wrong CopyTo 2"); + Assert.AreEqual (orig [0], copy [3], "Wrong CopyTo 3"); + Assert.AreEqual (orig [1], copy [4], "Wrong CopyTo 4"); + Assert.AreEqual (orig [2], copy [5], "Wrong CopyTo 5"); + Assert.AreEqual (orig [3], copy [6], "Wrong CopyTo 6"); + Assert.AreEqual ((char) 0, copy [7], "Wrong CopyTo 7"); + Assert.AreEqual ((char) 0, copy [8], "Wrong CopyTo 8"); + Assert.AreEqual ((char) 0, copy [9], "Wrong CopyTo 9"); } [Test] @@ -707,15 +664,13 @@ namespace MonoTests.System.Collections } catch (ArgumentNullException) { errorThrown = true; } - Assert ("null arg error not thrown", errorThrown); + Assert.IsTrue (errorThrown, "null arg error not thrown"); } { ArrayList al1 = new ArrayList (); - AssertEquals ("arrays start un-fixed.", - false, al1.IsFixedSize); + Assert.AreEqual (false, al1.IsFixedSize, "arrays start un-fixed."); ArrayList al2 = ArrayList.FixedSize (al1); - AssertEquals ("should be fixed.", - true, al2.IsFixedSize); + Assert.AreEqual (true, al2.IsFixedSize, "should be fixed."); } } @@ -729,7 +684,7 @@ namespace MonoTests.System.Collections al1.Add ("something"); try { en.MoveNext (); - Fail ("Add() didn't invalidate the enumerator"); + Assert.Fail ("Add() didn't invalidate the enumerator"); } catch (InvalidOperationException) { // do nothing...this is what we expect } @@ -739,7 +694,7 @@ namespace MonoTests.System.Collections al1.AddRange (al1); try { en.MoveNext (); - Fail ("AddRange() didn't invalidate the enumerator"); + Assert.Fail ("AddRange() didn't invalidate the enumerator"); } catch (InvalidOperationException) { // do nothing...this is what we expect } @@ -749,7 +704,7 @@ namespace MonoTests.System.Collections al1.Clear (); try { en.MoveNext (); - Fail ("Clear() didn't invalidate the enumerator"); + Assert.Fail ("Clear() didn't invalidate the enumerator"); } catch (InvalidOperationException) { // do nothing...this is what we expect } @@ -760,7 +715,7 @@ namespace MonoTests.System.Collections al1.Insert (0, "new first"); try { en.MoveNext (); - Fail ("Insert() didn't invalidate the enumerator"); + Assert.Fail ("Insert() didn't invalidate the enumerator"); } catch (InvalidOperationException) { // do nothing...this is what we expect } @@ -770,7 +725,7 @@ namespace MonoTests.System.Collections al1.InsertRange (0, al1); try { en.MoveNext (); - Fail ("InsertRange() didn't invalidate the enumerator"); + Assert.Fail ("InsertRange() didn't invalidate the enumerator"); } catch (InvalidOperationException) { // do nothing...this is what we expect } @@ -780,7 +735,7 @@ namespace MonoTests.System.Collections al1.Remove ("this"); try { en.MoveNext (); - Fail ("Remove() didn't invalidate the enumerator"); + Assert.Fail ("Remove() didn't invalidate the enumerator"); } catch (InvalidOperationException) { // do nothing...this is what we expect } @@ -790,7 +745,7 @@ namespace MonoTests.System.Collections al1.RemoveAt (2); try { en.MoveNext (); - Fail ("RemoveAt() didn't invalidate the enumerator"); + Assert.Fail ("RemoveAt() didn't invalidate the enumerator"); } catch (InvalidOperationException) { // do nothing...this is what we expect } @@ -800,7 +755,7 @@ namespace MonoTests.System.Collections al1.RemoveRange (1, 1); try { en.MoveNext (); - Fail ("RemoveRange() didn't invalidate the enumerator"); + Assert.Fail ("RemoveRange() didn't invalidate the enumerator"); } catch (InvalidOperationException) { // do nothing...this is what we expect } @@ -810,7 +765,7 @@ namespace MonoTests.System.Collections al1.Reverse (); try { en.MoveNext (); - Fail ("Reverse() didn't invalidate the enumerator"); + Assert.Fail ("Reverse() didn't invalidate the enumerator"); } catch (InvalidOperationException) { // do nothing...this is what we expect } @@ -820,7 +775,7 @@ namespace MonoTests.System.Collections al1.Sort (); try { en.MoveNext (); - Fail ("Sort() didn't invalidate the enumerator"); + Assert.Fail ("Sort() didn't invalidate the enumerator"); } catch (InvalidOperationException) { // do nothing...this is what we expect } @@ -837,8 +792,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("negative index error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "negative index error not thrown"); } { bool errorThrown = false; @@ -848,8 +802,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("negative index error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "negative index error not thrown"); } { bool errorThrown = false; @@ -859,31 +812,28 @@ namespace MonoTests.System.Collections } catch (ArgumentException) { errorThrown = true; } - Assert ("out-of-range index error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "out-of-range index error not thrown"); } { String [] s1 = { "this", "is", "a", "test" }; ArrayList al1 = new ArrayList (s1); IEnumerator en = al1.GetEnumerator (); - AssertNotNull ("No enumerator", en); + Assert.IsNotNull (en, "No enumerator"); for (int i = 0; i < s1.Length; i++) { en.MoveNext (); - AssertEquals ("Not enumerating", - al1 [i], en.Current); + Assert.AreEqual (al1 [i], en.Current, "Not enumerating"); } } { String [] s1 = { "this", "is", "a", "test" }; ArrayList al1 = new ArrayList (s1); IEnumerator en = al1.GetEnumerator (1, 2); - AssertNotNull ("No enumerator", en); + Assert.IsNotNull (en, "No enumerator"); for (int i = 0; i < 2; i++) { en.MoveNext (); - AssertEquals ("Not enumerating", - al1 [i + 1], en.Current); + Assert.AreEqual (al1 [i + 1], en.Current, "Not enumerating"); } } } @@ -917,8 +867,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("negative index error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "negative index error not thrown"); } { bool errorThrown = false; @@ -928,8 +877,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("negative index error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "negative index error not thrown"); } { bool errorThrown = false; @@ -939,17 +887,15 @@ namespace MonoTests.System.Collections } catch (ArgumentException) { errorThrown = true; } - Assert ("out-of-range index error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "out-of-range index error not thrown"); } { char [] chars = { 'a', 'b', 'c', 'd', 'e', 'f' }; ArrayList a = new ArrayList (chars); ArrayList b = a.GetRange (1, 3); - AssertEquals ("GetRange returned wrong size ArrayList", 3, b.Count); + Assert.AreEqual (3, b.Count, "GetRange returned wrong size ArrayList"); for (int i = 0; i < b.Count; i++) { - AssertEquals ("range didn't work", - chars [i + 1], b [i]); + Assert.AreEqual (chars [i + 1], b [i], "range didn't work"); } a [2] = '?'; // should screw up ArrayList b. @@ -959,8 +905,7 @@ namespace MonoTests.System.Collections } catch (InvalidOperationException) { errorThrown = true; } - AssertEquals ("Munging 'a' should mess up 'b'", - true, errorThrown); + Assert.AreEqual (true, errorThrown, "Munging 'a' should mess up 'b'"); } { char [] chars = { 'a', 'b', 'c', 'd', 'e', 'f' }; @@ -969,13 +914,11 @@ namespace MonoTests.System.Collections object [] obj_chars = b.ToArray (); for (int i = 0; i < 3; i++) { char c = (char) obj_chars [i]; - AssertEquals ("range.ToArray didn't work", - chars [i + 3], c); + Assert.AreEqual (chars [i + 3], c, "range.ToArray didn't work"); } char [] new_chars = (char []) b.ToArray (typeof (char)); for (int i = 0; i < 3; i++) { - AssertEquals ("range.ToArray with type didn't work", - chars [i + 3], new_chars [i]); + Assert.AreEqual (chars [i + 3], new_chars [i], "range.ToArray with type didn't work"); } } } @@ -1009,8 +952,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("negative indexof error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "negative indexof error not thrown"); } { bool errorThrown = false; @@ -1020,8 +962,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("past-end indexof error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "past-end indexof error not thrown"); } { bool errorThrown = false; @@ -1031,8 +972,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("negative indexof error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "negative indexof error not thrown"); } { bool errorThrown = false; @@ -1042,8 +982,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("past-end indexof error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "past-end indexof error not thrown"); } { bool errorThrown = false; @@ -1053,28 +992,20 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("past-end indexof error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "past-end indexof error not thrown"); } { char [] c = { 'a', 'b', 'c', 'd', 'e' }; ArrayList a = new ArrayList (c); - AssertEquals ("never find null", - -1, a.IndexOf (null)); - AssertEquals ("never find null", - -1, a.IndexOf (null, 0)); - AssertEquals ("never find null", - -1, a.IndexOf (null, 0, 5)); - AssertEquals ("can't find elem", - 2, a.IndexOf ('c')); - AssertEquals ("can't find elem", - 2, a.IndexOf ('c', 2)); - AssertEquals ("can't find elem", - 2, a.IndexOf ('c', 2, 2)); - AssertEquals ("shouldn't find elem", - -1, a.IndexOf ('c', 3, 2)); - AssertEquals ("shouldn't find", -1, a.IndexOf ('?')); - AssertEquals ("shouldn't find", -1, a.IndexOf (3)); + Assert.AreEqual (-1, a.IndexOf (null), "never find null"); + Assert.AreEqual (-1, a.IndexOf (null, 0), "never find null"); + Assert.AreEqual (-1, a.IndexOf (null, 0, 5), "never find null"); + Assert.AreEqual (2, a.IndexOf ('c'), "can't find elem"); + Assert.AreEqual (2, a.IndexOf ('c', 2), "can't find elem"); + Assert.AreEqual (2, a.IndexOf ('c', 2, 2), "can't find elem"); + Assert.AreEqual (-1, a.IndexOf ('c', 3, 2), "shouldn't find elem"); + Assert.AreEqual (-1, a.IndexOf ('?'), "shouldn't find"); + Assert.AreEqual (-1, a.IndexOf (3), "shouldn't find"); } } @@ -1108,8 +1039,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("insert to fixed size error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "insert to fixed size error not thrown"); } { bool errorThrown = false; @@ -1120,8 +1050,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("insert to read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "insert to read only error not thrown"); } { bool errorThrown = false; @@ -1131,8 +1060,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("insert to read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "insert to read only error not thrown"); } { bool errorThrown = false; @@ -1142,19 +1070,18 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("insert to read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "insert to read only error not thrown"); } { ArrayList al1 = new ArrayList (); - AssertEquals ("arraylist starts empty", 0, al1.Count); + Assert.AreEqual (0, al1.Count, "arraylist starts empty"); al1.Insert (0, 'a'); al1.Insert (1, 'b'); al1.Insert (0, 'c'); - AssertEquals ("arraylist needs stuff", 3, al1.Count); - AssertEquals ("arraylist got stuff", 'c', al1 [0]); - AssertEquals ("arraylist got stuff", 'a', al1 [1]); - AssertEquals ("arraylist got stuff", 'b', al1 [2]); + Assert.AreEqual (3, al1.Count, "arraylist needs stuff"); + Assert.AreEqual ('c', al1 [0], "arraylist got stuff"); + Assert.AreEqual ('a', al1 [1], "arraylist got stuff"); + Assert.AreEqual ('b', al1 [2], "arraylist got stuff"); } } @@ -1171,8 +1098,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("insert to fixed size error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "insert to fixed size error not thrown"); } { bool errorThrown = false; @@ -1184,8 +1110,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("insert to read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "insert to read only error not thrown"); } { bool errorThrown = false; @@ -1196,8 +1121,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("negative index insert error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "negative index insert error not thrown"); } { bool errorThrown = false; @@ -1208,8 +1132,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("out-of-range insert error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "out-of-range insert error not thrown"); } { bool errorThrown = false; @@ -1219,19 +1142,18 @@ namespace MonoTests.System.Collections } catch (ArgumentNullException) { errorThrown = true; } - Assert ("null insert error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "null insert error not thrown"); } { char [] c = { 'a', 'b', 'c' }; ArrayList a = new ArrayList (c); a.InsertRange (1, c); - AssertEquals ("bad insert 1", 'a', a [0]); - AssertEquals ("bad insert 2", 'a', a [1]); - AssertEquals ("bad insert 3", 'b', a [2]); - AssertEquals ("bad insert 4", 'c', a [3]); - AssertEquals ("bad insert 5", 'b', a [4]); - AssertEquals ("bad insert 6", 'c', a [5]); + Assert.AreEqual ('a', a [0], "bad insert 1"); + Assert.AreEqual ('a', a [1], "bad insert 2"); + Assert.AreEqual ('b', a [2], "bad insert 3"); + Assert.AreEqual ('c', a [3], "bad insert 4"); + Assert.AreEqual ('b', a [4], "bad insert 5"); + Assert.AreEqual ('c', a [5], "bad insert 6"); } } @@ -1246,8 +1168,7 @@ namespace MonoTests.System.Collections //} catch (ArgumentOutOfRangeException) { //errorThrown = true; //} - //Assert("first negative lastindexof error not thrown", - //errorThrown); + //Assert.IsTrue (//errorThrown, "first negative lastindexof error not thrown"); //} { bool errorThrown = false; @@ -1257,8 +1178,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("past-end lastindexof error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "past-end lastindexof error not thrown"); } //{ //bool errorThrown = false; @@ -1268,8 +1188,7 @@ namespace MonoTests.System.Collections //} catch (ArgumentOutOfRangeException) { //errorThrown = true; //} - //Assert("second negative lastindexof error not thrown", - //errorThrown); + //Assert.IsTrue (//errorThrown, "second negative lastindexof error not thrown"); //} //{ //bool errorThrown = false; @@ -1279,8 +1198,7 @@ namespace MonoTests.System.Collections //} catch (ArgumentOutOfRangeException) { //errorThrown = true; //} - //Assert("past-end lastindexof error not thrown", - //errorThrown); + //Assert.IsTrue (//errorThrown, "past-end lastindexof error not thrown"); //} //{ //bool errorThrown = false; @@ -1290,39 +1208,31 @@ namespace MonoTests.System.Collections //} catch (ArgumentOutOfRangeException) { //errorThrown = true; //} - //Assert("past-end lastindexof error not thrown", - //errorThrown); + //Assert.IsTrue (//errorThrown, "past-end lastindexof error not thrown"); //} int iTest = 0; try { char [] c = { 'a', 'b', 'c', 'd', 'e' }; ArrayList a = new ArrayList (c); - AssertEquals ("never find null", - -1, a.LastIndexOf (null)); + Assert.AreEqual (-1, a.LastIndexOf (null), "never find null"); iTest++; - AssertEquals ("never find null", - -1, a.LastIndexOf (null, 4)); + Assert.AreEqual (-1, a.LastIndexOf (null, 4), "never find null"); iTest++; - AssertEquals ("never find null", - -1, a.LastIndexOf (null, 4, 5)); + Assert.AreEqual (-1, a.LastIndexOf (null, 4, 5), "never find null"); iTest++; - AssertEquals ("can't find elem", - 2, a.LastIndexOf ('c')); + Assert.AreEqual (2, a.LastIndexOf ('c'), "can't find elem"); iTest++; - AssertEquals ("can't find elem", - 2, a.LastIndexOf ('c', 4)); + Assert.AreEqual (2, a.LastIndexOf ('c', 4), "can't find elem"); iTest++; - AssertEquals ("can't find elem", - 2, a.LastIndexOf ('c', 3, 2)); + Assert.AreEqual (2, a.LastIndexOf ('c', 3, 2), "can't find elem"); iTest++; - AssertEquals ("shouldn't find elem", - -1, a.LastIndexOf ('c', 4, 2)); + Assert.AreEqual (-1, a.LastIndexOf ('c', 4, 2), "shouldn't find elem"); iTest++; - AssertEquals ("shouldn't find", -1, a.LastIndexOf ('?')); + Assert.AreEqual (-1, a.LastIndexOf ('?'), "shouldn't find"); iTest++; - AssertEquals ("shouldn't find", -1, a.LastIndexOf (1)); + Assert.AreEqual (-1, a.LastIndexOf (1), "shouldn't find"); } catch (Exception e) { - Fail ("Unexpected exception caught when iTest=" + iTest + ". e=" + e); + Assert.Fail ("Unexpected exception caught when iTest=" + iTest + ". e=" + e); } } @@ -1354,15 +1264,13 @@ namespace MonoTests.System.Collections } catch (ArgumentNullException) { errorThrown = true; } - Assert ("null arg error not thrown", errorThrown); + Assert.IsTrue (errorThrown, "null arg error not thrown"); } { ArrayList al1 = new ArrayList (); - AssertEquals ("arrays start writeable.", - false, al1.IsReadOnly); + Assert.AreEqual (false, al1.IsReadOnly, "arrays start writeable."); ArrayList al2 = ArrayList.ReadOnly (al1); - AssertEquals ("should be readonly.", - true, al2.IsReadOnly); + Assert.AreEqual (true, al2.IsReadOnly, "should be readonly."); } } @@ -1378,8 +1286,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("remove fixed size error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "remove fixed size error not thrown"); } { bool errorThrown = false; @@ -1390,19 +1297,18 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("remove read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "remove read only error not thrown"); } { char [] c = { 'a', 'b', 'c' }; ArrayList a = new ArrayList (c); a.Remove (1); a.Remove ('?'); - AssertEquals ("should be unchanged", c.Length, a.Count); + Assert.AreEqual (c.Length, a.Count, "should be unchanged"); a.Remove ('a'); - AssertEquals ("should be changed", 2, a.Count); - AssertEquals ("should have shifted", 'b', a [0]); - AssertEquals ("should have shifted", 'c', a [1]); + Assert.AreEqual (2, a.Count, "should be changed"); + Assert.AreEqual ('b', a [0], "should have shifted"); + Assert.AreEqual ('c', a [1], "should have shifted"); } } @@ -1418,8 +1324,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("remove from fixed size error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "remove from fixed size error not thrown"); } { bool errorThrown = false; @@ -1430,8 +1335,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("remove from read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "remove from read only error not thrown"); } { bool errorThrown = false; @@ -1441,8 +1345,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("remove at negative index error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "remove at negative index error not thrown"); } { bool errorThrown = false; @@ -1452,16 +1355,15 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("remove at out-of-range index error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "remove at out-of-range index error not thrown"); } { char [] c = { 'a', 'b', 'c' }; ArrayList a = new ArrayList (c); a.RemoveAt (0); - AssertEquals ("should be changed", 2, a.Count); - AssertEquals ("should have shifted", 'b', a [0]); - AssertEquals ("should have shifted", 'c', a [1]); + Assert.AreEqual (2, a.Count, "should be changed"); + Assert.AreEqual ('b', a [0], "should have shifted"); + Assert.AreEqual ('c', a [1], "should have shifted"); } } @@ -1477,8 +1379,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("removerange from fixed size error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "removerange from fixed size error not thrown"); } { bool errorThrown = false; @@ -1489,8 +1390,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("removerange from read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "removerange from read only error not thrown"); } { bool errorThrown = false; @@ -1500,8 +1400,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("removerange at negative index error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "removerange at negative index error not thrown"); } { bool errorThrown = false; @@ -1511,8 +1410,7 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("removerange at negative index error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "removerange at negative index error not thrown"); } { bool errorThrown = false; @@ -1522,15 +1420,14 @@ namespace MonoTests.System.Collections } catch (ArgumentException) { errorThrown = true; } - Assert ("removerange at bad range error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "removerange at bad range error not thrown"); } { char [] c = { 'a', 'b', 'c' }; ArrayList a = new ArrayList (c); a.RemoveRange (1, 2); - AssertEquals ("should be changed", 1, a.Count); - AssertEquals ("should have shifted", 'a', a [0]); + Assert.AreEqual (1, a.Count, "should be changed"); + Assert.AreEqual ('a', a [0], "should have shifted"); } } @@ -1562,24 +1459,18 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("repeat negative copies error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "repeat negative copies error not thrown"); } { ArrayList al1 = ArrayList.Repeat ("huh?", 0); - AssertEquals ("should be nothing in array", - 0, al1.Count); + Assert.AreEqual (0, al1.Count, "should be nothing in array"); } { ArrayList al1 = ArrayList.Repeat ("huh?", 3); - AssertEquals ("should be something in array", - 3, al1.Count); - AssertEquals ("array elem doesn't check", - "huh?", al1 [0]); - AssertEquals ("array elem doesn't check", - "huh?", al1 [1]); - AssertEquals ("array elem doesn't check", - "huh?", al1 [2]); + Assert.AreEqual (3, al1.Count, "should be something in array"); + Assert.AreEqual ("huh?", al1 [0], "array elem doesn't check"); + Assert.AreEqual ("huh?", al1 [1], "array elem doesn't check"); + Assert.AreEqual ("huh?", al1 [2], "array elem doesn't check"); } } @@ -1595,8 +1486,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("reverse on read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "reverse on read only error not thrown"); } { bool errorThrown = false; @@ -1607,7 +1497,7 @@ namespace MonoTests.System.Collections } catch (ArgumentException) { errorThrown = true; } - Assert ("error not thrown", errorThrown); + Assert.IsTrue (errorThrown, "error not thrown"); } { bool errorThrown = false; @@ -1618,32 +1508,29 @@ namespace MonoTests.System.Collections } catch (ArgumentException) { errorThrown = true; } - Assert ("error not thrown", errorThrown); + Assert.IsTrue (errorThrown, "error not thrown"); } { char [] c = { 'a', 'b', 'c', 'd', 'e' }; ArrayList al1 = new ArrayList (c); al1.Reverse (2, 1); for (int i = 0; i < al1.Count; i++) { - AssertEquals ("Should be no change yet", - c [i], al1 [i]); + Assert.AreEqual (c [i], al1 [i], "Should be no change yet"); } al1.Reverse (); for (int i = 0; i < al1.Count; i++) { - AssertEquals ("Should be reversed", - c [i], al1 [4 - i]); + Assert.AreEqual (c [i], al1 [4 - i], "Should be reversed"); } al1.Reverse (); for (int i = 0; i < al1.Count; i++) { - AssertEquals ("Should be back to normal", - c [i], al1 [i]); + Assert.AreEqual (c [i], al1 [i], "Should be back to normal"); } al1.Reverse (1, 3); - AssertEquals ("Should be back to normal", c [0], al1 [0]); - AssertEquals ("Should be back to normal", c [3], al1 [1]); - AssertEquals ("Should be back to normal", c [2], al1 [2]); - AssertEquals ("Should be back to normal", c [1], al1 [3]); - AssertEquals ("Should be back to normal", c [4], al1 [4]); + Assert.AreEqual (c [0], al1 [0], "Should be back to normal"); + Assert.AreEqual (c [3], al1 [1], "Should be back to normal"); + Assert.AreEqual (c [2], al1 [2], "Should be back to normal"); + Assert.AreEqual (c [1], al1 [3], "Should be back to normal"); + Assert.AreEqual (c [4], al1 [4], "Should be back to normal"); } } @@ -1678,10 +1565,9 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 1: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 1: " + e.ToString ()); } - Assert ("setrange on read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "setrange on read only error not thrown"); } { bool errorThrown = false; @@ -1693,10 +1579,9 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 2: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 2: " + e.ToString ()); } - Assert ("setrange with null error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "setrange with null error not thrown"); } { bool errorThrown = false; @@ -1707,10 +1592,9 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 3: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 3: " + e.ToString ()); } - Assert ("setrange with negative index error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "setrange with negative index error not thrown"); } { bool errorThrown = false; @@ -1721,22 +1605,21 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { errorThrown = true; } catch (Exception e) { - Fail ("Incorrect exception thrown at 4: " + e.ToString ()); + Assert.Fail ("Incorrect exception thrown at 4: " + e.ToString ()); } - Assert ("setrange with too much error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "setrange with too much error not thrown"); } { char [] c = { 'a', 'b', 'c' }; ArrayList al1 = ArrayList.Repeat ('?', 3); - Assert ("no match yet", c [0] != (char) al1 [0]); - Assert ("no match yet", c [1] != (char) al1 [1]); - Assert ("no match yet", c [2] != (char) al1 [2]); + Assert.IsTrue (c [0] != (char) al1 [0], "no match yet"); + Assert.IsTrue (c [1] != (char) al1 [1], "no match yet"); + Assert.IsTrue (c [2] != (char) al1 [2], "no match yet"); al1.SetRange (0, c); - AssertEquals ("should match", c [0], al1 [0]); - AssertEquals ("should match", c [1], al1 [1]); - AssertEquals ("should match", c [2], al1 [2]); + Assert.AreEqual (c [0], al1 [0], "should match"); + Assert.AreEqual (c [1], al1 [1], "should match"); + Assert.AreEqual (c [2], al1 [2], "should match"); } } @@ -1757,7 +1640,7 @@ namespace MonoTests.System.Collections al.InsertRange (2, al); String [] s2 = { "this", "is", "this", "is", "a", "test", "a", "test" }; for (int i = 0; i < al.Count; i++) { - AssertEquals ("at i=" + i, s2 [i], al [i]); + Assert.AreEqual (s2 [i], al [i], "at i=" + i); } } @@ -1773,19 +1656,18 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { errorThrown = true; } - Assert ("sort on read only error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "sort on read only error not thrown"); } { char [] starter = { 'd', 'b', 'f', 'e', 'a', 'c' }; ArrayList al1 = new ArrayList (starter); al1.Sort (); - AssertEquals ("Should be sorted", 'a', al1 [0]); - AssertEquals ("Should be sorted", 'b', al1 [1]); - AssertEquals ("Should be sorted", 'c', al1 [2]); - AssertEquals ("Should be sorted", 'd', al1 [3]); - AssertEquals ("Should be sorted", 'e', al1 [4]); - AssertEquals ("Should be sorted", 'f', al1 [5]); + Assert.AreEqual ('a', al1 [0], "Should be sorted"); + Assert.AreEqual ('b', al1 [1], "Should be sorted"); + Assert.AreEqual ('c', al1 [2], "Should be sorted"); + Assert.AreEqual ('d', al1 [3], "Should be sorted"); + Assert.AreEqual ('e', al1 [4], "Should be sorted"); + Assert.AreEqual ('f', al1 [5], "Should be sorted"); } { ArrayList al1 = new ArrayList (); @@ -1797,12 +1679,12 @@ namespace MonoTests.System.Collections al1.Add (null); al1.Sort (); - AssertEquals ("Should be null", null, al1 [0]); - AssertEquals ("Should be 2. null", null, al1 [1]); - AssertEquals ("Should be 3. null", null, al1 [2]); - AssertEquals ("Should be 4. null", null, al1 [3]); - AssertEquals ("Should be 32", 32, al1 [4]); - AssertEquals ("Should be 33", 33, al1 [5]); + Assert.AreEqual (null, al1 [0], "Should be null"); + Assert.AreEqual (null, al1 [1], "Should be 2. null"); + Assert.AreEqual (null, al1 [2], "Should be 3. null"); + Assert.AreEqual (null, al1 [3], "Should be 4. null"); + Assert.AreEqual (32, al1 [4], "Should be 32"); + Assert.AreEqual (33, al1 [5], "Should be 33"); } } @@ -1839,8 +1721,7 @@ namespace MonoTests.System.Collections } catch (ArgumentNullException) { errorThrown = true; } - Assert ("toarray with null error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "toarray with null error not thrown"); } { bool errorThrown = false; @@ -1852,20 +1733,18 @@ namespace MonoTests.System.Collections } catch (InvalidCastException) { errorThrown = true; } - Assert ("toarray with bad type error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "toarray with bad type error not thrown"); } { char [] c1 = { 'a', 'b', 'c', 'd', 'e' }; ArrayList al1 = new ArrayList (c1); object [] o2 = al1.ToArray (); for (int i = 0; i < c1.Length; i++) { - AssertEquals ("should be copy", c1 [i], o2 [i]); + Assert.AreEqual (c1 [i], o2 [i], "should be copy"); } Array c2 = al1.ToArray (c1 [0].GetType ()); for (int i = 0; i < c1.Length; i++) { - AssertEquals ("should be copy", - c1 [i], c2.GetValue (i)); + Assert.AreEqual (c1 [i], c2.GetValue (i), "should be copy"); } } } @@ -1894,11 +1773,11 @@ namespace MonoTests.System.Collections } al1.RemoveAt (0); al1.TrimToSize (); - AssertEquals ("no capacity match", size - 1, al1.Capacity); + Assert.AreEqual (size - 1, al1.Capacity, "no capacity match"); al1.Clear (); al1.TrimToSize (); - AssertEquals ("no default capacity", capacity, al1.Capacity); + Assert.AreEqual (capacity, al1.Capacity, "no default capacity"); } class Comparer : IComparer @@ -1927,7 +1806,7 @@ namespace MonoTests.System.Collections public void BinarySearch1_EmptyList () { ArrayList list = new ArrayList (); - AssertEquals ("BinarySearch", -1, list.BinarySearch (0)); + Assert.AreEqual (-1, list.BinarySearch (0), "BinarySearch"); } [Test] @@ -1935,9 +1814,9 @@ namespace MonoTests.System.Collections { Comparer comparer = new Comparer (); ArrayList list = new ArrayList (); - AssertEquals ("BinarySearch", -1, list.BinarySearch (0, comparer)); + Assert.AreEqual (-1, list.BinarySearch (0, comparer), "BinarySearch"); // bug 77030 - the comparer isn't called for an empty array/list - Assert ("Called", !comparer.Called); + Assert.IsTrue (!comparer.Called, "Called"); } [Test] @@ -1945,9 +1824,9 @@ namespace MonoTests.System.Collections { Comparer comparer = new Comparer (); ArrayList list = new ArrayList (); - AssertEquals ("BinarySearch", -1, list.BinarySearch (0, 0, 0, comparer)); + Assert.AreEqual (-1, list.BinarySearch (0, 0, 0, comparer), "BinarySearch"); // bug 77030 - the comparer isn't called for an empty array/list - Assert ("Called", !comparer.Called); + Assert.IsTrue (!comparer.Called, "Called"); } [Test] @@ -1957,16 +1836,16 @@ namespace MonoTests.System.Collections public void AddRange_GetRange () { ArrayList source = ArrayList.Adapter (new object [] { "1", "2" }); - AssertEquals ("#1", 2, source.Count); - AssertEquals ("#2", "1", source [0]); - AssertEquals ("#3", "2", source [1]); + Assert.AreEqual (2, source.Count, "#1"); + Assert.AreEqual ("1", source [0], "#2"); + Assert.AreEqual ("2", source [1], "#3"); ArrayList range = source.GetRange (1, 1); - AssertEquals ("#4", 1, range.Count); - AssertEquals ("#5", "2", range [0]); + Assert.AreEqual (1, range.Count, "#4"); + Assert.AreEqual ("2", range [0], "#5"); ArrayList target = new ArrayList (); target.AddRange (range); - AssertEquals ("#6", 1, target.Count); - AssertEquals ("#7", "2", target [0]); + Assert.AreEqual (1, target.Count, "#6"); + Assert.AreEqual ("2", target [0], "#7"); } [Test] @@ -1978,9 +1857,9 @@ namespace MonoTests.System.Collections ArrayList list = new ArrayList (); list.Add (list); IEnumerator enumerator = list.GetEnumerator (); - Assert ("#1", enumerator.MoveNext ()); - Assert ("#2", object.ReferenceEquals (list, enumerator.Current)); - Assert ("#3", !enumerator.MoveNext ()); + Assert.IsTrue (enumerator.MoveNext (), "#1"); + Assert.IsTrue (object.ReferenceEquals (list, enumerator.Current), "#2"); + Assert.IsTrue (!enumerator.MoveNext (), "#3"); } } } diff --git a/mcs/class/corlib/Test/System.Collections/BitArrayTest.cs b/mcs/class/corlib/Test/System.Collections/BitArrayTest.cs index 13794331811..fb3725ac12b 100644 --- a/mcs/class/corlib/Test/System.Collections/BitArrayTest.cs +++ b/mcs/class/corlib/Test/System.Collections/BitArrayTest.cs @@ -10,8 +10,8 @@ using System; namespace MonoTests.System.Collections { - -public class BitArrayTest : TestCase +[TestFixture] +public class BitArrayTest { private BitArray testBa; private bool [] testPattern; @@ -20,12 +20,13 @@ public class BitArrayTest : TestCase private void verifyPattern(BitArray ba, bool[] pattern) { - AssertEquals(ba.Length, pattern.Length); + Assert.AreEqual (ba.Length, pattern.Length); for (int i = 0; i < pattern.Length; i++) - AssertEquals(ba[i], pattern[i]); + Assert.AreEqual (ba[i], pattern[i]); } - protected override void SetUp() + [SetUp] + public void SetUp() { testPattern = new bool[70]; @@ -46,12 +47,14 @@ public class BitArrayTest : TestCase op2 = new BitArray(new int[] { 0x66666666, 0x66666666 }); } + [Test] public void TestBoolConstructor() { BitArray ba = new BitArray(testPattern); verifyPattern(ba, testPattern); } + [Test] public void TestCopyConstructor() { BitArray ba = new BitArray(testBa); @@ -59,55 +62,59 @@ public class BitArrayTest : TestCase verifyPattern(ba, testPattern); } + [Test] public void TestByteConstructor() { byte [] byteArr = new byte[] { 0xaa, 0x55, 0xaa, 0x55, 0x80 }; BitArray ba = new BitArray(byteArr); - AssertEquals("Lengths not equal", ba.Length, byteArr.Length * 8); + Assert.AreEqual (ba.Length, byteArr.Length * 8, "Lengths not equal"); // spot check - Assert("7 not true", ba[7]); - Assert("6 not false", !ba[6]); - Assert("15 not false", !ba[15]); - Assert("14 not true", ba[14]); - Assert("39 not true", ba[39]); - Assert("35 not false", !ba[35]); + Assert.IsTrue (ba[7], "7 not true"); + Assert.IsTrue (!ba[6], "6 not false"); + Assert.IsTrue (!ba[15], "15 not false"); + Assert.IsTrue (ba[14], "14 not true"); + Assert.IsTrue (ba[39], "39 not true"); + Assert.IsTrue (!ba[35], "35 not false"); } + [Test] public void TestIntConstructor() { int [] intArr = new int[] { ~0x55555555, 0x55555551 }; BitArray ba = new BitArray(intArr); - AssertEquals(ba.Length, intArr.Length * 32); + Assert.AreEqual (ba.Length, intArr.Length * 32); // spot check - Assert(ba[31]); - Assert(!ba[30]); - Assert(!ba[63]); - Assert(ba[62]); - Assert(ba[32]); - Assert(!ba[35]); + Assert.IsTrue (ba[31]); + Assert.IsTrue (!ba[30]); + Assert.IsTrue (!ba[63]); + Assert.IsTrue (ba[62]); + Assert.IsTrue (ba[32]); + Assert.IsTrue (!ba[35]); } + [Test] public void TestValConstructor() { BitArray ba = new BitArray(64, false); - AssertEquals(ba.Length, 64); + Assert.AreEqual (ba.Length, 64); foreach (bool b in ba) - Assert(!b); + Assert.IsTrue (!b); ba = new BitArray(64, true); - AssertEquals(ba.Length, 64); + Assert.AreEqual (ba.Length, 64); foreach (bool b in ba) - Assert(b); + Assert.IsTrue (b); } + [Test] public void TestClone() { BitArray ba = (BitArray)testBa.Clone(); @@ -122,12 +129,13 @@ public class BitArrayTest : TestCase verifyPattern(testBa, testPattern); } + [Test] public void TestSetLength() { int origLen = testBa.Length; testBa.Length += 33; - AssertEquals(origLen + 33, testBa.Length); + Assert.AreEqual (origLen + 33, testBa.Length); for (int i = origLen; i < testBa.Length; i++) testBa[i] = true; @@ -135,68 +143,74 @@ public class BitArrayTest : TestCase verifyPattern(testBa, testPattern); } + [Test] public void TestAnd() { BitArray result = op1.And(op2); - AssertEquals(result.Length, op1.Length); + Assert.AreEqual (result.Length, op1.Length); for (int i = 0; i < result.Length; ) { - Assert(!result[i++]); - Assert(result[i++]); - Assert(!result[i++]); - Assert(!result[i++]); + Assert.IsTrue (!result[i++]); + Assert.IsTrue (result[i++]); + Assert.IsTrue (!result[i++]); + Assert.IsTrue (!result[i++]); } } + [Test] public void TestOr() { BitArray result = op1.Or(op2); - AssertEquals(result.Length, op1.Length); + Assert.AreEqual (result.Length, op1.Length); for (int i = 0; i < result.Length; ) { - Assert(result[i++]); - Assert(result[i++]); - Assert(result[i++]); - Assert(!result[i++]); + Assert.IsTrue (result[i++]); + Assert.IsTrue (result[i++]); + Assert.IsTrue (result[i++]); + Assert.IsTrue (!result[i++]); } } + [Test] public void TestNot() { BitArray result = op1.Not(); - AssertEquals(result.Length, op1.Length); + Assert.AreEqual (result.Length, op1.Length); for (int i = 0; i < result.Length; ) { - Assert(!result[i++]); - Assert(!result[i++]); - Assert(result[i++]); - Assert(result[i++]); + Assert.IsTrue (!result[i++]); + Assert.IsTrue (!result[i++]); + Assert.IsTrue (result[i++]); + Assert.IsTrue (result[i++]); } } + [Test] public void TestXor() { BitArray result = op1.Xor(op2); - AssertEquals(result.Length, op1.Length); + Assert.AreEqual (result.Length, op1.Length); for (int i = 0; i < result.Length; ) { - Assert(result[i++]); - Assert(!result[i++]); - Assert(result[i++]); - Assert(!result[i++]); + Assert.IsTrue (result[i++]); + Assert.IsTrue (!result[i++]); + Assert.IsTrue (result[i++]); + Assert.IsTrue (!result[i++]); } } + [Test] public void TestSetAll() { testBa.SetAll(false); foreach(bool b in testBa) - Assert(!b); + Assert.IsTrue (!b); testBa.SetAll(true); foreach(bool b in testBa) - Assert(b); + Assert.IsTrue (b); } + [Test] public void TestCopyToBool() { try { @@ -205,10 +219,10 @@ public class BitArrayTest : TestCase testBa.CopyTo(barray, 5); for (int i = 0; i < testBa.Length; i++) - AssertEquals(testBa[i], barray[i+5]); + Assert.AreEqual (testBa[i], barray[i+5]); } catch(Exception e){ - Fail("Unexpected exception thrown: " + e.ToString()); + Assert.Fail ("Unexpected exception thrown: " + e.ToString()); } } @@ -221,6 +235,7 @@ public class BitArrayTest : TestCase bitarray.CopyTo(intarray, 0); } + [Test] public void TestCopyToByte() { try { @@ -230,7 +245,7 @@ public class BitArrayTest : TestCase testBa.CopyTo(barray, 5); for (int i = 5; i < 9; i++) - AssertEquals(0x55, barray[i] & 0xff); + Assert.AreEqual (0x55, barray[i] & 0xff); // FIXME: MS fails on the next line. This is because // we truncated testBa.Length, and MS's internal array still @@ -238,13 +253,14 @@ public class BitArrayTest : TestCase // whether the "junk" bits (bits past Length, but within Length // rounded up to 32) will be copied as 0, or if those bits are // undefined. - //AssertEquals(0x01, barray[9] & 0xff); + //Assert.AreEqual (0x01, barray[9] & 0xff); } catch(Exception e){ - Fail("Unexpected exception thrown: " + e.ToString()); + Assert.Fail ("Unexpected exception thrown: " + e.ToString()); } } + [Test] public void TestCopyToInt() { try { @@ -253,15 +269,16 @@ public class BitArrayTest : TestCase testBa.CopyTo(iarray, 5); - AssertEquals(0x55555555, iarray[5]); + Assert.AreEqual (0x55555555, iarray[5]); // FIXME: Same thing here as in TestCopyToByte - //AssertEquals(0x01, iarray[6]); + //Assert.AreEqual (0x01, iarray[6]); } catch(Exception e){ - Fail("Unexpected exception thrown: " + e.ToString()); + Assert.Fail ("Unexpected exception thrown: " + e.ToString()); } } + [Test] public void TestEnumerator() { @@ -269,29 +286,29 @@ public class BitArrayTest : TestCase IEnumerator e = testBa.GetEnumerator(); for (int i = 0; e.MoveNext(); i++) - AssertEquals(e.Current, testPattern[i]); + Assert.AreEqual (e.Current, testPattern[i]); - Assert(!e.MoveNext()); + Assert.IsTrue (!e.MoveNext()); // read, to make sure reading isn't considered a write. bool b = testBa[0]; e.Reset(); for (int i = 0; e.MoveNext(); i++) - AssertEquals(e.Current, testPattern[i]); + Assert.AreEqual (e.Current, testPattern[i]); try { e.Reset(); testBa[0] = !testBa[0]; e.MoveNext(); - Fail("IEnumerator.MoveNext() should throw when collection modified."); + Assert.Fail ("IEnumerator.MoveNext() should throw when collection modified."); } catch (InvalidOperationException) { } } catch(Exception ex){ - Fail("Unexpected exception thrown: " + ex.ToString()); + Assert.Fail ("Unexpected exception thrown: " + ex.ToString()); } } } diff --git a/mcs/class/corlib/Test/System.Collections/ChangeLog b/mcs/class/corlib/Test/System.Collections/ChangeLog index bde60812181..982c6e86d58 100644 --- a/mcs/class/corlib/Test/System.Collections/ChangeLog +++ b/mcs/class/corlib/Test/System.Collections/ChangeLog @@ -1,3 +1,24 @@ +2009-06-30 Zoltan Varga + + * ReadOnlyCollectionBaseTest.cs NewArrayListTest.cs: Convert all tests + to new-style nunit classes/methods. + +2009-06-26 Robert Jordan + + * BitArrayTest.cs: Upgrade to new NUnit style. Enable + 16 tests that were disabled after the NUnit 2.4 update. + +2009-06-24 Robert Jordan + + * ArrayListTest.cs, CollectionBaseTest.cs, DictionaryEntryTest.cs, + HashtableTest.cs: Convert all tests to new-style nunit methods. + + * QueueTest.cs: likewise. Conversion revealed 25 test that were + disabled after the NUnit 2.4 update. + + * StackTest.cs: likewise. Conversion revealed 24 test that were + disabled after the NUnit 2.4 update. + 2008-08-31 Zoltan Varga * BitArrayTest.cs: Add a test for #421803. diff --git a/mcs/class/corlib/Test/System.Collections/CollectionBaseTest.cs b/mcs/class/corlib/Test/System.Collections/CollectionBaseTest.cs index 5bace30b59e..c2633a1001d 100644 --- a/mcs/class/corlib/Test/System.Collections/CollectionBaseTest.cs +++ b/mcs/class/corlib/Test/System.Collections/CollectionBaseTest.cs @@ -19,7 +19,7 @@ namespace MonoTests.System.Collections { [TestFixture] -public class CollectionBaseTest : Assertion +public class CollectionBaseTest { // We need a concrete class to test the abstract base class public class ConcreteCollection : CollectionBase @@ -162,7 +162,7 @@ public class CollectionBaseTest : Assertion public void Count() { ConcreteCollection myCollection; myCollection = new ConcreteCollection(4); - Assert(4 == myCollection.Count); + Assert.IsTrue (4 == myCollection.Count); } // Make sure GetEnumerator returns an object @@ -170,7 +170,7 @@ public class CollectionBaseTest : Assertion public void GetEnumerator() { ConcreteCollection myCollection; myCollection = new ConcreteCollection(4); - Assert(null != myCollection.GetEnumerator()); + Assert.IsTrue (null != myCollection.GetEnumerator()); } // OnValid disallows nulls @@ -189,15 +189,15 @@ public class CollectionBaseTest : Assertion numberOfItems = 3; // The constructor inserts myCollection = new ConcreteCollection(numberOfItems); - Assert(myCollection.onInsertFired); - Assert(myCollection.onInsertCompleteFired); + Assert.IsTrue (myCollection.onInsertFired); + Assert.IsTrue (myCollection.onInsertCompleteFired); // Using the IList interface, check inserts in the middle IList listObj = myCollection; listObj.Insert(1, 9); - Assert(myCollection.onInsertIndex == 1); - Assert(myCollection.onInsertCompleteIndex == 1); - Assert(myCollection.PeekAt(1) == 9); + Assert.IsTrue (myCollection.onInsertIndex == 1); + Assert.IsTrue (myCollection.onInsertCompleteIndex == 1); + Assert.IsTrue (myCollection.PeekAt(1) == 9); } // Test Clear and it's hooks @@ -209,9 +209,9 @@ public class CollectionBaseTest : Assertion numberOfItems = 1; myCollection = new ConcreteCollection(numberOfItems); myCollection.Clear(); - Assert(myCollection.Count == 0); - Assert(myCollection.onClearFired); - Assert(myCollection.onClearCompleteFired); + Assert.IsTrue (myCollection.Count == 0); + Assert.IsTrue (myCollection.onClearFired); + Assert.IsTrue (myCollection.onClearCompleteFired); } // Test RemoveAt, other removes and the hooks @@ -228,16 +228,16 @@ public class CollectionBaseTest : Assertion myCollection.RemoveAt(1); // We should see the original third one in it's place - Assert(myCollection.PeekAt(1) == 2); - Assert(myCollection.onRemoveFired); - Assert(myCollection.onRemoveIndex == 1); - Assert(myCollection.onRemoveCompleteFired); - Assert(myCollection.onRemoveCompleteIndex == 1); + Assert.IsTrue (myCollection.PeekAt(1) == 2); + Assert.IsTrue (myCollection.onRemoveFired); + Assert.IsTrue (myCollection.onRemoveIndex == 1); + Assert.IsTrue (myCollection.onRemoveCompleteFired); + Assert.IsTrue (myCollection.onRemoveCompleteIndex == 1); IList listObj = myCollection; listObj.Remove(0); // Confirm parameters are being passed to the hooks - Assert(myCollection.onRemoveIndex == 0); - Assert(myCollection.onRemoveCompleteIndex == 0); + Assert.IsTrue (myCollection.onRemoveIndex == 0); + Assert.IsTrue (myCollection.onRemoveCompleteIndex == 0); } // Test the random access feature @@ -250,13 +250,13 @@ public class CollectionBaseTest : Assertion myCollection = new ConcreteCollection(numberOfItems); IList listObj = myCollection; listObj[0] = 99; - Assert((int) listObj[0] == 99); - Assert(myCollection.onSetFired); - Assert(myCollection.onSetCompleteFired); - Assert(myCollection.onSetOldValue == 0); - Assert(myCollection.onSetCompleteOldValue == 0); - Assert(myCollection.onSetNewValue == 99); - Assert(myCollection.onSetCompleteNewValue == 99); + Assert.IsTrue ((int) listObj[0] == 99); + Assert.IsTrue (myCollection.onSetFired); + Assert.IsTrue (myCollection.onSetCompleteFired); + Assert.IsTrue (myCollection.onSetOldValue == 0); + Assert.IsTrue (myCollection.onSetCompleteOldValue == 0); + Assert.IsTrue (myCollection.onSetNewValue == 99); + Assert.IsTrue (myCollection.onSetCompleteNewValue == 99); } [Test] @@ -269,7 +269,7 @@ public class CollectionBaseTest : Assertion coll.BaseList.Add (0); } catch { } - AssertEquals (0, coll.Count); + Assert.AreEqual (0, coll.Count); } [Test] @@ -284,7 +284,7 @@ public class CollectionBaseTest : Assertion } catch (ArgumentOutOfRangeException) { throw; } finally { - AssertEquals (false, coll.onValidateFired); + Assert.AreEqual (false, coll.onValidateFired); } } @@ -299,7 +299,7 @@ public class CollectionBaseTest : Assertion coll.BaseList [0] = 11; } catch { } finally { - AssertEquals (false, coll.onSetCompleteFired); + Assert.AreEqual (false, coll.onSetCompleteFired); } } @@ -320,11 +320,11 @@ public class CollectionBaseTest : Assertion throwsException = false; } catch { } finally { - Assert (throwsException); - Assert (coll.onValidateFired); - Assert (coll.onSetFired); - Assert (coll.onSetCompleteFired); - AssertEquals (88, coll.BaseList [0]); + Assert.IsTrue (throwsException); + Assert.IsTrue (coll.onValidateFired); + Assert.IsTrue (coll.onSetFired); + Assert.IsTrue (coll.onSetCompleteFired); + Assert.AreEqual (88, coll.BaseList [0]); } } diff --git a/mcs/class/corlib/Test/System.Collections/DictionaryEntryTest.cs b/mcs/class/corlib/Test/System.Collections/DictionaryEntryTest.cs index c90ff5de8df..480e6c06ced 100644 --- a/mcs/class/corlib/Test/System.Collections/DictionaryEntryTest.cs +++ b/mcs/class/corlib/Test/System.Collections/DictionaryEntryTest.cs @@ -7,28 +7,28 @@ using NUnit.Framework; namespace MonoTests.System.Collections { [TestFixture] - public class DictionaryEntryTest : Assertion { + public class DictionaryEntryTest { [Test] public void Ctor () { DictionaryEntry d = new DictionaryEntry (1, "something"); - AssertNotNull (d); - AssertEquals ("#01", d.Key, 1); - AssertEquals ("#02", d.Value, "something"); + Assert.IsNotNull (d); + Assert.AreEqual (1, d.Key, "#01"); + Assert.AreEqual ("something", d.Value, "#02"); } [Test] public void Key () { DictionaryEntry d = new DictionaryEntry (1, "something"); d.Key = 77.77; - AssertEquals ("#03", d.Key, 77.77); + Assert.AreEqual (77.77, d.Key, "#03"); } [Test] public void Value () { DictionaryEntry d = new DictionaryEntry (1, "something"); d.Value = 'p'; - AssertEquals ("#04", d.Value, 'p'); + Assert.AreEqual ('p', d.Value, "#04"); } [Test] diff --git a/mcs/class/corlib/Test/System.Collections/HashtableTest.cs b/mcs/class/corlib/Test/System.Collections/HashtableTest.cs index a20b63876df..109bcbf84d4 100644 --- a/mcs/class/corlib/Test/System.Collections/HashtableTest.cs +++ b/mcs/class/corlib/Test/System.Collections/HashtableTest.cs @@ -23,12 +23,12 @@ namespace MonoTests.System.Collections { /// Hashtable test. [TestFixture] -public class HashtableTest : Assertion { +public class HashtableTest { [Test] public void TestCtor1() { Hashtable h = new Hashtable(); - AssertNotNull("No hash table", h); + Assert.IsNotNull (h, "No hash table"); } [Test] @@ -40,8 +40,7 @@ public class HashtableTest : Assertion { } catch (ArgumentNullException) { errorThrown = true; } - Assert("null hashtable error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "null hashtable error not thrown"); } { string[] keys = {"this", "is", "a", "test"}; @@ -52,8 +51,7 @@ public class HashtableTest : Assertion { } Hashtable h2 = new Hashtable(h1); for (int i = 0; i < keys.Length; i++) { - AssertEquals("No match for key " + keys[i], - values[i], h2[keys[i]]); + Assert.AreEqual (values[i], h2[keys[i]], "No match for key " + keys[i]); } } } @@ -79,29 +77,29 @@ public class HashtableTest : Assertion { // tests if negative capacity throws exception try { Hashtable ht = new Hashtable (-10, 0.1f, null, null); - Assert("must throw ArgumentOutOfRange exception, param: capacity", false); + Assert.Fail ("must throw ArgumentOutOfRange exception, param: capacity"); } catch (ArgumentOutOfRangeException e) { - Assert("ParamName is not capacity", e.ParamName == "capacity"); + Assert.IsTrue (e.ParamName == "capacity", "ParamName is not capacity"); } // tests if loadFactor out of range throws exception (low) try { Hashtable ht = new Hashtable (100, 0.01f, null, null); - Assert("must throw ArgumentOutOfRange exception, param: loadFactor, too low value", false); + Assert.Fail ("must throw ArgumentOutOfRange exception, param: loadFactor, too low value"); } catch (ArgumentOutOfRangeException e) { - Assert("ParamName is not loadFactor",e.ParamName == "loadFactor"); + Assert.IsTrue (e.ParamName == "loadFactor", "ParamName is not loadFactor"); } // tests if loadFactor out of range throws exception (high) try { Hashtable ht = new Hashtable (100, 2f, null, null); - Assert("must throw ArgumentOutOfRange exception, param: loadFactor, too high value", false); + Assert.Fail ("must throw ArgumentOutOfRange exception, param: loadFactor, too high value"); } catch (ArgumentOutOfRangeException e) { - Assert("ParamName is not loadFactor", e.ParamName == "loadFactor"); + Assert.IsTrue (e.ParamName == "loadFactor", "ParamName is not loadFactor"); } } @@ -112,32 +110,28 @@ public class HashtableTest : Assertion { [Test] public void TestCount() { Hashtable h = new Hashtable(); - AssertEquals("new table - count zero", 0, h.Count); + Assert.AreEqual (0, h.Count, "new table - count zero"); int max = 100; for (int i = 1; i <= max; i++) { h[i] = i; - AssertEquals("Count wrong for " + i, - i, h.Count); + Assert.AreEqual (i, h.Count, "Count wrong for " + i); } for (int i = 1; i <= max; i++) { h[i] = i * 2; - AssertEquals("Count shouldn't change at " + i, - max, h.Count); + Assert.AreEqual (max, h.Count, "Count shouldn't change at " + i); } } [Test] public void TestIsFixedSize() { Hashtable h = new Hashtable(); - AssertEquals("hashtable not fixed by default", - false, h.IsFixedSize); + Assert.AreEqual (false, h.IsFixedSize, "hashtable not fixed by default"); // TODO - any way to get a fixed-size hashtable? } public void TestIsReadOnly() { Hashtable h = new Hashtable(); - AssertEquals("hashtable not read-only by default", - false, h.IsReadOnly); + Assert.AreEqual (false, h.IsReadOnly, "hashtable not read-only by default"); // TODO - any way to get a read-only hashtable? } @@ -145,13 +139,13 @@ public class HashtableTest : Assertion { public void TestIsSynchronized () { Hashtable h = new Hashtable (); - Assert ("hashtable not synched by default", !h.IsSynchronized); + Assert.IsTrue (!h.IsSynchronized, "hashtable not synched by default"); Hashtable h2 = Hashtable.Synchronized (h); - Assert ("hashtable should by synched", h2.IsSynchronized); + Assert.IsTrue (h2.IsSynchronized, "hashtable should by synched"); Hashtable h3 = (Hashtable) h2.Clone (); - Assert ("Cloned Hashtable should by synched", h3.IsSynchronized); + Assert.IsTrue (h3.IsSynchronized, "Cloned Hashtable should by synched"); } [Test] @@ -163,10 +157,9 @@ public class HashtableTest : Assertion { Object o = h[null]; } catch (ArgumentNullException e) { errorThrown = true; - AssertEquals("ParamName is not \"key\"", "key", e.ParamName); + Assert.AreEqual ("key", e.ParamName, "ParamName is not \"key\""); } - Assert("null hashtable error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "null hashtable error not thrown"); } // TODO - if read-only and/or fixed-size is possible, // test 'NotSupportedException' here @@ -176,8 +169,7 @@ public class HashtableTest : Assertion { int max = 100; for (int i = 1; i <= max; i++) { h[i] = i; - AssertEquals("value wrong for " + i, - i, h[i]); + Assert.AreEqual (i, h[i], "value wrong for " + i); } } } @@ -193,27 +185,23 @@ public class HashtableTest : Assertion { for (int i = 0; i < keys.Length; i++) { h1[keys[i]] = values1[i]; } - AssertEquals("keys wrong size", - keys.Length, h1.Keys.Count); + Assert.AreEqual (keys.Length, h1.Keys.Count, "keys wrong size"); for (int i = 0; i < keys.Length; i++) { h1[keys[i]] = values2[i]; } - AssertEquals("keys wrong size 2", - keys.Length, h1.Keys.Count); + Assert.AreEqual (keys.Length, h1.Keys.Count, "keys wrong size 2"); // MS .NET Always returns the same reference when calling Keys property keysReference = h1.Keys; keysReference2 = h1.Keys; - AssertEquals("keys references differ", keysReference, keysReference2); + Assert.AreEqual (keysReference, keysReference2, "keys references differ"); for (int i = 0; i < keys2.Length; i++) { h1[keys2[i]] = values2[i]; } - AssertEquals("keys wrong size 3", - keys.Length+keys2.Length, h1.Keys.Count); - AssertEquals("keys wrong size 4", - keys.Length+keys2.Length, keysReference.Count); + Assert.AreEqual (keys.Length+keys2.Length, h1.Keys.Count, "keys wrong size 3"); + Assert.AreEqual (keys.Length+keys2.Length, keysReference.Count, "keys wrong size 4"); } // TODO - SyncRoot @@ -226,18 +214,16 @@ public class HashtableTest : Assertion { for (int i = 0; i < keys.Length; i++) { h1[keys[i]] = values1[i]; } - AssertEquals("values wrong size", - keys.Length, h1.Values.Count); + Assert.AreEqual (keys.Length, h1.Values.Count, "values wrong size"); for (int i = 0; i < keys.Length; i++) { h1[keys[i]] = values2[i]; } - AssertEquals("values wrong size 2", - keys.Length, h1.Values.Count); + Assert.AreEqual (keys.Length, h1.Values.Count, "values wrong size 2"); // MS .NET Always returns the same reference when calling Values property ICollection valuesReference1 = h1.Values; ICollection valuesReference2 = h1.Values; - AssertEquals("values references differ", valuesReference1, valuesReference2); + Assert.AreEqual (valuesReference1, valuesReference2, "values references differ"); } [Test] @@ -249,10 +235,9 @@ public class HashtableTest : Assertion { h.Add(null, "huh?"); } catch (ArgumentNullException e) { errorThrown = true; - AssertEquals("ParamName is not 'key'", "key", e.ParamName); + Assert.AreEqual ("key", e.ParamName, "ParamName is not 'key'"); } - Assert("null add error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "null add error not thrown"); } { bool errorThrown = false; @@ -263,8 +248,7 @@ public class HashtableTest : Assertion { } catch (ArgumentException) { errorThrown = true; } - Assert("re-add error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "re-add error not thrown"); } // TODO - hit NotSupportedException { @@ -272,8 +256,7 @@ public class HashtableTest : Assertion { int max = 100; for (int i = 1; i <= max; i++) { h.Add(i, i); - AssertEquals("value wrong for " + i, - i, h[i]); + Assert.AreEqual (i, h[i], "value wrong for " + i); } } } @@ -282,15 +265,14 @@ public class HashtableTest : Assertion { public void TestClear() { // TODO - hit NotSupportedException Hashtable h = new Hashtable(); - AssertEquals("new table - count zero", 0, h.Count); + Assert.AreEqual (0, h.Count, "new table - count zero"); int max = 100; for (int i = 1; i <= max; i++) { h[i] = i; } - Assert("table don't gots stuff", h.Count > 0); + Assert.IsTrue (h.Count > 0, "table don't gots stuff"); h.Clear(); - AssertEquals("Table should be cleared", - 0, h.Count); + Assert.AreEqual (0, h.Count, "Table should be cleared"); } #if NET_2_0 @@ -316,11 +298,10 @@ public class HashtableTest : Assertion { h1[c1[i]] = c2[i]; } Hashtable h2 = (Hashtable)h1.Clone(); - AssertNotNull("got no clone!", h2); - AssertNotNull("clone's got nothing!", h2[c1[0]]); + Assert.IsNotNull (h2, "got no clone!"); + Assert.IsNotNull (h2[c1[0]], "clone's got nothing!"); for (int i = 0; i < c1.Length; i++) { - AssertEquals("Hashtable match", - h1[c1[i]], h2[c1[i]]); + Assert.AreEqual (h1[c1[i]], h2[c1[i]], "Hashtable match"); } } { @@ -334,15 +315,14 @@ public class HashtableTest : Assertion { h1[c1[i]] = c2[i]; } Hashtable h2 = (Hashtable)h1.Clone(); - AssertNotNull("got no clone!", h2); - AssertNotNull("clone's got nothing!", h2[c1[0]]); + Assert.IsNotNull (h2, "got no clone!"); + Assert.IsNotNull (h2[c1[0]], "clone's got nothing!"); for (int i = 0; i < c1.Length; i++) { - AssertEquals("Hashtable match", - h1[c1[i]], h2[c1[i]]); + Assert.AreEqual (h1[c1[i]], h2[c1[i]], "Hashtable match"); } ((char[])h1[c1[0]])[0] = 'z'; - AssertEquals("shallow copy", h1[c1[0]], h2[c1[0]]); + Assert.AreEqual (h1[c1[0]], h2[c1[0]], "shallow copy"); #if NET_2_0 // NET 2.0 stuff @@ -351,9 +331,7 @@ public class HashtableTest : Assertion { Hashtable mh1clone = (Hashtable) mh1.Clone (); // warning, depends on the field name. - AssertEquals ("EqualityComparer", - GetEqualityComparer (mh1), - GetEqualityComparer (mh1clone)); + Assert.AreEqual (GetEqualityComparer (mh1), GetEqualityComparer (mh1clone), "EqualityComparer"); #endif } } @@ -367,10 +345,9 @@ public class HashtableTest : Assertion { bool result = h.Contains(null); } catch (ArgumentNullException e) { errorThrown = true; - AssertEquals("ParamName is not 'key'", "key", e.ParamName); + Assert.AreEqual ("key", e.ParamName, "ParamName is not 'key'"); } - Assert("null add error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "null add error not thrown"); } { Hashtable h = new Hashtable(); @@ -380,8 +357,8 @@ public class HashtableTest : Assertion { } for (int i = 0; i < 10000; i += 2) { - Assert("hashtable must contain"+i.ToString(), h.Contains(i)); - Assert("hashtable does not contain "+((int)(i+1)).ToString(), !h.Contains(i+1)); + Assert.IsTrue (h.Contains(i), "hashtable must contain"+i.ToString()); + Assert.IsTrue (!h.Contains(i+1), "hashtable does not contain "+((int)(i+1)).ToString()); } } } @@ -398,10 +375,9 @@ public class HashtableTest : Assertion { catch (ArgumentNullException e) { errorThrown = true; - AssertEquals("ParamName is not 'key'", "key", e.ParamName); + Assert.AreEqual ("key", e.ParamName, "ParamName is not 'key'"); } - Assert("null add error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "null add error not thrown"); } { Hashtable h = new Hashtable(); @@ -411,8 +387,8 @@ public class HashtableTest : Assertion { } for (int i = 0; i < 1000; i += 2) { - Assert("hashtable must contain"+i.ToString(), h.Contains(i)); - Assert("hashtable does not contain "+((int)(i+1)).ToString(), !h.Contains(i+1)); + Assert.IsTrue (h.Contains(i), "hashtable must contain"+i.ToString()); + Assert.IsTrue (!h.Contains(i+1), "hashtable does not contain "+((int)(i+1)).ToString()); } } @@ -423,15 +399,11 @@ public class HashtableTest : Assertion { { Hashtable h = new Hashtable(); h['a'] = "blue"; - Assert("blue? it's in there!", - h.ContainsValue("blue")); - Assert("green? no way!", - !h.ContainsValue("green")); - Assert("null? no way!", - !h.ContainsValue(null)); + Assert.IsTrue (h.ContainsValue("blue"), "blue? it's in there!"); + Assert.IsTrue (!h.ContainsValue("green"), "green? no way!"); + Assert.IsTrue (!h.ContainsValue(null), "null? no way!"); h['b'] = null; - Assert("null? it's in there!", - h.ContainsValue(null)); + Assert.IsTrue (h.ContainsValue(null), "null? it's in there!"); } } @@ -445,10 +417,9 @@ public class HashtableTest : Assertion { h.CopyTo(null, 0); } catch (ArgumentNullException e) { errorThrown = true; - AssertEquals("ParamName is not \"array\"", "array", e.ParamName); + Assert.AreEqual ("array", e.ParamName, "ParamName is not \"array\""); } - Assert("null hashtable error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "null hashtable error not thrown"); } { bool errorThrown = false; @@ -458,10 +429,9 @@ public class HashtableTest : Assertion { h.CopyTo(o, -1); } catch (ArgumentOutOfRangeException e) { errorThrown = true; - AssertEquals("ParamName is not \"arrayIndex\"", "arrayIndex", e.ParamName); + Assert.AreEqual ("arrayIndex", e.ParamName, "ParamName is not \"arrayIndex\""); } - Assert("out of range error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "out of range error not thrown"); } { bool errorThrown = false; @@ -472,8 +442,7 @@ public class HashtableTest : Assertion { } catch (ArgumentException) { errorThrown = true; } - Assert("multi-dim array error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "multi-dim array error not thrown"); } { bool errorThrown = false; @@ -485,8 +454,7 @@ public class HashtableTest : Assertion { } catch (ArgumentException) { errorThrown = true; } - Assert("no room in array error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "no room in array error not thrown"); } { bool errorThrown = false; @@ -500,8 +468,7 @@ public class HashtableTest : Assertion { } catch (ArgumentException) { errorThrown = true; } - Assert("table too big error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "table too big error not thrown"); } { bool errorThrown = false; @@ -515,8 +482,7 @@ public class HashtableTest : Assertion { } catch (InvalidCastException) { errorThrown = true; } - Assert("invalid cast error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "invalid cast error not thrown"); } { @@ -532,10 +498,10 @@ public class HashtableTest : Assertion { o[1] = v; } #endif // TARGET_JVM - AssertEquals("first copy fine.", 'a', o[0].Key); - AssertEquals("first copy fine.", 1, o[0].Value); - AssertEquals("second copy fine.", 'b', o[1].Key); - AssertEquals("second copy fine.", 2, o[1].Value); + Assert.AreEqual ('a', o[0].Key, "first copy fine."); + Assert.AreEqual (1, o[0].Value, "first copy fine."); + Assert.AreEqual ('b', o[1].Key, "second copy fine."); + Assert.AreEqual (2, o[1].Value, "second copy fine."); } } @@ -548,14 +514,12 @@ public class HashtableTest : Assertion { h1[s1[i]] = c1[i]; } IDictionaryEnumerator en = h1.GetEnumerator(); - AssertNotNull("No enumerator", en); + Assert.IsNotNull (en, "No enumerator"); for (int i = 0; i < s1.Length; i++) { en.MoveNext(); - Assert("Not enumerating for " + en.Key, - Array.IndexOf(s1, en.Key) >= 0); - Assert("Not enumerating for " + en.Value, - Array.IndexOf(c1, en.Value) >= 0); + Assert.IsTrue (Array.IndexOf(s1, en.Key) >= 0, "Not enumerating for " + en.Key); + Assert.IsTrue (Array.IndexOf(c1, en.Value) >= 0, "Not enumerating for " + en.Value); } } @@ -575,7 +539,7 @@ public class HashtableTest : Assertion { bool result; foreach (DictionaryEntry de in table1) - AssertEquals (de.Value, table2 [de.Key]); + Assert.AreEqual (table2 [de.Key], de.Value); } [Test] @@ -591,7 +555,7 @@ public class HashtableTest : Assertion { formatter.Serialize(stream, table); stream.Position = 0; table = (Hashtable) formatter.Deserialize(stream); - AssertEquals ("#1", 1, table.Count); + Assert.AreEqual (1, table.Count, "#1"); } [Test] @@ -603,10 +567,9 @@ public class HashtableTest : Assertion { h.Remove(null); } catch (ArgumentNullException e) { errorThrown = true; - AssertEquals("ParamName is not \"key\"", "key", e.ParamName); + Assert.AreEqual ("key", e.ParamName, "ParamName is not \"key\""); } - Assert("null hashtable error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "null hashtable error not thrown"); } { string[] keys = {"this", "is", "a", "test"}; @@ -615,17 +578,13 @@ public class HashtableTest : Assertion { for (int i = 0; i < keys.Length; i++) { h[keys[i]] = values[i]; } - AssertEquals("not enough in table", - 4, h.Count); + Assert.AreEqual (4, h.Count, "not enough in table"); h.Remove("huh?"); - AssertEquals("not enough in table", - 4, h.Count); + Assert.AreEqual (4, h.Count, "not enough in table"); h.Remove("this"); - AssertEquals("Wrong count in table", - 3, h.Count); + Assert.AreEqual (3, h.Count, "Wrong count in table"); h.Remove("this"); - AssertEquals("Wrong count in table", - 3, h.Count); + Assert.AreEqual (3, h.Count, "Wrong count in table"); } } @@ -637,18 +596,15 @@ public class HashtableTest : Assertion { Hashtable h = Hashtable.Synchronized(null); } catch (ArgumentNullException e) { errorThrown = true; - AssertEquals("ParamName is not \"table\"", "table", e.ParamName); + Assert.AreEqual ("table", e.ParamName, "ParamName is not \"table\""); } - Assert("null hashtable error not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "null hashtable error not thrown"); } { Hashtable h = new Hashtable(); - Assert("hashtable not synced by default", - !h.IsSynchronized); + Assert.IsTrue (!h.IsSynchronized, "hashtable not synced by default"); Hashtable h2 = Hashtable.Synchronized(h); - Assert("hashtable should by synced", - h2.IsSynchronized); + Assert.IsTrue (h2.IsSynchronized, "hashtable should by synced"); } } @@ -672,20 +628,20 @@ public class HashtableTest : Assertion { [Test] public void TestAddRemoveClear() { ht.Clear(); - Assert(ht.Count==0); + Assert.IsTrue (ht.Count==0); SetDefaultData(); - Assert(ht.Count==3); + Assert.IsTrue (ht.Count==3); bool thrown=false; try { ht.Add("k2","cool"); } catch (ArgumentException) {thrown=true;} - Assert("Must throw ArgumentException!",thrown); + Assert.IsTrue (thrown, "Must throw ArgumentException!"); ht["k2"]="cool"; - Assert(ht.Count==3); - Assert(ht["k2"].Equals("cool")); + Assert.IsTrue (ht.Count==3); + Assert.IsTrue (ht["k2"].Equals("cool")); } @@ -694,14 +650,14 @@ public class HashtableTest : Assertion { SetDefaultData(); Object[] entries=new Object[ht.Count]; ht.CopyTo(entries,0); - Assert("Not an entry.",entries[0] is DictionaryEntry); + Assert.IsTrue (entries[0] is DictionaryEntry, "Not an entry."); } [Test] public void CopyTo_Empty () { Hashtable ht = new Hashtable (); - AssertEquals ("Count", 0, ht.Count); + Assert.AreEqual (0, ht.Count, "Count"); object[] array = new object [ht.Count]; ht.CopyTo (array, 0); } @@ -725,14 +681,14 @@ public class HashtableTest : Assertion { } } - Assert(ht.Count==n); + Assert.IsTrue (ht.Count==n); for (int i=0;i=r1 && i [TestFixture] public class NewArrayListTest - : TestCase { private object[] c_TestData = new Object[] {0,1,2,3,4,5,6,7,8,9}; @@ -50,7 +49,7 @@ namespace MonoTests.System.Collections { if (values.Count != list.Count) { - Assertion.Assert(message, false); + Assert.Fail (message); } for (int i = 0; i < list.Count; i++) @@ -62,7 +61,7 @@ namespace MonoTests.System.Collections if ((list[i] == null || values[i] == null) || !list[i].Equals(values[i])) { - Assertion.Assert(message, false); + Assert.Fail (message); } } } @@ -86,7 +85,7 @@ namespace MonoTests.System.Collections { if ((int)arrayList[j] < (int)arrayList[j - 1]) { - Assertion.Fail("ArrayList.Sort()"); + Assert.Fail("ArrayList.Sort()"); return; } @@ -129,13 +128,13 @@ namespace MonoTests.System.Collections for (int i = 0; i < 10; i++) { x = arrayList.IndexOf(i); - Assertion.Assert("ArrayList.IndexOf(" + i + ")", x == i); + Assert.IsTrue(x == i, "ArrayList.IndexOf(" + i + ")"); } try { arrayList.IndexOf(0, 10, 1); - Assertion.Fail("ArrayList.IndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.IndexOf(0, 10, 1)"); } catch (ArgumentOutOfRangeException) { @@ -144,7 +143,7 @@ namespace MonoTests.System.Collections try { arrayList.IndexOf(0, 0, -1); - Assertion.Fail("ArrayList.IndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.IndexOf(0, 10, 1)"); } catch (ArgumentOutOfRangeException) { @@ -153,7 +152,7 @@ namespace MonoTests.System.Collections try { arrayList.IndexOf(0, -1, -1); - Assertion.Fail("ArrayList.IndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.IndexOf(0, 10, 1)"); } catch (ArgumentOutOfRangeException) { @@ -162,7 +161,7 @@ namespace MonoTests.System.Collections try { arrayList.IndexOf(0, 9, 10); - Assertion.Fail("ArrayList.IndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.IndexOf(0, 10, 1)"); } catch (ArgumentOutOfRangeException) { @@ -174,13 +173,13 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { - Assertion.Fail("ArrayList.IndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.IndexOf(0, 10, 1)"); } try { arrayList.IndexOf(0, 0, 11); - Assertion.Fail("ArrayList.IndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.IndexOf(0, 10, 1)"); } catch (ArgumentOutOfRangeException) { @@ -192,14 +191,14 @@ namespace MonoTests.System.Collections { x = arrayList.LastIndexOf(i); - Assertion.Assert("ArrayList.LastIndexOf(" + i + ")", x == i); + Assert.IsTrue(x == i, "ArrayList.LastIndexOf(" + i + ")"); } try { arrayList.IndexOf(0, 10, 1); - Assertion.Fail("ArrayList.LastIndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.LastIndexOf(0, 10, 1)"); } catch (ArgumentOutOfRangeException) { @@ -209,7 +208,7 @@ namespace MonoTests.System.Collections { arrayList.IndexOf(0, 0, -1); - Assertion.Fail("ArrayList.LastIndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.LastIndexOf(0, 10, 1)"); } catch (ArgumentOutOfRangeException) { @@ -219,7 +218,7 @@ namespace MonoTests.System.Collections { arrayList.LastIndexOf(0, -1, -1); - Assertion.Fail("ArrayList.LastIndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.LastIndexOf(0, 10, 1)"); } catch (ArgumentOutOfRangeException) { @@ -231,13 +230,13 @@ namespace MonoTests.System.Collections } catch (ArgumentOutOfRangeException) { - Assertion.Fail("ArrayList.LastIndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.LastIndexOf(0, 10, 1)"); } try { arrayList.LastIndexOf(0, 0, 10); - Assertion.Fail("ArrayList.LastIndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.LastIndexOf(0, 10, 1)"); } catch (ArgumentOutOfRangeException) { @@ -246,7 +245,7 @@ namespace MonoTests.System.Collections try { arrayList.LastIndexOf(0, 0, 11); - Assertion.Fail("ArrayList.LastIndexOf(0, 10, 1)"); + Assert.Fail("ArrayList.LastIndexOf(0, 10, 1)"); } catch (ArgumentOutOfRangeException) { @@ -322,12 +321,12 @@ namespace MonoTests.System.Collections // Make sure the readOnlyList is a wrapper and not a clone. arrayList.Add(10); - Assertion.Assert("readOnlyList.Count == 11", readOnlyList.Count == 11); + Assert.IsTrue(readOnlyList.Count == 11, "readOnlyList.Count == 11"); try { readOnlyList.Add(0); - Assertion.Fail("readOnlyList.Add(0)"); + Assert.Fail("readOnlyList.Add(0)"); } catch (NotSupportedException) { @@ -337,7 +336,7 @@ namespace MonoTests.System.Collections { readOnlyList.AddRange(c_TestData); - Assertion.Fail("readOnlyList.AddRange(c_TestData)"); + Assert.Fail("readOnlyList.AddRange(c_TestData)"); } catch (NotSupportedException) { @@ -349,7 +348,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("readOnlyList.BinarySearch(1)"); + Assert.Fail("readOnlyList.BinarySearch(1)"); } try @@ -358,13 +357,13 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("readOnlyList.Capacity"); + Assert.Fail("readOnlyList.Capacity"); } try { readOnlyList.Clear(); - Assertion.Fail("readOnlyList.Clear()"); + Assert.Fail("readOnlyList.Clear()"); } catch (NotSupportedException) { @@ -376,7 +375,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("readOnlyList.Clone()"); + Assert.Fail("readOnlyList.Clone()"); } try @@ -385,7 +384,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("readOnlyList.Contains"); + Assert.Fail("readOnlyList.Contains"); } try @@ -394,7 +393,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("readOnlyList.CopyTo(new Array(readOnlyList.Count))"); + Assert.Fail("readOnlyList.CopyTo(new Array(readOnlyList.Count))"); } try @@ -406,7 +405,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("readOnlyList.GetEnumerator()"); + Assert.Fail("readOnlyList.GetEnumerator()"); } try @@ -415,7 +414,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("readOnlyList.GetRange(0, 1)"); + Assert.Fail("readOnlyList.GetRange(0, 1)"); } try @@ -424,13 +423,13 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("readOnlyList.readOnlyList.IndexOf(1)"); + Assert.Fail("readOnlyList.readOnlyList.IndexOf(1)"); } try { readOnlyList[0] = 0; - Assertion.Fail("readOnlyList[0] = 0"); + Assert.Fail("readOnlyList[0] = 0"); } catch (NotSupportedException) { @@ -442,14 +441,14 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("readOnlyList.IndexOf(0)"); + Assert.Fail("readOnlyList.IndexOf(0)"); } try { readOnlyList.InsertRange(0, new object[] {1,2}); - Assertion.Fail("readOnlyList.InsertRange(0, new object[] {1,2})"); + Assert.Fail("readOnlyList.InsertRange(0, new object[] {1,2})"); } catch (NotSupportedException) { @@ -461,14 +460,14 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("readOnlyList.LastIndexOf(1)"); + Assert.Fail("readOnlyList.LastIndexOf(1)"); } try { readOnlyList.Remove(1); - Assertion.Fail("readOnlyList.Remove(1)"); + Assert.Fail("readOnlyList.Remove(1)"); } catch (NotSupportedException) { @@ -478,7 +477,7 @@ namespace MonoTests.System.Collections { readOnlyList.RemoveAt(1); - Assertion.Fail("readOnlyList.RemoveAt(1)"); + Assert.Fail("readOnlyList.RemoveAt(1)"); } catch (NotSupportedException) { @@ -488,7 +487,7 @@ namespace MonoTests.System.Collections { readOnlyList.RemoveRange(0, 1); - Assertion.Fail("readOnlyList.RemoveRange(0, 1)"); + Assert.Fail("readOnlyList.RemoveRange(0, 1)"); } catch (NotSupportedException) { @@ -498,7 +497,7 @@ namespace MonoTests.System.Collections { readOnlyList.Reverse(); - Assertion.Fail("readOnlyList.Reverse()"); + Assert.Fail("readOnlyList.Reverse()"); } catch (NotSupportedException) { @@ -508,7 +507,7 @@ namespace MonoTests.System.Collections { readOnlyList.SetRange(0, new Object[] {0, 1}); - Assertion.Fail("readOnlyList.SetRange(0, new Object[] {0, 1})"); + Assert.Fail("readOnlyList.SetRange(0, new Object[] {0, 1})"); } catch (NotSupportedException) { @@ -518,7 +517,7 @@ namespace MonoTests.System.Collections { readOnlyList.Sort(); - Assertion.Fail("readOnlyList.Sort()"); + Assert.Fail("readOnlyList.Sort()"); } catch (NotSupportedException) { @@ -530,14 +529,14 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("readOnlyList.ToArray()"); + Assert.Fail("readOnlyList.ToArray()"); } try { readOnlyList.TrimToSize(); - Assertion.Fail("readOnlyList.TrimToSize()"); + Assert.Fail("readOnlyList.TrimToSize()"); } catch (NotSupportedException) { @@ -557,12 +556,12 @@ namespace MonoTests.System.Collections // Make sure the fixedSizeList is a wrapper and not a clone. arrayList.Add(10); - Assertion.Assert("fixedSizeList.Count == 11", fixedSizeList.Count == 11); + Assert.IsTrue(fixedSizeList.Count == 11, "fixedSizeList.Count == 11"); try { fixedSizeList.Add(0); - Assertion.Fail("fixedSizeList.Add(0)"); + Assert.Fail("fixedSizeList.Add(0)"); } catch (NotSupportedException) { @@ -571,7 +570,7 @@ namespace MonoTests.System.Collections try { fixedSizeList.Remove(0); - Assertion.Fail("fixedSizeList.Remove(0)"); + Assert.Fail("fixedSizeList.Remove(0)"); } catch (NotSupportedException) { @@ -580,7 +579,7 @@ namespace MonoTests.System.Collections try { fixedSizeList.RemoveAt(0); - Assertion.Fail("fixedSizeList.RemoveAt(0)"); + Assert.Fail("fixedSizeList.RemoveAt(0)"); } catch (NotSupportedException) { @@ -589,7 +588,7 @@ namespace MonoTests.System.Collections try { fixedSizeList.Clear(); - Assertion.Fail("fixedSizeList.Clear()"); + Assert.Fail("fixedSizeList.Clear()"); } catch (NotSupportedException) { @@ -601,13 +600,13 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("fixedSizeList[0] = 0"); + Assert.Fail("fixedSizeList[0] = 0"); } try { fixedSizeList.Clear(); - Assertion.Fail("fixedSizeList.Clear()"); + Assert.Fail("fixedSizeList.Clear()"); } catch (NotSupportedException) { @@ -619,7 +618,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("fixedSizeList.Contains"); + Assert.Fail("fixedSizeList.Contains"); } try @@ -628,7 +627,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("fixedSizeList.Count"); + Assert.Fail("fixedSizeList.Count"); } try @@ -637,7 +636,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("fixedSizeList.GetRange(0, 1)"); + Assert.Fail("fixedSizeList.GetRange(0, 1)"); } try @@ -646,14 +645,14 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("fixedSizeList.IndexOf(0)"); + Assert.Fail("fixedSizeList.IndexOf(0)"); } try { fixedSizeList.InsertRange(0, new object[] {1,2}); - Assertion.Fail("fixedSizeList.InsertRange(0, new object[] {1,2})"); + Assert.Fail("fixedSizeList.InsertRange(0, new object[] {1,2})"); } catch (NotSupportedException) { @@ -665,7 +664,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("fixedSizeList.Reverse()"); + Assert.Fail("fixedSizeList.Reverse()"); } try @@ -674,7 +673,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("fixedSizeList.SetRange(0, new Object[] {0, 1})"); + Assert.Fail("fixedSizeList.SetRange(0, new Object[] {0, 1})"); } try @@ -683,7 +682,7 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("fixedSizeList.Sort()"); + Assert.Fail("fixedSizeList.Sort()"); } try @@ -692,14 +691,14 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("fixedSizeList.ToArray()"); + Assert.Fail("fixedSizeList.ToArray()"); } try { fixedSizeList.TrimToSize(); - Assertion.Fail("fixedSizeList.TrimToSize()"); + Assert.Fail("fixedSizeList.TrimToSize()"); } catch (NotSupportedException) { @@ -711,14 +710,14 @@ namespace MonoTests.System.Collections } catch (NotSupportedException) { - Assertion.Fail("fixedSizeList.Clone()"); + Assert.Fail("fixedSizeList.Clone()"); } try { fixedSizeList.AddRange(c_TestData); - Assertion.Fail("fixedSizeList.AddRange(c_TestData)"); + Assert.Fail("fixedSizeList.AddRange(c_TestData)"); } catch (NotSupportedException) { @@ -825,7 +824,7 @@ namespace MonoTests.System.Collections arrayList.Capacity = x * 2; - Assert("arrayList.Capacity == x * 2", arrayList.Capacity == x * 2); + Assert.IsTrue(arrayList.Capacity == x * 2, "arrayList.Capacity == x * 2"); VerifyContains(arrayList, c_TestData, "VerifyContains(arrayList, c_TestData)"); } @@ -849,11 +848,11 @@ namespace MonoTests.System.Collections arrayList.AddRange(c_TestData); - Assertion.Assert("arrayList.Capacity == 10", arrayList.Capacity == 10); + Assert.IsTrue(arrayList.Capacity == 10, "arrayList.Capacity == 10"); arrayList.Add(10); - Assertion.Assert("arrayList.Capacity == 20", arrayList.Capacity == 20); + Assert.IsTrue(arrayList.Capacity == 20, "arrayList.Capacity == 20"); VerifyContains(arrayList, new object[] {0,1,2,3,4,5,6,7,8,9,10}, "VerifyContains"); } @@ -886,7 +885,7 @@ namespace MonoTests.System.Collections { arrayList.BinarySearch(new object()); - Assertion.Fail("1: Binary search on object that doesn't support IComparable."); + Assert.Fail("1: Binary search on object that doesn't support IComparable."); } catch (ArgumentException) { @@ -900,7 +899,7 @@ namespace MonoTests.System.Collections { arrayList.BinarySearch(1); - Assertion.Fail("2: Binary search on incompatible object."); + Assert.Fail("2: Binary search on incompatible object."); } catch (ArgumentException) { @@ -917,8 +916,8 @@ namespace MonoTests.System.Collections arrayList.Add(1); } - Assertion.Assert("BinarySearch should start in middle.", arrayList.BinarySearch(1) == 49); - Assertion.Assert("arrayList.BinarySearch(0, 0, 0, Comparer.Default)", arrayList.BinarySearch(0, 0, 0, Comparer.Default) == -1); + Assert.IsTrue(arrayList.BinarySearch(1) == 49, "BinarySearch should start in middle."); + Assert.IsTrue(arrayList.BinarySearch(0, 0, 0, Comparer.Default) == -1, "arrayList.BinarySearch(0, 0, 0, Comparer.Default)"); } [Test] @@ -1088,7 +1087,7 @@ namespace MonoTests.System.Collections rangeList = arrayList.GetRange(3, 5); - Assertion.Assert("rangeList.Count == 5", rangeList.Count == 5); + Assert.IsTrue(rangeList.Count == 5, "rangeList.Count == 5"); this.VerifyContains(rangeList, new object[] {3,4,5,6,7}, "1: VerifyContains(rangeList)"); @@ -1107,7 +1106,7 @@ namespace MonoTests.System.Collections rangeList.Add(3); rangeList.Add(11); - Assertion.Assert("rangeList.LastIndexOf(6) == 4", rangeList.LastIndexOf(6) == 4); + Assert.IsTrue(rangeList.LastIndexOf(6) == 4, "rangeList.LastIndexOf(6) == 4"); rangeList.Sort(); @@ -1155,7 +1154,7 @@ namespace MonoTests.System.Collections while (enumerator.MoveNext()) { - Assertion.Assert("enumerator.Current == x", (int)enumerator.Current == x); + Assert.IsTrue((int)enumerator.Current == x, "enumerator.Current == x"); x++; } @@ -1166,7 +1165,7 @@ namespace MonoTests.System.Collections while (enumerator.MoveNext()) { - Assertion.Assert("enumerator.Current == x", (int)enumerator.Current == x); + Assert.IsTrue((int)enumerator.Current == x, "enumerator.Current == x"); x++; } @@ -1180,7 +1179,7 @@ namespace MonoTests.System.Collections while (enumerator.MoveNext()) { - Assertion.Assert("enumerator.Current == x", (int)enumerator.Current == x); + Assert.IsTrue((int)enumerator.Current == x, "enumerator.Current == x"); x++; } @@ -1191,7 +1190,7 @@ namespace MonoTests.System.Collections while (enumerator.MoveNext()) { - Assertion.Assert("enumerator.Current == x", (int)enumerator.Current == x); + Assert.IsTrue((int)enumerator.Current == x, "enumerator.Current == x"); x++; } @@ -1200,11 +1199,11 @@ namespace MonoTests.System.Collections enumerator = arrayList.GetEnumerator(arrayList.Count, 0); - Assertion.Assert("!enumerator.MoveNext()", !enumerator.MoveNext()); + Assert.IsTrue(!enumerator.MoveNext(), "!enumerator.MoveNext()"); enumerator.Reset(); - Assertion.Assert("!enumerator.MoveNext()", !enumerator.MoveNext()); + Assert.IsTrue(!enumerator.MoveNext(), "!enumerator.MoveNext()"); } [Test] @@ -1243,7 +1242,7 @@ namespace MonoTests.System.Collections { if (!o.Equals(x)) { - Assertion.Fail("Arraylist.GetEnumerator()"); + Assert.Fail("Arraylist.GetEnumerator()"); break; } @@ -1257,7 +1256,7 @@ namespace MonoTests.System.Collections enumerator.MoveNext(); - Assert("enumerator.Current == 0", (int)enumerator.Current == 0); + Assert.IsTrue((int)enumerator.Current == 0, "enumerator.Current == 0"); // Invalidate the enumerator. @@ -1267,11 +1266,11 @@ namespace MonoTests.System.Collections { // According to the spec this should still work even though the enumerator is invalid. - Assert("enumerator.Current == 0", (int)enumerator.Current == 0); + Assert.IsTrue((int)enumerator.Current == 0, "enumerator.Current == 0"); } catch (InvalidOperationException) { - Assert("enumerator.Current should not fail.", false); + Assert.IsTrue(false, "enumerator.Current should not fail."); } try @@ -1280,7 +1279,7 @@ namespace MonoTests.System.Collections enumerator.MoveNext(); - Assert("enumerator.Current should fail.", false); + Assert.IsTrue(false, "enumerator.Current should fail."); } catch (InvalidOperationException) { @@ -1388,7 +1387,7 @@ namespace MonoTests.System.Collections int total = 0; foreach (int b in a) total += b; - Assert ("Count should be 6", total == 6); + Assert.IsTrue (total == 6, "Count should be 6"); } [Test] @@ -1406,16 +1405,16 @@ namespace MonoTests.System.Collections count++; if (b == null){ if (found_null) - Assert ("Should only find one null", false); + Assert.IsTrue (false, "Should only find one null"); found_null = true; } else { total += (int) b; } } - Assert ("Should fine one null", found_null); - Assert ("Total should be 4", total == 4); - Assert ("Count should be 3", count == 3); + Assert.IsTrue (found_null, "Should fine one null"); + Assert.IsTrue (total == 4, "Total should be 4"); + Assert.IsTrue (count == 3, "Count should be 3"); } } } diff --git a/mcs/class/corlib/Test/System.Collections/QueueTest.cs b/mcs/class/corlib/Test/System.Collections/QueueTest.cs index 76d4e730190..a07da619d2b 100644 --- a/mcs/class/corlib/Test/System.Collections/QueueTest.cs +++ b/mcs/class/corlib/Test/System.Collections/QueueTest.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.Collections { [TestFixture] - public class QueueTest : Assertion { + public class QueueTest { protected Queue q1; protected Queue q2; @@ -36,172 +36,175 @@ namespace MonoTests.System.Collections { emptyQueue = new Queue (); } + [Test] public void TestConstructorException1 () { try { Queue q = new Queue(-1, 2); - Fail("Should throw an exception"); + Assert.Fail ("Should throw an exception"); } catch (ArgumentOutOfRangeException e) { - AssertEquals("Exception's ParamName must be \"capacity\"", "capacity", e.ParamName); + Assert.AreEqual ("capacity", e.ParamName, "Exception's ParamName must be \"capacity\""); } } + [Test] public void TestConstructorException2 () { try { Queue q = new Queue(10, 0); - Fail("Should throw an exception because growFactor < 1"); + Assert.Fail ("Should throw an exception because growFactor < 1"); } catch (ArgumentOutOfRangeException e) { - AssertEquals("Exception's ParamName must be \"growFactor\"", "growFactor", e.ParamName); + Assert.AreEqual ("growFactor", e.ParamName, "Exception's ParamName must be \"growFactor\""); } } + [Test] public void TestConstructorException3 () { try { Queue q = new Queue(10, 11); - Fail("Should throw an exception because growFactor > 10"); + Assert.Fail ("Should throw an exception because growFactor > 10"); } catch (ArgumentOutOfRangeException e) { - AssertEquals("Exception's ParamName must be \"growFactor\"", "growFactor", e.ParamName); + Assert.AreEqual ("growFactor", e.ParamName, "Exception's ParamName must be \"growFactor\""); } } + [Test] public void TestConstructorException4 () { try { Queue q = new Queue(null); - Fail("Should throw an exception because col == null"); + Assert.Fail ("Should throw an exception because col == null"); } catch (ArgumentNullException e) { - AssertEquals("Exception's ParamName must be \"col\"", "col", e.ParamName); + Assert.AreEqual ("col", e.ParamName, "Exception's ParamName must be \"col\""); } } + [Test] public void TestICollectionConstructor () { Queue q = new Queue(new int[] {1, 2, 3, 4, 5}); - AssertEquals("count", 5, q.Count); + Assert.AreEqual (5, q.Count, "count"); for (int i=1; i <=5; i++) { - AssertEquals(i, q.Dequeue()); + Assert.AreEqual (q.Dequeue(), i); } } + [Test] public void TestConstructors () { - SetUp(); - Assert (q1.Count == 100); - Assert (q2.Count == 50); - Assert (emptyQueue.Count == 0); + Assert.IsTrue (q1.Count == 100); + Assert.IsTrue (q2.Count == 50); + Assert.IsTrue (emptyQueue.Count == 0); } + [Test] public void TestCount() { - SetUp(); - - AssertEquals("Count #1", 100, q1.Count); + Assert.AreEqual (100, q1.Count, "Count #1"); for (int i = 1; i <=50; i ++) { q1.Dequeue(); } - AssertEquals("Count #2", 50, q1.Count); + Assert.AreEqual (50, q1.Count, "Count #2"); for (int i = 1; i <=50; i ++) { q1.Enqueue(i); } - AssertEquals("Count #3", 100, q1.Count); + Assert.AreEqual (100, q1.Count, "Count #3"); - AssertEquals("Count #4", 50, q2.Count); + Assert.AreEqual (50, q2.Count, "Count #4"); - AssertEquals("Count #5", 0, emptyQueue.Count); + Assert.AreEqual (0, emptyQueue.Count, "Count #5"); } + [Test] public void TestIsSynchronized() { - SetUp(); - Assert("IsSynchronized should be false", !q1.IsSynchronized); - Assert("IsSynchronized should be false", !q2.IsSynchronized); - Assert("IsSynchronized should be false", !emptyQueue.IsSynchronized); + Assert.IsTrue (!q1.IsSynchronized, "IsSynchronized should be false"); + Assert.IsTrue (!q2.IsSynchronized, "IsSynchronized should be false"); + Assert.IsTrue (!emptyQueue.IsSynchronized, "IsSynchronized should be false"); } + [Test] public void TestSyncRoot() { - SetUp(); #if !NET_2_0 // umm, why on earth do you expect SyncRoot is the Queue itself? - AssertEquals("SyncRoot q1", q1, q1.SyncRoot); - AssertEquals("SyncRoot q2", q2, q2.SyncRoot); - AssertEquals("SyncRoot emptyQueue", emptyQueue, emptyQueue.SyncRoot); + Assert.AreEqual (q1, q1.SyncRoot, "SyncRoot q1"); + Assert.AreEqual (q2, q2.SyncRoot, "SyncRoot q2"); + Assert.AreEqual (emptyQueue, emptyQueue.SyncRoot, "SyncRoot emptyQueue"); #endif Queue q1sync = Queue.Synchronized(q1); - AssertEquals("SyncRoot value of a synchronized queue", q1, q1sync.SyncRoot); + Assert.AreEqual (q1, q1sync.SyncRoot, "SyncRoot value of a synchronized queue"); } + [Test] public void TestCopyToException1 () { - SetUp(); try { q1.CopyTo(null, 1); - Fail("must throw ArgumentNullException"); + Assert.Fail ("must throw ArgumentNullException"); } catch (ArgumentNullException e) { - AssertEquals("Exception's ParamName must be \"array\"", "array", e.ParamName); + Assert.AreEqual ("array", e.ParamName, "Exception's ParamName must be \"array\""); } } + [Test] public void TestCopyToException2 () { - SetUp(); try { q1.CopyTo(new int[2,2], 1); - Fail("must throw ArgumentException"); + Assert.Fail ("must throw ArgumentException"); } catch (ArgumentException) { } } + [Test] public void TestCopyToException3 () { - SetUp(); try { q1.CopyTo(new int[3], -1); - Fail("must throw ArgumentOutOfRangeException"); + Assert.Fail ("must throw ArgumentOutOfRangeException"); } catch (ArgumentOutOfRangeException e) { - AssertEquals("Exception's ParamName must be \"index\"", "index", e.ParamName); + Assert.AreEqual ("index", e.ParamName, "Exception's ParamName must be \"index\""); } } + [Test] public void TestCopyToException4 () { - SetUp(); try { q1.CopyTo(new int[3], 1); - Fail("must throw ArgumentException"); + Assert.Fail ("must throw ArgumentException"); } catch (ArgumentException) {} } + [Test] public void TestCopyTo () { - SetUp(); - int[] a1 = new int[100]; int[] a2 = new int[60]; @@ -210,72 +213,72 @@ namespace MonoTests.System.Collections { progress_marker = "before first CopyTo"; q1.CopyTo (a1, 0); for (int i = 0; i < 100; i++) - AssertEquals (i, a1[i]); + Assert.AreEqual (a1[i], i); // Remove some items from q2 and add other // items, to avoid having an "easy" just created // Queue for (int i = 50; i < 60; i++) - Assert (i == (int) q2.Dequeue ()); + Assert.IsTrue (i == (int) q2.Dequeue ()); for (int i = 100; i < 110; i++) q2.Enqueue (i); progress_marker = "before second CopyTo"; q2.CopyTo (a2, 10); for (int i = 60; i < 110; i++) - Assert (i == a2[i - 60 + 10]); + Assert.IsTrue (i == a2[i - 60 + 10]); // Copying an empty Queue should not modify the array progress_marker = "before third CopyTo"; emptyQueue.CopyTo (a2, 10); for (int i = 60; i < 110; i++) - Assert (i == a2[i - 60 + 10]); + Assert.IsTrue (i == a2[i - 60 + 10]); } catch (Exception e) { - Fail ("Unexpected exception at marker <" + progress_marker + ">: e = " + e); + Assert.Fail ("Unexpected exception at marker <" + progress_marker + ">: e = " + e); } } + [Test] public void TestEnumerator () { - SetUp(); int i; IEnumerator e; e = q1.GetEnumerator (); i = 0; while (e.MoveNext ()) { - AssertEquals ("q1 at i=" + i, i, ((int) e.Current)); + Assert.AreEqual (i, ((int) e.Current), "q1 at i=" + i); i++; } e = q2.GetEnumerator (); i = 50; while (e.MoveNext ()) { - AssertEquals (i, ((int) e.Current)); + Assert.AreEqual (((int) e.Current), i); i++; } e = emptyQueue.GetEnumerator (); if (e.MoveNext ()) - Fail ("Empty Queue enumerator returning elements!"); + Assert.Fail ("Empty Queue enumerator returning elements!"); e = q1.GetEnumerator (); try { e.MoveNext (); q1.Enqueue (0); e.MoveNext (); - Fail ("#1 Should have thrown InvalidOperationException"); + Assert.Fail ("#1 Should have thrown InvalidOperationException"); } catch (InvalidOperationException) { } e = q1.GetEnumerator (); } + [Test] public void TestEnumeratorException1 () { - SetUp(); IEnumerator e; e = q1.GetEnumerator(); q1.Enqueue(6); try { e.MoveNext(); - Fail("MoveNext must throw InvalidOperationException after Enqueue"); + Assert.Fail ("MoveNext must throw InvalidOperationException after Enqueue"); } catch (InvalidOperationException) {} @@ -284,7 +287,7 @@ namespace MonoTests.System.Collections { try { e.Reset(); - Fail("Reset must throw InvalidOperationException after Enqueue"); + Assert.Fail ("Reset must throw InvalidOperationException after Enqueue"); } catch (InvalidOperationException) {} @@ -293,7 +296,7 @@ namespace MonoTests.System.Collections { try { e.Reset(); - Fail("Reset must throw InvalidOperationException after TrimToSize"); + Assert.Fail ("Reset must throw InvalidOperationException after TrimToSize"); } catch (InvalidOperationException) {} @@ -306,7 +309,7 @@ namespace MonoTests.System.Collections { IEnumerator e = q1.GetEnumerator(); while (e.MoveNext ()) { } - AssertNotNull (e.Current); + Assert.IsNotNull (e.Current); } [Test] @@ -315,74 +318,75 @@ namespace MonoTests.System.Collections { IEnumerator e = q1.GetEnumerator(); while (e.MoveNext ()) { } - Assert (!e.MoveNext ()); + Assert.IsTrue (!e.MoveNext ()); } + [Test] public void TestClone () { - SetUp(); Queue q3 = (Queue) q2.Clone (); - Assert (q3.Count == q2.Count); + Assert.IsTrue (q3.Count == q2.Count); for (int i = 0; i < 50; i++) - Assert (q2.Dequeue ().Equals (q3.Dequeue ())); - Assert (q3.Count == 0); - Assert (q2.Count == 0); + Assert.IsTrue (q2.Dequeue ().Equals (q3.Dequeue ())); + Assert.IsTrue (q3.Count == 0); + Assert.IsTrue (q2.Count == 0); } + [Test] public void TestClear () { - SetUp(); q1.Clear (); - Assert (q1.Count == 0); + Assert.IsTrue (q1.Count == 0); q2.Clear (); - Assert (q2.Count == 0); + Assert.IsTrue (q2.Count == 0); emptyQueue.Clear (); - Assert (emptyQueue.Count == 0); + Assert.IsTrue (emptyQueue.Count == 0); } + [Test] public void TestContains () { - SetUp(); for (int i = 0; i < 100; i++) { - Assert (q1.Contains (i)); - Assert (!emptyQueue.Contains (i)); + Assert.IsTrue (q1.Contains (i)); + Assert.IsTrue (!emptyQueue.Contains (i)); if (i < 50) - Assert (!q2.Contains (i)); + Assert.IsTrue (!q2.Contains (i)); else - Assert (q2.Contains (i)); + Assert.IsTrue (q2.Contains (i)); } - Assert("q1 does not contain null", !q1.Contains(null)); + Assert.IsTrue (!q1.Contains(null), "q1 does not contain null"); q1.Enqueue(null); - Assert("q1 contains null", q1.Contains(null)); + Assert.IsTrue (q1.Contains(null), "q1 contains null"); } + [Test] public void TestEnqueueDequeuePeek () { - SetUp(); int q1size = q1.Count; int q2size = q2.Count; q2.Enqueue (null); - Assert (q2.Count == ++q2size); + Assert.IsTrue (q2.Count == ++q2size); for (int i = 0; i < 50; i++) { int k = (int) q1.Peek (); - Assert (q1.Count == q1size); + Assert.IsTrue (q1.Count == q1size); int j = (int) q1.Dequeue (); - Assert (q1.Count == --q1size); - Assert (i == j); - Assert (j == k); + Assert.IsTrue (q1.Count == --q1size); + Assert.IsTrue (i == j); + Assert.IsTrue (j == k); q2.Enqueue (j); - Assert (q2.Count == ++q2size); + Assert.IsTrue (q2.Count == ++q2size); } for (int i = 50; i < 100; i++) { - Assert (((int) q2.Dequeue ()) == i); - Assert (q2.Count == --q2size); + Assert.IsTrue (((int) q2.Dequeue ()) == i); + Assert.IsTrue (q2.Count == --q2size); } - Assert (q2.Peek () == null); - Assert (q2.Dequeue () == null); - Assert (q2.Count == --q2size); + Assert.IsTrue (q2.Peek () == null); + Assert.IsTrue (q2.Dequeue () == null); + Assert.IsTrue (q2.Count == --q2size); for (int i = 0; i < 50; i++) { - Assert (((int) q2.Dequeue ()) == i); - Assert (q2.Count == --q2size); + Assert.IsTrue (((int) q2.Dequeue ()) == i); + Assert.IsTrue (q2.Count == --q2size); } } + [Test] public void TestDequeue() { Queue queue = new Queue(); string[] tmp = new string[50]; @@ -395,11 +399,12 @@ namespace MonoTests.System.Collections { i = 0; while(queue.Count>0){ string z = (string) queue.Dequeue(); - AssertEquals (tmp[i], tmp[i], z); + Assert.AreEqual (tmp[i], z, tmp[i]); i++; } } + [Test] [ExpectedException(typeof(InvalidOperationException))] public void TestDequeueEmpty() { @@ -407,22 +412,22 @@ namespace MonoTests.System.Collections { q.Dequeue(); } + [Test] public void TestToArray() { - SetUp(); object[] a = q1.ToArray(); for (int i = 0; i < 100; i++) { - AssertEquals("Queue-Array mismatch",q1.Dequeue(),(int) a[i]); + Assert.AreEqual (q1.Dequeue(), (int) a[i], "Queue-Array mismatch"); } object[] b = emptyQueue.ToArray(); - AssertEquals("b should be a zero-lenght array", 0, b.Length); + Assert.AreEqual (0, b.Length, "b should be a zero-lenght array"); } + [Test] public void TestTrimToSize() { - SetUp(); for (int i=0; i < 50; i++) { q1.Dequeue(); @@ -433,16 +438,17 @@ namespace MonoTests.System.Collections { // TODO: test Syncronized operation + [Test] public void TestSynchronizedException() { try { Queue.Synchronized(null); - Fail("Must throw ArgumentNullException"); + Assert.Fail ("Must throw ArgumentNullException"); } catch (ArgumentNullException e) { - AssertEquals("Exception's ParamName must be \"queue\"", "queue", e.ParamName); + Assert.AreEqual ("queue", e.ParamName, "Exception's ParamName must be \"queue\""); } } @@ -459,16 +465,16 @@ namespace MonoTests.System.Collections { public void SynchronizedClone () { Queue q1sync = Queue.Synchronized (q1); - Assert ("q1sync.IsSyncronized", q1sync.IsSynchronized); - AssertEquals ("q1sync.Count", q1.Count, q1sync.Count); + Assert.IsTrue (q1sync.IsSynchronized, "q1sync.IsSyncronized"); + Assert.AreEqual (q1.Count, q1sync.Count, "q1sync.Count"); Queue q1syncsync = Queue.Synchronized (q1sync); - Assert ("q1syncsync must be synchronized too", q1syncsync.IsSynchronized); - AssertEquals ("q1syncsync.Count", q1.Count, q1syncsync.Count); + Assert.IsTrue (q1syncsync.IsSynchronized, "q1syncsync must be synchronized too"); + Assert.AreEqual (q1.Count, q1syncsync.Count, "q1syncsync.Count"); Queue q1syncclone = (Queue) q1sync.Clone(); - Assert ("clone must be synchronized too", q1syncclone.IsSynchronized); - AssertEquals ("q1syncclone.Count", q1.Count, q1syncclone.Count); + Assert.IsTrue (q1syncclone.IsSynchronized, "clone must be synchronized too"); + Assert.AreEqual (q1.Count, q1syncclone.Count, "q1syncclone.Count"); } [Test] @@ -487,16 +493,16 @@ namespace MonoTests.System.Collections { queue.Enqueue (i); queue.TrimToSize (); - AssertEquals ("0", 0, queue.Dequeue ()); + Assert.AreEqual (0, queue.Dequeue (), "0"); queue.Enqueue (411); - AssertEquals ("Count-1", 31, queue.Count); + Assert.AreEqual (31, queue.Count, "Count-1"); for (int i = 1; i < 31; i++) { - AssertEquals ("Peek" + i.ToString (), i, queue.Peek ()); - AssertEquals ("Dequeue" + i.ToString (), i, queue.Dequeue ()); + Assert.AreEqual (i, queue.Peek (), "Peek" + i.ToString ()); + Assert.AreEqual (i, queue.Dequeue (), "Dequeue" + i.ToString ()); } - AssertEquals ("Count-2", 1, queue.Count); - AssertEquals ("411", 411, queue.Dequeue ()); + Assert.AreEqual (1, queue.Count, "Count-2"); + Assert.AreEqual (411, queue.Dequeue (), "411"); } [Test] @@ -508,8 +514,8 @@ namespace MonoTests.System.Collections { queue.TrimToSize (); queue.Enqueue (411); - AssertEquals ("Count-1", 32, queue.Count); - AssertEquals ("0", 0, queue.Dequeue ()); + Assert.AreEqual (32, queue.Count, "Count-1"); + Assert.AreEqual (0, queue.Dequeue (), "0"); } } } diff --git a/mcs/class/corlib/Test/System.Collections/ReadOnlyCollectionBaseTest.cs b/mcs/class/corlib/Test/System.Collections/ReadOnlyCollectionBaseTest.cs index 98819d7d0d1..a15aadc40f9 100644 --- a/mcs/class/corlib/Test/System.Collections/ReadOnlyCollectionBaseTest.cs +++ b/mcs/class/corlib/Test/System.Collections/ReadOnlyCollectionBaseTest.cs @@ -14,7 +14,7 @@ using System.Collections; using NUnit.Framework; namespace MonoTests.System.Collections { - public class ReadOnlyCollectionBaseTest : TestCase { + public class ReadOnlyCollectionBaseTest { // We need a concrete class to test the abstract base class public class ConcreteReadOnlyCollection : ReadOnlyCollectionBase { @@ -24,23 +24,25 @@ namespace MonoTests.System.Collections { } // Make sure that the Count is 0 for a new object + [Test] public void TestZeroCountOnNew() { ConcreteReadOnlyCollection myCollection; myCollection = new ConcreteReadOnlyCollection(); #if NET_2_0 - Assert (-1 == myCollection.Count); + Assert.IsTrue (-1 == myCollection.Count); #else - Assert ( 0 == myCollection.Count); + Assert.IsTrue ( 0 == myCollection.Count); #endif } // Make sure we get an object from GetEnumerator() + [Test] public void TestGetEnumerator() { ConcreteReadOnlyCollection myCollection; myCollection = new ConcreteReadOnlyCollection(); - Assert(null != myCollection.GetEnumerator()); + Assert.IsTrue (null != myCollection.GetEnumerator()); } } } diff --git a/mcs/class/corlib/Test/System.Collections/StackTest.cs b/mcs/class/corlib/Test/System.Collections/StackTest.cs index 5ad657e1d94..3e40dfb9811 100644 --- a/mcs/class/corlib/Test/System.Collections/StackTest.cs +++ b/mcs/class/corlib/Test/System.Collections/StackTest.cs @@ -16,27 +16,30 @@ using NUnit.Framework; namespace MonoTests.System.Collections { [TestFixture] - public class StackTest: Assertion + public class StackTest { private Stack stack1; private Stack stack2; private Stack stackInt; + [Test] public void TestConstructor() { - AssertEquals(false, stack1 == null); + Assert.AreEqual (stack1 == null, false); } + [Test] public void TestICollectionConstructor1() { Stack stackTest = new Stack(new int[] {0, 1, 2, 3, 4}); for (int i = 4; i >= 0; i--) - AssertEquals(i, stackTest.Pop()); + Assert.AreEqual (stackTest.Pop(), i); - AssertEquals(0, stackTest.Count); + Assert.AreEqual (stackTest.Count, 0); } + [Test] public void TestICollectionConstructor2() { bool exceptionThrown = false; @@ -44,19 +47,21 @@ namespace MonoTests.System.Collections Stack stackTest = new Stack(null); } catch (ArgumentNullException e) { exceptionThrown = true; - AssertEquals("ParamName must be \"col\"","col",e.ParamName); + Assert.AreEqual ("col", e.ParamName, "ParamName must be \"col\""); } - Assert("null argument must throw ArgumentNullException", exceptionThrown); + Assert.IsTrue (exceptionThrown, "null argument must throw ArgumentNullException"); } + [Test] public void TestIntConstructor1() { Stack stackTest = new Stack(50); - Assert(stackTest != null); + Assert.IsTrue (stackTest != null); } + [Test] public void TestIntConstructor2() { bool exceptionThrown = false; @@ -66,11 +71,12 @@ namespace MonoTests.System.Collections catch (ArgumentOutOfRangeException e) { exceptionThrown = true; - AssertEquals("ParamName must be \"initialCapacity\"","initialCapacity",e.ParamName); + Assert.AreEqual ("initialCapacity", e.ParamName, "ParamName must be \"initialCapacity\""); } - Assert("negative argument must throw ArgumentOutOfRangeException", exceptionThrown); + Assert.IsTrue (exceptionThrown, "negative argument must throw ArgumentOutOfRangeException"); } + [Test] public void TestCount() { Stack stackTest = new Stack(); @@ -80,20 +86,23 @@ namespace MonoTests.System.Collections stackTest.Push(0); stackTest.Push(50); - AssertEquals(4, stackTest.Count); + Assert.AreEqual (stackTest.Count, 4); } + [Test] public void TestIsSyncronized() { - AssertEquals(false, stack1.IsSynchronized); - AssertEquals(true, Stack.Synchronized(stack1).IsSynchronized); + Assert.AreEqual (stack1.IsSynchronized, false); + Assert.AreEqual (Stack.Synchronized(stack1).IsSynchronized, true); } + [Test] public void TestSyncRoot() { - AssertEquals(false, stack1.SyncRoot == null); + Assert.AreEqual (stack1.SyncRoot == null, false); } + [Test] public void TestGetEnumerator1() { stackInt.Pop(); @@ -102,16 +111,17 @@ namespace MonoTests.System.Collections foreach (int i in stackInt) { - AssertEquals(j--, i); + Assert.AreEqual (i, j--); } stackInt.Clear(); IEnumerator e = stackInt.GetEnumerator(); - AssertEquals(false, e.MoveNext()); + Assert.AreEqual (e.MoveNext(), false); } + [Test] public void TestGetEnumerator2() { @@ -120,10 +130,11 @@ namespace MonoTests.System.Collections { // Tests InvalidOperationException if enumerator is uninitialized Object o = e.Current; - Fail("InvalidOperationException should be thrown"); + Assert.Fail ("InvalidOperationException should be thrown"); } catch (InvalidOperationException) {} } + [Test] public void TestGetEnumerator3() { @@ -133,30 +144,32 @@ namespace MonoTests.System.Collections { // Tests InvalidOperationException if enumeration has ended Object o = e.Current; - Fail("InvalidOperationException should be thrown"); + Assert.Fail ("InvalidOperationException should be thrown"); } catch (InvalidOperationException) {} } + [Test] public void TestEnumeratorReset1() { IEnumerator e = stackInt.GetEnumerator(); e.MoveNext(); - AssertEquals("current value", 4, e.Current); + Assert.AreEqual (4, e.Current, "current value"); e.MoveNext(); e.Reset(); e.MoveNext(); - AssertEquals("current value after reset", 4, e.Current); + Assert.AreEqual (4, e.Current, "current value after reset"); } + [Test] public void TestEnumeratorReset2() { IEnumerator e = stackInt.GetEnumerator(); e.MoveNext(); - AssertEquals("current value", 4, e.Current); + Assert.AreEqual (4, e.Current, "current value"); // modifies underlying the stack. Reset must throw InvalidOperationException stackInt.Push(5); @@ -164,11 +177,12 @@ namespace MonoTests.System.Collections try { e.Reset(); - Fail("InvalidOperationException should be thrown"); + Assert.Fail ("InvalidOperationException should be thrown"); } catch (InvalidOperationException) {} } + [Test] public void TestEnumeratorMoveNextException() { IEnumerator e = stackInt.GetEnumerator(); @@ -179,29 +193,32 @@ namespace MonoTests.System.Collections try { e.MoveNext(); - Fail("InvalidOperationException should be thrown"); + Assert.Fail ("InvalidOperationException should be thrown"); } catch (InvalidOperationException) {} } + [Test] public void TestClear() { stackInt.Clear(); - AssertEquals(0, stackInt.Count); + Assert.AreEqual (stackInt.Count, 0); } + [Test] public void TestClone() { Stack clone = (Stack)stackInt.Clone(); while (stackInt.Count > 0) { - AssertEquals(stackInt.Pop(), clone.Pop()); + Assert.AreEqual (clone.Pop(), stackInt.Pop()); } } + [Test] public void TestContains() { string toLocate = "test"; @@ -213,28 +230,29 @@ namespace MonoTests.System.Collections stackInt.Push(null); - Assert(stackInt.Contains(toLocate)); + Assert.IsTrue (stackInt.Contains(toLocate)); - Assert("must contain null", stackInt.Contains(null)); + Assert.IsTrue (stackInt.Contains(null), "must contain null"); stackInt.Pop(); stackInt.Pop(); - Assert(stackInt.Contains(toLocate)); + Assert.IsTrue (stackInt.Contains(toLocate)); stackInt.Pop(); - Assert(!stackInt.Contains(toLocate)); + Assert.IsTrue (!stackInt.Contains(toLocate)); stackInt.Push(null); - Assert(stackInt.Contains(null)); + Assert.IsTrue (stackInt.Contains(null)); stackInt.Pop(); - Assert(!stackInt.Contains(null)); + Assert.IsTrue (!stackInt.Contains(null)); } + [Test] public void TestCopyTo() { int[] arr = new int[stackInt.Count - 1]; @@ -243,46 +261,46 @@ namespace MonoTests.System.Collections try { stackInt.CopyTo(null, 0); - Fail("Should throw an ArgumentNullException"); + Assert.Fail ("Should throw an ArgumentNullException"); } catch (ArgumentNullException e) { - AssertEquals("ParamName must be \"array\"","array",e.ParamName); + Assert.AreEqual ("array", e.ParamName, "ParamName must be \"array\""); } try { stackInt.CopyTo(arr, -1); - Fail("Should throw an ArgumentOutOfRangeException"); + Assert.Fail ("Should throw an ArgumentOutOfRangeException"); } catch (ArgumentOutOfRangeException e) { - AssertEquals("ParamName must be \"index\"","index",e.ParamName); + Assert.AreEqual ("index", e.ParamName, "ParamName must be \"index\""); } try { stackInt.CopyTo(arrMulti = new int[1, 1], 1); - Fail("Should throw an ArgumentException"); + Assert.Fail ("Should throw an ArgumentException"); } catch (ArgumentException) {} try { stackInt.CopyTo(arr = new int[2], 3); - Fail("Should throw an ArgumentException"); + Assert.Fail ("Should throw an ArgumentException"); } catch (ArgumentException) {} try { stackInt.CopyTo(arr = new int[3], 2); - Fail("Should throw an ArgumentException"); + Assert.Fail ("Should throw an ArgumentException"); } catch (ArgumentException) {} try { stackInt.CopyTo(arr = new int[2], 3); - Fail("Should throw an ArgumentException"); + Assert.Fail ("Should throw an ArgumentException"); } catch (ArgumentException) {} @@ -294,10 +312,11 @@ namespace MonoTests.System.Collections for (int i = 0; i < 4; i++) { - AssertEquals(j--, arr[i]); + Assert.AreEqual (arr[i], j--); } } + [Test] public void TestSyncronized() { Stack syncStack = Stack.Synchronized(stackInt); @@ -305,53 +324,57 @@ namespace MonoTests.System.Collections syncStack.Push(5); for (int i = 5; i >= 0; i--) - AssertEquals(i, syncStack.Pop()); + Assert.AreEqual (syncStack.Pop(), i); } + [Test] public void TestPushPeekPop() { stackInt.Pop(); int topVal = (int)stackInt.Peek(); - AssertEquals(3, topVal); + Assert.AreEqual (topVal, 3); - AssertEquals(4, stackInt.Count); + Assert.AreEqual (stackInt.Count, 4); - AssertEquals(topVal, stackInt.Pop()); + Assert.AreEqual (stackInt.Pop(), topVal); - AssertEquals(2, stackInt.Pop()); + Assert.AreEqual (stackInt.Pop(), 2); Stack test = new Stack(); test.Push(null); - AssertEquals(null, test.Pop()); + Assert.AreEqual (test.Pop(), null); } + [Test] public void TestPop() { for (int i = 4; i >= 0; i--) { - AssertEquals(i, stackInt.Pop()); + Assert.AreEqual (stackInt.Pop(), i); } try { stackInt.Pop(); - Fail("must throw InvalidOperationException"); + Assert.Fail ("must throw InvalidOperationException"); } catch (InvalidOperationException){ } } + [Test] public void TestToArray() { object[] arr = stackInt.ToArray(); - AssertEquals(stackInt.Count, arr.Length); + Assert.AreEqual (arr.Length, stackInt.Count); for (int i = 0; i < 5; i++) - AssertEquals(arr[i], stackInt.Pop()); + Assert.AreEqual (stackInt.Pop(), arr[i]); } + [Test] public void TestResize() { Stack myStack = new Stack(20); @@ -359,16 +382,17 @@ namespace MonoTests.System.Collections for (int i = 0; i < 500; i++) { myStack.Push(i); - AssertEquals("push count test",i+1, myStack.Count); + Assert.AreEqual (i+1, myStack.Count, "push count test"); } for (int i = 499; i >= 0; i--) { - AssertEquals(i, myStack.Pop()); - AssertEquals("pop count test",i, myStack.Count); + Assert.AreEqual (myStack.Pop(), i); + Assert.AreEqual (i, myStack.Count, "pop count test"); } } + [Test] public void TestEmptyCopyTo () { Stack stack = new Stack (); diff --git a/mcs/class/corlib/Test/System.Diagnostics/ChangeLog b/mcs/class/corlib/Test/System.Diagnostics/ChangeLog index fbac0698bba..9fc87b67883 100644 --- a/mcs/class/corlib/Test/System.Diagnostics/ChangeLog +++ b/mcs/class/corlib/Test/System.Diagnostics/ChangeLog @@ -1,3 +1,12 @@ +2009-06-30 Zoltan Varga + + * DebugTest.cs TextWriterTraceListenerTest.cs: Convert all tests to + new-style nunit classes/methods. + +2009-06-25 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2007-05-11 Gert Driesen * DebuggerDisplayAttributeTest.cs: Make test forward compatible. diff --git a/mcs/class/corlib/Test/System.Diagnostics/DebugTest.cs b/mcs/class/corlib/Test/System.Diagnostics/DebugTest.cs index baf9e4a9541..45388384db6 100644 --- a/mcs/class/corlib/Test/System.Diagnostics/DebugTest.cs +++ b/mcs/class/corlib/Test/System.Diagnostics/DebugTest.cs @@ -13,44 +13,53 @@ namespace MonoTests.System.Diagnostics { public class DebugTest { - private class DebugTest1 : TestCase + [TestFixture] + private class DebugTest1 { - protected override void SetUp() + [SetUp] + protected void SetUp() { Debug.Listeners.Add(new TextWriterTraceListener(Console.Error)); } - protected override void TearDown() + [TearDown] + protected void TearDown() { } - + + [Test] public void TestAssert() { Debug.Assert(false, "Testing Assertions"); } - - public void TestFail() + + [Test] + public void TestFail () { Debug.Fail("Testing Fail method"); } - + + [Test] public void TestWrite() { Debug.Write("Testing Write", "Testing the output of the Write method"); } - + + [Test] public void TestWriteIf() { Debug.WriteIf(true, "Testing WriteIf"); Debug.WriteIf(false, "Testing WriteIf", "Passed false"); } - + + [Test] public void TestWriteLine() { Debug.WriteLine("Testing WriteLine method"); } - + + [Test] public void TestWriteLineIf() { Debug.WriteLineIf(true, "Testing WriteLineIf"); diff --git a/mcs/class/corlib/Test/System.Diagnostics/StackFrameTest.cs b/mcs/class/corlib/Test/System.Diagnostics/StackFrameTest.cs index 867bb39272f..033cc08539d 100644 --- a/mcs/class/corlib/Test/System.Diagnostics/StackFrameTest.cs +++ b/mcs/class/corlib/Test/System.Diagnostics/StackFrameTest.cs @@ -19,7 +19,7 @@ namespace MonoTests.System.Diagnostics /// location inside it. /// [TestFixture] - public class StackFrameTest1 : Assertion + public class StackFrameTest1 { private StackFrame frame1; private StackFrame frame2; @@ -44,13 +44,13 @@ namespace MonoTests.System.Diagnostics [Test] public void TestGetFileName () { - AssertEquals ("File name (1)", - "dir/someFile", - frame1.GetFileName ()); + Assert.AreEqual ("dir/someFile", + frame1.GetFileName (), + "File name (1)"); - AssertEquals ("File name (2)", - "SomeFile2.cs", - frame2.GetFileName ()); + Assert.AreEqual ("SomeFile2.cs", + frame2.GetFileName (), + "File name (2)"); } /// @@ -59,13 +59,13 @@ namespace MonoTests.System.Diagnostics [Test] public void TestGetFileLineNumber () { - AssertEquals ("Line number (1)", - 13, - frame1.GetFileLineNumber ()); + Assert.AreEqual (13, + frame1.GetFileLineNumber (), + "Line number (1)"); - AssertEquals ("Line number (2)", - 24, - frame2.GetFileLineNumber ()); + Assert.AreEqual (24, + frame2.GetFileLineNumber (), + "Line number (2)"); } /// @@ -74,13 +74,13 @@ namespace MonoTests.System.Diagnostics [Test] public void TestGetFileColumnNumber () { - AssertEquals ("Column number (1)", - 45, - frame1.GetFileColumnNumber ()); + Assert.AreEqual (45, + frame1.GetFileColumnNumber (), + "Column number (1)"); - AssertEquals ("Column number (2)", - 0, - frame2.GetFileColumnNumber ()); + Assert.AreEqual (0, + frame2.GetFileColumnNumber (), + "Column number (2)"); } /// @@ -89,23 +89,23 @@ namespace MonoTests.System.Diagnostics [Test] public void TestGetMethod () { - Assert ("Method not null (1)", (frame1.GetMethod () != null)); - - AssertEquals ("Class declaring the method (1)", - this.GetType (), - frame1.GetMethod ().DeclaringType); - AssertEquals ("Method name (1)", - "SetUp", - frame1.GetMethod ().Name); - - Assert ("Method not null (2)", (frame2.GetMethod () != null)); - - AssertEquals ("Class declaring the method (2)", - this.GetType (), - frame2.GetMethod ().DeclaringType); - AssertEquals ("Method name (2)", - "SetUp", - frame2.GetMethod ().Name); + Assert.IsTrue ((frame1.GetMethod () != null), "Method not null (1)"); + + Assert.AreEqual (this.GetType (), + frame1.GetMethod ().DeclaringType, + "Class declaring the method (1)"); + Assert.AreEqual ("SetUp", + frame1.GetMethod ().Name, + "Method name (1)"); + + Assert.IsTrue ((frame2.GetMethod () != null), "Method not null (2)"); + + Assert.AreEqual (this.GetType (), + frame2.GetMethod ().DeclaringType, + "Class declaring the method (2)"); + Assert.AreEqual ("SetUp", + frame2.GetMethod ().Name, + "Method name (2)"); } } @@ -119,7 +119,7 @@ namespace MonoTests.System.Diagnostics /// debug information? /// [TestFixture] - public class StackFrameTest2 : Assertion + public class StackFrameTest2 { private StackFrame frame1; private StackFrame frame2; @@ -147,18 +147,17 @@ namespace MonoTests.System.Diagnostics [Test] public void TestGetFileName1 () { - AssertNull ("File name (1)", - frame1.GetFileName ()); + Assert.IsNull (frame1.GetFileName (), + "File name (1)"); } [Test] public void TestGetFileName2 () { - AssertNotNull ("File name not null", frame2.GetFileName ()); - Assert ("File name not empty", frame2.GetFileName ().Length != 0); - Assert ("File name (2) " + frame2.GetFileName () - + " ends with StackFrameTest.cs", - frame2.GetFileName ().EndsWith ("StackFrameTest.cs")); + Assert.IsNotNull (frame2.GetFileName (), "File name not null"); + Assert.IsTrue (frame2.GetFileName ().Length != 0, "File name not empty"); + Assert.IsTrue (frame2.GetFileName ().EndsWith ("StackFrameTest.cs"), + "File name (2) " + frame2.GetFileName () + " ends with StackFrameTest.cs"); } /// @@ -167,17 +166,17 @@ namespace MonoTests.System.Diagnostics [Test] public void TestGetFileLineNumber () { - AssertEquals ("Line number (1)", - 0, - frame1.GetFileLineNumber ()); + Assert.AreEqual (0, + frame1.GetFileLineNumber (), + "Line number (1)"); - AssertEquals ("Line number (2)", - 132, - frame2.GetFileLineNumber ()); + Assert.AreEqual (132, + frame2.GetFileLineNumber (), + "Line number (2)"); - AssertEquals ("Line number (3)", - 0, - frame3.GetFileLineNumber ()); + Assert.AreEqual (0, + frame3.GetFileLineNumber (), + "Line number (3)"); } /// @@ -187,17 +186,17 @@ namespace MonoTests.System.Diagnostics [Category ("NotWorking")] // bug #45730 - Column numbers always zero public void TestGetFileColumnNumber () { - AssertEquals ("Column number (1)", - 0, - frame1.GetFileColumnNumber ()); + Assert.AreEqual (0, + frame1.GetFileColumnNumber (), + "Column number (1)"); - AssertEquals ("Column number (2)", - 4, - frame2.GetFileColumnNumber ()); + Assert.AreEqual (4, + frame2.GetFileColumnNumber (), + "Column number (2)"); - AssertEquals ("Column number (3)", - 0, - frame3.GetFileColumnNumber ()); + Assert.AreEqual (0, + frame3.GetFileColumnNumber (), + "Column number (3)"); } /// @@ -206,35 +205,35 @@ namespace MonoTests.System.Diagnostics [Test] public void TestGetMethod () { - Assert ("Method not null (1)", - (frame1.GetMethod () != null)); - - AssertEquals ("Class declaring the method (1)", - this.GetType (), - frame1.GetMethod ().DeclaringType); - AssertEquals ("Method name (1)", - "SetUp", - frame1.GetMethod ().Name); - - Assert ("Method not null (2)", - (frame2.GetMethod () != null)); - - AssertEquals ("Class declaring the method (2)", - this.GetType (), - frame2.GetMethod ().DeclaringType); - AssertEquals ("Method name (2)", - "SetUp", - frame2.GetMethod ().Name); - - Assert ("Method not null (3)", - (frame3.GetMethod () != null)); - - AssertEquals ("Class declaring the method (3)", - this.GetType (), - frame3.GetMethod ().DeclaringType); - AssertEquals ("Method name (3)", - "SetUp", - frame3.GetMethod ().Name); + Assert.IsNotNull (frame1.GetMethod (), + "Method not null (1)"); + + Assert.AreEqual (this.GetType (), + frame1.GetMethod ().DeclaringType, + "Class declaring the method (1)"); + Assert.AreEqual ("SetUp", + frame1.GetMethod ().Name, + "Method name (1)"); + + Assert.IsNotNull (frame2.GetMethod (), + "Method not null (2)"); + + Assert.AreEqual (this.GetType (), + frame2.GetMethod ().DeclaringType, + "Class declaring the method (2)"); + Assert.AreEqual ("SetUp", + frame2.GetMethod ().Name, + "Method name (2)"); + + Assert.IsNotNull (frame3.GetMethod (), + "Method not null (3)"); + + Assert.AreEqual (this.GetType (), + frame3.GetMethod ().DeclaringType, + "Class declaring the method (3)"); + Assert.AreEqual ("SetUp", + frame3.GetMethod ().Name, + "Method name (3)"); } } @@ -249,7 +248,7 @@ namespace MonoTests.System.Diagnostics /// debug information? /// [TestFixture] - public class StackFrameTest3 : Assertion + public class StackFrameTest3 { protected StackFrame frame1; protected StackFrame frame2; @@ -283,15 +282,14 @@ namespace MonoTests.System.Diagnostics [Test] public void TestGetFileName () { - AssertNull ("File name (1)", - frame1.GetFileName ()); + Assert.IsNull (frame1.GetFileName (), + "File name (1)"); - AssertNotNull ("File name (2) should not be null", - frame2.GetFileName ()); + Assert.IsNotNull (frame2.GetFileName (), + "File name (2) should not be null"); - Assert ("File name (2) " + frame2.GetFileName () - + " ends with StackFrameTest.cs", - frame2.GetFileName ().EndsWith ("StackFrameTest.cs")); + Assert.IsTrue (frame2.GetFileName ().EndsWith ("StackFrameTest.cs"), + "File name (2) " + frame2.GetFileName () + " ends with StackFrameTest.cs"); } /// @@ -303,13 +301,13 @@ namespace MonoTests.System.Diagnostics #endif public void TestGetFileLineNumber () { - AssertEquals ("Line number (1)", - 0, - frame1.GetFileLineNumber ()); + Assert.AreEqual (0, + frame1.GetFileLineNumber (), + "Line number (1)"); - AssertEquals ("Line number (2)", - 261, - frame2.GetFileLineNumber ()); + Assert.AreEqual (260, + frame2.GetFileLineNumber (), + "Line number (2)"); } /// @@ -322,13 +320,13 @@ namespace MonoTests.System.Diagnostics [Category ("NotWorking")] // bug #45730 - Column numbers always zero public void TestGetFileColumnNumber () { - AssertEquals ("Column number (1)", - 0, - frame1.GetFileColumnNumber ()); + Assert.AreEqual (0, + frame1.GetFileColumnNumber (), + "Column number (1)"); - AssertEquals ("Column number (2)", - 4, - frame2.GetFileColumnNumber ()); + Assert.AreEqual (4, + frame2.GetFileColumnNumber (), + "Column number (2)"); } /// @@ -337,17 +335,17 @@ namespace MonoTests.System.Diagnostics [Test] public void TestGetMethod () { - Assert ("Method not null (1)", (frame1.GetMethod () != null)); + Assert.IsTrue ((frame1.GetMethod () != null), "Method not null (1)"); - Assert ("Method not null (2)", (frame2.GetMethod () != null)); + Assert.IsTrue ((frame2.GetMethod () != null), "Method not null (2)"); - AssertEquals ("Class declaring the method (2)", - this.GetType (), - frame2.GetMethod ().DeclaringType); + Assert.AreEqual (this.GetType (), + frame2.GetMethod ().DeclaringType, + "Class declaring the method (2)"); - AssertEquals ("Method name (2)", - "SetUp", - frame2.GetMethod ().Name); + Assert.AreEqual ("SetUp", + frame2.GetMethod ().Name, + "Method name (2)"); } } } diff --git a/mcs/class/corlib/Test/System.Diagnostics/TextWriterTraceListenerTest.cs b/mcs/class/corlib/Test/System.Diagnostics/TextWriterTraceListenerTest.cs index edbe5970d2e..f210fd37a59 100644 --- a/mcs/class/corlib/Test/System.Diagnostics/TextWriterTraceListenerTest.cs +++ b/mcs/class/corlib/Test/System.Diagnostics/TextWriterTraceListenerTest.cs @@ -15,36 +15,41 @@ using NUnit.Framework; namespace MonoTests.System.Diagnostics { [TestFixture] - public class TextWriterTraceListenerTest1 : TestCase + public class TextWriterTraceListenerTest1 { private TextWriterTraceListener listener; - - protected override void SetUp() + + [SetUp] + protected void SetUp() { listener = new TextWriterTraceListener(); listener.Writer = Console.Out; } - protected override void TearDown() + [TearDown] + protected void TearDown() { listener = null; } - + + [Test] public void TestWrite() { - Assert("Null Listener", !(listener == null)); - Assert("Null Writer", !(listener.Writer == null)); + Assert.IsTrue(!(listener == null), "Null Listener"); + Assert.IsTrue(!(listener.Writer == null), "Null Writer"); listener.Write("Test Message\n"); } + [Test] public void TestWriteLine() { - Assert("Null Listener", !(listener == null)); - Assert("Null Writer", !(listener.Writer == null)); + Assert.IsTrue(!(listener == null), "Null Listener"); + Assert.IsTrue(!(listener.Writer == null), "Null Writer"); listener.WriteLine("Test WriteLine Message"); } + [Test] public void TestFlush() { listener.Flush(); diff --git a/mcs/class/corlib/Test/System.Globalization/CalendarTest.cs b/mcs/class/corlib/Test/System.Globalization/CalendarTest.cs index f366d51a997..0987da7aed6 100644 --- a/mcs/class/corlib/Test/System.Globalization/CalendarTest.cs +++ b/mcs/class/corlib/Test/System.Globalization/CalendarTest.cs @@ -121,7 +121,8 @@ sealed class Date { } } // class Date -public class CalendarTest : TestCase { +[TestFixture] +public class CalendarTest { private Calendar[] acal; private GregorianCalendar gcal; private JulianCalendar jucal; @@ -138,7 +139,8 @@ public class CalendarTest : TestCase { private KoreanLunisolarCalendar klcal; #endif - protected override void SetUp() { + [SetUp] + protected void SetUp() { gcal = new GregorianCalendar(); jucal = new JulianCalendar(); hical = new HijriCalendar(); @@ -175,13 +177,13 @@ public class CalendarTest : TestCase { StringWriter sw = new StringWriter(); sw.Write("Calendar {0} computes wrong DateTime.", cal); - AssertEquals(sw.ToString(), timeG, time); + Assert.AreEqual(timeG, time, sw.ToString()); sw = new StringWriter(); Date ndate = new Date(); ndate.FromDateTime(cal, time); sw.Write("Calendar {0} computes wrong date", cal); - AssertEquals(sw.ToString(), date, ndate); + Assert.AreEqual(date, ndate, sw.ToString()); } } @@ -189,6 +191,7 @@ public class CalendarTest : TestCase { // Calendrical Calcualation. Please note that the CLR uses another // epoch for the HijriCalendar, which might be the perfect thing // to do. + [Test] public void TestCCTable() { // Gr Ju Hi He Ja Ta Ko TB RowCheck(new Date(24,9,70,1), @@ -441,97 +444,101 @@ public class CalendarTest : TestCase { new Date(18,7,2637,1)); } + [Test] public void TestCalendarType() { GregorianCalendar gc = new GregorianCalendar( GregorianCalendarTypes.Arabic); - AssertEquals("A01 Gregorian ctor " + - "with GregorianCalendarTypes parameter", - GregorianCalendarTypes.Arabic, - gc.CalendarType); + Assert.AreEqual(GregorianCalendarTypes.Arabic, + gc.CalendarType, + "A01 Gregorian ctor with GregorianCalendarTypes parameter"); gc.CalendarType = GregorianCalendarTypes.MiddleEastFrench; - AssertEquals("A02 GregorianCalendar.CalendarType", - GregorianCalendarTypes.MiddleEastFrench, - gc.CalendarType); + Assert.AreEqual(GregorianCalendarTypes.MiddleEastFrench, + gc.CalendarType, + "A02 GregorianCalendar.CalendarType"); + } + [Test] public void TestStandardEras() { - AssertEquals("B01 ADEra", 1, GregorianCalendar.ADEra); - AssertEquals("B02 HebrewEra", 1, HebrewCalendar.HebrewEra); - AssertEquals("B03 HjriEra", 1, HijriCalendar.HijriEra); - AssertEquals("B04 JulianEra", 1, JulianCalendar.JulianEra); - AssertEquals("B05 KoreanEra", 1, KoreanCalendar.KoreanEra); - AssertEquals("B06 ThaiBuddhistEra", 1, - ThaiBuddhistCalendar.ThaiBuddhistEra); + Assert.AreEqual(1, GregorianCalendar.ADEra, "B01 ADEra"); + Assert.AreEqual(1, HebrewCalendar.HebrewEra, "B02 HebrewEra"); + Assert.AreEqual(1, HijriCalendar.HijriEra, "B03 HjriEra"); + Assert.AreEqual(1, JulianCalendar.JulianEra, "B04 JulianEra"); + Assert.AreEqual(1, KoreanCalendar.KoreanEra, "B05 KoreanEra"); + Assert.AreEqual(1, ThaiBuddhistCalendar.ThaiBuddhistEra, "B06 ThaiBuddhistEra"); + #if NET_2_0 - AssertEquals("CNLunisor", 1, ChineseLunisolarCalendar.ChineseEra); - AssertEquals("JPLunisor", 1, JapaneseLunisolarCalendar.JapaneseEra); - AssertEquals("KRLunisor", 1, KoreanLunisolarCalendar.GregorianEra); + Assert.AreEqual(1, ChineseLunisolarCalendar.ChineseEra, "CNLunisor"); + Assert.AreEqual(1, JapaneseLunisolarCalendar.JapaneseEra, "JPLunisor"); + Assert.AreEqual(1, KoreanLunisolarCalendar.GregorianEra, "KRLunisor"); #endif } + [Test] public void TestCurrentEra() { - AssertEquals("C01 GregorianCalendar.CurrentEra", - 0, GregorianCalendar.CurrentEra); - AssertEquals("C02 HebrewCalendar.CurrentEra", - 0, HebrewCalendar.CurrentEra); - AssertEquals("C03 HijriCalendar.CurrentEra", - 0, HijriCalendar.CurrentEra); - AssertEquals("C04 JapaneseCalendar.CurrentEra", - 0, JapaneseCalendar.CurrentEra); - AssertEquals("C05 JulianCalendar.CurrentEra", - 0, JulianCalendar.CurrentEra); - AssertEquals("C06 KoreanCalendar.CurrentEra", - 0, KoreanCalendar.CurrentEra); - AssertEquals("C07 TaiwanCalendar.CurrentEra", - 0, TaiwanCalendar.CurrentEra); - AssertEquals("C08 ThaiBuddhistCalendar.CurrentEra", - 0, - ThaiBuddhistCalendar.CurrentEra); + Assert.AreEqual(0, GregorianCalendar.CurrentEra, + "C01 GregorianCalendar.CurrentEra"); + Assert.AreEqual(0, HebrewCalendar.CurrentEra, + "C02 HebrewCalendar.CurrentEra"); + Assert.AreEqual(0, HijriCalendar.CurrentEra, + "C03 HijriCalendar.CurrentEra"); + Assert.AreEqual(0, JapaneseCalendar.CurrentEra, + "C04 JapaneseCalendar.CurrentEra"); + Assert.AreEqual(0, JulianCalendar.CurrentEra, + "C05 JulianCalendar.CurrentEra"); + Assert.AreEqual(0, KoreanCalendar.CurrentEra, + "C06 KoreanCalendar.CurrentEra"); + Assert.AreEqual(0, TaiwanCalendar.CurrentEra, + "C07 TaiwanCalendar.CurrentEra"); + Assert.AreEqual(0, ThaiBuddhistCalendar.CurrentEra, + "C08 ThaiBuddhistCalendar.CurrentEra"); } + [Test] public void TestErasProperty() { foreach (Calendar cal in acal) { int check = 1; if (cal is JapaneseCalendar) check = 4; - AssertEquals(String.Format("D01 {0}.Eras.Length", cal), - check, cal.Eras.Length); + Assert.AreEqual(check, cal.Eras.Length, + String.Format("D01 {0}.Eras.Length", cal)); cal.Eras[0] = 29; - Assert(String.Format("D02 {0}.Eras readonly", cal), - cal.Eras[0] != 29); + Assert.IsTrue(cal.Eras[0] != 29, String.Format("D02 {0}.Eras readonly", cal)); } } #if NET_2_0 [Category ("NotWorking")] + [Test] public void TestErasProperty2() { - AssertEquals("cn", 1, clcal.Eras.Length); - AssertEquals("tw", 1, tlcal.Eras.Length); - AssertEquals("jp", 2, jlcal.Eras.Length); - AssertEquals("kr", 1, klcal.Eras.Length); + Assert.AreEqual(1, clcal.Eras.Length, "cn"); + Assert.AreEqual(1, tlcal.Eras.Length, "tw"); + Assert.AreEqual(2, jlcal.Eras.Length, "jp"); + Assert.AreEqual(1, klcal.Eras.Length, "kr"); - AssertEquals("jp.1", 4, jlcal.Eras [0]); - AssertEquals("jp.2", 3, jlcal.Eras [1]); + Assert.AreEqual(4, jlcal.Eras [0], "jp.1"); + Assert.AreEqual(3, jlcal.Eras [1], "jp.2"); } #endif + [Test] public void TestTwoDigitYearMax() { - AssertEquals("E01 TwoDigitYearMax GregorianCalendar", - 2029, gcal.TwoDigitYearMax); - AssertEquals("E02 TwoDigitYearMax HebrewCalendar", - 5790, hecal.TwoDigitYearMax); - AssertEquals("E03 TwoDigitYearMax HijriCalendar", - 1451, hical.TwoDigitYearMax); - AssertEquals("E04 TwoDigitYearMax JapaneseCalendar", - 99, jacal.TwoDigitYearMax); - AssertEquals("E05 TwoDigitYearMax JulianCalendar", - 2029, jucal.TwoDigitYearMax); - AssertEquals("E06 TwoDigitYearMax KoreanCalendar", - 4362, kcal.TwoDigitYearMax); - AssertEquals("E07 TwoDigitYearMax TaiwanCalendar", - 99, tacal.TwoDigitYearMax); - AssertEquals("E08 TwoDigitYearMax ThaiBuddhistCalendar", - 2572, tbcal.TwoDigitYearMax); + Assert.AreEqual(2029, gcal.TwoDigitYearMax, + "E01 TwoDigitYearMax GregorianCalendar"); + Assert.AreEqual(5790, hecal.TwoDigitYearMax, + "E02 TwoDigitYearMax HebrewCalendar"); + Assert.AreEqual(1451, hical.TwoDigitYearMax, + "E03 TwoDigitYearMax HijriCalendar"); + Assert.AreEqual(99, jacal.TwoDigitYearMax, + "E04 TwoDigitYearMax JapaneseCalendar"); + Assert.AreEqual(2029, jucal.TwoDigitYearMax, + "E05 TwoDigitYearMax JulianCalendar"); + Assert.AreEqual(4362, kcal.TwoDigitYearMax, + "E06 TwoDigitYearMax KoreanCalendar"); + Assert.AreEqual(99, tacal.TwoDigitYearMax, + "E07 TwoDigitYearMax TaiwanCalendar"); + Assert.AreEqual(2572, tbcal.TwoDigitYearMax, + "E08 TwoDigitYearMax ThaiBuddhistCalendar"); foreach (Calendar cal in acal) { bool exception = false; try { @@ -540,9 +547,9 @@ public class CalendarTest : TestCase { catch (ArgumentOutOfRangeException) { exception = true; } - Assert(String.Format("E09 {0}.TwoDigitYearMax 99 " + - " out of range exception", cal), - exception); + Assert.IsTrue(exception, + String.Format("E09 {0}.TwoDigitYearMax 99 " + + " out of range exception", cal)); exception = false; int m = 10000; @@ -553,10 +560,10 @@ public class CalendarTest : TestCase { catch (ArgumentException) { exception = true; } - Assert(String.Format("E10 {0}.TwoDigitYearMax out " + - " of range exception value {1}", - cal, m), - exception); + Assert.IsTrue(exception, + String.Format("E10 {0}.TwoDigitYearMax out " + + " of range exception value {1}", + cal, m)); } } @@ -565,9 +572,9 @@ public class CalendarTest : TestCase { { HebrewCalendar c = new HebrewCalendar (); int year = c.GetYear (new DateTime (2005, 9, 1)); - AssertEquals (5765, year); + Assert.AreEqual (5765, year); int days = c.GetDaysInMonth (year, 13, 1); - AssertEquals (29, days); + Assert.AreEqual (29, days); } [Test] // bug #81783 @@ -576,15 +583,15 @@ public class CalendarTest : TestCase { GregorianCalendar c = new GregorianCalendar (); DateTime d = new DateTime (2007, 5, 31); DateTime prev = c.AddMonths (d, -1); - AssertEquals ("prev", 4, prev.Month); + Assert.AreEqual (4, prev.Month, "prev"); DateTime next = c.AddMonths (d, 1); - AssertEquals ("next", 6, next.Month); + Assert.AreEqual (6, next.Month, "next"); d = new DateTime (2003, 12, 5); prev = c.AddMonths (d, -13); - AssertEquals ("prev2", new DateTime (2002, 11, 5), prev); + Assert.AreEqual (new DateTime (2002, 11, 5), prev, "prev2"); next = c.AddMonths (d, 6); - AssertEquals ("next2", new DateTime (2004, 6, 5), next); + Assert.AreEqual (new DateTime (2004, 6, 5), next, "next2"); } [Test] @@ -593,9 +600,9 @@ public class CalendarTest : TestCase { GregorianCalendar c = new GregorianCalendar (); DateTime d = new DateTime (2004, 2, 29); DateTime prev = c.AddYears (d, -1); - AssertEquals ("prev", 2, prev.Month); + Assert.AreEqual (2, prev.Month, "prev"); DateTime next = c.AddYears (d, 1); - AssertEquals ("next", 2, next.Month); + Assert.AreEqual (2, next.Month, "next"); } #if NET_2_0 @@ -604,95 +611,96 @@ public class CalendarTest : TestCase { public void GetLeapMonth () { GregorianCalendar gc = new GregorianCalendar (); - AssertEquals ("#1-1", 0, gc.GetLeapMonth (2007)); - AssertEquals ("#1-2", 0, gc.GetLeapMonth (2008)); - AssertEquals ("#1-3", 0, gc.GetLeapMonth (2100)); - AssertEquals ("#1-4", 0, gc.GetLeapMonth (2000)); + Assert.AreEqual (0, gc.GetLeapMonth (2007), "#1-1"); + Assert.AreEqual (0, gc.GetLeapMonth (2008), "#1-2"); + Assert.AreEqual (0, gc.GetLeapMonth (2100), "#1-3"); + Assert.AreEqual (0, gc.GetLeapMonth (2000), "#1-4"); JulianCalendar jc = new JulianCalendar (); - AssertEquals ("#2-1", 0, jc.GetLeapMonth (2007)); - AssertEquals ("#2-2", 0, jc.GetLeapMonth (2008)); - AssertEquals ("#2-3", 0, jc.GetLeapMonth (2100)); - AssertEquals ("#2-4", 0, jc.GetLeapMonth (2000)); - AssertEquals ("#2-5", 0, jc.GetLeapMonth (2009)); - AssertEquals ("#2-6", 0, jc.GetLeapMonth (2010)); + Assert.AreEqual (0, jc.GetLeapMonth (2007), "#2-1"); + Assert.AreEqual (0, jc.GetLeapMonth (2008), "#2-2"); + Assert.AreEqual (0, jc.GetLeapMonth (2100), "#2-3"); + Assert.AreEqual (0, jc.GetLeapMonth (2000), "#2-4"); + Assert.AreEqual (0, jc.GetLeapMonth (2009), "#2-5"); + Assert.AreEqual (0, jc.GetLeapMonth (2010), "#2-6"); HebrewCalendar hc = new HebrewCalendar (); // 3rd, 6th, 8th, 11th 14th and 17th year in every 19 are leap. // 5339 % 19 = 0. - AssertEquals ("#3-1", 0, hc.GetLeapMonth (5343)); - AssertEquals ("#3-2", 0, hc.GetLeapMonth (5344)); - AssertEquals ("#3-3", 7, hc.GetLeapMonth (5345)); - AssertEquals ("#3-4", 0, hc.GetLeapMonth (5346)); - AssertEquals ("#3-5", 7, hc.GetLeapMonth (5347)); - AssertEquals ("#3-6", 0, hc.GetLeapMonth (5348)); - AssertEquals ("#3-7", 0, hc.GetLeapMonth (5349)); + Assert.AreEqual (0, hc.GetLeapMonth (5343), "#3-1"); + Assert.AreEqual (0, hc.GetLeapMonth (5344), "#3-2"); + Assert.AreEqual (7, hc.GetLeapMonth (5345), "#3-3"); + Assert.AreEqual (0, hc.GetLeapMonth (5346), "#3-4"); + Assert.AreEqual (7, hc.GetLeapMonth (5347), "#3-5"); + Assert.AreEqual (0, hc.GetLeapMonth (5348), "#3-6"); + Assert.AreEqual (0, hc.GetLeapMonth (5349), "#3-7"); ThaiBuddhistCalendar tc = new ThaiBuddhistCalendar (); - AssertEquals ("#4-1", 0, tc.GetLeapMonth (2520)); - AssertEquals ("#4-2", 0, tc.GetLeapMonth (2521)); - AssertEquals ("#4-3", 0, tc.GetLeapMonth (2522)); - AssertEquals ("#4-4", 0, tc.GetLeapMonth (2523)); + Assert.AreEqual (0, tc.GetLeapMonth (2520), "#4-1"); + Assert.AreEqual (0, tc.GetLeapMonth (2521), "#4-2"); + Assert.AreEqual (0, tc.GetLeapMonth (2522), "#4-3"); + Assert.AreEqual (0, tc.GetLeapMonth (2523), "#4-4"); ChineseLunisolarCalendar cc = new ChineseLunisolarCalendar (); - AssertEquals ("#5-1", 0, cc.GetLeapMonth (2000)); - AssertEquals ("#5-2", 5, cc.GetLeapMonth (2001)); - AssertEquals ("#5-3", 0, cc.GetLeapMonth (2002)); - AssertEquals ("#5-4", 0, cc.GetLeapMonth (2003)); - AssertEquals ("#5-5", 3, cc.GetLeapMonth (2004)); - AssertEquals ("#5-6", 0, cc.GetLeapMonth (2005)); - AssertEquals ("#5-7", 8, cc.GetLeapMonth (2006)); - AssertEquals ("#5-8", 0, cc.GetLeapMonth (2007)); - AssertEquals ("#5-9", 0, cc.GetLeapMonth (2008)); - AssertEquals ("#5-10", 6, cc.GetLeapMonth (2009)); - AssertEquals ("#5-11", 0, cc.GetLeapMonth (2010)); - AssertEquals ("#5-12", 0, cc.GetLeapMonth (2011)); - AssertEquals ("#5-13", 5, cc.GetLeapMonth (2012)); - AssertEquals ("#5-14", 0, cc.GetLeapMonth (2013)); - AssertEquals ("#5-15", 10, cc.GetLeapMonth (2014)); - AssertEquals ("#5-16", 0, cc.GetLeapMonth (2015)); - AssertEquals ("#5-17", 0, cc.GetLeapMonth (2016)); - AssertEquals ("#5-18", 7, cc.GetLeapMonth (2017)); - AssertEquals ("#5-19", 0, cc.GetLeapMonth (2018)); - AssertEquals ("#5-20", 0, cc.GetLeapMonth (2019)); + Assert.AreEqual (0, cc.GetLeapMonth (2000), "#5-1"); + Assert.AreEqual (5, cc.GetLeapMonth (2001), "#5-2"); + Assert.AreEqual (0, cc.GetLeapMonth (2002), "#5-3"); + Assert.AreEqual (0, cc.GetLeapMonth (2003), "#5-4"); + Assert.AreEqual (3, cc.GetLeapMonth (2004), "#5-5"); + Assert.AreEqual (0, cc.GetLeapMonth (2005), "#5-6"); + Assert.AreEqual (8, cc.GetLeapMonth (2006), "#5-7"); + Assert.AreEqual (0, cc.GetLeapMonth (2007), "#5-8"); + Assert.AreEqual (0, cc.GetLeapMonth (2008), "#5-9"); + Assert.AreEqual (6, cc.GetLeapMonth (2009), "#5-10"); + Assert.AreEqual (0, cc.GetLeapMonth (2010), "#5-11"); + Assert.AreEqual (0, cc.GetLeapMonth (2011), "#5-12"); + Assert.AreEqual (5, cc.GetLeapMonth (2012), "#5-13"); + Assert.AreEqual (0, cc.GetLeapMonth (2013), "#5-14"); + Assert.AreEqual (10, cc.GetLeapMonth (2014), "#5-15"); + Assert.AreEqual (0, cc.GetLeapMonth (2015), "#5-16"); + Assert.AreEqual (0, cc.GetLeapMonth (2016), "#5-17"); + Assert.AreEqual (7, cc.GetLeapMonth (2017), "#5-18"); + Assert.AreEqual (0, cc.GetLeapMonth (2018), "#5-19"); + Assert.AreEqual (0, cc.GetLeapMonth (2019), "#5-20"); KoreanLunisolarCalendar kc = new KoreanLunisolarCalendar (); - AssertEquals ("#6-1", 0, kc.GetLeapMonth (2000)); - AssertEquals ("#6-2", 5, kc.GetLeapMonth (2001)); - AssertEquals ("#6-3", 0, kc.GetLeapMonth (2002)); - AssertEquals ("#6-4", 0, kc.GetLeapMonth (2003)); - AssertEquals ("#6-5", 3, kc.GetLeapMonth (2004)); - AssertEquals ("#6-6", 0, kc.GetLeapMonth (2005)); - AssertEquals ("#6-7", 8, kc.GetLeapMonth (2006)); - AssertEquals ("#6-8", 0, kc.GetLeapMonth (2007)); - AssertEquals ("#6-9", 0, kc.GetLeapMonth (2008)); - AssertEquals ("#6-10", 6, kc.GetLeapMonth (2009)); - AssertEquals ("#6-11", 0, kc.GetLeapMonth (2010)); - AssertEquals ("#6-12", 0, kc.GetLeapMonth (2011)); - AssertEquals ("#6-13", 4, kc.GetLeapMonth (2012)); // off from cn by 1 - AssertEquals ("#6-14", 0, kc.GetLeapMonth (2013)); - AssertEquals ("#6-15", 10, kc.GetLeapMonth (2014)); - AssertEquals ("#6-16", 0, kc.GetLeapMonth (2015)); - AssertEquals ("#6-17", 0, kc.GetLeapMonth (2016)); - AssertEquals ("#6-18", 6, kc.GetLeapMonth (2017)); // off from cn by 1 - AssertEquals ("#6-19", 0, kc.GetLeapMonth (2018)); - AssertEquals ("#6-20", 0, kc.GetLeapMonth (2019)); + Assert.AreEqual (0, kc.GetLeapMonth (2000), "#6-1"); + Assert.AreEqual (5, kc.GetLeapMonth (2001), "#6-2"); + Assert.AreEqual (0, kc.GetLeapMonth (2002), "#6-3"); + Assert.AreEqual (0, kc.GetLeapMonth (2003), "#6-4"); + Assert.AreEqual (3, kc.GetLeapMonth (2004), "#6-5"); + Assert.AreEqual (0, kc.GetLeapMonth (2005), "#6-6"); + Assert.AreEqual (8, kc.GetLeapMonth (2006), "#6-7"); + Assert.AreEqual (0, kc.GetLeapMonth (2007), "#6-8"); + Assert.AreEqual (0, kc.GetLeapMonth (2008), "#6-9"); + Assert.AreEqual (6, kc.GetLeapMonth (2009), "#6-10"); + Assert.AreEqual (0, kc.GetLeapMonth (2010), "#6-11"); + Assert.AreEqual (0, kc.GetLeapMonth (2011), "#6-12"); + Assert.AreEqual (4, kc.GetLeapMonth (2012)); // off from cn by 1, "#6-13"); + Assert.AreEqual (0, kc.GetLeapMonth (2013), "#6-14"); + Assert.AreEqual (10, kc.GetLeapMonth (2014), "#6-15"); + Assert.AreEqual (0, kc.GetLeapMonth (2015), "#6-16"); + Assert.AreEqual (0, kc.GetLeapMonth (2016), "#6-17"); + Assert.AreEqual (6, kc.GetLeapMonth (2017)); // off from cn by 1, "#6-18"); + Assert.AreEqual (0, kc.GetLeapMonth (2018), "#6-19"); + Assert.AreEqual (0, kc.GetLeapMonth (2019), "#6-20"); } [Test] public void GetWeekOfYear () { GregorianCalendar gc = new GregorianCalendar (); - AssertEquals ("#1", 1, gc.GetWeekOfYear (new DateTime (2007, 1, 1), CalendarWeekRule.FirstDay, DayOfWeek.Sunday)); - //AssertEquals ("#2", 1, gc.GetWeekOfYear (new DateTime (2000, 1, 1), CalendarWeekRule.FirstDay, DayOfWeek.Sunday)); - AssertEquals ("#2", 3, gc.GetWeekOfYear (new DateTime (2000, 1, 10), CalendarWeekRule.FirstDay, DayOfWeek.Sunday)); - AssertEquals ("#3", 2, gc.GetWeekOfYear (new DateTime (2000, 1, 10), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday)); - AssertEquals ("#4", 2, gc.GetWeekOfYear (new DateTime (2000, 1, 10), CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday)); - AssertEquals ("#5", 52, gc.GetWeekOfYear (new DateTime (2000, 1, 1), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday)); - AssertEquals ("#6", 52, gc.GetWeekOfYear (new DateTime (2000, 1, 1), CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday)); + Assert.AreEqual (1, gc.GetWeekOfYear (new DateTime (2007, 1, 1), CalendarWeekRule.FirstDay, DayOfWeek.Sunday), "#1"); + //Assert.AreEqual (1, gc.GetWeekOfYear (new DateTime (2000, 1, 1), CalendarWeekRule.FirstDay, DayOfWeek.Sunday), "#2"); + Assert.AreEqual (3, gc.GetWeekOfYear (new DateTime (2000, 1, 10), CalendarWeekRule.FirstDay, DayOfWeek.Sunday), "#2"); + Assert.AreEqual (2, gc.GetWeekOfYear (new DateTime (2000, 1, 10), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday), "#3"); + Assert.AreEqual (2, gc.GetWeekOfYear (new DateTime (2000, 1, 10), CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday), "#4"); + Assert.AreEqual (52, gc.GetWeekOfYear (new DateTime (2000, 1, 1), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday), "#5"); + Assert.AreEqual (52, gc.GetWeekOfYear (new DateTime (2000, 1, 1), CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday), "#6"); } #endif + [Test] public void TestToFourDigitYear() { foreach (Calendar cal in acal) { bool working = true; @@ -706,23 +714,20 @@ public class CalendarTest : TestCase { if (cal is TaiwanCalendar) working = false; cal.TwoDigitYearMax = mod + 229; - AssertEquals( - String.Format("F01 {0}.TwoDigitYearMax", cal), - mod+229 , cal.TwoDigitYearMax); - AssertEquals( - String.Format("F02 {0}.ToFourDigitYear(29)", - cal), - working ? mod+229 : 29, - cal.ToFourDigitYear(29)); - AssertEquals( - String.Format("F03 {0}.ToFourDigitYear(30)", - cal), + Assert.AreEqual(mod+229 , cal.TwoDigitYearMax, + String.Format("F01 {0}.TwoDigitYearMax", cal)); + Assert.AreEqual(working ? mod+229 : 29, + cal.ToFourDigitYear(29), + String.Format("F02 {0}.ToFourDigitYear(29)",cal)); + Assert.AreEqual( working ? mod+130 : 30, - cal.ToFourDigitYear(30)); - AssertEquals( + cal.ToFourDigitYear(30), + String.Format("F03 {0}.ToFourDigitYear(30)", + cal)); + Assert.AreEqual(mod, cal.ToFourDigitYear(mod), String.Format("F04 {0}.ToFourDigitYear({1})", - cal, mod), - mod, cal.ToFourDigitYear(mod)); + cal, mod)); + bool exception = false; try { cal.ToFourDigitYear(-1); @@ -730,9 +735,9 @@ public class CalendarTest : TestCase { catch (ArgumentOutOfRangeException) { exception = true; } - Assert(String.Format( + Assert.IsTrue(exception, String.Format( "F05 {0}.ToFourDigitYear(-1) exception", - cal), exception); + cal)); exception = false; try { cal.ToFourDigitYear(15000); @@ -740,9 +745,9 @@ public class CalendarTest : TestCase { catch (ArgumentOutOfRangeException) { exception = true; } - Assert(String.Format( + Assert.IsTrue(exception, String.Format( "F05 {0}.ToFourDigitYear(15000) exception", - cal), exception); + cal)); } } @@ -750,46 +755,46 @@ public class CalendarTest : TestCase { public void TestToFourDigitYear2 () { GregorianCalendar gc = new GregorianCalendar (); - AssertEquals ("#1-1", 2029, gc.ToFourDigitYear (29)); - AssertEquals ("#1-2", 1930, gc.ToFourDigitYear (30)); - AssertEquals ("#1-3", 2029, gc.ToFourDigitYear (2029)); - AssertEquals ("#1-4", 2030, gc.ToFourDigitYear (2030)); + Assert.AreEqual (2029, gc.ToFourDigitYear (29), "#1-1"); + Assert.AreEqual (1930, gc.ToFourDigitYear (30), "#1-2"); + Assert.AreEqual (2029, gc.ToFourDigitYear (2029), "#1-3"); + Assert.AreEqual (2030, gc.ToFourDigitYear (2030), "#1-4"); HebrewCalendar hbc = new HebrewCalendar (); - AssertEquals ("#2-1", 5790, hbc.ToFourDigitYear (90)); - AssertEquals ("#2-2", 5691, hbc.ToFourDigitYear (91)); - AssertEquals ("#2-3", 5790, hbc.ToFourDigitYear (5790)); - AssertEquals ("#2-4", 5691, hbc.ToFourDigitYear (5691)); - AssertEquals ("#2-5", 5999, hbc.ToFourDigitYear (5999)); + Assert.AreEqual (5790, hbc.ToFourDigitYear (90), "#2-1"); + Assert.AreEqual (5691, hbc.ToFourDigitYear (91), "#2-2"); + Assert.AreEqual (5790, hbc.ToFourDigitYear (5790), "#2-3"); + Assert.AreEqual (5691, hbc.ToFourDigitYear (5691), "#2-4"); + Assert.AreEqual (5999, hbc.ToFourDigitYear (5999), "#2-5"); // LAMESPEC: .NET fails to throw an exception unlike documented /* try { hbc.ToFourDigitYear (6000); - Fail ("#2-6"); + Assert.Fail ("#2-6"); } catch (ArgumentOutOfRangeException) { } */ ThaiBuddhistCalendar tc = new ThaiBuddhistCalendar (); - AssertEquals ("#3-1", 2572, tc.ToFourDigitYear (72)); - AssertEquals ("#3-2", 2473, tc.ToFourDigitYear (73)); - AssertEquals ("#3-3", 2572, tc.ToFourDigitYear (2572)); - AssertEquals ("#3-4", 2573, tc.ToFourDigitYear (2573)); - AssertEquals ("#3-5", 9999, tc.ToFourDigitYear (9999)); + Assert.AreEqual (2572, tc.ToFourDigitYear (72), "#3-1"); + Assert.AreEqual (2473, tc.ToFourDigitYear (73), "#3-2"); + Assert.AreEqual (2572, tc.ToFourDigitYear (2572), "#3-3"); + Assert.AreEqual (2573, tc.ToFourDigitYear (2573), "#3-4"); + Assert.AreEqual (9999, tc.ToFourDigitYear (9999), "#3-5"); // LAMESPEC: .NET fails to throw an exception unlike documented /* try { tc.ToFourDigitYear (10000); - Fail ("#3-6"); + Assert.Fail ("#3-6"); } catch (ArgumentOutOfRangeException) { } */ KoreanCalendar kc = new KoreanCalendar (); - AssertEquals ("#4-1", 4362, kc.ToFourDigitYear (62)); - AssertEquals ("#4-2", 4263, kc.ToFourDigitYear (63)); - AssertEquals ("#4-3", 4362, kc.ToFourDigitYear (4362)); - AssertEquals ("#4-4", 4363, kc.ToFourDigitYear (4363)); + Assert.AreEqual (4362, kc.ToFourDigitYear (62), "#4-1"); + Assert.AreEqual (4263, kc.ToFourDigitYear (63), "#4-2"); + Assert.AreEqual (4362, kc.ToFourDigitYear (4362), "#4-3"); + Assert.AreEqual (4363, kc.ToFourDigitYear (4363), "#4-4"); } // TODO: more tests :-) diff --git a/mcs/class/corlib/Test/System.Globalization/ChangeLog b/mcs/class/corlib/Test/System.Globalization/ChangeLog index 9006c6c2735..c9f8eabfe10 100644 --- a/mcs/class/corlib/Test/System.Globalization/ChangeLog +++ b/mcs/class/corlib/Test/System.Globalization/ChangeLog @@ -1,3 +1,7 @@ +2009-06-25 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2009-05-27 Zoltan Varga * CultureInfoTest.cs: Fix the net 1.1 build. diff --git a/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.cs b/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.cs index f24cb0adedd..421db927cbe 100644 --- a/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.cs +++ b/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.cs @@ -15,7 +15,7 @@ namespace MonoTests.System.Globalization { [TestFixture] -public class CompareInfoTest : Assertion +public class CompareInfoTest { static bool doTest = Environment.GetEnvironmentVariable ("MONO_DISABLE_MANAGED_COLLATION") != "yes"; @@ -26,29 +26,29 @@ public class CompareInfoTest : Assertion { string s1 = "foo"; - AssertEquals ("Compare two empty strings", 0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", "")); - AssertEquals ("Compare string with empty string", 1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, "")); - AssertEquals ("Compare empty string with string", -1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", s1)); + Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", ""), "Compare two empty strings"); + Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, ""), "Compare string with empty string"); + Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", s1), "Compare empty string with string"); - AssertEquals ("Compare two empty strings, with 0 offsets", 0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "", 0)); - AssertEquals ("Compare string with empty string, with 0 offsets", 1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, "", 0)); - AssertEquals ("Compare empty string with string, with 0 offsets", -1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, s1, 0)); + Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "", 0), "Compare two empty strings, with 0 offsets"); + Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, "", 0), "Compare string with empty string, with 0 offsets"); + Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, s1, 0), "Compare empty string with string, with 0 offsets"); - AssertEquals ("Compare two empty strings, with 0 offsets and specified lengths", 0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "".Length, "", 0, "".Length)); - AssertEquals ("Compare string with empty string, with 0 offsets and specified lengths", 1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1.Length, "", 0, "".Length)); - AssertEquals ("Compare empty string with string, with 0 offsets and specified lengths", -1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "".Length, s1, 0, s1.Length)); + Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "".Length, "", 0, "".Length), "Compare two empty strings, with 0 offsets and specified lengths"); + Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1.Length, "", 0, "".Length), "Compare string with empty string, with 0 offsets and specified lengths"); + Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "".Length, s1, 0, s1.Length), "Compare empty string with string, with 0 offsets and specified lengths"); - AssertEquals ("Compare two strings, with offsets == string lengths", 0, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s1.Length, s1, s1.Length)); - AssertEquals ("Compare two strings, with first offset == string length", -1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s1.Length, s1, 0)); - AssertEquals ("Compare two strings, with second offset == string length", 1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1, s1.Length)); + Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s1.Length, s1, s1.Length), "Compare two strings, with offsets == string lengths"); + Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s1.Length, s1, 0), "Compare two strings, with first offset == string length"); + Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1, s1.Length), "Compare two strings, with second offset == string length"); - AssertEquals ("Compare two strings, with zero lengths", 0, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, 0, s1, 0, 0)); - AssertEquals ("Compare two strings, with first length zero", -1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, 0, s1, 0, s1.Length)); - AssertEquals ("Compare strings, with second length zero", 1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1.Length, s1, 0, 0)); + Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, 0, s1, 0, 0), "Compare two strings, with zero lengths"); + Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, 0, s1, 0, s1.Length), "Compare two strings, with first length zero"); + Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1.Length, s1, 0, 0), "Compare strings, with second length zero"); - AssertEquals ("Compare two null references", 0, CultureInfo.InvariantCulture.CompareInfo.Compare (null, null)); - AssertEquals ("Compare a string to a null reference", 1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", null)); - AssertEquals ("Compare a null reference to a string", -1, CultureInfo.InvariantCulture.CompareInfo.Compare (null, "")); + Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare (null, null), "Compare two null references"); + Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", null), "Compare a string to a null reference"); + Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare (null, ""), "Compare a null reference to a string"); } @@ -78,7 +78,7 @@ public class CompareInfoTest : Assertion void AssertSortKey (string message, byte [] expected, string test, CompareOptions opt, CompareInfo ci) { byte [] actual = ci.GetSortKey (test, opt).KeyData; - AssertEquals (message, expected, actual); + Assert.AreEqual (expected, actual, message); } void AssertSortKeyLevel5 (string message, byte [] expected, string test) @@ -90,7 +90,7 @@ public class CompareInfoTest : Assertion ; byte [] actual = new byte [tmp.Length - idx]; Array.Copy (tmp, idx, actual, 0, actual.Length); - AssertEquals (message, expected, actual); + Assert.AreEqual (expected, actual, message); } void AssertCompare (string message, int result, string s1, string s2) @@ -109,11 +109,11 @@ public class CompareInfoTest : Assertion { int ret = ci.Compare (s1, s2, opt); if (result == 0) - AssertEquals (message, 0, ret); + Assert.AreEqual (0, ret, message); else if (result < 0) - Assert (message + String.Format ("(neg: {0})", ret), ret < 0); + Assert.IsTrue (ret < 0, message + String.Format ("(neg: {0})", ret)); else - Assert (message + String.Format ("(pos: {0})", ret), ret > 0); + Assert.IsTrue (ret > 0, message + String.Format ("(pos: {0})", ret)); } void AssertCompare (string message, int result, @@ -121,11 +121,11 @@ public class CompareInfoTest : Assertion { int ret = invariant.Compare (s1, idx1, len1, s2, idx2, len2); if (result == 0) - AssertEquals (message, 0, ret); + Assert.AreEqual (0, ret, message); else if (result < 0) - Assert (message, ret < 0); + Assert.IsTrue (ret < 0, message); else - Assert (message, ret > 0); + Assert.IsTrue (ret > 0, message); } void AssertCompare (string message, int result, @@ -134,137 +134,119 @@ public class CompareInfoTest : Assertion { int ret = ci.Compare (s1, idx1, len1, s2, idx2, len2, opt); if (result == 0) - AssertEquals (message, 0, ret); + Assert.AreEqual (0, ret, message); else if (result < 0) - Assert (message, ret < 0); + Assert.IsTrue (ret < 0, message); else - Assert (message, ret > 0); + Assert.IsTrue (ret > 0, message); } void AssertIndexOf (string message, int expected, string source, char target) { - AssertEquals (message, expected, - invariant.IndexOf (source, target)); + Assert.AreEqual (expected, invariant.IndexOf (source, target), message); } void AssertIndexOf (string message, int expected, string source, char target, CompareOptions opt) { - AssertEquals (message, expected, - invariant.IndexOf (source, target, opt)); + Assert.AreEqual (expected, invariant.IndexOf (source, target, opt), message); } void AssertIndexOf (string message, int expected, string source, char target, int idx, int len, CompareOptions opt, CompareInfo ci) { - AssertEquals (message, expected, - ci.IndexOf (source, target, idx, len, opt)); + Assert.AreEqual (expected, ci.IndexOf (source, target, idx, len, opt), message); } void AssertIndexOf (string message, int expected, string source, string target) { - AssertEquals (message, expected, - invariant.IndexOf (source, target)); + Assert.AreEqual (expected, invariant.IndexOf (source, target), message); } void AssertIndexOf (string message, int expected, string source, string target, CompareOptions opt) { - AssertEquals (message, expected, - invariant.IndexOf (source, target, opt)); + Assert.AreEqual (expected, invariant.IndexOf (source, target, opt), message); } void AssertIndexOf (string message, int expected, string source, string target, int idx, int len, CompareOptions opt, CompareInfo ci) { - AssertEquals (message, expected, - ci.IndexOf (source, target, idx, len, opt)); + Assert.AreEqual (expected, ci.IndexOf (source, target, idx, len, opt), message); } void AssertLastIndexOf (string message, int expected, string source, char target) { - AssertEquals (message, expected, - invariant.LastIndexOf (source, target)); + Assert.AreEqual (expected, invariant.LastIndexOf (source, target), message); } void AssertLastIndexOf (string message, int expected, string source, char target, CompareOptions opt) { - AssertEquals (message, expected, - invariant.LastIndexOf (source, target, opt)); + Assert.AreEqual (expected, invariant.LastIndexOf (source, target, opt), message); } void AssertLastIndexOf (string message, int expected, string source, char target, int idx, int len) { - AssertEquals (message, expected, - invariant.LastIndexOf (source, target, idx, len)); + Assert.AreEqual (expected, invariant.LastIndexOf (source, target, idx, len), message); } void AssertLastIndexOf (string message, int expected, string source, char target, int idx, int len, CompareOptions opt, CompareInfo ci) { - AssertEquals (message, expected, - ci.LastIndexOf (source, target, idx, len, opt)); + Assert.AreEqual (expected, ci.LastIndexOf (source, target, idx, len, opt), message); } void AssertLastIndexOf (string message, int expected, string source, string target) { - AssertEquals (message, expected, - invariant.LastIndexOf (source, target)); + Assert.AreEqual (expected, invariant.LastIndexOf (source, target), message); } void AssertLastIndexOf (string message, int expected, string source, string target, CompareOptions opt) { - AssertEquals (message, expected, - invariant.LastIndexOf (source, target, opt)); + Assert.AreEqual (expected, invariant.LastIndexOf (source, target, opt), message); } void AssertLastIndexOf (string message, int expected, string source, string target, int idx, int len) { - AssertEquals (message, expected, - invariant.LastIndexOf (source, target, idx, len)); + Assert.AreEqual (expected, invariant.LastIndexOf (source, target, idx, len), message); } void AssertLastIndexOf (string message, int expected, string source, string target, int idx, int len, CompareOptions opt, CompareInfo ci) { - AssertEquals (message, expected, - ci.LastIndexOf (source, target, idx, len, opt)); + Assert.AreEqual (expected, ci.LastIndexOf (source, target, idx, len, opt), message); } void AssertIsPrefix (string message, bool expected, string source, string target) { - Assert (message, expected == invariant.IsPrefix ( - source, target)); + Assert.IsTrue (expected == invariant.IsPrefix (source, target), message); } void AssertIsPrefix (string message, bool expected, string source, string target, CompareOptions opt) { - Assert (message, expected == invariant.IsPrefix ( - source, target, opt)); + Assert.IsTrue (expected == invariant.IsPrefix (source, target, opt), message); } void AssertIsSuffix (string message, bool expected, string source, string target) { - Assert (message, expected == invariant.IsSuffix ( - source, target)); + Assert.IsTrue (expected == invariant.IsSuffix (source, target), message); } void AssertIsSuffix (string message, bool expected, string source, string target, CompareOptions opt) { - Assert (message, expected == invariant.IsSuffix ( - source, target, opt)); + Assert.IsTrue (expected == invariant.IsSuffix (source, target, opt), message); } [Test] @@ -525,13 +507,13 @@ public class CompareInfoTest : Assertion if (option == CompareOptions.OrdinalIgnoreCase || option == CompareOptions.Ordinal) { try { french.GetSortKey ("foo", option); - Fail ("#1: " + option.ToString ()); + Assert.Fail ("#1: " + option.ToString ()); } catch (ArgumentException ex) { - AssertEquals ("#2: " + option.ToString (), typeof (ArgumentException), ex.GetType ()); - AssertNotNull ("#2: " + option.ToString (), ex.Message); - AssertNotNull ("#3: " + option.ToString (), ex.ParamName); - AssertEquals ("#4: " + option.ToString (), "options", ex.ParamName); - AssertNull ("#5: " + option.ToString (), ex.InnerException); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2: " + option.ToString ()); + Assert.IsNotNull (ex.Message, "#2: " + option.ToString ()); + Assert.IsNotNull (ex.ParamName, "#3: " + option.ToString ()); + Assert.AreEqual ("options", ex.ParamName, "#4: " + option.ToString ()); + Assert.IsNull (ex.InnerException, "#5: " + option.ToString ()); } } else { french.GetSortKey ("foo", option); @@ -855,10 +837,10 @@ public class CompareInfoTest : Assertion AssertLastIndexOf ("#9", -1, "UA", '\u00C6'); AssertLastIndexOf ("#10", -1, "UE", '\u00C6'); AssertLastIndexOf ("#11", 0, "\\", '\\'); - AssertEquals ("#11en", 0, new CultureInfo ("en").CompareInfo.LastIndexOf ("\\", '\\')); - AssertEquals ("#11ja", 0, new CultureInfo ("ja").CompareInfo.LastIndexOf ("\\", '\\')); + Assert.AreEqual (0, new CultureInfo ("en").CompareInfo.LastIndexOf ("\\", '\\'), "#11en"); + Assert.AreEqual (0, new CultureInfo ("ja").CompareInfo.LastIndexOf ("\\", '\\'), "#11ja"); AssertLastIndexOf ("#12", 8, "/system/web", 'w'); - AssertEquals ("#12sv", 8, new CultureInfo ("sv").CompareInfo.LastIndexOf ("/system/web", 'w')); + Assert.AreEqual (8, new CultureInfo ("sv").CompareInfo.LastIndexOf ("/system/web", 'w'), "#12sv"); } [Test] @@ -902,8 +884,8 @@ public class CompareInfoTest : Assertion AssertIsPrefix ("#15", true, "\uff21\uff21", "\u3007\uff21", CompareOptions.None); AssertIsPrefix ("#16", true, "\uff21\uff21", "\uff21\u3007", CompareOptions.None); AssertIsPrefix ("#17", true, "\\b\\a a", "\\b\\a a"); - Assert ("#17en", new CultureInfo ("en").CompareInfo.IsPrefix ("\\b\\a a", "\\b\\a a")); - Assert ("#17ja", new CultureInfo ("ja").CompareInfo.IsPrefix ("\\b\\a a", "\\b\\a a")); + Assert.IsTrue (new CultureInfo ("en").CompareInfo.IsPrefix ("\\b\\a a", "\\b\\a a"), "#17en"); + Assert.IsTrue (new CultureInfo ("ja").CompareInfo.IsPrefix ("\\b\\a a", "\\b\\a a"), "#17ja"); } [Test] @@ -979,8 +961,8 @@ public class CompareInfoTest : Assertion AssertIsSuffix ("#18", true, "/test.css", ""); AssertIsSuffix ("#19", true, "/test.css", "/test.css"); AssertIsSuffix ("#20", true, "\\b\\a a", "\\b\\a a"); - Assert ("#20en", new CultureInfo ("en").CompareInfo.IsSuffix ("\\b\\a a", "\\b\\a a")); - Assert ("#20ja", new CultureInfo ("ja").CompareInfo.IsSuffix ("\\b\\a a", "\\b\\a a")); + Assert.IsTrue (new CultureInfo ("en").CompareInfo.IsSuffix ("\\b\\a a", "\\b\\a a"), "#20en"); + Assert.IsTrue (new CultureInfo ("ja").CompareInfo.IsSuffix ("\\b\\a a", "\\b\\a a"), "#20ja"); } [Test] @@ -1030,8 +1012,8 @@ public class CompareInfoTest : Assertion AssertIndexOf ("#18", 0, "ABC", "\u3007"); AssertIndexOf ("#19", 0, "\\b\\a a", "\\b\\a a"); - AssertEquals ("#19en", 0, new CultureInfo ("en").CompareInfo.IndexOf ("\\b\\a a", "\\b\\a a")); - AssertEquals ("#19ja", 0, new CultureInfo ("ja").CompareInfo.IndexOf ("\\b\\a a", "\\b\\a a")); + Assert.AreEqual (0, new CultureInfo ("en").CompareInfo.IndexOf ("\\b\\a a", "\\b\\a a"), "#19en"); + Assert.AreEqual (0, new CultureInfo ("ja").CompareInfo.IndexOf ("\\b\\a a", "\\b\\a a"), "#19ja"); } [Test] @@ -1091,11 +1073,11 @@ public class CompareInfoTest : Assertion AssertLastIndexOf ("#17", 1, "\uff21\uff21", "\u3007", CompareOptions.None); AssertLastIndexOf ("#18", 1, "\u3007\uff21", "\uff21", CompareOptions.None); AssertLastIndexOf ("#19", 0, "\\b\\a a", "\\b\\a a"); - AssertEquals ("#19en", 0, new CultureInfo ("en").CompareInfo.LastIndexOf ("\\b\\a a", "\\b\\a a")); - AssertEquals ("#19ja", 0, new CultureInfo ("ja").CompareInfo.LastIndexOf ("\\b\\a a", "\\b\\a a")); + Assert.AreEqual (0, new CultureInfo ("en").CompareInfo.LastIndexOf ("\\b\\a a", "\\b\\a a"), "#19en"); + Assert.AreEqual (0, new CultureInfo ("ja").CompareInfo.LastIndexOf ("\\b\\a a", "\\b\\a a"), "#19ja"); // bug #80612 AssertLastIndexOf ("#20", 8, "/system/web", "w"); - AssertEquals ("#20sv", 8, new CultureInfo ("sv").CompareInfo.LastIndexOf ("/system/web", "w")); + Assert.AreEqual (8, new CultureInfo ("sv").CompareInfo.LastIndexOf ("/system/web", "w"), "#20sv"); } [Test] @@ -1146,9 +1128,9 @@ public class CompareInfoTest : Assertion // for bug #76702 public void NullCharacter () { - AssertEquals ("#1", -1, "MONO".IndexOf ("\0\0\0")); - AssertEquals ("#2", -1, "MONO".LastIndexOf ("\0\0\0")); - AssertEquals ("#3", 1, "MONO".CompareTo ("\0\0\0")); + Assert.AreEqual (-1, "MONO".IndexOf ("\0\0\0"), "#1"); + Assert.AreEqual (-1, "MONO".LastIndexOf ("\0\0\0"), "#2"); + Assert.AreEqual (1, "MONO".CompareTo ("\0\0\0"), "#3"); } [Test] @@ -1156,7 +1138,7 @@ public class CompareInfoTest : Assertion // MS.NET treats it as equivalent, while in IndexOf() it does not match. public void NullCharacterWeird () { - AssertEquals ("#4", -1, "MONO".CompareTo ("MONO\0\0\0")); + Assert.AreEqual (-1, "MONO".CompareTo ("MONO\0\0\0"), "#4"); } #if NET_2_0 @@ -1228,7 +1210,7 @@ public class CompareInfoTest : Assertion [Test] // bug #80865 public void IsPrefixOrdinalIgnoreCase () { - Assert ("aaaa".StartsWith ("A", StringComparison.OrdinalIgnoreCase)); + Assert.IsTrue ("aaaa".StartsWith ("A", StringComparison.OrdinalIgnoreCase)); } #endif } diff --git a/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.jvm.cs b/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.jvm.cs index 8b3d1457a62..4d7cce4d463 100644 --- a/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.jvm.cs +++ b/mcs/class/corlib/Test/System.Globalization/CompareInfoTest.jvm.cs @@ -15,7 +15,7 @@ namespace MonoTests.System.Globalization { [TestFixture] -public class CompareInfoTest : Assertion +public class CompareInfoTest { static bool doTest = Environment.GetEnvironmentVariable ("MONO_DISABLE_MANAGED_COLLATION") != "yes"; @@ -26,25 +26,25 @@ public class CompareInfoTest : Assertion { string s1 = "foo"; - AssertEquals ("Compare two empty strings", 0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", "")); - AssertEquals ("Compare string with empty string", 1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, "")); - AssertEquals ("Compare empty string with string", -1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", s1)); + Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", ""), "Compare two empty strings"); + Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, ""), "Compare string with empty string"); + Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", s1), "Compare empty string with string"); - AssertEquals ("Compare two empty strings, with 0 offsets", 0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "", 0)); - AssertEquals ("Compare string with empty string, with 0 offsets", 1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, "", 0)); - AssertEquals ("Compare empty string with string, with 0 offsets", -1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, s1, 0)); + Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "", 0), "Compare two empty strings, with 0 offsets"); + Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, "", 0), "Compare string with empty string, with 0 offsets"); + Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, s1, 0), "Compare empty string with string, with 0 offsets"); - AssertEquals ("Compare two empty strings, with 0 offsets and specified lengths", 0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "".Length, "", 0, "".Length)); - AssertEquals ("Compare string with empty string, with 0 offsets and specified lengths", 1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1.Length, "", 0, "".Length)); - AssertEquals ("Compare empty string with string, with 0 offsets and specified lengths", -1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "".Length, s1, 0, s1.Length)); + Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "".Length, "", 0, "".Length), "Compare two empty strings, with 0 offsets and specified lengths"); + Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1.Length, "", 0, "".Length), "Compare string with empty string, with 0 offsets and specified lengths"); + Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "".Length, s1, 0, s1.Length), "Compare empty string with string, with 0 offsets and specified lengths"); - AssertEquals ("Compare two strings, with offsets == string lengths", 0, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s1.Length, s1, s1.Length)); - AssertEquals ("Compare two strings, with first offset == string length", -1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s1.Length, s1, 0)); - AssertEquals ("Compare two strings, with second offset == string length", 1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1, s1.Length)); + Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s1.Length, s1, s1.Length), "Compare two strings, with offsets == string lengths"); + Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s1.Length, s1, 0), "Compare two strings, with first offset == string length"); + Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1, s1.Length), "Compare two strings, with second offset == string length"); - AssertEquals ("Compare two strings, with zero lengths", 0, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, 0, s1, 0, 0)); - AssertEquals ("Compare two strings, with first length zero", -1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, 0, s1, 0, s1.Length)); - AssertEquals ("Compare strings, with second length zero", 1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1.Length, s1, 0, 0)); + Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, 0, s1, 0, 0), "Compare two strings, with zero lengths"); + Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, 0, s1, 0, s1.Length), "Compare two strings, with first length zero"); + Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1.Length, s1, 0, 0), "Compare strings, with second length zero"); } @@ -77,9 +77,9 @@ public class CompareInfoTest : Assertion if (result == 0) AssertEquals (message, 0, ret); else if (result < 0) - Assert (message + String.Format ("(neg: {0})", ret), ret < 0); + Assert.IsTrue (message + String.Format ("(neg: {0})", ret), ret < 0); else - Assert (message + String.Format ("(pos: {0})", ret), ret > 0); + Assert.IsTrue (message + String.Format ("(pos: {0})", ret), ret > 0); } void AssertCompare (string message, int result, @@ -89,9 +89,9 @@ public class CompareInfoTest : Assertion if (result == 0) AssertEquals (message, 0, ret); else if (result < 0) - Assert (message, ret < 0); + Assert.IsTrue (message, ret < 0); else - Assert (message, ret > 0); + Assert.IsTrue (message, ret > 0); } void AssertCompare (string message, int result, @@ -102,9 +102,9 @@ public class CompareInfoTest : Assertion if (result == 0) AssertEquals (message, 0, ret); else if (result < 0) - Assert (message, ret < 0); + Assert.IsTrue (message, ret < 0); else - Assert (message, ret > 0); + Assert.IsTrue (message, ret > 0); } void AssertIndexOf (string message, int expected, @@ -208,28 +208,28 @@ public class CompareInfoTest : Assertion void AssertIsPrefix (string message, bool expected, string source, string target) { - Assert (message, expected == invariant.IsPrefix ( + Assert.IsTrue (message, expected == invariant.IsPrefix ( source, target)); } void AssertIsPrefix (string message, bool expected, string source, string target, CompareOptions opt) { - Assert (message, expected == invariant.IsPrefix ( + Assert.IsTrue (message, expected == invariant.IsPrefix ( source, target, opt)); } void AssertIsSuffix (string message, bool expected, string source, string target) { - Assert (message, expected == invariant.IsSuffix ( + Assert.IsTrue (message, expected == invariant.IsSuffix ( source, target)); } void AssertIsSuffix (string message, bool expected, string source, string target, CompareOptions opt) { - Assert (message, expected == invariant.IsSuffix ( + Assert.IsTrue (message, expected == invariant.IsSuffix ( source, target, opt)); } @@ -344,10 +344,10 @@ public class CompareInfoTest : Assertion AssertLastIndexOf ("#6", 4, "ABCABC", 'B', 4, 4); AssertLastIndexOf ("#7", -1, "ABCABC", 'B', 5, 1); AssertLastIndexOf ("#11", 0, "\\", '\\'); - AssertEquals ("#11en", 0, new CultureInfo ("en").CompareInfo.LastIndexOf ("\\", '\\')); - AssertEquals ("#11ja", 0, new CultureInfo ("ja").CompareInfo.LastIndexOf ("\\", '\\')); + Assert.AreEqual (0, new CultureInfo ("en").CompareInfo.LastIndexOf ("\\", '\\'), "#11en"); + Assert.AreEqual (0, new CultureInfo ("ja").CompareInfo.LastIndexOf ("\\", '\\'), "#11ja"); AssertLastIndexOf ("#12", 8, "/system/web", 'w'); - AssertEquals ("#12sv", 8, new CultureInfo ("sv").CompareInfo.LastIndexOf ("/system/web", 'w')); + Assert.AreEqual (8, new CultureInfo ("sv").CompareInfo.LastIndexOf ("/system/web", 'w'), "#12sv"); } [Test] @@ -391,8 +391,8 @@ public class CompareInfoTest : Assertion AssertIsPrefix ("#15", true, "\uff21\uff21", "\u3007\uff21", CompareOptions.None); AssertIsPrefix ("#16", true, "\uff21\uff21", "\uff21\u3007", CompareOptions.None); AssertIsPrefix ("#17", true, "\\b\\a a", "\\b\\a a"); - Assert ("#17en", new CultureInfo ("en").CompareInfo.IsPrefix ("\\b\\a a", "\\b\\a a")); - Assert ("#17ja", new CultureInfo ("ja").CompareInfo.IsPrefix ("\\b\\a a", "\\b\\a a")); + Assert.IsTrue (new CultureInfo ("en").CompareInfo.IsPrefix ("\\b\\a a", "\\b\\a a"), "#17en"); + Assert.IsTrue (new CultureInfo ("ja").CompareInfo.IsPrefix ("\\b\\a a", "\\b\\a a"), "#17ja"); } [Test] @@ -460,8 +460,8 @@ public class CompareInfoTest : Assertion AssertIsSuffix ("#18", true, "/test.css", ""); AssertIsSuffix ("#19", true, "/test.css", "/test.css"); AssertIsSuffix ("#20", true, "\\b\\a a", "\\b\\a a"); - Assert ("#20en", new CultureInfo ("en").CompareInfo.IsSuffix ("\\b\\a a", "\\b\\a a")); - Assert ("#20ja", new CultureInfo ("ja").CompareInfo.IsSuffix ("\\b\\a a", "\\b\\a a")); + Assert.IsTrue (new CultureInfo ("en").CompareInfo.IsSuffix ("\\b\\a a", "\\b\\a a"), "#20en"); + Assert.IsTrue (new CultureInfo ("ja").CompareInfo.IsSuffix ("\\b\\a a", "\\b\\a a"), "#20ja"); } [Test] @@ -509,8 +509,8 @@ public class CompareInfoTest : Assertion AssertIndexOf ("#18", 0, "ABC", "\u3007"); AssertIndexOf ("#19", 0, "\\b\\a a", "\\b\\a a"); - AssertEquals ("#19en", 0, new CultureInfo ("en").CompareInfo.IndexOf ("\\b\\a a", "\\b\\a a")); - AssertEquals ("#19ja", 0, new CultureInfo ("ja").CompareInfo.IndexOf ("\\b\\a a", "\\b\\a a")); + Assert.AreEqual (0, new CultureInfo ("en").CompareInfo.IndexOf ("\\b\\a a", "\\b\\a a"), "#19en"); + Assert.AreEqual (0, new CultureInfo ("ja").CompareInfo.IndexOf ("\\b\\a a", "\\b\\a a"), "#19ja"); } [Test] @@ -559,11 +559,11 @@ public class CompareInfoTest : Assertion AssertLastIndexOf ("#17", 1, "\uff21\uff21", "\u3007", CompareOptions.None); AssertLastIndexOf ("#18", 1, "\u3007\uff21", "\uff21", CompareOptions.None); AssertLastIndexOf ("#19", 0, "\\b\\a a", "\\b\\a a"); - AssertEquals ("#19en", 0, new CultureInfo ("en").CompareInfo.LastIndexOf ("\\b\\a a", "\\b\\a a")); - AssertEquals ("#19ja", 0, new CultureInfo ("ja").CompareInfo.LastIndexOf ("\\b\\a a", "\\b\\a a")); + Assert.AreEqual (0, new CultureInfo ("en").CompareInfo.LastIndexOf ("\\b\\a a", "\\b\\a a"), "#19en"); + Assert.AreEqual (0, new CultureInfo ("ja").CompareInfo.LastIndexOf ("\\b\\a a", "\\b\\a a"), "#19ja"); // bug #80612 AssertLastIndexOf ("#20", 8, "/system/web", "w"); - AssertEquals ("#20sv", 8, new CultureInfo ("sv").CompareInfo.LastIndexOf ("/system/web", "w")); + Assert.AreEqual (8, new CultureInfo ("sv").CompareInfo.LastIndexOf ("/system/web", "w"), "#20sv"); } [Test] @@ -600,9 +600,9 @@ public class CompareInfoTest : Assertion // for bug #76702 public void NullCharacter () { - AssertEquals ("#1", -1, "MONO".IndexOf ("\0\0\0")); - AssertEquals ("#2", -1, "MONO".LastIndexOf ("\0\0\0")); - AssertEquals ("#3", 1, "MONO".CompareTo ("\0\0\0")); + Assert.AreEqual (-1, "MONO".IndexOf ("\0\0\0"), "#1"); + Assert.AreEqual (-1, "MONO".LastIndexOf ("\0\0\0"), "#2"); + Assert.AreEqual (1, "MONO".CompareTo ("\0\0\0"), "#3"); } [Test] @@ -610,7 +610,7 @@ public class CompareInfoTest : Assertion // MS.NET treats it as equivalent, while in IndexOf() it does not match. public void NullCharacterWeird () { - AssertEquals ("#4", -1, "MONO".CompareTo ("MONO\0\0\0")); + Assert.AreEqual (-1, "MONO".CompareTo ("MONO\0\0\0"), "#4"); } #if NET_2_0 diff --git a/mcs/class/corlib/Test/System.IO/BinaryReaderTest.cs b/mcs/class/corlib/Test/System.IO/BinaryReaderTest.cs index 847b5f2c3f8..bbcb5060eb9 100644 --- a/mcs/class/corlib/Test/System.IO/BinaryReaderTest.cs +++ b/mcs/class/corlib/Test/System.IO/BinaryReaderTest.cs @@ -15,7 +15,7 @@ using System.Text; namespace MonoTests.System.IO { [TestFixture] - public class BinaryReaderTest : Assertion + public class BinaryReaderTest { static string TempFolder = Path.Combine (Path.GetTempPath (), "MonoTests.System.IO.Tests"); static string _codeFileName = TempFolder + Path.DirectorySeparatorChar + "AFile.txt"; @@ -144,7 +144,7 @@ namespace MonoTests.System.IO FileMode.Open, FileAccess.Read); r = new BinaryReader (f); - AssertNotNull ("#03 no binary reader created", r); + Assert.IsNotNull (r, "#03 no binary reader created"); } finally { if (r != null) r.Close (); @@ -187,7 +187,7 @@ namespace MonoTests.System.IO try { r = new BinaryReader (m); b = r.ReadBoolean (); - AssertEquals ("#11 No well readed boolean: ", a [0], b); + Assert.AreEqual (a [0], b, "#11 No well readed boolean: "); } finally { if (r != null) r.Close (); @@ -205,7 +205,7 @@ namespace MonoTests.System.IO try { r = new BinaryReader (m); b = r.ReadByte (); - AssertEquals ("#13 No well readed byte: ", a [0], b); + Assert.AreEqual (a [0], b, "#13 No well readed byte: "); } finally { if (r != null) r.Close (); @@ -232,7 +232,7 @@ namespace MonoTests.System.IO m = new MemoryStream (arr_a); r = new BinaryReader (m); c = r.ReadChar (); - AssertEquals ("#15 No well readed Char", a [0], c); + Assert.AreEqual (a [0], c, "#15 No well readed Char"); } finally { r.Close (); m.Close (); @@ -263,9 +263,9 @@ namespace MonoTests.System.IO for (i=0;i<7;i++) { try{ arr_int2 [i] = bin_reader.ReadInt32(); - AssertEquals("#2E Wrong Readed Int32 in iteration "+ i,arr_int [i],arr_int2 [i]); + Assert.AreEqual (arr_int [i], arr_int2 [i], "#2E Wrong Readed Int32 in iteration "+ i); } catch (IOException e) { - Fail("#2F Unexpected IO Exception" + e.ToString()); + Assert.Fail ("#2F Unexpected IO Exception" + e.ToString()); } } } finally { @@ -300,7 +300,7 @@ namespace MonoTests.System.IO r = new BinaryReader (m); char1 = (char) r.PeekChar (); char2 = (char) r.PeekChar (); - AssertEquals ("#20 the stream pointer have been altered in peek", char1, char2); + Assert.AreEqual (char1, char2, "#20 the stream pointer have been altered in peek"); } finally { r.Close (); m.Close (); @@ -327,7 +327,7 @@ namespace MonoTests.System.IO char1 = (char) r.PeekChar (); r.BaseStream.Seek (0,SeekOrigin.Current); char2 = (char) r.PeekChar (); - AssertEquals ("#22 the stream Has been altered in Seek", char1, char2); + Assert.AreEqual (char1, char2, "#22 the stream Has been altered in Seek"); } finally { r.Close (); m.Close (); @@ -355,7 +355,7 @@ namespace MonoTests.System.IO r.BaseStream.Seek (3,SeekOrigin.Current); r.BaseStream.Seek (-3,SeekOrigin.Current); char2 = (char) r.PeekChar (); - AssertEquals ("#24 the stream Has been altered in Seek", char1, char2); + Assert.AreEqual (char1, char2, "#24 the stream Has been altered in Seek"); } finally { r.Close (); m.Close (); @@ -377,36 +377,36 @@ namespace MonoTests.System.IO { try { int1 = r.ReadByte(); - AssertEquals("#26 Not well readed Byte", int1, arr_byte[0]); + Assert.AreEqual (int1, arr_byte[0], "#26 Not well readed Byte"); } catch (Exception e) { - Fail ("#27 Unexpected exception thrown: " + e.ToString ()); + Assert.Fail ("#27 Unexpected exception thrown: " + e.ToString ()); } } { try { r.BaseStream.Seek(-1,SeekOrigin.End); int1 = r.ReadByte(); - AssertEquals("#28 Not well readed Byte",int1,arr_byte[9]); + Assert.AreEqual (int1, arr_byte[9], "#28 Not well readed Byte"); } catch (Exception e) { - Fail ("#29 Unexpected exception thrown: " + e.ToString ()); + Assert.Fail ("#29 Unexpected exception thrown: " + e.ToString ()); } } { try { r.BaseStream.Seek(3,SeekOrigin.Begin); int1 = r.ReadByte(); - AssertEquals("#2A Not well readed Byte",int1,arr_byte[3]); + Assert.AreEqual (int1, arr_byte[3], "#2A Not well readed Byte"); } catch (Exception e) { - Fail ("#2B Unexpected exception thrown: " + e.ToString ()); + Assert.Fail ("#2B Unexpected exception thrown: " + e.ToString ()); } } { try { r.BaseStream.Seek(2,SeekOrigin.Current); int1 = r.ReadByte(); - AssertEquals("#2C Not well readed Int32",int1,arr_byte [6]); + Assert.AreEqual (int1, arr_byte [6], "#2C Not well readed Int32"); } catch (Exception e) { - Fail ("#2D Unexpected exception thrown: " + e.ToString ()); + Assert.Fail ("#2D Unexpected exception thrown: " + e.ToString ()); } } } finally { @@ -541,11 +541,11 @@ namespace MonoTests.System.IO stream = new MemoryStream (bytes); reader = new BinaryReader (stream); - AssertEquals ("test#01", 0, reader.Read ()); - AssertEquals ("test#02", 1, reader.Read ()); - AssertEquals ("test#03", 2, reader.Read ()); - AssertEquals ("test#04", 3, reader.Read ()); - AssertEquals ("test#05", -1, reader.Read ()); + Assert.AreEqual (0, reader.Read (), "test#01"); + Assert.AreEqual (1, reader.Read (), "test#02"); + Assert.AreEqual (2, reader.Read (), "test#03"); + Assert.AreEqual (3, reader.Read (), "test#04"); + Assert.AreEqual (-1, reader.Read (), "test#05"); } finally { reader.Close (); stream.Close (); @@ -643,11 +643,11 @@ namespace MonoTests.System.IO stream = new MemoryStream (bytes); reader = new BinaryReader (stream); - AssertEquals ("test#01", 0, reader.PeekChar ()); - AssertEquals ("test#02", 0, reader.PeekChar ()); - AssertEquals ("test#03", 0, reader.Read ()); - AssertEquals ("test#03", 1, reader.Read ()); - AssertEquals ("test#03", 2, reader.PeekChar ()); + Assert.AreEqual (0, reader.PeekChar (), "test#01"); + Assert.AreEqual (0, reader.PeekChar (), "test#02"); + Assert.AreEqual (0, reader.Read (), "test#03"); + Assert.AreEqual (1, reader.Read (), "test#03"); + Assert.AreEqual (2, reader.PeekChar (), "test#03"); } finally { reader.Close (); stream.Close (); @@ -722,10 +722,10 @@ namespace MonoTests.System.IO stream = new MemoryStream (bytes); reader = new BinaryReader (stream); - AssertEquals ("test#01", 4, reader.BaseStream.Length); - AssertEquals ("test#02", true, reader.BaseStream.CanRead); + Assert.AreEqual (4, reader.BaseStream.Length, "test#01"); + Assert.AreEqual (true, reader.BaseStream.CanRead, "test#02"); reader.Close (); - AssertEquals ("test#03", null, reader.BaseStream); + Assert.AreEqual (null, reader.BaseStream, "test#03"); } finally { reader.Close (); stream.Close (); @@ -749,23 +749,23 @@ namespace MonoTests.System.IO bytes = new byte [3]; reader.Read (bytes, 0, 3); - AssertEquals ("test#01", 0, bytes [0]); - AssertEquals ("test#02", 1, bytes [1]); - AssertEquals ("test#03", 2, bytes [2]); + Assert.AreEqual (0, bytes [0], "test#01"); + Assert.AreEqual (1, bytes [1], "test#02"); + Assert.AreEqual (2, bytes [2], "test#03"); bytes = new byte [6]; reader.Read (bytes, 3, 3); - AssertEquals ("test#04", 0, bytes [0]); - AssertEquals ("test#05", 0, bytes [1]); - AssertEquals ("test#06", 0, bytes [2]); - AssertEquals ("test#07", 3, bytes [3]); - AssertEquals ("test#08", 4, bytes [4]); - AssertEquals ("test#09", 5, bytes [5]); + Assert.AreEqual (0, bytes [0], "test#04"); + Assert.AreEqual (0, bytes [1], "test#05"); + Assert.AreEqual (0, bytes [2], "test#06"); + Assert.AreEqual (3, bytes [3], "test#07"); + Assert.AreEqual (4, bytes [4], "test#08"); + Assert.AreEqual (5, bytes [5], "test#09"); bytes = new byte [2]; reader.Read (bytes, 0, 2); - AssertEquals ("test#10", 0, bytes [0]); - AssertEquals ("test#11", 0, bytes [1]); + Assert.AreEqual (0, bytes [0], "test#10"); + Assert.AreEqual (0, bytes [1], "test#11"); } finally { reader.Close (); stream.Close (); @@ -786,23 +786,23 @@ namespace MonoTests.System.IO reader = new BinaryReader (stream); char [] chars = new char [3]; reader.Read (chars, 0, 3); - AssertEquals ("test#01", 'm', chars [0]); - AssertEquals ("test#02", 'o', chars [1]); - AssertEquals ("test#03", 'n', chars [2]); + Assert.AreEqual ('m', chars [0], "test#01"); + Assert.AreEqual ('o', chars [1], "test#02"); + Assert.AreEqual ('n', chars [2], "test#03"); chars = new char [6]; reader.Read (chars, 3, 3); - AssertEquals ("test#04", 0, chars [0]); - AssertEquals ("test#05", 0, chars [1]); - AssertEquals ("test#06", 0, chars [2]); - AssertEquals ("test#07", 'o', chars [3]); - AssertEquals ("test#08", ':', chars [4]); - AssertEquals ("test#09", ':', chars [5]); + Assert.AreEqual (0, chars [0], "test#04"); + Assert.AreEqual (0, chars [1], "test#05"); + Assert.AreEqual (0, chars [2], "test#06"); + Assert.AreEqual ('o', chars [3], "test#07"); + Assert.AreEqual (':', chars [4], "test#08"); + Assert.AreEqual (':', chars [5], "test#09"); chars = new char [2]; reader.Read (chars, 0, 2); - AssertEquals ("test#08", 0, chars [0]); - AssertEquals ("test#09", 0, chars [1]); + Assert.AreEqual (0, chars [0], "test#08"); + Assert.AreEqual (0, chars [1], "test#09"); } finally { reader.Close (); stream.Close (); @@ -821,11 +821,11 @@ namespace MonoTests.System.IO try { stream = new MemoryStream (new byte [] {0, 1, 99, 0, 13}); reader = new BinaryReader (stream); - AssertEquals ("test#01", false, reader.ReadBoolean ()); - AssertEquals ("test#02", true, reader.ReadBoolean ()); - AssertEquals ("test#03", true, reader.ReadBoolean ()); - AssertEquals ("test#04", false, reader.ReadBoolean ()); - AssertEquals ("test#05", true, reader.ReadBoolean ()); + Assert.AreEqual (false, reader.ReadBoolean (), "test#01"); + Assert.AreEqual (true, reader.ReadBoolean (), "test#02"); + Assert.AreEqual (true, reader.ReadBoolean (), "test#03"); + Assert.AreEqual (false, reader.ReadBoolean (), "test#04"); + Assert.AreEqual (true, reader.ReadBoolean (), "test#05"); } finally { reader.Close (); stream.Close (); @@ -866,11 +866,11 @@ namespace MonoTests.System.IO stream = new MemoryStream (new byte [] {0, 1, 99, 0, 13}); reader = new BinaryReader (stream); - AssertEquals ("test#01", 0, reader.ReadByte ()); - AssertEquals ("test#02", 1, reader.ReadByte ()); - AssertEquals ("test#03", 99, reader.ReadByte ()); - AssertEquals ("test#04", 0, reader.ReadByte ()); - AssertEquals ("test#05", 13, reader.ReadByte ()); + Assert.AreEqual (0, reader.ReadByte (), "test#01"); + Assert.AreEqual (1, reader.ReadByte (), "test#02"); + Assert.AreEqual (99, reader.ReadByte (), "test#03"); + Assert.AreEqual (0, reader.ReadByte (), "test#04"); + Assert.AreEqual (13, reader.ReadByte (), "test#05"); } finally { reader.Close (); stream.Close (); @@ -913,16 +913,16 @@ namespace MonoTests.System.IO reader = new BinaryReader (stream); byte [] bytes = reader.ReadBytes (2); - AssertEquals ("test#01", 0, bytes [0]); - AssertEquals ("test#02", 1, bytes [1]); + Assert.AreEqual (0, bytes [0], "test#01"); + Assert.AreEqual (1, bytes [1], "test#02"); bytes = reader.ReadBytes (2); - AssertEquals ("test#03", 99, bytes [0]); - AssertEquals ("test#04", 0, bytes [1]); + Assert.AreEqual (99, bytes [0], "test#03"); + Assert.AreEqual (0, bytes [1], "test#04"); bytes = reader.ReadBytes (2); - AssertEquals ("test#05", 13, bytes [0]); - AssertEquals ("test#06", 1, bytes.Length); + Assert.AreEqual (13, bytes [0], "test#05"); + Assert.AreEqual (1, bytes.Length, "test#06"); } finally { reader.Close (); @@ -962,11 +962,11 @@ namespace MonoTests.System.IO stream = new MemoryStream (new byte [] {0, 1, 99, 0, 13}); reader = new BinaryReader (stream); - AssertEquals ("test#01", 0, reader.ReadChar ()); - AssertEquals ("test#02", 1, reader.ReadChar ()); - AssertEquals ("test#03", 99, reader.ReadChar ()); - AssertEquals ("test#04", 0, reader.ReadChar ()); - AssertEquals ("test#05", 13, reader.ReadChar ()); + Assert.AreEqual (0, reader.ReadChar (), "test#01"); + Assert.AreEqual (1, reader.ReadChar (), "test#02"); + Assert.AreEqual (99, reader.ReadChar (), "test#03"); + Assert.AreEqual (0, reader.ReadChar (), "test#04"); + Assert.AreEqual (13, reader.ReadChar (), "test#05"); } finally { reader.Close (); stream.Close (); @@ -1007,16 +1007,16 @@ namespace MonoTests.System.IO stream = new MemoryStream (new byte [] {0, 1, 99, 0, 13}); reader = new BinaryReader (stream); char [] chars = reader.ReadChars (2); - AssertEquals ("test#01", 0, chars [0]); - AssertEquals ("test#02", 1, chars [1]); + Assert.AreEqual (0, chars [0], "test#01"); + Assert.AreEqual (1, chars [1], "test#02"); chars = reader.ReadChars (2); - AssertEquals ("test#03", 99, chars [0]); - AssertEquals ("test#04", 0, chars [1]); + Assert.AreEqual (99, chars [0], "test#03"); + Assert.AreEqual (0, chars [1], "test#04"); chars = reader.ReadChars (2); - AssertEquals ("test#05", 13, chars [0]); - AssertEquals ("test#06", 1, chars.Length); + Assert.AreEqual (13, chars [0], "test#05"); + Assert.AreEqual (1, chars.Length, "test#06"); } finally { reader.Close (); stream.Close (); @@ -1054,7 +1054,7 @@ namespace MonoTests.System.IO try { stream = new MemoryStream (new byte [] {0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0 ,128, 0, 0, 0, 0, 0}); reader = new BinaryReader (stream); - AssertEquals ("test#01", -18295873486192640, reader.ReadDecimal ()); + Assert.AreEqual (-18295873486192640, reader.ReadDecimal (), "test#01"); } finally { reader.Close (); stream.Close (); @@ -1082,8 +1082,8 @@ namespace MonoTests.System.IO MemoryStream stream = new MemoryStream (new byte [] {0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0 ,87, 98, 0, 0, 0, 0}); BinaryReader reader = new BinaryReader (stream); try { - AssertEquals ("test#01", 1.8913127797311212E-307d, reader.ReadDouble ()); - AssertEquals ("test#02", 1.2024538023802026E+111d, reader.ReadDouble ()); + Assert.AreEqual (1.8913127797311212E-307d, reader.ReadDouble (), "test#01"); + Assert.AreEqual (1.2024538023802026E+111d, reader.ReadDouble (), "test#02"); } finally { reader.Close (); stream.Close (); @@ -1112,10 +1112,10 @@ namespace MonoTests.System.IO MemoryStream stream = new MemoryStream (new byte [] {65, 1, 32, 43, 5, 3, 54, 0}); BinaryReader reader = new BinaryReader (stream); try { - AssertEquals ("test#01", 321, reader.ReadInt16 ()); - AssertEquals ("test#02", 11040, reader.ReadInt16 ()); - AssertEquals ("test#03", 773, reader.ReadInt16 ()); - AssertEquals ("test#04", 54, reader.ReadInt16 ()); + Assert.AreEqual (321, reader.ReadInt16 (), "test#01"); + Assert.AreEqual (11040, reader.ReadInt16 (), "test#02"); + Assert.AreEqual (773, reader.ReadInt16 (), "test#03"); + Assert.AreEqual (54, reader.ReadInt16 (), "test#04"); } finally { reader.Close (); stream.Close (); @@ -1143,8 +1143,8 @@ namespace MonoTests.System.IO MemoryStream stream = new MemoryStream (new byte [] {65, 1, 32, 43, 5, 3, 54, 0}); BinaryReader reader = new BinaryReader (stream); try { - AssertEquals ("test#01", 723517761, reader.ReadInt32 ()); - AssertEquals ("test#02", 3539717, reader.ReadInt32 ()); + Assert.AreEqual (723517761, reader.ReadInt32 (), "test#01"); + Assert.AreEqual (3539717, reader.ReadInt32 (), "test#02"); } finally { reader.Close (); stream.Close (); @@ -1172,8 +1172,8 @@ namespace MonoTests.System.IO MemoryStream stream = new MemoryStream (new byte [] {65, 1, 32, 43, 5, 3, 54, 0, 34, 5, 7, 4, 23, 4, 76, 34, 76, 2, 6,45}); BinaryReader reader = new BinaryReader (stream); try { - AssertEquals ("test#01", 15202969475612993, reader.ReadInt64 ()); - AssertEquals ("test#02", 2471354792417887522, reader.ReadInt64 ()); + Assert.AreEqual (15202969475612993, reader.ReadInt64 (), "test#01"); + Assert.AreEqual (2471354792417887522, reader.ReadInt64 (), "test#02"); } finally { reader.Close (); stream.Close (); @@ -1204,9 +1204,9 @@ namespace MonoTests.System.IO BinaryReader reader = new BinaryReader (stream); try { - AssertEquals ("test#01", 65, reader.ReadSByte ()); - AssertEquals ("test#02", -56, reader.ReadSByte ()); - AssertEquals ("test#03", 32, reader.ReadSByte ()); + Assert.AreEqual (65, reader.ReadSByte (), "test#01"); + Assert.AreEqual (-56, reader.ReadSByte (), "test#02"); + Assert.AreEqual (32, reader.ReadSByte (), "test#03"); } finally { reader.Close (); stream.Close (); @@ -1236,8 +1236,8 @@ namespace MonoTests.System.IO MemoryStream stream = new MemoryStream (new byte [] {65, 200, 0, 0, 0, 1, 2, 3, 4}); BinaryReader reader = new BinaryReader (stream); try { - AssertEquals ("test#01", 7.18375658E-41F, reader.ReadSingle ()); - AssertEquals ("test#02", 3.82047143E-37F, reader.ReadSingle ()); + Assert.AreEqual (7.18375658E-41F, reader.ReadSingle (), "test#01"); + Assert.AreEqual (3.82047143E-37F, reader.ReadSingle (), "test#02"); } finally { reader.Close (); stream.Close (); @@ -1268,12 +1268,12 @@ namespace MonoTests.System.IO try { stream = new MemoryStream (new byte [] {6,109, 111, 110, 111, 58, 58}); reader = new BinaryReader (stream); - AssertEquals ("test#01", "mono::", reader.ReadString ()); + Assert.AreEqual ("mono::", reader.ReadString (), "test#01"); stream = new MemoryStream (new byte [] {2,109, 111, 3, 111, 58, 58}); reader = new BinaryReader (stream); - AssertEquals ("test#02", "mo", reader.ReadString ()); - AssertEquals ("test#03", "o::", reader.ReadString ()); + Assert.AreEqual ("mo", reader.ReadString (), "test#02"); + Assert.AreEqual ("o::", reader.ReadString (), "test#03"); } finally { reader.Close (); stream.Close (); @@ -1291,7 +1291,7 @@ namespace MonoTests.System.IO w.Flush (); ms.Position = 0; BinaryReader r = new BinaryReader (ms); - AssertEquals (s, r.ReadString ()); + Assert.AreEqual (s, r.ReadString ()); } [Test] @@ -1333,10 +1333,10 @@ namespace MonoTests.System.IO BinaryReader reader = new BinaryReader (stream); try { - AssertEquals ("test#01", 51400, reader.ReadUInt16 ()); - AssertEquals ("test#02", 11040, reader.ReadUInt16 ()); - AssertEquals ("test#03", 773, reader.ReadUInt16 ()); - AssertEquals ("test#04", 54, reader.ReadUInt16 ()); + Assert.AreEqual (51400, reader.ReadUInt16 (), "test#01"); + Assert.AreEqual (11040, reader.ReadUInt16 (), "test#02"); + Assert.AreEqual (773, reader.ReadUInt16 (), "test#03"); + Assert.AreEqual (54, reader.ReadUInt16 (), "test#04"); } finally { reader.Close (); stream.Close (); @@ -1364,8 +1364,8 @@ namespace MonoTests.System.IO MemoryStream stream = new MemoryStream (new byte [] {65, 1, 32, 43, 5, 3, 54, 0}); BinaryReader reader = new BinaryReader (stream); try { - AssertEquals ("test#01", 723517761, reader.ReadUInt32 ()); - AssertEquals ("test#02", 3539717, reader.ReadUInt32 ()); + Assert.AreEqual (723517761, reader.ReadUInt32 (), "test#01"); + Assert.AreEqual (3539717, reader.ReadUInt32 (), "test#02"); } finally { reader.Close (); stream.Close (); @@ -1395,8 +1395,8 @@ namespace MonoTests.System.IO BinaryReader reader = new BinaryReader (stream); try { - AssertEquals ("test#01", 15202969475612993, reader.ReadUInt64 ()); - AssertEquals ("test#02", 2471354792417887522, reader.ReadUInt64 ()); + Assert.AreEqual (15202969475612993, reader.ReadUInt64 (), "test#01"); + Assert.AreEqual (2471354792417887522, reader.ReadUInt64 (), "test#02"); } finally { reader.Close (); stream.Close (); @@ -1410,7 +1410,7 @@ namespace MonoTests.System.IO BinaryReader reader = new BinaryReader (stream); char [] result = reader.ReadChars (0); - AssertEquals ("ZERO_1", result.Length, 0); + Assert.AreEqual (result.Length, 0, "ZERO_1"); } [Test] diff --git a/mcs/class/corlib/Test/System.IO/BinaryWriterTest.cs b/mcs/class/corlib/Test/System.IO/BinaryWriterTest.cs index 118874e0ff3..98e71eb7464 100644 --- a/mcs/class/corlib/Test/System.IO/BinaryWriterTest.cs +++ b/mcs/class/corlib/Test/System.IO/BinaryWriterTest.cs @@ -15,7 +15,7 @@ using System; namespace MonoTests.System.IO { [TestFixture] -public class BinaryWriterTest : Assertion { +public class BinaryWriterTest { string TempFolder = Path.Combine (Path.GetTempPath (), "MonoTests.System.IO.Tests"); @@ -39,14 +39,14 @@ public class BinaryWriterTest : Assertion { { MemoryStream stream = new MemoryStream (); BinaryWriter writer = new BinaryWriter (stream); - AssertEquals ("test#01", true, writer.BaseStream.CanRead); - AssertEquals ("test#02", true, writer.BaseStream.CanSeek); - AssertEquals ("test#03", true, writer.BaseStream.CanWrite); + Assert.AreEqual (true, writer.BaseStream.CanRead, "test#01"); + Assert.AreEqual (true, writer.BaseStream.CanSeek, "test#02"); + Assert.AreEqual (true, writer.BaseStream.CanWrite, "test#03"); writer = new BinaryWriter (stream, new ASCIIEncoding ()); - AssertEquals ("test#04", true, writer.BaseStream.CanRead); - AssertEquals ("test#05", true, writer.BaseStream.CanSeek); - AssertEquals ("test#06", true, writer.BaseStream.CanWrite); + Assert.AreEqual (true, writer.BaseStream.CanRead, "test#04"); + Assert.AreEqual (true, writer.BaseStream.CanSeek, "test#05"); + Assert.AreEqual (true, writer.BaseStream.CanWrite, "test#06"); } @@ -115,55 +115,55 @@ public class BinaryWriterTest : Assertion { writer.Write ("t*st"); byte [] bytes = stream.GetBuffer (); - AssertEquals ("test#01", 4, bytes [0]); - AssertEquals ("test#02", 116, bytes [1]); - AssertEquals ("test#03", 42, bytes [2]); - AssertEquals ("test#04", 115, bytes [3]); - AssertEquals ("test#05", 116, bytes [4]); - AssertEquals ("test#06", 0, bytes [5]); + Assert.AreEqual (4, bytes [0], "test#01"); + Assert.AreEqual (116, bytes [1], "test#02"); + Assert.AreEqual (42, bytes [2], "test#03"); + Assert.AreEqual (115, bytes [3], "test#04"); + Assert.AreEqual (116, bytes [4], "test#05"); + Assert.AreEqual (0, bytes [5], "test#06"); stream = new MemoryStream (); writer = new BinaryWriter (stream, new UnicodeEncoding ()); writer.Write ("t*st"); bytes = stream.GetBuffer (); - AssertEquals ("test#07", 8, bytes [0]); - AssertEquals ("test#08", 116, bytes [1]); - AssertEquals ("test#09", 0, bytes [2]); - AssertEquals ("test#10", 42, bytes [3]); - AssertEquals ("test#11", 0, bytes [4]); - AssertEquals ("test#12", 115, bytes [5]); - AssertEquals ("test#13", 0, bytes [6]); - AssertEquals ("test#14", 116, bytes [7]); - AssertEquals ("test#15", 0, bytes [8]); + Assert.AreEqual (8, bytes [0], "test#07"); + Assert.AreEqual (116, bytes [1], "test#08"); + Assert.AreEqual (0, bytes [2], "test#09"); + Assert.AreEqual (42, bytes [3], "test#10"); + Assert.AreEqual (0, bytes [4], "test#11"); + Assert.AreEqual (115, bytes [5], "test#12"); + Assert.AreEqual (0, bytes [6], "test#13"); + Assert.AreEqual (116, bytes [7], "test#14"); + Assert.AreEqual (0, bytes [8], "test#15"); stream = new MemoryStream (); writer = new BinaryWriter (stream, new UTF7Encoding ()); writer.Write ("t*st"); bytes = stream.GetBuffer (); - AssertEquals ("test#16", 8, bytes [0]); - AssertEquals ("test#17", 116, bytes [1]); - AssertEquals ("test#18", 43, bytes [2]); - AssertEquals ("test#19", 65, bytes [3]); - AssertEquals ("test#21", 67, bytes [4]); - AssertEquals ("test#22", 111, bytes [5]); - AssertEquals ("test#23", 45, bytes [6]); - AssertEquals ("test#24", 115, bytes [7]); - AssertEquals ("test#25", 116, bytes [8]); - AssertEquals ("test#26", 0, bytes [9]); - AssertEquals ("test#27", 0, bytes [10]); + Assert.AreEqual (8, bytes [0], "test#16"); + Assert.AreEqual (116, bytes [1], "test#17"); + Assert.AreEqual (43, bytes [2], "test#18"); + Assert.AreEqual (65, bytes [3], "test#19"); + Assert.AreEqual (67, bytes [4], "test#21"); + Assert.AreEqual (111, bytes [5], "test#22"); + Assert.AreEqual (45, bytes [6], "test#23"); + Assert.AreEqual (115, bytes [7], "test#24"); + Assert.AreEqual (116, bytes [8], "test#25"); + Assert.AreEqual (0, bytes [9], "test#26"); + Assert.AreEqual (0, bytes [10], "test#27"); stream = new MemoryStream (); writer = new BinaryWriter (stream, new ASCIIEncoding ()); writer.Write ("t*st"); bytes = stream.GetBuffer (); - AssertEquals ("test#28", 4, bytes [0]); - AssertEquals ("test#29", 116, bytes [1]); - AssertEquals ("test#30", 42, bytes [2]); - AssertEquals ("test#31", 115, bytes [3]); - AssertEquals ("test#32", 116, bytes [4]); - AssertEquals ("test#33", 0, bytes [5]); + Assert.AreEqual (4, bytes [0], "test#28"); + Assert.AreEqual (116, bytes [1], "test#29"); + Assert.AreEqual (42, bytes [2], "test#30"); + Assert.AreEqual (115, bytes [3], "test#31"); + Assert.AreEqual (116, bytes [4], "test#32"); + Assert.AreEqual (0, bytes [5], "test#33"); } [Test] @@ -202,9 +202,9 @@ public class BinaryWriterTest : Assertion { MemoryStream stream = new MemoryStream (); BinaryWriter writer = new BinaryWriter (stream, new ASCIIEncoding ()); writer.Close (); - AssertEquals ("test#01", false, writer.BaseStream.CanRead); - AssertEquals ("test#01", false, writer.BaseStream.CanWrite); - AssertEquals ("test#01", false, writer.BaseStream.CanSeek); + Assert.AreEqual (false, writer.BaseStream.CanRead, "test#01"); + Assert.AreEqual (false, writer.BaseStream.CanWrite, "test#01"); + Assert.AreEqual (false, writer.BaseStream.CanSeek, "test#01"); } [Test] @@ -224,21 +224,21 @@ public class BinaryWriterTest : Assertion { writer.Write ("-"); byte [] bytes = stream.GetBuffer (); - AssertEquals ("test#01", 512, bytes.Length); - AssertEquals ("test#02", 4, bytes [0]); - AssertEquals ("test#03", 84, bytes [1]); - AssertEquals ("test#04", 1, bytes [2]); - AssertEquals ("test#05", 45, bytes [3]); - AssertEquals ("test#06", 116, bytes [4]); - AssertEquals ("test#07", 0, bytes [5]); - AssertEquals ("test#08", 0, bytes [6]); - AssertEquals ("test#09", 0, bytes [7]); - AssertEquals ("test#10", 1, bytes [8]); - AssertEquals ("test#11", 45, bytes [9]); - AssertEquals ("test#12", 0, bytes [10]); - AssertEquals ("test#13", 0, bytes [11]); - AssertEquals ("test#14", 0, bytes [12]); - AssertEquals ("test#15", 1, bytes [400]); + Assert.AreEqual (512, bytes.Length, "test#01"); + Assert.AreEqual (4, bytes [0], "test#02"); + Assert.AreEqual (84, bytes [1], "test#03"); + Assert.AreEqual (1, bytes [2], "test#04"); + Assert.AreEqual (45, bytes [3], "test#05"); + Assert.AreEqual (116, bytes [4], "test#06"); + Assert.AreEqual (0, bytes [5], "test#07"); + Assert.AreEqual (0, bytes [6], "test#08"); + Assert.AreEqual (0, bytes [7], "test#09"); + Assert.AreEqual (1, bytes [8], "test#10"); + Assert.AreEqual (45, bytes [9], "test#11"); + Assert.AreEqual (0, bytes [10], "test#12"); + Assert.AreEqual (0, bytes [11], "test#13"); + Assert.AreEqual (0, bytes [12], "test#14"); + Assert.AreEqual (1, bytes [400], "test#15"); } [Test] @@ -263,21 +263,21 @@ public class BinaryWriterTest : Assertion { byte [] bytes = stream.GetBuffer (); - AssertEquals ("test#01", 256, bytes.Length); - AssertEquals ("test#02", 109, bytes [0]); - AssertEquals ("test#03", 111, bytes [1]); - AssertEquals ("test#04", 110, bytes [2]); - AssertEquals ("test#05", 111, bytes [3]); - AssertEquals ("test#06", 58, bytes [4]); - AssertEquals ("test#07", 58, bytes [5]); - AssertEquals ("test#08", 58, bytes [6]); - AssertEquals ("test#09", 58, bytes [7]); - AssertEquals ("test#10", 79, bytes [8]); - AssertEquals ("test#11", 78, bytes [9]); - AssertEquals ("test#12", 79, bytes [10]); - AssertEquals ("test#13", 77, bytes [11]); - AssertEquals ("test#14", 0, bytes [12]); - AssertEquals ("test#15", 0, bytes [13]); + Assert.AreEqual (256, bytes.Length, "test#01"); + Assert.AreEqual (109, bytes [0], "test#02"); + Assert.AreEqual (111, bytes [1], "test#03"); + Assert.AreEqual (110, bytes [2], "test#04"); + Assert.AreEqual (111, bytes [3], "test#05"); + Assert.AreEqual (58, bytes [4], "test#06"); + Assert.AreEqual (58, bytes [5], "test#07"); + Assert.AreEqual (58, bytes [6], "test#08"); + Assert.AreEqual (58, bytes [7], "test#09"); + Assert.AreEqual (79, bytes [8], "test#10"); + Assert.AreEqual (78, bytes [9], "test#11"); + Assert.AreEqual (79, bytes [10], "test#12"); + Assert.AreEqual (77, bytes [11], "test#13"); + Assert.AreEqual (0, bytes [12], "test#14"); + Assert.AreEqual (0, bytes [13], "test#15"); } [Test] @@ -290,21 +290,21 @@ public class BinaryWriterTest : Assertion { writer.Write (new byte [] {6, 5, 4, 3, 2, 1}); byte [] bytes = stream.GetBuffer (); - AssertEquals ("test#01", 256, bytes.Length); - AssertEquals ("test#02", 1, bytes [0]); - AssertEquals ("test#03", 2, bytes [1]); - AssertEquals ("test#04", 3, bytes [2]); - AssertEquals ("test#05", 4, bytes [3]); - AssertEquals ("test#06", 5, bytes [4]); - AssertEquals ("test#07", 6, bytes [5]); - AssertEquals ("test#08", 6, bytes [6]); - AssertEquals ("test#09", 5, bytes [7]); - AssertEquals ("test#10", 4, bytes [8]); - AssertEquals ("test#11", 3, bytes [9]); - AssertEquals ("test#12", 2, bytes [10]); - AssertEquals ("test#13", 1, bytes [11]); - AssertEquals ("test#14", 0, bytes [12]); - AssertEquals ("test#15", 0, bytes [13]); + Assert.AreEqual (256, bytes.Length, "test#01"); + Assert.AreEqual (1, bytes [0], "test#02"); + Assert.AreEqual (2, bytes [1], "test#03"); + Assert.AreEqual (3, bytes [2], "test#04"); + Assert.AreEqual (4, bytes [3], "test#05"); + Assert.AreEqual (5, bytes [4], "test#06"); + Assert.AreEqual (6, bytes [5], "test#07"); + Assert.AreEqual (6, bytes [6], "test#08"); + Assert.AreEqual (5, bytes [7], "test#09"); + Assert.AreEqual (4, bytes [8], "test#10"); + Assert.AreEqual (3, bytes [9], "test#11"); + Assert.AreEqual (2, bytes [10], "test#12"); + Assert.AreEqual (1, bytes [11], "test#13"); + Assert.AreEqual (0, bytes [12], "test#14"); + Assert.AreEqual (0, bytes [13], "test#15"); } @@ -320,31 +320,31 @@ public class BinaryWriterTest : Assertion { writer.Write (s); byte [] bytes; bytes = stream.GetBuffer (); - AssertEquals ("test#01", 256, bytes.Length); - AssertEquals ("test#02", 64, bytes [0]); - AssertEquals ("test#03", 0, bytes [1]); + Assert.AreEqual (256, bytes.Length, "test#01"); + Assert.AreEqual (64, bytes [0], "test#02"); + Assert.AreEqual (0, bytes [1], "test#03"); writer.Write (i); bytes = stream.GetBuffer (); - AssertEquals ("test#04", 256, bytes.Length); - AssertEquals ("test#05", 64, bytes [0]); - AssertEquals ("test#06", 0, bytes [1]); - AssertEquals ("test#07", 64, bytes [2]); - AssertEquals ("test#08", 109, bytes [3]); - AssertEquals ("test#09", 218, bytes [4]); - AssertEquals ("test#10", 3, bytes [5]); - AssertEquals ("test#11", 0, bytes [6]); + Assert.AreEqual (256, bytes.Length, "test#04"); + Assert.AreEqual (64, bytes [0], "test#05"); + Assert.AreEqual (0, bytes [1], "test#06"); + Assert.AreEqual (64, bytes [2], "test#07"); + Assert.AreEqual (109, bytes [3], "test#08"); + Assert.AreEqual (218, bytes [4], "test#09"); + Assert.AreEqual (3, bytes [5], "test#10"); + Assert.AreEqual (0, bytes [6], "test#11"); writer.Write (l); bytes = stream.GetBuffer (); - AssertEquals ("test#12", 256, bytes.Length); - AssertEquals ("test#13", 255, bytes [6]); - AssertEquals ("test#14", 159, bytes [7]); - AssertEquals ("test#15", 114, bytes [8]); - AssertEquals ("test#16", 78, bytes [9]); - AssertEquals ("test#17", 24, bytes [10]); - AssertEquals ("test#18", 9, bytes [11]); - AssertEquals ("test#19", 0, bytes [12]); + Assert.AreEqual (256, bytes.Length, "test#12"); + Assert.AreEqual (255, bytes [6], "test#13"); + Assert.AreEqual (159, bytes [7], "test#14"); + Assert.AreEqual (114, bytes [8], "test#15"); + Assert.AreEqual (78, bytes [9], "test#16"); + Assert.AreEqual (24, bytes [10], "test#17"); + Assert.AreEqual (9, bytes [11], "test#18"); + Assert.AreEqual (0, bytes [12], "test#19"); } [Test] @@ -360,54 +360,54 @@ public class BinaryWriterTest : Assertion { writer.Write (d2); byte [] bytes = stream.GetBuffer (); - AssertEquals ("test#01", 256, bytes.Length); - AssertEquals ("test#02", 192, bytes [0]); - AssertEquals ("test#03", 18, bytes [1]); - AssertEquals ("test#04", 151, bytes [2]); - AssertEquals ("test#05", 95, bytes [3]); - AssertEquals ("test#06", 209, bytes [4]); - AssertEquals ("test#07", 20, bytes [5]); - AssertEquals ("test#08", 7, bytes [6]); - AssertEquals ("test#09", 0, bytes [7]); - AssertEquals ("test#10", 0, bytes [8]); - AssertEquals ("test#11", 0, bytes [9]); - AssertEquals ("test#12", 0, bytes [10]); - AssertEquals ("test#13", 0, bytes [11]); - AssertEquals ("test#14", 0, bytes [12]); - AssertEquals ("test#15", 0, bytes [13]); - AssertEquals ("test#16", 2, bytes [14]); - AssertEquals ("test#17", 0, bytes [15]); - AssertEquals ("test#18", 125, bytes [16]); - AssertEquals ("test#19", 149, bytes [17]); - AssertEquals ("test#20", 217, bytes [18]); - AssertEquals ("test#21", 172, bytes [19]); - AssertEquals ("test#22", 239, bytes [20]); - AssertEquals ("test#23", 244, bytes [21]); - AssertEquals ("test#24", 31, bytes [22]); - AssertEquals ("test#25", 0, bytes [23]); - AssertEquals ("test#26", 0, bytes [24]); - AssertEquals ("test#27", 0, bytes [25]); - AssertEquals ("test#28", 0, bytes [26]); - AssertEquals ("test#29", 0, bytes [27]); - AssertEquals ("test#30", 0, bytes [28]); - AssertEquals ("test#31", 0, bytes [29]); - AssertEquals ("test#32", 0, bytes [30]); - AssertEquals ("test#33", 128, bytes [31]); - AssertEquals ("test#34", 0, bytes [32]); - AssertEquals ("test#35", 0, bytes [33]); - AssertEquals ("test#36", 0, bytes [34]); - AssertEquals ("test#37", 0, bytes [35]); - AssertEquals ("test#38", 0, bytes [36]); - AssertEquals ("test#39", 0, bytes [37]); - AssertEquals ("test#40", 0, bytes [38]); - AssertEquals ("test#41", 0, bytes [39]); - AssertEquals ("test#42", 0, bytes [40]); - AssertEquals ("test#43", 0, bytes [41]); - AssertEquals ("test#44", 0, bytes [42]); - AssertEquals ("test#45", 0, bytes [43]); - AssertEquals ("test#46", 0, bytes [44]); - AssertEquals ("test#47", 0, bytes [45]); - AssertEquals ("test#48", 0, bytes [46]); + Assert.AreEqual (256, bytes.Length, "test#01"); + Assert.AreEqual (192, bytes [0], "test#02"); + Assert.AreEqual (18, bytes [1], "test#03"); + Assert.AreEqual (151, bytes [2], "test#04"); + Assert.AreEqual (95, bytes [3], "test#05"); + Assert.AreEqual (209, bytes [4], "test#06"); + Assert.AreEqual (20, bytes [5], "test#07"); + Assert.AreEqual (7, bytes [6], "test#08"); + Assert.AreEqual (0, bytes [7], "test#09"); + Assert.AreEqual (0, bytes [8], "test#10"); + Assert.AreEqual (0, bytes [9], "test#11"); + Assert.AreEqual (0, bytes [10], "test#12"); + Assert.AreEqual (0, bytes [11], "test#13"); + Assert.AreEqual (0, bytes [12], "test#14"); + Assert.AreEqual (0, bytes [13], "test#15"); + Assert.AreEqual (2, bytes [14], "test#16"); + Assert.AreEqual (0, bytes [15], "test#17"); + Assert.AreEqual (125, bytes [16], "test#18"); + Assert.AreEqual (149, bytes [17], "test#19"); + Assert.AreEqual (217, bytes [18], "test#20"); + Assert.AreEqual (172, bytes [19], "test#21"); + Assert.AreEqual (239, bytes [20], "test#22"); + Assert.AreEqual (244, bytes [21], "test#23"); + Assert.AreEqual (31, bytes [22], "test#24"); + Assert.AreEqual (0, bytes [23], "test#25"); + Assert.AreEqual (0, bytes [24], "test#26"); + Assert.AreEqual (0, bytes [25], "test#27"); + Assert.AreEqual (0, bytes [26], "test#28"); + Assert.AreEqual (0, bytes [27], "test#29"); + Assert.AreEqual (0, bytes [28], "test#30"); + Assert.AreEqual (0, bytes [29], "test#31"); + Assert.AreEqual (0, bytes [30], "test#32"); + Assert.AreEqual (128, bytes [31], "test#33"); + Assert.AreEqual (0, bytes [32], "test#34"); + Assert.AreEqual (0, bytes [33], "test#35"); + Assert.AreEqual (0, bytes [34], "test#36"); + Assert.AreEqual (0, bytes [35], "test#37"); + Assert.AreEqual (0, bytes [36], "test#38"); + Assert.AreEqual (0, bytes [37], "test#39"); + Assert.AreEqual (0, bytes [38], "test#40"); + Assert.AreEqual (0, bytes [39], "test#41"); + Assert.AreEqual (0, bytes [40], "test#42"); + Assert.AreEqual (0, bytes [41], "test#43"); + Assert.AreEqual (0, bytes [42], "test#44"); + Assert.AreEqual (0, bytes [43], "test#45"); + Assert.AreEqual (0, bytes [44], "test#46"); + Assert.AreEqual (0, bytes [45], "test#47"); + Assert.AreEqual (0, bytes [46], "test#48"); } [Test] @@ -421,17 +421,17 @@ public class BinaryWriterTest : Assertion { writer.Write (f2); byte [] bytes = stream.GetBuffer (); - AssertEquals ("test#01", 256, bytes.Length); - AssertEquals ("test#02", 199, bytes [0]); - AssertEquals ("test#03", 236, bytes [1]); - AssertEquals ("test#04", 101, bytes [2]); - AssertEquals ("test#05", 80, bytes [3]); - AssertEquals ("test#06", 10, bytes [4]); - AssertEquals ("test#07", 245, bytes [5]); - AssertEquals ("test#08", 33, bytes [6]); - AssertEquals ("test#09", 183, bytes [7]); - AssertEquals ("test#10", 0, bytes [8]); - AssertEquals ("test#11", 0, bytes [9]); + Assert.AreEqual (256, bytes.Length, "test#01"); + Assert.AreEqual (199, bytes [0], "test#02"); + Assert.AreEqual (236, bytes [1], "test#03"); + Assert.AreEqual (101, bytes [2], "test#04"); + Assert.AreEqual (80, bytes [3], "test#05"); + Assert.AreEqual (10, bytes [4], "test#06"); + Assert.AreEqual (245, bytes [5], "test#07"); + Assert.AreEqual (33, bytes [6], "test#08"); + Assert.AreEqual (183, bytes [7], "test#09"); + Assert.AreEqual (0, bytes [8], "test#10"); + Assert.AreEqual (0, bytes [9], "test#11"); } [Test] @@ -445,24 +445,24 @@ public class BinaryWriterTest : Assertion { writer.Write (d2); byte [] bytes = stream.GetBuffer (); - AssertEquals ("test#01", 256, bytes.Length); - AssertEquals ("test#02", 49, bytes [0]); - AssertEquals ("test#03", 69, bytes [1]); - AssertEquals ("test#04", 15, bytes [2]); - AssertEquals ("test#05", 157, bytes [3]); - AssertEquals ("test#06", 211, bytes [4]); - AssertEquals ("test#07", 55, bytes [5]); - AssertEquals ("test#08", 188, bytes [6]); - AssertEquals ("test#09", 84, bytes [7]); - AssertEquals ("test#10", 76, bytes [8]); - AssertEquals ("test#11", 59, bytes [9]); - AssertEquals ("test#12", 59, bytes [10]); - AssertEquals ("test#13", 60, bytes [11]); - AssertEquals ("test#14", 4, bytes [12]); - AssertEquals ("test#15", 196, bytes [13]); - AssertEquals ("test#16", 90, bytes [14]); - AssertEquals ("test#17", 165, bytes [15]); - AssertEquals ("test#18", 0, bytes [16]); + Assert.AreEqual (256, bytes.Length, "test#01"); + Assert.AreEqual (49, bytes [0], "test#02"); + Assert.AreEqual (69, bytes [1], "test#03"); + Assert.AreEqual (15, bytes [2], "test#04"); + Assert.AreEqual (157, bytes [3], "test#05"); + Assert.AreEqual (211, bytes [4], "test#06"); + Assert.AreEqual (55, bytes [5], "test#07"); + Assert.AreEqual (188, bytes [6], "test#08"); + Assert.AreEqual (84, bytes [7], "test#09"); + Assert.AreEqual (76, bytes [8], "test#10"); + Assert.AreEqual (59, bytes [9], "test#11"); + Assert.AreEqual (59, bytes [10], "test#12"); + Assert.AreEqual (60, bytes [11], "test#13"); + Assert.AreEqual (4, bytes [12], "test#14"); + Assert.AreEqual (196, bytes [13], "test#15"); + Assert.AreEqual (90, bytes [14], "test#16"); + Assert.AreEqual (165, bytes [15], "test#17"); + Assert.AreEqual (0, bytes [16], "test#18"); } [Test] @@ -480,12 +480,12 @@ public class BinaryWriterTest : Assertion { writer.Write (c2); byte [] bytes = stream.GetBuffer (); - AssertEquals ("test#01", 256, bytes.Length); - AssertEquals ("test#02", 12, bytes [0]); - AssertEquals ("test#03", 45, bytes [1]); - AssertEquals ("test#04", 64, bytes [2]); - AssertEquals ("test#05", 77, bytes [3]); - AssertEquals ("test#06", 0, bytes [4]); + Assert.AreEqual (256, bytes.Length, "test#01"); + Assert.AreEqual (12, bytes [0], "test#02"); + Assert.AreEqual (45, bytes [1], "test#03"); + Assert.AreEqual (64, bytes [2], "test#04"); + Assert.AreEqual (77, bytes [3], "test#05"); + Assert.AreEqual (0, bytes [4], "test#06"); } [Test] @@ -499,17 +499,17 @@ public class BinaryWriterTest : Assertion { writer.Write (s2); byte [] bytes = stream.GetBuffer (); - AssertEquals ("test#01", 256, bytes.Length); - AssertEquals ("test#02", 3, bytes [0]); - AssertEquals ("test#03", 97, bytes [1]); - AssertEquals ("test#04", 98, bytes [2]); - AssertEquals ("test#05", 99, bytes [3]); - AssertEquals ("test#06", 4, bytes [4]); - AssertEquals ("test#07", 68, bytes [5]); - AssertEquals ("test#08", 101, bytes [6]); - AssertEquals ("test#09", 70, bytes [7]); - AssertEquals ("test#10", 10, bytes [8]); - AssertEquals ("test#11", 0, bytes [9]); + Assert.AreEqual (256, bytes.Length, "test#01"); + Assert.AreEqual (3, bytes [0], "test#02"); + Assert.AreEqual (97, bytes [1], "test#03"); + Assert.AreEqual (98, bytes [2], "test#04"); + Assert.AreEqual (99, bytes [3], "test#05"); + Assert.AreEqual (4, bytes [4], "test#06"); + Assert.AreEqual (68, bytes [5], "test#07"); + Assert.AreEqual (101, bytes [6], "test#08"); + Assert.AreEqual (70, bytes [7], "test#09"); + Assert.AreEqual (10, bytes [8], "test#10"); + Assert.AreEqual (0, bytes [9], "test#11"); } private void DeleteFile (string path) diff --git a/mcs/class/corlib/Test/System.IO/BufferedStreamTest.cs b/mcs/class/corlib/Test/System.IO/BufferedStreamTest.cs index b455a4a8334..d987d4264f0 100644 --- a/mcs/class/corlib/Test/System.IO/BufferedStreamTest.cs +++ b/mcs/class/corlib/Test/System.IO/BufferedStreamTest.cs @@ -17,7 +17,7 @@ using System; namespace MonoTests.System.IO { [TestFixture] -public class BufferedStreamTest : Assertion { +public class BufferedStreamTest { private MemoryStream mem; @@ -43,11 +43,11 @@ public class BufferedStreamTest : Assertion { str.Write (new byte [] {1, 2, 3, 4, 5, 6}, 0, 6); BufferedStream stream = new BufferedStream (str); - AssertEquals ("test#01", true, stream.CanRead); - AssertEquals ("test#02", true, stream.CanSeek); - AssertEquals ("test#03", true, stream.CanWrite); - AssertEquals ("test#04", 6, stream.Length); - AssertEquals ("test#05", 6, stream.Position); + Assert.AreEqual (true, stream.CanRead, "test#01"); + Assert.AreEqual (true, stream.CanSeek, "test#02"); + Assert.AreEqual (true, stream.CanWrite, "test#03"); + Assert.AreEqual (6, stream.Length, "test#04"); + Assert.AreEqual (6, stream.Position, "test#05"); string path = Path.GetTempFileName (); if (File.Exists (path)) @@ -55,11 +55,11 @@ public class BufferedStreamTest : Assertion { FileStream file = new FileStream (path, FileMode.OpenOrCreate, FileAccess.Write); stream = new BufferedStream (file); - AssertEquals ("test#06", false, stream.CanRead); - AssertEquals ("test#07", true, stream.CanSeek); - AssertEquals ("test#08", true, stream.CanWrite); - AssertEquals ("test#09", 0, stream.Length); - AssertEquals ("test#10", 0, stream.Position); + Assert.AreEqual (false, stream.CanRead, "test#06"); + Assert.AreEqual (true, stream.CanSeek, "test#07"); + Assert.AreEqual (true, stream.CanWrite, "test#08"); + Assert.AreEqual (0, stream.Length, "test#09"); + Assert.AreEqual (0, stream.Position, "test#10"); file.Close (); if (File.Exists (path)) @@ -67,11 +67,11 @@ public class BufferedStreamTest : Assertion { file = new FileStream (path, FileMode.OpenOrCreate, FileAccess.Write); stream = new BufferedStream (file, 12); - AssertEquals ("test#11", false, stream.CanRead); - AssertEquals ("test#12", true, stream.CanSeek); - AssertEquals ("test#13", true, stream.CanWrite); - AssertEquals ("test#14", 0, stream.Length); - AssertEquals ("test#15", 0, stream.Position); + Assert.AreEqual (false, stream.CanRead, "test#11"); + Assert.AreEqual (true, stream.CanSeek, "test#12"); + Assert.AreEqual (true, stream.CanWrite, "test#13"); + Assert.AreEqual (0, stream.Length, "test#14"); + Assert.AreEqual (0, stream.Position, "test#15"); file.Close (); if (File.Exists (path)) @@ -132,9 +132,9 @@ public class BufferedStreamTest : Assertion { { BufferedStream stream = new BufferedStream (mem); stream.Close (); - AssertEquals ("test#01", false, stream.CanRead); - AssertEquals ("test#02", false, stream.CanSeek); - AssertEquals ("test#03", false, stream.CanWrite); + Assert.AreEqual (false, stream.CanRead, "test#01"); + Assert.AreEqual (false, stream.CanSeek, "test#02"); + Assert.AreEqual (false, stream.CanWrite, "test#03"); } [Test] @@ -190,28 +190,28 @@ public class BufferedStreamTest : Assertion { byte [] bytes = new byte [10]; stream.Read (bytes, 0, 3); - AssertEquals ("test#01", 0, bytes [0]); - AssertEquals ("test#02", 0, bytes [1]); - AssertEquals ("test#03", 0, bytes [2]); + Assert.AreEqual (0, bytes [0], "test#01"); + Assert.AreEqual (0, bytes [1], "test#02"); + Assert.AreEqual (0, bytes [2], "test#03"); stream.Seek (0, SeekOrigin.Begin); stream.Read (bytes, 0, 3); - AssertEquals ("test#04", 0, bytes [0]); - AssertEquals ("test#05", 1, bytes [1]); - AssertEquals ("test#06", 2, bytes [2]); - AssertEquals ("test#07", 0, bytes [0]); + Assert.AreEqual (0, bytes [0], "test#04"); + Assert.AreEqual (1, bytes [1], "test#05"); + Assert.AreEqual (2, bytes [2], "test#06"); + Assert.AreEqual (0, bytes [0], "test#07"); stream.Read (bytes, 5, 3); - AssertEquals ("test#08", 3, bytes [5]); - AssertEquals ("test#09", 4, bytes [6]); - AssertEquals ("test#10", 5, bytes [7]); - AssertEquals ("test#11", 0, bytes [8]); + Assert.AreEqual (3, bytes [5], "test#08"); + Assert.AreEqual (4, bytes [6], "test#09"); + Assert.AreEqual (5, bytes [7], "test#10"); + Assert.AreEqual (0, bytes [8], "test#11"); stream.Read (bytes, 0, 10); - AssertEquals ("test#12", 3, bytes [5]); - AssertEquals ("test#13", 4, bytes [6]); - AssertEquals ("test#14", 5, bytes [7]); - AssertEquals ("test#15", 0, bytes [9]); + Assert.AreEqual (3, bytes [5], "test#12"); + Assert.AreEqual (4, bytes [6], "test#13"); + Assert.AreEqual (5, bytes [7], "test#14"); + Assert.AreEqual (0, bytes [9], "test#15"); } [Test] @@ -280,15 +280,15 @@ public class BufferedStreamTest : Assertion { mem.Write (new byte [] {0, 1, 2, 3, 4, 5, 6, 7}, 0, 8); BufferedStream stream = new BufferedStream (mem); - AssertEquals ("test#01", -1, stream.ReadByte ()); - AssertEquals ("test#02", -1, stream.ReadByte ()); - AssertEquals ("test#03", -1, stream.ReadByte ()); + Assert.AreEqual (-1, stream.ReadByte (), "test#01"); + Assert.AreEqual (-1, stream.ReadByte (), "test#02"); + Assert.AreEqual (-1, stream.ReadByte (), "test#03"); stream.Seek (0, SeekOrigin.Begin); - AssertEquals ("test#04", 0, stream.ReadByte ()); - AssertEquals ("test#05", 1, stream.ReadByte ()); - AssertEquals ("test#06", 2, stream.ReadByte ()); - AssertEquals ("test#07", 3, stream.ReadByte ()); + Assert.AreEqual (0, stream.ReadByte (), "test#04"); + Assert.AreEqual (1, stream.ReadByte (), "test#05"); + Assert.AreEqual (2, stream.ReadByte (), "test#06"); + Assert.AreEqual (3, stream.ReadByte (), "test#07"); } [Test] @@ -297,26 +297,26 @@ public class BufferedStreamTest : Assertion { BufferedStream stream = new BufferedStream (mem); stream.Write (new byte [] {0, 1, 2, 3, 4}, 0, 4); - AssertEquals ("test#01", 4, stream.Length); + Assert.AreEqual (4, stream.Length, "test#01"); byte [] bytes = mem.GetBuffer (); - AssertEquals ("test#02", 0, bytes [0]); - AssertEquals ("test#03", 1, bytes [1]); - AssertEquals ("test#04", 2, bytes [2]); - AssertEquals ("test#05", 3, bytes [3]); + Assert.AreEqual (0, bytes [0], "test#02"); + Assert.AreEqual (1, bytes [1], "test#03"); + Assert.AreEqual (2, bytes [2], "test#04"); + Assert.AreEqual (3, bytes [3], "test#05"); bytes = new byte [] {1, 4, 3}; stream.Write (bytes, 0, 3); stream.Flush (); bytes = mem.GetBuffer (); - AssertEquals ("test#06", 0, bytes [0]); - AssertEquals ("test#07", 1, bytes [1]); - AssertEquals ("test#08", 2, bytes [2]); - AssertEquals ("test#09", 3, bytes [3]); - AssertEquals ("test#10", 1, bytes [4]); - AssertEquals ("test#11", 4, bytes [5]); - AssertEquals ("test#10", 3, bytes [6]); - AssertEquals ("test#11", 0, bytes [7]); - AssertEquals ("test#12", 7, stream.Length); + Assert.AreEqual (0, bytes [0], "test#06"); + Assert.AreEqual (1, bytes [1], "test#07"); + Assert.AreEqual (2, bytes [2], "test#08"); + Assert.AreEqual (3, bytes [3], "test#09"); + Assert.AreEqual (1, bytes [4], "test#10"); + Assert.AreEqual (4, bytes [5], "test#11"); + Assert.AreEqual (3, bytes [6], "test#10"); + Assert.AreEqual (0, bytes [7], "test#11"); + Assert.AreEqual (7, stream.Length, "test#12"); } [Test] @@ -384,11 +384,11 @@ public class BufferedStreamTest : Assertion { stream.WriteByte (2); stream.WriteByte (3); stream.Flush (); - AssertEquals ("test#01", 256, mem.GetBuffer ().Length); - AssertEquals ("test#02", 3, stream.Length); - AssertEquals ("test#03", 1, mem.GetBuffer () [0]); - AssertEquals ("test#04", 2, mem.GetBuffer () [1]); - AssertEquals ("test#05", 3, mem.GetBuffer () [2]); + Assert.AreEqual (256, mem.GetBuffer ().Length, "test#01"); + Assert.AreEqual (3, stream.Length, "test#02"); + Assert.AreEqual (1, mem.GetBuffer () [0], "test#03"); + Assert.AreEqual (2, mem.GetBuffer () [1], "test#04"); + Assert.AreEqual (3, mem.GetBuffer () [2], "test#05"); } [Test] @@ -399,36 +399,36 @@ public class BufferedStreamTest : Assertion { stream.WriteByte (2); byte [] bytes = mem.GetBuffer (); - AssertEquals ("test#01", 0, bytes.Length); + Assert.AreEqual (0, bytes.Length, "test#01"); stream.Flush (); bytes = mem.GetBuffer (); - AssertEquals ("test#02", 256, bytes.Length); - AssertEquals ("test#03", 1, bytes [0]); - AssertEquals ("test#04", 2, bytes [1]); + Assert.AreEqual (256, bytes.Length, "test#02"); + Assert.AreEqual (1, bytes [0], "test#03"); + Assert.AreEqual (2, bytes [1], "test#04"); mem.Close (); mem = new MemoryStream (); bytes = new byte [] {0, 1, 2, 3, 4, 5}; stream = new BufferedStream (mem); stream.Write (bytes, 0, 2); - AssertEquals ("test#05", 2, stream.Length); + Assert.AreEqual (2, stream.Length, "test#05"); bytes = mem.GetBuffer (); - AssertEquals ("test#06", 256, bytes.Length); + Assert.AreEqual (256, bytes.Length, "test#06"); - AssertEquals ("test#07", 0, bytes [0]); - AssertEquals ("test#08", 1, bytes [1]); + Assert.AreEqual (0, bytes [0], "test#07"); + Assert.AreEqual (1, bytes [1], "test#08"); stream.Write (bytes, 0, 2); bytes = mem.GetBuffer (); - AssertEquals ("test#09", 0, bytes [0]); - AssertEquals ("test#10", 1, bytes [1]); - AssertEquals ("test#11", 0, bytes [2]); - AssertEquals ("test#12", 0, bytes [3]); + Assert.AreEqual (0, bytes [0], "test#09"); + Assert.AreEqual (1, bytes [1], "test#10"); + Assert.AreEqual (0, bytes [2], "test#11"); + Assert.AreEqual (0, bytes [3], "test#12"); stream.Flush (); bytes = mem.GetBuffer (); - AssertEquals ("test#13", 0, bytes [2]); - AssertEquals ("test#14", 1, bytes [3]); + Assert.AreEqual (0, bytes [2], "test#13"); + Assert.AreEqual (1, bytes [3], "test#14"); } [Test] @@ -437,16 +437,16 @@ public class BufferedStreamTest : Assertion { BufferedStream stream = new BufferedStream (mem); stream.Write (new byte [] {0, 1, 2, 3, 4, 5}, 0, 6); - AssertEquals ("test#01", 6, stream.Position); + Assert.AreEqual (6, stream.Position, "test#01"); stream.Seek (-5, SeekOrigin.End); - AssertEquals ("test#02", 1, stream.Position); + Assert.AreEqual (1, stream.Position, "test#02"); stream.Seek (3, SeekOrigin.Current); - AssertEquals ("test#03", 4, stream.Position); + Assert.AreEqual (4, stream.Position, "test#03"); stream.Seek (300, SeekOrigin.Current); - AssertEquals ("test#04", 304, stream.Position); + Assert.AreEqual (304, stream.Position, "test#04"); } [Test] @@ -463,12 +463,12 @@ public class BufferedStreamTest : Assertion { BufferedStream stream = new BufferedStream (mem); stream.Write (new byte [] {0,1,2,3,4,5}, 0, 6); - AssertEquals ("test#01", 6, stream.Length); + Assert.AreEqual (6, stream.Length, "test#01"); stream.SetLength (60); - AssertEquals ("test#02", 60, stream.Length); + Assert.AreEqual (60, stream.Length, "test#02"); stream.SetLength (2); - AssertEquals ("test#03", 2, stream.Length); + Assert.AreEqual (2, stream.Length, "test#03"); } [Test] @@ -505,35 +505,35 @@ public class BufferedStreamTest : Assertion { stream.Write (new byte [] {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, 0, 16); stream.Position = 0; - AssertEquals ("test#01", 0, stream.Position); - AssertEquals ("test#02", 0, stream.ReadByte ()); + Assert.AreEqual (0, stream.Position, "test#01"); + Assert.AreEqual (0, stream.ReadByte (), "test#02"); stream.Position = 5; - AssertEquals ("test#01", 5, stream.Position); - AssertEquals ("test#02", 5, stream.ReadByte ()); + Assert.AreEqual (5, stream.Position, "test#01"); + Assert.AreEqual (5, stream.ReadByte (), "test#02"); // Should not need to read from the underlying stream: stream.Position = 7; - AssertEquals ("test#01", 7, stream.Position); - AssertEquals ("test#02", 7, stream.ReadByte ()); + Assert.AreEqual (7, stream.Position, "test#01"); + Assert.AreEqual (7, stream.ReadByte (), "test#02"); // Should not need to read from the underlying stream: stream.Position = 5; - AssertEquals ("test#01", 5, stream.Position); - AssertEquals ("test#02", 5, stream.ReadByte ()); + Assert.AreEqual (5, stream.Position, "test#01"); + Assert.AreEqual (5, stream.ReadByte (), "test#02"); // Should not need to read from the underlying stream: stream.Position = 9; - AssertEquals ("test#01", 9, stream.Position); - AssertEquals ("test#02", 9, stream.ReadByte ()); + Assert.AreEqual (9, stream.Position, "test#01"); + Assert.AreEqual (9, stream.ReadByte (), "test#02"); stream.Position = 10; - AssertEquals ("test#01", 10, stream.Position); - AssertEquals ("test#02", 10, stream.ReadByte ()); + Assert.AreEqual (10, stream.Position, "test#01"); + Assert.AreEqual (10, stream.ReadByte (), "test#02"); stream.Position = 9; - AssertEquals ("test#01", 9, stream.Position); - AssertEquals ("test#02", 9, stream.ReadByte ()); + Assert.AreEqual (9, stream.Position, "test#01"); + Assert.AreEqual (9, stream.ReadByte (), "test#02"); } [Test] @@ -543,7 +543,7 @@ public class BufferedStreamTest : Assertion { stream.SetLength (32); stream.Position = 32; stream.SetLength (16); - AssertEquals ("Position==16", 16, stream.Position); + Assert.AreEqual (16, stream.Position, "Position==16"); } [Test] diff --git a/mcs/class/corlib/Test/System.IO/ChangeLog b/mcs/class/corlib/Test/System.IO/ChangeLog index 32fdf8397e0..0d96578a24a 100644 --- a/mcs/class/corlib/Test/System.IO/ChangeLog +++ b/mcs/class/corlib/Test/System.IO/ChangeLog @@ -1,3 +1,9 @@ +2009-06-25 Robert Jordan + + * BinaryReaderTest.cs, BinaryWriterTest.cs, BufferedStreamTest.cs, + PathTest.cs, PathTest.cs, StringWriterTest.cs, TextWriterTest.cs: + Upgrade to new NUnit style. + 2009-05-06 Raja R Harinath * FileInfoTest.cs: Wrap Replace() tests in #if NET_2_0. diff --git a/mcs/class/corlib/Test/System.IO/PathTest.cs b/mcs/class/corlib/Test/System.IO/PathTest.cs index 76c20ec48c9..417274cbc35 100644 --- a/mcs/class/corlib/Test/System.IO/PathTest.cs +++ b/mcs/class/corlib/Test/System.IO/PathTest.cs @@ -30,7 +30,7 @@ namespace MonoTests.System.IO } [TestFixture] - public class PathTest : Assertion + public class PathTest { static string path1; static string path2; @@ -90,54 +90,54 @@ namespace MonoTests.System.IO files [(int) OsType.Mac] = "foo:test.doc"; string testPath = Path.ChangeExtension (path1, "doc"); - AssertEquals ("ChangeExtension #01", files [(int) OS], testPath); + Assert.AreEqual (files [(int) OS], testPath, "ChangeExtension #01"); testPath = Path.ChangeExtension (String.Empty, ".extension"); - AssertEquals ("ChangeExtension #02", String.Empty, testPath); + Assert.AreEqual (String.Empty, testPath, "ChangeExtension #02"); testPath = Path.ChangeExtension (null, ".extension"); - AssertEquals ("ChangeExtension #03", null, testPath); + Assert.AreEqual (null, testPath, "ChangeExtension #03"); testPath = Path.ChangeExtension ("path", null); - AssertEquals ("ChangeExtension #04", "path", testPath); + Assert.AreEqual ("path", testPath, "ChangeExtension #04"); testPath = Path.ChangeExtension ("path.ext", "doc"); - AssertEquals ("ChangeExtension #05", "path.doc", testPath); + Assert.AreEqual ("path.doc", testPath, "ChangeExtension #05"); testPath = Path.ChangeExtension ("path.ext1.ext2", "doc"); - AssertEquals ("ChangeExtension #06", "path.ext1.doc", testPath); + Assert.AreEqual ("path.ext1.doc", testPath, "ChangeExtension #06"); testPath = Path.ChangeExtension ("hogehoge.xml", ".xsl"); - AssertEquals ("ChangeExtension #07", "hogehoge.xsl", testPath); + Assert.AreEqual ("hogehoge.xsl", testPath, "ChangeExtension #07"); testPath = Path.ChangeExtension ("hogehoge", ".xsl"); - AssertEquals ("ChangeExtension #08", "hogehoge.xsl", testPath); + Assert.AreEqual ("hogehoge.xsl", testPath, "ChangeExtension #08"); testPath = Path.ChangeExtension ("hogehoge.xml", "xsl"); - AssertEquals ("ChangeExtension #09", "hogehoge.xsl", testPath); + Assert.AreEqual ("hogehoge.xsl", testPath, "ChangeExtension #09"); testPath = Path.ChangeExtension ("hogehoge", "xsl"); - AssertEquals ("ChangeExtension #10", "hogehoge.xsl", testPath); + Assert.AreEqual ("hogehoge.xsl", testPath, "ChangeExtension #10"); testPath = Path.ChangeExtension ("hogehoge.xml", String.Empty); - AssertEquals ("ChangeExtension #11", "hogehoge.", testPath); + Assert.AreEqual ("hogehoge.", testPath, "ChangeExtension #11"); testPath = Path.ChangeExtension ("hogehoge", String.Empty); - AssertEquals ("ChangeExtension #12", "hogehoge.", testPath); + Assert.AreEqual ("hogehoge.", testPath, "ChangeExtension #12"); testPath = Path.ChangeExtension ("hogehoge.", null); - AssertEquals ("ChangeExtension #13", "hogehoge", testPath); + Assert.AreEqual ("hogehoge", testPath, "ChangeExtension #13"); testPath = Path.ChangeExtension ("hogehoge", null); - AssertEquals ("ChangeExtension #14", "hogehoge", testPath); + Assert.AreEqual ("hogehoge", testPath, "ChangeExtension #14"); testPath = Path.ChangeExtension (String.Empty, null); - AssertEquals ("ChangeExtension #15", String.Empty, testPath); + Assert.AreEqual (String.Empty, testPath, "ChangeExtension #15"); testPath = Path.ChangeExtension (String.Empty, "bashrc"); - AssertEquals ("ChangeExtension #16", String.Empty, testPath); + Assert.AreEqual (String.Empty, testPath, "ChangeExtension #16"); testPath = Path.ChangeExtension (String.Empty, ".bashrc"); - AssertEquals ("ChangeExtension #17", String.Empty, testPath); + Assert.AreEqual (String.Empty, testPath, "ChangeExtension #17"); testPath = Path.ChangeExtension (null, null); - AssertNull ("ChangeExtension #18", testPath); + Assert.IsNull (testPath, "ChangeExtension #18"); } [Test] public void ChangeExtension_Extension_InvalidPathChars () { string fn = Path.ChangeExtension ("file.ext", "<"); - AssertEquals ("Invalid filename", "file.<", fn); + Assert.AreEqual ("file.<", fn, "Invalid filename"); } [Test] @@ -145,13 +145,13 @@ namespace MonoTests.System.IO { try { Path.ChangeExtension ("fi\0le.ext", ".extension"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal characters in path - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -164,41 +164,41 @@ namespace MonoTests.System.IO files [(int) OsType.Mac] = "foo:bar"; string testPath = Path.Combine (path2, path3); - AssertEquals ("Combine #01", files [(int) OS], testPath); + Assert.AreEqual (files [(int) OS], testPath, "Combine #01"); testPath = Path.Combine ("one", String.Empty); - AssertEquals ("Combine #02", "one", testPath); + Assert.AreEqual ("one", testPath, "Combine #02"); testPath = Path.Combine (String.Empty, "one"); - AssertEquals ("Combine #03", "one", testPath); + Assert.AreEqual ("one", testPath, "Combine #03"); string current = Directory.GetCurrentDirectory (); testPath = Path.Combine (current, "one"); string expected = current + DSC + "one"; - AssertEquals ("Combine #04", expected, testPath); + Assert.AreEqual (expected, testPath, "Combine #04"); testPath = Path.Combine ("one", current); // LAMESPEC noted in Path.cs - AssertEquals ("Combine #05", current, testPath); + Assert.AreEqual (current, testPath, "Combine #05"); testPath = Path.Combine (current, expected); - AssertEquals ("Combine #06", expected, testPath); + Assert.AreEqual (expected, testPath, "Combine #06"); testPath = DSC + "one"; testPath = Path.Combine (testPath, "two" + DSC); expected = DSC + "one" + DSC + "two" + DSC; - AssertEquals ("Combine #06", expected, testPath); + Assert.AreEqual (expected, testPath, "Combine #06"); testPath = "one" + DSC; testPath = Path.Combine (testPath, DSC + "two"); expected = DSC + "two"; - AssertEquals ("Combine #06", expected, testPath); + Assert.AreEqual (expected, testPath, "Combine #06"); testPath = "one" + DSC; testPath = Path.Combine (testPath, "two" + DSC); expected = "one" + DSC + "two" + DSC; - AssertEquals ("Combine #07", expected, testPath); + Assert.AreEqual (expected, testPath, "Combine #07"); } [Test] @@ -206,13 +206,13 @@ namespace MonoTests.System.IO { try { Path.Combine ("a\0", "one"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal characters in path - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -221,12 +221,12 @@ namespace MonoTests.System.IO { try { Path.Combine (null, "one"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "path1", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("path1", ex.ParamName, "#5"); } } @@ -235,13 +235,13 @@ namespace MonoTests.System.IO { try { Path.Combine ("one", "a\0"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal characters in path - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -250,12 +250,12 @@ namespace MonoTests.System.IO { try { Path.Combine ("one", null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "path2", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("path2", ex.ParamName, "#5"); } } @@ -268,38 +268,38 @@ namespace MonoTests.System.IO files [(int) OsType.Mac] = "foo"; string testDirName = Path.GetDirectoryName (path1); - AssertEquals ("#A1", files [(int) OS], testDirName); + Assert.AreEqual (files [(int) OS], testDirName, "#A1"); testDirName = Path.GetDirectoryName (files [(int) OS] + DSC); - AssertEquals ("#A2", files [(int) OS], testDirName); + Assert.AreEqual (files [(int) OS], testDirName, "#A2"); if (Windows) { - AssertEquals ("#B1", "C:\\foo", Path.GetDirectoryName ("C:\\foo\\foo.txt")); - AssertEquals ("#B2", null, Path.GetDirectoryName ("C:")); - AssertEquals ("#B3", null, Path.GetDirectoryName (@"C:\")); - AssertEquals ("#B4", @"C:\", Path.GetDirectoryName (@"C:\dir")); - AssertEquals ("#B5", @"C:\dir", Path.GetDirectoryName (@"C:\dir\")); - AssertEquals ("#B6", @"C:\dir", Path.GetDirectoryName (@"C:\dir\dir")); - AssertEquals ("#B7", @"C:\dir\dir", Path.GetDirectoryName (@"C:\dir\dir\")); - - AssertEquals ("#C1", "\\foo\\bar", Path.GetDirectoryName ("/foo//bar/dingus")); - AssertEquals ("#C2", "foo\\bar", Path.GetDirectoryName ("foo/bar/")); - AssertEquals ("#C3", "foo\\bar", Path.GetDirectoryName ("foo/bar\\xxx")); - AssertEquals ("#C4", "\\\\host\\dir\\dir2", Path.GetDirectoryName ("\\\\host\\dir\\\\dir2\\path")); + Assert.AreEqual ("C:\\foo", Path.GetDirectoryName ("C:\\foo\\foo.txt"), "#B1"); + Assert.AreEqual (null, Path.GetDirectoryName ("C:"), "#B2"); + Assert.AreEqual (null, Path.GetDirectoryName (@"C:\"), "#B3"); + Assert.AreEqual (@"C:\", Path.GetDirectoryName (@"C:\dir"), "#B4"); + Assert.AreEqual (@"C:\dir", Path.GetDirectoryName (@"C:\dir\"), "#B5"); + Assert.AreEqual (@"C:\dir", Path.GetDirectoryName (@"C:\dir\dir"), "#B6"); + Assert.AreEqual (@"C:\dir\dir", Path.GetDirectoryName (@"C:\dir\dir\"), "#B7"); + + Assert.AreEqual ("\\foo\\bar", Path.GetDirectoryName ("/foo//bar/dingus"), "#C1"); + Assert.AreEqual ("foo\\bar", Path.GetDirectoryName ("foo/bar/"), "#C2"); + Assert.AreEqual ("foo\\bar", Path.GetDirectoryName ("foo/bar\\xxx"), "#C3"); + Assert.AreEqual ("\\\\host\\dir\\dir2", Path.GetDirectoryName ("\\\\host\\dir\\\\dir2\\path"), "#C4"); // UNC tests - AssertEquals ("#D1", null, Path.GetDirectoryName (@"\\")); - AssertEquals ("#D2", null, Path.GetDirectoryName (@"\\server")); - AssertEquals ("#D3", null, Path.GetDirectoryName (@"\\server\share")); - AssertEquals ("#D4", @"\\server\share", Path.GetDirectoryName (@"\\server\share\")); - AssertEquals ("#D5", @"\\server\share", Path.GetDirectoryName (@"\\server\share\dir")); - AssertEquals ("#D6", @"\\server\share\dir", Path.GetDirectoryName (@"\\server\share\dir\subdir")); + Assert.AreEqual (null, Path.GetDirectoryName (@"\\"), "#D1"); + Assert.AreEqual (null, Path.GetDirectoryName (@"\\server"), "#D2"); + Assert.AreEqual (null, Path.GetDirectoryName (@"\\server\share"), "#D3"); + Assert.AreEqual (@"\\server\share", Path.GetDirectoryName (@"\\server\share\"), "#D4"); + Assert.AreEqual (@"\\server\share", Path.GetDirectoryName (@"\\server\share\dir"), "#D5"); + Assert.AreEqual (@"\\server\share\dir", Path.GetDirectoryName (@"\\server\share\dir\subdir"), "#D6"); } else { - AssertEquals ("#B1", "/etc", Path.GetDirectoryName ("/etc/hostname")); - AssertEquals ("#B2", "/foo/bar", Path.GetDirectoryName ("/foo//bar/dingus")); - AssertEquals ("#B3", "foo/bar", Path.GetDirectoryName ("foo/bar/")); - AssertEquals ("#B4", "/", Path.GetDirectoryName ("/tmp")); - AssertNull ("#B5", Path.GetDirectoryName ("/")); - AssertEquals ("#B6", "a", Path.GetDirectoryName ("a//b")); + Assert.AreEqual ("/etc", Path.GetDirectoryName ("/etc/hostname"), "#B1"); + Assert.AreEqual ("/foo/bar", Path.GetDirectoryName ("/foo//bar/dingus"), "#B2"); + Assert.AreEqual ("foo/bar", Path.GetDirectoryName ("foo/bar/"), "#B3"); + Assert.AreEqual ("/", Path.GetDirectoryName ("/tmp"), "#B4"); + Assert.IsNull (Path.GetDirectoryName ("/"), "#B5"); + Assert.AreEqual ("a", Path.GetDirectoryName ("a//b"), "#B6"); } } @@ -308,13 +308,13 @@ namespace MonoTests.System.IO { try { Path.GetDirectoryName (String.Empty); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // The path is not of a legal form - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -323,20 +323,20 @@ namespace MonoTests.System.IO { try { Path.GetDirectoryName ("hi\0world"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal characters in path - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } [Test] public void GetDirectoryName_Path_Null () { - AssertNull (Path.GetDirectoryName (null)); + Assert.IsNull (Path.GetDirectoryName (null)); } [Test] @@ -344,13 +344,13 @@ namespace MonoTests.System.IO { try { Path.GetDirectoryName (" "); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // The path is not of a legal form - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -359,46 +359,46 @@ namespace MonoTests.System.IO { string testExtn = Path.GetExtension (path1); - AssertEquals ("GetExtension #01", ".txt", testExtn); + Assert.AreEqual (".txt", testExtn, "GetExtension #01"); testExtn = Path.GetExtension (path2); - AssertEquals ("GetExtension #02", String.Empty, testExtn); + Assert.AreEqual (String.Empty, testExtn, "GetExtension #02"); testExtn = Path.GetExtension (String.Empty); - AssertEquals ("GetExtension #03", String.Empty, testExtn); + Assert.AreEqual (String.Empty, testExtn, "GetExtension #03"); testExtn = Path.GetExtension (null); - AssertEquals ("GetExtension #04", null, testExtn); + Assert.AreEqual (null, testExtn, "GetExtension #04"); testExtn = Path.GetExtension (" "); - AssertEquals ("GetExtension #05", String.Empty, testExtn); + Assert.AreEqual (String.Empty, testExtn, "GetExtension #05"); testExtn = Path.GetExtension (path1 + ".doc"); - AssertEquals ("GetExtension #06", ".doc", testExtn); + Assert.AreEqual (".doc", testExtn, "GetExtension #06"); testExtn = Path.GetExtension (path1 + ".doc" + DSC + "a.txt"); - AssertEquals ("GetExtension #07", ".txt", testExtn); + Assert.AreEqual (".txt", testExtn, "GetExtension #07"); testExtn = Path.GetExtension ("."); - AssertEquals ("GetExtension #08", String.Empty, testExtn); + Assert.AreEqual (String.Empty, testExtn, "GetExtension #08"); testExtn = Path.GetExtension ("end."); - AssertEquals ("GetExtension #09", String.Empty, testExtn); + Assert.AreEqual (String.Empty, testExtn, "GetExtension #09"); testExtn = Path.GetExtension (".start"); - AssertEquals ("GetExtension #10", ".start", testExtn); + Assert.AreEqual (".start", testExtn, "GetExtension #10"); testExtn = Path.GetExtension (".a"); - AssertEquals ("GetExtension #11", ".a", testExtn); + Assert.AreEqual (".a", testExtn, "GetExtension #11"); testExtn = Path.GetExtension ("a."); - AssertEquals ("GetExtension #12", String.Empty, testExtn); + Assert.AreEqual (String.Empty, testExtn, "GetExtension #12"); testExtn = Path.GetExtension ("a"); - AssertEquals ("GetExtension #13", String.Empty, testExtn); + Assert.AreEqual (String.Empty, testExtn, "GetExtension #13"); testExtn = Path.GetExtension ("makefile"); - AssertEquals ("GetExtension #14", String.Empty, testExtn); + Assert.AreEqual (String.Empty, testExtn, "GetExtension #14"); } [Test] @@ -406,13 +406,13 @@ namespace MonoTests.System.IO { try { Path.GetExtension ("hi\0world.txt"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal characters in path. - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -421,13 +421,13 @@ namespace MonoTests.System.IO { string testFileName = Path.GetFileName (path1); - AssertEquals ("#1", "test.txt", testFileName); + Assert.AreEqual ("test.txt", testFileName, "#1"); testFileName = Path.GetFileName (null); - AssertEquals ("#2", null, testFileName); + Assert.AreEqual (null, testFileName, "#2"); testFileName = Path.GetFileName (String.Empty); - AssertEquals ("#3", String.Empty, testFileName); + Assert.AreEqual (String.Empty, testFileName, "#3"); testFileName = Path.GetFileName (" "); - AssertEquals ("#4", " ", testFileName); + Assert.AreEqual (" ", testFileName, "#4"); } [Test] @@ -435,13 +435,13 @@ namespace MonoTests.System.IO { try { Path.GetFileName ("hi\0world"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal characters in path - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -450,13 +450,13 @@ namespace MonoTests.System.IO { string testFileName = Path.GetFileNameWithoutExtension (path1); - AssertEquals ("GetFileNameWithoutExtension #01", "test", testFileName); + Assert.AreEqual ("test", testFileName, "GetFileNameWithoutExtension #01"); testFileName = Path.GetFileNameWithoutExtension (null); - AssertEquals ("GetFileNameWithoutExtension #02", null, testFileName); + Assert.AreEqual (null, testFileName, "GetFileNameWithoutExtension #02"); testFileName = Path.GetFileNameWithoutExtension (String.Empty); - AssertEquals ("GetFileNameWithoutExtension #03", String.Empty, testFileName); + Assert.AreEqual (String.Empty, testFileName, "GetFileNameWithoutExtension #03"); } [Test] @@ -464,13 +464,13 @@ namespace MonoTests.System.IO { try { Path.GetFileNameWithoutExtension ("hi\0world"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal characters in path - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -481,10 +481,10 @@ namespace MonoTests.System.IO string testFullPath = Path.GetFullPath ("foo.txt"); string expected = current + DSC + "foo.txt"; - AssertEquals ("GetFullPath #01", expected, testFullPath); + Assert.AreEqual (expected, testFullPath, "GetFullPath #01"); testFullPath = Path.GetFullPath ("a//./.././foo.txt"); - AssertEquals ("GetFullPath #02", expected, testFullPath); + Assert.AreEqual (expected, testFullPath, "GetFullPath #02"); } [Test] @@ -525,15 +525,15 @@ namespace MonoTests.System.IO }; for (int i = 0; i < test.GetUpperBound (0); i++) { - AssertEquals (String.Format ("GetFullPathUnix #{0}", i), - root + test [i, 1], Path.GetFullPath (root + test [i, 0])); + Assert.AreEqual (root + test [i, 1], Path.GetFullPath (root + test [i, 0]), + String.Format ("GetFullPathUnix #{0}", i)); } - AssertEquals ("#01", "/", Path.GetFullPath ("/")); - AssertEquals ("#02", "/hey", Path.GetFullPath ("/hey")); - AssertEquals ("#03", Environment.CurrentDirectory, Path.GetFullPath (".")); - AssertEquals ("#04", Path.Combine (Environment.CurrentDirectory, "hey"), - Path.GetFullPath ("hey")); + Assert.AreEqual ("/", Path.GetFullPath ("/"), "#01"); + Assert.AreEqual ("/hey", Path.GetFullPath ("/hey"), "#02"); + Assert.AreEqual (Environment.CurrentDirectory, Path.GetFullPath ("."), "#03"); + Assert.AreEqual (Path.Combine (Environment.CurrentDirectory, "hey"), + Path.GetFullPath ("hey"), "#04"); } [Test] @@ -571,8 +571,8 @@ namespace MonoTests.System.IO }; for (int i = 0; i < test.GetUpperBound (0); i++) { - AssertEquals (String.Format ("GetFullPathWindows #{0}", i), - root + test [i, 1], Path.GetFullPath (root + test [i, 0])); + Assert.AreEqual (root + test [i, 1], Path.GetFullPath (root + test [i, 0]), + String.Format ("GetFullPathWindows #{0}", i)); } // UNC tests @@ -610,8 +610,8 @@ namespace MonoTests.System.IO string res = test [i, 1] != null ? root + test [i, 1] : root2; - AssertEquals (String.Format ("GetFullPathWindows UNC #{0}", i), - res, Path.GetFullPath (root + test [i, 0])); + Assert.AreEqual (res, Path.GetFullPath (root + test [i, 0]), + String.Format ("GetFullPathWindows UNC #{0}", i)); } } @@ -620,13 +620,13 @@ namespace MonoTests.System.IO { try { Path.GetFullPath (String.Empty); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // The path is not of a legal form - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -635,7 +635,7 @@ namespace MonoTests.System.IO { string fp = Path.GetFullPath ("something/"); char end = fp [fp.Length - 1]; - Assert (end == Path.DirectorySeparatorChar); + Assert.IsTrue (end == Path.DirectorySeparatorChar); } [Test] @@ -643,13 +643,13 @@ namespace MonoTests.System.IO { try { Path.GetFullPath ("hi\0world"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal characters in path - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -658,12 +658,12 @@ namespace MonoTests.System.IO { try { Path.GetFullPath (null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "path", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("path", ex.ParamName, "#5"); } } @@ -672,13 +672,13 @@ namespace MonoTests.System.IO { try { Path.GetFullPath (" "); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // The path is not of a legal form - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -686,28 +686,28 @@ namespace MonoTests.System.IO public void GetFullPath2 () { if (Windows) { - AssertEquals ("GetFullPath w#01", @"Z:\", Path.GetFullPath ("Z:")); + Assert.AreEqual (@"Z:\", Path.GetFullPath ("Z:"), "GetFullPath w#01"); #if !TARGET_JVM // Java full (canonical) path always starts with caps drive letter - AssertEquals ("GetFullPath w#02", @"c:\abc\def", Path.GetFullPath (@"c:\abc\def")); + Assert.AreEqual (@"c:\abc\def", Path.GetFullPath (@"c:\abc\def"), "GetFullPath w#02"); #endif - Assert ("GetFullPath w#03", Path.GetFullPath (@"\").EndsWith (@"\")); + Assert.IsTrue (Path.GetFullPath (@"\").EndsWith (@"\"), "GetFullPath w#03"); // "\\\\" is not allowed - Assert ("GetFullPath w#05", Path.GetFullPath ("/").EndsWith (@"\")); + Assert.IsTrue (Path.GetFullPath ("/").EndsWith (@"\"), "GetFullPath w#05"); // "//" is not allowed - Assert ("GetFullPath w#07", Path.GetFullPath ("readme.txt").EndsWith (@"\readme.txt")); - Assert ("GetFullPath w#08", Path.GetFullPath ("c").EndsWith (@"\c")); - Assert ("GetFullPath w#09", Path.GetFullPath (@"abc\def").EndsWith (@"abc\def")); - Assert ("GetFullPath w#10", Path.GetFullPath (@"\abc\def").EndsWith (@"\abc\def")); - AssertEquals ("GetFullPath w#11", @"\\abc\def", Path.GetFullPath (@"\\abc\def")); - AssertEquals ("GetFullPath w#12", Directory.GetCurrentDirectory () + @"\abc\def", Path.GetFullPath (@"abc//def")); - AssertEquals ("GetFullPath w#13", Directory.GetCurrentDirectory ().Substring (0, 2) + @"\abc\def", Path.GetFullPath ("/abc/def")); - AssertEquals ("GetFullPath w#14", @"\\abc\def", Path.GetFullPath ("//abc/def")); + Assert.IsTrue (Path.GetFullPath ("readme.txt").EndsWith (@"\readme.txt"), "GetFullPath w#07"); + Assert.IsTrue (Path.GetFullPath ("c").EndsWith (@"\c"), "GetFullPath w#08"); + Assert.IsTrue (Path.GetFullPath (@"abc\def").EndsWith (@"abc\def"), "GetFullPath w#09"); + Assert.IsTrue (Path.GetFullPath (@"\abc\def").EndsWith (@"\abc\def"), "GetFullPath w#10"); + Assert.AreEqual (@"\\abc\def", Path.GetFullPath (@"\\abc\def"), "GetFullPath w#11"); + Assert.AreEqual (Directory.GetCurrentDirectory () + @"\abc\def", Path.GetFullPath (@"abc//def"), "GetFullPath w#12"); + Assert.AreEqual (Directory.GetCurrentDirectory ().Substring (0, 2) + @"\abc\def", Path.GetFullPath ("/abc/def"), "GetFullPath w#13"); + Assert.AreEqual (@"\\abc\def", Path.GetFullPath ("//abc/def"), "GetFullPath w#14"); } else { - AssertEquals ("#01", "/", Path.GetFullPath ("/")); - AssertEquals ("#02", "/hey", Path.GetFullPath ("/hey")); - AssertEquals ("#03", Environment.CurrentDirectory, Path.GetFullPath (".")); - AssertEquals ("#04", Path.Combine (Environment.CurrentDirectory, "hey"), - Path.GetFullPath ("hey")); + Assert.AreEqual ("/", Path.GetFullPath ("/"), "#01"); + Assert.AreEqual ("/hey", Path.GetFullPath ("/hey"), "#02"); + Assert.AreEqual (Environment.CurrentDirectory, Path.GetFullPath ("."), "#03"); + Assert.AreEqual (Path.Combine (Environment.CurrentDirectory, "hey"), + Path.GetFullPath ("hey"), "#04"); } } @@ -725,7 +725,7 @@ namespace MonoTests.System.IO } string pathRoot = Path.GetPathRoot (current); - AssertEquals ("GetPathRoot #01", expected, pathRoot); + Assert.AreEqual (expected, pathRoot, "GetPathRoot #01"); } [Test] @@ -737,28 +737,28 @@ namespace MonoTests.System.IO string pathRoot; pathRoot = Path.GetPathRoot ("hola"); - AssertEquals ("#A1", String.Empty, pathRoot); + Assert.AreEqual (String.Empty, pathRoot, "#A1"); pathRoot = Path.GetPathRoot (null); - AssertEquals ("#A2", null, pathRoot); + Assert.AreEqual (null, pathRoot, "#A2"); if (Windows) { - AssertEquals ("GetPathRoot w#01", "z:", Path.GetPathRoot ("z:")); - AssertEquals ("GetPathRoot w#02", "c:\\", Path.GetPathRoot ("c:\\abc\\def")); - AssertEquals ("GetPathRoot w#03", "\\", Path.GetPathRoot ("\\")); - AssertEquals ("GetPathRoot w#04", "\\\\", Path.GetPathRoot ("\\\\")); - AssertEquals ("GetPathRoot w#05", "\\", Path.GetPathRoot ("/")); - AssertEquals ("GetPathRoot w#06", "\\\\", Path.GetPathRoot ("//")); - AssertEquals ("GetPathRoot w#07", String.Empty, Path.GetPathRoot ("readme.txt")); - AssertEquals ("GetPathRoot w#08", String.Empty, Path.GetPathRoot ("c")); - AssertEquals ("GetPathRoot w#09", String.Empty, Path.GetPathRoot ("abc\\def")); - AssertEquals ("GetPathRoot w#10", "\\", Path.GetPathRoot ("\\abc\\def")); - AssertEquals ("GetPathRoot w#11", "\\\\abc\\def", Path.GetPathRoot ("\\\\abc\\def")); - AssertEquals ("GetPathRoot w#12", String.Empty, Path.GetPathRoot ("abc//def")); - AssertEquals ("GetPathRoot w#13", "\\", Path.GetPathRoot ("/abc/def")); - AssertEquals ("GetPathRoot w#14", "\\\\abc\\def", Path.GetPathRoot ("//abc/def")); - AssertEquals ("GetPathRoot w#15", @"C:\", Path.GetPathRoot (@"C:\")); - AssertEquals ("GetPathRoot w#16", @"C:\", Path.GetPathRoot (@"C:\\")); - AssertEquals ("GetPathRoot w#17", "\\\\abc\\def", Path.GetPathRoot ("\\\\abc\\def\\ghi")); + Assert.AreEqual ("z:", Path.GetPathRoot ("z:"), "GetPathRoot w#01"); + Assert.AreEqual ("c:\\", Path.GetPathRoot ("c:\\abc\\def"), "GetPathRoot w#02"); + Assert.AreEqual ("\\", Path.GetPathRoot ("\\"), "GetPathRoot w#03"); + Assert.AreEqual ("\\\\", Path.GetPathRoot ("\\\\"), "GetPathRoot w#04"); + Assert.AreEqual ("\\", Path.GetPathRoot ("/"), "GetPathRoot w#05"); + Assert.AreEqual ("\\\\", Path.GetPathRoot ("//"), "GetPathRoot w#06"); + Assert.AreEqual (String.Empty, Path.GetPathRoot ("readme.txt"), "GetPathRoot w#07"); + Assert.AreEqual (String.Empty, Path.GetPathRoot ("c"), "GetPathRoot w#08"); + Assert.AreEqual (String.Empty, Path.GetPathRoot ("abc\\def"), "GetPathRoot w#09"); + Assert.AreEqual ("\\", Path.GetPathRoot ("\\abc\\def"), "GetPathRoot w#10"); + Assert.AreEqual ("\\\\abc\\def", Path.GetPathRoot ("\\\\abc\\def"), "GetPathRoot w#11"); + Assert.AreEqual (String.Empty, Path.GetPathRoot ("abc//def"), "GetPathRoot w#12"); + Assert.AreEqual ("\\", Path.GetPathRoot ("/abc/def"), "GetPathRoot w#13"); + Assert.AreEqual ("\\\\abc\\def", Path.GetPathRoot ("//abc/def"), "GetPathRoot w#14"); + Assert.AreEqual (@"C:\", Path.GetPathRoot (@"C:\"), "GetPathRoot w#15"); + Assert.AreEqual (@"C:\", Path.GetPathRoot (@"C:\\"), "GetPathRoot w#16"); + Assert.AreEqual ("\\\\abc\\def", Path.GetPathRoot ("\\\\abc\\def\\ghi"), "GetPathRoot w#17"); } else { // TODO: Same tests for Unix. } @@ -769,13 +769,13 @@ namespace MonoTests.System.IO { try { Path.GetPathRoot (String.Empty); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // The path is not of a legal form - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -788,16 +788,16 @@ namespace MonoTests.System.IO #if NET_2_0 try { Path.GetPathRoot ("hi\0world"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal characters in path - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } #else - AssertEquals (String.Empty, Path.GetPathRoot ("hi\0world")); + Assert.AreEqual (String.Empty, Path.GetPathRoot ("hi\0world")); #endif } @@ -806,13 +806,13 @@ namespace MonoTests.System.IO { try { Path.GetPathRoot (" "); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // The path is not of a legal form - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -820,9 +820,9 @@ namespace MonoTests.System.IO public void GetTempPath () { string getTempPath = Path.GetTempPath (); - Assert ("GetTempPath #01", getTempPath != String.Empty); - Assert ("GetTempPath #02", Path.IsPathRooted (getTempPath)); - AssertEquals ("GetTempPath #03", Path.DirectorySeparatorChar, getTempPath [getTempPath.Length - 1]); + Assert.IsTrue (getTempPath != String.Empty, "GetTempPath #01"); + Assert.IsTrue (Path.IsPathRooted (getTempPath), "GetTempPath #02"); + Assert.AreEqual (Path.DirectorySeparatorChar, getTempPath [getTempPath.Length - 1], "GetTempPath #03"); } [Test] @@ -831,8 +831,8 @@ namespace MonoTests.System.IO string getTempFileName = null; try { getTempFileName = Path.GetTempFileName (); - Assert ("GetTempFileName #01", getTempFileName != String.Empty); - Assert ("GetTempFileName #02", File.Exists (getTempFileName)); + Assert.IsTrue (getTempFileName != String.Empty, "GetTempFileName #01"); + Assert.IsTrue (File.Exists (getTempFileName), "GetTempFileName #02"); } finally { if (getTempFileName != null && getTempFileName != String.Empty){ File.Delete (getTempFileName); @@ -843,19 +843,19 @@ namespace MonoTests.System.IO [Test] public void HasExtension () { - AssertEquals ("HasExtension #01", true, Path.HasExtension ("foo.txt")); - AssertEquals ("HasExtension #02", false, Path.HasExtension ("foo")); - AssertEquals ("HasExtension #03", true, Path.HasExtension (path1)); - AssertEquals ("HasExtension #04", false, Path.HasExtension (path2)); - AssertEquals ("HasExtension #05", false, Path.HasExtension (null)); - AssertEquals ("HasExtension #06", false, Path.HasExtension (String.Empty)); - AssertEquals ("HasExtension #07", false, Path.HasExtension (" ")); - AssertEquals ("HasExtension #08", false, Path.HasExtension (".")); - AssertEquals ("HasExtension #09", false, Path.HasExtension ("end.")); - AssertEquals ("HasExtension #10", true, Path.HasExtension (".start")); - AssertEquals ("HasExtension #11", true, Path.HasExtension (".a")); - AssertEquals ("HasExtension #12", false, Path.HasExtension ("a.")); - AssertEquals ("HasExtension #13", false, Path.HasExtension ("Makefile")); + Assert.AreEqual (true, Path.HasExtension ("foo.txt"), "HasExtension #01"); + Assert.AreEqual (false, Path.HasExtension ("foo"), "HasExtension #02"); + Assert.AreEqual (true, Path.HasExtension (path1), "HasExtension #03"); + Assert.AreEqual (false, Path.HasExtension (path2), "HasExtension #04"); + Assert.AreEqual (false, Path.HasExtension (null), "HasExtension #05"); + Assert.AreEqual (false, Path.HasExtension (String.Empty), "HasExtension #06"); + Assert.AreEqual (false, Path.HasExtension (" "), "HasExtension #07"); + Assert.AreEqual (false, Path.HasExtension ("."), "HasExtension #08"); + Assert.AreEqual (false, Path.HasExtension ("end."), "HasExtension #09"); + Assert.AreEqual (true, Path.HasExtension (".start"), "HasExtension #10"); + Assert.AreEqual (true, Path.HasExtension (".a"), "HasExtension #11"); + Assert.AreEqual (false, Path.HasExtension ("a."), "HasExtension #12"); + Assert.AreEqual (false, Path.HasExtension ("Makefile"), "HasExtension #13"); } [Test] @@ -863,48 +863,48 @@ namespace MonoTests.System.IO { try { Path.HasExtension ("hi\0world.txt"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal characters in path - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } [Test] public void IsPathRooted () { - Assert ("IsPathRooted #01", Path.IsPathRooted (path2)); - Assert ("IsPathRooted #02", !Path.IsPathRooted (path3)); - Assert ("IsPathRooted #03", !Path.IsPathRooted (null)); - Assert ("IsPathRooted #04", !Path.IsPathRooted (String.Empty)); - Assert ("IsPathRooted #05", !Path.IsPathRooted (" ")); - Assert ("IsPathRooted #06", Path.IsPathRooted ("/")); - Assert ("IsPathRooted #07", Path.IsPathRooted ("//")); - Assert ("IsPathRooted #08", !Path.IsPathRooted (":")); + Assert.IsTrue (Path.IsPathRooted (path2), "IsPathRooted #01"); + Assert.IsTrue (!Path.IsPathRooted (path3), "IsPathRooted #02"); + Assert.IsTrue (!Path.IsPathRooted (null), "IsPathRooted #03"); + Assert.IsTrue (!Path.IsPathRooted (String.Empty), "IsPathRooted #04"); + Assert.IsTrue (!Path.IsPathRooted (" "), "IsPathRooted #05"); + Assert.IsTrue (Path.IsPathRooted ("/"), "IsPathRooted #06"); + Assert.IsTrue (Path.IsPathRooted ("//"), "IsPathRooted #07"); + Assert.IsTrue (!Path.IsPathRooted (":"), "IsPathRooted #08"); if (Windows) { - Assert ("IsPathRooted #09", Path.IsPathRooted ("\\")); - Assert ("IsPathRooted #10", Path.IsPathRooted ("\\\\")); - Assert ("IsPathRooted #11", Path.IsPathRooted ("z:")); - Assert ("IsPathRooted #12", Path.IsPathRooted ("z:\\")); - Assert ("IsPathRooted #13", Path.IsPathRooted ("z:\\topdir")); + Assert.IsTrue (Path.IsPathRooted ("\\"), "IsPathRooted #09"); + Assert.IsTrue (Path.IsPathRooted ("\\\\"), "IsPathRooted #10"); + Assert.IsTrue (Path.IsPathRooted ("z:"), "IsPathRooted #11"); + Assert.IsTrue (Path.IsPathRooted ("z:\\"), "IsPathRooted #12"); + Assert.IsTrue (Path.IsPathRooted ("z:\\topdir"), "IsPathRooted #13"); // This looks MS BUG. It is treated as absolute path - Assert ("IsPathRooted #14", Path.IsPathRooted ("z:curdir")); - Assert ("IsPathRooted #15", Path.IsPathRooted ("\\abc\\def")); + Assert.IsTrue (Path.IsPathRooted ("z:curdir"), "IsPathRooted #14"); + Assert.IsTrue (Path.IsPathRooted ("\\abc\\def"), "IsPathRooted #15"); } else { - Assert ("IsPathRooted #09", !Path.IsPathRooted ("\\")); - Assert ("IsPathRooted #10", !Path.IsPathRooted ("\\\\")); - Assert ("IsPathRooted #11", !Path.IsPathRooted ("z:")); + Assert.IsTrue (!Path.IsPathRooted ("\\"), "IsPathRooted #09"); + Assert.IsTrue (!Path.IsPathRooted ("\\\\"), "IsPathRooted #10"); + Assert.IsTrue (!Path.IsPathRooted ("z:"), "IsPathRooted #11"); } } [Test] public void IsPathRooted_Path_Empty () { - Assert (!Path.IsPathRooted (String.Empty)); + Assert.IsTrue (!Path.IsPathRooted (String.Empty)); } [Test] @@ -912,35 +912,35 @@ namespace MonoTests.System.IO { try { Path.IsPathRooted ("hi\0world"); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal characters in path. - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } [Test] public void IsPathRooted_Path_Null () { - Assert (!Path.IsPathRooted (null)); + Assert.IsTrue (!Path.IsPathRooted (null)); } [Test] public void IsPathRooted_Path_Whitespace () { - Assert (!Path.IsPathRooted (" ")); + Assert.IsTrue (!Path.IsPathRooted (" ")); } [Test] public void CanonicalizeDots () { string current = Path.GetFullPath ("."); - Assert ("TestCanonicalizeDotst #01", !current.EndsWith (".")); + Assert.IsTrue (!current.EndsWith ("."), "TestCanonicalizeDotst #01"); string parent = Path.GetFullPath (".."); - Assert ("TestCanonicalizeDotst #02", !current.EndsWith ("..")); + Assert.IsTrue (!current.EndsWith (".."), "TestCanonicalizeDotst #02"); } [Test] @@ -961,7 +961,7 @@ namespace MonoTests.System.IO #endif Directory.SetCurrentDirectory (system); string drive = system.Substring (0, 2); - AssertEquals ("current dir", system, Path.GetFullPath (drive)); + Assert.AreEqual (system, Path.GetFullPath (drive), "current dir"); } finally { Directory.SetCurrentDirectory (curdir); @@ -987,7 +987,7 @@ namespace MonoTests.System.IO Directory.SetCurrentDirectory (system); // e.g. C:dir (no backslash) will return CurrentDirectory + dir string dir = system.Substring (0, 2) + "dir"; - AssertEquals ("current dir", Path.Combine (system, "dir"), Path.GetFullPath (dir)); + Assert.AreEqual (Path.Combine (system, "dir"), Path.GetFullPath (dir), "current dir"); } finally { Directory.SetCurrentDirectory (curdir); @@ -1006,11 +1006,11 @@ namespace MonoTests.System.IO if ((platform == 4) || (platform == 128) || (platform == 6)) return; - AssertEquals ("1", @"C:\Windows\dir", Path.GetFullPath (@"C:\Windows\System32\..\dir")); - AssertEquals ("2", @"C:\dir", Path.GetFullPath (@"C:\Windows\System32\..\..\dir")); - AssertEquals ("3", @"C:\dir", Path.GetFullPath (@"C:\Windows\System32\..\..\..\dir")); - AssertEquals ("4", @"C:\dir", Path.GetFullPath (@"C:\Windows\System32\..\..\..\..\dir")); - AssertEquals ("5", @"C:\dir\", Path.GetFullPath (@"C:\Windows\System32\..\.\..\.\..\dir\")); + Assert.AreEqual (@"C:\Windows\dir", Path.GetFullPath (@"C:\Windows\System32\..\dir"), "1"); + Assert.AreEqual (@"C:\dir", Path.GetFullPath (@"C:\Windows\System32\..\..\dir"), "2"); + Assert.AreEqual (@"C:\dir", Path.GetFullPath (@"C:\Windows\System32\..\..\..\dir"), "3"); + Assert.AreEqual (@"C:\dir", Path.GetFullPath (@"C:\Windows\System32\..\..\..\..\dir"), "4"); + Assert.AreEqual (@"C:\dir\", Path.GetFullPath (@"C:\Windows\System32\..\.\..\.\..\dir\"), "5"); } [Test] @@ -1019,9 +1019,9 @@ namespace MonoTests.System.IO char[] invalid = Path.InvalidPathChars; if (Windows) { #if NET_2_0 - AssertEquals ("Length", 36, invalid.Length); + Assert.AreEqual (36, invalid.Length, "Length"); #else - AssertEquals ("Length", 15, invalid.Length); + Assert.AreEqual (15, invalid.Length, "Length"); #endif foreach (char c in invalid) { int i = (int) c; @@ -1035,14 +1035,14 @@ namespace MonoTests.System.IO // in both 1.1 SP1 and 2.0 if ((i == 34) || (i == 60) || (i == 62) || (i == 124)) continue; - Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); + Assert.Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); } } else { foreach (char c in invalid) { int i = (int) c; if (i == 0) continue; - Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); + Assert.Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); } } } @@ -1056,8 +1056,8 @@ namespace MonoTests.System.IO try { invalid[0] = 'a'; // kind of scary - Assert ("expected", expected[0] == 'a'); - AssertEquals ("readonly", expected[0], Path.InvalidPathChars[0]); + Assert.IsTrue (expected[0] == 'a', "expected"); + Assert.AreEqual (expected[0], Path.InvalidPathChars[0], "readonly"); } finally { invalid[0] = original; } @@ -1069,7 +1069,7 @@ namespace MonoTests.System.IO { char[] invalid = Path.GetInvalidFileNameChars (); if (Windows) { - AssertEquals (41, invalid.Length); + Assert.AreEqual (41, invalid.Length); foreach (char c in invalid) { int i = (int) c; if (i < 32) @@ -1079,7 +1079,7 @@ namespace MonoTests.System.IO // ':', '*', '?', '\', '/' if ((i == 58) || (i == 42) || (i == 63) || (i == 92) || (i == 47)) continue; - Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); + Assert.Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); } } else { foreach (char c in invalid) { @@ -1087,7 +1087,7 @@ namespace MonoTests.System.IO // null or '/' if ((i == 0) || (i == 47)) continue; - Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); + Assert.Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); } } } @@ -1098,8 +1098,8 @@ namespace MonoTests.System.IO char[] expected = Path.GetInvalidFileNameChars (); char[] invalid = Path.GetInvalidFileNameChars (); invalid[0] = 'a'; - Assert ("expected", expected[0] != 'a'); - AssertEquals ("readonly", expected[0], Path.GetInvalidFileNameChars ()[0]); + Assert.IsTrue (expected[0] != 'a', "expected"); + Assert.AreEqual (expected[0], Path.GetInvalidFileNameChars ()[0], "readonly"); } [Test] @@ -1107,21 +1107,21 @@ namespace MonoTests.System.IO { char[] invalid = Path.GetInvalidPathChars (); if (Windows) { - AssertEquals (36, invalid.Length); + Assert.AreEqual (36, invalid.Length); foreach (char c in invalid) { int i = (int) c; if (i < 32) continue; if ((i == 34) || (i == 60) || (i == 62) || (i == 124)) continue; - Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); + Assert.Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); } } else { foreach (char c in invalid) { int i = (int) c; if (i == 0) continue; - Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); + Assert.Fail (String.Format ("'{0}' (#{1}) is invalid", c, i)); } } } @@ -1135,9 +1135,9 @@ namespace MonoTests.System.IO '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D', '\x1E', '\x1F' }; - AssertEquals (expected.Length, invalid.Length); + Assert.AreEqual (expected.Length, invalid.Length); for (int i = 0; i < expected.Length; i++ ) { - AssertEquals( "Character at position " + i,expected [i], invalid [i]); + Assert.AreEqual (expected [i], invalid [i], "Character at position " + i); } } } @@ -1148,21 +1148,21 @@ namespace MonoTests.System.IO char[] expected = Path.GetInvalidPathChars (); char[] invalid = Path.GetInvalidPathChars (); invalid[0] = 'a'; - Assert ("expected", expected[0] != 'a'); - AssertEquals ("readonly", expected[0], Path.GetInvalidPathChars ()[0]); + Assert.IsTrue (expected[0] != 'a', "expected"); + Assert.AreEqual (expected[0], Path.GetInvalidPathChars ()[0], "readonly"); } [Test] public void GetRandomFileName () { string s = Path.GetRandomFileName (); - AssertEquals ("Length", 12, s.Length); + Assert.AreEqual (12, s.Length, "Length"); char[] invalid = Path.GetInvalidFileNameChars (); for (int i=0; i < s.Length; i++) { if (i == 8) - AssertEquals ("8", '.', s[i]); + Assert.AreEqual ('.', s[i], "8"); else - Assert (i.ToString (), Array.IndexOf (invalid, s[i]) == -1); + Assert.IsTrue (Array.IndexOf (invalid, s[i]) == -1, i.ToString ()); } } @@ -1174,15 +1174,15 @@ namespace MonoTests.System.IO names [i] = Path.GetRandomFileName (); foreach (string name in names) { - AssertEquals (12, name.Length); - AssertEquals ('.', name [8]); + Assert.AreEqual (12, name.Length); + Assert.AreEqual ('.', name [8]); for (int i = 0; i < 12; i++) { if (i == 8) continue; char c = name [i]; - Assert (('a' <= c && c <= 'z') || ('0' <= c && c <= '9')); + Assert.IsTrue (('a' <= c && c <= 'z') || ('0' <= c && c <= '9')); } } } diff --git a/mcs/class/corlib/Test/System.IO/StringReaderTest.cs b/mcs/class/corlib/Test/System.IO/StringReaderTest.cs index 0c63bb8c2b7..7b9fa129161 100644 --- a/mcs/class/corlib/Test/System.IO/StringReaderTest.cs +++ b/mcs/class/corlib/Test/System.IO/StringReaderTest.cs @@ -15,7 +15,8 @@ using System; namespace MonoTests.System.IO { [TestFixture] -public class StringReaderTest : Assertion { +public class StringReaderTest { + [Test] public void TestReadLine() { string testme = "a\nb\nc\n"; StringReader sr = new StringReader (testme); @@ -24,53 +25,57 @@ public class StringReaderTest : Assertion { while ((inputLine = sr.ReadLine ()) != null) lines++; - AssertEquals ("Incorrect number of lines", 3, lines); + Assert.AreEqual (3, lines, "Incorrect number of lines"); } + [Test] public void TestPeekRead() { StringReader reader = new StringReader( "Test String" ); char c = (char)reader.Peek(); - AssertEquals("A1", 'T', c ); + Assert.AreEqual ('T', c, "A1"); char read = (char)reader.Read(); - AssertEquals("A2", 'T', read ); + Assert.AreEqual ('T', read, "A2"); c = (char)reader.Peek(); - AssertEquals("A3", 'e', c ); + Assert.AreEqual ('e', c, "A3"); } + [Test] public void TestPeekAndReadAtEndOfString() { StringReader reader = new StringReader("x"); char c = (char)reader.Peek(); - AssertEquals("A1", 'x', c ); + Assert.AreEqual ('x', c, "A1"); c = (char)reader.Read(); - AssertEquals("A2", 'x', c); + Assert.AreEqual ('x', c, "A2"); int i = reader.Peek(); - AssertEquals("A3", -1, i); + Assert.AreEqual (-1, i, "A3"); i = reader.Read(); - AssertEquals("A4", -1, i); + Assert.AreEqual (-1, i, "A4"); i = reader.Peek(); - AssertEquals("A5", -1, i); + Assert.AreEqual (-1, i, "A5"); } + [Test] public void TestPeekAndReadEmptyString() { StringReader reader = new StringReader(""); int i = reader.Peek(); - AssertEquals("A1", -1, i); + Assert.AreEqual (-1, i, "A1"); i = reader.Read(); - AssertEquals("A2", -1, i); + Assert.AreEqual (-1, i, "A2"); } + [Test] public void TestRead() { StringReader reader = new StringReader( "Test String" ); @@ -79,51 +84,53 @@ public class StringReaderTest : Assertion { int charsRead = reader.Read( test, 0, 5 ); - AssertEquals( 5, charsRead ); - AssertEquals( "Test ", new String(test) ); + Assert.AreEqual (5, charsRead); + Assert.AreEqual ("Test ", new String(test)); /* Read to end of string */ //reader = new StringReader( "Test String" ); test = new char[6]; charsRead = reader.Read( test, 0, 6 ); - AssertEquals( 6, charsRead); - AssertEquals( "String", new String( test ) ); + Assert.AreEqual (6, charsRead); + Assert.AreEqual ("String", new String( test )); /* Read past end of string */ test = new char[6]; reader = new StringReader( "Foo" ); charsRead = reader.Read( test, 0, 6 ); - AssertEquals( 3, charsRead ); - AssertEquals( "Foo\0\0\0", new String( test ) ); + Assert.AreEqual (3, charsRead); + Assert.AreEqual ("Foo\0\0\0", new String( test )); /* Check that a new invocation on the empty reader will return 0 */ charsRead = reader.Read (test, 0, 6); - AssertEquals (0, charsRead); + Assert.AreEqual (0, charsRead); } + [Test] public void TestReadEOL() { StringReader reader = new StringReader( "Line1\rLine2\r\nLine3\nLine4" ); string test = reader.ReadLine(); - AssertEquals( "Line1", test ); + Assert.AreEqual ("Line1", test); test = reader.ReadLine(); - AssertEquals( "Line2", test ); + Assert.AreEqual ("Line2", test); test = reader.ReadLine(); - AssertEquals( "Line3", test ); + Assert.AreEqual ("Line3", test); test = reader.ReadLine(); - AssertEquals( "Line4", test ); + Assert.AreEqual ("Line4", test); } + [Test] public void TestClose() { StringReader reader = new StringReader("reader"); @@ -131,37 +138,38 @@ public class StringReaderTest : Assertion { try { reader.Read (); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals ("Close 1", typeof (ObjectDisposedException), e.GetType ()); + Assert.AreEqual (typeof (ObjectDisposedException), e.GetType (), "Close 1"); } try { reader.Peek (); - Fail (); + Assert.Fail (); } catch (Exception e) { - AssertEquals ("Close 2", typeof (ObjectDisposedException), e.GetType ()); + Assert.AreEqual (typeof (ObjectDisposedException), e.GetType (), "Close 2"); } } + [Test] public void TestExceptions() { StringReader reader; try { reader = new StringReader(null); - Fail (); + Assert.Fail (); } catch (Exception e) { - AssertEquals ("Exception 1", typeof (ArgumentNullException), e.GetType ()); + Assert.AreEqual (typeof (ArgumentNullException), e.GetType (), "Exception 1"); } reader = new StringReader ("this is a test\nAnd nothing else"); try { reader.Read (null, 0, 12); - Fail (); + Assert.Fail (); } catch (Exception e) { - AssertEquals ("Exception 2", typeof (ArgumentNullException), e.GetType ()); + Assert.AreEqual (typeof (ArgumentNullException), e.GetType (), "Exception 2"); } } @@ -176,7 +184,7 @@ public class StringReaderTest : Assertion { while (tr.ReadLine () != null) i++; - AssertEquals ("#01", 3, i); + Assert.AreEqual (3, i, "#01"); } [Test] @@ -199,7 +207,7 @@ public class StringReaderTest : Assertion { public void Read_DoesntStopAtLineEndings () { StringReader reader = new StringReader ("Line1\rLine2\r\nLine3\nLine4"); - AssertEquals (24, reader.Read (new char[24], 0, 24)); + Assert.AreEqual (reader.Read (new char[24], 0, 24), 24); } [Test] @@ -210,7 +218,7 @@ public class StringReaderTest : Assertion { int count = 0; while (reader.ReadLine () != null) count++; - AssertEquals (4, count); + Assert.AreEqual (4, count); } } diff --git a/mcs/class/corlib/Test/System.IO/StringWriterTest.cs b/mcs/class/corlib/Test/System.IO/StringWriterTest.cs index b220929458d..f84e5a99e33 100644 --- a/mcs/class/corlib/Test/System.IO/StringWriterTest.cs +++ b/mcs/class/corlib/Test/System.IO/StringWriterTest.cs @@ -18,85 +18,90 @@ using System.Text; namespace MonoTests.System.IO { [TestFixture] -public class StringWriterTest : Assertion { +public class StringWriterTest { + [Test] public void TestConstructors() { StringBuilder sb = new StringBuilder("Test String"); StringWriter writer = new StringWriter( sb ); - AssertEquals( sb, writer.GetStringBuilder() ); + Assert.AreEqual (sb, writer.GetStringBuilder()); } + [Test] public void TestCultureInfoConstructor() { StringWriter writer = new StringWriter(CultureInfo.InvariantCulture); - AssertNotNull( writer.GetStringBuilder() ); + Assert.IsNotNull (writer.GetStringBuilder()); - AssertEquals( String.Empty, writer.ToString() ); + Assert.AreEqual (String.Empty, writer.ToString()); writer.Write( 'A' ); - AssertEquals( "A", writer.ToString() ); + Assert.AreEqual ("A", writer.ToString()); writer.Write( " foo" ); - AssertEquals( "A foo", writer.ToString() ); + Assert.AreEqual ("A foo", writer.ToString()); char[] testBuffer = "Test String".ToCharArray(); writer.Write( testBuffer, 0, 4 ); - AssertEquals( "A fooTest", writer.ToString() ); + Assert.AreEqual ("A fooTest", writer.ToString()); writer.Write( testBuffer, 5, 6 ); - AssertEquals( "A fooTestString", writer.ToString() ); + Assert.AreEqual ("A fooTestString", writer.ToString()); writer = new StringWriter(CultureInfo.InvariantCulture); writer.Write(null as string); - AssertEquals( "", writer.ToString() ); + Assert.AreEqual ("", writer.ToString()); } + [Test] public void TestWrite() { StringWriter writer = new StringWriter(); - AssertEquals( String.Empty, writer.ToString() ); + Assert.AreEqual (String.Empty, writer.ToString()); writer.Write( 'A' ); - AssertEquals( "A", writer.ToString() ); + Assert.AreEqual ("A", writer.ToString()); writer.Write( " foo" ); - AssertEquals( "A foo", writer.ToString() ); + Assert.AreEqual ("A foo", writer.ToString()); char[] testBuffer = "Test String".ToCharArray(); writer.Write( testBuffer, 0, 4 ); - AssertEquals( "A fooTest", writer.ToString() ); + Assert.AreEqual ("A fooTest", writer.ToString()); writer.Write( testBuffer, 5, 6 ); - AssertEquals( "A fooTestString", writer.ToString() ); + Assert.AreEqual ("A fooTestString", writer.ToString()); writer = new StringWriter (); writer.Write(null as string); - AssertEquals( "", writer.ToString() ); + Assert.AreEqual ("", writer.ToString()); } + [Test] public void TestNewLine() { StringWriter writer = new StringWriter(); writer.NewLine = "\n\r"; - AssertEquals ("NewLine 1", "\n\r", writer.NewLine); + Assert.AreEqual ("\n\r", writer.NewLine, "NewLine 1"); writer.WriteLine ("first"); - AssertEquals ("NewLine 2", "first\n\r", writer.ToString()); + Assert.AreEqual ("first\n\r", writer.ToString(), "NewLine 2"); writer.NewLine = "\n"; - AssertEquals ("NewLine 3", "first\n\r", writer.ToString()); + Assert.AreEqual ("first\n\r", writer.ToString(), "NewLine 3"); writer.WriteLine ("second"); - AssertEquals ("NewLine 4", "first\n\rsecond\n", writer.ToString()); + Assert.AreEqual ("first\n\rsecond\n", writer.ToString(), "NewLine 4"); } + [Test] public void TestWriteLine() { StringWriter writer = new StringWriter(); @@ -105,21 +110,23 @@ public class StringWriterTest : Assertion { writer.WriteLine ("first line"); writer.WriteLine ("second line"); - AssertEquals ("WriteLine 1", "first line\nsecond line\n", writer.ToString ()); + Assert.AreEqual ("first line\nsecond line\n", writer.ToString (), "WriteLine 1"); writer.Close (); } + [Test] public void TestGetStringBuilder() { StringWriter writer = new StringWriter (); writer.Write ("line"); StringBuilder builder = writer.GetStringBuilder (); builder.Append (12); - AssertEquals ("GetStringBuilder 1", "line12", writer.ToString ()); + Assert.AreEqual ("line12", writer.ToString (), "GetStringBuilder 1"); writer.Write ("test"); - AssertEquals ("GetStringBuilder 2", "line12test", builder.ToString ()); + Assert.AreEqual ("line12test", builder.ToString (), "GetStringBuilder 2"); } + [Test] public void TestClose() { StringWriter writer = new StringWriter (); @@ -128,36 +135,37 @@ public class StringWriterTest : Assertion { try { writer.Write ("kicks ass"); - Fail ("Close 1"); + Assert.Fail ("Close 1"); } catch (Exception e) { - AssertEquals ("Close 2", typeof (ObjectDisposedException), e.GetType ()); + Assert.AreEqual (typeof (ObjectDisposedException), e.GetType (), "Close 2"); } - AssertEquals ("Close 3", "mono", writer.ToString ()); + Assert.AreEqual ("mono", writer.ToString (), "Close 3"); writer.Flush (); StringBuilder builder = writer.GetStringBuilder (); - AssertEquals ("Close 4", "mono", builder.ToString ()); + Assert.AreEqual ("mono", builder.ToString (), "Close 4"); builder.Append (" kicks ass"); - AssertEquals ("Close 5", "mono kicks ass", writer.ToString ()); + Assert.AreEqual ("mono kicks ass", writer.ToString (), "Close 5"); } + [Test] public void TestExceptions () { try { StringWriter writer = new StringWriter (null as StringBuilder); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals ("Exceptions 1", typeof (ArgumentNullException), e.GetType ()); + Assert.AreEqual (typeof (ArgumentNullException), e.GetType (), "Exceptions 1"); } { StringWriter writer = new StringWriter (null as IFormatProvider); } try { StringWriter writer = new StringWriter (null as StringBuilder, null as IFormatProvider); - Fail (); + Assert.Fail (); } catch (Exception e) { - AssertEquals ("Exceptions 2", typeof (ArgumentNullException), e.GetType ()); + Assert.AreEqual (typeof (ArgumentNullException), e.GetType (), "Exceptions 2"); } } @@ -218,7 +226,7 @@ public class StringWriterTest : Assertion { { StringWriter writer = new StringWriter (); writer.Close (); - AssertNotNull ("Disposed-Encoding", writer.Encoding); + Assert.IsNotNull (writer.Encoding, "Disposed-Encoding"); } [Test] @@ -235,7 +243,7 @@ public class StringWriterTest : Assertion { StringWriter writer = new StringWriter (); writer.Write ("Mono"); writer.Close (); - AssertNotNull ("Disposed-GetStringBuilder", writer.GetStringBuilder ()); + Assert.IsNotNull (writer.GetStringBuilder (), "Disposed-GetStringBuilder"); } [Test] @@ -244,7 +252,7 @@ public class StringWriterTest : Assertion { StringWriter writer = new StringWriter (); writer.Write ("Mono"); writer.Close (); - AssertEquals ("Disposed-ToString", "Mono", writer.ToString ()); + Assert.AreEqual ("Mono", writer.ToString (), "Disposed-ToString"); } [Test] diff --git a/mcs/class/corlib/Test/System.IO/TextWriterTest.cs b/mcs/class/corlib/Test/System.IO/TextWriterTest.cs index 5518e7e200c..0ee3540179e 100644 --- a/mcs/class/corlib/Test/System.IO/TextWriterTest.cs +++ b/mcs/class/corlib/Test/System.IO/TextWriterTest.cs @@ -16,7 +16,7 @@ using NUnit.Framework; namespace MonoTests.System.IO { [TestFixture] - public class TextWriterTest : Assertion + public class TextWriterTest { class MyTextWriter : TextWriter { @@ -42,13 +42,13 @@ namespace MonoTests.System.IO public void CoreNewLine () { MyTextWriter w = new MyTextWriter (); - AssertNotNull (w.NewLine); + Assert.IsNotNull (w.NewLine); w.UpdateLine (); - AssertEquals ('Z', w.NewLine [0]); + Assert.AreEqual ('Z', w.NewLine [0]); w.UpdateLine2 (); - AssertEquals ('Y', w.NewLine [0]); + Assert.AreEqual ('Y', w.NewLine [0]); } class ArrayOrCharTester : TextWriter { @@ -69,7 +69,7 @@ namespace MonoTests.System.IO { ArrayOrCharTester x = new ArrayOrCharTester (); x.Write (new char [] {'a','b','c'}); - AssertEquals (true, x.called_array); + Assert.AreEqual (true, x.called_array); } } } diff --git a/mcs/class/corlib/Test/System.Reflection.Emit/AssemblyBuilderAccessTest.cs b/mcs/class/corlib/Test/System.Reflection.Emit/AssemblyBuilderAccessTest.cs index 609c9319e6e..4c170f04fe6 100644 --- a/mcs/class/corlib/Test/System.Reflection.Emit/AssemblyBuilderAccessTest.cs +++ b/mcs/class/corlib/Test/System.Reflection.Emit/AssemblyBuilderAccessTest.cs @@ -14,29 +14,24 @@ namespace MonoTests.System.Reflection.Emit /// A simple class to test the values of the enum AssemblyBuilderAccess. /// [TestFixture] - public class AssemblyBuilderAccessTest : Assertion + public class AssemblyBuilderAccessTest { [Test] public void RunTest () { - AssertEquals("Testing Run value", - (int) AssemblyBuilderAccess.Run , 1); + Assert.AreEqual((int) AssemblyBuilderAccess.Run, 1); } [Test] public void RunAndSaveTest () { - AssertEquals ("Testing RunAndSave value", - (int) AssemblyBuilderAccess.RunAndSave , 3); + Assert.AreEqual ((int) AssemblyBuilderAccess.RunAndSave, 3); } [Test] public void SaveTest() { - AssertEquals ("Testing Save value", - (int) AssemblyBuilderAccess.Save , 2); - } - - + Assert.AreEqual ((int) AssemblyBuilderAccess.Save, 2); + } } } diff --git a/mcs/class/corlib/Test/System.Reflection.Emit/ChangeLog b/mcs/class/corlib/Test/System.Reflection.Emit/ChangeLog index 7d94ee1142f..17fa89af9e8 100644 --- a/mcs/class/corlib/Test/System.Reflection.Emit/ChangeLog +++ b/mcs/class/corlib/Test/System.Reflection.Emit/ChangeLog @@ -1,3 +1,20 @@ +2009-07-08 Rodrigo Kumpera + + * DerivedTypesTest.cs: New tests for PointerType. + +2009-07-08 Rodrigo Kumpera + + * DerivedTypesTest.cs: New tests for ByRefType. + +2009-07-07 Rodrigo Kumpera + + * DerivedTypesTest.cs: New tests for types derived from + TypeBuilder. + +2009-06-20 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2009-06-02 Rodrigo Kumpera * ILGeneratorTest.cs: Tests for #509131. diff --git a/mcs/class/corlib/Test/System.Reflection.Emit/CustomAttributeBuilderTest.cs b/mcs/class/corlib/Test/System.Reflection.Emit/CustomAttributeBuilderTest.cs index 3838dfc87cd..c0cc7c43d2f 100644 --- a/mcs/class/corlib/Test/System.Reflection.Emit/CustomAttributeBuilderTest.cs +++ b/mcs/class/corlib/Test/System.Reflection.Emit/CustomAttributeBuilderTest.cs @@ -29,7 +29,7 @@ namespace MonoTests.System.Reflection.Emit /// [TestFixture] - public class CustomAttributeBuilderTest : Assertion + public class CustomAttributeBuilderTest { // the CustomAttribute class is used for testing and it has to be public @@ -144,18 +144,18 @@ namespace MonoTests.System.Reflection.Emit //check the validity of the attribute associated with Print method object [] methodAttrs = myType.GetMember ("Print") [0].GetCustomAttributes (true); - AssertEquals ("#method Print has exactly one attribute", methodAttrs.Length, 1); + Assert.AreEqual (methodAttrs.Length, 1, "#1"); CustomAttribute methodAttr = methodAttrs [0] as CustomAttribute; - AssertEquals ("#AttributeOne", methodAttr.AttributeOne, "hello"); - AssertEquals ("#AttributeTwo", methodAttr.AttributeTwo, "world"); + Assert.AreEqual (methodAttr.AttributeOne, "hello", "#2"); + Assert.AreEqual (methodAttr.AttributeTwo, "world", "#3"); //check the validity of the attribute associated with Str feild object [] fieldAttrs = myType.GetField ("Str").GetCustomAttributes (true); - AssertEquals("#feild Str has exactly one attribute", fieldAttrs.Length, 1); + Assert.AreEqual(fieldAttrs.Length, 1, "#4"); CustomAttribute fieldAttr = fieldAttrs [0] as CustomAttribute; - AssertEquals("#AttributeOne", fieldAttr.AttributeOne, "one"); - AssertEquals("#AttributeTwo", fieldAttr.AttributeTwo, "two"); + Assert.AreEqual(fieldAttr.AttributeOne, "one", "#5"); + Assert.AreEqual(fieldAttr.AttributeTwo, "two", "#6"); } [Test] @@ -207,13 +207,13 @@ namespace MonoTests.System.Reflection.Emit //check the validity of the attribute associated with Print method object [] customAttrs = myType.GetCustomAttributes (false); - AssertEquals ("#TestType has exactly one attribute", customAttrs.Length, 1); + Assert.AreEqual (customAttrs.Length, 1, "1"); //Custom Attributes of TestType CustomAttribute attr = customAttrs [0] as CustomAttribute; - AssertEquals ("#AttributeOne", attr.AttributeOne, "Test"); - AssertEquals ("#AttributeTwo", attr.AttributeTwo, "Type"); - AssertEquals ("#CustomAttribute.Feild",attr.Feild, "TestCase"); + Assert.AreEqual (attr.AttributeOne, "Test", "#2"); + Assert.AreEqual (attr.AttributeTwo, "Type", "#3"); + Assert.AreEqual (attr.Feild, "TestCase", "#4"); } @@ -266,11 +266,11 @@ namespace MonoTests.System.Reflection.Emit //check the validity of the attribute associated with Print method object [] customAttrs = myType.GetCustomAttributes (false); - AssertEquals ("#TestType has exactly one attribute", customAttrs.Length , 1); + Assert.AreEqual (customAttrs.Length , 1, "#1"); //Custom Attributes of TestType CustomAttribute attr = customAttrs [0] as CustomAttribute; - AssertEquals("#AttributeOne", attr.AttributeOne, "TestCase"); + Assert.AreEqual(attr.AttributeOne, "TestCase", "#2"); } [Test] @@ -326,12 +326,12 @@ namespace MonoTests.System.Reflection.Emit //check the validity of the attribute associated with Print method object [] customAttrs = myType.GetCustomAttributes (false); - AssertEquals("#TestType has exactly one attribute",customAttrs.Length , 1); + Assert.AreEqual(customAttrs.Length , 1, "#1"); //Custom Attributes of TestType CustomAttribute attr = customAttrs [0] as CustomAttribute; - AssertEquals ("#AttributeOne", attr.AttributeOne, "TestCase"); - AssertEquals ("#Field ", attr.Feild, "FieldValue"); + Assert.AreEqual (attr.AttributeOne, "TestCase", "#2"); + Assert.AreEqual (attr.Feild, "FieldValue", "#3"); } @@ -370,7 +370,7 @@ namespace MonoTests.System.Reflection.Emit typeof (CustomAttribute).GetConstructor (BindingFlags.Instance | BindingFlags.NonPublic, null, ctorParams, null); - Assert ("#Custom Attribute has private constuctor ", classCtorInfo != null); + Assert.IsNotNull (classCtorInfo); CustomAttributeBuilder typeCABuilder = new CustomAttributeBuilder ( classCtorInfo, @@ -555,7 +555,7 @@ namespace MonoTests.System.Reflection.Emit ConstructorInfo classCtorInfo = typeof (CustomAttribute).GetConstructor (ctorParams); - Assert ("#ctor not null", classCtorInfo != null); + Assert.IsNotNull (classCtorInfo); CustomAttributeBuilder typeCABuilder = new CustomAttributeBuilder ( classCtorInfo, new object [] { "1","2" }, @@ -577,7 +577,7 @@ namespace MonoTests.System.Reflection.Emit ConstructorInfo classCtorInfo = typeof (CustomAttribute).GetConstructor (ctorParams); - Assert ("#ctor not null", classCtorInfo != null); + Assert.IsNotNull (classCtorInfo); CustomAttributeBuilder typeCABuilder = new CustomAttributeBuilder ( classCtorInfo, null, //<-- here is the error @@ -599,7 +599,7 @@ namespace MonoTests.System.Reflection.Emit ConstructorInfo classCtorInfo = typeof (CustomAttribute).GetConstructor (ctorParams); - Assert ("#ctor not null", classCtorInfo != null); + Assert.IsNotNull (classCtorInfo); CustomAttributeBuilder typeCABuilder = new CustomAttributeBuilder ( classCtorInfo, new object [] { "one","two" }, @@ -621,7 +621,7 @@ namespace MonoTests.System.Reflection.Emit ConstructorInfo classCtorInfo = typeof (CustomAttribute).GetConstructor (ctorParams); - Assert ("#ctor not null", classCtorInfo != null); + Assert.IsNotNull (classCtorInfo); CustomAttributeBuilder typeCABuilder = new CustomAttributeBuilder ( classCtorInfo, new object [] { "one","two" }, diff --git a/mcs/class/corlib/Test/System.Reflection.Emit/DerivedTypesTest.cs b/mcs/class/corlib/Test/System.Reflection.Emit/DerivedTypesTest.cs new file mode 100644 index 00000000000..d1733dae589 --- /dev/null +++ b/mcs/class/corlib/Test/System.Reflection.Emit/DerivedTypesTest.cs @@ -0,0 +1,1300 @@ +// +// DerivedType.cs - NUnit Test Cases for types derived from TypeBuilder +// +// Rodrigo Kumpera +// +// Copyright (C) 2009 Novell, Inc (http://www.novell.com) +// + +using System; +using System.Collections; +using System.Threading; +using System.Reflection; +using System.Reflection.Emit; +using System.IO; +using System.Security; +using System.Security.Permissions; +using System.Runtime.InteropServices; +using NUnit.Framework; +using System.Runtime.CompilerServices; + +#if NET_2_0 +using System.Collections.Generic; +#endif + +namespace MonoTests.System.Reflection.Emit +{ +#if NET_2_0 + [TestFixture] + public class PointerTypeTest + { + AssemblyBuilder assembly; + ModuleBuilder module; + int typeCount; + static string ASSEMBLY_NAME = "MonoTests.System.Reflection.Emit.TypeBuilderTest"; + + string MakeName () + { + return "internal__type"+ typeCount++; + } + + [SetUp] + protected void SetUp () + { + AssemblyName assemblyName = new AssemblyName (); + assemblyName.Name = ASSEMBLY_NAME; + + assembly = + Thread.GetDomain ().DefineDynamicAssembly ( + assemblyName, AssemblyBuilderAccess.RunAndSave, Path.GetTempPath ()); + + module = assembly.DefineDynamicModule ("module1"); + typeCount = 0; + } + + [Test] + [Category ("NotDotNet")] + public void NonStandardPropertiesValues () + { + /* + Those are tests for properties that return non-sense values on MS. + */ + TypeBuilder tb = module.DefineType ("ns.type", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + //a ptr doesn't have any base type + Assert.AreEqual (null, ptr.BaseType, "#1"); + } + + [Test] + public void PropertiesValue () + { + TypeBuilder tb = module.DefineType ("ns.type", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + + Assert.AreEqual (assembly, ptr.Assembly, "#1"); + Assert.AreEqual ("ns.type*, " + assembly.FullName, ptr.AssemblyQualifiedName, "#2"); + Assert.AreEqual ("ns.type*", ptr.FullName, "#4"); + Assert.AreEqual (module, ptr.Module, "#5"); + Assert.AreEqual ("ns", ptr.Namespace, "#6"); + Assert.AreEqual (ptr, ptr.UnderlyingSystemType, "#7"); + Assert.AreEqual ("type*", ptr.Name, "#8"); + + try { + object x = ptr.GUID; + Assert.Fail ("#9"); + } catch (NotSupportedException) {} + + try { + object x = ptr.TypeHandle; + Assert.Fail ("#10"); + } catch (NotSupportedException) {} + } + + [Test] + public void Methods () + { + TypeBuilder tb = module.DefineType ("ns.type", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + + try { + ptr.GetInterface ("foo", true); + Assert.Fail ("#1"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetInterfaces (); + Assert.Fail ("#2"); + } catch (NotSupportedException) { + + } + + Assert.AreEqual (tb, ptr.GetElementType ()); + + try { + ptr.GetEvent ("foo", BindingFlags.Public); + Assert.Fail ("#4"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetEvents (BindingFlags.Public); + Assert.Fail ("#5"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetField ("foo", BindingFlags.Public); + Assert.Fail ("#6"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetFields (BindingFlags.Public); + Assert.Fail ("#7"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetMembers (BindingFlags.Public); + Assert.Fail ("#8"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetMethod ("Sort"); + Assert.Fail ("#9"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetMethods (BindingFlags.Public); + Assert.Fail ("#9"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetNestedType ("bla", BindingFlags.Public); + Assert.Fail ("#10"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetNestedTypes (BindingFlags.Public); + Assert.Fail ("#11"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetProperties (BindingFlags.Public); + Assert.Fail ("#12"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetProperty ("Length"); + Assert.Fail ("#13"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetConstructor (new Type[] { typeof (int) }); + Assert.Fail ("#14"); + } catch (NotSupportedException) { + + } + + TypeAttributes attr = TypeAttributes.AutoLayout | TypeAttributes.AnsiClass | TypeAttributes.Class | TypeAttributes.Public; + Assert.AreEqual (attr, ptr.Attributes, "#15"); + + Assert.IsTrue (ptr.HasElementType, "#16"); + Assert.IsFalse (ptr.IsArray, "#17"); + Assert.IsFalse (ptr.IsByRef, "#18"); + Assert.IsFalse (ptr.IsCOMObject, "#19"); + Assert.IsTrue (ptr.IsPointer, "#20"); + Assert.IsFalse (ptr.IsPrimitive, "#21"); + + try { + ptr.GetConstructors (BindingFlags.Public); + Assert.Fail ("#22"); + } catch (NotSupportedException) { + + } + + try { + ptr.InvokeMember ("GetLength", BindingFlags.Public, null, null, null); + Assert.Fail ("#23"); + } catch (NotSupportedException) { + + } + + try { + ptr.GetArrayRank (); + Assert.Fail ("#23"); + } catch (NotSupportedException) { + + } + } + + [Test] + public void AttributeValues () + { + TypeBuilder tb = module.DefineType (MakeName (), TypeAttributes.NotPublic); + Assert.AreEqual (TypeAttributes.NotPublic, tb.Attributes, "#1"); + + tb = module.DefineType (MakeName (), TypeAttributes.Public); + Assert.AreEqual (TypeAttributes.Public, tb.Attributes, "#2"); + + tb = module.DefineType (MakeName (), TypeAttributes.Public | TypeAttributes.Serializable | TypeAttributes.Sealed); + Assert.AreEqual (TypeAttributes.Public | TypeAttributes.Serializable | TypeAttributes.Sealed, tb.Attributes, "#3"); + + tb = module.DefineType (MakeName (), TypeAttributes.Public | TypeAttributes.Abstract); + Assert.AreEqual (TypeAttributes.Public | TypeAttributes.Abstract, tb.Attributes, "$4"); + } + + [Test] + public void AsParamType () + { + + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + + MethodBuilder mb = tb.DefineMethod ("Test", MethodAttributes.Public, typeof (void), new Type [1] { ptr }); + ILGenerator ilgen = mb.GetILGenerator (); + ilgen.Emit (OpCodes.Ret); + + Type res = tb.CreateType (); + + object o = Activator.CreateInstance (res); + //FIXME this crashes the runtime + //res.GetMethod ("Test").Invoke (o, new object[1] { null }); + } + + [Test] + public void AsLocalVariable () + { + + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + + MethodBuilder mb = tb.DefineMethod ("Test", MethodAttributes.Public, typeof (void), new Type [0]); + ILGenerator ilgen = mb.GetILGenerator (); + ilgen.DeclareLocal (ptr); + ilgen.Emit (OpCodes.Ret); + + Type res = tb.CreateType (); + + object o = Activator.CreateInstance (res); + res.GetMethod ("Test").Invoke (o, null); + } + + [Test] + public void TestEquals () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + Type ptr2 = tb.MakePointerType (); + Assert.IsFalse (ptr.Equals (ptr2), "#1"); + Assert.IsTrue (ptr.Equals (ptr), "#2"); + } + + [Test] + public void IsSubclassOf () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + Assert.IsFalse (ptr.IsSubclassOf (tb), "#1"); + Assert.IsFalse (ptr.IsSubclassOf (typeof (object[])), "#2"); + } + + [Test] + public void IsAssignableFrom () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + Assert.IsFalse (ptr.IsAssignableFrom (tb), "#1"); + Assert.IsFalse (ptr.IsAssignableFrom (typeof (object[])), "#2"); + Assert.IsFalse (typeof (object[]).IsAssignableFrom (ptr), "#3"); + Assert.IsFalse (typeof (object).IsAssignableFrom (ptr), "#4"); + } + + [Test] + public void GetInterfaceMap () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + try { + ptr.GetInterfaceMap (typeof (IEnumerable)); + Assert.Fail ("#1"); + } catch (NotSupportedException) { + + } + } + + [Test] + public void IsInstanceOfType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + Assert.IsFalse (ptr.IsInstanceOfType (tb), "#1"); + Assert.IsFalse (ptr.IsInstanceOfType (null), "#2"); + Assert.IsFalse (ptr.IsInstanceOfType (new object [1]), "#3"); + + Type t = tb.CreateType (); + object obj = Activator.CreateInstance (t); + Assert.IsFalse (ptr.IsInstanceOfType (obj), "#4"); + } + + [Test] + public void IsGenericTypeDefinition () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + Assert.IsFalse (ptr.IsGenericTypeDefinition, "#1"); + } + + [Test] + public void IsGenericType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + Assert.IsFalse (ptr.IsGenericType, "#1"); + } + + [Test] + public void MakeGenericType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + try { + ptr.MakeGenericType (new Type[] { typeof (string) }); + Assert.Fail ("#1"); + } catch (NotSupportedException) {} + } + + [Test] + public void GenericParameterPosition () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + try { + int pos = ptr.GenericParameterPosition; + Assert.Fail ("#1"); + } catch (InvalidOperationException) {} + } + + [Test] + public void GenericParameterAttributes () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + try { + object attr = ptr.GenericParameterAttributes; + Assert.Fail ("#1"); + } catch (NotSupportedException) {} + } + + [Test] + public void GetGenericParameterConstraints () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + try { + ptr.GetGenericParameterConstraints (); + Assert.Fail ("#1"); + } catch (InvalidOperationException) {} + } + + [Test] + public void MakeArrayType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + Type res = ptr.MakeArrayType (); + Assert.IsNotNull (res, "#1"); + Assert.IsTrue (res.IsArray, "#2"); + + res = ptr.MakeArrayType (2); + Assert.IsNotNull (res, "#3"); + Assert.IsTrue (res.IsArray, "#4"); + } + + [Test] + public void MakeByRefType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + Type res = ptr.MakeByRefType (); + + Assert.IsNotNull (res, "#1"); + Assert.IsTrue (res.IsByRef, "#2"); + } + + [Test] + public void MakePointerType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + Type res = ptr.MakePointerType (); + + Assert.IsNotNull (res, "#1"); + Assert.IsTrue (res.IsPointer, "#2"); + } + + [Test] + public void StructLayoutAttribute () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type ptr = tb.MakePointerType (); + try { + object x = ptr.StructLayoutAttribute; + Assert.Fail ("#1"); + } catch (NotSupportedException) {} + } + } + + + [TestFixture] + public class ByrefTypeTest + { + AssemblyBuilder assembly; + ModuleBuilder module; + int typeCount; + static string ASSEMBLY_NAME = "MonoTests.System.Reflection.Emit.TypeBuilderTest"; + + string MakeName () + { + return "internal__type"+ typeCount++; + } + + [SetUp] + protected void SetUp () + { + AssemblyName assemblyName = new AssemblyName (); + assemblyName.Name = ASSEMBLY_NAME; + + assembly = + Thread.GetDomain ().DefineDynamicAssembly ( + assemblyName, AssemblyBuilderAccess.RunAndSave, Path.GetTempPath ()); + + module = assembly.DefineDynamicModule ("module1"); + typeCount = 0; + } + + [Test] + [Category ("NotDotNet")] + public void NonStandardPropertiesValues () + { + /* + Those are tests for properties that return non-sense values on MS. + */ + TypeBuilder tb = module.DefineType ("ns.type", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + //a byref doesn't have any base type + Assert.AreEqual (null, byref.BaseType, "#1"); + } + + [Test] + public void PropertiesValue () + { + TypeBuilder tb = module.DefineType ("ns.type", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + + Assert.AreEqual (assembly, byref.Assembly, "#1"); + Assert.AreEqual ("ns.type&, " + assembly.FullName, byref.AssemblyQualifiedName, "#2"); + Assert.AreEqual ("ns.type&", byref.FullName, "#4"); + Assert.AreEqual (module, byref.Module, "#5"); + Assert.AreEqual ("ns", byref.Namespace, "#6"); + Assert.AreEqual (byref, byref.UnderlyingSystemType, "#7"); + Assert.AreEqual ("type&", byref.Name, "#8"); + + try { + object x = byref.GUID; + Assert.Fail ("#9"); + } catch (NotSupportedException) {} + + try { + object x = byref.TypeHandle; + Assert.Fail ("#10"); + } catch (NotSupportedException) {} + } + + [Test] + public void Methods () + { + TypeBuilder tb = module.DefineType ("ns.type", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + + try { + byref.GetInterface ("foo", true); + Assert.Fail ("#1"); + } catch (NotSupportedException) { + + } + + try { + byref.GetInterfaces (); + Assert.Fail ("#2"); + } catch (NotSupportedException) { + + } + + Assert.AreEqual (tb, byref.GetElementType ()); + + try { + byref.GetEvent ("foo", BindingFlags.Public); + Assert.Fail ("#4"); + } catch (NotSupportedException) { + + } + + try { + byref.GetEvents (BindingFlags.Public); + Assert.Fail ("#5"); + } catch (NotSupportedException) { + + } + + try { + byref.GetField ("foo", BindingFlags.Public); + Assert.Fail ("#6"); + } catch (NotSupportedException) { + + } + + try { + byref.GetFields (BindingFlags.Public); + Assert.Fail ("#7"); + } catch (NotSupportedException) { + + } + + try { + byref.GetMembers (BindingFlags.Public); + Assert.Fail ("#8"); + } catch (NotSupportedException) { + + } + + try { + byref.GetMethod ("Sort"); + Assert.Fail ("#9"); + } catch (NotSupportedException) { + + } + + try { + byref.GetMethods (BindingFlags.Public); + Assert.Fail ("#9"); + } catch (NotSupportedException) { + + } + + try { + byref.GetNestedType ("bla", BindingFlags.Public); + Assert.Fail ("#10"); + } catch (NotSupportedException) { + + } + + try { + byref.GetNestedTypes (BindingFlags.Public); + Assert.Fail ("#11"); + } catch (NotSupportedException) { + + } + + try { + byref.GetProperties (BindingFlags.Public); + Assert.Fail ("#12"); + } catch (NotSupportedException) { + + } + + try { + byref.GetProperty ("Length"); + Assert.Fail ("#13"); + } catch (NotSupportedException) { + + } + + try { + byref.GetConstructor (new Type[] { typeof (int) }); + Assert.Fail ("#14"); + } catch (NotSupportedException) { + + } + + TypeAttributes attr = TypeAttributes.AutoLayout | TypeAttributes.AnsiClass | TypeAttributes.Class | TypeAttributes.Public; + Assert.AreEqual (attr, byref.Attributes, "#15"); + + Assert.IsTrue (byref.HasElementType, "#16"); + Assert.IsFalse (byref.IsArray, "#17"); + Assert.IsTrue (byref.IsByRef, "#18"); + Assert.IsFalse (byref.IsCOMObject, "#19"); + Assert.IsFalse (byref.IsPointer, "#20"); + Assert.IsFalse (byref.IsPrimitive, "#21"); + + try { + byref.GetConstructors (BindingFlags.Public); + Assert.Fail ("#22"); + } catch (NotSupportedException) { + + } + + try { + byref.InvokeMember ("GetLength", BindingFlags.Public, null, null, null); + Assert.Fail ("#23"); + } catch (NotSupportedException) { + + } + + try { + byref.GetArrayRank (); + Assert.Fail ("#23"); + } catch (NotSupportedException) { + + } + } + + [Test] + public void AttributeValues () + { + TypeBuilder tb = module.DefineType (MakeName (), TypeAttributes.NotPublic); + Assert.AreEqual (TypeAttributes.NotPublic, tb.Attributes, "#1"); + + tb = module.DefineType (MakeName (), TypeAttributes.Public); + Assert.AreEqual (TypeAttributes.Public, tb.Attributes, "#2"); + + tb = module.DefineType (MakeName (), TypeAttributes.Public | TypeAttributes.Serializable | TypeAttributes.Sealed); + Assert.AreEqual (TypeAttributes.Public | TypeAttributes.Serializable | TypeAttributes.Sealed, tb.Attributes, "#3"); + + tb = module.DefineType (MakeName (), TypeAttributes.Public | TypeAttributes.Abstract); + Assert.AreEqual (TypeAttributes.Public | TypeAttributes.Abstract, tb.Attributes, "$4"); + } + + [Test] + public void AsParamType () + { + + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + + MethodBuilder mb = tb.DefineMethod ("Test", MethodAttributes.Public, typeof (void), new Type [1] { byref }); + ILGenerator ilgen = mb.GetILGenerator (); + ilgen.Emit (OpCodes.Ret); + + Type res = tb.CreateType (); + + object o = Activator.CreateInstance (res); + res.GetMethod ("Test").Invoke (o, new object[1] { null }); + } + + [Test] + public void AsLocalVariable () + { + + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + + MethodBuilder mb = tb.DefineMethod ("Test", MethodAttributes.Public, typeof (void), new Type [0]); + ILGenerator ilgen = mb.GetILGenerator (); + ilgen.DeclareLocal (byref); + ilgen.Emit (OpCodes.Ret); + + Type res = tb.CreateType (); + + object o = Activator.CreateInstance (res); + res.GetMethod ("Test").Invoke (o, null); + } + + [Test] + public void TestEquals () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + Type byref2 = tb.MakeByRefType (); + Assert.IsFalse (byref.Equals (byref2), "#1"); + Assert.IsTrue (byref.Equals (byref), "#2"); + } + + [Test] + public void IsSubclassOf () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + Assert.IsFalse (byref.IsSubclassOf (tb), "#1"); + Assert.IsFalse (byref.IsSubclassOf (typeof (object[])), "#2"); + } + + [Test] + public void IsAssignableFrom () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + Assert.IsFalse (byref.IsAssignableFrom (tb), "#1"); + Assert.IsFalse (byref.IsAssignableFrom (typeof (object[])), "#2"); + Assert.IsFalse (typeof (object[]).IsAssignableFrom (byref), "#3"); + Assert.IsFalse (typeof (object).IsAssignableFrom (byref), "#4"); + } + + [Test] + public void GetInterfaceMap () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + try { + byref.GetInterfaceMap (typeof (IEnumerable)); + Assert.Fail ("#1"); + } catch (NotSupportedException) { + + } + } + + [Test] + public void IsInstanceOfType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + Assert.IsFalse (byref.IsInstanceOfType (tb), "#1"); + Assert.IsFalse (byref.IsInstanceOfType (null), "#2"); + Assert.IsFalse (byref.IsInstanceOfType (new object [1]), "#3"); + + Type t = tb.CreateType (); + object obj = Activator.CreateInstance (t); + Assert.IsFalse (byref.IsInstanceOfType (obj), "#4"); + } + + [Test] + public void IsGenericTypeDefinition () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + Assert.IsFalse (byref.IsGenericTypeDefinition, "#1"); + } + + [Test] + public void IsGenericType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + Assert.IsFalse (byref.IsGenericType, "#1"); + } + + [Test] + public void MakeGenericType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + try { + byref.MakeGenericType (new Type[] { typeof (string) }); + Assert.Fail ("#1"); + } catch (NotSupportedException) {} + } + + [Test] + public void GenericParameterPosition () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + try { + int pos = byref.GenericParameterPosition; + Assert.Fail ("#1"); + } catch (InvalidOperationException) {} + } + + [Test] + public void GenericParameterAttributes () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + try { + object attr = byref.GenericParameterAttributes; + Assert.Fail ("#1"); + } catch (NotSupportedException) {} + } + + [Test] + public void GetGenericParameterConstraints () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + try { + byref.GetGenericParameterConstraints (); + Assert.Fail ("#1"); + } catch (InvalidOperationException) {} + } + + [Test] + public void MakeArrayType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + try { + byref.MakeArrayType (); + Assert.Fail ("#1"); + } catch (ArgumentException) {}; + try { + byref.MakeArrayType (2); + Assert.Fail ("#2"); + } catch (ArgumentException) {}; + } + + [Test] + public void MakeByRefType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + try { + byref.MakeByRefType (); + Assert.Fail ("#1"); + } catch (ArgumentException) {} + } + + [Test] + public void MakePointerType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + try { + byref.MakePointerType (); + Assert.Fail ("#1"); + } catch (ArgumentException) {} + } + + [Test] + public void StructLayoutAttribute () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type byref = tb.MakeByRefType (); + try { + object x = byref.StructLayoutAttribute; + Assert.Fail ("#1"); + } catch (NotSupportedException) {} + } + } + + [TestFixture] + public class ArrayTypeTest + { + AssemblyBuilder assembly; + ModuleBuilder module; + int typeCount; + static string ASSEMBLY_NAME = "MonoTests.System.Reflection.Emit.TypeBuilderTest"; + + string MakeName () + { + return "internal__type"+ typeCount++; + } + + [SetUp] + protected void SetUp () + { + AssemblyName assemblyName = new AssemblyName (); + assemblyName.Name = ASSEMBLY_NAME; + + assembly = + Thread.GetDomain ().DefineDynamicAssembly ( + assemblyName, AssemblyBuilderAccess.RunAndSave, Path.GetTempPath ()); + + module = assembly.DefineDynamicModule ("module1"); + typeCount = 0; + } + + [Test] + public void PropertiesValue () + { + TypeBuilder tb = module.DefineType ("ns.type", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + + Assert.AreEqual (assembly, arr.Assembly, "#1"); + Assert.AreEqual ("ns.type[], " + assembly.FullName, arr.AssemblyQualifiedName, "#2"); + Assert.AreEqual (typeof (Array), arr.BaseType, "#3"); + Assert.AreEqual ("ns.type[]", arr.FullName, "#4"); + Assert.AreEqual (module, arr.Module, "#5"); + Assert.AreEqual ("ns", arr.Namespace, "#6"); + Assert.AreEqual (arr, arr.UnderlyingSystemType, "#7"); + Assert.AreEqual ("type[]", arr.Name, "#8"); + + try { + object x = arr.GUID; + Assert.Fail ("#9"); + } catch (NotSupportedException) {} + + try { + object x = arr.TypeHandle; + Assert.Fail ("#10"); + } catch (NotSupportedException) {} + } + + [Test] + public void Methods () + { + TypeBuilder tb = module.DefineType ("ns.type", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + + try { + arr.GetInterface ("foo", true); + Assert.Fail ("#1"); + } catch (NotSupportedException) { + + } + + try { + arr.GetInterfaces (); + Assert.Fail ("#2"); + } catch (NotSupportedException) { + + } + + Assert.AreEqual (tb, arr.GetElementType ()); + + try { + arr.GetEvent ("foo", BindingFlags.Public); + Assert.Fail ("#4"); + } catch (NotSupportedException) { + + } + + try { + arr.GetEvents (BindingFlags.Public); + Assert.Fail ("#5"); + } catch (NotSupportedException) { + + } + + try { + arr.GetField ("foo", BindingFlags.Public); + Assert.Fail ("#6"); + } catch (NotSupportedException) { + + } + + try { + arr.GetFields (BindingFlags.Public); + Assert.Fail ("#7"); + } catch (NotSupportedException) { + + } + + try { + arr.GetMembers (BindingFlags.Public); + Assert.Fail ("#8"); + } catch (NotSupportedException) { + + } + + try { + arr.GetMethod ("Sort"); + Assert.Fail ("#9"); + } catch (NotSupportedException) { + + } + + try { + arr.GetMethods (BindingFlags.Public); + Assert.Fail ("#9"); + } catch (NotSupportedException) { + + } + + try { + arr.GetNestedType ("bla", BindingFlags.Public); + Assert.Fail ("#10"); + } catch (NotSupportedException) { + + } + + try { + arr.GetNestedTypes (BindingFlags.Public); + Assert.Fail ("#11"); + } catch (NotSupportedException) { + + } + + try { + arr.GetProperties (BindingFlags.Public); + Assert.Fail ("#12"); + } catch (NotSupportedException) { + + } + + try { + arr.GetProperty ("Length"); + Assert.Fail ("#13"); + } catch (NotSupportedException) { + + } + + try { + arr.GetConstructor (new Type[] { typeof (int) }); + Assert.Fail ("#14"); + } catch (NotSupportedException) { + + } + + TypeAttributes attr = TypeAttributes.AutoLayout | TypeAttributes.AnsiClass | TypeAttributes.Class | TypeAttributes.Public; + Assert.AreEqual (attr, arr.Attributes, "#15"); + + Assert.IsTrue (arr.HasElementType, "#16"); + Assert.IsTrue (arr.IsArray, "#17"); + Assert.IsFalse (arr.IsByRef, "#18"); + Assert.IsFalse (arr.IsCOMObject, "#19"); + Assert.IsFalse (arr.IsPointer, "#20"); + Assert.IsFalse (arr.IsPrimitive, "#21"); + + try { + arr.GetConstructors (BindingFlags.Public); + Assert.Fail ("#22"); + } catch (NotSupportedException) { + + } + + try { + arr.InvokeMember ("GetLength", BindingFlags.Public, null, null, null); + Assert.Fail ("#23"); + } catch (NotSupportedException) { + + } + } + + [Test] + public void AttributeValues () + { + TypeBuilder tb = module.DefineType (MakeName (), TypeAttributes.NotPublic); + Assert.AreEqual (TypeAttributes.NotPublic, tb.Attributes, "#1"); + + tb = module.DefineType (MakeName (), TypeAttributes.Public); + Assert.AreEqual (TypeAttributes.Public, tb.Attributes, "#2"); + + tb = module.DefineType (MakeName (), TypeAttributes.Public | TypeAttributes.Serializable | TypeAttributes.Sealed); + Assert.AreEqual (TypeAttributes.Public | TypeAttributes.Serializable | TypeAttributes.Sealed, tb.Attributes, "#3"); + + tb = module.DefineType (MakeName (), TypeAttributes.Public | TypeAttributes.Abstract); + Assert.AreEqual (TypeAttributes.Public | TypeAttributes.Abstract, tb.Attributes, "$4"); + } + + [Test] + public void AsReturnType () + { + + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + + MethodBuilder mb = tb.DefineMethod ("Test", MethodAttributes.Public, arr, new Type [0]); + ILGenerator ilgen = mb.GetILGenerator (); + ilgen.Emit (OpCodes.Ldnull); + ilgen.Emit (OpCodes.Ret); + + Type res = tb.CreateType (); + + object o = Activator.CreateInstance (res); + res.GetMethod ("Test").Invoke (o, null); + } + + [Test] + public void AsParamType () + { + + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + + MethodBuilder mb = tb.DefineMethod ("Test", MethodAttributes.Public, typeof (void), new Type [1] { arr }); + ILGenerator ilgen = mb.GetILGenerator (); + ilgen.Emit (OpCodes.Ret); + + Type res = tb.CreateType (); + + object o = Activator.CreateInstance (res); + res.GetMethod ("Test").Invoke (o, new object[1] { null }); + } + + [Test] + public void AsLocalVariable () + { + + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + + MethodBuilder mb = tb.DefineMethod ("Test", MethodAttributes.Public, arr, new Type [0]); + ILGenerator ilgen = mb.GetILGenerator (); + ilgen.DeclareLocal (arr); + ilgen.Emit (OpCodes.Ldnull); + ilgen.Emit (OpCodes.Stloc_0); + ilgen.Emit (OpCodes.Ldloc_0); + ilgen.Emit (OpCodes.Ret); + + Type res = tb.CreateType (); + + object o = Activator.CreateInstance (res); + res.GetMethod ("Test").Invoke (o, null); + } + + [Test] + public void TestEquals () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + Type arr2 = tb.MakeArrayType (); + Assert.IsFalse (arr.Equals (arr2), "#1"); + Assert.IsTrue (arr.Equals (arr), "#2"); + } + + [Test] + public void IsSubclassOf () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + Assert.IsFalse (arr.IsSubclassOf (tb), "#1"); + Assert.IsFalse (arr.IsSubclassOf (typeof (object[])), "#2"); + } + + [Test] + public void IsAssignableFrom () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + Assert.IsFalse (arr.IsAssignableFrom (tb), "#1"); + Assert.IsFalse (arr.IsAssignableFrom (typeof (object[])), "#2"); + Assert.IsFalse (typeof (object[]).IsAssignableFrom (arr), "#3"); + Assert.IsFalse (typeof (object).IsAssignableFrom (arr), "#4"); + } + + [Test] + public void GetInterfaceMap () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + try { + arr.GetInterfaceMap (typeof (IEnumerable)); + Assert.Fail ("#1"); + } catch (NotSupportedException) { + + } + } + + [Test] + public void IsInstanceOfType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + Assert.IsFalse (arr.IsInstanceOfType (tb), "#1"); + Assert.IsFalse (arr.IsInstanceOfType (null), "#2"); + Assert.IsFalse (arr.IsInstanceOfType (new object [1]), "#3"); + + Type t = tb.CreateType (); + object obj = Array.CreateInstance (t, 10); + Assert.IsFalse (arr.IsInstanceOfType (obj), "#4"); + } + + [Test] + public void IsGenericTypeDefinition () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + Assert.IsFalse (arr.IsGenericTypeDefinition, "#1"); + } + + [Test] + public void IsGenericType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + Assert.IsFalse (arr.IsGenericType, "#1"); + } + + [Test] + public void MakeGenericType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + try { + arr.MakeGenericType (new Type[] { typeof (string) }); + Assert.Fail ("#1"); + } catch (NotSupportedException) {} + } + + [Test] + public void GenericParameterPosition () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + try { + int pos = arr.GenericParameterPosition; + Assert.Fail ("#1"); + } catch (InvalidOperationException) {} + } + + [Test] + public void GenericParameterAttributes () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + try { + object attr = arr.GenericParameterAttributes; + Assert.Fail ("#1"); + } catch (NotSupportedException) {} + } + + [Test] + public void GetGenericParameterConstraints () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + try { + arr.GetGenericParameterConstraints (); + Assert.Fail ("#1"); + } catch (InvalidOperationException) {} + } + + [Test] + public void MakeArrayType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + Type res = arr.MakeArrayType (); + Assert.IsNotNull (res, "#1"); + Assert.IsTrue (res.IsArray, "#2"); + + res = arr.MakeArrayType (2); + Assert.IsNotNull (res, "#3"); + Assert.IsTrue (res.IsArray, "#4"); + } + + [Test] + public void MakeByRefType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + Type res = arr.MakeByRefType (); + + Assert.IsNotNull (res, "#1"); + Assert.IsTrue (res.IsByRef, "#2"); + } + + [Test] + public void MakePointerType () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + Type res = arr.MakePointerType (); + + Assert.IsNotNull (res, "#1"); + Assert.IsTrue (res.IsPointer, "#2"); + } + + [Test] + public void StructLayoutAttribute () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + try { + object x = arr.StructLayoutAttribute; + Assert.Fail ("#1"); + } catch (NotSupportedException) {} + } + + [Test] + public void GetArrayRank () + { + TypeBuilder tb = module.DefineType ("dd.test", TypeAttributes.Public); + Type arr = tb.MakeArrayType (); + + Assert.AreEqual (1, tb.MakeArrayType ().GetArrayRank (), "#1"); + Assert.AreEqual (2, tb.MakeArrayType (2).GetArrayRank (), "#2"); + } + } +#endif +} diff --git a/mcs/class/corlib/Test/System.Reflection.Emit/EventBuilderTest.cs b/mcs/class/corlib/Test/System.Reflection.Emit/EventBuilderTest.cs index f00e0add339..07664622f40 100644 --- a/mcs/class/corlib/Test/System.Reflection.Emit/EventBuilderTest.cs +++ b/mcs/class/corlib/Test/System.Reflection.Emit/EventBuilderTest.cs @@ -17,7 +17,7 @@ namespace MonoTests.System.Reflection.Emit { [TestFixture] -public class EventBuilderTest : Assertion +public class EventBuilderTest { public delegate void AnEvent (object o); @@ -170,36 +170,36 @@ public class EventBuilderTest : Assertion MethodInfo mi = t.GetMethod ("OnAnEvent"); EventInfo[] events = t.GetEvents (); - AssertEquals (2, events.Length); + Assert.AreEqual (2, events.Length); { EventInfo ev = t.GetEvent ("event1"); - AssertEquals ("event1", ev.Name); - AssertEquals (EventAttributes.None, ev.Attributes); - AssertEquals (t, ev.DeclaringType); + Assert.AreEqual ("event1", ev.Name); + Assert.AreEqual (EventAttributes.None, ev.Attributes); + Assert.AreEqual (t, ev.DeclaringType); - AssertEquals (typeof (AnEvent), ev.EventHandlerType); - AssertEquals (true, ev.IsMulticast); - AssertEquals (false, ev.IsSpecialName); + Assert.AreEqual (typeof (AnEvent), ev.EventHandlerType); + Assert.AreEqual (true, ev.IsMulticast); + Assert.AreEqual (false, ev.IsSpecialName); - AssertEquals (mi, ev.GetAddMethod ()); - AssertEquals (null, ev.GetRaiseMethod ()); - AssertEquals (mi, ev.GetRemoveMethod ()); + Assert.AreEqual (mi, ev.GetAddMethod ()); + Assert.AreEqual (null, ev.GetRaiseMethod ()); + Assert.AreEqual (mi, ev.GetRemoveMethod ()); } { EventInfo ev = t.GetEvent ("event2"); - AssertEquals ("event2", ev.Name); - AssertEquals (EventAttributes.SpecialName, ev.Attributes); - AssertEquals (t, ev.DeclaringType); + Assert.AreEqual ("event2", ev.Name); + Assert.AreEqual (EventAttributes.SpecialName, ev.Attributes); + Assert.AreEqual (t, ev.DeclaringType); - AssertEquals (typeof (AnEvent), ev.EventHandlerType); - AssertEquals (true, ev.IsMulticast); - AssertEquals (true, ev.IsSpecialName); + Assert.AreEqual (typeof (AnEvent), ev.EventHandlerType); + Assert.AreEqual (true, ev.IsMulticast); + Assert.AreEqual (true, ev.IsSpecialName); - AssertEquals (mi, ev.GetAddMethod ()); - AssertEquals (mi, ev.GetRaiseMethod ()); - AssertEquals (mi, ev.GetRemoveMethod ()); + Assert.AreEqual (mi, ev.GetAddMethod ()); + Assert.AreEqual (mi, ev.GetRaiseMethod ()); + Assert.AreEqual (mi, ev.GetRemoveMethod ()); } } diff --git a/mcs/class/corlib/Test/System.Reflection.Emit/PropertyBuilderTest.cs b/mcs/class/corlib/Test/System.Reflection.Emit/PropertyBuilderTest.cs index 9a8fa7cfff1..9fcc3b04a3e 100644 --- a/mcs/class/corlib/Test/System.Reflection.Emit/PropertyBuilderTest.cs +++ b/mcs/class/corlib/Test/System.Reflection.Emit/PropertyBuilderTest.cs @@ -17,7 +17,7 @@ namespace MonoTests.System.Reflection.Emit { [TestFixture] -public class PropertyBuilderTest : Assertion +public class PropertyBuilderTest { private TypeBuilder tb; @@ -81,24 +81,24 @@ public class PropertyBuilderTest : Assertion Type t = tb.CreateType (); PropertyInfo[] props = t.GetProperties (BindingFlags.Public|BindingFlags.Instance); - AssertEquals (1, props.Length); + Assert.AreEqual (1, props.Length); PropertyInfo p = t.GetProperty ("prop"); - AssertEquals (PropertyAttributes.HasDefault, p.Attributes); - AssertEquals (true, p.CanRead); - AssertEquals (true, p.CanWrite); - AssertEquals ("prop", p.Name); - AssertEquals (MemberTypes.Property, p.MemberType); - AssertEquals (typeof (int), p.PropertyType); + Assert.AreEqual (PropertyAttributes.HasDefault, p.Attributes); + Assert.AreEqual (true, p.CanRead); + Assert.AreEqual (true, p.CanWrite); + Assert.AreEqual ("prop", p.Name); + Assert.AreEqual (MemberTypes.Property, p.MemberType); + Assert.AreEqual (typeof (int), p.PropertyType); MethodInfo[] methods = p.GetAccessors (); - AssertEquals (2, methods.Length); - AssertNotNull (p.GetGetMethod ()); - AssertNotNull (p.GetSetMethod ()); + Assert.AreEqual (2, methods.Length); + Assert.IsNotNull (p.GetGetMethod ()); + Assert.IsNotNull (p.GetSetMethod ()); object o = Activator.CreateInstance (t); p.SetValue (o, 42, null); - AssertEquals (42, p.GetValue (o, null)); + Assert.AreEqual (42, p.GetValue (o, null)); } } } diff --git a/mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs b/mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs index 30909827720..10e6dbc9629 100644 --- a/mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs +++ b/mcs/class/corlib/Test/System.Reflection.Emit/TypeBuilderTest.cs @@ -913,8 +913,7 @@ namespace MonoTests.System.Reflection.Emit /* Is .E a valid name ? TypeBuilder tb4 = module.DefineType (".E"); - AssertEquals ("", - "E", tb4.Name); + Assert.AreEqual ("E", tb4.Name); */ } @@ -932,8 +931,7 @@ namespace MonoTests.System.Reflection.Emit /* Is .E a valid name ? TypeBuilder tb4 = module.DefineType (".E"); - AssertEquals ("", - "E", tb4.Name); + Assert.AreEqual ("E", tb4.Name); */ } diff --git a/mcs/class/corlib/Test/System.Reflection/AssemblyAlgorithmIdAttributeTest.cs b/mcs/class/corlib/Test/System.Reflection/AssemblyAlgorithmIdAttributeTest.cs index d10c4dcbc3d..78666c12581 100644 --- a/mcs/class/corlib/Test/System.Reflection/AssemblyAlgorithmIdAttributeTest.cs +++ b/mcs/class/corlib/Test/System.Reflection/AssemblyAlgorithmIdAttributeTest.cs @@ -17,7 +17,7 @@ namespace MonoTests.System.Reflection { /// Test Fixture for AssemblyAlgorithmIdAttribute class /// [TestFixture] - public class AssemblyAlgorithmIdAttributeTest : Assertion + public class AssemblyAlgorithmIdAttributeTest { private AssemblyBuilder dynAssembly; AssemblyName dynAsmName = new AssemblyName (); @@ -52,17 +52,17 @@ namespace MonoTests.System.Reflection { [Test] public void AlgorithmIdTest() { - AssertEquals ("#Testing AlgorithmId", + Assert.AreEqual ( attr.AlgorithmId, - (uint) AssemblyHashAlgorithm.MD5); + (uint) AssemblyHashAlgorithm.MD5, "#1"); } [Test] public void TypeIdTest () { - AssertEquals ("#testing Typeid", + Assert.AreEqual ( attr.TypeId, - typeof (AssemblyAlgorithmIdAttribute) + typeof (AssemblyAlgorithmIdAttribute), "#1" ); } @@ -70,16 +70,16 @@ namespace MonoTests.System.Reflection { [Test] public void MatchTestForTrue () { - AssertEquals ("#testing Match method-- for true", + Assert.AreEqual ( attr.Match (attr), - true); + true, "#1"); } [Test] public void MatchTestForFalse () { - AssertEquals ("#testing Match method-- for false", + Assert.AreEqual ( attr.Match (new AssemblyAlgorithmIdAttribute (AssemblyHashAlgorithm.SHA1)), - false); + false, "#1"); } } } diff --git a/mcs/class/corlib/Test/System.Reflection/AssemblyConfigurationAttributeTest.cs b/mcs/class/corlib/Test/System.Reflection/AssemblyConfigurationAttributeTest.cs index 3a554856474..1baf06ff3d1 100644 --- a/mcs/class/corlib/Test/System.Reflection/AssemblyConfigurationAttributeTest.cs +++ b/mcs/class/corlib/Test/System.Reflection/AssemblyConfigurationAttributeTest.cs @@ -17,7 +17,7 @@ namespace MonoTests.System.Reflection { /// Test Fixture for AssemblyConfigurationAttribute class /// [TestFixture] - public class AssemblyConfigurationAttributeTest : Assertion + public class AssemblyConfigurationAttributeTest { private AssemblyBuilder dynAssembly; AssemblyName dynAsmName = new AssemblyName (); @@ -49,34 +49,34 @@ namespace MonoTests.System.Reflection { [Test] public void ConfigurationTest () { - AssertEquals ("#Testing Configuration", + Assert.AreEqual ( attr.Configuration, - "Config"); + "Config", "#1"); } [Test] public void TypeIdTest () { - AssertEquals ("#testing Typeid", + Assert.AreEqual ( attr.TypeId, typeof (AssemblyConfigurationAttribute) - ); + , "#1"); } [Test] public void MatchTestForTrue () { - AssertEquals ("#testing Match method-- for true", + Assert.AreEqual ( attr.Match (attr), - true); + true, "#1"); } [Test] public void MatchTestForFalse () { - AssertEquals ("#testing Match method-- for false", + Assert.AreEqual ( attr.Match (new AssemblyConfigurationAttribute ("abcd")), - false); + false, "#1"); } } } diff --git a/mcs/class/corlib/Test/System.Reflection/AssemblyCopyrightAttributeTest.cs b/mcs/class/corlib/Test/System.Reflection/AssemblyCopyrightAttributeTest.cs index 2c080c50c2d..942cc2546ee 100644 --- a/mcs/class/corlib/Test/System.Reflection/AssemblyCopyrightAttributeTest.cs +++ b/mcs/class/corlib/Test/System.Reflection/AssemblyCopyrightAttributeTest.cs @@ -17,7 +17,7 @@ namespace MonoTests.System.Reflection { /// Test Fixture for AssemblyCopyrightAttribute /// [TestFixture] - public class AssemblyCopyrightAttributeTest : Assertion + public class AssemblyCopyrightAttributeTest { private AssemblyBuilder dynAssembly; AssemblyName dynAsmName = new AssemblyName (); @@ -49,34 +49,34 @@ namespace MonoTests.System.Reflection { [Test] public void CopyrightTest () { - AssertEquals ("#Testing Copyright", + Assert.AreEqual ( attr.Copyright, - "Ximian"); + "Ximian", "#1"); } [Test] public void TypeIdTest () { - AssertEquals ("#testing Typeid", + Assert.AreEqual ( attr.TypeId, typeof (AssemblyCopyrightAttribute) - ); + , "#1"); } [Test] public void MatchTestForTrue () { - AssertEquals ("#testing Match method-- for true", + Assert.AreEqual ( attr.Match (attr), - true); + true, "#1"); } [Test] public void MatchTestForFalse () { - AssertEquals ("#testing Match method-- for false", + Assert.AreEqual ( attr.Match (new AssemblyCopyrightAttribute ("imian")), - false); + false, "#1"); } } } diff --git a/mcs/class/corlib/Test/System.Reflection/AssemblyCultureAttributeTest.cs b/mcs/class/corlib/Test/System.Reflection/AssemblyCultureAttributeTest.cs index 0700b05587d..0a9c76fdec9 100644 --- a/mcs/class/corlib/Test/System.Reflection/AssemblyCultureAttributeTest.cs +++ b/mcs/class/corlib/Test/System.Reflection/AssemblyCultureAttributeTest.cs @@ -17,7 +17,7 @@ namespace MonoTests.System.Reflection { /// Test Fixture for AssemblyCultureAttribute /// [TestFixture] - public class AssemblyCultureAttributeTest : Assertion + public class AssemblyCultureAttributeTest { private AssemblyBuilder dynAssembly; AssemblyName dynAsmName = new AssemblyName (); @@ -49,34 +49,34 @@ namespace MonoTests.System.Reflection { [Test] public void CultureTest () { - AssertEquals ("#Testing Culture", + Assert.AreEqual ( attr.Culture, - "India"); + "India", "#1"); } [Test] public void TypeIdTest () { - AssertEquals ("#testing Typeid", + Assert.AreEqual ( attr.TypeId, - typeof (AssemblyCultureAttribute) + typeof (AssemblyCultureAttribute), "#1" ); } [Test] public void MatchTestForTrue () { - AssertEquals ("#testing Match method-- for true", + Assert.AreEqual ( attr.Match (attr), - true); + true, "#1"); } [Test] public void MatchTestForFalse () { - AssertEquals ("#testing Match method-- for false", + Assert.AreEqual ( attr.Match (new AssemblyCultureAttribute ("Spanish")), - false); + false, "#1"); } } } diff --git a/mcs/class/corlib/Test/System.Reflection/AssemblyDelaySignAttributeTest.cs b/mcs/class/corlib/Test/System.Reflection/AssemblyDelaySignAttributeTest.cs index 1ef5efb0838..65df10da253 100644 --- a/mcs/class/corlib/Test/System.Reflection/AssemblyDelaySignAttributeTest.cs +++ b/mcs/class/corlib/Test/System.Reflection/AssemblyDelaySignAttributeTest.cs @@ -16,7 +16,7 @@ namespace MonoTests.System.Reflection { /// Summary description for AssemblyDelaySignAttributeTest. /// [TestFixture] - public class AssemblyDelaySignAttributeTest:Assertion + public class AssemblyDelaySignAttributeTest { private AssemblyBuilder dynAssembly; AssemblyName dynAsmName = new AssemblyName (); @@ -48,33 +48,33 @@ namespace MonoTests.System.Reflection { [Test] public void DelaySignTest () { - AssertEquals ("#Testing DelaySign", + Assert.AreEqual ( attr.DelaySign, - false); + false, "#1"); } [Test] public void TypeIdTest () { - AssertEquals ("#testing Typeid", + Assert.AreEqual ( attr.TypeId, typeof (AssemblyDelaySignAttribute) - ); + , "#1"); } [Test] public void MatchTestForTrue () { - AssertEquals ("#testing Match method-- for true", + Assert.AreEqual ( attr.Match (attr), - true); + true, "#1"); } [Test] public void MatchTestForFalse () { - AssertEquals ("#testing Match method-- for false", + Assert.AreEqual ( attr.Match (new AssemblyDelaySignAttribute (true)), - false); + false, "#1"); } } } diff --git a/mcs/class/corlib/Test/System.Reflection/AssemblyDescriptionAttributeTest.cs b/mcs/class/corlib/Test/System.Reflection/AssemblyDescriptionAttributeTest.cs index d92dd6c3c8a..bf4f858fcf5 100644 --- a/mcs/class/corlib/Test/System.Reflection/AssemblyDescriptionAttributeTest.cs +++ b/mcs/class/corlib/Test/System.Reflection/AssemblyDescriptionAttributeTest.cs @@ -16,7 +16,7 @@ namespace MonoTests.System.Reflection { /// Summary description for AssemblyDescriptionAttributeTest. /// [TestFixture] - public class AssemblyDescriptionAttributeTest : Assertion + public class AssemblyDescriptionAttributeTest { private AssemblyBuilder dynAssembly; AssemblyName dynAsmName = new AssemblyName (); @@ -48,34 +48,34 @@ namespace MonoTests.System.Reflection { [Test] public void DescriptionTest () { - AssertEquals ("#Testing Description", + Assert.AreEqual ( attr.Description, - "Emitted Assembly"); + "Emitted Assembly", "#1"); } [Test] public void TypeIdTest () { - AssertEquals ("#testing Typeid", + Assert.AreEqual ( attr.TypeId, - typeof (AssemblyDescriptionAttribute) + typeof (AssemblyDescriptionAttribute), "#1" ); } [Test] public void MatchTestForTrue () { - AssertEquals ("#testing Match method-- for true", + Assert.AreEqual ( attr.Match (attr), - true); + true, "#1"); } [Test] public void MatchTestForFalse () { - AssertEquals ("#testing Match method-- for false", + Assert.AreEqual ( attr.Match (new AssemblyDescriptionAttribute ("Descrptn")), - false); + false, "#1"); } } } diff --git a/mcs/class/corlib/Test/System.Reflection/AssemblyFileVersionAttributeTest.cs b/mcs/class/corlib/Test/System.Reflection/AssemblyFileVersionAttributeTest.cs index 3170bf2d429..242abaed064 100644 --- a/mcs/class/corlib/Test/System.Reflection/AssemblyFileVersionAttributeTest.cs +++ b/mcs/class/corlib/Test/System.Reflection/AssemblyFileVersionAttributeTest.cs @@ -16,7 +16,7 @@ namespace MonoTests.System.Reflection { /// Summary description for AssemblyFileVersionAttributeTest. /// [TestFixture] - public class AssemblyFileVersionAttributeTest : Assertion { + public class AssemblyFileVersionAttributeTest { private AssemblyBuilder dynAssembly; AssemblyName dynAsmName = new AssemblyName (); @@ -56,34 +56,33 @@ namespace MonoTests.System.Reflection { [Test] public void FileVersionTest () { - AssertEquals ("#Testing FileVersion", - attr.Version, - "1.0.0.0"); + Assert.AreEqual (attr.Version, + "1.0.0.0", "#1"); } [Test] public void TypeIdTest () { - AssertEquals ("#testing Typeid", + Assert.AreEqual ( attr.TypeId, - typeof (AssemblyFileVersionAttribute) + typeof (AssemblyFileVersionAttribute), "#1" ); } [Test] public void MatchTestForTrue () { - AssertEquals ("#testing Match method-- for true", + Assert.AreEqual ( attr.Match (attr), - true); + true, "#1"); } [Test] public void MatchTestForFalse () { - AssertEquals ("#testing Match method-- for false", + Assert.AreEqual ( attr.Match (new AssemblyFileVersionAttribute ("Descrptn")), - false); + false, "#1"); } } } diff --git a/mcs/class/corlib/Test/System.Reflection/AssemblyInformationalVersionAttributeTest.cs b/mcs/class/corlib/Test/System.Reflection/AssemblyInformationalVersionAttributeTest.cs index 7bdbb52e490..c5edf42cb0f 100644 --- a/mcs/class/corlib/Test/System.Reflection/AssemblyInformationalVersionAttributeTest.cs +++ b/mcs/class/corlib/Test/System.Reflection/AssemblyInformationalVersionAttributeTest.cs @@ -16,7 +16,7 @@ namespace MonoTests.System.Reflection { /// Test Fixture for AssemblyInformationalVersionAttribute. /// [TestFixture] - public class AssemblyInformationalVersionAttributeTest : Assertion { + public class AssemblyInformationalVersionAttributeTest { private AssemblyBuilder dynAssembly; AssemblyName dynAsmName = new AssemblyName (); @@ -48,17 +48,16 @@ namespace MonoTests.System.Reflection { [Test] public void InformationalVersionTest () { - AssertEquals ("#Testing InformationalVersion", - attr.InformationalVersion, - "2.0.0.0"); + Assert.AreEqual (attr.InformationalVersion, + "2.0.0.0", "#1"); } [Test] public void TypeIdTest () { - AssertEquals ("#testing Typeid", + Assert.AreEqual ( attr.TypeId, - typeof (AssemblyInformationalVersionAttribute) + typeof (AssemblyInformationalVersionAttribute), "#1" ); } @@ -66,17 +65,17 @@ namespace MonoTests.System.Reflection { [Test] public void MatchTestForTrue () { - AssertEquals ("#testing Match method-- for true", + Assert.AreEqual ( attr.Match (attr), - true); + true, "#1"); } [Test] public void MatchTestForFalse () { - AssertEquals ("#testing Match method-- for false", + Assert.AreEqual ( attr.Match (new AssemblyInformationalVersionAttribute ("Descrptn")), - false); + false, "#1"); } } } diff --git a/mcs/class/corlib/Test/System.Reflection/AssemblyTest.cs b/mcs/class/corlib/Test/System.Reflection/AssemblyTest.cs index 63c6a42b953..4da68e627b4 100644 --- a/mcs/class/corlib/Test/System.Reflection/AssemblyTest.cs +++ b/mcs/class/corlib/Test/System.Reflection/AssemblyTest.cs @@ -425,7 +425,7 @@ namespace MonoTests.System.Reflection foreach (string s in names) if (Assembly.LoadWithPartialName (s) != null) return; - Assertion.Fail ("Was not able to load any corlib test"); + Assert.Fail ("Was not able to load any corlib test"); } #if !TARGET_JVM // GetObjectData currently not implemented for Assembly. diff --git a/mcs/class/corlib/Test/System.Reflection/BinderTests.cs b/mcs/class/corlib/Test/System.Reflection/BinderTests.cs index 7ee15b69bda..e7496f7fd70 100644 --- a/mcs/class/corlib/Test/System.Reflection/BinderTests.cs +++ b/mcs/class/corlib/Test/System.Reflection/BinderTests.cs @@ -204,6 +204,47 @@ namespace MonoTests.System.Reflection Assert.IsNotNull (prop, "short"); } + [Test] + public void SelectMethod_ByRef () + { + Type type = typeof (ByRefMatch); + BindingFlags flags = BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance; + MethodBase [] match; + Type [] types; + MethodBase selected; + + MethodInfo mi_run = type.GetMethod ("Run", flags, binder, + new Type [] { typeof (int) }, null); + Assert.IsFalse (mi_run.GetParameters () [0].ParameterType.IsByRef, "#A1"); + MethodInfo mi_run_ref = type.GetMethod ("Run", flags, binder, + new Type [] { typeof (int).MakeByRefType () }, null); + Assert.IsTrue (mi_run_ref.GetParameters () [0].ParameterType.IsByRef, "#A2"); + + match = new MethodBase [] { mi_run_ref }; + types = new Type [] { typeof (int) }; + selected = binder.SelectMethod (flags, match, types, null); + Assert.IsNull (selected, "#B1"); + types = new Type [] { typeof (int).MakeByRefType () }; + selected = binder.SelectMethod (flags, match, types, null); + Assert.AreSame (mi_run_ref, selected, "#B2"); + + match = new MethodBase [] { mi_run }; + types = new Type [] { typeof (int) }; + selected = binder.SelectMethod (flags, match, types, null); + Assert.AreSame (mi_run, selected, "#C1"); + types = new Type [] { typeof (int).MakeByRefType () }; + selected = binder.SelectMethod (flags, match, types, null); + Assert.IsNull (selected, "#C1"); + + match = new MethodBase [] { mi_run, mi_run_ref }; + types = new Type [] { typeof (int) }; + selected = binder.SelectMethod (flags, match, types, null); + Assert.AreSame (mi_run, selected, "#D1"); + types = new Type [] { typeof (int).MakeByRefType () }; + selected = binder.SelectMethod (flags, match, types, null); + Assert.AreSame (mi_run_ref, selected, "#D2"); + } + [Test] public void ArgNullOnMethod () // see bug 58846. We throwed nullref here. { @@ -224,6 +265,45 @@ namespace MonoTests.System.Reflection Assert.IsNotNull (prop); } + [Test] + public void BindToMethod_ByRef () + { + Type type = typeof (ByRefMatch); + BindingFlags flags = BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance; + MethodBase [] match; + object [] args = new object [] { 5 }; + object state; + MethodBase selected; + CultureInfo culture = CultureInfo.InvariantCulture; + + MethodInfo mi_run = type.GetMethod ("Run", flags, binder, + new Type [] { typeof (int) }, null); + Assert.IsFalse (mi_run.GetParameters () [0].ParameterType.IsByRef, "#A1"); + MethodInfo mi_run_ref = type.GetMethod ("Run", flags, binder, + new Type [] { typeof (int).MakeByRefType () }, null); + Assert.IsTrue (mi_run_ref.GetParameters () [0].ParameterType.IsByRef, "#A2"); + + match = new MethodBase [] { mi_run }; + selected = binder.BindToMethod (flags, match, ref args, null, culture, + null, out state); + Assert.AreSame (mi_run, selected, "#1"); + + match = new MethodBase [] { mi_run_ref }; + selected = binder.BindToMethod (flags, match, ref args, null, culture, + null, out state); + Assert.AreSame (mi_run_ref, selected, "#2"); + + match = new MethodBase [] { mi_run, mi_run_ref }; + selected = binder.BindToMethod (flags, match, ref args, null, culture, + null, out state); + Assert.AreSame (mi_run, selected, "#3"); + + match = new MethodBase [] { mi_run_ref, mi_run }; + selected = binder.BindToMethod (flags, match, ref args, null, culture, + null, out state); + Assert.AreSame (mi_run, selected, "#4"); + } + [Test] // bug #41691 public void BindToMethodNamedArgs () { @@ -559,6 +639,17 @@ namespace MonoTests.System.Reflection } } + class ByRefMatch { + public void Run (int i) + { + } + + public void Run (out int i) + { + i = 0; + } + } + [Test] // bug #471257 public void TestCustomBinderNonNullArgs () { @@ -643,6 +734,5 @@ namespace MonoTests.System.Reflection MethodInfo method = typeof (Foo).GetMethod ("Add"); method.Invoke((new Foo ()), 0, new Int32Binder (), new object [] {1, "2"}, null); } - } } diff --git a/mcs/class/corlib/Test/System.Reflection/ChangeLog b/mcs/class/corlib/Test/System.Reflection/ChangeLog index e0a2e3ffb86..d133b46c3c5 100644 --- a/mcs/class/corlib/Test/System.Reflection/ChangeLog +++ b/mcs/class/corlib/Test/System.Reflection/ChangeLog @@ -1,3 +1,12 @@ +2009-07-12 Gert Driesen + + * BinderTest.cs: Added SelectMethod/BindToMethod tests for methods + with byref arguments. + +2009-06-20 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2009-06-12 Zoltan Varga * ParameterInfoTest.cs: Add a test for #512330. diff --git a/mcs/class/corlib/Test/System.Reflection/StrongNameKeyPairTest.cs b/mcs/class/corlib/Test/System.Reflection/StrongNameKeyPairTest.cs index de15dc6fd52..eb071fffa17 100644 --- a/mcs/class/corlib/Test/System.Reflection/StrongNameKeyPairTest.cs +++ b/mcs/class/corlib/Test/System.Reflection/StrongNameKeyPairTest.cs @@ -16,7 +16,7 @@ using System.Reflection; namespace MonoTests.System.Reflection { [TestFixture] -public class StrongNameKeyPairTest : Assertion { +public class StrongNameKeyPairTest { // created with "sn -o test.snk test.txt" static byte[] test = { 0x07, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x52, 0x53, 0x41, 0x32, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0xBD, 0x72, 0x08, 0xC6, 0x2B, 0x0E, 0xA8, 0xC1, 0xC0, 0x58, 0x07, 0x2B, 0x63, 0x5F, 0x7C, 0x9A, 0xBD, 0xCB, 0x22, 0xDB, 0x20, 0xB2, 0xA9, 0xDA, 0xDA, 0xEF, 0xE8, 0x00, 0x64, 0x2F, 0x5D, 0x8D, 0xEB, 0x78, 0x02, 0xF7, 0xA5, 0x36, 0x77, 0x28, 0xD7, 0x55, 0x8D, 0x14, 0x68, 0xDB, 0xEB, 0x24, 0x09, 0xD0, 0x2B, 0x13, 0x1B, 0x92, 0x6E, 0x2E, 0x59, 0x54, 0x4A, 0xAC, 0x18, 0xCF, 0xC9, 0x09, 0x02, 0x3F, 0x4F, 0xA8, 0x3E, 0x94, 0x00, 0x1F, 0xC2, 0xF1, 0x1A, 0x27, 0x47, 0x7D, 0x10, 0x84, 0xF5, 0x14, 0xB8, 0x61, 0x62, 0x1A, 0x0C, 0x66, 0xAB, 0xD2, 0x4C, 0x4B, 0x9F, 0xC9, 0x0F, 0x3C, 0xD8, 0x92, 0x0F, 0xF5, 0xFF, 0xCE, 0xD7, 0x6E, 0x5C, 0x6F, 0xB1, 0xF5, 0x7D, 0xD3, 0x56, 0xF9, 0x67, 0x27, 0xA4, 0xA5, 0x48, 0x5B, 0x07, 0x93, 0x44, 0x00, 0x4A, 0xF8, 0xFF, 0xA4, 0xCB, 0x73, 0xC0, 0x6A, 0x62, 0xB4, 0xB7, 0xC8, 0x92, 0x58, 0x87, 0xCD, 0x07, @@ -65,7 +65,7 @@ public class StrongNameKeyPairTest : Assertion { public void ConstructorByteArray () { snpk = new StrongNameKeyPair (test); - AssertEquals ("PublicKey", BitConverter.ToString (pk), BitConverter.ToString (snpk.PublicKey)); + Assert.AreEqual (BitConverter.ToString (pk), BitConverter.ToString (snpk.PublicKey), "#1"); } [Test] @@ -74,7 +74,7 @@ public class StrongNameKeyPairTest : Assertion { { byte[] input = { 0x00, 0x01, 0x02, 0x03 }; snpk = new StrongNameKeyPair (input); - AssertEquals ("PublicKey", BitConverter.ToString (pk), BitConverter.ToString (snpk.PublicKey)); + Assert.AreEqual (BitConverter.ToString (pk), BitConverter.ToString (snpk.PublicKey), "#1"); } [Test] @@ -90,7 +90,7 @@ public class StrongNameKeyPairTest : Assertion { public void ConstructorECMAByteArray () { snpk = new StrongNameKeyPair (ecma); - AssertEquals ("PublicKey", BitConverter.ToString (ecma), BitConverter.ToString (snpk.PublicKey)); + Assert.AreEqual (BitConverter.ToString (ecma), BitConverter.ToString (snpk.PublicKey), "#1"); } [Test] @@ -102,7 +102,7 @@ public class StrongNameKeyPairTest : Assertion { snpk = new StrongNameKeyPair (fs); fs.Close (); - AssertEquals ("PublicKey", BitConverter.ToString (pk), BitConverter.ToString (snpk.PublicKey)); + Assert.AreEqual (BitConverter.ToString (pk), BitConverter.ToString (snpk.PublicKey), "#1"); } [Test] @@ -120,7 +120,7 @@ public class StrongNameKeyPairTest : Assertion { snpk = new StrongNameKeyPair (fs); fs.Close (); - AssertEquals ("PublicKey", BitConverter.ToString (pk), BitConverter.ToString (snpk.PublicKey)); + Assert.AreEqual (BitConverter.ToString (pk), BitConverter.ToString (snpk.PublicKey), "#1"); } [Test] diff --git a/mcs/class/corlib/Test/System.Reflection/TypeDelegatorTest.cs b/mcs/class/corlib/Test/System.Reflection/TypeDelegatorTest.cs index c5f5930a0af..59317339f64 100644 --- a/mcs/class/corlib/Test/System.Reflection/TypeDelegatorTest.cs +++ b/mcs/class/corlib/Test/System.Reflection/TypeDelegatorTest.cs @@ -37,41 +37,41 @@ using NUnit.Framework; namespace MonoTests.System.Reflection { [TestFixture] -public class TypeDelegatorTest : Assertion { +public class TypeDelegatorTest { [Test] public void IsAssignableFrom () { TypeDelegator td = new TypeDelegator (typeof (int)); - AssertEquals (true, typeof (int).IsAssignableFrom (td)); - AssertEquals (false, typeof (string).IsAssignableFrom (td)); - AssertEquals (true, td.IsAssignableFrom (typeof (int))); - AssertEquals (false, td.IsAssignableFrom (typeof (string))); + Assert.AreEqual (true, typeof (int).IsAssignableFrom (td)); + Assert.AreEqual (false, typeof (string).IsAssignableFrom (td)); + Assert.AreEqual (true, td.IsAssignableFrom (typeof (int))); + Assert.AreEqual (false, td.IsAssignableFrom (typeof (string))); } [Test] public void CreateInstance () { - AssertEquals (typeof (int[]), Array.CreateInstance (new TypeDelegator (typeof (int)), 100).GetType ()); + Assert.AreEqual (typeof (int[]), Array.CreateInstance (new TypeDelegator (typeof (int)), 100).GetType ()); } [Test] public void Properties () { - AssertEquals (false, new TypeDelegator (typeof (IComparable)).IsClass); - AssertEquals (false, new TypeDelegator (typeof (IComparable)).IsValueType); - AssertEquals (false, new TypeDelegator (typeof (IComparable)).IsEnum); - AssertEquals (true, new TypeDelegator (typeof (IComparable)).IsInterface); + Assert.AreEqual (false, new TypeDelegator (typeof (IComparable)).IsClass); + Assert.AreEqual (false, new TypeDelegator (typeof (IComparable)).IsValueType); + Assert.AreEqual (false, new TypeDelegator (typeof (IComparable)).IsEnum); + Assert.AreEqual (true, new TypeDelegator (typeof (IComparable)).IsInterface); - AssertEquals (true, new TypeDelegator (typeof (TypeDelegatorTest)).IsClass); - AssertEquals (false, new TypeDelegator (typeof (TypeDelegatorTest)).IsValueType); - AssertEquals (false, new TypeDelegator (typeof (TypeDelegatorTest)).IsInterface); + Assert.AreEqual (true, new TypeDelegator (typeof (TypeDelegatorTest)).IsClass); + Assert.AreEqual (false, new TypeDelegator (typeof (TypeDelegatorTest)).IsValueType); + Assert.AreEqual (false, new TypeDelegator (typeof (TypeDelegatorTest)).IsInterface); - AssertEquals (false, new TypeDelegator (typeof (TypeCode)).IsClass); - AssertEquals (false, new TypeDelegator (typeof (TypeCode)).IsInterface); - AssertEquals (true, new TypeDelegator (typeof (TypeCode)).IsValueType); - AssertEquals (true, new TypeDelegator (typeof (TypeCode)).IsEnum); + Assert.AreEqual (false, new TypeDelegator (typeof (TypeCode)).IsClass); + Assert.AreEqual (false, new TypeDelegator (typeof (TypeCode)).IsInterface); + Assert.AreEqual (true, new TypeDelegator (typeof (TypeCode)).IsValueType); + Assert.AreEqual (true, new TypeDelegator (typeof (TypeCode)).IsEnum); } } } diff --git a/mcs/class/corlib/Test/System.Runtime.CompilerServices/ChangeLog b/mcs/class/corlib/Test/System.Runtime.CompilerServices/ChangeLog index 02751f7a2bd..2fd257b7c34 100644 --- a/mcs/class/corlib/Test/System.Runtime.CompilerServices/ChangeLog +++ b/mcs/class/corlib/Test/System.Runtime.CompilerServices/ChangeLog @@ -1,3 +1,7 @@ +2009-06-20 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2009-06-10 Gert Driesen * InternalVisibleToAttributeTest.cs: Added test for .ctor and diff --git a/mcs/class/corlib/Test/System.Runtime.CompilerServices/RuntimeHelpersTest.cs b/mcs/class/corlib/Test/System.Runtime.CompilerServices/RuntimeHelpersTest.cs index 8197f2644cc..a05aee17e9c 100644 --- a/mcs/class/corlib/Test/System.Runtime.CompilerServices/RuntimeHelpersTest.cs +++ b/mcs/class/corlib/Test/System.Runtime.CompilerServices/RuntimeHelpersTest.cs @@ -13,7 +13,7 @@ using NUnit.Framework; namespace MonoTests.System.Runtime.CompilerServices { [TestFixture] - public class RuntimeHelpersTest : Assertion { + public class RuntimeHelpersTest { struct FooStruct { public int i; public string j; @@ -23,7 +23,7 @@ namespace MonoTests.System.Runtime.CompilerServices { } public override bool Equals (object o) { - Fail (); + Assert.Fail (); return false; } } @@ -40,16 +40,16 @@ namespace MonoTests.System.Runtime.CompilerServices { } public override bool Equals (object o) { - Fail (); + Assert.Fail (); return true; } } public void TestOffsetToStringData () { - AssertEquals ("OffsetToStringData is not constant", + Assert.AreEqual ( RuntimeHelpers.OffsetToStringData, - RuntimeHelpers.OffsetToStringData); + RuntimeHelpers.OffsetToStringData, "OffsetToStringData is not constant"); } public void TestGetObjectValue () @@ -58,13 +58,11 @@ namespace MonoTests.System.Runtime.CompilerServices { FooStruct s2; // Test null - AssertEquals ("", - RuntimeHelpers.GetObjectValue (null), + Assert.AreEqual (RuntimeHelpers.GetObjectValue (null), null); // Test non-valuetype - AssertEquals ("", - RuntimeHelpers.GetObjectValue (this), + Assert.AreEqual (RuntimeHelpers.GetObjectValue (this), this); // Test valuetype @@ -73,34 +71,34 @@ namespace MonoTests.System.Runtime.CompilerServices { s2 = (FooStruct)RuntimeHelpers.GetObjectValue(s1); s1.i = 43; s1.j = "BAR"; - AssertEquals ("", s2.i, 42); - AssertEquals ("", s2.j, "FOO"); + Assert.AreEqual (s2.i, 42); + Assert.AreEqual (s2.j, "FOO"); } public void TestRunClassConstructor () { RuntimeHelpers.RunClassConstructor (typeof(FooClass).TypeHandle); - AssertEquals ("", FooClass.counter, 1); + Assert.AreEqual (FooClass.counter, 1); // Each static constructor should only be run once RuntimeHelpers.RunClassConstructor (typeof(FooClass).TypeHandle); - AssertEquals ("", FooClass.counter, 1); + Assert.AreEqual (FooClass.counter, 1); } #if NET_1_1 public void TestGetHashCode () { - AssertEquals ("Null has hash code 0", 0, RuntimeHelpers.GetHashCode (null)); + Assert.AreEqual (0, RuntimeHelpers.GetHashCode (null)); object o = new object (); - AssertEquals ("", o.GetHashCode (), RuntimeHelpers.GetHashCode (o)); - Assert ("", 5 != RuntimeHelpers.GetHashCode (new FooClass ())); + Assert.AreEqual (o.GetHashCode (), RuntimeHelpers.GetHashCode (o)); + Assert.IsTrue (5 != RuntimeHelpers.GetHashCode (new FooClass ())); } public void TestEquals () { - Assert (RuntimeHelpers.Equals (null, null)); - Assert (!RuntimeHelpers.Equals (new object (), null)); - Assert (!RuntimeHelpers.Equals (null, new object ())); + Assert.IsTrue (RuntimeHelpers.Equals (null, null)); + Assert.IsTrue (!RuntimeHelpers.Equals (new object (), null)); + Assert.IsTrue (!RuntimeHelpers.Equals (null, new object ())); FooStruct f1 = new FooStruct (); f1.i = 5; @@ -110,11 +108,11 @@ namespace MonoTests.System.Runtime.CompilerServices { object o2 = o1; object o3 = f2; object o4 = "AAA"; - Assert (RuntimeHelpers.Equals (o1, o2)); + Assert.IsTrue (RuntimeHelpers.Equals (o1, o2)); // This should do a bit-by-bit comparison for valuetypes - Assert (RuntimeHelpers.Equals (o1, o3)); - Assert (!RuntimeHelpers.Equals (o1, o4)); + Assert.IsTrue (RuntimeHelpers.Equals (o1, o3)); + Assert.IsTrue (!RuntimeHelpers.Equals (o1, o4)); } #endif } diff --git a/mcs/class/corlib/Test/System.Runtime.InteropServices/ChangeLog b/mcs/class/corlib/Test/System.Runtime.InteropServices/ChangeLog index bc4b792d729..4e3aa2fcd3c 100644 --- a/mcs/class/corlib/Test/System.Runtime.InteropServices/ChangeLog +++ b/mcs/class/corlib/Test/System.Runtime.InteropServices/ChangeLog @@ -1,3 +1,7 @@ +2009-06-20 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2009-04-30 Sebastien Pouliot * MarshalTest.cs: Fix building unit tests for NET_1_1 diff --git a/mcs/class/corlib/Test/System.Runtime.InteropServices/GCHandleTest.cs b/mcs/class/corlib/Test/System.Runtime.InteropServices/GCHandleTest.cs index 9ae2d85a15a..b654f1ac18b 100644 --- a/mcs/class/corlib/Test/System.Runtime.InteropServices/GCHandleTest.cs +++ b/mcs/class/corlib/Test/System.Runtime.InteropServices/GCHandleTest.cs @@ -14,14 +14,14 @@ using System.Runtime.InteropServices; namespace MonoTests.System.Runtime.InteropServices { [TestFixture] - public class GCHandleTest : Assertion + public class GCHandleTest { static GCHandle handle; [Test] public void DefaultZeroValue () { - AssertEquals (false, handle.IsAllocated); + Assert.AreEqual (false, handle.IsAllocated); } [Test] @@ -76,7 +76,7 @@ namespace MonoTests.System.Runtime.InteropServices GCHandle handle = GCHandle.Alloc (null, GCHandleType.Pinned); try { IntPtr ptr = handle.AddrOfPinnedObject(); - AssertEquals (new IntPtr (0), ptr); + Assert.AreEqual (new IntPtr (0), ptr); } finally { handle.Free(); diff --git a/mcs/class/corlib/Test/System.Runtime.Remoting/ChangeLog b/mcs/class/corlib/Test/System.Runtime.Remoting/ChangeLog index f9d21b34289..71208fe2e5a 100644 --- a/mcs/class/corlib/Test/System.Runtime.Remoting/ChangeLog +++ b/mcs/class/corlib/Test/System.Runtime.Remoting/ChangeLog @@ -1,3 +1,7 @@ +2009-06-25 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2008-06-14 Zoltan Varga * SynchronizationAttributeTest.cs: Reenable some tests which seem to diff --git a/mcs/class/corlib/Test/System.Runtime.Remoting/ContextTest.cs b/mcs/class/corlib/Test/System.Runtime.Remoting/ContextTest.cs index 6560d1b7336..f3b50f0480a 100644 --- a/mcs/class/corlib/Test/System.Runtime.Remoting/ContextTest.cs +++ b/mcs/class/corlib/Test/System.Runtime.Remoting/ContextTest.cs @@ -33,7 +33,7 @@ namespace MonoTests.System.Runtime.Remoting } [TestFixture] - public class ContextText: Assertion + public class ContextText { TestCbo cbo = new TestCbo (); Context otherCtx; @@ -43,14 +43,14 @@ namespace MonoTests.System.Runtime.Remoting public void TestDoCallback () { otherCtx = cbo.GetContext (); - Assert ("New context not created", Thread.CurrentContext != otherCtx); + Assert.IsTrue (Thread.CurrentContext != otherCtx, "New context not created"); otherCtx.DoCallBack (new CrossContextDelegate (DelegateTarget)); } void DelegateTarget () { - Assert ("Wrong context", Thread.CurrentContext == otherCtx); + Assert.IsTrue (Thread.CurrentContext == otherCtx, "Wrong context"); } [Test] @@ -68,14 +68,14 @@ namespace MonoTests.System.Runtime.Remoting otherCtx.DoCallBack (new CrossContextDelegate (CheckOtherContextDatastore)); - Assert ("Wrong data 1", Context.GetData (slot).Equals ("data")); - Assert ("Wrong data 2", Context.GetData (namedSlot1).Equals ("data1")); - Assert ("Wrong data 3", Context.GetData (namedSlot2).Equals ("data2")); + Assert.IsTrue (Context.GetData (slot).Equals ("data"), "Wrong data 1"); + Assert.IsTrue (Context.GetData (namedSlot1).Equals ("data1"), "Wrong data 2"); + Assert.IsTrue (Context.GetData (namedSlot2).Equals ("data2"), "Wrong data 3"); try { namedSlot1 = Context.AllocateNamedDataSlot ("slot1"); - Assert ("Exception expected",false); + Assert.Fail ("Exception expected"); } catch {} @@ -88,7 +88,7 @@ namespace MonoTests.System.Runtime.Remoting } catch { - Assert ("Exception not expected",false); + Assert.Fail ("Exception not expected"); } Context.FreeNamedDataSlot ("slot1"); @@ -99,9 +99,9 @@ namespace MonoTests.System.Runtime.Remoting LocalDataStoreSlot namedSlot1 = Context.GetNamedDataSlot ("slot1"); LocalDataStoreSlot namedSlot2 = Context.GetNamedDataSlot ("slot2"); - Assert ("Slot already has data", Context.GetData (slot) == null); - Assert ("Slot already has data", Context.GetData (namedSlot1) == null); - Assert ("Slot already has data", Context.GetData (namedSlot2) == null); + Assert.IsTrue (Context.GetData (slot) == null, "Slot already has data"); + Assert.IsTrue (Context.GetData (namedSlot1) == null, "Slot already has data"); + Assert.IsTrue (Context.GetData (namedSlot2) == null, "Slot already has data"); Context.SetData (slot, "other data"); Context.SetData (namedSlot1, "other data1"); diff --git a/mcs/class/corlib/Test/System.Runtime.Remoting/RemotingConfigurationTest.cs b/mcs/class/corlib/Test/System.Runtime.Remoting/RemotingConfigurationTest.cs index 9fd23f77d43..8845862403b 100644 --- a/mcs/class/corlib/Test/System.Runtime.Remoting/RemotingConfigurationTest.cs +++ b/mcs/class/corlib/Test/System.Runtime.Remoting/RemotingConfigurationTest.cs @@ -90,7 +90,7 @@ namespace MonoTests.System.Runtime.Remoting { string _Id = RemotingConfiguration.ApplicationId; - Assertion.Assert("#A01", _Id != null); + Assert.IsTrue(_Id != null, "#A01"); } // tests and set the ApplicationName @@ -113,11 +113,11 @@ namespace MonoTests.System.Runtime.Remoting AppNameTest remAppNameTest = (AppNameTest) Activator.GetObject(typeof(AppNameTest), "tcp://localhost:1234/" + RemotingConfiguration.ApplicationName + "AppNameTest.rem"); - Assertion.Assert("#B01", remAppNameTest != null); + Assert.IsTrue(remAppNameTest != null, "#B01"); } catch(Exception e) { - Assertion.Assert("#B02: " + e.Message, false); + Assert.Fail ("#B02: " + e.Message); } finally { @@ -153,7 +153,7 @@ namespace MonoTests.System.Runtime.Remoting } } - Assertion.Assert("#A02", IsServerRegistered); + Assert.IsTrue(IsServerRegistered, "#A02"); // register the client RemotingConfiguration.RegisterWellKnownClientType(typeof(WellKnownObject), "tcp://localhost:1234/"+RemotingConfiguration.ApplicationName+"/WellKnownObject.rem"); @@ -171,15 +171,15 @@ namespace MonoTests.System.Runtime.Remoting } } - Assertion.Assert("#A03", IsClientRegistered); + Assert.IsTrue(IsClientRegistered, "#A03"); WellKnownObject objWellKnown = new WellKnownObject(); - Assertion.Assert("#A04", objWellKnown != null); - Assertion.Assert("#A05", RemotingServices.IsTransparentProxy(objWellKnown)); + Assert.IsTrue(objWellKnown != null, "#A04"); + Assert.IsTrue(RemotingServices.IsTransparentProxy(objWellKnown), "#A05"); objWellKnown.Method1(); - Assertion.Assert("#A06", objWellKnown.Method1Called); + Assert.IsTrue(objWellKnown.Method1Called, "#A06"); } finally { @@ -219,7 +219,7 @@ namespace MonoTests.System.Runtime.Remoting } } - Assertion.Assert("#A07", IsServerRegistered); + Assert.IsTrue(IsServerRegistered, "#A07"); RemotingConfiguration.RegisterActivatedClientType(typeof(DerivedActivatedObject), "tcp://localhost:1234"); @@ -235,7 +235,7 @@ namespace MonoTests.System.Runtime.Remoting } } - Assertion.Assert("#A08", IsClientRegistered); + Assert.IsTrue(IsClientRegistered); , "#A08"); // This will send a RemotingException since there is no service named DerivedActivatedObject // on the server @@ -254,7 +254,7 @@ namespace MonoTests.System.Runtime.Remoting { string strProcessId = null; strProcessId = RemotingConfiguration.ProcessId; - Assertion.Assert("#AO9", strProcessId != null); + Assert.IsTrue(strProcessId != null, "#AO9"); } [Test] @@ -264,7 +264,7 @@ namespace MonoTests.System.Runtime.Remoting RemotingConfiguration.RegisterActivatedServiceType(typeof(ActivatedObject)); // ActivatedObject was previously registered as a CAO on the server // so IsActivationAllowed() should return TRUE - Assertion.Assert("#A10", RemotingConfiguration.IsActivationAllowed(typeof(ActivatedObject))); + Assert.IsTrue(RemotingConfiguration.IsActivationAllowed(typeof(ActivatedObject)), "#A10"); } [Test] @@ -280,12 +280,12 @@ namespace MonoTests.System.Runtime.Remoting // DerivedActivatedObject was registered as a CAO on the client acte = RemotingConfiguration.IsRemotelyActivatedClientType(typeof(DerivedActivatedObject)); - Assertion.Assert("#A11", acte != null); - Assertion.AssertEquals("#A12", typeof(DerivedActivatedObject), acte.ObjectType); + Assert.IsTrue(acte != null, "#A11"); + Assert.AreEqual(typeof(DerivedActivatedObject), acte.ObjectType, "#A12"); acte = RemotingConfiguration.IsRemotelyActivatedClientType(typeof(DerivedActivatedObject).ToString(), assName.Name); - Assertion.Assert("#A13", acte != null); - Assertion.AssertEquals("#A14", typeof(DerivedActivatedObject), acte.ObjectType); + Assert.IsTrue(acte != null, "#A13"); + Assert.AreEqual(typeof(DerivedActivatedObject), acte.ObjectType, "#A14"); } [Test] @@ -298,12 +298,12 @@ namespace MonoTests.System.Runtime.Remoting // WellKnownObject was registered as a SAO on th client acte = RemotingConfiguration.IsWellKnownClientType(typeof(WellKnownObject)); - Assertion.Assert("#A11", acte != null); - Assertion.AssertEquals("#A12", typeof(WellKnownObject), acte.ObjectType); + Assert.IsTrue(acte != null, "#A11"); + Assert.AreEqual(typeof(WellKnownObject), acte.ObjectType, "#A12"); acte = RemotingConfiguration.IsWellKnownClientType(typeof(WellKnownObject).ToString(), assName.Name); - Assertion.Assert("#A13", acte != null); - Assertion.AssertEquals("#A14", typeof(WellKnownObject), acte.ObjectType); + Assert.IsTrue(acte != null, "#A13"); + Assert.AreEqual(typeof(WellKnownObject), acte.ObjectType, "#A14"); } } diff --git a/mcs/class/corlib/Test/System.Runtime.Remoting/RemotingServicesTest.cs b/mcs/class/corlib/Test/System.Runtime.Remoting/RemotingServicesTest.cs index 27f4edd1bb9..8582663a36b 100644 --- a/mcs/class/corlib/Test/System.Runtime.Remoting/RemotingServicesTest.cs +++ b/mcs/class/corlib/Test/System.Runtime.Remoting/RemotingServicesTest.cs @@ -183,7 +183,7 @@ namespace MonoTests.System.Runtime.Remoting // The main test class [TestFixture] - public class RemotingServicesTest : Assertion + public class RemotingServicesTest { private static int MarshalObjectId = 0; @@ -223,13 +223,13 @@ namespace MonoTests.System.Runtime.Remoting MarshalObject objMarshal = NewMarshalObject(); ObjRef objRef = RemotingServices.Marshal(objMarshal); - Assert("#A01", objRef.URI != null); + Assert.IsTrue(objRef.URI != null, "#A01"); MarshalObject objRem = (MarshalObject) RemotingServices.Unmarshal(objRef); - AssertEquals("#A02", objMarshal.Id, objRem.Id); + Assert.AreEqual(objMarshal.Id, objRem.Id, "#A02"); objRem.Id = 2; - AssertEquals("#A03", objMarshal.Id, objRem.Id); + Assert.AreEqual(objMarshal.Id, objRem.Id, "#A03"); // TODO: uncomment when RemotingServices.Disconnect is implemented //RemotingServices.Disconnect(objMarshal); @@ -238,7 +238,7 @@ namespace MonoTests.System.Runtime.Remoting objRef = RemotingServices.Marshal(objMarshal, objMarshal.Uri); - Assert("#A04", objRef.URI.EndsWith(objMarshal.Uri)); + Assert.IsTrue(objRef.URI.EndsWith(objMarshal.Uri), "#A04"); // TODO: uncomment when RemotingServices.Disconnect is implemented //RemotingServices.Disconnect(objMarshal); } @@ -251,7 +251,7 @@ namespace MonoTests.System.Runtime.Remoting ObjRef objRef = RemotingServices.Marshal(derivedObjMarshal, derivedObjMarshal.Uri, typeof(MarshalObject)); // Check that the type of the marshaled object is MarshalObject - Assert("#A05", objRef.TypeInfo.TypeName.StartsWith((typeof(MarshalObject)).ToString())); + Assert.IsTrue(objRef.TypeInfo.TypeName.StartsWith((typeof(MarshalObject)).ToString()), "#A05"); // TODO: uncomment when RemotingServices.Disconnect is implemented //RemotingServices.Disconnect(derivedObjMarshal); @@ -263,11 +263,11 @@ namespace MonoTests.System.Runtime.Remoting { MarshalObject objMarshal = NewMarshalObject(); - Assert("#A06", RemotingServices.GetObjectUri(objMarshal) == null); + Assert.IsTrue(RemotingServices.GetObjectUri(objMarshal) == null, "#A06"); ObjRef objRef = RemotingServices.Marshal(objMarshal); - Assert("#A07", RemotingServices.GetObjectUri(objMarshal) != null); + Assert.IsTrue(RemotingServices.GetObjectUri(objMarshal) != null, "#A07"); // TODO: uncomment when RemotingServices.Disconnect is implemented //RemotingServices.Disconnect(objMarshal); } @@ -288,7 +288,7 @@ namespace MonoTests.System.Runtime.Remoting MarshalObject objRem = (MarshalObject) RemotingServices.Connect(typeof(MarshalObject), "tcp://localhost:1236/" + objMarshal.Uri); - Assert("#A08", RemotingServices.IsTransparentProxy(objRem)); + Assert.IsTrue(RemotingServices.IsTransparentProxy(objRem), "#A08"); ChannelServices.UnregisterChannel(chn); @@ -354,14 +354,14 @@ namespace MonoTests.System.Runtime.Remoting // Tests RemotingServices.GetMethodBaseFromMethodMessage() AssertEquals("#A09","Method1",proxy.MthBase.Name); - Assert("#A09.1", !proxy.IsMethodOverloaded); + Assert.IsTrue(!proxy.IsMethodOverloaded, "#A09.1"); objRem.Method2(); - Assert("#A09.2", proxy.IsMethodOverloaded); + Assert.IsTrue(proxy.IsMethodOverloaded, "#A09.2"); // Tests RemotingServices.ExecuteMessage(); // If ExecuteMessage does it job well, Method1 should be called 2 times - AssertEquals("#A10", 2, MarshalObject.Called); + Assert.AreEqual(2, MarshalObject.Called, "#A10"); } finally { @@ -382,14 +382,14 @@ namespace MonoTests.System.Runtime.Remoting MarshalObject objRem = (MarshalObject) Activator.GetObject(typeof(MarshalObject), "tcp://localhost:1238/MarshalObject.rem"); - Assert("#A10.1", RemotingServices.IsTransparentProxy(objRem)); + Assert.IsTrue(RemotingServices.IsTransparentProxy(objRem), "#A10.1"); objRem.Method1(); Thread.Sleep(20); - Assert("#A10.2", !MarshalObject.IsMethodOneWay); + Assert.IsTrue(!MarshalObject.IsMethodOneWay, "#A10.2"); objRem.Method3(); Thread.Sleep(20); - Assert("#A10.2", MarshalObject.IsMethodOneWay); + Assert.IsTrue(MarshalObject.IsMethodOneWay, "#A10.2"); } finally { @@ -416,7 +416,7 @@ namespace MonoTests.System.Runtime.Remoting ObjRef objRefRem = RemotingServices.GetObjRefForProxy((MarshalByRefObject)objRem); - Assert("#A11", objRefRem != null); + Assert.IsTrue(objRefRem != null, "#A11"); } finally { @@ -441,8 +441,8 @@ namespace MonoTests.System.Runtime.Remoting RealProxy rp = RemotingServices.GetRealProxy(objRem); - Assert("#A12", rp != null); - AssertEquals("#A13", "MonoTests.System.Runtime.Remoting.RemotingServicesInternal.MyProxy", rp.GetType().ToString()); + Assert.IsTrue(rp != null, "#A12"); + Assert.AreEqual("MonoTests.System.Runtime.Remoting.RemotingServicesInternal.MyProxy", rp.GetType().ToString(), "#A13"); } finally { @@ -465,7 +465,7 @@ namespace MonoTests.System.Runtime.Remoting RemotingServices.Marshal(objRem); objRem = (MarshalObject) Activator.GetObject(typeof(MarshalObject), "tcp://localhost:1242/"+objRem.Uri); - Assert("#A14", objRem != null); + Assert.IsTrue(objRem != null, "#A14"); } finally { @@ -490,7 +490,7 @@ namespace MonoTests.System.Runtime.Remoting RemotingServices.Marshal(objRem); Type typeRem = RemotingServices.GetServerTypeForUri(RemotingServices.GetObjectUri(objRem)); - AssertEquals("#A15", type, typeRem); + Assert.AreEqual(type, typeRem, "#A15"); } finally { @@ -513,12 +513,12 @@ namespace MonoTests.System.Runtime.Remoting MarshalObject objRem = (MarshalObject) Activator.GetObject(typeof(MarshalObject), "tcp://localhost:1245/MarshalObject.rem"); - Assert("#A16", RemotingServices.IsObjectOutOfAppDomain(objRem)); - Assert("#A17", RemotingServices.IsObjectOutOfContext(objRem)); + Assert.IsTrue(RemotingServices.IsObjectOutOfAppDomain(objRem), "#A16"); + Assert.IsTrue(RemotingServices.IsObjectOutOfContext(objRem), "#A17"); MarshalObject objMarshal = new MarshalObject(); - Assert("#A18", !RemotingServices.IsObjectOutOfAppDomain(objMarshal)); - Assert("#A19", !RemotingServices.IsObjectOutOfContext(objMarshal)); + Assert.IsTrue(!RemotingServices.IsObjectOutOfAppDomain(objMarshal), "#A18"); + Assert.IsTrue(!RemotingServices.IsObjectOutOfContext(objMarshal), "#A19"); } finally { diff --git a/mcs/class/corlib/Test/System.Runtime.Remoting/SoapServicesTest.cs b/mcs/class/corlib/Test/System.Runtime.Remoting/SoapServicesTest.cs index cc4f77d1233..2afeaae97c8 100644 --- a/mcs/class/corlib/Test/System.Runtime.Remoting/SoapServicesTest.cs +++ b/mcs/class/corlib/Test/System.Runtime.Remoting/SoapServicesTest.cs @@ -55,7 +55,7 @@ namespace MonoTests.System.Runtime.Remoting } [TestFixture] - public class SoapServicesTest: Assertion + public class SoapServicesTest { public string ThisNamespace { @@ -88,42 +88,42 @@ namespace MonoTests.System.Runtime.Remoting // XmlType res = SoapServices.GetXmlElementForInteropType (typeof(SoapTest), out name, out ns); - Assert ("E1",res); - AssertEquals ("E2", "ename", name); - AssertEquals ("E3", "ens", ns); + Assert.IsTrue (res, "E1"); + Assert.AreEqual ("ename", name, "E2"); + Assert.AreEqual ("ens", ns, "E3"); res = SoapServices.GetXmlElementForInteropType (typeof(SoapTest1), out name, out ns); - Assert ("E4",!res); + Assert.IsTrue (!res, "E4"); res = SoapServices.GetXmlElementForInteropType (typeof(SoapTest2), out name, out ns); - Assert ("E5",res); - AssertEquals ("E6", "ename", name); - AssertEquals ("E7", ThisNamespace, ns); + Assert.IsTrue (res, "E5"); + Assert.AreEqual ("ename", name, "E6"); + Assert.AreEqual (ThisNamespace, ns, "E7"); res = SoapServices.GetXmlElementForInteropType (typeof(SoapTest3), out name, out ns); - Assert ("E8",res); - AssertEquals ("E9", "SoapTest3", name); - AssertEquals ("E10", "ens", ns); + Assert.IsTrue (res, "E8"); + Assert.AreEqual ("SoapTest3", name, "E9"); + Assert.AreEqual ("ens", ns, "E10"); // XmlElement res = SoapServices.GetXmlTypeForInteropType (typeof(SoapTest), out name, out ns); - Assert ("T1",res); - AssertEquals ("T2", "tname", name); - AssertEquals ("T3", "tns", ns); + Assert.IsTrue (res, "T1"); + Assert.AreEqual ("tname", name, "T2"); + Assert.AreEqual ("tns", ns, "T3"); res = SoapServices.GetXmlTypeForInteropType (typeof(SoapTest1), out name, out ns); - Assert ("T4",!res); + Assert.IsTrue (!res, "T4"); res = SoapServices.GetXmlTypeForInteropType (typeof(SoapTest2), out name, out ns); - Assert ("T5",res); - AssertEquals ("T6", "tname", name); - AssertEquals ("T7", ThisNamespace, ns); + Assert.IsTrue (res, "T5"); + Assert.AreEqual ("tname", name, "T6"); + Assert.AreEqual (ThisNamespace, ns, "T7"); res = SoapServices.GetXmlTypeForInteropType (typeof(SoapTest3), out name, out ns); - Assert ("T8",res); - AssertEquals ("T9", "SoapTest3", name); - AssertEquals ("T10", "tns", ns); + Assert.IsTrue (res, "T8"); + Assert.AreEqual ("SoapTest3", name, "T9"); + Assert.AreEqual ("tns", ns, "T10"); } [Test] @@ -134,39 +134,39 @@ namespace MonoTests.System.Runtime.Remoting // Manual registration t = SoapServices.GetInteropTypeFromXmlElement ("aa","bb"); - AssertEquals ("M1", t, null); + Assert.AreEqual (t, null, "M1"); SoapServices.RegisterInteropXmlElement ("aa","bb",typeof(SoapTest)); t = SoapServices.GetInteropTypeFromXmlElement ("aa","bb"); - AssertEquals ("M2", typeof (SoapTest), t); + Assert.AreEqual (typeof (SoapTest), t, "M2"); t = SoapServices.GetInteropTypeFromXmlType ("aa","bb"); - AssertEquals ("M3", null, t); + Assert.AreEqual (null, t, "M3"); SoapServices.RegisterInteropXmlType ("aa","bb",typeof(SoapTest)); t = SoapServices.GetInteropTypeFromXmlType ("aa","bb"); - AssertEquals ("M4", typeof (SoapTest), t); + Assert.AreEqual (typeof (SoapTest), t, "M4"); // Preload type SoapServices.PreLoad (typeof(SoapTest2)); t = SoapServices.GetInteropTypeFromXmlElement ("ename",ThisNamespace); - AssertEquals ("T1", typeof (SoapTest2), t); + Assert.AreEqual (typeof (SoapTest2), t, "T1"); t = SoapServices.GetInteropTypeFromXmlType ("tname",ThisNamespace); - AssertEquals ("T2", typeof (SoapTest2), t); + Assert.AreEqual (typeof (SoapTest2), t, "T2"); // Preload assembly SoapServices.PreLoad (typeof(SoapTest).Assembly); t = SoapServices.GetInteropTypeFromXmlElement ("SoapTest3","ens"); - AssertEquals ("A1", typeof (SoapTest3), t); + Assert.AreEqual (typeof (SoapTest3), t, "A1"); t = SoapServices.GetInteropTypeFromXmlType ("SoapTest3","tns"); - AssertEquals ("A2", typeof (SoapTest3), t); + Assert.AreEqual (typeof (SoapTest3), t, "A2"); } @@ -177,16 +177,16 @@ namespace MonoTests.System.Runtime.Remoting Type t; SoapServices.GetInteropFieldTypeAndNameFromXmlAttribute (typeof(SoapTest), "atrib", "ns1", out t, out name); - AssertEquals ("#1", "atribut", name); - AssertEquals ("#2", typeof(string), t); + Assert.AreEqual ("atribut", name, "#1"); + Assert.AreEqual (typeof(string), t, "#2"); SoapServices.GetInteropFieldTypeAndNameFromXmlElement (typeof(SoapTest), "elem", "ns1", out t, out name); - AssertEquals ("#3", "element", name); - AssertEquals ("#4", typeof(int), t); + Assert.AreEqual ("element", name, "#3"); + Assert.AreEqual (typeof(int), t, "#4"); SoapServices.GetInteropFieldTypeAndNameFromXmlElement (typeof(SoapTest), "elem2", null, out t, out name); - AssertEquals ("#5", "element2", name); - AssertEquals ("#6", typeof(int), t); + Assert.AreEqual ("element2", name, "#5"); + Assert.AreEqual (typeof(int), t, "#6"); } [Test] @@ -198,34 +198,34 @@ namespace MonoTests.System.Runtime.Remoting mb = typeof(SoapTest).GetMethod ("FesAlgo"); act = SoapServices.GetSoapActionFromMethodBase (mb); - AssertEquals ("S1", "myaction", act); + Assert.AreEqual ("myaction", act, "S1"); mb = typeof(SoapTest).GetMethod ("FesAlgoMes"); SoapServices.RegisterSoapActionForMethodBase (mb, "anotheraction"); act = SoapServices.GetSoapActionFromMethodBase (mb); - AssertEquals ("S2", "anotheraction", act); + Assert.AreEqual ("anotheraction", act, "S2"); mb = typeof(SoapTest).GetMethod ("FesAlgoMesEspecial"); act = SoapServices.GetSoapActionFromMethodBase (mb); - AssertEquals ("S3", GetClassNs (typeof(SoapTest))+ "#FesAlgoMesEspecial", act); + Assert.AreEqual (GetClassNs (typeof(SoapTest))+ "#FesAlgoMesEspecial", act, "S3"); string typeName, methodName; bool res; res = SoapServices.GetTypeAndMethodNameFromSoapAction ("myaction", out typeName, out methodName); - Assert ("M1", res); - AssertEquals ("M2", GetSimpleTypeName (typeof(SoapTest)), typeName); - AssertEquals ("M3", "FesAlgo", methodName); + Assert.IsTrue (res, "M1"); + Assert.AreEqual (GetSimpleTypeName (typeof(SoapTest)), typeName, "M2"); + Assert.AreEqual ("FesAlgo", methodName, "M3"); res = SoapServices.GetTypeAndMethodNameFromSoapAction ("anotheraction", out typeName, out methodName); - Assert ("M4", res); - AssertEquals ("M5", GetSimpleTypeName (typeof(SoapTest)), typeName); - AssertEquals ("M6", "FesAlgoMes", methodName); + Assert.IsTrue (res, "M4"); + Assert.AreEqual (GetSimpleTypeName (typeof(SoapTest)), typeName, "M5"); + Assert.AreEqual ("FesAlgoMes", methodName, "M6"); res = SoapServices.GetTypeAndMethodNameFromSoapAction (GetClassNs (typeof(SoapTest))+ "#FesAlgoMesEspecial", out typeName, out methodName); - Assert ("M7", res); - AssertEquals ("M8", GetSimpleTypeName (typeof(SoapTest)), typeName); - AssertEquals ("M9", "FesAlgoMesEspecial", methodName); + Assert.IsTrue (res, "M7"); + Assert.AreEqual (GetSimpleTypeName (typeof(SoapTest)), typeName, "M8"); + Assert.AreEqual ("FesAlgoMesEspecial", methodName, "M9"); } } } diff --git a/mcs/class/corlib/Test/System.Runtime.Remoting/SynchronizationAttributeTest.cs b/mcs/class/corlib/Test/System.Runtime.Remoting/SynchronizationAttributeTest.cs index 0b9789f7ac4..6d7c1302588 100644 --- a/mcs/class/corlib/Test/System.Runtime.Remoting/SynchronizationAttributeTest.cs +++ b/mcs/class/corlib/Test/System.Runtime.Remoting/SynchronizationAttributeTest.cs @@ -1,367 +1,367 @@ -// -// MonoTests.System.Runtime.Remoting.SynchronizationAttributeTest.cs -// -// Author: Lluis Sanchez Gual (lluis@ximian.com) -// -// 2003 (C) Copyright, Novell, Inc. -// - -using System; -using System.Threading; -using System.Runtime.Remoting.Contexts; -using NUnit.Framework; - -namespace MonoTests.System.Runtime.Remoting -{ - enum SynchRes { SameSync, NewSync, NoSync } - - class SincroBase: ContextBoundObject - { - public int idx = 0; - - public bool CheckConcurrency () - { - int t = idx; - for (int n=0; n<40; n++) - { - idx++; - Thread.Sleep (25); - } - return (t+40 != idx); - } - - public bool CheckUnlockedConcurrency () - { - Lock (false); - return CheckConcurrency (); - } - - public SynchRes CheckContext (Context ctx) - { - object otherp = ctx.GetProperty ("Synchronization"); - object thisp = Thread.CurrentContext.GetProperty ("Synchronization"); - - if (thisp == null) return SynchRes.NoSync; - if (thisp == otherp) return SynchRes.SameSync; - return SynchRes.NewSync; - } - - public SynchRes CheckContextTransition (Type type) - { - SincroBase bob = (SincroBase)Activator.CreateInstance (type); - return bob.CheckContext (Thread.CurrentContext); - } - - public bool CheckCalloutConcurrency (SincroBase bob) - { - bool res = bob.CheckConcurrency (); - return res; - } - - public void CheckLock1 () - { - Thread.Sleep (2000); - Lock (false); - Thread.Sleep (6000); - } - - public void CheckLock2 () - { - Thread.Sleep (1000); - Lock (true); - Thread.Sleep (2000); - } - - public void Lock (bool b) - { - SynchronizationAttribute thisp = (SynchronizationAttribute) Thread.CurrentContext.GetProperty ("Synchronization"); - thisp.Locked = b; - } - - public bool GetLocked () - { - SynchronizationAttribute thisp = (SynchronizationAttribute) Thread.CurrentContext.GetProperty ("Synchronization"); - return thisp.Locked; - } - - public bool CheckMonitorWait (bool exitContext) - { - lock (this) - { - return Monitor.Wait (this, 1000, exitContext); - } - } - - public void CheckMonitorPulse () - { - lock (this) - { - Monitor.Pulse (this); - } - } - } - - [Synchronization (SynchronizationAttribute.SUPPORTED)] - class SincroSupported: SincroBase - { - } - - [Synchronization (SynchronizationAttribute.REQUIRED)] - class SincroRequired: SincroBase - { - } - - [Synchronization (SynchronizationAttribute.REQUIRES_NEW)] - class SincroRequiresNew: SincroBase - { - public bool TestCallback () - { - SincroNotSupported bob = new SincroNotSupported (); - return bob.CallBack (this); - } - } - - [Synchronization (SynchronizationAttribute.NOT_SUPPORTED)] - class SincroNotSupported: SincroBase - { - public bool CallBack (SincroRequiresNew bob) - { - return bob.CheckConcurrency (); - } - } - - [Synchronization (SynchronizationAttribute.REQUIRES_NEW, true)] - class SincroRequiresNewReentrant: SincroBase - { - } - - [TestFixture] - public class SynchronizationAttributeTest: Assertion - { - SincroRequiresNew sincob = new SincroRequiresNew (); - SincroNotSupported notsup = new SincroNotSupported (); - SincroRequiresNewReentrant reentrant = new SincroRequiresNewReentrant (); - SincroRequiresNew notreentrant = new SincroRequiresNew (); - bool otResult; - - [Test] - public void TestSynchronization () - { - Thread tr = new Thread (new ThreadStart (FirstSyncThread)); - tr.Start (); - Thread.Sleep (200); - SecondSyncThread (); - - tr.Join (); - Assert ("Concurrency detected in FirstSyncThread", !otResult); - } - - void FirstSyncThread () - { - otResult = sincob.CheckConcurrency (); - } - - void SecondSyncThread () - { - bool concurrent = sincob.CheckConcurrency (); - Assert ("Concurrency detected", !concurrent); - } - - [Test] - public void TestSupported () - { - SincroRequiresNew ob = new SincroRequiresNew (); - SynchRes res = ob.CheckContextTransition (typeof(SincroSupported)); - Assert ("Synchronizaton context expected", res == SynchRes.SameSync); - - SincroSupported ob2 = new SincroSupported (); - res = ob2.CheckContext (Thread.CurrentContext); - Assert ("Synchronizaton context not expected", res == SynchRes.NoSync); - } - - [Test] - public void TestRequired () - { - SincroRequiresNew ob = new SincroRequiresNew (); - SynchRes res = ob.CheckContextTransition (typeof(SincroRequired)); - Assert ("Synchronizaton context expected 1", res == SynchRes.SameSync); - - SincroRequired ob2 = new SincroRequired (); - res = ob2.CheckContext (Thread.CurrentContext); - Assert ("Synchronizaton context expected 2", res == SynchRes.NewSync); - } - - [Test] - public void TestRequiresNew () - { - SincroRequiresNew ob = new SincroRequiresNew (); - SynchRes res = ob.CheckContextTransition (typeof(SincroRequiresNew)); - Assert ("New synchronizaton context expected", res == SynchRes.NewSync); - - SincroRequiresNew ob2 = new SincroRequiresNew (); - res = ob2.CheckContext (Thread.CurrentContext); - Assert ("Synchronizaton context not expected", res == SynchRes.NewSync); - } - - [Test] - public void TestNotSupported () - { - SincroRequiresNew ob = new SincroRequiresNew (); - SynchRes res = ob.CheckContextTransition (typeof(SincroNotSupported)); - Assert ("Synchronizaton context not expected 1", res == SynchRes.NoSync); - - SincroNotSupported ob2 = new SincroNotSupported (); - res = ob2.CheckContext (Thread.CurrentContext); - Assert ("Synchronizaton context not expected 2", res == SynchRes.NoSync); - } - - [Test] - public void TestLocked1 () - { - sincob.Lock (false); - Thread tr = new Thread (new ThreadStart (FirstSyncThread)); - tr.Start (); - Thread.Sleep (200); - SecondSyncThread (); - - tr.Join (); - Assert ("Concurrency detected in FirstSyncThread", !otResult); - } - - [Test] - public void TestLocked2 () - { - Thread tr = new Thread (new ThreadStart (FirstNotSyncThread)); - tr.Start (); - Thread.Sleep (200); - SecondNotSyncThread (); - - tr.Join (); - Assert ("Concurrency not detected in FirstReentryThread", otResult); - } - - void FirstNotSyncThread () - { - otResult = sincob.CheckUnlockedConcurrency (); - } - - void SecondNotSyncThread () - { - bool concurrent = sincob.CheckConcurrency (); - Assert ("Concurrency not detected", concurrent); - } - - [Test] - public void TestLocked3 () - { - Thread tr = new Thread (new ThreadStart (Lock1Thread)); - tr.Start (); - Thread.Sleep (200); - Lock2Thread (); - } - - void Lock1Thread () - { - sincob.CheckLock1 (); - } - - void Lock2Thread () - { - sincob.CheckLock2 (); - } - - [Test] - public void TestReentry () - { - Thread tr = new Thread (new ThreadStart (FirstReentryThread)); - tr.Start (); - Thread.Sleep (200); - SecondReentryThread (); - - tr.Join (); - Assert ("Concurrency not detected in FirstReentryThread", otResult); - } - - void FirstReentryThread () - { - otResult = reentrant.CheckCalloutConcurrency (notsup); - } - - void SecondReentryThread () - { - bool concurrent = reentrant.CheckCalloutConcurrency (notsup); - Assert ("Concurrency not detected", concurrent); - } - - [Test] - public void TestNoReentry () - { - Thread tr = new Thread (new ThreadStart (FirstNoReentryThread)); - tr.Start (); - Thread.Sleep (200); - SecondNoReentryThread (); - - tr.Join (); - Assert ("Concurrency detected in FirstNoReentryThread", !otResult); - } - - void FirstNoReentryThread () - { - otResult = notreentrant.CheckCalloutConcurrency (notsup); - } - - void SecondNoReentryThread () - { - bool concurrent = notreentrant.CheckCalloutConcurrency (notsup); - Assert ("Concurrency detected", !concurrent); - } - - [Test] - public void TestCallback () - { - Thread tr = new Thread (new ThreadStart (CallbackThread)); - tr.Start (); - Thread.Sleep (200); - bool concurrent = notreentrant.CheckConcurrency (); - Assert ("Concurrency detected", !concurrent); - notreentrant.CheckContext (Thread.CurrentContext); - - tr.Join (); - Assert ("Concurrency detected in CallbackThread", !otResult); - } - - void CallbackThread () - { - otResult = notreentrant.TestCallback (); - } - - [Test] - [Category("NotDotNet")] - public void TestMonitorWait () - { - Thread tr = new Thread (new ThreadStart (DoMonitorPulse)); - tr.Start (); - - bool r = sincob.CheckMonitorWait (true); - Assert ("Wait timeout", r); - - r = tr.Join (1000); - Assert ("Join timeout", r); - - tr = new Thread (new ThreadStart (DoMonitorPulse)); - tr.Start (); - - r = sincob.CheckMonitorWait (false); - Assert ("Expected wait timeout", !r); - - r = tr.Join (1000); - Assert ("Join timeout 2", r); - } - - void DoMonitorPulse () - { - Thread.Sleep (100); - sincob.CheckMonitorPulse (); - } - } -} +// +// MonoTests.System.Runtime.Remoting.SynchronizationAttributeTest.cs +// +// Author: Lluis Sanchez Gual (lluis@ximian.com) +// +// 2003 (C) Copyright, Novell, Inc. +// + +using System; +using System.Threading; +using System.Runtime.Remoting.Contexts; +using NUnit.Framework; + +namespace MonoTests.System.Runtime.Remoting +{ + enum SynchRes { SameSync, NewSync, NoSync } + + class SincroBase: ContextBoundObject + { + public int idx = 0; + + public bool CheckConcurrency () + { + int t = idx; + for (int n=0; n<40; n++) + { + idx++; + Thread.Sleep (25); + } + return (t+40 != idx); + } + + public bool CheckUnlockedConcurrency () + { + Lock (false); + return CheckConcurrency (); + } + + public SynchRes CheckContext (Context ctx) + { + object otherp = ctx.GetProperty ("Synchronization"); + object thisp = Thread.CurrentContext.GetProperty ("Synchronization"); + + if (thisp == null) return SynchRes.NoSync; + if (thisp == otherp) return SynchRes.SameSync; + return SynchRes.NewSync; + } + + public SynchRes CheckContextTransition (Type type) + { + SincroBase bob = (SincroBase)Activator.CreateInstance (type); + return bob.CheckContext (Thread.CurrentContext); + } + + public bool CheckCalloutConcurrency (SincroBase bob) + { + bool res = bob.CheckConcurrency (); + return res; + } + + public void CheckLock1 () + { + Thread.Sleep (2000); + Lock (false); + Thread.Sleep (6000); + } + + public void CheckLock2 () + { + Thread.Sleep (1000); + Lock (true); + Thread.Sleep (2000); + } + + public void Lock (bool b) + { + SynchronizationAttribute thisp = (SynchronizationAttribute) Thread.CurrentContext.GetProperty ("Synchronization"); + thisp.Locked = b; + } + + public bool GetLocked () + { + SynchronizationAttribute thisp = (SynchronizationAttribute) Thread.CurrentContext.GetProperty ("Synchronization"); + return thisp.Locked; + } + + public bool CheckMonitorWait (bool exitContext) + { + lock (this) + { + return Monitor.Wait (this, 1000, exitContext); + } + } + + public void CheckMonitorPulse () + { + lock (this) + { + Monitor.Pulse (this); + } + } + } + + [Synchronization (SynchronizationAttribute.SUPPORTED)] + class SincroSupported: SincroBase + { + } + + [Synchronization (SynchronizationAttribute.REQUIRED)] + class SincroRequired: SincroBase + { + } + + [Synchronization (SynchronizationAttribute.REQUIRES_NEW)] + class SincroRequiresNew: SincroBase + { + public bool TestCallback () + { + SincroNotSupported bob = new SincroNotSupported (); + return bob.CallBack (this); + } + } + + [Synchronization (SynchronizationAttribute.NOT_SUPPORTED)] + class SincroNotSupported: SincroBase + { + public bool CallBack (SincroRequiresNew bob) + { + return bob.CheckConcurrency (); + } + } + + [Synchronization (SynchronizationAttribute.REQUIRES_NEW, true)] + class SincroRequiresNewReentrant: SincroBase + { + } + + [TestFixture] + public class SynchronizationAttributeTest + { + SincroRequiresNew sincob = new SincroRequiresNew (); + SincroNotSupported notsup = new SincroNotSupported (); + SincroRequiresNewReentrant reentrant = new SincroRequiresNewReentrant (); + SincroRequiresNew notreentrant = new SincroRequiresNew (); + bool otResult; + + [Test] + public void TestSynchronization () + { + Thread tr = new Thread (new ThreadStart (FirstSyncThread)); + tr.Start (); + Thread.Sleep (200); + SecondSyncThread (); + + tr.Join (); + Assert.IsTrue (!otResult, "Concurrency detected in FirstSyncThread"); + } + + void FirstSyncThread () + { + otResult = sincob.CheckConcurrency (); + } + + void SecondSyncThread () + { + bool concurrent = sincob.CheckConcurrency (); + Assert.IsTrue (!concurrent, "Concurrency detected"); + } + + [Test] + public void TestSupported () + { + SincroRequiresNew ob = new SincroRequiresNew (); + SynchRes res = ob.CheckContextTransition (typeof(SincroSupported)); + Assert.IsTrue (res == SynchRes.SameSync, "Synchronizaton context expected"); + + SincroSupported ob2 = new SincroSupported (); + res = ob2.CheckContext (Thread.CurrentContext); + Assert.IsTrue (res == SynchRes.NoSync, "Synchronizaton context not expected"); + } + + [Test] + public void TestRequired () + { + SincroRequiresNew ob = new SincroRequiresNew (); + SynchRes res = ob.CheckContextTransition (typeof(SincroRequired)); + Assert.IsTrue (res == SynchRes.SameSync, "Synchronizaton context expected 1"); + + SincroRequired ob2 = new SincroRequired (); + res = ob2.CheckContext (Thread.CurrentContext); + Assert.IsTrue (res == SynchRes.NewSync, "Synchronizaton context expected 2"); + } + + [Test] + public void TestRequiresNew () + { + SincroRequiresNew ob = new SincroRequiresNew (); + SynchRes res = ob.CheckContextTransition (typeof(SincroRequiresNew)); + Assert.IsTrue (res == SynchRes.NewSync, "New synchronizaton context expected"); + + SincroRequiresNew ob2 = new SincroRequiresNew (); + res = ob2.CheckContext (Thread.CurrentContext); + Assert.IsTrue (res == SynchRes.NewSync, "Synchronizaton context not expected"); + } + + [Test] + public void TestNotSupported () + { + SincroRequiresNew ob = new SincroRequiresNew (); + SynchRes res = ob.CheckContextTransition (typeof(SincroNotSupported)); + Assert.IsTrue (res == SynchRes.NoSync, "Synchronizaton context not expected 1"); + + SincroNotSupported ob2 = new SincroNotSupported (); + res = ob2.CheckContext (Thread.CurrentContext); + Assert.IsTrue (res == SynchRes.NoSync, "Synchronizaton context not expected 2"); + } + + [Test] + public void TestLocked1 () + { + sincob.Lock (false); + Thread tr = new Thread (new ThreadStart (FirstSyncThread)); + tr.Start (); + Thread.Sleep (200); + SecondSyncThread (); + + tr.Join (); + Assert.IsTrue (!otResult, "Concurrency detected in FirstSyncThread"); + } + + [Test] + public void TestLocked2 () + { + Thread tr = new Thread (new ThreadStart (FirstNotSyncThread)); + tr.Start (); + Thread.Sleep (200); + SecondNotSyncThread (); + + tr.Join (); + Assert.IsTrue (otResult, "Concurrency not detected in FirstReentryThread"); + } + + void FirstNotSyncThread () + { + otResult = sincob.CheckUnlockedConcurrency (); + } + + void SecondNotSyncThread () + { + bool concurrent = sincob.CheckConcurrency (); + Assert.IsTrue (concurrent, "Concurrency not detected"); + } + + [Test] + public void TestLocked3 () + { + Thread tr = new Thread (new ThreadStart (Lock1Thread)); + tr.Start (); + Thread.Sleep (200); + Lock2Thread (); + } + + void Lock1Thread () + { + sincob.CheckLock1 (); + } + + void Lock2Thread () + { + sincob.CheckLock2 (); + } + + [Test] + public void TestReentry () + { + Thread tr = new Thread (new ThreadStart (FirstReentryThread)); + tr.Start (); + Thread.Sleep (200); + SecondReentryThread (); + + tr.Join (); + Assert.IsTrue (otResult, "Concurrency not detected in FirstReentryThread"); + } + + void FirstReentryThread () + { + otResult = reentrant.CheckCalloutConcurrency (notsup); + } + + void SecondReentryThread () + { + bool concurrent = reentrant.CheckCalloutConcurrency (notsup); + Assert.IsTrue (concurrent, "Concurrency not detected"); + } + + [Test] + public void TestNoReentry () + { + Thread tr = new Thread (new ThreadStart (FirstNoReentryThread)); + tr.Start (); + Thread.Sleep (200); + SecondNoReentryThread (); + + tr.Join (); + Assert.IsTrue (!otResult, "Concurrency detected in FirstNoReentryThread"); + } + + void FirstNoReentryThread () + { + otResult = notreentrant.CheckCalloutConcurrency (notsup); + } + + void SecondNoReentryThread () + { + bool concurrent = notreentrant.CheckCalloutConcurrency (notsup); + Assert.IsTrue (!concurrent, "Concurrency detected"); + } + + [Test] + public void TestCallback () + { + Thread tr = new Thread (new ThreadStart (CallbackThread)); + tr.Start (); + Thread.Sleep (200); + bool concurrent = notreentrant.CheckConcurrency (); + Assert.IsTrue (!concurrent, "Concurrency detected"); + notreentrant.CheckContext (Thread.CurrentContext); + + tr.Join (); + Assert.IsTrue (!otResult, "Concurrency detected in CallbackThread"); + } + + void CallbackThread () + { + otResult = notreentrant.TestCallback (); + } + + [Test] + [Category("NotDotNet")] + public void TestMonitorWait () + { + Thread tr = new Thread (new ThreadStart (DoMonitorPulse)); + tr.Start (); + + bool r = sincob.CheckMonitorWait (true); + Assert.IsTrue (r, "Wait timeout"); + + r = tr.Join (1000); + Assert.IsTrue (r, "Join timeout"); + + tr = new Thread (new ThreadStart (DoMonitorPulse)); + tr.Start (); + + r = sincob.CheckMonitorWait (false); + Assert.IsTrue (!r, "Expected wait timeout"); + + r = tr.Join (1000); + Assert.IsTrue (r, "Join timeout 2"); + } + + void DoMonitorPulse () + { + Thread.Sleep (100); + sincob.CheckMonitorPulse (); + } + } +} diff --git a/mcs/class/corlib/Test/System.Runtime.Serialization/ArraySerializationTest.cs b/mcs/class/corlib/Test/System.Runtime.Serialization/ArraySerializationTest.cs index 05179fa832d..24cfa5d1037 100644 --- a/mcs/class/corlib/Test/System.Runtime.Serialization/ArraySerializationTest.cs +++ b/mcs/class/corlib/Test/System.Runtime.Serialization/ArraySerializationTest.cs @@ -189,9 +189,9 @@ namespace MonoTests.System.Runtime.Serialization void CompareArrays (string txt, Array a1, Array a2) { - Assertion.AssertEquals (txt + " length", a1.Length, a2.Length); + Assert.AreEqual (a1.Length, a2.Length, txt + " length"); for (int n=0; n + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2009-02-04 Zoltan Varga * SerializationCallbackTest.cs: Make a few tests quiet. diff --git a/mcs/class/corlib/Test/System.Runtime.Serialization/FormatterServicesTests.cs b/mcs/class/corlib/Test/System.Runtime.Serialization/FormatterServicesTests.cs index 429068e73ad..0374b64daac 100644 --- a/mcs/class/corlib/Test/System.Runtime.Serialization/FormatterServicesTests.cs +++ b/mcs/class/corlib/Test/System.Runtime.Serialization/FormatterServicesTests.cs @@ -14,30 +14,30 @@ using System.Runtime.Serialization; namespace MonoTests.System.Runtime.Serialization { - public class FormatterServicesTests : TestCase + public class FormatterServicesTests { public void TestClass1 () { DerivedClass1 derived = new DerivedClass1 (); derived.anotherInt = 69; MemberInfo [] members = FormatterServices.GetSerializableMembers (derived.GetType ()); - Assert ("#01", members != null); - AssertEquals ("#02", 3, members.Length); + Assert.IsTrue (members != null, "#01"); + Assert.AreEqual (3, members.Length, "#02"); object [] data = FormatterServices.GetObjectData (derived, members); - Assert ("#03", data != null); - AssertEquals ("#04", 3, data.Length); + Assert.IsTrue (data != null, "#03"); + Assert.AreEqual (3, data.Length, "#04"); DerivedClass1 o = (DerivedClass1) FormatterServices.GetUninitializedObject (derived.GetType ()); - Assert ("#05", o != null); + Assert.IsTrue (o != null, "#05"); o = (DerivedClass1) FormatterServices.PopulateObjectMembers (o, members, data); - Assert ("#06", o != null); - AssertEquals ("#07", "hola", o.Hello); - AssertEquals ("#08", 21, o.IntBase); - AssertEquals ("#09", 1, o.IntDerived); - AssertEquals ("#10", 69, o.anotherInt); - AssertEquals ("#11", "hey", DerivedClass1.hey); + Assert.IsTrue (o != null, "#06"); + Assert.AreEqual ("hola", o.Hello, "#07"); + Assert.AreEqual (21, o.IntBase, "#08"); + Assert.AreEqual (1, o.IntDerived, "#09"); + Assert.AreEqual (69, o.anotherInt, "#10"); + Assert.AreEqual ("hey", DerivedClass1.hey, "#11"); } } diff --git a/mcs/class/corlib/Test/System.Runtime.Serialization/ObjectIDGeneratorTests.cs b/mcs/class/corlib/Test/System.Runtime.Serialization/ObjectIDGeneratorTests.cs index d15ffd3cafb..68f91b3058f 100644 --- a/mcs/class/corlib/Test/System.Runtime.Serialization/ObjectIDGeneratorTests.cs +++ b/mcs/class/corlib/Test/System.Runtime.Serialization/ObjectIDGeneratorTests.cs @@ -14,7 +14,7 @@ using NUnit.Framework; namespace MonoTests.System.Runtime.Serialization { - public class ObjectIDGeneratorTests : TestCase + public class ObjectIDGeneratorTests { ObjectIDGenerator generator; @@ -22,7 +22,8 @@ namespace MonoTests.System.Runtime.Serialization int obj2 = 42; long id; - protected override void SetUp () + [SetUp] + protected void SetUp () { generator = new ObjectIDGenerator (); } @@ -35,8 +36,8 @@ namespace MonoTests.System.Runtime.Serialization bool testBool1; id = generator.GetId (obj1, out testBool1); - AssertEquals ("A1", 1L, id); // should start at 1 - AssertEquals ("A2", true, testBool1); // firstTime should be true + Assert.AreEqual (1L, id); // should start at 1, "A1"); + Assert.AreEqual (true, testBool1); // firstTime should be true, "A2"); } // @@ -49,8 +50,8 @@ namespace MonoTests.System.Runtime.Serialization id = generator.GetId (obj1, out testBool1); long testId1 = generator.GetId (obj1, out testBool2); - AssertEquals ("B1", testId1, id); // same object, same ID - AssertEquals ("B2", false, testBool2); // no longer firstTime + Assert.AreEqual (testId1, id); // same object, same ID, "B1"); + Assert.AreEqual (false, testBool2); // no longer firstTime, "B2"); } // @@ -63,8 +64,8 @@ namespace MonoTests.System.Runtime.Serialization id = generator.GetId (obj1, out testBool1); long testId2 = generator.HasId (obj1, out testBool3); - AssertEquals ("C1", false, testBool3); // this has been inserted before - AssertEquals ("C2", id, testId2); // we should get the same ID + Assert.AreEqual (false, testBool3); // this has been inserted before, "C1"); + Assert.AreEqual (id, testId2); // we should get the same ID, "C2"); } // @@ -75,8 +76,8 @@ namespace MonoTests.System.Runtime.Serialization bool testBool4; long testId3 = generator.HasId (obj2, out testBool4); - AssertEquals ("D1", 0L, testId3); - AssertEquals ("D2", true, testBool4); + Assert.AreEqual (0L, testId3, "D1"); + Assert.AreEqual (true, testBool4, "D2"); } } } diff --git a/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/ChangeLog b/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/ChangeLog index ef1c9675117..f07c1ba5d92 100644 --- a/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/ChangeLog +++ b/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/ChangeLog @@ -1,3 +1,7 @@ +2009-06-25 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2008-07-26 Gert Driesen * X509CertificateTest.cs: Added asserts for Subject and Issuer. diff --git a/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509CapiTest.cs b/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509CapiTest.cs index 90f1c88a45f..5947bd3f946 100644 --- a/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509CapiTest.cs +++ b/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509CapiTest.cs @@ -125,8 +125,8 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { X509Certificate x509 = new X509Certificate (handle); byte[] hash = { 0xD6,0x2F,0x48,0xD0,0x13,0xEE,0x7F,0xB5,0x8B,0x79,0x07,0x45,0x12,0x67,0x0D,0x9C,0x5B,0x3A,0x5D,0xA9 }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "D62F48D013EE7FB58B79074512670D9C5B3A5DA9", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("D62F48D013EE7FB58B79074512670D9C5B3A5DA9", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("03/12/1996 18:38:47", from.ToString (), "GetEffectiveDateString"); @@ -134,25 +134,25 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { Assert.AreEqual ("03/12/1997 18:38:46", until.ToString (), "GetExpirationDateString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "03/12/1996 10:38:47", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "03/12/1997 10:38:46", x509.GetExpirationDateString ()); + Assert.AreEqual ("03/12/1996 10:38:47", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("03/12/1997 10:38:46", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", -701544240, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=US, O=\"RSA Data Security, Inc.\", OU=Secure Server Certification Authority", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.113549.1.1.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (-701544240, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=US, O=\"RSA Data Security, Inc.\", OU=Secure Server Certification Authority", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x05,0x00 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "0500", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=US, S=California, O=CommerceNet, OU=Server Certification Authority", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("0500", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=US, S=California, O=CommerceNet, OU=Server Certification Authority", x509.GetName (), "GetName"); byte[] pubkey = { 0x30,0x5C,0x02,0x55,0x2D,0x58,0xE9,0xBF,0xF0,0x31,0xCD,0x79,0x06,0x50,0x5A,0xD5,0x9E,0x0E,0x2C,0xE6,0xC2,0xF7,0xF9,0xD2,0xCE,0x55,0x64,0x85,0xB1,0x90,0x9A,0x92,0xB3,0x36,0xC1,0xBC,0xEA,0xC8,0x23,0xB7,0xAB,0x3A,0xA7,0x64,0x63,0x77,0x5F,0x84,0x22,0x8E,0xE5,0xB6,0x45,0xDD,0x46,0xAE,0x0A,0xDD,0x00,0xC2,0x1F,0xBA,0xD9,0xAD,0xC0,0x75,0x62,0xF8,0x95,0x82,0xA2,0x80,0xB1,0x82,0x69,0xFA,0xE1,0xAF,0x7F,0xBC,0x7D,0xE2,0x7C,0x76,0xD5,0xBC,0x2A,0x80,0xFB,0x02,0x03,0x01,0x00,0x01 }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "305C02552D58E9BFF031CD7906505AD59E0E2CE6C2F7F9D2CE556485B1909A92B336C1BCEAC823B7AB3AA76463775F84228EE5B645DD46AE0ADD00C21FBAD9ADC07562F89582A280B18269FAE1AF7FBC7DE27C76D5BC2A80FB0203010001", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("305C02552D58E9BFF031CD7906505AD59E0E2CE6C2F7F9D2CE556485B1909A92B336C1BCEAC823B7AB3AA76463775F84228EE5B645DD46AE0ADD00C21FBAD9ADC07562F89582A280B18269FAE1AF7FBC7DE27C76D5BC2A80FB0203010001", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0xE8,0x06,0x00,0x72,0x02 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); #if NET_2_0 Assert.AreEqual ("02720006E8", x509.GetSerialNumberString (), "GetSerialNumberString"); #else diff --git a/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509CertificateTest.cs b/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509CertificateTest.cs index 3564c54e8e1..80fc1145eb8 100644 --- a/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509CertificateTest.cs +++ b/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509CertificateTest.cs @@ -105,19 +105,19 @@ public void Certificate1 () X509Certificate x509 = new X509Certificate (cert); X509Certificate clone = new X509Certificate (x509); - Assertion.Assert ("Equals", x509.Equals (clone)); - Assertion.Assert ("Equals", clone.Equals (x509)); + Assert.IsTrue (x509.Equals (clone), "Equals"); + Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); - Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); + Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0xD6,0x2F,0x48,0xD0,0x13,0xEE,0x7F,0xB5,0x8B,0x79,0x07,0x45,0x12,0x67,0x0D,0x9C,0x5B,0x3A,0x5D,0xA9 }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "D62F48D013EE7FB58B79074512670D9C5B3A5DA9", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("D62F48D013EE7FB58B79074512670D9C5B3A5DA9", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("03/12/1996 18:38:47", from.ToString (), "GetEffectiveDateString"); @@ -126,26 +126,26 @@ public void Certificate1 () Assert.AreEqual ("02720006E8", x509.GetSerialNumberString (), "GetSerialNumberString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "03/12/1996 10:38:47", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "03/12/1997 10:38:46", x509.GetExpirationDateString ()); + Assert.AreEqual ("03/12/1996 10:38:47", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("03/12/1997 10:38:46", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) Assert.AreEqual ("E806007202", x509.GetSerialNumberString (), "GetSerialNumberString"); #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", -701544240, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=US, O=\"RSA Data Security, Inc.\", OU=Secure Server Certification Authority", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.113549.1.1.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (-701544240, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=US, O=\"RSA Data Security, Inc.\", OU=Secure Server Certification Authority", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x05,0x00 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "0500", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=US, S=California, O=CommerceNet, OU=Server Certification Authority", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("0500", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=US, S=California, O=CommerceNet, OU=Server Certification Authority", x509.GetName (), "GetName"); byte[] pubkey = { 0x30,0x5C,0x02,0x55,0x2D,0x58,0xE9,0xBF,0xF0,0x31,0xCD,0x79,0x06,0x50,0x5A,0xD5,0x9E,0x0E,0x2C,0xE6,0xC2,0xF7,0xF9,0xD2,0xCE,0x55,0x64,0x85,0xB1,0x90,0x9A,0x92,0xB3,0x36,0xC1,0xBC,0xEA,0xC8,0x23,0xB7,0xAB,0x3A,0xA7,0x64,0x63,0x77,0x5F,0x84,0x22,0x8E,0xE5,0xB6,0x45,0xDD,0x46,0xAE,0x0A,0xDD,0x00,0xC2,0x1F,0xBA,0xD9,0xAD,0xC0,0x75,0x62,0xF8,0x95,0x82,0xA2,0x80,0xB1,0x82,0x69,0xFA,0xE1,0xAF,0x7F,0xBC,0x7D,0xE2,0x7C,0x76,0xD5,0xBC,0x2A,0x80,0xFB,0x02,0x03,0x01,0x00,0x01 }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "305C02552D58E9BFF031CD7906505AD59E0E2CE6C2F7F9D2CE556485B1909A92B336C1BCEAC823B7AB3AA76463775F84228EE5B645DD46AE0ADD00C21FBAD9ADC07562F89582A280B18269FAE1AF7FBC7DE27C76D5BC2A80FB0203010001", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("305C02552D58E9BFF031CD7906505AD59E0E2CE6C2F7F9D2CE556485B1909A92B336C1BCEAC823B7AB3AA76463775F84228EE5B645DD46AE0ADD00C21FBAD9ADC07562F89582A280B18269FAE1AF7FBC7DE27C76D5BC2A80FB0203010001", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0xE8,0x06,0x00,0x72,0x02 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x53,0x3D,0x43,0x61,0x6C,0x69,0x66,0x6F,0x72,0x6E,0x69,0x61,0x2C,0x20,0x4F,0x3D,0x43,0x6F,0x6D,0x6D,0x65,0x72,0x63,0x65,0x4E,0x65,0x74,0x2C,0x20,0x4F,0x55,0x3D,0x53,0x65,0x72,0x76,0x65,0x72,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68, 0x6F,0x72,0x69,0x74,0x79,0x0D,0x0A,0x09,0x49,0x73,0x73,0x75,0x69,0x6E,0x67,0x20,0x43,0x41,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x22,0x52,0x53,0x41,0x20,0x44,0x61,0x74,0x61,0x20,0x53,0x65,0x63,0x75,0x72,0x69,0x74,0x79,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x22,0x2C,0x20,0x4F,0x55,0x3D,0x53,0x65,0x63,0x75,0x72,0x65,0x20,0x53,0x65,0x72,0x76,0x65,0x72,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x0D,0x0A,0x09,0x4B, 0x65,0x79,0x20,0x41,0x6C,0x67,0x6F,0x72,0x69,0x74,0x68,0x6D,0x3A,0x20,0x20,0x31,0x2E,0x32,0x2E,0x38,0x34,0x30,0x2E,0x31,0x31,0x33,0x35,0x34,0x39,0x2E,0x31,0x2E,0x31,0x2E,0x31,0x0D,0x0A,0x09,0x53,0x65,0x72,0x69,0x61,0x6C,0x20,0x4E,0x75,0x6D,0x62,0x65,0x72,0x3A,0x20,0x20,0x45,0x38,0x30,0x36,0x30,0x30,0x37,0x32,0x30,0x32,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x6F,0x67,0x72,0x69,0x74,0x68,0x6D,0x20,0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x3A,0x20,0x20,0x30,0x35,0x30,0x30,0x0D,0x0A, @@ -153,10 +153,10 @@ public void Certificate1 () 0x36,0x34,0x36,0x33,0x37,0x37,0x35,0x46,0x38,0x34,0x32,0x32,0x38,0x45,0x45,0x35,0x42,0x36,0x34,0x35,0x44,0x44,0x34,0x36,0x41,0x45,0x30,0x41,0x44,0x44,0x30,0x30,0x43,0x32,0x31,0x46,0x42,0x41,0x44,0x39,0x41,0x44,0x43,0x30,0x37,0x35,0x36,0x32,0x46,0x38,0x39,0x35,0x38,0x32,0x41,0x32,0x38,0x30,0x42,0x31,0x38,0x32,0x36,0x39,0x46,0x41,0x45,0x31,0x41,0x46,0x37,0x46,0x42,0x43,0x37,0x44,0x45,0x32,0x37,0x43,0x37,0x36,0x44,0x35,0x42,0x43,0x32,0x41,0x38,0x30,0x46,0x42,0x30,0x32,0x30,0x33,0x30,0x31,0x30,0x30, 0x30,0x31,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "OU=Secure Server Certification Authority, O=\"RSA Data Security, Inc.\", C=US", x509.Issuer); - Assertion.AssertEquals ("Subject", "OU=Server Certification Authority, O=CommerceNet, S=California, C=US", x509.Subject); + Assert.AreEqual ("OU=Secure Server Certification Authority, O=\"RSA Data Security, Inc.\", C=US", x509.Issuer, "Issuer"); + Assert.AreEqual ("OU=Server Certification Authority, O=CommerceNet, S=California, C=US", x509.Subject, "Subject"); #endif } @@ -178,19 +178,19 @@ public void Certificate2 () X509Certificate x509 = new X509Certificate (cert); X509Certificate clone = new X509Certificate (x509); - Assertion.Assert ("Equals", x509.Equals (clone)); - Assertion.Assert ("Equals", clone.Equals (x509)); + Assert.IsTrue (x509.Equals (clone), "Equals"); + Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); - Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); + Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0x9E,0x87,0x80,0x3E,0xC5,0x68,0x9A,0xEF,0xE7,0x7F,0x92,0xF9,0x1A,0xBF,0xA7,0x46,0x7C,0x76,0xED,0x02 }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "9E87803EC5689AEFE77F92F91ABFA7467C76ED02", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("9E87803EC5689AEFE77F92F91ABFA7467C76ED02", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("01/18/1996 21:03:52", from.ToString (), "GetEffectiveDateString"); @@ -198,27 +198,27 @@ public void Certificate2 () Assert.AreEqual ("01/16/2001 21:03:52", until.ToString (), "GetExpirationDateString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "01/18/1996 13:03:52", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "01/16/2001 13:03:52", x509.GetExpirationDateString ()); + Assert.AreEqual ("01/18/1996 13:03:52", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("01/16/2001 13:03:52", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", -1635286978, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=US, O=AT&T, OU=Directory Services", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.113549.1.1.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (-1635286978, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=US, O=AT&T, OU=Directory Services", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x05,0x00 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "0500", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=US, O=AT&T, OU=Directory Services", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("0500", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=US, O=AT&T, OU=Directory Services", x509.GetName (), "GetName"); byte[] pubkey = { 0x30,0x81,0x87,0x02,0x81,0x81,0x00,0x87,0x64,0x72,0x89,0x0B,0x20,0x8F,0x87,0x27,0xAC,0xC6,0x22,0xFE,0x00,0x40,0x69,0x48,0xAF,0xC6,0x86,0xCD,0x23,0x33,0xE3,0x11,0xC5,0x31,0x1A,0x1F,0x7E,0x9E,0x92,0x13,0xB6,0xA2,0xAC,0xE3,0xB0,0x1F,0x2A,0x07,0x6C,0xB6,0xD4,0xDE,0x4B,0xFA,0xF1,0xA2,0xA0,0x7D,0xCE,0x4B,0xBE,0xBE,0x26,0x48,0x09,0x8C,0x85,0x11,0xDE,0xCB,0x22,0xE7,0xC2,0xEE,0x44,0x51,0xFE,0x67,0xD5,0x5B,0x5A,0xE0,0x16,0x37,0x54,0x04,0xB8,0x3B,0x32,0x12,0x94,0x83,0x9E,0xB1,0x4D,0x80,0x6C,0xA4,0xA9,0x76,0xAC, 0xB8,0xA4,0x97,0xF7,0xAB,0x0B,0x6C,0xA5,0x43,0xBA,0x6E,0x4F,0xC5,0x4E,0x00,0x30,0x16,0x3C,0x3F,0x99,0x14,0xDA,0xA2,0x20,0x08,0x8B,0xBA,0xED,0x76,0xAC,0x97,0x00,0xD5,0x6D,0x02,0x01,0x0F }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "30818702818100876472890B208F8727ACC622FE00406948AFC686CD2333E311C5311A1F7E9E9213B6A2ACE3B01F2A076CB6D4DE4BFAF1A2A07DCE4BBEBE2648098C8511DECB22E7C2EE4451FE67D55B5AE016375404B83B321294839EB14D806CA4A976ACB8A497F7AB0B6CA543BA6E4FC54E0030163C3F9914DAA220088BBAED76AC9700D56D02010F", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("30818702818100876472890B208F8727ACC622FE00406948AFC686CD2333E311C5311A1F7E9E9213B6A2ACE3B01F2A076CB6D4DE4BFAF1A2A07DCE4BBEBE2648098C8511DECB22E7C2EE4451FE67D55B5AE016375404B83B321294839EB14D806CA4A976ACB8A497F7AB0B6CA543BA6E4FC54E0030163C3F9914DAA220088BBAED76AC9700D56D02010F", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0x00 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); - Assertion.AssertEquals ("GetSerialNumberString", "00", x509.GetSerialNumberString ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); + Assert.AreEqual ("00", x509.GetSerialNumberString (), "GetSerialNumberString"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x41,0x54,0x26,0x54,0x2C,0x20,0x4F,0x55,0x3D,0x44,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x0D,0x0A,0x09,0x49,0x73,0x73,0x75,0x69,0x6E,0x67,0x20,0x43,0x41,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x41,0x54,0x26,0x54, 0x2C,0x20,0x4F,0x55,0x3D,0x44,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x67,0x6F,0x72,0x69,0x74,0x68,0x6D,0x3A,0x20,0x20,0x31,0x2E,0x32,0x2E,0x38,0x34,0x30,0x2E,0x31,0x31,0x33,0x35,0x34,0x39,0x2E,0x31,0x2E,0x31,0x2E,0x31,0x0D,0x0A,0x09,0x53,0x65,0x72,0x69,0x61,0x6C,0x20,0x4E,0x75,0x6D,0x62,0x65,0x72,0x3A,0x20,0x20,0x30,0x30,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x6F,0x67,0x72,0x69,0x74,0x68,0x6D,0x20, 0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x3A,0x20,0x20,0x30,0x35,0x30,0x30,0x0D,0x0A,0x09,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x4B,0x65,0x79,0x3A,0x20,0x20,0x33,0x30,0x38,0x31,0x38,0x37,0x30,0x32,0x38,0x31,0x38,0x31,0x30,0x30,0x38,0x37,0x36,0x34,0x37,0x32,0x38,0x39,0x30,0x42,0x32,0x30,0x38,0x46,0x38,0x37,0x32,0x37,0x41,0x43,0x43,0x36,0x32,0x32,0x46,0x45,0x30,0x30,0x34,0x30,0x36,0x39,0x34,0x38,0x41,0x46,0x43,0x36,0x38,0x36,0x43,0x44,0x32,0x33,0x33,0x33,0x45,0x33,0x31,0x31,0x43,0x35,0x33, @@ -226,10 +226,10 @@ public void Certificate2 () 0x37,0x35,0x34,0x30,0x34,0x42,0x38,0x33,0x42,0x33,0x32,0x31,0x32,0x39,0x34,0x38,0x33,0x39,0x45,0x42,0x31,0x34,0x44,0x38,0x30,0x36,0x43,0x41,0x34,0x41,0x39,0x37,0x36,0x41,0x43,0x42,0x38,0x41,0x34,0x39,0x37,0x46,0x37,0x41,0x42,0x30,0x42,0x36,0x43,0x41,0x35,0x34,0x33,0x42,0x41,0x36,0x45,0x34,0x46,0x43,0x35,0x34,0x45,0x30,0x30,0x33,0x30,0x31,0x36,0x33,0x43,0x33,0x46,0x39,0x39,0x31,0x34,0x44,0x41,0x41,0x32,0x32,0x30,0x30,0x38,0x38,0x42,0x42,0x41,0x45,0x44,0x37,0x36,0x41,0x43,0x39,0x37,0x30,0x30,0x44, 0x35,0x36,0x44,0x30,0x32,0x30,0x31,0x30,0x46,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "OU=Directory Services, O=AT&T, C=US", x509.Issuer); - Assertion.AssertEquals ("Subject", "OU=Directory Services, O=AT&T, C=US", x509.Subject); + Assert.AreEqual ("OU=Directory Services, O=AT&T, C=US", x509.Issuer, "Issuer"); + Assert.AreEqual ("OU=Directory Services, O=AT&T, C=US", x509.Subject, "Subject"); #endif } @@ -254,19 +254,19 @@ public void Certificate3 () X509Certificate x509 = new X509Certificate (cert); X509Certificate clone = new X509Certificate (x509); - Assertion.Assert ("Equals", x509.Equals (clone)); - Assertion.Assert ("Equals", clone.Equals (x509)); + Assert.IsTrue (x509.Equals (clone), "Equals"); + Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); - Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); + Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0x39,0x5F,0xBB,0xFC,0x14,0x89,0x33,0x27,0x76,0x89,0xB7,0x59,0x3A,0x7D,0x1C,0xFF,0xF1,0x56,0xF1,0x62 }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "395FBBFC148933277689B7593A7D1CFFF156F162", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("395FBBFC148933277689B7593A7D1CFFF156F162", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("08/07/1996 00:00:00", from.ToString (), "GetEffectiveDateString"); @@ -275,26 +275,26 @@ public void Certificate3 () Assert.AreEqual ("0353D78BDB3E16158055C4054002734D0C20F80D88005F657AACBA86BD1CD7E4", x509.GetSerialNumberString (), "GetSerialNumberString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "08/06/1996 16:00:00", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "08/31/1996 15:59:59", x509.GetExpirationDateString ()); + Assert.AreEqual ("08/06/1996 16:00:00", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("08/31/1996 15:59:59", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) Assert.AreEqual ("E4D71CBD86BAAC7A655F00880DF8200C4D73024005C4558015163EDB8BD75303", x509.GetSerialNumberString (), "GetSerialNumberString"); #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", 962575356, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=US, O=CCA - Unique ID, CN=Brand Name:Product Type", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.113549.1.1.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (962575356, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=US, O=CCA - Unique ID, CN=Brand Name:Product Type", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x05,0x00 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "0500", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=US, O=BrandID, OU=Issuing Financial Institution, CN=\"0+WKJx+wYEZabSSPVX9kLsnx92s=\"", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("0500", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=US, O=BrandID, OU=Issuing Financial Institution, CN=\"0+WKJx+wYEZabSSPVX9kLsnx92s=\"", x509.GetName (), "GetName"); byte[] pubkey = { 0x30,0x48,0x02,0x41,0x00,0xAC,0xC4,0x0E,0x05,0x25,0xBC,0xEA,0xEF,0x0C,0x22,0x7F,0xC4,0x0C,0x4A,0x69,0x31,0x00,0xF9,0x3F,0xE9,0xE1,0x6C,0x54,0x97,0x77,0x4E,0x18,0xC6,0x4A,0x95,0xE0,0xD4,0x58,0x29,0x5C,0x17,0x5D,0x1D,0x1E,0x56,0xBC,0x49,0x3D,0xE0,0xF9,0x9F,0xBB,0x01,0xF9,0x86,0xB6,0xA6,0x95,0xDD,0xE1,0x04,0x32,0x01,0x52,0x4E,0x8F,0x86,0x30,0xF7,0x02,0x03,0x01,0x00,0x01 }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "3048024100ACC40E0525BCEAEF0C227FC40C4A693100F93FE9E16C5497774E18C64A95E0D458295C175D1D1E56BC493DE0F99FBB01F986B6A695DDE1043201524E8F8630F70203010001", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("3048024100ACC40E0525BCEAEF0C227FC40C4A693100F93FE9E16C5497774E18C64A95E0D458295C175D1D1E56BC493DE0F99FBB01F986B6A695DDE1043201524E8F8630F70203010001", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0xE4,0xD7,0x1C,0xBD,0x86,0xBA,0xAC,0x7A,0x65,0x5F,0x00,0x88,0x0D,0xF8,0x20,0x0C,0x4D,0x73,0x02,0x40,0x05,0xC4,0x55,0x80,0x15,0x16,0x3E,0xDB,0x8B,0xD7,0x53,0x03 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x42,0x72,0x61,0x6E,0x64,0x49,0x44,0x2C,0x20,0x4F,0x55,0x3D,0x49,0x73,0x73,0x75,0x69,0x6E,0x67,0x20,0x46,0x69,0x6E,0x61,0x6E,0x63,0x69,0x61,0x6C,0x20,0x49,0x6E,0x73,0x74,0x69,0x74,0x75,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x43,0x4E,0x3D,0x22,0x30,0x2B,0x57,0x4B,0x4A,0x78,0x2B,0x77, 0x59,0x45,0x5A,0x61,0x62,0x53,0x53,0x50,0x56,0x58,0x39,0x6B,0x4C,0x73,0x6E,0x78,0x39,0x32,0x73,0x3D,0x22,0x0D,0x0A,0x09,0x49,0x73,0x73,0x75,0x69,0x6E,0x67,0x20,0x43,0x41,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x43,0x43,0x41,0x20,0x2D,0x20,0x55,0x6E,0x69,0x71,0x75,0x65,0x20,0x49,0x44,0x2C,0x20,0x43,0x4E,0x3D,0x42,0x72,0x61,0x6E,0x64,0x20,0x4E,0x61,0x6D,0x65,0x3A,0x50,0x72,0x6F,0x64,0x75,0x63,0x74,0x20,0x54,0x79,0x70,0x65,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x67,0x6F,0x72, 0x69,0x74,0x68,0x6D,0x3A,0x20,0x20,0x31,0x2E,0x32,0x2E,0x38,0x34,0x30,0x2E,0x31,0x31,0x33,0x35,0x34,0x39,0x2E,0x31,0x2E,0x31,0x2E,0x31,0x0D,0x0A,0x09,0x53,0x65,0x72,0x69,0x61,0x6C,0x20,0x4E,0x75,0x6D,0x62,0x65,0x72,0x3A,0x20,0x20,0x45,0x34,0x44,0x37,0x31,0x43,0x42,0x44,0x38,0x36,0x42,0x41,0x41,0x43,0x37,0x41,0x36,0x35,0x35,0x46,0x30,0x30,0x38,0x38,0x30,0x44,0x46,0x38,0x32,0x30,0x30,0x43,0x34,0x44,0x37,0x33,0x30,0x32,0x34,0x30,0x30,0x35,0x43,0x34,0x35,0x35,0x38,0x30,0x31,0x35,0x31,0x36,0x33,0x45, @@ -302,10 +302,10 @@ public void Certificate3 () 0x33,0x31,0x30,0x30,0x46,0x39,0x33,0x46,0x45,0x39,0x45,0x31,0x36,0x43,0x35,0x34,0x39,0x37,0x37,0x37,0x34,0x45,0x31,0x38,0x43,0x36,0x34,0x41,0x39,0x35,0x45,0x30,0x44,0x34,0x35,0x38,0x32,0x39,0x35,0x43,0x31,0x37,0x35,0x44,0x31,0x44,0x31,0x45,0x35,0x36,0x42,0x43,0x34,0x39,0x33,0x44,0x45,0x30,0x46,0x39,0x39,0x46,0x42,0x42,0x30,0x31,0x46,0x39,0x38,0x36,0x42,0x36,0x41,0x36,0x39,0x35,0x44,0x44,0x45,0x31,0x30,0x34,0x33,0x32,0x30,0x31,0x35,0x32,0x34,0x45,0x38,0x46,0x38,0x36,0x33,0x30,0x46,0x37,0x30,0x32, 0x30,0x33,0x30,0x31,0x30,0x30,0x30,0x31,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "CN=Brand Name:Product Type, O=CCA - Unique ID, C=US", x509.Issuer); - Assertion.AssertEquals ("Subject", "CN=\"0+WKJx+wYEZabSSPVX9kLsnx92s=\", OU=Issuing Financial Institution, O=BrandID, C=US", x509.Subject); + Assert.AreEqual ("CN=Brand Name:Product Type, O=CCA - Unique ID, C=US", x509.Issuer, "Issuer"); + Assert.AreEqual ("CN=\"0+WKJx+wYEZabSSPVX9kLsnx92s=\", OU=Issuing Financial Institution, O=BrandID, C=US", x509.Subject, "Subject"); #endif } @@ -328,19 +328,19 @@ public void Certificate4 () X509Certificate x509 = new X509Certificate (cert); X509Certificate clone = new X509Certificate (x509); - Assertion.Assert ("Equals", x509.Equals (clone)); - Assertion.Assert ("Equals", clone.Equals (x509)); + Assert.IsTrue (x509.Equals (clone), "Equals"); + Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); - Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); + Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0x0D,0x97,0x44,0x61,0x70,0x37,0x13,0xCB,0x74,0x93,0x2D,0x2A,0x75,0xAC,0xBC,0x71,0x4B,0x28,0x12,0x66 }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "0D974461703713CB74932D2A75ACBC714B281266", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("0D974461703713CB74932D2A75ACBC714B281266", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("11/09/1994 23:54:17", from.ToString (), "GetEffectiveDateString"); @@ -349,27 +349,27 @@ public void Certificate4 () Assert.AreEqual ("0241000001", x509.GetSerialNumberString (), "GetSerialNumberString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "11/09/1994 15:54:17", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "12/31/1999 15:54:17", x509.GetExpirationDateString ()); + Assert.AreEqual ("11/09/1994 15:54:17", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("12/31/1999 15:54:17", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) Assert.AreEqual ("0100004102", x509.GetSerialNumberString (), "GetSerialNumberString"); #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", 228017249, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=US, O=\"RSA Data Security, Inc.\", OU=Secure Server Certification Authority", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.113549.1.1.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (228017249, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=US, O=\"RSA Data Security, Inc.\", OU=Secure Server Certification Authority", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x05,0x00 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "0500", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=US, O=\"RSA Data Security, Inc.\", OU=Secure Server Certification Authority", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("0500", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=US, O=\"RSA Data Security, Inc.\", OU=Secure Server Certification Authority", x509.GetName (), "GetName"); byte[] pubkey = { 0x30,0x81,0x85,0x02,0x7E,0x00,0x92,0xCE,0x7A,0xC1,0xAE,0x83,0x3E,0x5A,0xAA,0x89,0x83,0x57,0xAC,0x25,0x01,0x76,0x0C,0xAD,0xAE,0x8E,0x2C,0x37,0xCE,0xEB,0x35,0x78,0x64,0x54,0x03,0xE5,0x84,0x40,0x51,0xC9,0xBF,0x8F,0x08,0xE2,0x8A,0x82,0x08,0xD2,0x16,0x86,0x37,0x55,0xE9,0xB1,0x21,0x02,0xAD,0x76,0x68,0x81,0x9A,0x05,0xA2,0x4B,0xC9,0x4B,0x25,0x66,0x22,0x56,0x6C,0x88,0x07,0x8F,0xF7,0x81,0x59,0x6D,0x84,0x07,0x65,0x70,0x13,0x71,0x76,0x3E,0x9B,0x77,0x4C,0xE3,0x50,0x89,0x56,0x98,0x48,0xB9,0x1D,0xA7,0x29,0x1A,0x13, 0x2E,0x4A,0x11,0x59,0x9C,0x1E,0x15,0xD5,0x49,0x54,0x2C,0x73,0x3A,0x69,0x82,0xB1,0x97,0x39,0x9C,0x6D,0x70,0x67,0x48,0xE5,0xDD,0x2D,0xD6,0xC8,0x1E,0x7B,0x02,0x03,0x01,0x00,0x01 }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "308185027E0092CE7AC1AE833E5AAA898357AC2501760CADAE8E2C37CEEB3578645403E5844051C9BF8F08E28A8208D216863755E9B12102AD7668819A05A24BC94B256622566C88078FF781596D840765701371763E9B774CE35089569848B91DA7291A132E4A11599C1E15D549542C733A6982B197399C6D706748E5DD2DD6C81E7B0203010001", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("308185027E0092CE7AC1AE833E5AAA898357AC2501760CADAE8E2C37CEEB3578645403E5844051C9BF8F08E28A8208D216863755E9B12102AD7668819A05A24BC94B256622566C88078FF781596D840765701371763E9B774CE35089569848B91DA7291A132E4A11599C1E15D549542C733A6982B197399C6D706748E5DD2DD6C81E7B0203010001", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0x01,0x00,0x00,0x41,0x02 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x22,0x52,0x53,0x41,0x20,0x44,0x61,0x74,0x61,0x20,0x53,0x65,0x63,0x75,0x72,0x69,0x74,0x79,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x22,0x2C,0x20,0x4F,0x55,0x3D,0x53,0x65,0x63,0x75,0x72,0x65,0x20,0x53,0x65,0x72,0x76,0x65,0x72,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69, 0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x0D,0x0A,0x09,0x49,0x73,0x73,0x75,0x69,0x6E,0x67,0x20,0x43,0x41,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x22,0x52,0x53,0x41,0x20,0x44,0x61,0x74,0x61,0x20,0x53,0x65,0x63,0x75,0x72,0x69,0x74,0x79,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x22,0x2C,0x20,0x4F,0x55,0x3D,0x53,0x65,0x63,0x75,0x72,0x65,0x20,0x53,0x65,0x72,0x76,0x65,0x72,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72, 0x69,0x74,0x79,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x67,0x6F,0x72,0x69,0x74,0x68,0x6D,0x3A,0x20,0x20,0x31,0x2E,0x32,0x2E,0x38,0x34,0x30,0x2E,0x31,0x31,0x33,0x35,0x34,0x39,0x2E,0x31,0x2E,0x31,0x2E,0x31,0x0D,0x0A,0x09,0x53,0x65,0x72,0x69,0x61,0x6C,0x20,0x4E,0x75,0x6D,0x62,0x65,0x72,0x3A,0x20,0x20,0x30,0x31,0x30,0x30,0x30,0x30,0x34,0x31,0x30,0x32,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x6F,0x67,0x72,0x69,0x74,0x68,0x6D,0x20,0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x3A,0x20, @@ -377,10 +377,10 @@ public void Certificate4 () 0x39,0x42,0x46,0x38,0x46,0x30,0x38,0x45,0x32,0x38,0x41,0x38,0x32,0x30,0x38,0x44,0x32,0x31,0x36,0x38,0x36,0x33,0x37,0x35,0x35,0x45,0x39,0x42,0x31,0x32,0x31,0x30,0x32,0x41,0x44,0x37,0x36,0x36,0x38,0x38,0x31,0x39,0x41,0x30,0x35,0x41,0x32,0x34,0x42,0x43,0x39,0x34,0x42,0x32,0x35,0x36,0x36,0x32,0x32,0x35,0x36,0x36,0x43,0x38,0x38,0x30,0x37,0x38,0x46,0x46,0x37,0x38,0x31,0x35,0x39,0x36,0x44,0x38,0x34,0x30,0x37,0x36,0x35,0x37,0x30,0x31,0x33,0x37,0x31,0x37,0x36,0x33,0x45,0x39,0x42,0x37,0x37,0x34,0x43,0x45, 0x33,0x35,0x30,0x38,0x39,0x35,0x36,0x39,0x38,0x34,0x38,0x42,0x39,0x31,0x44,0x41,0x37,0x32,0x39,0x31,0x41,0x31,0x33,0x32,0x45,0x34,0x41,0x31,0x31,0x35,0x39,0x39,0x43,0x31,0x45,0x31,0x35,0x44,0x35,0x34,0x39,0x35,0x34,0x32,0x43,0x37,0x33,0x33,0x41,0x36,0x39,0x38,0x32,0x42,0x31,0x39,0x37,0x33,0x39,0x39,0x43,0x36,0x44,0x37,0x30,0x36,0x37,0x34,0x38,0x45,0x35,0x44,0x44,0x32,0x44,0x44,0x36,0x43,0x38,0x31,0x45,0x37,0x42,0x30,0x32,0x30,0x33,0x30,0x31,0x30,0x30,0x30,0x31,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "OU=Secure Server Certification Authority, O=\"RSA Data Security, Inc.\", C=US", x509.Issuer); - Assertion.AssertEquals ("Subject", "OU=Secure Server Certification Authority, O=\"RSA Data Security, Inc.\", C=US", x509.Subject); + Assert.AreEqual ("OU=Secure Server Certification Authority, O=\"RSA Data Security, Inc.\", C=US", x509.Issuer, "Issuer"); + Assert.AreEqual ("OU=Secure Server Certification Authority, O=\"RSA Data Security, Inc.\", C=US", x509.Subject, "Subject"); #endif } @@ -412,19 +412,19 @@ public void Certificate5 () X509Certificate x509 = new X509Certificate (cert); X509Certificate clone = new X509Certificate (x509); - Assertion.Assert ("Equals", x509.Equals (clone)); - Assertion.Assert ("Equals", clone.Equals (x509)); + Assert.IsTrue (x509.Equals (clone), "Equals"); + Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); - Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); + Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0x63,0xDB,0x7A,0x42,0x67,0x39,0x75,0x39,0x2A,0xC6,0xA4,0xFA,0xE3,0xD7,0x84,0x46,0xB4,0x67,0xC3,0x26 }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "63DB7A42673975392AC6A4FAE3D78446B467C326", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("63DB7A42673975392AC6A4FAE3D78446B467C326", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("07/15/1997 00:00:00", from.ToString (), "GetEffectiveDateString"); @@ -432,28 +432,28 @@ public void Certificate5 () Assert.AreEqual ("07/15/2004 00:00:00", until.ToString (), "GetExpirationDateString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "07/14/1997 16:00:00", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "07/14/2004 16:00:00", x509.GetExpirationDateString ()); + Assert.AreEqual ("07/14/1997 16:00:00", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("07/14/2004 16:00:00", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", 1675328066, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=US, O=SET Root", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.113549.1.1.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (1675328066, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=US, O=SET Root", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x05,0x00 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "0500", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=US, O=SET Root", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("0500", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=US, O=SET Root", x509.GetName (), "GetName"); byte[] pubkey = { 0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xD4,0xDC,0x3E,0xBA,0xE1,0x94,0xF7,0xBE,0xCD,0xED,0x21,0x77,0xCF,0xDA,0x88,0x58,0x51,0x0E,0x8F,0xF4,0xDA,0x00,0x14,0x1E,0x0D,0xA7,0xAD,0xB6,0x96,0x5A,0xC6,0xD3,0xEC,0x25,0xED,0xD8,0x43,0x0B,0x6E,0x7F,0x3F,0x9E,0x1E,0x74,0xA0,0x1E,0x97,0x76,0x30,0xCA,0x6F,0x0A,0x63,0xC0,0xA3,0x31,0x40,0x25,0x80,0xB8,0xBD,0x28,0xEB,0x7D,0x75,0x0B,0x4E,0x41,0x34,0xC4,0x20,0x00,0xC2,0xCB,0xF4,0x9A,0x20,0x00,0x58,0xD9,0xF4,0x40,0x13,0x18,0x77,0x0C,0xB5,0x04,0xDE,0xB7,0xB6,0x43, 0x8B,0xA4,0xCC,0x36,0x76,0x79,0xC5,0x0B,0x17,0xCB,0x7E,0x88,0xA1,0x33,0xB0,0xD3,0x34,0x27,0xBF,0x3B,0x61,0xDA,0xC5,0x20,0xEB,0xF9,0x94,0x9A,0x8B,0x79,0xB2,0xA8,0x8E,0xCB,0xC1,0xD9,0x94,0x4A,0x99,0x66,0x50,0x55,0xB2,0x83,0x28,0x7D,0x22,0x3D,0xEC,0xDC,0xA3,0xE8,0x39,0xDB,0x83,0x54,0xC9,0x89,0xA9,0xDF,0x59,0x52,0x9F,0x7A,0xEF,0x7C,0x11,0x62,0x52,0xEC,0xE6,0x67,0xBA,0x3D,0xEA,0xAB,0x47,0xDB,0xE4,0xF4,0x1F,0x73,0xC3,0x3D,0xEC,0x7E,0x84,0x7D,0x2F,0x29,0xFE,0x6C,0x17,0x3F,0x75,0x6D,0x56,0x6E,0xC0,0x4E, 0xB5,0xBF,0x2A,0x20,0x8A,0xE4,0x57,0xAE,0xC0,0x2E,0x68,0xC9,0x09,0xCF,0x85,0x77,0x0A,0xEF,0x3A,0x37,0xCB,0x60,0x4C,0x45,0x73,0x7F,0x90,0x3E,0x86,0x1D,0xFA,0xC3,0xFC,0x50,0x8A,0xB2,0xC5,0x8A,0x34,0xF0,0xF2,0x43,0xEE,0x3C,0x56,0xBA,0x24,0xE9,0xE0,0xA5,0x87,0x1E,0x7C,0x30,0x33,0x77,0xFD,0x5D,0xE0,0x57,0x0D,0x6C,0x19,0x39,0x02,0x03,0x01,0x00,0x01 }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "3082010A0282010100D4DC3EBAE194F7BECDED2177CFDA8858510E8FF4DA00141E0DA7ADB6965AC6D3EC25EDD8430B6E7F3F9E1E74A01E977630CA6F0A63C0A331402580B8BD28EB7D750B4E4134C42000C2CBF49A200058D9F4401318770CB504DEB7B6438BA4CC367679C50B17CB7E88A133B0D33427BF3B61DAC520EBF9949A8B79B2A88ECBC1D9944A99665055B283287D223DECDCA3E839DB8354C989A9DF59529F7AEF7C116252ECE667BA3DEAAB47DBE4F41F73C33DEC7E847D2F29FE6C173F756D566EC04EB5BF2A208AE457AEC02E68C909CF85770AEF3A37CB604C45737F903E861DFAC3FC508AB2C58A34F0F243EE3C56BA24E9E0A5871E7C303377FD5DE0570D6C19390203010001", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("3082010A0282010100D4DC3EBAE194F7BECDED2177CFDA8858510E8FF4DA00141E0DA7ADB6965AC6D3EC25EDD8430B6E7F3F9E1E74A01E977630CA6F0A63C0A331402580B8BD28EB7D750B4E4134C42000C2CBF49A200058D9F4401318770CB504DEB7B6438BA4CC367679C50B17CB7E88A133B0D33427BF3B61DAC520EBF9949A8B79B2A88ECBC1D9944A99665055B283287D223DECDCA3E839DB8354C989A9DF59529F7AEF7C116252ECE667BA3DEAAB47DBE4F41F73C33DEC7E847D2F29FE6C173F756D566EC04EB5BF2A208AE457AEC02E68C909CF85770AEF3A37CB604C45737F903E861DFAC3FC508AB2C58A34F0F243EE3C56BA24E9E0A5871E7C303377FD5DE0570D6C19390203010001", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0x6A }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); - Assertion.AssertEquals ("GetSerialNumberString", "6A", x509.GetSerialNumberString ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); + Assert.AreEqual ("6A", x509.GetSerialNumberString (), "GetSerialNumberString"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x53,0x45,0x54,0x20,0x52,0x6F,0x6F,0x74,0x0D,0x0A,0x09,0x49,0x73,0x73,0x75,0x69,0x6E,0x67,0x20,0x43,0x41,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x53,0x45,0x54,0x20,0x52,0x6F,0x6F,0x74,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x67,0x6F,0x72,0x69,0x74,0x68, 0x6D,0x3A,0x20,0x20,0x31,0x2E,0x32,0x2E,0x38,0x34,0x30,0x2E,0x31,0x31,0x33,0x35,0x34,0x39,0x2E,0x31,0x2E,0x31,0x2E,0x31,0x0D,0x0A,0x09,0x53,0x65,0x72,0x69,0x61,0x6C,0x20,0x4E,0x75,0x6D,0x62,0x65,0x72,0x3A,0x20,0x20,0x36,0x41,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x6F,0x67,0x72,0x69,0x74,0x68,0x6D,0x20,0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x3A,0x20,0x20,0x30,0x35,0x30,0x30,0x0D,0x0A,0x09,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x4B,0x65,0x79,0x3A,0x20,0x20,0x33,0x30,0x38,0x32,0x30, 0x31,0x30,0x41,0x30,0x32,0x38,0x32,0x30,0x31,0x30,0x31,0x30,0x30,0x44,0x34,0x44,0x43,0x33,0x45,0x42,0x41,0x45,0x31,0x39,0x34,0x46,0x37,0x42,0x45,0x43,0x44,0x45,0x44,0x32,0x31,0x37,0x37,0x43,0x46,0x44,0x41,0x38,0x38,0x35,0x38,0x35,0x31,0x30,0x45,0x38,0x46,0x46,0x34,0x44,0x41,0x30,0x30,0x31,0x34,0x31,0x45,0x30,0x44,0x41,0x37,0x41,0x44,0x42,0x36,0x39,0x36,0x35,0x41,0x43,0x36,0x44,0x33,0x45,0x43,0x32,0x35,0x45,0x44,0x44,0x38,0x34,0x33,0x30,0x42,0x36,0x45,0x37,0x46,0x33,0x46,0x39,0x45,0x31,0x45,0x37, @@ -463,10 +463,10 @@ public void Certificate5 () 0x46,0x32,0x41,0x32,0x30,0x38,0x41,0x45,0x34,0x35,0x37,0x41,0x45,0x43,0x30,0x32,0x45,0x36,0x38,0x43,0x39,0x30,0x39,0x43,0x46,0x38,0x35,0x37,0x37,0x30,0x41,0x45,0x46,0x33,0x41,0x33,0x37,0x43,0x42,0x36,0x30,0x34,0x43,0x34,0x35,0x37,0x33,0x37,0x46,0x39,0x30,0x33,0x45,0x38,0x36,0x31,0x44,0x46,0x41,0x43,0x33,0x46,0x43,0x35,0x30,0x38,0x41,0x42,0x32,0x43,0x35,0x38,0x41,0x33,0x34,0x46,0x30,0x46,0x32,0x34,0x33,0x45,0x45,0x33,0x43,0x35,0x36,0x42,0x41,0x32,0x34,0x45,0x39,0x45,0x30,0x41,0x35,0x38,0x37,0x31, 0x45,0x37,0x43,0x33,0x30,0x33,0x33,0x37,0x37,0x46,0x44,0x35,0x44,0x45,0x30,0x35,0x37,0x30,0x44,0x36,0x43,0x31,0x39,0x33,0x39,0x30,0x32,0x30,0x33,0x30,0x31,0x30,0x30,0x30,0x31,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "O=SET Root, C=US", x509.Issuer); - Assertion.AssertEquals ("Subject", "O=SET Root, C=US", x509.Subject); + Assert.AreEqual ("O=SET Root, C=US", x509.Issuer, "Issuer"); + Assert.AreEqual ("O=SET Root, C=US", x509.Subject, "Subject"); #endif } @@ -487,19 +487,19 @@ public void Certificate6 () X509Certificate x509 = new X509Certificate (cert); X509Certificate clone = new X509Certificate (x509); - Assertion.Assert ("Equals", x509.Equals (clone)); - Assertion.Assert ("Equals", clone.Equals (x509)); + Assert.IsTrue (x509.Equals (clone), "Equals"); + Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); - Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); + Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0x95,0xD4,0xE2,0xEA,0x34,0x0B,0xBF,0x33,0x27,0x1C,0x1F,0xBA,0x8B,0x52,0x9F,0x17,0x72,0x1F,0x8A,0x99 }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "95D4E2EA340BBF33271C1FBA8B529F17721F8A99", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("95D4E2EA340BBF33271C1FBA8B529F17721F8A99", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("01/18/1996 21:03:52", from.ToString (), "GetEffectiveDateString"); @@ -507,27 +507,27 @@ public void Certificate6 () Assert.AreEqual ("01/16/2001 21:03:52", until.ToString (), "GetExpirationDateString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "01/18/1996 13:03:52", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "01/16/2001 13:03:52", x509.GetExpirationDateString ()); + Assert.AreEqual ("01/18/1996 13:03:52", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("01/16/2001 13:03:52", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", -1781210390, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=US, O=AT&T, OU=Directory Services", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.113549.1.1.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (-1781210390, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=US, O=AT&T, OU=Directory Services", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x05,0x00 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "0500", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=US, O=AT&T, OU=Directory Services", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("0500", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=US, O=AT&T, OU=Directory Services", x509.GetName (), "GetName"); byte[] pubkey = { 0x30,0x81,0x87,0x02,0x81,0x81,0x00,0x87,0x64,0x72,0x89,0x0B,0x20,0x8F,0x87,0x27,0xAC,0xC6,0x22,0xFE,0x00,0x40,0x69,0x48,0xAF,0xC6,0x86,0xCD,0x23,0x33,0xE3,0x11,0xC5,0x31,0x1A,0x1F,0x7E,0x9E,0x92,0x13,0xB6,0xA2,0xAC,0xE3,0xB0,0x1F,0x2A,0x07,0x6C,0xB6,0xD4,0xDE,0x4B,0xFA,0xF1,0xA2,0xA0,0x7D,0xCE,0x4B,0xBE,0xBE,0x26,0x48,0x09,0x8C,0x85,0x11,0xDE,0xCB,0x22,0xE7,0xC2,0xEE,0x44,0x51,0xFE,0x67,0xD5,0x5B,0x5A,0xE0,0x16,0x37,0x54,0x04,0xB8,0x3B,0x32,0x12,0x94,0x83,0x9E,0xB1,0x4D,0x80,0x6C,0xA4,0xA9,0x76,0xAC, 0xB8,0xA4,0x97,0xF7,0xAB,0x0B,0x6C,0xA5,0x43,0xBA,0x6E,0x4F,0xC5,0x4E,0x00,0x30,0x16,0x3C,0x3F,0x99,0x14,0xDA,0xA2,0x20,0x08,0x8B,0xBA,0xED,0x76,0xAC,0x97,0x00,0xD5,0x6D,0x02,0x01,0x0F }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "30818702818100876472890B208F8727ACC622FE00406948AFC686CD2333E311C5311A1F7E9E9213B6A2ACE3B01F2A076CB6D4DE4BFAF1A2A07DCE4BBEBE2648098C8511DECB22E7C2EE4451FE67D55B5AE016375404B83B321294839EB14D806CA4A976ACB8A497F7AB0B6CA543BA6E4FC54E0030163C3F9914DAA220088BBAED76AC9700D56D02010F", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("30818702818100876472890B208F8727ACC622FE00406948AFC686CD2333E311C5311A1F7E9E9213B6A2ACE3B01F2A076CB6D4DE4BFAF1A2A07DCE4BBEBE2648098C8511DECB22E7C2EE4451FE67D55B5AE016375404B83B321294839EB14D806CA4A976ACB8A497F7AB0B6CA543BA6E4FC54E0030163C3F9914DAA220088BBAED76AC9700D56D02010F", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0x00 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); - Assertion.AssertEquals ("GetSerialNumberString", "00", x509.GetSerialNumberString ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); + Assert.AreEqual ("00", x509.GetSerialNumberString (), "GetSerialNumberString"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x41,0x54,0x26,0x54,0x2C,0x20,0x4F,0x55,0x3D,0x44,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x0D,0x0A,0x09,0x49,0x73,0x73,0x75,0x69,0x6E,0x67,0x20,0x43,0x41,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x41,0x54,0x26,0x54, 0x2C,0x20,0x4F,0x55,0x3D,0x44,0x69,0x72,0x65,0x63,0x74,0x6F,0x72,0x79,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x67,0x6F,0x72,0x69,0x74,0x68,0x6D,0x3A,0x20,0x20,0x31,0x2E,0x32,0x2E,0x38,0x34,0x30,0x2E,0x31,0x31,0x33,0x35,0x34,0x39,0x2E,0x31,0x2E,0x31,0x2E,0x31,0x0D,0x0A,0x09,0x53,0x65,0x72,0x69,0x61,0x6C,0x20,0x4E,0x75,0x6D,0x62,0x65,0x72,0x3A,0x20,0x20,0x30,0x30,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x6F,0x67,0x72,0x69,0x74,0x68,0x6D,0x20, 0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x3A,0x20,0x20,0x30,0x35,0x30,0x30,0x0D,0x0A,0x09,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x4B,0x65,0x79,0x3A,0x20,0x20,0x33,0x30,0x38,0x31,0x38,0x37,0x30,0x32,0x38,0x31,0x38,0x31,0x30,0x30,0x38,0x37,0x36,0x34,0x37,0x32,0x38,0x39,0x30,0x42,0x32,0x30,0x38,0x46,0x38,0x37,0x32,0x37,0x41,0x43,0x43,0x36,0x32,0x32,0x46,0x45,0x30,0x30,0x34,0x30,0x36,0x39,0x34,0x38,0x41,0x46,0x43,0x36,0x38,0x36,0x43,0x44,0x32,0x33,0x33,0x33,0x45,0x33,0x31,0x31,0x43,0x35,0x33, @@ -535,10 +535,10 @@ public void Certificate6 () 0x37,0x35,0x34,0x30,0x34,0x42,0x38,0x33,0x42,0x33,0x32,0x31,0x32,0x39,0x34,0x38,0x33,0x39,0x45,0x42,0x31,0x34,0x44,0x38,0x30,0x36,0x43,0x41,0x34,0x41,0x39,0x37,0x36,0x41,0x43,0x42,0x38,0x41,0x34,0x39,0x37,0x46,0x37,0x41,0x42,0x30,0x42,0x36,0x43,0x41,0x35,0x34,0x33,0x42,0x41,0x36,0x45,0x34,0x46,0x43,0x35,0x34,0x45,0x30,0x30,0x33,0x30,0x31,0x36,0x33,0x43,0x33,0x46,0x39,0x39,0x31,0x34,0x44,0x41,0x41,0x32,0x32,0x30,0x30,0x38,0x38,0x42,0x42,0x41,0x45,0x44,0x37,0x36,0x41,0x43,0x39,0x37,0x30,0x30,0x44, 0x35,0x36,0x44,0x30,0x32,0x30,0x31,0x30,0x46,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "OU=Directory Services, O=AT&T, C=US", x509.Issuer); - Assertion.AssertEquals ("Subject", "OU=Directory Services, O=AT&T, C=US", x509.Subject); + Assert.AreEqual ("OU=Directory Services, O=AT&T, C=US", x509.Issuer, "Issuer"); + Assert.AreEqual ("OU=Directory Services, O=AT&T, C=US", x509.Subject, "Subject"); #endif } @@ -594,19 +594,19 @@ public void Certificate8 () X509Certificate x509 = new X509Certificate (cert); X509Certificate clone = new X509Certificate (x509); - Assertion.Assert ("Equals", x509.Equals (clone)); - Assertion.Assert ("Equals", clone.Equals (x509)); + Assert.IsTrue (x509.Equals (clone), "Equals"); + Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); - Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); + Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0xA3,0x0A,0x06,0xB1,0xB0,0xD4,0xF8,0x71,0x67,0x8A,0x60,0xC5,0x4E,0xE4,0xD8,0x66,0x36,0x06,0xCC,0xE6 }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "A30A06B1B0D4F871678A60C54EE4D8663606CCE6", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("A30A06B1B0D4F871678A60C54EE4D8663606CCE6", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("10/25/2000 00:00:00", from.ToString (), "GetEffectiveDateString"); @@ -614,29 +614,29 @@ public void Certificate8 () Assert.AreEqual ("01/01/2003 00:00:00", until.ToString (), "GetExpirationDateString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "10/24/2000 16:00:00", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "12/31/2002 16:00:00", x509.GetExpirationDateString ()); + Assert.AreEqual ("10/24/2000 16:00:00", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("12/31/2002 16:00:00", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", -1559624015, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=US, O=U.S. Government, OU=DoD, CN=Armed Forces Root", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.10040.4.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (-1559624015, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=US, O=U.S. Government, OU=DoD, CN=Armed Forces Root", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.10040.4.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x30,0x82,0x01,0x1E,0x02,0x81,0x81,0x00,0x90,0x89,0x3E,0x18,0x1B,0xFE,0xA3,0x1D,0x16,0x89,0x00,0xB4,0xD5,0x40,0x82,0x4C,0x2E,0xEC,0x3D,0x66,0x0D,0x0D,0xB9,0x17,0x40,0x6E,0x3A,0x5C,0x03,0x7B,0x1B,0x93,0x28,0x0C,0xEF,0xB9,0x97,0xE3,0xA1,0xEB,0xE2,0xA3,0x7C,0x61,0xDD,0x6F,0xD5,0xAD,0x15,0x69,0x00,0x16,0xB2,0xC3,0x08,0x3D,0xC4,0x59,0xC6,0xF2,0x70,0xA5,0xB0,0xF5,0x1F,0x1D,0xF4,0xB0,0x15,0xDA,0x7E,0x28,0x39,0x24,0x99,0x36,0x5B,0xEC,0x39,0x25,0xFA,0x92,0x49,0x65,0xD2,0x43,0x05,0x6A,0x9E,0xA3,0x7B,0xF0,0xDE, 0xA3,0x2F,0xD3,0x6F,0x3A,0xF9,0x35,0xC3,0x29,0xD4,0x45,0x6C,0x56,0x9A,0xDE,0x36,0x6E,0xFE,0x12,0x68,0x96,0x7B,0x45,0x1D,0x2C,0xFF,0xB9,0x2D,0xF5,0x52,0x8C,0xDF,0x3E,0x2F,0x63,0x02,0x15,0x00,0x81,0xA9,0xB5,0xD0,0x04,0xF2,0x9B,0xA7,0xD8,0x55,0x4C,0x3B,0x32,0xA1,0x45,0x32,0x4F,0xF5,0x51,0xDD,0x02,0x81,0x80,0x64,0x7A,0x88,0x0B,0xF2,0x3E,0x91,0x81,0x59,0x9C,0xF4,0xEA,0xC6,0x7B,0x0E,0xBE,0xEA,0x05,0xE8,0x77,0xFD,0x20,0x34,0x87,0xA1,0xC4,0x69,0xF6,0xC8,0x8B,0x19,0xDA,0xCD,0xFA,0x21,0x8A,0x57,0xA9,0x7A, 0x26,0x0A,0x56,0xD4,0xED,0x4B,0x1B,0x7C,0x70,0xED,0xB4,0xE6,0x7A,0x6A,0xDE,0xD3,0x29,0xE2,0xE9,0x9A,0x33,0xED,0x09,0x8D,0x9E,0xDF,0xDA,0x2E,0x4A,0xC1,0x50,0x92,0xEE,0x2F,0xE5,0x5A,0xF3,0x85,0x62,0x6A,0x48,0xDC,0x1B,0x02,0x98,0xA6,0xB0,0xD1,0x09,0x4B,0x10,0xD1,0xF0,0xFA,0xE0,0xB1,0x1D,0x13,0x54,0x4B,0xC0,0xA8,0x40,0xEF,0x71,0xE8,0x56,0x6B,0xA2,0x29,0xCB,0x1E,0x09,0x7D,0x27,0x39,0x91,0x3B,0x20,0x4F,0x98,0x39,0xE8,0x39,0xCA,0x98,0xC5,0xAF,0x54 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "3082011E0281810090893E181BFEA31D168900B4D540824C2EEC3D660D0DB917406E3A5C037B1B93280CEFB997E3A1EBE2A37C61DD6FD5AD15690016B2C3083DC459C6F270A5B0F51F1DF4B015DA7E28392499365BEC3925FA924965D243056A9EA37BF0DEA32FD36F3AF935C329D4456C569ADE366EFE1268967B451D2CFFB92DF5528CDF3E2F6302150081A9B5D004F29BA7D8554C3B32A145324FF551DD028180647A880BF23E9181599CF4EAC67B0EBEEA05E877FD203487A1C469F6C88B19DACDFA218A57A97A260A56D4ED4B1B7C70EDB4E67A6ADED329E2E99A33ED098D9EDFDA2E4AC15092EE2FE55AF385626A48DC1B0298A6B0D1094B10D1F0FAE0B11D13544BC0A840EF71E8566BA229CB1E097D2739913B204F9839E839CA98C5AF54", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=US, O=U.S. Government, OU=DoD, CN=Armed Forces Root", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("3082011E0281810090893E181BFEA31D168900B4D540824C2EEC3D660D0DB917406E3A5C037B1B93280CEFB997E3A1EBE2A37C61DD6FD5AD15690016B2C3083DC459C6F270A5B0F51F1DF4B015DA7E28392499365BEC3925FA924965D243056A9EA37BF0DEA32FD36F3AF935C329D4456C569ADE366EFE1268967B451D2CFFB92DF5528CDF3E2F6302150081A9B5D004F29BA7D8554C3B32A145324FF551DD028180647A880BF23E9181599CF4EAC67B0EBEEA05E877FD203487A1C469F6C88B19DACDFA218A57A97A260A56D4ED4B1B7C70EDB4E67A6ADED329E2E99A33ED098D9EDFDA2E4AC15092EE2FE55AF385626A48DC1B0298A6B0D1094B10D1F0FAE0B11D13544BC0A840EF71E8566BA229CB1E097D2739913B204F9839E839CA98C5AF54", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=US, O=U.S. Government, OU=DoD, CN=Armed Forces Root", x509.GetName (), "GetName"); byte[] pubkey = { 0x02,0x81,0x80,0x54,0xA8,0x88,0xB5,0x8F,0x01,0x56,0xCE,0x18,0x8F,0xA6,0xD6,0x7C,0x29,0x29,0x75,0x45,0xE8,0x31,0xA4,0x07,0x17,0xED,0x1E,0x5D,0xB2,0x7B,0xBB,0xCE,0x3C,0x97,0x67,0x1E,0x88,0x0A,0xFE,0x7D,0x00,0x22,0x27,0x1D,0x66,0xEE,0xF6,0x1B,0xB6,0x95,0x7F,0x5A,0xFF,0x06,0x34,0x02,0x43,0xC3,0x83,0xC4,0x66,0x2C,0xA1,0x05,0x0E,0x68,0xB3,0xCA,0xDC,0xD3,0xF9,0x0C,0xC0,0x66,0xDF,0x85,0x84,0x4B,0x20,0x5D,0x41,0xAC,0xC0,0xEC,0x37,0x92,0x0E,0x97,0x19,0xBF,0x53,0x35,0x63,0x27,0x18,0x33,0x35,0x42,0x4D,0xF0,0x2D, 0x6D,0xA7,0xA4,0x98,0xAA,0x57,0xF3,0xD2,0xB8,0x6E,0x4E,0x8F,0xFF,0xBE,0x6F,0x4E,0x0F,0x0B,0x44,0x24,0xEE,0xDF,0x4C,0x22,0x5B,0x44,0x98,0x94,0xCB,0xB8 }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "02818054A888B58F0156CE188FA6D67C29297545E831A40717ED1E5DB27BBBCE3C97671E880AFE7D0022271D66EEF61BB6957F5AFF06340243C383C4662CA1050E68B3CADCD3F90CC066DF85844B205D41ACC0EC37920E9719BF53356327183335424DF02D6DA7A498AA57F3D2B86E4E8FFFBE6F4E0F0B4424EEDF4C225B449894CBB8", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("02818054A888B58F0156CE188FA6D67C29297545E831A40717ED1E5DB27BBBCE3C97671E880AFE7D0022271D66EEF61BB6957F5AFF06340243C383C4662CA1050E68B3CADCD3F90CC066DF85844B205D41ACC0EC37920E9719BF53356327183335424DF02D6DA7A498AA57F3D2B86E4E8FFFBE6F4E0F0B4424EEDF4C225B449894CBB8", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0x03 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); - Assertion.AssertEquals ("GetSerialNumberString", "03", x509.GetSerialNumberString ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); + Assert.AreEqual ("03", x509.GetSerialNumberString (), "GetSerialNumberString"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x55,0x2E,0x53,0x2E,0x20,0x47,0x6F,0x76,0x65,0x72,0x6E,0x6D,0x65,0x6E,0x74,0x2C,0x20,0x4F,0x55,0x3D,0x44,0x6F,0x44,0x2C,0x20,0x43,0x4E,0x3D,0x41,0x72,0x6D,0x65,0x64,0x20,0x46,0x6F,0x72,0x63,0x65,0x73,0x20,0x52,0x6F,0x6F,0x74,0x0D,0x0A,0x09,0x49,0x73,0x73,0x75,0x69,0x6E,0x67, 0x20,0x43,0x41,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x55,0x2E,0x53,0x2E,0x20,0x47,0x6F,0x76,0x65,0x72,0x6E,0x6D,0x65,0x6E,0x74,0x2C,0x20,0x4F,0x55,0x3D,0x44,0x6F,0x44,0x2C,0x20,0x43,0x4E,0x3D,0x41,0x72,0x6D,0x65,0x64,0x20,0x46,0x6F,0x72,0x63,0x65,0x73,0x20,0x52,0x6F,0x6F,0x74,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x67,0x6F,0x72,0x69,0x74,0x68,0x6D,0x3A,0x20,0x20,0x31,0x2E,0x32,0x2E,0x38,0x34,0x30,0x2E,0x31,0x30,0x30,0x34,0x30,0x2E,0x34,0x2E,0x31,0x0D,0x0A,0x09,0x53,0x65, 0x72,0x69,0x61,0x6C,0x20,0x4E,0x75,0x6D,0x62,0x65,0x72,0x3A,0x20,0x20,0x30,0x33,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x6F,0x67,0x72,0x69,0x74,0x68,0x6D,0x20,0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x3A,0x20,0x20,0x33,0x30,0x38,0x32,0x30,0x31,0x31,0x45,0x30,0x32,0x38,0x31,0x38,0x31,0x30,0x30,0x39,0x30,0x38,0x39,0x33,0x45,0x31,0x38,0x31,0x42,0x46,0x45,0x41,0x33,0x31,0x44,0x31,0x36,0x38,0x39,0x30,0x30,0x42,0x34,0x44,0x35,0x34,0x30,0x38,0x32,0x34,0x43,0x32,0x45,0x45,0x43,0x33,0x44, @@ -650,10 +650,10 @@ public void Certificate8 () 0x35,0x44,0x34,0x31,0x41,0x43,0x43,0x30,0x45,0x43,0x33,0x37,0x39,0x32,0x30,0x45,0x39,0x37,0x31,0x39,0x42,0x46,0x35,0x33,0x33,0x35,0x36,0x33,0x32,0x37,0x31,0x38,0x33,0x33,0x33,0x35,0x34,0x32,0x34,0x44,0x46,0x30,0x32,0x44,0x36,0x44,0x41,0x37,0x41,0x34,0x39,0x38,0x41,0x41,0x35,0x37,0x46,0x33,0x44,0x32,0x42,0x38,0x36,0x45,0x34,0x45,0x38,0x46,0x46,0x46,0x42,0x45,0x36,0x46,0x34,0x45,0x30,0x46,0x30,0x42,0x34,0x34,0x32,0x34,0x45,0x45,0x44,0x46,0x34,0x43,0x32,0x32,0x35,0x42,0x34,0x34,0x39,0x38,0x39,0x34, 0x43,0x42,0x42,0x38,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "CN=Armed Forces Root, OU=DoD, O=U.S. Government, C=US", x509.Issuer); - Assertion.AssertEquals ("Subject", "CN=Armed Forces Root, OU=DoD, O=U.S. Government, C=US", x509.Subject); + Assert.AreEqual ("CN=Armed Forces Root, OU=DoD, O=U.S. Government, C=US", x509.Issuer, "Issuer"); + Assert.AreEqual ("CN=Armed Forces Root, OU=DoD, O=U.S. Government, C=US", x509.Subject, "Subject"); #endif } @@ -695,19 +695,19 @@ public void Certificate9 () X509Certificate x509 = new X509Certificate (cert); X509Certificate clone = new X509Certificate (x509); - Assertion.Assert ("Equals", x509.Equals (clone)); - Assertion.Assert ("Equals", clone.Equals (x509)); + Assert.IsTrue (x509.Equals (clone), "Equals"); + Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); - Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); + Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0x52,0xD1,0x84,0x8F,0x6A,0x16,0x1B,0xA5,0xC6,0xC1,0x90,0x07,0xF8,0x16,0x46,0x68,0xF5,0xA3,0xB2,0xCF }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "52D1848F6A161BA5C6C19007F8164668F5A3B2CF", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("52D1848F6A161BA5C6C19007F8164668F5A3B2CF", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("08/21/1996 00:00:00", from.ToString (), "GetEffectiveDateString"); @@ -716,26 +716,26 @@ public void Certificate9 () Assert.AreEqual ("200B355ECEC4B063B7DEC634B9703444", x509.GetSerialNumberString (), "GetSerialNumberString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "08/20/1996 16:00:00", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "08/20/1997 15:59:59", x509.GetExpirationDateString ()); + Assert.AreEqual ("08/20/1996 16:00:00", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("08/20/1997 15:59:59", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) Assert.AreEqual ("443470B934C6DEB763B0C4CE5E350B20", x509.GetSerialNumberString (), "GetSerialNumberString"); #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", 1389462671, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "L=Internet, O=\"VeriSign, Inc.\", OU=VeriSign Class 1 CA - Individual Subscriber", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.113549.1.1.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (1389462671, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("L=Internet, O=\"VeriSign, Inc.\", OU=VeriSign Class 1 CA - Individual Subscriber", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x05,0x00 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "0500", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "L=Internet, O=\"VeriSign, Inc.\", OU=VeriSign Class 1 CA - Individual Subscriber, OU=\"www.verisign.com/repository/CPS Incorp. by Ref.,LIAB.LTD(c)96\", OU=Digital ID Class 1 - Netscape, CN=David T. Gray, E=david@formal.ie", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("0500", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("L=Internet, O=\"VeriSign, Inc.\", OU=VeriSign Class 1 CA - Individual Subscriber, OU=\"www.verisign.com/repository/CPS Incorp. by Ref.,LIAB.LTD(c)96\", OU=Digital ID Class 1 - Netscape, CN=David T. Gray, E=david@formal.ie", x509.GetName (), "GetName"); byte[] pubkey = { 0x30,0x48,0x02,0x41,0x00,0xC5,0x81,0x07,0xA2,0xEB,0x0F,0xB8,0xFF,0xF8,0xF8,0x1C,0xEE,0x32,0xFF,0xBF,0x12,0x35,0x6A,0xF9,0x6B,0xC8,0xBE,0x2F,0xFB,0x3E,0xAF,0x04,0x51,0x4A,0xAC,0xDD,0x10,0x29,0xA8,0xCD,0x40,0x5B,0x66,0x1E,0x98,0xEF,0xF2,0x4C,0x77,0xFA,0x8F,0x86,0xD1,0x21,0x67,0x92,0x44,0x4A,0xC4,0x89,0xC9,0x83,0xCF,0x88,0x9F,0x6F,0xE2,0x32,0x35,0x02,0x03,0x01,0x00,0x01 }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "3048024100C58107A2EB0FB8FFF8F81CEE32FFBF12356AF96BC8BE2FFB3EAF04514AACDD1029A8CD405B661E98EFF24C77FA8F86D1216792444AC489C983CF889F6FE232350203010001", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("3048024100C58107A2EB0FB8FFF8F81CEE32FFBF12356AF96BC8BE2FFB3EAF04514AACDD1029A8CD405B661E98EFF24C77FA8F86D1216792444AC489C983CF889F6FE232350203010001", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0x44,0x34,0x70,0xB9,0x34,0xC6,0xDE,0xB7,0x63,0xB0,0xC4,0xCE,0x5E,0x35,0x0B,0x20 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x4C,0x3D,0x49,0x6E,0x74,0x65,0x72,0x6E,0x65,0x74,0x2C,0x20,0x4F,0x3D,0x22,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x22,0x2C,0x20,0x4F,0x55,0x3D,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x31,0x20,0x43,0x41,0x20,0x2D,0x20,0x49,0x6E,0x64,0x69,0x76,0x69, 0x64,0x75,0x61,0x6C,0x20,0x53,0x75,0x62,0x73,0x63,0x72,0x69,0x62,0x65,0x72,0x2C,0x20,0x4F,0x55,0x3D,0x22,0x77,0x77,0x77,0x2E,0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6E,0x2E,0x63,0x6F,0x6D,0x2F,0x72,0x65,0x70,0x6F,0x73,0x69,0x74,0x6F,0x72,0x79,0x2F,0x43,0x50,0x53,0x20,0x49,0x6E,0x63,0x6F,0x72,0x70,0x2E,0x20,0x62,0x79,0x20,0x52,0x65,0x66,0x2E,0x2C,0x4C,0x49,0x41,0x42,0x2E,0x4C,0x54,0x44,0x28,0x63,0x29,0x39,0x36,0x22,0x2C,0x20,0x4F,0x55,0x3D,0x44,0x69,0x67,0x69,0x74,0x61,0x6C,0x20,0x49,0x44,0x20,0x43, 0x6C,0x61,0x73,0x73,0x20,0x31,0x20,0x2D,0x20,0x4E,0x65,0x74,0x73,0x63,0x61,0x70,0x65,0x2C,0x20,0x43,0x4E,0x3D,0x44,0x61,0x76,0x69,0x64,0x20,0x54,0x2E,0x20,0x47,0x72,0x61,0x79,0x2C,0x20,0x45,0x3D,0x64,0x61,0x76,0x69,0x64,0x40,0x66,0x6F,0x72,0x6D,0x61,0x6C,0x2E,0x69,0x65,0x0D,0x0A,0x09,0x49,0x73,0x73,0x75,0x69,0x6E,0x67,0x20,0x43,0x41,0x3A,0x20,0x20,0x4C,0x3D,0x49,0x6E,0x74,0x65,0x72,0x6E,0x65,0x74,0x2C,0x20,0x4F,0x3D,0x22,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x22, @@ -744,10 +744,10 @@ public void Certificate9 () 0x38,0x31,0x30,0x37,0x41,0x32,0x45,0x42,0x30,0x46,0x42,0x38,0x46,0x46,0x46,0x38,0x46,0x38,0x31,0x43,0x45,0x45,0x33,0x32,0x46,0x46,0x42,0x46,0x31,0x32,0x33,0x35,0x36,0x41,0x46,0x39,0x36,0x42,0x43,0x38,0x42,0x45,0x32,0x46,0x46,0x42,0x33,0x45,0x41,0x46,0x30,0x34,0x35,0x31,0x34,0x41,0x41,0x43,0x44,0x44,0x31,0x30,0x32,0x39,0x41,0x38,0x43,0x44,0x34,0x30,0x35,0x42,0x36,0x36,0x31,0x45,0x39,0x38,0x45,0x46,0x46,0x32,0x34,0x43,0x37,0x37,0x46,0x41,0x38,0x46,0x38,0x36,0x44,0x31,0x32,0x31,0x36,0x37,0x39,0x32, 0x34,0x34,0x34,0x41,0x43,0x34,0x38,0x39,0x43,0x39,0x38,0x33,0x43,0x46,0x38,0x38,0x39,0x46,0x36,0x46,0x45,0x32,0x33,0x32,0x33,0x35,0x30,0x32,0x30,0x33,0x30,0x31,0x30,0x30,0x30,0x31,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "OU=VeriSign Class 1 CA - Individual Subscriber, O=\"VeriSign, Inc.\", L=Internet", x509.Issuer); - Assertion.AssertEquals ("Subject", "E=david@formal.ie, CN=David T. Gray, OU=Digital ID Class 1 - Netscape, OU=\"www.verisign.com/repository/CPS Incorp. by Ref.,LIAB.LTD(c)96\", OU=VeriSign Class 1 CA - Individual Subscriber, O=\"VeriSign, Inc.\", L=Internet", x509.Subject); + Assert.AreEqual ("OU=VeriSign Class 1 CA - Individual Subscriber, O=\"VeriSign, Inc.\", L=Internet", x509.Issuer, "Issuer"); + Assert.AreEqual ("E=david@formal.ie, CN=David T. Gray, OU=Digital ID Class 1 - Netscape, OU=\"www.verisign.com/repository/CPS Incorp. by Ref.,LIAB.LTD(c)96\", OU=VeriSign Class 1 CA - Individual Subscriber, O=\"VeriSign, Inc.\", L=Internet", x509.Subject, "Subject"); #endif } @@ -770,19 +770,19 @@ public void Certificate10 () X509Certificate x509 = new X509Certificate (cert); X509Certificate clone = new X509Certificate (x509); - Assertion.Assert ("Equals", x509.Equals (clone)); - Assertion.Assert ("Equals", clone.Equals (x509)); + Assert.IsTrue (x509.Equals (clone), "Equals"); + Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); - Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); + Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0xE0,0xA0,0x0A,0xBE,0xB2,0xCC,0xA8,0x45,0x40,0xC2,0x1A,0x75,0xE0,0xB3,0xA4,0x06,0xF9,0xA6,0x24,0xAC }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "E0A00ABEB2CCA84540C21A75E0B3A406F9A624AC", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("E0A00ABEB2CCA84540C21A75E0B3A406F9A624AC", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("05/07/1996 00:00:00", from.ToString (), "GetEffectiveDateString"); @@ -790,27 +790,27 @@ public void Certificate10 () Assert.AreEqual ("05/07/1999 00:00:00", until.ToString (), "GetExpirationDateString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "05/06/1996 16:00:00", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "05/06/1999 16:00:00", x509.GetExpirationDateString ()); + Assert.AreEqual ("05/06/1996 16:00:00", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("05/06/1999 16:00:00", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", -526382402, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=CA, CN=Keywitness Canada Inc., OID.1.3.6.1.4.1.42.2.11.2.1=keywitness@keywitness.ca", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.113549.1.1.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (-526382402, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=CA, CN=Keywitness Canada Inc., OID.1.3.6.1.4.1.42.2.11.2.1=keywitness@keywitness.ca", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x05,0x00 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "0500", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=CA, CN=Keywitness Canada Inc., OID.1.3.6.1.4.1.42.2.11.2.1=keywitness@keywitness.ca", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("0500", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=CA, CN=Keywitness Canada Inc., OID.1.3.6.1.4.1.42.2.11.2.1=keywitness@keywitness.ca", x509.GetName (), "GetName"); byte[] pubkey = { 0x30,0x81,0x87,0x02,0x81,0x81,0x00,0xCD,0x23,0xFA,0x2A,0xE1,0xED,0x98,0xF4,0xE9,0xD0,0x93,0x3E,0xD7,0x7A,0x80,0x02,0x4C,0xCC,0xC1,0x02,0xAF,0x5C,0xB6,0x1F,0x7F,0xFA,0x57,0x42,0x6F,0x30,0xD1,0x20,0xC5,0xB5,0x21,0x07,0x40,0x2C,0xA9,0x86,0xC2,0xF3,0x64,0x84,0xAE,0x3D,0x85,0x2E,0xED,0x85,0xBD,0x54,0xB0,0x18,0x28,0xEF,0x6A,0xF8,0x1B,0xE7,0x0B,0x16,0x1F,0x93,0x25,0x4F,0xC7,0xF8,0x8E,0xC3,0xB9,0xCA,0x98,0x84,0x0E,0x55,0xD0,0x2F,0xEF,0x78,0x77,0xC5,0x72,0x28,0x5F,0x60,0xBF,0x19,0x2B,0xD1,0x72,0xA2,0xB7,0xD8, 0x3F,0xE0,0x97,0x34,0x5A,0x01,0xBD,0x04,0x9C,0xC8,0x78,0x45,0xCD,0x93,0x8D,0x15,0xF2,0x76,0x10,0x11,0xAB,0xB8,0x5B,0x2E,0x9E,0x52,0xDD,0x81,0x3E,0x9C,0x64,0xC8,0x29,0x93,0x02,0x01,0x03 }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "30818702818100CD23FA2AE1ED98F4E9D0933ED77A80024CCCC102AF5CB61F7FFA57426F30D120C5B52107402CA986C2F36484AE3D852EED85BD54B01828EF6AF81BE70B161F93254FC7F88EC3B9CA98840E55D02FEF7877C572285F60BF192BD172A2B7D83FE097345A01BD049CC87845CD938D15F2761011ABB85B2E9E52DD813E9C64C82993020103", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("30818702818100CD23FA2AE1ED98F4E9D0933ED77A80024CCCC102AF5CB61F7FFA57426F30D120C5B52107402CA986C2F36484AE3D852EED85BD54B01828EF6AF81BE70B161F93254FC7F88EC3B9CA98840E55D02FEF7877C572285F60BF192BD172A2B7D83FE097345A01BD049CC87845CD938D15F2761011ABB85B2E9E52DD813E9C64C82993020103", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0x14 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); - Assertion.AssertEquals ("GetSerialNumberString", "14", x509.GetSerialNumberString ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); + Assert.AreEqual ("14", x509.GetSerialNumberString (), "GetSerialNumberString"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x43,0x3D,0x43,0x41,0x2C,0x20,0x43,0x4E,0x3D,0x4B,0x65,0x79,0x77,0x69,0x74,0x6E,0x65,0x73,0x73,0x20,0x43,0x61,0x6E,0x61,0x64,0x61,0x20,0x49,0x6E,0x63,0x2E,0x2C,0x20,0x4F,0x49,0x44,0x2E,0x31,0x2E,0x33,0x2E,0x36,0x2E,0x31,0x2E,0x34,0x2E,0x31,0x2E,0x34,0x32,0x2E,0x32,0x2E,0x31,0x31,0x2E,0x32,0x2E,0x31,0x3D,0x6B,0x65, 0x79,0x77,0x69,0x74,0x6E,0x65,0x73,0x73,0x40,0x6B,0x65,0x79,0x77,0x69,0x74,0x6E,0x65,0x73,0x73,0x2E,0x63,0x61,0x0D,0x0A,0x09,0x49,0x73,0x73,0x75,0x69,0x6E,0x67,0x20,0x43,0x41,0x3A,0x20,0x20,0x43,0x3D,0x43,0x41,0x2C,0x20,0x43,0x4E,0x3D,0x4B,0x65,0x79,0x77,0x69,0x74,0x6E,0x65,0x73,0x73,0x20,0x43,0x61,0x6E,0x61,0x64,0x61,0x20,0x49,0x6E,0x63,0x2E,0x2C,0x20,0x4F,0x49,0x44,0x2E,0x31,0x2E,0x33,0x2E,0x36,0x2E,0x31,0x2E,0x34,0x2E,0x31,0x2E,0x34,0x32,0x2E,0x32,0x2E,0x31,0x31,0x2E,0x32,0x2E,0x31,0x3D,0x6B, 0x65,0x79,0x77,0x69,0x74,0x6E,0x65,0x73,0x73,0x40,0x6B,0x65,0x79,0x77,0x69,0x74,0x6E,0x65,0x73,0x73,0x2E,0x63,0x61,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x67,0x6F,0x72,0x69,0x74,0x68,0x6D,0x3A,0x20,0x20,0x31,0x2E,0x32,0x2E,0x38,0x34,0x30,0x2E,0x31,0x31,0x33,0x35,0x34,0x39,0x2E,0x31,0x2E,0x31,0x2E,0x31,0x0D,0x0A,0x09,0x53,0x65,0x72,0x69,0x61,0x6C,0x20,0x4E,0x75,0x6D,0x62,0x65,0x72,0x3A,0x20,0x20,0x31,0x34,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x6F,0x67,0x72,0x69,0x74,0x68,0x6D,0x20, @@ -819,10 +819,10 @@ public void Certificate10 () 0x30,0x32,0x46,0x45,0x46,0x37,0x38,0x37,0x37,0x43,0x35,0x37,0x32,0x32,0x38,0x35,0x46,0x36,0x30,0x42,0x46,0x31,0x39,0x32,0x42,0x44,0x31,0x37,0x32,0x41,0x32,0x42,0x37,0x44,0x38,0x33,0x46,0x45,0x30,0x39,0x37,0x33,0x34,0x35,0x41,0x30,0x31,0x42,0x44,0x30,0x34,0x39,0x43,0x43,0x38,0x37,0x38,0x34,0x35,0x43,0x44,0x39,0x33,0x38,0x44,0x31,0x35,0x46,0x32,0x37,0x36,0x31,0x30,0x31,0x31,0x41,0x42,0x42,0x38,0x35,0x42,0x32,0x45,0x39,0x45,0x35,0x32,0x44,0x44,0x38,0x31,0x33,0x45,0x39,0x43,0x36,0x34,0x43,0x38,0x32, 0x39,0x39,0x33,0x30,0x32,0x30,0x31,0x30,0x33,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "OID.1.3.6.1.4.1.42.2.11.2.1=keywitness@keywitness.ca, CN=Keywitness Canada Inc., C=CA", x509.Issuer); - Assertion.AssertEquals ("Subject", "OID.1.3.6.1.4.1.42.2.11.2.1=keywitness@keywitness.ca, CN=Keywitness Canada Inc., C=CA", x509.Subject); + Assert.AreEqual ("OID.1.3.6.1.4.1.42.2.11.2.1=keywitness@keywitness.ca, CN=Keywitness Canada Inc., C=CA", x509.Issuer, "Issuer"); + Assert.AreEqual ("OID.1.3.6.1.4.1.42.2.11.2.1=keywitness@keywitness.ca, CN=Keywitness Canada Inc., C=CA", x509.Subject, "Subject"); #endif } @@ -845,19 +845,19 @@ public void Certificate11 () X509Certificate x509 = new X509Certificate (cert); X509Certificate clone = new X509Certificate (x509); - Assertion.Assert ("Equals", x509.Equals (clone)); - Assertion.Assert ("Equals", clone.Equals (x509)); + Assert.IsTrue (x509.Equals (clone), "Equals"); + Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); - Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); + Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0xA2,0x75,0xE0,0x26,0xAC,0xD8,0x54,0x79,0x4A,0x4A,0xA2,0xCB,0x53,0xF6,0x62,0x33,0x12,0x9C,0x55,0xB6 }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "A275E026ACD854794A4AA2CB53F66233129C55B6", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("A275E026ACD854794A4AA2CB53F66233129C55B6", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("02/23/1996 19:15:00", from.ToString (), "GetEffectiveDateString"); @@ -865,27 +865,27 @@ public void Certificate11 () Assert.AreEqual ("12/31/1999 23:59:00", until.ToString (), "GetExpirationDateString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "02/23/1996 11:15:00", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "12/31/1999 15:59:00", x509.GetExpirationDateString ()); + Assert.AreEqual ("02/23/1996 11:15:00", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("12/31/1999 15:59:00", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", -1569333210, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=US, O=GTE Corporation, CN=GTE CyberTrust Root", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.113549.1.1.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (-1569333210, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=US, O=GTE Corporation, CN=GTE CyberTrust Root", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x05,0x00 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "0500", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=US, O=GTE Corporation, CN=GTE CyberTrust Root", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("0500", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=US, O=GTE Corporation, CN=GTE CyberTrust Root", x509.GetName (), "GetName"); byte[] pubkey = { 0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xB8,0xE6,0x4F,0xBA,0xDB,0x98,0x7C,0x71,0x7C,0xAF,0x44,0xB7,0xD3,0x0F,0x46,0xD9,0x64,0xE5,0x93,0xC1,0x42,0x8E,0xC7,0xBA,0x49,0x8D,0x35,0x2D,0x7A,0xE7,0x8B,0xBD,0xE5,0x05,0x31,0x59,0xC6,0xB1,0x2F,0x0A,0x0C,0xFB,0x9F,0xA7,0x3F,0xA2,0x09,0x66,0x84,0x56,0x1E,0x37,0x29,0x1B,0x87,0xE9,0x7E,0x0C,0xCA,0x9A,0x9F,0xA5,0x7F,0xF5,0x15,0x94,0xA3,0xD5,0xA2,0x46,0x82,0xD8,0x68,0x4C,0xD1,0x37,0x15,0x06,0x68,0xAF,0xBD,0xF8,0xB0,0xB3,0xF0,0x29,0xF5,0x95,0x5A,0x09,0x16,0x61,0x77,0x0A, 0x22,0x25,0xD4,0x4F,0x45,0xAA,0xC7,0xBD,0xE5,0x96,0xDF,0xF9,0xD4,0xA8,0x8E,0x42,0xCC,0x24,0xC0,0x1E,0x91,0x27,0x4A,0xB5,0x6D,0x06,0x80,0x63,0x39,0xC4,0xA2,0x5E,0x38,0x03,0x02,0x03,0x01,0x00,0x01 }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "30818902818100B8E64FBADB987C717CAF44B7D30F46D964E593C1428EC7BA498D352D7AE78BBDE5053159C6B12F0A0CFB9FA73FA2096684561E37291B87E97E0CCA9A9FA57FF51594A3D5A24682D8684CD137150668AFBDF8B0B3F029F5955A091661770A2225D44F45AAC7BDE596DFF9D4A88E42CC24C01E91274AB56D06806339C4A25E38030203010001", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("30818902818100B8E64FBADB987C717CAF44B7D30F46D964E593C1428EC7BA498D352D7AE78BBDE5053159C6B12F0A0CFB9FA73FA2096684561E37291B87E97E0CCA9A9FA57FF51594A3D5A24682D8684CD137150668AFBDF8B0B3F029F5955A091661770A2225D44F45AAC7BDE596DFF9D4A88E42CC24C01E91274AB56D06806339C4A25E38030203010001", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0x00 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); - Assertion.AssertEquals ("GetSerialNumberString", "00", x509.GetSerialNumberString ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); + Assert.AreEqual ("00", x509.GetSerialNumberString (), "GetSerialNumberString"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x47,0x54,0x45,0x20,0x43,0x6F,0x72,0x70,0x6F,0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x43,0x4E,0x3D,0x47,0x54,0x45,0x20,0x43,0x79,0x62,0x65,0x72,0x54,0x72,0x75,0x73,0x74,0x20,0x52,0x6F,0x6F,0x74,0x0D,0x0A,0x09,0x49,0x73,0x73,0x75,0x69,0x6E,0x67,0x20,0x43,0x41,0x3A,0x20,0x20, 0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x47,0x54,0x45,0x20,0x43,0x6F,0x72,0x70,0x6F,0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x43,0x4E,0x3D,0x47,0x54,0x45,0x20,0x43,0x79,0x62,0x65,0x72,0x54,0x72,0x75,0x73,0x74,0x20,0x52,0x6F,0x6F,0x74,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x67,0x6F,0x72,0x69,0x74,0x68,0x6D,0x3A,0x20,0x20,0x31,0x2E,0x32,0x2E,0x38,0x34,0x30,0x2E,0x31,0x31,0x33,0x35,0x34,0x39,0x2E,0x31,0x2E,0x31,0x2E,0x31,0x0D,0x0A,0x09,0x53,0x65,0x72,0x69,0x61,0x6C,0x20,0x4E,0x75,0x6D,0x62, 0x65,0x72,0x3A,0x20,0x20,0x30,0x30,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x6F,0x67,0x72,0x69,0x74,0x68,0x6D,0x20,0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x3A,0x20,0x20,0x30,0x35,0x30,0x30,0x0D,0x0A,0x09,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x4B,0x65,0x79,0x3A,0x20,0x20,0x33,0x30,0x38,0x31,0x38,0x39,0x30,0x32,0x38,0x31,0x38,0x31,0x30,0x30,0x42,0x38,0x45,0x36,0x34,0x46,0x42,0x41,0x44,0x42,0x39,0x38,0x37,0x43,0x37,0x31,0x37,0x43,0x41,0x46,0x34,0x34,0x42,0x37,0x44,0x33,0x30,0x46,0x34, @@ -893,10 +893,10 @@ public void Certificate11 () 0x35,0x39,0x34,0x41,0x33,0x44,0x35,0x41,0x32,0x34,0x36,0x38,0x32,0x44,0x38,0x36,0x38,0x34,0x43,0x44,0x31,0x33,0x37,0x31,0x35,0x30,0x36,0x36,0x38,0x41,0x46,0x42,0x44,0x46,0x38,0x42,0x30,0x42,0x33,0x46,0x30,0x32,0x39,0x46,0x35,0x39,0x35,0x35,0x41,0x30,0x39,0x31,0x36,0x36,0x31,0x37,0x37,0x30,0x41,0x32,0x32,0x32,0x35,0x44,0x34,0x34,0x46,0x34,0x35,0x41,0x41,0x43,0x37,0x42,0x44,0x45,0x35,0x39,0x36,0x44,0x46,0x46,0x39,0x44,0x34,0x41,0x38,0x38,0x45,0x34,0x32,0x43,0x43,0x32,0x34,0x43,0x30,0x31,0x45,0x39, 0x31,0x32,0x37,0x34,0x41,0x42,0x35,0x36,0x44,0x30,0x36,0x38,0x30,0x36,0x33,0x33,0x39,0x43,0x34,0x41,0x32,0x35,0x45,0x33,0x38,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x31,0x30,0x30,0x30,0x31,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "CN=GTE CyberTrust Root, O=GTE Corporation, C=US", x509.Issuer); - Assertion.AssertEquals ("Subject", "CN=GTE CyberTrust Root, O=GTE Corporation, C=US", x509.Subject); + Assert.AreEqual ("CN=GTE CyberTrust Root, O=GTE Corporation, C=US", x509.Issuer, "Issuer"); + Assert.AreEqual ("CN=GTE CyberTrust Root, O=GTE Corporation, C=US", x509.Subject, "Subject"); #endif } @@ -924,19 +924,19 @@ public void Certificate12 () X509Certificate x509 = new X509Certificate (cert); X509Certificate clone = new X509Certificate (x509); - Assertion.Assert ("Equals", x509.Equals (clone)); - Assertion.Assert ("Equals", clone.Equals (x509)); + Assert.IsTrue (x509.Equals (clone), "Equals"); + Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); - Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); + Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0x28,0x2D,0x98,0x06,0xC3,0xDF,0x73,0x45,0x92,0x9F,0x64,0xF5,0x89,0x5E,0xF2,0xEA,0x4A,0xC2,0x93,0x02 }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "282D9806C3DF7345929F64F5895EF2EA4AC29302", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("282D9806C3DF7345929F64F5895EF2EA4AC29302", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("05/25/2002 00:55:48", from.ToString (), "GetEffectiveDateString"); @@ -945,28 +945,28 @@ public void Certificate12 () Assert.AreEqual ("61071143000000000034", x509.GetSerialNumberString (), "GetSerialNumberString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", "05/24/2002 16:55:48", x509.GetEffectiveDateString ()); - Assertion.AssertEquals ("GetExpirationDateString", "11/24/2003 17:05:48", x509.GetExpirationDateString ()); + Assert.AreEqual ("05/24/2002 16:55:48", x509.GetEffectiveDateString (), "GetEffectiveDateString"); + Assert.AreEqual ("11/24/2003 17:05:48", x509.GetExpirationDateString (), "GetExpirationDateString"); // which was making it easier to test the dates ;-) Assert.AreEqual ("34000000000043110761", x509.GetSerialNumberString (), "GetSerialNumberString"); #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", 674076678, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=US, S=Washington, L=Redmond, O=Microsoft Corporation, OU=Copyright (c) 2000 Microsoft Corp., CN=Microsoft Code Signing PCA", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.113549.1.1.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (674076678, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=US, S=Washington, L=Redmond, O=Microsoft Corporation, OU=Copyright (c) 2000 Microsoft Corp., CN=Microsoft Code Signing PCA", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.113549.1.1.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); byte[] keyparams = { 0x05,0x00 }; - AssertEquals ("GetKeyAlgorithmParameters", keyparams, x509.GetKeyAlgorithmParameters ()); - Assertion.AssertEquals ("GetKeyAlgorithmParametersString", "0500", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=US, S=Washington, L=Redmond, O=Microsoft Corporation, OU=Copyright (c) 2002 Microsoft Corp., CN=Microsoft Corporation", x509.GetName ()); + Assert.AreEqual (keyparams, x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.AreEqual ("0500", x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=US, S=Washington, L=Redmond, O=Microsoft Corporation, OU=Copyright (c) 2002 Microsoft Corp., CN=Microsoft Corporation", x509.GetName (), "GetName"); byte[] pubkey = { 0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xAA,0x99,0xBD,0x39,0xA8,0x18,0x27,0xF4,0x2B,0x3D,0x0B,0x4C,0x3F,0x7C,0x77,0x2E,0xA7,0xCB,0xB5,0xD1,0x8C,0x0D,0xC2,0x3A,0x74,0xD7,0x93,0xB5,0xE0,0xA0,0x4B,0x3F,0x59,0x5E,0xCE,0x45,0x4F,0x9A,0x79,0x29,0xF1,0x49,0xCC,0x1A,0x47,0xEE,0x55,0xC2,0x08,0x3E,0x12,0x20,0xF8,0x55,0xF2,0xEE,0x5F,0xD3,0xE0,0xCA,0x96,0xBC,0x30,0xDE,0xFE,0x58,0xC8,0x27,0x32,0xD0,0x85,0x54,0xE8,0xF0,0x91,0x10,0xBB,0xF3,0x2B,0xBE,0x19,0xE5,0x03,0x9B,0x0B,0x86,0x1D,0xF3,0xB0,0x39,0x8C,0xB8, 0xFD,0x0B,0x1D,0x3C,0x73,0x26,0xAC,0x57,0x2B,0xCA,0x29,0xA2,0x15,0x90,0x82,0x15,0xE2,0x77,0xA3,0x40,0x52,0x03,0x8B,0x9D,0xC2,0x70,0xBA,0x1F,0xE9,0x34,0xF6,0xF3,0x35,0x92,0x4E,0x55,0x83,0xF8,0xDA,0x30,0xB6,0x20,0xDE,0x57,0x06,0xB5,0x5A,0x42,0x06,0xDE,0x59,0xCB,0xF2,0xDF,0xA6,0xBD,0x15,0x47,0x71,0x19,0x25,0x23,0xD2,0xCB,0x6F,0x9B,0x19,0x79,0xDF,0x6A,0x5B,0xF1,0x76,0x05,0x79,0x29,0xFC,0xC3,0x56,0xCA,0x8F,0x44,0x08,0x85,0x55,0x8A,0xCB,0xC8,0x0F,0x46,0x4B,0x55,0xCB,0x8C,0x96,0x77,0x4A,0x87,0xE8,0xA9, 0x41,0x06,0xC7,0xFF,0x0D,0xE9,0x68,0x57,0x63,0x72,0xC3,0x69,0x57,0xB4,0x43,0xCF,0x32,0x3A,0x30,0xDC,0x1B,0xE9,0xD5,0x43,0x26,0x2A,0x79,0xFE,0x95,0xDB,0x22,0x67,0x24,0xC9,0x2F,0xD0,0x34,0xE3,0xE6,0xFB,0x51,0x49,0x86,0xB8,0x3C,0xD0,0x25,0x5F,0xD6,0xEC,0x9E,0x03,0x61,0x87,0xA9,0x68,0x40,0xC7,0xF8,0xE2,0x03,0xE6,0xCF,0x05,0x02,0x03,0x01,0x00,0x01 }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "3082010A0282010100AA99BD39A81827F42B3D0B4C3F7C772EA7CBB5D18C0DC23A74D793B5E0A04B3F595ECE454F9A7929F149CC1A47EE55C2083E1220F855F2EE5FD3E0CA96BC30DEFE58C82732D08554E8F09110BBF32BBE19E5039B0B861DF3B0398CB8FD0B1D3C7326AC572BCA29A215908215E277A34052038B9DC270BA1FE934F6F335924E5583F8DA30B620DE5706B55A4206DE59CBF2DFA6BD154771192523D2CB6F9B1979DF6A5BF176057929FCC356CA8F440885558ACBC80F464B55CB8C96774A87E8A94106C7FF0DE968576372C36957B443CF323A30DC1BE9D543262A79FE95DB226724C92FD034E3E6FB514986B83CD0255FD6EC9E036187A96840C7F8E203E6CF050203010001", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("3082010A0282010100AA99BD39A81827F42B3D0B4C3F7C772EA7CBB5D18C0DC23A74D793B5E0A04B3F595ECE454F9A7929F149CC1A47EE55C2083E1220F855F2EE5FD3E0CA96BC30DEFE58C82732D08554E8F09110BBF32BBE19E5039B0B861DF3B0398CB8FD0B1D3C7326AC572BCA29A215908215E277A34052038B9DC270BA1FE934F6F335924E5583F8DA30B620DE5706B55A4206DE59CBF2DFA6BD154771192523D2CB6F9B1979DF6A5BF176057929FCC356CA8F440885558ACBC80F464B55CB8C96774A87E8A94106C7FF0DE968576372C36957B443CF323A30DC1BE9D543262A79FE95DB226724C92FD034E3E6FB514986B83CD0255FD6EC9E036187A96840C7F8E203E6CF050203010001", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0x34,0x00,0x00,0x00,0x00,0x00,0x43,0x11,0x07,0x61 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x53,0x3D,0x57,0x61,0x73,0x68,0x69,0x6E,0x67,0x74,0x6F,0x6E,0x2C,0x20,0x4C,0x3D,0x52,0x65,0x64,0x6D,0x6F,0x6E,0x64,0x2C,0x20,0x4F,0x3D,0x4D,0x69,0x63,0x72,0x6F,0x73,0x6F,0x66,0x74,0x20,0x43,0x6F,0x72,0x70,0x6F,0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x4F,0x55,0x3D,0x43,0x6F,0x70,0x79, 0x72,0x69,0x67,0x68,0x74,0x20,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x32,0x20,0x4D,0x69,0x63,0x72,0x6F,0x73,0x6F,0x66,0x74,0x20,0x43,0x6F,0x72,0x70,0x2E,0x2C,0x20,0x43,0x4E,0x3D,0x4D,0x69,0x63,0x72,0x6F,0x73,0x6F,0x66,0x74,0x20,0x43,0x6F,0x72,0x70,0x6F,0x72,0x61,0x74,0x69,0x6F,0x6E,0x0D,0x0A,0x09,0x49,0x73,0x73,0x75,0x69,0x6E,0x67,0x20,0x43,0x41,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x53,0x3D,0x57,0x61,0x73,0x68,0x69,0x6E,0x67,0x74,0x6F,0x6E,0x2C,0x20,0x4C,0x3D,0x52,0x65,0x64,0x6D,0x6F,0x6E, 0x64,0x2C,0x20,0x4F,0x3D,0x4D,0x69,0x63,0x72,0x6F,0x73,0x6F,0x66,0x74,0x20,0x43,0x6F,0x72,0x70,0x6F,0x72,0x61,0x74,0x69,0x6F,0x6E,0x2C,0x20,0x4F,0x55,0x3D,0x43,0x6F,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x30,0x20,0x4D,0x69,0x63,0x72,0x6F,0x73,0x6F,0x66,0x74,0x20,0x43,0x6F,0x72,0x70,0x2E,0x2C,0x20,0x43,0x4E,0x3D,0x4D,0x69,0x63,0x72,0x6F,0x73,0x6F,0x66,0x74,0x20,0x43,0x6F,0x64,0x65,0x20,0x53,0x69,0x67,0x6E,0x69,0x6E,0x67,0x20,0x50,0x43,0x41,0x0D,0x0A,0x09,0x4B, @@ -978,10 +978,10 @@ public void Certificate12 () 0x43,0x38,0x30,0x46,0x34,0x36,0x34,0x42,0x35,0x35,0x43,0x42,0x38,0x43,0x39,0x36,0x37,0x37,0x34,0x41,0x38,0x37,0x45,0x38,0x41,0x39,0x34,0x31,0x30,0x36,0x43,0x37,0x46,0x46,0x30,0x44,0x45,0x39,0x36,0x38,0x35,0x37,0x36,0x33,0x37,0x32,0x43,0x33,0x36,0x39,0x35,0x37,0x42,0x34,0x34,0x33,0x43,0x46,0x33,0x32,0x33,0x41,0x33,0x30,0x44,0x43,0x31,0x42,0x45,0x39,0x44,0x35,0x34,0x33,0x32,0x36,0x32,0x41,0x37,0x39,0x46,0x45,0x39,0x35,0x44,0x42,0x32,0x32,0x36,0x37,0x32,0x34,0x43,0x39,0x32,0x46,0x44,0x30,0x33,0x34, 0x45,0x33,0x45,0x36,0x46,0x42,0x35,0x31,0x34,0x39,0x38,0x36,0x42,0x38,0x33,0x43,0x44,0x30,0x32,0x35,0x35,0x46,0x44,0x36,0x45,0x43,0x39,0x45,0x30,0x33,0x36,0x31,0x38,0x37,0x41,0x39,0x36,0x38,0x34,0x30,0x43,0x37,0x46,0x38,0x45,0x32,0x30,0x33,0x45,0x36,0x43,0x46,0x30,0x35,0x30,0x32,0x30,0x33,0x30,0x31,0x30,0x30,0x30,0x31,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "CN=Microsoft Code Signing PCA, OU=Copyright (c) 2000 Microsoft Corp., O=Microsoft Corporation, L=Redmond, S=Washington, C=US", x509.Issuer); - Assertion.AssertEquals ("Subject", "CN=Microsoft Corporation, OU=Copyright (c) 2002 Microsoft Corp., O=Microsoft Corporation, L=Redmond, S=Washington, C=US", x509.Subject); + Assert.AreEqual ("CN=Microsoft Code Signing PCA, OU=Copyright (c) 2000 Microsoft Corp., O=Microsoft Corporation, L=Redmond, S=Washington, C=US", x509.Issuer, "Issuer"); + Assert.AreEqual ("CN=Microsoft Corporation, OU=Copyright (c) 2002 Microsoft Corp., O=Microsoft Corporation, L=Redmond, S=Washington, C=US", x509.Subject, "Subject"); #endif } @@ -1008,19 +1008,19 @@ public void Certificate13 () X509Certificate x509 = new X509Certificate (cert); // X509Certificate clone = new X509Certificate (x509); -// Assertion.Assert ("Equals", x509.Equals (clone)); -// Assertion.Assert ("Equals", clone.Equals (x509)); +// Assert.IsTrue (x509.Equals (clone), "Equals"); +// Assert.IsTrue (clone.Equals (x509), "Equals"); FileStream fs = File.OpenWrite ("temp.cer"); fs.Write (cert, 0, cert.Length); fs.Close (); X509Certificate disk = X509Certificate.CreateFromCertFile ("temp.cer"); -// Assertion.Assert ("Equals", disk.Equals (clone)); - Assertion.Assert ("Equals", disk.Equals (x509)); +// Assert.IsTrue (disk.Equals (clone), "Equals"); + Assert.IsTrue (disk.Equals (x509), "Equals"); byte[] hash = { 0x0E,0x29,0xCD,0xDC,0xA5,0xE7,0x32,0xA2,0x0D,0xCE,0xD8,0x7B,0x3D,0x00,0x24,0x46,0x85,0x3E,0xBB,0xD1 }; - AssertEquals ("GetCertHash", hash, x509.GetCertHash ()); - Assertion.AssertEquals ("GetCertHashString", "0E29CDDCA5E732A20DCED87B3D002446853EBBD1", x509.GetCertHashString ()); + Assert.AreEqual (hash, x509.GetCertHash (), "GetCertHash"); + Assert.AreEqual ("0E29CDDCA5E732A20DCED87B3D002446853EBBD1", x509.GetCertHashString (), "GetCertHashString"); #if NET_2_0 DateTime from = DateTime.ParseExact (x509.GetEffectiveDateString (), "MM/dd/yyyy HH:mm:ss", null).ToUniversalTime (); Assert.AreEqual ("04/19/2001 14:57:20", from.ToString (), "GetEffectiveDateString"); @@ -1028,37 +1028,37 @@ public void Certificate13 () Assert.AreEqual ("04/19/2011 14:57:20", until.ToString (), "GetExpirationDateString"); #else // fx 1.x has a bug where the returned dates were always in the Seattle time zone - Assertion.AssertEquals ("GetEffectiveDateString", DateTime.Parse ("04/19/2001 06:57:20"), DateTime.Parse (x509.GetEffectiveDateString ())); - Assertion.AssertEquals ("GetExpirationDateString", DateTime.Parse ("04/19/2011 06:57:20"), DateTime.Parse (x509.GetExpirationDateString ())); + Assert.AreEqual (DateTime.Parse ("04/19/2001 06:57:20"), DateTime.Parse (x509.GetEffectiveDateString ()), "GetEffectiveDateString"); + Assert.AreEqual (DateTime.Parse ("04/19/2011 06:57:20"), DateTime.Parse (x509.GetExpirationDateString ()), "GetExpirationDateString"); // which was making it easier to test the dates ;-) #endif - Assertion.AssertEquals ("GetFormat", "X509", x509.GetFormat ()); - Assertion.AssertEquals ("GetHashCode", 237620700, x509.GetHashCode ()); - Assertion.AssertEquals ("GetIssuerName", "C=US, O=Test Certificates, CN=DSA CA", x509.GetIssuerName ()); - Assertion.AssertEquals ("GetKeyAlgorithm", "1.2.840.10040.4.1", x509.GetKeyAlgorithm ()); + Assert.AreEqual ("X509", x509.GetFormat (), "GetFormat"); + Assert.AreEqual (237620700, x509.GetHashCode (), "GetHashCode"); + Assert.AreEqual ("C=US, O=Test Certificates, CN=DSA CA", x509.GetIssuerName (), "GetIssuerName"); + Assert.AreEqual ("1.2.840.10040.4.1", x509.GetKeyAlgorithm (), "GetKeyAlgorithm"); // this fails under 2.0 - Assertion.AssertNull ("GetKeyAlgorithmParameters", x509.GetKeyAlgorithmParameters ()); - Assertion.AssertNull ("GetKeyAlgorithmParametersString", x509.GetKeyAlgorithmParametersString ()); - Assertion.AssertEquals ("GetName", "C=US, O=Test Certificates, CN=DSA Parameters Inherited CA", x509.GetName ()); + Assert.IsNull (x509.GetKeyAlgorithmParameters (), "GetKeyAlgorithmParameters"); + Assert.IsNull (x509.GetKeyAlgorithmParametersString (), "GetKeyAlgorithmParametersString"); + Assert.AreEqual ("C=US, O=Test Certificates, CN=DSA Parameters Inherited CA", x509.GetName (), "GetName"); byte[] pubkey = { 0x02,0x81,0x80,0x67,0x8C,0x47,0xDA,0x0C,0x36,0x81,0x64,0x39,0xF8,0x1A,0x37,0x0B,0xF0,0xBB,0xD4,0x13,0xFD,0x67,0x3D,0x40,0xC8,0x9C,0x92,0xE1,0x3A,0x89,0x54,0xB0,0xF2,0x97,0xA5,0x70,0xD0,0x64,0x17,0xA4,0xA7,0x7C,0xA9,0xE9,0x27,0x09,0x65,0xDF,0xA0,0xA5,0x1C,0xFC,0x04,0xDA,0x3E,0xDD,0x62,0x6B,0xF0,0x0C,0xED,0x81,0x57,0x4F,0x5D,0x29,0xC8,0x08,0x59,0x19,0x0C,0x5F,0x8D,0x88,0xF0,0xFF,0x8C,0xB6,0xE8,0x75,0x01,0xBE,0x10,0x0A,0x64,0xDF,0x57,0x7B,0x8B,0x6C,0x56,0xF0,0x53,0xCE,0x43,0x88,0xB9,0x09,0x99,0x08,0x3C, 0x90,0xAF,0x01,0xE8,0xD9,0x32,0x5D,0xED,0x56,0x02,0xCF,0x60,0xD2,0x01,0x3A,0xE3,0x0A,0x2B,0x9E,0x91,0x41,0xF6,0xC7,0x7C,0xDE,0x6C,0x99,0x63,0x00,0x0E }; - AssertEquals ("GetPublicKey", pubkey, x509.GetPublicKey ()); - Assertion.AssertEquals ("GetPublicKeyString", "028180678C47DA0C36816439F81A370BF0BBD413FD673D40C89C92E13A8954B0F297A570D06417A4A77CA9E9270965DFA0A51CFC04DA3EDD626BF00CED81574F5D29C80859190C5F8D88F0FF8CB6E87501BE100A64DF577B8B6C56F053CE4388B90999083C90AF01E8D9325DED5602CF60D2013AE30A2B9E9141F6C77CDE6C9963000E", x509.GetPublicKeyString ()); - AssertEquals ("GetRawCertData", cert, x509.GetRawCertData ()); - Assertion.AssertEquals ("GetRawCertDataString", ToString (cert), x509.GetRawCertDataString ()); + Assert.AreEqual (pubkey, x509.GetPublicKey (), "GetPublicKey"); + Assert.AreEqual ("028180678C47DA0C36816439F81A370BF0BBD413FD673D40C89C92E13A8954B0F297A570D06417A4A77CA9E9270965DFA0A51CFC04DA3EDD626BF00CED81574F5D29C80859190C5F8D88F0FF8CB6E87501BE100A64DF577B8B6C56F053CE4388B90999083C90AF01E8D9325DED5602CF60D2013AE30A2B9E9141F6C77CDE6C9963000E", x509.GetPublicKeyString (), "GetPublicKeyString"); + Assert.AreEqual (cert, x509.GetRawCertData (), "GetRawCertData"); + Assert.AreEqual (ToString (cert), x509.GetRawCertDataString (), "GetRawCertDataString"); byte[] serial = { 0x02 }; - AssertEquals ("GetSerialNumber", serial, x509.GetSerialNumber ()); - Assertion.AssertEquals ("GetSerialNumberString", "02", x509.GetSerialNumberString ()); + Assert.AreEqual (serial, x509.GetSerialNumber (), "GetSerialNumber"); + Assert.AreEqual ("02", x509.GetSerialNumberString (), "GetSerialNumberString"); byte[] ToStringArray = { 0x43,0x45,0x52,0x54,0x49,0x46,0x49,0x43,0x41,0x54,0x45,0x3A,0x0D,0x0A,0x09,0x46,0x6F,0x72,0x6D,0x61,0x74,0x3A,0x20,0x20,0x58,0x35,0x30,0x39,0x0D,0x0A,0x09,0x4E,0x61,0x6D,0x65,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x54,0x65,0x73,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x73,0x2C,0x20,0x43,0x4E,0x3D,0x44,0x53,0x41,0x20,0x50,0x61,0x72,0x61,0x6D,0x65,0x74,0x65,0x72,0x73,0x20,0x49,0x6E,0x68,0x65,0x72,0x69,0x74,0x65,0x64,0x20,0x43,0x41,0x0D,0x0A,0x09,0x49,0x73,0x73, 0x75,0x69,0x6E,0x67,0x20,0x43,0x41,0x3A,0x20,0x20,0x43,0x3D,0x55,0x53,0x2C,0x20,0x4F,0x3D,0x54,0x65,0x73,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x73,0x2C,0x20,0x43,0x4E,0x3D,0x44,0x53,0x41,0x20,0x43,0x41,0x0D,0x0A,0x09,0x4B,0x65,0x79,0x20,0x41,0x6C,0x67,0x6F,0x72,0x69,0x74,0x68,0x6D,0x3A,0x20,0x20,0x31,0x2E,0x32,0x2E,0x38,0x34,0x30,0x2E,0x31,0x30,0x30,0x34,0x30,0x2E,0x34,0x2E,0x31,0x0D,0x0A,0x09,0x53,0x65,0x72,0x69,0x61,0x6C,0x20,0x4E,0x75,0x6D,0x62,0x65,0x72,0x3A,0x20, 0x20,0x30,0x32,0x0D,0x0A,0x09,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x4B,0x65,0x79,0x3A,0x20,0x20,0x30,0x32,0x38,0x31,0x38,0x30,0x36,0x37,0x38,0x43,0x34,0x37,0x44,0x41,0x30,0x43,0x33,0x36,0x38,0x31,0x36,0x34,0x33,0x39,0x46,0x38,0x31,0x41,0x33,0x37,0x30,0x42,0x46,0x30,0x42,0x42,0x44,0x34,0x31,0x33,0x46,0x44,0x36,0x37,0x33,0x44,0x34,0x30,0x43,0x38,0x39,0x43,0x39,0x32,0x45,0x31,0x33,0x41,0x38,0x39,0x35,0x34,0x42,0x30,0x46,0x32,0x39,0x37,0x41,0x35,0x37,0x30,0x44,0x30,0x36,0x34,0x31,0x37,0x41,0x34,0x41, 0x37,0x37,0x43,0x41,0x39,0x45,0x39,0x32,0x37,0x30,0x39,0x36,0x35,0x44,0x46,0x41,0x30,0x41,0x35,0x31,0x43,0x46,0x43,0x30,0x34,0x44,0x41,0x33,0x45,0x44,0x44,0x36,0x32,0x36,0x42,0x46,0x30,0x30,0x43,0x45,0x44,0x38,0x31,0x35,0x37,0x34,0x46,0x35,0x44,0x32,0x39,0x43,0x38,0x30,0x38,0x35,0x39,0x31,0x39,0x30,0x43,0x35,0x46,0x38,0x44,0x38,0x38,0x46,0x30,0x46,0x46,0x38,0x43,0x42,0x36,0x45,0x38,0x37,0x35,0x30,0x31,0x42,0x45,0x31,0x30,0x30,0x41,0x36,0x34,0x44,0x46,0x35,0x37,0x37,0x42,0x38,0x42,0x36,0x43,0x35, 0x36,0x46,0x30,0x35,0x33,0x43,0x45,0x34,0x33,0x38,0x38,0x42,0x39,0x30,0x39,0x39,0x39,0x30,0x38,0x33,0x43,0x39,0x30,0x41,0x46,0x30,0x31,0x45,0x38,0x44,0x39,0x33,0x32,0x35,0x44,0x45,0x44,0x35,0x36,0x30,0x32,0x43,0x46,0x36,0x30,0x44,0x32,0x30,0x31,0x33,0x41,0x45,0x33,0x30,0x41,0x32,0x42,0x39,0x45,0x39,0x31,0x34,0x31,0x46,0x36,0x43,0x37,0x37,0x43,0x44,0x45,0x36,0x43,0x39,0x39,0x36,0x33,0x30,0x30,0x30,0x45,0x0D,0x0A,0x0D,0x0A }; string tsa = Encoding.Default.GetString (ToStringArray).Replace ("\r\n", Environment.NewLine); - //Assertion.AssertEquals ("ToString(true)", tsa, x509.ToString (true)); + //Assert.AreEqual (tsa, x509.ToString (true), "ToString(true)"); #if NET_2_0 - Assertion.AssertEquals ("Issuer", "C=US, O=\"RSA Data Security, Inc.\", OU=Secure Server Certification Authority", x509.Issuer); - Assertion.AssertEquals ("Subject", "C=US, S=California, O=CommerceNet, OU=Server Certification Authority", x509.Subject); + Assert.AreEqual ("C=US, O=\"RSA Data Security, Inc.\", OU=Secure Server Certification Authority", x509.Issuer, "Issuer"); + Assert.AreEqual ("C=US, S=California, O=CommerceNet, OU=Server Certification Authority", x509.Subject, "Subject"); #endif } diff --git a/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509SpcTest.cs b/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509SpcTest.cs index 448057d4b1f..72639f7bf7f 100644 --- a/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509SpcTest.cs +++ b/mcs/class/corlib/Test/System.Security.Cryptography.X509Certificates/X509SpcTest.cs @@ -19,7 +19,7 @@ using System.Text; namespace MonoTests.System.Security.Cryptography.X509Certificates { [TestFixture] - public class SoftwarePublisherCertificateTest : Assertion { + public class SoftwarePublisherCertificateTest { [TearDown] public void TearDown () @@ -1010,7 +1010,7 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { X509Certificate spc = X509Certificate.CreateFromSignedFile (filename); X509Certificate cert = new X509Certificate (motus); - AssertEquals ("CreateFromSignedFile", cert.GetRawCertDataString (), spc.GetRawCertDataString ()); + Assert.AreEqual (cert.GetRawCertDataString (), spc.GetRawCertDataString (), "CreateFromSignedFile"); } [Test] @@ -1030,7 +1030,7 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { X509Certificate spc = X509Certificate.CreateFromSignedFile (filename); #if NET_2_0 X509Certificate cert = new X509Certificate (motus); - AssertEquals ("CreateFromSignedFile", cert.GetRawCertDataString (), spc.GetRawCertDataString ()); + Assert.AreEqual (cert.GetRawCertDataString (), spc.GetRawCertDataString (), "CreateFromSignedFile"); // Invalid authenticode signature cannot be detected this way with 2.0 ? #endif } @@ -1048,7 +1048,7 @@ namespace MonoTests.System.Security.Cryptography.X509Certificates { X509Certificate.CreateFromSignedFile (filename); #else X509Certificate spc = X509Certificate.CreateFromSignedFile (filename); - AssertEquals ("NonSignedAssembly", 0, spc.GetHashCode ()); + Assert.AreEqual (0, spc.GetHashCode (), "NonSignedAssembly"); #endif } } diff --git a/mcs/class/corlib/Test/System.Security.Permissions/ChangeLog b/mcs/class/corlib/Test/System.Security.Permissions/ChangeLog index 1065cc85b56..2f1f6046120 100644 --- a/mcs/class/corlib/Test/System.Security.Permissions/ChangeLog +++ b/mcs/class/corlib/Test/System.Security.Permissions/ChangeLog @@ -1,3 +1,7 @@ +2009-06-24 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2006-08-21 Sebastien Pouliot * FileIOPermissionTest.cs: Added new test cases for union (#79118) and diff --git a/mcs/class/corlib/Test/System.Security.Permissions/EnvironmentPermissionTest.cs b/mcs/class/corlib/Test/System.Security.Permissions/EnvironmentPermissionTest.cs index a275f70cb01..1ada1bd44b5 100644 --- a/mcs/class/corlib/Test/System.Security.Permissions/EnvironmentPermissionTest.cs +++ b/mcs/class/corlib/Test/System.Security.Permissions/EnvironmentPermissionTest.cs @@ -35,7 +35,7 @@ using System.Security.Permissions; namespace MonoTests.System.Security.Permissions { [TestFixture] - public class EnvironmentPermissionTest : Assertion { + public class EnvironmentPermissionTest { private static string className = "System.Security.Permissions.EnvironmentPermission, "; private static string envVariables = "TMP;TEMP"; @@ -44,25 +44,25 @@ namespace MonoTests.System.Security.Permissions { public void PermissionStateNone () { EnvironmentPermission ep = new EnvironmentPermission (PermissionState.None); - AssertNotNull ("EnvironmentPermission(PermissionState.None)", ep); - Assert ("IsUnrestricted", !ep.IsUnrestricted ()); + Assert.IsNotNull (ep, "EnvironmentPermission(PermissionState.None)"); + Assert.IsTrue (!ep.IsUnrestricted (), "IsUnrestricted"); EnvironmentPermission copy = (EnvironmentPermission) ep.Copy (); - AssertEquals ("Copy.IsUnrestricted", ep.IsUnrestricted (), copy.IsUnrestricted ()); + Assert.AreEqual (ep.IsUnrestricted (), copy.IsUnrestricted (), "Copy.IsUnrestricted"); SecurityElement se = ep.ToXml (); - Assert ("ToXml-class", (se.Attributes ["class"] as string).StartsWith (className)); - AssertEquals ("ToXml-version", "1", (se.Attributes ["version"] as string)); + Assert.IsTrue ((se.Attributes ["class"] as string).StartsWith (className), "ToXml-class"); + Assert.AreEqual ("1", (se.Attributes ["version"] as string), "ToXml-version"); } [Test] public void PermissionStateUnrestricted () { EnvironmentPermission ep = new EnvironmentPermission (PermissionState.Unrestricted); - AssertNotNull ("EnvironmentPermission(PermissionState.Unrestricted)", ep); - Assert ("IsUnrestricted", ep.IsUnrestricted ()); + Assert.IsNotNull (ep, "EnvironmentPermission(PermissionState.Unrestricted)"); + Assert.IsTrue (ep.IsUnrestricted (), "IsUnrestricted"); EnvironmentPermission copy = (EnvironmentPermission) ep.Copy (); - AssertEquals ("Copy.IsUnrestricted", ep.IsUnrestricted (), copy.IsUnrestricted ()); + Assert.AreEqual (ep.IsUnrestricted (), copy.IsUnrestricted (), "Copy.IsUnrestricted"); SecurityElement se = ep.ToXml (); - AssertEquals ("ToXml-Unrestricted", "true", (se.Attributes ["Unrestricted"] as string)); + Assert.AreEqual ("true", (se.Attributes ["Unrestricted"] as string), "ToXml-Unrestricted"); } [Test] @@ -76,28 +76,28 @@ namespace MonoTests.System.Security.Permissions { public void AllAccess () { EnvironmentPermission ep = new EnvironmentPermission (EnvironmentPermissionAccess.AllAccess, envVariables); - Assert ("IsUnrestricted", !ep.IsUnrestricted ()); + Assert.IsTrue (!ep.IsUnrestricted (), "IsUnrestricted"); } [Test] public void NoAccess () { EnvironmentPermission ep = new EnvironmentPermission (EnvironmentPermissionAccess.NoAccess, envVariables); - Assert ("IsUnrestricted", !ep.IsUnrestricted ()); + Assert.IsTrue (!ep.IsUnrestricted (), "IsUnrestricted"); } [Test] public void ReadAccess () { EnvironmentPermission ep = new EnvironmentPermission (EnvironmentPermissionAccess.Read, envVariables); - Assert ("IsUnrestricted", !ep.IsUnrestricted ()); + Assert.IsTrue (!ep.IsUnrestricted (), "IsUnrestricted"); } [Test] public void WriteAccess () { EnvironmentPermission ep = new EnvironmentPermission (EnvironmentPermissionAccess.Write, envVariables); - Assert ("IsUnrestricted", !ep.IsUnrestricted ()); + Assert.IsTrue (!ep.IsUnrestricted (), "IsUnrestricted"); } [Test] @@ -111,8 +111,8 @@ namespace MonoTests.System.Security.Permissions { ep.AddPathList (EnvironmentPermissionAccess.Write, "PROMPT"); SecurityElement se = ep.ToXml (); // Note: Debugger can mess results (try to run without stepping) - AssertEquals ("AddPathList-ToXml-Read", "TMP;TEMP;UID", (se.Attributes ["Read"] as string)); - AssertEquals ("AddPathList-ToXml-Write", "TMP;TEMP;PROMPT", (se.Attributes ["Write"] as string)); + Assert.AreEqual ("TMP;TEMP;UID", (se.Attributes ["Read"] as string), "AddPathList-ToXml-Read"); + Assert.AreEqual ("TMP;TEMP;PROMPT", (se.Attributes ["Write"] as string), "AddPathList-ToXml-Write"); } [Test] @@ -122,7 +122,7 @@ namespace MonoTests.System.Security.Permissions { EnvironmentPermission ep = new EnvironmentPermission (PermissionState.None); ep.AddPathList (EnvironmentPermissionAccess.Read, "UID"); ep.AddPathList (EnvironmentPermissionAccess.Write, "PROMPT"); - AssertEquals ("GetPathList-AllAccess", "", ep.GetPathList (EnvironmentPermissionAccess.AllAccess)); + Assert.AreEqual ("", ep.GetPathList (EnvironmentPermissionAccess.AllAccess), "GetPathList-AllAccess"); } [Test] @@ -132,7 +132,7 @@ namespace MonoTests.System.Security.Permissions { EnvironmentPermission ep = new EnvironmentPermission (PermissionState.None); ep.AddPathList (EnvironmentPermissionAccess.Read, "UID"); ep.AddPathList (EnvironmentPermissionAccess.Write, "PROMPT"); - AssertEquals ("GetPathList-NoAccess", "", ep.GetPathList (EnvironmentPermissionAccess.NoAccess)); + Assert.AreEqual ("", ep.GetPathList (EnvironmentPermissionAccess.NoAccess), "GetPathList-NoAccess"); } [Test] @@ -140,16 +140,16 @@ namespace MonoTests.System.Security.Permissions { { EnvironmentPermission ep = new EnvironmentPermission (PermissionState.None); #if NET_2_0 - AssertEquals ("GetPathList-Read-Empty", String.Empty, ep.GetPathList (EnvironmentPermissionAccess.Read)); - AssertEquals ("GetPathList-Write-Empty", String.Empty, ep.GetPathList (EnvironmentPermissionAccess.Write)); + Assert.AreEqual (String.Empty, ep.GetPathList (EnvironmentPermissionAccess.Read), "GetPathList-Read-Empty"); + Assert.AreEqual (String.Empty, ep.GetPathList (EnvironmentPermissionAccess.Write), "GetPathList-Write-Empty"); #else - AssertNull ("GetPathList-Read-Empty", ep.GetPathList (EnvironmentPermissionAccess.Read)); - AssertNull ("GetPathList-Write-Empty", ep.GetPathList (EnvironmentPermissionAccess.Write)); + Assert.IsNull (ep.GetPathList (EnvironmentPermissionAccess.Read), "GetPathList-Read-Empty"); + Assert.IsNull (ep.GetPathList (EnvironmentPermissionAccess.Write), "GetPathList-Write-Empty"); #endif ep.AddPathList (EnvironmentPermissionAccess.Read, "UID"); ep.AddPathList (EnvironmentPermissionAccess.Write, "PROMPT"); - AssertEquals ("GetPathList-Read", "UID", ep.GetPathList (EnvironmentPermissionAccess.Read)); - AssertEquals ("GetPathList-Write", "PROMPT", ep.GetPathList (EnvironmentPermissionAccess.Write)); + Assert.AreEqual ("UID", ep.GetPathList (EnvironmentPermissionAccess.Read), "GetPathList-Read"); + Assert.AreEqual ("PROMPT", ep.GetPathList (EnvironmentPermissionAccess.Write), "GetPathList-Write"); } [Test] @@ -162,8 +162,8 @@ namespace MonoTests.System.Security.Permissions { ep.SetPathList (EnvironmentPermissionAccess.Read, "UID"); ep.SetPathList (EnvironmentPermissionAccess.Write, "PROMPT"); SecurityElement se = ep.ToXml (); - AssertEquals ("SetPathList-ToXml-Read", "UID", (se.Attributes ["Read"] as string)); - AssertEquals ("SetPathList-ToXml-Write", "PROMPT", (se.Attributes ["Write"] as string)); + Assert.AreEqual ("UID", (se.Attributes ["Read"] as string), "SetPathList-ToXml-Read"); + Assert.AreEqual ("PROMPT", (se.Attributes ["Write"] as string), "SetPathList-ToXml-Write"); } [Test] @@ -209,15 +209,15 @@ namespace MonoTests.System.Security.Permissions { { EnvironmentPermission ep = new EnvironmentPermission (PermissionState.None); SecurityElement se = ep.ToXml (); - AssertNotNull ("ToXml()", se); + Assert.IsNotNull (se, "ToXml()"); ep.FromXml (se); se.AddAttribute ("Read", envVariables); ep.FromXml (se); - AssertEquals ("FromXml-Read", envVariables, ep.GetPathList (EnvironmentPermissionAccess.Read)); + Assert.AreEqual (envVariables, ep.GetPathList (EnvironmentPermissionAccess.Read), "FromXml-Read"); se.AddAttribute ("Write", envVariables); ep.FromXml (se); - AssertEquals ("FromXml-Read", envVariables, ep.GetPathList (EnvironmentPermissionAccess.Read)); - AssertEquals ("FromXml-Write", envVariables, ep.GetPathList (EnvironmentPermissionAccess.Write)); + Assert.AreEqual (envVariables, ep.GetPathList (EnvironmentPermissionAccess.Read), "FromXml-Read"); + Assert.AreEqual (envVariables, ep.GetPathList (EnvironmentPermissionAccess.Write), "FromXml-Write"); } [Test] @@ -226,7 +226,7 @@ namespace MonoTests.System.Security.Permissions { EnvironmentPermission ep1 = new EnvironmentPermission (EnvironmentPermissionAccess.Read, envVariables); EnvironmentPermission ep2 = null; EnvironmentPermission ep3 = (EnvironmentPermission) ep1.Union (ep2); - AssertEquals ("EP1 U null == EP1", ep1.ToXml ().ToString (), ep3.ToXml ().ToString ()); + Assert.AreEqual (ep1.ToXml ().ToString (), ep3.ToXml ().ToString (), "EP1 U null == EP1"); } [Test] @@ -235,9 +235,9 @@ namespace MonoTests.System.Security.Permissions { EnvironmentPermission ep1 = new EnvironmentPermission (PermissionState.Unrestricted); EnvironmentPermission ep2 = new EnvironmentPermission (EnvironmentPermissionAccess.Read, envVariables); EnvironmentPermission ep3 = (EnvironmentPermission) ep1.Union (ep2); - Assert ("Unrestricted U EP2 == Unrestricted", ep3.IsUnrestricted ()); + Assert.IsTrue (ep3.IsUnrestricted (), "Unrestricted U EP2 == Unrestricted"); ep3 = (EnvironmentPermission) ep2.Union (ep1); - Assert ("EP2 U Unrestricted == Unrestricted", ep3.IsUnrestricted ()); + Assert.IsTrue (ep3.IsUnrestricted (), "EP2 U Unrestricted == Unrestricted"); } #if NET_2_0 [Category ("NotWorking")] @@ -249,7 +249,7 @@ namespace MonoTests.System.Security.Permissions { EnvironmentPermission ep2 = new EnvironmentPermission (EnvironmentPermissionAccess.Write, envVariables); EnvironmentPermission ep3 = (EnvironmentPermission) ep1.Union (ep2); EnvironmentPermission ep4 = new EnvironmentPermission (EnvironmentPermissionAccess.AllAccess, envVariables); - AssertEquals ("EP1 U EP2 == EP1+2", ep3.ToXml ().ToString (), ep4.ToXml ().ToString ()); + Assert.AreEqual (ep3.ToXml ().ToString (), ep4.ToXml ().ToString (), "EP1 U EP2 == EP1+2"); } [Test] @@ -267,7 +267,7 @@ namespace MonoTests.System.Security.Permissions { EnvironmentPermission ep1 = new EnvironmentPermission (EnvironmentPermissionAccess.Read, envVariables); EnvironmentPermission ep2 = null; EnvironmentPermission ep3 = (EnvironmentPermission) ep1.Intersect (ep2); - AssertNull ("EP1 N null == null", ep3); + Assert.IsNull (ep3, "EP1 N null == null"); } [Test] @@ -276,11 +276,11 @@ namespace MonoTests.System.Security.Permissions { EnvironmentPermission ep1 = new EnvironmentPermission (PermissionState.Unrestricted); EnvironmentPermission ep2 = new EnvironmentPermission (EnvironmentPermissionAccess.Read, envVariables); EnvironmentPermission ep3 = (EnvironmentPermission) ep1.Intersect (ep2); - Assert ("Unrestricted N EP2 == EP2", !ep3.IsUnrestricted ()); - AssertEquals ("Unrestricted N EP2 == EP2", ep2.ToXml ().ToString (), ep3.ToXml ().ToString ()); + Assert.IsTrue (!ep3.IsUnrestricted (), "Unrestricted N EP2 == EP2"); + Assert.AreEqual (ep2.ToXml ().ToString (), ep3.ToXml ().ToString (), "Unrestricted N EP2 == EP2"); ep3 = (EnvironmentPermission) ep2.Intersect (ep1); - Assert ("EP2 N Unrestricted == EP2", !ep3.IsUnrestricted ()); - AssertEquals ("EP2 N Unrestricted == EP2", ep2.ToXml ().ToString (), ep3.ToXml ().ToString ()); + Assert.IsTrue (!ep3.IsUnrestricted (), "EP2 N Unrestricted == EP2"); + Assert.AreEqual (ep2.ToXml ().ToString (), ep3.ToXml ().ToString (), "EP2 N Unrestricted == EP2"); } [Test] @@ -290,21 +290,21 @@ namespace MonoTests.System.Security.Permissions { EnvironmentPermission ep1 = new EnvironmentPermission (EnvironmentPermissionAccess.Write, envVariables); EnvironmentPermission ep2 = new EnvironmentPermission (EnvironmentPermissionAccess.Read, envVariables); EnvironmentPermission ep3 = (EnvironmentPermission) ep1.Intersect (ep2); - AssertNull ("EP1 N EP2 == null", ep3); + Assert.IsNull (ep3, "EP1 N EP2 == null"); // intersection in read EnvironmentPermission ep4 = new EnvironmentPermission (EnvironmentPermissionAccess.Read, "TMP"); ep3 = (EnvironmentPermission) ep4.Intersect (ep2); - AssertEquals ("Intersect-Read", "TMP", ep3.GetPathList (EnvironmentPermissionAccess.Read)); + Assert.AreEqual ("TMP", ep3.GetPathList (EnvironmentPermissionAccess.Read), "Intersect-Read"); // intersection in write EnvironmentPermission ep5 = new EnvironmentPermission (EnvironmentPermissionAccess.Write, "TEMP"); ep3 = (EnvironmentPermission) ep5.Intersect (ep1); - AssertEquals ("Intersect-Read", "TEMP", ep3.GetPathList (EnvironmentPermissionAccess.Write)); + Assert.AreEqual ("TEMP", ep3.GetPathList (EnvironmentPermissionAccess.Write), "Intersect-Read"); // intersection in read and write EnvironmentPermission ep6 = new EnvironmentPermission (EnvironmentPermissionAccess.AllAccess, "TEMP"); EnvironmentPermission ep7 = new EnvironmentPermission (EnvironmentPermissionAccess.AllAccess, envVariables); ep3 = (EnvironmentPermission) ep6.Intersect (ep7); - AssertEquals ("Intersect-AllAccess-Read", "TEMP", ep3.GetPathList (EnvironmentPermissionAccess.Read)); - AssertEquals ("Intersect-AllAccess-Write", "TEMP", ep3.GetPathList (EnvironmentPermissionAccess.Write)); + Assert.AreEqual ("TEMP", ep3.GetPathList (EnvironmentPermissionAccess.Read), "Intersect-AllAccess-Read"); + Assert.AreEqual ("TEMP", ep3.GetPathList (EnvironmentPermissionAccess.Write), "Intersect-AllAccess-Write"); } [Test] @@ -320,7 +320,7 @@ namespace MonoTests.System.Security.Permissions { public void IsSubsetOfNull () { EnvironmentPermission ep1 = new EnvironmentPermission (EnvironmentPermissionAccess.Read, envVariables); - Assert ("IsSubsetOf(null)", !ep1.IsSubsetOf (null)); + Assert.IsTrue (!ep1.IsSubsetOf (null), "IsSubsetOf(null)"); } [Test] @@ -329,9 +329,9 @@ namespace MonoTests.System.Security.Permissions { EnvironmentPermission ep1 = new EnvironmentPermission (PermissionState.Unrestricted); EnvironmentPermission ep2 = new EnvironmentPermission (EnvironmentPermissionAccess.Read, envVariables); EnvironmentPermission ep3 = new EnvironmentPermission (PermissionState.Unrestricted); - Assert ("Unrestricted.IsSubsetOf()", !ep1.IsSubsetOf (ep2)); - Assert ("IsSubsetOf(Unrestricted)", ep2.IsSubsetOf (ep1)); - Assert ("Unrestricted.IsSubsetOf(Unrestricted)", ep1.IsSubsetOf (ep3)); + Assert.IsTrue (!ep1.IsSubsetOf (ep2), "Unrestricted.IsSubsetOf()"); + Assert.IsTrue (ep2.IsSubsetOf (ep1), "IsSubsetOf(Unrestricted)"); + Assert.IsTrue (ep1.IsSubsetOf (ep3), "Unrestricted.IsSubsetOf(Unrestricted)"); } [Test] @@ -339,11 +339,11 @@ namespace MonoTests.System.Security.Permissions { { EnvironmentPermission ep1 = new EnvironmentPermission (EnvironmentPermissionAccess.Write, envVariables); EnvironmentPermission ep2 = new EnvironmentPermission (EnvironmentPermissionAccess.Read, envVariables); - Assert ("IsSubsetOf(nosubset1)", !ep1.IsSubsetOf (ep2)); - Assert ("IsSubsetOf(nosubset2)", !ep2.IsSubsetOf (ep1)); + Assert.IsTrue (!ep1.IsSubsetOf (ep2), "IsSubsetOf(nosubset1)"); + Assert.IsTrue (!ep2.IsSubsetOf (ep1), "IsSubsetOf(nosubset2)"); EnvironmentPermission ep3 = new EnvironmentPermission (EnvironmentPermissionAccess.Write, "TMP"); - Assert ("IsSubsetOf(TMP)", !ep1.IsSubsetOf (ep3)); - Assert ("TMP.IsSubsetOf()", ep3.IsSubsetOf (ep1)); + Assert.IsTrue (!ep1.IsSubsetOf (ep3), "IsSubsetOf(TMP)"); + Assert.IsTrue (ep3.IsSubsetOf (ep1), "TMP.IsSubsetOf()"); } [Test] @@ -352,7 +352,7 @@ namespace MonoTests.System.Security.Permissions { { EnvironmentPermission ep1 = new EnvironmentPermission (EnvironmentPermissionAccess.Read, envVariables); FileDialogPermission fdp2 = new FileDialogPermission (PermissionState.Unrestricted); - Assert ("IsSubsetOf(FileDialogPermission)", ep1.IsSubsetOf (fdp2)); + Assert.IsTrue (ep1.IsSubsetOf (fdp2), "IsSubsetOf(FileDialogPermission)"); } } } diff --git a/mcs/class/corlib/Test/System.Security.Permissions/FileDialogPermissionTest.cs b/mcs/class/corlib/Test/System.Security.Permissions/FileDialogPermissionTest.cs index e58e485ca9f..1ae067876b4 100644 --- a/mcs/class/corlib/Test/System.Security.Permissions/FileDialogPermissionTest.cs +++ b/mcs/class/corlib/Test/System.Security.Permissions/FileDialogPermissionTest.cs @@ -15,7 +15,7 @@ using System.Security.Permissions; namespace MonoTests.System.Security.Permissions { [TestFixture] - public class FileDialogPermissionTest : Assertion { + public class FileDialogPermissionTest { private static string className = "System.Security.Permissions.FileDialogPermission, "; @@ -23,85 +23,85 @@ namespace MonoTests.System.Security.Permissions { public void PermissionStateNone () { FileDialogPermission p = new FileDialogPermission (PermissionState.None); - AssertNotNull ("FileDialogPermission(PermissionState.None)", p); - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsNotNull (p, "FileDialogPermission(PermissionState.None)"); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); FileDialogPermission copy = (FileDialogPermission) p.Copy (); - AssertEquals ("Copy.IsUnrestricted", p.IsUnrestricted (), copy.IsUnrestricted ()); + Assert.AreEqual (p.IsUnrestricted (), copy.IsUnrestricted (), "Copy.IsUnrestricted"); SecurityElement se = p.ToXml (); - Assert ("ToXml-class", (se.Attributes ["class"] as string).StartsWith (className)); - AssertEquals ("ToXml-version", "1", (se.Attributes ["version"] as string)); + Assert.IsTrue ((se.Attributes ["class"] as string).StartsWith (className), "ToXml-class"); + Assert.AreEqual ("1", (se.Attributes ["version"] as string), "ToXml-version"); } [Test] public void PermissionStateUnrestricted () { FileDialogPermission p = new FileDialogPermission (PermissionState.Unrestricted); - AssertNotNull ("FileDialogPermission(PermissionState.Unrestricted)", p); - Assert ("IsUnrestricted", p.IsUnrestricted ()); + Assert.IsNotNull (p, "FileDialogPermission(PermissionState.Unrestricted)"); + Assert.IsTrue (p.IsUnrestricted (), "IsUnrestricted"); FileDialogPermission copy = (FileDialogPermission) p.Copy (); - AssertEquals ("Copy.IsUnrestricted", p.IsUnrestricted (), copy.IsUnrestricted ()); + Assert.AreEqual (p.IsUnrestricted (), copy.IsUnrestricted (), "Copy.IsUnrestricted"); SecurityElement se = p.ToXml (); - AssertEquals ("ToXml-Unrestricted", "true", (se.Attributes ["Unrestricted"] as string)); + Assert.AreEqual ("true", (se.Attributes ["Unrestricted"] as string), "ToXml-Unrestricted"); } [Test] public void Derestricted () { FileDialogPermission p = new FileDialogPermission (PermissionState.Unrestricted); - Assert ("IsUnrestricted", p.IsUnrestricted ()); + Assert.IsTrue (p.IsUnrestricted (), "IsUnrestricted"); p.Access = FileDialogPermissionAccess.None; - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); } [Test] public void None () { FileDialogPermission p = new FileDialogPermission (FileDialogPermissionAccess.None); - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); SecurityElement se = p.ToXml (); - AssertNull ("ToXml-Access=None", (se.Attributes ["Access"] as string)); + Assert.IsNull ((se.Attributes ["Access"] as string), "ToXml-Access=None"); } [Test] public void Open () { FileDialogPermission p = new FileDialogPermission (FileDialogPermissionAccess.Open); - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); SecurityElement se = p.ToXml (); - AssertEquals ("ToXml-Access=Open", "Open", (se.Attributes ["Access"] as string)); + Assert.AreEqual ("Open", (se.Attributes ["Access"] as string), "ToXml-Access=Open"); } [Test] public void Save () { FileDialogPermission p = new FileDialogPermission (FileDialogPermissionAccess.Save); - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); SecurityElement se = p.ToXml (); - AssertEquals ("ToXml-Access=Save", "Save", (se.Attributes ["Access"] as string)); + Assert.AreEqual ("Save", (se.Attributes ["Access"] as string), "ToXml-Access=Save"); } [Test] public void OpenSave () { FileDialogPermission p = new FileDialogPermission (FileDialogPermissionAccess.OpenSave); - Assert ("IsUnrestricted", p.IsUnrestricted ()); + Assert.IsTrue (p.IsUnrestricted (), "IsUnrestricted"); SecurityElement se = p.ToXml (); - AssertEquals ("ToXml-Unrestricted", "true", (se.Attributes ["Unrestricted"] as string)); + Assert.AreEqual ("true", (se.Attributes ["Unrestricted"] as string), "ToXml-Unrestricted"); } [Test] public void Access () { FileDialogPermission p = new FileDialogPermission (PermissionState.None); - Assert ("Access(default).IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "Access(default).IsUnrestricted"); p.Access = FileDialogPermissionAccess.None; - Assert ("Access(None).IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "Access(None).IsUnrestricted"); p.Access = FileDialogPermissionAccess.Open; - Assert ("Access(Open).IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "Access(Open).IsUnrestricted"); p.Access = FileDialogPermissionAccess.Save; - Assert ("Access(Save).IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "Access(Save).IsUnrestricted"); p.Access = FileDialogPermissionAccess.OpenSave; - Assert ("Access(OpenSave).IsUnrestricted", p.IsUnrestricted ()); + Assert.IsTrue (p.IsUnrestricted (), "Access(OpenSave).IsUnrestricted"); } [Test] @@ -143,25 +143,25 @@ namespace MonoTests.System.Security.Permissions { { FileDialogPermission p = new FileDialogPermission (PermissionState.None); SecurityElement se = p.ToXml (); - AssertNotNull ("ToXml()", se); + Assert.IsNotNull (se, "ToXml()"); FileDialogPermission p2 = (FileDialogPermission) p.Copy (); p2.FromXml (se); - AssertEquals ("FromXml-None", FileDialogPermissionAccess.None, p2.Access); + Assert.AreEqual (FileDialogPermissionAccess.None, p2.Access, "FromXml-None"); se.AddAttribute ("Access", "Open"); p2.FromXml (se); - AssertEquals ("FromXml-Open", FileDialogPermissionAccess.Open, p2.Access); + Assert.AreEqual (FileDialogPermissionAccess.Open, p2.Access, "FromXml-Open"); se = p.ToXml (); se.AddAttribute ("Access", "Save"); p2.FromXml (se); - AssertEquals ("FromXml-Save", FileDialogPermissionAccess.Save, p2.Access); + Assert.AreEqual (FileDialogPermissionAccess.Save, p2.Access, "FromXml-Save"); se = p.ToXml (); se.AddAttribute ("Unrestricted", "true"); p2.FromXml (se); - Assert ("FromXml-Unrestricted", p2.IsUnrestricted ()); + Assert.IsTrue (p2.IsUnrestricted (), "FromXml-Unrestricted"); } [Test] @@ -170,7 +170,7 @@ namespace MonoTests.System.Security.Permissions { FileDialogPermission p1 = new FileDialogPermission (FileDialogPermissionAccess.Open); FileDialogPermission p2 = null; FileDialogPermission p3 = (FileDialogPermission) p1.Union (p2); - AssertEquals ("P1 U null == P1", p1.ToXml ().ToString (), p3.ToXml ().ToString ()); + Assert.AreEqual (p1.ToXml ().ToString (), p3.ToXml ().ToString (), "P1 U null == P1"); } [Test] @@ -179,9 +179,9 @@ namespace MonoTests.System.Security.Permissions { FileDialogPermission p1 = new FileDialogPermission (PermissionState.Unrestricted); FileDialogPermission p2 = new FileDialogPermission (FileDialogPermissionAccess.Open); FileDialogPermission p3 = (FileDialogPermission) p1.Union (p2); - Assert ("Unrestricted U P2 == Unrestricted", p3.IsUnrestricted ()); + Assert.IsTrue (p3.IsUnrestricted (), "Unrestricted U P2 == Unrestricted"); p3 = (FileDialogPermission) p2.Union (p1); - Assert ("P2 U Unrestricted == Unrestricted", p3.IsUnrestricted ()); + Assert.IsTrue (p3.IsUnrestricted (), "P2 U Unrestricted == Unrestricted"); } [Test] @@ -191,8 +191,8 @@ namespace MonoTests.System.Security.Permissions { FileDialogPermission p2 = new FileDialogPermission (FileDialogPermissionAccess.Save); FileDialogPermission p3 = (FileDialogPermission) p1.Union (p2); FileDialogPermission p4 = new FileDialogPermission (FileDialogPermissionAccess.OpenSave); - AssertEquals ("P1 U P2 == P1+2", p3.ToXml ().ToString (), p4.ToXml ().ToString ()); - Assert ("P1+2==Unrestricted", p3.IsUnrestricted ()); + Assert.AreEqual (p3.ToXml ().ToString (), p4.ToXml ().ToString (), "P1 U P2 == P1+2"); + Assert.IsTrue (p3.IsUnrestricted (), "P1+2==Unrestricted"); } [Test] @@ -210,7 +210,7 @@ namespace MonoTests.System.Security.Permissions { FileDialogPermission p1 = new FileDialogPermission (FileDialogPermissionAccess.Open); FileDialogPermission p2 = null; FileDialogPermission p3 = (FileDialogPermission) p1.Intersect (p2); - AssertNull ("P1 N null == null", p3); + Assert.IsNull (p3, "P1 N null == null"); } [Test] @@ -219,11 +219,11 @@ namespace MonoTests.System.Security.Permissions { FileDialogPermission p1 = new FileDialogPermission (PermissionState.Unrestricted); FileDialogPermission p2 = new FileDialogPermission (FileDialogPermissionAccess.Open); FileDialogPermission p3 = (FileDialogPermission) p1.Intersect (p2); - Assert ("Unrestricted N P2 == P2", !p3.IsUnrestricted ()); - AssertEquals ("Unrestricted N EP2 == EP2", p2.ToXml ().ToString (), p3.ToXml ().ToString ()); + Assert.IsTrue (!p3.IsUnrestricted (), "Unrestricted N P2 == P2"); + Assert.AreEqual (p2.ToXml ().ToString (), p3.ToXml ().ToString (), "Unrestricted N EP2 == EP2"); p3 = (FileDialogPermission) p2.Intersect (p1); - Assert ("P2 N Unrestricted == P2", !p3.IsUnrestricted ()); - AssertEquals ("P2 N Unrestricted == P2", p2.ToXml ().ToString (), p3.ToXml ().ToString ()); + Assert.IsTrue (!p3.IsUnrestricted (), "P2 N Unrestricted == P2"); + Assert.AreEqual (p2.ToXml ().ToString (), p3.ToXml ().ToString (), "P2 N Unrestricted == P2"); } [Test] @@ -233,21 +233,21 @@ namespace MonoTests.System.Security.Permissions { FileDialogPermission p1 = new FileDialogPermission (FileDialogPermissionAccess.Open); FileDialogPermission p2 = new FileDialogPermission (FileDialogPermissionAccess.Save); FileDialogPermission p3 = (FileDialogPermission) p1.Intersect (p2); - AssertNull ("EP1 N EP2 == null", p3); + Assert.IsNull (p3, "EP1 N EP2 == null"); // intersection in open FileDialogPermission p4 = new FileDialogPermission (FileDialogPermissionAccess.Open); p3 = (FileDialogPermission) p4.Intersect (p1); - AssertEquals ("Intersect-Open", FileDialogPermissionAccess.Open, p3.Access); + Assert.AreEqual (FileDialogPermissionAccess.Open, p3.Access, "Intersect-Open"); // intersection in save FileDialogPermission p5 = new FileDialogPermission (FileDialogPermissionAccess.Save); p3 = (FileDialogPermission) p5.Intersect (p2); - AssertEquals ("Intersect-Save", FileDialogPermissionAccess.Save, p3.Access); + Assert.AreEqual (FileDialogPermissionAccess.Save, p3.Access, "Intersect-Save"); // intersection in open and save FileDialogPermission p6 = new FileDialogPermission (FileDialogPermissionAccess.OpenSave); FileDialogPermission p7 = new FileDialogPermission (FileDialogPermissionAccess.OpenSave); p3 = (FileDialogPermission) p6.Intersect (p7); - AssertEquals ("Intersect-AllAccess-OpenSave", FileDialogPermissionAccess.OpenSave, p3.Access); - Assert ("Intersect-OpenSave-Unrestricted", p3.IsUnrestricted ()); + Assert.AreEqual (FileDialogPermissionAccess.OpenSave, p3.Access, "Intersect-AllAccess-OpenSave"); + Assert.IsTrue (p3.IsUnrestricted (), "Intersect-OpenSave-Unrestricted"); } [Test] @@ -263,7 +263,7 @@ namespace MonoTests.System.Security.Permissions { public void IsSubsetOfNull () { FileDialogPermission p1 = new FileDialogPermission (FileDialogPermissionAccess.Open); - Assert ("IsSubsetOf(null)", !p1.IsSubsetOf (null)); + Assert.IsTrue (!p1.IsSubsetOf (null), "IsSubsetOf(null)"); } [Test] @@ -272,9 +272,9 @@ namespace MonoTests.System.Security.Permissions { FileDialogPermission p1 = new FileDialogPermission (PermissionState.Unrestricted); FileDialogPermission p2 = new FileDialogPermission (FileDialogPermissionAccess.Open); FileDialogPermission p3 = new FileDialogPermission (PermissionState.Unrestricted); - Assert ("Unrestricted.IsSubsetOf()", !p1.IsSubsetOf (p2)); - Assert ("IsSubsetOf(Unrestricted)", p2.IsSubsetOf (p1)); - Assert ("Unrestricted.IsSubsetOf(Unrestricted)", p1.IsSubsetOf (p3)); + Assert.IsTrue (!p1.IsSubsetOf (p2), "Unrestricted.IsSubsetOf()"); + Assert.IsTrue (p2.IsSubsetOf (p1), "IsSubsetOf(Unrestricted)"); + Assert.IsTrue (p1.IsSubsetOf (p3), "Unrestricted.IsSubsetOf(Unrestricted)"); } [Test] @@ -282,11 +282,11 @@ namespace MonoTests.System.Security.Permissions { { FileDialogPermission p1 = new FileDialogPermission (FileDialogPermissionAccess.Open); FileDialogPermission p2 = new FileDialogPermission (FileDialogPermissionAccess.Save); - Assert ("IsSubsetOf(nosubset1)", !p1.IsSubsetOf (p2)); - Assert ("IsSubsetOf(nosubset2)", !p2.IsSubsetOf (p1)); + Assert.IsTrue (!p1.IsSubsetOf (p2), "IsSubsetOf(nosubset1)"); + Assert.IsTrue (!p2.IsSubsetOf (p1), "IsSubsetOf(nosubset2)"); FileDialogPermission p3 = new FileDialogPermission (FileDialogPermissionAccess.OpenSave); - Assert ("IsSubsetOf(OpenSave)", p1.IsSubsetOf (p3)); - Assert ("OpenSave.IsSubsetOf()", !p3.IsSubsetOf (p1)); + Assert.IsTrue (p1.IsSubsetOf (p3), "IsSubsetOf(OpenSave)"); + Assert.IsTrue (!p3.IsSubsetOf (p1), "OpenSave.IsSubsetOf()"); } [Test] @@ -295,7 +295,7 @@ namespace MonoTests.System.Security.Permissions { { FileDialogPermission p1 = new FileDialogPermission (FileDialogPermissionAccess.Open); EnvironmentPermission ep2 = new EnvironmentPermission (PermissionState.Unrestricted); - Assert ("IsSubsetOf(EnvironmentPermission)", p1.IsSubsetOf (ep2)); + Assert.IsTrue (p1.IsSubsetOf (ep2), "IsSubsetOf(EnvironmentPermission)"); } } } diff --git a/mcs/class/corlib/Test/System.Security.Permissions/FileIOPermissionTest.cs b/mcs/class/corlib/Test/System.Security.Permissions/FileIOPermissionTest.cs index 242fa85a3b8..c41aad0505a 100644 --- a/mcs/class/corlib/Test/System.Security.Permissions/FileIOPermissionTest.cs +++ b/mcs/class/corlib/Test/System.Security.Permissions/FileIOPermissionTest.cs @@ -1,150 +1,150 @@ -// -// MonoTests.System.Security.Permissions.FileIOPermissionTest.cs -// -// Author: -// Nick Drochak (ndrochak@gol.com) -// -// (C) 2001-2002 Nick Drochak II -// -// Note: Only Unix and Windows file paths are tested. To run the tests on Mac OS's -// search for the "FIXME" notes below and adjust accordingly. - -using System; -using System.IO; +// +// MonoTests.System.Security.Permissions.FileIOPermissionTest.cs +// +// Author: +// Nick Drochak (ndrochak@gol.com) +// +// (C) 2001-2002 Nick Drochak II +// +// Note: Only Unix and Windows file paths are tested. To run the tests on Mac OS's +// search for the "FIXME" notes below and adjust accordingly. + +using System; +using System.IO; using System.Runtime.InteropServices; -using System.Reflection; -using System.Security; -using System.Security.Permissions; -using System.Text; - -using NUnit.Framework; - -namespace MonoTests.System.Security.Permissions { -#if !TARGET_JVM - public class FilePathUtil { - [DllImport("kernel32.dll")] - private static extern uint GetLongPathName (string shortPath, - StringBuilder buffer, uint bufLength); - - static public string GetLongPathName (string somePath) - { - StringBuilder buffer = new StringBuilder(260); - if (0 != GetLongPathName (somePath, buffer, (uint) buffer.Capacity)) - return buffer.ToString (); - else - return null; - } - - [DllImport("kernel32.dll", SetLastError=true)] - private static extern uint GetShortPathName ( string longPath, - StringBuilder buffer, uint bufLength); - - static public string GetShortPathName (string somePath) - { - StringBuilder buffer = new StringBuilder(260); - if (0 != GetShortPathName (somePath, buffer, (uint) buffer.Capacity)) - return buffer.ToString (); - else - return null; - } - } -#endif - - [TestFixture] - public class FileIOPermissionTest : Assertion { - - string[] pathArrayGood; - string[] pathArrayBad; - FileIOPermission p; - FileIOPermission p2; - string[] pathsInPermission; - string[] pathArrayGood2; - FileIOPermission unrestricted; - +using System.Reflection; +using System.Security; +using System.Security.Permissions; +using System.Text; + +using NUnit.Framework; + +namespace MonoTests.System.Security.Permissions { +#if !TARGET_JVM + public class FilePathUtil { + [DllImport("kernel32.dll")] + private static extern uint GetLongPathName (string shortPath, + StringBuilder buffer, uint bufLength); + + static public string GetLongPathName (string somePath) + { + StringBuilder buffer = new StringBuilder(260); + if (0 != GetLongPathName (somePath, buffer, (uint) buffer.Capacity)) + return buffer.ToString (); + else + return null; + } + + [DllImport("kernel32.dll", SetLastError=true)] + private static extern uint GetShortPathName ( string longPath, + StringBuilder buffer, uint bufLength); + + static public string GetShortPathName (string somePath) + { + StringBuilder buffer = new StringBuilder(260); + if (0 != GetShortPathName (somePath, buffer, (uint) buffer.Capacity)) + return buffer.ToString (); + else + return null; + } + } +#endif + + [TestFixture] + public class FileIOPermissionTest { + + string[] pathArrayGood; + string[] pathArrayBad; + FileIOPermission p; + FileIOPermission p2; + string[] pathsInPermission; + string[] pathArrayGood2; + FileIOPermission unrestricted; + private string filename; - private bool unix; - - [SetUp] - public void SetUp () - { - Environment.CurrentDirectory = Path.GetTempPath(); - filename = Path.GetTempFileName (); + private bool unix; + + [SetUp] + public void SetUp () + { + Environment.CurrentDirectory = Path.GetTempPath(); + filename = Path.GetTempFileName (); int os = (int) Environment.OSVersion.Platform; unix = ((os == 4) || (os == 128) || (os == 6)); - - p = null; - pathsInPermission = null; - pathArrayGood = new string[2]; - pathArrayBad = new string[2]; - pathArrayGood2 = new string[3]; - // FIXME: Adjust to run on Mac OS's - if (Path.VolumeSeparatorChar == ':') { - pathArrayGood[0] = "c:\\temp1"; - pathArrayGood[1] = "d:\\temp2"; - pathArrayBad[0] = "c:\\temp1"; - pathArrayBad[1] = "d:\\temp*"; - pathArrayGood2[0] = "c:\\temp1"; - pathArrayGood2[1] = "d:\\temp2"; - pathArrayGood2[2] = "z:\\something"; - } - else { - pathArrayGood[0] = "/temp1"; - pathArrayGood[1] = "/usr/temp2"; - pathArrayBad[0] = "/temp1"; - pathArrayBad[1] = "/usr/temp*"; // not really bad under Unix... - pathArrayGood2[0] = "/temp1"; - pathArrayGood2[1] = "/usr/temp2"; - pathArrayGood2[2] = "/usr/bin/something"; - } - } - - [TearDown] - public void TearDown () - { - if (File.Exists (filename)) - File.Delete (filename); - } - - [Test] - public void ConstructorPermissionState () - { - p = new FileIOPermission(PermissionState.None); - AssertEquals("Should be Restricted", false, p.IsUnrestricted()); - p = new FileIOPermission(PermissionState.Unrestricted); - AssertEquals("Should be Unrestricted", true, p.IsUnrestricted()); - try{ - p = new FileIOPermission((PermissionState)77); - Fail("Should have thrown an exception on invalid PermissionState"); - } - catch{ - // we should be here if things are working. nothing to do - } - } - - [Test] - [ExpectedException (typeof (ArgumentNullException))] - public void ConstructorString_Null () - { - p = new FileIOPermission(FileIOPermissionAccess.Append, (string)null); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void ConstructorString_NotRooted () - { - p = new FileIOPermission(FileIOPermissionAccess.Append, "this path is not rooted"); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void ConstructorString_InvalidPath () - { - p = new FileIOPermission(FileIOPermissionAccess.Append, ""); - } - - [Test] - public void ConstructorString_Wildcard () + + p = null; + pathsInPermission = null; + pathArrayGood = new string[2]; + pathArrayBad = new string[2]; + pathArrayGood2 = new string[3]; + // FIXME: Adjust to run on Mac OS's + if (Path.VolumeSeparatorChar == ':') { + pathArrayGood[0] = "c:\\temp1"; + pathArrayGood[1] = "d:\\temp2"; + pathArrayBad[0] = "c:\\temp1"; + pathArrayBad[1] = "d:\\temp*"; + pathArrayGood2[0] = "c:\\temp1"; + pathArrayGood2[1] = "d:\\temp2"; + pathArrayGood2[2] = "z:\\something"; + } + else { + pathArrayGood[0] = "/temp1"; + pathArrayGood[1] = "/usr/temp2"; + pathArrayBad[0] = "/temp1"; + pathArrayBad[1] = "/usr/temp*"; // not really bad under Unix... + pathArrayGood2[0] = "/temp1"; + pathArrayGood2[1] = "/usr/temp2"; + pathArrayGood2[2] = "/usr/bin/something"; + } + } + + [TearDown] + public void TearDown () + { + if (File.Exists (filename)) + File.Delete (filename); + } + + [Test] + public void ConstructorPermissionState () + { + p = new FileIOPermission(PermissionState.None); + Assert.AreEqual(false, p.IsUnrestricted(), "Should be Restricted"); + p = new FileIOPermission(PermissionState.Unrestricted); + Assert.AreEqual(true, p.IsUnrestricted(), "Should be Unrestricted"); + try{ + p = new FileIOPermission((PermissionState)77); + Assert.Fail("Should have thrown an exception on invalid PermissionState"); + } + catch{ + // we should be here if things are working. nothing to do + } + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void ConstructorString_Null () + { + p = new FileIOPermission(FileIOPermissionAccess.Append, (string)null); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void ConstructorString_NotRooted () + { + p = new FileIOPermission(FileIOPermissionAccess.Append, "this path is not rooted"); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void ConstructorString_InvalidPath () + { + p = new FileIOPermission(FileIOPermissionAccess.Append, ""); + } + + [Test] + public void ConstructorString_Wildcard () { try { // note: this is a valid path on UNIX so we must be able to protect it @@ -152,190 +152,190 @@ namespace MonoTests.System.Security.Permissions { } catch (ArgumentException) { if (unix) - Fail ("Wildcard * is valid in filenames"); + Assert.Fail ("Wildcard * is valid in filenames"); // else it's normal for Windows to throw ArgumentException } catch (Exception e) { - Fail ("Bad or wrong exception: " + e.ToString ()); - } - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void ConstructorString_InvalidAccess () - { - p = new FileIOPermission((FileIOPermissionAccess)77, "c:\\temp"); - } - - [Test] - public void ConstructorString () - { - string pathToAdd; - // FIXME: Adjust to run on Mac OS's - if (Path.VolumeSeparatorChar == ':') - pathToAdd = "c:\\temp"; - else - pathToAdd = "/temp"; - - p = new FileIOPermission(FileIOPermissionAccess.Read, pathToAdd); - pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read); - Assert("Does not contain correct number of paths. Expected 1 but got: "+pathsInPermission.Length, pathsInPermission.Length == 1); - Assert("Does not contain expected path from constructor: "+pathToAdd, pathsInPermission[0] == pathToAdd); - } - - [Test] - [ExpectedException (typeof (ArgumentNullException))] - public void ConstructorStringArray_Null () - { - p = new FileIOPermission(FileIOPermissionAccess.Append, (string[])null); - } - - [Test] - public void ConstructorStringArray_Wildcard () - { + Assert.Fail ("Bad or wrong exception: " + e.ToString ()); + } + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void ConstructorString_InvalidAccess () + { + p = new FileIOPermission((FileIOPermissionAccess)77, "c:\\temp"); + } + + [Test] + public void ConstructorString () + { + string pathToAdd; + // FIXME: Adjust to run on Mac OS's + if (Path.VolumeSeparatorChar == ':') + pathToAdd = "c:\\temp"; + else + pathToAdd = "/temp"; + + p = new FileIOPermission(FileIOPermissionAccess.Read, pathToAdd); + pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue (pathsInPermission.Length == 1, "Does not contain correct number of paths. Expected 1 but got: "+pathsInPermission.Length); + Assert.IsTrue(pathsInPermission[0] == pathToAdd, "Does not contain expected path from constructor: "+pathToAdd); + } + + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void ConstructorStringArray_Null () + { + p = new FileIOPermission(FileIOPermissionAccess.Append, (string[])null); + } + + [Test] + public void ConstructorStringArray_Wildcard () + { try { // note: this is a valid path on UNIX so we must be able to protect it - p = new FileIOPermission(FileIOPermissionAccess.Append, pathArrayBad); + p = new FileIOPermission(FileIOPermissionAccess.Append, pathArrayBad); } catch (ArgumentException) { if (unix) - Fail ("Wildcard * is valid in filenames"); + Assert.Fail ("Wildcard * is valid in filenames"); // else it's normal for Windows to throw ArgumentException } catch (Exception e) { - Fail ("Bad or wrong exception: " + e.ToString ()); - } - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void ConstructorStringArray_InvalidAccess () - { - p = new FileIOPermission((FileIOPermissionAccess)77, pathArrayGood); - } - - [Test] - public void ConstructorStringArray () - { - p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); - pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read); - Assert("Does not contain correct number of paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2); - foreach (string s in pathsInPermission){ - Assert("Unexpected path in the Permission: " + s, Array.IndexOf(pathsInPermission, s) >=0); - } - } - - [Test] - public void AddPathListStringArray () - { - p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); - pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read); - Assert("Does not contain correct number of paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2); - foreach (string s in pathsInPermission){ - Assert("Unexpected path in the Permission: " + s, Array.IndexOf(pathsInPermission, s) >=0); - } - - p.AddPathList(FileIOPermissionAccess.Append, pathArrayGood); - pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read); - Assert("Should still contain correct number Read paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2); - foreach (string s in pathsInPermission){ - Assert("Unexpected path in the Permission: " + s, Array.IndexOf(pathsInPermission, s) >=0); - } - pathsInPermission = p.GetPathList(FileIOPermissionAccess.Append); - Assert("Should contain correct number of Append paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2); - foreach (string s in pathsInPermission){ - Assert("Unexpected path in the Permission: " + s, Array.IndexOf(pathsInPermission, s) >=0); - } - } - - [Test] - public void Intersect () - { - p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); - p.AllFiles = FileIOPermissionAccess.Append; - p.AllLocalFiles = FileIOPermissionAccess.Write; - - unrestricted = new FileIOPermission(PermissionState.Unrestricted); - - FileIOPermission intersection = (FileIOPermission)p.Intersect(unrestricted); - pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read); - Assert("Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2); - Assert("Should have Append bit in AllFiles.", (intersection.AllFiles & FileIOPermissionAccess.Append) != 0); - Assert("Should have Write bit in AllLocalFiles.", (intersection.AllLocalFiles & FileIOPermissionAccess.Write) != 0); - - intersection = (FileIOPermission)unrestricted.Intersect(p); - pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read); - Assert("Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2); - Assert("Should have Append bit in AllFiles.", (intersection.AllFiles & FileIOPermissionAccess.Append) != 0); - Assert("Should have Write bit in AllLocalFiles.", (intersection.AllLocalFiles & FileIOPermissionAccess.Write) != 0); - - p2 = new FileIOPermission(FileIOPermissionAccess.Append | FileIOPermissionAccess.Read, pathArrayGood2); - p2.AllFiles = FileIOPermissionAccess.Append | FileIOPermissionAccess.Write; - p2.AllLocalFiles = FileIOPermissionAccess.Write | FileIOPermissionAccess.Read; - intersection = (FileIOPermission)p.Intersect(p2); - pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read); - AssertNotNull ("Should have some paths", pathsInPermission); - AssertEquals ("Should contain correct number of Read paths", 2, pathsInPermission.Length); - AssertEquals ("Should have only Append bit in AllFiles.", FileIOPermissionAccess.Append, intersection.AllFiles); - AssertEquals ("Should have only Write bit in AllLocalFiles.", FileIOPermissionAccess.Write, intersection.AllLocalFiles); - - intersection = (FileIOPermission)p2.Intersect(p); - pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read); - Assert("Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2); - Assert("Should have only Append bit in AllFiles.", intersection.AllFiles == FileIOPermissionAccess.Append); - Assert("Should have only Write bit in AllLocalFiles.", intersection.AllLocalFiles == FileIOPermissionAccess.Write); - } - - [Test] - public void IsSubsetOf () - { - unrestricted = new FileIOPermission(PermissionState.Unrestricted); - Assert("IsSubsetOf reflective test failed", unrestricted.IsSubsetOf(unrestricted)); - - p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); - p.AllFiles = FileIOPermissionAccess.Append; - p.AllLocalFiles = FileIOPermissionAccess.Write; - Assert("#1 IsSubsetOf reflective test failed", p.IsSubsetOf(p)); - Assert("#1 IsSubsetOf false test failed", !unrestricted.IsSubsetOf(p)); - Assert("#1 IsSubsetOf true test failed", p.IsSubsetOf(unrestricted)); - - p2 = new FileIOPermission(FileIOPermissionAccess.Append | FileIOPermissionAccess.Read, pathArrayGood2); - p2.AllFiles = FileIOPermissionAccess.Append | FileIOPermissionAccess.Write; - p2.AllLocalFiles = FileIOPermissionAccess.Write | FileIOPermissionAccess.Read; - Assert("#2 IsSubsetOf reflective test failed", p2.IsSubsetOf(p2)); - Assert("#2 IsSubsetOf true test failed", p.IsSubsetOf(p2)); - Assert("#2 IsSubsetOf false test failed", !p2.IsSubsetOf(p)); - } - - [Test] - public void Union () - { - unrestricted = new FileIOPermission(PermissionState.Unrestricted); - p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); - - FileIOPermission union = (FileIOPermission)unrestricted.Union(p); - pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read); - Assert("Should get an unrestricted permission", union.IsUnrestricted()); - Assert("Path list should be empty", pathsInPermission == null); - - union = (FileIOPermission)p.Union(unrestricted); - pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read); - Assert("Should get an unrestricted permission", union.IsUnrestricted()); - Assert("Path list should be empty", pathsInPermission == null); - - p2 = new FileIOPermission(FileIOPermissionAccess.Append, pathArrayGood2); - - union = (FileIOPermission)p.Union(p2); - pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read); - Assert("Path list should have 2 for Read", pathsInPermission.Length == pathArrayGood.Length); - pathsInPermission = union.GetPathList(FileIOPermissionAccess.Append); - Assert("Path list should have 3 for Append", pathsInPermission.Length == pathArrayGood2.Length); - - union = (FileIOPermission)p2.Union(p); - pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read); - Assert("Path list should have 2 for Read", pathsInPermission.Length == pathArrayGood.Length); - pathsInPermission = union.GetPathList(FileIOPermissionAccess.Append); - Assert("Path list should have 3 for Append", pathsInPermission.Length == pathArrayGood2.Length); + Assert.Fail ("Bad or wrong exception: " + e.ToString ()); + } + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void ConstructorStringArray_InvalidAccess () + { + p = new FileIOPermission((FileIOPermissionAccess)77, pathArrayGood); + } + + [Test] + public void ConstructorStringArray () + { + p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); + pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue (pathsInPermission.Length == 2, "Does not contain correct number of paths. Expected 2 but got: "+pathsInPermission.Length); + foreach (string s in pathsInPermission){ + Assert.IsTrue (Array.IndexOf(pathsInPermission, s) >=0, "Unexpected path in the Permission: " + s); + } + } + + [Test] + public void AddPathListStringArray () + { + p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); + pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue (pathsInPermission.Length == 2, "Does not contain correct number of paths. Expected 2 but got: "+pathsInPermission.Length); + foreach (string s in pathsInPermission){ + Assert.IsTrue (Array.IndexOf(pathsInPermission, s) >=0, "Unexpected path in the Permission: " + s); + } + + p.AddPathList(FileIOPermissionAccess.Append, pathArrayGood); + pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue (pathsInPermission.Length == 2, "Should still contain correct number Read paths. Expected 2 but got: "+pathsInPermission.Length); + foreach (string s in pathsInPermission){ + Assert.IsTrue (Array.IndexOf(pathsInPermission, s) >=0, "Unexpected path in the Permission: " + s); + } + pathsInPermission = p.GetPathList(FileIOPermissionAccess.Append); + Assert.IsTrue (pathsInPermission.Length == 2, "Should contain correct number of Append paths. Expected 2 but got: "+pathsInPermission.Length); + foreach (string s in pathsInPermission){ + Assert.IsTrue (Array.IndexOf(pathsInPermission, s) >=0, "Unexpected path in the Permission: " + s); + } + } + + [Test] + public void Intersect () + { + p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); + p.AllFiles = FileIOPermissionAccess.Append; + p.AllLocalFiles = FileIOPermissionAccess.Write; + + unrestricted = new FileIOPermission(PermissionState.Unrestricted); + + FileIOPermission intersection = (FileIOPermission)p.Intersect(unrestricted); + pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue (pathsInPermission.Length == 2, "Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission.Length); + Assert.IsTrue((intersection.AllFiles & FileIOPermissionAccess.Append) != 0, "Should have Append bit in AllFiles."); + Assert.IsTrue((intersection.AllLocalFiles & FileIOPermissionAccess.Write) != 0, "Should have Write bit in AllLocalFiles."); + + intersection = (FileIOPermission)unrestricted.Intersect(p); + pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue (pathsInPermission.Length == 2, "Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission.Length); + Assert.IsTrue((intersection.AllFiles & FileIOPermissionAccess.Append) != 0, "Should have Append bit in AllFiles."); + Assert.IsTrue((intersection.AllLocalFiles & FileIOPermissionAccess.Write) != 0, "Should have Write bit in AllLocalFiles."); + + p2 = new FileIOPermission(FileIOPermissionAccess.Append | FileIOPermissionAccess.Read, pathArrayGood2); + p2.AllFiles = FileIOPermissionAccess.Append | FileIOPermissionAccess.Write; + p2.AllLocalFiles = FileIOPermissionAccess.Write | FileIOPermissionAccess.Read; + intersection = (FileIOPermission)p.Intersect(p2); + pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read); + Assert.IsNotNull (pathsInPermission, "Should have some paths"); + Assert.AreEqual (2, pathsInPermission.Length, "Should contain correct number of Read paths"); + Assert.AreEqual ( FileIOPermissionAccess.Append, intersection.AllFiles, "Should have only Append bit in AllFiles."); + Assert.AreEqual ( FileIOPermissionAccess.Write, intersection.AllLocalFiles, "Should have only Write bit in AllLocalFiles."); + + intersection = (FileIOPermission)p2.Intersect(p); + pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue (pathsInPermission.Length == 2, "Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission.Length); + Assert.IsTrue(intersection.AllFiles == FileIOPermissionAccess.Append, "Should have only Append bit in AllFiles."); + Assert.IsTrue(intersection.AllLocalFiles == FileIOPermissionAccess.Write, "Should have only Write bit in AllLocalFiles."); + } + + [Test] + public void IsSubsetOf () + { + unrestricted = new FileIOPermission(PermissionState.Unrestricted); + Assert.IsTrue(unrestricted.IsSubsetOf(unrestricted), "IsSubsetOf reflective test failed"); + + p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); + p.AllFiles = FileIOPermissionAccess.Append; + p.AllLocalFiles = FileIOPermissionAccess.Write; + Assert.IsTrue(p.IsSubsetOf(p), "#1 IsSubsetOf reflective test failed"); + Assert.IsTrue(!unrestricted.IsSubsetOf(p), "#1 IsSubsetOf false test failed"); + Assert.IsTrue(p.IsSubsetOf(unrestricted), "#1 IsSubsetOf true test failed"); + + p2 = new FileIOPermission(FileIOPermissionAccess.Append | FileIOPermissionAccess.Read, pathArrayGood2); + p2.AllFiles = FileIOPermissionAccess.Append | FileIOPermissionAccess.Write; + p2.AllLocalFiles = FileIOPermissionAccess.Write | FileIOPermissionAccess.Read; + Assert.IsTrue(p2.IsSubsetOf(p2), "#2 IsSubsetOf reflective test failed"); + Assert.IsTrue(p.IsSubsetOf(p2), "#2 IsSubsetOf true test failed"); + Assert.IsTrue(!p2.IsSubsetOf(p), "#2 IsSubsetOf false test failed"); + } + + [Test] + public void Union () + { + unrestricted = new FileIOPermission(PermissionState.Unrestricted); + p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); + + FileIOPermission union = (FileIOPermission)unrestricted.Union(p); + pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue(union.IsUnrestricted(), "Should get an unrestricted permission"); + Assert.IsTrue(pathsInPermission == null, "Path list should be empty"); + + union = (FileIOPermission)p.Union(unrestricted); + pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue(union.IsUnrestricted(), "Should get an unrestricted permission"); + Assert.IsTrue(pathsInPermission == null, "Path list should be empty"); + + p2 = new FileIOPermission(FileIOPermissionAccess.Append, pathArrayGood2); + + union = (FileIOPermission)p.Union(p2); + pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue(pathsInPermission.Length == pathArrayGood.Length, "Path list should have 2 for Read"); + pathsInPermission = union.GetPathList(FileIOPermissionAccess.Append); + Assert.IsTrue(pathsInPermission.Length == pathArrayGood2.Length, "Path list should have 3 for Append"); + + union = (FileIOPermission)p2.Union(p); + pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue(pathsInPermission.Length == pathArrayGood.Length, "Path list should have 2 for Read"); + pathsInPermission = union.GetPathList(FileIOPermissionAccess.Append); + Assert.IsTrue(pathsInPermission.Length == pathArrayGood2.Length, "Path list should have 3 for Append"); } [Test] @@ -349,9 +349,9 @@ namespace MonoTests.System.Security.Permissions { FileIOPermission union = (FileIOPermission) p.Union (p2); string[] paths = union.GetPathList(FileIOPermissionAccess.Read); - AssertEquals ("Length", 2, paths.Length); - AssertEquals ("0", f1[0], paths[0]); - AssertEquals ("1", f1[1], paths[1]); + Assert.AreEqual (2, paths.Length, "Length"); + Assert.AreEqual (f1[0], paths[0], "0"); + Assert.AreEqual (f1[1], paths[1], "1"); } private void Partial (string msg, string[] path1, string[] path2, int expected) @@ -361,12 +361,12 @@ namespace MonoTests.System.Security.Permissions { FileIOPermission union = (FileIOPermission) p.Union (p2); string[] paths = union.GetPathList(FileIOPermissionAccess.Read); - AssertEquals (msg + ".Length", expected, paths.Length); - AssertEquals (msg + "[0]", path1[0], paths[0]); + Assert.AreEqual (expected, paths.Length, msg + ".Length"); + Assert.AreEqual (path1[0], paths[0], msg + "[0]"); if (expected > 1) - AssertEquals (msg + "[1]", path2[0], paths[1]); - } - + Assert.AreEqual (path2[0], paths[1], msg + "[1]"); + } + [Test] public void Union_Partial () { @@ -376,81 +376,81 @@ namespace MonoTests.System.Security.Permissions { Partial ("2", f2, f1, 2); f1 = unix ? new string[] { "/dir/part/" } : new string[] { "c:\\dir\\part\\" }; - f2 = unix ? new string[] { "/dir/partial/" } : new string[] { "c:\\dir\\partial\\" }; - Partial ("3", f1, f2, 2); + f2 = unix ? new string[] { "/dir/partial/" } : new string[] { "c:\\dir\\partial\\" }; + Partial ("3", f1, f2, 2); Partial ("4", f2, f1, 2); f1 = unix ? new string[] { "/dir/part/ial" } : new string[] { "c:\\dir\\part\\ial" }; - f2 = unix ? new string[] { "/dir/part/ial" } : new string[] { "c:\\dir\\part\\ial" }; + f2 = unix ? new string[] { "/dir/part/ial" } : new string[] { "c:\\dir\\part\\ial" }; Partial ("5", f1, f2, 1); Partial ("6", f2, f1, 1); - } - - [Test] - public void FromXML () - { - p = new FileIOPermission(PermissionState.None); - SecurityElement esd = new SecurityElement("IPermission"); - esd.AddAttribute("class", "FileIOPermission"); - esd.AddAttribute("version", "1"); - esd.AddAttribute("Unrestricted", "true"); - p.FromXml(esd); - Assert("Should get an unrestricted permission", p.IsUnrestricted()); - - esd = new SecurityElement("IPermission"); - esd.AddAttribute("class", "FileIOPermission"); - esd.AddAttribute("version", "1"); - // FIXME: Adjust to run on Mac OS's - if (Path.VolumeSeparatorChar == ':') { - esd.AddAttribute("Read", "c:\\temp;d:\\temp2"); - esd.AddAttribute("Write", "c:\\temp;d:\\temp2;z:\\temp3"); - } - else { - esd.AddAttribute("Read", "/temp;/usr/temp2"); - esd.AddAttribute("Write", "/temp;/usr/temp2;/usr/bin/temp3"); - } - p = new FileIOPermission(PermissionState.None); - p.FromXml(esd); - pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read); - Assert("Path list should have 2 for Read", pathsInPermission.Length == 2); - pathsInPermission = p.GetPathList(FileIOPermissionAccess.Write); - Assert("Path list should have 2 for Write", pathsInPermission.Length == 3); - } - - [Test] - public void ToXML () - { - p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); - SecurityElement esd = p.ToXml(); - Assert("Esd tag incorrect", esd.Tag == "IPermission"); - Assert("Esd version incorrect", (String)esd.Attributes["version"] == "1"); - string read = (String)esd.Attributes["Read"]; - pathsInPermission = read.Split(';'); - Assert("Path list should have 2 for Read", pathsInPermission.Length == 2); - } -#if !TARGET_JVM - [Test] - [Ignore("should compatibility go that far ?")] - public void ShortToLong () - { - // on windows this returns a "short" (8.3) path and filename - string filename = Path.GetTempFileName (); - p = new FileIOPermission(FileIOPermissionAccess.Read, filename); - string[] files = p.GetPathList (FileIOPermissionAccess.Read); - AssertEquals ("GetPathList.Count", 1, files.Length); - // FIXME: here GetTempFileName != GetPathList[0] for MS but == for Mono - AssertEquals ("Path.GetFileName(GetTempFileName)==Path.GetFileName(GetPathList[0])", Path.GetFileName (filename), Path.GetFileName (files [0])); - // note: this will fail on Linux as kernel32.dll isn't available - AssertEquals ("GetLongPathName(GetTempFileName)==GetPathList[0]", FilePathUtil.GetLongPathName (filename), files [0]); + } + + [Test] + public void FromXML () + { + p = new FileIOPermission(PermissionState.None); + SecurityElement esd = new SecurityElement("IPermission"); + esd.AddAttribute("class", "FileIOPermission"); + esd.AddAttribute("version", "1"); + esd.AddAttribute("Unrestricted", "true"); + p.FromXml(esd); + Assert.IsTrue(p.IsUnrestricted(), "Should get an unrestricted permission"); + + esd = new SecurityElement("IPermission"); + esd.AddAttribute("class", "FileIOPermission"); + esd.AddAttribute("version", "1"); + // FIXME: Adjust to run on Mac OS's + if (Path.VolumeSeparatorChar == ':') { + esd.AddAttribute("Read", "c:\\temp;d:\\temp2"); + esd.AddAttribute("Write", "c:\\temp;d:\\temp2;z:\\temp3"); + } + else { + esd.AddAttribute("Read", "/temp;/usr/temp2"); + esd.AddAttribute("Write", "/temp;/usr/temp2;/usr/bin/temp3"); + } + p = new FileIOPermission(PermissionState.None); + p.FromXml(esd); + pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read); + Assert.IsTrue(pathsInPermission.Length == 2, "Path list should have 2 for Read"); + pathsInPermission = p.GetPathList(FileIOPermissionAccess.Write); + Assert.IsTrue(pathsInPermission.Length == 3, "Path list should have 2 for Write"); + } + + [Test] + public void ToXML () + { + p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood); + SecurityElement esd = p.ToXml(); + Assert.IsTrue(esd.Tag == "IPermission", "Esd tag incorrect"); + Assert.IsTrue((String)esd.Attributes["version"] == "1", "Esd version incorrect"); + string read = (String)esd.Attributes["Read"]; + pathsInPermission = read.Split(';'); + Assert.IsTrue(pathsInPermission.Length == 2, "Path list should have 2 for Read"); + } +#if !TARGET_JVM + [Test] + [Ignore("should compatibility go that far ?")] + public void ShortToLong () + { + // on windows this returns a "short" (8.3) path and filename + string filename = Path.GetTempFileName (); + p = new FileIOPermission(FileIOPermissionAccess.Read, filename); + string[] files = p.GetPathList (FileIOPermissionAccess.Read); + Assert.AreEqual (1, files.Length, "GetPathList.Count"); + // FIXME: here GetTempFileName != GetPathList[0] for MS but == for Mono + Assert.AreEqual (Path.GetFileName (filename), Path.GetFileName (files [0]), "Path.GetFileName(GetTempFileName)==Path.GetFileName(GetPathList[0])"); + // note: this will fail on Linux as kernel32.dll isn't available + Assert.AreEqual (FilePathUtil.GetLongPathName (filename), files [0], "GetLongPathName(GetTempFileName)==GetPathList[0]"); } #endif - [Test] - [ExpectedException (typeof (ArgumentException))] + [Test] + [ExpectedException (typeof (ArgumentException))] public void FileUrl () { // file://... isn't accepted - string filename = Assembly.GetExecutingAssembly ().CodeBase; - p = new FileIOPermission (FileIOPermissionAccess.Read, filename); - } - } -} + string filename = Assembly.GetExecutingAssembly ().CodeBase; + p = new FileIOPermission (FileIOPermissionAccess.Read, filename); + } + } +} diff --git a/mcs/class/corlib/Test/System.Security.Permissions/PrincipalPermissionTest.cs b/mcs/class/corlib/Test/System.Security.Permissions/PrincipalPermissionTest.cs index a0da438f70a..d3b4c70f373 100644 --- a/mcs/class/corlib/Test/System.Security.Permissions/PrincipalPermissionTest.cs +++ b/mcs/class/corlib/Test/System.Security.Permissions/PrincipalPermissionTest.cs @@ -15,7 +15,7 @@ using System.Security.Permissions; namespace MonoTests.System.Security.Permissions { [TestFixture] - public class PrincipalPermissionTest : Assertion { + public class PrincipalPermissionTest { private static string className = "System.Security.Permissions.PrincipalPermission, "; @@ -23,23 +23,23 @@ namespace MonoTests.System.Security.Permissions { public void PermissionStateNone () { PrincipalPermission p = new PrincipalPermission (PermissionState.None); - AssertNotNull ("PrincipalPermission(PermissionState.None)", p); - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsNotNull (p, "PrincipalPermission(PermissionState.None)"); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); PrincipalPermission copy = (PrincipalPermission) p.Copy (); - AssertEquals ("Copy.IsUnrestricted", p.IsUnrestricted (), copy.IsUnrestricted ()); + Assert.AreEqual (p.IsUnrestricted (), copy.IsUnrestricted (), "Copy.IsUnrestricted"); SecurityElement se = p.ToXml (); - Assert ("ToXml-class", (se.Attributes ["class"] as string).StartsWith (className)); - AssertEquals ("ToXml-version", "1", (se.Attributes ["version"] as string)); + Assert.IsTrue ((se.Attributes ["class"] as string).StartsWith (className), "ToXml-class"); + Assert.AreEqual ("1", (se.Attributes ["version"] as string), "ToXml-version"); } [Test] public void PermissionStateUnrestricted () { PrincipalPermission p = new PrincipalPermission (PermissionState.Unrestricted); - AssertNotNull ("PrincipalPermission(PermissionState.Unrestricted)", p); - Assert ("IsUnrestricted", p.IsUnrestricted ()); + Assert.IsNotNull (p, "PrincipalPermission(PermissionState.Unrestricted)"); + Assert.IsTrue (p.IsUnrestricted (), "IsUnrestricted"); PrincipalPermission copy = (PrincipalPermission) p.Copy (); - AssertEquals ("Copy.IsUnrestricted", p.IsUnrestricted (), copy.IsUnrestricted ()); + Assert.AreEqual (p.IsUnrestricted (), copy.IsUnrestricted (), "Copy.IsUnrestricted"); // Note: Unrestricted isn't shown in XML } @@ -47,49 +47,49 @@ namespace MonoTests.System.Security.Permissions { public void Name () { PrincipalPermission p = new PrincipalPermission ("user", null); - Assert("Name.IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue(!p.IsUnrestricted (), "Name.IsUnrestricted"); } [Test] public void UnauthenticatedName () { PrincipalPermission p = new PrincipalPermission ("user", null, false); - Assert("UnauthenticatedName.IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue(!p.IsUnrestricted (), "UnauthenticatedName.IsUnrestricted"); } [Test] public void Role () { PrincipalPermission p = new PrincipalPermission (null, "users"); - Assert("Role.IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue(!p.IsUnrestricted (), "Role.IsUnrestricted"); } [Test] public void UnauthenticatedRole () { PrincipalPermission p = new PrincipalPermission (null, "users", false); - Assert("UnauthenticatedRole.IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue(!p.IsUnrestricted (), "UnauthenticatedRole.IsUnrestricted"); } [Test] public void NameRole () { PrincipalPermission p = new PrincipalPermission ("user", "users", true); - Assert("NameRole.IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue(!p.IsUnrestricted (), "NameRole.IsUnrestricted"); } [Test] public void UnauthenticatedNameRole () { PrincipalPermission p = new PrincipalPermission ("user", "users", false); - Assert("UnauthenticatedNameRole.IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue(!p.IsUnrestricted (), "UnauthenticatedNameRole.IsUnrestricted"); } [Test] public void AuthenticatedNullNull () { PrincipalPermission p = new PrincipalPermission (null, null, true); - Assert("UnauthenticatedNameRole.IsUnrestricted", p.IsUnrestricted ()); + Assert.IsTrue(p.IsUnrestricted (), "UnauthenticatedNameRole.IsUnrestricted"); } [Test] @@ -131,11 +131,11 @@ namespace MonoTests.System.Security.Permissions { { PrincipalPermission p = new PrincipalPermission (PermissionState.None); SecurityElement se = p.ToXml (); - AssertNotNull ("ToXml()", se); + Assert.IsNotNull (se, "ToXml()"); PrincipalPermission p2 = (PrincipalPermission) p.Copy (); p2.FromXml (se); - AssertEquals ("FromXml-Copy", p.ToString (), p2.ToString ()); + Assert.AreEqual (p.ToString (), p2.ToString (), "FromXml-Copy"); string className = (string) se.Attributes ["class"]; string version = (string) se.Attributes ["version"]; @@ -149,7 +149,7 @@ namespace MonoTests.System.Security.Permissions { sec.AddAttribute ("Authenticated", "true"); se2.AddChild (sec); p2.FromXml (se2); - Assert ("FromXml-Unrestricted", p2.IsUnrestricted ()); + Assert.IsTrue (p2.IsUnrestricted (), "FromXml-Unrestricted"); } [Test] @@ -158,7 +158,7 @@ namespace MonoTests.System.Security.Permissions { PrincipalPermission p1 = new PrincipalPermission ("user", null); PrincipalPermission p2 = null; PrincipalPermission p3 = (PrincipalPermission) p1.Union (p2); - AssertEquals ("P1 U null == P1", p1.ToXml ().ToString (), p3.ToXml ().ToString ()); + Assert.AreEqual (p1.ToXml ().ToString (), p3.ToXml ().ToString (), "P1 U null == P1"); } [Test] @@ -167,9 +167,9 @@ namespace MonoTests.System.Security.Permissions { PrincipalPermission p1 = new PrincipalPermission (PermissionState.Unrestricted); PrincipalPermission p2 = new PrincipalPermission ("user", "role"); PrincipalPermission p3 = (PrincipalPermission) p1.Union (p2); - Assert ("Unrestricted U P2 == Unrestricted", p3.IsUnrestricted ()); + Assert.IsTrue (p3.IsUnrestricted (), "Unrestricted U P2 == Unrestricted"); p3 = (PrincipalPermission) p2.Union (p1); - Assert ("P2 U Unrestricted == Unrestricted", p3.IsUnrestricted ()); + Assert.IsTrue (p3.IsUnrestricted (), "P2 U Unrestricted == Unrestricted"); } [Test] @@ -178,8 +178,8 @@ namespace MonoTests.System.Security.Permissions { PrincipalPermission p1 = new PrincipalPermission ("user A", "role A"); PrincipalPermission p2 = new PrincipalPermission ("user B", "role B", false); PrincipalPermission p3 = (PrincipalPermission) p1.Union (p2); - Assert ("Union.UserA", p3.ToString ().IndexOf ("user A") >= 0); - Assert ("Union.UserB", p3.ToString ().IndexOf ("user B") >= 0); + Assert.IsTrue (p3.ToString ().IndexOf ("user A") >= 0, "Union.UserA"); + Assert.IsTrue (p3.ToString ().IndexOf ("user B") >= 0, "Union.UserB"); } [Test] @@ -197,7 +197,7 @@ namespace MonoTests.System.Security.Permissions { PrincipalPermission p1 = new PrincipalPermission ("user", "role"); PrincipalPermission p2 = null; PrincipalPermission p3 = (PrincipalPermission) p1.Intersect (p2); - AssertNull ("P1 N null == null", p3); + Assert.IsNull (p3, "P1 N null == null"); } [Test] @@ -206,11 +206,11 @@ namespace MonoTests.System.Security.Permissions { PrincipalPermission p1 = new PrincipalPermission (PermissionState.Unrestricted); PrincipalPermission p2 = new PrincipalPermission ("user", "role"); PrincipalPermission p3 = (PrincipalPermission) p1.Intersect (p2); - Assert ("Unrestricted N P2 == P2", !p3.IsUnrestricted ()); - AssertEquals ("Unrestricted N EP2 == EP2", p2.ToXml ().ToString (), p3.ToXml ().ToString ()); + Assert.IsTrue (!p3.IsUnrestricted (), "Unrestricted N P2 == P2"); + Assert.AreEqual (p2.ToXml ().ToString (), p3.ToXml ().ToString (), "Unrestricted N EP2 == EP2"); p3 = (PrincipalPermission) p2.Intersect (p1); - Assert ("P2 N Unrestricted == P2", !p3.IsUnrestricted ()); - AssertEquals ("P2 N Unrestricted == P2", p2.ToXml ().ToString (), p3.ToXml ().ToString ()); + Assert.IsTrue (!p3.IsUnrestricted (), "P2 N Unrestricted == P2"); + Assert.AreEqual (p2.ToXml ().ToString (), p3.ToXml ().ToString (), "P2 N Unrestricted == P2"); } [Test] @@ -220,17 +220,17 @@ namespace MonoTests.System.Security.Permissions { PrincipalPermission p1 = new PrincipalPermission ("user A", "role 1"); PrincipalPermission p2 = new PrincipalPermission ("user B", "role 2"); PrincipalPermission p3 = (PrincipalPermission) p1.Intersect (p2); - AssertNull ("EP1 N EP2 == null", p3); + Assert.IsNull (p3, "EP1 N EP2 == null"); // intersection in role PrincipalPermission p4 = new PrincipalPermission ("user C", "role 1"); p3 = (PrincipalPermission) p4.Intersect (p1); - Assert ("Intersect (!user A)", p3.ToString ().IndexOf ("user A") < 0); - Assert ("Intersect (!user C)", p3.ToString ().IndexOf ("user C") < 0); - Assert ("Intersect (role 1)", p3.ToString ().IndexOf ("role 1") >= 0); + Assert.IsTrue (p3.ToString ().IndexOf ("user A") < 0, "Intersect (!user A)"); + Assert.IsTrue (p3.ToString ().IndexOf ("user C") < 0, "Intersect (!user C)"); + Assert.IsTrue (p3.ToString ().IndexOf ("role 1") >= 0, "Intersect (role 1)"); // intersection in role without authentication PrincipalPermission p5 = new PrincipalPermission ("user C", "role 1", false); p3 = (PrincipalPermission) p5.Intersect (p1); - AssertNull ("EP5 N EP1 == null", p3); + Assert.IsNull (p3, "EP5 N EP1 == null"); } [Test] @@ -239,9 +239,9 @@ namespace MonoTests.System.Security.Permissions { PrincipalPermission p1 = new PrincipalPermission ("user", "role"); PrincipalPermission p2 = new PrincipalPermission (null, "role"); PrincipalPermission p3 = (PrincipalPermission) p1.Intersect (p2); - AssertEquals ("p1 N p2 == p1", p1.ToString (), p3.ToString ()); + Assert.AreEqual (p1.ToString (), p3.ToString (), "p1 N p2 == p1"); p3 = (PrincipalPermission) p2.Intersect (p1); - AssertEquals ("p2 N p1 == p1", p1.ToString (), p3.ToString ()); + Assert.AreEqual (p1.ToString (), p3.ToString (), "p2 N p1 == p1"); } [Test] @@ -250,9 +250,9 @@ namespace MonoTests.System.Security.Permissions { PrincipalPermission p1 = new PrincipalPermission ("user", "role"); PrincipalPermission p2 = new PrincipalPermission ("user", null); PrincipalPermission p3 = (PrincipalPermission) p1.Intersect (p2); - AssertEquals ("p1 N p2 == p1", p1.ToString (), p3.ToString ()); + Assert.AreEqual (p1.ToString (), p3.ToString (), "p1 N p2 == p1"); p3 = (PrincipalPermission) p2.Intersect (p1); - AssertEquals ("p2 N p1 == p1", p1.ToString (), p3.ToString ()); + Assert.AreEqual (p1.ToString (), p3.ToString (), "p2 N p1 == p1"); } [Test] @@ -268,27 +268,27 @@ namespace MonoTests.System.Security.Permissions { public void IsSubsetOfNull () { PrincipalPermission p = new PrincipalPermission ("user", null); - Assert ("User.IsSubsetOf(null)", !p.IsSubsetOf (null)); - - p = new PrincipalPermission (PermissionState.None); - Assert ("None.IsSubsetOf(null)", p.IsSubsetOf (null)); - - p = new PrincipalPermission (PermissionState.Unrestricted); - Assert ("Unrestricted.IsSubsetOf(null)", !p.IsSubsetOf (null)); - } - - [Test] - public void IsSubsetOfNone () - { - PrincipalPermission none = new PrincipalPermission (PermissionState.None); - PrincipalPermission p = new PrincipalPermission ("user", null); - Assert ("User.IsSubsetOf(null)", !p.IsSubsetOf (none)); - - p = new PrincipalPermission (PermissionState.None); - Assert ("None.IsSubsetOf(null)", p.IsSubsetOf (none)); - - p = new PrincipalPermission (PermissionState.Unrestricted); - Assert ("Unrestricted.IsSubsetOf(null)", !p.IsSubsetOf (none)); + Assert.IsTrue (!p.IsSubsetOf (null), "User.IsSubsetOf(null)"); + + p = new PrincipalPermission (PermissionState.None); + Assert.IsTrue (p.IsSubsetOf (null), "None.IsSubsetOf(null)"); + + p = new PrincipalPermission (PermissionState.Unrestricted); + Assert.IsTrue (!p.IsSubsetOf (null), "Unrestricted.IsSubsetOf(null)"); + } + + [Test] + public void IsSubsetOfNone () + { + PrincipalPermission none = new PrincipalPermission (PermissionState.None); + PrincipalPermission p = new PrincipalPermission ("user", null); + Assert.IsTrue (!p.IsSubsetOf (none), "User.IsSubsetOf(null)"); + + p = new PrincipalPermission (PermissionState.None); + Assert.IsTrue (p.IsSubsetOf (none), "None.IsSubsetOf(null)"); + + p = new PrincipalPermission (PermissionState.Unrestricted); + Assert.IsTrue (!p.IsSubsetOf (none), "Unrestricted.IsSubsetOf(null)"); } [Test] @@ -296,8 +296,8 @@ namespace MonoTests.System.Security.Permissions { { PrincipalPermission p1 = new PrincipalPermission (PermissionState.Unrestricted); PrincipalPermission p2 = new PrincipalPermission ("user", "role", false); - Assert ("Unrestricted.IsSubsetOf(user)", !p1.IsSubsetOf (p2)); - Assert ("user.IsSubsetOf(Unrestricted)", p2.IsSubsetOf (p1)); + Assert.IsTrue (!p1.IsSubsetOf (p2), "Unrestricted.IsSubsetOf(user)"); + Assert.IsTrue (p2.IsSubsetOf (p1), "user.IsSubsetOf(Unrestricted)"); } [Test] @@ -305,16 +305,16 @@ namespace MonoTests.System.Security.Permissions { { PrincipalPermission p1 = new PrincipalPermission ("user A", "role 1"); PrincipalPermission p2 = new PrincipalPermission (null, "role 1"); - Assert ("UserRole.IsSubsetOf(Role)", p1.IsSubsetOf (p2)); - Assert ("Role.IsSubsetOf(UserRole)", !p2.IsSubsetOf (p1)); + Assert.IsTrue (p1.IsSubsetOf (p2), "UserRole.IsSubsetOf(Role)"); + Assert.IsTrue (!p2.IsSubsetOf (p1), "Role.IsSubsetOf(UserRole)"); PrincipalPermission p3 = new PrincipalPermission ("user A", "role 1", false); - Assert ("UserRoleAuth.IsSubsetOf(UserRoleNA)", !p3.IsSubsetOf (p1)); - Assert ("UserRoleNA.IsSubsetOf(UserRoleAuth)", !p1.IsSubsetOf (p3)); + Assert.IsTrue (!p3.IsSubsetOf (p1), "UserRoleAuth.IsSubsetOf(UserRoleNA)"); + Assert.IsTrue (!p1.IsSubsetOf (p3), "UserRoleNA.IsSubsetOf(UserRoleAuth)"); PrincipalPermission p4 = new PrincipalPermission (null, null, true); // unrestricted - Assert ("unrestricted.IsSubsetOf(UserRole)", !p4.IsSubsetOf (p1)); - Assert ("UserRole.IsSubsetOf(unrestricted)", p1.IsSubsetOf (p4)); + Assert.IsTrue (!p4.IsSubsetOf (p1), "unrestricted.IsSubsetOf(UserRole)"); + Assert.IsTrue (p1.IsSubsetOf (p4), "UserRole.IsSubsetOf(unrestricted)"); } [Test] @@ -323,7 +323,7 @@ namespace MonoTests.System.Security.Permissions { { PrincipalPermission p1 = new PrincipalPermission ("user", null); EnvironmentPermission ep2 = new EnvironmentPermission (PermissionState.Unrestricted); - Assert ("IsSubsetOf(EnvironmentPermission)", p1.IsSubsetOf (ep2)); + Assert.IsTrue (p1.IsSubsetOf (ep2), "IsSubsetOf(EnvironmentPermission)"); } } } diff --git a/mcs/class/corlib/Test/System.Security.Permissions/PublisherIdentityPermissionTest.cs b/mcs/class/corlib/Test/System.Security.Permissions/PublisherIdentityPermissionTest.cs index 0b6719f53b7..fe2fb00c6f5 100644 --- a/mcs/class/corlib/Test/System.Security.Permissions/PublisherIdentityPermissionTest.cs +++ b/mcs/class/corlib/Test/System.Security.Permissions/PublisherIdentityPermissionTest.cs @@ -37,7 +37,7 @@ using System.Security.Cryptography.X509Certificates; namespace MonoTests.System.Security.Permissions { [TestFixture] - public class PublisherIdentityPermissionTest : Assertion { + public class PublisherIdentityPermissionTest { private static string className = "System.Security.Permissions.PublisherIdentityPermission, "; @@ -93,13 +93,13 @@ namespace MonoTests.System.Security.Permissions { public void PermissionStateNone () { PublisherIdentityPermission p = new PublisherIdentityPermission (PermissionState.None); - AssertNotNull ("PublisherIdentityPermission(PermissionState.None)", p); + Assert.IsNotNull (p, "PublisherIdentityPermission(PermissionState.None)"); PublisherIdentityPermission copy = (PublisherIdentityPermission) p.Copy (); SecurityElement se = p.ToXml (); - Assert ("ToXml-class", se.Attribute ("class").StartsWith (className)); - AssertEquals ("ToXml-version", "1", se.Attribute("version")); - AssertNull ("ToXml-Unrestricted", se.Attribute("Unrestricted")); - AssertNull ("Certificate==null", p.Certificate); + Assert.IsTrue (se.Attribute ("class").StartsWith (className), "ToXml-class"); + Assert.AreEqual ("1", se.Attribute("version"), "ToXml-version"); + Assert.IsNull (se.Attribute("Unrestricted"), "ToXml-Unrestricted"); + Assert.IsNull (p.Certificate, "Certificate==null"); } #if NET_2_0 [Test] @@ -108,15 +108,15 @@ namespace MonoTests.System.Security.Permissions { { // In 2.0 Unrestricted are permitted for identity permissions PublisherIdentityPermission p = new PublisherIdentityPermission (PermissionState.Unrestricted); - AssertNotNull ("PublisherIdentityPermission(PermissionState.None)", p); + Assert.IsNotNull (p, "PublisherIdentityPermission(PermissionState.None)"); PublisherIdentityPermission copy = (PublisherIdentityPermission)p.Copy (); SecurityElement se = p.ToXml (); - Assert ("ToXml-class", se.Attribute ("class").StartsWith (className)); - AssertEquals ("ToXml-version", "1", se.Attribute("version")); - AssertEquals ("ToXml-Unrestricted", "true", se.Attribute("Unrestricted")); - AssertNull ("Certificate==null", p.Certificate); + Assert.IsTrue (se.Attribute ("class").StartsWith (className), "ToXml-class"); + Assert.AreEqual ("1", se.Attribute("version"), "ToXml-version"); + Assert.AreEqual ("true", se.Attribute("Unrestricted"), "ToXml-Unrestricted"); + Assert.IsNull (p.Certificate, "Certificate==null"); // and they aren't equals to None - Assert (!p.Equals (new PublisherIdentityPermission (PermissionState.None))); + Assert.IsTrue (!p.Equals (new PublisherIdentityPermission (PermissionState.None))); } #else [Test] @@ -135,7 +135,7 @@ namespace MonoTests.System.Security.Permissions { PublisherIdentityPermission p2 = new PublisherIdentityPermission (PermissionState.None); p2.Certificate = x509; - AssertEquals ("Certificate", p1.ToXml ().ToString (), p2.ToXml ().ToString ()); + Assert.AreEqual (p1.ToXml ().ToString (), p2.ToXml ().ToString (), "Certificate"); } [Test] @@ -192,12 +192,12 @@ namespace MonoTests.System.Security.Permissions { { PublisherIdentityPermission p = new PublisherIdentityPermission (PermissionState.None); SecurityElement se = p.ToXml (); - AssertNotNull ("ToXml()", se); + Assert.IsNotNull (se, "ToXml()"); p.FromXml (se); se.AddAttribute ("X509v3Certificate", x509.GetRawCertDataString ()); p.FromXml (se); - AssertEquals ("CertificateHash", x509.GetCertHashString (), p.Certificate.GetCertHashString ()); + Assert.AreEqual (x509.GetCertHashString (), p.Certificate.GetCertHashString (), "CertificateHash"); } [Test] @@ -206,7 +206,7 @@ namespace MonoTests.System.Security.Permissions { PublisherIdentityPermission p1 = new PublisherIdentityPermission (x509); PublisherIdentityPermission p2 = null; PublisherIdentityPermission p3 = (PublisherIdentityPermission) p1.Union (p2); - AssertEquals ("P1 U null == P1", p1.ToXml ().ToString (), p3.ToXml ().ToString ()); + Assert.AreEqual (p1.ToXml ().ToString (), p3.ToXml ().ToString (), "P1 U null == P1"); } [Test] @@ -216,18 +216,18 @@ namespace MonoTests.System.Security.Permissions { PublisherIdentityPermission p1 = new PublisherIdentityPermission (PermissionState.None); PublisherIdentityPermission p2 = new PublisherIdentityPermission (PermissionState.None); PublisherIdentityPermission p3 = (PublisherIdentityPermission) p1.Union (p2); - AssertNull ("None U None == null", p3); + Assert.IsNull (p3, "None U None == null"); // with 1 certificate p1 = new PublisherIdentityPermission (x509); p2 = new PublisherIdentityPermission (PermissionState.None); p3 = (PublisherIdentityPermission) p1.Union (p2); - AssertEquals ("cert U None == cert", p3.ToXml ().ToString (), p1.ToXml ().ToString ()); + Assert.AreEqual (p3.ToXml ().ToString (), p1.ToXml ().ToString (), "cert U None == cert"); X509Certificate x2 = new X509Certificate (cert2); // 2 certificates (same) x2 = new X509Certificate (cert); p2 = new PublisherIdentityPermission (x2); p3 = (PublisherIdentityPermission) p1.Union (p2); - AssertEquals ("cert1 U cert1 == cert1", p3.ToString (), p1.ToString ()); + Assert.AreEqual (p3.ToString (), p1.ToString (), "cert1 U cert1 == cert1"); } [Test] @@ -243,13 +243,13 @@ namespace MonoTests.System.Security.Permissions { #if NET_2_0 // new XML format is used to contain more than one X.509 certificate SecurityElement se = p.ToXml (); - AssertEquals ("Childs", 2, se.Children.Count); - AssertEquals ("Cert#1", (se.Children [0] as SecurityElement).Attribute ("X509v3Certificate"), p1.ToXml ().Attribute ("X509v3Certificate")); - AssertEquals ("Cert#2", (se.Children [1] as SecurityElement).Attribute ("X509v3Certificate"), p2.ToXml ().Attribute ("X509v3Certificate")); + Assert.AreEqual (2, se.Children.Count, "Childs"); + Assert.AreEqual ((se.Children [0] as SecurityElement).Attribute ("X509v3Certificate"), p1.ToXml ().Attribute ("X509v3Certificate"), "Cert#1"); + Assert.AreEqual ((se.Children [1] as SecurityElement).Attribute ("X509v3Certificate"), p2.ToXml ().Attribute ("X509v3Certificate"), "Cert#2"); // strangely it is still versioned as 'version="1"'. - AssertEquals ("Version", "1", se.Attribute ("version")); + Assert.AreEqual ("1", se.Attribute ("version"), "Version"); #else - AssertNull ("cert1 U cert2 == null", p); + Assert.IsNull (p, "cert1 U cert2 == null"); #endif } @@ -268,7 +268,7 @@ namespace MonoTests.System.Security.Permissions { PublisherIdentityPermission p1 = new PublisherIdentityPermission (x509); PublisherIdentityPermission p2 = null; PublisherIdentityPermission p3 = (PublisherIdentityPermission) p1.Intersect (p2); - AssertNull ("P1 N null == null", p3); + Assert.IsNull (p3, "P1 N null == null"); } [Test] @@ -278,22 +278,22 @@ namespace MonoTests.System.Security.Permissions { PublisherIdentityPermission p1 = new PublisherIdentityPermission (PermissionState.None); PublisherIdentityPermission p2 = new PublisherIdentityPermission (PermissionState.None); PublisherIdentityPermission p3 = (PublisherIdentityPermission) p1.Intersect (p2); - AssertNull ("None N None == null", p3); + Assert.IsNull (p3, "None N None == null"); // with 1 certificate p1 = new PublisherIdentityPermission (x509); p2 = new PublisherIdentityPermission (PermissionState.None); p3 = (PublisherIdentityPermission) p1.Intersect (p2); - AssertNull ("cert N None == None", p3); + Assert.IsNull (p3, "cert N None == None"); // 2 different certificates X509Certificate x2 = new X509Certificate (cert2); p2 = new PublisherIdentityPermission (x2); p3 = (PublisherIdentityPermission) p1.Intersect (p2); - AssertNull ("cert1 N cert2 == null", p3); + Assert.IsNull (p3, "cert1 N cert2 == null"); // 2 certificates (same) x2 = new X509Certificate (cert); p2 = new PublisherIdentityPermission (x2); p3 = (PublisherIdentityPermission) p1.Intersect (p2); - AssertEquals ("cert1 N cert1 == cert1", p3.ToString (), p1.ToString ()); + Assert.AreEqual (p3.ToString (), p1.ToString (), "cert1 N cert1 == cert1"); } [Test] @@ -309,7 +309,7 @@ namespace MonoTests.System.Security.Permissions { public void IsSubsetOfNull () { PublisherIdentityPermission p1 = new PublisherIdentityPermission (x509); - Assert ("IsSubsetOf(null)", !p1.IsSubsetOf (null)); + Assert.IsTrue (!p1.IsSubsetOf (null), "IsSubsetOf(null)"); } [Test] @@ -317,16 +317,16 @@ namespace MonoTests.System.Security.Permissions { { PublisherIdentityPermission p1 = new PublisherIdentityPermission (PermissionState.None); PublisherIdentityPermission p2 = new PublisherIdentityPermission (PermissionState.None); - Assert ("None.IsSubsetOf(None)", p1.IsSubsetOf (p2)); + Assert.IsTrue (p1.IsSubsetOf (p2), "None.IsSubsetOf(None)"); PublisherIdentityPermission p3 = new PublisherIdentityPermission (x509); - Assert ("Cert.IsSubsetOf(None)", !p3.IsSubsetOf (p2)); - Assert ("None.IsSubsetOf(Cert)", p2.IsSubsetOf (p3)); + Assert.IsTrue (!p3.IsSubsetOf (p2), "Cert.IsSubsetOf(None)"); + Assert.IsTrue (p2.IsSubsetOf (p3), "None.IsSubsetOf(Cert)"); PublisherIdentityPermission p4 = new PublisherIdentityPermission (x509); - Assert ("Cert.IsSubsetOf(Cert)", p3.IsSubsetOf (p4)); + Assert.IsTrue (p3.IsSubsetOf (p4), "Cert.IsSubsetOf(Cert)"); X509Certificate x2 = new X509Certificate (cert2); PublisherIdentityPermission p5 = new PublisherIdentityPermission (x2); - Assert ("Cert2.IsSubsetOf(Cert)", !p5.IsSubsetOf (p3)); - Assert ("Cert.IsSubsetOf(Cert2)", !p3.IsSubsetOf (p5)); + Assert.IsTrue (!p5.IsSubsetOf (p3), "Cert2.IsSubsetOf(Cert)"); + Assert.IsTrue (!p3.IsSubsetOf (p5), "Cert.IsSubsetOf(Cert2)"); } [Test] @@ -335,7 +335,7 @@ namespace MonoTests.System.Security.Permissions { { PublisherIdentityPermission p1 = new PublisherIdentityPermission (x509); FileDialogPermission fdp2 = new FileDialogPermission (PermissionState.Unrestricted); - Assert ("IsSubsetOf(PublisherIdentityPermission)", p1.IsSubsetOf (fdp2)); + Assert.IsTrue (p1.IsSubsetOf (fdp2), "IsSubsetOf(PublisherIdentityPermission)"); } } } diff --git a/mcs/class/corlib/Test/System.Security.Permissions/ReflectionPermissionTest.cs b/mcs/class/corlib/Test/System.Security.Permissions/ReflectionPermissionTest.cs index 0d3cc7731ec..83aa1dc6de8 100644 --- a/mcs/class/corlib/Test/System.Security.Permissions/ReflectionPermissionTest.cs +++ b/mcs/class/corlib/Test/System.Security.Permissions/ReflectionPermissionTest.cs @@ -15,104 +15,104 @@ using System.Security.Permissions; namespace MonoTests.System.Security.Permissions { [TestFixture] - public class ReflectionPermissionTest : Assertion { + public class ReflectionPermissionTest { private static string className = "System.Security.Permissions.ReflectionPermission, "; [Test] - public void PermissionStateNone () + public void PermissionStateNone () { ReflectionPermission p = new ReflectionPermission (PermissionState.None); - AssertNotNull ("ReflectionPermission(PermissionState.None)", p); - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsNotNull (p, "ReflectionPermission(PermissionState.None)"); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); ReflectionPermission copy = (ReflectionPermission) p.Copy (); - AssertEquals ("Copy.IsUnrestricted", p.IsUnrestricted (), copy.IsUnrestricted ()); + Assert.AreEqual (p.IsUnrestricted (), copy.IsUnrestricted (), "Copy.IsUnrestricted"); SecurityElement se = p.ToXml (); - Assert ("ToXml-class", (se.Attributes ["class"] as string).StartsWith (className)); - AssertEquals ("ToXml-version", "1", (se.Attributes ["version"] as string)); + Assert.IsTrue ((se.Attributes ["class"] as string).StartsWith (className), "ToXml-class"); + Assert.AreEqual ("1", (se.Attributes ["version"] as string), "ToXml-version"); } [Test] public void PermissionStateUnrestricted () { ReflectionPermission p = new ReflectionPermission (PermissionState.Unrestricted); - AssertNotNull ("ReflectionPermission(PermissionState.Unrestricted)", p); - Assert ("IsUnrestricted", p.IsUnrestricted ()); + Assert.IsNotNull (p, "ReflectionPermission(PermissionState.Unrestricted)"); + Assert.IsTrue (p.IsUnrestricted (), "IsUnrestricted"); ReflectionPermission copy = (ReflectionPermission) p.Copy (); - AssertEquals ("Copy.IsUnrestricted", p.IsUnrestricted (), copy.IsUnrestricted ()); + Assert.AreEqual (p.IsUnrestricted (), copy.IsUnrestricted (), "Copy.IsUnrestricted"); SecurityElement se = p.ToXml (); - AssertEquals ("ToXml-Unrestricted", "true", (se.Attributes ["Unrestricted"] as string)); + Assert.AreEqual ("true", (se.Attributes ["Unrestricted"] as string), "ToXml-Unrestricted"); } [Test] public void Derestricted () { ReflectionPermission p = new ReflectionPermission (PermissionState.Unrestricted); - Assert ("IsUnrestricted", p.IsUnrestricted ()); + Assert.IsTrue (p.IsUnrestricted (), "IsUnrestricted"); p.Flags = ReflectionPermissionFlag.NoFlags; - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); } [Test] public void NoFlags () { ReflectionPermission p = new ReflectionPermission (ReflectionPermissionFlag.NoFlags); - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); SecurityElement se = p.ToXml (); - AssertEquals ("ToXml-Flags=NoFlags", "NoFlags", (se.Attributes ["Flags"] as string)); + Assert.AreEqual ("NoFlags", (se.Attributes ["Flags"] as string), "ToXml-Flags=NoFlags"); } [Test] public void TypeInformation () { ReflectionPermission p = new ReflectionPermission (ReflectionPermissionFlag.TypeInformation); - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); SecurityElement se = p.ToXml (); - AssertEquals ("ToXml-Flags=TypeInformation", "TypeInformation", (se.Attributes ["Flags"] as string)); + Assert.AreEqual ("TypeInformation", (se.Attributes ["Flags"] as string), "ToXml-Flags=TypeInformation"); } [Test] public void MemberAccess () { ReflectionPermission p = new ReflectionPermission (ReflectionPermissionFlag.MemberAccess); - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); SecurityElement se = p.ToXml (); - AssertEquals ("ToXml-Flags=MemberAccess", "MemberAccess", (se.Attributes ["Flags"] as string)); + Assert.AreEqual ("MemberAccess", (se.Attributes ["Flags"] as string), "ToXml-Flags=MemberAccess"); } [Test] public void ReflectionEmit () { ReflectionPermission p = new ReflectionPermission (ReflectionPermissionFlag.ReflectionEmit); - Assert ("IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "IsUnrestricted"); SecurityElement se = p.ToXml (); - AssertEquals ("ToXml-Flags=ReflectionEmit", "ReflectionEmit", (se.Attributes ["Flags"] as string)); + Assert.AreEqual ("ReflectionEmit", (se.Attributes ["Flags"] as string), "ToXml-Flags=ReflectionEmit"); } [Test] public void AllFlags () { ReflectionPermission p = new ReflectionPermission (ReflectionPermissionFlag.AllFlags); - Assert ("IsUnrestricted", p.IsUnrestricted ()); + Assert.IsTrue (p.IsUnrestricted (), "IsUnrestricted"); SecurityElement se = p.ToXml (); - AssertEquals ("ToXml-Unrestricted", "true", (se.Attributes ["Unrestricted"] as string)); + Assert.AreEqual ("true", (se.Attributes ["Unrestricted"] as string), "ToXml-Unrestricted"); } [Test] public void Flags () { ReflectionPermission p = new ReflectionPermission (PermissionState.None); - Assert ("Flags(default).IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "Flags(default).IsUnrestricted"); p.Flags = ReflectionPermissionFlag.NoFlags; - Assert ("Flags(NoFlags).IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "Flags(NoFlags).IsUnrestricted"); p.Flags = ReflectionPermissionFlag.TypeInformation; - Assert ("Flags(TypeInformation).IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "Flags(TypeInformation).IsUnrestricted"); p.Flags = ReflectionPermissionFlag.MemberAccess; - Assert ("Flags(MemberAccess).IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "Flags(MemberAccess).IsUnrestricted"); p.Flags = ReflectionPermissionFlag.ReflectionEmit; - Assert ("Flags(ReflectionEmit).IsUnrestricted", !p.IsUnrestricted ()); + Assert.IsTrue (!p.IsUnrestricted (), "Flags(ReflectionEmit).IsUnrestricted"); p.Flags = ReflectionPermissionFlag.AllFlags; - Assert ("Flags(AllFlags).IsUnrestricted", p.IsUnrestricted ()); + Assert.IsTrue (p.IsUnrestricted (), "Flags(AllFlags).IsUnrestricted"); } [Test] @@ -154,11 +154,11 @@ namespace MonoTests.System.Security.Permissions { { ReflectionPermission p = new ReflectionPermission (PermissionState.None); SecurityElement se = p.ToXml (); - AssertNotNull ("ToXml()", se); + Assert.IsNotNull (se, "ToXml()"); ReflectionPermission p2 = (ReflectionPermission) p.Copy (); p2.FromXml (se); - AssertEquals ("FromXml-None", ReflectionPermissionFlag.NoFlags, p2.Flags); + Assert.AreEqual (ReflectionPermissionFlag.NoFlags, p2.Flags, "FromXml-None"); string className = (string) se.Attributes ["class"]; string version = (string) se.Attributes ["version"]; @@ -168,27 +168,27 @@ namespace MonoTests.System.Security.Permissions { se2.AddAttribute ("version", version); se2.AddAttribute ("Flags", "TypeInformation"); p2.FromXml (se2); - AssertEquals ("FromXml-TypeInformation", ReflectionPermissionFlag.TypeInformation, p2.Flags); + Assert.AreEqual (ReflectionPermissionFlag.TypeInformation, p2.Flags, "FromXml-TypeInformation"); se2 = new SecurityElement (se.Tag); se2.AddAttribute ("class", className); se2.AddAttribute ("version", version); se2.AddAttribute ("Flags", "MemberAccess"); p2.FromXml (se2); - AssertEquals ("FromXml-MemberAccess", ReflectionPermissionFlag.MemberAccess, p2.Flags); + Assert.AreEqual (ReflectionPermissionFlag.MemberAccess, p2.Flags, "FromXml-MemberAccess"); se2 = new SecurityElement (se.Tag); se2.AddAttribute ("class", className); se2.AddAttribute ("version", version); se2.AddAttribute ("Flags", "ReflectionEmit"); p2.FromXml (se2); - AssertEquals ("FromXml-ReflectionEmit", ReflectionPermissionFlag.ReflectionEmit, p2.Flags); + Assert.AreEqual (ReflectionPermissionFlag.ReflectionEmit, p2.Flags, "FromXml-ReflectionEmit"); se = p.ToXml (); se.AddAttribute ("Unrestricted", "true"); p2.FromXml (se); - Assert ("FromXml-Unrestricted", p2.IsUnrestricted ()); - AssertEquals ("FromXml-AllFlags", ReflectionPermissionFlag.AllFlags, p2.Flags); + Assert.IsTrue (p2.IsUnrestricted (), "FromXml-Unrestricted"); + Assert.AreEqual (ReflectionPermissionFlag.AllFlags, p2.Flags, "FromXml-AllFlags"); } [Test] @@ -197,7 +197,7 @@ namespace MonoTests.System.Security.Permissions { ReflectionPermission p1 = new ReflectionPermission (ReflectionPermissionFlag.NoFlags); ReflectionPermission p2 = null; ReflectionPermission p3 = (ReflectionPermission) p1.Union (p2); - AssertEquals ("P1 U null == P1", p1.ToXml ().ToString (), p3.ToXml ().ToString ()); + Assert.AreEqual (p1.ToXml ().ToString (), p3.ToXml ().ToString (), "P1 U null == P1"); } [Test] @@ -206,9 +206,9 @@ namespace MonoTests.System.Security.Permissions { ReflectionPermission p1 = new ReflectionPermission (PermissionState.Unrestricted); ReflectionPermission p2 = new ReflectionPermission (ReflectionPermissionFlag.NoFlags); ReflectionPermission p3 = (ReflectionPermission) p1.Union (p2); - Assert ("Unrestricted U P2 == Unrestricted", p3.IsUnrestricted ()); + Assert.IsTrue (p3.IsUnrestricted (), "Unrestricted U P2 == Unrestricted"); p3 = (ReflectionPermission) p2.Union (p1); - Assert ("P2 U Unrestricted == Unrestricted", p3.IsUnrestricted ()); + Assert.IsTrue (p3.IsUnrestricted (), "P2 U Unrestricted == Unrestricted"); } [Test] @@ -217,10 +217,10 @@ namespace MonoTests.System.Security.Permissions { ReflectionPermission p1 = new ReflectionPermission (ReflectionPermissionFlag.TypeInformation); ReflectionPermission p2 = new ReflectionPermission (ReflectionPermissionFlag.MemberAccess); ReflectionPermission p3 = (ReflectionPermission) p1.Union (p2); - AssertEquals (ReflectionPermissionFlag.MemberAccess | ReflectionPermissionFlag.TypeInformation, p3.Flags); + Assert.AreEqual (ReflectionPermissionFlag.MemberAccess | ReflectionPermissionFlag.TypeInformation, p3.Flags); ReflectionPermission p4 = new ReflectionPermission (ReflectionPermissionFlag.ReflectionEmit); ReflectionPermission p5 = (ReflectionPermission) p4.Union (p3); - Assert ("P3 U P4==Unrestricted", p5.IsUnrestricted ()); + Assert.IsTrue (p5.IsUnrestricted (), "P3 U P4==Unrestricted"); } [Test] @@ -238,7 +238,7 @@ namespace MonoTests.System.Security.Permissions { ReflectionPermission p1 = new ReflectionPermission (ReflectionPermissionFlag.NoFlags); ReflectionPermission p2 = null; ReflectionPermission p3 = (ReflectionPermission) p1.Intersect (p2); - AssertNull ("P1 N null == null", p3); + Assert.IsNull (p3, "P1 N null == null"); } [Test] @@ -247,15 +247,15 @@ namespace MonoTests.System.Security.Permissions { ReflectionPermission p1 = new ReflectionPermission (PermissionState.Unrestricted); ReflectionPermission p2 = new ReflectionPermission (ReflectionPermissionFlag.MemberAccess); ReflectionPermission p3 = (ReflectionPermission) p1.Intersect (p2); - Assert ("Unrestricted N P2 == P2", !p3.IsUnrestricted ()); - AssertEquals ("Unrestricted N EP2 == EP2", p2.ToXml ().ToString (), p3.ToXml ().ToString ()); + Assert.IsTrue (!p3.IsUnrestricted (), "Unrestricted N P2 == P2"); + Assert.AreEqual (p2.ToXml ().ToString (), p3.ToXml ().ToString (), "Unrestricted N EP2 == EP2"); p3 = (ReflectionPermission) p2.Intersect (p1); - Assert ("P2 N Unrestricted == P2", !p3.IsUnrestricted ()); - AssertEquals ("P2 N Unrestricted == P2", p2.ToXml ().ToString (), p3.ToXml ().ToString ()); + Assert.IsTrue (!p3.IsUnrestricted (), "P2 N Unrestricted == P2"); + Assert.AreEqual (p2.ToXml ().ToString (), p3.ToXml ().ToString (), "P2 N Unrestricted == P2"); p2 = new ReflectionPermission (ReflectionPermissionFlag.NoFlags); p3 = (ReflectionPermission) p1.Intersect (p2); - AssertNull ("Unrestricted N None == null", p3); + Assert.IsNull (p3, "Unrestricted N None == null"); } [Test] @@ -265,21 +265,21 @@ namespace MonoTests.System.Security.Permissions { ReflectionPermission p1 = new ReflectionPermission (ReflectionPermissionFlag.MemberAccess); ReflectionPermission p2 = new ReflectionPermission (ReflectionPermissionFlag.TypeInformation); ReflectionPermission p3 = (ReflectionPermission) p1.Intersect (p2); - AssertNull ("EP1 N EP2 == null", p3); + Assert.IsNull (p3, "EP1 N EP2 == null"); // intersection in MemberAccess ReflectionPermission p4 = new ReflectionPermission (ReflectionPermissionFlag.MemberAccess | ReflectionPermissionFlag.ReflectionEmit); p3 = (ReflectionPermission) p4.Intersect (p1); - AssertEquals ("Intersect-MemberAccess", ReflectionPermissionFlag.MemberAccess, p3.Flags); + Assert.AreEqual (ReflectionPermissionFlag.MemberAccess, p3.Flags, "Intersect-MemberAccess"); // intersection in TypeInformation ReflectionPermission p5 = new ReflectionPermission (ReflectionPermissionFlag.TypeInformation | ReflectionPermissionFlag.ReflectionEmit); p3 = (ReflectionPermission) p5.Intersect (p2); - AssertEquals ("Intersect-TypeInformation", ReflectionPermissionFlag.TypeInformation, p3.Flags); + Assert.AreEqual (ReflectionPermissionFlag.TypeInformation, p3.Flags, "Intersect-TypeInformation"); // intersection in AllFlags ReflectionPermission p6 = new ReflectionPermission (ReflectionPermissionFlag.AllFlags); ReflectionPermission p7 = new ReflectionPermission (ReflectionPermissionFlag.AllFlags); p3 = (ReflectionPermission) p6.Intersect (p7); - AssertEquals ("Intersect-AllFlags", ReflectionPermissionFlag.AllFlags, p3.Flags); - Assert ("Intersect-AllFlags-Unrestricted", p3.IsUnrestricted ()); + Assert.AreEqual (ReflectionPermissionFlag.AllFlags, p3.Flags, "Intersect-AllFlags"); + Assert.IsTrue (p3.IsUnrestricted (), "Intersect-AllFlags-Unrestricted"); } [Test] @@ -295,9 +295,9 @@ namespace MonoTests.System.Security.Permissions { public void IsSubsetOfNull () { ReflectionPermission p = new ReflectionPermission (ReflectionPermissionFlag.NoFlags); - Assert ("NoFlags.IsSubsetOf(null)", p.IsSubsetOf (null)); + Assert.IsTrue (p.IsSubsetOf (null), "NoFlags.IsSubsetOf(null)"); p = new ReflectionPermission (ReflectionPermissionFlag.MemberAccess); - Assert ("MemberAccess.IsSubsetOf(null)", !p.IsSubsetOf (null)); + Assert.IsTrue (!p.IsSubsetOf (null), "MemberAccess.IsSubsetOf(null)"); } [Test] @@ -306,9 +306,9 @@ namespace MonoTests.System.Security.Permissions { ReflectionPermission p1 = new ReflectionPermission (PermissionState.Unrestricted); ReflectionPermission p2 = new ReflectionPermission (ReflectionPermissionFlag.NoFlags); ReflectionPermission p3 = new ReflectionPermission (PermissionState.Unrestricted); - Assert ("Unrestricted.IsSubsetOf()", !p1.IsSubsetOf (p2)); - Assert ("IsSubsetOf(Unrestricted)", p2.IsSubsetOf (p1)); - Assert ("Unrestricted.IsSubsetOf(Unrestricted)", p1.IsSubsetOf (p3)); + Assert.IsTrue (!p1.IsSubsetOf (p2), "Unrestricted.IsSubsetOf()"); + Assert.IsTrue (p2.IsSubsetOf (p1), "IsSubsetOf(Unrestricted)"); + Assert.IsTrue (p1.IsSubsetOf (p3), "Unrestricted.IsSubsetOf(Unrestricted)"); } [Test] @@ -317,19 +317,19 @@ namespace MonoTests.System.Security.Permissions { ReflectionPermission p1 = new ReflectionPermission (ReflectionPermissionFlag.MemberAccess); ReflectionPermission p2 = new ReflectionPermission (ReflectionPermissionFlag.TypeInformation); ReflectionPermission p3 = new ReflectionPermission (ReflectionPermissionFlag.ReflectionEmit); - Assert ("MemberAccess.IsSubsetOf(TypeInformation)", !p1.IsSubsetOf (p2)); - Assert ("MemberAccess.IsSubsetOf(ReflectionEmit)", !p1.IsSubsetOf (p3)); - Assert ("TypeInformation.IsSubsetOf(MemberAccess)", !p2.IsSubsetOf (p1)); - Assert ("TypeInformation.IsSubsetOf(ReflectionEmit)", !p2.IsSubsetOf (p3)); - Assert ("ReflectionEmit.IsSubsetOf(MemberAccess)", !p3.IsSubsetOf (p1)); - Assert ("ReflectionEmit.IsSubsetOf(TypeInformation)", !p3.IsSubsetOf (p2)); + Assert.IsTrue (!p1.IsSubsetOf (p2), "MemberAccess.IsSubsetOf(TypeInformation)"); + Assert.IsTrue (!p1.IsSubsetOf (p3), "MemberAccess.IsSubsetOf(ReflectionEmit)"); + Assert.IsTrue (!p2.IsSubsetOf (p1), "TypeInformation.IsSubsetOf(MemberAccess)"); + Assert.IsTrue (!p2.IsSubsetOf (p3), "TypeInformation.IsSubsetOf(ReflectionEmit)"); + Assert.IsTrue (!p3.IsSubsetOf (p1), "ReflectionEmit.IsSubsetOf(MemberAccess)"); + Assert.IsTrue (!p3.IsSubsetOf (p2), "ReflectionEmit.IsSubsetOf(TypeInformation)"); ReflectionPermission p4 = new ReflectionPermission (ReflectionPermissionFlag.AllFlags); - Assert ("MemberAccess.IsSubsetOf(AllFlags)", p1.IsSubsetOf (p4)); - Assert ("TypeInformation.IsSubsetOf(AllFlags)", p2.IsSubsetOf (p4)); - Assert ("ReflectionEmit.IsSubsetOf(AllFlags)", p3.IsSubsetOf (p4)); - Assert ("AllFlags.IsSubsetOf(MemberAccess)", !p4.IsSubsetOf (p1)); - Assert ("AllFlags.IsSubsetOf(TypeInformation)", !p4.IsSubsetOf (p2)); - Assert ("AllFlags.IsSubsetOf(ReflectionEmit)", !p4.IsSubsetOf (p3)); + Assert.IsTrue (p1.IsSubsetOf (p4), "MemberAccess.IsSubsetOf(AllFlags)"); + Assert.IsTrue (p2.IsSubsetOf (p4), "TypeInformation.IsSubsetOf(AllFlags)"); + Assert.IsTrue (p3.IsSubsetOf (p4), "ReflectionEmit.IsSubsetOf(AllFlags)"); + Assert.IsTrue (!p4.IsSubsetOf (p1), "AllFlags.IsSubsetOf(MemberAccess)"); + Assert.IsTrue (!p4.IsSubsetOf (p2), "AllFlags.IsSubsetOf(TypeInformation)"); + Assert.IsTrue (!p4.IsSubsetOf (p3), "AllFlags.IsSubsetOf(ReflectionEmit)"); } [Test] @@ -338,7 +338,7 @@ namespace MonoTests.System.Security.Permissions { { ReflectionPermission p1 = new ReflectionPermission (ReflectionPermissionFlag.NoFlags); EnvironmentPermission ep2 = new EnvironmentPermission (PermissionState.Unrestricted); - Assert ("IsSubsetOf(EnvironmentPermission)", p1.IsSubsetOf (ep2)); + Assert.IsTrue (p1.IsSubsetOf (ep2), "IsSubsetOf(EnvironmentPermission)"); } } } diff --git a/mcs/class/corlib/Test/System.Security.Permissions/RegistryPermissionTest.cs b/mcs/class/corlib/Test/System.Security.Permissions/RegistryPermissionTest.cs index a921e9b088b..fb3770db4b4 100644 --- a/mcs/class/corlib/Test/System.Security.Permissions/RegistryPermissionTest.cs +++ b/mcs/class/corlib/Test/System.Security.Permissions/RegistryPermissionTest.cs @@ -34,7 +34,7 @@ using System.Security.Permissions; namespace MonoTests.System.Security.Permissions { [TestFixture] - public class RegistryPermissionTest : Assertion { + public class RegistryPermissionTest { private static string className = "System.Security.Permissions.RegistryPermission, "; private static string keyCurrentUser = @"HKEY_CURRENT_USER\Software\Novell iFolder\spouliot\Home"; @@ -46,25 +46,25 @@ namespace MonoTests.System.Security.Permissions { public void PermissionStateNone () { RegistryPermission ep = new RegistryPermission (PermissionState.None); - AssertNotNull ("RegistryPermission(PermissionState.None)", ep); - Assert ("IsUnrestricted", !ep.IsUnrestricted ()); + Assert.IsNotNull (ep, "RegistryPermission(PermissionState.None)"); + Assert.IsTrue (!ep.IsUnrestricted (), "IsUnrestricted"); RegistryPermission copy = (RegistryPermission)ep.Copy (); - AssertEquals ("Copy.IsUnrestricted", ep.IsUnrestricted (), copy.IsUnrestricted ()); + Assert.AreEqual (ep.IsUnrestricted (), copy.IsUnrestricted (), "Copy.IsUnrestricted"); SecurityElement se = ep.ToXml (); - Assert ("ToXml-class", se.Attribute ("class").StartsWith (className)); - AssertEquals ("ToXml-version", "1", se.Attribute ("version")); + Assert.IsTrue (se.Attribute ("class").StartsWith (className), "ToXml-class"); + Assert.AreEqual ("1", se.Attribute ("version"), "ToXml-version"); } [Test] public void PermissionStateUnrestricted () { RegistryPermission ep = new RegistryPermission (PermissionState.Unrestricted); - AssertNotNull ("RegistryPermission(PermissionState.Unrestricted)", ep); - Assert ("IsUnrestricted", ep.IsUnrestricted ()); + Assert.IsNotNull (ep, "RegistryPermission(PermissionState.Unrestricted)"); + Assert.IsTrue (ep.IsUnrestricted (), "IsUnrestricted"); RegistryPermission copy = (RegistryPermission)ep.Copy (); - AssertEquals ("Copy.IsUnrestricted", ep.IsUnrestricted (), copy.IsUnrestricted ()); + Assert.AreEqual (ep.IsUnrestricted (), copy.IsUnrestricted (), "Copy.IsUnrestricted"); SecurityElement se = ep.ToXml (); - AssertEquals ("ToXml-Unrestricted", "true", se.Attribute ("Unrestricted")); + Assert.AreEqual ("true", se.Attribute ("Unrestricted"), "ToXml-Unrestricted"); } [Test] @@ -78,35 +78,35 @@ namespace MonoTests.System.Security.Permissions { public void AllAccess () { RegistryPermission ep = new RegistryPermission (RegistryPermissionAccess.AllAccess, keyLocalMachine); - Assert ("IsUnrestricted", !ep.IsUnrestricted ()); + Assert.IsTrue (!ep.IsUnrestricted (), "IsUnrestricted"); } [Test] public void NoAccess () { RegistryPermission ep = new RegistryPermission (RegistryPermissionAccess.NoAccess, keyLocalMachine); - Assert ("IsUnrestricted", !ep.IsUnrestricted ()); + Assert.IsTrue (!ep.IsUnrestricted (), "IsUnrestricted"); } [Test] public void CreateAccess () { RegistryPermission ep = new RegistryPermission (RegistryPermissionAccess.Create, keyLocalMachine); - Assert ("IsUnrestricted", !ep.IsUnrestricted ()); + Assert.IsTrue (!ep.IsUnrestricted (), "IsUnrestricted"); } [Test] public void ReadAccess () { RegistryPermission ep = new RegistryPermission (RegistryPermissionAccess.Read, keyLocalMachine); - Assert ("IsUnrestricted", !ep.IsUnrestricted ()); + Assert.IsTrue (!ep.IsUnrestricted (), "IsUnrestricted"); } [Test] public void WriteAccess () { RegistryPermission ep = new RegistryPermission (RegistryPermissionAccess.Write, keyLocalMachine); - Assert ("IsUnrestricted", !ep.IsUnrestricted ()); + Assert.IsTrue (!ep.IsUnrestricted (), "IsUnrestricted"); } [Test] @@ -120,9 +120,9 @@ namespace MonoTests.System.Security.Permissions { ep.AddPathList (RegistryPermissionAccess.Write, keyCurrentUser); SecurityElement se = ep.ToXml (); // Note: Debugger can mess results (try to run without stepping) - AssertEquals ("AddPathList-ToXml-Create", @"HKEY_LOCAL_MACHINE\SOFTWARE\Novell\Novell iFolder\1.00.000", se.Attribute ("Create")); - AssertEquals ("AddPathList-ToXml-Read", @"HKEY_LOCAL_MACHINE\SOFTWARE\Novell\Novell iFolder\1.00.000;HKEY_CURRENT_USER\Software\Novell iFolder\spouliot\Home", se.Attribute ("Read")); - AssertEquals ("AddPathList-ToXml-Write", @"HKEY_LOCAL_MACHINE\SOFTWARE\Novell\Novell iFolder\1.00.000;HKEY_CURRENT_USER\Software\Novell iFolder\spouliot\Home", se.Attribute ("Write")); + Assert.AreEqual (@"HKEY_LOCAL_MACHINE\SOFTWARE\Novell\Novell iFolder\1.00.000", se.Attribute ("Create"), "AddPathList-ToXml-Create"); + Assert.AreEqual (@"HKEY_LOCAL_MACHINE\SOFTWARE\Novell\Novell iFolder\1.00.000;HKEY_CURRENT_USER\Software\Novell iFolder\spouliot\Home", se.Attribute ("Read"), "AddPathList-ToXml-Read"); + Assert.AreEqual (@"HKEY_LOCAL_MACHINE\SOFTWARE\Novell\Novell iFolder\1.00.000;HKEY_CURRENT_USER\Software\Novell iFolder\spouliot\Home", se.Attribute ("Write"), "AddPathList-ToXml-Write"); } [Test] @@ -132,18 +132,18 @@ namespace MonoTests.System.Security.Permissions { ep.AddPathList (RegistryPermissionAccess.AllAccess, keyLocalMachine); ep.AddPathList (RegistryPermissionAccess.AllAccess, keyLocalMachineSubset); SecurityElement se = ep.ToXml (); - AssertEquals ("AddPathList-ToXml-Create", keyLocalMachineSubset, se.Attribute ("Create")); - AssertEquals ("AddPathList-ToXml-Read", keyLocalMachineSubset, se.Attribute ("Read")); - AssertEquals ("AddPathList-ToXml-Write", keyLocalMachineSubset, se.Attribute ("Write")); + Assert.AreEqual (keyLocalMachineSubset, se.Attribute ("Create"), "AddPathList-ToXml-Create"); + Assert.AreEqual (keyLocalMachineSubset, se.Attribute ("Read"), "AddPathList-ToXml-Read"); + Assert.AreEqual (keyLocalMachineSubset, se.Attribute ("Write"), "AddPathList-ToXml-Write"); ep = new RegistryPermission (PermissionState.None); ep.AddPathList (RegistryPermissionAccess.AllAccess, keyLocalMachine); ep.AddPathList (RegistryPermissionAccess.Create, keyLocalMachineSubset); ep.AddPathList (RegistryPermissionAccess.Read, keyCurrentUser); se = ep.ToXml (); - AssertEquals ("AddPathList-ToXml-Create", keyLocalMachineSubset, se.Attribute ("Create")); - AssertEquals ("AddPathList-ToXml-Read", keyLocalMachine + ";" + keyCurrentUser, se.Attribute ("Read")); - AssertEquals ("AddPathList-ToXml-Write", keyLocalMachine, se.Attribute ("Write")); + Assert.AreEqual (keyLocalMachineSubset, se.Attribute ("Create"), "AddPathList-ToXml-Create"); + Assert.AreEqual (keyLocalMachine + ";" + keyCurrentUser, se.Attribute ("Read"), "AddPathList-ToXml-Read"); + Assert.AreEqual (keyLocalMachine, se.Attribute ("Write"), "AddPathList-ToXml-Write"); } [Test] @@ -161,7 +161,7 @@ namespace MonoTests.System.Security.Permissions { RegistryPermission ep = new RegistryPermission (PermissionState.None); ep.AddPathList (RegistryPermissionAccess.Read, keyCurrentUser); ep.AddPathList (RegistryPermissionAccess.Write, keyLocalMachine); - AssertEquals ("GetPathList-NoAccess", String.Empty, ep.GetPathList (RegistryPermissionAccess.NoAccess)); + Assert.AreEqual (String.Empty, ep.GetPathList (RegistryPermissionAccess.NoAccess), "GetPathList-NoAccess"); } [Test] @@ -169,23 +169,23 @@ namespace MonoTests.System.Security.Permissions { { RegistryPermission ep = new RegistryPermission (PermissionState.None); #if NET_2_0 - AssertEquals ("GetPathList-Create-Empty", String.Empty, ep.GetPathList (RegistryPermissionAccess.Create)); - AssertEquals ("GetPathList-Read-Empty", String.Empty, ep.GetPathList (RegistryPermissionAccess.Read)); - AssertEquals ("GetPathList-Write-Empty", String.Empty, ep.GetPathList (RegistryPermissionAccess.Write)); + Assert.AreEqual (String.Empty, ep.GetPathList (RegistryPermissionAccess.Create), "GetPathList-Create-Empty"); + Assert.AreEqual (String.Empty, ep.GetPathList (RegistryPermissionAccess.Read), "GetPathList-Read-Empty"); + Assert.AreEqual (String.Empty, ep.GetPathList (RegistryPermissionAccess.Write), "GetPathList-Write-Empty"); #else - AssertNull ("GetPathList-Create-Empty", ep.GetPathList (RegistryPermissionAccess.Create)); - AssertNull ("GetPathList-Read-Empty", ep.GetPathList (RegistryPermissionAccess.Read)); - AssertNull ("GetPathList-Write-Empty", ep.GetPathList (RegistryPermissionAccess.Write)); + Assert.IsNull (ep.GetPathList (RegistryPermissionAccess.Create), "GetPathList-Create-Empty"); + Assert.IsNull (ep.GetPathList (RegistryPermissionAccess.Read), "GetPathList-Read-Empty"); + Assert.IsNull (ep.GetPathList (RegistryPermissionAccess.Write), "GetPathList-Write-Empty"); #endif ep.AddPathList (RegistryPermissionAccess.Create, keyLocalMachine); ep.AddPathList (RegistryPermissionAccess.Create, keyCurrentUser); - AssertEquals ("GetPathList-Read", keyLocalMachine + ";" + keyCurrentUser, ep.GetPathList (RegistryPermissionAccess.Create)); + Assert.AreEqual (keyLocalMachine + ";" + keyCurrentUser, ep.GetPathList (RegistryPermissionAccess.Create), "GetPathList-Read"); ep.AddPathList (RegistryPermissionAccess.Read, keyLocalMachine); - AssertEquals ("GetPathList-Read", keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Read)); + Assert.AreEqual (keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Read), "GetPathList-Read"); ep.AddPathList (RegistryPermissionAccess.Write, keyCurrentUser); - AssertEquals ("GetPathList-Write", keyCurrentUser, ep.GetPathList (RegistryPermissionAccess.Write)); + Assert.AreEqual (keyCurrentUser, ep.GetPathList (RegistryPermissionAccess.Write), "GetPathList-Write"); } [Test] @@ -198,8 +198,8 @@ namespace MonoTests.System.Security.Permissions { ep.SetPathList (RegistryPermissionAccess.Read, keyCurrentUser); ep.SetPathList (RegistryPermissionAccess.Write, keyCurrentUser); SecurityElement se = ep.ToXml (); - AssertEquals ("SetPathList-ToXml-Read", keyCurrentUser, se.Attribute ("Read")); - AssertEquals ("SetPathList-ToXml-Write", keyCurrentUser, se.Attribute ("Write")); + Assert.AreEqual (keyCurrentUser, se.Attribute ("Read"), "SetPathList-ToXml-Read"); + Assert.AreEqual (keyCurrentUser, se.Attribute ("Write"), "SetPathList-ToXml-Write"); } [Test] @@ -244,20 +244,20 @@ namespace MonoTests.System.Security.Permissions { { RegistryPermission ep = new RegistryPermission (PermissionState.None); SecurityElement se = ep.ToXml (); - AssertNotNull ("ToXml()", se); + Assert.IsNotNull (se, "ToXml()"); ep.FromXml (se); se.AddAttribute ("Read", keyLocalMachine); ep.FromXml (se); - AssertEquals ("FromXml-Read", keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Read)); + Assert.AreEqual (keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Read), "FromXml-Read"); se.AddAttribute ("Write", keyLocalMachine); ep.FromXml (se); - AssertEquals ("FromXml-Read", keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Read)); - AssertEquals ("FromXml-Write", keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Write)); + Assert.AreEqual (keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Read), "FromXml-Read"); + Assert.AreEqual (keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Write), "FromXml-Write"); se.AddAttribute ("Create", keyCurrentUser); ep.FromXml (se); - AssertEquals ("FromXml-Read", keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Read)); - AssertEquals ("FromXml-Write", keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Write)); - AssertEquals ("FromXml-Create", keyCurrentUser, ep.GetPathList (RegistryPermissionAccess.Create)); + Assert.AreEqual (keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Read), "FromXml-Read"); + Assert.AreEqual (keyLocalMachine, ep.GetPathList (RegistryPermissionAccess.Write), "FromXml-Write"); + Assert.AreEqual (keyCurrentUser, ep.GetPathList (RegistryPermissionAccess.Create), "FromXml-Create"); } [Test] @@ -266,7 +266,7 @@ namespace MonoTests.System.Security.Permissions { RegistryPermission ep1 = new RegistryPermission (RegistryPermissionAccess.Read, keyLocalMachine); RegistryPermission ep2 = null; RegistryPermission ep3 = (RegistryPermission)ep1.Union (ep2); - AssertEquals ("EP1 U null == EP1", ep1.ToXml ().ToString (), ep3.ToXml ().ToString ()); + Assert.AreEqual (ep1.ToXml ().ToString (), ep3.ToXml ().ToString (), "EP1 U null == EP1"); } [Test] @@ -275,9 +275,9 @@ namespace MonoTests.System.Security.Permissions { RegistryPermission ep1 = new RegistryPermission (PermissionState.Unrestricted); RegistryPermission ep2 = new RegistryPermission (RegistryPermissionAccess.Read, keyLocalMachine); RegistryPermission ep3 = (RegistryPermission)ep1.Union (ep2); - Assert ("Unrestricted U EP2 == Unrestricted", ep3.IsUnrestricted ()); + Assert.IsTrue (ep3.IsUnrestricted (), "Unrestricted U EP2 == Unrestricted"); ep3 = (RegistryPermission)ep2.Union (ep1); - Assert ("EP2 U Unrestricted == Unrestricted", ep3.IsUnrestricted ()); + Assert.IsTrue (ep3.IsUnrestricted (), "EP2 U Unrestricted == Unrestricted"); } #if NET_2_0 @@ -292,7 +292,7 @@ namespace MonoTests.System.Security.Permissions { RegistryPermission ep4 = (RegistryPermission)ep1.Union (ep2); ep4 = (RegistryPermission)ep4.Union (ep3); RegistryPermission ep5 = new RegistryPermission (RegistryPermissionAccess.AllAccess, keyLocalMachine); - AssertEquals ("EP1 U EP2 U EP3 == EP1+2+3", ep4.ToXml ().ToString (), ep5.ToXml ().ToString ()); + Assert.AreEqual (ep4.ToXml ().ToString (), ep5.ToXml ().ToString (), "EP1 U EP2 U EP3 == EP1+2+3"); } #if NET_2_0 @@ -304,9 +304,9 @@ namespace MonoTests.System.Security.Permissions { RegistryPermission ep1 = new RegistryPermission (RegistryPermissionAccess.AllAccess, keyLocalMachine); RegistryPermission ep2 = new RegistryPermission (RegistryPermissionAccess.Create, keyLocalMachineSubset); RegistryPermission ep3 = (RegistryPermission)ep1.Union (ep2); - AssertEquals ("Create", keyLocalMachineSubset, ep3.GetPathList (RegistryPermissionAccess.Create)); - AssertEquals ("Read", keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Read)); - AssertEquals ("Write", keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Write)); + Assert.AreEqual (keyLocalMachineSubset, ep3.GetPathList (RegistryPermissionAccess.Create), "Create"); + Assert.AreEqual (keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Read), "Read"); + Assert.AreEqual (keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Write), "Write"); } [Test] @@ -324,7 +324,7 @@ namespace MonoTests.System.Security.Permissions { RegistryPermission ep1 = new RegistryPermission (RegistryPermissionAccess.Read, keyLocalMachine); RegistryPermission ep2 = null; RegistryPermission ep3 = (RegistryPermission)ep1.Intersect (ep2); - AssertNull ("EP1 N null == null", ep3); + Assert.IsNull (ep3, "EP1 N null == null"); } [Test] @@ -333,11 +333,11 @@ namespace MonoTests.System.Security.Permissions { RegistryPermission ep1 = new RegistryPermission (PermissionState.Unrestricted); RegistryPermission ep2 = new RegistryPermission (RegistryPermissionAccess.Read, keyLocalMachine); RegistryPermission ep3 = (RegistryPermission)ep1.Intersect (ep2); - Assert ("Unrestricted N EP2 == EP2", !ep3.IsUnrestricted ()); - AssertEquals ("Unrestricted N EP2 == EP2", ep2.ToXml ().ToString (), ep3.ToXml ().ToString ()); + Assert.IsTrue (!ep3.IsUnrestricted (), "Unrestricted N EP2 == EP2"); + Assert.AreEqual (ep2.ToXml ().ToString (), ep3.ToXml ().ToString (), "Unrestricted N EP2 == EP2"); ep3 = (RegistryPermission)ep2.Intersect (ep1); - Assert ("EP2 N Unrestricted == EP2", !ep3.IsUnrestricted ()); - AssertEquals ("EP2 N Unrestricted == EP2", ep2.ToXml ().ToString (), ep3.ToXml ().ToString ()); + Assert.IsTrue (!ep3.IsUnrestricted (), "EP2 N Unrestricted == EP2"); + Assert.AreEqual (ep2.ToXml ().ToString (), ep3.ToXml ().ToString (), "EP2 N Unrestricted == EP2"); } [Test] @@ -347,22 +347,22 @@ namespace MonoTests.System.Security.Permissions { RegistryPermission ep1 = new RegistryPermission (RegistryPermissionAccess.Write, keyCurrentUser); RegistryPermission ep2 = new RegistryPermission (RegistryPermissionAccess.Read, keyLocalMachine); RegistryPermission ep3 = (RegistryPermission)ep1.Intersect (ep2); - AssertNull ("EP1 N EP2 == null", ep3); + Assert.IsNull (ep3, "EP1 N EP2 == null"); // intersection in read RegistryPermission ep4 = new RegistryPermission (RegistryPermissionAccess.Read, keyLocalMachine); ep3 = (RegistryPermission)ep4.Intersect (ep2); - AssertEquals ("Intersect-Read", keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Read)); + Assert.AreEqual (keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Read), "Intersect-Read"); // intersection in write RegistryPermission ep5 = new RegistryPermission (RegistryPermissionAccess.Write, keyCurrentUser); ep3 = (RegistryPermission)ep5.Intersect (ep1); - AssertEquals ("Intersect-Write", keyCurrentUser, ep3.GetPathList (RegistryPermissionAccess.Write)); + Assert.AreEqual (keyCurrentUser, ep3.GetPathList (RegistryPermissionAccess.Write), "Intersect-Write"); // intersection in read and write RegistryPermission ep6 = new RegistryPermission (RegistryPermissionAccess.AllAccess, keyLocalMachine); RegistryPermission ep7 = new RegistryPermission (RegistryPermissionAccess.AllAccess, keyLocalMachine); ep3 = (RegistryPermission)ep6.Intersect (ep7); - AssertEquals ("Intersect-AllAccess-Create", keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Create)); - AssertEquals ("Intersect-AllAccess-Read", keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Read)); - AssertEquals ("Intersect-AllAccess-Write", keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Write)); + Assert.AreEqual (keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Create), "Intersect-AllAccess-Create"); + Assert.AreEqual (keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Read), "Intersect-AllAccess-Read"); + Assert.AreEqual (keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Write), "Intersect-AllAccess-Write"); } #if NET_2_0 @@ -374,9 +374,9 @@ namespace MonoTests.System.Security.Permissions { RegistryPermission ep1 = new RegistryPermission (RegistryPermissionAccess.AllAccess, keyLocalMachine); RegistryPermission ep2 = new RegistryPermission (RegistryPermissionAccess.Create, keyLocalMachineSubset); RegistryPermission ep3 = (RegistryPermission)ep1.Intersect (ep2); - AssertEquals ("Create", keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Create)); - AssertNull ("Read", ep3.GetPathList (RegistryPermissionAccess.Read)); - AssertNull ("Write", ep3.GetPathList (RegistryPermissionAccess.Write)); + Assert.AreEqual (keyLocalMachine, ep3.GetPathList (RegistryPermissionAccess.Create), "Create"); + Assert.IsNull (ep3.GetPathList (RegistryPermissionAccess.Read), "Read"); + Assert.IsNull (ep3.GetPathList (RegistryPermissionAccess.Write), "Write"); } [Test] @@ -392,7 +392,7 @@ namespace MonoTests.System.Security.Permissions { public void IsSubsetOfNull () { RegistryPermission ep1 = new RegistryPermission (RegistryPermissionAccess.Read, keyLocalMachine); - Assert ("IsSubsetOf(null)", !ep1.IsSubsetOf (null)); + Assert.IsTrue (!ep1.IsSubsetOf (null), "IsSubsetOf(null)"); } [Test] @@ -401,9 +401,9 @@ namespace MonoTests.System.Security.Permissions { RegistryPermission ep1 = new RegistryPermission (PermissionState.Unrestricted); RegistryPermission ep2 = new RegistryPermission (RegistryPermissionAccess.Read, keyLocalMachine); RegistryPermission ep3 = new RegistryPermission (PermissionState.Unrestricted); - Assert ("Unrestricted.IsSubsetOf()", !ep1.IsSubsetOf (ep2)); - Assert ("IsSubsetOf(Unrestricted)", ep2.IsSubsetOf (ep1)); - Assert ("Unrestricted.IsSubsetOf(Unrestricted)", ep1.IsSubsetOf (ep3)); + Assert.IsTrue (!ep1.IsSubsetOf (ep2), "Unrestricted.IsSubsetOf()"); + Assert.IsTrue (ep2.IsSubsetOf (ep1), "IsSubsetOf(Unrestricted)"); + Assert.IsTrue (ep1.IsSubsetOf (ep3), "Unrestricted.IsSubsetOf(Unrestricted)"); } [Test] @@ -411,11 +411,11 @@ namespace MonoTests.System.Security.Permissions { { RegistryPermission ep1 = new RegistryPermission (RegistryPermissionAccess.Write, keyLocalMachine); RegistryPermission ep2 = new RegistryPermission (RegistryPermissionAccess.Read, keyLocalMachine); - Assert ("IsSubsetOf(nosubset1)", !ep1.IsSubsetOf (ep2)); - Assert ("IsSubsetOf(nosubset2)", !ep2.IsSubsetOf (ep1)); + Assert.IsTrue (!ep1.IsSubsetOf (ep2), "IsSubsetOf(nosubset1)"); + Assert.IsTrue (!ep2.IsSubsetOf (ep1), "IsSubsetOf(nosubset2)"); RegistryPermission ep3 = new RegistryPermission (RegistryPermissionAccess.AllAccess, keyLocalMachine); - Assert ("Write.IsSubsetOf(All)", ep1.IsSubsetOf (ep3)); - Assert ("All.IsSubsetOf(Write)", !ep3.IsSubsetOf (ep1)); + Assert.IsTrue (ep1.IsSubsetOf (ep3), "Write.IsSubsetOf(All)"); + Assert.IsTrue (!ep3.IsSubsetOf (ep1), "All.IsSubsetOf(Write)"); } [Test] @@ -424,7 +424,7 @@ namespace MonoTests.System.Security.Permissions { { RegistryPermission ep1 = new RegistryPermission (RegistryPermissionAccess.Read, keyLocalMachine); FileDialogPermission fdp2 = new FileDialogPermission (PermissionState.Unrestricted); - Assert ("IsSubsetOf(FileDialogPermission)", ep1.IsSubsetOf (fdp2)); + Assert.IsTrue (ep1.IsSubsetOf (fdp2), "IsSubsetOf(FileDialogPermission)"); } } } diff --git a/mcs/class/corlib/Test/System.Security.Permissions/ZoneIdentityPermissionAttributeTest.cs b/mcs/class/corlib/Test/System.Security.Permissions/ZoneIdentityPermissionAttributeTest.cs index bc0a0b5c41b..4a42d34e6e7 100644 --- a/mcs/class/corlib/Test/System.Security.Permissions/ZoneIdentityPermissionAttributeTest.cs +++ b/mcs/class/corlib/Test/System.Security.Permissions/ZoneIdentityPermissionAttributeTest.cs @@ -1,145 +1,145 @@ -// -// ZoneIdentityPermissionAttributeTest.cs - -// NUnit Test Cases for ZoneIdentityPermissionAttribute -// -// Author: -// Sebastien Pouliot -// -// (C) 2003 Motus Technologies Inc. (http://www.motus.com) -// Copyright (C) 2004 Novell, Inc (http://www.novell.com) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -using NUnit.Framework; -using System; -using System.Security; -using System.Security.Permissions; - -namespace MonoTests.System.Security.Permissions { - - [TestFixture] - public class ZoneIdentityPermissionAttributeTest { - - [Test] - public void Default () - { - ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); - Assert.AreEqual (a.ToString (), a.TypeId.ToString (), "TypeId"); - Assert.IsFalse (a.Unrestricted, "Unrestricted"); - Assert.AreEqual (SecurityZone.NoZone, a.Zone, "Zone"); - - ZoneIdentityPermission perm = (ZoneIdentityPermission) a.CreatePermission (); - Assert.AreEqual (SecurityZone.NoZone, perm.SecurityZone, "CreatePermission-SecurityZone"); - } - - [Test] - public void Action () - { - ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); - Assert.AreEqual (SecurityAction.Assert, a.Action, "Action=Assert"); - a.Action = SecurityAction.Demand; - Assert.AreEqual (SecurityAction.Demand, a.Action, "Action=Demand"); - a.Action = SecurityAction.Deny; - Assert.AreEqual (SecurityAction.Deny, a.Action, "Action=Deny"); - a.Action = SecurityAction.InheritanceDemand; - Assert.AreEqual (SecurityAction.InheritanceDemand, a.Action, "Action=InheritanceDemand"); - a.Action = SecurityAction.LinkDemand; - Assert.AreEqual (SecurityAction.LinkDemand, a.Action, "Action=LinkDemand"); - a.Action = SecurityAction.PermitOnly; - Assert.AreEqual (SecurityAction.PermitOnly, a.Action, "Action=PermitOnly"); - a.Action = SecurityAction.RequestMinimum; - Assert.AreEqual (SecurityAction.RequestMinimum, a.Action, "Action=RequestMinimum"); - a.Action = SecurityAction.RequestOptional; - Assert.AreEqual (SecurityAction.RequestOptional, a.Action, "Action=RequestOptional"); - a.Action = SecurityAction.RequestRefuse; - Assert.AreEqual (SecurityAction.RequestRefuse, a.Action, "Action=RequestRefuse"); - } - - [Test] - public void Action_Invalid () - { - ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute ((SecurityAction)Int32.MinValue); - // no validation in attribute - } - - [Test] - public void Zone () - { - ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); - Assert.AreEqual (SecurityZone.NoZone, a.Zone, "Zone=default"); - a.Zone = SecurityZone.Internet; - Assert.AreEqual (SecurityZone.Internet, a.Zone, "Zone=Internet"); - a.Zone = SecurityZone.Intranet; - Assert.AreEqual (SecurityZone.Intranet, a.Zone, "Zone=Intranet"); - a.Zone = SecurityZone.MyComputer; - Assert.AreEqual (SecurityZone.MyComputer, a.Zone, "Zone=MyComputer"); - a.Zone = SecurityZone.NoZone; - Assert.AreEqual (SecurityZone.NoZone, a.Zone, "Zone=NoZone"); - a.Zone = SecurityZone.Trusted; - Assert.AreEqual (SecurityZone.Trusted, a.Zone, "Zone=Trusted"); - a.Zone = SecurityZone.Untrusted; - Assert.AreEqual (SecurityZone.Untrusted, a.Zone, "Zone=Untrusted"); - } - - [Test] - public void Zone_Invalid () - { - ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); - a.Zone = (SecurityZone)Int32.MinValue; - // no validation in attribute - } - - [Test] - public void TypeId () - { - ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); - Assert.AreEqual (a.ToString (), a.TypeId.ToString (), "TypeId"); - } - +// +// ZoneIdentityPermissionAttributeTest.cs - +// NUnit Test Cases for ZoneIdentityPermissionAttribute +// +// Author: +// Sebastien Pouliot +// +// (C) 2003 Motus Technologies Inc. (http://www.motus.com) +// Copyright (C) 2004 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using NUnit.Framework; +using System; +using System.Security; +using System.Security.Permissions; + +namespace MonoTests.System.Security.Permissions { + + [TestFixture] + public class ZoneIdentityPermissionAttributeTest { + + [Test] + public void Default () + { + ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); + Assert.AreEqual (a.ToString (), a.TypeId.ToString (), "TypeId"); + Assert.IsFalse (a.Unrestricted, "Unrestricted"); + Assert.AreEqual (SecurityZone.NoZone, a.Zone, "Zone"); + + ZoneIdentityPermission perm = (ZoneIdentityPermission) a.CreatePermission (); + Assert.AreEqual (SecurityZone.NoZone, perm.SecurityZone, "CreatePermission-SecurityZone"); + } + + [Test] + public void Action () + { + ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); + Assert.AreEqual (SecurityAction.Assert, a.Action, "Action=Assert"); + a.Action = SecurityAction.Demand; + Assert.AreEqual (SecurityAction.Demand, a.Action, "Action=Demand"); + a.Action = SecurityAction.Deny; + Assert.AreEqual (SecurityAction.Deny, a.Action, "Action=Deny"); + a.Action = SecurityAction.InheritanceDemand; + Assert.AreEqual (SecurityAction.InheritanceDemand, a.Action, "Action=InheritanceDemand"); + a.Action = SecurityAction.LinkDemand; + Assert.AreEqual (SecurityAction.LinkDemand, a.Action, "Action=LinkDemand"); + a.Action = SecurityAction.PermitOnly; + Assert.AreEqual (SecurityAction.PermitOnly, a.Action, "Action=PermitOnly"); + a.Action = SecurityAction.RequestMinimum; + Assert.AreEqual (SecurityAction.RequestMinimum, a.Action, "Action=RequestMinimum"); + a.Action = SecurityAction.RequestOptional; + Assert.AreEqual (SecurityAction.RequestOptional, a.Action, "Action=RequestOptional"); + a.Action = SecurityAction.RequestRefuse; + Assert.AreEqual (SecurityAction.RequestRefuse, a.Action, "Action=RequestRefuse"); + } + + [Test] + public void Action_Invalid () + { + ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute ((SecurityAction)Int32.MinValue); + // no validation in attribute + } + + [Test] + public void Zone () + { + ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); + Assert.AreEqual (SecurityZone.NoZone, a.Zone, "Zone=default"); + a.Zone = SecurityZone.Internet; + Assert.AreEqual (SecurityZone.Internet, a.Zone, "Zone=Internet"); + a.Zone = SecurityZone.Intranet; + Assert.AreEqual (SecurityZone.Intranet, a.Zone, "Zone=Intranet"); + a.Zone = SecurityZone.MyComputer; + Assert.AreEqual (SecurityZone.MyComputer, a.Zone, "Zone=MyComputer"); + a.Zone = SecurityZone.NoZone; + Assert.AreEqual (SecurityZone.NoZone, a.Zone, "Zone=NoZone"); + a.Zone = SecurityZone.Trusted; + Assert.AreEqual (SecurityZone.Trusted, a.Zone, "Zone=Trusted"); + a.Zone = SecurityZone.Untrusted; + Assert.AreEqual (SecurityZone.Untrusted, a.Zone, "Zone=Untrusted"); + } + + [Test] + public void Zone_Invalid () + { + ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); + a.Zone = (SecurityZone)Int32.MinValue; + // no validation in attribute + } + + [Test] + public void TypeId () + { + ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); + Assert.AreEqual (a.ToString (), a.TypeId.ToString (), "TypeId"); + } + [Test] #if NET_2_0 [Category ("NotWorking")] -#else +#else [ExpectedException (typeof (ArgumentException))] -#endif - public void Unrestricted () - { - ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); - a.Unrestricted = true; - IPermission perm = a.CreatePermission (); - } - - [Test] - public void Attributes () - { - Type t = typeof (ZoneIdentityPermissionAttribute); - Assert.IsTrue (t.IsSerializable, "IsSerializable"); - - object[] attrs = t.GetCustomAttributes (typeof (AttributeUsageAttribute), false); - Assert.AreEqual (1, attrs.Length, "AttributeUsage"); - AttributeUsageAttribute aua = (AttributeUsageAttribute)attrs [0]; - Assert.IsTrue (aua.AllowMultiple, "AllowMultiple"); - Assert.IsFalse (aua.Inherited, "Inherited"); - AttributeTargets at = (AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method); - Assert.AreEqual (at, aua.ValidOn, "ValidOn"); - } - } -} +#endif + public void Unrestricted () + { + ZoneIdentityPermissionAttribute a = new ZoneIdentityPermissionAttribute (SecurityAction.Assert); + a.Unrestricted = true; + IPermission perm = a.CreatePermission (); + } + + [Test] + public void Attributes () + { + Type t = typeof (ZoneIdentityPermissionAttribute); + Assert.IsTrue (t.IsSerializable, "IsSerializable"); + + object[] attrs = t.GetCustomAttributes (typeof (AttributeUsageAttribute), false); + Assert.AreEqual (1, attrs.Length, "AttributeUsage"); + AttributeUsageAttribute aua = (AttributeUsageAttribute)attrs [0]; + Assert.IsTrue (aua.AllowMultiple, "AllowMultiple"); + Assert.IsFalse (aua.Inherited, "Inherited"); + AttributeTargets at = (AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method); + Assert.AreEqual (at, aua.ValidOn, "ValidOn"); + } + } +} diff --git a/mcs/class/corlib/Test/System.Security.Policy/ApplicationTrustTest.cs b/mcs/class/corlib/Test/System.Security.Policy/ApplicationTrustTest.cs index 7114f0bffdd..3c1bf692c42 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/ApplicationTrustTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/ApplicationTrustTest.cs @@ -55,9 +55,9 @@ namespace MonoTests.System.Security.Policy { Assert.AreEqual (String.Empty, at.DefaultGrantSet.AttributeString, "DefaultGrantSet.AttributeString"); Assert.IsTrue (at.DefaultGrantSet.PermissionSet.IsEmpty (), "DefaultGrantSet.PermissionSet.IsEmpty"); Assert.IsFalse (at.DefaultGrantSet.PermissionSet.IsUnrestricted (), "DefaultGrantSet.PermissionSet.IsUnrestricted"); - Assert.IsNull (at.ExtraInfo, "ExtraInfo"); - Assert.IsFalse (at.IsApplicationTrustedToRun, "IsApplicationTrustedToRun"); - Assert.IsFalse (at.Persist, "Persist"); + Assert.IsNull (at.ExtraInfo, "ExtraInfo"); + Assert.IsFalse (at.IsApplicationTrustedToRun, "IsApplicationTrustedToRun"); + Assert.IsFalse (at.Persist, "Persist"); string expected = AdjustLineEnds ("\r\n\r\n\r\n\r\n\r\n\r\n\r\n"); Assert.AreEqual (expected, AdjustLineEnds (at.ToXml ().ToString ()), "XML"); } @@ -193,65 +193,65 @@ namespace MonoTests.System.Security.Policy { { ApplicationTrust at = new ApplicationTrust (); at.FromXml (null); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void FromXml_InvalidTag () - { - ApplicationTrust at = new ApplicationTrust (); - SecurityElement se = at.ToXml (); - se.Tag = "MonoTrust"; - at.FromXml (se); - } - - [Test] - public void FromXml_InvalidVersion () - { - ApplicationTrust at = new ApplicationTrust (); - SecurityElement se = at.ToXml (); - - SecurityElement w = new SecurityElement (se.Tag); - w.AddAttribute ("version", "2"); - foreach (SecurityElement child in se.Children) - w.AddChild (child); - - at.FromXml (w); - } - - [Test] - public void FromXml_NoVersion () - { - ApplicationTrust at = new ApplicationTrust (); - SecurityElement se = at.ToXml (); - - SecurityElement w = new SecurityElement (se.Tag); - foreach (SecurityElement child in se.Children) - w.AddChild (child); - - at.FromXml (w); - } - - [Test] - public void FromXml_NoChild () - { - ApplicationTrust at = new ApplicationTrust (); - SecurityElement se = at.ToXml (); - - SecurityElement w = new SecurityElement (se.Tag); - w.AddAttribute ("version", "1"); - - at.FromXml (w); - - Assert.IsNull (at.ApplicationIdentity, "ApplicationIdentity"); - Assert.AreEqual (PolicyStatementAttribute.Nothing, at.DefaultGrantSet.Attributes, "DefaultGrantSet.Attributes"); - Assert.AreEqual (String.Empty, at.DefaultGrantSet.AttributeString, "DefaultGrantSet.AttributeString"); - Assert.IsTrue (at.DefaultGrantSet.PermissionSet.IsEmpty (), "DefaultGrantSet.PermissionSet.IsEmpty"); - Assert.IsFalse (at.DefaultGrantSet.PermissionSet.IsUnrestricted (), "DefaultGrantSet.PermissionSet.IsUnrestricted"); - Assert.IsNull (at.ExtraInfo, "ExtraInfo"); - Assert.IsFalse (at.IsApplicationTrustedToRun, "IsApplicationTrustedToRun"); - Assert.IsFalse (at.Persist, "Persist"); - } + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void FromXml_InvalidTag () + { + ApplicationTrust at = new ApplicationTrust (); + SecurityElement se = at.ToXml (); + se.Tag = "MonoTrust"; + at.FromXml (se); + } + + [Test] + public void FromXml_InvalidVersion () + { + ApplicationTrust at = new ApplicationTrust (); + SecurityElement se = at.ToXml (); + + SecurityElement w = new SecurityElement (se.Tag); + w.AddAttribute ("version", "2"); + foreach (SecurityElement child in se.Children) + w.AddChild (child); + + at.FromXml (w); + } + + [Test] + public void FromXml_NoVersion () + { + ApplicationTrust at = new ApplicationTrust (); + SecurityElement se = at.ToXml (); + + SecurityElement w = new SecurityElement (se.Tag); + foreach (SecurityElement child in se.Children) + w.AddChild (child); + + at.FromXml (w); + } + + [Test] + public void FromXml_NoChild () + { + ApplicationTrust at = new ApplicationTrust (); + SecurityElement se = at.ToXml (); + + SecurityElement w = new SecurityElement (se.Tag); + w.AddAttribute ("version", "1"); + + at.FromXml (w); + + Assert.IsNull (at.ApplicationIdentity, "ApplicationIdentity"); + Assert.AreEqual (PolicyStatementAttribute.Nothing, at.DefaultGrantSet.Attributes, "DefaultGrantSet.Attributes"); + Assert.AreEqual (String.Empty, at.DefaultGrantSet.AttributeString, "DefaultGrantSet.AttributeString"); + Assert.IsTrue (at.DefaultGrantSet.PermissionSet.IsEmpty (), "DefaultGrantSet.PermissionSet.IsEmpty"); + Assert.IsFalse (at.DefaultGrantSet.PermissionSet.IsUnrestricted (), "DefaultGrantSet.PermissionSet.IsUnrestricted"); + Assert.IsNull (at.ExtraInfo, "ExtraInfo"); + Assert.IsFalse (at.IsApplicationTrustedToRun, "IsApplicationTrustedToRun"); + Assert.IsFalse (at.Persist, "Persist"); + } } } diff --git a/mcs/class/corlib/Test/System.Security.Policy/ChangeLog b/mcs/class/corlib/Test/System.Security.Policy/ChangeLog index 25cdd83e40e..9da305cd054 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/ChangeLog +++ b/mcs/class/corlib/Test/System.Security.Policy/ChangeLog @@ -1,3 +1,7 @@ +2009-06-26 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2006-01-09 Raja R Harinath * HashMembershipConditionTest.cs (HashValue): Remove 1/256 chance diff --git a/mcs/class/corlib/Test/System.Security.Policy/CodeGroupTest.cs b/mcs/class/corlib/Test/System.Security.Policy/CodeGroupTest.cs index d61c9304c05..7298a72a72d 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/CodeGroupTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/CodeGroupTest.cs @@ -70,7 +70,7 @@ namespace MonoTests.System.Security.Policy { } [TestFixture] - public class CodeGroupTest : Assertion { + public class CodeGroupTest { private const string ps_Name = "TestName"; @@ -86,15 +86,15 @@ namespace MonoTests.System.Security.Policy { { // legal MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), null); - AssertNull ("PolicyStatement", cg.PolicyStatement); + Assert.IsNull (cg.PolicyStatement, "PolicyStatement"); } [Test] public void Constructor () { MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), new PolicyStatement(new PermissionSet(PermissionState.None))); - AssertNotNull ("PolicyStatement property not set correctly by constructor.", cg.PolicyStatement); - AssertNotNull ("MembershipCondition property not set correctly by constructor.", cg.MembershipCondition); + Assert.IsNotNull (cg.PolicyStatement, "PolicyStatement property not set correctly by constructor."); + Assert.IsNotNull (cg.MembershipCondition, "MembershipCondition property not set correctly by constructor."); } [Test] @@ -103,7 +103,7 @@ namespace MonoTests.System.Security.Policy { const string description = "Test Description"; MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), new PolicyStatement(new PermissionSet(PermissionState.None))); cg.Description = description; - AssertEquals ("Description not the expected value", description, cg.Description); + Assert.AreEqual (description, cg.Description, "Description not the expected value"); } [Test] @@ -112,16 +112,16 @@ namespace MonoTests.System.Security.Policy { const string name = "Test Name"; MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), new PolicyStatement(new PermissionSet(PermissionState.None))); cg.Name = name; - AssertEquals ("Description not the expected value", name, cg.Name); + Assert.AreEqual (name, cg.Name, "Description not the expected value"); } [Test] public void AddChild () { MyCodeGroup cg = new MyCodeGroup(new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None))); - AssertEquals ("Unexpected number of children (before add)", 0, cg.Children.Count); + Assert.AreEqual (0, cg.Children.Count, "Unexpected number of children (before add)"); cg.AddChild (new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.Unrestricted)))); - AssertEquals ("Unexpected number of children (after add)", 1, cg.Children.Count); + Assert.AreEqual (1, cg.Children.Count, "Unexpected number of children (after add)"); } [Test] @@ -139,7 +139,7 @@ namespace MonoTests.System.Security.Policy { PolicyStatement ps = new PolicyStatement (new PermissionSet (PermissionState.None)); ps.Attributes = psa; MyCodeGroup cg = new MyCodeGroup(new AllMembershipCondition (), ps); - AssertEquals ("AttributeString", psa.ToString(), cg.AttributeString); + Assert.AreEqual (psa.ToString(), cg.AttributeString, "AttributeString"); } [Test] @@ -155,7 +155,7 @@ namespace MonoTests.System.Security.Policy { { PolicyStatement ps = new PolicyStatement(new NamedPermissionSet (ps_Name)); MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps); - AssertEquals ("PermissionSetName", ps_Name, cg.PermissionSetName); + Assert.AreEqual (ps_Name, cg.PermissionSetName, "PermissionSetName"); } [Test] @@ -165,18 +165,18 @@ namespace MonoTests.System.Security.Policy { MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps); cg.Name = "SomeName"; cg.Description = "Some Description"; - Assert ("Equals (itself)", cg.Equals (cg)); - Assert ("Equals (string)", !cg.Equals ("Not Equal to this")); + Assert.IsTrue (cg.Equals (cg), "Equals (itself)"); + Assert.IsTrue (!cg.Equals ("Not Equal to this"), "Equals (string)"); MyCodeGroup cg2 = new MyCodeGroup(new AllMembershipCondition(), ps); cg2.Name = "SomeOtherName"; cg2.Description = "Some Other Description"; - Assert ("Equals (another)", !cg.Equals (cg2)); + Assert.IsTrue (!cg.Equals (cg2), "Equals (another)"); cg2 = new MyCodeGroup (new ApplicationDirectoryMembershipCondition(), ps); cg2.Name = cg.Name; cg2.Description = cg.Description; - Assert ("Equals (different Membership Condition)", !cg.Equals (cg2)); + Assert.IsTrue (!cg.Equals (cg2), "Equals (different Membership Condition)"); } [Test] @@ -197,11 +197,11 @@ namespace MonoTests.System.Security.Policy { cg2.Name = cg.Name; cg2.Description = cg.Description; - Assert ("Should be equal when Children are ignored", cg.Equals (cg2)); - Assert ("Should not be equal when Child count is different", !cg.Equals(cg2, true)); + Assert.IsTrue (cg.Equals (cg2), "Should be equal when Children are ignored"); + Assert.IsTrue (!cg.Equals(cg2, true), "Should not be equal when Child count is different"); cg2.AddChild(cgChild); - Assert ("Should be equal when children are equal", cg2.Equals(cg, true)); + Assert.IsTrue (cg2.Equals(cg, true), "Should be equal when children are equal"); } [Test] @@ -222,10 +222,10 @@ namespace MonoTests.System.Security.Policy { cgChild2.Description = "Child Descripiton 2"; cg.AddChild (cgChild2); - AssertEquals ("Should be two children before the call to Remove()", 2, cg.Children.Count); + Assert.AreEqual (2, cg.Children.Count, "Should be two children before the call to Remove()"); cg.RemoveChild(cgChild); - AssertEquals ("Should be one children after the call to Remove()", 1, cg.Children.Count); - AssertEquals("Remaining child does not have correct name", "ChildName2", ((CodeGroup)cg.Children[0]).Name); + Assert.AreEqual (1, cg.Children.Count, "Should be one children after the call to Remove()"); + Assert.AreEqual("ChildName2", ((CodeGroup)cg.Children[0]).Name, "Remaining child does not have correct name"); } [Test] @@ -258,13 +258,13 @@ namespace MonoTests.System.Security.Policy { MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None))); SecurityElement se = cg.ToXml (); string s = se.ToString (); - Assert ("ToXml-Starts", s.StartsWith ("" + Environment.NewLine + "" + Environment.NewLine)); + Assert.IsTrue (s.StartsWith ("" + Environment.NewLine + "" + Environment.NewLine), "ToXml-Ends"); cg.AddChild (new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.Unrestricted)))); se = cg.ToXml (); s = se.ToString (); - Assert ("ToXml-Child", s.IndexOf (" 0); + Assert.IsTrue (s.IndexOf (" 0, "ToXml-Child"); } [Test] @@ -274,16 +274,16 @@ namespace MonoTests.System.Security.Policy { MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps); cg.Name = "SomeName"; cg.Description = "Some Description"; - Assert ("Equals (itself)", cg.Equals (cg)); + Assert.IsTrue (cg.Equals (cg), "Equals (itself)"); SecurityElement se = cg.ToXml (); MyCodeGroup cg2 = new MyCodeGroup (new AllMembershipCondition(), ps); cg2.Name = "SomeOtherName"; cg2.Description = "Some Other Description"; - Assert ("Equals (another)", !cg.Equals (cg2)); + Assert.IsTrue (!cg.Equals (cg2), "Equals (another)"); cg2.FromXml (se); - Assert ("Equals (FromXml)", cg.Equals (cg2)); + Assert.IsTrue (cg.Equals (cg2), "Equals (FromXml)"); } [Test] @@ -301,13 +301,13 @@ namespace MonoTests.System.Security.Policy { cg.Description = "Some Description"; cg.AddChild (cgChild); cg.AddChild (cgChild); - Assert ("Equals (itself)", cg.Equals (cg)); + Assert.IsTrue (cg.Equals (cg), "Equals (itself)"); SecurityElement se = cg.ToXml (); MyCodeGroup cg2 = (MyCodeGroup) cg.Copy (); cg2.FromXml (se); // MissingMethodException down here (stangely not up here ?!? delayed ?) - Assert ("Equals (FromXml)", cg.Equals (cg2, true)); + Assert.IsTrue (cg.Equals (cg2, true), "Equals (FromXml)"); } [Test] @@ -324,12 +324,12 @@ namespace MonoTests.System.Security.Policy { cg.Name = "SomeName"; cg.Description = "Some Description"; cg.AddChild (cgChild); - Assert ("Equals (itself)", cg.Equals (cg)); + Assert.IsTrue (cg.Equals (cg), "Equals (itself)"); SecurityElement se = cg.ToXml (); MyCodeGroup cg2 = (MyCodeGroup) cg.Copy (); cg2.FromXml (se); - Assert ("Equals (FromXml)", cg.Equals (cg2, true)); + Assert.IsTrue (cg.Equals (cg2, true), "Equals (FromXml)"); } [Test] diff --git a/mcs/class/corlib/Test/System.Security.Policy/EvidenceTest.cs b/mcs/class/corlib/Test/System.Security.Policy/EvidenceTest.cs index 3f5c7f2ae58..0134860b90a 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/EvidenceTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/EvidenceTest.cs @@ -30,7 +30,7 @@ // using System; -using System.Collections; +using System.Collections; using System.Reflection; using System.Security.Policy; using NUnit.Framework; @@ -38,20 +38,22 @@ using NUnit.Framework; namespace MonoTests.System.Security.Policy { [TestFixture] - public class EvidenceTest : Assertion { + public class EvidenceTest { [Test] public void DefaultConstructor () { Evidence evidence = new Evidence (); - AssertEquals ("Default constructor count should be zero", evidence.Count, 0); - AssertEquals ("Default constructor host enumerator MoveNext() should be false", - evidence.GetHostEnumerator().MoveNext(), false); - AssertEquals ("Default constructor assembly enumerator MoveNext() should be false", - evidence.GetAssemblyEnumerator().MoveNext(), false); - AssertEquals ("Default constructor enumerator MoveNext() should be false", - evidence.GetEnumerator().MoveNext(), false); + Assert.AreEqual (evidence.Count, 0, "Default constructor count should be zero"); + Assert.AreEqual (evidence.GetHostEnumerator().MoveNext(), false, + "Default constructor host enumerator MoveNext() should be false"); + + Assert.AreEqual (evidence.GetAssemblyEnumerator().MoveNext(), false, + "Default constructor assembly enumerator MoveNext() should be false"); + + Assert.AreEqual (evidence.GetEnumerator().MoveNext(), false, + "Default constructor enumerator MoveNext() should be false"); } [Test] @@ -61,7 +63,8 @@ namespace MonoTests.System.Security.Policy { object[] assemarray = new object[10]; Evidence evidence = new Evidence ( hostarray, assemarray ); - AssertEquals ( "Count of multiple arg constructor should equal 20", evidence.Count, 20 ); + Assert.AreEqual (evidence.Count, 20, + "Count of multiple arg constructor should equal 20"); } [Test] @@ -72,21 +75,21 @@ namespace MonoTests.System.Security.Policy { Evidence evidence1 = new Evidence (hostlist, asmblist); Evidence evidence2 = new Evidence (evidence1); - AssertEquals("Copy constructor counts do not match", evidence1.Count, evidence2.Count); + Assert.AreEqual(evidence1.Count, evidence2.Count, "Copy constructor counts do not match"); } [Test] public void Constructor_Null () { Evidence e = new Evidence (null); - AssertEquals ("Count-Empty", 0, e.Count); + Assert.AreEqual (0, e.Count, "Count-Empty"); } [Test] public void Constructor_NullNull () { Evidence e = new Evidence (null, null); - AssertEquals ("Count-Empty", 0, e.Count); + Assert.AreEqual (0, e.Count, "Count-Empty"); } [Test] @@ -100,13 +103,12 @@ namespace MonoTests.System.Security.Policy { obj = String.Format ("asmb-{0}", i+1); comparray[i] = obj; evidence.AddAssembly (obj); - AssertEquals (evidence.Count, i+1); + Assert.AreEqual (evidence.Count, i+1); } int index = 0; foreach (object compobj in evidence) { - AssertEquals ("Comparison object does not equal evidence assembly object", - comparray[index++], compobj); + Assert.AreEqual (comparray[index++], compobj, "Comparison object does not equal evidence assembly object"); } } @@ -121,13 +123,13 @@ namespace MonoTests.System.Security.Policy { obj = String.Format ("asmb-{0}", i+1); comparray[i] = obj; evidence.AddAssembly ( obj ); - AssertEquals (evidence.Count, i+1); + Assert.AreEqual (evidence.Count, i+1); } int index = 0; foreach (object compobj in evidence) { - AssertEquals ("Comparison object does not equal evidence host object", - comparray[index++], compobj); + Assert.AreEqual (comparray[index++], compobj, "Comparison object does not equal evidence host object"); + } } @@ -144,7 +146,7 @@ namespace MonoTests.System.Security.Policy { int i = 0; foreach (object obj in evidence) { - AssertEquals (obj, compare[i++]); + Assert.AreEqual (obj, compare[i++]); } } @@ -161,13 +163,13 @@ namespace MonoTests.System.Security.Policy { int i = 0; IEnumerator enumerator = evidence.GetEnumerator (); while (enumerator.MoveNext ()) { - AssertEquals (enumerator.Current, compare[i++]); + Assert.AreEqual (enumerator.Current, compare[i++]); } enumerator.Reset (); i = 0; while (enumerator.MoveNext ()) { - AssertEquals (enumerator.Current, compare[i++]); + Assert.AreEqual (enumerator.Current, compare[i++]); } } @@ -180,7 +182,7 @@ namespace MonoTests.System.Security.Policy { IEnumerator enumerator = evidence.GetHostEnumerator (); int i = 0; while (enumerator.MoveNext ()) { - AssertEquals (enumerator.Current, hostarray[i++]); + Assert.AreEqual (enumerator.Current, hostarray[i++]); } } @@ -198,7 +200,7 @@ namespace MonoTests.System.Security.Policy { i = 0; while (enumerator.MoveNext()) { - AssertEquals (enumerator.Current, asmbarray[i++]); + Assert.AreEqual (enumerator.Current, asmbarray[i++]); } } @@ -208,7 +210,7 @@ namespace MonoTests.System.Security.Policy { object[] hostarray = { "host-1", "host-2", "host-3", "host-4" }; object[] asmbarray = { "asmb-1", "asmb-2", "asmb-3", "asmb-4" }; Evidence evidence = new Evidence (hostarray, asmbarray); - Assertion.AssertEquals (evidence.Count, 8); + Assert.AreEqual (evidence.Count, 8); for( int i=0; i<100; i++ ) { if ( 0 == i%2 ) { @@ -216,7 +218,7 @@ namespace MonoTests.System.Security.Policy { } else { evidence.AddAssembly (String.Format ("asmb-{0}", i + 5)); } - AssertEquals (evidence.Count, 9 + i); + Assert.AreEqual (evidence.Count, 9 + i); } } @@ -263,7 +265,7 @@ namespace MonoTests.System.Security.Policy { Evidence evidence = new Evidence (null, null); Evidence evidence2 = new Evidence (); evidence2.Merge (evidence); - AssertEquals ("Count", evidence.Count, evidence2.Count); + Assert.AreEqual (evidence.Count, evidence2.Count, "Count"); } [Test] @@ -272,7 +274,7 @@ namespace MonoTests.System.Security.Policy { Evidence evidence = new Evidence (new object[10], new object[10]); Evidence evidence2 = new Evidence (); evidence2.Merge (evidence); - AssertEquals ("Count", evidence.Count, evidence2.Count); + Assert.AreEqual (evidence.Count, evidence2.Count, "Count"); } [Test] @@ -281,23 +283,23 @@ namespace MonoTests.System.Security.Policy { Evidence evidence = new Evidence (); evidence.Merge (null); // no exception! - AssertEquals ("Count", 0, evidence.Count); + Assert.AreEqual (0, evidence.Count, "Count"); } [Test] public void DefaultProperties () { Evidence e = new Evidence (); - AssertEquals ("Count", 0, e.Count); - Assert ("IsReadOnly", !e.IsReadOnly); + Assert.AreEqual (0, e.Count, "Count"); + Assert.IsTrue (!e.IsReadOnly, "IsReadOnly"); #if NET_2_0 - Assert ("IsSynchronized", !e.IsSynchronized); + Assert.IsTrue (!e.IsSynchronized, "IsSynchronized"); #else // LAMESPEC: Always TRUE (not FALSE) - Assert ("IsSynchronized", e.IsSynchronized); + Assert.IsTrue (e.IsSynchronized, "IsSynchronized"); #endif - Assert ("Locked", !e.Locked); - AssertNotNull ("SyncRoot", e.SyncRoot); + Assert.IsTrue (!e.Locked, "Locked"); + Assert.IsNotNull (e.SyncRoot, "SyncRoot"); } #if NET_2_0 @@ -306,28 +308,28 @@ namespace MonoTests.System.Security.Policy { { Evidence e1 = new Evidence (); Evidence e2 = new Evidence (); - AssertEquals ("GetHashCode-1", e1.GetHashCode (), e2.GetHashCode ()); - Assert ("e1.Equals(e2)", e1.Equals (e2)); + Assert.AreEqual (e1.GetHashCode (), e2.GetHashCode (), "GetHashCode-1"); + Assert.IsTrue (e1.Equals (e2), "e1.Equals(e2)"); e1.AddAssembly (String.Empty); e2.AddAssembly (String.Empty); - AssertEquals ("GetHashCode-2", e1.GetHashCode (), e2.GetHashCode ()); + Assert.AreEqual (e1.GetHashCode (), e2.GetHashCode (), "GetHashCode-2"); e1.AddHost (String.Empty); e2.AddHost (String.Empty); - AssertEquals ("GetHashCode-3", e1.GetHashCode (), e2.GetHashCode ()); - Assert ("e2.Equals(e1)", e2.Equals (e1)); + Assert.AreEqual (e1.GetHashCode (), e2.GetHashCode (), "GetHashCode-3"); + Assert.IsTrue (e2.Equals (e1), "e2.Equals(e1)"); } [Test] public void Clear () { Evidence e = new Evidence (); - AssertEquals ("Count-Empty", 0, e.Count); + Assert.AreEqual (0, e.Count, "Count-Empty"); e.AddAssembly (new object ()); - AssertEquals ("Count+Assembly", 1, e.Count); + Assert.AreEqual (1, e.Count, "Count+Assembly"); e.AddHost (new object ()); - AssertEquals ("Count+Host", 2, e.Count); + Assert.AreEqual (2, e.Count, "Count+Host"); e.Clear (); - AssertEquals ("Count-Cleared", 0, e.Count); + Assert.AreEqual (0, e.Count, "Count-Cleared"); } [Category ("NotWorking")] @@ -335,12 +337,12 @@ namespace MonoTests.System.Security.Policy { public void RemoveType () { Evidence e = new Evidence (); - AssertEquals ("Count-Empty", 0, e.Count); + Assert.AreEqual (0, e.Count, "Count-Empty"); e.AddAssembly (new object ()); e.AddHost (new object ()); - AssertEquals ("Count", 2, e.Count); + Assert.AreEqual (2, e.Count, "Count"); e.RemoveType (typeof (object)); - AssertEquals ("Count-RemoveType(object)", 0, e.Count); + Assert.AreEqual (0, e.Count, "Count-RemoveType(object)"); } #else [Test] @@ -348,33 +350,33 @@ namespace MonoTests.System.Security.Policy { { Evidence e1 = new Evidence (); Evidence e2 = new Evidence (); - Assert ("GetHashCode", e1.GetHashCode () != e2.GetHashCode ()); - Assert ("!e1.Equals(e2)", !e1.Equals (e2)); - Assert ("!e2.Equals(e1)", !e2.Equals (e1)); + Assert.IsTrue (e1.GetHashCode () != e2.GetHashCode (), "GetHashCode"); + Assert.IsTrue (!e1.Equals (e2), "!e1.Equals(e2)"); + Assert.IsTrue (!e2.Equals (e1), "!e2.Equals(e1)"); + } +#endif + [Test] + public void AppDomain_NoPermissionRequestEvidence () + { + // PermissionRequestEvidence is only used druing policy resolution + // and can't be accessed using the Evidence property + Evidence e = AppDomain.CurrentDomain.Evidence; + foreach (object o in e) { + if (o is PermissionRequestEvidence) + Assert.Fail ("Found PermissionRequestEvidence in AppDomain.CurrentDomain.Evidence"); + } + } + + [Test] + public void Assembly_NoPermissionRequestEvidence () + { + // PermissionRequestEvidence is only used druing policy resolution + // and can't be accessed using the Evidence property + Evidence e = Assembly.GetExecutingAssembly ().Evidence; + foreach (object o in e) { + if (o is PermissionRequestEvidence) + Assert.Fail ("Found PermissionRequestEvidence in Assembly.GetExecutingAssembly.Evidence"); + } } -#endif - [Test] - public void AppDomain_NoPermissionRequestEvidence () - { - // PermissionRequestEvidence is only used druing policy resolution - // and can't be accessed using the Evidence property - Evidence e = AppDomain.CurrentDomain.Evidence; - foreach (object o in e) { - if (o is PermissionRequestEvidence) - Fail ("Found PermissionRequestEvidence in AppDomain.CurrentDomain.Evidence"); - } - } - - [Test] - public void Assembly_NoPermissionRequestEvidence () - { - // PermissionRequestEvidence is only used druing policy resolution - // and can't be accessed using the Evidence property - Evidence e = Assembly.GetExecutingAssembly ().Evidence; - foreach (object o in e) { - if (o is PermissionRequestEvidence) - Fail ("Found PermissionRequestEvidence in Assembly.GetExecutingAssembly.Evidence"); - } - } } } diff --git a/mcs/class/corlib/Test/System.Security.Policy/FirstMatchCodeGroupTest.cs b/mcs/class/corlib/Test/System.Security.Policy/FirstMatchCodeGroupTest.cs index a0e848a458b..8c899d9d7c1 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/FirstMatchCodeGroupTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/FirstMatchCodeGroupTest.cs @@ -17,7 +17,7 @@ using System.Security.Permissions; namespace MonoTests.System.Security.Policy { [TestFixture] - public class FirstMatchCodeGroupTest : Assertion { + public class FirstMatchCodeGroupTest { [Test] [ExpectedException (typeof (ArgumentNullException))] @@ -31,22 +31,22 @@ namespace MonoTests.System.Security.Policy { { // legal FirstMatchCodeGroup cg = new FirstMatchCodeGroup (new AllMembershipCondition (), null); - AssertNull ("PolicyStatement", cg.PolicyStatement); + Assert.IsNull (cg.PolicyStatement, "PolicyStatement"); } [Test] public void Constructor () { FirstMatchCodeGroup cg = new FirstMatchCodeGroup (new AllMembershipCondition (), new PolicyStatement (new PermissionSet (PermissionState.None))); - AssertNotNull ("PolicyStatement", cg.PolicyStatement); - AssertNotNull ("MembershipCondition", cg.MembershipCondition); + Assert.IsNotNull (cg.PolicyStatement, "PolicyStatement"); + Assert.IsNotNull (cg.MembershipCondition, "MembershipCondition"); } [Test] public void MergeLogic () { FirstMatchCodeGroup cg = new FirstMatchCodeGroup (new AllMembershipCondition (), new PolicyStatement (new PermissionSet (PermissionState.None))); - AssertEquals ("MergeLogic", "First Match", cg.MergeLogic); + Assert.AreEqual ("First Match", cg.MergeLogic, "MergeLogic"); } [Test] @@ -54,13 +54,13 @@ namespace MonoTests.System.Security.Policy { { FirstMatchCodeGroup cg = new FirstMatchCodeGroup (new AllMembershipCondition (), new PolicyStatement (new PermissionSet (PermissionState.None))); FirstMatchCodeGroup cg2 = (FirstMatchCodeGroup) cg.Copy (); - AssertEquals ("AttributeString", cg.AttributeString, cg2.AttributeString); - AssertEquals ("Children", cg.Children.Count, cg2.Children.Count); - AssertEquals ("Description", cg.Description, cg2.Description); - AssertEquals ("MergeLogic", cg.MergeLogic, cg2.MergeLogic); - AssertEquals ("Name", cg.Name, cg2.Name); - AssertEquals ("PermissionSetName", cg.PermissionSetName, cg2.PermissionSetName); - AssertEquals ("ToXml", cg.ToXml ().ToString (), cg2.ToXml ().ToString ()); + Assert.AreEqual (cg.AttributeString, cg2.AttributeString, "AttributeString"); + Assert.AreEqual (cg.Children.Count, cg2.Children.Count, "Children"); + Assert.AreEqual (cg.Description, cg2.Description, "Description"); + Assert.AreEqual (cg.MergeLogic, cg2.MergeLogic, "MergeLogic"); + Assert.AreEqual (cg.Name, cg2.Name, "Name"); + Assert.AreEqual (cg.PermissionSetName, cg2.PermissionSetName, "PermissionSetName"); + Assert.AreEqual (cg.ToXml ().ToString (), cg2.ToXml ().ToString (), "ToXml"); } [Test] @@ -70,8 +70,8 @@ namespace MonoTests.System.Security.Policy { FirstMatchCodeGroup cg = new FirstMatchCodeGroup (new AllMembershipCondition (), new PolicyStatement (new PermissionSet (PermissionState.None))); cg.AddChild (cgChild); FirstMatchCodeGroup cg2 = (FirstMatchCodeGroup) cg.Copy (); - AssertEquals ("Children", cg.Children.Count, cg2.Children.Count); - AssertEquals ("ToXml", cg.ToXml ().ToString (), cg2.ToXml ().ToString ()); + Assert.AreEqual (cg.Children.Count, cg2.Children.Count, "Children"); + Assert.AreEqual (cg.ToXml ().ToString (), cg2.ToXml ().ToString (), "ToXml"); } [Test] @@ -98,16 +98,16 @@ namespace MonoTests.System.Security.Policy { FirstMatchCodeGroup cg = new FirstMatchCodeGroup (new AllMembershipCondition (), ps); cg.Name = "SomeName"; cg.Description = "Some Description"; - Assert ("Equals (itself)", cg.Equals (cg)); + Assert.IsTrue (cg.Equals (cg), "Equals (itself)"); SecurityElement se = cg.ToXml (); FirstMatchCodeGroup cg2 = new FirstMatchCodeGroup (new AllMembershipCondition(), ps); cg2.Name = "SomeOtherName"; cg2.Description = "Some Other Description"; - Assert ("Equals (another)", !cg.Equals (cg2)); + Assert.IsTrue (!cg.Equals (cg2), "Equals (another)"); cg2.FromXml (se); - Assert ("Equals (FromXml)", cg.Equals (cg2)); + Assert.IsTrue (cg.Equals (cg2), "Equals (FromXml)"); } } } diff --git a/mcs/class/corlib/Test/System.Security.Policy/GacMembershipConditionTest.cs b/mcs/class/corlib/Test/System.Security.Policy/GacMembershipConditionTest.cs index 1ff736f1b70..23c4572172f 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/GacMembershipConditionTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/GacMembershipConditionTest.cs @@ -54,7 +54,7 @@ namespace MonoTests.System.Security.Policy { e = new Evidence (); Assert.IsFalse (gac.Check (e), "Check (empty)"); e.AddHost (new Zone (SecurityZone.MyComputer)); - Assert.IsFalse (gac.Check (e), "Check (zone)"); + Assert.IsFalse (gac.Check (e), "Check (zone)"); GacInstalled g = new GacInstalled (); e.AddAssembly (g); Assert.IsFalse (gac.Check (e), "Check (gac-assembly)"); diff --git a/mcs/class/corlib/Test/System.Security.Policy/GacTest.cs b/mcs/class/corlib/Test/System.Security.Policy/GacTest.cs index 440240f3d6c..b0a28441a88 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/GacTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/GacTest.cs @@ -1,4 +1,4 @@ -// +// // GacInstalledTest.cs - NUnit Test Cases for GacInstalled // // Author: @@ -36,20 +36,20 @@ using System.Security.Permissions; namespace MonoTests.System.Security.Policy { - [TestFixture] + [TestFixture] public class GacInstalledTest { [Test] public void Constructor () - { + { GacInstalled gac = new GacInstalled (); Assert.IsNotNull (gac); } [Test] public void Copy () - { - GacInstalled gac = new GacInstalled (); + { + GacInstalled gac = new GacInstalled (); GacInstalled copy = (GacInstalled)gac.Copy (); Assert.AreEqual (gac, copy, "Equals"); Assert.IsFalse (Object.ReferenceEquals (gac, copy), "ReferenceEquals"); @@ -57,7 +57,7 @@ namespace MonoTests.System.Security.Policy { [Test] public void CreateIdentityPermission () - { + { GacInstalled gac = new GacInstalled (); IPermission p = gac.CreateIdentityPermission (null); Assert.IsTrue ((p is GacIdentityPermission), "GacIdentityPermission"); @@ -68,9 +68,9 @@ namespace MonoTests.System.Security.Policy { [Test] public void Equals () - { + { GacInstalled gac = new GacInstalled (); - Assert.IsFalse (gac.Equals (null), "Equals(null)"); + Assert.IsFalse (gac.Equals (null), "Equals(null)"); GacInstalled g2 = new GacInstalled (); Assert.IsTrue (gac.Equals (g2), "Equals(g2)"); Assert.IsTrue (g2.Equals (gac), "Equals(gac)"); @@ -78,14 +78,14 @@ namespace MonoTests.System.Security.Policy { [Test] public void GetHashCode_ () - { + { GacInstalled gac = new GacInstalled (); Assert.AreEqual (0, gac.GetHashCode ()); } [Test] public void ToString_ () - { + { GacInstalled gac = new GacInstalled (); Assert.IsTrue (gac.ToString ().StartsWith ("")); } diff --git a/mcs/class/corlib/Test/System.Security.Policy/IBuiltInEvidenceTest.cs b/mcs/class/corlib/Test/System.Security.Policy/IBuiltInEvidenceTest.cs index c7b66bc9abe..cba3abfd532 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/IBuiltInEvidenceTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/IBuiltInEvidenceTest.cs @@ -102,50 +102,50 @@ namespace MonoTests.System.Security.Policy { Assert.AreEqual (19, GetRequiredSize (ad, false), "GetRequiredSize-false-2"); } #if NET_2_0 - [Test] + [Test] public void GacInstalled_GetRequiredSize () - { + { GacInstalled g = new GacInstalled (); Assert.AreEqual (1, GetRequiredSize (g, true), "GetRequiredSize-true"); Assert.AreEqual (1, GetRequiredSize (g, false), "GetRequiredSize-false"); } - [Test] + [Test] public void GacInstalled_InitFromBuffer () { - char[] buffer = new char [2] { '\t', '\t' }; + char[] buffer = new char [2] { '\t', '\t' }; GacInstalled g = new GacInstalled (); Assert.AreEqual (0, InitFromBuffer (g, buffer, 0), "InitFromBuffer-1"); Assert.AreEqual (1, InitFromBuffer (g, buffer, 1), "InitFromBuffer-2"); } - [Test] + [Test] public void GacInstalled_InitFromBuffer_BadData () { - char [] buffer = new char [1] { '\r' }; + char [] buffer = new char [1] { '\r' }; GacInstalled g = new GacInstalled (); Assert.AreEqual (0, InitFromBuffer (g, buffer, 0), "InitFromBuffer"); } [Test] public void GacInstalled_InitFromBuffer_Null () - { + { GacInstalled g = new GacInstalled (); Assert.AreEqual (0, InitFromBuffer (g, null, 0), "InitFromBuffer"); } - [Test] + [Test] public void GacInstalled_InitFromBuffer_OutOfRange () { - char [] buffer = new char [1] { '\t' }; + char [] buffer = new char [1] { '\t' }; GacInstalled g = new GacInstalled (); Assert.AreEqual (4, InitFromBuffer (g, buffer, 4), "InitFromBuffer"); } - [Test] + [Test] public void GacInstalled_OutputToBuffer () { - char[] buffer = new char [2]; + char[] buffer = new char [2]; GacInstalled g = new GacInstalled (); Assert.AreEqual (1, OutputToBuffer (g, buffer, 0, false), "OutputToBuffer-false"); Assert.AreEqual ('\t', buffer [0], "Buffer-false"); @@ -154,18 +154,18 @@ namespace MonoTests.System.Security.Policy { } [Test] - [ExpectedException (typeof (NullReferenceException))] + [ExpectedException (typeof (NullReferenceException))] public void GacInstalled_OutputToBuffer_Null () - { + { GacInstalled g = new GacInstalled (); OutputToBuffer (g, null, 0, false); } [Test] - [ExpectedException (typeof (IndexOutOfRangeException))] + [ExpectedException (typeof (IndexOutOfRangeException))] public void GacInstalled_OutputToBuffer_OutOfRange () { - char[] buffer = new char [1] { '\t' }; + char[] buffer = new char [1] { '\t' }; GacInstalled g = new GacInstalled (); OutputToBuffer (g, buffer, 1, false); } diff --git a/mcs/class/corlib/Test/System.Security.Policy/NetCodeGroupTest.cs b/mcs/class/corlib/Test/System.Security.Policy/NetCodeGroupTest.cs index 856e000d4e1..438982b1500 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/NetCodeGroupTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/NetCodeGroupTest.cs @@ -37,7 +37,7 @@ using System.Security.Permissions; namespace MonoTests.System.Security.Policy { [TestFixture] - public class NetCodeGroupTest : Assertion { + public class NetCodeGroupTest { [Test] [ExpectedException (typeof (ArgumentNullException))] @@ -50,16 +50,16 @@ namespace MonoTests.System.Security.Policy { public void Constructor () { NetCodeGroup cg = new NetCodeGroup (new AllMembershipCondition ()); - AssertNotNull ("MembershipCondition", cg.MembershipCondition); - AssertNull ("PolicyStatement", cg.PolicyStatement); + Assert.IsNotNull (cg.MembershipCondition, "MembershipCondition"); + Assert.IsNull (cg.PolicyStatement, "PolicyStatement"); // documented as always null - AssertNull ("AttributeString", cg.AttributeString); + Assert.IsNull (cg.AttributeString, "AttributeString"); #if NET_2_0 // seems it's easier to change code than to change code ;) - AssertEquals ("PermissionSetName", "Same site Web", cg.PermissionSetName); + Assert.AreEqual ("Same site Web", cg.PermissionSetName, "PermissionSetName"); #else // documented as always "Same site Web" but it's "Same site Web." (missing .) - AssertEquals ("PermissionSetName", "Same site Web.", cg.PermissionSetName); + Assert.AreEqual ("Same site Web.", cg.PermissionSetName, "PermissionSetName"); #endif } @@ -67,7 +67,7 @@ namespace MonoTests.System.Security.Policy { public void MergeLogic () { NetCodeGroup cg = new NetCodeGroup (new AllMembershipCondition ()); - AssertEquals ("MergeLogic", "Union", cg.MergeLogic); + Assert.AreEqual ("Union", cg.MergeLogic, "MergeLogic"); } [Test] @@ -75,13 +75,13 @@ namespace MonoTests.System.Security.Policy { { NetCodeGroup cg = new NetCodeGroup (new AllMembershipCondition ()); NetCodeGroup cg2 = (NetCodeGroup) cg.Copy (); - AssertEquals ("AttributeString", cg.AttributeString, cg2.AttributeString); - AssertEquals ("Children", cg.Children.Count, cg2.Children.Count); - AssertEquals ("Description", cg.Description, cg2.Description); - AssertEquals ("MergeLogic", cg.MergeLogic, cg2.MergeLogic); - AssertEquals ("Name", cg.Name, cg2.Name); - AssertEquals ("PermissionSetName", cg.PermissionSetName, cg2.PermissionSetName); - AssertEquals ("ToXml", cg.ToXml ().ToString (), cg2.ToXml ().ToString ()); + Assert.AreEqual (cg.AttributeString, cg2.AttributeString, "AttributeString"); + Assert.AreEqual (cg.Children.Count, cg2.Children.Count, "Children"); + Assert.AreEqual (cg.Description, cg2.Description, "Description"); + Assert.AreEqual (cg.MergeLogic, cg2.MergeLogic, "MergeLogic"); + Assert.AreEqual (cg.Name, cg2.Name, "Name"); + Assert.AreEqual (cg.PermissionSetName, cg2.PermissionSetName, "PermissionSetName"); + Assert.AreEqual (cg.ToXml ().ToString (), cg2.ToXml ().ToString (), "ToXml"); } [Test] @@ -91,8 +91,8 @@ namespace MonoTests.System.Security.Policy { NetCodeGroup cg = new NetCodeGroup (new AllMembershipCondition ()); cg.AddChild (cgChild); NetCodeGroup cg2 = (NetCodeGroup) cg.Copy (); - AssertEquals ("Children", cg.Children.Count, cg2.Children.Count); - AssertEquals ("ToXml", cg.ToXml ().ToString (), cg2.ToXml ().ToString ()); + Assert.AreEqual (cg.Children.Count, cg2.Children.Count, "Children"); + Assert.AreEqual (cg.ToXml ().ToString (), cg2.ToXml ().ToString (), "ToXml"); } [Test] @@ -117,16 +117,16 @@ namespace MonoTests.System.Security.Policy { NetCodeGroup cg = new NetCodeGroup (new AllMembershipCondition ()); cg.Name = "SomeName"; cg.Description = "Some Description"; - Assert ("Equals (itself)", cg.Equals (cg)); + Assert.IsTrue (cg.Equals (cg), "Equals (itself)"); SecurityElement se = cg.ToXml (); NetCodeGroup cg2 = new NetCodeGroup (new AllMembershipCondition()); cg2.Name = "SomeOtherName"; cg2.Description = "Some Other Description"; - Assert ("Equals (another)", !cg.Equals (cg2)); + Assert.IsTrue (!cg.Equals (cg2), "Equals (another)"); cg2.FromXml (se); - Assert ("Equals (FromXml)", cg.Equals (cg2)); + Assert.IsTrue (cg.Equals (cg2), "Equals (FromXml)"); } } } diff --git a/mcs/class/corlib/Test/System.Security.Policy/PolicyLevelTest.cs b/mcs/class/corlib/Test/System.Security.Policy/PolicyLevelTest.cs index b0ac017ca15..b763eef29fd 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/PolicyLevelTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/PolicyLevelTest.cs @@ -144,10 +144,10 @@ namespace MonoTests.System.Security.Policy { } [Test] - [ExpectedException (typeof (ArgumentException))] + [ExpectedException (typeof (ArgumentException))] #if ! NET_2_0 [Category ("NotDotNet")] // System.ExecutionEngineException on MS runtime (1.1) -#endif +#endif public void AddNamedPermissionSet_Duplicate () { PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); @@ -158,10 +158,10 @@ namespace MonoTests.System.Security.Policy { pl.AddNamedPermissionSet (nps2); } - [Test] + [Test] #if ! NET_2_0 [Category ("NotDotNet")] // System.ExecutionEngineException on MS runtime (1.1) -#endif +#endif public void ChangeNamedPermissionSet () { PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); @@ -315,10 +315,10 @@ namespace MonoTests.System.Security.Policy { // it's enough >:) } - [Test] + [Test] #if ! NET_2_0 [Category ("NotDotNet")] // System.ExecutionEngineException on MS runtime (1.1) -#endif +#endif public void GetNamedPermissionSet () { PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); @@ -353,40 +353,40 @@ namespace MonoTests.System.Security.Policy { // static method pl = PolicyLevel.CreateAppDomainLevel (); Assert.AreEqual ("AppDomain", pl.Label, "Label.AppDomain"); - } - - [Test] - [ExpectedException (typeof (PolicyException))] - public void Recover_LoadPolicyLevelFromFile () - { - string temp = Path.GetTempFileName (); - using (FileStream fs = File.OpenWrite (temp)) { - // that way we're sure that no back exists - byte[] data = Encoding.UTF8.GetBytes (minimal); - fs.Write (data, 0, data.Length); - fs.Close (); - } - PolicyLevel pl = SecurityManager.LoadPolicyLevelFromFile (temp, PolicyLevelType.User); - pl.Recover (); - // can't recover if no backup exists - } - - [Test] - [ExpectedException (typeof (PolicyException))] + } + + [Test] + [ExpectedException (typeof (PolicyException))] + public void Recover_LoadPolicyLevelFromFile () + { + string temp = Path.GetTempFileName (); + using (FileStream fs = File.OpenWrite (temp)) { + // that way we're sure that no back exists + byte[] data = Encoding.UTF8.GetBytes (minimal); + fs.Write (data, 0, data.Length); + fs.Close (); + } + PolicyLevel pl = SecurityManager.LoadPolicyLevelFromFile (temp, PolicyLevelType.User); + pl.Recover (); + // can't recover if no backup exists + } + + [Test] + [ExpectedException (typeof (PolicyException))] public void Recover_LoadPolicyLevelFromString () - { - PolicyLevel pl = SecurityManager.LoadPolicyLevelFromString (minimal, PolicyLevelType.Enterprise); - pl.Recover (); - // can't recover as it's not file based - } - - [Test] - [ExpectedException (typeof (PolicyException))] - public void Recover_AppDomainLevel () - { - PolicyLevel pl = PolicyLevel.CreateAppDomainLevel (); - pl.Recover (); - // can't recover as it's not file based + { + PolicyLevel pl = SecurityManager.LoadPolicyLevelFromString (minimal, PolicyLevelType.Enterprise); + pl.Recover (); + // can't recover as it's not file based + } + + [Test] + [ExpectedException (typeof (PolicyException))] + public void Recover_AppDomainLevel () + { + PolicyLevel pl = PolicyLevel.CreateAppDomainLevel (); + pl.Recover (); + // can't recover as it's not file based } [Test] @@ -445,10 +445,10 @@ namespace MonoTests.System.Security.Policy { pl.RemoveFullTrustAssembly (snmc); } - [Test] + [Test] #if ! NET_2_0 [Category ("NotDotNet")] // System.ExecutionEngineException on MS runtime (1.1) -#endif +#endif public void RemoveNamedPermissionSet () { PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); @@ -477,10 +477,10 @@ namespace MonoTests.System.Security.Policy { pl.RemoveNamedPermissionSet (nps); } - [Test] + [Test] #if ! NET_2_0 [Category ("NotDotNet")] // System.ExecutionEngineException on MS runtime (1.1) -#endif +#endif public void RemoveNamedPermissionSet_String () { PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); @@ -506,63 +506,63 @@ namespace MonoTests.System.Security.Policy { { PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); pl.RemoveNamedPermissionSet ("Mono"); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void RemoveNamedPermissionSet_FullTrust_ReservedName () - { - PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); - pl.RemoveNamedPermissionSet ("FullTrust"); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void RemoveNamedPermissionSet_LocalIntranet_ReservedName () - { - PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); - pl.RemoveNamedPermissionSet ("LocalIntranet"); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void RemoveNamedPermissionSet_Internet_ReservedName () - { - PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); - pl.RemoveNamedPermissionSet ("Internet"); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void RemoveNamedPermissionSet_SkipVerification_ReservedName () - { - PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); - pl.RemoveNamedPermissionSet ("SkipVerification"); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void RemoveNamedPermissionSet_Execution_ReservedName () - { - PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); - pl.RemoveNamedPermissionSet ("Execution"); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void RemoveNamedPermissionSet_Nothing_ReservedName () - { - PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); - pl.RemoveNamedPermissionSet ("Nothing"); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void RemoveNamedPermissionSet_Everything_ReservedName () - { - PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); - pl.RemoveNamedPermissionSet ("Everything"); - } + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void RemoveNamedPermissionSet_FullTrust_ReservedName () + { + PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); + pl.RemoveNamedPermissionSet ("FullTrust"); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void RemoveNamedPermissionSet_LocalIntranet_ReservedName () + { + PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); + pl.RemoveNamedPermissionSet ("LocalIntranet"); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void RemoveNamedPermissionSet_Internet_ReservedName () + { + PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); + pl.RemoveNamedPermissionSet ("Internet"); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void RemoveNamedPermissionSet_SkipVerification_ReservedName () + { + PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); + pl.RemoveNamedPermissionSet ("SkipVerification"); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void RemoveNamedPermissionSet_Execution_ReservedName () + { + PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); + pl.RemoveNamedPermissionSet ("Execution"); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void RemoveNamedPermissionSet_Nothing_ReservedName () + { + PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); + pl.RemoveNamedPermissionSet ("Nothing"); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void RemoveNamedPermissionSet_Everything_ReservedName () + { + PolicyLevel pl = Load (minimal, PolicyLevelType.Machine); + pl.RemoveNamedPermissionSet ("Everything"); + } [Test] public void Reset () diff --git a/mcs/class/corlib/Test/System.Security.Policy/SiteTest.cs b/mcs/class/corlib/Test/System.Security.Policy/SiteTest.cs index 58fd3c2ff36..18e589e7b65 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/SiteTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/SiteTest.cs @@ -37,7 +37,7 @@ using System.Security.Policy; namespace MonoTests.System.Security.Policy { [TestFixture] - public class SiteTest : Assertion { + public class SiteTest { [Test] [ExpectedException (typeof (ArgumentNullException))] @@ -78,44 +78,44 @@ namespace MonoTests.System.Security.Policy { public void Site_GoMonoWebSite () { Site s = new Site ("www.go-mono.com"); - AssertEquals ("Name", "www.go-mono.com", s.Name); + Assert.AreEqual ("www.go-mono.com", s.Name, "Name"); #if NET_2_0 - AssertEquals ("ToString", "" + Environment.NewLine + "www.go-mono.com" + Environment.NewLine + "" + Environment.NewLine, s.ToString ()); + Assert.AreEqual ("" + Environment.NewLine + "www.go-mono.com" + Environment.NewLine + "" + Environment.NewLine, s.ToString (), "ToString"); #else - AssertEquals ("ToString", "" + Environment.NewLine + " www.go-mono.com" + Environment.NewLine + "" + Environment.NewLine, s.ToString ()); + Assert.AreEqual ("" + Environment.NewLine + " www.go-mono.com" + Environment.NewLine + "" + Environment.NewLine, s.ToString (), "ToString"); #endif Site s2 = (Site) s.Copy (); - AssertEquals ("Copy.Name", s.Name, s2.Name); - AssertEquals ("Copy.GetHashCode", s.GetHashCode (), s2.GetHashCode ()); + Assert.AreEqual (s.Name, s2.Name, "Copy.Name"); + Assert.AreEqual (s.GetHashCode (), s2.GetHashCode (), "Copy.GetHashCode"); SiteIdentityPermission sip = (SiteIdentityPermission) s.CreateIdentityPermission (null); - AssertEquals ("CreateIdentityPermission", s.Name, sip.Site); + Assert.AreEqual (s.Name, sip.Site, "CreateIdentityPermission"); - Assert ("Equals", s.Equals (s2)); + Assert.IsTrue (s.Equals (s2), "Equals"); Site s3 = new Site ("go-mono.com"); - Assert ("!Equals", !s.Equals (s3)); + Assert.IsTrue (!s.Equals (s3), "!Equals"); } [Test] public void Site_AllGoMonoSite () { Site s = new Site ("*.go-mono.com"); - AssertEquals ("Name", "*.go-mono.com", s.Name); + Assert.AreEqual ("*.go-mono.com", s.Name, "Name"); #if NET_2_0 - AssertEquals ("ToString", "" + Environment.NewLine + "*.go-mono.com" + Environment.NewLine + "" + Environment.NewLine, s.ToString ()); + Assert.AreEqual ("" + Environment.NewLine + "*.go-mono.com" + Environment.NewLine + "" + Environment.NewLine, s.ToString (), "ToString"); #else - AssertEquals ("ToString", "" + Environment.NewLine + " *.go-mono.com" + Environment.NewLine + "" + Environment.NewLine, s.ToString ()); + Assert.AreEqual ("" + Environment.NewLine + " *.go-mono.com" + Environment.NewLine + "" + Environment.NewLine, s.ToString (), "ToString"); #endif Site s2 = (Site) s.Copy (); - AssertEquals ("Copy.Name", s.Name, s2.Name); - AssertEquals ("Copy.GetHashCode", s.GetHashCode (), s2.GetHashCode ()); + Assert.AreEqual (s.Name, s2.Name, "Copy.Name"); + Assert.AreEqual (s.GetHashCode (), s2.GetHashCode (), "Copy.GetHashCode"); SiteIdentityPermission sip = (SiteIdentityPermission) s.CreateIdentityPermission (null); - AssertEquals ("CreateIdentityPermission", s.Name, sip.Site); + Assert.AreEqual (s.Name, sip.Site, "CreateIdentityPermission"); - Assert ("Equals", s.Equals (s2)); + Assert.IsTrue (s.Equals (s2), "Equals"); Site s3 = new Site ("go-mono.com"); - Assert ("!Equals", !s.Equals (s3)); + Assert.IsTrue (!s.Equals (s3), "!Equals"); } [Test] @@ -136,7 +136,7 @@ namespace MonoTests.System.Security.Policy { public void EqualsCaseSensitive () { Site s1 = new Site ("*.go-mono.com"); Site s2 = new Site ("*.Go-Mono.com"); - Assert ("CaseSensitive", s1.Equals (s2)); + Assert.IsTrue (s1.Equals (s2), "CaseSensitive"); } [Test] @@ -144,37 +144,37 @@ namespace MonoTests.System.Security.Policy { { Site s1 = new Site ("www.go-mono.com"); Site s2 = new Site ("*.go-mono.com"); - Assert ("Partial:1-2", !s1.Equals (s2)); - Assert ("Partial:2-1", !s2.Equals (s1)); + Assert.IsTrue (!s1.Equals (s2), "Partial:1-2"); + Assert.IsTrue (!s2.Equals (s1), "Partial:2-1"); } [Test] public void EqualsNull () { Site s1 = new Site ("*.go-mono.com"); - Assert ("EqualsNull", !s1.Equals (null)); + Assert.IsTrue (!s1.Equals (null), "EqualsNull"); } [Test] public void Site_LoneStar () { Site s = new Site ("*"); - AssertEquals ("Name", "*", s.Name); + Assert.AreEqual ("*", s.Name, "Name"); #if NET_2_0 - AssertEquals ("ToString", "" + Environment.NewLine + "*" + Environment.NewLine + "" + Environment.NewLine, s.ToString ()); + Assert.AreEqual ("" + Environment.NewLine + "*" + Environment.NewLine + "" + Environment.NewLine, s.ToString (), "ToString"); #else - AssertEquals ("ToString", "" + Environment.NewLine + " *" + Environment.NewLine + "" + Environment.NewLine, s.ToString ()); + Assert.AreEqual ("" + Environment.NewLine + " *" + Environment.NewLine + "" + Environment.NewLine, s.ToString (), "ToString"); #endif Site s2 = (Site) s.Copy (); - AssertEquals ("Copy.Name", s.Name, s2.Name); - AssertEquals ("Copy.GetHashCode", s.GetHashCode (), s2.GetHashCode ()); + Assert.AreEqual (s.Name, s2.Name, "Copy.Name"); + Assert.AreEqual (s.GetHashCode (), s2.GetHashCode (), "Copy.GetHashCode"); SiteIdentityPermission sip = (SiteIdentityPermission) s.CreateIdentityPermission (null); - AssertEquals ("CreateIdentityPermission", s.Name, sip.Site); + Assert.AreEqual (s.Name, sip.Site, "CreateIdentityPermission"); - Assert ("Equals", s.Equals (s2)); + Assert.IsTrue (s.Equals (s2), "Equals"); Site s3 = new Site ("go-mono.com"); - Assert ("!Equals", !s.Equals (s3)); + Assert.IsTrue (!s.Equals (s3), "!Equals"); } [Test] @@ -206,7 +206,7 @@ namespace MonoTests.System.Security.Policy { || (i >= 97 && i <= 122) // a-z #endif || (i >= 64 && i <= 90)); // @,A-Z - Assert ("#"+i, (actual == result)); + Assert.IsTrue ((actual == result), "#"+i); } } @@ -238,7 +238,7 @@ namespace MonoTests.System.Security.Policy { { foreach (string url in valid_urls) { Site s = Site.CreateFromUrl (url); - Assert (s.Name, (s.Name.ToUpper (CultureInfo.InvariantCulture).IndexOf ("MONO") != -1)); + Assert.IsTrue ((s.Name.ToUpper (CultureInfo.InvariantCulture).IndexOf ("MONO") != -1), s.Name); } } @@ -263,7 +263,7 @@ namespace MonoTests.System.Security.Policy { } finally { if (msg != null) { - Fail (msg); + Assert.Fail (msg); msg = null; } } diff --git a/mcs/class/corlib/Test/System.Security.Policy/StrongNameTest.cs b/mcs/class/corlib/Test/System.Security.Policy/StrongNameTest.cs index 885f7d4a92e..6a95bc4760e 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/StrongNameTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/StrongNameTest.cs @@ -65,15 +65,15 @@ namespace MonoTests.System.Security.Policy { public void NullNameConstructor () { StrongName sn = new StrongName (snpkb, null, version); - } - + } + [Test] -#if NET_2_0 +#if NET_2_0 [ExpectedException (typeof (ArgumentException))] -#endif - public void EmptyNameConstructor () - { - StrongName sn = new StrongName (snpkb, String.Empty, version); +#endif + public void EmptyNameConstructor () + { + StrongName sn = new StrongName (snpkb, String.Empty, version); } [Test] diff --git a/mcs/class/corlib/Test/System.Security.Policy/ZoneTest.cs b/mcs/class/corlib/Test/System.Security.Policy/ZoneTest.cs index ccab0f753e2..09fa9397470 100644 --- a/mcs/class/corlib/Test/System.Security.Policy/ZoneTest.cs +++ b/mcs/class/corlib/Test/System.Security.Policy/ZoneTest.cs @@ -37,128 +37,128 @@ using System.Security.Policy; namespace MonoTests.System.Security.Policy { [TestFixture] - public class ZoneTest : Assertion { + public class ZoneTest { [Test] public void MyComputer () { Zone z = new Zone (SecurityZone.MyComputer); - AssertEquals ("MyComputer.SecurityZone", SecurityZone.MyComputer, z.SecurityZone); - Assert ("MyComputer.ToString", (z.ToString ().IndexOf ("MyComputer") >= 0)); + Assert.AreEqual (SecurityZone.MyComputer, z.SecurityZone, "MyComputer.SecurityZone"); + Assert.IsTrue ((z.ToString ().IndexOf ("MyComputer") >= 0), "MyComputer.ToString"); Zone zc = (Zone) z.Copy (); - Assert ("MyComputer.Copy.Equals", z.Equals (zc)); + Assert.IsTrue (z.Equals (zc), "MyComputer.Copy.Equals"); IPermission p = z.CreateIdentityPermission (null); - AssertNotNull ("MyComputer.CreateIdentityPermission", p); - - Assert ("MyComputer.MyComputer.Equals", z.Equals (new Zone (SecurityZone.MyComputer))); - Assert ("MyComputer.Intranet.Equals", !z.Equals (new Zone (SecurityZone.Intranet))); - Assert ("MyComputer.Trusted.Equals", !z.Equals (new Zone (SecurityZone.Trusted))); - Assert ("MyComputer.Internet.Equals", !z.Equals (new Zone (SecurityZone.Internet))); - Assert ("MyComputer.Untrusted.Equals", !z.Equals (new Zone (SecurityZone.Untrusted))); - Assert ("MyComputer.NoZone.Equals", !z.Equals (new Zone (SecurityZone.NoZone))); - Assert ("MyComputer.Null.Equals", !z.Equals (null)); + Assert.IsNotNull (p, "MyComputer.CreateIdentityPermission"); + + Assert.IsTrue (z.Equals (new Zone (SecurityZone.MyComputer)), "MyComputer.MyComputer.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Intranet)), "MyComputer.Intranet.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Trusted)), "MyComputer.Trusted.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Internet)), "MyComputer.Internet.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Untrusted)), "MyComputer.Untrusted.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.NoZone)), "MyComputer.NoZone.Equals"); + Assert.IsTrue (!z.Equals (null), "MyComputer.Null.Equals"); } [Test] public void Intranet () { Zone z = new Zone (SecurityZone.Intranet); - AssertEquals ("Intranet.SecurityZone", SecurityZone.Intranet, z.SecurityZone); - Assert ("Intranet.ToString", (z.ToString ().IndexOf ("Intranet") >= 0)); + Assert.AreEqual (SecurityZone.Intranet, z.SecurityZone, "Intranet.SecurityZone"); + Assert.IsTrue ((z.ToString ().IndexOf ("Intranet") >= 0), "Intranet.ToString"); Zone zc = (Zone) z.Copy (); - Assert ("Intranet.Copy.Equals", z.Equals (zc)); + Assert.IsTrue (z.Equals (zc), "Intranet.Copy.Equals"); IPermission p = z.CreateIdentityPermission (null); - AssertNotNull ("Intranet.CreateIdentityPermission", p); - - Assert ("Intranet.MyComputer.Equals", !z.Equals (new Zone (SecurityZone.MyComputer))); - Assert ("Intranet.Intranet.Equals", z.Equals (new Zone (SecurityZone.Intranet))); - Assert ("Intranet.Trusted.Equals", !z.Equals (new Zone (SecurityZone.Trusted))); - Assert ("Intranet.Internet.Equals", !z.Equals (new Zone (SecurityZone.Internet))); - Assert ("Intranet.Untrusted.Equals", !z.Equals (new Zone (SecurityZone.Untrusted))); - Assert ("Intranet.NoZone.Equals", !z.Equals (new Zone (SecurityZone.NoZone))); - Assert ("Intranet.Null.Equals", !z.Equals (null)); + Assert.IsNotNull (p, "Intranet.CreateIdentityPermission"); + + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.MyComputer)), "Intranet.MyComputer.Equals"); + Assert.IsTrue (z.Equals (new Zone (SecurityZone.Intranet)), "Intranet.Intranet.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Trusted)), "Intranet.Trusted.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Internet)), "Intranet.Internet.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Untrusted)), "Intranet.Untrusted.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.NoZone)), "Intranet.NoZone.Equals"); + Assert.IsTrue (!z.Equals (null), "Intranet.Null.Equals"); } [Test] public void Trusted () { Zone z = new Zone (SecurityZone.Trusted); - AssertEquals ("Trusted.SecurityZone", SecurityZone.Trusted, z.SecurityZone); - Assert ("Trusted.ToString", (z.ToString ().IndexOf ("Trusted") >= 0)); + Assert.AreEqual (SecurityZone.Trusted, z.SecurityZone, "Trusted.SecurityZone"); + Assert.IsTrue ((z.ToString ().IndexOf ("Trusted") >= 0), "Trusted.ToString"); Zone zc = (Zone) z.Copy (); - Assert ("Trusted.Copy.Equals", z.Equals (zc)); + Assert.IsTrue (z.Equals (zc), "Trusted.Copy.Equals"); IPermission p = z.CreateIdentityPermission (null); - AssertNotNull ("Trusted.CreateIdentityPermission", p); - - Assert ("Trusted.MyComputer.Equals", !z.Equals (new Zone (SecurityZone.MyComputer))); - Assert ("Trusted.Intranet.Equals", !z.Equals (new Zone (SecurityZone.Intranet))); - Assert ("Trusted.Trusted.Equals", z.Equals (new Zone (SecurityZone.Trusted))); - Assert ("Trusted.Internet.Equals", !z.Equals (new Zone (SecurityZone.Internet))); - Assert ("Trusted.Untrusted.Equals", !z.Equals (new Zone (SecurityZone.Untrusted))); - Assert ("Trusted.NoZone.Equals", !z.Equals (new Zone (SecurityZone.NoZone))); - Assert ("Trusted.Null.Equals", !z.Equals (null)); + Assert.IsNotNull (p, "Trusted.CreateIdentityPermission"); + + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.MyComputer)), "Trusted.MyComputer.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Intranet)), "Trusted.Intranet.Equals"); + Assert.IsTrue (z.Equals (new Zone (SecurityZone.Trusted)), "Trusted.Trusted.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Internet)), "Trusted.Internet.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Untrusted)), "Trusted.Untrusted.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.NoZone)), "Trusted.NoZone.Equals"); + Assert.IsTrue (!z.Equals (null), "Trusted.Null.Equals"); } [Test] public void Internet () { Zone z = new Zone (SecurityZone.Internet); - AssertEquals ("Internet.SecurityZone", SecurityZone.Internet, z.SecurityZone); - Assert ("Internet.ToString", (z.ToString ().IndexOf ("Internet") >= 0)); + Assert.AreEqual (SecurityZone.Internet, z.SecurityZone, "Internet.SecurityZone"); + Assert.IsTrue ((z.ToString ().IndexOf ("Internet") >= 0), "Internet.ToString"); Zone zc = (Zone) z.Copy (); - Assert ("Internet.Copy.Equals", z.Equals (zc)); + Assert.IsTrue (z.Equals (zc), "Internet.Copy.Equals"); IPermission p = z.CreateIdentityPermission (null); - AssertNotNull ("Internet.CreateIdentityPermission", p); - - Assert ("Internet.MyComputer.Equals", !z.Equals (new Zone (SecurityZone.MyComputer))); - Assert ("Internet.Intranet.Equals", !z.Equals (new Zone (SecurityZone.Intranet))); - Assert ("Internet.Trusted.Equals", !z.Equals (new Zone (SecurityZone.Trusted))); - Assert ("Internet.Internet.Equals", z.Equals (new Zone (SecurityZone.Internet))); - Assert ("Internet.Untrusted.Equals", !z.Equals (new Zone (SecurityZone.Untrusted))); - Assert ("Internet.NoZone.Equals", !z.Equals (new Zone (SecurityZone.NoZone))); - Assert ("Internet.Null.Equals", !z.Equals (null)); + Assert.IsNotNull (p, "Internet.CreateIdentityPermission"); + + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.MyComputer)), "Internet.MyComputer.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Intranet)), "Internet.Intranet.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Trusted)), "Internet.Trusted.Equals"); + Assert.IsTrue (z.Equals (new Zone (SecurityZone.Internet)), "Internet.Internet.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Untrusted)), "Internet.Untrusted.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.NoZone)), "Internet.NoZone.Equals"); + Assert.IsTrue (!z.Equals (null), "Internet.Null.Equals"); } [Test] public void Untrusted () { Zone z = new Zone (SecurityZone.Untrusted); - AssertEquals ("Untrusted.SecurityZone", SecurityZone.Untrusted, z.SecurityZone); - Assert ("Untrusted.ToString", (z.ToString ().IndexOf ("Untrusted") >= 0)); + Assert.AreEqual (SecurityZone.Untrusted, z.SecurityZone, "Untrusted.SecurityZone"); + Assert.IsTrue ((z.ToString ().IndexOf ("Untrusted") >= 0), "Untrusted.ToString"); Zone zc = (Zone) z.Copy (); - Assert ("Untrusted.Copy.Equals", z.Equals (zc)); + Assert.IsTrue (z.Equals (zc), "Untrusted.Copy.Equals"); IPermission p = z.CreateIdentityPermission (null); - AssertNotNull ("Untrusted.CreateIdentityPermission", p); - - Assert ("Untrusted.MyComputer.Equals", !z.Equals (new Zone (SecurityZone.MyComputer))); - Assert ("Untrusted.Intranet.Equals", !z.Equals (new Zone (SecurityZone.Intranet))); - Assert ("Untrusted.Trusted.Equals", !z.Equals (new Zone (SecurityZone.Trusted))); - Assert ("Untrusted.Internet.Equals", !z.Equals (new Zone (SecurityZone.Internet))); - Assert ("Untrusted.Untrusted.Equals", z.Equals (new Zone (SecurityZone.Untrusted))); - Assert ("Untrusted.NoZone.Equals", !z.Equals (new Zone (SecurityZone.NoZone))); - Assert ("Untrusted.Null.Equals", !z.Equals (null)); + Assert.IsNotNull (p, "Untrusted.CreateIdentityPermission"); + + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.MyComputer)), "Untrusted.MyComputer.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Intranet)), "Untrusted.Intranet.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Trusted)), "Untrusted.Trusted.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Internet)), "Untrusted.Internet.Equals"); + Assert.IsTrue (z.Equals (new Zone (SecurityZone.Untrusted)), "Untrusted.Untrusted.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.NoZone)), "Untrusted.NoZone.Equals"); + Assert.IsTrue (!z.Equals (null), "Untrusted.Null.Equals"); } [Test] public void NoZone () { Zone z = new Zone (SecurityZone.NoZone); - AssertEquals ("NoZone.SecurityZone", SecurityZone.NoZone, z.SecurityZone); - Assert ("NoZone.ToString", (z.ToString ().IndexOf ("NoZone") >= 0)); + Assert.AreEqual (SecurityZone.NoZone, z.SecurityZone, "NoZone.SecurityZone"); + Assert.IsTrue ((z.ToString ().IndexOf ("NoZone") >= 0), "NoZone.ToString"); Zone zc = (Zone) z.Copy (); - Assert ("NoZone.Copy.Equals", z.Equals (zc)); + Assert.IsTrue (z.Equals (zc), "NoZone.Copy.Equals"); IPermission p = z.CreateIdentityPermission (null); - AssertNotNull ("NoZone.CreateIdentityPermission", p); + Assert.IsNotNull (p, "NoZone.CreateIdentityPermission"); // NoZone isn't added to the XML / string of permissions - Assert ("ToString!=NoZone", p.ToString ().IndexOf ("NoZone") < 0); - - Assert ("NoZone.MyComputer.Equals", !z.Equals (new Zone (SecurityZone.MyComputer))); - Assert ("NoZone.Intranet.Equals", !z.Equals (new Zone (SecurityZone.Intranet))); - Assert ("NoZone.Trusted.Equals", !z.Equals (new Zone (SecurityZone.Trusted))); - Assert ("NoZone.Internet.Equals", !z.Equals (new Zone (SecurityZone.Internet))); - Assert ("NoZone.Untrusted.Equals", !z.Equals (new Zone (SecurityZone.Untrusted))); - Assert ("NoZone.NoZone.Equals", z.Equals (new Zone (SecurityZone.NoZone))); - Assert ("NoZone.Null.Equals", !z.Equals (null)); + Assert.IsTrue (p.ToString ().IndexOf ("NoZone") < 0, "ToString!=NoZone"); + + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.MyComputer)), "NoZone.MyComputer.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Intranet)), "NoZone.Intranet.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Trusted)), "NoZone.Trusted.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Internet)), "NoZone.Internet.Equals"); + Assert.IsTrue (!z.Equals (new Zone (SecurityZone.Untrusted)), "NoZone.Untrusted.Equals"); + Assert.IsTrue (z.Equals (new Zone (SecurityZone.NoZone)), "NoZone.NoZone.Equals"); + Assert.IsTrue (!z.Equals (null), "NoZone.Null.Equals"); } [Test] @@ -177,7 +177,7 @@ namespace MonoTests.System.Security.Policy { { foreach (string url in noZoneUrls) { Zone z = Zone.CreateFromUrl (url); - AssertEquals (url, SecurityZone.NoZone, z.SecurityZone); + Assert.AreEqual (SecurityZone.NoZone, z.SecurityZone, url); } } @@ -193,15 +193,15 @@ namespace MonoTests.System.Security.Policy { foreach (string u in myComputerUrls) { string url = u; Zone z = Zone.CreateFromUrl (url); - AssertEquals (url, SecurityZone.MyComputer, z.SecurityZone); + Assert.AreEqual (SecurityZone.MyComputer, z.SecurityZone, url); url = "file://" + u; z = Zone.CreateFromUrl (url); - AssertEquals (url, SecurityZone.MyComputer, z.SecurityZone); + Assert.AreEqual (SecurityZone.MyComputer, z.SecurityZone, url); url = "FILE://" + u; z = Zone.CreateFromUrl (url); - AssertEquals (url, SecurityZone.MyComputer, z.SecurityZone); + Assert.AreEqual (SecurityZone.MyComputer, z.SecurityZone, url); } } @@ -215,7 +215,7 @@ namespace MonoTests.System.Security.Policy { { foreach (string url in intranetUrls) { Zone z = Zone.CreateFromUrl (url); - AssertEquals (url, SecurityZone.Intranet, z.SecurityZone); + Assert.AreEqual (SecurityZone.Intranet, z.SecurityZone, url); } } @@ -234,7 +234,7 @@ namespace MonoTests.System.Security.Policy { { foreach (string url in internetUrls) { Zone z = Zone.CreateFromUrl (url); - AssertEquals (url, SecurityZone.Internet, z.SecurityZone); + Assert.AreEqual (SecurityZone.Internet, z.SecurityZone, url); } } @@ -243,10 +243,10 @@ namespace MonoTests.System.Security.Policy { { Zone z = Zone.CreateFromUrl (String.Empty); string ts = z.ToString (); - Assert ("Class", ts.StartsWith ("= 0)); - Assert ("Zone", (ts.IndexOf ("NoZone") >= 0)); - Assert ("End", (ts.IndexOf ("") >= 0)); + Assert.IsTrue (ts.StartsWith ("= 0), "Version"); + Assert.IsTrue ((ts.IndexOf ("NoZone") >= 0), "Zone"); + Assert.IsTrue ((ts.IndexOf ("") >= 0), "End"); } } } diff --git a/mcs/class/corlib/Test/System.Security.Principal/ChangeLog b/mcs/class/corlib/Test/System.Security.Principal/ChangeLog index 406fe8ac98e..6105ee057d6 100644 --- a/mcs/class/corlib/Test/System.Security.Principal/ChangeLog +++ b/mcs/class/corlib/Test/System.Security.Principal/ChangeLog @@ -1,3 +1,7 @@ +2009-06-24 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2009-02-04 Zoltan Varga * GenericIdentityTest.cs GenericPrincipalTest.cs: Make these tests diff --git a/mcs/class/corlib/Test/System.Security.Principal/WindowsIdentityTest.cs b/mcs/class/corlib/Test/System.Security.Principal/WindowsIdentityTest.cs index 2c0e582e9d9..69ad39fd694 100644 --- a/mcs/class/corlib/Test/System.Security.Principal/WindowsIdentityTest.cs +++ b/mcs/class/corlib/Test/System.Security.Principal/WindowsIdentityTest.cs @@ -19,7 +19,7 @@ using System.Security.Principal; namespace MonoTests.System.Security.Principal { [TestFixture] - public class WindowsIdentityTest : Assertion { + public class WindowsIdentityTest { private bool IsPosix { get { @@ -57,7 +57,7 @@ namespace MonoTests.System.Security.Principal { try { WindowsIdentity id = new WindowsIdentity (IntPtr.Zero); if (!IsPosix) - Fail ("Expected ArgumentException on Windows platforms"); + Assert.Fail ("Expected ArgumentException on Windows platforms"); } catch (ArgumentException) { if (IsPosix) @@ -83,7 +83,7 @@ namespace MonoTests.System.Security.Principal { try { WindowsIdentity id = new WindowsIdentity (wi.Name); /*if (!IsWin2k3orLater && !IsPosix) - Fail ("Expected ArgumentException but got none");*/ + Assert.Fail ("Expected ArgumentException but got none");*/ } catch (ArgumentException) { if (/*IsWin2k3orLater ||*/ IsPosix) @@ -109,7 +109,7 @@ namespace MonoTests.System.Security.Principal { try { WindowsIdentity id = new WindowsIdentity (wi.Name, null); /*if (!IsWin2k3orLater && !IsPosix) - Fail ("Expected ArgumentException but got none");*/ + Assert.Fail ("Expected ArgumentException but got none");*/ } catch (ArgumentException) { if (/*IsWin2k3orLater ||*/ IsPosix) @@ -127,7 +127,7 @@ namespace MonoTests.System.Security.Principal { try { WindowsIdentity id = new WindowsIdentity (wi.Name, wi.AuthenticationType); /*if (!IsWin2k3orLater && !IsPosix) - Fail ("Expected ArgumentException but got none");*/ + Assert.Fail ("Expected ArgumentException but got none");*/ } catch (ArgumentException) { if (/*IsWin2k3orLater ||*/ IsPosix) @@ -139,18 +139,18 @@ namespace MonoTests.System.Security.Principal { public void Anonymous () { WindowsIdentity id = WindowsIdentity.GetAnonymous (); - AssertEquals ("AuthenticationType", String.Empty, id.AuthenticationType); - Assert ("IsAnonymous", id.IsAnonymous); - Assert ("IsAuthenticated", !id.IsAuthenticated); - Assert ("IsGuest", !id.IsGuest); - Assert ("IsSystem", !id.IsSystem); + Assert.AreEqual (String.Empty, id.AuthenticationType, "AuthenticationType"); + Assert.IsTrue (id.IsAnonymous, "IsAnonymous"); + Assert.IsTrue (!id.IsAuthenticated, "IsAuthenticated"); + Assert.IsTrue (!id.IsGuest, "IsGuest"); + Assert.IsTrue (!id.IsSystem, "IsSystem"); if (IsPosix) { - Assert ("Token", (IntPtr.Zero != id.Token)); - AssertNotNull ("Name", id.Name); + Assert.IsTrue ((IntPtr.Zero != id.Token), "Token"); + Assert.IsNotNull (id.Name, "Name"); } else { - AssertEquals ("Token", IntPtr.Zero, id.Token); - AssertEquals ("Name", String.Empty, id.Name); + Assert.AreEqual (IntPtr.Zero, id.Token, "Token"); + Assert.AreEqual (String.Empty, id.Name, "Name"); } } @@ -158,16 +158,16 @@ namespace MonoTests.System.Security.Principal { public void Current () { WindowsIdentity id = WindowsIdentity.GetCurrent (); - AssertNotNull ("AuthenticationType", id.AuthenticationType); - Assert ("IsAnonymous", !id.IsAnonymous); - Assert ("IsAuthenticated", id.IsAuthenticated); - Assert ("IsGuest", !id.IsGuest); + Assert.IsNotNull (id.AuthenticationType, "AuthenticationType"); + Assert.IsTrue (!id.IsAnonymous, "IsAnonymous"); + Assert.IsTrue (id.IsAuthenticated, "IsAuthenticated"); + Assert.IsTrue (!id.IsGuest, "IsGuest"); // root is 0 - so IntPtr.Zero is valid on Linux (but not on Windows) - Assert ("IsSystem", (!id.IsSystem || (id.Token == IntPtr.Zero))); + Assert.IsTrue ((!id.IsSystem || (id.Token == IntPtr.Zero)), "IsSystem"); if (!IsPosix) { - Assert ("Token", (id.Token != IntPtr.Zero)); + Assert.IsTrue ((id.Token != IntPtr.Zero), "Token"); } - AssertNotNull ("Name", id.Name); + Assert.IsNotNull (id.Name, "Name"); } [Test] @@ -176,13 +176,13 @@ namespace MonoTests.System.Security.Principal { WindowsIdentity id = WindowsIdentity.GetAnonymous (); IIdentity i = (id as IIdentity); - AssertNotNull ("IIdentity", i); + Assert.IsNotNull (i, "IIdentity"); IDeserializationCallback dc = (id as IDeserializationCallback); - AssertNotNull ("IDeserializationCallback", dc); + Assert.IsNotNull (dc, "IDeserializationCallback"); #if NET_1_1 ISerializable s = (id as ISerializable); - AssertNotNull ("ISerializable", s); + Assert.IsNotNull (s, "ISerializable"); #endif } @@ -210,7 +210,7 @@ namespace MonoTests.System.Security.Principal { foreach (string role in roles) { // somehow I got a null in there ? if (role != null) - Assert (role, wp.IsInRole (role)); + Assert.IsTrue (wp.IsInRole (role), role); } } @@ -223,12 +223,12 @@ namespace MonoTests.System.Security.Principal { formatter.Serialize (ms, wi); ms.Position = 0; WindowsIdentity back = (WindowsIdentity) formatter.Deserialize (ms); - AssertEquals ("AuthenticationType", wi.AuthenticationType, back.AuthenticationType); - AssertEquals ("IsAnonymous", wi.IsAnonymous, back.IsAnonymous); - AssertEquals ("IsAuthenticated", wi.IsAuthenticated, back.IsAuthenticated); - AssertEquals ("IsGuest", wi.IsGuest, back.IsGuest); - AssertEquals ("IsSystem", wi.IsSystem, back.IsSystem); - AssertEquals ("Name", wi.Name, back.Name); + Assert.AreEqual (wi.AuthenticationType, back.AuthenticationType, "AuthenticationType"); + Assert.AreEqual (wi.IsAnonymous, back.IsAnonymous, "IsAnonymous"); + Assert.AreEqual (wi.IsAuthenticated, back.IsAuthenticated, "IsAuthenticated"); + Assert.AreEqual (wi.IsGuest, back.IsGuest, "IsGuest"); + Assert.AreEqual (wi.IsSystem, back.IsSystem, "IsSystem"); + Assert.AreEqual (wi.Name, back.Name, "Name"); // note: token may be different (no compare) } } diff --git a/mcs/class/corlib/Test/System.Security/ChangeLog b/mcs/class/corlib/Test/System.Security/ChangeLog index a8cf8b32946..c48ed921fbd 100644 --- a/mcs/class/corlib/Test/System.Security/ChangeLog +++ b/mcs/class/corlib/Test/System.Security/ChangeLog @@ -1,3 +1,7 @@ +2009-06-20 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2009-05-01 Sebastien Pouliot * SecurityStateTest.cs: New. Unit tests for IsStateAvailable diff --git a/mcs/class/corlib/Test/System.Security/CodeAccessPermissionTest.cs b/mcs/class/corlib/Test/System.Security/CodeAccessPermissionTest.cs index 124130d964e..5afe25530bd 100644 --- a/mcs/class/corlib/Test/System.Security/CodeAccessPermissionTest.cs +++ b/mcs/class/corlib/Test/System.Security/CodeAccessPermissionTest.cs @@ -54,7 +54,7 @@ namespace MonoTests.System.Security { } [TestFixture] - public class CodeAccessPermissionTest : Assertion { + public class CodeAccessPermissionTest { [Test] public void CustomCAS () @@ -84,7 +84,7 @@ namespace MonoTests.System.Security { { NonAbstractCodeAccessPermission cap = new NonAbstractCodeAccessPermission ("CodeAccessPermission", "NonAbstract"); string s = cap.ToString (); - AssertEquals ("ToString", "NonAbstract" + Environment.NewLine, s); + Assert.AreEqual ("NonAbstract" + Environment.NewLine, s, "ToString"); } } } diff --git a/mcs/class/corlib/Test/System.Security/NamedPermissionSetTest.cs b/mcs/class/corlib/Test/System.Security/NamedPermissionSetTest.cs index 434c70a5e5c..3422ac1379a 100644 --- a/mcs/class/corlib/Test/System.Security/NamedPermissionSetTest.cs +++ b/mcs/class/corlib/Test/System.Security/NamedPermissionSetTest.cs @@ -35,7 +35,7 @@ using System.Security.Permissions; namespace MonoTests.System.Security { [TestFixture] - public class NamedPermissionSetTest : Assertion { + public class NamedPermissionSetTest { private static string name = "mono"; private static string sentinel = "go mono!"; @@ -53,125 +53,125 @@ namespace MonoTests.System.Security { public void ConstructorNameEmpty () { NamedPermissionSet nps = new NamedPermissionSet (""); - } - - [Test] - public void ConstructorName () - { - NamedPermissionSet nps = new NamedPermissionSet ("name"); - AssertEquals ("Name", "name", nps.Name); - AssertNull ("Description", nps.Description); - Assert ("IsUnrestricted", nps.IsUnrestricted ()); - Assert ("IsEmpty", !nps.IsEmpty ()); - Assert ("IsReadOnly", !nps.IsReadOnly); - Assert ("IsSynchronized", !nps.IsSynchronized); - AssertEquals ("Count", 0, nps.Count); - } - - [Test] - public void ConstructorNameReserved () - { - NamedPermissionSet nps = new NamedPermissionSet ("FullTrust"); - AssertEquals ("Name", "FullTrust", nps.Name); - AssertNull ("Description", nps.Description); - Assert ("IsUnrestricted", nps.IsUnrestricted ()); - Assert ("IsEmpty", !nps.IsEmpty ()); - Assert ("IsReadOnly", !nps.IsReadOnly); - Assert ("IsSynchronized", !nps.IsSynchronized); - AssertEquals ("Count", 0, nps.Count); - } - - [Test] - [ExpectedException (typeof (NullReferenceException))] - public void ConstructorNamedPermissionSetNull () - { - NamedPermissionSet nullps = null; - NamedPermissionSet nps = new NamedPermissionSet (nullps); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void ConstructorNameNullPermissionState () - { - new NamedPermissionSet (null, PermissionState.None); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void ConstructorNameEmptyPermissionState () - { - new NamedPermissionSet (String.Empty, PermissionState.None); - } - - [Test] - public void ConstructorNamePermissionStateNone () - { - NamedPermissionSet nps = new NamedPermissionSet ("name", PermissionState.None); - AssertEquals ("Name", "name", nps.Name); - AssertNull ("Description", nps.Description); - Assert ("IsUnrestricted", !nps.IsUnrestricted ()); - Assert ("IsEmpty", nps.IsEmpty ()); - Assert ("IsReadOnly", !nps.IsReadOnly); - Assert ("IsSynchronized", !nps.IsSynchronized); - AssertEquals ("Count", 0, nps.Count); - } - - [Test] - public void ConstructorNamePermissionStateUnrestricted () - { - NamedPermissionSet nps = new NamedPermissionSet ("name", PermissionState.Unrestricted); - AssertEquals ("Name", "name", nps.Name); - AssertNull ("Description", nps.Description); - Assert ("IsUnrestricted", nps.IsUnrestricted ()); - Assert ("IsEmpty", !nps.IsEmpty ()); - Assert ("IsReadOnly", !nps.IsReadOnly); - Assert ("IsSynchronized", !nps.IsSynchronized); - AssertEquals ("Count", 0, nps.Count); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void ConstructorNameNullPermissionSet () - { - new NamedPermissionSet (null, new PermissionSet (PermissionState.None)); - } - - [Test] - [ExpectedException (typeof (ArgumentException))] - public void ConstructorNameEmptyPermissionSet () - { - new NamedPermissionSet (String.Empty, new PermissionSet (PermissionState.None)); - } - - [Test] - public void ConstructorNamePermissionSetNull () - { - NamedPermissionSet nps = new NamedPermissionSet ("name", null); - AssertEquals ("Name", "name", nps.Name); - AssertNull ("Description", nps.Description); -#if NET_2_0 - Assert ("IsUnrestricted", !nps.IsUnrestricted ()); - Assert ("IsEmpty", nps.IsEmpty ()); -#else - Assert ("IsUnrestricted", nps.IsUnrestricted ()); - Assert ("IsEmpty", !nps.IsEmpty ()); -#endif - Assert ("IsReadOnly", !nps.IsReadOnly); - Assert ("IsSynchronized", !nps.IsSynchronized); - AssertEquals ("Count", 0, nps.Count); - } - + } + + [Test] + public void ConstructorName () + { + NamedPermissionSet nps = new NamedPermissionSet ("name"); + Assert.AreEqual ("name", nps.Name, "Name"); + Assert.IsNull (nps.Description, "Description"); + Assert.IsTrue (nps.IsUnrestricted (), "IsUnrestricted"); + Assert.IsTrue (!nps.IsEmpty (), "IsEmpty"); + Assert.IsTrue (!nps.IsReadOnly, "IsReadOnly"); + Assert.IsTrue (!nps.IsSynchronized, "IsSynchronized"); + Assert.AreEqual (0, nps.Count, "Count"); + } + + [Test] + public void ConstructorNameReserved () + { + NamedPermissionSet nps = new NamedPermissionSet ("FullTrust"); + Assert.AreEqual ("FullTrust", nps.Name, "Name"); + Assert.IsNull (nps.Description, "Description"); + Assert.IsTrue (nps.IsUnrestricted (), "IsUnrestricted"); + Assert.IsTrue (!nps.IsEmpty (), "IsEmpty"); + Assert.IsTrue (!nps.IsReadOnly, "IsReadOnly"); + Assert.IsTrue (!nps.IsSynchronized, "IsSynchronized"); + Assert.AreEqual (0, nps.Count, "Count"); + } + + [Test] + [ExpectedException (typeof (NullReferenceException))] + public void ConstructorNamedPermissionSetNull () + { + NamedPermissionSet nullps = null; + NamedPermissionSet nps = new NamedPermissionSet (nullps); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void ConstructorNameNullPermissionState () + { + new NamedPermissionSet (null, PermissionState.None); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void ConstructorNameEmptyPermissionState () + { + new NamedPermissionSet (String.Empty, PermissionState.None); + } + + [Test] + public void ConstructorNamePermissionStateNone () + { + NamedPermissionSet nps = new NamedPermissionSet ("name", PermissionState.None); + Assert.AreEqual ("name", nps.Name, "Name"); + Assert.IsNull (nps.Description, "Description"); + Assert.IsTrue (!nps.IsUnrestricted (), "IsUnrestricted"); + Assert.IsTrue (nps.IsEmpty (), "IsEmpty"); + Assert.IsTrue (!nps.IsReadOnly, "IsReadOnly"); + Assert.IsTrue (!nps.IsSynchronized, "IsSynchronized"); + Assert.AreEqual (0, nps.Count, "Count"); + } + + [Test] + public void ConstructorNamePermissionStateUnrestricted () + { + NamedPermissionSet nps = new NamedPermissionSet ("name", PermissionState.Unrestricted); + Assert.AreEqual ("name", nps.Name, "Name"); + Assert.IsNull (nps.Description, "Description"); + Assert.IsTrue (nps.IsUnrestricted (), "IsUnrestricted"); + Assert.IsTrue (!nps.IsEmpty (), "IsEmpty"); + Assert.IsTrue (!nps.IsReadOnly, "IsReadOnly"); + Assert.IsTrue (!nps.IsSynchronized, "IsSynchronized"); + Assert.AreEqual (0, nps.Count, "Count"); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void ConstructorNameNullPermissionSet () + { + new NamedPermissionSet (null, new PermissionSet (PermissionState.None)); + } + + [Test] + [ExpectedException (typeof (ArgumentException))] + public void ConstructorNameEmptyPermissionSet () + { + new NamedPermissionSet (String.Empty, new PermissionSet (PermissionState.None)); + } + + [Test] + public void ConstructorNamePermissionSetNull () + { + NamedPermissionSet nps = new NamedPermissionSet ("name", null); + Assert.AreEqual ("name", nps.Name, "Name"); + Assert.IsNull (nps.Description, "Description"); +#if NET_2_0 + Assert.IsTrue (!nps.IsUnrestricted (), "IsUnrestricted"); + Assert.IsTrue (nps.IsEmpty (), "IsEmpty"); +#else + Assert.IsTrue (nps.IsUnrestricted (), "IsUnrestricted"); + Assert.IsTrue (!nps.IsEmpty (), "IsEmpty"); +#endif + Assert.IsTrue (!nps.IsReadOnly, "IsReadOnly"); + Assert.IsTrue (!nps.IsSynchronized, "IsSynchronized"); + Assert.AreEqual (0, nps.Count, "Count"); + } + [Test] public void Description () { NamedPermissionSet nps = new NamedPermissionSet (name); // null by default (not empty) - AssertNull ("Description", nps.Description); + Assert.IsNull (nps.Description, "Description"); // is null-able (without exception) nps.Description = null; - AssertNull ("Description(null)", nps.Description); + Assert.IsNull (nps.Description, "Description(null)"); nps.Description = sentinel; - AssertEquals ("Description", sentinel, nps.Description); + Assert.AreEqual (sentinel, nps.Description, "Description"); } [Test] @@ -196,7 +196,7 @@ namespace MonoTests.System.Security { { NamedPermissionSet nps = new NamedPermissionSet (name); nps.Name = sentinel; - AssertEquals ("Name", sentinel, nps.Name); + Assert.AreEqual (sentinel, nps.Name, "Name"); } [Test] @@ -206,9 +206,9 @@ namespace MonoTests.System.Security { nps.Description = sentinel; nps.AddPermission (new SecurityPermission (SecurityPermissionFlag.Assertion)); NamedPermissionSet copy = (NamedPermissionSet)nps.Copy (); - AssertEquals ("Name", nps.Name, copy.Name); - AssertEquals ("Description", nps.Description, copy.Description); - AssertEquals ("Count", nps.Count, copy.Count); + Assert.AreEqual (nps.Name, copy.Name, "Name"); + Assert.AreEqual (nps.Description, copy.Description, "Description"); + Assert.AreEqual (nps.Count, copy.Count, "Count"); } [Test] @@ -218,9 +218,9 @@ namespace MonoTests.System.Security { nps.Description = sentinel; nps.AddPermission (new SecurityPermission (SecurityPermissionFlag.Assertion)); NamedPermissionSet copy = (NamedPermissionSet)nps.Copy ("Copy"); - AssertEquals ("Name", "Copy", copy.Name); - AssertEquals ("Description", nps.Description, copy.Description); - AssertEquals ("Count", nps.Count, copy.Count); + Assert.AreEqual ("Copy", copy.Name, "Name"); + Assert.AreEqual (nps.Description, copy.Description, "Description"); + Assert.AreEqual (nps.Count, copy.Count, "Count"); } [Test] @@ -337,18 +337,18 @@ namespace MonoTests.System.Security { nps.FromXml (w); // having a null name can badly influence the rest of the class code - AssertNull ("Name", nps.Name); + Assert.IsNull (nps.Name, "Name"); NamedPermissionSet copy = (NamedPermissionSet) nps.Copy (); - AssertNull ("Copy.Name", copy.Name); + Assert.IsNull (copy.Name, "Copy.Name"); copy = nps.Copy ("name"); - AssertEquals ("Copy(Name).Name", "name", copy.Name); + Assert.AreEqual ("name", copy.Name, "Copy(Name).Name"); se = nps.ToXml (); - AssertNull ("Name attribute", se.Attribute ("Name")); + Assert.IsNull (se.Attribute ("Name"), "Name attribute"); #if NET_2_0 - AssertEquals ("GetHashCode", 0, nps.GetHashCode ()); - Assert ("Equals-self", nps.Equals (nps)); + Assert.AreEqual (0, nps.GetHashCode (), "GetHashCode"); + Assert.IsTrue (nps.Equals (nps), "Equals-self"); #endif } @@ -357,26 +357,26 @@ namespace MonoTests.System.Security { { NamedPermissionSet nps = new NamedPermissionSet (name, PermissionState.None); SecurityElement se = nps.ToXml (); - AssertNotNull ("ToXml()", se); + Assert.IsNotNull (se, "ToXml()"); NamedPermissionSet nps2 = (NamedPermissionSet) nps.Copy (); nps2.FromXml (se); - AssertEquals ("FromXml-Copy.Name", name, nps2.Name); + Assert.AreEqual (name, nps2.Name, "FromXml-Copy.Name"); // strangely it's empty when converted from XML (but null when created) - AssertEquals ("FromXml-Copy.Description", "", nps2.Description); - Assert ("FromXml-Copy.IsUnrestricted", !nps2.IsUnrestricted ()); + Assert.AreEqual ("", nps2.Description, "FromXml-Copy.Description"); + Assert.IsTrue (!nps2.IsUnrestricted () , "FromXml-Copy.IsUnrestricted"); se.AddAttribute ("Description", sentinel); nps2.FromXml (se); - AssertEquals ("FromXml-Add1.Name", name, nps2.Name); - AssertEquals ("FromXml-Add1.Description", sentinel, nps2.Description); - Assert ("FromXml-Add1.IsUnrestricted", !nps2.IsUnrestricted ()); + Assert.AreEqual (name, nps2.Name, "FromXml-Add1.Name"); + Assert.AreEqual (sentinel, nps2.Description, "FromXml-Add1.Description"); + Assert.IsTrue (!nps2.IsUnrestricted () , "FromXml-Add1.IsUnrestricted"); se.AddAttribute ("Unrestricted", "true"); nps2.FromXml (se); - AssertEquals ("FromXml-Add2.Name", name, nps2.Name); - AssertEquals ("FromXml-Add2.Description", sentinel, nps2.Description); - Assert ("FromXml-Add2.IsUnrestricted", nps2.IsUnrestricted ()); + Assert.AreEqual (name, nps2.Name, "FromXml-Add2.Name"); + Assert.AreEqual (sentinel, nps2.Description, "FromXml-Add2.Description"); + Assert.IsTrue (nps2.IsUnrestricted () , "FromXml-Add2.IsUnrestricted"); } [Test] @@ -385,12 +385,12 @@ namespace MonoTests.System.Security { NamedPermissionSet ps = new NamedPermissionSet (name, PermissionState.None); ps.Description = sentinel; SecurityElement se = ps.ToXml (); - Assert ("None.ToString().StartsWith", ps.ToString().StartsWith (" 0); + Assert.IsTrue (pset.IndexOf (currentVersion) > 0, currentVersion); } [Test] diff --git a/mcs/class/corlib/Test/System.Security/SecurityExceptionTest.cs b/mcs/class/corlib/Test/System.Security/SecurityExceptionTest.cs index e29f85d2ef8..988bb898f7b 100644 --- a/mcs/class/corlib/Test/System.Security/SecurityExceptionTest.cs +++ b/mcs/class/corlib/Test/System.Security/SecurityExceptionTest.cs @@ -15,19 +15,19 @@ using System.Security.Permissions; namespace MonoTests.System.Security { [TestFixture] - public class SecurityExceptionTest : Assertion { + public class SecurityExceptionTest { [Test] public void Constructor_Empty () { SecurityException se = new SecurityException (); #if ! NET_1_0 - AssertNull ("GrantedSet", se.GrantedSet); - AssertNull ("RefusedSet", se.RefusedSet); + Assert.IsNull (se.GrantedSet, "GrantedSet"); + Assert.IsNull (se.RefusedSet, "RefusedSet"); #endif - AssertNull ("PermissionState", se.PermissionState); - AssertNull ("PermissionType", se.PermissionType); - Assert ("ToString()", se.ToString ().StartsWith ("System.Security.SecurityException: ")); + Assert.IsNull (se.PermissionState, "PermissionState"); + Assert.IsNull (se.PermissionType, "PermissionType"); + Assert.IsTrue (se.ToString ().StartsWith ("System.Security.SecurityException: "), "ToString()"); } [Test] @@ -35,12 +35,12 @@ namespace MonoTests.System.Security { { SecurityException se = new SecurityException ("message"); #if ! NET_1_0 - AssertNull ("GrantedSet", se.GrantedSet); - AssertNull ("RefusedSet", se.RefusedSet); + Assert.IsNull (se.GrantedSet, "GrantedSet"); + Assert.IsNull (se.RefusedSet, "RefusedSet"); #endif - AssertNull ("PermissionState", se.PermissionState); - AssertNull ("PermissionType", se.PermissionType); - AssertEquals ("ToString()", "System.Security.SecurityException: message", se.ToString ()); + Assert.IsNull (se.PermissionState, "PermissionState"); + Assert.IsNull (se.PermissionType, "PermissionType"); + Assert.AreEqual ("System.Security.SecurityException: message", se.ToString (), "ToString()"); } [Test] @@ -48,13 +48,13 @@ namespace MonoTests.System.Security { { SecurityException se = new SecurityException ("message", new Exception ()); #if ! NET_1_0 - AssertNull ("GrantedSet", se.GrantedSet); - AssertNull ("RefusedSet", se.RefusedSet); + Assert.IsNull (se.GrantedSet, "GrantedSet"); + Assert.IsNull (se.RefusedSet, "RefusedSet"); #endif - AssertNull ("PermissionState", se.PermissionState); - AssertNull ("PermissionType", se.PermissionType); - Assert ("ToString().Starts", se.ToString ().StartsWith ("System.Security.SecurityException: message")); - Assert ("ToString().Include", (se.ToString ().IndexOf ("System.Exception") > 0)); + Assert.IsNull (se.PermissionState, "PermissionState"); + Assert.IsNull (se.PermissionType, "PermissionType"); + Assert.IsTrue (se.ToString ().StartsWith ("System.Security.SecurityException: message"), "ToString().Starts"); + Assert.IsTrue ((se.ToString ().IndexOf ("System.Exception") > 0), "ToString().Include"); } [Test] @@ -62,13 +62,13 @@ namespace MonoTests.System.Security { { SecurityException se = new SecurityException ("message", typeof (EnvironmentPermission)); #if ! NET_1_0 - AssertNull ("GrantedSet", se.GrantedSet); - AssertNull ("RefusedSet", se.RefusedSet); + Assert.IsNull (se.GrantedSet, "GrantedSet"); + Assert.IsNull (se.RefusedSet, "RefusedSet"); #endif - AssertNull ("PermissionState", se.PermissionState); - AssertEquals ("PermissionType", typeof (EnvironmentPermission), se.PermissionType); + Assert.IsNull (se.PermissionState, "PermissionState"); + Assert.AreEqual (typeof (EnvironmentPermission), se.PermissionType, "PermissionType"); - Assert ("ToString().Starts", se.ToString ().StartsWith ("System.Security.SecurityException: message")); + Assert.IsTrue (se.ToString ().StartsWith ("System.Security.SecurityException: message"), "ToString().Starts"); // note: can't check for PermissionType as it's not shown with MS class lib } @@ -77,13 +77,13 @@ namespace MonoTests.System.Security { { SecurityException se = new SecurityException ("message", typeof (EnvironmentPermission), "mono"); #if ! NET_1_0 - AssertNull ("GrantedSet", se.GrantedSet); - AssertNull ("RefusedSet", se.RefusedSet); + Assert.IsNull (se.GrantedSet, "GrantedSet"); + Assert.IsNull (se.RefusedSet, "RefusedSet"); #endif - AssertEquals ("PermissionState", "mono", se.PermissionState); - AssertEquals ("PermissionType", typeof (EnvironmentPermission), se.PermissionType); + Assert.AreEqual ("mono", se.PermissionState, "PermissionState"); + Assert.AreEqual (typeof (EnvironmentPermission), se.PermissionType, "PermissionType"); - Assert ("ToString().Include(mono)", (se.ToString ().IndexOf ("mono") > 0)); + Assert.IsTrue ((se.ToString ().IndexOf ("mono") > 0), "ToString().Include(mono)"); // note: can't check for PermissionType as it's not shown with MS class lib } } diff --git a/mcs/class/corlib/Test/System.Text/ChangeLog b/mcs/class/corlib/Test/System.Text/ChangeLog index f7d7a09f512..da13a7d8afc 100644 --- a/mcs/class/corlib/Test/System.Text/ChangeLog +++ b/mcs/class/corlib/Test/System.Text/ChangeLog @@ -1,3 +1,12 @@ +2009-06-26 Robert Jordan + + * UTF8EncodingTest.cs: Fix the NET_1_1 build. + +2009-06-26 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. Add + [Test] attributes to some tests which were missing them. + 2009-02-05 Gert Driesen * UTF32EncodingTest.cs: Added tests for GetByteCount overloads. diff --git a/mcs/class/corlib/Test/System.Text/StringBuilderTest.cs b/mcs/class/corlib/Test/System.Text/StringBuilderTest.cs index 94b45a2e023..7941e04b595 100644 --- a/mcs/class/corlib/Test/System.Text/StringBuilderTest.cs +++ b/mcs/class/corlib/Test/System.Text/StringBuilderTest.cs @@ -27,44 +27,48 @@ using System; namespace MonoTests.System.Text { [TestFixture] - public class StringBuilderTest : Assertion { + public class StringBuilderTest { private StringBuilder sb; + [Test] public void TestConstructor1() { // check the parameterless ctor sb = new StringBuilder(); - AssertEquals(String.Empty, sb.ToString()); - AssertEquals(0, sb.Length); - AssertEquals(16, sb.Capacity); + Assert.AreEqual(String.Empty, sb.ToString()); + Assert.AreEqual(0, sb.Length); + Assert.AreEqual(16, sb.Capacity); } + [Test] public void TestConstructor2() { // check ctor that specifies the capacity sb = new StringBuilder(10); - AssertEquals(String.Empty, sb.ToString()); - AssertEquals(0, sb.Length); + Assert.AreEqual(String.Empty, sb.ToString()); + Assert.AreEqual(0, sb.Length); // check that capacity is not less than default - AssertEquals(10, sb.Capacity); + Assert.AreEqual(10, sb.Capacity); sb = new StringBuilder(42); - AssertEquals(String.Empty, sb.ToString()); - AssertEquals(0, sb.Length); + Assert.AreEqual(String.Empty, sb.ToString()); + Assert.AreEqual(0, sb.Length); // check that capacity is set - AssertEquals(42, sb.Capacity); + Assert.AreEqual(42, sb.Capacity); } - + + [Test] public void TestConstructor3() { // check ctor that specifies the capacity & maxCapacity sb = new StringBuilder(444, 1234); - AssertEquals(String.Empty, sb.ToString()); - AssertEquals(0, sb.Length); - AssertEquals(444, sb.Capacity); - AssertEquals(1234, sb.MaxCapacity); + Assert.AreEqual(String.Empty, sb.ToString()); + Assert.AreEqual(0, sb.Length); + Assert.AreEqual(444, sb.Capacity); + Assert.AreEqual(1234, sb.MaxCapacity); } + [Test] public void TestConstructor4() { // check for exception in ctor that specifies the capacity & maxCapacity @@ -78,12 +82,14 @@ namespace MonoTests.System.Text { NUnit.Framework.Assertion.Fail("Capacity exeeds MaxCapacity"); } + [Test] public void TestConstructor5() { String someString = null; sb = new StringBuilder(someString); - AssertEquals("Should be empty string", String.Empty, sb.ToString()); + Assert.AreEqual(String.Empty, sb.ToString(), "Should be empty string"); } + [Test] public void TestConstructor6() { // check for exception in ctor that prevents startIndex less than zero try { @@ -97,6 +103,7 @@ namespace MonoTests.System.Text { NUnit.Framework.Assertion.Fail("StartIndex not allowed to be less than zero."); } + [Test] public void TestConstructor7() { // check for exception in ctor that prevents length less than zero try { @@ -110,6 +117,7 @@ namespace MonoTests.System.Text { NUnit.Framework.Assertion.Fail("Length not allowed to be less than zero."); } + [Test] public void TestConstructor8() { // check for exception in ctor that ensures substring is contained in given string // check that startIndex is not too big @@ -124,6 +132,7 @@ namespace MonoTests.System.Text { NUnit.Framework.Assertion.Fail("StartIndex and length must refer to a location within the string."); } + [Test] public void TestConstructor9() { // check for exception in ctor that ensures substring is contained in given string // check that length doesn't go beyond end of string @@ -138,79 +147,84 @@ namespace MonoTests.System.Text { NUnit.Framework.Assertion.Fail("StartIndex and length must refer to a location within the string."); } + [Test] public void TestConstructor10() { // check that substring is taken properly and made into a StringBuilder String someString = "someString"; sb = new StringBuilder(someString, 4, 6, 18); string expected = "String"; - AssertEquals( expected, sb.ToString()); + Assert.AreEqual( expected, sb.ToString()); } + [Test] [ExpectedException(typeof(ArgumentOutOfRangeException))] public void TestConstructor11 () { new StringBuilder (-1); } - + + [Test] public void TestAppend() { StringBuilder sb = new StringBuilder( "Foo" ); sb.Append( "Two" ); string expected = "FooTwo"; - AssertEquals( expected, sb.ToString() ); + Assert.AreEqual( expected, sb.ToString() ); } + [Test] public void TestInsert() { StringBuilder sb = new StringBuilder(); - AssertEquals( String.Empty, sb.ToString() ); + Assert.AreEqual( String.Empty, sb.ToString() ); /* Test empty StringBuilder conforms to spec */ sb.Insert( 0, "Foo" ); /* Test insert at start of empty string */ - AssertEquals( "Foo", sb.ToString() ); + Assert.AreEqual( "Foo", sb.ToString() ); sb.Insert( 1, "!!" ); /* Test insert not at start of string */ - AssertEquals( "F!!oo", sb.ToString() ); + Assert.AreEqual( "F!!oo", sb.ToString() ); sb.Insert( 5, ".." ); /* Test insert at end of string */ - AssertEquals( "F!!oo..", sb.ToString() ); + Assert.AreEqual( "F!!oo..", sb.ToString() ); sb.Insert( 0, 1234 ); /* Test insert of a number (at start of string) */ // FIX: Why does this test fail? - //AssertEquals( "1234F!!oo..", sb.ToString() ); + //Assert.AreEqual( "1234F!!oo..", sb.ToString() ); sb.Insert( 5, 1.5 ); /* Test insert of a decimal (and end of string) */ // FIX: Why does this test fail? - //AssertEquals( "1234F1.5!!oo..", sb.ToString() ); + //Assert.AreEqual( "1234F1.5!!oo..", sb.ToString() ); sb.Insert( 4, 'A' ); /* Test char insert in middle of string */ // FIX: Why does this test fail? - //AssertEquals( "1234AF1.5!!oo..", sb.ToString() ); + //Assert.AreEqual( "1234AF1.5!!oo..", sb.ToString() ); } + [Test] public void TestReplace() { StringBuilder sb = new StringBuilder( "Foobarbaz" ); sb.Replace( "bar", "!!!" ); /* Test same length replace in middle of string */ - AssertEquals( "Foo!!!baz", sb.ToString() ); + Assert.AreEqual( "Foo!!!baz", sb.ToString() ); sb.Replace( "Foo", "ABcD" ); /* Test longer replace at start of string */ - AssertEquals( "ABcD!!!baz", sb.ToString() ); + Assert.AreEqual( "ABcD!!!baz", sb.ToString() ); sb.Replace( "baz", "00" ); /* Test shorter replace at end of string */ - AssertEquals( "ABcD!!!00", sb.ToString() ); + Assert.AreEqual( "ABcD!!!00", sb.ToString() ); sb.Replace( sb.ToString(), null ); /* Test string clear as in spec */ - AssertEquals( String.Empty, sb.ToString() ); + Assert.AreEqual( String.Empty, sb.ToString() ); /* | 10 20 30 /* |0123456789012345678901234567890| */ @@ -218,17 +232,18 @@ namespace MonoTests.System.Text { sb.Replace( "abc", "!!!", 0, 31 ); /* Partial replace at start of string */ - AssertEquals( "!!! this is testing !!! the !!! abc partial replace abc", sb.ToString() ); + Assert.AreEqual( "!!! this is testing !!! the !!! abc partial replace abc", sb.ToString() ); sb.Replace( "testing", "", 0, 15 ); /* Test replace across boundary */ - AssertEquals( "!!! this is testing !!! the !!! abc partial replace abc", sb.ToString() ); + Assert.AreEqual( "!!! this is testing !!! the !!! abc partial replace abc", sb.ToString() ); sb.Replace( "!!!", "" ); /* Test replace with empty string */ - AssertEquals(" this is testing the abc partial replace abc", sb.ToString() ); + Assert.AreEqual(sb.ToString() , " this is testing the abc partial replace abc"); } + [Test] public void TestAppendFormat() { } @@ -240,12 +255,12 @@ namespace MonoTests.System.Text { sb.Append ("Second"); sb.Append ("Third"); sb.Replace ("Second", "Gone", 2, sb.Length-2); - AssertEquals ("#01", "FirstGoneThird", sb.ToString ()); + Assert.AreEqual ("FirstGoneThird", sb.ToString (), "#01"); sb.Length = 0; sb.Append ("This, is, a, list"); sb.Replace (",", "comma-separated", 11, sb.Length-11); - AssertEquals ("#02", "This, is, acomma-separated list", sb.ToString ()); + Assert.AreEqual ("This, is, acomma-separated list", sb.ToString (), "#02"); } [Test] @@ -254,7 +269,7 @@ namespace MonoTests.System.Text { StringBuilder sb = new StringBuilder(); sb.Append("testtesttest"); sb.Insert(0, '^'); - AssertEquals ("#01", "^testtesttest", sb.ToString ()); + Assert.AreEqual ("^testtesttest", sb.ToString (), "#01"); } [Test] @@ -263,7 +278,7 @@ namespace MonoTests.System.Text { StringBuilder sb = new StringBuilder(); char [] ca = new char [] { 'c' }; sb.Append (ca); - AssertEquals ("#01", "c", sb.ToString ()); + Assert.AreEqual ("c", sb.ToString (), "#01"); } @@ -273,7 +288,7 @@ namespace MonoTests.System.Text { StringBuilder b = new StringBuilder (); b.Append ("Hello, I am a StringBuilder"); b.Remove (0, 7); // Should remove "Hello, " - AssertEquals ("#01", "I am a StringBuilder", b.ToString ()); + Assert.AreEqual ("I am a StringBuilder", b.ToString (), "#01"); } [Test] @@ -281,14 +296,14 @@ namespace MonoTests.System.Text { { StringBuilder sb = new StringBuilder(); sb.Insert(0, "aa"); - AssertEquals ("#01", "aa", sb.ToString ()); + Assert.AreEqual ("aa", sb.ToString (), "#01"); char [] charArr = new char [] { 'b', 'c', 'd' }; sb.Insert(1, charArr, 1, 1); - AssertEquals ("#02", "aca", sb.ToString ()); + Assert.AreEqual ("aca", sb.ToString (), "#02"); sb.Insert (1, null, 0, 0); - AssertEquals ("#03", "aca", sb.ToString ()); + Assert.AreEqual ("aca", sb.ToString (), "#03"); try { sb.Insert (1, null, 1, 1); @@ -439,8 +454,8 @@ namespace MonoTests.System.Text { } catch (ArgumentOutOfRangeException) { } - AssertEquals (2, sb.Capacity); - AssertEquals (3, sb.MaxCapacity); + Assert.AreEqual (2, sb.Capacity); + Assert.AreEqual (3, sb.MaxCapacity); } [Test] @@ -464,27 +479,27 @@ namespace MonoTests.System.Text { public void CapacityFromString () { StringBuilder sb = new StringBuilder ("hola").Append ("lala"); - AssertEquals ("#01", "holalala", sb.ToString ()); + Assert.AreEqual ("holalala", sb.ToString (), "#01"); } [Test] public void ReplaceWithLargerString () { StringBuilder sb = new StringBuilder ("ABCDE"); - AssertEquals ("#1", "ABCDE", sb.ToString ()); + Assert.AreEqual ("ABCDE", sb.ToString (), "#1"); sb.Replace ("ABC", "abcaa", 0, 3); - AssertEquals ("#2", "abcaaDE", sb.ToString ()); + Assert.AreEqual ("abcaaDE", sb.ToString (), "#2"); } [Test] public void SetLength () { StringBuilder sb = new StringBuilder ("Text"); - AssertEquals ("#1", 4, sb.Length); - AssertEquals ("#2", "Text", sb.ToString ()); + Assert.AreEqual (4, sb.Length, "#1"); + Assert.AreEqual ("Text", sb.ToString (), "#2"); sb.Length = 8; - AssertEquals ("#3", 8, sb.Length); - AssertEquals ("#4", "Text\0\0\0\0", sb.ToString ()); + Assert.AreEqual (8, sb.Length, "#3"); + Assert.AreEqual ("Text\0\0\0\0", sb.ToString (), "#4"); } } diff --git a/mcs/class/corlib/Test/System.Text/UTF7EncodingTest.cs b/mcs/class/corlib/Test/System.Text/UTF7EncodingTest.cs index 546259aba75..a115bc209f9 100644 --- a/mcs/class/corlib/Test/System.Text/UTF7EncodingTest.cs +++ b/mcs/class/corlib/Test/System.Text/UTF7EncodingTest.cs @@ -18,34 +18,34 @@ using AssertType = NUnit.Framework.Assert; namespace MonoTests.System.Text { [TestFixture] - public class UTF7EncodingTest : Assertion + public class UTF7EncodingTest { [Test] public void IsBrowserDisplay () { UTF7Encoding utf7 = new UTF7Encoding (); - Assert (!utf7.IsBrowserDisplay); + Assert.IsTrue (!utf7.IsBrowserDisplay); } [Test] public void IsBrowserSave () { UTF7Encoding utf7 = new UTF7Encoding (); - Assert (!utf7.IsBrowserSave); + Assert.IsTrue (!utf7.IsBrowserSave); } [Test] public void IsMailNewsDisplay () { UTF7Encoding utf7 = new UTF7Encoding (); - Assert (utf7.IsMailNewsDisplay); + Assert.IsTrue (utf7.IsMailNewsDisplay); } [Test] public void IsMailNewsSave () { UTF7Encoding utf7 = new UTF7Encoding (); - Assert (utf7.IsMailNewsSave); + Assert.IsTrue (utf7.IsMailNewsSave); } [Test] @@ -58,14 +58,14 @@ namespace MonoTests.System.Text UTF7Bytes = UTF7enc.GetBytes (UniCodeString); - Assertion.AssertEquals ("UTF7 #1", 0x61, UTF7Bytes [0]); - Assertion.AssertEquals ("UTF7 #2", 0x7A, UTF7Bytes [1]); - Assertion.AssertEquals ("UTF7 #3", 0x41, UTF7Bytes [2]); - Assertion.AssertEquals ("UTF7 #4", 0x5A, UTF7Bytes [3]); - Assertion.AssertEquals ("UTF7 #5", 0x30, UTF7Bytes [4]); - Assertion.AssertEquals ("UTF7 #6", 0x39, UTF7Bytes [5]); - Assertion.AssertEquals ("UTF7 #7", 0x27, UTF7Bytes [6]); - Assertion.AssertEquals ("UTF7 #8", 0x3F, UTF7Bytes [7]); + Assert.AreEqual (0x61, UTF7Bytes [0], "UTF7 #1"); + Assert.AreEqual (0x7A, UTF7Bytes [1], "UTF7 #2"); + Assert.AreEqual (0x41, UTF7Bytes [2], "UTF7 #3"); + Assert.AreEqual (0x5A, UTF7Bytes [3], "UTF7 #4"); + Assert.AreEqual (0x30, UTF7Bytes [4], "UTF7 #5"); + Assert.AreEqual (0x39, UTF7Bytes [5], "UTF7 #6"); + Assert.AreEqual (0x27, UTF7Bytes [6], "UTF7 #7"); + Assert.AreEqual (0x3F, UTF7Bytes [7], "UTF7 #8"); } [Test] @@ -79,14 +79,14 @@ namespace MonoTests.System.Text int Cnt = UTF7enc.GetBytes (UniCodeString.ToCharArray(), 0, Length, UTF7Bytes, 0); - Assertion.AssertEquals ("UTF7 #1", 0x61, UTF7Bytes [0]); - Assertion.AssertEquals ("UTF7 #2", 0x7A, UTF7Bytes [1]); - Assertion.AssertEquals ("UTF7 #3", 0x41, UTF7Bytes [2]); - Assertion.AssertEquals ("UTF7 #4", 0x5A, UTF7Bytes [3]); - Assertion.AssertEquals ("UTF7 #5", 0x30, UTF7Bytes [4]); - Assertion.AssertEquals ("UTF7 #6", 0x39, UTF7Bytes [5]); - Assertion.AssertEquals ("UTF7 #7", 0x27, UTF7Bytes [6]); - Assertion.AssertEquals ("UTF7 #8", 0x3F, UTF7Bytes [7]); + Assert.AreEqual (0x61, UTF7Bytes [0], "UTF7 #1"); + Assert.AreEqual (0x7A, UTF7Bytes [1], "UTF7 #2"); + Assert.AreEqual (0x41, UTF7Bytes [2], "UTF7 #3"); + Assert.AreEqual (0x5A, UTF7Bytes [3], "UTF7 #4"); + Assert.AreEqual (0x30, UTF7Bytes [4], "UTF7 #5"); + Assert.AreEqual (0x39, UTF7Bytes [5], "UTF7 #6"); + Assert.AreEqual (0x27, UTF7Bytes [6], "UTF7 #7"); + Assert.AreEqual (0x3F, UTF7Bytes [7], "UTF7 #8"); } [Test] @@ -99,20 +99,20 @@ namespace MonoTests.System.Text UTF7Encoding UTF7enc = new UTF7Encoding (true); UTF7Bytes = UTF7enc.GetBytes (UniCodeString); - Assertion.AssertEquals ("UTF7 #1", 0x21, UTF7Bytes [0]); - Assertion.AssertEquals ("UTF7 #2", 0x26, UTF7Bytes [1]); - Assertion.AssertEquals ("UTF7 #3", 0x2A, UTF7Bytes [2]); - Assertion.AssertEquals ("UTF7 #4", 0x3B, UTF7Bytes [3]); + Assert.AreEqual (0x21, UTF7Bytes [0], "UTF7 #1"); + Assert.AreEqual (0x26, UTF7Bytes [1], "UTF7 #2"); + Assert.AreEqual (0x2A, UTF7Bytes [2], "UTF7 #3"); + Assert.AreEqual (0x3B, UTF7Bytes [3], "UTF7 #4"); //Optional characters are not allowed. UTF7enc = new UTF7Encoding (false); UTF7Bytes = UTF7enc.GetBytes (UniCodeString); - Assertion.AssertEquals ("UTF7 #5", 0x2B, UTF7Bytes [0]); - Assertion.AssertEquals ("UTF7 #6", 0x41, UTF7Bytes [1]); - Assertion.AssertEquals ("UTF7 #7", 0x43, UTF7Bytes [2]); - Assertion.AssertEquals ("UTF7 #8", 0x45, UTF7Bytes [3]); - Assertion.AssertEquals ("UTF7 #6", 0x41, UTF7Bytes [1]); + Assert.AreEqual (0x2B, UTF7Bytes [0], "UTF7 #5"); + Assert.AreEqual (0x41, UTF7Bytes [1], "UTF7 #6"); + Assert.AreEqual (0x43, UTF7Bytes [2], "UTF7 #7"); + Assert.AreEqual (0x45, UTF7Bytes [3], "UTF7 #8"); + Assert.AreEqual (0x41, UTF7Bytes [1], "UTF7 #6"); } [Test] @@ -125,16 +125,16 @@ namespace MonoTests.System.Text UTF7Bytes = UTF7enc.GetBytes (UniCodeString); //"A." is encoded as A+ImIDkQ-. see RFC 1642 - Assertion.AssertEquals ("UTF7 #1", 0x41, UTF7Bytes [0]); - Assertion.AssertEquals ("UTF7 #2", 0x2B, UTF7Bytes [1]); - Assertion.AssertEquals ("UTF7 #3", 0x49, UTF7Bytes [2]); - Assertion.AssertEquals ("UTF7 #4", 0x6D, UTF7Bytes [3]); - Assertion.AssertEquals ("UTF7 #5", 0x49, UTF7Bytes [4]); - Assertion.AssertEquals ("UTF7 #6", 0x44, UTF7Bytes [5]); - Assertion.AssertEquals ("UTF7 #7", 0x6B, UTF7Bytes [6]); - Assertion.AssertEquals ("UTF7 #8", 0x51, UTF7Bytes [7]); - Assertion.AssertEquals ("UTF7 #9", 0x2D, UTF7Bytes [8]); - Assertion.AssertEquals ("UTF7 #10", 0x2E, UTF7Bytes [9]); + Assert.AreEqual (0x41, UTF7Bytes [0], "UTF7 #1"); + Assert.AreEqual (0x2B, UTF7Bytes [1], "UTF7 #2"); + Assert.AreEqual (0x49, UTF7Bytes [2], "UTF7 #3"); + Assert.AreEqual (0x6D, UTF7Bytes [3], "UTF7 #4"); + Assert.AreEqual (0x49, UTF7Bytes [4], "UTF7 #5"); + Assert.AreEqual (0x44, UTF7Bytes [5], "UTF7 #6"); + Assert.AreEqual (0x6B, UTF7Bytes [6], "UTF7 #7"); + Assert.AreEqual (0x51, UTF7Bytes [7], "UTF7 #8"); + Assert.AreEqual (0x2D, UTF7Bytes [8], "UTF7 #9"); + Assert.AreEqual (0x2E, UTF7Bytes [9], "UTF7 #10"); } [Test] @@ -148,16 +148,16 @@ namespace MonoTests.System.Text int Cnt = UTF7enc.GetBytes (UniCodeString.ToCharArray(), 0, Length, UTF7Bytes, 0); //"A." is encoded as A+ImIDkQ-. see RFC 1642 - Assertion.AssertEquals ("UTF7 #1", 0x41, UTF7Bytes [0]); - Assertion.AssertEquals ("UTF7 #2", 0x2B, UTF7Bytes [1]); - Assertion.AssertEquals ("UTF7 #3", 0x49, UTF7Bytes [2]); - Assertion.AssertEquals ("UTF7 #4", 0x6D, UTF7Bytes [3]); - Assertion.AssertEquals ("UTF7 #5", 0x49, UTF7Bytes [4]); - Assertion.AssertEquals ("UTF7 #6", 0x44, UTF7Bytes [5]); - Assertion.AssertEquals ("UTF7 #7", 0x6B, UTF7Bytes [6]); - Assertion.AssertEquals ("UTF7 #8", 0x51, UTF7Bytes [7]); - Assertion.AssertEquals ("UTF7 #9", 0x2D, UTF7Bytes [8]); - Assertion.AssertEquals ("UTF7 #10", 0x2E, UTF7Bytes [9]); + Assert.AreEqual (0x41, UTF7Bytes [0], "UTF7 #1"); + Assert.AreEqual (0x2B, UTF7Bytes [1], "UTF7 #2"); + Assert.AreEqual (0x49, UTF7Bytes [2], "UTF7 #3"); + Assert.AreEqual (0x6D, UTF7Bytes [3], "UTF7 #4"); + Assert.AreEqual (0x49, UTF7Bytes [4], "UTF7 #5"); + Assert.AreEqual (0x44, UTF7Bytes [5], "UTF7 #6"); + Assert.AreEqual (0x6B, UTF7Bytes [6], "UTF7 #7"); + Assert.AreEqual (0x51, UTF7Bytes [7], "UTF7 #8"); + Assert.AreEqual (0x2D, UTF7Bytes [8], "UTF7 #9"); + Assert.AreEqual (0x2E, UTF7Bytes [9], "UTF7 #10"); } [Test] @@ -171,12 +171,12 @@ namespace MonoTests.System.Text char[] actual = UTF7enc.GetChars (UTF7Bytes); // "A+ImIDkQ-." is decoded as "A." see RFC 1642 - AssertEquals ("UTF #1", expected [0], actual [0]); - AssertEquals ("UTF #2", expected [1], actual [1]); - AssertEquals ("UTF #3", expected [2], actual [2]); - AssertEquals ("UTF #4", expected [3], actual [3]); + Assert.AreEqual (expected [0], actual [0], "UTF #1"); + Assert.AreEqual (expected [1], actual [1], "UTF #2"); + Assert.AreEqual (expected [2], actual [2], "UTF #3"); + Assert.AreEqual (expected [3], actual [3], "UTF #4"); - AssertEquals ("GetString", UniCodeString, UTF7enc.GetString (UTF7Bytes)); + Assert.AreEqual (UniCodeString, UTF7enc.GetString (UTF7Bytes), "GetString"); } [Test] @@ -191,17 +191,17 @@ namespace MonoTests.System.Text char[] actual = UTF7enc.GetChars (UTF7Bytes); // "Hi Mom +Jjo-!" is decoded as "Hi Mom !" - AssertEquals ("UTF #1", expected [0], actual [0]); - AssertEquals ("UTF #2", expected [1], actual [1]); - AssertEquals ("UTF #3", expected [2], actual [2]); - AssertEquals ("UTF #4", expected [3], actual [3]); - AssertEquals ("UTF #5", expected [4], actual [4]); - AssertEquals ("UTF #6", expected [5], actual [5]); - AssertEquals ("UTF #7", expected [6], actual [6]); - AssertEquals ("UTF #8", expected [7], actual [7]); - AssertEquals ("UTF #9", expected [8], actual [8]); + Assert.AreEqual (expected [0], actual [0], "UTF #1"); + Assert.AreEqual (expected [1], actual [1], "UTF #2"); + Assert.AreEqual (expected [2], actual [2], "UTF #3"); + Assert.AreEqual (expected [3], actual [3], "UTF #4"); + Assert.AreEqual (expected [4], actual [4], "UTF #5"); + Assert.AreEqual (expected [5], actual [5], "UTF #6"); + Assert.AreEqual (expected [6], actual [6], "UTF #7"); + Assert.AreEqual (expected [7], actual [7], "UTF #8"); + Assert.AreEqual (expected [8], actual [8], "UTF #9"); - AssertEquals ("GetString", UniCodeString, UTF7enc.GetString (UTF7Bytes)); + Assert.AreEqual (UniCodeString, UTF7enc.GetString (UTF7Bytes), "GetString"); } [Test] @@ -216,11 +216,11 @@ namespace MonoTests.System.Text char[] actual = UTF7enc.GetChars (UTF7Bytes); // "+ZeVnLIqe-" is decoded as Japanese "nihongo" - AssertEquals ("UTF #1", expected [0], actual [0]); - AssertEquals ("UTF #2", expected [1], actual [1]); - AssertEquals ("UTF #3", expected [2], actual [2]); + Assert.AreEqual (expected [0], actual [0], "UTF #1"); + Assert.AreEqual (expected [1], actual [1], "UTF #2"); + Assert.AreEqual (expected [2], actual [2], "UTF #3"); - AssertEquals ("GetString", UniCodeString, UTF7enc.GetString (UTF7Bytes)); + Assert.AreEqual (UniCodeString, UTF7enc.GetString (UTF7Bytes), "GetString"); } [Test] @@ -235,28 +235,28 @@ namespace MonoTests.System.Text char[] actual = UTF7enc.GetChars (UTF7Bytes); // "Item 3 is +AKM-1." is decoded as "Item 3 is 1." - AssertEquals ("UTF #1", expected [0], actual [0]); - AssertEquals ("UTF #2", expected [1], actual [1]); - AssertEquals ("UTF #3", expected [2], actual [2]); - AssertEquals ("UTF #4", expected [3], actual [3]); - AssertEquals ("UTF #5", expected [4], actual [4]); - AssertEquals ("UTF #6", expected [5], actual [5]); - AssertEquals ("UTF #7", expected [6], actual [6]); - AssertEquals ("UTF #8", expected [7], actual [7]); - AssertEquals ("UTF #9", expected [8], actual [8]); - AssertEquals ("UTF #10", expected [9], actual [9]); - AssertEquals ("UTF #11", expected [10], actual [10]); - AssertEquals ("UTF #12", expected [11], actual [11]); - AssertEquals ("UTF #13", expected [12], actual [12]); + Assert.AreEqual (expected [0], actual [0], "UTF #1"); + Assert.AreEqual (expected [1], actual [1], "UTF #2"); + Assert.AreEqual (expected [2], actual [2], "UTF #3"); + Assert.AreEqual (expected [3], actual [3], "UTF #4"); + Assert.AreEqual (expected [4], actual [4], "UTF #5"); + Assert.AreEqual (expected [5], actual [5], "UTF #6"); + Assert.AreEqual (expected [6], actual [6], "UTF #7"); + Assert.AreEqual (expected [7], actual [7], "UTF #8"); + Assert.AreEqual (expected [8], actual [8], "UTF #9"); + Assert.AreEqual (expected [9], actual [9], "UTF #10"); + Assert.AreEqual (expected [10], actual [10], "UTF #11"); + Assert.AreEqual (expected [11], actual [11], "UTF #12"); + Assert.AreEqual (expected [12], actual [12], "UTF #13"); - AssertEquals ("GetString", UniCodeString, UTF7enc.GetString (UTF7Bytes)); + Assert.AreEqual (UniCodeString, UTF7enc.GetString (UTF7Bytes), "GetString"); } [Test] public void TestMaxCharCount() { UTF7Encoding UTF7enc = new UTF7Encoding (); - Assertion.AssertEquals ("UTF #1", 50, UTF7enc.GetMaxCharCount(50)); + Assert.AreEqual (50, UTF7enc.GetMaxCharCount(50), "UTF #1"); } [Test] @@ -267,9 +267,9 @@ namespace MonoTests.System.Text { UTF7Encoding UTF7enc = new UTF7Encoding (); #if NET_2_0 - Assertion.AssertEquals ("UTF #1", 152, UTF7enc.GetMaxByteCount(50)); + Assert.AreEqual (152, UTF7enc.GetMaxByteCount(50), "UTF #1"); #else - Assertion.AssertEquals ("UTF #1", 136, UTF7enc.GetMaxByteCount(50)); + Assert.AreEqual (136, UTF7enc.GetMaxByteCount(50), "UTF #1"); #endif } diff --git a/mcs/class/corlib/Test/System.Text/UTF8EncodingTest.cs b/mcs/class/corlib/Test/System.Text/UTF8EncodingTest.cs index cf4310197f1..f4fb2f2dabc 100644 --- a/mcs/class/corlib/Test/System.Text/UTF8EncodingTest.cs +++ b/mcs/class/corlib/Test/System.Text/UTF8EncodingTest.cs @@ -25,7 +25,7 @@ using AssertType = NUnit.Framework.Assert; namespace MonoTests.System.Text { [TestFixture] - public class UTF8EncodingTest : Assertion + public class UTF8EncodingTest { private UTF8Encoding utf8; @@ -38,25 +38,25 @@ namespace MonoTests.System.Text [Test] public void IsBrowserDisplay () { - Assert (utf8.IsBrowserDisplay); + Assert.IsTrue (utf8.IsBrowserDisplay); } [Test] public void IsBrowserSave () { - Assert (utf8.IsBrowserSave); + Assert.IsTrue (utf8.IsBrowserSave); } [Test] public void IsMailNewsDisplay () { - Assert (utf8.IsMailNewsDisplay); + Assert.IsTrue (utf8.IsMailNewsDisplay); } [Test] public void IsMailNewsSave () { - Assert (utf8.IsMailNewsSave); + Assert.IsTrue (utf8.IsMailNewsSave); } [Test] @@ -69,13 +69,13 @@ namespace MonoTests.System.Text // see (RFC 2044) byte[] utf8Bytes = utf8Enc.GetBytes (UniCode); - Assertion.AssertEquals ("UTF #1", 0x41, utf8Bytes [0]); - Assertion.AssertEquals ("UTF #2", 0xE2, utf8Bytes [1]); - Assertion.AssertEquals ("UTF #3", 0x89, utf8Bytes [2]); - Assertion.AssertEquals ("UTF #4", 0xA2, utf8Bytes [3]); - Assertion.AssertEquals ("UTF #5", 0xCE, utf8Bytes [4]); - Assertion.AssertEquals ("UTF #6", 0x91, utf8Bytes [5]); - Assertion.AssertEquals ("UTF #7", 0x2E, utf8Bytes [6]); + Assert.AreEqual (0x41, utf8Bytes [0], "UTF #1"); + Assert.AreEqual (0xE2, utf8Bytes [1], "UTF #2"); + Assert.AreEqual (0x89, utf8Bytes [2], "UTF #3"); + Assert.AreEqual (0xA2, utf8Bytes [3], "UTF #4"); + Assert.AreEqual (0xCE, utf8Bytes [4], "UTF #5"); + Assert.AreEqual (0x91, utf8Bytes [5], "UTF #6"); + Assert.AreEqual (0x2E, utf8Bytes [6], "UTF #7"); } [Test] @@ -89,18 +89,18 @@ namespace MonoTests.System.Text byte[] utf8Bytes = new byte [11]; int ByteCnt = utf8Enc.GetBytes (UniCode.ToCharArray(), 0, UniCode.Length, utf8Bytes, 0); - Assertion.AssertEquals ("UTF #1", 11, ByteCnt); - Assertion.AssertEquals ("UTF #2", 0x48, utf8Bytes [0]); - Assertion.AssertEquals ("UTF #3", 0x69, utf8Bytes [1]); - Assertion.AssertEquals ("UTF #4", 0x20, utf8Bytes [2]); - Assertion.AssertEquals ("UTF #5", 0x4D, utf8Bytes [3]); - Assertion.AssertEquals ("UTF #6", 0x6F, utf8Bytes [4]); - Assertion.AssertEquals ("UTF #7", 0x6D, utf8Bytes [5]); - Assertion.AssertEquals ("UTF #8", 0x20, utf8Bytes [6]); - Assertion.AssertEquals ("UTF #9", 0xE2, utf8Bytes [7]); - Assertion.AssertEquals ("UTF #10", 0x98, utf8Bytes [8]); - Assertion.AssertEquals ("UTF #11", 0xBA, utf8Bytes [9]); - Assertion.AssertEquals ("UTF #12", 0x21, utf8Bytes [10]); + Assert.AreEqual (11, ByteCnt, "UTF #1"); + Assert.AreEqual (0x48, utf8Bytes [0], "UTF #2"); + Assert.AreEqual (0x69, utf8Bytes [1], "UTF #3"); + Assert.AreEqual (0x20, utf8Bytes [2], "UTF #4"); + Assert.AreEqual (0x4D, utf8Bytes [3], "UTF #5"); + Assert.AreEqual (0x6F, utf8Bytes [4], "UTF #6"); + Assert.AreEqual (0x6D, utf8Bytes [5], "UTF #7"); + Assert.AreEqual (0x20, utf8Bytes [6], "UTF #8"); + Assert.AreEqual (0xE2, utf8Bytes [7], "UTF #9"); + Assert.AreEqual (0x98, utf8Bytes [8], "UTF #10"); + Assert.AreEqual (0xBA, utf8Bytes [9], "UTF #11"); + Assert.AreEqual (0x21, utf8Bytes [10], "UTF #12"); } [Test] @@ -112,10 +112,10 @@ namespace MonoTests.System.Text byte[] utf8Bytes = new byte [] {0x41, 0xE2, 0x89, 0xA2, 0xCE, 0x91, 0x2E}; char[] UniCodeChars = utf8Enc.GetChars(utf8Bytes); - Assertion.AssertEquals ("UTF #1", 0x0041, UniCodeChars [0]); - Assertion.AssertEquals ("UTF #2", 0x2262, UniCodeChars [1]); - Assertion.AssertEquals ("UTF #3", 0x0391, UniCodeChars [2]); - Assertion.AssertEquals ("UTF #4", 0x002E, UniCodeChars [3]); + Assert.AreEqual (0x0041, UniCodeChars [0], "UTF #1"); + Assert.AreEqual (0x2262, UniCodeChars [1], "UTF #2"); + Assert.AreEqual (0x0391, UniCodeChars [2], "UTF #3"); + Assert.AreEqual (0x002E, UniCodeChars [3], "UTF #4"); } [Test] @@ -127,9 +127,9 @@ namespace MonoTests.System.Text UTF8Encoding UTF8enc = new UTF8Encoding (); #if NET_2_0 // hmm, where is this extra 1 coming from? - Assertion.AssertEquals ("UTF #1", 51, UTF8enc.GetMaxCharCount(50)); + Assert.AreEqual (51, UTF8enc.GetMaxCharCount(50), "UTF #1"); #else - Assertion.AssertEquals ("UTF #1", 50, UTF8enc.GetMaxCharCount(50)); + Assert.AreEqual (50, UTF8enc.GetMaxCharCount(50), "UTF #1"); #endif } @@ -143,9 +143,9 @@ namespace MonoTests.System.Text #if NET_2_0 // maybe under .NET 2.0 insufficient surrogate pair is // just not handled, and 3 is Preamble size. - Assertion.AssertEquals ("UTF #1", 153, UTF8enc.GetMaxByteCount(50)); + Assert.AreEqual (153, UTF8enc.GetMaxByteCount(50), "UTF #1"); #else - Assertion.AssertEquals ("UTF #1", 200, UTF8enc.GetMaxByteCount(50)); + Assert.AreEqual (200, UTF8enc.GetMaxByteCount(50), "UTF #1"); #endif } @@ -157,31 +157,31 @@ namespace MonoTests.System.Text byte[] data = new byte [] { 0xC0, 0xAF }; #if NET_2_0 - AssertEquals ("#A0", 2, u.GetCharCount (data)); + Assert.AreEqual (2, u.GetCharCount (data), "#A0"); string s = u.GetString (data); - AssertEquals ("#A1", "\uFFFD\uFFFD", s); + Assert.AreEqual ("\uFFFD\uFFFD", s, "#A1"); #else - AssertEquals ("#A0", 0, u.GetCharCount (data)); + Assert.AreEqual (0, u.GetCharCount (data), "#A0"); string s = u.GetString (data); - AssertEquals ("#A1", String.Empty, s); + Assert.AreEqual (String.Empty, s, "#A1"); #endif data = new byte [] { 0x30, 0x31, 0xC0, 0xAF, 0x30, 0x32 }; s = u.GetString (data); #if NET_2_0 - AssertEquals ("#B1", 6, s.Length); - AssertEquals ("#B2", 0x30, (int) s [0]); - AssertEquals ("#B3", 0x31, (int) s [1]); - AssertEquals ("#B4", 0xFFFD, (int) s [2]); - AssertEquals ("#B5", 0xFFFD, (int) s [3]); - AssertEquals ("#B6", 0x30, (int) s [4]); - AssertEquals ("#B7", 0x32, (int) s [5]); + Assert.AreEqual (6, s.Length, "#B1"); + Assert.AreEqual (0x30, (int) s [0], "#B2"); + Assert.AreEqual (0x31, (int) s [1], "#B3"); + Assert.AreEqual (0xFFFD, (int) s [2], "#B4"); + Assert.AreEqual (0xFFFD, (int) s [3], "#B5"); + Assert.AreEqual (0x30, (int) s [4], "#B6"); + Assert.AreEqual (0x32, (int) s [5], "#B7"); #else - AssertEquals ("#B1", 4, s.Length); - AssertEquals ("#B2", 0x30, (int) s [0]); - AssertEquals ("#B3", 0x31, (int) s [1]); - AssertEquals ("#B4", 0x30, (int) s [2]); - AssertEquals ("#B5", 0x32, (int) s [3]); + Assert.AreEqual (4, s.Length, "#B1"); + Assert.AreEqual (0x30, (int) s [0], "#B2"); + Assert.AreEqual (0x31, (int) s [1], "#B3"); + Assert.AreEqual (0x30, (int) s [2], "#B4"); + Assert.AreEqual (0x32, (int) s [3], "#B5"); #endif } @@ -194,7 +194,7 @@ namespace MonoTests.System.Text string s = utf8.GetString (data); // cute but saving source code in unicode can be problematic // so we just ensure we can re-encode this - AssertEquals ("Reconverted", BitConverter.ToString (data), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual (BitConverter.ToString (data), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted"); } [Test] @@ -202,24 +202,24 @@ namespace MonoTests.System.Text { byte[] data211 = { 0x00 }; string s = utf8.GetString (data211); - AssertEquals ("1 byte (U-00000000)", "\0", s); - AssertEquals ("Reconverted-1", BitConverter.ToString (data211), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual ("\0", s, "1 byte (U-00000000)"); + Assert.AreEqual (BitConverter.ToString (data211), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-1"); byte[] data212 = { 0xC2, 0x80 }; s = utf8.GetString (data212); - AssertEquals ("2 bytes (U-00000080)", 128, s [0]); - AssertEquals ("Reconverted-2", BitConverter.ToString (data212), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual (128, s [0], "2 bytes (U-00000080)"); + Assert.AreEqual (BitConverter.ToString (data212), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-2"); byte[] data213 = { 0xE0, 0xA0, 0x80 }; s = utf8.GetString (data213); - AssertEquals ("3 bytes (U-00000800)", 2048, s [0]); - AssertEquals ("Reconverted-3", BitConverter.ToString (data213), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual (2048, s [0], "3 bytes (U-00000800)"); + Assert.AreEqual (BitConverter.ToString (data213), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-3"); byte[] data214 = { 0xF0, 0x90, 0x80, 0x80 }; s = utf8.GetString (data214); - AssertEquals ("4 bytes (U-00010000)-0", 55296, s [0]); - AssertEquals ("4 bytes (U-00010000)-1", 56320, s [1]); - AssertEquals ("Reconverted-4", BitConverter.ToString (data214), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual (55296, s [0], "4 bytes (U-00010000)-0"); + Assert.AreEqual (56320, s [1], "4 bytes (U-00010000)-1"); + Assert.AreEqual (BitConverter.ToString (data214), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-4"); } [Test] @@ -229,8 +229,8 @@ namespace MonoTests.System.Text { byte[] data215 = { 0xF8, 0x88, 0x80, 0x80, 0x80 }; string s = utf8.GetString (data215); - AssertNull ("5 bytes (U-00200000)", s); - AssertEquals ("Reconverted-5", BitConverter.ToString (data215), BitConverter.ToString (utf8.GetBytes (s))); + Assert.IsNull (s, "5 bytes (U-00200000)"); + Assert.AreEqual (BitConverter.ToString (data215), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-5"); } [Test] @@ -240,8 +240,8 @@ namespace MonoTests.System.Text { byte[] data216 = { 0xFC, 0x84, 0x80, 0x80, 0x80, 0x80 }; string s = utf8.GetString (data216); - AssertNull ("6 bytes (U-04000000)", s); - AssertEquals ("Reconverted-6", BitConverter.ToString (data216), BitConverter.ToString (utf8.GetBytes (s))); + Assert.IsNull (s, "6 bytes (U-04000000)"); + Assert.AreEqual (BitConverter.ToString (data216), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-6"); } [Test] @@ -249,18 +249,18 @@ namespace MonoTests.System.Text { byte[] data221 = { 0x7F }; string s = utf8.GetString (data221); - AssertEquals ("1 byte (U-0000007F)", 127, s [0]); - AssertEquals ("Reconverted-1", BitConverter.ToString (data221), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual (127, s [0], "1 byte (U-0000007F)"); + Assert.AreEqual (BitConverter.ToString (data221), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-1"); byte[] data222 = { 0xDF, 0xBF }; s = utf8.GetString (data222); - AssertEquals ("2 bytes (U-000007FF)", 2047, s [0]); - AssertEquals ("Reconverted-2", BitConverter.ToString (data222), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual (2047, s [0], "2 bytes (U-000007FF)"); + Assert.AreEqual (BitConverter.ToString (data222), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-2"); byte[] data223 = { 0xEF, 0xBF, 0xBF }; s = utf8.GetString (data223); - AssertEquals ("3 bytes (U-0000FFFF)", 65535, s [0]); - AssertEquals ("Reconverted-3", BitConverter.ToString (data223), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual (65535, s [0], "3 bytes (U-0000FFFF)"); + Assert.AreEqual (BitConverter.ToString (data223), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-3"); } @@ -271,8 +271,8 @@ namespace MonoTests.System.Text { byte[] data224 = { 0x7F, 0xBF, 0xBF, 0xBF }; string s = utf8.GetString (data224); - AssertNull ("4 bytes (U-001FFFFF)", s); - AssertEquals ("Reconverted-4", BitConverter.ToString (data224), BitConverter.ToString (utf8.GetBytes (s))); + Assert.IsNull (s, "4 bytes (U-001FFFFF)"); + Assert.AreEqual (BitConverter.ToString (data224), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-4"); } [Test] @@ -282,8 +282,8 @@ namespace MonoTests.System.Text { byte[] data225 = { 0xFB, 0xBF, 0xBF, 0xBF, 0xBF }; string s = utf8.GetString (data225); - AssertNull ("5 bytes (U-03FFFFFF)", s); - AssertEquals ("Reconverted-5", BitConverter.ToString (data225), BitConverter.ToString (utf8.GetBytes (s))); + Assert.IsNull (s, "5 bytes (U-03FFFFFF)"); + Assert.AreEqual (BitConverter.ToString (data225), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-5"); } [Test] @@ -293,8 +293,8 @@ namespace MonoTests.System.Text { byte[] data226 = { 0xFD, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF }; string s = utf8.GetString (data226); - AssertNull ("6 bytes (U-7FFFFFFF)", s); - AssertEquals ("Reconverted-6", BitConverter.ToString (data226), BitConverter.ToString (utf8.GetBytes (s))); + Assert.IsNull (s, "6 bytes (U-7FFFFFFF)"); + Assert.AreEqual (BitConverter.ToString (data226), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-6"); } [Test] @@ -302,24 +302,24 @@ namespace MonoTests.System.Text { byte[] data231 = { 0xED, 0x9F, 0xBF }; string s = utf8.GetString (data231); - AssertEquals ("U-0000D7FF", 55295, s [0]); - AssertEquals ("Reconverted-1", BitConverter.ToString (data231), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual (55295, s [0], "U-0000D7FF"); + Assert.AreEqual (BitConverter.ToString (data231), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-1"); byte[] data232 = { 0xEE, 0x80, 0x80 }; s = utf8.GetString (data232); - AssertEquals ("U-0000E000", 57344, s [0]); - AssertEquals ("Reconverted-2", BitConverter.ToString (data232), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual (57344, s [0], "U-0000E000"); + Assert.AreEqual (BitConverter.ToString (data232), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-2"); byte[] data233 = { 0xEF, 0xBF, 0xBD }; s = utf8.GetString (data233); - AssertEquals ("U-0000FFFD", 65533, s [0]); - AssertEquals ("Reconverted-3", BitConverter.ToString (data233), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual (65533, s [0], "U-0000FFFD"); + Assert.AreEqual (BitConverter.ToString (data233), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-3"); byte[] data234 = { 0xF4, 0x8F, 0xBF, 0xBF }; s = utf8.GetString (data234); - AssertEquals ("U-0010FFFF-0", 56319, s [0]); - AssertEquals ("U-0010FFFF-1", 57343, s [1]); - AssertEquals ("Reconverted-4", BitConverter.ToString (data234), BitConverter.ToString (utf8.GetBytes (s))); + Assert.AreEqual (56319, s [0], "U-0010FFFF-0"); + Assert.AreEqual (57343, s [1], "U-0010FFFF-1"); + Assert.AreEqual (BitConverter.ToString (data234), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-4"); } [Test] @@ -329,8 +329,8 @@ namespace MonoTests.System.Text { byte[] data235 = { 0xF4, 0x90, 0x80, 0x80 }; string s = utf8.GetString (data235); - AssertNull ("U-00110000", s); - AssertEquals ("Reconverted-5", BitConverter.ToString (data235), BitConverter.ToString (utf8.GetBytes (s))); + Assert.IsNull (s, "U-00110000"); + Assert.AreEqual (BitConverter.ToString (data235), BitConverter.ToString (utf8.GetBytes (s)), "Reconverted-5"); } [Test] @@ -524,7 +524,7 @@ namespace MonoTests.System.Text try { string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", String.Empty, s); + Assert.AreEqual (String.Empty, s, "MS FX 1.1 behaviour"); } catch (DecoderException) { // but Mono doesn't - better stick to the standard @@ -540,7 +540,7 @@ namespace MonoTests.System.Text try { string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", String.Empty, s); + Assert.AreEqual (String.Empty, s, "MS FX 1.1 behaviour"); } catch (DecoderException) { // but Mono doesn't - better stick to the standard @@ -762,7 +762,7 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xA0, 0x80 }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 55296, s [0]); + Assert.AreEqual (55296, s [0], "MS FX 1.1 behaviour"); } [Test] @@ -778,7 +778,7 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xAD, 0xBF }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 56191, s [0]); + Assert.AreEqual (56191, s [0], "MS FX 1.1 behaviour"); } [Test] @@ -794,7 +794,7 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xAE, 0x80 }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 56192, s [0]); + Assert.AreEqual (56192, s [0], "MS FX 1.1 behaviour"); } [Test] @@ -810,7 +810,7 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xAF, 0xBF }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 56319, s [0]); + Assert.AreEqual (56319, s [0], "MS FX 1.1 behaviour"); } [Test] @@ -826,7 +826,7 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xB0, 0x80 }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 56320, s [0]); + Assert.AreEqual (56320, s [0], "MS FX 1.1 behaviour"); } [Test] @@ -842,7 +842,7 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xBE, 0x80 }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 57216, s [0]); + Assert.AreEqual (57216, s [0], "MS FX 1.1 behaviour"); } [Test] @@ -858,7 +858,7 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xBF, 0xBF }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 57343, s [0]); + Assert.AreEqual (57343, s [0], "MS FX 1.1 behaviour"); } [Test] @@ -874,8 +874,8 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xA0, 0x80, 0xED, 0xB0, 0x80 }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 55296, s [0]); - AssertEquals ("MS FX 1.1 behaviour", 56320, s [1]); + Assert.AreEqual (55296, s [0], "MS FX 1.1 behaviour"); + Assert.AreEqual (56320, s [1], "MS FX 1.1 behaviour"); } [Test] @@ -891,8 +891,8 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xA0, 0x80, 0xED, 0xBF, 0xBF }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 55296, s [0]); - AssertEquals ("MS FX 1.1 behaviour", 57343, s [1]); + Assert.AreEqual (55296, s [0], "MS FX 1.1 behaviour"); + Assert.AreEqual (57343, s [1], "MS FX 1.1 behaviour"); } [Test] @@ -908,8 +908,8 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xAD, 0xBF, 0xED, 0xB0, 0x80 }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 56191, s [0]); - AssertEquals ("MS FX 1.1 behaviour", 56320, s [1]); + Assert.AreEqual (56191, s [0], "MS FX 1.1 behaviour"); + Assert.AreEqual (56320, s [1], "MS FX 1.1 behaviour"); } [Test] @@ -925,8 +925,8 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xAD, 0xBF, 0xED, 0xBF, 0xBF }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 56191, s [0]); - AssertEquals ("MS FX 1.1 behaviour", 57343, s [1]); + Assert.AreEqual (56191, s [0], "MS FX 1.1 behaviour"); + Assert.AreEqual (57343, s [1], "MS FX 1.1 behaviour"); } [Test] @@ -942,8 +942,8 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xAE, 0x80, 0xED, 0xB0, 0x80 }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 56192, s [0]); - AssertEquals ("MS FX 1.1 behaviour", 56320, s [1]); + Assert.AreEqual (56192, s [0], "MS FX 1.1 behaviour"); + Assert.AreEqual (56320, s [1], "MS FX 1.1 behaviour"); } [Test] @@ -959,8 +959,8 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xAE, 0x80, 0xED, 0xBF, 0x8F }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 56192, s [0]); - AssertEquals ("MS FX 1.1 behaviour", 57295, s [1]); + Assert.AreEqual (56192, s [0], "MS FX 1.1 behaviour"); + Assert.AreEqual (57295, s [1], "MS FX 1.1 behaviour"); } [Test] @@ -976,8 +976,8 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xAF, 0xBF, 0xED, 0xB0, 0x80 }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 56319, s [0]); - AssertEquals ("MS FX 1.1 behaviour", 56320, s [1]); + Assert.AreEqual (56319, s [0], "MS FX 1.1 behaviour"); + Assert.AreEqual (56320, s [1], "MS FX 1.1 behaviour"); } [Test] @@ -993,8 +993,8 @@ namespace MonoTests.System.Text byte[] data = { 0xED, 0xAF, 0xBF, 0xED, 0xBF, 0xBF }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 56319, s [0]); - AssertEquals ("MS FX 1.1 behaviour", 57343, s [1]); + Assert.AreEqual (56319, s [0], "MS FX 1.1 behaviour"); + Assert.AreEqual (57343, s [1], "MS FX 1.1 behaviour"); } [Test] @@ -1005,7 +1005,7 @@ namespace MonoTests.System.Text byte[] data = { 0xEF, 0xBF, 0xBE }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 65534, s [0]); + Assert.AreEqual (65534, s [0], "MS FX 1.1 behaviour"); } [Test] @@ -1016,7 +1016,7 @@ namespace MonoTests.System.Text byte[] data = { 0xEF, 0xBF, 0xBF }; string s = utf8.GetString (data); // exception is "really" expected here - AssertEquals ("MS FX 1.1 behaviour", 65535, s [0]); + Assert.AreEqual (65535, s [0], "MS FX 1.1 behaviour"); } [Test] @@ -1026,15 +1026,15 @@ namespace MonoTests.System.Text byte [] data = new byte [] {0xEF, 0xBB, 0xBF}; Encoding enc = new UTF8Encoding (false, true); string s = enc.GetString (data); - AssertEquals ("\uFEFF", s); + Assert.AreEqual (s, "\uFEFF"); Encoding utf = Encoding.UTF8; char[] testChars = {'\uFEFF','A'}; byte[] bytes = utf.GetBytes(testChars); char[] chars = utf.GetChars(bytes); - AssertEquals ("#1", '\uFEFF', chars [0]); - AssertEquals ("#2", 'A', chars [1]); + Assert.AreEqual ('\uFEFF', chars [0], "#1"); + Assert.AreEqual ('A', chars [1], "#2"); } #if NET_2_0 @@ -1043,7 +1043,7 @@ namespace MonoTests.System.Text { Encoding e = Encoding.GetEncoding (65001).Clone () as Encoding; - AssertEquals (false, e.IsReadOnly); + Assert.AreEqual (false, e.IsReadOnly); e.EncoderFallback = new EncoderExceptionFallback (); } #endif @@ -1072,9 +1072,9 @@ namespace MonoTests.System.Text try { int ret = e.GetBytes (chars, 1, 0, bytes, 0, true); #if NET_2_0 - AssertEquals ("drop insufficient char in 2.0: char[]", 0, ret); + Assert.AreEqual (0, ret, "drop insufficient char in 2.0: char[]"); #else - Fail ("ArgumentException is expected: char[]"); + Assert.Fail ("ArgumentException is expected: char[]"); #endif } catch (ArgumentException) { } @@ -1083,9 +1083,9 @@ namespace MonoTests.System.Text try { int ret = Encoding.UTF8.GetBytes (s, 0, 1, bytes, 0); #if NET_2_0 - AssertEquals ("drop insufficient char in 2.0: string", 0, ret); + Assert.AreEqual (0, ret, "drop insufficient char in 2.0: string"); #else - Fail ("ArgumentException is expected: string"); + Assert.Fail ("ArgumentException is expected: string"); #endif } catch (ArgumentException) { } diff --git a/mcs/class/corlib/Test/System.Text/UnicodeEncodingTest.cs b/mcs/class/corlib/Test/System.Text/UnicodeEncodingTest.cs index afb682fba47..b4ef5970124 100644 --- a/mcs/class/corlib/Test/System.Text/UnicodeEncodingTest.cs +++ b/mcs/class/corlib/Test/System.Text/UnicodeEncodingTest.cs @@ -52,10 +52,10 @@ namespace MonoTests.System.Text UnicodeEncoding UnicodeEnc = new UnicodeEncoding (); //little-endian UniBytes = UnicodeEnc.GetBytes (Unicode); - Assertion.AssertEquals ("Uni #1", 0xA0, UniBytes [0]); - Assertion.AssertEquals ("Uni #2", 0x03, UniBytes [1]); - Assertion.AssertEquals ("Uni #3", 0xA3, UniBytes [2]); - Assertion.AssertEquals ("Uni #4", 0x03, UniBytes [3]); + Assert.AreEqual (0xA0, UniBytes [0], "Uni #1"); + Assert.AreEqual (0x03, UniBytes [1], "Uni #2"); + Assert.AreEqual (0xA3, UniBytes [2], "Uni #3"); + Assert.AreEqual (0x03, UniBytes [3], "Uni #4"); } [Test] @@ -67,10 +67,10 @@ namespace MonoTests.System.Text UnicodeEncoding UnicodeEnc = new UnicodeEncoding (true, true); //big-endian UniBytes = UnicodeEnc.GetBytes (Unicode); - Assertion.AssertEquals ("Uni #1", 0x03, UniBytes [0]); - Assertion.AssertEquals ("Uni #2", 0xA0, UniBytes [1]); - Assertion.AssertEquals ("Uni #3", 0x03, UniBytes [2]); - Assertion.AssertEquals ("Uni #4", 0xA3, UniBytes [3]); + Assert.AreEqual (0x03, UniBytes [0], "Uni #1"); + Assert.AreEqual (0xA0, UniBytes [1], "Uni #2"); + Assert.AreEqual (0x03, UniBytes [2], "Uni #3"); + Assert.AreEqual (0xA3, UniBytes [3], "Uni #4"); } [Test] @@ -82,11 +82,11 @@ namespace MonoTests.System.Text UnicodeEncoding UnicodeEnc = new UnicodeEncoding (); //little-endian int Cnt = UnicodeEnc.GetBytes (Unicode.ToCharArray(), 0, Unicode.Length, UniBytes, 0); - Assertion.AssertEquals ("Uni #1", 4, Cnt); - Assertion.AssertEquals ("Uni #2", 0xA0, UniBytes [0]); - Assertion.AssertEquals ("Uni #3", 0x03, UniBytes [1]); - Assertion.AssertEquals ("Uni #4", 0xA3, UniBytes [2]); - Assertion.AssertEquals ("Uni #5", 0x03, UniBytes [3]); + Assert.AreEqual (4, Cnt, "Uni #1"); + Assert.AreEqual (0xA0, UniBytes [0], "Uni #2"); + Assert.AreEqual (0x03, UniBytes [1], "Uni #3"); + Assert.AreEqual (0xA3, UniBytes [2], "Uni #4"); + Assert.AreEqual (0x03, UniBytes [3], "Uni #5"); } [Test] @@ -101,7 +101,7 @@ namespace MonoTests.System.Text char[] UniChars = UnicodeEnc.GetChars (UniBytes); string Result = new string(UniChars); - Assertion.AssertEquals ("Uni #1", Unicode, Result); + Assert.AreEqual (Unicode, Result, "Uni #1"); } [Test] @@ -116,7 +116,7 @@ namespace MonoTests.System.Text char[] UniChars = UnicodeEnc.GetChars (UniBytes); string Result = new string(UniChars); - Assertion.AssertEquals ("Uni #1", Unicode, Result); + Assert.AreEqual (Unicode, Result, "Uni #1"); } [Test] @@ -125,8 +125,8 @@ namespace MonoTests.System.Text byte[] b = new byte[] {255, 254, 115, 0, 104, 0, 105, 0}; UnicodeEncoding encoding = new UnicodeEncoding (); - Assertion.AssertEquals ("GetCharCount #1", 3, - encoding.GetCharCount (b, 2, b.Length - 2)); + Assert.AreEqual (3, encoding.GetCharCount (b, 2, b.Length - 2), + "GetCharCount #1"); } @@ -138,8 +138,8 @@ namespace MonoTests.System.Text UnicodeEncoding UnicodeEnc = new UnicodeEncoding (false, true); byte[] PreAmble = UnicodeEnc.GetPreamble(); - Assertion.AssertEquals ("Uni #1", 0xFF, PreAmble [0]); - Assertion.AssertEquals ("Uni #2", 0xFE, PreAmble [1]); + Assert.AreEqual (0xFF, PreAmble [0], "Uni #1"); + Assert.AreEqual (0xFE, PreAmble [1], "Uni #2"); } [Test] @@ -149,8 +149,8 @@ namespace MonoTests.System.Text UnicodeEncoding UnicodeEnc = new UnicodeEncoding (true, true); byte[] PreAmble = UnicodeEnc.GetPreamble(); - Assertion.AssertEquals ("Uni #1", 0xFE, PreAmble [0]); - Assertion.AssertEquals ("Uni #2", 0xFF, PreAmble [1]); + Assert.AreEqual (0xFE, PreAmble [0], "Uni #1"); + Assert.AreEqual (0xFF, PreAmble [1], "Uni #2"); } [Test] @@ -160,7 +160,7 @@ namespace MonoTests.System.Text UnicodeEncoding UnicodeEnc = new UnicodeEncoding (false, false); byte[] PreAmble = UnicodeEnc.GetPreamble(); - Assertion.AssertEquals ("Uni #1", 0, PreAmble.Length); + Assert.AreEqual (0, PreAmble.Length, "Uni #1"); } [Test] @@ -172,10 +172,10 @@ namespace MonoTests.System.Text UnicodeEncoding UnicodeEnc = new UnicodeEncoding (); #if NET_2_0 // where is this extra 1 coming from? - Assertion.AssertEquals ("UTF #1", 26, UnicodeEnc.GetMaxCharCount(50)); - Assertion.AssertEquals ("UTF #2", 27, UnicodeEnc.GetMaxCharCount(51)); + Assert.AreEqual (26, UnicodeEnc.GetMaxCharCount(50), "UTF #1"); + Assert.AreEqual (27, UnicodeEnc.GetMaxCharCount(51), "UTF #2"); #else - Assertion.AssertEquals ("UTF #1", 25, UnicodeEnc.GetMaxCharCount(50)); + Assert.AreEqual (25, UnicodeEnc.GetMaxCharCount(50), "UTF #1"); #endif } @@ -188,9 +188,9 @@ namespace MonoTests.System.Text UnicodeEncoding UnicodeEnc = new UnicodeEncoding (); #if NET_2_0 // is this extra 2 BOM? - Assertion.AssertEquals ("UTF #1", 102, UnicodeEnc.GetMaxByteCount(50)); + Assert.AreEqual (102, UnicodeEnc.GetMaxByteCount(50), "UTF #1"); #else - Assertion.AssertEquals ("UTF #1", 100, UnicodeEnc.GetMaxByteCount(50)); + Assert.AreEqual (100, UnicodeEnc.GetMaxByteCount(50), "UTF #1"); #endif } @@ -222,16 +222,16 @@ namespace MonoTests.System.Text UnicodeEncoding encoding; encoding = new UnicodeEncoding (false, true); - Assertion.AssertEquals ("BOM #1", encoding.GetBytes (littleEndianString), littleEndianBytes); - Assertion.AssertEquals ("BOM #2", encoding.GetBytes (bigEndianString), bigEndianBytes); - Assertion.AssertEquals ("BOM #3", encoding.GetString (littleEndianBytes), littleEndianString); - Assertion.AssertEquals ("BOM #4", encoding.GetString (bigEndianBytes), bigEndianString); + Assert.AreEqual (encoding.GetBytes (littleEndianString), littleEndianBytes, "BOM #1"); + Assert.AreEqual (encoding.GetBytes (bigEndianString), bigEndianBytes, "BOM #2"); + Assert.AreEqual (encoding.GetString (littleEndianBytes), littleEndianString, "BOM #3"); + Assert.AreEqual (encoding.GetString (bigEndianBytes), bigEndianString, "BOM #4"); encoding = new UnicodeEncoding (true, true); - Assertion.AssertEquals ("BOM #5", encoding.GetBytes (littleEndianString), bigEndianBytes); - Assertion.AssertEquals ("BOM #6", encoding.GetBytes (bigEndianString), littleEndianBytes); - Assertion.AssertEquals ("BOM #7", encoding.GetString (littleEndianBytes), bigEndianString); - Assertion.AssertEquals ("BOM #8", encoding.GetString (bigEndianBytes), littleEndianString); + Assert.AreEqual (encoding.GetBytes (littleEndianString), bigEndianBytes, "BOM #5"); + Assert.AreEqual (encoding.GetBytes (bigEndianString), littleEndianBytes, "BOM #6"); + Assert.AreEqual (encoding.GetString (littleEndianBytes), bigEndianString, "BOM #7"); + Assert.AreEqual (encoding.GetString (bigEndianBytes), littleEndianString, "BOM #8"); } } } diff --git a/mcs/class/corlib/Test/System.Threading/ChangeLog b/mcs/class/corlib/Test/System.Threading/ChangeLog index c2ca509cfae..98285683650 100644 --- a/mcs/class/corlib/Test/System.Threading/ChangeLog +++ b/mcs/class/corlib/Test/System.Threading/ChangeLog @@ -1,3 +1,7 @@ +2009-06-20 Zoltan Varga + + * *.cs: Convert all tests to new-style nunit classes/methods. + 2009-01-05 Zoltan Varga * ExecutionContextTest.cs (Copy_FromThread): Disable this test, it doesn't diff --git a/mcs/class/corlib/Test/System.Threading/MonitorTest.cs b/mcs/class/corlib/Test/System.Threading/MonitorTest.cs index 02f9225a91e..3df2f1d9ff7 100644 --- a/mcs/class/corlib/Test/System.Threading/MonitorTest.cs +++ b/mcs/class/corlib/Test/System.Threading/MonitorTest.cs @@ -14,7 +14,7 @@ using System.Threading; namespace MonoTests.System.Threading { [TestFixture] - public class MonitorTest : Assertion { + public class MonitorTest { [Test] public void ExitNoEnter () diff --git a/mcs/class/corlib/Test/System.Threading/MutexTest.cs b/mcs/class/corlib/Test/System.Threading/MutexTest.cs index 0e6f1ffe4c1..64aeed5d944 100644 --- a/mcs/class/corlib/Test/System.Threading/MutexTest.cs +++ b/mcs/class/corlib/Test/System.Threading/MutexTest.cs @@ -91,7 +91,7 @@ namespace MonoTests.System.Threading Thread thread1 = new Thread(new ThreadStart(class1.WithoutWait)); thread1.Start(); while(thread1.IsAlive); - AssertEquals("#02 The default value of The mutex wrong set:",class1.id,class1.marker); + Assert.AreEqual(class1.id,class1.marker); } [Test] @@ -102,7 +102,7 @@ namespace MonoTests.System.Threading Thread thread1 = new Thread(new ThreadStart(class1.WithoutWait)); thread1.Start(); while(thread1.IsAlive); - AssertEquals("#03 The value of The mutex wrong set:",class1.id,class1.marker); + Assert.AreEqual(class1.id,class1.marker); } [Test] @@ -113,7 +113,7 @@ namespace MonoTests.System.Threading Thread thread1 = new Thread(new ThreadStart(class1.WithoutWait)); thread1.Start(); while(thread1.IsAlive); - AssertEquals("#04 The default value of The mutex wrong set:",class1.id,class1.marker); + Assert.AreEqual(class1.id,class1.marker); } */ diff --git a/mcs/class/corlib/Test/System.Threading/ReaderWriterLockTest.cs b/mcs/class/corlib/Test/System.Threading/ReaderWriterLockTest.cs index 7e2a7f25d33..bead1dcd9e7 100644 --- a/mcs/class/corlib/Test/System.Threading/ReaderWriterLockTest.cs +++ b/mcs/class/corlib/Test/System.Threading/ReaderWriterLockTest.cs @@ -1,358 +1,358 @@ -// -// ReaderWriterLockTest.cs - NUnit Test Cases for System.Threading.ReaderWriterLock -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2004 Novell, Inc (http://www.novell.com) -// - -using NUnit.Framework; -using System; -using System.Threading; - -namespace MonoTests.System.Threading -{ +// +// ReaderWriterLockTest.cs - NUnit Test Cases for System.Threading.ReaderWriterLock +// +// Author: +// Lluis Sanchez Gual (lluis@ximian.com) +// +// (C) 2004 Novell, Inc (http://www.novell.com) +// + +using NUnit.Framework; +using System; +using System.Threading; + +namespace MonoTests.System.Threading +{ [TestFixture] // DISABLED due to random hangs. Do not renable until you can run this // a few thousand times on an SMP box. [Category ("NotWorking")] - public class ReaderWriterLockTest : Assertion - { - ReaderWriterLock rwlock; - - class ThreadRunner - { - public ThreadStart SecondaryThread; - public Exception ResultException; - public Thread RunningThread; - - public void Run () - { - try - { - SecondaryThread(); - } - catch (Exception ex) - { - ResultException = ex; - } - } - - public void Join () - { - RunningThread.Join (5000); - if (ResultException != null) throw ResultException; - } - } - - void RunThread (ThreadStart ts) - { - ThreadRunner tr = StartThread (ts); - tr.Join (); - } - - ThreadRunner StartThread (ThreadStart ts) - { - ThreadRunner tr = new ThreadRunner(); - tr.SecondaryThread = ts; - Thread t = new Thread (new ThreadStart (tr.Run)); - tr.RunningThread = t; - t.Start (); - return tr; - } - + public class ReaderWriterLockTest + { + ReaderWriterLock rwlock; + + class ThreadRunner + { + public ThreadStart SecondaryThread; + public Exception ResultException; + public Thread RunningThread; + + public void Run () + { + try + { + SecondaryThread(); + } + catch (Exception ex) + { + ResultException = ex; + } + } + + public void Join () + { + RunningThread.Join (5000); + if (ResultException != null) throw ResultException; + } + } + + void RunThread (ThreadStart ts) + { + ThreadRunner tr = StartThread (ts); + tr.Join (); + } + + ThreadRunner StartThread (ThreadStart ts) + { + ThreadRunner tr = new ThreadRunner(); + tr.SecondaryThread = ts; + Thread t = new Thread (new ThreadStart (tr.Run)); + tr.RunningThread = t; + t.Start (); + return tr; + } + [Test] - public void TestIsReaderLockHeld () - { - rwlock = new ReaderWriterLock (); - Assert ("a1", !rwlock.IsReaderLockHeld); - rwlock.AcquireReaderLock (500); - Assert ("a2", rwlock.IsReaderLockHeld); - RunThread (new ThreadStart (IsReaderLockHeld_2)); - rwlock.ReleaseReaderLock (); - } - - private void IsReaderLockHeld_2 () - { - Assert ("a3", !rwlock.IsReaderLockHeld); - } - - [Test] - public void TestIsWriterLockHeld () - { - rwlock = new ReaderWriterLock (); - Assert ("a1", !rwlock.IsWriterLockHeld); - rwlock.AcquireWriterLock (500); - Assert ("a2", rwlock.IsWriterLockHeld); - RunThread (new ThreadStart (IsWriterLockHeld_2)); - rwlock.ReleaseWriterLock (); - } - - private void IsWriterLockHeld_2 () - { - Assert ("a3", !rwlock.IsWriterLockHeld); - } - - [Test] - public void TestAcquireLocks () - { - rwlock = new ReaderWriterLock (); - rwlock.AcquireReaderLock (500); - rwlock.AcquireReaderLock (500); - rwlock.ReleaseReaderLock (); - Assert ("a1", rwlock.IsReaderLockHeld); - RunThread (new ThreadStart (AcquireLock_readerWorks)); - Assert ("a2", rwlock.IsReaderLockHeld); - - RunThread (new ThreadStart (AcquireLock_writerFails)); - rwlock.ReleaseReaderLock (); - Assert ("a6", !rwlock.IsReaderLockHeld); - - RunThread (new ThreadStart (AcquireLock_writerWorks)); - - rwlock.AcquireWriterLock (200); - RunThread (new ThreadStart (AcquireLock_writerFails)); - RunThread (new ThreadStart (AcquireLock_readerFails)); - rwlock.ReleaseWriterLock (); - } - - void AcquireLock_readerWorks () - { - rwlock.AcquireReaderLock (200); - rwlock.AcquireReaderLock (200); - rwlock.ReleaseReaderLock (); - Assert ("a3", rwlock.IsReaderLockHeld); - rwlock.ReleaseReaderLock (); - Assert ("a4", !rwlock.IsReaderLockHeld); - } - - void AcquireLock_writerFails () - { - try - { - rwlock.AcquireWriterLock (200); - rwlock.ReleaseWriterLock (); - throw new Exception ("Should not get writer lock"); - } - catch (Exception) - { - } - } - - void AcquireLock_writerWorks () - { - rwlock.AcquireWriterLock (200); - rwlock.ReleaseWriterLock (); - } - - void AcquireLock_readerFails () - { - try - { - rwlock.AcquireReaderLock (200); - rwlock.ReleaseReaderLock (); - throw new Exception ("Should not get reader lock"); - } - catch (Exception) - { - } - } - - [Test] - public void TestReleaseRestoreReaderLock () - { - rwlock = new ReaderWriterLock (); - rwlock.AcquireReaderLock (500); - rwlock.AcquireReaderLock (500); - Assert ("r1", rwlock.IsReaderLockHeld); - - LockCookie co = rwlock.ReleaseLock (); - RunThread (new ThreadStart (AcquireLock_writerWorks)); - - rwlock.RestoreLock (ref co); - RunThread (new ThreadStart (AcquireLock_writerFails)); - - rwlock.ReleaseReaderLock (); - Assert ("r2", rwlock.IsReaderLockHeld); - rwlock.ReleaseReaderLock (); - Assert ("r3", !rwlock.IsReaderLockHeld); - } - - [Test] - public void TestReleaseRestoreWriterLock () - { - rwlock = new ReaderWriterLock (); - rwlock.AcquireWriterLock (500); - rwlock.AcquireWriterLock (500); - Assert ("w1", rwlock.IsWriterLockHeld); - - LockCookie co = rwlock.ReleaseLock (); - RunThread (new ThreadStart (AcquireLock_readerWorks)); - - rwlock.RestoreLock (ref co); - RunThread (new ThreadStart (AcquireLock_readerFails)); - - rwlock.ReleaseWriterLock (); - Assert ("w2", rwlock.IsWriterLockHeld); - rwlock.ReleaseWriterLock (); - Assert ("w3", !rwlock.IsWriterLockHeld); - } - - [Test] - public void TestUpgradeDowngradeLock () - { - rwlock = new ReaderWriterLock (); - rwlock.AcquireReaderLock (200); - rwlock.AcquireReaderLock (200); - - LockCookie co = rwlock.UpgradeToWriterLock (200); - Assert ("u1", !rwlock.IsReaderLockHeld); - Assert ("u2", rwlock.IsWriterLockHeld); - RunThread (new ThreadStart (AcquireLock_writerFails)); - - rwlock.DowngradeFromWriterLock (ref co); - Assert ("u3", rwlock.IsReaderLockHeld); - Assert ("u4", !rwlock.IsWriterLockHeld); - RunThread (new ThreadStart (AcquireLock_readerWorks)); - - rwlock.ReleaseReaderLock (); - Assert ("u5", rwlock.IsReaderLockHeld); - rwlock.ReleaseReaderLock (); - Assert ("u6", !rwlock.IsReaderLockHeld); - } - - [Test] - public void TestReaderInsideWriter () - { - // Reader acquires and releases work like the writer equivalent - - rwlock = new ReaderWriterLock (); - rwlock.AcquireWriterLock (-1); - rwlock.AcquireReaderLock (-1); - Assert ("u1", !rwlock.IsReaderLockHeld); - Assert ("u2", rwlock.IsWriterLockHeld); - rwlock.AcquireReaderLock (-1); - Assert ("u3", !rwlock.IsReaderLockHeld); - Assert ("u4", rwlock.IsWriterLockHeld); - rwlock.ReleaseWriterLock (); - Assert ("u5", !rwlock.IsReaderLockHeld); - Assert ("u6", rwlock.IsWriterLockHeld); - rwlock.ReleaseReaderLock (); - Assert ("u7", !rwlock.IsReaderLockHeld); - Assert ("u8", rwlock.IsWriterLockHeld); - rwlock.ReleaseReaderLock (); - Assert ("u9", !rwlock.IsReaderLockHeld); - Assert ("u10", !rwlock.IsWriterLockHeld); - } - - [Test] - public void TestReaderMustWaitWriter () - { - // A thread cannot get the reader lock if there are other threads - // waiting for the writer lock. - - rwlock = new ReaderWriterLock (); - rwlock.AcquireWriterLock (200); - - ThreadRunner tr = StartThread (new ThreadStart (ReaderMustWaitWriter_2)); - Thread.Sleep (200); - - RunThread (new ThreadStart (AcquireLock_readerFails)); - - rwlock.ReleaseReaderLock (); - tr.Join (); - } - - void ReaderMustWaitWriter_2 () - { - rwlock.AcquireWriterLock (2000); - rwlock.ReleaseWriterLock (); - } - - [Test] - public void TestBug_55911 () - { - rwlock = new ReaderWriterLock (); - - rwlock.AcquireReaderLock (Timeout.Infinite); - try { - LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite); - } - finally { rwlock.ReleaseReaderLock(); } - - rwlock.AcquireReaderLock (Timeout.Infinite); - try { - LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite); - } - finally { rwlock.ReleaseReaderLock(); } - } - - [Test] - public void TestBug_55909 () - { - rwlock = new ReaderWriterLock (); - ThreadRunner tr = StartThread (new ThreadStart(Bug_55909_Thread2)); - Thread.Sleep (200); - rwlock.AcquireReaderLock (Timeout.Infinite); - try { - LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite); - Thread.Sleep (500); - } - finally { rwlock.ReleaseReaderLock(); } - - tr.Join (); - } - - public void Bug_55909_Thread2 () - { - rwlock.AcquireReaderLock(Timeout.Infinite); - try { - Thread.Sleep (1000); - LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite); - Thread.Sleep (500); - } - finally { rwlock.ReleaseReaderLock(); } - } - - [Test] - public void TestBug_55909_bis () - { - rwlock = new ReaderWriterLock (); - ThreadRunner tr1 = StartThread (new ThreadStart(Bug_55909_bis_ReaderWriter)); - Thread.Sleep(100); - ThreadRunner tr2 = StartThread (new ThreadStart(Bug_55909_bis_Reader)); - Thread.Sleep(100); - ThreadRunner tr3 = StartThread (new ThreadStart(Bug_55909_bis_Writer)); - Thread.Sleep(100); - ThreadRunner tr4 = StartThread (new ThreadStart(Bug_55909_bis_Reader)); - tr1.Join (); - tr2.Join (); - tr3.Join (); - tr4.Join (); - } - - void Bug_55909_bis_Reader () - { - rwlock.AcquireReaderLock(-1); - Thread.Sleep(2000); - rwlock.ReleaseReaderLock(); - } - - void Bug_55909_bis_ReaderWriter () - { - rwlock.AcquireReaderLock(-1); - LockCookie lc = rwlock.UpgradeToWriterLock(-1); - Thread.Sleep(1000); - rwlock.DowngradeFromWriterLock(ref lc); - rwlock.ReleaseReaderLock(); - } - - void Bug_55909_bis_Writer () - { - rwlock.AcquireWriterLock(-1); - rwlock.ReleaseWriterLock(); - } - - } + public void TestIsReaderLockHeld () + { + rwlock = new ReaderWriterLock (); + Assert.IsTrue (!rwlock.IsReaderLockHeld, "#1"); + rwlock.AcquireReaderLock (500); + Assert.IsTrue (rwlock.IsReaderLockHeld, "#1"); + RunThread (new ThreadStart (IsReaderLockHeld_2)); + rwlock.ReleaseReaderLock (); + } + + private void IsReaderLockHeld_2 () + { + Assert.IsTrue (!rwlock.IsReaderLockHeld); + } + + [Test] + public void TestIsWriterLockHeld () + { + rwlock = new ReaderWriterLock (); + Assert.IsTrue (!rwlock.IsWriterLockHeld, "#1"); + rwlock.AcquireWriterLock (500); + Assert.IsTrue (rwlock.IsWriterLockHeld, "#2"); + RunThread (new ThreadStart (IsWriterLockHeld_2)); + rwlock.ReleaseWriterLock (); + } + + private void IsWriterLockHeld_2 () + { + Assert.IsTrue (!rwlock.IsWriterLockHeld); + } + + [Test] + public void TestAcquireLocks () + { + rwlock = new ReaderWriterLock (); + rwlock.AcquireReaderLock (500); + rwlock.AcquireReaderLock (500); + rwlock.ReleaseReaderLock (); + Assert.IsTrue (rwlock.IsReaderLockHeld, "#1"); + RunThread (new ThreadStart (AcquireLock_readerWorks)); + Assert.IsTrue (rwlock.IsReaderLockHeld); + + RunThread (new ThreadStart (AcquireLock_writerFails)); + rwlock.ReleaseReaderLock (); + Assert.IsTrue (!rwlock.IsReaderLockHeld); + + RunThread (new ThreadStart (AcquireLock_writerWorks)); + + rwlock.AcquireWriterLock (200); + RunThread (new ThreadStart (AcquireLock_writerFails)); + RunThread (new ThreadStart (AcquireLock_readerFails)); + rwlock.ReleaseWriterLock (); + } + + void AcquireLock_readerWorks () + { + rwlock.AcquireReaderLock (200); + rwlock.AcquireReaderLock (200); + rwlock.ReleaseReaderLock (); + Assert.IsTrue (rwlock.IsReaderLockHeld); + rwlock.ReleaseReaderLock (); + Assert.IsTrue (!rwlock.IsReaderLockHeld); + } + + void AcquireLock_writerFails () + { + try + { + rwlock.AcquireWriterLock (200); + rwlock.ReleaseWriterLock (); + throw new Exception ("Should not get writer lock"); + } + catch (Exception) + { + } + } + + void AcquireLock_writerWorks () + { + rwlock.AcquireWriterLock (200); + rwlock.ReleaseWriterLock (); + } + + void AcquireLock_readerFails () + { + try + { + rwlock.AcquireReaderLock (200); + rwlock.ReleaseReaderLock (); + throw new Exception ("Should not get reader lock"); + } + catch (Exception) + { + } + } + + [Test] + public void TestReleaseRestoreReaderLock () + { + rwlock = new ReaderWriterLock (); + rwlock.AcquireReaderLock (500); + rwlock.AcquireReaderLock (500); + Assert.IsTrue (rwlock.IsReaderLockHeld); + + LockCookie co = rwlock.ReleaseLock (); + RunThread (new ThreadStart (AcquireLock_writerWorks)); + + rwlock.RestoreLock (ref co); + RunThread (new ThreadStart (AcquireLock_writerFails)); + + rwlock.ReleaseReaderLock (); + Assert.IsTrue (rwlock.IsReaderLockHeld); + rwlock.ReleaseReaderLock (); + Assert.IsTrue (!rwlock.IsReaderLockHeld); + } + + [Test] + public void TestReleaseRestoreWriterLock () + { + rwlock = new ReaderWriterLock (); + rwlock.AcquireWriterLock (500); + rwlock.AcquireWriterLock (500); + Assert.IsTrue (rwlock.IsWriterLockHeld); + + LockCookie co = rwlock.ReleaseLock (); + RunThread (new ThreadStart (AcquireLock_readerWorks)); + + rwlock.RestoreLock (ref co); + RunThread (new ThreadStart (AcquireLock_readerFails)); + + rwlock.ReleaseWriterLock (); + Assert.IsTrue (rwlock.IsWriterLockHeld); + rwlock.ReleaseWriterLock (); + Assert.IsTrue (!rwlock.IsWriterLockHeld); + } + + [Test] + public void TestUpgradeDowngradeLock () + { + rwlock = new ReaderWriterLock (); + rwlock.AcquireReaderLock (200); + rwlock.AcquireReaderLock (200); + + LockCookie co = rwlock.UpgradeToWriterLock (200); + Assert.IsTrue (!rwlock.IsReaderLockHeld); + Assert.IsTrue (rwlock.IsWriterLockHeld); + RunThread (new ThreadStart (AcquireLock_writerFails)); + + rwlock.DowngradeFromWriterLock (ref co); + Assert.IsTrue (rwlock.IsReaderLockHeld); + Assert.IsTrue (!rwlock.IsWriterLockHeld); + RunThread (new ThreadStart (AcquireLock_readerWorks)); + + rwlock.ReleaseReaderLock (); + Assert.IsTrue (rwlock.IsReaderLockHeld); + rwlock.ReleaseReaderLock (); + Assert.IsTrue (!rwlock.IsReaderLockHeld); + } + + [Test] + public void TestReaderInsideWriter () + { + // Reader acquires and releases work like the writer equivalent + + rwlock = new ReaderWriterLock (); + rwlock.AcquireWriterLock (-1); + rwlock.AcquireReaderLock (-1); + Assert.IsTrue (!rwlock.IsReaderLockHeld); + Assert.IsTrue (rwlock.IsWriterLockHeld); + rwlock.AcquireReaderLock (-1); + Assert.IsTrue (!rwlock.IsReaderLockHeld); + Assert.IsTrue (rwlock.IsWriterLockHeld); + rwlock.ReleaseWriterLock (); + Assert.IsTrue (!rwlock.IsReaderLockHeld); + Assert.IsTrue (rwlock.IsWriterLockHeld); + rwlock.ReleaseReaderLock (); + Assert.IsTrue (!rwlock.IsReaderLockHeld); + Assert.IsTrue (rwlock.IsWriterLockHeld); + rwlock.ReleaseReaderLock (); + Assert.IsTrue (!rwlock.IsReaderLockHeld); + Assert.IsTrue (!rwlock.IsWriterLockHeld); + } + + [Test] + public void TestReaderMustWaitWriter () + { + // A thread cannot get the reader lock if there are other threads + // waiting for the writer lock. + + rwlock = new ReaderWriterLock (); + rwlock.AcquireWriterLock (200); + + ThreadRunner tr = StartThread (new ThreadStart (ReaderMustWaitWriter_2)); + Thread.Sleep (200); + + RunThread (new ThreadStart (AcquireLock_readerFails)); + + rwlock.ReleaseReaderLock (); + tr.Join (); + } + + void ReaderMustWaitWriter_2 () + { + rwlock.AcquireWriterLock (2000); + rwlock.ReleaseWriterLock (); + } + + [Test] + public void TestBug_55911 () + { + rwlock = new ReaderWriterLock (); + + rwlock.AcquireReaderLock (Timeout.Infinite); + try { + LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite); + } + finally { rwlock.ReleaseReaderLock(); } + + rwlock.AcquireReaderLock (Timeout.Infinite); + try { + LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite); + } + finally { rwlock.ReleaseReaderLock(); } + } + + [Test] + public void TestBug_55909 () + { + rwlock = new ReaderWriterLock (); + ThreadRunner tr = StartThread (new ThreadStart(Bug_55909_Thread2)); + Thread.Sleep (200); + rwlock.AcquireReaderLock (Timeout.Infinite); + try { + LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite); + Thread.Sleep (500); + } + finally { rwlock.ReleaseReaderLock(); } + + tr.Join (); + } + + public void Bug_55909_Thread2 () + { + rwlock.AcquireReaderLock(Timeout.Infinite); + try { + Thread.Sleep (1000); + LockCookie lc = rwlock.UpgradeToWriterLock (Timeout.Infinite); + Thread.Sleep (500); + } + finally { rwlock.ReleaseReaderLock(); } + } + + [Test] + public void TestBug_55909_bis () + { + rwlock = new ReaderWriterLock (); + ThreadRunner tr1 = StartThread (new ThreadStart(Bug_55909_bis_ReaderWriter)); + Thread.Sleep(100); + ThreadRunner tr2 = StartThread (new ThreadStart(Bug_55909_bis_Reader)); + Thread.Sleep(100); + ThreadRunner tr3 = StartThread (new ThreadStart(Bug_55909_bis_Writer)); + Thread.Sleep(100); + ThreadRunner tr4 = StartThread (new ThreadStart(Bug_55909_bis_Reader)); + tr1.Join (); + tr2.Join (); + tr3.Join (); + tr4.Join (); + } + + void Bug_55909_bis_Reader () + { + rwlock.AcquireReaderLock(-1); + Thread.Sleep(2000); + rwlock.ReleaseReaderLock(); + } + + void Bug_55909_bis_ReaderWriter () + { + rwlock.AcquireReaderLock(-1); + LockCookie lc = rwlock.UpgradeToWriterLock(-1); + Thread.Sleep(1000); + rwlock.DowngradeFromWriterLock(ref lc); + rwlock.ReleaseReaderLock(); + } + + void Bug_55909_bis_Writer () + { + rwlock.AcquireWriterLock(-1); + rwlock.ReleaseWriterLock(); + } + + } } diff --git a/mcs/class/corlib/Test/System.Threading/TimerTest.cs b/mcs/class/corlib/Test/System.Threading/TimerTest.cs index 2749d99b759..3581d495fe7 100644 --- a/mcs/class/corlib/Test/System.Threading/TimerTest.cs +++ b/mcs/class/corlib/Test/System.Threading/TimerTest.cs @@ -29,9 +29,13 @@ namespace MonoTests.System.Threading { // this makes fair for the "DueTime" test since it // doesn't have to wait for the scheduler thread to be // created. - new Timer (null, null, Timeout.Infinite, 0); + new Timer (new TimerCallback (DoNothing), null, Timeout.Infinite, 0); } - + + void DoNothing (object foo) + { + } + [Test] public void TestDueTime () { diff --git a/mcs/class/corlib/Test/System/ArrayTest.cs b/mcs/class/corlib/Test/System/ArrayTest.cs index fd8c283d12f..66aea7adc11 100644 --- a/mcs/class/corlib/Test/System/ArrayTest.cs +++ b/mcs/class/corlib/Test/System/ArrayTest.cs @@ -54,7 +54,7 @@ namespace MonoTests.System //End Auxiliary Things [TestFixture] -public class ArrayTest : Assertion +public class ArrayTest { char [] arrsort = {'d', 'b', 'f', 'e', 'a', 'c'}; @@ -63,47 +63,47 @@ public class ArrayTest : Assertion [Test] public void TestIsFixedSize() { char[] a1 = {'a'}; - Assert("All arrays are fixed", a1.IsFixedSize); + Assert.IsTrue (a1.IsFixedSize, "All arrays are fixed"); } [Test] public void TestIsReadOnly() { char[] a1 = {'a'}; - Assert("No array is readonly", !a1.IsReadOnly); + Assert.IsTrue (!a1.IsReadOnly, "No array is readonly"); } [Test] public void TestIsSynchronized() { char[] a1 = {'a'}; - Assert("No array is synchronized", !a1.IsSynchronized); + Assert.IsTrue (!a1.IsSynchronized, "No array is synchronized"); } [Test] public void TestLength() { { char[] a1 = { }; - AssertEquals("Zero length array", 0, a1.Length); + Assert.AreEqual (0, a1.Length, "Zero length array"); } { char[] a1 = {'c'}; - AssertEquals("One-length array", 1, a1.Length); + Assert.AreEqual (1, a1.Length, "One-length array"); } { char[] a1 = {'c', 'c'}; - AssertEquals("Two-length array", 2, a1.Length); + Assert.AreEqual (2, a1.Length, "Two-length array"); } } [Test] public void TestRank() { char[] a1 = { 'c', 'd', 'e' }; - AssertEquals("Rank one", 1, a1.Rank); + Assert.AreEqual (1, a1.Rank, "Rank one"); char[,] a2 = new Char[3,3]; - AssertEquals("Rank two", 2, a2.Rank); + Assert.AreEqual (2, a2.Rank, "Rank two"); char[,,] a3 = new Char[3,3,3]; - AssertEquals("Rank three", 3, a3.Rank); + Assert.AreEqual (3, a3.Rank, "Rank three"); } [Test] @@ -114,7 +114,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#B01", errorThrown); + Assert.IsTrue (errorThrown, "#B01"); errorThrown = false; try { char[,] c1 = new Char[2,2]; @@ -122,20 +122,20 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#B02", errorThrown); + Assert.IsTrue (errorThrown, "#B02"); { char[] arr = {'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd'}; - Assert("#B05", Array.BinarySearch(arr, 'c') >= 3); - Assert("#B06", Array.BinarySearch(arr, 'c') < 6); + Assert.IsTrue (Array.BinarySearch(arr, 'c') >= 3, "#B05"); + Assert.IsTrue (Array.BinarySearch(arr, 'c') < 6, "#B06"); } { char[] arr = {'a', 'b', 'b', 'd', 'd', 'd', 'e', 'e'}; - AssertEquals("#B07", -4, Array.BinarySearch(arr, 'c')); + Assert.AreEqual (-4, Array.BinarySearch(arr, 'c'), "#B07"); } { char[] arr = {'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd'}; - AssertEquals("#B08", -9, Array.BinarySearch(arr, 'e')); + Assert.AreEqual (-9, Array.BinarySearch(arr, 'e'), "#B08"); } } @@ -147,7 +147,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#B20", errorThrown); + Assert.IsTrue (errorThrown, "#B20"); errorThrown = false; try { char[,] c1 = new Char[2,2]; @@ -155,7 +155,7 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#B21", errorThrown); + Assert.IsTrue (errorThrown, "#B21"); errorThrown = false; try { char[] c1 = {'a'}; @@ -163,7 +163,7 @@ public class ArrayTest : Assertion } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("#B22", errorThrown); + Assert.IsTrue (errorThrown, "#B22"); errorThrown = false; try { char[] c1 = {'a'}; @@ -171,7 +171,7 @@ public class ArrayTest : Assertion } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("#B23", errorThrown); + Assert.IsTrue (errorThrown, "#B23"); errorThrown = false; try { char[] c1 = {'a'}; @@ -179,20 +179,20 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#B24", errorThrown); + Assert.IsTrue (errorThrown, "#B24"); { char[] arr = {'z', 'z', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd'}; - Assert("#B26", Array.BinarySearch(arr, 2, 8, 'c') >= 5); - Assert("#B27", Array.BinarySearch(arr, 2, 8, 'c') < 8); + Assert.IsTrue (Array.BinarySearch(arr, 2, 8, 'c') >= 5, "#B26"); + Assert.IsTrue (Array.BinarySearch(arr, 2, 8, 'c') < 8, "#B27"); } { char[] arr = {'z', 'z', 'a', 'b', 'b', 'd', 'd', 'd', 'e', 'e'}; - AssertEquals("#B28", -6, Array.BinarySearch(arr, 2, 8, 'c')); + Assert.AreEqual (-6, Array.BinarySearch(arr, 2, 8, 'c'), "#B28"); } { char[] arr = {'z', 'z', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd'}; - AssertEquals("#B29", -11, Array.BinarySearch(arr, 2, 8, 'e')); + Assert.AreEqual (-11, Array.BinarySearch(arr, 2, 8, 'e'), "#B29"); } } @@ -203,23 +203,23 @@ public class ArrayTest : Assertion for (int i = 0; i < 100; i++) array[i] = 10; - AssertEquals("#B30", 49, Array.BinarySearch(array, 10)); + Assert.AreEqual (49, Array.BinarySearch(array, 10), "#B30"); } [Test] public void BinarySearch_NullValue () { int[] array = new int[1]; - AssertEquals ("I=a,o", -1, Array.BinarySearch (array, null)); - AssertEquals ("I=a,o,c", -1, Array.BinarySearch (array, null, null)); - AssertEquals ("I=a,i,i,o", -1, Array.BinarySearch (array, 0, 1, null)); - AssertEquals ("I=a,i,i,o,c", -1, Array.BinarySearch (array, 0, 1, null,null)); + Assert.AreEqual (-1, Array.BinarySearch (array, null), "I=a,o"); + Assert.AreEqual (-1, Array.BinarySearch (array, null, null), "I=a,o,c"); + Assert.AreEqual (-1, Array.BinarySearch (array, 0, 1, null), "I=a,i,i,o"); + Assert.AreEqual (-1, Array.BinarySearch (array, 0, 1, null, null), "I=a,i,i,o,c"); object[] o = new object [3] { this, this, null }; - AssertEquals ("O=a,o", -1, Array.BinarySearch (o, null)); - AssertEquals ("O=a,o,c", -1, Array.BinarySearch (o, null, null)); - AssertEquals ("O=a,i,i,o", -1, Array.BinarySearch (o, 0, 3, null)); - AssertEquals ("O=a,i,i,o,c", -1, Array.BinarySearch (o, 0, 3, null, null)); + Assert.AreEqual (-1, Array.BinarySearch (o, null), "O=a,o"); + Assert.AreEqual (-1, Array.BinarySearch (o, null, null), "O=a,o,c"); + Assert.AreEqual (-1, Array.BinarySearch (o, 0, 3, null), "O=a,i,i,o"); + Assert.AreEqual (-1, Array.BinarySearch (o, 0, 3, null, null), "O=a,i,i,o,c"); } // TODO - testBinarySearch with explicit IComparer args @@ -232,48 +232,48 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#C01", errorThrown); + Assert.IsTrue (errorThrown, "#C01"); int[] i1 = { 1, 2, 3, 4 }; { int[] compare = {1,2,3,4}; - AssertEquals("#C02", compare[0], i1[0]); - AssertEquals("#C03", compare[1], i1[1]); - AssertEquals("#C04", compare[2], i1[2]); - AssertEquals("#C05", compare[3], i1[3]); + Assert.AreEqual (compare[0], i1[0], "#C02"); + Assert.AreEqual (compare[1], i1[1], "#C03"); + Assert.AreEqual (compare[2], i1[2], "#C04"); + Assert.AreEqual (compare[3], i1[3], "#C05"); } Array.Clear(i1, 3, 1); { int[] compare = {1,2,3,0}; - AssertEquals("#C06", compare[0], i1[0]); - AssertEquals("#C07", compare[1], i1[1]); - AssertEquals("#C08", compare[2], i1[2]); - AssertEquals("#C09", compare[3], i1[3]); + Assert.AreEqual (compare[0], i1[0], "#C06"); + Assert.AreEqual (compare[1], i1[1], "#C07"); + Assert.AreEqual (compare[2], i1[2], "#C08"); + Assert.AreEqual (compare[3], i1[3], "#C09"); } Array.Clear(i1, 1, 1); { int[] compare = {1,0,3,0}; - AssertEquals("#C10", compare[0], i1[0]); - AssertEquals("#C11", compare[1], i1[1]); - AssertEquals("#C12", compare[2], i1[2]); - AssertEquals("#C13", compare[3], i1[3]); + Assert.AreEqual (compare[0], i1[0], "#C10"); + Assert.AreEqual (compare[1], i1[1], "#C11"); + Assert.AreEqual (compare[2], i1[2], "#C12"); + Assert.AreEqual (compare[3], i1[3], "#C13"); } Array.Clear(i1, 1, 3); { int[] compare = {1,0,0,0}; - AssertEquals("#C14", compare[0], i1[0]); - AssertEquals("#C15", compare[1], i1[1]); - AssertEquals("#C16", compare[2], i1[2]); - AssertEquals("#C17", compare[3], i1[3]); + Assert.AreEqual (compare[0], i1[0], "#C14"); + Assert.AreEqual (compare[1], i1[1], "#C15"); + Assert.AreEqual (compare[2], i1[2], "#C16"); + Assert.AreEqual (compare[3], i1[3], "#C17"); } string[] s1 = { "red", "green", "blue" }; Array.Clear(s1, 0, 3); { string[] compare = {null, null, null}; - AssertEquals("#C18", compare[0], s1[0]); - AssertEquals("#C19", compare[1], s1[1]); - AssertEquals("#C20", compare[2], s1[2]); + Assert.AreEqual (compare[0], s1[0], "#C18"); + Assert.AreEqual (compare[1], s1[1], "#C19"); + Assert.AreEqual (compare[2], s1[2], "#C20"); } } @@ -281,23 +281,37 @@ public class ArrayTest : Assertion public void TestClone() { char[] c1 = {'a', 'b', 'c'}; char[] c2 = (char[])c1.Clone(); - AssertEquals("#D01", c1[0], c2[0]); - AssertEquals("#D02", c1[1], c2[1]); - AssertEquals("#D03", c1[2], c2[2]); + Assert.AreEqual (c1[0], c2[0], "#D01"); + Assert.AreEqual (c1[1], c2[1], "#D02"); + Assert.AreEqual (c1[2], c2[2], "#D03"); char[] d10 = {'a', 'b'}; char[] d11 = {'a', 'c'}; char[] d12 = {'b', 'c'}; char[][] d1 = {d10, d11, d12}; char[][] d2 = (char[][])d1.Clone(); - AssertEquals("#D04", d1[0], d2[0]); - AssertEquals("#D05", d1[1], d2[1]); - AssertEquals("#D06", d1[2], d2[2]); + Assert.AreEqual (d1[0], d2[0], "#D04"); + Assert.AreEqual (d1[1], d2[1], "#D05"); + Assert.AreEqual (d1[2], d2[2], "#D06"); d1[0][0] = 'z'; - AssertEquals("#D07", d1[0], d2[0]); + Assert.AreEqual (d1[0], d2[0], "#D07"); } + [Test] public void TestIndexer () + { + int [] a = new int [10]; + IList b = a; + try { + object c = b [-1]; + Assert.Fail ("IList.this [-1] should throw"); + } catch (IndexOutOfRangeException) { + // Good + } catch (Exception){ + Assert.Fail ("Should have thrown an IndexOutOfRangeException"); + } + } + [Test] public void TestCopy() { { @@ -308,7 +322,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#E01", errorThrown); + Assert.IsTrue (errorThrown, "#E01"); } { bool errorThrown = false; @@ -318,7 +332,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#E02", errorThrown); + Assert.IsTrue (errorThrown, "#E02"); } { bool errorThrown = false; @@ -329,7 +343,7 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#E03", errorThrown); + Assert.IsTrue (errorThrown, "#E03"); } { bool errorThrown = false; @@ -340,7 +354,7 @@ public class ArrayTest : Assertion } catch (ArrayTypeMismatchException) { errorThrown = true; } - Assert("#E04", errorThrown); + Assert.IsTrue (errorThrown, "#E04"); } { bool errorThrown = false; @@ -352,7 +366,7 @@ public class ArrayTest : Assertion } catch (InvalidCastException) { errorThrown = true; } - Assert("#E05", errorThrown); + Assert.IsTrue (errorThrown, "#E05"); } { bool errorThrown = false; @@ -363,7 +377,7 @@ public class ArrayTest : Assertion } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("#E06", errorThrown); + Assert.IsTrue (errorThrown, "#E06"); } { bool errorThrown = false; @@ -374,7 +388,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#E07", errorThrown); + Assert.IsTrue (errorThrown, "#E07"); } { bool errorThrown = false; @@ -385,24 +399,24 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#E08", errorThrown); + Assert.IsTrue (errorThrown, "#E08"); } char[] orig = {'a', 'b', 'd', 'a'}; char[] copy = new Char[4]; Array.Copy(orig, copy, 4); for (int i = 0; i < orig.Length; i++) { - AssertEquals("#E09(" + i + ")", orig[i], copy[i]); + Assert.AreEqual (orig[i], copy[i], "#E09(" + i + ")"); } Array.Clear(copy, 0, copy.Length); for (int i = 0; i < orig.Length; i++) { - AssertEquals("#E10(" + i + ")", (char)0, copy[i]); + Assert.AreEqual ((char)0, copy[i], "#E10(" + i + ")"); } Array.Copy(orig, copy, 2); - AssertEquals("#E11", orig[0], copy[0]); - AssertEquals("#E12", orig[1], copy[1]); - Assert("#E13", orig[2] != copy[2]); - Assert("#E14", orig[3] != copy[3]); + Assert.AreEqual (orig[0], copy[0], "#E11"); + Assert.AreEqual (orig[1], copy[1], "#E12"); + Assert.IsTrue (orig[2] != copy[2], "#E13"); + Assert.IsTrue (orig[3] != copy[3], "#E14"); } [Test] @@ -416,7 +430,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#E31", errorThrown); + Assert.IsTrue (errorThrown, "#E31"); } { bool errorThrown = false; @@ -427,22 +441,22 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#E32", errorThrown); + Assert.IsTrue (errorThrown, "#E32"); } char[] orig = {'a', 'b', 'd', 'a'}; char[] copy = new Char[4]; Array.Copy(orig, 1, copy, 1, 3); - Assert("#E33", copy[0] != orig[0]); + Assert.IsTrue (copy[0] != orig[0], "#E33"); for (int i = 1; i < orig.Length; i++) { - AssertEquals("#E34(" + i + ")", orig[i], copy[i]); + Assert.AreEqual (orig[i], copy[i], "#E34(" + i + ")"); } Array.Clear(copy, 0, copy.Length); Array.Copy(orig, 1, copy, 0, 2); - AssertEquals("#E35", orig[1], copy[0]); - AssertEquals("#E36", orig[2], copy[1]); - Assert("#E37", copy[2] != orig[2]); - Assert("#E38", copy[3] != orig[3]); + Assert.AreEqual (orig[1], copy[0], "#E35"); + Assert.AreEqual (orig[2], copy[1], "#E36"); + Assert.IsTrue (copy[2] != orig[2], "#E37"); + Assert.IsTrue (copy[3] != orig[3], "#E38"); } [Test] @@ -466,7 +480,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#E61", errorThrown); + Assert.IsTrue (errorThrown, "#E61"); } { bool errorThrown = false; @@ -482,7 +496,7 @@ public class ArrayTest : Assertion errorThrown = true; } #endif // TARGET_JVM - Assert("#E62", errorThrown); + Assert.IsTrue (errorThrown, "#E62"); } { bool errorThrown = false; @@ -493,7 +507,7 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#E63", errorThrown); + Assert.IsTrue (errorThrown, "#E63"); } { bool errorThrown = false; @@ -504,7 +518,7 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#E64", errorThrown); + Assert.IsTrue (errorThrown, "#E64"); } { bool errorThrown = false; @@ -515,7 +529,7 @@ public class ArrayTest : Assertion } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("#E65", errorThrown); + Assert.IsTrue (errorThrown, "#E65"); } { bool errorThrown = false; @@ -526,7 +540,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#E66", errorThrown); + Assert.IsTrue (errorThrown, "#E66"); } { bool errorThrown = false; @@ -537,7 +551,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#E67", errorThrown); + Assert.IsTrue (errorThrown, "#E67"); } { @@ -555,23 +569,23 @@ public class ArrayTest : Assertion } catch (ArrayTypeMismatchException) { errorThrown = true; } - Assert("#E68", errorThrown); + Assert.IsTrue (errorThrown, "#E68"); } Char[] orig = {'a', 'b', 'c', 'd'}; Char[] copy = new Char[10]; Array.Clear(copy, 0, copy.Length); orig.CopyTo(copy, 3); - AssertEquals("#E69", (char)0, copy[0]); - AssertEquals("#E70", (char)0, copy[1]); - AssertEquals("#E71", (char)0, copy[2]); - AssertEquals("#E72", orig[0], copy[3]); - AssertEquals("#E73", orig[1], copy[4]); - AssertEquals("#E74", orig[2], copy[5]); - AssertEquals("#E75", orig[3], copy[6]); - AssertEquals("#E76", (char)0, copy[7]); - AssertEquals("#E77", (char)0, copy[8]); - AssertEquals("#E78", (char)0, copy[9]); + Assert.AreEqual ((char)0, copy[0], "#E69"); + Assert.AreEqual ((char)0, copy[1], "#E70"); + Assert.AreEqual ((char)0, copy[2], "#E71"); + Assert.AreEqual (orig[0], copy[3], "#E72"); + Assert.AreEqual (orig[1], copy[4], "#E73"); + Assert.AreEqual (orig[2], copy[5], "#E74"); + Assert.AreEqual (orig[3], copy[6], "#E75"); + Assert.AreEqual ((char)0, copy[7], "#E76"); + Assert.AreEqual ((char)0, copy[8], "#E77"); + Assert.AreEqual ((char)0, copy[9], "#E78"); { // The following is valid and must not throw an exception. @@ -583,7 +597,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#E79", !errorThrown); + Assert.IsTrue (!errorThrown, "#E79"); } { @@ -598,7 +612,7 @@ public class ArrayTest : Assertion } catch (ArrayTypeMismatchException) { errorThrown = true; } - Assert("#E80", errorThrown); + Assert.IsTrue (errorThrown, "#E80"); } } @@ -611,7 +625,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#F01", errorThrown); + Assert.IsTrue (errorThrown, "#F01"); } { bool errorThrown = false; @@ -620,7 +634,7 @@ public class ArrayTest : Assertion } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("#F02", errorThrown); + Assert.IsTrue (errorThrown, "#F02"); } { bool errorThrown = false; @@ -629,7 +643,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#F03a", errorThrown); + Assert.IsTrue (errorThrown, "#F03a"); } #if NET_1_1 { @@ -639,7 +653,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#F03b", errorThrown); + Assert.IsTrue (errorThrown, "#F03b"); } #endif #if !TARGET_JVM // Arrays lower bounds are not supported for TARGET_JVM @@ -650,7 +664,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#F04", errorThrown); + Assert.IsTrue (errorThrown, "#F04"); } #endif // TARGET_JVM { @@ -661,7 +675,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#F05", errorThrown); + Assert.IsTrue (errorThrown, "#F05"); } #if !TARGET_JVM // CreateInstance with lower bounds not supported for TARGET_JVM { @@ -674,15 +688,15 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#F06", errorThrown); + Assert.IsTrue (errorThrown, "#F06"); } char[] c1 = (char[])Array.CreateInstance(Type.GetType("System.Char"), 12); - AssertEquals("#F07", 12, c1.Length); + Assert.AreEqual (12, c1.Length, "#F07"); Array c2 = Array.CreateInstance(Type.GetType("System.Char"), 12, 5); - AssertEquals("#F08", 2, c2.Rank); - AssertEquals("#F09", 60, c2.Length); + Assert.AreEqual (2, c2.Rank, "#F08"); + Assert.AreEqual (60, c2.Length, "#F09"); { @@ -691,21 +705,21 @@ public class ArrayTest : Assertion int[] src = { 512, 718, 912 }; Array array = Array.CreateInstance(typeof(int), lengths, bounds); - AssertEquals("#F10", 3, array.Length); - AssertEquals("#F11", 5, array.GetLowerBound(0)); - AssertEquals("#F12", 7, array.GetUpperBound(0)); + Assert.AreEqual (3, array.Length, "#F10"); + Assert.AreEqual (5, array.GetLowerBound(0), "#F11"); + Assert.AreEqual (7, array.GetUpperBound(0), "#F12"); src.CopyTo (array, 5); for (int i = 0; i < src.Length; i++) - AssertEquals("#F13(" + i + ")", src[i], array.GetValue(i+5)); + Assert.AreEqual (src[i], array.GetValue(i+5), "#F13(" + i + ")"); } // Test that a 1 dimensional array with 0 lower bound is the // same as an szarray Type szarrayType = new int [10].GetType (); - Assert (szarrayType == (Array.CreateInstance (typeof (int), new int[] {1}, new int[] {0})).GetType ()); - Assert (szarrayType != (Array.CreateInstance (typeof (int), new int[] {1}, new int[] {1})).GetType ()); + Assert.IsTrue (szarrayType == (Array.CreateInstance (typeof (int), new int[] {1}, new int[] {0})).GetType ()); + Assert.IsTrue (szarrayType != (Array.CreateInstance (typeof (int), new int[] {1}, new int[] {1})).GetType ()); #endif // TARGET_JVM } @@ -731,53 +745,53 @@ public class ArrayTest : Assertion public void TestGetEnumerator() { String[] s1 = {"this", "is", "a", "test"}; IEnumerator en = s1.GetEnumerator (); - AssertNotNull ("#G01", en); - - Assert ("#G02", en.MoveNext ()); - AssertEquals ("#G03", "this", en.Current); - Assert ("#G04", en.MoveNext ()); - AssertEquals ("#G05", "is", en.Current); - Assert ("#G06", en.MoveNext ()); - AssertEquals ("#G07", "a", en.Current); - Assert ("#G08", en.MoveNext ()); - AssertEquals ("#G09", "test", en.Current); - Assert ("#G10", !en.MoveNext ()); + Assert.IsNotNull (en, "#G01"); + + Assert.IsTrue (en.MoveNext (), "#G02"); + Assert.AreEqual ("this", en.Current, "#G03"); + Assert.IsTrue (en.MoveNext (), "#G04"); + Assert.AreEqual ("is", en.Current, "#G05"); + Assert.IsTrue (en.MoveNext (), "#G06"); + Assert.AreEqual ("a", en.Current, "#G07"); + Assert.IsTrue (en.MoveNext (), "#G08"); + Assert.AreEqual ("test", en.Current, "#G09"); + Assert.IsTrue (!en.MoveNext (), "#G10"); en.Reset (); - Assert("#G11", en.MoveNext ()); - AssertEquals ("#G12", "this", en.Current); + Assert.IsTrue (en.MoveNext (), "#G11"); + Assert.AreEqual ("this", en.Current, "#G12"); // mutation does not invalidate array enumerator! s1.SetValue ("change", 1); - Assert ("#G13", en.MoveNext ()); - AssertEquals ("#G14", "change", en.Current); + Assert.IsTrue (en.MoveNext (), "#G13"); + Assert.AreEqual ("change", en.Current, "#G14"); } [Test] public void TestGetEnumeratorMultipleDimension() { String[,] s1 = {{"this", "is"}, {"a", "test"}}; IEnumerator en = s1.GetEnumerator (); - AssertNotNull ("#AA01", en); - - Assert ("#AA02", en.MoveNext ()); - AssertEquals ("#AA03", "this", en.Current); - Assert ("#AA04", en.MoveNext ()); - AssertEquals ("#AA05", "is", en.Current); - Assert ("#AA06", en.MoveNext ()); - AssertEquals ("#AA07", "a", en.Current); - Assert ("#AA08", en.MoveNext ()); - AssertEquals ("#AA09", "test", en.Current); - Assert ("#AA10", !en.MoveNext ()); + Assert.IsNotNull (en, "#AA01"); + + Assert.IsTrue (en.MoveNext (), "#AA02"); + Assert.AreEqual ("this", en.Current, "#AA03"); + Assert.IsTrue (en.MoveNext (), "#AA04"); + Assert.AreEqual ("is", en.Current, "#AA05"); + Assert.IsTrue (en.MoveNext (), "#AA06"); + Assert.AreEqual ("a", en.Current, "#AA07"); + Assert.IsTrue (en.MoveNext (), "#AA08"); + Assert.AreEqual ("test", en.Current, "#AA09"); + Assert.IsTrue (!en.MoveNext (), "#AA10"); en.Reset (); - Assert("#AA11", en.MoveNext ()); - AssertEquals ("#AA12", "this", en.Current); + Assert.IsTrue (en.MoveNext (), "#AA11"); + Assert.AreEqual ("this", en.Current, "#AA12"); int[] idxs = {0,1}; // mutation does not invalidate array enumerator! s1.SetValue ("change", idxs); - Assert ("#AA13", en.MoveNext ()); - AssertEquals ("#AA14", "change", en.Current); + Assert.IsTrue (en.MoveNext (), "#AA13"); + Assert.AreEqual ("change", en.Current, "#AA14"); } [Test] @@ -793,20 +807,20 @@ public class ArrayTest : Assertion myArray.SetValue( Convert.ToString(i) + j, myIndicesArray ); } IEnumerator en = myArray.GetEnumerator (); - AssertNotNull ("#AB01", en); + Assert.IsNotNull (en, "#AB01"); // check the first couple of values - Assert ("#AB02", en.MoveNext ()); - AssertEquals ("#AB03", "23", en.Current); - Assert ("#AB04", en.MoveNext ()); - AssertEquals ("#AB05", "24", en.Current); + Assert.IsTrue (en.MoveNext (), "#AB02"); + Assert.AreEqual ("23", en.Current, "#AB03"); + Assert.IsTrue (en.MoveNext (), "#AB04"); + Assert.AreEqual ("24", en.Current, "#AB05"); // then check the last element's value string lastElement; do { lastElement = (string)en.Current; } while (en.MoveNext()); - AssertEquals ("#AB06", "47", lastElement); + Assert.AreEqual ("47", lastElement, "#AB06"); } [Test] @@ -818,16 +832,16 @@ public class ArrayTest : Assertion Array myArray=Array.CreateInstance ( typeof(String), myLengthsArray, myBoundsArray ); try { ((IList)myArray).Add ("can not"); - Fail ("IList.Add should throw"); + Assert.Fail ("IList.Add should throw"); } catch (NotSupportedException) { return; } catch (Exception) { - Fail ("IList.Add threw wrong exception type"); + Assert.Fail ("IList.Add threw wrong exception type"); } - Fail("IList.Add shouldn't get this far"); + Assert.Fail ("IList.Add shouldn't get this far"); } [Test] @@ -839,16 +853,16 @@ public class ArrayTest : Assertion Array myArray=Array.CreateInstance ( typeof(String), myLengthsArray, myBoundsArray ); try { ((IList)myArray).Insert (0, "can not"); - Fail ("IList.Insert should throw"); + Assert.Fail ("IList.Insert should throw"); } catch (NotSupportedException) { return; } catch (Exception) { - Fail ("IList.Insert threw wrong exception type"); + Assert.Fail ("IList.Insert threw wrong exception type"); } - Fail("IList.Insert shouldn't get this far"); + Assert.Fail ("IList.Insert shouldn't get this far"); } [Test] @@ -860,16 +874,16 @@ public class ArrayTest : Assertion Array myArray=Array.CreateInstance ( typeof(String), myLengthsArray, myBoundsArray ); try { ((IList)myArray).Remove ("can not"); - Fail ("IList.Remove should throw"); + Assert.Fail ("IList.Remove should throw"); } catch (NotSupportedException) { return; } catch (Exception) { - Fail ("IList.Remove threw wrong exception type"); + Assert.Fail ("IList.Remove threw wrong exception type"); } - Fail("IList.Remove shouldn't get this far"); + Assert.Fail ("IList.Remove shouldn't get this far"); } [Test] @@ -881,16 +895,16 @@ public class ArrayTest : Assertion Array myArray=Array.CreateInstance ( typeof(String), myLengthsArray, myBoundsArray ); try { ((IList)myArray).RemoveAt (0); - Fail ("IList.RemoveAt should throw"); + Assert.Fail ("IList.RemoveAt should throw"); } catch (NotSupportedException) { return; } catch (Exception) { - Fail ("IList.RemoveAt threw wrong exception type"); + Assert.Fail ("IList.RemoveAt threw wrong exception type"); } - Fail("IList.RemoveAt shouldn't get this far"); + Assert.Fail ("IList.RemoveAt shouldn't get this far"); } [Test] @@ -903,20 +917,20 @@ public class ArrayTest : Assertion try { bool b = ((IList)myArray).Contains ("23"); - Fail("IList.Contains should throw with multi-dimensional arrays"); + Assert.Fail ("IList.Contains should throw with multi-dimensional arrays"); } catch (RankException) { int[] iArr = new int[3] { 1, 2, 3}; // check the first and last items - Assert("AC01", ((IList)iArr).Contains (1)); - Assert("AC02", ((IList)iArr).Contains (3)); + Assert.IsTrue (((IList)iArr).Contains (1), "AC01"); + Assert.IsTrue (((IList)iArr).Contains (3), "AC02"); // and one that is definately not there - Assert("AC03", !((IList)iArr).Contains (42)); + Assert.IsTrue (!((IList)iArr).Contains (42), "AC03"); return; } - Fail("Should not get here"); + Assert.Fail ("Should not get here"); } [Test] @@ -929,19 +943,19 @@ public class ArrayTest : Assertion try { bool b = ((IList)myArray).Contains ("23"); - Fail("IList.Contains should throw with multi-dimensional arrays"); + Assert.Fail ("IList.Contains should throw with multi-dimensional arrays"); } catch (RankException) { int[] iArr = new int[3] { 1, 2, 3}; // check the first and last items - AssertEquals("AD01", 0, ((IList)iArr).IndexOf (1)); - AssertEquals("AD02", 2, ((IList)iArr).IndexOf (3)); + Assert.AreEqual (0, ((IList)iArr).IndexOf (1), "AD01"); + Assert.AreEqual (2, ((IList)iArr).IndexOf (3), "AD02"); // and one that is definately not there - AssertEquals("AD03", -1, ((IList)iArr).IndexOf (42)); + Assert.AreEqual (-1, ((IList)iArr).IndexOf (42), "AD03"); } catch (Exception e) { - Fail("Unexpected exception: " + e.ToString()); + Assert.Fail ("Unexpected exception: " + e.ToString()); } // check that wierd case whem lowerbound is Int32.MinValue, @@ -949,7 +963,7 @@ public class ArrayTest : Assertion int[] myLengthArray = new int[1] { 3 }; int[] myBoundArray = new int[1] { Int32.MinValue }; Array myExtremeArray=Array.CreateInstance ( typeof(String), myLengthArray, myBoundArray ); - AssertEquals("AD04", Int32.MaxValue, ((IList)myExtremeArray).IndexOf (42)); + Assert.AreEqual (Int32.MaxValue, ((IList)myExtremeArray).IndexOf (42), "AD04"); } @@ -963,7 +977,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#H01", errorThrown); + Assert.IsTrue (errorThrown, "#H01"); } { bool errorThrown = false; @@ -973,15 +987,15 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#H02", errorThrown); + Assert.IsTrue (errorThrown, "#H02"); } char[] c2 = new Char[5]; - AssertEquals("#H03", 5, c2.GetLength(0)); + Assert.AreEqual (5, c2.GetLength(0), "#H03"); char[,] c3 = new Char[6,7]; - AssertEquals("#H04", 6, c3.GetLength(0)); - AssertEquals("#H05", 7, c3.GetLength(1)); + Assert.AreEqual (6, c3.GetLength(0), "#H04"); + Assert.AreEqual (7, c3.GetLength(1), "#H05"); } [Test] @@ -994,7 +1008,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#H31", errorThrown); + Assert.IsTrue (errorThrown, "#H31"); } { bool errorThrown = false; @@ -1004,15 +1018,15 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#H32", errorThrown); + Assert.IsTrue (errorThrown, "#H32"); } char[] c1 = new Char[5]; - AssertEquals("#H33", 0, c1.GetLowerBound(0)); + Assert.AreEqual (0, c1.GetLowerBound(0), "#H33"); char[,] c2 = new Char[4,4]; - AssertEquals("#H34", 0, c2.GetLowerBound(0)); - AssertEquals("#H35", 0, c2.GetLowerBound(1)); + Assert.AreEqual (0, c2.GetLowerBound(0), "#H34"); + Assert.AreEqual (0, c2.GetLowerBound(1), "#H35"); } [Test] @@ -1025,7 +1039,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#H61", errorThrown); + Assert.IsTrue (errorThrown, "#H61"); } { bool errorThrown = false; @@ -1035,15 +1049,15 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#H62", errorThrown); + Assert.IsTrue (errorThrown, "#H62"); } char[] c1 = new Char[5]; - AssertEquals("#H63", 4, c1.GetUpperBound(0)); + Assert.AreEqual (4, c1.GetUpperBound(0), "#H63"); char[,] c2 = new Char[4,6]; - AssertEquals("#H64", 3, c2.GetUpperBound(0)); - AssertEquals("#H65", 5, c2.GetUpperBound(1)); + Assert.AreEqual (3, c2.GetUpperBound(0), "#H64"); + Assert.AreEqual (5, c2.GetUpperBound(1), "#H65"); } [Test] @@ -1056,7 +1070,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#I01", errorThrown); + Assert.IsTrue (errorThrown, "#I01"); } { bool errorThrown = false; @@ -1066,7 +1080,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#I02", errorThrown); + Assert.IsTrue (errorThrown, "#I02"); } { bool errorThrown = false; @@ -1076,12 +1090,12 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#I03", errorThrown); + Assert.IsTrue (errorThrown, "#I03"); } char[] c1 = {'a', 'b', 'c', 'd'}; for (int i = 0; i < c1.Length; i++) { - AssertEquals("#I04(" + i + ")", c1[i], c1.GetValue(i)); + Assert.AreEqual (c1[i], c1.GetValue(i), "#I04(" + i + ")"); } } @@ -1095,7 +1109,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#I21", errorThrown); + Assert.IsTrue (errorThrown, "#I21"); } { bool errorThrown = false; @@ -1105,7 +1119,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#I22", errorThrown); + Assert.IsTrue (errorThrown, "#I22"); } { bool errorThrown = false; @@ -1115,7 +1129,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#I23", errorThrown); + Assert.IsTrue (errorThrown, "#I23"); } char[,] c1 = new Char[4,6]; @@ -1126,8 +1140,7 @@ public class ArrayTest : Assertion } for (int i = 0; i < c1.GetLength(0); i++) { for (int j = 0; j < c1.GetLength(1); j++) { - AssertEquals("#I24(" + i + "," + j + ")", - c1[i,j], c1.GetValue(i, j)); + Assert.AreEqual (c1[i, j], c1.GetValue(i, j), "#I24(" + i + "," + j + ")"); } } } @@ -1142,7 +1155,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#I41", errorThrown); + Assert.IsTrue (errorThrown, "#I41"); } { bool errorThrown = false; @@ -1152,7 +1165,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#I42", errorThrown); + Assert.IsTrue (errorThrown, "#I42"); } { bool errorThrown = false; @@ -1162,7 +1175,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#I43", errorThrown); + Assert.IsTrue (errorThrown, "#I43"); } char[,,] c1 = new Char[4,2,3]; @@ -1176,8 +1189,7 @@ public class ArrayTest : Assertion for (int i = 0; i < c1.GetLength(0); i++) { for (int j = 0; j < c1.GetLength(1); j++) { for (int k = 0; k < c1.GetLength(2); k++) { - AssertEquals("#I44(" + i + "," + j + ")", - c1[i,j,k], c1.GetValue(i,j,k)); + Assert.AreEqual (c1[i, j, k], c1.GetValue(i, j, k), "#I44(" + i + "," + j + ")"); } } } @@ -1205,7 +1217,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#I61a", errorThrown); + Assert.IsTrue (errorThrown, "#I61a"); } { bool errorThrown = false; @@ -1216,7 +1228,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#I62", errorThrown); + Assert.IsTrue (errorThrown, "#I62"); } { bool errorThrown = false; @@ -1227,7 +1239,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#I63", errorThrown); + Assert.IsTrue (errorThrown, "#I63"); } { bool errorThrown = false; @@ -1238,7 +1250,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#I64", errorThrown); + Assert.IsTrue (errorThrown, "#I64"); } char[,] c1 = new Char[4,6]; @@ -1250,8 +1262,7 @@ public class ArrayTest : Assertion for (int i = 0; i < c1.GetLength(0); i++) { for (int j = 0; j < c1.GetLength(1); j++) { int[] coords = {i, j}; - AssertEquals("#I65(" + i + "," + j + ")", - c1[i,j], c1.GetValue(coords)); + Assert.AreEqual (c1[i, j], c1.GetValue(coords), "#I65(" + i + "," + j + ")"); } } } @@ -1265,7 +1276,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#J01", errorThrown); + Assert.IsTrue (errorThrown, "#J01"); } { bool errorThrown = false; @@ -1275,14 +1286,14 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#J02", errorThrown); + Assert.IsTrue (errorThrown, "#J02"); } String[] s1 = {"this", "is", "a", "test"}; - AssertEquals("#J03", -1, Array.IndexOf(s1, null)); - AssertEquals("#J04", -1, Array.IndexOf(s1, "nothing")); - AssertEquals("#J05", 0, Array.IndexOf(s1, "this")); - AssertEquals("#J06", 3, Array.IndexOf(s1, "test")); + Assert.AreEqual (-1, Array.IndexOf(s1, null), "#J03"); + Assert.AreEqual (-1, Array.IndexOf(s1, "nothing"), "#J04"); + Assert.AreEqual (0, Array.IndexOf(s1, "this"), "#J05"); + Assert.AreEqual (3, Array.IndexOf(s1, "test"), "#J06"); } [Test] @@ -1294,7 +1305,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#J21", errorThrown); + Assert.IsTrue (errorThrown, "#J21"); } { bool errorThrown = false; @@ -1304,7 +1315,7 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#J22", errorThrown); + Assert.IsTrue (errorThrown, "#J22"); } { bool errorThrown = false; @@ -1314,15 +1325,15 @@ public class ArrayTest : Assertion } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("#J23", errorThrown); + Assert.IsTrue (errorThrown, "#J23"); } String[] s1 = {"this", "is", "really", "a", "test"}; - AssertEquals("#J24", -1, Array.IndexOf(s1, null, 1)); - AssertEquals("#J25", -1, Array.IndexOf(s1, "nothing", 1)); - AssertEquals("#J26", -1, Array.IndexOf(s1, "this", 1)); - AssertEquals("#J27", 1, Array.IndexOf(s1, "is", 1)); - AssertEquals("#J28", 4, Array.IndexOf(s1, "test", 1)); + Assert.AreEqual (-1, Array.IndexOf(s1, null, 1), "#J24"); + Assert.AreEqual (-1, Array.IndexOf(s1, "nothing", 1), "#J25"); + Assert.AreEqual (-1, Array.IndexOf(s1, "this", 1), "#J26"); + Assert.AreEqual (1, Array.IndexOf(s1, "is", 1), "#J27"); + Assert.AreEqual (4, Array.IndexOf(s1, "test", 1), "#J28"); } [Test] @@ -1334,7 +1345,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#J41", errorThrown); + Assert.IsTrue (errorThrown, "#J41"); } { bool errorThrown = false; @@ -1344,7 +1355,7 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#J42", errorThrown); + Assert.IsTrue (errorThrown, "#J42"); } { bool errorThrown = false; @@ -1354,7 +1365,7 @@ public class ArrayTest : Assertion } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("#J43", errorThrown); + Assert.IsTrue (errorThrown, "#J43"); } { bool errorThrown = false; @@ -1364,26 +1375,26 @@ public class ArrayTest : Assertion } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("#J44", errorThrown); + Assert.IsTrue (errorThrown, "#J44"); } String[] s1 = {"this", "is", "really", "a", "test"}; - AssertEquals("#J45", -1, Array.IndexOf(s1, null, 1, 3)); - AssertEquals("#J46", -1, Array.IndexOf(s1, "nothing", 1, 3)); - AssertEquals("#J47", -1, Array.IndexOf(s1, "this", 1, 3)); - AssertEquals("#J48", 1, Array.IndexOf(s1, "is", 1, 3)); - AssertEquals("#J49", -1, Array.IndexOf(s1, "test", 1, 3)); - AssertEquals("#J50", 3, Array.IndexOf(s1, "a", 1, 3)); + Assert.AreEqual (-1, Array.IndexOf(s1, null, 1, 3), "#J45"); + Assert.AreEqual (-1, Array.IndexOf(s1, "nothing", 1, 3), "#J46"); + Assert.AreEqual (-1, Array.IndexOf(s1, "this", 1, 3), "#J47"); + Assert.AreEqual (1, Array.IndexOf(s1, "is", 1, 3), "#J48"); + Assert.AreEqual (-1, Array.IndexOf(s1, "test", 1, 3), "#J49"); + Assert.AreEqual (3, Array.IndexOf(s1, "a", 1, 3), "#J50"); } [Test] public void TestIndexOf_CustomEqual () { DataEqual[] test = new DataEqual [] { new DataEqual () }; - AssertEquals (0, Array.IndexOf (test, "asdfas", 0)); + Assert.AreEqual (0, Array.IndexOf (test, "asdfas", 0)); IList array = (IList)test; - AssertEquals (0, array.IndexOf ("asdfas")); + Assert.AreEqual (0, array.IndexOf ("asdfas")); } [Test] @@ -1395,7 +1406,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#K01", errorThrown); + Assert.IsTrue (errorThrown, "#K01"); } { bool errorThrown = false; @@ -1405,17 +1416,17 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#K02", errorThrown); + Assert.IsTrue (errorThrown, "#K02"); } String[] s1 = {"this", "is", "a", "a", "test"}; - AssertEquals("#K03", -1, Array.LastIndexOf(s1, null)); - AssertEquals("#K04", -1, Array.LastIndexOf(s1, "nothing")); - AssertEquals("#K05", 0, Array.LastIndexOf(s1, "this")); - AssertEquals("#K06", 4, Array.LastIndexOf(s1, "test")); - AssertEquals("#K07", 3, Array.LastIndexOf(s1, "a")); + Assert.AreEqual (-1, Array.LastIndexOf(s1, null), "#K03"); + Assert.AreEqual (-1, Array.LastIndexOf(s1, "nothing"), "#K04"); + Assert.AreEqual (0, Array.LastIndexOf(s1, "this"), "#K05"); + Assert.AreEqual (4, Array.LastIndexOf(s1, "test"), "#K06"); + Assert.AreEqual (3, Array.LastIndexOf(s1, "a"), "#K07"); - AssertEquals (-1, Array.LastIndexOf (new String [0], "foo")); + Assert.AreEqual (-1, Array.LastIndexOf (new String [0], "foo")); } [Test] @@ -1427,7 +1438,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#K21", errorThrown); + Assert.IsTrue (errorThrown, "#K21"); } { bool errorThrown = false; @@ -1437,7 +1448,7 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#K22", errorThrown); + Assert.IsTrue (errorThrown, "#K22"); } { bool errorThrown = false; @@ -1447,15 +1458,15 @@ public class ArrayTest : Assertion } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("#K23", errorThrown); + Assert.IsTrue (errorThrown, "#K23"); } String[] s1 = {"this", "is", "really", "a", "test"}; - AssertEquals("#K24", -1, Array.LastIndexOf(s1, null, 3)); - AssertEquals("#K25", -1, Array.LastIndexOf(s1, "nothing", 3)); - AssertEquals("#K26", -1, Array.LastIndexOf(s1, "test", 3)); - AssertEquals("#K27", 3, Array.LastIndexOf(s1, "a", 3)); - AssertEquals("#K28", 0, Array.LastIndexOf(s1, "this", 3)); + Assert.AreEqual (-1, Array.LastIndexOf(s1, null, 3), "#K24"); + Assert.AreEqual (-1, Array.LastIndexOf(s1, "nothing", 3), "#K25"); + Assert.AreEqual (-1, Array.LastIndexOf(s1, "test", 3), "#K26"); + Assert.AreEqual (3, Array.LastIndexOf(s1, "a", 3), "#K27"); + Assert.AreEqual (0, Array.LastIndexOf(s1, "this", 3), "#K28"); } [Test] @@ -1467,7 +1478,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#K41", errorThrown); + Assert.IsTrue (errorThrown, "#K41"); } { bool errorThrown = false; @@ -1477,7 +1488,7 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#K42", errorThrown); + Assert.IsTrue (errorThrown, "#K42"); } { bool errorThrown = false; @@ -1487,7 +1498,7 @@ public class ArrayTest : Assertion } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("#K43", errorThrown); + Assert.IsTrue (errorThrown, "#K43"); } { bool errorThrown = false; @@ -1497,16 +1508,16 @@ public class ArrayTest : Assertion } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("#K44", errorThrown); + Assert.IsTrue (errorThrown, "#K44"); } String[] s1 = {"this", "is", "really", "a", "test"}; - AssertEquals("#K45", -1, Array.LastIndexOf(s1, null, 3, 3)); - AssertEquals("#K46", -1, Array.LastIndexOf(s1, "nothing", 3, 3)); - AssertEquals("#K47", -1, Array.LastIndexOf(s1, "this", 3, 3)); - AssertEquals("#K48", 1, Array.LastIndexOf(s1, "is", 3, 3)); - AssertEquals("#K49", -1, Array.LastIndexOf(s1, "test", 3, 3)); - AssertEquals("#K50", 3, Array.LastIndexOf(s1, "a", 3, 3)); + Assert.AreEqual (-1, Array.LastIndexOf(s1, null, 3, 3), "#K45"); + Assert.AreEqual (-1, Array.LastIndexOf(s1, "nothing", 3, 3), "#K46"); + Assert.AreEqual (-1, Array.LastIndexOf(s1, "this", 3, 3), "#K47"); + Assert.AreEqual (1, Array.LastIndexOf(s1, "is", 3, 3), "#K48"); + Assert.AreEqual (-1, Array.LastIndexOf(s1, "test", 3, 3), "#K49"); + Assert.AreEqual (3, Array.LastIndexOf(s1, "a", 3, 3), "#K50"); } [Test] @@ -1540,7 +1551,7 @@ public class ArrayTest : Assertion if (retval != i) error = true; } - Assert (!error); + Assert.IsTrue (!error); } [Test] @@ -1570,7 +1581,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#L01", errorThrown); + Assert.IsTrue (errorThrown, "#L01"); } { bool errorThrown = false; @@ -1580,15 +1591,15 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#L02", errorThrown); + Assert.IsTrue (errorThrown, "#L02"); } char[] c1 = {'a', 'b', 'c', 'd'}; Array.Reverse(c1); - AssertEquals("#L03", 'd', c1[0]); - AssertEquals("#L04", 'c', c1[1]); - AssertEquals("#L05", 'b', c1[2]); - AssertEquals("#L06", 'a', c1[3]); + Assert.AreEqual ('d', c1[0], "#L03"); + Assert.AreEqual ('c', c1[1], "#L04"); + Assert.AreEqual ('b', c1[2], "#L05"); + Assert.AreEqual ('a', c1[3], "#L06"); { bool errorThrown = false; @@ -1597,7 +1608,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#L07", errorThrown); + Assert.IsTrue (errorThrown, "#L07"); } { bool errorThrown = false; @@ -1607,7 +1618,7 @@ public class ArrayTest : Assertion } catch (RankException) { errorThrown = true; } - Assert("#L08", errorThrown); + Assert.IsTrue (errorThrown, "#L08"); } //{ //bool errorThrown = false; @@ -1617,7 +1628,7 @@ public class ArrayTest : Assertion //} catch (ArgumentOutOfRangeException) { // errorThrown = true; //} - //Assert("#L09", errorThrown); + //Assert.IsTrue (errorThrown, "#L09"); //} //{ //bool errorThrown = false; @@ -1627,15 +1638,15 @@ public class ArrayTest : Assertion //} catch (ArgumentOutOfRangeException) { // errorThrown = true; //} - //Assert("#L10", errorThrown); + //Assert.IsTrue (errorThrown, "#L10"); //} char[] c2 = { 'a', 'b', 'c', 'd'}; Array.Reverse(c2, 1, 2); - AssertEquals("#L11", 'a', c2[0]); - AssertEquals("#L12", 'c', c2[1]); - AssertEquals("#L13", 'b', c2[2]); - AssertEquals("#L14", 'd', c2[3]); + Assert.AreEqual ('a', c2[0], "#L11"); + Assert.AreEqual ('c', c2[1], "#L12"); + Assert.AreEqual ('b', c2[2], "#L13"); + Assert.AreEqual ('d', c2[3], "#L14"); } [Test] @@ -1648,7 +1659,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#M01", errorThrown); + Assert.IsTrue (errorThrown, "#M01"); } { bool errorThrown = false; @@ -1658,7 +1669,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#M02", errorThrown); + Assert.IsTrue (errorThrown, "#M02"); } { bool errorThrown = false; @@ -1668,7 +1679,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#M03", errorThrown); + Assert.IsTrue (errorThrown, "#M03"); } char[] c1 = {'a', 'b', 'c', 'd'}; @@ -1677,7 +1688,7 @@ public class ArrayTest : Assertion c2.SetValue(c1[i], i); } for (int i = 0; i < c1.Length; i++) { - AssertEquals("#M04(" + i + ")", c1[i], c2[i]); + Assert.AreEqual (c1[i], c2[i], "#M04(" + i + ")"); } int[] c3 = { 1, 2, 3 }; @@ -1689,10 +1700,10 @@ public class ArrayTest : Assertion try { c3.CopyTo (c4, 0); } catch (Exception e) { - Fail ("c3.CopyTo(): e=" + e); + Assert.Fail ("c3.CopyTo(): e=" + e); } for (int i = 0; i < c3.Length; i++) - Assert ("#M05(" + i + ")", c3[i] == c4[i]); + Assert.IsTrue (c3[i] == c4[i], "#M05(" + i + ")"); Object[] c5 = new Object [3]; long[] c6 = new long [3]; @@ -1700,16 +1711,16 @@ public class ArrayTest : Assertion try { c4.CopyTo (c5, 0); } catch (Exception e) { - Fail ("c4.CopyTo(): e=" + e); + Assert.Fail ("c4.CopyTo(): e=" + e); } try { c5.CopyTo (c6, 0); } catch (Exception e) { - Fail ("c5.CopyTo(): e=" + e); + Assert.Fail ("c5.CopyTo(): e=" + e); } // for (int i = 0; i < c5.Length; i++) - // Assert ("#M06(" + i + ")", c5[i] == c6[i]); + // Assert.IsTrue (c5[i] == c6[i], "#M06(" + i + ")"); } [Test] @@ -1722,7 +1733,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#M21", errorThrown); + Assert.IsTrue (errorThrown, "#M21"); } { bool errorThrown = false; @@ -1732,7 +1743,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#M22", errorThrown); + Assert.IsTrue (errorThrown, "#M22"); } { bool errorThrown = false; @@ -1742,7 +1753,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#M23", errorThrown); + Assert.IsTrue (errorThrown, "#M23"); } char[,] c1 = new Char[4,6]; @@ -1755,8 +1766,7 @@ public class ArrayTest : Assertion } for (int i = 0; i < c1.GetLength(0); i++) { for (int j = 0; j < c1.GetLength(1); j++) { - AssertEquals("#M24(" + i + "," + j + ")", - c1[i,j], c2[i, j]); + Assert.AreEqual (c1[i, j], c2[i, j], "#M24(" + i + "," + j + ")"); } } } @@ -1771,7 +1781,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#M41", errorThrown); + Assert.IsTrue (errorThrown, "#M41"); } { bool errorThrown = false; @@ -1781,7 +1791,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#M42", errorThrown); + Assert.IsTrue (errorThrown, "#M42"); } { bool errorThrown = false; @@ -1791,7 +1801,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#M43", errorThrown); + Assert.IsTrue (errorThrown, "#M43"); } char[,,] c1 = new Char[4,2,3]; @@ -1807,8 +1817,7 @@ public class ArrayTest : Assertion for (int i = 0; i < c1.GetLength(0); i++) { for (int j = 0; j < c1.GetLength(1); j++) { for (int k = 0; k < c1.GetLength(2); k++) { - AssertEquals("#M44(" + i + "," + j + " )", - c1[i,j,k], c2[i,j,k]); + Assert.AreEqual (c1[i, j, k], c2[i, j, k], "#M44(" + i + "," + j + " )"); } } } @@ -1836,7 +1845,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#M61a", errorThrown); + Assert.IsTrue (errorThrown, "#M61a"); } { bool errorThrown = false; @@ -1847,7 +1856,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#M62", errorThrown); + Assert.IsTrue (errorThrown, "#M62"); } { bool errorThrown = false; @@ -1858,7 +1867,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#M63", errorThrown); + Assert.IsTrue (errorThrown, "#M63"); } { bool errorThrown = false; @@ -1869,7 +1878,7 @@ public class ArrayTest : Assertion } catch (IndexOutOfRangeException) { errorThrown = true; } - Assert("#M64", errorThrown); + Assert.IsTrue (errorThrown, "#M64"); } char[,] c1 = new Char[4,6]; @@ -1883,8 +1892,7 @@ public class ArrayTest : Assertion } for (int i = 0; i < c1.GetLength(0); i++) { for (int j = 0; j < c1.GetLength(1); j++) { - AssertEquals("#M65(" + i + "," + j + ")", - c1[i,j], c2[i,j]); + Assert.AreEqual (c1[i, j], c2[i, j], "#M65(" + i + "," + j + ")"); } } } @@ -1899,8 +1907,8 @@ public class ArrayTest : Assertion c2.SetValue (c1 [i], i); for (int i = 0; i < c1.Length; i++) { - Assert ("#M81(" + i + ")", c1[i] == c2[i]); - AssertEquals ("#M82(" + i + ")", typeof (long), c2[i].GetType ()); + Assert.IsTrue (c1[i] == c2[i], "#M81(" + i + ")"); + Assert.AreEqual (typeof (long), c2[i].GetType (), "#M82(" + i + ")"); } } { @@ -1912,7 +1920,7 @@ public class ArrayTest : Assertion } catch (ArgumentException) { errorThrown = true; } - Assert("#M83", errorThrown); + Assert.IsTrue (errorThrown, "#M83"); } { int[] c1 = { 1, 2, 3 }; @@ -1922,7 +1930,7 @@ public class ArrayTest : Assertion c2.SetValue (c1 [i], i); for (int i = 0; i < c1.Length; i++) - AssertEquals ("#M84(" + i + ")", c1[i], Convert.ToInt32 (c2[i])); + Assert.AreEqual (c1[i], Convert.ToInt32 (c2[i]), "#M84(" + i + ")"); } { Object[] c1 = new Object [3]; @@ -1933,7 +1941,7 @@ public class ArrayTest : Assertion c2.SetValue (c1 [i], i); for (int i = 0; i < c1.Length; i++) - AssertEquals ("#M85(" + i + ")", c1[i], c2[i]); + Assert.AreEqual (c1[i], c2[i], "#M85(" + i + ")"); } { Object[] c1 = new Object [3]; @@ -1942,15 +1950,15 @@ public class ArrayTest : Assertion c1[0] = test; c2.SetValue (c1 [0], 0); - AssertEquals ("#M86", c1[0], c2[0]); - AssertEquals ("#M87", "hello", c2[0]); + Assert.AreEqual (c1[0], c2[0], "#M86"); + Assert.AreEqual ("hello", c2[0], "#M87"); } { char[] c1 = { 'a', 'b', 'c' }; string[] c2 = new string [3]; try { c2.SetValue (c1 [0], 0); - Fail ("#M88"); + Assert.Fail ("#M88"); } catch (InvalidCastException) {} } { @@ -1958,7 +1966,7 @@ public class ArrayTest : Assertion long[] c2 = new long [3]; try { c2.SetValue (c1 [0], 0); - Fail ("#M89"); + Assert.Fail ("#M89"); } catch (ArgumentException) {} } { @@ -2028,8 +2036,7 @@ public class ArrayTest : Assertion int ex_index = (i * types.Length) + j; - AssertEquals ("#M90(" + types [i] + "," + types [j] + ")", - errorThrown, arg_ex [ex_index] == 1); + Assert.AreEqual (errorThrown, arg_ex [ex_index] == 1, "#M90(" + types [i] + "," + types [j] + ")"); } } @@ -2045,7 +2052,7 @@ public class ArrayTest : Assertion errorThrown = true; } - Assert ("#M91(" + types [i] + ")", errorThrown); + Assert.IsTrue (errorThrown, "#M91(" + types [i] + ")"); } for (int i = 0; i < types.Length; i++) { @@ -2060,7 +2067,7 @@ public class ArrayTest : Assertion errorThrown = true; } - Assert ("#M92(" + types [i] + ")", errorThrown); + Assert.IsTrue (errorThrown, "#M92(" + types [i] + ")"); } for (int i = 0; i < types.Length; i++) { @@ -2075,7 +2082,7 @@ public class ArrayTest : Assertion errorThrown = true; } - Assert ("#M93(" + types [i] + ")", !errorThrown); + Assert.IsTrue (!errorThrown, "#M93(" + types [i] + ")"); } // Copy @@ -2097,8 +2104,7 @@ public class ArrayTest : Assertion int ex_index = (i * types.Length) + j; - AssertEquals ("#M94(" + types [i] + "," + types [j] + ")", - errorThrown, arg_ex [ex_index] == 1); + Assert.AreEqual (errorThrown, arg_ex [ex_index] == 1, "#M94(" + types [i] + "," + types [j] + ")"); } } @@ -2116,7 +2122,7 @@ public class ArrayTest : Assertion errorThrown = true; } - Assert ("#M95(" + types [i] + ")", errorThrown); + Assert.IsTrue (errorThrown, "#M95(" + types [i] + ")"); } for (int i = 0; i < types.Length; i++) { @@ -2133,7 +2139,7 @@ public class ArrayTest : Assertion errorThrown = true; } - Assert ("#M96(" + types [i] + ")", errorThrown); + Assert.IsTrue (errorThrown, "#M96(" + types [i] + ")"); } } } @@ -2147,7 +2153,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#N01", errorThrown); + Assert.IsTrue (errorThrown, "#N01"); } { bool errorThrown = false; @@ -2156,7 +2162,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#N02", errorThrown); + Assert.IsTrue (errorThrown, "#N02"); } { bool errorThrown = false; @@ -2166,7 +2172,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#N03", errorThrown); + Assert.IsTrue (errorThrown, "#N03"); } { bool errorThrown = false; @@ -2176,7 +2182,7 @@ public class ArrayTest : Assertion } catch (ArgumentNullException) { errorThrown = true; } - Assert("#N04", errorThrown); + Assert.IsTrue (errorThrown, "#N04"); } { int tc = 5; @@ -2184,34 +2190,34 @@ public class ArrayTest : Assertion try { Array.Sort (null, 0, 1); - Fail ("#N" + tc.ToString ()); + Assert.Fail ("#N" + tc.ToString ()); } catch (ArgumentException) {} - catch (Exception) { Fail ("#N" + tc.ToString ()); } + catch (Exception) { Assert.Fail ("#N" + tc.ToString ()); } tc++; try { Array.Sort (arr, -1, 3); - Fail ("#N" + tc.ToString ()); + Assert.Fail ("#N" + tc.ToString ()); } catch (ArgumentException) {} - catch (Exception) { Fail ("#N" + tc.ToString ()); } + catch (Exception) { Assert.Fail ("#N" + tc.ToString ()); } tc++; try { Array.Sort (arr, 1, -3); - Fail ("#N" + tc.ToString ()); + Assert.Fail ("#N" + tc.ToString ()); } catch (ArgumentException) {} - catch (Exception) { Fail ("#N" + tc.ToString ()); } + catch (Exception) { Assert.Fail ("#N" + tc.ToString ()); } tc++; try { Array.Sort (arr, arr.Length, arr.Length + 2); - Fail ("#N" + tc.ToString ()); + Assert.Fail ("#N" + tc.ToString ()); } catch (ArgumentException) {} - catch (Exception) { Fail ("#N" + tc.ToString ()); } + catch (Exception) { Assert.Fail ("#N" + tc.ToString ()); } } // note: null second array => just sort first array @@ -2220,56 +2226,56 @@ public class ArrayTest : Assertion { char[] c1 = (char[])starter.Clone(); Array.Sort(c1); - AssertEquals("#N21", 'a', c1[0]); - AssertEquals("#N22", 'b', c1[1]); - AssertEquals("#N23", 'c', c1[2]); - AssertEquals("#N24", 'd', c1[3]); - AssertEquals("#N25", 'e', c1[4]); - AssertEquals("#N26", 'f', c1[5]); + Assert.AreEqual ('a', c1[0], "#N21"); + Assert.AreEqual ('b', c1[1], "#N22"); + Assert.AreEqual ('c', c1[2], "#N23"); + Assert.AreEqual ('d', c1[3], "#N24"); + Assert.AreEqual ('e', c1[4], "#N25"); + Assert.AreEqual ('f', c1[5], "#N26"); } { char[] c1 = (char[])starter.Clone(); int[] i1 = (int[])starter1.Clone(); Array.Sort(c1, i1); - AssertEquals("#N41", 'a', c1[0]); - AssertEquals("#N42", 'b', c1[1]); - AssertEquals("#N43", 'c', c1[2]); - AssertEquals("#N44", 'd', c1[3]); - AssertEquals("#N45", 'e', c1[4]); - AssertEquals("#N46", 'f', c1[5]); - AssertEquals("#N47", 5, i1[0]); - AssertEquals("#N48", 2, i1[1]); - AssertEquals("#N49", 6, i1[2]); - AssertEquals("#N50", 1, i1[3]); - AssertEquals("#N51", 4, i1[4]); - AssertEquals("#N52", 3, i1[5]); + Assert.AreEqual ('a', c1[0], "#N41"); + Assert.AreEqual ('b', c1[1], "#N42"); + Assert.AreEqual ('c', c1[2], "#N43"); + Assert.AreEqual ('d', c1[3], "#N44"); + Assert.AreEqual ('e', c1[4], "#N45"); + Assert.AreEqual ('f', c1[5], "#N46"); + Assert.AreEqual (5, i1[0], "#N47"); + Assert.AreEqual (2, i1[1], "#N48"); + Assert.AreEqual (6, i1[2], "#N49"); + Assert.AreEqual (1, i1[3], "#N50"); + Assert.AreEqual (4, i1[4], "#N51"); + Assert.AreEqual (3, i1[5], "#N52"); } { char[] c1 = (char[])starter.Clone(); Array.Sort(c1, 1, 4); - AssertEquals("#N61", 'd', c1[0]); - AssertEquals("#N62", 'a', c1[1]); - AssertEquals("#N63", 'b', c1[2]); - AssertEquals("#N64", 'e', c1[3]); - AssertEquals("#N65", 'f', c1[4]); - AssertEquals("#N66", 'c', c1[5]); + Assert.AreEqual ('d', c1[0], "#N61"); + Assert.AreEqual ('a', c1[1], "#N62"); + Assert.AreEqual ('b', c1[2], "#N63"); + Assert.AreEqual ('e', c1[3], "#N64"); + Assert.AreEqual ('f', c1[4], "#N65"); + Assert.AreEqual ('c', c1[5], "#N66"); } { char[] c1 = (char[])starter.Clone(); int[] i1 = (int[])starter1.Clone(); Array.Sort(c1, i1, 1, 4); - AssertEquals("#N81", 'd', c1[0]); - AssertEquals("#N82", 'a', c1[1]); - AssertEquals("#N83", 'b', c1[2]); - AssertEquals("#N84", 'e', c1[3]); - AssertEquals("#N85", 'f', c1[4]); - AssertEquals("#N86", 'c', c1[5]); - AssertEquals("#N87", 1, i1[0]); - AssertEquals("#N88", 5, i1[1]); - AssertEquals("#N89", 2, i1[2]); - AssertEquals("#N90", 4, i1[3]); - AssertEquals("#N91", 3, i1[4]); - AssertEquals("#N92", 6, i1[5]); + Assert.AreEqual ('d', c1[0], "#N81"); + Assert.AreEqual ('a', c1[1], "#N82"); + Assert.AreEqual ('b', c1[2], "#N83"); + Assert.AreEqual ('e', c1[3], "#N84"); + Assert.AreEqual ('f', c1[4], "#N85"); + Assert.AreEqual ('c', c1[5], "#N86"); + Assert.AreEqual (1, i1[0], "#N87"); + Assert.AreEqual (5, i1[1], "#N88"); + Assert.AreEqual (2, i1[2], "#N89"); + Assert.AreEqual (4, i1[3], "#N90"); + Assert.AreEqual (3, i1[4], "#N91"); + Assert.AreEqual (6, i1[5], "#N92"); } } @@ -2286,7 +2292,7 @@ public class ArrayTest : Assertion { catched=true; } - Assert("#TI01",!catched); + Assert.IsTrue (!catched, "#TI01"); } [Test] @@ -2297,7 +2303,7 @@ public class ArrayTest : Assertion int[] b = {1,2,0}; for(int i=a.GetLowerBound(0);i<=a.GetUpperBound(0);i++) { - AssertEquals("#TI02 " + i ,a[i],b[i]); + Assert.AreEqual (a[i], b[i], "#TI02 " + i); } } @@ -2309,7 +2315,7 @@ public class ArrayTest : Assertion double[] b = {1.0,2.0,0.0}; for(int i=a.GetLowerBound(0);i<=a.GetUpperBound(0);i++) { - AssertEquals("#TI03 " + i ,a[i],b[i]); + Assert.AreEqual (a[i], b[i], "#TI03 " + i); } } @@ -2321,7 +2327,7 @@ public class ArrayTest : Assertion float[] b = {1.0F,2.0F,0.0F}; for(int i=a.GetLowerBound(0);i<=a.GetUpperBound(0);i++) { - AssertEquals("#TI04 " + i ,a[i],b[i]); + Assert.AreEqual (a[i], b[i], "#TI04 " + i); } } @@ -2333,7 +2339,7 @@ public class ArrayTest : Assertion char[] b = {'1','.','0','F','2','.','0','F'}; for(int i=a.GetLowerBound(0);i<=a.GetUpperBound(0);i++) { - AssertEquals("#TI05 " + i ,a[i],b[i]); + Assert.AreEqual (a[i], b[i], "#TI05 " + i); } } @@ -2345,7 +2351,7 @@ public class ArrayTest : Assertion string[] b = {"hola","adios","menos","mas"}; for(int i=a.GetLowerBound(0);i<=a.GetUpperBound(0);i++) { - AssertEquals("#TI06 " + i ,a[i],b[i]); + Assert.AreEqual (a[i], b[i], "#TI06 " + i); } } @@ -2357,7 +2363,7 @@ public class ArrayTest : Assertion enua[] b = {enua.hola,enua.adios,enua.menos,enua.mas}; for(int i=a.GetLowerBound(0);i<=a.GetUpperBound(0);i++) { - AssertEquals("#TI07 " + i ,a[i],b[i]); + Assert.AreEqual (a[i], b[i], "#TI07 " + i); } } @@ -2368,7 +2374,7 @@ public class ArrayTest : Assertion a.Initialize(); foreach(int b in a) { - AssertEquals("#TI08",b,0); + Assert.AreEqual (b, 0, "#TI08"); } } @@ -2379,7 +2385,7 @@ public class ArrayTest : Assertion a.Initialize(); foreach(char b in a) { - AssertEquals("#TI09",b,0); + Assert.AreEqual (b, 0, "#TI09"); } } @@ -2390,7 +2396,7 @@ public class ArrayTest : Assertion a.Initialize(); foreach(double b in a) { - AssertEquals("#TI09",b,0.0); + Assert.AreEqual (b, 0.0, "#TI09"); } } @@ -2401,7 +2407,7 @@ public class ArrayTest : Assertion a.Initialize(); foreach(string b in a) { - AssertEquals("#TI10",b,null); + Assert.AreEqual (b, null, "#TI10"); } } @@ -2412,7 +2418,7 @@ public class ArrayTest : Assertion a.Initialize(); foreach(object b in a) { - AssertEquals("#TI11",b,null); + Assert.AreEqual (b, null, "#TI11"); } } @@ -2423,7 +2429,7 @@ public class ArrayTest : Assertion a.Initialize(); foreach(AClass b in a) { - AssertEquals("#TI12",b,null); + Assert.AreEqual (b, null, "#TI12"); } } @@ -2435,7 +2441,7 @@ public class ArrayTest : Assertion a.Initialize(); foreach(AStruct b in a) { - AssertEquals("#TI14",b,new AStruct()); + Assert.AreEqual (b, new AStruct(), "#TI14"); } } @@ -2451,7 +2457,7 @@ public class ArrayTest : Assertion b[1].s = "HOLA"; for(int i=a.GetLowerBound(0);i<=a.GetUpperBound(0);i++) { - AssertEquals("#TI15 " + i ,a[i],b[i]); + Assert.AreEqual (a[i], b[i], "#TI15 " + i); } } @@ -2462,7 +2468,7 @@ public class ArrayTest : Assertion a.Initialize(); foreach(DateTime b in a) { - AssertEquals("#TI16",b,new DateTime()); + Assert.AreEqual (b, new DateTime(), "#TI16"); } } @@ -2542,10 +2548,10 @@ public class ArrayTest : Assertion double [] a = new double [2] { 0.9, 0.3 }; uint [] b = new uint [2] { 4, 7 }; Array.Sort (a, b); - AssertEquals ("#1", 0.3, a [0]); - AssertEquals ("#2", 0.9, a [1]); - AssertEquals ("#3", 7, b [0]); - AssertEquals ("#4", 4, b [1]); + Assert.AreEqual (0.3, a [0], "#1"); + Assert.AreEqual (0.9, a [1], "#2"); + Assert.AreEqual (7, b [0], "#3"); + Assert.AreEqual (4, b [1], "#4"); } [Test] @@ -2560,7 +2566,7 @@ public class ArrayTest : Assertion } Array.Clear (matrix, 0, 8); for (int i=0; i < 8; i++) { - AssertNull (i.ToString (), matrix [i]); + Assert.IsNull (matrix [i], i.ToString ()); } } @@ -2569,10 +2575,10 @@ public class ArrayTest : Assertion { byte[,] matrix = new byte [2,2] { {1, 1}, {2, 2} }; Array.Clear (matrix, 0, 2); - AssertEquals ("0,0", 0, matrix [0,0]); - AssertEquals ("0,1", 0, matrix [0,1]); - AssertEquals ("1,0", 2, matrix [1,0]); - AssertEquals ("1,1", 2, matrix [1,1]); + Assert.AreEqual (0, matrix [0, 0], "0,0"); + Assert.AreEqual (0, matrix [0, 1], "0,1"); + Assert.AreEqual (2, matrix [1, 0], "1,0"); + Assert.AreEqual (2, matrix [1, 1], "1,1"); } [Test] @@ -2665,7 +2671,7 @@ public class ArrayTest : Assertion // that of the search object. // CharX [] x = { new CharX ('a'), new CharX ('b'), new CharX ('c') }; - AssertEquals (1, Array.BinarySearch (x, 'b')); + Assert.AreEqual (1, Array.BinarySearch (x, 'b')); } class Comparer: IComparer { @@ -2691,14 +2697,14 @@ public class ArrayTest : Assertion public void BinarySearch1_EmptyList () { int[] array = new int[0]; - AssertEquals ("BinarySearch", - 1, Array.BinarySearch (array, 0)); + Assert.AreEqual (- 1, Array.BinarySearch (array, 0), "BinarySearch"); } [Test] public void BinarySearch2_EmptyList () { int[] array = new int[0]; - AssertEquals ("BinarySearch", -1, Array.BinarySearch (array, 0, 0, 0)); + Assert.AreEqual (-1, Array.BinarySearch (array, 0, 0, 0), "BinarySearch"); } [Test] @@ -2706,9 +2712,9 @@ public class ArrayTest : Assertion { Comparer comparer = new Comparer (); int[] array = new int[0]; - AssertEquals ("BinarySearch", -1, Array.BinarySearch (array, 0, comparer)); + Assert.AreEqual (-1, Array.BinarySearch (array, 0, comparer), "BinarySearch"); // bug 77030 - the comparer isn't called for an empty array/list - Assert ("Called", !comparer.Called); + Assert.IsTrue (!comparer.Called, "Called"); } [Test] @@ -2716,9 +2722,9 @@ public class ArrayTest : Assertion { Comparer comparer = new Comparer (); int[] array = new int[0]; - AssertEquals ("BinarySearch", -1, Array.BinarySearch (array, 0, 0, comparer)); + Assert.AreEqual (-1, Array.BinarySearch (array, 0, 0, comparer), "BinarySearch"); // bug 77030 - the comparer isn't called for an empty array/list - Assert ("Called", !comparer.Called); + Assert.IsTrue (!comparer.Called, "Called"); } #if NET_2_0 @@ -2732,7 +2738,7 @@ public class ArrayTest : Assertion [Test] public void ReadOnly_Count () { - AssertEquals (10, Array.AsReadOnly (new int [10]).Count); + Assert.AreEqual (10, Array.AsReadOnly (new int [10]).Count); } [Test] @@ -2743,8 +2749,8 @@ public class ArrayTest : Assertion arr [1] = 5; IList a = Array.AsReadOnly (arr); - Assert (a.Contains (3)); - Assert (!a.Contains (6)); + Assert.IsTrue (a.Contains (3)); + Assert.IsTrue (!a.Contains (6)); } [Test] @@ -2755,9 +2761,9 @@ public class ArrayTest : Assertion arr [1] = 5; IList a = Array.AsReadOnly (arr); - AssertEquals (0, a.IndexOf (3)); - AssertEquals (1, a.IndexOf (5)); - AssertEquals (-1, a.IndexOf (6)); + Assert.AreEqual (0, a.IndexOf (3)); + Assert.AreEqual (1, a.IndexOf (5)); + Assert.AreEqual (-1, a.IndexOf (6)); } [Test] @@ -2768,12 +2774,12 @@ public class ArrayTest : Assertion arr [1] = 5; IList a = Array.AsReadOnly (arr); - AssertEquals (3, a [0]); - AssertEquals (5, a [1]); + Assert.AreEqual (3, a [0]); + Assert.AreEqual (5, a [1]); /* Check that modifications to the original array are visible */ arr [0] = 6; - AssertEquals (6, a [0]); + Assert.AreEqual (6, a [0]); } [Test] @@ -2788,7 +2794,7 @@ public class ArrayTest : Assertion foreach (int i in Array.AsReadOnly (arr)) sum += i; - AssertEquals (45, sum); + Assert.AreEqual (45, sum); } [Test] @@ -2796,22 +2802,22 @@ public class ArrayTest : Assertion { int [] arr = new int [] { 1, 3, 5 }; Array.Resize (ref arr, 3); - AssertEquals ("#A1", 3, arr.Length); - AssertEquals ("#A2", 1, arr [0]); - AssertEquals ("#A3", 3, arr [1]); - AssertEquals ("#A4", 5, arr [2]); + Assert.AreEqual (3, arr.Length, "#A1"); + Assert.AreEqual (1, arr [0], "#A2"); + Assert.AreEqual (3, arr [1], "#A3"); + Assert.AreEqual (5, arr [2], "#A4"); Array.Resize (ref arr, 2); - AssertEquals ("#B1", 2, arr.Length); - AssertEquals ("#B2", 1, arr [0]); - AssertEquals ("#B3", 3, arr [1]); + Assert.AreEqual (2, arr.Length, "#B1"); + Assert.AreEqual (1, arr [0], "#B2"); + Assert.AreEqual (3, arr [1], "#B3"); Array.Resize (ref arr, 4); - AssertEquals ("#C1", 4, arr.Length); - AssertEquals ("#C2", 1, arr [0]); - AssertEquals ("#C3", 3, arr [1]); - AssertEquals ("#C4", 0, arr [2]); - AssertEquals ("#C5", 0, arr [3]); + Assert.AreEqual (4, arr.Length, "#C1"); + Assert.AreEqual (1, arr [0], "#C2"); + Assert.AreEqual (3, arr [1], "#C3"); + Assert.AreEqual (0, arr [2], "#C4"); + Assert.AreEqual (0, arr [3], "#C5"); } [Test] @@ -2819,7 +2825,7 @@ public class ArrayTest : Assertion { int [] arr = null; Array.Resize (ref arr, 10); - AssertEquals (arr.Length, 10); + Assert.AreEqual (arr.Length, 10); } [Test] @@ -2827,10 +2833,10 @@ public class ArrayTest : Assertion { EquatableClass[] list = new EquatableClass[] {new EquatableClass (0), new EquatableClass (1), new EquatableClass (0)}; - AssertEquals ("#0", 0, Array.IndexOf (list, list[0])); - AssertEquals ("#1", 0, Array.IndexOf (list, new EquatableClass (0))); - AssertEquals ("#2", 2, Array.LastIndexOf (list, list[0])); - AssertEquals ("#3", 2, Array.LastIndexOf (list, new EquatableClass (0))); + Assert.AreEqual (0, Array.IndexOf (list, list[0]), "#0"); + Assert.AreEqual (0, Array.IndexOf (list, new EquatableClass (0)), "#1"); + Assert.AreEqual (2, Array.LastIndexOf (list, list[0]), "#2"); + Assert.AreEqual (2, Array.LastIndexOf (list, new EquatableClass (0)), "#3"); } public class EquatableClass : IEquatable @@ -2852,7 +2858,7 @@ public class ArrayTest : Assertion { IList arr = new int [10]; arr [0] = 5; - AssertEquals (5, arr [0]); + Assert.AreEqual (5, arr [0]); IList arr2 = new FooStruct [10]; FooStruct s = new FooStruct (); @@ -2860,12 +2866,12 @@ public class ArrayTest : Assertion s.j = 22; arr2 [5] = s; s = arr2 [5]; - AssertEquals (11, s.i); - AssertEquals (22, s.j); + Assert.AreEqual (11, s.i); + Assert.AreEqual (22, s.j); IList arr3 = new string [10]; arr3 [5] = "ABC"; - AssertEquals ("ABC", arr3 [5]); + Assert.AreEqual ("ABC", arr3 [5]); } struct FooStruct { @@ -2880,22 +2886,22 @@ public class ArrayTest : Assertion ICollection test; test = new List(); - AssertEquals ("list", test.Contains (null), false); + Assert.AreEqual (test.Contains (null), false, "list"); test = new object[] {}; - AssertEquals ("empty array", test.Contains (null), false); + Assert.AreEqual (test.Contains (null), false, "empty array"); test = new object[] {null}; - AssertEquals ("array with null", test.Contains (null), true); + Assert.AreEqual (test.Contains (null), true, "array with null"); test = new List(test); - AssertEquals ("List with test", test.Contains (null), true); + Assert.AreEqual (test.Contains (null), true, "List with test"); test = new object[] {new object()}; - AssertEquals ("array with object", test.Contains (null), false); + Assert.AreEqual (test.Contains (null), false, "array with object"); test = new List(test); - AssertEquals ("array with test", test.Contains (null), false); + Assert.AreEqual (test.Contains (null), false, "array with test"); } #endif // TARGET_JVM #endif @@ -2946,15 +2952,15 @@ public class ArrayTest : Assertion { int[] array = new int[] { 1, 2, 3}; IEnumerator e = ((IEnumerable)array).GetEnumerator (); - Assert ("#A1", e.MoveNext ()); - AssertEquals ("#A2", 1, e.Current); - Assert ("#A3", e.MoveNext ()); - AssertEquals ("#A4", 2, e.Current); + Assert.IsTrue (e.MoveNext (), "#A1"); + Assert.AreEqual (1, e.Current, "#A2"); + Assert.IsTrue (e.MoveNext (), "#A3"); + Assert.AreEqual (2, e.Current, "#A4"); e.Reset (); - Assert ("#C1", e.MoveNext ()); - AssertEquals ("#C2", 1, e.Current); + Assert.IsTrue (e.MoveNext (), "#C1"); + Assert.AreEqual (1, e.Current, "#C2"); } [Test] @@ -2962,21 +2968,21 @@ public class ArrayTest : Assertion { int[] array = new int[] { 1, 2, 3 }; IEnumerator e = ((IEnumerable)array).GetEnumerator (); - Assert ("#A1", e.MoveNext ()); - AssertEquals ("#A2", 1, e.Current); - Assert ("#A3", e.MoveNext ()); - AssertEquals ("#A4", 2, e.Current); - Assert ("#A5", e.MoveNext ()); - AssertEquals ("#A6", 3, e.Current); - Assert ("#A6", !e.MoveNext ()); + Assert.IsTrue (e.MoveNext (), "#A1"); + Assert.AreEqual (1, e.Current, "#A2"); + Assert.IsTrue (e.MoveNext (), "#A3"); + Assert.AreEqual (2, e.Current, "#A4"); + Assert.IsTrue (e.MoveNext (), "#A5"); + Assert.AreEqual (3, e.Current, "#A6"); + Assert.IsTrue (!e.MoveNext (), "#A6"); try { - Fail ("#B1:" + e.Current); + Assert.Fail ("#B1:" + e.Current); } catch (InvalidOperationException ex) { // Enumeration already finished - AssertEquals ("#B2", typeof (InvalidOperationException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); + Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); } } @@ -2987,12 +2993,12 @@ public class ArrayTest : Assertion IEnumerator e = ((IEnumerable)array).GetEnumerator (); try { - Fail ("#A1:" + e.Current); + Assert.Fail ("#A1:" + e.Current); } catch (InvalidOperationException ex) { // Enumeration has not started. Call MoveNext - AssertEquals ("#A2", typeof (InvalidOperationException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); + Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); } } @@ -3005,19 +3011,19 @@ public class ArrayTest : Assertion e.Reset (); try { - Fail ("#B1:" + e.Current); + Assert.Fail ("#B1:" + e.Current); } catch (InvalidOperationException ex) { // Enumeration has not started. Call MoveNext - AssertEquals ("#B2", typeof (InvalidOperationException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); + Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); } } public void ICollection_IsReadOnly() { ICollection arr = new string [10]; - Assert (arr.IsReadOnly); + Assert.IsTrue (arr.IsReadOnly); } #endif } diff --git a/mcs/class/corlib/Test/System/BooleanTest.cs b/mcs/class/corlib/Test/System/BooleanTest.cs index 032994c7aeb..332d5cef9a5 100644 --- a/mcs/class/corlib/Test/System/BooleanTest.cs +++ b/mcs/class/corlib/Test/System/BooleanTest.cs @@ -16,31 +16,31 @@ using System.Globalization; namespace MonoTests.System { [TestFixture] -public class BooleanTest : Assertion { +public class BooleanTest { [Test] public void Strings () { - AssertEquals("Wrong False string", "False", Boolean.FalseString); - AssertEquals("Wrong True string", "True", Boolean.TrueString); + Assert.AreEqual("False", Boolean.FalseString, "Wrong False string"); + Assert.AreEqual("True", Boolean.TrueString, "Wrong True string"); } [Test] public void CompareTo () { Boolean t=true,f=false; - Assert ("f.CompareTo(t) < 0", f.CompareTo(t) < 0); - Assert ("f.CompareTo(f)", f.CompareTo(f) == 0); - Assert ("t.CompareTo(t) == 0", t.CompareTo(t) == 0); - Assert ("t.CompareTo(f) > 0", t.CompareTo(f) > 0); - Assert ("t.CompareTo(null) > 0", t.CompareTo(null) > 0); + Assert.IsTrue (f.CompareTo(t) < 0, "f.CompareTo(t) < 0"); + Assert.IsTrue (f.CompareTo(f) == 0, "f.CompareTo(f)"); + Assert.IsTrue (t.CompareTo(t) == 0, "t.CompareTo(t) == 0"); + Assert.IsTrue (t.CompareTo(f) > 0, "t.CompareTo(f) > 0"); + Assert.IsTrue (t.CompareTo(null) > 0, "t.CompareTo(null) > 0"); byte[] array = new byte [1] { 0x02 }; bool t2 = BitConverter.ToBoolean (array, 0); - Assert ("f.CompareTo(t2) < 0", f.CompareTo(t2) < 0); - Assert ("t2.CompareTo(t2) == 0", t2.CompareTo(t2) == 0); - Assert ("t2.CompareTo(f) > 0", t2.CompareTo(f) > 0); - Assert ("t2.CompareTo(null) > 0", t2.CompareTo(null) > 0); + Assert.IsTrue (f.CompareTo(t2) < 0, "f.CompareTo(t2) < 0"); + Assert.IsTrue (t2.CompareTo(t2) == 0, "t2.CompareTo(t2) == 0"); + Assert.IsTrue (t2.CompareTo(f) > 0, "t2.CompareTo(f) > 0"); + Assert.IsTrue (t2.CompareTo(null) > 0, "t2.CompareTo(null) > 0"); } [Test] @@ -55,21 +55,21 @@ public class BooleanTest : Assertion { { Boolean t=true, f=false; string s = "What Ever"; - Assert ("t.Equals(t)", t.Equals(t)); - Assert ("f.Equals(f)", f.Equals(f)); - Assert ("!t.Equals(f)", !t.Equals(f)); - Assert ("!f.Equals(t)", !f.Equals(t)); - Assert ("!t.Equals(null)", !t.Equals(null)); - Assert ("!f.Equals(null)", !f.Equals(null)); - Assert ("!t.Equals(s)", !t.Equals(s)); - Assert ("!f.Equals(s)", !f.Equals(s)); + Assert.IsTrue (t.Equals(t), "t.Equals(t)"); + Assert.IsTrue (f.Equals(f), "f.Equals(f)"); + Assert.IsTrue (!t.Equals(f), "!t.Equals(f)"); + Assert.IsTrue (!f.Equals(t), "!f.Equals(t)"); + Assert.IsTrue (!t.Equals(null), "!t.Equals(null)"); + Assert.IsTrue (!f.Equals(null), "!f.Equals(null)"); + Assert.IsTrue (!t.Equals(s), "!t.Equals(s)"); + Assert.IsTrue (!f.Equals(s), "!f.Equals(s)"); byte[] array = new byte [1] { 0x02 }; bool t2 = BitConverter.ToBoolean (array, 0); - Assert ("t2.Equals(t2)", t2.Equals(t2)); - Assert ("t.Equals(t2)", t.Equals(t2)); - Assert ("t2.Equals(t)", t2.Equals(t)); - Assert ("!f.Equals(t2)", !f.Equals(t2)); + Assert.IsTrue (t2.Equals(t2), "t2.Equals(t2)"); + Assert.IsTrue (t.Equals(t2), "t.Equals(t2)"); + Assert.IsTrue (t2.Equals(t), "t2.Equals(t)"); + Assert.IsTrue (!f.Equals(t2), "!f.Equals(t2)"); } #pragma warning disable 1718 @@ -77,17 +77,17 @@ public class BooleanTest : Assertion { public void TestEqualOperator () { Boolean t=true, f=false; - Assert ("t==t", t==t); - Assert ("f==f", f==f); - Assert ("t!=f", t!=f); - Assert ("f!=t", f!=t); + Assert.IsTrue (t==t, "t==t"); + Assert.IsTrue (f==f, "f==f"); + Assert.IsTrue (t!=f, "t!=f"); + Assert.IsTrue (f!=t, "f!=t"); byte[] array = new byte [1] { 0x02 }; bool t2 = BitConverter.ToBoolean (array, 0); - Assert ("t2==t2", t2==t2); - Assert ("t==t2", t==t2); - Assert ("t2==t", t2==t); - Assert ("f!=t2", f!=t2); + Assert.IsTrue (t2==t2, "t2==t2"); + Assert.IsTrue (t==t2, "t==t2"); + Assert.IsTrue (t2==t, "t2==t"); + Assert.IsTrue (f!=t2, "f!=t2"); } #pragma warning restore 1718 @@ -95,35 +95,35 @@ public class BooleanTest : Assertion { public void TestGetHashCode () { Boolean t=true, f=false; - AssertEquals("GetHashCode True failed", 1, t.GetHashCode()); - AssertEquals("GetHashCode True failed", 0, f.GetHashCode()); + Assert.AreEqual(1, t.GetHashCode(), "GetHashCode True failed"); + Assert.AreEqual(0, f.GetHashCode(), "GetHashCode True failed"); } [Test] public void TestGetType () { Boolean t=true, f=false; - AssertEquals("GetType failed", true, Object.ReferenceEquals(t.GetType(), f.GetType())); + Assert.AreEqual(true, Object.ReferenceEquals(t.GetType(), f.GetType()), "GetType failed"); } [Test] public void GetTypeCode () { Boolean b=true; - AssertEquals("GetTypeCode failed", TypeCode.Boolean, b.GetTypeCode()); + Assert.AreEqual(TypeCode.Boolean, b.GetTypeCode(), "GetTypeCode failed"); } [Test] public void Parse () { - AssertEquals("Parse True failed", true, Boolean.Parse("True")); - AssertEquals("Parse True failed", true, Boolean.Parse(" True")); - AssertEquals("Parse True failed", true, Boolean.Parse("True ")); - AssertEquals("Parse True failed", true, Boolean.Parse("tRuE")); - AssertEquals("Parse False failed", false, Boolean.Parse("False")); - AssertEquals("Parse False failed", false, Boolean.Parse(" False")); - AssertEquals("Parse False failed", false, Boolean.Parse("False ")); - AssertEquals("Parse False failed", false, Boolean.Parse("fAlSe")); + Assert.AreEqual(true, Boolean.Parse("True"), "Parse True failed"); + Assert.AreEqual(true, Boolean.Parse(" True"), "Parse True failed"); + Assert.AreEqual(true, Boolean.Parse("True "), "Parse True failed"); + Assert.AreEqual(true, Boolean.Parse("tRuE"), "Parse True failed"); + Assert.AreEqual(false, Boolean.Parse("False"), "Parse False failed"); + Assert.AreEqual(false, Boolean.Parse(" False"), "Parse False failed"); + Assert.AreEqual(false, Boolean.Parse("False "), "Parse False failed"); + Assert.AreEqual(false, Boolean.Parse("fAlSe"), "Parse False failed"); } [Test] @@ -144,8 +144,8 @@ public class BooleanTest : Assertion { public void TestToString () { Boolean t=true,f=false; - AssertEquals("ToString True Failed", Boolean.TrueString, t.ToString()); - AssertEquals("ToString False Failed", Boolean.FalseString, f.ToString()); + Assert.AreEqual(Boolean.TrueString, t.ToString(), "ToString True Failed"); + Assert.AreEqual(Boolean.FalseString, f.ToString(), "ToString False Failed"); } } diff --git a/mcs/class/corlib/Test/System/BufferTest.cs b/mcs/class/corlib/Test/System/BufferTest.cs index 441b9f4d4c6..b06c3fecf8b 100644 --- a/mcs/class/corlib/Test/System/BufferTest.cs +++ b/mcs/class/corlib/Test/System/BufferTest.cs @@ -15,7 +15,7 @@ using System; namespace MonoTests.System { [TestFixture] - public class BufferTest : Assertion { + public class BufferTest { const int SIZE = 10; byte [] byteArray = new byte [SIZE]; // 8-bits unsigned integer array @@ -31,7 +31,7 @@ namespace MonoTests.System { Buffer.BlockCopy (myArray1, 0, myArray2, 0, SizeOfInt32 * myArray1.Length); for (int i = 0; i < myArray1.Length; i++) - AssertEquals ("TestBlockCopy Error at i=" + i, i + 1, myArray2 [i]); + Assert.AreEqual (i + 1, myArray2 [i], "TestBlockCopy Error at i=" + i); } [Test] @@ -154,39 +154,39 @@ namespace MonoTests.System { try { Buffer.ByteLength (null); - Fail ("TestByteLength: ArgumentNullException not thrown"); + Assert.Fail ("TestByteLength: ArgumentNullException not thrown"); } catch (ArgumentNullException) { // do nothing, this is expected } catch (Exception e) { - Fail ("Unexpected exception on Buffer.ByteLength (null):" + e); + Assert.Fail ("Unexpected exception on Buffer.ByteLength (null):" + e); } try { Buffer.ByteLength (someArray); - Fail ("TestByteLength: ArgumentException not thrown"); + Assert.Fail ("TestByteLength: ArgumentException not thrown"); } catch (ArgumentException) { // do nothing, this is expected } catch (Exception e) { - Fail ("Unexpected exception on Buffer.ByteLength (non primitive array):" + e); + Assert.Fail ("Unexpected exception on Buffer.ByteLength (non primitive array):" + e); } numBytes = Buffer.ByteLength (floatArray); - AssertEquals ("TestByteLength: wrong byteLength for floatArray", 40, numBytes); + Assert.AreEqual (40, numBytes, "TestByteLength: wrong byteLength for floatArray"); numBytes = Buffer.ByteLength (floatArray2); - AssertEquals ("TestByteLength: wrong byteLength for floatArray2", 400, numBytes); + Assert.AreEqual (400, numBytes, "TestByteLength: wrong byteLength for floatArray2"); numBytes = Buffer.ByteLength (floatArray3); - AssertEquals ("TestByteLength: wrong byteLength for floatArray3", 4000, numBytes); + Assert.AreEqual (4000, numBytes, "TestByteLength: wrong byteLength for floatArray3"); numBytes = Buffer.ByteLength (floatArray4); - AssertEquals ("TestByteLength: wrong byteLength for floatArray4", 0, numBytes); + Assert.AreEqual (0, numBytes, "TestByteLength: wrong byteLength for floatArray4"); numBytes = Buffer.ByteLength (floatArray5); - AssertEquals ("TestByteLength: wrong byteLength for floatArray5", 0, numBytes); + Assert.AreEqual (0, numBytes, "TestByteLength: wrong byteLength for floatArray5"); numBytes = Buffer.ByteLength (floatArray6); - AssertEquals ("TestByteLength: wrong byteLength for floatArray6", 0, numBytes); + Assert.AreEqual (0, numBytes, "TestByteLength: wrong byteLength for floatArray6"); } [Test] @@ -203,8 +203,7 @@ namespace MonoTests.System { } catch (ArgumentNullException) { errorThrown = true; } - Assert ("TestGetByte: ArgumentNullException not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "TestGetByte: ArgumentNullException not thrown"); errorThrown = false; @@ -213,8 +212,7 @@ namespace MonoTests.System { } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("TestGetByte: ArgumentOutOfRangeException (negative index) not implemented", - errorThrown); + Assert.IsTrue (errorThrown, "TestGetByte: ArgumentOutOfRangeException (negative index) not implemented"); errorThrown = false; @@ -223,20 +221,20 @@ namespace MonoTests.System { } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("TestGetByte: ArgumentOutOfRangeException (index bigger/equal than array's size not thrown", errorThrown); + Assert.IsTrue (errorThrown, "TestGetByte: ArgumentOutOfRangeException (index bigger/equal than array's size not thrown"); errorThrown = false; try { Buffer.GetByte (someArray, 0); - Fail ("TestGetByte: ArgumentException not thrown"); + Assert.Fail ("TestGetByte: ArgumentException not thrown"); } catch (ArgumentException) { // do nothing, this is expected } catch (Exception e) { - Fail ("Unexpected exception on Buffer.GetByte (non primitive array):" + e); + Assert.Fail ("Unexpected exception on Buffer.GetByte (non primitive array):" + e); } - AssertEquals ("TestGetByte Error", (Byte)8, Buffer.GetByte (byteArray, 5)); + Assert.AreEqual ((Byte)8, Buffer.GetByte (byteArray, 5), "TestGetByte Error"); } [Test] @@ -250,7 +248,7 @@ namespace MonoTests.System { } catch (ArgumentNullException) { errorThrown = true; } - Assert ("TestSetByte: ArgumentNullException not thrown", errorThrown); + Assert.IsTrue (errorThrown, "TestSetByte: ArgumentNullException not thrown"); errorThrown = false; try { @@ -258,8 +256,7 @@ namespace MonoTests.System { } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("TestSetByte: ArgumentOutOfRangeException (case: negative index) not thrown", - errorThrown); + Assert.IsTrue (errorThrown, "TestSetByte: ArgumentOutOfRangeException (case: negative index) not thrown"); errorThrown = false; try { @@ -267,21 +264,20 @@ namespace MonoTests.System { } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert ("TestSetByte: ArgumentOutOfRangeException (case: index bigger/equal than array'size", - errorThrown); + Assert.IsTrue (errorThrown, "TestSetByte: ArgumentOutOfRangeException (case: index bigger/equal than array'size"); errorThrown = false; try { Buffer.SetByte (someArray, 0, 42); - Fail ("TestSetByte: ArgumentException not thrown"); + Assert.Fail ("TestSetByte: ArgumentException not thrown"); } catch (ArgumentException) { // do nothing, this is expected } catch (Exception e) { - Fail ("Unexpected exception on Buffer.SetByte (non primitive array):" + e); + Assert.Fail ("Unexpected exception on Buffer.SetByte (non primitive array):" + e); } Buffer.SetByte (byteArray, 3, (byte) 10); - AssertEquals ("TestSetByte", (Byte)10, Buffer.GetByte (byteArray, 3)); + Assert.AreEqual ((Byte)10, Buffer.GetByte (byteArray, 3), "TestSetByte"); } } } diff --git a/mcs/class/corlib/Test/System/ByteTest.cs b/mcs/class/corlib/Test/System/ByteTest.cs index 7e5054e257a..21fbe38d219 100644 --- a/mcs/class/corlib/Test/System/ByteTest.cs +++ b/mcs/class/corlib/Test/System/ByteTest.cs @@ -14,7 +14,7 @@ namespace MonoTests.System { [TestFixture] -public class ByteTest : Assertion +public class ByteTest { private const Byte MyByte1 = 42; private const Byte MyByte2 = 0; @@ -97,31 +97,31 @@ public class ByteTest : Assertion public void TestMinMax() { - AssertEquals(Byte.MinValue, MyByte2); - AssertEquals(Byte.MaxValue, MyByte3); + Assert.AreEqual(Byte.MinValue, MyByte2); + Assert.AreEqual(Byte.MaxValue, MyByte3); } public void TestCompareTo() { - Assert(MyByte3.CompareTo(MyByte2) > 0); - Assert(MyByte2.CompareTo(MyByte2) == 0); - Assert(MyByte1.CompareTo((object)(Byte)42) == 0); - Assert(MyByte2.CompareTo(MyByte3) < 0); + Assert.IsTrue (MyByte3.CompareTo(MyByte2) > 0); + Assert.IsTrue (MyByte2.CompareTo(MyByte2) == 0); + Assert.IsTrue (MyByte1.CompareTo((object)(Byte)42) == 0); + Assert.IsTrue (MyByte2.CompareTo(MyByte3) < 0); try { MyByte2.CompareTo((object)100); - Fail("Should raise a System.ArgumentException"); + Assert.Fail ("Should raise a System.ArgumentException"); } catch (Exception e) { - Assert(typeof(ArgumentException) == e.GetType()); + Assert.IsTrue (typeof(ArgumentException) == e.GetType()); } } public void TestEquals() { - Assert(MyByte1.Equals(MyByte1)); - Assert(MyByte1.Equals((object)(Byte)42)); - Assert(MyByte1.Equals((object)(Int16)42) == false); - Assert(MyByte1.Equals(MyByte2) == false); + Assert.IsTrue (MyByte1.Equals(MyByte1)); + Assert.IsTrue (MyByte1.Equals((object)(Byte)42)); + Assert.IsTrue (MyByte1.Equals((object)(Int16)42) == false); + Assert.IsTrue (MyByte1.Equals(MyByte2) == false); } public void TestGetHashCode() @@ -132,60 +132,59 @@ public class ByteTest : Assertion MyByte3.GetHashCode(); } catch { - Fail("GetHashCode should not raise an exception here"); + Assert.Fail ("GetHashCode should not raise an exception here"); } } public void TestParse() { //test Parse(string s) - Assert("MyByte1="+MyByte1+", MyString1="+MyString1+", Parse="+Byte.Parse(MyString1) , MyByte1 == Byte.Parse(MyString1)); - Assert("MyByte2", MyByte2 == Byte.Parse(MyString2)); - Assert("MyByte3", MyByte3 == Byte.Parse(MyString3)); + Assert.IsTrue (MyByte1 == Byte.Parse(MyString1), "MyByte1="+MyByte1+", MyString1="+MyString1+", Parse="+Byte.Parse(MyString1)); + Assert.IsTrue(MyByte2 == Byte.Parse(MyString2), "MyByte2"); + Assert.IsTrue(MyByte3 == Byte.Parse(MyString3), "MyByte3"); try { Byte.Parse(null); - Fail("Should raise a System.ArgumentNullException"); + Assert.Fail ("Should raise a System.ArgumentNullException"); } catch (Exception e) { - Assert("Should get ArgumentNullException", typeof(ArgumentNullException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentNullException) == e.GetType(), "Should get ArgumentNullException"); } try { Byte.Parse("not-a-number"); - Fail("Should raise a System.FormatException"); + Assert.Fail ("Should raise a System.FormatException"); } catch (Exception e) { - Assert("not-a-number", typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType(), "not-a-number"); } //test Parse(string s, NumberStyles style) - AssertEquals(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", - (byte)42, Byte.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", - NumberStyles.Currency)); + Assert.AreEqual((byte)42, Byte.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", NumberStyles.Currency), + " "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 "); try { Byte.Parse(NumberFormatInfo.CurrentInfo.CurrencySymbol+"42", NumberStyles.Integer); - Fail("Should raise a System.FormatException"); + Assert.Fail ("Should raise a System.FormatException"); } catch (Exception e) { - Assert(NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 and NumberStyles.Integer", typeof(FormatException) == e.GetType()); + Assert.IsTrue (typeof(FormatException) == e.GetType(), NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 and NumberStyles.Integer"); } //test Parse(string s, IFormatProvider provider) - Assert(" 42 and Nfi", 42 == Byte.Parse(" 42 ", Nfi)); + Assert.IsTrue(42 == Byte.Parse(" 42 ", Nfi), " 42 and Nfi"); try { Byte.Parse("%42", Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail ("Should raise a System.FormatException"); } catch (Exception e) { - Assert("%42 and Nfi", typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType(), "%42 and Nfi"); } //test Parse(string s, NumberStyles style, IFormatProvider provider) - Assert("NumberStyles.HexNumber", 16 == Byte.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); + Assert.IsTrue(16 == Byte.Parse(" 10 ", NumberStyles.HexNumber, Nfi), "NumberStyles.HexNumber"); try { Byte.Parse(NumberFormatInfo.CurrentInfo.CurrencySymbol+"42", NumberStyles.Integer, Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail ("Should raise a System.FormatException"); } catch (Exception e) { - Assert(NumberFormatInfo.CurrentInfo.CurrencySymbol+"42, NumberStyles.Integer, Nfi", typeof(FormatException) == e.GetType()); + Assert.IsTrue (typeof(FormatException) == e.GetType(), NumberFormatInfo.CurrentInfo.CurrencySymbol+"42, NumberStyles.Integer, Nfi"); } } @@ -201,25 +200,25 @@ public class ByteTest : Assertion public void TestToString() { //test ToString() - AssertEquals("Compare failed for MyString1 and MyByte1", MyString1, MyByte1.ToString()); - AssertEquals("Compare failed for MyString2 and MyByte2", MyString2, MyByte2.ToString()); - AssertEquals("Compare failed for MyString3 and MyByte3", MyString3, MyByte3.ToString()); + Assert.AreEqual(MyString1, MyByte1.ToString(), "Compare failed for MyString1 and MyByte1"); + Assert.AreEqual(MyString2, MyByte2.ToString(), "Compare failed for MyString2 and MyByte2"); + Assert.AreEqual(MyString3, MyByte3.ToString(), "Compare failed for MyString3 and MyByte3"); //test ToString(string format) for (int i=0; i < Formats1.Length; i++) { - AssertEquals("Compare failed for Formats1["+i.ToString()+"]", Results1[i], MyByte2.ToString(Formats1[i])); - AssertEquals("Compare failed for Formats2["+i.ToString()+"]", Results2[i], MyByte3.ToString(Formats2[i])); + Assert.AreEqual(Results1[i], MyByte2.ToString(Formats1[i]), "Compare failed for Formats1["+i.ToString()+"]"); + Assert.AreEqual(Results2[i], MyByte3.ToString(Formats2[i]), "Compare failed for Formats2["+i.ToString()+"]"); } //test ToString(string format, IFormatProvider provider); for (int i=0; i < Formats1.Length; i++) { - AssertEquals("Compare failed for Formats1["+i.ToString()+"] with Nfi", Results1_Nfi[i], MyByte2.ToString(Formats1[i], Nfi)); - AssertEquals("Compare failed for Formats2["+i.ToString()+"] with Nfi", Results2_Nfi[i], MyByte3.ToString(Formats2[i], Nfi)); + Assert.AreEqual(Results1_Nfi[i], MyByte2.ToString(Formats1[i], Nfi), "Compare failed for Formats1["+i.ToString()+"] with Nfi"); + Assert.AreEqual(Results2_Nfi[i], MyByte3.ToString(Formats2[i], Nfi), "Compare failed for Formats2["+i.ToString()+"] with Nfi"); } try { MyByte1.ToString("z"); - Fail("Should raise a System.FormatException"); + Assert.Fail ("Should raise a System.FormatException"); } catch (Exception e) { - AssertEquals("Exception is the wrong type", typeof(FormatException), e.GetType()); + Assert.AreEqual(typeof(FormatException), e.GetType(), "Exception is the wrong type"); } } @@ -230,14 +229,14 @@ public class ByteTest : Assertion byte i = 254; // everything defaults to "G" string def = i.ToString ("G"); - AssertEquals ("ToString()", def, i.ToString ()); - AssertEquals ("ToString((IFormatProvider)null)", def, i.ToString ((IFormatProvider)null)); - AssertEquals ("ToString((string)null)", def, i.ToString ((string)null)); - AssertEquals ("ToString(empty)", def, i.ToString (String.Empty)); - AssertEquals ("ToString(null,null)", def, i.ToString (null, null)); - AssertEquals ("ToString(empty,null)", def, i.ToString (String.Empty, null)); - - AssertEquals ("ToString(G)", "254", def); + Assert.AreEqual (def, i.ToString (), "ToString()"); + Assert.AreEqual (def, i.ToString ((IFormatProvider)null), "ToString((IFormatProvider)null)"); + Assert.AreEqual (def, i.ToString ((string)null), "ToString((string)null)"); + Assert.AreEqual (def, i.ToString (String.Empty), "ToString(empty)"); + Assert.AreEqual (def, i.ToString (null, null), "ToString(null,null)"); + Assert.AreEqual (def, i.ToString (String.Empty, null), "ToString(empty,null)"); + + Assert.AreEqual ("254", def, "ToString(G)"); } } diff --git a/mcs/class/corlib/Test/System/ChangeLog b/mcs/class/corlib/Test/System/ChangeLog index 8f623242172..7b3504abc09 100644 --- a/mcs/class/corlib/Test/System/ChangeLog +++ b/mcs/class/corlib/Test/System/ChangeLog @@ -1,3 +1,57 @@ +2009-07-12 Gert Driesen + + * TypeTest.cs: Enabled test that was failing due to regression. + +2009-07-10 Zoltan Varga + + * TypeTest.cs: Add a test for #520690. Disable a test which fails on + MS.NET. + +2009-06-30 Zoltan Varga + + * IntPtrTest.cs: Disable a test whose corresponding fix was reverted. + + * *.cs: Convert all tests to new-style nunit classes/methods. Enable + some hidden tests. + + * ObjectTest.cs RandomTest.cs SByteTest.cs SingleTest.cs + TimeZoneTest.cs UInt16Test.cs UInt32Test.cs UInt64Test.cs + UIntPtrTest.cs ValueTypeTest.cs: Convert all tests to new-style nunit + classes/methods. Enable some hidden tests. + +2009-06-26 Robert Jordan + + * StringTest.cs: Convert all tests to new-style nunit + classes/methods. + + * ArrayTest.cs, ConvertTest.cs, DecimalTest.cs, TimeSpanTest.cs: + likewise. + + * DecimalTest2.cs: likewise, 5 hidden tests enabled. + +2009-06-26 Zoltan Varga + + * NumberFormatterTest.cs: Convert all tests to new-style nunit + classes/methods. + +2009-06-19 Atsushi Enomoto + + * StringTest.cs : Fix the previous test. It was expecting wrong + results. Added another NFC composition test. + +2009-06-18 Gonzalo Paniagua Javier + + * DateTimeTest.cs: add test for parsing a negative timezone. + * DateTimeOffsetTest.cs: several tests for Parse. + +2009-06-16 Zoltan Varga + + * StringTest.cs: Fix make check. + +2009-06-15 Atsushi Enomoto + + * StringTest.cs : added string normalization test. + 2009-05-26 Rodrigo Kumpera * TypeTest.cs: test for bug #506757. diff --git a/mcs/class/corlib/Test/System/CharCategoryTest.cs b/mcs/class/corlib/Test/System/CharCategoryTest.cs index aec9bfda466..771c3ab52d7 100644 --- a/mcs/class/corlib/Test/System/CharCategoryTest.cs +++ b/mcs/class/corlib/Test/System/CharCategoryTest.cs @@ -1,206 +1,206 @@ -// -// CharCategoryTest.cs -// -// Author: -// Atsushi Enomoto -// -// (C)2004 Novell Inc. -// -// Brute force tests for Char.IsXXX() static methods. -// The result string is generated by the short program, which ran under MS.NET. -// (See the bottom of this file.) -// - -using NUnit.Framework; -using System; -using System.IO; -using System.Reflection; - -namespace MonoTests.System -{ - [TestFixture] - public class CharCategoryTest : Assertion - { - static char DSC = Path.DirectorySeparatorChar; - - delegate bool ComparisonMethod (char c); - - private void CompareWithDump (ComparisonMethod cm, string dump, bool testTrue) - { - StringWriter sw = new StringWriter (); - int total = 0; - - for (int i = 0; i <= Char.MaxValue; i++) { - if (cm ((char) i) == testTrue) { - sw.Write (i.ToString ("x")); - sw.Write (' '); - total++; - } - } - sw.Write ("found " + total + " chars."); - -// string filename = Assembly.GetAssembly (typeof (Char)).Location + "/resources/" + dumpfile; -// StreamReader sr = new StreamReader (filename); -// dump = sr.ReadToEnd (); -// sr.Close (); - AssertEquals (dump, sw.ToString ()); - } - - [Test] - public void IsControl () - { - CompareWithDump (new ComparisonMethod (Char.IsControl), controls, true); - } - - [Test] - public void IsDigit () - { - CompareWithDump (new ComparisonMethod (Char.IsDigit), digits, true); - } - - [Test] - [Ignore ("The dump file is huge, so avoided this test way.")] - public void IsLetter () - { - CompareWithDump (new ComparisonMethod (Char.IsLetter), letters, false); - } - - [Test] - [Ignore ("The dump file is huge, so avoided this test way.")] - public void IsLetterOrDigit () - { - CompareWithDump (new ComparisonMethod (Char.IsLetterOrDigit), letterOrDigits, false); - } - - [Test] - public void IsLower () - { - CompareWithDump (new ComparisonMethod (Char.IsLower), lowerChars, true); - } - - [Test] - public void IsNumber () - { - CompareWithDump (new ComparisonMethod (Char.IsNumber), numbers, true); - } - - [Test] - public void IsPunctuation () - { - CompareWithDump (new ComparisonMethod (Char.IsPunctuation), puncts, true); - } - - [Test] - public void IsSeparator () - { - CompareWithDump (new ComparisonMethod (Char.IsSeparator), separators, true); - } - - [Test] - public void IsSurrogate () - { - CompareWithDump (new ComparisonMethod (Char.IsSurrogate), surrogateChars, true); - } - - [Test] - public void IsSymbol () - { - CompareWithDump (new ComparisonMethod (Char.IsSymbol), symbolChars, true); - } - - [Test] - public void IsUpper () - { - CompareWithDump (new ComparisonMethod (Char.IsUpper), upperChars, true); - } - - [Test] - public void IsWhiteSpace () - { - CompareWithDump (new ComparisonMethod (Char.IsWhiteSpace), whitespaceChars, true); - } - - - string controls = "0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f found 65 chars."; - - string digits = "30 31 32 33 34 35 36 37 38 39 660 661 662 663 664 665 666 667 668 669 6f0 6f1 6f2 6f3 6f4 6f5 6f6 6f7 6f8 6f9 966 967 968 969 96a 96b 96c 96d 96e 96f 9e6 9e7 9e8 9e9 9ea 9eb 9ec 9ed 9ee 9ef a66 a67 a68 a69 a6a a6b a6c a6d a6e a6f ae6 ae7 ae8 ae9 aea aeb aec aed aee aef b66 b67 b68 b69 b6a b6b b6c b6d b6e b6f be7 be8 be9 bea beb bec bed bee bef c66 c67 c68 c69 c6a c6b c6c c6d c6e c6f ce6 ce7 ce8 ce9 cea ceb cec ced cee cef d66 d67 d68 d69 d6a d6b d6c d6d d6e d6f e50 e51 e52 e53 e54 e55 e56 e57 e58 e59 ed0 ed1 ed2 ed3 ed4 ed5 ed6 ed7 ed8 ed9 f20 f21 f22 f23 f24 f25 f26 f27 f28 f29 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1369 136a 136b 136c 136d 136e 136f 1370 1371 17e0 17e1 17e2 17e3 17e4 17e5 17e6 17e7 17e8 17e9 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 ff10 ff11 ff12 ff13 ff14 ff15 ff16 ff17 ff18 ff19 found 198 chars."; - - string lowerChars = "61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a aa b5 ba df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f8 f9 fa fb fc fd fe ff 101 103 105 107 109 10b 10d 10f 111 113 115 117 119 11b 11d 11f 121 123 125 127 129 12b 12d 12f 131 133 135 137 138 13a 13c 13e 140 142 144 146 148 149 14b 14d 14f 151 153 155 157 159 15b 15d 15f 161 163 165 167 169 16b 16d 16f 171 173 175 177 17a 17c 17e 17f 180 183 185 188 18c 18d 192 195 199 19a 19b 19e 1a1 1a3 1a5 1a8 1aa 1ab 1ad 1b0 1b4 1b6 1b9 1ba 1bd 1be 1bf 1c6 1c9 1cc 1ce 1d0 1d2 1d4 1d6 1d8 1da 1dc 1dd 1df 1e1 1e3 1e5 1e7 1e9 1eb 1ed 1ef 1f0 1f3 1f5 1f9 1fb 1fd 1ff 201 203 205 207 209 20b 20d 20f 211 213 215 217 219 21b 21d 21f 223 225 227 229 22b 22d 22f 231 233 250 251 252 253 254 255 256 257 258 259 25a 25b 25c 25d 25e 25f 260 261 262 263 264 265 266 267 268 269 26a 26b 26c 26d 26e 26f 270 271 272 273 274 275 276 277 278 279 27a 27b 27c 27d 27e 27f 280 281 282 283 284 285 286 287 288 289 28a 28b 28c 28d 28e 28f 290 291 292 293 294 295 296 297 298 299 29a 29b 29c 29d 29e 29f 2a0 2a1 2a2 2a3 2a4 2a5 2a6 2a7 2a8 2a9 2aa 2ab 2ac 2ad 390 3ac 3ad 3ae 3af 3b0 3b1 3b2 3b3 3b4 3b5 3b6 3b7 3b8 3b9 3ba 3bb 3bc 3bd 3be 3bf 3c0 3c1 3c2 3c3 3c4 3c5 3c6 3c7 3c8 3c9 3ca 3cb 3cc 3cd 3ce 3d0 3d1 3d5 3d6 3d7 3db 3dd 3df 3e1 3e3 3e5 3e7 3e9 3eb 3ed 3ef 3f0 3f1 3f2 3f3 430 431 432 433 434 435 436 437 438 439 43a 43b 43c 43d 43e 43f 440 441 442 443 444 445 446 447 448 449 44a 44b 44c 44d 44e 44f 450 451 452 453 454 455 456 457 458 459 45a 45b 45c 45d 45e 45f 461 463 465 467 469 46b 46d 46f 471 473 475 477 479 47b 47d 47f 481 48d 48f 491 493 495 497 499 49b 49d 49f 4a1 4a3 4a5 4a7 4a9 4ab 4ad 4af 4b1 4b3 4b5 4b7 4b9 4bb 4bd 4bf 4c2 4c4 4c8 4cc 4d1 4d3 4d5 4d7 4d9 4db 4dd 4df 4e1 4e3 4e5 4e7 4e9 4eb 4ed 4ef 4f1 4f3 4f5 4f9 " - + "561 562 563 564 565 566 567 568 569 56a 56b 56c 56d 56e 56f 570 571 572 573 574 575 576 577 578 579 57a 57b 57c 57d 57e 57f 580 581 582 583 584 585 586 587 1e01 1e03 1e05 1e07 1e09 1e0b 1e0d 1e0f 1e11 1e13 1e15 1e17 1e19 1e1b 1e1d 1e1f 1e21 1e23 1e25 1e27 1e29 1e2b 1e2d 1e2f 1e31 1e33 1e35 1e37 1e39 1e3b 1e3d 1e3f 1e41 1e43 1e45 1e47 1e49 1e4b 1e4d 1e4f 1e51 1e53 1e55 1e57 1e59 1e5b 1e5d 1e5f 1e61 1e63 1e65 1e67 1e69 1e6b 1e6d 1e6f 1e71 1e73 1e75 1e77 1e79 1e7b 1e7d 1e7f 1e81 1e83 1e85 1e87 1e89 1e8b 1e8d 1e8f 1e91 1e93 1e95 1e96 1e97 1e98 1e99 1e9a 1e9b 1ea1 1ea3 1ea5 1ea7 1ea9 1eab 1ead 1eaf 1eb1 1eb3 1eb5 1eb7 1eb9 1ebb 1ebd 1ebf 1ec1 1ec3 1ec5 1ec7 1ec9 1ecb 1ecd 1ecf 1ed1 1ed3 1ed5 1ed7 1ed9 1edb 1edd 1edf 1ee1 1ee3 1ee5 1ee7 1ee9 1eeb 1eed 1eef 1ef1 1ef3 1ef5 1ef7 1ef9 1f00 1f01 1f02 1f03 1f04 1f05 1f06 1f07 1f10 1f11 1f12 1f13 1f14 1f15 1f20 1f21 1f22 1f23 1f24 1f25 1f26 1f27 1f30 1f31 1f32 1f33 1f34 1f35 1f36 1f37 1f40 1f41 1f42 1f43 1f44 1f45 1f50 1f51 1f52 1f53 1f54 1f55 1f56 1f57 1f60 1f61 1f62 1f63 1f64 1f65 1f66 1f67 1f70 1f71 1f72 1f73 1f74 1f75 1f76 1f77 1f78 1f79 1f7a 1f7b 1f7c 1f7d 1f80 1f81 1f82 1f83 1f84 1f85 1f86 1f87 1f90 1f91 1f92 1f93 1f94 1f95 1f96 1f97 1fa0 1fa1 1fa2 1fa3 1fa4 1fa5 1fa6 1fa7 1fb0 1fb1 1fb2 1fb3 1fb4 1fb6 1fb7 1fbe 1fc2 1fc3 1fc4 1fc6 1fc7 1fd0 1fd1 1fd2 1fd3 1fd6 1fd7 1fe0 1fe1 1fe2 1fe3 1fe4 1fe5 1fe6 1fe7 1ff2 1ff3 1ff4 1ff6 1ff7 207f 210a 210e 210f 2113 212f 2134 2139 fb00 fb01 fb02 fb03 fb04 fb05 fb06 fb13 fb14 fb15 fb16 fb17 ff41 ff42 ff43 ff44 ff45 ff46 ff47 ff48 ff49 ff4a ff4b ff4c ff4d ff4e ff4f ff50 ff51 ff52 ff53 ff54 ff55 ff56 ff57 ff58 ff59 ff5a found 804 chars."; - - string numbers = "30 31 32 33 34 35 36 37 38 39 b2 b3 b9 bc bd be 660 661 662 663 664 665 666 667 668 669 6f0 6f1 6f2 6f3 6f4 6f5 6f6 6f7 6f8 6f9 966 967 968 969 96a 96b 96c 96d 96e 96f 9e6 9e7 9e8 9e9 9ea 9eb 9ec 9ed 9ee 9ef 9f4 9f5 9f6 9f7 9f8 9f9 a66 a67 a68 a69 a6a a6b a6c a6d a6e a6f ae6 ae7 ae8 ae9 aea aeb aec aed aee aef b66 b67 b68 b69 b6a b6b b6c b6d b6e b6f be7 be8 be9 bea beb bec bed bee bef bf0 bf1 bf2 c66 c67 c68 c69 c6a c6b c6c c6d c6e c6f ce6 ce7 ce8 ce9 cea ceb cec ced cee cef d66 d67 d68 d69 d6a d6b d6c d6d d6e d6f e50 e51 e52 e53 e54 e55 e56 e57 e58 e59 ed0 ed1 ed2 ed3 ed4 ed5 ed6 ed7 ed8 ed9 f20 f21 f22 f23 f24 f25 f26 f27 f28 f29 f2a f2b f2c f2d f2e f2f f30 f31 f32 f33 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1369 136a 136b 136c 136d 136e 136f 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 137a 137b 137c 16ee 16ef 16f0 17e0 17e1 17e2 17e3 17e4 17e5 17e6 17e7 17e8 17e9 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 2070 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2153 2154 2155 2156 2157 2158 2159 215a 215b 215c 215d 215e 215f 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 216a 216b 216c 216d 216e 216f 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 217a 217b 217c 217d 217e 217f 2180 2181 2182 2183 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 246a 246b 246c 246d 246e 246f 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 247a 247b 247c 247d 247e 247f 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 248a 248b 248c 248d 248e 248f 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 249a 249b 24ea 2776 2777 2778 2779 277a 277b 277c 277d 277e 277f 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 278a 278b 278c 278d 278e 278f 2790 2791 2792 2793 " - + "3007 3021 3022 3023 3024 3025 3026 3027 3028 3029 3038 3039 303a 3192 3193 3194 3195 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 ff10 ff11 ff12 ff13 ff14 ff15 ff16 ff17 ff18 ff19 found 431 chars."; - - string puncts = "21 22 23 25 26 27 28 29 2a 2c 2d 2e 2f 3a 3b 3f 40 5b 5c 5d 5f 7b 7d a1 ab ad b7 bb bf 37e 387 55a 55b 55c 55d 55e 55f 589 58a 5be 5c0 5c3 5f3 5f4 60c 61b 61f 66a 66b 66c 66d 6d4 700 701 702 703 704 705 706 707 708 709 70a 70b 70c 70d 964 965 970 df4 e4f e5a e5b f04 f05 f06 f07 f08 f09 f0a f0b f0c f0d f0e f0f f10 f11 f12 f3a f3b f3c f3d f85 104a 104b 104c 104d 104e 104f 10fb 1361 1362 1363 1364 1365 1366 1367 1368 166d 166e 169b 169c 16eb 16ec 16ed 17d4 17d5 17d6 17d7 17d8 17d9 17da 17dc 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 180a 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 201a 201b 201c 201d 201e 201f 2020 2021 2022 2023 2024 2025 2026 2027 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 203a 203b 203c 203d 203e 203f 2040 2041 2042 2043 2045 2046 2048 2049 204a 204b 204c 204d 207d 207e 208d 208e 2329 232a 3001 3002 3003 3008 3009 300a 300b 300c 300d 300e 300f 3010 3011 3014 3015 3016 3017 3018 3019 301a 301b 301c 301d 301e 301f 3030 30fb fd3e fd3f fe30 fe31 fe32 fe33 fe34 fe35 fe36 fe37 fe38 fe39 fe3a fe3b fe3c fe3d fe3e fe3f fe40 fe41 fe42 fe43 fe44 fe49 fe4a fe4b fe4c fe4d fe4e fe4f fe50 fe51 fe52 fe54 fe55 fe56 fe57 fe58 fe59 fe5a fe5b fe5c fe5d fe5e fe5f fe60 fe61 fe63 fe68 fe6a fe6b ff01 ff02 ff03 ff05 ff06 ff07 ff08 ff09 ff0a ff0c ff0d ff0e ff0f ff1a ff1b ff1f ff20 ff3b ff3c ff3d ff3f ff5b ff5d ff61 ff62 ff63 ff64 ff65 found 298 chars."; - - string separators = "20 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 200b 2028 2029 202f 3000 found 19 chars."; - - string surrogateChars = "d800 d801 d802 d803 d804 d805 d806 d807 d808 d809 d80a d80b d80c d80d d80e d80f d810 d811 d812 d813 d814 d815 d816 d817 d818 d819 d81a d81b d81c d81d d81e d81f d820 d821 d822 d823 d824 d825 d826 d827 d828 d829 d82a d82b d82c d82d d82e d82f d830 d831 d832 d833 d834 d835 d836 d837 d838 d839 d83a d83b d83c d83d d83e d83f d840 d841 d842 d843 d844 d845 d846 d847 d848 d849 d84a d84b d84c d84d d84e d84f d850 d851 d852 d853 d854 d855 d856 d857 d858 d859 d85a d85b d85c d85d d85e d85f d860 d861 d862 d863 d864 d865 d866 d867 d868 d869 d86a d86b d86c d86d d86e d86f d870 d871 d872 d873 d874 d875 d876 d877 d878 d879 d87a d87b d87c d87d d87e d87f d880 d881 d882 d883 d884 d885 d886 d887 d888 d889 d88a d88b d88c d88d d88e d88f d890 d891 d892 d893 d894 d895 d896 d897 d898 d899 d89a d89b d89c d89d d89e d89f d8a0 d8a1 d8a2 d8a3 d8a4 d8a5 d8a6 d8a7 d8a8 d8a9 d8aa d8ab d8ac d8ad d8ae d8af d8b0 d8b1 d8b2 d8b3 d8b4 d8b5 d8b6 d8b7 d8b8 d8b9 d8ba d8bb d8bc d8bd d8be d8bf d8c0 d8c1 d8c2 d8c3 d8c4 d8c5 d8c6 d8c7 d8c8 d8c9 d8ca d8cb d8cc d8cd d8ce d8cf d8d0 d8d1 d8d2 d8d3 d8d4 d8d5 d8d6 d8d7 d8d8 d8d9 d8da d8db d8dc d8dd d8de d8df d8e0 d8e1 d8e2 d8e3 d8e4 d8e5 d8e6 d8e7 d8e8 d8e9 d8ea d8eb d8ec d8ed d8ee d8ef d8f0 d8f1 d8f2 d8f3 d8f4 d8f5 d8f6 d8f7 d8f8 d8f9 d8fa d8fb d8fc d8fd d8fe d8ff d900 d901 d902 d903 d904 d905 d906 d907 d908 d909 d90a d90b d90c d90d d90e d90f d910 d911 d912 d913 d914 d915 d916 d917 d918 d919 d91a d91b d91c d91d d91e d91f d920 d921 d922 d923 d924 d925 d926 d927 d928 d929 d92a d92b d92c d92d d92e d92f d930 d931 d932 d933 d934 d935 d936 d937 d938 d939 d93a d93b d93c d93d d93e d93f d940 d941 d942 d943 d944 d945 d946 d947 d948 d949 d94a d94b d94c d94d d94e d94f d950 d951 d952 d953 d954 d955 d956 d957 d958 d959 d95a d95b d95c d95d d95e d95f d960 d961 d962 d963 d964 d965 d966 d967 d968 d969 d96a d96b d96c d96d d96e d96f d970 d971 d972 d973 d974 d975 d976 d977 d978 d979 d97a d97b d97c d97d d97e d97f " - + "d980 d981 d982 d983 d984 d985 d986 d987 d988 d989 d98a d98b d98c d98d d98e d98f d990 d991 d992 d993 d994 d995 d996 d997 d998 d999 d99a d99b d99c d99d d99e d99f d9a0 d9a1 d9a2 d9a3 d9a4 d9a5 d9a6 d9a7 d9a8 d9a9 d9aa d9ab d9ac d9ad d9ae d9af d9b0 d9b1 d9b2 d9b3 d9b4 d9b5 d9b6 d9b7 d9b8 d9b9 d9ba d9bb d9bc d9bd d9be d9bf d9c0 d9c1 d9c2 d9c3 d9c4 d9c5 d9c6 d9c7 d9c8 d9c9 d9ca d9cb d9cc d9cd d9ce d9cf d9d0 d9d1 d9d2 d9d3 d9d4 d9d5 d9d6 d9d7 d9d8 d9d9 d9da d9db d9dc d9dd d9de d9df d9e0 d9e1 d9e2 d9e3 d9e4 d9e5 d9e6 d9e7 d9e8 d9e9 d9ea d9eb d9ec d9ed d9ee d9ef d9f0 d9f1 d9f2 d9f3 d9f4 d9f5 d9f6 d9f7 d9f8 d9f9 d9fa d9fb d9fc d9fd d9fe d9ff da00 da01 da02 da03 da04 da05 da06 da07 da08 da09 da0a da0b da0c da0d da0e da0f da10 da11 da12 da13 da14 da15 da16 da17 da18 da19 da1a da1b da1c da1d da1e da1f da20 da21 da22 da23 da24 da25 da26 da27 da28 da29 da2a da2b da2c da2d da2e da2f da30 da31 da32 da33 da34 da35 da36 da37 da38 da39 da3a da3b da3c da3d da3e da3f da40 da41 da42 da43 da44 da45 da46 da47 da48 da49 da4a da4b da4c da4d da4e da4f da50 da51 da52 da53 da54 da55 da56 da57 da58 da59 da5a da5b da5c da5d da5e da5f da60 da61 da62 da63 da64 da65 da66 da67 da68 da69 da6a da6b da6c da6d da6e da6f da70 da71 da72 da73 da74 da75 da76 da77 da78 da79 da7a da7b da7c da7d da7e da7f da80 da81 da82 da83 da84 da85 da86 da87 da88 da89 da8a da8b da8c da8d da8e da8f da90 da91 da92 da93 da94 da95 da96 da97 da98 da99 da9a da9b da9c da9d da9e da9f daa0 daa1 daa2 daa3 daa4 daa5 daa6 daa7 daa8 daa9 daaa daab daac daad daae daaf dab0 dab1 dab2 dab3 dab4 dab5 dab6 dab7 dab8 dab9 daba dabb dabc dabd dabe dabf dac0 dac1 dac2 dac3 dac4 dac5 dac6 dac7 dac8 dac9 daca dacb dacc dacd dace dacf dad0 dad1 dad2 dad3 dad4 dad5 dad6 dad7 dad8 dad9 dada dadb dadc dadd dade dadf dae0 dae1 dae2 dae3 dae4 dae5 dae6 dae7 dae8 dae9 daea daeb daec daed daee daef daf0 daf1 daf2 daf3 daf4 daf5 daf6 daf7 daf8 daf9 dafa dafb dafc dafd dafe daff " - + "db00 db01 db02 db03 db04 db05 db06 db07 db08 db09 db0a db0b db0c db0d db0e db0f db10 db11 db12 db13 db14 db15 db16 db17 db18 db19 db1a db1b db1c db1d db1e db1f db20 db21 db22 db23 db24 db25 db26 db27 db28 db29 db2a db2b db2c db2d db2e db2f db30 db31 db32 db33 db34 db35 db36 db37 db38 db39 db3a db3b db3c db3d db3e db3f db40 db41 db42 db43 db44 db45 db46 db47 db48 db49 db4a db4b db4c db4d db4e db4f db50 db51 db52 db53 db54 db55 db56 db57 db58 db59 db5a db5b db5c db5d db5e db5f db60 db61 db62 db63 db64 db65 db66 db67 db68 db69 db6a db6b db6c db6d db6e db6f db70 db71 db72 db73 db74 db75 db76 db77 db78 db79 db7a db7b db7c db7d db7e db7f db80 db81 db82 db83 db84 db85 db86 db87 db88 db89 db8a db8b db8c db8d db8e db8f db90 db91 db92 db93 db94 db95 db96 db97 db98 db99 db9a db9b db9c db9d db9e db9f dba0 dba1 dba2 dba3 dba4 dba5 dba6 dba7 dba8 dba9 dbaa dbab dbac dbad dbae dbaf dbb0 dbb1 dbb2 dbb3 dbb4 dbb5 dbb6 dbb7 dbb8 dbb9 dbba dbbb dbbc dbbd dbbe dbbf dbc0 dbc1 dbc2 dbc3 dbc4 dbc5 dbc6 dbc7 dbc8 dbc9 dbca dbcb dbcc dbcd dbce dbcf dbd0 dbd1 dbd2 dbd3 dbd4 dbd5 dbd6 dbd7 dbd8 dbd9 dbda dbdb dbdc dbdd dbde dbdf dbe0 dbe1 dbe2 dbe3 dbe4 dbe5 dbe6 dbe7 dbe8 dbe9 dbea dbeb dbec dbed dbee dbef dbf0 dbf1 dbf2 dbf3 dbf4 dbf5 dbf6 dbf7 dbf8 dbf9 dbfa dbfb dbfc dbfd dbfe dbff dc00 dc01 dc02 dc03 dc04 dc05 dc06 dc07 dc08 dc09 dc0a dc0b dc0c dc0d dc0e dc0f dc10 dc11 dc12 dc13 dc14 dc15 dc16 dc17 dc18 dc19 dc1a dc1b dc1c dc1d dc1e dc1f dc20 dc21 dc22 dc23 dc24 dc25 dc26 dc27 dc28 dc29 dc2a dc2b dc2c dc2d dc2e dc2f dc30 dc31 dc32 dc33 dc34 dc35 dc36 dc37 dc38 dc39 dc3a dc3b dc3c dc3d dc3e dc3f dc40 dc41 dc42 dc43 dc44 dc45 dc46 dc47 dc48 dc49 dc4a dc4b dc4c dc4d dc4e dc4f dc50 dc51 dc52 dc53 dc54 dc55 dc56 dc57 dc58 dc59 dc5a dc5b dc5c dc5d dc5e dc5f dc60 dc61 dc62 dc63 dc64 dc65 dc66 dc67 dc68 dc69 dc6a dc6b dc6c dc6d dc6e dc6f dc70 dc71 dc72 dc73 dc74 dc75 dc76 dc77 dc78 dc79 dc7a dc7b dc7c dc7d dc7e dc7f " - + "dc80 dc81 dc82 dc83 dc84 dc85 dc86 dc87 dc88 dc89 dc8a dc8b dc8c dc8d dc8e dc8f dc90 dc91 dc92 dc93 dc94 dc95 dc96 dc97 dc98 dc99 dc9a dc9b dc9c dc9d dc9e dc9f dca0 dca1 dca2 dca3 dca4 dca5 dca6 dca7 dca8 dca9 dcaa dcab dcac dcad dcae dcaf dcb0 dcb1 dcb2 dcb3 dcb4 dcb5 dcb6 dcb7 dcb8 dcb9 dcba dcbb dcbc dcbd dcbe dcbf dcc0 dcc1 dcc2 dcc3 dcc4 dcc5 dcc6 dcc7 dcc8 dcc9 dcca dccb dccc dccd dcce dccf dcd0 dcd1 dcd2 dcd3 dcd4 dcd5 dcd6 dcd7 dcd8 dcd9 dcda dcdb dcdc dcdd dcde dcdf dce0 dce1 dce2 dce3 dce4 dce5 dce6 dce7 dce8 dce9 dcea dceb dcec dced dcee dcef dcf0 dcf1 dcf2 dcf3 dcf4 dcf5 dcf6 dcf7 dcf8 dcf9 dcfa dcfb dcfc dcfd dcfe dcff dd00 dd01 dd02 dd03 dd04 dd05 dd06 dd07 dd08 dd09 dd0a dd0b dd0c dd0d dd0e dd0f dd10 dd11 dd12 dd13 dd14 dd15 dd16 dd17 dd18 dd19 dd1a dd1b dd1c dd1d dd1e dd1f dd20 dd21 dd22 dd23 dd24 dd25 dd26 dd27 dd28 dd29 dd2a dd2b dd2c dd2d dd2e dd2f dd30 dd31 dd32 dd33 dd34 dd35 dd36 dd37 dd38 dd39 dd3a dd3b dd3c dd3d dd3e dd3f dd40 dd41 dd42 dd43 dd44 dd45 dd46 dd47 dd48 dd49 dd4a dd4b dd4c dd4d dd4e dd4f dd50 dd51 dd52 dd53 dd54 dd55 dd56 dd57 dd58 dd59 dd5a dd5b dd5c dd5d dd5e dd5f dd60 dd61 dd62 dd63 dd64 dd65 dd66 dd67 dd68 dd69 dd6a dd6b dd6c dd6d dd6e dd6f dd70 dd71 dd72 dd73 dd74 dd75 dd76 dd77 dd78 dd79 dd7a dd7b dd7c dd7d dd7e dd7f dd80 dd81 dd82 dd83 dd84 dd85 dd86 dd87 dd88 dd89 dd8a dd8b dd8c dd8d dd8e dd8f dd90 dd91 dd92 dd93 dd94 dd95 dd96 dd97 dd98 dd99 dd9a dd9b dd9c dd9d dd9e dd9f dda0 dda1 dda2 dda3 dda4 dda5 dda6 dda7 dda8 dda9 ddaa ddab ddac ddad ddae ddaf ddb0 ddb1 ddb2 ddb3 ddb4 ddb5 ddb6 ddb7 ddb8 ddb9 ddba ddbb ddbc ddbd ddbe ddbf ddc0 ddc1 ddc2 ddc3 ddc4 ddc5 ddc6 ddc7 ddc8 ddc9 ddca ddcb ddcc ddcd ddce ddcf ddd0 ddd1 ddd2 ddd3 ddd4 ddd5 ddd6 ddd7 ddd8 ddd9 ddda dddb dddc dddd ddde dddf dde0 dde1 dde2 dde3 dde4 dde5 dde6 dde7 dde8 dde9 ddea ddeb ddec dded ddee ddef ddf0 ddf1 ddf2 ddf3 ddf4 ddf5 ddf6 ddf7 ddf8 ddf9 ddfa ddfb ddfc ddfd ddfe ddff " - + "de00 de01 de02 de03 de04 de05 de06 de07 de08 de09 de0a de0b de0c de0d de0e de0f de10 de11 de12 de13 de14 de15 de16 de17 de18 de19 de1a de1b de1c de1d de1e de1f de20 de21 de22 de23 de24 de25 de26 de27 de28 de29 de2a de2b de2c de2d de2e de2f de30 de31 de32 de33 de34 de35 de36 de37 de38 de39 de3a de3b de3c de3d de3e de3f de40 de41 de42 de43 de44 de45 de46 de47 de48 de49 de4a de4b de4c de4d de4e de4f de50 de51 de52 de53 de54 de55 de56 de57 de58 de59 de5a de5b de5c de5d de5e de5f de60 de61 de62 de63 de64 de65 de66 de67 de68 de69 de6a de6b de6c de6d de6e de6f de70 de71 de72 de73 de74 de75 de76 de77 de78 de79 de7a de7b de7c de7d de7e de7f de80 de81 de82 de83 de84 de85 de86 de87 de88 de89 de8a de8b de8c de8d de8e de8f de90 de91 de92 de93 de94 de95 de96 de97 de98 de99 de9a de9b de9c de9d de9e de9f dea0 dea1 dea2 dea3 dea4 dea5 dea6 dea7 dea8 dea9 deaa deab deac dead deae deaf deb0 deb1 deb2 deb3 deb4 deb5 deb6 deb7 deb8 deb9 deba debb debc debd debe debf dec0 dec1 dec2 dec3 dec4 dec5 dec6 dec7 dec8 dec9 deca decb decc decd dece decf ded0 ded1 ded2 ded3 ded4 ded5 ded6 ded7 ded8 ded9 deda dedb dedc dedd dede dedf dee0 dee1 dee2 dee3 dee4 dee5 dee6 dee7 dee8 dee9 deea deeb deec deed deee deef def0 def1 def2 def3 def4 def5 def6 def7 def8 def9 defa defb defc defd defe deff df00 df01 df02 df03 df04 df05 df06 df07 df08 df09 df0a df0b df0c df0d df0e df0f df10 df11 df12 df13 df14 df15 df16 df17 df18 df19 df1a df1b df1c df1d df1e df1f df20 df21 df22 df23 df24 df25 df26 df27 df28 df29 df2a df2b df2c df2d df2e df2f df30 df31 df32 df33 df34 df35 df36 df37 df38 df39 df3a df3b df3c df3d df3e df3f df40 df41 df42 df43 df44 df45 df46 df47 df48 df49 df4a df4b df4c df4d df4e df4f df50 df51 df52 df53 df54 df55 df56 df57 df58 df59 df5a df5b df5c df5d df5e df5f df60 df61 df62 df63 df64 df65 df66 df67 df68 df69 df6a df6b df6c df6d df6e df6f df70 df71 df72 df73 df74 df75 df76 df77 df78 df79 df7a df7b df7c df7d df7e df7f " - + "df80 df81 df82 df83 df84 df85 df86 df87 df88 df89 df8a df8b df8c df8d df8e df8f df90 df91 df92 df93 df94 df95 df96 df97 df98 df99 df9a df9b df9c df9d df9e df9f dfa0 dfa1 dfa2 dfa3 dfa4 dfa5 dfa6 dfa7 dfa8 dfa9 dfaa dfab dfac dfad dfae dfaf dfb0 dfb1 dfb2 dfb3 dfb4 dfb5 dfb6 dfb7 dfb8 dfb9 dfba dfbb dfbc dfbd dfbe dfbf dfc0 dfc1 dfc2 dfc3 dfc4 dfc5 dfc6 dfc7 dfc8 dfc9 dfca dfcb dfcc dfcd dfce dfcf dfd0 dfd1 dfd2 dfd3 dfd4 dfd5 dfd6 dfd7 dfd8 dfd9 dfda dfdb dfdc dfdd dfde dfdf dfe0 dfe1 dfe2 dfe3 dfe4 dfe5 dfe6 dfe7 dfe8 dfe9 dfea dfeb dfec dfed dfee dfef dff0 dff1 dff2 dff3 dff4 dff5 dff6 dff7 dff8 dff9 dffa dffb dffc dffd dffe dfff found 2048 chars."; - - string symbolChars = "24 2b 3c 3d 3e 5e 60 7c 7e a2 a3 a4 a5 a6 a7 a8 a9 ac ae af b0 b1 b4 b6 b8 d7 f7 2b9 2ba 2c2 2c3 2c4 2c5 2c6 2c7 2c8 2c9 2ca 2cb 2cc 2cd 2ce 2cf 2d2 2d3 2d4 2d5 2d6 2d7 2d8 2d9 2da 2db 2dc 2dd 2de 2df 2e5 2e6 2e7 2e8 2e9 2ea 2eb 2ec 2ed 374 375 384 385 482 6e9 6fd 6fe 9f2 9f3 9fa b70 e3f f01 f02 f03 f13 f14 f15 f16 f17 f1a f1b f1c f1d f1e f1f f34 f36 f38 fbe fbf fc0 fc1 fc2 fc3 fc4 fc5 fc7 fc8 fc9 fca fcb fcc fcf 17db 1fbd 1fbf 1fc0 1fc1 1fcd 1fce 1fcf 1fdd 1fde 1fdf 1fed 1fee 1fef 1ffd 1ffe 2044 207a 207b 207c 208a 208b 208c 20a0 20a1 20a2 20a3 20a4 20a5 20a6 20a7 20a8 20a9 20aa 20ab 20ac 20ad 20ae 20af 2100 2101 2103 2104 2105 2106 2108 2109 2114 2116 2117 2118 211e 211f 2120 2121 2122 2123 2125 2127 2129 212e 2132 213a 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 219a 219b 219c 219d 219e 219f 21a0 21a1 21a2 21a3 21a4 21a5 21a6 21a7 21a8 21a9 21aa 21ab 21ac 21ad 21ae 21af 21b0 21b1 21b2 21b3 21b4 21b5 21b6 21b7 21b8 21b9 21ba 21bb 21bc 21bd 21be 21bf 21c0 21c1 21c2 21c3 21c4 21c5 21c6 21c7 21c8 21c9 21ca 21cb 21cc 21cd 21ce 21cf 21d0 21d1 21d2 21d3 21d4 21d5 21d6 21d7 21d8 21d9 21da 21db 21dc 21dd 21de 21df 21e0 21e1 21e2 21e3 21e4 21e5 21e6 21e7 21e8 21e9 21ea 21eb 21ec 21ed 21ee 21ef 21f0 21f1 21f2 21f3 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 220a 220b 220c 220d 220e 220f 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 221a 221b 221c 221d 221e 221f 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 222a 222b 222c 222d 222e 222f 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 223a 223b 223c 223d 223e 223f 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 224a 224b 224c 224d 224e 224f 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 225a 225b 225c 225d 225e 225f 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 226a 226b 226c 226d 226e 226f 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 227a 227b 227c 227d 227e 227f " - + "2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 228a 228b 228c 228d 228e 228f 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 229a 229b 229c 229d 229e 229f 22a0 22a1 22a2 22a3 22a4 22a5 22a6 22a7 22a8 22a9 22aa 22ab 22ac 22ad 22ae 22af 22b0 22b1 22b2 22b3 22b4 22b5 22b6 22b7 22b8 22b9 22ba 22bb 22bc 22bd 22be 22bf 22c0 22c1 22c2 22c3 22c4 22c5 22c6 22c7 22c8 22c9 22ca 22cb 22cc 22cd 22ce 22cf 22d0 22d1 22d2 22d3 22d4 22d5 22d6 22d7 22d8 22d9 22da 22db 22dc 22dd 22de 22df 22e0 22e1 22e2 22e3 22e4 22e5 22e6 22e7 22e8 22e9 22ea 22eb 22ec 22ed 22ee 22ef 22f0 22f1 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 230a 230b 230c 230d 230e 230f 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 231a 231b 231c 231d 231e 231f 2320 2321 2322 2323 2324 2325 2326 2327 2328 232b 232c 232d 232e 232f 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 233a 233b 233c 233d 233e 233f 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 234a 234b 234c 234d 234e 234f 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 235a 235b 235c 235d 235e 235f 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 236a 236b 236c 236d 236e 236f 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 237a 237b 237d 237e 237f 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 238a 238b 238c 238d 238e 238f 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 239a 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 240a 240b 240c 240d 240e 240f 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 241a 241b 241c 241d 241e 241f 2420 2421 2422 2423 2424 2425 2426 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 244a 249c 249d 249e 249f 24a0 24a1 24a2 24a3 24a4 24a5 24a6 24a7 24a8 24a9 24aa 24ab 24ac 24ad 24ae 24af 24b0 24b1 24b2 24b3 24b4 24b5 24b6 24b7 24b8 24b9 24ba 24bb 24bc 24bd 24be 24bf 24c0 24c1 24c2 24c3 24c4 24c5 24c6 24c7 24c8 24c9 24ca 24cb 24cc 24cd 24ce 24cf 24d0 24d1 24d2 24d3 24d4 24d5 24d6 24d7 24d8 24d9 24da 24db 24dc 24dd 24de 24df 24e0 24e1 24e2 24e3 24e4 24e5 24e6 24e7 24e8 24e9 " - + "2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 250a 250b 250c 250d 250e 250f 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 251a 251b 251c 251d 251e 251f 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 252a 252b 252c 252d 252e 252f 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 253a 253b 253c 253d 253e 253f 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 254a 254b 254c 254d 254e 254f 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 255a 255b 255c 255d 255e 255f 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 256a 256b 256c 256d 256e 256f 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 257a 257b 257c 257d 257e 257f 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 258a 258b 258c 258d 258e 258f 2590 2591 2592 2593 2594 2595 25a0 25a1 25a2 25a3 25a4 25a5 25a6 25a7 25a8 25a9 25aa 25ab 25ac 25ad 25ae 25af 25b0 25b1 25b2 25b3 25b4 25b5 25b6 25b7 25b8 25b9 25ba 25bb 25bc 25bd 25be 25bf 25c0 25c1 25c2 25c3 25c4 25c5 25c6 25c7 25c8 25c9 25ca 25cb 25cc 25cd 25ce 25cf 25d0 25d1 25d2 25d3 25d4 25d5 25d6 25d7 25d8 25d9 25da 25db 25dc 25dd 25de 25df 25e0 25e1 25e2 25e3 25e4 25e5 25e6 25e7 25e8 25e9 25ea 25eb 25ec 25ed 25ee 25ef 25f0 25f1 25f2 25f3 25f4 25f5 25f6 25f7 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 260a 260b 260c 260d 260e 260f 2610 2611 2612 2613 2619 261a 261b 261c 261d 261e 261f 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 262a 262b 262c 262d 262e 262f 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 263a 263b 263c 263d 263e 263f 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 264a 264b 264c 264d 264e 264f 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 265a 265b 265c 265d 265e 265f 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 266a 266b 266c 266d 266e 266f 2670 2671 " - + "2701 2702 2703 2704 2706 2707 2708 2709 270c 270d 270e 270f 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 271a 271b 271c 271d 271e 271f 2720 2721 2722 2723 2724 2725 2726 2727 2729 272a 272b 272c 272d 272e 272f 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 273a 273b 273c 273d 273e 273f 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 274a 274b 274d 274f 2750 2751 2752 2756 2758 2759 275a 275b 275c 275d 275e 2761 2762 2763 2764 2765 2766 2767 2794 2798 2799 279a 279b 279c 279d 279e 279f 27a0 27a1 27a2 27a3 27a4 27a5 27a6 27a7 27a8 27a9 27aa 27ab 27ac 27ad 27ae 27af 27b1 27b2 27b3 27b4 27b5 27b6 27b7 27b8 27b9 27ba 27bb 27bc 27bd 27be 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 280a 280b 280c 280d 280e 280f 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 281a 281b 281c 281d 281e 281f 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 282a 282b 282c 282d 282e 282f 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 283a 283b 283c 283d 283e 283f 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 284a 284b 284c 284d 284e 284f 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 285a 285b 285c 285d 285e 285f 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 286a 286b 286c 286d 286e 286f 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 287a 287b 287c 287d 287e 287f 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 288a 288b 288c 288d 288e 288f 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 289a 289b 289c 289d 289e 289f 28a0 28a1 28a2 28a3 28a4 28a5 28a6 28a7 28a8 28a9 28aa 28ab 28ac 28ad 28ae 28af 28b0 28b1 28b2 28b3 28b4 28b5 28b6 28b7 28b8 28b9 28ba 28bb 28bc 28bd 28be 28bf 28c0 28c1 28c2 28c3 28c4 28c5 28c6 28c7 28c8 28c9 28ca 28cb 28cc 28cd 28ce 28cf 28d0 28d1 28d2 28d3 28d4 28d5 28d6 28d7 28d8 28d9 28da 28db 28dc 28dd 28de 28df 28e0 28e1 28e2 28e3 28e4 28e5 28e6 28e7 28e8 28e9 28ea 28eb 28ec 28ed 28ee 28ef 28f0 28f1 28f2 28f3 28f4 28f5 28f6 28f7 28f8 28f9 28fa 28fb 28fc 28fd 28fe 28ff " - + "2e80 2e81 2e82 2e83 2e84 2e85 2e86 2e87 2e88 2e89 2e8a 2e8b 2e8c 2e8d 2e8e 2e8f 2e90 2e91 2e92 2e93 2e94 2e95 2e96 2e97 2e98 2e99 2e9b 2e9c 2e9d 2e9e 2e9f 2ea0 2ea1 2ea2 2ea3 2ea4 2ea5 2ea6 2ea7 2ea8 2ea9 2eaa 2eab 2eac 2ead 2eae 2eaf 2eb0 2eb1 2eb2 2eb3 2eb4 2eb5 2eb6 2eb7 2eb8 2eb9 2eba 2ebb 2ebc 2ebd 2ebe 2ebf 2ec0 2ec1 2ec2 2ec3 2ec4 2ec5 2ec6 2ec7 2ec8 2ec9 2eca 2ecb 2ecc 2ecd 2ece 2ecf 2ed0 2ed1 2ed2 2ed3 2ed4 2ed5 2ed6 2ed7 2ed8 2ed9 2eda 2edb 2edc 2edd 2ede 2edf 2ee0 2ee1 2ee2 2ee3 2ee4 2ee5 2ee6 2ee7 2ee8 2ee9 2eea 2eeb 2eec 2eed 2eee 2eef 2ef0 2ef1 2ef2 2ef3 2f00 2f01 2f02 2f03 2f04 2f05 2f06 2f07 2f08 2f09 2f0a 2f0b 2f0c 2f0d 2f0e 2f0f 2f10 2f11 2f12 2f13 2f14 2f15 2f16 2f17 2f18 2f19 2f1a 2f1b 2f1c 2f1d 2f1e 2f1f 2f20 2f21 2f22 2f23 2f24 2f25 2f26 2f27 2f28 2f29 2f2a 2f2b 2f2c 2f2d 2f2e 2f2f 2f30 2f31 2f32 2f33 2f34 2f35 2f36 2f37 2f38 2f39 2f3a 2f3b 2f3c 2f3d 2f3e 2f3f 2f40 2f41 2f42 2f43 2f44 2f45 2f46 2f47 2f48 2f49 2f4a 2f4b 2f4c 2f4d 2f4e 2f4f 2f50 2f51 2f52 2f53 2f54 2f55 2f56 2f57 2f58 2f59 2f5a 2f5b 2f5c 2f5d 2f5e 2f5f 2f60 2f61 2f62 2f63 2f64 2f65 2f66 2f67 2f68 2f69 2f6a 2f6b 2f6c 2f6d 2f6e 2f6f 2f70 2f71 2f72 2f73 2f74 2f75 2f76 2f77 2f78 2f79 2f7a 2f7b 2f7c 2f7d 2f7e 2f7f 2f80 2f81 2f82 2f83 2f84 2f85 2f86 2f87 2f88 2f89 2f8a 2f8b 2f8c 2f8d 2f8e 2f8f 2f90 2f91 2f92 2f93 2f94 2f95 2f96 2f97 2f98 2f99 2f9a 2f9b 2f9c 2f9d 2f9e 2f9f 2fa0 2fa1 2fa2 2fa3 2fa4 2fa5 2fa6 2fa7 2fa8 2fa9 2faa 2fab 2fac 2fad 2fae 2faf 2fb0 2fb1 2fb2 2fb3 2fb4 2fb5 2fb6 2fb7 2fb8 2fb9 2fba 2fbb 2fbc 2fbd 2fbe 2fbf 2fc0 2fc1 2fc2 2fc3 2fc4 2fc5 2fc6 2fc7 2fc8 2fc9 2fca 2fcb 2fcc 2fcd 2fce 2fcf 2fd0 2fd1 2fd2 2fd3 2fd4 2fd5 2ff0 2ff1 2ff2 2ff3 2ff4 2ff5 2ff6 2ff7 2ff8 2ff9 2ffa 2ffb 3004 3012 3013 3020 3036 3037 303e 303f 309b 309c 3190 3191 3196 3197 3198 3199 319a 319b 319c 319d 319e 319f " - + "3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 320a 320b 320c 320d 320e 320f 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 321a 321b 321c 322a 322b 322c 322d 322e 322f 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 323a 323b 323c 323d 323e 323f 3240 3241 3242 3243 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 326a 326b 326c 326d 326e 326f 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 327a 327b 327f 328a 328b 328c 328d 328e 328f 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 329a 329b 329c 329d 329e 329f 32a0 32a1 32a2 32a3 32a4 32a5 32a6 32a7 32a8 32a9 32aa 32ab 32ac 32ad 32ae 32af 32b0 32c0 32c1 32c2 32c3 32c4 32c5 32c6 32c7 32c8 32c9 32ca 32cb 32d0 32d1 32d2 32d3 32d4 32d5 32d6 32d7 32d8 32d9 32da 32db 32dc 32dd 32de 32df 32e0 32e1 32e2 32e3 32e4 32e5 32e6 32e7 32e8 32e9 32ea 32eb 32ec 32ed 32ee 32ef 32f0 32f1 32f2 32f3 32f4 32f5 32f6 32f7 32f8 32f9 32fa 32fb 32fc 32fd 32fe 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 330a 330b 330c 330d 330e 330f 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 331a 331b 331c 331d 331e 331f 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 332a 332b 332c 332d 332e 332f 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 333a 333b 333c 333d 333e 333f 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 334a 334b 334c 334d 334e 334f 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 335a 335b 335c 335d 335e 335f 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 336a 336b 336c 336d 336e 336f 3370 3371 3372 3373 3374 3375 3376 337b 337c 337d 337e 337f 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 338a 338b 338c 338d 338e 338f 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 339a 339b 339c 339d 339e 339f 33a0 33a1 33a2 33a3 33a4 33a5 33a6 33a7 33a8 33a9 33aa 33ab 33ac 33ad 33ae 33af 33b0 33b1 33b2 33b3 33b4 33b5 33b6 33b7 33b8 33b9 33ba 33bb 33bc 33bd 33be 33bf " - + "33c0 33c1 33c2 33c3 33c4 33c5 33c6 33c7 33c8 33c9 33ca 33cb 33cc 33cd 33ce 33cf 33d0 33d1 33d2 33d3 33d4 33d5 33d6 33d7 33d8 33d9 33da 33db 33dc 33dd 33e0 33e1 33e2 33e3 33e4 33e5 33e6 33e7 33e8 33e9 33ea 33eb 33ec 33ed 33ee 33ef 33f0 33f1 33f2 33f3 33f4 33f5 33f6 33f7 33f8 33f9 33fa 33fb 33fc 33fd 33fe " - + "a490 a491 a492 a493 a494 a495 a496 a497 a498 a499 a49a a49b a49c a49d a49e a49f a4a0 a4a1 a4a4 a4a5 a4a6 a4a7 a4a8 a4a9 a4aa a4ab a4ac a4ad a4ae a4af a4b0 a4b1 a4b2 a4b3 a4b5 a4b6 a4b7 a4b8 a4b9 a4ba a4bb a4bc a4bd a4be a4bf a4c0 a4c2 a4c3 a4c4 a4c6 fb29 fe62 fe64 fe65 fe66 fe69 ff04 ff0b ff1c ff1d ff1e ff3e ff40 ff5c ff5e ffe0 ffe1 ffe2 ffe3 ffe4 ffe5 ffe6 ffe8 ffe9 ffea ffeb ffec ffed ffee fffc fffd found 2404 chars."; - - string upperChars = "41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d8 d9 da db dc dd de 100 102 104 106 108 10a 10c 10e 110 112 114 116 118 11a 11c 11e 120 122 124 126 128 12a 12c 12e 130 132 134 136 139 13b 13d 13f 141 143 145 147 14a 14c 14e 150 152 154 156 158 15a 15c 15e 160 162 164 166 168 16a 16c 16e 170 172 174 176 178 179 17b 17d 181 182 184 186 187 189 18a 18b 18e 18f 190 191 193 194 196 197 198 19c 19d 19f 1a0 1a2 1a4 1a6 1a7 1a9 1ac 1ae 1af 1b1 1b2 1b3 1b5 1b7 1b8 1bc 1c4 1c7 1ca 1cd 1cf 1d1 1d3 1d5 1d7 1d9 1db 1de 1e0 1e2 1e4 1e6 1e8 1ea 1ec 1ee 1f1 1f4 1f6 1f7 1f8 1fa 1fc 1fe 200 202 204 206 208 20a 20c 20e 210 212 214 216 218 21a 21c 21e 222 224 226 228 22a 22c 22e 230 232 386 388 389 38a 38c 38e 38f 391 392 393 394 395 396 397 398 399 39a 39b 39c 39d 39e 39f 3a0 3a1 3a3 3a4 3a5 3a6 3a7 3a8 3a9 3aa 3ab 3d2 3d3 3d4 3da 3dc 3de 3e0 3e2 3e4 3e6 3e8 3ea 3ec 3ee 400 401 402 403 404 405 406 407 408 409 40a 40b 40c 40d 40e 40f 410 411 412 413 414 415 416 417 418 419 41a 41b 41c 41d 41e 41f 420 421 422 423 424 425 426 427 428 429 42a 42b 42c 42d 42e 42f 460 462 464 466 468 46a 46c 46e 470 472 474 476 478 47a 47c 47e 480 48c 48e 490 492 494 496 498 49a 49c 49e 4a0 4a2 4a4 4a6 4a8 4aa 4ac 4ae 4b0 4b2 4b4 4b6 4b8 4ba 4bc 4be 4c0 4c1 4c3 4c7 4cb 4d0 4d2 4d4 4d6 4d8 4da 4dc 4de 4e0 4e2 4e4 4e6 4e8 4ea 4ec 4ee 4f0 4f2 4f4 4f8 531 532 533 534 535 536 537 538 539 53a 53b 53c 53d 53e 53f 540 541 542 543 544 545 546 547 548 549 54a 54b 54c 54d 54e 54f 550 551 552 553 554 555 556 " - + "10a0 10a1 10a2 10a3 10a4 10a5 10a6 10a7 10a8 10a9 10aa 10ab 10ac 10ad 10ae 10af 10b0 10b1 10b2 10b3 10b4 10b5 10b6 10b7 10b8 10b9 10ba 10bb 10bc 10bd 10be 10bf 10c0 10c1 10c2 10c3 10c4 10c5 1e00 1e02 1e04 1e06 1e08 1e0a 1e0c 1e0e 1e10 1e12 1e14 1e16 1e18 1e1a 1e1c 1e1e 1e20 1e22 1e24 1e26 1e28 1e2a 1e2c 1e2e 1e30 1e32 1e34 1e36 1e38 1e3a 1e3c 1e3e 1e40 1e42 1e44 1e46 1e48 1e4a 1e4c 1e4e 1e50 1e52 1e54 1e56 1e58 1e5a 1e5c 1e5e 1e60 1e62 1e64 1e66 1e68 1e6a 1e6c 1e6e 1e70 1e72 1e74 1e76 1e78 1e7a 1e7c 1e7e 1e80 1e82 1e84 1e86 1e88 1e8a 1e8c 1e8e 1e90 1e92 1e94 1ea0 1ea2 1ea4 1ea6 1ea8 1eaa 1eac 1eae 1eb0 1eb2 1eb4 1eb6 1eb8 1eba 1ebc 1ebe 1ec0 1ec2 1ec4 1ec6 1ec8 1eca 1ecc 1ece 1ed0 1ed2 1ed4 1ed6 1ed8 1eda 1edc 1ede 1ee0 1ee2 1ee4 1ee6 1ee8 1eea 1eec 1eee 1ef0 1ef2 1ef4 1ef6 1ef8 1f08 1f09 1f0a 1f0b 1f0c 1f0d 1f0e 1f0f 1f18 1f19 1f1a 1f1b 1f1c 1f1d 1f28 1f29 1f2a 1f2b 1f2c 1f2d 1f2e 1f2f 1f38 1f39 1f3a 1f3b 1f3c 1f3d 1f3e 1f3f 1f48 1f49 1f4a 1f4b 1f4c 1f4d 1f59 1f5b 1f5d 1f5f 1f68 1f69 1f6a 1f6b 1f6c 1f6d 1f6e 1f6f 1fb8 1fb9 1fba 1fbb 1fc8 1fc9 1fca 1fcb 1fd8 1fd9 1fda 1fdb 1fe8 1fe9 1fea 1feb 1fec 1ff8 1ff9 1ffa 1ffb 2102 2107 210b 210c 210d 2110 2111 2112 2115 2119 211a 211b 211c 211d 2124 2126 2128 212a 212b 212c 212d 2130 2131 2133 ff21 ff22 ff23 ff24 ff25 ff26 ff27 ff28 ff29 ff2a ff2b ff2c ff2d ff2e ff2f ff30 ff31 ff32 ff33 ff34 ff35 ff36 ff37 ff38 ff39 ff3a found 686 chars."; - -#if NET_2_0 - string whitespaceChars = "9 a b c d 20 85 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 200b 2028 2029 202f 205f 3000 found 26 chars."; -#else - string whitespaceChars = "9 a b c d 20 85 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 200b 2028 2029 202f 3000 found 25 chars."; -#endif - - string letters = ""; - string letterOrDigits = ""; - } - - /* - -// Usage: -// If you want to re-generate dump.XXX.txt in your box, run this program -// *under MS.NET*. The resulting text files will be used in corlib nunit -// test. -// -// BE CAREFUL: if you ran compile and ran this program *under Mono* and -// overwrote them, it might break the purpose of the test!! -// - - public static void Main() - { - int total = 0; - - for (int i = 0; i < 65536; i++) { -// if (Char.IsWhiteSpace ((char) i)) -// if (Char.IsSeparator ((char) i)) -// if (Char.IsDigit ((char) i)) -// if (Char.IsNumber ((char) i)) -// if (Char.IsControl ((char) i)) -// if (Char.IsLetter ((char) i)) - if (Char.IsLetterOrDigit ((char) i)) -// if (Char.IsLower ((char) i)) -// if (Char.IsPunctuation ((char) i)) -// if (Char.IsSurrogate ((char) i)) -// if (Char.IsSymbol ((char) i)) -// if (Char.IsUpper ((char) i)) - { - Console.Write (i.ToString ("x")); - Console.Write (' '); - total++; - } - } - - Console.Write ("found " + total + " chars."); - } - */ - -} +// +// CharCategoryTest.cs +// +// Author: +// Atsushi Enomoto +// +// (C)2004 Novell Inc. +// +// Brute force tests for Char.IsXXX() static methods. +// The result string is generated by the short program, which ran under MS.NET. +// (See the bottom of this file.) +// + +using NUnit.Framework; +using System; +using System.IO; +using System.Reflection; + +namespace MonoTests.System +{ + [TestFixture] + public class CharCategoryTest + { + static char DSC = Path.DirectorySeparatorChar; + + delegate bool ComparisonMethod (char c); + + private void CompareWithDump (ComparisonMethod cm, string dump, bool testTrue) + { + StringWriter sw = new StringWriter (); + int total = 0; + + for (int i = 0; i <= Char.MaxValue; i++) { + if (cm ((char) i) == testTrue) { + sw.Write (i.ToString ("x")); + sw.Write (' '); + total++; + } + } + sw.Write ("found " + total + " chars."); + +// string filename = Assembly.GetAssembly (typeof (Char)).Location + "/resources/" + dumpfile; +// StreamReader sr = new StreamReader (filename); +// dump = sr.ReadToEnd (); +// sr.Close (); + Assert.AreEqual (dump, sw.ToString ()); + } + + [Test] + public void IsControl () + { + CompareWithDump (new ComparisonMethod (Char.IsControl), controls, true); + } + + [Test] + public void IsDigit () + { + CompareWithDump (new ComparisonMethod (Char.IsDigit), digits, true); + } + + [Test] + [Ignore ("The dump file is huge, so avoided this test way.")] + public void IsLetter () + { + CompareWithDump (new ComparisonMethod (Char.IsLetter), letters, false); + } + + [Test] + [Ignore ("The dump file is huge, so avoided this test way.")] + public void IsLetterOrDigit () + { + CompareWithDump (new ComparisonMethod (Char.IsLetterOrDigit), letterOrDigits, false); + } + + [Test] + public void IsLower () + { + CompareWithDump (new ComparisonMethod (Char.IsLower), lowerChars, true); + } + + [Test] + public void IsNumber () + { + CompareWithDump (new ComparisonMethod (Char.IsNumber), numbers, true); + } + + [Test] + public void IsPunctuation () + { + CompareWithDump (new ComparisonMethod (Char.IsPunctuation), puncts, true); + } + + [Test] + public void IsSeparator () + { + CompareWithDump (new ComparisonMethod (Char.IsSeparator), separators, true); + } + + [Test] + public void IsSurrogate () + { + CompareWithDump (new ComparisonMethod (Char.IsSurrogate), surrogateChars, true); + } + + [Test] + public void IsSymbol () + { + CompareWithDump (new ComparisonMethod (Char.IsSymbol), symbolChars, true); + } + + [Test] + public void IsUpper () + { + CompareWithDump (new ComparisonMethod (Char.IsUpper), upperChars, true); + } + + [Test] + public void IsWhiteSpace () + { + CompareWithDump (new ComparisonMethod (Char.IsWhiteSpace), whitespaceChars, true); + } + + + string controls = "0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f found 65 chars."; + + string digits = "30 31 32 33 34 35 36 37 38 39 660 661 662 663 664 665 666 667 668 669 6f0 6f1 6f2 6f3 6f4 6f5 6f6 6f7 6f8 6f9 966 967 968 969 96a 96b 96c 96d 96e 96f 9e6 9e7 9e8 9e9 9ea 9eb 9ec 9ed 9ee 9ef a66 a67 a68 a69 a6a a6b a6c a6d a6e a6f ae6 ae7 ae8 ae9 aea aeb aec aed aee aef b66 b67 b68 b69 b6a b6b b6c b6d b6e b6f be7 be8 be9 bea beb bec bed bee bef c66 c67 c68 c69 c6a c6b c6c c6d c6e c6f ce6 ce7 ce8 ce9 cea ceb cec ced cee cef d66 d67 d68 d69 d6a d6b d6c d6d d6e d6f e50 e51 e52 e53 e54 e55 e56 e57 e58 e59 ed0 ed1 ed2 ed3 ed4 ed5 ed6 ed7 ed8 ed9 f20 f21 f22 f23 f24 f25 f26 f27 f28 f29 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1369 136a 136b 136c 136d 136e 136f 1370 1371 17e0 17e1 17e2 17e3 17e4 17e5 17e6 17e7 17e8 17e9 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 ff10 ff11 ff12 ff13 ff14 ff15 ff16 ff17 ff18 ff19 found 198 chars."; + + string lowerChars = "61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a aa b5 ba df e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef f0 f1 f2 f3 f4 f5 f6 f8 f9 fa fb fc fd fe ff 101 103 105 107 109 10b 10d 10f 111 113 115 117 119 11b 11d 11f 121 123 125 127 129 12b 12d 12f 131 133 135 137 138 13a 13c 13e 140 142 144 146 148 149 14b 14d 14f 151 153 155 157 159 15b 15d 15f 161 163 165 167 169 16b 16d 16f 171 173 175 177 17a 17c 17e 17f 180 183 185 188 18c 18d 192 195 199 19a 19b 19e 1a1 1a3 1a5 1a8 1aa 1ab 1ad 1b0 1b4 1b6 1b9 1ba 1bd 1be 1bf 1c6 1c9 1cc 1ce 1d0 1d2 1d4 1d6 1d8 1da 1dc 1dd 1df 1e1 1e3 1e5 1e7 1e9 1eb 1ed 1ef 1f0 1f3 1f5 1f9 1fb 1fd 1ff 201 203 205 207 209 20b 20d 20f 211 213 215 217 219 21b 21d 21f 223 225 227 229 22b 22d 22f 231 233 250 251 252 253 254 255 256 257 258 259 25a 25b 25c 25d 25e 25f 260 261 262 263 264 265 266 267 268 269 26a 26b 26c 26d 26e 26f 270 271 272 273 274 275 276 277 278 279 27a 27b 27c 27d 27e 27f 280 281 282 283 284 285 286 287 288 289 28a 28b 28c 28d 28e 28f 290 291 292 293 294 295 296 297 298 299 29a 29b 29c 29d 29e 29f 2a0 2a1 2a2 2a3 2a4 2a5 2a6 2a7 2a8 2a9 2aa 2ab 2ac 2ad 390 3ac 3ad 3ae 3af 3b0 3b1 3b2 3b3 3b4 3b5 3b6 3b7 3b8 3b9 3ba 3bb 3bc 3bd 3be 3bf 3c0 3c1 3c2 3c3 3c4 3c5 3c6 3c7 3c8 3c9 3ca 3cb 3cc 3cd 3ce 3d0 3d1 3d5 3d6 3d7 3db 3dd 3df 3e1 3e3 3e5 3e7 3e9 3eb 3ed 3ef 3f0 3f1 3f2 3f3 430 431 432 433 434 435 436 437 438 439 43a 43b 43c 43d 43e 43f 440 441 442 443 444 445 446 447 448 449 44a 44b 44c 44d 44e 44f 450 451 452 453 454 455 456 457 458 459 45a 45b 45c 45d 45e 45f 461 463 465 467 469 46b 46d 46f 471 473 475 477 479 47b 47d 47f 481 48d 48f 491 493 495 497 499 49b 49d 49f 4a1 4a3 4a5 4a7 4a9 4ab 4ad 4af 4b1 4b3 4b5 4b7 4b9 4bb 4bd 4bf 4c2 4c4 4c8 4cc 4d1 4d3 4d5 4d7 4d9 4db 4dd 4df 4e1 4e3 4e5 4e7 4e9 4eb 4ed 4ef 4f1 4f3 4f5 4f9 " + + "561 562 563 564 565 566 567 568 569 56a 56b 56c 56d 56e 56f 570 571 572 573 574 575 576 577 578 579 57a 57b 57c 57d 57e 57f 580 581 582 583 584 585 586 587 1e01 1e03 1e05 1e07 1e09 1e0b 1e0d 1e0f 1e11 1e13 1e15 1e17 1e19 1e1b 1e1d 1e1f 1e21 1e23 1e25 1e27 1e29 1e2b 1e2d 1e2f 1e31 1e33 1e35 1e37 1e39 1e3b 1e3d 1e3f 1e41 1e43 1e45 1e47 1e49 1e4b 1e4d 1e4f 1e51 1e53 1e55 1e57 1e59 1e5b 1e5d 1e5f 1e61 1e63 1e65 1e67 1e69 1e6b 1e6d 1e6f 1e71 1e73 1e75 1e77 1e79 1e7b 1e7d 1e7f 1e81 1e83 1e85 1e87 1e89 1e8b 1e8d 1e8f 1e91 1e93 1e95 1e96 1e97 1e98 1e99 1e9a 1e9b 1ea1 1ea3 1ea5 1ea7 1ea9 1eab 1ead 1eaf 1eb1 1eb3 1eb5 1eb7 1eb9 1ebb 1ebd 1ebf 1ec1 1ec3 1ec5 1ec7 1ec9 1ecb 1ecd 1ecf 1ed1 1ed3 1ed5 1ed7 1ed9 1edb 1edd 1edf 1ee1 1ee3 1ee5 1ee7 1ee9 1eeb 1eed 1eef 1ef1 1ef3 1ef5 1ef7 1ef9 1f00 1f01 1f02 1f03 1f04 1f05 1f06 1f07 1f10 1f11 1f12 1f13 1f14 1f15 1f20 1f21 1f22 1f23 1f24 1f25 1f26 1f27 1f30 1f31 1f32 1f33 1f34 1f35 1f36 1f37 1f40 1f41 1f42 1f43 1f44 1f45 1f50 1f51 1f52 1f53 1f54 1f55 1f56 1f57 1f60 1f61 1f62 1f63 1f64 1f65 1f66 1f67 1f70 1f71 1f72 1f73 1f74 1f75 1f76 1f77 1f78 1f79 1f7a 1f7b 1f7c 1f7d 1f80 1f81 1f82 1f83 1f84 1f85 1f86 1f87 1f90 1f91 1f92 1f93 1f94 1f95 1f96 1f97 1fa0 1fa1 1fa2 1fa3 1fa4 1fa5 1fa6 1fa7 1fb0 1fb1 1fb2 1fb3 1fb4 1fb6 1fb7 1fbe 1fc2 1fc3 1fc4 1fc6 1fc7 1fd0 1fd1 1fd2 1fd3 1fd6 1fd7 1fe0 1fe1 1fe2 1fe3 1fe4 1fe5 1fe6 1fe7 1ff2 1ff3 1ff4 1ff6 1ff7 207f 210a 210e 210f 2113 212f 2134 2139 fb00 fb01 fb02 fb03 fb04 fb05 fb06 fb13 fb14 fb15 fb16 fb17 ff41 ff42 ff43 ff44 ff45 ff46 ff47 ff48 ff49 ff4a ff4b ff4c ff4d ff4e ff4f ff50 ff51 ff52 ff53 ff54 ff55 ff56 ff57 ff58 ff59 ff5a found 804 chars."; + + string numbers = "30 31 32 33 34 35 36 37 38 39 b2 b3 b9 bc bd be 660 661 662 663 664 665 666 667 668 669 6f0 6f1 6f2 6f3 6f4 6f5 6f6 6f7 6f8 6f9 966 967 968 969 96a 96b 96c 96d 96e 96f 9e6 9e7 9e8 9e9 9ea 9eb 9ec 9ed 9ee 9ef 9f4 9f5 9f6 9f7 9f8 9f9 a66 a67 a68 a69 a6a a6b a6c a6d a6e a6f ae6 ae7 ae8 ae9 aea aeb aec aed aee aef b66 b67 b68 b69 b6a b6b b6c b6d b6e b6f be7 be8 be9 bea beb bec bed bee bef bf0 bf1 bf2 c66 c67 c68 c69 c6a c6b c6c c6d c6e c6f ce6 ce7 ce8 ce9 cea ceb cec ced cee cef d66 d67 d68 d69 d6a d6b d6c d6d d6e d6f e50 e51 e52 e53 e54 e55 e56 e57 e58 e59 ed0 ed1 ed2 ed3 ed4 ed5 ed6 ed7 ed8 ed9 f20 f21 f22 f23 f24 f25 f26 f27 f28 f29 f2a f2b f2c f2d f2e f2f f30 f31 f32 f33 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1369 136a 136b 136c 136d 136e 136f 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 137a 137b 137c 16ee 16ef 16f0 17e0 17e1 17e2 17e3 17e4 17e5 17e6 17e7 17e8 17e9 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 2070 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2153 2154 2155 2156 2157 2158 2159 215a 215b 215c 215d 215e 215f 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 216a 216b 216c 216d 216e 216f 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 217a 217b 217c 217d 217e 217f 2180 2181 2182 2183 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 246a 246b 246c 246d 246e 246f 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 247a 247b 247c 247d 247e 247f 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 248a 248b 248c 248d 248e 248f 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 249a 249b 24ea 2776 2777 2778 2779 277a 277b 277c 277d 277e 277f 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 278a 278b 278c 278d 278e 278f 2790 2791 2792 2793 " + + "3007 3021 3022 3023 3024 3025 3026 3027 3028 3029 3038 3039 303a 3192 3193 3194 3195 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 ff10 ff11 ff12 ff13 ff14 ff15 ff16 ff17 ff18 ff19 found 431 chars."; + + string puncts = "21 22 23 25 26 27 28 29 2a 2c 2d 2e 2f 3a 3b 3f 40 5b 5c 5d 5f 7b 7d a1 ab ad b7 bb bf 37e 387 55a 55b 55c 55d 55e 55f 589 58a 5be 5c0 5c3 5f3 5f4 60c 61b 61f 66a 66b 66c 66d 6d4 700 701 702 703 704 705 706 707 708 709 70a 70b 70c 70d 964 965 970 df4 e4f e5a e5b f04 f05 f06 f07 f08 f09 f0a f0b f0c f0d f0e f0f f10 f11 f12 f3a f3b f3c f3d f85 104a 104b 104c 104d 104e 104f 10fb 1361 1362 1363 1364 1365 1366 1367 1368 166d 166e 169b 169c 16eb 16ec 16ed 17d4 17d5 17d6 17d7 17d8 17d9 17da 17dc 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 180a 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 201a 201b 201c 201d 201e 201f 2020 2021 2022 2023 2024 2025 2026 2027 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 203a 203b 203c 203d 203e 203f 2040 2041 2042 2043 2045 2046 2048 2049 204a 204b 204c 204d 207d 207e 208d 208e 2329 232a 3001 3002 3003 3008 3009 300a 300b 300c 300d 300e 300f 3010 3011 3014 3015 3016 3017 3018 3019 301a 301b 301c 301d 301e 301f 3030 30fb fd3e fd3f fe30 fe31 fe32 fe33 fe34 fe35 fe36 fe37 fe38 fe39 fe3a fe3b fe3c fe3d fe3e fe3f fe40 fe41 fe42 fe43 fe44 fe49 fe4a fe4b fe4c fe4d fe4e fe4f fe50 fe51 fe52 fe54 fe55 fe56 fe57 fe58 fe59 fe5a fe5b fe5c fe5d fe5e fe5f fe60 fe61 fe63 fe68 fe6a fe6b ff01 ff02 ff03 ff05 ff06 ff07 ff08 ff09 ff0a ff0c ff0d ff0e ff0f ff1a ff1b ff1f ff20 ff3b ff3c ff3d ff3f ff5b ff5d ff61 ff62 ff63 ff64 ff65 found 298 chars."; + + string separators = "20 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 200b 2028 2029 202f 3000 found 19 chars."; + + string surrogateChars = "d800 d801 d802 d803 d804 d805 d806 d807 d808 d809 d80a d80b d80c d80d d80e d80f d810 d811 d812 d813 d814 d815 d816 d817 d818 d819 d81a d81b d81c d81d d81e d81f d820 d821 d822 d823 d824 d825 d826 d827 d828 d829 d82a d82b d82c d82d d82e d82f d830 d831 d832 d833 d834 d835 d836 d837 d838 d839 d83a d83b d83c d83d d83e d83f d840 d841 d842 d843 d844 d845 d846 d847 d848 d849 d84a d84b d84c d84d d84e d84f d850 d851 d852 d853 d854 d855 d856 d857 d858 d859 d85a d85b d85c d85d d85e d85f d860 d861 d862 d863 d864 d865 d866 d867 d868 d869 d86a d86b d86c d86d d86e d86f d870 d871 d872 d873 d874 d875 d876 d877 d878 d879 d87a d87b d87c d87d d87e d87f d880 d881 d882 d883 d884 d885 d886 d887 d888 d889 d88a d88b d88c d88d d88e d88f d890 d891 d892 d893 d894 d895 d896 d897 d898 d899 d89a d89b d89c d89d d89e d89f d8a0 d8a1 d8a2 d8a3 d8a4 d8a5 d8a6 d8a7 d8a8 d8a9 d8aa d8ab d8ac d8ad d8ae d8af d8b0 d8b1 d8b2 d8b3 d8b4 d8b5 d8b6 d8b7 d8b8 d8b9 d8ba d8bb d8bc d8bd d8be d8bf d8c0 d8c1 d8c2 d8c3 d8c4 d8c5 d8c6 d8c7 d8c8 d8c9 d8ca d8cb d8cc d8cd d8ce d8cf d8d0 d8d1 d8d2 d8d3 d8d4 d8d5 d8d6 d8d7 d8d8 d8d9 d8da d8db d8dc d8dd d8de d8df d8e0 d8e1 d8e2 d8e3 d8e4 d8e5 d8e6 d8e7 d8e8 d8e9 d8ea d8eb d8ec d8ed d8ee d8ef d8f0 d8f1 d8f2 d8f3 d8f4 d8f5 d8f6 d8f7 d8f8 d8f9 d8fa d8fb d8fc d8fd d8fe d8ff d900 d901 d902 d903 d904 d905 d906 d907 d908 d909 d90a d90b d90c d90d d90e d90f d910 d911 d912 d913 d914 d915 d916 d917 d918 d919 d91a d91b d91c d91d d91e d91f d920 d921 d922 d923 d924 d925 d926 d927 d928 d929 d92a d92b d92c d92d d92e d92f d930 d931 d932 d933 d934 d935 d936 d937 d938 d939 d93a d93b d93c d93d d93e d93f d940 d941 d942 d943 d944 d945 d946 d947 d948 d949 d94a d94b d94c d94d d94e d94f d950 d951 d952 d953 d954 d955 d956 d957 d958 d959 d95a d95b d95c d95d d95e d95f d960 d961 d962 d963 d964 d965 d966 d967 d968 d969 d96a d96b d96c d96d d96e d96f d970 d971 d972 d973 d974 d975 d976 d977 d978 d979 d97a d97b d97c d97d d97e d97f " + + "d980 d981 d982 d983 d984 d985 d986 d987 d988 d989 d98a d98b d98c d98d d98e d98f d990 d991 d992 d993 d994 d995 d996 d997 d998 d999 d99a d99b d99c d99d d99e d99f d9a0 d9a1 d9a2 d9a3 d9a4 d9a5 d9a6 d9a7 d9a8 d9a9 d9aa d9ab d9ac d9ad d9ae d9af d9b0 d9b1 d9b2 d9b3 d9b4 d9b5 d9b6 d9b7 d9b8 d9b9 d9ba d9bb d9bc d9bd d9be d9bf d9c0 d9c1 d9c2 d9c3 d9c4 d9c5 d9c6 d9c7 d9c8 d9c9 d9ca d9cb d9cc d9cd d9ce d9cf d9d0 d9d1 d9d2 d9d3 d9d4 d9d5 d9d6 d9d7 d9d8 d9d9 d9da d9db d9dc d9dd d9de d9df d9e0 d9e1 d9e2 d9e3 d9e4 d9e5 d9e6 d9e7 d9e8 d9e9 d9ea d9eb d9ec d9ed d9ee d9ef d9f0 d9f1 d9f2 d9f3 d9f4 d9f5 d9f6 d9f7 d9f8 d9f9 d9fa d9fb d9fc d9fd d9fe d9ff da00 da01 da02 da03 da04 da05 da06 da07 da08 da09 da0a da0b da0c da0d da0e da0f da10 da11 da12 da13 da14 da15 da16 da17 da18 da19 da1a da1b da1c da1d da1e da1f da20 da21 da22 da23 da24 da25 da26 da27 da28 da29 da2a da2b da2c da2d da2e da2f da30 da31 da32 da33 da34 da35 da36 da37 da38 da39 da3a da3b da3c da3d da3e da3f da40 da41 da42 da43 da44 da45 da46 da47 da48 da49 da4a da4b da4c da4d da4e da4f da50 da51 da52 da53 da54 da55 da56 da57 da58 da59 da5a da5b da5c da5d da5e da5f da60 da61 da62 da63 da64 da65 da66 da67 da68 da69 da6a da6b da6c da6d da6e da6f da70 da71 da72 da73 da74 da75 da76 da77 da78 da79 da7a da7b da7c da7d da7e da7f da80 da81 da82 da83 da84 da85 da86 da87 da88 da89 da8a da8b da8c da8d da8e da8f da90 da91 da92 da93 da94 da95 da96 da97 da98 da99 da9a da9b da9c da9d da9e da9f daa0 daa1 daa2 daa3 daa4 daa5 daa6 daa7 daa8 daa9 daaa daab daac daad daae daaf dab0 dab1 dab2 dab3 dab4 dab5 dab6 dab7 dab8 dab9 daba dabb dabc dabd dabe dabf dac0 dac1 dac2 dac3 dac4 dac5 dac6 dac7 dac8 dac9 daca dacb dacc dacd dace dacf dad0 dad1 dad2 dad3 dad4 dad5 dad6 dad7 dad8 dad9 dada dadb dadc dadd dade dadf dae0 dae1 dae2 dae3 dae4 dae5 dae6 dae7 dae8 dae9 daea daeb daec daed daee daef daf0 daf1 daf2 daf3 daf4 daf5 daf6 daf7 daf8 daf9 dafa dafb dafc dafd dafe daff " + + "db00 db01 db02 db03 db04 db05 db06 db07 db08 db09 db0a db0b db0c db0d db0e db0f db10 db11 db12 db13 db14 db15 db16 db17 db18 db19 db1a db1b db1c db1d db1e db1f db20 db21 db22 db23 db24 db25 db26 db27 db28 db29 db2a db2b db2c db2d db2e db2f db30 db31 db32 db33 db34 db35 db36 db37 db38 db39 db3a db3b db3c db3d db3e db3f db40 db41 db42 db43 db44 db45 db46 db47 db48 db49 db4a db4b db4c db4d db4e db4f db50 db51 db52 db53 db54 db55 db56 db57 db58 db59 db5a db5b db5c db5d db5e db5f db60 db61 db62 db63 db64 db65 db66 db67 db68 db69 db6a db6b db6c db6d db6e db6f db70 db71 db72 db73 db74 db75 db76 db77 db78 db79 db7a db7b db7c db7d db7e db7f db80 db81 db82 db83 db84 db85 db86 db87 db88 db89 db8a db8b db8c db8d db8e db8f db90 db91 db92 db93 db94 db95 db96 db97 db98 db99 db9a db9b db9c db9d db9e db9f dba0 dba1 dba2 dba3 dba4 dba5 dba6 dba7 dba8 dba9 dbaa dbab dbac dbad dbae dbaf dbb0 dbb1 dbb2 dbb3 dbb4 dbb5 dbb6 dbb7 dbb8 dbb9 dbba dbbb dbbc dbbd dbbe dbbf dbc0 dbc1 dbc2 dbc3 dbc4 dbc5 dbc6 dbc7 dbc8 dbc9 dbca dbcb dbcc dbcd dbce dbcf dbd0 dbd1 dbd2 dbd3 dbd4 dbd5 dbd6 dbd7 dbd8 dbd9 dbda dbdb dbdc dbdd dbde dbdf dbe0 dbe1 dbe2 dbe3 dbe4 dbe5 dbe6 dbe7 dbe8 dbe9 dbea dbeb dbec dbed dbee dbef dbf0 dbf1 dbf2 dbf3 dbf4 dbf5 dbf6 dbf7 dbf8 dbf9 dbfa dbfb dbfc dbfd dbfe dbff dc00 dc01 dc02 dc03 dc04 dc05 dc06 dc07 dc08 dc09 dc0a dc0b dc0c dc0d dc0e dc0f dc10 dc11 dc12 dc13 dc14 dc15 dc16 dc17 dc18 dc19 dc1a dc1b dc1c dc1d dc1e dc1f dc20 dc21 dc22 dc23 dc24 dc25 dc26 dc27 dc28 dc29 dc2a dc2b dc2c dc2d dc2e dc2f dc30 dc31 dc32 dc33 dc34 dc35 dc36 dc37 dc38 dc39 dc3a dc3b dc3c dc3d dc3e dc3f dc40 dc41 dc42 dc43 dc44 dc45 dc46 dc47 dc48 dc49 dc4a dc4b dc4c dc4d dc4e dc4f dc50 dc51 dc52 dc53 dc54 dc55 dc56 dc57 dc58 dc59 dc5a dc5b dc5c dc5d dc5e dc5f dc60 dc61 dc62 dc63 dc64 dc65 dc66 dc67 dc68 dc69 dc6a dc6b dc6c dc6d dc6e dc6f dc70 dc71 dc72 dc73 dc74 dc75 dc76 dc77 dc78 dc79 dc7a dc7b dc7c dc7d dc7e dc7f " + + "dc80 dc81 dc82 dc83 dc84 dc85 dc86 dc87 dc88 dc89 dc8a dc8b dc8c dc8d dc8e dc8f dc90 dc91 dc92 dc93 dc94 dc95 dc96 dc97 dc98 dc99 dc9a dc9b dc9c dc9d dc9e dc9f dca0 dca1 dca2 dca3 dca4 dca5 dca6 dca7 dca8 dca9 dcaa dcab dcac dcad dcae dcaf dcb0 dcb1 dcb2 dcb3 dcb4 dcb5 dcb6 dcb7 dcb8 dcb9 dcba dcbb dcbc dcbd dcbe dcbf dcc0 dcc1 dcc2 dcc3 dcc4 dcc5 dcc6 dcc7 dcc8 dcc9 dcca dccb dccc dccd dcce dccf dcd0 dcd1 dcd2 dcd3 dcd4 dcd5 dcd6 dcd7 dcd8 dcd9 dcda dcdb dcdc dcdd dcde dcdf dce0 dce1 dce2 dce3 dce4 dce5 dce6 dce7 dce8 dce9 dcea dceb dcec dced dcee dcef dcf0 dcf1 dcf2 dcf3 dcf4 dcf5 dcf6 dcf7 dcf8 dcf9 dcfa dcfb dcfc dcfd dcfe dcff dd00 dd01 dd02 dd03 dd04 dd05 dd06 dd07 dd08 dd09 dd0a dd0b dd0c dd0d dd0e dd0f dd10 dd11 dd12 dd13 dd14 dd15 dd16 dd17 dd18 dd19 dd1a dd1b dd1c dd1d dd1e dd1f dd20 dd21 dd22 dd23 dd24 dd25 dd26 dd27 dd28 dd29 dd2a dd2b dd2c dd2d dd2e dd2f dd30 dd31 dd32 dd33 dd34 dd35 dd36 dd37 dd38 dd39 dd3a dd3b dd3c dd3d dd3e dd3f dd40 dd41 dd42 dd43 dd44 dd45 dd46 dd47 dd48 dd49 dd4a dd4b dd4c dd4d dd4e dd4f dd50 dd51 dd52 dd53 dd54 dd55 dd56 dd57 dd58 dd59 dd5a dd5b dd5c dd5d dd5e dd5f dd60 dd61 dd62 dd63 dd64 dd65 dd66 dd67 dd68 dd69 dd6a dd6b dd6c dd6d dd6e dd6f dd70 dd71 dd72 dd73 dd74 dd75 dd76 dd77 dd78 dd79 dd7a dd7b dd7c dd7d dd7e dd7f dd80 dd81 dd82 dd83 dd84 dd85 dd86 dd87 dd88 dd89 dd8a dd8b dd8c dd8d dd8e dd8f dd90 dd91 dd92 dd93 dd94 dd95 dd96 dd97 dd98 dd99 dd9a dd9b dd9c dd9d dd9e dd9f dda0 dda1 dda2 dda3 dda4 dda5 dda6 dda7 dda8 dda9 ddaa ddab ddac ddad ddae ddaf ddb0 ddb1 ddb2 ddb3 ddb4 ddb5 ddb6 ddb7 ddb8 ddb9 ddba ddbb ddbc ddbd ddbe ddbf ddc0 ddc1 ddc2 ddc3 ddc4 ddc5 ddc6 ddc7 ddc8 ddc9 ddca ddcb ddcc ddcd ddce ddcf ddd0 ddd1 ddd2 ddd3 ddd4 ddd5 ddd6 ddd7 ddd8 ddd9 ddda dddb dddc dddd ddde dddf dde0 dde1 dde2 dde3 dde4 dde5 dde6 dde7 dde8 dde9 ddea ddeb ddec dded ddee ddef ddf0 ddf1 ddf2 ddf3 ddf4 ddf5 ddf6 ddf7 ddf8 ddf9 ddfa ddfb ddfc ddfd ddfe ddff " + + "de00 de01 de02 de03 de04 de05 de06 de07 de08 de09 de0a de0b de0c de0d de0e de0f de10 de11 de12 de13 de14 de15 de16 de17 de18 de19 de1a de1b de1c de1d de1e de1f de20 de21 de22 de23 de24 de25 de26 de27 de28 de29 de2a de2b de2c de2d de2e de2f de30 de31 de32 de33 de34 de35 de36 de37 de38 de39 de3a de3b de3c de3d de3e de3f de40 de41 de42 de43 de44 de45 de46 de47 de48 de49 de4a de4b de4c de4d de4e de4f de50 de51 de52 de53 de54 de55 de56 de57 de58 de59 de5a de5b de5c de5d de5e de5f de60 de61 de62 de63 de64 de65 de66 de67 de68 de69 de6a de6b de6c de6d de6e de6f de70 de71 de72 de73 de74 de75 de76 de77 de78 de79 de7a de7b de7c de7d de7e de7f de80 de81 de82 de83 de84 de85 de86 de87 de88 de89 de8a de8b de8c de8d de8e de8f de90 de91 de92 de93 de94 de95 de96 de97 de98 de99 de9a de9b de9c de9d de9e de9f dea0 dea1 dea2 dea3 dea4 dea5 dea6 dea7 dea8 dea9 deaa deab deac dead deae deaf deb0 deb1 deb2 deb3 deb4 deb5 deb6 deb7 deb8 deb9 deba debb debc debd debe debf dec0 dec1 dec2 dec3 dec4 dec5 dec6 dec7 dec8 dec9 deca decb decc decd dece decf ded0 ded1 ded2 ded3 ded4 ded5 ded6 ded7 ded8 ded9 deda dedb dedc dedd dede dedf dee0 dee1 dee2 dee3 dee4 dee5 dee6 dee7 dee8 dee9 deea deeb deec deed deee deef def0 def1 def2 def3 def4 def5 def6 def7 def8 def9 defa defb defc defd defe deff df00 df01 df02 df03 df04 df05 df06 df07 df08 df09 df0a df0b df0c df0d df0e df0f df10 df11 df12 df13 df14 df15 df16 df17 df18 df19 df1a df1b df1c df1d df1e df1f df20 df21 df22 df23 df24 df25 df26 df27 df28 df29 df2a df2b df2c df2d df2e df2f df30 df31 df32 df33 df34 df35 df36 df37 df38 df39 df3a df3b df3c df3d df3e df3f df40 df41 df42 df43 df44 df45 df46 df47 df48 df49 df4a df4b df4c df4d df4e df4f df50 df51 df52 df53 df54 df55 df56 df57 df58 df59 df5a df5b df5c df5d df5e df5f df60 df61 df62 df63 df64 df65 df66 df67 df68 df69 df6a df6b df6c df6d df6e df6f df70 df71 df72 df73 df74 df75 df76 df77 df78 df79 df7a df7b df7c df7d df7e df7f " + + "df80 df81 df82 df83 df84 df85 df86 df87 df88 df89 df8a df8b df8c df8d df8e df8f df90 df91 df92 df93 df94 df95 df96 df97 df98 df99 df9a df9b df9c df9d df9e df9f dfa0 dfa1 dfa2 dfa3 dfa4 dfa5 dfa6 dfa7 dfa8 dfa9 dfaa dfab dfac dfad dfae dfaf dfb0 dfb1 dfb2 dfb3 dfb4 dfb5 dfb6 dfb7 dfb8 dfb9 dfba dfbb dfbc dfbd dfbe dfbf dfc0 dfc1 dfc2 dfc3 dfc4 dfc5 dfc6 dfc7 dfc8 dfc9 dfca dfcb dfcc dfcd dfce dfcf dfd0 dfd1 dfd2 dfd3 dfd4 dfd5 dfd6 dfd7 dfd8 dfd9 dfda dfdb dfdc dfdd dfde dfdf dfe0 dfe1 dfe2 dfe3 dfe4 dfe5 dfe6 dfe7 dfe8 dfe9 dfea dfeb dfec dfed dfee dfef dff0 dff1 dff2 dff3 dff4 dff5 dff6 dff7 dff8 dff9 dffa dffb dffc dffd dffe dfff found 2048 chars."; + + string symbolChars = "24 2b 3c 3d 3e 5e 60 7c 7e a2 a3 a4 a5 a6 a7 a8 a9 ac ae af b0 b1 b4 b6 b8 d7 f7 2b9 2ba 2c2 2c3 2c4 2c5 2c6 2c7 2c8 2c9 2ca 2cb 2cc 2cd 2ce 2cf 2d2 2d3 2d4 2d5 2d6 2d7 2d8 2d9 2da 2db 2dc 2dd 2de 2df 2e5 2e6 2e7 2e8 2e9 2ea 2eb 2ec 2ed 374 375 384 385 482 6e9 6fd 6fe 9f2 9f3 9fa b70 e3f f01 f02 f03 f13 f14 f15 f16 f17 f1a f1b f1c f1d f1e f1f f34 f36 f38 fbe fbf fc0 fc1 fc2 fc3 fc4 fc5 fc7 fc8 fc9 fca fcb fcc fcf 17db 1fbd 1fbf 1fc0 1fc1 1fcd 1fce 1fcf 1fdd 1fde 1fdf 1fed 1fee 1fef 1ffd 1ffe 2044 207a 207b 207c 208a 208b 208c 20a0 20a1 20a2 20a3 20a4 20a5 20a6 20a7 20a8 20a9 20aa 20ab 20ac 20ad 20ae 20af 2100 2101 2103 2104 2105 2106 2108 2109 2114 2116 2117 2118 211e 211f 2120 2121 2122 2123 2125 2127 2129 212e 2132 213a 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 219a 219b 219c 219d 219e 219f 21a0 21a1 21a2 21a3 21a4 21a5 21a6 21a7 21a8 21a9 21aa 21ab 21ac 21ad 21ae 21af 21b0 21b1 21b2 21b3 21b4 21b5 21b6 21b7 21b8 21b9 21ba 21bb 21bc 21bd 21be 21bf 21c0 21c1 21c2 21c3 21c4 21c5 21c6 21c7 21c8 21c9 21ca 21cb 21cc 21cd 21ce 21cf 21d0 21d1 21d2 21d3 21d4 21d5 21d6 21d7 21d8 21d9 21da 21db 21dc 21dd 21de 21df 21e0 21e1 21e2 21e3 21e4 21e5 21e6 21e7 21e8 21e9 21ea 21eb 21ec 21ed 21ee 21ef 21f0 21f1 21f2 21f3 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 220a 220b 220c 220d 220e 220f 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 221a 221b 221c 221d 221e 221f 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 222a 222b 222c 222d 222e 222f 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 223a 223b 223c 223d 223e 223f 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 224a 224b 224c 224d 224e 224f 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 225a 225b 225c 225d 225e 225f 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 226a 226b 226c 226d 226e 226f 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 227a 227b 227c 227d 227e 227f " + + "2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 228a 228b 228c 228d 228e 228f 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 229a 229b 229c 229d 229e 229f 22a0 22a1 22a2 22a3 22a4 22a5 22a6 22a7 22a8 22a9 22aa 22ab 22ac 22ad 22ae 22af 22b0 22b1 22b2 22b3 22b4 22b5 22b6 22b7 22b8 22b9 22ba 22bb 22bc 22bd 22be 22bf 22c0 22c1 22c2 22c3 22c4 22c5 22c6 22c7 22c8 22c9 22ca 22cb 22cc 22cd 22ce 22cf 22d0 22d1 22d2 22d3 22d4 22d5 22d6 22d7 22d8 22d9 22da 22db 22dc 22dd 22de 22df 22e0 22e1 22e2 22e3 22e4 22e5 22e6 22e7 22e8 22e9 22ea 22eb 22ec 22ed 22ee 22ef 22f0 22f1 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 230a 230b 230c 230d 230e 230f 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 231a 231b 231c 231d 231e 231f 2320 2321 2322 2323 2324 2325 2326 2327 2328 232b 232c 232d 232e 232f 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 233a 233b 233c 233d 233e 233f 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 234a 234b 234c 234d 234e 234f 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 235a 235b 235c 235d 235e 235f 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 236a 236b 236c 236d 236e 236f 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 237a 237b 237d 237e 237f 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 238a 238b 238c 238d 238e 238f 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 239a 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 240a 240b 240c 240d 240e 240f 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 241a 241b 241c 241d 241e 241f 2420 2421 2422 2423 2424 2425 2426 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 244a 249c 249d 249e 249f 24a0 24a1 24a2 24a3 24a4 24a5 24a6 24a7 24a8 24a9 24aa 24ab 24ac 24ad 24ae 24af 24b0 24b1 24b2 24b3 24b4 24b5 24b6 24b7 24b8 24b9 24ba 24bb 24bc 24bd 24be 24bf 24c0 24c1 24c2 24c3 24c4 24c5 24c6 24c7 24c8 24c9 24ca 24cb 24cc 24cd 24ce 24cf 24d0 24d1 24d2 24d3 24d4 24d5 24d6 24d7 24d8 24d9 24da 24db 24dc 24dd 24de 24df 24e0 24e1 24e2 24e3 24e4 24e5 24e6 24e7 24e8 24e9 " + + "2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 250a 250b 250c 250d 250e 250f 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 251a 251b 251c 251d 251e 251f 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 252a 252b 252c 252d 252e 252f 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 253a 253b 253c 253d 253e 253f 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 254a 254b 254c 254d 254e 254f 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 255a 255b 255c 255d 255e 255f 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 256a 256b 256c 256d 256e 256f 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 257a 257b 257c 257d 257e 257f 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 258a 258b 258c 258d 258e 258f 2590 2591 2592 2593 2594 2595 25a0 25a1 25a2 25a3 25a4 25a5 25a6 25a7 25a8 25a9 25aa 25ab 25ac 25ad 25ae 25af 25b0 25b1 25b2 25b3 25b4 25b5 25b6 25b7 25b8 25b9 25ba 25bb 25bc 25bd 25be 25bf 25c0 25c1 25c2 25c3 25c4 25c5 25c6 25c7 25c8 25c9 25ca 25cb 25cc 25cd 25ce 25cf 25d0 25d1 25d2 25d3 25d4 25d5 25d6 25d7 25d8 25d9 25da 25db 25dc 25dd 25de 25df 25e0 25e1 25e2 25e3 25e4 25e5 25e6 25e7 25e8 25e9 25ea 25eb 25ec 25ed 25ee 25ef 25f0 25f1 25f2 25f3 25f4 25f5 25f6 25f7 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 260a 260b 260c 260d 260e 260f 2610 2611 2612 2613 2619 261a 261b 261c 261d 261e 261f 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 262a 262b 262c 262d 262e 262f 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 263a 263b 263c 263d 263e 263f 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 264a 264b 264c 264d 264e 264f 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 265a 265b 265c 265d 265e 265f 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 266a 266b 266c 266d 266e 266f 2670 2671 " + + "2701 2702 2703 2704 2706 2707 2708 2709 270c 270d 270e 270f 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 271a 271b 271c 271d 271e 271f 2720 2721 2722 2723 2724 2725 2726 2727 2729 272a 272b 272c 272d 272e 272f 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 273a 273b 273c 273d 273e 273f 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 274a 274b 274d 274f 2750 2751 2752 2756 2758 2759 275a 275b 275c 275d 275e 2761 2762 2763 2764 2765 2766 2767 2794 2798 2799 279a 279b 279c 279d 279e 279f 27a0 27a1 27a2 27a3 27a4 27a5 27a6 27a7 27a8 27a9 27aa 27ab 27ac 27ad 27ae 27af 27b1 27b2 27b3 27b4 27b5 27b6 27b7 27b8 27b9 27ba 27bb 27bc 27bd 27be 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 280a 280b 280c 280d 280e 280f 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 281a 281b 281c 281d 281e 281f 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 282a 282b 282c 282d 282e 282f 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 283a 283b 283c 283d 283e 283f 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 284a 284b 284c 284d 284e 284f 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 285a 285b 285c 285d 285e 285f 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 286a 286b 286c 286d 286e 286f 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 287a 287b 287c 287d 287e 287f 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 288a 288b 288c 288d 288e 288f 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 289a 289b 289c 289d 289e 289f 28a0 28a1 28a2 28a3 28a4 28a5 28a6 28a7 28a8 28a9 28aa 28ab 28ac 28ad 28ae 28af 28b0 28b1 28b2 28b3 28b4 28b5 28b6 28b7 28b8 28b9 28ba 28bb 28bc 28bd 28be 28bf 28c0 28c1 28c2 28c3 28c4 28c5 28c6 28c7 28c8 28c9 28ca 28cb 28cc 28cd 28ce 28cf 28d0 28d1 28d2 28d3 28d4 28d5 28d6 28d7 28d8 28d9 28da 28db 28dc 28dd 28de 28df 28e0 28e1 28e2 28e3 28e4 28e5 28e6 28e7 28e8 28e9 28ea 28eb 28ec 28ed 28ee 28ef 28f0 28f1 28f2 28f3 28f4 28f5 28f6 28f7 28f8 28f9 28fa 28fb 28fc 28fd 28fe 28ff " + + "2e80 2e81 2e82 2e83 2e84 2e85 2e86 2e87 2e88 2e89 2e8a 2e8b 2e8c 2e8d 2e8e 2e8f 2e90 2e91 2e92 2e93 2e94 2e95 2e96 2e97 2e98 2e99 2e9b 2e9c 2e9d 2e9e 2e9f 2ea0 2ea1 2ea2 2ea3 2ea4 2ea5 2ea6 2ea7 2ea8 2ea9 2eaa 2eab 2eac 2ead 2eae 2eaf 2eb0 2eb1 2eb2 2eb3 2eb4 2eb5 2eb6 2eb7 2eb8 2eb9 2eba 2ebb 2ebc 2ebd 2ebe 2ebf 2ec0 2ec1 2ec2 2ec3 2ec4 2ec5 2ec6 2ec7 2ec8 2ec9 2eca 2ecb 2ecc 2ecd 2ece 2ecf 2ed0 2ed1 2ed2 2ed3 2ed4 2ed5 2ed6 2ed7 2ed8 2ed9 2eda 2edb 2edc 2edd 2ede 2edf 2ee0 2ee1 2ee2 2ee3 2ee4 2ee5 2ee6 2ee7 2ee8 2ee9 2eea 2eeb 2eec 2eed 2eee 2eef 2ef0 2ef1 2ef2 2ef3 2f00 2f01 2f02 2f03 2f04 2f05 2f06 2f07 2f08 2f09 2f0a 2f0b 2f0c 2f0d 2f0e 2f0f 2f10 2f11 2f12 2f13 2f14 2f15 2f16 2f17 2f18 2f19 2f1a 2f1b 2f1c 2f1d 2f1e 2f1f 2f20 2f21 2f22 2f23 2f24 2f25 2f26 2f27 2f28 2f29 2f2a 2f2b 2f2c 2f2d 2f2e 2f2f 2f30 2f31 2f32 2f33 2f34 2f35 2f36 2f37 2f38 2f39 2f3a 2f3b 2f3c 2f3d 2f3e 2f3f 2f40 2f41 2f42 2f43 2f44 2f45 2f46 2f47 2f48 2f49 2f4a 2f4b 2f4c 2f4d 2f4e 2f4f 2f50 2f51 2f52 2f53 2f54 2f55 2f56 2f57 2f58 2f59 2f5a 2f5b 2f5c 2f5d 2f5e 2f5f 2f60 2f61 2f62 2f63 2f64 2f65 2f66 2f67 2f68 2f69 2f6a 2f6b 2f6c 2f6d 2f6e 2f6f 2f70 2f71 2f72 2f73 2f74 2f75 2f76 2f77 2f78 2f79 2f7a 2f7b 2f7c 2f7d 2f7e 2f7f 2f80 2f81 2f82 2f83 2f84 2f85 2f86 2f87 2f88 2f89 2f8a 2f8b 2f8c 2f8d 2f8e 2f8f 2f90 2f91 2f92 2f93 2f94 2f95 2f96 2f97 2f98 2f99 2f9a 2f9b 2f9c 2f9d 2f9e 2f9f 2fa0 2fa1 2fa2 2fa3 2fa4 2fa5 2fa6 2fa7 2fa8 2fa9 2faa 2fab 2fac 2fad 2fae 2faf 2fb0 2fb1 2fb2 2fb3 2fb4 2fb5 2fb6 2fb7 2fb8 2fb9 2fba 2fbb 2fbc 2fbd 2fbe 2fbf 2fc0 2fc1 2fc2 2fc3 2fc4 2fc5 2fc6 2fc7 2fc8 2fc9 2fca 2fcb 2fcc 2fcd 2fce 2fcf 2fd0 2fd1 2fd2 2fd3 2fd4 2fd5 2ff0 2ff1 2ff2 2ff3 2ff4 2ff5 2ff6 2ff7 2ff8 2ff9 2ffa 2ffb 3004 3012 3013 3020 3036 3037 303e 303f 309b 309c 3190 3191 3196 3197 3198 3199 319a 319b 319c 319d 319e 319f " + + "3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 320a 320b 320c 320d 320e 320f 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 321a 321b 321c 322a 322b 322c 322d 322e 322f 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 323a 323b 323c 323d 323e 323f 3240 3241 3242 3243 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 326a 326b 326c 326d 326e 326f 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 327a 327b 327f 328a 328b 328c 328d 328e 328f 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 329a 329b 329c 329d 329e 329f 32a0 32a1 32a2 32a3 32a4 32a5 32a6 32a7 32a8 32a9 32aa 32ab 32ac 32ad 32ae 32af 32b0 32c0 32c1 32c2 32c3 32c4 32c5 32c6 32c7 32c8 32c9 32ca 32cb 32d0 32d1 32d2 32d3 32d4 32d5 32d6 32d7 32d8 32d9 32da 32db 32dc 32dd 32de 32df 32e0 32e1 32e2 32e3 32e4 32e5 32e6 32e7 32e8 32e9 32ea 32eb 32ec 32ed 32ee 32ef 32f0 32f1 32f2 32f3 32f4 32f5 32f6 32f7 32f8 32f9 32fa 32fb 32fc 32fd 32fe 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 330a 330b 330c 330d 330e 330f 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 331a 331b 331c 331d 331e 331f 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 332a 332b 332c 332d 332e 332f 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 333a 333b 333c 333d 333e 333f 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 334a 334b 334c 334d 334e 334f 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 335a 335b 335c 335d 335e 335f 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 336a 336b 336c 336d 336e 336f 3370 3371 3372 3373 3374 3375 3376 337b 337c 337d 337e 337f 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 338a 338b 338c 338d 338e 338f 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 339a 339b 339c 339d 339e 339f 33a0 33a1 33a2 33a3 33a4 33a5 33a6 33a7 33a8 33a9 33aa 33ab 33ac 33ad 33ae 33af 33b0 33b1 33b2 33b3 33b4 33b5 33b6 33b7 33b8 33b9 33ba 33bb 33bc 33bd 33be 33bf " + + "33c0 33c1 33c2 33c3 33c4 33c5 33c6 33c7 33c8 33c9 33ca 33cb 33cc 33cd 33ce 33cf 33d0 33d1 33d2 33d3 33d4 33d5 33d6 33d7 33d8 33d9 33da 33db 33dc 33dd 33e0 33e1 33e2 33e3 33e4 33e5 33e6 33e7 33e8 33e9 33ea 33eb 33ec 33ed 33ee 33ef 33f0 33f1 33f2 33f3 33f4 33f5 33f6 33f7 33f8 33f9 33fa 33fb 33fc 33fd 33fe " + + "a490 a491 a492 a493 a494 a495 a496 a497 a498 a499 a49a a49b a49c a49d a49e a49f a4a0 a4a1 a4a4 a4a5 a4a6 a4a7 a4a8 a4a9 a4aa a4ab a4ac a4ad a4ae a4af a4b0 a4b1 a4b2 a4b3 a4b5 a4b6 a4b7 a4b8 a4b9 a4ba a4bb a4bc a4bd a4be a4bf a4c0 a4c2 a4c3 a4c4 a4c6 fb29 fe62 fe64 fe65 fe66 fe69 ff04 ff0b ff1c ff1d ff1e ff3e ff40 ff5c ff5e ffe0 ffe1 ffe2 ffe3 ffe4 ffe5 ffe6 ffe8 ffe9 ffea ffeb ffec ffed ffee fffc fffd found 2404 chars."; + + string upperChars = "41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf d0 d1 d2 d3 d4 d5 d6 d8 d9 da db dc dd de 100 102 104 106 108 10a 10c 10e 110 112 114 116 118 11a 11c 11e 120 122 124 126 128 12a 12c 12e 130 132 134 136 139 13b 13d 13f 141 143 145 147 14a 14c 14e 150 152 154 156 158 15a 15c 15e 160 162 164 166 168 16a 16c 16e 170 172 174 176 178 179 17b 17d 181 182 184 186 187 189 18a 18b 18e 18f 190 191 193 194 196 197 198 19c 19d 19f 1a0 1a2 1a4 1a6 1a7 1a9 1ac 1ae 1af 1b1 1b2 1b3 1b5 1b7 1b8 1bc 1c4 1c7 1ca 1cd 1cf 1d1 1d3 1d5 1d7 1d9 1db 1de 1e0 1e2 1e4 1e6 1e8 1ea 1ec 1ee 1f1 1f4 1f6 1f7 1f8 1fa 1fc 1fe 200 202 204 206 208 20a 20c 20e 210 212 214 216 218 21a 21c 21e 222 224 226 228 22a 22c 22e 230 232 386 388 389 38a 38c 38e 38f 391 392 393 394 395 396 397 398 399 39a 39b 39c 39d 39e 39f 3a0 3a1 3a3 3a4 3a5 3a6 3a7 3a8 3a9 3aa 3ab 3d2 3d3 3d4 3da 3dc 3de 3e0 3e2 3e4 3e6 3e8 3ea 3ec 3ee 400 401 402 403 404 405 406 407 408 409 40a 40b 40c 40d 40e 40f 410 411 412 413 414 415 416 417 418 419 41a 41b 41c 41d 41e 41f 420 421 422 423 424 425 426 427 428 429 42a 42b 42c 42d 42e 42f 460 462 464 466 468 46a 46c 46e 470 472 474 476 478 47a 47c 47e 480 48c 48e 490 492 494 496 498 49a 49c 49e 4a0 4a2 4a4 4a6 4a8 4aa 4ac 4ae 4b0 4b2 4b4 4b6 4b8 4ba 4bc 4be 4c0 4c1 4c3 4c7 4cb 4d0 4d2 4d4 4d6 4d8 4da 4dc 4de 4e0 4e2 4e4 4e6 4e8 4ea 4ec 4ee 4f0 4f2 4f4 4f8 531 532 533 534 535 536 537 538 539 53a 53b 53c 53d 53e 53f 540 541 542 543 544 545 546 547 548 549 54a 54b 54c 54d 54e 54f 550 551 552 553 554 555 556 " + + "10a0 10a1 10a2 10a3 10a4 10a5 10a6 10a7 10a8 10a9 10aa 10ab 10ac 10ad 10ae 10af 10b0 10b1 10b2 10b3 10b4 10b5 10b6 10b7 10b8 10b9 10ba 10bb 10bc 10bd 10be 10bf 10c0 10c1 10c2 10c3 10c4 10c5 1e00 1e02 1e04 1e06 1e08 1e0a 1e0c 1e0e 1e10 1e12 1e14 1e16 1e18 1e1a 1e1c 1e1e 1e20 1e22 1e24 1e26 1e28 1e2a 1e2c 1e2e 1e30 1e32 1e34 1e36 1e38 1e3a 1e3c 1e3e 1e40 1e42 1e44 1e46 1e48 1e4a 1e4c 1e4e 1e50 1e52 1e54 1e56 1e58 1e5a 1e5c 1e5e 1e60 1e62 1e64 1e66 1e68 1e6a 1e6c 1e6e 1e70 1e72 1e74 1e76 1e78 1e7a 1e7c 1e7e 1e80 1e82 1e84 1e86 1e88 1e8a 1e8c 1e8e 1e90 1e92 1e94 1ea0 1ea2 1ea4 1ea6 1ea8 1eaa 1eac 1eae 1eb0 1eb2 1eb4 1eb6 1eb8 1eba 1ebc 1ebe 1ec0 1ec2 1ec4 1ec6 1ec8 1eca 1ecc 1ece 1ed0 1ed2 1ed4 1ed6 1ed8 1eda 1edc 1ede 1ee0 1ee2 1ee4 1ee6 1ee8 1eea 1eec 1eee 1ef0 1ef2 1ef4 1ef6 1ef8 1f08 1f09 1f0a 1f0b 1f0c 1f0d 1f0e 1f0f 1f18 1f19 1f1a 1f1b 1f1c 1f1d 1f28 1f29 1f2a 1f2b 1f2c 1f2d 1f2e 1f2f 1f38 1f39 1f3a 1f3b 1f3c 1f3d 1f3e 1f3f 1f48 1f49 1f4a 1f4b 1f4c 1f4d 1f59 1f5b 1f5d 1f5f 1f68 1f69 1f6a 1f6b 1f6c 1f6d 1f6e 1f6f 1fb8 1fb9 1fba 1fbb 1fc8 1fc9 1fca 1fcb 1fd8 1fd9 1fda 1fdb 1fe8 1fe9 1fea 1feb 1fec 1ff8 1ff9 1ffa 1ffb 2102 2107 210b 210c 210d 2110 2111 2112 2115 2119 211a 211b 211c 211d 2124 2126 2128 212a 212b 212c 212d 2130 2131 2133 ff21 ff22 ff23 ff24 ff25 ff26 ff27 ff28 ff29 ff2a ff2b ff2c ff2d ff2e ff2f ff30 ff31 ff32 ff33 ff34 ff35 ff36 ff37 ff38 ff39 ff3a found 686 chars."; + +#if NET_2_0 + string whitespaceChars = "9 a b c d 20 85 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 200b 2028 2029 202f 205f 3000 found 26 chars."; +#else + string whitespaceChars = "9 a b c d 20 85 a0 1680 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 200a 200b 2028 2029 202f 3000 found 25 chars."; +#endif + + string letters = ""; + string letterOrDigits = ""; + } + + /* + +// Usage: +// If you want to re-generate dump.XXX.txt in your box, run this program +// *under MS.NET*. The resulting text files will be used in corlib nunit +// test. +// +// BE CAREFUL: if you ran compile and ran this program *under Mono* and +// overwrote them, it might break the purpose of the test!! +// + + public static void Main() + { + int total = 0; + + for (int i = 0; i < 65536; i++) { +// if (Char.IsWhiteSpace ((char) i)) +// if (Char.IsSeparator ((char) i)) +// if (Char.IsDigit ((char) i)) +// if (Char.IsNumber ((char) i)) +// if (Char.IsControl ((char) i)) +// if (Char.IsLetter ((char) i)) + if (Char.IsLetterOrDigit ((char) i)) +// if (Char.IsLower ((char) i)) +// if (Char.IsPunctuation ((char) i)) +// if (Char.IsSurrogate ((char) i)) +// if (Char.IsSymbol ((char) i)) +// if (Char.IsUpper ((char) i)) + { + Console.Write (i.ToString ("x")); + Console.Write (' '); + total++; + } + } + + Console.Write ("found " + total + " chars."); + } + */ + +} diff --git a/mcs/class/corlib/Test/System/CharEnumeratorTest.cs b/mcs/class/corlib/Test/System/CharEnumeratorTest.cs index 6ea33511d71..ca401499dc3 100644 --- a/mcs/class/corlib/Test/System/CharEnumeratorTest.cs +++ b/mcs/class/corlib/Test/System/CharEnumeratorTest.cs @@ -13,13 +13,15 @@ using System; namespace MonoTests.System { -public class CharEnumeratorTest : TestCase +[TestFixture] +public class CharEnumeratorTest { public CharEnumeratorTest () {} string _s; - protected override void SetUp () + [SetUp] + protected void SetUp () { _s = "Emma en Sophie"; } @@ -37,15 +39,17 @@ public class CharEnumeratorTest : TestCase return res; } + [Test] public void TestBasic () { CharEnumerator ce = _s.GetEnumerator (); ce.MoveNext (); - AssertEquals ("A1", _s, GetFromEnumerator (ce)); + Assert.AreEqual (_s, GetFromEnumerator (ce), "A1"); } + [Test] public void TestClone () { CharEnumerator ce1, ce2=null; @@ -60,9 +64,10 @@ public class CharEnumeratorTest : TestCase cont = ce1.MoveNext (); } - AssertEquals ("A1", "Sophie", GetFromEnumerator(ce2)); + Assert.AreEqual ("Sophie", GetFromEnumerator(ce2), "A1"); } + [Test] public void TestReadOutOfBounds () { char c; @@ -76,11 +81,11 @@ public class CharEnumeratorTest : TestCase catch (InvalidOperationException) { exception = true; } - Assert ("A1", exception); + Assert.IsTrue (exception, "A1"); - AssertEquals("A2", true, ce.MoveNext ()); + Assert.AreEqual(true, ce.MoveNext (), "A2"); - AssertEquals ("A3", _s, GetFromEnumerator (ce)); + Assert.AreEqual (_s, GetFromEnumerator (ce), "A3"); try { c = ce.Current; @@ -88,10 +93,10 @@ public class CharEnumeratorTest : TestCase catch (InvalidOperationException) { exception = true; } - Assert ("A4", exception); + Assert.IsTrue (exception, "A4"); - AssertEquals("A5", false, ce.MoveNext() ); - AssertEquals("A6", false, ce.MoveNext() ); + Assert.AreEqual(false, ce.MoveNext() , "A5"); + Assert.AreEqual(false, ce.MoveNext() , "A6"); ce.Reset (); @@ -101,14 +106,14 @@ public class CharEnumeratorTest : TestCase catch (InvalidOperationException) { exception = true; } - Assert ("A7", exception); + Assert.IsTrue (exception, "A7"); - AssertEquals ("A8", true, ce.MoveNext ()); + Assert.AreEqual (true, ce.MoveNext (), "A8"); - AssertEquals ("A9", _s, GetFromEnumerator (ce)); + Assert.AreEqual (_s, GetFromEnumerator (ce), "A9"); - AssertEquals ("A10", false, ce.MoveNext ()); - AssertEquals ("A11", false, ce.MoveNext ()); + Assert.AreEqual (false, ce.MoveNext (), "A10"); + Assert.AreEqual (false, ce.MoveNext (), "A11"); } } diff --git a/mcs/class/corlib/Test/System/CharTest.cs b/mcs/class/corlib/Test/System/CharTest.cs index 86ed1560099..6247d105352 100644 --- a/mcs/class/corlib/Test/System/CharTest.cs +++ b/mcs/class/corlib/Test/System/CharTest.cs @@ -1,589 +1,620 @@ -// CharTest.cs - NUnit Test Cases for the System.Char struct -// -// David Brandt (bucky@keystreams.com) -// -// (C) Ximian, Inc. http://www.ximian.com -// Copyright (C) 2005 Novell, Inc (http://www.novell.com) -// - -using NUnit.Framework; -using System; -using System.Globalization; - -namespace MonoTests.System -{ - -public class CharTest : TestCase -{ - public void TestCompareTo() - { - Char c1 = 'a'; - Char c2 = 'b'; - Char c3 = 'b'; - Assert("Less than", c1.CompareTo(c2) == -1); - Assert("Greater than", c2.CompareTo(c1) == 1); - Assert("Equal 1", c2.CompareTo(c3) == 0); - Assert("Equal 2", c1.CompareTo(c1) == 0); - } - - public void TestEquals() - { - Char c1 = 'a'; - Char c2 = 'b'; - Char c3 = 'b'; - Assert("Same", c1.Equals(c1)); - Assert("Same value", c2.Equals(c3)); - Assert("Not same", !c1.Equals(c2)); - } - - public void TestGetHashValue() - { - Char c1 = ' '; - AssertEquals("deterministic hash code ", c1.GetHashCode(), c1.GetHashCode()); - // TODO - the spec doesn't say what algorithm is used to get hash codes. So far, just a weak test for determinism and mostly-uniqueness. - } - - public void TestGetNumericValue() - { - Char c1 = ' '; - Char c2 = '3'; - AssertEquals("code 1", -1.0, Char.GetNumericValue(c1), 0.1); - AssertEquals("code 2", 3.0, Char.GetNumericValue(c2), 0.1); - - string s1 = " 3 "; - AssertEquals("space not number", -1.0, Char.GetNumericValue(s1, 0), 0.1); - AssertEquals("space not number", 3.0, Char.GetNumericValue(s1, 1), 0.1); - AssertEquals("space not number", -1.0, Char.GetNumericValue(s1, 2), 0.1); - } - - public void TestGetUnicodeCategory() - { - { - char Pe1 = ']'; - char Pe2 = '}'; - char Pe3 = ')'; - AssertEquals("Close Punctuation", - UnicodeCategory.ClosePunctuation, - Char.GetUnicodeCategory(Pe1)); - AssertEquals("Close Punctuation", - UnicodeCategory.ClosePunctuation, - Char.GetUnicodeCategory(Pe2)); - AssertEquals("Close Punctuation", - UnicodeCategory.ClosePunctuation, - Char.GetUnicodeCategory(Pe3)); - } - // TODO - ConnectorPunctuation - { - char c1 = (char)0; // 0000-001F, 007F-009F - char c2 = (char)0x001F; - char c3 = (char)0x007F; - char c4 = (char)0x00F; - AssertEquals("Control", - UnicodeCategory.Control, - Char.GetUnicodeCategory(c1)); - AssertEquals("Control", - UnicodeCategory.Control, - Char.GetUnicodeCategory(c2)); - AssertEquals("Control", - UnicodeCategory.Control, - Char.GetUnicodeCategory(c3)); - AssertEquals("Control", - UnicodeCategory.Control, - Char.GetUnicodeCategory(c4)); - } - { - // TODO - more currencies? - char c1 = '$'; - AssertEquals("Currency", - UnicodeCategory.CurrencySymbol, - Char.GetUnicodeCategory(c1)); - } - { - char c1 = '-'; - AssertEquals("Dash Punctuation", - UnicodeCategory.DashPunctuation, - Char.GetUnicodeCategory(c1)); - } - { - char c1 = '2'; - char c2 = '7'; - AssertEquals("Decimal Digit", - UnicodeCategory.DecimalDigitNumber, - Char.GetUnicodeCategory(c1)); - AssertEquals("Decimal Digit", - UnicodeCategory.DecimalDigitNumber, - Char.GetUnicodeCategory(c2)); - } - // TODO - EnclosingMark - // TODO - FinalQuotePunctuation - // TODO - Format - // TODO - InitialQuotePunctuation - // TODO - LetterNumber - // TODO - LineSeparator (not '\n', that's a control char) - { - char c1 = 'a'; - char c2 = 'z'; - AssertEquals("LowercaseLetter", - UnicodeCategory.LowercaseLetter, - Char.GetUnicodeCategory(c1)); - AssertEquals("LowercaseLetter", - UnicodeCategory.LowercaseLetter, - Char.GetUnicodeCategory(c2)); - } - { - char c1 = '+'; - char c2 = '='; - AssertEquals("MathSymbol", - UnicodeCategory.MathSymbol, - Char.GetUnicodeCategory(c1)); - AssertEquals("MathSymbol", - UnicodeCategory.MathSymbol, - Char.GetUnicodeCategory(c2)); - } - // TODO - ModifierSymbol - // TODO - NonSpacingMark - // TODO - OpenPunctuation - { - char c1 = '['; - char c2 = '{'; - char c3 = '('; - AssertEquals("OpenPunctuation", - UnicodeCategory.OpenPunctuation, - Char.GetUnicodeCategory(c1)); - AssertEquals("OpenPunctuation", - UnicodeCategory.OpenPunctuation, - Char.GetUnicodeCategory(c2)); - AssertEquals("OpenPunctuation", - UnicodeCategory.OpenPunctuation, - Char.GetUnicodeCategory(c3)); - } - // TODO - OtherLetter - // TODO - OtherNotAssigned - // TODO - OtherNumber - { - char c1 = '/'; - AssertEquals("OtherPunctuation", - UnicodeCategory.OtherPunctuation, - Char.GetUnicodeCategory(c1)); - } - // TODO - OtherSymbol - // TODO - ParagraphSeparator - // TODO - PrivateUse - { - char c1 = ' '; - AssertEquals("SpaceSeparator", - UnicodeCategory.SpaceSeparator, - Char.GetUnicodeCategory(c1)); - } - // TODO - SpacingCombiningMark - { - char c1 = (char)0xD800; // D800-DBFF - char c2 = (char)0xDBFF; // D800-DBFF - char c3 = (char)0xDC01; // DC00-DEFF - char c4 = (char)0xDEFF; // DC00-DEFF - AssertEquals("High Surrogate", - UnicodeCategory.Surrogate, - Char.GetUnicodeCategory(c1)); - AssertEquals("High Surrogate", - UnicodeCategory.Surrogate, - Char.GetUnicodeCategory(c2)); - AssertEquals("Low Surrogate", - UnicodeCategory.Surrogate, - Char.GetUnicodeCategory(c3)); - AssertEquals("Low Surrogate", - UnicodeCategory.Surrogate, - Char.GetUnicodeCategory(c4)); - } - // TODO - TitlecaseLetter - // TODO - UppercaseLetter - { - char c1 = 'A'; - char c2 = 'Z'; - AssertEquals("UppercaseLetter", - UnicodeCategory.UppercaseLetter, - Char.GetUnicodeCategory(c1)); - AssertEquals("UppercaseLetter", - UnicodeCategory.UppercaseLetter, - Char.GetUnicodeCategory(c2)); - } - } - - public void TestIsControl() - { - // control is 0000-001F, 007F-009F - char c1 = (char)0; - char c2 = (char)0x001F; - char c3 = (char)0x007F; - char c4 = (char)0x009F; - Assert("Not control", !Char.IsControl(' ')); - Assert("control", Char.IsControl(c1)); - Assert("control", Char.IsControl(c2)); - Assert("control", Char.IsControl(c3)); - Assert("control", Char.IsControl(c4)); - - string s1 = " " + c1 + c2 + c3 + c4; - Assert("Not control", !Char.IsControl(s1, 0)); - Assert("control", Char.IsControl(s1, 1)); - Assert("control", Char.IsControl(s1, 2)); - Assert("control", Char.IsControl(s1, 3)); - Assert("control", Char.IsControl(s1, 4)); - } - - public void TestIsDigit() - { - char c1 = '0'; - char c2 = '9'; - Assert("Not digit", !Char.IsDigit(' ')); - Assert("digit", Char.IsDigit(c1)); - Assert("digit", Char.IsDigit(c2)); - - string s1 = " " + c1 + c2; - Assert("Not digit", !Char.IsDigit(s1, 0)); - Assert("digit", Char.IsDigit(s1, 1)); - Assert("digit", Char.IsDigit(s1, 2)); - } - - public void TestIsLetter() - { - char c1 = 'a'; - char c2 = 'z'; - char c3 = 'A'; - char c4 = 'Z'; - Assert("Not letter", !Char.IsLetter(' ')); - Assert("letter", Char.IsLetter(c1)); - Assert("letter", Char.IsLetter(c2)); - Assert("letter", Char.IsLetter(c3)); - Assert("letter", Char.IsLetter(c4)); - - string s1 = " " + c1 + c2 + c3 + c4; - Assert("Not letter", !Char.IsLetter(s1, 0)); - Assert("letter", Char.IsLetter(s1, 1)); - Assert("letter", Char.IsLetter(s1, 2)); - Assert("letter", Char.IsLetter(s1, 3)); - Assert("letter", Char.IsLetter(s1, 4)); - } - - public void TestIsLetterOrDigit() - { - char c1 = 'a'; - char c2 = 'z'; - char c3 = 'A'; - char c4 = 'Z'; - char c5 = '0'; - char c6 = '9'; - Assert("Not letterordigit", !Char.IsLetterOrDigit(' ')); - Assert("letterordigit", Char.IsLetterOrDigit(c1)); - Assert("letterordigit", Char.IsLetterOrDigit(c2)); - Assert("letterordigit", Char.IsLetterOrDigit(c3)); - Assert("letterordigit", Char.IsLetterOrDigit(c4)); - Assert("letterordigit", Char.IsLetterOrDigit(c5)); - Assert("letterordigit", Char.IsLetterOrDigit(c6)); - - string s1 = " " + c1 + c2 + c3 + c4 + c5 + c6; - Assert("Not letterordigit", !Char.IsLetterOrDigit(s1, 0)); - Assert("letterordigit", Char.IsLetterOrDigit(s1, 1)); - Assert("letterordigit", Char.IsLetterOrDigit(s1, 2)); - Assert("letterordigit", Char.IsLetterOrDigit(s1, 3)); - Assert("letterordigit", Char.IsLetterOrDigit(s1, 4)); - Assert("letterordigit", Char.IsLetterOrDigit(s1, 5)); - Assert("letterordigit", Char.IsLetterOrDigit(s1, 6)); - } - - public void TestIsLower() - { - char c1 = 'a'; - char c2 = 'z'; - Assert("Not lower", !Char.IsLower(' ')); - Assert("lower", Char.IsLower(c1)); - Assert("lower", Char.IsLower(c2)); - - string s1 = " " + c1 + c2; - Assert("Not lower", !Char.IsLower(s1, 0)); - Assert("lower", Char.IsLower(s1, 1)); - Assert("lower", Char.IsLower(s1, 2)); - } - - public void TestIsNumber() - { - char c1 = '0'; - char c2 = '9'; - // TODO - IsNumber of less obvious characters - - Assert("Not number", !Char.IsNumber(' ')); - Assert("number", Char.IsNumber(c1)); - Assert("number", Char.IsNumber(c2)); - - string s1 = " " + c1 + c2; - Assert("Not number", !Char.IsNumber(s1, 0)); - Assert("number", Char.IsNumber(s1, 1)); - Assert("number", Char.IsNumber(s1, 2)); - } - - public void TestIsPunctuation() - { - char c1 = '.'; - char c2 = '?'; - Assert("Not punctuation", !Char.IsPunctuation(' ')); - Assert("punctuation", Char.IsPunctuation(c1)); - Assert("punctuation", Char.IsPunctuation(c2)); - - string s1 = " " + c1 + c2; - Assert("Not punctuation", !Char.IsPunctuation(s1, 0)); - Assert("punctuation", Char.IsPunctuation(s1, 1)); - Assert("punctuation", Char.IsPunctuation(s1, 2)); - } - - public void TestIsSeparator() - { - char c1 = ' '; - - Assert("Not separator", !Char.IsSeparator('.')); - Assert("separator1", Char.IsSeparator(c1)); - - string s1 = "." + c1; - Assert("Not separator", !Char.IsSeparator(s1, 0)); - Assert("separator1-2", Char.IsSeparator(s1, 1)); - } - - public void TestIsSurrogate() - { - // high surrogate - D800-DBFF - // low surrogate - DC00-DEFF - char c1 = (char)0xD800; - char c2 = (char)0xDBFF; - char c3 = (char)0xDC00; - char c4 = (char)0xDEFF; - Assert("Not surrogate", !Char.IsSurrogate(' ')); - Assert("surrogate1", Char.IsSurrogate(c1)); - Assert("surrogate2", Char.IsSurrogate(c2)); - Assert("surrogate3", Char.IsSurrogate(c3)); - Assert("surrogate4", Char.IsSurrogate(c4)); - - string s1 = " " + c1 + c2 + c3 + c4; - Assert("Not surrogate", !Char.IsSurrogate(s1, 0)); - Assert("surrogate1-2", Char.IsSurrogate(s1, 1)); - Assert("surrogate2-2", Char.IsSurrogate(s1, 2)); - Assert("surrogate3-2", Char.IsSurrogate(s1, 3)); - Assert("surrogate4-2", Char.IsSurrogate(s1, 4)); - } - - public void TestIsSymbol() - { - char c1 = '+'; - char c2 = '='; - Assert("Not symbol", !Char.IsSymbol(' ')); - Assert("symbol", Char.IsSymbol(c1)); - Assert("symbol", Char.IsSymbol(c2)); - - string s1 = " " + c1 + c2; - Assert("Not symbol", !Char.IsSymbol(s1, 0)); - Assert("symbol", Char.IsSymbol(s1, 1)); - Assert("symbol", Char.IsSymbol(s1, 2)); - } - - public void TestIsUpper() - { - char c1 = 'A'; - char c2 = 'Z'; - Assert("Not upper", !Char.IsUpper('a')); - Assert("upper", Char.IsUpper(c1)); - Assert("upper", Char.IsUpper(c2)); - - string s1 = "a" + c1 + c2; - Assert("Not upper", !Char.IsUpper(s1, 0)); - Assert("upper", Char.IsUpper(s1, 1)); - Assert("upper", Char.IsUpper(s1, 2)); - } - - public void TestIsWhiteSpace() - { - char c1 = ' '; - char c2 = '\n'; - char c3 = '\t'; - - Assert("Not whitespace", !Char.IsWhiteSpace('.')); - Assert("whitespace1", Char.IsWhiteSpace(c1)); - Assert("whitespace2", Char.IsWhiteSpace(c2)); - Assert("whitespace3", Char.IsWhiteSpace(c3)); - - string s1 = "." + c1 + c2 + c3; - Assert("Not whitespace", !Char.IsWhiteSpace(s1, 0)); - Assert("whitespace1-2", Char.IsWhiteSpace(s1, 1)); - Assert("whitespace2-2", Char.IsWhiteSpace(s1, 2)); - Assert("whitespace3-2", Char.IsWhiteSpace(s1, 3)); - } - - [Test] - public void IsWhiteSpace_Complete () - { - for (int i=0; i < UInt16.MaxValue; i++) { - Char c = Convert.ToChar (i); - switch (i) { - case 0x0009: - case 0x000A: - case 0x000B: - case 0x000C: - case 0x000D: - case 0x0020: - case 0x0085: - case 0x00A0: - case 0x1680: - case 0x2000: - case 0x2001: - case 0x2002: - case 0x2003: - case 0x2004: - case 0x2005: - case 0x2006: - case 0x2007: - case 0x2008: - case 0x2009: - case 0x200A: - case 0x200B: - case 0x2028: - case 0x2029: - case 0x202F: -#if NET_2_0 - case 0x205F: -#endif - case 0x3000: - Assert (i.ToString (), Char.IsWhiteSpace (c)); - break; - default: - Assert (i.ToString (), !Char.IsWhiteSpace (c)); - break; - } - } - } - - public void TestParse() - { - char c1 = 'a'; - string s1 = "a"; - Assert(c1.Equals(Char.Parse(s1))); - } - -#if NET_2_0 - public void TestTryParseValid () - { - char c1 = 'a'; - string s1 = "a"; - char c2; - - AssertEquals ("TryParse1", true, Char.TryParse (s1, out c2)); - AssertEquals ("TryParse2", c2, c1); - } - - public void TestTryParseInvalid () - { - string s = "abc"; - char c; - AssertEquals ("TryParse3", false, Char.TryParse (s, out c)); - AssertEquals ("TryParse4", '\0', c); - } -#endif - - public void TestToLower() - { - char a1 = 'a'; - char a2 = 'A'; - char a3 = 'z'; - char a4 = 'Z'; - char a5 = ' '; - char a6 = '+'; - char b1 = 'a'; - char b2 = 'a'; - char b3 = 'z'; - char b4 = 'z'; - char b5 = ' '; - char b6 = '+'; - AssertEquals("char lowered", b1, Char.ToLower(a1)); - AssertEquals("char lowered", b2, Char.ToLower(a2)); - AssertEquals("char lowered", b3, Char.ToLower(a3)); - AssertEquals("char lowered", b4, Char.ToLower(a4)); - AssertEquals("char lowered", b5, Char.ToLower(a5)); - AssertEquals("char lowered", b6, Char.ToLower(a6)); - } - - public void TestToUpper() - { - char a1 = 'a'; - char a2 = 'A'; - char a3 = 'z'; - char a4 = 'Z'; - char a5 = ' '; - char a6 = '+'; - char b1 = 'A'; - char b2 = 'A'; - char b3 = 'Z'; - char b4 = 'Z'; - char b5 = ' '; - char b6 = '+'; - AssertEquals("char uppered", b1, Char.ToUpper(a1)); - AssertEquals("char uppered", b2, Char.ToUpper(a2)); - AssertEquals("char uppered", b3, Char.ToUpper(a3)); - AssertEquals("char uppered", b4, Char.ToUpper(a4)); - AssertEquals("char uppered", b5, Char.ToUpper(a5)); - AssertEquals("char uppered", b6, Char.ToUpper(a6)); - } - - - public void TestToString() - { - char c1 = 'a'; - string s1 = "a"; - Assert(s1.Equals(c1.ToString())); - } - - public void TestGetTypeCode() - { - char c1 = 'a'; - Assert(c1.GetTypeCode().Equals(TypeCode.Char)); - } - -#if NET_2_0 - public void TestConvertFromUtf32 () - { - AssertEquals ("#1", "A", Char.ConvertFromUtf32 (0x41)); - AssertEquals ("#2", "\uD800\uDC00", Char.ConvertFromUtf32 (0x10000)); - } - - [ExpectedException (typeof (ArgumentOutOfRangeException))] - public void TestConvertFromUtf32Fail1 () - { - Char.ConvertFromUtf32 (-1); - } - - [ExpectedException (typeof (ArgumentOutOfRangeException))] - public void TestConvertFromUtf32Fail2 () - { - Char.ConvertFromUtf32 (0x110001); - } - - [ExpectedException (typeof (ArgumentOutOfRangeException))] - public void TestConvertFromUtf32Fail3 () - { - Char.ConvertFromUtf32 (0xD800); - } - - public void TestConvertToUtf32 () - { - AssertEquals ("#1", 0x10000, Char.ConvertToUtf32 ('\uD800', '\uDC00')); - AssertEquals ("#2", 0x10FFFF, Char.ConvertToUtf32 ('\uDBFF', '\uDFFF')); - } - - [ExpectedException (typeof (ArgumentOutOfRangeException))] - public void TestConvertToUtf32Fail1 () - { - Char.ConvertToUtf32 ('A', '\uDC00'); - } - - [ExpectedException (typeof (ArgumentOutOfRangeException))] - public void TestConvertUtf32Fail2 () - { - Char.ConvertToUtf32 ('\uD800', '\uD800'); - } -#endif -} - -} +// CharTest.cs - NUnit Test Cases for the System.Char struct +// +// David Brandt (bucky@keystreams.com) +// +// (C) Ximian, Inc. http://www.ximian.com +// Copyright (C) 2005 Novell, Inc (http://www.novell.com) +// + +using NUnit.Framework; +using System; +using System.Globalization; + +namespace MonoTests.System +{ + +public class CharTest +{ + [Test] + public void TestCompareTo() + { + Char c1 = 'a'; + Char c2 = 'b'; + Char c3 = 'b'; + Assert.IsTrue(c1.CompareTo(c2) == -1, "Less than"); + Assert.IsTrue(c2.CompareTo(c1) == 1, "Greater than"); + Assert.IsTrue(c2.CompareTo(c3) == 0, "Equal 1"); + Assert.IsTrue(c1.CompareTo(c1) == 0, "Equal 2"); + } + + [Test] + public void TestEquals() + { + Char c1 = 'a'; + Char c2 = 'b'; + Char c3 = 'b'; + Assert.IsTrue(c1.Equals(c1), "Same"); + Assert.IsTrue(c2.Equals(c3), "Same value"); + Assert.IsTrue(!c1.Equals(c2), "Not same"); + } + + [Test] + public void TestGetHashValue() + { + Char c1 = ' '; + Assert.AreEqual(c1.GetHashCode(), c1.GetHashCode(), "deterministic hash code "); + // TODO - the spec doesn't say what algorithm is used to get hash codes. So far, just a weak test for determinism and mostly-uniqueness. + } + + [Test] + public void TestGetNumericValue() + { + Char c1 = ' '; + Char c2 = '3'; + Assert.AreEqual(-1.0, Char.GetNumericValue(c1), 0.1, "code 1"); + Assert.AreEqual(3.0, Char.GetNumericValue(c2), 0.1, "code 2"); + + string s1 = " 3 "; + Assert.AreEqual(-1.0, Char.GetNumericValue(s1, 0), 0.1, "space not number"); + Assert.AreEqual(3.0, Char.GetNumericValue(s1, 1), 0.1, "space not number"); + Assert.AreEqual(-1.0, Char.GetNumericValue(s1, 2), 0.1, "space not number"); + } + + [Test] + public void TestGetUnicodeCategory() + { + { + char Pe1 = ']'; + char Pe2 = '}'; + char Pe3 = ')'; + Assert.AreEqual(UnicodeCategory.ClosePunctuation, + Char.GetUnicodeCategory(Pe1), + "Close Punctuation"); + Assert.AreEqual(UnicodeCategory.ClosePunctuation, + Char.GetUnicodeCategory(Pe2), + "Close Punctuation"); + Assert.AreEqual(UnicodeCategory.ClosePunctuation, + Char.GetUnicodeCategory(Pe3), + "Close Punctuation"); + } + // TODO - ConnectorPunctuation + { + char c1 = (char)0; // 0000-001F, 007F-009F + char c2 = (char)0x001F; + char c3 = (char)0x007F; + char c4 = (char)0x00F; + Assert.AreEqual(UnicodeCategory.Control, + Char.GetUnicodeCategory(c1), + "Control"); + Assert.AreEqual(UnicodeCategory.Control, + Char.GetUnicodeCategory(c2), + "Control"); + Assert.AreEqual(UnicodeCategory.Control, + Char.GetUnicodeCategory(c3), + "Control"); + Assert.AreEqual(UnicodeCategory.Control, + Char.GetUnicodeCategory(c4), + "Control"); + } + { + // TODO - more currencies? + char c1 = '$'; + Assert.AreEqual( + UnicodeCategory.CurrencySymbol, + Char.GetUnicodeCategory(c1), + "Currency"); + } + { + char c1 = '-'; + Assert.AreEqual(UnicodeCategory.DashPunctuation, + Char.GetUnicodeCategory(c1), + "Dash Punctuation"); + } + { + char c1 = '2'; + char c2 = '7'; + Assert.AreEqual(UnicodeCategory.DecimalDigitNumber, + Char.GetUnicodeCategory(c1), + "Decimal Digit"); + Assert.AreEqual(UnicodeCategory.DecimalDigitNumber, + Char.GetUnicodeCategory(c2), + "Decimal Digit"); + } + // TODO - EnclosingMark + // TODO - FinalQuotePunctuation + // TODO - Format + // TODO - InitialQuotePunctuation + // TODO - LetterNumber + // TODO - LineSeparator (not '\n', that's a control char) + { + char c1 = 'a'; + char c2 = 'z'; + Assert.AreEqual(UnicodeCategory.LowercaseLetter, + Char.GetUnicodeCategory(c1), + "LowercaseLetter"); + Assert.AreEqual(UnicodeCategory.LowercaseLetter, + Char.GetUnicodeCategory(c2), + "LowercaseLetter"); + } + { + char c1 = '+'; + char c2 = '='; + Assert.AreEqual(UnicodeCategory.MathSymbol, + Char.GetUnicodeCategory(c1), + "MathSymbol"); + Assert.AreEqual(UnicodeCategory.MathSymbol, + Char.GetUnicodeCategory(c2), + "MathSymbol"); + } + // TODO - ModifierSymbol + // TODO - NonSpacingMark + // TODO - OpenPunctuation + { + char c1 = '['; + char c2 = '{'; + char c3 = '('; + Assert.AreEqual(UnicodeCategory.OpenPunctuation, + Char.GetUnicodeCategory(c1), + "OpenPunctuation"); + Assert.AreEqual(UnicodeCategory.OpenPunctuation, + Char.GetUnicodeCategory(c2), + "OpenPunctuation"); + Assert.AreEqual(UnicodeCategory.OpenPunctuation, + Char.GetUnicodeCategory(c3), + "OpenPunctuation"); + } + // TODO - OtherLetter + // TODO - OtherNotAssigned + // TODO - OtherNumber + { + char c1 = '/'; + Assert.AreEqual(UnicodeCategory.OtherPunctuation, + Char.GetUnicodeCategory(c1), + "OtherPunctuation"); + } + // TODO - OtherSymbol + // TODO - ParagraphSeparator + // TODO - PrivateUse + { + char c1 = ' '; + Assert.AreEqual(UnicodeCategory.SpaceSeparator, + Char.GetUnicodeCategory(c1), + "SpaceSeparator"); + } + // TODO - SpacingCombiningMark + { + char c1 = (char)0xD800; // D800-DBFF + char c2 = (char)0xDBFF; // D800-DBFF + char c3 = (char)0xDC01; // DC00-DEFF + char c4 = (char)0xDEFF; // DC00-DEFF + Assert.AreEqual(UnicodeCategory.Surrogate, + Char.GetUnicodeCategory(c1), + "High Surrogate"); + Assert.AreEqual(UnicodeCategory.Surrogate, + Char.GetUnicodeCategory(c2), + "High Surrogate"); + Assert.AreEqual(UnicodeCategory.Surrogate, + Char.GetUnicodeCategory(c3), + "Low Surrogate"); + Assert.AreEqual(UnicodeCategory.Surrogate, + Char.GetUnicodeCategory(c4), + "Low Surrogate"); + } + // TODO - TitlecaseLetter + // TODO - UppercaseLetter + { + char c1 = 'A'; + char c2 = 'Z'; + Assert.AreEqual(UnicodeCategory.UppercaseLetter, + Char.GetUnicodeCategory(c1), + "UppercaseLetter"); + Assert.AreEqual(UnicodeCategory.UppercaseLetter, + Char.GetUnicodeCategory(c2), + "UppercaseLetter"); + } + } + + [Test] + public void TestIsControl() + { + // control is 0000-001F, 007F-009F + char c1 = (char)0; + char c2 = (char)0x001F; + char c3 = (char)0x007F; + char c4 = (char)0x009F; + Assert.IsTrue(!Char.IsControl(' '), "Not control"); + Assert.IsTrue(Char.IsControl(c1), "control"); + Assert.IsTrue(Char.IsControl(c2), "control"); + Assert.IsTrue(Char.IsControl(c3), "control"); + Assert.IsTrue(Char.IsControl(c4), "control"); + + string s1 = " " + c1 + c2 + c3 + c4; + Assert.IsTrue(!Char.IsControl(s1, 0), "Not control"); + Assert.IsTrue(Char.IsControl(s1, 1), "control"); + Assert.IsTrue(Char.IsControl(s1, 2), "control"); + Assert.IsTrue(Char.IsControl(s1, 3), "control"); + Assert.IsTrue(Char.IsControl(s1, 4), "control"); + } + + [Test] + public void TestIsDigit() + { + char c1 = '0'; + char c2 = '9'; + Assert.IsTrue(!Char.IsDigit(' '), "Not digit"); + Assert.IsTrue(Char.IsDigit(c1), "digit"); + Assert.IsTrue(Char.IsDigit(c2), "digit"); + + string s1 = " " + c1 + c2; + Assert.IsTrue(!Char.IsDigit(s1, 0), "Not digit"); + Assert.IsTrue(Char.IsDigit(s1, 1), "digit"); + Assert.IsTrue(Char.IsDigit(s1, 2), "digit"); + } + + [Test] + public void TestIsLetter() + { + char c1 = 'a'; + char c2 = 'z'; + char c3 = 'A'; + char c4 = 'Z'; + Assert.IsTrue(!Char.IsLetter(' '), "Not letter"); + Assert.IsTrue(Char.IsLetter(c1), "letter"); + Assert.IsTrue(Char.IsLetter(c2), "letter"); + Assert.IsTrue(Char.IsLetter(c3), "letter"); + Assert.IsTrue(Char.IsLetter(c4), "letter"); + + string s1 = " " + c1 + c2 + c3 + c4; + Assert.IsTrue(!Char.IsLetter(s1, 0), "Not letter"); + Assert.IsTrue(Char.IsLetter(s1, 1), "letter"); + Assert.IsTrue(Char.IsLetter(s1, 2), "letter"); + Assert.IsTrue(Char.IsLetter(s1, 3), "letter"); + Assert.IsTrue(Char.IsLetter(s1, 4), "letter"); + } + + [Test] + public void TestIsLetterOrDigit() + { + char c1 = 'a'; + char c2 = 'z'; + char c3 = 'A'; + char c4 = 'Z'; + char c5 = '0'; + char c6 = '9'; + Assert.IsTrue(!Char.IsLetterOrDigit(' '), "Not letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(c1), "letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(c2), "letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(c3), "letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(c4), "letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(c5), "letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(c6), "letterordigit"); + + string s1 = " " + c1 + c2 + c3 + c4 + c5 + c6; + Assert.IsTrue(!Char.IsLetterOrDigit(s1, 0), "Not letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(s1, 1), "letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(s1, 2), "letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(s1, 3), "letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(s1, 4), "letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(s1, 5), "letterordigit"); + Assert.IsTrue(Char.IsLetterOrDigit(s1, 6), "letterordigit"); + } + + [Test] + public void TestIsLower() + { + char c1 = 'a'; + char c2 = 'z'; + Assert.IsTrue(!Char.IsLower(' '), "Not lower"); + Assert.IsTrue(Char.IsLower(c1), "lower"); + Assert.IsTrue(Char.IsLower(c2), "lower"); + + string s1 = " " + c1 + c2; + Assert.IsTrue(!Char.IsLower(s1, 0), "Not lower"); + Assert.IsTrue(Char.IsLower(s1, 1), "lower"); + Assert.IsTrue(Char.IsLower(s1, 2), "lower"); + } + + [Test] + public void TestIsNumber() + { + char c1 = '0'; + char c2 = '9'; + // TODO - IsNumber of less obvious characters + + Assert.IsTrue(!Char.IsNumber(' '), "Not number"); + Assert.IsTrue(Char.IsNumber(c1), "number"); + Assert.IsTrue(Char.IsNumber(c2), "number"); + + string s1 = " " + c1 + c2; + Assert.IsTrue(!Char.IsNumber(s1, 0), "Not number"); + Assert.IsTrue(Char.IsNumber(s1, 1), "number"); + Assert.IsTrue(Char.IsNumber(s1, 2), "number"); + } + + [Test] + public void TestIsPunctuation() + { + char c1 = '.'; + char c2 = '?'; + Assert.IsTrue(!Char.IsPunctuation(' '), "Not punctuation"); + Assert.IsTrue(Char.IsPunctuation(c1), "punctuation"); + Assert.IsTrue(Char.IsPunctuation(c2), "punctuation"); + + string s1 = " " + c1 + c2; + Assert.IsTrue(!Char.IsPunctuation(s1, 0), "Not punctuation"); + Assert.IsTrue(Char.IsPunctuation(s1, 1), "punctuation"); + Assert.IsTrue(Char.IsPunctuation(s1, 2), "punctuation"); + } + + [Test] + public void TestIsSeparator() + { + char c1 = ' '; + + Assert.IsTrue(!Char.IsSeparator('.'), "Not separator"); + Assert.IsTrue(Char.IsSeparator(c1), "separator1"); + + string s1 = "." + c1; + Assert.IsTrue(!Char.IsSeparator(s1, 0), "Not separator"); + Assert.IsTrue(Char.IsSeparator(s1, 1), "separator1-2"); + } + + [Test] + public void TestIsSurrogate() + { + // high surrogate - D800-DBFF + // low surrogate - DC00-DEFF + char c1 = (char)0xD800; + char c2 = (char)0xDBFF; + char c3 = (char)0xDC00; + char c4 = (char)0xDEFF; + Assert.IsTrue(!Char.IsSurrogate(' '), "Not surrogate"); + Assert.IsTrue(Char.IsSurrogate(c1), "surrogate1"); + Assert.IsTrue(Char.IsSurrogate(c2), "surrogate2"); + Assert.IsTrue(Char.IsSurrogate(c3), "surrogate3"); + Assert.IsTrue(Char.IsSurrogate(c4), "surrogate4"); + + string s1 = " " + c1 + c2 + c3 + c4; + Assert.IsTrue(!Char.IsSurrogate(s1, 0), "Not surrogate"); + Assert.IsTrue(Char.IsSurrogate(s1, 1), "surrogate1-2"); + Assert.IsTrue(Char.IsSurrogate(s1, 2), "surrogate2-2"); + Assert.IsTrue(Char.IsSurrogate(s1, 3), "surrogate3-2"); + Assert.IsTrue(Char.IsSurrogate(s1, 4), "surrogate4-2"); + } + + [Test] + public void TestIsSymbol() + { + char c1 = '+'; + char c2 = '='; + Assert.IsTrue(!Char.IsSymbol(' '), "Not symbol"); + Assert.IsTrue(Char.IsSymbol(c1), "symbol"); + Assert.IsTrue(Char.IsSymbol(c2), "symbol"); + + string s1 = " " + c1 + c2; + Assert.IsTrue(!Char.IsSymbol(s1, 0), "Not symbol"); + Assert.IsTrue(Char.IsSymbol(s1, 1), "symbol"); + Assert.IsTrue(Char.IsSymbol(s1, 2), "symbol"); + } + + [Test] + public void TestIsUpper() + { + char c1 = 'A'; + char c2 = 'Z'; + Assert.IsTrue(!Char.IsUpper('a'), "Not upper"); + Assert.IsTrue(Char.IsUpper(c1), "upper"); + Assert.IsTrue(Char.IsUpper(c2), "upper"); + + string s1 = "a" + c1 + c2; + Assert.IsTrue(!Char.IsUpper(s1, 0), "Not upper"); + Assert.IsTrue(Char.IsUpper(s1, 1), "upper"); + Assert.IsTrue(Char.IsUpper(s1, 2), "upper"); + } + + [Test] + public void TestIsWhiteSpace() + { + char c1 = ' '; + char c2 = '\n'; + char c3 = '\t'; + + Assert.IsTrue(!Char.IsWhiteSpace('.'), "Not whitespace"); + Assert.IsTrue(Char.IsWhiteSpace(c1), "whitespace1"); + Assert.IsTrue(Char.IsWhiteSpace(c2), "whitespace2"); + Assert.IsTrue(Char.IsWhiteSpace(c3), "whitespace3"); + + string s1 = "." + c1 + c2 + c3; + Assert.IsTrue(!Char.IsWhiteSpace(s1, 0), "Not whitespace"); + Assert.IsTrue(Char.IsWhiteSpace(s1, 1), "whitespace1-2"); + Assert.IsTrue(Char.IsWhiteSpace(s1, 2), "whitespace2-2"); + Assert.IsTrue(Char.IsWhiteSpace(s1, 3), "whitespace3-2"); + } + + [Test] + public void IsWhiteSpace_Complete () + { + for (int i=0; i < UInt16.MaxValue; i++) { + Char c = Convert.ToChar (i); + switch (i) { + case 0x0009: + case 0x000A: + case 0x000B: + case 0x000C: + case 0x000D: + case 0x0020: + case 0x0085: + case 0x00A0: + case 0x1680: + case 0x2000: + case 0x2001: + case 0x2002: + case 0x2003: + case 0x2004: + case 0x2005: + case 0x2006: + case 0x2007: + case 0x2008: + case 0x2009: + case 0x200A: + case 0x200B: + case 0x2028: + case 0x2029: + case 0x202F: +#if NET_2_0 + case 0x205F: +#endif + case 0x3000: + Assert.IsTrue (Char.IsWhiteSpace (c), i.ToString ()); + break; + default: + Assert.IsTrue (!Char.IsWhiteSpace (c), i.ToString ()); + break; + } + } + } + + [Test] + public void TestParse() + { + char c1 = 'a'; + string s1 = "a"; + Assert.IsTrue(c1.Equals(Char.Parse(s1))); + } + +#if NET_2_0 + [Test] + public void TestTryParseValid () + { + char c1 = 'a'; + string s1 = "a"; + char c2; + + Assert.AreEqual (true, Char.TryParse (s1, out c2), "TryParse1"); + Assert.AreEqual (c2, c1, "TryParse2"); + } + + [Test] + public void TestTryParseInvalid () + { + string s = "abc"; + char c; + Assert.AreEqual (false, Char.TryParse (s, out c), "TryParse3"); + Assert.AreEqual ('\0', c, "TryParse4"); + } +#endif + + [Test] + public void TestToLower() + { + char a1 = 'a'; + char a2 = 'A'; + char a3 = 'z'; + char a4 = 'Z'; + char a5 = ' '; + char a6 = '+'; + char b1 = 'a'; + char b2 = 'a'; + char b3 = 'z'; + char b4 = 'z'; + char b5 = ' '; + char b6 = '+'; + Assert.AreEqual(b1, Char.ToLower(a1), "char lowered"); + Assert.AreEqual(b2, Char.ToLower(a2), "char lowered"); + Assert.AreEqual(b3, Char.ToLower(a3), "char lowered"); + Assert.AreEqual(b4, Char.ToLower(a4), "char lowered"); + Assert.AreEqual(b5, Char.ToLower(a5), "char lowered"); + Assert.AreEqual(b6, Char.ToLower(a6), "char lowered"); + } + + [Test] + public void TestToUpper() + { + char a1 = 'a'; + char a2 = 'A'; + char a3 = 'z'; + char a4 = 'Z'; + char a5 = ' '; + char a6 = '+'; + char b1 = 'A'; + char b2 = 'A'; + char b3 = 'Z'; + char b4 = 'Z'; + char b5 = ' '; + char b6 = '+'; + Assert.AreEqual(b1, Char.ToUpper(a1), "char uppered"); + Assert.AreEqual(b2, Char.ToUpper(a2), "char uppered"); + Assert.AreEqual(b3, Char.ToUpper(a3), "char uppered"); + Assert.AreEqual(b4, Char.ToUpper(a4), "char uppered"); + Assert.AreEqual(b5, Char.ToUpper(a5), "char uppered"); + Assert.AreEqual(b6, Char.ToUpper(a6), "char uppered"); + } + + [Test] + public void TestToString() + { + char c1 = 'a'; + string s1 = "a"; + Assert.IsTrue(s1.Equals(c1.ToString())); + } + + [Test] + public void TestGetTypeCode() + { + char c1 = 'a'; + Assert.IsTrue(c1.GetTypeCode().Equals(TypeCode.Char)); + } + +#if NET_2_0 + [Test] + public void TestConvertFromUtf32 () + { + Assert.AreEqual ("A", Char.ConvertFromUtf32 (0x41), "#1"); + Assert.AreEqual ("\uD800\uDC00", Char.ConvertFromUtf32 (0x10000), "#2"); + } + + [Test] + [ExpectedException (typeof (ArgumentOutOfRangeException))] + public void TestConvertFromUtf32Fail1 () + { + Char.ConvertFromUtf32 (-1); + } + + [Test] + [ExpectedException (typeof (ArgumentOutOfRangeException))] + public void TestConvertFromUtf32Fail2 () + { + Char.ConvertFromUtf32 (0x110001); + } + + [Test] + [ExpectedException (typeof (ArgumentOutOfRangeException))] + public void TestConvertFromUtf32Fail3 () + { + Char.ConvertFromUtf32 (0xD800); + } + + [Test] + public void TestConvertToUtf32 () + { + Assert.AreEqual (0x10000, Char.ConvertToUtf32 ('\uD800', '\uDC00'), "#1"); + Assert.AreEqual (0x10FFFF, Char.ConvertToUtf32 ('\uDBFF', '\uDFFF'), "#2"); + } + + [Test] + [ExpectedException (typeof (ArgumentOutOfRangeException))] + public void TestConvertToUtf32Fail1 () + { + Char.ConvertToUtf32 ('A', '\uDC00'); + } + + [Test] + [ExpectedException (typeof (ArgumentOutOfRangeException))] + public void TestConvertUtf32Fail2 () + { + Char.ConvertToUtf32 ('\uD800', '\uD800'); + } +#endif +} + +} diff --git a/mcs/class/corlib/Test/System/ConvertTest.cs b/mcs/class/corlib/Test/System/ConvertTest.cs index fa50adf21b6..9fad132fe39 100644 --- a/mcs/class/corlib/Test/System/ConvertTest.cs +++ b/mcs/class/corlib/Test/System/ConvertTest.cs @@ -13,7 +13,7 @@ using System.Globalization; namespace MonoTests.System { [TestFixture] - public class ConvertTest : Assertion { + public class ConvertTest { bool boolTrue; bool boolFalse; @@ -67,137 +67,137 @@ namespace MonoTests.System { public void TestChangeType() { int iTest = 1; try { - AssertEquals("#A01", (short)12345, Convert.ChangeType(tryInt32, typeof(short))); + Assert.AreEqual ((short)12345, Convert.ChangeType(tryInt32, typeof(short)), "#A01"); iTest++; - AssertEquals("#A02", 'A', Convert.ChangeType(65, typeof(char))); + Assert.AreEqual ('A', Convert.ChangeType(65, typeof(char)), "#A02"); iTest++; - AssertEquals("#A03", 66, Convert.ChangeType('B', typeof(int))); + Assert.AreEqual (66, Convert.ChangeType('B', typeof(int)), "#A03"); iTest++; - AssertEquals("#A04", ((ulong)12345), Convert.ChangeType(tryInt32, typeof(ulong))); + Assert.AreEqual (((ulong)12345), Convert.ChangeType(tryInt32, typeof(ulong)), "#A04"); iTest++; - AssertEquals("#A05", true, Convert.ChangeType(tryDec, TypeCode.Boolean)); + Assert.AreEqual (true, Convert.ChangeType(tryDec, TypeCode.Boolean), "#A05"); iTest++; - AssertEquals("#A06", 'f', Convert.ChangeType("f", TypeCode.Char)); + Assert.AreEqual ('f', Convert.ChangeType("f", TypeCode.Char), "#A06"); iTest++; - AssertEquals("#A07", (decimal)123456789012, Convert.ChangeType(tryInt64, TypeCode.Decimal)); + Assert.AreEqual ((decimal)123456789012, Convert.ChangeType(tryInt64, TypeCode.Decimal), "#A07"); iTest++; - AssertEquals("#A08", (int)34567, Convert.ChangeType(tryUI16, TypeCode.Int32)); + Assert.AreEqual ((int)34567, Convert.ChangeType(tryUI16, TypeCode.Int32), "#A08"); iTest++; - AssertEquals("#A09", (double)567891234, Convert.ChangeType(tryUI32, typeof(double), ci)); + Assert.AreEqual ((double)567891234, Convert.ChangeType(tryUI32, typeof(double), ci), "#A09"); iTest++; - AssertEquals("#A10", (ushort)0, Convert.ChangeType(tryByte, typeof(ushort), ci)); + Assert.AreEqual ((ushort)0, Convert.ChangeType(tryByte, typeof(ushort), ci), "#A10"); iTest++; - AssertEquals("#A11", (decimal)567891234, Convert.ChangeType(tryUI32, typeof(decimal), ci)); + Assert.AreEqual ((decimal)567891234, Convert.ChangeType(tryUI32, typeof(decimal), ci), "#A11"); iTest++; - AssertEquals("#A12", (float)1234, Convert.ChangeType(tryInt16, typeof(float), ci)); + Assert.AreEqual ((float)1234, Convert.ChangeType(tryInt16, typeof(float), ci), "#A12"); iTest++; - AssertEquals("#A13", null, Convert.ChangeType(null, null, ci)); + Assert.AreEqual (null, Convert.ChangeType(null, null, ci), "#A13"); iTest++; - AssertEquals("#A14", (decimal)0, Convert.ChangeType(tryByte, TypeCode.Decimal, ci)); + Assert.AreEqual ((decimal)0, Convert.ChangeType(tryByte, TypeCode.Decimal, ci), "#A14"); iTest++; - AssertEquals("#A15", "f", Convert.ChangeType('f', TypeCode.String, ci)); + Assert.AreEqual ("f", Convert.ChangeType('f', TypeCode.String, ci), "#A15"); iTest++; - AssertEquals("#A16", 'D', Convert.ChangeType(68, TypeCode.Char, ci)); + Assert.AreEqual ('D', Convert.ChangeType(68, TypeCode.Char, ci), "#A16"); iTest++; - AssertEquals("#A17", (long)34567, Convert.ChangeType(tryUI16, TypeCode.Int64, ci)); + Assert.AreEqual ((long)34567, Convert.ChangeType(tryUI16, TypeCode.Int64, ci), "#A17"); iTest++; - AssertEquals("#A18", null, Convert.ChangeType(null, TypeCode.Empty, ci)); + Assert.AreEqual (null, Convert.ChangeType(null, TypeCode.Empty, ci), "#A18"); } catch (Exception e) { - Fail ("Unexpected exception at iTest = " + iTest + ": e = " + e); + Assert.Fail ("Unexpected exception at iTest = " + iTest + ": e = " + e); } try { Convert.ChangeType(boolTrue, typeof(char)); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#A25", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#A25"); } try { Convert.ChangeType(tryChar, typeof(DateTime)); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#A26", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#A26"); } try { Convert.ChangeType(ci, TypeCode.String); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#A27", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#A27"); } try { Convert.ChangeType(tryInt32, null); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#A28", typeof(ArgumentNullException), e.GetType()); + Assert.AreEqual (typeof(ArgumentNullException), e.GetType(), "#A28"); } try { Convert.ChangeType(boolTrue, typeof(DateTime), ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#A29", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#A29"); } try { Convert.ChangeType(ci, typeof(DateTime), ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#A30", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#A30"); } /* Should throw ArgumentException but throws InvalidCastException try { Convert.ChangeType(tryUI32, typeof(FormatException), ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#A??", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#A??"); }*/ try { Convert.ChangeType(tryUI32, TypeCode.Byte, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#A31", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#A31"); } try { Convert.ChangeType(boolTrue, TypeCode.Char, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#A32", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#A32"); } try { Convert.ChangeType(boolTrue, null, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#A33", typeof(ArgumentNullException), e.GetType()); + Assert.AreEqual (typeof(ArgumentNullException), e.GetType(), "#A33"); } try { /* should fail to convert string to any enumeration type. */ Convert.ChangeType("random string", typeof(DayOfWeek)); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#A34", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#A34"); } } @@ -205,422 +205,422 @@ namespace MonoTests.System { public void TestGetTypeCode() { int marker = 1; try { - AssertEquals("#B01", TypeCode.String, Convert.GetTypeCode(tryStr)); + Assert.AreEqual (TypeCode.String, Convert.GetTypeCode(tryStr), "#B01"); marker++; - AssertEquals("#B02", TypeCode.UInt16, Convert.GetTypeCode(tryUI16)); + Assert.AreEqual (TypeCode.UInt16, Convert.GetTypeCode(tryUI16), "#B02"); marker++; - AssertEquals("#B03", TypeCode.UInt32, Convert.GetTypeCode(tryUI32)); + Assert.AreEqual (TypeCode.UInt32, Convert.GetTypeCode(tryUI32), "#B03"); marker++; - AssertEquals("#B04", TypeCode.UInt64, Convert.GetTypeCode(tryUI64)); + Assert.AreEqual (TypeCode.UInt64, Convert.GetTypeCode(tryUI64), "#B04"); marker++; - AssertEquals("#B05", TypeCode.Double, Convert.GetTypeCode(tryDbl)); + Assert.AreEqual (TypeCode.Double, Convert.GetTypeCode(tryDbl), "#B05"); marker++; - AssertEquals("#B06", TypeCode.Int16, Convert.GetTypeCode(tryInt16)); + Assert.AreEqual (TypeCode.Int16, Convert.GetTypeCode(tryInt16), "#B06"); marker++; - AssertEquals("#B07", TypeCode.Int64, Convert.GetTypeCode(tryInt64)); + Assert.AreEqual (TypeCode.Int64, Convert.GetTypeCode(tryInt64), "#B07"); marker++; - AssertEquals("#B08", TypeCode.Object, Convert.GetTypeCode(tryObj)); + Assert.AreEqual (TypeCode.Object, Convert.GetTypeCode(tryObj), "#B08"); marker++; - AssertEquals("#B09", TypeCode.SByte, Convert.GetTypeCode(trySByte)); + Assert.AreEqual (TypeCode.SByte, Convert.GetTypeCode(trySByte), "#B09"); marker++; - AssertEquals("#B10", TypeCode.Single, Convert.GetTypeCode(tryFloat)); + Assert.AreEqual (TypeCode.Single, Convert.GetTypeCode(tryFloat), "#B10"); marker++; - AssertEquals("#B11", TypeCode.Byte, Convert.GetTypeCode(tryByte)); + Assert.AreEqual (TypeCode.Byte, Convert.GetTypeCode(tryByte), "#B11"); marker++; - AssertEquals("#B12", TypeCode.Char, Convert.GetTypeCode(tryChar)); + Assert.AreEqual (TypeCode.Char, Convert.GetTypeCode(tryChar), "#B12"); marker++; -// AssertEquals("#B13", TypeCode.DateTime, Convert.GetTypeCode(tryDT)); +// Assert.AreEqual (TypeCode.DateTime, Convert.GetTypeCode(tryDT), "#B13"); marker++; - AssertEquals("#B14", TypeCode.Decimal, Convert.GetTypeCode(tryDec)); + Assert.AreEqual (TypeCode.Decimal, Convert.GetTypeCode(tryDec), "#B14"); marker++; - AssertEquals("#B15", TypeCode.Int32, Convert.GetTypeCode(tryInt32)); + Assert.AreEqual (TypeCode.Int32, Convert.GetTypeCode(tryInt32), "#B15"); marker++; - AssertEquals("#B16", TypeCode.Boolean, Convert.GetTypeCode(boolTrue)); + Assert.AreEqual (TypeCode.Boolean, Convert.GetTypeCode(boolTrue), "#B16"); } catch (Exception e) { - Fail ("Unexpected exception at " + marker + ": " + e); + Assert.Fail ("Unexpected exception at " + marker + ": " + e); } } public void TestIsDBNull() { - AssertEquals("#C01", false, Convert.IsDBNull(tryInt32)); - AssertEquals("#C02", true, Convert.IsDBNull(Convert.DBNull)); - AssertEquals("#C03", false, Convert.IsDBNull(boolTrue)); - AssertEquals("#C04", false, Convert.IsDBNull(tryChar)); - AssertEquals("#C05", false, Convert.IsDBNull(tryFloat)); + Assert.AreEqual (false, Convert.IsDBNull(tryInt32), "#C01"); + Assert.AreEqual (true, Convert.IsDBNull(Convert.DBNull), "#C02"); + Assert.AreEqual (false, Convert.IsDBNull(boolTrue), "#C03"); + Assert.AreEqual (false, Convert.IsDBNull(tryChar), "#C04"); + Assert.AreEqual (false, Convert.IsDBNull(tryFloat), "#C05"); } public void TestToBoolean() { tryObj = (object)tryDbl; - AssertEquals("#D01", true, Convert.ToBoolean(boolTrue)); - AssertEquals("#D02", false, Convert.ToBoolean(tryByte)); - AssertEquals("#D03", true, Convert.ToBoolean(tryDec)); - AssertEquals("#D04", false, Convert.ToBoolean(tryDbl)); - AssertEquals("#D05", true, Convert.ToBoolean(tryInt16)); - AssertEquals("#D06", true, Convert.ToBoolean(tryInt32)); - AssertEquals("#D07", true, Convert.ToBoolean(tryInt64)); - AssertEquals("#D08", false, Convert.ToBoolean(tryObj)); - AssertEquals("#D09", true, Convert.ToBoolean(trySByte)); - AssertEquals("#D10", true, Convert.ToBoolean(tryFloat)); - AssertEquals("#D11", true, Convert.ToBoolean(trueString)); - AssertEquals("#D12", false, Convert.ToBoolean(falseString)); - AssertEquals("#D13", true, Convert.ToBoolean(tryUI16)); - AssertEquals("#D14", true, Convert.ToBoolean(tryUI32)); - AssertEquals("#D15", false, Convert.ToBoolean(tryUI64)); - AssertEquals("#D16", false, Convert.ToBoolean(tryObj,ci)); - AssertEquals("#D17", true, Convert.ToBoolean(trueString, ci)); - AssertEquals("#D18", false, Convert.ToBoolean(falseString, ci)); + Assert.AreEqual (true, Convert.ToBoolean(boolTrue), "#D01"); + Assert.AreEqual (false, Convert.ToBoolean(tryByte), "#D02"); + Assert.AreEqual (true, Convert.ToBoolean(tryDec), "#D03"); + Assert.AreEqual (false, Convert.ToBoolean(tryDbl), "#D04"); + Assert.AreEqual (true, Convert.ToBoolean(tryInt16), "#D05"); + Assert.AreEqual (true, Convert.ToBoolean(tryInt32), "#D06"); + Assert.AreEqual (true, Convert.ToBoolean(tryInt64), "#D07"); + Assert.AreEqual (false, Convert.ToBoolean(tryObj), "#D08"); + Assert.AreEqual (true, Convert.ToBoolean(trySByte), "#D09"); + Assert.AreEqual (true, Convert.ToBoolean(tryFloat), "#D10"); + Assert.AreEqual (true, Convert.ToBoolean(trueString), "#D11"); + Assert.AreEqual (false, Convert.ToBoolean(falseString), "#D12"); + Assert.AreEqual (true, Convert.ToBoolean(tryUI16), "#D13"); + Assert.AreEqual (true, Convert.ToBoolean(tryUI32), "#D14"); + Assert.AreEqual (false, Convert.ToBoolean(tryUI64), "#D15"); + Assert.AreEqual (false, Convert.ToBoolean(tryObj, ci), "#D16"); + Assert.AreEqual (true, Convert.ToBoolean(trueString, ci), "#D17"); + Assert.AreEqual (false, Convert.ToBoolean(falseString, ci), "#D18"); try { Convert.ToBoolean(tryChar); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#D20", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#D20"); } try { Convert.ToBoolean(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#D21", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#D21"); } try { Convert.ToBoolean(tryStr); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#D22", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#D22"); } try { Convert.ToBoolean(nullString); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#D23", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#D23"); } } public void TestToByte() { - AssertEquals("#E01", (byte)1, Convert.ToByte(boolTrue)); - AssertEquals("#E02", (byte)0, Convert.ToByte(boolFalse)); - AssertEquals("#E03", tryByte, Convert.ToByte(tryByte)); - AssertEquals("#E04", (byte)114, Convert.ToByte('r')); - AssertEquals("#E05", (byte)201, Convert.ToByte((decimal)200.6)); - AssertEquals("#E06", (byte)125, Convert.ToByte((double)125.4)); - AssertEquals("#E07", (byte)255, Convert.ToByte((short)255)); - AssertEquals("#E08", (byte)254, Convert.ToByte((int)254)); - AssertEquals("#E09", (byte)34, Convert.ToByte((long)34)); - AssertEquals("#E10", (byte)1, Convert.ToByte((object)boolTrue)); - AssertEquals("#E11", (byte)123, Convert.ToByte((float)123.49f)); - AssertEquals("#E12", (byte)57, Convert.ToByte("57")); - AssertEquals("#E13", (byte)75, Convert.ToByte((ushort)75)); - AssertEquals("#E14", (byte)184, Convert.ToByte((uint)184)); - AssertEquals("#E15", (byte)241, Convert.ToByte((ulong)241)); - AssertEquals("#E16", (byte)123, Convert.ToByte(trySByte, ci)); - AssertEquals("#E17", (byte)27, Convert.ToByte("011011", 2)); - AssertEquals("#E18", (byte)13, Convert.ToByte("15", 8)); - AssertEquals("#E19", (byte)27, Convert.ToByte("27", 10)); - AssertEquals("#E20", (byte)250, Convert.ToByte("FA", 16)); + Assert.AreEqual ((byte)1, Convert.ToByte(boolTrue), "#E01"); + Assert.AreEqual ((byte)0, Convert.ToByte(boolFalse), "#E02"); + Assert.AreEqual (tryByte, Convert.ToByte(tryByte), "#E03"); + Assert.AreEqual ((byte)114, Convert.ToByte('r'), "#E04"); + Assert.AreEqual ((byte)201, Convert.ToByte((decimal)200.6), "#E05"); + Assert.AreEqual ((byte)125, Convert.ToByte((double)125.4), "#E06"); + Assert.AreEqual ((byte)255, Convert.ToByte((short)255), "#E07"); + Assert.AreEqual ((byte)254, Convert.ToByte((int)254), "#E08"); + Assert.AreEqual ((byte)34, Convert.ToByte((long)34), "#E09"); + Assert.AreEqual ((byte)1, Convert.ToByte((object)boolTrue), "#E10"); + Assert.AreEqual ((byte)123, Convert.ToByte((float)123.49f), "#E11"); + Assert.AreEqual ((byte)57, Convert.ToByte("57"), "#E12"); + Assert.AreEqual ((byte)75, Convert.ToByte((ushort)75), "#E13"); + Assert.AreEqual ((byte)184, Convert.ToByte((uint)184), "#E14"); + Assert.AreEqual ((byte)241, Convert.ToByte((ulong)241), "#E15"); + Assert.AreEqual ((byte)123, Convert.ToByte(trySByte, ci), "#E16"); + Assert.AreEqual ((byte)27, Convert.ToByte("011011", 2), "#E17"); + Assert.AreEqual ((byte)13, Convert.ToByte("15", 8), "#E18"); + Assert.AreEqual ((byte)27, Convert.ToByte("27", 10), "#E19"); + Assert.AreEqual ((byte)250, Convert.ToByte("FA", 16), "#E20"); try { Convert.ToByte('\u03A9'); // sign of Omega on Win2k - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E25", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E25"); } try { Convert.ToByte(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#D26", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#D26"); } try { Convert.ToByte((decimal)22000); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E27", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E27"); } try { Convert.ToByte((double)255.5); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E28", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E28"); } try { Convert.ToByte(-tryInt16); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E29", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E29"); } try { Convert.ToByte((int)-256); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E30", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E30"); } try { Convert.ToByte(tryInt64); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E31", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E31"); } try { Convert.ToByte((object)ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E32", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#E32"); } try { Convert.ToByte((sbyte)-1); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E33", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E33"); } try { Convert.ToByte((float)-0.6f); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E34", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E34"); } try { Convert.ToByte("1a1"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E35", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#E35"); } try { Convert.ToByte("457"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E36", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E36"); } try { Convert.ToByte((ushort)30000); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E37", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E37"); } try { Convert.ToByte((uint)300); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E38", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E38"); } try { Convert.ToByte((ulong)987654321321); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E39", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E39"); } try { Convert.ToByte("10010111", 3); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E40", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#E40"); } try { Convert.ToByte("3F3", 16); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#E41", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#E41"); } } public void TestToChar(){ tryByte = 58; - AssertEquals("#F01", ':', Convert.ToChar(tryByte)); - AssertEquals("#F02", 'a', Convert.ToChar(tryChar)); - AssertEquals("#F03", 'A', Convert.ToChar((short)65)); - AssertEquals("#F04", 'x', Convert.ToChar((int)120)); - AssertEquals("#F05", '"', Convert.ToChar((long)34)); - AssertEquals("#F06", '-', Convert.ToChar((sbyte)45)); - AssertEquals("#F07", '@', Convert.ToChar("@")); - AssertEquals("#F08", 'K', Convert.ToChar((ushort)75)); - AssertEquals("#F09", '=', Convert.ToChar((uint)61)); - // AssertEquals("#F10", 'E', Convert.ToChar((ulong)200)); - AssertEquals("#F11", '{', Convert.ToChar((object)trySByte, ci)); - AssertEquals("#F12", 'o', Convert.ToChar(tryStr.Substring(1,1), ci)); + Assert.AreEqual (':', Convert.ToChar(tryByte), "#F01"); + Assert.AreEqual ('a', Convert.ToChar(tryChar), "#F02"); + Assert.AreEqual ('A', Convert.ToChar((short)65), "#F03"); + Assert.AreEqual ('x', Convert.ToChar((int)120), "#F04"); + Assert.AreEqual ('"', Convert.ToChar((long)34), "#F05"); + Assert.AreEqual ('-', Convert.ToChar((sbyte)45), "#F06"); + Assert.AreEqual ('@', Convert.ToChar("@"), "#F07"); + Assert.AreEqual ('K', Convert.ToChar((ushort)75), "#F08"); + Assert.AreEqual ('=', Convert.ToChar((uint)61), "#F09"); + // Assert.AreEqual ('E', Convert.ToChar((ulong)200), "#F10"); + Assert.AreEqual ('{', Convert.ToChar((object)trySByte, ci), "#F11"); + Assert.AreEqual ('o', Convert.ToChar(tryStr.Substring(1, 1), ci), "#F12"); try { Convert.ToChar(boolTrue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F20", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#F20"); } try { Convert.ToChar(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F21", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#F21"); } try { Convert.ToChar(tryDec); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F22", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#F22"); } try { Convert.ToChar(tryDbl); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F23", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#F23"); } try { Convert.ToChar((short)-1); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F24", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#F24"); } try { Convert.ToChar(Int32.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F25", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#F25"); } try { Convert.ToChar(Int32.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F26", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#F26"); } try { Convert.ToChar(tryInt64); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F27", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#F27"); } try { Convert.ToChar((long)-123); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F28", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#F28"); } try { Convert.ToChar(ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F29", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#F29"); } try { Convert.ToChar(-trySByte); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F30", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#F30"); } try { Convert.ToChar(tryFloat); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F31", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#F31"); } try { Convert.ToChar("foo"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F32", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#F32"); } try { Convert.ToChar(null); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F33", typeof(ArgumentNullException), e.GetType()); + Assert.AreEqual (typeof(ArgumentNullException), e.GetType(), "#F33"); } try { Convert.ToChar(new Exception(), ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F34", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#F34"); } try { Convert.ToChar(null, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F35", typeof(ArgumentNullException), e.GetType()); + Assert.AreEqual (typeof(ArgumentNullException), e.GetType(), "#F35"); } try { Convert.ToChar("", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F36", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#F36"); } try { Convert.ToChar(tryStr, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#F37", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#F37"); } } @@ -635,829 +635,829 @@ namespace MonoTests.System { string dateString = "01/01/2002"; int iTest = 1; try { - AssertEquals("#G01", tryDT, Convert.ToDateTime(tryDT)); + Assert.AreEqual (tryDT, Convert.ToDateTime(tryDT), "#G01"); iTest++; - AssertEquals("#G02", tryDT, Convert.ToDateTime(dateString)); + Assert.AreEqual (tryDT, Convert.ToDateTime(dateString), "#G02"); iTest++; - AssertEquals("#G03", tryDT, Convert.ToDateTime(dateString, ci)); + Assert.AreEqual (tryDT, Convert.ToDateTime(dateString, ci), "#G03"); } catch (Exception e) { - Fail ("Unexpected exception at iTest = " + iTest + ": e = " + e); + Assert.Fail ("Unexpected exception at iTest = " + iTest + ": e = " + e); } try { Convert.ToDateTime(boolTrue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G10", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G10"); } try { Convert.ToDateTime(tryByte); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G11", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G11"); } try { Convert.ToDateTime(tryChar); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G12", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G12"); } try { Convert.ToDateTime(tryDec); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G13", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G13"); } try { Convert.ToDateTime(tryDbl); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G14", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G14"); } try { Convert.ToDateTime(tryInt16); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G15", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G15"); } try { Convert.ToDateTime(tryInt32); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G16", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G16"); } try { Convert.ToDateTime(tryInt64); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G17", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G17"); } try { Convert.ToDateTime(ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G18", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G18"); } try { Convert.ToDateTime(trySByte); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G19", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G19"); } try { Convert.ToDateTime(tryFloat); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G20", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G20"); } try { Convert.ToDateTime("20a2-01-01"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G21", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#G21"); } try { Convert.ToDateTime(tryUI16); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G23", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G23"); } try { Convert.ToDateTime(tryUI32); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G24", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G24"); } try { Convert.ToDateTime(tryUI64); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G25", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G25"); } try { Convert.ToDateTime(ci, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G26", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#G26"); } try { Convert.ToDateTime("20a2-01-01", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G27", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#G27"); } // this is supported by .net 1.1 (defect 41845) try { Convert.ToDateTime("20022-01-01"); - Fail(); + Assert.Fail (); } catch (Exception e) { #if NET_2_0 - AssertEquals("#G28", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#G28"); #else - AssertEquals("#G28", typeof(ArgumentOutOfRangeException), e.GetType()); + Assert.AreEqual (typeof(ArgumentOutOfRangeException), e.GetType(), "#G28"); #endif } try { Convert.ToDateTime("2002-21-01"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G29", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#G29"); } try { Convert.ToDateTime("2002-111-01"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G30", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#G30"); } try { Convert.ToDateTime("2002-01-41"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G31", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#G31"); } try { Convert.ToDateTime("2002-01-111"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G32", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#G32"); } try { - AssertEquals("#G33", tryDT, Convert.ToDateTime("2002-01-01")); + Assert.AreEqual (tryDT, Convert.ToDateTime("2002-01-01"), "#G33"); } catch (Exception e) { - Fail ("Unexpected exception at #G33 " + e); + Assert.Fail ("Unexpected exception at #G33 " + e); } try { Convert.ToDateTime("2002-01-11 34:11:11"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G34", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#G34"); } try { Convert.ToDateTime("2002-01-11 11:70:11"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G35", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#G35"); } try { Convert.ToDateTime("2002-01-11 11:11:70"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#G36", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#G36"); } } public void TestToDecimal() { - AssertEquals("#H01", (decimal)1, Convert.ToDecimal(boolTrue)); - AssertEquals("#H02", (decimal)0, Convert.ToDecimal(boolFalse)); - AssertEquals("#H03", (decimal)tryByte, Convert.ToDecimal(tryByte)); - AssertEquals("#H04", tryDec, Convert.ToDecimal(tryDec)); - AssertEquals("#H05", (decimal)tryDbl, Convert.ToDecimal(tryDbl)); - AssertEquals("#H06", (decimal)tryInt16, Convert.ToDecimal(tryInt16)); - AssertEquals("#H07", (decimal)tryInt32, Convert.ToDecimal(tryInt32)); - AssertEquals("#H08", (decimal)tryInt64, Convert.ToDecimal(tryInt64)); - AssertEquals("#H09", (decimal)trySByte, Convert.ToDecimal(trySByte)); - AssertEquals("#H10", (decimal)tryFloat, Convert.ToDecimal(tryFloat)); + Assert.AreEqual ((decimal)1, Convert.ToDecimal(boolTrue), "#H01"); + Assert.AreEqual ((decimal)0, Convert.ToDecimal(boolFalse), "#H02"); + Assert.AreEqual ((decimal)tryByte, Convert.ToDecimal(tryByte), "#H03"); + Assert.AreEqual (tryDec, Convert.ToDecimal(tryDec), "#H04"); + Assert.AreEqual ((decimal)tryDbl, Convert.ToDecimal(tryDbl), "#H05"); + Assert.AreEqual ((decimal)tryInt16, Convert.ToDecimal(tryInt16), "#H06"); + Assert.AreEqual ((decimal)tryInt32, Convert.ToDecimal(tryInt32), "#H07"); + Assert.AreEqual ((decimal)tryInt64, Convert.ToDecimal(tryInt64), "#H08"); + Assert.AreEqual ((decimal)trySByte, Convert.ToDecimal(trySByte), "#H09"); + Assert.AreEqual ((decimal)tryFloat, Convert.ToDecimal(tryFloat), "#H10"); string sep = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator; -// AssertEquals("#H11", (decimal)23456.432, Convert.ToDecimal("23456" + sep + "432")); +// Assert.AreEqual ((decimal)23456.432, Convert.ToDecimal("23456" + sep + "432"), "#H11"); // Note: changed because the number were the same but with a different base // and this isn't a Convert bug (but a Decimal bug). See #60227 for more details. // http://bugzilla.ximian.com/show_bug.cgi?id=60227 - Assert ("#H11", Decimal.Equals (23456.432m, Convert.ToDecimal ("23456" + sep + "432"))); - AssertEquals("#H12", (decimal)tryUI16, Convert.ToDecimal(tryUI16)); - AssertEquals("#H13", (decimal)tryUI32, Convert.ToDecimal(tryUI32)); - AssertEquals("#H14", (decimal)tryUI64, Convert.ToDecimal(tryUI64)); - AssertEquals("#H15", (decimal)63784, Convert.ToDecimal("63784", ci)); + Assert.IsTrue (Decimal.Equals (23456.432m, Convert.ToDecimal ("23456" + sep + "432")), "#H11"); + Assert.AreEqual ((decimal)tryUI16, Convert.ToDecimal(tryUI16), "#H12"); + Assert.AreEqual ((decimal)tryUI32, Convert.ToDecimal(tryUI32), "#H13"); + Assert.AreEqual ((decimal)tryUI64, Convert.ToDecimal(tryUI64), "#H14"); + Assert.AreEqual ((decimal)63784, Convert.ToDecimal("63784", ci), "#H15"); try { Convert.ToDecimal(tryChar); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#H20", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#H20"); } try { Convert.ToDecimal(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#H21", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#H21"); } try { Convert.ToDecimal(double.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#H22", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#H22"); } try { Convert.ToDecimal(double.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#H23", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#H23"); } try { Convert.ToDecimal(ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#H24", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#H24"); } try { Convert.ToDecimal(tryStr); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#H25", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#H25"); } try { string maxDec = decimal.MaxValue.ToString(); maxDec = maxDec + "1"; Convert.ToDecimal(maxDec); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#H26", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#H26"); } try { Convert.ToDecimal(ci, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#H27", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#H27"); } try { Convert.ToDecimal(tryStr, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#H28", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#H28"); } try { string maxDec = decimal.MaxValue.ToString(); maxDec = maxDec + "1"; Convert.ToDecimal(maxDec, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#H29", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#H29"); } } public void TestToDouble() { int iTest = 1; try { - AssertEquals("#I01", (double)1, Convert.ToDouble(boolTrue)); + Assert.AreEqual ((double)1, Convert.ToDouble(boolTrue), "#I01"); iTest++; - AssertEquals("#I02", (double)0, Convert.ToDouble(boolFalse)); + Assert.AreEqual ((double)0, Convert.ToDouble(boolFalse), "#I02"); iTest++; - AssertEquals("#I03", (double)tryByte, Convert.ToDouble(tryByte)); + Assert.AreEqual ((double)tryByte, Convert.ToDouble(tryByte), "#I03"); iTest++; - AssertEquals("#I04", tryDbl, Convert.ToDouble(tryDbl)); + Assert.AreEqual (tryDbl, Convert.ToDouble(tryDbl), "#I04"); iTest++; - AssertEquals("#I05", (double)tryDec, Convert.ToDouble(tryDec)); + Assert.AreEqual ((double)tryDec, Convert.ToDouble(tryDec), "#I05"); iTest++; - AssertEquals("#I06", (double)tryInt16, Convert.ToDouble(tryInt16)); + Assert.AreEqual ((double)tryInt16, Convert.ToDouble(tryInt16), "#I06"); iTest++; - AssertEquals("#I07", (double)tryInt32, Convert.ToDouble(tryInt32)); + Assert.AreEqual ((double)tryInt32, Convert.ToDouble(tryInt32), "#I07"); iTest++; - AssertEquals("#I08", (double)tryInt64, Convert.ToDouble(tryInt64)); + Assert.AreEqual ((double)tryInt64, Convert.ToDouble(tryInt64), "#I08"); iTest++; - AssertEquals("#I09", (double)trySByte, Convert.ToDouble(trySByte)); + Assert.AreEqual ((double)trySByte, Convert.ToDouble(trySByte), "#I09"); iTest++; - AssertEquals("#I10", (double)tryFloat, Convert.ToDouble(tryFloat)); + Assert.AreEqual ((double)tryFloat, Convert.ToDouble(tryFloat), "#I10"); iTest++; string sep = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator; - AssertEquals("#I11", (double)23456.432, Convert.ToDouble("23456" + sep + "432")); + Assert.AreEqual ((double)23456.432, Convert.ToDouble("23456" + sep + "432"), "#I11"); iTest++; - AssertEquals("#I12", (double)tryUI16, Convert.ToDouble(tryUI16)); + Assert.AreEqual ((double)tryUI16, Convert.ToDouble(tryUI16), "#I12"); iTest++; - AssertEquals("#I13", (double)tryUI32, Convert.ToDouble(tryUI32)); + Assert.AreEqual ((double)tryUI32, Convert.ToDouble(tryUI32), "#I13"); iTest++; - AssertEquals("#I14", (double)tryUI64, Convert.ToDouble(tryUI64)); + Assert.AreEqual ((double)tryUI64, Convert.ToDouble(tryUI64), "#I14"); iTest++; - AssertEquals("#H15", (double)63784, Convert.ToDouble("63784", ci)); + Assert.AreEqual ((double)63784, Convert.ToDouble("63784", ci), "#H15"); } catch (Exception e) { - Fail ("Unexpected exception at iTest = " + iTest + ": e = " + e); + Assert.Fail ("Unexpected exception at iTest = " + iTest + ": e = " + e); } try { Convert.ToDouble(tryChar); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#I20", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#I20"); } try { Convert.ToDouble(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#I21", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#I21"); } try { Convert.ToDouble(ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#I22", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#I22"); } try { Convert.ToDouble(tryStr); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#I23", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#I23"); } try { string maxDec = double.MaxValue.ToString(); maxDec = maxDec + "1"; Convert.ToDouble(maxDec); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#I24", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#I24"); } try { Convert.ToDouble(ci, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#I25", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#I25"); } try { Convert.ToDouble(tryStr, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#I26", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#I26"); } try { string maxDec = double.MaxValue.ToString(); maxDec = maxDec + "1"; Convert.ToDouble(maxDec, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#I27", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#I27"); } try { Convert.ToDouble(tryObj, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#I28", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#I28"); } } public void TestToInt16() { - AssertEquals("#J01", (short)0, Convert.ToInt16(boolFalse)); - AssertEquals("#J02", (short)1, Convert.ToInt16(boolTrue)); - AssertEquals("#J03", (short)97, Convert.ToInt16(tryChar)); - AssertEquals("#J04", (short)1234, Convert.ToInt16(tryDec)); - AssertEquals("#J05", (short)0, Convert.ToInt16(tryDbl)); - AssertEquals("#J06", (short)1234, Convert.ToInt16(tryInt16)); - AssertEquals("#J07", (short)12345, Convert.ToInt16(tryInt32)); - AssertEquals("#J08", (short)30000, Convert.ToInt16((long)30000)); - AssertEquals("#J09", (short)123, Convert.ToInt16(trySByte)); - AssertEquals("#J10", (short)1234, Convert.ToInt16(tryFloat)); - AssertEquals("#J11", (short)578, Convert.ToInt16("578")); - AssertEquals("#J12", (short)15500, Convert.ToInt16((ushort)15500)); - AssertEquals("#J13", (short)5489, Convert.ToInt16((uint)5489)); - AssertEquals("#J14", (short)9876, Convert.ToInt16((ulong)9876)); - AssertEquals("#J15", (short)14, Convert.ToInt16("14", ci)); - AssertEquals("#J16", (short)11, Convert.ToInt16("01011", 2)); - AssertEquals("#J17", (short)1540, Convert.ToInt16("3004", 8)); - AssertEquals("#J18", (short)321, Convert.ToInt16("321", 10)); - AssertEquals("#J19", (short)2748, Convert.ToInt16("ABC", 16)); + Assert.AreEqual ((short)0, Convert.ToInt16(boolFalse), "#J01"); + Assert.AreEqual ((short)1, Convert.ToInt16(boolTrue), "#J02"); + Assert.AreEqual ((short)97, Convert.ToInt16(tryChar), "#J03"); + Assert.AreEqual ((short)1234, Convert.ToInt16(tryDec), "#J04"); + Assert.AreEqual ((short)0, Convert.ToInt16(tryDbl), "#J05"); + Assert.AreEqual ((short)1234, Convert.ToInt16(tryInt16), "#J06"); + Assert.AreEqual ((short)12345, Convert.ToInt16(tryInt32), "#J07"); + Assert.AreEqual ((short)30000, Convert.ToInt16((long)30000), "#J08"); + Assert.AreEqual ((short)123, Convert.ToInt16(trySByte), "#J09"); + Assert.AreEqual ((short)1234, Convert.ToInt16(tryFloat), "#J10"); + Assert.AreEqual ((short)578, Convert.ToInt16("578"), "#J11"); + Assert.AreEqual ((short)15500, Convert.ToInt16((ushort)15500), "#J12"); + Assert.AreEqual ((short)5489, Convert.ToInt16((uint)5489), "#J13"); + Assert.AreEqual ((short)9876, Convert.ToInt16((ulong)9876), "#J14"); + Assert.AreEqual ((short)14, Convert.ToInt16("14", ci), "#J15"); + Assert.AreEqual ((short)11, Convert.ToInt16("01011", 2), "#J16"); + Assert.AreEqual ((short)1540, Convert.ToInt16("3004", 8), "#J17"); + Assert.AreEqual ((short)321, Convert.ToInt16("321", 10), "#J18"); + Assert.AreEqual ((short)2748, Convert.ToInt16("ABC", 16), "#J19"); try { Convert.ToInt16(char.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J25", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J25"); } try { Convert.ToInt16(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J26", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#J26"); } try { Convert.ToInt16((decimal)(short.MaxValue + 1)); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J27", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J27"); } try { Convert.ToInt16((decimal)(short.MinValue - 1)); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J28", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J28"); } try { Convert.ToInt16((double)(short.MaxValue + 1)); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J29", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J29"); } try { Convert.ToInt16((double)(short.MinValue - 1)); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J30", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J30"); } try { Convert.ToInt16(50000); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J31", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J31"); } try { Convert.ToInt16(-50000); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J32", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J32"); } try { Convert.ToInt16(tryInt64); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J33", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J33"); } try { Convert.ToInt16(-tryInt64); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J34", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J34"); } try { Convert.ToInt16(tryObj); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J35", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#J35"); } try { Convert.ToInt16((float)32767.5); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J36", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J36"); } try { Convert.ToInt16((float)-33000.54); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J37", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J37"); } try { Convert.ToInt16(tryStr); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J38", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#J38"); } try { Convert.ToInt16("-33000"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J39", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J39"); } try { Convert.ToInt16(ushort.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J40", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J40"); } try { Convert.ToInt16(uint.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J41", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J41"); } try { Convert.ToInt16(ulong.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J42", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J42"); } try { Convert.ToInt16(tryObj, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J43", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#J43"); } try { Convert.ToInt16(tryStr, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J44", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#J44"); } try { Convert.ToInt16("-33000", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J45", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J45"); } try { Convert.ToInt16("321", 11); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J46", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#J46"); } try { Convert.ToInt16("D8BF1", 16); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#J47", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#J47"); } } public void TestToInt32() { long tryMax = long.MaxValue; long tryMin = long.MinValue; - AssertEquals("#K01", (int)0, Convert.ToInt32(boolFalse)); - AssertEquals("#K02", (int)1, Convert.ToInt32(boolTrue)); - AssertEquals("#K03", (int)0, Convert.ToInt32(tryByte)); - AssertEquals("#K04", (int)97, Convert.ToInt32(tryChar)); - AssertEquals("#K05", (int)1234, Convert.ToInt32(tryDec)); - AssertEquals("#K06", (int)0, Convert.ToInt32(tryDbl)); - AssertEquals("#K07", (int)1234, Convert.ToInt32(tryInt16)); - AssertEquals("#K08", (int)12345, Convert.ToInt32(tryInt32)); - AssertEquals("#K09", (int)60000, Convert.ToInt32((long)60000)); - AssertEquals("#K10", (int)123, Convert.ToInt32(trySByte)); - AssertEquals("#K11", (int)1234, Convert.ToInt32(tryFloat)); - AssertEquals("#K12", (int)9876, Convert.ToInt32((string)"9876")); - AssertEquals("#K13", (int)34567, Convert.ToInt32(tryUI16)); - AssertEquals("#K14", (int)567891234, Convert.ToInt32(tryUI32)); - AssertEquals("#K15", (int)0, Convert.ToInt32(tryUI64)); - AssertEquals("#K16", (int)123, Convert.ToInt32("123", ci)); - AssertEquals("#K17", (int)128, Convert.ToInt32("10000000", 2)); - AssertEquals("#K18", (int)302, Convert.ToInt32("456", 8)); - AssertEquals("#K19", (int)456, Convert.ToInt32("456", 10)); - AssertEquals("#K20", (int)1110, Convert.ToInt32("456", 16)); + Assert.AreEqual ((int)0, Convert.ToInt32(boolFalse), "#K01"); + Assert.AreEqual ((int)1, Convert.ToInt32(boolTrue), "#K02"); + Assert.AreEqual ((int)0, Convert.ToInt32(tryByte), "#K03"); + Assert.AreEqual ((int)97, Convert.ToInt32(tryChar), "#K04"); + Assert.AreEqual ((int)1234, Convert.ToInt32(tryDec), "#K05"); + Assert.AreEqual ((int)0, Convert.ToInt32(tryDbl), "#K06"); + Assert.AreEqual ((int)1234, Convert.ToInt32(tryInt16), "#K07"); + Assert.AreEqual ((int)12345, Convert.ToInt32(tryInt32), "#K08"); + Assert.AreEqual ((int)60000, Convert.ToInt32((long)60000), "#K09"); + Assert.AreEqual ((int)123, Convert.ToInt32(trySByte), "#K10"); + Assert.AreEqual ((int)1234, Convert.ToInt32(tryFloat), "#K11"); + Assert.AreEqual ((int)9876, Convert.ToInt32((string)"9876"), "#K12"); + Assert.AreEqual ((int)34567, Convert.ToInt32(tryUI16), "#K13"); + Assert.AreEqual ((int)567891234, Convert.ToInt32(tryUI32), "#K14"); + Assert.AreEqual ((int)0, Convert.ToInt32(tryUI64), "#K15"); + Assert.AreEqual ((int)123, Convert.ToInt32("123", ci), "#K16"); + Assert.AreEqual ((int)128, Convert.ToInt32("10000000", 2), "#K17"); + Assert.AreEqual ((int)302, Convert.ToInt32("456", 8), "#K18"); + Assert.AreEqual ((int)456, Convert.ToInt32("456", 10), "#K19"); + Assert.AreEqual ((int)1110, Convert.ToInt32("456", 16), "#K20"); try { Convert.ToInt32(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K25", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#K25"); } try { Convert.ToInt32((decimal)tryMax); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K26", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K26"); } try { Convert.ToInt32((decimal)tryMin); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K27", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K27"); } try { Convert.ToInt32((double)tryMax); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K28", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K28"); } try { Convert.ToInt32((double)tryMin); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K29", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K29"); } try { Convert.ToInt32(tryInt64); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K30", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K30"); } try { Convert.ToInt32(-tryInt64); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K31", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K31"); } try { Convert.ToInt32(tryObj); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K32", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#K32"); } try { Convert.ToInt32((float)tryMax); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K33", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K33"); } try { Convert.ToInt32((float)tryMin); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K34", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K34"); } try { Convert.ToInt32(tryStr, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K35", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#K35"); } try { Convert.ToInt32("-46565465123"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K36", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K36"); } try { Convert.ToInt32("46565465123"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K37", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K37"); } try { Convert.ToInt32((uint)tryMax); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K38", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K38"); } try { Convert.ToInt32((ulong)tryMax); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K39", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K39"); } try { Convert.ToInt32(tryObj, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K40", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#K40"); } try { Convert.ToInt32(tryStr, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K41", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#K41"); } try { Convert.ToInt32("-46565465123", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K42", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#K42"); } try { Convert.ToInt32("654", 9); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#K43", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#K43"); } } @@ -1467,803 +1467,802 @@ namespace MonoTests.System { decimal longMin = long.MinValue; longMin -= 1000000; - AssertEquals("#L01", (long)0, Convert.ToInt64(boolFalse)); - AssertEquals("#L02", (long)1, Convert.ToInt64(boolTrue)); - AssertEquals("#L03", (long)97, Convert.ToInt64(tryChar)); - AssertEquals("#L04", (long)1234, Convert.ToInt64(tryDec)); - AssertEquals("#L05", (long)0, Convert.ToInt64(tryDbl)); - AssertEquals("#L06", (long)1234, Convert.ToInt64(tryInt16)); - AssertEquals("#L07", (long)12345, Convert.ToInt64(tryInt32)); - AssertEquals("#L08", (long)123456789012, Convert.ToInt64(tryInt64)); - AssertEquals("#L09", (long)123, Convert.ToInt64(trySByte)); - AssertEquals("#L10", (long)1234, Convert.ToInt64(tryFloat)); - AssertEquals("#L11", (long)564897, Convert.ToInt64("564897")); - AssertEquals("#L12", (long)34567, Convert.ToInt64(tryUI16)); - AssertEquals("#L13", (long)567891234, Convert.ToInt64(tryUI32)); - AssertEquals("#L14", (long)0, Convert.ToInt64(tryUI64)); - AssertEquals("#L15", (long)-2548751, Convert.ToInt64("-2548751", ci)); - AssertEquals("#L16", (long)24987562, Convert.ToInt64("1011111010100011110101010", 2)); - AssertEquals("#L17", (long)-24578965, Convert.ToInt64("1777777777777642172153", 8)); - AssertEquals("#L18", (long)248759757, Convert.ToInt64("248759757", 10)); - AssertEquals("#L19", (long)256, Convert.ToInt64("100", 16)); + Assert.AreEqual ((long)0, Convert.ToInt64(boolFalse), "#L01"); + Assert.AreEqual ((long)1, Convert.ToInt64(boolTrue), "#L02"); + Assert.AreEqual ((long)97, Convert.ToInt64(tryChar), "#L03"); + Assert.AreEqual ((long)1234, Convert.ToInt64(tryDec), "#L04"); + Assert.AreEqual ((long)0, Convert.ToInt64(tryDbl), "#L05"); + Assert.AreEqual ((long)1234, Convert.ToInt64(tryInt16), "#L06"); + Assert.AreEqual ((long)12345, Convert.ToInt64(tryInt32), "#L07"); + Assert.AreEqual ((long)123456789012, Convert.ToInt64(tryInt64), "#L08"); + Assert.AreEqual ((long)123, Convert.ToInt64(trySByte), "#L09"); + Assert.AreEqual ((long)1234, Convert.ToInt64(tryFloat), "#L10"); + Assert.AreEqual ((long)564897, Convert.ToInt64("564897"), "#L11"); + Assert.AreEqual ((long)34567, Convert.ToInt64(tryUI16), "#L12"); + Assert.AreEqual ((long)567891234, Convert.ToInt64(tryUI32), "#L13"); + Assert.AreEqual ((long)0, Convert.ToInt64(tryUI64), "#L14"); + Assert.AreEqual ((long)-2548751, Convert.ToInt64("-2548751", ci), "#L15"); + Assert.AreEqual ((long)24987562, Convert.ToInt64("1011111010100011110101010", 2), "#L16"); + Assert.AreEqual ((long)-24578965, Convert.ToInt64("1777777777777642172153", 8), "#L17"); + Assert.AreEqual ((long)248759757, Convert.ToInt64("248759757", 10), "#L18"); + Assert.AreEqual ((long)256, Convert.ToInt64("100", 16), "#L19"); try { Convert.ToInt64(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L20", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#L20"); } try { Convert.ToInt64((decimal)longMax + 1); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L21", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#L21"); } try { Convert.ToInt64((decimal)longMin); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L24", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#L24"); } try { Convert.ToInt64((double)longMax); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L25:"+longMax, typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#L25:"+longMax); } try { Convert.ToInt64((double)longMin); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L26", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#L26"); } try { Convert.ToInt64(new Exception()); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L27", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#L27"); } try { Convert.ToInt64(((float)longMax)*100); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L28:"+longMax, typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#L28:"+longMax); } try { Convert.ToInt64(((float)longMin)*100); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L29", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#L29"); } try { Convert.ToInt64("-567b3"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L30", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#L30"); } try { Convert.ToInt64(longMax.ToString()); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L31:", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#L31:"); } try { Convert.ToInt64(ulong.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L32", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#L32"); } try { Convert.ToInt64(tryStr, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L32b", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#L32b"); } try { Convert.ToInt64(longMin.ToString(), ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L33", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#L33"); } try { Convert.ToInt64("321", 11); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#L34", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#L34"); } } public void TestToSByte() { int iTest = 1; try { - AssertEquals("#M01", (sbyte)0, Convert.ToSByte(boolFalse)); + Assert.AreEqual ((sbyte)0, Convert.ToSByte(boolFalse), "#M01"); iTest++; - AssertEquals("#M02", (sbyte)1, Convert.ToSByte(boolTrue)); + Assert.AreEqual ((sbyte)1, Convert.ToSByte(boolTrue), "#M02"); iTest++; - AssertEquals("#M03", (sbyte)97, Convert.ToSByte(tryChar)); + Assert.AreEqual ((sbyte)97, Convert.ToSByte(tryChar), "#M03"); iTest++; - AssertEquals("#M04", (sbyte)15, Convert.ToSByte((decimal)15)); + Assert.AreEqual ((sbyte)15, Convert.ToSByte((decimal)15), "#M04"); iTest++; - AssertEquals("#M05", (sbyte)0, Convert.ToSByte(tryDbl)); + Assert.AreEqual ((sbyte)0, Convert.ToSByte(tryDbl), "#M05"); iTest++; - AssertEquals("#M06", (sbyte)127, Convert.ToSByte((short)127)); + Assert.AreEqual ((sbyte)127, Convert.ToSByte((short)127), "#M06"); iTest++; - AssertEquals("#M07", (sbyte)-128, Convert.ToSByte((int)-128)); + Assert.AreEqual ((sbyte)-128, Convert.ToSByte((int)-128), "#M07"); iTest++; - AssertEquals("#M08", (sbyte)30, Convert.ToSByte((long)30)); + Assert.AreEqual ((sbyte)30, Convert.ToSByte((long)30), "#M08"); iTest++; - AssertEquals("#M09", (sbyte)123, Convert.ToSByte(trySByte)); + Assert.AreEqual ((sbyte)123, Convert.ToSByte(trySByte), "#M09"); iTest++; - AssertEquals("#M10", (sbyte)12, Convert.ToSByte((float)12.46987f)); + Assert.AreEqual ((sbyte)12, Convert.ToSByte((float)12.46987f), "#M10"); iTest++; - AssertEquals("#M11", (sbyte)1, Convert.ToSByte("1")); + Assert.AreEqual ((sbyte)1, Convert.ToSByte("1"), "#M11"); iTest++; - AssertEquals("#M12", (sbyte)99, Convert.ToSByte((ushort)99)); + Assert.AreEqual ((sbyte)99, Convert.ToSByte((ushort)99), "#M12"); iTest++; - AssertEquals("#M13", (sbyte)54, Convert.ToSByte((uint)54)); + Assert.AreEqual ((sbyte)54, Convert.ToSByte((uint)54), "#M13"); iTest++; - AssertEquals("#M14", (sbyte)127, Convert.ToSByte((ulong)127)); + Assert.AreEqual ((sbyte)127, Convert.ToSByte((ulong)127), "#M14"); iTest++; - AssertEquals("#M15", (sbyte)14, Convert.ToSByte("14", ci)); + Assert.AreEqual ((sbyte)14, Convert.ToSByte("14", ci), "#M15"); iTest++; - AssertEquals("#M16", (sbyte)11, Convert.ToSByte("01011", 2)); + Assert.AreEqual ((sbyte)11, Convert.ToSByte("01011", 2), "#M16"); iTest++; - AssertEquals("#M17", (sbyte)5, Convert.ToSByte("5", 8)); + Assert.AreEqual ((sbyte)5, Convert.ToSByte("5", 8), "#M17"); iTest++; - AssertEquals("#M18", (sbyte)100, Convert.ToSByte("100", 10)); + Assert.AreEqual ((sbyte)100, Convert.ToSByte("100", 10), "#M18"); iTest++; - AssertEquals("#M19", (sbyte)-1, Convert.ToSByte("FF", 16)); + Assert.AreEqual ((sbyte)-1, Convert.ToSByte("FF", 16), "#M19"); } catch (Exception e) { - Fail ("Unexpected exception at iTest = " + iTest + ": e = " + e); + Assert.Fail ("Unexpected exception at iTest = " + iTest + ": e = " + e); } try { Convert.ToSByte((byte)200); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M25", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M25"); } try { Convert.ToSByte((char)130); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M26", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M26"); } try { Convert.ToSByte(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M27", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#M27"); } try { Convert.ToSByte((decimal)127.5m); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M28", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M28"); } try { Convert.ToSByte((decimal)-200m); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M29", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M29"); } try { Convert.ToSByte((double)150); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M30", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M30"); } try { Convert.ToSByte((double)-128.6); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M31", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M31"); } try { Convert.ToSByte((short)150); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M32", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M32"); } try { Convert.ToSByte((short)-300); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M33", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M33"); } try { Convert.ToSByte((int)1500); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M34", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M34"); } try { Convert.ToSByte((int)-1286); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M35", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M35"); } try { Convert.ToSByte((long)128); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M36", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M36"); } try { Convert.ToSByte((long)-129); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M37", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M37"); } try { Convert.ToSByte(new NumberFormatInfo()); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M38", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#M38"); } try { Convert.ToSByte((float)333); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M39", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M39"); } try { Convert.ToSByte((float)-666); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M40", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M40"); } try { Convert.ToSByte("B3"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M41", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#M41"); } try { Convert.ToSByte("251"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M42", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M42"); } try { Convert.ToSByte(ushort.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M43", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M43"); } try { Convert.ToSByte((uint)600); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M44", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M44"); } try { Convert.ToSByte(ulong.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M45", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M45"); } try { Convert.ToSByte(ci, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M46", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#M46"); } try { Convert.ToSByte(tryStr, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M47", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#M47"); } try { Convert.ToSByte("325", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M48", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M48"); } try { Convert.ToSByte("5D", 15); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M49", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#M49"); } try { Convert.ToSByte("111111111", 2); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#M50", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#M50"); } } public void TestToSingle() { int iTest = 1; try { - AssertEquals("#N01", (float)0, Convert.ToSingle(boolFalse)); + Assert.AreEqual ((float)0, Convert.ToSingle(boolFalse), "#N01"); iTest++; - AssertEquals("#N02", (float)1, Convert.ToSingle(boolTrue)); + Assert.AreEqual ((float)1, Convert.ToSingle(boolTrue), "#N02"); iTest++; - AssertEquals("#N03", (float)0, Convert.ToSingle(tryByte)); + Assert.AreEqual ((float)0, Convert.ToSingle(tryByte), "#N03"); iTest++; - AssertEquals("#N04", (float)1234,234, Convert.ToSingle(tryDec)); + Assert.AreEqual ((float)1234, 234, Convert.ToSingle(tryDec), "#N04"); iTest++; - AssertEquals("#N05", (float)0, Convert.ToSingle(tryDbl)); + Assert.AreEqual ((float)0, Convert.ToSingle(tryDbl), "#N05"); iTest++; - AssertEquals("#N06", (float)1234, Convert.ToSingle(tryInt16)); + Assert.AreEqual ((float)1234, Convert.ToSingle(tryInt16), "#N06"); iTest++; - AssertEquals("#N07", (float)12345, Convert.ToSingle(tryInt32)); + Assert.AreEqual ((float)12345, Convert.ToSingle(tryInt32), "#N07"); iTest++; - AssertEquals("#N08", (float)123456789012, Convert.ToSingle(tryInt64)); + Assert.AreEqual ((float)123456789012, Convert.ToSingle(tryInt64), "#N08"); iTest++; - AssertEquals("#N09", (float)123, Convert.ToSingle(trySByte)); + Assert.AreEqual ((float)123, Convert.ToSingle(trySByte), "#N09"); iTest++; - AssertEquals("#N10", (float)1234,2345, Convert.ToSingle(tryFloat)); + Assert.AreEqual ((float)1234, 2345, Convert.ToSingle(tryFloat), "#N10"); iTest++; - AssertEquals("#N11", (float)987, Convert.ToSingle("987")); + Assert.AreEqual ((float)987, Convert.ToSingle("987"), "#N11"); iTest++; - AssertEquals("#N12", (float)34567, Convert.ToSingle(tryUI16)); + Assert.AreEqual ((float)34567, Convert.ToSingle(tryUI16), "#N12"); iTest++; - AssertEquals("#N13", (float)567891234, Convert.ToSingle(tryUI32)); + Assert.AreEqual ((float)567891234, Convert.ToSingle(tryUI32), "#N13"); iTest++; - AssertEquals("#N14", (float)0, Convert.ToSingle(tryUI64)); + Assert.AreEqual ((float)0, Convert.ToSingle(tryUI64), "#N14"); iTest++; - AssertEquals("#N15", (float)654.234, Convert.ToSingle("654.234", ci)); + Assert.AreEqual ((float)654.234, Convert.ToSingle("654.234", ci), "#N15"); } catch (Exception e) { - Fail ("Unexpected exception at iTest = " + iTest + ": e = " + e); + Assert.Fail ("Unexpected exception at iTest = " + iTest + ": e = " + e); } try { Convert.ToSingle(tryChar); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#N25", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#N25"); } try { Convert.ToSingle(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#N26", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#N26"); } try { Convert.ToSingle(tryObj); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#N27", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#N27"); } try { Convert.ToSingle("A345H"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#N28", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#N28"); } try { Convert.ToSingle(double.MaxValue.ToString()); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#N29", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#N29"); } try { Convert.ToSingle(tryObj, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#N30", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#N30"); } try { Convert.ToSingle("J345K", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#N31", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#N31"); } try { Convert.ToSingle("11000000000000000000000000000000000000000000000", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#N32", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#N32"); } } public void TestToString() { tryByte = 123; - AssertEquals("#O01", "False", Convert.ToString(boolFalse)); - AssertEquals("#O02", "True", Convert.ToString(boolTrue)); - AssertEquals("#O03", "123", Convert.ToString(tryByte)); - AssertEquals("#O04", "a", Convert.ToString(tryChar)); - AssertEquals("#O05", tryDT.ToString(), Convert.ToString(tryDT)); - AssertEquals("#O06", tryDec.ToString(), Convert.ToString(tryDec)); - AssertEquals("#O07", tryDbl.ToString(), Convert.ToString(tryDbl)); - AssertEquals("#O08", "1234", Convert.ToString(tryInt16)); - AssertEquals("#O09", "12345", Convert.ToString(tryInt32)); - AssertEquals("#O10", "123456789012", Convert.ToString(tryInt64)); - AssertEquals("#O11", "123", Convert.ToString(trySByte)); - AssertEquals("#O12", tryFloat.ToString(), Convert.ToString(tryFloat)); - AssertEquals("#O13", "foobar", Convert.ToString(tryStr)); - AssertEquals("#O14", "34567", Convert.ToString(tryUI16)); - AssertEquals("#O15", "567891234", Convert.ToString(tryUI32)); - AssertEquals("#O16", "True", Convert.ToString(boolTrue, ci)); - AssertEquals("#O17", "False", Convert.ToString(boolFalse, ci)); - AssertEquals("#O18", "123", Convert.ToString(tryByte, ci)); - AssertEquals("#O19", "1111011", Convert.ToString(tryByte, 2)); - AssertEquals("#O20", "173", Convert.ToString(tryByte, 8)); - AssertEquals("#O21", "123", Convert.ToString(tryByte, 10)); - AssertEquals("#O22", "7b", Convert.ToString(tryByte, 16)); - AssertEquals("#O23", "a", Convert.ToString(tryChar, ci)); - AssertEquals("#O24", tryDT.ToString(ci), Convert.ToString(tryDT, ci)); - AssertEquals("#O25", tryDec.ToString(ci), Convert.ToString(tryDec,ci)); - AssertEquals("#O26", tryDbl.ToString(ci), Convert.ToString(tryDbl, ci)); - AssertEquals("#O27", "1234", Convert.ToString(tryInt16, ci)); - AssertEquals("#O28", "10011010010", Convert.ToString(tryInt16, 2)); - AssertEquals("#O29", "2322", Convert.ToString(tryInt16, 8)); - AssertEquals("#O30", "1234", Convert.ToString(tryInt16, 10)); - AssertEquals("#O31", "4d2", Convert.ToString(tryInt16, 16)); - AssertEquals("#O32", "12345", Convert.ToString(tryInt32, ci)); - AssertEquals("#O33", "11000000111001", Convert.ToString(tryInt32, 2)); - AssertEquals("#O34", "30071", Convert.ToString(tryInt32, 8)); - AssertEquals("#O35", "12345", Convert.ToString(tryInt32, 10)); - AssertEquals("#O36", "3039", Convert.ToString(tryInt32, 16)); - AssertEquals("#O37", "123456789012", Convert.ToString(tryInt64, ci)); - AssertEquals("#O38", "1110010111110100110010001101000010100", - Convert.ToString(tryInt64, 2)); - AssertEquals("#O39", "1627646215024", Convert.ToString(tryInt64, 8)); - AssertEquals("#O40", "123456789012", Convert.ToString(tryInt64, 10)); - AssertEquals("#O41", "1cbe991a14", Convert.ToString(tryInt64, 16)); - AssertEquals("#O42", "123", Convert.ToString((trySByte), ci)); - AssertEquals("#O43", tryFloat.ToString(ci), Convert.ToString((tryFloat), ci)); - AssertEquals("#O44", "foobar", Convert.ToString((tryStr), ci)); - AssertEquals("#O45", "34567", Convert.ToString((tryUI16), ci)); - AssertEquals("#O46", "567891234", Convert.ToString((tryUI32), ci)); - AssertEquals("#O47", "0", Convert.ToString(tryUI64)); - AssertEquals("#O48", "0", Convert.ToString((tryUI64), ci)); + Assert.AreEqual ("False", Convert.ToString(boolFalse), "#O01"); + Assert.AreEqual ("True", Convert.ToString(boolTrue), "#O02"); + Assert.AreEqual ("123", Convert.ToString(tryByte), "#O03"); + Assert.AreEqual ("a", Convert.ToString(tryChar), "#O04"); + Assert.AreEqual (tryDT.ToString(), Convert.ToString(tryDT), "#O05"); + Assert.AreEqual (tryDec.ToString(), Convert.ToString(tryDec), "#O06"); + Assert.AreEqual (tryDbl.ToString(), Convert.ToString(tryDbl), "#O07"); + Assert.AreEqual ("1234", Convert.ToString(tryInt16), "#O08"); + Assert.AreEqual ("12345", Convert.ToString(tryInt32), "#O09"); + Assert.AreEqual ("123456789012", Convert.ToString(tryInt64), "#O10"); + Assert.AreEqual ("123", Convert.ToString(trySByte), "#O11"); + Assert.AreEqual (tryFloat.ToString(), Convert.ToString(tryFloat), "#O12"); + Assert.AreEqual ("foobar", Convert.ToString(tryStr), "#O13"); + Assert.AreEqual ("34567", Convert.ToString(tryUI16), "#O14"); + Assert.AreEqual ("567891234", Convert.ToString(tryUI32), "#O15"); + Assert.AreEqual ("True", Convert.ToString(boolTrue, ci), "#O16"); + Assert.AreEqual ("False", Convert.ToString(boolFalse, ci), "#O17"); + Assert.AreEqual ("123", Convert.ToString(tryByte, ci), "#O18"); + Assert.AreEqual ("1111011", Convert.ToString(tryByte, 2), "#O19"); + Assert.AreEqual ("173", Convert.ToString(tryByte, 8), "#O20"); + Assert.AreEqual ("123", Convert.ToString(tryByte, 10), "#O21"); + Assert.AreEqual ("7b", Convert.ToString(tryByte, 16), "#O22"); + Assert.AreEqual ("a", Convert.ToString(tryChar, ci), "#O23"); + Assert.AreEqual (tryDT.ToString(ci), Convert.ToString(tryDT, ci), "#O24"); + Assert.AreEqual (tryDec.ToString(ci), Convert.ToString(tryDec, ci), "#O25"); + Assert.AreEqual (tryDbl.ToString(ci), Convert.ToString(tryDbl, ci), "#O26"); + Assert.AreEqual ("1234", Convert.ToString(tryInt16, ci), "#O27"); + Assert.AreEqual ("10011010010", Convert.ToString(tryInt16, 2), "#O28"); + Assert.AreEqual ("2322", Convert.ToString(tryInt16, 8), "#O29"); + Assert.AreEqual ("1234", Convert.ToString(tryInt16, 10), "#O30"); + Assert.AreEqual ("4d2", Convert.ToString(tryInt16, 16), "#O31"); + Assert.AreEqual ("12345", Convert.ToString(tryInt32, ci), "#O32"); + Assert.AreEqual ("11000000111001", Convert.ToString(tryInt32, 2), "#O33"); + Assert.AreEqual ("30071", Convert.ToString(tryInt32, 8), "#O34"); + Assert.AreEqual ("12345", Convert.ToString(tryInt32, 10), "#O35"); + Assert.AreEqual ("3039", Convert.ToString(tryInt32, 16), "#O36"); + Assert.AreEqual ("123456789012", Convert.ToString(tryInt64, ci), "#O37"); + Assert.AreEqual ("1110010111110100110010001101000010100", Convert.ToString(tryInt64, 2), "#O38"); + Assert.AreEqual ("1627646215024", Convert.ToString(tryInt64, 8), "#O39"); + Assert.AreEqual ("123456789012", Convert.ToString(tryInt64, 10), "#O40"); + Assert.AreEqual ("1cbe991a14", Convert.ToString(tryInt64, 16), "#O41"); + Assert.AreEqual ("123", Convert.ToString((trySByte), ci), "#O42"); + Assert.AreEqual (tryFloat.ToString(ci), Convert.ToString((tryFloat), ci), "#O43"); + Assert.AreEqual ("foobar", Convert.ToString((tryStr), ci), "#O44"); + Assert.AreEqual ("34567", Convert.ToString((tryUI16), ci), "#O45"); + Assert.AreEqual ("567891234", Convert.ToString((tryUI32), ci), "#O46"); + Assert.AreEqual ("0", Convert.ToString(tryUI64), "#O47"); + Assert.AreEqual ("0", Convert.ToString((tryUI64), ci), "#O48"); try { Convert.ToString(tryInt16, 5); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#O55", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#O55"); } try { Convert.ToString(tryInt32, 17); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#O56", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#O56"); } try { Convert.ToString(tryInt64, 1); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#O57", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#O57"); } } public void TestToUInt16() { - AssertEquals("#P01", (ushort)0, Convert.ToUInt16(boolFalse)); - AssertEquals("#P02", (ushort)1, Convert.ToUInt16(boolTrue)); - AssertEquals("#P03", (ushort)0, Convert.ToUInt16(tryByte)); - AssertEquals("#P04", (ushort)97, Convert.ToUInt16(tryChar)); - AssertEquals("#P05", (ushort)1234, Convert.ToUInt16(tryDec)); - AssertEquals("#P06", (ushort)0, Convert.ToUInt16(tryDbl)); - AssertEquals("#P07", (ushort)1234, Convert.ToUInt16(tryInt16)); - AssertEquals("#P08", (ushort)12345, Convert.ToUInt16(tryInt32)); - AssertEquals("#P09", (ushort)43752, Convert.ToUInt16((long)43752)); - AssertEquals("#P10", (ushort)123, Convert.ToUInt16(trySByte)); - AssertEquals("#P11", (ushort)1234, Convert.ToUInt16(tryFloat)); - AssertEquals("#P12", (ushort)123, Convert.ToUInt16((string)"123")); - AssertEquals("#P13", (ushort)34567, Convert.ToUInt16(tryUI16)); - AssertEquals("#P14", (ushort)56789, Convert.ToUInt16((uint)56789)); - AssertEquals("#P15", (ushort)0, Convert.ToUInt16(tryUI64)); - AssertEquals("#P16", (ushort)31, Convert.ToUInt16("31", ci)); - AssertEquals("#P17", (ushort)14, Convert.ToUInt16("1110", 2)); - AssertEquals("#P18", (ushort)32, Convert.ToUInt16("40", 8)); - AssertEquals("#P19", (ushort)40, Convert.ToUInt16("40", 10)); - AssertEquals("#P20", (ushort)64, Convert.ToUInt16("40", 16)); + Assert.AreEqual ((ushort)0, Convert.ToUInt16(boolFalse), "#P01"); + Assert.AreEqual ((ushort)1, Convert.ToUInt16(boolTrue), "#P02"); + Assert.AreEqual ((ushort)0, Convert.ToUInt16(tryByte), "#P03"); + Assert.AreEqual ((ushort)97, Convert.ToUInt16(tryChar), "#P04"); + Assert.AreEqual ((ushort)1234, Convert.ToUInt16(tryDec), "#P05"); + Assert.AreEqual ((ushort)0, Convert.ToUInt16(tryDbl), "#P06"); + Assert.AreEqual ((ushort)1234, Convert.ToUInt16(tryInt16), "#P07"); + Assert.AreEqual ((ushort)12345, Convert.ToUInt16(tryInt32), "#P08"); + Assert.AreEqual ((ushort)43752, Convert.ToUInt16((long)43752), "#P09"); + Assert.AreEqual ((ushort)123, Convert.ToUInt16(trySByte), "#P10"); + Assert.AreEqual ((ushort)1234, Convert.ToUInt16(tryFloat), "#P11"); + Assert.AreEqual ((ushort)123, Convert.ToUInt16((string)"123"), "#P12"); + Assert.AreEqual ((ushort)34567, Convert.ToUInt16(tryUI16), "#P13"); + Assert.AreEqual ((ushort)56789, Convert.ToUInt16((uint)56789), "#P14"); + Assert.AreEqual ((ushort)0, Convert.ToUInt16(tryUI64), "#P15"); + Assert.AreEqual ((ushort)31, Convert.ToUInt16("31", ci), "#P16"); + Assert.AreEqual ((ushort)14, Convert.ToUInt16("1110", 2), "#P17"); + Assert.AreEqual ((ushort)32, Convert.ToUInt16("40", 8), "#P18"); + Assert.AreEqual ((ushort)40, Convert.ToUInt16("40", 10), "#P19"); + Assert.AreEqual ((ushort)64, Convert.ToUInt16("40", 16), "#P20"); try { Convert.ToUInt16(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P25", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#P25"); } try { Convert.ToUInt16(decimal.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P26", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P26"); } try { Convert.ToUInt16(decimal.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P27", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P27"); } try { Convert.ToUInt16(double.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P28", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P28"); } try { Convert.ToUInt16(double.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P29", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P29"); } try { Convert.ToUInt16(short.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P30", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P30"); } try { Convert.ToUInt16(int.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P31", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P31"); } try { Convert.ToUInt16(int.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P32", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P32"); } try { Convert.ToUInt16(long.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P33", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P33"); } try { Convert.ToUInt16(long.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P34", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P34"); } try { Convert.ToUInt16(tryObj); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P35", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#P35"); } try { Convert.ToUInt16(sbyte.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P36", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P36"); } try { Convert.ToUInt16(float.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P37", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P37"); } try { Convert.ToUInt16(float.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P38", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P38"); } try { Convert.ToUInt16("1A2"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P39", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#P39"); } try { Convert.ToUInt16("-32800"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P40", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P40"); } try { Convert.ToUInt16(int.MaxValue.ToString()); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P41", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P41"); } try { Convert.ToUInt16(ulong.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P42", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P42"); } try { Convert.ToUInt16("1A2", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P43", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#P43"); } try { Convert.ToUInt16("-32800", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P44", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P44"); } try { Convert.ToUInt16("456987", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P45", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#P45"); } try { Convert.ToUInt16("40", 9); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#P46", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#P46"); } try { Convert.ToUInt16 ("abcde", 16); - Fail (); + Assert.Fail (); } catch (Exception e) { - AssertEquals ("#P47", typeof (OverflowException), e.GetType ()); + Assert.AreEqual (typeof (OverflowException), e.GetType (), "#P47"); } } public void TestSignedToInt() { // String cannot contain a minus sign if the base is not 10. // But can if it is ten, and + is allowed everywhere. - AssertEquals("Signed0", -1, Convert.ToInt32 ("-1", 10)); - AssertEquals("Signed1", 1, Convert.ToInt32 ("+1", 10)); - AssertEquals("Signed2", 1, Convert.ToInt32 ("+1", 2)); - AssertEquals("Signed3", 1, Convert.ToInt32 ("+1", 8)); - AssertEquals("Signed4", 1, Convert.ToInt32 ("+1", 16)); + Assert.AreEqual (-1, Convert.ToInt32 ("-1", 10), "Signed0"); + Assert.AreEqual (1, Convert.ToInt32 ("+1", 10), "Signed1"); + Assert.AreEqual (1, Convert.ToInt32 ("+1", 2), "Signed2"); + Assert.AreEqual (1, Convert.ToInt32 ("+1", 8), "Signed3"); + Assert.AreEqual (1, Convert.ToInt32 ("+1", 16), "Signed4"); try { Convert.ToInt32("-1", 2); - Fail(); + Assert.Fail (); } catch (Exception) { } try { Convert.ToInt32("-1", 8); - Fail(); + Assert.Fail (); } catch (Exception) { } try { Convert.ToInt32("-1", 16); - Fail(); + Assert.Fail (); } catch (Exception) { } @@ -2272,193 +2271,193 @@ namespace MonoTests.System { } public void TestToUInt32() { - AssertEquals("#Q01", (uint)1, Convert.ToUInt32(boolTrue)); - AssertEquals("#Q02", (uint)0, Convert.ToUInt32(boolFalse)); - AssertEquals("#Q03", (uint)0, Convert.ToUInt32(tryByte)); - AssertEquals("#Q04", (uint)97, Convert.ToUInt32(tryChar)); - AssertEquals("#Q05", (uint)1234, Convert.ToUInt32(tryDec)); - AssertEquals("#Q06", (uint)0, Convert.ToUInt32(tryDbl)); - AssertEquals("#Q07", (uint)1234, Convert.ToUInt32(tryInt16)); - AssertEquals("#Q08", (uint)12345, Convert.ToUInt32(tryInt32)); - AssertEquals("#Q09", (uint)1234567890, Convert.ToUInt32((long)1234567890)); - AssertEquals("#Q10", (uint)123, Convert.ToUInt32(trySByte)); - AssertEquals("#Q11", (uint)1234, Convert.ToUInt32(tryFloat)); - AssertEquals("#Q12", (uint)3456789, Convert.ToUInt32("3456789")); - AssertEquals("#Q13", (uint)34567, Convert.ToUInt32(tryUI16)); - AssertEquals("#Q14", (uint)567891234, Convert.ToUInt32(tryUI32)); - AssertEquals("#Q15", (uint)0, Convert.ToUInt32(tryUI64)); - AssertEquals("#Q16", (uint)415, Convert.ToUInt32("110011111", 2)); - AssertEquals("#Q17", (uint)156, Convert.ToUInt32("234" ,8)); - AssertEquals("#Q18", (uint)234, Convert.ToUInt32("234" ,10)); - AssertEquals("#Q19", (uint)564, Convert.ToUInt32("234" ,16)); + Assert.AreEqual ((uint)1, Convert.ToUInt32(boolTrue), "#Q01"); + Assert.AreEqual ((uint)0, Convert.ToUInt32(boolFalse), "#Q02"); + Assert.AreEqual ((uint)0, Convert.ToUInt32(tryByte), "#Q03"); + Assert.AreEqual ((uint)97, Convert.ToUInt32(tryChar), "#Q04"); + Assert.AreEqual ((uint)1234, Convert.ToUInt32(tryDec), "#Q05"); + Assert.AreEqual ((uint)0, Convert.ToUInt32(tryDbl), "#Q06"); + Assert.AreEqual ((uint)1234, Convert.ToUInt32(tryInt16), "#Q07"); + Assert.AreEqual ((uint)12345, Convert.ToUInt32(tryInt32), "#Q08"); + Assert.AreEqual ((uint)1234567890, Convert.ToUInt32((long)1234567890), "#Q09"); + Assert.AreEqual ((uint)123, Convert.ToUInt32(trySByte), "#Q10"); + Assert.AreEqual ((uint)1234, Convert.ToUInt32(tryFloat), "#Q11"); + Assert.AreEqual ((uint)3456789, Convert.ToUInt32("3456789"), "#Q12"); + Assert.AreEqual ((uint)34567, Convert.ToUInt32(tryUI16), "#Q13"); + Assert.AreEqual ((uint)567891234, Convert.ToUInt32(tryUI32), "#Q14"); + Assert.AreEqual ((uint)0, Convert.ToUInt32(tryUI64), "#Q15"); + Assert.AreEqual ((uint)415, Convert.ToUInt32("110011111", 2), "#Q16"); + Assert.AreEqual ((uint)156, Convert.ToUInt32("234", 8), "#Q17"); + Assert.AreEqual ((uint)234, Convert.ToUInt32("234", 10), "#Q18"); + Assert.AreEqual ((uint)564, Convert.ToUInt32("234", 16), "#Q19"); try { Convert.ToUInt32(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q25", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#Q25"); } try { Convert.ToUInt32(decimal.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q26", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q26"); } try { Convert.ToUInt32((decimal)-150); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q27", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q27"); } try { Convert.ToUInt32(double.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q28", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q28"); } try { Convert.ToUInt32((double)-1); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q29", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q29"); } try { Convert.ToUInt32(short.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q30", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q30"); } try { Convert.ToUInt32(int.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q31", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q31"); } try { Convert.ToUInt32(long.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q32", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q32"); } try { Convert.ToUInt32((long)-50000); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q33", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q33"); } try { Convert.ToUInt32(new Exception()); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q34", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#Q34"); } try { Convert.ToUInt32(sbyte.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q35", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q35"); } try { Convert.ToUInt32(float.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q36", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q36"); } try { Convert.ToUInt32(float.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q37", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q37"); } try { Convert.ToUInt32("45t54"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q38", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#Q38"); } try { Convert.ToUInt32("-55"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q39", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q39"); } try { Convert.ToUInt32(ulong.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q40", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q40"); } try { Convert.ToUInt32(new Exception(), ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q41", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#Q41"); } try { Convert.ToUInt32(tryStr, ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q42", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#Q42"); } try { Convert.ToUInt32("-50", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q43", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q43"); } try { Convert.ToUInt32(decimal.MaxValue.ToString(), ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q44", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#Q44"); } try { Convert.ToUInt32("1001110", 1); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#Q45", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#Q45"); } } @@ -2466,205 +2465,205 @@ namespace MonoTests.System { { int iTest = 1; try { - AssertEquals("#R01", (ulong)1, Convert.ToUInt64(boolTrue)); + Assert.AreEqual ((ulong)1, Convert.ToUInt64(boolTrue), "#R01"); iTest++; - AssertEquals("#R02", (ulong)0, Convert.ToUInt64(boolFalse)); + Assert.AreEqual ((ulong)0, Convert.ToUInt64(boolFalse), "#R02"); iTest++; - AssertEquals("#R03", (ulong)0, Convert.ToUInt64(tryByte)); + Assert.AreEqual ((ulong)0, Convert.ToUInt64(tryByte), "#R03"); iTest++; - AssertEquals("#R04", (ulong)97, Convert.ToUInt64(tryChar)); + Assert.AreEqual ((ulong)97, Convert.ToUInt64(tryChar), "#R04"); iTest++; - AssertEquals("#R05", (ulong)1234, Convert.ToUInt64(tryDec)); + Assert.AreEqual ((ulong)1234, Convert.ToUInt64(tryDec), "#R05"); iTest++; - AssertEquals("#R06", (ulong)0, Convert.ToUInt64(tryDbl)); + Assert.AreEqual ((ulong)0, Convert.ToUInt64(tryDbl), "#R06"); iTest++; - AssertEquals("#R07", (ulong)1234, Convert.ToUInt64(tryInt16)); + Assert.AreEqual ((ulong)1234, Convert.ToUInt64(tryInt16), "#R07"); iTest++; - AssertEquals("#R08", (ulong)12345, Convert.ToUInt64(tryInt32)); + Assert.AreEqual ((ulong)12345, Convert.ToUInt64(tryInt32), "#R08"); iTest++; - AssertEquals("#R09", (ulong)123456789012, Convert.ToUInt64(tryInt64)); + Assert.AreEqual ((ulong)123456789012, Convert.ToUInt64(tryInt64), "#R09"); iTest++; - AssertEquals("#R10", (ulong)123, Convert.ToUInt64(trySByte)); + Assert.AreEqual ((ulong)123, Convert.ToUInt64(trySByte), "#R10"); iTest++; - AssertEquals("#R11", (ulong)1234, Convert.ToUInt64(tryFloat)); + Assert.AreEqual ((ulong)1234, Convert.ToUInt64(tryFloat), "#R11"); iTest++; - AssertEquals("#R12", (ulong)345678, Convert.ToUInt64("345678")); + Assert.AreEqual ((ulong)345678, Convert.ToUInt64("345678"), "#R12"); iTest++; - AssertEquals("#R13", (ulong)34567, Convert.ToUInt64(tryUI16)); + Assert.AreEqual ((ulong)34567, Convert.ToUInt64(tryUI16), "#R13"); iTest++; - AssertEquals("#R14", (ulong)567891234, Convert.ToUInt64(tryUI32)); + Assert.AreEqual ((ulong)567891234, Convert.ToUInt64(tryUI32), "#R14"); iTest++; - AssertEquals("#R15", (ulong)0, Convert.ToUInt64(tryUI64)); + Assert.AreEqual ((ulong)0, Convert.ToUInt64(tryUI64), "#R15"); iTest++; - AssertEquals("#R16", (ulong)123, Convert.ToUInt64("123", ci)); + Assert.AreEqual ((ulong)123, Convert.ToUInt64("123", ci), "#R16"); iTest++; - AssertEquals("#R17", (ulong)4, Convert.ToUInt64("100", 2)); + Assert.AreEqual ((ulong)4, Convert.ToUInt64("100", 2), "#R17"); iTest++; - AssertEquals("#R18", (ulong)64, Convert.ToUInt64("100", 8)); + Assert.AreEqual ((ulong)64, Convert.ToUInt64("100", 8), "#R18"); iTest++; - AssertEquals("#R19", (ulong)100, Convert.ToUInt64("100", 10)); + Assert.AreEqual ((ulong)100, Convert.ToUInt64("100", 10), "#R19"); iTest++; - AssertEquals("#R20", (ulong)256, Convert.ToUInt64("100", 16)); + Assert.AreEqual ((ulong)256, Convert.ToUInt64("100", 16), "#R20"); } catch (Exception e) { - Fail ("Unexpected exception caught when iTest = " + iTest + ": e = " + e); + Assert.Fail ("Unexpected exception caught when iTest = " + iTest + ": e = " + e); } try { Convert.ToUInt64(tryDT); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R25", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#R25"); } try { Convert.ToUInt64(decimal.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R26", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R26"); } try { Convert.ToUInt64((decimal)-140); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R27", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R27"); } try { Convert.ToUInt64(double.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R28", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R28"); } try { Convert.ToUInt64((double)-1); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R29", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R29"); } try { Convert.ToUInt64(short.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R30", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R30"); } try { Convert.ToUInt64(int.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R31", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R31"); } try { Convert.ToUInt64(long.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R32", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R32"); } try { Convert.ToUInt64(tryObj); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R33", typeof(InvalidCastException), e.GetType()); + Assert.AreEqual (typeof(InvalidCastException), e.GetType(), "#R33"); } try { Convert.ToUInt64(sbyte.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R34", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R34"); } try { Convert.ToUInt64(float.MinValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R35", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R35"); } try { Convert.ToUInt64(float.MaxValue); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R36", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R36"); } try { Convert.ToUInt64("234rt78"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R37", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#R37"); } try { Convert.ToUInt64("-68"); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R38", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R38"); } try { Convert.ToUInt64(decimal.MaxValue.ToString()); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R39", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R39"); } try { Convert.ToUInt64("23rd2", ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R40", typeof(FormatException), e.GetType()); + Assert.AreEqual (typeof(FormatException), e.GetType(), "#R40"); } try { Convert.ToUInt64(decimal.MinValue.ToString(), ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R41", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R41"); } try { Convert.ToUInt64(decimal.MaxValue.ToString(), ci); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R42", typeof(OverflowException), e.GetType()); + Assert.AreEqual (typeof(OverflowException), e.GetType(), "#R42"); } try { Convert.ToUInt64("132", 9); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#R43", typeof(ArgumentException), e.GetType()); + Assert.AreEqual (typeof(ArgumentException), e.GetType(), "#R43"); } - AssertEquals ("#L35", (ulong) 256, Convert.ToUInt64 ("0x100", 16)); - AssertEquals ("#L36", (ulong) 256, Convert.ToUInt64 ("0X100", 16)); - AssertEquals ("#L37", ulong.MaxValue, Convert.ToUInt64 ("0xFFFFFFFFFFFFFFFF", 16)); + Assert.AreEqual ((ulong) 256, Convert.ToUInt64 ("0x100", 16), "#L35"); + Assert.AreEqual ((ulong) 256, Convert.ToUInt64 ("0X100", 16), "#L36"); + Assert.AreEqual (ulong.MaxValue, Convert.ToUInt64 ("0xFFFFFFFFFFFFFFFF", 16), "#L37"); } [Test] @@ -2685,9 +2684,9 @@ namespace MonoTests.System { byte[] bb = new byte[] { 1, 2, 3}; string s = Convert.ToBase64String (bb); byte [] b2 = Convert.FromBase64String (" " + s); - Assertion.AssertEquals ("#01", 3, b2.Length); + Assert.AreEqual (3, b2.Length, "#01"); for (int i = 0; i < 3; i++) - Assertion.AssertEquals ("#0" + (i + 2), bb [i], b2 [i]); + Assert.AreEqual (bb [i], b2 [i], "#0" + (i + 2)); } public void TestToBase64CharArray () @@ -2700,7 +2699,7 @@ namespace MonoTests.System { Convert.ToBase64CharArray(byteArr, 0, byteArr.Length, result, 0); for (int i = 0; i < expectedCharArr.Length; i++) { - AssertEquals("#S0" + i, expectedCharArr[i], result[i]); + Assert.AreEqual (expectedCharArr[i], result[i], "#S0" + i); } } @@ -2793,39 +2792,39 @@ namespace MonoTests.System { result1 = Convert.ToBase64String(byteArr); result2 = Convert.ToBase64String(byteArr, 0, byteArr.Length); - AssertEquals("#T01", expectedStr, result1); - AssertEquals("#T02", expectedStr, result2); + Assert.AreEqual (expectedStr, result1, "#T01"); + Assert.AreEqual (expectedStr, result2, "#T02"); try { Convert.ToBase64String(null); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#T05", typeof(ArgumentNullException), e.GetType()); + Assert.AreEqual (typeof(ArgumentNullException), e.GetType(), "#T05"); } try { Convert.ToBase64String(byteArr, -1, byteArr.Length); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#T06", typeof(ArgumentOutOfRangeException), e.GetType()); + Assert.AreEqual (typeof(ArgumentOutOfRangeException), e.GetType(), "#T06"); } try { Convert.ToBase64String(byteArr, 0, -10); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#T07", typeof(ArgumentOutOfRangeException), e.GetType()); + Assert.AreEqual (typeof(ArgumentOutOfRangeException), e.GetType(), "#T07"); } try { Convert.ToBase64String(byteArr, 4, byteArr.Length); - Fail(); + Assert.Fail (); } catch (Exception e) { - AssertEquals("#T08", typeof(ArgumentOutOfRangeException), e.GetType()); + Assert.AreEqual (typeof(ArgumentOutOfRangeException), e.GetType(), "#T08"); } } #if NET_2_0 @@ -2834,7 +2833,7 @@ namespace MonoTests.System { { byte[] bs = Convert.FromBase64String ("ZuBZ7PESb3VRXgrl/KSRJd/hTGBvaEvEplqH3izPomDv5nBjS9MzcD1h8tOWzS7/wYGnaip8\nbhBfCrpWxivi8G7R08oBcADIiclpZeqRxai9kG4WoBUzJ6MCbxuvb1k757q+D9nqoL0p9Rer\n+5+vNodYkHYwqnKKyMBSQ11sspw=\n"); string s = Convert.ToBase64String (bs, Base64FormattingOptions.None); - Assert ("no new line", !s.Contains ("\n")); + Assert.IsTrue (!s.Contains ("\n"), "no new line"); } #endif /* Have experienced some problems with FromBase64CharArray using mono. Something @@ -2912,7 +2911,7 @@ namespace MonoTests.System { byte[] fromCharArr = Convert.FromBase64CharArray(charArr, 0, 8); for (int i = 0; i < fromCharArr.Length; i++){ - AssertEquals("#U0" + i, expectedByteArr[i], fromCharArr[i]); + Assert.AreEqual (expectedByteArr[i], fromCharArr[i], "#U0" + i); } } @@ -2947,7 +2946,7 @@ namespace MonoTests.System { public void FromBase64String_InvalidLengthBecauseOfIgnoredChars () { byte[] result = Convert.FromBase64String ("AAAA\t"); - AssertEquals ("InvalidLengthBecauseOfIgnoredChars", 3, result.Length); + Assert.AreEqual (3, result.Length, "InvalidLengthBecauseOfIgnoredChars"); } private const string ignored = "\t\r\n "; @@ -2958,11 +2957,11 @@ namespace MonoTests.System { { string s = ignored + base64data; byte[] data = Convert.FromBase64String (s); - AssertEquals ("String-IgnoreCharsBefore-Ignored", 15, data.Length); + Assert.AreEqual (15, data.Length, "String-IgnoreCharsBefore-Ignored"); char[] c = s.ToCharArray (); data = Convert.FromBase64CharArray (c, 0, c.Length); - AssertEquals ("CharArray-IgnoreCharsBefore-Ignored", 15, data.Length); + Assert.AreEqual (15, data.Length, "CharArray-IgnoreCharsBefore-Ignored"); } [Test] @@ -2970,11 +2969,11 @@ namespace MonoTests.System { { string s = base64data + ignored + base64data; byte[] data = Convert.FromBase64String (s); - AssertEquals ("String-IgnoreCharsInside-Ignored", 30, data.Length); + Assert.AreEqual (30, data.Length, "String-IgnoreCharsInside-Ignored"); char[] c = s.ToCharArray (); data = Convert.FromBase64CharArray (c, 0, c.Length); - AssertEquals ("CharArray-IgnoreCharsInside-Ignored", 30, data.Length); + Assert.AreEqual (30, data.Length, "CharArray-IgnoreCharsInside-Ignored"); } [Test] @@ -2982,18 +2981,18 @@ namespace MonoTests.System { { string s = base64data + ignored; byte[] data = Convert.FromBase64String (s); - AssertEquals ("String-IgnoreCharsAfter-Ignored", 15, data.Length); + Assert.AreEqual (15, data.Length, "String-IgnoreCharsAfter-Ignored"); char[] c = s.ToCharArray (); data = Convert.FromBase64CharArray (c, 0, c.Length); - AssertEquals ("CharArray-IgnoreCharsAfter-Ignored", 15, data.Length); + Assert.AreEqual (15, data.Length, "CharArray-IgnoreCharsAfter-Ignored"); } [Test] [Category ("TargetJvmNotWorking")] public void FromBase64_Empty () { - AssertEquals (new byte[0], Convert.FromBase64String (string.Empty)); + Assert.AreEqual (new byte[0], Convert.FromBase64String (string.Empty)); } [Test] @@ -3003,7 +3002,7 @@ namespace MonoTests.System { public void FromBase64_OnlyWhiteSpace () { #if NET_2_0 - AssertEquals (new byte[0], Convert.FromBase64String (" \r\t")); + Assert.AreEqual (new byte[0], Convert.FromBase64String (" \r\t")); #else Convert.FromBase64String (" \r\t"); #endif @@ -3028,55 +3027,55 @@ namespace MonoTests.System { { string base64 = "\n fdy6S2NLpnT4fMdokUHSHsmpcvo= "; byte [] bytes = Convert.FromBase64String (base64); - AssertEquals ("#01", 20, bytes.Length); + Assert.AreEqual (20, bytes.Length, "#01"); byte [] target = new byte [] { 0x7D, 0xDC, 0xBA, 0x4B, 0x63, 0x4B, 0xA6, 0x74, 0xF8, 0x7C, 0xC7, 0x68, 0x91, 0x41, 0xD2, 0x1E, 0xC9, 0xA9, 0x72, 0xFA }; for (int i = 0; i < 20; i++) { if (bytes [i] != target [i]) - Fail ("Item #" + i); + Assert.Fail ("Item #" + i); } } public void TestConvertFromNull() { - AssertEquals ("#W1", false, Convert.ToBoolean (null as object)); - AssertEquals ("#W2", 0, Convert.ToByte (null as object)); - AssertEquals ("#W3", 0, Convert.ToChar (null as object)); - AssertEquals ("#W4", new DateTime (1,1,1,0,0,0), Convert.ToDateTime (null as object)); - AssertEquals ("#W5", 0, Convert.ToDecimal (null as object)); - AssertEquals ("#W6", 0, Convert.ToDouble (null as object)); - AssertEquals ("#W7", 0, Convert.ToInt16 (null as object)); - AssertEquals ("#W8", 0, Convert.ToInt32 (null as object)); - AssertEquals ("#W9", 0, Convert.ToInt64 (null as object)); - AssertEquals ("#W10", 0, Convert.ToSByte (null as object)); - AssertEquals ("#W11", 0, Convert.ToSingle (null as object)); - AssertEquals ("#W12", "", Convert.ToString (null as object)); - AssertEquals ("#W13", 0, Convert.ToUInt16 (null as object)); - AssertEquals ("#W14", 0, Convert.ToUInt32 (null as object)); - AssertEquals ("#W15", 0, Convert.ToUInt64 (null as object)); - AssertEquals ("#W16", false, Convert.ToBoolean (null as string)); - AssertEquals ("#W17", 0, Convert.ToByte (null as string)); + Assert.AreEqual (false, Convert.ToBoolean (null as object), "#W1"); + Assert.AreEqual (0, Convert.ToByte (null as object), "#W2"); + Assert.AreEqual (0, Convert.ToChar (null as object), "#W3"); + Assert.AreEqual (new DateTime (1, 1, 1, 0, 0, 0), Convert.ToDateTime (null as object), "#W4"); + Assert.AreEqual (0, Convert.ToDecimal (null as object), "#W5"); + Assert.AreEqual (0, Convert.ToDouble (null as object), "#W6"); + Assert.AreEqual (0, Convert.ToInt16 (null as object), "#W7"); + Assert.AreEqual (0, Convert.ToInt32 (null as object), "#W8"); + Assert.AreEqual (0, Convert.ToInt64 (null as object), "#W9"); + Assert.AreEqual (0, Convert.ToSByte (null as object), "#W10"); + Assert.AreEqual (0, Convert.ToSingle (null as object), "#W11"); + Assert.AreEqual ("", Convert.ToString (null as object), "#W12"); + Assert.AreEqual (0, Convert.ToUInt16 (null as object), "#W13"); + Assert.AreEqual (0, Convert.ToUInt32 (null as object), "#W14"); + Assert.AreEqual (0, Convert.ToUInt64 (null as object), "#W15"); + Assert.AreEqual (false, Convert.ToBoolean (null as string), "#W16"); + Assert.AreEqual (0, Convert.ToByte (null as string), "#W17"); try { Convert.ToChar (null as string); - Fail (); + Assert.Fail (); } catch (Exception e) { - AssertEquals ("#W18", typeof (ArgumentNullException), e.GetType ()); + Assert.AreEqual (typeof (ArgumentNullException), e.GetType (), "#W18"); } - AssertEquals ("#W19", new DateTime (1,1,1,0,0,0), Convert.ToDateTime (null as string)); - AssertEquals ("#W20", 0, Convert.ToDecimal (null as string)); - AssertEquals ("#W21", 0, Convert.ToDouble (null as string)); - AssertEquals ("#W22", 0, Convert.ToInt16 (null as string)); - AssertEquals ("#W23", 0, Convert.ToInt32 (null as string)); - AssertEquals ("#W24", 0, Convert.ToInt64 (null as string)); - AssertEquals ("#W25", 0, Convert.ToSByte (null as string)); - AssertEquals ("#W26", 0, Convert.ToSingle (null as string)); - AssertEquals ("#W27", null, Convert.ToString (null as string)); - AssertEquals ("#W28", 0, Convert.ToUInt16 (null as string)); - AssertEquals ("#W29", 0, Convert.ToUInt32 (null as string)); - AssertEquals ("#W30", 0, Convert.ToUInt64 (null as string)); + Assert.AreEqual (new DateTime (1, 1, 1, 0, 0, 0), Convert.ToDateTime (null as string), "#W19"); + Assert.AreEqual (0, Convert.ToDecimal (null as string), "#W20"); + Assert.AreEqual (0, Convert.ToDouble (null as string), "#W21"); + Assert.AreEqual (0, Convert.ToInt16 (null as string), "#W22"); + Assert.AreEqual (0, Convert.ToInt32 (null as string), "#W23"); + Assert.AreEqual (0, Convert.ToInt64 (null as string), "#W24"); + Assert.AreEqual (0, Convert.ToSByte (null as string), "#W25"); + Assert.AreEqual (0, Convert.ToSingle (null as string), "#W26"); + Assert.AreEqual (null, Convert.ToString (null as string), "#W27"); + Assert.AreEqual (0, Convert.ToUInt16 (null as string), "#W28"); + Assert.AreEqual (0, Convert.ToUInt32 (null as string), "#W29"); + Assert.AreEqual (0, Convert.ToUInt64 (null as string), "#W30"); } [Test] @@ -3096,17 +3095,17 @@ namespace MonoTests.System { [Test] public void ToByte_PrefixedHexStringInBase16 () { - AssertEquals ("0xff", 255, Convert.ToByte ("0xff", 16)); - AssertEquals ("0xfF", 255, Convert.ToByte ("0xfF", 16)); - AssertEquals ("0xFf", 255, Convert.ToByte ("0xFf", 16)); - AssertEquals ("0xFF", 255, Convert.ToByte ("0xFF", 16)); + Assert.AreEqual (255, Convert.ToByte ("0xff", 16), "0xff"); + Assert.AreEqual (255, Convert.ToByte ("0xfF", 16), "0xfF"); + Assert.AreEqual (255, Convert.ToByte ("0xFf", 16), "0xFf"); + Assert.AreEqual (255, Convert.ToByte ("0xFF", 16), "0xFF"); - AssertEquals ("0Xff", 255, Convert.ToByte ("0Xff", 16)); - AssertEquals ("0XfF", 255, Convert.ToByte ("0XfF", 16)); - AssertEquals ("0XFf", 255, Convert.ToByte ("0XFf", 16)); - AssertEquals ("0XFF", 255, Convert.ToByte ("0XFF", 16)); + Assert.AreEqual (255, Convert.ToByte ("0Xff", 16), "0Xff"); + Assert.AreEqual (255, Convert.ToByte ("0XfF", 16), "0XfF"); + Assert.AreEqual (255, Convert.ToByte ("0XFf", 16), "0XFf"); + Assert.AreEqual (255, Convert.ToByte ("0XFF", 16), "0XFF"); - AssertEquals ("0x0", Byte.MinValue, Convert.ToByte ("0x0", 16)); + Assert.AreEqual (Byte.MinValue, Convert.ToByte ("0x0", 16), "0x0"); } [Test] @@ -3226,81 +3225,81 @@ namespace MonoTests.System { [Test] public void ToByte_MaxValue () { - AssertEquals ("ff,16", Byte.MaxValue, Convert.ToByte ("ff", 16)); - AssertEquals ("0xFF,16", Byte.MaxValue, Convert.ToByte ("0XFF", 16)); - AssertEquals ("255,10", Byte.MaxValue, Convert.ToByte ("255", 10)); - AssertEquals ("377,8", Byte.MaxValue, Convert.ToByte ("377", 8)); - AssertEquals ("11111111,2", Byte.MaxValue, Convert.ToByte ("11111111", 2)); + Assert.AreEqual (Byte.MaxValue, Convert.ToByte ("ff", 16), "ff,16"); + Assert.AreEqual (Byte.MaxValue, Convert.ToByte ("0XFF", 16), "0xFF,16"); + Assert.AreEqual (Byte.MaxValue, Convert.ToByte ("255", 10), "255,10"); + Assert.AreEqual (Byte.MaxValue, Convert.ToByte ("377", 8), "377,8"); + Assert.AreEqual (Byte.MaxValue, Convert.ToByte ("11111111", 2), "11111111,2"); } [Test] public void ToByte_MinValue () { - AssertEquals ("0,16", Byte.MinValue, Convert.ToByte ("0", 16)); - AssertEquals ("0x0,16", Byte.MinValue, Convert.ToByte ("0x0", 16)); - AssertEquals ("0,10", Byte.MinValue, Convert.ToByte ("0", 10)); - AssertEquals ("0,8", Byte.MinValue, Convert.ToByte ("0", 8)); - AssertEquals ("0,2", Byte.MinValue, Convert.ToByte ("0", 2)); + Assert.AreEqual (Byte.MinValue, Convert.ToByte ("0", 16), "0,16"); + Assert.AreEqual (Byte.MinValue, Convert.ToByte ("0x0", 16), "0x0,16"); + Assert.AreEqual (Byte.MinValue, Convert.ToByte ("0", 10), "0,10"); + Assert.AreEqual (Byte.MinValue, Convert.ToByte ("0", 8), "0,8"); + Assert.AreEqual (Byte.MinValue, Convert.ToByte ("0", 2), "0,2"); } [Test] public void ToUInt16_MaxValue () { - AssertEquals ("ffff,16", UInt16.MaxValue, Convert.ToUInt16 ("ffff", 16)); - AssertEquals ("0XFFFF,16", UInt16.MaxValue, Convert.ToUInt16 ("0XFFFF", 16)); - AssertEquals ("65535,10", UInt16.MaxValue, Convert.ToUInt16 ("65535", 10)); - AssertEquals ("177777,8", UInt16.MaxValue, Convert.ToUInt16 ("177777", 8)); - AssertEquals ("1111111111111111,2", UInt16.MaxValue, Convert.ToUInt16 ("1111111111111111", 2)); + Assert.AreEqual (UInt16.MaxValue, Convert.ToUInt16 ("ffff", 16), "ffff,16"); + Assert.AreEqual (UInt16.MaxValue, Convert.ToUInt16 ("0XFFFF", 16), "0XFFFF,16"); + Assert.AreEqual (UInt16.MaxValue, Convert.ToUInt16 ("65535", 10), "65535,10"); + Assert.AreEqual (UInt16.MaxValue, Convert.ToUInt16 ("177777", 8), "177777,8"); + Assert.AreEqual (UInt16.MaxValue, Convert.ToUInt16 ("1111111111111111", 2), "1111111111111111,2"); } [Test] public void ToUInt16_MinValue () { - AssertEquals ("0,16", UInt16.MinValue, Convert.ToUInt16 ("0", 16)); - AssertEquals ("0x0,16", UInt16.MinValue, Convert.ToUInt16 ("0x0", 16)); - AssertEquals ("0,10", UInt16.MinValue, Convert.ToUInt16 ("0", 10)); - AssertEquals ("0,8", UInt16.MinValue, Convert.ToUInt16 ("0", 8)); - AssertEquals ("0,2", UInt16.MinValue, Convert.ToUInt16 ("0", 2)); + Assert.AreEqual (UInt16.MinValue, Convert.ToUInt16 ("0", 16), "0,16"); + Assert.AreEqual (UInt16.MinValue, Convert.ToUInt16 ("0x0", 16), "0x0,16"); + Assert.AreEqual (UInt16.MinValue, Convert.ToUInt16 ("0", 10), "0,10"); + Assert.AreEqual (UInt16.MinValue, Convert.ToUInt16 ("0", 8), "0,8"); + Assert.AreEqual (UInt16.MinValue, Convert.ToUInt16 ("0", 2), "0,2"); } [Test] public void ToUInt32_MaxValue () { - AssertEquals ("ffffffff,16", UInt32.MaxValue, Convert.ToUInt32 ("ffffffff", 16)); - AssertEquals ("0XFFFFFFFF,16", UInt32.MaxValue, Convert.ToUInt32 ("0XFFFFFFFF", 16)); - AssertEquals ("4294967295,10", UInt32.MaxValue, Convert.ToUInt32 ("4294967295", 10)); - AssertEquals ("37777777777,8", UInt32.MaxValue, Convert.ToUInt32 ("37777777777", 8)); - AssertEquals ("11111111111111111111111111111111,2", UInt32.MaxValue, Convert.ToUInt32 ("11111111111111111111111111111111", 2)); + Assert.AreEqual (UInt32.MaxValue, Convert.ToUInt32 ("ffffffff", 16), "ffffffff,16"); + Assert.AreEqual (UInt32.MaxValue, Convert.ToUInt32 ("0XFFFFFFFF", 16), "0XFFFFFFFF,16"); + Assert.AreEqual (UInt32.MaxValue, Convert.ToUInt32 ("4294967295", 10), "4294967295,10"); + Assert.AreEqual (UInt32.MaxValue, Convert.ToUInt32 ("37777777777", 8), "37777777777,8"); + Assert.AreEqual (UInt32.MaxValue, Convert.ToUInt32 ("11111111111111111111111111111111", 2), "11111111111111111111111111111111,2"); } [Test] public void ToUInt32_MinValue () { - AssertEquals ("0,16", UInt32.MinValue, Convert.ToUInt32 ("0", 16)); - AssertEquals ("0x0,16", UInt32.MinValue, Convert.ToUInt32 ("0x0", 16)); - AssertEquals ("0,10", UInt32.MinValue, Convert.ToUInt32 ("0", 10)); - AssertEquals ("0,8", UInt32.MinValue, Convert.ToUInt32 ("0", 8)); - AssertEquals ("0,2", UInt32.MinValue, Convert.ToUInt32 ("0", 2)); + Assert.AreEqual (UInt32.MinValue, Convert.ToUInt32 ("0", 16), "0,16"); + Assert.AreEqual (UInt32.MinValue, Convert.ToUInt32 ("0x0", 16), "0x0,16"); + Assert.AreEqual (UInt32.MinValue, Convert.ToUInt32 ("0", 10), "0,10"); + Assert.AreEqual (UInt32.MinValue, Convert.ToUInt32 ("0", 8), "0,8"); + Assert.AreEqual (UInt32.MinValue, Convert.ToUInt32 ("0", 2), "0,2"); } [Test] public void ToUInt64_MaxValue () { - AssertEquals ("ffffffffffffffff,16", UInt64.MaxValue, Convert.ToUInt64 ("ffffffffffffffff", 16)); - AssertEquals ("0XFFFFFFFFFFFFFFFF,16", UInt64.MaxValue, Convert.ToUInt64 ("0XFFFFFFFFFFFFFFFF", 16)); - AssertEquals ("18446744073709551615,10", UInt64.MaxValue, Convert.ToUInt64 ("18446744073709551615", 10)); - AssertEquals ("1777777777777777777777,8", UInt64.MaxValue, Convert.ToUInt64 ("1777777777777777777777", 8)); - AssertEquals ("1111111111111111111111111111111111111111111111111111111111111111,2", UInt64.MaxValue, Convert.ToUInt64 ("1111111111111111111111111111111111111111111111111111111111111111", 2)); + Assert.AreEqual (UInt64.MaxValue, Convert.ToUInt64 ("ffffffffffffffff", 16), "ffffffffffffffff,16"); + Assert.AreEqual (UInt64.MaxValue, Convert.ToUInt64 ("0XFFFFFFFFFFFFFFFF", 16), "0XFFFFFFFFFFFFFFFF,16"); + Assert.AreEqual (UInt64.MaxValue, Convert.ToUInt64 ("18446744073709551615", 10), "18446744073709551615,10"); + Assert.AreEqual (UInt64.MaxValue, Convert.ToUInt64 ("1777777777777777777777", 8), "1777777777777777777777,8"); + Assert.AreEqual (UInt64.MaxValue, Convert.ToUInt64 ("1111111111111111111111111111111111111111111111111111111111111111", 2), "1111111111111111111111111111111111111111111111111111111111111111,2"); } [Test] public void ToUInt64_MinValue () { - AssertEquals ("0,16", UInt64.MinValue, Convert.ToUInt64 ("0", 16)); - AssertEquals ("0x0,16", UInt64.MinValue, Convert.ToUInt64 ("0x0", 16)); - AssertEquals ("0,10", UInt64.MinValue, Convert.ToUInt64 ("0", 10)); - AssertEquals ("0,8", UInt64.MinValue, Convert.ToUInt64 ("0", 8)); - AssertEquals ("0,2", UInt64.MinValue, Convert.ToUInt64 ("0", 2)); + Assert.AreEqual (UInt64.MinValue, Convert.ToUInt64 ("0", 16), "0,16"); + Assert.AreEqual (UInt64.MinValue, Convert.ToUInt64 ("0x0", 16), "0x0,16"); + Assert.AreEqual (UInt64.MinValue, Convert.ToUInt64 ("0", 10), "0,10"); + Assert.AreEqual (UInt64.MinValue, Convert.ToUInt64 ("0", 8), "0,8"); + Assert.AreEqual (UInt64.MinValue, Convert.ToUInt64 ("0", 2), "0,2"); } // min/max signed @@ -3308,78 +3307,78 @@ namespace MonoTests.System { [Test] public void ToSByte_MaxValue () { - AssertEquals ("7F,16", SByte.MaxValue, Convert.ToSByte ("7f", 16)); - AssertEquals ("0X7F,16", SByte.MaxValue, Convert.ToSByte ("0X7F", 16)); - AssertEquals ("127,10", SByte.MaxValue, Convert.ToSByte ("127", 10)); - AssertEquals ("177,8", SByte.MaxValue, Convert.ToSByte ("177", 8)); - AssertEquals ("1111111,2", SByte.MaxValue, Convert.ToSByte ("1111111", 2)); + Assert.AreEqual (SByte.MaxValue, Convert.ToSByte ("7f", 16), "7F,16"); + Assert.AreEqual (SByte.MaxValue, Convert.ToSByte ("0X7F", 16), "0X7F,16"); + Assert.AreEqual (SByte.MaxValue, Convert.ToSByte ("127", 10), "127,10"); + Assert.AreEqual (SByte.MaxValue, Convert.ToSByte ("177", 8), "177,8"); + Assert.AreEqual (SByte.MaxValue, Convert.ToSByte ("1111111", 2), "1111111,2"); } [Test] public void ToSByte_MinValue () { - AssertEquals ("80,16", SByte.MinValue, Convert.ToSByte ("80", 16)); - AssertEquals ("-128,10", SByte.MinValue, Convert.ToSByte ("-128", 10)); - AssertEquals ("200,8", SByte.MinValue, Convert.ToSByte ("200", 8)); - AssertEquals ("10000000,2", SByte.MinValue, Convert.ToSByte ("10000000", 2)); + Assert.AreEqual (SByte.MinValue, Convert.ToSByte ("80", 16), "80,16"); + Assert.AreEqual (SByte.MinValue, Convert.ToSByte ("-128", 10), "-128,10"); + Assert.AreEqual (SByte.MinValue, Convert.ToSByte ("200", 8), "200,8"); + Assert.AreEqual (SByte.MinValue, Convert.ToSByte ("10000000", 2), "10000000,2"); } [Test] public void ToInt16_MaxValue () { - AssertEquals ("7FFF,16", Int16.MaxValue, Convert.ToInt16 ("7fff", 16)); - AssertEquals ("0X7FFF,16", Int16.MaxValue, Convert.ToInt16 ("0X7FFF", 16)); - AssertEquals ("32767,10", Int16.MaxValue, Convert.ToInt16 ("32767", 10)); - AssertEquals ("77777,8", Int16.MaxValue, Convert.ToInt16 ("77777", 8)); - AssertEquals ("111111111111111,2", Int16.MaxValue, Convert.ToInt16 ("111111111111111", 2)); + Assert.AreEqual (Int16.MaxValue, Convert.ToInt16 ("7fff", 16), "7FFF,16"); + Assert.AreEqual (Int16.MaxValue, Convert.ToInt16 ("0X7FFF", 16), "0X7FFF,16"); + Assert.AreEqual (Int16.MaxValue, Convert.ToInt16 ("32767", 10), "32767,10"); + Assert.AreEqual (Int16.MaxValue, Convert.ToInt16 ("77777", 8), "77777,8"); + Assert.AreEqual (Int16.MaxValue, Convert.ToInt16 ("111111111111111", 2), "111111111111111,2"); } [Test] public void ToInt16_MinValue () { - AssertEquals ("8000,16", Int16.MinValue, Convert.ToInt16 ("8000", 16)); - AssertEquals ("-32768,10", Int16.MinValue, Convert.ToInt16 ("-32768", 10)); - AssertEquals ("100000,8", Int16.MinValue, Convert.ToInt16 ("100000", 8)); - AssertEquals ("1000000000000000,2", Int16.MinValue, Convert.ToInt16 ("1000000000000000", 2)); + Assert.AreEqual (Int16.MinValue, Convert.ToInt16 ("8000", 16), "8000,16"); + Assert.AreEqual (Int16.MinValue, Convert.ToInt16 ("-32768", 10), "-32768,10"); + Assert.AreEqual (Int16.MinValue, Convert.ToInt16 ("100000", 8), "100000,8"); + Assert.AreEqual (Int16.MinValue, Convert.ToInt16 ("1000000000000000", 2), "1000000000000000,2"); } [Test] public void ToInt32_MaxValue () { - AssertEquals ("7fffffff,16", Int32.MaxValue, Convert.ToInt32 ("7fffffff", 16)); - AssertEquals ("0X7FFFFFFF,16", Int32.MaxValue, Convert.ToInt32 ("0X7FFFFFFF", 16)); - AssertEquals ("2147483647,10", Int32.MaxValue, Convert.ToInt32 ("2147483647", 10)); - AssertEquals ("17777777777,8", Int32.MaxValue, Convert.ToInt32 ("17777777777", 8)); - AssertEquals ("1111111111111111111111111111111,2", Int32.MaxValue, Convert.ToInt32 ("1111111111111111111111111111111", 2)); + Assert.AreEqual (Int32.MaxValue, Convert.ToInt32 ("7fffffff", 16), "7fffffff,16"); + Assert.AreEqual (Int32.MaxValue, Convert.ToInt32 ("0X7FFFFFFF", 16), "0X7FFFFFFF,16"); + Assert.AreEqual (Int32.MaxValue, Convert.ToInt32 ("2147483647", 10), "2147483647,10"); + Assert.AreEqual (Int32.MaxValue, Convert.ToInt32 ("17777777777", 8), "17777777777,8"); + Assert.AreEqual (Int32.MaxValue, Convert.ToInt32 ("1111111111111111111111111111111", 2), "1111111111111111111111111111111,2"); } [Test] public void ToInt32_MinValue () { - AssertEquals ("80000000,16", Int32.MinValue, Convert.ToInt32 ("80000000", 16)); - AssertEquals ("-2147483648,10", Int32.MinValue, Convert.ToInt32 ("-2147483648", 10)); - AssertEquals ("20000000000,8", Int32.MinValue, Convert.ToInt32 ("20000000000", 8)); - AssertEquals ("10000000000000000000000000000000,2", Int32.MinValue, Convert.ToInt32 ("10000000000000000000000000000000", 2)); + Assert.AreEqual (Int32.MinValue, Convert.ToInt32 ("80000000", 16), "80000000,16"); + Assert.AreEqual (Int32.MinValue, Convert.ToInt32 ("-2147483648", 10), "-2147483648,10"); + Assert.AreEqual (Int32.MinValue, Convert.ToInt32 ("20000000000", 8), "20000000000,8"); + Assert.AreEqual (Int32.MinValue, Convert.ToInt32 ("10000000000000000000000000000000", 2), "10000000000000000000000000000000,2"); } [Test] public void ToInt64_MaxValue () { - AssertEquals ("7fffffffffffffff,16", Int64.MaxValue, Convert.ToInt64 ("7fffffffffffffff", 16)); - AssertEquals ("0X7FFFFFFFFFFFFFFF,16", Int64.MaxValue, Convert.ToInt64 ("0X7FFFFFFFFFFFFFFF", 16)); - AssertEquals ("9223372036854775807,10", Int64.MaxValue, Convert.ToInt64 ("9223372036854775807", 10)); - AssertEquals ("777777777777777777777,8", Int64.MaxValue, Convert.ToInt64 ("777777777777777777777", 8)); - AssertEquals ("111111111111111111111111111111111111111111111111111111111111111,2", Int64.MaxValue, Convert.ToInt64 ("111111111111111111111111111111111111111111111111111111111111111", 2)); + Assert.AreEqual (Int64.MaxValue, Convert.ToInt64 ("7fffffffffffffff", 16), "7fffffffffffffff,16"); + Assert.AreEqual (Int64.MaxValue, Convert.ToInt64 ("0X7FFFFFFFFFFFFFFF", 16), "0X7FFFFFFFFFFFFFFF,16"); + Assert.AreEqual (Int64.MaxValue, Convert.ToInt64 ("9223372036854775807", 10), "9223372036854775807,10"); + Assert.AreEqual (Int64.MaxValue, Convert.ToInt64 ("777777777777777777777", 8), "777777777777777777777,8"); + Assert.AreEqual (Int64.MaxValue, Convert.ToInt64 ("111111111111111111111111111111111111111111111111111111111111111", 2), "111111111111111111111111111111111111111111111111111111111111111,2"); } [Test] public void ToInt64_MinValue () { - AssertEquals ("8000000000000000,16", Int64.MinValue, Convert.ToInt64 ("8000000000000000", 16)); - AssertEquals ("0x8000000000000000,16", Int64.MinValue, Convert.ToInt64 ("0x8000000000000000", 16)); - AssertEquals ("-9223372036854775808,10", Int64.MinValue, Convert.ToInt64 ("-9223372036854775808", 10)); - AssertEquals ("1000000000000000000000,8", Int64.MinValue, Convert.ToInt64 ("1000000000000000000000", 8)); - AssertEquals ("1000000000000000000000000000000000000000000000000000000000000000,2", Int64.MinValue, Convert.ToInt64 ("1000000000000000000000000000000000000000000000000000000000000000", 2)); + Assert.AreEqual (Int64.MinValue, Convert.ToInt64 ("8000000000000000", 16), "8000000000000000,16"); + Assert.AreEqual (Int64.MinValue, Convert.ToInt64 ("0x8000000000000000", 16), "0x8000000000000000,16"); + Assert.AreEqual (Int64.MinValue, Convert.ToInt64 ("-9223372036854775808", 10), "-9223372036854775808,10"); + Assert.AreEqual (Int64.MinValue, Convert.ToInt64 ("1000000000000000000000", 8), "1000000000000000000000,8"); + Assert.AreEqual (Int64.MinValue, Convert.ToInt64 ("1000000000000000000000000000000000000000000000000000000000000000", 2), "1000000000000000000000000000000000000000000000000000000000000000,2"); } // signed types @@ -3519,23 +3518,23 @@ namespace MonoTests.System { { string s = null; // signed - AssertEquals ("ToSByte", 0, Convert.ToSByte (s)); - AssertEquals ("ToSByte+base", 0, Convert.ToSByte (s, 10)); - AssertEquals ("ToInt16", 0, Convert.ToInt16 (s)); - AssertEquals ("ToInt16+base", 0, Convert.ToInt16 (s, 10)); - AssertEquals ("ToInt32", 0, Convert.ToInt32 (s)); - AssertEquals ("ToInt32+base", 0, Convert.ToInt32 (s, 10)); - AssertEquals ("ToInt64", 0, Convert.ToInt64 (s)); - AssertEquals ("ToInt64+base", 0, Convert.ToInt64 (s, 10)); + Assert.AreEqual (0, Convert.ToSByte (s), "ToSByte"); + Assert.AreEqual (0, Convert.ToSByte (s, 10), "ToSByte+base"); + Assert.AreEqual (0, Convert.ToInt16 (s), "ToInt16"); + Assert.AreEqual (0, Convert.ToInt16 (s, 10), "ToInt16+base"); + Assert.AreEqual (0, Convert.ToInt32 (s), "ToInt32"); + Assert.AreEqual (0, Convert.ToInt32 (s, 10), "ToInt32+base"); + Assert.AreEqual (0, Convert.ToInt64 (s), "ToInt64"); + Assert.AreEqual (0, Convert.ToInt64 (s, 10), "ToInt64+base"); // unsigned - AssertEquals ("ToByte", 0, Convert.ToByte (s)); - AssertEquals ("ToByte+base", 0, Convert.ToByte (s, 10)); - AssertEquals ("ToUInt16", 0, Convert.ToUInt16 (s)); - AssertEquals ("ToUInt16+base", 0, Convert.ToUInt16 (s, 10)); - AssertEquals ("ToUInt32", 0, Convert.ToUInt32 (s)); - AssertEquals ("ToUInt32+base", 0, Convert.ToUInt32 (s, 10)); - AssertEquals ("ToUInt64", 0, Convert.ToUInt64 (s)); - AssertEquals ("ToUInt64+base", 0, Convert.ToUInt64 (s, 10)); + Assert.AreEqual (0, Convert.ToByte (s), "ToByte"); + Assert.AreEqual (0, Convert.ToByte (s, 10), "ToByte+base"); + Assert.AreEqual (0, Convert.ToUInt16 (s), "ToUInt16"); + Assert.AreEqual (0, Convert.ToUInt16 (s, 10), "ToUInt16+base"); + Assert.AreEqual (0, Convert.ToUInt32 (s), "ToUInt32"); + Assert.AreEqual (0, Convert.ToUInt32 (s, 10), "ToUInt32+base"); + Assert.AreEqual (0, Convert.ToUInt64 (s), "ToUInt64"); + Assert.AreEqual (0, Convert.ToUInt64 (s, 10), "ToUInt64+base"); } [Test] @@ -3543,15 +3542,15 @@ namespace MonoTests.System { { object o = null; // signed - AssertEquals ("ToSByte", 0, Convert.ToSByte (o)); - AssertEquals ("ToInt16", 0, Convert.ToInt16 (o)); - AssertEquals ("ToInt32", 0, Convert.ToInt32 (o)); - AssertEquals ("ToInt64", 0, Convert.ToInt64 (o)); + Assert.AreEqual (0, Convert.ToSByte (o), "ToSByte"); + Assert.AreEqual (0, Convert.ToInt16 (o), "ToInt16"); + Assert.AreEqual (0, Convert.ToInt32 (o), "ToInt32"); + Assert.AreEqual (0, Convert.ToInt64 (o), "ToInt64"); // unsigned - AssertEquals ("ToByte", 0, Convert.ToByte (o)); - AssertEquals ("ToUInt16", 0, Convert.ToUInt16 (o)); - AssertEquals ("ToUInt32", 0, Convert.ToUInt32 (o)); - AssertEquals ("ToUInt64", 0, Convert.ToUInt64 (o)); + Assert.AreEqual (0, Convert.ToByte (o), "ToByte"); + Assert.AreEqual (0, Convert.ToUInt16 (o), "ToUInt16"); + Assert.AreEqual (0, Convert.ToUInt32 (o), "ToUInt32"); + Assert.AreEqual (0, Convert.ToUInt64 (o), "ToUInt64"); } [Test] @@ -3560,15 +3559,15 @@ namespace MonoTests.System { object o = null; IFormatProvider fp = (IFormatProvider) new NumberFormatInfo (); // signed - AssertEquals ("ToSByte", 0, Convert.ToSByte (o, fp)); - AssertEquals ("ToInt16", 0, Convert.ToInt16 (o, fp)); - AssertEquals ("ToInt32", 0, Convert.ToInt32 (o, fp)); - AssertEquals ("ToInt64", 0, Convert.ToInt64 (o, fp)); + Assert.AreEqual (0, Convert.ToSByte (o, fp), "ToSByte"); + Assert.AreEqual (0, Convert.ToInt16 (o, fp), "ToInt16"); + Assert.AreEqual (0, Convert.ToInt32 (o, fp), "ToInt32"); + Assert.AreEqual (0, Convert.ToInt64 (o, fp), "ToInt64"); // unsigned - AssertEquals ("ToByte", 0, Convert.ToByte (o, fp)); - AssertEquals ("ToUInt16", 0, Convert.ToUInt16 (o, fp)); - AssertEquals ("ToUInt32", 0, Convert.ToUInt32 (o, fp)); - AssertEquals ("ToUInt64", 0, Convert.ToUInt64 (o, fp)); + Assert.AreEqual (0, Convert.ToByte (o, fp), "ToByte"); + Assert.AreEqual (0, Convert.ToUInt16 (o, fp), "ToUInt16"); + Assert.AreEqual (0, Convert.ToUInt32 (o, fp), "ToUInt32"); + Assert.AreEqual (0, Convert.ToUInt64 (o, fp), "ToUInt64"); } [Test] @@ -3587,14 +3586,14 @@ namespace MonoTests.System { IFormatProvider fp = (IFormatProvider) new NumberFormatInfo (); // signed // No SByte here - AssertEquals ("ToInt16", 0, Convert.ToInt16 (s, fp)); - AssertEquals ("ToInt32", 0, Convert.ToInt32 (s, fp)); - AssertEquals ("ToInt64", 0, Convert.ToInt64 (s, fp)); + Assert.AreEqual (0, Convert.ToInt16 (s, fp), "ToInt16"); + Assert.AreEqual (0, Convert.ToInt32 (s, fp), "ToInt32"); + Assert.AreEqual (0, Convert.ToInt64 (s, fp), "ToInt64"); // unsigned - AssertEquals ("ToByte", 0, Convert.ToByte (s, fp)); - AssertEquals ("ToUInt16", 0, Convert.ToUInt16 (s, fp)); - AssertEquals ("ToUInt32", 0, Convert.ToUInt32 (s, fp)); - AssertEquals ("ToUInt64", 0, Convert.ToUInt64 (s, fp)); + Assert.AreEqual (0, Convert.ToByte (s, fp), "ToByte"); + Assert.AreEqual (0, Convert.ToUInt16 (s, fp), "ToUInt16"); + Assert.AreEqual (0, Convert.ToUInt32 (s, fp), "ToUInt32"); + Assert.AreEqual (0, Convert.ToUInt64 (s, fp), "ToUInt64"); } [Test] @@ -3621,45 +3620,45 @@ namespace MonoTests.System { [Test] public void ToString_MinMax_WithBase () { - AssertEquals ("Byte.MinValue base 2", "0", Convert.ToString (Byte.MinValue, 2)); - AssertEquals ("Byte.MinValue base 8", "0", Convert.ToString (Byte.MinValue, 8)); - AssertEquals ("Byte.MinValue base 10", "0", Convert.ToString (Byte.MinValue, 10)); - AssertEquals ("Byte.MinValue base 16", "0", Convert.ToString (Byte.MinValue, 16)); + Assert.AreEqual ("0", Convert.ToString (Byte.MinValue, 2), "Byte.MinValue base 2"); + Assert.AreEqual ("0", Convert.ToString (Byte.MinValue, 8), "Byte.MinValue base 8"); + Assert.AreEqual ("0", Convert.ToString (Byte.MinValue, 10), "Byte.MinValue base 10"); + Assert.AreEqual ("0", Convert.ToString (Byte.MinValue, 16), "Byte.MinValue base 16"); - AssertEquals ("Byte.MaxValue base 2", "11111111", Convert.ToString (Byte.MaxValue, 2)); - AssertEquals ("Byte.MaxValue base 8", "377", Convert.ToString (Byte.MaxValue, 8)); - AssertEquals ("Byte.MaxValue base 10", "255", Convert.ToString (Byte.MaxValue, 10)); - AssertEquals ("Byte.MaxValue base 16", "ff", Convert.ToString (Byte.MaxValue, 16)); + Assert.AreEqual ("11111111", Convert.ToString (Byte.MaxValue, 2), "Byte.MaxValue base 2"); + Assert.AreEqual ("377", Convert.ToString (Byte.MaxValue, 8), "Byte.MaxValue base 8"); + Assert.AreEqual ("255", Convert.ToString (Byte.MaxValue, 10), "Byte.MaxValue base 10"); + Assert.AreEqual ("ff", Convert.ToString (Byte.MaxValue, 16), "Byte.MaxValue base 16"); - AssertEquals ("Int16.MinValue base 2", "1000000000000000", Convert.ToString (Int16.MinValue, 2)); - AssertEquals ("Int16.MinValue base 8", "100000", Convert.ToString (Int16.MinValue, 8)); - AssertEquals ("Int16.MinValue base 10", "-32768", Convert.ToString (Int16.MinValue, 10)); - AssertEquals ("Int16.MinValue base 16", "8000", Convert.ToString (Int16.MinValue, 16)); + Assert.AreEqual ("1000000000000000", Convert.ToString (Int16.MinValue, 2), "Int16.MinValue base 2"); + Assert.AreEqual ("100000", Convert.ToString (Int16.MinValue, 8), "Int16.MinValue base 8"); + Assert.AreEqual ("-32768", Convert.ToString (Int16.MinValue, 10), "Int16.MinValue base 10"); + Assert.AreEqual ("8000", Convert.ToString (Int16.MinValue, 16), "Int16.MinValue base 16"); - AssertEquals ("Int16.MaxValue base 2", "111111111111111", Convert.ToString (Int16.MaxValue, 2)); - AssertEquals ("Int16.MaxValue base 8", "77777", Convert.ToString (Int16.MaxValue, 8)); - AssertEquals ("Int16.MaxValue base 10", "32767", Convert.ToString (Int16.MaxValue, 10)); - AssertEquals ("Int16.MaxValue base 16", "7fff", Convert.ToString (Int16.MaxValue, 16)); + Assert.AreEqual ("111111111111111", Convert.ToString (Int16.MaxValue, 2), "Int16.MaxValue base 2"); + Assert.AreEqual ("77777", Convert.ToString (Int16.MaxValue, 8), "Int16.MaxValue base 8"); + Assert.AreEqual ("32767", Convert.ToString (Int16.MaxValue, 10), "Int16.MaxValue base 10"); + Assert.AreEqual ("7fff", Convert.ToString (Int16.MaxValue, 16), "Int16.MaxValue base 16"); - AssertEquals ("Int32.MinValue base 2", "10000000000000000000000000000000", Convert.ToString (Int32.MinValue, 2)); - AssertEquals ("Int32.MinValue base 8", "20000000000", Convert.ToString (Int32.MinValue, 8)); - AssertEquals ("Int32.MinValue base 10", "-2147483648", Convert.ToString (Int32.MinValue, 10)); - AssertEquals ("Int32.MinValue base 16", "80000000", Convert.ToString (Int32.MinValue, 16)); + Assert.AreEqual ("10000000000000000000000000000000", Convert.ToString (Int32.MinValue, 2), "Int32.MinValue base 2"); + Assert.AreEqual ("20000000000", Convert.ToString (Int32.MinValue, 8), "Int32.MinValue base 8"); + Assert.AreEqual ("-2147483648", Convert.ToString (Int32.MinValue, 10), "Int32.MinValue base 10"); + Assert.AreEqual ("80000000", Convert.ToString (Int32.MinValue, 16), "Int32.MinValue base 16"); - AssertEquals ("Int32.MaxValue base 2", "1111111111111111111111111111111", Convert.ToString (Int32.MaxValue, 2)); - AssertEquals ("Int32.MaxValue base 8", "17777777777", Convert.ToString (Int32.MaxValue, 8)); - AssertEquals ("Int32.MaxValue base 10", "2147483647", Convert.ToString (Int32.MaxValue, 10)); - AssertEquals ("Int32.MaxValue base 16", "7fffffff", Convert.ToString (Int32.MaxValue, 16)); + Assert.AreEqual ("1111111111111111111111111111111", Convert.ToString (Int32.MaxValue, 2), "Int32.MaxValue base 2"); + Assert.AreEqual ("17777777777", Convert.ToString (Int32.MaxValue, 8), "Int32.MaxValue base 8"); + Assert.AreEqual ("2147483647", Convert.ToString (Int32.MaxValue, 10), "Int32.MaxValue base 10"); + Assert.AreEqual ("7fffffff", Convert.ToString (Int32.MaxValue, 16), "Int32.MaxValue base 16"); - AssertEquals ("Int64.MinValue base 2", "1000000000000000000000000000000000000000000000000000000000000000", Convert.ToString (Int64.MinValue, 2)); - AssertEquals ("Int64.MinValue base 8", "1000000000000000000000", Convert.ToString (Int64.MinValue, 8)); - AssertEquals ("Int64.MinValue base 10", "-9223372036854775808", Convert.ToString (Int64.MinValue, 10)); - AssertEquals ("Int64.MinValue base 16", "8000000000000000", Convert.ToString (Int64.MinValue, 16)); + Assert.AreEqual ("1000000000000000000000000000000000000000000000000000000000000000", Convert.ToString (Int64.MinValue, 2), "Int64.MinValue base 2"); + Assert.AreEqual ("1000000000000000000000", Convert.ToString (Int64.MinValue, 8), "Int64.MinValue base 8"); + Assert.AreEqual ("-9223372036854775808", Convert.ToString (Int64.MinValue, 10), "Int64.MinValue base 10"); + Assert.AreEqual ("8000000000000000", Convert.ToString (Int64.MinValue, 16), "Int64.MinValue base 16"); - AssertEquals ("Int64.MaxValue base 2", "111111111111111111111111111111111111111111111111111111111111111", Convert.ToString (Int64.MaxValue, 2)); - AssertEquals ("Int64.MaxValue base 8", "777777777777777777777", Convert.ToString (Int64.MaxValue, 8)); - AssertEquals ("Int64.MaxValue base 10", "9223372036854775807", Convert.ToString (Int64.MaxValue, 10)); - AssertEquals ("Int64.MaxValue base 16", "7fffffffffffffff", Convert.ToString (Int64.MaxValue, 16)); + Assert.AreEqual ("111111111111111111111111111111111111111111111111111111111111111", Convert.ToString (Int64.MaxValue, 2), "Int64.MaxValue base 2"); + Assert.AreEqual ("777777777777777777777", Convert.ToString (Int64.MaxValue, 8), "Int64.MaxValue base 8"); + Assert.AreEqual ("9223372036854775807", Convert.ToString (Int64.MaxValue, 10), "Int64.MaxValue base 10"); + Assert.AreEqual ("7fffffffffffffff", Convert.ToString (Int64.MaxValue, 16), "Int64.MaxValue base 16"); } [Test] @@ -3833,40 +3832,40 @@ namespace MonoTests.System { [Test] public void ToSByte_Base16_MinMax () { - AssertEquals ("80,16", SByte.MinValue, Convert.ToSByte ("80", 16)); - AssertEquals ("0x80,16", SByte.MinValue, Convert.ToSByte ("0x80", 16)); - AssertEquals ("0X80,16", SByte.MinValue, Convert.ToSByte ("0X80", 16)); + Assert.AreEqual (SByte.MinValue, Convert.ToSByte ("80", 16), "80,16"); + Assert.AreEqual (SByte.MinValue, Convert.ToSByte ("0x80", 16), "0x80,16"); + Assert.AreEqual (SByte.MinValue, Convert.ToSByte ("0X80", 16), "0X80,16"); - AssertEquals ("7f,16", SByte.MaxValue, Convert.ToSByte ("7f", 16)); - AssertEquals ("7F,16", SByte.MaxValue, Convert.ToSByte ("7F", 16)); - AssertEquals ("0x7f,16", SByte.MaxValue, Convert.ToSByte ("0x7f", 16)); - AssertEquals ("0X7F,16", SByte.MaxValue, Convert.ToSByte ("0X7F", 16)); + Assert.AreEqual (SByte.MaxValue, Convert.ToSByte ("7f", 16), "7f,16"); + Assert.AreEqual (SByte.MaxValue, Convert.ToSByte ("7F", 16), "7F,16"); + Assert.AreEqual (SByte.MaxValue, Convert.ToSByte ("0x7f", 16), "0x7f,16"); + Assert.AreEqual (SByte.MaxValue, Convert.ToSByte ("0X7F", 16), "0X7F,16"); } [Test] public void ToInt16_Base16_MinMax () { - AssertEquals ("8000,16", short.MinValue, Convert.ToInt16 ("8000", 16)); - AssertEquals ("0x8000,16", short.MinValue, Convert.ToInt16 ("0x8000", 16)); - AssertEquals ("0X8000,16", short.MinValue, Convert.ToInt16 ("0X8000", 16)); + Assert.AreEqual (short.MinValue, Convert.ToInt16 ("8000", 16), "8000,16"); + Assert.AreEqual (short.MinValue, Convert.ToInt16 ("0x8000", 16), "0x8000,16"); + Assert.AreEqual (short.MinValue, Convert.ToInt16 ("0X8000", 16), "0X8000,16"); - AssertEquals ("7fff,16", short.MaxValue, Convert.ToInt16 ("7fff", 16)); - AssertEquals ("7FFF,16", short.MaxValue, Convert.ToInt16 ("7FFF", 16)); - AssertEquals ("0x7fff,16", short.MaxValue, Convert.ToInt16 ("0x7fff", 16)); - AssertEquals ("0X7FFF,16", short.MaxValue, Convert.ToInt16 ("0X7FFF", 16)); + Assert.AreEqual (short.MaxValue, Convert.ToInt16 ("7fff", 16), "7fff,16"); + Assert.AreEqual (short.MaxValue, Convert.ToInt16 ("7FFF", 16), "7FFF,16"); + Assert.AreEqual (short.MaxValue, Convert.ToInt16 ("0x7fff", 16), "0x7fff,16"); + Assert.AreEqual (short.MaxValue, Convert.ToInt16 ("0X7FFF", 16), "0X7FFF,16"); } [Test] public void ToInt32_Base16_MinMax () { - AssertEquals ("80000000,16", int.MinValue, Convert.ToInt32 ("80000000", 16)); - AssertEquals ("0x80000000,16", int.MinValue, Convert.ToInt32 ("0x80000000", 16)); - AssertEquals ("0X80000000,16", int.MinValue, Convert.ToInt32 ("0X80000000", 16)); + Assert.AreEqual (int.MinValue, Convert.ToInt32 ("80000000", 16), "80000000,16"); + Assert.AreEqual (int.MinValue, Convert.ToInt32 ("0x80000000", 16), "0x80000000,16"); + Assert.AreEqual (int.MinValue, Convert.ToInt32 ("0X80000000", 16), "0X80000000,16"); - AssertEquals ("7fffffff,16", int.MaxValue, Convert.ToInt32 ("7fffffff", 16)); - AssertEquals ("7FFFFFFF,16", int.MaxValue, Convert.ToInt32 ("7FFFFFFF", 16)); - AssertEquals ("0x7fffffff,16", int.MaxValue, Convert.ToInt32 ("0x7fffffff", 16)); - AssertEquals ("0X7FFFFFFF,16", int.MaxValue, Convert.ToInt32 ("0X7FFFFFFF", 16)); + Assert.AreEqual (int.MaxValue, Convert.ToInt32 ("7fffffff", 16), "7fffffff,16"); + Assert.AreEqual (int.MaxValue, Convert.ToInt32 ("7FFFFFFF", 16), "7FFFFFFF,16"); + Assert.AreEqual (int.MaxValue, Convert.ToInt32 ("0x7fffffff", 16), "0x7fffffff,16"); + Assert.AreEqual (int.MaxValue, Convert.ToInt32 ("0X7FFFFFFF", 16), "0X7FFFFFFF,16"); } [Test] @@ -4602,16 +4601,16 @@ namespace MonoTests.System { { BitmapStatus bitmapStatus = new BitmapStatus (3); Image c1 = Convert.ChangeType (bitmapStatus, typeof (Image)) as Image; - AssertNotNull ("#A1", c1); - AssertEquals ("#A2", 32, c1.ColorDepth); + Assert.IsNotNull (c1, "#A1"); + Assert.AreEqual (32, c1.ColorDepth, "#A2"); bitmapStatus.ConvertToImage = false; object c2 = Convert.ChangeType (bitmapStatus, typeof (Image)); - AssertNull ("#B", c2); + Assert.IsNull (c2, "#B"); object c3 = Convert.ChangeType (bitmapStatus, typeof (int)); - AssertNotNull ("#C1", c3); - AssertEquals ("#C2", 3, c3); + Assert.IsNotNull (c3, "#C1"); + Assert.AreEqual (3, c3, "#C2"); } // This is a simple and happy struct. diff --git a/mcs/class/corlib/Test/System/DateTimeOffsetTest.cs b/mcs/class/corlib/Test/System/DateTimeOffsetTest.cs index 7b96bf04ace..2cd5196b0ff 100644 --- a/mcs/class/corlib/Test/System/DateTimeOffsetTest.cs +++ b/mcs/class/corlib/Test/System/DateTimeOffsetTest.cs @@ -344,6 +344,74 @@ namespace MonoTests.System { } } + [Test] + public void ParseDateOnly () + { + DateTimeOffset dto = DateTimeOffset.Parse ("2009/06/14"); + Assert.AreEqual (14, dto.Day, "Day"); + Assert.AreEqual (6, dto.Month, "Month"); + Assert.AreEqual (2009, dto.Year, "Year"); + } + + [Test] + public void ParseTimeOnly () + { + DateTimeOffset dto = DateTimeOffset.Parse ("2:3:4"); + Assert.AreEqual (2, dto.Hour, "Hour"); + Assert.AreEqual (3, dto.Minute, "Minute"); + Assert.AreEqual (4, dto.Second, "Second"); + } + + [Test] + public void ParseTimeTZ () + { + DateTimeOffset dto = DateTimeOffset.Parse ("2:30:40 +3:4"); + Assert.AreEqual (2, dto.Hour, "Hour"); + Assert.AreEqual (30, dto.Minute, "Minute"); + Assert.AreEqual (40, dto.Second, "Second"); + Assert.AreEqual (3, dto.Offset.Hours, "Offset Hours"); + Assert.AreEqual (4, dto.Offset.Minutes, "Offset Minutes"); + } + + [Test] + public void ParseTimePMTZ () + { + DateTimeOffset dto = DateTimeOffset.Parse ("3:30:40 PM -3:4"); + Assert.AreEqual (15, dto.Hour, "Hour"); + Assert.AreEqual (30, dto.Minute, "Minute"); + Assert.AreEqual (40, dto.Second, "Second"); + Assert.AreEqual (-3, dto.Offset.Hours, "Offset Hours"); + Assert.AreEqual (-4, dto.Offset.Minutes, "Offset Minutes"); + } + + [Test] + public void ParseFull1 () + { + DateTimeOffset dto = DateTimeOffset.Parse ("2009/06/14 2:30:40 AM -03:04"); + Assert.AreEqual (14, dto.Day, "Day"); + Assert.AreEqual (6, dto.Month, "Month"); + Assert.AreEqual (2009, dto.Year, "Year"); + Assert.AreEqual (2, dto.Hour, "Hour"); + Assert.AreEqual (30, dto.Minute, "Minute"); + Assert.AreEqual (40, dto.Second, "Second"); + Assert.AreEqual (-3, dto.Offset.Hours, "Offset Hours"); + Assert.AreEqual (-4, dto.Offset.Minutes, "Offset Minutes"); + } + + [Test] + [ExpectedException (typeof (ArgumentOutOfRangeException))] + public void ParseUnderflow () + { + DateTimeOffset.Parse ("01/01/0001 0:0 +09:00"); + } + + [Test] + [ExpectedException (typeof (ArgumentOutOfRangeException))] + public void ParseOverflow () + { + DateTimeOffset.Parse ("12/31/9999 23:59 -09:00"); + } + [Test] public void ParseExactWithFractions () { diff --git a/mcs/class/corlib/Test/System/DateTimeTest.cs b/mcs/class/corlib/Test/System/DateTimeTest.cs index 88fece61ff1..bbafafa0d5a 100644 --- a/mcs/class/corlib/Test/System/DateTimeTest.cs +++ b/mcs/class/corlib/Test/System/DateTimeTest.cs @@ -40,10 +40,10 @@ namespace MonoTests.System internal void DTAssertEquals (DateTime actual, DateTime expected, Resolution resolution) { - DTAssertEquals ("", actual, expected, resolution); + DTAssertEquals (actual, expected, resolution, ""); } - internal void DTAssertEquals (string message, DateTime expected, DateTime actual, Resolution resolution) + internal void DTAssertEquals (DateTime expected, DateTime actual, Resolution resolution, string message) { if ((resolution & Resolution.Year) != 0) Assert.AreEqual (expected.Year, actual.Year, message); @@ -562,6 +562,18 @@ namespace MonoTests.System DateTimeStyles.AllowInnerWhite); } + [Test] + public void TestParseExact5 () + { + DateTime dt = DateTime.ParseExact ("Wed, 12 May 2004 20:51:09 -02:30", + @"ddd, d MMM yyyy H:m:s zzz", + CultureInfo.CreateSpecificCulture("en-us"), + DateTimeStyles.AllowInnerWhite); + dt = dt.ToUniversalTime (); + Assert.AreEqual (23, dt.Hour, "Hour"); + Assert.AreEqual (21, dt.Minute, "Minute"); + } + [Test] public void TestParseExact () { @@ -1339,7 +1351,7 @@ namespace MonoTests.System { double number=5000.41443; DateTime d = DateTime.FromOADate(number); - DTAssertEquals ("#1", d, new DateTime(1913, 9, 8, 9, 56, 46, 0), Resolution.Second); + DTAssertEquals (d, new DateTime(1913, 9, 8, 9, 56, 46, 0), Resolution.Second, "#1"); Assert.AreEqual (d.ToOADate(), number, "#2"); } diff --git a/mcs/class/corlib/Test/System/DecimalFormatterTest.cs b/mcs/class/corlib/Test/System/DecimalFormatterTest.cs index a409b9e15e2..19da4bf47f8 100644 --- a/mcs/class/corlib/Test/System/DecimalFormatterTest.cs +++ b/mcs/class/corlib/Test/System/DecimalFormatterTest.cs @@ -85,7 +85,7 @@ namespace MonoTests.System // Test all the formatstrings in the FormatTest array. // If a test fails the "DecF #" equals the index of the array. foreach (FormatString fTest in FormatTest) { - Assertion.AssertEquals ("DecF #" + fTest.TestNumber, fTest.ExpectedResult, fTest.Number.ToString (fTest.Format)); + Assert.AreEqual (fTest.ExpectedResult, fTest.Number.ToString (fTest.Format), "DecF #" + fTest.TestNumber); } } diff --git a/mcs/class/corlib/Test/System/DecimalTest.cs b/mcs/class/corlib/Test/System/DecimalTest.cs index fd61b18769e..1b6cdbee1e0 100644 --- a/mcs/class/corlib/Test/System/DecimalTest.cs +++ b/mcs/class/corlib/Test/System/DecimalTest.cs @@ -64,7 +64,7 @@ namespace MonoTests.System } [TestFixture] - public class DecimalTest : Assertion + public class DecimalTest { private const int negativeBitValue = unchecked ((int) 0x80000000); private const int negativeScale4Value = unchecked ((int) 0x80040000); @@ -215,13 +215,13 @@ namespace MonoTests.System for (int i = 0; i < tab.Length; i++) { try { string s = tab [i].d.ToString (tab [i].format, nfi); - AssertEquals ("A01 tab[" + i + "].format = '" + tab [i].format + "')", tab [i].str, s); + Assert.AreEqual (tab [i].str, s, "A01 tab[" + i + "].format = '" + tab [i].format + "')"); } catch (OverflowException) { - Fail (tab [i].d.ToString (tab [i].format, nfi) + " (format = '" + tab [i].format + "'): unexpected exception !"); + Assert.Fail (tab [i].d.ToString (tab [i].format, nfi) + " (format = '" + tab [i].format + "'): unexpected exception !"); } catch (NUnit.Framework.AssertionException e) { throw e; } catch (Exception e) { - Fail ("Unexpected Exception when i = " + i + ". e = " + e); + Assert.Fail ("Unexpected Exception when i = " + i + ". e = " + e); } } } @@ -241,7 +241,7 @@ namespace MonoTests.System for (int i = 0; i < ergCurrencyNegativePattern.Length; i++) { nfi2.CurrencyNegativePattern = i; if (d.ToString ("C", nfi2) != ergCurrencyNegativePattern [i]) { - Fail ("CurrencyNegativePattern #" + i + " failed: " + + Assert.Fail ("CurrencyNegativePattern #" + i + " failed: " + d.ToString ("C", nfi2) + " != " + ergCurrencyNegativePattern [i]); } } @@ -254,7 +254,7 @@ namespace MonoTests.System for (int i = 0; i < ergCurrencyPositivePattern.Length; i++) { nfi2.CurrencyPositivePattern = i; if (d.ToString ("C", nfi2) != ergCurrencyPositivePattern [i]) { - Fail ("CurrencyPositivePattern #" + i + " failed: " + + Assert.Fail ("CurrencyPositivePattern #" + i + " failed: " + d.ToString ("C", nfi2) + " != " + ergCurrencyPositivePattern [i]); } } @@ -271,7 +271,7 @@ namespace MonoTests.System for (int i = 0; i < ergNumberNegativePattern.Length; i++) { nfi2.NumberNegativePattern = i; - AssertEquals ("NumberNegativePattern #" + i, ergNumberNegativePattern [i], d.ToString ("N", nfi2)); + Assert.AreEqual (ergNumberNegativePattern [i], d.ToString ("N", nfi2), "NumberNegativePattern #" + i); } } @@ -288,7 +288,7 @@ namespace MonoTests.System for (int i = 0; i < ergPercentNegativePattern.Length; i++) { nfi2.PercentNegativePattern = i; if (d.ToString ("P", nfi2) != ergPercentNegativePattern [i]) { - Fail ("PercentNegativePattern #" + i + " failed: " + + Assert.Fail ("PercentNegativePattern #" + i + " failed: " + d.ToString ("P", nfi2) + " != " + ergPercentNegativePattern [i]); } } @@ -301,7 +301,7 @@ namespace MonoTests.System for (int i = 0; i < ergPercentPositivePattern.Length; i++) { nfi2.PercentPositivePattern = i; if (d.ToString ("P", nfi2) != ergPercentPositivePattern [i]) { - Fail ("PercentPositivePattern #" + i + " failed: " + + Assert.Fail ("PercentPositivePattern #" + i + " failed: " + d.ToString ("P", nfi2) + " != " + ergPercentPositivePattern [i]); } } @@ -334,34 +334,34 @@ namespace MonoTests.System try { d = Decimal.Parse (tab [i].str, tab [i].style, NumberFormatInfo.InvariantInfo); if (tab [i].exceptionFlag) { - Fail (tab [i].str + ": missing exception !"); + Assert.Fail (tab [i].str + ": missing exception !"); } else if (d != tab [i].d) { - Fail (tab [i].str + " != " + d); + Assert.Fail (tab [i].str + " != " + d); } } catch (OverflowException) { if (!tab [i].exceptionFlag) { - Fail (tab [i].str + ": unexpected exception !"); + Assert.Fail (tab [i].str + ": unexpected exception !"); } } } try { d = Decimal.Parse (null); - Fail ("Expected ArgumentNullException"); + Assert.Fail ("Expected ArgumentNullException"); } catch (ArgumentNullException) { //ok } try { d = Decimal.Parse ("123nx"); - Fail ("Expected FormatException"); + Assert.Fail ("Expected FormatException"); } catch (FormatException) { //ok } try { d = Decimal.Parse ("79228162514264337593543950336"); - Fail ("Expected OverflowException" + d); + Assert.Fail ("Expected OverflowException" + d); } catch (OverflowException) { //ok } @@ -370,12 +370,12 @@ namespace MonoTests.System [Test] public void TestConstants () { - AssertEquals ("Zero", 0m, Decimal.Zero); - AssertEquals ("One", 1m, Decimal.One); - AssertEquals ("MinusOne", -1m, Decimal.MinusOne); - AssertEquals ("MaxValue", 79228162514264337593543950335m, Decimal.MaxValue); - AssertEquals ("MinValue", -79228162514264337593543950335m, Decimal.MinValue); - Assert ("MinusOne 2", -1m == Decimal.MinusOne); + Assert.AreEqual (0m, Decimal.Zero, "Zero"); + Assert.AreEqual (1m, Decimal.One, "One"); + Assert.AreEqual (-1m, Decimal.MinusOne, "MinusOne"); + Assert.AreEqual (79228162514264337593543950335m, Decimal.MaxValue, "MaxValue"); + Assert.AreEqual (-79228162514264337593543950335m, Decimal.MinValue, "MinValue"); + Assert.IsTrue (-1m == Decimal.MinusOne, "MinusOne 2"); } [Test] @@ -389,20 +389,20 @@ namespace MonoTests.System for (int i = 0; i < dtab.GetLength (0); i++) { d = new Decimal (itab [i]); if ((decimal) d != dtab [i]) { - Fail ("Int32 -> Decimal: " + itab [i] + " != " + d); + Assert.Fail ("Int32 -> Decimal: " + itab [i] + " != " + d); } else { int n = (int) d; if (n != itab [i]) { - Fail ("Decimal -> Int32: " + d + " != " + itab [i]); + Assert.Fail ("Decimal -> Int32: " + d + " != " + itab [i]); } } } d = new Decimal (Int32.MaxValue); - Assert ((int) d == Int32.MaxValue); + Assert.IsTrue ((int) d == Int32.MaxValue); d = new Decimal (Int32.MinValue); - Assert ((int) d == Int32.MinValue); + Assert.IsTrue ((int) d == Int32.MinValue); } [Test] @@ -416,20 +416,20 @@ namespace MonoTests.System for (int i = 0; i < dtab.GetLength (0); i++) { d = new Decimal (itab [i]); if ((decimal) d != dtab [i]) { - Fail ("UInt32 -> Decimal: " + itab [i] + " != " + d); + Assert.Fail ("UInt32 -> Decimal: " + itab [i] + " != " + d); } else { uint n = (uint) d; if (n != itab [i]) { - Fail ("Decimal -> UInt32: " + d + " != " + itab [i]); + Assert.Fail ("Decimal -> UInt32: " + d + " != " + itab [i]); } } } d = new Decimal (UInt32.MaxValue); - Assert ((uint) d == UInt32.MaxValue); + Assert.IsTrue ((uint) d == UInt32.MaxValue); d = new Decimal (UInt32.MinValue); - Assert ((uint) d == UInt32.MinValue); + Assert.IsTrue ((uint) d == UInt32.MinValue); } [Test] @@ -443,20 +443,20 @@ namespace MonoTests.System for (int i = 0; i < dtab.GetLength (0); i++) { d = new Decimal (itab [i]); if ((decimal) d != dtab [i]) { - Fail ("Int64 -> Decimal: " + itab [i] + " != " + d); + Assert.Fail ("Int64 -> Decimal: " + itab [i] + " != " + d); } else { long n = (long) d; if (n != itab [i]) { - Fail ("Decimal -> Int64: " + d + " != " + itab [i]); + Assert.Fail ("Decimal -> Int64: " + d + " != " + itab [i]); } } } d = new Decimal (Int64.MaxValue); - Assert ((long) d == Int64.MaxValue); + Assert.IsTrue ((long) d == Int64.MaxValue); d = new Decimal (Int64.MinValue); - Assert ((long) d == Int64.MinValue); + Assert.IsTrue ((long) d == Int64.MinValue); } [Test] @@ -470,20 +470,20 @@ namespace MonoTests.System for (int i = 0; i < dtab.GetLength (0); i++) { d = new Decimal (itab [i]); if ((decimal) d != dtab [i]) { - Fail ("UInt64 -> Decimal: " + itab [i] + " != " + d); + Assert.Fail ("UInt64 -> Decimal: " + itab [i] + " != " + d); } else { ulong n = (ulong) d; if (n != itab [i]) { - Fail ("Decimal -> UInt64: " + d + " != " + itab [i]); + Assert.Fail ("Decimal -> UInt64: " + d + " != " + itab [i]); } } } d = new Decimal (UInt64.MaxValue); - Assert ((ulong) d == UInt64.MaxValue); + Assert.IsTrue ((ulong) d == UInt64.MaxValue); d = new Decimal (UInt64.MinValue); - Assert ((ulong) d == UInt64.MinValue); + Assert.IsTrue ((ulong) d == UInt64.MinValue); } [Test] @@ -492,49 +492,49 @@ namespace MonoTests.System Decimal d; d = new Decimal (-1.2345678f); - AssertEquals ("A#01", -1.234568m, (decimal) d); + Assert.AreEqual (-1.234568m, (decimal) d, "A#01"); d = 3; - AssertEquals ("A#02", 3.0f, (float) d); + Assert.AreEqual (3.0f, (float) d, "A#02"); d = new Decimal (0.0f); - AssertEquals ("A#03", 0m, (decimal) d); - AssertEquals ("A#04", 0.0f, (float) d); + Assert.AreEqual (0m, (decimal) d, "A#03"); + Assert.AreEqual (0.0f, (float) d, "A#04"); d = new Decimal (1.0f); - AssertEquals ("A#05", 1m, (decimal) d); - AssertEquals ("A#06", 1.0f, (float) d); + Assert.AreEqual (1m, (decimal) d, "A#05"); + Assert.AreEqual (1.0f, (float) d, "A#06"); d = new Decimal (-1.2345678f); - AssertEquals ("A#07", -1.234568m, (decimal) d); - AssertEquals ("A#08", -1.234568f, (float) d); + Assert.AreEqual (-1.234568m, (decimal) d, "A#07"); + Assert.AreEqual (-1.234568f, (float) d, "A#08"); d = new Decimal (1.2345673f); - AssertEquals ("A#09", 1.234567m, (decimal) d); + Assert.AreEqual (1.234567m, (decimal) d, "A#09"); d = new Decimal (1.2345673e7f); - AssertEquals ("A#10", 12345670m, (decimal) d); + Assert.AreEqual (12345670m, (decimal) d, "A#10"); d = new Decimal (1.2345673e-17f); - AssertEquals ("A#11", 0.00000000000000001234567m, (decimal) d); - AssertEquals ("A#12", 1.234567e-17f, (float) d); + Assert.AreEqual (0.00000000000000001234567m, (decimal) d, "A#11"); + Assert.AreEqual (1.234567e-17f, (float) d, "A#12"); // test exceptions try { d = new Decimal (Single.MaxValue); - Fail (); + Assert.Fail (); } catch (OverflowException) { } try { d = new Decimal (Single.NaN); - Fail (); + Assert.Fail (); } catch (OverflowException) { } try { d = new Decimal (Single.PositiveInfinity); - Fail (); + Assert.Fail (); } catch (OverflowException) { } } @@ -545,25 +545,25 @@ namespace MonoTests.System decimal d; d = new Decimal (1765.23454f); - AssertEquals ("failed banker's rule rounding test 2", 1765.234m, d); + Assert.AreEqual (1765.234m, d, "failed banker's rule rounding test 2"); d = new Decimal (0.00017652356f); - AssertEquals ("06", 0.0001765236m, d); + Assert.AreEqual (0.0001765236m, d, "06"); d = new Decimal (0.000176523554f); - AssertEquals ("failed banker's rule rounding test 3", 0.0001765236m, d); + Assert.AreEqual (0.0001765236m, d, "failed banker's rule rounding test 3"); d = new Decimal (0.00017652354f); - AssertEquals ("08", 0.0001765235m, d); + Assert.AreEqual (0.0001765235m, d, "08"); d = new Decimal (0.00017652346f); - AssertEquals ("09", 0.0001765235m, d); + Assert.AreEqual (0.0001765235m, d, "09"); d = new Decimal (0.000176523454f); - AssertEquals ("failed banker's rule rounding test 4", 0.0001765234m, d); + Assert.AreEqual (0.0001765234m, d, "failed banker's rule rounding test 4"); d = new Decimal (0.00017652344f); - AssertEquals ("11", 0.0001765234m, d); + Assert.AreEqual (0.0001765234m, d, "11"); } public void TestConstructSingleRounding () @@ -571,40 +571,40 @@ namespace MonoTests.System decimal d; d = new Decimal (1765.2356f); - Assert ("01", d == 1765.236m); + Assert.IsTrue (d == 1765.236m, "01"); d = new Decimal (1765.23554f); - Assert ("failed banker's rule rounding test 1", d == 1765.236m); + Assert.IsTrue (d == 1765.236m, "failed banker's rule rounding test 1"); d = new Decimal (1765.2354f); - Assert ("03", d == 1765.235m); + Assert.IsTrue (d == 1765.235m, "03"); d = new Decimal (1765.2346f); - Assert ("04", d == 1765.235m); + Assert.IsTrue (d == 1765.235m, "04"); d = new Decimal (1765.2344f); - Assert ("05", d == 1765.234m); + Assert.IsTrue (d == 1765.234m, "05"); d = new Decimal (3.7652356e10f); - Assert ("12", d == 37652360000m); + Assert.IsTrue (d == 37652360000m, "12"); d = new Decimal (3.7652356e20f); - Assert ("13", d == 376523600000000000000m); + Assert.IsTrue (d == 376523600000000000000m, "13"); d = new Decimal (3.76523554e20f); - Assert ("failed banker's rule rounding test 5", d == 376523600000000000000m); + Assert.IsTrue (d == 376523600000000000000m, "failed banker's rule rounding test 5"); d = new Decimal (3.7652352e20f); - Assert ("15", d == 376523500000000000000m); + Assert.IsTrue (d == 376523500000000000000m, "15"); d = new Decimal (3.7652348e20f); - Assert ("16", d == 376523500000000000000m); + Assert.IsTrue (d == 376523500000000000000m, "16"); d = new Decimal (3.76523454e20f); - Assert ("failed banker's rule rounding test 6", d == 376523400000000000000m); + Assert.IsTrue (d == 376523400000000000000m, "failed banker's rule rounding test 6"); d = new Decimal (3.7652342e20f); - Assert ("18", d == 376523400000000000000m); + Assert.IsTrue (d == 376523400000000000000m, "18"); } [Test] @@ -613,71 +613,71 @@ namespace MonoTests.System Decimal d; d = new Decimal (0.0); - Assert ((decimal) d == 0m); + Assert.IsTrue ((decimal) d == 0m); d = new Decimal (1.0); - Assert ((decimal) d == 1m); - Assert (1.0 == (double) d); + Assert.IsTrue ((decimal) d == 1m); + Assert.IsTrue (1.0 == (double) d); d = new Decimal (-1.2345678901234); - Assert ((decimal) d == -1.2345678901234m); - Assert (-1.2345678901234 == (double) d); + Assert.IsTrue ((decimal) d == -1.2345678901234m); + Assert.IsTrue (-1.2345678901234 == (double) d); d = new Decimal (1.2345678901234); - Assert ((decimal) d == 1.2345678901234m); + Assert.IsTrue ((decimal) d == 1.2345678901234m); d = new Decimal (1.2345678901234e8); - Assert ((decimal) d == 123456789.01234m); - Assert (1.2345678901234e8 == (double) d); + Assert.IsTrue ((decimal) d == 123456789.01234m); + Assert.IsTrue (1.2345678901234e8 == (double) d); d = new Decimal (1.2345678901234e16); - Assert ((decimal) d == 12345678901234000m); - Assert (1.2345678901234e16 == (double) d); + Assert.IsTrue ((decimal) d == 12345678901234000m); + Assert.IsTrue (1.2345678901234e16 == (double) d); d = new Decimal (1.2345678901234e24); - Assert ((decimal) d == 1234567890123400000000000m); - Assert (1.2345678901234e24 == (double) d); + Assert.IsTrue ((decimal) d == 1234567890123400000000000m); + Assert.IsTrue (1.2345678901234e24 == (double) d); d = new Decimal (1.2345678901234e28); - Assert ((decimal) d == 1.2345678901234e28m); - Assert (1.2345678901234e28 == (double) d); + Assert.IsTrue ((decimal) d == 1.2345678901234e28m); + Assert.IsTrue (1.2345678901234e28 == (double) d); d = new Decimal (7.2345678901234e28); - Assert ((decimal) d == 7.2345678901234e28m); - Assert (new Decimal ((double) d) == d); + Assert.IsTrue ((decimal) d == 7.2345678901234e28m); + Assert.IsTrue (new Decimal ((double) d) == d); d = new Decimal (1.2345678901234e-8); - Assert ((decimal) d == 1.2345678901234e-8m); + Assert.IsTrue ((decimal) d == 1.2345678901234e-8m); d = new Decimal (1.2345678901234e-14); - Assert ((decimal) d == 1.2345678901234e-14m); - Assert (1.2345678901234e-14 == (double) d); + Assert.IsTrue ((decimal) d == 1.2345678901234e-14m); + Assert.IsTrue (1.2345678901234e-14 == (double) d); d = new Decimal (1.2342278901234e-25); - AssertEquals ("A10", d, 1.234e-25m); + Assert.AreEqual (d, 1.234e-25m, "A10"); // test exceptions try { d = new Decimal (8e28); - Fail (); + Assert.Fail (); } catch (OverflowException) { } try { d = new Decimal (8e48); - Fail (); + Assert.Fail (); } catch (OverflowException) { } try { d = new Decimal (Double.NaN); - Fail (); + Assert.Fail (); } catch (OverflowException) { } try { d = new Decimal (Double.PositiveInfinity); - Fail (); + Assert.Fail (); } catch (OverflowException) { } } @@ -690,54 +690,54 @@ namespace MonoTests.System try { d = new Decimal (1765.231234567857); - AssertEquals ("A01", 1765.23123456786m, d); + Assert.AreEqual (1765.23123456786m, d, "A01"); TestNum++; d = new Decimal (1765.2312345678554); - AssertEquals ("A02, failed banker's rule rounding test 1", 1765.23123456786m, d); - AssertEquals ("A03", 1765.23123456786, (double) d); + Assert.AreEqual (1765.23123456786m, d, "A02, failed banker's rule rounding test 1"); + Assert.AreEqual (1765.23123456786, (double) d, "A03"); TestNum++; d = new Decimal (1765.231234567853); - Assert (d == 1765.23123456785m); + Assert.IsTrue (d == 1765.23123456785m); TestNum++; d = new Decimal (1765.231234567847); - Assert (d == 1765.23123456785m); + Assert.IsTrue (d == 1765.23123456785m); TestNum++; d = new Decimal (1765.231234567843); - Assert (d == 1765.23123456784m); + Assert.IsTrue (d == 1765.23123456784m); TestNum++; d = new Decimal (1.765231234567857e-9); - Assert (d == 1.76523123456786e-9m); + Assert.IsTrue (d == 1.76523123456786e-9m); TestNum++; d = new Decimal (1.7652312345678554e-9); - Assert ("failed banker's rule rounding test 3", d == 1.76523123456786e-9m); + Assert.IsTrue (d == 1.76523123456786e-9m, "failed banker's rule rounding test 3"); TestNum++; d = new Decimal (1.765231234567853e-9); - Assert (d == 1.76523123456785e-9m); + Assert.IsTrue (d == 1.76523123456785e-9m); TestNum++; d = new Decimal (1.765231234567857e+24); - Assert (d == 1.76523123456786e+24m); + Assert.IsTrue (d == 1.76523123456786e+24m); TestNum++; d = new Decimal (1.7652312345678554e+24); - Assert ("failed banker's rule rounding test 4", d == 1.76523123456786e+24m); + Assert.IsTrue (d == 1.76523123456786e+24m, "failed banker's rule rounding test 4"); TestNum++; d = new Decimal (1.765231234567853e+24); - Assert (d == 1.76523123456785e+24m); + Assert.IsTrue (d == 1.76523123456785e+24m); TestNum++; d = new Decimal (1765.2312345678454); - Assert (d == 1765.23123456785m); + Assert.IsTrue (d == 1765.23123456785m); } catch (Exception e) { - Fail ("At TestNum = " + TestNum + " unexpected exception. e = " + e); + Assert.Fail ("At TestNum = " + TestNum + " unexpected exception. e = " + e); } } @@ -747,7 +747,7 @@ namespace MonoTests.System decimal d; d = new Decimal (12345678); - Assert ((decimal) Decimal.Negate (d) == -12345678m); + Assert.IsTrue ((decimal) Decimal.Negate (d) == -12345678m); } [Test] @@ -756,33 +756,33 @@ namespace MonoTests.System decimal d; d = new Decimal (parts0); - Assert (d == 0); + Assert.IsTrue (d == 0); d = new Decimal (parts1); - Assert (d == 1); + Assert.IsTrue (d == 1); d = new Decimal (parts2); - Assert (d == 4294967296m); + Assert.IsTrue (d == 4294967296m); d = new Decimal (parts3); - Assert (d == 18446744073709551616m); + Assert.IsTrue (d == 18446744073709551616m); d = new Decimal (parts4); - Assert (d == 0m); + Assert.IsTrue (d == 0m); d = new Decimal (parts5); - Assert (d == 18446744078004518913m); + Assert.IsTrue (d == 18446744078004518913m); d = new Decimal (partsMaxValue); - Assert (d == Decimal.MaxValue); + Assert.IsTrue (d == Decimal.MaxValue); d = new Decimal (partsMinValue); - Assert (d == Decimal.MinValue); + Assert.IsTrue (d == Decimal.MinValue); d = new Decimal (parts6); int [] erg = Decimal.GetBits (d); for (int i = 0; i < 4; i++) { - Assert (erg [i] == parts6 [i]); + Assert.IsTrue (erg [i] == parts6 [i]); } } @@ -804,11 +804,11 @@ namespace MonoTests.System for (int i = 0; i < dtab.GetLength (0); i++) { d = Decimal.Floor (dtab [i, 0]); if (d != dtab [i, 1]) { - Fail ("Floor: Floor(" + dtab [i, 0] + ") != " + d); + Assert.Fail ("Floor: Floor(" + dtab [i, 0] + ") != " + d); } d = Decimal.Truncate (dtab [i, 0]); if (d != dtab [i, 2]) { - Fail ("Truncate: Truncate(" + dtab [i, 0] + ") != " + d); + Assert.Fail ("Truncate: Truncate(" + dtab [i, 0] + ") != " + d); } } } @@ -818,16 +818,16 @@ namespace MonoTests.System { decimal dd = 249.9m; decimal dt = Decimal.Truncate (dd); - AssertEquals ("Original", 249.9m, dd); - AssertEquals ("Truncate", 249m, dt); - AssertEquals ("Cast-Byte", 249, (byte) dd); - AssertEquals ("Cast-Char", 249, (char) dd); - AssertEquals ("Cast-Int16", 249, (short) dd); - AssertEquals ("Cast-UInt16", 249, (ushort) dd); - AssertEquals ("Cast-Int32", 249, (int) dd); - AssertEquals ("Cast-UInt32", 249, (uint) dd); - AssertEquals ("Cast-Int64", 249, (long) dd); - AssertEquals ("Cast-UInt64", 249, (ulong) dd); + Assert.AreEqual (249.9m, dd, "Original"); + Assert.AreEqual (249m, dt, "Truncate"); + Assert.AreEqual (249, (byte) dd, "Cast-Byte"); + Assert.AreEqual (249, (char) dd, "Cast-Char"); + Assert.AreEqual (249, (short) dd, "Cast-Int16"); + Assert.AreEqual (249, (ushort) dd, "Cast-UInt16"); + Assert.AreEqual (249, (int) dd, "Cast-Int32"); + Assert.AreEqual (249, (uint) dd, "Cast-UInt32"); + Assert.AreEqual (249, (long) dd, "Cast-Int64"); + Assert.AreEqual (249, (ulong) dd, "Cast-UInt64"); } [Test] @@ -848,7 +848,7 @@ namespace MonoTests.System for (int i = 0; i < dtab.GetLength (0); i++) { d = Decimal.Round (dtab [i, 0], (int) dtab [i, 1]); if (d != dtab [i, 2]) { - Fail ("Round: Round(" + dtab [i, 0] + "," + (int) dtab [i, 1] + ") != " + d); + Assert.Fail ("Round: Round(" + dtab [i, 0] + "," + (int) dtab [i, 1] + ") != " + d); } } } @@ -865,7 +865,7 @@ namespace MonoTests.System for (int i = 0; i < dtab.GetLength (0); i++) { d = Decimal.Round (dtab [i, 0], (int) dtab [i, 1]); if (d != dtab [i, 2]) { - Fail ("FailRound: Round(" + dtab [i, 0] + "," + (int) dtab [i, 1] + ") != " + d); + Assert.Fail ("FailRound: Round(" + dtab [i, 0] + "," + (int) dtab [i, 1] + ") != " + d); } } } @@ -875,98 +875,98 @@ namespace MonoTests.System { long max = Int64.MaxValue; Decimal dmax = Decimal.Parse (max.ToString ()); - AssertEquals ("Int64.MaxValue", Int64.MaxValue, Decimal.ToInt64 (dmax)); + Assert.AreEqual (Int64.MaxValue, Decimal.ToInt64 (dmax), "Int64.MaxValue"); long min = Int64.MinValue; Decimal dmin = Decimal.Parse (min.ToString ()); - AssertEquals ("Int64.MinValue", Int64.MinValue, Decimal.ToInt64 (dmin)); + Assert.AreEqual (Int64.MinValue, Decimal.ToInt64 (dmin), "Int64.MinValue"); dmax += 1.1m; dmax = Decimal.Parse (dmax.ToString ()); - AssertEquals ("Int64.MaxValue+1.1", Int64.MaxValue, Decimal.ToInt64 (dmax - 1.1m)); + Assert.AreEqual (Int64.MaxValue, Decimal.ToInt64 (dmax - 1.1m), "Int64.MaxValue+1.1"); dmin -= 1.1m; dmin = Decimal.Parse (dmin.ToString ()); - AssertEquals ("Int64.MinValue-1.1", Int64.MinValue, Decimal.ToInt64 (dmin + 1.1m)); + Assert.AreEqual (Int64.MinValue, Decimal.ToInt64 (dmin + 1.1m), "Int64.MinValue-1.1"); } [Test] public void ToByte () { Decimal d = 254.9m; - AssertEquals ("Decimal.ToByte", 254, Decimal.ToByte (d)); - AssertEquals ("Convert.ToByte", 255, Convert.ToByte (d)); - AssertEquals ("IConvertible.ToByte", 255, (d as IConvertible).ToByte (null)); + Assert.AreEqual (254, Decimal.ToByte (d), "Decimal.ToByte"); + Assert.AreEqual (255, Convert.ToByte (d), "Convert.ToByte"); + Assert.AreEqual (255, (d as IConvertible).ToByte (null), "IConvertible.ToByte"); } [Test] public void ToSByte () { Decimal d = 126.9m; - AssertEquals ("Decimal.ToSByte", 126, Decimal.ToSByte (d)); - AssertEquals ("Convert.ToSByte", 127, Convert.ToSByte (d)); - AssertEquals ("IConvertible.ToSByte", 127, (d as IConvertible).ToSByte (null)); + Assert.AreEqual (126, Decimal.ToSByte (d), "Decimal.ToSByte"); + Assert.AreEqual (127, Convert.ToSByte (d), "Convert.ToSByte"); + Assert.AreEqual (127, (d as IConvertible).ToSByte (null), "IConvertible.ToSByte"); d = -d; - AssertEquals ("-Decimal.ToSByte", -126, Decimal.ToSByte (d)); - AssertEquals ("-Convert.ToSByte", -127, Convert.ToSByte (d)); - AssertEquals ("-IConvertible.ToSByte", -127, (d as IConvertible).ToSByte (null)); + Assert.AreEqual (-126, Decimal.ToSByte (d), "-Decimal.ToSByte"); + Assert.AreEqual (-127, Convert.ToSByte (d), "-Convert.ToSByte"); + Assert.AreEqual (-127, (d as IConvertible).ToSByte (null), "-IConvertible.ToSByte"); } [Test] public void ToInt16 () { Decimal d = 254.9m; - AssertEquals ("Decimal.ToInt16", 254, Decimal.ToInt16 (d)); - AssertEquals ("Convert.ToInt16", 255, Convert.ToInt16 (d)); - AssertEquals ("IConvertible.ToInt16", 255, (d as IConvertible).ToInt16 (null)); + Assert.AreEqual (254, Decimal.ToInt16 (d), "Decimal.ToInt16"); + Assert.AreEqual (255, Convert.ToInt16 (d), "Convert.ToInt16"); + Assert.AreEqual (255, (d as IConvertible).ToInt16 (null), "IConvertible.ToInt16"); d = -d; - AssertEquals ("-Decimal.ToInt16", -254, Decimal.ToInt16 (d)); - AssertEquals ("-Convert.ToInt16", -255, Convert.ToInt16 (d)); - AssertEquals ("-IConvertible.ToInt16", -255, (d as IConvertible).ToInt16 (null)); + Assert.AreEqual (-254, Decimal.ToInt16 (d), "-Decimal.ToInt16"); + Assert.AreEqual (-255, Convert.ToInt16 (d), "-Convert.ToInt16"); + Assert.AreEqual (-255, (d as IConvertible).ToInt16 (null), "-IConvertible.ToInt16"); } [Test] public void ToUInt16 () { Decimal d = 254.9m; - AssertEquals ("Decimal.ToUInt16", 254, Decimal.ToUInt16 (d)); - AssertEquals ("Convert.ToUInt16", 255, Convert.ToUInt16 (d)); - AssertEquals ("IConvertible.ToUInt16", 255, (d as IConvertible).ToUInt16 (null)); + Assert.AreEqual (254, Decimal.ToUInt16 (d), "Decimal.ToUInt16"); + Assert.AreEqual (255, Convert.ToUInt16 (d), "Convert.ToUInt16"); + Assert.AreEqual (255, (d as IConvertible).ToUInt16 (null), "IConvertible.ToUInt16"); } [Test] public void ToInt32 () { Decimal d = 254.9m; - AssertEquals ("Decimal.ToInt32", 254, Decimal.ToInt32 (d)); - AssertEquals ("Convert.ToInt32", 255, Convert.ToInt32 (d)); - AssertEquals ("IConvertible.ToInt32", 255, (d as IConvertible).ToInt32 (null)); + Assert.AreEqual (254, Decimal.ToInt32 (d), "Decimal.ToInt32"); + Assert.AreEqual (255, Convert.ToInt32 (d), "Convert.ToInt32"); + Assert.AreEqual (255, (d as IConvertible).ToInt32 (null), "IConvertible.ToInt32"); d = -d; - AssertEquals ("-Decimal.ToInt32", -254, Decimal.ToInt32 (d)); - AssertEquals ("-Convert.ToInt32", -255, Convert.ToInt32 (d)); - AssertEquals ("-IConvertible.ToInt32", -255, (d as IConvertible).ToInt32 (null)); + Assert.AreEqual (-254, Decimal.ToInt32 (d), "-Decimal.ToInt32"); + Assert.AreEqual (-255, Convert.ToInt32 (d), "-Convert.ToInt32"); + Assert.AreEqual (-255, (d as IConvertible).ToInt32 (null), "-IConvertible.ToInt32"); } [Test] public void ToUInt32 () { Decimal d = 254.9m; - AssertEquals ("Decimal.ToUInt32", 254, Decimal.ToUInt32 (d)); - AssertEquals ("Convert.ToUInt32", 255, Convert.ToUInt32 (d)); - AssertEquals ("IConvertible.ToUInt32", 255, (d as IConvertible).ToUInt32 (null)); + Assert.AreEqual (254, Decimal.ToUInt32 (d), "Decimal.ToUInt32"); + Assert.AreEqual (255, Convert.ToUInt32 (d), "Convert.ToUInt32"); + Assert.AreEqual (255, (d as IConvertible).ToUInt32 (null), "IConvertible.ToUInt32"); } [Test] public void ToInt64 () { Decimal d = 254.9m; - AssertEquals ("Decimal.ToInt64", 254, Decimal.ToInt64 (d)); - AssertEquals ("Convert.ToInt64", 255, Convert.ToInt64 (d)); - AssertEquals ("IConvertible.ToInt64", 255, (d as IConvertible).ToInt64 (null)); + Assert.AreEqual (254, Decimal.ToInt64 (d), "Decimal.ToInt64"); + Assert.AreEqual (255, Convert.ToInt64 (d), "Convert.ToInt64"); + Assert.AreEqual (255, (d as IConvertible).ToInt64 (null), "IConvertible.ToInt64"); d = -d; - AssertEquals ("-Decimal.ToInt64", -254, Decimal.ToInt64 (d)); - AssertEquals ("-Convert.ToInt64", -255, Convert.ToInt64 (d)); - AssertEquals ("-IConvertible.ToInt64", -255, (d as IConvertible).ToInt64 (null)); + Assert.AreEqual (-254, Decimal.ToInt64 (d), "-Decimal.ToInt64"); + Assert.AreEqual (-255, Convert.ToInt64 (d), "-Convert.ToInt64"); + Assert.AreEqual (-255, (d as IConvertible).ToInt64 (null), "-IConvertible.ToInt64"); } [Test] @@ -991,35 +991,35 @@ namespace MonoTests.System public void ToUInt64 () { Decimal d = 254.9m; - AssertEquals ("Decimal.ToUInt64", 254, Decimal.ToUInt64 (d)); - AssertEquals ("Convert.ToUInt64", 255, Convert.ToUInt64 (d)); - AssertEquals ("IConvertible.ToUInt64", 255, (d as IConvertible).ToUInt64 (null)); + Assert.AreEqual (254, Decimal.ToUInt64 (d), "Decimal.ToUInt64"); + Assert.AreEqual (255, Convert.ToUInt64 (d), "Convert.ToUInt64"); + Assert.AreEqual (255, (d as IConvertible).ToUInt64 (null), "IConvertible.ToUInt64"); } [Test] public void ToSingle () { Decimal d = 254.9m; - AssertEquals ("Decimal.ToSingle", 254.9f, Decimal.ToSingle (d)); - AssertEquals ("Convert.ToSingle", 254.9f, Convert.ToSingle (d)); - AssertEquals ("IConvertible.ToSingle", 254.9f, (d as IConvertible).ToSingle (null)); + Assert.AreEqual (254.9f, Decimal.ToSingle (d), "Decimal.ToSingle"); + Assert.AreEqual (254.9f, Convert.ToSingle (d), "Convert.ToSingle"); + Assert.AreEqual (254.9f, (d as IConvertible).ToSingle (null), "IConvertible.ToSingle"); d = -d; - AssertEquals ("-Decimal.ToSingle", -254.9f, Decimal.ToSingle (d)); - AssertEquals ("-Convert.ToSingle", -254.9f, Convert.ToSingle (d)); - AssertEquals ("-IConvertible.ToSingle", -254.9f, (d as IConvertible).ToSingle (null)); + Assert.AreEqual (-254.9f, Decimal.ToSingle (d), "-Decimal.ToSingle"); + Assert.AreEqual (-254.9f, Convert.ToSingle (d), "-Convert.ToSingle"); + Assert.AreEqual (-254.9f, (d as IConvertible).ToSingle (null), "-IConvertible.ToSingle"); } [Test] public void ToDouble () { Decimal d = 254.9m; - AssertEquals ("Decimal.ToDouble", 254.9d, Decimal.ToDouble (d)); - AssertEquals ("Convert.ToDouble", 254.9d, Convert.ToDouble (d)); - AssertEquals ("IConvertible.ToDouble", 254.9d, (d as IConvertible).ToDouble (null)); + Assert.AreEqual (254.9d, Decimal.ToDouble (d), "Decimal.ToDouble"); + Assert.AreEqual (254.9d, Convert.ToDouble (d), "Convert.ToDouble"); + Assert.AreEqual (254.9d, (d as IConvertible).ToDouble (null), "IConvertible.ToDouble"); d = -d; - AssertEquals ("-Decimal.ToDouble", -254.9d, Decimal.ToDouble (d)); - AssertEquals ("-Convert.ToDouble", -254.9d, Convert.ToDouble (d)); - AssertEquals ("-IConvertible.ToDouble", -254.9d, (d as IConvertible).ToDouble (null)); + Assert.AreEqual (-254.9d, Decimal.ToDouble (d), "-Decimal.ToDouble"); + Assert.AreEqual (-254.9d, Convert.ToDouble (d), "-Convert.ToDouble"); + Assert.AreEqual (-254.9d, (d as IConvertible).ToDouble (null), "-IConvertible.ToDouble"); } [Test] @@ -1028,33 +1028,33 @@ namespace MonoTests.System Decimal d = 254.9m; // everything defaults to "G" string def = d.ToString ("G"); - AssertEquals ("ToString()", def, d.ToString ()); - AssertEquals ("ToString((IFormatProvider)null)", def, d.ToString ((IFormatProvider) null)); - AssertEquals ("ToString((string)null)", def, d.ToString ((string) null)); - AssertEquals ("ToString(empty)", def, d.ToString (String.Empty)); - AssertEquals ("ToString(null,null)", def, d.ToString (null, null)); - AssertEquals ("ToString(empty,null)", def, d.ToString (String.Empty, null)); - - AssertEquals ("ToString()", "254.9", def); + Assert.AreEqual (def, d.ToString (), "ToString()"); + Assert.AreEqual (def, d.ToString ((IFormatProvider) null), "ToString((IFormatProvider)null)"); + Assert.AreEqual (def, d.ToString ((string) null), "ToString((string)null)"); + Assert.AreEqual (def, d.ToString (String.Empty), "ToString(empty)"); + Assert.AreEqual (def, d.ToString (null, null), "ToString(null,null)"); + Assert.AreEqual (def, d.ToString (String.Empty, null), "ToString(empty,null)"); + + Assert.AreEqual ("254.9", def, "ToString()"); } [Test] public void CastTruncRounding () { // casting truncs decimal value (not normal nor banker's rounding) - AssertEquals ("254.9==254", 254, (long) (254.9m)); - AssertEquals ("-254.9=-254", -254, (long) (-254.9m)); - AssertEquals ("255.9==256", 255, (long) (255.9m)); - AssertEquals ("-255.9=-256", -255, (long) (-255.9m)); + Assert.AreEqual (254, (long) (254.9m), "254.9==254"); + Assert.AreEqual (-254, (long) (-254.9m), "-254.9=-254"); + Assert.AreEqual (255, (long) (255.9m), "255.9==256"); + Assert.AreEqual (-255, (long) (-255.9m), "-255.9=-256"); } [Test] public void ParseFractions () { decimal d1 = Decimal.Parse ("0.523456789012345467890123456789", CultureInfo.InvariantCulture); - AssertEquals ("f1", 0.5234567890123454678901234568m, d1); + Assert.AreEqual (0.5234567890123454678901234568m, d1, "f1"); decimal d2 = Decimal.Parse ("0.49214206543486529434634231456", CultureInfo.InvariantCulture); - AssertEquals ("f2", 0.4921420654348652943463423146m, d2); + Assert.AreEqual (0.4921420654348652943463423146m, d2, "f2"); } [Test] @@ -1075,13 +1075,13 @@ namespace MonoTests.System Decimal r; // These should return false - AssertEquals (false, Decimal.TryParse ("79228162514264337593543950336", out r)); - AssertEquals (false, Decimal.TryParse ("123nx", NumberStyles.Number, CultureInfo.InvariantCulture, out r)); - AssertEquals (false, Decimal.TryParse (null, NumberStyles.Number, CultureInfo.InvariantCulture, out r)); + Assert.AreEqual (false, Decimal.TryParse ("79228162514264337593543950336", out r)); + Assert.AreEqual (false, Decimal.TryParse ("123nx", NumberStyles.Number, CultureInfo.InvariantCulture, out r)); + Assert.AreEqual (false, Decimal.TryParse (null, NumberStyles.Number, CultureInfo.InvariantCulture, out r)); // These should pass for (int i = 0; i < tab.Length; i++) { - AssertEquals (!tab [i].exceptionFlag, + Assert.AreEqual (!tab [i].exceptionFlag, Decimal.TryParse (tab [i].str, tab [i].style, NumberFormatInfo.InvariantInfo, out r)); } @@ -1103,25 +1103,25 @@ namespace MonoTests.System decimal n1 = -254.9m; decimal n2 = -12.1m; - AssertEquals ("254.9 % 12.1", 0.8m, Decimal.Remainder (p1, p2)); - AssertEquals ("-254.9 % 12.1", -0.8m, Decimal.Remainder (n1, p2)); - AssertEquals ("254.9 % -12.1", 0.8m, Decimal.Remainder (p1, n2)); - AssertEquals ("-254.9 % -12.1", -0.8m, Decimal.Remainder (n1, n2)); + Assert.AreEqual (0.8m, Decimal.Remainder (p1, p2), "254.9 % 12.1"); + Assert.AreEqual (-0.8m, Decimal.Remainder (n1, p2), "-254.9 % 12.1"); + Assert.AreEqual (0.8m, Decimal.Remainder (p1, n2), "254.9 % -12.1"); + Assert.AreEqual (-0.8m, Decimal.Remainder (n1, n2), "-254.9 % -12.1"); - AssertEquals ("12.1 % 254.9", 12.1m, Decimal.Remainder (p2, p1)); - AssertEquals ("-12.1 % 254.9", -12.1m, Decimal.Remainder (n2, p1)); - AssertEquals ("12.1 % -254.9", 12.1m, Decimal.Remainder (p2, n1)); - AssertEquals ("-12.1 % -254.9", -12.1m, Decimal.Remainder (n2, n1)); + Assert.AreEqual (12.1m, Decimal.Remainder (p2, p1), "12.1 % 254.9"); + Assert.AreEqual (-12.1m, Decimal.Remainder (n2, p1), "-12.1 % 254.9"); + Assert.AreEqual (12.1m, Decimal.Remainder (p2, n1), "12.1 % -254.9"); + Assert.AreEqual (-12.1m, Decimal.Remainder (n2, n1), "-12.1 % -254.9"); #if NET_2_0 - AssertEquals ("12.1 % 12.1", 0.0m, Decimal.Remainder (p1, p1)); - AssertEquals ("-12.1 % 12.1", 0.0m, Decimal.Remainder (n1, p1)); - AssertEquals ("12.1 % -12.1", 0.0m, Decimal.Remainder (p1, n1)); - AssertEquals ("-12.1 % -12.1", 0.0m, Decimal.Remainder (n1, n1)); + Assert.AreEqual (0.0m, Decimal.Remainder (p1, p1), "12.1 % 12.1"); + Assert.AreEqual (0.0m, Decimal.Remainder (n1, p1), "-12.1 % 12.1"); + Assert.AreEqual (0.0m, Decimal.Remainder (p1, n1), "12.1 % -12.1"); + Assert.AreEqual (0.0m, Decimal.Remainder (n1, n1), "-12.1 % -12.1"); #else - AssertEquals ("12.1 % 12.1", 0, Decimal.Remainder (p1, p1)); - AssertEquals ("-12.1 % 12.1", 0, Decimal.Remainder (n1, p1)); - AssertEquals ("12.1 % -12.1", 0, Decimal.Remainder (p1, n1)); - AssertEquals ("-12.1 % -12.1", 0, Decimal.Remainder (n1, n1)); + Assert.AreEqual (0, Decimal.Remainder (p1, p1), "12.1 % 12.1"); + Assert.AreEqual (0, Decimal.Remainder (n1, p1), "-12.1 % 12.1"); + Assert.AreEqual (0, Decimal.Remainder (p1, n1), "12.1 % -12.1"); + Assert.AreEqual (0, Decimal.Remainder (n1, n1), "-12.1 % -12.1"); #endif } @@ -1143,20 +1143,20 @@ namespace MonoTests.System decimal c1 = 21.066115702479338842975206612m; decimal c2 = 0.0474695959199686151431934092m; - AssertEquals ("254.9 / 12.1", c1, Decimal.Divide (p1, p2)); - AssertEquals ("-254.9 / 12.1", -c1, Decimal.Divide (n1, p2)); - AssertEquals ("254.9 / -12.1", -c1, Decimal.Divide (p1, n2)); - AssertEquals ("-254.9 / -12.1", c1, Decimal.Divide (n1, n2)); + Assert.AreEqual (c1, Decimal.Divide (p1, p2), "254.9 / 12.1"); + Assert.AreEqual (-c1, Decimal.Divide (n1, p2), "-254.9 / 12.1"); + Assert.AreEqual (-c1, Decimal.Divide (p1, n2), "254.9 / -12.1"); + Assert.AreEqual (c1, Decimal.Divide (n1, n2), "-254.9 / -12.1"); - AssertEquals ("12.1 / 254.9", c2, Decimal.Divide (p2, p1)); - AssertEquals ("-12.1 / 254.9", -c2, Decimal.Divide (n2, p1)); - AssertEquals ("12.1 / -254.9", -c2, Decimal.Divide (p2, n1)); - AssertEquals ("-12.1 / -254.9", c2, Decimal.Divide (n2, n1)); + Assert.AreEqual (c2, Decimal.Divide (p2, p1), "12.1 / 254.9"); + Assert.AreEqual (-c2, Decimal.Divide (n2, p1), "-12.1 / 254.9"); + Assert.AreEqual (-c2, Decimal.Divide (p2, n1), "12.1 / -254.9"); + Assert.AreEqual (c2, Decimal.Divide (n2, n1), "-12.1 / -254.9"); - AssertEquals ("12.1 / 12.1", 1, Decimal.Divide (p1, p1)); - AssertEquals ("-12.1 / 12.1", -1, Decimal.Divide (n1, p1)); - AssertEquals ("12.1 / -12.1", -1, Decimal.Divide (p1, n1)); - AssertEquals ("-12.1 / -12.1", 1, Decimal.Divide (n1, n1)); + Assert.AreEqual (1, Decimal.Divide (p1, p1), "12.1 / 12.1"); + Assert.AreEqual (-1, Decimal.Divide (n1, p1), "-12.1 / 12.1"); + Assert.AreEqual (-1, Decimal.Divide (p1, n1), "12.1 / -12.1"); + Assert.AreEqual (1, Decimal.Divide (n1, n1), "-12.1 / -12.1"); } [Test] @@ -1177,192 +1177,192 @@ namespace MonoTests.System public void Round_OddValue () { decimal five = 5.5555555555555555555555555555m; - AssertEquals ("5,5_,00", 6, Decimal.Round (five, 0)); - AssertEquals ("5,5_,01", 5.6m, Decimal.Round (five, 1)); - AssertEquals ("5,5_,02", 5.56m, Decimal.Round (five, 2)); - AssertEquals ("5,5_,03", 5.556m, Decimal.Round (five, 3)); - AssertEquals ("5,5_,04", 5.5556m, Decimal.Round (five, 4)); - AssertEquals ("5,5_,05", 5.55556m, Decimal.Round (five, 5)); - AssertEquals ("5,5_,06", 5.555556m, Decimal.Round (five, 6)); - AssertEquals ("5,5_,07", 5.5555556m, Decimal.Round (five, 7)); - AssertEquals ("5,5_,08", 5.55555556m, Decimal.Round (five, 8)); - AssertEquals ("5,5_,09", 5.555555556m, Decimal.Round (five, 9)); - AssertEquals ("5,5_,10", 5.5555555556m, Decimal.Round (five, 10)); - AssertEquals ("5,5_,11", 5.55555555556m, Decimal.Round (five, 11)); - AssertEquals ("5,5_,12", 5.555555555556m, Decimal.Round (five, 12)); - AssertEquals ("5,5_,13", 5.5555555555556m, Decimal.Round (five, 13)); - AssertEquals ("5,5_,14", 5.55555555555556m, Decimal.Round (five, 14)); - AssertEquals ("5,5_,15", 5.555555555555556m, Decimal.Round (five, 15)); - AssertEquals ("5,5_,16", 5.5555555555555556m, Decimal.Round (five, 16)); - AssertEquals ("5,5_,17", 5.55555555555555556m, Decimal.Round (five, 17)); - AssertEquals ("5,5_,18", 5.555555555555555556m, Decimal.Round (five, 18)); - AssertEquals ("5,5_,19", 5.5555555555555555556m, Decimal.Round (five, 19)); - AssertEquals ("5,5_,20", 5.55555555555555555556m, Decimal.Round (five, 20)); - AssertEquals ("5,5_,21", 5.555555555555555555556m, Decimal.Round (five, 21)); - AssertEquals ("5,5_,22", 5.5555555555555555555556m, Decimal.Round (five, 22)); - AssertEquals ("5,5_,23", 5.55555555555555555555556m, Decimal.Round (five, 23)); - AssertEquals ("5,5_,24", 5.555555555555555555555556m, Decimal.Round (five, 24)); - AssertEquals ("5,5_,25", 5.5555555555555555555555556m, Decimal.Round (five, 25)); - AssertEquals ("5,5_,26", 5.55555555555555555555555556m, Decimal.Round (five, 26)); - AssertEquals ("5,5_,27", 5.555555555555555555555555556m, Decimal.Round (five, 27)); - AssertEquals ("5.5_,28", 5.5555555555555555555555555555m, Decimal.Round (five, 28)); + Assert.AreEqual (6, Decimal.Round (five, 0), "5,5_,00"); + Assert.AreEqual (5.6m, Decimal.Round (five, 1), "5,5_,01"); + Assert.AreEqual (5.56m, Decimal.Round (five, 2), "5,5_,02"); + Assert.AreEqual (5.556m, Decimal.Round (five, 3), "5,5_,03"); + Assert.AreEqual (5.5556m, Decimal.Round (five, 4), "5,5_,04"); + Assert.AreEqual (5.55556m, Decimal.Round (five, 5), "5,5_,05"); + Assert.AreEqual (5.555556m, Decimal.Round (five, 6), "5,5_,06"); + Assert.AreEqual (5.5555556m, Decimal.Round (five, 7), "5,5_,07"); + Assert.AreEqual (5.55555556m, Decimal.Round (five, 8), "5,5_,08"); + Assert.AreEqual (5.555555556m, Decimal.Round (five, 9), "5,5_,09"); + Assert.AreEqual (5.5555555556m, Decimal.Round (five, 10), "5,5_,10"); + Assert.AreEqual (5.55555555556m, Decimal.Round (five, 11), "5,5_,11"); + Assert.AreEqual (5.555555555556m, Decimal.Round (five, 12), "5,5_,12"); + Assert.AreEqual (5.5555555555556m, Decimal.Round (five, 13), "5,5_,13"); + Assert.AreEqual (5.55555555555556m, Decimal.Round (five, 14), "5,5_,14"); + Assert.AreEqual (5.555555555555556m, Decimal.Round (five, 15), "5,5_,15"); + Assert.AreEqual (5.5555555555555556m, Decimal.Round (five, 16), "5,5_,16"); + Assert.AreEqual (5.55555555555555556m, Decimal.Round (five, 17), "5,5_,17"); + Assert.AreEqual (5.555555555555555556m, Decimal.Round (five, 18), "5,5_,18"); + Assert.AreEqual (5.5555555555555555556m, Decimal.Round (five, 19), "5,5_,19"); + Assert.AreEqual (5.55555555555555555556m, Decimal.Round (five, 20), "5,5_,20"); + Assert.AreEqual (5.555555555555555555556m, Decimal.Round (five, 21), "5,5_,21"); + Assert.AreEqual (5.5555555555555555555556m, Decimal.Round (five, 22), "5,5_,22"); + Assert.AreEqual (5.55555555555555555555556m, Decimal.Round (five, 23), "5,5_,23"); + Assert.AreEqual (5.555555555555555555555556m, Decimal.Round (five, 24), "5,5_,24"); + Assert.AreEqual (5.5555555555555555555555556m, Decimal.Round (five, 25), "5,5_,25"); + Assert.AreEqual (5.55555555555555555555555556m, Decimal.Round (five, 26), "5,5_,26"); + Assert.AreEqual (5.555555555555555555555555556m, Decimal.Round (five, 27), "5,5_,27"); + Assert.AreEqual (5.5555555555555555555555555555m, Decimal.Round (five, 28), "5.5_,28"); } [Test] public void Round_EvenValue () { - AssertEquals ("2,2_5,00", 2, Decimal.Round (2.5m, 0)); - AssertEquals ("2,2_5,01", 2.2m, Decimal.Round (2.25m, 1)); - AssertEquals ("2,2_5,02", 2.22m, Decimal.Round (2.225m, 2)); - AssertEquals ("2,2_5,03", 2.222m, Decimal.Round (2.2225m, 3)); - AssertEquals ("2,2_5,04", 2.2222m, Decimal.Round (2.22225m, 4)); - AssertEquals ("2,2_5,05", 2.22222m, Decimal.Round (2.222225m, 5)); - AssertEquals ("2,2_5,06", 2.222222m, Decimal.Round (2.2222225m, 6)); - AssertEquals ("2,2_5,07", 2.2222222m, Decimal.Round (2.22222225m, 7)); - AssertEquals ("2,2_5,08", 2.22222222m, Decimal.Round (2.222222225m, 8)); - AssertEquals ("2,2_5,09", 2.222222222m, Decimal.Round (2.2222222225m, 9)); - AssertEquals ("2,2_5,10", 2.2222222222m, Decimal.Round (2.22222222225m, 10)); - AssertEquals ("2,2_5,11", 2.22222222222m, Decimal.Round (2.222222222225m, 11)); - AssertEquals ("2,2_5,12", 2.222222222222m, Decimal.Round (2.2222222222225m, 12)); - AssertEquals ("2,2_5,13", 2.2222222222222m, Decimal.Round (2.22222222222225m, 13)); - AssertEquals ("2,2_5,14", 2.22222222222222m, Decimal.Round (2.222222222222225m, 14)); - AssertEquals ("2,2_5,15", 2.222222222222222m, Decimal.Round (2.2222222222222225m, 15)); - AssertEquals ("2,2_5,16", 2.2222222222222222m, Decimal.Round (2.22222222222222225m, 16)); - AssertEquals ("2,2_5,17", 2.22222222222222222m, Decimal.Round (2.222222222222222225m, 17)); - AssertEquals ("2,2_5,18", 2.222222222222222222m, Decimal.Round (2.2222222222222222225m, 18)); - AssertEquals ("2,2_5,19", 2.2222222222222222222m, Decimal.Round (2.22222222222222222225m, 19)); - AssertEquals ("2,2_5,20", 2.22222222222222222222m, Decimal.Round (2.222222222222222222225m, 20)); - AssertEquals ("2,2_5,21", 2.222222222222222222222m, Decimal.Round (2.2222222222222222222225m, 21)); - AssertEquals ("2,2_5,22", 2.2222222222222222222222m, Decimal.Round (2.22222222222222222222225m, 22)); - AssertEquals ("2,2_5,23", 2.22222222222222222222222m, Decimal.Round (2.222222222222222222222225m, 23)); - AssertEquals ("2,2_5,24", 2.222222222222222222222222m, Decimal.Round (2.2222222222222222222222225m, 24)); - AssertEquals ("2,2_5,25", 2.2222222222222222222222222m, Decimal.Round (2.22222222222222222222222225m, 25)); - AssertEquals ("2,2_5,26", 2.22222222222222222222222222m, Decimal.Round (2.222222222222222222222222225m, 26)); - AssertEquals ("2,2_5,27", 2.222222222222222222222222222m, Decimal.Round (2.2222222222222222222222222225m, 27)); - AssertEquals ("2,2_5,28", 2.2222222222222222222222222222m, Decimal.Round (2.22222222222222222222222222225m, 28)); + Assert.AreEqual (2, Decimal.Round (2.5m, 0), "2,2_5,00"); + Assert.AreEqual (2.2m, Decimal.Round (2.25m, 1), "2,2_5,01"); + Assert.AreEqual (2.22m, Decimal.Round (2.225m, 2), "2,2_5,02"); + Assert.AreEqual (2.222m, Decimal.Round (2.2225m, 3), "2,2_5,03"); + Assert.AreEqual (2.2222m, Decimal.Round (2.22225m, 4), "2,2_5,04"); + Assert.AreEqual (2.22222m, Decimal.Round (2.222225m, 5), "2,2_5,05"); + Assert.AreEqual (2.222222m, Decimal.Round (2.2222225m, 6), "2,2_5,06"); + Assert.AreEqual (2.2222222m, Decimal.Round (2.22222225m, 7), "2,2_5,07"); + Assert.AreEqual (2.22222222m, Decimal.Round (2.222222225m, 8), "2,2_5,08"); + Assert.AreEqual (2.222222222m, Decimal.Round (2.2222222225m, 9), "2,2_5,09"); + Assert.AreEqual (2.2222222222m, Decimal.Round (2.22222222225m, 10), "2,2_5,10"); + Assert.AreEqual (2.22222222222m, Decimal.Round (2.222222222225m, 11), "2,2_5,11"); + Assert.AreEqual (2.222222222222m, Decimal.Round (2.2222222222225m, 12), "2,2_5,12"); + Assert.AreEqual (2.2222222222222m, Decimal.Round (2.22222222222225m, 13), "2,2_5,13"); + Assert.AreEqual (2.22222222222222m, Decimal.Round (2.222222222222225m, 14), "2,2_5,14"); + Assert.AreEqual (2.222222222222222m, Decimal.Round (2.2222222222222225m, 15), "2,2_5,15"); + Assert.AreEqual (2.2222222222222222m, Decimal.Round (2.22222222222222225m, 16), "2,2_5,16"); + Assert.AreEqual (2.22222222222222222m, Decimal.Round (2.222222222222222225m, 17), "2,2_5,17"); + Assert.AreEqual (2.222222222222222222m, Decimal.Round (2.2222222222222222225m, 18), "2,2_5,18"); + Assert.AreEqual (2.2222222222222222222m, Decimal.Round (2.22222222222222222225m, 19), "2,2_5,19"); + Assert.AreEqual (2.22222222222222222222m, Decimal.Round (2.222222222222222222225m, 20), "2,2_5,20"); + Assert.AreEqual (2.222222222222222222222m, Decimal.Round (2.2222222222222222222225m, 21), "2,2_5,21"); + Assert.AreEqual (2.2222222222222222222222m, Decimal.Round (2.22222222222222222222225m, 22), "2,2_5,22"); + Assert.AreEqual (2.22222222222222222222222m, Decimal.Round (2.222222222222222222222225m, 23), "2,2_5,23"); + Assert.AreEqual (2.222222222222222222222222m, Decimal.Round (2.2222222222222222222222225m, 24), "2,2_5,24"); + Assert.AreEqual (2.2222222222222222222222222m, Decimal.Round (2.22222222222222222222222225m, 25), "2,2_5,25"); + Assert.AreEqual (2.22222222222222222222222222m, Decimal.Round (2.222222222222222222222222225m, 26), "2,2_5,26"); + Assert.AreEqual (2.222222222222222222222222222m, Decimal.Round (2.2222222222222222222222222225m, 27), "2,2_5,27"); + Assert.AreEqual (2.2222222222222222222222222222m, Decimal.Round (2.22222222222222222222222222225m, 28), "2,2_5,28"); } [Test] public void Round_OddValue_Negative () { decimal five = -5.5555555555555555555555555555m; - AssertEquals ("-5,5_,00", -6, Decimal.Round (five, 0)); - AssertEquals ("-5,5_,01", -5.6m, Decimal.Round (five, 1)); - AssertEquals ("-5,5_,02", -5.56m, Decimal.Round (five, 2)); - AssertEquals ("-5,5_,03", -5.556m, Decimal.Round (five, 3)); - AssertEquals ("-5,5_,04", -5.5556m, Decimal.Round (five, 4)); - AssertEquals ("-5,5_,05", -5.55556m, Decimal.Round (five, 5)); - AssertEquals ("-5,5_,06", -5.555556m, Decimal.Round (five, 6)); - AssertEquals ("-5,5_,07", -5.5555556m, Decimal.Round (five, 7)); - AssertEquals ("-5,5_,08", -5.55555556m, Decimal.Round (five, 8)); - AssertEquals ("-5,5_,09", -5.555555556m, Decimal.Round (five, 9)); - AssertEquals ("-5,5_,10", -5.5555555556m, Decimal.Round (five, 10)); - AssertEquals ("-5,5_,11", -5.55555555556m, Decimal.Round (five, 11)); - AssertEquals ("-5,5_,12", -5.555555555556m, Decimal.Round (five, 12)); - AssertEquals ("-5,5_,13", -5.5555555555556m, Decimal.Round (five, 13)); - AssertEquals ("-5,5_,14", -5.55555555555556m, Decimal.Round (five, 14)); - AssertEquals ("-5,5_,15", -5.555555555555556m, Decimal.Round (five, 15)); - AssertEquals ("-5,5_,16", -5.5555555555555556m, Decimal.Round (five, 16)); - AssertEquals ("-5,5_,17", -5.55555555555555556m, Decimal.Round (five, 17)); - AssertEquals ("-5,5_,18", -5.555555555555555556m, Decimal.Round (five, 18)); - AssertEquals ("-5,5_,19", -5.5555555555555555556m, Decimal.Round (five, 19)); - AssertEquals ("-5,5_,20", -5.55555555555555555556m, Decimal.Round (five, 20)); - AssertEquals ("-5,5_,21", -5.555555555555555555556m, Decimal.Round (five, 21)); - AssertEquals ("-5,5_,22", -5.5555555555555555555556m, Decimal.Round (five, 22)); - AssertEquals ("-5,5_,23", -5.55555555555555555555556m, Decimal.Round (five, 23)); - AssertEquals ("-5,5_,24", -5.555555555555555555555556m, Decimal.Round (five, 24)); - AssertEquals ("-5,5_,25", -5.5555555555555555555555556m, Decimal.Round (five, 25)); - AssertEquals ("-5,5_,26", -5.55555555555555555555555556m, Decimal.Round (five, 26)); - AssertEquals ("-5,5_,27", -5.555555555555555555555555556m, Decimal.Round (five, 27)); - AssertEquals ("-5.5_,28", -5.5555555555555555555555555555m, Decimal.Round (five, 28)); + Assert.AreEqual (-6, Decimal.Round (five, 0), "-5,5_,00"); + Assert.AreEqual (-5.6m, Decimal.Round (five, 1), "-5,5_,01"); + Assert.AreEqual (-5.56m, Decimal.Round (five, 2), "-5,5_,02"); + Assert.AreEqual (-5.556m, Decimal.Round (five, 3), "-5,5_,03"); + Assert.AreEqual (-5.5556m, Decimal.Round (five, 4), "-5,5_,04"); + Assert.AreEqual (-5.55556m, Decimal.Round (five, 5), "-5,5_,05"); + Assert.AreEqual (-5.555556m, Decimal.Round (five, 6), "-5,5_,06"); + Assert.AreEqual (-5.5555556m, Decimal.Round (five, 7), "-5,5_,07"); + Assert.AreEqual (-5.55555556m, Decimal.Round (five, 8), "-5,5_,08"); + Assert.AreEqual (-5.555555556m, Decimal.Round (five, 9), "-5,5_,09"); + Assert.AreEqual (-5.5555555556m, Decimal.Round (five, 10), "-5,5_,10"); + Assert.AreEqual (-5.55555555556m, Decimal.Round (five, 11), "-5,5_,11"); + Assert.AreEqual (-5.555555555556m, Decimal.Round (five, 12), "-5,5_,12"); + Assert.AreEqual (-5.5555555555556m, Decimal.Round (five, 13), "-5,5_,13"); + Assert.AreEqual (-5.55555555555556m, Decimal.Round (five, 14), "-5,5_,14"); + Assert.AreEqual (-5.555555555555556m, Decimal.Round (five, 15), "-5,5_,15"); + Assert.AreEqual (-5.5555555555555556m, Decimal.Round (five, 16), "-5,5_,16"); + Assert.AreEqual (-5.55555555555555556m, Decimal.Round (five, 17), "-5,5_,17"); + Assert.AreEqual (-5.555555555555555556m, Decimal.Round (five, 18), "-5,5_,18"); + Assert.AreEqual (-5.5555555555555555556m, Decimal.Round (five, 19), "-5,5_,19"); + Assert.AreEqual (-5.55555555555555555556m, Decimal.Round (five, 20), "-5,5_,20"); + Assert.AreEqual (-5.555555555555555555556m, Decimal.Round (five, 21), "-5,5_,21"); + Assert.AreEqual (-5.5555555555555555555556m, Decimal.Round (five, 22), "-5,5_,22"); + Assert.AreEqual (-5.55555555555555555555556m, Decimal.Round (five, 23), "-5,5_,23"); + Assert.AreEqual (-5.555555555555555555555556m, Decimal.Round (five, 24), "-5,5_,24"); + Assert.AreEqual (-5.5555555555555555555555556m, Decimal.Round (five, 25), "-5,5_,25"); + Assert.AreEqual (-5.55555555555555555555555556m, Decimal.Round (five, 26), "-5,5_,26"); + Assert.AreEqual (-5.555555555555555555555555556m, Decimal.Round (five, 27), "-5,5_,27"); + Assert.AreEqual (-5.5555555555555555555555555555m, Decimal.Round (five, 28), "-5.5_,28"); } [Test] public void Round_EvenValue_Negative () { - AssertEquals ("-2,2_5,00", -2, Decimal.Round (-2.5m, 0)); - AssertEquals ("-2,2_5,01", -2.2m, Decimal.Round (-2.25m, 1)); - AssertEquals ("-2,2_5,02", -2.22m, Decimal.Round (-2.225m, 2)); - AssertEquals ("-2,2_5,03", -2.222m, Decimal.Round (-2.2225m, 3)); - AssertEquals ("-2,2_5,04", -2.2222m, Decimal.Round (-2.22225m, 4)); - AssertEquals ("-2,2_5,05", -2.22222m, Decimal.Round (-2.222225m, 5)); - AssertEquals ("-2,2_5,06", -2.222222m, Decimal.Round (-2.2222225m, 6)); - AssertEquals ("-2,2_5,07", -2.2222222m, Decimal.Round (-2.22222225m, 7)); - AssertEquals ("-2,2_5,08", -2.22222222m, Decimal.Round (-2.222222225m, 8)); - AssertEquals ("-2,2_5,09", -2.222222222m, Decimal.Round (-2.2222222225m, 9)); - AssertEquals ("-2,2_5,10", -2.2222222222m, Decimal.Round (-2.22222222225m, 10)); - AssertEquals ("-2,2_5,11", -2.22222222222m, Decimal.Round (-2.222222222225m, 11)); - AssertEquals ("-2,2_5,12", -2.222222222222m, Decimal.Round (-2.2222222222225m, 12)); - AssertEquals ("-2,2_5,13", -2.2222222222222m, Decimal.Round (-2.22222222222225m, 13)); - AssertEquals ("-2,2_5,14", -2.22222222222222m, Decimal.Round (-2.222222222222225m, 14)); - AssertEquals ("-2,2_5,15", -2.222222222222222m, Decimal.Round (-2.2222222222222225m, 15)); - AssertEquals ("-2,2_5,16", -2.2222222222222222m, Decimal.Round (-2.22222222222222225m, 16)); - AssertEquals ("-2,2_5,17", -2.22222222222222222m, Decimal.Round (-2.222222222222222225m, 17)); - AssertEquals ("-2,2_5,18", -2.222222222222222222m, Decimal.Round (-2.2222222222222222225m, 18)); - AssertEquals ("-2,2_5,19", -2.2222222222222222222m, Decimal.Round (-2.22222222222222222225m, 19)); - AssertEquals ("-2,2_5,20", -2.22222222222222222222m, Decimal.Round (-2.222222222222222222225m, 20)); - AssertEquals ("-2,2_5,21", -2.222222222222222222222m, Decimal.Round (-2.2222222222222222222225m, 21)); - AssertEquals ("-2,2_5,22", -2.2222222222222222222222m, Decimal.Round (-2.22222222222222222222225m, 22)); - AssertEquals ("-2,2_5,23", -2.22222222222222222222222m, Decimal.Round (-2.222222222222222222222225m, 23)); - AssertEquals ("-2,2_5,24", -2.222222222222222222222222m, Decimal.Round (-2.2222222222222222222222225m, 24)); - AssertEquals ("-2,2_5,25", -2.2222222222222222222222222m, Decimal.Round (-2.22222222222222222222222225m, 25)); - AssertEquals ("-2,2_5,26", -2.22222222222222222222222222m, Decimal.Round (-2.222222222222222222222222225m, 26)); - AssertEquals ("-2,2_5,27", -2.222222222222222222222222222m, Decimal.Round (-2.2222222222222222222222222225m, 27)); - AssertEquals ("-2,2_5,28", -2.2222222222222222222222222222m, Decimal.Round (-2.22222222222222222222222222225m, 28)); + Assert.AreEqual (-2, Decimal.Round (-2.5m, 0), "-2,2_5,00"); + Assert.AreEqual (-2.2m, Decimal.Round (-2.25m, 1), "-2,2_5,01"); + Assert.AreEqual (-2.22m, Decimal.Round (-2.225m, 2), "-2,2_5,02"); + Assert.AreEqual (-2.222m, Decimal.Round (-2.2225m, 3), "-2,2_5,03"); + Assert.AreEqual (-2.2222m, Decimal.Round (-2.22225m, 4), "-2,2_5,04"); + Assert.AreEqual (-2.22222m, Decimal.Round (-2.222225m, 5), "-2,2_5,05"); + Assert.AreEqual (-2.222222m, Decimal.Round (-2.2222225m, 6), "-2,2_5,06"); + Assert.AreEqual (-2.2222222m, Decimal.Round (-2.22222225m, 7), "-2,2_5,07"); + Assert.AreEqual (-2.22222222m, Decimal.Round (-2.222222225m, 8), "-2,2_5,08"); + Assert.AreEqual (-2.222222222m, Decimal.Round (-2.2222222225m, 9), "-2,2_5,09"); + Assert.AreEqual (-2.2222222222m, Decimal.Round (-2.22222222225m, 10), "-2,2_5,10"); + Assert.AreEqual (-2.22222222222m, Decimal.Round (-2.222222222225m, 11), "-2,2_5,11"); + Assert.AreEqual (-2.222222222222m, Decimal.Round (-2.2222222222225m, 12), "-2,2_5,12"); + Assert.AreEqual (-2.2222222222222m, Decimal.Round (-2.22222222222225m, 13), "-2,2_5,13"); + Assert.AreEqual (-2.22222222222222m, Decimal.Round (-2.222222222222225m, 14), "-2,2_5,14"); + Assert.AreEqual (-2.222222222222222m, Decimal.Round (-2.2222222222222225m, 15), "-2,2_5,15"); + Assert.AreEqual (-2.2222222222222222m, Decimal.Round (-2.22222222222222225m, 16), "-2,2_5,16"); + Assert.AreEqual (-2.22222222222222222m, Decimal.Round (-2.222222222222222225m, 17), "-2,2_5,17"); + Assert.AreEqual (-2.222222222222222222m, Decimal.Round (-2.2222222222222222225m, 18), "-2,2_5,18"); + Assert.AreEqual (-2.2222222222222222222m, Decimal.Round (-2.22222222222222222225m, 19), "-2,2_5,19"); + Assert.AreEqual (-2.22222222222222222222m, Decimal.Round (-2.222222222222222222225m, 20), "-2,2_5,20"); + Assert.AreEqual (-2.222222222222222222222m, Decimal.Round (-2.2222222222222222222225m, 21), "-2,2_5,21"); + Assert.AreEqual (-2.2222222222222222222222m, Decimal.Round (-2.22222222222222222222225m, 22), "-2,2_5,22"); + Assert.AreEqual (-2.22222222222222222222222m, Decimal.Round (-2.222222222222222222222225m, 23), "-2,2_5,23"); + Assert.AreEqual (-2.222222222222222222222222m, Decimal.Round (-2.2222222222222222222222225m, 24), "-2,2_5,24"); + Assert.AreEqual (-2.2222222222222222222222222m, Decimal.Round (-2.22222222222222222222222225m, 25), "-2,2_5,25"); + Assert.AreEqual (-2.22222222222222222222222222m, Decimal.Round (-2.222222222222222222222222225m, 26), "-2,2_5,26"); + Assert.AreEqual (-2.222222222222222222222222222m, Decimal.Round (-2.2222222222222222222222222225m, 27), "-2,2_5,27"); + Assert.AreEqual (-2.2222222222222222222222222222m, Decimal.Round (-2.22222222222222222222222222225m, 28), "-2,2_5,28"); } [Test] // bug #59425 public void ParseAndKeepPrecision () { string value = "5"; - AssertEquals (value, value, Decimal.Parse (value).ToString ()); + Assert.AreEqual (value, value, Decimal.Parse (value).ToString ()); value += '.'; for (int i = 0; i < 28; i++) { value += "0"; - AssertEquals (i.ToString (), value, Decimal.Parse (value).ToString ()); + Assert.AreEqual (value, Decimal.Parse (value).ToString (), i.ToString ()); } value = "-5"; - AssertEquals (value, value, Decimal.Parse (value).ToString ()); + Assert.AreEqual (value, value, Decimal.Parse (value).ToString ()); value += '.'; for (int i = 0; i < 28; i++) { value += "0"; - AssertEquals ("-" + i.ToString (), value, Decimal.Parse (value).ToString ()); + Assert.AreEqual (value, Decimal.Parse (value).ToString (), "-" + i.ToString ()); } } [Test] public void ToString_G () { - AssertEquals ("00", "1.0", (1.0m).ToString ()); - AssertEquals ("01", "0.1", (0.1m).ToString ()); - AssertEquals ("02", "0.01", (0.01m).ToString ()); - AssertEquals ("03", "0.001", (0.001m).ToString ()); - AssertEquals ("04", "0.0001", (0.0001m).ToString ()); - AssertEquals ("05", "0.00001", (0.00001m).ToString ()); - AssertEquals ("06", "0.000001", (0.000001m).ToString ()); - AssertEquals ("07", "0.0000001", (0.0000001m).ToString ()); - AssertEquals ("08", "0.00000001", (0.00000001m).ToString ()); - AssertEquals ("09", "0.000000001", (0.000000001m).ToString ()); - AssertEquals ("10", "0.0000000001", (0.0000000001m).ToString ()); - AssertEquals ("11", "0.00000000001", (0.00000000001m).ToString ()); - AssertEquals ("12", "0.000000000001", (0.000000000001m).ToString ()); - AssertEquals ("13", "0.0000000000001", (0.0000000000001m).ToString ()); - AssertEquals ("14", "0.00000000000001", (0.00000000000001m).ToString ()); - AssertEquals ("15", "0.000000000000001", (0.000000000000001m).ToString ()); - AssertEquals ("16", "0.0000000000000001", (0.0000000000000001m).ToString ()); - AssertEquals ("17", "0.00000000000000001", (0.00000000000000001m).ToString ()); - AssertEquals ("18", "0.000000000000000001", (0.000000000000000001m).ToString ()); - AssertEquals ("19", "0.0000000000000000001", (0.0000000000000000001m).ToString ()); - AssertEquals ("20", "0.00000000000000000001", (0.00000000000000000001m).ToString ()); - AssertEquals ("21", "0.000000000000000000001", (0.000000000000000000001m).ToString ()); - AssertEquals ("22", "0.0000000000000000000001", (0.0000000000000000000001m).ToString ()); - AssertEquals ("23", "0.00000000000000000000001", (0.00000000000000000000001m).ToString ()); - AssertEquals ("24", "0.000000000000000000000001", (0.000000000000000000000001m).ToString ()); - AssertEquals ("25", "0.0000000000000000000000001", (0.0000000000000000000000001m).ToString ()); - AssertEquals ("26", "0.00000000000000000000000001", (0.00000000000000000000000001m).ToString ()); - AssertEquals ("27", "0.000000000000000000000000001", (0.000000000000000000000000001m).ToString ()); - AssertEquals ("28", "0.0000000000000000000000000001", (0.0000000000000000000000000001m).ToString ()); + Assert.AreEqual ("1.0", (1.0m).ToString (), "00"); + Assert.AreEqual ("0.1", (0.1m).ToString (), "01"); + Assert.AreEqual ("0.01", (0.01m).ToString (), "02"); + Assert.AreEqual ("0.001", (0.001m).ToString (), "03"); + Assert.AreEqual ("0.0001", (0.0001m).ToString (), "04"); + Assert.AreEqual ("0.00001", (0.00001m).ToString (), "05"); + Assert.AreEqual ("0.000001", (0.000001m).ToString (), "06"); + Assert.AreEqual ("0.0000001", (0.0000001m).ToString (), "07"); + Assert.AreEqual ("0.00000001", (0.00000001m).ToString (), "08"); + Assert.AreEqual ("0.000000001", (0.000000001m).ToString (), "09"); + Assert.AreEqual ("0.0000000001", (0.0000000001m).ToString (), "10"); + Assert.AreEqual ("0.00000000001", (0.00000000001m).ToString (), "11"); + Assert.AreEqual ("0.000000000001", (0.000000000001m).ToString (), "12"); + Assert.AreEqual ("0.0000000000001", (0.0000000000001m).ToString (), "13"); + Assert.AreEqual ("0.00000000000001", (0.00000000000001m).ToString (), "14"); + Assert.AreEqual ("0.000000000000001", (0.000000000000001m).ToString (), "15"); + Assert.AreEqual ("0.0000000000000001", (0.0000000000000001m).ToString (), "16"); + Assert.AreEqual ("0.00000000000000001", (0.00000000000000001m).ToString (), "17"); + Assert.AreEqual ("0.000000000000000001", (0.000000000000000001m).ToString (), "18"); + Assert.AreEqual ("0.0000000000000000001", (0.0000000000000000001m).ToString (), "19"); + Assert.AreEqual ("0.00000000000000000001", (0.00000000000000000001m).ToString (), "20"); + Assert.AreEqual ("0.000000000000000000001", (0.000000000000000000001m).ToString (), "21"); + Assert.AreEqual ("0.0000000000000000000001", (0.0000000000000000000001m).ToString (), "22"); + Assert.AreEqual ("0.00000000000000000000001", (0.00000000000000000000001m).ToString (), "23"); + Assert.AreEqual ("0.000000000000000000000001", (0.000000000000000000000001m).ToString (), "24"); + Assert.AreEqual ("0.0000000000000000000000001", (0.0000000000000000000000001m).ToString (), "25"); + Assert.AreEqual ("0.00000000000000000000000001", (0.00000000000000000000000001m).ToString (), "26"); + Assert.AreEqual ("0.000000000000000000000000001", (0.000000000000000000000000001m).ToString (), "27"); + Assert.AreEqual ("0.0000000000000000000000000001", (0.0000000000000000000000000001m).ToString (), "28"); } #if NET_2_0 @@ -1370,23 +1370,23 @@ namespace MonoTests.System public void MidpointRoundingAwayFromZero () { MidpointRounding m = MidpointRounding.AwayFromZero; - AssertEquals ("#1", 4, Math.Round (3.5M, m)); - AssertEquals ("#2", 3, Math.Round (2.8M, m)); - AssertEquals ("#3", 3, Math.Round (2.5M, m)); - AssertEquals ("#4", 2, Math.Round (2.1M, m)); - AssertEquals ("#5", -2, Math.Round (-2.1M, m)); - AssertEquals ("#6", -3, Math.Round (-2.5M, m)); - AssertEquals ("#7", -3, Math.Round (-2.8M, m)); - AssertEquals ("#8", -4, Math.Round (-3.5M, m)); - - AssertEquals ("#9", 3.1M, Math.Round (3.05M, 1, m)); - AssertEquals ("#10", 2.1M, Math.Round (2.08M, 1, m)); - AssertEquals ("#11", 2.1M, Math.Round (2.05M, 1, m)); - AssertEquals ("#12", 2.0M, Math.Round (2.01M, 1, m)); - AssertEquals ("#13", -2.0M, Math.Round (-2.01M, 1, m)); - AssertEquals ("#14", -2.1M, Math.Round (-2.05M, 1, m)); - AssertEquals ("#15", -2.1M, Math.Round (-2.08M, 1, m)); - AssertEquals ("#16", -3.1M, Math.Round (-3.05M, 1, m)); + Assert.AreEqual (4, Math.Round (3.5M, m), "#1"); + Assert.AreEqual (3, Math.Round (2.8M, m), "#2"); + Assert.AreEqual (3, Math.Round (2.5M, m), "#3"); + Assert.AreEqual (2, Math.Round (2.1M, m), "#4"); + Assert.AreEqual (-2, Math.Round (-2.1M, m), "#5"); + Assert.AreEqual (-3, Math.Round (-2.5M, m), "#6"); + Assert.AreEqual (-3, Math.Round (-2.8M, m), "#7"); + Assert.AreEqual (-4, Math.Round (-3.5M, m), "#8"); + + Assert.AreEqual (3.1M, Math.Round (3.05M, 1, m), "#9"); + Assert.AreEqual (2.1M, Math.Round (2.08M, 1, m), "#10"); + Assert.AreEqual (2.1M, Math.Round (2.05M, 1, m), "#11"); + Assert.AreEqual (2.0M, Math.Round (2.01M, 1, m), "#12"); + Assert.AreEqual (-2.0M, Math.Round (-2.01M, 1, m), "#13"); + Assert.AreEqual (-2.1M, Math.Round (-2.05M, 1, m), "#14"); + Assert.AreEqual (-2.1M, Math.Round (-2.08M, 1, m), "#15"); + Assert.AreEqual (-3.1M, Math.Round (-3.05M, 1, m), "#16"); } #endif } diff --git a/mcs/class/corlib/Test/System/DecimalTest2.cs b/mcs/class/corlib/Test/System/DecimalTest2.cs index 9c8f17705d1..d87cbb1173b 100644 --- a/mcs/class/corlib/Test/System/DecimalTest2.cs +++ b/mcs/class/corlib/Test/System/DecimalTest2.cs @@ -38,22 +38,23 @@ namespace MonoTests.System /// /// Tests for System.Decimal /// - public class DecimalTest2 : TestCase + [TestFixture] + public class DecimalTest2 { - public DecimalTest2() {} - private void ReportOpError(string msg, int i, int j, decimal d1, decimal d2, decimal d3, decimal d3b) { decimal delta = 0; try { delta = d3 - d3b; } catch (Exception e) { - Fail("ReportOpError: Unexpected exception on " + d3 + " - " + d3b + ". e:" + e); + Assert.Fail ("ReportOpError: Unexpected exception on " + d3 + " - " + d3b + ". e:" + e); } - Fail ("*** " + msg + " for d1=" + d1 + " i=" + i + " d2=" + d2 + " j=" + j + " d3=" + d3 + " d3b=" + d3b + "\n" - + "Ist:" + d3 + " Soll:" + d3b + " delta=" + (delta) + " == " + (d3 == d3b)); + Assert.Fail ("*** " + msg + " for d1=" + d1 + " i=" + i + " d2=" + d2 + " j=" + j + " d3=" + d3 + " d3b=" + d3b + "\n" + + "is:" + d3 + " must be:" + d3b + " delta=" + (delta) + " == " + (d3 == d3b)); } + [Test] + public void TestCompare() { const int size = 14; @@ -90,47 +91,47 @@ namespace MonoTests.System Decimal d1 = data[i]; for (int j = 0; j < size; j++) { - Assert(cmpTable[i,j] == -cmpTable[j,i]); + Assert.IsTrue (cmpTable[i,j] == -cmpTable[j,i]); int x = cmpTable[i,j]; Decimal d2 = data[j]; int y = Decimal.Compare(d1, d2); if (y < 0) y = -1; else if (y > 0) y = 1; - Assert(x == y); + Assert.IsTrue (x == y); y = d1.CompareTo(d2); if (y < 0) y = -1; else if (y > 0) y = 1; - Assert(x == y); + Assert.IsTrue (x == y); bool b = d1 < d2; if (x != -1) b = !b; - Assert(b); + Assert.IsTrue (b); b = d1 <= d2; if (x == 1) b = !b; - Assert(b); + Assert.IsTrue (b); b = d1 >= d2; if (x == -1) b = !b; - Assert(b); + Assert.IsTrue (b); b = d1 > d2; if (x != 1) b = !b; - Assert(b); + Assert.IsTrue (b); b = d1 == d2; if (x != 0) b = !b; - Assert(b); + Assert.IsTrue (b); b = d1.Equals(d2); if (x != 0) b = !b; - Assert(b); + Assert.IsTrue (b); b = Decimal.Equals(d1, d2); if (x != 0) b = !b; - Assert(b); + Assert.IsTrue (b); } } } @@ -155,22 +156,26 @@ namespace MonoTests.System } #endif + [Test] + public void TestRemainder() { - Assert((decimal)Decimal.Remainder(3.6m, 1.3m) == 1.0m); + Assert.IsTrue ((decimal)Decimal.Remainder(3.6m, 1.3m) == 1.0m); decimal res = 24420760848422211464106753m; decimal remainder = Decimal.Remainder(79228162514264337593543950335m, 27703302467091960609331879.53200m); if (AreNotEqual (res, remainder)) - AssertEquals("A02", res, remainder); + Assert.AreEqual (res, remainder, "A02"); - Assert((decimal)Decimal.Remainder(45937986975432m, 43987453m) + Assert.IsTrue ((decimal)Decimal.Remainder(45937986975432m, 43987453m) == 42334506m); - Assert((decimal)Decimal.Remainder(45937986975000m, 5000m) + Assert.IsTrue ((decimal)Decimal.Remainder(45937986975000m, 5000m) == 0m); - Assert((decimal)Decimal.Remainder(-54789548973.6234m, 1.3356m) + Assert.IsTrue ((decimal)Decimal.Remainder(-54789548973.6234m, 1.3356m) == -0.1074m); } + [Test] + public void TestAdd() { decimal[] args = auto_build2; @@ -227,10 +232,12 @@ namespace MonoTests.System if (errOverflow + errOp > 0) { - Fail("" + errOp + " wrong additions, " + errOverflow + " wrong overflows"); + Assert.Fail ("" + errOp + " wrong additions, " + errOverflow + " wrong overflows"); } } + [Test] + public void TestMult() { decimal[] args = auto_build2; @@ -300,12 +307,14 @@ namespace MonoTests.System if (errOverflow + errOp > 0) { - Fail("" + errOp + " wrong multiplications, " + errOverflow + " wrong overflows"); + Assert.Fail ("" + errOp + " wrong multiplications, " + errOverflow + " wrong overflows"); } } // MS 1.x is being less precise than Mono (2 cases). MS 2.0 is correct. // Mono doesn't produce the same result for (i==21/j==3) + [Test] + public void TestDiv() { decimal[] args = auto_build2; @@ -399,7 +408,7 @@ namespace MonoTests.System if (errOverflow + errOp > 0) { - Fail("" + errOp + " wrong division, " + errOverflow + " wrong overflows, " + errDivideByZero + " wrong divide by zero, "); + Assert.Fail ("" + errOp + " wrong division, " + errOverflow + " wrong overflows, " + errDivideByZero + " wrong divide by zero, "); } } diff --git a/mcs/class/corlib/Test/System/DoubleFormatterTest.cs b/mcs/class/corlib/Test/System/DoubleFormatterTest.cs index bbfb9141c21..bfed360755f 100644 --- a/mcs/class/corlib/Test/System/DoubleFormatterTest.cs +++ b/mcs/class/corlib/Test/System/DoubleFormatterTest.cs @@ -13,7 +13,7 @@ using System.Globalization; namespace MonoTests.System { [TestFixture] - public class DoubleFormatterTest : Assertion + public class DoubleFormatterTest { CultureInfo old_culture; @@ -56,7 +56,7 @@ namespace MonoTests.System private void FormatStringTest(string TestNumber, NumberFormatInfo NumberFormat, double Number, string Format, string ExpectedResult) { - Assertion.AssertEquals (TestNumber, ExpectedResult, Number.ToString(Format, NumberFormat)); + Assert.AreEqual (ExpectedResult, Number.ToString(Format, NumberFormat), TestNumber); } private NumberFormatInfo GetNumberFormat1() @@ -939,7 +939,7 @@ namespace MonoTests.System public void NonStandardRounding () { // banker's rounding would results in 2.71828182845904 - AssertEquals ("G-E", "2.71828182845905", Math.E.ToString (CultureInfo.InvariantCulture)); + Assert.AreEqual ("2.71828182845905", Math.E.ToString (CultureInfo.InvariantCulture), "G-E"); } // see bug #60110 for more details @@ -947,7 +947,7 @@ namespace MonoTests.System public void Roundtrip_ExactStringFormat () { // here we check that the "R" output is "extactly" the same as MS implementation - AssertEquals ("R-E", "2.7182818284590451", Math.E.ToString ("R", CultureInfo.InvariantCulture)); + Assert.AreEqual ("2.7182818284590451", Math.E.ToString ("R", CultureInfo.InvariantCulture), "R-E"); } // see bug #60110 for more details @@ -957,17 +957,17 @@ namespace MonoTests.System // here we check that we can recreate the "extact" same double from the "R" format string se = Math.E.ToString ("R", CultureInfo.InvariantCulture); Double de = Double.Parse (se); - AssertEquals ("E==E", Math.E, de); + Assert.AreEqual (Math.E, de, "E==E"); // we try Mono "long" R format se = "2.718281828459045090795598298427648842334747314453125"; de = Double.Parse (se); - AssertEquals ("Mono==E", Math.E, de); + Assert.AreEqual (Math.E, de, "Mono==E"); // we try MS "short" R format se = "2.7182818284590451"; de = Double.Parse (se); - AssertEquals ("Microsoft==E", Math.E, de); + Assert.AreEqual (Math.E, de, "Microsoft==E"); } [Test] @@ -977,7 +977,7 @@ namespace MonoTests.System // here we check that we can recreate the "extact" same double from the "R" format string se = value.ToString ("R", CultureInfo.InvariantCulture); Double de = Double.Parse (se); - AssertEquals ("-E==-E", value, de); + Assert.AreEqual (value, de, "-E==-E"); } } } diff --git a/mcs/class/corlib/Test/System/DoubleTest.cs b/mcs/class/corlib/Test/System/DoubleTest.cs index 5ceaadec9de..573d4e94ecb 100644 --- a/mcs/class/corlib/Test/System/DoubleTest.cs +++ b/mcs/class/corlib/Test/System/DoubleTest.cs @@ -167,12 +167,12 @@ namespace MonoTests.System try { Assert.AreEqual (1234.5678, Double.Parse ("1,234.5678", NumberStyles.Float | NumberStyles.AllowThousands, Nfi), "#C1"); } catch (Exception e) { - Assertion.Fail ("#C2: Parse Failed NumberStyles.AllowThousands with e = " + e.ToString ()); + Assert.Fail ("#C2: Parse Failed NumberStyles.AllowThousands with e = " + e.ToString ()); } try { Double.Parse (null); - Assertion.Fail ("#D1"); + Assert.Fail ("#D1"); } catch (ArgumentNullException ex) { Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#D2"); Assert.IsNull (ex.InnerException, "#D3"); @@ -202,7 +202,7 @@ namespace MonoTests.System try { Double.Parse ("-1" + sep + "79769313486232e308"); - Assertion.Fail ("#G1"); + Assert.Fail ("#G1"); } catch (OverflowException ex) { Assert.AreEqual (typeof (OverflowException), ex.GetType (), "#G2"); Assert.IsNull (ex.InnerException, "#G3"); @@ -212,7 +212,7 @@ namespace MonoTests.System for (i = 0; i < string_values_fail.Length; ++i) { try { Double.Parse (string_values_fail [i]); - Assertion.Fail ("#H1: " + string_values_fail [i]); + Assert.Fail ("#H1: " + string_values_fail [i]); } catch (FormatException ex) { Assert.AreEqual (typeof (FormatException), ex.GetType (), "#H2"); Assert.IsNull (ex.InnerException, "#H3"); diff --git a/mcs/class/corlib/Test/System/EnumTest.cs b/mcs/class/corlib/Test/System/EnumTest.cs index 8524db3d3f9..e5b1e237528 100644 --- a/mcs/class/corlib/Test/System/EnumTest.cs +++ b/mcs/class/corlib/Test/System/EnumTest.cs @@ -187,6 +187,7 @@ namespace MonoTests.System Assert.AreEqual ("Test", Enum.Format (test.GetType (), test, "f"), "#H5"); } + [Test] public void TestFormat_FormatSpecifier () { ParameterAttributes pa = @@ -834,9 +835,9 @@ namespace MonoTests.System FlagsNegativeTestEnum t; t = FlagsNegativeTestEnum.None; - Assertion.AssertEquals ("#01", "None", t.ToString ()); + Assert.AreEqual ("None", t.ToString (), "#01"); t = FlagsNegativeTestEnum.One; - Assertion.AssertEquals ("#02", "One", t.ToString ()); + Assert.AreEqual ("One", t.ToString (), "#02"); } [Test] diff --git a/mcs/class/corlib/Test/System/FloatingPointFormatterTest.cs b/mcs/class/corlib/Test/System/FloatingPointFormatterTest.cs index b72bdd24442..51a41385d9d 100644 --- a/mcs/class/corlib/Test/System/FloatingPointFormatterTest.cs +++ b/mcs/class/corlib/Test/System/FloatingPointFormatterTest.cs @@ -18,7 +18,7 @@ using NUnit.Framework; namespace MonoTests.System { [TestFixture] - public class FloatingPointFormatterTest : Assertion + public class FloatingPointFormatterTest { CultureInfo old_culture; @@ -38,10 +38,10 @@ namespace MonoTests.System [Test] public void Format1 () { - AssertEquals ("F1", "100000000000000", 1.0e+14.ToString ()); - AssertEquals ("F2", "1E+15", 1.0e+15.ToString ()); - AssertEquals ("F3", "1E+16", 1.0e+16.ToString ()); - AssertEquals ("F4", "1E+17", 1.0e+17.ToString ()); + Assert.AreEqual ("100000000000000", 1.0e+14.ToString (), "F1"); + Assert.AreEqual ("1E+15", 1.0e+15.ToString (), "F2"); + Assert.AreEqual ("1E+16", 1.0e+16.ToString (), "F3"); + Assert.AreEqual ("1E+17", 1.0e+17.ToString (), "F4"); } [Test] @@ -50,40 +50,40 @@ namespace MonoTests.System CultureInfo ci = new CultureInfo ("en-US"); double val = 12345.1234567890123456; string s = val.ToString(".0################;-.0################;0.0", ci); - AssertEquals ("#1", "12345.123456789", s); + Assert.AreEqual ("12345.123456789", s, "#1"); s = (-val).ToString(".0################;-.0#######;#########;0.0", ci); - AssertEquals ("#2", "-12345.12345679", s); + Assert.AreEqual ("-12345.12345679", s, "#2"); s = 0.0.ToString(".0################;-.0#######;+-0", ci); - AssertEquals ("#3", "+-0", s); + Assert.AreEqual ("+-0", s, "#3"); } [Test] public void PermillePercent () { CultureInfo ci = CultureInfo.InvariantCulture; - AssertEquals ("#1", "485.7\u2030", (0.4857).ToString ("###.###\u2030")); + Assert.AreEqual ("485.7\u2030", (0.4857).ToString ("###.###\u2030"), "#1"); NumberFormatInfo nfi = new NumberFormatInfo (); nfi.NegativeSign = ""; nfi.PerMilleSymbol = "m"; nfi.PercentSymbol = "percent"; - AssertEquals ("#2", "m485.7", 0.4857.ToString ("\u2030###.###", nfi)); - AssertEquals ("#3", "485.7m", 0.4857.ToString ("###.###\u2030", nfi)); - AssertEquals ("#4", "percent48.57", 0.4857.ToString ("%###.###", nfi)); - AssertEquals ("#5", "48.57percent", 0.4857.ToString ("###.###%", nfi)); + Assert.AreEqual ("m485.7", 0.4857.ToString ("\u2030###.###", nfi), "#2"); + Assert.AreEqual ("485.7m", 0.4857.ToString ("###.###\u2030", nfi), "#3"); + Assert.AreEqual ("percent48.57", 0.4857.ToString ("%###.###", nfi), "#4"); + Assert.AreEqual ("48.57percent", 0.4857.ToString ("###.###%", nfi), "#5"); } [Test] public void LiteralMixed () { CultureInfo ci = CultureInfo.InvariantCulture; - AssertEquals ("#1", "test 235", 234.56.ToString ("'test' ###", ci)); - AssertEquals ("#2", "235 test", 234.56.ToString ("### 'test'", ci)); - AssertEquals ("#3", "234 test.56", 234.56.ToString ("### 'test'.###", ci)); - AssertEquals ("#1", "hoge 235", 234.56.ToString ("'hoge' ###", ci)); - AssertEquals ("#2", "235 hoge", 234.56.ToString ("### 'hoge'", ci)); - AssertEquals ("#3", "234 hoge.56", 234.56.ToString ("### 'hoge'.###", ci)); + Assert.AreEqual ("test 235", 234.56.ToString ("'test' ###", ci), "#1"); + Assert.AreEqual ("235 test", 234.56.ToString ("### 'test'", ci), "#2"); + Assert.AreEqual ("234 test.56", 234.56.ToString ("### 'test'.###", ci), "#3"); + Assert.AreEqual ("hoge 235", 234.56.ToString ("'hoge' ###", ci), "#1"); + Assert.AreEqual ("235 hoge", 234.56.ToString ("### 'hoge'", ci), "#2"); + Assert.AreEqual ("234 hoge.56", 234.56.ToString ("### 'hoge'.###", ci), "#3"); } } } diff --git a/mcs/class/corlib/Test/System/Int16Test.cs b/mcs/class/corlib/Test/System/Int16Test.cs index aa4285eadd9..676a7cd05b3 100644 --- a/mcs/class/corlib/Test/System/Int16Test.cs +++ b/mcs/class/corlib/Test/System/Int16Test.cs @@ -14,7 +14,7 @@ namespace MonoTests.System { [TestFixture] -public class Int16Test : Assertion +public class Int16Test { private const Int16 MyInt16_1 = -42; private const Int16 MyInt16_2 = -32768; @@ -55,36 +55,39 @@ public class Int16Test : Assertion Thread.CurrentThread.CurrentCulture = old_culture; } + [Test] public void TestMinMax() { - - AssertEquals(Int16.MinValue, MyInt16_2); - AssertEquals(Int16.MaxValue, MyInt16_3); + Assert.AreEqual(Int16.MinValue, MyInt16_2); + Assert.AreEqual(Int16.MaxValue, MyInt16_3); } - + + [Test] public void TestCompareTo() { - Assert(MyInt16_3.CompareTo(MyInt16_2) > 0); - Assert(MyInt16_2.CompareTo(MyInt16_2) == 0); - Assert(MyInt16_1.CompareTo((Int16)(-42)) == 0); - Assert(MyInt16_2.CompareTo(MyInt16_3) < 0); + Assert.IsTrue(MyInt16_3.CompareTo(MyInt16_2) > 0); + Assert.IsTrue(MyInt16_2.CompareTo(MyInt16_2) == 0); + Assert.IsTrue(MyInt16_1.CompareTo((Int16)(-42)) == 0); + Assert.IsTrue(MyInt16_2.CompareTo(MyInt16_3) < 0); try { MyInt16_2.CompareTo((object)100); - Fail("Should raise a System.ArgumentException"); + Assert.Fail ("Should raise a System.ArgumentException"); } catch (Exception e) { - Assert(typeof(ArgumentException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentException) == e.GetType()); } } + [Test] public void TestEquals() { - Assert(MyInt16_1.Equals(MyInt16_1)); - Assert(MyInt16_1.Equals((object)(Int16)(-42))); - Assert(MyInt16_1.Equals((object)(SByte)(-42)) == false); - Assert(MyInt16_1.Equals(MyInt16_2) == false); + Assert.IsTrue(MyInt16_1.Equals(MyInt16_1)); + Assert.IsTrue(MyInt16_1.Equals((object)(Int16)(-42))); + Assert.IsTrue(MyInt16_1.Equals((object)(SByte)(-42)) == false); + Assert.IsTrue(MyInt16_1.Equals(MyInt16_2) == false); } - + + [Test] public void TestGetHashCode() { try { @@ -93,93 +96,95 @@ public class Int16Test : Assertion MyInt16_3.GetHashCode(); } catch { - Fail("GetHashCode should not raise an exception here"); + Assert.Fail ("GetHashCode should not raise an exception here"); } } - + + [Test] public void TestParse() { //test Parse(string s) - Assert(MyInt16_1 == Int16.Parse(MyString1)); - Assert(MyInt16_2 == Int16.Parse(MyString2)); - Assert(MyInt16_3 == Int16.Parse(MyString3)); + Assert.IsTrue(MyInt16_1 == Int16.Parse(MyString1)); + Assert.IsTrue(MyInt16_2 == Int16.Parse(MyString2)); + Assert.IsTrue(MyInt16_3 == Int16.Parse(MyString3)); try { Int16.Parse(null); - Fail("Should raise a System.ArgumentNullException"); + Assert.Fail ("Should raise a System.ArgumentNullException"); } catch (Exception e) { - Assert(typeof(ArgumentNullException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentNullException) == e.GetType()); } try { Int16.Parse("not-a-number"); - Fail("Should raise a System.FormatException"); + Assert.Fail ("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } try { int OverInt = Int16.MaxValue + 1; Int16.Parse(OverInt.ToString()); - Fail("Should raise a System.OverflowException"); + Assert.Fail ("Should raise a System.OverflowException"); } catch (Exception e) { - Assert(typeof(OverflowException) == e.GetType()); + Assert.IsTrue(typeof(OverflowException) == e.GetType()); } //test Parse(string s, NumberStyles style) - Assert(42 == Int16.Parse(" $42 ", NumberStyles.Currency)); + Assert.IsTrue(42 == Int16.Parse(" $42 ", NumberStyles.Currency)); try { Int16.Parse("$42", NumberStyles.Integer); - Fail("Should raise a System.FormatException"); + Assert.Fail ("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } //test Parse(string s, IFormatProvider provider) - Assert(-42 == Int16.Parse(" -42 ", Nfi)); + Assert.IsTrue(-42 == Int16.Parse(" -42 ", Nfi)); try { Int16.Parse("%42", Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail ("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } //test Parse(string s, NumberStyles style, IFormatProvider provider) - Assert(16 == Int16.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); + Assert.IsTrue(16 == Int16.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); try { Int16.Parse("$42", NumberStyles.Integer, Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail ("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } } - + + [Test] public void TestToString() { //test ToString() - Assert(String.Compare(MyString1, MyInt16_1.ToString()) == 0); - Assert(String.Compare(MyString2, MyInt16_2.ToString()) == 0); - Assert(String.Compare(MyString3, MyInt16_3.ToString()) == 0); + Assert.IsTrue(String.Compare(MyString1, MyInt16_1.ToString()) == 0); + Assert.IsTrue(String.Compare(MyString2, MyInt16_2.ToString()) == 0); + Assert.IsTrue(String.Compare(MyString3, MyInt16_3.ToString()) == 0); //test ToString(string format) /* TODO: These tests are culture sensitive. Need to find a way to determine the culture of the system to decide the correct expected result. for (int i=0; i < Formats1.Length; i++) { - Assert(String.Compare(Results1[i], MyInt16_2.ToString(Formats1[i])) == 0); - Assert(String.Compare(Results2[i], MyInt16_3.ToString(Formats2[i])) == 0); + Assert.IsTrue(String.Compare(Results1[i], MyInt16_2.ToString(Formats1[i])) == 0); + Assert.IsTrue(String.Compare(Results2[i], MyInt16_3.ToString(Formats2[i])) == 0); } */ //test ToString(string format, IFormatProvider provider); for (int i=0; i < Formats1.Length; i++) { - Assert("i="+i+", ResultsNfi1[i]="+ResultsNfi1[i]+", MyInt16_2.ToString(Formats1[i]="+Formats1[i]+"): Expected "+ResultsNfi1[i]+" but got "+MyInt16_2.ToString(Formats1[i], Nfi), String.Compare(ResultsNfi1[i], MyInt16_2.ToString(Formats1[i], Nfi)) == 0); - Assert("i="+i+", ResultsNfi2[i]="+ResultsNfi2[i]+", MyInt16_3.ToString(Formats2[i]="+Formats2[i]+"): Expected "+ResultsNfi2[i]+" but got "+MyInt16_3.ToString(Formats2[i], Nfi), String.Compare(ResultsNfi2[i], MyInt16_3.ToString(Formats2[i], Nfi)) == 0); + Assert.IsTrue(String.Compare(ResultsNfi1[i], MyInt16_2.ToString(Formats1[i], Nfi)) == 0, "i="+i+", ResultsNfi1[i]="+ResultsNfi1[i]+", MyInt16_2.ToString(Formats1[i]="+Formats1[i]+"): Expected "+ResultsNfi1[i]+" but got "+MyInt16_2.ToString(Formats1[i], Nfi)); + Assert.IsTrue(String.Compare(ResultsNfi2[i], MyInt16_3.ToString(Formats2[i], Nfi)) == 0, "i="+i+", ResultsNfi2[i]="+ResultsNfi2[i]+", MyInt16_3.ToString(Formats2[i]="+Formats2[i]+"): Expected "+ResultsNfi2[i]+" but got "+MyInt16_3.ToString(Formats2[i], Nfi)); } try { MyInt16_1.ToString("z"); - Fail("Should raise a System.FormatException"); + Assert.Fail ("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } } @@ -189,14 +194,14 @@ public class Int16Test : Assertion Int16 i = 254; // everything defaults to "G" string def = i.ToString ("G"); - AssertEquals ("ToString()", def, i.ToString ()); - AssertEquals ("ToString((IFormatProvider)null)", def, i.ToString ((IFormatProvider)null)); - AssertEquals ("ToString((string)null)", def, i.ToString ((string)null)); - AssertEquals ("ToString(empty)", def, i.ToString (String.Empty)); - AssertEquals ("ToString(null,null)", def, i.ToString (null, null)); - AssertEquals ("ToString(empty,null)", def, i.ToString (String.Empty, null)); - - AssertEquals ("ToString(G)", "254", def); + Assert.AreEqual (def, i.ToString (), "ToString()"); + Assert.AreEqual (def, i.ToString ((IFormatProvider)null), "ToString((IFormatProvider)null)"); + Assert.AreEqual (def, i.ToString ((string)null), "ToString((string)null)"); + Assert.AreEqual (def, i.ToString (String.Empty), "ToString(empty)"); + Assert.AreEqual (def, i.ToString (null, null), "ToString(null,null)"); + Assert.AreEqual (def, i.ToString (String.Empty, null), "ToString(empty,null)"); + + Assert.AreEqual ("254", def, "ToString(G)"); } } diff --git a/mcs/class/corlib/Test/System/Int32Test.cs b/mcs/class/corlib/Test/System/Int32Test.cs index 4c2b7ae6adb..dfd7442b849 100644 --- a/mcs/class/corlib/Test/System/Int32Test.cs +++ b/mcs/class/corlib/Test/System/Int32Test.cs @@ -14,7 +14,7 @@ namespace MonoTests.System { [TestFixture] -public class Int32Test : Assertion +public class Int32Test { private const Int32 MyInt32_1 = -42; private const Int32 MyInt32_2 = -2147483648; @@ -68,36 +68,40 @@ public class Int32Test : Assertion Thread.CurrentThread.CurrentCulture = old_culture; } + [Test] public void TestMinMax() { - AssertEquals("#A01", Int32.MinValue, MyInt32_2); - AssertEquals("#A02", Int32.MaxValue, MyInt32_3); + Assert.AreEqual(Int32.MinValue, MyInt32_2, "#A01"); + Assert.AreEqual(Int32.MaxValue, MyInt32_3, "#A02"); } - + + [Test] public void TestCompareTo() { - Assert("MyInt32_3.CompareTo(MyInt32_2) > 0", MyInt32_3.CompareTo(MyInt32_2) > 0); - Assert("MyInt32_2.CompareTo(MyInt32_2) == 0", MyInt32_2.CompareTo(MyInt32_2) == 0); - Assert("MyInt32_1.CompareTo((Int32)(-42)) == 0", MyInt32_1.CompareTo((object)(Int32)(-42)) == 0); - Assert("MyInt32_2.CompareTo(MyInt32_3) < 0", MyInt32_2.CompareTo(MyInt32_3) < 0); + Assert.IsTrue(MyInt32_3.CompareTo(MyInt32_2) > 0, "MyInt32_3.CompareTo(MyInt32_2) > 0"); + Assert.IsTrue(MyInt32_2.CompareTo(MyInt32_2) == 0, "MyInt32_2.CompareTo(MyInt32_2) == 0"); + Assert.IsTrue(MyInt32_1.CompareTo((object)(Int32)(-42)) == 0, "MyInt32_1.CompareTo((Int32)(-42)) == 0"); + Assert.IsTrue(MyInt32_2.CompareTo(MyInt32_3) < 0, "MyInt32_2.CompareTo(MyInt32_3) < 0"); try { MyInt32_2.CompareTo((object)(Int16)100); - Fail("Should raise a System.ArgumentException"); + Assert.Fail("Should raise a System.ArgumentException"); } catch (Exception e) { - Assert("typeof(ArgumentException) == e.GetType()", typeof(ArgumentException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentException) == e.GetType(), "typeof(ArgumentException) == e.GetType()"); } } + [Test] public void TestEquals() { - Assert ("#B01", MyInt32_1.Equals (MyInt32_1)); - Assert ("#B02", MyInt32_1.Equals ((Int32)(-42))); - Assert ("#B03", MyInt32_1.Equals ((object)(SByte)(-42)) == false); - Assert ("#B04", MyInt32_1.Equals (MyInt32_2) == false); + Assert.IsTrue (MyInt32_1.Equals (MyInt32_1), "#B01"); + Assert.IsTrue (MyInt32_1.Equals ((Int32)(-42)), "#B02"); + Assert.IsTrue (MyInt32_1.Equals ((object)(SByte)(-42)) == false, "#B03"); + Assert.IsTrue (MyInt32_1.Equals (MyInt32_2) == false, "#B04"); } - + + [Test] public void TestGetHashCode() { try { @@ -106,210 +110,233 @@ public class Int32Test : Assertion MyInt32_3.GetHashCode(); } catch { - Fail("GetHashCode should not raise an exception here"); + Assert.Fail("GetHashCode should not raise an exception here"); } } - + + [Test] public void TestParse() { //test Parse(string s) - AssertEquals ("#C01", MyInt32_1, Int32.Parse (MyString1)); - AssertEquals ("#C02", MyInt32_2, Int32.Parse (MyString2)); - AssertEquals ("#C03", MyInt32_3, Int32.Parse (MyString3)); - - AssertEquals ("#C04", 1, Int32.Parse ("1")); - AssertEquals ("#C05", 1, Int32.Parse (" 1")); - AssertEquals ("#C06", 1, Int32.Parse (" 1")); - AssertEquals ("#C07", 1, Int32.Parse ("1 ")); - AssertEquals ("#C08", 1, Int32.Parse ("+1")); - AssertEquals ("#C09", -1, Int32.Parse ("-1")); - AssertEquals ("#C10", -1, Int32.Parse (" -1")); - AssertEquals ("#C11", -1, Int32.Parse (" -1 ")); - AssertEquals ("#C12", -1, Int32.Parse (" -1 ")); + Assert.AreEqual (MyInt32_1, Int32.Parse (MyString1), "#C01"); + Assert.AreEqual (MyInt32_2, Int32.Parse (MyString2), "#C02"); + Assert.AreEqual (MyInt32_3, Int32.Parse (MyString3), "#C03"); + + Assert.AreEqual (1, Int32.Parse ("1"), "#C04"); + Assert.AreEqual (1, Int32.Parse (" 1"), "#C05"); + Assert.AreEqual (1, Int32.Parse (" 1"), "#C06"); + Assert.AreEqual (1, Int32.Parse ("1 "), "#C07"); + Assert.AreEqual (1, Int32.Parse ("+1"), "#C08"); + Assert.AreEqual (-1, Int32.Parse ("-1"), "#C09"); + Assert.AreEqual (-1, Int32.Parse (" -1"), "#C10"); + Assert.AreEqual (-1, Int32.Parse (" -1 "), "#C11"); + Assert.AreEqual (-1, Int32.Parse (" -1 "), "#C12"); try { Int32.Parse(null); - Fail ("#C13: Should raise a System.ArgumentNullException"); + Assert.Fail ("#C13: Should raise a System.ArgumentNullException"); } catch (Exception e) { - Assert ("#C14", typeof (ArgumentNullException) == e.GetType()); + Assert.IsTrue (typeof (ArgumentNullException) == e.GetType(), "#C14"); } try { Int32.Parse("not-a-number"); - Fail ("#C15: Should raise a System.FormatException"); + Assert.Fail ("#C15: Should raise a System.FormatException"); } catch (Exception e) { - Assert ("#C16", typeof (FormatException) == e.GetType()); + Assert.IsTrue (typeof (FormatException) == e.GetType(), "#C16"); } try { double OverInt = (double)Int32.MaxValue + 1; Int32.Parse(OverInt.ToString()); - Fail ("#C17: Should raise a System.OverflowException"); + Assert.Fail ("#C17: Should raise a System.OverflowException"); } catch (Exception e) { - AssertEquals ("#C18", typeof (OverflowException), e.GetType()); + Assert.AreEqual (typeof (OverflowException), e.GetType(), "#C18"); } //test Parse(string s, NumberStyles style) - AssertEquals ("#C19", 42, Int32.Parse (" $42 ", NumberStyles.Currency)); + Assert.AreEqual (42, Int32.Parse (" $42 ", NumberStyles.Currency), "#C19"); try { Int32.Parse("$42", NumberStyles.Integer); - Fail ("#C20: Should raise a System.FormatException"); + Assert.Fail ("#C20: Should raise a System.FormatException"); } catch (Exception e) { - Assert ("#C21", typeof (FormatException) == e.GetType()); + Assert.IsTrue (typeof (FormatException) == e.GetType(), "#C21"); } //test Parse(string s, IFormatProvider provider) - AssertEquals ("#C22", -42, Int32.Parse (" -42 ", Nfi)); + Assert.AreEqual (-42, Int32.Parse (" -42 ", Nfi), "#C22"); try { Int32.Parse("%42", Nfi); - Fail ("#C23: Should raise a System.FormatException"); + Assert.Fail ("#C23: Should raise a System.FormatException"); } catch (Exception e) { - Assert ("#C24", typeof (FormatException) == e.GetType()); + Assert.IsTrue (typeof (FormatException) == e.GetType(), "#C24"); } //test Parse(string s, NumberStyles style, IFormatProvider provider) - AssertEquals ("#C25", 16, Int32.Parse (" 10 ", NumberStyles.HexNumber, Nfi)); + Assert.AreEqual (16, Int32.Parse (" 10 ", NumberStyles.HexNumber, Nfi), "#C25"); try { Int32.Parse("$42", NumberStyles.Integer, Nfi); - Fail ("#C26: Should raise a System.FormatException"); + Assert.Fail ("#C26: Should raise a System.FormatException"); } catch (Exception e) { - Assert("#C27", typeof (FormatException) == e.GetType()); + Assert.IsTrue(typeof (FormatException) == e.GetType(), "#C27"); } try { Int32.Parse (" - 1 "); - Fail ("#C28: Should raise FormatException"); + Assert.Fail ("#C28: Should raise FormatException"); } catch (Exception e){ - Assert ("#C29", typeof (FormatException) == e.GetType ()); + Assert.IsTrue (typeof (FormatException) == e.GetType (), "#C29"); } try { Int32.Parse (" - "); - Fail ("#C30: Should raise FormatException"); + Assert.Fail ("#C30: Should raise FormatException"); } catch (Exception e){ - Assert ("#C31", typeof (FormatException) == e.GetType ()); + Assert.IsTrue (typeof (FormatException) == e.GetType (), "#C31"); } - AssertEquals ("#C32", -123, Int32.Parse ("ffffff85", NumberStyles.HexNumber, Nfi)); + Assert.AreEqual (-123, Int32.Parse ("ffffff85", NumberStyles.HexNumber, Nfi), "#C32"); try { Int32.Parse ("100000000", NumberStyles.HexNumber, Nfi); - Fail ("#C33: Should raise OverflowException"); + Assert.Fail ("#C33: Should raise OverflowException"); } catch (Exception e){ - Assert ("#C34", typeof (OverflowException) == e.GetType ()); + Assert.IsTrue (typeof (OverflowException) == e.GetType (), "#C34"); } try { Int32.Parse ("2147483648"); - Fail ("C#35: should raise OverflowException"); + Assert.Fail ("C#35: should raise OverflowException"); } catch (Exception e) { - Assert ("C#36", typeof (OverflowException) == e.GetType ()); + Assert.IsTrue (typeof (OverflowException) == e.GetType (), "C#36"); } try { Int32.Parse ("2147483648", CultureInfo.InvariantCulture); - Fail ("C#37: should raise OverflowException"); + Assert.Fail ("C#37: should raise OverflowException"); } catch (Exception e) { - Assert ("C#38", typeof (OverflowException) == e.GetType ()); + Assert.IsTrue (typeof (OverflowException) == e.GetType (), "C#38"); + } + + try { + Int32.Parse (null); + Assert.Fail ("C#39: Should raise an ArgumentNullException"); + } catch (Exception e){ + Assert.IsTrue (typeof (ArgumentNullException) == e.GetType (), "C#40"); } + + try { + Int32.Parse ("123", (NumberStyles) 60000); + Assert.Fail ("C#41 Should raise an ArgumentException"); + } catch (Exception e){ + Assert.IsTrue (typeof (ArgumentException) == e.GetType (), "C#42"); + } + + // Pass a DateTimeFormatInfo, it is unable to format + // numbers, but we should not crash + + Int32.Parse ("123", new DateTimeFormatInfo ()); } #if NET_2_0 + [Test] public void TestTryParse() { int result; - AssertEquals (true, Int32.TryParse (MyString1, out result)); - AssertEquals (MyInt32_1, result); - AssertEquals (true, Int32.TryParse (MyString2, out result)); - AssertEquals (MyInt32_2, result); - AssertEquals (true, Int32.TryParse (MyString3, out result)); - AssertEquals (MyInt32_3, result); - - AssertEquals (true, Int32.TryParse ("1", out result)); - AssertEquals (1, result); - AssertEquals (true, Int32.TryParse (" 1", out result)); - AssertEquals (1, result); - AssertEquals (true, Int32.TryParse (" 1", out result)); - AssertEquals (1, result); - AssertEquals (true, Int32.TryParse ("1 ", out result)); - AssertEquals (1, result); - AssertEquals (true, Int32.TryParse ("+1", out result)); - AssertEquals (1, result); - AssertEquals (true, Int32.TryParse ("-1", out result)); - AssertEquals (-1, result); - AssertEquals (true, Int32.TryParse (" -1", out result)); - AssertEquals (-1, result); - AssertEquals (true, Int32.TryParse (" -1 ", out result)); - AssertEquals (-1, result); - AssertEquals (true, Int32.TryParse (" -1 ", out result)); - AssertEquals (-1, result); + Assert.AreEqual (true, Int32.TryParse (MyString1, out result)); + Assert.AreEqual (MyInt32_1, result); + Assert.AreEqual (true, Int32.TryParse (MyString2, out result)); + Assert.AreEqual (MyInt32_2, result); + Assert.AreEqual (true, Int32.TryParse (MyString3, out result)); + Assert.AreEqual (MyInt32_3, result); + + Assert.AreEqual (true, Int32.TryParse ("1", out result)); + Assert.AreEqual (1, result); + Assert.AreEqual (true, Int32.TryParse (" 1", out result)); + Assert.AreEqual (1, result); + Assert.AreEqual (true, Int32.TryParse (" 1", out result)); + Assert.AreEqual (1, result); + Assert.AreEqual (true, Int32.TryParse ("1 ", out result)); + Assert.AreEqual (1, result); + Assert.AreEqual (true, Int32.TryParse ("+1", out result)); + Assert.AreEqual (1, result); + Assert.AreEqual (true, Int32.TryParse ("-1", out result)); + Assert.AreEqual (-1, result); + Assert.AreEqual (true, Int32.TryParse (" -1", out result)); + Assert.AreEqual (-1, result); + Assert.AreEqual (true, Int32.TryParse (" -1 ", out result)); + Assert.AreEqual (-1, result); + Assert.AreEqual (true, Int32.TryParse (" -1 ", out result)); + Assert.AreEqual (-1, result); result = 1; - AssertEquals (false, Int32.TryParse (null, out result)); - AssertEquals (0, result); + Assert.AreEqual (false, Int32.TryParse (null, out result)); + Assert.AreEqual (0, result); - AssertEquals (false, Int32.TryParse ("not-a-number", out result)); + Assert.AreEqual (false, Int32.TryParse ("not-a-number", out result)); double OverInt = (double)Int32.MaxValue + 1; - AssertEquals (false, Int32.TryParse (OverInt.ToString (), out result)); - - AssertEquals (false, Int32.TryParse ("$42", NumberStyles.Integer, null, out result)); - AssertEquals (false, Int32.TryParse ("%42", NumberStyles.Integer, Nfi, out result)); - AssertEquals (false, Int32.TryParse ("$42", NumberStyles.Integer, Nfi, out result)); - AssertEquals (false, Int32.TryParse (" - 1 ", out result)); - AssertEquals (false, Int32.TryParse (" - ", out result)); - AssertEquals (false, Int32.TryParse ("100000000", NumberStyles.HexNumber, Nfi, out result)); - AssertEquals (false, Int32.TryParse ("10000000000", out result)); - AssertEquals (false, Int32.TryParse ("-10000000000", out result)); - AssertEquals (true, Int32.TryParse ("7fffffff", NumberStyles.HexNumber, Nfi, out result)); - AssertEquals (Int32.MaxValue, result); - AssertEquals (true, Int32.TryParse ("80000000", NumberStyles.HexNumber, Nfi, out result)); - AssertEquals (Int32.MinValue, result); - AssertEquals (true, Int32.TryParse ("ffffffff", NumberStyles.HexNumber, Nfi, out result)); - AssertEquals (-1, result); - AssertEquals (false, Int32.TryParse ("100000000", NumberStyles.HexNumber, Nfi, out result)); + Assert.AreEqual (false, Int32.TryParse (OverInt.ToString (), out result)); + + Assert.AreEqual (false, Int32.TryParse ("$42", NumberStyles.Integer, null, out result)); + Assert.AreEqual (false, Int32.TryParse ("%42", NumberStyles.Integer, Nfi, out result)); + Assert.AreEqual (false, Int32.TryParse ("$42", NumberStyles.Integer, Nfi, out result)); + Assert.AreEqual (false, Int32.TryParse (" - 1 ", out result)); + Assert.AreEqual (false, Int32.TryParse (" - ", out result)); + Assert.AreEqual (false, Int32.TryParse ("100000000", NumberStyles.HexNumber, Nfi, out result)); + Assert.AreEqual (false, Int32.TryParse ("10000000000", out result)); + Assert.AreEqual (false, Int32.TryParse ("-10000000000", out result)); + Assert.AreEqual (true, Int32.TryParse ("7fffffff", NumberStyles.HexNumber, Nfi, out result)); + Assert.AreEqual (Int32.MaxValue, result); + Assert.AreEqual (true, Int32.TryParse ("80000000", NumberStyles.HexNumber, Nfi, out result)); + Assert.AreEqual (Int32.MinValue, result); + Assert.AreEqual (true, Int32.TryParse ("ffffffff", NumberStyles.HexNumber, Nfi, out result)); + Assert.AreEqual (-1, result); + Assert.AreEqual (false, Int32.TryParse ("100000000", NumberStyles.HexNumber, Nfi, out result)); } #endif - + + [Test] public void TestToString() { //test ToString() - AssertEquals ("#D01", MyString1, MyInt32_1.ToString ()); - AssertEquals ("#D02", MyString2, MyInt32_2.ToString ()); - AssertEquals ("#D03", MyString3, MyInt32_3.ToString ()); + Assert.AreEqual (MyString1, MyInt32_1.ToString (), "#D01"); + Assert.AreEqual (MyString2, MyInt32_2.ToString (), "#D02"); + Assert.AreEqual (MyString3, MyInt32_3.ToString (), "#D03"); //test ToString(string format, IFormatProvider provider); for (int i=0; i < Formats1.Length; i++) { - AssertEquals ("#D04(" + i + "," + Formats1 [i] + ")", - ResultsNfi1 [i], MyInt32_2.ToString (Formats1 [i], Nfi)); - AssertEquals ("#D05(" + i + "," + Formats2 [i] + ")", - ResultsNfi2 [i], MyInt32_3.ToString (Formats2 [i], Nfi)); + Assert.AreEqual (ResultsNfi1 [i], MyInt32_2.ToString (Formats1 [i], Nfi), + "#D04(" + i + "," + Formats1 [i] + ")"); + Assert.AreEqual (ResultsNfi2 [i], MyInt32_3.ToString (Formats2 [i], Nfi), + "#D05(" + i + "," + Formats2 [i] + ")"); } //test ToString(string format) for (int i=0; i < Formats1.Length; i++) { - AssertEquals ("#D06(" + i + ")", Results1 [i], - MyInt32_2.ToString(Formats1[i])); - AssertEquals ("#D07(" + i + ")", Results2 [i], - MyInt32_3.ToString(Formats2[i])); + Assert.AreEqual (Results1 [i], MyInt32_2.ToString(Formats1[i]), "#D06(" + i + ")"); + Assert.AreEqual (Results2 [i], MyInt32_3.ToString(Formats2[i]), + "#D07(" + i + ")"); + } try { MyInt32_1.ToString("z"); - Fail ("#D08: Should raise a System.FormatException"); + Assert.Fail ("#D08: Should raise a System.FormatException"); } catch (Exception e) { - Assert ("#D09", typeof (FormatException) == e.GetType()); + Assert.IsTrue (typeof (FormatException) == e.GetType(), "#D09"); } } + [Test] public void TestCustomToString() { int i = 123; - AssertEquals ("Custom format string 00000", "00123", i.ToString ("00000")); - AssertEquals ("Custom format string ####", "123", i.ToString ("####")); - AssertEquals ("Custom format string ####", "0123", i.ToString ("0###")); - AssertEquals ("Custom format string ####", "0123", i.ToString ("#0###")); - AssertEquals ("Custom format string ####", "000123", i.ToString ("0#0###")); + Assert.AreEqual ("00123", i.ToString ("00000"), "Custom format string 00000"); + Assert.AreEqual ("123", i.ToString ("####"), "Custom format string ####"); + Assert.AreEqual ("0123", i.ToString ("0###"), "Custom format string ####"); + Assert.AreEqual ("0123", i.ToString ("#0###"), "Custom format string ####"); + Assert.AreEqual ("000123", i.ToString ("0#0###"), "Custom format string ####"); } [Test] @@ -318,10 +345,10 @@ public class Int32Test : Assertion int hundred = 100; int neghund = -100; - Assert ("#TS1", hundred.ToString ("#;#") == "100"); - Assert ("#TS2", hundred.ToString ("-#;#") == "-100"); - Assert ("#TS3", neghund.ToString ("#;#") == "100"); - Assert ("#TS3", neghund.ToString ("#;-#") == "-100"); + Assert.IsTrue ( hundred.ToString ("#;#") == "100", "#TS1"); + Assert.IsTrue ( hundred.ToString ("-#;#") == "-100", "#TS2"); + Assert.IsTrue ( neghund.ToString ("#;#") == "100", "#TS3"); + Assert.IsTrue ( neghund.ToString ("#;-#") == "-100", "#TS3"); } [Test] @@ -330,14 +357,14 @@ public class Int32Test : Assertion Int32 i = 254; // everything defaults to "G" string def = i.ToString ("G"); - AssertEquals ("ToString()", def, i.ToString ()); - AssertEquals ("ToString((IFormatProvider)null)", def, i.ToString ((IFormatProvider)null)); - AssertEquals ("ToString((string)null)", def, i.ToString ((string)null)); - AssertEquals ("ToString(empty)", def, i.ToString (String.Empty)); - AssertEquals ("ToString(null,null)", def, i.ToString (null, null)); - AssertEquals ("ToString(empty,null)", def, i.ToString (String.Empty, null)); - - AssertEquals ("ToString(G)", "254", def); + Assert.AreEqual (def, i.ToString (), "ToString()"); + Assert.AreEqual (def, i.ToString ((IFormatProvider)null), "ToString((IFormatProvider)null)"); + Assert.AreEqual (def, i.ToString ((string)null), "ToString((string)null)"); + Assert.AreEqual (def, i.ToString (String.Empty), "ToString(empty)"); + Assert.AreEqual (def, i.ToString (null, null), "ToString(null,null)"); + Assert.AreEqual (def, i.ToString (String.Empty, null), "ToString(empty,null)"); + + Assert.AreEqual ("254", def, "ToString(G)"); } } diff --git a/mcs/class/corlib/Test/System/Int64Test.cs b/mcs/class/corlib/Test/System/Int64Test.cs index a377f943df7..0c5fa0f16ab 100644 --- a/mcs/class/corlib/Test/System/Int64Test.cs +++ b/mcs/class/corlib/Test/System/Int64Test.cs @@ -12,8 +12,6 @@ using System; using System.Globalization; using System.Threading; -using AssertType = NUnit.Framework.Assert; - /// /// Tests for System.Int64 /// @@ -21,7 +19,7 @@ namespace MonoTests.System { [TestFixture] -public class Int64Test : Assertion +public class Int64Test { private const Int64 MyInt64_1 = -42; private const Int64 MyInt64_2 = -9223372036854775808; @@ -111,36 +109,40 @@ public class Int64Test : Assertion Thread.CurrentThread.CurrentCulture = old_culture; } + [Test] public void TestMinMax() { - AssertEquals(Int64.MinValue, MyInt64_2); - AssertEquals(Int64.MaxValue, MyInt64_3); + Assert.AreEqual(Int64.MinValue, MyInt64_2); + Assert.AreEqual(Int64.MaxValue, MyInt64_3); } - + + [Test] public void TestCompareTo() { - Assert(MyInt64_3.CompareTo(MyInt64_2) > 0); - Assert(MyInt64_2.CompareTo(MyInt64_2) == 0); - Assert(MyInt64_1.CompareTo((object)(Int64)(-42)) == 0); - Assert(MyInt64_2.CompareTo(MyInt64_3) < 0); + Assert.IsTrue(MyInt64_3.CompareTo(MyInt64_2) > 0); + Assert.IsTrue(MyInt64_2.CompareTo(MyInt64_2) == 0); + Assert.IsTrue(MyInt64_1.CompareTo((object)(Int64)(-42)) == 0); + Assert.IsTrue(MyInt64_2.CompareTo(MyInt64_3) < 0); try { MyInt64_2.CompareTo((object)(Int16)100); - Fail("Should raise a System.ArgumentException"); + Assert.Fail("Should raise a System.ArgumentException"); } catch (Exception e) { - Assert(typeof(ArgumentException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentException) == e.GetType()); } } + [Test] public void TestEquals() { - Assert(MyInt64_1.Equals(MyInt64_1)); - Assert(MyInt64_1.Equals((object)(Int64)(-42))); - Assert(MyInt64_1.Equals((object)(SByte)(-42)) == false); - Assert(MyInt64_1.Equals(MyInt64_2) == false); + Assert.IsTrue(MyInt64_1.Equals(MyInt64_1)); + Assert.IsTrue(MyInt64_1.Equals((object)(Int64)(-42))); + Assert.IsTrue(MyInt64_1.Equals((object)(SByte)(-42)) == false); + Assert.IsTrue(MyInt64_1.Equals(MyInt64_2) == false); } - + + [Test] public void TestGetHashCode() { try { @@ -149,38 +151,41 @@ public class Int64Test : Assertion MyInt64_3.GetHashCode(); } catch { - Fail("GetHashCode should not raise an exception here"); + Assert.Fail("GetHashCode should not raise an exception here"); } } - + + [Test] public void TestRoundTripGeneral() { foreach(long lv in vals) { string s = lv.ToString(Nfi); long lv2 = Int64.Parse(s); - Assert(lv == lv2); + Assert.IsTrue(lv == lv2); long lv3 = Int64.Parse(s, NumberStyles.Integer, Nfi); - Assert(lv == lv3); + Assert.IsTrue(lv == lv3); } } + [Test] public void TestRoundTripHex() { foreach(long lv in vals) { string s = lv.ToString("x", Nfi); long lv2 = Int64.Parse(s, NumberStyles.HexNumber, Nfi); - Assert(lv == lv2); + Assert.IsTrue(lv == lv2); } } + [Test] public void TestParseNull() { try { Int64.Parse(null); - Fail("Should raise System.ArgumentNullException"); + Assert.Fail("Should raise System.ArgumentNullException"); } catch (ArgumentNullException) { @@ -188,17 +193,18 @@ public class Int64Test : Assertion } } + [Test] public void TestParse() { long lv; lv = Int64.Parse(sval1Test1, style1, Nfi); - AssertEquals("Long value should be equal for Test1", val1, lv); + Assert.AreEqual(val1, lv, "Long value should be equal for Test1"); try { lv = Int64.Parse(sval1Test1, Nfi); - Fail("Should raise FormatException 1"); + Assert.Fail("Should raise FormatException 1"); } catch (FormatException) { @@ -206,14 +212,14 @@ public class Int64Test : Assertion } lv = Int64.Parse(sval1Test2, style1, Nfi); - AssertEquals("Value should be the same for Test2 with style1", val1, lv); + Assert.AreEqual(val1, lv, "Value should be the same for Test2 with style1"); lv = Int64.Parse(sval1Test2, Nfi); - AssertEquals("Value should be the same for Test2 without style1", val1, lv); + Assert.AreEqual(val1, lv, "Value should be the same for Test2 without style1"); try { lv = Int64.Parse(sval1Test4, style1, Nfi); - Fail("Should raise FormatException 3"); + Assert.Fail("Should raise FormatException 3"); } catch (FormatException) { @@ -221,123 +227,125 @@ public class Int64Test : Assertion } lv = Int64.Parse(sval1Test5, NumberStyles.Currency, Nfi); - AssertEquals("Value should be the same for Test5 and currency style", val1, lv); + Assert.AreEqual(val1, lv, "Value should be the same for Test5 and currency style"); //test Parse(string s) - Assert(MyInt64_1 == Int64.Parse(MyString1)); - Assert(MyInt64_2 == Int64.Parse(MyString2)); - Assert(MyInt64_3 == Int64.Parse(MyString3)); + Assert.IsTrue(MyInt64_1 == Int64.Parse(MyString1)); + Assert.IsTrue(MyInt64_2 == Int64.Parse(MyString2)); + Assert.IsTrue(MyInt64_3 == Int64.Parse(MyString3)); try { Int64.Parse(null); - Fail("#1:Should raise a System.ArgumentNullException"); + Assert.Fail("#1:Should raise a System.ArgumentNullException"); } catch (Exception e) { - Assert("#2", typeof(ArgumentNullException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentNullException) == e.GetType(), "#2"); } try { Int64.Parse("not-a-number"); - Fail("#3:Should raise a System.FormatException"); + Assert.Fail("#3:Should raise a System.FormatException"); } catch (Exception e) { - Assert("#4", typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType(), "#4"); } //test Parse(string s, NumberStyles style) try { double OverInt = (double)Int64.MaxValue + 1; Int64.Parse(OverInt.ToString(), NumberStyles.Float); - Fail("#5:Should raise a System.OverflowException"); + Assert.Fail("#5:Should raise a System.OverflowException"); } catch (Exception e) { - Assert("#6", typeof(OverflowException) == e.GetType()); + Assert.IsTrue(typeof(OverflowException) == e.GetType(), "#6"); } try { Int64.Parse("10000000000000000", NumberStyles.HexNumber); - Fail("#7:Should raise a System.OverflowException"); + Assert.Fail("#7:Should raise a System.OverflowException"); } catch (Exception e) { - Assert("#8", typeof(OverflowException) == e.GetType()); + Assert.IsTrue(typeof(OverflowException) == e.GetType(), "#8"); } try { double OverInt = (double)Int64.MaxValue + 1; Int64.Parse(OverInt.ToString(), NumberStyles.Integer); - Fail("#9:Should raise a System.FormatException"); + Assert.Fail("#9:Should raise a System.FormatException"); } catch (Exception e) { - Assert("#10", typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType(), "#10"); } - AssertEquals("A1", (long)42, Int64.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", NumberStyles.Currency)); + Assert.AreEqual((long)42, Int64.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", NumberStyles.Currency), "A1"); try { Int64.Parse(NumberFormatInfo.CurrentInfo.CurrencySymbol+"42", NumberStyles.Integer); - Fail("#11:Should raise a System.FormatException"); + Assert.Fail("#11:Should raise a System.FormatException"); } catch (Exception e) { - Assert("#12", typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType(), "#12"); } //test Parse(string s, IFormatProvider provider) - Assert("A2", -42 == Int64.Parse(" -42 ", Nfi)); + Assert.IsTrue(-42 == Int64.Parse(" -42 ", Nfi), "A2"); try { Int64.Parse("%42", Nfi); - Fail("#13:Should raise a System.FormatException"); + Assert.Fail("#13:Should raise a System.FormatException"); } catch (Exception e) { - Assert("#14", typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType(), "#14"); } //test Parse(string s, NumberStyles style, IFormatProvider provider) - Assert("A3", 16 == Int64.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); + Assert.IsTrue(16 == Int64.Parse(" 10 ", NumberStyles.HexNumber, Nfi), "A3"); try { Int64.Parse(NumberFormatInfo.CurrentInfo.CurrencySymbol+"42", NumberStyles.Integer, Nfi); - Fail("#15:Should raise a System.FormatException"); + Assert.Fail("#15:Should raise a System.FormatException"); } catch (Exception e) { - Assert("#16", typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType(), "#16"); } try { long.Parse ("9223372036854775808"); - AssertType.Fail ("#17:should raise an OverflowException"); + Assert.Fail ("#17:should raise an OverflowException"); } catch (Exception e) { - Assert("#18", typeof(OverflowException) == e.GetType()); + Assert.IsTrue(typeof(OverflowException) == e.GetType(), "#18"); } try { long.Parse ("9223372036854775808", CultureInfo.InvariantCulture); - AssertType.Fail ("#19:should raise an OverflowException"); + Assert.Fail ("#19:should raise an OverflowException"); } catch (Exception e) { - Assert("#20", typeof(OverflowException) == e.GetType()); + Assert.IsTrue(typeof(OverflowException) == e.GetType(), "#20"); } } + [Test] public void TestToString() { string s; s = val1.ToString("c", Nfi); - Assert("val1 does not become sval1Test6", s.Equals(sval1Test6)); + Assert.IsTrue(s.Equals(sval1Test6), "val1 does not become sval1Test6"); s = val1.ToString("n", Nfi); - AssertEquals("val1 does not become sval1Test7", sval1Test7, s); + Assert.AreEqual(sval1Test7, s, "val1 does not become sval1Test7"); //test ToString() - AssertEquals("MyInt64_1.ToString()", MyString1, MyInt64_1.ToString()); - AssertEquals("MyInt64_2.ToString()", MyString2, MyInt64_2.ToString()); - AssertEquals("MyInt64_3.ToString()", MyString3, MyInt64_3.ToString()); + Assert.AreEqual(MyString1, MyInt64_1.ToString(), "MyInt64_1.ToString()"); + Assert.AreEqual(MyString2, MyInt64_2.ToString(), "MyInt64_2.ToString()"); + Assert.AreEqual(MyString3, MyInt64_3.ToString(), "MyInt64_3.ToString()"); //test ToString(string format) for (int i=0; i < Formats1.Length; i++) { - AssertEquals("MyInt64_2.ToString(Formats1["+i+"])", Results1[i], MyInt64_2.ToString(Formats1[i])); - AssertEquals("MyInt64_3.ToString(Formats2["+i+"])", Results2[i], MyInt64_3.ToString(Formats2[i])); + Assert.AreEqual(Results1[i], MyInt64_2.ToString(Formats1[i]), "MyInt64_2.ToString(Formats1["+i+"])"); + Assert.AreEqual(Results2[i], MyInt64_3.ToString(Formats2[i]), "MyInt64_3.ToString(Formats2["+i+"])"); } //test ToString(string format, IFormatProvider provider); for (int i=0; i < Formats1.Length; i++) { - AssertEquals("MyInt64_2.ToString(Formats1["+i+"], Nfi)", ResultsNfi1[i], MyInt64_2.ToString(Formats1[i], Nfi)); - AssertEquals("MyInt64_3.ToString(Formats2["+i+"], Nfi)", ResultsNfi2[i], MyInt64_3.ToString(Formats2[i], Nfi)); + Assert.AreEqual(ResultsNfi1[i], MyInt64_2.ToString(Formats1[i], Nfi), "MyInt64_2.ToString(Formats1["+i+"], Nfi)"); + Assert.AreEqual(ResultsNfi2[i], MyInt64_3.ToString(Formats2[i], Nfi), "MyInt64_3.ToString(Formats2["+i+"], Nfi)"); } try { MyInt64_1.ToString("z"); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - AssertEquals("Exception is wrong type", typeof(FormatException), e.GetType()); + Assert.AreEqual(typeof(FormatException), e.GetType(), "Exception is wrong type"); } } + [Test] public void TestUserCurrency() { string s= ""; @@ -346,50 +354,51 @@ public class Int64Test : Assertion try { s = val1.ToString("c", NfiUser); iTest++; - AssertEquals("Currency value type 1 is not what we want to try to parse", sval1UserCur1, s); + Assert.AreEqual(sval1UserCur1, s, "Currency value type 1 is not what we want to try to parse"); iTest++; v = Int64.Parse(s, NumberStyles.Currency, NfiUser); iTest++; - Assert(v == val1); + Assert.IsTrue(v == val1); } catch (Exception e) { - Fail ("1 Unexpected exception at iTest = " + iTest + ", s = " + s + ":e = " + e); + Assert.Fail ("1 Unexpected exception at iTest = " + iTest + ", s = " + s + ":e = " + e); } iTest = 1; try { s = val2.ToString("c", NfiUser); iTest++; - AssertEquals("Currency value type 2 is not what we want to try to parse", sval2UserCur1, s); + Assert.AreEqual(sval2UserCur1, s, "Currency value type 2 is not what we want to try to parse"); iTest++; v = Int64.Parse(s, NumberStyles.Currency, NfiUser); iTest++; - Assert(v == val2); + Assert.IsTrue(v == val2); } catch (Exception e) { - Fail ("2 Unexpected exception at iTest = " + iTest + ":e = " + e); + Assert.Fail ("2 Unexpected exception at iTest = " + iTest + ":e = " + e); } } + [Test] public void TestUserPercent() { string s; s = val1.ToString("p", NfiUser); - Assert(s.Equals(sval1UserPercent1)); + Assert.IsTrue(s.Equals(sval1UserPercent1)); s = val2.ToString("p", NfiUser); - Assert(s.Equals(sval2UserPercent1)); + Assert.IsTrue(s.Equals(sval2UserPercent1)); } [Test] public void Parse_MaxValue () { - AssertEquals ("9223372036854775807", Int64.MaxValue, Int64.Parse ("9223372036854775807")); + Assert.AreEqual (Int64.MaxValue, Int64.Parse ("9223372036854775807"), "9223372036854775807"); } [Test] public void Parse_MinValue () { - AssertEquals ("-9223372036854775808,10", Int64.MinValue, Int64.Parse ("-9223372036854775808")); + Assert.AreEqual (Int64.MinValue, Int64.Parse ("-9223372036854775808"), "-9223372036854775808,10"); } [Test] @@ -426,14 +435,14 @@ public class Int64Test : Assertion Int64 i = 254; // everything defaults to "G" string def = i.ToString ("G"); - AssertEquals ("ToString()", def, i.ToString ()); - AssertEquals ("ToString((IFormatProvider)null)", def, i.ToString ((IFormatProvider)null)); - AssertEquals ("ToString((string)null)", def, i.ToString ((string)null)); - AssertEquals ("ToString(empty)", def, i.ToString (String.Empty)); - AssertEquals ("ToString(null,null)", def, i.ToString (null, null)); - AssertEquals ("ToString(empty,null)", def, i.ToString (String.Empty, null)); - - AssertEquals ("ToString(G)", "254", def); + Assert.AreEqual (def, i.ToString (), "ToString()"); + Assert.AreEqual (def, i.ToString ((IFormatProvider)null), "ToString((IFormatProvider)null)"); + Assert.AreEqual (def, i.ToString ((string)null), "ToString((string)null)"); + Assert.AreEqual (def, i.ToString (String.Empty), "ToString(empty)"); + Assert.AreEqual (def, i.ToString (null, null), "ToString(null,null)"); + Assert.AreEqual (def, i.ToString (String.Empty, null), "ToString(empty,null)"); + + Assert.AreEqual ("254", def, "ToString(G)"); } } } diff --git a/mcs/class/corlib/Test/System/IntPtrTest.cs b/mcs/class/corlib/Test/System/IntPtrTest.cs index 46283956ccc..52bf681160e 100644 --- a/mcs/class/corlib/Test/System/IntPtrTest.cs +++ b/mcs/class/corlib/Test/System/IntPtrTest.cs @@ -13,9 +13,11 @@ using NUnit.Framework; namespace MonoTests.System { [TestFixture] - public class IntPtrTest : Assertion { + public class IntPtrTest { + // The corresponding fix was reverted (r136567) [Test] + [Category ("NotWorking")] [ExpectedException (typeof (OverflowException))] public void Test64on32 () { @@ -43,10 +45,10 @@ namespace MonoTests.System { // for 64 bits machines if (IntPtr.Size > 4) { IntPtr pmax = new IntPtr (Int64.MaxValue); - AssertEquals ("Max", Int64.MaxValue, (long) pmax); + Assert.AreEqual (Int64.MaxValue, (long) pmax, "Max"); IntPtr pmin = new IntPtr (Int64.MinValue); - AssertEquals ("Min", Int64.MinValue, (long) pmin); + Assert.AreEqual (Int64.MinValue, (long) pmin, "Min"); } } @@ -54,8 +56,8 @@ namespace MonoTests.System { [Test] public void ToStringWithFormat () { - AssertEquals ("#1", "0", IntPtr.Zero.ToString ("x")); - AssertEquals ("#2", "3b9aca00", new IntPtr (1000000000).ToString ("x")); + Assert.AreEqual ("0", IntPtr.Zero.ToString ("x"), "#1"); + Assert.AreEqual ("3b9aca00", new IntPtr (1000000000).ToString ("x"), "#2"); } #endif } diff --git a/mcs/class/corlib/Test/System/IntegerFormatterTest.cs b/mcs/class/corlib/Test/System/IntegerFormatterTest.cs index 39e76b0a00b..8873f308cdc 100644 --- a/mcs/class/corlib/Test/System/IntegerFormatterTest.cs +++ b/mcs/class/corlib/Test/System/IntegerFormatterTest.cs @@ -16,7 +16,8 @@ using System.Threading; namespace MonoTests.System { -public class IntegerFormatterTest : TestCase +[TestFixture] +public class IntegerFormatterTest { private const int INT32 = 0; private const int INT64 = 1; @@ -26,10 +27,7 @@ public class IntegerFormatterTest : TestCase public IntegerFormatterTest () {} - protected override void SetUp () {} - - protected override void TearDown() {} - + [Test] public void TestStandard () { // Make the test Culture insensitive @@ -94,19 +92,19 @@ public class IntegerFormatterTest : TestCase switch (testType) { case INT32: int i32 = Int32.Parse (number, nfi); - AssertEquals(id, expected, i32.ToString (format, nfi)); + Assert.AreEqual(expected, i32.ToString (format, nfi), id); break; case INT64: long i64 = Int64.Parse (number, nfi); - AssertEquals(id, expected, i64.ToString (format, nfi)); + Assert.AreEqual(expected, i64.ToString (format, nfi), id); break; case UINT32: uint ui32 = UInt32.Parse (number, nfi); - AssertEquals(id, expected, ui32.ToString (format, nfi)); + Assert.AreEqual(expected, ui32.ToString (format, nfi), id); break; case UINT64: ulong ui64 = UInt64.Parse (number, nfi); - AssertEquals(id, expected, ui64.ToString (format, nfi)); + Assert.AreEqual(expected, ui64.ToString (format, nfi), id); break; } } diff --git a/mcs/class/corlib/Test/System/MarshalByRefObjectTest.cs b/mcs/class/corlib/Test/System/MarshalByRefObjectTest.cs index 117ff776c2a..45dcf5dd5bf 100644 --- a/mcs/class/corlib/Test/System/MarshalByRefObjectTest.cs +++ b/mcs/class/corlib/Test/System/MarshalByRefObjectTest.cs @@ -77,7 +77,7 @@ namespace MonoTests.System RemotingServices.Marshal(objMarshal); ObjRef objRef = objMarshal.CreateObjRef(typeof(MarshalObject)); - Assertion.AssertEquals("#A01", objRef.URI, RemotingServices.GetObjectUri(objMarshal)); + Assert.AreEqual(objRef.URI, RemotingServices.GetObjectUri(objMarshal), "#A01"); // TODO: When implemented in the mono RemotingServices class //RemotingServices.Disconnect(objMarshal); @@ -104,7 +104,7 @@ namespace MonoTests.System objMarshal.InitializeLifetimeService(); ILease lease = (ILease) objMarshal.GetLifetimeService(); - Assertion.AssertEquals("#A02", lease.InitialLeaseTime, TimeSpan.FromSeconds(10)); + Assert.AreEqual(lease.InitialLeaseTime, TimeSpan.FromSeconds(10), "#A02"); // TODO: When implemented in the mono RemotingServices class //RemotingServices.Disconnect(objMarshal); @@ -127,7 +127,7 @@ namespace MonoTests.System MarshalObject objMarshalRem = (MarshalObject) objRem; - Assertion.AssertEquals("#A03", 1, objMarshalRem.Id); + Assert.AreEqual(1, objMarshalRem.Id, "#A03"); // TODO: When implemented in the mono RemotingServices class //RemotingServices.Disconnect(objMarshal); diff --git a/mcs/class/corlib/Test/System/ModuleHandleTest.cs b/mcs/class/corlib/Test/System/ModuleHandleTest.cs index b966c5aa797..4bf91b7f926 100644 --- a/mcs/class/corlib/Test/System/ModuleHandleTest.cs +++ b/mcs/class/corlib/Test/System/ModuleHandleTest.cs @@ -27,7 +27,7 @@ namespace MonoTests.System { [TestFixture] -public class ModuleHandleTest : Assertion +public class ModuleHandleTest { public static int foo; @@ -53,7 +53,7 @@ public class ModuleHandleTest : Assertion [Test] public void ResolveTypeToken () { // A typedef - AssertEquals (typeof (ModuleHandleTest), Type.GetTypeFromHandle (module.ResolveTypeHandle (typeof (ModuleHandleTest).MetadataToken))); + Assert.AreEqual (typeof (ModuleHandleTest), Type.GetTypeFromHandle (module.ResolveTypeHandle (typeof (ModuleHandleTest).MetadataToken))); } [Test] @@ -80,7 +80,7 @@ public class ModuleHandleTest : Assertion public void ResolveFieldToken () { FieldInfo fi = typeof (ModuleHandleTest).GetField ("foo"); - AssertEquals (fi, FieldInfo.GetFieldFromHandle (module.ResolveFieldHandle (fi.MetadataToken))); + Assert.AreEqual (fi, FieldInfo.GetFieldFromHandle (module.ResolveFieldHandle (fi.MetadataToken))); } [Test] @@ -123,7 +123,7 @@ public class ModuleHandleTest : Assertion public void ResolveMethodToken () { MethodInfo mi = typeof (ModuleHandleTest).GetMethod ("ResolveMethodToken"); - AssertEquals (mi, MethodInfo.GetMethodFromHandle (module.ResolveMethodHandle (mi.MetadataToken))); + Assert.AreEqual (mi, MethodInfo.GetMethodFromHandle (module.ResolveMethodHandle (mi.MetadataToken))); } [Test] @@ -167,7 +167,7 @@ public class ModuleHandleTest : Assertion module.GetPEKind (out pe_kind, out machine); - AssertEquals (PortableExecutableKinds.ILOnly, pe_kind); + Assert.AreEqual (PortableExecutableKinds.ILOnly, pe_kind); } [Test] diff --git a/mcs/class/corlib/Test/System/MulticastDelegate.cs b/mcs/class/corlib/Test/System/MulticastDelegate.cs index 729525e579e..4004ceaa258 100644 --- a/mcs/class/corlib/Test/System/MulticastDelegate.cs +++ b/mcs/class/corlib/Test/System/MulticastDelegate.cs @@ -5,32 +5,17 @@ // (C) Daniel Stodden // -// these are the standard namespaces you will need. You may need to add more -// depending on your tests. using NUnit.Framework; using System; -// all test namespaces start with "MonoTests." Append the Namespace that -// contains the class you are testing, e.g. MonoTests.System.Collections namespace MonoTests.System { -// the class name should end with "Test" and start with the name of the class -// you are testing, e.g. CollectionBaseTest -public class MulticastDelegateTest : TestCase { +[TestFixture] +public class MulticastDelegateTest { public MulticastDelegateTest() {} - // this method is run before each Test* method is called. You can put - // variable initialization, etc. here that is common to each test. - // Just leave the method empty if you don't need to use it. - protected override void SetUp() {} - - // this method is run after each Test* method is called. You can put - // clean-up code, etc. here. Whatever needs to be done after each test. - // Just leave the method empty if you don't need to use it. - protected override void TearDown() {} - private delegate char MyDelegate( ref string s ); private char MethodA( ref string s ) @@ -57,30 +42,32 @@ public class MulticastDelegateTest : TestCase { return 'd'; } + [Test] public void TestEquals() { MyDelegate dela = new MyDelegate( MethodA ); MyDelegate delb = new MyDelegate( MethodB ); MyDelegate delc = new MyDelegate( MethodC ); - AssertEquals( "#A01", false, dela == delb ); + Assert.AreEqual(false, dela == delb , "#A01"); MyDelegate del1, del2; del1 = dela + delb; del2 = delb + delc; - AssertEquals( "#A02", false, del1 == del2 ); + Assert.AreEqual(false, del1 == del2 , "#A02"); del1 += delc; del2 = dela + del2; - AssertEquals( "#A03", true, del1 == del2 ); + Assert.AreEqual(true, del1 == del2 , "#A03"); object o = new object (); - AssertEquals ("#A04", false, dela.Equals (o)); + Assert.AreEqual (false, dela.Equals (o), "#A04"); } + [Test] public void TestCombineRemove() { MyDelegate dela = new MyDelegate( MethodA ); @@ -96,20 +83,20 @@ public class MulticastDelegateTest : TestCase { del1 = dela + delb + delb + delc + delb + delb + deld; val = ""; res = del1( ref val ); - AssertEquals( "#A01", "abbcbbd", val ); - AssertEquals( "#A02", 'd', res ); + Assert.AreEqual("abbcbbd", val , "#A01"); + Assert.AreEqual('d', res , "#A02"); // test remove del2 = del1 - ( delb + delb ); val = ""; res = del2( ref val ); - AssertEquals( "#A03", "abbcd", val ); - AssertEquals( "#A04", 'd', res ); + Assert.AreEqual("abbcd", val , "#A03"); + Assert.AreEqual('d', res , "#A04"); // we did not affect del1, did we? val = ""; res = del1( ref val ); - AssertEquals( "#A05", "abbcbbd", val ); + Assert.AreEqual("abbcbbd", val , "#A05"); } } } diff --git a/mcs/class/corlib/Test/System/NumberFormatterTest.cs b/mcs/class/corlib/Test/System/NumberFormatterTest.cs index dd32b3687c9..fced4127746 100644 --- a/mcs/class/corlib/Test/System/NumberFormatterTest.cs +++ b/mcs/class/corlib/Test/System/NumberFormatterTest.cs @@ -1,4313 +1,4313 @@ -// -// MonoTests.System.NumberFormatterTest -// -// Authors: -// akiramei (mei@work.email.ne.jp) -// -// (C) 2005 akiramei -// - -using System; -using System.Globalization; -using System.Threading; - -using NUnit.Framework; - -namespace MonoTests.System -{ - [TestFixture] - public class NumberFormatterTest : Assertion - { - CultureInfo old_culture; - NumberFormatInfo _nfi; - - [SetUp] - public void SetUp () - { - old_culture = Thread.CurrentThread.CurrentCulture; - Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US", false); - _nfi = NumberFormatInfo.InvariantInfo.Clone () as NumberFormatInfo; - } - - [TearDown] - public void TearDown () - { - Thread.CurrentThread.CurrentCulture = old_culture; - } - - // Test00000- Int32 and D - [Test] - public void Test00000 () - { - AssertEquals ("#01", "0", 0.ToString ("D", _nfi)); - AssertEquals ("#02", "0", 0.ToString ("d", _nfi)); - AssertEquals ("#03", "-2147483648", Int32.MinValue.ToString ("D", _nfi)); - AssertEquals ("#04", "-2147483648", Int32.MinValue.ToString ("d", _nfi)); - AssertEquals ("#05", "2147483647", Int32.MaxValue.ToString ("D", _nfi)); - AssertEquals ("#06", "2147483647", Int32.MaxValue.ToString ("d", _nfi)); - } - - [Test] - public void Test00001 () - { - AssertEquals ("#01", "D ", 0.ToString ("D ", _nfi)); - AssertEquals ("#02", " D", 0.ToString (" D", _nfi)); - AssertEquals ("#03", " D ", 0.ToString (" D ", _nfi)); - } - - [Test] - public void Test00002 () - { - AssertEquals ("#01", "-D ", (-1).ToString ("D ", _nfi)); - AssertEquals ("#02", "- D", (-1).ToString (" D", _nfi)); - AssertEquals ("#03", "- D ", (-1).ToString (" D ", _nfi)); - } - - [Test] - public void Test00003 () - { - AssertEquals ("#01", "0", 0.ToString ("D0", _nfi)); - AssertEquals ("#02", "0000000000", 0.ToString ("D10", _nfi)); - AssertEquals ("#03", "00000000000", 0.ToString ("D11", _nfi)); - AssertEquals ("#04", "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("D99", _nfi)); - AssertEquals ("#05", "D100", 0.ToString ("D100", _nfi)); - } - - [Test] - public void Test00004 () - { - AssertEquals ("#01", "2147483647", Int32.MaxValue.ToString ("D0", _nfi)); - AssertEquals ("#02", "2147483647", Int32.MaxValue.ToString ("D10", _nfi)); - AssertEquals ("#03", "02147483647", Int32.MaxValue.ToString ("D11", _nfi)); - AssertEquals ("#04", "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002147483647", Int32.MaxValue.ToString ("D99", _nfi)); - AssertEquals ("#05", "D12147483647", Int32.MaxValue.ToString ("D100", _nfi)); - } - - [Test] - public void Test00005 () - { - AssertEquals ("#01", "-2147483648", Int32.MinValue.ToString ("D0", _nfi)); - AssertEquals ("#02", "-2147483648", Int32.MinValue.ToString ("D10", _nfi)); - AssertEquals ("#03", "-02147483648", Int32.MinValue.ToString ("D11", _nfi)); - AssertEquals ("#04", "-000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002147483648", Int32.MinValue.ToString ("D99", _nfi)); - AssertEquals ("#05", "-D12147483648", Int32.MinValue.ToString ("D100", _nfi)); - } - - [Test] - public void Test00006 () - { - AssertEquals ("#01", "DF", 0.ToString ("DF", _nfi)); - AssertEquals ("#02", "D0F", 0.ToString ("D0F", _nfi)); - AssertEquals ("#03", "D0xF", 0.ToString ("D0xF", _nfi)); - } - - [Test] - public void Test00007 () - { - AssertEquals ("#01", "DF", Int32.MaxValue.ToString ("DF", _nfi)); - AssertEquals ("#02", "D2147483647F", Int32.MaxValue.ToString ("D0F", _nfi)); - AssertEquals ("#03", "D2147483647xF", Int32.MaxValue.ToString ("D0xF", _nfi)); - } - - [Test] - public void Test00008 () - { - AssertEquals ("#01", "-DF", Int32.MinValue.ToString ("DF", _nfi)); - AssertEquals ("#02", "-D2147483648F", Int32.MinValue.ToString ("D0F", _nfi)); - AssertEquals ("#03", "-D2147483648xF", Int32.MinValue.ToString ("D0xF", _nfi)); - } - - [Test] - public void Test00009 () - { - AssertEquals ("#01", "00000000000", 0.ToString ("D0000000000000000000000000000000000000011", _nfi)); - AssertEquals ("#02", "02147483647", Int32.MaxValue.ToString ("D0000000000000000000000000000000000000011", _nfi)); - AssertEquals ("#03", "-02147483648", Int32.MinValue.ToString ("D0000000000000000000000000000000000000011", _nfi)); - } - - [Test] - public void Test00010 () - { - AssertEquals ("#01", "+D", 0.ToString ("+D", _nfi)); - AssertEquals ("#02", "D+", 0.ToString ("D+", _nfi)); - AssertEquals ("#03", "+D+", 0.ToString ("+D+", _nfi)); - } - - [Test] - public void Test00011 () - { - AssertEquals ("#01", "+D", Int32.MaxValue.ToString ("+D", _nfi)); - AssertEquals ("#02", "D+", Int32.MaxValue.ToString ("D+", _nfi)); - AssertEquals ("#03", "+D+", Int32.MaxValue.ToString ("+D+", _nfi)); - } - - [Test] - public void Test00012 () - { - AssertEquals ("#01", "-+D", Int32.MinValue.ToString ("+D", _nfi)); - AssertEquals ("#02", "-D+", Int32.MinValue.ToString ("D+", _nfi)); - AssertEquals ("#03", "-+D+", Int32.MinValue.ToString ("+D+", _nfi)); - } - - [Test] - public void Test00013 () - { - AssertEquals ("#01", "-D", 0.ToString ("-D", _nfi)); - AssertEquals ("#02", "D-", 0.ToString ("D-", _nfi)); - AssertEquals ("#03", "-D-", 0.ToString ("-D-", _nfi)); - } - - [Test] - public void Test00014 () - { - AssertEquals ("#01", "-D", Int32.MaxValue.ToString ("-D", _nfi)); - AssertEquals ("#02", "D-", Int32.MaxValue.ToString ("D-", _nfi)); - AssertEquals ("#03", "-D-", Int32.MaxValue.ToString ("-D-", _nfi)); - } - - [Test] - public void Test00015 () - { - AssertEquals ("#01", "--D", Int32.MinValue.ToString ("-D", _nfi)); - AssertEquals ("#02", "-D-", Int32.MinValue.ToString ("D-", _nfi)); - AssertEquals ("#03", "--D-", Int32.MinValue.ToString ("-D-", _nfi)); - } - - [Test] - public void Test00016 () - { - AssertEquals ("#01", "D+0", 0.ToString ("D+0", _nfi)); - AssertEquals ("#02", "D+2147483647", Int32.MaxValue.ToString ("D+0", _nfi)); - AssertEquals ("#03", "-D+2147483648", Int32.MinValue.ToString ("D+0", _nfi)); - } - - [Test] - public void Test00017 () - { - AssertEquals ("#01", "D+9", 0.ToString ("D+9", _nfi)); - AssertEquals ("#02", "D+9", Int32.MaxValue.ToString ("D+9", _nfi)); - AssertEquals ("#03", "-D+9", Int32.MinValue.ToString ("D+9", _nfi)); - } - - [Test] - public void Test00018 () - { - AssertEquals ("#01", "D-9", 0.ToString ("D-9", _nfi)); - AssertEquals ("#02", "D-9", Int32.MaxValue.ToString ("D-9", _nfi)); - AssertEquals ("#03", "-D-9", Int32.MinValue.ToString ("D-9", _nfi)); - } - - [Test] - public void Test00019 () - { - AssertEquals ("#01", "D0", 0.ToString ("D0,", _nfi)); - AssertEquals ("#02", "D2147484", Int32.MaxValue.ToString ("D0,", _nfi)); - AssertEquals ("#03", "-D2147484", Int32.MinValue.ToString ("D0,", _nfi)); - } - - [Test] - public void Test00020 () - { - AssertEquals ("#01", "D0", 0.ToString ("D0.", _nfi)); - AssertEquals ("#02", "D2147483647", Int32.MaxValue.ToString ("D0.", _nfi)); - AssertEquals ("#03", "-D2147483648", Int32.MinValue.ToString ("D0.", _nfi)); - } - - [Test] - public void Test00021 () - { - AssertEquals ("#01", "D0.0", 0.ToString ("D0.0", _nfi)); - AssertEquals ("#02", "D2147483647.0", Int32.MaxValue.ToString ("D0.0", _nfi)); - AssertEquals ("#03", "-D2147483648.0", Int32.MinValue.ToString ("D0.0", _nfi)); - } - - [Test] - public void Test00022 () - { - AssertEquals ("#01", "D09", 0.ToString ("D0.9", _nfi)); - AssertEquals ("#02", "D21474836479", Int32.MaxValue.ToString ("D0.9", _nfi)); - AssertEquals ("#03", "-D21474836489", Int32.MinValue.ToString ("D0.9", _nfi)); - } - - // Test01000- Int32 and E - [Test] - public void Test01000 () - { - AssertEquals ("#01", "0.000000E+000", 0.ToString ("E", _nfi)); - AssertEquals ("#02", "0.000000e+000", 0.ToString ("e", _nfi)); - AssertEquals ("#03", "-2.147484E+009", Int32.MinValue.ToString ("E", _nfi)); - AssertEquals ("#04", "-2.147484e+009", Int32.MinValue.ToString ("e", _nfi)); - AssertEquals ("#05", "2.147484E+009", Int32.MaxValue.ToString ("E", _nfi)); - AssertEquals ("#06", "2.147484e+009", Int32.MaxValue.ToString ("e", _nfi)); - } - - [Test] - public void Test01001 () - { - AssertEquals ("#01", "E ", 0.ToString ("E ", _nfi)); - AssertEquals ("#02", " E", 0.ToString (" E", _nfi)); - AssertEquals ("#03", " E ", 0.ToString (" E ", _nfi)); - } - - [Test] - public void Test01002 () - { - AssertEquals ("#01", "-E ", (-1).ToString ("E ", _nfi)); - AssertEquals ("#02", "- E", (-1).ToString (" E", _nfi)); - AssertEquals ("#03", "- E ", (-1).ToString (" E ", _nfi)); - } - - [Test] - public void Test01003 () - { - AssertEquals ("#01", "0E+000", 0.ToString ("E0", _nfi)); - AssertEquals ("#02", "0.000000000E+000", 0.ToString ("E9", _nfi)); - AssertEquals ("#03", "0.0000000000E+000", 0.ToString ("E10", _nfi)); - AssertEquals ("#04", "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E+000", 0.ToString ("E99", _nfi)); - AssertEquals ("#05", "E100", 0.ToString ("E100", _nfi)); - } - - [Test] - public void Test01004 () - { - AssertEquals ("#01", "2E+009", Int32.MaxValue.ToString ("E0", _nfi)); - AssertEquals ("#02", "2.147483647E+009", Int32.MaxValue.ToString ("E9", _nfi)); - AssertEquals ("#03", "2.1474836470E+009", Int32.MaxValue.ToString ("E10", _nfi)); - AssertEquals ("#04", "2.147483647000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E+009", Int32.MaxValue.ToString ("E99", _nfi)); - AssertEquals ("#05", "E12147483647", Int32.MaxValue.ToString ("E100", _nfi)); - } - - [Test] - public void Test01005 () - { - AssertEquals ("#01", "-2E+009", Int32.MinValue.ToString ("E0", _nfi)); - AssertEquals ("#02", "-2.147483648E+009", Int32.MinValue.ToString ("E9", _nfi)); - AssertEquals ("#03", "-2.1474836480E+009", Int32.MinValue.ToString ("E10", _nfi)); - AssertEquals ("#04", "-2.147483648000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E+009", Int32.MinValue.ToString ("E99", _nfi)); - AssertEquals ("#05", "-E12147483648", Int32.MinValue.ToString ("E100", _nfi)); - } - - [Test] - public void Test01006 () - { - AssertEquals ("#01", "EF", 0.ToString ("EF", _nfi)); - AssertEquals ("#02", "E0F", 0.ToString ("E0F", _nfi)); - AssertEquals ("#03", "E0xF", 0.ToString ("E0xF", _nfi)); - } - - [Test] - public void Test01007 () - { - AssertEquals ("#01", "EF", Int32.MaxValue.ToString ("EF", _nfi)); - AssertEquals ("#02", "E0F", Int32.MaxValue.ToString ("E0F", _nfi)); - AssertEquals ("#03", "E0xF", Int32.MaxValue.ToString ("E0xF", _nfi)); - } - - [Test] - public void Test01008 () - { - AssertEquals ("#01", "-EF", Int32.MinValue.ToString ("EF", _nfi)); - AssertEquals ("#02", "E0F", Int32.MinValue.ToString ("E0F", _nfi)); - AssertEquals ("#03", "E0xF", Int32.MinValue.ToString ("E0xF", _nfi)); - } - - [Test] - public void Test01009 () - { - AssertEquals ("#01", "0.0000000000E+000", 0.ToString ("E0000000000000000000000000000000000000010", _nfi)); - AssertEquals ("#02", "2.1474836470E+009", Int32.MaxValue.ToString ("E0000000000000000000000000000000000000010", _nfi)); - AssertEquals ("#03", "-2.1474836480E+009", Int32.MinValue.ToString ("E0000000000000000000000000000000000000010", _nfi)); - } - - [Test] - public void Test01010 () - { - AssertEquals ("#01", "+E", 0.ToString ("+E", _nfi)); - AssertEquals ("#02", "E+", 0.ToString ("E+", _nfi)); - AssertEquals ("#03", "+E+", 0.ToString ("+E+", _nfi)); - } - - [Test] - public void Test01011 () - { - AssertEquals ("#01", "+E", Int32.MaxValue.ToString ("+E", _nfi)); - AssertEquals ("#02", "E+", Int32.MaxValue.ToString ("E+", _nfi)); - AssertEquals ("#03", "+E+", Int32.MaxValue.ToString ("+E+", _nfi)); - } - - [Test] - public void Test01012 () - { - AssertEquals ("#01", "-+E", Int32.MinValue.ToString ("+E", _nfi)); - AssertEquals ("#02", "-E+", Int32.MinValue.ToString ("E+", _nfi)); - AssertEquals ("#03", "-+E+", Int32.MinValue.ToString ("+E+", _nfi)); - } - - [Test] - public void Test01013 () - { - AssertEquals ("#01", "-E", 0.ToString ("-E", _nfi)); - AssertEquals ("#02", "E-", 0.ToString ("E-", _nfi)); - AssertEquals ("#03", "-E-", 0.ToString ("-E-", _nfi)); - } - - [Test] - public void Test01014 () - { - AssertEquals ("#01", "-E", Int32.MaxValue.ToString ("-E", _nfi)); - AssertEquals ("#02", "E-", Int32.MaxValue.ToString ("E-", _nfi)); - AssertEquals ("#03", "-E-", Int32.MaxValue.ToString ("-E-", _nfi)); - } - - [Test] - public void Test01015 () - { - AssertEquals ("#01", "--E", Int32.MinValue.ToString ("-E", _nfi)); - AssertEquals ("#02", "-E-", Int32.MinValue.ToString ("E-", _nfi)); - AssertEquals ("#03", "--E-", Int32.MinValue.ToString ("-E-", _nfi)); - } - - [Test] - public void Test01016 () - { - AssertEquals ("#01", "E+0", 0.ToString ("E+0", _nfi)); - AssertEquals ("#02", "E+0", Int32.MaxValue.ToString ("E+0", _nfi)); - AssertEquals ("#03", "E+0", Int32.MinValue.ToString ("E+0", _nfi)); - } - - [Test] - public void Test01017 () - { - AssertEquals ("#01", "E+9", 0.ToString ("E+9", _nfi)); - AssertEquals ("#02", "E+9", Int32.MaxValue.ToString ("E+9", _nfi)); - AssertEquals ("#03", "-E+9", Int32.MinValue.ToString ("E+9", _nfi)); - } - - [Test] - public void Test01018 () - { - AssertEquals ("#01", "E-9", 0.ToString ("E-9", _nfi)); - AssertEquals ("#02", "E-9", Int32.MaxValue.ToString ("E-9", _nfi)); - AssertEquals ("#03", "-E-9", Int32.MinValue.ToString ("E-9", _nfi)); - } - - [Test] - public void Test01019 () - { - AssertEquals ("#01", "E0", 0.ToString ("E0,", _nfi)); - AssertEquals ("#02", "E0", Int32.MaxValue.ToString ("E0,", _nfi)); - AssertEquals ("#03", "E0", Int32.MinValue.ToString ("E0,", _nfi)); - } - - [Test] - public void Test01020 () - { - AssertEquals ("#01", "E0", 0.ToString ("E0.", _nfi)); - AssertEquals ("#02", "E0", Int32.MaxValue.ToString ("E0.", _nfi)); - AssertEquals ("#03", "E0", Int32.MinValue.ToString ("E0.", _nfi)); - } - - [Test] - public void Test01021 () - { - AssertEquals ("#01", "E0.0", 0.ToString ("E0.0", _nfi)); - AssertEquals ("#02", "E10.2", Int32.MaxValue.ToString ("E0.0", _nfi)); - AssertEquals ("#03", "-E10.2", Int32.MinValue.ToString ("E0.0", _nfi)); - } - - [Test] - public void Test01022 () - { - AssertEquals ("#01", "E09", 0.ToString ("E0.9", _nfi)); - AssertEquals ("#02", "E09", Int32.MaxValue.ToString ("E0.9", _nfi)); - AssertEquals ("#03", "E09", Int32.MinValue.ToString ("E0.9", _nfi)); - } - - [Test] - public void Test01023 () - { - AssertEquals ("#01", "9.999999E+007", 99999990.ToString ("E", _nfi)); - AssertEquals ("#02", "9.999999E+007", 99999991.ToString ("E", _nfi)); - AssertEquals ("#03", "9.999999E+007", 99999992.ToString ("E", _nfi)); - AssertEquals ("#04", "9.999999E+007", 99999993.ToString ("E", _nfi)); - AssertEquals ("#05", "9.999999E+007", 99999994.ToString ("E", _nfi)); - AssertEquals ("#06", "1.000000E+008", 99999995.ToString ("E", _nfi)); - AssertEquals ("#07", "1.000000E+008", 99999996.ToString ("E", _nfi)); - AssertEquals ("#08", "1.000000E+008", 99999997.ToString ("E", _nfi)); - AssertEquals ("#09", "1.000000E+008", 99999998.ToString ("E", _nfi)); - AssertEquals ("#10", "1.000000E+008", 99999999.ToString ("E", _nfi)); - } - - [Test] - public void Test01024 () - { - AssertEquals ("#01", "-9.999999E+007", (-99999990).ToString ("E", _nfi)); - AssertEquals ("#02", "-9.999999E+007", (-99999991).ToString ("E", _nfi)); - AssertEquals ("#03", "-9.999999E+007", (-99999992).ToString ("E", _nfi)); - AssertEquals ("#04", "-9.999999E+007", (-99999993).ToString ("E", _nfi)); - AssertEquals ("#05", "-9.999999E+007", (-99999994).ToString ("E", _nfi)); - AssertEquals ("#06", "-1.000000E+008", (-99999995).ToString ("E", _nfi)); - AssertEquals ("#07", "-1.000000E+008", (-99999996).ToString ("E", _nfi)); - AssertEquals ("#08", "-1.000000E+008", (-99999997).ToString ("E", _nfi)); - AssertEquals ("#09", "-1.000000E+008", (-99999998).ToString ("E", _nfi)); - AssertEquals ("#10", "-1.000000E+008", (-99999999).ToString ("E", _nfi)); - } - - [Test] - public void Test01025 () - { - AssertEquals ("#01", "9.999998E+007", 99999980.ToString ("E", _nfi)); - AssertEquals ("#02", "9.999998E+007", 99999981.ToString ("E", _nfi)); - AssertEquals ("#03", "9.999998E+007", 99999982.ToString ("E", _nfi)); - AssertEquals ("#04", "9.999998E+007", 99999983.ToString ("E", _nfi)); - AssertEquals ("#05", "9.999998E+007", 99999984.ToString ("E", _nfi)); - AssertEquals ("#06", "9.999999E+007", 99999985.ToString ("E", _nfi)); - AssertEquals ("#07", "9.999999E+007", 99999986.ToString ("E", _nfi)); - AssertEquals ("#08", "9.999999E+007", 99999987.ToString ("E", _nfi)); - AssertEquals ("#09", "9.999999E+007", 99999988.ToString ("E", _nfi)); - AssertEquals ("#10", "9.999999E+007", 99999989.ToString ("E", _nfi)); - } - - [Test] - public void Test01026 () - { - AssertEquals ("#01", "-9.999998E+007", (-99999980).ToString ("E", _nfi)); - AssertEquals ("#02", "-9.999998E+007", (-99999981).ToString ("E", _nfi)); - AssertEquals ("#03", "-9.999998E+007", (-99999982).ToString ("E", _nfi)); - AssertEquals ("#04", "-9.999998E+007", (-99999983).ToString ("E", _nfi)); - AssertEquals ("#05", "-9.999998E+007", (-99999984).ToString ("E", _nfi)); - AssertEquals ("#06", "-9.999999E+007", (-99999985).ToString ("E", _nfi)); - AssertEquals ("#07", "-9.999999E+007", (-99999986).ToString ("E", _nfi)); - AssertEquals ("#08", "-9.999999E+007", (-99999987).ToString ("E", _nfi)); - AssertEquals ("#09", "-9.999999E+007", (-99999988).ToString ("E", _nfi)); - AssertEquals ("#10", "-9.999999E+007", (-99999989).ToString ("E", _nfi)); - } - - [Test] - public void Test01027 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberDecimalSeparator = "#"; - AssertEquals ("#01", "-1#000000E+008", (-99999999).ToString ("E", nfi)); - } - - [Test] - public void Test01028 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "+"; - nfi.PositiveSign = "-"; - - AssertEquals ("#01", "1.000000E-000", 1.ToString ("E", nfi)); - AssertEquals ("#02", "0.000000E-000", 0.ToString ("E", nfi)); - AssertEquals ("#03", "+1.000000E-000", (-1).ToString ("E", nfi)); - } - - // Test02000- Int32 and F - [Test] - public void Test02000 () - { - AssertEquals ("#01", "0.00", 0.ToString ("F", _nfi)); - AssertEquals ("#02", "0.00", 0.ToString ("f", _nfi)); - AssertEquals ("#03", "-2147483648.00", Int32.MinValue.ToString ("F", _nfi)); - AssertEquals ("#04", "-2147483648.00", Int32.MinValue.ToString ("f", _nfi)); - AssertEquals ("#05", "2147483647.00", Int32.MaxValue.ToString ("F", _nfi)); - AssertEquals ("#06", "2147483647.00", Int32.MaxValue.ToString ("f", _nfi)); - } - - [Test] - public void Test02001 () - { - AssertEquals ("#01", "F ", 0.ToString ("F ", _nfi)); - AssertEquals ("#02", " F", 0.ToString (" F", _nfi)); - AssertEquals ("#03", " F ", 0.ToString (" F ", _nfi)); - } - - [Test] - public void Test02002 () - { - AssertEquals ("#01", "-F ", (-1).ToString ("F ", _nfi)); - AssertEquals ("#02", "- F", (-1).ToString (" F", _nfi)); - AssertEquals ("#03", "- F ", (-1).ToString (" F ", _nfi)); - } - - [Test] - public void Test02003 () - { - AssertEquals ("#01", "0", 0.ToString ("F0", _nfi)); - AssertEquals ("#02", "0.000000000", 0.ToString ("F9", _nfi)); - AssertEquals ("#03", "0.0000000000", 0.ToString ("F10", _nfi)); - AssertEquals ("#04", "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("F99", _nfi)); - AssertEquals ("#05", "F100", 0.ToString ("F100", _nfi)); - } - - [Test] - public void Test02004 () - { - AssertEquals ("#01", "2147483647", Int32.MaxValue.ToString ("F0", _nfi)); - AssertEquals ("#02", "2147483647.000000000", Int32.MaxValue.ToString ("F9", _nfi)); - AssertEquals ("#03", "2147483647.0000000000", Int32.MaxValue.ToString ("F10", _nfi)); - AssertEquals ("#04", "2147483647.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Int32.MaxValue.ToString ("F99", _nfi)); - AssertEquals ("#05", "F12147483647", Int32.MaxValue.ToString ("F100", _nfi)); - } - - [Test] - public void Test02005 () - { - AssertEquals ("#01", "-2147483648", Int32.MinValue.ToString ("F0", _nfi)); - AssertEquals ("#02", "-2147483648.000000000", Int32.MinValue.ToString ("F9", _nfi)); - AssertEquals ("#03", "-2147483648.0000000000", Int32.MinValue.ToString ("F10", _nfi)); - AssertEquals ("#04", "-2147483648.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Int32.MinValue.ToString ("F99", _nfi)); - AssertEquals ("#05", "-F12147483648", Int32.MinValue.ToString ("F100", _nfi)); - } - - [Test] - public void Test02006 () - { - AssertEquals ("#01", "FF", 0.ToString ("FF", _nfi)); - AssertEquals ("#02", "F0F", 0.ToString ("F0F", _nfi)); - AssertEquals ("#03", "F0xF", 0.ToString ("F0xF", _nfi)); - } - - [Test] - public void Test02007 () - { - AssertEquals ("#01", "FF", Int32.MaxValue.ToString ("FF", _nfi)); - AssertEquals ("#02", "F2147483647F", Int32.MaxValue.ToString ("F0F", _nfi)); - AssertEquals ("#03", "F2147483647xF", Int32.MaxValue.ToString ("F0xF", _nfi)); - } - - [Test] - public void Test02008 () - { - AssertEquals ("#01", "-FF", Int32.MinValue.ToString ("FF", _nfi)); - AssertEquals ("#02", "-F2147483648F", Int32.MinValue.ToString ("F0F", _nfi)); - AssertEquals ("#03", "-F2147483648xF", Int32.MinValue.ToString ("F0xF", _nfi)); - } - - [Test] - public void Test02009 () - { - AssertEquals ("#01", "0.0000000000", 0.ToString ("F0000000000000000000000000000000000000010", _nfi)); - AssertEquals ("#02", "2147483647.0000000000", Int32.MaxValue.ToString ("F0000000000000000000000000000000000000010", _nfi)); - AssertEquals ("#03", "-2147483648.0000000000", Int32.MinValue.ToString ("F0000000000000000000000000000000000000010", _nfi)); - } - - [Test] - public void Test02010 () - { - AssertEquals ("#01", "+F", 0.ToString ("+F", _nfi)); - AssertEquals ("#02", "F+", 0.ToString ("F+", _nfi)); - AssertEquals ("#03", "+F+", 0.ToString ("+F+", _nfi)); - } - - [Test] - public void Test02011 () - { - AssertEquals ("#01", "+F", Int32.MaxValue.ToString ("+F", _nfi)); - AssertEquals ("#02", "F+", Int32.MaxValue.ToString ("F+", _nfi)); - AssertEquals ("#03", "+F+", Int32.MaxValue.ToString ("+F+", _nfi)); - } - - [Test] - public void Test02012 () - { - AssertEquals ("#01", "-+F", Int32.MinValue.ToString ("+F", _nfi)); - AssertEquals ("#02", "-F+", Int32.MinValue.ToString ("F+", _nfi)); - AssertEquals ("#03", "-+F+", Int32.MinValue.ToString ("+F+", _nfi)); - } - - [Test] - public void Test02013 () - { - AssertEquals ("#01", "-F", 0.ToString ("-F", _nfi)); - AssertEquals ("#02", "F-", 0.ToString ("F-", _nfi)); - AssertEquals ("#03", "-F-", 0.ToString ("-F-", _nfi)); - } - - [Test] - public void Test02014 () - { - AssertEquals ("#01", "-F", Int32.MaxValue.ToString ("-F", _nfi)); - AssertEquals ("#02", "F-", Int32.MaxValue.ToString ("F-", _nfi)); - AssertEquals ("#03", "-F-", Int32.MaxValue.ToString ("-F-", _nfi)); - } - - [Test] - public void Test02015 () - { - AssertEquals ("#01", "--F", Int32.MinValue.ToString ("-F", _nfi)); - AssertEquals ("#02", "-F-", Int32.MinValue.ToString ("F-", _nfi)); - AssertEquals ("#03", "--F-", Int32.MinValue.ToString ("-F-", _nfi)); - } - - [Test] - public void Test02016 () - { - AssertEquals ("#01", "F+0", 0.ToString ("F+0", _nfi)); - AssertEquals ("#02", "F+2147483647", Int32.MaxValue.ToString ("F+0", _nfi)); - AssertEquals ("#03", "-F+2147483648", Int32.MinValue.ToString ("F+0", _nfi)); - } - - [Test] - public void Test02017 () - { - AssertEquals ("#01", "F+9", 0.ToString ("F+9", _nfi)); - AssertEquals ("#02", "F+9", Int32.MaxValue.ToString ("F+9", _nfi)); - AssertEquals ("#03", "-F+9", Int32.MinValue.ToString ("F+9", _nfi)); - } - - [Test] - public void Test02018 () - { - AssertEquals ("#01", "F-9", 0.ToString ("F-9", _nfi)); - AssertEquals ("#02", "F-9", Int32.MaxValue.ToString ("F-9", _nfi)); - AssertEquals ("#03", "-F-9", Int32.MinValue.ToString ("F-9", _nfi)); - } - - [Test] - public void Test02019 () - { - AssertEquals ("#01", "F0", 0.ToString ("F0,", _nfi)); - AssertEquals ("#02", "F2147484", Int32.MaxValue.ToString ("F0,", _nfi)); - AssertEquals ("#03", "-F2147484", Int32.MinValue.ToString ("F0,", _nfi)); - } - - [Test] - public void Test02020 () - { - AssertEquals ("#01", "F0", 0.ToString ("F0.", _nfi)); - AssertEquals ("#02", "F2147483647", Int32.MaxValue.ToString ("F0.", _nfi)); - AssertEquals ("#03", "-F2147483648", Int32.MinValue.ToString ("F0.", _nfi)); - } - - [Test] - public void Test02021 () - { - AssertEquals ("#01", "F0.0", 0.ToString ("F0.0", _nfi)); - AssertEquals ("#02", "F2147483647.0", Int32.MaxValue.ToString ("F0.0", _nfi)); - AssertEquals ("#03", "-F2147483648.0", Int32.MinValue.ToString ("F0.0", _nfi)); - } - - [Test] - public void Test02022 () - { - AssertEquals ("#01", "F09", 0.ToString ("F0.9", _nfi)); - AssertEquals ("#02", "F21474836479", Int32.MaxValue.ToString ("F0.9", _nfi)); - AssertEquals ("#03", "-F21474836489", Int32.MinValue.ToString ("F0.9", _nfi)); - } - - [Test] - public void Test02023 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberDecimalDigits = 0; - AssertEquals ("#01", "0", 0.ToString ("F", nfi)); - nfi.NumberDecimalDigits = 1; - AssertEquals ("#02", "0.0", 0.ToString ("F", nfi)); - nfi.NumberDecimalDigits = 99; - AssertEquals ("#03", "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("F", nfi)); - } - - [Test] - public void Test02024 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = ""; - AssertEquals ("#01", "2147483648.00", Int32.MinValue.ToString ("F", nfi)); - nfi.NegativeSign = "-"; - AssertEquals ("#02", "-2147483648.00", Int32.MinValue.ToString ("F", nfi)); - nfi.NegativeSign = "+"; - AssertEquals ("#03", "+2147483648.00", Int32.MinValue.ToString ("F", nfi)); - nfi.NegativeSign = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - AssertEquals ("#04", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ2147483648.00", Int32.MinValue.ToString ("F", nfi)); - } - - [Test] - public void Test02025 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "-"; - nfi.PositiveSign = "+"; - AssertEquals ("#01", "-1.00", (-1).ToString ("F", nfi)); - AssertEquals ("#02", "0.00", 0.ToString ("F", nfi)); - AssertEquals ("#03", "1.00",1.ToString ("F", nfi)); - } - - [Test] - public void Test02026 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "+"; - nfi.PositiveSign = "-"; - AssertEquals ("#01", "+1.00", (-1).ToString ("F", nfi)); - AssertEquals ("#02", "0.00", 0.ToString ("F", nfi)); - AssertEquals ("#03", "1.00",1.ToString ("F", nfi)); - } - - [Test] - public void Test02027 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberDecimalSeparator = "#"; - AssertEquals ("#01", "1#00",1.ToString ("F", nfi)); - } - - // Test03000 - Int32 and G - [Test] - public void Test03000 () - { - AssertEquals ("#01", "0", 0.ToString ("G", _nfi)); - AssertEquals ("#02", "0", 0.ToString ("g", _nfi)); - AssertEquals ("#03", "-2147483648", Int32.MinValue.ToString ("G", _nfi)); - AssertEquals ("#04", "-2147483648", Int32.MinValue.ToString ("g", _nfi)); - AssertEquals ("#05", "2147483647", Int32.MaxValue.ToString ("G", _nfi)); - AssertEquals ("#06", "2147483647", Int32.MaxValue.ToString ("g", _nfi)); - } - - [Test] - public void Test03001 () - { - AssertEquals ("#01", "G ", 0.ToString ("G ", _nfi)); - AssertEquals ("#02", " G", 0.ToString (" G", _nfi)); - AssertEquals ("#03", " G ", 0.ToString (" G ", _nfi)); - } - - [Test] - public void Test03002 () - { - AssertEquals ("#01", "-G ", (-1).ToString ("G ", _nfi)); - AssertEquals ("#02", "- G", (-1).ToString (" G", _nfi)); - AssertEquals ("#03", "- G ", (-1).ToString (" G ", _nfi)); - } - - [Test] - public void Test03003 () - { - AssertEquals ("#01", "0", 0.ToString ("G0", _nfi)); - AssertEquals ("#02", "0", 0.ToString ("G9", _nfi)); - AssertEquals ("#03", "0", 0.ToString ("G10", _nfi)); - AssertEquals ("#04", "0", 0.ToString ("G99", _nfi)); - AssertEquals ("#05", "G100", 0.ToString ("G100", _nfi)); - } - - [Test] - public void Test03004 () - { - AssertEquals ("#01", "2147483647", Int32.MaxValue.ToString ("G0", _nfi)); - AssertEquals ("#02", "2.14748365E+09", Int32.MaxValue.ToString ("G9", _nfi)); - AssertEquals ("#03", "2147483647", Int32.MaxValue.ToString ("G10", _nfi)); - AssertEquals ("#04", "2147483647", Int32.MaxValue.ToString ("G99", _nfi)); - AssertEquals ("#05", "G12147483647", Int32.MaxValue.ToString ("G100", _nfi)); - } - - [Test] - public void Test03005 () - { - AssertEquals ("#01", "-2147483648", Int32.MinValue.ToString ("G0", _nfi)); - AssertEquals ("#02", "-2.14748365E+09", Int32.MinValue.ToString ("G9", _nfi)); - AssertEquals ("#03", "-2147483648", Int32.MinValue.ToString ("G10", _nfi)); - AssertEquals ("#04", "-2147483648", Int32.MinValue.ToString ("G99", _nfi)); - AssertEquals ("#05", "-G12147483648", Int32.MinValue.ToString ("G100", _nfi)); - } - - [Test] - public void Test03006 () - { - AssertEquals ("#01", "GF", 0.ToString ("GF", _nfi)); - AssertEquals ("#02", "G0F", 0.ToString ("G0F", _nfi)); - AssertEquals ("#03", "G0xF", 0.ToString ("G0xF", _nfi)); - } - - [Test] - public void Test03007 () - { - AssertEquals ("#01", "GF", Int32.MaxValue.ToString ("GF", _nfi)); - AssertEquals ("#02", "G2147483647F", Int32.MaxValue.ToString ("G0F", _nfi)); - AssertEquals ("#03", "G2147483647xF", Int32.MaxValue.ToString ("G0xF", _nfi)); - } - - [Test] - public void Test03008 () - { - AssertEquals ("#01", "-GF", Int32.MinValue.ToString ("GF", _nfi)); - AssertEquals ("#02", "-G2147483648F", Int32.MinValue.ToString ("G0F", _nfi)); - AssertEquals ("#03", "-G2147483648xF", Int32.MinValue.ToString ("G0xF", _nfi)); - } - - [Test] - public void Test03009 () - { - AssertEquals ("#01", "0", 0.ToString ("G0000000000000000000000000000000000000010", _nfi)); - AssertEquals ("#02", "2147483647", Int32.MaxValue.ToString ("G0000000000000000000000000000000000000010", _nfi)); - AssertEquals ("#03", "-2147483648", Int32.MinValue.ToString ("G0000000000000000000000000000000000000010", _nfi)); - } - - [Test] - public void Test03010 () - { - AssertEquals ("#01", "+G", 0.ToString ("+G", _nfi)); - AssertEquals ("#02", "G+", 0.ToString ("G+", _nfi)); - AssertEquals ("#03", "+G+", 0.ToString ("+G+", _nfi)); - } - - [Test] - public void Test03011 () - { - AssertEquals ("#01", "+G", Int32.MaxValue.ToString ("+G", _nfi)); - AssertEquals ("#02", "G+", Int32.MaxValue.ToString ("G+", _nfi)); - AssertEquals ("#03", "+G+", Int32.MaxValue.ToString ("+G+", _nfi)); - } - - [Test] - public void Test03012 () - { - AssertEquals ("#01", "-+G", Int32.MinValue.ToString ("+G", _nfi)); - AssertEquals ("#02", "-G+", Int32.MinValue.ToString ("G+", _nfi)); - AssertEquals ("#03", "-+G+", Int32.MinValue.ToString ("+G+", _nfi)); - } - - [Test] - public void Test03013 () - { - AssertEquals ("#01", "-G", 0.ToString ("-G", _nfi)); - AssertEquals ("#02", "G-", 0.ToString ("G-", _nfi)); - AssertEquals ("#03", "-G-", 0.ToString ("-G-", _nfi)); - } - - [Test] - public void Test03014 () - { - AssertEquals ("#01", "-G", Int32.MaxValue.ToString ("-G", _nfi)); - AssertEquals ("#02", "G-", Int32.MaxValue.ToString ("G-", _nfi)); - AssertEquals ("#03", "-G-", Int32.MaxValue.ToString ("-G-", _nfi)); - } - - [Test] - public void Test03015 () - { - AssertEquals ("#01", "--G", Int32.MinValue.ToString ("-G", _nfi)); - AssertEquals ("#02", "-G-", Int32.MinValue.ToString ("G-", _nfi)); - AssertEquals ("#03", "--G-", Int32.MinValue.ToString ("-G-", _nfi)); - } - - [Test] - public void Test03016 () - { - AssertEquals ("#01", "G+0", 0.ToString ("G+0", _nfi)); - AssertEquals ("#02", "G+2147483647", Int32.MaxValue.ToString ("G+0", _nfi)); - AssertEquals ("#03", "-G+2147483648", Int32.MinValue.ToString ("G+0", _nfi)); - } - - [Test] - public void Test03017 () - { - AssertEquals ("#01", "G+9", 0.ToString ("G+9", _nfi)); - AssertEquals ("#02", "G+9", Int32.MaxValue.ToString ("G+9", _nfi)); - AssertEquals ("#03", "-G+9", Int32.MinValue.ToString ("G+9", _nfi)); - } - - [Test] - public void Test03018 () - { - AssertEquals ("#01", "G-9", 0.ToString ("G-9", _nfi)); - AssertEquals ("#02", "G-9", Int32.MaxValue.ToString ("G-9", _nfi)); - AssertEquals ("#03", "-G-9", Int32.MinValue.ToString ("G-9", _nfi)); - } - - [Test] - public void Test03019 () - { - AssertEquals ("#01", "G0", 0.ToString ("G0,", _nfi)); - AssertEquals ("#02", "G2147484", Int32.MaxValue.ToString ("G0,", _nfi)); - AssertEquals ("#03", "-G2147484", Int32.MinValue.ToString ("G0,", _nfi)); - } - - [Test] - public void Test03020 () - { - AssertEquals ("#01", "G0", 0.ToString ("G0.", _nfi)); - AssertEquals ("#02", "G2147483647", Int32.MaxValue.ToString ("G0.", _nfi)); - AssertEquals ("#03", "-G2147483648", Int32.MinValue.ToString ("G0.", _nfi)); - } - - [Test] - public void Test03021 () - { - AssertEquals ("#01", "G0.0", 0.ToString ("G0.0", _nfi)); - AssertEquals ("#02", "G2147483647.0", Int32.MaxValue.ToString ("G0.0", _nfi)); - AssertEquals ("#03", "-G2147483648.0", Int32.MinValue.ToString ("G0.0", _nfi)); - } - - [Test] - public void Test03022 () - { - AssertEquals ("#01", "G09", 0.ToString ("G0.9", _nfi)); - AssertEquals ("#02", "G21474836479", Int32.MaxValue.ToString ("G0.9", _nfi)); - AssertEquals ("#03", "-G21474836489", Int32.MinValue.ToString ("G0.9", _nfi)); - } - - [Test] - public void Test03023 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberDecimalDigits = 0; - AssertEquals ("#01", "0", 0.ToString ("G", nfi)); - nfi.NumberDecimalDigits = 1; - AssertEquals ("#02", "0", 0.ToString ("G", nfi)); - nfi.NumberDecimalDigits = 99; - AssertEquals ("#03", "0", 0.ToString ("G", nfi)); - } - - [Test] - public void Test03024 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = ""; - AssertEquals ("#01", "2147483648", Int32.MinValue.ToString ("G", nfi)); - nfi.NegativeSign = "-"; - AssertEquals ("#02", "-2147483648", Int32.MinValue.ToString ("G", nfi)); - nfi.NegativeSign = "+"; - AssertEquals ("#03", "+2147483648", Int32.MinValue.ToString ("G", nfi)); - nfi.NegativeSign = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - AssertEquals ("#04", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ2147483648", Int32.MinValue.ToString ("G", nfi)); - } - - [Test] - public void Test03025 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "-"; - nfi.PositiveSign = "+"; - AssertEquals ("#01", "-1", (-1).ToString ("G", nfi)); - AssertEquals ("#02", "0", 0.ToString ("G", nfi)); - AssertEquals ("#03", "1",1.ToString ("G", nfi)); - } - - [Test] - public void Test03026 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "+"; - nfi.PositiveSign = "-"; - AssertEquals ("#01", "+1", (-1).ToString ("G", nfi)); - AssertEquals ("#02", "0", 0.ToString ("G", nfi)); - AssertEquals ("#03", "1",1.ToString ("G", nfi)); - } - - [Test] - public void Test03027 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberDecimalSeparator = "#"; - AssertEquals ("#01", "1#2E+02",123.ToString ("G2", nfi)); - } - - // Test04000 - Int32 and N - [Test] - public void Test04000 () - { - AssertEquals ("#01", "0.00", 0.ToString ("N", _nfi)); - AssertEquals ("#02", "0.00", 0.ToString ("n", _nfi)); - AssertEquals ("#03", "-2,147,483,648.00", Int32.MinValue.ToString ("N", _nfi)); - AssertEquals ("#04", "-2,147,483,648.00", Int32.MinValue.ToString ("n", _nfi)); - AssertEquals ("#05", "2,147,483,647.00", Int32.MaxValue.ToString ("N", _nfi)); - AssertEquals ("#06", "2,147,483,647.00", Int32.MaxValue.ToString ("n", _nfi)); - } - - [Test] - public void Test04001 () - { - AssertEquals ("#01", "N ", 0.ToString ("N ", _nfi)); - AssertEquals ("#02", " N", 0.ToString (" N", _nfi)); - AssertEquals ("#03", " N ", 0.ToString (" N ", _nfi)); - } - - [Test] - public void Test04002 () - { - AssertEquals ("#01", "-N ", (-1).ToString ("N ", _nfi)); - AssertEquals ("#02", "- N", (-1).ToString (" N", _nfi)); - AssertEquals ("#03", "- N ", (-1).ToString (" N ", _nfi)); - } - - [Test] - public void Test04003 () - { - AssertEquals ("#01", "0", 0.ToString ("N0", _nfi)); - AssertEquals ("#02", "0.000000000", 0.ToString ("N9", _nfi)); - AssertEquals ("#03", "0.0000000000", 0.ToString ("N10", _nfi)); - AssertEquals ("#04", "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("N99", _nfi)); - AssertEquals ("#05", "N100", 0.ToString ("N100", _nfi)); - } - - [Test] - public void Test04004 () - { - AssertEquals ("#01", "2,147,483,647", Int32.MaxValue.ToString ("N0", _nfi)); - AssertEquals ("#02", "2,147,483,647.000000000", Int32.MaxValue.ToString ("N9", _nfi)); - AssertEquals ("#03", "2,147,483,647.0000000000", Int32.MaxValue.ToString ("N10", _nfi)); - AssertEquals ("#04", "2,147,483,647.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Int32.MaxValue.ToString ("N99", _nfi)); - AssertEquals ("#05", "N12147483647", Int32.MaxValue.ToString ("N100", _nfi)); - } - - [Test] - public void Test04005 () - { - AssertEquals ("#01", "-2,147,483,648", Int32.MinValue.ToString ("N0", _nfi)); - AssertEquals ("#02", "-2,147,483,648.000000000", Int32.MinValue.ToString ("N9", _nfi)); - AssertEquals ("#03", "-2,147,483,648.0000000000", Int32.MinValue.ToString ("N10", _nfi)); - AssertEquals ("#04", "-2,147,483,648.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Int32.MinValue.ToString ("N99", _nfi)); - AssertEquals ("#05", "-N12147483648", Int32.MinValue.ToString ("N100", _nfi)); - } - - [Test] - public void Test04006 () - { - AssertEquals ("#01", "NF", 0.ToString ("NF", _nfi)); - AssertEquals ("#02", "N0F", 0.ToString ("N0F", _nfi)); - AssertEquals ("#03", "N0xF", 0.ToString ("N0xF", _nfi)); - } - - [Test] - public void Test04007 () - { - AssertEquals ("#01", "NF", Int32.MaxValue.ToString ("NF", _nfi)); - AssertEquals ("#02", "N2147483647F", Int32.MaxValue.ToString ("N0F", _nfi)); - AssertEquals ("#03", "N2147483647xF", Int32.MaxValue.ToString ("N0xF", _nfi)); - } - - [Test] - public void Test04008 () - { - AssertEquals ("#01", "-NF", Int32.MinValue.ToString ("NF", _nfi)); - AssertEquals ("#02", "-N2147483648F", Int32.MinValue.ToString ("N0F", _nfi)); - AssertEquals ("#03", "-N2147483648xF", Int32.MinValue.ToString ("N0xF", _nfi)); - } - - [Test] - public void Test04009 () - { - AssertEquals ("#01", "0.0000000000", 0.ToString ("N0000000000000000000000000000000000000010", _nfi)); - AssertEquals ("#02", "2,147,483,647.0000000000", Int32.MaxValue.ToString ("N0000000000000000000000000000000000000010", _nfi)); - AssertEquals ("#03", "-2,147,483,648.0000000000", Int32.MinValue.ToString ("N0000000000000000000000000000000000000010", _nfi)); - } - - [Test] - public void Test04010 () - { - AssertEquals ("#01", "+N", 0.ToString ("+N", _nfi)); - AssertEquals ("#02", "N+", 0.ToString ("N+", _nfi)); - AssertEquals ("#03", "+N+", 0.ToString ("+N+", _nfi)); - } - - [Test] - public void Test04011 () - { - AssertEquals ("#01", "+N", Int32.MaxValue.ToString ("+N", _nfi)); - AssertEquals ("#02", "N+", Int32.MaxValue.ToString ("N+", _nfi)); - AssertEquals ("#03", "+N+", Int32.MaxValue.ToString ("+N+", _nfi)); - } - - [Test] - public void Test04012 () - { - AssertEquals ("#01", "-+N", Int32.MinValue.ToString ("+N", _nfi)); - AssertEquals ("#02", "-N+", Int32.MinValue.ToString ("N+", _nfi)); - AssertEquals ("#03", "-+N+", Int32.MinValue.ToString ("+N+", _nfi)); - } - - [Test] - public void Test04013 () - { - AssertEquals ("#01", "-N", 0.ToString ("-N", _nfi)); - AssertEquals ("#02", "N-", 0.ToString ("N-", _nfi)); - AssertEquals ("#03", "-N-", 0.ToString ("-N-", _nfi)); - } - - [Test] - public void Test04014 () - { - AssertEquals ("#01", "-N", Int32.MaxValue.ToString ("-N", _nfi)); - AssertEquals ("#02", "N-", Int32.MaxValue.ToString ("N-", _nfi)); - AssertEquals ("#03", "-N-", Int32.MaxValue.ToString ("-N-", _nfi)); - } - - [Test] - public void Test04015 () - { - AssertEquals ("#01", "--N", Int32.MinValue.ToString ("-N", _nfi)); - AssertEquals ("#02", "-N-", Int32.MinValue.ToString ("N-", _nfi)); - AssertEquals ("#03", "--N-", Int32.MinValue.ToString ("-N-", _nfi)); - } - - [Test] - public void Test04016 () - { - AssertEquals ("#01", "N+0", 0.ToString ("N+0", _nfi)); - AssertEquals ("#02", "N+2147483647", Int32.MaxValue.ToString ("N+0", _nfi)); - AssertEquals ("#03", "-N+2147483648", Int32.MinValue.ToString ("N+0", _nfi)); - } - - [Test] - public void Test04017 () - { - AssertEquals ("#01", "N+9", 0.ToString ("N+9", _nfi)); - AssertEquals ("#02", "N+9", Int32.MaxValue.ToString ("N+9", _nfi)); - AssertEquals ("#03", "-N+9", Int32.MinValue.ToString ("N+9", _nfi)); - } - - [Test] - public void Test04018 () - { - AssertEquals ("#01", "N-9", 0.ToString ("N-9", _nfi)); - AssertEquals ("#02", "N-9", Int32.MaxValue.ToString ("N-9", _nfi)); - AssertEquals ("#03", "-N-9", Int32.MinValue.ToString ("N-9", _nfi)); - } - - [Test] - public void Test04019 () - { - AssertEquals ("#01", "N0", 0.ToString ("N0,", _nfi)); - AssertEquals ("#02", "N2147484", Int32.MaxValue.ToString ("N0,", _nfi)); - AssertEquals ("#03", "-N2147484", Int32.MinValue.ToString ("N0,", _nfi)); - } - - [Test] - public void Test04020 () - { - AssertEquals ("#01", "N0", 0.ToString ("N0.", _nfi)); - AssertEquals ("#02", "N2147483647", Int32.MaxValue.ToString ("N0.", _nfi)); - AssertEquals ("#03", "-N2147483648", Int32.MinValue.ToString ("N0.", _nfi)); - } - - [Test] - public void Test04021 () - { - AssertEquals ("#01", "N0.0", 0.ToString ("N0.0", _nfi)); - AssertEquals ("#02", "N2147483647.0", Int32.MaxValue.ToString ("N0.0", _nfi)); - AssertEquals ("#03", "-N2147483648.0", Int32.MinValue.ToString ("N0.0", _nfi)); - } - - [Test] - public void Test04022 () - { - AssertEquals ("#01", "N09", 0.ToString ("N0.9", _nfi)); - AssertEquals ("#02", "N21474836479", Int32.MaxValue.ToString ("N0.9", _nfi)); - AssertEquals ("#03", "-N21474836489", Int32.MinValue.ToString ("N0.9", _nfi)); - } - - [Test] - public void Test04023 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberDecimalDigits = 0; - AssertEquals ("#01", "0", 0.ToString ("N", nfi)); - nfi.NumberDecimalDigits = 1; - AssertEquals ("#02", "0.0", 0.ToString ("N", nfi)); - nfi.NumberDecimalDigits = 99; - AssertEquals ("#03", "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("N", nfi)); - } - - [Test] - public void Test04024 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = ""; - AssertEquals ("#01", "2,147,483,648.00", Int32.MinValue.ToString ("N", nfi)); - nfi.NegativeSign = "-"; - AssertEquals ("#02", "-2,147,483,648.00", Int32.MinValue.ToString ("N", nfi)); - nfi.NegativeSign = "+"; - AssertEquals ("#03", "+2,147,483,648.00", Int32.MinValue.ToString ("N", nfi)); - nfi.NegativeSign = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - AssertEquals ("#04", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ2,147,483,648.00", Int32.MinValue.ToString ("N", nfi)); - } - - [Test] - public void Test04025 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "-"; - nfi.PositiveSign = "+"; - AssertEquals ("#01", "-1.00", (-1).ToString ("N", nfi)); - AssertEquals ("#02", "0.00", 0.ToString ("N", nfi)); - AssertEquals ("#03", "1.00",1.ToString ("N", nfi)); - } - - [Test] - public void Test04026 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "+"; - nfi.PositiveSign = "-"; - AssertEquals ("#01", "+1.00", (-1).ToString ("N", nfi)); - AssertEquals ("#02", "0.00", 0.ToString ("N", nfi)); - AssertEquals ("#03", "1.00",1.ToString ("N", nfi)); - } - - [Test] - public void Test04027 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberDecimalSeparator = "#"; - AssertEquals ("#01", "123#0",123.ToString ("N1", nfi)); - } - - [Test] - public void Test04028 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberGroupSeparator = "-"; - AssertEquals ("#01", "-2-147-483-648.0",Int32.MinValue.ToString ("N1", nfi)); - } - - [Test] - public void Test04029 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberGroupSizes = new int [] {}; - AssertEquals ("#01", "-2147483648.0",Int32.MinValue.ToString ("N1", nfi)); - nfi.NumberGroupSizes = new int [] {0}; - AssertEquals ("#02", "-2147483648.0",Int32.MinValue.ToString ("N1", nfi)); - nfi.NumberGroupSizes = new int [] {1}; - AssertEquals ("#03", "-2,1,4,7,4,8,3,6,4,8.0",Int32.MinValue.ToString ("N1", nfi)); - nfi.NumberGroupSizes = new int [] {3}; - AssertEquals ("#04", "-2,147,483,648.0",Int32.MinValue.ToString ("N1", nfi)); - nfi.NumberGroupSizes = new int [] {9}; - AssertEquals ("#05", "-2,147483648.0",Int32.MinValue.ToString ("N1", nfi)); - } - - [Test] - public void Test04030 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberGroupSizes = new int [] {1,2}; - AssertEquals ("#01", "-2,14,74,83,64,8.0",Int32.MinValue.ToString ("N1", nfi)); - nfi.NumberGroupSizes = new int [] {1,2,3}; - AssertEquals ("#02", "-2,147,483,64,8.0",Int32.MinValue.ToString ("N1", nfi)); - nfi.NumberGroupSizes = new int [] {1,2,3,4}; - AssertEquals ("#03", "-2147,483,64,8.0",Int32.MinValue.ToString ("N1", nfi)); - nfi.NumberGroupSizes = new int [] {1,2,1,2,1,2,1}; - AssertEquals ("#04", "-2,14,7,48,3,64,8.0",Int32.MinValue.ToString ("N1", nfi)); - nfi.NumberGroupSizes = new int [] {1,0}; - AssertEquals ("#05", "-214748364,8.0",Int32.MinValue.ToString ("N1", nfi)); - nfi.NumberGroupSizes = new int [] {1,2,0}; - AssertEquals ("#06", "-2147483,64,8.0",Int32.MinValue.ToString ("N1", nfi)); - nfi.NumberGroupSizes = new int [] {1,2,3,0}; - AssertEquals ("#07", "-2147,483,64,8.0",Int32.MinValue.ToString ("N1", nfi)); - nfi.NumberGroupSizes = new int [] {1,2,3,4,0}; - AssertEquals ("#08", "-2147,483,64,8.0",Int32.MinValue.ToString ("N1", nfi)); - } - - [Test] - public void Test04031 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "1234567890"; - AssertEquals ("#01", "12345678902,147,483,648.00", Int32.MinValue.ToString ("N", nfi)); - } - - // Test05000 - Int32 and P - [Test] - public void Test05000 () - { - AssertEquals ("#01", "0.00 %", 0.ToString ("P", _nfi)); - AssertEquals ("#02", "0.00 %", 0.ToString ("p", _nfi)); - AssertEquals ("#03", "-214,748,364,800.00 %", Int32.MinValue.ToString ("P", _nfi)); - AssertEquals ("#04", "-214,748,364,800.00 %", Int32.MinValue.ToString ("p", _nfi)); - AssertEquals ("#05", "214,748,364,700.00 %", Int32.MaxValue.ToString ("P", _nfi)); - AssertEquals ("#06", "214,748,364,700.00 %", Int32.MaxValue.ToString ("p", _nfi)); - } - - [Test] - public void Test05001 () - { - AssertEquals ("#01", "P ", 0.ToString ("P ", _nfi)); - AssertEquals ("#02", " P", 0.ToString (" P", _nfi)); - AssertEquals ("#03", " P ", 0.ToString (" P ", _nfi)); - } - - [Test] - public void Test05002 () - { - AssertEquals ("#01", "-P ", (-1).ToString ("P ", _nfi)); - AssertEquals ("#02", "- P", (-1).ToString (" P", _nfi)); - AssertEquals ("#03", "- P ", (-1).ToString (" P ", _nfi)); - } - - [Test] - public void Test05003 () - { - AssertEquals ("#01", "0 %", 0.ToString ("P0", _nfi)); - AssertEquals ("#02", "0.000000000 %", 0.ToString ("P9", _nfi)); - AssertEquals ("#03", "0.0000000000 %", 0.ToString ("P10", _nfi)); - AssertEquals ("#04", "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", 0.ToString ("P99", _nfi)); - AssertEquals ("#05", "P100", 0.ToString ("P100", _nfi)); - } - - [Test] - public void Test05004 () - { - AssertEquals ("#01", "214,748,364,700 %", Int32.MaxValue.ToString ("P0", _nfi)); - AssertEquals ("#02", "214,748,364,700.000000000 %", Int32.MaxValue.ToString ("P9", _nfi)); - AssertEquals ("#03", "214,748,364,700.0000000000 %", Int32.MaxValue.ToString ("P10", _nfi)); - AssertEquals ("#04", "214,748,364,700.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", Int32.MaxValue.ToString ("P99", _nfi)); - AssertEquals ("#05", "P12147483647", Int32.MaxValue.ToString ("P100", _nfi)); - } - - [Test] - public void Test05005 () - { - AssertEquals ("#01", "-214,748,364,800 %", Int32.MinValue.ToString ("P0", _nfi)); - AssertEquals ("#02", "-214,748,364,800.000000000 %", Int32.MinValue.ToString ("P9", _nfi)); - AssertEquals ("#03", "-214,748,364,800.0000000000 %", Int32.MinValue.ToString ("P10", _nfi)); - AssertEquals ("#04", "-214,748,364,800.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", Int32.MinValue.ToString ("P99", _nfi)); - AssertEquals ("#05", "-P12147483648", Int32.MinValue.ToString ("P100", _nfi)); - } - - [Test] - public void Test05006 () - { - AssertEquals ("#01", "PF", 0.ToString ("PF", _nfi)); - AssertEquals ("#02", "P0F", 0.ToString ("P0F", _nfi)); - AssertEquals ("#03", "P0xF", 0.ToString ("P0xF", _nfi)); - } - - [Test] - public void Test05007 () - { - AssertEquals ("#01", "PF", Int32.MaxValue.ToString ("PF", _nfi)); - AssertEquals ("#02", "P2147483647F", Int32.MaxValue.ToString ("P0F", _nfi)); - AssertEquals ("#03", "P2147483647xF", Int32.MaxValue.ToString ("P0xF", _nfi)); - } - - [Test] - public void Test05008 () - { - AssertEquals ("#01", "-PF", Int32.MinValue.ToString ("PF", _nfi)); - AssertEquals ("#02", "-P2147483648F", Int32.MinValue.ToString ("P0F", _nfi)); - AssertEquals ("#03", "-P2147483648xF", Int32.MinValue.ToString ("P0xF", _nfi)); - } - - [Test] - public void Test05009 () - { - AssertEquals ("#01", "0.0000000000 %", 0.ToString ("P0000000000000000000000000000000000000010", _nfi)); - AssertEquals ("#02", "214,748,364,700.0000000000 %", Int32.MaxValue.ToString ("P0000000000000000000000000000000000000010", _nfi)); - AssertEquals ("#03", "-214,748,364,800.0000000000 %", Int32.MinValue.ToString ("P0000000000000000000000000000000000000010", _nfi)); - } - - [Test] - public void Test05010 () - { - AssertEquals ("#01", "+P", 0.ToString ("+P", _nfi)); - AssertEquals ("#02", "P+", 0.ToString ("P+", _nfi)); - AssertEquals ("#03", "+P+", 0.ToString ("+P+", _nfi)); - } - - [Test] - public void Test05011 () - { - AssertEquals ("#01", "+P", Int32.MaxValue.ToString ("+P", _nfi)); - AssertEquals ("#02", "P+", Int32.MaxValue.ToString ("P+", _nfi)); - AssertEquals ("#03", "+P+", Int32.MaxValue.ToString ("+P+", _nfi)); - } - - [Test] - public void Test05012 () - { - AssertEquals ("#01", "-+P", Int32.MinValue.ToString ("+P", _nfi)); - AssertEquals ("#02", "-P+", Int32.MinValue.ToString ("P+", _nfi)); - AssertEquals ("#03", "-+P+", Int32.MinValue.ToString ("+P+", _nfi)); - } - - [Test] - public void Test05013 () - { - AssertEquals ("#01", "-P", 0.ToString ("-P", _nfi)); - AssertEquals ("#02", "P-", 0.ToString ("P-", _nfi)); - AssertEquals ("#03", "-P-", 0.ToString ("-P-", _nfi)); - } - - [Test] - public void Test05014 () - { - AssertEquals ("#01", "-P", Int32.MaxValue.ToString ("-P", _nfi)); - AssertEquals ("#02", "P-", Int32.MaxValue.ToString ("P-", _nfi)); - AssertEquals ("#03", "-P-", Int32.MaxValue.ToString ("-P-", _nfi)); - } - - [Test] - public void Test05015 () - { - AssertEquals ("#01", "--P", Int32.MinValue.ToString ("-P", _nfi)); - AssertEquals ("#02", "-P-", Int32.MinValue.ToString ("P-", _nfi)); - AssertEquals ("#03", "--P-", Int32.MinValue.ToString ("-P-", _nfi)); - } - - [Test] - public void Test05016 () - { - AssertEquals ("#01", "P+0", 0.ToString ("P+0", _nfi)); - AssertEquals ("#02", "P+2147483647", Int32.MaxValue.ToString ("P+0", _nfi)); - AssertEquals ("#03", "-P+2147483648", Int32.MinValue.ToString ("P+0", _nfi)); - } - - [Test] - public void Test05017 () - { - AssertEquals ("#01", "P+9", 0.ToString ("P+9", _nfi)); - AssertEquals ("#02", "P+9", Int32.MaxValue.ToString ("P+9", _nfi)); - AssertEquals ("#03", "-P+9", Int32.MinValue.ToString ("P+9", _nfi)); - } - - [Test] - public void Test05018 () - { - AssertEquals ("#01", "P-9", 0.ToString ("P-9", _nfi)); - AssertEquals ("#02", "P-9", Int32.MaxValue.ToString ("P-9", _nfi)); - AssertEquals ("#03", "-P-9", Int32.MinValue.ToString ("P-9", _nfi)); - } - - [Test] - public void Test05019 () - { - AssertEquals ("#01", "P0", 0.ToString ("P0,", _nfi)); - AssertEquals ("#02", "P2147484", Int32.MaxValue.ToString ("P0,", _nfi)); - AssertEquals ("#03", "-P2147484", Int32.MinValue.ToString ("P0,", _nfi)); - } - - [Test] - public void Test05020 () - { - AssertEquals ("#01", "P0", 0.ToString ("P0.", _nfi)); - AssertEquals ("#02", "P2147483647", Int32.MaxValue.ToString ("P0.", _nfi)); - AssertEquals ("#03", "-P2147483648", Int32.MinValue.ToString ("P0.", _nfi)); - } - - [Test] - public void Test05021 () - { - AssertEquals ("#01", "P0.0", 0.ToString ("P0.0", _nfi)); - AssertEquals ("#02", "P2147483647.0", Int32.MaxValue.ToString ("P0.0", _nfi)); - AssertEquals ("#03", "-P2147483648.0", Int32.MinValue.ToString ("P0.0", _nfi)); - } - - [Test] - public void Test05022 () - { - AssertEquals ("#01", "P09", 0.ToString ("P0.9", _nfi)); - AssertEquals ("#02", "P21474836479", Int32.MaxValue.ToString ("P0.9", _nfi)); - AssertEquals ("#03", "-P21474836489", Int32.MinValue.ToString ("P0.9", _nfi)); - } - - [Test] - public void Test05023 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentDecimalDigits = 0; - AssertEquals ("#01", "0 %", 0.ToString ("P", nfi)); - nfi.PercentDecimalDigits = 1; - AssertEquals ("#02", "0.0 %", 0.ToString ("P", nfi)); - nfi.PercentDecimalDigits = 99; - AssertEquals ("#03", "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", 0.ToString ("P", nfi)); - } - - [Test] - public void Test05024 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = ""; - AssertEquals ("#01", "214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi)); - nfi.NegativeSign = "-"; - AssertEquals ("#02", "-214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi)); - nfi.NegativeSign = "+"; - AssertEquals ("#03", "+214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi)); - nfi.NegativeSign = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMPOPQRSTUVWXYZ"; - AssertEquals ("#04", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMPOPQRSTUVWXYZ214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi)); - } - - [Test] - public void Test05025 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "-"; - nfi.PositiveSign = "+"; - AssertEquals ("#01", "-100.00 %", (-1).ToString ("P", nfi)); - AssertEquals ("#02", "0.00 %", 0.ToString ("P", nfi)); - AssertEquals ("#03", "100.00 %",1.ToString ("P", nfi)); - } - - [Test] - public void Test05026 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "+"; - nfi.PositiveSign = "-"; - AssertEquals ("#01", "+100.00 %", (-1).ToString ("P", nfi)); - AssertEquals ("#02", "0.00 %", 0.ToString ("P", nfi)); - AssertEquals ("#03", "100.00 %",1.ToString ("P", nfi)); - } - - [Test] - public void Test05027 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentDecimalSeparator = "#"; - AssertEquals ("#01", "12,300#0 %",123.ToString ("P1", nfi)); - } - - [Test] - public void Test05028 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentGroupSeparator = "-"; - AssertEquals ("#01", "-214-748-364-800.0 %",Int32.MinValue.ToString ("P1", nfi)); - } - - [Test] - public void Test05029 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentGroupSizes = new int [] {}; - AssertEquals ("#01", "-214748364800.0 %",Int32.MinValue.ToString ("P1", nfi)); - nfi.PercentGroupSizes = new int [] {0}; - AssertEquals ("#02", "-214748364800.0 %",Int32.MinValue.ToString ("P1", nfi)); - nfi.PercentGroupSizes = new int [] {1}; - AssertEquals ("#03", "-2,1,4,7,4,8,3,6,4,8,0,0.0 %",Int32.MinValue.ToString ("P1", nfi)); - nfi.PercentGroupSizes = new int [] {3}; - AssertEquals ("#04", "-214,748,364,800.0 %",Int32.MinValue.ToString ("P1", nfi)); - nfi.PercentGroupSizes = new int [] {9}; - AssertEquals ("#05", "-214,748364800.0 %",Int32.MinValue.ToString ("P1", nfi)); - } - - [Test] - public void Test05030 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentGroupSizes = new int [] {1,2}; - AssertEquals ("#01", "-2,14,74,83,64,80,0.0 %",Int32.MinValue.ToString ("P1", nfi)); - nfi.PercentGroupSizes = new int [] {1,2,3}; - AssertEquals ("#02", "-214,748,364,80,0.0 %",Int32.MinValue.ToString ("P1", nfi)); - nfi.PercentGroupSizes = new int [] {1,2,3,4}; - AssertEquals ("#03", "-21,4748,364,80,0.0 %",Int32.MinValue.ToString ("P1", nfi)); - nfi.PercentGroupSizes = new int [] {1,2,1,2,1,2,1}; - AssertEquals ("#04", "-2,1,4,74,8,36,4,80,0.0 %",Int32.MinValue.ToString ("P1", nfi)); - nfi.PercentGroupSizes = new int [] {1,0}; - AssertEquals ("#05", "-21474836480,0.0 %",Int32.MinValue.ToString ("P1", nfi)); - nfi.PercentGroupSizes = new int [] {1,2,0}; - AssertEquals ("#06", "-214748364,80,0.0 %",Int32.MinValue.ToString ("P1", nfi)); - nfi.PercentGroupSizes = new int [] {1,2,3,0}; - AssertEquals ("#07", "-214748,364,80,0.0 %",Int32.MinValue.ToString ("P1", nfi)); - nfi.PercentGroupSizes = new int [] {1,2,3,4,0}; - AssertEquals ("#08", "-21,4748,364,80,0.0 %",Int32.MinValue.ToString ("P1", nfi)); - } - - [Test] - public void Test05031 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "1234567890"; - AssertEquals ("#01", "1234567890214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi)); - } - - [Test] - public void Test05032 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentNegativePattern = 0; - AssertEquals ("#01", "-214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi)); - AssertEquals ("#02", "214,748,364,700.00 %", Int32.MaxValue.ToString ("P", nfi)); - AssertEquals ("#03", "0.00 %", 0.ToString ("P", nfi)); - } - - [Test] - public void Test05033 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentNegativePattern = 1; - AssertEquals ("#01", "-214,748,364,800.00%", Int32.MinValue.ToString ("P", nfi)); - AssertEquals ("#02", "214,748,364,700.00 %", Int32.MaxValue.ToString ("P", nfi)); - AssertEquals ("#03", "0.00 %", 0.ToString ("P", nfi)); - } - - [Test] - public void Test05034 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentNegativePattern = 2; - AssertEquals ("#01", "-%214,748,364,800.00", Int32.MinValue.ToString ("P", nfi)); - AssertEquals ("#02", "214,748,364,700.00 %", Int32.MaxValue.ToString ("P", nfi)); - AssertEquals ("#03", "0.00 %", 0.ToString ("P", nfi)); - } - - [Test] - public void Test05035 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentPositivePattern = 0; - AssertEquals ("#01", "-214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi)); - AssertEquals ("#02", "214,748,364,700.00 %", Int32.MaxValue.ToString ("P", nfi)); - AssertEquals ("#03", "0.00 %", 0.ToString ("P", nfi)); - } - - [Test] - public void Test05036 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentPositivePattern = 1; - AssertEquals ("#01", "-214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi)); - AssertEquals ("#02", "214,748,364,700.00%", Int32.MaxValue.ToString ("P", nfi)); - AssertEquals ("#03", "0.00%", 0.ToString ("P", nfi)); - } - - [Test] - public void Test05037 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentPositivePattern = 2; - AssertEquals ("#01", "-214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi)); - AssertEquals ("#02", "%214,748,364,700.00", Int32.MaxValue.ToString ("P", nfi)); - AssertEquals ("#03", "%0.00", 0.ToString ("P", nfi)); - } - - // Test06000 - Int32 and R - [Test] - [ExpectedException (typeof (FormatException))] - public void Test06000 () - { - AssertEquals ("#01", "0", 0.ToString ("R", _nfi)); - } - - // Test07000- Int32 and X - [Test] - public void Test07000 () - { - AssertEquals ("#01", "0", 0.ToString ("X", _nfi)); - AssertEquals ("#02", "0", 0.ToString ("x", _nfi)); - AssertEquals ("#03", "80000000", Int32.MinValue.ToString ("X", _nfi)); - AssertEquals ("#04", "80000000", Int32.MinValue.ToString ("x", _nfi)); - AssertEquals ("#05", "7FFFFFFF", Int32.MaxValue.ToString ("X", _nfi)); - AssertEquals ("#06", "7fffffff", Int32.MaxValue.ToString ("x", _nfi)); - } - - [Test] - public void Test07001 () - { - AssertEquals ("#01", "X ", 0.ToString ("X ", _nfi)); - AssertEquals ("#02", " X", 0.ToString (" X", _nfi)); - AssertEquals ("#03", " X ", 0.ToString (" X ", _nfi)); - } - - [Test] - public void Test07002 () - { - AssertEquals ("#01", "-X ", (-1).ToString ("X ", _nfi)); - AssertEquals ("#02", "- X", (-1).ToString (" X", _nfi)); - AssertEquals ("#03", "- X ", (-1).ToString (" X ", _nfi)); - } - - [Test] - public void Test07003 () - { - AssertEquals ("#01", "0", 0.ToString ("X0", _nfi)); - AssertEquals ("#02", "0000000000", 0.ToString ("X10", _nfi)); - AssertEquals ("#03", "00000000000", 0.ToString ("X11", _nfi)); - AssertEquals ("#04", "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("X99", _nfi)); - AssertEquals ("#05", "X100", 0.ToString ("X100", _nfi)); - } - - [Test] - public void Test07004 () - { - AssertEquals ("#01", "7FFFFFFF", Int32.MaxValue.ToString ("X0", _nfi)); - AssertEquals ("#02", "007FFFFFFF", Int32.MaxValue.ToString ("X10", _nfi)); - AssertEquals ("#03", "0007FFFFFFF", Int32.MaxValue.ToString ("X11", _nfi)); - AssertEquals ("#04", "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFFFFFF", Int32.MaxValue.ToString ("X99", _nfi)); - AssertEquals ("#05", "X12147483647", Int32.MaxValue.ToString ("X100", _nfi)); - } - - [Test] - public void Test07005 () - { - AssertEquals ("#01", "80000000", Int32.MinValue.ToString ("X0", _nfi)); - AssertEquals ("#02", "0080000000", Int32.MinValue.ToString ("X10", _nfi)); - AssertEquals ("#03", "00080000000", Int32.MinValue.ToString ("X11", _nfi)); - AssertEquals ("#04", "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000", Int32.MinValue.ToString ("X99", _nfi)); - AssertEquals ("#05", "-X12147483648", Int32.MinValue.ToString ("X100", _nfi)); - } - - [Test] - public void Test07006 () - { - AssertEquals ("#01", "XF", 0.ToString ("XF", _nfi)); - AssertEquals ("#02", "X0F", 0.ToString ("X0F", _nfi)); - AssertEquals ("#03", "X0xF", 0.ToString ("X0xF", _nfi)); - } - - [Test] - public void Test07007 () - { - AssertEquals ("#01", "XF", Int32.MaxValue.ToString ("XF", _nfi)); - AssertEquals ("#02", "X2147483647F", Int32.MaxValue.ToString ("X0F", _nfi)); - AssertEquals ("#03", "X2147483647xF", Int32.MaxValue.ToString ("X0xF", _nfi)); - } - - [Test] - public void Test07008 () - { - AssertEquals ("#01", "-XF", Int32.MinValue.ToString ("XF", _nfi)); - AssertEquals ("#02", "-X2147483648F", Int32.MinValue.ToString ("X0F", _nfi)); - AssertEquals ("#03", "-X2147483648xF", Int32.MinValue.ToString ("X0xF", _nfi)); - } - - [Test] - public void Test07009 () - { - AssertEquals ("#01", "00000000000", 0.ToString ("X0000000000000000000000000000000000000011", _nfi)); - AssertEquals ("#02", "0007FFFFFFF", Int32.MaxValue.ToString ("X0000000000000000000000000000000000000011", _nfi)); - AssertEquals ("#03", "00080000000", Int32.MinValue.ToString ("X0000000000000000000000000000000000000011", _nfi)); - } - - [Test] - public void Test07010 () - { - AssertEquals ("#01", "+X", 0.ToString ("+X", _nfi)); - AssertEquals ("#02", "X+", 0.ToString ("X+", _nfi)); - AssertEquals ("#03", "+X+", 0.ToString ("+X+", _nfi)); - } - - [Test] - public void Test07011 () - { - AssertEquals ("#01", "+X", Int32.MaxValue.ToString ("+X", _nfi)); - AssertEquals ("#02", "X+", Int32.MaxValue.ToString ("X+", _nfi)); - AssertEquals ("#03", "+X+", Int32.MaxValue.ToString ("+X+", _nfi)); - } - - [Test] - public void Test07012 () - { - AssertEquals ("#01", "-+X", Int32.MinValue.ToString ("+X", _nfi)); - AssertEquals ("#02", "-X+", Int32.MinValue.ToString ("X+", _nfi)); - AssertEquals ("#03", "-+X+", Int32.MinValue.ToString ("+X+", _nfi)); - } - - [Test] - public void Test07013 () - { - AssertEquals ("#01", "-X", 0.ToString ("-X", _nfi)); - AssertEquals ("#02", "X-", 0.ToString ("X-", _nfi)); - AssertEquals ("#03", "-X-", 0.ToString ("-X-", _nfi)); - } - - [Test] - public void Test07014 () - { - AssertEquals ("#01", "-X", Int32.MaxValue.ToString ("-X", _nfi)); - AssertEquals ("#02", "X-", Int32.MaxValue.ToString ("X-", _nfi)); - AssertEquals ("#03", "-X-", Int32.MaxValue.ToString ("-X-", _nfi)); - } - - [Test] - public void Test07015 () - { - AssertEquals ("#01", "--X", Int32.MinValue.ToString ("-X", _nfi)); - AssertEquals ("#02", "-X-", Int32.MinValue.ToString ("X-", _nfi)); - AssertEquals ("#03", "--X-", Int32.MinValue.ToString ("-X-", _nfi)); - } - - [Test] - public void Test07016 () - { - AssertEquals ("#01", "X+0", 0.ToString ("X+0", _nfi)); - AssertEquals ("#02", "X+2147483647", Int32.MaxValue.ToString ("X+0", _nfi)); - AssertEquals ("#03", "-X+2147483648", Int32.MinValue.ToString ("X+0", _nfi)); - } - - [Test] - public void Test07017 () - { - AssertEquals ("#01", "X+9", 0.ToString ("X+9", _nfi)); - AssertEquals ("#02", "X+9", Int32.MaxValue.ToString ("X+9", _nfi)); - AssertEquals ("#03", "-X+9", Int32.MinValue.ToString ("X+9", _nfi)); - } - - [Test] - public void Test07018 () - { - AssertEquals ("#01", "X-9", 0.ToString ("X-9", _nfi)); - AssertEquals ("#02", "X-9", Int32.MaxValue.ToString ("X-9", _nfi)); - AssertEquals ("#03", "-X-9", Int32.MinValue.ToString ("X-9", _nfi)); - } - - [Test] - public void Test07019 () - { - AssertEquals ("#01", "X0", 0.ToString ("X0,", _nfi)); - AssertEquals ("#02", "X2147484", Int32.MaxValue.ToString ("X0,", _nfi)); - AssertEquals ("#03", "-X2147484", Int32.MinValue.ToString ("X0,", _nfi)); - } - - [Test] - public void Test07020 () - { - AssertEquals ("#01", "X0", 0.ToString ("X0.", _nfi)); - AssertEquals ("#02", "X2147483647", Int32.MaxValue.ToString ("X0.", _nfi)); - AssertEquals ("#03", "-X2147483648", Int32.MinValue.ToString ("X0.", _nfi)); - } - - [Test] - public void Test07021 () - { - AssertEquals ("#01", "X0.0", 0.ToString ("X0.0", _nfi)); - AssertEquals ("#02", "X2147483647.0", Int32.MaxValue.ToString ("X0.0", _nfi)); - AssertEquals ("#03", "-X2147483648.0", Int32.MinValue.ToString ("X0.0", _nfi)); - } - - [Test] - public void Test07022 () - { - AssertEquals ("#01", "X09", 0.ToString ("X0.9", _nfi)); - AssertEquals ("#02", "X21474836479", Int32.MaxValue.ToString ("X0.9", _nfi)); - AssertEquals ("#03", "-X21474836489", Int32.MinValue.ToString ("X0.9", _nfi)); - } - - [Test] - public void Test08000 () - { - AssertEquals ("#01", "0", 0.ToString ("0", _nfi)); - AssertEquals ("#02", "2147483647", Int32.MaxValue.ToString ("0", _nfi)); - AssertEquals ("#03", "-2147483648", Int32.MinValue.ToString ("0", _nfi)); - } - - // Test08000 - Int32 and Custom - [Test] - public void Test08001 () - { - AssertEquals ("#01", "00000000000", 0.ToString ("00000000000", _nfi)); - AssertEquals ("#02", "02147483647", Int32.MaxValue.ToString ("00000000000", _nfi)); - AssertEquals ("#03", "-02147483648", Int32.MinValue.ToString ("00000000000", _nfi)); - } - - [Test] - public void Test08002 () - { - AssertEquals ("#01", " 00000000000 ", 0.ToString (" 00000000000 ", _nfi)); - AssertEquals ("#02", " 02147483647 ", Int32.MaxValue.ToString (" 00000000000 ", _nfi)); - AssertEquals ("#03", "- 02147483648 ", Int32.MinValue.ToString (" 00000000000 ", _nfi)); - } - - [Test] - public void Test08003 () - { - AssertEquals ("#01", "", 0.ToString ("#", _nfi)); - AssertEquals ("#02", "2147483647", Int32.MaxValue.ToString ("#", _nfi)); - AssertEquals ("#03", "-2147483648", Int32.MinValue.ToString ("#", _nfi)); - } - - [Test] - public void Test08004 () - { - AssertEquals ("#01", "", 0.ToString ("##########", _nfi)); - AssertEquals ("#02", "2147483647", Int32.MaxValue.ToString ("##########", _nfi)); - AssertEquals ("#03", "-2147483648", Int32.MinValue.ToString ("##########", _nfi)); - } - - [Test] - public void Test08005 () - { - AssertEquals ("#01", " ", 0.ToString (" ########## ", _nfi)); - AssertEquals ("#02", " 2147483647 ", Int32.MaxValue.ToString (" ########## ", _nfi)); - AssertEquals ("#03", "- 2147483648 ", Int32.MinValue.ToString (" ########## ", _nfi)); - } - - [Test] - public void Test08006 () - { - AssertEquals ("#01", "", 0.ToString (".", _nfi)); - AssertEquals ("#02", "", Int32.MaxValue.ToString (".", _nfi)); - AssertEquals ("#03", "-", Int32.MinValue.ToString (".", _nfi)); - } - - [Test] - public void Test08007 () - { - AssertEquals ("#01", "00000000000", 0.ToString ("00000000000.", _nfi)); - AssertEquals ("#02", "02147483647", Int32.MaxValue.ToString ("00000000000.", _nfi)); - AssertEquals ("#03", "-02147483648", Int32.MinValue.ToString ("00000000000.", _nfi)); - } - - [Test] - public void Test08008 () - { - AssertEquals ("#01", ".00000000000", 0.ToString (".00000000000", _nfi)); - AssertEquals ("#02", "2147483647.00000000000", Int32.MaxValue.ToString (".00000000000", _nfi)); - AssertEquals ("#03", "-2147483648.00000000000", Int32.MinValue.ToString (".00000000000", _nfi)); - } - - [Test] - public void Test08009 () - { - AssertEquals ("#01", "00000000000.00000000000", 0.ToString ("00000000000.00000000000", _nfi)); - AssertEquals ("#02", "02147483647.00000000000", Int32.MaxValue.ToString ("00000000000.00000000000", _nfi)); - AssertEquals ("#03", "-02147483648.00000000000", Int32.MinValue.ToString ("00000000000.00000000000", _nfi)); - } - - [Test] - public void Test08010 () - { - AssertEquals ("#01", "00.0000000000", 0.ToString ("00.0.00.000.0000", _nfi)); - AssertEquals ("#02", "01.0000000000", 1.ToString ("00.0.00.000.0000", _nfi)); - AssertEquals ("#03", "-01.0000000000", (-1).ToString ("00.0.00.000.0000", _nfi)); - } - - [Test] - public void Test08011 () - { - AssertEquals ("#01", "", 0.ToString ("##.#.##.###.####", _nfi)); - AssertEquals ("#02", "1", 1.ToString ("##.#.##.###.####", _nfi)); - AssertEquals ("#03", "-1", (-1).ToString ("##.#.##.###.####", _nfi)); - } - - [Test] - public void Test08012 () - { - AssertEquals ("#01", "00", 0.ToString ("0#.#.##.###.####", _nfi)); - AssertEquals ("#02", "01", 1.ToString ("0#.#.##.###.####", _nfi)); - AssertEquals ("#03", "-01", (-1).ToString ("0#.#.##.###.####", _nfi)); - } - - [Test] - public void Test08013 () - { - AssertEquals ("#01", "0", 0.ToString ("#0.#.##.###.####", _nfi)); - AssertEquals ("#02", "1", 1.ToString ("#0.#.##.###.####", _nfi)); - AssertEquals ("#03", "-1", (-1).ToString ("#0.#.##.###.####", _nfi)); - } - - [Test] - public void Test08014 () - { - AssertEquals ("#01", ".0000000000", 0.ToString ("##.#.##.###.###0", _nfi)); - AssertEquals ("#02", "1.0000000000", 1.ToString ("##.#.##.###.###0", _nfi)); - AssertEquals ("#03", "-1.0000000000", (-1).ToString ("##.#.##.###.###0", _nfi)); - } - - [Test] - public void Test08015 () - { - AssertEquals ("#01", ".000000000", 0.ToString ("##.#.##.###.##0#", _nfi)); - AssertEquals ("#02", "1.000000000", 1.ToString ("##.#.##.###.##0#", _nfi)); - AssertEquals ("#03", "-1.000000000", (-1).ToString ("##.#.##.###.##0#", _nfi)); - } - - [Test] - public void Test08016 () - { - AssertEquals ("#01", ".000000000", 0.ToString ("##.#.##.##0.##0#", _nfi)); - AssertEquals ("#02", "1.000000000", 1.ToString ("##.#.##.##0.##0#", _nfi)); - AssertEquals ("#03", "-1.000000000", (-1).ToString ("##.#.##.##0.##0#", _nfi)); - } - - [Test] - public void Test08017 () - { - AssertEquals ("#01", "0.000000000", 0.ToString ("#0.#.##.##0.##0#", _nfi)); - AssertEquals ("#02", "1.000000000", 1.ToString ("#0.#.##.##0.##0#", _nfi)); - AssertEquals ("#03", "-1.000000000", (-1).ToString ("#0.#.##.##0.##0#", _nfi)); - } - - [Test] - public void Test08018 () - { - AssertEquals ("#01", "-0002147484", Int32.MinValue.ToString ("0000000000,", _nfi)); - AssertEquals ("#02", "-0000002147", Int32.MinValue.ToString ("0000000000,,", _nfi)); - AssertEquals ("#03", "-0000000002", Int32.MinValue.ToString ("0000000000,,,", _nfi)); - AssertEquals ("#04", "0000000000", Int32.MinValue.ToString ("0000000000,,,,", _nfi)); - AssertEquals ("#05", "0000000000", Int32.MinValue.ToString ("0000000000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", _nfi)); - } - - [Test] - public void Test08019 () - { - AssertEquals ("#01", "-2147483648", Int32.MinValue.ToString (",0000000000", _nfi)); - } - - [Test] - public void Test08020 () - { - AssertEquals ("#01", "-0002147484", Int32.MinValue.ToString (",0000000000,", _nfi)); - } - - [Test] - public void Test08021 () - { - AssertEquals ("#01", "-02,147,483,648", Int32.MinValue.ToString ("0,0000000000", _nfi)); - } - - [Test] - public void Test08022 () - { - AssertEquals ("#01", "-02,147,483,648", Int32.MinValue.ToString ("0000000000,0", _nfi)); - } - - [Test] - public void Test08023 () - { - AssertEquals ("#01", "-02,147,483,648", Int32.MinValue.ToString ("0,0,0,0,0,0,0,0,0,0,0", _nfi)); - } - - [Test] - public void Test08024 () - { - AssertEquals ("#01", "-02,147,483,648", Int32.MinValue.ToString (",0,0,0,0,0,0,0,0,0,0,0", _nfi)); - } - - [Test] - public void Test08025 () - { - AssertEquals ("#01", "-00,002,147,484", Int32.MinValue.ToString ("0,0,0,0,0,0,0,0,0,0,0,", _nfi)); - } - - [Test] - public void Test08026 () - { - AssertEquals ("#01", "-00,002,147,484", Int32.MinValue.ToString (",0,0,0,0,0,0,0,0,0,0,0,", _nfi)); - } - - [Test] - public void Test08027 () - { - AssertEquals ("#01", "-", Int32.MinValue.ToString (",", _nfi)); - } - - [Test] - public void Test08028 () - { - AssertEquals ("#01", "-2147483648", Int32.MinValue.ToString (",##########", _nfi)); - } - - [Test] - public void Test08029 () - { - AssertEquals ("#01", "-2147484", Int32.MinValue.ToString (",##########,", _nfi)); - } - - [Test] - public void Test08030 () - { - AssertEquals ("#01", "-2,147,483,648", Int32.MinValue.ToString ("#,##########", _nfi)); - } - - [Test] - public void Test08031 () - { - AssertEquals ("#01", "-2,147,483,648", Int32.MinValue.ToString ("##########,#", _nfi)); - } - - [Test] - public void Test08032 () - { - AssertEquals ("#01", "-2,147,483,648", Int32.MinValue.ToString ("#,#,#,#,#,#,#,#,#,#,#", _nfi)); - } - - [Test] - public void Test08033 () - { - AssertEquals ("#01", "-2,147,483,648", Int32.MinValue.ToString (",#,#,#,#,#,#,#,#,#,#,#", _nfi)); - } - - [Test] - public void Test08034 () - { - AssertEquals ("#01", "-2,147,484", Int32.MinValue.ToString ("#,#,#,#,#,#,#,#,#,#,#,", _nfi)); - } - - [Test] - public void Test08035 () - { - AssertEquals ("#01", "-2,147,484", Int32.MinValue.ToString (",#,#,#,#,#,#,#,#,#,#,#,", _nfi)); - } - - [Test] - public void Test08036 () - { - AssertEquals ("#01", "-1", (-1000).ToString ("##########,", _nfi)); - } - - [Test] - public void Test08037 () - { - AssertEquals ("#01", "", (-100).ToString ("##########,", _nfi)); - } - - [Test] - public void Test08038 () - { - AssertEquals ("#01", "-%", Int32.MinValue.ToString ("%", _nfi)); - } - - [Test] - public void Test08039 () - { - AssertEquals ("#01", "-214748364800%", Int32.MinValue.ToString ("0%", _nfi)); - } - - [Test] - public void Test08040 () - { - AssertEquals ("#01", "-%214748364800", Int32.MinValue.ToString ("%0", _nfi)); - } - - [Test] - public void Test08041 () - { - AssertEquals ("#01", "-%21474836480000%", Int32.MinValue.ToString ("%0%", _nfi)); - } - - [Test] - public void Test08042 () - { - AssertEquals ("#01", "- % 21474836480000 % ", Int32.MinValue.ToString (" % 0 % ", _nfi)); - } - - [Test] - public void Test08043 () - { - AssertEquals ("#01", "-214748365%", Int32.MinValue.ToString ("0%,", _nfi)); - } - - [Test] - public void Test08044 () - { - AssertEquals ("#01", "-214748365%", Int32.MinValue.ToString ("0,%", _nfi)); - } - - [Test] - public void Test08045 () - { - AssertEquals ("#01", "-%214748364800", Int32.MinValue.ToString (",%0", _nfi)); - } - - [Test] - public void Test08046 () - { - AssertEquals ("#01", "-%214748364800", Int32.MinValue.ToString ("%,0", _nfi)); - } - - [Test] - public void Test08047 () - { - AssertEquals ("#01", "-2147483648%%%%%%", Int32.MinValue.ToString ("0,,,,%%%%%%", _nfi)); - } - - [Test] - public void Test08048 () - { - AssertEquals ("#01", "-2147483648%%%%%%", Int32.MinValue.ToString ("0%%%%%%,,,,", _nfi)); - } - - [Test] - public void Test08049 () - { - AssertEquals ("#01", "-%%%%%%2147483648", Int32.MinValue.ToString ("%%%%%%0,,,,", _nfi)); - } - - [Test] - public void Test08050 () - { - AssertEquals ("#01", "E+0", Int32.MinValue.ToString ("E+0", _nfi)); - AssertEquals ("#02", "e+0", Int32.MinValue.ToString ("e+0", _nfi)); - AssertEquals ("#03", "E0", Int32.MinValue.ToString ("E-0", _nfi)); - AssertEquals ("#04", "e0", Int32.MinValue.ToString ("e-0", _nfi)); - } - - [Test] - public void Test08051 () - { - AssertEquals ("#01", "-2E+9", Int32.MinValue.ToString ("0E+0", _nfi)); - AssertEquals ("#02", "-2e+9", Int32.MinValue.ToString ("0e+0", _nfi)); - AssertEquals ("#03", "-2E9", Int32.MinValue.ToString ("0E-0", _nfi)); - AssertEquals ("#04", "-2e9", Int32.MinValue.ToString ("0e-0", _nfi)); - AssertEquals ("#05", "-2E9", Int32.MinValue.ToString ("0E0", _nfi)); - AssertEquals ("#06", "-2e9", Int32.MinValue.ToString ("0e0", _nfi)); - } - - [Test] - public void Test08052 () - { - AssertEquals ("#01", "-2E+9", Int32.MinValue.ToString ("#E+0", _nfi)); - AssertEquals ("#02", "-2e+9", Int32.MinValue.ToString ("#e+0", _nfi)); - AssertEquals ("#03", "-2E9", Int32.MinValue.ToString ("#E-0", _nfi)); - AssertEquals ("#04", "-2e9", Int32.MinValue.ToString ("#e-0", _nfi)); - AssertEquals ("#05", "-2E9", Int32.MinValue.ToString ("#E0", _nfi)); - AssertEquals ("#06", "-2e9", Int32.MinValue.ToString ("#e0", _nfi)); - } - - [Test] - public void Test08053 () - { - AssertEquals ("#01", "-2147483648E+0", Int32.MinValue.ToString ("0000000000E+0", _nfi)); - AssertEquals ("#02", "-2147483648e+0", Int32.MinValue.ToString ("0000000000e+0", _nfi)); - AssertEquals ("#03", "-2147483648E0", Int32.MinValue.ToString ("0000000000E-0", _nfi)); - AssertEquals ("#04", "-2147483648e0", Int32.MinValue.ToString ("0000000000e-0", _nfi)); - AssertEquals ("#05", "-2147483648E0", Int32.MinValue.ToString ("0000000000E0", _nfi)); - AssertEquals ("#06", "-2147483648e0", Int32.MinValue.ToString ("0000000000e0", _nfi)); - } - - [Test] - public void Test08054 () - { - AssertEquals ("#01", "-21474836480E-1", Int32.MinValue.ToString ("00000000000E+0", _nfi)); - AssertEquals ("#02", "-21474836480e-1", Int32.MinValue.ToString ("00000000000e+0", _nfi)); - AssertEquals ("#03", "-21474836480E-1", Int32.MinValue.ToString ("00000000000E-0", _nfi)); - AssertEquals ("#04", "-21474836480e-1", Int32.MinValue.ToString ("00000000000e-0", _nfi)); - AssertEquals ("#05", "-21474836480E-1", Int32.MinValue.ToString ("00000000000E0", _nfi)); - AssertEquals ("#06", "-21474836480e-1", Int32.MinValue.ToString ("00000000000e0", _nfi)); - } - - [Test] - public void Test08055 () - { - AssertEquals ("#01", "-214748365E+1", Int32.MinValue.ToString ("000000000E+0", _nfi)); - AssertEquals ("#02", "-214748365e+1", Int32.MinValue.ToString ("000000000e+0", _nfi)); - AssertEquals ("#03", "-214748365E1", Int32.MinValue.ToString ("000000000E-0", _nfi)); - AssertEquals ("#04", "-214748365e1", Int32.MinValue.ToString ("000000000e-0", _nfi)); - AssertEquals ("#05", "-214748365E1", Int32.MinValue.ToString ("000000000E0", _nfi)); - AssertEquals ("#06", "-214748365e1", Int32.MinValue.ToString ("000000000e0", _nfi)); - } - - [Test] - public void Test08056 () - { - AssertEquals ("#01", "-21474836E+2", Int32.MinValue.ToString ("00000000E+0", _nfi)); - AssertEquals ("#02", "-21474836e+2", Int32.MinValue.ToString ("00000000e+0", _nfi)); - AssertEquals ("#03", "-21474836E2", Int32.MinValue.ToString ("00000000E-0", _nfi)); - AssertEquals ("#04", "-21474836e2", Int32.MinValue.ToString ("00000000e-0", _nfi)); - AssertEquals ("#05", "-21474836E2", Int32.MinValue.ToString ("00000000E0", _nfi)); - AssertEquals ("#06", "-21474836e2", Int32.MinValue.ToString ("00000000e0", _nfi)); - } - - [Test] - public void Test08057 () - { - AssertEquals ("#01", "-2147483648E+00", Int32.MinValue.ToString ("0000000000E+00", _nfi)); - AssertEquals ("#02", "-2147483648e+00", Int32.MinValue.ToString ("0000000000e+00", _nfi)); - AssertEquals ("#03", "-2147483648E00", Int32.MinValue.ToString ("0000000000E-00", _nfi)); - AssertEquals ("#04", "-2147483648e00", Int32.MinValue.ToString ("0000000000e-00", _nfi)); - AssertEquals ("#05", "-2147483648E00", Int32.MinValue.ToString ("0000000000E00", _nfi)); - AssertEquals ("#06", "-2147483648e00", Int32.MinValue.ToString ("0000000000e00", _nfi)); - } - - [Test] - public void Test08058 () - { - AssertEquals ("#01", "-2147483648E+02%", Int32.MinValue.ToString ("0000000000E+00%", _nfi)); - AssertEquals ("#02", "-2147483648e+02%", Int32.MinValue.ToString ("0000000000e+00%", _nfi)); - AssertEquals ("#03", "-2147483648E02%", Int32.MinValue.ToString ("0000000000E-00%", _nfi)); - AssertEquals ("#04", "-2147483648e02%", Int32.MinValue.ToString ("0000000000e-00%", _nfi)); - AssertEquals ("#05", "-2147483648E02%", Int32.MinValue.ToString ("0000000000E00%", _nfi)); - AssertEquals ("#06", "-2147483648e02%", Int32.MinValue.ToString ("0000000000e00%", _nfi)); - } - - [Test] - public void Test08059 () - { - AssertEquals ("#01", "-2147483648E+10%%%%%", Int32.MinValue.ToString ("0000000000E+00%%%%%", _nfi)); - AssertEquals ("#02", "-2147483648e+10%%%%%", Int32.MinValue.ToString ("0000000000e+00%%%%%", _nfi)); - AssertEquals ("#03", "-2147483648E10%%%%%", Int32.MinValue.ToString ("0000000000E-00%%%%%", _nfi)); - AssertEquals ("#04", "-2147483648e10%%%%%", Int32.MinValue.ToString ("0000000000e-00%%%%%", _nfi)); - AssertEquals ("#05", "-2147483648E10%%%%%", Int32.MinValue.ToString ("0000000000E00%%%%%", _nfi)); - AssertEquals ("#06", "-2147483648e10%%%%%", Int32.MinValue.ToString ("0000000000e00%%%%%", _nfi)); - } - - [Test] - public void Test08060 () - { - AssertEquals ("#01", "-2147483648E-03", Int32.MinValue.ToString ("0000000000E+00,", _nfi)); - AssertEquals ("#02", "-2147483648e-03", Int32.MinValue.ToString ("0000000000e+00,", _nfi)); - AssertEquals ("#03", "-2147483648E-03", Int32.MinValue.ToString ("0000000000E-00,", _nfi)); - AssertEquals ("#04", "-2147483648e-03", Int32.MinValue.ToString ("0000000000e-00,", _nfi)); - AssertEquals ("#05", "-2147483648E-03", Int32.MinValue.ToString ("0000000000E00,", _nfi)); - AssertEquals ("#06", "-2147483648e-03", Int32.MinValue.ToString ("0000000000e00,", _nfi)); - } - - [Test] - public void Test08061 () - { - AssertEquals ("#01", "-2147483648E-12", Int32.MinValue.ToString ("0000000000E+00,,,,", _nfi)); - AssertEquals ("#02", "-2147483648e-12", Int32.MinValue.ToString ("0000000000e+00,,,,", _nfi)); - AssertEquals ("#03", "-2147483648E-12", Int32.MinValue.ToString ("0000000000E-00,,,,", _nfi)); - AssertEquals ("#04", "-2147483648e-12", Int32.MinValue.ToString ("0000000000e-00,,,,", _nfi)); - AssertEquals ("#05", "-2147483648E-12", Int32.MinValue.ToString ("0000000000E00,,,,", _nfi)); - AssertEquals ("#06", "-2147483648e-12", Int32.MinValue.ToString ("0000000000e00,,,,", _nfi)); - } - - [Test] - public void Test08062 () - { - AssertEquals ("#01", "-2147483648E-04%%%%", Int32.MinValue.ToString ("0000000000E+00,,,,%%%%", _nfi)); - AssertEquals ("#02", "-2147483648e-04%%%%", Int32.MinValue.ToString ("0000000000e+00,,,,%%%%", _nfi)); - AssertEquals ("#03", "-2147483648E-04%%%%", Int32.MinValue.ToString ("0000000000E-00,,,,%%%%", _nfi)); - AssertEquals ("#04", "-2147483648e-04%%%%", Int32.MinValue.ToString ("0000000000e-00,,,,%%%%", _nfi)); - AssertEquals ("#05", "-2147483648E-04%%%%", Int32.MinValue.ToString ("0000000000E00,,,,%%%%", _nfi)); - AssertEquals ("#06", "-2147483648e-04%%%%", Int32.MinValue.ToString ("0000000000e00,,,,%%%%", _nfi)); - } - - [Test] - public void Test08063 () - { - AssertEquals ("#01", "-2147483648E-07%%%%", Int32.MinValue.ToString ("0000000000,E+00,,,,%%%%", _nfi)); - AssertEquals ("#02", "-2147483648e-07%%%%", Int32.MinValue.ToString ("0000000000,e+00,,,,%%%%", _nfi)); - AssertEquals ("#03", "-2147483648E-07%%%%", Int32.MinValue.ToString ("0000000000,E-00,,,,%%%%", _nfi)); - AssertEquals ("#04", "-2147483648e-07%%%%", Int32.MinValue.ToString ("0000000000,e-00,,,,%%%%", _nfi)); - AssertEquals ("#05", "-2147483648E-07%%%%", Int32.MinValue.ToString ("0000000000,E00,,,,%%%%", _nfi)); - AssertEquals ("#06", "-2147483648e-07%%%%", Int32.MinValue.ToString ("0000000000,e00,,,,%%%%", _nfi)); - } - - [Test] - public void Test08064 () - { - AssertEquals ("#01", "-000,000,214,7E+48%%%%", Int32.MinValue.ToString ("0000000000,E,+00,,,,%%%%", _nfi)); - AssertEquals ("#02", "-000,000,214,7e+48%%%%", Int32.MinValue.ToString ("0000000000,e,+00,,,,%%%%", _nfi)); - AssertEquals ("#03", "-000,000,214,7E-48%%%%", Int32.MinValue.ToString ("0000000000,E,-00,,,,%%%%", _nfi)); - AssertEquals ("#04", "-000,000,214,7e-48%%%%", Int32.MinValue.ToString ("0000000000,e,-00,,,,%%%%", _nfi)); - AssertEquals ("#05", "-000,000,214,7E48%%%%", Int32.MinValue.ToString ("0000000000,E,00,,,,%%%%", _nfi)); - AssertEquals ("#06", "-000,000,214,7e48%%%%", Int32.MinValue.ToString ("0000000000,e,00,,,,%%%%", _nfi)); - } - - [Test] - public void Test08065 () - { - AssertEquals ("#01", "-000,000,214,7E+48%%%%", Int32.MinValue.ToString ("0000000000,E+,00,,,,%%%%", _nfi)); - AssertEquals ("#02", "-000,000,214,7e+48%%%%", Int32.MinValue.ToString ("0000000000,e+,00,,,,%%%%", _nfi)); - AssertEquals ("#03", "-000,000,214,7E-48%%%%", Int32.MinValue.ToString ("0000000000,E-,00,,,,%%%%", _nfi)); - AssertEquals ("#04", "-000,000,214,7e-48%%%%", Int32.MinValue.ToString ("0000000000,e-,00,,,,%%%%", _nfi)); - } - - [Test] - public void Test08066 () - { - AssertEquals ("#01", "-21,474,836,48E-50%%%%", Int32.MinValue.ToString ("0000000000,E+0,0,,,,%%%%", _nfi)); - AssertEquals ("#02", "-21,474,836,48e-50%%%%", Int32.MinValue.ToString ("0000000000,e+0,0,,,,%%%%", _nfi)); - AssertEquals ("#03", "-21,474,836,48E-50%%%%", Int32.MinValue.ToString ("0000000000,E-0,0,,,,%%%%", _nfi)); - AssertEquals ("#04", "-21,474,836,48e-50%%%%", Int32.MinValue.ToString ("0000000000,e-0,0,,,,%%%%", _nfi)); - AssertEquals ("#05", "-21,474,836,48E-50%%%%", Int32.MinValue.ToString ("0000000000,E0,0,,,,%%%%", _nfi)); - AssertEquals ("#06", "-21,474,836,48e-50%%%%", Int32.MinValue.ToString ("0000000000,e0,0,,,,%%%%", _nfi)); - } - - [Test] - public void Test08067 () - { - AssertEquals ("#01", "-2147483648E-01,%%%%", Int32.MinValue.ToString (@"0000000000E+00\,,,,%%%%", _nfi)); - AssertEquals ("#02", "-2147483648e-01,%%%%", Int32.MinValue.ToString (@"0000000000e+00\,,,,%%%%", _nfi)); - AssertEquals ("#03", "-2147483648E-01,%%%%", Int32.MinValue.ToString (@"0000000000E-00\,,,,%%%%", _nfi)); - AssertEquals ("#04", "-2147483648e-01,%%%%", Int32.MinValue.ToString (@"0000000000e-00\,,,,%%%%", _nfi)); - AssertEquals ("#05", "-2147483648E-01,%%%%", Int32.MinValue.ToString (@"0000000000E00\,,,,%%%%", _nfi)); - AssertEquals ("#06", "-2147483648e-01,%%%%", Int32.MinValue.ToString (@"0000000000e00\,,,,%%%%", _nfi)); - } - - [Test] - public void Test08068 () - { - AssertEquals ("#01", "-2147483648E+02,,%%%%", Int32.MinValue.ToString (@"0000000000E+00\,,,\,%%%%", _nfi)); - AssertEquals ("#02", "-2147483648e+02,,%%%%", Int32.MinValue.ToString (@"0000000000e+00\,,,\,%%%%", _nfi)); - AssertEquals ("#03", "-2147483648E02,,%%%%", Int32.MinValue.ToString (@"0000000000E-00\,,,\,%%%%", _nfi)); - AssertEquals ("#04", "-2147483648e02,,%%%%", Int32.MinValue.ToString (@"0000000000e-00\,,,\,%%%%", _nfi)); - AssertEquals ("#05", "-2147483648E02,,%%%%", Int32.MinValue.ToString (@"0000000000E00\,,,\,%%%%", _nfi)); - AssertEquals ("#06", "-2147483648e02,,%%%%", Int32.MinValue.ToString (@"0000000000e00\,,,\,%%%%", _nfi)); - } - - [Test] - public void Test08069 () - { - AssertEquals ("#01", "-2147483648E+00,,%%%%", Int32.MinValue.ToString (@"0000000000E+00\,,,\,\%%%%", _nfi)); - AssertEquals ("#02", "-2147483648e+00,,%%%%", Int32.MinValue.ToString (@"0000000000e+00\,,,\,\%%%%", _nfi)); - AssertEquals ("#03", "-2147483648E00,,%%%%", Int32.MinValue.ToString (@"0000000000E-00\,,,\,\%%%%", _nfi)); - AssertEquals ("#04", "-2147483648e00,,%%%%", Int32.MinValue.ToString (@"0000000000e-00\,,,\,\%%%%", _nfi)); - AssertEquals ("#05", "-2147483648E00,,%%%%", Int32.MinValue.ToString (@"0000000000E00\,,,\,\%%%%", _nfi)); - AssertEquals ("#06", "-2147483648e00,,%%%%", Int32.MinValue.ToString (@"0000000000e00\,,,\,\%%%%", _nfi)); - } - - [Test] - public void Test08070 () - { - AssertEquals ("#01", "-2147483648E-02,,%%%%", Int32.MinValue.ToString (@"0000000000E+00\,,,\,\%%%\%", _nfi)); - AssertEquals ("#02", "-2147483648e-02,,%%%%", Int32.MinValue.ToString (@"0000000000e+00\,,,\,\%%%\%", _nfi)); - AssertEquals ("#03", "-2147483648E-02,,%%%%", Int32.MinValue.ToString (@"0000000000E-00\,,,\,\%%%\%", _nfi)); - AssertEquals ("#04", "-2147483648e-02,,%%%%", Int32.MinValue.ToString (@"0000000000e-00\,,,\,\%%%\%", _nfi)); - AssertEquals ("#05", "-2147483648E-02,,%%%%", Int32.MinValue.ToString (@"0000000000E00\,,,\,\%%%\%", _nfi)); - AssertEquals ("#06", "-2147483648e-02,,%%%%", Int32.MinValue.ToString (@"0000000000e00\,,,\,\%%%\%", _nfi)); - } - - [Test] - public void Test08071 () - { - AssertEquals ("#01", @"-2147483648E-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000E+00\\,,,\\,\\%%%\\%", _nfi)); - AssertEquals ("#02", @"-2147483648e-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000e+00\\,,,\\,\\%%%\\%", _nfi)); - AssertEquals ("#03", @"-2147483648E-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000E-00\\,,,\\,\\%%%\\%", _nfi)); - AssertEquals ("#04", @"-2147483648e-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000e-00\\,,,\\,\\%%%\\%", _nfi)); - AssertEquals ("#05", @"-2147483648E-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000E00\\,,,\\,\\%%%\\%", _nfi)); - AssertEquals ("#06", @"-2147483648e-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000e00\\,,,\\,\\%%%\\%", _nfi)); - } - - [Test] - public void Test08072 () - { - AssertEquals ("#01", @"-2147483648E+00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000E+00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#02", @"-2147483648e+00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000e+00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#03", @"-2147483648E00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000E-00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#04", @"-2147483648e00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000e-00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#05", @"-2147483648E00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000E00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#06", @"-2147483648e00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000e00\\,\,,\\\,\\%%%\\\%", _nfi)); - } - - [Test] - public void Test08073 () - { - AssertEquals ("#01", @"-0021474836E+48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\E+00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#02", @"-0021474836e+48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\e+00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#03", @"-0021474836E-48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\E-00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#04", @"-0021474836e-48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\e-00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#05", @"-0021474836E48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\E00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#06", @"-0021474836e48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\e00\\,\,,\\\,\\%%%\\\%", _nfi)); - } - - [Test] - public void Test08074 () - { - AssertEquals ("#01", @"-0021474836E+48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000E\+00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#02", @"-0021474836e+48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000e\+00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#03", @"-0021474836E-48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000E\-00\\,\,,\\\,\\%%%\\\%", _nfi)); - AssertEquals ("#04", @"-0021474836e-48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000e\-00\\,\,,\\\,\\%%%\\\%", _nfi)); - } - - [Test] - public void Test08075 () - { - AssertEquals ("#01", "-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E+00,,,',%'%%%", _nfi)); - AssertEquals ("#02", "-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e+00,,,',%'%%%", _nfi)); - AssertEquals ("#03", "-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E-00,,,',%'%%%", _nfi)); - AssertEquals ("#04", "-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e-00,,,',%'%%%", _nfi)); - AssertEquals ("#05", "-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E00,,,',%'%%%", _nfi)); - AssertEquals ("#06", "-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e00,,,',%'%%%", _nfi)); - } - - [Test] - public void Test08076 () - { - AssertEquals ("#01", "-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E+00,,,\",%\"%%%", _nfi)); - AssertEquals ("#02", "-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e+00,,,\",%\"%%%", _nfi)); - AssertEquals ("#03", "-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E-00,,,\",%\"%%%", _nfi)); - AssertEquals ("#04", "-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e-00,,,\",%\"%%%", _nfi)); - AssertEquals ("#05", "-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E00,,,\",%\"%%%", _nfi)); - AssertEquals ("#06", "-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e00,,,\",%\"%%%", _nfi)); - } - - [Test] - public void Test08077 () - { - AssertEquals ("#01", "-", Int32.MinValue.ToString (";", _nfi)); - AssertEquals ("#02", "", Int32.MaxValue.ToString (";", _nfi)); - AssertEquals ("#03", "",0.ToString (";", _nfi)); - } - - [Test] - public void Test08078 () - { - AssertEquals ("#01", "-2,147,483,648", Int32.MinValue.ToString ("#,#;", _nfi)); - AssertEquals ("#02", "2,147,483,647", Int32.MaxValue.ToString ("#,#;", _nfi)); - AssertEquals ("#03", "", 0.ToString ("#,#;", _nfi)); - } - - [Test] - public void Test08079 () - { - AssertEquals ("#01", "2,147,483,648", Int32.MinValue.ToString (";#,#", _nfi)); - AssertEquals ("#02", "", Int32.MaxValue.ToString (";#,#", _nfi)); - AssertEquals ("#03", "", 0.ToString (";#,#", _nfi)); - } - - [Test] - public void Test08080 () - { - AssertEquals ("#01", "2,147,483,648", Int32.MinValue.ToString ("0000000000,.0000000000;#,#", _nfi)); - AssertEquals ("#02", "0002147483.6470000000", Int32.MaxValue.ToString ("0000000000,.0000000000;#,#", _nfi)); - AssertEquals ("#03", "0000000000.0000000000", 0.ToString ("0000000000,.0000000000;#,#", _nfi)); - } - - [Test] - public void Test08081 () - { - AssertEquals ("#01", "-", Int32.MinValue.ToString (";;", _nfi)); - AssertEquals ("#02", "", Int32.MaxValue.ToString (";;", _nfi)); - AssertEquals ("#03", "",0.ToString (";;", _nfi)); - } - - [Test] - public void Test08082 () - { - AssertEquals ("#01", "-", Int32.MinValue.ToString (";;0%", _nfi)); - AssertEquals ("#02", "", Int32.MaxValue.ToString (";;0%", _nfi)); - AssertEquals ("#03", "0%",0.ToString (";;0%", _nfi)); - } - - [Test] - public void Test08083 () - { - AssertEquals ("#01", "2147484", Int32.MinValue.ToString (";0,;0%", _nfi)); - AssertEquals ("#02", "", Int32.MaxValue.ToString (";0,;0%", _nfi)); - AssertEquals ("#03", "0%",0.ToString (";0,;0%", _nfi)); - } - - [Test] - public void Test08084 () - { - AssertEquals ("#01", "2147484", Int32.MinValue.ToString ("0E+0;0,;0%", _nfi)); - AssertEquals ("#02", "2E+9", Int32.MaxValue.ToString ("0E+0;0,;0%", _nfi)); - AssertEquals ("#03", "0%",0.ToString ("0E+0;0,;0%", _nfi)); - } - - [Test] - public void Test08085 () - { - AssertEquals ("#01", "214,748,364,80;0%", Int32.MinValue.ToString (@"0E+0;0,\;0%", _nfi)); - AssertEquals ("#02", "2E+9", Int32.MaxValue.ToString (@"0E+0;0,\;0%", _nfi)); - AssertEquals ("#03", "0E+0",0.ToString (@"0E+0;0,\;0%", _nfi)); - } - - [Test] - public void Test08086 () - { - AssertEquals ("#01", "214,748,364,80;0%", Int32.MinValue.ToString ("0E+0;0,\";\"0%", _nfi)); - AssertEquals ("#02", "2E+9", Int32.MaxValue.ToString ("0E+0;0,\";\"0%", _nfi)); - AssertEquals ("#03", "0E+0",0.ToString ("0E+0;0,\";\"0%", _nfi)); - } - - [Test] - public void Test08087 () - { - // MS.NET bug? - NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo.Clone() as NumberFormatInfo; - nfi.NumberDecimalSeparator = "$$$"; - AssertEquals ("#01", "-0000000000$$$2147483648", Int32.MinValue.ToString ("0000000000$$$0000000000", nfi)); - } - - [Test] - public void Test08088 () - { - // MS.NET bug? - NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo.Clone() as NumberFormatInfo; - nfi.NumberGroupSeparator = "$$$"; - AssertEquals ("#01", "-0000000000$$$2147483648", Int32.MinValue.ToString ("0000000000$$$0000000000", nfi)); - } - - [Test] - public void Test08089 () - { - NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo.Clone() as NumberFormatInfo; - nfi.NumberGroupSizes = new int[] {3,2,1,0}; - AssertEquals ("#01", "-00000000002147,4,83,648", Int32.MinValue.ToString ("0000000000,0000000000", nfi)); - } - - [Test] - public void Test08090 () - { - // MS.NET bug? - NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo.Clone() as NumberFormatInfo; - nfi.PercentSymbol = "$$$"; - AssertEquals ("#01", "-0000000000$$$2147483648", Int32.MinValue.ToString ("0000000000$$$0000000000", nfi)); - } - - [Test] - public void Test08091 () - { - // MS.NET bug? - AssertEquals ("#01", "B2147", Int32.MinValue.ToString ("A0,;B0,,;C0,,,;D0,,,,;E0,,,,,", _nfi)); - AssertEquals ("#02", "A2147484", Int32.MaxValue.ToString ("A0,;B0,,;C0,,,;D0,,,,;E0,,,,,", _nfi)); - AssertEquals ("#03", "C0", 0.ToString ("A0,;B0,,;C0,,,;D0,,,,;E0,,,,,", _nfi)); - } - - // Test10000- Double and D - [Test] - [ExpectedException (typeof (FormatException))] - public void Test10000 () - { - AssertEquals ("#01", "0", 0.0.ToString ("D", _nfi)); - } - - // Test11000- Double and E - [Test] - public void Test11000 () - { - AssertEquals ("#01", "0.000000E+000", 0.0.ToString ("E", _nfi)); - AssertEquals ("#02", "0.000000e+000", 0.0.ToString ("e", _nfi)); - AssertEquals ("#03", "-1.797693E+308", Double.MinValue.ToString ("E", _nfi)); - AssertEquals ("#04", "-1.797693e+308", Double.MinValue.ToString ("e", _nfi)); - AssertEquals ("#05", "1.797693E+308", Double.MaxValue.ToString ("E", _nfi)); - AssertEquals ("#06", "1.797693e+308", Double.MaxValue.ToString ("e", _nfi)); - } - - [Test] - public void Test11001 () - { - AssertEquals ("#01", "E ", 0.0.ToString ("E ", _nfi)); - AssertEquals ("#02", " E", 0.0.ToString (" E", _nfi)); - AssertEquals ("#03", " E ", 0.0.ToString (" E ", _nfi)); - } - - [Test] - public void Test11002 () - { - AssertEquals ("#01", "-E ", (-1.0).ToString ("E ", _nfi)); - AssertEquals ("#02", "- E", (-1.0).ToString (" E", _nfi)); - AssertEquals ("#03", "- E ", (-1.0).ToString (" E ", _nfi)); - } - - [Test] - public void Test11003 () - { - AssertEquals ("#01", "0E+000", 0.0.ToString ("E0", _nfi)); - AssertEquals ("#02", "0.0000000000000000E+000", 0.0.ToString ("E16", _nfi)); - AssertEquals ("#03", "0.00000000000000000E+000", 0.0.ToString ("E17", _nfi)); - AssertEquals ("#04", "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E+000", 0.0.ToString ("E99", _nfi)); - AssertEquals ("#05", "E100", 0.0.ToString ("E100", _nfi)); - } - - [Test] - public void Test11004 () - { - AssertEquals ("#01", "2E+308", Double.MaxValue.ToString ("E0", _nfi)); - AssertEquals ("#02", "1.7976931348623157E+308", Double.MaxValue.ToString ("E16", _nfi)); - AssertEquals ("#03", "1.79769313486231570E+308", Double.MaxValue.ToString ("E17", _nfi)); - AssertEquals ("#04", "1.797693134862315700000000000000000000000000000000000000000000000000000000000000000000000000000000000E+308", Double.MaxValue.ToString ("E99", _nfi)); - AssertEquals ("#05", "E1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("E100", _nfi)); - } - - [Test] - public void Test11005 () - { - AssertEquals ("#01", "-2E+308", Double.MinValue.ToString ("E0", _nfi)); - AssertEquals ("#02", "-1.7976931348623157E+308", Double.MinValue.ToString ("E16", _nfi)); - AssertEquals ("#03", "-1.79769313486231570E+308", Double.MinValue.ToString ("E17", _nfi)); - AssertEquals ("#04", "-1.797693134862315700000000000000000000000000000000000000000000000000000000000000000000000000000000000E+308", Double.MinValue.ToString ("E99", _nfi)); - AssertEquals ("#05", "-E1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("E100", _nfi)); - } - - [Test] - public void Test11006 () - { - AssertEquals ("#01", "EF", 0.0.ToString ("EF", _nfi)); - AssertEquals ("#02", "E0F", 0.0.ToString ("E0F", _nfi)); - AssertEquals ("#03", "E0xF", 0.0.ToString ("E0xF", _nfi)); - } - - [Test] - public void Test11007 () - { - AssertEquals ("#01", "EF", Double.MaxValue.ToString ("EF", _nfi)); - AssertEquals ("#02", "E0F", Double.MaxValue.ToString ("E0F", _nfi)); - AssertEquals ("#03", "E0xF", Double.MaxValue.ToString ("E0xF", _nfi)); - } - - [Test] - public void Test11008 () - { - AssertEquals ("#01", "-EF", Double.MinValue.ToString ("EF", _nfi)); - AssertEquals ("#02", "E0F", Double.MinValue.ToString ("E0F", _nfi)); - AssertEquals ("#03", "E0xF", Double.MinValue.ToString ("E0xF", _nfi)); - } - - [Test] - public void Test11009 () - { - AssertEquals ("#01", "0.00000000000000000E+000", 0.0.ToString ("E0000000000000000000000000000000000000017", _nfi)); - AssertEquals ("#02", "1.79769313486231570E+308", Double.MaxValue.ToString ("E0000000000000000000000000000000000000017", _nfi)); - AssertEquals ("#03", "-1.79769313486231570E+308", Double.MinValue.ToString ("E0000000000000000000000000000000000000017", _nfi)); - } - - [Test] - public void Test11010 () - { - AssertEquals ("#01", "+E", 0.0.ToString ("+E", _nfi)); - AssertEquals ("#02", "E+", 0.0.ToString ("E+", _nfi)); - AssertEquals ("#03", "+E+", 0.0.ToString ("+E+", _nfi)); - } - - [Test] - public void Test11011 () - { - AssertEquals ("#01", "+E", Double.MaxValue.ToString ("+E", _nfi)); - AssertEquals ("#02", "E+", Double.MaxValue.ToString ("E+", _nfi)); - AssertEquals ("#03", "+E+", Double.MaxValue.ToString ("+E+", _nfi)); - } - - [Test] - public void Test11012 () - { - AssertEquals ("#01", "-+E", Double.MinValue.ToString ("+E", _nfi)); - AssertEquals ("#02", "-E+", Double.MinValue.ToString ("E+", _nfi)); - AssertEquals ("#03", "-+E+", Double.MinValue.ToString ("+E+", _nfi)); - } - - [Test] - public void Test11013 () - { - AssertEquals ("#01", "-E", 0.0.ToString ("-E", _nfi)); - AssertEquals ("#02", "E-", 0.0.ToString ("E-", _nfi)); - AssertEquals ("#03", "-E-", 0.0.ToString ("-E-", _nfi)); - } - - [Test] - public void Test11014 () - { - AssertEquals ("#01", "-E", Double.MaxValue.ToString ("-E", _nfi)); - AssertEquals ("#02", "E-", Double.MaxValue.ToString ("E-", _nfi)); - AssertEquals ("#03", "-E-", Double.MaxValue.ToString ("-E-", _nfi)); - } - - [Test] - public void Test11015 () - { - AssertEquals ("#01", "--E", Double.MinValue.ToString ("-E", _nfi)); - AssertEquals ("#02", "-E-", Double.MinValue.ToString ("E-", _nfi)); - AssertEquals ("#03", "--E-", Double.MinValue.ToString ("-E-", _nfi)); - } - - [Test] - public void Test11016 () - { - AssertEquals ("#01", "E+0", 0.0.ToString ("E+0", _nfi)); - AssertEquals ("#02", "E+0", Double.MaxValue.ToString ("E+0", _nfi)); - AssertEquals ("#03", "E+0", Double.MinValue.ToString ("E+0", _nfi)); - } - - [Test] - public void Test11017 () - { - AssertEquals ("#01", "E+9", 0.0.ToString ("E+9", _nfi)); - AssertEquals ("#02", "E+9", Double.MaxValue.ToString ("E+9", _nfi)); - AssertEquals ("#03", "-E+9", Double.MinValue.ToString ("E+9", _nfi)); - } - - [Test] - public void Test11018 () - { - AssertEquals ("#01", "E-9", 0.0.ToString ("E-9", _nfi)); - AssertEquals ("#02", "E-9", Double.MaxValue.ToString ("E-9", _nfi)); - AssertEquals ("#03", "-E-9", Double.MinValue.ToString ("E-9", _nfi)); - } - - [Test] - public void Test11019 () - { - AssertEquals ("#01", "E0", 0.0.ToString ("E0,", _nfi)); - AssertEquals ("#02", "E0", Double.MaxValue.ToString ("E0,", _nfi)); - AssertEquals ("#03", "E0", Double.MinValue.ToString ("E0,", _nfi)); - } - - [Test] - public void Test11020 () - { - AssertEquals ("#01", "E0", 0.0.ToString ("E0.", _nfi)); - AssertEquals ("#02", "E0", Double.MaxValue.ToString ("E0.", _nfi)); - AssertEquals ("#03", "E0", Double.MinValue.ToString ("E0.", _nfi)); - } - - [Test] - public void Test11021 () - { - AssertEquals ("#01", "E0.0", 0.0.ToString ("E0.0", _nfi)); - AssertEquals ("#02", "E309.2", Double.MaxValue.ToString ("E0.0", _nfi)); - AssertEquals ("#03", "-E309.2", Double.MinValue.ToString ("E0.0", _nfi)); - } - - [Test] - public void Test11022 () - { - AssertEquals ("#01", "E09", 0.0.ToString ("E0.9", _nfi)); - AssertEquals ("#02", "E09", Double.MaxValue.ToString ("E0.9", _nfi)); - AssertEquals ("#03", "E09", Double.MinValue.ToString ("E0.9", _nfi)); - } - - [Test] - public void Test11023 () - { - AssertEquals ("#01", "1.1E+000", 1.05.ToString ("E1", _nfi)); - AssertEquals ("#02", "1.2E+000", 1.15.ToString ("E1", _nfi)); - AssertEquals ("#03", "1.3E+000", 1.25.ToString ("E1", _nfi)); - AssertEquals ("#04", "1.4E+000", 1.35.ToString ("E1", _nfi)); - AssertEquals ("#05", "1.5E+000", 1.45.ToString ("E1", _nfi)); - AssertEquals ("#06", "1.6E+000", 1.55.ToString ("E1", _nfi)); - AssertEquals ("#07", "1.7E+000", 1.65.ToString ("E1", _nfi)); - AssertEquals ("#08", "1.8E+000", 1.75.ToString ("E1", _nfi)); - AssertEquals ("#09", "1.9E+000", 1.85.ToString ("E1", _nfi)); - AssertEquals ("#10", "2.0E+000", 1.95.ToString ("E1", _nfi)); - } - - [Test] - public void Test11024 () - { - AssertEquals ("#01", "1.01E+000", 1.005.ToString ("E2", _nfi)); - AssertEquals ("#02", "1.02E+000", 1.015.ToString ("E2", _nfi)); - AssertEquals ("#03", "1.03E+000", 1.025.ToString ("E2", _nfi)); - AssertEquals ("#04", "1.04E+000", 1.035.ToString ("E2", _nfi)); - AssertEquals ("#05", "1.05E+000", 1.045.ToString ("E2", _nfi)); - AssertEquals ("#06", "1.06E+000", 1.055.ToString ("E2", _nfi)); - AssertEquals ("#07", "1.07E+000", 1.065.ToString ("E2", _nfi)); - AssertEquals ("#08", "1.08E+000", 1.075.ToString ("E2", _nfi)); - AssertEquals ("#09", "1.09E+000", 1.085.ToString ("E2", _nfi)); - AssertEquals ("#10", "1.10E+000", 1.095.ToString ("E2", _nfi)); - } - - [Test] - public void Test11025 () - { - AssertEquals ("#01", "1.00000000000001E+000", 1.000000000000005.ToString ("E14", _nfi)); - AssertEquals ("#02", "1.00000000000002E+000", 1.000000000000015.ToString ("E14", _nfi)); - AssertEquals ("#03", "1.00000000000003E+000", 1.000000000000025.ToString ("E14", _nfi)); - AssertEquals ("#04", "1.00000000000004E+000", 1.000000000000035.ToString ("E14", _nfi)); - AssertEquals ("#05", "1.00000000000005E+000", 1.000000000000045.ToString ("E14", _nfi)); - AssertEquals ("#06", "1.00000000000006E+000", 1.000000000000055.ToString ("E14", _nfi)); - AssertEquals ("#07", "1.00000000000007E+000", 1.000000000000065.ToString ("E14", _nfi)); - AssertEquals ("#08", "1.00000000000008E+000", 1.000000000000075.ToString ("E14", _nfi)); - AssertEquals ("#09", "1.00000000000009E+000", 1.000000000000085.ToString ("E14", _nfi)); - AssertEquals ("#10", "1.00000000000010E+000", 1.000000000000095.ToString ("E14", _nfi)); - } - - [Test] - public void Test11026 () - { - AssertEquals ("#01", "1.000000000000000E+000", 1.0000000000000005.ToString ("E15", _nfi)); - AssertEquals ("#02", "1.000000000000002E+000", 1.0000000000000015.ToString ("E15", _nfi)); - AssertEquals ("#03", "1.000000000000002E+000", 1.0000000000000025.ToString ("E15", _nfi)); - AssertEquals ("#04", "1.000000000000004E+000", 1.0000000000000035.ToString ("E15", _nfi)); - AssertEquals ("#05", "1.000000000000004E+000", 1.0000000000000045.ToString ("E15", _nfi)); - AssertEquals ("#06", "1.000000000000006E+000", 1.0000000000000055.ToString ("E15", _nfi)); - AssertEquals ("#07", "1.000000000000006E+000", 1.0000000000000065.ToString ("E15", _nfi)); - AssertEquals ("#08", "1.000000000000008E+000", 1.0000000000000075.ToString ("E15", _nfi)); - AssertEquals ("#09", "1.000000000000008E+000", 1.0000000000000085.ToString ("E15", _nfi)); - AssertEquals ("#10", "1.000000000000010E+000", 1.0000000000000095.ToString ("E15", _nfi)); - } - - [Test] - public void Test11027 () - { - AssertEquals ("#01", "1.0000000000000000E+000", 1.00000000000000005.ToString ("E16", _nfi)); - AssertEquals ("#02", "1.0000000000000002E+000", 1.00000000000000015.ToString ("E16", _nfi)); - AssertEquals ("#03", "1.0000000000000002E+000", 1.00000000000000025.ToString ("E16", _nfi)); - AssertEquals ("#04", "1.0000000000000004E+000", 1.00000000000000035.ToString ("E16", _nfi)); - AssertEquals ("#05", "1.0000000000000004E+000", 1.00000000000000045.ToString ("E16", _nfi)); - AssertEquals ("#06", "1.0000000000000004E+000", 1.00000000000000055.ToString ("E16", _nfi)); - AssertEquals ("#07", "1.0000000000000007E+000", 1.00000000000000065.ToString ("E16", _nfi)); - AssertEquals ("#08", "1.0000000000000007E+000", 1.00000000000000075.ToString ("E16", _nfi)); - AssertEquals ("#09", "1.0000000000000009E+000", 1.00000000000000085.ToString ("E16", _nfi)); - AssertEquals ("#10", "1.0000000000000009E+000", 1.00000000000000095.ToString ("E16", _nfi)); - } - - [Test] - public void Test11028 () - { - AssertEquals ("#01", "1.00000000000000000E+000", 1.000000000000000005.ToString ("E17", _nfi)); - AssertEquals ("#02", "1.00000000000000000E+000", 1.000000000000000015.ToString ("E17", _nfi)); - AssertEquals ("#03", "1.00000000000000000E+000", 1.000000000000000025.ToString ("E17", _nfi)); - AssertEquals ("#04", "1.00000000000000000E+000", 1.000000000000000035.ToString ("E17", _nfi)); - AssertEquals ("#05", "1.00000000000000000E+000", 1.000000000000000045.ToString ("E17", _nfi)); - AssertEquals ("#06", "1.00000000000000000E+000", 1.000000000000000055.ToString ("E17", _nfi)); - AssertEquals ("#07", "1.00000000000000000E+000", 1.000000000000000065.ToString ("E17", _nfi)); - AssertEquals ("#08", "1.00000000000000000E+000", 1.000000000000000075.ToString ("E17", _nfi)); - AssertEquals ("#09", "1.00000000000000000E+000", 1.000000000000000085.ToString ("E17", _nfi)); - AssertEquals ("#10", "1.00000000000000000E+000", 1.000000000000000095.ToString ("E17", _nfi)); - } - - [Test] - public void Test11029 () - { - AssertEquals ("#01", "1E+000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("E0")); - AssertEquals ("#02", "1.2345678901234567E+000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("E16")); - AssertEquals ("#03", "1.23456789012345670E+000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("E17")); - AssertEquals ("#04", "1.234567890123456700000000000000000000000000000000000000000000000000000000000000000000000000000000000E+000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("E99")); - AssertEquals ("#04", "E101", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("E100")); - } - - [Test] - public void Test11030 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberDecimalSeparator = "#"; - AssertEquals ("#01", "-1#000000E+008", (-99999999.9).ToString ("E", nfi)); - } - - [Test] - public void Test11031 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "+"; - nfi.PositiveSign = "-"; - - AssertEquals ("#01", "1.000000E-000", 1.0.ToString ("E", nfi)); - AssertEquals ("#02", "0.000000E-000", 0.0.ToString ("E", nfi)); - AssertEquals ("#03", "+1.000000E-000", (-1.0).ToString ("E", nfi)); - } - - [Test] - public void TestNaNToString () - { - AssertEquals ("#01", "Infinity", Double.PositiveInfinity.ToString()); - AssertEquals ("#02", "-Infinity", Double.NegativeInfinity.ToString()); - AssertEquals ("#03", "NaN", Double.NaN.ToString()); - AssertEquals ("#04", "Infinity", Single.PositiveInfinity.ToString()); - AssertEquals ("#05", "-Infinity", Single.NegativeInfinity.ToString()); - AssertEquals ("#06", "NaN", Single.NaN.ToString()); - - AssertEquals ("#07", "Infinity", Double.PositiveInfinity.ToString("R")); - AssertEquals ("#08", "-Infinity", Double.NegativeInfinity.ToString("R")); - AssertEquals ("#09", "NaN", Double.NaN.ToString("R")); - AssertEquals ("#10", "Infinity", Single.PositiveInfinity.ToString("R")); - AssertEquals ("#11", "-Infinity", Single.NegativeInfinity.ToString("R")); - AssertEquals ("#12", "NaN", Single.NaN.ToString("R")); - } - - [Test] - public void Test11032 () - { - AssertEquals ("#01", "Infinity", (Double.MaxValue / 0.0).ToString ("E99", _nfi)); - AssertEquals ("#02", "-Infinity", (Double.MinValue / 0.0).ToString ("E99", _nfi)); - AssertEquals ("#03", "NaN", (0.0 / 0.0).ToString ("E99", _nfi)); - } - - // Test12000- Double and F - [Test] - public void Test12000 () - { - AssertEquals ("#01", "0.00", 0.0.ToString ("F", _nfi)); - AssertEquals ("#02", "0.00", 0.0.ToString ("f", _nfi)); - AssertEquals ("#03", "-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00", Double.MinValue.ToString ("F", _nfi)); - AssertEquals ("#04", "-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00", Double.MinValue.ToString ("f", _nfi)); - AssertEquals ("#05", "179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00", Double.MaxValue.ToString ("F", _nfi)); - AssertEquals ("#06", "179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00", Double.MaxValue.ToString ("f", _nfi)); - } - - [Test] - public void Test12001 () - { - AssertEquals ("#01", "F ", 0.0.ToString ("F ", _nfi)); - AssertEquals ("#02", " F", 0.0.ToString (" F", _nfi)); - AssertEquals ("#03", " F ", 0.0.ToString (" F ", _nfi)); - } - - [Test] - public void Test12002 () - { - AssertEquals ("#01", "-F ", (-1.0).ToString ("F ", _nfi)); - AssertEquals ("#02", "- F", (-1.0).ToString (" F", _nfi)); - AssertEquals ("#03", "- F ", (-1.0).ToString (" F ", _nfi)); - } - - [Test] - public void Test12003 () - { - AssertEquals ("#01", "0", 0.0.ToString ("F0", _nfi)); - AssertEquals ("#02", "0.0000000000000000", 0.0.ToString ("F16", _nfi)); - AssertEquals ("#03", "0.00000000000000000", 0.0.ToString ("F17", _nfi)); - AssertEquals ("#04", "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.0.ToString ("F99", _nfi)); - AssertEquals ("#05", "F100", 0.0.ToString ("F100", _nfi)); - } - - [Test] - public void Test12004 () - { - AssertEquals ("#01", "179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F0", _nfi)); - AssertEquals ("#02", "179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000000000000000", Double.MaxValue.ToString ("F16", _nfi)); - AssertEquals ("#03", "179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000", Double.MaxValue.ToString ("F17", _nfi)); - AssertEquals ("#04", "179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F99", _nfi)); - AssertEquals ("#05", "F1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F100", _nfi)); - } - - [Test] - public void Test12005 () - { - AssertEquals ("#01", "-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F0", _nfi)); - AssertEquals ("#02", "-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000000000000000", Double.MinValue.ToString ("F16", _nfi)); - AssertEquals ("#03", "-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000", Double.MinValue.ToString ("F17", _nfi)); - AssertEquals ("#04", "-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F99", _nfi)); - AssertEquals ("#05", "-F1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F100", _nfi)); - } - - [Test] - public void Test12006 () - { - AssertEquals ("#01", "FF", 0.0.ToString ("FF", _nfi)); - AssertEquals ("#02", "F0F", 0.0.ToString ("F0F", _nfi)); - AssertEquals ("#03", "F0xF", 0.0.ToString ("F0xF", _nfi)); - } - - [Test] - public void Test12007 () - { - AssertEquals ("#01", "FF", Double.MaxValue.ToString ("FF", _nfi)); - AssertEquals ("#02", "F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MaxValue.ToString ("F0F", _nfi)); - AssertEquals ("#03", "F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MaxValue.ToString ("F0xF", _nfi)); - } - - [Test] - public void Test12008 () - { - AssertEquals ("#01", "-FF", Double.MinValue.ToString ("FF", _nfi)); - AssertEquals ("#02", "-F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MinValue.ToString ("F0F", _nfi)); - AssertEquals ("#03", "-F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MinValue.ToString ("F0xF", _nfi)); - } - - [Test] - public void Test12009 () - { - AssertEquals ("#01", "0.00000000000000000", 0.0.ToString ("F0000000000000000000000000000000000000017", _nfi)); - AssertEquals ("#02", "179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000", Double.MaxValue.ToString ("F0000000000000000000000000000000000000017", _nfi)); - AssertEquals ("#03", "-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000", Double.MinValue.ToString ("F0000000000000000000000000000000000000017", _nfi)); - } - - [Test] - public void Test12010 () - { - AssertEquals ("#01", "+F", 0.0.ToString ("+F", _nfi)); - AssertEquals ("#02", "F+", 0.0.ToString ("F+", _nfi)); - AssertEquals ("#03", "+F+", 0.0.ToString ("+F+", _nfi)); - } - - [Test] - public void Test12011 () - { - AssertEquals ("#01", "+F", Double.MaxValue.ToString ("+F", _nfi)); - AssertEquals ("#02", "F+", Double.MaxValue.ToString ("F+", _nfi)); - AssertEquals ("#03", "+F+", Double.MaxValue.ToString ("+F+", _nfi)); - } - - [Test] - public void Test12012 () - { - AssertEquals ("#01", "-+F", Double.MinValue.ToString ("+F", _nfi)); - AssertEquals ("#02", "-F+", Double.MinValue.ToString ("F+", _nfi)); - AssertEquals ("#03", "-+F+", Double.MinValue.ToString ("+F+", _nfi)); - } - - [Test] - public void Test12013 () - { - AssertEquals ("#01", "-F", 0.0.ToString ("-F", _nfi)); - AssertEquals ("#02", "F-", 0.0.ToString ("F-", _nfi)); - AssertEquals ("#03", "-F-", 0.0.ToString ("-F-", _nfi)); - } - - [Test] - public void Test12014 () - { - AssertEquals ("#01", "-F", Double.MaxValue.ToString ("-F", _nfi)); - AssertEquals ("#02", "F-", Double.MaxValue.ToString ("F-", _nfi)); - AssertEquals ("#03", "-F-", Double.MaxValue.ToString ("-F-", _nfi)); - } - - [Test] - public void Test12015 () - { - AssertEquals ("#01", "--F", Double.MinValue.ToString ("-F", _nfi)); - AssertEquals ("#02", "-F-", Double.MinValue.ToString ("F-", _nfi)); - AssertEquals ("#03", "--F-", Double.MinValue.ToString ("-F-", _nfi)); - } - - [Test] - public void Test12016 () - { - AssertEquals ("#01", "F+0", 0.0.ToString ("F+0", _nfi)); - AssertEquals ("#02", "F+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F+0", _nfi)); - AssertEquals ("#03", "-F+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F+0", _nfi)); - } - - [Test] - public void Test12017 () - { - AssertEquals ("#01", "F+9", 0.0.ToString ("F+9", _nfi)); - AssertEquals ("#02", "F+9", Double.MaxValue.ToString ("F+9", _nfi)); - AssertEquals ("#03", "-F+9", Double.MinValue.ToString ("F+9", _nfi)); - } - - [Test] - public void Test12018 () - { - AssertEquals ("#01", "F-9", 0.0.ToString ("F-9", _nfi)); - AssertEquals ("#02", "F-9", Double.MaxValue.ToString ("F-9", _nfi)); - AssertEquals ("#03", "-F-9", Double.MinValue.ToString ("F-9", _nfi)); - } - - [Test] - public void Test12019 () - { - AssertEquals ("#01", "F0", 0.0.ToString ("F0,", _nfi)); - AssertEquals ("#02", "F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F0,", _nfi)); - AssertEquals ("#03", "-F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F0,", _nfi)); - } - - [Test] - public void Test12020 () - { - AssertEquals ("#01", "F0", 0.0.ToString ("F0.", _nfi)); - AssertEquals ("#02", "F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F0.", _nfi)); - AssertEquals ("#03", "-F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F0.", _nfi)); - } - - [Test] - public void Test12021 () - { - AssertEquals ("#01", "F0.0", 0.0.ToString ("F0.0", _nfi)); - AssertEquals ("#02", "F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MaxValue.ToString ("F0.0", _nfi)); - AssertEquals ("#03", "-F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MinValue.ToString ("F0.0", _nfi)); - } - - [Test] - public void Test12022 () - { - AssertEquals ("#01", "F09", 0.0.ToString ("F0.9", _nfi)); - AssertEquals ("#02", "F1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MaxValue.ToString ("F0.9", _nfi)); - AssertEquals ("#03", "-F1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MinValue.ToString ("F0.9", _nfi)); - } - - [Test] - public void Test12023 () - { - AssertEquals ("#01", "1.1", 1.05.ToString ("F1", _nfi)); - AssertEquals ("#02", "1.2", 1.15.ToString ("F1", _nfi)); - AssertEquals ("#03", "1.3", 1.25.ToString ("F1", _nfi)); - AssertEquals ("#04", "1.4", 1.35.ToString ("F1", _nfi)); - AssertEquals ("#05", "1.5", 1.45.ToString ("F1", _nfi)); - AssertEquals ("#06", "1.6", 1.55.ToString ("F1", _nfi)); - AssertEquals ("#07", "1.7", 1.65.ToString ("F1", _nfi)); - AssertEquals ("#08", "1.8", 1.75.ToString ("F1", _nfi)); - AssertEquals ("#09", "1.9", 1.85.ToString ("F1", _nfi)); - AssertEquals ("#10", "2.0", 1.95.ToString ("F1", _nfi)); - } - - [Test] - public void Test12024 () - { - AssertEquals ("#01", "1.01", 1.005.ToString ("F2", _nfi)); - AssertEquals ("#02", "1.02", 1.015.ToString ("F2", _nfi)); - AssertEquals ("#03", "1.03", 1.025.ToString ("F2", _nfi)); - AssertEquals ("#04", "1.04", 1.035.ToString ("F2", _nfi)); - AssertEquals ("#05", "1.05", 1.045.ToString ("F2", _nfi)); - AssertEquals ("#06", "1.06", 1.055.ToString ("F2", _nfi)); - AssertEquals ("#07", "1.07", 1.065.ToString ("F2", _nfi)); - AssertEquals ("#08", "1.08", 1.075.ToString ("F2", _nfi)); - AssertEquals ("#09", "1.09", 1.085.ToString ("F2", _nfi)); - AssertEquals ("#10", "1.10", 1.095.ToString ("F2", _nfi)); - } - - [Test] - public void Test12025 () - { - AssertEquals ("#01", "1.00000000000001", 1.000000000000005.ToString ("F14", _nfi)); - AssertEquals ("#02", "1.00000000000002", 1.000000000000015.ToString ("F14", _nfi)); - AssertEquals ("#03", "1.00000000000003", 1.000000000000025.ToString ("F14", _nfi)); - AssertEquals ("#04", "1.00000000000004", 1.000000000000035.ToString ("F14", _nfi)); - AssertEquals ("#05", "1.00000000000005", 1.000000000000045.ToString ("F14", _nfi)); - AssertEquals ("#06", "1.00000000000006", 1.000000000000055.ToString ("F14", _nfi)); - AssertEquals ("#07", "1.00000000000007", 1.000000000000065.ToString ("F14", _nfi)); - AssertEquals ("#08", "1.00000000000008", 1.000000000000075.ToString ("F14", _nfi)); - AssertEquals ("#09", "1.00000000000009", 1.000000000000085.ToString ("F14", _nfi)); - AssertEquals ("#10", "1.00000000000010", 1.000000000000095.ToString ("F14", _nfi)); - } - - [Test] - public void Test12026 () - { - AssertEquals ("#01", "1.000000000000000", 1.0000000000000005.ToString ("F15", _nfi)); - AssertEquals ("#02", "1.000000000000000", 1.0000000000000015.ToString ("F15", _nfi)); - AssertEquals ("#03", "1.000000000000000", 1.0000000000000025.ToString ("F15", _nfi)); - AssertEquals ("#04", "1.000000000000000", 1.0000000000000035.ToString ("F15", _nfi)); - AssertEquals ("#05", "1.000000000000000", 1.0000000000000045.ToString ("F15", _nfi)); - AssertEquals ("#06", "1.000000000000010", 1.0000000000000055.ToString ("F15", _nfi)); - AssertEquals ("#07", "1.000000000000010", 1.0000000000000065.ToString ("F15", _nfi)); - AssertEquals ("#08", "1.000000000000010", 1.0000000000000075.ToString ("F15", _nfi)); - AssertEquals ("#09", "1.000000000000010", 1.0000000000000085.ToString ("F15", _nfi)); - AssertEquals ("#10", "1.000000000000010", 1.0000000000000095.ToString ("F15", _nfi)); - } - - [Test] - public void Test12027 () - { - AssertEquals ("#01", "1.0000000000000000", 1.00000000000000005.ToString ("F16", _nfi)); - AssertEquals ("#02", "1.0000000000000000", 1.00000000000000015.ToString ("F16", _nfi)); - AssertEquals ("#03", "1.0000000000000000", 1.00000000000000025.ToString ("F16", _nfi)); - AssertEquals ("#04", "1.0000000000000000", 1.00000000000000035.ToString ("F16", _nfi)); - AssertEquals ("#05", "1.0000000000000000", 1.00000000000000045.ToString ("F16", _nfi)); - AssertEquals ("#06", "1.0000000000000000", 1.00000000000000055.ToString ("F16", _nfi)); - AssertEquals ("#07", "1.0000000000000000", 1.00000000000000065.ToString ("F16", _nfi)); - AssertEquals ("#08", "1.0000000000000000", 1.00000000000000075.ToString ("F16", _nfi)); - AssertEquals ("#09", "1.0000000000000000", 1.00000000000000085.ToString ("F16", _nfi)); - AssertEquals ("#10", "1.0000000000000000", 1.00000000000000095.ToString ("F16", _nfi)); - } - - [Test] - public void Test12028 () - { - AssertEquals ("#01", "1", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F0", _nfi)); - AssertEquals ("#02", "1.234567890123", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F12", _nfi)); - AssertEquals ("#03", "1.2345678901235", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F13", _nfi)); - AssertEquals ("#04", "1.23456789012346", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F14", _nfi)); - AssertEquals ("#05", "1.234567890123460", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F15", _nfi)); - AssertEquals ("#06", "1.234567890123460000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F99", _nfi)); - AssertEquals ("#07", "F101", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F100", _nfi)); - } - - [Test] - public void Test12029 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberDecimalSeparator = "#"; - AssertEquals ("#01", "-99999999#90", (-99999999.9).ToString ("F", nfi)); - } - - [Test] - public void Test12030 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "+"; - nfi.PositiveSign = "-"; - - AssertEquals ("#01", "1.00", 1.0.ToString ("F", nfi)); - AssertEquals ("#02", "0.00", 0.0.ToString ("F", nfi)); - AssertEquals ("#03", "+1.00", (-1.0).ToString ("F", nfi)); - } - - [Test] - public void Test12031 () - { - AssertEquals ("#01", "Infinity", (Double.MaxValue / 0.0).ToString ("F99", _nfi)); - AssertEquals ("#02", "-Infinity", (Double.MinValue / 0.0).ToString ("F99", _nfi)); - AssertEquals ("#03", "NaN", (0.0 / 0.0).ToString ("F99", _nfi)); - } - - // Test13000- Double and G - [Test] - public void Test13000 () - { - AssertEquals ("#01", "0", 0.0.ToString ("G", _nfi)); - AssertEquals ("#01.1", "0", (-0.0).ToString ("G", _nfi)); - AssertEquals ("#02", "0", 0.0.ToString ("g", _nfi)); - AssertEquals ("#03", "-1.79769313486232E+308", Double.MinValue.ToString ("G", _nfi)); - AssertEquals ("#04", "-1.79769313486232e+308", Double.MinValue.ToString ("g", _nfi)); - AssertEquals ("#05", "1.79769313486232E+308", Double.MaxValue.ToString ("G", _nfi)); - AssertEquals ("#06", "1.79769313486232e+308", Double.MaxValue.ToString ("g", _nfi)); - } - - [Test] - public void Test13001 () - { - AssertEquals ("#01", "G ", 0.0.ToString ("G ", _nfi)); - AssertEquals ("#02", " G", 0.0.ToString (" G", _nfi)); - AssertEquals ("#03", " G ", 0.0.ToString (" G ", _nfi)); - } - - [Test] - public void Test13002 () - { - AssertEquals ("#01", "-G ", (-1.0).ToString ("G ", _nfi)); - AssertEquals ("#02", "- G", (-1.0).ToString (" G", _nfi)); - AssertEquals ("#03", "- G ", (-1.0).ToString (" G ", _nfi)); - } - - [Test] - public void Test13003 () - { - AssertEquals ("#01", "0", 0.0.ToString ("G0", _nfi)); - AssertEquals ("#02", "0", 0.0.ToString ("G16", _nfi)); - AssertEquals ("#03", "0", 0.0.ToString ("G17", _nfi)); - AssertEquals ("#04", "0", 0.0.ToString ("G99", _nfi)); - AssertEquals ("#05", "G100", 0.0.ToString ("G100", _nfi)); - } - - [Test] - public void Test13004 () - { - AssertEquals ("#01", "1.79769313486232E+308", Double.MaxValue.ToString ("G0", _nfi)); - AssertEquals ("#02", "1.797693134862316E+308", Double.MaxValue.ToString ("G16", _nfi)); - AssertEquals ("#03", "1.7976931348623157E+308", Double.MaxValue.ToString ("G17", _nfi)); - AssertEquals ("#04", "1.7976931348623157E+308", Double.MaxValue.ToString ("G99", _nfi)); - AssertEquals ("#05", "G1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("G100", _nfi)); - } - - [Test] - public void Test13005 () - { - AssertEquals ("#01", "-1.79769313486232E+308", Double.MinValue.ToString ("G0", _nfi)); - AssertEquals ("#02", "-1.797693134862316E+308", Double.MinValue.ToString ("G16", _nfi)); - AssertEquals ("#03", "-1.7976931348623157E+308", Double.MinValue.ToString ("G17", _nfi)); - AssertEquals ("#04", "-1.7976931348623157E+308", Double.MinValue.ToString ("G99", _nfi)); - AssertEquals ("#05", "-G1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("G100", _nfi)); - } - - [Test] - public void Test13006 () - { - AssertEquals ("#01", "GF", 0.0.ToString ("GF", _nfi)); - AssertEquals ("#02", "G0F", 0.0.ToString ("G0F", _nfi)); - AssertEquals ("#03", "G0xF", 0.0.ToString ("G0xF", _nfi)); - } - - [Test] - public void Test13007 () - { - AssertEquals ("#01", "GF", Double.MaxValue.ToString ("GF", _nfi)); - AssertEquals ("#02", "G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MaxValue.ToString ("G0F", _nfi)); - AssertEquals ("#03", "G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MaxValue.ToString ("G0xF", _nfi)); - } - - [Test] - public void Test13008 () - { - AssertEquals ("#01", "-GF", Double.MinValue.ToString ("GF", _nfi)); - AssertEquals ("#02", "-G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MinValue.ToString ("G0F", _nfi)); - AssertEquals ("#03", "-G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MinValue.ToString ("G0xF", _nfi)); - } - - [Test] - public void Test13009 () - { - AssertEquals ("#01", "0", 0.0.ToString ("G0000000000000000000000000000000000000017", _nfi)); - AssertEquals ("#02", "1.7976931348623157E+308", Double.MaxValue.ToString ("G0000000000000000000000000000000000000017", _nfi)); - AssertEquals ("#03", "-1.7976931348623157E+308", Double.MinValue.ToString ("G0000000000000000000000000000000000000017", _nfi)); - } - - [Test] - public void Test13010 () - { - AssertEquals ("#01", "+G", 0.0.ToString ("+G", _nfi)); - AssertEquals ("#02", "G+", 0.0.ToString ("G+", _nfi)); - AssertEquals ("#03", "+G+", 0.0.ToString ("+G+", _nfi)); - } - - [Test] - public void Test13011 () - { - AssertEquals ("#01", "+G", Double.MaxValue.ToString ("+G", _nfi)); - AssertEquals ("#02", "G+", Double.MaxValue.ToString ("G+", _nfi)); - AssertEquals ("#03", "+G+", Double.MaxValue.ToString ("+G+", _nfi)); - } - - [Test] - public void Test13012 () - { - AssertEquals ("#01", "-+G", Double.MinValue.ToString ("+G", _nfi)); - AssertEquals ("#02", "-G+", Double.MinValue.ToString ("G+", _nfi)); - AssertEquals ("#03", "-+G+", Double.MinValue.ToString ("+G+", _nfi)); - } - - [Test] - public void Test13013 () - { - AssertEquals ("#01", "-G", 0.0.ToString ("-G", _nfi)); - AssertEquals ("#02", "G-", 0.0.ToString ("G-", _nfi)); - AssertEquals ("#03", "-G-", 0.0.ToString ("-G-", _nfi)); - } - - [Test] - public void Test13014 () - { - AssertEquals ("#01", "-G", Double.MaxValue.ToString ("-G", _nfi)); - AssertEquals ("#02", "G-", Double.MaxValue.ToString ("G-", _nfi)); - AssertEquals ("#03", "-G-", Double.MaxValue.ToString ("-G-", _nfi)); - } - - [Test] - public void Test13015 () - { - AssertEquals ("#01", "--G", Double.MinValue.ToString ("-G", _nfi)); - AssertEquals ("#02", "-G-", Double.MinValue.ToString ("G-", _nfi)); - AssertEquals ("#03", "--G-", Double.MinValue.ToString ("-G-", _nfi)); - } - - [Test] - public void Test13016 () - { - AssertEquals ("#01", "G+0", 0.0.ToString ("G+0", _nfi)); - AssertEquals ("#02", "G+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("G+0", _nfi)); - AssertEquals ("#03", "-G+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("G+0", _nfi)); - } - - [Test] - public void Test13017 () - { - AssertEquals ("#01", "G+9", 0.0.ToString ("G+9", _nfi)); - AssertEquals ("#02", "G+9", Double.MaxValue.ToString ("G+9", _nfi)); - AssertEquals ("#03", "-G+9", Double.MinValue.ToString ("G+9", _nfi)); - } - - [Test] - public void Test13018 () - { - AssertEquals ("#01", "G-9", 0.0.ToString ("G-9", _nfi)); - AssertEquals ("#02", "G-9", Double.MaxValue.ToString ("G-9", _nfi)); - AssertEquals ("#03", "-G-9", Double.MinValue.ToString ("G-9", _nfi)); - } - - [Test] - public void Test13019 () - { - AssertEquals ("#01", "G0", 0.0.ToString ("G0,", _nfi)); - AssertEquals ("#02", "G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("G0,", _nfi)); - AssertEquals ("#03", "-G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("G0,", _nfi)); - } - - [Test] - public void Test13020 () - { - AssertEquals ("#01", "G0", 0.0.ToString ("G0.", _nfi)); - AssertEquals ("#02", "G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("G0.", _nfi)); - AssertEquals ("#03", "-G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("G0.", _nfi)); - } - - [Test] - public void Test13021 () - { - AssertEquals ("#01", "G0.0", 0.0.ToString ("G0.0", _nfi)); - AssertEquals ("#02", "G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MaxValue.ToString ("G0.0", _nfi)); - AssertEquals ("#03", "-G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MinValue.ToString ("G0.0", _nfi)); - } - - [Test] - public void Test13022 () - { - AssertEquals ("#01", "G09", 0.0.ToString ("G0.9", _nfi)); - AssertEquals ("#02", "G1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MaxValue.ToString ("G0.9", _nfi)); - AssertEquals ("#03", "-G1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MinValue.ToString ("G0.9", _nfi)); - } - - [Test] - public void Test13023 () - { - AssertEquals ("#01", "0.5", 0.5.ToString ("G1", _nfi)); - AssertEquals ("#02", "2", 1.5.ToString ("G1", _nfi)); - AssertEquals ("#03", "3", 2.5.ToString ("G1", _nfi)); - AssertEquals ("#04", "4", 3.5.ToString ("G1", _nfi)); - AssertEquals ("#05", "5", 4.5.ToString ("G1", _nfi)); - AssertEquals ("#06", "6", 5.5.ToString ("G1", _nfi)); - AssertEquals ("#07", "7", 6.5.ToString ("G1", _nfi)); - AssertEquals ("#08", "8", 7.5.ToString ("G1", _nfi)); - AssertEquals ("#09", "9", 8.5.ToString ("G1", _nfi)); - AssertEquals ("#10", "1E+01", 9.5.ToString ("G1", _nfi)); - } - - [Test] - public void Test13024_CarryPropagation () - { - Double d = 1.15; - AssertEquals ("#01", "1", d.ToString ("G1", _nfi)); - // NumberStore converts 1.15 into 1.14999...91 (1 in index 17) - // so the call to NumberToString doesn't result in 1.2 but in 1.1 - // which seems "somewhat" normal considering the #17 results, - AssertEquals ("#02", "1.2", d.ToString ("G2", _nfi)); - AssertEquals ("#03", "1.15", d.ToString ("G3", _nfi)); - AssertEquals ("#04", "1.15", d.ToString ("G4", _nfi)); - AssertEquals ("#05", "1.15", d.ToString ("G5", _nfi)); - AssertEquals ("#06", "1.15", d.ToString ("G6", _nfi)); - AssertEquals ("#07", "1.15", d.ToString ("G7", _nfi)); - AssertEquals ("#08", "1.15", d.ToString ("G8", _nfi)); - AssertEquals ("#09", "1.15", d.ToString ("G9", _nfi)); - AssertEquals ("#10", "1.15", d.ToString ("G10", _nfi)); - AssertEquals ("#11", "1.15", d.ToString ("G11", _nfi)); - AssertEquals ("#12", "1.15", d.ToString ("G12", _nfi)); - AssertEquals ("#13", "1.15", d.ToString ("G13", _nfi)); - AssertEquals ("#14", "1.15", d.ToString ("G14", _nfi)); - AssertEquals ("#15", "1.15", d.ToString ("G15", _nfi)); - AssertEquals ("#16", "1.15", d.ToString ("G16", _nfi)); - AssertEquals ("#17", "1.1499999999999999", d.ToString ("G17", _nfi)); - } - - [Test] - public void Test13024 () - { - AssertEquals ("#01", "1.1", 1.05.ToString ("G2", _nfi)); - AssertEquals ("#02", "1.2", 1.15.ToString ("G2", _nfi)); - AssertEquals ("#03", "1.3", 1.25.ToString ("G2", _nfi)); - AssertEquals ("#04", "1.4", 1.35.ToString ("G2", _nfi)); - AssertEquals ("#05", "1.5", 1.45.ToString ("G2", _nfi)); - AssertEquals ("#06", "1.6", 1.55.ToString ("G2", _nfi)); - AssertEquals ("#07", "1.7", 1.65.ToString ("G2", _nfi)); - AssertEquals ("#08", "1.8", 1.75.ToString ("G2", _nfi)); - AssertEquals ("#09", "1.9", 1.85.ToString ("G2", _nfi)); - AssertEquals ("#10", "2", 1.95.ToString ("G2", _nfi)); - } - - [Test] - public void Test13025 () - { - AssertEquals ("#01", "10", 10.05.ToString ("G2", _nfi)); - AssertEquals ("#02", "10", 10.15.ToString ("G2", _nfi)); - AssertEquals ("#03", "10", 10.25.ToString ("G2", _nfi)); - AssertEquals ("#04", "10", 10.35.ToString ("G2", _nfi)); - AssertEquals ("#05", "10", 10.45.ToString ("G2", _nfi)); - AssertEquals ("#06", "11", 10.55.ToString ("G2", _nfi)); - AssertEquals ("#07", "11", 10.65.ToString ("G2", _nfi)); - AssertEquals ("#08", "11", 10.75.ToString ("G2", _nfi)); - AssertEquals ("#09", "11", 10.85.ToString ("G2", _nfi)); - AssertEquals ("#10", "11", 10.95.ToString ("G2", _nfi)); - } - - [Test] - public void Test13026 () - { - AssertEquals ("#01", "1.00000000000001", 1.000000000000005.ToString ("G15", _nfi)); - AssertEquals ("#02", "1.00000000000002", 1.000000000000015.ToString ("G15", _nfi)); - AssertEquals ("#03", "1.00000000000003", 1.000000000000025.ToString ("G15", _nfi)); - AssertEquals ("#04", "1.00000000000004", 1.000000000000035.ToString ("G15", _nfi)); - AssertEquals ("#05", "1.00000000000005", 1.000000000000045.ToString ("G15", _nfi)); - AssertEquals ("#06", "1.00000000000006", 1.000000000000055.ToString ("G15", _nfi)); - AssertEquals ("#07", "1.00000000000007", 1.000000000000065.ToString ("G15", _nfi)); - AssertEquals ("#08", "1.00000000000008", 1.000000000000075.ToString ("G15", _nfi)); - AssertEquals ("#09", "1.00000000000009", 1.000000000000085.ToString ("G15", _nfi)); - AssertEquals ("#10", "1.0000000000001", 1.000000000000095.ToString ("G15", _nfi)); - } - - [Test] - public void Test13027 () - { - AssertEquals ("#01", "1", 1.0000000000000005.ToString ("G16", _nfi)); - AssertEquals ("#02", "1.000000000000002", 1.0000000000000015.ToString ("G16", _nfi)); - AssertEquals ("#03", "1.000000000000002", 1.0000000000000025.ToString ("G16", _nfi)); - AssertEquals ("#04", "1.000000000000004", 1.0000000000000035.ToString ("G16", _nfi)); - AssertEquals ("#05", "1.000000000000004", 1.0000000000000045.ToString ("G16", _nfi)); - AssertEquals ("#06", "1.000000000000006", 1.0000000000000055.ToString ("G16", _nfi)); - AssertEquals ("#07", "1.000000000000006", 1.0000000000000065.ToString ("G16", _nfi)); - AssertEquals ("#08", "1.000000000000008", 1.0000000000000075.ToString ("G16", _nfi)); - AssertEquals ("#09", "1.000000000000008", 1.0000000000000085.ToString ("G16", _nfi)); - AssertEquals ("#10", "1.00000000000001", 1.0000000000000095.ToString ("G16", _nfi)); - } - - [Test] - public void Test13028 () - { - AssertEquals ("#01", "1", 1.00000000000000005.ToString ("G17", _nfi)); - AssertEquals ("#02", "1.0000000000000002", 1.00000000000000015.ToString ("G17", _nfi)); - AssertEquals ("#03", "1.0000000000000002", 1.00000000000000025.ToString ("G17", _nfi)); - AssertEquals ("#04", "1.0000000000000004", 1.00000000000000035.ToString ("G17", _nfi)); - AssertEquals ("#05", "1.0000000000000004", 1.00000000000000045.ToString ("G17", _nfi)); - AssertEquals ("#06", "1.0000000000000004", 1.00000000000000055.ToString ("G17", _nfi)); - AssertEquals ("#07", "1.0000000000000007", 1.00000000000000065.ToString ("G17", _nfi)); - AssertEquals ("#08", "1.0000000000000007", 1.00000000000000075.ToString ("G17", _nfi)); - AssertEquals ("#09", "1.0000000000000009", 1.00000000000000085.ToString ("G17", _nfi)); - AssertEquals ("#10", "1.0000000000000009", 1.00000000000000095.ToString ("G17", _nfi)); - } - - [Test] - public void Test13029 () - { - AssertEquals ("#01", "1", 1.000000000000000005.ToString ("G18", _nfi)); - AssertEquals ("#02", "1", 1.000000000000000015.ToString ("G18", _nfi)); - AssertEquals ("#03", "1", 1.000000000000000025.ToString ("G18", _nfi)); - AssertEquals ("#04", "1", 1.000000000000000035.ToString ("G18", _nfi)); - AssertEquals ("#05", "1", 1.000000000000000045.ToString ("G18", _nfi)); - AssertEquals ("#06", "1", 1.000000000000000055.ToString ("G18", _nfi)); - AssertEquals ("#07", "1", 1.000000000000000065.ToString ("G18", _nfi)); - AssertEquals ("#08", "1", 1.000000000000000075.ToString ("G18", _nfi)); - AssertEquals ("#09", "1", 1.000000000000000085.ToString ("G18", _nfi)); - AssertEquals ("#10", "1", 1.000000000000000095.ToString ("G18", _nfi)); - } - - [Test] - public void Test13030 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberDecimalSeparator = "#"; - AssertEquals ("#01", "-99999999#9", (-99999999.9).ToString ("G", nfi)); - } - - [Test] - public void Test13031 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "+"; - nfi.PositiveSign = "-"; - - AssertEquals ("#01", "1", 1.0.ToString ("G", nfi)); - AssertEquals ("#02", "0", 0.0.ToString ("G", nfi)); - AssertEquals ("#03", "+1", (-1.0).ToString ("G", nfi)); - } - - [Test] - public void Test13032 () - { - AssertEquals ("#01", "Infinity", (Double.MaxValue / 0.0).ToString ("G99", _nfi)); - AssertEquals ("#02", "-Infinity", (Double.MinValue / 0.0).ToString ("G99", _nfi)); - AssertEquals ("#03", "NaN", (0.0 / 0.0).ToString ("G99", _nfi)); - } - - [Test] - public void Test13033 () - { - AssertEquals ("#01", "0.0001", 0.0001.ToString ("G", _nfi)); - AssertEquals ("#02", "1E-05", 0.00001.ToString ("G", _nfi)); - AssertEquals ("#03", "0.0001", 0.0001.ToString ("G0", _nfi)); - AssertEquals ("#04", "1E-05", 0.00001.ToString ("G0", _nfi)); - AssertEquals ("#05", "100000000000000", 100000000000000.0.ToString ("G", _nfi)); - AssertEquals ("#06", "1E+15", 1000000000000000.0.ToString ("G", _nfi)); - AssertEquals ("#07", "1000000000000000", 1000000000000000.0.ToString ("G16", _nfi)); - } - - // Test14000- Double and N - [Test] - public void Test14000 () - { - AssertEquals ("#01", "0.00", 0.0.ToString ("N", _nfi)); - AssertEquals ("#02", "0.00", 0.0.ToString ("n", _nfi)); - AssertEquals ("#03", "-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00", Double.MinValue.ToString ("N", _nfi)); - AssertEquals ("#04", "-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00", Double.MinValue.ToString ("n", _nfi)); - AssertEquals ("#05", "179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00", Double.MaxValue.ToString ("N", _nfi)); - AssertEquals ("#06", "179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00", Double.MaxValue.ToString ("n", _nfi)); - } - - [Test] - public void Test14001 () - { - AssertEquals ("#01", "N ", 0.0.ToString ("N ", _nfi)); - AssertEquals ("#02", " N", 0.0.ToString (" N", _nfi)); - AssertEquals ("#03", " N ", 0.0.ToString (" N ", _nfi)); - } - - [Test] - public void Test14002 () - { - AssertEquals ("#01", "-N ", (-1.0).ToString ("N ", _nfi)); - AssertEquals ("#02", "- N", (-1.0).ToString (" N", _nfi)); - AssertEquals ("#03", "- N ", (-1.0).ToString (" N ", _nfi)); - } - - [Test] - public void Test14003 () - { - AssertEquals ("#01", "0", 0.0.ToString ("N0", _nfi)); - AssertEquals ("#02", "0.0000000000000000", 0.0.ToString ("N16", _nfi)); - AssertEquals ("#03", "0.00000000000000000", 0.0.ToString ("N17", _nfi)); - AssertEquals ("#04", "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.0.ToString ("N99", _nfi)); - AssertEquals ("#05", "N100", 0.0.ToString ("N100", _nfi)); - } - - [Test] - public void Test14004 () - { - AssertEquals ("#01", "179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000", Double.MaxValue.ToString ("N0", _nfi)); - AssertEquals ("#02", "179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.0000000000000000", Double.MaxValue.ToString ("N16", _nfi)); - AssertEquals ("#03", "179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000", Double.MaxValue.ToString ("N17", _nfi)); - AssertEquals ("#04", "179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("N99", _nfi)); - AssertEquals ("#05", "N1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("N100", _nfi)); - } - - [Test] - public void Test14005 () - { - AssertEquals ("#01", "-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000", Double.MinValue.ToString ("N0", _nfi)); - AssertEquals ("#02", "-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.0000000000000000", Double.MinValue.ToString ("N16", _nfi)); - AssertEquals ("#03", "-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000", Double.MinValue.ToString ("N17", _nfi)); - AssertEquals ("#04", "-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("N99", _nfi)); - AssertEquals ("#05", "-N1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("N100", _nfi)); - } - - [Test] - public void Test14006 () - { - AssertEquals ("#01", "NF", 0.0.ToString ("NF", _nfi)); - AssertEquals ("#02", "N0F", 0.0.ToString ("N0F", _nfi)); - AssertEquals ("#03", "N0xF", 0.0.ToString ("N0xF", _nfi)); - } - - [Test] - public void Test14007 () - { - AssertEquals ("#01", "NF", Double.MaxValue.ToString ("NF", _nfi)); - AssertEquals ("#02", "N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MaxValue.ToString ("N0F", _nfi)); - AssertEquals ("#03", "N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MaxValue.ToString ("N0xF", _nfi)); - } - - [Test] - public void Test14008 () - { - AssertEquals ("#01", "-NF", Double.MinValue.ToString ("NF", _nfi)); - AssertEquals ("#02", "-N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MinValue.ToString ("N0F", _nfi)); - AssertEquals ("#03", "-N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MinValue.ToString ("N0xF", _nfi)); - } - - [Test] - public void Test14009 () - { - AssertEquals ("#01", "0.00000000000000000", 0.0.ToString ("N0000000000000000000000000000000000000017", _nfi)); - AssertEquals ("#02", "179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000", Double.MaxValue.ToString ("N0000000000000000000000000000000000000017", _nfi)); - AssertEquals ("#03", "-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000", Double.MinValue.ToString ("N0000000000000000000000000000000000000017", _nfi)); - } - - [Test] - public void Test14010 () - { - AssertEquals ("#01", "+N", 0.0.ToString ("+N", _nfi)); - AssertEquals ("#02", "N+", 0.0.ToString ("N+", _nfi)); - AssertEquals ("#03", "+N+", 0.0.ToString ("+N+", _nfi)); - } - - [Test] - public void Test14011 () - { - AssertEquals ("#01", "+N", Double.MaxValue.ToString ("+N", _nfi)); - AssertEquals ("#02", "N+", Double.MaxValue.ToString ("N+", _nfi)); - AssertEquals ("#03", "+N+", Double.MaxValue.ToString ("+N+", _nfi)); - } - - [Test] - public void Test14012 () - { - AssertEquals ("#01", "-+N", Double.MinValue.ToString ("+N", _nfi)); - AssertEquals ("#02", "-N+", Double.MinValue.ToString ("N+", _nfi)); - AssertEquals ("#03", "-+N+", Double.MinValue.ToString ("+N+", _nfi)); - } - - [Test] - public void Test14013 () - { - AssertEquals ("#01", "-N", 0.0.ToString ("-N", _nfi)); - AssertEquals ("#02", "N-", 0.0.ToString ("N-", _nfi)); - AssertEquals ("#03", "-N-", 0.0.ToString ("-N-", _nfi)); - } - - [Test] - public void Test14014 () - { - AssertEquals ("#01", "-N", Double.MaxValue.ToString ("-N", _nfi)); - AssertEquals ("#02", "N-", Double.MaxValue.ToString ("N-", _nfi)); - AssertEquals ("#03", "-N-", Double.MaxValue.ToString ("-N-", _nfi)); - } - - [Test] - public void Test14015 () - { - AssertEquals ("#01", "--N", Double.MinValue.ToString ("-N", _nfi)); - AssertEquals ("#02", "-N-", Double.MinValue.ToString ("N-", _nfi)); - AssertEquals ("#03", "--N-", Double.MinValue.ToString ("-N-", _nfi)); - } - - [Test] - public void Test14016 () - { - AssertEquals ("#01", "N+0", 0.0.ToString ("N+0", _nfi)); - AssertEquals ("#02", "N+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("N+0", _nfi)); - AssertEquals ("#03", "-N+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("N+0", _nfi)); - } - - [Test] - public void Test14017 () - { - AssertEquals ("#01", "N+9", 0.0.ToString ("N+9", _nfi)); - AssertEquals ("#02", "N+9", Double.MaxValue.ToString ("N+9", _nfi)); - AssertEquals ("#03", "-N+9", Double.MinValue.ToString ("N+9", _nfi)); - } - - [Test] - public void Test14018 () - { - AssertEquals ("#01", "N-9", 0.0.ToString ("N-9", _nfi)); - AssertEquals ("#02", "N-9", Double.MaxValue.ToString ("N-9", _nfi)); - AssertEquals ("#03", "-N-9", Double.MinValue.ToString ("N-9", _nfi)); - } - - [Test] - public void Test14019 () - { - AssertEquals ("#01", "N0", 0.0.ToString ("N0,", _nfi)); - AssertEquals ("#02", "N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("N0,", _nfi)); - AssertEquals ("#03", "-N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("N0,", _nfi)); - } - - [Test] - public void Test14020 () - { - AssertEquals ("#01", "N0", 0.0.ToString ("N0.", _nfi)); - AssertEquals ("#02", "N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("N0.", _nfi)); - AssertEquals ("#03", "-N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("N0.", _nfi)); - } - - [Test] - public void Test14021 () - { - AssertEquals ("#01", "N0.0", 0.0.ToString ("N0.0", _nfi)); - AssertEquals ("#02", "N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MaxValue.ToString ("N0.0", _nfi)); - AssertEquals ("#03", "-N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MinValue.ToString ("N0.0", _nfi)); - } - - [Test] - public void Test14022 () - { - AssertEquals ("#01", "N09", 0.0.ToString ("N0.9", _nfi)); - AssertEquals ("#02", "N1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MaxValue.ToString ("N0.9", _nfi)); - AssertEquals ("#03", "-N1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MinValue.ToString ("N0.9", _nfi)); - } - - [Test] - public void Test14023 () - { - AssertEquals ("#01", "999.1", 999.05.ToString ("N1", _nfi)); - AssertEquals ("#02", "999.2", 999.15.ToString ("N1", _nfi)); - AssertEquals ("#03", "999.3", 999.25.ToString ("N1", _nfi)); - AssertEquals ("#04", "999.4", 999.35.ToString ("N1", _nfi)); - AssertEquals ("#05", "999.5", 999.45.ToString ("N1", _nfi)); - AssertEquals ("#06", "999.6", 999.55.ToString ("N1", _nfi)); - AssertEquals ("#07", "999.7", 999.65.ToString ("N1", _nfi)); - AssertEquals ("#08", "999.8", 999.75.ToString ("N1", _nfi)); - AssertEquals ("#09", "999.9", 999.85.ToString ("N1", _nfi)); - AssertEquals ("#10", "1,000.0", 999.95.ToString ("N1", _nfi)); - } - - [Test] - public void Test14024 () - { - AssertEquals ("#01", "999.91", 999.905.ToString ("N2", _nfi)); - AssertEquals ("#02", "999.92", 999.915.ToString ("N2", _nfi)); - AssertEquals ("#03", "999.93", 999.925.ToString ("N2", _nfi)); - AssertEquals ("#04", "999.94", 999.935.ToString ("N2", _nfi)); - AssertEquals ("#05", "999.95", 999.945.ToString ("N2", _nfi)); - AssertEquals ("#06", "999.96", 999.955.ToString ("N2", _nfi)); - AssertEquals ("#07", "999.97", 999.965.ToString ("N2", _nfi)); - AssertEquals ("#08", "999.98", 999.975.ToString ("N2", _nfi)); - AssertEquals ("#09", "999.99", 999.985.ToString ("N2", _nfi)); - AssertEquals ("#10", "1,000.00", 999.995.ToString ("N2", _nfi)); - } - - [Test] - public void Test14025 () - { - AssertEquals ("#01", "999.99999999991", 999.999999999905.ToString ("N11", _nfi)); - AssertEquals ("#02", "999.99999999992", 999.999999999915.ToString ("N11", _nfi)); - AssertEquals ("#03", "999.99999999993", 999.999999999925.ToString ("N11", _nfi)); - AssertEquals ("#04", "999.99999999994", 999.999999999935.ToString ("N11", _nfi)); - AssertEquals ("#05", "999.99999999995", 999.999999999945.ToString ("N11", _nfi)); - AssertEquals ("#06", "999.99999999996", 999.999999999955.ToString ("N11", _nfi)); - AssertEquals ("#07", "999.99999999997", 999.999999999965.ToString ("N11", _nfi)); - AssertEquals ("#08", "999.99999999998", 999.999999999975.ToString ("N11", _nfi)); - AssertEquals ("#09", "999.99999999999", 999.999999999985.ToString ("N11", _nfi)); - AssertEquals ("#10", "1,000.00000000000", 999.999999999995.ToString ("N11", _nfi)); - } - - [Test] - public void Test14026 () - { - AssertEquals ("#01", "999.999999999990", 999.9999999999905.ToString ("N12", _nfi)); - AssertEquals ("#02", "999.999999999991", 999.9999999999915.ToString ("N12", _nfi)); - AssertEquals ("#03", "999.999999999993", 999.9999999999925.ToString ("N12", _nfi)); - AssertEquals ("#04", "999.999999999994", 999.9999999999935.ToString ("N12", _nfi)); - AssertEquals ("#05", "999.999999999995", 999.9999999999945.ToString ("N12", _nfi)); - AssertEquals ("#06", "999.999999999995", 999.9999999999955.ToString ("N12", _nfi)); - AssertEquals ("#07", "999.999999999996", 999.9999999999965.ToString ("N12", _nfi)); - AssertEquals ("#08", "999.999999999998", 999.9999999999975.ToString ("N12", _nfi)); - AssertEquals ("#09", "999.999999999999", 999.9999999999985.ToString ("N12", _nfi)); - AssertEquals ("#10", "1,000.000000000000", 999.9999999999995.ToString ("N12", _nfi)); - } - - [Test] - public void Test14027 () - { - AssertEquals ("#01", "999.9999999999990", 999.99999999999905.ToString ("N13", _nfi)); - AssertEquals ("#02", "999.9999999999990", 999.99999999999915.ToString ("N13", _nfi)); - AssertEquals ("#03", "999.9999999999990", 999.99999999999925.ToString ("N13", _nfi)); - AssertEquals ("#04", "999.9999999999990", 999.99999999999935.ToString ("N13", _nfi)); - AssertEquals ("#05", "999.9999999999990", 999.99999999999945.ToString ("N13", _nfi)); - AssertEquals ("#06", "1,000.0000000000000", 999.99999999999955.ToString ("N13", _nfi)); - AssertEquals ("#07", "1,000.0000000000000", 999.99999999999965.ToString ("N13", _nfi)); - AssertEquals ("#08", "1,000.0000000000000", 999.99999999999975.ToString ("N13", _nfi)); - AssertEquals ("#09", "1,000.0000000000000", 999.99999999999985.ToString ("N13", _nfi)); - AssertEquals ("#10", "1,000.0000000000000", 999.99999999999995.ToString ("N13", _nfi)); - } - - [Test] - public void Test14028 () - { - AssertEquals ("#01", "1", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N0", _nfi)); - AssertEquals ("#02", "1.234567890123", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N12", _nfi)); - AssertEquals ("#03", "1.2345678901235", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N13", _nfi)); - AssertEquals ("#04", "1.23456789012346", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N14", _nfi)); - AssertEquals ("#05", "1.234567890123460", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N15", _nfi)); - AssertEquals ("#06", "1.234567890123460000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N99", _nfi)); - AssertEquals ("#07", "N101", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N100", _nfi)); - } - - [Test] - public void Test14029 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NumberDecimalSeparator = "#"; - AssertEquals ("#01", "-99,999,999#90", (-99999999.9).ToString ("N", nfi)); - } - - [Test] - public void Test14030 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "+"; - nfi.PositiveSign = "-"; - - AssertEquals ("#01", "1,000.00", 1000.0.ToString ("N", nfi)); - AssertEquals ("#02", "0.00", 0.0.ToString ("N", nfi)); - AssertEquals ("#03", "+1,000.00", (-1000.0).ToString ("N", nfi)); - } - - [Test] - public void Test14031 () - { - AssertEquals ("#01", "Infinity", (Double.MaxValue / 0.0).ToString ("N99", _nfi)); - AssertEquals ("#02", "-Infinity", (Double.MinValue / 0.0).ToString ("N99", _nfi)); - AssertEquals ("#03", "NaN", (0.0 / 0.0).ToString ("N99", _nfi)); - } - - // Test15000- Double and P - [Test] - public void Test15000 () - { - AssertEquals ("#01", "0.00 %", 0.0.ToString ("P", _nfi)); - AssertEquals ("#02", "0.00 %", 0.0.ToString ("p", _nfi)); - AssertEquals ("#03", "-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00 %", Double.MinValue.ToString ("P", _nfi)); - AssertEquals ("#04", "-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00 %", Double.MinValue.ToString ("p", _nfi)); - AssertEquals ("#05", "17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00 %", Double.MaxValue.ToString ("P", _nfi)); - AssertEquals ("#06", "17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00 %", Double.MaxValue.ToString ("p", _nfi)); - } - - [Test] - public void Test15001 () - { - AssertEquals ("#01", "P ", 0.0.ToString ("P ", _nfi)); - AssertEquals ("#02", " P", 0.0.ToString (" P", _nfi)); - AssertEquals ("#03", " P ", 0.0.ToString (" P ", _nfi)); - } - - [Test] - public void Test15002 () - { - AssertEquals ("#01", "-P ", (-1.0).ToString ("P ", _nfi)); - AssertEquals ("#02", "- P", (-1.0).ToString (" P", _nfi)); - AssertEquals ("#03", "- P ", (-1.0).ToString (" P ", _nfi)); - } - - [Test] - public void Test15003 () - { - AssertEquals ("#01", "0 %", 0.0.ToString ("P0", _nfi)); - AssertEquals ("#02", "0.0000000000000000 %", 0.0.ToString ("P16", _nfi)); - AssertEquals ("#03", "0.00000000000000000 %", 0.0.ToString ("P17", _nfi)); - AssertEquals ("#04", "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", 0.0.ToString ("P99", _nfi)); - AssertEquals ("#05", "P100", 0.0.ToString ("P100", _nfi)); - } - - [Test] - public void Test15004 () - { - AssertEquals ("#01", "17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 %", Double.MaxValue.ToString ("P0", _nfi)); - AssertEquals ("#02", "17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.0000000000000000 %", Double.MaxValue.ToString ("P16", _nfi)); - AssertEquals ("#03", "17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000 %", Double.MaxValue.ToString ("P17", _nfi)); - AssertEquals ("#04", "17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", Double.MaxValue.ToString ("P99", _nfi)); - AssertEquals ("#05", "P1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("P100", _nfi)); - } - - [Test] - public void Test15005 () - { - AssertEquals ("#01", "-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 %", Double.MinValue.ToString ("P0", _nfi)); - AssertEquals ("#02", "-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.0000000000000000 %", Double.MinValue.ToString ("P16", _nfi)); - AssertEquals ("#03", "-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000 %", Double.MinValue.ToString ("P17", _nfi)); - AssertEquals ("#04", "-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", Double.MinValue.ToString ("P99", _nfi)); - AssertEquals ("#05", "P1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("P100", _nfi)); - } - - [Test] - public void Test15006 () - { - AssertEquals ("#01", "PF", 0.0.ToString ("PF", _nfi)); - AssertEquals ("#02", "P0F", 0.0.ToString ("P0F", _nfi)); - AssertEquals ("#03", "P0xF", 0.0.ToString ("P0xF", _nfi)); - } - - [Test] - public void Test15007 () - { - AssertEquals ("#01", "PF", Double.MaxValue.ToString ("PF", _nfi)); - AssertEquals ("#02", "P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MaxValue.ToString ("P0F", _nfi)); - AssertEquals ("#03", "P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MaxValue.ToString ("P0xF", _nfi)); - } - - [Test] - public void Test15008 () - { - AssertEquals ("#01", "-PF", Double.MinValue.ToString ("PF", _nfi)); - AssertEquals ("#02", "-P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MinValue.ToString ("P0F", _nfi)); - AssertEquals ("#03", "-P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MinValue.ToString ("P0xF", _nfi)); - } - - [Test] - public void Test15009 () - { - AssertEquals ("#01", "0.00000000000000000 %", 0.0.ToString ("P0000000000000000000000000000000000000017", _nfi)); - AssertEquals ("#02", "17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000 %", Double.MaxValue.ToString ("P0000000000000000000000000000000000000017", _nfi)); - AssertEquals ("#03", "-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000 %", Double.MinValue.ToString ("P0000000000000000000000000000000000000017", _nfi)); - } - - [Test] - public void Test15010 () - { - AssertEquals ("#01", "+P", 0.0.ToString ("+P", _nfi)); - AssertEquals ("#02", "P+", 0.0.ToString ("P+", _nfi)); - AssertEquals ("#03", "+P+", 0.0.ToString ("+P+", _nfi)); - } - - [Test] - public void Test15011 () - { - AssertEquals ("#01", "+P", Double.MaxValue.ToString ("+P", _nfi)); - AssertEquals ("#02", "P+", Double.MaxValue.ToString ("P+", _nfi)); - AssertEquals ("#03", "+P+", Double.MaxValue.ToString ("+P+", _nfi)); - } - - [Test] - public void Test15012 () - { - AssertEquals ("#01", "-+P", Double.MinValue.ToString ("+P", _nfi)); - AssertEquals ("#02", "-P+", Double.MinValue.ToString ("P+", _nfi)); - AssertEquals ("#03", "-+P+", Double.MinValue.ToString ("+P+", _nfi)); - } - - [Test] - public void Test15013 () - { - AssertEquals ("#01", "-P", 0.0.ToString ("-P", _nfi)); - AssertEquals ("#02", "P-", 0.0.ToString ("P-", _nfi)); - AssertEquals ("#03", "-P-", 0.0.ToString ("-P-", _nfi)); - } - - [Test] - public void Test15014 () - { - AssertEquals ("#01", "-P", Double.MaxValue.ToString ("-P", _nfi)); - AssertEquals ("#02", "P-", Double.MaxValue.ToString ("P-", _nfi)); - AssertEquals ("#03", "-P-", Double.MaxValue.ToString ("-P-", _nfi)); - } - - [Test] - public void Test15015 () - { - AssertEquals ("#01", "--P", Double.MinValue.ToString ("-P", _nfi)); - AssertEquals ("#02", "-P-", Double.MinValue.ToString ("P-", _nfi)); - AssertEquals ("#03", "--P-", Double.MinValue.ToString ("-P-", _nfi)); - } - - [Test] - public void Test15016 () - { - AssertEquals ("#01", "P+0", 0.0.ToString ("P+0", _nfi)); - AssertEquals ("#02", "P+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("P+0", _nfi)); - AssertEquals ("#03", "-P+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("P+0", _nfi)); - } - - [Test] - public void Test15017 () - { - AssertEquals ("#01", "P+9", 0.0.ToString ("P+9", _nfi)); - AssertEquals ("#02", "P+9", Double.MaxValue.ToString ("P+9", _nfi)); - AssertEquals ("#03", "-P+9", Double.MinValue.ToString ("P+9", _nfi)); - } - - [Test] - public void Test15018 () - { - AssertEquals ("#01", "P-9", 0.0.ToString ("P-9", _nfi)); - AssertEquals ("#02", "P-9", Double.MaxValue.ToString ("P-9", _nfi)); - AssertEquals ("#03", "-P-9", Double.MinValue.ToString ("P-9", _nfi)); - } - - [Test] - public void Test15019 () - { - AssertEquals ("#01", "P0", 0.0.ToString ("P0,", _nfi)); - AssertEquals ("#02", "P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("P0,", _nfi)); - AssertEquals ("#03", "-P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("P0,", _nfi)); - } - - [Test] - public void Test15020 () - { - AssertEquals ("#01", "P0", 0.0.ToString ("P0.", _nfi)); - AssertEquals ("#02", "P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("P0.", _nfi)); - AssertEquals ("#03", "-P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("P0.", _nfi)); - } - - [Test] - public void Test15021 () - { - AssertEquals ("#01", "P0.0", 0.0.ToString ("P0.0", _nfi)); - AssertEquals ("#02", "P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MaxValue.ToString ("P0.0", _nfi)); - AssertEquals ("#03", "-P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MinValue.ToString ("P0.0", _nfi)); - } - - [Test] - public void Test15022 () - { - AssertEquals ("#01", "P09", 0.0.ToString ("P0.9", _nfi)); - AssertEquals ("#02", "P1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MaxValue.ToString ("P0.9", _nfi)); - AssertEquals ("#03", "-P1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MinValue.ToString ("P0.9", _nfi)); - } - - [Test] - public void Test15023 () - { - AssertEquals ("#01", "999.1 %", 9.9905.ToString ("P1", _nfi)); - AssertEquals ("#02", "999.2 %", 9.9915.ToString ("P1", _nfi)); - AssertEquals ("#03", "999.3 %", 9.9925.ToString ("P1", _nfi)); - AssertEquals ("#04", "999.4 %", 9.9935.ToString ("P1", _nfi)); - AssertEquals ("#05", "999.5 %", 9.9945.ToString ("P1", _nfi)); - AssertEquals ("#06", "999.6 %", 9.9955.ToString ("P1", _nfi)); - AssertEquals ("#07", "999.7 %", 9.9965.ToString ("P1", _nfi)); - AssertEquals ("#08", "999.8 %", 9.9975.ToString ("P1", _nfi)); - AssertEquals ("#09", "999.9 %", 9.9985.ToString ("P1", _nfi)); - AssertEquals ("#10", "1,000.0 %", 9.9995.ToString ("P1", _nfi)); - } - - [Test] - public void Test15024 () - { - AssertEquals ("#01", "999.91 %", 9.99905.ToString ("P2", _nfi)); - AssertEquals ("#02", "999.92 %", 9.99915.ToString ("P2", _nfi)); - AssertEquals ("#03", "999.93 %", 9.99925.ToString ("P2", _nfi)); - AssertEquals ("#04", "999.94 %", 9.99935.ToString ("P2", _nfi)); - AssertEquals ("#05", "999.95 %", 9.99945.ToString ("P2", _nfi)); - AssertEquals ("#06", "999.96 %", 9.99955.ToString ("P2", _nfi)); - AssertEquals ("#07", "999.97 %", 9.99965.ToString ("P2", _nfi)); - AssertEquals ("#08", "999.98 %", 9.99975.ToString ("P2", _nfi)); - AssertEquals ("#09", "999.99 %", 9.99985.ToString ("P2", _nfi)); - AssertEquals ("#10", "1,000.00 %", 9.99995.ToString ("P2", _nfi)); - } - - [Test] - public void Test15025 () - { - AssertEquals ("#01", "999.99999999991 %", 9.99999999999905.ToString ("P11", _nfi)); - AssertEquals ("#02", "999.99999999992 %", 9.99999999999915.ToString ("P11", _nfi)); - AssertEquals ("#03", "999.99999999993 %", 9.99999999999925.ToString ("P11", _nfi)); - AssertEquals ("#04", "999.99999999994 %", 9.99999999999935.ToString ("P11", _nfi)); - AssertEquals ("#05", "999.99999999995 %", 9.99999999999945.ToString ("P11", _nfi)); - AssertEquals ("#06", "999.99999999996 %", 9.99999999999955.ToString ("P11", _nfi)); - AssertEquals ("#07", "999.99999999997 %", 9.99999999999965.ToString ("P11", _nfi)); - AssertEquals ("#08", "999.99999999998 %", 9.99999999999975.ToString ("P11", _nfi)); - AssertEquals ("#09", "999.99999999999 %", 9.99999999999985.ToString ("P11", _nfi)); - AssertEquals ("#10", "1,000.00000000000 %", 9.99999999999995.ToString ("P11", _nfi)); - } - - [Test] - public void Test15026 () - { - AssertEquals ("#01", "999.999999999991 %", 9.999999999999905.ToString ("P12", _nfi)); - AssertEquals ("#02", "999.999999999991 %", 9.999999999999915.ToString ("P12", _nfi)); - AssertEquals ("#03", "999.999999999993 %", 9.999999999999925.ToString ("P12", _nfi)); - AssertEquals ("#04", "999.999999999993 %", 9.999999999999935.ToString ("P12", _nfi)); - AssertEquals ("#05", "999.999999999994 %", 9.999999999999945.ToString ("P12", _nfi)); - AssertEquals ("#06", "999.999999999996 %", 9.999999999999955.ToString ("P12", _nfi)); - AssertEquals ("#07", "999.999999999996 %", 9.999999999999965.ToString ("P12", _nfi)); - AssertEquals ("#08", "999.999999999998 %", 9.999999999999975.ToString ("P12", _nfi)); - AssertEquals ("#09", "999.999999999999 %", 9.999999999999985.ToString ("P12", _nfi)); - AssertEquals ("#10", "999.999999999999 %", 9.999999999999995.ToString ("P12", _nfi)); - } - - [Test] - public void Test15027 () - { - AssertEquals ("#01", "999.9999999999990 %", 9.9999999999999905.ToString ("P13", _nfi)); - AssertEquals ("#02", "999.9999999999990 %", 9.9999999999999915.ToString ("P13", _nfi)); - AssertEquals ("#03", "999.9999999999990 %", 9.9999999999999925.ToString ("P13", _nfi)); - AssertEquals ("#04", "999.9999999999990 %", 9.9999999999999935.ToString ("P13", _nfi)); - AssertEquals ("#05", "999.9999999999990 %", 9.9999999999999945.ToString ("P13", _nfi)); - AssertEquals ("#06", "999.9999999999990 %", 9.9999999999999955.ToString ("P13", _nfi)); - AssertEquals ("#07", "1,000.0000000000000 %", 9.9999999999999965.ToString ("P13", _nfi)); - AssertEquals ("#08", "1,000.0000000000000 %", 9.9999999999999975.ToString ("P13", _nfi)); - AssertEquals ("#09", "1,000.0000000000000 %", 9.9999999999999985.ToString ("P13", _nfi)); - AssertEquals ("#10", "1,000.0000000000000 %", 9.9999999999999995.ToString ("P13", _nfi)); - } - - [Test] - public void Test15028 () - { - AssertEquals ("#01", "1", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N0", _nfi)); - AssertEquals ("#02", "1.234567890123", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N12", _nfi)); - AssertEquals ("#03", "1.2345678901235", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N13", _nfi)); - AssertEquals ("#04", "1.23456789012346", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N14", _nfi)); - AssertEquals ("#05", "1.234567890123460", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N15", _nfi)); - AssertEquals ("#06", "1.234567890123460000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N99", _nfi)); - AssertEquals ("#07", "N101", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N100")); - } - - [Test] - public void Test15029 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.PercentDecimalSeparator = "#"; - AssertEquals ("#01", "-9,999,999,990#00 %", (-99999999.9).ToString ("P", nfi)); - } - - [Test] - public void Test15030 () - { - NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; - nfi.NegativeSign = "+"; - nfi.PositiveSign = "-"; - - AssertEquals ("#01", "1,000.00 %", 10.0.ToString ("P", nfi)); - AssertEquals ("#02", "0.00 %", 0.0.ToString ("P", nfi)); - AssertEquals ("#03", "+1,000.00 %", (-10.0).ToString ("P", nfi)); - } - - [Test] - public void Test15031 () - { - AssertEquals ("#01", "Infinity", (Double.MaxValue / 0.0).ToString ("N99", _nfi)); - AssertEquals ("#02", "-Infinity", (Double.MinValue / 0.0).ToString ("N99", _nfi)); - AssertEquals ("#03", "NaN", (0.0 / 0.0).ToString ("N99", _nfi)); - } - - // TestRoundtrip for double and single - [Test] - public void TestRoundtrip() - { - AssertEquals ("#01", "1.2345678901234567", 1.2345678901234567890.ToString ("R", _nfi)); - AssertEquals ("#02", "1.2345678901234567", 1.2345678901234567890.ToString ("r", _nfi)); - AssertEquals ("#03", "1.2345678901234567", 1.2345678901234567890.ToString ("R0", _nfi)); - AssertEquals ("#04", "1.2345678901234567", 1.2345678901234567890.ToString ("r0", _nfi)); - AssertEquals ("#05", "1.2345678901234567", 1.2345678901234567890.ToString ("R99", _nfi)); - AssertEquals ("#06", "1.2345678901234567", 1.2345678901234567890.ToString ("r99", _nfi)); - AssertEquals ("#07", "-1.7976931348623157E+308", Double.MinValue.ToString ("R")); - AssertEquals ("#08", "1.7976931348623157E+308", Double.MaxValue.ToString ("R")); - AssertEquals ("#09", "-1.7976931348623147E+308", (-1.7976931348623147E+308).ToString("R")); - AssertEquals ("#10", "-3.40282347E+38", Single.MinValue.ToString("R")); - AssertEquals ("#11", "3.40282347E+38", Single.MaxValue.ToString("R")); - } - - // Tests arithmetic overflow in double.ToString exposed by Bug #383531 - [Test] - public void TestToStringOverflow() - { - // Test all the possible double exponents with the maximal mantissa - long dblPattern = 0xfffffffffffff; // all 1s significand - - for (long exp = 0; exp < 4096; exp++) { - double val = BitConverter.Int64BitsToDouble((long)(dblPattern | (exp << 52))); - string strRes = val.ToString("R", NumberFormatInfo.InvariantInfo); - double rndTripVal = Double.Parse(strRes); - AssertEquals ("Iter#" + exp, val, rndTripVal); - } - } - - // Test17000 - Double and X - [Test] - [ExpectedException (typeof (FormatException))] - public void Test17000 () - { - AssertEquals ("#01", "", 0.0.ToString ("X99", _nfi)); - } - } -} +// +// MonoTests.System.NumberFormatterTest +// +// Authors: +// akiramei (mei@work.email.ne.jp) +// +// (C) 2005 akiramei +// + +using System; +using System.Globalization; +using System.Threading; + +using NUnit.Framework; + +namespace MonoTests.System +{ + [TestFixture] + public class NumberFormatterTest + { + CultureInfo old_culture; + NumberFormatInfo _nfi; + + [SetUp] + public void SetUp () + { + old_culture = Thread.CurrentThread.CurrentCulture; + Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US", false); + _nfi = NumberFormatInfo.InvariantInfo.Clone () as NumberFormatInfo; + } + + [TearDown] + public void TearDown () + { + Thread.CurrentThread.CurrentCulture = old_culture; + } + + // Test00000- Int32 and D + [Test] + public void Test00000 () + { + Assert.AreEqual ("0", 0.ToString ("D", _nfi), "#01"); + Assert.AreEqual ("0", 0.ToString ("d", _nfi), "#02"); + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("D", _nfi), "#03"); + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("d", _nfi), "#04"); + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("D", _nfi), "#05"); + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("d", _nfi), "#06"); + } + + [Test] + public void Test00001 () + { + Assert.AreEqual ("D ", 0.ToString ("D ", _nfi), "#01"); + Assert.AreEqual (" D", 0.ToString (" D", _nfi), "#02"); + Assert.AreEqual (" D ", 0.ToString (" D ", _nfi), "#03"); + } + + [Test] + public void Test00002 () + { + Assert.AreEqual ("-D ", (-1).ToString ("D ", _nfi), "#01"); + Assert.AreEqual ("- D", (-1).ToString (" D", _nfi), "#02"); + Assert.AreEqual ("- D ", (-1).ToString (" D ", _nfi), "#03"); + } + + [Test] + public void Test00003 () + { + Assert.AreEqual ("0", 0.ToString ("D0", _nfi), "#01"); + Assert.AreEqual ("0000000000", 0.ToString ("D10", _nfi), "#02"); + Assert.AreEqual ("00000000000", 0.ToString ("D11", _nfi), "#03"); + Assert.AreEqual ("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("D99", _nfi), "#04"); + Assert.AreEqual ("D100", 0.ToString ("D100", _nfi), "#05"); + } + + [Test] + public void Test00004 () + { + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("D0", _nfi), "#01"); + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("D10", _nfi), "#02"); + Assert.AreEqual ("02147483647", Int32.MaxValue.ToString ("D11", _nfi), "#03"); + Assert.AreEqual ("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002147483647", Int32.MaxValue.ToString ("D99", _nfi), "#04"); + Assert.AreEqual ("D12147483647", Int32.MaxValue.ToString ("D100", _nfi), "#05"); + } + + [Test] + public void Test00005 () + { + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("D0", _nfi), "#01"); + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("D10", _nfi), "#02"); + Assert.AreEqual ("-02147483648", Int32.MinValue.ToString ("D11", _nfi), "#03"); + Assert.AreEqual ("-000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002147483648", Int32.MinValue.ToString ("D99", _nfi), "#04"); + Assert.AreEqual ("-D12147483648", Int32.MinValue.ToString ("D100", _nfi), "#05"); + } + + [Test] + public void Test00006 () + { + Assert.AreEqual ("DF", 0.ToString ("DF", _nfi), "#01"); + Assert.AreEqual ("D0F", 0.ToString ("D0F", _nfi), "#02"); + Assert.AreEqual ("D0xF", 0.ToString ("D0xF", _nfi), "#03"); + } + + [Test] + public void Test00007 () + { + Assert.AreEqual ("DF", Int32.MaxValue.ToString ("DF", _nfi), "#01"); + Assert.AreEqual ("D2147483647F", Int32.MaxValue.ToString ("D0F", _nfi), "#02"); + Assert.AreEqual ("D2147483647xF", Int32.MaxValue.ToString ("D0xF", _nfi), "#03"); + } + + [Test] + public void Test00008 () + { + Assert.AreEqual ("-DF", Int32.MinValue.ToString ("DF", _nfi), "#01"); + Assert.AreEqual ("-D2147483648F", Int32.MinValue.ToString ("D0F", _nfi), "#02"); + Assert.AreEqual ("-D2147483648xF", Int32.MinValue.ToString ("D0xF", _nfi), "#03"); + } + + [Test] + public void Test00009 () + { + Assert.AreEqual ("00000000000", 0.ToString ("D0000000000000000000000000000000000000011", _nfi), "#01"); + Assert.AreEqual ("02147483647", Int32.MaxValue.ToString ("D0000000000000000000000000000000000000011", _nfi), "#02"); + Assert.AreEqual ("-02147483648", Int32.MinValue.ToString ("D0000000000000000000000000000000000000011", _nfi), "#03"); + } + + [Test] + public void Test00010 () + { + Assert.AreEqual ("+D", 0.ToString ("+D", _nfi), "#01"); + Assert.AreEqual ("D+", 0.ToString ("D+", _nfi), "#02"); + Assert.AreEqual ("+D+", 0.ToString ("+D+", _nfi), "#03"); + } + + [Test] + public void Test00011 () + { + Assert.AreEqual ("+D", Int32.MaxValue.ToString ("+D", _nfi), "#01"); + Assert.AreEqual ("D+", Int32.MaxValue.ToString ("D+", _nfi), "#02"); + Assert.AreEqual ("+D+", Int32.MaxValue.ToString ("+D+", _nfi), "#03"); + } + + [Test] + public void Test00012 () + { + Assert.AreEqual ("-+D", Int32.MinValue.ToString ("+D", _nfi), "#01"); + Assert.AreEqual ("-D+", Int32.MinValue.ToString ("D+", _nfi), "#02"); + Assert.AreEqual ("-+D+", Int32.MinValue.ToString ("+D+", _nfi), "#03"); + } + + [Test] + public void Test00013 () + { + Assert.AreEqual ("-D", 0.ToString ("-D", _nfi), "#01"); + Assert.AreEqual ("D-", 0.ToString ("D-", _nfi), "#02"); + Assert.AreEqual ("-D-", 0.ToString ("-D-", _nfi), "#03"); + } + + [Test] + public void Test00014 () + { + Assert.AreEqual ("-D", Int32.MaxValue.ToString ("-D", _nfi), "#01"); + Assert.AreEqual ("D-", Int32.MaxValue.ToString ("D-", _nfi), "#02"); + Assert.AreEqual ("-D-", Int32.MaxValue.ToString ("-D-", _nfi), "#03"); + } + + [Test] + public void Test00015 () + { + Assert.AreEqual ("--D", Int32.MinValue.ToString ("-D", _nfi), "#01"); + Assert.AreEqual ("-D-", Int32.MinValue.ToString ("D-", _nfi), "#02"); + Assert.AreEqual ("--D-", Int32.MinValue.ToString ("-D-", _nfi), "#03"); + } + + [Test] + public void Test00016 () + { + Assert.AreEqual ("D+0", 0.ToString ("D+0", _nfi), "#01"); + Assert.AreEqual ("D+2147483647", Int32.MaxValue.ToString ("D+0", _nfi), "#02"); + Assert.AreEqual ("-D+2147483648", Int32.MinValue.ToString ("D+0", _nfi), "#03"); + } + + [Test] + public void Test00017 () + { + Assert.AreEqual ("D+9", 0.ToString ("D+9", _nfi), "#01"); + Assert.AreEqual ("D+9", Int32.MaxValue.ToString ("D+9", _nfi), "#02"); + Assert.AreEqual ("-D+9", Int32.MinValue.ToString ("D+9", _nfi), "#03"); + } + + [Test] + public void Test00018 () + { + Assert.AreEqual ("D-9", 0.ToString ("D-9", _nfi), "#01"); + Assert.AreEqual ("D-9", Int32.MaxValue.ToString ("D-9", _nfi), "#02"); + Assert.AreEqual ("-D-9", Int32.MinValue.ToString ("D-9", _nfi), "#03"); + } + + [Test] + public void Test00019 () + { + Assert.AreEqual ("D0", 0.ToString ("D0,", _nfi), "#01"); + Assert.AreEqual ("D2147484", Int32.MaxValue.ToString ("D0,", _nfi), "#02"); + Assert.AreEqual ("-D2147484", Int32.MinValue.ToString ("D0,", _nfi), "#03"); + } + + [Test] + public void Test00020 () + { + Assert.AreEqual ("D0", 0.ToString ("D0.", _nfi), "#01"); + Assert.AreEqual ("D2147483647", Int32.MaxValue.ToString ("D0.", _nfi), "#02"); + Assert.AreEqual ("-D2147483648", Int32.MinValue.ToString ("D0.", _nfi), "#03"); + } + + [Test] + public void Test00021 () + { + Assert.AreEqual ("D0.0", 0.ToString ("D0.0", _nfi), "#01"); + Assert.AreEqual ("D2147483647.0", Int32.MaxValue.ToString ("D0.0", _nfi), "#02"); + Assert.AreEqual ("-D2147483648.0", Int32.MinValue.ToString ("D0.0", _nfi), "#03"); + } + + [Test] + public void Test00022 () + { + Assert.AreEqual ("D09", 0.ToString ("D0.9", _nfi), "#01"); + Assert.AreEqual ("D21474836479", Int32.MaxValue.ToString ("D0.9", _nfi), "#02"); + Assert.AreEqual ("-D21474836489", Int32.MinValue.ToString ("D0.9", _nfi), "#03"); + } + + // Test01000- Int32 and E + [Test] + public void Test01000 () + { + Assert.AreEqual ("0.000000E+000", 0.ToString ("E", _nfi), "#01"); + Assert.AreEqual ("0.000000e+000", 0.ToString ("e", _nfi), "#02"); + Assert.AreEqual ("-2.147484E+009", Int32.MinValue.ToString ("E", _nfi), "#03"); + Assert.AreEqual ("-2.147484e+009", Int32.MinValue.ToString ("e", _nfi), "#04"); + Assert.AreEqual ("2.147484E+009", Int32.MaxValue.ToString ("E", _nfi), "#05"); + Assert.AreEqual ("2.147484e+009", Int32.MaxValue.ToString ("e", _nfi), "#06"); + } + + [Test] + public void Test01001 () + { + Assert.AreEqual ("E ", 0.ToString ("E ", _nfi), "#01"); + Assert.AreEqual (" E", 0.ToString (" E", _nfi), "#02"); + Assert.AreEqual (" E ", 0.ToString (" E ", _nfi), "#03"); + } + + [Test] + public void Test01002 () + { + Assert.AreEqual ("-E ", (-1).ToString ("E ", _nfi), "#01"); + Assert.AreEqual ("- E", (-1).ToString (" E", _nfi), "#02"); + Assert.AreEqual ("- E ", (-1).ToString (" E ", _nfi), "#03"); + } + + [Test] + public void Test01003 () + { + Assert.AreEqual ("0E+000", 0.ToString ("E0", _nfi), "#01"); + Assert.AreEqual ("0.000000000E+000", 0.ToString ("E9", _nfi), "#02"); + Assert.AreEqual ("0.0000000000E+000", 0.ToString ("E10", _nfi), "#03"); + Assert.AreEqual ("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E+000", 0.ToString ("E99", _nfi), "#04"); + Assert.AreEqual ("E100", 0.ToString ("E100", _nfi), "#05"); + } + + [Test] + public void Test01004 () + { + Assert.AreEqual ("2E+009", Int32.MaxValue.ToString ("E0", _nfi), "#01"); + Assert.AreEqual ("2.147483647E+009", Int32.MaxValue.ToString ("E9", _nfi), "#02"); + Assert.AreEqual ("2.1474836470E+009", Int32.MaxValue.ToString ("E10", _nfi), "#03"); + Assert.AreEqual ("2.147483647000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E+009", Int32.MaxValue.ToString ("E99", _nfi), "#04"); + Assert.AreEqual ("E12147483647", Int32.MaxValue.ToString ("E100", _nfi), "#05"); + } + + [Test] + public void Test01005 () + { + Assert.AreEqual ("-2E+009", Int32.MinValue.ToString ("E0", _nfi), "#01"); + Assert.AreEqual ("-2.147483648E+009", Int32.MinValue.ToString ("E9", _nfi), "#02"); + Assert.AreEqual ("-2.1474836480E+009", Int32.MinValue.ToString ("E10", _nfi), "#03"); + Assert.AreEqual ("-2.147483648000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E+009", Int32.MinValue.ToString ("E99", _nfi), "#04"); + Assert.AreEqual ("-E12147483648", Int32.MinValue.ToString ("E100", _nfi), "#05"); + } + + [Test] + public void Test01006 () + { + Assert.AreEqual ("EF", 0.ToString ("EF", _nfi), "#01"); + Assert.AreEqual ("E0F", 0.ToString ("E0F", _nfi), "#02"); + Assert.AreEqual ("E0xF", 0.ToString ("E0xF", _nfi), "#03"); + } + + [Test] + public void Test01007 () + { + Assert.AreEqual ("EF", Int32.MaxValue.ToString ("EF", _nfi), "#01"); + Assert.AreEqual ("E0F", Int32.MaxValue.ToString ("E0F", _nfi), "#02"); + Assert.AreEqual ("E0xF", Int32.MaxValue.ToString ("E0xF", _nfi), "#03"); + } + + [Test] + public void Test01008 () + { + Assert.AreEqual ("-EF", Int32.MinValue.ToString ("EF", _nfi), "#01"); + Assert.AreEqual ("E0F", Int32.MinValue.ToString ("E0F", _nfi), "#02"); + Assert.AreEqual ("E0xF", Int32.MinValue.ToString ("E0xF", _nfi), "#03"); + } + + [Test] + public void Test01009 () + { + Assert.AreEqual ("0.0000000000E+000", 0.ToString ("E0000000000000000000000000000000000000010", _nfi), "#01"); + Assert.AreEqual ("2.1474836470E+009", Int32.MaxValue.ToString ("E0000000000000000000000000000000000000010", _nfi), "#02"); + Assert.AreEqual ("-2.1474836480E+009", Int32.MinValue.ToString ("E0000000000000000000000000000000000000010", _nfi), "#03"); + } + + [Test] + public void Test01010 () + { + Assert.AreEqual ("+E", 0.ToString ("+E", _nfi), "#01"); + Assert.AreEqual ("E+", 0.ToString ("E+", _nfi), "#02"); + Assert.AreEqual ("+E+", 0.ToString ("+E+", _nfi), "#03"); + } + + [Test] + public void Test01011 () + { + Assert.AreEqual ("+E", Int32.MaxValue.ToString ("+E", _nfi), "#01"); + Assert.AreEqual ("E+", Int32.MaxValue.ToString ("E+", _nfi), "#02"); + Assert.AreEqual ("+E+", Int32.MaxValue.ToString ("+E+", _nfi), "#03"); + } + + [Test] + public void Test01012 () + { + Assert.AreEqual ("-+E", Int32.MinValue.ToString ("+E", _nfi), "#01"); + Assert.AreEqual ("-E+", Int32.MinValue.ToString ("E+", _nfi), "#02"); + Assert.AreEqual ("-+E+", Int32.MinValue.ToString ("+E+", _nfi), "#03"); + } + + [Test] + public void Test01013 () + { + Assert.AreEqual ("-E", 0.ToString ("-E", _nfi), "#01"); + Assert.AreEqual ("E-", 0.ToString ("E-", _nfi), "#02"); + Assert.AreEqual ("-E-", 0.ToString ("-E-", _nfi), "#03"); + } + + [Test] + public void Test01014 () + { + Assert.AreEqual ("-E", Int32.MaxValue.ToString ("-E", _nfi), "#01"); + Assert.AreEqual ("E-", Int32.MaxValue.ToString ("E-", _nfi), "#02"); + Assert.AreEqual ("-E-", Int32.MaxValue.ToString ("-E-", _nfi), "#03"); + } + + [Test] + public void Test01015 () + { + Assert.AreEqual ("--E", Int32.MinValue.ToString ("-E", _nfi), "#01"); + Assert.AreEqual ("-E-", Int32.MinValue.ToString ("E-", _nfi), "#02"); + Assert.AreEqual ("--E-", Int32.MinValue.ToString ("-E-", _nfi), "#03"); + } + + [Test] + public void Test01016 () + { + Assert.AreEqual ("E+0", 0.ToString ("E+0", _nfi), "#01"); + Assert.AreEqual ("E+0", Int32.MaxValue.ToString ("E+0", _nfi), "#02"); + Assert.AreEqual ("E+0", Int32.MinValue.ToString ("E+0", _nfi), "#03"); + } + + [Test] + public void Test01017 () + { + Assert.AreEqual ("E+9", 0.ToString ("E+9", _nfi), "#01"); + Assert.AreEqual ("E+9", Int32.MaxValue.ToString ("E+9", _nfi), "#02"); + Assert.AreEqual ("-E+9", Int32.MinValue.ToString ("E+9", _nfi), "#03"); + } + + [Test] + public void Test01018 () + { + Assert.AreEqual ("E-9", 0.ToString ("E-9", _nfi), "#01"); + Assert.AreEqual ("E-9", Int32.MaxValue.ToString ("E-9", _nfi), "#02"); + Assert.AreEqual ("-E-9", Int32.MinValue.ToString ("E-9", _nfi), "#03"); + } + + [Test] + public void Test01019 () + { + Assert.AreEqual ("E0", 0.ToString ("E0,", _nfi), "#01"); + Assert.AreEqual ("E0", Int32.MaxValue.ToString ("E0,", _nfi), "#02"); + Assert.AreEqual ("E0", Int32.MinValue.ToString ("E0,", _nfi), "#03"); + } + + [Test] + public void Test01020 () + { + Assert.AreEqual ("E0", 0.ToString ("E0.", _nfi), "#01"); + Assert.AreEqual ("E0", Int32.MaxValue.ToString ("E0.", _nfi), "#02"); + Assert.AreEqual ("E0", Int32.MinValue.ToString ("E0.", _nfi), "#03"); + } + + [Test] + public void Test01021 () + { + Assert.AreEqual ("E0.0", 0.ToString ("E0.0", _nfi), "#01"); + Assert.AreEqual ("E10.2", Int32.MaxValue.ToString ("E0.0", _nfi), "#02"); + Assert.AreEqual ("-E10.2", Int32.MinValue.ToString ("E0.0", _nfi), "#03"); + } + + [Test] + public void Test01022 () + { + Assert.AreEqual ("E09", 0.ToString ("E0.9", _nfi), "#01"); + Assert.AreEqual ("E09", Int32.MaxValue.ToString ("E0.9", _nfi), "#02"); + Assert.AreEqual ("E09", Int32.MinValue.ToString ("E0.9", _nfi), "#03"); + } + + [Test] + public void Test01023 () + { + Assert.AreEqual ("9.999999E+007", 99999990.ToString ("E", _nfi), "#01"); + Assert.AreEqual ("9.999999E+007", 99999991.ToString ("E", _nfi), "#02"); + Assert.AreEqual ("9.999999E+007", 99999992.ToString ("E", _nfi), "#03"); + Assert.AreEqual ("9.999999E+007", 99999993.ToString ("E", _nfi), "#04"); + Assert.AreEqual ("9.999999E+007", 99999994.ToString ("E", _nfi), "#05"); + Assert.AreEqual ("1.000000E+008", 99999995.ToString ("E", _nfi), "#06"); + Assert.AreEqual ("1.000000E+008", 99999996.ToString ("E", _nfi), "#07"); + Assert.AreEqual ("1.000000E+008", 99999997.ToString ("E", _nfi), "#08"); + Assert.AreEqual ("1.000000E+008", 99999998.ToString ("E", _nfi), "#09"); + Assert.AreEqual ("1.000000E+008", 99999999.ToString ("E", _nfi), "#10"); + } + + [Test] + public void Test01024 () + { + Assert.AreEqual ("-9.999999E+007", (-99999990).ToString ("E", _nfi), "#01"); + Assert.AreEqual ("-9.999999E+007", (-99999991).ToString ("E", _nfi), "#02"); + Assert.AreEqual ("-9.999999E+007", (-99999992).ToString ("E", _nfi), "#03"); + Assert.AreEqual ("-9.999999E+007", (-99999993).ToString ("E", _nfi), "#04"); + Assert.AreEqual ("-9.999999E+007", (-99999994).ToString ("E", _nfi), "#05"); + Assert.AreEqual ("-1.000000E+008", (-99999995).ToString ("E", _nfi), "#06"); + Assert.AreEqual ("-1.000000E+008", (-99999996).ToString ("E", _nfi), "#07"); + Assert.AreEqual ("-1.000000E+008", (-99999997).ToString ("E", _nfi), "#08"); + Assert.AreEqual ("-1.000000E+008", (-99999998).ToString ("E", _nfi), "#09"); + Assert.AreEqual ("-1.000000E+008", (-99999999).ToString ("E", _nfi), "#10"); + } + + [Test] + public void Test01025 () + { + Assert.AreEqual ("9.999998E+007", 99999980.ToString ("E", _nfi), "#01"); + Assert.AreEqual ("9.999998E+007", 99999981.ToString ("E", _nfi), "#02"); + Assert.AreEqual ("9.999998E+007", 99999982.ToString ("E", _nfi), "#03"); + Assert.AreEqual ("9.999998E+007", 99999983.ToString ("E", _nfi), "#04"); + Assert.AreEqual ("9.999998E+007", 99999984.ToString ("E", _nfi), "#05"); + Assert.AreEqual ("9.999999E+007", 99999985.ToString ("E", _nfi), "#06"); + Assert.AreEqual ("9.999999E+007", 99999986.ToString ("E", _nfi), "#07"); + Assert.AreEqual ("9.999999E+007", 99999987.ToString ("E", _nfi), "#08"); + Assert.AreEqual ("9.999999E+007", 99999988.ToString ("E", _nfi), "#09"); + Assert.AreEqual ("9.999999E+007", 99999989.ToString ("E", _nfi), "#10"); + } + + [Test] + public void Test01026 () + { + Assert.AreEqual ("-9.999998E+007", (-99999980).ToString ("E", _nfi), "#01"); + Assert.AreEqual ("-9.999998E+007", (-99999981).ToString ("E", _nfi), "#02"); + Assert.AreEqual ("-9.999998E+007", (-99999982).ToString ("E", _nfi), "#03"); + Assert.AreEqual ("-9.999998E+007", (-99999983).ToString ("E", _nfi), "#04"); + Assert.AreEqual ("-9.999998E+007", (-99999984).ToString ("E", _nfi), "#05"); + Assert.AreEqual ("-9.999999E+007", (-99999985).ToString ("E", _nfi), "#06"); + Assert.AreEqual ("-9.999999E+007", (-99999986).ToString ("E", _nfi), "#07"); + Assert.AreEqual ("-9.999999E+007", (-99999987).ToString ("E", _nfi), "#08"); + Assert.AreEqual ("-9.999999E+007", (-99999988).ToString ("E", _nfi), "#09"); + Assert.AreEqual ("-9.999999E+007", (-99999989).ToString ("E", _nfi), "#10"); + } + + [Test] + public void Test01027 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberDecimalSeparator = "#"; + Assert.AreEqual ("-1#000000E+008", (-99999999).ToString ("E", nfi), "#01"); + } + + [Test] + public void Test01028 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "+"; + nfi.PositiveSign = "-"; + + Assert.AreEqual ("1.000000E-000", 1.ToString ("E", nfi), "#01"); + Assert.AreEqual ("0.000000E-000", 0.ToString ("E", nfi), "#02"); + Assert.AreEqual ("+1.000000E-000", (-1).ToString ("E", nfi), "#03"); + } + + // Test02000- Int32 and F + [Test] + public void Test02000 () + { + Assert.AreEqual ("0.00", 0.ToString ("F", _nfi), "#01"); + Assert.AreEqual ("0.00", 0.ToString ("f", _nfi), "#02"); + Assert.AreEqual ("-2147483648.00", Int32.MinValue.ToString ("F", _nfi), "#03"); + Assert.AreEqual ("-2147483648.00", Int32.MinValue.ToString ("f", _nfi), "#04"); + Assert.AreEqual ("2147483647.00", Int32.MaxValue.ToString ("F", _nfi), "#05"); + Assert.AreEqual ("2147483647.00", Int32.MaxValue.ToString ("f", _nfi), "#06"); + } + + [Test] + public void Test02001 () + { + Assert.AreEqual ("F ", 0.ToString ("F ", _nfi), "#01"); + Assert.AreEqual (" F", 0.ToString (" F", _nfi), "#02"); + Assert.AreEqual (" F ", 0.ToString (" F ", _nfi), "#03"); + } + + [Test] + public void Test02002 () + { + Assert.AreEqual ("-F ", (-1).ToString ("F ", _nfi), "#01"); + Assert.AreEqual ("- F", (-1).ToString (" F", _nfi), "#02"); + Assert.AreEqual ("- F ", (-1).ToString (" F ", _nfi), "#03"); + } + + [Test] + public void Test02003 () + { + Assert.AreEqual ("0", 0.ToString ("F0", _nfi), "#01"); + Assert.AreEqual ("0.000000000", 0.ToString ("F9", _nfi), "#02"); + Assert.AreEqual ("0.0000000000", 0.ToString ("F10", _nfi), "#03"); + Assert.AreEqual ("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("F99", _nfi), "#04"); + Assert.AreEqual ("F100", 0.ToString ("F100", _nfi), "#05"); + } + + [Test] + public void Test02004 () + { + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("F0", _nfi), "#01"); + Assert.AreEqual ("2147483647.000000000", Int32.MaxValue.ToString ("F9", _nfi), "#02"); + Assert.AreEqual ("2147483647.0000000000", Int32.MaxValue.ToString ("F10", _nfi), "#03"); + Assert.AreEqual ("2147483647.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Int32.MaxValue.ToString ("F99", _nfi), "#04"); + Assert.AreEqual ("F12147483647", Int32.MaxValue.ToString ("F100", _nfi), "#05"); + } + + [Test] + public void Test02005 () + { + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("F0", _nfi), "#01"); + Assert.AreEqual ("-2147483648.000000000", Int32.MinValue.ToString ("F9", _nfi), "#02"); + Assert.AreEqual ("-2147483648.0000000000", Int32.MinValue.ToString ("F10", _nfi), "#03"); + Assert.AreEqual ("-2147483648.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Int32.MinValue.ToString ("F99", _nfi), "#04"); + Assert.AreEqual ("-F12147483648", Int32.MinValue.ToString ("F100", _nfi), "#05"); + } + + [Test] + public void Test02006 () + { + Assert.AreEqual ("FF", 0.ToString ("FF", _nfi), "#01"); + Assert.AreEqual ("F0F", 0.ToString ("F0F", _nfi), "#02"); + Assert.AreEqual ("F0xF", 0.ToString ("F0xF", _nfi), "#03"); + } + + [Test] + public void Test02007 () + { + Assert.AreEqual ("FF", Int32.MaxValue.ToString ("FF", _nfi), "#01"); + Assert.AreEqual ("F2147483647F", Int32.MaxValue.ToString ("F0F", _nfi), "#02"); + Assert.AreEqual ("F2147483647xF", Int32.MaxValue.ToString ("F0xF", _nfi), "#03"); + } + + [Test] + public void Test02008 () + { + Assert.AreEqual ("-FF", Int32.MinValue.ToString ("FF", _nfi), "#01"); + Assert.AreEqual ("-F2147483648F", Int32.MinValue.ToString ("F0F", _nfi), "#02"); + Assert.AreEqual ("-F2147483648xF", Int32.MinValue.ToString ("F0xF", _nfi), "#03"); + } + + [Test] + public void Test02009 () + { + Assert.AreEqual ("0.0000000000", 0.ToString ("F0000000000000000000000000000000000000010", _nfi), "#01"); + Assert.AreEqual ("2147483647.0000000000", Int32.MaxValue.ToString ("F0000000000000000000000000000000000000010", _nfi), "#02"); + Assert.AreEqual ("-2147483648.0000000000", Int32.MinValue.ToString ("F0000000000000000000000000000000000000010", _nfi), "#03"); + } + + [Test] + public void Test02010 () + { + Assert.AreEqual ("+F", 0.ToString ("+F", _nfi), "#01"); + Assert.AreEqual ("F+", 0.ToString ("F+", _nfi), "#02"); + Assert.AreEqual ("+F+", 0.ToString ("+F+", _nfi), "#03"); + } + + [Test] + public void Test02011 () + { + Assert.AreEqual ("+F", Int32.MaxValue.ToString ("+F", _nfi), "#01"); + Assert.AreEqual ("F+", Int32.MaxValue.ToString ("F+", _nfi), "#02"); + Assert.AreEqual ("+F+", Int32.MaxValue.ToString ("+F+", _nfi), "#03"); + } + + [Test] + public void Test02012 () + { + Assert.AreEqual ("-+F", Int32.MinValue.ToString ("+F", _nfi), "#01"); + Assert.AreEqual ("-F+", Int32.MinValue.ToString ("F+", _nfi), "#02"); + Assert.AreEqual ("-+F+", Int32.MinValue.ToString ("+F+", _nfi), "#03"); + } + + [Test] + public void Test02013 () + { + Assert.AreEqual ("-F", 0.ToString ("-F", _nfi), "#01"); + Assert.AreEqual ("F-", 0.ToString ("F-", _nfi), "#02"); + Assert.AreEqual ("-F-", 0.ToString ("-F-", _nfi), "#03"); + } + + [Test] + public void Test02014 () + { + Assert.AreEqual ("-F", Int32.MaxValue.ToString ("-F", _nfi), "#01"); + Assert.AreEqual ("F-", Int32.MaxValue.ToString ("F-", _nfi), "#02"); + Assert.AreEqual ("-F-", Int32.MaxValue.ToString ("-F-", _nfi), "#03"); + } + + [Test] + public void Test02015 () + { + Assert.AreEqual ("--F", Int32.MinValue.ToString ("-F", _nfi), "#01"); + Assert.AreEqual ("-F-", Int32.MinValue.ToString ("F-", _nfi), "#02"); + Assert.AreEqual ("--F-", Int32.MinValue.ToString ("-F-", _nfi), "#03"); + } + + [Test] + public void Test02016 () + { + Assert.AreEqual ("F+0", 0.ToString ("F+0", _nfi), "#01"); + Assert.AreEqual ("F+2147483647", Int32.MaxValue.ToString ("F+0", _nfi), "#02"); + Assert.AreEqual ("-F+2147483648", Int32.MinValue.ToString ("F+0", _nfi), "#03"); + } + + [Test] + public void Test02017 () + { + Assert.AreEqual ("F+9", 0.ToString ("F+9", _nfi), "#01"); + Assert.AreEqual ("F+9", Int32.MaxValue.ToString ("F+9", _nfi), "#02"); + Assert.AreEqual ("-F+9", Int32.MinValue.ToString ("F+9", _nfi), "#03"); + } + + [Test] + public void Test02018 () + { + Assert.AreEqual ("F-9", 0.ToString ("F-9", _nfi), "#01"); + Assert.AreEqual ("F-9", Int32.MaxValue.ToString ("F-9", _nfi), "#02"); + Assert.AreEqual ("-F-9", Int32.MinValue.ToString ("F-9", _nfi), "#03"); + } + + [Test] + public void Test02019 () + { + Assert.AreEqual ("F0", 0.ToString ("F0,", _nfi), "#01"); + Assert.AreEqual ("F2147484", Int32.MaxValue.ToString ("F0,", _nfi), "#02"); + Assert.AreEqual ("-F2147484", Int32.MinValue.ToString ("F0,", _nfi), "#03"); + } + + [Test] + public void Test02020 () + { + Assert.AreEqual ("F0", 0.ToString ("F0.", _nfi), "#01"); + Assert.AreEqual ("F2147483647", Int32.MaxValue.ToString ("F0.", _nfi), "#02"); + Assert.AreEqual ("-F2147483648", Int32.MinValue.ToString ("F0.", _nfi), "#03"); + } + + [Test] + public void Test02021 () + { + Assert.AreEqual ("F0.0", 0.ToString ("F0.0", _nfi), "#01"); + Assert.AreEqual ("F2147483647.0", Int32.MaxValue.ToString ("F0.0", _nfi), "#02"); + Assert.AreEqual ("-F2147483648.0", Int32.MinValue.ToString ("F0.0", _nfi), "#03"); + } + + [Test] + public void Test02022 () + { + Assert.AreEqual ("F09", 0.ToString ("F0.9", _nfi), "#01"); + Assert.AreEqual ("F21474836479", Int32.MaxValue.ToString ("F0.9", _nfi), "#02"); + Assert.AreEqual ("-F21474836489", Int32.MinValue.ToString ("F0.9", _nfi), "#03"); + } + + [Test] + public void Test02023 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberDecimalDigits = 0; + Assert.AreEqual ("0", 0.ToString ("F", nfi), "#01"); + nfi.NumberDecimalDigits = 1; + Assert.AreEqual ("0.0", 0.ToString ("F", nfi), "#02"); + nfi.NumberDecimalDigits = 99; + Assert.AreEqual ("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("F", nfi), "#03"); + } + + [Test] + public void Test02024 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = ""; + Assert.AreEqual ("2147483648.00", Int32.MinValue.ToString ("F", nfi), "#01"); + nfi.NegativeSign = "-"; + Assert.AreEqual ("-2147483648.00", Int32.MinValue.ToString ("F", nfi), "#02"); + nfi.NegativeSign = "+"; + Assert.AreEqual ("+2147483648.00", Int32.MinValue.ToString ("F", nfi), "#03"); + nfi.NegativeSign = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + Assert.AreEqual ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ2147483648.00", Int32.MinValue.ToString ("F", nfi), "#04"); + } + + [Test] + public void Test02025 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "-"; + nfi.PositiveSign = "+"; + Assert.AreEqual ("-1.00", (-1).ToString ("F", nfi), "#01"); + Assert.AreEqual ("0.00", 0.ToString ("F", nfi), "#02"); + Assert.AreEqual ("1.00",1.ToString ("F", nfi), "#03"); + } + + [Test] + public void Test02026 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "+"; + nfi.PositiveSign = "-"; + Assert.AreEqual ("+1.00", (-1).ToString ("F", nfi), "#01"); + Assert.AreEqual ("0.00", 0.ToString ("F", nfi), "#02"); + Assert.AreEqual ("1.00",1.ToString ("F", nfi), "#03"); + } + + [Test] + public void Test02027 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberDecimalSeparator = "#"; + Assert.AreEqual ("1#00",1.ToString ("F", nfi), "#01"); + } + + // Test03000 - Int32 and G + [Test] + public void Test03000 () + { + Assert.AreEqual ("0", 0.ToString ("G", _nfi), "#01"); + Assert.AreEqual ("0", 0.ToString ("g", _nfi), "#02"); + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("G", _nfi), "#03"); + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("g", _nfi), "#04"); + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("G", _nfi), "#05"); + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("g", _nfi), "#06"); + } + + [Test] + public void Test03001 () + { + Assert.AreEqual ("G ", 0.ToString ("G ", _nfi), "#01"); + Assert.AreEqual (" G", 0.ToString (" G", _nfi), "#02"); + Assert.AreEqual (" G ", 0.ToString (" G ", _nfi), "#03"); + } + + [Test] + public void Test03002 () + { + Assert.AreEqual ("-G ", (-1).ToString ("G ", _nfi), "#01"); + Assert.AreEqual ("- G", (-1).ToString (" G", _nfi), "#02"); + Assert.AreEqual ("- G ", (-1).ToString (" G ", _nfi), "#03"); + } + + [Test] + public void Test03003 () + { + Assert.AreEqual ("0", 0.ToString ("G0", _nfi), "#01"); + Assert.AreEqual ("0", 0.ToString ("G9", _nfi), "#02"); + Assert.AreEqual ("0", 0.ToString ("G10", _nfi), "#03"); + Assert.AreEqual ("0", 0.ToString ("G99", _nfi), "#04"); + Assert.AreEqual ("G100", 0.ToString ("G100", _nfi), "#05"); + } + + [Test] + public void Test03004 () + { + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("G0", _nfi), "#01"); + Assert.AreEqual ("2.14748365E+09", Int32.MaxValue.ToString ("G9", _nfi), "#02"); + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("G10", _nfi), "#03"); + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("G99", _nfi), "#04"); + Assert.AreEqual ("G12147483647", Int32.MaxValue.ToString ("G100", _nfi), "#05"); + } + + [Test] + public void Test03005 () + { + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("G0", _nfi), "#01"); + Assert.AreEqual ("-2.14748365E+09", Int32.MinValue.ToString ("G9", _nfi), "#02"); + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("G10", _nfi), "#03"); + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("G99", _nfi), "#04"); + Assert.AreEqual ("-G12147483648", Int32.MinValue.ToString ("G100", _nfi), "#05"); + } + + [Test] + public void Test03006 () + { + Assert.AreEqual ("GF", 0.ToString ("GF", _nfi), "#01"); + Assert.AreEqual ("G0F", 0.ToString ("G0F", _nfi), "#02"); + Assert.AreEqual ("G0xF", 0.ToString ("G0xF", _nfi), "#03"); + } + + [Test] + public void Test03007 () + { + Assert.AreEqual ("GF", Int32.MaxValue.ToString ("GF", _nfi), "#01"); + Assert.AreEqual ("G2147483647F", Int32.MaxValue.ToString ("G0F", _nfi), "#02"); + Assert.AreEqual ("G2147483647xF", Int32.MaxValue.ToString ("G0xF", _nfi), "#03"); + } + + [Test] + public void Test03008 () + { + Assert.AreEqual ("-GF", Int32.MinValue.ToString ("GF", _nfi), "#01"); + Assert.AreEqual ("-G2147483648F", Int32.MinValue.ToString ("G0F", _nfi), "#02"); + Assert.AreEqual ("-G2147483648xF", Int32.MinValue.ToString ("G0xF", _nfi), "#03"); + } + + [Test] + public void Test03009 () + { + Assert.AreEqual ("0", 0.ToString ("G0000000000000000000000000000000000000010", _nfi), "#01"); + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("G0000000000000000000000000000000000000010", _nfi), "#02"); + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("G0000000000000000000000000000000000000010", _nfi), "#03"); + } + + [Test] + public void Test03010 () + { + Assert.AreEqual ("+G", 0.ToString ("+G", _nfi), "#01"); + Assert.AreEqual ("G+", 0.ToString ("G+", _nfi), "#02"); + Assert.AreEqual ("+G+", 0.ToString ("+G+", _nfi), "#03"); + } + + [Test] + public void Test03011 () + { + Assert.AreEqual ("+G", Int32.MaxValue.ToString ("+G", _nfi), "#01"); + Assert.AreEqual ("G+", Int32.MaxValue.ToString ("G+", _nfi), "#02"); + Assert.AreEqual ("+G+", Int32.MaxValue.ToString ("+G+", _nfi), "#03"); + } + + [Test] + public void Test03012 () + { + Assert.AreEqual ("-+G", Int32.MinValue.ToString ("+G", _nfi), "#01"); + Assert.AreEqual ("-G+", Int32.MinValue.ToString ("G+", _nfi), "#02"); + Assert.AreEqual ("-+G+", Int32.MinValue.ToString ("+G+", _nfi), "#03"); + } + + [Test] + public void Test03013 () + { + Assert.AreEqual ("-G", 0.ToString ("-G", _nfi), "#01"); + Assert.AreEqual ("G-", 0.ToString ("G-", _nfi), "#02"); + Assert.AreEqual ("-G-", 0.ToString ("-G-", _nfi), "#03"); + } + + [Test] + public void Test03014 () + { + Assert.AreEqual ("-G", Int32.MaxValue.ToString ("-G", _nfi), "#01"); + Assert.AreEqual ("G-", Int32.MaxValue.ToString ("G-", _nfi), "#02"); + Assert.AreEqual ("-G-", Int32.MaxValue.ToString ("-G-", _nfi), "#03"); + } + + [Test] + public void Test03015 () + { + Assert.AreEqual ("--G", Int32.MinValue.ToString ("-G", _nfi), "#01"); + Assert.AreEqual ("-G-", Int32.MinValue.ToString ("G-", _nfi), "#02"); + Assert.AreEqual ("--G-", Int32.MinValue.ToString ("-G-", _nfi), "#03"); + } + + [Test] + public void Test03016 () + { + Assert.AreEqual ("G+0", 0.ToString ("G+0", _nfi), "#01"); + Assert.AreEqual ("G+2147483647", Int32.MaxValue.ToString ("G+0", _nfi), "#02"); + Assert.AreEqual ("-G+2147483648", Int32.MinValue.ToString ("G+0", _nfi), "#03"); + } + + [Test] + public void Test03017 () + { + Assert.AreEqual ("G+9", 0.ToString ("G+9", _nfi), "#01"); + Assert.AreEqual ("G+9", Int32.MaxValue.ToString ("G+9", _nfi), "#02"); + Assert.AreEqual ("-G+9", Int32.MinValue.ToString ("G+9", _nfi), "#03"); + } + + [Test] + public void Test03018 () + { + Assert.AreEqual ("G-9", 0.ToString ("G-9", _nfi), "#01"); + Assert.AreEqual ("G-9", Int32.MaxValue.ToString ("G-9", _nfi), "#02"); + Assert.AreEqual ("-G-9", Int32.MinValue.ToString ("G-9", _nfi), "#03"); + } + + [Test] + public void Test03019 () + { + Assert.AreEqual ("G0", 0.ToString ("G0,", _nfi), "#01"); + Assert.AreEqual ("G2147484", Int32.MaxValue.ToString ("G0,", _nfi), "#02"); + Assert.AreEqual ("-G2147484", Int32.MinValue.ToString ("G0,", _nfi), "#03"); + } + + [Test] + public void Test03020 () + { + Assert.AreEqual ("G0", 0.ToString ("G0.", _nfi), "#01"); + Assert.AreEqual ("G2147483647", Int32.MaxValue.ToString ("G0.", _nfi), "#02"); + Assert.AreEqual ("-G2147483648", Int32.MinValue.ToString ("G0.", _nfi), "#03"); + } + + [Test] + public void Test03021 () + { + Assert.AreEqual ("G0.0", 0.ToString ("G0.0", _nfi), "#01"); + Assert.AreEqual ("G2147483647.0", Int32.MaxValue.ToString ("G0.0", _nfi), "#02"); + Assert.AreEqual ("-G2147483648.0", Int32.MinValue.ToString ("G0.0", _nfi), "#03"); + } + + [Test] + public void Test03022 () + { + Assert.AreEqual ("G09", 0.ToString ("G0.9", _nfi), "#01"); + Assert.AreEqual ("G21474836479", Int32.MaxValue.ToString ("G0.9", _nfi), "#02"); + Assert.AreEqual ("-G21474836489", Int32.MinValue.ToString ("G0.9", _nfi), "#03"); + } + + [Test] + public void Test03023 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberDecimalDigits = 0; + Assert.AreEqual ("0", 0.ToString ("G", nfi), "#01"); + nfi.NumberDecimalDigits = 1; + Assert.AreEqual ("0", 0.ToString ("G", nfi), "#02"); + nfi.NumberDecimalDigits = 99; + Assert.AreEqual ("0", 0.ToString ("G", nfi), "#03"); + } + + [Test] + public void Test03024 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = ""; + Assert.AreEqual ("2147483648", Int32.MinValue.ToString ("G", nfi), "#01"); + nfi.NegativeSign = "-"; + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("G", nfi), "#02"); + nfi.NegativeSign = "+"; + Assert.AreEqual ("+2147483648", Int32.MinValue.ToString ("G", nfi), "#03"); + nfi.NegativeSign = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + Assert.AreEqual ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ2147483648", Int32.MinValue.ToString ("G", nfi), "#04"); + } + + [Test] + public void Test03025 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "-"; + nfi.PositiveSign = "+"; + Assert.AreEqual ("-1", (-1).ToString ("G", nfi), "#01"); + Assert.AreEqual ("0", 0.ToString ("G", nfi), "#02"); + Assert.AreEqual ("1",1.ToString ("G", nfi), "#03"); + } + + [Test] + public void Test03026 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "+"; + nfi.PositiveSign = "-"; + Assert.AreEqual ("+1", (-1).ToString ("G", nfi), "#01"); + Assert.AreEqual ("0", 0.ToString ("G", nfi), "#02"); + Assert.AreEqual ("1",1.ToString ("G", nfi), "#03"); + } + + [Test] + public void Test03027 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberDecimalSeparator = "#"; + Assert.AreEqual ("1#2E+02",123.ToString ("G2", nfi), "#01"); + } + + // Test04000 - Int32 and N + [Test] + public void Test04000 () + { + Assert.AreEqual ("0.00", 0.ToString ("N", _nfi), "#01"); + Assert.AreEqual ("0.00", 0.ToString ("n", _nfi), "#02"); + Assert.AreEqual ("-2,147,483,648.00", Int32.MinValue.ToString ("N", _nfi), "#03"); + Assert.AreEqual ("-2,147,483,648.00", Int32.MinValue.ToString ("n", _nfi), "#04"); + Assert.AreEqual ("2,147,483,647.00", Int32.MaxValue.ToString ("N", _nfi), "#05"); + Assert.AreEqual ("2,147,483,647.00", Int32.MaxValue.ToString ("n", _nfi), "#06"); + } + + [Test] + public void Test04001 () + { + Assert.AreEqual ("N ", 0.ToString ("N ", _nfi), "#01"); + Assert.AreEqual (" N", 0.ToString (" N", _nfi), "#02"); + Assert.AreEqual (" N ", 0.ToString (" N ", _nfi), "#03"); + } + + [Test] + public void Test04002 () + { + Assert.AreEqual ("-N ", (-1).ToString ("N ", _nfi), "#01"); + Assert.AreEqual ("- N", (-1).ToString (" N", _nfi), "#02"); + Assert.AreEqual ("- N ", (-1).ToString (" N ", _nfi), "#03"); + } + + [Test] + public void Test04003 () + { + Assert.AreEqual ("0", 0.ToString ("N0", _nfi), "#01"); + Assert.AreEqual ("0.000000000", 0.ToString ("N9", _nfi), "#02"); + Assert.AreEqual ("0.0000000000", 0.ToString ("N10", _nfi), "#03"); + Assert.AreEqual ("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("N99", _nfi), "#04"); + Assert.AreEqual ("N100", 0.ToString ("N100", _nfi), "#05"); + } + + [Test] + public void Test04004 () + { + Assert.AreEqual ("2,147,483,647", Int32.MaxValue.ToString ("N0", _nfi), "#01"); + Assert.AreEqual ("2,147,483,647.000000000", Int32.MaxValue.ToString ("N9", _nfi), "#02"); + Assert.AreEqual ("2,147,483,647.0000000000", Int32.MaxValue.ToString ("N10", _nfi), "#03"); + Assert.AreEqual ("2,147,483,647.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Int32.MaxValue.ToString ("N99", _nfi), "#04"); + Assert.AreEqual ("N12147483647", Int32.MaxValue.ToString ("N100", _nfi), "#05"); + } + + [Test] + public void Test04005 () + { + Assert.AreEqual ("-2,147,483,648", Int32.MinValue.ToString ("N0", _nfi), "#01"); + Assert.AreEqual ("-2,147,483,648.000000000", Int32.MinValue.ToString ("N9", _nfi), "#02"); + Assert.AreEqual ("-2,147,483,648.0000000000", Int32.MinValue.ToString ("N10", _nfi), "#03"); + Assert.AreEqual ("-2,147,483,648.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Int32.MinValue.ToString ("N99", _nfi), "#04"); + Assert.AreEqual ("-N12147483648", Int32.MinValue.ToString ("N100", _nfi), "#05"); + } + + [Test] + public void Test04006 () + { + Assert.AreEqual ("NF", 0.ToString ("NF", _nfi), "#01"); + Assert.AreEqual ("N0F", 0.ToString ("N0F", _nfi), "#02"); + Assert.AreEqual ("N0xF", 0.ToString ("N0xF", _nfi), "#03"); + } + + [Test] + public void Test04007 () + { + Assert.AreEqual ("NF", Int32.MaxValue.ToString ("NF", _nfi), "#01"); + Assert.AreEqual ("N2147483647F", Int32.MaxValue.ToString ("N0F", _nfi), "#02"); + Assert.AreEqual ("N2147483647xF", Int32.MaxValue.ToString ("N0xF", _nfi), "#03"); + } + + [Test] + public void Test04008 () + { + Assert.AreEqual ("-NF", Int32.MinValue.ToString ("NF", _nfi), "#01"); + Assert.AreEqual ("-N2147483648F", Int32.MinValue.ToString ("N0F", _nfi), "#02"); + Assert.AreEqual ("-N2147483648xF", Int32.MinValue.ToString ("N0xF", _nfi), "#03"); + } + + [Test] + public void Test04009 () + { + Assert.AreEqual ("0.0000000000", 0.ToString ("N0000000000000000000000000000000000000010", _nfi), "#01"); + Assert.AreEqual ("2,147,483,647.0000000000", Int32.MaxValue.ToString ("N0000000000000000000000000000000000000010", _nfi), "#02"); + Assert.AreEqual ("-2,147,483,648.0000000000", Int32.MinValue.ToString ("N0000000000000000000000000000000000000010", _nfi), "#03"); + } + + [Test] + public void Test04010 () + { + Assert.AreEqual ("+N", 0.ToString ("+N", _nfi), "#01"); + Assert.AreEqual ("N+", 0.ToString ("N+", _nfi), "#02"); + Assert.AreEqual ("+N+", 0.ToString ("+N+", _nfi), "#03"); + } + + [Test] + public void Test04011 () + { + Assert.AreEqual ("+N", Int32.MaxValue.ToString ("+N", _nfi), "#01"); + Assert.AreEqual ("N+", Int32.MaxValue.ToString ("N+", _nfi), "#02"); + Assert.AreEqual ("+N+", Int32.MaxValue.ToString ("+N+", _nfi), "#03"); + } + + [Test] + public void Test04012 () + { + Assert.AreEqual ("-+N", Int32.MinValue.ToString ("+N", _nfi), "#01"); + Assert.AreEqual ("-N+", Int32.MinValue.ToString ("N+", _nfi), "#02"); + Assert.AreEqual ("-+N+", Int32.MinValue.ToString ("+N+", _nfi), "#03"); + } + + [Test] + public void Test04013 () + { + Assert.AreEqual ("-N", 0.ToString ("-N", _nfi), "#01"); + Assert.AreEqual ("N-", 0.ToString ("N-", _nfi), "#02"); + Assert.AreEqual ("-N-", 0.ToString ("-N-", _nfi), "#03"); + } + + [Test] + public void Test04014 () + { + Assert.AreEqual ("-N", Int32.MaxValue.ToString ("-N", _nfi), "#01"); + Assert.AreEqual ("N-", Int32.MaxValue.ToString ("N-", _nfi), "#02"); + Assert.AreEqual ("-N-", Int32.MaxValue.ToString ("-N-", _nfi), "#03"); + } + + [Test] + public void Test04015 () + { + Assert.AreEqual ("--N", Int32.MinValue.ToString ("-N", _nfi), "#01"); + Assert.AreEqual ("-N-", Int32.MinValue.ToString ("N-", _nfi), "#02"); + Assert.AreEqual ("--N-", Int32.MinValue.ToString ("-N-", _nfi), "#03"); + } + + [Test] + public void Test04016 () + { + Assert.AreEqual ("N+0", 0.ToString ("N+0", _nfi), "#01"); + Assert.AreEqual ("N+2147483647", Int32.MaxValue.ToString ("N+0", _nfi), "#02"); + Assert.AreEqual ("-N+2147483648", Int32.MinValue.ToString ("N+0", _nfi), "#03"); + } + + [Test] + public void Test04017 () + { + Assert.AreEqual ("N+9", 0.ToString ("N+9", _nfi), "#01"); + Assert.AreEqual ("N+9", Int32.MaxValue.ToString ("N+9", _nfi), "#02"); + Assert.AreEqual ("-N+9", Int32.MinValue.ToString ("N+9", _nfi), "#03"); + } + + [Test] + public void Test04018 () + { + Assert.AreEqual ("N-9", 0.ToString ("N-9", _nfi), "#01"); + Assert.AreEqual ("N-9", Int32.MaxValue.ToString ("N-9", _nfi), "#02"); + Assert.AreEqual ("-N-9", Int32.MinValue.ToString ("N-9", _nfi), "#03"); + } + + [Test] + public void Test04019 () + { + Assert.AreEqual ("N0", 0.ToString ("N0,", _nfi), "#01"); + Assert.AreEqual ("N2147484", Int32.MaxValue.ToString ("N0,", _nfi), "#02"); + Assert.AreEqual ("-N2147484", Int32.MinValue.ToString ("N0,", _nfi), "#03"); + } + + [Test] + public void Test04020 () + { + Assert.AreEqual ("N0", 0.ToString ("N0.", _nfi), "#01"); + Assert.AreEqual ("N2147483647", Int32.MaxValue.ToString ("N0.", _nfi), "#02"); + Assert.AreEqual ("-N2147483648", Int32.MinValue.ToString ("N0.", _nfi), "#03"); + } + + [Test] + public void Test04021 () + { + Assert.AreEqual ("N0.0", 0.ToString ("N0.0", _nfi), "#01"); + Assert.AreEqual ("N2147483647.0", Int32.MaxValue.ToString ("N0.0", _nfi), "#02"); + Assert.AreEqual ("-N2147483648.0", Int32.MinValue.ToString ("N0.0", _nfi), "#03"); + } + + [Test] + public void Test04022 () + { + Assert.AreEqual ("N09", 0.ToString ("N0.9", _nfi), "#01"); + Assert.AreEqual ("N21474836479", Int32.MaxValue.ToString ("N0.9", _nfi), "#02"); + Assert.AreEqual ("-N21474836489", Int32.MinValue.ToString ("N0.9", _nfi), "#03"); + } + + [Test] + public void Test04023 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberDecimalDigits = 0; + Assert.AreEqual ("0", 0.ToString ("N", nfi), "#01"); + nfi.NumberDecimalDigits = 1; + Assert.AreEqual ("0.0", 0.ToString ("N", nfi), "#02"); + nfi.NumberDecimalDigits = 99; + Assert.AreEqual ("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("N", nfi), "#03"); + } + + [Test] + public void Test04024 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = ""; + Assert.AreEqual ("2,147,483,648.00", Int32.MinValue.ToString ("N", nfi), "#01"); + nfi.NegativeSign = "-"; + Assert.AreEqual ("-2,147,483,648.00", Int32.MinValue.ToString ("N", nfi), "#02"); + nfi.NegativeSign = "+"; + Assert.AreEqual ("+2,147,483,648.00", Int32.MinValue.ToString ("N", nfi), "#03"); + nfi.NegativeSign = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + Assert.AreEqual ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ2,147,483,648.00", Int32.MinValue.ToString ("N", nfi), "#04"); + } + + [Test] + public void Test04025 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "-"; + nfi.PositiveSign = "+"; + Assert.AreEqual ("-1.00", (-1).ToString ("N", nfi), "#01"); + Assert.AreEqual ("0.00", 0.ToString ("N", nfi), "#02"); + Assert.AreEqual ("1.00",1.ToString ("N", nfi), "#03"); + } + + [Test] + public void Test04026 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "+"; + nfi.PositiveSign = "-"; + Assert.AreEqual ("+1.00", (-1).ToString ("N", nfi), "#01"); + Assert.AreEqual ("0.00", 0.ToString ("N", nfi), "#02"); + Assert.AreEqual ("1.00",1.ToString ("N", nfi), "#03"); + } + + [Test] + public void Test04027 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberDecimalSeparator = "#"; + Assert.AreEqual ("123#0",123.ToString ("N1", nfi), "#01"); + } + + [Test] + public void Test04028 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberGroupSeparator = "-"; + Assert.AreEqual ("-2-147-483-648.0",Int32.MinValue.ToString ("N1", nfi), "#01"); + } + + [Test] + public void Test04029 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberGroupSizes = new int [] {}; + Assert.AreEqual ("-2147483648.0",Int32.MinValue.ToString ("N1", nfi), "#01"); + nfi.NumberGroupSizes = new int [] {0}; + Assert.AreEqual ("-2147483648.0",Int32.MinValue.ToString ("N1", nfi), "#02"); + nfi.NumberGroupSizes = new int [] {1}; + Assert.AreEqual ("-2,1,4,7,4,8,3,6,4,8.0",Int32.MinValue.ToString ("N1", nfi), "#03"); + nfi.NumberGroupSizes = new int [] {3}; + Assert.AreEqual ("-2,147,483,648.0",Int32.MinValue.ToString ("N1", nfi), "#04"); + nfi.NumberGroupSizes = new int [] {9}; + Assert.AreEqual ("-2,147483648.0",Int32.MinValue.ToString ("N1", nfi), "#05"); + } + + [Test] + public void Test04030 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberGroupSizes = new int [] {1,2}; + Assert.AreEqual ("-2,14,74,83,64,8.0",Int32.MinValue.ToString ("N1", nfi), "#01"); + nfi.NumberGroupSizes = new int [] {1,2,3}; + Assert.AreEqual ("-2,147,483,64,8.0",Int32.MinValue.ToString ("N1", nfi), "#02"); + nfi.NumberGroupSizes = new int [] {1,2,3,4}; + Assert.AreEqual ("-2147,483,64,8.0",Int32.MinValue.ToString ("N1", nfi), "#03"); + nfi.NumberGroupSizes = new int [] {1,2,1,2,1,2,1}; + Assert.AreEqual ("-2,14,7,48,3,64,8.0",Int32.MinValue.ToString ("N1", nfi), "#04"); + nfi.NumberGroupSizes = new int [] {1,0}; + Assert.AreEqual ("-214748364,8.0",Int32.MinValue.ToString ("N1", nfi), "#05"); + nfi.NumberGroupSizes = new int [] {1,2,0}; + Assert.AreEqual ("-2147483,64,8.0",Int32.MinValue.ToString ("N1", nfi), "#06"); + nfi.NumberGroupSizes = new int [] {1,2,3,0}; + Assert.AreEqual ("-2147,483,64,8.0",Int32.MinValue.ToString ("N1", nfi), "#07"); + nfi.NumberGroupSizes = new int [] {1,2,3,4,0}; + Assert.AreEqual ("-2147,483,64,8.0",Int32.MinValue.ToString ("N1", nfi), "#08"); + } + + [Test] + public void Test04031 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "1234567890"; + Assert.AreEqual ("12345678902,147,483,648.00", Int32.MinValue.ToString ("N", nfi), "#01"); + } + + // Test05000 - Int32 and P + [Test] + public void Test05000 () + { + Assert.AreEqual ("0.00 %", 0.ToString ("P", _nfi), "#01"); + Assert.AreEqual ("0.00 %", 0.ToString ("p", _nfi), "#02"); + Assert.AreEqual ("-214,748,364,800.00 %", Int32.MinValue.ToString ("P", _nfi), "#03"); + Assert.AreEqual ("-214,748,364,800.00 %", Int32.MinValue.ToString ("p", _nfi), "#04"); + Assert.AreEqual ("214,748,364,700.00 %", Int32.MaxValue.ToString ("P", _nfi), "#05"); + Assert.AreEqual ("214,748,364,700.00 %", Int32.MaxValue.ToString ("p", _nfi), "#06"); + } + + [Test] + public void Test05001 () + { + Assert.AreEqual ("P ", 0.ToString ("P ", _nfi), "#01"); + Assert.AreEqual (" P", 0.ToString (" P", _nfi), "#02"); + Assert.AreEqual (" P ", 0.ToString (" P ", _nfi), "#03"); + } + + [Test] + public void Test05002 () + { + Assert.AreEqual ("-P ", (-1).ToString ("P ", _nfi), "#01"); + Assert.AreEqual ("- P", (-1).ToString (" P", _nfi), "#02"); + Assert.AreEqual ("- P ", (-1).ToString (" P ", _nfi), "#03"); + } + + [Test] + public void Test05003 () + { + Assert.AreEqual ("0 %", 0.ToString ("P0", _nfi), "#01"); + Assert.AreEqual ("0.000000000 %", 0.ToString ("P9", _nfi), "#02"); + Assert.AreEqual ("0.0000000000 %", 0.ToString ("P10", _nfi), "#03"); + Assert.AreEqual ("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", 0.ToString ("P99", _nfi), "#04"); + Assert.AreEqual ("P100", 0.ToString ("P100", _nfi), "#05"); + } + + [Test] + public void Test05004 () + { + Assert.AreEqual ("214,748,364,700 %", Int32.MaxValue.ToString ("P0", _nfi), "#01"); + Assert.AreEqual ("214,748,364,700.000000000 %", Int32.MaxValue.ToString ("P9", _nfi), "#02"); + Assert.AreEqual ("214,748,364,700.0000000000 %", Int32.MaxValue.ToString ("P10", _nfi), "#03"); + Assert.AreEqual ("214,748,364,700.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", Int32.MaxValue.ToString ("P99", _nfi), "#04"); + Assert.AreEqual ("P12147483647", Int32.MaxValue.ToString ("P100", _nfi), "#05"); + } + + [Test] + public void Test05005 () + { + Assert.AreEqual ("-214,748,364,800 %", Int32.MinValue.ToString ("P0", _nfi), "#01"); + Assert.AreEqual ("-214,748,364,800.000000000 %", Int32.MinValue.ToString ("P9", _nfi), "#02"); + Assert.AreEqual ("-214,748,364,800.0000000000 %", Int32.MinValue.ToString ("P10", _nfi), "#03"); + Assert.AreEqual ("-214,748,364,800.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", Int32.MinValue.ToString ("P99", _nfi), "#04"); + Assert.AreEqual ("-P12147483648", Int32.MinValue.ToString ("P100", _nfi), "#05"); + } + + [Test] + public void Test05006 () + { + Assert.AreEqual ("PF", 0.ToString ("PF", _nfi), "#01"); + Assert.AreEqual ("P0F", 0.ToString ("P0F", _nfi), "#02"); + Assert.AreEqual ("P0xF", 0.ToString ("P0xF", _nfi), "#03"); + } + + [Test] + public void Test05007 () + { + Assert.AreEqual ("PF", Int32.MaxValue.ToString ("PF", _nfi), "#01"); + Assert.AreEqual ("P2147483647F", Int32.MaxValue.ToString ("P0F", _nfi), "#02"); + Assert.AreEqual ("P2147483647xF", Int32.MaxValue.ToString ("P0xF", _nfi), "#03"); + } + + [Test] + public void Test05008 () + { + Assert.AreEqual ("-PF", Int32.MinValue.ToString ("PF", _nfi), "#01"); + Assert.AreEqual ("-P2147483648F", Int32.MinValue.ToString ("P0F", _nfi), "#02"); + Assert.AreEqual ("-P2147483648xF", Int32.MinValue.ToString ("P0xF", _nfi), "#03"); + } + + [Test] + public void Test05009 () + { + Assert.AreEqual ("0.0000000000 %", 0.ToString ("P0000000000000000000000000000000000000010", _nfi), "#01"); + Assert.AreEqual ("214,748,364,700.0000000000 %", Int32.MaxValue.ToString ("P0000000000000000000000000000000000000010", _nfi), "#02"); + Assert.AreEqual ("-214,748,364,800.0000000000 %", Int32.MinValue.ToString ("P0000000000000000000000000000000000000010", _nfi), "#03"); + } + + [Test] + public void Test05010 () + { + Assert.AreEqual ("+P", 0.ToString ("+P", _nfi), "#01"); + Assert.AreEqual ("P+", 0.ToString ("P+", _nfi), "#02"); + Assert.AreEqual ("+P+", 0.ToString ("+P+", _nfi), "#03"); + } + + [Test] + public void Test05011 () + { + Assert.AreEqual ("+P", Int32.MaxValue.ToString ("+P", _nfi), "#01"); + Assert.AreEqual ("P+", Int32.MaxValue.ToString ("P+", _nfi), "#02"); + Assert.AreEqual ("+P+", Int32.MaxValue.ToString ("+P+", _nfi), "#03"); + } + + [Test] + public void Test05012 () + { + Assert.AreEqual ("-+P", Int32.MinValue.ToString ("+P", _nfi), "#01"); + Assert.AreEqual ("-P+", Int32.MinValue.ToString ("P+", _nfi), "#02"); + Assert.AreEqual ("-+P+", Int32.MinValue.ToString ("+P+", _nfi), "#03"); + } + + [Test] + public void Test05013 () + { + Assert.AreEqual ("-P", 0.ToString ("-P", _nfi), "#01"); + Assert.AreEqual ("P-", 0.ToString ("P-", _nfi), "#02"); + Assert.AreEqual ("-P-", 0.ToString ("-P-", _nfi), "#03"); + } + + [Test] + public void Test05014 () + { + Assert.AreEqual ("-P", Int32.MaxValue.ToString ("-P", _nfi), "#01"); + Assert.AreEqual ("P-", Int32.MaxValue.ToString ("P-", _nfi), "#02"); + Assert.AreEqual ("-P-", Int32.MaxValue.ToString ("-P-", _nfi), "#03"); + } + + [Test] + public void Test05015 () + { + Assert.AreEqual ("--P", Int32.MinValue.ToString ("-P", _nfi), "#01"); + Assert.AreEqual ("-P-", Int32.MinValue.ToString ("P-", _nfi), "#02"); + Assert.AreEqual ("--P-", Int32.MinValue.ToString ("-P-", _nfi), "#03"); + } + + [Test] + public void Test05016 () + { + Assert.AreEqual ("P+0", 0.ToString ("P+0", _nfi), "#01"); + Assert.AreEqual ("P+2147483647", Int32.MaxValue.ToString ("P+0", _nfi), "#02"); + Assert.AreEqual ("-P+2147483648", Int32.MinValue.ToString ("P+0", _nfi), "#03"); + } + + [Test] + public void Test05017 () + { + Assert.AreEqual ("P+9", 0.ToString ("P+9", _nfi), "#01"); + Assert.AreEqual ("P+9", Int32.MaxValue.ToString ("P+9", _nfi), "#02"); + Assert.AreEqual ("-P+9", Int32.MinValue.ToString ("P+9", _nfi), "#03"); + } + + [Test] + public void Test05018 () + { + Assert.AreEqual ("P-9", 0.ToString ("P-9", _nfi), "#01"); + Assert.AreEqual ("P-9", Int32.MaxValue.ToString ("P-9", _nfi), "#02"); + Assert.AreEqual ("-P-9", Int32.MinValue.ToString ("P-9", _nfi), "#03"); + } + + [Test] + public void Test05019 () + { + Assert.AreEqual ("P0", 0.ToString ("P0,", _nfi), "#01"); + Assert.AreEqual ("P2147484", Int32.MaxValue.ToString ("P0,", _nfi), "#02"); + Assert.AreEqual ("-P2147484", Int32.MinValue.ToString ("P0,", _nfi), "#03"); + } + + [Test] + public void Test05020 () + { + Assert.AreEqual ("P0", 0.ToString ("P0.", _nfi), "#01"); + Assert.AreEqual ("P2147483647", Int32.MaxValue.ToString ("P0.", _nfi), "#02"); + Assert.AreEqual ("-P2147483648", Int32.MinValue.ToString ("P0.", _nfi), "#03"); + } + + [Test] + public void Test05021 () + { + Assert.AreEqual ("P0.0", 0.ToString ("P0.0", _nfi), "#01"); + Assert.AreEqual ("P2147483647.0", Int32.MaxValue.ToString ("P0.0", _nfi), "#02"); + Assert.AreEqual ("-P2147483648.0", Int32.MinValue.ToString ("P0.0", _nfi), "#03"); + } + + [Test] + public void Test05022 () + { + Assert.AreEqual ("P09", 0.ToString ("P0.9", _nfi), "#01"); + Assert.AreEqual ("P21474836479", Int32.MaxValue.ToString ("P0.9", _nfi), "#02"); + Assert.AreEqual ("-P21474836489", Int32.MinValue.ToString ("P0.9", _nfi), "#03"); + } + + [Test] + public void Test05023 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentDecimalDigits = 0; + Assert.AreEqual ("0 %", 0.ToString ("P", nfi), "#01"); + nfi.PercentDecimalDigits = 1; + Assert.AreEqual ("0.0 %", 0.ToString ("P", nfi), "#02"); + nfi.PercentDecimalDigits = 99; + Assert.AreEqual ("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", 0.ToString ("P", nfi), "#03"); + } + + [Test] + public void Test05024 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = ""; + Assert.AreEqual ("214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi), "#01"); + nfi.NegativeSign = "-"; + Assert.AreEqual ("-214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi), "#02"); + nfi.NegativeSign = "+"; + Assert.AreEqual ("+214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi), "#03"); + nfi.NegativeSign = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMPOPQRSTUVWXYZ"; + Assert.AreEqual ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMPOPQRSTUVWXYZ214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi), "#04"); + } + + [Test] + public void Test05025 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "-"; + nfi.PositiveSign = "+"; + Assert.AreEqual ("-100.00 %", (-1).ToString ("P", nfi), "#01"); + Assert.AreEqual ("0.00 %", 0.ToString ("P", nfi), "#02"); + Assert.AreEqual ("100.00 %",1.ToString ("P", nfi), "#03"); + } + + [Test] + public void Test05026 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "+"; + nfi.PositiveSign = "-"; + Assert.AreEqual ("+100.00 %", (-1).ToString ("P", nfi), "#01"); + Assert.AreEqual ("0.00 %", 0.ToString ("P", nfi), "#02"); + Assert.AreEqual ("100.00 %",1.ToString ("P", nfi), "#03"); + } + + [Test] + public void Test05027 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentDecimalSeparator = "#"; + Assert.AreEqual ("12,300#0 %",123.ToString ("P1", nfi), "#01"); + } + + [Test] + public void Test05028 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentGroupSeparator = "-"; + Assert.AreEqual ("-214-748-364-800.0 %",Int32.MinValue.ToString ("P1", nfi), "#01"); + } + + [Test] + public void Test05029 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentGroupSizes = new int [] {}; + Assert.AreEqual ("-214748364800.0 %",Int32.MinValue.ToString ("P1", nfi), "#01"); + nfi.PercentGroupSizes = new int [] {0}; + Assert.AreEqual ("-214748364800.0 %",Int32.MinValue.ToString ("P1", nfi), "#02"); + nfi.PercentGroupSizes = new int [] {1}; + Assert.AreEqual ("-2,1,4,7,4,8,3,6,4,8,0,0.0 %",Int32.MinValue.ToString ("P1", nfi), "#03"); + nfi.PercentGroupSizes = new int [] {3}; + Assert.AreEqual ("-214,748,364,800.0 %",Int32.MinValue.ToString ("P1", nfi), "#04"); + nfi.PercentGroupSizes = new int [] {9}; + Assert.AreEqual ("-214,748364800.0 %",Int32.MinValue.ToString ("P1", nfi), "#05"); + } + + [Test] + public void Test05030 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentGroupSizes = new int [] {1,2}; + Assert.AreEqual ("-2,14,74,83,64,80,0.0 %",Int32.MinValue.ToString ("P1", nfi), "#01"); + nfi.PercentGroupSizes = new int [] {1,2,3}; + Assert.AreEqual ("-214,748,364,80,0.0 %",Int32.MinValue.ToString ("P1", nfi), "#02"); + nfi.PercentGroupSizes = new int [] {1,2,3,4}; + Assert.AreEqual ("-21,4748,364,80,0.0 %",Int32.MinValue.ToString ("P1", nfi), "#03"); + nfi.PercentGroupSizes = new int [] {1,2,1,2,1,2,1}; + Assert.AreEqual ("-2,1,4,74,8,36,4,80,0.0 %",Int32.MinValue.ToString ("P1", nfi), "#04"); + nfi.PercentGroupSizes = new int [] {1,0}; + Assert.AreEqual ("-21474836480,0.0 %",Int32.MinValue.ToString ("P1", nfi), "#05"); + nfi.PercentGroupSizes = new int [] {1,2,0}; + Assert.AreEqual ("-214748364,80,0.0 %",Int32.MinValue.ToString ("P1", nfi), "#06"); + nfi.PercentGroupSizes = new int [] {1,2,3,0}; + Assert.AreEqual ("-214748,364,80,0.0 %",Int32.MinValue.ToString ("P1", nfi), "#07"); + nfi.PercentGroupSizes = new int [] {1,2,3,4,0}; + Assert.AreEqual ("-21,4748,364,80,0.0 %",Int32.MinValue.ToString ("P1", nfi), "#08"); + } + + [Test] + public void Test05031 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "1234567890"; + Assert.AreEqual ("1234567890214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi), "#01"); + } + + [Test] + public void Test05032 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentNegativePattern = 0; + Assert.AreEqual ("-214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi), "#01"); + Assert.AreEqual ("214,748,364,700.00 %", Int32.MaxValue.ToString ("P", nfi), "#02"); + Assert.AreEqual ("0.00 %", 0.ToString ("P", nfi), "#03"); + } + + [Test] + public void Test05033 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentNegativePattern = 1; + Assert.AreEqual ("-214,748,364,800.00%", Int32.MinValue.ToString ("P", nfi), "#01"); + Assert.AreEqual ("214,748,364,700.00 %", Int32.MaxValue.ToString ("P", nfi), "#02"); + Assert.AreEqual ("0.00 %", 0.ToString ("P", nfi), "#03"); + } + + [Test] + public void Test05034 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentNegativePattern = 2; + Assert.AreEqual ("-%214,748,364,800.00", Int32.MinValue.ToString ("P", nfi), "#01"); + Assert.AreEqual ("214,748,364,700.00 %", Int32.MaxValue.ToString ("P", nfi), "#02"); + Assert.AreEqual ("0.00 %", 0.ToString ("P", nfi), "#03"); + } + + [Test] + public void Test05035 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentPositivePattern = 0; + Assert.AreEqual ("-214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi), "#01"); + Assert.AreEqual ("214,748,364,700.00 %", Int32.MaxValue.ToString ("P", nfi), "#02"); + Assert.AreEqual ("0.00 %", 0.ToString ("P", nfi), "#03"); + } + + [Test] + public void Test05036 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentPositivePattern = 1; + Assert.AreEqual ("-214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi), "#01"); + Assert.AreEqual ("214,748,364,700.00%", Int32.MaxValue.ToString ("P", nfi), "#02"); + Assert.AreEqual ("0.00%", 0.ToString ("P", nfi), "#03"); + } + + [Test] + public void Test05037 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentPositivePattern = 2; + Assert.AreEqual ("-214,748,364,800.00 %", Int32.MinValue.ToString ("P", nfi), "#01"); + Assert.AreEqual ("%214,748,364,700.00", Int32.MaxValue.ToString ("P", nfi), "#02"); + Assert.AreEqual ("%0.00", 0.ToString ("P", nfi), "#03"); + } + + // Test06000 - Int32 and R + [Test] + [ExpectedException (typeof (FormatException))] + public void Test06000 () + { + Assert.AreEqual ("0", 0.ToString ("R", _nfi), "#01"); + } + + // Test07000- Int32 and X + [Test] + public void Test07000 () + { + Assert.AreEqual ("0", 0.ToString ("X", _nfi), "#01"); + Assert.AreEqual ("0", 0.ToString ("x", _nfi), "#02"); + Assert.AreEqual ("80000000", Int32.MinValue.ToString ("X", _nfi), "#03"); + Assert.AreEqual ("80000000", Int32.MinValue.ToString ("x", _nfi), "#04"); + Assert.AreEqual ("7FFFFFFF", Int32.MaxValue.ToString ("X", _nfi), "#05"); + Assert.AreEqual ("7fffffff", Int32.MaxValue.ToString ("x", _nfi), "#06"); + } + + [Test] + public void Test07001 () + { + Assert.AreEqual ("X ", 0.ToString ("X ", _nfi), "#01"); + Assert.AreEqual (" X", 0.ToString (" X", _nfi), "#02"); + Assert.AreEqual (" X ", 0.ToString (" X ", _nfi), "#03"); + } + + [Test] + public void Test07002 () + { + Assert.AreEqual ("-X ", (-1).ToString ("X ", _nfi), "#01"); + Assert.AreEqual ("- X", (-1).ToString (" X", _nfi), "#02"); + Assert.AreEqual ("- X ", (-1).ToString (" X ", _nfi), "#03"); + } + + [Test] + public void Test07003 () + { + Assert.AreEqual ("0", 0.ToString ("X0", _nfi), "#01"); + Assert.AreEqual ("0000000000", 0.ToString ("X10", _nfi), "#02"); + Assert.AreEqual ("00000000000", 0.ToString ("X11", _nfi), "#03"); + Assert.AreEqual ("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.ToString ("X99", _nfi), "#04"); + Assert.AreEqual ("X100", 0.ToString ("X100", _nfi), "#05"); + } + + [Test] + public void Test07004 () + { + Assert.AreEqual ("7FFFFFFF", Int32.MaxValue.ToString ("X0", _nfi), "#01"); + Assert.AreEqual ("007FFFFFFF", Int32.MaxValue.ToString ("X10", _nfi), "#02"); + Assert.AreEqual ("0007FFFFFFF", Int32.MaxValue.ToString ("X11", _nfi), "#03"); + Assert.AreEqual ("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFFFFFF", Int32.MaxValue.ToString ("X99", _nfi), "#04"); + Assert.AreEqual ("X12147483647", Int32.MaxValue.ToString ("X100", _nfi), "#05"); + } + + [Test] + public void Test07005 () + { + Assert.AreEqual ("80000000", Int32.MinValue.ToString ("X0", _nfi), "#01"); + Assert.AreEqual ("0080000000", Int32.MinValue.ToString ("X10", _nfi), "#02"); + Assert.AreEqual ("00080000000", Int32.MinValue.ToString ("X11", _nfi), "#03"); + Assert.AreEqual ("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000", Int32.MinValue.ToString ("X99", _nfi), "#04"); + Assert.AreEqual ("-X12147483648", Int32.MinValue.ToString ("X100", _nfi), "#05"); + } + + [Test] + public void Test07006 () + { + Assert.AreEqual ("XF", 0.ToString ("XF", _nfi), "#01"); + Assert.AreEqual ("X0F", 0.ToString ("X0F", _nfi), "#02"); + Assert.AreEqual ("X0xF", 0.ToString ("X0xF", _nfi), "#03"); + } + + [Test] + public void Test07007 () + { + Assert.AreEqual ("XF", Int32.MaxValue.ToString ("XF", _nfi), "#01"); + Assert.AreEqual ("X2147483647F", Int32.MaxValue.ToString ("X0F", _nfi), "#02"); + Assert.AreEqual ("X2147483647xF", Int32.MaxValue.ToString ("X0xF", _nfi), "#03"); + } + + [Test] + public void Test07008 () + { + Assert.AreEqual ("-XF", Int32.MinValue.ToString ("XF", _nfi), "#01"); + Assert.AreEqual ("-X2147483648F", Int32.MinValue.ToString ("X0F", _nfi), "#02"); + Assert.AreEqual ("-X2147483648xF", Int32.MinValue.ToString ("X0xF", _nfi), "#03"); + } + + [Test] + public void Test07009 () + { + Assert.AreEqual ("00000000000", 0.ToString ("X0000000000000000000000000000000000000011", _nfi), "#01"); + Assert.AreEqual ("0007FFFFFFF", Int32.MaxValue.ToString ("X0000000000000000000000000000000000000011", _nfi), "#02"); + Assert.AreEqual ("00080000000", Int32.MinValue.ToString ("X0000000000000000000000000000000000000011", _nfi), "#03"); + } + + [Test] + public void Test07010 () + { + Assert.AreEqual ("+X", 0.ToString ("+X", _nfi), "#01"); + Assert.AreEqual ("X+", 0.ToString ("X+", _nfi), "#02"); + Assert.AreEqual ("+X+", 0.ToString ("+X+", _nfi), "#03"); + } + + [Test] + public void Test07011 () + { + Assert.AreEqual ("+X", Int32.MaxValue.ToString ("+X", _nfi), "#01"); + Assert.AreEqual ("X+", Int32.MaxValue.ToString ("X+", _nfi), "#02"); + Assert.AreEqual ("+X+", Int32.MaxValue.ToString ("+X+", _nfi), "#03"); + } + + [Test] + public void Test07012 () + { + Assert.AreEqual ("-+X", Int32.MinValue.ToString ("+X", _nfi), "#01"); + Assert.AreEqual ("-X+", Int32.MinValue.ToString ("X+", _nfi), "#02"); + Assert.AreEqual ("-+X+", Int32.MinValue.ToString ("+X+", _nfi), "#03"); + } + + [Test] + public void Test07013 () + { + Assert.AreEqual ("-X", 0.ToString ("-X", _nfi), "#01"); + Assert.AreEqual ("X-", 0.ToString ("X-", _nfi), "#02"); + Assert.AreEqual ("-X-", 0.ToString ("-X-", _nfi), "#03"); + } + + [Test] + public void Test07014 () + { + Assert.AreEqual ("-X", Int32.MaxValue.ToString ("-X", _nfi), "#01"); + Assert.AreEqual ("X-", Int32.MaxValue.ToString ("X-", _nfi), "#02"); + Assert.AreEqual ("-X-", Int32.MaxValue.ToString ("-X-", _nfi), "#03"); + } + + [Test] + public void Test07015 () + { + Assert.AreEqual ("--X", Int32.MinValue.ToString ("-X", _nfi), "#01"); + Assert.AreEqual ("-X-", Int32.MinValue.ToString ("X-", _nfi), "#02"); + Assert.AreEqual ("--X-", Int32.MinValue.ToString ("-X-", _nfi), "#03"); + } + + [Test] + public void Test07016 () + { + Assert.AreEqual ("X+0", 0.ToString ("X+0", _nfi), "#01"); + Assert.AreEqual ("X+2147483647", Int32.MaxValue.ToString ("X+0", _nfi), "#02"); + Assert.AreEqual ("-X+2147483648", Int32.MinValue.ToString ("X+0", _nfi), "#03"); + } + + [Test] + public void Test07017 () + { + Assert.AreEqual ("X+9", 0.ToString ("X+9", _nfi), "#01"); + Assert.AreEqual ("X+9", Int32.MaxValue.ToString ("X+9", _nfi), "#02"); + Assert.AreEqual ("-X+9", Int32.MinValue.ToString ("X+9", _nfi), "#03"); + } + + [Test] + public void Test07018 () + { + Assert.AreEqual ("X-9", 0.ToString ("X-9", _nfi), "#01"); + Assert.AreEqual ("X-9", Int32.MaxValue.ToString ("X-9", _nfi), "#02"); + Assert.AreEqual ("-X-9", Int32.MinValue.ToString ("X-9", _nfi), "#03"); + } + + [Test] + public void Test07019 () + { + Assert.AreEqual ("X0", 0.ToString ("X0,", _nfi), "#01"); + Assert.AreEqual ("X2147484", Int32.MaxValue.ToString ("X0,", _nfi), "#02"); + Assert.AreEqual ("-X2147484", Int32.MinValue.ToString ("X0,", _nfi), "#03"); + } + + [Test] + public void Test07020 () + { + Assert.AreEqual ("X0", 0.ToString ("X0.", _nfi), "#01"); + Assert.AreEqual ("X2147483647", Int32.MaxValue.ToString ("X0.", _nfi), "#02"); + Assert.AreEqual ("-X2147483648", Int32.MinValue.ToString ("X0.", _nfi), "#03"); + } + + [Test] + public void Test07021 () + { + Assert.AreEqual ("X0.0", 0.ToString ("X0.0", _nfi), "#01"); + Assert.AreEqual ("X2147483647.0", Int32.MaxValue.ToString ("X0.0", _nfi), "#02"); + Assert.AreEqual ("-X2147483648.0", Int32.MinValue.ToString ("X0.0", _nfi), "#03"); + } + + [Test] + public void Test07022 () + { + Assert.AreEqual ("X09", 0.ToString ("X0.9", _nfi), "#01"); + Assert.AreEqual ("X21474836479", Int32.MaxValue.ToString ("X0.9", _nfi), "#02"); + Assert.AreEqual ("-X21474836489", Int32.MinValue.ToString ("X0.9", _nfi), "#03"); + } + + [Test] + public void Test08000 () + { + Assert.AreEqual ("0", 0.ToString ("0", _nfi), "#01"); + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("0", _nfi), "#02"); + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("0", _nfi), "#03"); + } + + // Test08000 - Int32 and Custom + [Test] + public void Test08001 () + { + Assert.AreEqual ("00000000000", 0.ToString ("00000000000", _nfi), "#01"); + Assert.AreEqual ("02147483647", Int32.MaxValue.ToString ("00000000000", _nfi), "#02"); + Assert.AreEqual ("-02147483648", Int32.MinValue.ToString ("00000000000", _nfi), "#03"); + } + + [Test] + public void Test08002 () + { + Assert.AreEqual (" 00000000000 ", 0.ToString (" 00000000000 ", _nfi), "#01"); + Assert.AreEqual (" 02147483647 ", Int32.MaxValue.ToString (" 00000000000 ", _nfi), "#02"); + Assert.AreEqual ("- 02147483648 ", Int32.MinValue.ToString (" 00000000000 ", _nfi), "#03"); + } + + [Test] + public void Test08003 () + { + Assert.AreEqual ("", 0.ToString ("#", _nfi), "#01"); + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("#", _nfi), "#02"); + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("#", _nfi), "#03"); + } + + [Test] + public void Test08004 () + { + Assert.AreEqual ("", 0.ToString ("##########", _nfi), "#01"); + Assert.AreEqual ("2147483647", Int32.MaxValue.ToString ("##########", _nfi), "#02"); + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString ("##########", _nfi), "#03"); + } + + [Test] + public void Test08005 () + { + Assert.AreEqual (" ", 0.ToString (" ########## ", _nfi), "#01"); + Assert.AreEqual (" 2147483647 ", Int32.MaxValue.ToString (" ########## ", _nfi), "#02"); + Assert.AreEqual ("- 2147483648 ", Int32.MinValue.ToString (" ########## ", _nfi), "#03"); + } + + [Test] + public void Test08006 () + { + Assert.AreEqual ("", 0.ToString (".", _nfi), "#01"); + Assert.AreEqual ("", Int32.MaxValue.ToString (".", _nfi), "#02"); + Assert.AreEqual ("-", Int32.MinValue.ToString (".", _nfi), "#03"); + } + + [Test] + public void Test08007 () + { + Assert.AreEqual ("00000000000", 0.ToString ("00000000000.", _nfi), "#01"); + Assert.AreEqual ("02147483647", Int32.MaxValue.ToString ("00000000000.", _nfi), "#02"); + Assert.AreEqual ("-02147483648", Int32.MinValue.ToString ("00000000000.", _nfi), "#03"); + } + + [Test] + public void Test08008 () + { + Assert.AreEqual (".00000000000", 0.ToString (".00000000000", _nfi), "#01"); + Assert.AreEqual ("2147483647.00000000000", Int32.MaxValue.ToString (".00000000000", _nfi), "#02"); + Assert.AreEqual ("-2147483648.00000000000", Int32.MinValue.ToString (".00000000000", _nfi), "#03"); + } + + [Test] + public void Test08009 () + { + Assert.AreEqual ("00000000000.00000000000", 0.ToString ("00000000000.00000000000", _nfi), "#01"); + Assert.AreEqual ("02147483647.00000000000", Int32.MaxValue.ToString ("00000000000.00000000000", _nfi), "#02"); + Assert.AreEqual ("-02147483648.00000000000", Int32.MinValue.ToString ("00000000000.00000000000", _nfi), "#03"); + } + + [Test] + public void Test08010 () + { + Assert.AreEqual ("00.0000000000", 0.ToString ("00.0.00.000.0000", _nfi), "#01"); + Assert.AreEqual ("01.0000000000", 1.ToString ("00.0.00.000.0000", _nfi), "#02"); + Assert.AreEqual ("-01.0000000000", (-1).ToString ("00.0.00.000.0000", _nfi), "#03"); + } + + [Test] + public void Test08011 () + { + Assert.AreEqual ("", 0.ToString ("##.#.##.###.####", _nfi), "#01"); + Assert.AreEqual ("1", 1.ToString ("##.#.##.###.####", _nfi), "#02"); + Assert.AreEqual ("-1", (-1).ToString ("##.#.##.###.####", _nfi), "#03"); + } + + [Test] + public void Test08012 () + { + Assert.AreEqual ("00", 0.ToString ("0#.#.##.###.####", _nfi), "#01"); + Assert.AreEqual ("01", 1.ToString ("0#.#.##.###.####", _nfi), "#02"); + Assert.AreEqual ("-01", (-1).ToString ("0#.#.##.###.####", _nfi), "#03"); + } + + [Test] + public void Test08013 () + { + Assert.AreEqual ("0", 0.ToString ("#0.#.##.###.####", _nfi), "#01"); + Assert.AreEqual ("1", 1.ToString ("#0.#.##.###.####", _nfi), "#02"); + Assert.AreEqual ("-1", (-1).ToString ("#0.#.##.###.####", _nfi), "#03"); + } + + [Test] + public void Test08014 () + { + Assert.AreEqual (".0000000000", 0.ToString ("##.#.##.###.###0", _nfi), "#01"); + Assert.AreEqual ("1.0000000000", 1.ToString ("##.#.##.###.###0", _nfi), "#02"); + Assert.AreEqual ("-1.0000000000", (-1).ToString ("##.#.##.###.###0", _nfi), "#03"); + } + + [Test] + public void Test08015 () + { + Assert.AreEqual (".000000000", 0.ToString ("##.#.##.###.##0#", _nfi), "#01"); + Assert.AreEqual ("1.000000000", 1.ToString ("##.#.##.###.##0#", _nfi), "#02"); + Assert.AreEqual ("-1.000000000", (-1).ToString ("##.#.##.###.##0#", _nfi), "#03"); + } + + [Test] + public void Test08016 () + { + Assert.AreEqual (".000000000", 0.ToString ("##.#.##.##0.##0#", _nfi), "#01"); + Assert.AreEqual ("1.000000000", 1.ToString ("##.#.##.##0.##0#", _nfi), "#02"); + Assert.AreEqual ("-1.000000000", (-1).ToString ("##.#.##.##0.##0#", _nfi), "#03"); + } + + [Test] + public void Test08017 () + { + Assert.AreEqual ("0.000000000", 0.ToString ("#0.#.##.##0.##0#", _nfi), "#01"); + Assert.AreEqual ("1.000000000", 1.ToString ("#0.#.##.##0.##0#", _nfi), "#02"); + Assert.AreEqual ("-1.000000000", (-1).ToString ("#0.#.##.##0.##0#", _nfi), "#03"); + } + + [Test] + public void Test08018 () + { + Assert.AreEqual ("-0002147484", Int32.MinValue.ToString ("0000000000,", _nfi), "#01"); + Assert.AreEqual ("-0000002147", Int32.MinValue.ToString ("0000000000,,", _nfi), "#02"); + Assert.AreEqual ("-0000000002", Int32.MinValue.ToString ("0000000000,,,", _nfi), "#03"); + Assert.AreEqual ("0000000000", Int32.MinValue.ToString ("0000000000,,,,", _nfi), "#04"); + Assert.AreEqual ("0000000000", Int32.MinValue.ToString ("0000000000,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,", _nfi), "#05"); + } + + [Test] + public void Test08019 () + { + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString (",0000000000", _nfi), "#01"); + } + + [Test] + public void Test08020 () + { + Assert.AreEqual ("-0002147484", Int32.MinValue.ToString (",0000000000,", _nfi), "#01"); + } + + [Test] + public void Test08021 () + { + Assert.AreEqual ("-02,147,483,648", Int32.MinValue.ToString ("0,0000000000", _nfi), "#01"); + } + + [Test] + public void Test08022 () + { + Assert.AreEqual ("-02,147,483,648", Int32.MinValue.ToString ("0000000000,0", _nfi), "#01"); + } + + [Test] + public void Test08023 () + { + Assert.AreEqual ("-02,147,483,648", Int32.MinValue.ToString ("0,0,0,0,0,0,0,0,0,0,0", _nfi), "#01"); + } + + [Test] + public void Test08024 () + { + Assert.AreEqual ("-02,147,483,648", Int32.MinValue.ToString (",0,0,0,0,0,0,0,0,0,0,0", _nfi), "#01"); + } + + [Test] + public void Test08025 () + { + Assert.AreEqual ("-00,002,147,484", Int32.MinValue.ToString ("0,0,0,0,0,0,0,0,0,0,0,", _nfi), "#01"); + } + + [Test] + public void Test08026 () + { + Assert.AreEqual ("-00,002,147,484", Int32.MinValue.ToString (",0,0,0,0,0,0,0,0,0,0,0,", _nfi), "#01"); + } + + [Test] + public void Test08027 () + { + Assert.AreEqual ("-", Int32.MinValue.ToString (",", _nfi), "#01"); + } + + [Test] + public void Test08028 () + { + Assert.AreEqual ("-2147483648", Int32.MinValue.ToString (",##########", _nfi), "#01"); + } + + [Test] + public void Test08029 () + { + Assert.AreEqual ("-2147484", Int32.MinValue.ToString (",##########,", _nfi), "#01"); + } + + [Test] + public void Test08030 () + { + Assert.AreEqual ("-2,147,483,648", Int32.MinValue.ToString ("#,##########", _nfi), "#01"); + } + + [Test] + public void Test08031 () + { + Assert.AreEqual ("-2,147,483,648", Int32.MinValue.ToString ("##########,#", _nfi), "#01"); + } + + [Test] + public void Test08032 () + { + Assert.AreEqual ("-2,147,483,648", Int32.MinValue.ToString ("#,#,#,#,#,#,#,#,#,#,#", _nfi), "#01"); + } + + [Test] + public void Test08033 () + { + Assert.AreEqual ("-2,147,483,648", Int32.MinValue.ToString (",#,#,#,#,#,#,#,#,#,#,#", _nfi), "#01"); + } + + [Test] + public void Test08034 () + { + Assert.AreEqual ("-2,147,484", Int32.MinValue.ToString ("#,#,#,#,#,#,#,#,#,#,#,", _nfi), "#01"); + } + + [Test] + public void Test08035 () + { + Assert.AreEqual ("-2,147,484", Int32.MinValue.ToString (",#,#,#,#,#,#,#,#,#,#,#,", _nfi), "#01"); + } + + [Test] + public void Test08036 () + { + Assert.AreEqual ("-1", (-1000).ToString ("##########,", _nfi), "#01"); + } + + [Test] + public void Test08037 () + { + Assert.AreEqual ("", (-100).ToString ("##########,", _nfi), "#01"); + } + + [Test] + public void Test08038 () + { + Assert.AreEqual ("-%", Int32.MinValue.ToString ("%", _nfi), "#01"); + } + + [Test] + public void Test08039 () + { + Assert.AreEqual ("-214748364800%", Int32.MinValue.ToString ("0%", _nfi), "#01"); + } + + [Test] + public void Test08040 () + { + Assert.AreEqual ("-%214748364800", Int32.MinValue.ToString ("%0", _nfi), "#01"); + } + + [Test] + public void Test08041 () + { + Assert.AreEqual ("-%21474836480000%", Int32.MinValue.ToString ("%0%", _nfi), "#01"); + } + + [Test] + public void Test08042 () + { + Assert.AreEqual ("- % 21474836480000 % ", Int32.MinValue.ToString (" % 0 % ", _nfi), "#01"); + } + + [Test] + public void Test08043 () + { + Assert.AreEqual ("-214748365%", Int32.MinValue.ToString ("0%,", _nfi), "#01"); + } + + [Test] + public void Test08044 () + { + Assert.AreEqual ("-214748365%", Int32.MinValue.ToString ("0,%", _nfi), "#01"); + } + + [Test] + public void Test08045 () + { + Assert.AreEqual ("-%214748364800", Int32.MinValue.ToString (",%0", _nfi), "#01"); + } + + [Test] + public void Test08046 () + { + Assert.AreEqual ("-%214748364800", Int32.MinValue.ToString ("%,0", _nfi), "#01"); + } + + [Test] + public void Test08047 () + { + Assert.AreEqual ("-2147483648%%%%%%", Int32.MinValue.ToString ("0,,,,%%%%%%", _nfi), "#01"); + } + + [Test] + public void Test08048 () + { + Assert.AreEqual ("-2147483648%%%%%%", Int32.MinValue.ToString ("0%%%%%%,,,,", _nfi), "#01"); + } + + [Test] + public void Test08049 () + { + Assert.AreEqual ("-%%%%%%2147483648", Int32.MinValue.ToString ("%%%%%%0,,,,", _nfi), "#01"); + } + + [Test] + public void Test08050 () + { + Assert.AreEqual ("E+0", Int32.MinValue.ToString ("E+0", _nfi), "#01"); + Assert.AreEqual ("e+0", Int32.MinValue.ToString ("e+0", _nfi), "#02"); + Assert.AreEqual ("E0", Int32.MinValue.ToString ("E-0", _nfi), "#03"); + Assert.AreEqual ("e0", Int32.MinValue.ToString ("e-0", _nfi), "#04"); + } + + [Test] + public void Test08051 () + { + Assert.AreEqual ("-2E+9", Int32.MinValue.ToString ("0E+0", _nfi), "#01"); + Assert.AreEqual ("-2e+9", Int32.MinValue.ToString ("0e+0", _nfi), "#02"); + Assert.AreEqual ("-2E9", Int32.MinValue.ToString ("0E-0", _nfi), "#03"); + Assert.AreEqual ("-2e9", Int32.MinValue.ToString ("0e-0", _nfi), "#04"); + Assert.AreEqual ("-2E9", Int32.MinValue.ToString ("0E0", _nfi), "#05"); + Assert.AreEqual ("-2e9", Int32.MinValue.ToString ("0e0", _nfi), "#06"); + } + + [Test] + public void Test08052 () + { + Assert.AreEqual ("-2E+9", Int32.MinValue.ToString ("#E+0", _nfi), "#01"); + Assert.AreEqual ("-2e+9", Int32.MinValue.ToString ("#e+0", _nfi), "#02"); + Assert.AreEqual ("-2E9", Int32.MinValue.ToString ("#E-0", _nfi), "#03"); + Assert.AreEqual ("-2e9", Int32.MinValue.ToString ("#e-0", _nfi), "#04"); + Assert.AreEqual ("-2E9", Int32.MinValue.ToString ("#E0", _nfi), "#05"); + Assert.AreEqual ("-2e9", Int32.MinValue.ToString ("#e0", _nfi), "#06"); + } + + [Test] + public void Test08053 () + { + Assert.AreEqual ("-2147483648E+0", Int32.MinValue.ToString ("0000000000E+0", _nfi), "#01"); + Assert.AreEqual ("-2147483648e+0", Int32.MinValue.ToString ("0000000000e+0", _nfi), "#02"); + Assert.AreEqual ("-2147483648E0", Int32.MinValue.ToString ("0000000000E-0", _nfi), "#03"); + Assert.AreEqual ("-2147483648e0", Int32.MinValue.ToString ("0000000000e-0", _nfi), "#04"); + Assert.AreEqual ("-2147483648E0", Int32.MinValue.ToString ("0000000000E0", _nfi), "#05"); + Assert.AreEqual ("-2147483648e0", Int32.MinValue.ToString ("0000000000e0", _nfi), "#06"); + } + + [Test] + public void Test08054 () + { + Assert.AreEqual ("-21474836480E-1", Int32.MinValue.ToString ("00000000000E+0", _nfi), "#01"); + Assert.AreEqual ("-21474836480e-1", Int32.MinValue.ToString ("00000000000e+0", _nfi), "#02"); + Assert.AreEqual ("-21474836480E-1", Int32.MinValue.ToString ("00000000000E-0", _nfi), "#03"); + Assert.AreEqual ("-21474836480e-1", Int32.MinValue.ToString ("00000000000e-0", _nfi), "#04"); + Assert.AreEqual ("-21474836480E-1", Int32.MinValue.ToString ("00000000000E0", _nfi), "#05"); + Assert.AreEqual ("-21474836480e-1", Int32.MinValue.ToString ("00000000000e0", _nfi), "#06"); + } + + [Test] + public void Test08055 () + { + Assert.AreEqual ("-214748365E+1", Int32.MinValue.ToString ("000000000E+0", _nfi), "#01"); + Assert.AreEqual ("-214748365e+1", Int32.MinValue.ToString ("000000000e+0", _nfi), "#02"); + Assert.AreEqual ("-214748365E1", Int32.MinValue.ToString ("000000000E-0", _nfi), "#03"); + Assert.AreEqual ("-214748365e1", Int32.MinValue.ToString ("000000000e-0", _nfi), "#04"); + Assert.AreEqual ("-214748365E1", Int32.MinValue.ToString ("000000000E0", _nfi), "#05"); + Assert.AreEqual ("-214748365e1", Int32.MinValue.ToString ("000000000e0", _nfi), "#06"); + } + + [Test] + public void Test08056 () + { + Assert.AreEqual ("-21474836E+2", Int32.MinValue.ToString ("00000000E+0", _nfi), "#01"); + Assert.AreEqual ("-21474836e+2", Int32.MinValue.ToString ("00000000e+0", _nfi), "#02"); + Assert.AreEqual ("-21474836E2", Int32.MinValue.ToString ("00000000E-0", _nfi), "#03"); + Assert.AreEqual ("-21474836e2", Int32.MinValue.ToString ("00000000e-0", _nfi), "#04"); + Assert.AreEqual ("-21474836E2", Int32.MinValue.ToString ("00000000E0", _nfi), "#05"); + Assert.AreEqual ("-21474836e2", Int32.MinValue.ToString ("00000000e0", _nfi), "#06"); + } + + [Test] + public void Test08057 () + { + Assert.AreEqual ("-2147483648E+00", Int32.MinValue.ToString ("0000000000E+00", _nfi), "#01"); + Assert.AreEqual ("-2147483648e+00", Int32.MinValue.ToString ("0000000000e+00", _nfi), "#02"); + Assert.AreEqual ("-2147483648E00", Int32.MinValue.ToString ("0000000000E-00", _nfi), "#03"); + Assert.AreEqual ("-2147483648e00", Int32.MinValue.ToString ("0000000000e-00", _nfi), "#04"); + Assert.AreEqual ("-2147483648E00", Int32.MinValue.ToString ("0000000000E00", _nfi), "#05"); + Assert.AreEqual ("-2147483648e00", Int32.MinValue.ToString ("0000000000e00", _nfi), "#06"); + } + + [Test] + public void Test08058 () + { + Assert.AreEqual ("-2147483648E+02%", Int32.MinValue.ToString ("0000000000E+00%", _nfi), "#01"); + Assert.AreEqual ("-2147483648e+02%", Int32.MinValue.ToString ("0000000000e+00%", _nfi), "#02"); + Assert.AreEqual ("-2147483648E02%", Int32.MinValue.ToString ("0000000000E-00%", _nfi), "#03"); + Assert.AreEqual ("-2147483648e02%", Int32.MinValue.ToString ("0000000000e-00%", _nfi), "#04"); + Assert.AreEqual ("-2147483648E02%", Int32.MinValue.ToString ("0000000000E00%", _nfi), "#05"); + Assert.AreEqual ("-2147483648e02%", Int32.MinValue.ToString ("0000000000e00%", _nfi), "#06"); + } + + [Test] + public void Test08059 () + { + Assert.AreEqual ("-2147483648E+10%%%%%", Int32.MinValue.ToString ("0000000000E+00%%%%%", _nfi), "#01"); + Assert.AreEqual ("-2147483648e+10%%%%%", Int32.MinValue.ToString ("0000000000e+00%%%%%", _nfi), "#02"); + Assert.AreEqual ("-2147483648E10%%%%%", Int32.MinValue.ToString ("0000000000E-00%%%%%", _nfi), "#03"); + Assert.AreEqual ("-2147483648e10%%%%%", Int32.MinValue.ToString ("0000000000e-00%%%%%", _nfi), "#04"); + Assert.AreEqual ("-2147483648E10%%%%%", Int32.MinValue.ToString ("0000000000E00%%%%%", _nfi), "#05"); + Assert.AreEqual ("-2147483648e10%%%%%", Int32.MinValue.ToString ("0000000000e00%%%%%", _nfi), "#06"); + } + + [Test] + public void Test08060 () + { + Assert.AreEqual ("-2147483648E-03", Int32.MinValue.ToString ("0000000000E+00,", _nfi), "#01"); + Assert.AreEqual ("-2147483648e-03", Int32.MinValue.ToString ("0000000000e+00,", _nfi), "#02"); + Assert.AreEqual ("-2147483648E-03", Int32.MinValue.ToString ("0000000000E-00,", _nfi), "#03"); + Assert.AreEqual ("-2147483648e-03", Int32.MinValue.ToString ("0000000000e-00,", _nfi), "#04"); + Assert.AreEqual ("-2147483648E-03", Int32.MinValue.ToString ("0000000000E00,", _nfi), "#05"); + Assert.AreEqual ("-2147483648e-03", Int32.MinValue.ToString ("0000000000e00,", _nfi), "#06"); + } + + [Test] + public void Test08061 () + { + Assert.AreEqual ("-2147483648E-12", Int32.MinValue.ToString ("0000000000E+00,,,,", _nfi), "#01"); + Assert.AreEqual ("-2147483648e-12", Int32.MinValue.ToString ("0000000000e+00,,,,", _nfi), "#02"); + Assert.AreEqual ("-2147483648E-12", Int32.MinValue.ToString ("0000000000E-00,,,,", _nfi), "#03"); + Assert.AreEqual ("-2147483648e-12", Int32.MinValue.ToString ("0000000000e-00,,,,", _nfi), "#04"); + Assert.AreEqual ("-2147483648E-12", Int32.MinValue.ToString ("0000000000E00,,,,", _nfi), "#05"); + Assert.AreEqual ("-2147483648e-12", Int32.MinValue.ToString ("0000000000e00,,,,", _nfi), "#06"); + } + + [Test] + public void Test08062 () + { + Assert.AreEqual ("-2147483648E-04%%%%", Int32.MinValue.ToString ("0000000000E+00,,,,%%%%", _nfi), "#01"); + Assert.AreEqual ("-2147483648e-04%%%%", Int32.MinValue.ToString ("0000000000e+00,,,,%%%%", _nfi), "#02"); + Assert.AreEqual ("-2147483648E-04%%%%", Int32.MinValue.ToString ("0000000000E-00,,,,%%%%", _nfi), "#03"); + Assert.AreEqual ("-2147483648e-04%%%%", Int32.MinValue.ToString ("0000000000e-00,,,,%%%%", _nfi), "#04"); + Assert.AreEqual ("-2147483648E-04%%%%", Int32.MinValue.ToString ("0000000000E00,,,,%%%%", _nfi), "#05"); + Assert.AreEqual ("-2147483648e-04%%%%", Int32.MinValue.ToString ("0000000000e00,,,,%%%%", _nfi), "#06"); + } + + [Test] + public void Test08063 () + { + Assert.AreEqual ("-2147483648E-07%%%%", Int32.MinValue.ToString ("0000000000,E+00,,,,%%%%", _nfi), "#01"); + Assert.AreEqual ("-2147483648e-07%%%%", Int32.MinValue.ToString ("0000000000,e+00,,,,%%%%", _nfi), "#02"); + Assert.AreEqual ("-2147483648E-07%%%%", Int32.MinValue.ToString ("0000000000,E-00,,,,%%%%", _nfi), "#03"); + Assert.AreEqual ("-2147483648e-07%%%%", Int32.MinValue.ToString ("0000000000,e-00,,,,%%%%", _nfi), "#04"); + Assert.AreEqual ("-2147483648E-07%%%%", Int32.MinValue.ToString ("0000000000,E00,,,,%%%%", _nfi), "#05"); + Assert.AreEqual ("-2147483648e-07%%%%", Int32.MinValue.ToString ("0000000000,e00,,,,%%%%", _nfi), "#06"); + } + + [Test] + public void Test08064 () + { + Assert.AreEqual ("-000,000,214,7E+48%%%%", Int32.MinValue.ToString ("0000000000,E,+00,,,,%%%%", _nfi), "#01"); + Assert.AreEqual ("-000,000,214,7e+48%%%%", Int32.MinValue.ToString ("0000000000,e,+00,,,,%%%%", _nfi), "#02"); + Assert.AreEqual ("-000,000,214,7E-48%%%%", Int32.MinValue.ToString ("0000000000,E,-00,,,,%%%%", _nfi), "#03"); + Assert.AreEqual ("-000,000,214,7e-48%%%%", Int32.MinValue.ToString ("0000000000,e,-00,,,,%%%%", _nfi), "#04"); + Assert.AreEqual ("-000,000,214,7E48%%%%", Int32.MinValue.ToString ("0000000000,E,00,,,,%%%%", _nfi), "#05"); + Assert.AreEqual ("-000,000,214,7e48%%%%", Int32.MinValue.ToString ("0000000000,e,00,,,,%%%%", _nfi), "#06"); + } + + [Test] + public void Test08065 () + { + Assert.AreEqual ("-000,000,214,7E+48%%%%", Int32.MinValue.ToString ("0000000000,E+,00,,,,%%%%", _nfi), "#01"); + Assert.AreEqual ("-000,000,214,7e+48%%%%", Int32.MinValue.ToString ("0000000000,e+,00,,,,%%%%", _nfi), "#02"); + Assert.AreEqual ("-000,000,214,7E-48%%%%", Int32.MinValue.ToString ("0000000000,E-,00,,,,%%%%", _nfi), "#03"); + Assert.AreEqual ("-000,000,214,7e-48%%%%", Int32.MinValue.ToString ("0000000000,e-,00,,,,%%%%", _nfi), "#04"); + } + + [Test] + public void Test08066 () + { + Assert.AreEqual ("-21,474,836,48E-50%%%%", Int32.MinValue.ToString ("0000000000,E+0,0,,,,%%%%", _nfi), "#01"); + Assert.AreEqual ("-21,474,836,48e-50%%%%", Int32.MinValue.ToString ("0000000000,e+0,0,,,,%%%%", _nfi), "#02"); + Assert.AreEqual ("-21,474,836,48E-50%%%%", Int32.MinValue.ToString ("0000000000,E-0,0,,,,%%%%", _nfi), "#03"); + Assert.AreEqual ("-21,474,836,48e-50%%%%", Int32.MinValue.ToString ("0000000000,e-0,0,,,,%%%%", _nfi), "#04"); + Assert.AreEqual ("-21,474,836,48E-50%%%%", Int32.MinValue.ToString ("0000000000,E0,0,,,,%%%%", _nfi), "#05"); + Assert.AreEqual ("-21,474,836,48e-50%%%%", Int32.MinValue.ToString ("0000000000,e0,0,,,,%%%%", _nfi), "#06"); + } + + [Test] + public void Test08067 () + { + Assert.AreEqual ("-2147483648E-01,%%%%", Int32.MinValue.ToString (@"0000000000E+00\,,,,%%%%", _nfi), "#01"); + Assert.AreEqual ("-2147483648e-01,%%%%", Int32.MinValue.ToString (@"0000000000e+00\,,,,%%%%", _nfi), "#02"); + Assert.AreEqual ("-2147483648E-01,%%%%", Int32.MinValue.ToString (@"0000000000E-00\,,,,%%%%", _nfi), "#03"); + Assert.AreEqual ("-2147483648e-01,%%%%", Int32.MinValue.ToString (@"0000000000e-00\,,,,%%%%", _nfi), "#04"); + Assert.AreEqual ("-2147483648E-01,%%%%", Int32.MinValue.ToString (@"0000000000E00\,,,,%%%%", _nfi), "#05"); + Assert.AreEqual ("-2147483648e-01,%%%%", Int32.MinValue.ToString (@"0000000000e00\,,,,%%%%", _nfi), "#06"); + } + + [Test] + public void Test08068 () + { + Assert.AreEqual ("-2147483648E+02,,%%%%", Int32.MinValue.ToString (@"0000000000E+00\,,,\,%%%%", _nfi), "#01"); + Assert.AreEqual ("-2147483648e+02,,%%%%", Int32.MinValue.ToString (@"0000000000e+00\,,,\,%%%%", _nfi), "#02"); + Assert.AreEqual ("-2147483648E02,,%%%%", Int32.MinValue.ToString (@"0000000000E-00\,,,\,%%%%", _nfi), "#03"); + Assert.AreEqual ("-2147483648e02,,%%%%", Int32.MinValue.ToString (@"0000000000e-00\,,,\,%%%%", _nfi), "#04"); + Assert.AreEqual ("-2147483648E02,,%%%%", Int32.MinValue.ToString (@"0000000000E00\,,,\,%%%%", _nfi), "#05"); + Assert.AreEqual ("-2147483648e02,,%%%%", Int32.MinValue.ToString (@"0000000000e00\,,,\,%%%%", _nfi), "#06"); + } + + [Test] + public void Test08069 () + { + Assert.AreEqual ("-2147483648E+00,,%%%%", Int32.MinValue.ToString (@"0000000000E+00\,,,\,\%%%%", _nfi), "#01"); + Assert.AreEqual ("-2147483648e+00,,%%%%", Int32.MinValue.ToString (@"0000000000e+00\,,,\,\%%%%", _nfi), "#02"); + Assert.AreEqual ("-2147483648E00,,%%%%", Int32.MinValue.ToString (@"0000000000E-00\,,,\,\%%%%", _nfi), "#03"); + Assert.AreEqual ("-2147483648e00,,%%%%", Int32.MinValue.ToString (@"0000000000e-00\,,,\,\%%%%", _nfi), "#04"); + Assert.AreEqual ("-2147483648E00,,%%%%", Int32.MinValue.ToString (@"0000000000E00\,,,\,\%%%%", _nfi), "#05"); + Assert.AreEqual ("-2147483648e00,,%%%%", Int32.MinValue.ToString (@"0000000000e00\,,,\,\%%%%", _nfi), "#06"); + } + + [Test] + public void Test08070 () + { + Assert.AreEqual ("-2147483648E-02,,%%%%", Int32.MinValue.ToString (@"0000000000E+00\,,,\,\%%%\%", _nfi), "#01"); + Assert.AreEqual ("-2147483648e-02,,%%%%", Int32.MinValue.ToString (@"0000000000e+00\,,,\,\%%%\%", _nfi), "#02"); + Assert.AreEqual ("-2147483648E-02,,%%%%", Int32.MinValue.ToString (@"0000000000E-00\,,,\,\%%%\%", _nfi), "#03"); + Assert.AreEqual ("-2147483648e-02,,%%%%", Int32.MinValue.ToString (@"0000000000e-00\,,,\,\%%%\%", _nfi), "#04"); + Assert.AreEqual ("-2147483648E-02,,%%%%", Int32.MinValue.ToString (@"0000000000E00\,,,\,\%%%\%", _nfi), "#05"); + Assert.AreEqual ("-2147483648e-02,,%%%%", Int32.MinValue.ToString (@"0000000000e00\,,,\,\%%%\%", _nfi), "#06"); + } + + [Test] + public void Test08071 () + { + Assert.AreEqual (@"-2147483648E-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000E+00\\,,,\\,\\%%%\\%", _nfi), "#01"); + Assert.AreEqual (@"-2147483648e-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000e+00\\,,,\\,\\%%%\\%", _nfi), "#02"); + Assert.AreEqual (@"-2147483648E-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000E-00\\,,,\\,\\%%%\\%", _nfi), "#03"); + Assert.AreEqual (@"-2147483648e-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000e-00\\,,,\\,\\%%%\\%", _nfi), "#04"); + Assert.AreEqual (@"-2147483648E-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000E00\\,,,\\,\\%%%\\%", _nfi), "#05"); + Assert.AreEqual (@"-2147483648e-04\\\%%%\%", Int32.MinValue.ToString (@"0000000000e00\\,,,\\,\\%%%\\%", _nfi), "#06"); + } + + [Test] + public void Test08072 () + { + Assert.AreEqual (@"-2147483648E+00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000E+00\\,\,,\\\,\\%%%\\\%", _nfi), "#01"); + Assert.AreEqual (@"-2147483648e+00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000e+00\\,\,,\\\,\\%%%\\\%", _nfi), "#02"); + Assert.AreEqual (@"-2147483648E00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000E-00\\,\,,\\\,\\%%%\\\%", _nfi), "#03"); + Assert.AreEqual (@"-2147483648e00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000e-00\\,\,,\\\,\\%%%\\\%", _nfi), "#04"); + Assert.AreEqual (@"-2147483648E00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000E00\\,\,,\\\,\\%%%\\\%", _nfi), "#05"); + Assert.AreEqual (@"-2147483648e00\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000e00\\,\,,\\\,\\%%%\\\%", _nfi), "#06"); + } + + [Test] + public void Test08073 () + { + Assert.AreEqual (@"-0021474836E+48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\E+00\\,\,,\\\,\\%%%\\\%", _nfi), "#01"); + Assert.AreEqual (@"-0021474836e+48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\e+00\\,\,,\\\,\\%%%\\\%", _nfi), "#02"); + Assert.AreEqual (@"-0021474836E-48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\E-00\\,\,,\\\,\\%%%\\\%", _nfi), "#03"); + Assert.AreEqual (@"-0021474836e-48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\e-00\\,\,,\\\,\\%%%\\\%", _nfi), "#04"); + Assert.AreEqual (@"-0021474836E48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\E00\\,\,,\\\,\\%%%\\\%", _nfi), "#05"); + Assert.AreEqual (@"-0021474836e48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000\e00\\,\,,\\\,\\%%%\\\%", _nfi), "#06"); + } + + [Test] + public void Test08074 () + { + Assert.AreEqual (@"-0021474836E+48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000E\+00\\,\,,\\\,\\%%%\\\%", _nfi), "#01"); + Assert.AreEqual (@"-0021474836e+48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000e\+00\\,\,,\\\,\\%%%\\\%", _nfi), "#02"); + Assert.AreEqual (@"-0021474836E-48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000E\-00\\,\,,\\\,\\%%%\\\%", _nfi), "#03"); + Assert.AreEqual (@"-0021474836e-48\,\,\%%%\%", Int32.MinValue.ToString (@"0000000000e\-00\\,\,,\\\,\\%%%\\\%", _nfi), "#04"); + } + + [Test] + public void Test08075 () + { + Assert.AreEqual ("-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E+00,,,',%'%%%", _nfi), "#01"); + Assert.AreEqual ("-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e+00,,,',%'%%%", _nfi), "#02"); + Assert.AreEqual ("-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E-00,,,',%'%%%", _nfi), "#03"); + Assert.AreEqual ("-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e-00,,,',%'%%%", _nfi), "#04"); + Assert.AreEqual ("-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E00,,,',%'%%%", _nfi), "#05"); + Assert.AreEqual ("-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e00,,,',%'%%%", _nfi), "#06"); + } + + [Test] + public void Test08076 () + { + Assert.AreEqual ("-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E+00,,,\",%\"%%%", _nfi), "#01"); + Assert.AreEqual ("-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e+00,,,\",%\"%%%", _nfi), "#02"); + Assert.AreEqual ("-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E-00,,,\",%\"%%%", _nfi), "#03"); + Assert.AreEqual ("-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e-00,,,\",%\"%%%", _nfi), "#04"); + Assert.AreEqual ("-2147483648E-03,%%%%", Int32.MinValue.ToString ("0000000000E00,,,\",%\"%%%", _nfi), "#05"); + Assert.AreEqual ("-2147483648e-03,%%%%", Int32.MinValue.ToString ("0000000000e00,,,\",%\"%%%", _nfi), "#06"); + } + + [Test] + public void Test08077 () + { + Assert.AreEqual ("-", Int32.MinValue.ToString (";", _nfi), "#01"); + Assert.AreEqual ("", Int32.MaxValue.ToString (";", _nfi), "#02"); + Assert.AreEqual ("",0.ToString (";", _nfi), "#03"); + } + + [Test] + public void Test08078 () + { + Assert.AreEqual ("-2,147,483,648", Int32.MinValue.ToString ("#,#;", _nfi), "#01"); + Assert.AreEqual ("2,147,483,647", Int32.MaxValue.ToString ("#,#;", _nfi), "#02"); + Assert.AreEqual ("", 0.ToString ("#,#;", _nfi), "#03"); + } + + [Test] + public void Test08079 () + { + Assert.AreEqual ("2,147,483,648", Int32.MinValue.ToString (";#,#", _nfi), "#01"); + Assert.AreEqual ("", Int32.MaxValue.ToString (";#,#", _nfi), "#02"); + Assert.AreEqual ("", 0.ToString (";#,#", _nfi), "#03"); + } + + [Test] + public void Test08080 () + { + Assert.AreEqual ("2,147,483,648", Int32.MinValue.ToString ("0000000000,.0000000000;#,#", _nfi), "#01"); + Assert.AreEqual ("0002147483.6470000000", Int32.MaxValue.ToString ("0000000000,.0000000000;#,#", _nfi), "#02"); + Assert.AreEqual ("0000000000.0000000000", 0.ToString ("0000000000,.0000000000;#,#", _nfi), "#03"); + } + + [Test] + public void Test08081 () + { + Assert.AreEqual ("-", Int32.MinValue.ToString (";;", _nfi), "#01"); + Assert.AreEqual ("", Int32.MaxValue.ToString (";;", _nfi), "#02"); + Assert.AreEqual ("",0.ToString (";;", _nfi), "#03"); + } + + [Test] + public void Test08082 () + { + Assert.AreEqual ("-", Int32.MinValue.ToString (";;0%", _nfi), "#01"); + Assert.AreEqual ("", Int32.MaxValue.ToString (";;0%", _nfi), "#02"); + Assert.AreEqual ("0%",0.ToString (";;0%", _nfi), "#03"); + } + + [Test] + public void Test08083 () + { + Assert.AreEqual ("2147484", Int32.MinValue.ToString (";0,;0%", _nfi), "#01"); + Assert.AreEqual ("", Int32.MaxValue.ToString (";0,;0%", _nfi), "#02"); + Assert.AreEqual ("0%",0.ToString (";0,;0%", _nfi), "#03"); + } + + [Test] + public void Test08084 () + { + Assert.AreEqual ("2147484", Int32.MinValue.ToString ("0E+0;0,;0%", _nfi), "#01"); + Assert.AreEqual ("2E+9", Int32.MaxValue.ToString ("0E+0;0,;0%", _nfi), "#02"); + Assert.AreEqual ("0%",0.ToString ("0E+0;0,;0%", _nfi), "#03"); + } + + [Test] + public void Test08085 () + { + Assert.AreEqual ("214,748,364,80;0%", Int32.MinValue.ToString (@"0E+0;0,\;0%", _nfi), "#01"); + Assert.AreEqual ("2E+9", Int32.MaxValue.ToString (@"0E+0;0,\;0%", _nfi), "#02"); + Assert.AreEqual ("0E+0",0.ToString (@"0E+0;0,\;0%", _nfi), "#03"); + } + + [Test] + public void Test08086 () + { + Assert.AreEqual ("214,748,364,80;0%", Int32.MinValue.ToString ("0E+0;0,\";\"0%", _nfi), "#01"); + Assert.AreEqual ("2E+9", Int32.MaxValue.ToString ("0E+0;0,\";\"0%", _nfi), "#02"); + Assert.AreEqual ("0E+0",0.ToString ("0E+0;0,\";\"0%", _nfi), "#03"); + } + + [Test] + public void Test08087 () + { + // MS.NET bug? + NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo.Clone() as NumberFormatInfo; + nfi.NumberDecimalSeparator = "$$$"; + Assert.AreEqual ("-0000000000$$$2147483648", Int32.MinValue.ToString ("0000000000$$$0000000000", nfi), "#01"); + } + + [Test] + public void Test08088 () + { + // MS.NET bug? + NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo.Clone() as NumberFormatInfo; + nfi.NumberGroupSeparator = "$$$"; + Assert.AreEqual ("-0000000000$$$2147483648", Int32.MinValue.ToString ("0000000000$$$0000000000", nfi), "#01"); + } + + [Test] + public void Test08089 () + { + NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo.Clone() as NumberFormatInfo; + nfi.NumberGroupSizes = new int[] {3,2,1,0}; + Assert.AreEqual ("-00000000002147,4,83,648", Int32.MinValue.ToString ("0000000000,0000000000", nfi), "#01"); + } + + [Test] + public void Test08090 () + { + // MS.NET bug? + NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo.Clone() as NumberFormatInfo; + nfi.PercentSymbol = "$$$"; + Assert.AreEqual ("-0000000000$$$2147483648", Int32.MinValue.ToString ("0000000000$$$0000000000", nfi), "#01"); + } + + [Test] + public void Test08091 () + { + // MS.NET bug? + Assert.AreEqual ("B2147", Int32.MinValue.ToString ("A0,;B0,,;C0,,,;D0,,,,;E0,,,,,", _nfi), "#01"); + Assert.AreEqual ("A2147484", Int32.MaxValue.ToString ("A0,;B0,,;C0,,,;D0,,,,;E0,,,,,", _nfi), "#02"); + Assert.AreEqual ("C0", 0.ToString ("A0,;B0,,;C0,,,;D0,,,,;E0,,,,,", _nfi), "#03"); + } + + // Test10000- Double and D + [Test] + [ExpectedException (typeof (FormatException))] + public void Test10000 () + { + Assert.AreEqual ("0", 0.0.ToString ("D", _nfi), "#01"); + } + + // Test11000- Double and E + [Test] + public void Test11000 () + { + Assert.AreEqual ("0.000000E+000", 0.0.ToString ("E", _nfi), "#01"); + Assert.AreEqual ("0.000000e+000", 0.0.ToString ("e", _nfi), "#02"); + Assert.AreEqual ("-1.797693E+308", Double.MinValue.ToString ("E", _nfi), "#03"); + Assert.AreEqual ("-1.797693e+308", Double.MinValue.ToString ("e", _nfi), "#04"); + Assert.AreEqual ("1.797693E+308", Double.MaxValue.ToString ("E", _nfi), "#05"); + Assert.AreEqual ("1.797693e+308", Double.MaxValue.ToString ("e", _nfi), "#06"); + } + + [Test] + public void Test11001 () + { + Assert.AreEqual ("E ", 0.0.ToString ("E ", _nfi), "#01"); + Assert.AreEqual (" E", 0.0.ToString (" E", _nfi), "#02"); + Assert.AreEqual (" E ", 0.0.ToString (" E ", _nfi), "#03"); + } + + [Test] + public void Test11002 () + { + Assert.AreEqual ("-E ", (-1.0).ToString ("E ", _nfi), "#01"); + Assert.AreEqual ("- E", (-1.0).ToString (" E", _nfi), "#02"); + Assert.AreEqual ("- E ", (-1.0).ToString (" E ", _nfi), "#03"); + } + + [Test] + public void Test11003 () + { + Assert.AreEqual ("0E+000", 0.0.ToString ("E0", _nfi), "#01"); + Assert.AreEqual ("0.0000000000000000E+000", 0.0.ToString ("E16", _nfi), "#02"); + Assert.AreEqual ("0.00000000000000000E+000", 0.0.ToString ("E17", _nfi), "#03"); + Assert.AreEqual ("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E+000", 0.0.ToString ("E99", _nfi), "#04"); + Assert.AreEqual ("E100", 0.0.ToString ("E100", _nfi), "#05"); + } + + [Test] + public void Test11004 () + { + Assert.AreEqual ("2E+308", Double.MaxValue.ToString ("E0", _nfi), "#01"); + Assert.AreEqual ("1.7976931348623157E+308", Double.MaxValue.ToString ("E16", _nfi), "#02"); + Assert.AreEqual ("1.79769313486231570E+308", Double.MaxValue.ToString ("E17", _nfi), "#03"); + Assert.AreEqual ("1.797693134862315700000000000000000000000000000000000000000000000000000000000000000000000000000000000E+308", Double.MaxValue.ToString ("E99", _nfi), "#04"); + Assert.AreEqual ("E1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("E100", _nfi), "#05"); + } + + [Test] + public void Test11005 () + { + Assert.AreEqual ("-2E+308", Double.MinValue.ToString ("E0", _nfi), "#01"); + Assert.AreEqual ("-1.7976931348623157E+308", Double.MinValue.ToString ("E16", _nfi), "#02"); + Assert.AreEqual ("-1.79769313486231570E+308", Double.MinValue.ToString ("E17", _nfi), "#03"); + Assert.AreEqual ("-1.797693134862315700000000000000000000000000000000000000000000000000000000000000000000000000000000000E+308", Double.MinValue.ToString ("E99", _nfi), "#04"); + Assert.AreEqual ("-E1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("E100", _nfi), "#05"); + } + + [Test] + public void Test11006 () + { + Assert.AreEqual ("EF", 0.0.ToString ("EF", _nfi), "#01"); + Assert.AreEqual ("E0F", 0.0.ToString ("E0F", _nfi), "#02"); + Assert.AreEqual ("E0xF", 0.0.ToString ("E0xF", _nfi), "#03"); + } + + [Test] + public void Test11007 () + { + Assert.AreEqual ("EF", Double.MaxValue.ToString ("EF", _nfi), "#01"); + Assert.AreEqual ("E0F", Double.MaxValue.ToString ("E0F", _nfi), "#02"); + Assert.AreEqual ("E0xF", Double.MaxValue.ToString ("E0xF", _nfi), "#03"); + } + + [Test] + public void Test11008 () + { + Assert.AreEqual ("-EF", Double.MinValue.ToString ("EF", _nfi), "#01"); + Assert.AreEqual ("E0F", Double.MinValue.ToString ("E0F", _nfi), "#02"); + Assert.AreEqual ("E0xF", Double.MinValue.ToString ("E0xF", _nfi), "#03"); + } + + [Test] + public void Test11009 () + { + Assert.AreEqual ("0.00000000000000000E+000", 0.0.ToString ("E0000000000000000000000000000000000000017", _nfi), "#01"); + Assert.AreEqual ("1.79769313486231570E+308", Double.MaxValue.ToString ("E0000000000000000000000000000000000000017", _nfi), "#02"); + Assert.AreEqual ("-1.79769313486231570E+308", Double.MinValue.ToString ("E0000000000000000000000000000000000000017", _nfi), "#03"); + } + + [Test] + public void Test11010 () + { + Assert.AreEqual ("+E", 0.0.ToString ("+E", _nfi), "#01"); + Assert.AreEqual ("E+", 0.0.ToString ("E+", _nfi), "#02"); + Assert.AreEqual ("+E+", 0.0.ToString ("+E+", _nfi), "#03"); + } + + [Test] + public void Test11011 () + { + Assert.AreEqual ("+E", Double.MaxValue.ToString ("+E", _nfi), "#01"); + Assert.AreEqual ("E+", Double.MaxValue.ToString ("E+", _nfi), "#02"); + Assert.AreEqual ("+E+", Double.MaxValue.ToString ("+E+", _nfi), "#03"); + } + + [Test] + public void Test11012 () + { + Assert.AreEqual ("-+E", Double.MinValue.ToString ("+E", _nfi), "#01"); + Assert.AreEqual ("-E+", Double.MinValue.ToString ("E+", _nfi), "#02"); + Assert.AreEqual ("-+E+", Double.MinValue.ToString ("+E+", _nfi), "#03"); + } + + [Test] + public void Test11013 () + { + Assert.AreEqual ("-E", 0.0.ToString ("-E", _nfi), "#01"); + Assert.AreEqual ("E-", 0.0.ToString ("E-", _nfi), "#02"); + Assert.AreEqual ("-E-", 0.0.ToString ("-E-", _nfi), "#03"); + } + + [Test] + public void Test11014 () + { + Assert.AreEqual ("-E", Double.MaxValue.ToString ("-E", _nfi), "#01"); + Assert.AreEqual ("E-", Double.MaxValue.ToString ("E-", _nfi), "#02"); + Assert.AreEqual ("-E-", Double.MaxValue.ToString ("-E-", _nfi), "#03"); + } + + [Test] + public void Test11015 () + { + Assert.AreEqual ("--E", Double.MinValue.ToString ("-E", _nfi), "#01"); + Assert.AreEqual ("-E-", Double.MinValue.ToString ("E-", _nfi), "#02"); + Assert.AreEqual ("--E-", Double.MinValue.ToString ("-E-", _nfi), "#03"); + } + + [Test] + public void Test11016 () + { + Assert.AreEqual ("E+0", 0.0.ToString ("E+0", _nfi), "#01"); + Assert.AreEqual ("E+0", Double.MaxValue.ToString ("E+0", _nfi), "#02"); + Assert.AreEqual ("E+0", Double.MinValue.ToString ("E+0", _nfi), "#03"); + } + + [Test] + public void Test11017 () + { + Assert.AreEqual ("E+9", 0.0.ToString ("E+9", _nfi), "#01"); + Assert.AreEqual ("E+9", Double.MaxValue.ToString ("E+9", _nfi), "#02"); + Assert.AreEqual ("-E+9", Double.MinValue.ToString ("E+9", _nfi), "#03"); + } + + [Test] + public void Test11018 () + { + Assert.AreEqual ("E-9", 0.0.ToString ("E-9", _nfi), "#01"); + Assert.AreEqual ("E-9", Double.MaxValue.ToString ("E-9", _nfi), "#02"); + Assert.AreEqual ("-E-9", Double.MinValue.ToString ("E-9", _nfi), "#03"); + } + + [Test] + public void Test11019 () + { + Assert.AreEqual ("E0", 0.0.ToString ("E0,", _nfi), "#01"); + Assert.AreEqual ("E0", Double.MaxValue.ToString ("E0,", _nfi), "#02"); + Assert.AreEqual ("E0", Double.MinValue.ToString ("E0,", _nfi), "#03"); + } + + [Test] + public void Test11020 () + { + Assert.AreEqual ("E0", 0.0.ToString ("E0.", _nfi), "#01"); + Assert.AreEqual ("E0", Double.MaxValue.ToString ("E0.", _nfi), "#02"); + Assert.AreEqual ("E0", Double.MinValue.ToString ("E0.", _nfi), "#03"); + } + + [Test] + public void Test11021 () + { + Assert.AreEqual ("E0.0", 0.0.ToString ("E0.0", _nfi), "#01"); + Assert.AreEqual ("E309.2", Double.MaxValue.ToString ("E0.0", _nfi), "#02"); + Assert.AreEqual ("-E309.2", Double.MinValue.ToString ("E0.0", _nfi), "#03"); + } + + [Test] + public void Test11022 () + { + Assert.AreEqual ("E09", 0.0.ToString ("E0.9", _nfi), "#01"); + Assert.AreEqual ("E09", Double.MaxValue.ToString ("E0.9", _nfi), "#02"); + Assert.AreEqual ("E09", Double.MinValue.ToString ("E0.9", _nfi), "#03"); + } + + [Test] + public void Test11023 () + { + Assert.AreEqual ("1.1E+000", 1.05.ToString ("E1", _nfi), "#01"); + Assert.AreEqual ("1.2E+000", 1.15.ToString ("E1", _nfi), "#02"); + Assert.AreEqual ("1.3E+000", 1.25.ToString ("E1", _nfi), "#03"); + Assert.AreEqual ("1.4E+000", 1.35.ToString ("E1", _nfi), "#04"); + Assert.AreEqual ("1.5E+000", 1.45.ToString ("E1", _nfi), "#05"); + Assert.AreEqual ("1.6E+000", 1.55.ToString ("E1", _nfi), "#06"); + Assert.AreEqual ("1.7E+000", 1.65.ToString ("E1", _nfi), "#07"); + Assert.AreEqual ("1.8E+000", 1.75.ToString ("E1", _nfi), "#08"); + Assert.AreEqual ("1.9E+000", 1.85.ToString ("E1", _nfi), "#09"); + Assert.AreEqual ("2.0E+000", 1.95.ToString ("E1", _nfi), "#10"); + } + + [Test] + public void Test11024 () + { + Assert.AreEqual ("1.01E+000", 1.005.ToString ("E2", _nfi), "#01"); + Assert.AreEqual ("1.02E+000", 1.015.ToString ("E2", _nfi), "#02"); + Assert.AreEqual ("1.03E+000", 1.025.ToString ("E2", _nfi), "#03"); + Assert.AreEqual ("1.04E+000", 1.035.ToString ("E2", _nfi), "#04"); + Assert.AreEqual ("1.05E+000", 1.045.ToString ("E2", _nfi), "#05"); + Assert.AreEqual ("1.06E+000", 1.055.ToString ("E2", _nfi), "#06"); + Assert.AreEqual ("1.07E+000", 1.065.ToString ("E2", _nfi), "#07"); + Assert.AreEqual ("1.08E+000", 1.075.ToString ("E2", _nfi), "#08"); + Assert.AreEqual ("1.09E+000", 1.085.ToString ("E2", _nfi), "#09"); + Assert.AreEqual ("1.10E+000", 1.095.ToString ("E2", _nfi), "#10"); + } + + [Test] + public void Test11025 () + { + Assert.AreEqual ("1.00000000000001E+000", 1.000000000000005.ToString ("E14", _nfi), "#01"); + Assert.AreEqual ("1.00000000000002E+000", 1.000000000000015.ToString ("E14", _nfi), "#02"); + Assert.AreEqual ("1.00000000000003E+000", 1.000000000000025.ToString ("E14", _nfi), "#03"); + Assert.AreEqual ("1.00000000000004E+000", 1.000000000000035.ToString ("E14", _nfi), "#04"); + Assert.AreEqual ("1.00000000000005E+000", 1.000000000000045.ToString ("E14", _nfi), "#05"); + Assert.AreEqual ("1.00000000000006E+000", 1.000000000000055.ToString ("E14", _nfi), "#06"); + Assert.AreEqual ("1.00000000000007E+000", 1.000000000000065.ToString ("E14", _nfi), "#07"); + Assert.AreEqual ("1.00000000000008E+000", 1.000000000000075.ToString ("E14", _nfi), "#08"); + Assert.AreEqual ("1.00000000000009E+000", 1.000000000000085.ToString ("E14", _nfi), "#09"); + Assert.AreEqual ("1.00000000000010E+000", 1.000000000000095.ToString ("E14", _nfi), "#10"); + } + + [Test] + public void Test11026 () + { + Assert.AreEqual ("1.000000000000000E+000", 1.0000000000000005.ToString ("E15", _nfi), "#01"); + Assert.AreEqual ("1.000000000000002E+000", 1.0000000000000015.ToString ("E15", _nfi), "#02"); + Assert.AreEqual ("1.000000000000002E+000", 1.0000000000000025.ToString ("E15", _nfi), "#03"); + Assert.AreEqual ("1.000000000000004E+000", 1.0000000000000035.ToString ("E15", _nfi), "#04"); + Assert.AreEqual ("1.000000000000004E+000", 1.0000000000000045.ToString ("E15", _nfi), "#05"); + Assert.AreEqual ("1.000000000000006E+000", 1.0000000000000055.ToString ("E15", _nfi), "#06"); + Assert.AreEqual ("1.000000000000006E+000", 1.0000000000000065.ToString ("E15", _nfi), "#07"); + Assert.AreEqual ("1.000000000000008E+000", 1.0000000000000075.ToString ("E15", _nfi), "#08"); + Assert.AreEqual ("1.000000000000008E+000", 1.0000000000000085.ToString ("E15", _nfi), "#09"); + Assert.AreEqual ("1.000000000000010E+000", 1.0000000000000095.ToString ("E15", _nfi), "#10"); + } + + [Test] + public void Test11027 () + { + Assert.AreEqual ("1.0000000000000000E+000", 1.00000000000000005.ToString ("E16", _nfi), "#01"); + Assert.AreEqual ("1.0000000000000002E+000", 1.00000000000000015.ToString ("E16", _nfi), "#02"); + Assert.AreEqual ("1.0000000000000002E+000", 1.00000000000000025.ToString ("E16", _nfi), "#03"); + Assert.AreEqual ("1.0000000000000004E+000", 1.00000000000000035.ToString ("E16", _nfi), "#04"); + Assert.AreEqual ("1.0000000000000004E+000", 1.00000000000000045.ToString ("E16", _nfi), "#05"); + Assert.AreEqual ("1.0000000000000004E+000", 1.00000000000000055.ToString ("E16", _nfi), "#06"); + Assert.AreEqual ("1.0000000000000007E+000", 1.00000000000000065.ToString ("E16", _nfi), "#07"); + Assert.AreEqual ("1.0000000000000007E+000", 1.00000000000000075.ToString ("E16", _nfi), "#08"); + Assert.AreEqual ("1.0000000000000009E+000", 1.00000000000000085.ToString ("E16", _nfi), "#09"); + Assert.AreEqual ("1.0000000000000009E+000", 1.00000000000000095.ToString ("E16", _nfi), "#10"); + } + + [Test] + public void Test11028 () + { + Assert.AreEqual ("1.00000000000000000E+000", 1.000000000000000005.ToString ("E17", _nfi), "#01"); + Assert.AreEqual ("1.00000000000000000E+000", 1.000000000000000015.ToString ("E17", _nfi), "#02"); + Assert.AreEqual ("1.00000000000000000E+000", 1.000000000000000025.ToString ("E17", _nfi), "#03"); + Assert.AreEqual ("1.00000000000000000E+000", 1.000000000000000035.ToString ("E17", _nfi), "#04"); + Assert.AreEqual ("1.00000000000000000E+000", 1.000000000000000045.ToString ("E17", _nfi), "#05"); + Assert.AreEqual ("1.00000000000000000E+000", 1.000000000000000055.ToString ("E17", _nfi), "#06"); + Assert.AreEqual ("1.00000000000000000E+000", 1.000000000000000065.ToString ("E17", _nfi), "#07"); + Assert.AreEqual ("1.00000000000000000E+000", 1.000000000000000075.ToString ("E17", _nfi), "#08"); + Assert.AreEqual ("1.00000000000000000E+000", 1.000000000000000085.ToString ("E17", _nfi), "#09"); + Assert.AreEqual ("1.00000000000000000E+000", 1.000000000000000095.ToString ("E17", _nfi), "#10"); + } + + [Test] + public void Test11029 () + { + Assert.AreEqual ("1E+000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("E0"), "#01"); + Assert.AreEqual ("1.2345678901234567E+000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("E16"), "#02"); + Assert.AreEqual ("1.23456789012345670E+000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("E17"), "#03"); + Assert.AreEqual ("1.234567890123456700000000000000000000000000000000000000000000000000000000000000000000000000000000000E+000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("E99"), "#04"); + Assert.AreEqual ("E101", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("E100"), "#04"); + } + + [Test] + public void Test11030 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberDecimalSeparator = "#"; + Assert.AreEqual ("-1#000000E+008", (-99999999.9).ToString ("E", nfi), "#01"); + } + + [Test] + public void Test11031 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "+"; + nfi.PositiveSign = "-"; + + Assert.AreEqual ("1.000000E-000", 1.0.ToString ("E", nfi), "#01"); + Assert.AreEqual ("0.000000E-000", 0.0.ToString ("E", nfi), "#02"); + Assert.AreEqual ("+1.000000E-000", (-1.0).ToString ("E", nfi), "#03"); + } + + [Test] + public void TestNaNToString () + { + Assert.AreEqual ("Infinity", Double.PositiveInfinity.ToString(), "#01"); + Assert.AreEqual ("-Infinity", Double.NegativeInfinity.ToString(), "#02"); + Assert.AreEqual ("NaN", Double.NaN.ToString(), "#03"); + Assert.AreEqual ("Infinity", Single.PositiveInfinity.ToString(), "#04"); + Assert.AreEqual ("-Infinity", Single.NegativeInfinity.ToString(), "#05"); + Assert.AreEqual ("NaN", Single.NaN.ToString(), "#06"); + + Assert.AreEqual ("Infinity", Double.PositiveInfinity.ToString("R"), "#07"); + Assert.AreEqual ("-Infinity", Double.NegativeInfinity.ToString("R"), "#08"); + Assert.AreEqual ("NaN", Double.NaN.ToString("R"), "#09"); + Assert.AreEqual ("Infinity", Single.PositiveInfinity.ToString("R"), "#10"); + Assert.AreEqual ("-Infinity", Single.NegativeInfinity.ToString("R"), "#11"); + Assert.AreEqual ("NaN", Single.NaN.ToString("R"), "#12"); + } + + [Test] + public void Test11032 () + { + Assert.AreEqual ("Infinity", (Double.MaxValue / 0.0).ToString ("E99", _nfi) , "#01"); + Assert.AreEqual ("-Infinity", (Double.MinValue / 0.0).ToString ("E99", _nfi) , "#02"); + Assert.AreEqual ("NaN", (0.0 / 0.0).ToString ("E99", _nfi) , "#03"); + } + + // Test12000- Double and F + [Test] + public void Test12000 () + { + Assert.AreEqual ("0.00", 0.0.ToString ("F", _nfi), "#01"); + Assert.AreEqual ("0.00", 0.0.ToString ("f", _nfi), "#02"); + Assert.AreEqual ("-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00", Double.MinValue.ToString ("F", _nfi), "#03"); + Assert.AreEqual ("-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00", Double.MinValue.ToString ("f", _nfi), "#04"); + Assert.AreEqual ("179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00", Double.MaxValue.ToString ("F", _nfi), "#05"); + Assert.AreEqual ("179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00", Double.MaxValue.ToString ("f", _nfi), "#06"); + } + + [Test] + public void Test12001 () + { + Assert.AreEqual ("F ", 0.0.ToString ("F ", _nfi), "#01"); + Assert.AreEqual (" F", 0.0.ToString (" F", _nfi), "#02"); + Assert.AreEqual (" F ", 0.0.ToString (" F ", _nfi), "#03"); + } + + [Test] + public void Test12002 () + { + Assert.AreEqual ("-F ", (-1.0).ToString ("F ", _nfi), "#01"); + Assert.AreEqual ("- F", (-1.0).ToString (" F", _nfi), "#02"); + Assert.AreEqual ("- F ", (-1.0).ToString (" F ", _nfi), "#03"); + } + + [Test] + public void Test12003 () + { + Assert.AreEqual ("0", 0.0.ToString ("F0", _nfi), "#01"); + Assert.AreEqual ("0.0000000000000000", 0.0.ToString ("F16", _nfi), "#02"); + Assert.AreEqual ("0.00000000000000000", 0.0.ToString ("F17", _nfi), "#03"); + Assert.AreEqual ("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.0.ToString ("F99", _nfi), "#04"); + Assert.AreEqual ("F100", 0.0.ToString ("F100", _nfi), "#05"); + } + + [Test] + public void Test12004 () + { + Assert.AreEqual ("179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F0", _nfi), "#01"); + Assert.AreEqual ("179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000000000000000", Double.MaxValue.ToString ("F16", _nfi), "#02"); + Assert.AreEqual ("179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000", Double.MaxValue.ToString ("F17", _nfi), "#03"); + Assert.AreEqual ("179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F99", _nfi), "#04"); + Assert.AreEqual ("F1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F100", _nfi), "#05"); + } + + [Test] + public void Test12005 () + { + Assert.AreEqual ("-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F0", _nfi), "#01"); + Assert.AreEqual ("-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000000000000000", Double.MinValue.ToString ("F16", _nfi), "#02"); + Assert.AreEqual ("-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000", Double.MinValue.ToString ("F17", _nfi), "#03"); + Assert.AreEqual ("-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F99", _nfi), "#04"); + Assert.AreEqual ("-F1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F100", _nfi), "#05"); + } + + [Test] + public void Test12006 () + { + Assert.AreEqual ("FF", 0.0.ToString ("FF", _nfi), "#01"); + Assert.AreEqual ("F0F", 0.0.ToString ("F0F", _nfi), "#02"); + Assert.AreEqual ("F0xF", 0.0.ToString ("F0xF", _nfi), "#03"); + } + + [Test] + public void Test12007 () + { + Assert.AreEqual ("FF", Double.MaxValue.ToString ("FF", _nfi), "#01"); + Assert.AreEqual ("F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MaxValue.ToString ("F0F", _nfi), "#02"); + Assert.AreEqual ("F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MaxValue.ToString ("F0xF", _nfi), "#03"); + } + + [Test] + public void Test12008 () + { + Assert.AreEqual ("-FF", Double.MinValue.ToString ("FF", _nfi), "#01"); + Assert.AreEqual ("-F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MinValue.ToString ("F0F", _nfi), "#02"); + Assert.AreEqual ("-F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MinValue.ToString ("F0xF", _nfi), "#03"); + } + + [Test] + public void Test12009 () + { + Assert.AreEqual ("0.00000000000000000", 0.0.ToString ("F0000000000000000000000000000000000000017", _nfi), "#01"); + Assert.AreEqual ("179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000", Double.MaxValue.ToString ("F0000000000000000000000000000000000000017", _nfi), "#02"); + Assert.AreEqual ("-179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000000000000", Double.MinValue.ToString ("F0000000000000000000000000000000000000017", _nfi), "#03"); + } + + [Test] + public void Test12010 () + { + Assert.AreEqual ("+F", 0.0.ToString ("+F", _nfi), "#01"); + Assert.AreEqual ("F+", 0.0.ToString ("F+", _nfi), "#02"); + Assert.AreEqual ("+F+", 0.0.ToString ("+F+", _nfi), "#03"); + } + + [Test] + public void Test12011 () + { + Assert.AreEqual ("+F", Double.MaxValue.ToString ("+F", _nfi), "#01"); + Assert.AreEqual ("F+", Double.MaxValue.ToString ("F+", _nfi), "#02"); + Assert.AreEqual ("+F+", Double.MaxValue.ToString ("+F+", _nfi), "#03"); + } + + [Test] + public void Test12012 () + { + Assert.AreEqual ("-+F", Double.MinValue.ToString ("+F", _nfi), "#01"); + Assert.AreEqual ("-F+", Double.MinValue.ToString ("F+", _nfi), "#02"); + Assert.AreEqual ("-+F+", Double.MinValue.ToString ("+F+", _nfi), "#03"); + } + + [Test] + public void Test12013 () + { + Assert.AreEqual ("-F", 0.0.ToString ("-F", _nfi), "#01"); + Assert.AreEqual ("F-", 0.0.ToString ("F-", _nfi), "#02"); + Assert.AreEqual ("-F-", 0.0.ToString ("-F-", _nfi), "#03"); + } + + [Test] + public void Test12014 () + { + Assert.AreEqual ("-F", Double.MaxValue.ToString ("-F", _nfi), "#01"); + Assert.AreEqual ("F-", Double.MaxValue.ToString ("F-", _nfi), "#02"); + Assert.AreEqual ("-F-", Double.MaxValue.ToString ("-F-", _nfi), "#03"); + } + + [Test] + public void Test12015 () + { + Assert.AreEqual ("--F", Double.MinValue.ToString ("-F", _nfi), "#01"); + Assert.AreEqual ("-F-", Double.MinValue.ToString ("F-", _nfi), "#02"); + Assert.AreEqual ("--F-", Double.MinValue.ToString ("-F-", _nfi), "#03"); + } + + [Test] + public void Test12016 () + { + Assert.AreEqual ("F+0", 0.0.ToString ("F+0", _nfi), "#01"); + Assert.AreEqual ("F+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F+0", _nfi), "#02"); + Assert.AreEqual ("-F+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F+0", _nfi), "#03"); + } + + [Test] + public void Test12017 () + { + Assert.AreEqual ("F+9", 0.0.ToString ("F+9", _nfi), "#01"); + Assert.AreEqual ("F+9", Double.MaxValue.ToString ("F+9", _nfi), "#02"); + Assert.AreEqual ("-F+9", Double.MinValue.ToString ("F+9", _nfi), "#03"); + } + + [Test] + public void Test12018 () + { + Assert.AreEqual ("F-9", 0.0.ToString ("F-9", _nfi), "#01"); + Assert.AreEqual ("F-9", Double.MaxValue.ToString ("F-9", _nfi), "#02"); + Assert.AreEqual ("-F-9", Double.MinValue.ToString ("F-9", _nfi), "#03"); + } + + [Test] + public void Test12019 () + { + Assert.AreEqual ("F0", 0.0.ToString ("F0,", _nfi), "#01"); + Assert.AreEqual ("F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F0,", _nfi), "#02"); + Assert.AreEqual ("-F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F0,", _nfi), "#03"); + } + + [Test] + public void Test12020 () + { + Assert.AreEqual ("F0", 0.0.ToString ("F0.", _nfi), "#01"); + Assert.AreEqual ("F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("F0.", _nfi), "#02"); + Assert.AreEqual ("-F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("F0.", _nfi), "#03"); + } + + [Test] + public void Test12021 () + { + Assert.AreEqual ("F0.0", 0.0.ToString ("F0.0", _nfi), "#01"); + Assert.AreEqual ("F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MaxValue.ToString ("F0.0", _nfi), "#02"); + Assert.AreEqual ("-F179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MinValue.ToString ("F0.0", _nfi), "#03"); + } + + [Test] + public void Test12022 () + { + Assert.AreEqual ("F09", 0.0.ToString ("F0.9", _nfi), "#01"); + Assert.AreEqual ("F1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MaxValue.ToString ("F0.9", _nfi), "#02"); + Assert.AreEqual ("-F1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MinValue.ToString ("F0.9", _nfi), "#03"); + } + + [Test] + public void Test12023 () + { + Assert.AreEqual ("1.1", 1.05.ToString ("F1", _nfi), "#01"); + Assert.AreEqual ("1.2", 1.15.ToString ("F1", _nfi), "#02"); + Assert.AreEqual ("1.3", 1.25.ToString ("F1", _nfi), "#03"); + Assert.AreEqual ("1.4", 1.35.ToString ("F1", _nfi), "#04"); + Assert.AreEqual ("1.5", 1.45.ToString ("F1", _nfi), "#05"); + Assert.AreEqual ("1.6", 1.55.ToString ("F1", _nfi), "#06"); + Assert.AreEqual ("1.7", 1.65.ToString ("F1", _nfi), "#07"); + Assert.AreEqual ("1.8", 1.75.ToString ("F1", _nfi), "#08"); + Assert.AreEqual ("1.9", 1.85.ToString ("F1", _nfi), "#09"); + Assert.AreEqual ("2.0", 1.95.ToString ("F1", _nfi), "#10"); + } + + [Test] + public void Test12024 () + { + Assert.AreEqual ("1.01", 1.005.ToString ("F2", _nfi), "#01"); + Assert.AreEqual ("1.02", 1.015.ToString ("F2", _nfi), "#02"); + Assert.AreEqual ("1.03", 1.025.ToString ("F2", _nfi), "#03"); + Assert.AreEqual ("1.04", 1.035.ToString ("F2", _nfi), "#04"); + Assert.AreEqual ("1.05", 1.045.ToString ("F2", _nfi), "#05"); + Assert.AreEqual ("1.06", 1.055.ToString ("F2", _nfi), "#06"); + Assert.AreEqual ("1.07", 1.065.ToString ("F2", _nfi), "#07"); + Assert.AreEqual ("1.08", 1.075.ToString ("F2", _nfi), "#08"); + Assert.AreEqual ("1.09", 1.085.ToString ("F2", _nfi), "#09"); + Assert.AreEqual ("1.10", 1.095.ToString ("F2", _nfi), "#10"); + } + + [Test] + public void Test12025 () + { + Assert.AreEqual ("1.00000000000001", 1.000000000000005.ToString ("F14", _nfi), "#01"); + Assert.AreEqual ("1.00000000000002", 1.000000000000015.ToString ("F14", _nfi), "#02"); + Assert.AreEqual ("1.00000000000003", 1.000000000000025.ToString ("F14", _nfi), "#03"); + Assert.AreEqual ("1.00000000000004", 1.000000000000035.ToString ("F14", _nfi), "#04"); + Assert.AreEqual ("1.00000000000005", 1.000000000000045.ToString ("F14", _nfi), "#05"); + Assert.AreEqual ("1.00000000000006", 1.000000000000055.ToString ("F14", _nfi), "#06"); + Assert.AreEqual ("1.00000000000007", 1.000000000000065.ToString ("F14", _nfi), "#07"); + Assert.AreEqual ("1.00000000000008", 1.000000000000075.ToString ("F14", _nfi), "#08"); + Assert.AreEqual ("1.00000000000009", 1.000000000000085.ToString ("F14", _nfi), "#09"); + Assert.AreEqual ("1.00000000000010", 1.000000000000095.ToString ("F14", _nfi), "#10"); + } + + [Test] + public void Test12026 () + { + Assert.AreEqual ("1.000000000000000", 1.0000000000000005.ToString ("F15", _nfi), "#01"); + Assert.AreEqual ("1.000000000000000", 1.0000000000000015.ToString ("F15", _nfi), "#02"); + Assert.AreEqual ("1.000000000000000", 1.0000000000000025.ToString ("F15", _nfi), "#03"); + Assert.AreEqual ("1.000000000000000", 1.0000000000000035.ToString ("F15", _nfi), "#04"); + Assert.AreEqual ("1.000000000000000", 1.0000000000000045.ToString ("F15", _nfi), "#05"); + Assert.AreEqual ("1.000000000000010", 1.0000000000000055.ToString ("F15", _nfi), "#06"); + Assert.AreEqual ("1.000000000000010", 1.0000000000000065.ToString ("F15", _nfi), "#07"); + Assert.AreEqual ("1.000000000000010", 1.0000000000000075.ToString ("F15", _nfi), "#08"); + Assert.AreEqual ("1.000000000000010", 1.0000000000000085.ToString ("F15", _nfi), "#09"); + Assert.AreEqual ("1.000000000000010", 1.0000000000000095.ToString ("F15", _nfi), "#10"); + } + + [Test] + public void Test12027 () + { + Assert.AreEqual ("1.0000000000000000", 1.00000000000000005.ToString ("F16", _nfi), "#01"); + Assert.AreEqual ("1.0000000000000000", 1.00000000000000015.ToString ("F16", _nfi), "#02"); + Assert.AreEqual ("1.0000000000000000", 1.00000000000000025.ToString ("F16", _nfi), "#03"); + Assert.AreEqual ("1.0000000000000000", 1.00000000000000035.ToString ("F16", _nfi), "#04"); + Assert.AreEqual ("1.0000000000000000", 1.00000000000000045.ToString ("F16", _nfi), "#05"); + Assert.AreEqual ("1.0000000000000000", 1.00000000000000055.ToString ("F16", _nfi), "#06"); + Assert.AreEqual ("1.0000000000000000", 1.00000000000000065.ToString ("F16", _nfi), "#07"); + Assert.AreEqual ("1.0000000000000000", 1.00000000000000075.ToString ("F16", _nfi), "#08"); + Assert.AreEqual ("1.0000000000000000", 1.00000000000000085.ToString ("F16", _nfi), "#09"); + Assert.AreEqual ("1.0000000000000000", 1.00000000000000095.ToString ("F16", _nfi), "#10"); + } + + [Test] + public void Test12028 () + { + Assert.AreEqual ("1", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F0", _nfi), "#01"); + Assert.AreEqual ("1.234567890123", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F12", _nfi), "#02"); + Assert.AreEqual ("1.2345678901235", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F13", _nfi), "#03"); + Assert.AreEqual ("1.23456789012346", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F14", _nfi), "#04"); + Assert.AreEqual ("1.234567890123460", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F15", _nfi), "#05"); + Assert.AreEqual ("1.234567890123460000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F99", _nfi), "#06"); + Assert.AreEqual ("F101", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("F100", _nfi), "#07"); + } + + [Test] + public void Test12029 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberDecimalSeparator = "#"; + Assert.AreEqual ("-99999999#90", (-99999999.9).ToString ("F", nfi), "#01"); + } + + [Test] + public void Test12030 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "+"; + nfi.PositiveSign = "-"; + + Assert.AreEqual ("1.00", 1.0.ToString ("F", nfi), "#01"); + Assert.AreEqual ("0.00", 0.0.ToString ("F", nfi), "#02"); + Assert.AreEqual ("+1.00", (-1.0).ToString ("F", nfi), "#03"); + } + + [Test] + public void Test12031 () + { + Assert.AreEqual ("Infinity", (Double.MaxValue / 0.0).ToString ("F99", _nfi) , "#01"); + Assert.AreEqual ("-Infinity", (Double.MinValue / 0.0).ToString ("F99", _nfi) , "#02"); + Assert.AreEqual ("NaN", (0.0 / 0.0).ToString ("F99", _nfi) , "#03"); + } + + // Test13000- Double and G + [Test] + public void Test13000 () + { + Assert.AreEqual ("0", 0.0.ToString ("G", _nfi), "#01"); + Assert.AreEqual ("0", (-0.0).ToString ("G", _nfi), "#01.1"); + Assert.AreEqual ("0", 0.0.ToString ("g", _nfi), "#02"); + Assert.AreEqual ("-1.79769313486232E+308", Double.MinValue.ToString ("G", _nfi), "#03"); + Assert.AreEqual ("-1.79769313486232e+308", Double.MinValue.ToString ("g", _nfi), "#04"); + Assert.AreEqual ("1.79769313486232E+308", Double.MaxValue.ToString ("G", _nfi), "#05"); + Assert.AreEqual ("1.79769313486232e+308", Double.MaxValue.ToString ("g", _nfi), "#06"); + } + + [Test] + public void Test13001 () + { + Assert.AreEqual ("G ", 0.0.ToString ("G ", _nfi), "#01"); + Assert.AreEqual (" G", 0.0.ToString (" G", _nfi), "#02"); + Assert.AreEqual (" G ", 0.0.ToString (" G ", _nfi), "#03"); + } + + [Test] + public void Test13002 () + { + Assert.AreEqual ("-G ", (-1.0).ToString ("G ", _nfi), "#01"); + Assert.AreEqual ("- G", (-1.0).ToString (" G", _nfi), "#02"); + Assert.AreEqual ("- G ", (-1.0).ToString (" G ", _nfi), "#03"); + } + + [Test] + public void Test13003 () + { + Assert.AreEqual ("0", 0.0.ToString ("G0", _nfi), "#01"); + Assert.AreEqual ("0", 0.0.ToString ("G16", _nfi), "#02"); + Assert.AreEqual ("0", 0.0.ToString ("G17", _nfi), "#03"); + Assert.AreEqual ("0", 0.0.ToString ("G99", _nfi), "#04"); + Assert.AreEqual ("G100", 0.0.ToString ("G100", _nfi), "#05"); + } + + [Test] + public void Test13004 () + { + Assert.AreEqual ("1.79769313486232E+308", Double.MaxValue.ToString ("G0", _nfi), "#01"); + Assert.AreEqual ("1.797693134862316E+308", Double.MaxValue.ToString ("G16", _nfi), "#02"); + Assert.AreEqual ("1.7976931348623157E+308", Double.MaxValue.ToString ("G17", _nfi), "#03"); + Assert.AreEqual ("1.7976931348623157E+308", Double.MaxValue.ToString ("G99", _nfi), "#04"); + Assert.AreEqual ("G1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("G100", _nfi), "#05"); + } + + [Test] + public void Test13005 () + { + Assert.AreEqual ("-1.79769313486232E+308", Double.MinValue.ToString ("G0", _nfi), "#01"); + Assert.AreEqual ("-1.797693134862316E+308", Double.MinValue.ToString ("G16", _nfi), "#02"); + Assert.AreEqual ("-1.7976931348623157E+308", Double.MinValue.ToString ("G17", _nfi), "#03"); + Assert.AreEqual ("-1.7976931348623157E+308", Double.MinValue.ToString ("G99", _nfi), "#04"); + Assert.AreEqual ("-G1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("G100", _nfi), "#05"); + } + + [Test] + public void Test13006 () + { + Assert.AreEqual ("GF", 0.0.ToString ("GF", _nfi), "#01"); + Assert.AreEqual ("G0F", 0.0.ToString ("G0F", _nfi), "#02"); + Assert.AreEqual ("G0xF", 0.0.ToString ("G0xF", _nfi), "#03"); + } + + [Test] + public void Test13007 () + { + Assert.AreEqual ("GF", Double.MaxValue.ToString ("GF", _nfi), "#01"); + Assert.AreEqual ("G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MaxValue.ToString ("G0F", _nfi), "#02"); + Assert.AreEqual ("G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MaxValue.ToString ("G0xF", _nfi), "#03"); + } + + [Test] + public void Test13008 () + { + Assert.AreEqual ("-GF", Double.MinValue.ToString ("GF", _nfi), "#01"); + Assert.AreEqual ("-G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MinValue.ToString ("G0F", _nfi), "#02"); + Assert.AreEqual ("-G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MinValue.ToString ("G0xF", _nfi), "#03"); + } + + [Test] + public void Test13009 () + { + Assert.AreEqual ("0", 0.0.ToString ("G0000000000000000000000000000000000000017", _nfi), "#01"); + Assert.AreEqual ("1.7976931348623157E+308", Double.MaxValue.ToString ("G0000000000000000000000000000000000000017", _nfi), "#02"); + Assert.AreEqual ("-1.7976931348623157E+308", Double.MinValue.ToString ("G0000000000000000000000000000000000000017", _nfi), "#03"); + } + + [Test] + public void Test13010 () + { + Assert.AreEqual ("+G", 0.0.ToString ("+G", _nfi), "#01"); + Assert.AreEqual ("G+", 0.0.ToString ("G+", _nfi), "#02"); + Assert.AreEqual ("+G+", 0.0.ToString ("+G+", _nfi), "#03"); + } + + [Test] + public void Test13011 () + { + Assert.AreEqual ("+G", Double.MaxValue.ToString ("+G", _nfi), "#01"); + Assert.AreEqual ("G+", Double.MaxValue.ToString ("G+", _nfi), "#02"); + Assert.AreEqual ("+G+", Double.MaxValue.ToString ("+G+", _nfi), "#03"); + } + + [Test] + public void Test13012 () + { + Assert.AreEqual ("-+G", Double.MinValue.ToString ("+G", _nfi), "#01"); + Assert.AreEqual ("-G+", Double.MinValue.ToString ("G+", _nfi), "#02"); + Assert.AreEqual ("-+G+", Double.MinValue.ToString ("+G+", _nfi), "#03"); + } + + [Test] + public void Test13013 () + { + Assert.AreEqual ("-G", 0.0.ToString ("-G", _nfi), "#01"); + Assert.AreEqual ("G-", 0.0.ToString ("G-", _nfi), "#02"); + Assert.AreEqual ("-G-", 0.0.ToString ("-G-", _nfi), "#03"); + } + + [Test] + public void Test13014 () + { + Assert.AreEqual ("-G", Double.MaxValue.ToString ("-G", _nfi), "#01"); + Assert.AreEqual ("G-", Double.MaxValue.ToString ("G-", _nfi), "#02"); + Assert.AreEqual ("-G-", Double.MaxValue.ToString ("-G-", _nfi), "#03"); + } + + [Test] + public void Test13015 () + { + Assert.AreEqual ("--G", Double.MinValue.ToString ("-G", _nfi), "#01"); + Assert.AreEqual ("-G-", Double.MinValue.ToString ("G-", _nfi), "#02"); + Assert.AreEqual ("--G-", Double.MinValue.ToString ("-G-", _nfi), "#03"); + } + + [Test] + public void Test13016 () + { + Assert.AreEqual ("G+0", 0.0.ToString ("G+0", _nfi), "#01"); + Assert.AreEqual ("G+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("G+0", _nfi), "#02"); + Assert.AreEqual ("-G+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("G+0", _nfi), "#03"); + } + + [Test] + public void Test13017 () + { + Assert.AreEqual ("G+9", 0.0.ToString ("G+9", _nfi), "#01"); + Assert.AreEqual ("G+9", Double.MaxValue.ToString ("G+9", _nfi), "#02"); + Assert.AreEqual ("-G+9", Double.MinValue.ToString ("G+9", _nfi), "#03"); + } + + [Test] + public void Test13018 () + { + Assert.AreEqual ("G-9", 0.0.ToString ("G-9", _nfi), "#01"); + Assert.AreEqual ("G-9", Double.MaxValue.ToString ("G-9", _nfi), "#02"); + Assert.AreEqual ("-G-9", Double.MinValue.ToString ("G-9", _nfi), "#03"); + } + + [Test] + public void Test13019 () + { + Assert.AreEqual ("G0", 0.0.ToString ("G0,", _nfi), "#01"); + Assert.AreEqual ("G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("G0,", _nfi), "#02"); + Assert.AreEqual ("-G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("G0,", _nfi), "#03"); + } + + [Test] + public void Test13020 () + { + Assert.AreEqual ("G0", 0.0.ToString ("G0.", _nfi), "#01"); + Assert.AreEqual ("G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("G0.", _nfi), "#02"); + Assert.AreEqual ("-G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("G0.", _nfi), "#03"); + } + + [Test] + public void Test13021 () + { + Assert.AreEqual ("G0.0", 0.0.ToString ("G0.0", _nfi), "#01"); + Assert.AreEqual ("G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MaxValue.ToString ("G0.0", _nfi), "#02"); + Assert.AreEqual ("-G179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MinValue.ToString ("G0.0", _nfi), "#03"); + } + + [Test] + public void Test13022 () + { + Assert.AreEqual ("G09", 0.0.ToString ("G0.9", _nfi), "#01"); + Assert.AreEqual ("G1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MaxValue.ToString ("G0.9", _nfi), "#02"); + Assert.AreEqual ("-G1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MinValue.ToString ("G0.9", _nfi), "#03"); + } + + [Test] + public void Test13023 () + { + Assert.AreEqual ("0.5", 0.5.ToString ("G1", _nfi), "#01"); + Assert.AreEqual ("2", 1.5.ToString ("G1", _nfi), "#02"); + Assert.AreEqual ("3", 2.5.ToString ("G1", _nfi), "#03"); + Assert.AreEqual ("4", 3.5.ToString ("G1", _nfi), "#04"); + Assert.AreEqual ("5", 4.5.ToString ("G1", _nfi), "#05"); + Assert.AreEqual ("6", 5.5.ToString ("G1", _nfi), "#06"); + Assert.AreEqual ("7", 6.5.ToString ("G1", _nfi), "#07"); + Assert.AreEqual ("8", 7.5.ToString ("G1", _nfi), "#08"); + Assert.AreEqual ("9", 8.5.ToString ("G1", _nfi), "#09"); + Assert.AreEqual ("1E+01", 9.5.ToString ("G1", _nfi), "#10"); + } + + [Test] + public void Test13024_CarryPropagation () + { + Double d = 1.15; + Assert.AreEqual ("1", d.ToString ("G1", _nfi), "#01"); + // NumberStore converts 1.15 into 1.14999...91 (1 in index 17) + // so the call to NumberToString doesn't result in 1.2 but in 1.1 + // which seems "somewhat" normal considering the #17 results, + Assert.AreEqual ("1.2", d.ToString ("G2", _nfi), "#02"); + Assert.AreEqual ("1.15", d.ToString ("G3", _nfi), "#03"); + Assert.AreEqual ("1.15", d.ToString ("G4", _nfi), "#04"); + Assert.AreEqual ("1.15", d.ToString ("G5", _nfi), "#05"); + Assert.AreEqual ("1.15", d.ToString ("G6", _nfi), "#06"); + Assert.AreEqual ("1.15", d.ToString ("G7", _nfi), "#07"); + Assert.AreEqual ("1.15", d.ToString ("G8", _nfi), "#08"); + Assert.AreEqual ("1.15", d.ToString ("G9", _nfi), "#09"); + Assert.AreEqual ("1.15", d.ToString ("G10", _nfi), "#10"); + Assert.AreEqual ("1.15", d.ToString ("G11", _nfi), "#11"); + Assert.AreEqual ("1.15", d.ToString ("G12", _nfi), "#12"); + Assert.AreEqual ("1.15", d.ToString ("G13", _nfi), "#13"); + Assert.AreEqual ("1.15", d.ToString ("G14", _nfi), "#14"); + Assert.AreEqual ("1.15", d.ToString ("G15", _nfi), "#15"); + Assert.AreEqual ("1.15", d.ToString ("G16", _nfi), "#16"); + Assert.AreEqual ("1.1499999999999999", d.ToString ("G17", _nfi), "#17"); + } + + [Test] + public void Test13024 () + { + Assert.AreEqual ("1.1", 1.05.ToString ("G2", _nfi), "#01"); + Assert.AreEqual ("1.2", 1.15.ToString ("G2", _nfi), "#02"); + Assert.AreEqual ("1.3", 1.25.ToString ("G2", _nfi), "#03"); + Assert.AreEqual ("1.4", 1.35.ToString ("G2", _nfi), "#04"); + Assert.AreEqual ("1.5", 1.45.ToString ("G2", _nfi), "#05"); + Assert.AreEqual ("1.6", 1.55.ToString ("G2", _nfi), "#06"); + Assert.AreEqual ("1.7", 1.65.ToString ("G2", _nfi), "#07"); + Assert.AreEqual ("1.8", 1.75.ToString ("G2", _nfi), "#08"); + Assert.AreEqual ("1.9", 1.85.ToString ("G2", _nfi), "#09"); + Assert.AreEqual ("2", 1.95.ToString ("G2", _nfi), "#10"); + } + + [Test] + public void Test13025 () + { + Assert.AreEqual ("10", 10.05.ToString ("G2", _nfi), "#01"); + Assert.AreEqual ("10", 10.15.ToString ("G2", _nfi), "#02"); + Assert.AreEqual ("10", 10.25.ToString ("G2", _nfi), "#03"); + Assert.AreEqual ("10", 10.35.ToString ("G2", _nfi), "#04"); + Assert.AreEqual ("10", 10.45.ToString ("G2", _nfi), "#05"); + Assert.AreEqual ("11", 10.55.ToString ("G2", _nfi), "#06"); + Assert.AreEqual ("11", 10.65.ToString ("G2", _nfi), "#07"); + Assert.AreEqual ("11", 10.75.ToString ("G2", _nfi), "#08"); + Assert.AreEqual ("11", 10.85.ToString ("G2", _nfi), "#09"); + Assert.AreEqual ("11", 10.95.ToString ("G2", _nfi), "#10"); + } + + [Test] + public void Test13026 () + { + Assert.AreEqual ("1.00000000000001", 1.000000000000005.ToString ("G15", _nfi), "#01"); + Assert.AreEqual ("1.00000000000002", 1.000000000000015.ToString ("G15", _nfi), "#02"); + Assert.AreEqual ("1.00000000000003", 1.000000000000025.ToString ("G15", _nfi), "#03"); + Assert.AreEqual ("1.00000000000004", 1.000000000000035.ToString ("G15", _nfi), "#04"); + Assert.AreEqual ("1.00000000000005", 1.000000000000045.ToString ("G15", _nfi), "#05"); + Assert.AreEqual ("1.00000000000006", 1.000000000000055.ToString ("G15", _nfi), "#06"); + Assert.AreEqual ("1.00000000000007", 1.000000000000065.ToString ("G15", _nfi), "#07"); + Assert.AreEqual ("1.00000000000008", 1.000000000000075.ToString ("G15", _nfi), "#08"); + Assert.AreEqual ("1.00000000000009", 1.000000000000085.ToString ("G15", _nfi), "#09"); + Assert.AreEqual ("1.0000000000001", 1.000000000000095.ToString ("G15", _nfi), "#10"); + } + + [Test] + public void Test13027 () + { + Assert.AreEqual ("1", 1.0000000000000005.ToString ("G16", _nfi), "#01"); + Assert.AreEqual ("1.000000000000002", 1.0000000000000015.ToString ("G16", _nfi), "#02"); + Assert.AreEqual ("1.000000000000002", 1.0000000000000025.ToString ("G16", _nfi), "#03"); + Assert.AreEqual ("1.000000000000004", 1.0000000000000035.ToString ("G16", _nfi), "#04"); + Assert.AreEqual ("1.000000000000004", 1.0000000000000045.ToString ("G16", _nfi), "#05"); + Assert.AreEqual ("1.000000000000006", 1.0000000000000055.ToString ("G16", _nfi), "#06"); + Assert.AreEqual ("1.000000000000006", 1.0000000000000065.ToString ("G16", _nfi), "#07"); + Assert.AreEqual ("1.000000000000008", 1.0000000000000075.ToString ("G16", _nfi), "#08"); + Assert.AreEqual ("1.000000000000008", 1.0000000000000085.ToString ("G16", _nfi), "#09"); + Assert.AreEqual ("1.00000000000001", 1.0000000000000095.ToString ("G16", _nfi), "#10"); + } + + [Test] + public void Test13028 () + { + Assert.AreEqual ("1", 1.00000000000000005.ToString ("G17", _nfi), "#01"); + Assert.AreEqual ("1.0000000000000002", 1.00000000000000015.ToString ("G17", _nfi), "#02"); + Assert.AreEqual ("1.0000000000000002", 1.00000000000000025.ToString ("G17", _nfi), "#03"); + Assert.AreEqual ("1.0000000000000004", 1.00000000000000035.ToString ("G17", _nfi), "#04"); + Assert.AreEqual ("1.0000000000000004", 1.00000000000000045.ToString ("G17", _nfi), "#05"); + Assert.AreEqual ("1.0000000000000004", 1.00000000000000055.ToString ("G17", _nfi), "#06"); + Assert.AreEqual ("1.0000000000000007", 1.00000000000000065.ToString ("G17", _nfi), "#07"); + Assert.AreEqual ("1.0000000000000007", 1.00000000000000075.ToString ("G17", _nfi), "#08"); + Assert.AreEqual ("1.0000000000000009", 1.00000000000000085.ToString ("G17", _nfi), "#09"); + Assert.AreEqual ("1.0000000000000009", 1.00000000000000095.ToString ("G17", _nfi), "#10"); + } + + [Test] + public void Test13029 () + { + Assert.AreEqual ("1", 1.000000000000000005.ToString ("G18", _nfi), "#01"); + Assert.AreEqual ("1", 1.000000000000000015.ToString ("G18", _nfi), "#02"); + Assert.AreEqual ("1", 1.000000000000000025.ToString ("G18", _nfi), "#03"); + Assert.AreEqual ("1", 1.000000000000000035.ToString ("G18", _nfi), "#04"); + Assert.AreEqual ("1", 1.000000000000000045.ToString ("G18", _nfi), "#05"); + Assert.AreEqual ("1", 1.000000000000000055.ToString ("G18", _nfi), "#06"); + Assert.AreEqual ("1", 1.000000000000000065.ToString ("G18", _nfi), "#07"); + Assert.AreEqual ("1", 1.000000000000000075.ToString ("G18", _nfi), "#08"); + Assert.AreEqual ("1", 1.000000000000000085.ToString ("G18", _nfi), "#09"); + Assert.AreEqual ("1", 1.000000000000000095.ToString ("G18", _nfi), "#10"); + } + + [Test] + public void Test13030 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberDecimalSeparator = "#"; + Assert.AreEqual ("-99999999#9", (-99999999.9).ToString ("G", nfi), "#01"); + } + + [Test] + public void Test13031 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "+"; + nfi.PositiveSign = "-"; + + Assert.AreEqual ("1", 1.0.ToString ("G", nfi), "#01"); + Assert.AreEqual ("0", 0.0.ToString ("G", nfi), "#02"); + Assert.AreEqual ("+1", (-1.0).ToString ("G", nfi), "#03"); + } + + [Test] + public void Test13032 () + { + Assert.AreEqual ("Infinity", (Double.MaxValue / 0.0).ToString ("G99", _nfi) , "#01"); + Assert.AreEqual ("-Infinity", (Double.MinValue / 0.0).ToString ("G99", _nfi) , "#02"); + Assert.AreEqual ("NaN", (0.0 / 0.0).ToString ("G99", _nfi) , "#03"); + } + + [Test] + public void Test13033 () + { + Assert.AreEqual ("0.0001", 0.0001.ToString ("G", _nfi), "#01"); + Assert.AreEqual ("1E-05", 0.00001.ToString ("G", _nfi), "#02"); + Assert.AreEqual ("0.0001", 0.0001.ToString ("G0", _nfi), "#03"); + Assert.AreEqual ("1E-05", 0.00001.ToString ("G0", _nfi), "#04"); + Assert.AreEqual ("100000000000000", 100000000000000.0.ToString ("G", _nfi), "#05"); + Assert.AreEqual ("1E+15", 1000000000000000.0.ToString ("G", _nfi), "#06"); + Assert.AreEqual ("1000000000000000", 1000000000000000.0.ToString ("G16", _nfi), "#07"); + } + + // Test14000- Double and N + [Test] + public void Test14000 () + { + Assert.AreEqual ("0.00", 0.0.ToString ("N", _nfi), "#01"); + Assert.AreEqual ("0.00", 0.0.ToString ("n", _nfi), "#02"); + Assert.AreEqual ("-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00", Double.MinValue.ToString ("N", _nfi), "#03"); + Assert.AreEqual ("-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00", Double.MinValue.ToString ("n", _nfi), "#04"); + Assert.AreEqual ("179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00", Double.MaxValue.ToString ("N", _nfi), "#05"); + Assert.AreEqual ("179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00", Double.MaxValue.ToString ("n", _nfi), "#06"); + } + + [Test] + public void Test14001 () + { + Assert.AreEqual ("N ", 0.0.ToString ("N ", _nfi), "#01"); + Assert.AreEqual (" N", 0.0.ToString (" N", _nfi), "#02"); + Assert.AreEqual (" N ", 0.0.ToString (" N ", _nfi), "#03"); + } + + [Test] + public void Test14002 () + { + Assert.AreEqual ("-N ", (-1.0).ToString ("N ", _nfi), "#01"); + Assert.AreEqual ("- N", (-1.0).ToString (" N", _nfi), "#02"); + Assert.AreEqual ("- N ", (-1.0).ToString (" N ", _nfi), "#03"); + } + + [Test] + public void Test14003 () + { + Assert.AreEqual ("0", 0.0.ToString ("N0", _nfi), "#01"); + Assert.AreEqual ("0.0000000000000000", 0.0.ToString ("N16", _nfi), "#02"); + Assert.AreEqual ("0.00000000000000000", 0.0.ToString ("N17", _nfi), "#03"); + Assert.AreEqual ("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0.0.ToString ("N99", _nfi), "#04"); + Assert.AreEqual ("N100", 0.0.ToString ("N100", _nfi), "#05"); + } + + [Test] + public void Test14004 () + { + Assert.AreEqual ("179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000", Double.MaxValue.ToString ("N0", _nfi), "#01"); + Assert.AreEqual ("179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.0000000000000000", Double.MaxValue.ToString ("N16", _nfi), "#02"); + Assert.AreEqual ("179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000", Double.MaxValue.ToString ("N17", _nfi), "#03"); + Assert.AreEqual ("179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("N99", _nfi), "#04"); + Assert.AreEqual ("N1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("N100", _nfi), "#05"); + } + + [Test] + public void Test14005 () + { + Assert.AreEqual ("-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000", Double.MinValue.ToString ("N0", _nfi), "#01"); + Assert.AreEqual ("-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.0000000000000000", Double.MinValue.ToString ("N16", _nfi), "#02"); + Assert.AreEqual ("-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000", Double.MinValue.ToString ("N17", _nfi), "#03"); + Assert.AreEqual ("-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("N99", _nfi), "#04"); + Assert.AreEqual ("-N1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("N100", _nfi), "#05"); + } + + [Test] + public void Test14006 () + { + Assert.AreEqual ("NF", 0.0.ToString ("NF", _nfi), "#01"); + Assert.AreEqual ("N0F", 0.0.ToString ("N0F", _nfi), "#02"); + Assert.AreEqual ("N0xF", 0.0.ToString ("N0xF", _nfi), "#03"); + } + + [Test] + public void Test14007 () + { + Assert.AreEqual ("NF", Double.MaxValue.ToString ("NF", _nfi), "#01"); + Assert.AreEqual ("N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MaxValue.ToString ("N0F", _nfi), "#02"); + Assert.AreEqual ("N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MaxValue.ToString ("N0xF", _nfi), "#03"); + } + + [Test] + public void Test14008 () + { + Assert.AreEqual ("-NF", Double.MinValue.ToString ("NF", _nfi), "#01"); + Assert.AreEqual ("-N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MinValue.ToString ("N0F", _nfi), "#02"); + Assert.AreEqual ("-N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MinValue.ToString ("N0xF", _nfi), "#03"); + } + + [Test] + public void Test14009 () + { + Assert.AreEqual ("0.00000000000000000", 0.0.ToString ("N0000000000000000000000000000000000000017", _nfi), "#01"); + Assert.AreEqual ("179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000", Double.MaxValue.ToString ("N0000000000000000000000000000000000000017", _nfi), "#02"); + Assert.AreEqual ("-179,769,313,486,232,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000", Double.MinValue.ToString ("N0000000000000000000000000000000000000017", _nfi), "#03"); + } + + [Test] + public void Test14010 () + { + Assert.AreEqual ("+N", 0.0.ToString ("+N", _nfi), "#01"); + Assert.AreEqual ("N+", 0.0.ToString ("N+", _nfi), "#02"); + Assert.AreEqual ("+N+", 0.0.ToString ("+N+", _nfi), "#03"); + } + + [Test] + public void Test14011 () + { + Assert.AreEqual ("+N", Double.MaxValue.ToString ("+N", _nfi), "#01"); + Assert.AreEqual ("N+", Double.MaxValue.ToString ("N+", _nfi), "#02"); + Assert.AreEqual ("+N+", Double.MaxValue.ToString ("+N+", _nfi), "#03"); + } + + [Test] + public void Test14012 () + { + Assert.AreEqual ("-+N", Double.MinValue.ToString ("+N", _nfi), "#01"); + Assert.AreEqual ("-N+", Double.MinValue.ToString ("N+", _nfi), "#02"); + Assert.AreEqual ("-+N+", Double.MinValue.ToString ("+N+", _nfi), "#03"); + } + + [Test] + public void Test14013 () + { + Assert.AreEqual ("-N", 0.0.ToString ("-N", _nfi), "#01"); + Assert.AreEqual ("N-", 0.0.ToString ("N-", _nfi), "#02"); + Assert.AreEqual ("-N-", 0.0.ToString ("-N-", _nfi), "#03"); + } + + [Test] + public void Test14014 () + { + Assert.AreEqual ("-N", Double.MaxValue.ToString ("-N", _nfi), "#01"); + Assert.AreEqual ("N-", Double.MaxValue.ToString ("N-", _nfi), "#02"); + Assert.AreEqual ("-N-", Double.MaxValue.ToString ("-N-", _nfi), "#03"); + } + + [Test] + public void Test14015 () + { + Assert.AreEqual ("--N", Double.MinValue.ToString ("-N", _nfi), "#01"); + Assert.AreEqual ("-N-", Double.MinValue.ToString ("N-", _nfi), "#02"); + Assert.AreEqual ("--N-", Double.MinValue.ToString ("-N-", _nfi), "#03"); + } + + [Test] + public void Test14016 () + { + Assert.AreEqual ("N+0", 0.0.ToString ("N+0", _nfi), "#01"); + Assert.AreEqual ("N+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("N+0", _nfi), "#02"); + Assert.AreEqual ("-N+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("N+0", _nfi), "#03"); + } + + [Test] + public void Test14017 () + { + Assert.AreEqual ("N+9", 0.0.ToString ("N+9", _nfi), "#01"); + Assert.AreEqual ("N+9", Double.MaxValue.ToString ("N+9", _nfi), "#02"); + Assert.AreEqual ("-N+9", Double.MinValue.ToString ("N+9", _nfi), "#03"); + } + + [Test] + public void Test14018 () + { + Assert.AreEqual ("N-9", 0.0.ToString ("N-9", _nfi), "#01"); + Assert.AreEqual ("N-9", Double.MaxValue.ToString ("N-9", _nfi), "#02"); + Assert.AreEqual ("-N-9", Double.MinValue.ToString ("N-9", _nfi), "#03"); + } + + [Test] + public void Test14019 () + { + Assert.AreEqual ("N0", 0.0.ToString ("N0,", _nfi), "#01"); + Assert.AreEqual ("N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("N0,", _nfi), "#02"); + Assert.AreEqual ("-N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("N0,", _nfi), "#03"); + } + + [Test] + public void Test14020 () + { + Assert.AreEqual ("N0", 0.0.ToString ("N0.", _nfi), "#01"); + Assert.AreEqual ("N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("N0.", _nfi), "#02"); + Assert.AreEqual ("-N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("N0.", _nfi), "#03"); + } + + [Test] + public void Test14021 () + { + Assert.AreEqual ("N0.0", 0.0.ToString ("N0.0", _nfi), "#01"); + Assert.AreEqual ("N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MaxValue.ToString ("N0.0", _nfi), "#02"); + Assert.AreEqual ("-N179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MinValue.ToString ("N0.0", _nfi), "#03"); + } + + [Test] + public void Test14022 () + { + Assert.AreEqual ("N09", 0.0.ToString ("N0.9", _nfi), "#01"); + Assert.AreEqual ("N1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MaxValue.ToString ("N0.9", _nfi), "#02"); + Assert.AreEqual ("-N1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MinValue.ToString ("N0.9", _nfi), "#03"); + } + + [Test] + public void Test14023 () + { + Assert.AreEqual ("999.1", 999.05.ToString ("N1", _nfi), "#01"); + Assert.AreEqual ("999.2", 999.15.ToString ("N1", _nfi), "#02"); + Assert.AreEqual ("999.3", 999.25.ToString ("N1", _nfi), "#03"); + Assert.AreEqual ("999.4", 999.35.ToString ("N1", _nfi), "#04"); + Assert.AreEqual ("999.5", 999.45.ToString ("N1", _nfi), "#05"); + Assert.AreEqual ("999.6", 999.55.ToString ("N1", _nfi), "#06"); + Assert.AreEqual ("999.7", 999.65.ToString ("N1", _nfi), "#07"); + Assert.AreEqual ("999.8", 999.75.ToString ("N1", _nfi), "#08"); + Assert.AreEqual ("999.9", 999.85.ToString ("N1", _nfi), "#09"); + Assert.AreEqual ("1,000.0", 999.95.ToString ("N1", _nfi), "#10"); + } + + [Test] + public void Test14024 () + { + Assert.AreEqual ("999.91", 999.905.ToString ("N2", _nfi), "#01"); + Assert.AreEqual ("999.92", 999.915.ToString ("N2", _nfi), "#02"); + Assert.AreEqual ("999.93", 999.925.ToString ("N2", _nfi), "#03"); + Assert.AreEqual ("999.94", 999.935.ToString ("N2", _nfi), "#04"); + Assert.AreEqual ("999.95", 999.945.ToString ("N2", _nfi), "#05"); + Assert.AreEqual ("999.96", 999.955.ToString ("N2", _nfi), "#06"); + Assert.AreEqual ("999.97", 999.965.ToString ("N2", _nfi), "#07"); + Assert.AreEqual ("999.98", 999.975.ToString ("N2", _nfi), "#08"); + Assert.AreEqual ("999.99", 999.985.ToString ("N2", _nfi), "#09"); + Assert.AreEqual ("1,000.00", 999.995.ToString ("N2", _nfi), "#10"); + } + + [Test] + public void Test14025 () + { + Assert.AreEqual ("999.99999999991", 999.999999999905.ToString ("N11", _nfi), "#01"); + Assert.AreEqual ("999.99999999992", 999.999999999915.ToString ("N11", _nfi), "#02"); + Assert.AreEqual ("999.99999999993", 999.999999999925.ToString ("N11", _nfi), "#03"); + Assert.AreEqual ("999.99999999994", 999.999999999935.ToString ("N11", _nfi), "#04"); + Assert.AreEqual ("999.99999999995", 999.999999999945.ToString ("N11", _nfi), "#05"); + Assert.AreEqual ("999.99999999996", 999.999999999955.ToString ("N11", _nfi), "#06"); + Assert.AreEqual ("999.99999999997", 999.999999999965.ToString ("N11", _nfi), "#07"); + Assert.AreEqual ("999.99999999998", 999.999999999975.ToString ("N11", _nfi), "#08"); + Assert.AreEqual ("999.99999999999", 999.999999999985.ToString ("N11", _nfi), "#09"); + Assert.AreEqual ("1,000.00000000000", 999.999999999995.ToString ("N11", _nfi), "#10"); + } + + [Test] + public void Test14026 () + { + Assert.AreEqual ("999.999999999990", 999.9999999999905.ToString ("N12", _nfi), "#01"); + Assert.AreEqual ("999.999999999991", 999.9999999999915.ToString ("N12", _nfi), "#02"); + Assert.AreEqual ("999.999999999993", 999.9999999999925.ToString ("N12", _nfi), "#03"); + Assert.AreEqual ("999.999999999994", 999.9999999999935.ToString ("N12", _nfi), "#04"); + Assert.AreEqual ("999.999999999995", 999.9999999999945.ToString ("N12", _nfi), "#05"); + Assert.AreEqual ("999.999999999995", 999.9999999999955.ToString ("N12", _nfi), "#06"); + Assert.AreEqual ("999.999999999996", 999.9999999999965.ToString ("N12", _nfi), "#07"); + Assert.AreEqual ("999.999999999998", 999.9999999999975.ToString ("N12", _nfi), "#08"); + Assert.AreEqual ("999.999999999999", 999.9999999999985.ToString ("N12", _nfi), "#09"); + Assert.AreEqual ("1,000.000000000000", 999.9999999999995.ToString ("N12", _nfi), "#10"); + } + + [Test] + public void Test14027 () + { + Assert.AreEqual ("999.9999999999990", 999.99999999999905.ToString ("N13", _nfi), "#01"); + Assert.AreEqual ("999.9999999999990", 999.99999999999915.ToString ("N13", _nfi), "#02"); + Assert.AreEqual ("999.9999999999990", 999.99999999999925.ToString ("N13", _nfi), "#03"); + Assert.AreEqual ("999.9999999999990", 999.99999999999935.ToString ("N13", _nfi), "#04"); + Assert.AreEqual ("999.9999999999990", 999.99999999999945.ToString ("N13", _nfi), "#05"); + Assert.AreEqual ("1,000.0000000000000", 999.99999999999955.ToString ("N13", _nfi), "#06"); + Assert.AreEqual ("1,000.0000000000000", 999.99999999999965.ToString ("N13", _nfi), "#07"); + Assert.AreEqual ("1,000.0000000000000", 999.99999999999975.ToString ("N13", _nfi), "#08"); + Assert.AreEqual ("1,000.0000000000000", 999.99999999999985.ToString ("N13", _nfi), "#09"); + Assert.AreEqual ("1,000.0000000000000", 999.99999999999995.ToString ("N13", _nfi), "#10"); + } + + [Test] + public void Test14028 () + { + Assert.AreEqual ("1", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N0", _nfi), "#01"); + Assert.AreEqual ("1.234567890123", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N12", _nfi), "#02"); + Assert.AreEqual ("1.2345678901235", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N13", _nfi), "#03"); + Assert.AreEqual ("1.23456789012346", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N14", _nfi), "#04"); + Assert.AreEqual ("1.234567890123460", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N15", _nfi), "#05"); + Assert.AreEqual ("1.234567890123460000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N99", _nfi), "#06"); + Assert.AreEqual ("N101", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N100", _nfi), "#07"); + } + + [Test] + public void Test14029 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NumberDecimalSeparator = "#"; + Assert.AreEqual ("-99,999,999#90", (-99999999.9).ToString ("N", nfi), "#01"); + } + + [Test] + public void Test14030 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "+"; + nfi.PositiveSign = "-"; + + Assert.AreEqual ("1,000.00", 1000.0.ToString ("N", nfi), "#01"); + Assert.AreEqual ("0.00", 0.0.ToString ("N", nfi), "#02"); + Assert.AreEqual ("+1,000.00", (-1000.0).ToString ("N", nfi), "#03"); + } + + [Test] + public void Test14031 () + { + Assert.AreEqual ("Infinity", (Double.MaxValue / 0.0).ToString ("N99", _nfi) , "#01"); + Assert.AreEqual ("-Infinity", (Double.MinValue / 0.0).ToString ("N99", _nfi) , "#02"); + Assert.AreEqual ("NaN", (0.0 / 0.0).ToString ("N99", _nfi) , "#03"); + } + + // Test15000- Double and P + [Test] + public void Test15000 () + { + Assert.AreEqual ("0.00 %", 0.0.ToString ("P", _nfi), "#01"); + Assert.AreEqual ("0.00 %", 0.0.ToString ("p", _nfi), "#02"); + Assert.AreEqual ("-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00 %", Double.MinValue.ToString ("P", _nfi), "#03"); + Assert.AreEqual ("-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00 %", Double.MinValue.ToString ("p", _nfi), "#04"); + Assert.AreEqual ("17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00 %", Double.MaxValue.ToString ("P", _nfi), "#05"); + Assert.AreEqual ("17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00 %", Double.MaxValue.ToString ("p", _nfi), "#06"); + } + + [Test] + public void Test15001 () + { + Assert.AreEqual ("P ", 0.0.ToString ("P ", _nfi), "#01"); + Assert.AreEqual (" P", 0.0.ToString (" P", _nfi), "#02"); + Assert.AreEqual (" P ", 0.0.ToString (" P ", _nfi), "#03"); + } + + [Test] + public void Test15002 () + { + Assert.AreEqual ("-P ", (-1.0).ToString ("P ", _nfi), "#01"); + Assert.AreEqual ("- P", (-1.0).ToString (" P", _nfi), "#02"); + Assert.AreEqual ("- P ", (-1.0).ToString (" P ", _nfi), "#03"); + } + + [Test] + public void Test15003 () + { + Assert.AreEqual ("0 %", 0.0.ToString ("P0", _nfi), "#01"); + Assert.AreEqual ("0.0000000000000000 %", 0.0.ToString ("P16", _nfi), "#02"); + Assert.AreEqual ("0.00000000000000000 %", 0.0.ToString ("P17", _nfi), "#03"); + Assert.AreEqual ("0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", 0.0.ToString ("P99", _nfi), "#04"); + Assert.AreEqual ("P100", 0.0.ToString ("P100", _nfi), "#05"); + } + + [Test] + public void Test15004 () + { + Assert.AreEqual ("17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 %", Double.MaxValue.ToString ("P0", _nfi), "#01"); + Assert.AreEqual ("17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.0000000000000000 %", Double.MaxValue.ToString ("P16", _nfi), "#02"); + Assert.AreEqual ("17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000 %", Double.MaxValue.ToString ("P17", _nfi), "#03"); + Assert.AreEqual ("17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", Double.MaxValue.ToString ("P99", _nfi), "#04"); + Assert.AreEqual ("P1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("P100", _nfi), "#05"); + } + + [Test] + public void Test15005 () + { + Assert.AreEqual ("-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 %", Double.MinValue.ToString ("P0", _nfi), "#01"); + Assert.AreEqual ("-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.0000000000000000 %", Double.MinValue.ToString ("P16", _nfi), "#02"); + Assert.AreEqual ("-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000 %", Double.MinValue.ToString ("P17", _nfi), "#03"); + Assert.AreEqual ("-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 %", Double.MinValue.ToString ("P99", _nfi), "#04"); + Assert.AreEqual ("P1179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("P100", _nfi), "#05"); + } + + [Test] + public void Test15006 () + { + Assert.AreEqual ("PF", 0.0.ToString ("PF", _nfi), "#01"); + Assert.AreEqual ("P0F", 0.0.ToString ("P0F", _nfi), "#02"); + Assert.AreEqual ("P0xF", 0.0.ToString ("P0xF", _nfi), "#03"); + } + + [Test] + public void Test15007 () + { + Assert.AreEqual ("PF", Double.MaxValue.ToString ("PF", _nfi), "#01"); + Assert.AreEqual ("P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MaxValue.ToString ("P0F", _nfi), "#02"); + Assert.AreEqual ("P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MaxValue.ToString ("P0xF", _nfi), "#03"); + } + + [Test] + public void Test15008 () + { + Assert.AreEqual ("-PF", Double.MinValue.ToString ("PF", _nfi), "#01"); + Assert.AreEqual ("-P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F", Double.MinValue.ToString ("P0F", _nfi), "#02"); + Assert.AreEqual ("-P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000xF", Double.MinValue.ToString ("P0xF", _nfi), "#03"); + } + + [Test] + public void Test15009 () + { + Assert.AreEqual ("0.00000000000000000 %", 0.0.ToString ("P0000000000000000000000000000000000000017", _nfi), "#01"); + Assert.AreEqual ("17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000 %", Double.MaxValue.ToString ("P0000000000000000000000000000000000000017", _nfi), "#02"); + Assert.AreEqual ("-17,976,931,348,623,200,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00000000000000000 %", Double.MinValue.ToString ("P0000000000000000000000000000000000000017", _nfi), "#03"); + } + + [Test] + public void Test15010 () + { + Assert.AreEqual ("+P", 0.0.ToString ("+P", _nfi), "#01"); + Assert.AreEqual ("P+", 0.0.ToString ("P+", _nfi), "#02"); + Assert.AreEqual ("+P+", 0.0.ToString ("+P+", _nfi), "#03"); + } + + [Test] + public void Test15011 () + { + Assert.AreEqual ("+P", Double.MaxValue.ToString ("+P", _nfi), "#01"); + Assert.AreEqual ("P+", Double.MaxValue.ToString ("P+", _nfi), "#02"); + Assert.AreEqual ("+P+", Double.MaxValue.ToString ("+P+", _nfi), "#03"); + } + + [Test] + public void Test15012 () + { + Assert.AreEqual ("-+P", Double.MinValue.ToString ("+P", _nfi), "#01"); + Assert.AreEqual ("-P+", Double.MinValue.ToString ("P+", _nfi), "#02"); + Assert.AreEqual ("-+P+", Double.MinValue.ToString ("+P+", _nfi), "#03"); + } + + [Test] + public void Test15013 () + { + Assert.AreEqual ("-P", 0.0.ToString ("-P", _nfi), "#01"); + Assert.AreEqual ("P-", 0.0.ToString ("P-", _nfi), "#02"); + Assert.AreEqual ("-P-", 0.0.ToString ("-P-", _nfi), "#03"); + } + + [Test] + public void Test15014 () + { + Assert.AreEqual ("-P", Double.MaxValue.ToString ("-P", _nfi), "#01"); + Assert.AreEqual ("P-", Double.MaxValue.ToString ("P-", _nfi), "#02"); + Assert.AreEqual ("-P-", Double.MaxValue.ToString ("-P-", _nfi), "#03"); + } + + [Test] + public void Test15015 () + { + Assert.AreEqual ("--P", Double.MinValue.ToString ("-P", _nfi), "#01"); + Assert.AreEqual ("-P-", Double.MinValue.ToString ("P-", _nfi), "#02"); + Assert.AreEqual ("--P-", Double.MinValue.ToString ("-P-", _nfi), "#03"); + } + + [Test] + public void Test15016 () + { + Assert.AreEqual ("P+0", 0.0.ToString ("P+0", _nfi), "#01"); + Assert.AreEqual ("P+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("P+0", _nfi), "#02"); + Assert.AreEqual ("-P+179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("P+0", _nfi), "#03"); + } + + [Test] + public void Test15017 () + { + Assert.AreEqual ("P+9", 0.0.ToString ("P+9", _nfi), "#01"); + Assert.AreEqual ("P+9", Double.MaxValue.ToString ("P+9", _nfi), "#02"); + Assert.AreEqual ("-P+9", Double.MinValue.ToString ("P+9", _nfi), "#03"); + } + + [Test] + public void Test15018 () + { + Assert.AreEqual ("P-9", 0.0.ToString ("P-9", _nfi), "#01"); + Assert.AreEqual ("P-9", Double.MaxValue.ToString ("P-9", _nfi), "#02"); + Assert.AreEqual ("-P-9", Double.MinValue.ToString ("P-9", _nfi), "#03"); + } + + [Test] + public void Test15019 () + { + Assert.AreEqual ("P0", 0.0.ToString ("P0,", _nfi), "#01"); + Assert.AreEqual ("P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("P0,", _nfi), "#02"); + Assert.AreEqual ("-P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("P0,", _nfi), "#03"); + } + + [Test] + public void Test15020 () + { + Assert.AreEqual ("P0", 0.0.ToString ("P0.", _nfi), "#01"); + Assert.AreEqual ("P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MaxValue.ToString ("P0.", _nfi), "#02"); + Assert.AreEqual ("-P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", Double.MinValue.ToString ("P0.", _nfi), "#03"); + } + + [Test] + public void Test15021 () + { + Assert.AreEqual ("P0.0", 0.0.ToString ("P0.0", _nfi), "#01"); + Assert.AreEqual ("P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MaxValue.ToString ("P0.0", _nfi), "#02"); + Assert.AreEqual ("-P179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0", Double.MinValue.ToString ("P0.0", _nfi), "#03"); + } + + [Test] + public void Test15022 () + { + Assert.AreEqual ("P09", 0.0.ToString ("P0.9", _nfi), "#01"); + Assert.AreEqual ("P1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MaxValue.ToString ("P0.9", _nfi), "#02"); + Assert.AreEqual ("-P1797693134862320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", Double.MinValue.ToString ("P0.9", _nfi), "#03"); + } + + [Test] + public void Test15023 () + { + Assert.AreEqual ("999.1 %", 9.9905.ToString ("P1", _nfi), "#01"); + Assert.AreEqual ("999.2 %", 9.9915.ToString ("P1", _nfi), "#02"); + Assert.AreEqual ("999.3 %", 9.9925.ToString ("P1", _nfi), "#03"); + Assert.AreEqual ("999.4 %", 9.9935.ToString ("P1", _nfi), "#04"); + Assert.AreEqual ("999.5 %", 9.9945.ToString ("P1", _nfi), "#05"); + Assert.AreEqual ("999.6 %", 9.9955.ToString ("P1", _nfi), "#06"); + Assert.AreEqual ("999.7 %", 9.9965.ToString ("P1", _nfi), "#07"); + Assert.AreEqual ("999.8 %", 9.9975.ToString ("P1", _nfi), "#08"); + Assert.AreEqual ("999.9 %", 9.9985.ToString ("P1", _nfi), "#09"); + Assert.AreEqual ("1,000.0 %", 9.9995.ToString ("P1", _nfi), "#10"); + } + + [Test] + public void Test15024 () + { + Assert.AreEqual ("999.91 %", 9.99905.ToString ("P2", _nfi), "#01"); + Assert.AreEqual ("999.92 %", 9.99915.ToString ("P2", _nfi), "#02"); + Assert.AreEqual ("999.93 %", 9.99925.ToString ("P2", _nfi), "#03"); + Assert.AreEqual ("999.94 %", 9.99935.ToString ("P2", _nfi), "#04"); + Assert.AreEqual ("999.95 %", 9.99945.ToString ("P2", _nfi), "#05"); + Assert.AreEqual ("999.96 %", 9.99955.ToString ("P2", _nfi), "#06"); + Assert.AreEqual ("999.97 %", 9.99965.ToString ("P2", _nfi), "#07"); + Assert.AreEqual ("999.98 %", 9.99975.ToString ("P2", _nfi), "#08"); + Assert.AreEqual ("999.99 %", 9.99985.ToString ("P2", _nfi), "#09"); + Assert.AreEqual ("1,000.00 %", 9.99995.ToString ("P2", _nfi), "#10"); + } + + [Test] + public void Test15025 () + { + Assert.AreEqual ("999.99999999991 %", 9.99999999999905.ToString ("P11", _nfi), "#01"); + Assert.AreEqual ("999.99999999992 %", 9.99999999999915.ToString ("P11", _nfi), "#02"); + Assert.AreEqual ("999.99999999993 %", 9.99999999999925.ToString ("P11", _nfi), "#03"); + Assert.AreEqual ("999.99999999994 %", 9.99999999999935.ToString ("P11", _nfi), "#04"); + Assert.AreEqual ("999.99999999995 %", 9.99999999999945.ToString ("P11", _nfi), "#05"); + Assert.AreEqual ("999.99999999996 %", 9.99999999999955.ToString ("P11", _nfi), "#06"); + Assert.AreEqual ("999.99999999997 %", 9.99999999999965.ToString ("P11", _nfi), "#07"); + Assert.AreEqual ("999.99999999998 %", 9.99999999999975.ToString ("P11", _nfi), "#08"); + Assert.AreEqual ("999.99999999999 %", 9.99999999999985.ToString ("P11", _nfi), "#09"); + Assert.AreEqual ("1,000.00000000000 %", 9.99999999999995.ToString ("P11", _nfi), "#10"); + } + + [Test] + public void Test15026 () + { + Assert.AreEqual ("999.999999999991 %", 9.999999999999905.ToString ("P12", _nfi), "#01"); + Assert.AreEqual ("999.999999999991 %", 9.999999999999915.ToString ("P12", _nfi), "#02"); + Assert.AreEqual ("999.999999999993 %", 9.999999999999925.ToString ("P12", _nfi), "#03"); + Assert.AreEqual ("999.999999999993 %", 9.999999999999935.ToString ("P12", _nfi), "#04"); + Assert.AreEqual ("999.999999999994 %", 9.999999999999945.ToString ("P12", _nfi), "#05"); + Assert.AreEqual ("999.999999999996 %", 9.999999999999955.ToString ("P12", _nfi), "#06"); + Assert.AreEqual ("999.999999999996 %", 9.999999999999965.ToString ("P12", _nfi), "#07"); + Assert.AreEqual ("999.999999999998 %", 9.999999999999975.ToString ("P12", _nfi), "#08"); + Assert.AreEqual ("999.999999999999 %", 9.999999999999985.ToString ("P12", _nfi), "#09"); + Assert.AreEqual ("999.999999999999 %", 9.999999999999995.ToString ("P12", _nfi), "#10"); + } + + [Test] + public void Test15027 () + { + Assert.AreEqual ("999.9999999999990 %", 9.9999999999999905.ToString ("P13", _nfi), "#01"); + Assert.AreEqual ("999.9999999999990 %", 9.9999999999999915.ToString ("P13", _nfi), "#02"); + Assert.AreEqual ("999.9999999999990 %", 9.9999999999999925.ToString ("P13", _nfi), "#03"); + Assert.AreEqual ("999.9999999999990 %", 9.9999999999999935.ToString ("P13", _nfi), "#04"); + Assert.AreEqual ("999.9999999999990 %", 9.9999999999999945.ToString ("P13", _nfi), "#05"); + Assert.AreEqual ("999.9999999999990 %", 9.9999999999999955.ToString ("P13", _nfi), "#06"); + Assert.AreEqual ("1,000.0000000000000 %", 9.9999999999999965.ToString ("P13", _nfi), "#07"); + Assert.AreEqual ("1,000.0000000000000 %", 9.9999999999999975.ToString ("P13", _nfi), "#08"); + Assert.AreEqual ("1,000.0000000000000 %", 9.9999999999999985.ToString ("P13", _nfi), "#09"); + Assert.AreEqual ("1,000.0000000000000 %", 9.9999999999999995.ToString ("P13", _nfi), "#10"); + } + + [Test] + public void Test15028 () + { + Assert.AreEqual ("1", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N0", _nfi), "#01"); + Assert.AreEqual ("1.234567890123", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N12", _nfi), "#02"); + Assert.AreEqual ("1.2345678901235", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N13", _nfi), "#03"); + Assert.AreEqual ("1.23456789012346", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N14", _nfi), "#04"); + Assert.AreEqual ("1.234567890123460", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N15", _nfi), "#05"); + Assert.AreEqual ("1.234567890123460000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N99", _nfi), "#06"); + Assert.AreEqual ("N101", 1.234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.ToString ("N100"), "#07"); + } + + [Test] + public void Test15029 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.PercentDecimalSeparator = "#"; + Assert.AreEqual ("-9,999,999,990#00 %", (-99999999.9).ToString ("P", nfi), "#01"); + } + + [Test] + public void Test15030 () + { + NumberFormatInfo nfi = _nfi.Clone() as NumberFormatInfo; + nfi.NegativeSign = "+"; + nfi.PositiveSign = "-"; + + Assert.AreEqual ("1,000.00 %", 10.0.ToString ("P", nfi), "#01"); + Assert.AreEqual ("0.00 %", 0.0.ToString ("P", nfi), "#02"); + Assert.AreEqual ("+1,000.00 %", (-10.0).ToString ("P", nfi), "#03"); + } + + [Test] + public void Test15031 () + { + Assert.AreEqual ("Infinity", (Double.MaxValue / 0.0).ToString ("N99", _nfi) , "#01"); + Assert.AreEqual ("-Infinity", (Double.MinValue / 0.0).ToString ("N99", _nfi) , "#02"); + Assert.AreEqual ("NaN", (0.0 / 0.0).ToString ("N99", _nfi) , "#03"); + } + + // TestRoundtrip for double and single + [Test] + public void TestRoundtrip() + { + Assert.AreEqual ("1.2345678901234567", 1.2345678901234567890.ToString ("R", _nfi), "#01"); + Assert.AreEqual ("1.2345678901234567", 1.2345678901234567890.ToString ("r", _nfi), "#02"); + Assert.AreEqual ("1.2345678901234567", 1.2345678901234567890.ToString ("R0", _nfi), "#03"); + Assert.AreEqual ("1.2345678901234567", 1.2345678901234567890.ToString ("r0", _nfi), "#04"); + Assert.AreEqual ("1.2345678901234567", 1.2345678901234567890.ToString ("R99", _nfi), "#05"); + Assert.AreEqual ("1.2345678901234567", 1.2345678901234567890.ToString ("r99", _nfi), "#06"); + Assert.AreEqual ("-1.7976931348623157E+308", Double.MinValue.ToString ("R"), "#07"); + Assert.AreEqual ("1.7976931348623157E+308", Double.MaxValue.ToString ("R"), "#08"); + Assert.AreEqual ("-1.7976931348623147E+308", (-1.7976931348623147E+308).ToString("R"), "#09"); + Assert.AreEqual ("-3.40282347E+38", Single.MinValue.ToString("R"), "#10"); + Assert.AreEqual ("3.40282347E+38", Single.MaxValue.ToString("R"), "#11"); + } + + // Tests arithmetic overflow in double.ToString exposed by Bug #383531 + [Test] + public void TestToStringOverflow() + { + // Test all the possible double exponents with the maximal mantissa + long dblPattern = 0xfffffffffffff; // all 1s significand + + for (long exp = 0; exp < 4096; exp++) { + double val = BitConverter.Int64BitsToDouble((long)(dblPattern | (exp << 52))); + string strRes = val.ToString("R", NumberFormatInfo.InvariantInfo); + double rndTripVal = Double.Parse(strRes); + Assert.AreEqual (val, rndTripVal, "Iter#" + exp); + } + } + + // Test17000 - Double and X + [Test] + [ExpectedException (typeof (FormatException))] + public void Test17000 () + { + Assert.AreEqual ("", 0.0.ToString ("X99", _nfi) , "#01"); + } + } +} diff --git a/mcs/class/corlib/Test/System/ObjectTest.cs b/mcs/class/corlib/Test/System/ObjectTest.cs index bdf038404d9..669645279c7 100644 --- a/mcs/class/corlib/Test/System/ObjectTest.cs +++ b/mcs/class/corlib/Test/System/ObjectTest.cs @@ -12,112 +12,112 @@ using System.Globalization; namespace MonoTests.System { -public class ObjectTest : TestCase +[TestFixture] +public class ObjectTest { public ObjectTest() {} - protected override void SetUp() - { - } - - protected override void TearDown() - { - } - + [Test] public void TestCtor() { Object o = new Object(); - AssertNotNull("Can I at least get an _Object_, please?", o); + Assert.IsNotNull(o, "Can I at least get an _Object_, please?"); } + [Test] public void TestEquals1() { { Object x = new Object(); Object y = new Object(); - Assert("Object should equal itself", - x.Equals(x)); - Assert("object should not equal null", - !x.Equals(null)); - Assert("Different objects should not equal 1", - !x.Equals(y)); - Assert("Different objects should not equal 2", - !y.Equals(x)); + Assert.IsTrue(x.Equals(x), "Object should equal itself"); + + Assert.IsTrue(!x.Equals(null), "object should not equal null"); + + Assert.IsTrue(!x.Equals(y), "Different objects should not equal 1"); + + Assert.IsTrue(!y.Equals(x), "Different objects should not equal 2"); + } { double x = Double.NaN; double y = Double.NaN; - Assert("NaNs should always equal each other", - ((Object)x).Equals(y)); + Assert.IsTrue(((Object)x).Equals(y), "NaNs should always equal each other"); + } } + + [Test] public void TestEquals2() { { Object x = new Object(); Object y = new Object(); - Assert("Object should equal itself", - Object.Equals(x,x)); - Assert("object should not equal null", - !Object.Equals(x,null)); - Assert("null should not equal object", - !Object.Equals(null,x)); - Assert("Different objects should not equal 1", - !Object.Equals(x,y)); - Assert("Different objects should not equal 2", - !Object.Equals(y,x)); - Assert("null should not equal null", - Object.Equals(null,null)); + Assert.IsTrue(Object.Equals(x,x), "Object should equal itself"); + + Assert.IsTrue(!Object.Equals(x,null), "object should not equal null"); + + Assert.IsTrue(!Object.Equals(null,x), "null should not equal object"); + + Assert.IsTrue(!Object.Equals(x,y), "Different objects should not equal 1"); + + Assert.IsTrue(!Object.Equals(y,x), "Different objects should not equal 2"); + + Assert.IsTrue(Object.Equals(null,null), "null should equal null"); + } { double x = Double.NaN; double y = Double.NaN; - Assert("NaNs should always equal each other", - Object.Equals(x,y)); + Assert.IsTrue(Object.Equals(x,y), "NaNs should always equal each other"); + } } + [Test] public void TestGetHashCode() { Object x = new Object(); - AssertEquals("Object's hash code should not change", - x.GetHashCode(), x.GetHashCode()); + Assert.AreEqual(x.GetHashCode(), x.GetHashCode(), "Object's hash code should not change"); } + [Test] public void TestGetType() { Object x = new Object(); - AssertNotNull("Should get a type for Object", x.GetType()); - AssertEquals("Bad name for Object type", "System.Object", - x.GetType().ToString()); + Assert.IsNotNull(x.GetType(), "Should get a type for Object"); + Assert.AreEqual(x.GetType().ToString(), "System.Object", "Bad name for Object type"); + } + [Test] public void TestReferenceEquals() { Object x = new Object(); Object y = new Object(); - Assert("Object should equal itself", - Object.ReferenceEquals(x,x)); - Assert("object should not equal null", - !Object.ReferenceEquals(x,null)); - Assert("null should not equal object", - !Object.ReferenceEquals(null,x)); - Assert("Different objects should not equal 1", - !Object.ReferenceEquals(x,y)); - Assert("Different objects should not equal 2", - !Object.ReferenceEquals(y,x)); - Assert("null should not equal null", - Object.ReferenceEquals(null,null)); + Assert.IsTrue(Object.ReferenceEquals(x,x), "Object should equal itself"); + + Assert.IsTrue(!Object.ReferenceEquals(x,null), "object should not equal null"); + + Assert.IsTrue(!Object.ReferenceEquals(null,x), "null should not equal object"); + + Assert.IsTrue(!Object.ReferenceEquals(x,y), "Different objects should not equal 1"); + + Assert.IsTrue(!Object.ReferenceEquals(y,x), "Different objects should not equal 2"); + + Assert.IsTrue(Object.ReferenceEquals(null,null), "null should not equal null"); + } + [Test] public void TestToString() { Object x = new Object(); Object y = new Object(); - AssertEquals("All Objects should have same string rep", - x.ToString(), y.ToString()); + Assert.AreEqual(x.ToString(), y.ToString(), "All Objects should have same string rep"); } #if NET_2_0 class Foo {} + [Test] public void TestToStringOnGenericInstances () { Foo foo = new Foo (); - AssertEquals ("Bad ToString of generic instance", - "MonoTests.System.ObjectTest+Foo`1[System.Object]", foo.ToString ()); + Assert.AreEqual ("MonoTests.System.ObjectTest+Foo`1[System.Object]", foo.ToString (), "Bad ToString of generic instance"); + } #endif } diff --git a/mcs/class/corlib/Test/System/RandomTest.cs b/mcs/class/corlib/Test/System/RandomTest.cs index 0db6e1b967a..a18524968f7 100644 --- a/mcs/class/corlib/Test/System/RandomTest.cs +++ b/mcs/class/corlib/Test/System/RandomTest.cs @@ -33,7 +33,7 @@ using System; namespace MonoTests.System { [TestFixture] - public class RandomTest : Assertion { + public class RandomTest { #if false // @@ -51,7 +51,7 @@ namespace MonoTests.System { for (i=0; i<20; i++) c += r.NextDouble (); c/=i; - Assert (c.ToString () + " is out of range.", c < .7 && c > .3); + Assert.IsTrue (c.ToString () + " is out of range.", c < .7 && c > .3); } #endif @@ -66,7 +66,7 @@ namespace MonoTests.System { c += r.NextDouble (); c2 += r2.NextDouble (); } - AssertEquals ("Compare", c, c2); + Assert.AreEqual (c, c2, "Compare"); } [Test] @@ -75,7 +75,7 @@ namespace MonoTests.System { Random r = new Random (); for (int i=0; i<20; i++) { long c = r.Next (); - Assert ("Next(" + i + ")", c < Int32.MaxValue && c >= 0); + Assert.IsTrue (c < Int32.MaxValue && c >= 0, "Next(" + i + ")"); } } @@ -85,7 +85,7 @@ namespace MonoTests.System { Random r = new Random(); for (int i=0; i<20; i++) { long c = r.Next (10); - Assert ("NextMax(" + i + ")", c < 10 && c >= 0); + Assert.IsTrue (c < 10 && c >= 0, "NextMax(" + i + ")"); } } @@ -93,19 +93,19 @@ namespace MonoTests.System { public void NextMinMax() { Random r = new Random (); - AssertEquals ("#1 Failed where min == max", 42, r.Next (42, 42)); - AssertEquals ("#2 Failed where min == max", Int32.MaxValue, r.Next (Int32.MaxValue, Int32.MaxValue)); - AssertEquals ("#3 Failed where min == max", Int32.MinValue, r.Next (Int32.MinValue, Int32.MinValue)); - AssertEquals ("#4 Failed where min == max", 0, r.Next (0, 0)); + Assert.AreEqual (42, r.Next (42, 42), "#1 Failed where min == max"); + Assert.AreEqual (Int32.MaxValue, r.Next (Int32.MaxValue, Int32.MaxValue), "#2 Failed where min == max"); + Assert.AreEqual (Int32.MinValue, r.Next (Int32.MinValue, Int32.MinValue), "#3 Failed where min == max"); + Assert.AreEqual (0, r.Next (0, 0), "#4 Failed where min == max"); for (int i = 1; i <= Int32.MaxValue / 2; i *= 2) { long c = r.Next (i, i * 2); - Assert ("At i=" + i + " c < i*2 failed", c < i * 2); - Assert ("At i=" + i + " c >= i failed", c >= i); + Assert.IsTrue (c < i * 2, "At i=" + i + " c < i*2 failed"); + Assert.IsTrue (c >= i, "At i=" + i + " c >= i failed"); } for (int i = -1; i >= Int32.MinValue / 2; i *= 2) { long c = r.Next (i * 2, i); - Assert ("At i=" + i + " c < i*2 failed", c < i); - Assert ("At i=" + i + " c >= i failed", c >= i * 2); + Assert.IsTrue (c < i, "At i=" + i + " c < i*2 failed"); + Assert.IsTrue (c >= i * 2, "At i=" + i + " c >= i failed"); } } @@ -122,10 +122,10 @@ namespace MonoTests.System { random.NextBytes (buffer); r [x] = BitConverter.ToString (buffer); } - AssertEquals ("Seed(24)", "43-DB-8B-AE-0A-88-A8-7B", r [3]); - AssertEquals ("Seed(8)", "E7-2A-5C-44-D1-8C-7D-74", r [2]); - AssertEquals ("Seed(2)", "C5-67-2A-FC-1B-4E-CD-72", r [1]); - AssertEquals ("Seed(0)", "B9-D1-C4-8E-34-8F-E7-71", r [0]); + Assert.AreEqual ("43-DB-8B-AE-0A-88-A8-7B", r [3], "Seed(24)"); + Assert.AreEqual ("E7-2A-5C-44-D1-8C-7D-74", r [2], "Seed(8)"); + Assert.AreEqual ("C5-67-2A-FC-1B-4E-CD-72", r [1], "Seed(2)"); + Assert.AreEqual ("B9-D1-C4-8E-34-8F-E7-71", r [0], "Seed(0)"); }*/ } } diff --git a/mcs/class/corlib/Test/System/ResolveEventArgsTest.cs b/mcs/class/corlib/Test/System/ResolveEventArgsTest.cs index 863fd40948a..5462f003746 100644 --- a/mcs/class/corlib/Test/System/ResolveEventArgsTest.cs +++ b/mcs/class/corlib/Test/System/ResolveEventArgsTest.cs @@ -9,14 +9,16 @@ using System; namespace MonoTests.System { -public class ResolveEventArgsTest : TestCase +[TestFixture] +public class ResolveEventArgsTest { public ResolveEventArgsTest() {} + [Test] public void TestTheWholeThing() { ResolveEventArgs REA = new ResolveEventArgs("REA_Name"); - Assert ("Name property not correct", REA.Name == "REA_Name"); + Assert.AreEqual (REA.Name, "REA_Name", "Name property not correct"); } } diff --git a/mcs/class/corlib/Test/System/SByteTest.cs b/mcs/class/corlib/Test/System/SByteTest.cs index b75d91cf6e9..09b0dc8312e 100644 --- a/mcs/class/corlib/Test/System/SByteTest.cs +++ b/mcs/class/corlib/Test/System/SByteTest.cs @@ -14,7 +14,7 @@ namespace MonoTests.System { [TestFixture] -public class SByteTest : Assertion +public class SByteTest { private const SByte MySByte1 = -42; private const SByte MySByte2 = -128; @@ -38,35 +38,39 @@ public class SByteTest : Assertion "127", "127.00000", "12,700.00000 %", "0007f"}; private NumberFormatInfo Nfi = NumberFormatInfo.InvariantInfo; + [Test] public void TestMinMax() { - AssertEquals(SByte.MinValue, MySByte2); - AssertEquals(SByte.MaxValue, MySByte3); + Assert.AreEqual(SByte.MinValue, MySByte2); + Assert.AreEqual(SByte.MaxValue, MySByte3); } + [Test] public void TestCompareTo() { - Assert(MySByte3.CompareTo(MySByte2) > 0); - Assert(MySByte2.CompareTo(MySByte2) == 0); - Assert(MySByte1.CompareTo((SByte)(-42)) == 0); - Assert(MySByte2.CompareTo(MySByte3) < 0); + Assert.IsTrue(MySByte3.CompareTo(MySByte2) > 0); + Assert.IsTrue(MySByte2.CompareTo(MySByte2) == 0); + Assert.IsTrue(MySByte1.CompareTo((SByte)(-42)) == 0); + Assert.IsTrue(MySByte2.CompareTo(MySByte3) < 0); try { MySByte2.CompareTo((object)(int)100); - Fail("Should raise a System.ArgumentException"); + Assert.Fail("Should raise a System.ArgumentException"); } catch (Exception e) { - Assert(typeof(ArgumentException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentException) == e.GetType()); } } + [Test] public void TestEquals() { - Assert(MySByte1.Equals(MySByte1)); - Assert(MySByte1.Equals((SByte)(-42))); - Assert(MySByte1.Equals((Int16)(-42)) == false); - Assert(MySByte1.Equals(MySByte2) == false); + Assert.IsTrue(MySByte1.Equals(MySByte1)); + Assert.IsTrue(MySByte1.Equals((SByte)(-42))); + Assert.IsTrue(MySByte1.Equals((Int16)(-42)) == false); + Assert.IsTrue(MySByte1.Equals(MySByte2) == false); } - + + [Test] public void TestGetHashCode() { try { @@ -75,100 +79,102 @@ public class SByteTest : Assertion MySByte3.GetHashCode(); } catch { - Fail("GetHashCode should not raise an exception here"); + Assert.Fail("GetHashCode should not raise an exception here"); } } - + + [Test] public void TestParse() { //test Parse(string s) - Assert(MySByte1 == SByte.Parse(MyString1)); - Assert(MySByte2 == SByte.Parse(MyString2)); - Assert(MySByte3 == SByte.Parse(MyString3)); + Assert.IsTrue(MySByte1 == SByte.Parse(MyString1)); + Assert.IsTrue(MySByte2 == SByte.Parse(MyString2)); + Assert.IsTrue(MySByte3 == SByte.Parse(MyString3)); try { SByte.Parse(null); - Fail("Should raise a System.ArgumentNullException"); + Assert.Fail("Should raise a System.ArgumentNullException"); } catch (Exception e) { - Assert(typeof(ArgumentNullException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentNullException) == e.GetType()); } try { SByte.Parse("not-a-number"); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } try { int OverInt = SByte.MaxValue + 1; SByte.Parse(OverInt.ToString()); - Fail("Should raise a System.OverflowException"); + Assert.Fail("Should raise a System.OverflowException"); } catch (Exception e) { - Assert(typeof(OverflowException) == e.GetType()); + Assert.IsTrue(typeof(OverflowException) == e.GetType()); } //test Parse(string s, NumberStyles style) - AssertEquals("A1", (sbyte)42, SByte.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", NumberStyles.Currency)); + Assert.AreEqual((sbyte)42, SByte.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", NumberStyles.Currency), "A1"); try { SByte.Parse(NumberFormatInfo.CurrentInfo.CurrencySymbol+"42", NumberStyles.Integer); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } //test Parse(string s, IFormatProvider provider) - Assert(-42 == SByte.Parse(" -42 ", Nfi)); + Assert.IsTrue(-42 == SByte.Parse(" -42 ", Nfi)); try { SByte.Parse("%42", Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } //test Parse(string s, NumberStyles style, IFormatProvider provider) - Assert(16 == SByte.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); + Assert.IsTrue(16 == SByte.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); try { SByte.Parse(NumberFormatInfo.CurrentInfo.CurrencySymbol+"42", NumberStyles.Integer, Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } } [Test] public void Parse_MinMax () { - AssertEquals ("MinValue", SByte.MinValue, SByte.Parse ("-128")); - AssertEquals ("MaxValue", SByte.MaxValue, SByte.Parse ("127")); + Assert.AreEqual (SByte.MinValue, SByte.Parse ("-128"), "MinValue"); + Assert.AreEqual (SByte.MaxValue, SByte.Parse ("127"), "MaxValue"); } - + + [Test] public void TestToString() { //test ToString() - Assert("MyString1, MySByte1.ToString()", String.Compare(MyString1, MySByte1.ToString()) == 0); - Assert("MyString2, MySByte2.ToString()", String.Compare(MyString2, MySByte2.ToString()) == 0); - Assert("MyString3, MySByte3.ToString()", String.Compare(MyString3, MySByte3.ToString()) == 0); + Assert.IsTrue(String.Compare(MyString1, MySByte1.ToString()) == 0, "MyString1, MySByte1.ToString()"); + Assert.IsTrue(String.Compare(MyString2, MySByte2.ToString()) == 0, "MyString2, MySByte2.ToString()"); + Assert.IsTrue(String.Compare(MyString3, MySByte3.ToString()) == 0, "MyString3, MySByte3.ToString()"); //test ToString(string format) /* TODO: These tests depend on the culture of the system running the test. So, this needs to be tested in a different way. for (int i=0; i < Formats1.Length; i++) { - Assert("i="+i+", Results1[i]="+Results1[i]+", MySByte2.ToString(Formats1[i])="+MySByte2.ToString(Formats1[i]), String.Compare(Results1[i], MySByte2.ToString(Formats1[i])) == 0); - Assert("Results2[i], MySByte3.ToString(Formats2[i])", String.Compare(Results2[i], MySByte3.ToString(Formats2[i])) == 0); + Assert.IsTrue("i="+i+", Results1[i]="+Results1[i]+", MySByte2.ToString(Formats1[i])="+MySByte2.ToString(Formats1[i]), String.Compare(Results1[i], MySByte2.ToString(Formats1[i])) == 0); + Assert.IsTrue(String.Compare(Results2[i], MySByte3.ToString(Formats2[i])) == 0, "Results2[i], MySByte3.ToString(Formats2[i])"); } */ //test ToString(string format, IFormatProvider provider); for (int i=0; i < Formats1.Length; i++) { - Assert("i="+i+", ResultsNfi1[i]="+ResultsNfi1[i]+", MySByte2.ToString(Formats1[i]="+Formats1[i]+"): Expected "+ResultsNfi1[i]+" but got "+MySByte2.ToString(Formats1[i], Nfi), String.Compare(ResultsNfi1[i], MySByte2.ToString(Formats1[i], Nfi)) == 0); - Assert("ResultsNfi2[i], MySByte3.ToString(Formats2[i], Nfi):"+ResultsNfi2[i]+"<==>"+MySByte3.ToString(Formats2[i], Nfi), String.Compare(ResultsNfi2[i], MySByte3.ToString(Formats2[i], Nfi)) == 0); + Assert.IsTrue(String.Compare(ResultsNfi1[i], MySByte2.ToString(Formats1[i], Nfi)) == 0, "i="+i+", ResultsNfi1[i]="+ResultsNfi1[i]+", MySByte2.ToString(Formats1[i]="+Formats1[i]+"): Expected "+ResultsNfi1[i]+" but got "+MySByte2.ToString(Formats1[i], Nfi)); + Assert.IsTrue(String.Compare(ResultsNfi2[i], MySByte3.ToString(Formats2[i], Nfi)) == 0, "ResultsNfi2[i], MySByte3.ToString(Formats2[i], Nfi):"+ResultsNfi2[i]+"<==>"+MySByte3.ToString(Formats2[i], Nfi)); } try { MySByte1.ToString("z"); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert("typeof(FormatException) == e.GetType()", typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType(), "typeof(FormatException) == e.GetType()"); } } @@ -178,14 +184,14 @@ public class SByteTest : Assertion SByte i = 100; // everything defaults to "G" string def = i.ToString ("G"); - AssertEquals ("ToString()", def, i.ToString ()); - AssertEquals ("ToString((IFormatProvider)null)", def, i.ToString ((IFormatProvider)null)); - AssertEquals ("ToString((string)null)", def, i.ToString ((string)null)); - AssertEquals ("ToString(empty)", def, i.ToString (String.Empty)); - AssertEquals ("ToString(null,null)", def, i.ToString (null, null)); - AssertEquals ("ToString(empty,null)", def, i.ToString (String.Empty, null)); + Assert.AreEqual (def, i.ToString (), "ToString()"); + Assert.AreEqual (def, i.ToString ((IFormatProvider)null), "ToString((IFormatProvider)null)"); + Assert.AreEqual (def, i.ToString ((string)null), "ToString((string)null)"); + Assert.AreEqual (def, i.ToString (String.Empty), "ToString(empty)"); + Assert.AreEqual (def, i.ToString (null, null), "ToString(null,null)"); + Assert.AreEqual (def, i.ToString (String.Empty, null), "ToString(empty,null)"); - AssertEquals ("ToString(G)", "100", def); + Assert.AreEqual ("100", def, "ToString(G)"); } } diff --git a/mcs/class/corlib/Test/System/SingleFormatterTest.cs b/mcs/class/corlib/Test/System/SingleFormatterTest.cs index 13270238dcb..a88dc2691fc 100644 --- a/mcs/class/corlib/Test/System/SingleFormatterTest.cs +++ b/mcs/class/corlib/Test/System/SingleFormatterTest.cs @@ -66,7 +66,7 @@ namespace MonoTests.System private void FormatStringTest(int TestNumber, float Number, string Format, string ExpectedResult) { - Assertion.AssertEquals ("SngF #" + TestNumber, ExpectedResult, Number.ToString(Format)); + Assert.AreEqual (ExpectedResult, Number.ToString(Format), "SngF #" + TestNumber); } string GetPercent (string s) diff --git a/mcs/class/corlib/Test/System/SingleTest.cs b/mcs/class/corlib/Test/System/SingleTest.cs index 6d8fbfa2121..4d8c2a54125 100644 --- a/mcs/class/corlib/Test/System/SingleTest.cs +++ b/mcs/class/corlib/Test/System/SingleTest.cs @@ -18,7 +18,7 @@ using NUnit.Framework; namespace MonoTests.System { [TestFixture] - public class SingleTest : Assertion + public class SingleTest { CultureInfo old_culture; @@ -40,50 +40,50 @@ namespace MonoTests.System { Single s1 = 1f; Single s2 = 1f; - Assert ("Equals s1==s2", s1.Equals (s2)); - Assert ("Equals s1!=NaN", !s1.Equals (Single.NaN)); + Assert.IsTrue (s1.Equals (s2), "Equals s1==s2"); + Assert.IsTrue (!s1.Equals (Single.NaN), "Equals s1!=NaN"); - Assert ("Equals NaN=!s2", !Single.NaN.Equals (s2)); - Assert ("Equals NaN==NaN", Single.NaN.Equals (Single.NaN)); + Assert.IsTrue (!Single.NaN.Equals (s2), "Equals NaN=!s2"); + Assert.IsTrue (Single.NaN.Equals (Single.NaN), "Equals NaN==NaN"); Single p0 = 0.0f; Single m0 = -0.0f; - Assert ("0.0==-0.0", p0.Equals (m0)); - Assert ("-0.0==0.0", m0.Equals (p0)); + Assert.IsTrue (p0.Equals (m0), "0.0==-0.0"); + Assert.IsTrue (m0.Equals (p0), "-0.0==0.0"); } [Test] public void IsInfinity () { - Assert ("PositiveInfinity", Single.IsInfinity (Single.PositiveInfinity)); - Assert ("NegativeInfinity", Single.IsInfinity (Single.NegativeInfinity)); - Assert ("12", !Single.IsInfinity(12)); - Assert ("NaN", !Single.IsInfinity (Single.NaN)); + Assert.IsTrue ( Single.IsInfinity (Single.PositiveInfinity), "PositiveInfinity"); + Assert.IsTrue (Single.IsInfinity (Single.NegativeInfinity), "NegativeInfinity"); + Assert.IsTrue (!Single.IsInfinity(12), "12"); + Assert.IsTrue (!Single.IsInfinity (Single.NaN), "NaN"); } [Test] public void IsNan () { - Assert ("Nan", Single.IsNaN (Single.NaN)); - Assert ("12", !Single.IsNaN (12)); - Assert ("PositiveInfinity", !Single.IsNaN (Single.PositiveInfinity)); - Assert ("NegativeInfinity", !Single.IsNaN (Single.PositiveInfinity)); + Assert.IsTrue (Single.IsNaN (Single.NaN), "Nan"); + Assert.IsTrue (!Single.IsNaN (12), "12"); + Assert.IsTrue (!Single.IsNaN (Single.PositiveInfinity), "PositiveInfinity"); + Assert.IsTrue (!Single.IsNaN (Single.PositiveInfinity), "NegativeInfinity"); } [Test] public void IsNegativeInfinity () { - Assert ("IsNegativeInfinity", Single.IsNegativeInfinity (Single.NegativeInfinity)); - Assert ("12", !Single.IsNegativeInfinity (12)); - Assert ("NaN", !Single.IsNegativeInfinity (Single.NaN)); + Assert.IsTrue (Single.IsNegativeInfinity (Single.NegativeInfinity), "IsNegativeInfinity"); + Assert.IsTrue (!Single.IsNegativeInfinity (12), "12"); + Assert.IsTrue (!Single.IsNegativeInfinity (Single.NaN), "NaN"); } [Test] public void IsPositiveInfinity () { - Assert ("PositiveInfinity", Single.IsPositiveInfinity (Single.PositiveInfinity)); - Assert ("12", !Single.IsPositiveInfinity (12)); - Assert ("NaN", !Single.IsPositiveInfinity (Single.NaN)); + Assert.IsTrue (Single.IsPositiveInfinity (Single.PositiveInfinity), "PositiveInfinity"); + Assert.IsTrue (!Single.IsPositiveInfinity (12), "12"); + Assert.IsTrue (!Single.IsPositiveInfinity (Single.NaN), "NaN"); } [Test] @@ -92,20 +92,20 @@ namespace MonoTests.System Single i = 254.9f; // everything defaults to "G" string def = i.ToString ("G"); - AssertEquals ("ToString()", def, i.ToString ()); - AssertEquals ("ToString((IFormatProvider)null)", def, i.ToString ((IFormatProvider)null)); - AssertEquals ("ToString((string)null)", def, i.ToString ((string)null)); - AssertEquals ("ToString(empty)", def, i.ToString (String.Empty)); - AssertEquals ("ToString(null,null)", def, i.ToString (null, null)); - AssertEquals ("ToString(empty,null)", def, i.ToString (String.Empty, null)); - AssertEquals ("ToString(G)", "254.9", def); + Assert.AreEqual (def, i.ToString (), "ToString()"); + Assert.AreEqual (def, i.ToString ((IFormatProvider)null), "ToString((IFormatProvider)null)"); + Assert.AreEqual (def, i.ToString ((string)null), "ToString((string)null)"); + Assert.AreEqual (def, i.ToString (String.Empty), "ToString(empty)"); + Assert.AreEqual (def, i.ToString (null, null), "ToString(null,null)"); + Assert.AreEqual (def, i.ToString (String.Empty, null), "ToString(empty,null)"); + Assert.AreEqual ("254.9", def, "ToString(G)"); } [Test] [Category ("NotWorking")] public void ToString_Roundtrip () { - AssertEquals ("10.78", 10.78f.ToString ("R", NumberFormatInfo.InvariantInfo)); + Assert.AreEqual (10.78f.ToString ("R", NumberFormatInfo.InvariantInfo), "10.78"); } #if NET_2_0 diff --git a/mcs/class/corlib/Test/System/StringTest.cs b/mcs/class/corlib/Test/System/StringTest.cs index d74ee41e6f6..681295bcfe2 100644 --- a/mcs/class/corlib/Test/System/StringTest.cs +++ b/mcs/class/corlib/Test/System/StringTest.cs @@ -3,10 +3,10 @@ // Authors: // Jeffrey Stedfast // David Brandt -// Kornél Pál +// Kornel Pal // // (C) Ximian, Inc. http://www.ximian.com -// Copyright (C) 2006 Kornél Pál +// Copyright (C) 2006 Kornel Pal // Copyright (C) 2006 Novell (http://www.novell.com) // @@ -22,17 +22,19 @@ namespace MonoTests.System { [TestFixture] -public class StringTest : TestCase +public class StringTest { private CultureInfo orgCulture; - protected override void SetUp () + [SetUp] + public void SetUp () { // save current culture orgCulture = CultureInfo.CurrentCulture; } - protected override void TearDown () + [TearDown] + public void TearDown () { // restore original culture Thread.CurrentThread.CurrentCulture = orgCulture; @@ -43,17 +45,17 @@ public class StringTest : TestCase [Test] // ctor (Char []) public unsafe void Constructor2 () { - AssertEquals ("#1", String.Empty, new String ((char[]) null)); - AssertEquals ("#2", String.Empty, new String (new Char [0])); - AssertEquals ("#3", "A", new String (new Char [1] {'A'})); + Assert.AreEqual (String.Empty, new String ((char[]) null), "#1"); + Assert.AreEqual (String.Empty, new String (new Char [0]), "#2"); + Assert.AreEqual ("A", new String (new Char [1] {'A'}), "#3"); } #endif [Test] // ctor (Char, Int32) public void Constructor4 () { - AssertEquals (string.Empty, new String ('A', 0)); - AssertEquals ("AAA", new String ('A', 3)); + Assert.AreEqual (string.Empty, new String ('A', 0)); + Assert.AreEqual (new String ('A', 3), "AAA"); } [Test] // ctor (Char, Int32) @@ -61,13 +63,13 @@ public class StringTest : TestCase { try { new String ('A', -1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // 'count' must be non-negative - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -75,9 +77,9 @@ public class StringTest : TestCase public void Constructor6 () { char [] arr = new char [3] { 'A', 'B', 'C' }; - AssertEquals ("#1", "ABC", new String (arr, 0, arr.Length)); - AssertEquals ("#2", "BC", new String (arr, 1, 2)); - AssertEquals ("#3", string.Empty, new String (arr, 2, 0)); + Assert.AreEqual ("ABC", new String (arr, 0, arr.Length), "#1"); + Assert.AreEqual ("BC", new String (arr, 1, 2), "#2"); + Assert.AreEqual (string.Empty, new String (arr, 2, 0), "#3"); } [Test] // ctor (Char [], Int32, Int32) @@ -87,13 +89,13 @@ public class StringTest : TestCase try { new String (arr, 0, -1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Length cannot be less than zero - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "length", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("length", ex.ParamName, "#5"); } } @@ -104,14 +106,14 @@ public class StringTest : TestCase try { new String (arr, 1, 3); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -122,13 +124,13 @@ public class StringTest : TestCase try { new String (arr, -1, 0); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // StartIndex cannot be less than zero - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -137,12 +139,12 @@ public class StringTest : TestCase { try { new String ((char []) null, 0, 0); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("value", ex.ParamName, "#5"); } } @@ -150,8 +152,8 @@ public class StringTest : TestCase [Test] public unsafe void CharPtrConstructor () { - AssertEquals ("char*", String.Empty, new String ((char*) null)); - AssertEquals ("char*,int,int", String.Empty, new String ((char*) null, 0, 0)); + Assert.AreEqual (String.Empty, new String ((char*) null), "char*"); + Assert.AreEqual (String.Empty, new String ((char*) null, 0, 0), "char*,int,int"); } [Test] @@ -162,7 +164,7 @@ public class StringTest : TestCase byte[] bytes = encoding.GetBytes (s); fixed (byte* bytePtr = bytes) - AssertEquals (s, new String ((sbyte*) bytePtr, 0, bytes.Length, encoding)); + Assert.AreEqual (s, new String ((sbyte*) bytePtr, 0, bytes.Length, encoding)); } [Test] @@ -184,17 +186,17 @@ public class StringTest : TestCase fixed (byte* bytePtr = bytes) { - AssertEquals (s.Substring (0, s.Length - 1), new String ((sbyte*) bytePtr)); - AssertEquals (s, new String ((sbyte*) bytePtr, 0, bytes.Length)); - AssertEquals (s, new String ((sbyte*) bytePtr, 0, bytes.Length, null)); - AssertEquals (s, new String ((sbyte*) bytePtr, 0, bytes.Length, encoding)); + Assert.AreEqual (s.Substring (0, s.Length - 1), new String ((sbyte*) bytePtr)); + Assert.AreEqual (s, new String ((sbyte*) bytePtr, 0, bytes.Length)); + Assert.AreEqual (s, new String ((sbyte*) bytePtr, 0, bytes.Length, null)); + Assert.AreEqual (s, new String ((sbyte*) bytePtr, 0, bytes.Length, encoding)); } } [Test] // ctor (SByte*) public unsafe void Constructor3_Value_Null () { - AssertEquals (String.Empty, new String ((sbyte*) null)); + Assert.AreEqual (String.Empty, new String ((sbyte*) null)); } [Test] // ctor (SByte*) @@ -202,14 +204,14 @@ public class StringTest : TestCase { try { new String ((sbyte*) (-1)); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Pointer startIndex and length do not refer to a // valid string - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "ptr", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("ptr", ex.ParamName, "#5"); } } @@ -218,13 +220,13 @@ public class StringTest : TestCase { try { new String ((sbyte*) null, 0, -1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Length cannot be less than zero - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "length", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("length", ex.ParamName, "#5"); } } @@ -233,13 +235,13 @@ public class StringTest : TestCase { try { new String ((sbyte*) null, -1, 0); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // StartIndex cannot be less than zero - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -248,26 +250,26 @@ public class StringTest : TestCase { try { new String ((sbyte*) (-1), 1, 0); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { // Pointer startIndex and length do not refer to a // valid string - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#A5"); } try { new String ((sbyte*) (-1), 1, 1); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { // Pointer startIndex and length do not refer to a // valid string - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#B5"); } } @@ -276,14 +278,14 @@ public class StringTest : TestCase { try { new String ((sbyte*) (-1), 0, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Pointer startIndex and length do not refer to a // valid string - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "ptr", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("ptr", ex.ParamName, "#5"); } } @@ -293,43 +295,43 @@ public class StringTest : TestCase #if NET_2_0 try { new String ((sbyte*) null, 0, 0); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentNullException ex) { - AssertEquals ("#A2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("value", ex.ParamName, "#A5"); } #else - AssertEquals ("#A", String.Empty, new String ((sbyte*) null, 0, 0)); + Assert.AreEqual (String.Empty, new String ((sbyte*) null, 0, 0), "#A"); #endif #if NET_2_0 try { new String ((sbyte*) null, 0, 1); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentNullException ex) { - AssertEquals ("#B2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("value", ex.ParamName, "#B5"); } #else - AssertEquals ("#B", String.Empty, new String ((sbyte*) null, 0, 1)); + Assert.AreEqual (String.Empty, new String ((sbyte*) null, 0, 1), "#B"); #endif #if NET_2_0 try { new String ((sbyte*) null, 1, 0); - Fail ("#C1"); + Assert.Fail ("#C1"); } catch (ArgumentNullException ex) { - AssertEquals ("#C2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#C3", ex.InnerException); - AssertNotNull ("#C4", ex.Message); - AssertEquals ("#C5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.AreEqual ("value", ex.ParamName, "#C5"); } #else - AssertEquals ("#C", String.Empty, new String ((sbyte*) null, 1, 0)); + Assert.AreEqual (String.Empty, new String ((sbyte*) null, 1, 0), "#C"); #endif } @@ -338,24 +340,24 @@ public class StringTest : TestCase { try { new String ((sbyte*) null, 0, -1, null); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { // Length cannot be less than zero - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "length", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("length", ex.ParamName, "#A5"); } try { new String ((sbyte*) null, 0, -1, Encoding.Default); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { // Non-negative number required - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "length", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("length", ex.ParamName, "#B5"); } } @@ -364,24 +366,24 @@ public class StringTest : TestCase { try { new String ((sbyte*) null, -1, 0, null); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { // StartIndex cannot be less than zero - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#A5"); } try { new String ((sbyte*) null, -1, 0, Encoding.Default); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { // StartIndex cannot be less than zero - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#B5"); } } @@ -390,50 +392,50 @@ public class StringTest : TestCase { try { new String ((sbyte*) (-1), 1, 0, null); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { // Pointer startIndex and length do not refer to a // valid string - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#A5"); } try { new String ((sbyte*) (-1), 1, 1, null); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { // Pointer startIndex and length do not refer to a // valid string - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#B5"); } try { new String ((sbyte*) (-1), 1, 0, Encoding.Default); - Fail ("#C1"); + Assert.Fail ("#C1"); } catch (ArgumentOutOfRangeException ex) { // Pointer startIndex and length do not refer to a // valid string - AssertEquals ("#C2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#C3", ex.InnerException); - AssertNotNull ("#C4", ex.Message); - AssertEquals ("#C5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#C5"); } try { new String ((sbyte*) (-1), 1, 1, Encoding.Default); - Fail ("#D1"); + Assert.Fail ("#D1"); } catch (ArgumentOutOfRangeException ex) { // Pointer startIndex and length do not refer to a // valid string - AssertEquals ("#D2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#D3", ex.InnerException); - AssertNotNull ("#D4", ex.Message); - AssertEquals ("#D5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#D2"); + Assert.IsNull (ex.InnerException, "#D3"); + Assert.IsNotNull (ex.Message, "#D4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#D5"); } } @@ -442,14 +444,14 @@ public class StringTest : TestCase { try { new String ((sbyte*) (-1), 0, 1, null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Pointer startIndex and length do not refer to a // valid string - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "ptr", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("ptr", ex.ParamName, "#5"); } } @@ -471,68 +473,68 @@ public class StringTest : TestCase #if NET_2_0 try { new String ((sbyte*) null, 0, 0, null); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentNullException ex) { - AssertEquals ("#A2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("value", ex.ParamName, "#A5"); } #else - AssertEquals ("#A", String.Empty, new String ((sbyte*) null, 0, 0, null)); + Assert.AreEqual (String.Empty, new String ((sbyte*) null, 0, 0, null), "#A"); #endif #if NET_2_0 try { new String ((sbyte*) null, 0, 1, null); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentNullException ex) { - AssertEquals ("#B2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("value", ex.ParamName, "#B5"); } #else - AssertEquals ("#B", String.Empty, new String ((sbyte*) null, 0, 1, null)); + Assert.AreEqual (String.Empty, new String ((sbyte*) null, 0, 1, null), "#B"); #endif #if NET_2_0 try { new String ((sbyte*) null, 1, 0, null); - Fail ("#C1"); + Assert.Fail ("#C1"); } catch (ArgumentNullException ex) { - AssertEquals ("#C2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#C3", ex.InnerException); - AssertNotNull ("#C4", ex.Message); - AssertEquals ("#C5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.AreEqual ("value", ex.ParamName, "#C5"); } #else - AssertEquals ("#C", String.Empty, new String ((sbyte*) null, 1, 0, null)); + Assert.AreEqual (String.Empty, new String ((sbyte*) null, 1, 0, null), "#C"); #endif - AssertEquals ("#D", String.Empty, new String ((sbyte*) null, 0, 0, Encoding.Default)); + Assert.AreEqual (String.Empty, new String ((sbyte*) null, 0, 0, Encoding.Default), "#D"); try { new String ((sbyte*) null, 0, 1, Encoding.Default); - Fail ("#E1"); + Assert.Fail ("#E1"); #if NET_2_0 } catch (ArgumentOutOfRangeException ex) { // Pointer startIndex and length do not refer to a // valid string - AssertEquals ("#E2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#E3", ex.InnerException); - AssertNotNull ("#E4", ex.Message); - //AssertEquals ("#E5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#E2"); + Assert.IsNull (ex.InnerException, "#E3"); + Assert.IsNotNull (ex.Message, "#E4"); + //Assert.AreEqual ("value", ex.ParamName, "#E5"); } #else } catch (NullReferenceException ex) { - AssertEquals ("#E2", typeof (NullReferenceException), ex.GetType ()); - AssertNull ("#E3", ex.InnerException); - AssertNotNull ("#E4", ex.Message); + Assert.AreEqual (typeof (NullReferenceException), ex.GetType (), "#E2"); + Assert.IsNull (ex.InnerException, "#E3"); + Assert.IsNotNull (ex.Message, "#E4"); } #endif - AssertEquals ("#F", String.Empty, new String ((sbyte*) null, 1, 0, Encoding.Default)); + Assert.AreEqual (String.Empty, new String ((sbyte*) null, 1, 0, Encoding.Default), "#F"); } #endif @@ -541,26 +543,26 @@ public class StringTest : TestCase { string str = "test string"; - AssertEquals("wrong length", 11, str.Length); + Assert.AreEqual (11, str.Length, "wrong length"); } [Test] public void Clone () { string s1 = "oRiGiNal"; - AssertEquals ("#A1", s1, s1.Clone ()); - AssertSame ("#A2", s1, s1.Clone ()); + Assert.AreEqual (s1, s1.Clone (), "#A1"); + Assert.AreSame (s1, s1.Clone (), "#A2"); string s2 = new DateTime (2000, 6, 3).ToString (); - AssertEquals ("#B1", s2, s2.Clone ()); - AssertSame ("#B2", s2, s2.Clone ()); + Assert.AreEqual (s2, s2.Clone (), "#B1"); + Assert.AreSame (s2, s2.Clone (), "#B2"); } [Test] // bug #316666 public void CompareNotWorking () { - AssertEquals ("A03", String.Compare ("A", "a"), 1); - AssertEquals ("A04", String.Compare ("a", "A"), -1); + Assert.AreEqual (String.Compare ("A", "a"), 1, "A03"); + Assert.AreEqual (String.Compare ("a", "A"), -1, "A04"); } [Test] @@ -568,11 +570,10 @@ public class StringTest : TestCase { string needle = "ab"; string haystack = "abbcbacab"; - AssertEquals("basic substring check #9", 0, - String.Compare(needle, 0, haystack, 0, 2, false)); + Assert.AreEqual (0, String.Compare(needle, 0, haystack, 0, 2, false), "basic substring check #9"); for (int i = 1; i <= (haystack.Length - needle.Length); i++) { if (i != 7) { - AssertEquals("loop substring check #8/" + i, -1, String.Compare(needle, 0, haystack, i, 2, false)); + Assert.AreEqual (-1, String.Compare(needle, 0, haystack, i, 2, false), "loop substring check #8/" + i); } } } @@ -585,62 +586,54 @@ public class StringTest : TestCase string greater = "xyz"; string caps = "ABC"; - AssertEquals(0, String.Compare (null, null)); - AssertEquals(1, String.Compare (lesser, null)); + Assert.AreEqual (0, String.Compare (null, null)); + Assert.AreEqual (1, String.Compare (lesser, null)); - Assert (String.Compare (lesser, greater) < 0); - Assert (String.Compare (greater, lesser) > 0); - Assert (String.Compare (lesser, lesser) == 0); - Assert (String.Compare (lesser, medium) < 0); + Assert.IsTrue (String.Compare (lesser, greater) < 0); + Assert.IsTrue (String.Compare (greater, lesser) > 0); + Assert.IsTrue (String.Compare (lesser, lesser) == 0); + Assert.IsTrue (String.Compare (lesser, medium) < 0); - Assert (String.Compare (lesser, caps, true) == 0); - Assert (String.Compare (lesser, caps, false) != 0); - AssertEquals ("A01", String.Compare ("a", "b"), -1); - AssertEquals ("A02", String.Compare ("b", "a"), 1); + Assert.IsTrue (String.Compare (lesser, caps, true) == 0); + Assert.IsTrue (String.Compare (lesser, caps, false) != 0); + Assert.AreEqual (String.Compare ("a", "b"), -1, "A01"); + Assert.AreEqual (String.Compare ("b", "a"), 1, "A02"); // TODO - test with CultureInfo string needle = "ab"; string haystack = "abbcbacab"; - AssertEquals("basic substring check #1", 0, - String.Compare(needle, 0, haystack, 0, 2)); - AssertEquals("basic substring check #2", -1, - String.Compare(needle, 0, haystack, 0, 3)); - AssertEquals("basic substring check #3", 0, - String.Compare("ab", 0, "ab", 0, 2)); - AssertEquals("basic substring check #4", 0, - String.Compare("ab", 0, "ab", 0, 3)); - AssertEquals("basic substring check #5", 0, - String.Compare("abc", 0, "ab", 0, 2)); - AssertEquals("basic substring check #6", 1, - String.Compare("abc", 0, "ab", 0, 5)); - AssertEquals("basic substring check #7", -1, - String.Compare("ab", 0, "abc", 0, 5)); + Assert.AreEqual (0, String.Compare(needle, 0, haystack, 0, 2), "basic substring check #1"); + Assert.AreEqual (-1, String.Compare(needle, 0, haystack, 0, 3), "basic substring check #2"); + Assert.AreEqual (0, String.Compare("ab", 0, "ab", 0, 2), "basic substring check #3"); + Assert.AreEqual (0, String.Compare("ab", 0, "ab", 0, 3), "basic substring check #4"); + Assert.AreEqual (0, String.Compare("abc", 0, "ab", 0, 2), "basic substring check #5"); + Assert.AreEqual (1, String.Compare("abc", 0, "ab", 0, 5), "basic substring check #6"); + Assert.AreEqual (-1, String.Compare("ab", 0, "abc", 0, 5), "basic substring check #7"); for (int i = 1; i <= (haystack.Length - needle.Length); i++) { if (i != 7) { - Assert("loop substring check #1/" + i, String.Compare(needle, 0, haystack, i, 2) != 0); - Assert("loop substring check #2/" + i, String.Compare(needle, 0, haystack, i, 3) != 0); + Assert.IsTrue (String.Compare(needle, 0, haystack, i, 2) != 0, "loop substring check #1/" + i); + Assert.IsTrue (String.Compare(needle, 0, haystack, i, 3) != 0, "loop substring check #2/" + i); } else { - AssertEquals("loop substring check #3/" + i, 0, String.Compare(needle, 0, haystack, i, 2)); - AssertEquals("loop substring check #4/" + i, 0, String.Compare(needle, 0, haystack, i, 3)); + Assert.AreEqual (0, String.Compare(needle, 0, haystack, i, 2), "loop substring check #3/" + i); + Assert.AreEqual (0, String.Compare(needle, 0, haystack, i, 3), "loop substring check #4/" + i); } } needle = "AB"; - AssertEquals("basic substring check #8", 0, - String.Compare(needle, 0, haystack, 0, 2, true)); + Assert.AreEqual (0, String.Compare(needle, 0, haystack, 0, 2, true), "basic substring check #8"); for (int i = 1; i <= (haystack.Length - needle.Length); i++) { if (i != 7) { - Assert("loop substring check #5/" + i, String.Compare(needle, 0, haystack, i, 2, true) != 0); - Assert("loop substring check #6/" + i, String.Compare(needle, 0, haystack, i, 2, false) != 0); + Assert.IsTrue (String.Compare(needle, 0, haystack, i, 2, true) != 0, "loop substring check #5/" + i); + Assert.IsTrue (String.Compare(needle, 0, haystack, i, 2, false) != 0, "loop substring check #6/" + i); } else { - AssertEquals("loop substring check #7/" + i, 0, String.Compare(needle, 0, haystack, i, 2, true)); + Assert.AreEqual (0, String.Compare(needle, 0, haystack, i, 2, true), "loop substring check #7/" + i); } } - AssertEquals ("Compare with 0 length", 0, String.Compare (needle, 0, haystack, 0, 0)); + Assert.AreEqual (0, String.Compare (needle, 0, haystack, 0, 0), "Compare with 0 length"); // TODO - extended format call with CultureInfo } @@ -652,27 +645,25 @@ public class StringTest : TestCase string medium = "abcd"; string greater = "xyz"; - AssertEquals(0, String.CompareOrdinal (null, null)); - AssertEquals(1, String.CompareOrdinal (lesser, null)); + Assert.AreEqual (0, String.CompareOrdinal (null, null)); + Assert.AreEqual (1, String.CompareOrdinal (lesser, null)); - Assert ("#1", String.CompareOrdinal (lesser, greater) < 0); - Assert ("#2", String.CompareOrdinal (greater, lesser) > 0); - Assert ("#3", String.CompareOrdinal (lesser, lesser) == 0); - Assert ("#4", String.CompareOrdinal (lesser, medium) < 0); + Assert.IsTrue (String.CompareOrdinal (lesser, greater) < 0, "#1"); + Assert.IsTrue (String.CompareOrdinal (greater, lesser) > 0, "#2"); + Assert.IsTrue (String.CompareOrdinal (lesser, lesser) == 0, "#3"); + Assert.IsTrue (String.CompareOrdinal (lesser, medium) < 0, "#4"); string needle = "ab"; string haystack = "abbcbacab"; - AssertEquals("basic substring check", 0, - String.CompareOrdinal(needle, 0, haystack, 0, 2)); - AssertEquals("basic substring miss", -1, - String.CompareOrdinal(needle, 0, haystack, 0, 3)); + Assert.AreEqual (0, String.CompareOrdinal(needle, 0, haystack, 0, 2), "basic substring check"); + Assert.AreEqual (-1, String.CompareOrdinal(needle, 0, haystack, 0, 3), "basic substring miss"); for (int i = 1; i <= (haystack.Length - needle.Length); i++) { if (i != 7) { - Assert("loop substring check " + i, String.CompareOrdinal(needle, 0, haystack, i, 2) != 0); - Assert("loop substring check " + i, String.CompareOrdinal(needle, 0, haystack, i, 3) != 0); + Assert.IsTrue (String.CompareOrdinal(needle, 0, haystack, i, 2) != 0, "loop substring check " + i); + Assert.IsTrue (String.CompareOrdinal(needle, 0, haystack, i, 3) != 0, "loop substring check " + i); } else { - AssertEquals("loop substring check " + i, 0, String.CompareOrdinal(needle, 0, haystack, i, 2)); - AssertEquals("loop substring check " + i, 0, String.CompareOrdinal(needle, 0, haystack, i, 3)); + Assert.AreEqual (0, String.CompareOrdinal(needle, 0, haystack, i, 2), "loop substring check " + i); + Assert.AreEqual (0, String.CompareOrdinal(needle, 0, haystack, i, 3), "loop substring check " + i); } } } @@ -684,9 +675,9 @@ public class StringTest : TestCase string greater = "xyz"; string lesser = "abc"; - Assert (lower.CompareTo (greater) < 0); - Assert (lower.CompareTo (lower) == 0); - Assert (greater.CompareTo (lesser) > 0); + Assert.IsTrue (lower.CompareTo (greater) < 0); + Assert.IsTrue (lower.CompareTo (lower) == 0); + Assert.IsTrue (greater.CompareTo (lesser) > 0); } class WeirdToString @@ -704,22 +695,22 @@ public class StringTest : TestCase string string2 = "string2"; string concat = "string1string2"; - Assert (String.Concat (string1, string2) == concat); + Assert.IsTrue (String.Concat (string1, string2) == concat); - AssertEquals (string1, String.Concat (string1, null)); - AssertEquals (string1, String.Concat (null, string1)); - AssertEquals (string.Empty, String.Concat (null, null)); + Assert.AreEqual (string1, String.Concat (string1, null)); + Assert.AreEqual (string1, String.Concat (null, string1)); + Assert.AreEqual (string.Empty, String.Concat (null, null)); WeirdToString wts = new WeirdToString (); - AssertEquals (string1, String.Concat (string1, wts)); - AssertEquals (string1, String.Concat (wts, string1)); - AssertEquals (string.Empty, String.Concat (wts, wts)); + Assert.AreEqual (string1, String.Concat (string1, wts)); + Assert.AreEqual (string1, String.Concat (wts, string1)); + Assert.AreEqual (string.Empty, String.Concat (wts, wts)); string [] allstr = new string []{ string1, null, string2, concat }; object [] allobj = new object []{ string1, null, string2, concat }; string astr = String.Concat (allstr); - AssertEquals ("string1string2string1string2", astr); + Assert.AreEqual ("string1string2string1string2", astr); string ostr = String.Concat (allobj); - AssertEquals (astr, ostr); + Assert.AreEqual (astr, ostr); } [Test] @@ -727,8 +718,8 @@ public class StringTest : TestCase { string s1 = "original"; string s2 = String.Copy(s1); - AssertEquals("#1", s1, s2); - Assert ("#2", !object.ReferenceEquals (s1, s2)); + Assert.AreEqual (s1, s2, "#1"); + Assert.IsTrue (!object.ReferenceEquals (s1, s2), "#2"); } [Test] @@ -736,12 +727,12 @@ public class StringTest : TestCase { try { String.Copy ((string) null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "str", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("str", ex.ParamName, "#5"); } } @@ -751,12 +742,12 @@ public class StringTest : TestCase string s1 = "original"; char[] c1 = new char[s1.Length]; string s2 = new String(c1); - Assert("#1", !s1.Equals(s2)); + Assert.IsTrue (!s1.Equals(s2), "#1"); for (int i = 0; i < s1.Length; i++) { s1.CopyTo(i, c1, i, 1); } s2 = new String(c1); - AssertEquals("#2", s1, s2); + Assert.AreEqual (s1, s2, "#2"); } [Test] @@ -765,13 +756,13 @@ public class StringTest : TestCase char [] dest = new char [4]; try { "Mono".CopyTo (0, dest, 0, -1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Count cannot be less than zero - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -781,14 +772,14 @@ public class StringTest : TestCase char [] dest = new char [4]; try { "Mono".CopyTo (0, dest, 0, Int32.MaxValue); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index and count must refer to a location within the // string - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "sourceIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("sourceIndex", ex.ParamName, "#5"); } } @@ -799,12 +790,12 @@ public class StringTest : TestCase try { s.CopyTo (0, (char []) null, 0, s.Length); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "destination", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("destination", ex.ParamName, "#5"); } } @@ -814,14 +805,14 @@ public class StringTest : TestCase char [] dest = new char [4]; try { "Mono".CopyTo (0, dest, -1, 4); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index and count must refer to a location within the // string - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "destinationIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("destinationIndex", ex.ParamName, "#5"); } } @@ -831,14 +822,14 @@ public class StringTest : TestCase char [] dest = new char [4]; try { "Mono".CopyTo (0, dest, Int32.MaxValue, 4); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index and count must refer to a location within the // string - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "destinationIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("destinationIndex", ex.ParamName, "#5"); } } @@ -848,14 +839,14 @@ public class StringTest : TestCase char [] dest = new char [4]; try { "Mono".CopyTo (-1, dest, 0, 4); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "sourceIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("sourceIndex", ex.ParamName, "#5"); } } @@ -865,14 +856,14 @@ public class StringTest : TestCase char[] dest = new char [4]; try { "Mono".CopyTo (Int32.MaxValue, dest, 0, 4); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index and count must refer to a location within the // string - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "sourceIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("sourceIndex", ex.ParamName, "#5"); } } @@ -884,34 +875,34 @@ public class StringTest : TestCase Thread.CurrentThread.CurrentCulture = new CultureInfo ("tr-TR"); s = "AbC"; - Assert ("#A1", s.EndsWith ("bC")); - Assert ("#A1", !s.EndsWith ("bc")); - Assert ("#A2", !s.EndsWith ("dc")); - Assert ("#A3", !s.EndsWith ("LAbC")); - Assert ("#A4", s.EndsWith (string.Empty)); - Assert ("#A5", !s.EndsWith ("Ab")); - Assert ("#A6", !s.EndsWith ("Abc")); - Assert ("#A7", s.EndsWith ("AbC")); + Assert.IsTrue (s.EndsWith ("bC"), "#A1"); + Assert.IsTrue (!s.EndsWith ("bc"), "#A1"); + Assert.IsTrue (!s.EndsWith ("dc"), "#A2"); + Assert.IsTrue (!s.EndsWith ("LAbC"), "#A3"); + Assert.IsTrue (s.EndsWith (string.Empty), "#A4"); + Assert.IsTrue (!s.EndsWith ("Ab"), "#A5"); + Assert.IsTrue (!s.EndsWith ("Abc"), "#A6"); + Assert.IsTrue (s.EndsWith ("AbC"), "#A7"); s = "Tai"; - Assert ("#B1", s.EndsWith ("ai")); - Assert ("#B2", !s.EndsWith ("AI")); - Assert ("#B3", !s.EndsWith ("LTai")); - Assert ("#B4", s.EndsWith (string.Empty)); - Assert ("#B5", !s.EndsWith ("Ta")); - Assert ("#B6", !s.EndsWith ("tai")); - Assert ("#B7", s.EndsWith ("Tai")); + Assert.IsTrue (s.EndsWith ("ai"), "#B1"); + Assert.IsTrue (!s.EndsWith ("AI"), "#B2"); + Assert.IsTrue (!s.EndsWith ("LTai"), "#B3"); + Assert.IsTrue (s.EndsWith (string.Empty), "#B4"); + Assert.IsTrue (!s.EndsWith ("Ta"), "#B5"); + Assert.IsTrue (!s.EndsWith ("tai"), "#B6"); + Assert.IsTrue (s.EndsWith ("Tai"), "#B7"); Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US"); - Assert ("#C1", s.EndsWith ("ai")); - Assert ("#C2", !s.EndsWith ("AI")); - Assert ("#C3", !s.EndsWith ("LTai")); - Assert ("#C4", s.EndsWith (string.Empty)); - Assert ("#C5", !s.EndsWith ("Ta")); - Assert ("#C6", !s.EndsWith ("tai")); - Assert ("#C7", s.EndsWith ("Tai")); + Assert.IsTrue (s.EndsWith ("ai"), "#C1"); + Assert.IsTrue (!s.EndsWith ("AI"), "#C2"); + Assert.IsTrue (!s.EndsWith ("LTai"), "#C3"); + Assert.IsTrue (s.EndsWith (string.Empty), "#C4"); + Assert.IsTrue (!s.EndsWith ("Ta"), "#C5"); + Assert.IsTrue (!s.EndsWith ("tai"), "#C6"); + Assert.IsTrue (s.EndsWith ("Tai"), "#C7"); } [Test] // EndsWith (String) @@ -919,12 +910,12 @@ public class StringTest : TestCase { try { "ABC".EndsWith ((string) null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("value", ex.ParamName, "#5"); } } @@ -934,14 +925,14 @@ public class StringTest : TestCase { try { "ABC".EndsWith ("C", (StringComparison) 80); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // The string comparison type passed in is currently // not supported - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "comparisonType", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("comparisonType", ex.ParamName, "#5"); } } @@ -950,12 +941,12 @@ public class StringTest : TestCase { try { "ABC".EndsWith ((string) null, StringComparison.CurrentCulture); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("value", ex.ParamName, "#5"); } } @@ -971,85 +962,85 @@ public class StringTest : TestCase culture = null; ignorecase = false; - Assert ("#A1", !s.EndsWith ("bc", ignorecase, culture)); - Assert ("#A2", !s.EndsWith ("dc", ignorecase, culture)); - Assert ("#A3", !s.EndsWith ("LAbC", ignorecase, culture)); - Assert ("#A4", s.EndsWith (string.Empty, ignorecase, culture)); - Assert ("#A5", !s.EndsWith ("Ab", ignorecase, culture)); - Assert ("#A6", !s.EndsWith ("Abc", ignorecase, culture)); - Assert ("#A7", s.EndsWith ("AbC", ignorecase, culture)); + Assert.IsTrue (!s.EndsWith ("bc", ignorecase, culture), "#A1"); + Assert.IsTrue (!s.EndsWith ("dc", ignorecase, culture), "#A2"); + Assert.IsTrue (!s.EndsWith ("LAbC", ignorecase, culture), "#A3"); + Assert.IsTrue (s.EndsWith (string.Empty, ignorecase, culture), "#A4"); + Assert.IsTrue (!s.EndsWith ("Ab", ignorecase, culture), "#A5"); + Assert.IsTrue (!s.EndsWith ("Abc", ignorecase, culture), "#A6"); + Assert.IsTrue (s.EndsWith ("AbC", ignorecase, culture), "#A7"); ignorecase = true; - Assert ("#B1", s.EndsWith ("bc", ignorecase, culture)); - Assert ("#B2", !s.EndsWith ("dc", ignorecase, culture)); - Assert ("#B3", !s.EndsWith ("LAbC", ignorecase, culture)); - Assert ("#B4", s.EndsWith (string.Empty, ignorecase, culture)); - Assert ("#B5", !s.EndsWith ("Ab", ignorecase, culture)); - Assert ("#B6", s.EndsWith ("Abc", ignorecase, culture)); - Assert ("#B7", s.EndsWith ("AbC", ignorecase, culture)); + Assert.IsTrue (s.EndsWith ("bc", ignorecase, culture), "#B1"); + Assert.IsTrue (!s.EndsWith ("dc", ignorecase, culture), "#B2"); + Assert.IsTrue (!s.EndsWith ("LAbC", ignorecase, culture), "#B3"); + Assert.IsTrue (s.EndsWith (string.Empty, ignorecase, culture), "#B4"); + Assert.IsTrue (!s.EndsWith ("Ab", ignorecase, culture), "#B5"); + Assert.IsTrue (s.EndsWith ("Abc", ignorecase, culture), "#B6"); + Assert.IsTrue (s.EndsWith ("AbC", ignorecase, culture), "#B7"); s = "Tai"; culture = null; ignorecase = false; - Assert ("#C1", s.EndsWith ("ai", ignorecase, culture)); - Assert ("#C2", !s.EndsWith ("AI", ignorecase, culture)); - Assert ("#C3", !s.EndsWith ("LTai", ignorecase, culture)); - Assert ("#C4", s.EndsWith (string.Empty, ignorecase, culture)); - Assert ("#C5", !s.EndsWith ("Ta", ignorecase, culture)); - Assert ("#C6", !s.EndsWith ("tai", ignorecase, culture)); - Assert ("#C7", s.EndsWith ("Tai", ignorecase, culture)); + Assert.IsTrue (s.EndsWith ("ai", ignorecase, culture), "#C1"); + Assert.IsTrue (!s.EndsWith ("AI", ignorecase, culture), "#C2"); + Assert.IsTrue (!s.EndsWith ("LTai", ignorecase, culture), "#C3"); + Assert.IsTrue (s.EndsWith (string.Empty, ignorecase, culture), "#C4"); + Assert.IsTrue (!s.EndsWith ("Ta", ignorecase, culture), "#C5"); + Assert.IsTrue (!s.EndsWith ("tai", ignorecase, culture), "#C6"); + Assert.IsTrue (s.EndsWith ("Tai", ignorecase, culture), "#C7"); ignorecase = true; - Assert ("#D1", s.EndsWith ("ai", ignorecase, culture)); - Assert ("#D2", !s.EndsWith ("AI", ignorecase, culture)); - Assert ("#D3", !s.EndsWith ("LTai", ignorecase, culture)); - Assert ("#D4", s.EndsWith (string.Empty, ignorecase, culture)); - Assert ("#D5", !s.EndsWith ("Ta", ignorecase, culture)); - Assert ("#D6", s.EndsWith ("tai", ignorecase, culture)); - Assert ("#D7", s.EndsWith ("Tai", ignorecase, culture)); + Assert.IsTrue (s.EndsWith ("ai", ignorecase, culture), "#D1"); + Assert.IsTrue (!s.EndsWith ("AI", ignorecase, culture), "#D2"); + Assert.IsTrue (!s.EndsWith ("LTai", ignorecase, culture), "#D3"); + Assert.IsTrue (s.EndsWith (string.Empty, ignorecase, culture), "#D4"); + Assert.IsTrue (!s.EndsWith ("Ta", ignorecase, culture), "#D5"); + Assert.IsTrue (s.EndsWith ("tai", ignorecase, culture), "#D6"); + Assert.IsTrue (s.EndsWith ("Tai", ignorecase, culture), "#D7"); s = "Tai"; culture = new CultureInfo ("en-US"); ignorecase = false; - Assert ("#E1", s.EndsWith ("ai", ignorecase, culture)); - Assert ("#E2", !s.EndsWith ("AI", ignorecase, culture)); - Assert ("#E3", !s.EndsWith ("LTai", ignorecase, culture)); - Assert ("#E4", s.EndsWith (string.Empty, ignorecase, culture)); - Assert ("#E5", !s.EndsWith ("Ta", ignorecase, culture)); - Assert ("#E6", !s.EndsWith ("tai", ignorecase, culture)); - Assert ("#E7", s.EndsWith ("Tai", ignorecase, culture)); + Assert.IsTrue (s.EndsWith ("ai", ignorecase, culture), "#E1"); + Assert.IsTrue (!s.EndsWith ("AI", ignorecase, culture), "#E2"); + Assert.IsTrue (!s.EndsWith ("LTai", ignorecase, culture), "#E3"); + Assert.IsTrue (s.EndsWith (string.Empty, ignorecase, culture), "#E4"); + Assert.IsTrue (!s.EndsWith ("Ta", ignorecase, culture), "#E5"); + Assert.IsTrue (!s.EndsWith ("tai", ignorecase, culture), "#E6"); + Assert.IsTrue (s.EndsWith ("Tai", ignorecase, culture), "#E7"); ignorecase = true; - Assert ("#F1", s.EndsWith ("ai", ignorecase, culture)); - Assert ("#F2", s.EndsWith ("AI", ignorecase, culture)); - Assert ("#F3", !s.EndsWith ("LTai", ignorecase, culture)); - Assert ("#F4", s.EndsWith (string.Empty, ignorecase, culture)); - Assert ("#F5", !s.EndsWith ("Ta", ignorecase, culture)); - Assert ("#F6", s.EndsWith ("tai", ignorecase, culture)); - Assert ("#F7", s.EndsWith ("Tai", ignorecase, culture)); + Assert.IsTrue (s.EndsWith ("ai", ignorecase, culture), "#F1"); + Assert.IsTrue (s.EndsWith ("AI", ignorecase, culture), "#F2"); + Assert.IsTrue (!s.EndsWith ("LTai", ignorecase, culture), "#F3"); + Assert.IsTrue (s.EndsWith (string.Empty, ignorecase, culture), "#F4"); + Assert.IsTrue (!s.EndsWith ("Ta", ignorecase, culture), "#F5"); + Assert.IsTrue (s.EndsWith ("tai", ignorecase, culture), "#F6"); + Assert.IsTrue (s.EndsWith ("Tai", ignorecase, culture), "#F7"); Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US"); culture = null; ignorecase = false; - Assert ("#G1", s.EndsWith ("ai", ignorecase, culture)); - Assert ("#G2", !s.EndsWith ("AI", ignorecase, culture)); - Assert ("#G3", !s.EndsWith ("LTai", ignorecase, culture)); - Assert ("#G4", s.EndsWith (string.Empty, ignorecase, culture)); - Assert ("#G5", !s.EndsWith ("Ta", ignorecase, culture)); - Assert ("#G6", !s.EndsWith ("tai", ignorecase, culture)); - Assert ("#G7", s.EndsWith ("Tai", ignorecase, culture)); + Assert.IsTrue (s.EndsWith ("ai", ignorecase, culture), "#G1"); + Assert.IsTrue (!s.EndsWith ("AI", ignorecase, culture), "#G2"); + Assert.IsTrue (!s.EndsWith ("LTai", ignorecase, culture), "#G3"); + Assert.IsTrue (s.EndsWith (string.Empty, ignorecase, culture), "#G4"); + Assert.IsTrue (!s.EndsWith ("Ta", ignorecase, culture), "#G5"); + Assert.IsTrue (!s.EndsWith ("tai", ignorecase, culture), "#G6"); + Assert.IsTrue (s.EndsWith ("Tai", ignorecase, culture), "#G7"); ignorecase = true; - Assert ("#H1", s.EndsWith ("ai", ignorecase, culture)); - Assert ("#H2", s.EndsWith ("AI", ignorecase, culture)); - Assert ("#H3", !s.EndsWith ("LTai", ignorecase, culture)); - Assert ("#H4", s.EndsWith (string.Empty, ignorecase, culture)); - Assert ("#H5", !s.EndsWith ("Ta", ignorecase, culture)); - Assert ("#H6", s.EndsWith ("tai", ignorecase, culture)); - Assert ("#H7", s.EndsWith ("Tai", ignorecase, culture)); + Assert.IsTrue (s.EndsWith ("ai", ignorecase, culture), "#H1"); + Assert.IsTrue (s.EndsWith ("AI", ignorecase, culture), "#H2"); + Assert.IsTrue (!s.EndsWith ("LTai", ignorecase, culture), "#H3"); + Assert.IsTrue (s.EndsWith (string.Empty, ignorecase, culture), "#H4"); + Assert.IsTrue (!s.EndsWith ("Ta", ignorecase, culture), "#H5"); + Assert.IsTrue (s.EndsWith ("tai", ignorecase, culture), "#H6"); + Assert.IsTrue (s.EndsWith ("Tai", ignorecase, culture), "#H7"); } [Test] // EndsWith (String, Boolean, CultureInfo) @@ -1057,12 +1048,12 @@ public class StringTest : TestCase { try { "ABC".EndsWith ((string) null, true, null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("value", ex.ParamName, "#5"); } } #endif @@ -1076,34 +1067,34 @@ public class StringTest : TestCase string no = "copy"; string s1s1 = s1 + s1; - Assert("No match for null", !s1.Equals (null)); - Assert("Should match object", s1.Equals (y)); - Assert("Should match", s1.Equals (yes)); - Assert("Shouldn't match", !s1.Equals (no)); + Assert.IsTrue (!s1.Equals (null), "No match for null"); + Assert.IsTrue (s1.Equals (y), "Should match object"); + Assert.IsTrue (s1.Equals (yes), "Should match"); + Assert.IsTrue (!s1.Equals (no), "Shouldn't match"); - Assert("Static nulls should match", String.Equals (null, null)); - Assert("Should match", String.Equals (s1, yes)); - Assert("Shouldn't match", !String.Equals (s1, no)); + Assert.IsTrue (String.Equals (null, null), "Static nulls should match"); + Assert.IsTrue (String.Equals (s1, yes), "Should match"); + Assert.IsTrue (!String.Equals (s1, no), "Shouldn't match"); - AssertEquals ("Equals (object)", false, s1s1.Equals (y)); + Assert.AreEqual (false, s1s1.Equals (y), "Equals (object)"); } [Test] public void TestFormat () { - AssertEquals ("Empty format string.", string.Empty, String.Format (string.Empty, 0)); - AssertEquals ("Single argument.", "100", String.Format ("{0}", 100)); - AssertEquals ("Single argument, right justified.", "X 37X", String.Format ("X{0,5}X", 37)); - AssertEquals ("Single argument, left justified.", "X37 X", String.Format ("X{0,-5}X", 37)); - AssertEquals ("Whitespace in specifier", " 7d", String.Format ("{0, 4:x}", 125)); - AssertEquals ("Two arguments.", "The 3 wise men.", String.Format ("The {0} wise {1}.", 3, "men")); - AssertEquals ("Three arguments.", "do re me fa so.", String.Format ("{0} re {1} fa {2}.", "do", "me", "so")); - AssertEquals ("Formatted argument.", "###00c0ffee#", String.Format ("###{0:x8}#", 0xc0ffee)); - AssertEquals ("Formatted argument, right justified.", "# 033#", String.Format ("#{0,5:x3}#", 0x33)); - AssertEquals ("Formatted argument, left justified.", "#033 #", String.Format ("#{0,-5:x3}#", 0x33)); - AssertEquals ("Escaped bracket", "typedef struct _MonoObject { ... } MonoObject;", String.Format ("typedef struct _{0} {{ ... }} MonoObject;", "MonoObject")); - AssertEquals ("With Slash", "Could not find file \"a/b\"", String.Format ("Could not find file \"{0}\"", "a/b")); - AssertEquals ("With BackSlash", "Could not find file \"a\\b\"", String.Format ("Could not find file \"{0}\"", "a\\b")); + Assert.AreEqual (string.Empty, String.Format (string.Empty, 0), "Empty format string."); + Assert.AreEqual ("100", String.Format ("{0}", 100), "Single argument."); + Assert.AreEqual ("X 37X", String.Format ("X{0,5}X", 37), "Single argument, right justified."); + Assert.AreEqual ("X37 X", String.Format ("X{0,-5}X", 37), "Single argument, left justified."); + Assert.AreEqual (" 7d", String.Format ("{0, 4:x}", 125), "Whitespace in specifier"); + Assert.AreEqual ("The 3 wise men.", String.Format ("The {0} wise {1}.", 3, "men"), "Two arguments."); + Assert.AreEqual ("do re me fa so.", String.Format ("{0} re {1} fa {2}.", "do", "me", "so"), "Three arguments."); + Assert.AreEqual ("###00c0ffee#", String.Format ("###{0:x8}#", 0xc0ffee), "Formatted argument."); + Assert.AreEqual ("# 033#", String.Format ("#{0,5:x3}#", 0x33), "Formatted argument, right justified."); + Assert.AreEqual ("#033 #", String.Format ("#{0,-5:x3}#", 0x33), "Formatted argument, left justified."); + Assert.AreEqual ("typedef struct _MonoObject { ... } MonoObject;", String.Format ("typedef struct _{0} {{ ... }} MonoObject;", "MonoObject"), "Escaped bracket"); + Assert.AreEqual ("Could not find file \"a/b\"", String.Format ("Could not find file \"{0}\"", "a/b"), "With Slash"); + Assert.AreEqual ("Could not find file \"a\\b\"", String.Format ("Could not find file \"{0}\"", "a\\b"), "With BackSlash"); } [Test] // Format (String, Object) @@ -1111,12 +1102,12 @@ public class StringTest : TestCase { try { String.Format (null, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "format", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("format", ex.ParamName, "#5"); } } @@ -1125,12 +1116,12 @@ public class StringTest : TestCase { try { String.Format (null, new object [] { 2 }); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "format", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("format", ex.ParamName, "#5"); } } @@ -1139,12 +1130,12 @@ public class StringTest : TestCase { try { String.Format ("text", (object []) null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "args", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("args", ex.ParamName, "#5"); } } @@ -1154,12 +1145,12 @@ public class StringTest : TestCase try { String.Format (CultureInfo.InvariantCulture, null, new object [] { 3 }); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "format", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("format", ex.ParamName, "#5"); } } @@ -1169,12 +1160,12 @@ public class StringTest : TestCase try { String.Format (CultureInfo.InvariantCulture, "text", (object []) null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "args", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("args", ex.ParamName, "#5"); } } @@ -1183,12 +1174,12 @@ public class StringTest : TestCase { try { String.Format (null, 4, 5); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "format", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("format", ex.ParamName, "#5"); } } @@ -1197,12 +1188,12 @@ public class StringTest : TestCase { try { String.Format (null, 4, 5, 6); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "format", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("format", ex.ParamName, "#5"); } } @@ -1212,16 +1203,16 @@ public class StringTest : TestCase string s1 = "original"; char[] c1 = new char[s1.Length]; string s2 = new String(c1); - Assert("pre-enumerated string should not match", !s1.Equals(s2)); + Assert.IsTrue (!s1.Equals(s2), "pre-enumerated string should not match"); CharEnumerator en = s1.GetEnumerator(); - AssertNotNull("null enumerator", en); + Assert.IsNotNull (en, "null enumerator"); for (int i = 0; i < s1.Length; i++) { en.MoveNext(); c1[i] = en.Current; } s2 = new String(c1); - AssertEquals("enumerated string should match", s1, s2); + Assert.AreEqual (s1, s2, "enumerated string should match"); } [Test] @@ -1229,22 +1220,21 @@ public class StringTest : TestCase { string s1 = "original"; // TODO - weak test, currently. Just verifies determinicity. - AssertEquals("same string, same hash code", - s1.GetHashCode(), s1.GetHashCode()); + Assert.AreEqual (s1.GetHashCode(), s1.GetHashCode(), "same string, same hash code"); } [Test] public void TestGetType () { string s1 = "original"; - AssertEquals("String type", "System.String", s1.GetType().ToString()); + Assert.AreEqual ("System.String", s1.GetType().ToString(), "String type"); } [Test] public void TestGetTypeCode () { string s1 = "original"; - Assert(s1.GetTypeCode().Equals(TypeCode.String)); + Assert.IsTrue (s1.GetTypeCode().Equals(TypeCode.String)); } [Test] @@ -1254,83 +1244,69 @@ public class StringTest : TestCase try { s1.IndexOf ('q', s1.Length + 1); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#A5"); } try { s1.IndexOf ('q', s1.Length + 1, 1); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#B5"); } try { s1.IndexOf ("huh", s1.Length + 1); - Fail ("#C1"); + Assert.Fail ("#C1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#C2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#C3", ex.InnerException); - AssertNotNull ("#C4", ex.Message); - AssertEquals ("#C5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#C5"); } - AssertEquals("basic char index", 1, s1.IndexOf('r')); - AssertEquals("basic char index 2", 2, s1.IndexOf('i')); - AssertEquals("basic char index - no", -1, s1.IndexOf('q')); + Assert.AreEqual (1, s1.IndexOf('r'), "basic char index"); + Assert.AreEqual (2, s1.IndexOf('i'), "basic char index 2"); + Assert.AreEqual (-1, s1.IndexOf('q'), "basic char index - no"); - AssertEquals("basic string index", 1, s1.IndexOf("rig")); - AssertEquals("basic string index 2", 2, s1.IndexOf("i")); - AssertEquals("basic string index 3", 0, string.Empty.IndexOf(string.Empty)); - AssertEquals("basic string index 4", 0, "ABC".IndexOf(string.Empty)); - AssertEquals("basic string index - no", -1, s1.IndexOf("rag")); - - AssertEquals("stepped char index", 1, s1.IndexOf('r', 1)); - AssertEquals("stepped char index 2", 2, s1.IndexOf('i', 1)); - AssertEquals("stepped char index 3", 4, s1.IndexOf('i', 3)); - AssertEquals("stepped char index 4", -1, s1.IndexOf('i', 5)); - AssertEquals("stepped char index 5", -1, s1.IndexOf('l', s1.Length)); - - AssertEquals("stepped limited char index", - 1, s1.IndexOf('r', 1, 1)); - AssertEquals("stepped limited char index", - -1, s1.IndexOf('r', 0, 1)); - AssertEquals("stepped limited char index", - 2, s1.IndexOf('i', 1, 3)); - AssertEquals("stepped limited char index", - 4, s1.IndexOf('i', 3, 3)); - AssertEquals("stepped limited char index", - -1, s1.IndexOf('i', 5, 3)); + Assert.AreEqual (1, s1.IndexOf("rig"), "basic string index"); + Assert.AreEqual (2, s1.IndexOf("i"), "basic string index 2"); + Assert.AreEqual (0, string.Empty.IndexOf(string.Empty), "basic string index 3"); + Assert.AreEqual (0, "ABC".IndexOf(string.Empty), "basic string index 4"); + Assert.AreEqual (-1, s1.IndexOf("rag"), "basic string index - no"); + + Assert.AreEqual (1, s1.IndexOf('r', 1), "stepped char index"); + Assert.AreEqual (2, s1.IndexOf('i', 1), "stepped char index 2"); + Assert.AreEqual (4, s1.IndexOf('i', 3), "stepped char index 3"); + Assert.AreEqual (-1, s1.IndexOf('i', 5), "stepped char index 4"); + Assert.AreEqual (-1, s1.IndexOf('l', s1.Length), "stepped char index 5"); + + Assert.AreEqual (1, s1.IndexOf('r', 1, 1), "stepped limited char index"); + Assert.AreEqual (-1, s1.IndexOf('r', 0, 1), "stepped limited char index"); + Assert.AreEqual (2, s1.IndexOf('i', 1, 3), "stepped limited char index"); + Assert.AreEqual (4, s1.IndexOf('i', 3, 3), "stepped limited char index"); + Assert.AreEqual (-1, s1.IndexOf('i', 5, 3), "stepped limited char index"); s1 = "original original"; - AssertEquals("stepped string index 1", - 0, s1.IndexOf("original", 0)); - AssertEquals("stepped string index 2", - 9, s1.IndexOf("original", 1)); - AssertEquals("stepped string index 3", - -1, s1.IndexOf("original", 10)); - AssertEquals("stepped string index 4", - 3, s1.IndexOf(string.Empty, 3)); - AssertEquals("stepped limited string index 1", - 1, s1.IndexOf("rig", 0, 5)); - AssertEquals("stepped limited string index 2", - -1, s1.IndexOf("rig", 0, 3)); - AssertEquals("stepped limited string index 3", - 10, s1.IndexOf("rig", 2, 15)); - AssertEquals("stepped limited string index 4", - -1, s1.IndexOf("rig", 2, 3)); - AssertEquals("stepped limited string index 5", - 2, s1.IndexOf(string.Empty, 2, 3)); + Assert.AreEqual (0, s1.IndexOf("original", 0), "stepped string index 1"); + Assert.AreEqual (9, s1.IndexOf("original", 1), "stepped string index 2"); + Assert.AreEqual (-1, s1.IndexOf("original", 10), "stepped string index 3"); + Assert.AreEqual (3, s1.IndexOf(string.Empty, 3), "stepped string index 4"); + Assert.AreEqual (1, s1.IndexOf("rig", 0, 5), "stepped limited string index 1"); + Assert.AreEqual (-1, s1.IndexOf("rig", 0, 3), "stepped limited string index 2"); + Assert.AreEqual (10, s1.IndexOf("rig", 2, 15), "stepped limited string index 3"); + Assert.AreEqual (-1, s1.IndexOf("rig", 2, 3), "stepped limited string index 4"); + Assert.AreEqual (2, s1.IndexOf(string.Empty, 2, 3), "stepped limited string index 5"); string s2 = "QBitArray::bitarr_data"; - AssertEquals ("bug #62160", 9, s2.IndexOf ("::")); + Assert.AreEqual (9, s2.IndexOf ("::"), "bug #62160"); } [Test] // IndexOf (String) @@ -1338,17 +1314,17 @@ public class StringTest : TestCase { try { "Mono".IndexOf ((string) null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); #if NET_2_0 - AssertEquals ("#5", "value", ex.ParamName); + Assert.AreEqual ("value", ex.ParamName, "#5"); #else //Fixme: Does it really make sense to check for obsolete // parameter names. Then case this in string. - //AssertEquals ("#5", "string2", ex.ParamName); + //Assert.AreEqual ("string2", ex.ParamName, "#5"); #endif } } @@ -1360,25 +1336,25 @@ public class StringTest : TestCase Thread.CurrentThread.CurrentCulture = new CultureInfo ("tr-TR"); - AssertEquals ("#A1", -1, s.IndexOf ('a', s.Length)); - AssertEquals ("#A2", -1, s.IndexOf ('6', s.Length)); - AssertEquals ("#A3", -1, s.IndexOf ('t', s.Length)); - AssertEquals ("#A4", -1, s.IndexOf ('T', s.Length)); - AssertEquals ("#A5", -1, s.IndexOf ('i', s.Length)); - AssertEquals ("#A6", -1, s.IndexOf ('I', s.Length)); - AssertEquals ("#A7", -1, s.IndexOf ('q', s.Length)); - AssertEquals ("#A8", -1, s.IndexOf ('3', s.Length)); + Assert.AreEqual (-1, s.IndexOf ('a', s.Length), "#A1"); + Assert.AreEqual (-1, s.IndexOf ('6', s.Length), "#A2"); + Assert.AreEqual (-1, s.IndexOf ('t', s.Length), "#A3"); + Assert.AreEqual (-1, s.IndexOf ('T', s.Length), "#A4"); + Assert.AreEqual (-1, s.IndexOf ('i', s.Length), "#A5"); + Assert.AreEqual (-1, s.IndexOf ('I', s.Length), "#A6"); + Assert.AreEqual (-1, s.IndexOf ('q', s.Length), "#A7"); + Assert.AreEqual (-1, s.IndexOf ('3', s.Length), "#A8"); Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US"); - AssertEquals ("#B1", -1, s.IndexOf ('a', s.Length)); - AssertEquals ("#B2", -1, s.IndexOf ('6', s.Length)); - AssertEquals ("#B3", -1, s.IndexOf ('t', s.Length)); - AssertEquals ("#B4", -1, s.IndexOf ('T', s.Length)); - AssertEquals ("#B5", -1, s.IndexOf ('i', s.Length)); - AssertEquals ("#B6", -1, s.IndexOf ('I', s.Length)); - AssertEquals ("#B7", -1, s.IndexOf ('q', s.Length)); - AssertEquals ("#B8", -1, s.IndexOf ('3', s.Length)); + Assert.AreEqual (-1, s.IndexOf ('a', s.Length), "#B1"); + Assert.AreEqual (-1, s.IndexOf ('6', s.Length), "#B2"); + Assert.AreEqual (-1, s.IndexOf ('t', s.Length), "#B3"); + Assert.AreEqual (-1, s.IndexOf ('T', s.Length), "#B4"); + Assert.AreEqual (-1, s.IndexOf ('i', s.Length), "#B5"); + Assert.AreEqual (-1, s.IndexOf ('I', s.Length), "#B6"); + Assert.AreEqual (-1, s.IndexOf ('q', s.Length), "#B7"); + Assert.AreEqual (-1, s.IndexOf ('3', s.Length), "#B8"); } [Test] // IndexOf (String, Int32) @@ -1386,15 +1362,15 @@ public class StringTest : TestCase { string s = "testing123456"; - AssertEquals ("#1", -1, s.IndexOf ("IN", 3)); - AssertEquals ("#2", 4, s.IndexOf ("in", 3)); - AssertEquals ("#3", -1, s.IndexOf ("in", 5)); - AssertEquals ("#4", 7, s.IndexOf ("1", 5)); - AssertEquals ("#5", 12, s.IndexOf ("6", 12)); - AssertEquals ("#6", 0, s.IndexOf ("testing123456", 0)); - AssertEquals ("#7", -1, s.IndexOf ("testing123456", 1)); - AssertEquals ("#8", 5, s.IndexOf (string.Empty, 5)); - AssertEquals ("#9", 0, s.IndexOf (string.Empty, 0)); + Assert.AreEqual (-1, s.IndexOf ("IN", 3), "#1"); + Assert.AreEqual (4, s.IndexOf ("in", 3), "#2"); + Assert.AreEqual (-1, s.IndexOf ("in", 5), "#3"); + Assert.AreEqual (7, s.IndexOf ("1", 5), "#4"); + Assert.AreEqual (12, s.IndexOf ("6", 12), "#5"); + Assert.AreEqual (0, s.IndexOf ("testing123456", 0), "#6"); + Assert.AreEqual (-1, s.IndexOf ("testing123456", 1), "#7"); + Assert.AreEqual (5, s.IndexOf (string.Empty, 5), "#8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, 0), "#9"); } [Test] // IndexOf (String, Int32) @@ -1402,15 +1378,15 @@ public class StringTest : TestCase { try { "Mono".IndexOf ((string) null, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); #if NET_2_0 - AssertEquals ("#5", "value", ex.ParamName); + Assert.AreEqual ("value", ex.ParamName, "#5"); #else - AssertEquals ("#5", "string2", ex.ParamName); + Assert.AreEqual ("string2", ex.ParamName, "#5"); #endif } } @@ -1425,140 +1401,140 @@ public class StringTest : TestCase Thread.CurrentThread.CurrentCulture = new CultureInfo ("tr-TR"); comparison_type = StringComparison.CurrentCulture; - AssertEquals ("#A1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#A2", -1, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#A3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#A4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#A5", -1, s.IndexOf ("T", comparison_type)); - AssertEquals ("#A6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#A7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#A8", -1, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#A9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#A1"); + Assert.AreEqual (-1, s.IndexOf ("NG", comparison_type), "#A2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#A3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#A4"); + Assert.AreEqual (-1, s.IndexOf ("T", comparison_type), "#A5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#A6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#A7"); + Assert.AreEqual (-1, s.IndexOf ("TIN", comparison_type), "#A8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#A9"); comparison_type = StringComparison.CurrentCultureIgnoreCase; - AssertEquals ("#B1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#B2", 5, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#B3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#B4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#B5", 0, s.IndexOf ("T", comparison_type)); - AssertEquals ("#B6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#B7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#B8", -1, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#B9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#B1"); + Assert.AreEqual (5, s.IndexOf ("NG", comparison_type), "#B2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#B3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#B4"); + Assert.AreEqual (0, s.IndexOf ("T", comparison_type), "#B5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#B6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#B7"); + Assert.AreEqual (-1, s.IndexOf ("TIN", comparison_type), "#B8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#B9"); comparison_type = StringComparison.InvariantCulture; - AssertEquals ("#C1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#C2", -1, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#C3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#C4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#C5", -1, s.IndexOf ("T", comparison_type)); - AssertEquals ("#C6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#C7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#C8", -1, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#C9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#C1"); + Assert.AreEqual (-1, s.IndexOf ("NG", comparison_type), "#C2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#C3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#C4"); + Assert.AreEqual (-1, s.IndexOf ("T", comparison_type), "#C5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#C6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#C7"); + Assert.AreEqual (-1, s.IndexOf ("TIN", comparison_type), "#C8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#C9"); comparison_type = StringComparison.InvariantCultureIgnoreCase; - AssertEquals ("#D1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#D2", 5, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#D3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#D4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#D5", 0, s.IndexOf ("T", comparison_type)); - AssertEquals ("#D6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#D7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#D8", 3, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#D9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#D1"); + Assert.AreEqual (5, s.IndexOf ("NG", comparison_type), "#D2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#D3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#D4"); + Assert.AreEqual (0, s.IndexOf ("T", comparison_type), "#D5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#D6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#D7"); + Assert.AreEqual (3, s.IndexOf ("TIN", comparison_type), "#D8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#D9"); comparison_type = StringComparison.Ordinal; - AssertEquals ("#E1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#E2", -1, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#E3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#E4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#E5", -1, s.IndexOf ("T", comparison_type)); - AssertEquals ("#E6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#E7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#E8", -1, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#E9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#E1"); + Assert.AreEqual (-1, s.IndexOf ("NG", comparison_type), "#E2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#E3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#E4"); + Assert.AreEqual (-1, s.IndexOf ("T", comparison_type), "#E5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#E6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#E7"); + Assert.AreEqual (-1, s.IndexOf ("TIN", comparison_type), "#E8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#E9"); comparison_type = StringComparison.OrdinalIgnoreCase; - AssertEquals ("#F1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#F2", 5, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#F3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#F4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#F5", 0, s.IndexOf ("T", comparison_type)); - AssertEquals ("#F6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#F7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#F8", 3, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#F9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#F1"); + Assert.AreEqual (5, s.IndexOf ("NG", comparison_type), "#F2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#F3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#F4"); + Assert.AreEqual (0, s.IndexOf ("T", comparison_type), "#F5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#F6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#F7"); + Assert.AreEqual (3, s.IndexOf ("TIN", comparison_type), "#F8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#F9"); Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US"); comparison_type = StringComparison.CurrentCulture; - AssertEquals ("#G1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#G2", -1, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#G3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#G4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#G5", -1, s.IndexOf ("T", comparison_type)); - AssertEquals ("#G6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#G7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#G8", -1, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#G9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#G1"); + Assert.AreEqual (-1, s.IndexOf ("NG", comparison_type), "#G2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#G3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#G4"); + Assert.AreEqual (-1, s.IndexOf ("T", comparison_type), "#G5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#G6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#G7"); + Assert.AreEqual (-1, s.IndexOf ("TIN", comparison_type), "#G8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#G9"); comparison_type = StringComparison.CurrentCultureIgnoreCase; - AssertEquals ("#H1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#H2", 5, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#H3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#H4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#H5", 0, s.IndexOf ("T", comparison_type)); - AssertEquals ("#H6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#H7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#H8", 3, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#H9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#H1"); + Assert.AreEqual (5, s.IndexOf ("NG", comparison_type), "#H2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#H3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#H4"); + Assert.AreEqual (0, s.IndexOf ("T", comparison_type), "#H5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#H6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#H7"); + Assert.AreEqual (3, s.IndexOf ("TIN", comparison_type), "#H8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#H9"); comparison_type = StringComparison.InvariantCulture; - AssertEquals ("#I1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#I2", -1, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#I3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#I4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#I5", -1, s.IndexOf ("T", comparison_type)); - AssertEquals ("#I6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#I7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#I8", -1, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#I9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#I1"); + Assert.AreEqual (-1, s.IndexOf ("NG", comparison_type), "#I2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#I3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#I4"); + Assert.AreEqual (-1, s.IndexOf ("T", comparison_type), "#I5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#I6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#I7"); + Assert.AreEqual (-1, s.IndexOf ("TIN", comparison_type), "#I8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#I9"); comparison_type = StringComparison.InvariantCultureIgnoreCase; - AssertEquals ("#J1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#J2", 5, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#J3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#J4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#J5", 0, s.IndexOf ("T", comparison_type)); - AssertEquals ("#J6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#J7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#J8", 3, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#J9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#J1"); + Assert.AreEqual (5, s.IndexOf ("NG", comparison_type), "#J2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#J3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#J4"); + Assert.AreEqual (0, s.IndexOf ("T", comparison_type), "#J5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#J6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#J7"); + Assert.AreEqual (3, s.IndexOf ("TIN", comparison_type), "#J8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#J9"); comparison_type = StringComparison.Ordinal; - AssertEquals ("#K1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#K2", -1, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#K3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#K4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#K5", -1, s.IndexOf ("T", comparison_type)); - AssertEquals ("#K6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#K7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#K8", -1, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#K9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#K1"); + Assert.AreEqual (-1, s.IndexOf ("NG", comparison_type), "#K2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#K3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#K4"); + Assert.AreEqual (-1, s.IndexOf ("T", comparison_type), "#K5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#K6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#K7"); + Assert.AreEqual (-1, s.IndexOf ("TIN", comparison_type), "#K8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#K9"); comparison_type = StringComparison.OrdinalIgnoreCase; - AssertEquals ("#L1", 7, s.IndexOf ("123", comparison_type)); - AssertEquals ("#L2", 5, s.IndexOf ("NG", comparison_type)); - AssertEquals ("#L3", -1, s.IndexOf ("nga", comparison_type)); - AssertEquals ("#L4", 0, s.IndexOf ("t", comparison_type)); - AssertEquals ("#L5", 0, s.IndexOf ("T", comparison_type)); - AssertEquals ("#L6", 12, s.IndexOf ("6", comparison_type)); - AssertEquals ("#L7", 3, s.IndexOf ("tin", comparison_type)); - AssertEquals ("#L8", 3, s.IndexOf ("TIN", comparison_type)); - AssertEquals ("#L9", 0, s.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (7, s.IndexOf ("123", comparison_type), "#L1"); + Assert.AreEqual (5, s.IndexOf ("NG", comparison_type), "#L2"); + Assert.AreEqual (-1, s.IndexOf ("nga", comparison_type), "#L3"); + Assert.AreEqual (0, s.IndexOf ("t", comparison_type), "#L4"); + Assert.AreEqual (0, s.IndexOf ("T", comparison_type), "#L5"); + Assert.AreEqual (12, s.IndexOf ("6", comparison_type), "#L6"); + Assert.AreEqual (3, s.IndexOf ("tin", comparison_type), "#L7"); + Assert.AreEqual (3, s.IndexOf ("TIN", comparison_type), "#L8"); + Assert.AreEqual (0, s.IndexOf (string.Empty, comparison_type), "#L9"); - AssertEquals ("#M", 0, string.Empty.IndexOf (string.Empty, comparison_type)); + Assert.AreEqual (0, string.Empty.IndexOf (string.Empty, comparison_type), "#M"); } [Test] // IndexOf (String, StringComparison) @@ -1566,14 +1542,14 @@ public class StringTest : TestCase { try { "Mono".IndexOf (string.Empty, (StringComparison) Int32.MinValue); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // The string comparison type passed in is currently // not supported - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "comparisonType", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("comparisonType", ex.ParamName, "#5"); } } @@ -1582,12 +1558,12 @@ public class StringTest : TestCase { try { "Mono".IndexOf ((string) null, StringComparison.Ordinal); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("value", ex.ParamName, "#5"); } } @@ -1626,71 +1602,71 @@ public class StringTest : TestCase string text2 = "123"; string text3 = "NG"; string text4 = "t"; - AssertEquals ("#1-1", 7, text.IndexOf (text2, StringComparison.Ordinal)); - AssertEquals ("#2-1", 5, text.IndexOf (text3, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (7, text.IndexOf (text2, StringComparison.Ordinal), "#1-1"); + Assert.AreEqual (5, text.IndexOf (text3, StringComparison.OrdinalIgnoreCase), "#2-1"); - AssertEquals ("#1-2", 7, text.IndexOf (text2, 0, StringComparison.Ordinal)); - AssertEquals ("#2-2", 5, text.IndexOf (text3, 0, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (7, text.IndexOf (text2, 0, StringComparison.Ordinal), "#1-2"); + Assert.AreEqual (5, text.IndexOf (text3, 0, StringComparison.OrdinalIgnoreCase), "#2-2"); - AssertEquals ("#1-3", 7, text.IndexOf (text2, 1, StringComparison.Ordinal)); - AssertEquals ("#2-3", 5, text.IndexOf (text3, 1, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (7, text.IndexOf (text2, 1, StringComparison.Ordinal), "#1-3"); + Assert.AreEqual (5, text.IndexOf (text3, 1, StringComparison.OrdinalIgnoreCase), "#2-3"); - AssertEquals ("#1-4", 7, text.IndexOf (text2, 6, StringComparison.Ordinal)); - AssertEquals ("#2-4", -1, text.IndexOf (text3, 6, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (7, text.IndexOf (text2, 6, StringComparison.Ordinal), "#1-4"); + Assert.AreEqual (-1, text.IndexOf (text3, 6, StringComparison.OrdinalIgnoreCase), "#2-4"); - AssertEquals ("#1-5", 7, text.IndexOf (text2, 7, 3, StringComparison.Ordinal)); - AssertEquals ("#2-5", -1, text.IndexOf (text3, 7, 3, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (7, text.IndexOf (text2, 7, 3, StringComparison.Ordinal), "#1-5"); + Assert.AreEqual (-1, text.IndexOf (text3, 7, 3, StringComparison.OrdinalIgnoreCase), "#2-5"); - AssertEquals ("#1-6", -1, text.IndexOf (text2, 6, 0, StringComparison.Ordinal)); - AssertEquals ("#2-6", -1, text.IndexOf (text3, 5, 0, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (-1, text.IndexOf (text2, 6, 0, StringComparison.Ordinal), "#1-6"); + Assert.AreEqual (-1, text.IndexOf (text3, 5, 0, StringComparison.OrdinalIgnoreCase), "#2-6"); - AssertEquals ("#1-7", -1, text.IndexOf (text2, 7, 1, StringComparison.Ordinal)); - AssertEquals ("#2-7", -1, text.IndexOf (text3, 5, 1, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (-1, text.IndexOf (text2, 7, 1, StringComparison.Ordinal), "#1-7"); + Assert.AreEqual (-1, text.IndexOf (text3, 5, 1, StringComparison.OrdinalIgnoreCase), "#2-7"); - AssertEquals ("#3-1", 0, text.IndexOf (text4, 0, StringComparison.Ordinal)); - AssertEquals ("#3-2", 0, text.IndexOf (text4, 0, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (0, text.IndexOf (text4, 0, StringComparison.Ordinal), "#3-1"); + Assert.AreEqual (0, text.IndexOf (text4, 0, StringComparison.OrdinalIgnoreCase), "#3-2"); - AssertEquals ("#4-1", -1, text.IndexOf (text4, 13, StringComparison.Ordinal)); - AssertEquals ("#4-2", -1, text.IndexOf (text4, 13, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (-1, text.IndexOf (text4, 13, StringComparison.Ordinal), "#4-1"); + Assert.AreEqual (-1, text.IndexOf (text4, 13, StringComparison.OrdinalIgnoreCase), "#4-2"); - AssertEquals ("#4-1", -1, text.IndexOf (text4, 13, 0, StringComparison.Ordinal)); - AssertEquals ("#4-2", -1, text.IndexOf (text4, 13, 0, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (-1, text.IndexOf (text4, 13, 0, StringComparison.Ordinal), "#4-1"); + Assert.AreEqual (-1, text.IndexOf (text4, 13, 0, StringComparison.OrdinalIgnoreCase), "#4-2"); - AssertEquals ("#5-1", 12, text.IndexOf ("6", 12, 1, StringComparison.Ordinal)); - AssertEquals ("#5-2", 12, text.IndexOf ("6", 12, 1, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (12, text.IndexOf ("6", 12, 1, StringComparison.Ordinal), "#5-1"); + Assert.AreEqual (12, text.IndexOf ("6", 12, 1, StringComparison.OrdinalIgnoreCase), "#5-2"); } [Test] public void IndexOfStringComparisonOrdinal () { string text = "testing123456"; - AssertEquals ("#1", 10, text.IndexOf ("456", StringComparison.Ordinal)); - AssertEquals ("#2", -1, text.IndexOf ("4567", StringComparison.Ordinal)); - AssertEquals ("#3", 0, text.IndexOf ("te", StringComparison.Ordinal)); - AssertEquals ("#4", 2, text.IndexOf ("s", StringComparison.Ordinal)); - AssertEquals ("#5", -1, text.IndexOf ("ates", StringComparison.Ordinal)); - AssertEquals ("#6", -1, text.IndexOf ("S", StringComparison.Ordinal)); + Assert.AreEqual (10, text.IndexOf ("456", StringComparison.Ordinal), "#1"); + Assert.AreEqual (-1, text.IndexOf ("4567", StringComparison.Ordinal), "#2"); + Assert.AreEqual (0, text.IndexOf ("te", StringComparison.Ordinal), "#3"); + Assert.AreEqual (2, text.IndexOf ("s", StringComparison.Ordinal), "#4"); + Assert.AreEqual (-1, text.IndexOf ("ates", StringComparison.Ordinal), "#5"); + Assert.AreEqual (-1, text.IndexOf ("S", StringComparison.Ordinal), "#6"); } [Test] public void IndexOfStringComparisonOrdinalIgnoreCase () { string text = "testing123456"; - AssertEquals ("#1", 10, text.IndexOf ("456", StringComparison.OrdinalIgnoreCase)); - AssertEquals ("#2", -1, text.IndexOf ("4567", StringComparison.OrdinalIgnoreCase)); - AssertEquals ("#3", 0, text.IndexOf ("te", StringComparison.OrdinalIgnoreCase)); - AssertEquals ("#4", 2, text.IndexOf ("s", StringComparison.OrdinalIgnoreCase)); - AssertEquals ("#5", -1, text.IndexOf ("ates", StringComparison.OrdinalIgnoreCase)); - AssertEquals ("#6", 2, text.IndexOf ("S", StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (10, text.IndexOf ("456", StringComparison.OrdinalIgnoreCase), "#1"); + Assert.AreEqual (-1, text.IndexOf ("4567", StringComparison.OrdinalIgnoreCase), "#2"); + Assert.AreEqual (0, text.IndexOf ("te", StringComparison.OrdinalIgnoreCase), "#3"); + Assert.AreEqual (2, text.IndexOf ("s", StringComparison.OrdinalIgnoreCase), "#4"); + Assert.AreEqual (-1, text.IndexOf ("ates", StringComparison.OrdinalIgnoreCase), "#5"); + Assert.AreEqual (2, text.IndexOf ("S", StringComparison.OrdinalIgnoreCase), "#6"); } [Test] public void IndexOfOrdinalCountSmallerThanValueString () { - AssertEquals ("#1", -1, "Test".IndexOf ("ST", 2, 1, StringComparison.Ordinal)); - AssertEquals ("#2", -1, "Test".IndexOf ("ST", 2, 1, StringComparison.OrdinalIgnoreCase)); - AssertEquals ("#3", -1, "Test".LastIndexOf ("ST", 2, 1, StringComparison.Ordinal)); - AssertEquals ("#4", -1, "Test".LastIndexOf ("ST", 2, 1, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (-1, "Test".IndexOf ("ST", 2, 1, StringComparison.Ordinal), "#1"); + Assert.AreEqual (-1, "Test".IndexOf ("ST", 2, 1, StringComparison.OrdinalIgnoreCase), "#2"); + Assert.AreEqual (-1, "Test".LastIndexOf ("ST", 2, 1, StringComparison.Ordinal), "#3"); + Assert.AreEqual (-1, "Test".LastIndexOf ("ST", 2, 1, StringComparison.OrdinalIgnoreCase), "#4"); } #endif @@ -1699,14 +1675,14 @@ public class StringTest : TestCase { try { "Mono".IndexOf ('o', 1, -1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Count must be positive and count must refer to a // location within the string/array/collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -1715,14 +1691,14 @@ public class StringTest : TestCase { try { "Mono".IndexOf ('o', 1, Int32.MaxValue); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Count must be positive and count must refer to a // location within the string/array/collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -1731,14 +1707,14 @@ public class StringTest : TestCase { try { "Mono".IndexOf ('o', -1, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -1749,14 +1725,14 @@ public class StringTest : TestCase try { s.IndexOf ('o', s.Length + 1, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -1767,85 +1743,85 @@ public class StringTest : TestCase Thread.CurrentThread.CurrentCulture = new CultureInfo ("tr-TR"); - AssertEquals ("#A1", -1, s.IndexOf ("123", 4, 5)); - AssertEquals ("#A2", 7, s.IndexOf ("123", 4, 6)); - AssertEquals ("#A3", -1, s.IndexOf ("123", 5, 4)); - AssertEquals ("#A4", 7, s.IndexOf ("123", 5, 5)); - AssertEquals ("#A5", 7, s.IndexOf ("123", 0, s.Length)); - AssertEquals ("#A6", -1, s.IndexOf ("123", s.Length, 0)); - - AssertEquals ("#B1", -1, s.IndexOf ("tin", 2, 3)); - AssertEquals ("#B2", 3, s.IndexOf ("tin", 3, 3)); - AssertEquals ("#B3", -1, s.IndexOf ("tin", 2, 2)); - AssertEquals ("#B4", -1, s.IndexOf ("tin", 1, 4)); - AssertEquals ("#B5", 3, s.IndexOf ("tin", 0, s.Length)); - AssertEquals ("#B6", -1, s.IndexOf ("tin", s.Length, 0)); - - AssertEquals ("#C1", 6, s.IndexOf ("g12", 4, 5)); - AssertEquals ("#C2", -1, s.IndexOf ("g12", 5, 2)); - AssertEquals ("#C3", -1, s.IndexOf ("g12", 5, 3)); - AssertEquals ("#C4", 6, s.IndexOf ("g12", 6, 4)); - AssertEquals ("#C5", 6, s.IndexOf ("g12", 0, s.Length)); - AssertEquals ("#C6", -1, s.IndexOf ("g12", s.Length, 0)); - - AssertEquals ("#D1", 1, s.IndexOf ("est", 0, 5)); - AssertEquals ("#D2", -1, s.IndexOf ("est", 1, 2)); - AssertEquals ("#D3", -1, s.IndexOf ("est", 2, 10)); - AssertEquals ("#D4", 14, s.IndexOf ("est", 7, 10)); - AssertEquals ("#D5", 1, s.IndexOf ("est", 0, s.Length)); - AssertEquals ("#D6", -1, s.IndexOf ("est", s.Length, 0)); - - AssertEquals ("#E1", -1, s.IndexOf ("T", 0, s.Length)); - AssertEquals ("#E2", 4, s.IndexOf ("i", 0, s.Length)); - AssertEquals ("#E3", -1, s.IndexOf ("I", 0, s.Length)); - AssertEquals ("#E4", 12, s.IndexOf ("6", 0, s.Length)); - AssertEquals ("#E5", 0, s.IndexOf ("testing123456", 0, s.Length)); - AssertEquals ("#E6", -1, s.IndexOf ("testing1234567", 0, s.Length)); - AssertEquals ("#E7", 0, s.IndexOf (string.Empty, 0, 0)); - AssertEquals ("#E8", 4, s.IndexOf (string.Empty, 4, 3)); - AssertEquals ("#E9", 0, string.Empty.IndexOf (string.Empty, 0, 0)); - AssertEquals ("#E10", -1, string.Empty.IndexOf ("abc", 0, 0)); + Assert.AreEqual (-1, s.IndexOf ("123", 4, 5), "#A1"); + Assert.AreEqual (7, s.IndexOf ("123", 4, 6), "#A2"); + Assert.AreEqual (-1, s.IndexOf ("123", 5, 4), "#A3"); + Assert.AreEqual (7, s.IndexOf ("123", 5, 5), "#A4"); + Assert.AreEqual (7, s.IndexOf ("123", 0, s.Length), "#A5"); + Assert.AreEqual (-1, s.IndexOf ("123", s.Length, 0), "#A6"); + + Assert.AreEqual (-1, s.IndexOf ("tin", 2, 3), "#B1"); + Assert.AreEqual (3, s.IndexOf ("tin", 3, 3), "#B2"); + Assert.AreEqual (-1, s.IndexOf ("tin", 2, 2), "#B3"); + Assert.AreEqual (-1, s.IndexOf ("tin", 1, 4), "#B4"); + Assert.AreEqual (3, s.IndexOf ("tin", 0, s.Length), "#B5"); + Assert.AreEqual (-1, s.IndexOf ("tin", s.Length, 0), "#B6"); + + Assert.AreEqual (6, s.IndexOf ("g12", 4, 5), "#C1"); + Assert.AreEqual (-1, s.IndexOf ("g12", 5, 2), "#C2"); + Assert.AreEqual (-1, s.IndexOf ("g12", 5, 3), "#C3"); + Assert.AreEqual (6, s.IndexOf ("g12", 6, 4), "#C4"); + Assert.AreEqual (6, s.IndexOf ("g12", 0, s.Length), "#C5"); + Assert.AreEqual (-1, s.IndexOf ("g12", s.Length, 0), "#C6"); + + Assert.AreEqual (1, s.IndexOf ("est", 0, 5), "#D1"); + Assert.AreEqual (-1, s.IndexOf ("est", 1, 2), "#D2"); + Assert.AreEqual (-1, s.IndexOf ("est", 2, 10), "#D3"); + Assert.AreEqual (14, s.IndexOf ("est", 7, 10), "#D4"); + Assert.AreEqual (1, s.IndexOf ("est", 0, s.Length), "#D5"); + Assert.AreEqual (-1, s.IndexOf ("est", s.Length, 0), "#D6"); + + Assert.AreEqual (-1, s.IndexOf ("T", 0, s.Length), "#E1"); + Assert.AreEqual (4, s.IndexOf ("i", 0, s.Length), "#E2"); + Assert.AreEqual (-1, s.IndexOf ("I", 0, s.Length), "#E3"); + Assert.AreEqual (12, s.IndexOf ("6", 0, s.Length), "#E4"); + Assert.AreEqual (0, s.IndexOf ("testing123456", 0, s.Length), "#E5"); + Assert.AreEqual (-1, s.IndexOf ("testing1234567", 0, s.Length), "#E6"); + Assert.AreEqual (0, s.IndexOf (string.Empty, 0, 0), "#E7"); + Assert.AreEqual (4, s.IndexOf (string.Empty, 4, 3), "#E8"); + Assert.AreEqual (0, string.Empty.IndexOf (string.Empty, 0, 0), "#E9"); + Assert.AreEqual (-1, string.Empty.IndexOf ("abc", 0, 0), "#E10"); Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US"); - AssertEquals ("#F1", -1, s.IndexOf ("123", 4, 5)); - AssertEquals ("#F2", 7, s.IndexOf ("123", 4, 6)); - AssertEquals ("#F3", -1, s.IndexOf ("123", 5, 4)); - AssertEquals ("#F4", 7, s.IndexOf ("123", 5, 5)); - AssertEquals ("#F5", 7, s.IndexOf ("123", 0, s.Length)); - AssertEquals ("#F6", -1, s.IndexOf ("123", s.Length, 0)); - - AssertEquals ("#G1", -1, s.IndexOf ("tin", 2, 3)); - AssertEquals ("#G2", 3, s.IndexOf ("tin", 3, 3)); - AssertEquals ("#G3", -1, s.IndexOf ("tin", 2, 2)); - AssertEquals ("#G4", -1, s.IndexOf ("tin", 1, 4)); - AssertEquals ("#G5", 3, s.IndexOf ("tin", 0, s.Length)); - AssertEquals ("#G6", -1, s.IndexOf ("tin", s.Length, 0)); - - AssertEquals ("#H1", 6, s.IndexOf ("g12", 4, 5)); - AssertEquals ("#H2", -1, s.IndexOf ("g12", 5, 2)); - AssertEquals ("#H3", -1, s.IndexOf ("g12", 5, 3)); - AssertEquals ("#H4", 6, s.IndexOf ("g12", 6, 4)); - AssertEquals ("#H5", 6, s.IndexOf ("g12", 0, s.Length)); - AssertEquals ("#H6", -1, s.IndexOf ("g12", s.Length, 0)); - - AssertEquals ("#I1", 1, s.IndexOf ("est", 0, 5)); - AssertEquals ("#I2", -1, s.IndexOf ("est", 1, 2)); - AssertEquals ("#I3", -1, s.IndexOf ("est", 2, 10)); - AssertEquals ("#I4", 14, s.IndexOf ("est", 7, 10)); - AssertEquals ("#I5", 1, s.IndexOf ("est", 0, s.Length)); - AssertEquals ("#I6", -1, s.IndexOf ("est", s.Length, 0)); - - AssertEquals ("#J1", -1, s.IndexOf ("T", 0, s.Length)); - AssertEquals ("#J2", 4, s.IndexOf ("i", 0, s.Length)); - AssertEquals ("#J3", -1, s.IndexOf ("I", 0, s.Length)); - AssertEquals ("#J4", 12, s.IndexOf ("6", 0, s.Length)); - AssertEquals ("#J5", 0, s.IndexOf ("testing123456", 0, s.Length)); - AssertEquals ("#J6", -1, s.IndexOf ("testing1234567", 0, s.Length)); - AssertEquals ("#J7", 0, s.IndexOf (string.Empty, 0, 0)); - AssertEquals ("#J8", 4, s.IndexOf (string.Empty, 4, 3)); - AssertEquals ("#J9", 0, string.Empty.IndexOf (string.Empty, 0, 0)); - AssertEquals ("#J10", -1, string.Empty.IndexOf ("abc", 0, 0)); + Assert.AreEqual (-1, s.IndexOf ("123", 4, 5), "#F1"); + Assert.AreEqual (7, s.IndexOf ("123", 4, 6), "#F2"); + Assert.AreEqual (-1, s.IndexOf ("123", 5, 4), "#F3"); + Assert.AreEqual (7, s.IndexOf ("123", 5, 5), "#F4"); + Assert.AreEqual (7, s.IndexOf ("123", 0, s.Length), "#F5"); + Assert.AreEqual (-1, s.IndexOf ("123", s.Length, 0), "#F6"); + + Assert.AreEqual (-1, s.IndexOf ("tin", 2, 3), "#G1"); + Assert.AreEqual (3, s.IndexOf ("tin", 3, 3), "#G2"); + Assert.AreEqual (-1, s.IndexOf ("tin", 2, 2), "#G3"); + Assert.AreEqual (-1, s.IndexOf ("tin", 1, 4), "#G4"); + Assert.AreEqual (3, s.IndexOf ("tin", 0, s.Length), "#G5"); + Assert.AreEqual (-1, s.IndexOf ("tin", s.Length, 0), "#G6"); + + Assert.AreEqual (6, s.IndexOf ("g12", 4, 5), "#H1"); + Assert.AreEqual (-1, s.IndexOf ("g12", 5, 2), "#H2"); + Assert.AreEqual (-1, s.IndexOf ("g12", 5, 3), "#H3"); + Assert.AreEqual (6, s.IndexOf ("g12", 6, 4), "#H4"); + Assert.AreEqual (6, s.IndexOf ("g12", 0, s.Length), "#H5"); + Assert.AreEqual (-1, s.IndexOf ("g12", s.Length, 0), "#H6"); + + Assert.AreEqual (1, s.IndexOf ("est", 0, 5), "#I1"); + Assert.AreEqual (-1, s.IndexOf ("est", 1, 2), "#I2"); + Assert.AreEqual (-1, s.IndexOf ("est", 2, 10), "#I3"); + Assert.AreEqual (14, s.IndexOf ("est", 7, 10), "#I4"); + Assert.AreEqual (1, s.IndexOf ("est", 0, s.Length), "#I5"); + Assert.AreEqual (-1, s.IndexOf ("est", s.Length, 0), "#I6"); + + Assert.AreEqual (-1, s.IndexOf ("T", 0, s.Length), "#J1"); + Assert.AreEqual (4, s.IndexOf ("i", 0, s.Length), "#J2"); + Assert.AreEqual (-1, s.IndexOf ("I", 0, s.Length), "#J3"); + Assert.AreEqual (12, s.IndexOf ("6", 0, s.Length), "#J4"); + Assert.AreEqual (0, s.IndexOf ("testing123456", 0, s.Length), "#J5"); + Assert.AreEqual (-1, s.IndexOf ("testing1234567", 0, s.Length), "#J6"); + Assert.AreEqual (0, s.IndexOf (string.Empty, 0, 0), "#J7"); + Assert.AreEqual (4, s.IndexOf (string.Empty, 4, 3), "#J8"); + Assert.AreEqual (0, string.Empty.IndexOf (string.Empty, 0, 0), "#J9"); + Assert.AreEqual (-1, string.Empty.IndexOf ("abc", 0, 0), "#J10"); } [Test] // IndexOf (String, Int32, Int32) @@ -1853,14 +1829,14 @@ public class StringTest : TestCase { try { "Mono".IndexOf ("no", 1, -1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Count must be positive and count must refer to a // location within the string/array/collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -1871,47 +1847,47 @@ public class StringTest : TestCase try { s.IndexOf ("no", 1, s.Length); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { // Count must be positive and count must refer to a // location within the string/array/collection - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("count", ex.ParamName, "#A5"); } try { s.IndexOf ("no", 1, s.Length + 1); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { // Count must be positive and count must refer to a // location within the string/array/collection - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("count", ex.ParamName, "#B5"); } try { s.IndexOf ("no", 1, int.MaxValue); - Fail ("#C1"); + Assert.Fail ("#C1"); } catch (ArgumentOutOfRangeException ex) { #if NET_2_0 // Count must be positive and count must refer to a // location within the string/array/collection - AssertEquals ("#C2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#C3", ex.InnerException); - AssertNotNull ("#C4", ex.Message); - AssertEquals ("#C5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.AreEqual ("count", ex.ParamName, "#C5"); #else // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#C2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#C3", ex.InnerException); - AssertNotNull ("#C4", ex.Message); - AssertNotNull ("#C5", ex.ParamName); - //AssertEquals ("#C5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.IsNotNull (ex.ParamName, "#C5"); + //Assert.AreEqual ("startIndex", ex.ParamName, "#C5"); #endif } } @@ -1921,14 +1897,14 @@ public class StringTest : TestCase { try { "Mono".IndexOf ("no", -1, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -1939,31 +1915,31 @@ public class StringTest : TestCase try { s.IndexOf ("no", s.Length + 1, 1); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); #if NET_2_0 - AssertEquals ("#A5", "startIndex", ex.ParamName); + Assert.AreEqual ("startIndex", ex.ParamName, "#A5"); #else - AssertNotNull ("#A5", ex.ParamName); - //AssertEquals ("#A5", "count", ex.ParamName); + Assert.IsNotNull (ex.ParamName, "#A5"); + //Assert.AreEqual ("count", ex.ParamName, "#A5"); #endif } try { s.IndexOf ("no", int.MaxValue, 1); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#B5"); } } @@ -1972,15 +1948,15 @@ public class StringTest : TestCase { try { "Mono".IndexOf ((string) null, 0, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); #if NET_2_0 - AssertEquals ("#5", "value", ex.ParamName); + Assert.AreEqual ("value", ex.ParamName, "#5"); #else - AssertEquals ("#5", "string2", ex.ParamName); + Assert.AreEqual ("string2", ex.ParamName, "#5"); #endif } } @@ -1991,14 +1967,14 @@ public class StringTest : TestCase { try { "Mono".IndexOf (string.Empty, 1, (StringComparison) Int32.MinValue); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // The string comparison type passed in is currently // not supported - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "comparisonType", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("comparisonType", ex.ParamName, "#5"); } } @@ -2007,14 +1983,14 @@ public class StringTest : TestCase { try { "Mono".IndexOf ("o", -1, StringComparison.Ordinal); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -2023,14 +1999,14 @@ public class StringTest : TestCase { try { "Mono".IndexOf (string.Empty, 0, 1, (StringComparison) Int32.MinValue); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // The string comparison type passed in is currently // not supported - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "comparisonType", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("comparisonType", ex.ParamName, "#5"); } } @@ -2039,15 +2015,15 @@ public class StringTest : TestCase { try { "Mono".IndexOf ("o", 1, -1, StringComparison.Ordinal); - Fail ("#1"); - Fail ("#1"); + Assert.Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Count must be positive and count must refer to a // location within the string/array/collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -2056,14 +2032,14 @@ public class StringTest : TestCase { try { "Mono".IndexOf ("o", -1, 0, StringComparison.Ordinal); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } #endif @@ -2075,13 +2051,13 @@ public class StringTest : TestCase char[] c; c = new char [] {'a', 'e', 'i', 'o', 'u'}; - AssertEquals ("#1", 0, s.IndexOfAny (c)); + Assert.AreEqual (0, s.IndexOfAny (c), "#1"); c = new char [] { 'd', 'z' }; - AssertEquals ("#1", 3, s.IndexOfAny (c)); + Assert.AreEqual (3, s.IndexOfAny (c), "#1"); c = new char [] { 'q', 'm', 'z' }; - AssertEquals ("#2", 12, s.IndexOfAny (c)); + Assert.AreEqual (12, s.IndexOfAny (c), "#2"); c = new char [0]; - AssertEquals ("#3", -1, s.IndexOfAny (c)); + Assert.AreEqual (-1, s.IndexOfAny (c), "#3"); } @@ -2090,12 +2066,12 @@ public class StringTest : TestCase { try { "mono".IndexOfAny ((char []) null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -2106,30 +2082,30 @@ public class StringTest : TestCase char [] c; c = new char [] { 'a', 'e', 'i', 'o', 'u' }; - AssertEquals ("#A1", 0, s.IndexOfAny (c, 0)); - AssertEquals ("#A1", 4, s.IndexOfAny (c, 1)); - AssertEquals ("#A2", -1, s.IndexOfAny (c, 9)); - AssertEquals ("#A3", -1, s.IndexOfAny (c, s.Length)); + Assert.AreEqual (0, s.IndexOfAny (c, 0), "#A1"); + Assert.AreEqual (4, s.IndexOfAny (c, 1), "#A1"); + Assert.AreEqual (-1, s.IndexOfAny (c, 9), "#A2"); + Assert.AreEqual (-1, s.IndexOfAny (c, s.Length), "#A3"); c = new char [] { 'd', 'z' }; - AssertEquals ("#B1", 3, s.IndexOfAny (c, 0)); - AssertEquals ("#B2", 3, s.IndexOfAny (c, 3)); - AssertEquals ("#B3", 13, s.IndexOfAny (c, 4)); - AssertEquals ("#B4", 13, s.IndexOfAny (c, 9)); - AssertEquals ("#B5", -1, s.IndexOfAny (c, s.Length)); - AssertEquals ("#B6", 13, s.IndexOfAny (c, s.Length - 1)); + Assert.AreEqual (3, s.IndexOfAny (c, 0), "#B1"); + Assert.AreEqual (3, s.IndexOfAny (c, 3), "#B2"); + Assert.AreEqual (13, s.IndexOfAny (c, 4), "#B3"); + Assert.AreEqual (13, s.IndexOfAny (c, 9), "#B4"); + Assert.AreEqual (-1, s.IndexOfAny (c, s.Length), "#B5"); + Assert.AreEqual (13, s.IndexOfAny (c, s.Length - 1), "#B6"); c = new char [] { 'q', 'm', 'z' }; - AssertEquals ("#C1", 12, s.IndexOfAny (c, 0)); - AssertEquals ("#C2", 12, s.IndexOfAny (c, 4)); - AssertEquals ("#C3", 12, s.IndexOfAny (c, 12)); - AssertEquals ("#C4", -1, s.IndexOfAny (c, s.Length)); + Assert.AreEqual (12, s.IndexOfAny (c, 0), "#C1"); + Assert.AreEqual (12, s.IndexOfAny (c, 4), "#C2"); + Assert.AreEqual (12, s.IndexOfAny (c, 12), "#C3"); + Assert.AreEqual (-1, s.IndexOfAny (c, s.Length), "#C4"); c = new char [0]; - AssertEquals ("#D1", -1, s.IndexOfAny (c, 0)); - AssertEquals ("#D2", -1, s.IndexOfAny (c, 4)); - AssertEquals ("#D3", -1, s.IndexOfAny (c, 9)); - AssertEquals ("#D4", -1, s.IndexOfAny (c, s.Length)); + Assert.AreEqual (-1, s.IndexOfAny (c, 0), "#D1"); + Assert.AreEqual (-1, s.IndexOfAny (c, 4), "#D2"); + Assert.AreEqual (-1, s.IndexOfAny (c, 9), "#D3"); + Assert.AreEqual (-1, s.IndexOfAny (c, s.Length), "#D4"); } [Test] // IndexOfAny (Char [], Int32) @@ -2137,12 +2113,12 @@ public class StringTest : TestCase { try { "mono".IndexOfAny ((char []) null, 0); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -2153,14 +2129,14 @@ public class StringTest : TestCase try { s.IndexOfAny (new char [1] { 'd' }, -1, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Specified argument was out of the range of valid // values - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -2171,14 +2147,14 @@ public class StringTest : TestCase try { s.IndexOfAny (new char [1] { 'd' }, s.Length + 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Specified argument was out of the range of valid // values - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -2189,32 +2165,32 @@ public class StringTest : TestCase char [] c; c = new char [] { 'a', 'e', 'i', 'o', 'u' }; - AssertEquals ("#A1", 0, s.IndexOfAny (c, 0, 2)); - AssertEquals ("#A2", -1, s.IndexOfAny (c, 1, 2)); - AssertEquals ("#A3", -1, s.IndexOfAny (c, 1, 3)); - AssertEquals ("#A3", 4, s.IndexOfAny (c, 1, 4)); - AssertEquals ("#A4", 4, s.IndexOfAny (c, 1, s.Length - 1)); + Assert.AreEqual (0, s.IndexOfAny (c, 0, 2), "#A1"); + Assert.AreEqual (-1, s.IndexOfAny (c, 1, 2), "#A2"); + Assert.AreEqual (-1, s.IndexOfAny (c, 1, 3), "#A3"); + Assert.AreEqual (4, s.IndexOfAny (c, 1, 4), "#A3"); + Assert.AreEqual (4, s.IndexOfAny (c, 1, s.Length - 1), "#A4"); c = new char [] { 'd', 'z' }; - AssertEquals ("#B1", -1, s.IndexOfAny (c, 0, 2)); - AssertEquals ("#B2", -1, s.IndexOfAny (c, 1, 2)); - AssertEquals ("#B3", 3, s.IndexOfAny (c, 1, 3)); - AssertEquals ("#B4", 3, s.IndexOfAny (c, 0, s.Length)); - AssertEquals ("#B5", 3, s.IndexOfAny (c, 1, s.Length - 1)); - AssertEquals ("#B6", -1, s.IndexOfAny (c, s.Length, 0)); + Assert.AreEqual (-1, s.IndexOfAny (c, 0, 2), "#B1"); + Assert.AreEqual (-1, s.IndexOfAny (c, 1, 2), "#B2"); + Assert.AreEqual (3, s.IndexOfAny (c, 1, 3), "#B3"); + Assert.AreEqual (3, s.IndexOfAny (c, 0, s.Length), "#B4"); + Assert.AreEqual (3, s.IndexOfAny (c, 1, s.Length - 1), "#B5"); + Assert.AreEqual (-1, s.IndexOfAny (c, s.Length, 0), "#B6"); c = new char [] { 'q', 'm', 'z' }; - AssertEquals ("#C1", -1, s.IndexOfAny (c, 0, 10)); - AssertEquals ("#C2", 12, s.IndexOfAny (c, 10, 4)); - AssertEquals ("#C3", -1, s.IndexOfAny (c, 1, 3)); - AssertEquals ("#C4", 12, s.IndexOfAny (c, 0, s.Length)); - AssertEquals ("#C5", 12, s.IndexOfAny (c, 1, s.Length - 1)); + Assert.AreEqual (-1, s.IndexOfAny (c, 0, 10), "#C1"); + Assert.AreEqual (12, s.IndexOfAny (c, 10, 4), "#C2"); + Assert.AreEqual (-1, s.IndexOfAny (c, 1, 3), "#C3"); + Assert.AreEqual (12, s.IndexOfAny (c, 0, s.Length), "#C4"); + Assert.AreEqual (12, s.IndexOfAny (c, 1, s.Length - 1), "#C5"); c = new char [0]; - AssertEquals ("#D1", -1, s.IndexOfAny (c, 0, 3)); - AssertEquals ("#D2", -1, s.IndexOfAny (c, 4, 9)); - AssertEquals ("#D3", -1, s.IndexOfAny (c, 9, 5)); - AssertEquals ("#D4", -1, s.IndexOfAny (c, 13, 1)); + Assert.AreEqual (-1, s.IndexOfAny (c, 0, 3), "#D1"); + Assert.AreEqual (-1, s.IndexOfAny (c, 4, 9), "#D2"); + Assert.AreEqual (-1, s.IndexOfAny (c, 9, 5), "#D3"); + Assert.AreEqual (-1, s.IndexOfAny (c, 13, 1), "#D4"); } [Test] // IndexOfAny (Char [], Int32, Int32) @@ -2222,12 +2198,12 @@ public class StringTest : TestCase { try { "mono".IndexOfAny ((char []) null, 0, 0); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -2236,14 +2212,14 @@ public class StringTest : TestCase { try { "Mono".IndexOfAny (new char [1] { 'o' }, 1, -1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Count must be positive and count must refer to a // location within the string/array/collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -2254,14 +2230,14 @@ public class StringTest : TestCase try { s.IndexOfAny (new char [1] { 'd' }, 1, s.Length); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Count must be positive and count must refer to a // location within the string/array/collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -2270,14 +2246,14 @@ public class StringTest : TestCase { try { "Mono".IndexOfAny (new char [1] { 'o' }, -1, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Specified argument was out of the range of valid // values - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -2288,14 +2264,14 @@ public class StringTest : TestCase try { s.IndexOfAny (new char [1] { 'o' }, s.Length + 1, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Specified argument was out of the range of valid // values - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertNull ("#5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsNull (ex.ParamName, "#5"); } } @@ -2303,10 +2279,10 @@ public class StringTest : TestCase [Test] public void Contains () { - Assert ("ABC".Contains (string.Empty)); - Assert ("ABC".Contains ("ABC")); - Assert ("ABC".Contains ("AB")); - Assert (!"ABC".Contains ("AD")); + Assert.IsTrue ("ABC".Contains (string.Empty)); + Assert.IsTrue ("ABC".Contains ("ABC")); + Assert.IsTrue ("ABC".Contains ("AB")); + Assert.IsTrue (!"ABC".Contains ("AD")); } [Test] @@ -2314,25 +2290,25 @@ public class StringTest : TestCase { try { "ABC".Contains (null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("value", ex.ParamName, "#5"); } } [Test] public void IsNullOrEmpty () { - Assert (String.IsNullOrEmpty (null)); - Assert (String.IsNullOrEmpty (String.Empty)); - Assert (String.IsNullOrEmpty ("")); - Assert (!String.IsNullOrEmpty ("A")); - Assert (!String.IsNullOrEmpty (" ")); - Assert (!String.IsNullOrEmpty ("\t")); - Assert (!String.IsNullOrEmpty ("\n")); + Assert.IsTrue (String.IsNullOrEmpty (null)); + Assert.IsTrue (String.IsNullOrEmpty (String.Empty)); + Assert.IsTrue (String.IsNullOrEmpty ("")); + Assert.IsTrue (!String.IsNullOrEmpty ("A")); + Assert.IsTrue (!String.IsNullOrEmpty (" ")); + Assert.IsTrue (!String.IsNullOrEmpty ("\t")); + Assert.IsTrue (!String.IsNullOrEmpty ("\n")); } #endif @@ -2343,46 +2319,46 @@ public class StringTest : TestCase try { s1.Insert (0, null); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentNullException ex) { - AssertEquals ("#A2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("value", ex.ParamName, "#A5"); } try { s1.Insert (s1.Length + 1, "Hi!"); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#B5"); } - AssertEquals("#C1", "Hi!original", s1.Insert (0, "Hi!")); - AssertEquals("#C2", "originalHi!", s1.Insert (s1.Length, "Hi!")); - AssertEquals("#C3", "origHi!inal", s1.Insert (4, "Hi!")); + Assert.AreEqual ("Hi!original", s1.Insert (0, "Hi!"), "#C1"); + Assert.AreEqual ("originalHi!", s1.Insert (s1.Length, "Hi!"), "#C2"); + Assert.AreEqual ("origHi!inal", s1.Insert (4, "Hi!"), "#C3"); } [Test] public void Intern () { string s1 = "original"; - AssertSame ("#A1", s1, String.Intern (s1)); - AssertSame ("#A2", String.Intern(s1), String.Intern(s1)); + Assert.AreSame (s1, String.Intern (s1), "#A1"); + Assert.AreSame (String.Intern(s1), String.Intern(s1), "#A2"); string s2 = "originally"; - AssertSame ("#B1", s2, String.Intern (s2)); - Assert ("#B2", String.Intern(s1) != String.Intern(s2)); + Assert.AreSame (s2, String.Intern (s2), "#B1"); + Assert.IsTrue (String.Intern(s1) != String.Intern(s2), "#B2"); string s3 = new DateTime (2000, 3, 7).ToString (); - AssertNull ("#C1", String.IsInterned (s3)); - AssertSame ("#C2", s3, String.Intern (s3)); - AssertSame ("#C3", s3, String.IsInterned (s3)); - AssertSame ("#C4", s3, String.IsInterned (new DateTime (2000, 3, 7).ToString ())); - AssertSame ("#C5", s3, String.Intern (new DateTime (2000, 3, 7).ToString ())); + Assert.IsNull (String.IsInterned (s3), "#C1"); + Assert.AreSame (s3, String.Intern (s3), "#C2"); + Assert.AreSame (s3, String.IsInterned (s3), "#C3"); + Assert.AreSame (s3, String.IsInterned (new DateTime (2000, 3, 7).ToString ()), "#C4"); + Assert.AreSame (s3, String.Intern (new DateTime (2000, 3, 7).ToString ()), "#C5"); } [Test] @@ -2390,21 +2366,21 @@ public class StringTest : TestCase { try { String.Intern (null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "str", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("str", ex.ParamName, "#5"); } } [Test] public void IsInterned () { - AssertNull ("#1", String.IsInterned (new DateTime (2000, 3, 6).ToString ())); + Assert.IsNull (String.IsInterned (new DateTime (2000, 3, 6).ToString ()), "#1"); string s1 = "original"; - AssertSame("#2", s1, String.IsInterned (s1)); + Assert.AreSame (s1, String.IsInterned (s1), "#2"); } [Test] @@ -2412,12 +2388,12 @@ public class StringTest : TestCase { try { String.IsInterned (null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "str", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("str", ex.ParamName, "#5"); } } @@ -2426,35 +2402,30 @@ public class StringTest : TestCase { try { string s = String.Join(" ", null); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentNullException ex) { - AssertEquals ("#A2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("value", ex.ParamName, "#A5"); } string[] chunks = {"this", "is", "a", "test"}; - AssertEquals("Basic join", "this is a test", - String.Join(" ", chunks)); - AssertEquals("Basic join", "this.is.a.test", - String.Join(".", chunks)); + Assert.AreEqual ("this is a test", String.Join(" ", chunks), "Basic join"); + Assert.AreEqual ("this.is.a.test", String.Join(".", chunks), "Basic join"); - AssertEquals("Subset join", "is a", - String.Join(" ", chunks, 1, 2)); - AssertEquals("Subset join", "is.a", - String.Join(".", chunks, 1, 2)); - AssertEquals("Subset join", "is a test", - String.Join(" ", chunks, 1, 3)); + Assert.AreEqual ("is a", String.Join(" ", chunks, 1, 2), "Subset join"); + Assert.AreEqual ("is.a", String.Join(".", chunks, 1, 2), "Subset join"); + Assert.AreEqual ("is a test", String.Join(" ", chunks, 1, 3), "Subset join"); try { string s = String.Join(" ", chunks, 2, 3); - Fail ("#C1"); + Assert.Fail ("#C1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#C2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#C3", ex.InnerException); - AssertNotNull ("#C4", ex.Message); - AssertEquals ("#C5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#C5"); } } @@ -2462,27 +2433,27 @@ public class StringTest : TestCase public void Join_SeparatorNull () { string[] chunks = {"this", "is", "a", "test"}; - AssertEquals ("SeparatorNull", "thisisatest", String.Join (null, chunks)); + Assert.AreEqual ("thisisatest", String.Join (null, chunks), "SeparatorNull"); } [Test] public void Join_ValuesNull () { string[] chunks1 = {null, "is", "a", null}; - AssertEquals ("SomeNull", " is a ", String.Join (" ", chunks1)); + Assert.AreEqual (" is a ", String.Join (" ", chunks1), "SomeNull"); string[] chunks2 = {null, "is", "a", null}; - AssertEquals ("Some+Sep=Null", "isa", String.Join (null, chunks2)); + Assert.AreEqual ("isa", String.Join (null, chunks2), "Some+Sep=Null"); string[] chunks3 = {null, null, null, null}; - AssertEquals ("AllValuesNull", " ", String.Join (" ", chunks3)); + Assert.AreEqual (" ", String.Join (" ", chunks3), "AllValuesNull"); } [Test] public void Join_AllNull () { string[] chunks = {null, null, null}; - AssertEquals ("AllNull", string.Empty, String.Join (null, chunks)); + Assert.AreEqual (string.Empty, String.Join (null, chunks), "AllNull"); } [Test] @@ -2491,12 +2462,12 @@ public class StringTest : TestCase string[] values = { "Mo", "no" }; try { String.Join ("o", values, -1, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -2506,12 +2477,12 @@ public class StringTest : TestCase string[] values = { "Mo", "no" }; try { String.Join ("o", values, Int32.MaxValue, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -2521,12 +2492,12 @@ public class StringTest : TestCase string[] values = { "Mo", "no" }; try { String.Join ("o", values, 1, -1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -2536,12 +2507,12 @@ public class StringTest : TestCase string[] values = { "Mo", "no" }; try { String.Join ("o", values, 1, Int32.MaxValue); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -2552,145 +2523,125 @@ public class StringTest : TestCase try { s1.LastIndexOf ('q', -1); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#A5"); } try { s1.LastIndexOf ('q', -1, 1); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#B5"); } try { s1.LastIndexOf ("huh", s1.Length + 1); - Fail ("#C1"); + Assert.Fail ("#C1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#C2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#C3", ex.InnerException); - AssertNotNull ("#C4", ex.Message); - AssertEquals ("#C5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#C5"); } try { int i = s1.LastIndexOf ("huh", s1.Length + 1, 3); - Fail ("#D1"); + Assert.Fail ("#D1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#D2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#D3", ex.InnerException); - AssertNotNull ("#D4", ex.Message); - AssertEquals ("#D5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#D2"); + Assert.IsNull (ex.InnerException, "#D3"); + Assert.IsNotNull (ex.Message, "#D4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#D5"); } try { s1.LastIndexOf (null); - Fail ("#E1"); + Assert.Fail ("#E1"); } catch (ArgumentNullException ex) { - AssertEquals ("#E2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#E3", ex.InnerException); - AssertNotNull ("#E4", ex.Message); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#E2"); + Assert.IsNull (ex.InnerException, "#E3"); + Assert.IsNotNull (ex.Message, "#E4"); #if NET_2_0 - AssertEquals ("#E5", "value", ex.ParamName); + Assert.AreEqual ("value", ex.ParamName, "#E5"); #else - AssertEquals ("#E5", "string2", ex.ParamName); + Assert.AreEqual ("string2", ex.ParamName, "#E5"); #endif } try { s1.LastIndexOf (null, 0); - Fail ("#F1"); + Assert.Fail ("#F1"); } catch (ArgumentNullException ex) { - AssertEquals ("#F2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#F3", ex.InnerException); - AssertNotNull ("#F4", ex.Message); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#F2"); + Assert.IsNull (ex.InnerException, "#F3"); + Assert.IsNotNull (ex.Message, "#F4"); #if NET_2_0 - AssertEquals ("#F5", "value", ex.ParamName); + Assert.AreEqual ("value", ex.ParamName, "#F5"); #else - AssertEquals ("#F5", "string2", ex.ParamName); + Assert.AreEqual ("string2", ex.ParamName, "#F5"); #endif } try { s1.LastIndexOf (null, 0, 1); - Fail ("#G1"); + Assert.Fail ("#G1"); } catch (ArgumentNullException ex) { - AssertEquals ("#G2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#G3", ex.InnerException); - AssertNotNull ("#G4", ex.Message); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#G2"); + Assert.IsNull (ex.InnerException, "#G3"); + Assert.IsNotNull (ex.Message, "#G4"); #if NET_2_0 - AssertEquals ("#G5", "value", ex.ParamName); + Assert.AreEqual ("value", ex.ParamName, "#G5"); #else - AssertEquals ("#G5", "string2", ex.ParamName); + Assert.AreEqual ("string2", ex.ParamName, "#G5"); #endif } - AssertEquals("basic char index", 1, s1.LastIndexOf('r')); - AssertEquals("basic char index", 4, s1.LastIndexOf('i')); - AssertEquals("basic char index - no", -1, s1.LastIndexOf('q')); - - AssertEquals("basic string index", 7, s1.LastIndexOf(string.Empty)); - AssertEquals("basic string index", 1, s1.LastIndexOf("rig")); - AssertEquals("basic string index", 4, s1.LastIndexOf("i")); - AssertEquals("basic string index - no", -1, - s1.LastIndexOf("rag")); - - AssertEquals("stepped char index", 1, - s1.LastIndexOf('r', s1.Length-1)); - AssertEquals("stepped char index", 4, - s1.LastIndexOf('i', s1.Length-1)); - AssertEquals("stepped char index", 2, - s1.LastIndexOf('i', 3)); - AssertEquals("stepped char index", -1, - s1.LastIndexOf('i', 1)); - - AssertEquals("stepped limited char index", - 1, s1.LastIndexOf('r', 1, 1)); - AssertEquals("stepped limited char index", - -1, s1.LastIndexOf('r', 0, 1)); - AssertEquals("stepped limited char index", - 4, s1.LastIndexOf('i', 6, 3)); - AssertEquals("stepped limited char index", - 2, s1.LastIndexOf('i', 3, 3)); - AssertEquals("stepped limited char index", - -1, s1.LastIndexOf('i', 1, 2)); + Assert.AreEqual (1, s1.LastIndexOf('r'), "basic char index"); + Assert.AreEqual (4, s1.LastIndexOf('i'), "basic char index"); + Assert.AreEqual (-1, s1.LastIndexOf('q'), "basic char index - no"); + + Assert.AreEqual (7, s1.LastIndexOf(string.Empty), "basic string index"); + Assert.AreEqual (1, s1.LastIndexOf("rig"), "basic string index"); + Assert.AreEqual (4, s1.LastIndexOf("i"), "basic string index"); + Assert.AreEqual (-1, s1.LastIndexOf("rag"), "basic string index - no"); + + Assert.AreEqual (1, s1.LastIndexOf('r', s1.Length-1), "stepped char index"); + Assert.AreEqual (4, s1.LastIndexOf('i', s1.Length-1), "stepped char index"); + Assert.AreEqual (2, s1.LastIndexOf('i', 3), "stepped char index"); + Assert.AreEqual (-1, s1.LastIndexOf('i', 1), "stepped char index"); + + Assert.AreEqual (1, s1.LastIndexOf('r', 1, 1), "stepped limited char index"); + Assert.AreEqual (-1, s1.LastIndexOf('r', 0, 1), "stepped limited char index"); + Assert.AreEqual (4, s1.LastIndexOf('i', 6, 3), "stepped limited char index"); + Assert.AreEqual (2, s1.LastIndexOf('i', 3, 3), "stepped limited char index"); + Assert.AreEqual (-1, s1.LastIndexOf('i', 1, 2), "stepped limited char index"); s1 = "original original"; - AssertEquals("stepped string index #1", - 9, s1.LastIndexOf("original", s1.Length)); - AssertEquals("stepped string index #2", - 0, s1.LastIndexOf("original", s1.Length-2)); - AssertEquals("stepped string index #3", - -1, s1.LastIndexOf("original", s1.Length-11)); - AssertEquals("stepped string index #4", - -1, s1.LastIndexOf("translator", 2)); - AssertEquals("stepped string index #5", - 0, string.Empty.LastIndexOf(string.Empty, 0)); + Assert.AreEqual (9, s1.LastIndexOf("original", s1.Length), "stepped string index #1"); + Assert.AreEqual (0, s1.LastIndexOf("original", s1.Length-2), "stepped string index #2"); + Assert.AreEqual (-1, s1.LastIndexOf("original", s1.Length-11), "stepped string index #3"); + Assert.AreEqual (-1, s1.LastIndexOf("translator", 2), "stepped string index #4"); + Assert.AreEqual (0, string.Empty.LastIndexOf(string.Empty, 0), "stepped string index #5"); #if !TARGET_JVM - AssertEquals("stepped string index #6", - -1, string.Empty.LastIndexOf("A", -1)); + Assert.AreEqual (-1, string.Empty.LastIndexOf("A", -1), "stepped string index #6"); #endif - AssertEquals("stepped limited string index #1", - 10, s1.LastIndexOf("rig", s1.Length-1, 10)); - AssertEquals("stepped limited string index #2", - -1, s1.LastIndexOf("rig", s1.Length, 3)); - AssertEquals("stepped limited string index #3", - 10, s1.LastIndexOf("rig", s1.Length-2, 15)); - AssertEquals("stepped limited string index #4", - -1, s1.LastIndexOf("rig", s1.Length-2, 3)); + Assert.AreEqual (10, s1.LastIndexOf("rig", s1.Length-1, 10), "stepped limited string index #1"); + Assert.AreEqual (-1, s1.LastIndexOf("rig", s1.Length, 3), "stepped limited string index #2"); + Assert.AreEqual (10, s1.LastIndexOf("rig", s1.Length-2, 15), "stepped limited string index #3"); + Assert.AreEqual (-1, s1.LastIndexOf("rig", s1.Length-2, 3), "stepped limited string index #4"); string s2 = "QBitArray::bitarr_data"; - AssertEquals ("bug #62160", 9, s2.LastIndexOf ("::")); + Assert.AreEqual (9, s2.LastIndexOf ("::"), "bug #62160"); string s3 = "test123"; - AssertEquals ("bug #77412", 0, s3.LastIndexOf ("test123")); + Assert.AreEqual (0, s3.LastIndexOf ("test123"), "bug #77412"); } #if NET_2_0 @@ -2736,65 +2687,65 @@ public class StringTest : TestCase string text2 = "123"; string text3 = "NG"; string text4 = "t"; - AssertEquals ("#1-1", 7, text.LastIndexOf (text2, StringComparison.Ordinal)); - AssertEquals ("#2-1", 5, text.LastIndexOf (text3, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (7, text.LastIndexOf (text2, StringComparison.Ordinal), "#1-1"); + Assert.AreEqual (5, text.LastIndexOf (text3, StringComparison.OrdinalIgnoreCase), "#2-1"); - AssertEquals ("#1-2", 7, text.LastIndexOf (text2, 12, StringComparison.Ordinal)); - AssertEquals ("#2-2", 5, text.LastIndexOf (text3, 12, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (7, text.LastIndexOf (text2, 12, StringComparison.Ordinal), "#1-2"); + Assert.AreEqual (5, text.LastIndexOf (text3, 12, StringComparison.OrdinalIgnoreCase), "#2-2"); - AssertEquals ("#1-3", -1, text.LastIndexOf (text2, 0, StringComparison.Ordinal)); - AssertEquals ("#2-3", -1, text.LastIndexOf (text3, 0, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (-1, text.LastIndexOf (text2, 0, StringComparison.Ordinal), "#1-3"); + Assert.AreEqual (-1, text.LastIndexOf (text3, 0, StringComparison.OrdinalIgnoreCase), "#2-3"); - AssertEquals ("#1-4", -1, text.LastIndexOf (text2, 6, StringComparison.Ordinal)); - AssertEquals ("#2-4", 5, text.LastIndexOf (text3, 6, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (-1, text.LastIndexOf (text2, 6, StringComparison.Ordinal), "#1-4"); + Assert.AreEqual (5, text.LastIndexOf (text3, 6, StringComparison.OrdinalIgnoreCase), "#2-4"); - AssertEquals ("#1-5", -1, text.LastIndexOf (text2, 7, 3, StringComparison.Ordinal)); - AssertEquals ("#2-5", 5, text.LastIndexOf (text3, 7, 3, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (-1, text.LastIndexOf (text2, 7, 3, StringComparison.Ordinal), "#1-5"); + Assert.AreEqual (5, text.LastIndexOf (text3, 7, 3, StringComparison.OrdinalIgnoreCase), "#2-5"); - AssertEquals ("#1-6", -1, text.LastIndexOf (text2, 6, 0, StringComparison.Ordinal)); - AssertEquals ("#2-6", -1, text.LastIndexOf (text3, 5, 0, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (-1, text.LastIndexOf (text2, 6, 0, StringComparison.Ordinal), "#1-6"); + Assert.AreEqual (-1, text.LastIndexOf (text3, 5, 0, StringComparison.OrdinalIgnoreCase), "#2-6"); - AssertEquals ("#1-7", -1, text.LastIndexOf (text2, 7, 1, StringComparison.Ordinal)); - AssertEquals ("#2-7", -1, text.LastIndexOf (text3, 5, 1, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (-1, text.LastIndexOf (text2, 7, 1, StringComparison.Ordinal), "#1-7"); + Assert.AreEqual (-1, text.LastIndexOf (text3, 5, 1, StringComparison.OrdinalIgnoreCase), "#2-7"); - AssertEquals ("#3-1", 0, text.LastIndexOf (text4, 0, StringComparison.Ordinal)); - AssertEquals ("#3-2", 0, text.LastIndexOf (text4, 0, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (0, text.LastIndexOf (text4, 0, StringComparison.Ordinal), "#3-1"); + Assert.AreEqual (0, text.LastIndexOf (text4, 0, StringComparison.OrdinalIgnoreCase), "#3-2"); - AssertEquals ("#4-1", 3, text.LastIndexOf (text4, 13, StringComparison.Ordinal)); - AssertEquals ("#4-2", 3, text.LastIndexOf (text4, 13, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (3, text.LastIndexOf (text4, 13, StringComparison.Ordinal), "#4-1"); + Assert.AreEqual (3, text.LastIndexOf (text4, 13, StringComparison.OrdinalIgnoreCase), "#4-2"); - AssertEquals ("#4-1", 3, text.LastIndexOf (text4, 13, 14, StringComparison.Ordinal)); - AssertEquals ("#4-2", 3, text.LastIndexOf (text4, 13, 14, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (3, text.LastIndexOf (text4, 13, 14, StringComparison.Ordinal), "#4-1"); + Assert.AreEqual (3, text.LastIndexOf (text4, 13, 14, StringComparison.OrdinalIgnoreCase), "#4-2"); - AssertEquals ("#5-1", 0, text.LastIndexOf (text4, 1, 2, StringComparison.Ordinal)); - AssertEquals ("#5-2", 0, text.LastIndexOf (text4, 1, 2, StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (0, text.LastIndexOf (text4, 1, 2, StringComparison.Ordinal), "#5-1"); + Assert.AreEqual (0, text.LastIndexOf (text4, 1, 2, StringComparison.OrdinalIgnoreCase), "#5-2"); - AssertEquals (-1, "".LastIndexOf ("FOO", StringComparison.Ordinal)); - AssertEquals (0, "".LastIndexOf ("", StringComparison.Ordinal)); + Assert.AreEqual (-1, "".LastIndexOf ("FOO", StringComparison.Ordinal)); + Assert.AreEqual (0, "".LastIndexOf ("", StringComparison.Ordinal)); } [Test] public void LastIndexOfStringComparisonOrdinal () { string text = "testing123456"; - AssertEquals ("#1", 10, text.LastIndexOf ("456", StringComparison.Ordinal)); - AssertEquals ("#2", -1, text.LastIndexOf ("4567", StringComparison.Ordinal)); - AssertEquals ("#3", 0, text.LastIndexOf ("te", StringComparison.Ordinal)); - AssertEquals ("#4", 2, text.LastIndexOf ("s", StringComparison.Ordinal)); - AssertEquals ("#5", -1, text.LastIndexOf ("ates", StringComparison.Ordinal)); - AssertEquals ("#6", -1, text.LastIndexOf ("S", StringComparison.Ordinal)); + Assert.AreEqual (10, text.LastIndexOf ("456", StringComparison.Ordinal), "#1"); + Assert.AreEqual (-1, text.LastIndexOf ("4567", StringComparison.Ordinal), "#2"); + Assert.AreEqual (0, text.LastIndexOf ("te", StringComparison.Ordinal), "#3"); + Assert.AreEqual (2, text.LastIndexOf ("s", StringComparison.Ordinal), "#4"); + Assert.AreEqual (-1, text.LastIndexOf ("ates", StringComparison.Ordinal), "#5"); + Assert.AreEqual (-1, text.LastIndexOf ("S", StringComparison.Ordinal), "#6"); } [Test] public void LastIndexOfStringComparisonOrdinalIgnoreCase () { string text = "testing123456"; - AssertEquals ("#1", 10, text.LastIndexOf ("456", StringComparison.OrdinalIgnoreCase)); - AssertEquals ("#2", -1, text.LastIndexOf ("4567", StringComparison.OrdinalIgnoreCase)); - AssertEquals ("#3", 0, text.LastIndexOf ("te", StringComparison.OrdinalIgnoreCase)); - AssertEquals ("#4", 2, text.LastIndexOf ("s", StringComparison.OrdinalIgnoreCase)); - AssertEquals ("#5", -1, text.LastIndexOf ("ates", StringComparison.OrdinalIgnoreCase)); - AssertEquals ("#6", 2, text.LastIndexOf ("S", StringComparison.OrdinalIgnoreCase)); + Assert.AreEqual (10, text.LastIndexOf ("456", StringComparison.OrdinalIgnoreCase), "#1"); + Assert.AreEqual (-1, text.LastIndexOf ("4567", StringComparison.OrdinalIgnoreCase), "#2"); + Assert.AreEqual (0, text.LastIndexOf ("te", StringComparison.OrdinalIgnoreCase), "#3"); + Assert.AreEqual (2, text.LastIndexOf ("s", StringComparison.OrdinalIgnoreCase), "#4"); + Assert.AreEqual (-1, text.LastIndexOf ("ates", StringComparison.OrdinalIgnoreCase), "#5"); + Assert.AreEqual (2, text.LastIndexOf ("S", StringComparison.OrdinalIgnoreCase), "#6"); } #endif @@ -2804,12 +2755,12 @@ public class StringTest : TestCase string s = "Mono"; try { s.LastIndexOf ('n', s.Length, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } // this works for string but not for a char } @@ -2819,12 +2770,12 @@ public class StringTest : TestCase { try { "Mono".LastIndexOf ('o', Int32.MaxValue, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -2833,12 +2784,12 @@ public class StringTest : TestCase { try { "Mono".LastIndexOf ('o', 1, Int32.MaxValue); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -2846,7 +2797,7 @@ public class StringTest : TestCase public void LastIndexOf_String_StartIndexStringLength () { string s = "Mono"; - AssertEquals (-1, s.LastIndexOf ("n", s.Length, 1)); + Assert.AreEqual (-1, s.LastIndexOf ("n", s.Length, 1)); // this works for string but not for a char } @@ -2856,12 +2807,12 @@ public class StringTest : TestCase string s = "Mono"; try { s.LastIndexOf ("n", s.Length + 1, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -2870,12 +2821,12 @@ public class StringTest : TestCase { try { "Mono".LastIndexOf ("no", Int32.MaxValue, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -2884,12 +2835,12 @@ public class StringTest : TestCase { try { "Mono".LastIndexOf ("no", 1, Int32.MaxValue); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -2900,63 +2851,63 @@ public class StringTest : TestCase try { s1.LastIndexOfAny (null); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentNullException ex) { - AssertEquals ("#A2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertNull ("#A5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.IsNull (ex.ParamName, "#A5"); } try { s1.LastIndexOfAny (null, s1.Length); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentNullException ex) { - AssertEquals ("#B2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertNull ("#B5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.IsNull (ex.ParamName, "#B5"); } try { s1.LastIndexOfAny (null, s1.Length, 1); - Fail ("#C1"); + Assert.Fail ("#C1"); } catch (ArgumentNullException ex) { - AssertEquals ("#C2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#C3", ex.InnerException); - AssertNotNull ("#C4", ex.Message); - AssertNull ("#C5", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.IsNull (ex.ParamName, "#C5"); } char[] c1 = {'a', 'e', 'i', 'o', 'u'}; - AssertEquals("#D1", 8, s1.LastIndexOfAny (c1)); - AssertEquals("#D2", 4, s1.LastIndexOfAny (c1, 7)); - AssertEquals("#D3", -1, s1.LastIndexOfAny (c1, 3)); - AssertEquals("#D4", 4, s1.LastIndexOfAny (c1, s1.Length - 6, 4)); - AssertEquals("#D5", -1, s1.LastIndexOfAny (c1, s1.Length - 6, 3)); + Assert.AreEqual (8, s1.LastIndexOfAny (c1), "#D1"); + Assert.AreEqual (4, s1.LastIndexOfAny (c1, 7), "#D2"); + Assert.AreEqual (-1, s1.LastIndexOfAny (c1, 3), "#D3"); + Assert.AreEqual (4, s1.LastIndexOfAny (c1, s1.Length - 6, 4), "#D4"); + Assert.AreEqual (-1, s1.LastIndexOfAny (c1, s1.Length - 6, 3), "#D5"); try { s1.LastIndexOfAny (c1, -1); - Fail ("#E1"); + Assert.Fail ("#E1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#E2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#E3", ex.InnerException); - AssertNotNull ("#E4", ex.Message); - AssertEquals ("#E5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#E2"); + Assert.IsNull (ex.InnerException, "#E3"); + Assert.IsNotNull (ex.Message, "#E4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#E5"); } try { s1.LastIndexOfAny (c1, -1, 1); - Fail ("#F1"); + Assert.Fail ("#F1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#F2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#F3", ex.InnerException); - AssertNotNull ("#F4", ex.Message); - AssertEquals ("#F5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#F2"); + Assert.IsNull (ex.InnerException, "#F3"); + Assert.IsNotNull (ex.Message, "#F4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#F5"); } } @@ -2965,14 +2916,14 @@ public class StringTest : TestCase { try { "Mono".LastIndexOfAny (new char [1] { 'o' }, 1, Int32.MaxValue); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Count must be positive and count must refer to a // location within the string/array/collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -2981,14 +2932,14 @@ public class StringTest : TestCase { try { "Mono".LastIndexOfAny (new char [1] { 'o' }, Int32.MaxValue, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -2999,17 +2950,17 @@ public class StringTest : TestCase string result; result = s1.PadLeft (0); - AssertSame ("#A", s1, result); + Assert.AreSame (s1, result, "#A"); result = s1.PadLeft (s1.Length - 1); - AssertSame ("#B", s1, result); + Assert.AreSame (s1, result, "#B"); result = s1.PadLeft (s1.Length); - AssertEquals ("#C1", s1, result); - Assert ("#C2", !object.ReferenceEquals (s1, result)); + Assert.AreEqual (s1, result, "#C1"); + Assert.IsTrue (!object.ReferenceEquals (s1, result), "#C2"); result = s1.PadLeft (s1.Length + 1); - AssertEquals("#D", " Hi!", result); + Assert.AreEqual (" Hi!", result, "#D"); } [Test] // PadLeft (Int32) @@ -3017,12 +2968,12 @@ public class StringTest : TestCase { try { "Mono".PadLeft (-1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "totalWidth", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("totalWidth", ex.ParamName, "#5"); } } @@ -3033,17 +2984,17 @@ public class StringTest : TestCase string result; result = s1.PadRight (0); - AssertSame ("#A", s1, result); + Assert.AreSame (s1, result, "#A"); result = s1.PadRight (s1.Length - 1); - AssertSame ("#B", s1, result); + Assert.AreSame (s1, result, "#B"); result = s1.PadRight (s1.Length); - AssertEquals ("#C1", s1, result); - Assert ("#C2", !object.ReferenceEquals (s1, result)); + Assert.AreEqual (s1, result, "#C1"); + Assert.IsTrue (!object.ReferenceEquals (s1, result), "#C2"); result = s1.PadRight (s1.Length + 1); - AssertEquals("#D", "Hi! ", result); + Assert.AreEqual ("Hi! ", result, "#D"); } [Test] // PadRight1 (Int32) @@ -3051,12 +3002,12 @@ public class StringTest : TestCase { try { "Mono".PadRight (-1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "totalWidth", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("totalWidth", ex.ParamName, "#5"); } } @@ -3067,43 +3018,43 @@ public class StringTest : TestCase try { s1.Remove (-1, 1); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { // StartIndex cannot be less than zero - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#A5"); } try { s1.Remove (1,-1); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { // Count cannot be less than zero - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("count", ex.ParamName, "#B5"); } try { s1.Remove (s1.Length, s1.Length); - Fail ("#C1"); + Assert.Fail ("#C1"); } catch (ArgumentOutOfRangeException ex) { // Index and count must refer to a location within the // string - AssertEquals ("#C2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#C3", ex.InnerException); - AssertNotNull ("#C4", ex.Message); - AssertEquals ("#C5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.AreEqual ("count", ex.ParamName, "#C5"); } - AssertEquals ("#D1", "oinal", s1.Remove(1, 3)); - AssertEquals ("#D2", s1, s1.Remove (0, 0)); - Assert ("#D3", !object.ReferenceEquals (s1, s1.Remove (0, 0))); - AssertEquals ("#D4", "riginal", s1.Remove (0, 1)); - AssertEquals ("#D5", "origina", s1.Remove (7, 1)); + Assert.AreEqual ("oinal", s1.Remove(1, 3), "#D1"); + Assert.AreEqual (s1, s1.Remove (0, 0), "#D2"); + Assert.IsTrue (!object.ReferenceEquals (s1, s1.Remove (0, 0)), "#D3"); + Assert.AreEqual ("riginal", s1.Remove (0, 1), "#D4"); + Assert.AreEqual ("origina", s1.Remove (7, 1), "#D5"); } [Test] // Remove (Int32, Int32) @@ -3111,14 +3062,14 @@ public class StringTest : TestCase { try { "Mono".Remove (1, Int32.MaxValue); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index and count must refer to a location within the // string - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -3127,14 +3078,14 @@ public class StringTest : TestCase { try { "Mono".Remove (Int32.MaxValue, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index and count must refer to a location within the // string - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -3144,13 +3095,13 @@ public class StringTest : TestCase { try { "ABC".Remove (-1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // StartIndex cannot be less than zero - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -3159,13 +3110,13 @@ public class StringTest : TestCase { try { "ABC".Remove (3); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // startIndex must be less than length of string - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -3174,9 +3125,9 @@ public class StringTest : TestCase { string s = "ABC"; - AssertEquals ("#1", "AB", s.Remove (2)); - AssertEquals ("#2", string.Empty, s.Remove (0)); - AssertEquals ("#3", "A", s.Remove (1)); + Assert.AreEqual ("AB", s.Remove (2), "#1"); + Assert.AreEqual (string.Empty, s.Remove (0), "#2"); + Assert.AreEqual ("A", s.Remove (1), "#3"); } #endif @@ -3185,9 +3136,9 @@ public class StringTest : TestCase { string s1 = "original"; - AssertEquals("non-hit char", s1, s1.Replace('q','s')); - AssertEquals("single char", "oxiginal", s1.Replace('r', 'x')); - AssertEquals("double char", "orxgxnal", s1.Replace('i', 'x')); + Assert.AreEqual (s1, s1.Replace('q', 's'), "non-hit char"); + Assert.AreEqual ("oxiginal", s1.Replace('r', 'x'), "single char"); + Assert.AreEqual ("orxgxnal", s1.Replace('i', 'x'), "double char"); bool errorThrown = false; try { @@ -3195,34 +3146,30 @@ public class StringTest : TestCase } catch (ArgumentNullException) { errorThrown = true; } - Assert("should get null arg exception", errorThrown); + Assert.IsTrue (errorThrown, "should get null arg exception"); - AssertEquals("replace as remove", "ornal", - s1.Replace("igi", null)); - AssertEquals("non-hit string", s1, s1.Replace("spam", "eggs")); - AssertEquals("single string", "orirumal", - s1.Replace("gin", "rum")); - AssertEquals("double string", "oreigeinal", - s1.Replace("i", "ei")); + Assert.AreEqual ("ornal", s1.Replace("igi", null), "replace as remove"); + Assert.AreEqual (s1, s1.Replace("spam", "eggs"), "non-hit string"); + Assert.AreEqual ("orirumal", s1.Replace("gin", "rum"), "single string"); + Assert.AreEqual ("oreigeinal", s1.Replace("i", "ei"), "double string"); - AssertEquals("start", "ooriginal", s1.Replace("o", "oo")); - AssertEquals("end", "originall", s1.Replace("l", "ll")); + Assert.AreEqual ("ooriginal", s1.Replace("o", "oo"), "start"); + Assert.AreEqual ("originall", s1.Replace("l", "ll"), "end"); - AssertEquals("start empty", "riginal", s1.Replace("o", string.Empty)); - AssertEquals("end empty", "origina", s1.Replace("l", string.Empty)); + Assert.AreEqual ("riginal", s1.Replace("o", string.Empty), "start empty"); + Assert.AreEqual ("origina", s1.Replace("l", string.Empty), "end empty"); - AssertEquals("replace bigger that original", "original", s1.Replace("original2", "original3")); + Assert.AreEqual ("original", s1.Replace("original2", "original3"), "replace bigger that original"); - AssertEquals ("result longer", ":!:", "::".Replace ("::", ":!:")); + Assert.AreEqual (":!:", "::".Replace ("::", ":!:"), "result longer"); // Test overlapping matches (bug #54988) string s2 = "...aaaaaaa.bbbbbbbbb,............ccccccc.u..."; - AssertEquals ("..aaaaaaa.bbbbbbbbb,......ccccccc.u..", s2.Replace("..", ".")); + Assert.AreEqual (s2.Replace("..", "."), "..aaaaaaa.bbbbbbbbb,......ccccccc.u.."); // Test replacing null characters (bug #67395) #if !TARGET_JVM //bug #7276 - AssertEquals ("should not strip content after nullchar", - "is this ok ?", "is \0 ok ?".Replace ("\0", "this")); + Assert.AreEqual ("is this ok ?", "is \0 ok ?".Replace ("\0", "this"), "should not strip content after nullchar"); #endif } @@ -3231,16 +3178,16 @@ public class StringTest : TestCase { string s1 = "original"; - AssertEquals ("#1", "riginal", s1.Replace ("o", "")); - AssertEquals ("#2", "origina", s1.Replace ("l", "")); - AssertEquals ("#3", "ariginal", s1.Replace ("o", "a")); - AssertEquals ("#4", "originaa", s1.Replace ("l", "a")); - AssertEquals ("#5", "aariginal", s1.Replace ("o", "aa")); - AssertEquals ("#6", "originaaa", s1.Replace ("l", "aa")); - AssertEquals ("#7", "original", s1.Replace ("o", "o")); - AssertEquals ("#8", "original", s1.Replace ("l", "l")); - AssertEquals ("#9", "original", s1.Replace ("original", "original")); - AssertEquals ("#10", "", s1.Replace ("original", "")); + Assert.AreEqual ("riginal", s1.Replace ("o", ""), "#1"); + Assert.AreEqual ("origina", s1.Replace ("l", ""), "#2"); + Assert.AreEqual ("ariginal", s1.Replace ("o", "a"), "#3"); + Assert.AreEqual ("originaa", s1.Replace ("l", "a"), "#4"); + Assert.AreEqual ("aariginal", s1.Replace ("o", "aa"), "#5"); + Assert.AreEqual ("originaaa", s1.Replace ("l", "aa"), "#6"); + Assert.AreEqual ("original", s1.Replace ("o", "o"), "#7"); + Assert.AreEqual ("original", s1.Replace ("l", "l"), "#8"); + Assert.AreEqual ("original", s1.Replace ("original", "original"), "#9"); + Assert.AreEqual ("", s1.Replace ("original", ""), "#10"); } [Test] @@ -3249,24 +3196,24 @@ public class StringTest : TestCase string prev = new String ('o', 300); string s1 = prev + "riginal"; - AssertEquals ("#1", "riginal", s1.Replace ("o", "")); - AssertEquals ("#2", prev + "rigina", s1.Replace ("l", "")); - AssertEquals ("#3", new String ('a', 300) + "riginal", s1.Replace ("o", "a")); - AssertEquals ("#4", prev + "riginaa", s1.Replace ("l", "a")); - AssertEquals ("#5", new String ('a', 600) + "riginal", s1.Replace ("o", "aa")); - AssertEquals ("#6", prev + "riginaaa", s1.Replace ("l", "aa")); - AssertEquals ("#7", s1, s1.Replace ("o", "o")); - AssertEquals ("#8", s1, s1.Replace ("l", "l")); - AssertEquals ("#9", s1, s1.Replace (s1, s1)); - AssertEquals ("#10", "", s1.Replace (prev + "riginal", "")); + Assert.AreEqual ("riginal", s1.Replace ("o", ""), "#1"); + Assert.AreEqual (prev + "rigina", s1.Replace ("l", ""), "#2"); + Assert.AreEqual (new String ('a', 300) + "riginal", s1.Replace ("o", "a"), "#3"); + Assert.AreEqual (prev + "riginaa", s1.Replace ("l", "a"), "#4"); + Assert.AreEqual (new String ('a', 600) + "riginal", s1.Replace ("o", "aa"), "#5"); + Assert.AreEqual (prev + "riginaaa", s1.Replace ("l", "aa"), "#6"); + Assert.AreEqual (s1, s1.Replace ("o", "o"), "#7"); + Assert.AreEqual (s1, s1.Replace ("l", "l"), "#8"); + Assert.AreEqual (s1, s1.Replace (s1, s1), "#9"); + Assert.AreEqual ("", s1.Replace (prev + "riginal", ""), "#10"); } [Test] public void ReplaceStringOffByOne () { - AssertEquals ("#-1", "", new String ('o', 199).Replace ("o", "")); - AssertEquals ("#0", "", new String ('o', 200).Replace ("o", "")); - AssertEquals ("#+1", "", new String ('o', 201).Replace ("o", "")); + Assert.AreEqual ("", new String ('o', 199).Replace ("o", ""), "#-1"); + Assert.AreEqual ("", new String ('o', 200).Replace ("o", ""), "#0"); + Assert.AreEqual ("", new String ('o', 201).Replace ("o", ""), "#+1"); } [Test] @@ -3278,7 +3225,7 @@ public class StringTest : TestCase CultureInfo old = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US"); - AssertEquals ("#1", "AE", "AE".Replace ("\u00C6", "check")); + Assert.AreEqual ("AE", "AE".Replace ("\u00C6", "check"), "#1"); Thread.CurrentThread.CurrentCulture = old; } @@ -3287,12 +3234,12 @@ public class StringTest : TestCase { string s1 = "original"; - Assert ("#1", s1.StartsWith ("o")); - Assert ("#2", s1.StartsWith ("orig")); - Assert ("#3", !s1.StartsWith ("rig")); - Assert ("#4", s1.StartsWith (String.Empty)); - Assert ("#5", String.Empty.StartsWith (String.Empty)); - Assert ("#6", !String.Empty.StartsWith ("rig")); + Assert.IsTrue (s1.StartsWith ("o"), "#1"); + Assert.IsTrue (s1.StartsWith ("orig"), "#2"); + Assert.IsTrue (!s1.StartsWith ("rig"), "#3"); + Assert.IsTrue (s1.StartsWith (String.Empty), "#4"); + Assert.IsTrue (String.Empty.StartsWith (String.Empty), "#5"); + Assert.IsTrue (!String.Empty.StartsWith ("rig"), "#6"); } [Test] // StartsWith (String) @@ -3300,12 +3247,12 @@ public class StringTest : TestCase { try { "A".StartsWith (null); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("value", ex.ParamName, "#5"); } } @@ -3315,14 +3262,14 @@ public class StringTest : TestCase { try { "ABC".StartsWith ("A", (StringComparison) 80); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // The string comparison type passed in is currently // not supported - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "comparisonType", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("comparisonType", ex.ParamName, "#5"); } } @@ -3331,12 +3278,12 @@ public class StringTest : TestCase { try { "A".StartsWith (null, StringComparison.CurrentCulture); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentNullException ex) { - AssertEquals ("#2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "value", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("value", ex.ParamName, "#5"); } } @@ -3355,13 +3302,13 @@ public class StringTest : TestCase { string s = "original"; - AssertEquals("#1", "inal", s.Substring (4)); - AssertEquals ("#2", string.Empty, s.Substring (s.Length)); + Assert.AreEqual ("inal", s.Substring (4), "#1"); + Assert.AreEqual (string.Empty, s.Substring (s.Length), "#2"); #if NET_2_0 - AssertSame ("#3", s, s.Substring (0)); + Assert.AreSame (s, s.Substring (0), "#3"); #else - AssertEquals ("#3a", s, s.Substring (0)); - Assert ("#3b", !object.ReferenceEquals (s, s.Substring (0))); + Assert.AreEqual (s, s.Substring (0), "#3a"); + Assert.IsTrue (!object.ReferenceEquals (s, s.Substring (0)), "#3b"); #endif } @@ -3372,13 +3319,13 @@ public class StringTest : TestCase try { s.Substring (-1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // StartIndex cannot be less than zero - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -3389,16 +3336,16 @@ public class StringTest : TestCase try { s.Substring (s.Length + 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // startIndex cannot be larger than length of string - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); #if NET_2_0 - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); #else - AssertEquals ("#5", "length", ex.ParamName); + Assert.AreEqual ("length", ex.ParamName, "#5"); #endif } } @@ -3408,14 +3355,14 @@ public class StringTest : TestCase { string s = "original"; - AssertEquals ("#1", "igin", s.Substring (2, 4)); - AssertEquals ("#2", string.Empty, s.Substring (s.Length, 0)); - AssertEquals ("#3", "origina", s.Substring (0, s.Length - 1)); - AssertEquals ("#4", s, s.Substring (0, s.Length)); + Assert.AreEqual ("igin", s.Substring (2, 4), "#1"); + Assert.AreEqual (string.Empty, s.Substring (s.Length, 0), "#2"); + Assert.AreEqual ("origina", s.Substring (0, s.Length - 1), "#3"); + Assert.AreEqual (s, s.Substring (0, s.Length), "#4"); #if NET_2_0 - AssertSame ("#5", s, s.Substring (0, s.Length)); + Assert.AreSame (s, s.Substring (0, s.Length), "#5"); #else - Assert ("#5", !object.ReferenceEquals (s, s.Substring (0, s.Length))); + Assert.IsTrue (!object.ReferenceEquals (s, s.Substring (0, s.Length)), "#5"); #endif } @@ -3426,13 +3373,13 @@ public class StringTest : TestCase try { s.Substring (1, -1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Length cannot be less than zero - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "length", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("length", ex.ParamName, "#5"); } } @@ -3443,38 +3390,38 @@ public class StringTest : TestCase try { s.Substring (s.Length, 1); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { // Index and length must refer to a location within // the string - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "length", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("length", ex.ParamName, "#A5"); } try { s.Substring (1, s.Length); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { // Index and length must refer to a location within // the string - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "length", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("length", ex.ParamName, "#B5"); } try { s.Substring (1, Int32.MaxValue); - Fail ("#C1"); + Assert.Fail ("#C1"); } catch (ArgumentOutOfRangeException ex) { // Index and length must refer to a location within // the string - AssertEquals ("#C2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#C3", ex.InnerException); - AssertNotNull ("#C4", ex.Message); - AssertEquals ("#C5", "length", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2"); + Assert.IsNull (ex.InnerException, "#C3"); + Assert.IsNotNull (ex.Message, "#C4"); + Assert.AreEqual ("length", ex.ParamName, "#C5"); } } @@ -3485,13 +3432,13 @@ public class StringTest : TestCase try { s.Substring (-1, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // StartIndex cannot be less than zero - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -3502,31 +3449,31 @@ public class StringTest : TestCase try { s.Substring (s.Length + 1, 0); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { // startIndex cannot be larger than length of string - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); #if NET_2_0 - AssertEquals ("#A5", "startIndex", ex.ParamName); + Assert.AreEqual ("startIndex", ex.ParamName, "#A5"); #else - AssertEquals ("#A5", "length", ex.ParamName); + Assert.AreEqual ("length", ex.ParamName, "#A5"); #endif } try { "Mono".Substring (Int32.MaxValue, 1); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { // startIndex cannot be larger than length of string - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); #if NET_2_0 - AssertEquals ("#B5", "startIndex", ex.ParamName); + Assert.AreEqual ("startIndex", ex.ParamName, "#B5"); #else - AssertEquals ("#B5", "length", ex.ParamName); + Assert.AreEqual ("length", ex.ParamName, "#B5"); #endif } } @@ -3538,32 +3485,32 @@ public class StringTest : TestCase char [] c; c = s.ToCharArray (); - AssertEquals ("#A1", s.Length, c.Length); - AssertEquals ("#A2", s, new String (c)); + Assert.AreEqual (s.Length, c.Length, "#A1"); + Assert.AreEqual (s, new String (c), "#A2"); c = s.ToCharArray (0, s.Length); - AssertEquals ("#B1", s.Length, c.Length); - AssertEquals ("#B2", s, new String (c)); + Assert.AreEqual (s.Length, c.Length, "#B1"); + Assert.AreEqual (s, new String (c), "#B2"); c = s.ToCharArray (1, s.Length - 1); - AssertEquals ("#C1", 7, c.Length); - AssertEquals ("#C2", "riginal", new String (c)); + Assert.AreEqual (7, c.Length, "#C1"); + Assert.AreEqual ("riginal", new String (c), "#C2"); c = s.ToCharArray (0, 3); - AssertEquals ("#D1", 3, c.Length); - AssertEquals ("#D2", "ori", new String (c)); + Assert.AreEqual (3, c.Length, "#D1"); + Assert.AreEqual ("ori", new String (c), "#D2"); c = s.ToCharArray (2, 0); - AssertEquals ("#E1", 0, c.Length); - AssertEquals ("#E2", string.Empty, new String (c)); + Assert.AreEqual (0, c.Length, "#E1"); + Assert.AreEqual (string.Empty, new String (c), "#E2"); c = s.ToCharArray (3, 2); - AssertEquals ("#F1", 2, c.Length); - AssertEquals ("#F2", "gi", new String (c)); + Assert.AreEqual (2, c.Length, "#F1"); + Assert.AreEqual ("gi", new String (c), "#F2"); c = s.ToCharArray (s.Length, 0); - AssertEquals ("#G1", 0, c.Length); - AssertEquals ("#G2", string.Empty, new String (c)); + Assert.AreEqual (0, c.Length, "#G1"); + Assert.AreEqual (string.Empty, new String (c), "#G2"); } [Test] @@ -3573,12 +3520,12 @@ public class StringTest : TestCase try { s.ToCharArray (1, -1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "length", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("length", ex.ParamName, "#5"); } } @@ -3589,26 +3536,26 @@ public class StringTest : TestCase try { s.ToCharArray (1, s.Length); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#A5"); } try { s.ToCharArray (1, Int32.MaxValue); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#B5"); } } @@ -3619,14 +3566,14 @@ public class StringTest : TestCase try { s.ToCharArray (-1, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -3637,26 +3584,26 @@ public class StringTest : TestCase try { s.ToCharArray (s.Length, 1); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#A2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#A5"); } try { s.ToCharArray (Int32.MaxValue, 1); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentOutOfRangeException ex) { // Index was out of range. Must be non-negative and // less than the size of the collection - AssertEquals ("#B2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#B5"); } } @@ -3667,11 +3614,11 @@ public class StringTest : TestCase Thread.CurrentThread.CurrentCulture = new CultureInfo ("tr-TR"); - AssertEquals ("#1", "\u006f\u0072\u0131\u0067\u0131\u006e\u0061\u006c\u0069", s.ToLower()); + Assert.AreEqual ("\u006f\u0072\u0131\u0067\u0131\u006e\u0061\u006c\u0069", s.ToLower(), "#1"); Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US"); - AssertEquals ("#2", "originali", s.ToLower ()); + Assert.AreEqual ("originali", s.ToLower (), "#2"); } [Test] // ToLower (CultureInfo) @@ -3681,19 +3628,17 @@ public class StringTest : TestCase Thread.CurrentThread.CurrentCulture = new CultureInfo ("tr-TR"); - AssertEquals ("#A1", "originali", s.ToLower (new CultureInfo ("en-US"))); - AssertEquals ("#A2", "\u006f\u0072\u0131\u0067\u0131\u006e\u0061\u006c\u0069", - s.ToLower (new CultureInfo ("tr-TR"))); - AssertEquals ("#A3", string.Empty, string.Empty.ToLower (new CultureInfo ("en-US"))); - AssertEquals ("#A4", string.Empty, string.Empty.ToLower (new CultureInfo ("tr-TR"))); + Assert.AreEqual ("originali", s.ToLower (new CultureInfo ("en-US")), "#A1"); + Assert.AreEqual ("\u006f\u0072\u0131\u0067\u0131\u006e\u0061\u006c\u0069", s.ToLower (new CultureInfo ("tr-TR")), "#A2"); + Assert.AreEqual (string.Empty, string.Empty.ToLower (new CultureInfo ("en-US")), "#A3"); + Assert.AreEqual (string.Empty, string.Empty.ToLower (new CultureInfo ("tr-TR")), "#A4"); Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US"); - AssertEquals ("#B1", "originali", s.ToLower (new CultureInfo ("en-US"))); - AssertEquals ("#B2", "\u006f\u0072\u0131\u0067\u0131\u006e\u0061\u006c\u0069", - s.ToLower (new CultureInfo ("tr-TR"))); - AssertEquals ("#B3", string.Empty, string.Empty.ToLower (new CultureInfo ("en-US"))); - AssertEquals ("#B4", string.Empty, string.Empty.ToLower (new CultureInfo ("tr-TR"))); + Assert.AreEqual ("originali", s.ToLower (new CultureInfo ("en-US")), "#B1"); + Assert.AreEqual ("\u006f\u0072\u0131\u0067\u0131\u006e\u0061\u006c\u0069", s.ToLower (new CultureInfo ("tr-TR")), "#B2"); + Assert.AreEqual (string.Empty, string.Empty.ToLower (new CultureInfo ("en-US")), "#B3"); + Assert.AreEqual (string.Empty, string.Empty.ToLower (new CultureInfo ("tr-TR")), "#B4"); } [Test] // ToLower (CultureInfo) @@ -3703,22 +3648,22 @@ public class StringTest : TestCase try { s.ToLower ((CultureInfo) null); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentNullException ex) { - AssertEquals ("#A2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "culture", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("culture", ex.ParamName, "#A5"); } try { string.Empty.ToLower ((CultureInfo) null); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentNullException ex) { - AssertEquals ("#B2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "culture", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("culture", ex.ParamName, "#B5"); } } @@ -3726,7 +3671,7 @@ public class StringTest : TestCase public void TestToString () { string s1 = "OrIgInAli"; - AssertEquals("ToString failed!", s1, s1.ToString()); + Assert.AreEqual (s1, s1.ToString(), "ToString failed!"); } [Test] // ToUpper () @@ -3736,11 +3681,11 @@ public class StringTest : TestCase Thread.CurrentThread.CurrentCulture = new CultureInfo ("tr-TR"); - AssertEquals ("#1", "ORIGINAL\u0130", s.ToUpper ()); + Assert.AreEqual ("ORIGINAL\u0130", s.ToUpper (), "#1"); Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US"); - AssertEquals ("#2", "ORIGINALI", s.ToUpper ()); + Assert.AreEqual ("ORIGINALI", s.ToUpper (), "#2"); } [Test] // ToUpper (CultureInfo) @@ -3750,17 +3695,17 @@ public class StringTest : TestCase Thread.CurrentThread.CurrentCulture = new CultureInfo ("tr-TR"); - AssertEquals ("#A1", "ORIGINALI", s.ToUpper (new CultureInfo ("en-US"))); - AssertEquals ("#A2", "ORIGINAL\u0130", s.ToUpper (new CultureInfo ("tr-TR"))); - AssertEquals ("#A3", string.Empty, string.Empty.ToUpper (new CultureInfo ("en-US"))); - AssertEquals ("#A4", string.Empty, string.Empty.ToUpper (new CultureInfo ("tr-TR"))); + Assert.AreEqual ("ORIGINALI", s.ToUpper (new CultureInfo ("en-US")), "#A1"); + Assert.AreEqual ("ORIGINAL\u0130", s.ToUpper (new CultureInfo ("tr-TR")), "#A2"); + Assert.AreEqual (string.Empty, string.Empty.ToUpper (new CultureInfo ("en-US")), "#A3"); + Assert.AreEqual (string.Empty, string.Empty.ToUpper (new CultureInfo ("tr-TR")), "#A4"); Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US"); - AssertEquals ("#B1", "ORIGINALI", s.ToUpper (new CultureInfo ("en-US"))); - AssertEquals ("#B2", "ORIGINAL\u0130", s.ToUpper (new CultureInfo ("tr-TR"))); - AssertEquals ("#B3", string.Empty, string.Empty.ToUpper (new CultureInfo ("en-US"))); - AssertEquals ("#B4", string.Empty, string.Empty.ToUpper (new CultureInfo ("tr-TR"))); + Assert.AreEqual ("ORIGINALI", s.ToUpper (new CultureInfo ("en-US")), "#B1"); + Assert.AreEqual ("ORIGINAL\u0130", s.ToUpper (new CultureInfo ("tr-TR")), "#B2"); + Assert.AreEqual (string.Empty, string.Empty.ToUpper (new CultureInfo ("en-US")), "#B3"); + Assert.AreEqual (string.Empty, string.Empty.ToUpper (new CultureInfo ("tr-TR")), "#B4"); } [Test] // ToUpper (CultureInfo) @@ -3770,22 +3715,22 @@ public class StringTest : TestCase try { s.ToUpper ((CultureInfo) null); - Fail ("#A1"); + Assert.Fail ("#A1"); } catch (ArgumentNullException ex) { - AssertEquals ("#A2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); - AssertEquals ("#A5", "culture", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); + Assert.AreEqual ("culture", ex.ParamName, "#A5"); } try { string.Empty.ToUpper ((CultureInfo) null); - Fail ("#B1"); + Assert.Fail ("#B1"); } catch (ArgumentNullException ex) { - AssertEquals ("#B2", typeof (ArgumentNullException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); - AssertEquals ("#B5", "culture", ex.ParamName); + Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); + Assert.AreEqual ("culture", ex.ParamName, "#B5"); } } @@ -3793,25 +3738,24 @@ public class StringTest : TestCase public void TestTrim () { string s1 = " original\t\n"; - AssertEquals("basic trim failed", "original", s1.Trim()); - AssertEquals("basic trim failed", "original", s1.Trim(null)); + Assert.AreEqual ("original", s1.Trim(), "basic trim failed"); + Assert.AreEqual ("original", s1.Trim(null), "basic trim failed"); s1 = "original"; - AssertEquals("basic trim failed", "original", s1.Trim()); - AssertEquals("basic trim failed", "original", s1.Trim(null)); + Assert.AreEqual ("original", s1.Trim(), "basic trim failed"); + Assert.AreEqual ("original", s1.Trim(null), "basic trim failed"); s1 = " \t \n "; - AssertEquals("empty trim failed", string.Empty, s1.Trim()); - AssertEquals("empty trim failed", string.Empty, s1.Trim(null)); + Assert.AreEqual (string.Empty, s1.Trim(), "empty trim failed"); + Assert.AreEqual (string.Empty, s1.Trim(null), "empty trim failed"); s1 = "aaaoriginalbbb"; char[] delims = {'a', 'b'}; - AssertEquals("custom trim failed", - "original", s1.Trim(delims)); + Assert.AreEqual ("original", s1.Trim(delims), "custom trim failed"); #if NET_2_0 - AssertEquals ("net_2_0 additional char#1", "original", "\u2028original\u2029".Trim ()); - AssertEquals ("net_2_0 additional char#2", "original", "\u0085original\u1680".Trim ()); + Assert.AreEqual ("original", "\u2028original\u2029".Trim (), "net_2_0 additional char#1"); + Assert.AreEqual ("original", "\u0085original\u1680".Trim (), "net_2_0 additional char#2"); #endif } @@ -3819,42 +3763,34 @@ public class StringTest : TestCase public void TestTrimEnd () { string s1 = " original\t\n"; - AssertEquals("basic TrimEnd failed", - " original", s1.TrimEnd(null)); + Assert.AreEqual (" original", s1.TrimEnd(null), "basic TrimEnd failed"); s1 = " original"; - AssertEquals("basic TrimEnd failed", - " original", s1.TrimEnd(null)); + Assert.AreEqual (" original", s1.TrimEnd(null), "basic TrimEnd failed"); s1 = " \t \n \n "; - AssertEquals("empty TrimEnd failed", - string.Empty, s1.TrimEnd(null)); + Assert.AreEqual (string.Empty, s1.TrimEnd(null), "empty TrimEnd failed"); s1 = "aaaoriginalbbb"; char[] delims = {'a', 'b'}; - AssertEquals("custom TrimEnd failed", - "aaaoriginal", s1.TrimEnd(delims)); + Assert.AreEqual ("aaaoriginal", s1.TrimEnd(delims), "custom TrimEnd failed"); } [Test] public void TestTrimStart () { string s1 = " original\t\n"; - AssertEquals("basic TrimStart failed", - "original\t\n", s1.TrimStart(null)); + Assert.AreEqual ("original\t\n", s1.TrimStart(null), "basic TrimStart failed"); s1 = "original\t\n"; - AssertEquals("basic TrimStart failed", - "original\t\n", s1.TrimStart(null)); + Assert.AreEqual ("original\t\n", s1.TrimStart(null), "basic TrimStart failed"); s1 = " \t \n \n "; - AssertEquals("empty TrimStart failed", - string.Empty, s1.TrimStart(null)); + Assert.AreEqual (string.Empty, s1.TrimStart(null), "empty TrimStart failed"); s1 = "aaaoriginalbbb"; char[] delims = {'a', 'b'}; - AssertEquals("custom TrimStart failed", - "originalbbb", s1.TrimStart(delims)); + Assert.AreEqual ("originalbbb", s1.TrimStart(delims), "custom TrimStart failed"); } [Test] @@ -3865,21 +3801,21 @@ public class StringTest : TestCase s = string.Empty; try { char c = s [0]; - Fail ("#A1:" + c); + Assert.Fail ("#A1:" + c); } catch (IndexOutOfRangeException ex) { - AssertEquals ("#A2", typeof (IndexOutOfRangeException), ex.GetType ()); - AssertNull ("#A3", ex.InnerException); - AssertNotNull ("#A4", ex.Message); + Assert.AreEqual (typeof (IndexOutOfRangeException), ex.GetType (), "#A2"); + Assert.IsNull (ex.InnerException, "#A3"); + Assert.IsNotNull (ex.Message, "#A4"); } s = "A"; try { char c = s [-1]; - Fail ("#B1:" + c); + Assert.Fail ("#B1:" + c); } catch (IndexOutOfRangeException ex) { - AssertEquals ("#B2", typeof (IndexOutOfRangeException), ex.GetType ()); - AssertNull ("#B3", ex.InnerException); - AssertNotNull ("#B4", ex.Message); + Assert.AreEqual (typeof (IndexOutOfRangeException), ex.GetType (), "#B2"); + Assert.IsNull (ex.InnerException, "#B3"); + Assert.IsNotNull (ex.Message, "#B4"); } } @@ -3887,7 +3823,7 @@ public class StringTest : TestCase public void TestComparePeriod () { // according to bug 63981, this behavior is for all cultures - AssertEquals ("#1", -1, String.Compare ("foo.obj", "foobar.obj", false)); + Assert.AreEqual (-1, String.Compare ("foo.obj", "foobar.obj", false), "#1"); } [Test] @@ -3897,12 +3833,12 @@ public class StringTest : TestCase char [] k = { 'M' }; try { mono.LastIndexOfAny (k, mono.Length, 1); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "startIndex", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("startIndex", ex.ParamName, "#5"); } } @@ -3911,14 +3847,14 @@ public class StringTest : TestCase { string s1 = "abcdefghijklm"; char[] c1 = {'q', 'r'}; - AssertEquals("No splitters", s1, (s1.Split(c1))[0]); + Assert.AreEqual (s1, (s1.Split(c1))[0], "No splitters"); char[] c2 = {'a', 'e', 'i', 'o', 'u'}; string[] chunks = s1.Split(c2); - AssertEquals("First chunk", string.Empty, chunks[0]); - AssertEquals("Second chunk", "bcd", chunks[1]); - AssertEquals("Third chunk", "fgh", chunks[2]); - AssertEquals("Fourth chunk", "jklm", chunks[3]); + Assert.AreEqual (string.Empty, chunks[0], "First chunk"); + Assert.AreEqual ("bcd", chunks[1], "Second chunk"); + Assert.AreEqual ("fgh", chunks[2], "Third chunk"); + Assert.AreEqual ("jklm", chunks[3], "Fourth chunk"); { bool errorThrown = false; @@ -3927,71 +3863,71 @@ public class StringTest : TestCase } catch (ArgumentOutOfRangeException) { errorThrown = true; } - Assert("Split out of range", errorThrown); + Assert.IsTrue (errorThrown, "Split out of range"); } chunks = s1.Split(c2, 2); - AssertEquals("Limited chunk", 2, chunks.Length); - AssertEquals("First limited chunk", string.Empty, chunks[0]); - AssertEquals("Second limited chunk", "bcdefghijklm", chunks[1]); + Assert.AreEqual (2, chunks.Length, "Limited chunk"); + Assert.AreEqual (string.Empty, chunks[0], "First limited chunk"); + Assert.AreEqual ("bcdefghijklm", chunks[1], "Second limited chunk"); string s3 = "1.0"; char[] c3 = {'.'}; chunks = s3.Split(c3,2); - AssertEquals("1.0 split length", 2, chunks.Length); - AssertEquals("1.0 split first chunk", "1", chunks[0]); - AssertEquals("1.0 split second chunk", "0", chunks[1]); + Assert.AreEqual (2, chunks.Length, "1.0 split length"); + Assert.AreEqual ("1", chunks[0], "1.0 split first chunk"); + Assert.AreEqual ("0", chunks[1], "1.0 split second chunk"); string s4 = "1.0.0"; char[] c4 = {'.'}; chunks = s4.Split(c4,2); - AssertEquals("1.0.0 split length", 2, chunks.Length); - AssertEquals("1.0.0 split first chunk", "1", chunks[0]); - AssertEquals("1.0.0 split second chunk", "0.0", chunks[1]); + Assert.AreEqual (2, chunks.Length, "1.0.0 split length"); + Assert.AreEqual ("1", chunks[0], "1.0.0 split first chunk"); + Assert.AreEqual ("0.0", chunks[1], "1.0.0 split second chunk"); string s5 = ".0.0"; char[] c5 = {'.'}; chunks = s5.Split (c5, 2); - AssertEquals(".0.0 split length", 2, chunks.Length); - AssertEquals(".0.0 split first chunk", string.Empty, chunks[0]); - AssertEquals(".0.0 split second chunk", "0.0", chunks[1]); + Assert.AreEqual (2, chunks.Length, ".0.0 split length"); + Assert.AreEqual (string.Empty, chunks[0], ".0.0 split first chunk"); + Assert.AreEqual ("0.0", chunks[1], ".0.0 split second chunk"); string s6 = ".0"; char[] c6 = {'.'}; chunks = s6.Split (c6, 2); - AssertEquals(".0 split length", 2, chunks.Length); - AssertEquals(".0 split first chunk", string.Empty, chunks[0]); - AssertEquals(".0 split second chunk", "0", chunks[1]); + Assert.AreEqual (2, chunks.Length, ".0 split length"); + Assert.AreEqual (string.Empty, chunks[0], ".0 split first chunk"); + Assert.AreEqual ("0", chunks[1], ".0 split second chunk"); string s7 = "0."; char[] c7 = {'.'}; chunks = s7.Split (c7, 2); - AssertEquals("0. split length", 2, chunks.Length); - AssertEquals("0. split first chunk", "0", chunks[0]); - AssertEquals("0. split second chunk", string.Empty, chunks[1]); + Assert.AreEqual (2, chunks.Length, "0. split length"); + Assert.AreEqual ("0", chunks[0], "0. split first chunk"); + Assert.AreEqual (string.Empty, chunks[1], "0. split second chunk"); string s8 = "0.0000"; char[] c8 = {'.'}; chunks = s8.Split (c8, 2); - AssertEquals("0.0000/2 split length", 2, chunks.Length); - AssertEquals("0.0000/2 split first chunk", "0", chunks[0]); - AssertEquals("0.0000/2 split second chunk", "0000", chunks[1]); + Assert.AreEqual (2, chunks.Length, "0.0000/2 split length"); + Assert.AreEqual ("0", chunks[0], "0.0000/2 split first chunk"); + Assert.AreEqual ("0000", chunks[1], "0.0000/2 split second chunk"); chunks = s8.Split (c8, 3); - AssertEquals("0.0000/3 split length", 2, chunks.Length); - AssertEquals("0.0000/3 split first chunk", "0", chunks[0]); - AssertEquals("0.0000/3 split second chunk", "0000", chunks[1]); + Assert.AreEqual (2, chunks.Length, "0.0000/3 split length"); + Assert.AreEqual ("0", chunks[0], "0.0000/3 split first chunk"); + Assert.AreEqual ("0000", chunks[1], "0.0000/3 split second chunk"); chunks = s8.Split (c8, 1); - AssertEquals("0.0000/1 split length", 1, chunks.Length); - AssertEquals("0.0000/1 split first chunk", "0.0000", chunks[0]); + Assert.AreEqual (1, chunks.Length, "0.0000/1 split length"); + Assert.AreEqual ("0.0000", chunks[0], "0.0000/1 split first chunk"); chunks = s1.Split(c2, 1); - AssertEquals("Single split", 1, chunks.Length); - AssertEquals("Single chunk", s1, chunks[0]); + Assert.AreEqual (1, chunks.Length, "Single split"); + Assert.AreEqual (s1, chunks[0], "Single chunk"); chunks = s1.Split(c2, 0); - AssertEquals("Zero split", 0, chunks.Length); + Assert.AreEqual (0, chunks.Length, "Zero split"); } [Test] @@ -3999,9 +3935,9 @@ public class StringTest : TestCase { string test = "123 456 789"; string [] st = test.Split (); - AssertEquals ("#01", "123", st [0]); + Assert.AreEqual ("123", st [0], "#01"); st = test.Split (null); - AssertEquals ("#02", "123", st [0]); + Assert.AreEqual ("123", st [0], "#02"); } #if NET_2_0 @@ -4010,14 +3946,14 @@ public class StringTest : TestCase { try { "A B".Split (new Char [] { 'A' }, (StringSplitOptions) 4096); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal enum value: 4096 - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - Assert ("#5", ex.Message.IndexOf ("4096") != 1); - AssertNull ("#6", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsTrue (ex.Message.IndexOf ("4096") != 1, "#5"); + Assert.IsNull (ex.ParamName, "#6"); } } @@ -4026,14 +3962,14 @@ public class StringTest : TestCase { try { "A B".Split (new String [] { "A" }, (StringSplitOptions) 4096); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal enum value: 4096 - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - Assert ("#5", ex.Message.IndexOf ("4096") != 1); - AssertNull ("#6", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsTrue (ex.Message.IndexOf ("4096") != 1, "#5"); + Assert.IsNull (ex.ParamName, "#6"); } } @@ -4042,14 +3978,14 @@ public class StringTest : TestCase { try { "A B".Split (new Char [] { 'A' }, 0, (StringSplitOptions) 4096); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal enum value: 4096 - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - Assert ("#5", ex.Message.IndexOf ("4096") != 1); - AssertNull ("#6", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsTrue (ex.Message.IndexOf ("4096") != 1, "#5"); + Assert.IsNull (ex.ParamName, "#6"); } } @@ -4058,12 +3994,12 @@ public class StringTest : TestCase { try { "A B".Split (new String [] { "A" }, -1, StringSplitOptions.None); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentOutOfRangeException ex) { - AssertEquals ("#2", typeof (ArgumentOutOfRangeException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - AssertEquals ("#5", "count", ex.ParamName); + Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.AreEqual ("count", ex.ParamName, "#5"); } } @@ -4072,14 +4008,14 @@ public class StringTest : TestCase { try { "A B".Split (new String [] { "A" }, 0, (StringSplitOptions) 4096); - Fail ("#1"); + Assert.Fail ("#1"); } catch (ArgumentException ex) { // Illegal enum value: 4096 - AssertEquals ("#2", typeof (ArgumentException), ex.GetType ()); - AssertNull ("#3", ex.InnerException); - AssertNotNull ("#4", ex.Message); - Assert ("#5", ex.Message.IndexOf ("4096") != 1); - AssertNull ("#6", ex.ParamName); + Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2"); + Assert.IsNull (ex.InnerException, "#3"); + Assert.IsNotNull (ex.Message, "#4"); + Assert.IsTrue (ex.Message.IndexOf ("4096") != 1, "#5"); + Assert.IsNull (ex.ParamName, "#6"); } } @@ -4090,77 +4026,77 @@ public class StringTest : TestCase // count == 0 res = "A B C".Split (new String [] { "A" }, 0, StringSplitOptions.None); - AssertEquals (0, res.Length); + Assert.AreEqual (0, res.Length); // empty and RemoveEmpty res = string.Empty.Split (new String [] { "A" }, StringSplitOptions.RemoveEmptyEntries); - AssertEquals (0, res.Length); + Assert.AreEqual (0, res.Length); // Not found res = "A B C".Split (new String [] { "D" }, StringSplitOptions.None); - AssertEquals (1, res.Length); - AssertEquals ("A B C", res [0]); + Assert.AreEqual (1, res.Length); + Assert.AreEqual ("A B C", res [0]); // A normal test res = "A B C DD E".Split (new String[] { "B", "D" }, StringSplitOptions.None); - AssertEquals (4, res.Length); - AssertEquals ("A ", res [0]); - AssertEquals (" C ", res [1]); - AssertEquals (string.Empty, res [2]); - AssertEquals (" E", res [3]); + Assert.AreEqual (4, res.Length); + Assert.AreEqual ("A ", res [0]); + Assert.AreEqual (" C ", res [1]); + Assert.AreEqual (string.Empty, res [2]); + Assert.AreEqual (" E", res [3]); // Same with RemoveEmptyEntries res = "A B C DD E".Split (new String[] { "B", "D" }, StringSplitOptions.RemoveEmptyEntries); - AssertEquals (3, res.Length); - AssertEquals ("A ", res [0]); - AssertEquals (" C ", res [1]); - AssertEquals (" E", res [2]); + Assert.AreEqual (3, res.Length); + Assert.AreEqual ("A ", res [0]); + Assert.AreEqual (" C ", res [1]); + Assert.AreEqual (" E", res [2]); // Delimiter matches once at the beginning of the string res = "A B".Split (new String [] { "A" }, StringSplitOptions.RemoveEmptyEntries); - AssertEquals (1, res.Length); - AssertEquals (" B", res [0]); + Assert.AreEqual (1, res.Length); + Assert.AreEqual (" B", res [0]); // Delimiter at the beginning and at the end res = "B C DD B".Split (new String[] { "B" }, StringSplitOptions.None); - AssertEquals (3, res.Length); - AssertEquals (string.Empty, res [0]); - AssertEquals (" C DD ", res [1]); - AssertEquals (string.Empty, res [2]); + Assert.AreEqual (3, res.Length); + Assert.AreEqual (string.Empty, res [0]); + Assert.AreEqual (" C DD ", res [1]); + Assert.AreEqual (string.Empty, res [2]); res = "B C DD B".Split (new String[] { "B" }, StringSplitOptions.RemoveEmptyEntries); - AssertEquals (1, res.Length); - AssertEquals (" C DD ", res [0]); + Assert.AreEqual (1, res.Length); + Assert.AreEqual (" C DD ", res [0]); // count res = "A B C DD E".Split (new String[] { "B", "D" }, 2, StringSplitOptions.None); - AssertEquals (2, res.Length); - AssertEquals ("A ", res [0]); - AssertEquals (" C DD E", res [1]); + Assert.AreEqual (2, res.Length); + Assert.AreEqual ("A ", res [0]); + Assert.AreEqual (" C DD E", res [1]); // Ordering res = "ABCDEF".Split (new String[] { "EF", "BCDE" }, StringSplitOptions.None); - AssertEquals (2, res.Length); - AssertEquals ("A", res [0]); - AssertEquals ("F", res [1]); + Assert.AreEqual (2, res.Length); + Assert.AreEqual ("A", res [0]); + Assert.AreEqual ("F", res [1]); res = "ABCDEF".Split (new String[] { "BCD", "BC" }, StringSplitOptions.None); - AssertEquals (2, res.Length); - AssertEquals ("A", res [0]); - AssertEquals ("EF", res [1]); + Assert.AreEqual (2, res.Length); + Assert.AreEqual ("A", res [0]); + Assert.AreEqual ("EF", res [1]); // Whitespace res = "A B\nC".Split ((String[])null, StringSplitOptions.None); - AssertEquals (3, res.Length); - AssertEquals ("A", res [0]); - AssertEquals ("B", res [1]); - AssertEquals ("C", res [2]); + Assert.AreEqual (3, res.Length); + Assert.AreEqual ("A", res [0]); + Assert.AreEqual ("B", res [1]); + Assert.AreEqual ("C", res [2]); res = "A B\nC".Split (new String [0], StringSplitOptions.None); - AssertEquals (3, res.Length); - AssertEquals ("A", res [0]); - AssertEquals ("B", res [1]); - AssertEquals ("C", res [2]); + Assert.AreEqual (3, res.Length); + Assert.AreEqual ("A", res [0]); + Assert.AreEqual ("B", res [1]); + Assert.AreEqual ("C", res [2]); } [Test] @@ -4170,102 +4106,127 @@ public class StringTest : TestCase // count == 0 res = "..A..B..".Split (new Char[] { '.' }, 0, StringSplitOptions.None); - AssertEquals ("#01-01", 0, res.Length); + Assert.AreEqual (0, res.Length, "#01-01"); // count == 1 res = "..A..B..".Split (new Char[] { '.' }, 1, StringSplitOptions.None); - AssertEquals ("#02-01", 1, res.Length); - AssertEquals ("#02-02", "..A..B..", res [0]); + Assert.AreEqual (1, res.Length, "#02-01"); + Assert.AreEqual ("..A..B..", res [0], "#02-02"); // count == 1 + RemoveEmpty res = "..A..B..".Split (new Char[] { '.' }, 1, StringSplitOptions.RemoveEmptyEntries); - AssertEquals ("#03-01", 1, res.Length); - AssertEquals ("#03-02", "..A..B..", res [0]); + Assert.AreEqual (1, res.Length, "#03-01"); + Assert.AreEqual ("..A..B..", res [0], "#03-02"); // Strange Case A+B A res = "...".Split (new Char[] { '.' }, 1, StringSplitOptions.RemoveEmptyEntries); - AssertEquals ("#ABA-01", 1, res.Length); - AssertEquals ("#ABA-02", "...", res [0]); + Assert.AreEqual (1, res.Length, "#ABA-01"); + Assert.AreEqual ("...", res [0], "#ABA-02"); // Strange Case A+B B res = "...".Split (new Char[] { '.' }, 2, StringSplitOptions.RemoveEmptyEntries); - AssertEquals ("#ABB-01", 0, res.Length); + Assert.AreEqual (0, res.Length, "#ABB-01"); // Keeping Empties and multipe split chars res = "..A;.B.;".Split (new Char[] { '.', ';' }, StringSplitOptions.None); - AssertEquals ("#04-01", 7, res.Length); - AssertEquals ("#04-02", string.Empty, res [0]); - AssertEquals ("#04-03", string.Empty, res [1]); - AssertEquals ("#04-04", "A", res [2]); - AssertEquals ("#04-05", string.Empty, res [3]); - AssertEquals ("#04-06", "B", res [4]); - AssertEquals ("#04-07", string.Empty, res [5]); - AssertEquals ("#04-08", string.Empty, res [6]); + Assert.AreEqual (7, res.Length, "#04-01"); + Assert.AreEqual (string.Empty, res [0], "#04-02"); + Assert.AreEqual (string.Empty, res [1], "#04-03"); + Assert.AreEqual ("A", res [2], "#04-04"); + Assert.AreEqual (string.Empty, res [3], "#04-05"); + Assert.AreEqual ("B", res [4], "#04-06"); + Assert.AreEqual (string.Empty, res [5], "#04-07"); + Assert.AreEqual (string.Empty, res [6], "#04-08"); // Trimming (3 tests) res = "..A".Split (new Char[] { '.' }, 2, StringSplitOptions.RemoveEmptyEntries); - AssertEquals ("#05-01", 1, res.Length); - AssertEquals ("#05-02", "A", res [0]); + Assert.AreEqual (1, res.Length, "#05-01"); + Assert.AreEqual ("A", res [0], "#05-02"); res = "A..".Split (new Char[] { '.' }, 2, StringSplitOptions.RemoveEmptyEntries); - AssertEquals ("#06-01", 1, res.Length); - AssertEquals ("#06-02", "A", res [0]); + Assert.AreEqual (1, res.Length, "#06-01"); + Assert.AreEqual ("A", res [0], "#06-02"); res = "..A..".Split (new Char[] { '.' }, 2, StringSplitOptions.RemoveEmptyEntries); - AssertEquals ("#07-01", 1, res.Length); - AssertEquals ("#07-02", "A", res [0]); + Assert.AreEqual (1, res.Length, "#07-01"); + Assert.AreEqual ("A", res [0], "#07-02"); // Lingering Tail res = "..A..B..".Split (new Char[] { '.' }, 2, StringSplitOptions.RemoveEmptyEntries); - AssertEquals ("#08-01", 2, res.Length); - AssertEquals ("#08-02", "A", res [0]); - AssertEquals ("#08-03", "B..", res [1]); + Assert.AreEqual (2, res.Length, "#08-01"); + Assert.AreEqual ("A", res [0], "#08-02"); + Assert.AreEqual ("B..", res [1], "#08-03"); // Whitespace and Long split chain (removing empty chars) res = " A\tBC\n\rDEF GHI ".Split ((Char[])null, StringSplitOptions.RemoveEmptyEntries); - AssertEquals ("#09-01", 4, res.Length); - AssertEquals ("#09-02", "A", res [0]); - AssertEquals ("#09-03", "BC", res [1]); - AssertEquals ("#09-04", "DEF", res [2]); - AssertEquals ("#09-05", "GHI", res [3]); + Assert.AreEqual (4, res.Length, "#09-01"); + Assert.AreEqual ("A", res [0], "#09-02"); + Assert.AreEqual ("BC", res [1], "#09-03"); + Assert.AreEqual ("DEF", res [2], "#09-04"); + Assert.AreEqual ("GHI", res [3], "#09-05"); // Nothing but separators res = "..,.;.,".Split (new Char[]{'.',',',';'},2,StringSplitOptions.RemoveEmptyEntries); - AssertEquals ("#10-01", 0, res.Length); + Assert.AreEqual (0, res.Length, "#10-01"); // Complete testseries char[] dash = new Char[] { '/' }; StringSplitOptions o = StringSplitOptions.RemoveEmptyEntries; - AssertEquals ("#11-01", "hi", "hi".Split (dash, o)[0]); - AssertEquals ("#11-02", "hi", "hi/".Split (dash, o)[0]); - AssertEquals ("#11-03", "hi", "/hi".Split (dash, o)[0]); + Assert.AreEqual ("hi", "hi".Split (dash, o)[0], "#11-01"); + Assert.AreEqual ("hi", "hi/".Split (dash, o)[0], "#11-02"); + Assert.AreEqual ("hi", "/hi".Split (dash, o)[0], "#11-03"); - AssertEquals ("#11-04-1", "hi..", "hi../".Split (dash, o)[0]); - AssertEquals ("#11-04-2", "hi..", "/hi..".Split (dash, o)[0]); + Assert.AreEqual ("hi..", "hi../".Split (dash, o)[0], "#11-04-1"); + Assert.AreEqual ("hi..", "/hi..".Split (dash, o)[0], "#11-04-2"); res = "/hi/..".Split (dash, o); - AssertEquals ("#11-05-1", "hi", res[0]); - AssertEquals ("#11-05-2", "..", res[1]); - AssertEquals ("#11-09-3", 2, res.Length); + Assert.AreEqual ("hi", res[0], "#11-05-1"); + Assert.AreEqual ("..", res[1], "#11-05-2"); + Assert.AreEqual (2, res.Length, "#11-09-3"); res = "hi/..".Split (dash, o); - AssertEquals ("#11-06-1", "hi", res[0]); - AssertEquals ("#11-06-2", "..", res[1]); - AssertEquals ("#11-09-3", 2, res.Length); + Assert.AreEqual ("hi", res[0], "#11-06-1"); + Assert.AreEqual ("..", res[1], "#11-06-2"); + Assert.AreEqual (2, res.Length, "#11-09-3"); res = "hi/../".Split (dash, o); - AssertEquals ("#11-07-1", "hi", res[0]); - AssertEquals ("#11-07-2", "..", res[1]); - AssertEquals ("#11-07-3", 2, res.Length); + Assert.AreEqual ("hi", res[0], "#11-07-1"); + Assert.AreEqual ("..", res[1], "#11-07-2"); + Assert.AreEqual (2, res.Length, "#11-07-3"); res = "/hi../".Split (dash, o); - AssertEquals ("#11-08-1", "hi..", res[0]); - AssertEquals ("#11-08-2", 1, res.Length); + Assert.AreEqual ("hi..", res[0], "#11-08-1"); + Assert.AreEqual (1, res.Length, "#11-08-2"); res = "/hi/../".Split (dash, o); - AssertEquals ("#11-09-1", "hi", res[0]); - AssertEquals ("#11-09-2", "..", res[1]); - AssertEquals ("#11-09-3", 2, res.Length); + Assert.AreEqual ("hi", res[0], "#11-09-1"); + Assert.AreEqual ("..", res[1], "#11-09-2"); + Assert.AreEqual (2, res.Length, "#11-09-3"); + } + + [Test] + [Category ("NotDotNet")] + public void Normalize1 () + { + // .NET does not combine them into U+1F80 + // seealso: http://demo.icu-project.org/icu-bin/nbrowser?t=\u03B1\u0313\u0345 + string s = "\u03B1\u0313\u0345"; + Assert.IsTrue (!s.IsNormalized (NormalizationForm.FormC), "#1"); + Assert.IsTrue (!s.IsNormalized (NormalizationForm.FormKC), "#2"); + Assert.AreEqual ("\u1F80", s.Normalize (NormalizationForm.FormC), "#3"); + Assert.AreEqual ("\u1F80", s.Normalize (NormalizationForm.FormKC), "#4"); + } + + [Test] + [Category ("NotDotNet")] + public void Normalize2 () + { + string s1 = "\u0061\u0301bc"; + string s2 = "\u00e1bc"; + // .NET does not combine \u0061\0301 into \u00E1 + // seealso: http://demo.icu-project.org/icu-bin/nbrowser?t=\u0061\u0301bc + Assert.AreEqual (s2, s1.Normalize (NormalizationForm.FormC), "#1"); + Assert.AreEqual (s2, s1.Normalize (NormalizationForm.FormKC), "#2"); } #endif } diff --git a/mcs/class/corlib/Test/System/TimeSpanTest.cs b/mcs/class/corlib/Test/System/TimeSpanTest.cs index 52b2452e72d..249bdebcbec 100644 --- a/mcs/class/corlib/Test/System/TimeSpanTest.cs +++ b/mcs/class/corlib/Test/System/TimeSpanTest.cs @@ -16,7 +16,7 @@ namespace MonoTests.System { [TestFixture] -public class TimeSpanTest : Assertion { +public class TimeSpanTest { private void Debug (TimeSpan ts) { @@ -32,17 +32,17 @@ public class TimeSpanTest : Assertion { { TimeSpan t1 = new TimeSpan (1234567890); - AssertEquals ("A1", "00:02:03.4567890", t1.ToString ()); + Assert.AreEqual ("00:02:03.4567890", t1.ToString (), "A1"); t1 = new TimeSpan (1,2,3); - AssertEquals ("A2", "01:02:03", t1.ToString ()); + Assert.AreEqual ("01:02:03", t1.ToString (), "A2"); t1 = new TimeSpan (1,2,3,4); - AssertEquals ("A3", "1.02:03:04", t1.ToString ()); + Assert.AreEqual ("1.02:03:04", t1.ToString (), "A3"); t1 = new TimeSpan (1,2,3,4,5); - AssertEquals ("A4", "1.02:03:04.0050000", t1.ToString ()); + Assert.AreEqual ("1.02:03:04.0050000", t1.ToString (), "A4"); t1 = new TimeSpan (-1,2,-3,4,-5); - AssertEquals ("A5", "-22:02:56.0050000", t1.ToString ()); + Assert.AreEqual ("-22:02:56.0050000", t1.ToString (), "A5"); t1 = new TimeSpan (0,25,0,0,0); - AssertEquals ("A6", "1.01:00:00", t1.ToString ()); + Assert.AreEqual ("1.01:00:00", t1.ToString (), "A6"); } [Test] @@ -64,12 +64,12 @@ public class TimeSpanTest : Assertion { // but the negative hours, minutes, seconds & ms correct this int days = (int) (Int64.MaxValue / TimeSpan.TicksPerDay) + 1; TimeSpan ts = new TimeSpan (days, Int32.MinValue, Int32.MinValue, Int32.MinValue, Int32.MinValue); - AssertEquals ("Days", 10650320, ts.Days); - AssertEquals ("Hours", 0, ts.Hours); - AssertEquals ("Minutes", 14, ts.Minutes); - AssertEquals ("Seconds", 28, ts.Seconds); - AssertEquals ("Milliseconds", 352, ts.Milliseconds); - AssertEquals ("Ticks", 9201876488683520000, ts.Ticks); + Assert.AreEqual (10650320, ts.Days, "Days"); + Assert.AreEqual (0, ts.Hours, "Hours"); + Assert.AreEqual (14, ts.Minutes, "Minutes"); + Assert.AreEqual (28, ts.Seconds, "Seconds"); + Assert.AreEqual (352, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (9201876488683520000, ts.Ticks, "Ticks"); } [Test] @@ -80,12 +80,12 @@ public class TimeSpanTest : Assertion { public void NoOverflowInHoursMinsSecondsMS () { TimeSpan ts = new TimeSpan (0, Int32.MaxValue, Int32.MaxValue, Int32.MaxValue, Int32.MaxValue); - AssertEquals ("Days", 24879, ts.Days); - AssertEquals ("Hours", 22, ts.Hours); - AssertEquals ("Minutes", 44, ts.Minutes); - AssertEquals ("Seconds", 30, ts.Seconds); - AssertEquals ("Milliseconds", 647, ts.Milliseconds); - AssertEquals ("Ticks", 21496274706470000, ts.Ticks); + Assert.AreEqual (24879, ts.Days, "Days"); + Assert.AreEqual (22, ts.Hours, "Hours"); + Assert.AreEqual (44, ts.Minutes, "Minutes"); + Assert.AreEqual (30, ts.Seconds, "Seconds"); + Assert.AreEqual (647, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (21496274706470000, ts.Ticks, "Ticks"); } [Test] @@ -111,12 +111,12 @@ public class TimeSpanTest : Assertion { TimeSpan ts = new TimeSpan (0, Int32.MaxValue - i, 0, 0, 0); int h = i + 1; string prefix = i.ToString () + '-'; - AssertEquals (prefix + "Days", -(h / 24), ts.Days); - AssertEquals (prefix + "Hours", -(h % 24), ts.Hours); - AssertEquals (prefix + "Minutes", 0, ts.Minutes); - AssertEquals (prefix + "Seconds", 0, ts.Seconds); - AssertEquals (prefix + "Milliseconds", 0, ts.Milliseconds); - AssertEquals (prefix + "Ticks", -36000000000 * h, ts.Ticks); + Assert.AreEqual (-(h / 24), ts.Days, prefix + "Days"); + Assert.AreEqual (-(h % 24), ts.Hours, prefix + "Hours"); + Assert.AreEqual (0, ts.Minutes, prefix + "Minutes"); + Assert.AreEqual (0, ts.Seconds, prefix + "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, prefix + "Milliseconds"); + Assert.AreEqual (-36000000000 * h, ts.Ticks, prefix + "Ticks"); } } @@ -129,20 +129,20 @@ public class TimeSpanTest : Assertion { { // LAMESPEC: the highest hours are "special" TimeSpan ts = new TimeSpan (0, Int32.MaxValue, 0, 0, 0); - AssertEquals ("Max-Days", 0, ts.Days); - AssertEquals ("Max-Hours", -1, ts.Hours); - AssertEquals ("Max-Minutes", 0, ts.Minutes); - AssertEquals ("Max-Seconds", 0, ts.Seconds); - AssertEquals ("Max-Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Max-Ticks", -36000000000, ts.Ticks); + Assert.AreEqual (0, ts.Days, "Max-Days"); + Assert.AreEqual (-1, ts.Hours, "Max-Hours"); + Assert.AreEqual (0, ts.Minutes, "Max-Minutes"); + Assert.AreEqual (0, ts.Seconds, "Max-Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Max-Milliseconds"); + Assert.AreEqual (-36000000000, ts.Ticks, "Max-Ticks"); ts = new TimeSpan (0, Int32.MaxValue - 596522, 0, 0, 0); - AssertEquals ("Days", -24855, ts.Days); - AssertEquals ("Hours", -3, ts.Hours); - AssertEquals ("Minutes", 0, ts.Minutes); - AssertEquals ("Seconds", 0, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", -21474828000000000, ts.Ticks); + Assert.AreEqual (-24855, ts.Days, "Days"); + Assert.AreEqual (-3, ts.Hours, "Hours"); + Assert.AreEqual (0, ts.Minutes, "Minutes"); + Assert.AreEqual (0, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (-21474828000000000, ts.Ticks, "Ticks"); } [Test] @@ -153,12 +153,12 @@ public class TimeSpanTest : Assertion { public void MaxHours_BreakPoint () { TimeSpan ts = new TimeSpan (0, Int32.MaxValue - 596523, 0, 0, 0); - AssertEquals ("Days", 24855, ts.Days); - AssertEquals ("Hours", 2, ts.Hours); - AssertEquals ("Minutes", 28, ts.Minutes); - AssertEquals ("Seconds", 16, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", 21474808960000000, ts.Ticks); + Assert.AreEqual (24855, ts.Days, "Days"); + Assert.AreEqual (2, ts.Hours, "Hours"); + Assert.AreEqual (28, ts.Minutes, "Minutes"); + Assert.AreEqual (16, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (21474808960000000, ts.Ticks, "Ticks"); } [Test] @@ -170,12 +170,12 @@ public class TimeSpanTest : Assertion { TimeSpan ts = new TimeSpan (0, i, 0, 0, 0); int h = i + Int32.MaxValue + 1; string prefix = i.ToString () + '-'; - AssertEquals (prefix + "Days", (h / 24), ts.Days); - AssertEquals (prefix + "Hours", (h % 24), ts.Hours); - AssertEquals (prefix + "Minutes", 0, ts.Minutes); - AssertEquals (prefix + "Seconds", 0, ts.Seconds); - AssertEquals (prefix + "Milliseconds", 0, ts.Milliseconds); - AssertEquals (prefix + "Ticks", 36000000000 * h, ts.Ticks); + Assert.AreEqual ((h / 24), ts.Days, prefix + "Days"); + Assert.AreEqual ((h % 24), ts.Hours, prefix + "Hours"); + Assert.AreEqual (0, ts.Minutes, prefix + "Minutes"); + Assert.AreEqual (0, ts.Seconds, prefix + "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, prefix + "Milliseconds"); + Assert.AreEqual (36000000000 * h, ts.Ticks, prefix + "Ticks"); } } @@ -187,29 +187,29 @@ public class TimeSpanTest : Assertion { { #if NET_2_0 TimeSpan ts = new TimeSpan (0, -256204778, 0, 0, 0); - AssertEquals ("Days", -10675199, ts.Days); - AssertEquals ("Hours", -2, ts.Hours); - AssertEquals ("Minutes", 0, ts.Minutes); - AssertEquals ("Seconds", 0, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", -9223372008000000000, ts.Ticks); + Assert.AreEqual (-10675199, ts.Days, "Days"); + Assert.AreEqual (-2, ts.Hours, "Hours"); + Assert.AreEqual (0, ts.Minutes, "Minutes"); + Assert.AreEqual (0, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (-9223372008000000000, ts.Ticks, "Ticks"); #else // LAMESPEC: the lowest hours are "special" TimeSpan ts = new TimeSpan (0, Int32.MinValue, 0, 0, 0); - AssertEquals ("Min-Days", 0, ts.Days); - AssertEquals ("Min-Hours", 0, ts.Hours); - AssertEquals ("Min-Minutes", 0, ts.Minutes); - AssertEquals ("Min-Seconds", 0, ts.Seconds); - AssertEquals ("Min-Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Min-Ticks", 0, ts.Ticks); + Assert.AreEqual (0, ts.Days, "Min-Days"); + Assert.AreEqual (0, ts.Hours, "Min-Hours"); + Assert.AreEqual (0, ts.Minutes, "Min-Minutes"); + Assert.AreEqual (0, ts.Seconds, "Min-Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Min-Milliseconds"); + Assert.AreEqual (0, ts.Ticks, "Min-Ticks"); ts = new TimeSpan (0, -2146887125, 0, 0, 0); - AssertEquals ("Days", 24855, ts.Days); - AssertEquals ("Hours", 3, ts.Hours); - AssertEquals ("Minutes", 0, ts.Minutes); - AssertEquals ("Seconds", 0, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", 21474828000000000, ts.Ticks); + Assert.AreEqual (24855, ts.Days, "Days"); + Assert.AreEqual (3, ts.Hours, "Hours"); + Assert.AreEqual (0, ts.Minutes, "Minutes"); + Assert.AreEqual (0, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (21474828000000000, ts.Ticks, "Ticks"); #endif } @@ -221,12 +221,12 @@ public class TimeSpanTest : Assertion { public void MinHours_BreakPoint () { TimeSpan ts = new TimeSpan (0, -2146887124, 0, 0, 0); - AssertEquals ("Days", -24855, ts.Days); - AssertEquals ("Hours", -2, ts.Hours); - AssertEquals ("Minutes", -28, ts.Minutes); - AssertEquals ("Seconds", -16, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", -21474808960000000, ts.Ticks); + Assert.AreEqual (-24855, ts.Days, "Days"); + Assert.AreEqual (-2, ts.Hours, "Hours"); + Assert.AreEqual (-28, ts.Minutes, "Minutes"); + Assert.AreEqual (-16, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (-21474808960000000, ts.Ticks, "Ticks"); } [Test] @@ -238,12 +238,12 @@ public class TimeSpanTest : Assertion { TimeSpan ts = new TimeSpan (0, 0, Int32.MaxValue - i, 0, 0); long h = -(i + 1); string prefix = i.ToString () + '-'; - AssertEquals (prefix + "Days", (h / 1440), ts.Days); - AssertEquals (prefix + "Hours", ((h / 60) % 24), ts.Hours); - AssertEquals (prefix + "Minutes", (h % 60), ts.Minutes); - AssertEquals (prefix + "Seconds", 0, ts.Seconds); - AssertEquals (prefix + "Milliseconds", 0, ts.Milliseconds); - AssertEquals (prefix + "Ticks", (600000000L * h), ts.Ticks); + Assert.AreEqual ((h / 1440), ts.Days, prefix + "Days"); + Assert.AreEqual (((h / 60) % 24), ts.Hours, prefix + "Hours"); + Assert.AreEqual ((h % 60), ts.Minutes, prefix + "Minutes"); + Assert.AreEqual (0, ts.Seconds, prefix + "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, prefix + "Milliseconds"); + Assert.AreEqual ((600000000L * h), ts.Ticks, prefix + "Ticks"); } } @@ -256,29 +256,29 @@ public class TimeSpanTest : Assertion { TimeSpan ts; #if NET_2_0 ts = new TimeSpan (0, 0, 256204778, 0, 0); - AssertEquals ("Max-Days", 177919, ts.Days); - AssertEquals ("Max-Hours", 23, ts.Hours); - AssertEquals ("Max-Minutes", 38, ts.Minutes); - AssertEquals ("Max-Seconds", 0, ts.Seconds); - AssertEquals ("Max-Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Max-Ticks", 153722866800000000, ts.Ticks); + Assert.AreEqual (177919, ts.Days, "Max-Days"); + Assert.AreEqual (23, ts.Hours, "Max-Hours"); + Assert.AreEqual (38, ts.Minutes, "Max-Minutes"); + Assert.AreEqual (0, ts.Seconds, "Max-Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Max-Milliseconds"); + Assert.AreEqual (153722866800000000, ts.Ticks, "Max-Ticks"); #else // LAMESPEC: the highest minutes are "special" ts = new TimeSpan (0, 0, Int32.MaxValue, 0, 0); - AssertEquals ("Max-Days", 0, ts.Days); - AssertEquals ("Max-Hours", 0, ts.Hours); - AssertEquals ("Max-Minutes", -1, ts.Minutes); - AssertEquals ("Max-Seconds", 0, ts.Seconds); - AssertEquals ("Max-Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Max-Ticks", -600000000, ts.Ticks); + Assert.AreEqual (0, ts.Days, "Max-Days"); + Assert.AreEqual (0, ts.Hours, "Max-Hours"); + Assert.AreEqual (-1, ts.Minutes, "Max-Minutes"); + Assert.AreEqual (0, ts.Seconds, "Max-Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Max-Milliseconds"); + Assert.AreEqual (-600000000, ts.Ticks, "Max-Ticks"); ts = new TimeSpan (0, 0, Int32.MaxValue - 35791393, 0, 0); - AssertEquals ("Days", -24855, ts.Days); - AssertEquals ("Hours", -3, ts.Hours); - AssertEquals ("Minutes", -14, ts.Minutes); - AssertEquals ("Seconds", 0, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", -21474836400000000, ts.Ticks); + Assert.AreEqual (-24855, ts.Days, "Days"); + Assert.AreEqual (-3, ts.Hours, "Hours"); + Assert.AreEqual (-14, ts.Minutes, "Minutes"); + Assert.AreEqual (0, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (-21474836400000000, ts.Ticks, "Ticks"); #endif } @@ -290,12 +290,12 @@ public class TimeSpanTest : Assertion { public void MaxMinutes_BreakPoint () { TimeSpan ts = new TimeSpan (0, Int32.MaxValue - 35791394, 0, 0, 0); - AssertEquals ("Days", 0, ts.Days); - AssertEquals ("Hours", 0, ts.Hours); - AssertEquals ("Minutes", -52, ts.Minutes); - AssertEquals ("Seconds", 0, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", -31200000000, ts.Ticks); + Assert.AreEqual (0, ts.Days, "Days"); + Assert.AreEqual (0, ts.Hours, "Hours"); + Assert.AreEqual (-52, ts.Minutes, "Minutes"); + Assert.AreEqual (0, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (-31200000000, ts.Ticks, "Ticks"); } [Test] @@ -307,12 +307,12 @@ public class TimeSpanTest : Assertion { TimeSpan ts = new TimeSpan (0, 0, i, 0, 0); long h = i + Int32.MaxValue + 1; string prefix = i.ToString () + '-'; - AssertEquals (prefix + "Days", (h / 1440), ts.Days); - AssertEquals (prefix + "Hours", ((h / 60) % 24), ts.Hours); - AssertEquals (prefix + "Minutes", (h % 60), ts.Minutes); - AssertEquals (prefix + "Seconds", 0, ts.Seconds); - AssertEquals (prefix + "Milliseconds", 0, ts.Milliseconds); - AssertEquals (prefix + "Ticks", (600000000L * h), ts.Ticks); + Assert.AreEqual ((h / 1440), ts.Days, prefix + "Days"); + Assert.AreEqual (((h / 60) % 24), ts.Hours, prefix + "Hours"); + Assert.AreEqual ((h % 60), ts.Minutes, prefix + "Minutes"); + Assert.AreEqual (0, ts.Seconds, prefix + "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, prefix + "Milliseconds"); + Assert.AreEqual ((600000000L * h), ts.Ticks, prefix + "Ticks"); } } @@ -325,29 +325,29 @@ public class TimeSpanTest : Assertion { TimeSpan ts; #if NET_2_0 ts = new TimeSpan (0, 0, Int32.MinValue, 0, 0); - AssertEquals ("Days", -1491308, ts.Days); - AssertEquals ("Hours", -2, ts.Hours); - AssertEquals ("Minutes", -8, ts.Minutes); - AssertEquals ("Seconds", 0, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", -1288490188800000000, ts.Ticks); + Assert.AreEqual (-1491308, ts.Days, "Days"); + Assert.AreEqual (-2, ts.Hours, "Hours"); + Assert.AreEqual (-8, ts.Minutes, "Minutes"); + Assert.AreEqual (0, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (-1288490188800000000, ts.Ticks, "Ticks"); #else // LAMESPEC: the highest minutes are "special" ts = new TimeSpan (0, 0, Int32.MinValue, 0, 0); - AssertEquals ("Min-Days", 0, ts.Days); - AssertEquals ("Min-Hours", 0, ts.Hours); - AssertEquals ("Min-Minutes", 0, ts.Minutes); - AssertEquals ("Min-Seconds", 0, ts.Seconds); - AssertEquals ("Min-Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Min-Ticks", 0, ts.Ticks); + Assert.AreEqual (0, ts.Days, "Min-Days"); + Assert.AreEqual (0, ts.Hours, "Min-Hours"); + Assert.AreEqual (0, ts.Minutes, "Min-Minutes"); + Assert.AreEqual (0, ts.Seconds, "Min-Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Min-Milliseconds"); + Assert.AreEqual (0, ts.Ticks, "Min-Ticks"); ts = new TimeSpan (0, 0, -2111692254, 0, 0); - AssertEquals ("Days", 24855, ts.Days); - AssertEquals ("Hours", 3, ts.Hours); - AssertEquals ("Minutes", 14, ts.Minutes); - AssertEquals ("Seconds", 0, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", 21474836400000000, ts.Ticks); + Assert.AreEqual (24855, ts.Days, "Days"); + Assert.AreEqual (3, ts.Hours, "Hours"); + Assert.AreEqual (14, ts.Minutes, "Minutes"); + Assert.AreEqual (0, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (21474836400000000, ts.Ticks, "Ticks"); #endif } @@ -359,20 +359,20 @@ public class TimeSpanTest : Assertion { { #if NET_2_0 TimeSpan ts = new TimeSpan (0, 0, -2111692253, 0, 0); - AssertEquals ("Days", -1466452, ts.Days); - AssertEquals ("Hours", -22, ts.Hours); - AssertEquals ("Minutes", -53, ts.Minutes); - AssertEquals ("Seconds", -0, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", -1267015351800000000, ts.Ticks); + Assert.AreEqual (-1466452, ts.Days, "Days"); + Assert.AreEqual (-22, ts.Hours, "Hours"); + Assert.AreEqual (-53, ts.Minutes, "Minutes"); + Assert.AreEqual (-0, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (-1267015351800000000, ts.Ticks, "Ticks"); #else TimeSpan ts = new TimeSpan (0, 0, -2111692253, 0, 0); - AssertEquals ("Days", -24855, ts.Days); - AssertEquals ("Hours", -3, ts.Hours); - AssertEquals ("Minutes", -13, ts.Minutes); - AssertEquals ("Seconds", -16, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", -21474835960000000, ts.Ticks); + Assert.AreEqual (-24855, ts.Days, "Days"); + Assert.AreEqual (-3, ts.Hours, "Hours"); + Assert.AreEqual (-13, ts.Minutes, "Minutes"); + Assert.AreEqual (-16, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (-21474835960000000, ts.Ticks, "Ticks"); #endif } @@ -380,60 +380,60 @@ public class TimeSpanTest : Assertion { public void MaxSeconds () { TimeSpan ts = new TimeSpan (0, 0, 0, Int32.MaxValue, 0); - AssertEquals ("Days", 24855, ts.Days); - AssertEquals ("Hours", 3, ts.Hours); - AssertEquals ("Minutes", 14, ts.Minutes); - AssertEquals ("Seconds", 7, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", 21474836470000000, ts.Ticks); + Assert.AreEqual (24855, ts.Days, "Days"); + Assert.AreEqual (3, ts.Hours, "Hours"); + Assert.AreEqual (14, ts.Minutes, "Minutes"); + Assert.AreEqual (7, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (21474836470000000, ts.Ticks, "Ticks"); } [Test] public void MinSeconds () { TimeSpan ts = new TimeSpan (0, 0, 0, Int32.MinValue, 0); - AssertEquals ("Days", -24855, ts.Days); - AssertEquals ("Hours", -3, ts.Hours); - AssertEquals ("Minutes", -14, ts.Minutes); - AssertEquals ("Seconds", -8, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", -21474836480000000, ts.Ticks); + Assert.AreEqual (-24855, ts.Days, "Days"); + Assert.AreEqual (-3, ts.Hours, "Hours"); + Assert.AreEqual (-14, ts.Minutes, "Minutes"); + Assert.AreEqual (-8, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (-21474836480000000, ts.Ticks, "Ticks"); } [Test] public void MaxMilliseconds () { TimeSpan ts = new TimeSpan (0, 0, 0, 0, Int32.MaxValue); - AssertEquals ("Days", 24, ts.Days); - AssertEquals ("Hours", 20, ts.Hours); - AssertEquals ("Minutes", 31, ts.Minutes); - AssertEquals ("Seconds", 23, ts.Seconds); - AssertEquals ("Milliseconds", 647, ts.Milliseconds); - AssertEquals ("Ticks", 21474836470000, ts.Ticks); + Assert.AreEqual (24, ts.Days, "Days"); + Assert.AreEqual (20, ts.Hours, "Hours"); + Assert.AreEqual (31, ts.Minutes, "Minutes"); + Assert.AreEqual (23, ts.Seconds, "Seconds"); + Assert.AreEqual (647, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (21474836470000, ts.Ticks, "Ticks"); } [Test] public void MinMilliseconds () { TimeSpan ts = new TimeSpan (0, 0, 0, 0, Int32.MinValue); - AssertEquals ("Days", -24, ts.Days); - AssertEquals ("Hours", -20, ts.Hours); - AssertEquals ("Minutes", -31, ts.Minutes); - AssertEquals ("Seconds", -23, ts.Seconds); - AssertEquals ("Milliseconds", -648, ts.Milliseconds); - AssertEquals ("Ticks", -21474836480000, ts.Ticks); + Assert.AreEqual (-24, ts.Days, "Days"); + Assert.AreEqual (-20, ts.Hours, "Hours"); + Assert.AreEqual (-31, ts.Minutes, "Minutes"); + Assert.AreEqual (-23, ts.Seconds, "Seconds"); + Assert.AreEqual (-648, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (-21474836480000, ts.Ticks, "Ticks"); } [Test] public void NegativeTimeSpan () { TimeSpan ts = new TimeSpan (-23, -59, -59); - AssertEquals ("Days", 0, ts.Days); - AssertEquals ("Hours", -23, ts.Hours); - AssertEquals ("Minutes", -59, ts.Minutes); - AssertEquals ("Seconds", -59, ts.Seconds); - AssertEquals ("Milliseconds", 0, ts.Milliseconds); - AssertEquals ("Ticks", -863990000000, ts.Ticks); + Assert.AreEqual (0, ts.Days, "Days"); + Assert.AreEqual (-23, ts.Hours, "Hours"); + Assert.AreEqual (-59, ts.Minutes, "Minutes"); + Assert.AreEqual (-59, ts.Seconds, "Seconds"); + Assert.AreEqual (0, ts.Milliseconds, "Milliseconds"); + Assert.AreEqual (-863990000000, ts.Ticks, "Ticks"); } public void TestProperties () @@ -441,16 +441,16 @@ public class TimeSpanTest : Assertion { TimeSpan t1 = new TimeSpan (1,2,3,4,5); TimeSpan t2 = -t1; - AssertEquals ("A1", 1, t1.Days); - AssertEquals ("A2", 2, t1.Hours); - AssertEquals ("A3", 3, t1.Minutes); - AssertEquals ("A4", 4, t1.Seconds); - AssertEquals ("A5", 5, t1.Milliseconds); - AssertEquals ("A6", -1, t2.Days); - AssertEquals ("A7", -2, t2.Hours); - AssertEquals ("A8", -3, t2.Minutes); - AssertEquals ("A9", -4, t2.Seconds); - AssertEquals ("A10", -5, t2.Milliseconds); + Assert.AreEqual (1, t1.Days, "A1"); + Assert.AreEqual (2, t1.Hours, "A2"); + Assert.AreEqual (3, t1.Minutes, "A3"); + Assert.AreEqual (4, t1.Seconds, "A4"); + Assert.AreEqual (5, t1.Milliseconds, "A5"); + Assert.AreEqual (-1, t2.Days, "A6"); + Assert.AreEqual (-2, t2.Hours, "A7"); + Assert.AreEqual (-3, t2.Minutes, "A8"); + Assert.AreEqual (-4, t2.Seconds, "A9"); + Assert.AreEqual (-5, t2.Milliseconds, "A10"); } public void TestAdd () @@ -462,12 +462,12 @@ public class TimeSpanTest : Assertion { TimeSpan t5; bool exception; - AssertEquals ("A1", 3, t3.Days); - AssertEquals ("A2", 5, t3.Hours); - AssertEquals ("A3", 7, t3.Minutes); - AssertEquals ("A4", 9, t3.Seconds); - AssertEquals ("A5", 11, t3.Milliseconds); - AssertEquals ("A6", "3.05:07:09.0110000", t4.ToString ()); + Assert.AreEqual (3, t3.Days, "A1"); + Assert.AreEqual (5, t3.Hours, "A2"); + Assert.AreEqual (7, t3.Minutes, "A3"); + Assert.AreEqual (9, t3.Seconds, "A4"); + Assert.AreEqual (11, t3.Milliseconds, "A5"); + Assert.AreEqual ("3.05:07:09.0110000", t4.ToString (), "A6"); try { t5 = TimeSpan.MaxValue + new TimeSpan (1); @@ -477,7 +477,7 @@ public class TimeSpanTest : Assertion { { exception = true; } - Assert ("A7", exception); + Assert.IsTrue (exception, "A7"); } public void TestCompare () @@ -487,16 +487,16 @@ public class TimeSpanTest : Assertion { int res; bool exception; - AssertEquals ("A1", -1, TimeSpan.Compare (t1, t2)); - AssertEquals ("A2", 1, TimeSpan.Compare (t2, t1)); - AssertEquals ("A3", 0, TimeSpan.Compare (t2, t2)); - AssertEquals ("A4", -1, TimeSpan.Compare (TimeSpan.MinValue, TimeSpan.MaxValue)); - AssertEquals ("A5", -1, t1.CompareTo (t2)); - AssertEquals ("A6", 1, t2.CompareTo (t1)); - AssertEquals ("A7", 0, t2.CompareTo (t2)); - AssertEquals ("A8", -1, TimeSpan.Compare (TimeSpan.MinValue, TimeSpan.MaxValue)); + Assert.AreEqual (-1, TimeSpan.Compare (t1, t2), "A1"); + Assert.AreEqual (1, TimeSpan.Compare (t2, t1), "A2"); + Assert.AreEqual (0, TimeSpan.Compare (t2, t2), "A3"); + Assert.AreEqual (-1, TimeSpan.Compare (TimeSpan.MinValue, TimeSpan.MaxValue), "A4"); + Assert.AreEqual (-1, t1.CompareTo (t2), "A5"); + Assert.AreEqual (1, t2.CompareTo (t1), "A6"); + Assert.AreEqual (0, t2.CompareTo (t2), "A7"); + Assert.AreEqual (-1, TimeSpan.Compare (TimeSpan.MinValue, TimeSpan.MaxValue), "A8"); - AssertEquals ("A9", 1, TimeSpan.Zero.CompareTo (null)); + Assert.AreEqual (1, TimeSpan.Zero.CompareTo (null), "A9"); try { @@ -507,14 +507,14 @@ public class TimeSpanTest : Assertion { { exception = true; } - Assert ("A10", exception); + Assert.IsTrue (exception, "A10"); - AssertEquals ("A11", false, t1 == t2); - AssertEquals ("A12", false, t1 > t2); - AssertEquals ("A13", false, t1 >= t2); - AssertEquals ("A14", true, t1 != t2); - AssertEquals ("A15", true, t1 < t2); - AssertEquals ("A16", true, t1 <= t2); + Assert.AreEqual (false, t1 == t2, "A11"); + Assert.AreEqual (false, t1 > t2, "A12"); + Assert.AreEqual (false, t1 >= t2, "A13"); + Assert.AreEqual (true, t1 != t2, "A14"); + Assert.AreEqual (true, t1 < t2, "A15"); + Assert.AreEqual (true, t1 <= t2, "A16"); } [Test] @@ -528,8 +528,8 @@ public class TimeSpanTest : Assertion { TimeSpan t1; bool exception; - AssertEquals ("A1", "-00:00:00.0012345", new TimeSpan (12345).Negate ().ToString ()); - AssertEquals ("A2", "00:00:00.0012345", new TimeSpan (-12345).Duration ().ToString ()); + Assert.AreEqual ("-00:00:00.0012345", new TimeSpan (12345).Negate ().ToString (), "A1"); + Assert.AreEqual ("00:00:00.0012345", new TimeSpan (-12345).Duration ().ToString (), "A2"); try { @@ -539,10 +539,10 @@ public class TimeSpanTest : Assertion { catch (OverflowException) { exception = true; } - Assert ("A4", exception); + Assert.IsTrue (exception, "A4"); - AssertEquals ("A5", "-00:00:00.0000077", (-(new TimeSpan (77))).ToString ()); - AssertEquals("A6", "00:00:00.0000077", (+(new TimeSpan(77))).ToString()); + Assert.AreEqual ("-00:00:00.0000077", (-(new TimeSpan (77))).ToString (), "A5"); + Assert.AreEqual ("00:00:00.0000077", (+(new TimeSpan(77))).ToString(), "A6"); } public void TestEquals () @@ -551,26 +551,26 @@ public class TimeSpanTest : Assertion { TimeSpan t2 = new TimeSpan (2); string s = "justastring"; - AssertEquals ("A1", true, t1.Equals (t1)); - AssertEquals ("A2", false, t1.Equals (t2)); - AssertEquals ("A3", false, t1.Equals (s)); - AssertEquals ("A4", false, t1.Equals (null)); - AssertEquals ("A5", true, TimeSpan.Equals (t1, t1)); - AssertEquals ("A6", false, TimeSpan.Equals (t1, t2)); - AssertEquals ("A7", false, TimeSpan.Equals (t1, null)); - AssertEquals ("A8", false, TimeSpan.Equals (t1, s)); - AssertEquals ("A9", false, TimeSpan.Equals (s, t2)); - AssertEquals ("A10", true, TimeSpan.Equals (null,null)); + Assert.AreEqual (true, t1.Equals (t1), "A1"); + Assert.AreEqual (false, t1.Equals (t2), "A2"); + Assert.AreEqual (false, t1.Equals (s), "A3"); + Assert.AreEqual (false, t1.Equals (null), "A4"); + Assert.AreEqual (true, TimeSpan.Equals (t1, t1), "A5"); + Assert.AreEqual (false, TimeSpan.Equals (t1, t2), "A6"); + Assert.AreEqual (false, TimeSpan.Equals (t1, null), "A7"); + Assert.AreEqual (false, TimeSpan.Equals (t1, s), "A8"); + Assert.AreEqual (false, TimeSpan.Equals (s, t2), "A9"); + Assert.AreEqual (true, TimeSpan.Equals (null, null), "A10"); } public void TestFromXXXX () { - AssertEquals ("A1", "12.08:16:48", TimeSpan.FromDays (12.345).ToString ()); - AssertEquals ("A2", "12:20:42", TimeSpan.FromHours (12.345).ToString ()); - AssertEquals ("A3", "00:12:20.7000000", TimeSpan.FromMinutes (12.345).ToString ()); - AssertEquals ("A4", "00:00:12.3450000", TimeSpan.FromSeconds (12.345).ToString ()); - AssertEquals ("A5", "00:00:00.0120000", TimeSpan.FromMilliseconds (12.345).ToString ()); - AssertEquals ("A6", "00:00:00.0012345", TimeSpan.FromTicks (12345).ToString ()); + Assert.AreEqual ("12.08:16:48", TimeSpan.FromDays (12.345).ToString (), "A1"); + Assert.AreEqual ("12:20:42", TimeSpan.FromHours (12.345).ToString (), "A2"); + Assert.AreEqual ("00:12:20.7000000", TimeSpan.FromMinutes (12.345).ToString (), "A3"); + Assert.AreEqual ("00:00:12.3450000", TimeSpan.FromSeconds (12.345).ToString (), "A4"); + Assert.AreEqual ("00:00:00.0120000", TimeSpan.FromMilliseconds (12.345).ToString (), "A5"); + Assert.AreEqual ("00:00:00.0012345", TimeSpan.FromTicks (12345).ToString (), "A6"); } [Test] @@ -599,7 +599,7 @@ public class TimeSpanTest : Assertion { public void FromDays_PositiveInfinity () { // LAMESPEC: Document to return TimeSpan.MaxValue - AssertEquals (TimeSpan.MaxValue, TimeSpan.FromDays (Double.PositiveInfinity)); + Assert.AreEqual (TimeSpan.MaxValue, TimeSpan.FromDays (Double.PositiveInfinity)); } [Test] @@ -607,7 +607,7 @@ public class TimeSpanTest : Assertion { public void FromDays_NegativeInfinity () { // LAMESPEC: Document to return TimeSpan.MinValue - AssertEquals (TimeSpan.MinValue, TimeSpan.FromDays (Double.NegativeInfinity)); + Assert.AreEqual (TimeSpan.MinValue, TimeSpan.FromDays (Double.NegativeInfinity)); } [Test] @@ -636,7 +636,7 @@ public class TimeSpanTest : Assertion { public void FromHours_PositiveInfinity () { // LAMESPEC: Document to return TimeSpan.MaxValue - AssertEquals (TimeSpan.MaxValue, TimeSpan.FromHours (Double.PositiveInfinity)); + Assert.AreEqual (TimeSpan.MaxValue, TimeSpan.FromHours (Double.PositiveInfinity)); } [Test] @@ -644,7 +644,7 @@ public class TimeSpanTest : Assertion { public void FromHours_NegativeInfinity () { // LAMESPEC: Document to return TimeSpan.MinValue - AssertEquals (TimeSpan.MinValue, TimeSpan.FromHours (Double.NegativeInfinity)); + Assert.AreEqual (TimeSpan.MinValue, TimeSpan.FromHours (Double.NegativeInfinity)); } [Test] @@ -673,7 +673,7 @@ public class TimeSpanTest : Assertion { public void FromMilliseconds_PositiveInfinity () { // LAMESPEC: Document to return TimeSpan.MaxValue - AssertEquals (TimeSpan.MaxValue, TimeSpan.FromMilliseconds (Double.PositiveInfinity)); + Assert.AreEqual (TimeSpan.MaxValue, TimeSpan.FromMilliseconds (Double.PositiveInfinity)); } [Test] @@ -681,7 +681,7 @@ public class TimeSpanTest : Assertion { public void FromMilliseconds_NegativeInfinity () { // LAMESPEC: Document to return TimeSpan.MinValue - AssertEquals (TimeSpan.MinValue, TimeSpan.FromMilliseconds (Double.NegativeInfinity)); + Assert.AreEqual (TimeSpan.MinValue, TimeSpan.FromMilliseconds (Double.NegativeInfinity)); } [Test] @@ -710,7 +710,7 @@ public class TimeSpanTest : Assertion { public void FromMinutes_PositiveInfinity () { // LAMESPEC: Document to return TimeSpan.MaxValue - AssertEquals (TimeSpan.MaxValue, TimeSpan.FromMinutes (Double.PositiveInfinity)); + Assert.AreEqual (TimeSpan.MaxValue, TimeSpan.FromMinutes (Double.PositiveInfinity)); } [Test] @@ -718,7 +718,7 @@ public class TimeSpanTest : Assertion { public void FromMinutes_NegativeInfinity () { // LAMESPEC: Document to return TimeSpan.MinValue - AssertEquals (TimeSpan.MinValue, TimeSpan.FromMinutes (Double.NegativeInfinity)); + Assert.AreEqual (TimeSpan.MinValue, TimeSpan.FromMinutes (Double.NegativeInfinity)); } [Test] @@ -747,7 +747,7 @@ public class TimeSpanTest : Assertion { public void FromSeconds_PositiveInfinity () { // LAMESPEC: Document to return TimeSpan.MaxValue - AssertEquals (TimeSpan.MaxValue, TimeSpan.FromSeconds (Double.PositiveInfinity)); + Assert.AreEqual (TimeSpan.MaxValue, TimeSpan.FromSeconds (Double.PositiveInfinity)); } [Test] @@ -755,12 +755,12 @@ public class TimeSpanTest : Assertion { public void FromSeconds_NegativeInfinity () { // LAMESPEC: Document to return TimeSpan.MinValue - AssertEquals (TimeSpan.MinValue, TimeSpan.FromSeconds (Double.NegativeInfinity)); + Assert.AreEqual (TimeSpan.MinValue, TimeSpan.FromSeconds (Double.NegativeInfinity)); } public void TestGetHashCode () { - AssertEquals ("A1", 77, new TimeSpan (77).GetHashCode ()); + Assert.AreEqual (77, new TimeSpan (77).GetHashCode (), "A1"); } private void ParseHelper (string s, bool expectFormat, bool expectOverflow, string expect) @@ -778,11 +778,11 @@ public class TimeSpanTest : Assertion { catch (FormatException) { formatException = true; } - AssertEquals ("A1", expectFormat, formatException); - AssertEquals ("A2", expectOverflow, overflowException); + Assert.AreEqual (expectFormat, formatException, "A1"); + Assert.AreEqual (expectOverflow, overflowException, "A2"); if (!expectOverflow && !expectFormat) { - AssertEquals ("A3", expect, result); + Assert.AreEqual (expect, result, "A3"); } } @@ -808,7 +808,7 @@ public class TimeSpanTest : Assertion { public void Parse_Days_WithoutColon () { TimeSpan ts = TimeSpan.Parse ("1"); - AssertEquals ("Days", 1, ts.Days); + Assert.AreEqual (1, ts.Days, "Days"); } public void TestSubstract () @@ -820,8 +820,8 @@ public class TimeSpanTest : Assertion { TimeSpan t5; bool exception; - AssertEquals ("A1", "1.01:01:01.0010000", t3.ToString ()); - AssertEquals ("A2", "1.01:01:01.0010000", t4.ToString ()); + Assert.AreEqual ("1.01:01:01.0010000", t3.ToString (), "A1"); + Assert.AreEqual ("1.01:01:01.0010000", t4.ToString (), "A2"); try { t5 = TimeSpan.MinValue - new TimeSpan (1); exception = false; @@ -829,7 +829,7 @@ public class TimeSpanTest : Assertion { catch (OverflowException) { exception = true; } - Assert ("A3", exception); + Assert.IsTrue (exception, "A3"); } public void TestToString () @@ -837,18 +837,18 @@ public class TimeSpanTest : Assertion { TimeSpan t1 = new TimeSpan (1,2,3,4,5); TimeSpan t2 = -t1; - AssertEquals ("A1", "1.02:03:04.0050000", t1.ToString ()); - AssertEquals ("A2", "-1.02:03:04.0050000", t2.ToString ()); - AssertEquals ("A3", "10675199.02:48:05.4775807", TimeSpan.MaxValue.ToString ()); - AssertEquals ("A4", "-10675199.02:48:05.4775808", TimeSpan.MinValue.ToString ()); + Assert.AreEqual ("1.02:03:04.0050000", t1.ToString (), "A1"); + Assert.AreEqual ("-1.02:03:04.0050000", t2.ToString (), "A2"); + Assert.AreEqual ("10675199.02:48:05.4775807", TimeSpan.MaxValue.ToString (), "A3"); + Assert.AreEqual ("-10675199.02:48:05.4775808", TimeSpan.MinValue.ToString (), "A4"); } [Test] public void ToString_Constants () { - AssertEquals ("Zero", "00:00:00", TimeSpan.Zero.ToString ()); - AssertEquals ("MaxValue", "10675199.02:48:05.4775807", TimeSpan.MaxValue.ToString ()); - AssertEquals ("MinValue", "-10675199.02:48:05.4775808", TimeSpan.MinValue.ToString ()); + Assert.AreEqual ("00:00:00", TimeSpan.Zero.ToString (), "Zero"); + Assert.AreEqual ("10675199.02:48:05.4775807", TimeSpan.MaxValue.ToString (), "MaxValue"); + Assert.AreEqual ("-10675199.02:48:05.4775808", TimeSpan.MinValue.ToString (), "MinValue"); } [Test] @@ -862,8 +862,8 @@ public class TimeSpanTest : Assertion { [Test] public void Parse_MinMaxValues () { - AssertEquals ("MaxValue", TimeSpan.MaxValue, TimeSpan.Parse ("10675199.02:48:05.4775807")); - AssertEquals ("MinValue", TimeSpan.MinValue, TimeSpan.Parse ("-10675199.02:48:05.4775808")); + Assert.AreEqual (TimeSpan.MaxValue, TimeSpan.Parse ("10675199.02:48:05.4775807"), "MaxValue"); + Assert.AreEqual (TimeSpan.MinValue, TimeSpan.Parse ("-10675199.02:48:05.4775808"), "MinValue"); } [Test] diff --git a/mcs/class/corlib/Test/System/TimeZoneTest.cs b/mcs/class/corlib/Test/System/TimeZoneTest.cs index 0531c9e8edb..593010f203b 100644 --- a/mcs/class/corlib/Test/System/TimeZoneTest.cs +++ b/mcs/class/corlib/Test/System/TimeZoneTest.cs @@ -18,126 +18,128 @@ using System.Runtime.Serialization.Formatters.Binary; namespace MonoTests.System { -public class TimeZoneTest : TestCase { +[TestFixture] +public class TimeZoneTest { private CultureInfo oldcult; public TimeZoneTest() {} - protected override void SetUp () + [SetUp] + protected void SetUp () { oldcult = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = new CultureInfo (""); } - - protected override void TearDown () + + [TearDown] + protected void TearDown () { Thread.CurrentThread.CurrentCulture = oldcult; } private void CET (TimeZone t1) { - AssertEquals("A01", "CET", t1.StandardName); - AssertEquals("A02", "CEST", t1.DaylightName); + Assert.AreEqual("CET", t1.StandardName, "A01"); + Assert.AreEqual("CEST", t1.DaylightName, "A02"); DaylightTime d1 = t1.GetDaylightChanges (2002); - AssertEquals("A03", "03/31/2002 02:00:00", d1.Start.ToString ("G")); - AssertEquals("A04", "10/27/2002 03:00:00", d1.End.ToString ("G")); - AssertEquals("A05", 36000000000L, d1.Delta.Ticks); + Assert.AreEqual("03/31/2002 02:00:00", d1.Start.ToString ("G"), "A03"); + Assert.AreEqual("10/27/2002 03:00:00", d1.End.ToString ("G"), "A04"); + Assert.AreEqual(36000000000L, d1.Delta.Ticks, "A05"); DaylightTime d2 = t1.GetDaylightChanges (1996); - AssertEquals("A06", "03/31/1996 02:00:00", d2.Start.ToString ("G")); - AssertEquals("A07", "10/27/1996 03:00:00", d2.End.ToString ("G")); - AssertEquals("A08", 36000000000L, d2.Delta.Ticks); + Assert.AreEqual("03/31/1996 02:00:00", d2.Start.ToString ("G"), "A06"); + Assert.AreEqual("10/27/1996 03:00:00", d2.End.ToString ("G"), "A07"); + Assert.AreEqual(36000000000L, d2.Delta.Ticks, "A08"); DateTime d3 = new DateTime (2002,2,25); - AssertEquals("A09", false, t1.IsDaylightSavingTime (d3)); + Assert.AreEqual(false, t1.IsDaylightSavingTime (d3), "A09"); DateTime d4 = new DateTime (2002,4,2); - AssertEquals("A10", true, t1.IsDaylightSavingTime (d4)); + Assert.AreEqual(true, t1.IsDaylightSavingTime (d4), "A10"); DateTime d5 = new DateTime (2002,11,4); - AssertEquals("A11", false, t1.IsDaylightSavingTime (d5)); + Assert.AreEqual(false, t1.IsDaylightSavingTime (d5), "A11"); - AssertEquals("A12", 36000000000L, t1.GetUtcOffset (d3).Ticks); - AssertEquals("A13", 72000000000L, t1.GetUtcOffset (d4).Ticks); - AssertEquals("A14", 36000000000L, t1.GetUtcOffset (d5).Ticks); + Assert.AreEqual(36000000000L, t1.GetUtcOffset (d3).Ticks, "A12"); + Assert.AreEqual(72000000000L, t1.GetUtcOffset (d4).Ticks, "A13"); + Assert.AreEqual(36000000000L, t1.GetUtcOffset (d5).Ticks, "A14"); } private void EST (TimeZone t1) { // It could be EST though... - //AssertEquals("B01", "Eastern Standard Time", t1.StandardName); - //AssertEquals("B02", "Eastern Daylight Time", t1.DaylightName); + //Assert.AreEqual("Eastern Standard Time", t1.StandardName, "B01"); + //Assert.AreEqual("Eastern Daylight Time", t1.DaylightName, "B02"); DaylightTime d1 = t1.GetDaylightChanges (2002); - AssertEquals("B03", "04/07/2002 02:00:00", d1.Start.ToString ("G")); - AssertEquals("B04", "10/27/2002 02:00:00", d1.End.ToString ("G")); - AssertEquals("B05", 36000000000L, d1.Delta.Ticks); + Assert.AreEqual("04/07/2002 02:00:00", d1.Start.ToString ("G"), "B03"); + Assert.AreEqual("10/27/2002 02:00:00", d1.End.ToString ("G"), "B04"); + Assert.AreEqual(36000000000L, d1.Delta.Ticks, "B05"); DaylightTime d2 = t1.GetDaylightChanges (1996); - AssertEquals("B06", "04/07/1996 02:00:00", d2.Start.ToString ("G")); - AssertEquals("B07", "10/27/1996 02:00:00", d2.End.ToString ("G")); - AssertEquals("B08", 36000000000L, d2.Delta.Ticks); + Assert.AreEqual("04/07/1996 02:00:00", d2.Start.ToString ("G"), "B06"); + Assert.AreEqual("10/27/1996 02:00:00", d2.End.ToString ("G"), "B07"); + Assert.AreEqual(36000000000L, d2.Delta.Ticks, "B08"); DateTime d3 = new DateTime (2002,2,25); - AssertEquals("B09", false, t1.IsDaylightSavingTime (d3)); + Assert.AreEqual(false, t1.IsDaylightSavingTime (d3), "B09"); DateTime d4 = new DateTime (2002,4,8); - AssertEquals("B10", true, t1.IsDaylightSavingTime (d4)); + Assert.AreEqual(true, t1.IsDaylightSavingTime (d4), "B10"); DateTime d5 = new DateTime (2002,11,4); - AssertEquals("B11", false, t1.IsDaylightSavingTime (d5)); + Assert.AreEqual(false, t1.IsDaylightSavingTime (d5), "B11"); - AssertEquals("B12", -180000000000L, t1.GetUtcOffset (d3).Ticks); - AssertEquals("B13", -144000000000L, t1.GetUtcOffset (d4).Ticks); - AssertEquals("B14", -180000000000L, t1.GetUtcOffset (d5).Ticks); + Assert.AreEqual(-180000000000L, t1.GetUtcOffset (d3).Ticks, "B12"); + Assert.AreEqual(-144000000000L, t1.GetUtcOffset (d4).Ticks, "B13"); + Assert.AreEqual(-180000000000L, t1.GetUtcOffset (d5).Ticks, "B14"); } private void TST (TimeZone t1) { - AssertEquals("C01", "Tokyo Standard Time", t1.StandardName); - AssertEquals("C02", "Tokyo Standard Time", t1.DaylightName); + Assert.AreEqual("Tokyo Standard Time", t1.StandardName, "C01"); + Assert.AreEqual("Tokyo Standard Time", t1.DaylightName, "C02"); DateTime d3 = new DateTime (2002,2,25); - AssertEquals("C09", false, t1.IsDaylightSavingTime (d3)); + Assert.AreEqual(false, t1.IsDaylightSavingTime (d3), "C09"); DateTime d4 = new DateTime (2002,4,8); - AssertEquals("C10", false, t1.IsDaylightSavingTime (d4)); + Assert.AreEqual(false, t1.IsDaylightSavingTime (d4), "C10"); DateTime d5 = new DateTime (2002,11,4); - AssertEquals("C11", false, t1.IsDaylightSavingTime (d5)); + Assert.AreEqual(false, t1.IsDaylightSavingTime (d5), "C11"); - AssertEquals("C12", 324000000000L, t1.GetUtcOffset (d3).Ticks); - AssertEquals("C13", 324000000000L, t1.GetUtcOffset (d4).Ticks); - AssertEquals("C14", 324000000000L, t1.GetUtcOffset (d5).Ticks); + Assert.AreEqual(324000000000L, t1.GetUtcOffset (d3).Ticks, "C12"); + Assert.AreEqual(324000000000L, t1.GetUtcOffset (d4).Ticks, "C13"); + Assert.AreEqual(324000000000L, t1.GetUtcOffset (d5).Ticks, "C14"); } private void GMT (TimeZone t1) { // Probably wont work on MS.NET, but is better than nothing. Where do // we change our implementation to match theirs? - AssertEquals("D01", "GMT", t1.StandardName); - AssertEquals("D02", "BST", t1.DaylightName); + Assert.AreEqual("GMT", t1.StandardName, "D01"); + Assert.AreEqual("BST", t1.DaylightName, "D02"); DaylightTime d1 = t1.GetDaylightChanges (2002); - AssertEquals("D03", "03/31/2002 01:00:00", d1.Start.ToString ("G")); - AssertEquals("D04", "10/27/2002 02:00:00", d1.End.ToString ("G")); - AssertEquals("D05", 36000000000L, d1.Delta.Ticks); + Assert.AreEqual("03/31/2002 01:00:00", d1.Start.ToString ("G"), "D03"); + Assert.AreEqual("10/27/2002 02:00:00", d1.End.ToString ("G"), "D04"); + Assert.AreEqual(36000000000L, d1.Delta.Ticks, "D05"); DaylightTime d2 = t1.GetDaylightChanges (1996); - AssertEquals("D06", "03/31/1996 01:00:00", d2.Start.ToString ("G")); - AssertEquals("D07", "10/27/1996 02:00:00", d2.End.ToString ("G")); - AssertEquals("D08", 36000000000L, d2.Delta.Ticks); + Assert.AreEqual("03/31/1996 01:00:00", d2.Start.ToString ("G"), "D06"); + Assert.AreEqual("10/27/1996 02:00:00", d2.End.ToString ("G"), "D07"); + Assert.AreEqual(36000000000L, d2.Delta.Ticks, "D08"); DateTime d3 = new DateTime (2002,2,25); - AssertEquals("D09", false, t1.IsDaylightSavingTime (d3)); + Assert.AreEqual(false, t1.IsDaylightSavingTime (d3), "D09"); DateTime d4 = new DateTime (2002,4,2); - AssertEquals("D10", true, t1.IsDaylightSavingTime (d4)); + Assert.AreEqual(true, t1.IsDaylightSavingTime (d4), "D10"); DateTime d5 = new DateTime (2002,11,4); - AssertEquals("D11", false, t1.IsDaylightSavingTime (d5)); + Assert.AreEqual(false, t1.IsDaylightSavingTime (d5), "D11"); - AssertEquals("D12", 0L, t1.GetUtcOffset (d3).Ticks); - AssertEquals("D13", 36000000000L, t1.GetUtcOffset (d4).Ticks); - AssertEquals("D14", 0L, t1.GetUtcOffset (d5).Ticks); + Assert.AreEqual(0L, t1.GetUtcOffset (d3).Ticks, "D12"); + Assert.AreEqual(36000000000L, t1.GetUtcOffset (d4).Ticks, "D13"); + Assert.AreEqual(0L, t1.GetUtcOffset (d5).Ticks, "D14"); } - - + [Test] public void TestCtors () { TimeZone t1 = TimeZone.CurrentTimeZone; @@ -173,8 +175,8 @@ public class TimeZoneTest : TestCase { ms.Position = 0; TimeZone clone = (TimeZone) bf.Deserialize (ms); - AssertEquals ("DaylightName", tz.DaylightName, clone.DaylightName); - AssertEquals ("StandardName", tz.StandardName, clone.StandardName); + Assert.AreEqual (tz.DaylightName, clone.DaylightName, "DaylightName"); + Assert.AreEqual (tz.StandardName, clone.StandardName, "StandardName"); } static private byte[] serialized_timezone = { @@ -246,8 +248,8 @@ public class TimeZoneTest : TestCase { MemoryStream ms = new MemoryStream (serialized_timezone); BinaryFormatter bf = new BinaryFormatter (); TimeZone tz = (TimeZone) bf.Deserialize (ms); - AssertEquals ("DaylightName", "Eastern Daylight Time", tz.DaylightName); - AssertEquals ("StandardName", "Eastern Standard Time", tz.StandardName); + Assert.AreEqual ("Eastern Daylight Time", tz.DaylightName, "DaylightName"); + Assert.AreEqual ("Eastern Standard Time", tz.StandardName, "StandardName"); } [Test] @@ -258,11 +260,11 @@ public class TimeZoneTest : TestCase { if (dst_start_utc == DateTime.MinValue) return; - Assert ("0:1:59 < 0:3:00", tz.ToLocalTime (dst_start_utc.Subtract (new TimeSpan (0, 1, 0))) < tz.ToLocalTime (dst_start_utc)); - Assert ("0:3:00 < 0:3:01", tz.ToLocalTime (dst_start_utc) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 1, 0)))); - Assert ("0:3:01 < 0:3:59", tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 1, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 59, 0)))); - Assert ("0:3:59 < 0:4:00", tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 59, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 0, 0)))); - Assert ("0:4:00 < 0:4:01", tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 0, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 1, 0)))); + Assert.IsTrue (tz.ToLocalTime (dst_start_utc.Subtract (new TimeSpan (0, 1, 0))) < tz.ToLocalTime (dst_start_utc), "0:1:59 < 0:3:00"); + Assert.IsTrue (tz.ToLocalTime (dst_start_utc) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 1, 0))), "0:3:00 < 0:3:01"); + Assert.IsTrue (tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 1, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 59, 0))), "0:3:01 < 0:3:59"); + Assert.IsTrue (tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (0, 59, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 0, 0))), "0:3:59 < 0:4:00"); + Assert.IsTrue (tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 0, 0))) < tz.ToLocalTime (dst_start_utc.Add (new TimeSpan (1, 1, 0))), "0:4:00 < 0:4:01"); } } diff --git a/mcs/class/corlib/Test/System/TypeTest.cs b/mcs/class/corlib/Test/System/TypeTest.cs index 26248f7d8f5..b1a3e80aa7e 100644 --- a/mcs/class/corlib/Test/System/TypeTest.cs +++ b/mcs/class/corlib/Test/System/TypeTest.cs @@ -2121,7 +2121,7 @@ PublicKeyToken=b77a5c561934e089")); [Test] // bug #348522 public void InvokeMember_WithoutDefaultValue () { - BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod;; + BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod; try { typeof (Bug348522).InvokeMember ("Test", flags, new FirstMethodBinder (), new Bug348522(), new object [] {Missing.Value}, null, null, null); @@ -2136,6 +2136,20 @@ PublicKeyToken=b77a5c561934e089")); } } + [Test] + public void InvokeMember_OutParam () + { + object[] args = new object[] { new string [0] }; + typeof (TypeTest).InvokeMember ("OutTest", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, args); + Assert.IsTrue (args [0] is string[]); + Assert.AreEqual (10, ((string[])args[0]).Length); + } + + public static void OutTest (out string[] a1) + { + a1 = new string [10]; + } + class X { public static int Value; diff --git a/mcs/class/corlib/Test/System/UInt16Test.cs b/mcs/class/corlib/Test/System/UInt16Test.cs index 18bf0475cba..ff324fa5385 100644 --- a/mcs/class/corlib/Test/System/UInt16Test.cs +++ b/mcs/class/corlib/Test/System/UInt16Test.cs @@ -14,7 +14,7 @@ namespace MonoTests.System { [TestFixture] -public class UInt16Test : Assertion +public class UInt16Test { private const UInt16 MyUInt16_1 = 42; private const UInt16 MyUInt16_2 = 0; @@ -70,31 +70,31 @@ public class UInt16Test : Assertion public void TestMinMax() { - AssertEquals(UInt16.MinValue, MyUInt16_2); - AssertEquals(UInt16.MaxValue, MyUInt16_3); + Assert.AreEqual(UInt16.MinValue, MyUInt16_2); + Assert.AreEqual(UInt16.MaxValue, MyUInt16_3); } public void TestCompareTo() { - Assert(MyUInt16_3.CompareTo(MyUInt16_2) > 0); - Assert(MyUInt16_2.CompareTo(MyUInt16_2) == 0); - Assert(MyUInt16_1.CompareTo((UInt16)(42)) == 0); - Assert(MyUInt16_2.CompareTo(MyUInt16_3) < 0); + Assert.IsTrue(MyUInt16_3.CompareTo(MyUInt16_2) > 0); + Assert.IsTrue(MyUInt16_2.CompareTo(MyUInt16_2) == 0); + Assert.IsTrue(MyUInt16_1.CompareTo((UInt16)(42)) == 0); + Assert.IsTrue(MyUInt16_2.CompareTo(MyUInt16_3) < 0); try { MyUInt16_2.CompareTo((object)100); - Fail("Should raise a System.ArgumentException"); + Assert.Fail("Should raise a System.ArgumentException"); } catch (Exception e) { - Assert(typeof(ArgumentException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentException) == e.GetType()); } } public void TestEquals() { - Assert(MyUInt16_1.Equals(MyUInt16_1)); - Assert(MyUInt16_1.Equals((object)(UInt16)(42))); - Assert(MyUInt16_1.Equals((object)(SByte)(42)) == false); - Assert(MyUInt16_1.Equals(MyUInt16_2) == false); + Assert.IsTrue(MyUInt16_1.Equals(MyUInt16_1)); + Assert.IsTrue(MyUInt16_1.Equals((object)(UInt16)(42))); + Assert.IsTrue(MyUInt16_1.Equals((object)(SByte)(42)) == false); + Assert.IsTrue(MyUInt16_1.Equals(MyUInt16_2) == false); } public void TestGetHashCode() @@ -105,90 +105,90 @@ public class UInt16Test : Assertion MyUInt16_3.GetHashCode(); } catch { - Fail("GetHashCode should not raise an exception here"); + Assert.Fail("GetHashCode should not raise an exception here"); } } public void TestParse() { //test Parse(string s) - Assert(MyUInt16_1 == UInt16.Parse(MyString1)); - Assert(MyUInt16_2 == UInt16.Parse(MyString2)); - Assert(MyUInt16_3 == UInt16.Parse(MyString3)); + Assert.IsTrue(MyUInt16_1 == UInt16.Parse(MyString1)); + Assert.IsTrue(MyUInt16_2 == UInt16.Parse(MyString2)); + Assert.IsTrue(MyUInt16_3 == UInt16.Parse(MyString3)); try { UInt16.Parse(null); - Fail("Should raise a System.ArgumentNullException"); + Assert.Fail("Should raise a System.ArgumentNullException"); } catch (Exception e) { - Assert(typeof(ArgumentNullException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentNullException) == e.GetType()); } try { UInt16.Parse("not-a-number"); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } try { int OverInt = UInt16.MaxValue + 1; UInt16.Parse(OverInt.ToString()); - Fail("Should raise a System.OverflowException"); + Assert.Fail("Should raise a System.OverflowException"); } catch (Exception e) { - Assert(typeof(OverflowException) == e.GetType()); + Assert.IsTrue(typeof(OverflowException) == e.GetType()); } //test Parse(string s, NumberStyles style) - Assert(42 == UInt16.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", NumberStyles.Currency)); + Assert.IsTrue(42 == UInt16.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", NumberStyles.Currency)); try { UInt16.Parse("$42", NumberStyles.Integer); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } //test Parse(string s, IFormatProvider provider) - Assert(42 == UInt16.Parse(" 42 ", Nfi)); + Assert.IsTrue(42 == UInt16.Parse(" 42 ", Nfi)); try { UInt16.Parse("%42", Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } //test Parse(string s, NumberStyles style, IFormatProvider provider) - Assert(16 == UInt16.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); + Assert.IsTrue(16 == UInt16.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); try { UInt16.Parse("$42", NumberStyles.Integer, Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } } public void TestToString() { //test ToString() - AssertEquals("A1", MyString1, MyUInt16_1.ToString()); - AssertEquals("A2", MyString2, MyUInt16_2.ToString()); - AssertEquals("A3", MyString3, MyUInt16_3.ToString()); + Assert.AreEqual(MyString1, MyUInt16_1.ToString(), "A1"); + Assert.AreEqual(MyString2, MyUInt16_2.ToString(), "A2"); + Assert.AreEqual(MyString3, MyUInt16_3.ToString(), "A3"); //test ToString(string format) for (int i=0; i < Formats1.Length; i++) { Console.WriteLine ("d:" + NumberFormatInfo.CurrentInfo.NumberDecimalDigits); - AssertEquals("A4:"+i.ToString(), Results1[i], MyUInt16_2.ToString(Formats1[i])); - AssertEquals("A5:"+i.ToString(), Results2[i], MyUInt16_3.ToString(Formats2[i])); + Assert.AreEqual(Results1[i], MyUInt16_2.ToString(Formats1[i]), "A4:"+i.ToString()); + Assert.AreEqual(Results2[i], MyUInt16_3.ToString(Formats2[i]), "A5:"+i.ToString()); } //test ToString(string format, IFormatProvider provider); for (int i=0; i < Formats1.Length; i++) { - AssertEquals("A6:"+i.ToString(), ResultsNfi1[i], MyUInt16_2.ToString(Formats1[i], Nfi)); - AssertEquals("A7:"+i.ToString(), ResultsNfi2[i], MyUInt16_3.ToString(Formats2[i], Nfi)); + Assert.AreEqual(ResultsNfi1[i], MyUInt16_2.ToString(Formats1[i], Nfi), "A6:"+i.ToString()); + Assert.AreEqual(ResultsNfi2[i], MyUInt16_3.ToString(Formats2[i], Nfi), "A7:"+i.ToString()); } try { MyUInt16_1.ToString("z"); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert("A8", typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType(), "A8"); } } @@ -198,14 +198,14 @@ public class UInt16Test : Assertion UInt16 i = 254; // everything defaults to "G" string def = i.ToString ("G"); - AssertEquals ("ToString()", def, i.ToString ()); - AssertEquals ("ToString((IFormatProvider)null)", def, i.ToString ((IFormatProvider)null)); - AssertEquals ("ToString((string)null)", def, i.ToString ((string)null)); - AssertEquals ("ToString(empty)", def, i.ToString (String.Empty)); - AssertEquals ("ToString(null,null)", def, i.ToString (null, null)); - AssertEquals ("ToString(empty,null)", def, i.ToString (String.Empty, null)); + Assert.AreEqual (def, i.ToString (), "ToString()"); + Assert.AreEqual (def, i.ToString ((IFormatProvider)null), "ToString((IFormatProvider)null)"); + Assert.AreEqual (def, i.ToString ((string)null), "ToString((string)null)"); + Assert.AreEqual (def, i.ToString (String.Empty), "ToString(empty)"); + Assert.AreEqual (def, i.ToString (null, null), "ToString(null,null)"); + Assert.AreEqual (def, i.ToString (String.Empty, null), "ToString(empty,null)"); - AssertEquals ("ToString(G)", "254", def); + Assert.AreEqual ("254", def, "ToString(G)"); } } diff --git a/mcs/class/corlib/Test/System/UInt32Test.cs b/mcs/class/corlib/Test/System/UInt32Test.cs index 525f3d53fb3..f7326ce6c3d 100644 --- a/mcs/class/corlib/Test/System/UInt32Test.cs +++ b/mcs/class/corlib/Test/System/UInt32Test.cs @@ -14,7 +14,7 @@ namespace MonoTests.System { [TestFixture] -public class UInt32Test : Assertion +public class UInt32Test { private const UInt32 MyUInt32_1 = 42; private const UInt32 MyUInt32_2 = 0; @@ -71,50 +71,50 @@ public class UInt32Test : Assertion public void TestMinMax() { - AssertEquals(UInt32.MinValue, MyUInt32_2); - AssertEquals(UInt32.MaxValue, MyUInt32_3); + Assert.AreEqual(UInt32.MinValue, MyUInt32_2); + Assert.AreEqual(UInt32.MaxValue, MyUInt32_3); } public void TestCompareTo() { - Assert(MyUInt32_3.CompareTo(MyUInt32_2) > 0); - Assert(MyUInt32_2.CompareTo(MyUInt32_2) == 0); - Assert(MyUInt32_1.CompareTo((UInt32)(42)) == 0); - Assert(MyUInt32_2.CompareTo(MyUInt32_3) < 0); - Assert (1 == UInt32.Parse ("1")); - Assert (1 == UInt32.Parse (" 1")); - Assert (1 == UInt32.Parse (" 1")); - Assert (1 == UInt32.Parse ("1 ")); - Assert (1 == UInt32.Parse ("+1")); + Assert.IsTrue(MyUInt32_3.CompareTo(MyUInt32_2) > 0); + Assert.IsTrue(MyUInt32_2.CompareTo(MyUInt32_2) == 0); + Assert.IsTrue(MyUInt32_1.CompareTo((UInt32)(42)) == 0); + Assert.IsTrue(MyUInt32_2.CompareTo(MyUInt32_3) < 0); + Assert.IsTrue (1 == UInt32.Parse ("1")); + Assert.IsTrue (1 == UInt32.Parse (" 1")); + Assert.IsTrue (1 == UInt32.Parse (" 1")); + Assert.IsTrue (1 == UInt32.Parse ("1 ")); + Assert.IsTrue (1 == UInt32.Parse ("+1")); try { UInt32.Parse (" + 1 "); - Fail ("Should raise FormatException1"); + Assert.Fail ("Should raise FormatException1"); } catch (Exception e){ - Assert (typeof (FormatException) == e.GetType ()); + Assert.IsTrue (typeof (FormatException) == e.GetType ()); } try { UInt32.Parse (" + "); - Fail ("Should raise FormatException"); + Assert.Fail ("Should raise FormatException"); } catch (Exception e){ - Assert (typeof (FormatException) == e.GetType ()); + Assert.IsTrue (typeof (FormatException) == e.GetType ()); } try { MyUInt32_2.CompareTo((object)(Int16)100); - Fail("Should raise a System.ArgumentException"); + Assert.Fail("Should raise a System.ArgumentException"); } catch (Exception e) { - Assert(typeof(ArgumentException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentException) == e.GetType()); } } public void TestEquals() { - Assert(MyUInt32_1.Equals(MyUInt32_1)); - Assert(MyUInt32_1.Equals((object)(UInt32)(42))); - Assert(MyUInt32_1.Equals((object)(SByte)(42)) == false); - Assert(MyUInt32_1.Equals(MyUInt32_2) == false); + Assert.IsTrue(MyUInt32_1.Equals(MyUInt32_1)); + Assert.IsTrue(MyUInt32_1.Equals((object)(UInt32)(42))); + Assert.IsTrue(MyUInt32_1.Equals((object)(SByte)(42)) == false); + Assert.IsTrue(MyUInt32_1.Equals(MyUInt32_2) == false); } public void TestGetHashCode() @@ -125,29 +125,29 @@ public class UInt32Test : Assertion MyUInt32_3.GetHashCode(); } catch { - Fail("GetHashCode should not raise an exception here"); + Assert.Fail("GetHashCode should not raise an exception here"); } } public void TestParse() { //test Parse(string s) - Assert("Parse problem on \""+MyString1+"\"", MyUInt32_1 == UInt32.Parse(MyString1)); - Assert("Parse problem on \""+MyString2+"\"", MyUInt32_2 == UInt32.Parse(MyString2)); - Assert("Parse problem on \""+MyString3+"\"", MyUInt32_3 == UInt32.Parse(MyString3)); + Assert.IsTrue(MyUInt32_1 == UInt32.Parse(MyString1), "Parse problem on \""+MyString1+"\""); + Assert.IsTrue(MyUInt32_2 == UInt32.Parse(MyString2), "Parse problem on \""+MyString2+"\""); + Assert.IsTrue(MyUInt32_3 == UInt32.Parse(MyString3), "Parse problem on \""+MyString3+"\""); try { UInt32.Parse(null); - Fail("Should raise a System.ArgumentNullException"); + Assert.Fail("Should raise a System.ArgumentNullException"); } catch (Exception e) { - Assert("Did not get ArgumentNullException type", typeof(ArgumentNullException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentNullException) == e.GetType(), "Did not get ArgumentNullException type"); } try { UInt32.Parse("not-a-number"); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert("Did not get FormatException type", typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType(), "Did not get FormatException type"); } try { // TODO: Use this after ToString() is completed. For now, hard code string that generates @@ -155,37 +155,37 @@ public class UInt32Test : Assertion //double OverInt = (double)UInt32.MaxValue + 1; //UInt32.Parse(OverInt.ToString()); UInt32.Parse("4294967296"); - Fail("Should raise a System.OverflowException"); + Assert.Fail("Should raise a System.OverflowException"); } catch (Exception e) { - Assert("Did not get OverflowException type on '"+"4294967296"+"'. Instead, got: '"+e.GetType()+"'", typeof(OverflowException) == e.GetType()); + Assert.IsTrue(typeof(OverflowException) == e.GetType(), "Did not get OverflowException type on '"+"4294967296"+"'. Instead, got: '"+e.GetType()+"'"); } //test Parse(string s, NumberStyles style) - Assert(42 == UInt32.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", NumberStyles.Currency)); + Assert.IsTrue(42 == UInt32.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", NumberStyles.Currency)); try { UInt32.Parse("$42", NumberStyles.Integer); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } //test Parse(string s, IFormatProvider provider) - Assert(42 == UInt32.Parse(" 42 ", Nfi)); + Assert.IsTrue(42 == UInt32.Parse(" 42 ", Nfi)); try { UInt32.Parse("%42", Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } //test Parse(string s, NumberStyles style, IFormatProvider provider) - Assert(16 == UInt32.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); + Assert.IsTrue(16 == UInt32.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); try { UInt32.Parse("$42", NumberStyles.Integer, Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } } @@ -194,43 +194,43 @@ public class UInt32Test : Assertion int TestNumber = 1; try { //test ToString() - AssertEquals(MyString1, MyUInt32_1.ToString()); + Assert.AreEqual(MyString1, MyUInt32_1.ToString()); TestNumber++; - AssertEquals(MyString2, MyUInt32_2.ToString()); + Assert.AreEqual(MyString2, MyUInt32_2.ToString()); TestNumber++; - AssertEquals(MyString3, MyUInt32_3.ToString()); + Assert.AreEqual(MyString3, MyUInt32_3.ToString()); } catch (Exception e) { - Fail("TestToString: Failed on TestNumber=" + TestNumber + Assert.Fail("TestToString: Assert.Failed on TestNumber=" + TestNumber + " with exception: " + e.ToString()); } //test ToString(string format) for (int i=0; i < Formats1.Length; i++) { try { - AssertEquals(Results1[i], MyUInt32_2.ToString(Formats1[i])); + Assert.AreEqual(Results1[i], MyUInt32_2.ToString(Formats1[i])); } catch (Exception e) { - Fail("TestToString: MyUInt32_2.ToString(Formats1[i]) i=" + i + Assert.Fail("TestToString: MyUInt32_2.ToString(Formats1[i]) i=" + i + ". e = " + e.ToString()); } try { - AssertEquals(Results2[i], MyUInt32_3.ToString(Formats2[i])); + Assert.AreEqual(Results2[i], MyUInt32_3.ToString(Formats2[i])); } catch (Exception e) { - Fail("TestToString: MyUInt32_3.ToString(Formats2[i]) i=" + i + Assert.Fail("TestToString: MyUInt32_3.ToString(Formats2[i]) i=" + i + ". e = " + e.ToString()); } } //test ToString(string format, IFormatProvider provider); for (int i=0; i < Formats1.Length; i++) { - AssertEquals(ResultsNfi1[i], MyUInt32_2.ToString(Formats1[i], Nfi)); - AssertEquals(ResultsNfi2[i], MyUInt32_3.ToString(Formats2[i], Nfi)); + Assert.AreEqual(ResultsNfi1[i], MyUInt32_2.ToString(Formats1[i], Nfi)); + Assert.AreEqual(ResultsNfi2[i], MyUInt32_3.ToString(Formats2[i], Nfi)); } try { MyUInt32_1.ToString("z"); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } } @@ -240,14 +240,14 @@ public class UInt32Test : Assertion UInt32 i = 254; // everything defaults to "G" string def = i.ToString ("G"); - AssertEquals ("ToString()", def, i.ToString ()); - AssertEquals ("ToString((IFormatProvider)null)", def, i.ToString ((IFormatProvider)null)); - AssertEquals ("ToString((string)null)", def, i.ToString ((string)null)); - AssertEquals ("ToString(empty)", def, i.ToString (String.Empty)); - AssertEquals ("ToString(null,null)", def, i.ToString (null, null)); - AssertEquals ("ToString(empty,null)", def, i.ToString (String.Empty, null)); - - AssertEquals ("ToString(G)", "254", def); + Assert.AreEqual (def, i.ToString (), "ToString()"); + Assert.AreEqual (def, i.ToString ((IFormatProvider)null), "ToString((IFormatProvider)null)"); + Assert.AreEqual (def, i.ToString ((string)null), "ToString((string)null)"); + Assert.AreEqual (def, i.ToString (String.Empty), "ToString(empty)"); + Assert.AreEqual (def, i.ToString (null, null), "ToString(null,null)"); + Assert.AreEqual (def, i.ToString (String.Empty, null), "ToString(empty,null)"); + + Assert.AreEqual ("254", def, "ToString(G)"); } } diff --git a/mcs/class/corlib/Test/System/UInt64Test.cs b/mcs/class/corlib/Test/System/UInt64Test.cs index 77a2947b3cf..e93f54cf7e9 100644 --- a/mcs/class/corlib/Test/System/UInt64Test.cs +++ b/mcs/class/corlib/Test/System/UInt64Test.cs @@ -14,7 +14,7 @@ namespace MonoTests.System { [TestFixture] -public class UInt64Test : Assertion +public class UInt64Test { private const UInt64 MyUInt64_1 = 42; private const UInt64 MyUInt64_2 = 0; @@ -74,31 +74,31 @@ public class UInt64Test : Assertion public void TestMinMax() { - AssertEquals(UInt64.MinValue, MyUInt64_2); - AssertEquals(UInt64.MaxValue, MyUInt64_3); + Assert.AreEqual(UInt64.MinValue, MyUInt64_2); + Assert.AreEqual(UInt64.MaxValue, MyUInt64_3); } public void TestCompareTo() { - Assert(MyUInt64_3.CompareTo(MyUInt64_2) > 0); - Assert(MyUInt64_2.CompareTo(MyUInt64_2) == 0); - Assert(MyUInt64_1.CompareTo((UInt64)(42)) == 0); - Assert(MyUInt64_2.CompareTo(MyUInt64_3) < 0); + Assert.IsTrue(MyUInt64_3.CompareTo(MyUInt64_2) > 0); + Assert.IsTrue(MyUInt64_2.CompareTo(MyUInt64_2) == 0); + Assert.IsTrue(MyUInt64_1.CompareTo((UInt64)(42)) == 0); + Assert.IsTrue(MyUInt64_2.CompareTo(MyUInt64_3) < 0); try { MyUInt64_2.CompareTo((object)(Int16)100); - Fail("Should raise a System.ArgumentException"); + Assert.Fail("Should raise a System.ArgumentException"); } catch (Exception e) { - Assert(typeof(ArgumentException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentException) == e.GetType()); } } public void TestEquals() { - Assert(MyUInt64_1.Equals(MyUInt64_1)); - Assert(MyUInt64_1.Equals((object)(UInt64)(42))); - Assert(MyUInt64_1.Equals((object)(SByte)(42)) == false); - Assert(MyUInt64_1.Equals(MyUInt64_2) == false); + Assert.IsTrue(MyUInt64_1.Equals(MyUInt64_1)); + Assert.IsTrue(MyUInt64_1.Equals((object)(UInt64)(42))); + Assert.IsTrue(MyUInt64_1.Equals((object)(SByte)(42)) == false); + Assert.IsTrue(MyUInt64_1.Equals(MyUInt64_2) == false); } public void TestGetHashCode() @@ -109,97 +109,97 @@ public class UInt64Test : Assertion MyUInt64_3.GetHashCode(); } catch { - Fail("GetHashCode should not raise an exception here"); + Assert.Fail("GetHashCode should not raise an exception here"); } } public void TestParse() { //test Parse(string s) - Assert(MyUInt64_1 == UInt64.Parse(MyString1)); - Assert(MyUInt64_2 == UInt64.Parse(MyString2)); - Assert(MyUInt64_3 == UInt64.Parse(MyString3)); + Assert.IsTrue(MyUInt64_1 == UInt64.Parse(MyString1)); + Assert.IsTrue(MyUInt64_2 == UInt64.Parse(MyString2)); + Assert.IsTrue(MyUInt64_3 == UInt64.Parse(MyString3)); try { UInt64.Parse(null); - Fail("Should raise a ArgumentNullException"); + Assert.Fail("Should raise a ArgumentNullException"); } catch (Exception e) { - Assert(typeof(ArgumentNullException) == e.GetType()); + Assert.IsTrue(typeof(ArgumentNullException) == e.GetType()); } try { UInt64.Parse("not-a-number"); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } //test Parse(string s, NumberStyles style) try { double OverInt = (double)UInt64.MaxValue + 1; UInt64.Parse(OverInt.ToString(), NumberStyles.Float); - Fail("Should raise a OverflowException"); + Assert.Fail("Should raise a OverflowException"); } catch (Exception e) { - Assert(typeof(OverflowException) == e.GetType()); + Assert.IsTrue(typeof(OverflowException) == e.GetType()); } try { double OverInt = (double)UInt64.MaxValue + 1; UInt64.Parse(OverInt.ToString(), NumberStyles.Integer); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } - Assert(42 == UInt64.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", NumberStyles.Currency)); + Assert.IsTrue(42 == UInt64.Parse(" "+NumberFormatInfo.CurrentInfo.CurrencySymbol+"42 ", NumberStyles.Currency)); try { UInt64.Parse("$42", NumberStyles.Integer); - Fail("Should raise a FormatException"); + Assert.Fail("Should raise a FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } //test Parse(string s, IFormatProvider provider) - Assert(42 == UInt64.Parse(" 42 ", Nfi)); + Assert.IsTrue(42 == UInt64.Parse(" 42 ", Nfi)); try { UInt64.Parse("%42", Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } //test Parse(string s, NumberStyles style, IFormatProvider provider) - Assert(16 == UInt64.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); + Assert.IsTrue(16 == UInt64.Parse(" 10 ", NumberStyles.HexNumber, Nfi)); try { UInt64.Parse("$42", NumberStyles.Integer, Nfi); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert(typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType()); } } public void TestToString() { //test ToString() - AssertEquals("A", MyString1, MyUInt64_1.ToString()); - AssertEquals("B", MyString2, MyUInt64_2.ToString()); - AssertEquals("C", MyString3, MyUInt64_3.ToString()); + Assert.AreEqual(MyString1, MyUInt64_1.ToString(), "A"); + Assert.AreEqual(MyString2, MyUInt64_2.ToString(), "B"); + Assert.AreEqual(MyString3, MyUInt64_3.ToString(), "C"); //test ToString(string format) for (int i=0; i < Formats1.Length; i++) { - AssertEquals("D", Results1[i], MyUInt64_2.ToString(Formats1[i])); - AssertEquals("E: format #" + i, Results2[i], MyUInt64_3.ToString(Formats2[i])); + Assert.AreEqual(Results1[i], MyUInt64_2.ToString(Formats1[i]), "D"); + Assert.AreEqual(Results2[i], MyUInt64_3.ToString(Formats2[i]), "E: format #" + i); } //test ToString(string format, IFormatProvider provider); for (int i=0; i < Formats1.Length; i++) { - AssertEquals("F", ResultsNfi1[i], MyUInt64_2.ToString(Formats1[i], Nfi)); - AssertEquals("G", ResultsNfi2[i], MyUInt64_3.ToString(Formats2[i], Nfi)); + Assert.AreEqual(ResultsNfi1[i], MyUInt64_2.ToString(Formats1[i], Nfi), "F"); + Assert.AreEqual(ResultsNfi2[i], MyUInt64_3.ToString(Formats2[i], Nfi), "G"); } try { MyUInt64_1.ToString("z"); - Fail("Should raise a System.FormatException"); + Assert.Fail("Should raise a System.FormatException"); } catch (Exception e) { - Assert("H", typeof(FormatException) == e.GetType()); + Assert.IsTrue(typeof(FormatException) == e.GetType(), "H"); } } @@ -209,14 +209,14 @@ public class UInt64Test : Assertion UInt64 i = 254; // everything defaults to "G" string def = i.ToString ("G"); - AssertEquals ("ToString()", def, i.ToString ()); - AssertEquals ("ToString((IFormatProvider)null)", def, i.ToString ((IFormatProvider)null)); - AssertEquals ("ToString((string)null)", def, i.ToString ((string)null)); - AssertEquals ("ToString(empty)", def, i.ToString (String.Empty)); - AssertEquals ("ToString(null,null)", def, i.ToString (null, null)); - AssertEquals ("ToString(empty,null)", def, i.ToString (String.Empty, null)); + Assert.AreEqual (def, i.ToString (), "ToString()"); + Assert.AreEqual (def, i.ToString ((IFormatProvider)null), "ToString((IFormatProvider)null)"); + Assert.AreEqual (def, i.ToString ((string)null), "ToString((string)null)"); + Assert.AreEqual (def, i.ToString (String.Empty), "ToString(empty)"); + Assert.AreEqual (def, i.ToString (null, null), "ToString(null,null)"); + Assert.AreEqual (def, i.ToString (String.Empty, null), "ToString(empty,null)"); - AssertEquals ("ToString(G)", "254", def); + Assert.AreEqual ("254", def, "ToString(G)"); } } diff --git a/mcs/class/corlib/Test/System/UIntPtrTest.cs b/mcs/class/corlib/Test/System/UIntPtrTest.cs index 397f4ff03b8..b136ed1e9d1 100644 --- a/mcs/class/corlib/Test/System/UIntPtrTest.cs +++ b/mcs/class/corlib/Test/System/UIntPtrTest.cs @@ -13,7 +13,7 @@ using NUnit.Framework; namespace MonoTests.System { [TestFixture] - public class UIntPtrTest : Assertion { + public class UIntPtrTest { [Test] [ExpectedException (typeof (OverflowException))] @@ -43,10 +43,10 @@ namespace MonoTests.System { // for 64 bits machines if (UIntPtr.Size > 4) { UIntPtr pmax = new UIntPtr (UInt64.MaxValue); - AssertEquals ("Max", UInt64.MaxValue, (ulong) pmax); + Assert.AreEqual (UInt64.MaxValue, (ulong) pmax, "Max"); UIntPtr pmin = new UIntPtr (UInt64.MinValue); - AssertEquals ("Min", UInt64.MinValue, (ulong) pmin); + Assert.AreEqual (UInt64.MinValue, (ulong) pmin, "Min"); } } } diff --git a/mcs/class/corlib/Test/System/ValueTypeTest.cs b/mcs/class/corlib/Test/System/ValueTypeTest.cs index 39519bbef1f..05ed908b6b1 100644 --- a/mcs/class/corlib/Test/System/ValueTypeTest.cs +++ b/mcs/class/corlib/Test/System/ValueTypeTest.cs @@ -37,14 +37,14 @@ namespace MonoTests.System } [TestFixture] - public class ValueTypeTest : Assertion + public class ValueTypeTest { [Test] public void TestEquals () { Blah a = new Blah ("abc", 1); Blah b = new Blah (string.Format ("ab{0}", 'c'), 1); - AssertEquals ("#01", a.Equals (b), true); + Assert.AreEqual (a.Equals (b), true, "#01"); } [Test] @@ -52,19 +52,19 @@ namespace MonoTests.System { Blah a = new Blah ("abc", 1); Blah b = new Blah (string.Format ("ab{0}", 'c'), 1); - AssertEquals ("#01", a.GetHashCode (), b.GetHashCode ()); + Assert.AreEqual (a.GetHashCode (), b.GetHashCode (), "#01"); Lalala la = new Lalala ("abc", 1); Lalala lb = new Lalala (string.Format ("ab{0}", 'c'), 1); - AssertEquals ("#02", la.GetHashCode (), lb.GetHashCode ()); + Assert.AreEqual (la.GetHashCode (), lb.GetHashCode (), "#02"); a = new Blah (null, 1); b = new Blah (null, 1); - AssertEquals ("#03", la.GetHashCode (), lb.GetHashCode ()); + Assert.AreEqual (la.GetHashCode (), lb.GetHashCode (), "#03"); la = new Lalala (null, 1); lb = new Lalala (null, 1); - AssertEquals ("#04", la.GetHashCode (), lb.GetHashCode ()); + Assert.AreEqual (la.GetHashCode (), lb.GetHashCode (), "#04"); } } } diff --git a/mcs/class/corlib/corlib.dll.sources b/mcs/class/corlib/corlib.dll.sources index 7a1b34b30cb..3af1a30f8bf 100644 --- a/mcs/class/corlib/corlib.dll.sources +++ b/mcs/class/corlib/corlib.dll.sources @@ -514,6 +514,7 @@ System.Reflection.Emit/AssemblyBuilderAccess.cs System.Reflection.Emit/ConstructorBuilder.cs System.Reflection.Emit/ConstructorOnTypeBuilderInst.cs System.Reflection.Emit/CustomAttributeBuilder.cs +System.Reflection.Emit/DerivedTypes.cs System.Reflection.Emit/DynamicILInfo.cs System.Reflection.Emit/DynamicMethod.cs System.Reflection.Emit/EnumBuilder.cs @@ -577,6 +578,7 @@ System.Runtime.CompilerServices/CompilationRelaxationsAttribute.cs System.Runtime.CompilerServices/CompilerGeneratedAttribute.cs System.Runtime.CompilerServices/CompilerGlobalScopeAttribute.cs System.Runtime.CompilerServices/CompilerMarshalOverride.cs +System.Runtime.CompilerServices/ConditionalWeakTable.cs System.Runtime.CompilerServices/CustomConstantAttribute.cs System.Runtime.CompilerServices/DateTimeConstantAttribute.cs System.Runtime.CompilerServices/DecimalConstantAttribute.cs diff --git a/mcs/class/corlib/corlib_test.dll.sources b/mcs/class/corlib/corlib_test.dll.sources index 1985b2a4cef..5da2008807c 100644 --- a/mcs/class/corlib/corlib_test.dll.sources +++ b/mcs/class/corlib/corlib_test.dll.sources @@ -136,6 +136,7 @@ System.Reflection.Emit/AssemblyBuilderAccessTest.cs System.Reflection.Emit/ConstructorBuilderTest.cs System.Reflection.Emit/ConstructorOnTypeBuilderInstTest.cs System.Reflection.Emit/CustomAttributeBuilderTest.cs +System.Reflection.Emit/DerivedTypesTest.cs System.Reflection.Emit/DynamicMethodTest.cs System.Reflection.Emit/EnumBuilderTest.cs System.Reflection.Emit/EventBuilderTest.cs diff --git a/mcs/class/dlr/License.html b/mcs/class/dlr/License.html new file mode 100644 index 00000000000..42a1b7aed46 --- /dev/null +++ b/mcs/class/dlr/License.html @@ -0,0 +1,36 @@ + + + +Microsoft Public License (Ms-PL) + + + + +

This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.

+ +

1. Definitions

+

The terms “reproduce,” “reproduction,” “derivative works,” and “distribution” have the same meaning here as under U.S. copyright law.

+

A “contribution” is the original software, or any additions or changes to the software.

+

A “contributor” is any person that distributes its contribution under this license.

+

“Licensed patents” are a contributor’s patent claims that read directly on its contribution.

+

2. Grant of Rights

+

(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright +license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.

+ +

(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, +royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative +works of the contribution in the software.

+ +

3. Conditions and Limitations

(A) No Trademark License- This license does not grant you rights to use any contributors’ name, logo, or trademarks.

+

(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.

+

(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.

+

(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. +If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.

+ +

(E) The software is licensed “as-is.” You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional +consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, +fitness for a particular purpose and non-infringement.

+ + + + diff --git a/mcs/class/dlr/License.rtf b/mcs/class/dlr/License.rtf new file mode 100644 index 00000000000..b623377bd0e --- /dev/null +++ b/mcs/class/dlr/License.rtf @@ -0,0 +1,177 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 +\ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 +\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}}{\*\rsidtbl \rsid11612883}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author dinov}{\operator dinov} +{\creatim\yr2007\mo10\dy30\hr14\min43}{\revtim\yr2007\mo10\dy30\hr14\min43}{\version2}{\edmins1}{\nofpages2}{\nofwords404}{\nofchars2212}{\*\company Microsoft}{\nofcharsws2611}{\vern32893}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/200 +3/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves1\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701 +\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot11612883 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sb100\sa100\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \b\f0\fs28\insrsid11612883 \hich\af0\dbch\af31505\loch\f0 Microsoft }{\rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 +\b\f0\fs28\insrsid11612883 \hich\af0\dbch\af31505\loch\f0 Public }{\rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \b\f0\fs28\insrsid11612883 \hich\af0\dbch\af31505\loch\f0 License (Ms-PL) +\par }{\rtlch\fcs1 \ab\af0\afs24 \ltrch\fcs0 \b\f0\fs24\insrsid11612883 \hich\af0\dbch\af31505\loch\f0 +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid11612883 +\par }{\rtlch\fcs1 \ab\af0\afs36 \ltrch\fcs0 \b\f0\fs36\insrsid11612883 \hich\af0\dbch\af31505\loch\f0 1. Definitions +\par }{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid11612883 \hich\af0\dbch\af31505\loch\f0 \hich\f0 The terms \'93\loch\f0 \hich\f0 reproduce,\'94\loch\f0 \hich\f0 \'93\loch\f0 \hich\f0 reproduction,\'94\loch\f0 \hich\f0 \'93 +\hich\af0\dbch\af31505\loch\f0 \hich\f0 derivative works,\'94\loch\f0 \hich\f0 and \'93\loch\f0 \hich\f0 distribution\'94\loch\f0 have the same meaning here as under U.S. copyright law. +\par \hich\af0\dbch\af31505\loch\f0 \hich\f0 A \'93\loch\f0 \hich\f0 contribution\'94\loch\f0 is the original software, or any additions or changes to the software. +\par \hich\af0\dbch\af31505\loch\f0 \hich\f0 A \'93\loch\f0 \hich\f0 contributor\'94\loch\f0 is any person that distributes its contribution under this\hich\af0\dbch\af31505\loch\f0 license. +\par \loch\af0\dbch\af31505\hich\f0 \'93\loch\f0 \hich\f0 Licensed patents\'94\loch\f0 are a contributor\hich\f0 \rquote \loch\f0 s patent claims that read directly on its contribution. +\par }{\rtlch\fcs1 \ab\af0\afs36 \ltrch\fcs0 \b\f0\fs36\insrsid11612883 \hich\af0\dbch\af31505\loch\f0 2. Grant of Rights +\par }{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid11612883 \hich\af0\dbch\af31505\loch\f0 (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contrib +\hich\af0\dbch\af31505\loch\f0 utor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + +\par \hich\af0\dbch\af31505\loch\f0 (B) Patent Grant- Subject to th\hich\af0\dbch\af31505\loch\f0 +e terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or o +\hich\af0\dbch\af31505\loch\f0 t\hich\af0\dbch\af31505\loch\f0 herwise dispose of its contribution in the software or derivative works of the contribution in the software. +\par }{\rtlch\fcs1 \ab\af0\afs36 \ltrch\fcs0 \b\f0\fs36\insrsid11612883 \hich\af0\dbch\af31505\loch\f0 3. Conditions and Limitations +\par }{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid11612883 \hich\af0\dbch\af31505\loch\f0 (A) No Trademark License- This license does not grant you rights to use any contributors\hich\f0 \rquote \loch\f0 name, logo, or trademarks. +\par \hich\af0\dbch\af31505\loch\f0 (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. +\par \hich\af0\dbch\af31505\loch\f0 (C) If you distribute any portion of the software, you must ret\hich\af0\dbch\af31505\loch\f0 ain all copyright, patent, trademark, and attribution notices that are present in the software. +\par \hich\af0\dbch\af31505\loch\f0 (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with y\hich\af0\dbch\af31505\loch\f0 +our distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. +\par \hich\af0\dbch\af31505\loch\f0 \hich\f0 (E) The software is licensed \'93\loch\f0 \hich\f0 as-is.\'94\loch\f0 You bear the risk of using it. The contributors give \hich\af0\dbch\af31505\loch\f0 +no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantabil +\hich\af0\dbch\af31505\loch\f0 i\hich\af0\dbch\af31505\loch\f0 ty, fitness for a particular purpose and non-infringement. +\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\insrsid11612883 +\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 +72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 +2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b +44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 +065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 +00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 +84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc +52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 +bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 +656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c +070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 +29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 +312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 +a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 +98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c +94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 +7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 +9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 +e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 +193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 +17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 +8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 +6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a +668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 +bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e +16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b +5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 +8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 +c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 +0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b +7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb +9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 +088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf +8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 +ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 +28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 +345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 +b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 +254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 +68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 +51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 +720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 +a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 +000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 +002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 +656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 +00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 +00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f0000000000000000000000009055 +58f93d1bc801feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ArgBuilder.cs new file mode 100644 index 00000000000..813e49f09a1 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ArgBuilder.cs @@ -0,0 +1,61 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// ArgBuilder provides an argument value used by the MethodBinder. One ArgBuilder exists for each + /// physical parameter defined on a method. + /// + /// Contrast this with ParameterWrapper which represents the logical argument passed to the method. + /// + internal abstract class ArgBuilder { + /// + /// Provides the Expression which provides the value to be passed to the argument. + /// + internal abstract Expression Marshal(Expression parameter); + + /// + /// Provides the Expression which provides the value to be passed to the argument. + /// This method is called when result is intended to be used ByRef. + /// + internal virtual Expression MarshalToRef(Expression parameter) { + return Marshal(parameter); + } + + /// + /// Provides an Expression which will update the provided value after a call to the method. + /// May return null if no update is required. + /// + internal virtual Expression UnmarshalFromRef(Expression newValue) { + return newValue; + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/Assert.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Assert.cs new file mode 100644 index 00000000000..e3cf30e50f6 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Assert.cs @@ -0,0 +1,82 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ + +#define DEBUG +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal static class Assert { + + internal static Exception Unreachable { + get { + Debug.Assert(false, "Unreachable"); + return new InvalidOperationException("Code supposed to be unreachable"); + } + } + + [Conditional("DEBUG")] + internal static void NotNull(object var) { + Debug.Assert(var != null); + } + + [Conditional("DEBUG")] + internal static void NotNull(object var1, object var2) { + Debug.Assert(var1 != null && var2 != null); + } + + [Conditional("DEBUG")] + internal static void NotNull(object var1, object var2, object var3) { + Debug.Assert(var1 != null && var2 != null && var3 != null); + } + + [Conditional("DEBUG")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1025:ReplaceRepetitiveArgumentsWithParamsArray")] + internal static void NotNull(object var1, object var2, object var3, object var4) { + Debug.Assert(var1 != null && var2 != null && var3 != null && var4 != null); + } + + [Conditional("DEBUG")] + internal static void NotEmpty(string str) { + Debug.Assert(!String.IsNullOrEmpty(str)); + } + + [Conditional("DEBUG")] + internal static void NotEmpty(ICollection array) { + Debug.Assert(array != null && array.Count > 0); + } + + [Conditional("DEBUG")] + internal static void NotNullItems(IEnumerable items) where T : class { + Debug.Assert(items != null); + foreach (object item in items) { + Debug.Assert(item != null); + } + } + + [Conditional("DEBUG")] + internal static void IsTrue(Func predicate) { + ContractUtils.RequiresNotNull(predicate, "predicate"); + Debug.Assert(predicate()); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/BoolArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/BoolArgBuilder.cs new file mode 100644 index 00000000000..c31df708d2c --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/BoolArgBuilder.cs @@ -0,0 +1,72 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Runtime.InteropServices; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal sealed class BoolArgBuilder : SimpleArgBuilder { + internal BoolArgBuilder(Type parameterType) + : base(parameterType) { + Debug.Assert(parameterType == typeof(bool)); + } + + internal override Expression MarshalToRef(Expression parameter) { + // parameter ? -1 : 0 + return Expression.Condition( + Marshal(parameter), + Expression.Constant((Int16)(-1)), + Expression.Constant((Int16)0) + ); + } + + internal override Expression UnmarshalFromRef(Expression value) { + //parameter = temp != 0 + return base.UnmarshalFromRef( + Expression.NotEqual( + value, + Expression.Constant((Int16)0) + ) + ); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/BoundDispEvent.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/BoundDispEvent.cs new file mode 100644 index 00000000000..7569a74d1d6 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/BoundDispEvent.cs @@ -0,0 +1,138 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Security; +using System.Security.Permissions; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal sealed class BoundDispEvent : DynamicObject { + private object _rcw; + private Guid _sourceIid; + private int _dispid; + + internal BoundDispEvent(object rcw, Guid sourceIid, int dispid) { + _rcw = rcw; + _sourceIid = sourceIid; + _dispid = dispid; + } + + /// + /// Provides the implementation of performing AddAssign and SubtractAssign binary operations. + /// + /// The binder provided by the call site. + /// The handler for the operation. + /// The result of the operation. + /// true if the operation is complete, false if the call site should determine behavior. + public override bool TryBinaryOperation(BinaryOperationBinder binder, object handler, out object result) { + if (binder.Operation == ExpressionType.AddAssign) { + result = InPlaceAdd(handler); + return true; + } + + if (binder.Operation == ExpressionType.SubtractAssign) { + result = InPlaceSubtract(handler); + return true; + } + + result = null; + return false; + } + + private static void VerifyHandler(object handler) { + if (handler is Delegate && handler.GetType() != typeof(Delegate)) { + return; // delegate + } + + if (handler is IDynamicMetaObjectProvider) { + return; // IDMOP + } + + throw Error.UnsupportedHandlerType(); + } + + /// + /// Adds a handler to an event. + /// + /// The handler to be added. + /// The original event with handler added. +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + private object InPlaceAdd(object handler) { + ContractUtils.RequiresNotNull(handler, "handler"); + VerifyHandler(handler); + + // + // Demand Full Trust to proceed with the operation. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + ComEventSink comEventSink = ComEventSink.FromRuntimeCallableWrapper(_rcw, _sourceIid, true); + comEventSink.AddHandler(_dispid, handler); + return this; + } + + /// + /// Removes handler from the event. + /// + /// The handler to be removed. + /// The original event with handler removed. +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + private object InPlaceSubtract(object handler) { + ContractUtils.RequiresNotNull(handler, "handler"); + VerifyHandler(handler); + + // + // Demand Full Trust to proceed with the operation. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + ComEventSink comEventSink = ComEventSink.FromRuntimeCallableWrapper(_rcw, _sourceIid, false); + if (comEventSink != null) { + comEventSink.RemoveHandler(_dispid, handler); + } + + return this; + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/CollectionExtensions.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/CollectionExtensions.cs new file mode 100644 index 00000000000..12ccd7f8b2d --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/CollectionExtensions.cs @@ -0,0 +1,55 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal static class CollectionExtensions { + + internal static T[] RemoveFirst(this T[] array) { + T[] result = new T[array.Length - 1]; + Array.Copy(array, 1, result, 0, result.Length); + return result; + } + + internal static T[] AddFirst(this IList list, T item) { + T[] res = new T[list.Count + 1]; + res[0] = item; + list.CopyTo(res, 1); + return res; + } + + internal static T[] ToArray(this IList list) { + T[] res = new T[list.Count]; + list.CopyTo(res, 0); + return res; + } + + internal static T[] AddLast(this IList list, T item) { + T[] res = new T[list.Count + 1]; + list.CopyTo(res, 0); + res[list.Count] = item; + return res; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComBinder.cs new file mode 100644 index 00000000000..3a7d606d2b8 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComBinder.cs @@ -0,0 +1,441 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Security; +using System.Security.Permissions; + +#if CODEPLEX_40 +[assembly: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "System.Dynamic")] +#else +[assembly: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "Microsoft.Scripting")] +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// Provides helper methods to bind COM objects dynamically. + /// + public static class ComBinder { + + /// + /// Determines if an object is a COM object. + /// + /// The object to test. + /// true if the object is a COM object, false otherwise. + public static bool IsComObject(object value) { + return ComObject.IsComObject(value); + } + + /// + /// Tries to perform binding of the dynamic get member operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The target of the dynamic operation. + /// The new representing the result of the binding. + /// true if member evaluation may be delayed. + /// true if operation was bound successfully; otherwise, false. +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + public static bool TryBindGetMember(GetMemberBinder binder, DynamicMetaObject instance, out DynamicMetaObject result, bool delayInvocation) { + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.RequiresNotNull(instance, "instance"); + + if (TryGetMetaObject(ref instance)) { + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + var comGetMember = new ComGetMemberBinder(binder, delayInvocation); + result = instance.BindGetMember(comGetMember); + if (result.Expression.Type.IsValueType) { + result = new DynamicMetaObject( + Expression.Convert(result.Expression, typeof(object)), + result.Restrictions + ); + } + return true; + } else { + result = null; + return false; + } + } + + /// + /// Tries to perform binding of the dynamic get member operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The target of the dynamic operation. + /// The new representing the result of the binding. + /// true if operation was bound successfully; otherwise, false. + public static bool TryBindGetMember(GetMemberBinder binder, DynamicMetaObject instance, out DynamicMetaObject result) { + return TryBindGetMember(binder, instance, out result, false); + } + + /// + /// Tries to perform binding of the dynamic set member operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The target of the dynamic operation. + /// The representing the value for the set member operation. + /// The new representing the result of the binding. + /// true if operation was bound successfully; otherwise, false. +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + public static bool TryBindSetMember(SetMemberBinder binder, DynamicMetaObject instance, DynamicMetaObject value, out DynamicMetaObject result) { + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.RequiresNotNull(instance, "instance"); + ContractUtils.RequiresNotNull(value, "value"); + + if (TryGetMetaObject(ref instance)) { + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + result = instance.BindSetMember(binder, value); + return true; + } else { + result = null; + return false; + } + } + + /// + /// Tries to perform binding of the dynamic invoke operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The target of the dynamic operation. + /// An array of instances - arguments to the invoke member operation. + /// The new representing the result of the binding. + /// true if operation was bound successfully; otherwise, false. +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + public static bool TryBindInvoke(InvokeBinder binder, DynamicMetaObject instance, DynamicMetaObject[] args, out DynamicMetaObject result) { + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.RequiresNotNull(instance, "instance"); + ContractUtils.RequiresNotNull(args, "args"); + + if (TryGetMetaObject(ref instance)) { + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + result = instance.BindInvoke(binder, args); + return true; + } else { + result = null; + return false; + } + } + + /// + /// Tries to perform binding of the dynamic invoke member operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The target of the dynamic operation. + /// An array of instances - arguments to the invoke member operation. + /// The new representing the result of the binding. + /// true if operation was bound successfully; otherwise, false. +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + public static bool TryBindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject instance, DynamicMetaObject[] args, out DynamicMetaObject result) { + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.RequiresNotNull(instance, "instance"); + ContractUtils.RequiresNotNull(args, "args"); + + if (TryGetMetaObject(ref instance)) { + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + result = instance.BindInvokeMember(binder, args); + return true; + } else { + result = null; + return false; + } + } + + /// + /// Tries to perform binding of the dynamic get index operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The target of the dynamic operation. + /// An array of instances - arguments to the invoke member operation. + /// The new representing the result of the binding. + /// true if operation was bound successfully; otherwise, false. +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + public static bool TryBindGetIndex(GetIndexBinder binder, DynamicMetaObject instance, DynamicMetaObject[] args, out DynamicMetaObject result) { + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.RequiresNotNull(instance, "instance"); + ContractUtils.RequiresNotNull(args, "args"); + + if (TryGetMetaObject(ref instance)) { + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + result = instance.BindGetIndex(binder, args); + return true; + } else { + result = null; + return false; + } + } + + /// + /// Tries to perform binding of the dynamic set index operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The target of the dynamic operation. + /// An array of instances - arguments to the invoke member operation. + /// The representing the value for the set index operation. + /// The new representing the result of the binding. + /// true if operation was bound successfully; otherwise, false. +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + public static bool TryBindSetIndex(SetIndexBinder binder, DynamicMetaObject instance, DynamicMetaObject[] args, DynamicMetaObject value, out DynamicMetaObject result) { + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.RequiresNotNull(instance, "instance"); + ContractUtils.RequiresNotNull(args, "args"); + ContractUtils.RequiresNotNull(value, "value"); + + if (TryGetMetaObject(ref instance)) { + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + result = instance.BindSetIndex(binder, args, value); + return true; + } else { + result = null; + return false; + } + } + + /// + /// Tries to perform binding of the dynamic Convert operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The target of the dynamic operation. + /// The new representing the result of the binding. + /// true if operation was bound successfully; otherwise, false. +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + public static bool TryConvert(ConvertBinder binder, DynamicMetaObject instance, out DynamicMetaObject result) { + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.RequiresNotNull(instance, "instance"); + + if (IsComObject(instance.Value)) { + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + // Converting a COM object to any interface is always considered possible - it will result in + // a QueryInterface at runtime + if (binder.Type.IsInterface) { + result = new DynamicMetaObject( + Expression.Convert( + instance.Expression, + binder.Type + ), + BindingRestrictions.GetExpressionRestriction( + Expression.Call( + typeof(ComObject).GetMethod("IsComObject", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic), + Helpers.Convert(instance.Expression, typeof(object)) + ) + ) + ); + return true; + } + } + + result = null; + return false; + } + + /// + /// Gets the member names associated with the object. + /// This function can operate only with objects for which returns true. + /// + /// The object for which member names are requested. + /// The collection of member names. +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + public static IEnumerable GetDynamicMemberNames(object value) { + ContractUtils.RequiresNotNull(value, "value"); + ContractUtils.Requires(IsComObject(value), "value", Strings.ComObjectExpected); + + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + return ComObject.ObjectToComObject(value).GetMemberNames(false); + } + + /// + /// Gets the member names of the data-like members associated with the object. + /// This function can operate only with objects for which returns true. + /// + /// The object for which member names are requested. + /// The collection of member names. +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal static IList GetDynamicDataMemberNames(object value) { + ContractUtils.RequiresNotNull(value, "value"); + ContractUtils.Requires(IsComObject(value), "value", Strings.ComObjectExpected); + + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + return ComObject.ObjectToComObject(value).GetMemberNames(true); + } + + /// + /// Gets the data-like members and associated data for an object. + /// This function can operate only with objects for which returns true. + /// + /// The object for which data members are requested. + /// The enumeration of names of data members for which to retrieve values. + /// The collection of pairs that represent data member's names and their data. + [SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures")] + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + internal static IList> GetDynamicDataMembers(object value, IEnumerable names) { + ContractUtils.RequiresNotNull(value, "value"); + ContractUtils.Requires(IsComObject(value), "value", Strings.ComObjectExpected); + + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + return ComObject.ObjectToComObject(value).GetMembers(names); + } + + private static bool TryGetMetaObject(ref DynamicMetaObject instance) { + // If we're already a COM MO don't make a new one + // (we do this to prevent recursion if we call Fallback from COM) + if (instance is ComUnwrappedMetaObject) { + return false; + } + + if (IsComObject(instance.Value)) { + instance = new ComMetaObject(instance.Expression, instance.Restrictions, instance.Value); + return true; + } + + return false; + } + + /// + /// Special binder that indicates special semantics for COM GetMember operation. + /// + internal class ComGetMemberBinder : GetMemberBinder { + private readonly GetMemberBinder _originalBinder; + internal bool _CanReturnCallables; + + internal ComGetMemberBinder(GetMemberBinder originalBinder, bool CanReturnCallables) : + base(originalBinder.Name, originalBinder.IgnoreCase) { + _originalBinder = originalBinder; + _CanReturnCallables = CanReturnCallables; + } + + public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { + return _originalBinder.FallbackGetMember(target, errorSuggestion); + } + + public override int GetHashCode() { + return _originalBinder.GetHashCode() ^ (_CanReturnCallables ? 1 : 0); + } + + public override bool Equals(object obj) { + ComGetMemberBinder other = obj as ComGetMemberBinder; + return other != null && + _CanReturnCallables == other._CanReturnCallables && + _originalBinder.Equals(other._originalBinder); + } + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComBinderHelpers.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComBinderHelpers.cs new file mode 100644 index 00000000000..01c4f5e489b --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComBinderHelpers.cs @@ -0,0 +1,138 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic; +using System.Dynamic.Utils; +using System.Linq.Expressions; +using System.Linq.Expressions.Compiler; +#else +using Microsoft.Scripting; +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +using Microsoft.Linq.Expressions.Compiler; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Runtime.InteropServices; +using System.Collections.Generic; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal static class ComBinderHelpers { + + internal static bool PreferPut(Type type, bool holdsNull) { + Debug.Assert(type != null); + + if (type.IsValueType || type.IsArray) return true; + + if (type == typeof(String) || + type == typeof(DBNull) || + holdsNull || + type == typeof(System.Reflection.Missing) || + type == typeof(CurrencyWrapper)) { + + return true; + } else { + return false; + } + } + + internal static bool IsByRef(DynamicMetaObject mo) { + ParameterExpression pe = mo.Expression as ParameterExpression; + return pe != null && pe.IsByRef; + } + + internal static bool IsStrongBoxArg(DynamicMetaObject o) { + Type t = o.LimitType; + return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(StrongBox<>); + } + + // this helper prepares arguments for COM binding by transforming ByVal StongBox arguments + // into ByRef expressions that represent the argument's Value fields. + internal static bool[] ProcessArgumentsForCom(ref DynamicMetaObject[] args) { + Debug.Assert(args != null); + + DynamicMetaObject[] newArgs = new DynamicMetaObject[args.Length]; + bool[] isByRefArg = new bool[args.Length]; + + for (int i = 0; i < args.Length; i++) { + DynamicMetaObject curArgument = args[i]; + + // set new arg infos to their original values or set default ones + // we will do this fixup early so that we can assume we always have + // arginfos in COM binder. + + if (IsByRef(curArgument)) { + newArgs[i] = curArgument; + isByRefArg[i] = true; + } else { + if (IsStrongBoxArg(curArgument)) { + var restrictions = curArgument.Restrictions.Merge( + GetTypeRestrictionForDynamicMetaObject(curArgument) + ); + + // we have restricted this argument to LimitType so we can convert and conversion will be trivial cast. + Expression boxedValueAccessor = Expression.Field( + Helpers.Convert( + curArgument.Expression, + curArgument.LimitType + ), + curArgument.LimitType.GetField("Value") + ); + + IStrongBox value = curArgument.Value as IStrongBox; + object boxedValue = value != null ? value.Value : null; + + newArgs[i] = new DynamicMetaObject( + boxedValueAccessor, + restrictions, + boxedValue + ); + + isByRefArg[i] = true; + } else { + newArgs[i] = curArgument; + isByRefArg[i] = false; + } + } + } + + args = newArgs; + return isByRefArg; + } + + internal static BindingRestrictions GetTypeRestrictionForDynamicMetaObject(DynamicMetaObject obj) { + if (obj.Value == null && obj.HasValue) { + //If the meta object holds a null value, create an instance restriction for checking null + return BindingRestrictions.GetInstanceRestriction(obj.Expression, null); + } + return BindingRestrictions.GetTypeRestriction(obj.Expression, obj.LimitType); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComDispIds.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComDispIds.cs new file mode 100644 index 00000000000..7745d256e98 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComDispIds.cs @@ -0,0 +1,32 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal static class ComDispIds { + internal const int DISPID_VALUE = 0; + internal const int DISPID_PROPERTYPUT = -3; + internal const int DISPID_NEWENUM = -4; + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventDesc.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventDesc.cs new file mode 100644 index 00000000000..d652537165d --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventDesc.cs @@ -0,0 +1,31 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal class ComEventDesc { + internal Guid sourceIID; + internal int dispid; + }; +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventSink.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventSink.cs new file mode 100644 index 00000000000..8acec9bec9e --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventSink.cs @@ -0,0 +1,349 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; +using ComTypes = System.Runtime.InteropServices.ComTypes; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// This class implements an event sink for a particular RCW. + /// Unlike the implementation of events in TlbImp'd assemblies, + /// we will create only one event sink per RCW (theoretically RCW might have + /// several ComEventSink evenk sinks - but all these implement different source intefaces). + /// Each ComEventSink contains a list of ComEventSinkMethod objects - which represent + /// a single method on the source interface an a multicast delegate to redirect + /// the calls. Notice that we are chaining multicast delegates so that same + /// ComEventSinkMedhod can invoke multiple event handlers). + /// + /// ComEventSink implements an IDisposable pattern to Unadvise from the connection point. + /// Typically, when RCW is finalized the corresponding Dispose will be triggered by + /// ComEventSinksContainer finalizer. Notice that lifetime of ComEventSinksContainer + /// is bound to the lifetime of the RCW. + /// + internal sealed class ComEventSink : MarshalByRefObject, IReflect, IDisposable { + + #region private fields + + private Guid _sourceIid; + private ComTypes.IConnectionPoint _connectionPoint; + private int _adviseCookie; + private List _comEventSinkMethods; + private object _lockObject = new object(); // We cannot lock on ComEventSink since it causes a DoNotLockOnObjectsWithWeakIdentity warning + + #endregion + + #region private classes + + /// + /// Contains a methods DISPID (in a string formatted of "[DISPID=N]" + /// and a chained list of delegates to invoke + /// + private class ComEventSinkMethod { + public string _name; + public Func _handlers; + } + #endregion + + #region ctor + + [SecurityCritical] + private ComEventSink(object rcw, Guid sourceIid) { + Initialize(rcw, sourceIid); + } + + #endregion + + [SecurityCritical] + private void Initialize(object rcw, Guid sourceIid) { + _sourceIid = sourceIid; + _adviseCookie = -1; + + Debug.Assert(_connectionPoint == null, "re-initializing event sink w/o unadvising from connection point"); + + ComTypes.IConnectionPointContainer cpc = rcw as ComTypes.IConnectionPointContainer; + if (cpc == null) + throw Error.COMObjectDoesNotSupportEvents(); + + cpc.FindConnectionPoint(ref _sourceIid, out _connectionPoint); + if (_connectionPoint == null) + throw Error.COMObjectDoesNotSupportSourceInterface(); + + // Read the comments for ComEventSinkProxy about why we need it + ComEventSinkProxy proxy = new ComEventSinkProxy(this, _sourceIid); + _connectionPoint.Advise(proxy.GetTransparentProxy(), out _adviseCookie); + } + + #region static methods + + [SecurityCritical] + public static ComEventSink FromRuntimeCallableWrapper(object rcw, Guid sourceIid, bool createIfNotFound) { + List comEventSinks = ComEventSinksContainer.FromRuntimeCallableWrapper(rcw, createIfNotFound); + + if (comEventSinks == null) { + return null; + } + + ComEventSink comEventSink = null; + lock (comEventSinks) { + + foreach (ComEventSink sink in comEventSinks) { + if (sink._sourceIid == sourceIid) { + comEventSink = sink; + break; + } else if (sink._sourceIid == Guid.Empty) { + // we found a ComEventSink object that + // was previously disposed. Now we will reuse it. + sink.Initialize(rcw, sourceIid); + comEventSink = sink; + } + } + + if (comEventSink == null && createIfNotFound == true) { + comEventSink = new ComEventSink(rcw, sourceIid); + comEventSinks.Add(comEventSink); + } + } + + return comEventSink; + } + + #endregion + + public void AddHandler(int dispid, object func) { + string name = String.Format(CultureInfo.InvariantCulture, "[DISPID={0}]", dispid); + + lock (_lockObject) { + ComEventSinkMethod sinkMethod; + sinkMethod = FindSinkMethod(name); + + if (sinkMethod == null) { + if (_comEventSinkMethods == null) { + _comEventSinkMethods = new List(); + } + + sinkMethod = new ComEventSinkMethod(); + sinkMethod._name = name; + _comEventSinkMethods.Add(sinkMethod); + } + + sinkMethod._handlers += new SplatCallSite(func).Invoke; + } + } + + [SecurityCritical] + public void RemoveHandler(int dispid, object func) { + + string name = String.Format(CultureInfo.InvariantCulture, "[DISPID={0}]", dispid); + + lock (_lockObject) { + + ComEventSinkMethod sinkEntry = FindSinkMethod(name); + if (sinkEntry == null){ + return; + } + + // Remove the delegate from multicast delegate chain. + // We will need to find the delegate that corresponds + // to the func handler we want to remove. This will be + // easy since we Target property of the delegate object + // is a ComEventCallContext object. + Delegate[] delegates = sinkEntry._handlers.GetInvocationList(); + foreach (Delegate d in delegates) { + SplatCallSite callContext = d.Target as SplatCallSite; + if (callContext != null && callContext._callable.Equals(func)) { + sinkEntry._handlers -= d as Func; + break; + } + } + + // If the delegates chain is empty - we can remove + // corresponding ComEvenSinkEntry + if (sinkEntry._handlers == null) + _comEventSinkMethods.Remove(sinkEntry); + + // We can Unadvise from the ConnectionPoint if no more sink entries + // are registered for this interface + //(calling Dispose will call IConnectionPoint.Unadvise). + if (_comEventSinkMethods.Count == 0) { + // notice that we do not remove + // ComEventSinkEntry from the list, we will re-use this data structure + // if a new handler needs to be attached. + Dispose(); + } + } + } + + public object ExecuteHandler(string name, object[] args) { + ComEventSinkMethod site; + site = FindSinkMethod(name); + + if (site != null && site._handlers != null) { + return site._handlers(args); + } + + return null; + } + + #region IReflect + + #region Unimplemented members + + public FieldInfo GetField(string name, BindingFlags bindingAttr) { + return null; + } + + public FieldInfo[] GetFields(BindingFlags bindingAttr) { + return new FieldInfo[0]; + } + + public MemberInfo[] GetMember(string name, BindingFlags bindingAttr) { + return new MemberInfo[0]; + } + + public MemberInfo[] GetMembers(BindingFlags bindingAttr) { + return new MemberInfo[0]; + } + + public MethodInfo GetMethod(string name, BindingFlags bindingAttr) { + return null; + } + + public MethodInfo GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) { + return null; + } + + public MethodInfo[] GetMethods(BindingFlags bindingAttr) { + return new MethodInfo[0]; + } + + public PropertyInfo GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) { + return null; + } + + public PropertyInfo GetProperty(string name, BindingFlags bindingAttr) { + return null; + } + + public PropertyInfo[] GetProperties(BindingFlags bindingAttr) { + return new PropertyInfo[0]; + } + + #endregion + + public Type UnderlyingSystemType { + get { + return typeof(object); + } + } + + public object InvokeMember( + string name, + BindingFlags invokeAttr, + Binder binder, + object target, + object[] args, + ParameterModifier[] modifiers, + CultureInfo culture, + string[] namedParameters) { + + return ExecuteHandler(name, args); + } + + #endregion + + #region IDisposable + +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + public void Dispose() { + DisposeAll(); + GC.SuppressFinalize(this); + } + + #endregion + +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + ~ComEventSink() { + DisposeAll(); + } + + [SecurityCritical] + private void DisposeAll() { + if (_connectionPoint == null) { + return; + } + + if (_adviseCookie == -1) { + return; + } + + try { + _connectionPoint.Unadvise(_adviseCookie); + + // _connectionPoint has entered the CLR in the constructor + // for this object and hence its ref counter has been increased + // by us. We have not exposed it to other components and + // hence it is safe to call RCO on it w/o worrying about + // killing the RCW for other objects that link to it. + Marshal.ReleaseComObject(_connectionPoint); + } catch (Exception ex) { + // if something has gone wrong, and the object is no longer attached to the CLR, + // the Unadvise is going to throw. In this case, since we're going away anyway, + // we'll ignore the failure and quietly go on our merry way. + COMException exCOM = ex as COMException; + if (exCOM != null && exCOM.ErrorCode == ComHresults.CONNECT_E_NOCONNECTION) { + Debug.Assert(false, "IConnectionPoint::Unadvise returned CONNECT_E_NOCONNECTION."); + throw; + } + } finally { + _connectionPoint = null; + _adviseCookie = -1; + _sourceIid = Guid.Empty; + } + } + + private ComEventSinkMethod FindSinkMethod(string name) { + if (_comEventSinkMethods == null) + return null; + + ComEventSinkMethod site; + site = _comEventSinkMethods.Find(element => element._name == name); + + return site; + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventSinkProxy.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventSinkProxy.cs new file mode 100644 index 00000000000..032bc1efa39 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventSinkProxy.cs @@ -0,0 +1,148 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Globalization; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.Remoting; +using System.Runtime.Remoting.Messaging; +using System.Runtime.Remoting.Proxies; +using System.Security; +using System.Security.Permissions; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// ComEventSinkProxy class is responsible for handling QIs for sourceIid + /// on instances of ComEventSink. + /// + /// Background: When a COM even sink advises to a connection point it is + /// supposed to hand over the dispinterface. Now, some hosts will trust + /// the COM client to pass the correct pointer, but some will not. + /// E.g. Excel's implementation of Connection Points will not cause a + /// QI on the pointer that has been passed, however Word will QI the + /// pointer to return the required interface. + /// + /// ComEventSink does not, strongly speaking, implements the interface + /// that it claims to implement - it is just "faking" it by using IReflect. + /// Thus, Word's QIs on the pointer passed to ICP::Advise would fail. To + /// prevent this we take advangate of RealProxy's ability of + /// "dressing up" like other classes and hence successfully respond to QIs + /// for interfaces that it does not really support( it is OK to say + /// "I implement this interface" for event sinks only since the common + /// practice is to use IDistpach.Invoke when calling into event sinks). + /// + [SecurityCritical] + internal sealed class ComEventSinkProxy : RealProxy { + + private Guid _sinkIid; + private ComEventSink _sink; + private static readonly MethodInfo _methodInfoInvokeMember = typeof(ComEventSink).GetMethod("InvokeMember", BindingFlags.Instance | BindingFlags.Public); + + #region ctors + + [SecurityCritical] + private ComEventSinkProxy() { + } + + [SecurityCritical] + public ComEventSinkProxy(ComEventSink sink, Guid sinkIid) + : base(typeof(ComEventSink)) { + _sink = sink; + _sinkIid = sinkIid; + } + + #endregion + + #region Base Class Overrides + +#if MICROSOFT_DYNAMIC + // to match the base method + [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)] +#else + [SecurityCritical] +#endif + public override IntPtr SupportsInterface(ref Guid iid) { + // if the iid is the sink iid, we ask the base class for an rcw to IDispatch + if (iid == _sinkIid) { + IntPtr retVal = IntPtr.Zero; + retVal = Marshal.GetIDispatchForObject(_sink); + return retVal; + } + + return base.SupportsInterface(ref iid); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] +#if MICROSOFT_DYNAMIC + // to match the base method + [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)] +#else + [SecurityCritical] +#endif + public override IMessage Invoke(IMessage msg) { + ContractUtils.RequiresNotNull(msg, "msg"); + + //Only know how to handle method calls (property and fields accessors count as methods) + IMethodCallMessage methodCallMessage = msg as IMethodCallMessage; + if (methodCallMessage == null) + throw new NotSupportedException(); + + // ComEventSink.InvokeMember is handled specially. + // The reason we need to do that is due to how namedParameters arg (7th element in the IMethodCallMessage.Args array) + // is marshalled when called through RealProxy.Invoke. + // In RealProxy.Invoke namedParameters is typed as object[], while InvokeMember expects it to be string[]. + // If we simply let this call go through (with RemotingServices.ExecuteMessage) + // we get an InvalidCastException when Remoting tries to pass namedParameters (of type object[]) + // to InvokeMember (which expects namedParameters to be string[]). + // Since we don't use namedParameters in ComEventSink.InvokeMember - we simply ignore it here + // and pass-in null. + MethodInfo methodInfo = (MethodInfo)methodCallMessage.MethodBase; + if (methodInfo == _methodInfoInvokeMember) { + object retVal = null; + + try { + // InvokeMember(string name, BindingFlags bindingFlags, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) + retVal = ((IReflect)_sink).InvokeMember( + /*name*/ methodCallMessage.Args[0] as string, + /*bindingFlags*/ (BindingFlags)methodCallMessage.Args[1], + /*binder*/ methodCallMessage.Args[2] as Binder, + /*target*/ null, + /*args*/ methodCallMessage.Args[4] as object[], + /*modifiers*/ methodCallMessage.Args[5] as ParameterModifier[], + /*culture*/ methodCallMessage.Args[6] as CultureInfo, + /*namedParameters*/ null); + } catch (Exception ex) { + return new ReturnMessage(ex.InnerException, methodCallMessage); + } + + return new ReturnMessage(retVal, methodCallMessage.Args, methodCallMessage.ArgCount, null, methodCallMessage); + } + + return RemotingServices.ExecuteMessage(_sink, methodCallMessage); + } + + #endregion + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventSinksContainer.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventSinksContainer.cs new file mode 100644 index 00000000000..1f3fbe54378 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComEventSinksContainer.cs @@ -0,0 +1,98 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Security; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// ComEventSinksContainer is just a regular list with a finalizer. + /// This list is usually attached as a custom data for RCW object and + /// is finalized whenever RCW is finalized. + /// + internal class ComEventSinksContainer : List, IDisposable { + private ComEventSinksContainer() { + } + + private static readonly object _ComObjectEventSinksKey = new object(); + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1002:DoNotExposeGenericLists")] + [SecurityCritical] + public static ComEventSinksContainer FromRuntimeCallableWrapper(object rcw, bool createIfNotFound) { + // !!! Marshal.Get/SetComObjectData has a LinkDemand for UnmanagedCode which will turn into + // a full demand. We need to avoid this by making this method SecurityCritical + object data = Marshal.GetComObjectData(rcw, _ComObjectEventSinksKey); + if (data != null || createIfNotFound == false) { + return (ComEventSinksContainer)data; + } + + lock (_ComObjectEventSinksKey) { + data = Marshal.GetComObjectData(rcw, _ComObjectEventSinksKey); + if (data != null) { + return (ComEventSinksContainer)data; + } + + ComEventSinksContainer comEventSinks = new ComEventSinksContainer(); + if (!Marshal.SetComObjectData(rcw, _ComObjectEventSinksKey, comEventSinks)) { + throw Error.SetComObjectDataFailed(); + } + + return comEventSinks; + } + } + + #region IDisposable Members + +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + public void Dispose() { + DisposeAll(); + GC.SuppressFinalize(this); + } + + #endregion + + [SecurityCritical] + private void DisposeAll() { + foreach (ComEventSink sink in this) { + sink.Dispose(); + } + } + +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + ~ComEventSinksContainer() { + DisposeAll(); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComFallbackMetaObject.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComFallbackMetaObject.cs new file mode 100644 index 00000000000..10f1fabcc67 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComFallbackMetaObject.cs @@ -0,0 +1,92 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +#if CODEPLEX_40 +using System.Linq.Expressions; +using System.Dynamic; +using System.Dynamic.Utils; +#else +using Microsoft.Linq.Expressions; +using Microsoft.Scripting; +using Microsoft.Scripting.Utils; +#endif +using System.Diagnostics; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + // + // ComFallbackMetaObject just delegates everything to the binder. + // + // Note that before performing FallBack on a ComObject we need to unwrap it so that + // binder would act upon the actual object (typically Rcw) + // + // Also: we don't need to implement these for any operations other than those + // supported by ComBinder + internal class ComFallbackMetaObject : DynamicMetaObject { + internal ComFallbackMetaObject(Expression expression, BindingRestrictions restrictions, object arg) + : base(expression, restrictions, arg) { + } + + public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackGetIndex(UnwrapSelf(), indexes); + } + + public override DynamicMetaObject BindSetIndex(SetIndexBinder binder, DynamicMetaObject[] indexes, DynamicMetaObject value) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackSetIndex(UnwrapSelf(), indexes, value); + } + + public override DynamicMetaObject BindGetMember(GetMemberBinder binder) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackGetMember(UnwrapSelf()); + } + + public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackInvokeMember(UnwrapSelf(), args); + } + + public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicMetaObject value) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackSetMember(UnwrapSelf(), value); + } + + protected virtual ComUnwrappedMetaObject UnwrapSelf() { + return new ComUnwrappedMetaObject( + ComObject.RcwFromComObject(Expression), + Restrictions.Merge(ComBinderHelpers.GetTypeRestrictionForDynamicMetaObject(this)), + ((ComObject)Value).RuntimeCallableWrapper + ); + } + } + + // This type exists as a signal type, so ComBinder knows not to try to bind + // again when we're trying to fall back + internal sealed class ComUnwrappedMetaObject : DynamicMetaObject { + internal ComUnwrappedMetaObject(Expression expression, BindingRestrictions restrictions, object value) + : base(expression, restrictions, value) { + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComHresults.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComHresults.cs new file mode 100644 index 00000000000..dfc00fca5e3 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComHresults.cs @@ -0,0 +1,58 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal static class ComHresults { + + internal const int S_OK = 0; + + internal const int CONNECT_E_NOCONNECTION = unchecked((int)0x80040200); + + internal const int DISP_E_UNKNOWNINTERFACE = unchecked((int)0x80020001); + internal const int DISP_E_MEMBERNOTFOUND = unchecked((int)0x80020003); + internal const int DISP_E_PARAMNOTFOUND = unchecked((int)0x80020004); + internal const int DISP_E_TYPEMISMATCH = unchecked((int)0x80020005); + internal const int DISP_E_UNKNOWNNAME = unchecked((int)0x80020006); // GetIDsOfName + internal const int DISP_E_NONAMEDARGS = unchecked((int)0x80020007); + internal const int DISP_E_BADVARTYPE = unchecked((int)0x80020008); + internal const int DISP_E_EXCEPTION = unchecked((int)0x80020009); + internal const int DISP_E_OVERFLOW = unchecked((int)0x8002000A); + internal const int DISP_E_BADINDEX = unchecked((int)0x8002000B); // GetTypeInfo + internal const int DISP_E_UNKNOWNLCID = unchecked((int)0x8002000C); + internal const int DISP_E_ARRAYISLOCKED = unchecked((int)0x8002000D); // VariantClear + internal const int DISP_E_BADPARAMCOUNT = unchecked((int)0x8002000E); + internal const int DISP_E_PARAMNOTOPTIONAL = unchecked((int)0x8002000F); + + internal const int E_NOINTERFACE = unchecked((int)0x80004002); + internal const int E_FAIL = unchecked((int)0x80004005); + + internal const int TYPE_E_LIBNOTREGISTERED = unchecked((int)0x8002801D); + + internal static bool IsSuccess(int hresult) { + return hresult >= 0; + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComInterop.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComInterop.cs new file mode 100644 index 00000000000..2d289c7c596 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComInterop.cs @@ -0,0 +1,98 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Runtime.InteropServices; +using ComTypes = System.Runtime.InteropServices.ComTypes; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + [ + ComImport, + InterfaceType(ComInterfaceType.InterfaceIsIDispatch), + Guid("00020400-0000-0000-C000-000000000046") + ] + internal interface IDispatchForReflection { + } + + [ + ComImport, + InterfaceType(ComInterfaceType.InterfaceIsIUnknown), + Guid("00020400-0000-0000-C000-000000000046"), + ] + internal interface IDispatch { + + [PreserveSig] + int TryGetTypeInfoCount(out uint pctinfo); + + [PreserveSig] + int TryGetTypeInfo(uint iTInfo, int lcid, out IntPtr info); + + [PreserveSig] + int TryGetIDsOfNames( + ref Guid iid, + [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr, SizeParamIndex = 2)] + string[] names, + uint cNames, + int lcid, + [Out] + [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I4, SizeParamIndex = 2)] + int[] rgDispId); + + [PreserveSig] + int TryInvoke( + int dispIdMember, + ref Guid riid, + int lcid, + ComTypes.INVOKEKIND wFlags, + ref ComTypes.DISPPARAMS pDispParams, + out object VarResult, + out ComTypes.EXCEPINFO pExcepInfo, + out uint puArgErr); + } + + /// + /// Layout of the IDispatch vtable + /// + internal enum IDispatchMethodIndices { + IUnknown_QueryInterface, + IUnknown_AddRef, + IUnknown_Release, + + IDispatch_GetTypeInfoCount , + IDispatch_GetTypeInfo, + IDispatch_GetIDsOfNames, + IDispatch_Invoke + } + + [ + ComImport, + InterfaceType(ComInterfaceType.InterfaceIsIUnknown), + Guid("B196B283-BAB4-101A-B69C-00AA00341D07") + ] + internal interface IProvideClassInfo { + void GetClassInfo(out IntPtr info); + } + +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComInvokeAction.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComInvokeAction.cs new file mode 100644 index 00000000000..47ac1dd3f35 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComInvokeAction.cs @@ -0,0 +1,107 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Invokes the object. If it falls back, just produce an error. + /// + internal sealed class ComInvokeAction : InvokeBinder { + internal ComInvokeAction(CallInfo callInfo) + : base(callInfo) { + } + + public override int GetHashCode() { + return base.GetHashCode(); + } + + public override bool Equals(object obj) { + return base.Equals(obj as ComInvokeAction); + } + + public override DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) { + return errorSuggestion ?? new DynamicMetaObject( + Expression.Throw( + Expression.New( + typeof(NotSupportedException).GetConstructor(new[] { typeof(string) }), + Expression.Constant(Strings.CannotCall) + ) + ), + target.Restrictions.Merge(BindingRestrictions.Combine(args)) + ); + } + } + + /// + /// Splats the arguments to another nested dynamic site, which does the + /// real invocation of the IDynamicMetaObjectProvider. + /// + internal sealed class SplatInvokeBinder : CallSiteBinder { + internal readonly static SplatInvokeBinder Instance = new SplatInvokeBinder(); + + // Just splat the args and dispatch through a nested site + public override Expression Bind(object[] args, ReadOnlyCollection parameters, LabelTarget returnLabel) { + Debug.Assert(args.Length == 2); + + int count = ((object[])args[1]).Length; + ParameterExpression array = parameters[1]; + + var nestedArgs = new ReadOnlyCollectionBuilder(count + 1); + var delegateArgs = new Type[count + 3]; // args + target + returnType + CallSite + nestedArgs.Add(parameters[0]); + delegateArgs[0] = typeof(CallSite); + delegateArgs[1] = typeof(object); + for (int i = 0; i < count; i++) { + nestedArgs.Add(Expression.ArrayAccess(array, Expression.Constant(i))); + delegateArgs[i + 2] = typeof(object).MakeByRefType(); + } + delegateArgs[delegateArgs.Length - 1] = typeof(object); + + return Expression.IfThen( + Expression.Equal(Expression.ArrayLength(array), Expression.Constant(count)), + Expression.Return( + returnLabel, + Expression.MakeDynamic( + Expression.GetDelegateType(delegateArgs), + new ComInvokeAction(new CallInfo(count)), + nestedArgs + ) + ) + ); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComInvokeBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComInvokeBinder.cs new file mode 100644 index 00000000000..98afb92dfd3 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComInvokeBinder.cs @@ -0,0 +1,538 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.InteropServices; +#if CODEPLEX_40 +using System.Dynamic; +using System.Dynamic.Utils; +#else +using Microsoft.Scripting; +using Microsoft.Scripting.Utils; +#endif +using ComTypes = System.Runtime.InteropServices.ComTypes; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal sealed class ComInvokeBinder { + private readonly ComMethodDesc _methodDesc; + private readonly Expression _method; // ComMethodDesc to be called + private readonly Expression _dispatch; // IDispatch + + private readonly CallInfo _callInfo; + private readonly DynamicMetaObject[] _args; + private readonly bool[] _isByRef; + private readonly Expression _instance; + + private BindingRestrictions _restrictions; + + private VarEnumSelector _varEnumSelector; + private string[] _keywordArgNames; + private int _totalExplicitArgs; // Includes the individial elements of ArgumentKind.Dictionary (if any) + + private ParameterExpression _dispatchObject; + private ParameterExpression _dispatchPointer; + private ParameterExpression _dispId; + private ParameterExpression _dispParams; + private ParameterExpression _paramVariants; + private ParameterExpression _invokeResult; + private ParameterExpression _returnValue; + private ParameterExpression _dispIdsOfKeywordArgsPinned; + private ParameterExpression _propertyPutDispId; + + internal ComInvokeBinder( + CallInfo callInfo, + DynamicMetaObject[] args, + bool[] isByRef, + BindingRestrictions restrictions, + Expression method, + Expression dispatch, + ComMethodDesc methodDesc + ) { + + Debug.Assert(callInfo != null, "arguments"); + Debug.Assert(args != null, "args"); + Debug.Assert(isByRef != null, "isByRef"); + Debug.Assert(method != null, "method"); + Debug.Assert(dispatch != null, "dispatch"); + + Debug.Assert(TypeUtils.AreReferenceAssignable(typeof(ComMethodDesc), method.Type), "method"); + Debug.Assert(TypeUtils.AreReferenceAssignable(typeof(IDispatch), dispatch.Type), "dispatch"); + + _method = method; + _dispatch = dispatch; + _methodDesc = methodDesc; + + _callInfo = callInfo; + _args = args; + _isByRef = isByRef; + _restrictions = restrictions; + + // Set Instance to some value so that CallBinderHelper has the right number of parameters to work with + _instance = dispatch; + } + + private ParameterExpression DispatchObjectVariable { + get { return EnsureVariable(ref _dispatchObject, typeof(IDispatch), "dispatchObject"); } + } + + private ParameterExpression DispatchPointerVariable { + get { return EnsureVariable(ref _dispatchPointer, typeof(IntPtr), "dispatchPointer"); } + } + + private ParameterExpression DispIdVariable { + get { return EnsureVariable(ref _dispId, typeof(int), "dispId"); } + } + + private ParameterExpression DispParamsVariable { + get { return EnsureVariable(ref _dispParams, typeof(ComTypes.DISPPARAMS), "dispParams"); } + } + + private ParameterExpression InvokeResultVariable { + get { return EnsureVariable(ref _invokeResult, typeof(Variant), "invokeResult"); } + } + + private ParameterExpression ReturnValueVariable { + get { return EnsureVariable(ref _returnValue, typeof(object), "returnValue"); } + } + + private ParameterExpression DispIdsOfKeywordArgsPinnedVariable { + get { return EnsureVariable(ref _dispIdsOfKeywordArgsPinned, typeof(GCHandle), "dispIdsOfKeywordArgsPinned"); } + } + + private ParameterExpression PropertyPutDispIdVariable { + get { return EnsureVariable(ref _propertyPutDispId, typeof(int), "propertyPutDispId"); } + } + + private ParameterExpression ParamVariantsVariable { + get { + if (_paramVariants == null) { + _paramVariants = Expression.Variable(VariantArray.GetStructType(_args.Length), "paramVariants"); + } + return _paramVariants; + } + } + + private static ParameterExpression EnsureVariable(ref ParameterExpression var, Type type, string name) { + if (var != null) { + return var; + } + return var = Expression.Variable(type, name); + } + + private static Type MarshalType(DynamicMetaObject mo, bool isByRef) { + Type marshalType = (mo.Value == null && mo.HasValue && !mo.LimitType.IsValueType) ? null : mo.LimitType; + + // we are not checking that mo.Expression is writeable or whether evaluating it has no sideeffects + // the assumption is that whoever matched it with ByRef arginfo took care of this. + if (isByRef) { + // Null just means that null was supplied. + if (marshalType == null) { + marshalType = mo.Expression.Type; + } + marshalType = marshalType.MakeByRefType(); + } + return marshalType; + } + + internal DynamicMetaObject Invoke() { + _keywordArgNames = _callInfo.ArgumentNames.ToArray(); + _totalExplicitArgs = _args.Length; + + Type[] marshalArgTypes = new Type[_args.Length]; + + // We already tested the instance, so no need to test it again + for (int i = 0; i < _args.Length; i++) { + DynamicMetaObject curMo = _args[i]; + _restrictions = _restrictions.Merge(ComBinderHelpers.GetTypeRestrictionForDynamicMetaObject(curMo)); + marshalArgTypes[i] = MarshalType(curMo, _isByRef[i]); + } + + _varEnumSelector = new VarEnumSelector(marshalArgTypes); + + return new DynamicMetaObject( + CreateScope(MakeIDispatchInvokeTarget()), + BindingRestrictions.Combine(_args).Merge(_restrictions) + ); + } + + private static void AddNotNull(List list, ParameterExpression var) { + if (var != null) list.Add(var); + } + + private Expression CreateScope(Expression expression) { + List vars = new List(); + AddNotNull(vars, _dispatchObject); + AddNotNull(vars, _dispatchPointer); + AddNotNull(vars, _dispId); + AddNotNull(vars, _dispParams); + AddNotNull(vars, _paramVariants); + AddNotNull(vars, _invokeResult); + AddNotNull(vars, _returnValue); + AddNotNull(vars, _dispIdsOfKeywordArgsPinned); + AddNotNull(vars, _propertyPutDispId); + return vars.Count > 0 ? Expression.Block(vars, expression) : expression; + } + + private Expression GenerateTryBlock() { + // + // Declare variables + // + ParameterExpression excepInfo = Expression.Variable(typeof(ExcepInfo), "excepInfo"); + ParameterExpression argErr = Expression.Variable(typeof(uint), "argErr"); + ParameterExpression hresult = Expression.Variable(typeof(int), "hresult"); + + List tryStatements = new List(); + Expression expr; + + if (_keywordArgNames.Length > 0) { + string[] names = _keywordArgNames.AddFirst(_methodDesc.Name); + + tryStatements.Add( + Expression.Assign( + Expression.Field( + DispParamsVariable, + typeof(ComTypes.DISPPARAMS).GetField("rgdispidNamedArgs") + ), + Expression.Call(typeof(UnsafeMethods).GetMethod("GetIdsOfNamedParameters"), + DispatchObjectVariable, + Expression.Constant(names), + DispIdVariable, + DispIdsOfKeywordArgsPinnedVariable + ) + ) + ); + } + + // + // Marshal the arguments to Variants + // + // For a call like this: + // comObj.Foo(100, 101, 102, x=123, z=125) + // DISPPARAMS needs to be setup like this: + // cArgs: 5 + // cNamedArgs: 2 + // rgArgs: 123, 125, 102, 101, 100 + // rgdispidNamedArgs: dispid x, dispid z (the dispids of x and z respectively) + + Expression[] parameters = MakeArgumentExpressions(); + + int reverseIndex = _varEnumSelector.VariantBuilders.Length - 1; + int positionalArgs = _varEnumSelector.VariantBuilders.Length - _keywordArgNames.Length; // args passed by position order and not by name + for (int i = 0; i < _varEnumSelector.VariantBuilders.Length; i++, reverseIndex--) { + int variantIndex; + if (i >= positionalArgs) { + // Named arguments are in order at the start of rgArgs + variantIndex = i - positionalArgs; + } else { + // Positial arguments are in reverse order at the tail of rgArgs + variantIndex = reverseIndex; + } + VariantBuilder variantBuilder = _varEnumSelector.VariantBuilders[i]; + + Expression marshal = variantBuilder.InitializeArgumentVariant( + VariantArray.GetStructField(ParamVariantsVariable, variantIndex), + parameters[i + 1] + ); + + if (marshal != null) { + tryStatements.Add(marshal); + } + } + + + // + // Call Invoke + // + + ComTypes.INVOKEKIND invokeKind; + if (_methodDesc.IsPropertyPut) { + if (_methodDesc.IsPropertyPutRef) { + invokeKind = ComTypes.INVOKEKIND.INVOKE_PROPERTYPUTREF; + } else { + invokeKind = ComTypes.INVOKEKIND.INVOKE_PROPERTYPUT; + } + } else { + // INVOKE_PROPERTYGET should only be needed for COM objects without typeinfo, where we might have to treat properties as methods + invokeKind = ComTypes.INVOKEKIND.INVOKE_FUNC | ComTypes.INVOKEKIND.INVOKE_PROPERTYGET; + } + + MethodCallExpression invoke = Expression.Call( + typeof(UnsafeMethods).GetMethod("IDispatchInvoke"), + DispatchPointerVariable, + DispIdVariable, + Expression.Constant(invokeKind), + DispParamsVariable, + InvokeResultVariable, + excepInfo, + argErr + ); + + expr = Expression.Assign(hresult, invoke); + tryStatements.Add(expr); + + // + // ComRuntimeHelpers.CheckThrowException(hresult, excepInfo, argErr, ThisParameter); + // + expr = Expression.Call( + typeof(ComRuntimeHelpers).GetMethod("CheckThrowException"), + hresult, + excepInfo, + argErr, + Expression.Constant(_methodDesc.Name, typeof(string)) + ); + tryStatements.Add(expr); + + // + // _returnValue = (ReturnType)_invokeResult.ToObject(); + // + Expression invokeResultObject = + Expression.Call( + InvokeResultVariable, + typeof(Variant).GetMethod("ToObject")); + + VariantBuilder[] variants = _varEnumSelector.VariantBuilders; + + Expression[] parametersForUpdates = MakeArgumentExpressions(); + tryStatements.Add(Expression.Assign(ReturnValueVariable, invokeResultObject)); + + for (int i = 0, n = variants.Length; i < n; i++) { + Expression updateFromReturn = variants[i].UpdateFromReturn(parametersForUpdates[i + 1]); + if (updateFromReturn != null) { + tryStatements.Add(updateFromReturn); + } + } + + tryStatements.Add(Expression.Empty()); + + return Expression.Block(new[] { excepInfo, argErr, hresult }, tryStatements); + } + + private Expression GenerateFinallyBlock() { + List finallyStatements = new List(); + + // + // UnsafeMethods.IUnknownRelease(dispatchPointer); + // + finallyStatements.Add( + Expression.Call( + typeof(UnsafeMethods).GetMethod("IUnknownRelease"), + DispatchPointerVariable + ) + ); + + // + // Clear memory allocated for marshalling + // + for (int i = 0, n = _varEnumSelector.VariantBuilders.Length; i < n; i++) { + Expression clear = _varEnumSelector.VariantBuilders[i].Clear(); + if (clear != null) { + finallyStatements.Add(clear); + } + } + + // + // _invokeResult.Clear() + // + + finallyStatements.Add( + Expression.Call( + InvokeResultVariable, + typeof(Variant).GetMethod("Clear") + ) + ); + + // + // _dispIdsOfKeywordArgsPinned.Free() + // + if (_dispIdsOfKeywordArgsPinned != null) { + finallyStatements.Add( + Expression.Call( + DispIdsOfKeywordArgsPinnedVariable, + typeof(GCHandle).GetMethod("Free") + ) + ); + } + + finallyStatements.Add(Expression.Empty()); + return Expression.Block(finallyStatements); + } + + /// + /// Create a stub for the target of the optimized lopop. + /// + /// + private Expression MakeIDispatchInvokeTarget() { + Debug.Assert(_varEnumSelector.VariantBuilders.Length == _totalExplicitArgs); + + List exprs = new List(); + + // + // _dispId = ((DispCallable)this).ComMethodDesc.DispId; + // + exprs.Add( + Expression.Assign( + DispIdVariable, + Expression.Property(_method, typeof(ComMethodDesc).GetProperty("DispId")) + ) + ); + + // + // _dispParams.rgvararg = RuntimeHelpers.UnsafeMethods.ConvertVariantByrefToPtr(ref _paramVariants._element0) + // + if (_totalExplicitArgs != 0) { + exprs.Add( + Expression.Assign( + Expression.Field( + DispParamsVariable, + typeof(ComTypes.DISPPARAMS).GetField("rgvarg") + ), + Expression.Call( + typeof(UnsafeMethods).GetMethod("ConvertVariantByrefToPtr"), + VariantArray.GetStructField(ParamVariantsVariable, 0) + ) + ) + ); + } + + // + // _dispParams.cArgs = ; + // + exprs.Add( + Expression.Assign( + Expression.Field( + DispParamsVariable, + typeof(ComTypes.DISPPARAMS).GetField("cArgs") + ), + Expression.Constant(_totalExplicitArgs) + ) + ); + + if (_methodDesc.IsPropertyPut) { + // + // dispParams.cNamedArgs = 1; + // dispParams.rgdispidNamedArgs = RuntimeHelpers.UnsafeMethods.GetNamedArgsForPropertyPut() + // + exprs.Add( + Expression.Assign( + Expression.Field( + DispParamsVariable, + typeof(ComTypes.DISPPARAMS).GetField("cNamedArgs") + ), + Expression.Constant(1) + ) + ); + + exprs.Add( + Expression.Assign( + PropertyPutDispIdVariable, + Expression.Constant(ComDispIds.DISPID_PROPERTYPUT) + ) + ); + + exprs.Add( + Expression.Assign( + Expression.Field( + DispParamsVariable, + typeof(ComTypes.DISPPARAMS).GetField("rgdispidNamedArgs") + ), + Expression.Call( + typeof(UnsafeMethods).GetMethod("ConvertInt32ByrefToPtr"), + PropertyPutDispIdVariable + ) + ) + ); + } else { + // + // _dispParams.cNamedArgs = N; + // + exprs.Add( + Expression.Assign( + Expression.Field( + DispParamsVariable, + typeof(ComTypes.DISPPARAMS).GetField("cNamedArgs") + ), + Expression.Constant(_keywordArgNames.Length) + ) + ); + } + + // + // _dispatchObject = _dispatch + // _dispatchPointer = Marshal.GetIDispatchForObject(_dispatchObject); + // + + exprs.Add(Expression.Assign(DispatchObjectVariable, _dispatch)); + + exprs.Add( + Expression.Assign( + DispatchPointerVariable, + Expression.Call( + typeof(Marshal).GetMethod("GetIDispatchForObject"), + DispatchObjectVariable + ) + ) + ); + + Expression tryStatements = GenerateTryBlock(); + Expression finallyStatements = GenerateFinallyBlock(); + + exprs.Add(Expression.TryFinally(tryStatements, finallyStatements)); + + exprs.Add(ReturnValueVariable); + var vars = new List(); + foreach (var variant in _varEnumSelector.VariantBuilders) { + if (variant.TempVariable != null) { + vars.Add(variant.TempVariable); + } + } + return Expression.Block(vars, exprs); + } + + /// + /// Gets expressions to access all the arguments. This includes the instance argument. + /// + private Expression[] MakeArgumentExpressions() { + Expression[] res; + int copy = 0; + if (_instance != null) { + res = new Expression[_args.Length + 1]; + res[copy++] = _instance; + } else { + res = new Expression[_args.Length]; + } + + for (int i = 0; i < _args.Length; i++) { + res[copy++] = _args[i].Expression; + } + return res; + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComMetaObject.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComMetaObject.cs new file mode 100644 index 00000000000..4beb7c54929 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComMetaObject.cs @@ -0,0 +1,87 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +#if CODEPLEX_40 +using System.Linq.Expressions; +using System.Dynamic; +using System.Dynamic.Utils; +#else +using Microsoft.Linq.Expressions; +using Microsoft.Scripting; +using Microsoft.Scripting.Utils; +#endif +using System.Collections.Generic; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + // Note: we only need to support the operations used by ComBinder + internal class ComMetaObject : DynamicMetaObject { + internal ComMetaObject(Expression expression, BindingRestrictions restrictions, object arg) + : base(expression, restrictions, arg) { + } + + public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.Defer(args.AddFirst(WrapSelf())); + } + + public override DynamicMetaObject BindInvoke(InvokeBinder binder, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.Defer(args.AddFirst(WrapSelf())); + } + + public override DynamicMetaObject BindGetMember(GetMemberBinder binder) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.Defer(WrapSelf()); + } + + public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicMetaObject value) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.Defer(WrapSelf(), value); + } + + public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.Defer(WrapSelf(), indexes); + } + + public override DynamicMetaObject BindSetIndex(SetIndexBinder binder, DynamicMetaObject[] indexes, DynamicMetaObject value) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.Defer(WrapSelf(), indexes.AddLast(value)); + } + + private DynamicMetaObject WrapSelf() { + return new DynamicMetaObject( + ComObject.RcwToComObject(Expression), + BindingRestrictions.GetExpressionRestriction( + Expression.Call( + typeof(ComObject).GetMethod("IsComObject", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic), + Helpers.Convert(Expression, typeof(object)) + ) + ) + ); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComMethodDesc.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComMethodDesc.cs new file mode 100644 index 00000000000..e221bb92574 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComMethodDesc.cs @@ -0,0 +1,120 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Diagnostics; +using System.Runtime.InteropServices.ComTypes; +using System.Text; +using System.Globalization; +using Marshal = System.Runtime.InteropServices.Marshal; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal sealed class ComMethodDesc { + private readonly int _memid; // this is the member id extracted from FUNCDESC.memid + private readonly string _name; + internal readonly INVOKEKIND InvokeKind; + private readonly int _paramCnt; + + private ComMethodDesc(int dispId) { + _memid = dispId; + } + + internal ComMethodDesc(string name, int dispId) + : this(dispId) { + // no ITypeInfo constructor + _name = name; + } + + internal ComMethodDesc(string name, int dispId, INVOKEKIND invkind) + : this(name, dispId) { + InvokeKind = invkind; + } + + internal ComMethodDesc(ITypeInfo typeInfo, FUNCDESC funcDesc) + : this(funcDesc.memid) { + + InvokeKind = funcDesc.invkind; + + int cNames; + string[] rgNames = new string[1 + funcDesc.cParams]; + typeInfo.GetNames(_memid, rgNames, rgNames.Length, out cNames); + if (IsPropertyPut && rgNames[rgNames.Length - 1] == null) { + rgNames[rgNames.Length - 1] = "value"; + cNames++; + } + Debug.Assert(cNames == rgNames.Length); + _name = rgNames[0]; + + _paramCnt = funcDesc.cParams; + } + + public string Name { + get { + Debug.Assert(_name != null); + return _name; + } + } + + public int DispId { + get { return _memid; } + } + + public bool IsPropertyGet { + get { + return (InvokeKind & INVOKEKIND.INVOKE_PROPERTYGET) != 0; + } + } + + public bool IsDataMember { + get { + //must be regular get + if (!IsPropertyGet || DispId == ComDispIds.DISPID_NEWENUM) { + return false; + } + + //must have no parameters + return _paramCnt == 0; + } + } + + public bool IsPropertyPut { + get { + return (InvokeKind & (INVOKEKIND.INVOKE_PROPERTYPUT | INVOKEKIND.INVOKE_PROPERTYPUTREF)) != 0; + } + } + + public bool IsPropertyPutRef { + get { + return (InvokeKind & INVOKEKIND.INVOKE_PROPERTYPUTREF) != 0; + } + } + + internal int ParamCount { + get { + return _paramCnt; + } + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComObject.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComObject.cs new file mode 100644 index 00000000000..0860ae04bb5 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComObject.cs @@ -0,0 +1,145 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; +using System.Security.Permissions; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// This is a helper class for runtime-callable-wrappers of COM instances. We create one instance of this type + /// for every generic RCW instance. + /// + internal class ComObject : IDynamicMetaObjectProvider { + /// + /// The runtime-callable wrapper + /// + private readonly object _rcw; + + internal ComObject(object rcw) { + Debug.Assert(ComObject.IsComObject(rcw)); + _rcw = rcw; + } + + internal object RuntimeCallableWrapper { + get { + return _rcw; + } + } + + private readonly static object _ComObjectInfoKey = new object(); + + /// + /// This is the factory method to get the ComObject corresponding to an RCW + /// + /// +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")] + public static ComObject ObjectToComObject(object rcw) { + Debug.Assert(ComObject.IsComObject(rcw)); + + // Marshal.Get/SetComObjectData has a LinkDemand for UnmanagedCode which will turn into + // a full demand. We could avoid this by making this method SecurityCritical + object data = Marshal.GetComObjectData(rcw, _ComObjectInfoKey); + if (data != null) { + return (ComObject)data; + } + + lock (_ComObjectInfoKey) { + data = Marshal.GetComObjectData(rcw, _ComObjectInfoKey); + if (data != null) { + return (ComObject)data; + } + + ComObject comObjectInfo = CreateComObject(rcw); + if (!Marshal.SetComObjectData(rcw, _ComObjectInfoKey, comObjectInfo)) { + throw Error.SetComObjectDataFailed(); + } + + return comObjectInfo; + } + } + + // Expression that unwraps ComObject + internal static MemberExpression RcwFromComObject(Expression comObject) { + Debug.Assert(comObject != null && typeof(ComObject).IsAssignableFrom(comObject.Type), "must be ComObject"); + + return Expression.Property( + Helpers.Convert(comObject, typeof(ComObject)), + typeof(ComObject).GetProperty("RuntimeCallableWrapper", BindingFlags.NonPublic | BindingFlags.Instance) + ); + } + + // Expression that finds or creates a ComObject that corresponds to given Rcw + internal static MethodCallExpression RcwToComObject(Expression rcw) { + return Expression.Call( + typeof(ComObject).GetMethod("ObjectToComObject"), + Helpers.Convert(rcw, typeof(object)) + ); + } + + private static ComObject CreateComObject(object rcw) { + IDispatch dispatchObject = rcw as IDispatch; + if (dispatchObject != null) { + // We can do method invocations on IDispatch objects + return new IDispatchComObject(dispatchObject); + } + + // There is not much we can do in this case + return new ComObject(rcw); + } + + internal virtual IList GetMemberNames(bool dataOnly) { + return new string[0]; + } + + internal virtual IList> GetMembers(IEnumerable names) { + return new KeyValuePair[0]; + } + + DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter) { + return new ComFallbackMetaObject(parameter, BindingRestrictions.Empty, this); + } + + private static readonly Type ComObjectType = typeof(object).Assembly.GetType("System.__ComObject"); + + internal static bool IsComObject(object obj) { + // we can't use System.Runtime.InteropServices.Marshal.IsComObject(obj) since it doesn't work in partial trust + return obj != null && ComObjectType.IsAssignableFrom(obj.GetType()); + } + + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComRuntimeHelpers.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComRuntimeHelpers.cs new file mode 100644 index 00000000000..be0f036363b --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComRuntimeHelpers.cs @@ -0,0 +1,814 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.InteropServices; +using System.Security; +using System.Security.Permissions; +using ComTypes = System.Runtime.InteropServices.ComTypes; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal static class ComRuntimeHelpers { + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "1#")] + public static void CheckThrowException(int hresult, ref ExcepInfo excepInfo, uint argErr, string message) { + if (ComHresults.IsSuccess(hresult)) { + return; + } + + switch (hresult) { + case ComHresults.DISP_E_BADPARAMCOUNT: + // The number of elements provided to DISPPARAMS is different from the number of arguments + // accepted by the method or property. + throw Error.DispBadParamCount(message); + + case ComHresults.DISP_E_BADVARTYPE: + //One of the arguments in rgvarg is not a valid variant type. + break; + + case ComHresults.DISP_E_EXCEPTION: + // The application needs to raise an exception. In this case, the structure passed in pExcepInfo + // should be filled in. + throw excepInfo.GetException(); + + case ComHresults.DISP_E_MEMBERNOTFOUND: + // The requested member does not exist, or the call to Invoke tried to set the value of a + // read-only property. + throw Error.DispMemberNotFound(message); + + case ComHresults.DISP_E_NONAMEDARGS: + // This implementation of IDispatch does not support named arguments. + throw Error.DispNoNamedArgs(message); + + case ComHresults.DISP_E_OVERFLOW: + // One of the arguments in rgvarg could not be coerced to the specified type. + throw Error.DispOverflow(message); + + case ComHresults.DISP_E_PARAMNOTFOUND: + // One of the parameter DISPIDs does not correspond to a parameter on the method. In this case, + // puArgErr should be set to the first argument that contains the error. + break; + + case ComHresults.DISP_E_TYPEMISMATCH: + // One or more of the arguments could not be coerced. The index within rgvarg of the first + // parameter with the incorrect type is returned in the puArgErr parameter. + throw Error.DispTypeMismatch(argErr, message); + + case ComHresults.DISP_E_UNKNOWNINTERFACE: + // The interface identifier passed in riid is not IID_NULL. + break; + + case ComHresults.DISP_E_UNKNOWNLCID: + // The member being invoked interprets string arguments according to the LCID, and the + // LCID is not recognized. + break; + + case ComHresults.DISP_E_PARAMNOTOPTIONAL: + // A required parameter was omitted. + throw Error.DispParamNotOptional(message); + } + + Marshal.ThrowExceptionForHR(hresult); + } + + internal static void GetInfoFromType(ComTypes.ITypeInfo typeInfo, out string name, out string documentation) { + int dwHelpContext; + string strHelpFile; + + typeInfo.GetDocumentation(-1, out name, out documentation, out dwHelpContext, out strHelpFile); + } + + internal static string GetNameOfMethod(ComTypes.ITypeInfo typeInfo, int memid) { + int cNames; + string[] rgNames = new string[1]; + typeInfo.GetNames(memid, rgNames, 1, out cNames); + return rgNames[0]; + } + + internal static string GetNameOfLib(ComTypes.ITypeLib typeLib) { + string name; + string strDocString; + int dwHelpContext; + string strHelpFile; + + typeLib.GetDocumentation(-1, out name, out strDocString, out dwHelpContext, out strHelpFile); + return name; + } + + internal static string GetNameOfType(ComTypes.ITypeInfo typeInfo) { + string name; + string documentation; + GetInfoFromType(typeInfo, out name, out documentation); + + return name; + } + + /// + /// Look for typeinfo using IDispatch.GetTypeInfo + /// + /// + /// + /// Some COM objects just dont expose typeinfo. In these cases, this method will return null. + /// Some COM objects do intend to expose typeinfo, but may not be able to do so if the type-library is not properly + /// registered. This will be considered as acceptable or as an error condition depending on throwIfMissingExpectedTypeInfo + /// + [SecurityCritical] + internal static ComTypes.ITypeInfo GetITypeInfoFromIDispatch(IDispatch dispatch, bool throwIfMissingExpectedTypeInfo) { + uint typeCount; + int hresult = dispatch.TryGetTypeInfoCount(out typeCount); + Marshal.ThrowExceptionForHR(hresult); + Debug.Assert(typeCount <= 1); + if (typeCount == 0) { + return null; + } + + IntPtr typeInfoPtr = IntPtr.Zero; + + hresult = dispatch.TryGetTypeInfo(0, 0, out typeInfoPtr); + if (!ComHresults.IsSuccess(hresult)) { + CheckIfMissingTypeInfoIsExpected(hresult, throwIfMissingExpectedTypeInfo); + return null; + } + if (typeInfoPtr == IntPtr.Zero) { // be defensive against components that return IntPtr.Zero + if (throwIfMissingExpectedTypeInfo) { + Marshal.ThrowExceptionForHR(ComHresults.E_FAIL); + } + return null; + } + + ComTypes.ITypeInfo typeInfo = null; + try { + typeInfo = Marshal.GetObjectForIUnknown(typeInfoPtr) as ComTypes.ITypeInfo; + } finally { + Marshal.Release(typeInfoPtr); + } + + return typeInfo; + } + + /// + /// This method should be called when typeinfo is not available for an object. The function + /// will check if the typeinfo is expected to be missing. This can include error cases where + /// the same error is guaranteed to happen all the time, on all machines, under all circumstances. + /// In such cases, we just have to operate without the typeinfo. + /// + /// However, if accessing the typeinfo is failing in a transient way, we might want to throw + /// an exception so that we will eagerly predictably indicate the problem. + /// + [SecurityCritical] + private static void CheckIfMissingTypeInfoIsExpected(int hresult, bool throwIfMissingExpectedTypeInfo) { + Debug.Assert(!ComHresults.IsSuccess(hresult)); + + // Word.Basic always returns this because of an incorrect implementation of IDispatch.GetTypeInfo + // Any implementation that returns E_NOINTERFACE is likely to do so in all environments + if (hresult == ComHresults.E_NOINTERFACE) { + return; + } + + // This assert is potentially over-restrictive since COM components can behave in quite unexpected ways. + // However, asserting the common expected cases ensures that we find out about the unexpected scenarios, and + // can investigate the scenarios to ensure that there is no bug in our own code. + Debug.Assert(hresult == ComHresults.TYPE_E_LIBNOTREGISTERED); + + if (throwIfMissingExpectedTypeInfo) { + Marshal.ThrowExceptionForHR(hresult); + } + } + + [SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")] + [SecurityCritical] + internal static ComTypes.TYPEATTR GetTypeAttrForTypeInfo(ComTypes.ITypeInfo typeInfo) { + IntPtr pAttrs = IntPtr.Zero; + typeInfo.GetTypeAttr(out pAttrs); + + // GetTypeAttr should never return null, this is just to be safe + if (pAttrs == IntPtr.Zero) { + throw Error.CannotRetrieveTypeInformation(); + } + + try { + return (ComTypes.TYPEATTR)Marshal.PtrToStructure(pAttrs, typeof(ComTypes.TYPEATTR)); + } finally { + typeInfo.ReleaseTypeAttr(pAttrs); + } + } + + [SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")] + [SecurityCritical] + internal static ComTypes.TYPELIBATTR GetTypeAttrForTypeLib(ComTypes.ITypeLib typeLib) { + IntPtr pAttrs = IntPtr.Zero; + typeLib.GetLibAttr(out pAttrs); + + // GetTypeAttr should never return null, this is just to be safe + if (pAttrs == IntPtr.Zero) { + throw Error.CannotRetrieveTypeInformation(); + } + + try { + return (ComTypes.TYPELIBATTR)Marshal.PtrToStructure(pAttrs, typeof(ComTypes.TYPELIBATTR)); + } finally { + typeLib.ReleaseTLibAttr(pAttrs); + } + } + + public static BoundDispEvent CreateComEvent(object rcw, Guid sourceIid, int dispid) { + return new BoundDispEvent(rcw, sourceIid, dispid); + } + + public static DispCallable CreateDispCallable(IDispatchComObject dispatch, ComMethodDesc method) { + return new DispCallable(dispatch, method.Name, method.DispId); + } + } + + /// + /// This class contains methods that either cannot be expressed in C#, or which require writing unsafe code. + /// Callers of these methods need to use them extremely carefully as incorrect use could cause GC-holes + /// and other problems. + /// + /// + internal static class UnsafeMethods { + #region public members + + #region Generated ConvertByrefToPtr + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_ConvertByrefToPtr from: generate_comdispatch.py + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertSByteByrefToPtr(ref SByte value) { + fixed (SByte *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertInt16ByrefToPtr(ref Int16 value) { + fixed (Int16 *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + public static unsafe IntPtr ConvertInt32ByrefToPtr(ref Int32 value) { + fixed (Int32 *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertInt64ByrefToPtr(ref Int64 value) { + fixed (Int64 *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertByteByrefToPtr(ref Byte value) { + fixed (Byte *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertUInt16ByrefToPtr(ref UInt16 value) { + fixed (UInt16 *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertUInt32ByrefToPtr(ref UInt32 value) { + fixed (UInt32 *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertUInt64ByrefToPtr(ref UInt64 value) { + fixed (UInt64 *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertIntPtrByrefToPtr(ref IntPtr value) { + fixed (IntPtr *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertUIntPtrByrefToPtr(ref UIntPtr value) { + fixed (UIntPtr *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertSingleByrefToPtr(ref Single value) { + fixed (Single *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertDoubleByrefToPtr(ref Double value) { + fixed (Double *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + internal static unsafe IntPtr ConvertDecimalByrefToPtr(ref Decimal value) { + fixed (Decimal *x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + + + // *** END GENERATED CODE *** + + #endregion + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + public static unsafe IntPtr ConvertVariantByrefToPtr(ref Variant value) { + fixed (Variant* x = &value) { + AssertByrefPointsToStack(new IntPtr(x)); + return new IntPtr(x); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + internal static Variant GetVariantForObject(object obj) { + Variant variant = default(Variant); + if (obj == null) { + return variant; + } + InitVariantForObject(obj, ref variant); + return variant; + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + internal static void InitVariantForObject(object obj, ref Variant variant) { + Debug.Assert(obj != null); + + // GetNativeVariantForObject is very expensive for values that marshal as VT_DISPATCH + // also is is extremely common scenario when object at hand is an RCW. + // Therefore we are going to test for IDispatch before defaulting to GetNativeVariantForObject. + IDispatch disp = obj as IDispatch; + if (disp != null) { + variant.AsDispatch = obj; + return; + } + + System.Runtime.InteropServices.Marshal.GetNativeVariantForObject(obj, UnsafeMethods.ConvertVariantByrefToPtr(ref variant)); + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [Obsolete("do not use this method", true)] + public static object GetObjectForVariant(Variant variant) { + IntPtr ptr = UnsafeMethods.ConvertVariantByrefToPtr(ref variant); + return System.Runtime.InteropServices.Marshal.GetObjectForNativeVariant(ptr); + } + + [Obsolete("do not use this method", true)] + public static int IUnknownRelease(IntPtr interfacePointer) { + return _IUnknownRelease(interfacePointer); + } + + [Obsolete("do not use this method", true)] + public static void IUnknownReleaseNotZero(IntPtr interfacePointer) { + if (interfacePointer != IntPtr.Zero) { + IUnknownRelease(interfacePointer); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] + [Obsolete("do not use this method", true)] + public static int IDispatchInvoke( + IntPtr dispatchPointer, + int memberDispId, + ComTypes.INVOKEKIND flags, + ref ComTypes.DISPPARAMS dispParams, + out Variant result, + out ExcepInfo excepInfo, + out uint argErr + ) { + + int hresult = _IDispatchInvoke( + dispatchPointer, + memberDispId, + flags, + ref dispParams, + out result, + out excepInfo, + out argErr + ); + + if (hresult == ComHresults.DISP_E_MEMBERNOTFOUND + && (flags & ComTypes.INVOKEKIND.INVOKE_FUNC) != 0 + && (flags & (ComTypes.INVOKEKIND.INVOKE_PROPERTYPUT | ComTypes.INVOKEKIND.INVOKE_PROPERTYPUTREF)) == 0) { + + // Re-invoke with no result argument to accomodate Word + hresult = _IDispatchInvokeNoResult( + dispatchPointer, + memberDispId, + ComTypes.INVOKEKIND.INVOKE_FUNC, + ref dispParams, + out result, + out excepInfo, + out argErr); + } + return hresult; + } + + [Obsolete("do not use this method", true)] +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public static IntPtr GetIdsOfNamedParameters(IDispatch dispatch, string[] names, int methodDispId, out GCHandle pinningHandle) { + pinningHandle = GCHandle.Alloc(null, GCHandleType.Pinned); + int[] dispIds = new int[names.Length]; + Guid empty = Guid.Empty; + int hresult = dispatch.TryGetIDsOfNames(ref empty, names, (uint)names.Length, 0, dispIds); + if (hresult < 0) { + Marshal.ThrowExceptionForHR(hresult); + } + + if (methodDispId != dispIds[0]) { + throw Error.GetIDsOfNamesInvalid(names[0]); + } + + int[] keywordArgDispIds = dispIds.RemoveFirst(); // Remove the dispId of the method name + + pinningHandle.Target = keywordArgDispIds; + return Marshal.UnsafeAddrOfPinnedArrayElement(keywordArgDispIds, 0); + } + + #endregion + + #region non-public members + + [SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")] + [SecurityCritical] + static UnsafeMethods() { + } + + private static void EmitLoadArg(ILGenerator il, int index) { + ContractUtils.Requires(index >= 0, "index"); + + switch (index) { + case 0: + il.Emit(OpCodes.Ldarg_0); + break; + case 1: + il.Emit(OpCodes.Ldarg_1); + break; + case 2: + il.Emit(OpCodes.Ldarg_2); + break; + case 3: + il.Emit(OpCodes.Ldarg_3); + break; + default: + if (index <= Byte.MaxValue) { + il.Emit(OpCodes.Ldarg_S, (byte)index); + } else { + il.Emit(OpCodes.Ldarg, index); + } + break; + } + } + + /// + /// Ensure that "value" is a local variable in some caller's frame. So converting + /// the byref to an IntPtr is a safe operation. Alternatively, we could also allow + /// allowed "value" to be a pinned object. + /// + [Conditional("DEBUG")] + [SecurityCritical] + private static void AssertByrefPointsToStack(IntPtr ptr) { + if (Marshal.ReadInt32(ptr) == _dummyMarker) { + // Prevent recursion + return; + } + int dummy = _dummyMarker; + IntPtr ptrToLocal = ConvertInt32ByrefToPtr(ref dummy); + Debug.Assert(ptrToLocal.ToInt64() < ptr.ToInt64()); + Debug.Assert((ptr.ToInt64() - ptrToLocal.ToInt64()) < (16 * 1024)); + } + + private static readonly object _lock = new object(); + private static ModuleBuilder _dynamicModule; + + internal static ModuleBuilder DynamicModule { + get { + if (_dynamicModule != null) { + return _dynamicModule; + } + lock (_lock) { + if (_dynamicModule == null) { + var attributes = new[] { + new CustomAttributeBuilder(typeof(UnverifiableCodeAttribute).GetConstructor(Type.EmptyTypes), new object[0]), + //PermissionSet(SecurityAction.Demand, Unrestricted = true) + new CustomAttributeBuilder(typeof(PermissionSetAttribute).GetConstructor(new Type[]{typeof(SecurityAction)}), + new object[]{SecurityAction.Demand}, + new PropertyInfo[]{typeof(PermissionSetAttribute).GetProperty("Unrestricted")}, + new object[] {true}) + }; + + string name = typeof(VariantArray).Namespace + ".DynamicAssembly"; + var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(name), AssemblyBuilderAccess.Run, attributes); + assembly.DefineVersionInfoResource(); + _dynamicModule = assembly.DefineDynamicModule(name); + } + return _dynamicModule; + } + } + } + + private const int _dummyMarker = 0x10101010; + + /// + /// We will emit an indirect call to an unmanaged function pointer from the vtable of the given interface pointer. + /// This approach can take only ~300 instructions on x86 compared with ~900 for Marshal.Release. We are relying on + /// the JIT-compiler to do pinvoke-stub-inlining and calling the pinvoke target directly. + /// + private delegate int IUnknownReleaseDelegate(IntPtr interfacePointer); + private static readonly IUnknownReleaseDelegate _IUnknownRelease = Create_IUnknownRelease(); + + private static IUnknownReleaseDelegate Create_IUnknownRelease() { + DynamicMethod dm = new DynamicMethod("IUnknownRelease", typeof(int), new Type[] { typeof(IntPtr) }, DynamicModule); + + ILGenerator method = dm.GetILGenerator(); + + // return functionPtr(...) + + method.Emit(OpCodes.Ldarg_0); + + // functionPtr = *(IntPtr*)(*(interfacePointer) + VTABLE_OFFSET) + int iunknownReleaseOffset = ((int)IDispatchMethodIndices.IUnknown_Release) * Marshal.SizeOf(typeof(IntPtr)); + method.Emit(OpCodes.Ldarg_0); + method.Emit(OpCodes.Ldind_I); + method.Emit(OpCodes.Ldc_I4, iunknownReleaseOffset); + method.Emit(OpCodes.Add); + method.Emit(OpCodes.Ldind_I); + + SignatureHelper signature = SignatureHelper.GetMethodSigHelper(CallingConvention.Winapi, typeof(int)); + signature.AddArgument(typeof(IntPtr)); + method.Emit(OpCodes.Calli, signature); + + method.Emit(OpCodes.Ret); + + return (IUnknownReleaseDelegate)dm.CreateDelegate(typeof(IUnknownReleaseDelegate)); + } + + internal static readonly IntPtr NullInterfaceId = GetNullInterfaceId(); + + [SecurityCritical] + private static IntPtr GetNullInterfaceId() { + int size = Marshal.SizeOf(Guid.Empty); + IntPtr ptr = Marshal.AllocHGlobal(size); + for (int i = 0; i < size; i++) { + Marshal.WriteByte(ptr, i, 0); + } + return ptr; + } + + /// + /// We will emit an indirect call to an unmanaged function pointer from the vtable of the given IDispatch interface pointer. + /// It is not possible to express this in C#. Using an indirect pinvoke call allows us to do our own marshalling. + /// We can allocate the Variant arguments cheaply on the stack. We are relying on the JIT-compiler to do + /// pinvoke-stub-inlining and calling the pinvoke target directly. + /// The alternative of calling via a managed interface declaration of IDispatch would have a performance + /// penalty of going through a CLR stub that would have to re-push the arguments on the stack, etc. + /// Marshal.GetDelegateForFunctionPointer could be used here, but its too expensive (~2000 instructions on x86). + /// + private delegate int IDispatchInvokeDelegate( + IntPtr dispatchPointer, + int memberDispId, + ComTypes.INVOKEKIND flags, + ref ComTypes.DISPPARAMS dispParams, + out Variant result, + out ExcepInfo excepInfo, + out uint argErr + ); + + private static readonly IDispatchInvokeDelegate _IDispatchInvoke = Create_IDispatchInvoke(true); + private static IDispatchInvokeDelegate _IDispatchInvokeNoResultImpl; + + private static IDispatchInvokeDelegate _IDispatchInvokeNoResult { + get { + if (_IDispatchInvokeNoResultImpl == null) { + lock (_IDispatchInvoke) { + if (_IDispatchInvokeNoResultImpl == null) { + _IDispatchInvokeNoResultImpl = Create_IDispatchInvoke(false); + } + } + } + return _IDispatchInvokeNoResultImpl; + } + } + + private static IDispatchInvokeDelegate Create_IDispatchInvoke(bool returnResult) { + const int dispatchPointerIndex = 0; + const int memberDispIdIndex = 1; + const int flagsIndex = 2; + const int dispParamsIndex = 3; + const int resultIndex = 4; + const int exceptInfoIndex = 5; + const int argErrIndex = 6; + Debug.Assert(argErrIndex + 1 == typeof(IDispatchInvokeDelegate).GetMethod("Invoke").GetParameters().Length); + + Type[] paramTypes = new Type[argErrIndex + 1]; + paramTypes[dispatchPointerIndex] = typeof(IntPtr); + paramTypes[memberDispIdIndex] = typeof(int); + paramTypes[flagsIndex] = typeof(ComTypes.INVOKEKIND); + paramTypes[dispParamsIndex] = typeof(ComTypes.DISPPARAMS).MakeByRefType(); + paramTypes[resultIndex] = typeof(Variant).MakeByRefType(); + paramTypes[exceptInfoIndex] = typeof(ExcepInfo).MakeByRefType(); + paramTypes[argErrIndex] = typeof(uint).MakeByRefType(); + + // Define the dynamic method in our assembly so we skip verification + DynamicMethod dm = new DynamicMethod("IDispatchInvoke", typeof(int), paramTypes, DynamicModule); + ILGenerator method = dm.GetILGenerator(); + + // return functionPtr(...) + + EmitLoadArg(method, dispatchPointerIndex); + EmitLoadArg(method, memberDispIdIndex); + + // burn the address of our empty IID in directly. This is never freed, relocated, etc... + // Note passing this as a Guid directly results in a ~30% perf hit for IDispatch invokes so + // we also pass it directly as an IntPtr instead. + if (IntPtr.Size == 4) { + method.Emit(OpCodes.Ldc_I4, UnsafeMethods.NullInterfaceId.ToInt32()); // riid + } else { + method.Emit(OpCodes.Ldc_I8, UnsafeMethods.NullInterfaceId.ToInt64()); // riid + } + method.Emit(OpCodes.Conv_I); + + method.Emit(OpCodes.Ldc_I4_0); // lcid + EmitLoadArg(method, flagsIndex); + + EmitLoadArg(method, dispParamsIndex); + + if (returnResult) { + EmitLoadArg(method, resultIndex); + } else { + method.Emit(OpCodes.Ldsfld, typeof(IntPtr).GetField("Zero")); + } + EmitLoadArg(method, exceptInfoIndex); + EmitLoadArg(method, argErrIndex); + + // functionPtr = *(IntPtr*)(*(dispatchPointer) + VTABLE_OFFSET) + int idispatchInvokeOffset = ((int)IDispatchMethodIndices.IDispatch_Invoke) * Marshal.SizeOf(typeof(IntPtr)); + EmitLoadArg(method, dispatchPointerIndex); + method.Emit(OpCodes.Ldind_I); + method.Emit(OpCodes.Ldc_I4, idispatchInvokeOffset); + method.Emit(OpCodes.Add); + method.Emit(OpCodes.Ldind_I); + + SignatureHelper signature = SignatureHelper.GetMethodSigHelper(CallingConvention.Winapi, typeof(int)); + Type[] invokeParamTypes = new Type[] { + typeof(IntPtr), // dispatchPointer + typeof(int), // memberDispId + typeof(IntPtr), // riid + typeof(int), // lcid + typeof(ushort), // flags + typeof(IntPtr), // dispParams + typeof(IntPtr), // result + typeof(IntPtr), // excepInfo + typeof(IntPtr), // argErr + }; + signature.AddArguments(invokeParamTypes, null, null); + method.Emit(OpCodes.Calli, signature); + + method.Emit(OpCodes.Ret); + return (IDispatchInvokeDelegate)dm.CreateDelegate(typeof(IDispatchInvokeDelegate)); + } + + #endregion + } + + internal static class NativeMethods { + [System.Runtime.Versioning.ResourceExposure(System.Runtime.Versioning.ResourceScope.None)] + [System.Runtime.Versioning.ResourceConsumption(System.Runtime.Versioning.ResourceScope.Process, System.Runtime.Versioning.ResourceScope.Process)] + [DllImport("oleaut32.dll", PreserveSig = false)] + internal static extern void VariantClear(IntPtr variant); + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeClassDesc.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeClassDesc.cs new file mode 100644 index 00000000000..f6d45165e12 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeClassDesc.cs @@ -0,0 +1,79 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +using System.Security; +using ComTypes = System.Runtime.InteropServices.ComTypes; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal sealed class ComTypeClassDesc : ComTypeDesc { + private LinkedList _itfs; // implemented interfaces + private LinkedList _sourceItfs; // source interfaces supported by this coclass + + [SecurityCritical] + internal ComTypeClassDesc(ComTypes.ITypeInfo typeInfo) : + base(typeInfo) { + ComTypes.TYPEATTR typeAttr = ComRuntimeHelpers.GetTypeAttrForTypeInfo(typeInfo); + Guid = typeAttr.guid; + + for (int i = 0; i < typeAttr.cImplTypes; i++) { + int hRefType; + typeInfo.GetRefTypeOfImplType(i, out hRefType); + ComTypes.ITypeInfo currentTypeInfo; + typeInfo.GetRefTypeInfo(hRefType, out currentTypeInfo); + + ComTypes.IMPLTYPEFLAGS implTypeFlags; + typeInfo.GetImplTypeFlags(i, out implTypeFlags); + + bool isSourceItf = (implTypeFlags & ComTypes.IMPLTYPEFLAGS.IMPLTYPEFLAG_FSOURCE) != 0; + AddInterface(currentTypeInfo, isSourceItf); + } + } + + private void AddInterface(ComTypes.ITypeInfo itfTypeInfo, bool isSourceItf) { + string itfName = ComRuntimeHelpers.GetNameOfType(itfTypeInfo); + + if (isSourceItf) { + if (_sourceItfs == null) { + _sourceItfs = new LinkedList(); + } + _sourceItfs.AddLast(itfName); + } else { + if (_itfs == null) { + _itfs = new LinkedList(); + } + _itfs.AddLast(itfName); + } + } + + internal bool Implements(string itfName, bool isSourceItf) { + if (isSourceItf) + return _sourceItfs.Contains(itfName); + else + return _itfs.Contains(itfName); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeDesc.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeDesc.cs new file mode 100644 index 00000000000..cf73fbb61b5 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeDesc.cs @@ -0,0 +1,227 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections; +using System.Collections.Generic; +using System.Runtime.InteropServices.ComTypes; +using System.Security; +using System.Threading; +using ComTypes = System.Runtime.InteropServices.ComTypes; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal class ComTypeDesc { + private string _typeName; + private string _documentation; + private Guid _guid; + + //Hashtable is threadsafe for multiple readers single writer. + //Enumerating and writing is mutually exclusive so require locking. + private Hashtable _funcs; + private Hashtable _puts; + private Hashtable _putRefs; + private ComMethodDesc _getItem; + private ComMethodDesc _setItem; + + private Dictionary _events; + + private static readonly Dictionary _EmptyEventsDict = new Dictionary(); + + internal ComTypeDesc(ITypeInfo typeInfo) { + if (typeInfo != null) { + ComRuntimeHelpers.GetInfoFromType(typeInfo, out _typeName, out _documentation); + } + } + + [SecurityCritical] + internal static ComTypeDesc FromITypeInfo(ComTypes.ITypeInfo typeInfo, ComTypes.TYPEATTR typeAttr) { + if (typeAttr.typekind == ComTypes.TYPEKIND.TKIND_COCLASS) { + return new ComTypeClassDesc(typeInfo); + } else if (typeAttr.typekind == ComTypes.TYPEKIND.TKIND_ENUM) { + return new ComTypeEnumDesc(typeInfo); + } else if ((typeAttr.typekind == ComTypes.TYPEKIND.TKIND_DISPATCH) || + (typeAttr.typekind == ComTypes.TYPEKIND.TKIND_INTERFACE)) { + + return new ComTypeDesc(typeInfo); + } else { + throw Error.UnsupportedEnumType(); + } + } + + internal static ComTypeDesc CreateEmptyTypeDesc() { + ComTypeDesc typeDesc = new ComTypeDesc(null); + typeDesc._funcs = new Hashtable(); + typeDesc._puts = new Hashtable(); + typeDesc._putRefs = new Hashtable(); + typeDesc._events = _EmptyEventsDict; + + return typeDesc; + } + + internal static Dictionary EmptyEvents { + get { return _EmptyEventsDict; } + } + + internal Hashtable Funcs { + get { return _funcs; } + set { _funcs = value; } + } + + internal Hashtable Puts { + set { _puts = value; } + } + + internal Hashtable PutRefs { + set { _putRefs = value; } + } + + internal Dictionary Events { + get { return _events; } + set { _events = value; } + } + + internal bool TryGetFunc(string name, out ComMethodDesc method) { + name = name.ToUpper(System.Globalization.CultureInfo.InvariantCulture); + if (_funcs.ContainsKey(name)) { + method = _funcs[name] as ComMethodDesc; + return true; + } + method = null; + return false; + } + + internal void AddFunc(string name, ComMethodDesc method) { + name = name.ToUpper(System.Globalization.CultureInfo.InvariantCulture); + lock (_funcs) { + _funcs[name] = method; + } + } + + internal bool TryGetPut(string name, out ComMethodDesc method) { + name = name.ToUpper(System.Globalization.CultureInfo.InvariantCulture); + if (_puts.ContainsKey(name)) { + method = _puts[name] as ComMethodDesc; + return true; + } + method = null; + return false; + } + + internal void AddPut(string name, ComMethodDesc method) { + name = name.ToUpper(System.Globalization.CultureInfo.InvariantCulture); + lock (_puts) { + _puts[name] = method; + } + } + + internal bool TryGetPutRef(string name, out ComMethodDesc method) { + name = name.ToUpper(System.Globalization.CultureInfo.InvariantCulture); + if (_putRefs.ContainsKey(name)) { + method = _putRefs[name] as ComMethodDesc; + return true; + } + method = null; + return false; + } + internal void AddPutRef(string name, ComMethodDesc method) { + name = name.ToUpper(System.Globalization.CultureInfo.InvariantCulture); + lock (_putRefs) { + _putRefs[name] = method; + } + } + + internal bool TryGetEvent(string name, out ComEventDesc @event) { + name = name.ToUpper(System.Globalization.CultureInfo.InvariantCulture); + return _events.TryGetValue(name, out @event); + } + + internal string[] GetMemberNames(bool dataOnly) { + var names = new Dictionary(); + + lock (_funcs) { + foreach (ComMethodDesc func in _funcs.Values) { + if (!dataOnly || func.IsDataMember) { + names.Add(func.Name, null); + } + } + } + + if (!dataOnly) { + lock (_puts) { + foreach (ComMethodDesc func in _puts.Values) { + if (!names.ContainsKey(func.Name)) { + names.Add(func.Name, null); + } + } + } + + lock (_putRefs) { + foreach (ComMethodDesc func in _putRefs.Values) { + if (!names.ContainsKey(func.Name)) { + names.Add(func.Name, null); + } + } + } + + if (_events != null && _events.Count > 0) { + foreach (string name in _events.Keys) { + if (!names.ContainsKey(name)) { + names.Add(name, null); + } + } + } + } + + string[] result = new string[names.Keys.Count]; + names.Keys.CopyTo(result, 0); + return result; + } + + internal string TypeName { + get { return _typeName; } + } + + internal Guid Guid { + get { return _guid; } + set { _guid = value; } + } + + internal ComMethodDesc GetItem { + get { return _getItem; } + } + + internal void EnsureGetItem(ComMethodDesc candidate) { + Interlocked.CompareExchange(ref _getItem, candidate, null); + } + + internal ComMethodDesc SetItem { + get { return _setItem; } + } + + internal void EnsureSetItem(ComMethodDesc candidate) { + Interlocked.CompareExchange(ref _setItem, candidate, null); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeEnumDesc.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeEnumDesc.cs new file mode 100644 index 00000000000..ff25fc20a6f --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeEnumDesc.cs @@ -0,0 +1,50 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.InteropServices; +#if CODEPLEX_40 +using System.Dynamic; +#else +using Microsoft.Scripting; +#endif +using System.Globalization; +using ComTypes = System.Runtime.InteropServices.ComTypes; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal sealed class ComTypeEnumDesc : ComTypeDesc { + public override string ToString() { + return String.Format(CultureInfo.CurrentCulture, "", TypeName); + } + + internal ComTypeEnumDesc(ComTypes.ITypeInfo typeInfo) : + base(typeInfo) { + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeLibDesc.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeLibDesc.cs new file mode 100644 index 00000000000..07e7af6d8d3 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ComTypeLibDesc.cs @@ -0,0 +1,109 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +using System.Globalization; +using System.Security; +using ComTypes = System.Runtime.InteropServices.ComTypes; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal sealed class ComTypeLibDesc { + + // typically typelibs contain very small number of coclasses + // so we will just use the linked list as it performs better + // on small number of entities + LinkedList _classes; + Dictionary _enums; + string _typeLibName; + + private static readonly Dictionary _CachedTypeLibDesc = new Dictionary(); + + private ComTypeLibDesc() { + _enums = new Dictionary(); + _classes = new LinkedList(); + } + + public override string ToString() { + return String.Format(CultureInfo.CurrentCulture, "", _typeLibName); + } + + [SecurityCritical] + internal static ComTypeLibDesc GetFromTypeLib(ComTypes.ITypeLib typeLib) { + // check whether we have already loaded this type library + ComTypes.TYPELIBATTR typeLibAttr = ComRuntimeHelpers.GetTypeAttrForTypeLib(typeLib); + ComTypeLibDesc typeLibDesc; + lock (_CachedTypeLibDesc) { + if (_CachedTypeLibDesc.TryGetValue(typeLibAttr.guid, out typeLibDesc)) { + return typeLibDesc; + } + } + + typeLibDesc = new ComTypeLibDesc(); + + typeLibDesc._typeLibName = ComRuntimeHelpers.GetNameOfLib(typeLib); + + int countTypes = typeLib.GetTypeInfoCount(); + for (int i = 0; i < countTypes; i++) { + ComTypes.TYPEKIND typeKind; + typeLib.GetTypeInfoType(i, out typeKind); + + ComTypes.ITypeInfo typeInfo; + if (typeKind == ComTypes.TYPEKIND.TKIND_COCLASS) { + typeLib.GetTypeInfo(i, out typeInfo); + ComTypeClassDesc classDesc = new ComTypeClassDesc(typeInfo); + typeLibDesc._classes.AddLast(classDesc); + } else if (typeKind == ComTypes.TYPEKIND.TKIND_ENUM) { + typeLib.GetTypeInfo(i, out typeInfo); + ComTypeEnumDesc enumDesc = new ComTypeEnumDesc(typeInfo); + typeLibDesc._enums.Add(enumDesc.TypeName, enumDesc); + } + } + + // cache the typelib using the guid as the dictionary key + lock (_CachedTypeLibDesc) { + //check if we are late and somebody already added the key. + ComTypeLibDesc curLibDesc; + if (_CachedTypeLibDesc.TryGetValue(typeLibAttr.guid, out curLibDesc)) { + return curLibDesc; + } + + _CachedTypeLibDesc.Add(typeLibAttr.guid, typeLibDesc); + } + + return typeLibDesc; + } + + internal ComTypeClassDesc GetCoClassForInterface(string itfName) { + foreach (ComTypeClassDesc coclass in _classes) { + if (coclass.Implements(itfName, false)) { + return coclass; + } + } + + return null; + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ContractUtils.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ContractUtils.cs new file mode 100644 index 00000000000..dd8c2ab9ea5 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ContractUtils.cs @@ -0,0 +1,57 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal static class ContractUtils { + internal static void Requires(bool precondition, string paramName) { + Assert.NotEmpty(paramName); + + if (!precondition) { + throw new ArgumentException(Strings.InvalidArgumentValue, paramName); + } + } + + internal static void Requires(bool precondition, string paramName, string message) { + Assert.NotEmpty(paramName); + + if (!precondition) { + throw new ArgumentException(message, paramName); + } + } + + internal static void RequiresNotNull(object value, string paramName) { + Assert.NotEmpty(paramName); + + if (value == null) { + throw new ArgumentNullException(paramName); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ConversionArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ConversionArgBuilder.cs new file mode 100644 index 00000000000..84494941a02 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ConversionArgBuilder.cs @@ -0,0 +1,63 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal class ConversionArgBuilder : ArgBuilder { + private SimpleArgBuilder _innerBuilder; + private Type _parameterType; + + internal ConversionArgBuilder(Type parameterType, SimpleArgBuilder innerBuilder) { + _parameterType = parameterType; + _innerBuilder = innerBuilder; + } + + internal override Expression Marshal(Expression parameter) { + return _innerBuilder.Marshal(Helpers.Convert(parameter, _parameterType)); + } + + internal override Expression MarshalToRef(Expression parameter) { + //we are not supporting conversion InOut + throw Assert.Unreachable; + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ConvertArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ConvertArgBuilder.cs new file mode 100644 index 00000000000..a317be17d4a --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ConvertArgBuilder.cs @@ -0,0 +1,50 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal class ConvertArgBuilder : SimpleArgBuilder { + private readonly Type _marshalType; + + internal ConvertArgBuilder(Type parameterType, Type marshalType) + : base(parameterType) { + _marshalType = marshalType; + } + + internal override Expression Marshal(Expression parameter) { + parameter = base.Marshal(parameter); + return Expression.Convert(parameter, _marshalType); + } + + internal override Expression UnmarshalFromRef(Expression newValue) { + return base.UnmarshalFromRef(Expression.Convert(newValue, ParameterType)); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ConvertibleArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ConvertibleArgBuilder.cs new file mode 100644 index 00000000000..92551049f0e --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ConvertibleArgBuilder.cs @@ -0,0 +1,50 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +using System.Globalization; +#if CODEPLEX_40 +using System.Linq.Expressions; +using System.Dynamic.Utils; +#else +using Microsoft.Linq.Expressions; +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal class ConvertibleArgBuilder : ArgBuilder { + internal ConvertibleArgBuilder() { + } + + internal override Expression Marshal(Expression parameter) { + return Helpers.Convert(parameter, typeof(IConvertible)); + } + + internal override Expression MarshalToRef(Expression parameter) { + //we are not supporting convertible InOut + throw Assert.Unreachable; + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/CurrencyArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/CurrencyArgBuilder.cs new file mode 100644 index 00000000000..90b772f49fe --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/CurrencyArgBuilder.cs @@ -0,0 +1,71 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + + +#if !SILVERLIGHT // ComObject + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.InteropServices; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal sealed class CurrencyArgBuilder : SimpleArgBuilder { + internal CurrencyArgBuilder(Type parameterType) + : base(parameterType) { + Debug.Assert(parameterType == typeof(CurrencyWrapper)); + } + + internal override Expression Marshal(Expression parameter) { + // parameter.WrappedObject + return Expression.Property( + Helpers.Convert(base.Marshal(parameter), typeof(CurrencyWrapper)), + "WrappedObject" + ); + } + + internal override Expression MarshalToRef(Expression parameter) { + // Decimal.ToOACurrency(parameter.WrappedObject) + return Expression.Call( + typeof(Decimal).GetMethod("ToOACurrency"), + Marshal(parameter) + ); + } + + internal override Expression UnmarshalFromRef(Expression value) { + // Decimal.FromOACurrency(value) + return base.UnmarshalFromRef( + Expression.New( + typeof(CurrencyWrapper).GetConstructor(new Type[] { typeof(Decimal) }), + Expression.Call( + typeof(Decimal).GetMethod("FromOACurrency"), + value + ) + ) + ); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/DateTimeArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/DateTimeArgBuilder.cs new file mode 100644 index 00000000000..ada271f7a5d --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/DateTimeArgBuilder.cs @@ -0,0 +1,71 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Runtime.InteropServices; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal sealed class DateTimeArgBuilder : SimpleArgBuilder { + internal DateTimeArgBuilder(Type parameterType) + : base(parameterType) { + Debug.Assert(parameterType == typeof(DateTime)); + } + + internal override Expression MarshalToRef(Expression parameter) { + // parameter.ToOADate() + return Expression.Call( + Marshal(parameter), + typeof(DateTime).GetMethod("ToOADate") + ); + } + + internal override Expression UnmarshalFromRef(Expression value) { + // DateTime.FromOADate(value) + return base.UnmarshalFromRef( + Expression.Call( + typeof(DateTime).GetMethod("FromOADate"), + value + ) + ); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/DispCallable.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/DispCallable.cs new file mode 100644 index 00000000000..86b59b5ea55 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/DispCallable.cs @@ -0,0 +1,85 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +#if CODEPLEX_40 +using System.Linq.Expressions; +using System.Dynamic; +#else +using Microsoft.Linq.Expressions; +using Microsoft.Scripting; +#endif +using System.Globalization; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// This represents a bound dispmember on a IDispatch object. + /// + internal sealed class DispCallable : IDynamicMetaObjectProvider { + + private readonly IDispatchComObject _dispatch; + private readonly string _memberName; + private readonly int _dispId; + + internal DispCallable(IDispatchComObject dispatch, string memberName, int dispId) { + _dispatch = dispatch; + _memberName = memberName; + _dispId = dispId; + } + + public override string ToString() { + return String.Format(CultureInfo.CurrentCulture, "", _memberName); + } + + public IDispatchComObject DispatchComObject { + get { return _dispatch; } + } + + public IDispatch DispatchObject { + get { return _dispatch.DispatchObject; } + } + + public string MemberName { + get { return _memberName; } + } + + public int DispId { + get { return _dispId; } + } + + public DynamicMetaObject GetMetaObject(Expression parameter) { + return new DispCallableMetaObject(parameter, this); + } + + public override bool Equals(object obj) { + var other = obj as DispCallable; + return other != null && other._dispatch == _dispatch && other._dispId == _dispId; + } + + public override int GetHashCode() { + return _dispatch.GetHashCode() ^ _dispId; + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/DispCallableMetaObject.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/DispCallableMetaObject.cs new file mode 100644 index 00000000000..89ce41b3461 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/DispCallableMetaObject.cs @@ -0,0 +1,148 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Security; +using System.Security.Permissions; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal class DispCallableMetaObject : DynamicMetaObject { + private readonly DispCallable _callable; + + internal DispCallableMetaObject(Expression expression, DispCallable callable) + : base(expression, BindingRestrictions.Empty, callable) { + _callable = callable; + } + + public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) { + return BindGetOrInvoke(indexes, binder.CallInfo) ?? + base.BindGetIndex(binder, indexes); + } + + public override DynamicMetaObject BindInvoke(InvokeBinder binder, DynamicMetaObject[] args) { + return BindGetOrInvoke(args, binder.CallInfo) ?? + base.BindInvoke(binder, args); + } + +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + private DynamicMetaObject BindGetOrInvoke(DynamicMetaObject[] args, CallInfo callInfo) { + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + ComMethodDesc method; + var target = _callable.DispatchComObject; + var name = _callable.MemberName; + + if (target.TryGetMemberMethod(name, out method) || + target.TryGetMemberMethodExplicit(name, out method)) { + + bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref args); + return BindComInvoke(method, args, callInfo, isByRef); + } + return null; + } + +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + public override DynamicMetaObject BindSetIndex(SetIndexBinder binder, DynamicMetaObject[] indexes, DynamicMetaObject value) { + // + // Demand Full Trust to proceed with the binding. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + ComMethodDesc method; + var target = _callable.DispatchComObject; + var name = _callable.MemberName; + + bool holdsNull = value.Value == null && value.HasValue; + if (target.TryGetPropertySetter(name, out method, value.LimitType, holdsNull) || + target.TryGetPropertySetterExplicit(name, out method, value.LimitType, holdsNull)) { + + bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref indexes); + isByRef = isByRef.AddLast(false); + var result = BindComInvoke(method, indexes.AddLast(value), binder.CallInfo, isByRef); + + // Make sure to return the value; some languages need it. + return new DynamicMetaObject( + Expression.Block(result.Expression, Expression.Convert(value.Expression, typeof(object))), + result.Restrictions + ); + } + + return base.BindSetIndex(binder, indexes, value); + } + + [SecurityCritical] + private DynamicMetaObject BindComInvoke(ComMethodDesc method, DynamicMetaObject[] indexes, CallInfo callInfo, bool[] isByRef) { + var callable = Expression; + var dispCall = Helpers.Convert(callable, typeof(DispCallable)); + + return new ComInvokeBinder( + callInfo, + indexes, + isByRef, + DispCallableRestrictions(), + Expression.Constant(method), + Expression.Property( + dispCall, + typeof(DispCallable).GetProperty("DispatchObject") + ), + method + ).Invoke(); + } + + [SecurityCritical] + private BindingRestrictions DispCallableRestrictions() { + var callable = Expression; + + var callableTypeRestrictions = BindingRestrictions.GetTypeRestriction(callable, typeof(DispCallable)); + var dispCall = Helpers.Convert(callable, typeof(DispCallable)); + var dispatch = Expression.Property(dispCall, typeof(DispCallable).GetProperty("DispatchComObject")); + var dispId = Expression.Property(dispCall, typeof(DispCallable).GetProperty("DispId")); + + var dispatchRestriction = IDispatchMetaObject.IDispatchRestriction(dispatch, _callable.DispatchComObject.ComTypeDesc); + var memberRestriction = BindingRestrictions.GetExpressionRestriction( + Expression.Equal(dispId, Expression.Constant(_callable.DispId)) + ); + + return callableTypeRestrictions.Merge(dispatchRestriction).Merge(memberRestriction); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/DispatchArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/DispatchArgBuilder.cs new file mode 100644 index 00000000000..da4f18f487b --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/DispatchArgBuilder.cs @@ -0,0 +1,101 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.InteropServices; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal class DispatchArgBuilder : SimpleArgBuilder { + private readonly bool _isWrapper; + + internal DispatchArgBuilder(Type parameterType) + : base(parameterType) { + + _isWrapper = parameterType == typeof(DispatchWrapper); + } + + internal override Expression Marshal(Expression parameter) { + parameter = base.Marshal(parameter); + + // parameter.WrappedObject + if (_isWrapper) { + parameter = Expression.Property( + Helpers.Convert(parameter, typeof(DispatchWrapper)), + typeof(DispatchWrapper).GetProperty("WrappedObject") + ); + }; + + return Helpers.Convert(parameter, typeof(object)); + } + + internal override Expression MarshalToRef(Expression parameter) { + parameter = Marshal(parameter); + + // parameter == null ? IntPtr.Zero : Marshal.GetIDispatchForObject(parameter); + return Expression.Condition( + Expression.Equal(parameter, Expression.Constant(null)), + Expression.Constant(IntPtr.Zero), + Expression.Call( + typeof(Marshal).GetMethod("GetIDispatchForObject"), + parameter + ) + ); + } + + internal override Expression UnmarshalFromRef(Expression value) { + // value == IntPtr.Zero ? null : Marshal.GetObjectForIUnknown(value); + Expression unmarshal = Expression.Condition( + Expression.Equal(value, Expression.Constant(IntPtr.Zero)), + Expression.Constant(null), + Expression.Call( + typeof(Marshal).GetMethod("GetObjectForIUnknown"), + value + ) + ); + + if (_isWrapper) { + unmarshal = Expression.New( + typeof(DispatchWrapper).GetConstructor(new Type[] { typeof(object) }), + unmarshal + ); + } + + return base.UnmarshalFromRef(unmarshal); + + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ErrorArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ErrorArgBuilder.cs new file mode 100644 index 00000000000..04618f99b13 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ErrorArgBuilder.cs @@ -0,0 +1,66 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.InteropServices; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal class ErrorArgBuilder : SimpleArgBuilder { + internal ErrorArgBuilder(Type parameterType) + : base(parameterType) { + + Debug.Assert(parameterType == typeof(ErrorWrapper)); + } + + internal override Expression Marshal(Expression parameter) { + // parameter.ErrorCode + return Expression.Property( + Helpers.Convert(base.Marshal(parameter), typeof(ErrorWrapper)), + "ErrorCode" + ); + } + + internal override Expression UnmarshalFromRef(Expression value) { + // new ErrorWrapper(value) + return base.UnmarshalFromRef( + Expression.New( + typeof(ErrorWrapper).GetConstructor(new Type[] { typeof(int) }), + value + ) + ); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/Errors.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Errors.cs new file mode 100644 index 00000000000..29029fda99c --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Errors.cs @@ -0,0 +1,348 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + +#if MICROSOFT_DYNAMIC + internal static partial class Strings { + private static string FormatString(string format, params object[] args) { + return string.Format(System.Globalization.CultureInfo.CurrentCulture, format, args); + } + } + + #region Generated Com Exception Factory + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_expr_factory_com from: generate_exception_factory.py + + /// + /// Strongly-typed and parameterized string factory. + /// + + internal static partial class Strings { + /// + /// A string like "Invalid argument value" + /// + internal static string InvalidArgumentValue { + get { + return "Invalid argument value"; + } + } + + /// + /// A string like "COM object is expected." + /// + internal static string ComObjectExpected { + get { + return "COM object is expected."; + } + } + + /// + /// A string like "Cannot perform call." + /// + internal static string CannotCall { + get { + return "Cannot perform call."; + } + } + + /// + /// A string like "COM object does not support events." + /// + internal static string COMObjectDoesNotSupportEvents { + get { + return "COM object does not support events."; + } + } + + /// + /// A string like "COM object does not support specified source interface." + /// + internal static string COMObjectDoesNotSupportSourceInterface { + get { + return "COM object does not support specified source interface."; + } + } + + /// + /// A string like "Marshal.SetComObjectData failed." + /// + internal static string SetComObjectDataFailed { + get { + return "Marshal.SetComObjectData failed."; + } + } + + /// + /// A string like "This method exists only to keep the compiler happy." + /// + internal static string MethodShouldNotBeCalled { + get { + return "This method exists only to keep the compiler happy."; + } + } + + /// + /// A string like "Unexpected VarEnum {0}." + /// + internal static string UnexpectedVarEnum(object p0) { + return FormatString("Unexpected VarEnum {0}.", p0); + } + + /// + /// A string like "Error while invoking {0}." + /// + internal static string DispBadParamCount(object p0) { + return FormatString("Error while invoking {0}.", p0); + } + + /// + /// A string like "Error while invoking {0}." + /// + internal static string DispMemberNotFound(object p0) { + return FormatString("Error while invoking {0}.", p0); + } + + /// + /// A string like "Error while invoking {0}. Named arguments are not supported." + /// + internal static string DispNoNamedArgs(object p0) { + return FormatString("Error while invoking {0}. Named arguments are not supported.", p0); + } + + /// + /// A string like "Error while invoking {0}." + /// + internal static string DispOverflow(object p0) { + return FormatString("Error while invoking {0}.", p0); + } + + /// + /// A string like "Could not convert argument {0} for call to {1}." + /// + internal static string DispTypeMismatch(object p0, object p1) { + return FormatString("Could not convert argument {0} for call to {1}.", p0, p1); + } + + /// + /// A string like "Error while invoking {0}. A required parameter was omitted." + /// + internal static string DispParamNotOptional(object p0) { + return FormatString("Error while invoking {0}. A required parameter was omitted.", p0); + } + + /// + /// A string like "ResolveComReference.CannotRetrieveTypeInformation." + /// + internal static string CannotRetrieveTypeInformation { + get { + return "ResolveComReference.CannotRetrieveTypeInformation."; + } + } + + /// + /// A string like "IDispatch::GetIDsOfNames behaved unexpectedly for {0}." + /// + internal static string GetIDsOfNamesInvalid(object p0) { + return FormatString("IDispatch::GetIDsOfNames behaved unexpectedly for {0}.", p0); + } + + /// + /// A string like "Attempting to wrap an unsupported enum type." + /// + internal static string UnsupportedEnumType { + get { + return "Attempting to wrap an unsupported enum type."; + } + } + + /// + /// A string like "Attempting to pass an event handler of an unsupported type." + /// + internal static string UnsupportedHandlerType { + get { + return "Attempting to pass an event handler of an unsupported type."; + } + } + + /// + /// A string like "Could not get dispatch ID for {0} (error: {1})." + /// + internal static string CouldNotGetDispId(object p0, object p1) { + return FormatString("Could not get dispatch ID for {0} (error: {1}).", p0, p1); + } + + /// + /// A string like "There are valid conversions from {0} to {1}." + /// + internal static string AmbiguousConversion(object p0, object p1) { + return FormatString("There are valid conversions from {0} to {1}.", p0, p1); + } + + /// + /// A string like "Variant.GetAccessor cannot handle {0}." + /// + internal static string VariantGetAccessorNYI(object p0) { + return FormatString("Variant.GetAccessor cannot handle {0}.", p0); + } + + } + /// + /// Strongly-typed and parameterized exception factory. + /// + + internal static partial class Error { + /// + /// ArgumentException with message like "COM object does not support events." + /// + internal static Exception COMObjectDoesNotSupportEvents() { + return new ArgumentException(Strings.COMObjectDoesNotSupportEvents); + } + + /// + /// ArgumentException with message like "COM object does not support specified source interface." + /// + internal static Exception COMObjectDoesNotSupportSourceInterface() { + return new ArgumentException(Strings.COMObjectDoesNotSupportSourceInterface); + } + + /// + /// InvalidOperationException with message like "Marshal.SetComObjectData failed." + /// + internal static Exception SetComObjectDataFailed() { + return new InvalidOperationException(Strings.SetComObjectDataFailed); + } + + /// + /// InvalidOperationException with message like "This method exists only to keep the compiler happy." + /// + internal static Exception MethodShouldNotBeCalled() { + return new InvalidOperationException(Strings.MethodShouldNotBeCalled); + } + + /// + /// InvalidOperationException with message like "Unexpected VarEnum {0}." + /// + internal static Exception UnexpectedVarEnum(object p0) { + return new InvalidOperationException(Strings.UnexpectedVarEnum(p0)); + } + + /// + /// System.Reflection.TargetParameterCountException with message like "Error while invoking {0}." + /// + internal static Exception DispBadParamCount(object p0) { + return new System.Reflection.TargetParameterCountException(Strings.DispBadParamCount(p0)); + } + + /// + /// MissingMemberException with message like "Error while invoking {0}." + /// + internal static Exception DispMemberNotFound(object p0) { + return new MissingMemberException(Strings.DispMemberNotFound(p0)); + } + + /// + /// ArgumentException with message like "Error while invoking {0}. Named arguments are not supported." + /// + internal static Exception DispNoNamedArgs(object p0) { + return new ArgumentException(Strings.DispNoNamedArgs(p0)); + } + + /// + /// OverflowException with message like "Error while invoking {0}." + /// + internal static Exception DispOverflow(object p0) { + return new OverflowException(Strings.DispOverflow(p0)); + } + + /// + /// ArgumentException with message like "Could not convert argument {0} for call to {1}." + /// + internal static Exception DispTypeMismatch(object p0, object p1) { + return new ArgumentException(Strings.DispTypeMismatch(p0, p1)); + } + + /// + /// ArgumentException with message like "Error while invoking {0}. A required parameter was omitted." + /// + internal static Exception DispParamNotOptional(object p0) { + return new ArgumentException(Strings.DispParamNotOptional(p0)); + } + + /// + /// InvalidOperationException with message like "ResolveComReference.CannotRetrieveTypeInformation." + /// + internal static Exception CannotRetrieveTypeInformation() { + return new InvalidOperationException(Strings.CannotRetrieveTypeInformation); + } + + /// + /// ArgumentException with message like "IDispatch::GetIDsOfNames behaved unexpectedly for {0}." + /// + internal static Exception GetIDsOfNamesInvalid(object p0) { + return new ArgumentException(Strings.GetIDsOfNamesInvalid(p0)); + } + + /// + /// InvalidOperationException with message like "Attempting to wrap an unsupported enum type." + /// + internal static Exception UnsupportedEnumType() { + return new InvalidOperationException(Strings.UnsupportedEnumType); + } + + /// + /// InvalidOperationException with message like "Attempting to pass an event handler of an unsupported type." + /// + internal static Exception UnsupportedHandlerType() { + return new InvalidOperationException(Strings.UnsupportedHandlerType); + } + + /// + /// MissingMemberException with message like "Could not get dispatch ID for {0} (error: {1})." + /// + internal static Exception CouldNotGetDispId(object p0, object p1) { + return new MissingMemberException(Strings.CouldNotGetDispId(p0, p1)); + } + + /// + /// System.Reflection.AmbiguousMatchException with message like "There are valid conversions from {0} to {1}." + /// + internal static Exception AmbiguousConversion(object p0, object p1) { + return new System.Reflection.AmbiguousMatchException(Strings.AmbiguousConversion(p0, p1)); + } + + /// + /// NotImplementedException with message like "Variant.GetAccessor cannot handle {0}." + /// + internal static Exception VariantGetAccessorNYI(object p0) { + return new NotImplementedException(Strings.VariantGetAccessorNYI(p0)); + } + + } + + // *** END GENERATED CODE *** + + #endregion + +#endif +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/ExcepInfo.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ExcepInfo.cs new file mode 100644 index 00000000000..e72665d2e3f --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/ExcepInfo.cs @@ -0,0 +1,119 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Diagnostics; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; +using ComTypes = System.Runtime.InteropServices.ComTypes; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// This is similar to ComTypes.EXCEPINFO, but lets us do our own custom marshaling + /// + [StructLayout(LayoutKind.Sequential)] + internal struct ExcepInfo { + private short wCode; + private short wReserved; + private IntPtr bstrSource; + private IntPtr bstrDescription; + private IntPtr bstrHelpFile; + private int dwHelpContext; + private IntPtr pvReserved; + private IntPtr pfnDeferredFillIn; + private int scode; + +#if DEBUG + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2207:InitializeValueTypeStaticFieldsInline")] + static ExcepInfo() { + Debug.Assert(Marshal.SizeOf(typeof(ExcepInfo)) == Marshal.SizeOf(typeof(ComTypes.EXCEPINFO))); + } +#endif + + [SecurityCritical] + private static string ConvertAndFreeBstr(ref IntPtr bstr) { + if (bstr == IntPtr.Zero) { + return null; + } + + string result = Marshal.PtrToStringBSTR(bstr); + Marshal.FreeBSTR(bstr); + bstr = IntPtr.Zero; + return result; + } + + internal void Dummy() { + wCode = 0; + wReserved = 0; wReserved++; + bstrSource = IntPtr.Zero; + bstrDescription = IntPtr.Zero; + bstrHelpFile = IntPtr.Zero; + dwHelpContext = 0; + pfnDeferredFillIn = IntPtr.Zero; + pvReserved = IntPtr.Zero; + scode = 0; + + throw Error.MethodShouldNotBeCalled(); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")] + [SecurityCritical] + internal Exception GetException() { + Debug.Assert(pfnDeferredFillIn == IntPtr.Zero); +#if DEBUG + System.Diagnostics.Debug.Assert(wReserved != -1); + wReserved = -1; // to ensure that the method gets called only once +#endif + + int errorCode = (scode != 0) ? scode : wCode; + Exception exception = Marshal.GetExceptionForHR(errorCode); + + string message = ConvertAndFreeBstr(ref bstrDescription); + if (message != null) { + // If we have a custom message, create a new Exception object with the message set correctly. + // We need to create a new object because "exception.Message" is a read-only property. + if (exception is COMException) { + exception = new COMException(message, errorCode); + } else { + Type exceptionType = exception.GetType(); + ConstructorInfo ctor = exceptionType.GetConstructor(new Type[] { typeof(string) }); + if (ctor != null) { + exception = (Exception)ctor.Invoke(new object[] { message }); + } + } + } + + exception.Source = ConvertAndFreeBstr(ref bstrSource); + + string helpLink = ConvertAndFreeBstr(ref bstrHelpFile); + if (helpLink != null && dwHelpContext != 0) { + helpLink += "#" + dwHelpContext; + } + exception.HelpLink = helpLink; + + return exception; + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/Helpers.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Helpers.cs new file mode 100644 index 00000000000..65f5d49bbf6 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Helpers.cs @@ -0,0 +1,41 @@ + +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + // Miscellaneous helpers that don't belong anywhere else + internal static class Helpers { + + internal static Expression Convert(Expression expression, Type type) { + if (expression.Type == type) { + return expression; + } + return Expression.Convert(expression, type); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/IDispatchComObject.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/IDispatchComObject.cs new file mode 100644 index 00000000000..0b18e39c2b5 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/IDispatchComObject.cs @@ -0,0 +1,643 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; +using System.Security.Permissions; +using ComTypes = System.Runtime.InteropServices.ComTypes; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// An object that implements IDispatch + /// + /// This currently has the following issues: + /// 1. If we prefer ComObjectWithTypeInfo over IDispatchComObject, then we will often not + /// IDispatchComObject since implementations of IDispatch often rely on a registered type library. + /// If we prefer IDispatchComObject over ComObjectWithTypeInfo, users get a non-ideal experience. + /// 2. IDispatch cannot distinguish between properties and methods with 0 arguments (and non-0 + /// default arguments?). So obj.foo() is ambiguous as it could mean invoking method foo, + /// or it could mean invoking the function pointer returned by property foo. + /// We are attempting to find whether we need to call a method or a property by examining + /// the ITypeInfo associated with the IDispatch. ITypeInfo tell's use what parameters the method + /// expects, is it a method or a property, what is the default property of the object, how to + /// create an enumerator for collections etc. + /// 3. IronPython processes the signature and converts ref arguments into return values. + /// However, since the signature of a DispMethod is not available beforehand, this conversion + /// is not possible. There could be other signature conversions that may be affected. How does + /// VB6 deal with ref arguments and IDispatch? + /// + /// We also support events for IDispatch objects: + /// Background: + /// COM objects support events through a mechanism known as Connect Points. + /// Connection Points are separate objects created off the actual COM + /// object (this is to prevent circular references between event sink + /// and event source). When clients want to sink events generated by + /// COM object they would implement callback interfaces (aka source + /// interfaces) and hand it over (advise) to the Connection Point. + /// + /// Implementation details: + /// When IDispatchComObject.TryGetMember request is received we first check + /// whether the requested member is a property or a method. If this check + /// fails we will try to determine whether an event is requested. To do + /// so we will do the following set of steps: + /// 1. Verify the COM object implements IConnectionPointContainer + /// 2. Attempt to find COM object's coclass's description + /// a. Query the object for IProvideClassInfo interface. Go to 3, if found + /// b. From object's IDispatch retrieve primary interface description + /// c. Scan coclasses declared in object's type library. + /// d. Find coclass implementing this particular primary interface + /// 3. Scan coclass for all its source interfaces. + /// 4. Check whether to any of the methods on the source interfaces matches + /// the request name + /// + /// Once we determine that TryGetMember requests an event we will return + /// an instance of BoundDispEvent class. This class has InPlaceAdd and + /// InPlaceSubtract operators defined. Calling InPlaceAdd operator will: + /// 1. An instance of ComEventSinksContainer class is created (unless + /// RCW already had one). This instance is hanged off the RCW in attempt + /// to bind the lifetime of event sinks to the lifetime of the RCW itself, + /// meaning event sink will be collected once the RCW is collected (this + /// is the same way event sinks lifetime is controlled by PIAs). + /// Notice: ComEventSinksContainer contains a Finalizer which will go and + /// unadvise all event sinks. + /// Notice: ComEventSinksContainer is a list of ComEventSink objects. + /// 2. Unless we have already created a ComEventSink for the required + /// source interface, we will create and advise a new ComEventSink. Each + /// ComEventSink implements a single source interface that COM object + /// supports. + /// 3. ComEventSink contains a map between method DISPIDs to the + /// multicast delegate that will be invoked when the event is raised. + /// 4. ComEventSink implements IReflect interface which is exposed as + /// custom IDispatch to COM consumers. This allows us to intercept calls + /// to IDispatch.Invoke and apply custom logic - in particular we will + /// just find and invoke the multicast delegate corresponding to the invoked + /// dispid. + /// + + internal sealed class IDispatchComObject : ComObject, IDynamicMetaObjectProvider { + + private readonly IDispatch _dispatchObject; + private ComTypeDesc _comTypeDesc; + private static readonly Dictionary _CacheComTypeDesc = new Dictionary(); + + internal IDispatchComObject(IDispatch rcw) + : base(rcw) { + _dispatchObject = rcw; + } + + public override string ToString() { + ComTypeDesc ctd = _comTypeDesc; + string typeName = null; + + if (ctd != null) { + typeName = ctd.TypeName; + } + + if (String.IsNullOrEmpty(typeName)) { + typeName = "IDispatch"; + } + + return String.Format(CultureInfo.CurrentCulture, "{0} ({1})", RuntimeCallableWrapper.ToString(), typeName); + } + + public ComTypeDesc ComTypeDesc { + get { + EnsureScanDefinedMethods(); + return _comTypeDesc; + } + } + + public IDispatch DispatchObject { + get { + return _dispatchObject; + } + } + + private static int GetIDsOfNames(IDispatch dispatch, string name, out int dispId) { + int[] dispIds = new int[1]; + Guid emtpyRiid = Guid.Empty; + int hresult = dispatch.TryGetIDsOfNames( + ref emtpyRiid, + new string[] { name }, + 1, + 0, + dispIds); + + dispId = dispIds[0]; + return hresult; + } + + static int Invoke(IDispatch dispatch, int memberDispId, out object result) { + Guid emtpyRiid = Guid.Empty; + ComTypes.DISPPARAMS dispParams = new ComTypes.DISPPARAMS(); + ComTypes.EXCEPINFO excepInfo = new ComTypes.EXCEPINFO(); + uint argErr; + int hresult = dispatch.TryInvoke( + memberDispId, + ref emtpyRiid, + 0, + ComTypes.INVOKEKIND.INVOKE_PROPERTYGET, + ref dispParams, + out result, + out excepInfo, + out argErr); + + return hresult; + } + + internal bool TryGetGetItem(out ComMethodDesc value) { + ComMethodDesc methodDesc = _comTypeDesc.GetItem; + if (methodDesc != null) { + value = methodDesc; + return true; + } + + return SlowTryGetGetItem(out value); + } + + private bool SlowTryGetGetItem(out ComMethodDesc value) { + EnsureScanDefinedMethods(); + + ComMethodDesc methodDesc = _comTypeDesc.GetItem; + + // Without type information, we really don't know whether or not we have a property getter. + if (methodDesc == null) { + string name = "[PROPERTYGET, DISPID(0)]"; + + _comTypeDesc.EnsureGetItem(new ComMethodDesc(name, ComDispIds.DISPID_VALUE, ComTypes.INVOKEKIND.INVOKE_PROPERTYGET)); + methodDesc = _comTypeDesc.GetItem; + } + + value = methodDesc; + return true; + } + + internal bool TryGetSetItem(out ComMethodDesc value) { + ComMethodDesc methodDesc = _comTypeDesc.SetItem; + if (methodDesc != null) { + value = methodDesc; + return true; + } + + return SlowTryGetSetItem(out value); + } + + private bool SlowTryGetSetItem(out ComMethodDesc value) { + EnsureScanDefinedMethods(); + + ComMethodDesc methodDesc = _comTypeDesc.SetItem; + + // Without type information, we really don't know whether or not we have a property setter. + if (methodDesc == null) { + string name = "[PROPERTYPUT, DISPID(0)]"; + + _comTypeDesc.EnsureSetItem(new ComMethodDesc(name, ComDispIds.DISPID_VALUE, ComTypes.INVOKEKIND.INVOKE_PROPERTYPUT)); + methodDesc = _comTypeDesc.SetItem; + } + + value = methodDesc; + return true; + } + + internal bool TryGetMemberMethod(string name, out ComMethodDesc method) { + EnsureScanDefinedMethods(); + return _comTypeDesc.TryGetFunc(name, out method); + } + + internal bool TryGetMemberEvent(string name, out ComEventDesc @event) { + EnsureScanDefinedEvents(); + return _comTypeDesc.TryGetEvent(name, out @event); + } + + internal bool TryGetMemberMethodExplicit(string name, out ComMethodDesc method) { + EnsureScanDefinedMethods(); + + int dispId; + int hresult = GetIDsOfNames(_dispatchObject, name, out dispId); + + if (hresult == ComHresults.S_OK) { + ComMethodDesc cmd = new ComMethodDesc(name, dispId, ComTypes.INVOKEKIND.INVOKE_FUNC); + _comTypeDesc.AddFunc(name, cmd); + method = cmd; + return true; + } else if (hresult == ComHresults.DISP_E_UNKNOWNNAME) { + method = null; + return false; + } else { + throw Error.CouldNotGetDispId(name, string.Format(CultureInfo.InvariantCulture, "0x{1:X})", hresult)); + } + } + + internal bool TryGetPropertySetterExplicit(string name, out ComMethodDesc method, Type limitType, bool holdsNull) { + EnsureScanDefinedMethods(); + + int dispId; + int hresult = GetIDsOfNames(_dispatchObject, name, out dispId); + + if (hresult == ComHresults.S_OK) { + // we do not know whether we have put or putref here + // and we will not guess and pretend we found both. + ComMethodDesc put = new ComMethodDesc(name, dispId, ComTypes.INVOKEKIND.INVOKE_PROPERTYPUT); + _comTypeDesc.AddPut(name, put); + + ComMethodDesc putref = new ComMethodDesc(name, dispId, ComTypes.INVOKEKIND.INVOKE_PROPERTYPUTREF); + _comTypeDesc.AddPutRef(name, putref); + + if (ComBinderHelpers.PreferPut(limitType, holdsNull)) { + method = put; + } else { + method = putref; + } + return true; + } else if (hresult == ComHresults.DISP_E_UNKNOWNNAME) { + method = null; + return false; + } else { + throw Error.CouldNotGetDispId(name, string.Format(CultureInfo.InvariantCulture, "0x{1:X})", hresult)); + } + } + + internal override IList GetMemberNames(bool dataOnly) { + EnsureScanDefinedMethods(); + EnsureScanDefinedEvents(); + + return ComTypeDesc.GetMemberNames(dataOnly); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] + internal override IList> GetMembers(IEnumerable names) { + if (names == null) { + names = GetMemberNames(true); + } + + Type comType = RuntimeCallableWrapper.GetType(); + + var members = new List>(); + foreach (string name in names) { + if (name == null) { + continue; + } + + ComMethodDesc method; + if (ComTypeDesc.TryGetFunc(name, out method) && method.IsDataMember) { + try { + object value = comType.InvokeMember( + method.Name, + BindingFlags.GetProperty, + null, + RuntimeCallableWrapper, + new object[0], + CultureInfo.InvariantCulture + ); + members.Add(new KeyValuePair(method.Name, value)); + + //evaluation failed for some reason. pass exception out + } catch (Exception ex) { + members.Add(new KeyValuePair(method.Name, ex)); + } + } + } + + return members.ToArray(); + } + + DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter) { + EnsureScanDefinedMethods(); + return new IDispatchMetaObject(parameter, this); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")] + [SecurityCritical] + private static void GetFuncDescForDescIndex(ComTypes.ITypeInfo typeInfo, int funcIndex, out ComTypes.FUNCDESC funcDesc, out IntPtr funcDescHandle) { + IntPtr pFuncDesc = IntPtr.Zero; + typeInfo.GetFuncDesc(funcIndex, out pFuncDesc); + + // GetFuncDesc should never return null, this is just to be safe + if (pFuncDesc == IntPtr.Zero) { + throw Error.CannotRetrieveTypeInformation(); + } + + funcDesc = (ComTypes.FUNCDESC)Marshal.PtrToStructure(pFuncDesc, typeof(ComTypes.FUNCDESC)); + funcDescHandle = pFuncDesc; + } + +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + private void EnsureScanDefinedEvents() { + // _comTypeDesc.Events is null if we have not yet attempted + // to scan the object for events. + if (_comTypeDesc != null && _comTypeDesc.Events != null) { + return; + } + + // + // Demand Full Trust to proceed with the operation. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + // check type info in the type descriptions cache + ComTypes.ITypeInfo typeInfo = ComRuntimeHelpers.GetITypeInfoFromIDispatch(_dispatchObject, true); + if (typeInfo == null) { + _comTypeDesc = ComTypeDesc.CreateEmptyTypeDesc(); + return; + } + + ComTypes.TYPEATTR typeAttr = ComRuntimeHelpers.GetTypeAttrForTypeInfo(typeInfo); + + if (_comTypeDesc == null) { + lock (_CacheComTypeDesc) { + if (_CacheComTypeDesc.TryGetValue(typeAttr.guid, out _comTypeDesc) == true && + _comTypeDesc.Events != null) { + return; + } + } + } + + ComTypeDesc typeDesc = ComTypeDesc.FromITypeInfo(typeInfo, typeAttr); + + ComTypes.ITypeInfo classTypeInfo = null; + Dictionary events = null; + + var cpc = RuntimeCallableWrapper as ComTypes.IConnectionPointContainer; + if (cpc == null) { + // No ICPC - this object does not support events + events = ComTypeDesc.EmptyEvents; + } else if ((classTypeInfo = GetCoClassTypeInfo(this.RuntimeCallableWrapper, typeInfo)) == null) { + // no class info found - this object may support events + // but we could not discover those + events = ComTypeDesc.EmptyEvents; + } else { + events = new Dictionary(); + + ComTypes.TYPEATTR classTypeAttr = ComRuntimeHelpers.GetTypeAttrForTypeInfo(classTypeInfo); + for (int i = 0; i < classTypeAttr.cImplTypes; i++) { + int hRefType; + classTypeInfo.GetRefTypeOfImplType(i, out hRefType); + + ComTypes.ITypeInfo interfaceTypeInfo; + classTypeInfo.GetRefTypeInfo(hRefType, out interfaceTypeInfo); + + ComTypes.IMPLTYPEFLAGS flags; + classTypeInfo.GetImplTypeFlags(i, out flags); + if ((flags & ComTypes.IMPLTYPEFLAGS.IMPLTYPEFLAG_FSOURCE) != 0) { + ScanSourceInterface(interfaceTypeInfo, ref events); + } + } + + if (events.Count == 0) { + events = ComTypeDesc.EmptyEvents; + } + } + + lock (_CacheComTypeDesc) { + ComTypeDesc cachedTypeDesc; + if (_CacheComTypeDesc.TryGetValue(typeAttr.guid, out cachedTypeDesc)) { + _comTypeDesc = cachedTypeDesc; + } else { + _comTypeDesc = typeDesc; + _CacheComTypeDesc.Add(typeAttr.guid, _comTypeDesc); + } + _comTypeDesc.Events = events; + } + } + + [SecurityCritical] + private static void ScanSourceInterface(ComTypes.ITypeInfo sourceTypeInfo, ref Dictionary events) { + ComTypes.TYPEATTR sourceTypeAttribute = ComRuntimeHelpers.GetTypeAttrForTypeInfo(sourceTypeInfo); + + for (int index = 0; index < sourceTypeAttribute.cFuncs; index++) { + IntPtr funcDescHandleToRelease = IntPtr.Zero; + + try { + ComTypes.FUNCDESC funcDesc; + GetFuncDescForDescIndex(sourceTypeInfo, index, out funcDesc, out funcDescHandleToRelease); + + // we are not interested in hidden or restricted functions for now. + if ((funcDesc.wFuncFlags & (int)ComTypes.FUNCFLAGS.FUNCFLAG_FHIDDEN) != 0) { + continue; + } + if ((funcDesc.wFuncFlags & (int)ComTypes.FUNCFLAGS.FUNCFLAG_FRESTRICTED) != 0) { + continue; + } + + string name = ComRuntimeHelpers.GetNameOfMethod(sourceTypeInfo, funcDesc.memid); + name = name.ToUpper(System.Globalization.CultureInfo.InvariantCulture); + + // Sometimes coclass has multiple source interfaces. Usually this is caused by + // adding new events and putting them on new interfaces while keeping the + // old interfaces around. This may cause name collisioning which we are + // resolving by keeping only the first event with the same name. + if (events.ContainsKey(name) == false) { + ComEventDesc eventDesc = new ComEventDesc(); + eventDesc.dispid = funcDesc.memid; + eventDesc.sourceIID = sourceTypeAttribute.guid; + events.Add(name, eventDesc); + } + } finally { + if (funcDescHandleToRelease != IntPtr.Zero) { + sourceTypeInfo.ReleaseFuncDesc(funcDescHandleToRelease); + } + } + } + } + + [SecurityCritical] + private static ComTypes.ITypeInfo GetCoClassTypeInfo(object rcw, ComTypes.ITypeInfo typeInfo) { + Debug.Assert(typeInfo != null); + + IProvideClassInfo provideClassInfo = rcw as IProvideClassInfo; + if (provideClassInfo != null) { + IntPtr typeInfoPtr = IntPtr.Zero; + try { + provideClassInfo.GetClassInfo(out typeInfoPtr); + if (typeInfoPtr != IntPtr.Zero) { + return Marshal.GetObjectForIUnknown(typeInfoPtr) as ComTypes.ITypeInfo; + } + } finally { + if (typeInfoPtr != IntPtr.Zero) { + Marshal.Release(typeInfoPtr); + } + } + } + + // retrieving class information through IPCI has failed - + // we can try scanning the typelib to find the coclass + + ComTypes.ITypeLib typeLib; + int typeInfoIndex; + typeInfo.GetContainingTypeLib(out typeLib, out typeInfoIndex); + string typeName = ComRuntimeHelpers.GetNameOfType(typeInfo); + + ComTypeLibDesc typeLibDesc = ComTypeLibDesc.GetFromTypeLib(typeLib); + ComTypeClassDesc coclassDesc = typeLibDesc.GetCoClassForInterface(typeName); + if (coclassDesc == null) { + return null; + } + + ComTypes.ITypeInfo typeInfoCoClass; + Guid coclassGuid = coclassDesc.Guid; + typeLib.GetTypeInfoOfGuid(ref coclassGuid, out typeInfoCoClass); + return typeInfoCoClass; + } + +#if MICROSOFT_DYNAMIC + [SecurityCritical, SecurityTreatAsSafe] +#else + [SecuritySafeCritical] +#endif + private void EnsureScanDefinedMethods() { + if (_comTypeDesc != null && _comTypeDesc.Funcs != null) { + return; + } + + // + // Demand Full Trust to proceed with the operation. + // + + new PermissionSet(PermissionState.Unrestricted).Demand(); + + ComTypes.ITypeInfo typeInfo = ComRuntimeHelpers.GetITypeInfoFromIDispatch(_dispatchObject, true); + if (typeInfo == null) { + _comTypeDesc = ComTypeDesc.CreateEmptyTypeDesc(); + return; + } + + ComTypes.TYPEATTR typeAttr = ComRuntimeHelpers.GetTypeAttrForTypeInfo(typeInfo); + + if (_comTypeDesc == null) { + lock (_CacheComTypeDesc) { + if (_CacheComTypeDesc.TryGetValue(typeAttr.guid, out _comTypeDesc) == true && + _comTypeDesc.Funcs != null) { + return; + } + } + } + + ComTypeDesc typeDesc = ComTypeDesc.FromITypeInfo(typeInfo, typeAttr); + + ComMethodDesc getItem = null; + ComMethodDesc setItem = null; + Hashtable funcs = new Hashtable(typeAttr.cFuncs); + Hashtable puts = new Hashtable(); + Hashtable putrefs = new Hashtable(); + + for (int definedFuncIndex = 0; definedFuncIndex < typeAttr.cFuncs; definedFuncIndex++) { + IntPtr funcDescHandleToRelease = IntPtr.Zero; + + try { + ComTypes.FUNCDESC funcDesc; + GetFuncDescForDescIndex(typeInfo, definedFuncIndex, out funcDesc, out funcDescHandleToRelease); + + if ((funcDesc.wFuncFlags & (int)ComTypes.FUNCFLAGS.FUNCFLAG_FRESTRICTED) != 0) { + // This function is not meant for the script user to use. + continue; + } + + ComMethodDesc method = new ComMethodDesc(typeInfo, funcDesc); + string name = method.Name.ToUpper(System.Globalization.CultureInfo.InvariantCulture); + + if ((funcDesc.invkind & ComTypes.INVOKEKIND.INVOKE_PROPERTYPUT) != 0) { + puts.Add(name, method); + + // for the special dispId == 0, we need to store + // the method descriptor for the Do(SetItem) binder. + if (method.DispId == ComDispIds.DISPID_VALUE && setItem == null) { + setItem = method; + } + continue; + } + if ((funcDesc.invkind & ComTypes.INVOKEKIND.INVOKE_PROPERTYPUTREF) != 0) { + putrefs.Add(name, method); + // for the special dispId == 0, we need to store + // the method descriptor for the Do(SetItem) binder. + if (method.DispId == ComDispIds.DISPID_VALUE && setItem == null) { + setItem = method; + } + continue; + } + + if (funcDesc.memid == ComDispIds.DISPID_NEWENUM) { + funcs.Add("GETENUMERATOR", method); + continue; + } + + funcs.Add(name, method); + + // for the special dispId == 0, we need to store the method descriptor + // for the Do(GetItem) binder. + if (funcDesc.memid == ComDispIds.DISPID_VALUE) { + getItem = method; + } + } finally { + if (funcDescHandleToRelease != IntPtr.Zero) { + typeInfo.ReleaseFuncDesc(funcDescHandleToRelease); + } + } + } + + lock (_CacheComTypeDesc) { + ComTypeDesc cachedTypeDesc; + if (_CacheComTypeDesc.TryGetValue(typeAttr.guid, out cachedTypeDesc)) { + _comTypeDesc = cachedTypeDesc; + } else { + _comTypeDesc = typeDesc; + _CacheComTypeDesc.Add(typeAttr.guid, _comTypeDesc); + } + _comTypeDesc.Funcs = funcs; + _comTypeDesc.Puts = puts; + _comTypeDesc.PutRefs = putrefs; + _comTypeDesc.EnsureGetItem(getItem); + _comTypeDesc.EnsureSetItem(setItem); + } + } + + internal bool TryGetPropertySetter(string name, out ComMethodDesc method, Type limitType, bool holdsNull) { + EnsureScanDefinedMethods(); + + if (ComBinderHelpers.PreferPut(limitType, holdsNull)) { + return _comTypeDesc.TryGetPut(name, out method) || + _comTypeDesc.TryGetPutRef(name, out method); + } else { + return _comTypeDesc.TryGetPutRef(name, out method) || + _comTypeDesc.TryGetPut(name, out method); + } + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/IDispatchMetaObject.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/IDispatchMetaObject.cs new file mode 100644 index 00000000000..967086810a0 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/IDispatchMetaObject.cs @@ -0,0 +1,273 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal sealed class IDispatchMetaObject : ComFallbackMetaObject { + private readonly IDispatchComObject _self; + + internal IDispatchMetaObject(Expression expression, IDispatchComObject self) + : base(expression, BindingRestrictions.Empty, self) { + _self = self; + } + + public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(binder, "binder"); + + ComMethodDesc method; + if (_self.TryGetMemberMethod(binder.Name, out method) || + _self.TryGetMemberMethodExplicit(binder.Name, out method)) { + + bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref args); + return BindComInvoke(args, method, binder.CallInfo, isByRef); + } + + return base.BindInvokeMember(binder, args); + } + + public override DynamicMetaObject BindInvoke(InvokeBinder binder, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(binder, "binder"); + + ComMethodDesc method; + if (_self.TryGetGetItem(out method)) { + + bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref args); + return BindComInvoke(args, method, binder.CallInfo, isByRef); + } + + return base.BindInvoke(binder, args); + } + + private DynamicMetaObject BindComInvoke(DynamicMetaObject[] args, ComMethodDesc method, CallInfo callInfo, bool[] isByRef) { + return new ComInvokeBinder( + callInfo, + args, + isByRef, + IDispatchRestriction(), + Expression.Constant(method), + Expression.Property( + Helpers.Convert(Expression, typeof(IDispatchComObject)), + typeof(IDispatchComObject).GetProperty("DispatchObject") + ), + method + ).Invoke(); + } + + public override DynamicMetaObject BindGetMember(GetMemberBinder binder) { + ComBinder.ComGetMemberBinder comBinder = binder as ComBinder.ComGetMemberBinder; + bool canReturnCallables = comBinder == null ? false : comBinder._CanReturnCallables; + + ContractUtils.RequiresNotNull(binder, "binder"); + + ComMethodDesc method; + ComEventDesc @event; + + // 1. Try methods + if (_self.TryGetMemberMethod(binder.Name, out method)) { + return BindGetMember(method, canReturnCallables); + } + + // 2. Try events + if (_self.TryGetMemberEvent(binder.Name, out @event)) { + return BindEvent(@event); + } + + // 3. Try methods explicitly by name + if (_self.TryGetMemberMethodExplicit(binder.Name, out method)) { + return BindGetMember(method, canReturnCallables); + + } + + // 4. Fallback + return base.BindGetMember(binder); + } + + private DynamicMetaObject BindGetMember(ComMethodDesc method, bool canReturnCallables) { + if (method.IsDataMember) { + if (method.ParamCount == 0) { + return BindComInvoke(DynamicMetaObject.EmptyMetaObjects, method, new CallInfo(0) , new bool[]{}); + } + } + + // ComGetMemberBinder does not expect callables. Try to call always. + if (!canReturnCallables) { + return BindComInvoke(DynamicMetaObject.EmptyMetaObjects, method, new CallInfo(0), new bool[0]); + } + + return new DynamicMetaObject( + Expression.Call( + typeof(ComRuntimeHelpers).GetMethod("CreateDispCallable"), + Helpers.Convert(Expression, typeof(IDispatchComObject)), + Expression.Constant(method) + ), + IDispatchRestriction() + ); + } + + private DynamicMetaObject BindEvent(ComEventDesc @event) { + // BoundDispEvent CreateComEvent(object rcw, Guid sourceIid, int dispid) + Expression result = + Expression.Call( + typeof(ComRuntimeHelpers).GetMethod("CreateComEvent"), + ComObject.RcwFromComObject(Expression), + Expression.Constant(@event.sourceIID), + Expression.Constant(@event.dispid) + ); + + return new DynamicMetaObject( + result, + IDispatchRestriction() + ); + } + + public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) { + ContractUtils.RequiresNotNull(binder, "binder"); + + ComMethodDesc getItem; + if (_self.TryGetGetItem(out getItem)) { + + bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref indexes); + return BindComInvoke(indexes, getItem, binder.CallInfo , isByRef); + } + + return base.BindGetIndex(binder, indexes); + } + + public override DynamicMetaObject BindSetIndex(SetIndexBinder binder, DynamicMetaObject[] indexes, DynamicMetaObject value) { + ContractUtils.RequiresNotNull(binder, "binder"); + + ComMethodDesc setItem; + if (_self.TryGetSetItem(out setItem)) { + + bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref indexes); + isByRef = isByRef.AddLast(false); + + var result = BindComInvoke(indexes.AddLast(value), setItem, binder.CallInfo, isByRef); + + // Make sure to return the value; some languages need it. + return new DynamicMetaObject( + Expression.Block(result.Expression, Expression.Convert(value.Expression, typeof(object))), + result.Restrictions + ); + } + + return base.BindSetIndex(binder, indexes, value); + } + + public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicMetaObject value) { + ContractUtils.RequiresNotNull(binder, "binder"); + + return + // 1. Check for simple property put + TryPropertyPut(binder, value) ?? + + // 2. Check for event handler hookup where the put is dropped + TryEventHandlerNoop(binder, value) ?? + + // 3. Fallback + base.BindSetMember(binder, value); + } + + private DynamicMetaObject TryPropertyPut(SetMemberBinder binder, DynamicMetaObject value) { + ComMethodDesc method; + bool holdsNull = value.Value == null && value.HasValue; + if (_self.TryGetPropertySetter(binder.Name, out method, value.LimitType, holdsNull) || + _self.TryGetPropertySetterExplicit(binder.Name, out method, value.LimitType, holdsNull)) { + BindingRestrictions restrictions = IDispatchRestriction(); + Expression dispatch = + Expression.Property( + Helpers.Convert(Expression, typeof(IDispatchComObject)), + typeof(IDispatchComObject).GetProperty("DispatchObject") + ); + + var result = new ComInvokeBinder( + new CallInfo(1), + new[] { value }, + new bool[] { false }, + restrictions, + Expression.Constant(method), + dispatch, + method + ).Invoke(); + + // Make sure to return the value; some languages need it. + return new DynamicMetaObject( + Expression.Block(result.Expression, Expression.Convert(value.Expression, typeof(object))), + result.Restrictions + ); + } + + return null; + } + + private DynamicMetaObject TryEventHandlerNoop(SetMemberBinder binder, DynamicMetaObject value) { + ComEventDesc @event; + if (_self.TryGetMemberEvent(binder.Name, out @event) && value.LimitType == typeof(BoundDispEvent)) { + // Drop the event property set. + return new DynamicMetaObject( + Expression.Constant(null), + value.Restrictions.Merge(IDispatchRestriction()).Merge(BindingRestrictions.GetTypeRestriction(value.Expression, typeof(BoundDispEvent))) + ); + } + + return null; + } + + private BindingRestrictions IDispatchRestriction() { + return IDispatchRestriction(Expression, _self.ComTypeDesc); + } + + internal static BindingRestrictions IDispatchRestriction(Expression expr, ComTypeDesc typeDesc) { + return BindingRestrictions.GetTypeRestriction( + expr, typeof(IDispatchComObject) + ).Merge( + BindingRestrictions.GetExpressionRestriction( + Expression.Equal( + Expression.Property( + Helpers.Convert(expr, typeof(IDispatchComObject)), + typeof(IDispatchComObject).GetProperty("ComTypeDesc") + ), + Expression.Constant(typeDesc) + ) + ) + ); + } + + protected override ComUnwrappedMetaObject UnwrapSelf() { + return new ComUnwrappedMetaObject( + ComObject.RcwFromComObject(Expression), + IDispatchRestriction(), + _self.RuntimeCallableWrapper + ); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/Microsoft.Dynamic.csproj b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Microsoft.Dynamic.csproj new file mode 100644 index 00000000000..f799b702cdb --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Microsoft.Dynamic.csproj @@ -0,0 +1,134 @@ + + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {D4AE44AD-07B9-41DC-BB3B-1FDCDE3C987D} + Library + Properties + true + System.Dynamic + Microsoft.Dynamic +$(OutputPath)\Microsoft.Dynamic.XML + 1591 +$(SolutionDir)\Runtime\MSSharedLibKey.snk + true + SIGNED + true + + + pdbonly + true +$(SolutionDir)\..\Bin\fxcop\ + DEBUG;TRACE;$(SignedSym);MICROSOFT_DYNAMIC + prompt + 4 + true + true + -Microsoft.Usage#CA2209;+!Microsoft.Design#CA1012;-!Microsoft.Design#CA2210;+!Microsoft.Design#CA1040;+!Microsoft.Design#CA1005;+!Microsoft.Design#CA1020;-!Microsoft.Design#CA1021;+!Microsoft.Design#CA1010;+!Microsoft.Design#CA1011;+!Microsoft.Design#CA1009;+!Microsoft.Design#CA1050;+!Microsoft.Design#CA1026;+!Microsoft.Design#CA1019;+!Microsoft.Design#CA1031;+!Microsoft.Design#CA1047;+!Microsoft.Design#CA1000;+!Microsoft.Design#CA1048;+!Microsoft.Design#CA1051;+!Microsoft.Design#CA1002;+!Microsoft.Design#CA1061;+!Microsoft.Design#CA1006;+!Microsoft.Design#CA1046;+!Microsoft.Design#CA1045;+!Microsoft.Design#CA1065;+!Microsoft.Design#CA1038;+!Microsoft.Design#CA1008;+!Microsoft.Design#CA1028;+!Microsoft.Design#CA1064;-!Microsoft.Design#CA1004;+!Microsoft.Design#CA1035;+!Microsoft.Design#CA1063;+!Microsoft.Design#CA1032;+!Microsoft.Design#CA1023;+!Microsoft.Design#CA1033;+!Microsoft.Design#CA1039;+!Microsoft.Design#CA1016;+!Microsoft.Design#CA1014;+!Microsoft.Design#CA1017;+!Microsoft.Design#CA1018;+!Microsoft.Design#CA1027;+!Microsoft.Design#CA1059;+!Microsoft.Design#CA1060;+!Microsoft.Design#CA1034;+!Microsoft.Design#CA1013;+!Microsoft.Design#CA1036;+!Microsoft.Design#CA1044;+!Microsoft.Design#CA1041;+!Microsoft.Design#CA1025;+!Microsoft.Design#CA1052;+!Microsoft.Design#CA1053;+!Microsoft.Design#CA1057;+!Microsoft.Design#CA1058;+!Microsoft.Design#CA1001;+!Microsoft.Design#CA1049;+!Microsoft.Design#CA1054;+!Microsoft.Design#CA1056;+!Microsoft.Design#CA1055;+!Microsoft.Design#CA1030;+!Microsoft.Design#CA1003;+!Microsoft.Design#CA1007;+!Microsoft.Design#CA1043;+!Microsoft.Design#CA1024;+!Microsoft.Globalization#CA1301;+!Microsoft.Globalization#CA1302;+!Microsoft.Globalization#CA1308;+!Microsoft.Globalization#CA1306;+!Microsoft.Globalization#CA1304;+!Microsoft.Globalization#CA1305;+!Microsoft.Globalization#CA2101;+!Microsoft.Globalization#CA1300;+!Microsoft.Globalization#CA1307;+!Microsoft.Globalization#CA1309;+!Microsoft.Interoperability#CA1403;+!Microsoft.Interoperability#CA1406;+!Microsoft.Interoperability#CA1413;+!Microsoft.Interoperability#CA1402;+!Microsoft.Interoperability#CA1407;+!Microsoft.Interoperability#CA1404;+!Microsoft.Interoperability#CA1410;+!Microsoft.Interoperability#CA1411;+!Microsoft.Interoperability#CA1405;+!Microsoft.Interoperability#CA1409;+!Microsoft.Interoperability#CA1415;+!Microsoft.Interoperability#CA1408;+!Microsoft.Interoperability#CA1414;+!Microsoft.Interoperability#CA1412;+!Microsoft.Interoperability#CA1400;+!Microsoft.Interoperability#CA1401;+!Microsoft.Maintainability#CA1506;+!Microsoft.Maintainability#CA1502;+!Microsoft.Maintainability#CA1501;+!Microsoft.Maintainability#CA1505;+!Microsoft.Maintainability#CA1504;+!Microsoft.Maintainability#CA1500;+!Microsoft.Mobility#CA1600;+!Microsoft.Mobility#CA1601;-!Microsoft.Naming#CA1702;+!Microsoft.Naming#CA1700;+!Microsoft.Naming#CA1712;+!Microsoft.Naming#CA1713;+!Microsoft.Naming#CA1714;+!Microsoft.Naming#CA1709;-!Microsoft.Naming#CA1704;+!Microsoft.Naming#CA1708;+!Microsoft.Naming#CA1715;-!Microsoft.Naming#CA1710;+!Microsoft.Naming#CA1720;+!Microsoft.Naming#CA1707;+!Microsoft.Naming#CA1722;-!Microsoft.Naming#CA1711;+!Microsoft.Naming#CA1716;+!Microsoft.Naming#CA1717;+!Microsoft.Naming#CA1725;+!Microsoft.Naming#CA1719;+!Microsoft.Naming#CA1721;+!Microsoft.Naming#CA1701;+!Microsoft.Naming#CA1703;+!Microsoft.Naming#CA1724;-!Microsoft.Naming#CA1726;+!Microsoft.Performance#CA1809;+!Microsoft.Performance#CA1811;+!Microsoft.Performance#CA1812;+!Microsoft.Performance#CA1813;+!Microsoft.Performance#CA1823;+!Microsoft.Performance#CA1800;+!Microsoft.Performance#CA1805;+!Microsoft.Performance#CA1810;+!Microsoft.Performance#CA1824;+!Microsoft.Performance#CA1822;+!Microsoft.Performance#CA1815;+!Microsoft.Performance#CA1814;+!Microsoft.Performance#CA1819;+!Microsoft.Performance#CA1821;+!Microsoft.Performance#CA1804;+!Microsoft.Performance#CA1820;+!Microsoft.Performance#CA1802;+!Microsoft.Portability#CA1901;+!Microsoft.Portability#CA1900;+!Microsoft.Reliability#CA2001;+!Microsoft.Reliability#CA2002;+!Microsoft.Reliability#CA2003;+!Microsoft.Reliability#CA2004;+!Microsoft.Reliability#CA2006;+!Microsoft.Security#CA2116;+!Microsoft.Security#CA2117;+!Microsoft.Security#CA2105;+!Microsoft.Security#CA2115;+!Microsoft.Security#CA2102;+!Microsoft.Security#CA2104;+!Microsoft.Security#CA2122;+!Microsoft.Security#CA2114;+!Microsoft.Security#CA2123;+!Microsoft.Security#CA2111;+!Microsoft.Security#CA2108;+!Microsoft.Security#CA2107;+!Microsoft.Security#CA2103;+!Microsoft.Security#CA2118;+!Microsoft.Security#CA2109;+!Microsoft.Security#CA2119;+!Microsoft.Security#CA2106;+!Microsoft.Security#CA2112;+!Microsoft.Security#CA2120;+!Microsoft.Security#CA2121;+!Microsoft.Security#CA2126;+!Microsoft.Security#CA2124;+!Microsoft.Security#CA2127;+!Microsoft.Security#CA2128;+!Microsoft.Security#CA2129;+!Microsoft.Usage#CA2243;+!Microsoft.Usage#CA2236;+!Microsoft.Usage#CA1816;+!Microsoft.Usage#CA2227;+!Microsoft.Usage#CA2213;+!Microsoft.Usage#CA2216;+!Microsoft.Usage#CA2214;+!Microsoft.Usage#CA2222;+!Microsoft.Usage#CA1806;+!Microsoft.Usage#CA2217;+!Microsoft.Usage#CA2212;+!Microsoft.Usage#CA2219;+!Microsoft.Usage#CA2201;+!Microsoft.Usage#CA2228;+!Microsoft.Usage#CA2221;+!Microsoft.Usage#CA2220;+!Microsoft.Usage#CA2240;+!Microsoft.Usage#CA2229;+!Microsoft.Usage#CA2238;+!Microsoft.Usage#CA2207;+!Microsoft.Usage#CA2208;+!Microsoft.Usage#CA2235;+!Microsoft.Usage#CA2237;+!Microsoft.Usage#CA2232;+!Microsoft.Usage#CA2223;+!Microsoft.Usage#CA2211;+!Microsoft.Usage#CA2233;+!Microsoft.Usage#CA2225;+!Microsoft.Usage#CA2226;+!Microsoft.Usage#CA2231;+!Microsoft.Usage#CA2224;+!Microsoft.Usage#CA2218;+!Microsoft.Usage#CA2234;+!Microsoft.Usage#CA2239;+!Microsoft.Usage#CA2200;+!Microsoft.Usage#CA1801;+!Microsoft.Usage#CA2242;+!Microsoft.Usage#CA2205;+!Microsoft.Usage#CA2230 + + + + + true + full + false +$(SolutionDir)\..\Bin\Debug\ +$(OutputPath)\Microsoft.Dynamic.xml + DEBUG;TRACE;$(SignedSym);MICROSOFT_DYNAMIC + prompt + 4 + true + false + + + + + pdbonly + true +$(SolutionDir)\..\Bin\Release\ +$(OutputPath)\Microsoft.Dynamic.XML + TRACE;$(SignedSym);MICROSOFT_DYNAMIC + prompt + 4 + true + false + 1929379840 + + + + + + + + + + {2AE75F5A-CD1F-4925-9647-AF4D1C282FB4} + Microsoft.Scripting.Core + False + + + {8B0F1074-750E-4D64-BF23-A1E0F54261E5} + Microsoft.Scripting.ExtensionAttribute + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/NullArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/NullArgBuilder.cs new file mode 100644 index 00000000000..11e48775c3c --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/NullArgBuilder.cs @@ -0,0 +1,45 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// ArgBuilder which always produces null. + /// + internal sealed class NullArgBuilder : ArgBuilder { + internal NullArgBuilder() { } + + internal override Expression Marshal(Expression parameter) { + return Expression.Constant(null); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/Properties/AssemblyInfo.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..f7c7effa408 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Properties/AssemblyInfo.cs @@ -0,0 +1,79 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ + +#if CODEPLEX_40 +using System; +#else +using System; using Microsoft; +#endif +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Runtime.InteropServices; +using System.Security; + +#if MICROSOFT_DYNAMIC + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Microsoft.Dynamic.ComInterop")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Microsoft.Dynamic.ComInterop")] +[assembly: AssemblyCopyright("� Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +[assembly: CLSCompliant(true)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: System.Resources.NeutralResourcesLanguage("en-US")] + +[assembly: AssemblyVersion("0.9.6.10")] +[assembly: AssemblyFileVersion("1.0.0.00")] +[assembly: AssemblyInformationalVersion("1.0")] +[assembly: AllowPartiallyTrustedCallers] +#if CODEPLEX_40 +[assembly: SecurityRules(SecurityRuleSet.Level1)] +#endif + +#else + +[assembly: InternalsVisibleTo("Microsoft.CSharp, PublicKey =" + + "002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9" + + "f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad2361321" + + "02900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93" + + "c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc09334" + + "4d5ad293")] + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/Properties/GlobalSuppressions.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Properties/GlobalSuppressions.cs new file mode 100644 index 00000000000..253f679b7e6 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Properties/GlobalSuppressions.cs @@ -0,0 +1,17 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. +// +// To add a suppression to this file, right-click the message in the +// Error List, point to "Suppress Message(s)", and click +// "In Project Suppression File". +// You do not need to add suppressions to this file manually. + +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Dynamic.SR.#GetObject(System.String)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Dynamic.SR.#GetString(System.String,System.Boolean&)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Dynamic.SR.#Resources")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Dynamic.Error.#ArgumentNull(System.String)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Dynamic.Error.#ArgumentOutOfRange(System.String)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Dynamic.Error.#NotImplemented()")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Dynamic.Error.#NotSupported()")] diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/SimpleArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/SimpleArgBuilder.cs new file mode 100644 index 00000000000..f5734224567 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/SimpleArgBuilder.cs @@ -0,0 +1,61 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// SimpleArgBuilder produces the value produced by the user as the argument value. It + /// also tracks information about the original parameter and is used to create extended + /// methods for params arrays and param dictionary functions. + /// + internal class SimpleArgBuilder : ArgBuilder { + private readonly Type _parameterType; + + internal SimpleArgBuilder(Type parameterType) { + _parameterType = parameterType; + } + + internal Type ParameterType { + get { return _parameterType; } + } + + internal override Expression Marshal(Expression parameter) { + Debug.Assert(parameter != null); + return Helpers.Convert(parameter, _parameterType); + } + + internal override Expression UnmarshalFromRef(Expression newValue) { + Debug.Assert(newValue != null && newValue.Type.IsAssignableFrom(_parameterType)); + + return base.UnmarshalFromRef(newValue); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/SplatCallSite.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/SplatCallSite.cs new file mode 100644 index 00000000000..548373b3d6d --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/SplatCallSite.cs @@ -0,0 +1,67 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal sealed class SplatCallSite { + // Stored callable Delegate or IDynamicMetaObjectProvider. + internal readonly object _callable; + + // Can the number of arguments to a given event change each call? + // If not, we don't need this level of indirection--we could cache a + // delegate that does the splatting. + internal CallSite> _site; + + internal SplatCallSite(object callable) { + Debug.Assert(callable != null); + _callable = callable; + } + + internal object Invoke(object[] args) { + Debug.Assert(args != null); + + // If it is a delegate, just let DynamicInvoke do the binding. + var d = _callable as Delegate; + if (d != null) { + return d.DynamicInvoke(args); + } + + // Otherwise, create a CallSite and invoke it. + if (_site == null) { + _site = CallSite>.Create(SplatInvokeBinder.Instance); + } + + return _site.Target(_site, _callable, args); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/StringArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/StringArgBuilder.cs new file mode 100644 index 00000000000..f93f23c33cc --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/StringArgBuilder.cs @@ -0,0 +1,100 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.InteropServices; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal class StringArgBuilder : SimpleArgBuilder { + private readonly bool _isWrapper; + + internal StringArgBuilder(Type parameterType) + : base(parameterType) { + + Debug.Assert(parameterType == typeof(string) || + parameterType == typeof(BStrWrapper)); + + _isWrapper = parameterType == typeof(BStrWrapper); + } + + internal override Expression Marshal(Expression parameter) { + parameter = base.Marshal(parameter); + + // parameter.WrappedObject + if (_isWrapper) { + parameter = Expression.Property( + Helpers.Convert(parameter, typeof(BStrWrapper)), + typeof(BStrWrapper).GetProperty("WrappedObject") + ); + }; + + return parameter; + } + + internal override Expression MarshalToRef(Expression parameter) { + parameter = Marshal(parameter); + + + // Marshal.StringToBSTR(parameter) + return Expression.Call( + typeof(Marshal).GetMethod("StringToBSTR"), + parameter + ); + } + + internal override Expression UnmarshalFromRef(Expression value) { + // value == IntPtr.Zero ? null : Marshal.PtrToStringBSTR(value); + Expression unmarshal = Expression.Condition( + Expression.Equal(value, Expression.Constant(IntPtr.Zero)), + Expression.Constant(null, typeof(string)), // default value + Expression.Call( + typeof(Marshal).GetMethod("PtrToStringBSTR"), + value + ) + ); + + if (_isWrapper) { + unmarshal = Expression.New( + typeof(BStrWrapper).GetConstructor(new Type[] { typeof(string) }), + unmarshal + ); + }; + + return base.UnmarshalFromRef(unmarshal); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/System.Dynamic.csproj b/mcs/class/dlr/Runtime/Microsoft.Dynamic/System.Dynamic.csproj new file mode 100644 index 00000000000..45abeb113ff --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/System.Dynamic.csproj @@ -0,0 +1,124 @@ + + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {D4AE44AD-07B9-41DC-BB3B-1FDCDE3C987D} + Library + Properties + true + System.Dynamic + System.Dynamic +$(OutputPath)\System.Dynamic.XML + 1591 +$(SolutionDir)\Runtime\MSSharedLibKey.snk + true + SIGNED + true + v4.0 + + + pdbonly + true +$(SolutionDir)\..\Bin\fxcop\ + DEBUG;TRACE;$(SignedSym);MICROSOFT_SCRIPTING_CORE + prompt + 4 + true + true + -Microsoft.Usage#CA2209;+!Microsoft.Design#CA1012;-!Microsoft.Design#CA2210;+!Microsoft.Design#CA1040;+!Microsoft.Design#CA1005;+!Microsoft.Design#CA1020;-!Microsoft.Design#CA1021;+!Microsoft.Design#CA1010;+!Microsoft.Design#CA1011;+!Microsoft.Design#CA1009;+!Microsoft.Design#CA1050;+!Microsoft.Design#CA1026;+!Microsoft.Design#CA1019;+!Microsoft.Design#CA1031;+!Microsoft.Design#CA1047;+!Microsoft.Design#CA1000;+!Microsoft.Design#CA1048;+!Microsoft.Design#CA1051;+!Microsoft.Design#CA1002;+!Microsoft.Design#CA1061;+!Microsoft.Design#CA1006;+!Microsoft.Design#CA1046;+!Microsoft.Design#CA1045;+!Microsoft.Design#CA1065;+!Microsoft.Design#CA1038;+!Microsoft.Design#CA1008;+!Microsoft.Design#CA1028;+!Microsoft.Design#CA1064;-!Microsoft.Design#CA1004;+!Microsoft.Design#CA1035;+!Microsoft.Design#CA1063;+!Microsoft.Design#CA1032;+!Microsoft.Design#CA1023;+!Microsoft.Design#CA1033;+!Microsoft.Design#CA1039;+!Microsoft.Design#CA1016;+!Microsoft.Design#CA1014;+!Microsoft.Design#CA1017;+!Microsoft.Design#CA1018;+!Microsoft.Design#CA1027;+!Microsoft.Design#CA1059;+!Microsoft.Design#CA1060;+!Microsoft.Design#CA1034;+!Microsoft.Design#CA1013;+!Microsoft.Design#CA1036;+!Microsoft.Design#CA1044;+!Microsoft.Design#CA1041;+!Microsoft.Design#CA1025;+!Microsoft.Design#CA1052;+!Microsoft.Design#CA1053;+!Microsoft.Design#CA1057;+!Microsoft.Design#CA1058;+!Microsoft.Design#CA1001;+!Microsoft.Design#CA1049;+!Microsoft.Design#CA1054;+!Microsoft.Design#CA1056;+!Microsoft.Design#CA1055;+!Microsoft.Design#CA1030;+!Microsoft.Design#CA1003;+!Microsoft.Design#CA1007;+!Microsoft.Design#CA1043;+!Microsoft.Design#CA1024;+!Microsoft.Globalization#CA1301;+!Microsoft.Globalization#CA1302;+!Microsoft.Globalization#CA1308;+!Microsoft.Globalization#CA1306;+!Microsoft.Globalization#CA1304;+!Microsoft.Globalization#CA1305;+!Microsoft.Globalization#CA2101;+!Microsoft.Globalization#CA1300;+!Microsoft.Globalization#CA1307;+!Microsoft.Globalization#CA1309;+!Microsoft.Interoperability#CA1403;+!Microsoft.Interoperability#CA1406;+!Microsoft.Interoperability#CA1413;+!Microsoft.Interoperability#CA1402;+!Microsoft.Interoperability#CA1407;+!Microsoft.Interoperability#CA1404;+!Microsoft.Interoperability#CA1410;+!Microsoft.Interoperability#CA1411;+!Microsoft.Interoperability#CA1405;+!Microsoft.Interoperability#CA1409;+!Microsoft.Interoperability#CA1415;+!Microsoft.Interoperability#CA1408;+!Microsoft.Interoperability#CA1414;+!Microsoft.Interoperability#CA1412;+!Microsoft.Interoperability#CA1400;+!Microsoft.Interoperability#CA1401;+!Microsoft.Maintainability#CA1506;+!Microsoft.Maintainability#CA1502;+!Microsoft.Maintainability#CA1501;+!Microsoft.Maintainability#CA1505;+!Microsoft.Maintainability#CA1504;+!Microsoft.Maintainability#CA1500;+!Microsoft.Mobility#CA1600;+!Microsoft.Mobility#CA1601;-!Microsoft.Naming#CA1702;+!Microsoft.Naming#CA1700;+!Microsoft.Naming#CA1712;+!Microsoft.Naming#CA1713;+!Microsoft.Naming#CA1714;+!Microsoft.Naming#CA1709;-!Microsoft.Naming#CA1704;+!Microsoft.Naming#CA1708;+!Microsoft.Naming#CA1715;-!Microsoft.Naming#CA1710;+!Microsoft.Naming#CA1720;+!Microsoft.Naming#CA1707;+!Microsoft.Naming#CA1722;-!Microsoft.Naming#CA1711;+!Microsoft.Naming#CA1716;+!Microsoft.Naming#CA1717;+!Microsoft.Naming#CA1725;+!Microsoft.Naming#CA1719;+!Microsoft.Naming#CA1721;+!Microsoft.Naming#CA1701;+!Microsoft.Naming#CA1703;+!Microsoft.Naming#CA1724;-!Microsoft.Naming#CA1726;+!Microsoft.Performance#CA1809;+!Microsoft.Performance#CA1811;+!Microsoft.Performance#CA1812;+!Microsoft.Performance#CA1813;+!Microsoft.Performance#CA1823;+!Microsoft.Performance#CA1800;+!Microsoft.Performance#CA1805;+!Microsoft.Performance#CA1810;+!Microsoft.Performance#CA1824;+!Microsoft.Performance#CA1822;+!Microsoft.Performance#CA1815;+!Microsoft.Performance#CA1814;+!Microsoft.Performance#CA1819;+!Microsoft.Performance#CA1821;+!Microsoft.Performance#CA1804;+!Microsoft.Performance#CA1820;+!Microsoft.Performance#CA1802;+!Microsoft.Portability#CA1901;+!Microsoft.Portability#CA1900;+!Microsoft.Reliability#CA2001;+!Microsoft.Reliability#CA2002;+!Microsoft.Reliability#CA2003;+!Microsoft.Reliability#CA2004;+!Microsoft.Reliability#CA2006;+!Microsoft.Security#CA2116;+!Microsoft.Security#CA2117;+!Microsoft.Security#CA2105;+!Microsoft.Security#CA2115;+!Microsoft.Security#CA2102;+!Microsoft.Security#CA2104;+!Microsoft.Security#CA2122;+!Microsoft.Security#CA2114;+!Microsoft.Security#CA2123;+!Microsoft.Security#CA2111;+!Microsoft.Security#CA2108;+!Microsoft.Security#CA2107;+!Microsoft.Security#CA2103;+!Microsoft.Security#CA2118;+!Microsoft.Security#CA2109;+!Microsoft.Security#CA2119;+!Microsoft.Security#CA2106;+!Microsoft.Security#CA2112;+!Microsoft.Security#CA2120;+!Microsoft.Security#CA2121;+!Microsoft.Security#CA2126;+!Microsoft.Security#CA2124;+!Microsoft.Security#CA2127;+!Microsoft.Security#CA2128;+!Microsoft.Security#CA2129;+!Microsoft.Usage#CA2243;+!Microsoft.Usage#CA2236;+!Microsoft.Usage#CA1816;+!Microsoft.Usage#CA2227;+!Microsoft.Usage#CA2213;+!Microsoft.Usage#CA2216;+!Microsoft.Usage#CA2214;+!Microsoft.Usage#CA2222;+!Microsoft.Usage#CA1806;+!Microsoft.Usage#CA2217;+!Microsoft.Usage#CA2212;+!Microsoft.Usage#CA2219;+!Microsoft.Usage#CA2201;+!Microsoft.Usage#CA2228;+!Microsoft.Usage#CA2221;+!Microsoft.Usage#CA2220;+!Microsoft.Usage#CA2240;+!Microsoft.Usage#CA2229;+!Microsoft.Usage#CA2238;+!Microsoft.Usage#CA2207;+!Microsoft.Usage#CA2208;+!Microsoft.Usage#CA2235;+!Microsoft.Usage#CA2237;+!Microsoft.Usage#CA2232;+!Microsoft.Usage#CA2223;+!Microsoft.Usage#CA2211;+!Microsoft.Usage#CA2233;+!Microsoft.Usage#CA2225;+!Microsoft.Usage#CA2226;+!Microsoft.Usage#CA2231;+!Microsoft.Usage#CA2224;+!Microsoft.Usage#CA2218;+!Microsoft.Usage#CA2234;+!Microsoft.Usage#CA2239;+!Microsoft.Usage#CA2200;+!Microsoft.Usage#CA1801;+!Microsoft.Usage#CA2242;+!Microsoft.Usage#CA2205;+!Microsoft.Usage#CA2230 + + + + + true + full + false +$(SolutionDir)\..\Bin\Debug\ +$(OutputPath)\System.Dynamic.xml + DEBUG;TRACE;$(SignedSym);MICROSOFT_SCRIPTING_CORE + prompt + 4 + true + false + + + + + pdbonly + true +$(SolutionDir)\..\Bin\Release\ +$(OutputPath)\System.Dynamic.XML + TRACE;$(SignedSym) + prompt + 4 + true + false + 1929379840 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/System.Dynamic.txt b/mcs/class/dlr/Runtime/Microsoft.Dynamic/System.Dynamic.txt new file mode 100644 index 00000000000..b76067884b4 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/System.Dynamic.txt @@ -0,0 +1,72 @@ +##################################################################################### +# +# Copyright (c) Microsoft Corporation. All rights reserved. +# +# This source code is subject to terms and conditions of the Microsoft Public License. A +# copy of the license can be found in the License.html file at the root of this distribution. If +# you cannot locate the Microsoft Public License, please send an email to +# dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound +# by the terms of the Microsoft Public License. +# +# You must not remove this notice, or any other, from this software. +# +# +##################################################################################### + +InvalidArgumentValue=Invalid argument value +ComObjectExpected=COM object is expected. +CannotCall=Cannot perform call. + +## ExceptionType=ArgumentException +COMObjectDoesNotSupportEvents=COM object does not support events. + +## ExceptionType=ArgumentException +COMObjectDoesNotSupportSourceInterface=COM object does not support specified source interface. + +## ExceptionType=InvalidOperationException +SetComObjectDataFailed=Marshal.SetComObjectData failed. + +## ExceptionType=InvalidOperationException +MethodShouldNotBeCalled=This method exists only to keep the compiler happy. + +## ExceptionType=InvalidOperationException +UnexpectedVarEnum=Unexpected VarEnum {0}. + +## ExceptionType=System.Reflection.TargetParameterCountException +DispBadParamCount=Error while invoking {0}. + +## ExceptionType=MissingMemberException +DispMemberNotFound=Error while invoking {0}. + +## ExceptionType=ArgumentException +DispNoNamedArgs=Error while invoking {0}. Named arguments are not supported. + +## ExceptionType=OverflowException +DispOverflow=Error while invoking {0}. + +## ExceptionType=ArgumentException +DispTypeMismatch=Could not convert argument {0} for call to {1}. + +## ExceptionType=ArgumentException +DispParamNotOptional=Error while invoking {0}. A required parameter was omitted. + +## ExceptionType=InvalidOperationException +CannotRetrieveTypeInformation=ResolveComReference.CannotRetrieveTypeInformation. + +## ExceptionType=ArgumentException +GetIDsOfNamesInvalid=IDispatch::GetIDsOfNames behaved unexpectedly for {0}. + +## ExceptionType=InvalidOperationException +UnsupportedEnumType=Attempting to wrap an unsupported enum type. + +## ExceptionType=InvalidOperationException +UnsupportedHandlerType=Attempting to pass an event handler of an unsupported type. + +## ExceptionType=MissingMemberException +CouldNotGetDispId=Could not get dispatch ID for {0} (error: {1}). + +## ExceptionType=System.Reflection.AmbiguousMatchException +AmbiguousConversion=There are valid conversions from {0} to {1}. + +## ExceptionType=NotImplementedException +VariantGetAccessorNYI=Variant.GetAccessor cannot handle {0}. diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/TypeUtils.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/TypeUtils.cs new file mode 100644 index 00000000000..7228ceafa23 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/TypeUtils.cs @@ -0,0 +1,260 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + internal static class TypeUtils { + private const BindingFlags AnyStatic = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; + internal const MethodAttributes PublicStatic = MethodAttributes.Public | MethodAttributes.Static; + + //CONFORMING + internal static Type GetNonNullableType(Type type) { + if (IsNullableType(type)) { + return type.GetGenericArguments()[0]; + } + return type; + } + + //CONFORMING + internal static bool IsNullableType(this Type type) { + return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); + } + + //CONFORMING + internal static bool AreReferenceAssignable(Type dest, Type src) { + // WARNING: This actually implements "Is this identity assignable and/or reference assignable?" + if (dest == src) { + return true; + } + if (!dest.IsValueType && !src.IsValueType && AreAssignable(dest, src)) { + return true; + } + return false; + } + //CONFORMING + internal static bool AreAssignable(Type dest, Type src) { + if (dest == src) { + return true; + } + if (dest.IsAssignableFrom(src)) { + return true; + } + if (dest.IsArray && src.IsArray && dest.GetArrayRank() == src.GetArrayRank() && AreReferenceAssignable(dest.GetElementType(), src.GetElementType())) { + return true; + } + if (src.IsArray && dest.IsGenericType && + (dest.GetGenericTypeDefinition() == typeof(System.Collections.Generic.IEnumerable<>) + || dest.GetGenericTypeDefinition() == typeof(System.Collections.Generic.IList<>) + || dest.GetGenericTypeDefinition() == typeof(System.Collections.Generic.ICollection<>)) + && dest.GetGenericArguments()[0] == src.GetElementType()) { + return true; + } + return false; + } + + //CONFORMING + internal static bool IsImplicitlyConvertible(Type source, Type destination) { + return IsIdentityConversion(source, destination) || + IsImplicitNumericConversion(source, destination) || + IsImplicitReferenceConversion(source, destination) || + IsImplicitBoxingConversion(source, destination); + } + + internal static bool IsImplicitlyConvertible(Type source, Type destination, bool considerUserDefined) { + return IsImplicitlyConvertible(source, destination) || + (considerUserDefined && GetUserDefinedCoercionMethod(source, destination, true) != null); + } + + //CONFORMING + internal static MethodInfo GetUserDefinedCoercionMethod(Type convertFrom, Type convertToType, bool implicitOnly) { + // check for implicit coercions first + Type nnExprType = TypeUtils.GetNonNullableType(convertFrom); + Type nnConvType = TypeUtils.GetNonNullableType(convertToType); + // try exact match on types + MethodInfo[] eMethods = nnExprType.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); + MethodInfo method = FindConversionOperator(eMethods, convertFrom, convertToType, implicitOnly); + if (method != null) { + return method; + } + MethodInfo[] cMethods = nnConvType.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); + method = FindConversionOperator(cMethods, convertFrom, convertToType, implicitOnly); + if (method != null) { + return method; + } + // try lifted conversion + if (nnExprType != convertFrom || nnConvType != convertToType) { + method = FindConversionOperator(eMethods, nnExprType, nnConvType, implicitOnly); + if (method == null) { + method = FindConversionOperator(cMethods, nnExprType, nnConvType, implicitOnly); + } + if (method != null) { + return method; + } + } + return null; + } + + //CONFORMING + internal static MethodInfo FindConversionOperator(MethodInfo[] methods, Type typeFrom, Type typeTo, bool implicitOnly) { + foreach (MethodInfo mi in methods) { + if (mi.Name != "op_Implicit" && (implicitOnly || mi.Name != "op_Explicit")) + continue; + if (mi.ReturnType != typeTo) + continue; + ParameterInfo[] pis = mi.GetParameters(); + if (pis[0].ParameterType != typeFrom) + continue; + return mi; + } + return null; + } + + + //CONFORMING + private static bool IsIdentityConversion(Type source, Type destination) { + return source == destination; + } + + //CONFORMING + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private static bool IsImplicitNumericConversion(Type source, Type destination) { + TypeCode tcSource = Type.GetTypeCode(source); + TypeCode tcDest = Type.GetTypeCode(destination); + + switch (tcSource) { + case TypeCode.SByte: + switch (tcDest) { + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Byte: + switch (tcDest) { + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Int16: + switch (tcDest) { + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.UInt16: + switch (tcDest) { + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Int32: + switch (tcDest) { + case TypeCode.Int64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.UInt32: + switch (tcDest) { + case TypeCode.UInt32: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Int64: + case TypeCode.UInt64: + switch (tcDest) { + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Char: + switch (tcDest) { + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Single: + return (tcDest == TypeCode.Double); + } + return false; + } + + //CONFORMING + private static bool IsImplicitReferenceConversion(Type source, Type destination) { + return AreAssignable(destination, source); + } + + //CONFORMING + private static bool IsImplicitBoxingConversion(Type source, Type destination) { + if (source.IsValueType && (destination == typeof(object) || destination == typeof(System.ValueType))) + return true; + if (source.IsEnum && destination == typeof(System.Enum)) + return true; + return false; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/UnknownArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/UnknownArgBuilder.cs new file mode 100644 index 00000000000..ec73054ce62 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/UnknownArgBuilder.cs @@ -0,0 +1,100 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.InteropServices; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal class UnknownArgBuilder : SimpleArgBuilder { + private readonly bool _isWrapper; + + internal UnknownArgBuilder(Type parameterType) + : base(parameterType) { + + _isWrapper = parameterType == typeof(UnknownWrapper); + } + + internal override Expression Marshal(Expression parameter) { + parameter = base.Marshal(parameter); + + // parameter.WrappedObject + if (_isWrapper) { + parameter = Expression.Property( + Helpers.Convert(parameter, typeof(UnknownWrapper)), + typeof(UnknownWrapper).GetProperty("WrappedObject") + ); + }; + + return Helpers.Convert(parameter, typeof(object)); + } + + internal override Expression MarshalToRef(Expression parameter) { + parameter = Marshal(parameter); + + // parameter == null ? IntPtr.Zero : Marshal.GetIUnknownForObject(parameter); + return Expression.Condition( + Expression.Equal(parameter, Expression.Constant(null)), + Expression.Constant(IntPtr.Zero), + Expression.Call( + typeof(Marshal).GetMethod("GetIUnknownForObject"), + parameter + ) + ); + } + + + internal override Expression UnmarshalFromRef(Expression value) { + // value == IntPtr.Zero ? null : Marshal.GetObjectForIUnknown(value); + Expression unmarshal = Expression.Condition( + Expression.Equal(value, Expression.Constant(IntPtr.Zero)), + Expression.Constant(null), + Expression.Call( + typeof(Marshal).GetMethod("GetObjectForIUnknown"), + value + ) + ); + + if (_isWrapper) { + unmarshal = Expression.New( + typeof(UnknownWrapper).GetConstructor(new Type[] { typeof(object) }), + unmarshal + ); + }; + + return base.UnmarshalFromRef(unmarshal); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/VarEnumSelector.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/VarEnumSelector.cs new file mode 100644 index 00000000000..ec08acd675e --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/VarEnumSelector.cs @@ -0,0 +1,475 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; +using System.Runtime.InteropServices; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// If a managed user type (as opposed to a primitive type or a COM object) is passed as an argument to a COM call, we need + /// to determine the VarEnum type we will marshal it as. We have the following options: + /// 1. Raise an exception. Languages with their own version of primitive types would not be able to call + /// COM methods using the language's types (for eg. strings in IronRuby are not System.String). An explicit + /// cast would be needed. + /// 2. We could marshal it as VT_DISPATCH. Then COM code will be able to access all the APIs in a late-bound manner, + /// but old COM components will probably malfunction if they expect a primitive type. + /// 3. We could guess which primitive type is the closest match. This will make COM components be as easily + /// accessible as .NET methods. + /// 4. We could use the type library to check what the expected type is. However, the type library may not be available. + /// + /// VarEnumSelector implements option # 3 + /// + internal class VarEnumSelector { + private readonly VariantBuilder[] _variantBuilders; + + private static readonly Dictionary _ComToManagedPrimitiveTypes = CreateComToManagedPrimitiveTypes(); + private static readonly IList> _ComPrimitiveTypeFamilies = CreateComPrimitiveTypeFamilies(); + + internal VarEnumSelector(Type[] explicitArgTypes) { + _variantBuilders = new VariantBuilder[explicitArgTypes.Length]; + + for (int i = 0; i < explicitArgTypes.Length; i++) { + _variantBuilders[i] = GetVariantBuilder(explicitArgTypes[i]); + } + } + + internal VariantBuilder[] VariantBuilders { + get { + return _variantBuilders; + } + } + + /// + /// Gets the managed type that an object needs to be coverted to in order for it to be able + /// to be represented as a Variant. + /// + /// In general, there is a many-to-many mapping between Type and VarEnum. However, this method + /// returns a simple mapping that is needed for the current implementation. The reason for the + /// many-to-many relation is: + /// 1. Int32 maps to VT_I4 as well as VT_ERROR, and Decimal maps to VT_DECIMAL and VT_CY. However, + /// this changes if you throw the wrapper types into the mix. + /// 2. There is no Type to represent COM types. __ComObject is a private type, and Object is too + /// general. + /// + internal static Type GetManagedMarshalType(VarEnum varEnum) { + Debug.Assert((varEnum & VarEnum.VT_BYREF) == 0); + + if (varEnum == VarEnum.VT_CY) { + return typeof(CurrencyWrapper); + } + + if (Variant.IsPrimitiveType(varEnum)) { + return _ComToManagedPrimitiveTypes[varEnum]; + } + + switch (varEnum) { + case VarEnum.VT_EMPTY: + case VarEnum.VT_NULL: + case VarEnum.VT_UNKNOWN: + case VarEnum.VT_DISPATCH: + case VarEnum.VT_VARIANT: + return typeof(Object); + + case VarEnum.VT_ERROR: + return typeof(ErrorWrapper); + + default: + throw Error.UnexpectedVarEnum(varEnum); + } + } + + private static Dictionary CreateComToManagedPrimitiveTypes() { + Dictionary dict = new Dictionary(); + + #region Generated ComToManagedPrimitiveTypes + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_ComToManagedPrimitiveTypes from: generate_comdispatch.py + + dict[VarEnum.VT_I1] = typeof(SByte); + dict[VarEnum.VT_I2] = typeof(Int16); + dict[VarEnum.VT_I4] = typeof(Int32); + dict[VarEnum.VT_I8] = typeof(Int64); + dict[VarEnum.VT_UI1] = typeof(Byte); + dict[VarEnum.VT_UI2] = typeof(UInt16); + dict[VarEnum.VT_UI4] = typeof(UInt32); + dict[VarEnum.VT_UI8] = typeof(UInt64); + dict[VarEnum.VT_INT] = typeof(IntPtr); + dict[VarEnum.VT_UINT] = typeof(UIntPtr); + dict[VarEnum.VT_BOOL] = typeof(Boolean); + dict[VarEnum.VT_R4] = typeof(Single); + dict[VarEnum.VT_R8] = typeof(Double); + dict[VarEnum.VT_DECIMAL] = typeof(Decimal); + dict[VarEnum.VT_DATE] = typeof(DateTime); + dict[VarEnum.VT_BSTR] = typeof(String); + + // *** END GENERATED CODE *** + + #endregion + + dict[VarEnum.VT_CY] = typeof(CurrencyWrapper); + dict[VarEnum.VT_ERROR] = typeof(ErrorWrapper); + + return dict; + } + + #region Primitive COM types + + /// + /// Creates a family of COM types such that within each family, there is a completely non-lossy + /// conversion from a type to an earlier type in the family. + /// + private static IList> CreateComPrimitiveTypeFamilies() { + VarEnum[][] typeFamilies = new VarEnum[][] { + new VarEnum[] { VarEnum.VT_I8, VarEnum.VT_I4, VarEnum.VT_I2, VarEnum.VT_I1 }, + new VarEnum[] { VarEnum.VT_UI8, VarEnum.VT_UI4, VarEnum.VT_UI2, VarEnum.VT_UI1 }, + new VarEnum[] { VarEnum.VT_INT }, + new VarEnum[] { VarEnum.VT_UINT }, + new VarEnum[] { VarEnum.VT_BOOL }, + new VarEnum[] { VarEnum.VT_DATE }, + new VarEnum[] { VarEnum.VT_R8, VarEnum.VT_R4 }, + new VarEnum[] { VarEnum.VT_DECIMAL }, + new VarEnum[] { VarEnum.VT_BSTR }, + + // wrappers + new VarEnum[] { VarEnum.VT_CY }, + new VarEnum[] { VarEnum.VT_ERROR }, + }; + + return typeFamilies; + } + + /// + /// Get the (one representative type for each) primitive type families that the argument can be converted to + /// + private static List GetConversionsToComPrimitiveTypeFamilies(Type argumentType) { + List compatibleComTypes = new List(); + + foreach (IList typeFamily in _ComPrimitiveTypeFamilies) { + foreach (VarEnum candidateType in typeFamily) { + Type candidateManagedType = _ComToManagedPrimitiveTypes[candidateType]; + if (TypeUtils.IsImplicitlyConvertible(argumentType, candidateManagedType, true)) { + compatibleComTypes.Add(candidateType); + // Move on to the next type family. We need atmost one type from each family + break; + } + } + } + return compatibleComTypes; + } + + /// + /// If there is more than one type family that the argument can be converted to, we will throw a + /// AmbiguousMatchException instead of randomly picking a winner. + /// + private static void CheckForAmbiguousMatch(Type argumentType, List compatibleComTypes) { + if (compatibleComTypes.Count <= 1) { + return; + } + + String typeNames = ""; + for (int i = 0; i < compatibleComTypes.Count; i++) { + string typeName = _ComToManagedPrimitiveTypes[compatibleComTypes[i]].Name; + if (i == (compatibleComTypes.Count - 1)) { + typeNames += " and "; + } else if (i != 0) { + typeNames += ", "; + } + typeNames += typeName; + } + + + throw Error.AmbiguousConversion(argumentType.Name, typeNames); + } + + private static bool TryGetPrimitiveComType(Type argumentType, out VarEnum primitiveVarEnum) { + + #region Generated Managed To COM Primitive Type Map + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_ManagedToComPrimitiveTypes from: generate_comdispatch.py + + switch (Type.GetTypeCode(argumentType)) { + case TypeCode.Boolean: + primitiveVarEnum = VarEnum.VT_BOOL; + return true; + case TypeCode.Char: + primitiveVarEnum = VarEnum.VT_UI2; + return true; + case TypeCode.SByte: + primitiveVarEnum = VarEnum.VT_I1; + return true; + case TypeCode.Byte: + primitiveVarEnum = VarEnum.VT_UI1; + return true; + case TypeCode.Int16: + primitiveVarEnum = VarEnum.VT_I2; + return true; + case TypeCode.UInt16: + primitiveVarEnum = VarEnum.VT_UI2; + return true; + case TypeCode.Int32: + primitiveVarEnum = VarEnum.VT_I4; + return true; + case TypeCode.UInt32: + primitiveVarEnum = VarEnum.VT_UI4; + return true; + case TypeCode.Int64: + primitiveVarEnum = VarEnum.VT_I8; + return true; + case TypeCode.UInt64: + primitiveVarEnum = VarEnum.VT_UI8; + return true; + case TypeCode.Single: + primitiveVarEnum = VarEnum.VT_R4; + return true; + case TypeCode.Double: + primitiveVarEnum = VarEnum.VT_R8; + return true; + case TypeCode.Decimal: + primitiveVarEnum = VarEnum.VT_DECIMAL; + return true; + case TypeCode.DateTime: + primitiveVarEnum = VarEnum.VT_DATE; + return true; + case TypeCode.String: + primitiveVarEnum = VarEnum.VT_BSTR; + return true; + } + + if (argumentType == typeof(CurrencyWrapper)) { + primitiveVarEnum = VarEnum.VT_CY; + return true; + } + + if (argumentType == typeof(ErrorWrapper)) { + primitiveVarEnum = VarEnum.VT_ERROR; + return true; + } + + if (argumentType == typeof(IntPtr)) { + primitiveVarEnum = VarEnum.VT_INT; + return true; + } + + if (argumentType == typeof(UIntPtr)) { + primitiveVarEnum = VarEnum.VT_UINT; + return true; + } + + // *** END GENERATED CODE *** + + #endregion + + primitiveVarEnum = VarEnum.VT_VOID; // error + return false; + } + + /// + /// Is there a unique primitive type that has the best conversion for the argument + /// + private static bool TryGetPrimitiveComTypeViaConversion(Type argumentType, out VarEnum primitiveVarEnum) { + // Look for a unique type family that the argument can be converted to. + List compatibleComTypes = GetConversionsToComPrimitiveTypeFamilies(argumentType); + CheckForAmbiguousMatch(argumentType, compatibleComTypes); + if (compatibleComTypes.Count == 1) { + primitiveVarEnum = compatibleComTypes[0]; + return true; + } + + primitiveVarEnum = VarEnum.VT_VOID; // error + return false; + } + + #endregion + + // Type.InvokeMember tries to marshal objects as VT_DISPATCH, and falls back to VT_UNKNOWN + // VT_RECORD here just indicates that we have user defined type. + // We will try VT_DISPATCH and then call GetNativeVariantForObject. + const VarEnum VT_DEFAULT = VarEnum.VT_RECORD; + + private VarEnum GetComType(ref Type argumentType) { + if (argumentType == typeof(Missing)) { + //actual variant type will be VT_ERROR | E_PARAMNOTFOUND + return VarEnum.VT_RECORD; + } + + if (argumentType.IsArray) { + //actual variant type will be VT_ARRAY | VT_ + return VarEnum.VT_ARRAY; + } + + if (argumentType == typeof(UnknownWrapper)) { + return VarEnum.VT_UNKNOWN; + } else if (argumentType == typeof(DispatchWrapper)) { + return VarEnum.VT_DISPATCH; + } else if (argumentType == typeof(VariantWrapper)) { + return VarEnum.VT_VARIANT; + } else if (argumentType == typeof(BStrWrapper)) { + return VarEnum.VT_BSTR; + } else if (argumentType == typeof(ErrorWrapper)) { + return VarEnum.VT_ERROR; + } else if (argumentType == typeof(CurrencyWrapper)) { + return VarEnum.VT_CY; + } + + // Many languages require an explicit cast for an enum to be used as the underlying type. + // However, we want to allow this conversion for COM without requiring an explicit cast + // so that enums from interop assemblies can be used as arguments. + if (argumentType.IsEnum) { + argumentType = Enum.GetUnderlyingType(argumentType); + return GetComType(ref argumentType); + } + + // COM cannot express valuetype nulls so we will convert to underlying type + // it will throw if there is no value + if (TypeUtils.IsNullableType(argumentType)) { + argumentType = TypeUtils.GetNonNullableType(argumentType); + return GetComType(ref argumentType); + } + + //generic types cannot be exposed to COM so they do not implement COM interfaces. + if (argumentType.IsGenericType) { + return VarEnum.VT_UNKNOWN; + } + + VarEnum primitiveVarEnum; + if (TryGetPrimitiveComType(argumentType, out primitiveVarEnum)) { + return primitiveVarEnum; + } + + // We could not find a way to marshal the type as a specific COM type + return VT_DEFAULT; + } + + /// + /// Get the COM Variant type that argument should be marshaled as for a call to COM + /// + private VariantBuilder GetVariantBuilder(Type argumentType) { + //argumentType is coming from MarshalType, null means the dynamic object holds + //a null value and not byref + if (argumentType == null) { + return new VariantBuilder(VarEnum.VT_EMPTY, new NullArgBuilder()); + } + + if (argumentType == typeof(DBNull)) { + return new VariantBuilder(VarEnum.VT_NULL, new NullArgBuilder()); + } + + ArgBuilder argBuilder; + + if (argumentType.IsByRef) { + Type elementType = argumentType.GetElementType(); + + VarEnum elementVarEnum; + if (elementType == typeof(object) || elementType == typeof(DBNull)) { + //no meaningful value to pass ByRef. + //perhaps the calee will replace it with something. + //need to pass as a variant reference + elementVarEnum = VarEnum.VT_VARIANT; + } else { + elementVarEnum = GetComType(ref elementType); + } + + argBuilder = GetSimpleArgBuilder(elementType, elementVarEnum); + return new VariantBuilder(elementVarEnum | VarEnum.VT_BYREF, argBuilder); + } + + VarEnum varEnum = GetComType(ref argumentType); + argBuilder = GetByValArgBuilder(argumentType, ref varEnum); + + return new VariantBuilder(varEnum, argBuilder); + } + + + // This helper is called when we are looking for a ByVal marhsalling + // In a ByVal case we can take into account conversions or IConvertible if all other + // attempts to find marshalling type failed + private static ArgBuilder GetByValArgBuilder(Type elementType, ref VarEnum elementVarEnum) { + // if VT indicates that marshalling type is unknown + if (elementVarEnum == VT_DEFAULT) { + //trying to find a conversion. + VarEnum convertibleTo; + if (TryGetPrimitiveComTypeViaConversion(elementType, out convertibleTo)) { + elementVarEnum = convertibleTo; + Type marshalType = GetManagedMarshalType(elementVarEnum); + return new ConversionArgBuilder(elementType, GetSimpleArgBuilder(marshalType, elementVarEnum)); + } + + //checking for IConvertible. + if (typeof(IConvertible).IsAssignableFrom(elementType)) { + return new ConvertibleArgBuilder(); + } + } + return GetSimpleArgBuilder(elementType, elementVarEnum); + } + + // This helper can produce a builder for types that are directly supported by Variant. + private static SimpleArgBuilder GetSimpleArgBuilder(Type elementType, VarEnum elementVarEnum) { + SimpleArgBuilder argBuilder; + + switch (elementVarEnum) { + case VarEnum.VT_BSTR: + argBuilder = new StringArgBuilder(elementType); + break; + case VarEnum.VT_BOOL: + argBuilder = new BoolArgBuilder(elementType); + break; + case VarEnum.VT_DATE: + argBuilder = new DateTimeArgBuilder(elementType); + break; + case VarEnum.VT_CY: + argBuilder = new CurrencyArgBuilder(elementType); + break; + case VarEnum.VT_DISPATCH: + argBuilder = new DispatchArgBuilder(elementType); + break; + case VarEnum.VT_UNKNOWN: + argBuilder = new UnknownArgBuilder(elementType); + break; + case VarEnum.VT_VARIANT: + case VarEnum.VT_ARRAY: + case VarEnum.VT_RECORD: + argBuilder = new VariantArgBuilder(elementType); + break; + case VarEnum.VT_ERROR: + argBuilder = new ErrorArgBuilder(elementType); + break; + default: + var marshalType = GetManagedMarshalType(elementVarEnum); + if (elementType == marshalType) { + argBuilder = new SimpleArgBuilder(elementType); + } else { + argBuilder = new ConvertArgBuilder(elementType, marshalType); + } + break; + } + + return argBuilder; + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/Variant.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Variant.cs new file mode 100644 index 00000000000..1dfa33627ef --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/Variant.cs @@ -0,0 +1,985 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Runtime.InteropServices; +using System.Security; +using System.Security.Permissions; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// Variant is the basic COM type for late-binding. It can contain any other COM data type. + /// This type definition precisely matches the unmanaged data layout so that the struct can be passed + /// to and from COM calls. + /// + [StructLayout(LayoutKind.Explicit)] + internal struct Variant { + +#if DEBUG + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2207:InitializeValueTypeStaticFieldsInline")] + static Variant() { + // Variant size is the size of 4 pointers (16 bytes) on a 32-bit processor, + // and 3 pointers (24 bytes) on a 64-bit processor. + int intPtrSize = Marshal.SizeOf(typeof(IntPtr)); + int variantSize = Marshal.SizeOf(typeof(Variant)); + if (intPtrSize == 4) { + Debug.Assert(variantSize == (4 * intPtrSize)); + } else { + Debug.Assert(intPtrSize == 8); + Debug.Assert(variantSize == (3 * intPtrSize)); + } + } +#endif + + // Most of the data types in the Variant are carried in _typeUnion + [FieldOffset(0)] + private TypeUnion _typeUnion; + + // Decimal is the largest data type and it needs to use the space that is normally unused in TypeUnion._wReserved1, etc. + // Hence, it is declared to completely overlap with TypeUnion. A Decimal does not use the first two bytes, and so + // TypeUnion._vt can still be used to encode the type. + [FieldOffset(0)] + private Decimal _decimal; + + [StructLayout(LayoutKind.Sequential)] + private struct TypeUnion { + internal ushort _vt; + internal ushort _wReserved1; + internal ushort _wReserved2; + internal ushort _wReserved3; + + internal UnionTypes _unionTypes; + } + + [StructLayout(LayoutKind.Sequential)] + private struct Record { + private IntPtr _record; + private IntPtr _recordInfo; + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1049:TypesThatOwnNativeResourcesShouldBeDisposable")] + [StructLayout(LayoutKind.Explicit)] + private struct UnionTypes { + #region Generated Variant union types + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_UnionTypes from: generate_comdispatch.py + + [FieldOffset(0)] internal SByte _i1; + [FieldOffset(0)] internal Int16 _i2; + [FieldOffset(0)] internal Int32 _i4; + [FieldOffset(0)] internal Int64 _i8; + [FieldOffset(0)] internal Byte _ui1; + [FieldOffset(0)] internal UInt16 _ui2; + [FieldOffset(0)] internal UInt32 _ui4; + [FieldOffset(0)] internal UInt64 _ui8; + [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources")] + [FieldOffset(0)] internal IntPtr _int; + [FieldOffset(0)] internal UIntPtr _uint; + [FieldOffset(0)] internal Int16 _bool; + [FieldOffset(0)] internal Int32 _error; + [FieldOffset(0)] internal Single _r4; + [FieldOffset(0)] internal Double _r8; + [FieldOffset(0)] internal Int64 _cy; + [FieldOffset(0)] internal Double _date; + [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources")] + [SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + [FieldOffset(0)] internal IntPtr _bstr; + [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources")] + [FieldOffset(0)] internal IntPtr _unknown; + [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources")] + [FieldOffset(0)] internal IntPtr _dispatch; + + // *** END GENERATED CODE *** + + #endregion + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + [FieldOffset(0)] + internal IntPtr _byref; + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + [FieldOffset(0)] + internal Record _record; + } + + public override string ToString() { + return String.Format(CultureInfo.CurrentCulture, "Variant ({0})", VariantType); + } + + /// + /// Primitive types are the basic COM types. It includes valuetypes like ints, but also reference types + /// like BStrs. It does not include composite types like arrays and user-defined COM types (IUnknown/IDispatch). + /// + internal static bool IsPrimitiveType(VarEnum varEnum) { + switch (varEnum) { + #region Generated Variant IsPrimitiveType + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_IsPrimitiveType from: generate_comdispatch.py + + case VarEnum.VT_I1: + case VarEnum.VT_I2: + case VarEnum.VT_I4: + case VarEnum.VT_I8: + case VarEnum.VT_UI1: + case VarEnum.VT_UI2: + case VarEnum.VT_UI4: + case VarEnum.VT_UI8: + case VarEnum.VT_INT: + case VarEnum.VT_UINT: + case VarEnum.VT_BOOL: + case VarEnum.VT_ERROR: + case VarEnum.VT_R4: + case VarEnum.VT_R8: + case VarEnum.VT_DECIMAL: + case VarEnum.VT_CY: + case VarEnum.VT_DATE: + case VarEnum.VT_BSTR: + + // *** END GENERATED CODE *** + + #endregion + return true; + } + + return false; + } + + /// + /// Get the managed object representing the Variant. + /// + /// + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public object ToObject() { + // Check the simple case upfront + if (IsEmpty) { + return null; + } + + switch (VariantType) { + case VarEnum.VT_NULL: return DBNull.Value; + + #region Generated Variant ToObject + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_ToObject from: generate_comdispatch.py + + case VarEnum.VT_I1: return AsI1; + case VarEnum.VT_I2: return AsI2; + case VarEnum.VT_I4: return AsI4; + case VarEnum.VT_I8: return AsI8; + case VarEnum.VT_UI1: return AsUi1; + case VarEnum.VT_UI2: return AsUi2; + case VarEnum.VT_UI4: return AsUi4; + case VarEnum.VT_UI8: return AsUi8; + case VarEnum.VT_INT: return AsInt; + case VarEnum.VT_UINT: return AsUint; + case VarEnum.VT_BOOL: return AsBool; + case VarEnum.VT_ERROR: return AsError; + case VarEnum.VT_R4: return AsR4; + case VarEnum.VT_R8: return AsR8; + case VarEnum.VT_DECIMAL: return AsDecimal; + case VarEnum.VT_CY: return AsCy; + case VarEnum.VT_DATE: return AsDate; + case VarEnum.VT_BSTR: return AsBstr; + case VarEnum.VT_UNKNOWN: return AsUnknown; + case VarEnum.VT_DISPATCH: return AsDispatch; + case VarEnum.VT_VARIANT: return AsVariant; + + // *** END GENERATED CODE *** + + #endregion + + default: + return AsVariant; + } + } + + /// + /// Release any unmanaged memory associated with the Variant + /// + /// +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void Clear() { + // We do not need to call OLE32's VariantClear for primitive types or ByRefs + // to safe ourselves the cost of interop transition. + // ByRef indicates the memory is not owned by the VARIANT itself while + // primitive types do not have any resources to free up. + // Hence, only safearrays, BSTRs, interfaces and user types are + // handled differently. + VarEnum vt = VariantType; + if ((vt & VarEnum.VT_BYREF) != 0) { + VariantType = VarEnum.VT_EMPTY; + } else if ( + ((vt & VarEnum.VT_ARRAY) != 0) || + ((vt) == VarEnum.VT_BSTR) || + ((vt) == VarEnum.VT_UNKNOWN) || + ((vt) == VarEnum.VT_DISPATCH) || + ((vt) == VarEnum.VT_RECORD) + ) { + IntPtr variantPtr = UnsafeMethods.ConvertVariantByrefToPtr(ref this); + NativeMethods.VariantClear(variantPtr); + Debug.Assert(IsEmpty); + } else { + VariantType = VarEnum.VT_EMPTY; + } + } + + public VarEnum VariantType { + get { + return (VarEnum)_typeUnion._vt; + } + set { + _typeUnion._vt = (ushort)value; + } + } + + internal bool IsEmpty { + get { + return _typeUnion._vt == ((ushort)VarEnum.VT_EMPTY); + } + } + + public void SetAsNull() { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_NULL; + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsIConvertible(IConvertible value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + + TypeCode tc = value.GetTypeCode(); + CultureInfo ci = CultureInfo.CurrentCulture; + + switch (tc) { + case TypeCode.Empty: break; + case TypeCode.Object: AsUnknown = value; break; + case TypeCode.DBNull: SetAsNull(); break; + case TypeCode.Boolean: AsBool = value.ToBoolean(ci); break; + case TypeCode.Char: AsUi2 = value.ToChar(ci); break; + case TypeCode.SByte: AsI1 = value.ToSByte(ci); break; + case TypeCode.Byte: AsUi1 = value.ToByte(ci); break; + case TypeCode.Int16: AsI2 = value.ToInt16(ci); break; + case TypeCode.UInt16: AsUi2 = value.ToUInt16(ci); break; + case TypeCode.Int32: AsI4 = value.ToInt32(ci); break; + case TypeCode.UInt32: AsUi4 = value.ToUInt32(ci); break; + case TypeCode.Int64: AsI8 = value.ToInt64(ci); break; + case TypeCode.UInt64: AsI8 = value.ToInt64(ci); break; + case TypeCode.Single: AsR4 = value.ToSingle(ci); break; + case TypeCode.Double: AsR8 = value.ToDouble(ci); break; + case TypeCode.Decimal: AsDecimal = value.ToDecimal(ci); break; + case TypeCode.DateTime: AsDate = value.ToDateTime(ci); break; + case TypeCode.String: AsBstr = value.ToString(ci); break; + + default: + throw Assert.Unreachable; + } + } + + #region Generated Variant accessors + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_accessors from: generate_comdispatch.py + + // VT_I1 + public SByte AsI1 { + get { + Debug.Assert(VariantType == VarEnum.VT_I1); + return _typeUnion._unionTypes._i1; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_I1; + _typeUnion._unionTypes._i1 = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefI1(ref SByte value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_I1 | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertSByteByrefToPtr(ref value); + } + + // VT_I2 + public Int16 AsI2 { + get { + Debug.Assert(VariantType == VarEnum.VT_I2); + return _typeUnion._unionTypes._i2; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_I2; + _typeUnion._unionTypes._i2 = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefI2(ref Int16 value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_I2 | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertInt16ByrefToPtr(ref value); + } + + // VT_I4 + public Int32 AsI4 { + get { + Debug.Assert(VariantType == VarEnum.VT_I4); + return _typeUnion._unionTypes._i4; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_I4; + _typeUnion._unionTypes._i4 = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefI4(ref Int32 value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_I4 | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertInt32ByrefToPtr(ref value); + } + + // VT_I8 + public Int64 AsI8 { + get { + Debug.Assert(VariantType == VarEnum.VT_I8); + return _typeUnion._unionTypes._i8; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_I8; + _typeUnion._unionTypes._i8 = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefI8(ref Int64 value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_I8 | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertInt64ByrefToPtr(ref value); + } + + // VT_UI1 + public Byte AsUi1 { + get { + Debug.Assert(VariantType == VarEnum.VT_UI1); + return _typeUnion._unionTypes._ui1; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_UI1; + _typeUnion._unionTypes._ui1 = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefUi1(ref Byte value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_UI1 | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertByteByrefToPtr(ref value); + } + + // VT_UI2 + public UInt16 AsUi2 { + get { + Debug.Assert(VariantType == VarEnum.VT_UI2); + return _typeUnion._unionTypes._ui2; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_UI2; + _typeUnion._unionTypes._ui2 = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefUi2(ref UInt16 value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_UI2 | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertUInt16ByrefToPtr(ref value); + } + + // VT_UI4 + public UInt32 AsUi4 { + get { + Debug.Assert(VariantType == VarEnum.VT_UI4); + return _typeUnion._unionTypes._ui4; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_UI4; + _typeUnion._unionTypes._ui4 = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefUi4(ref UInt32 value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_UI4 | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertUInt32ByrefToPtr(ref value); + } + + // VT_UI8 + public UInt64 AsUi8 { + get { + Debug.Assert(VariantType == VarEnum.VT_UI8); + return _typeUnion._unionTypes._ui8; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_UI8; + _typeUnion._unionTypes._ui8 = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefUi8(ref UInt64 value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_UI8 | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertUInt64ByrefToPtr(ref value); + } + + // VT_INT + public IntPtr AsInt { + get { + Debug.Assert(VariantType == VarEnum.VT_INT); + return _typeUnion._unionTypes._int; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_INT; + _typeUnion._unionTypes._int = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefInt(ref IntPtr value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_INT | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertIntPtrByrefToPtr(ref value); + } + + // VT_UINT + public UIntPtr AsUint { + get { + Debug.Assert(VariantType == VarEnum.VT_UINT); + return _typeUnion._unionTypes._uint; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_UINT; + _typeUnion._unionTypes._uint = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefUint(ref UIntPtr value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_UINT | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertUIntPtrByrefToPtr(ref value); + } + + // VT_BOOL + public Boolean AsBool { + get { + Debug.Assert(VariantType == VarEnum.VT_BOOL); + return _typeUnion._unionTypes._bool != 0; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_BOOL; + _typeUnion._unionTypes._bool = value ? (Int16)(-1) : (Int16)0; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefBool(ref Int16 value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_BOOL | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertInt16ByrefToPtr(ref value); + } + + // VT_ERROR + public Int32 AsError { + get { + Debug.Assert(VariantType == VarEnum.VT_ERROR); + return _typeUnion._unionTypes._error; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_ERROR; + _typeUnion._unionTypes._error = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefError(ref Int32 value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_ERROR | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertInt32ByrefToPtr(ref value); + } + + // VT_R4 + public Single AsR4 { + get { + Debug.Assert(VariantType == VarEnum.VT_R4); + return _typeUnion._unionTypes._r4; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_R4; + _typeUnion._unionTypes._r4 = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefR4(ref Single value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_R4 | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertSingleByrefToPtr(ref value); + } + + // VT_R8 + public Double AsR8 { + get { + Debug.Assert(VariantType == VarEnum.VT_R8); + return _typeUnion._unionTypes._r8; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_R8; + _typeUnion._unionTypes._r8 = value; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefR8(ref Double value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_R8 | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertDoubleByrefToPtr(ref value); + } + + // VT_DECIMAL + public Decimal AsDecimal { + get { + Debug.Assert(VariantType == VarEnum.VT_DECIMAL); + // The first byte of Decimal is unused, but usually set to 0 + Variant v = this; + v._typeUnion._vt = 0; + return v._decimal; + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_DECIMAL; + _decimal = value; + // _vt overlaps with _decimal, and should be set after setting _decimal + _typeUnion._vt = (ushort)VarEnum.VT_DECIMAL; + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefDecimal(ref Decimal value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_DECIMAL | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertDecimalByrefToPtr(ref value); + } + + // VT_CY + public Decimal AsCy { + get { + Debug.Assert(VariantType == VarEnum.VT_CY); + return Decimal.FromOACurrency(_typeUnion._unionTypes._cy); + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_CY; + _typeUnion._unionTypes._cy = Decimal.ToOACurrency(value); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefCy(ref Int64 value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_CY | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertInt64ByrefToPtr(ref value); + } + + // VT_DATE + public DateTime AsDate { + get { + Debug.Assert(VariantType == VarEnum.VT_DATE); + return DateTime.FromOADate(_typeUnion._unionTypes._date); + } + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_DATE; + _typeUnion._unionTypes._date = value.ToOADate(); + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefDate(ref Double value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_DATE | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertDoubleByrefToPtr(ref value); + } + + // VT_BSTR + public String AsBstr { + #if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] + #endif + [SecurityCritical] + get { + Debug.Assert(VariantType == VarEnum.VT_BSTR); + if (_typeUnion._unionTypes._bstr != IntPtr.Zero) { + return Marshal.PtrToStringBSTR(_typeUnion._unionTypes._bstr); + } else { + return null; + } + } + #if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] + #endif + [SecurityCritical] + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_BSTR; + if (value != null) { + Marshal.GetNativeVariantForObject(value, UnsafeMethods.ConvertVariantByrefToPtr(ref this)); + } + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefBstr(ref IntPtr value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_BSTR | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertIntPtrByrefToPtr(ref value); + } + + // VT_UNKNOWN + public Object AsUnknown { + #if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] + #endif + [SecurityCritical] + get { + Debug.Assert(VariantType == VarEnum.VT_UNKNOWN); + if (_typeUnion._unionTypes._dispatch != IntPtr.Zero) { + return Marshal.GetObjectForIUnknown(_typeUnion._unionTypes._unknown); + } else { + return null; + } + } + #if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] + #endif + [SecurityCritical] + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_UNKNOWN; + if (value != null) { + _typeUnion._unionTypes._unknown = Marshal.GetIUnknownForObject(value); + } + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefUnknown(ref IntPtr value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_UNKNOWN | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertIntPtrByrefToPtr(ref value); + } + + // VT_DISPATCH + public Object AsDispatch { + #if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] + #endif + [SecurityCritical] + get { + Debug.Assert(VariantType == VarEnum.VT_DISPATCH); + if (_typeUnion._unionTypes._dispatch != IntPtr.Zero) { + return Marshal.GetObjectForIUnknown(_typeUnion._unionTypes._dispatch); + } else { + return null; + } + } + #if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] + #endif + [SecurityCritical] + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = VarEnum.VT_DISPATCH; + if (value != null) { + _typeUnion._unionTypes._unknown = Marshal.GetIDispatchForObject(value); + } + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefDispatch(ref IntPtr value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_DISPATCH | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertIntPtrByrefToPtr(ref value); + } + + + // *** END GENERATED CODE *** + + #endregion + + + // VT_VARIANT + + public Object AsVariant { +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + get { + return Marshal.GetObjectForNativeVariant(UnsafeMethods.ConvertVariantByrefToPtr(ref this)); + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + set { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + if (value != null) { + UnsafeMethods.InitVariantForObject(value, ref this); + } + } + } + +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefVariant(ref Variant value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + VariantType = (VarEnum.VT_VARIANT | VarEnum.VT_BYREF); + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertVariantByrefToPtr(ref value); + } + + // constructs a ByRef variant to pass contents of another variant ByRef. +#if MICROSOFT_DYNAMIC + [PermissionSet(SecurityAction.LinkDemand, Unrestricted = true)] +#endif + [SecurityCritical] + public void SetAsByrefVariantIndirect(ref Variant value) { + Debug.Assert(IsEmpty); // The setter can only be called once as VariantClear might be needed otherwise + Debug.Assert((value.VariantType & VarEnum.VT_BYREF) == 0, "double indirection"); + + switch (value.VariantType) { + case VarEnum.VT_EMPTY: + case VarEnum.VT_NULL: + // these cannot combine with VT_BYREF. Should try passing as a variant reference + SetAsByrefVariant(ref value); + return; + case VarEnum.VT_RECORD: + // VT_RECORD's are weird in that regardless of is the VT_BYREF flag is set or not + // they have the same internal representation. + _typeUnion._unionTypes._record = value._typeUnion._unionTypes._record; + break; + case VarEnum.VT_DECIMAL: + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertDecimalByrefToPtr(ref value._decimal); + break; + default: + _typeUnion._unionTypes._byref = UnsafeMethods.ConvertIntPtrByrefToPtr(ref value._typeUnion._unionTypes._byref); + break; + } + VariantType = (value.VariantType | VarEnum.VT_BYREF); + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + internal static System.Reflection.PropertyInfo GetAccessor(VarEnum varType) { + switch (varType) { + + #region Generated Variant accessors PropertyInfos + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_accessor_propertyinfo from: generate_comdispatch.py + + case VarEnum.VT_I1: return typeof(Variant).GetProperty("AsI1"); + case VarEnum.VT_I2: return typeof(Variant).GetProperty("AsI2"); + case VarEnum.VT_I4: return typeof(Variant).GetProperty("AsI4"); + case VarEnum.VT_I8: return typeof(Variant).GetProperty("AsI8"); + case VarEnum.VT_UI1: return typeof(Variant).GetProperty("AsUi1"); + case VarEnum.VT_UI2: return typeof(Variant).GetProperty("AsUi2"); + case VarEnum.VT_UI4: return typeof(Variant).GetProperty("AsUi4"); + case VarEnum.VT_UI8: return typeof(Variant).GetProperty("AsUi8"); + case VarEnum.VT_INT: return typeof(Variant).GetProperty("AsInt"); + case VarEnum.VT_UINT: return typeof(Variant).GetProperty("AsUint"); + case VarEnum.VT_BOOL: return typeof(Variant).GetProperty("AsBool"); + case VarEnum.VT_ERROR: return typeof(Variant).GetProperty("AsError"); + case VarEnum.VT_R4: return typeof(Variant).GetProperty("AsR4"); + case VarEnum.VT_R8: return typeof(Variant).GetProperty("AsR8"); + case VarEnum.VT_DECIMAL: return typeof(Variant).GetProperty("AsDecimal"); + case VarEnum.VT_CY: return typeof(Variant).GetProperty("AsCy"); + case VarEnum.VT_DATE: return typeof(Variant).GetProperty("AsDate"); + case VarEnum.VT_BSTR: return typeof(Variant).GetProperty("AsBstr"); + case VarEnum.VT_UNKNOWN: return typeof(Variant).GetProperty("AsUnknown"); + case VarEnum.VT_DISPATCH: return typeof(Variant).GetProperty("AsDispatch"); + + // *** END GENERATED CODE *** + + #endregion + + case VarEnum.VT_VARIANT: + case VarEnum.VT_RECORD: + case VarEnum.VT_ARRAY: + return typeof(Variant).GetProperty("AsVariant"); + + default: + throw Error.VariantGetAccessorNYI(varType); + } + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + internal static System.Reflection.MethodInfo GetByrefSetter(VarEnum varType) { + switch (varType) { + + #region Generated Variant byref setter + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_byref_setters from: generate_comdispatch.py + + case VarEnum.VT_I1: return typeof(Variant).GetMethod("SetAsByrefI1"); + case VarEnum.VT_I2: return typeof(Variant).GetMethod("SetAsByrefI2"); + case VarEnum.VT_I4: return typeof(Variant).GetMethod("SetAsByrefI4"); + case VarEnum.VT_I8: return typeof(Variant).GetMethod("SetAsByrefI8"); + case VarEnum.VT_UI1: return typeof(Variant).GetMethod("SetAsByrefUi1"); + case VarEnum.VT_UI2: return typeof(Variant).GetMethod("SetAsByrefUi2"); + case VarEnum.VT_UI4: return typeof(Variant).GetMethod("SetAsByrefUi4"); + case VarEnum.VT_UI8: return typeof(Variant).GetMethod("SetAsByrefUi8"); + case VarEnum.VT_INT: return typeof(Variant).GetMethod("SetAsByrefInt"); + case VarEnum.VT_UINT: return typeof(Variant).GetMethod("SetAsByrefUint"); + case VarEnum.VT_BOOL: return typeof(Variant).GetMethod("SetAsByrefBool"); + case VarEnum.VT_ERROR: return typeof(Variant).GetMethod("SetAsByrefError"); + case VarEnum.VT_R4: return typeof(Variant).GetMethod("SetAsByrefR4"); + case VarEnum.VT_R8: return typeof(Variant).GetMethod("SetAsByrefR8"); + case VarEnum.VT_DECIMAL: return typeof(Variant).GetMethod("SetAsByrefDecimal"); + case VarEnum.VT_CY: return typeof(Variant).GetMethod("SetAsByrefCy"); + case VarEnum.VT_DATE: return typeof(Variant).GetMethod("SetAsByrefDate"); + case VarEnum.VT_BSTR: return typeof(Variant).GetMethod("SetAsByrefBstr"); + case VarEnum.VT_UNKNOWN: return typeof(Variant).GetMethod("SetAsByrefUnknown"); + case VarEnum.VT_DISPATCH: return typeof(Variant).GetMethod("SetAsByrefDispatch"); + + // *** END GENERATED CODE *** + + #endregion + + case VarEnum.VT_VARIANT: + return typeof(Variant).GetMethod("SetAsByrefVariant"); + case VarEnum.VT_RECORD: + case VarEnum.VT_ARRAY: + return typeof(Variant).GetMethod("SetAsByrefVariantIndirect"); + + default: + throw Error.VariantGetAccessorNYI(varType); + } + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/VariantArgBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/VariantArgBuilder.cs new file mode 100644 index 00000000000..978ea4076ff --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/VariantArgBuilder.cs @@ -0,0 +1,94 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.InteropServices; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal class VariantArgBuilder : SimpleArgBuilder { + private readonly bool _isWrapper; + + internal VariantArgBuilder(Type parameterType) + : base(parameterType) { + + _isWrapper = parameterType == typeof(VariantWrapper); + } + + internal override Expression Marshal(Expression parameter) { + parameter = base.Marshal(parameter); + + // parameter.WrappedObject + if (_isWrapper) { + parameter = Expression.Property( + Helpers.Convert(parameter, typeof(VariantWrapper)), + typeof(VariantWrapper).GetProperty("WrappedObject") + ); + }; + + return Helpers.Convert(parameter, typeof(object)); + } + + internal override Expression MarshalToRef(Expression parameter) { + parameter = Marshal(parameter); + + // parameter == UnsafeMethods.GetVariantForObject(parameter); + return Expression.Call( + typeof(UnsafeMethods).GetMethod("GetVariantForObject", BindingFlags.Static | System.Reflection.BindingFlags.NonPublic), + parameter + ); + } + + + internal override Expression UnmarshalFromRef(Expression value) { + // value == IntPtr.Zero ? null : Marshal.GetObjectForNativeVariant(value); + + Expression unmarshal = Expression.Call( + typeof(UnsafeMethods).GetMethod("GetObjectForVariant"), + value + ); + + if (_isWrapper) { + unmarshal = Expression.New( + typeof(VariantWrapper).GetConstructor(new Type[] { typeof(object) }), + unmarshal + ); + }; + + return base.UnmarshalFromRef(unmarshal); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/VariantArray.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/VariantArray.cs new file mode 100644 index 00000000000..d108eaadd4d --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/VariantArray.cs @@ -0,0 +1,114 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.InteropServices; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + [StructLayout(LayoutKind.Sequential)] + internal struct VariantArray1 { + public Variant Element0; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct VariantArray2 { + public Variant Element0, Element1; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct VariantArray4 { + public Variant Element0, Element1, Element2, Element3; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct VariantArray8 { + public Variant Element0, Element1, Element2, Element3, Element4, Element5, Element6, Element7; + } + + // + // Helper for getting the right VariantArray struct for a given number of + // arguments. Will generate a struct if needed. + // + // We use this because we don't have stackalloc or pinning in Expression + // Trees, so we can't create an array of Variants directly. + // + internal static class VariantArray { + // Don't need a dictionary for this, it will have very few elements + // (guarenteed less than 28, in practice 0-2) + private static readonly List _generatedTypes = new List(0); + + internal static MemberExpression GetStructField(ParameterExpression variantArray, int field) { + return Expression.Field(variantArray, "Element" + field); + } + + internal static Type GetStructType(int args) { + Debug.Assert(args >= 0); + if (args <= 1) return typeof(VariantArray1); + if (args <= 2) return typeof(VariantArray2); + if (args <= 4) return typeof(VariantArray4); + if (args <= 8) return typeof(VariantArray8); + + int size = 1; + while (args > size) { + size *= 2; + } + + lock (_generatedTypes) { + // See if we can find an existing type + foreach (Type t in _generatedTypes) { + int arity = int.Parse(t.Name.Substring("VariantArray".Length), CultureInfo.InvariantCulture); + if (size == arity) { + return t; + } + } + + // Else generate a new type + Type type = CreateCustomType(size).MakeGenericType(new Type[]{typeof(Variant)}); + _generatedTypes.Add(type); + return type; + } + } + + private static Type CreateCustomType(int size) { + var attrs = TypeAttributes.NotPublic | TypeAttributes.SequentialLayout; + TypeBuilder type = UnsafeMethods.DynamicModule.DefineType("VariantArray" + size, attrs, typeof(ValueType)); + var T = type.DefineGenericParameters(new string[] { "T" })[0]; + for (int i = 0; i < size; i++) { + type.DefineField("Element" + i, T, FieldAttributes.Public); + } + return type.CreateType(); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Dynamic/VariantBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Dynamic/VariantBuilder.cs new file mode 100644 index 00000000000..6b91d1045ad --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Dynamic/VariantBuilder.cs @@ -0,0 +1,177 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if !SILVERLIGHT // ComObject + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.InteropServices; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// VariantBuilder handles packaging of arguments into a Variant for a call to IDispatch.Invoke + /// + internal class VariantBuilder { + + private MemberExpression _variant; + private readonly ArgBuilder _argBuilder; + private readonly VarEnum _targetComType; + internal ParameterExpression TempVariable { get; private set; } + + internal VariantBuilder(VarEnum targetComType, ArgBuilder builder) { + _targetComType = targetComType; + _argBuilder = builder; + } + + internal bool IsByRef { + get { return (_targetComType & VarEnum.VT_BYREF) != 0; } + } + + internal Expression InitializeArgumentVariant(MemberExpression variant, Expression parameter) { + //NOTE: we must remember our variant + //the reason is that argument order does not map exactly to the order of variants for invoke + //and when we are doing clean-up we must be sure we are cleaning the variant we have initialized. + + _variant = variant; + + if (IsByRef) { + // temp = argument + // paramVariants._elementN.SetAsByrefT(ref temp) + Debug.Assert(TempVariable == null); + var argExpr = _argBuilder.MarshalToRef(parameter); + + TempVariable = Expression.Variable(argExpr.Type, null); + return Expression.Block( + Expression.Assign(TempVariable, argExpr), + Expression.Call( + variant, + Variant.GetByrefSetter(_targetComType & ~VarEnum.VT_BYREF), + TempVariable + ) + ); + } + + Expression argument = _argBuilder.Marshal(parameter); + + // we are forced to special case ConvertibleArgBuilder since it does not have + // a corresponding _targetComType. + if (_argBuilder is ConvertibleArgBuilder) { + return Expression.Call( + variant, + typeof(Variant).GetMethod("SetAsIConvertible"), + argument + ); + } + + if (Variant.IsPrimitiveType(_targetComType) || + (_targetComType == VarEnum.VT_DISPATCH) || + (_targetComType == VarEnum.VT_UNKNOWN) || + (_targetComType == VarEnum.VT_VARIANT) || + (_targetComType == VarEnum.VT_RECORD) || + (_targetComType == VarEnum.VT_ARRAY)){ + // paramVariants._elementN.AsT = (cast)argN + return Expression.Assign( + Expression.Property( + variant, + Variant.GetAccessor(_targetComType) + ), + argument + ); + } + + switch (_targetComType) { + case VarEnum.VT_EMPTY: + return null; + + case VarEnum.VT_NULL: + // paramVariants._elementN.SetAsNull(); + return Expression.Call(variant, typeof(Variant).GetMethod("SetAsNull")); + + default: + Debug.Assert(false, "Unexpected VarEnum"); + return null; + } + } + + private static Expression Release(Expression pUnk) { + return Expression.Call(typeof(UnsafeMethods).GetMethod("IUnknownReleaseNotZero"), pUnk); + } + + internal Expression Clear() { + if (IsByRef) { + if (_argBuilder is StringArgBuilder) { + Debug.Assert(TempVariable != null); + return Expression.Call(typeof(Marshal).GetMethod("FreeBSTR"), TempVariable); + } else if (_argBuilder is DispatchArgBuilder) { + Debug.Assert(TempVariable != null); + return Release(TempVariable); + } else if (_argBuilder is UnknownArgBuilder) { + Debug.Assert(TempVariable != null); + return Release(TempVariable); + } else if (_argBuilder is VariantArgBuilder) { + Debug.Assert(TempVariable != null); + return Expression.Call(TempVariable, typeof(Variant).GetMethod("Clear")); + } + return null; + } + + + switch (_targetComType) { + case VarEnum.VT_EMPTY: + case VarEnum.VT_NULL: + return null; + + case VarEnum.VT_BSTR: + case VarEnum.VT_UNKNOWN: + case VarEnum.VT_DISPATCH: + case VarEnum.VT_ARRAY: + case VarEnum.VT_RECORD: + case VarEnum.VT_VARIANT: + // paramVariants._elementN.Clear() + return Expression.Call(_variant, typeof(Variant).GetMethod("Clear")); + + default: + Debug.Assert(Variant.IsPrimitiveType(_targetComType), "Unexpected VarEnum"); + return null; + } + } + + internal Expression UpdateFromReturn(Expression parameter) { + if (TempVariable == null) { + return null; + } + return Expression.Assign( + parameter, + Helpers.Convert( + _argBuilder.UnmarshalFromRef(TempVariable), + parameter.Type + ) + ); + } + } +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/BinaryOperationBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/BinaryOperationBinder.cs new file mode 100644 index 00000000000..b9b7df7e7aa --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/BinaryOperationBinder.cs @@ -0,0 +1,154 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +using System.Linq.Expressions; +#else +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Represents the binary dynamic operation at the call site, providing the binding semantic and the details about the operation. + /// + public abstract class BinaryOperationBinder : DynamicMetaObjectBinder { + private ExpressionType _operation; + + /// + /// Initializes a new instance of the class. + /// + /// The binary operation kind. + protected BinaryOperationBinder(ExpressionType operation) { + ContractUtils.Requires(OperationIsValid(operation), "operation"); + _operation = operation; + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { return typeof(object); } + } + + /// + /// The binary operation kind. + /// + public ExpressionType Operation { + get { + return _operation; + } + } + + /// + /// Performs the binding of the binary dynamic operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic binary operation. + /// The right hand side operand of the dynamic binary operation. + /// The representing the result of the binding. + public DynamicMetaObject FallbackBinaryOperation(DynamicMetaObject target, DynamicMetaObject arg) { + return FallbackBinaryOperation(target, arg, null); + } + + /// + /// When overridden in the derived class, performs the binding of the binary dynamic operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic binary operation. + /// The right hand side operand of the dynamic binary operation. + /// The binding result in case the binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackBinaryOperation(DynamicMetaObject target, DynamicMetaObject arg, DynamicMetaObject errorSuggestion); + + /// + /// Performs the binding of the dynamic binary operation. + /// + /// The target of the dynamic operation. + /// An array of arguments of the dynamic operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.RequiresNotNull(args, "args"); + ContractUtils.Requires(args.Length == 1, "args"); + + var arg0 = args[0]; + ContractUtils.RequiresNotNull(arg0, "args"); + + return target.BindBinaryOperation(this, arg0); + } + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + internal static bool OperationIsValid(ExpressionType operation) { + switch (operation) { + #region Generated Binary Operation Binder Validator + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_binop_validator from: generate_tree.py + + case ExpressionType.Add: + case ExpressionType.And: + case ExpressionType.Divide: + case ExpressionType.Equal: + case ExpressionType.ExclusiveOr: + case ExpressionType.GreaterThan: + case ExpressionType.GreaterThanOrEqual: + case ExpressionType.LeftShift: + case ExpressionType.LessThan: + case ExpressionType.LessThanOrEqual: + case ExpressionType.Modulo: + case ExpressionType.Multiply: + case ExpressionType.NotEqual: + case ExpressionType.Or: + case ExpressionType.Power: + case ExpressionType.RightShift: + case ExpressionType.Subtract: + case ExpressionType.AddAssign: + case ExpressionType.AndAssign: + case ExpressionType.DivideAssign: + case ExpressionType.ExclusiveOrAssign: + case ExpressionType.LeftShiftAssign: + case ExpressionType.ModuloAssign: + case ExpressionType.MultiplyAssign: + case ExpressionType.OrAssign: + case ExpressionType.PowerAssign: + case ExpressionType.RightShiftAssign: + case ExpressionType.SubtractAssign: + + // *** END GENERATED CODE *** + + #endregion + + case ExpressionType.Extension: + return true; + + default: + return false; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/BindingRestrictions.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/BindingRestrictions.cs new file mode 100644 index 00000000000..7d4ae41edde --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/BindingRestrictions.cs @@ -0,0 +1,377 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +using System.Linq.Expressions; +#else +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// Represents a set of binding restrictions on the under which the dynamic binding is valid. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(BindingRestrictionsProxy)), DebuggerDisplay("{DebugView}")] +#endif + public abstract class BindingRestrictions { + /// + /// Represents an empty set of binding restrictions. This field is read only. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")] + public static readonly BindingRestrictions Empty = new CustomRestriction(Expression.Constant(true)); + + private const int TypeRestrictionHash = 0x10000000; + private const int InstanceRestrictionHash = 0x20000000; + private const int CustomRestrictionHash = 0x40000000; + + private BindingRestrictions() { + } + + // Overridden by specialized subclasses + internal abstract Expression GetExpression(); + + /// + /// Merges the set of binding restrictions with the current binding restrictions. + /// + /// The set of restrictions with which to merge the current binding restrictions. + /// The new set of binding restrictions. + public BindingRestrictions Merge(BindingRestrictions restrictions) { + ContractUtils.RequiresNotNull(restrictions, "restrictions"); + if (this == Empty) { + return restrictions; + } + if (restrictions == Empty) { + return this; + } + return new MergedRestriction(this, restrictions); + } + + /// + /// Creates the binding restriction that check the expression for runtime type identity. + /// + /// The expression to test. + /// The exact type to test. + /// The new binding restrictions. + public static BindingRestrictions GetTypeRestriction(Expression expression, Type type) { + ContractUtils.RequiresNotNull(expression, "expression"); + ContractUtils.RequiresNotNull(type, "type"); + + return new TypeRestriction(expression, type); + } + + /// + /// The method takes a DynamicMetaObject, and returns an instance restriction for testing null if the object + /// holds a null value, otherwise returns a type restriction. + /// + internal static BindingRestrictions GetTypeRestriction(DynamicMetaObject obj) { + if (obj.Value == null && obj.HasValue) { + return BindingRestrictions.GetInstanceRestriction(obj.Expression, null); + } else { + return BindingRestrictions.GetTypeRestriction(obj.Expression, obj.LimitType); + } + } + + /// + /// Creates the binding restriction that checks the expression for object instance identity. + /// + /// The expression to test. + /// The exact object instance to test. + /// The new binding restrictions. + public static BindingRestrictions GetInstanceRestriction(Expression expression, object instance) { + ContractUtils.RequiresNotNull(expression, "expression"); + + return new InstanceRestriction(expression, instance); + } + + /// + /// Creates the binding restriction that checks the expression for arbitrary immutable properties. + /// + /// The expression expression the restrictions. + /// The new binding restrictions. + /// + /// By convention, the general restrictions created by this method must only test + /// immutable object properties. + /// + public static BindingRestrictions GetExpressionRestriction(Expression expression) { + ContractUtils.RequiresNotNull(expression, "expression"); + ContractUtils.Requires(expression.Type == typeof(bool), "expression"); + return new CustomRestriction(expression); + } + + /// + /// Combines binding restrictions from the list of instances into one set of restrictions. + /// + /// The list of instances from which to combine restrictions. + /// The new set of binding restrictions. + public static BindingRestrictions Combine(IList contributingObjects) { + BindingRestrictions res = BindingRestrictions.Empty; + if (contributingObjects != null) { + foreach (DynamicMetaObject mo in contributingObjects) { + if (mo != null) { + res = res.Merge(mo.Restrictions); + } + } + } + return res; + } + + /// + /// Builds a balanced tree of AndAlso nodes. + /// We do this so the compiler won't stack overflow if we have many + /// restrictions. + /// + private sealed class TestBuilder { + private readonly Set _unique = new Set(); + private readonly Stack _tests = new Stack(); + + private struct AndNode { + internal int Depth; + internal Expression Node; + } + + internal void Append(BindingRestrictions restrictions) { + if (_unique.Contains(restrictions)) { + return; + } + _unique.Add(restrictions); + + Push(restrictions.GetExpression(), 0); + } + + internal Expression ToExpression() { + Expression result = _tests.Pop().Node; + while (_tests.Count > 0) { + result = Expression.AndAlso(_tests.Pop().Node, result); + } + return result; + } + + private void Push(Expression node, int depth) { + while (_tests.Count > 0 && _tests.Peek().Depth == depth) { + node = Expression.AndAlso(_tests.Pop().Node, node); + depth++; + } + _tests.Push(new AndNode { Node = node, Depth = depth }); + } + } + + /// + /// Creates the representing the binding restrictions. + /// + /// The expression tree representing the restrictions. + public Expression ToExpression() { + // We could optimize this better, e.g. common subexpression elimination + // But for now, it's good enough. + + if (this == Empty) { + return Expression.Constant(true); + } + + var testBuilder = new TestBuilder(); + + // Visit the tree, left to right. + // Use an explicit stack so we don't stack overflow. + // + // Left-most node is on top of the stack, so we always expand the + // left most node each iteration. + var stack = new Stack(); + stack.Push(this); + do { + var top = stack.Pop(); + var m = top as MergedRestriction; + if (m != null) { + stack.Push(m.Right); + stack.Push(m.Left); + } else { + testBuilder.Append(top); + } + } while (stack.Count > 0); + + return testBuilder.ToExpression(); + } + + private sealed class MergedRestriction : BindingRestrictions { + internal readonly BindingRestrictions Left; + internal readonly BindingRestrictions Right; + + internal MergedRestriction(BindingRestrictions left, BindingRestrictions right) { + Left = left; + Right = right; + } + internal override Expression GetExpression() { + throw ContractUtils.Unreachable; + } + } + + private sealed class CustomRestriction : BindingRestrictions { + private readonly Expression _expression; + + internal CustomRestriction(Expression expression) { + _expression = expression; + } + + public override bool Equals(object obj) { + var other = obj as CustomRestriction; + return other != null && other._expression == _expression; + } + + public override int GetHashCode() { + return CustomRestrictionHash ^ _expression.GetHashCode(); + } + + internal override Expression GetExpression() { + return _expression; + } + } + + private sealed class TypeRestriction : BindingRestrictions { + private readonly Expression _expression; + private readonly Type _type; + + internal TypeRestriction(Expression parameter, Type type) { + _expression = parameter; + _type = type; + } + + public override bool Equals(object obj) { + var other = obj as TypeRestriction; + return other != null && TypeUtils.AreEquivalent(other._type, _type) && other._expression == _expression; + } + + public override int GetHashCode() { + return TypeRestrictionHash ^ _expression.GetHashCode() ^ _type.GetHashCode(); + } + + internal override Expression GetExpression() { + return Expression.TypeEqual(_expression, _type); + } + } + + private sealed class InstanceRestriction : BindingRestrictions { + private readonly Expression _expression; + private readonly object _instance; + + internal InstanceRestriction(Expression parameter, object instance) { + _expression = parameter; + _instance = instance; + } + + public override bool Equals(object obj) { + var other = obj as InstanceRestriction; + return other != null && other._instance == _instance && other._expression == _expression; + } + + public override int GetHashCode() { + return InstanceRestrictionHash ^ RuntimeHelpers.GetHashCode(_instance) ^ _expression.GetHashCode(); + } + + internal override Expression GetExpression() { + if (_instance == null) { + return Expression.Equal( + Expression.Convert(_expression, typeof(object)), + Expression.Constant(null) + ); + } + + ParameterExpression temp = Expression.Parameter(typeof(object), null); + return Expression.Block( + new[] { temp }, + Expression.Assign( + temp, + Expression.Property( + Expression.Constant(new WeakReference(_instance)), + typeof(WeakReference).GetProperty("Target") + ) + ), + Expression.AndAlso( + //check that WeekReference was not collected. + Expression.NotEqual(temp, Expression.Constant(null)), + Expression.Equal( + Expression.Convert(_expression, typeof(object)), + temp + ) + ) + ); + } + } + + private string DebugView { + get { return ToExpression().ToString(); } + } + + private sealed class BindingRestrictionsProxy { + private readonly BindingRestrictions _node; + + public BindingRestrictionsProxy(BindingRestrictions node) { + _node = node; + } + + public bool IsEmpty { + get { return _node == Empty; } + } + + public Expression Test { + get { return _node.ToExpression(); } + } + + public BindingRestrictions[] Restrictions { + get { + var restrictions = new List(); + + // Visit the tree, left to right + // + // Left-most node is on top of the stack, so we always expand the + // left most node each iteration. + var stack = new Stack(); + stack.Push(_node); + do { + var top = stack.Pop(); + var m = top as MergedRestriction; + if (m != null) { + stack.Push(m.Right); + stack.Push(m.Left); + } else { + restrictions.Add(top); + } + } while (stack.Count > 0); + + return restrictions.ToArray(); + } + } + + public override string ToString() { + // To prevent fxcop warning about this field + return _node.DebugView; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallInfo.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallInfo.cs new file mode 100644 index 00000000000..cf77f1ee12b --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallInfo.cs @@ -0,0 +1,115 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +#if CODEPLEX_40 +using System.Dynamic.Utils; +using System.Linq.Expressions; +#else +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// Describes arguments in the dynamic binding process. + /// + /// + /// ArgumentCount - all inclusive number of arguments. + /// ArgumentNames - names for those arguments that are named. + /// + /// Argument names match to the argument values in left to right order + /// and last name corresponds to the last argument. + /// + /// Example: + /// Foo(arg1, arg2, arg3, name1 = arg4, name2 = arg5, name3 = arg6) + /// + /// will correspond to: + /// ArgumentCount: 6 + /// ArgumentNames: {"name1", "name2", "name3"} + /// + public sealed class CallInfo { + private readonly int _argCount; + private readonly ReadOnlyCollection _argNames; + + /// + /// Creates a new PositionalArgumentInfo. + /// + /// The number of arguments. + /// The argument names. + /// The new CallInfo + public CallInfo(int argCount, params string[] argNames) + : this(argCount, (IEnumerable)argNames) { + } + + /// + /// Creates a new CallInfo that represents arguments in the dynamic binding process. + /// + /// The number of arguments. + /// The argument names. + /// The new CallInfo + public CallInfo(int argCount, IEnumerable argNames) { + ContractUtils.RequiresNotNull(argNames, "argNames"); + + var argNameCol = argNames.ToReadOnly(); + + ContractUtils.Requires(argCount >= argNameCol.Count, "argCount", Strings.ArgCntMustBeGreaterThanNameCnt); + ContractUtils.RequiresNotNullItems(argNameCol, "argNames"); + + _argCount = argCount; + _argNames = argNameCol; + } + + /// + /// The number of arguments. + /// + public int ArgumentCount { + get { return _argCount; } + } + + /// + /// The argument names. + /// + public ReadOnlyCollection ArgumentNames { + get { return _argNames; } + } + + /// + /// Serves as a hash function for the current CallInfo. + /// + /// A hash code for the current CallInfo. + public override int GetHashCode() { + return _argCount ^ _argNames.ListHashCode(); + } + + /// + /// Determines whether the specified CallInfo instance is considered equal to the current. + /// + /// The instance of CallInfo to compare with the current instance. + /// true if the specified instance is equal to the current one otherwise, false. + public override bool Equals(object obj) { + var other = obj as CallInfo; + return _argCount == other._argCount && _argNames.ListEquals(other._argNames); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSite.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSite.cs new file mode 100644 index 00000000000..3158164274a --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSite.cs @@ -0,0 +1,709 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic; +using System.Dynamic.Utils; +using System.Linq.Expressions; +using System.Linq.Expressions.Compiler; +#else +using Microsoft.Scripting; +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +using Microsoft.Linq.Expressions.Compiler; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + + // + // A CallSite provides a fast mechanism for call-site caching of dynamic dispatch + // behvaior. Each site will hold onto a delegate that provides a fast-path dispatch + // based on previous types that have been seen at the call-site. This delegate will + // call UpdateAndExecute if it is called with types that it hasn't seen before. + // Updating the binding will typically create (or lookup) a new delegate + // that supports fast-paths for both the new type and for any types that + // have been seen previously. + // + // DynamicSites will generate the fast-paths specialized for sets of runtime argument + // types. However, they will generate exactly the right amount of code for the types + // that are seen in the program so that int addition will remain as fast as it would + // be with custom implementation of the addition, and the user-defined types can be + // as fast as ints because they will all have the same optimal dynamically generated + // fast-paths. + // + // DynamicSites don't encode any particular caching policy, but use their + // CallSiteBinding to encode a caching policy. + // + + + /// + /// A Dynamic Call Site base class. This type is used as a parameter type to the + /// dynamic site targets. The first parameter of the delegate (T) below must be + /// of this type. + /// + public class CallSite { + + // Cache of CallSite constructors for a given delegate type + private static CacheDict> _SiteCtors; + + /// + /// The Binder responsible for binding operations at this call site. + /// This binder is invoked by the UpdateAndExecute below if all Level 0, + /// Level 1 and Level 2 caches experience cache miss. + /// + internal readonly CallSiteBinder _binder; + + // only CallSite derives from this + internal CallSite(CallSiteBinder binder) { + _binder = binder; + } + + /// + /// used by Matchmaker sites to indicate rule match. + /// + internal bool _match; + + /// + /// Class responsible for binding dynamic operations on the dynamic site. + /// + public CallSiteBinder Binder { + get { return _binder; } + } + + /// + /// Creates a CallSite with the given delegate type and binder. + /// + /// The CallSite delegate type. + /// The CallSite binder. + /// The new CallSite. + public static CallSite Create(Type delegateType, CallSiteBinder binder) { + ContractUtils.RequiresNotNull(delegateType, "delegateType"); + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.Requires(delegateType.IsSubclassOf(typeof(Delegate)), "delegateType", Strings.TypeMustBeDerivedFromSystemDelegate); + + if (_SiteCtors == null) { + // It's okay to just set this, worst case we're just throwing away some data + _SiteCtors = new CacheDict>(100); + } + Func ctor; + + var ctors = _SiteCtors; + lock (ctors) { + if (!ctors.TryGetValue(delegateType, out ctor)) { + MethodInfo method = typeof(CallSite<>).MakeGenericType(delegateType).GetMethod("Create"); + ctor = (Func)Delegate.CreateDelegate(typeof(Func), method); + ctors.Add(delegateType, ctor); + } + } + return ctor(binder); + } + } + + /// + /// Dynamic site type. + /// + /// The delegate type. + public sealed partial class CallSite : CallSite where T : class { + /// + /// The update delegate. Called when the dynamic site experiences cache miss. + /// + /// The update delegate. + public T Update { + get { + // if this site is set up for match making, then use NoMatch as an Update + if (_match) { + Debug.Assert(_CachedNoMatch != null, "all normal sites should have Update cached once there is an instance."); + return _CachedNoMatch; + } else { + Debug.Assert(_CachedUpdate != null, "all normal sites should have Update cached once there is an instance."); + return _CachedUpdate; + } + } + } + + /// + /// The Level 0 cache - a delegate specialized based on the site history. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] + public T Target; + + + /// + /// The Level 1 cache - a history of the dynamic site. + /// + internal T[] Rules; + + + // Cached update delegate for all sites with a given T + private static T _CachedUpdate; + + // Cached noMatch delegate for all sites with a given T + private static T _CachedNoMatch; + + private CallSite(CallSiteBinder binder) + : base(binder) { + Target = GetUpdateDelegate(); + } + + private CallSite() + : base(null) { + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] + internal CallSite CreateMatchMaker() { + return new CallSite(); + } + + /// + /// Creates an instance of the dynamic call site, initialized with the binder responsible for the + /// runtime binding of the dynamic operations at this call site. + /// + /// The binder responsible for the runtime binding of the dynamic operations at this call site. + /// The new instance of dynamic call site. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1000:DoNotDeclareStaticMembersOnGenericTypes")] + public static CallSite Create(CallSiteBinder binder) { + return new CallSite(binder); + } + + private T GetUpdateDelegate() { + // This is intentionally non-static to speed up creation - in particular MakeUpdateDelegate + // as static generic methods are more expensive than instance methods. We call a ref helper + // so we only access the generic static field once. + return GetUpdateDelegate(ref _CachedUpdate); + } + + private T GetUpdateDelegate(ref T addr) { + if (addr == null) { + // reduce creation cost by not using Interlocked.CompareExchange. Calling I.CE causes + // us to spend 25% of our creation time in JIT_GenericHandle. Instead we'll rarely + // create 2 delegates with no other harm caused. + addr = MakeUpdateDelegate(); + } + return addr; + } + + /// + /// Clears the rule cache ... used by the call site tests. + /// + private void ClearRuleCache() { + // make sure it initialized/atomized etc... + Binder.GetRuleCache(); + + var cache = Binder.Cache; + + if (cache != null) { + lock (cache) { + cache.Clear(); + } + } + } + + const int MaxRules = 10; + internal void AddRule(T newRule) { + T[] rules = Rules; + if (rules == null) { + Rules = new[] { newRule }; + return; + } + + T[] temp; + if (rules.Length < (MaxRules - 1)) { + temp = new T[rules.Length + 1]; + Array.Copy(rules, 0, temp, 1, rules.Length); + } else { + temp = new T[MaxRules]; + Array.Copy(rules, 0, temp, 1, MaxRules - 1); + } + temp[0] = newRule; + Rules = temp; + } + + // moves rule +2 up. + internal void MoveRule(int i) { + var rules = Rules; + var rule = rules[i]; + + rules[i] = rules[i - 1]; + rules[i - 1] = rules[i - 2]; + rules[i - 2] = rule; + } + + internal T MakeUpdateDelegate() { + Type target = typeof(T); + Type[] args; + MethodInfo invoke = target.GetMethod("Invoke"); + + + if (target.IsGenericType && IsSimpleSignature(invoke, out args)) { + MethodInfo method = null; + MethodInfo noMatchMethod = null; + + if (invoke.ReturnType == typeof(void)) { + if (target == DelegateHelpers.GetActionType(args.AddFirst(typeof(CallSite)))) { + method = typeof(UpdateDelegates).GetMethod("UpdateAndExecuteVoid" + args.Length, BindingFlags.NonPublic | BindingFlags.Static); + noMatchMethod = typeof(UpdateDelegates).GetMethod("NoMatchVoid" + args.Length, BindingFlags.NonPublic | BindingFlags.Static); + } + } else { + if (target == DelegateHelpers.GetFuncType(args.AddFirst(typeof(CallSite)))) { + method = typeof(UpdateDelegates).GetMethod("UpdateAndExecute" + (args.Length - 1), BindingFlags.NonPublic | BindingFlags.Static); + noMatchMethod = typeof(UpdateDelegates).GetMethod("NoMatch" + (args.Length - 1), BindingFlags.NonPublic | BindingFlags.Static); + } + } + if (method != null) { + _CachedNoMatch = (T)(object)noMatchMethod.MakeGenericMethod(args).CreateDelegate(target); + return (T)(object)method.MakeGenericMethod(args).CreateDelegate(target); + } + } + + _CachedNoMatch = CreateCustomNoMatchDelegate(invoke); + return CreateCustomUpdateDelegate(invoke); + } + + + private static bool IsSimpleSignature(MethodInfo invoke, out Type[] sig) { + ParameterInfo[] pis = invoke.GetParametersCached(); + ContractUtils.Requires(pis.Length > 0 && pis[0].ParameterType == typeof(CallSite), "T"); + + Type[] args = new Type[invoke.ReturnType != typeof(void) ? pis.Length : pis.Length - 1]; + bool supported = true; + + for (int i = 1; i < pis.Length; i++) { + ParameterInfo pi = pis[i]; + if (pi.IsByRefParameter()) { + supported = false; + } + args[i - 1] = pi.ParameterType; + } + if (invoke.ReturnType != typeof(void)) { + args[args.Length - 1] = invoke.ReturnType; + } + sig = args; + return supported; + } + + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] + private T CreateCustomNoMatchDelegate(MethodInfo invoke) { + var @params = invoke.GetParametersCached().Map(p => Expression.Parameter(p.ParameterType, p.Name)); + var site = @params[0]; + return Expression.Lambda( + Expression.Block( + Expression.Call( + typeof(CallSiteOps).GetMethod("SetNotMatched"), + @params.First() + ), + Expression.Default(invoke.GetReturnType()) + ), + @params + ).Compile(); + } + + // + // WARNING: If you're changing this method, make sure you update the + // pregenerated versions as well, which are generated by + // generate_dynsites.py + // The two implementations *must* be kept functionally equivalent! + // + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] + private T CreateCustomUpdateDelegate(MethodInfo invoke) { + var body = new List(); + var vars = new List(); + var @params = invoke.GetParametersCached().Map(p => Expression.Parameter(p.ParameterType, p.Name)); + var @return = Expression.Label(invoke.GetReturnType()); + var typeArgs = new[] { typeof(T) }; + + var site = @params[0]; + var arguments = @params.RemoveFirst(); + + //var @this = (CallSite)site; + var @this = Expression.Variable(typeof(CallSite), "this"); + vars.Add(@this); + body.Add(Expression.Assign(@this, Expression.Convert(site, @this.Type))); + + //T[] applicable; + var applicable = Expression.Variable(typeof(T[]), "applicable"); + vars.Add(applicable); + + //T rule, originalRule = @this.Target; + var rule = Expression.Variable(typeof(T), "rule"); + vars.Add(rule); + + var originalRule = Expression.Variable(typeof(T), "originalRule"); + vars.Add(originalRule); + body.Add(Expression.Assign(originalRule, Expression.Field(@this, "Target"))); + + //TRet result; + ParameterExpression result = null; + if (@return.Type != typeof(void)) { + vars.Add(result = Expression.Variable(@return.Type, "result")); + } + + //int count, index; + var count = Expression.Variable(typeof(int), "count"); + vars.Add(count); + var index = Expression.Variable(typeof(int), "index"); + vars.Add(index); + + //// + //// Create matchmaker site. We'll need it regardless. + //// + //site = CallSiteOps.CreateMatchmaker(); + body.Add( + Expression.Assign( + site, + Expression.Call( + typeof(CallSiteOps), + "CreateMatchmaker", + typeArgs, + @this + ) + ) + ); + + //// + //// Level 1 cache lookup + //// + //if ((applicable = CallSiteOps.GetRules(@this)) != null) { + // for (index = 0, count = applicable.Length; index < count; index++) { + // @this.Target = rule = applicable[i]; + + // // + // // Execute the rule + // // + // + // // if we've already tried it skip it... + // if ((object)rule != (object)originalRule) { + // %(setResult)s rule(site, %(args)s); + // if (CallSiteOps.GetMatch(site)) { + // CallSiteOps.UpdateRules(@this, i); + // %(returnResult)s; + // } + // + // // Rule didn't match, try the next one + // CallSiteOps.ClearMatch(site); + // } + // } + //} + Expression invokeRule; + + Expression getMatch = Expression.Call( + typeof(CallSiteOps).GetMethod("GetMatch"), + site + ); + + Expression resetMatch = Expression.Call( + typeof(CallSiteOps).GetMethod("ClearMatch"), + site + ); + + var onMatch = Expression.Call( + typeof(CallSiteOps), + "UpdateRules", + typeArgs, + @this, + index + ); + + if (@return.Type == typeof(void)) { + invokeRule = Expression.Block( + Expression.Invoke(rule, new TrueReadOnlyCollection(@params)), + Expression.IfThen( + getMatch, + Expression.Block(onMatch, Expression.Return(@return)) + ) + ); + } else { + invokeRule = Expression.Block( + Expression.Assign(result, Expression.Invoke(rule, new TrueReadOnlyCollection(@params))), + Expression.IfThen( + getMatch, + Expression.Block(onMatch, Expression.Return(@return, result)) + ) + ); + } + + Expression getRule = Expression.Assign(rule, Expression.ArrayAccess(applicable, index)); + + var @break = Expression.Label(); + + var breakIfDone = Expression.IfThen( + Expression.Equal(index, count), + Expression.Break(@break) + ); + + var incrementIndex = Expression.PreIncrementAssign(index); + + body.Add( + Expression.IfThen( + Expression.NotEqual( + Expression.Assign(applicable, Expression.Call(typeof(CallSiteOps), "GetRules", typeArgs, @this)), + Expression.Constant(null, applicable.Type) + ), + Expression.Block( + Expression.Assign(count, Expression.ArrayLength(applicable)), + Expression.Assign(index, Expression.Constant(0)), + Expression.Loop( + Expression.Block( + breakIfDone, + getRule, + Expression.IfThen( + Expression.NotEqual( + Expression.Convert(rule, typeof(object)), + Expression.Convert(originalRule, typeof(object)) + ), + Expression.Block( + Expression.Assign( + Expression.Field(@this, "Target"), + rule + ), + invokeRule, + resetMatch + ) + ), + incrementIndex + ), + @break, + null + ) + ) + ) + ); + + //// + //// Level 2 cache lookup + //// + // + //// + //// Any applicable rules in level 2 cache? + //// + // + // var cache = CallSiteOps.GetRuleCache(@this); + + var cache = Expression.Variable(typeof(RuleCache), "cache"); + vars.Add(cache); + + body.Add( + Expression.Assign( + cache, + Expression.Call(typeof(CallSiteOps), "GetRuleCache", typeArgs, @this) + ) + ); + + // applicable = cache.GetRules(); + + body.Add( + Expression.Assign( + applicable, + Expression.Call(typeof(CallSiteOps), "GetCachedRules", typeArgs, cache) + ) + ); + + // for (int i = 0, count = applicable.Length; i < count; i++) { + // @this.Target = rule = applicable[i]; + // + // // + // // Execute the rule + // // + // + // try { + // result = rule(site, arg0); + // if (match) { + // return result; + // } + // } finally { + // if (CallSiteOps.GetMatch(site)) { + // // + // // Rule worked. Add it to level 1 cache + // // + // + // CallSiteOps.AddRule(@this, rule); + // // and then move it to the front of the L2 cache + // CallSiteOps.MoveRule(cache, rule, index); + // } + // } + // + // // Rule didn't match, try the next one + // CallSiteOps.ClearMatch(site); + // } + // + + + // L2 invokeRule is different (no onMatch) + if (@return.Type == typeof(void)) { + invokeRule = Expression.Block( + Expression.Invoke(rule, new TrueReadOnlyCollection(@params)), + Expression.IfThen( + getMatch, + Expression.Return(@return) + ) + ); + } else { + invokeRule = Expression.Block( + Expression.Assign(result, Expression.Invoke(rule, new TrueReadOnlyCollection(@params))), + Expression.IfThen( + getMatch, + Expression.Return(@return, result) + ) + ); + } + + var tryRule = Expression.TryFinally( + invokeRule, + Expression.IfThen( + getMatch, + Expression.Block( + Expression.Call(typeof(CallSiteOps), "AddRule", typeArgs, @this, rule), + Expression.Call(typeof(CallSiteOps), "MoveRule", typeArgs, cache, rule, index) + ) + ) + ); + + getRule = Expression.Assign( + Expression.Field(@this, "Target"), + Expression.Assign(rule, Expression.ArrayAccess(applicable, index)) + ); + + body.Add(Expression.Assign(index, Expression.Constant(0))); + body.Add(Expression.Assign(count, Expression.ArrayLength(applicable))); + body.Add( + Expression.Loop( + Expression.Block( + breakIfDone, + getRule, + tryRule, + resetMatch, + incrementIndex + ), + @break, + null + ) + ); + + //// + //// Miss on Level 0, 1 and 2 caches. Create new rule + //// + + //rule = null; + body.Add(Expression.Assign(rule, Expression.Constant(null, rule.Type))); + + //var args = new object[] { arg0, arg1, ... }; + var args = Expression.Variable(typeof(object[]), "args"); + vars.Add(args); + body.Add( + Expression.Assign( + args, + Expression.NewArrayInit(typeof(object), arguments.Map(p => Convert(p, typeof(object)))) + ) + ); + + //for (; ; ) { + // @this.Target = originalRule; + // rule = @this.Target = @this.Binder.BindDelegate(@this, args); + + // // + // // Execute the rule on the matchmaker site + // // + + // try { + // %(setResult)s ruleTarget(site, %(args)s); + // if (match) { + // %(returnResult)s; + // } + // } finally { + // if (match) { + // // + // // The rule worked. Add it to level 1 cache. + // // + // CallSiteOps.AddRule(@this, rule); + // } + // } + + // // Rule we got back didn't work, try another one + // match = true; + //} + + Expression setOldTarget = Expression.Assign( + Expression.Field(@this, "Target"), + originalRule + ); + + getRule = Expression.Assign( + Expression.Field(@this, "Target"), + Expression.Assign( + rule, + Expression.Call( + typeof(CallSiteOps), + "Bind", + typeArgs, + Expression.Property(@this, "Binder"), + @this, + args + ) + ) + ); + + tryRule = Expression.TryFinally( + invokeRule, + Expression.IfThen( + getMatch, + Expression.Call(typeof(CallSiteOps), "AddRule", typeArgs, @this, rule) + ) + ); + + body.Add( + Expression.Loop( + Expression.Block(setOldTarget, getRule, tryRule, resetMatch), + null, null + ) + ); + + body.Add(Expression.Default(@return.Type)); + + var lambda = Expression.Lambda( + Expression.Label( + @return, + Expression.Block( + new ReadOnlyCollection(vars), + new ReadOnlyCollection(body) + ) + ), + "CallSite.Target", + true, // always compile the rules with tail call optimization + new ReadOnlyCollection(@params) + ); + + // Need to compile with forceDynamic because T could be invisible, + // or one of the argument types could be invisible + return lambda.Compile(); + } + + private static Expression Convert(Expression arg, Type type) { + if (TypeUtils.AreReferenceAssignable(type, arg.Type)) { + return arg; + } + return Expression.Convert(arg, type); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteBinder.cs new file mode 100644 index 00000000000..bfd76825ced --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteBinder.cs @@ -0,0 +1,239 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic; +using System.Dynamic.Utils; +using System.Linq.Expressions; +#else +using Microsoft.Scripting; +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +#endif +using System.Threading; +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + /// + /// Class responsible for runtime binding of the dynamic operations on the dynamic call site. + /// + public abstract class CallSiteBinder { + private static readonly LabelTarget _updateLabel = Expression.Label("CallSiteBinder.UpdateLabel"); + + /// + /// The Level 2 cache - all rules produced for the same binder. + /// + internal Dictionary Cache; + + /// + /// Initializes a new instance of the class. + /// + protected CallSiteBinder() { + } + + /// + /// Gets a label that can be used to cause the binding to be updated. It + /// indicates that the expression's binding is no longer valid. + /// This is typically used when the "version" of a dynamic object has + /// changed. + /// + public static LabelTarget UpdateLabel { + get { return _updateLabel; } + } + + private sealed class LambdaSignature where T : class { + internal static readonly LambdaSignature Instance = new LambdaSignature(); + + internal readonly ReadOnlyCollection Parameters; + internal readonly LabelTarget ReturnLabel; + + private LambdaSignature() { + Type target = typeof(T); + if (!typeof(Delegate).IsAssignableFrom(target)) { + throw Error.TypeParameterIsNotDelegate(target); + } + + MethodInfo invoke = target.GetMethod("Invoke"); + ParameterInfo[] pis = invoke.GetParametersCached(); + if (pis[0].ParameterType != typeof(CallSite)) { + throw Error.FirstArgumentMustBeCallSite(); + } + + var @params = new ParameterExpression[pis.Length - 1]; + for (int i = 0; i < @params.Length; i++) { + @params[i] = Expression.Parameter(pis[i + 1].ParameterType, "$arg" + i); + } + + Parameters = new TrueReadOnlyCollection(@params); + ReturnLabel = Expression.Label(invoke.GetReturnType()); + } + } + + /// + /// Performs the runtime binding of the dynamic operation on a set of arguments. + /// + /// An array of arguments to the dynamic operation. + /// The array of instances that represent the parameters of the call site in the binding process. + /// A LabelTarget used to return the result of the dynamic binding. + /// + /// An Expression that performs tests on the dynamic operation arguments, and + /// performs the dynamic operation if hte tests are valid. If the tests fail on + /// subsequent occurrences of the dynamic operation, Bind will be called again + /// to produce a new for the new argument types. + /// + public abstract Expression Bind(object[] args, ReadOnlyCollection parameters, LabelTarget returnLabel); + + /// + /// Provides low-level runtime binding support. Classes can override this and provide a direct + /// delegate for the implementation of rule. This can enable saving rules to disk, having + /// specialized rules available at runtime, or providing a different caching policy. + /// + /// The target type of the CallSite. + /// The CallSite the bind is being performed for. + /// The arguments for the binder. + /// A new delegate which replaces the CallSite Target. + public virtual T BindDelegate(CallSite site, object[] args) where T : class { + return null; + } + + + internal T BindCore(CallSite site, object[] args) where T : class { + // + // Try to find a precompiled delegate, and return it if found. + // + T result = BindDelegate(site, args); + if (result != null) { + return result; + } + + // + // Get the Expression for the binding + // + var signature = LambdaSignature.Instance; + Expression binding = Bind(args, signature.Parameters, signature.ReturnLabel); + + // + // Check the produced rule + // + if (binding == null) { + throw Error.NoOrInvalidRuleProduced(); + } + + // + // finally produce the new rule if we need to + // +#if !MICROSOFT_SCRIPTING_CORE + // We cannot compile rules in the heterogeneous app domains since they + // may come from less trusted sources + if (!AppDomain.CurrentDomain.IsHomogenous) { + throw Error.HomogenousAppDomainRequired(); + } +#endif + Expression e = Stitch(binding, signature); + T newRule = e.Compile(); + + CacheTarget(newRule); + + return newRule; + } + + /// + /// Adds a target to the cache of known targets. The cached targets will + /// be scanned before calling BindDelegate to produce the new rule. + /// + /// The type of target being added. + /// The target delegate to be added to the cache. + protected void CacheTarget(T target) where T : class { + GetRuleCache().AddRule(target); + } + + private static Expression Stitch(Expression binding, LambdaSignature signature) where T : class { + Type targetType = typeof(T); + Type siteType = typeof(CallSite); + + var body = new ReadOnlyCollectionBuilder(3); + body.Add(binding); + + var site = Expression.Parameter(typeof(CallSite), "$site"); + var @params = signature.Parameters.AddFirst(site); + + Expression updLabel = Expression.Label(CallSiteBinder.UpdateLabel); + +#if DEBUG + // put the AST into the constant pool for debugging purposes + updLabel = Expression.Block( + Expression.Constant(binding, typeof(Expression)), + updLabel + ); +#endif + + body.Add(updLabel); + body.Add( + Expression.Label( + signature.ReturnLabel, + Expression.Condition( + Expression.Call( + typeof(CallSiteOps).GetMethod("SetNotMatched"), + @params.First() + ), + Expression.Default(signature.ReturnLabel.Type), + Expression.Invoke( + Expression.Property( + Expression.Convert(site, siteType), + typeof(CallSite).GetProperty("Update") + ), + new TrueReadOnlyCollection(@params) + ) + ) + ) + ); + + return new Expression( + Expression.Block(body), + "CallSite.Target", + true, // always compile the rules with tail call optimization + new TrueReadOnlyCollection(@params) + ); + } + + internal RuleCache GetRuleCache() where T : class { + // make sure we have cache. + if (Cache == null) { + Interlocked.CompareExchange(ref Cache, new Dictionary(), null); + } + + object ruleCache; + var cache = Cache; + lock (cache) { + if (!cache.TryGetValue(typeof(T), out ruleCache)) { + cache[typeof(T)] = ruleCache = new RuleCache(); + } + } + + RuleCache result = ruleCache as RuleCache; + Debug.Assert(result != null); + return result; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteHelpers.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteHelpers.cs new file mode 100644 index 00000000000..0768092cb58 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteHelpers.cs @@ -0,0 +1,62 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Reflection; +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + /// + /// Class that contains helper methods for DLR CallSites. + /// + public static class CallSiteHelpers { + private static Type _knownNonDynamicMethodType = typeof(object).GetMethod("ToString").GetType(); + + /// + /// Checks if a is internally used by DLR and should not + /// be displayed on the language code's stack. + /// + /// The input + /// + /// True if the input is internally used by DLR and should not + /// be displayed on the language code's stack. Otherwise, false. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")] + public static bool IsInternalFrame(MethodBase mb) { + //All the dynamic methods created for DLR rules have a special name. + //We also check if the method has a different type than the known + //non-static method. If it does, it is a dynamic method. + //This could be improved if the CLR provides a way to attach some information + //to the dynamic method we create, like CustomAttributes. + if (mb.Name == "CallSite.Target" && mb.GetType() != _knownNonDynamicMethodType) { + return true; + } + + //Filter out the helper methods. +#if CODEPLEX_40 + if (mb.DeclaringType == typeof(System.Dynamic.UpdateDelegates)) { +#else + if (mb.DeclaringType == typeof(Microsoft.Scripting.UpdateDelegates)) { +#endif + return true; + } + + return false; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteOps.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteOps.cs new file mode 100644 index 00000000000..1585a2e1517 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CallSiteOps.cs @@ -0,0 +1,173 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.ComponentModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic; +using System.Linq.Expressions; +#else +using Microsoft.Scripting; +using Microsoft.Linq.Expressions; +#endif +using System.Collections.Generic; + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + + // Conceptually these are instance methods on CallSite but + // we don't want users to see them + + /// + /// This API supports the .NET Framework infrastructure and is not intended to be used directly from your code. + /// + [EditorBrowsable(EditorBrowsableState.Never), DebuggerStepThrough] + public static class CallSiteOps { + + /// + /// Creates an instance of a dynamic call site used for cache lookup. + /// + /// The type of the delegate of the . + /// The new call site. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static CallSite CreateMatchmaker(CallSite site) where T : class { + var mm = site.CreateMatchMaker(); + CallSiteOps.ClearMatch(mm); + return mm; + } + + /// + /// Checks if a dynamic site requires an update. + /// + /// An instance of the dynamic call site. + /// true if rule does not need updating, false otherwise. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static bool SetNotMatched(CallSite site) { + var res = site._match; + site._match = false; //avoid branch here to make sure the method is inlined + return res; + } + + /// + /// Checks whether the executed rule matched + /// + /// An instance of the dynamic call site. + /// true if rule matched, false otherwise. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static bool GetMatch(CallSite site) { + return site._match; + } + + /// + /// Clears the match flag on the matchmaker call site. + /// + /// An instance of the dynamic call site. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static void ClearMatch(CallSite site) { + site._match = true; + } + + /// + /// Adds a rule to the cache maintained on the dynamic call site. + /// + /// The type of the delegate of the . + /// An instance of the dynamic call site. + /// An instance of the call site rule. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static void AddRule(CallSite site, T rule) where T : class { + site.AddRule(rule); + } + + /// + /// Updates rules in the cache. + /// + /// The type of the delegate of the . + /// An instance of the dynamic call site. + /// The matched rule index. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static void UpdateRules(CallSite @this, int matched) where T : class { + if (matched > 1) { + @this.MoveRule(matched); + } + } + + /// + /// Gets the dynamic binding rules from the call site. + /// + /// The type of the delegate of the . + /// An instance of the dynamic call site. + /// An array of dynamic binding rules. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static T[] GetRules(CallSite site) where T : class { + return site.Rules; + } + + + /// + /// Retrieves binding rule cache. + /// + /// The type of the delegate of the . + /// An instance of the dynamic call site. + /// The cache. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static RuleCache GetRuleCache(CallSite site) where T : class { + return site.Binder.GetRuleCache(); + } + + + /// + /// Moves the binding rule within the cache. + /// + /// The type of the delegate of the . + /// The call site rule cache. + /// An instance of the call site rule. + /// An index of the call site rule. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static void MoveRule(RuleCache cache, T rule, int i) where T : class { + if (i > 1) { + cache.MoveRule(rule, i); + } + } + + /// + /// Searches the dynamic rule cache for rules applicable to the dynamic operation. + /// + /// The type of the delegate of the . + /// The cache. + /// The collection of applicable rules. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static T[] GetCachedRules(RuleCache cache) where T : class { + return cache.GetRules(); + } + + /// + /// Updates the call site target with a new rule based on the arguments. + /// + /// The type of the delegate of the . + /// The call site binder. + /// An instance of the dynamic call site. + /// Arguments to the call site. + /// The new call site target. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static T Bind(CallSiteBinder binder, CallSite site, object[] args) where T : class { + return binder.BindCore(site, args); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/ConvertBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/ConvertBinder.cs new file mode 100644 index 00000000000..82f40c35833 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/ConvertBinder.cs @@ -0,0 +1,111 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Represents the convert dynamic operation at the call site, providing the binding semantic and the details about the operation. + /// + public abstract class ConvertBinder : DynamicMetaObjectBinder { + private readonly Type _type; + private readonly bool _explicit; + + /// + /// Initializes a new intsance of the . + /// + /// The type to convert to. + /// true if the conversion should consider explicit conversions; otherwise, false. + protected ConvertBinder(Type type, bool @explicit) { + ContractUtils.RequiresNotNull(type, "type"); + + _type = type; + _explicit = @explicit; + } + + /// + /// The type to convert to. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods")] + public Type Type { + get { + return _type; + } + } + + /// + /// Gets the value indicating if the conversion should consider explicit conversions. + /// + public bool Explicit { + get { + return _explicit; + } + } + + /// + /// Performs the binding of the dynamic convert operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic convert operation. + /// The representing the result of the binding. + public DynamicMetaObject FallbackConvert(DynamicMetaObject target) { + return FallbackConvert(target, null); + } + + /// + /// When overridden in the derived class, performs the binding of the dynamic convert operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic convert operation. + /// The binding result to use if binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackConvert(DynamicMetaObject target, DynamicMetaObject errorSuggestion); + + /// + /// Performs the binding of the dynamic convert operation. + /// + /// The target of the dynamic convert operation. + /// An array of arguments of the dynamic convert operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.Requires(args == null || args.Length == 0, "args"); + + return target.BindConvert(this); + } + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { return _type; } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CreateInstanceBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CreateInstanceBinder.cs new file mode 100644 index 00000000000..15934960b66 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/CreateInstanceBinder.cs @@ -0,0 +1,97 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Represents the create dynamic operation at the call site, providing the binding semantic and the details about the operation. + /// + public abstract class CreateInstanceBinder : DynamicMetaObjectBinder { + private readonly CallInfo _callInfo; + + /// + /// Initializes a new intsance of the . + /// + /// The signature of the arguments at the call site. + protected CreateInstanceBinder(CallInfo callInfo) { + ContractUtils.RequiresNotNull(callInfo, "callInfo"); + _callInfo = callInfo; + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { return typeof(object); } + } + + /// + /// Gets the signature of the arguments at the call site. + /// + public CallInfo CallInfo { + get { return _callInfo; } + } + + /// + /// Performs the binding of the dynamic create operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic create operation. + /// The arguments of the dynamic create operation. + /// The representing the result of the binding. + public DynamicMetaObject FallbackCreateInstance(DynamicMetaObject target, DynamicMetaObject[] args) { + return FallbackCreateInstance(target, args, null); + } + + /// + /// When overridden in the derived class, performs the binding of the dynamic create operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic create operation. + /// The arguments of the dynamic create operation. + /// The binding result to use if binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackCreateInstance(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion); + + /// + /// Performs the binding of the dynamic create operation. + /// + /// The target of the dynamic create operation. + /// An array of arguments of the dynamic create operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.RequiresNotNullItems(args, "args"); + + return target.BindCreateInstance(this, args); + } + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DeleteIndexBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DeleteIndexBinder.cs new file mode 100644 index 00000000000..8437a5244b2 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DeleteIndexBinder.cs @@ -0,0 +1,97 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Represents the dynamic delete index operation at the call site, providing the binding semantic and the details about the operation. + /// + public abstract class DeleteIndexBinder : DynamicMetaObjectBinder { + private readonly CallInfo _callInfo; + + /// + /// Initializes a new instance of the . + /// + /// The signature of the arguments at the call site. + protected DeleteIndexBinder(CallInfo callInfo) { + ContractUtils.RequiresNotNull(callInfo, "callInfo"); + _callInfo = callInfo; + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { return typeof(void); } + } + + /// + /// Gets the signature of the arguments at the call site. + /// + public CallInfo CallInfo { + get { return _callInfo; } + } + + /// + /// Performs the binding of the dynamic delete index operation. + /// + /// The target of the dynamic delete index operation. + /// An array of arguments of the dynamic delete index operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.RequiresNotNullItems(args, "args"); + + return target.BindDeleteIndex(this, args); + } + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + + /// + /// Performs the binding of the dynamic delete index operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic delete index operation. + /// The arguments of the dynamic delete index operation. + /// The representing the result of the binding. + public DynamicMetaObject FallbackDeleteIndex(DynamicMetaObject target, DynamicMetaObject[] indexes) { + return FallbackDeleteIndex(target, indexes, null); + } + + /// + /// When overridden in the derived class, performs the binding of the dynamic delete index operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic delete index operation. + /// The arguments of the dynamic delete index operation. + /// The binding result to use if binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackDeleteIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject errorSuggestion); + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DeleteMemberBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DeleteMemberBinder.cs new file mode 100644 index 00000000000..20433264a79 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DeleteMemberBinder.cs @@ -0,0 +1,112 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// Represents the dynamic delete member operation at the call site, providing the binding semantic and the details about the operation. + /// + public abstract class DeleteMemberBinder : DynamicMetaObjectBinder { + private readonly string _name; + private readonly bool _ignoreCase; + + /// + /// Initializes a new instance of the . + /// + /// The name of the member to delete. + /// true if the name should be matched ignoring case; false otherwise. + protected DeleteMemberBinder(string name, bool ignoreCase) { + ContractUtils.RequiresNotNull(name, "name"); + + _name = name; + _ignoreCase = ignoreCase; + } + + /// + /// Gets the name of the member to delete. + /// + public string Name { + get { + return _name; + } + } + + /// + /// Gets the value indicating if the string comparison should ignore the case of the member name. + /// + public bool IgnoreCase { + get { + return _ignoreCase; + } + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { return typeof(void); } + } + + /// + /// Performs the binding of the dynamic delete member operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic delete member operation. + /// The representing the result of the binding. + public DynamicMetaObject FallbackDeleteMember(DynamicMetaObject target) { + return FallbackDeleteMember(target, null); + } + + /// + /// When overridden in the derived class, performs the binding of the dynamic delete member operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic delete member operation. + /// The binding result to use if binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackDeleteMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion); + + /// + /// Performs the binding of the dynamic delete member operation. + /// + /// The target of the dynamic delete member operation. + /// An array of arguments of the dynamic delete member operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.Requires(args == null || args.Length == 0); + + return target.BindDeleteMember(this); + } + + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicMetaObject.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicMetaObject.cs new file mode 100644 index 00000000000..9c5fc873d2e --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicMetaObject.cs @@ -0,0 +1,335 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +#if CODEPLEX_40 +using System.Dynamic.Utils; +using System.Linq.Expressions; +#else +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +#endif +using System.Reflection; +using System.Runtime.Remoting; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Represents the dynamic binding and a binding logic of an object participating in the dynamic binding. + /// + public class DynamicMetaObject { + private readonly Expression _expression; + private readonly BindingRestrictions _restrictions; + private readonly object _value; + private readonly bool _hasValue; + + /// + /// Represents an empty array of type . This field is read only. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2105:ArrayFieldsShouldNotBeReadOnly")] + public static readonly DynamicMetaObject[] EmptyMetaObjects = new DynamicMetaObject[0]; + + /// + /// Initializes a new instance of the class. + /// + /// The expression representing this during the dynamic binding process. + /// The set of binding restrictions under which the binding is valid. + public DynamicMetaObject(Expression expression, BindingRestrictions restrictions) { + ContractUtils.RequiresNotNull(expression, "expression"); + ContractUtils.RequiresNotNull(restrictions, "restrictions"); + + _expression = expression; + _restrictions = restrictions; + } + + /// + /// Initializes a new instance of the class. + /// + /// The expression representing this during the dynamic binding process. + /// The set of binding restrictions under which the binding is valid. + /// The runtime value represented by the . + public DynamicMetaObject(Expression expression, BindingRestrictions restrictions, object value) + : this(expression, restrictions) { + _value = value; + _hasValue = true; + } + + /// + /// The expression representing the during the dynamic binding process. + /// + public Expression Expression { + get { + return _expression; + } + } + + /// + /// The set of binding restrictions under which the binding is valid. + /// + public BindingRestrictions Restrictions { + get { + return _restrictions; + } + } + + /// + /// The runtime value represented by this . + /// + public object Value { + get { + return _value; + } + } + + /// + /// Gets a value indicating whether the has the runtime value. + /// + public bool HasValue { + get { + return _hasValue; + } + } + + + /// + /// Gets the of the runtime value or null if the has no value associated with it. + /// + public Type RuntimeType { + get { + if (_hasValue) { + Type ct = Expression.Type; + // valuetype at compile tyme, type cannot change. + if (ct.IsValueType) { + return ct; + } + if (_value != null) { + return _value.GetType(); + } else { + return null; + } + } else { + return null; + } + } + } + + /// + /// Gets the limit type of the . + /// + /// Represents the most specific type known about the object represented by the . if runtime value is available, a type of the otherwise. + public Type LimitType { + get { + return RuntimeType ?? Expression.Type; + } + } + + /// + /// Performs the binding of the dynamic conversion operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindConvert(ConvertBinder binder) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackConvert(this); + } + + /// + /// Performs the binding of the dynamic get member operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindGetMember(GetMemberBinder binder) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackGetMember(this); + } + + /// + /// Performs the binding of the dynamic set member operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The representing the value for the set member operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicMetaObject value) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackSetMember(this, value); + } + + /// + /// Performs the binding of the dynamic delete member operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindDeleteMember(DeleteMemberBinder binder) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackDeleteMember(this); + } + + /// + /// Performs the binding of the dynamic get index operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// An array of instances - indexes for the get index operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackGetIndex(this, indexes); + } + + /// + /// Performs the binding of the dynamic set index operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// An array of instances - indexes for the set index operation. + /// The representing the value for the set index operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindSetIndex(SetIndexBinder binder, DynamicMetaObject[] indexes, DynamicMetaObject value) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackSetIndex(this, indexes, value); + } + + /// + /// Performs the binding of the dynamic delete index operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// An array of instances - indexes for the delete index operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindDeleteIndex(DeleteIndexBinder binder, DynamicMetaObject[] indexes) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackDeleteIndex(this, indexes); + } + + /// + /// Performs the binding of the dynamic invoke member operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// An array of instances - arguments to the invoke member operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackInvokeMember(this, args); + } + + /// + /// Performs the binding of the dynamic invoke operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// An array of instances - arguments to the invoke operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindInvoke(InvokeBinder binder, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackInvoke(this, args); + } + + /// + /// Performs the binding of the dynamic create instance operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// An array of instances - arguments to the create instance operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindCreateInstance(CreateInstanceBinder binder, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackCreateInstance(this, args); + } + + /// + /// Performs the binding of the dynamic unary operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindUnaryOperation(UnaryOperationBinder binder) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackUnaryOperation(this); + } + + /// + /// Performs the binding of the dynamic binary operation. + /// + /// An instance of the that represents the details of the dynamic operation. + /// An instance of the representing the right hand side of the binary operation. + /// The new representing the result of the binding. + public virtual DynamicMetaObject BindBinaryOperation(BinaryOperationBinder binder, DynamicMetaObject arg) { + ContractUtils.RequiresNotNull(binder, "binder"); + return binder.FallbackBinaryOperation(this, arg); + } + + /// + /// Returns the enumeration of all dynamic member names. + /// + /// The list of dynamic member names. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] + public virtual IEnumerable GetDynamicMemberNames() { + return new string[0]; + } + + /// + /// Returns the list of expressions represented by the instances. + /// + /// An array of instances to extract expressions from. + /// The array of expressions. + internal static Expression[] GetExpressions(DynamicMetaObject[] objects) { + ContractUtils.RequiresNotNull(objects, "objects"); + + Expression[] res = new Expression[objects.Length]; + for (int i = 0; i < objects.Length; i++) { + DynamicMetaObject mo = objects[i]; + ContractUtils.RequiresNotNull(mo, "objects"); + Expression expr = mo.Expression; + ContractUtils.RequiresNotNull(expr, "objects"); + res[i] = expr; + } + + return res; + } + + /// + /// Creates a meta-object for the specified object. + /// + /// The object to get a meta-object for. + /// The expression representing this during the dynamic binding process. + /// + /// If the given object implements and is not a remote object from outside the current AppDomain, + /// returns the object's specific meta-object returned by . Otherwise a plain new meta-object + /// with no restrictions is created and returned. + /// + public static DynamicMetaObject Create(object value, Expression expression) { + ContractUtils.RequiresNotNull(expression, "expression"); + + IDynamicMetaObjectProvider ido = value as IDynamicMetaObjectProvider; +#if !SILVERLIGHT + if (ido != null && !RemotingServices.IsObjectOutOfAppDomain(value)) { +#else + if (ido != null) { +#endif + var idoMetaObject = ido.GetMetaObject(expression); + + if (idoMetaObject == null || + !idoMetaObject.HasValue || + idoMetaObject.Value == null || + (object)idoMetaObject.Expression != (object)expression) { + throw Error.InvalidMetaObjectCreated(ido.GetType()); + } + + return idoMetaObject; + } else { + return new DynamicMetaObject(expression, BindingRestrictions.Empty, value); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicMetaObjectBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicMetaObjectBinder.cs new file mode 100644 index 00000000000..ae59b973ac1 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicMetaObjectBinder.cs @@ -0,0 +1,305 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +using System.Linq.Expressions; +using System.Linq.Expressions.Compiler; +#else +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +using Microsoft.Linq.Expressions.Compiler; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Runtime.Remoting; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// The dynamic call site binder that participates in the binding protocol. + /// + /// + /// The performs the binding of the dynamic operation using the runtime values + /// as input. On the other hand, the participates in the + /// binding protocol. + /// + public abstract class DynamicMetaObjectBinder : CallSiteBinder { + + #region Public APIs + + /// + /// Initializes a new instance of the class. + /// + protected DynamicMetaObjectBinder() { + } + + /// + /// The result type of the operation. + /// + public virtual Type ReturnType { + get { return typeof(object); } + } + + /// + /// Gets the value indicating if we should validate the result of the binding. + /// + protected virtual bool ValidateBindingResult { + get { return true; } + } + + /// + /// Performs the runtime binding of the dynamic operation on a set of arguments. + /// + /// An array of arguments to the dynamic operation. + /// The array of instances that represent the parameters of the call site in the binding process. + /// A LabelTarget used to return the result of the dynamic binding. + /// + /// An Expression that performs tests on the dynamic operation arguments, and + /// performs the dynamic operation if hte tests are valid. If the tests fail on + /// subsequent occurrences of the dynamic operation, Bind will be called again + /// to produce a new for the new argument types. + /// + public sealed override Expression Bind(object[] args, ReadOnlyCollection parameters, LabelTarget returnLabel) { + ContractUtils.RequiresNotNull(args, "args"); + ContractUtils.RequiresNotNull(parameters, "parameters"); + ContractUtils.RequiresNotNull(returnLabel, "returnLabel"); + if (args.Length == 0) { + throw Error.OutOfRange("args.Length", 1); + } + if (parameters.Count == 0) { + throw Error.OutOfRange("parameters.Count", 1); + } + if (args.Length != parameters.Count) { + throw new ArgumentOutOfRangeException("args"); + } + + // Ensure that the binder's ReturnType matches CallSite's return + // type. We do this so meta objects and language binders can + // compose trees together without needing to insert converts. + // + // For now, we need to allow binders to opt out of this check. + Type expectedResult; + if (ValidateBindingResult) { + expectedResult = ReturnType; + + if (returnLabel.Type != typeof(void) && + !TypeUtils.AreReferenceAssignable(returnLabel.Type, expectedResult)) { + throw Error.BinderNotCompatibleWithCallSite(expectedResult, this, returnLabel.Type); + } + } else { + // We have to at least make sure it works with the CallSite's + // type to build the return. + expectedResult = returnLabel.Type; + } + + DynamicMetaObject target = DynamicMetaObject.Create(args[0], parameters[0]); + DynamicMetaObject[] metaArgs = CreateArgumentMetaObjects(args, parameters); + + DynamicMetaObject binding = Bind(target, metaArgs); + + if (binding == null) { + throw Error.BindingCannotBeNull(); + } + + Expression body = binding.Expression; + BindingRestrictions restrictions = binding.Restrictions; + + // Ensure the result matches the expected result type. + if (expectedResult != typeof(void) && + !TypeUtils.AreReferenceAssignable(expectedResult, body.Type)) { + + // + // Blame the last person that handled the result: assume it's + // the dynamic object (if any), otherwise blame the language. + // + if (target.Value is IDynamicMetaObjectProvider) { + throw Error.DynamicObjectResultNotAssignable(body.Type, target.Value.GetType(), this, expectedResult); + } else { + throw Error.DynamicBinderResultNotAssignable(body.Type, this, expectedResult); + } + } + + // if the target is IDO, standard binders ask it to bind the rule so we may have a target-specific binding. + // it makes sense to restrict on the target's type in such cases. + // ideally IDO metaobjects should do this, but they often miss that type of "this" is significant. + if (IsStandardBinder && args[0] as IDynamicMetaObjectProvider != null) { + if (restrictions == BindingRestrictions.Empty) { + throw Error.DynamicBindingNeedsRestrictions(target.Value.GetType(), this); + } + } + + restrictions = AddRemoteObjectRestrictions(restrictions, args, parameters); + + // Add the return + if (body.NodeType != ExpressionType.Goto) { + body = Expression.Return(returnLabel, body); + } + + // Finally, add restrictions + if (restrictions != BindingRestrictions.Empty) { + body = Expression.IfThen(restrictions.ToExpression(), body); + } + + return body; + } + + private static DynamicMetaObject[] CreateArgumentMetaObjects(object[] args, ReadOnlyCollection parameters) { + DynamicMetaObject[] mos; + if (args.Length != 1) { + mos = new DynamicMetaObject[args.Length - 1]; + for (int i = 1; i < args.Length; i++) { + mos[i - 1] = DynamicMetaObject.Create(args[i], parameters[i]); + } + } else { + mos = DynamicMetaObject.EmptyMetaObjects; + } + return mos; + } + + private static BindingRestrictions AddRemoteObjectRestrictions(BindingRestrictions restrictions, object[] args, ReadOnlyCollection parameters) { +#if !SILVERLIGHT + + for (int i = 0; i < parameters.Count; i++) { + var expr = parameters[i]; + var value = args[i] as MarshalByRefObject; + + // special case for MBR objects. + // when MBR objects are remoted they can have different conversion behavior + // so bindings created for local and remote objects should not be mixed. + if (value != null && !IsComObject(value)) { + BindingRestrictions remotedRestriction; + if (RemotingServices.IsObjectOutOfAppDomain(value)) { + remotedRestriction = BindingRestrictions.GetExpressionRestriction( + Expression.AndAlso( + Expression.NotEqual(expr, Expression.Constant(null)), + Expression.Call( + typeof(RemotingServices).GetMethod("IsObjectOutOfAppDomain"), + expr + ) + ) + ); + } else { + remotedRestriction = BindingRestrictions.GetExpressionRestriction( + Expression.AndAlso( + Expression.NotEqual(expr, Expression.Constant(null)), + Expression.Not( + Expression.Call( + typeof(RemotingServices).GetMethod("IsObjectOutOfAppDomain"), + expr + ) + ) + ) + ); + } + restrictions = restrictions.Merge(remotedRestriction); + } + } + +#endif + return restrictions; + } + + /// + /// When overridden in the derived class, performs the binding of the dynamic operation. + /// + /// The target of the dynamic operation. + /// An array of arguments of the dynamic operation. + /// The representing the result of the binding. + public abstract DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args); + + /// + /// Gets an expression that will cause the binding to be updated. It + /// indicates that the expression's binding is no longer valid. + /// This is typically used when the "version" of a dynamic object has + /// changed. + /// + /// The Type property of the resulting expression; any type is allowed. + /// The update expression. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] + public Expression GetUpdateExpression(Type type) { + return Expression.Goto(CallSiteBinder.UpdateLabel, type); + } + + /// + /// Defers the binding of the operation until later time when the runtime values of all dynamic operation arguments have been computed. + /// + /// The target of the dynamic operation. + /// An array of arguments of the dynamic operation. + /// The representing the result of the binding. + public DynamicMetaObject Defer(DynamicMetaObject target, params DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + + if (args == null) { + return MakeDeferred(target.Restrictions, target); + } else { + return MakeDeferred( + target.Restrictions.Merge(BindingRestrictions.Combine(args)), + args.AddFirst(target) + ); + } + } + + /// + /// Defers the binding of the operation until later time when the runtime values of all dynamic operation arguments have been computed. + /// + /// An array of arguments of the dynamic operation. + /// The representing the result of the binding. + public DynamicMetaObject Defer(params DynamicMetaObject[] args) { + return MakeDeferred(BindingRestrictions.Combine(args), args); + } + + private DynamicMetaObject MakeDeferred(BindingRestrictions rs, params DynamicMetaObject[] args) { + var exprs = DynamicMetaObject.GetExpressions(args); + + Type delegateType = DelegateHelpers.MakeDeferredSiteDelegate(args, ReturnType); + + // Because we know the arguments match the delegate type (we just created the argument types) + // we go directly to DynamicExpression.Make to avoid a bunch of unnecessary argument validation + return new DynamicMetaObject( + DynamicExpression.Make(ReturnType, delegateType, this, new TrueReadOnlyCollection(exprs)), + rs + ); + } + + #endregion + + // used to detect standard MetaObjectBinders. + internal virtual bool IsStandardBinder { + get { + return false; + } + } + +#if !SILVERLIGHT + private static readonly Type ComObjectType = typeof(object).Assembly.GetType("System.__ComObject"); + private static bool IsComObject(object obj) { + // we can't use System.Runtime.InteropServices.Marshal.IsComObject(obj) since it doesn't work in partial trust + return obj != null && ComObjectType.IsAssignableFrom(obj.GetType()); + } +#endif + + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicObject.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicObject.cs new file mode 100644 index 00000000000..30931a0429b --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/DynamicObject.cs @@ -0,0 +1,634 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +using System.Linq.Expressions; +#else +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Provides a simple class that can be inherited from to create an object with dynamic behavior + /// at runtime. Subclasses can override the various binder methods (GetMember, SetMember, Call, etc...) + /// to provide custom behavior that will be invoked at runtime. + /// + /// If a method is not overridden then the DynamicObject does not directly support that behavior and + /// the call site will determine how the binding should be performed. + /// + public class DynamicObject : IDynamicMetaObjectProvider { + + /// + /// Enables derived types to create a new instance of DynamicObject. DynamicObject instances cannot be + /// directly instantiated because they have no implementation of dynamic behavior. + /// + protected DynamicObject() { + } + + #region Public Virtual APIs + + /// + /// Provides the implementation of getting a member. Derived classes can override + /// this method to customize behavior. When not overridden the call site requesting the + /// binder determines the behavior. + /// + /// The binder provided by the call site. + /// The result of the get operation. + /// true if the operation is complete, false if the call site should determine behavior. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate")] + public virtual bool TryGetMember(GetMemberBinder binder, out object result) { + result = null; + return false; + } + + /// + /// Provides the implementation of setting a member. Derived classes can override + /// this method to customize behavior. When not overridden the call site requesting the + /// binder determines the behavior. + /// + /// The binder provided by the call site. + /// The value to set. + /// true if the operation is complete, false if the call site should determine behavior. + public virtual bool TrySetMember(SetMemberBinder binder, object value) { + return false; + } + + /// + /// Provides the implementation of deleting a member. Derived classes can override + /// this method to customize behavior. When not overridden the call site requesting the + /// binder determines the behavior. + /// + /// The binder provided by the call site. + /// true if the operation is complete, false if the call site should determine behavior. + public virtual bool TryDeleteMember(DeleteMemberBinder binder) { + return false; + } + + /// + /// Provides the implementation of calling a member. Derived classes can override + /// this method to customize behavior. When not overridden the call site requesting the + /// binder determines the behavior. + /// + /// The binder provided by the call site. + /// The arguments to be used for the invocation. + /// The result of the invocation. + /// true if the operation is complete, false if the call site should determine behavior. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate")] + public virtual bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { + result = null; + return false; + } + + /// + /// Provides the implementation of converting the DynamicObject to another type. Derived classes + /// can override this method to customize behavior. When not overridden the call site + /// requesting the binder determines the behavior. + /// + /// The binder provided by the call site. + /// The result of the conversion. + /// true if the operation is complete, false if the call site should determine behavior. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate")] + public virtual bool TryConvert(ConvertBinder binder, out object result) { + result = null; + return false; + } + + /// + /// Provides the implementation of creating an instance of the DynamicObject. Derived classes + /// can override this method to customize behavior. When not overridden the call site requesting + /// the binder determines the behavior. + /// + /// The binder provided by the call site. + /// The arguments used for creation. + /// The created instance. + /// true if the operation is complete, false if the call site should determine behavior. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate")] + public virtual bool TryCreateInstance(CreateInstanceBinder binder, object[] args, out object result) { + result = null; + return false; + } + + /// + /// Provides the implementation of invoking the DynamicObject. Derived classes can + /// override this method to customize behavior. When not overridden the call site requesting + /// the binder determines the behavior. + /// + /// The binder provided by the call site. + /// The arguments to be used for the invocation. + /// The result of the invocation. + /// true if the operation is complete, false if the call site should determine behavior. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate")] + public virtual bool TryInvoke(InvokeBinder binder, object[] args, out object result) { + result = null; + return false; + } + + /// + /// Provides the implementation of performing a binary operation. Derived classes can + /// override this method to customize behavior. When not overridden the call site requesting + /// the binder determines the behavior. + /// + /// The binder provided by the call site. + /// The right operand for the operation. + /// The result of the operation. + /// true if the operation is complete, false if the call site should determine behavior. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate")] + public virtual bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out object result) { + result = null; + return false; + } + + /// + /// Provides the implementation of performing a unary operation. Derived classes can + /// override this method to customize behavior. When not overridden the call site requesting + /// the binder determines the behavior. + /// + /// The binder provided by the call site. + /// The result of the operation. + /// true if the operation is complete, false if the call site should determine behavior. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate")] + public virtual bool TryUnaryOperation(UnaryOperationBinder binder, out object result) { + result = null; + return false; + } + + /// + /// Provides the implementation of performing a get index operation. Derived classes can + /// override this method to customize behavior. When not overridden the call site requesting + /// the binder determines the behavior. + /// + /// The binder provided by the call site. + /// The indexes to be used. + /// The result of the operation. + /// true if the operation is complete, false if the call site should determine behavior. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate")] + public virtual bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) { + result = null; + return false; + } + + /// + /// Provides the implementation of performing a set index operation. Derived classes can + /// override this method to custmize behavior. When not overridden the call site requesting + /// the binder determines the behavior. + /// + /// The binder provided by the call site. + /// The indexes to be used. + /// The value to set. + /// true if the operation is complete, false if the call site should determine behavior. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate")] + public virtual bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value) { + return false; + } + + /// + /// Provides the implementation of performing a delete index operation. Derived classes + /// can override this method to custmize behavior. When not overridden the call site + /// requesting the binder determines the behavior. + /// + /// The binder provided by the call site. + /// The indexes to be deleted. + /// true if the operation is complete, false if the call site should determine behavior. + public virtual bool TryDeleteIndex(DeleteIndexBinder binder, object[] indexes) { + return false; + } + + /// + /// Returns the enumeration of all dynamic member names. + /// + /// The list of dynamic member names. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] + public virtual System.Collections.Generic.IEnumerable GetDynamicMemberNames() { + return new string[0]; + } + #endregion + + #region MetaDynamic + + private sealed class MetaDynamic : DynamicMetaObject { + + internal MetaDynamic(Expression expression, DynamicObject value) + : base(expression, BindingRestrictions.Empty, value) { + } + + public override System.Collections.Generic.IEnumerable GetDynamicMemberNames() + { + return Value.GetDynamicMemberNames(); + } + + public override DynamicMetaObject BindGetMember(GetMemberBinder binder) { + if (IsOverridden("TryGetMember")) { + return CallMethodWithResult("TryGetMember", binder, NoArgs, (e) => binder.FallbackGetMember(this, e)); + } + + return base.BindGetMember(binder); + } + + public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicMetaObject value) { + if (IsOverridden("TrySetMember")) { + return CallMethodReturnLast("TrySetMember", binder, GetArgs(value), (e) => binder.FallbackSetMember(this, value, e)); + } + + return base.BindSetMember(binder, value); + } + + public override DynamicMetaObject BindDeleteMember(DeleteMemberBinder binder) { + if (IsOverridden("TryDeleteMember")) { + return CallMethodNoResult("TryDeleteMember", binder, NoArgs, (e) => binder.FallbackDeleteMember(this, e)); + } + + return base.BindDeleteMember(binder); + } + + public override DynamicMetaObject BindConvert(ConvertBinder binder) { + if (IsOverridden("TryConvert")) { + return CallMethodWithResult("TryConvert", binder, NoArgs, (e) => binder.FallbackConvert(this, e)); + } + + return base.BindConvert(binder); + } + + public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) { + if (IsOverridden("TryInvokeMember")) { + return CallMethodWithResult("TryInvokeMember", binder, GetArgArray(args), (e) => binder.FallbackInvokeMember(this, args, e)); + } else if (IsOverridden("TryGetMember")) { + // Generate a tree like: + // + // { + // object result; + // TryGetMember(payload, out result) ? FallbackInvoke(result) : fallbackResult + // } + // + // Then it calls FallbackInvokeMember with this tree as the + // "error", giving the language the option of using this + // tree or doing .NET binding. + // + return CallMethodWithResult( + "TryGetMember", new GetBinderAdapter(binder), NoArgs, + (e) => binder.FallbackInvokeMember(this, args, e), + (e) => binder.FallbackInvoke(e, args, null) + ); + } + + return base.BindInvokeMember(binder, args); + } + + + public override DynamicMetaObject BindCreateInstance(CreateInstanceBinder binder, DynamicMetaObject[] args) { + if (IsOverridden("TryCreateInstance")) { + return CallMethodWithResult("TryCreateInstance", binder, GetArgArray(args), (e) => binder.FallbackCreateInstance(this, args, e)); + } + + return base.BindCreateInstance(binder, args); + } + + public override DynamicMetaObject BindInvoke(InvokeBinder binder, DynamicMetaObject[] args) { + if (IsOverridden("TryInvoke")) { + return CallMethodWithResult("TryInvoke", binder, GetArgArray(args), (e) => binder.FallbackInvoke(this, args, e)); + } + + return base.BindInvoke(binder, args); + } + + public override DynamicMetaObject BindBinaryOperation(BinaryOperationBinder binder, DynamicMetaObject arg) { + if (IsOverridden("TryBinaryOperation")) { + return CallMethodWithResult("TryBinaryOperation", binder, GetArgs(arg), (e) => binder.FallbackBinaryOperation(this, arg, e)); + } + + return base.BindBinaryOperation(binder, arg); + } + + public override DynamicMetaObject BindUnaryOperation(UnaryOperationBinder binder) { + if (IsOverridden("TryUnaryOperation")) { + return CallMethodWithResult("TryUnaryOperation", binder, NoArgs, (e) => binder.FallbackUnaryOperation(this, e)); + } + + return base.BindUnaryOperation(binder); + } + + public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) { + if (IsOverridden("TryGetIndex")) { + return CallMethodWithResult("TryGetIndex", binder, GetArgArray(indexes), (e) => binder.FallbackGetIndex(this, indexes, e)); + } + + return base.BindGetIndex(binder, indexes); + } + + public override DynamicMetaObject BindSetIndex(SetIndexBinder binder, DynamicMetaObject[] indexes, DynamicMetaObject value) { + if (IsOverridden("TrySetIndex")) { + return CallMethodReturnLast("TrySetIndex", binder, GetArgArray(indexes, value), (e) => binder.FallbackSetIndex(this, indexes, value, e)); + } + + return base.BindSetIndex(binder, indexes, value); + } + + public override DynamicMetaObject BindDeleteIndex(DeleteIndexBinder binder, DynamicMetaObject[] indexes) { + if (IsOverridden("TryDeleteIndex")) { + return CallMethodNoResult("TryDeleteIndex", binder, GetArgArray(indexes), (e) => binder.FallbackDeleteIndex(this, indexes, e)); + } + + return base.BindDeleteIndex(binder, indexes); + } + + private delegate DynamicMetaObject Fallback(DynamicMetaObject errorSuggestion); + + private readonly static Expression[] NoArgs = new Expression[0]; + + private static Expression[] GetArgs(params DynamicMetaObject[] args) { + Expression[] paramArgs = DynamicMetaObject.GetExpressions(args); + + for (int i = 0; i < paramArgs.Length; i++) { + paramArgs[i] = Expression.Convert(args[i].Expression, typeof(object)); + } + + return paramArgs; + } + + private static Expression[] GetArgArray(DynamicMetaObject[] args) { + return new[] { Expression.NewArrayInit(typeof(object), GetArgs(args)) }; + } + + private static Expression[] GetArgArray(DynamicMetaObject[] args, DynamicMetaObject value) { + return new Expression[] { + Expression.NewArrayInit(typeof(object), GetArgs(args)), + Expression.Convert(value.Expression, typeof(object)) + }; + } + + private static ConstantExpression Constant(DynamicMetaObjectBinder binder) { + Type t = binder.GetType(); + while (!t.IsVisible) { + t = t.BaseType; + } + return Expression.Constant(binder, t); + } + + /// + /// Helper method for generating a MetaObject which calls a + /// specific method on Dynamic that returns a result + /// + private DynamicMetaObject CallMethodWithResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback fallback) { + return CallMethodWithResult(methodName, binder, args, fallback, null); + } + + /// + /// Helper method for generating a MetaObject which calls a + /// specific method on Dynamic that returns a result + /// + private DynamicMetaObject CallMethodWithResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback fallback, Fallback fallbackInvoke) { + // + // First, call fallback to do default binding + // This produces either an error or a call to a .NET member + // + DynamicMetaObject fallbackResult = fallback(null); + + // + // Build a new expression like: + // { + // object result; + // TryGetMember(payload, out result) ? fallbackInvoke(result) : fallbackResult + // } + // + var result = Expression.Parameter(typeof(object), null); + + var callArgs = new Expression[args.Length + 2]; + Array.Copy(args, 0, callArgs, 1, args.Length); + callArgs[0] = Constant(binder); + callArgs[callArgs.Length - 1] = result; + + var resultMO = new DynamicMetaObject(result, BindingRestrictions.Empty); + + // Need to add a conversion if calling TryConvert + if (binder.ReturnType != typeof(object)) { + Debug.Assert(binder is ConvertBinder && fallbackInvoke == null); + + var convert = Expression.Convert(resultMO.Expression, binder.ReturnType); + // will always be a cast or unbox + Debug.Assert(convert.Method == null); + + resultMO = new DynamicMetaObject(convert, resultMO.Restrictions); + } + + if (fallbackInvoke != null) { + resultMO = fallbackInvoke(resultMO); + } + + var callDynamic = new DynamicMetaObject( + Expression.Block( + new[] { result }, + Expression.Condition( + Expression.Call( + GetLimitedSelf(), + typeof(DynamicObject).GetMethod(methodName), + callArgs + ), + resultMO.Expression, + fallbackResult.Expression, + binder.ReturnType + ) + ), + GetRestrictions().Merge(resultMO.Restrictions).Merge(fallbackResult.Restrictions) + ); + + // + // Now, call fallback again using our new MO as the error + // When we do this, one of two things can happen: + // 1. Binding will succeed, and it will ignore our call to + // the dynamic method, OR + // 2. Binding will fail, and it will use the MO we created + // above. + // + return fallback(callDynamic); + } + + + /// + /// Helper method for generating a MetaObject which calls a + /// specific method on Dynamic, but uses one of the arguments for + /// the result. + /// + private DynamicMetaObject CallMethodReturnLast(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback fallback) { + // + // First, call fallback to do default binding + // This produces either an error or a call to a .NET member + // + DynamicMetaObject fallbackResult = fallback(null); + + // + // Build a new expression like: + // { + // object result; + // TrySetMember(payload, result = value) ? result : fallbackResult + // } + // + + var result = Expression.Parameter(typeof(object), null); + var callArgs = args.AddFirst(Constant(binder)); + callArgs[args.Length] = Expression.Assign(result, callArgs[args.Length]); + + var callDynamic = new DynamicMetaObject( + Expression.Block( + new[] { result }, + Expression.Condition( + Expression.Call( + GetLimitedSelf(), + typeof(DynamicObject).GetMethod(methodName), + callArgs + ), + result, + fallbackResult.Expression, + typeof(object) + ) + ), + GetRestrictions().Merge(fallbackResult.Restrictions) + ); + + // + // Now, call fallback again using our new MO as the error + // When we do this, one of two things can happen: + // 1. Binding will succeed, and it will ignore our call to + // the dynamic method, OR + // 2. Binding will fail, and it will use the MO we created + // above. + // + return fallback(callDynamic); + } + + + /// + /// Helper method for generating a MetaObject which calls a + /// specific method on Dynamic, but uses one of the arguments for + /// the result. + /// + private DynamicMetaObject CallMethodNoResult(string methodName, DynamicMetaObjectBinder binder, Expression[] args, Fallback fallback) { + // + // First, call fallback to do default binding + // This produces either an error or a call to a .NET member + // + DynamicMetaObject fallbackResult = fallback(null); + + // + // Build a new expression like: + // if (TryDeleteMember(payload)) { } else { fallbackResult } + // + var callDynamic = new DynamicMetaObject( + Expression.Condition( + Expression.Call( + GetLimitedSelf(), + typeof(DynamicObject).GetMethod(methodName), + args.AddFirst(Constant(binder)) + ), + Expression.Empty(), + fallbackResult.Expression, + typeof(void) + ), + GetRestrictions().Merge(fallbackResult.Restrictions) + ); + + // + // Now, call fallback again using our new MO as the error + // When we do this, one of two things can happen: + // 1. Binding will succeed, and it will ignore our call to + // the dynamic method, OR + // 2. Binding will fail, and it will use the MO we created + // above. + // + return fallback(callDynamic); + } + + /// + /// Checks if the derived type has overridden the specified method. If there is no + /// implementation for the method provided then Dynamic falls back to the base class + /// behavior which lets the call site determine how the binder is performed. + /// + private bool IsOverridden(string method) { + var methods = Value.GetType().GetMember(method, MemberTypes.Method, BindingFlags.Public | BindingFlags.Instance); + + foreach (MethodInfo mi in methods) { + if (mi.DeclaringType != typeof(DynamicObject) && mi.GetBaseDefinition().DeclaringType == typeof(DynamicObject)) { + return true; + } + } + + return false; + } + + /// + /// Returns a Restrictions object which includes our current restrictions merged + /// with a restriction limiting our type + /// + private BindingRestrictions GetRestrictions() { + Debug.Assert(Restrictions == BindingRestrictions.Empty, "We don't merge, restrictions are always empty"); + + return BindingRestrictions.GetTypeRestriction(this); + } + + /// + /// Returns our Expression converted to our known LimitType + /// + private Expression GetLimitedSelf() { + if (TypeUtils.AreEquivalent(Expression.Type, LimitType)) { + return Expression; + } + return Expression.Convert(Expression, LimitType); + } + + private new DynamicObject Value { + get { + return (DynamicObject)base.Value; + } + } + + // It is okay to throw NotSupported from this binder. This object + // is only used by DynamicObject.GetMember--it is not expected to + // (and cannot) implement binding semantics. It is just so the DO + // can use the Name and IgnoreCase properties. + private sealed class GetBinderAdapter : GetMemberBinder { + internal GetBinderAdapter(InvokeMemberBinder binder) + : base(binder.Name, binder.IgnoreCase) { + } + + public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { + throw new NotSupportedException(); + } + } + } + + #endregion + + #region IDynamicMetaObjectProvider Members + + /// + /// The provided MetaObject will dispatch to the Dynamic virtual methods. + /// The object can be encapsulated inside of another MetaObject to + /// provide custom behavior for individual actions. + /// + public virtual DynamicMetaObject GetMetaObject(Expression parameter) { + return new MetaDynamic(parameter, this); + } + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/ExpandoClass.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/ExpandoClass.cs new file mode 100644 index 00000000000..db41d72827b --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/ExpandoClass.cs @@ -0,0 +1,197 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ + +#if CODEPLEX_40 +using System; +#else +using System; using Microsoft; +#endif +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +using System.Dynamic.Utils; +#else +using Microsoft.Linq.Expressions; +using Microsoft.Scripting.Utils; +#endif +using System.Text; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Represents a dynamically assigned class. Expando objects which share the same + /// members will share the same class. Classes are dynamically assigned as the + /// expando object gains members. + /// + internal class ExpandoClass { + private readonly string[] _keys; // list of names associated with each element in the data array, sorted + private readonly int _hashCode; // pre-calculated hash code of all the keys the class contains + private Dictionary> _transitions; // cached transitions + + private const int EmptyHashCode = 6551; // hash code of the empty ExpandoClass. + + internal static ExpandoClass Empty = new ExpandoClass(); // The empty Expando class - all Expando objects start off w/ this class. + + /// + /// Constructs the empty ExpandoClass. This is the class used when an + /// empty Expando object is initially constructed. + /// + internal ExpandoClass() { + _hashCode = EmptyHashCode; + _keys = new string[0]; + } + + /// + /// Constructs a new ExpandoClass that can hold onto the specified keys. The + /// keys must be sorted ordinally. The hash code must be precalculated for + /// the keys. + /// + internal ExpandoClass(string[] keys, int hashCode) { + _hashCode = hashCode; + _keys = keys; + } + + /// + /// Finds or creates a new ExpandoClass given the existing set of keys + /// in this ExpandoClass plus the new key to be added. Members in an + /// ExpandoClass are always stored case sensitively. + /// + internal ExpandoClass FindNewClass(string newKey) { + // just XOR the newKey hash code + int hashCode = _hashCode ^ newKey.GetHashCode(); + + lock (this) { + List infos = GetTransitionList(hashCode); + + for (int i = 0; i < infos.Count; i++) { + ExpandoClass klass = infos[i].Target as ExpandoClass; + if (klass == null) { + infos.RemoveAt(i); + i--; + continue; + } + + if (string.Equals(klass._keys[klass._keys.Length - 1], newKey, StringComparison.Ordinal)) { + // the new key is the key we added in this transition + return klass; + } + } + + // no applicable transition, create a new one + string[] keys = new string[_keys.Length + 1]; + Array.Copy(_keys, keys, _keys.Length); + keys[_keys.Length] = newKey; + ExpandoClass ec = new ExpandoClass(keys, hashCode); + + infos.Add(new WeakReference(ec)); + return ec; + } + } + + /// + /// Gets the lists of transitions that are valid from this ExpandoClass + /// to an ExpandoClass whos keys hash to the apporopriate hash code. + /// + private List GetTransitionList(int hashCode) { + if (_transitions == null) { + _transitions = new Dictionary>(); + } + + List infos; + if (!_transitions.TryGetValue(hashCode, out infos)) { + _transitions[hashCode] = infos = new List(); + } + + return infos; + } + + /// + /// Gets the index at which the value should be stored for the specified name. + /// + internal int GetValueIndex(string name, bool caseInsensitive, ExpandoObject obj) { + if (caseInsensitive) { + return GetValueIndexCaseInsensitive(name, obj); + } else { + return GetValueIndexCaseSensitive(name); + } + } + + /// + /// Gets the index at which the value should be stored for the specified name + /// case sensitively. Returns the index even if the member is marked as deleted. + /// + internal int GetValueIndexCaseSensitive(string name) { + for (int i = 0; i < _keys.Length; i++) { + if (string.Equals( + _keys[i], + name, + StringComparison.Ordinal)) { + return i; + } + } + return ExpandoObject.NoMatch; + } + + /// + /// Gets the index at which the value should be stored for the specified name, + /// the method is only used in the case-insensitive case. + /// + /// the name of the member + /// The ExpandoObject associated with the class + /// that is used to check if a member has been deleted. + /// + /// the exact match if there is one + /// if there is exactly one member with case insensitive match, return it + /// otherwise we throw AmbiguousMatchException. + /// + private int GetValueIndexCaseInsensitive(string name, ExpandoObject obj) { + int caseInsensitiveMatch = ExpandoObject.NoMatch; //the location of the case-insensitive matching member + lock (obj.LockObject) { + for (int i = _keys.Length - 1; i >= 0; i--) { + if (string.Equals( + _keys[i], + name, + StringComparison.OrdinalIgnoreCase)) { + //if the matching member is deleted, continue searching + if (!obj.IsDeletedMember(i)) { + if (caseInsensitiveMatch == ExpandoObject.NoMatch) { + caseInsensitiveMatch = i; + } else { + //Ambigous match, stop searching + return ExpandoObject.AmbiguousMatchFound; + } + } + } + } + } + //There is exactly one member with case insensitive match. + return caseInsensitiveMatch; + } + + /// + /// Gets the names of the keys that can be stored in the Expando class. The + /// list is sorted ordinally. + /// + internal string[] Keys { + get { + return _keys; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/ExpandoObject.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/ExpandoObject.cs new file mode 100644 index 00000000000..8222ed322d1 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/ExpandoObject.cs @@ -0,0 +1,1108 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic; +using System.Dynamic.Utils; +using System.Linq.Expressions; +#else +using Microsoft.Scripting; +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Represents an object with members that can be dynamically added and removed at runtime. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] + public sealed class ExpandoObject : IDynamicMetaObjectProvider, IDictionary, INotifyPropertyChanged { + internal readonly object LockObject; // the readonly field is used for locking the Expando object + private ExpandoData _data; // the data currently being held by the Expando object + private int _count; // the count of available members + + internal readonly static object Uninitialized = new object(); // A marker object used to identify that a value is uninitialized. + + internal const int AmbiguousMatchFound = -2; // The value is used to indicate there exists ambiguous match in the Expando object + internal const int NoMatch = -1; // The value is used to indicate there is no matching member + + private PropertyChangedEventHandler _propertyChanged; + + /// + /// Creates a new ExpandoObject with no members. + /// + public ExpandoObject() { + _data = ExpandoData.Empty; + LockObject = new object(); + } + + #region Get/Set/Delete Helpers + + /// + /// Try to get the data stored for the specified class at the specified index. If the + /// class has changed a full lookup for the slot will be performed and the correct + /// value will be retrieved. + /// + internal bool TryGetValue(object indexClass, int index, string name, bool ignoreCase, out object value) { + // read the data now. The data is immutable so we get a consistent view. + // If there's a concurrent writer they will replace data and it just appears + // that we won the race + ExpandoData data = _data; + if (data.Class != indexClass || ignoreCase) { + /* Re-search for the index matching the name here if + * 1) the class has changed, we need to get the correct index and return + * the value there. + * 2) the search is case insensitive: + * a. the member specified by index may be deleted, but there might be other + * members matching the name if the binder is case insensitive. + * b. the member that exactly matches the name didn't exist before and exists now, + * need to find the exact match. + */ + index = data.Class.GetValueIndex(name, ignoreCase, this); + if (index == ExpandoObject.AmbiguousMatchFound) { + throw Error.AmbiguousMatchInExpandoObject(name); + } + } + + if (index == ExpandoObject.NoMatch) { + value = null; + return false; + } + + // Capture the value into a temp, so it doesn't get mutated after we check + // for Uninitialized. + object temp = data[index]; + if (temp == Uninitialized) { + value = null; + return false; + } + + // index is now known to be correct + value = temp; + return true; + } + + /// + /// Sets the data for the specified class at the specified index. If the class has + /// changed then a full look for the slot will be performed. If the new class does + /// not have the provided slot then the Expando's class will change. Only case sensitive + /// setter is supported in ExpandoObject. + /// + internal void TrySetValue(object indexClass, int index, object value, string name, bool ignoreCase, bool add) { + ExpandoData data; + object oldValue; + + lock (LockObject) { + data = _data; + + if (data.Class != indexClass || ignoreCase) { + // The class has changed or we are doing a case-insensitive search, + // we need to get the correct index and set the value there. If we + // don't have the value then we need to promote the class - that + // should only happen when we have multiple concurrent writers. + index = data.Class.GetValueIndex(name, ignoreCase, this); + if (index == ExpandoObject.AmbiguousMatchFound) { + throw Error.AmbiguousMatchInExpandoObject(name); + } + if (index == ExpandoObject.NoMatch) { + // Before creating a new class with the new member, need to check + // if there is the exact same member but is deleted. We should reuse + // the class if there is such a member. + int exactMatch = ignoreCase ? + data.Class.GetValueIndexCaseSensitive(name) : + index; + if (exactMatch != ExpandoObject.NoMatch) { + Debug.Assert(data[exactMatch] == Uninitialized); + index = exactMatch; + } else { + ExpandoClass newClass = data.Class.FindNewClass(name); + data = PromoteClassCore(data.Class, newClass); + // After the class promotion, there must be an exact match, + // so we can do case-sensitive search here. + index = data.Class.GetValueIndexCaseSensitive(name); + Debug.Assert(index != ExpandoObject.NoMatch); + } + } + } + + // Setting an uninitialized member increases the count of available members + oldValue = data[index]; + if (oldValue == Uninitialized) { + _count++; + } else if (add) { + throw Error.SameKeyExistsInExpando(name); + } + + data[index] = value; + } + + // Notify property changed, outside of the lock. + var propertyChanged = _propertyChanged; + if (propertyChanged != null && value != oldValue) { + // Use the canonical case for the key. + propertyChanged(this, new PropertyChangedEventArgs(data.Class.Keys[index])); + } + } + + /// + /// Deletes the data stored for the specified class at the specified index. + /// + internal bool TryDeleteValue(object indexClass, int index, string name, bool ignoreCase, object deleteValue) { + ExpandoData data; + lock (LockObject) { + data = _data; + + if (data.Class != indexClass || ignoreCase) { + // the class has changed or we are doing a case-insensitive search, + // we need to get the correct index. If there is no associated index + // we simply can't have the value and we return false. + index = data.Class.GetValueIndex(name, ignoreCase, this); + if (index == ExpandoObject.AmbiguousMatchFound) { + throw Error.AmbiguousMatchInExpandoObject(name); + } + } + if (index == ExpandoObject.NoMatch) { + return false; + } + + object oldValue = data[index]; + if (oldValue == Uninitialized) { + return false; + } + + // Make sure the value matches, if requested. + // + // It's a shame we have to call Equals with the lock held but + // there doesn't seem to be a good way around that, and + // ConcurrentDictionary in mscorlib does the same thing. + if (deleteValue != Uninitialized && !object.Equals(oldValue, deleteValue)) { + return false; + } + + data[index] = Uninitialized; + + // Deleting an available member decreases the count of available members + _count--; + } + + // Notify property changed, outside of the lock. + var propertyChanged = _propertyChanged; + if (propertyChanged != null) { + // Use the canonical case for the key. + propertyChanged(this, new PropertyChangedEventArgs(data.Class.Keys[index])); + } + + return true; + } + + /// + /// Returns true if the member at the specified index has been deleted, + /// otherwise false. Call this function holding the lock. + /// + internal bool IsDeletedMember(int index) { + Debug.Assert(index >= 0 && index <= _data.Length); + + if (index == _data.Length) { + // The member is a newly added by SetMemberBinder and not in data yet + return false; + } + + return _data[index] == ExpandoObject.Uninitialized; + } + + /// + /// Exposes the ExpandoClass which we've associated with this + /// Expando object. Used for type checks in rules. + /// + internal ExpandoClass Class { + get { + return _data.Class; + } + } + + /// + /// Promotes the class from the old type to the new type and returns the new + /// ExpandoData object. + /// + private ExpandoData PromoteClassCore(ExpandoClass oldClass, ExpandoClass newClass) { + Debug.Assert(oldClass != newClass); + + lock (LockObject) { + if (_data.Class == oldClass) { + _data = _data.UpdateClass(newClass); + } + return _data; + } + } + + /// + /// Internal helper to promote a class. Called from our RuntimeOps helper. This + /// version simply doesn't expose the ExpandoData object which is a private + /// data structure. + /// + internal void PromoteClass(object oldClass, object newClass) { + PromoteClassCore((ExpandoClass)oldClass, (ExpandoClass)newClass); + } + + #endregion + + #region IDynamicMetaObjectProvider Members + + DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter) { + return new MetaExpando(parameter, this); + } + #endregion + + #region Helper methods + private void TryAddMember(string key, object value) { + ContractUtils.RequiresNotNull(key, "key"); + // Pass null to the class, which forces lookup. + TrySetValue(null, -1, value, key, false, true); + } + + private bool TryGetValueForKey(string key, out object value) { + // Pass null to the class, which forces lookup. + return TryGetValue(null, -1, key, false, out value); + } + + private bool ExpandoContainsKey(string key) { + return _data.Class.GetValueIndexCaseSensitive(key) >= 0; + } + + // We create a non-generic type for the debug view for each different collection type + // that uses DebuggerTypeProxy, instead of defining a generic debug view type and + // using different instantiations. The reason for this is that support for generics + // with using DebuggerTypeProxy is limited. For C#, DebuggerTypeProxy supports only + // open types (from MSDN http://msdn.microsoft.com/en-us/library/d8eyd8zc.aspx). + private sealed class KeyCollectionDebugView { + private ICollection collection; + public KeyCollectionDebugView(ICollection collection) { + Debug.Assert(collection != null); + this.collection = collection; + } + + [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] + public string[] Items { + get { + string[] items = new string[collection.Count]; + collection.CopyTo(items, 0); + return items; + } + } + } + + [DebuggerTypeProxy(typeof(KeyCollectionDebugView))] + [DebuggerDisplay("Count = {Count}")] + private class KeyCollection : ICollection { + private readonly ExpandoObject _expando; + private readonly int _expandoVersion; + private readonly int _expandoCount; + private readonly ExpandoData _expandoData; + + internal KeyCollection(ExpandoObject expando) { + lock (expando.LockObject) { + _expando = expando; + _expandoVersion = expando._data.Version; + _expandoCount = expando._count; + _expandoData = expando._data; + } + } + + private void CheckVersion() { + if (_expando._data.Version != _expandoVersion || _expandoData != _expando._data) { + //the underlying expando object has changed + throw Error.CollectionModifiedWhileEnumerating(); + } + } + + #region ICollection Members + + public void Add(string item) { + throw Error.CollectionReadOnly(); + } + + public void Clear() { + throw Error.CollectionReadOnly(); + } + + public bool Contains(string item) { + lock (_expando.LockObject) { + CheckVersion(); + return _expando.ExpandoContainsKey(item); + } + } + + public void CopyTo(string[] array, int arrayIndex) { + ContractUtils.RequiresNotNull(array, "array"); + ContractUtils.RequiresArrayRange(array, arrayIndex, _expandoCount, "arrayIndex", "Count"); + lock (_expando.LockObject) { + CheckVersion(); + ExpandoData data = _expando._data; + for (int i = 0; i < data.Class.Keys.Length; i++) { + if (data[i] != Uninitialized) { + array[arrayIndex++] = data.Class.Keys[i]; + } + } + } + } + + public int Count { + get { + CheckVersion(); + return _expandoCount; + } + } + + public bool IsReadOnly { + get { return true; } + } + + public bool Remove(string item) { + throw Error.CollectionReadOnly(); + } + + #endregion + + #region IEnumerable Members + + public IEnumerator GetEnumerator() { + for (int i = 0, n = _expandoData.Class.Keys.Length; i < n; i++) { + CheckVersion(); + if (_expandoData[i] != Uninitialized) { + yield return _expandoData.Class.Keys[i]; + } + } + } + + #endregion + + #region IEnumerable Members + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { + return GetEnumerator(); + } + + #endregion + } + + // We create a non-generic type for the debug view for each different collection type + // that uses DebuggerTypeProxy, instead of defining a generic debug view type and + // using different instantiations. The reason for this is that support for generics + // with using DebuggerTypeProxy is limited. For C#, DebuggerTypeProxy supports only + // open types (from MSDN http://msdn.microsoft.com/en-us/library/d8eyd8zc.aspx). + private sealed class ValueCollectionDebugView { + private ICollection collection; + public ValueCollectionDebugView(ICollection collection) { + Debug.Assert(collection != null); + this.collection = collection; + } + + [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] + public object[] Items { + get { + object[] items = new object[collection.Count]; + collection.CopyTo(items, 0); + return items; + } + } + } + + [DebuggerTypeProxy(typeof(ValueCollectionDebugView))] + [DebuggerDisplay("Count = {Count}")] + private class ValueCollection : ICollection { + private readonly ExpandoObject _expando; + private readonly int _expandoVersion; + private readonly int _expandoCount; + private readonly ExpandoData _expandoData; + + internal ValueCollection(ExpandoObject expando) { + lock (expando.LockObject) { + _expando = expando; + _expandoVersion = expando._data.Version; + _expandoCount = expando._count; + _expandoData = expando._data; + } + } + + private void CheckVersion() { + if (_expando._data.Version != _expandoVersion || _expandoData != _expando._data) { + //the underlying expando object has changed + throw Error.CollectionModifiedWhileEnumerating(); + } + } + + #region ICollection Members + + public void Add(object item) { + throw Error.CollectionReadOnly(); + } + + public void Clear() { + throw Error.CollectionReadOnly(); + } + + public bool Contains(object item) { + lock (_expando.LockObject) { + CheckVersion(); + + ExpandoData data = _expando._data; + for (int i = 0; i < data.Class.Keys.Length; i++) { + + // See comment in TryDeleteValue; it's okay to call + // object.Equals with the lock held. + if (object.Equals(data[i], item)) { + return true; + } + } + return false; + } + } + + public void CopyTo(object[] array, int arrayIndex) { + ContractUtils.RequiresNotNull(array, "array"); + ContractUtils.RequiresArrayRange(array, arrayIndex, _expandoCount, "arrayIndex", "Count"); + lock (_expando.LockObject) { + CheckVersion(); + ExpandoData data = _expando._data; + for (int i = 0; i < data.Class.Keys.Length; i++) { + if (data[i] != Uninitialized) { + array[arrayIndex++] = data[i]; + } + } + } + } + + public int Count { + get { + CheckVersion(); + return _expandoCount; + } + } + + public bool IsReadOnly { + get { return true; } + } + + public bool Remove(object item) { + throw Error.CollectionReadOnly(); + } + + #endregion + + #region IEnumerable Members + + public IEnumerator GetEnumerator() { + ExpandoData data = _expando._data; + for (int i = 0; i < data.Class.Keys.Length; i++) { + CheckVersion(); + // Capture the value into a temp so we don't inadvertently + // return Uninitialized. + object temp = data[i]; + if (temp != Uninitialized) { + yield return temp; + } + } + } + + #endregion + + #region IEnumerable Members + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { + return GetEnumerator(); + } + + #endregion + } + + #endregion + + #region IDictionary Members + ICollection IDictionary.Keys { + get { + return new KeyCollection(this); + } + } + + ICollection IDictionary.Values { + get { + return new ValueCollection(this); + } + } + + object IDictionary.this[string key] { + get { + object value; + if (!TryGetValueForKey(key, out value)) { + throw Error.KeyDoesNotExistInExpando(key); + } + return value; + } + set { + ContractUtils.RequiresNotNull(key, "key"); + // Pass null to the class, which forces lookup. + TrySetValue(null, -1, value, key, false, false); + } + } + + void IDictionary.Add(string key, object value) { + this.TryAddMember(key, value); + } + + bool IDictionary.ContainsKey(string key) { + ContractUtils.RequiresNotNull(key, "key"); + + ExpandoData data = _data; + int index = data.Class.GetValueIndexCaseSensitive(key); + return index >= 0 && data[index] != Uninitialized; + } + + bool IDictionary.Remove(string key) { + ContractUtils.RequiresNotNull(key, "key"); + // Pass null to the class, which forces lookup. + return TryDeleteValue(null, -1, key, false, Uninitialized); + } + + bool IDictionary.TryGetValue(string key, out object value) { + return TryGetValueForKey(key, out value); + } + + #endregion + + #region ICollection> Members + int ICollection>.Count { + get { + return _count; + } + } + + bool ICollection>.IsReadOnly { + get { return false; } + } + + void ICollection>.Add(KeyValuePair item) { + TryAddMember(item.Key, item.Value); + } + + void ICollection>.Clear() { + // We remove both class and data! + ExpandoData data; + lock (LockObject) { + data = _data; + _data = ExpandoData.Empty; + _count = 0; + } + + // Notify property changed for all properties. + var propertyChanged = _propertyChanged; + if (propertyChanged != null) { + for (int i = 0, n = data.Class.Keys.Length; i < n; i++) { + if (data[i] != Uninitialized) { + propertyChanged(this, new PropertyChangedEventArgs(data.Class.Keys[i])); + } + } + } + } + + bool ICollection>.Contains(KeyValuePair item) { + object value; + if (!TryGetValueForKey(item.Key, out value)) { + return false; + } + + return object.Equals(value, item.Value); + } + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) { + ContractUtils.RequiresNotNull(array, "array"); + ContractUtils.RequiresArrayRange(array, arrayIndex, _count, "arrayIndex", "Count"); + + // We want this to be atomic and not throw + lock (LockObject) { + foreach (KeyValuePair item in this) { + array[arrayIndex++] = item; + } + } + } + + bool ICollection>.Remove(KeyValuePair item) { + return TryDeleteValue(null, -1, item.Key, false, item.Value); + } + #endregion + + #region IEnumerable> Member + + IEnumerator> IEnumerable>.GetEnumerator() { + ExpandoData data = _data; + return GetExpandoEnumerator(data, data.Version); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { + ExpandoData data = _data; + return GetExpandoEnumerator(data, data.Version); + } + + // Note: takes the data and version as parameters so they will be + // captured before the first call to MoveNext(). + private IEnumerator> GetExpandoEnumerator(ExpandoData data, int version) { + for (int i = 0; i < data.Class.Keys.Length; i++) { + if (_data.Version != version || data != _data) { + // The underlying expando object has changed: + // 1) the version of the expando data changed + // 2) the data object is changed + throw Error.CollectionModifiedWhileEnumerating(); + } + // Capture the value into a temp so we don't inadvertently + // return Uninitialized. + object temp = data[i]; + if (temp != Uninitialized) { + yield return new KeyValuePair(data.Class.Keys[i], temp); + } + } + } + #endregion + + #region MetaExpando + + private class MetaExpando : DynamicMetaObject { + public MetaExpando(Expression expression, ExpandoObject value) + : base(expression, BindingRestrictions.Empty, value) { + } + + private DynamicMetaObject GetDynamicMetaObjectForMember(string name, bool ignoreCase, DynamicMetaObject fallback) { + ExpandoClass klass = Value.Class; + + //try to find the member, including the deleted members + int index = klass.GetValueIndex(name, ignoreCase, Value); + + ParameterExpression value = Expression.Parameter(typeof(object), "value"); + + Expression tryGetValue = Expression.Call( + typeof(RuntimeOps).GetMethod("ExpandoTryGetValue"), + GetLimitedSelf(), + Expression.Constant(klass, typeof(object)), + Expression.Constant(index), + Expression.Constant(name), + Expression.Constant(ignoreCase), + value + ); + + Expression memberValue = Expression.Block( + new[] { value }, + Expression.Condition( + tryGetValue, + value, + fallback.Expression, + typeof(object) + ) + ); + + return new DynamicMetaObject(memberValue, fallback.Restrictions); + } + + public override DynamicMetaObject BindGetMember(GetMemberBinder binder) { + ContractUtils.RequiresNotNull(binder, "binder"); + DynamicMetaObject memberValue = GetDynamicMetaObjectForMember( + binder.Name, + binder.IgnoreCase, + binder.FallbackGetMember(this) + ); + + return AddDynamicTestAndDefer(binder, Value.Class, null, memberValue); + } + + public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(binder, "binder"); + DynamicMetaObject memberValue = GetDynamicMetaObjectForMember( + binder.Name, + binder.IgnoreCase, + binder.FallbackInvokeMember(this, args) + ); + //invoke the member value using the language's binder + return AddDynamicTestAndDefer( + binder, + Value.Class, + null, + binder.FallbackInvoke(memberValue, args, null) + ); + } + + public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicMetaObject value) { + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.RequiresNotNull(value, "value"); + + ExpandoClass klass; + int index; + + ExpandoClass originalClass = GetClassEnsureIndex(binder.Name, binder.IgnoreCase, Value, out klass, out index); + + return AddDynamicTestAndDefer( + binder, + klass, + originalClass, + new DynamicMetaObject( + Expression.Call( + typeof(RuntimeOps).GetMethod("ExpandoTrySetValue"), + GetLimitedSelf(), + Expression.Constant(klass, typeof(object)), + Expression.Constant(index), + Expression.Convert(value.Expression, typeof(object)), + Expression.Constant(binder.Name), + Expression.Constant(binder.IgnoreCase) + ), + BindingRestrictions.Empty + ) + ); + } + + public override DynamicMetaObject BindDeleteMember(DeleteMemberBinder binder) { + ContractUtils.RequiresNotNull(binder, "binder"); + + int index = Value.Class.GetValueIndex(binder.Name, binder.IgnoreCase, Value); + + Expression tryDelete = Expression.Call( + typeof(RuntimeOps).GetMethod("ExpandoTryDeleteValue"), + GetLimitedSelf(), + Expression.Constant(Value.Class, typeof(object)), + Expression.Constant(index), + Expression.Constant(binder.Name), + Expression.Constant(binder.IgnoreCase) + ); + DynamicMetaObject fallback = binder.FallbackDeleteMember(this); + + DynamicMetaObject target = new DynamicMetaObject( + Expression.IfThen(Expression.Not(tryDelete), fallback.Expression), + fallback.Restrictions + ); + + return AddDynamicTestAndDefer(binder, Value.Class, null, target); + } + + public override IEnumerable GetDynamicMemberNames() { + var expandoData = Value._data; + var klass = expandoData.Class; + for (int i = 0; i < klass.Keys.Length; i++) { + object val = expandoData[i]; + if (val != ExpandoObject.Uninitialized) { + yield return klass.Keys[i]; + } + } + } + + /// + /// Adds a dynamic test which checks if the version has changed. The test is only necessary for + /// performance as the methods will do the correct thing if called with an incorrect version. + /// + private DynamicMetaObject AddDynamicTestAndDefer(DynamicMetaObjectBinder binder, ExpandoClass klass, ExpandoClass originalClass, DynamicMetaObject succeeds) { + + Expression ifTestSucceeds = succeeds.Expression; + if (originalClass != null) { + // we are accessing a member which has not yet been defined on this class. + // We force a class promotion after the type check. If the class changes the + // promotion will fail and the set/delete will do a full lookup using the new + // class to discover the name. + Debug.Assert(originalClass != klass); + + ifTestSucceeds = Expression.Block( + Expression.Call( + null, + typeof(RuntimeOps).GetMethod("ExpandoPromoteClass"), + GetLimitedSelf(), + Expression.Constant(originalClass, typeof(object)), + Expression.Constant(klass, typeof(object)) + ), + succeeds.Expression + ); + } + + return new DynamicMetaObject( + Expression.Condition( + Expression.Call( + null, + typeof(RuntimeOps).GetMethod("ExpandoCheckVersion"), + GetLimitedSelf(), + Expression.Constant(originalClass ?? klass, typeof(object)) + ), + ifTestSucceeds, + binder.GetUpdateExpression(ifTestSucceeds.Type) + ), + GetRestrictions().Merge(succeeds.Restrictions) + ); + } + + /// + /// Gets the class and the index associated with the given name. Does not update the expando object. Instead + /// this returns both the original and desired new class. A rule is created which includes the test for the + /// original class, the promotion to the new class, and the set/delete based on the class post-promotion. + /// + private ExpandoClass GetClassEnsureIndex(string name, bool caseInsensitive, ExpandoObject obj, out ExpandoClass klass, out int index) { + ExpandoClass originalClass = Value.Class; + + index = originalClass.GetValueIndex(name, caseInsensitive, obj) ; + if (index == ExpandoObject.AmbiguousMatchFound) { + klass = originalClass; + return null; + } + if (index == ExpandoObject.NoMatch) { + // go ahead and find a new class now... + ExpandoClass newClass = originalClass.FindNewClass(name); + + klass = newClass; + index = newClass.GetValueIndexCaseSensitive(name); + + Debug.Assert(index != ExpandoObject.NoMatch); + return originalClass; + } else { + klass = originalClass; + return null; + } + } + + /// + /// Returns our Expression converted to our known LimitType + /// + private Expression GetLimitedSelf() { + if (TypeUtils.AreEquivalent(Expression.Type, LimitType)) { + return Expression; + } + return Expression.Convert(Expression, LimitType); + } + + /// + /// Returns a Restrictions object which includes our current restrictions merged + /// with a restriction limiting our type + /// + private BindingRestrictions GetRestrictions() { + Debug.Assert(Restrictions == BindingRestrictions.Empty, "We don't merge, restrictions are always empty"); + + return BindingRestrictions.GetTypeRestriction(this); + } + + public new ExpandoObject Value { + get { + return (ExpandoObject)base.Value; + } + } + } + + #endregion + + #region ExpandoData + + /// + /// Stores the class and the data associated with the class as one atomic + /// pair. This enables us to do a class check in a thread safe manner w/o + /// requiring locks. + /// + private class ExpandoData { + internal static ExpandoData Empty = new ExpandoData(); + + /// + /// the dynamically assigned class associated with the Expando object + /// + internal readonly ExpandoClass Class; + + /// + /// data stored in the expando object, key names are stored in the class. + /// + /// Expando._data must be locked when mutating the value. Otherwise a copy of it + /// could be made and lose values. + /// + private readonly object[] _dataArray; + + /// + /// Indexer for getting/setting the data + /// + internal object this[int index] { + get { + return _dataArray[index]; + } + set { + //when the array is updated, version increases, even the new value is the same + //as previous. Dictionary type has the same behavior. + _version++; + _dataArray[index] = value; + } + } + + internal int Version { + get { return _version; } + } + + internal int Length { + get { return _dataArray.Length; } + } + + /// + /// Constructs an empty ExpandoData object with the empty class and no data. + /// + private ExpandoData() { + Class = ExpandoClass.Empty; + _dataArray = new object[0]; + } + + /// + /// the version of the ExpandoObject that tracks set and delete operations + /// + private int _version; + + /// + /// Constructs a new ExpandoData object with the specified class and data. + /// + internal ExpandoData(ExpandoClass klass, object[] data, int version) { + Class = klass; + _dataArray = data; + _version = version; + } + + /// + /// Update the associated class and increases the storage for the data array if needed. + /// + /// + internal ExpandoData UpdateClass(ExpandoClass newClass) { + if (_dataArray.Length >= newClass.Keys.Length) { + // we have extra space in our buffer, just initialize it to Uninitialized. + this[newClass.Keys.Length - 1] = ExpandoObject.Uninitialized; + return new ExpandoData(newClass, this._dataArray, this._version); + } else { + // we've grown too much - we need a new object array + int oldLength = _dataArray.Length; + object[] arr = new object[GetAlignedSize(newClass.Keys.Length)]; + Array.Copy(_dataArray, arr, _dataArray.Length); + ExpandoData newData = new ExpandoData(newClass, arr, this._version); + newData[oldLength] = ExpandoObject.Uninitialized; + return newData; + } + } + + private static int GetAlignedSize(int len) { + // the alignment of the array for storage of values (must be a power of two) + const int DataArrayAlignment = 8; + + // round up and then mask off lower bits + return (len + (DataArrayAlignment - 1)) & (~(DataArrayAlignment - 1)); + } + } + + #endregion + + #region INotifyPropertyChanged Members + + event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged { + add { _propertyChanged += value; } + remove { _propertyChanged -= value; } + } + + #endregion + } +} + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + + // + // Note: these helpers are kept as simple wrappers so they have a better + // chance of being inlined. + // + public static partial class RuntimeOps { + + /// + /// Gets the value of an item in an expando object. + /// + /// The expando object. + /// The class of the expando object. + /// The index of the member. + /// The name of the member. + /// true if the name should be matched ignoring case; false otherwise. + /// The out parameter containing the value of the member. + /// True if the member exists in the expando object, otherwise false. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static bool ExpandoTryGetValue(ExpandoObject expando, object indexClass, int index, string name, bool ignoreCase, out object value) { + return expando.TryGetValue(indexClass, index, name, ignoreCase, out value); + } + + /// + /// Sets the value of an item in an expando object. + /// + /// The expando object. + /// The class of the expando object. + /// The index of the member. + /// The value of the member. + /// The name of the member. + /// true if the name should be matched ignoring case; false otherwise. + /// + /// Returns the index for the set member. + /// + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static object ExpandoTrySetValue(ExpandoObject expando, object indexClass, int index, object value, string name, bool ignoreCase) { + expando.TrySetValue(indexClass, index, value, name, ignoreCase, false); + return value; + } + + /// + /// Deletes the value of an item in an expando object. + /// + /// The expando object. + /// The class of the expando object. + /// The index of the member. + /// The name of the member. + /// true if the name should be matched ignoring case; false otherwise. + /// true if the item was successfully removed; otherwise, false. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static bool ExpandoTryDeleteValue(ExpandoObject expando, object indexClass, int index, string name, bool ignoreCase) { + return expando.TryDeleteValue(indexClass, index, name, ignoreCase, ExpandoObject.Uninitialized); + } + + /// + /// Checks the version of the expando object. + /// + /// The expando object. + /// The version to check. + /// true if the version is equal; otherwise, false. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static bool ExpandoCheckVersion(ExpandoObject expando, object version) { + return expando.Class == version; + } + + /// + /// Promotes an expando object from one class to a new class. + /// + /// The expando object. + /// The old class of the expando object. + /// The new class of the expando object. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static void ExpandoPromoteClass(ExpandoObject expando, object oldClass, object newClass) { + expando.PromoteClass(oldClass, newClass); + } + } +} + diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/GetIndexBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/GetIndexBinder.cs new file mode 100644 index 00000000000..6676913d2fd --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/GetIndexBinder.cs @@ -0,0 +1,98 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// Represents the dynamic get index operation at the call site, providing the binding semantic and the details about the operation. + /// + public abstract class GetIndexBinder : DynamicMetaObjectBinder { + private readonly CallInfo _callInfo; + + /// + /// Initializes a new instance of the . + /// + /// The signature of the arguments at the call site. + protected GetIndexBinder(CallInfo callInfo) { + ContractUtils.RequiresNotNull(callInfo, "callInfo"); + _callInfo = callInfo; + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { return typeof(object); } + } + + /// + /// Gets the signature of the arguments at the call site. + /// + public CallInfo CallInfo { + get { return _callInfo; } + } + + /// + /// Performs the binding of the dynamic get index operation. + /// + /// The target of the dynamic get index operation. + /// An array of arguments of the dynamic get index operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.RequiresNotNullItems(args, "args"); + + return target.BindGetIndex(this, args); + } + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + + /// + /// Performs the binding of the dynamic get index operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic get index operation. + /// The arguments of the dynamic get index operation. + /// The representing the result of the binding. + public DynamicMetaObject FallbackGetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes) { + return FallbackGetIndex(target, indexes, null); + } + + /// + /// When overridden in the derived class, performs the binding of the dynamic get index operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic get index operation. + /// The arguments of the dynamic get index operation. + /// The binding result to use if binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackGetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject errorSuggestion); + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/GetMemberBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/GetMemberBinder.cs new file mode 100644 index 00000000000..6fb6520c4dc --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/GetMemberBinder.cs @@ -0,0 +1,110 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Represents the dynamic get member operation at the call site, providing the binding semantic and the details about the operation. + /// + public abstract class GetMemberBinder : DynamicMetaObjectBinder { + private readonly string _name; + private readonly bool _ignoreCase; + + /// + /// Initializes a new instance of the . + /// + /// The name of the member to get. + /// true if the name should be matched ignoring case; false otherwise. + protected GetMemberBinder(string name, bool ignoreCase) { + ContractUtils.RequiresNotNull(name, "name"); + + _name = name; + _ignoreCase = ignoreCase; + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { return typeof(object); } + } + + /// + /// Gets the name of the member to get. + /// + public string Name { + get { + return _name; + } + } + + /// + /// Gets the value indicating if the string comparison should ignore the case of the member name. + /// + public bool IgnoreCase { + get { + return _ignoreCase; + } + } + + /// + /// Performs the binding of the dynamic get member operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic get member operation. + /// The representing the result of the binding. + public DynamicMetaObject FallbackGetMember(DynamicMetaObject target) { + return FallbackGetMember(target, null); + } + + /// + /// When overridden in the derived class, performs the binding of the dynamic get member operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic get member operation. + /// The binding result to use if binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion); + + /// + /// Performs the binding of the dynamic get member operation. + /// + /// The target of the dynamic get member operation. + /// An array of arguments of the dynamic get member operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, params DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.Requires(args == null || args.Length == 0, "args"); + + return target.BindGetMember(this); + } + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/IDynamicMetaObjectProvider.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/IDynamicMetaObjectProvider.cs new file mode 100644 index 00000000000..276a2aedb61 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/IDynamicMetaObjectProvider.cs @@ -0,0 +1,44 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Represents a dynamic object, that can have its operations bound at runtime. + /// + /// + /// Objects that want to participate in the binding process should implement an IDynamicMetaObjectProvider interface, + /// and implement to return a . + /// + public interface IDynamicMetaObjectProvider { + /// + /// Returns the responsible for binding operations performed on this object. + /// + /// The expression tree representation of the runtime value. + /// The to bind this object. + DynamicMetaObject GetMetaObject(Expression parameter); + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/InvokeBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/InvokeBinder.cs new file mode 100644 index 00000000000..c446ba0e1cf --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/InvokeBinder.cs @@ -0,0 +1,98 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// Represents the invoke dynamic operation at the call site, providing the binding semantic and the details about the operation. + /// + public abstract class InvokeBinder : DynamicMetaObjectBinder { + private readonly CallInfo _callInfo; + + /// + /// Initializes a new instance of the . + /// + /// The signature of the arguments at the call site. + protected InvokeBinder(CallInfo callInfo) { + ContractUtils.RequiresNotNull(callInfo, "callInfo"); + _callInfo = callInfo; + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { return typeof(object); } + } + + /// + /// Gets the signature of the arguments at the call site. + /// + public CallInfo CallInfo { + get { return _callInfo; } + } + + /// + /// Performs the binding of the dynamic invoke operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic invoke operation. + /// The arguments of the dynamic invoke operation. + /// The representing the result of the binding. + public DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args) { + return FallbackInvoke(target, args, null); + } + + /// + /// Performs the binding of the dynamic invoke operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic invoke operation. + /// The arguments of the dynamic invoke operation. + /// The binding result to use if binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion); + + /// + /// Performs the binding of the dynamic invoke operation. + /// + /// The target of the dynamic invoke operation. + /// An array of arguments of the dynamic invoke operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.RequiresNotNullItems(args, "args"); + + return target.BindInvoke(this, args); + } + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/InvokeMemberBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/InvokeMemberBinder.cs new file mode 100644 index 00000000000..240b77a860a --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/InvokeMemberBinder.cs @@ -0,0 +1,139 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// Represents the invoke member dynamic operation at the call site, + /// providing the binding semantic and the details about the operation. + /// + public abstract class InvokeMemberBinder : DynamicMetaObjectBinder { + private readonly string _name; + private readonly bool _ignoreCase; + private readonly CallInfo _callInfo; + + /// + /// Initializes a new instance of the . + /// + /// The name of the member to invoke. + /// true if the name should be matched ignoring case; false otherwise. + /// The signature of the arguments at the call site. + protected InvokeMemberBinder(string name, bool ignoreCase, CallInfo callInfo) { + ContractUtils.RequiresNotNull(name, "name"); + ContractUtils.RequiresNotNull(callInfo, "callInfo"); + + _name = name; + _ignoreCase = ignoreCase; + _callInfo = callInfo; + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { return typeof(object); } + } + + /// + /// Gets the name of the member to invoke. + /// + public string Name { + get { + return _name; + } + } + + /// + /// Gets the value indicating if the string comparison should ignore the case of the member name. + /// + public bool IgnoreCase { + get { + return _ignoreCase; + } + } + + /// + /// Gets the signature of the arguments at the call site. + /// + public CallInfo CallInfo { + get { return _callInfo; } + } + + /// + /// Performs the binding of the dynamic invoke member operation. + /// + /// The target of the dynamic invoke member operation. + /// An array of arguments of the dynamic invoke member operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.RequiresNotNullItems(args, "args"); + + return target.BindInvokeMember(this, args); + } + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + + /// + /// Performs the binding of the dynamic invoke member operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic invoke member operation. + /// The arguments of the dynamic invoke member operation. + /// The representing the result of the binding. + public DynamicMetaObject FallbackInvokeMember(DynamicMetaObject target, DynamicMetaObject[] args) { + return FallbackInvokeMember(target, args, null); + } + + /// + /// When overridden in the derived class, performs the binding of the dynamic invoke member operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic invoke member operation. + /// The arguments of the dynamic invoke member operation. + /// The binding result to use if binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackInvokeMember(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion); + + /// + /// When overridden in the derived class, performs the binding of the dynamic invoke operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic invoke operation. + /// The arguments of the dynamic invoke operation. + /// The binding result to use if binding fails, or null. + /// The representing the result of the binding. + /// + /// This method is called by the target when the target implements the invoke member operation + /// as a sequence of get member, and invoke, to let the + /// request the binding of the invoke operation only. + /// + public abstract DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion); + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/RuleCache.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/RuleCache.cs new file mode 100644 index 00000000000..3e2323a85b1 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/RuleCache.cs @@ -0,0 +1,126 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.ComponentModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + /// + /// This API supports the .NET Framework infrastructure and is not intended to be used directly from your code. + /// Represents a cache of runtime binding rules. + /// + /// The delegate type. + [EditorBrowsable(EditorBrowsableState.Never), DebuggerStepThrough] + public class RuleCache where T : class { + private T[] _rules = new T[0]; + private readonly Object cacheLock = new Object(); + + private const int MaxRules = 128; + + internal RuleCache() { } + + internal T[] GetRules() { + return _rules; + } + + // move the rule +2 up. + // this is called on every successful rule. + internal void MoveRule(T rule, int i) { + // limit search to MaxSearch elements. + // Rule should not get too far unless it has been already moved up. + // need a lock to make sure we are moving the right rule and not loosing any. + lock (cacheLock) { + const int MaxSearch = 8; + int count = _rules.Length - i; + if (count > MaxSearch) { + count = MaxSearch; + } + + int oldIndex = -1; + int max = Math.Min(_rules.Length, i + count); + for (int index = i; index < max; index++) { + if (_rules[index] == rule) { + oldIndex = index; + break; + } + } + if (oldIndex < 0) { + return; + } + T oldRule = _rules[oldIndex]; + _rules[oldIndex] = _rules[oldIndex - 1]; + _rules[oldIndex - 1] = _rules[oldIndex - 2]; + _rules[oldIndex - 2] = oldRule; + } + } + + internal void AddRule(T newRule) { + // need a lock to make sure we are not loosing rules. + lock (cacheLock) { + _rules = AddOrInsert(_rules, newRule); + } + } + + internal void ReplaceRule(T oldRule, T newRule) { + // need a lock to make sure we are replacing the right rule + lock (cacheLock) { + int i = Array.IndexOf(_rules, oldRule); + if (i >= 0) { + _rules[i] = newRule; + return; // DONE + } + + // could not find it. + _rules = AddOrInsert(_rules, newRule); + } + } + + + // Adds to end or or inserts items at InsertPosition + private const int InsertPosition = MaxRules / 2; + + private static T[] AddOrInsert(T[] rules, T item) { + if (rules.Length < InsertPosition) { + return rules.AddLast(item); + } + + T[] newRules; + + int newLength = rules.Length + 1; + if (newLength > MaxRules) { + newLength = MaxRules; + newRules = rules; + } else { + newRules = new T[newLength]; + } + + Array.Copy(rules, 0, newRules, 0, InsertPosition); + newRules[InsertPosition] = item; + Array.Copy(rules, InsertPosition, newRules, InsertPosition + 1, newLength - InsertPosition - 1); + return newRules; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/SetIndexBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/SetIndexBinder.cs new file mode 100644 index 00000000000..38f15ca7b24 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/SetIndexBinder.cs @@ -0,0 +1,107 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + + /// + /// Represents the dynamic set index operation at the call site, providing the binding semantic and the details about the operation. + /// + public abstract class SetIndexBinder : DynamicMetaObjectBinder { + private readonly CallInfo _callInfo; + + /// + /// Initializes a new instance of the . + /// + /// The signature of the arguments at the call site. + protected SetIndexBinder(CallInfo callInfo) { + ContractUtils.RequiresNotNull(callInfo, "callInfo"); + _callInfo = callInfo; + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { return typeof(object); } + } + + /// + /// Gets the signature of the arguments at the call site. + /// + public CallInfo CallInfo { + get { return _callInfo; } + } + + /// + /// Performs the binding of the dynamic set index operation. + /// + /// The target of the dynamic set index operation. + /// An array of arguments of the dynamic set index operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.RequiresNotNull(args, "args"); + ContractUtils.Requires(args.Length >= 2, "args"); + + DynamicMetaObject value = args[args.Length - 1]; + DynamicMetaObject[] indexes = args.RemoveLast(); + + ContractUtils.RequiresNotNull(value, "args"); + ContractUtils.RequiresNotNullItems(indexes, "args"); + + return target.BindSetIndex(this, indexes, value); + } + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + + /// + /// Performs the binding of the dynamic set index operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic set index operation. + /// The arguments of the dynamic set index operation. + /// The value to set to the collection. + /// The representing the result of the binding. + public DynamicMetaObject FallbackSetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject value) { + return FallbackSetIndex(target, indexes, value, null); + } + + /// + /// When overridden in the derived class, performs the binding of the dynamic set index operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic set index operation. + /// The arguments of the dynamic set index operation. + /// The value to set to the collection. + /// The binding result to use if binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackSetIndex(DynamicMetaObject target, DynamicMetaObject[] indexes, DynamicMetaObject value, DynamicMetaObject errorSuggestion); + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/SetMemberBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/SetMemberBinder.cs new file mode 100644 index 00000000000..8e6386ff552 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/SetMemberBinder.cs @@ -0,0 +1,116 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Represents the dynamic set member operation at the call site, providing the binding semantic and the details about the operation. + /// + public abstract class SetMemberBinder : DynamicMetaObjectBinder { + private readonly string _name; + private readonly bool _ignoreCase; + + /// + /// Initializes a new instance of the . + /// + /// The name of the member to get. + /// true if the name should be matched ignoring case; false otherwise. + protected SetMemberBinder(string name, bool ignoreCase) { + ContractUtils.RequiresNotNull(name, "name"); + + _name = name; + _ignoreCase = ignoreCase; + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { return typeof(object); } + } + + /// + /// Gets the name of the member to get. + /// + public string Name { + get { + return _name; + } + } + + /// + /// Gets the value indicating if the string comparison should ignore the case of the member name. + /// + public bool IgnoreCase { + get { + return _ignoreCase; + } + } + + /// + /// Performs the binding of the dynamic set member operation. + /// + /// The target of the dynamic set member operation. + /// An array of arguments of the dynamic set member operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.RequiresNotNull(args, "args"); + ContractUtils.Requires(args.Length == 1, "args"); + + var arg0 = args[0]; + ContractUtils.RequiresNotNull(arg0, "args"); + + return target.BindSetMember(this, arg0); + } + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + + /// + /// Performs the binding of the dynamic set member operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic set member operation. + /// The value to set to the member. + /// The representing the result of the binding. + public DynamicMetaObject FallbackSetMember(DynamicMetaObject target, DynamicMetaObject value) { + return FallbackSetMember(target, value, null); + } + + /// + /// Performs the binding of the dynamic set member operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic set member operation. + /// The value to set to the member. + /// The binding result to use if binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackSetMember(DynamicMetaObject target, DynamicMetaObject value, DynamicMetaObject errorSuggestion); + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/UnaryOperationBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/UnaryOperationBinder.cs new file mode 100644 index 00000000000..f5a33f6f616 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/UnaryOperationBinder.cs @@ -0,0 +1,135 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +using System.Linq.Expressions; +#else +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + /// + /// Represents the unary dynamic operation at the call site, providing the binding semantic and the details about the operation. + /// + public abstract class UnaryOperationBinder : DynamicMetaObjectBinder { + private ExpressionType _operation; + + /// + /// Initializes a new instance of the class. + /// + /// The unary operation kind. + protected UnaryOperationBinder(ExpressionType operation) { + ContractUtils.Requires(OperationIsValid(operation), "operation"); + _operation = operation; + } + + /// + /// The result type of the operation. + /// + public override sealed Type ReturnType { + get { + switch(_operation) { + case ExpressionType.IsFalse: + case ExpressionType.IsTrue: + return typeof(bool); + default: + return typeof(object); + } + } + } + + /// + /// The unary operation kind. + /// + public ExpressionType Operation { + get { + return _operation; + } + } + + /// + /// Performs the binding of the unary dynamic operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic unary operation. + /// The representing the result of the binding. + public DynamicMetaObject FallbackUnaryOperation(DynamicMetaObject target) { + return FallbackUnaryOperation(target, null); + } + + /// + /// Performs the binding of the unary dynamic operation if the target dynamic object cannot bind. + /// + /// The target of the dynamic unary operation. + /// The binding result in case the binding fails, or null. + /// The representing the result of the binding. + public abstract DynamicMetaObject FallbackUnaryOperation(DynamicMetaObject target, DynamicMetaObject errorSuggestion); + + /// + /// Performs the binding of the dynamic unary operation. + /// + /// The target of the dynamic operation. + /// An array of arguments of the dynamic operation. + /// The representing the result of the binding. + public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { + ContractUtils.RequiresNotNull(target, "target"); + ContractUtils.Requires(args == null || args.Length == 0, "args"); + + return target.BindUnaryOperation(this); + } + + // this is a standard DynamicMetaObjectBinder + internal override sealed bool IsStandardBinder { + get { + return true; + } + } + + internal static bool OperationIsValid(ExpressionType operation) { + switch (operation) { + #region Generated Unary Operation Binder Validator + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_unop_validator from: generate_tree.py + + case ExpressionType.Negate: + case ExpressionType.UnaryPlus: + case ExpressionType.Not: + case ExpressionType.Decrement: + case ExpressionType.Increment: + case ExpressionType.OnesComplement: + case ExpressionType.IsTrue: + case ExpressionType.IsFalse: + + // *** END GENERATED CODE *** + + #endregion + + case ExpressionType.Extension: + return true; + + default: + return false; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/UpdateDelegates.Generated.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/UpdateDelegates.Generated.cs new file mode 100644 index 00000000000..28ec2d4f351 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Actions/UpdateDelegates.Generated.cs @@ -0,0 +1,2665 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Threading; + +#if CODEPLEX_40 +namespace System.Dynamic { +#else +namespace Microsoft.Scripting { +#endif + internal static partial class UpdateDelegates { + + // + // WARNING: do not edit these methods here. The real source code lives + // in two places: generate_dynsites.py, which generates the methods in + // this file, and UpdateDelegates.cs, which dynamically generates + // methods like these at run time. If you want to make a change, edit + // *both* of those files instead + // + + #region Generated UpdateAndExecute Methods + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_update_targets from: generate_dynsites.py + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static TRet UpdateAndExecute0(CallSite site) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Func[] applicable; + Func rule, originalRule = @this.Target; + TRet result; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + result = rule(site); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return result; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + result = rule(site); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + result = rule(site); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static TRet NoMatch0(CallSite site) { + site._match = false; + return default(TRet); + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static TRet UpdateAndExecute1(CallSite site, T0 arg0) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Func[] applicable; + Func rule, originalRule = @this.Target; + TRet result; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + result = rule(site, arg0); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return result; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + result = rule(site, arg0); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + result = rule(site, arg0); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static TRet NoMatch1(CallSite site, T0 arg0) { + site._match = false; + return default(TRet); + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static TRet UpdateAndExecute2(CallSite site, T0 arg0, T1 arg1) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Func[] applicable; + Func rule, originalRule = @this.Target; + TRet result; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + result = rule(site, arg0, arg1); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return result; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + result = rule(site, arg0, arg1); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + result = rule(site, arg0, arg1); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static TRet NoMatch2(CallSite site, T0 arg0, T1 arg1) { + site._match = false; + return default(TRet); + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static TRet UpdateAndExecute3(CallSite site, T0 arg0, T1 arg1, T2 arg2) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Func[] applicable; + Func rule, originalRule = @this.Target; + TRet result; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + result = rule(site, arg0, arg1, arg2); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return result; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + result = rule(site, arg0, arg1, arg2); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + result = rule(site, arg0, arg1, arg2); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static TRet NoMatch3(CallSite site, T0 arg0, T1 arg1, T2 arg2) { + site._match = false; + return default(TRet); + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static TRet UpdateAndExecute4(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Func[] applicable; + Func rule, originalRule = @this.Target; + TRet result; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + result = rule(site, arg0, arg1, arg2, arg3); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return result; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + result = rule(site, arg0, arg1, arg2, arg3); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + result = rule(site, arg0, arg1, arg2, arg3); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static TRet NoMatch4(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3) { + site._match = false; + return default(TRet); + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static TRet UpdateAndExecute5(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Func[] applicable; + Func rule, originalRule = @this.Target; + TRet result; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + result = rule(site, arg0, arg1, arg2, arg3, arg4); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return result; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static TRet NoMatch5(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { + site._match = false; + return default(TRet); + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static TRet UpdateAndExecute6(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Func[] applicable; + Func rule, originalRule = @this.Target; + TRet result; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return result; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4, arg5 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static TRet NoMatch6(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) { + site._match = false; + return default(TRet); + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static TRet UpdateAndExecute7(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Func[] applicable; + Func rule, originalRule = @this.Target; + TRet result; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return result; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4, arg5, arg6 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static TRet NoMatch7(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6) { + site._match = false; + return default(TRet); + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static TRet UpdateAndExecute8(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Func[] applicable; + Func rule, originalRule = @this.Target; + TRet result; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return result; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static TRet NoMatch8(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7) { + site._match = false; + return default(TRet); + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static TRet UpdateAndExecute9(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Func[] applicable; + Func rule, originalRule = @this.Target; + TRet result; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return result; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static TRet NoMatch9(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) { + site._match = false; + return default(TRet); + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static TRet UpdateAndExecute10(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Func[] applicable; + Func rule, originalRule = @this.Target; + TRet result; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return result; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + result = rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + if (CallSiteOps.GetMatch(site)) { + return result; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static TRet NoMatch10(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9) { + site._match = false; + return default(TRet); + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static void UpdateAndExecuteVoid1(CallSite site, T0 arg0) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Action[] applicable; + Action rule, originalRule = @this.Target; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + rule(site, arg0); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + rule(site, arg0); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + rule(site, arg0); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static void NoMatchVoid1(CallSite site, T0 arg0) { + site._match = false; + return; + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static void UpdateAndExecuteVoid2(CallSite site, T0 arg0, T1 arg1) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Action[] applicable; + Action rule, originalRule = @this.Target; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + rule(site, arg0, arg1); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + rule(site, arg0, arg1); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + rule(site, arg0, arg1); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static void NoMatchVoid2(CallSite site, T0 arg0, T1 arg1) { + site._match = false; + return; + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static void UpdateAndExecuteVoid3(CallSite site, T0 arg0, T1 arg1, T2 arg2) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Action[] applicable; + Action rule, originalRule = @this.Target; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + rule(site, arg0, arg1, arg2); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + rule(site, arg0, arg1, arg2); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + rule(site, arg0, arg1, arg2); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static void NoMatchVoid3(CallSite site, T0 arg0, T1 arg1, T2 arg2) { + site._match = false; + return; + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static void UpdateAndExecuteVoid4(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Action[] applicable; + Action rule, originalRule = @this.Target; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + rule(site, arg0, arg1, arg2, arg3); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + rule(site, arg0, arg1, arg2, arg3); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + rule(site, arg0, arg1, arg2, arg3); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static void NoMatchVoid4(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3) { + site._match = false; + return; + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static void UpdateAndExecuteVoid5(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Action[] applicable; + Action rule, originalRule = @this.Target; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + rule(site, arg0, arg1, arg2, arg3, arg4); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + rule(site, arg0, arg1, arg2, arg3, arg4); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + rule(site, arg0, arg1, arg2, arg3, arg4); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static void NoMatchVoid5(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { + site._match = false; + return; + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static void UpdateAndExecuteVoid6(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Action[] applicable; + Action rule, originalRule = @this.Target; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + rule(site, arg0, arg1, arg2, arg3, arg4, arg5); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + rule(site, arg0, arg1, arg2, arg3, arg4, arg5); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4, arg5 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + rule(site, arg0, arg1, arg2, arg3, arg4, arg5); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static void NoMatchVoid6(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) { + site._match = false; + return; + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static void UpdateAndExecuteVoid7(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Action[] applicable; + Action rule, originalRule = @this.Target; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4, arg5, arg6 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static void NoMatchVoid7(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6) { + site._match = false; + return; + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static void UpdateAndExecuteVoid8(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Action[] applicable; + Action rule, originalRule = @this.Target; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static void NoMatchVoid8(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7) { + site._match = false; + return; + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static void UpdateAndExecuteVoid9(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Action[] applicable; + Action rule, originalRule = @this.Target; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static void NoMatchVoid9(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) { + site._match = false; + return; + } + + + + [Obsolete("pregenerated CallSite.Update delegate", true)] + internal static void UpdateAndExecuteVoid10(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9) { + // + // Declare the locals here upfront. It actually saves JIT stack space. + // + var @this = (CallSite>)site; + Action[] applicable; + Action rule, originalRule = @this.Target; + + + // + // Create matchmaker and its site. We'll need them regardless. + // + site = CallSiteOps.CreateMatchmaker(@this); + + // + // Level 1 cache lookup + // + if ((applicable = CallSiteOps.GetRules(@this)) != null) { + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + + // if we've already tried it skip it... + if ((object)rule != (object)originalRule) { + @this.Target = rule; + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + + if (CallSiteOps.GetMatch(site)) { + CallSiteOps.UpdateRules(@this, i); + return; + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + } + } + + // + // Level 2 cache lookup + // + + // + // Any applicable rules in level 2 cache? + // + + var cache = CallSiteOps.GetRuleCache(@this); + + applicable = cache.GetRules(); + for (int i = 0; i < applicable.Length; i++) { + rule = applicable[i]; + + // + // Execute the rule + // + @this.Target = rule; + + try { + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // Rule worked. Add it to level 1 cache + // + CallSiteOps.AddRule(@this, rule); + // and then move it to the front of the L2 cache + CallSiteOps.MoveRule(cache, rule, i); + } + } + + // Rule didn't match, try the next one + CallSiteOps.ClearMatch(site); + } + + // + // Miss on Level 0, 1 and 2 caches. Create new rule + // + + rule = null; + var args = new object[] { arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 }; + + for (; ; ) { + @this.Target = originalRule; + rule = @this.Target = @this.Binder.BindCore(@this, args); + + // + // Execute the rule on the matchmaker site + // + + try { + rule(site, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + if (CallSiteOps.GetMatch(site)) { + return; + } + } finally { + if (CallSiteOps.GetMatch(site)) { + // + // The rule worked. Add it to level 1 cache. + // + CallSiteOps.AddRule(@this, rule); + } + } + + // Rule we got back didn't work, try another one + CallSiteOps.ClearMatch(site); + } + } + + [Obsolete("pregenerated CallSite.Update delegate", true)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters")] + internal static void NoMatchVoid10(CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9) { + site._match = false; + return; + } + + + + // *** END GENERATED CODE *** + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/BinaryExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/BinaryExpression.cs new file mode 100644 index 00000000000..df231bf8a44 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/BinaryExpression.cs @@ -0,0 +1,2624 @@ + +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Represents an expression that has a binary operator. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.BinaryExpressionProxy))] +#endif + public class BinaryExpression : Expression { + private readonly Expression _left; + private readonly Expression _right; + + internal BinaryExpression(Expression left, Expression right) { + _left = left; + _right = right; + } + + /// + /// Gets a value that indicates whether the expression tree node can be reduced. + /// + public override bool CanReduce { + get { + // Only OpAssignments are reducible. + return IsOpAssignment(NodeType); + } + } + + private static bool IsOpAssignment(ExpressionType op) { + switch (op) { + case ExpressionType.AddAssign: + case ExpressionType.SubtractAssign: + case ExpressionType.MultiplyAssign: + case ExpressionType.AddAssignChecked: + case ExpressionType.SubtractAssignChecked: + case ExpressionType.MultiplyAssignChecked: + case ExpressionType.DivideAssign: + case ExpressionType.ModuloAssign: + case ExpressionType.PowerAssign: + case ExpressionType.AndAssign: + case ExpressionType.OrAssign: + case ExpressionType.RightShiftAssign: + case ExpressionType.LeftShiftAssign: + case ExpressionType.ExclusiveOrAssign: + return true; + } + return false; + } + /// + /// Gets the right operand of the binary operation. + /// + public Expression Right { + get { return _right; } + } + /// + /// Gets the left operand of the binary operation. + /// + public Expression Left { + get { return _left; } + } + /// + /// Gets the implementing method for the binary operation. + /// + public MethodInfo Method { + get { return GetMethod(); } + } + + internal virtual MethodInfo GetMethod() { + return null; + } + + /// + /// Reduces the binary expression node to a simpler expression. + /// If CanReduce returns true, this should return a valid expression. + /// This method is allowed to return another node which itself + /// must be reduced. + /// + /// The reduced expression. + public override Expression Reduce() { + // Only reduce OpAssignment expressions. + if (IsOpAssignment(NodeType)) { + switch (_left.NodeType) { + case ExpressionType.MemberAccess: + return ReduceMember(); + + case ExpressionType.Index: + return ReduceIndex(); + + default: + return ReduceVariable(); + } + } + return this; + } + + // Return the corresponding Op of an assignment op. + private static ExpressionType GetBinaryOpFromAssignmentOp(ExpressionType op) { + Debug.Assert(IsOpAssignment(op)); + switch (op) { + case ExpressionType.AddAssign: + return ExpressionType.Add; + case ExpressionType.AddAssignChecked: + return ExpressionType.AddChecked; + case ExpressionType.SubtractAssign: + return ExpressionType.Subtract; + case ExpressionType.SubtractAssignChecked: + return ExpressionType.SubtractChecked; + case ExpressionType.MultiplyAssign: + return ExpressionType.Multiply; + case ExpressionType.MultiplyAssignChecked: + return ExpressionType.MultiplyChecked; + case ExpressionType.DivideAssign: + return ExpressionType.Divide; + case ExpressionType.ModuloAssign: + return ExpressionType.Modulo; + case ExpressionType.PowerAssign: + return ExpressionType.Power; + case ExpressionType.AndAssign: + return ExpressionType.And; + case ExpressionType.OrAssign: + return ExpressionType.Or; + case ExpressionType.RightShiftAssign: + return ExpressionType.RightShift; + case ExpressionType.LeftShiftAssign: + return ExpressionType.LeftShift; + case ExpressionType.ExclusiveOrAssign: + return ExpressionType.ExclusiveOr; + default: + // must be an error + throw Error.InvalidOperation("op"); + } + + } + + private Expression ReduceVariable() { + // v (op)= r + // ... is reduced into ... + // v = v (op) r + ExpressionType op = GetBinaryOpFromAssignmentOp(NodeType); + Expression r = Expression.MakeBinary(op, _left, _right, false, Method); + LambdaExpression conversion = GetConversion(); + if (conversion != null) { + r = Expression.Invoke(conversion, r); + } + return Expression.Assign(_left, r); + } + + private Expression ReduceMember() { + MemberExpression member = (MemberExpression)_left; + + if (member.Expression == null) { + // static member, reduce the same as variable + return ReduceVariable(); + } else { + // left.b (op)= r + // ... is reduced into ... + // temp1 = left + // temp2 = temp1.b (op) r + // temp1.b = temp2 + // temp2 + ParameterExpression temp1 = Variable(member.Expression.Type, "temp1"); + + // 1. temp1 = left + Expression e1 = Expression.Assign(temp1, member.Expression); + + // 2. temp2 = temp1.b (op) r + ExpressionType op = GetBinaryOpFromAssignmentOp(NodeType); + Expression e2 = Expression.MakeBinary(op, Expression.MakeMemberAccess(temp1, member.Member), _right, false, Method); + LambdaExpression conversion = GetConversion(); + if (conversion != null) { + e2 = Expression.Invoke(conversion, e2); + } + ParameterExpression temp2 = Variable(e2.Type, "temp2"); + e2 = Expression.Assign(temp2, e2); + + // 3. temp1.b = temp2 + Expression e3 = Expression.Assign(Expression.MakeMemberAccess(temp1, member.Member), temp2); + + // 3. temp2 + Expression e4 = temp2; + + return Expression.Block( + new ParameterExpression[] { temp1, temp2 }, + e1, e2, e3, e4 + ); + } + } + + private Expression ReduceIndex() { + // left[a0, a1, ... aN] (op)= r + // + // ... is reduced into ... + // + // tempObj = left + // tempArg0 = a0 + // ... + // tempArgN = aN + // tempValue = tempObj[tempArg0, ... tempArgN] (op) r + // tempObj[tempArg0, ... tempArgN] = tempValue + + var index = (IndexExpression)_left; + + var vars = new List(index.Arguments.Count + 2); + var exprs = new List(index.Arguments.Count + 3); + + var tempObj = Expression.Variable(index.Object.Type, "tempObj"); + vars.Add(tempObj); + exprs.Add(Expression.Assign(tempObj, index.Object)); + + var tempArgs = new List(index.Arguments.Count); + foreach (var arg in index.Arguments) { + var tempArg = Expression.Variable(arg.Type, "tempArg" + tempArgs.Count); + vars.Add(tempArg); + tempArgs.Add(tempArg); + exprs.Add(Expression.Assign(tempArg, arg)); + } + + var tempIndex = Expression.MakeIndex(tempObj, index.Indexer, tempArgs); + + // tempValue = tempObj[tempArg0, ... tempArgN] (op) r + ExpressionType binaryOp = GetBinaryOpFromAssignmentOp(NodeType); + Expression op = Expression.MakeBinary(binaryOp, tempIndex, _right, false, Method); + LambdaExpression conversion = GetConversion(); + if (conversion != null) { + op = Expression.Invoke(conversion, op); + } + var tempValue = Expression.Variable(op.Type, "tempValue"); + vars.Add(tempValue); + exprs.Add(Expression.Assign(tempValue, op)); + + // tempObj[tempArg0, ... tempArgN] = tempValue + exprs.Add(Expression.Assign(tempIndex, tempValue)); + + return Expression.Block(vars, exprs); + } + + /// + /// Gets the type conversion function that is used by a coalescing or compound assignment operation. + /// + public LambdaExpression Conversion { + get { return GetConversion(); } + } + + internal virtual LambdaExpression GetConversion() { + return null; + } + /// + /// Gets a value that indicates whether the expression tree node represents a lifted call to an operator. + /// + public bool IsLifted { + get { + if (NodeType == ExpressionType.Coalesce || NodeType == ExpressionType.Assign) { + return false; + } + if (TypeUtils.IsNullableType(_left.Type)) { + MethodInfo method = GetMethod(); + return method == null || + !TypeUtils.AreEquivalent(method.GetParametersCached()[0].ParameterType.GetNonRefType(), _left.Type); + } + return false; + } + } + /// + /// Gets a value that indicates whether the expression tree node represents a lifted call to an operator whose return type is lifted to a nullable type. + /// + public bool IsLiftedToNull { + get { + return IsLifted && TypeUtils.IsNullableType(Type); + } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitBinary(this); + } + + internal static Expression Create(ExpressionType nodeType, Expression left, Expression right, Type type, MethodInfo method, LambdaExpression conversion) { + if (nodeType == ExpressionType.Assign) { + Debug.Assert(method == null && TypeUtils.AreEquivalent(type, left.Type)); + return new AssignBinaryExpression(left, right); + } + if (conversion != null) { + Debug.Assert(method == null && TypeUtils.AreEquivalent(type, right.Type) && nodeType == ExpressionType.Coalesce); + return new CoalesceConversionBinaryExpression(left, right, conversion); + } + if (method != null) { + return new MethodBinaryExpression(nodeType, left, right, type, method); + } + if (type == typeof(bool)) { + return new LogicalBinaryExpression(nodeType, left, right); + } + return new SimpleBinaryExpression(nodeType, left, right, type); + } + + internal bool IsLiftedLogical { + get { + Type left = _left.Type; + Type right = _right.Type; + MethodInfo method = GetMethod(); + ExpressionType kind = NodeType; + + return + (kind == ExpressionType.AndAlso || kind == ExpressionType.OrElse) && + TypeUtils.AreEquivalent(right, left) && + TypeUtils.IsNullableType(left) && + method != null && + TypeUtils.AreEquivalent(method.ReturnType, TypeUtils.GetNonNullableType(left)); + } + } + + internal bool IsReferenceComparison { + get { + Type left = _left.Type; + Type right = _right.Type; + MethodInfo method = GetMethod(); + ExpressionType kind = NodeType; + + return (kind == ExpressionType.Equal || kind == ExpressionType.NotEqual) && + method == null && !left.IsValueType && !right.IsValueType; + } + } + + // + // For a userdefined type T which has op_False defined and L, R are + // nullable, (L AndAlso R) is computed as: + // + // L.HasValue + // ? T.op_False(L.GetValueOrDefault()) + // ? L + // : R.HasValue + // ? (T?)(T.op_BitwiseAnd(L.GetValueOrDefault(), R.GetValueOrDefault())) + // : null + // : null + // + // For a userdefined type T which has op_True defined and L, R are + // nullable, (L OrElse R) is computed as: + // + // L.HasValue + // ? T.op_True(L.GetValueOrDefault()) + // ? L + // : R.HasValue + // ? (T?)(T.op_BitwiseOr(L.GetValueOrDefault(), R.GetValueOrDefault())) + // : null + // : null + // + // + // This is the same behavior as VB. If you think about it, it makes + // sense: it's combining the normal pattern for short-circuiting + // operators, with the normal pattern for lifted operations: if either + // of the operands is null, the result is also null. + // + internal Expression ReduceUserdefinedLifted() { + Debug.Assert(IsLiftedLogical); + + var left = Parameter(_left.Type, "left"); + var right = Parameter(Right.Type, "right"); + string opName = NodeType == ExpressionType.AndAlso ? "op_False" : "op_True"; + MethodInfo opTrueFalse = TypeUtils.GetBooleanOperator(Method.DeclaringType, opName); + Debug.Assert(opTrueFalse != null); + + return Block( + new[] { left }, + Assign(left, _left), + Condition( + Property(left, "HasValue"), + Condition( + Call(opTrueFalse, Call(left, "GetValueOrDefault", null)), + left, + Block( + new[] { right }, + Assign(right, _right), + Condition( + Property(right, "HasValue"), + Convert( + Call( + Method, + Call(left, "GetValueOrDefault", null), + Call(right, "GetValueOrDefault", null) + ), + Type + ), + Constant(null, Type) + ) + ) + ), + Constant(null, Type) + ) + ); + } + } + + // Optimized representation of simple logical expressions: + // && || == != > < >= <= + internal sealed class LogicalBinaryExpression : BinaryExpression { + private readonly ExpressionType _nodeType; + + internal LogicalBinaryExpression(ExpressionType nodeType, Expression left, Expression right) + : base(left, right) { + _nodeType = nodeType; + } + + public sealed override Type Type { + get { return typeof(bool); } + } + + public sealed override ExpressionType NodeType { + get { return _nodeType; } + } + } + + // Optimized assignment node, only holds onto children + internal sealed class AssignBinaryExpression : BinaryExpression { + internal AssignBinaryExpression(Expression left, Expression right) + : base(left, right) { + } + + public sealed override Type Type { + get { return Left.Type; } + } + + public sealed override ExpressionType NodeType { + get { return ExpressionType.Assign; } + } + } + + // Coalesce with conversion + // This is not a frequently used node, but rather we want to save every + // other BinaryExpression from holding onto the null conversion lambda + internal sealed class CoalesceConversionBinaryExpression : BinaryExpression { + private readonly LambdaExpression _conversion; + + internal CoalesceConversionBinaryExpression(Expression left, Expression right, LambdaExpression conversion) + : base(left, right) { + _conversion = conversion; + } + + internal override LambdaExpression GetConversion() { + return _conversion; + } + + public sealed override ExpressionType NodeType { + get { return ExpressionType.Coalesce; } + } + + public sealed override Type Type { + get { return Right.Type; } + } + } + + // OpAssign with conversion + // This is not a frequently used node, but rather we want to save every + // other BinaryExpression from holding onto the null conversion lambda + internal sealed class OpAssignMethodConversionBinaryExpression : MethodBinaryExpression { + private readonly LambdaExpression _conversion; + + internal OpAssignMethodConversionBinaryExpression(ExpressionType nodeType, Expression left, Expression right, Type type, MethodInfo method, LambdaExpression conversion) + : base(nodeType, left, right, type, method) { + _conversion = conversion; + } + + internal override LambdaExpression GetConversion() { + return _conversion; + } + } + + // Class that handles most binary expressions + // If needed, it can be optimized even more (often Type == left.Type) + internal class SimpleBinaryExpression : BinaryExpression { + private readonly ExpressionType _nodeType; + private readonly Type _type; + + internal SimpleBinaryExpression(ExpressionType nodeType, Expression left, Expression right, Type type) + : base(left, right) { + _nodeType = nodeType; + _type = type; + } + + public sealed override ExpressionType NodeType { + get { return _nodeType; } + } + + public sealed override Type Type { + get { return _type; } + } + } + + // Class that handles binary expressions with a method + // If needed, it can be optimized even more (often Type == method.ReturnType) + internal class MethodBinaryExpression : SimpleBinaryExpression { + private readonly MethodInfo _method; + + internal MethodBinaryExpression(ExpressionType nodeType, Expression left, Expression right, Type type, MethodInfo method) + : base(nodeType, left, right, type) { + _method = method; + } + + internal override MethodInfo GetMethod() { + return _method; + } + } + + public partial class Expression { + + #region Assign + + /// + /// Creates a that represents an assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + /// + public static BinaryExpression Assign(Expression left, Expression right) { + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + TypeUtils.ValidateType(left.Type); + TypeUtils.ValidateType(right.Type); + if (!TypeUtils.AreReferenceAssignable(left.Type, right.Type)) { + throw Error.ExpressionTypeDoesNotMatchAssignment(right.Type, left.Type); + } + return new AssignBinaryExpression(left, right); + } + + #endregion + + + private static BinaryExpression GetUserDefinedBinaryOperator(ExpressionType binaryType, string name, Expression left, Expression right, bool liftToNull) { + // try exact match first + MethodInfo method = GetUserDefinedBinaryOperator(binaryType, left.Type, right.Type, name); + if (method != null) { + return new MethodBinaryExpression(binaryType, left, right, method.ReturnType, method); + } + // try lifted call + if (TypeUtils.IsNullableType(left.Type) && TypeUtils.IsNullableType(right.Type)) { + Type nnLeftType = TypeUtils.GetNonNullableType(left.Type); + Type nnRightType = TypeUtils.GetNonNullableType(right.Type); + method = GetUserDefinedBinaryOperator(binaryType, nnLeftType, nnRightType, name); + if (method != null && method.ReturnType.IsValueType && !TypeUtils.IsNullableType(method.ReturnType)) { + if (method.ReturnType != typeof(bool) || liftToNull) { + return new MethodBinaryExpression(binaryType, left, right, TypeUtils.GetNullableType(method.ReturnType), method); + } else { + return new MethodBinaryExpression(binaryType, left, right, typeof(bool), method); + } + } + } + return null; + } + + + private static BinaryExpression GetMethodBasedBinaryOperator(ExpressionType binaryType, Expression left, Expression right, MethodInfo method, bool liftToNull) { + System.Diagnostics.Debug.Assert(method != null); + ValidateOperator(method); + ParameterInfo[] pms = method.GetParametersCached(); + if (pms.Length != 2) + throw Error.IncorrectNumberOfMethodCallArguments(method); + if (ParameterIsAssignable(pms[0], left.Type) && ParameterIsAssignable(pms[1], right.Type)) { + ValidateParamswithOperandsOrThrow(pms[0].ParameterType, left.Type, binaryType, method.Name); + ValidateParamswithOperandsOrThrow(pms[1].ParameterType, right.Type, binaryType, method.Name); + return new MethodBinaryExpression(binaryType, left, right, method.ReturnType, method); + + } + // check for lifted call + if (TypeUtils.IsNullableType(left.Type) && TypeUtils.IsNullableType(right.Type) && + ParameterIsAssignable(pms[0], TypeUtils.GetNonNullableType(left.Type)) && + ParameterIsAssignable(pms[1], TypeUtils.GetNonNullableType(right.Type)) && + method.ReturnType.IsValueType && !TypeUtils.IsNullableType(method.ReturnType)) { + if (method.ReturnType != typeof(bool) || liftToNull) { + return new MethodBinaryExpression(binaryType, left, right, TypeUtils.GetNullableType(method.ReturnType), method); + } else { + return new MethodBinaryExpression(binaryType, left, right, typeof(bool), method); + } + } + throw Error.OperandTypesDoNotMatchParameters(binaryType, method.Name); + } + + private static BinaryExpression GetMethodBasedAssignOperator(ExpressionType binaryType, Expression left, Expression right, MethodInfo method, LambdaExpression conversion, bool liftToNull) { + BinaryExpression b = GetMethodBasedBinaryOperator(binaryType, left, right, method, liftToNull); + if (conversion == null) { + // return type must be assignable back to the left type + if (!TypeUtils.AreReferenceAssignable(left.Type, b.Type)) { + throw Error.UserDefinedOpMustHaveValidReturnType(binaryType, b.Method.Name); + } + } else { + // add the conversion to the result + ValidateOpAssignConversionLambda(conversion, b.Left, b.Method, b.NodeType); + b = new OpAssignMethodConversionBinaryExpression(b.NodeType, b.Left, b.Right, b.Left.Type, b.Method, conversion); + } + return b; + } + + + private static BinaryExpression GetUserDefinedBinaryOperatorOrThrow(ExpressionType binaryType, string name, Expression left, Expression right, bool liftToNull) { + BinaryExpression b = GetUserDefinedBinaryOperator(binaryType, name, left, right, liftToNull); + if (b != null) { + ParameterInfo[] pis = b.Method.GetParametersCached(); + ValidateParamswithOperandsOrThrow(pis[0].ParameterType, left.Type, binaryType, name); + ValidateParamswithOperandsOrThrow(pis[1].ParameterType, right.Type, binaryType, name); + return b; + } + throw Error.BinaryOperatorNotDefined(binaryType, left.Type, right.Type); + } + + private static BinaryExpression GetUserDefinedAssignOperatorOrThrow(ExpressionType binaryType, string name, Expression left, Expression right, LambdaExpression conversion, bool liftToNull) { + BinaryExpression b = GetUserDefinedBinaryOperatorOrThrow(binaryType, name, left, right, liftToNull); + if (conversion == null) { + // return type must be assignable back to the left type + if (!TypeUtils.AreReferenceAssignable(left.Type, b.Type)) { + throw Error.UserDefinedOpMustHaveValidReturnType(binaryType, b.Method.Name); + } + } else { + // add the conversion to the result + ValidateOpAssignConversionLambda(conversion, b.Left, b.Method, b.NodeType); + b = new OpAssignMethodConversionBinaryExpression(b.NodeType, b.Left, b.Right, b.Left.Type, b.Method, conversion); + } + return b; + } + + + private static MethodInfo GetUserDefinedBinaryOperator(ExpressionType binaryType, Type leftType, Type rightType, string name) { + // UNDONE: This algorithm is wrong, we should be checking for uniqueness and erroring if + // UNDONE: it is defined on both types. + Type[] types = new Type[] { leftType, rightType }; + Type nnLeftType = TypeUtils.GetNonNullableType(leftType); + Type nnRightType = TypeUtils.GetNonNullableType(rightType); + BindingFlags flags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; + MethodInfo method = nnLeftType.GetMethodValidated(name, flags, null, types, null); + if (method == null && !TypeUtils.AreEquivalent(leftType, rightType)) { + method = nnRightType.GetMethodValidated(name, flags, null, types, null); + } + + if (IsLiftingConditionalLogicalOperator(leftType, rightType, method, binaryType)) { + method = GetUserDefinedBinaryOperator(binaryType, nnLeftType, nnRightType, name); + } + return method; + } + + + private static bool IsLiftingConditionalLogicalOperator(Type left, Type right, MethodInfo method, ExpressionType binaryType) { + return TypeUtils.IsNullableType(right) && + TypeUtils.IsNullableType(left) && + method == null && + (binaryType == ExpressionType.AndAlso || binaryType == ExpressionType.OrElse); + } + + + internal static bool ParameterIsAssignable(ParameterInfo pi, Type argType) { + Type pType = pi.ParameterType; + if (pType.IsByRef) + pType = pType.GetElementType(); + return TypeUtils.AreReferenceAssignable(pType, argType); + } + + + private static void ValidateParamswithOperandsOrThrow(Type paramType, Type operandType, ExpressionType exprType, string name) { + if (TypeUtils.IsNullableType(paramType) && !TypeUtils.IsNullableType(operandType)) { + throw Error.OperandTypesDoNotMatchParameters(exprType, name); + } + } + + + private static void ValidateOperator(MethodInfo method) { + System.Diagnostics.Debug.Assert(method != null); + ValidateMethodInfo(method); + if (!method.IsStatic) + throw Error.UserDefinedOperatorMustBeStatic(method); + if (method.ReturnType == typeof(void)) + throw Error.UserDefinedOperatorMustNotBeVoid(method); + } + + + private static void ValidateMethodInfo(MethodInfo method) { + if (method.IsGenericMethodDefinition) + throw Error.MethodIsGeneric(method); + if (method.ContainsGenericParameters) + throw Error.MethodContainsGenericParameters(method); + } + + + private static bool IsNullComparison(Expression left, Expression right) { + // If we have x==null, x!=null, null==x or null!=x where x is + // nullable but not null, then this is treated as a call to x.HasValue + // and is legal even if there is no equality operator defined on the + // type of x. + if (IsNullConstant(left) && !IsNullConstant(right) && TypeUtils.IsNullableType(right.Type)) { + return true; + } + if (IsNullConstant(right) && !IsNullConstant(left) && TypeUtils.IsNullableType(left.Type)) { + return true; + } + return false; + } + + + // Note: this has different meaning than ConstantCheck.IsNull + // That function attempts to determine if the result of a tree will be + // null at runtime. This function is used at tree construction time and + // only looks for a ConstantExpression with a null Value. It can't + // become "smarter" or that would break tree construction. + private static bool IsNullConstant(Expression e) { + var c = e as ConstantExpression; + return c != null && c.Value == null; + } + + + private static void ValidateUserDefinedConditionalLogicOperator(ExpressionType nodeType, Type left, Type right, MethodInfo method) { + ValidateOperator(method); + ParameterInfo[] pms = method.GetParametersCached(); + if (pms.Length != 2) + throw Error.IncorrectNumberOfMethodCallArguments(method); + if (!ParameterIsAssignable(pms[0], left)) { + if (!(TypeUtils.IsNullableType(left) && ParameterIsAssignable(pms[0], TypeUtils.GetNonNullableType(left)))) + throw Error.OperandTypesDoNotMatchParameters(nodeType, method.Name); + } + if (!ParameterIsAssignable(pms[1], right)) { + if (!(TypeUtils.IsNullableType(right) && ParameterIsAssignable(pms[1], TypeUtils.GetNonNullableType(right)))) + throw Error.OperandTypesDoNotMatchParameters(nodeType, method.Name); + } + if (pms[0].ParameterType != pms[1].ParameterType) { + throw Error.UserDefinedOpMustHaveConsistentTypes(nodeType, method.Name); + } + if (method.ReturnType != pms[0].ParameterType) { + throw Error.UserDefinedOpMustHaveConsistentTypes(nodeType, method.Name); + } + if (IsValidLiftedConditionalLogicalOperator(left, right, pms)) { + left = TypeUtils.GetNonNullableType(left); + right = TypeUtils.GetNonNullableType(left); + } + MethodInfo opTrue = TypeUtils.GetBooleanOperator(method.DeclaringType, "op_True"); + MethodInfo opFalse = TypeUtils.GetBooleanOperator(method.DeclaringType, "op_False"); + if (opTrue == null || opTrue.ReturnType != typeof(bool) || + opFalse == null || opFalse.ReturnType != typeof(bool)) { + throw Error.LogicalOperatorMustHaveBooleanOperators(nodeType, method.Name); + } + VerifyOpTrueFalse(nodeType, left, opFalse); + VerifyOpTrueFalse(nodeType, left, opTrue); + } + + private static void VerifyOpTrueFalse(ExpressionType nodeType, Type left, MethodInfo opTrue) { + ParameterInfo[] pmsOpTrue = opTrue.GetParametersCached(); + if (pmsOpTrue.Length != 1) + throw Error.IncorrectNumberOfMethodCallArguments(opTrue); + + if (!ParameterIsAssignable(pmsOpTrue[0], left)) { + if (!(TypeUtils.IsNullableType(left) && ParameterIsAssignable(pmsOpTrue[0], TypeUtils.GetNonNullableType(left)))) + throw Error.OperandTypesDoNotMatchParameters(nodeType, opTrue.Name); + } + } + + private static bool IsValidLiftedConditionalLogicalOperator(Type left, Type right, ParameterInfo[] pms) { + return TypeUtils.AreEquivalent(left, right) && + TypeUtils.IsNullableType(right) && + TypeUtils.AreEquivalent(pms[1].ParameterType, TypeUtils.GetNonNullableType(right)); + } + + + /// + /// Creates a BinaryExpression, given the left and right operands, by calling an appropriate factory method. + /// + /// The ExpressionType that specifies the type of binary operation. + /// An Expression that represents the left operand. + /// An Expression that represents the right operand. + /// The BinaryExpression that results from calling the appropriate factory method. + public static BinaryExpression MakeBinary(ExpressionType binaryType, Expression left, Expression right) { + return MakeBinary(binaryType, left, right, false, null, null); + } + + /// + /// Creates a BinaryExpression, given the left and right operands, by calling an appropriate factory method. + /// + /// The ExpressionType that specifies the type of binary operation. + /// An Expression that represents the left operand. + /// An Expression that represents the right operand. + /// true to set IsLiftedToNull to true; false to set IsLiftedToNull to false. + /// A MethodInfo that specifies the implementing method. + /// The BinaryExpression that results from calling the appropriate factory method. + public static BinaryExpression MakeBinary(ExpressionType binaryType, Expression left, Expression right, bool liftToNull, MethodInfo method) { + return MakeBinary(binaryType, left, right, liftToNull, method, null); + } + + /// + /// + /// Creates a BinaryExpression, given the left and right operands, by calling an appropriate factory method. + /// + /// The ExpressionType that specifies the type of binary operation. + /// An Expression that represents the left operand. + /// An Expression that represents the right operand. + /// true to set IsLiftedToNull to true; false to set IsLiftedToNull to false. + /// A MethodInfo that specifies the implementing method. + /// A LambdaExpression that represents a type conversion function. This parameter is used if binaryType is Coalesce or compound assignment. + /// The BinaryExpression that results from calling the appropriate factory method. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + public static BinaryExpression MakeBinary(ExpressionType binaryType, Expression left, Expression right, bool liftToNull, MethodInfo method, LambdaExpression conversion) { + switch (binaryType) { + case ExpressionType.Add: + return Add(left, right, method); + case ExpressionType.AddChecked: + return AddChecked(left, right, method); + case ExpressionType.Subtract: + return Subtract(left, right, method); + case ExpressionType.SubtractChecked: + return SubtractChecked(left, right, method); + case ExpressionType.Multiply: + return Multiply(left, right, method); + case ExpressionType.MultiplyChecked: + return MultiplyChecked(left, right, method); + case ExpressionType.Divide: + return Divide(left, right, method); + case ExpressionType.Modulo: + return Modulo(left, right, method); + case ExpressionType.Power: + return Power(left, right, method); + case ExpressionType.And: + return And(left, right, method); + case ExpressionType.AndAlso: + return AndAlso(left, right, method); + case ExpressionType.Or: + return Or(left, right, method); + case ExpressionType.OrElse: + return OrElse(left, right, method); + case ExpressionType.LessThan: + return LessThan(left, right, liftToNull, method); + case ExpressionType.LessThanOrEqual: + return LessThanOrEqual(left, right, liftToNull, method); + case ExpressionType.GreaterThan: + return GreaterThan(left, right, liftToNull, method); + case ExpressionType.GreaterThanOrEqual: + return GreaterThanOrEqual(left, right, liftToNull, method); + case ExpressionType.Equal: + return Equal(left, right, liftToNull, method); + case ExpressionType.NotEqual: + return NotEqual(left, right, liftToNull, method); + case ExpressionType.ExclusiveOr: + return ExclusiveOr(left, right, method); + case ExpressionType.Coalesce: + return Coalesce(left, right, conversion); + case ExpressionType.ArrayIndex: + return ArrayIndex(left, right); + case ExpressionType.RightShift: + return RightShift(left, right, method); + case ExpressionType.LeftShift: + return LeftShift(left, right, method); + case ExpressionType.Assign: + return Assign(left, right); + case ExpressionType.AddAssign: + return AddAssign(left, right, method, conversion); + case ExpressionType.AndAssign: + return AndAssign(left, right, method, conversion); + case ExpressionType.DivideAssign: + return DivideAssign(left, right, method, conversion); + case ExpressionType.ExclusiveOrAssign: + return ExclusiveOrAssign(left, right, method, conversion); + case ExpressionType.LeftShiftAssign: + return LeftShiftAssign(left, right, method, conversion); + case ExpressionType.ModuloAssign: + return ModuloAssign(left, right, method, conversion); + case ExpressionType.MultiplyAssign: + return MultiplyAssign(left, right, method, conversion); + case ExpressionType.OrAssign: + return OrAssign(left, right, method, conversion); + case ExpressionType.PowerAssign: + return PowerAssign(left, right, method, conversion); + case ExpressionType.RightShiftAssign: + return RightShiftAssign(left, right, method, conversion); + case ExpressionType.SubtractAssign: + return SubtractAssign(left, right, method, conversion); + case ExpressionType.AddAssignChecked: + return AddAssignChecked(left, right, method, conversion); + case ExpressionType.SubtractAssignChecked: + return SubtractAssignChecked(left, right, method, conversion); + case ExpressionType.MultiplyAssignChecked: + return MultiplyAssignChecked(left, right, method, conversion); + default: + throw Error.UnhandledBinary(binaryType); + } + } + + #region Equality Operators + + + /// + /// Creates a that represents an equality comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression Equal(Expression left, Expression right) { + return Equal(left, right, false, null); + } + + /// + /// Creates a that represents an equality comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// true to set IsLiftedToNull to true; false to set IsLiftedToNull to false. + /// A that has the property equal to + /// and the , , , and properties set to the specified values. + /// + public static BinaryExpression Equal(Expression left, Expression right, bool liftToNull, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + return GetEqualityComparisonOperator(ExpressionType.Equal, "op_Equality", left, right, liftToNull); + } + return GetMethodBasedBinaryOperator(ExpressionType.Equal, left, right, method, liftToNull); + } + + /// + /// Creates a that represents a reference equality comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + /// + public static BinaryExpression ReferenceEqual(Expression left, Expression right) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (TypeUtils.HasReferenceEquality(left.Type, right.Type)) { + return new LogicalBinaryExpression(ExpressionType.Equal, left, right); + } + throw Error.ReferenceEqualityNotDefined(left.Type, right.Type); + } + + /// + /// Creates a that represents an inequality comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression NotEqual(Expression left, Expression right) { + return NotEqual(left, right, false, null); + } + + /// + /// Creates a that represents an inequality comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// true to set IsLiftedToNull to true; false to set IsLiftedToNull to false. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , and properties set to the specified values. + /// + public static BinaryExpression NotEqual(Expression left, Expression right, bool liftToNull, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + return GetEqualityComparisonOperator(ExpressionType.NotEqual, "op_Inequality", left, right, liftToNull); + } + return GetMethodBasedBinaryOperator(ExpressionType.NotEqual, left, right, method, liftToNull); + } + + /// + /// Creates a that represents a reference inequality comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + /// + public static BinaryExpression ReferenceNotEqual(Expression left, Expression right) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (TypeUtils.HasReferenceEquality(left.Type, right.Type)) { + return new LogicalBinaryExpression(ExpressionType.NotEqual, left, right); + } + throw Error.ReferenceEqualityNotDefined(left.Type, right.Type); + } + + private static BinaryExpression GetEqualityComparisonOperator(ExpressionType binaryType, string opName, Expression left, Expression right, bool liftToNull) { + // known comparison - numeric types, bools, object, enums + if (left.Type == right.Type && (TypeUtils.IsNumeric(left.Type) || + left.Type == typeof(object) || + TypeUtils.IsBool(left.Type) || + TypeUtils.GetNonNullableType(left.Type).IsEnum)) { + if (TypeUtils.IsNullableType(left.Type) && liftToNull) { + return new SimpleBinaryExpression(binaryType, left, right, typeof(bool?)); + } else { + return new LogicalBinaryExpression(binaryType, left, right); + } + } + // look for user defined operator + BinaryExpression b = GetUserDefinedBinaryOperator(binaryType, opName, left, right, liftToNull); + if (b != null) { + return b; + } + if (TypeUtils.HasBuiltInEqualityOperator(left.Type, right.Type) || IsNullComparison(left, right)) { + if (TypeUtils.IsNullableType(left.Type) && liftToNull) { + return new SimpleBinaryExpression(binaryType, left, right, typeof(bool?)); + } else { + return new LogicalBinaryExpression(binaryType, left, right); + } + } + throw Error.BinaryOperatorNotDefined(binaryType, left.Type, right.Type); + } + + #endregion + + #region Comparison Expressions + + + /// + /// Creates a that represents a "greater than" numeric comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression GreaterThan(Expression left, Expression right) { + return GreaterThan(left, right, false, null); + } + + /// + /// Creates a that represents a "greater than" numeric comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// true to set IsLiftedToNull to true; false to set IsLiftedToNull to false. + /// A that has the property equal to + /// and the , , , and properties set to the specified values. + /// + public static BinaryExpression GreaterThan(Expression left, Expression right, bool liftToNull, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + return GetComparisonOperator(ExpressionType.GreaterThan, "op_GreaterThan", left, right, liftToNull); + } + return GetMethodBasedBinaryOperator(ExpressionType.GreaterThan, left, right, method, liftToNull); + } + + /// + /// Creates a that represents a "less than" numeric comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + + public static BinaryExpression LessThan(Expression left, Expression right) { + return LessThan(left, right, false, null); + } + + /// + /// Creates a that represents a "less than" numeric comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// true to set IsLiftedToNull to true; false to set IsLiftedToNull to false. + /// A that has the property equal to + /// and the , , , and properties set to the specified values. + /// + public static BinaryExpression LessThan(Expression left, Expression right, bool liftToNull, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + return GetComparisonOperator(ExpressionType.LessThan, "op_LessThan", left, right, liftToNull); + } + return GetMethodBasedBinaryOperator(ExpressionType.LessThan, left, right, method, liftToNull); + } + + + /// + /// Creates a that represents a "greater than or equal" numeric comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression GreaterThanOrEqual(Expression left, Expression right) { + return GreaterThanOrEqual(left, right, false, null); + } + + /// + /// Creates a that represents a "greater than or equal" numeric comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// true to set IsLiftedToNull to true; false to set IsLiftedToNull to false. + /// A that has the property equal to + /// and the , , , and properties set to the specified values. + /// + public static BinaryExpression GreaterThanOrEqual(Expression left, Expression right, bool liftToNull, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + return GetComparisonOperator(ExpressionType.GreaterThanOrEqual, "op_GreaterThanOrEqual", left, right, liftToNull); + } + return GetMethodBasedBinaryOperator(ExpressionType.GreaterThanOrEqual, left, right, method, liftToNull); + } + + + /// + /// Creates a that represents a "less than or equal" numeric comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression LessThanOrEqual(Expression left, Expression right) { + return LessThanOrEqual(left, right, false, null); + } + + /// + /// Creates a that represents a "less than or equal" numeric comparison. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// true to set IsLiftedToNull to true; false to set IsLiftedToNull to false. + /// A that has the property equal to + /// and the , , , and properties set to the specified values. + /// + public static BinaryExpression LessThanOrEqual(Expression left, Expression right, bool liftToNull, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + return GetComparisonOperator(ExpressionType.LessThanOrEqual, "op_LessThanOrEqual", left, right, liftToNull); + } + return GetMethodBasedBinaryOperator(ExpressionType.LessThanOrEqual, left, right, method, liftToNull); + } + + + private static BinaryExpression GetComparisonOperator(ExpressionType binaryType, string opName, Expression left, Expression right, bool liftToNull) { + if (left.Type == right.Type && TypeUtils.IsNumeric(left.Type)) { + if (TypeUtils.IsNullableType(left.Type) && liftToNull) { + return new SimpleBinaryExpression(binaryType, left, right, typeof(bool?)); + } else { + return new LogicalBinaryExpression(binaryType, left, right); + } + } + return GetUserDefinedBinaryOperatorOrThrow(binaryType, opName, left, right, liftToNull); + } + + #endregion + + #region Boolean Expressions + + + /// + /// Creates a that represents a conditional AND operation that evaluates the second operand only if it has to. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression AndAlso(Expression left, Expression right) { + return AndAlso(left, right, null); + } + + /// + /// Creates a that represents a conditional AND operation that evaluates the second operand only if it has to. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression AndAlso(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + Type returnType; + if (method == null) { + if (left.Type == right.Type) { + if (left.Type == typeof(bool)) { + return new LogicalBinaryExpression(ExpressionType.AndAlso, left, right); + } else if (left.Type == typeof(bool?)) { + return new SimpleBinaryExpression(ExpressionType.AndAlso, left, right, left.Type); + } + } + method = GetUserDefinedBinaryOperator(ExpressionType.AndAlso, left.Type, right.Type, "op_BitwiseAnd"); + if (method != null) { + ValidateUserDefinedConditionalLogicOperator(ExpressionType.AndAlso, left.Type, right.Type, method); + returnType = (TypeUtils.IsNullableType(left.Type) && TypeUtils.AreEquivalent(method.ReturnType, TypeUtils.GetNonNullableType(left.Type))) ? left.Type : method.ReturnType; + return new MethodBinaryExpression(ExpressionType.AndAlso, left, right, returnType, method); + } + throw Error.BinaryOperatorNotDefined(ExpressionType.AndAlso, left.Type, right.Type); + } + ValidateUserDefinedConditionalLogicOperator(ExpressionType.AndAlso, left.Type, right.Type, method); + returnType = (TypeUtils.IsNullableType(left.Type) && TypeUtils.AreEquivalent(method.ReturnType, TypeUtils.GetNonNullableType(left.Type))) ? left.Type : method.ReturnType; + return new MethodBinaryExpression(ExpressionType.AndAlso, left, right, returnType, method); + } + + + /// + /// Creates a that represents a conditional OR operation that evaluates the second operand only if it has to. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression OrElse(Expression left, Expression right) { + return OrElse(left, right, null); + } + + /// + /// Creates a that represents a conditional OR operation that evaluates the second operand only if it has to. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression OrElse(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + Type returnType; + if (method == null) { + if (left.Type == right.Type) { + if (left.Type == typeof(bool)) { + return new LogicalBinaryExpression(ExpressionType.OrElse, left, right); + } else if (left.Type == typeof(bool?)) { + return new SimpleBinaryExpression(ExpressionType.OrElse, left, right, left.Type); + } + } + method = GetUserDefinedBinaryOperator(ExpressionType.OrElse, left.Type, right.Type, "op_BitwiseOr"); + if (method != null) { + ValidateUserDefinedConditionalLogicOperator(ExpressionType.OrElse, left.Type, right.Type, method); + returnType = (TypeUtils.IsNullableType(left.Type) && method.ReturnType == TypeUtils.GetNonNullableType(left.Type)) ? left.Type : method.ReturnType; + return new MethodBinaryExpression(ExpressionType.OrElse, left, right, returnType, method); + } + throw Error.BinaryOperatorNotDefined(ExpressionType.OrElse, left.Type, right.Type); + } + ValidateUserDefinedConditionalLogicOperator(ExpressionType.OrElse, left.Type, right.Type, method); + returnType = (TypeUtils.IsNullableType(left.Type) && method.ReturnType == TypeUtils.GetNonNullableType(left.Type)) ? left.Type : method.ReturnType; + return new MethodBinaryExpression(ExpressionType.OrElse, left, right, returnType, method); + } + + #endregion + + #region Coalescing Expressions + + + /// + /// Creates a BinaryExpression that represents a coalescing operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A BinaryExpression that has the NodeType property equal to Coalesce and the Left and Right properties set to the specified values. + public static BinaryExpression Coalesce(Expression left, Expression right) { + return Coalesce(left, right, null); + } + + + /// + /// Creates a BinaryExpression that represents a coalescing operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A LambdaExpression to set the Conversion property equal to. + /// A BinaryExpression that has the NodeType property equal to Coalesce and the Left, Right and Conversion properties set to the specified values. + /// + public static BinaryExpression Coalesce(Expression left, Expression right, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + + if (conversion == null) { + Type resultType = ValidateCoalesceArgTypes(left.Type, right.Type); + return new SimpleBinaryExpression(ExpressionType.Coalesce, left, right, resultType); + } + + if (left.Type.IsValueType && !TypeUtils.IsNullableType(left.Type)) { + throw Error.CoalesceUsedOnNonNullType(); + } + + Type delegateType = conversion.Type; + Debug.Assert(typeof(System.Delegate).IsAssignableFrom(delegateType) && delegateType != typeof(System.Delegate)); + MethodInfo method = delegateType.GetMethod("Invoke"); + if (method.ReturnType == typeof(void)) { + throw Error.UserDefinedOperatorMustNotBeVoid(conversion); + } + ParameterInfo[] pms = method.GetParametersCached(); + Debug.Assert(pms.Length == conversion.Parameters.Count); + if (pms.Length != 1) { + throw Error.IncorrectNumberOfMethodCallArguments(conversion); + } + // The return type must match exactly. + // CONSIDER: We could weaken this restriction and + // CONSIDER: say that the return type must be assignable to from + // CONSIDER: the return type of the lambda. + if (!TypeUtils.AreEquivalent(method.ReturnType, right.Type)) { + throw Error.OperandTypesDoNotMatchParameters(ExpressionType.Coalesce, conversion.ToString()); + } + // The parameter of the conversion lambda must either be assignable + // from the erased or unerased type of the left hand side. + if (!ParameterIsAssignable(pms[0], TypeUtils.GetNonNullableType(left.Type)) && + !ParameterIsAssignable(pms[0], left.Type)) { + throw Error.OperandTypesDoNotMatchParameters(ExpressionType.Coalesce, conversion.ToString()); + } + return new CoalesceConversionBinaryExpression(left, right, conversion); + } + + + private static Type ValidateCoalesceArgTypes(Type left, Type right) { + Type leftStripped = TypeUtils.GetNonNullableType(left); + if (left.IsValueType && !TypeUtils.IsNullableType(left)) { + throw Error.CoalesceUsedOnNonNullType(); + } else if (TypeUtils.IsNullableType(left) && TypeUtils.IsImplicitlyConvertible(right, leftStripped)) { + return leftStripped; + } else if (TypeUtils.IsImplicitlyConvertible(right, left)) { + return left; + } else if (TypeUtils.IsImplicitlyConvertible(leftStripped, right)) { + return right; + } else { + throw Error.ArgumentTypesMustMatch(); + } + } + + + + #endregion + + #region Arithmetic Expressions + + + /// + /// Creates a that represents an arithmetic addition operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression Add(Expression left, Expression right) { + return Add(left, right, null); + } + + /// + /// Creates a that represents an arithmetic addition operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression Add(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + return new SimpleBinaryExpression(ExpressionType.Add, left, right, left.Type); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.Add, "op_Addition", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.Add, left, right, method, true); + } + + + /// + /// Creates a that represents an addition assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression AddAssign(Expression left, Expression right) { + return AddAssign(left, right, null, null); + } + + /// + /// Creates a that represents an addition assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression AddAssign(Expression left, Expression right, MethodInfo method) { + return AddAssign(left, right, method, null); + } + + /// + /// Creates a that represents an addition assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + + public static BinaryExpression AddAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + return new SimpleBinaryExpression(ExpressionType.AddAssign, left, right, left.Type); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.AddAssign, "op_Addition", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.AddAssign, left, right, method, conversion, true); + } + + private static void ValidateOpAssignConversionLambda(LambdaExpression conversion, Expression left, MethodInfo method, ExpressionType nodeType) { + Type delegateType = conversion.Type; + Debug.Assert(typeof(System.Delegate).IsAssignableFrom(delegateType) && delegateType != typeof(System.Delegate)); + MethodInfo mi = delegateType.GetMethod("Invoke"); + ParameterInfo[] pms = mi.GetParametersCached(); + Debug.Assert(pms.Length == conversion.Parameters.Count); + if (pms.Length != 1) { + throw Error.IncorrectNumberOfMethodCallArguments(conversion); + } + if (!TypeUtils.AreEquivalent(mi.ReturnType, left.Type)) { + throw Error.OperandTypesDoNotMatchParameters(nodeType, conversion.ToString()); + } + if (method != null) { + // The parameter type of conversion lambda must be the same as the return type of the overload method + if (!TypeUtils.AreEquivalent(pms[0].ParameterType, method.ReturnType)) { + throw Error.OverloadOperatorTypeDoesNotMatchConversionType(nodeType, conversion.ToString()); + } + } + } + + + /// + /// Creates a that represents an addition assignment operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and + /// properties set to the specified values. + /// + public static BinaryExpression AddAssignChecked(Expression left, Expression right) { + return AddAssignChecked(left, right, null); + } + + /// + /// Creates a that represents an addition assignment operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression AddAssignChecked(Expression left, Expression right, MethodInfo method) { + return AddAssignChecked(left, right, method, null); + } + + /// + /// Creates a that represents an addition assignment operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression AddAssignChecked(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + return new SimpleBinaryExpression(ExpressionType.AddAssignChecked, left, right, left.Type); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.AddAssignChecked, "op_Addition", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.AddAssignChecked, left, right, method, conversion, true); + } + + + /// + /// Creates a that represents an arithmetic addition operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression AddChecked(Expression left, Expression right) { + return AddChecked(left, right, null); + } + + /// + /// Creates a that represents an arithmetic addition operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression AddChecked(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + return new SimpleBinaryExpression(ExpressionType.AddChecked, left, right, left.Type); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.AddChecked, "op_Addition", left, right, false); + } + return GetMethodBasedBinaryOperator(ExpressionType.AddChecked, left, right, method, true); + } + + + /// + /// Creates a that represents an arithmetic subtraction operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression Subtract(Expression left, Expression right) { + return Subtract(left, right, null); + } + + /// + /// Creates a that represents an arithmetic subtraction operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression Subtract(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + return new SimpleBinaryExpression(ExpressionType.Subtract, left, right, left.Type); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.Subtract, "op_Subtraction", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.Subtract, left, right, method, true); + } + + + /// + /// Creates a that represents a subtraction assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression SubtractAssign(Expression left, Expression right) { + return SubtractAssign(left, right, null, null); + } + + /// + /// Creates a that represents a subtraction assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression SubtractAssign(Expression left, Expression right, MethodInfo method) { + return SubtractAssign(left, right, method, null); + } + + /// + /// Creates a that represents a subtraction assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression SubtractAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + return new SimpleBinaryExpression(ExpressionType.SubtractAssign, left, right, left.Type); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.SubtractAssign, "op_Subtraction", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.SubtractAssign, left, right, method, conversion, true); + } + + + /// + /// Creates a that represents a subtraction assignment operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression SubtractAssignChecked(Expression left, Expression right) { + return SubtractAssignChecked(left, right, null); + } + + /// + /// Creates a that represents a subtraction assignment operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression SubtractAssignChecked(Expression left, Expression right, MethodInfo method) { + return SubtractAssignChecked(left, right, method, null); + } + + /// + /// Creates a that represents a subtraction assignment operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression SubtractAssignChecked(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + return new SimpleBinaryExpression(ExpressionType.SubtractAssignChecked, left, right, left.Type); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.SubtractAssignChecked, "op_Subtraction", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.SubtractAssignChecked, left, right, method, conversion, true); + } + + + /// + /// Creates a that represents an arithmetic subtraction operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression SubtractChecked(Expression left, Expression right) { + return SubtractChecked(left, right, null); + } + + /// + /// Creates a that represents an arithmetic subtraction operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression SubtractChecked(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + return new SimpleBinaryExpression(ExpressionType.SubtractChecked, left, right, left.Type); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.SubtractChecked, "op_Subtraction", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.SubtractChecked, left, right, method, true); + } + + + /// + /// Creates a that represents an arithmetic division operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression Divide(Expression left, Expression right) { + return Divide(left, right, null); + } + + /// + /// Creates a that represents an arithmetic division operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression Divide(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + return new SimpleBinaryExpression(ExpressionType.Divide, left, right, left.Type); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.Divide, "op_Division", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.Divide, left, right, method, true); + } + + + /// + /// Creates a that represents a division assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression DivideAssign(Expression left, Expression right) { + return DivideAssign(left, right, null, null); + } + + /// + /// Creates a that represents a division assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression DivideAssign(Expression left, Expression right, MethodInfo method) { + return DivideAssign(left, right, method, null); + } + + /// + /// Creates a that represents a division assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression DivideAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + return new SimpleBinaryExpression(ExpressionType.DivideAssign, left, right, left.Type); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.DivideAssign, "op_Division", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.DivideAssign, left, right, method, conversion, true); + } + + + /// + /// Creates a that represents an arithmetic remainder operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression Modulo(Expression left, Expression right) { + return Modulo(left, right, null); + } + + /// + /// Creates a that represents an arithmetic remainder operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression Modulo(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + return new SimpleBinaryExpression(ExpressionType.Modulo, left, right, left.Type); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.Modulo, "op_Modulus", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.Modulo, left, right, method, true); + } + + + /// + /// Creates a that represents a remainder assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression ModuloAssign(Expression left, Expression right) { + return ModuloAssign(left, right, null, null); + } + + /// + /// Creates a that represents a remainder assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression ModuloAssign(Expression left, Expression right, MethodInfo method) { + return ModuloAssign(left, right, method, null); + } + + /// + /// Creates a that represents a remainder assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression ModuloAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + return new SimpleBinaryExpression(ExpressionType.ModuloAssign, left, right, left.Type); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.ModuloAssign, "op_Modulus", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.ModuloAssign, left, right, method, conversion, true); + } + + + /// + /// Creates a that represents an arithmetic multiplication operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression Multiply(Expression left, Expression right) { + return Multiply(left, right, null); + } + + /// + /// Creates a that represents an arithmetic multiplication operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression Multiply(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + return new SimpleBinaryExpression(ExpressionType.Multiply, left, right, left.Type); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.Multiply, "op_Multiply", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.Multiply, left, right, method, true); + } + + + /// + /// Creates a that represents a multiplication assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression MultiplyAssign(Expression left, Expression right) { + return MultiplyAssign(left, right, null, null); + } + + /// + /// Creates a that represents a multiplication assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression MultiplyAssign(Expression left, Expression right, MethodInfo method) { + return MultiplyAssign(left, right, method, null); + } + + /// + /// Creates a that represents a multiplication assignment operation that does not have overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression MultiplyAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + return new SimpleBinaryExpression(ExpressionType.MultiplyAssign, left, right, left.Type); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.MultiplyAssign, "op_Multiply", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.MultiplyAssign, left, right, method, conversion, true); + } + + + /// + /// Creates a that represents a multiplication assignment operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression MultiplyAssignChecked(Expression left, Expression right) { + return MultiplyAssignChecked(left, right, null); + } + + /// + /// Creates a that represents a multiplication assignment operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression MultiplyAssignChecked(Expression left, Expression right, MethodInfo method) { + return MultiplyAssignChecked(left, right, method, null); + } + + /// + /// Creates a that represents a multiplication assignment operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression MultiplyAssignChecked(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + return new SimpleBinaryExpression(ExpressionType.MultiplyAssignChecked, left, right, left.Type); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.MultiplyAssignChecked, "op_Multiply", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.MultiplyAssignChecked, left, right, method, conversion, true); + } + + + /// + /// Creates a that represents an arithmetic multiplication operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression MultiplyChecked(Expression left, Expression right) { + return MultiplyChecked(left, right, null); + } + + /// + /// Creates a that represents an arithmetic multiplication operation that has overflow checking. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression MultiplyChecked(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsArithmetic(left.Type)) { + return new SimpleBinaryExpression(ExpressionType.MultiplyChecked, left, right, left.Type); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.MultiplyChecked, "op_Multiply", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.MultiplyChecked, left, right, method, true); + } + + private static bool IsSimpleShift(Type left, Type right) { + return TypeUtils.IsInteger(left) + && TypeUtils.GetNonNullableType(right) == typeof(int); + } + + private static Type GetResultTypeOfShift(Type left, Type right) { + if (!left.IsNullableType() && right.IsNullableType()) { + // lift the result type to Nullable + return typeof(Nullable<>).MakeGenericType(left); + } + return left; + } + + + /// + /// Creates a that represents an bitwise left-shift operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression LeftShift(Expression left, Expression right) { + return LeftShift(left, right, null); + } + + /// + /// Creates a that represents an bitwise left-shift operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression LeftShift(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (IsSimpleShift(left.Type, right.Type)) { + Type resultType = GetResultTypeOfShift(left.Type, right.Type); + return new SimpleBinaryExpression(ExpressionType.LeftShift, left, right, resultType); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.LeftShift, "op_LeftShift", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.LeftShift, left, right, method, true); + } + + + /// + /// Creates a that represents a bitwise left-shift assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression LeftShiftAssign(Expression left, Expression right) { + return LeftShiftAssign(left, right, null, null); + } + + /// + /// Creates a that represents a bitwise left-shift assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression LeftShiftAssign(Expression left, Expression right, MethodInfo method) { + return LeftShiftAssign(left, right, method, null); + } + + /// + /// Creates a that represents a bitwise left-shift assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression LeftShiftAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (IsSimpleShift(left.Type, right.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + Type resultType = GetResultTypeOfShift(left.Type, right.Type); + return new SimpleBinaryExpression(ExpressionType.LeftShiftAssign, left, right, resultType); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.LeftShiftAssign, "op_LeftShift", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.LeftShiftAssign, left, right, method, conversion, true); + } + + + /// + /// Creates a that represents an bitwise right-shift operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression RightShift(Expression left, Expression right) { + return RightShift(left, right, null); + } + + /// + /// Creates a that represents an bitwise right-shift operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression RightShift(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (IsSimpleShift(left.Type, right.Type)) { + Type resultType = GetResultTypeOfShift(left.Type, right.Type); + return new SimpleBinaryExpression(ExpressionType.RightShift, left, right, resultType); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.RightShift, "op_RightShift", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.RightShift, left, right, method, true); + } + + + /// + /// Creates a that represents a bitwise right-shift assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression RightShiftAssign(Expression left, Expression right) { + return RightShiftAssign(left, right, null, null); + } + + /// + /// Creates a that represents a bitwise right-shift assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression RightShiftAssign(Expression left, Expression right, MethodInfo method) { + return RightShiftAssign(left, right, method, null); + } + + /// + /// Creates a that represents a bitwise right-shift assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression RightShiftAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (IsSimpleShift(left.Type, right.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + Type resultType = GetResultTypeOfShift(left.Type, right.Type); + return new SimpleBinaryExpression(ExpressionType.RightShiftAssign, left, right, resultType); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.RightShiftAssign, "op_RightShift", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.RightShiftAssign, left, right, method, conversion, true); + } + + + /// + /// Creates a that represents an bitwise AND operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression And(Expression left, Expression right) { + return And(left, right, null); + } + + /// + /// Creates a that represents an bitwise AND operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression And(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsIntegerOrBool(left.Type)) { + return new SimpleBinaryExpression(ExpressionType.And, left, right, left.Type); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.And, "op_BitwiseAnd", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.And, left, right, method, true); + } + + + /// + /// Creates a that represents a bitwise AND assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression AndAssign(Expression left, Expression right) { + return AndAssign(left, right, null, null); + } + + /// + /// Creates a that represents a bitwise AND assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression AndAssign(Expression left, Expression right, MethodInfo method) { + return AndAssign(left, right, method, null); + } + + /// + /// Creates a that represents a bitwise AND assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression AndAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsIntegerOrBool(left.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + return new SimpleBinaryExpression(ExpressionType.AndAssign, left, right, left.Type); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.AndAssign, "op_BitwiseAnd", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.AndAssign, left, right, method, conversion, true); + } + + + /// + /// Creates a that represents an bitwise OR operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression Or(Expression left, Expression right) { + return Or(left, right, null); + } + + /// + /// Creates a that represents an bitwise OR operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression Or(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsIntegerOrBool(left.Type)) { + return new SimpleBinaryExpression(ExpressionType.Or, left, right, left.Type); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.Or, "op_BitwiseOr", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.Or, left, right, method, true); + } + + + /// + /// Creates a that represents a bitwise OR assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression OrAssign(Expression left, Expression right) { + return OrAssign(left, right, null, null); + } + + /// + /// Creates a that represents a bitwise OR assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression OrAssign(Expression left, Expression right, MethodInfo method) { + return OrAssign(left, right, method, null); + } + + /// + /// Creates a that represents a bitwise OR assignment operation. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression OrAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsIntegerOrBool(left.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + return new SimpleBinaryExpression(ExpressionType.OrAssign, left, right, left.Type); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.OrAssign, "op_BitwiseOr", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.OrAssign, left, right, method, conversion, true); + } + + /// + /// Creates a that represents a bitwise or logical XOR operation, using op_ExclusiveOr for user-defined types. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression ExclusiveOr(Expression left, Expression right) { + return ExclusiveOr(left, right, null); + } + + /// + /// Creates a that represents a bitwise or logical XOR operation, using op_ExclusiveOr for user-defined types. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression ExclusiveOr(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsIntegerOrBool(left.Type)) { + return new SimpleBinaryExpression(ExpressionType.ExclusiveOr, left, right, left.Type); + } + return GetUserDefinedBinaryOperatorOrThrow(ExpressionType.ExclusiveOr, "op_ExclusiveOr", left, right, true); + } + return GetMethodBasedBinaryOperator(ExpressionType.ExclusiveOr, left, right, method, true); + } + + /// + /// Creates a that represents a bitwise or logical XOR assignment operation, using op_ExclusiveOr for user-defined types. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression ExclusiveOrAssign(Expression left, Expression right) { + return ExclusiveOrAssign(left, right, null, null); + } + + /// + /// Creates a that represents a bitwise or logical XOR assignment operation, using op_ExclusiveOr for user-defined types. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression ExclusiveOrAssign(Expression left, Expression right, MethodInfo method) { + return ExclusiveOrAssign(left, right, method, null); + } + + /// + /// Creates a that represents a bitwise or logical XOR assignment operation, using op_ExclusiveOr for user-defined types. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression ExclusiveOrAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + if (left.Type == right.Type && TypeUtils.IsIntegerOrBool(left.Type)) { + // conversion is not supported for binary ops on arithmetic types without operator overloading + if (conversion != null) { + throw Error.ConversionIsNotSupportedForArithmeticTypes(); + } + return new SimpleBinaryExpression(ExpressionType.ExclusiveOrAssign, left, right, left.Type); + } + return GetUserDefinedAssignOperatorOrThrow(ExpressionType.ExclusiveOrAssign, "op_ExclusiveOr", left, right, conversion, true); + } + return GetMethodBasedAssignOperator(ExpressionType.ExclusiveOrAssign, left, right, method, conversion, true); + } + + /// + /// Creates a that represents raising a number to a power. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression Power(Expression left, Expression right) { + return Power(left, right, null); + } + + /// + /// Creates a that represents raising a number to a power. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression Power(Expression left, Expression right, MethodInfo method) { + RequiresCanRead(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + Type mathType = typeof(System.Math); + method = mathType.GetMethod("Pow", BindingFlags.Static | BindingFlags.Public); + if (method == null) { + throw Error.BinaryOperatorNotDefined(ExpressionType.Power, left.Type, right.Type); + } + } + return GetMethodBasedBinaryOperator(ExpressionType.Power, left, right, method, true); + } + + + /// + /// Creates a that represents raising an expression to a power and assigning the result back to the expression. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the and properties set to the specified values. + public static BinaryExpression PowerAssign(Expression left, Expression right) { + return PowerAssign(left, right, null, null); + } + + /// + /// Creates a that represents raising an expression to a power and assigning the result back to the expression. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , and properties set to the specified values. + /// + public static BinaryExpression PowerAssign(Expression left, Expression right, MethodInfo method) { + return PowerAssign(left, right, method, null); + } + + /// + /// Creates a that represents raising an expression to a power and assigning the result back to the expression. + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , , + /// and properties set to the specified values. + /// + public static BinaryExpression PowerAssign(Expression left, Expression right, MethodInfo method, LambdaExpression conversion) { + RequiresCanRead(left, "left"); + RequiresCanWrite(left, "left"); + RequiresCanRead(right, "right"); + if (method == null) { + Type mathType = typeof(System.Math); + method = mathType.GetMethod("Pow", BindingFlags.Static | BindingFlags.Public); + if (method == null) { + throw Error.BinaryOperatorNotDefined(ExpressionType.PowerAssign, left.Type, right.Type); + } + } + return GetMethodBasedAssignOperator(ExpressionType.PowerAssign, left, right, method, conversion, true); + } + + #endregion + + #region ArrayIndex Expression + + + /// + /// Creates a BinaryExpression that represents applying an array index operator to an array of rank one. + /// + /// An Expression to set the Left property equal to. + /// An Expression to set the Right property equal to. + /// A BinaryExpression that has the NodeType property equal to ArrayIndex and the Left and Right properties set to the specified values. + public static BinaryExpression ArrayIndex(Expression array, Expression index) { + RequiresCanRead(array, "array"); + RequiresCanRead(index, "index"); + if (index.Type != typeof(int)) { + throw Error.ArgumentMustBeArrayIndexType(); + } + + Type arrayType = array.Type; + if (!arrayType.IsArray) { + throw Error.ArgumentMustBeArray(); + } + if (arrayType.GetArrayRank() != 1) { + throw Error.IncorrectNumberOfIndexes(); + } + + return new SimpleBinaryExpression(ExpressionType.ArrayIndex, array, index, arrayType.GetElementType()); + } + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/BlockExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/BlockExpression.cs new file mode 100644 index 00000000000..430eda70891 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/BlockExpression.cs @@ -0,0 +1,801 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Threading; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents a block that contains a sequence of expressions where variables can be defined. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.BlockExpressionProxy))] +#endif + public class BlockExpression : Expression { + /// + /// Gets the expressions in this block. + /// + public ReadOnlyCollection Expressions { + get { return GetOrMakeExpressions(); } + } + + /// + /// Gets the variables defined in this block. + /// + public ReadOnlyCollection Variables { + get { + return GetOrMakeVariables(); + } + } + + /// + /// Gets the last expression in this block. + /// + public Expression Result { + get { + Debug.Assert(ExpressionCount > 0); + return GetExpression(ExpressionCount - 1); + } + } + + internal BlockExpression() { + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitBlock(this); + } + + /// + /// Returns the node type of this Expression. Extension nodes should return + /// ExpressionType.Extension when overriding this method. + /// + /// The of the expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Block; } + } + + /// + /// Gets the static type of the expression that this represents. + /// + /// The that represents the static type of the expression. + public override Type Type { + get { return GetExpression(ExpressionCount - 1).Type; } + } + + internal virtual Expression GetExpression(int index) { + throw ContractUtils.Unreachable; + } + + internal virtual int ExpressionCount { + get { + throw ContractUtils.Unreachable; + } + } + + internal virtual ReadOnlyCollection GetOrMakeExpressions() { + throw ContractUtils.Unreachable; + } + + internal virtual ParameterExpression GetVariable(int index) { + throw ContractUtils.Unreachable; + } + + internal virtual int VariableCount { + get { + return 0; + } + } + + internal virtual ReadOnlyCollection GetOrMakeVariables() { + return EmptyReadOnlyCollection.Instance; + } + + /// + /// Makes a copy of this node replacing the parameters/args with the provided values. The + /// shape of the parameters/args needs to match the shape of the current block - in other + /// words there should be the same # of parameters and args. + /// + /// parameters can be null in which case the existing parameters are used. + /// + /// This helper is provided to allow re-writing of nodes to not depend on the specific optimized + /// subclass of BlockExpression which is being used. + /// + internal virtual BlockExpression Rewrite(ReadOnlyCollection variables, Expression[] args) { + throw ContractUtils.Unreachable; + } + + /// + /// Helper used for ensuring we only return 1 instance of a ReadOnlyCollection of T. + /// + /// This is similar to the ReturnReadOnly which only takes a single argument. This version + /// supports nodes which hold onto 5 Expressions and puts all of the arguments into the + /// ReadOnlyCollection. + /// + /// Ultimately this means if we create the readonly collection we will be slightly more wasteful as we'll + /// have a readonly collection + some fields in the type. The DLR internally avoids accessing anything + /// which would force the readonly collection to be created. + /// + /// This is used by BlockExpression5 and MethodCallExpression5. + /// + internal static ReadOnlyCollection ReturnReadOnlyExpressions(BlockExpression provider, ref object collection) { + Expression tObj = collection as Expression; + if (tObj != null) { + // otherwise make sure only one readonly collection ever gets exposed + Interlocked.CompareExchange( + ref collection, + new ReadOnlyCollection(new BlockExpressionList(provider, tObj)), + tObj + ); + } + + // and return what is not guaranteed to be a readonly collection + return (ReadOnlyCollection)collection; + } + } + + #region Specialized Subclasses + + internal sealed class Block2 : BlockExpression { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider + private readonly Expression _arg1; // storage for the 2nd argument. + + internal Block2(Expression arg0, Expression arg1) { + _arg0 = arg0; + _arg1 = arg1; + } + + internal override Expression GetExpression(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + default: throw new InvalidOperationException(); + } + } + + internal override int ExpressionCount { + get { + return 2; + } + } + + internal override ReadOnlyCollection GetOrMakeExpressions() { + return ReturnReadOnlyExpressions(this, ref _arg0); + } + + internal override BlockExpression Rewrite(ReadOnlyCollection variables, Expression[] args) { + Debug.Assert(args.Length == 2); + Debug.Assert(variables == null || variables.Count == 0); + + return new Block2(args[0], args[1]); + } + } + + internal sealed class Block3 : BlockExpression { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider + private readonly Expression _arg1, _arg2; // storage for the 2nd and 3rd arguments. + + internal Block3(Expression arg0, Expression arg1, Expression arg2) { + _arg0 = arg0; + _arg1 = arg1; + _arg2 = arg2; + } + + internal override Expression GetExpression(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + case 2: return _arg2; + default: throw new InvalidOperationException(); + } + } + + internal override int ExpressionCount { + get { + return 3; + } + } + + internal override ReadOnlyCollection GetOrMakeExpressions() { + return ReturnReadOnlyExpressions(this, ref _arg0); + } + + internal override BlockExpression Rewrite(ReadOnlyCollection variables, Expression[] args) { + Debug.Assert(args.Length == 3); + Debug.Assert(variables == null || variables.Count == 0); + + return new Block3(args[0], args[1], args[2]); + } + } + + internal sealed class Block4 : BlockExpression { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider + private readonly Expression _arg1, _arg2, _arg3; // storarg for the 2nd, 3rd, and 4th arguments. + + internal Block4(Expression arg0, Expression arg1, Expression arg2, Expression arg3) { + _arg0 = arg0; + _arg1 = arg1; + _arg2 = arg2; + _arg3 = arg3; + } + + internal override Expression GetExpression(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + case 2: return _arg2; + case 3: return _arg3; + default: throw new InvalidOperationException(); + } + } + + internal override int ExpressionCount { + get { + return 4; + } + } + + internal override ReadOnlyCollection GetOrMakeExpressions() { + return ReturnReadOnlyExpressions(this, ref _arg0); + } + + internal override BlockExpression Rewrite(ReadOnlyCollection variables, Expression[] args) { + Debug.Assert(args.Length == 4); + Debug.Assert(variables == null || variables.Count == 0); + + return new Block4(args[0], args[1], args[2], args[3]); + } + } + + internal sealed class Block5 : BlockExpression { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider + private readonly Expression _arg1, _arg2, _arg3, _arg4; // storage for the 2nd - 5th args. + + internal Block5(Expression arg0, Expression arg1, Expression arg2, Expression arg3, Expression arg4) { + _arg0 = arg0; + _arg1 = arg1; + _arg2 = arg2; + _arg3 = arg3; + _arg4 = arg4; + } + + internal override Expression GetExpression(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + case 2: return _arg2; + case 3: return _arg3; + case 4: return _arg4; + default: throw new InvalidOperationException(); + } + } + + internal override int ExpressionCount { + get { + return 5; + } + } + + internal override ReadOnlyCollection GetOrMakeExpressions() { + return ReturnReadOnlyExpressions(this, ref _arg0); + } + + internal override BlockExpression Rewrite(ReadOnlyCollection variables, Expression[] args) { + Debug.Assert(args.Length == 5); + Debug.Assert(variables == null || variables.Count == 0); + + return new Block5(args[0], args[1], args[2], args[3], args[4]); + } + } + + internal class BlockN : BlockExpression { + private IList _expressions; // either the original IList or a ReadOnlyCollection if the user has accessed it. + + internal BlockN(IList expressions) { + Debug.Assert(expressions.Count != 0); + + _expressions = expressions; + } + + internal override Expression GetExpression(int index) { + Debug.Assert(index >= 0 && index < _expressions.Count); + + return _expressions[index]; + } + + internal override int ExpressionCount { + get { + return _expressions.Count; + } + } + + internal override ReadOnlyCollection GetOrMakeExpressions() { + return ReturnReadOnly(ref _expressions); + } + + internal override BlockExpression Rewrite(ReadOnlyCollection variables, Expression[] args) { + Debug.Assert(variables == null || variables.Count == 0); + + return new BlockN(args); + } + } + + internal class ScopeExpression : BlockExpression { + private IList _variables; // list of variables or ReadOnlyCollection if the user has accessed the readonly collection + + internal ScopeExpression(IList variables) { + _variables = variables; + } + + internal override int VariableCount { + get { + return _variables.Count; + } + } + + internal override ParameterExpression GetVariable(int index) { + return _variables[index]; + } + + internal override ReadOnlyCollection GetOrMakeVariables() { + return ReturnReadOnly(ref _variables); + } + + protected IList VariablesList { + get { + return _variables; + } + } + + // Used for rewrite of the nodes to either reuse existing set of variables if not rewritten. + internal IList ReuseOrValidateVariables(ReadOnlyCollection variables) { + if (variables != null && variables != VariablesList) { + // Need to validate the new variables (uniqueness, not byref) + ValidateVariables(variables, "variables"); + return variables; + } else { + return VariablesList; + } + } + } + + internal sealed class Scope1 : ScopeExpression { + private object _body; + + internal Scope1(IList variables, Expression body) + : base(variables) { + _body = body; + } + + internal override Expression GetExpression(int index) { + switch (index) { + case 0: return ReturnObject(_body); + default: throw new InvalidOperationException(); + } + } + + internal override int ExpressionCount { + get { + return 1; + } + } + + internal override ReadOnlyCollection GetOrMakeExpressions() { + return ReturnReadOnlyExpressions(this, ref _body); + } + + internal override BlockExpression Rewrite(ReadOnlyCollection variables, Expression[] args) { + Debug.Assert(args.Length == 1); + Debug.Assert(variables == null || variables.Count == VariableCount); + + return new Scope1(ReuseOrValidateVariables(variables), args[0]); + } + } + + internal class ScopeN : ScopeExpression { + private IList _body; + + internal ScopeN(IList variables, IList body) + : base(variables) { + _body = body; + } + + internal override Expression GetExpression(int index) { + return _body[index]; + } + + internal override int ExpressionCount { + get { + return _body.Count; + } + } + + internal override ReadOnlyCollection GetOrMakeExpressions() { + return ReturnReadOnly(ref _body); + } + + internal override BlockExpression Rewrite(ReadOnlyCollection variables, Expression[] args) { + Debug.Assert(args.Length == ExpressionCount); + Debug.Assert(variables == null || variables.Count == VariableCount); + + return new ScopeN(ReuseOrValidateVariables(variables), args); + } + } + + internal class ScopeWithType : ScopeN { + private readonly Type _type; + + internal ScopeWithType(IList variables, IList expressions, Type type) + : base(variables, expressions) { + _type = type; + } + + public sealed override Type Type { + get { return _type; } + } + + internal override BlockExpression Rewrite(ReadOnlyCollection variables, Expression[] args) { + Debug.Assert(args.Length == ExpressionCount); + Debug.Assert(variables == null || variables.Count == VariableCount); + + return new ScopeWithType(ReuseOrValidateVariables(variables), args, _type); + } + } + + #endregion + + #region Block List Classes + + /// + /// Provides a wrapper around an IArgumentProvider which exposes the argument providers + /// members out as an IList of Expression. This is used to avoid allocating an array + /// which needs to be stored inside of a ReadOnlyCollection. Instead this type has + /// the same amount of overhead as an array without duplicating the storage of the + /// elements. This ensures that internally we can avoid creating and copying arrays + /// while users of the Expression trees also don't pay a size penalty for this internal + /// optimization. See IArgumentProvider for more general information on the Expression + /// tree optimizations being used here. + /// + internal class BlockExpressionList : IList { + private readonly BlockExpression _block; + private readonly Expression _arg0; + + internal BlockExpressionList(BlockExpression provider, Expression arg0) { + _block = provider; + _arg0 = arg0; + } + + #region IList Members + + public int IndexOf(Expression item) { + if (_arg0 == item) { + return 0; + } + + for (int i = 1; i < _block.ExpressionCount; i++) { + if (_block.GetExpression(i) == item) { + return i; + } + } + + return -1; + } + + public void Insert(int index, Expression item) { + throw ContractUtils.Unreachable; + } + + public void RemoveAt(int index) { + throw ContractUtils.Unreachable; + } + + public Expression this[int index] { + get { + if (index == 0) { + return _arg0; + } + + return _block.GetExpression(index); + } + set { + throw ContractUtils.Unreachable; + } + } + + #endregion + + #region ICollection Members + + public void Add(Expression item) { + throw ContractUtils.Unreachable; + } + + public void Clear() { + throw ContractUtils.Unreachable; + } + + public bool Contains(Expression item) { + return IndexOf(item) != -1; + } + + public void CopyTo(Expression[] array, int arrayIndex) { + array[arrayIndex++] = _arg0; + for (int i = 1; i < _block.ExpressionCount; i++) { + array[arrayIndex++] = _block.GetExpression(i); + } + } + + public int Count { + get { return _block.ExpressionCount; } + } + + public bool IsReadOnly { + get { return true; } + } + + public bool Remove(Expression item) { + throw ContractUtils.Unreachable; + } + + #endregion + + #region IEnumerable Members + + public IEnumerator GetEnumerator() { + yield return _arg0; + + for (int i = 1; i < _block.ExpressionCount; i++) { + yield return _block.GetExpression(i); + } + } + + #endregion + + #region IEnumerable Members + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { + yield return _arg0; + + for (int i = 1; i < _block.ExpressionCount; i++) { + yield return _block.GetExpression(i); + } + } + + #endregion + } + + #endregion + + public partial class Expression { + + /// + /// Creates a that contains two expressions and has no variables. + /// + /// The first expression in the block. + /// The second expression in the block. + /// The created . + public static BlockExpression Block(Expression arg0, Expression arg1) { + RequiresCanRead(arg0, "arg0"); + RequiresCanRead(arg1, "arg1"); + + return new Block2(arg0, arg1); + } + /// + /// Creates a that contains three expressions and has no variables. + /// + /// The first expression in the block. + /// The second expression in the block. + /// The third expression in the block. + /// The created . + public static BlockExpression Block(Expression arg0, Expression arg1, Expression arg2) { + RequiresCanRead(arg0, "arg0"); + RequiresCanRead(arg1, "arg1"); + RequiresCanRead(arg2, "arg2"); + return new Block3(arg0, arg1, arg2); + } + + /// + /// Creates a that contains four expressions and has no variables. + /// + /// The first expression in the block. + /// The second expression in the block. + /// The third expression in the block. + /// The fourth expression in the block. + /// The created . + public static BlockExpression Block(Expression arg0, Expression arg1, Expression arg2, Expression arg3) { + RequiresCanRead(arg0, "arg0"); + RequiresCanRead(arg1, "arg1"); + RequiresCanRead(arg2, "arg2"); + RequiresCanRead(arg3, "arg3"); + return new Block4(arg0, arg1, arg2, arg3); + } + + /// + /// Creates a that contains five expressions and has no variables. + /// + /// The first expression in the block. + /// The second expression in the block. + /// The third expression in the block. + /// The fourth expression in the block. + /// The fifth expression in the block. + /// The created . + public static BlockExpression Block(Expression arg0, Expression arg1, Expression arg2, Expression arg3, Expression arg4) { + RequiresCanRead(arg0, "arg0"); + RequiresCanRead(arg1, "arg1"); + RequiresCanRead(arg2, "arg2"); + RequiresCanRead(arg3, "arg3"); + RequiresCanRead(arg4, "arg4"); + + return new Block5(arg0, arg1, arg2, arg3, arg4); + } + + /// + /// Creates a that contains the given expressions and has no variables. + /// + /// The expressions in the block. + /// The created . + public static BlockExpression Block(params Expression[] expressions) { + ContractUtils.RequiresNotNull(expressions, "expressions"); + + switch (expressions.Length) { + case 2: return Block(expressions[0], expressions[1]); + case 3: return Block(expressions[0], expressions[1], expressions[2]); + case 4: return Block(expressions[0], expressions[1], expressions[2], expressions[3]); + case 5: return Block(expressions[0], expressions[1], expressions[2], expressions[3], expressions[4]); + default: + ContractUtils.RequiresNotEmpty(expressions, "expressions"); + RequiresCanRead(expressions, "expressions"); + return new BlockN(expressions.Copy()); + } + } + + /// + /// Creates a that contains the given expressions and has no variables. + /// + /// The expressions in the block. + /// The created . + public static BlockExpression Block(IEnumerable expressions) { + return Block(EmptyReadOnlyCollection.Instance, expressions); + } + + /// + /// Creates a that contains the given expressions, has no variables and has specific result type. + /// + /// The result type of the block. + /// The expressions in the block. + /// The created . + public static BlockExpression Block(Type type, params Expression[] expressions) { + ContractUtils.RequiresNotNull(expressions, "expressions"); + return Block(type, (IEnumerable)expressions); + } + + /// + /// Creates a that contains the given expressions, has no variables and has specific result type. + /// + /// The result type of the block. + /// The expressions in the block. + /// The created . + public static BlockExpression Block(Type type, IEnumerable expressions) { + return Block(type, EmptyReadOnlyCollection.Instance, expressions); + } + + /// + /// Creates a that contains the given variables and expressions. + /// + /// The variables in the block. + /// The expressions in the block. + /// The created . + public static BlockExpression Block(IEnumerable variables, params Expression[] expressions) { + return Block(variables, (IEnumerable)expressions); + } + + /// + /// Creates a that contains the given variables and expressions. + /// + /// The result type of the block. + /// The variables in the block. + /// The expressions in the block. + /// The created . + public static BlockExpression Block(Type type, IEnumerable variables, params Expression[] expressions) { + return Block(type, variables, (IEnumerable)expressions); + } + + /// + /// Creates a that contains the given variables and expressions. + /// + /// The variables in the block. + /// The expressions in the block. + /// The created . + public static BlockExpression Block(IEnumerable variables, IEnumerable expressions) { + ContractUtils.RequiresNotNull(expressions, "expressions"); + var expressionList = expressions.ToReadOnly(); + ContractUtils.RequiresNotEmpty(expressionList, "expressions"); + RequiresCanRead(expressionList, "expressions"); + + return Block(expressionList.Last().Type, variables, expressionList); + } + + /// + /// Creates a that contains the given variables and expressions. + /// + /// The result type of the block. + /// The variables in the block. + /// The expressions in the block. + /// The created . + public static BlockExpression Block(Type type, IEnumerable variables, IEnumerable expressions) { + ContractUtils.RequiresNotNull(type, "type"); + ContractUtils.RequiresNotNull(expressions, "expressions"); + + var expressionList = expressions.ToReadOnly(); + var variableList = variables.ToReadOnly(); + + ContractUtils.RequiresNotEmpty(expressionList, "expressions"); + RequiresCanRead(expressionList, "expressions"); + ValidateVariables(variableList, "variables"); + + Expression last = expressionList.Last(); + if (type != typeof(void)) { + if (!TypeUtils.AreReferenceAssignable(type, last.Type)) { + throw Error.ArgumentTypesMustMatch(); + } + } + + if (!TypeUtils.AreEquivalent(type, last.Type)) { + return new ScopeWithType(variableList, expressionList, type); + } else { + if (expressionList.Count == 1) { + return new Scope1(variableList, expressionList[0]); + } else { + return new ScopeN(variableList, expressionList); + } + } + } + + // Checks that all variables are non-null, not byref, and unique. + internal static void ValidateVariables(ReadOnlyCollection varList, string collectionName) { + if (varList.Count == 0) { + return; + } + + int count = varList.Count; + var set = new Set(count); + for (int i = 0; i < count; i++) { + ParameterExpression v = varList[i]; + if (v == null) { + throw new ArgumentNullException(string.Format(System.Globalization.CultureInfo.CurrentCulture, "{0}[{1}]", collectionName, set.Count)); + } + if (v.IsByRef) { + throw Error.VariableMustNotBeByRef(v, v.Type); + } + if (set.Contains(v)) { + throw Error.DuplicateVariable(v); + } + set.Add(v); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/CatchBlock.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/CatchBlock.cs new file mode 100644 index 00000000000..f2698e54764 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/CatchBlock.cs @@ -0,0 +1,163 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Represents a catch statement in a try block. + /// This must have the same return type (i.e., the type of ) as the try block it is associated with. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.CatchBlockProxy))] +#endif + public sealed class CatchBlock { + private readonly Type _test; + private readonly ParameterExpression _var; + private readonly Expression _body; + private readonly Expression _filter; + + internal CatchBlock(Type test, ParameterExpression variable, Expression body, Expression filter) { + _test = test; + _var = variable; + _body = body; + _filter = filter; + } + + /// + /// Gets a reference to the object caught by this handler. + /// + public ParameterExpression Variable { + get { return _var; } + } + + /// + /// Gets the type of this handler catches. + /// + public Type Test { + get { return _test; } + } + + /// + /// Gets the body of the catch block. + /// + public Expression Body { + get { return _body; } + } + + /// + /// Gets the body of the 's filter. + /// + public Expression Filter { + get { + return _filter; + } + } + + /// + /// Returns a that represents the current . + /// + /// A that represents the current . + public override string ToString() { + return ExpressionStringBuilder.CatchBlockToString(this); + } + } + + public partial class Expression { + /// + /// Creates a representing a catch statement. + /// The of object to be caught can be specified but no reference to the object + /// will be available for use in the . + /// + /// The of this will handle. + /// The body of the catch statement. + /// The created . + public static CatchBlock Catch(Type type, Expression body) { + return MakeCatchBlock(type, null, body, null); + } + + /// + /// Creates a representing a catch statement with a reference to the caught object for use in the handler body. + /// + /// A representing a reference to the object caught by this handler. + /// The body of the catch statement. + /// The created . + public static CatchBlock Catch(ParameterExpression variable, Expression body) { + ContractUtils.RequiresNotNull(variable, "variable"); + return MakeCatchBlock(variable.Type, variable, body, null); + } + + /// + /// Creates a representing a catch statement with + /// an filter but no reference to the caught object. + /// + /// The of this will handle. + /// The body of the catch statement. + /// The body of the filter. + /// The created . + public static CatchBlock Catch(Type type, Expression body, Expression filter) { + return MakeCatchBlock(type, null, body, filter); + } + + /// + /// Creates a representing a catch statement with + /// an filter and a reference to the caught object. + /// + /// A representing a reference to the object caught by this handler. + /// The body of the catch statement. + /// The body of the filter. + /// The created . + public static CatchBlock Catch(ParameterExpression variable, Expression body, Expression filter) { + ContractUtils.RequiresNotNull(variable, "variable"); + return MakeCatchBlock(variable.Type, variable, body, filter); + } + + /// + /// Creates a representing a catch statement with the specified elements. + /// + /// The of this will handle. + /// A representing a reference to the object caught by this handler. + /// The body of the catch statement. + /// The body of the filter. + /// The created . + /// must be non-null and match the type of (if it is supplied). + public static CatchBlock MakeCatchBlock(Type type, ParameterExpression variable, Expression body, Expression filter) { + ContractUtils.RequiresNotNull(type, "type"); + ContractUtils.Requires(variable == null || TypeUtils.AreEquivalent(variable.Type, type), "variable"); + if (variable != null && variable.IsByRef) { + throw Error.VariableMustNotBeByRef(variable, variable.Type); + } + RequiresCanRead(body, "body"); + if (filter != null) { + RequiresCanRead(filter, "filter"); + ContractUtils.Requires(filter.Type == typeof(bool), Strings.ArgumentMustBeBoolean); + } + + return new CatchBlock(type, variable, body, filter); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ConditionalExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ConditionalExpression.cs new file mode 100644 index 00000000000..d7d0cf0a33f --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ConditionalExpression.cs @@ -0,0 +1,214 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Diagnostics; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Represents an expression that has a conditional operator. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.ConditionalExpressionProxy))] +#endif + public class ConditionalExpression : Expression { + private readonly Expression _test; + private readonly Expression _true; + + internal ConditionalExpression(Expression test, Expression ifTrue) { + _test = test; + _true = ifTrue; + } + + internal static ConditionalExpression Make(Expression test, Expression ifTrue, Expression ifFalse, Type type) { + if (ifTrue.Type != type || ifFalse.Type != type) { + return new FullConditionalExpressionWithType(test, ifTrue, ifFalse, type); + } if (ifFalse is DefaultExpression && ifFalse.Type == typeof(void)) { + return new ConditionalExpression(test, ifTrue); + } else { + return new FullConditionalExpression(test, ifTrue, ifFalse); + } + } + + /// + /// Returns the node type of this Expression. Extension nodes should return + /// ExpressionType.Extension when overriding this method. + /// + /// The of the expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Conditional; } + } + + /// + /// Gets the static type of the expression that this represents. + /// + /// The that represents the static type of the expression. + public override Type Type { + get { return IfTrue.Type; } + } + + /// + /// Gets the test of the conditional operation. + /// + public Expression Test { + get { return _test; } + } + /// + /// Gets the expression to execute if the test evaluates to true. + /// + public Expression IfTrue { + get { return _true; } + } + /// + /// Gets the expression to execute if the test evaluates to false. + /// + public Expression IfFalse { + get { return GetFalse(); } + } + + internal virtual Expression GetFalse() { + return Expression.Empty(); + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitConditional(this); + } + } + + internal class FullConditionalExpression : ConditionalExpression { + private readonly Expression _false; + + internal FullConditionalExpression(Expression test, Expression ifTrue, Expression ifFalse) + : base(test, ifTrue) { + _false = ifFalse; + } + + internal override Expression GetFalse() { + return _false; + } + } + + internal class FullConditionalExpressionWithType : FullConditionalExpression { + private readonly Type _type; + + internal FullConditionalExpressionWithType(Expression test, Expression ifTrue, Expression ifFalse, Type type) + : base(test, ifTrue, ifFalse) { + _type = type; + } + + public sealed override Type Type { + get { return _type; } + } + } + + public partial class Expression { + + /// + /// Creates a . + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the , , + /// and properties set to the specified values. + public static ConditionalExpression Condition(Expression test, Expression ifTrue, Expression ifFalse) { + RequiresCanRead(test, "test"); + RequiresCanRead(ifTrue, "ifTrue"); + RequiresCanRead(ifFalse, "ifFalse"); + + if (test.Type != typeof(bool)) { + throw Error.ArgumentMustBeBoolean(); + } + if (!TypeUtils.AreEquivalent(ifTrue.Type, ifFalse.Type)) { + throw Error.ArgumentTypesMustMatch(); + } + + return ConditionalExpression.Make(test, ifTrue, ifFalse, ifTrue.Type); + } + + + /// + /// Creates a . + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to + /// and the , , + /// and properties set to the specified values. + /// This method allows explicitly unifying the result type of the conditional expression in cases where the types of + /// and expressions are not equal. Types of both and must be implicitly + /// reference assignable to the result type. The is allowed to be . + public static ConditionalExpression Condition(Expression test, Expression ifTrue, Expression ifFalse, Type type) { + RequiresCanRead(test, "test"); + RequiresCanRead(ifTrue, "ifTrue"); + RequiresCanRead(ifFalse, "ifFalse"); + ContractUtils.RequiresNotNull(type, "type"); + + if (test.Type != typeof(bool)) { + throw Error.ArgumentMustBeBoolean(); + } + + if (type != typeof(void)) { + if (!TypeUtils.AreReferenceAssignable(type, ifTrue.Type) || + !TypeUtils.AreReferenceAssignable(type, ifFalse.Type)) { + throw Error.ArgumentTypesMustMatch(); + } + } + + return ConditionalExpression.Make(test, ifTrue, ifFalse, type); + } + + /// + /// Creates a . + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the , , + /// properties set to the specified values. The property is set to default expression and + /// the type of the resulting returned by this method is . + public static ConditionalExpression IfThen(Expression test, Expression ifTrue) { + return Condition(test, ifTrue, Expression.Empty(), typeof(void)); + } + + /// + /// Creates a . + /// + /// An to set the property equal to. + /// An to set the property equal to. + /// An to set the property equal to. + /// A that has the property equal to + /// and the , , + /// and properties set to the specified values. The type of the resulting + /// returned by this method is . + public static ConditionalExpression IfThenElse(Expression test, Expression ifTrue, Expression ifFalse) { + return Condition(test, ifTrue, ifFalse, typeof(void)); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ConstantExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ConstantExpression.cs new file mode 100644 index 00000000000..65c89b8b4a0 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ConstantExpression.cs @@ -0,0 +1,136 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Represents an expression that has a constant value. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.ConstantExpressionProxy))] +#endif + public class ConstantExpression : Expression { + // Possible optimization: we could have a Constant subclass that + // stores the unboxed value. + private readonly object _value; + + internal ConstantExpression(object value) { + _value = value; + } + + internal static ConstantExpression Make(object value, Type type) { + if ((value == null && type == typeof(object)) || (value != null && value.GetType() == type)) { + return new ConstantExpression(value); + } else { + return new TypedConstantExpression(value, type); + } + } + + /// + /// Gets the static type of the expression that this represents. + /// + /// The that represents the static type of the expression. + public override Type Type { + get { + if (_value == null) { + return typeof(object); + } + return _value.GetType(); + } + } + + /// + /// Returns the node type of this Expression. Extension nodes should return + /// ExpressionType.Extension when overriding this method. + /// + /// The of the expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Constant; } + } + /// + /// Gets the value of the constant expression. + /// + public object Value { + get { return _value; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitConstant(this); + } + } + + internal class TypedConstantExpression : ConstantExpression { + private readonly Type _type; + + internal TypedConstantExpression(object value, Type type) + : base(value) { + _type = type; + } + + public sealed override Type Type { + get { return _type; } + } + } + + public partial class Expression { + /// + /// Creates a that has the property set to the specified value. . + /// + /// An to set the property equal to. + /// + /// A that has the property equal to + /// and the property set to the specified value. + /// + public static ConstantExpression Constant(object value) { + return ConstantExpression.Make(value, value == null ? typeof(object) : value.GetType()); + } + + + /// + /// Creates a that has the + /// and properties set to the specified values. . + /// + /// An to set the property equal to. + /// A to set the property equal to. + /// + /// A that has the property equal to + /// and the and + /// properties set to the specified values. + /// + public static ConstantExpression Constant(object value, Type type) { + ContractUtils.RequiresNotNull(type, "type"); + if (value == null && type.IsValueType && !TypeUtils.IsNullableType(type)) { + throw Error.ArgumentTypesMustMatch(); + } + if (value != null && !type.IsAssignableFrom(value.GetType())) { + throw Error.ArgumentTypesMustMatch(); + } + return ConstantExpression.Make(value, type); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DebugInfoExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DebugInfoExpression.cs new file mode 100644 index 00000000000..b0fc4c0c266 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DebugInfoExpression.cs @@ -0,0 +1,247 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Emits or clears a sequence point for debug information. + /// + /// This allows the debugger to highlight the correct source code when + /// debugging. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.DebugInfoExpressionProxy))] +#endif + public class DebugInfoExpression : Expression { + + private readonly SymbolDocumentInfo _document; + + internal DebugInfoExpression(SymbolDocumentInfo document) { + _document = document; + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return typeof(void); } + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.DebugInfo; } + } + + /// + /// Gets the start line of this . + /// + public virtual int StartLine { + get { throw ContractUtils.Unreachable; } + } + + /// + /// Gets the start column of this . + /// + public virtual int StartColumn { + get { throw ContractUtils.Unreachable; } + } + + /// + /// Gets the end line of this . + /// + public virtual int EndLine { + get { throw ContractUtils.Unreachable; } + } + + /// + /// Gets the end column of this . + /// + public virtual int EndColumn { + get { throw ContractUtils.Unreachable; } + } + + /// + /// Gets the that represents the source file. + /// + public SymbolDocumentInfo Document { + get { return _document; } + } + + /// + /// Gets the value to indicate if the is for clearing a sequence point. + /// + public virtual bool IsClear { + get { throw ContractUtils.Unreachable; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitDebugInfo(this); + } + } + + #region Specialized subclasses + + internal sealed class SpanDebugInfoExpression : DebugInfoExpression { + private readonly int _startLine, _startColumn, _endLine, _endColumn; + + internal SpanDebugInfoExpression(SymbolDocumentInfo document, int startLine, int startColumn, int endLine, int endColumn) + : base(document) { + _startLine = startLine; + _startColumn = startColumn; + _endLine = endLine; + _endColumn = endColumn; + } + + public override int StartLine { + get { + return _startLine; + } + } + + public override int StartColumn { + get { + return _startColumn; + } + } + + public override int EndLine { + get { + return _endLine; + } + } + + public override int EndColumn { + get { + return _endColumn; + } + } + + public override bool IsClear { + get { + return false; + } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitDebugInfo(this); + } + } + + internal sealed class ClearDebugInfoExpression : DebugInfoExpression { + internal ClearDebugInfoExpression(SymbolDocumentInfo document) + : base(document) { + } + + public override bool IsClear { + get { + return true; + } + } + + public override int StartLine { + get { + return 0xfeefee; + } + } + + public override int StartColumn { + get { + return 0; + } + } + + public override int EndLine { + get { + return 0xfeefee; + } + } + + public override int EndColumn { + get { + return 0; + } + } + } + #endregion + + public partial class Expression { + /// + /// Creates a with the specified span. + /// + /// The that represents the source file. + /// The start line of this . Must be greater than 0. + /// The start column of this . Must be greater than 0. + /// The end line of this . Must be greater or equal than the start line. + /// The end column of this . If the end line is the same as the start line, it must be greater or equal than the start column. In any case, must be greater than 0. + /// An instance of . + public static DebugInfoExpression DebugInfo(SymbolDocumentInfo document, int startLine, int startColumn, int endLine, int endColumn) { + ContractUtils.RequiresNotNull(document, "document"); + if (startLine == 0xfeefee && startColumn == 0 && endLine == 0xfeefee && endColumn == 0) { + return new ClearDebugInfoExpression(document); + } + + ValidateSpan(startLine, startColumn, endLine, endColumn); + return new SpanDebugInfoExpression(document, startLine, startColumn, endLine, endColumn); + } + + /// + /// Creates a for clearing a sequence point. + /// + /// The that represents the source file. + /// An instance of for clearning a sequence point. + public static DebugInfoExpression ClearDebugInfo(SymbolDocumentInfo document) { + ContractUtils.RequiresNotNull(document, "document"); + + return new ClearDebugInfoExpression(document); + } + + private static void ValidateSpan(int startLine, int startColumn, int endLine, int endColumn) { + if (startLine < 1) { + throw Error.OutOfRange("startLine", 1); + } + if (startColumn < 1) { + throw Error.OutOfRange("startColumn", 1); + } + if (endLine < 1) { + throw Error.OutOfRange("endLine", 1); + } + if (endColumn < 1) { + throw Error.OutOfRange("endColumn", 1); + } + if (startLine > endLine) { + throw Error.StartEndMustBeOrdered(); + } + if (startLine == endLine && startColumn > endColumn) { + throw Error.StartEndMustBeOrdered(); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DebugViewWriter.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DebugViewWriter.cs new file mode 100644 index 00000000000..db51b68f785 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DebugViewWriter.cs @@ -0,0 +1,1196 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic; +using System.Dynamic.Utils; +#else +using Microsoft.Scripting; +using Microsoft.Scripting.Utils; +#endif +using System.Globalization; +using System.IO; +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Collections.ObjectModel; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling")] + internal sealed class DebugViewWriter : ExpressionVisitor { + [Flags] + private enum Flow { + None, + Space, + NewLine, + + Break = 0x8000 // newline if column > MaxColumn + }; + + private const int Tab = 4; + private const int MaxColumn = 120; + + private TextWriter _out; + private int _column; + + private Stack _stack = new Stack(); + private int _delta; + private Flow _flow; + + // All the unique lambda expressions in the ET, will be used for displaying all + // the lambda definitions. + private Queue _lambdas; + + // Associate every unique anonymous LambdaExpression in the tree with an integer. + // The id is used to create a name for the anonymous lambda. + // + private Dictionary _lambdaIds; + + // Associate every unique anonymous parameter or variable in the tree with an integer. + // The id is used to create a name for the anonymous parameter or variable. + // + private Dictionary _paramIds; + + // Associate every unique anonymous LabelTarget in the tree with an integer. + // The id is used to create a name for the anonymous LabelTarget. + // + private Dictionary _labelIds; + + private DebugViewWriter(TextWriter file) { + _out = file; + } + + private int Base { + get { + return _stack.Count > 0 ? _stack.Peek() : 0; + } + } + + private int Delta { + get { return _delta; } + } + + private int Depth { + get { return Base + Delta; } + } + + private void Indent() { + _delta += Tab; + } + private void Dedent() { + _delta -= Tab; + } + + private void NewLine() { + _flow = Flow.NewLine; + } + + private static int GetId(T e, ref Dictionary ids) { + if (ids == null) { + ids = new Dictionary(); + ids.Add(e, 1); + return 1; + } else { + int id; + if (!ids.TryGetValue(e, out id)) { + // e is met the first time + id = ids.Count + 1; + ids.Add(e, id); + } + return id; + } + } + + private int GetLambdaId(LambdaExpression le) { + Debug.Assert(String.IsNullOrEmpty(le.Name)); + return GetId(le, ref _lambdaIds); + } + + private int GetParamId(ParameterExpression p) { + Debug.Assert(String.IsNullOrEmpty(p.Name)); + return GetId(p, ref _paramIds); + } + + private int GetLabelTargetId(LabelTarget target) { + Debug.Assert(String.IsNullOrEmpty(target.Name)); + return GetId(target, ref _labelIds); + } + + /// + /// Write out the given AST + /// + internal static void WriteTo(Expression node, TextWriter writer) { + Debug.Assert(node != null); + Debug.Assert(writer != null); + + new DebugViewWriter(writer).WriteTo(node); + } + + private void WriteTo(Expression node) { + var lambda = node as LambdaExpression; + if (lambda != null) { + WriteLambda(lambda); + } else { + Visit(node); + Debug.Assert(_stack.Count == 0); + } + + // + // Output all lambda expression definitions. + // in the order of their appearances in the tree. + // + while (_lambdas != null && _lambdas.Count > 0) { + WriteLine(); + WriteLine(); + WriteLambda(_lambdas.Dequeue()); + } + } + + #region The printing code + + private void Out(string s) { + Out(Flow.None, s, Flow.None); + } + + private void Out(Flow before, string s) { + Out(before, s, Flow.None); + } + + private void Out(string s, Flow after) { + Out(Flow.None, s, after); + } + + private void Out(Flow before, string s, Flow after) { + switch (GetFlow(before)) { + case Flow.None: + break; + case Flow.Space: + Write(" "); + break; + case Flow.NewLine: + WriteLine(); + Write(new String(' ', Depth)); + break; + } + Write(s); + _flow = after; + } + + private void WriteLine() { + _out.WriteLine(); + _column = 0; + } + private void Write(string s) { + _out.Write(s); + _column += s.Length; + } + + private Flow GetFlow(Flow flow) { + Flow last; + + last = CheckBreak(_flow); + flow = CheckBreak(flow); + + // Get the biggest flow that is requested None < Space < NewLine + return (Flow)System.Math.Max((int)last, (int)flow); + } + + private Flow CheckBreak(Flow flow) { + if ((flow & Flow.Break) != 0) { + if (_column > (MaxColumn + Depth)) { + flow = Flow.NewLine; + } else { + flow &= ~Flow.Break; + } + } + return flow; + } + + #endregion + + #region The AST Output + + // More proper would be to make this a virtual method on Action + private static string FormatBinder(CallSiteBinder binder) { + ConvertBinder convert; + GetMemberBinder getMember; + SetMemberBinder setMember; + DeleteMemberBinder deleteMember; + GetIndexBinder getIndex; + SetIndexBinder setIndex; + DeleteIndexBinder deleteIndex; + InvokeMemberBinder call; + InvokeBinder invoke; + CreateInstanceBinder create; + UnaryOperationBinder unary; + BinaryOperationBinder binary; + + if ((convert = binder as ConvertBinder) != null) { + return "Convert " + convert.Type.ToString(); + } else if ((getMember = binder as GetMemberBinder) != null) { + return "GetMember " + getMember.Name; + } else if ((setMember = binder as SetMemberBinder) != null) { + return "SetMember " + setMember.Name; + } else if ((deleteMember = binder as DeleteMemberBinder) != null) { + return "DeleteMember " + deleteMember.Name; + } else if ((getIndex = binder as GetIndexBinder) != null) { + return "GetIndex"; + } else if ((setIndex = binder as SetIndexBinder) != null) { + return "SetIndex"; + } else if ((deleteIndex = binder as DeleteIndexBinder) != null) { + return "DeleteIndex"; + } else if ((call = binder as InvokeMemberBinder) != null) { + return "Call " + call.Name; + } else if ((invoke = binder as InvokeBinder) != null) { + return "Invoke"; + } else if ((create = binder as CreateInstanceBinder) != null) { + return "Create"; + } else if ((unary = binder as UnaryOperationBinder) != null) { + return "UnaryOperation " + unary.Operation; + } else if ((binary = binder as BinaryOperationBinder) != null) { + return "BinaryOperation " + binary.Operation; + } else { + return binder.ToString(); + } + } + + private void VisitExpressions(char open, IList expressions) where T : Expression { + VisitExpressions(open, ',', expressions); + } + + private void VisitExpressions(char open, char separator, IList expressions) where T : Expression { + VisitExpressions(open, separator, expressions, e => Visit(e)); + } + + private void VisitDeclarations(IList expressions) { + VisitExpressions('(', ',', expressions, variable => + { + Out(variable.Type.ToString()); + if (variable.IsByRef) { + Out("&"); + } + Out(" "); + VisitParameter(variable); + }); + } + + private void VisitExpressions(char open, char separator, IList expressions, Action visit) { + Out(open.ToString()); + + if (expressions != null) { + Indent(); + bool isFirst = true; + foreach (T e in expressions) { + if (isFirst) { + if (open == '{' || expressions.Count > 1) { + NewLine(); + } + isFirst = false; + } else { + Out(separator.ToString(), Flow.NewLine); + } + visit(e); + } + Dedent(); + } + + char close; + switch (open) { + case '(': close = ')'; break; + case '{': close = '}'; break; + case '[': close = ']'; break; + case '<': close = '>'; break; + default: throw ContractUtils.Unreachable; + } + + if (open == '{') { + NewLine(); + } + Out(close.ToString(), Flow.Break); + } + + protected internal override Expression VisitDynamic(DynamicExpression node) { + Out(".Dynamic", Flow.Space); + Out(FormatBinder(node.Binder)); + VisitExpressions('(', node.Arguments); + return node; + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + protected internal override Expression VisitBinary(BinaryExpression node) { + if (node.NodeType == ExpressionType.ArrayIndex) { + ParenthesizedVisit(node, node.Left); + Out("["); + Visit(node.Right); + Out("]"); + } else { + bool parenthesizeLeft = NeedsParentheses(node, node.Left); + bool parenthesizeRight = NeedsParentheses(node, node.Right); + + string op; + bool isChecked = false; + Flow beforeOp = Flow.Space; + switch (node.NodeType) { + case ExpressionType.Assign: op = "="; break; + case ExpressionType.Equal: op = "=="; break; + case ExpressionType.NotEqual: op = "!="; break; + case ExpressionType.AndAlso: op = "&&"; beforeOp = Flow.Break | Flow.Space; break; + case ExpressionType.OrElse: op = "||"; beforeOp = Flow.Break | Flow.Space; break; + case ExpressionType.GreaterThan: op = ">"; break; + case ExpressionType.LessThan: op = "<"; break; + case ExpressionType.GreaterThanOrEqual: op = ">="; break; + case ExpressionType.LessThanOrEqual: op = "<="; break; + case ExpressionType.Add: op = "+"; break; + case ExpressionType.AddAssign: op = "+="; break; + case ExpressionType.AddAssignChecked: op = "+="; isChecked = true; break; + case ExpressionType.AddChecked: op = "+"; isChecked = true; break; + case ExpressionType.Subtract: op = "-"; break; + case ExpressionType.SubtractAssign: op = "-="; break; + case ExpressionType.SubtractAssignChecked: op = "-="; isChecked = true; break; + case ExpressionType.SubtractChecked: op = "-"; isChecked = true; break; + case ExpressionType.Divide: op = "/"; break; + case ExpressionType.DivideAssign: op = "/="; break; + case ExpressionType.Modulo: op = "%"; break; + case ExpressionType.ModuloAssign: op = "%="; break; + case ExpressionType.Multiply: op = "*"; break; + case ExpressionType.MultiplyAssign: op = "*="; break; + case ExpressionType.MultiplyAssignChecked: op = "*="; isChecked = true; break; + case ExpressionType.MultiplyChecked: op = "*"; isChecked = true; break; + case ExpressionType.LeftShift: op = "<<"; break; + case ExpressionType.LeftShiftAssign: op = "<<="; break; + case ExpressionType.RightShift: op = ">>"; break; + case ExpressionType.RightShiftAssign: op = ">>="; break; + case ExpressionType.And: op = "&"; break; + case ExpressionType.AndAssign: op = "&="; break; + case ExpressionType.Or: op = "|"; break; + case ExpressionType.OrAssign: op = "|="; break; + case ExpressionType.ExclusiveOr: op = "^"; break; + case ExpressionType.ExclusiveOrAssign: op = "^="; break; + case ExpressionType.Power: op = "**"; break; + case ExpressionType.PowerAssign: op = "**="; break; + case ExpressionType.Coalesce: op = "??"; break; + + default: + throw new InvalidOperationException(); + } + + if (parenthesizeLeft) { + Out("(", Flow.None); + } + + Visit(node.Left); + if (parenthesizeLeft) { + Out(Flow.None, ")", Flow.Break); + } + + // prepend # to the operator to represent checked op + if (isChecked) { + op = String.Format( + CultureInfo.CurrentCulture, + "#{0}", + op + ); + } + Out(beforeOp, op, Flow.Space | Flow.Break); + + if (parenthesizeRight) { + Out("(", Flow.None); + } + Visit(node.Right); + if (parenthesizeRight) { + Out(Flow.None, ")", Flow.Break); + } + } + return node; + } + + protected internal override Expression VisitParameter(ParameterExpression node) { + // Have '$' for the DebugView of ParameterExpressions + Out("$"); + if (String.IsNullOrEmpty(node.Name)) { + // If no name if provided, generate a name as $var1, $var2. + // No guarantee for not having name conflicts with user provided variable names. + // + int id = GetParamId(node); + Out("var" + id); + } else { + Out(GetDisplayName(node.Name)); + } + return node; + } + + protected internal override Expression VisitLambda(Expression node) { + Out( + String.Format(CultureInfo.CurrentCulture, + "{0} {1}<{2}>", + ".Lambda", + GetLambdaName(node), + node.Type.ToString() + ) + ); + + if (_lambdas == null) { + _lambdas = new Queue(); + } + + // N^2 performance, for keeping the order of the lambdas. + if (!_lambdas.Contains(node)) { + _lambdas.Enqueue(node); + } + + return node; + } + + private static bool IsSimpleExpression(Expression node) { + var binary = node as BinaryExpression; + if (binary != null) { + return !(binary.Left is BinaryExpression || binary.Right is BinaryExpression); + } + + return false; + } + + protected internal override Expression VisitConditional(ConditionalExpression node) { + if (IsSimpleExpression(node.Test)) { + Out(".If ("); + Visit(node.Test); + Out(") {", Flow.NewLine); + } else { + Out(".If (", Flow.NewLine); + Indent(); + Visit(node.Test); + Dedent(); + Out(Flow.NewLine, ") {", Flow.NewLine); + } + Indent(); + Visit(node.IfTrue); + Dedent(); + Out(Flow.NewLine, "} .Else {", Flow.NewLine); + Indent(); + Visit(node.IfFalse); + Dedent(); + Out(Flow.NewLine, "}"); + return node; + } + + protected internal override Expression VisitConstant(ConstantExpression node) { + object value = node.Value; + + if (value == null) { + Out("null"); + } else if ((value is string) && node.Type == typeof(string)) { + Out(String.Format( + CultureInfo.CurrentCulture, + "\"{0}\"", + value)); + } else if ((value is char) && node.Type == typeof(char)) { + Out(String.Format( + CultureInfo.CurrentCulture, + "'{0}'", + value)); + } else if ((value is int) && node.Type == typeof(int) + || (value is bool) && node.Type == typeof(bool)) { + Out(value.ToString()); + } else { + string suffix = GetConstantValueSuffix(node.Type); + if (suffix != null) { + Out(value.ToString()); + Out(suffix); + } else { + Out(String.Format( + CultureInfo.CurrentCulture, + ".Constant<{0}>({1})", + node.Type.ToString(), + value)); + } + } + return node; + } + + private static string GetConstantValueSuffix(Type type) { + if (type == typeof(UInt32)) { + return "U"; + } + if (type == typeof(Int64)) { + return "L"; + } + if (type == typeof(UInt64)) { + return "UL"; + } + if (type == typeof(Double)) { + return "D"; + } + if (type == typeof(Single)) { + return "F"; + } + if (type == typeof(Decimal)) { + return "M"; + } + return null; + } + + protected internal override Expression VisitRuntimeVariables(RuntimeVariablesExpression node) { + Out(".RuntimeVariables"); + VisitExpressions('(', node.Variables); + return node; + } + + // Prints ".instanceField" or "declaringType.staticField" + private void OutMember(Expression node, Expression instance, MemberInfo member) { + if (instance != null) { + ParenthesizedVisit(node, instance); + Out("." + member.Name); + } else { + // For static members, include the type name + Out(member.DeclaringType.ToString() + "." + member.Name); + } + } + + protected internal override Expression VisitMember(MemberExpression node) { + OutMember(node, node.Expression, node.Member); + return node; + } + + protected internal override Expression VisitInvocation(InvocationExpression node) { + Out(".Invoke "); + ParenthesizedVisit(node, node.Expression); + VisitExpressions('(', node.Arguments); + return node; + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private static bool NeedsParentheses(Expression parent, Expression child) { + Debug.Assert(parent != null); + if (child == null) { + return false; + } + + // Some nodes always have parentheses because of how they are + // displayed, for example: ".Unbox(obj.Foo)" + switch (parent.NodeType) { + case ExpressionType.Increment: + case ExpressionType.Decrement: + case ExpressionType.IsTrue: + case ExpressionType.IsFalse: + case ExpressionType.Unbox: + return true; + } + + int childOpPrec = GetOperatorPrecedence(child); + int parentOpPrec = GetOperatorPrecedence(parent); + + if (childOpPrec == parentOpPrec) { + // When parent op and child op has the same precedence, + // we want to be a little conservative to have more clarity. + // Parentheses are not needed if + // 1) Both ops are &&, ||, &, |, or ^, all of them are the only + // op that has the precedence. + // 2) Parent op is + or *, e.g. x + (y - z) can be simplified to + // x + y - z. + // 3) Parent op is -, / or %, and the child is the left operand. + // In this case, if left and right operand are the same, we don't + // remove parenthesis, e.g. (x + y) - (x + y) + // + switch (parent.NodeType) { + case ExpressionType.AndAlso: + case ExpressionType.OrElse: + case ExpressionType.And: + case ExpressionType.Or: + case ExpressionType.ExclusiveOr: + // Since these ops are the only ones on their precedence, + // the child op must be the same. + Debug.Assert(child.NodeType == parent.NodeType); + // We remove the parenthesis, e.g. x && y && z + return false; + case ExpressionType.Add: + case ExpressionType.AddChecked: + case ExpressionType.Multiply: + case ExpressionType.MultiplyChecked: + return false; + case ExpressionType.Subtract: + case ExpressionType.SubtractChecked: + case ExpressionType.Divide: + case ExpressionType.Modulo: + BinaryExpression binary = parent as BinaryExpression; + Debug.Assert(binary != null); + // Need to have parenthesis for the right operand. + return child == binary.Right; + } + return true; + } + + // Special case: negate of a constant needs parentheses, to + // disambiguate it from a negative constant. + if (child != null && child.NodeType == ExpressionType.Constant && + (parent.NodeType == ExpressionType.Negate || parent.NodeType == ExpressionType.NegateChecked)) { + return true; + } + + // If the parent op has higher precedence, need parentheses for the child. + return childOpPrec < parentOpPrec; + } + + // the greater the higher + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private static int GetOperatorPrecedence(Expression node) { + + // Roughly matches C# operator precedence, with some additional + // operators. Also things which are not binary/unary expressions, + // such as conditional and type testing, don't use this mechanism. + switch (node.NodeType) { + // Assignment + case ExpressionType.Assign: + case ExpressionType.ExclusiveOrAssign: + case ExpressionType.AddAssign: + case ExpressionType.AddAssignChecked: + case ExpressionType.SubtractAssign: + case ExpressionType.SubtractAssignChecked: + case ExpressionType.DivideAssign: + case ExpressionType.ModuloAssign: + case ExpressionType.MultiplyAssign: + case ExpressionType.MultiplyAssignChecked: + case ExpressionType.LeftShiftAssign: + case ExpressionType.RightShiftAssign: + case ExpressionType.AndAssign: + case ExpressionType.OrAssign: + case ExpressionType.PowerAssign: + case ExpressionType.Coalesce: + return 1; + + // Conditional (?:) would go here + + // Conditional OR + case ExpressionType.OrElse: + return 2; + + // Conditional AND + case ExpressionType.AndAlso: + return 3; + + // Logical OR + case ExpressionType.Or: + return 4; + + // Logical XOR + case ExpressionType.ExclusiveOr: + return 5; + + // Logical AND + case ExpressionType.And: + return 6; + + // Equality + case ExpressionType.Equal: + case ExpressionType.NotEqual: + return 7; + + // Relational, type testing + case ExpressionType.GreaterThan: + case ExpressionType.LessThan: + case ExpressionType.GreaterThanOrEqual: + case ExpressionType.LessThanOrEqual: + case ExpressionType.TypeAs: + case ExpressionType.TypeIs: + case ExpressionType.TypeEqual: + return 8; + + // Shift + case ExpressionType.LeftShift: + case ExpressionType.RightShift: + return 9; + + // Additive + case ExpressionType.Add: + case ExpressionType.AddChecked: + case ExpressionType.Subtract: + case ExpressionType.SubtractChecked: + return 10; + + // Multiplicative + case ExpressionType.Divide: + case ExpressionType.Modulo: + case ExpressionType.Multiply: + case ExpressionType.MultiplyChecked: + return 11; + + // Unary + case ExpressionType.Negate: + case ExpressionType.NegateChecked: + case ExpressionType.UnaryPlus: + case ExpressionType.Not: + case ExpressionType.Convert: + case ExpressionType.ConvertChecked: + case ExpressionType.PreIncrementAssign: + case ExpressionType.PreDecrementAssign: + case ExpressionType.OnesComplement: + case ExpressionType.Increment: + case ExpressionType.Decrement: + case ExpressionType.IsTrue: + case ExpressionType.IsFalse: + case ExpressionType.Unbox: + case ExpressionType.Throw: + return 12; + + // Power, which is not in C# + // But VB/Python/Ruby put it here, above unary. + case ExpressionType.Power: + return 13; + + // Primary, which includes all other node types: + // member access, calls, indexing, new. + case ExpressionType.PostIncrementAssign: + case ExpressionType.PostDecrementAssign: + default: + return 14; + + // These aren't expressions, so never need parentheses: + // constants, variables + case ExpressionType.Constant: + case ExpressionType.Parameter: + return 15; + } + } + + private void ParenthesizedVisit(Expression parent, Expression nodeToVisit) { + if (NeedsParentheses(parent, nodeToVisit)) { + Out("("); + Visit(nodeToVisit); + Out(")"); + } else { + Visit(nodeToVisit); + } + } + + protected internal override Expression VisitMethodCall(MethodCallExpression node) { + Out(".Call "); + if (node.Object != null) { + ParenthesizedVisit(node, node.Object); + } else if (node.Method.DeclaringType != null) { + Out(node.Method.DeclaringType.ToString()); + } else { + Out(""); + } + Out("."); + Out(node.Method.Name); + VisitExpressions('(', node.Arguments); + return node; + } + + protected internal override Expression VisitNewArray(NewArrayExpression node) { + if (node.NodeType == ExpressionType.NewArrayBounds) { + // .NewArray MyType[expr1, expr2] + Out(".NewArray " + node.Type.GetElementType().ToString()); + VisitExpressions('[', node.Expressions); + } else { + // .NewArray MyType {expr1, expr2} + Out(".NewArray " + node.Type.ToString(), Flow.Space); + VisitExpressions('{', node.Expressions); + } + return node; + } + + protected internal override Expression VisitNew(NewExpression node) { + Out(".New " + node.Type.ToString()); + VisitExpressions('(', node.Arguments); + return node; + } + + protected override ElementInit VisitElementInit(ElementInit node) { + if (node.Arguments.Count == 1) { + Visit(node.Arguments[0]); + } else { + VisitExpressions('{', node.Arguments); + } + return node; + } + + protected internal override Expression VisitListInit(ListInitExpression node) { + Visit(node.NewExpression); + VisitExpressions('{', ',', node.Initializers, e => VisitElementInit(e)); + return node; + } + + protected override MemberAssignment VisitMemberAssignment(MemberAssignment assignment) { + Out(assignment.Member.Name); + Out(Flow.Space, "=", Flow.Space); + Visit(assignment.Expression); + return assignment; + } + + protected override MemberListBinding VisitMemberListBinding(MemberListBinding binding) { + Out(binding.Member.Name); + Out(Flow.Space, "=", Flow.Space); + VisitExpressions('{', ',', binding.Initializers, e => VisitElementInit(e)); + return binding; + } + + protected override MemberMemberBinding VisitMemberMemberBinding(MemberMemberBinding binding) { + Out(binding.Member.Name); + Out(Flow.Space, "=", Flow.Space); + VisitExpressions('{', ',', binding.Bindings, e => VisitMemberBinding(e)); + return binding; + } + + protected internal override Expression VisitMemberInit(MemberInitExpression node) { + Visit(node.NewExpression); + VisitExpressions('{', ',', node.Bindings, e => VisitMemberBinding(e)); + return node; + } + + protected internal override Expression VisitTypeBinary(TypeBinaryExpression node) { + ParenthesizedVisit(node, node.Expression); + switch (node.NodeType) { + case ExpressionType.TypeIs: + Out(Flow.Space, ".Is", Flow.Space); + break; + case ExpressionType.TypeEqual: + Out(Flow.Space, ".TypeEqual", Flow.Space); + break; + } + Out(node.TypeOperand.ToString()); + return node; + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + protected internal override Expression VisitUnary(UnaryExpression node) { + bool parenthesize = NeedsParentheses(node, node.Operand); + + switch (node.NodeType) { + case ExpressionType.Convert: + Out("(" + node.Type.ToString() + ")"); + break; + case ExpressionType.ConvertChecked: + Out("#(" + node.Type.ToString() + ")"); + break; + case ExpressionType.TypeAs: + break; + case ExpressionType.Not: + Out(node.Type == typeof(bool) ? "!" : "~"); + break; + case ExpressionType.OnesComplement: + Out("~"); + break; + case ExpressionType.Negate: + Out("-"); + break; + case ExpressionType.NegateChecked: + Out("#-"); + break; + case ExpressionType.UnaryPlus: + Out("+"); + break; + case ExpressionType.ArrayLength: + break; + case ExpressionType.Quote: + Out("'"); + break; + case ExpressionType.Throw: + if (node.Operand == null) { + Out(".Rethrow"); + } else { + Out(".Throw", Flow.Space); + } + break; + case ExpressionType.IsFalse: + Out(".IsFalse"); + break; + case ExpressionType.IsTrue: + Out(".IsTrue"); + break; + case ExpressionType.Decrement: + Out(".Decrement"); + break; + case ExpressionType.Increment: + Out(".Increment"); + break; + case ExpressionType.PreDecrementAssign: + Out("--"); + break; + case ExpressionType.PreIncrementAssign: + Out("++"); + break; + case ExpressionType.Unbox: + Out(".Unbox"); + break; + } + + ParenthesizedVisit(node, node.Operand); + + switch (node.NodeType) { + case ExpressionType.TypeAs: + Out(Flow.Space, ".As", Flow.Space | Flow.Break); + Out(node.Type.ToString()); + break; + + case ExpressionType.ArrayLength: + Out(".Length"); + break; + + case ExpressionType.PostDecrementAssign: + Out("--"); + break; + + case ExpressionType.PostIncrementAssign: + Out("++"); + break; + } + return node; + } + + protected internal override Expression VisitBlock(BlockExpression node) { + Out(".Block"); + + // Display if the type of the BlockExpression is different from the + // last expression's type in the block. + if (node.Type != node.GetExpression(node.ExpressionCount - 1).Type) { + Out(String.Format(CultureInfo.CurrentCulture, "<{0}>", node.Type.ToString())); + } + + VisitDeclarations(node.Variables); + Out(" "); + // Use ; to separate expressions in the block + VisitExpressions('{', ';', node.Expressions); + + return node; + } + + protected internal override Expression VisitDefault(DefaultExpression node) { + Out(".Default(" + node.Type.ToString() + ")"); + return node; + } + + protected internal override Expression VisitLabel(LabelExpression node) { + Out(".Label", Flow.NewLine); + Indent(); + Visit(node.DefaultValue); + Dedent(); + NewLine(); + DumpLabel(node.Target); + return node; + } + + protected internal override Expression VisitGoto(GotoExpression node) { + Out("." + node.Kind.ToString(), Flow.Space); + Out(GetLabelTargetName(node.Target), Flow.Space); + Out("{", Flow.Space); + Visit(node.Value); + Out(Flow.Space, "}"); + return node; + } + + protected internal override Expression VisitLoop(LoopExpression node) { + Out(".Loop", Flow.Space); + if (node.ContinueLabel != null) { + DumpLabel(node.ContinueLabel); + } + Out(" {", Flow.NewLine); + Indent(); + Visit(node.Body); + Dedent(); + Out(Flow.NewLine, "}"); + if (node.BreakLabel != null) { + Out("", Flow.NewLine); + DumpLabel(node.BreakLabel); + } + return node; + } + + protected override SwitchCase VisitSwitchCase(SwitchCase node) { + foreach (var test in node.TestValues) { + Out(".Case ("); + Visit(test); + Out("):", Flow.NewLine); + } + Indent(); Indent(); + Visit(node.Body); + Dedent(); Dedent(); + NewLine(); + return node; + } + + protected internal override Expression VisitSwitch(SwitchExpression node) { + Out(".Switch "); + Out("("); + Visit(node.SwitchValue); + Out(") {", Flow.NewLine); + Visit(node.Cases, VisitSwitchCase); + if (node.DefaultBody != null) { + Out(".Default:", Flow.NewLine); + Indent(); Indent(); + Visit(node.DefaultBody); + Dedent(); Dedent(); + NewLine(); + } + Out("}"); + return node; + } + + protected override CatchBlock VisitCatchBlock(CatchBlock node) { + Out(Flow.NewLine, "} .Catch (" + node.Test.ToString()); + if (node.Variable != null) { + Out(Flow.Space, ""); + VisitParameter(node.Variable); + } + if (node.Filter != null) { + Out(") .If (", Flow.Break); + Visit(node.Filter); + } + Out(") {", Flow.NewLine); + Indent(); + Visit(node.Body); + Dedent(); + return node; + } + + protected internal override Expression VisitTry(TryExpression node) { + Out(".Try {", Flow.NewLine); + Indent(); + Visit(node.Body); + Dedent(); + Visit(node.Handlers, VisitCatchBlock); + if (node.Finally != null) { + Out(Flow.NewLine, "} .Finally {", Flow.NewLine); + Indent(); + Visit(node.Finally); + Dedent(); + } else if (node.Fault != null) { + Out(Flow.NewLine, "} .Fault {", Flow.NewLine); + Indent(); + Visit(node.Fault); + Dedent(); + } + + Out(Flow.NewLine, "}"); + return node; + } + + protected internal override Expression VisitIndex(IndexExpression node) { + if (node.Indexer != null) { + OutMember(node, node.Object, node.Indexer); + } else { + ParenthesizedVisit(node, node.Object); + } + + VisitExpressions('[', node.Arguments); + return node; + } + + protected internal override Expression VisitExtension(Expression node) { + Out(String.Format(CultureInfo.CurrentCulture, ".Extension<{0}>", node.GetType().ToString())); + + if (node.CanReduce) { + Out(Flow.Space, "{", Flow.NewLine); + Indent(); + Visit(node.Reduce()); + Dedent(); + Out(Flow.NewLine, "}"); + } + + return node; + } + + protected internal override Expression VisitDebugInfo(DebugInfoExpression node) { + Out(String.Format( + CultureInfo.CurrentCulture, + ".DebugInfo({0}: {1}, {2} - {3}, {4})", + node.Document.FileName, + node.StartLine, + node.StartColumn, + node.EndLine, + node.EndColumn) + ); + return node; + } + + + private void DumpLabel(LabelTarget target) { + Out(String.Format(CultureInfo.CurrentCulture, ".LabelTarget {0}:", GetLabelTargetName(target))); + } + + private string GetLabelTargetName(LabelTarget target) { + if (string.IsNullOrEmpty(target.Name)) { + // Create the label target name as #Label1, #Label2, etc. + return String.Format(CultureInfo.CurrentCulture, "#Label{0}", GetLabelTargetId(target)); + } else { + return GetDisplayName(target.Name); + } + } + + private void WriteLambda(LambdaExpression lambda) { + Out( + String.Format( + CultureInfo.CurrentCulture, + ".Lambda {0}<{1}>", + GetLambdaName(lambda), + lambda.Type.ToString()) + ); + + VisitDeclarations(lambda.Parameters); + + Out(Flow.Space, "{", Flow.NewLine); + Indent(); + Visit(lambda.Body); + Dedent(); + Out(Flow.NewLine, "}"); + Debug.Assert(_stack.Count == 0); + } + + private string GetLambdaName(LambdaExpression lambda) { + if (String.IsNullOrEmpty(lambda.Name)) { + return "#Lambda" + GetLambdaId(lambda); + } + return GetDisplayName(lambda.Name); + } + + /// + /// Return true if the input string contains any whitespace character. + /// Otherwise false. + /// + private static bool ContainsWhiteSpace(string name) { + foreach (char c in name) { + if (Char.IsWhiteSpace(c)) { + return true; + } + } + return false; + } + + private static string QuoteName(string name) { + return String.Format(CultureInfo.CurrentCulture, "'{0}'", name); + } + + private static string GetDisplayName(string name) { + if (ContainsWhiteSpace(name)) { + // if name has whitespaces in it, quote it + return QuoteName(name); + } else { + return name; + } + } + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DefaultExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DefaultExpression.cs new file mode 100644 index 00000000000..3c3c31fa192 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DefaultExpression.cs @@ -0,0 +1,87 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents the default value of a type or an empty expression. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.DefaultExpressionProxy))] +#endif + public sealed class DefaultExpression : Expression { + private readonly Type _type; + + internal DefaultExpression(Type type) { + _type = type; + } + + /// + /// Gets the static type of the expression that this represents. + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _type; } + } + + /// + /// Returns the node type of this Expression. Extension nodes should return + /// ExpressionType.Extension when overriding this method. + /// + /// The of the expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Default; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitDefault(this); + } + } + + public partial class Expression { + /// + /// Creates an empty expression that has type. + /// + /// + /// A that has the property equal to + /// and the property set to . + /// + public static DefaultExpression Empty() { + return new DefaultExpression(typeof(void)); + } + + /// + /// Creates a that has the property set to the specified type. + /// + /// A to set the property equal to. + /// + /// A that has the property equal to + /// and the property set to the specified type. + /// + public static DefaultExpression Default(Type type) { + if (type == typeof(void)) { + return Empty(); + } + return new DefaultExpression(type); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DynamicExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DynamicExpression.cs new file mode 100644 index 00000000000..1b7127284bf --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/DynamicExpression.cs @@ -0,0 +1,841 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +using System.Linq.Expressions.Compiler; +#else +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions.Compiler; +#endif +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents a dynamic operation. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.DynamicExpressionProxy))] +#endif + public class DynamicExpression : Expression, IArgumentProvider { + private readonly CallSiteBinder _binder; + private readonly Type _delegateType; + + internal DynamicExpression(Type delegateType, CallSiteBinder binder) { + Debug.Assert(delegateType.GetMethod("Invoke").GetReturnType() == typeof(object) || GetType() != typeof(DynamicExpression)); + _delegateType = delegateType; + _binder = binder; + } + + internal static DynamicExpression Make(Type returnType, Type delegateType, CallSiteBinder binder, ReadOnlyCollection arguments) { + if (returnType == typeof(object)) { + return new DynamicExpressionN(delegateType, binder, arguments); + } else { + return new TypedDynamicExpressionN(returnType, delegateType, binder, arguments); + } + } + + internal static DynamicExpression Make(Type returnType, Type delegateType, CallSiteBinder binder, Expression arg0) { + if (returnType == typeof(object)) { + return new DynamicExpression1(delegateType, binder, arg0); + } else { + return new TypedDynamicExpression1(returnType, delegateType, binder, arg0); + } + } + + internal static DynamicExpression Make(Type returnType, Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1) { + if (returnType == typeof(object)) { + return new DynamicExpression2(delegateType, binder, arg0, arg1); + } else { + return new TypedDynamicExpression2(returnType, delegateType, binder, arg0, arg1); + } + } + + internal static DynamicExpression Make(Type returnType, Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1, Expression arg2) { + if (returnType == typeof(object)) { + return new DynamicExpression3(delegateType, binder, arg0, arg1, arg2); + } else { + return new TypedDynamicExpression3(returnType, delegateType, binder, arg0, arg1, arg2); + } + } + + internal static DynamicExpression Make(Type returnType, Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1, Expression arg2, Expression arg3) { + if (returnType == typeof(object)) { + return new DynamicExpression4(delegateType, binder, arg0, arg1, arg2, arg3); + } else { + return new TypedDynamicExpression4(returnType, delegateType, binder, arg0, arg1, arg2, arg3); + } + } + + /// + /// Gets the static type of the expression that this represents. + /// + /// The that represents the static type of the expression. + public override Type Type { + get { return typeof(object); } + } + + /// + /// Returns the node type of this Expression. Extension nodes should return + /// ExpressionType.Extension when overriding this method. + /// + /// The of the expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Dynamic; } + } + + /// + /// Gets the , which determines the runtime behavior of the + /// dynamic site. + /// + public CallSiteBinder Binder { + get { return _binder; } + } + + /// + /// Gets the type of the delegate used by the . + /// + public Type DelegateType { + get { return _delegateType; } + } + + /// + /// Gets the arguments to the dynamic operation. + /// + public ReadOnlyCollection Arguments { + get { return GetOrMakeArguments(); } + } + + internal virtual ReadOnlyCollection GetOrMakeArguments() { + throw ContractUtils.Unreachable; + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitDynamic(this); + } + + /// + /// Makes a copy of this node replacing the args with the provided values. The + /// number of the args needs to match the number of the current block. + /// + /// This helper is provided to allow re-writing of nodes to not depend on the specific optimized + /// subclass of DynamicExpression which is being used. + /// + internal virtual DynamicExpression Rewrite(Expression[] args) { + throw ContractUtils.Unreachable; + } + + #region IArgumentProvider Members + + Expression IArgumentProvider.GetArgument(int index) { + throw ContractUtils.Unreachable; + } + + int IArgumentProvider.ArgumentCount { + get { throw ContractUtils.Unreachable; } + } + + #endregion + } + + #region Specialized Subclasses + + internal class DynamicExpressionN : DynamicExpression, IArgumentProvider { + private IList _arguments; // storage for the original IList or readonly collection. See IArgumentProvider for more info. + + internal DynamicExpressionN(Type delegateType, CallSiteBinder binder, IList arguments) + : base(delegateType, binder) { + _arguments = arguments; + } + + Expression IArgumentProvider.GetArgument(int index) { + return _arguments[index]; + } + + int IArgumentProvider.ArgumentCount { + get { + return _arguments.Count; + } + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(ref _arguments); + } + + internal override DynamicExpression Rewrite(Expression[] args) { + Debug.Assert(args.Length == ((IArgumentProvider)this).ArgumentCount); + + return Expression.MakeDynamic(DelegateType, Binder, args); + } + } + + internal class TypedDynamicExpressionN : DynamicExpressionN { + private readonly Type _returnType; + + internal TypedDynamicExpressionN(Type returnType, Type delegateType, CallSiteBinder binder, IList arguments) + : base(delegateType, binder, arguments) { + Debug.Assert(delegateType.GetMethod("Invoke").GetReturnType() == returnType); + _returnType = returnType; + } + + public sealed override Type Type { + get { return _returnType; } + } + } + + internal class DynamicExpression1 : DynamicExpression, IArgumentProvider { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider for more info. + + internal DynamicExpression1(Type delegateType, CallSiteBinder binder, Expression arg0) + : base(delegateType, binder) { + _arg0 = arg0; + } + + Expression IArgumentProvider.GetArgument(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + default: throw new InvalidOperationException(); + } + } + + int IArgumentProvider.ArgumentCount { + get { + return 1; + } + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(this, ref _arg0); + } + + internal override DynamicExpression Rewrite(Expression[] args) { + Debug.Assert(args.Length == 1); + + return Expression.MakeDynamic(DelegateType, Binder, args[0]); + } + } + + internal sealed class TypedDynamicExpression1 : DynamicExpression1 { + private readonly Type _retType; + + internal TypedDynamicExpression1(Type retType, Type delegateType, CallSiteBinder binder, Expression arg0) + : base(delegateType, binder, arg0) { + _retType = retType; + } + + public sealed override Type Type { + get { return _retType; } + } + } + + internal class DynamicExpression2 : DynamicExpression, IArgumentProvider { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider for more info. + private readonly Expression _arg1; // storage for the 2nd argument + + internal DynamicExpression2(Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1) + : base(delegateType, binder) { + _arg0 = arg0; + _arg1 = arg1; + } + + Expression IArgumentProvider.GetArgument(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + default: throw new InvalidOperationException(); + } + } + + int IArgumentProvider.ArgumentCount { + get { + return 2; + } + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(this, ref _arg0); + } + + internal override DynamicExpression Rewrite(Expression[] args) { + Debug.Assert(args.Length == 2); + + return Expression.MakeDynamic(DelegateType, Binder, args[0], args[1]); + } + } + + internal sealed class TypedDynamicExpression2 : DynamicExpression2 { + private readonly Type _retType; + + internal TypedDynamicExpression2(Type retType, Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1) + : base(delegateType, binder, arg0, arg1) { + _retType = retType; + } + + public sealed override Type Type { + get { return _retType; } + } + } + + internal class DynamicExpression3 : DynamicExpression, IArgumentProvider { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider for more info. + private readonly Expression _arg1, _arg2; // storage for the 2nd & 3rd arguments + + internal DynamicExpression3(Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1, Expression arg2) + : base(delegateType, binder) { + _arg0 = arg0; + _arg1 = arg1; + _arg2 = arg2; + } + + Expression IArgumentProvider.GetArgument(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + case 2: return _arg2; + default: throw new InvalidOperationException(); + } + } + + int IArgumentProvider.ArgumentCount { + get { + return 3; + } + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(this, ref _arg0); + } + + internal override DynamicExpression Rewrite(Expression[] args) { + Debug.Assert(args.Length == 3); + + return Expression.MakeDynamic(DelegateType, Binder, args[0], args[1], args[2]); + } + } + + internal sealed class TypedDynamicExpression3 : DynamicExpression3 { + private readonly Type _retType; + + internal TypedDynamicExpression3(Type retType, Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1, Expression arg2) + : base(delegateType, binder, arg0, arg1, arg2) { + _retType = retType; + } + + public sealed override Type Type { + get { return _retType; } + } + } + + internal class DynamicExpression4 : DynamicExpression, IArgumentProvider { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider for more info. + private readonly Expression _arg1, _arg2, _arg3; // storage for the 2nd - 4th arguments + + internal DynamicExpression4(Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1, Expression arg2, Expression arg3) + : base(delegateType, binder) { + _arg0 = arg0; + _arg1 = arg1; + _arg2 = arg2; + _arg3 = arg3; + } + + Expression IArgumentProvider.GetArgument(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + case 2: return _arg2; + case 3: return _arg3; + default: throw new InvalidOperationException(); + } + } + + int IArgumentProvider.ArgumentCount { + get { + return 4; + } + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(this, ref _arg0); + } + + internal override DynamicExpression Rewrite(Expression[] args) { + Debug.Assert(args.Length == 4); + + return Expression.MakeDynamic(DelegateType, Binder, args[0], args[1], args[2], args[3]); + } + } + + internal sealed class TypedDynamicExpression4 : DynamicExpression4 { + private readonly Type _retType; + + internal TypedDynamicExpression4(Type retType, Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1, Expression arg2, Expression arg3) + : base(delegateType, binder, arg0, arg1, arg2, arg3) { + _retType = retType; + } + + public sealed override Type Type { + get { return _retType; } + } + } + + #endregion + + public partial class Expression { + + /// + /// Creates a that represents a dynamic operation bound by the provided . + /// + /// The type of the delegate used by the . + /// The runtime binder for the dynamic operation. + /// The arguments to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// DelegateType, + /// Binder, and + /// Arguments set to the specified values. + /// + public static DynamicExpression MakeDynamic(Type delegateType, CallSiteBinder binder, params Expression[] arguments) { + return MakeDynamic(delegateType, binder, (IEnumerable)arguments); + } + + /// + /// Creates a that represents a dynamic operation bound by the provided . + /// + /// The type of the delegate used by the . + /// The runtime binder for the dynamic operation. + /// The arguments to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// DelegateType, + /// Binder, and + /// Arguments set to the specified values. + /// + public static DynamicExpression MakeDynamic(Type delegateType, CallSiteBinder binder, IEnumerable arguments) { + ContractUtils.RequiresNotNull(delegateType, "delegateType"); + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.Requires(delegateType.IsSubclassOf(typeof(Delegate)), "delegateType", Strings.TypeMustBeDerivedFromSystemDelegate); + + var method = GetValidMethodForDynamic(delegateType); + + var args = arguments.ToReadOnly(); + ValidateArgumentTypes(method, ExpressionType.Dynamic, ref args); + + return DynamicExpression.Make(method.GetReturnType(), delegateType, binder, args); + } + + /// + /// Creates a that represents a dynamic operation bound by the provided and one argument. + /// + /// The type of the delegate used by the . + /// The runtime binder for the dynamic operation. + /// The argument to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// DelegateType, + /// Binder, and + /// Arguments set to the specified values. + /// + public static DynamicExpression MakeDynamic(Type delegateType, CallSiteBinder binder, Expression arg0) { + ContractUtils.RequiresNotNull(delegateType, "delegatType"); + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.Requires(delegateType.IsSubclassOf(typeof(Delegate)), "delegateType", Strings.TypeMustBeDerivedFromSystemDelegate); + + var method = GetValidMethodForDynamic(delegateType); + var parameters = method.GetParametersCached(); + + ValidateArgumentCount(method, ExpressionType.Dynamic, 2, parameters); + ValidateDynamicArgument(arg0); + ValidateOneArgument(method, ExpressionType.Dynamic, arg0, parameters[1]); + + return DynamicExpression.Make(method.GetReturnType(), delegateType, binder, arg0); + } + + /// + /// Creates a that represents a dynamic operation bound by the provided and two arguments. + /// + /// The type of the delegate used by the . + /// The runtime binder for the dynamic operation. + /// The first argument to the dynamic operation. + /// The second argument to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// DelegateType, + /// Binder, and + /// Arguments set to the specified values. + /// + public static DynamicExpression MakeDynamic(Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1) { + ContractUtils.RequiresNotNull(delegateType, "delegatType"); + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.Requires(delegateType.IsSubclassOf(typeof(Delegate)), "delegateType", Strings.TypeMustBeDerivedFromSystemDelegate); + + var method = GetValidMethodForDynamic(delegateType); + var parameters = method.GetParametersCached(); + + ValidateArgumentCount(method, ExpressionType.Dynamic, 3, parameters); + ValidateDynamicArgument(arg0); + ValidateOneArgument(method, ExpressionType.Dynamic, arg0, parameters[1]); + ValidateDynamicArgument(arg1); + ValidateOneArgument(method, ExpressionType.Dynamic, arg1, parameters[2]); + + return DynamicExpression.Make(method.GetReturnType(), delegateType, binder, arg0, arg1); + } + + /// + /// Creates a that represents a dynamic operation bound by the provided and three arguments. + /// + /// The type of the delegate used by the . + /// The runtime binder for the dynamic operation. + /// The first argument to the dynamic operation. + /// The second argument to the dynamic operation. + /// The third argument to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// DelegateType, + /// Binder, and + /// Arguments set to the specified values. + /// + public static DynamicExpression MakeDynamic(Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1, Expression arg2) { + ContractUtils.RequiresNotNull(delegateType, "delegatType"); + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.Requires(delegateType.IsSubclassOf(typeof(Delegate)), "delegateType", Strings.TypeMustBeDerivedFromSystemDelegate); + + var method = GetValidMethodForDynamic(delegateType); + var parameters = method.GetParametersCached(); + + ValidateArgumentCount(method, ExpressionType.Dynamic, 4, parameters); + ValidateDynamicArgument(arg0); + ValidateOneArgument(method, ExpressionType.Dynamic, arg0, parameters[1]); + ValidateDynamicArgument(arg1); + ValidateOneArgument(method, ExpressionType.Dynamic, arg1, parameters[2]); + ValidateDynamicArgument(arg2); + ValidateOneArgument(method, ExpressionType.Dynamic, arg2, parameters[3]); + + return DynamicExpression.Make(method.GetReturnType(), delegateType, binder, arg0, arg1, arg2); + } + + /// + /// Creates a that represents a dynamic operation bound by the provided and four arguments. + /// + /// The type of the delegate used by the . + /// The runtime binder for the dynamic operation. + /// The first argument to the dynamic operation. + /// The second argument to the dynamic operation. + /// The third argument to the dynamic operation. + /// The fourth argument to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// DelegateType, + /// Binder, and + /// Arguments set to the specified values. + /// + public static DynamicExpression MakeDynamic(Type delegateType, CallSiteBinder binder, Expression arg0, Expression arg1, Expression arg2, Expression arg3) { + ContractUtils.RequiresNotNull(delegateType, "delegatType"); + ContractUtils.RequiresNotNull(binder, "binder"); + ContractUtils.Requires(delegateType.IsSubclassOf(typeof(Delegate)), "delegateType", Strings.TypeMustBeDerivedFromSystemDelegate); + + var method = GetValidMethodForDynamic(delegateType); + var parameters = method.GetParametersCached(); + + ValidateArgumentCount(method, ExpressionType.Dynamic, 5, parameters); + ValidateDynamicArgument(arg0); + ValidateOneArgument(method, ExpressionType.Dynamic, arg0, parameters[1]); + ValidateDynamicArgument(arg1); + ValidateOneArgument(method, ExpressionType.Dynamic, arg1, parameters[2]); + ValidateDynamicArgument(arg2); + ValidateOneArgument(method, ExpressionType.Dynamic, arg2, parameters[3]); + ValidateDynamicArgument(arg3); + ValidateOneArgument(method, ExpressionType.Dynamic, arg3, parameters[4]); + + return DynamicExpression.Make(method.GetReturnType(), delegateType, binder, arg0, arg1, arg2, arg3); + } + + private static MethodInfo GetValidMethodForDynamic(Type delegateType) { + var method = delegateType.GetMethod("Invoke"); + var pi = method.GetParametersCached(); + ContractUtils.Requires(pi.Length > 0 && pi[0].ParameterType == typeof(CallSite), "delegateType", Strings.FirstArgumentMustBeCallSite); + return method; + } + + /// + /// Creates a that represents a dynamic operation bound by the provided . + /// + /// The runtime binder for the dynamic operation. + /// The result type of the dynamic expression. + /// The arguments to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// Binder and + /// Arguments set to the specified values. + /// + /// + /// The DelegateType property of the + /// result will be inferred from the types of the arguments and the specified return type. + /// + public static DynamicExpression Dynamic(CallSiteBinder binder, Type returnType, params Expression[] arguments) { + return Dynamic(binder, returnType, (IEnumerable)arguments); + } + + /// + /// Creates a that represents a dynamic operation bound by the provided . + /// + /// The runtime binder for the dynamic operation. + /// The result type of the dynamic expression. + /// The first argument to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// Binder and + /// Arguments set to the specified values. + /// + /// + /// The DelegateType property of the + /// result will be inferred from the types of the arguments and the specified return type. + /// + public static DynamicExpression Dynamic(CallSiteBinder binder, Type returnType, Expression arg0) { + ContractUtils.RequiresNotNull(binder, "binder"); + ValidateDynamicArgument(arg0); + + DelegateHelpers.TypeInfo info = DelegateHelpers.GetNextTypeInfo( + returnType, + DelegateHelpers.GetNextTypeInfo( + arg0.Type, + DelegateHelpers.NextTypeInfo(typeof(CallSite)) + ) + ); + + Type delegateType = info.DelegateType; + if (delegateType == null) { + delegateType = info.MakeDelegateType(returnType, arg0); + } + + return DynamicExpression.Make(returnType, delegateType, binder, arg0); + } + + /// + /// Creates a that represents a dynamic operation bound by the provided . + /// + /// The runtime binder for the dynamic operation. + /// The result type of the dynamic expression. + /// The first argument to the dynamic operation. + /// The second argument to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// Binder and + /// Arguments set to the specified values. + /// + /// + /// The DelegateType property of the + /// result will be inferred from the types of the arguments and the specified return type. + /// + public static DynamicExpression Dynamic(CallSiteBinder binder, Type returnType, Expression arg0, Expression arg1) { + ContractUtils.RequiresNotNull(binder, "binder"); + ValidateDynamicArgument(arg0); + ValidateDynamicArgument(arg1); + + DelegateHelpers.TypeInfo info = DelegateHelpers.GetNextTypeInfo( + returnType, + DelegateHelpers.GetNextTypeInfo( + arg1.Type, + DelegateHelpers.GetNextTypeInfo( + arg0.Type, + DelegateHelpers.NextTypeInfo(typeof(CallSite)) + ) + ) + ); + + Type delegateType = info.DelegateType; + if (delegateType == null) { + delegateType = info.MakeDelegateType(returnType, arg0, arg1); + } + + return DynamicExpression.Make(returnType, delegateType, binder, arg0, arg1); + } + + /// + /// Creates a that represents a dynamic operation bound by the provided . + /// + /// The runtime binder for the dynamic operation. + /// The result type of the dynamic expression. + /// The first argument to the dynamic operation. + /// The second argument to the dynamic operation. + /// The third argument to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// Binder and + /// Arguments set to the specified values. + /// + /// + /// The DelegateType property of the + /// result will be inferred from the types of the arguments and the specified return type. + /// + public static DynamicExpression Dynamic(CallSiteBinder binder, Type returnType, Expression arg0, Expression arg1, Expression arg2) { + ContractUtils.RequiresNotNull(binder, "binder"); + ValidateDynamicArgument(arg0); + ValidateDynamicArgument(arg1); + ValidateDynamicArgument(arg2); + + DelegateHelpers.TypeInfo info = DelegateHelpers.GetNextTypeInfo( + returnType, + DelegateHelpers.GetNextTypeInfo( + arg2.Type, + DelegateHelpers.GetNextTypeInfo( + arg1.Type, + DelegateHelpers.GetNextTypeInfo( + arg0.Type, + DelegateHelpers.NextTypeInfo(typeof(CallSite)) + ) + ) + ) + ); + + Type delegateType = info.DelegateType; + if (delegateType == null) { + delegateType = info.MakeDelegateType(returnType, arg0, arg1, arg2); + } + + return DynamicExpression.Make(returnType, delegateType, binder, arg0, arg1, arg2); + } + + /// + /// Creates a that represents a dynamic operation bound by the provided . + /// + /// The runtime binder for the dynamic operation. + /// The result type of the dynamic expression. + /// The first argument to the dynamic operation. + /// The second argument to the dynamic operation. + /// The third argument to the dynamic operation. + /// The fourth argument to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// Binder and + /// Arguments set to the specified values. + /// + /// + /// The DelegateType property of the + /// result will be inferred from the types of the arguments and the specified return type. + /// + public static DynamicExpression Dynamic(CallSiteBinder binder, Type returnType, Expression arg0, Expression arg1, Expression arg2, Expression arg3) { + ContractUtils.RequiresNotNull(binder, "binder"); + ValidateDynamicArgument(arg0); + ValidateDynamicArgument(arg1); + ValidateDynamicArgument(arg2); + ValidateDynamicArgument(arg3); + + DelegateHelpers.TypeInfo info = DelegateHelpers.GetNextTypeInfo( + returnType, + DelegateHelpers.GetNextTypeInfo( + arg3.Type, + DelegateHelpers.GetNextTypeInfo( + arg2.Type, + DelegateHelpers.GetNextTypeInfo( + arg1.Type, + DelegateHelpers.GetNextTypeInfo( + arg0.Type, + DelegateHelpers.NextTypeInfo(typeof(CallSite)) + ) + ) + ) + ) + ); + + Type delegateType = info.DelegateType; + if (delegateType == null) { + delegateType = info.MakeDelegateType(returnType, arg0, arg1, arg2, arg3); + } + + return DynamicExpression.Make(returnType, delegateType, binder, arg0, arg1, arg2, arg3); + } + + /// + /// Creates a that represents a dynamic operation bound by the provided . + /// + /// The runtime binder for the dynamic operation. + /// The result type of the dynamic expression. + /// The arguments to the dynamic operation. + /// + /// A that has equal to + /// Dynamic and has the + /// Binder and + /// Arguments set to the specified values. + /// + /// + /// The DelegateType property of the + /// result will be inferred from the types of the arguments and the specified return type. + /// + public static DynamicExpression Dynamic(CallSiteBinder binder, Type returnType, IEnumerable arguments) { + ContractUtils.RequiresNotNull(arguments, "arguments"); + ContractUtils.RequiresNotNull(returnType, "returnType"); + + var args = arguments.ToReadOnly(); + ContractUtils.RequiresNotEmpty(args, "args"); + return MakeDynamic(binder, returnType, args); + } + + private static DynamicExpression MakeDynamic(CallSiteBinder binder, Type returnType, ReadOnlyCollection args) { + ContractUtils.RequiresNotNull(binder, "binder"); + + for (int i = 0; i < args.Count; i++) { + Expression arg = args[i]; + + ValidateDynamicArgument(arg); + } + + Type delegateType = DelegateHelpers.MakeCallSiteDelegate(args, returnType); + + // Since we made a delegate with argument types that exactly match, + // we can skip delegate and argument validation + + switch (args.Count) { + case 1: return DynamicExpression.Make(returnType, delegateType, binder, args[0]); + case 2: return DynamicExpression.Make(returnType, delegateType, binder, args[0], args[1]); + case 3: return DynamicExpression.Make(returnType, delegateType, binder, args[0], args[1], args[2]); + case 4: return DynamicExpression.Make(returnType, delegateType, binder, args[0], args[1], args[2], args[3]); + default: return DynamicExpression.Make(returnType, delegateType, binder, args); + } + } + + private static void ValidateDynamicArgument(Expression arg) { + RequiresCanRead(arg, "arguments"); + var type = arg.Type; + ContractUtils.RequiresNotNull(type, "type"); + TypeUtils.ValidateType(type); + ContractUtils.Requires(type != typeof(void), Strings.ArgumentTypeCannotBeVoid); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ElementInit.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ElementInit.cs new file mode 100644 index 00000000000..b4795931fef --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ElementInit.cs @@ -0,0 +1,129 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ + +#if CODEPLEX_40 +using System; +#else +using System; using Microsoft; +#endif +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Reflection; +using System.Text; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents the initialization of a list. + /// + public sealed class ElementInit : IArgumentProvider { + private MethodInfo _addMethod; + private ReadOnlyCollection _arguments; + + internal ElementInit(MethodInfo addMethod, ReadOnlyCollection arguments) { + _addMethod = addMethod; + _arguments = arguments; + } + /// + /// Gets the used to add elements to the object. + /// + public MethodInfo AddMethod { + get { return _addMethod; } + } + + /// + /// Gets the list of elements to be added to the object. + /// + public ReadOnlyCollection Arguments { + get { return _arguments; } + } + + Expression IArgumentProvider.GetArgument(int index) { + return _arguments[index]; + } + + int IArgumentProvider.ArgumentCount { + get { + return _arguments.Count; + } + } + + /// + /// Creates a representation of the node. + /// + /// A representation of the node. + public override string ToString() { + return ExpressionStringBuilder.ElementInitBindingToString(this); + } + } + + + public partial class Expression { + /// + /// Creates an ElementInit expression that represents the initialization of a list. + /// + /// The for the list's Add method. + /// An array containing the Expressions to be used to initialize the list. + /// The created ElementInit expression. + public static ElementInit ElementInit(MethodInfo addMethod, params Expression[] arguments) { + return ElementInit(addMethod, arguments as IEnumerable); + } + + /// + /// Creates an ElementInit expression that represents the initialization of a list. + /// + /// The for the list's Add method. + /// An containing elements to initialize the list. + /// The created ElementInit expression. + public static ElementInit ElementInit(MethodInfo addMethod, IEnumerable arguments) { + ContractUtils.RequiresNotNull(addMethod, "addMethod"); + ContractUtils.RequiresNotNull(arguments, "arguments"); + + var argumentsRO = arguments.ToReadOnly(); + + RequiresCanRead(argumentsRO, "arguments"); + ValidateElementInitAddMethodInfo(addMethod); + ValidateArgumentTypes(addMethod, ExpressionType.Call, ref argumentsRO); + return new ElementInit(addMethod, argumentsRO); + } + + private static void ValidateElementInitAddMethodInfo(MethodInfo addMethod) { + ValidateMethodInfo(addMethod); + ParameterInfo[] pis = addMethod.GetParametersCached(); + if (pis.Length == 0) { + throw Error.ElementInitializerMethodWithZeroArgs(); + } + if (!addMethod.Name.Equals("Add", StringComparison.OrdinalIgnoreCase)) { + throw Error.ElementInitializerMethodNotAdd(); + } + if (addMethod.IsStatic) { + throw Error.ElementInitializerMethodStatic(); + } + foreach (ParameterInfo pi in pis) { + if (pi.ParameterType.IsByRef) { + throw Error.ElementInitializerMethodNoRefOutParam(pi.Name, addMethod.Name); + } + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/Expression.DebuggerProxy.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/Expression.DebuggerProxy.cs new file mode 100644 index 00000000000..335eaf728c1 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/Expression.DebuggerProxy.cs @@ -0,0 +1,462 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.ObjectModel; +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif +#if !SILVERLIGHT + public partial class Expression { + #region Generated Expression Debugger Proxies + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_debug_proxies from: generate_tree.py + + internal class BinaryExpressionProxy { + private readonly BinaryExpression _node; + + public BinaryExpressionProxy(BinaryExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public LambdaExpression Conversion { get { return _node.Conversion; } } + public String DebugView { get { return _node.DebugView; } } + public Boolean IsLifted { get { return _node.IsLifted; } } + public Boolean IsLiftedToNull { get { return _node.IsLiftedToNull; } } + public Expression Left { get { return _node.Left; } } + public MethodInfo Method { get { return _node.Method; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Expression Right { get { return _node.Right; } } + public Type Type { get { return _node.Type; } } + } + + internal class BlockExpressionProxy { + private readonly BlockExpression _node; + + public BlockExpressionProxy(BlockExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public ReadOnlyCollection Expressions { get { return _node.Expressions; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Expression Result { get { return _node.Result; } } + public Type Type { get { return _node.Type; } } + public ReadOnlyCollection Variables { get { return _node.Variables; } } + } + + internal class CatchBlockProxy { + private readonly CatchBlock _node; + + public CatchBlockProxy(CatchBlock node) { + _node = node; + } + + public Expression Body { get { return _node.Body; } } + public Expression Filter { get { return _node.Filter; } } + public Type Test { get { return _node.Test; } } + public ParameterExpression Variable { get { return _node.Variable; } } + } + + internal class ConditionalExpressionProxy { + private readonly ConditionalExpression _node; + + public ConditionalExpressionProxy(ConditionalExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public Expression IfFalse { get { return _node.IfFalse; } } + public Expression IfTrue { get { return _node.IfTrue; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Expression Test { get { return _node.Test; } } + public Type Type { get { return _node.Type; } } + } + + internal class ConstantExpressionProxy { + private readonly ConstantExpression _node; + + public ConstantExpressionProxy(ConstantExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + public Object Value { get { return _node.Value; } } + } + + internal class DebugInfoExpressionProxy { + private readonly DebugInfoExpression _node; + + public DebugInfoExpressionProxy(DebugInfoExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public SymbolDocumentInfo Document { get { return _node.Document; } } + public Int32 EndColumn { get { return _node.EndColumn; } } + public Int32 EndLine { get { return _node.EndLine; } } + public Boolean IsClear { get { return _node.IsClear; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Int32 StartColumn { get { return _node.StartColumn; } } + public Int32 StartLine { get { return _node.StartLine; } } + public Type Type { get { return _node.Type; } } + } + + internal class DefaultExpressionProxy { + private readonly DefaultExpression _node; + + public DefaultExpressionProxy(DefaultExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + } + + internal class DynamicExpressionProxy { + private readonly DynamicExpression _node; + + public DynamicExpressionProxy(DynamicExpression node) { + _node = node; + } + + public ReadOnlyCollection Arguments { get { return _node.Arguments; } } + public CallSiteBinder Binder { get { return _node.Binder; } } + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public Type DelegateType { get { return _node.DelegateType; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + } + + internal class GotoExpressionProxy { + private readonly GotoExpression _node; + + public GotoExpressionProxy(GotoExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public GotoExpressionKind Kind { get { return _node.Kind; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public LabelTarget Target { get { return _node.Target; } } + public Type Type { get { return _node.Type; } } + public Expression Value { get { return _node.Value; } } + } + + internal class IndexExpressionProxy { + private readonly IndexExpression _node; + + public IndexExpressionProxy(IndexExpression node) { + _node = node; + } + + public ReadOnlyCollection Arguments { get { return _node.Arguments; } } + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public PropertyInfo Indexer { get { return _node.Indexer; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Expression Object { get { return _node.Object; } } + public Type Type { get { return _node.Type; } } + } + + internal class InvocationExpressionProxy { + private readonly InvocationExpression _node; + + public InvocationExpressionProxy(InvocationExpression node) { + _node = node; + } + + public ReadOnlyCollection Arguments { get { return _node.Arguments; } } + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public Expression Expression { get { return _node.Expression; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + } + + internal class LabelExpressionProxy { + private readonly LabelExpression _node; + + public LabelExpressionProxy(LabelExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public Expression DefaultValue { get { return _node.DefaultValue; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public LabelTarget Target { get { return _node.Target; } } + public Type Type { get { return _node.Type; } } + } + + internal class LambdaExpressionProxy { + private readonly LambdaExpression _node; + + public LambdaExpressionProxy(LambdaExpression node) { + _node = node; + } + + public Expression Body { get { return _node.Body; } } + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public String Name { get { return _node.Name; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public ReadOnlyCollection Parameters { get { return _node.Parameters; } } + public Type ReturnType { get { return _node.ReturnType; } } + public Boolean TailCall { get { return _node.TailCall; } } + public Type Type { get { return _node.Type; } } + } + + internal class ListInitExpressionProxy { + private readonly ListInitExpression _node; + + public ListInitExpressionProxy(ListInitExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public ReadOnlyCollection Initializers { get { return _node.Initializers; } } + public NewExpression NewExpression { get { return _node.NewExpression; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + } + + internal class LoopExpressionProxy { + private readonly LoopExpression _node; + + public LoopExpressionProxy(LoopExpression node) { + _node = node; + } + + public Expression Body { get { return _node.Body; } } + public LabelTarget BreakLabel { get { return _node.BreakLabel; } } + public Boolean CanReduce { get { return _node.CanReduce; } } + public LabelTarget ContinueLabel { get { return _node.ContinueLabel; } } + public String DebugView { get { return _node.DebugView; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + } + + internal class MemberExpressionProxy { + private readonly MemberExpression _node; + + public MemberExpressionProxy(MemberExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public Expression Expression { get { return _node.Expression; } } + public MemberInfo Member { get { return _node.Member; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + } + + internal class MemberInitExpressionProxy { + private readonly MemberInitExpression _node; + + public MemberInitExpressionProxy(MemberInitExpression node) { + _node = node; + } + + public ReadOnlyCollection Bindings { get { return _node.Bindings; } } + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public NewExpression NewExpression { get { return _node.NewExpression; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + } + + internal class MethodCallExpressionProxy { + private readonly MethodCallExpression _node; + + public MethodCallExpressionProxy(MethodCallExpression node) { + _node = node; + } + + public ReadOnlyCollection Arguments { get { return _node.Arguments; } } + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public MethodInfo Method { get { return _node.Method; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Expression Object { get { return _node.Object; } } + public Type Type { get { return _node.Type; } } + } + + internal class NewArrayExpressionProxy { + private readonly NewArrayExpression _node; + + public NewArrayExpressionProxy(NewArrayExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public ReadOnlyCollection Expressions { get { return _node.Expressions; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + } + + internal class NewExpressionProxy { + private readonly NewExpression _node; + + public NewExpressionProxy(NewExpression node) { + _node = node; + } + + public ReadOnlyCollection Arguments { get { return _node.Arguments; } } + public Boolean CanReduce { get { return _node.CanReduce; } } + public ConstructorInfo Constructor { get { return _node.Constructor; } } + public String DebugView { get { return _node.DebugView; } } + public ReadOnlyCollection Members { get { return _node.Members; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + } + + internal class ParameterExpressionProxy { + private readonly ParameterExpression _node; + + public ParameterExpressionProxy(ParameterExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public Boolean IsByRef { get { return _node.IsByRef; } } + public String Name { get { return _node.Name; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + } + + internal class RuntimeVariablesExpressionProxy { + private readonly RuntimeVariablesExpression _node; + + public RuntimeVariablesExpressionProxy(RuntimeVariablesExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + public ReadOnlyCollection Variables { get { return _node.Variables; } } + } + + internal class SwitchCaseProxy { + private readonly SwitchCase _node; + + public SwitchCaseProxy(SwitchCase node) { + _node = node; + } + + public Expression Body { get { return _node.Body; } } + public ReadOnlyCollection TestValues { get { return _node.TestValues; } } + } + + internal class SwitchExpressionProxy { + private readonly SwitchExpression _node; + + public SwitchExpressionProxy(SwitchExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public ReadOnlyCollection Cases { get { return _node.Cases; } } + public MethodInfo Comparison { get { return _node.Comparison; } } + public String DebugView { get { return _node.DebugView; } } + public Expression DefaultBody { get { return _node.DefaultBody; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Expression SwitchValue { get { return _node.SwitchValue; } } + public Type Type { get { return _node.Type; } } + } + + internal class TryExpressionProxy { + private readonly TryExpression _node; + + public TryExpressionProxy(TryExpression node) { + _node = node; + } + + public Expression Body { get { return _node.Body; } } + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public Expression Fault { get { return _node.Fault; } } + public Expression Finally { get { return _node.Finally; } } + public ReadOnlyCollection Handlers { get { return _node.Handlers; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + } + + internal class TypeBinaryExpressionProxy { + private readonly TypeBinaryExpression _node; + + public TypeBinaryExpressionProxy(TypeBinaryExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public Expression Expression { get { return _node.Expression; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Type Type { get { return _node.Type; } } + public Type TypeOperand { get { return _node.TypeOperand; } } + } + + internal class UnaryExpressionProxy { + private readonly UnaryExpression _node; + + public UnaryExpressionProxy(UnaryExpression node) { + _node = node; + } + + public Boolean CanReduce { get { return _node.CanReduce; } } + public String DebugView { get { return _node.DebugView; } } + public Boolean IsLifted { get { return _node.IsLifted; } } + public Boolean IsLiftedToNull { get { return _node.IsLiftedToNull; } } + public MethodInfo Method { get { return _node.Method; } } + public ExpressionType NodeType { get { return _node.NodeType; } } + public Expression Operand { get { return _node.Operand; } } + public Type Type { get { return _node.Type; } } + } + + // *** END GENERATED CODE *** + + #endregion + } +#endif +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/Expression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/Expression.cs new file mode 100644 index 00000000000..9a79ee68251 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/Expression.cs @@ -0,0 +1,403 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Globalization; +using System.IO; +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Threading; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// The base type for all nodes in Expression Trees. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling")] + public abstract partial class Expression { + private delegate LambdaExpression LambdaFactory(Expression body, string name, bool tailCall, ReadOnlyCollection parameters); + + private static readonly CacheDict _LambdaDelegateCache = new CacheDict(40); + private static CacheDict _LambdaFactories; + + // LINQ protected ctor from 3.5 + +#if !MICROSOFT_SCRIPTING_CORE // needs ConditionWeakTable in 4.0 + + // For 4.0, many frequently used Expression nodes have had their memory + // footprint reduced by removing the Type and NodeType fields. This has + // large performance benefits to all users of Expression Trees. + // + // To support the 3.5 protected constructor, we store the fields that + // used to be here in a ConditionalWeakTable. + + private class ExtensionInfo { + public ExtensionInfo(ExpressionType nodeType, Type type) { + NodeType = nodeType; + Type = type; + } + + internal readonly ExpressionType NodeType; + internal readonly Type Type; + } + + private static ConditionalWeakTable _legacyCtorSupportTable; + + /// + /// Constructs a new instance of . + /// + /// The of the . + /// The of the . + [Obsolete("use a different constructor that does not take ExpressionType. Then override NodeType and Type properties to provide the values that would be specified to this constructor.")] + protected Expression(ExpressionType nodeType, Type type) { + // Can't enforce anything that V1 didn't + if (_legacyCtorSupportTable == null) { + Interlocked.CompareExchange( + ref _legacyCtorSupportTable, + new ConditionalWeakTable(), + null + ); + } + + _legacyCtorSupportTable.Add(this, new ExtensionInfo(nodeType, type)); + } +#endif + + /// + /// Constructs a new instance of . + /// + protected Expression() { + } + + /// + /// The of the . + /// + public virtual ExpressionType NodeType { + get { +#if !MICROSOFT_SCRIPTING_CORE + ExtensionInfo extInfo; + if (_legacyCtorSupportTable.TryGetValue(this, out extInfo)) { + return extInfo.NodeType; + } +#endif + // the extension expression failed to override NodeType + throw Error.ExtensionNodeMustOverrideProperty("Expression.NodeType"); + } + } + + + /// + /// The of the value represented by this . + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods")] + public virtual Type Type { + get { +#if !MICROSOFT_SCRIPTING_CORE + ExtensionInfo extInfo; + if (_legacyCtorSupportTable.TryGetValue(this, out extInfo)) { + return extInfo.Type; + } +#endif + // the extension expression failed to override Type + throw Error.ExtensionNodeMustOverrideProperty("Expression.Type"); + } + } + + /// + /// Indicates that the node can be reduced to a simpler node. If this + /// returns true, Reduce() can be called to produce the reduced form. + /// + public virtual bool CanReduce { + get { return false; } + } + + /// + /// Reduces this node to a simpler expression. If CanReduce returns + /// true, this should return a valid expression. This method is + /// allowed to return another node which itself must be reduced. + /// + /// The reduced expression. + public virtual Expression Reduce() { + ContractUtils.Requires(!CanReduce, "this", Strings.ReducibleMustOverrideReduce); + return this; + } + + /// + /// Reduces the node and then calls the visitor delegate on the reduced expression. + /// Throws an exception if the node isn't reducible. + /// + /// An instance of . + /// The expression being visited, or an expression which should replace it in the tree. + /// + /// Override this method to provide logic to walk the node's children. + /// A typical implementation will call visitor.Visit on each of its + /// children, and if any of them change, should return a new copy of + /// itself with the modified children. + /// + protected internal virtual Expression VisitChildren(Func visitor) { + ContractUtils.Requires(CanReduce, "this", Strings.MustBeReducible); + return visitor(ReduceExtensions()); + } + + // Visitor pattern: this is the method that dispatches back to the visitor + // NOTE: this is unlike the Visit method, which provides a hook for + // derived classes to extend the visitor framework to be able to walk + // themselves + internal virtual Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitExtension(this); + } + + /// + /// Reduces this node to a simpler expression. If CanReduce returns + /// true, this should return a valid expression. This method is + /// allowed to return another node which itself must be reduced. + /// + /// The reduced expression. + /// + /// Unlike Reduce, this method checks that the reduced node satisfies + /// certain invariants. + /// + public Expression ReduceAndCheck() { + ContractUtils.Requires(CanReduce, "this", Strings.MustBeReducible); + + var newNode = Reduce(); + + // 1. Reduction must return a new, non-null node + // 2. Reduction must return a new node whose result type can be assigned to the type of the original node + ContractUtils.Requires(newNode != null && newNode != this, "this", Strings.MustReduceToDifferent); + ContractUtils.Requires(TypeUtils.AreReferenceAssignable(Type, newNode.Type), "this", Strings.ReducedNotCompatible); + return newNode; + } + + /// + /// Reduces the expression to a known node type (i.e. not an Extension node) + /// or simply returns the expression if it is already a known type. + /// + /// The reduced expression. + public Expression ReduceExtensions() { + var node = this; + while (node.NodeType == ExpressionType.Extension) { + node = node.ReduceAndCheck(); + } + return node; + } + + + /// + /// Creates a representation of the Expression. + /// + /// A representation of the Expression. + public override string ToString() { + return ExpressionStringBuilder.ExpressionToString(this); + } + +#if MICROSOFT_SCRIPTING_CORE + /// + /// Writes a representation of the to a . + /// + /// A that will be used to build the string representation. + public void DumpExpression(TextWriter writer) { + DebugViewWriter.WriteTo(this, writer); + } + + /// + /// Creates a representation of the Expression. + /// + /// A representation of the Expression. + public string DebugView { +#else + private string DebugView { +#endif + get { + using (System.IO.StringWriter writer = new System.IO.StringWriter(CultureInfo.CurrentCulture)) { + DebugViewWriter.WriteTo(this, writer); + return writer.ToString(); + } + } + } + + /// + /// Helper used for ensuring we only return 1 instance of a ReadOnlyCollection of T. + /// + /// This is called from various methods where we internally hold onto an IList of T + /// or a readonly collection of T. We check to see if we've already returned a + /// readonly collection of T and if so simply return the other one. Otherwise we do + /// a thread-safe replacement of the list w/ a readonly collection which wraps it. + /// + /// Ultimately this saves us from having to allocate a ReadOnlyCollection for our + /// data types because the compiler is capable of going directly to the IList of T. + /// + internal static ReadOnlyCollection ReturnReadOnly(ref IList collection) { + IList value = collection; + + // if it's already read-only just return it. + ReadOnlyCollection res = value as ReadOnlyCollection; + if (res != null) { + return res; + } + + // otherwise make sure only readonly collection every gets exposed + Interlocked.CompareExchange>( + ref collection, + value.ToReadOnly(), + value + ); + + // and return it + return (ReadOnlyCollection)collection; + } + + /// + /// Helper used for ensuring we only return 1 instance of a ReadOnlyCollection of T. + /// + /// This is similar to the ReturnReadOnly of T. This version supports nodes which hold + /// onto multiple Expressions where one is typed to object. That object field holds either + /// an expression or a ReadOnlyCollection of Expressions. When it holds a ReadOnlyCollection + /// the IList which backs it is a ListArgumentProvider which uses the Expression which + /// implements IArgumentProvider to get 2nd and additional values. The ListArgumentProvider + /// continues to hold onto the 1st expression. + /// + /// This enables users to get the ReadOnlyCollection w/o it consuming more memory than if + /// it was just an array. Meanwhile The DLR internally avoids accessing which would force + /// the readonly collection to be created resulting in a typical memory savings. + /// + internal static ReadOnlyCollection ReturnReadOnly(IArgumentProvider provider, ref object collection) { + Expression tObj = collection as Expression; + if (tObj != null) { + // otherwise make sure only one readonly collection ever gets exposed + Interlocked.CompareExchange( + ref collection, + new ReadOnlyCollection(new ListArgumentProvider(provider, tObj)), + tObj + ); + } + + // and return what is not guaranteed to be a readonly collection + return (ReadOnlyCollection)collection; + } + + /// + /// Helper which is used for specialized subtypes which use ReturnReadOnly(ref object, ...). + /// This is the reverse version of ReturnReadOnly which takes an IArgumentProvider. + /// + /// This is used to return the 1st argument. The 1st argument is typed as object and either + /// contains a ReadOnlyCollection or the Expression. We check for the Expression and if it's + /// present we return that, otherwise we return the 1st element of the ReadOnlyCollection. + /// + internal static T ReturnObject(object collectionOrT) where T : class { + T t = collectionOrT as T; + if (t != null) { + return t; + } + + return ((ReadOnlyCollection)collectionOrT)[0]; + } + + private static void RequiresCanRead(Expression expression, string paramName) { + if (expression == null) { + throw new ArgumentNullException(paramName); + } + + // validate that we can read the node + switch (expression.NodeType) { + case ExpressionType.Index: + IndexExpression index = (IndexExpression)expression; + if (index.Indexer != null && !index.Indexer.CanRead) { + throw new ArgumentException(Strings.ExpressionMustBeReadable, paramName); + } + break; + case ExpressionType.MemberAccess: + MemberExpression member = (MemberExpression)expression; + MemberInfo memberInfo = member.Member; + if (memberInfo.MemberType == MemberTypes.Property) { + PropertyInfo prop = (PropertyInfo)memberInfo; + if (!prop.CanRead) { + throw new ArgumentException(Strings.ExpressionMustBeReadable, paramName); + } + } + break; + } + } + + private static void RequiresCanRead(IEnumerable items, string paramName) { + if (items != null) { + // this is called a lot, avoid allocating an enumerator if we can... + IList listItems = items as IList; + if (listItems != null) { + for (int i = 0; i < listItems.Count; i++) { + RequiresCanRead(listItems[i], paramName); + } + return; + } + + foreach (var i in items) { + RequiresCanRead(i, paramName); + } + } + } + private static void RequiresCanWrite(Expression expression, string paramName) { + if (expression == null) { + throw new ArgumentNullException(paramName); + } + + bool canWrite = false; + switch (expression.NodeType) { + case ExpressionType.Index: + IndexExpression index = (IndexExpression)expression; + if (index.Indexer != null) { + canWrite = index.Indexer.CanWrite; + } else { + canWrite = true; + } + break; + case ExpressionType.MemberAccess: + MemberExpression member = (MemberExpression)expression; + switch (member.Member.MemberType) { + case MemberTypes.Property: + PropertyInfo prop = (PropertyInfo)member.Member; + canWrite = prop.CanWrite; + break; + case MemberTypes.Field: + FieldInfo field = (FieldInfo)member.Member; + canWrite = !(field.IsInitOnly || field.IsLiteral); + break; + } + break; + case ExpressionType.Parameter: + canWrite = true; + break; + } + + if (!canWrite) { + throw new ArgumentException(Strings.ExpressionMustBeWriteable, paramName); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionStringBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionStringBuilder.cs new file mode 100644 index 00000000000..7e8ee3c7512 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionStringBuilder.cs @@ -0,0 +1,755 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic; +using System.Dynamic.Utils; +#else +using Microsoft.Scripting; +using Microsoft.Scripting.Utils; +#endif +using System.Globalization; +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Text; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling")] + internal sealed class ExpressionStringBuilder : ExpressionVisitor { + private StringBuilder _out; + + // Associate every unique label or anonymous parameter in the tree with an integer. + // The label is displayed as Label_#. + private Dictionary _ids; + + private ExpressionStringBuilder() { + _out = new StringBuilder(); + } + + public override string ToString() { + return _out.ToString(); + } + + private void AddLabel(LabelTarget label) { + if (_ids == null) { + _ids = new Dictionary(); + _ids.Add(label, 0); + } else { + if (!_ids.ContainsKey(label)) { + _ids.Add(label, _ids.Count); + } + } + } + + private int GetLabelId(LabelTarget label) { + if (_ids == null) { + _ids = new Dictionary(); + AddLabel(label); + return 0; + } else { + int id; + if (!_ids.TryGetValue(label, out id)) { + //label is met the first time + id = _ids.Count; + AddLabel(label); + } + return id; + } + } + + private void AddParam(ParameterExpression p) { + if (_ids == null) { + _ids = new Dictionary(); + _ids.Add(_ids, 0); + } else { + if (!_ids.ContainsKey(p)) { + _ids.Add(p, _ids.Count); + } + } + } + + private int GetParamId(ParameterExpression p) { + if (_ids == null) { + _ids = new Dictionary(); + AddParam(p); + return 0; + } else { + int id; + if (!_ids.TryGetValue(p, out id)) { + // p is met the first time + id = _ids.Count; + AddParam(p); + } + return id; + } + } + + #region The printing code + + private void Out(string s) { + _out.Append(s); + } + + private void Out(char c) { + _out.Append(c); + } + + #endregion + + #region Output an expresstion tree to a string + + /// + /// Output a given expression tree to a string. + /// + internal static string ExpressionToString(Expression node) { + Debug.Assert(node != null); + ExpressionStringBuilder esb = new ExpressionStringBuilder(); + esb.Visit(node); + return esb.ToString(); + } + + internal static string CatchBlockToString(CatchBlock node) { + Debug.Assert(node != null); + ExpressionStringBuilder esb = new ExpressionStringBuilder(); + esb.VisitCatchBlock(node); + return esb.ToString(); + } + + internal static string SwitchCaseToString(SwitchCase node) { + Debug.Assert(node != null); + ExpressionStringBuilder esb = new ExpressionStringBuilder(); + esb.VisitSwitchCase(node); + return esb.ToString(); + } + + /// + /// Output a given member binding to a string. + /// + internal static string MemberBindingToString(MemberBinding node) { + Debug.Assert(node != null); + ExpressionStringBuilder esb = new ExpressionStringBuilder(); + esb.VisitMemberBinding(node); + return esb.ToString(); + } + + /// + /// Output a given ElementInit to a string. + /// + internal static string ElementInitBindingToString(ElementInit node) { + Debug.Assert(node != null); + ExpressionStringBuilder esb = new ExpressionStringBuilder(); + esb.VisitElementInit(node); + return esb.ToString(); + } + + // More proper would be to make this a virtual method on Action + private static string FormatBinder(CallSiteBinder binder) { + ConvertBinder convert; + GetMemberBinder getMember; + SetMemberBinder setMember; + DeleteMemberBinder deleteMember; + GetIndexBinder getIndex; + SetIndexBinder setIndex; + DeleteIndexBinder deleteIndex; + InvokeMemberBinder call; + InvokeBinder invoke; + CreateInstanceBinder create; + UnaryOperationBinder unary; + BinaryOperationBinder binary; + + if ((convert = binder as ConvertBinder) != null) { + return "Convert " + convert.Type; + } else if ((getMember = binder as GetMemberBinder) != null) { + return "GetMember " + getMember.Name; + } else if ((setMember = binder as SetMemberBinder) != null) { + return "SetMember " + setMember.Name; + } else if ((deleteMember = binder as DeleteMemberBinder) != null) { + return "DeleteMember " + deleteMember.Name; + } else if ((getIndex = binder as GetIndexBinder) != null) { + return "GetIndex"; + } else if ((setIndex = binder as SetIndexBinder) != null) { + return "SetIndex"; + } else if ((deleteIndex = binder as DeleteIndexBinder) != null) { + return "DeleteIndex"; + } else if ((call = binder as InvokeMemberBinder) != null) { + return "Call " + call.Name; + } else if ((invoke = binder as InvokeBinder) != null) { + return "Invoke"; + } else if ((create = binder as CreateInstanceBinder) != null) { + return "Create"; + } else if ((unary = binder as UnaryOperationBinder) != null) { + return unary.Operation.ToString(); + } else if ((binary = binder as BinaryOperationBinder) != null) { + return binary.Operation.ToString(); + } else { + return "CallSiteBinder"; + } + } + + private void VisitExpressions(char open, IList expressions, char close) where T : Expression { + Out(open); + if (expressions != null) { + bool isFirst = true; + foreach (T e in expressions) { + if (isFirst) { + isFirst = false; + } else { + Out(", "); + } + Visit(e); + } + } + Out(close); + } + + protected internal override Expression VisitDynamic(DynamicExpression node) { + Out(FormatBinder(node.Binder)); + VisitExpressions('(', node.Arguments, ')'); + return node; + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + protected internal override Expression VisitBinary(BinaryExpression node) { + if (node.NodeType == ExpressionType.ArrayIndex) { + Visit(node.Left); + Out("["); + Visit(node.Right); + Out("]"); + } else { + string op; + switch (node.NodeType) { + case ExpressionType.Assign: op = "="; break; + case ExpressionType.Equal: op = "=="; break; + case ExpressionType.NotEqual: op = "!="; break; + case ExpressionType.AndAlso: op = "AndAlso"; break; + case ExpressionType.OrElse: op = "OrElse"; break; + case ExpressionType.GreaterThan: op = ">"; break; + case ExpressionType.LessThan: op = "<"; break; + case ExpressionType.GreaterThanOrEqual: op = ">="; break; + case ExpressionType.LessThanOrEqual: op = "<="; break; + case ExpressionType.Add: op = "+"; break; + case ExpressionType.AddAssign: op = "+="; break; + case ExpressionType.AddAssignChecked: op = "+="; break; + case ExpressionType.AddChecked: op = "+"; break; + case ExpressionType.Subtract: op = "-"; break; + case ExpressionType.SubtractAssign: op = "-="; break; + case ExpressionType.SubtractAssignChecked: op = "-="; break; + case ExpressionType.SubtractChecked: op = "-"; break; + case ExpressionType.Divide: op = "/"; break; + case ExpressionType.DivideAssign: op = "/="; break; + case ExpressionType.Modulo: op = "%"; break; + case ExpressionType.ModuloAssign: op = "%="; break; + case ExpressionType.Multiply: op = "*"; break; + case ExpressionType.MultiplyAssign: op = "*="; break; + case ExpressionType.MultiplyAssignChecked: op = "*="; break; + case ExpressionType.MultiplyChecked: op = "*"; break; + case ExpressionType.LeftShift: op = "<<"; break; + case ExpressionType.LeftShiftAssign: op = "<<="; break; + case ExpressionType.RightShift: op = ">>"; break; + case ExpressionType.RightShiftAssign: op = ">>="; break; + case ExpressionType.And: + if (node.Type == typeof(bool) || node.Type == typeof(bool?)) { + op = "And"; + } else { + op = "&"; + } + break; + case ExpressionType.AndAssign: + if (node.Type == typeof(bool) || node.Type == typeof(bool?)) { + op = "&&="; + } else { + op = "&="; + } + break; + case ExpressionType.Or: + if (node.Type == typeof(bool) || node.Type == typeof(bool?)) { + op = "Or"; + } else { + op = "|"; + } + break; + case ExpressionType.OrAssign: + if (node.Type == typeof(bool) || node.Type == typeof(bool?)) { + op = "||="; + } else { op = "|="; } + break; + case ExpressionType.ExclusiveOr: op = "^"; break; + case ExpressionType.ExclusiveOrAssign: op = "^="; break; + case ExpressionType.Power: op = "^"; break; + case ExpressionType.PowerAssign: op = "**="; break; + case ExpressionType.Coalesce: op = "??"; break; + + default: + throw new InvalidOperationException(); + } + Out("("); + Visit(node.Left); + Out(' '); + Out(op); + Out(' '); + Visit(node.Right); + Out(")"); + } + return node; + } + + protected internal override Expression VisitParameter(ParameterExpression node) { + if (node.IsByRef) { + Out("ref "); + } + if (String.IsNullOrEmpty(node.Name)) { + int id = GetParamId(node); + Out("Param_" + id); + } else { + Out(node.Name); + } + return node; + } + + protected internal override Expression VisitLambda(Expression node) { + if (node.Parameters.Count == 1) { + // p => body + Visit(node.Parameters[0]); + } else { + // (p1, p2, ..., pn) => body + VisitExpressions('(', node.Parameters, ')'); + } + Out(" => "); + Visit(node.Body); + return node; + } + + protected internal override Expression VisitListInit(ListInitExpression node) { + Visit(node.NewExpression); + Out(" {"); + for (int i = 0, n = node.Initializers.Count; i < n; i++) { + if (i > 0) { + Out(", "); + } + Out(node.Initializers[i].ToString()); + } + Out("}"); + return node; + } + + protected internal override Expression VisitConditional(ConditionalExpression node) { + Out("IIF("); + Visit(node.Test); + Out(", "); + Visit(node.IfTrue); + Out(", "); + Visit(node.IfFalse); + Out(")"); + return node; + } + + protected internal override Expression VisitConstant(ConstantExpression node) { + if (node.Value != null) { + string sValue = node.Value.ToString(); + if (node.Value is string) { + Out("\""); + Out(sValue); + Out("\""); + } else if (sValue == node.Value.GetType().ToString()) { + Out("value("); + Out(sValue); + Out(")"); + } else { + Out(sValue); + } + } else { + Out("null"); + } + return node; + } + + protected internal override Expression VisitDebugInfo(DebugInfoExpression node) { + string s = String.Format( + CultureInfo.CurrentCulture, + "", + node.Document.FileName, + node.StartLine, + node.StartColumn, + node.EndLine, + node.EndColumn + ); + Out(s); + return node; + } + + protected internal override Expression VisitRuntimeVariables(RuntimeVariablesExpression node) { + VisitExpressions('(', node.Variables, ')'); + return node; + } + + // Prints ".instanceField" or "declaringType.staticField" + private void OutMember(Expression instance, MemberInfo member) { + if (instance != null) { + Visit(instance); + Out("." + member.Name); + } else { + // For static members, include the type name + Out(member.DeclaringType.Name + "." + member.Name); + } + } + + protected internal override Expression VisitMember(MemberExpression node) { + OutMember(node.Expression, node.Member); + return node; + } + + protected internal override Expression VisitMemberInit(MemberInitExpression node) { + if (node.NewExpression.Arguments.Count == 0 && + node.NewExpression.Type.Name.Contains("<")) { + // anonymous type constructor + Out("new"); + } else { + Visit(node.NewExpression); + } + Out(" {"); + for (int i = 0, n = node.Bindings.Count; i < n; i++) { + MemberBinding b = node.Bindings[i]; + if (i > 0) { + Out(", "); + } + VisitMemberBinding(b); + } + Out("}"); + return node; + } + + protected override MemberAssignment VisitMemberAssignment(MemberAssignment assignment) { + Out(assignment.Member.Name); + Out(" = "); + Visit(assignment.Expression); + return assignment; + } + + protected override MemberListBinding VisitMemberListBinding(MemberListBinding binding) { + Out(binding.Member.Name); + Out(" = {"); + for (int i = 0, n = binding.Initializers.Count; i < n; i++) { + if (i > 0) { + Out(", "); + } + VisitElementInit(binding.Initializers[i]); + } + Out("}"); + return binding; + } + + protected override MemberMemberBinding VisitMemberMemberBinding(MemberMemberBinding binding) { + Out(binding.Member.Name); + Out(" = {"); + for (int i = 0, n = binding.Bindings.Count; i < n; i++) { + if (i > 0) { + Out(", "); + } + VisitMemberBinding(binding.Bindings[i]); + } + Out("}"); + return binding; + } + + protected override ElementInit VisitElementInit(ElementInit initializer) { + Out(initializer.AddMethod.ToString()); + VisitExpressions('(', initializer.Arguments, ')'); + return initializer; + } + + protected internal override Expression VisitInvocation(InvocationExpression node) { + Out("Invoke("); + Visit(node.Expression); + for (int i = 0, n = node.Arguments.Count; i < n; i++) { + Out(", "); + Visit(node.Arguments[i]); + } + Out(")"); + return node; + } + + protected internal override Expression VisitMethodCall(MethodCallExpression node) { + int start = 0; + Expression ob = node.Object; + + if (Attribute.GetCustomAttribute(node.Method, typeof(ExtensionAttribute)) != null) { + start = 1; + ob = node.Arguments[0]; + } + + if (ob != null) { + Visit(ob); + Out("."); + } + Out(node.Method.Name); + Out("("); + for (int i = start, n = node.Arguments.Count; i < n; i++) { + if (i > start) + Out(", "); + Visit(node.Arguments[i]); + } + Out(")"); + return node; + } + + protected internal override Expression VisitNewArray(NewArrayExpression node) { + switch (node.NodeType) { + case ExpressionType.NewArrayBounds: + // new MyType[](expr1, expr2) + Out("new " + node.Type.ToString()); + VisitExpressions('(', node.Expressions, ')'); + break; + case ExpressionType.NewArrayInit: + // new [] {expr1, expr2} + Out("new [] "); + VisitExpressions('{', node.Expressions, '}'); + break; + } + return node; + } + + protected internal override Expression VisitNew(NewExpression node) { + Out("new " + node.Type.Name); + Out("("); + for (int i = 0; i < node.Arguments.Count; i++) { + if (i > 0) { + Out(", "); + } + if (node.Members != null) { + Out(node.Members[i].Name); + Out(" = "); + } + Visit(node.Arguments[i]); + } + Out(")"); + return node; + } + + protected internal override Expression VisitTypeBinary(TypeBinaryExpression node) { + Out("("); + Visit(node.Expression); + switch (node.NodeType) { + case ExpressionType.TypeIs: + Out(" Is "); + break; + case ExpressionType.TypeEqual: + Out(" TypeEqual "); + break; + } + Out(node.TypeOperand.Name); + Out(")"); + return node; + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + protected internal override Expression VisitUnary(UnaryExpression node) { + switch (node.NodeType) { + case ExpressionType.TypeAs: + Out("("); + break; + case ExpressionType.Not: + Out("Not("); + break; + case ExpressionType.Negate: + case ExpressionType.NegateChecked: + Out("-"); + break; + case ExpressionType.UnaryPlus: + Out("+"); + break; + case ExpressionType.Quote: + break; + case ExpressionType.Throw: + Out("throw("); + break; + case ExpressionType.Increment: + Out("Increment("); + break; + case ExpressionType.Decrement: + Out("Decrement("); + break; + case ExpressionType.PreIncrementAssign: + Out("++"); + break; + case ExpressionType.PreDecrementAssign: + Out("--"); + break; + case ExpressionType.OnesComplement: + Out("~("); + break; + default: + Out(node.NodeType.ToString()); + Out("("); + break; + } + + Visit(node.Operand); + + switch (node.NodeType) { + case ExpressionType.Negate: + case ExpressionType.NegateChecked: + case ExpressionType.UnaryPlus: + case ExpressionType.PreDecrementAssign: + case ExpressionType.PreIncrementAssign: + case ExpressionType.Quote: + break; + case ExpressionType.TypeAs: + Out(" As "); + Out(node.Type.Name); + Out(")"); + break; + case ExpressionType.PostIncrementAssign: + Out("++"); + break; + case ExpressionType.PostDecrementAssign: + Out("--"); + break; + default: + Out(")"); + break; + } + return node; + } + + protected internal override Expression VisitBlock(BlockExpression node) { + Out("{"); + foreach (var v in node.Variables) { + Out("var "); + Visit(v); + Out(";"); + } + Out(" ... }"); + return node; + } + + protected internal override Expression VisitDefault(DefaultExpression node) { + Out("default("); + Out(node.Type.Name); + Out(")"); + return node; + } + + protected internal override Expression VisitLabel(LabelExpression node) { + Out("{ ... } "); + DumpLabel(node.Target); + Out(":"); + return node; + } + + protected internal override Expression VisitGoto(GotoExpression node) { + Out(node.Kind.ToString().ToLower(CultureInfo.CurrentCulture)); + DumpLabel(node.Target); + if (node.Value != null) { + Out(" ("); + Visit(node.Value); + Out(") "); + } + return node; + } + + protected internal override Expression VisitLoop(LoopExpression node) { + Out("loop { ... }"); + return node; + } + + protected override SwitchCase VisitSwitchCase(SwitchCase node) { + Out("case "); + VisitExpressions('(', node.TestValues, ')'); + Out(": ..."); + return node; + } + + protected internal override Expression VisitSwitch(SwitchExpression node) { + Out("switch "); + Out("("); + Visit(node.SwitchValue); + Out(") { ... }"); + return node; + } + + protected override CatchBlock VisitCatchBlock(CatchBlock node) { + Out("catch (" + node.Test.Name); + if (node.Variable != null) { + Out(node.Variable.Name ?? ""); + } + Out(") { ... }"); + return node; + } + + protected internal override Expression VisitTry(TryExpression node) { + Out("try { ... }"); + return node; + } + + protected internal override Expression VisitIndex(IndexExpression node) { + if (node.Object != null) { + Visit(node.Object); + } else { + Debug.Assert(node.Indexer != null); + Out(node.Indexer.DeclaringType.Name); + } + if (node.Indexer != null) { + Out("."); + Out(node.Indexer.Name); + } + + VisitExpressions('[', node.Arguments, ']'); + return node; + } + + protected internal override Expression VisitExtension(Expression node) { + // Prefer an overriden ToString, if available. + var flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.ExactBinding; + var toString = node.GetType().GetMethod("ToString", flags, null, Type.EmptyTypes, null); + if (toString.DeclaringType != typeof(Expression)) { + Out(node.ToString()); + return node; + } + + Out("["); + // For 3.5 subclasses, print the NodeType. + // For Extension nodes, print the class name. + if (node.NodeType == ExpressionType.Extension) { + Out(node.GetType().FullName); + } else { + Out(node.NodeType.ToString()); + } + Out("]"); + return node; + } + + private void DumpLabel(LabelTarget target) { + if (!String.IsNullOrEmpty(target.Name)) { + Out(target.Name); + } else { + int labelId = GetLabelId(target); + Out("UnamedLabel_" + labelId); + } + } + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionType.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionType.cs new file mode 100644 index 00000000000..feba35e0a49 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionType.cs @@ -0,0 +1,379 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Describes the node types for the nodes of an expression tree. + /// + public enum ExpressionType { + + #region Generated Expression Tree Node Types + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_tree_nodes from: generate_tree.py + + /// + /// A node that represents arithmetic addition without overflow checking. + /// + Add, + /// + /// A node that represents arithmetic addition with overflow checking. + /// + AddChecked, + /// + /// A node that represents a bitwise AND operation. + /// + And, + /// + /// A node that represents a short-circuiting conditional AND operation. + /// + AndAlso, + /// + /// A node that represents getting the length of a one-dimensional array. + /// + ArrayLength, + /// + /// A node that represents indexing into a one-dimensional array. + /// + ArrayIndex, + /// + /// A node that represents represents a method call. + /// + Call, + /// + /// A node that represents a null coalescing operation. + /// + Coalesce, + /// + /// A node that represents a conditional operation. + /// + Conditional, + /// + /// A node that represents an expression that has a constant value. + /// + Constant, + /// + /// A node that represents a cast or conversion operation. If the operation is a numeric conversion, it overflows silently if the converted value does not fit the target type. + /// + Convert, + /// + /// A node that represents a cast or conversion operation. If the operation is a numeric conversion, an exception is thrown if the converted value does not fit the target type. + /// + ConvertChecked, + /// + /// A node that represents arithmetic division. + /// + Divide, + /// + /// A node that represents an equality comparison. + /// + Equal, + /// + /// A node that represents a bitwise XOR operation. + /// + ExclusiveOr, + /// + /// A node that represents a "greater than" numeric comparison. + /// + GreaterThan, + /// + /// A node that represents a "greater than or equal" numeric comparison. + /// + GreaterThanOrEqual, + /// + /// A node that represents applying a delegate or lambda expression to a list of argument expressions. + /// + Invoke, + /// + /// A node that represents a lambda expression. + /// + Lambda, + /// + /// A node that represents a bitwise left-shift operation. + /// + LeftShift, + /// + /// A node that represents a "less than" numeric comparison. + /// + LessThan, + /// + /// A node that represents a "less than or equal" numeric comparison. + /// + LessThanOrEqual, + /// + /// A node that represents creating a new IEnumerable object and initializing it from a list of elements. + /// + ListInit, + /// + /// A node that represents reading from a field or property. + /// + MemberAccess, + /// + /// A node that represents creating a new object and initializing one or more of its members. + /// + MemberInit, + /// + /// A node that represents an arithmetic remainder operation. + /// + Modulo, + /// + /// A node that represents arithmetic multiplication without overflow checking. + /// + Multiply, + /// + /// A node that represents arithmetic multiplication with overflow checking. + /// + MultiplyChecked, + /// + /// A node that represents an arithmetic negation operation. + /// + Negate, + /// + /// A node that represents a unary plus operation. The result of a predefined unary plus operation is simply the value of the operand, but user-defined implementations may have non-trivial results. + /// + UnaryPlus, + /// + /// A node that represents an arithmetic negation operation that has overflow checking. + /// + NegateChecked, + /// + /// A node that represents calling a constructor to create a new object. + /// + New, + /// + /// A node that represents creating a new one-dimensional array and initializing it from a list of elements. + /// + NewArrayInit, + /// + /// A node that represents creating a new array where the bounds for each dimension are specified. + /// + NewArrayBounds, + /// + /// A node that represents a bitwise complement operation. + /// + Not, + /// + /// A node that represents an inequality comparison. + /// + NotEqual, + /// + /// A node that represents a bitwise OR operation. + /// + Or, + /// + /// A node that represents a short-circuiting conditional OR operation. + /// + OrElse, + /// + /// A node that represents a reference to a parameter or variable defined in the context of the expression. + /// + Parameter, + /// + /// A node that represents raising a number to a power. + /// + Power, + /// + /// A node that represents an expression that has a constant value of type Expression. A Quote node can contain references to parameters defined in the context of the expression it represents. + /// + Quote, + /// + /// A node that represents a bitwise right-shift operation. + /// + RightShift, + /// + /// A node that represents arithmetic subtraction without overflow checking. + /// + Subtract, + /// + /// A node that represents arithmetic subtraction with overflow checking. + /// + SubtractChecked, + /// + /// A node that represents an explicit reference or boxing conversion where null reference (Nothing in Visual Basic) is supplied if the conversion fails. + /// + TypeAs, + /// + /// A node that represents a type test. + /// + TypeIs, + /// + /// A node that represents an assignment. + /// + Assign, + /// + /// A node that represents a block of expressions. + /// + Block, + /// + /// A node that represents a debugging information. + /// + DebugInfo, + /// + /// A node that represents a unary decrement. + /// + Decrement, + /// + /// A node that represents a dynamic operation. + /// + Dynamic, + /// + /// A node that represents a default value. + /// + Default, + /// + /// A node that represents an extension expression. + /// + Extension, + /// + /// A node that represents a goto. + /// + Goto, + /// + /// A node that represents a unary increment. + /// + Increment, + /// + /// A node that represents an index operation. + /// + Index, + /// + /// A node that represents a label. + /// + Label, + /// + /// A node that represents a list of runtime variables. + /// + RuntimeVariables, + /// + /// A node that represents a loop. + /// + Loop, + /// + /// A node that represents a switch operation. + /// + Switch, + /// + /// A node that represents a throwing of an exception. + /// + Throw, + /// + /// A node that represents a try-catch expression. + /// + Try, + /// + /// A node that represents an unbox value type operation. + /// + Unbox, + /// + /// A node that represents an arithmetic addition compound assignment without overflow checking. + /// + AddAssign, + /// + /// A node that represents a bitwise AND compound assignment. + /// + AndAssign, + /// + /// A node that represents an arithmetic division compound assignment . + /// + DivideAssign, + /// + /// A node that represents a bitwise XOR compound assignment. + /// + ExclusiveOrAssign, + /// + /// A node that represents a bitwise left-shift compound assignment. + /// + LeftShiftAssign, + /// + /// A node that represents an arithmetic remainder compound assignment. + /// + ModuloAssign, + /// + /// A node that represents arithmetic multiplication compound assignment without overflow checking. + /// + MultiplyAssign, + /// + /// A node that represents a bitwise OR compound assignment. + /// + OrAssign, + /// + /// A node that represents raising a number to a power compound assignment. + /// + PowerAssign, + /// + /// A node that represents a bitwise right-shift compound assignment. + /// + RightShiftAssign, + /// + /// A node that represents arithmetic subtraction compound assignment without overflow checking. + /// + SubtractAssign, + /// + /// A node that represents an arithmetic addition compound assignment with overflow checking. + /// + AddAssignChecked, + /// + /// A node that represents arithmetic multiplication compound assignment with overflow checking. + /// + MultiplyAssignChecked, + /// + /// A node that represents arithmetic subtraction compound assignment with overflow checking. + /// + SubtractAssignChecked, + /// + /// A node that represents an unary prefix increment. + /// + PreIncrementAssign, + /// + /// A node that represents an unary prefix decrement. + /// + PreDecrementAssign, + /// + /// A node that represents an unary postfix increment. + /// + PostIncrementAssign, + /// + /// A node that represents an unary postfix decrement. + /// + PostDecrementAssign, + /// + /// A node that represents a exact type test. + /// + TypeEqual, + /// + /// A node that represents a ones complement. + /// + OnesComplement, + /// + /// A node that represents a true condition value. + /// + IsTrue, + /// + /// A node that represents a false condition value. + /// + IsFalse, + + // *** END GENERATED CODE *** + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionVisitor.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionVisitor.cs new file mode 100644 index 00000000000..bc86995dfa6 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ExpressionVisitor.cs @@ -0,0 +1,791 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Represents a visitor or rewriter for expression trees. + /// + /// + /// This class is designed to be inherited to create more specialized + /// classes whose functionality requires traversing, examining or copying + /// an expression tree. + /// + public abstract class ExpressionVisitor { + + /// + /// Initializes a new instance of . + /// + protected ExpressionVisitor() { + } + + /// + /// Dispatches the expression to one of the more specialized visit methods in this class. + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + public virtual Expression Visit(Expression node) { + if (node != null) { + return node.Accept(this); + } + return null; + } + + /// + /// Dispatches the list of expressions to one of the more specialized visit methods in this class. + /// + /// The expressions to visit. + /// The modified expression list, if any of the elements were modified; + /// otherwise, returns the original expression list. + protected ReadOnlyCollection Visit(ReadOnlyCollection nodes) { + Expression[] newNodes = null; + for (int i = 0, n = nodes.Count; i < n; i++) { + Expression node = Visit(nodes[i]); + + if (newNodes != null) { + newNodes[i] = node; + } else if (!object.ReferenceEquals(node, nodes[i])) { + newNodes = new Expression[n]; + for (int j = 0; j < i; j++) { + newNodes[j] = nodes[j]; + } + newNodes[i] = node; + } + } + if (newNodes == null) { + return nodes; + } + return new TrueReadOnlyCollection(newNodes); + } + + internal Expression[] VisitArguments(IArgumentProvider nodes) { + Expression[] newNodes = null; + for (int i = 0, n = nodes.ArgumentCount; i < n; i++) { + Expression curNode = nodes.GetArgument(i); + Expression node = Visit(curNode); + + if (newNodes != null) { + newNodes[i] = node; + } else if (!object.ReferenceEquals(node, curNode)) { + newNodes = new Expression[n]; + for (int j = 0; j < i; j++) { + newNodes[j] = nodes.GetArgument(j); + } + newNodes[i] = node; + } + } + return newNodes; + } + + /// + /// Visits all nodes in the collection using a specified element visitor. + /// + /// The type of the nodes. + /// The nodes to visit. + /// A delegate that visits a single element, + /// optionally replacing it with a new element. + /// The modified node list, if any of the elements were modified; + /// otherwise, returns the original node list. + protected static ReadOnlyCollection Visit(ReadOnlyCollection nodes, Func elementVisitor) { + T[] newNodes = null; + for (int i = 0, n = nodes.Count; i < n; i++) { + T node = elementVisitor(nodes[i]); + if (newNodes != null) { + newNodes[i] = node; + } else if (!object.ReferenceEquals(node, nodes[i])) { + newNodes = new T[n]; + for (int j = 0; j < i; j++) { + newNodes[j] = nodes[j]; + } + newNodes[i] = node; + } + } + if (newNodes == null) { + return nodes; + } + return new TrueReadOnlyCollection(newNodes); + } + + /// + /// Visits an expression, casting the result back to the original expression type. + /// + /// The type of the expression. + /// The expression to visit. + /// The name of the calling method; used to report to report a better error message. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + /// The visit method for this node returned a different type. + protected T VisitAndConvert(T node, string callerName) where T : Expression { + if (node == null) { + return null; + } + node = Visit(node) as T; + if (node == null) { + throw Error.MustRewriteToSameNode(callerName, typeof(T), callerName); + } + return node; + } + + /// + /// Visits an expression, casting the result back to the original expression type. + /// + /// The type of the expression. + /// The expression to visit. + /// The name of the calling method; used to report to report a better error message. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + /// The visit method for this node returned a different type. + protected ReadOnlyCollection VisitAndConvert(ReadOnlyCollection nodes, string callerName) where T : Expression { + T[] newNodes = null; + for (int i = 0, n = nodes.Count; i < n; i++) { + T node = Visit(nodes[i]) as T; + if (node == null) { + throw Error.MustRewriteToSameNode(callerName, typeof(T), callerName); + } + + if (newNodes != null) { + newNodes[i] = node; + } else if (!object.ReferenceEquals(node, nodes[i])) { + newNodes = new T[n]; + for (int j = 0; j < i; j++) { + newNodes[j] = nodes[j]; + } + newNodes[i] = node; + } + } + if (newNodes == null) { + return nodes; + } + return new TrueReadOnlyCollection(newNodes); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitBinary(BinaryExpression node) { + // Walk children in evaluation order: left, conversion, right + Expression l = Visit(node.Left); + LambdaExpression c = VisitAndConvert(node.Conversion, "VisitBinary"); + Expression r = Visit(node.Right); + if (l == node.Left && r == node.Right && c == node.Conversion) { + return node; + } + if (node.IsReferenceComparison) { + if (node.NodeType == ExpressionType.Equal) { + return Expression.ReferenceEqual(l, r); + } else { + return Expression.ReferenceNotEqual(l, r); + } + } + var result = Expression.MakeBinary(node.NodeType, l, r, node.IsLiftedToNull, node.Method, c); + ValidateBinary(node, result); + return result; + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitBlock(BlockExpression node) { + int count = node.ExpressionCount; + Expression[] nodes = null; + for (int i = 0; i < count; i++) { + Expression oldNode = node.GetExpression(i); + Expression newNode = Visit(oldNode); + + if (oldNode != newNode) { + if (nodes == null) { + nodes = new Expression[count]; + } + nodes[i] = newNode; + } + } + var v = VisitAndConvert(node.Variables, "VisitBlock"); + + if (v == node.Variables && nodes == null) { + return node; + } else { + for (int i = 0; i < count; i++) { + if (nodes[i] == null) { + nodes[i] = node.GetExpression(i); + } + } + } + + return node.Rewrite(v, nodes); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitConditional(ConditionalExpression node) { + Expression t = Visit(node.Test); + Expression l = Visit(node.IfTrue); + Expression r = Visit(node.IfFalse); + if (t == node.Test && l == node.IfTrue && r == node.IfFalse) { + return node; + } + return Expression.Condition(t, l, r, node.Type); + } + + /// + /// Visits the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitConstant(ConstantExpression node) { + return node; + } + + /// + /// Visits the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitDebugInfo(DebugInfoExpression node) { + return node; + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitDynamic(DynamicExpression node) { + Expression[] a = VisitArguments((IArgumentProvider)node); + if (a == null) { + return node; + } + + return node.Rewrite(a); + } + + /// + /// Visits the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitDefault(DefaultExpression node) { + return node; + } + + /// + /// Visits the children of the extension expression. + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + /// + /// This can be overridden to visit or rewrite specific extension nodes. + /// If it is not overridden, this method will call , + /// which gives the node a chance to walk its children. By default, + /// will try to reduce the node. + /// + protected internal virtual Expression VisitExtension(Expression node) { + return node.VisitChildren(this.Visit); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitGoto(GotoExpression node) { + LabelTarget t = VisitLabelTarget(node.Target); + Expression v = Visit(node.Value); + if (t == node.Target && v == node.Value) { + return node; + } + return Expression.MakeGoto(node.Kind, t, v, node.Type); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitInvocation(InvocationExpression node) { + Expression e = Visit(node.Expression); + Expression[] a = VisitArguments(node); + if (e == node.Expression && a == null) { + return node; + } + + return node.Rewrite(e, a); + } + + /// + /// Visits the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected virtual LabelTarget VisitLabelTarget(LabelTarget node) { + return node; + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitLabel(LabelExpression node) { + LabelTarget l = VisitLabelTarget(node.Target); + Expression d = Visit(node.DefaultValue); + if (l == node.Target && d == node.DefaultValue) { + return node; + } + return Expression.Label(l, d); + } + + /// + /// Visits the children of the . + /// + /// The type of the delegate. + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitLambda(Expression node) { + Expression b = Visit(node.Body); + var p = VisitAndConvert(node.Parameters, "VisitLambda"); + if (b == node.Body && p == node.Parameters) { + return node; + } + return Expression.Lambda(b, node.Name, node.TailCall, p); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitLoop(LoopExpression node) { + LabelTarget @break = VisitLabelTarget(node.BreakLabel); + LabelTarget @continue = VisitLabelTarget(node.ContinueLabel); + Expression b = Visit(node.Body); + if (@break == node.BreakLabel && + @continue == node.ContinueLabel && + b == node.Body) { + return node; + } + return Expression.Loop(b, @break, @continue); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitMember(MemberExpression node) { + Expression e = Visit(node.Expression); + if (e == node.Expression) { + return node; + } + return Expression.MakeMemberAccess(e, node.Member); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitIndex(IndexExpression node) { + Expression o = Visit(node.Object); + Expression[] a = VisitArguments(node); + if (o == node.Object && a == null) { + return node; + } + + return node.Rewrite(o, a); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitMethodCall(MethodCallExpression node) { + Expression o = Visit(node.Object); + Expression[] a = VisitArguments((IArgumentProvider)node); + if (o == node.Object && a == null) { + return node; + } + + return node.Rewrite(o, a); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitNewArray(NewArrayExpression node) { + ReadOnlyCollection e = Visit(node.Expressions); + if (e == node.Expressions) { + return node; + } + if (node.NodeType == ExpressionType.NewArrayInit) { + return Expression.NewArrayInit(node.Type.GetElementType(), e); + } + return Expression.NewArrayBounds(node.Type.GetElementType(), e); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1711:IdentifiersShouldNotHaveIncorrectSuffix")] + protected internal virtual Expression VisitNew(NewExpression node) { + ReadOnlyCollection a = Visit(node.Arguments); + if (a == node.Arguments) { + return node; + } + if (node.Members != null) { + return Expression.New(node.Constructor, a, node.Members); + } + return Expression.New(node.Constructor, a); + } + + /// + /// Visits the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitParameter(ParameterExpression node) { + return node; + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitRuntimeVariables(RuntimeVariablesExpression node) { + var v = VisitAndConvert(node.Variables, "VisitRuntimeVariables"); + if (v == node.Variables) { + return node; + } + return Expression.RuntimeVariables(v); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected virtual SwitchCase VisitSwitchCase(SwitchCase node) { + ReadOnlyCollection t = Visit(node.TestValues); + Expression b = Visit(node.Body); + if (t == node.TestValues && b == node.Body) { + return node; + } + return Expression.SwitchCase(b, t); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitSwitch(SwitchExpression node) { + Expression s = Visit(node.SwitchValue); + ReadOnlyCollection c = Visit(node.Cases, VisitSwitchCase); + Expression d = Visit(node.DefaultBody); + if (s == node.SwitchValue && c == node.Cases && d == node.DefaultBody) { + return node; + } + var result = Expression.Switch(node.Type, s, d, node.Comparison, c); + ValidateSwitch(node, result); + return result; + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected virtual CatchBlock VisitCatchBlock(CatchBlock node) { + ParameterExpression v = VisitAndConvert(node.Variable, "VisitCatchBlock"); + Expression f = Visit(node.Filter); + Expression b = Visit(node.Body); + if (v == node.Variable && b == node.Body && f == node.Filter) { + return node; + } + return Expression.MakeCatchBlock(node.Test, v, b, f); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitTry(TryExpression node) { + Expression b = Visit(node.Body); + ReadOnlyCollection h = Visit(node.Handlers, VisitCatchBlock); + Expression y = Visit(node.Finally); + Expression f = Visit(node.Fault); + + if (b == node.Body && + h == node.Handlers && + y == node.Finally && + f == node.Fault) { + return node; + } + return Expression.MakeTry(node.Type, b, y, f, h); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitTypeBinary(TypeBinaryExpression node) { + Expression e = Visit(node.Expression); + if (e == node.Expression) { + return node; + } + if (node.NodeType == ExpressionType.TypeIs) { + return Expression.TypeIs(e, node.TypeOperand); + } + return Expression.TypeEqual(e, node.TypeOperand); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitUnary(UnaryExpression node) { + Expression o = Visit(node.Operand); + if (o == node.Operand) { + return node; + } + var result = Expression.MakeUnary(node.NodeType, o, node.Type, node.Method); + ValidateUnary(node, result); + return result; + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitMemberInit(MemberInitExpression node) { + NewExpression n = VisitAndConvert(node.NewExpression, "VisitMemberInit"); + ReadOnlyCollection bindings = Visit(node.Bindings, VisitMemberBinding); + if (n == node.NewExpression && bindings == node.Bindings) { + return node; + } + return Expression.MemberInit(n, bindings); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected internal virtual Expression VisitListInit(ListInitExpression node) { + NewExpression n = VisitAndConvert(node.NewExpression, "VisitListInit"); + ReadOnlyCollection initializers = Visit(node.Initializers, VisitElementInit); + if (n == node.NewExpression && initializers == node.Initializers) { + return node; + } + return Expression.ListInit(n, initializers); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected virtual ElementInit VisitElementInit(ElementInit node) { + ReadOnlyCollection arguments = Visit(node.Arguments); + if (arguments == node.Arguments) { + return node; + } + return Expression.ElementInit(node.AddMethod, arguments); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected virtual MemberBinding VisitMemberBinding(MemberBinding node) { + switch (node.BindingType) { + case MemberBindingType.Assignment: + return VisitMemberAssignment((MemberAssignment)node); + case MemberBindingType.MemberBinding: + return VisitMemberMemberBinding((MemberMemberBinding)node); + case MemberBindingType.ListBinding: + return VisitMemberListBinding((MemberListBinding)node); + default: + throw Error.UnhandledBindingType(node.BindingType); + } + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected virtual MemberAssignment VisitMemberAssignment(MemberAssignment node) { + Expression e = Visit(node.Expression); + if (e == node.Expression) { + return node; + } + return Expression.Bind(node.Member, e); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected virtual MemberMemberBinding VisitMemberMemberBinding(MemberMemberBinding node) { + ReadOnlyCollection bindings = Visit(node.Bindings, VisitMemberBinding); + if (bindings == node.Bindings) { + return node; + } + return Expression.MemberBind(node.Member, bindings); + } + + /// + /// Visits the children of the . + /// + /// The expression to visit. + /// The modified expression, if it or any subexpression was modified; + /// otherwise, returns the original expression. + protected virtual MemberListBinding VisitMemberListBinding(MemberListBinding node) { + ReadOnlyCollection initializers = Visit(node.Initializers, VisitElementInit); + if (initializers == node.Initializers) { + return node; + } + return Expression.ListBind(node.Member, initializers); + } + + + // + // Prevent some common cases of invalid rewrites. + // + // Essentially, we don't want the rewritten node to be semantically + // bound by the factory, which may do the wrong thing. Instead we + // require derived classes to be explicit about what they want to do if + // types change. + // + private static void ValidateUnary(UnaryExpression before, UnaryExpression after) { + if (before.Method == null) { + if (after.Method != null) { + throw Error.MustRewriteWithoutMethod(after.Method, "VisitUnary"); + } + + ValidateChildType(before.Operand.Type, after.Operand.Type, "VisitUnary"); + } + } + + private static void ValidateBinary(BinaryExpression before, BinaryExpression after) { + if (before.Method == null) { + if (after.Method != null) { + throw Error.MustRewriteWithoutMethod(after.Method, "VisitBinary"); + } + + ValidateChildType(before.Left.Type, after.Left.Type, "VisitBinary"); + ValidateChildType(before.Right.Type, after.Right.Type, "VisitBinary"); + } + } + + // We wouldn't need this if switch didn't infer the method. + private static void ValidateSwitch(SwitchExpression before, SwitchExpression after) { + // If we did not have a method, we don't want to bind to one, + // it might not be the right thing. + if (before.Comparison == null && after.Comparison != null) { + throw Error.MustRewriteWithoutMethod(after.Comparison, "VisitSwitch"); + } + } + + // Value types must stay as the same type, otherwise it's now a + // different operation, e.g. adding two doubles vs adding two ints. + private static void ValidateChildType(Type before, Type after, string methodName) { + if (before.IsValueType) { + if (TypeUtils.AreEquivalent(before, after)) { + // types are the same value type + return; + } + } else if (!after.IsValueType) { + // both are reference types + return; + } + + // Otherwise, it's an invalid type change. + throw Error.MustRewriteChildToSameType(before, after, methodName); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/GotoExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/GotoExpression.cs new file mode 100644 index 00000000000..9b71b08e79e --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/GotoExpression.cs @@ -0,0 +1,362 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Specifies what kind of jump this represents. + /// + public enum GotoExpressionKind { + /// + /// A that represents a jump to some location. + /// + Goto, + /// + /// A that represents a return statement. + /// + Return, + /// + /// A that represents a break statement. + /// + Break, + /// + /// A that represents a continue statement. + /// + Continue, + } + + /// + /// Represents an unconditional jump. This includes return statements, break and continue statements, and other jumps. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.GotoExpressionProxy))] +#endif + public sealed class GotoExpression : Expression { + private readonly GotoExpressionKind _kind; + private readonly Expression _value; + private readonly LabelTarget _target; + private readonly Type _type; + + internal GotoExpression(GotoExpressionKind kind, LabelTarget target, Expression value, Type type) { + _kind = kind; + _value = value; + _target = target; + _type = type; + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _type; } + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Goto; } + } + + /// + /// The value passed to the target, or null if the target is of type + /// System.Void. + /// + public Expression Value { + get { return _value; } + } + + /// + /// The target label where this node jumps to. + /// + public LabelTarget Target { + get { return _target; } + } + + /// + /// The kind of the goto. For information purposes only. + /// + public GotoExpressionKind Kind { + get { return _kind; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitGoto(this); + } + } + + public partial class Expression { + /// + /// Creates a representing a break statement. + /// + /// The that the will jump to. + /// + /// A with equal to Break, + /// the property set to , and a null value to be passed to the target label upon jumping. + /// + public static GotoExpression Break(LabelTarget target) { + return MakeGoto(GotoExpressionKind.Break, target, null, typeof(void)); + } + + /// + /// Creates a representing a break statement. The value passed to the label upon jumping can be specified. + /// + /// The that the will jump to. + /// The value that will be passed to the associated label upon jumping. + /// + /// A with equal to Break, + /// the property set to , + /// and to be passed to the target label upon jumping. + /// + public static GotoExpression Break(LabelTarget target, Expression value) { + return MakeGoto(GotoExpressionKind.Break, target, value, typeof(void)); + } + + /// + /// Creates a representing a break statement with the specified type. + /// + /// The that the will jump to. + /// An to set the property equal to. + /// + /// A with equal to Break, + /// the property set to , + /// and the property set to . + /// + public static GotoExpression Break(LabelTarget target, Type type) { + return MakeGoto(GotoExpressionKind.Break, target, null, type); + } + + /// + /// Creates a representing a break statement with the specified type. + /// The value passed to the label upon jumping can be specified. + /// + /// The that the will jump to. + /// The value that will be passed to the associated label upon jumping. + /// An to set the property equal to. + /// + /// A with equal to Break, + /// the property set to , + /// the property set to , + /// and to be passed to the target label upon jumping. + /// + public static GotoExpression Break(LabelTarget target, Expression value, Type type) { + return MakeGoto(GotoExpressionKind.Break, target, value, type); + } + + /// + /// Creates a representing a continue statement. + /// + /// The that the will jump to. + /// + /// A with equal to Continue, + /// the property set to , + /// and a null value to be passed to the target label upon jumping. + /// + public static GotoExpression Continue(LabelTarget target) { + return MakeGoto(GotoExpressionKind.Continue, target, null, typeof(void)); + } + + /// + /// Creates a representing a continue statement with the specified type. + /// + /// The that the will jump to. + /// An to set the property equal to. + /// + /// A with equal to Continue, + /// the property set to , + /// the property set to , + /// and a null value to be passed to the target label upon jumping. + /// + public static GotoExpression Continue(LabelTarget target, Type type) { + return MakeGoto(GotoExpressionKind.Continue, target, null, type); + } + + /// + /// Creates a representing a return statement. + /// + /// The that the will jump to. + /// + /// A with equal to Return, + /// the property set to , + /// and a null value to be passed to the target label upon jumping. + /// + public static GotoExpression Return(LabelTarget target) { + return MakeGoto(GotoExpressionKind.Return, target, null, typeof(void)); + } + + /// + /// Creates a representing a return statement with the specified type. + /// + /// The that the will jump to. + /// An to set the property equal to. + /// + /// A with equal to Return, + /// the property set to , + /// the property set to , + /// and a null value to be passed to the target label upon jumping. + /// + public static GotoExpression Return(LabelTarget target, Type type) { + return MakeGoto(GotoExpressionKind.Return, target, null, type); + } + + /// + /// Creates a representing a return statement. The value passed to the label upon jumping can be specified. + /// + /// The that the will jump to. + /// The value that will be passed to the associated label upon jumping. + /// + /// A with equal to Continue, + /// the property set to , + /// and to be passed to the target label upon jumping. + /// + public static GotoExpression Return(LabelTarget target, Expression value) { + return MakeGoto(GotoExpressionKind.Return, target, value, typeof(void)); + } + + /// + /// Creates a representing a return statement with the specified type. + /// The value passed to the label upon jumping can be specified. + /// + /// The that the will jump to. + /// The value that will be passed to the associated label upon jumping. + /// An to set the property equal to. + /// + /// A with equal to Continue, + /// the property set to , + /// the property set to , + /// and to be passed to the target label upon jumping. + /// + public static GotoExpression Return(LabelTarget target, Expression value, Type type) { + return MakeGoto(GotoExpressionKind.Return, target, value, type); + } + + /// + /// Creates a representing a goto. + /// + /// The that the will jump to. + /// + /// A with equal to Goto, + /// the property set to the specified value, + /// and a null value to be passed to the target label upon jumping. + /// + public static GotoExpression Goto(LabelTarget target) { + return MakeGoto(GotoExpressionKind.Goto, target, null, typeof(void)); + } + + /// + /// Creates a representing a goto with the specified type. + /// + /// The that the will jump to. + /// An to set the property equal to. + /// + /// A with equal to Goto, + /// the property set to the specified value, + /// the property set to , + /// and a null value to be passed to the target label upon jumping. + /// + public static GotoExpression Goto(LabelTarget target, Type type) { + return MakeGoto(GotoExpressionKind.Goto, target, null, type); + } + + /// + /// Creates a representing a goto. The value passed to the label upon jumping can be specified. + /// + /// The that the will jump to. + /// The value that will be passed to the associated label upon jumping. + /// + /// A with equal to Goto, + /// the property set to , + /// and to be passed to the target label upon jumping. + /// + public static GotoExpression Goto(LabelTarget target, Expression value) { + return MakeGoto(GotoExpressionKind.Goto, target, value, typeof(void)); + } + + /// + /// Creates a representing a goto with the specified type. + /// The value passed to the label upon jumping can be specified. + /// + /// The that the will jump to. + /// The value that will be passed to the associated label upon jumping. + /// An to set the property equal to. + /// + /// A with equal to Goto, + /// the property set to , + /// the property set to , + /// and to be passed to the target label upon jumping. + /// + public static GotoExpression Goto(LabelTarget target, Expression value, Type type) { + return MakeGoto(GotoExpressionKind.Goto, target, value, type); + } + + /// + /// Creates a representing a jump of the specified . + /// The value passed to the label upon jumping can also be specified. + /// + /// The of the . + /// The that the will jump to. + /// The value that will be passed to the associated label upon jumping. + /// An to set the property equal to. + /// + /// A with equal to , + /// the property set to , + /// the property set to , + /// and to be passed to the target label upon jumping. + /// + public static GotoExpression MakeGoto(GotoExpressionKind kind, LabelTarget target, Expression value, Type type) { + ValidateGoto(target, ref value, "target", "value"); + return new GotoExpression(kind, target, value, type); + } + + private static void ValidateGoto(LabelTarget target, ref Expression value, string targetParameter, string valueParameter) { + ContractUtils.RequiresNotNull(target, targetParameter); + if (value == null) { + ContractUtils.Requires(target.Type == typeof(void), Strings.LabelMustBeVoidOrHaveExpression); + } else { + ValidateGotoType(target.Type, ref value, valueParameter); + } + } + + // Standard argument validation, taken from ValidateArgumentTypes + private static void ValidateGotoType(Type expectedType, ref Expression value, string paramName) { + RequiresCanRead(value, paramName); + if (expectedType != typeof(void)) { + if (!TypeUtils.AreReferenceAssignable(expectedType, value.Type)) { + // C# autoquotes return values, so we'll do that here + if (TypeUtils.IsSameOrSubclass(typeof(LambdaExpression), expectedType) && + expectedType.IsAssignableFrom(value.GetType())) { + value = Expression.Quote(value); + } + throw Error.ExpressionTypeDoesNotMatchLabel(value.Type, expectedType); + } + } + } + + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/IArgumentProvider.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/IArgumentProvider.cs new file mode 100644 index 00000000000..87da3a6f43c --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/IArgumentProvider.cs @@ -0,0 +1,80 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ + +#if CODEPLEX_40 +using System; +#else +using System; using Microsoft; +#endif +using System.Collections.Generic; +using System.Text; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Provides an internal interface for accessing the arguments that multiple tree + /// nodes (DynamicExpression, ElementInit, MethodCallExpression, InvocationExpression, NewExpression, + /// and InexExpression). + /// + /// This enables two optimizations which reduce the size of the trees. The first is it enables + /// the nodes to hold onto an IList of T instead of a ReadOnlyCollection. This saves the cost + /// of allocating the ReadOnlyCollection for each node. The second is that it enables specialized + /// subclasses to be created which hold onto a specific number of arguments. For example Block2, + /// Block3, Block4. These nodes can therefore avoid allocating both a ReadOnlyCollection and an + /// array for storing their elements saving 32 bytes per node. + /// + /// Meanwhile the nodes can continue to expose the original LINQ properties of ReadOnlyCollections. They + /// do this by re-using 1 field for storing both the array or an element that would normally be stored + /// in the array. + /// + /// For the array case the collection is typed to IList of T instead of ReadOnlyCollection of T. + /// When the node is initially constructed it is an array. When the compiler accesses the members it + /// uses this interface. If a user accesses the members the array is promoted to a ReadOnlyCollection. + /// + /// For the object case we store the 1st argument in a field typed to object and when the node is initially + /// constructed this holds directly onto the Expression. When the compiler accesses the members + /// it again uses this interface and the accessor for the 1st argument uses Expression.ReturnObject to + /// return the object which handles the Expression or ReadOnlyCollection case. When the user accesses + /// the ReadOnlyCollection then the object field is updated to hold directly onto the ReadOnlyCollection. + /// + /// It is important that the Expressions consistently return the same ReadOnlyCollection otherwise the + /// re-writer will be broken and it would be a breaking change from LINQ v1. The problem is that currently + /// users can rely on object identity to tell if the node has changed. Storing the readonly collection in + /// an overloaded field enables us to both reduce memory usage as well as maintain compatibility and an + /// easy to use external API. + /// + internal interface IArgumentProvider { + Expression GetArgument(int index); + int ArgumentCount { + get; + } + } + + static class ArgumentProviderOps { + internal static T[] Map(this IArgumentProvider collection, Func select) { + int count = collection.ArgumentCount; + T[] result = new T[count]; + count = 0; + for (int i = 0; i < count; i++) { + result[i] = select(collection.GetArgument(i)); + } + return result; + } + + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/IndexExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/IndexExpression.cs new file mode 100644 index 00000000000..f067615eef2 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/IndexExpression.cs @@ -0,0 +1,446 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Text; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents indexing a property or array. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.IndexExpressionProxy))] +#endif + public sealed class IndexExpression : Expression, IArgumentProvider { + private readonly Expression _instance; + private readonly PropertyInfo _indexer; + private IList _arguments; + + internal IndexExpression( + Expression instance, + PropertyInfo indexer, + IList arguments) { + + if (indexer == null) { + Debug.Assert(instance != null && instance.Type.IsArray); + Debug.Assert(instance.Type.GetArrayRank() == arguments.Count); + } + + _instance = instance; + _indexer = indexer; + _arguments = arguments; + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Index; } + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { + if (_indexer != null) { + return _indexer.PropertyType; + } + return _instance.Type.GetElementType(); + } + } + + /// + /// An object to index. + /// + public Expression Object { + get { return _instance; } + } + + /// + /// Gets the for the property if the expression represents an indexed property, returns null otherwise. + /// + public PropertyInfo Indexer { + get { return _indexer; } + } + + /// + /// Gets the arguments to be used to index the property or array. + /// + public ReadOnlyCollection Arguments { + get { return ReturnReadOnly(ref _arguments); } + } + + Expression IArgumentProvider.GetArgument(int index) { + return _arguments[index]; + } + + int IArgumentProvider.ArgumentCount { + get { + return _arguments.Count; + } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitIndex(this); + } + + internal Expression Rewrite(Expression instance, Expression[] arguments) { + Debug.Assert(instance != null); + Debug.Assert(arguments == null || arguments.Length == _arguments.Count); + + return Expression.MakeIndex(instance, _indexer, arguments ?? _arguments); + } + } + + public partial class Expression { + + /// + /// Creates an that represents accessing an indexed property in an object. + /// + /// The object to which the property belongs. Should be null if the property is static(shared). + /// An representing the property to index. + /// An IEnumerable{Expression} contaning the arguments to be used to index the property. + /// The created . + public static IndexExpression MakeIndex(Expression instance, PropertyInfo indexer, IEnumerable arguments) { + if (indexer != null) { + return Property(instance, indexer, arguments); + } else { + return ArrayAccess(instance, arguments); + } + } + + #region ArrayAccess + + /// + /// Creates an to access an array. + /// + /// An expression representing the array to index. + /// An array containing expressions used to index the array. + /// The expression representing the array can be obtained by using the MakeMemberAccess method, + /// or through NewArrayBounds or NewArrayInit. + /// The created . + public static IndexExpression ArrayAccess(Expression array, params Expression[] indexes) { + return ArrayAccess(array, (IEnumerable)indexes); + } + + /// + /// Creates an to access an array. + /// + /// An expression representing the array to index. + /// An containing expressions used to index the array. + /// The expression representing the array can be obtained by using the MakeMemberAccess method, + /// or through NewArrayBounds or NewArrayInit. + /// The created . + public static IndexExpression ArrayAccess(Expression array, IEnumerable indexes) { + RequiresCanRead(array, "array"); + + Type arrayType = array.Type; + if (!arrayType.IsArray) { + throw Error.ArgumentMustBeArray(); + } + + var indexList = indexes.ToReadOnly(); + if (arrayType.GetArrayRank() != indexList.Count) { + throw Error.IncorrectNumberOfIndexes(); + } + + foreach (Expression e in indexList) { + RequiresCanRead(e, "indexes"); + if (e.Type != typeof(int)) { + throw Error.ArgumentMustBeArrayIndexType(); + } + } + + return new IndexExpression(array, null, indexList); + } + + #endregion + + #region Property + /// + /// Creates an representing the access to an indexed property. + /// + /// The object to which the property belongs. If the property is static/shared, it must be null. + /// The name of the indexer. + /// An array of objects that are used to index the property. + /// The created . + public static IndexExpression Property(Expression instance, string propertyName, params Expression[] arguments) { + RequiresCanRead(instance, "instance"); + ContractUtils.RequiresNotNull(propertyName, "indexerName"); + PropertyInfo pi = FindInstanceProperty(instance.Type, propertyName, arguments); + return Property(instance, pi, arguments); + } + + #region methods for finding a PropertyInfo by its name + /// + /// The method finds the instance property with the specified name in a type. The property's type signature needs to be compatible with + /// the arguments if it is a indexer. If the arguments is null or empty, we get a normal property. + /// + private static PropertyInfo FindInstanceProperty(Type type, string propertyName, Expression[] arguments) { + // bind to public names first + BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy; + PropertyInfo pi = FindProperty(type, propertyName, arguments, flags); + if (pi == null) { + flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy; + pi = FindProperty(type, propertyName, arguments, flags); + } + if (pi == null) { + if (arguments == null || arguments.Length == 0) { + throw Error.InstancePropertyWithoutParameterNotDefinedForType(propertyName, type); + } else { + throw Error.InstancePropertyWithSpecifiedParametersNotDefinedForType(propertyName, GetArgTypesString(arguments), type); + } + } + return pi; + } + + private static string GetArgTypesString(Expression[] arguments) { + StringBuilder argTypesStr = new StringBuilder(); + var isFirst = true; + argTypesStr.Append("("); + foreach (var t in arguments.Select(arg => arg.Type)) { + if (!isFirst) { + argTypesStr.Append(", "); + } + argTypesStr.Append(t.Name); + isFirst = false; + } + argTypesStr.Append(")"); + return argTypesStr.ToString(); + } + + private static PropertyInfo FindProperty(Type type, string propertyName, Expression[] arguments, BindingFlags flags) { + MemberInfo[] members = type.FindMembers(MemberTypes.Property, flags, Type.FilterNameIgnoreCase, propertyName); + if (members == null || members.Length == 0) + return null; + + PropertyInfo pi; + var propertyInfos = members.Map(t => (PropertyInfo)t); + int count = FindBestProperty(propertyInfos, arguments, out pi); + + if (count == 0) + return null; + if (count > 1) + throw Error.PropertyWithMoreThanOneMatch(propertyName, type); + return pi; + } + + private static int FindBestProperty(IEnumerable properties, Expression[] args, out PropertyInfo property) { + int count = 0; + property = null; + foreach (PropertyInfo pi in properties) { + if (pi != null && IsCompatible(pi, args)) { + if (property == null) { + property = pi; + count = 1; + } + else { + count++; + } + } + } + return count; + } + + private static bool IsCompatible(PropertyInfo pi, Expression[] args) { + MethodInfo mi; + + mi = pi.GetGetMethod(true); + ParameterInfo[] parms; + if (mi != null) { + parms = mi.GetParametersCached(); + } else { + mi = pi.GetSetMethod(true); + //The setter has an additional parameter for the value to set, + //need to remove the last type to match the arguments. + parms = mi.GetParametersCached().RemoveLast(); + } + + if (mi == null) { + return false; + } + if (args == null) { + return parms.Length == 0; + } + + if (parms.Length != args.Length) + return false; + for (int i = 0; i < args.Length; i++) { + if (args[i] == null) return false; + if (!TypeUtils.AreReferenceAssignable(parms[i].ParameterType, args[i].Type)) { + return false; + } + } + return true; + } + #endregion + + /// + /// Creates an representing the access to an indexed property. + /// + /// The object to which the property belongs. If the property is static/shared, it must be null. + /// The that represents the property to index. + /// An array of objects that are used to index the property. + /// The created . + public static IndexExpression Property(Expression instance, PropertyInfo indexer, params Expression[] arguments) { + return Property(instance, indexer, (IEnumerable)arguments); + } + + /// + /// Creates an representing the access to an indexed property. + /// + /// The object to which the property belongs. If the property is static/shared, it must be null. + /// The that represents the property to index. + /// An of objects that are used to index the property. + /// The created . + public static IndexExpression Property(Expression instance, PropertyInfo indexer, IEnumerable arguments) { + var argList = arguments.ToReadOnly(); + ValidateIndexedProperty(instance, indexer, ref argList); + return new IndexExpression(instance, indexer, argList); + } + + // CTS places no restrictions on properties (see ECMA-335 8.11.3), + // so we validate that the property conforms to CLS rules here. + // + // Does reflection help us out at all? Expression.Property skips all of + // these checks, so either it needs more checks or we need less here. + private static void ValidateIndexedProperty(Expression instance, PropertyInfo property, ref ReadOnlyCollection argList) { + + // If both getter and setter specified, all their parameter types + // should match, with exception of the last setter parameter which + // should match the type returned by the get method. + // Accessor parameters cannot be ByRef. + + ContractUtils.RequiresNotNull(property, "property"); + ContractUtils.Requires(!property.PropertyType.IsByRef, "property", Strings.PropertyCannotHaveRefType); + ContractUtils.Requires(property.PropertyType != typeof(void), "property", Strings.PropertyTypeCannotBeVoid); + + ParameterInfo[] getParameters = null; + MethodInfo getter = property.GetGetMethod(true); + if (getter != null) { + getParameters = getter.GetParametersCached(); + ValidateAccessor(instance, getter, getParameters, ref argList); + } + + MethodInfo setter = property.GetSetMethod(true); + if (setter != null) { + ParameterInfo[] setParameters = setter.GetParametersCached(); + ContractUtils.Requires(setParameters.Length > 0, "property", Strings.SetterHasNoParams); + + // valueType is the type of the value passed to the setter (last parameter) + Type valueType = setParameters[setParameters.Length - 1].ParameterType; + ContractUtils.Requires(!valueType.IsByRef, "property", Strings.PropertyCannotHaveRefType); + ContractUtils.Requires(setter.ReturnType == typeof(void), "property", Strings.SetterMustBeVoid); + ContractUtils.Requires(property.PropertyType == valueType, "property", Strings.PropertyTyepMustMatchSetter); + + if (getter != null) { + ContractUtils.Requires(!(getter.IsStatic ^ setter.IsStatic), "property", Strings.BothAccessorsMustBeStatic); + ContractUtils.Requires(getParameters.Length == setParameters.Length - 1, "property", Strings.IndexesOfSetGetMustMatch); + + for (int i = 0; i < getParameters.Length; i++) { + ContractUtils.Requires(getParameters[i].ParameterType == setParameters[i].ParameterType, "property", Strings.IndexesOfSetGetMustMatch); + } + } else { + ValidateAccessor(instance, setter, setParameters.RemoveLast(), ref argList); + } + } + + if (getter == null && setter == null) { + throw Error.PropertyDoesNotHaveAccessor(property); + } + } + + private static void ValidateAccessor(Expression instance, MethodInfo method, ParameterInfo[] indexes, ref ReadOnlyCollection arguments) { + ContractUtils.RequiresNotNull(arguments, "arguments"); + + ValidateMethodInfo(method); + ContractUtils.Requires((method.CallingConvention & CallingConventions.VarArgs) == 0, "method", Strings.AccessorsCannotHaveVarArgs); + if (method.IsStatic) { + ContractUtils.Requires(instance == null, "instance", Strings.OnlyStaticMethodsHaveNullInstance); + } else { + ContractUtils.Requires(instance != null, "method", Strings.OnlyStaticMethodsHaveNullInstance); + RequiresCanRead(instance, "instance"); + ValidateCallInstanceType(instance.Type, method); + } + + ValidateAccessorArgumentTypes(method, indexes, ref arguments); + } + + private static void ValidateAccessorArgumentTypes(MethodInfo method, ParameterInfo[] indexes, ref ReadOnlyCollection arguments) { + if (indexes.Length > 0) { + if (indexes.Length != arguments.Count) { + throw Error.IncorrectNumberOfMethodCallArguments(method); + } + Expression[] newArgs = null; + for (int i = 0, n = indexes.Length; i < n; i++) { + Expression arg = arguments[i]; + ParameterInfo pi = indexes[i]; + RequiresCanRead(arg, "arguments"); + + Type pType = pi.ParameterType; + ContractUtils.Requires(!pType.IsByRef, "indexes", Strings.AccessorsCannotHaveByRefArgs); + TypeUtils.ValidateType(pType); + + if (!TypeUtils.AreReferenceAssignable(pType, arg.Type)) { + if (TypeUtils.IsSameOrSubclass(typeof(LambdaExpression), pType) && pType.IsAssignableFrom(arg.GetType())) { + arg = Expression.Quote(arg); + } else { + throw Error.ExpressionTypeDoesNotMatchMethodParameter(arg.Type, pType, method); + } + } + if (newArgs == null && arg != arguments[i]) { + newArgs = new Expression[arguments.Count]; + for (int j = 0; j < i; j++) { + newArgs[j] = arguments[j]; + } + } + if (newArgs != null) { + newArgs[i] = arg; + } + } + if (newArgs != null) { + arguments = new TrueReadOnlyCollection(newArgs); + } + + } else if (arguments.Count > 0) { + throw Error.IncorrectNumberOfMethodCallArguments(method); + } + } + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/InvocationExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/InvocationExpression.cs new file mode 100644 index 00000000000..c4d8b4aa0b8 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/InvocationExpression.cs @@ -0,0 +1,189 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents an expression that applies a delegate or lambda expression to a list of argument expressions. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.InvocationExpressionProxy))] +#endif + public sealed class InvocationExpression : Expression, IArgumentProvider { + private IList _arguments; + private readonly Expression _lambda; + private readonly Type _returnType; + + internal InvocationExpression(Expression lambda, IList arguments, Type returnType) { + _lambda = lambda; + _arguments = arguments; + _returnType = returnType; + } + + /// + /// Gets the static type of the expression that this represents. + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _returnType; } + } + + /// + /// Returns the node type of this Expression. Extension nodes should return + /// ExpressionType.Extension when overriding this method. + /// + /// The of the expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Invoke; } + } + + /// + /// Gets the delegate or lambda expression to be applied. + /// + public Expression Expression { + get { return _lambda; } + } + + /// + /// Gets the arguments that the delegate or lambda expression is applied to. + /// + public ReadOnlyCollection Arguments { + get { return ReturnReadOnly(ref _arguments); } + } + + Expression IArgumentProvider.GetArgument(int index) { + return _arguments[index]; + } + + int IArgumentProvider.ArgumentCount { + get { + return _arguments.Count; + } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitInvocation(this); + } + + internal InvocationExpression Rewrite(Expression lambda, Expression[] arguments) { + Debug.Assert(lambda != null); + Debug.Assert(arguments == null || arguments.Length == _arguments.Count); + + return Expression.Invoke(lambda, arguments ?? _arguments); + } + + internal LambdaExpression LambdaOperand { + get { + return (_lambda.NodeType == ExpressionType.Quote) + ? (LambdaExpression)((UnaryExpression)_lambda).Operand + : (_lambda as LambdaExpression); + } + } + } + + public partial class Expression { + + /// + ///Creates an that + ///applies a delegate or lambda expression to a list of argument expressions. + /// + /// + ///An that + ///applies the specified delegate or lambda expression to the provided arguments. + /// + /// + ///An that represents the delegate + ///or lambda expression to be applied. + /// + /// + ///An array of objects + ///that represent the arguments that the delegate or lambda expression is applied to. + /// + /// + /// is null. + /// + ///.Type does not represent a delegate type or an .-or-The property of an element of is not assignable to the type of the corresponding parameter of the delegate represented by . + /// + /// does not contain the same number of elements as the list of parameters for the delegate represented by . + public static InvocationExpression Invoke(Expression expression, params Expression[] arguments) { + return Invoke(expression, (IEnumerable)arguments); + } + + /// + ///Creates an that + ///applies a delegate or lambda expression to a list of argument expressions. + /// + /// + ///An that + ///applies the specified delegate or lambda expression to the provided arguments. + /// + /// + ///An that represents the delegate + ///or lambda expression to be applied. + /// + /// + ///An of objects + ///that represent the arguments that the delegate or lambda expression is applied to. + /// + /// + /// is null. + /// + ///.Type does not represent a delegate type or an .-or-The property of an element of is not assignable to the type of the corresponding parameter of the delegate represented by . + /// + /// does not contain the same number of elements as the list of parameters for the delegate represented by . + public static InvocationExpression Invoke(Expression expression, IEnumerable arguments) { + RequiresCanRead(expression, "expression"); + + var args = arguments.ToReadOnly(); + var mi = GetInvokeMethod(expression); + ValidateArgumentTypes(mi, ExpressionType.Invoke, ref args); + return new InvocationExpression(expression, args, mi.ReturnType); + } + + /// + /// Gets the delegate's Invoke method; used by InvocationExpression. + /// + /// The expression to be invoked. + internal static MethodInfo GetInvokeMethod(Expression expression) { + Type delegateType = expression.Type; + if (delegateType == typeof(Delegate)) { + throw Error.ExpressionTypeNotInvocable(delegateType); + } else if (!typeof(Delegate).IsAssignableFrom(expression.Type)) { + Type exprType = TypeUtils.FindGenericType(typeof(Expression<>), expression.Type); + if (exprType == null) { + throw Error.ExpressionTypeNotInvocable(expression.Type); + } + delegateType = exprType.GetGenericArguments()[0]; + } + + return delegateType.GetMethod("Invoke"); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LabelExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LabelExpression.cs new file mode 100644 index 00000000000..6963b7e7c20 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LabelExpression.cs @@ -0,0 +1,100 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents a label, which can be placed in any context. If + /// it is jumped to, it will get the value provided by the corresponding + /// . Otherwise, it gets the value in . If the + /// equals System.Void, no value should be provided. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.LabelExpressionProxy))] +#endif + public sealed class LabelExpression : Expression { + private readonly Expression _defaultValue; + private readonly LabelTarget _target; + + internal LabelExpression(LabelTarget label, Expression defaultValue) { + _target = label; + _defaultValue = defaultValue; + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _target.Type; } + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Label; } + } + + /// + /// The which this label is associated with. + /// + public LabelTarget Target { + get { return _target; } + } + + /// + /// The value of the when the label is reached through + /// normal control flow (e.g. is not jumped to). + /// + public Expression DefaultValue { + get { return _defaultValue; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitLabel(this); + } + } + + public partial class Expression { + /// + /// Creates a representing a label with no default value. + /// + /// The which this will be associated with. + /// A with no default value. + public static LabelExpression Label(LabelTarget target) { + return Label(target, null); + } + + /// + /// Creates a representing a label with the given default value. + /// + /// The which this will be associated with. + /// The value of this when the label is reached through normal control flow. + /// A with the given default value. + public static LabelExpression Label(LabelTarget target, Expression defaultValue) { + ValidateGoto(target, ref defaultValue, "label", "defaultValue"); + return new LabelExpression(target, defaultValue); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LabelTarget.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LabelTarget.cs new file mode 100644 index 00000000000..b5e07e4e84b --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LabelTarget.cs @@ -0,0 +1,107 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Used to denote the target of a . + /// + public sealed class LabelTarget { + private readonly Type _type; + private readonly string _name; + + internal LabelTarget(Type type, string name) { + _type = type; + _name = name; + } + + /// + /// Gets the name of the label. + /// + /// The label's name is provided for information purposes only. + public string Name { + get { return _name; } + } + + /// + /// The type of value that is passed when jumping to the label + /// (or System.Void if no value should be passed). + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods")] + public Type Type { + get { return _type; } + } + + /// + /// Returns a that represents the current . + /// + /// A that represents the current . + public override string ToString() { + return String.IsNullOrEmpty(this.Name) ? "UnamedLabel" : this.Name; + } + } + + public partial class Expression { + /// + /// Creates a representing a label with void type and no name. + /// + /// The new . + public static LabelTarget Label() { + return Label(typeof(void), null); + } + + /// + /// Creates a representing a label with void type and the given name. + /// + /// The name of the label. + /// The new . + public static LabelTarget Label(string name) { + return Label(typeof(void), name); + } + + /// + /// Creates a representing a label with the given type. + /// + /// The type of value that is passed when jumping to the label. + /// The new . + public static LabelTarget Label(Type type) { + return Label(type, null); + } + + /// + /// Creates a representing a label with the given type and name. + /// + /// The type of value that is passed when jumping to the label. + /// The name of the label. + /// The new . + public static LabelTarget Label(Type type, string name) { + ContractUtils.RequiresNotNull(type, "type"); + TypeUtils.ValidateType(type); + return new LabelTarget(type, name); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LambdaExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LambdaExpression.cs new file mode 100644 index 00000000000..5e33e6c1601 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LambdaExpression.cs @@ -0,0 +1,635 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +using System.Linq.Expressions.Compiler; +#else +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions.Compiler; +#endif +using System.Reflection; +using System.Reflection.Emit; +using System.Threading; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Creates a node. + /// This captures a block of code that is similar to a .NET method body. + /// + /// + /// Lambda expressions take input through parameters and are expected to be fully bound. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.LambdaExpressionProxy))] +#endif + public abstract class LambdaExpression : Expression { + private readonly string _name; + private readonly Expression _body; + private readonly ReadOnlyCollection _parameters; + private readonly Type _delegateType; + private readonly bool _tailCall; + + internal LambdaExpression( + Type delegateType, + string name, + Expression body, + bool tailCall, + ReadOnlyCollection parameters + ) { + + Debug.Assert(delegateType != null); + + _name = name; + _body = body; + _parameters = parameters; + _delegateType = delegateType; + _tailCall = tailCall; + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _delegateType; } + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Lambda; } + } + + /// + /// Gets the parameters of the lambda expression. + /// + public ReadOnlyCollection Parameters { + get { return _parameters; } + } + + /// + /// Gets the name of the lambda expression. + /// + /// Used for debugging purposes. + public string Name { + get { return _name; } + } + + /// + /// Gets the body of the lambda expression. + /// + public Expression Body { + get { return _body; } + } + + /// + /// Gets the return type of the lambda expression. + /// + public Type ReturnType { + get { return Type.GetMethod("Invoke").ReturnType; } + } + + /// + /// Gets the value that indicates if the lambda expression will be compiled with + /// tail call optimization. + /// + public bool TailCall { + get { return _tailCall; } + } + + /// + /// Produces a delegate that represents the lambda expression. + /// + /// A delegate containing the compiled version of the lambda. + public Delegate Compile() { + return LambdaCompiler.Compile(this, null); + } + + /// + /// Produces a delegate that represents the lambda expression. + /// + /// Debugging information generator used by the compiler to mark sequence points and annotate local variables. + /// A delegate containing the compiled version of the lambda. + public Delegate Compile(DebugInfoGenerator debugInfoGenerator) { + ContractUtils.RequiresNotNull(debugInfoGenerator, "debugInfoGenerator"); + return LambdaCompiler.Compile(this, debugInfoGenerator); + } + + /// + /// Compiles the lambda into a method definition. + /// + /// A which will be used to hold the lambda's IL. + public void CompileToMethod(MethodBuilder method) { + CompileToMethodInternal(method, null); + } + + /// + /// Compiles the lambda into a method definition and custom debug information. + /// + /// A which will be used to hold the lambda's IL. + /// Debugging information generator used by the compiler to mark sequence points and annotate local variables. + public void CompileToMethod(MethodBuilder method, DebugInfoGenerator debugInfoGenerator) { + ContractUtils.RequiresNotNull(debugInfoGenerator, "debugInfoGenerator"); + CompileToMethodInternal(method, debugInfoGenerator); + } + + private void CompileToMethodInternal(MethodBuilder method, DebugInfoGenerator debugInfoGenerator) { + ContractUtils.RequiresNotNull(method, "method"); + ContractUtils.Requires(method.IsStatic, "method"); + var type = method.DeclaringType as TypeBuilder; + ContractUtils.Requires(type != null, "method", Strings.MethodBuilderDoesNotHaveTypeBuilder); + + LambdaCompiler.Compile(this, method, debugInfoGenerator); + } + + internal abstract LambdaExpression Accept(StackSpiller spiller); + } + + /// + /// Defines a node. + /// This captures a block of code that is similar to a .NET method body. + /// + /// The type of the delegate. + /// + /// Lambda expressions take input through parameters and are expected to be fully bound. + /// + public sealed class Expression : LambdaExpression { + internal Expression(Expression body, string name, bool tailCall, ReadOnlyCollection parameters) + : base(typeof(TDelegate), name, body, tailCall, parameters) { + } + + /// + /// Produces a delegate that represents the lambda expression. + /// + /// A delegate containing the compiled version of the lambda. + public new TDelegate Compile() { + return (TDelegate)(object)LambdaCompiler.Compile(this, null); + } + + /// + /// Produces a delegate that represents the lambda expression. + /// + /// Debugging information generator used by the compiler to mark sequence points and annotate local variables. + /// A delegate containing the compiled version of the lambda. + public new TDelegate Compile(DebugInfoGenerator debugInfoGenerator) { + ContractUtils.RequiresNotNull(debugInfoGenerator, "debugInfoGenerator"); + return (TDelegate)(object)LambdaCompiler.Compile(this, debugInfoGenerator); + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitLambda(this); + } + + internal override LambdaExpression Accept(StackSpiller spiller) { + return spiller.Rewrite(this); + } + + internal static LambdaExpression Create(Expression body, string name, bool tailCall, ReadOnlyCollection parameters) { + return new Expression(body, name, tailCall, parameters); + } + } + + + public partial class Expression { + + /// + /// Creates an Expression{T} given the delegate type. Caches the + /// factory method to speed up repeated creations for the same T. + /// + internal static LambdaExpression CreateLambda(Type delegateType, string name, Expression body, bool tailCall, ReadOnlyCollection parameters) { + // Get or create a delegate to the public Expression.Lambda + // method and call that will be used for creating instances of this + // delegate type + LambdaFactory factory; + + if (_LambdaFactories == null) { + // NOTE: this must be Interlocked assigment since we use _LambdaFactories for locking. + Interlocked.CompareExchange(ref _LambdaFactories, new CacheDict(50), null); + } + + lock (_LambdaFactories) { + if (!_LambdaFactories.TryGetValue(delegateType, out factory)) { + _LambdaFactories[delegateType] = factory = (LambdaFactory)Delegate.CreateDelegate( + typeof(LambdaFactory), + typeof(Expression<>).MakeGenericType(delegateType).GetMethod("Create", BindingFlags.Static | BindingFlags.NonPublic) + ); + } + } + + return factory(body, name, tailCall, parameters); + } + + /// + /// Creates an where the delegate type is known at compile time. + /// + /// The delegate type. + /// An to set the property equal to. + /// An array that contains objects to use to populate the collection. + /// An that has the property equal to and the and properties set to the specified values. + public static Expression Lambda(Expression body, params ParameterExpression[] parameters) { + return Lambda(body, false, (IEnumerable)parameters); + } + + /// + /// Creates an where the delegate type is known at compile time. + /// + /// The delegate type. + /// An to set the property equal to. + /// A that indicates if tail call optimization will be applied when compiling the created expression. + /// An array that contains objects to use to populate the collection. + /// An that has the property equal to and the and properties set to the specified values. + public static Expression Lambda(Expression body, bool tailCall, params ParameterExpression[] parameters) { + return Lambda(body, tailCall, (IEnumerable)parameters); + } + + /// + /// Creates an where the delegate type is known at compile time. + /// + /// The delegate type. + /// An to set the property equal to. + /// An that contains objects to use to populate the collection. + /// An that has the property equal to and the and properties set to the specified values. + public static Expression Lambda(Expression body, IEnumerable parameters) { + return Lambda(body, null, false, parameters); + } + + /// + /// Creates an where the delegate type is known at compile time. + /// + /// The delegate type. + /// An to set the property equal to. + /// A that indicates if tail call optimization will be applied when compiling the created expression. + /// An that contains objects to use to populate the collection. + /// An that has the property equal to and the and properties set to the specified values. + public static Expression Lambda(Expression body, bool tailCall, IEnumerable parameters) { + return Lambda(body, null, tailCall, parameters); + } + + /// + /// Creates an where the delegate type is known at compile time. + /// + /// The delegate type. + /// An to set the property equal to. + /// An that contains objects to use to populate the collection. + /// The name of the lambda. Used for generating debugging info. + /// An that has the property equal to and the and properties set to the specified values. + public static Expression Lambda(Expression body, String name, IEnumerable parameters) { + return Lambda(body, name, false, parameters); + } + + /// + /// Creates an where the delegate type is known at compile time. + /// + /// The delegate type. + /// An to set the property equal to. + /// The name of the lambda. Used for generating debugging info. + /// An that contains objects to use to populate the collection. + /// A that indicates if tail call optimization will be applied when compiling the created expression. + /// An that has the property equal to and the and properties set to the specified values. + public static Expression Lambda(Expression body, String name, bool tailCall, IEnumerable parameters) { + var parameterList = parameters.ToReadOnly(); + ValidateLambdaArgs(typeof(TDelegate), ref body, parameterList); + return new Expression(body, name, tailCall, parameterList); + } + + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// An to set the property equal to. + /// An array that contains objects to use to populate the collection. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Expression body, params ParameterExpression[] parameters) { + return Lambda(body, false, (IEnumerable)parameters); + } + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// An to set the property equal to. + /// A that indicates if tail call optimization will be applied when compiling the created expression. + /// An array that contains objects to use to populate the collection. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Expression body, bool tailCall, params ParameterExpression[] parameters) { + return Lambda(body, tailCall, (IEnumerable)parameters); + } + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// An to set the property equal to. + /// An that contains objects to use to populate the collection. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Expression body, IEnumerable parameters) { + return Lambda(body, null, false, parameters); + } + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// An to set the property equal to. + /// A that indicates if tail call optimization will be applied when compiling the created expression. + /// An that contains objects to use to populate the collection. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Expression body, bool tailCall, IEnumerable parameters) { + return Lambda(body, null, tailCall, parameters); + } + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// An to set the property equal to. + /// An array that contains objects to use to populate the collection. + /// A representing the delegate signature for the lambda. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Type delegateType, Expression body, params ParameterExpression[] parameters) { + return Lambda(delegateType, body, null, false, parameters); + } + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// An to set the property equal to. + /// A that indicates if tail call optimization will be applied when compiling the created expression. + /// An array that contains objects to use to populate the collection. + /// A representing the delegate signature for the lambda. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Type delegateType, Expression body, bool tailCall, params ParameterExpression[] parameters) { + return Lambda(delegateType, body, null, tailCall, parameters); + } + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// An to set the property equal to. + /// An that contains objects to use to populate the collection. + /// A representing the delegate signature for the lambda. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Type delegateType, Expression body, IEnumerable parameters) { + return Lambda(delegateType, body, null, false, parameters); + } + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// An to set the property equal to. + /// A that indicates if tail call optimization will be applied when compiling the created expression. + /// An that contains objects to use to populate the collection. + /// A representing the delegate signature for the lambda. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Type delegateType, Expression body, bool tailCall, IEnumerable parameters) { + return Lambda(delegateType, body, null, tailCall, parameters); + } + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// An to set the property equal to. + /// An that contains objects to use to populate the collection. + /// The name for the lambda. Used for emitting debug information. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Expression body, string name, IEnumerable parameters) { + return Lambda(body, name, false, parameters); + } + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// An to set the property equal to. + /// The name for the lambda. Used for emitting debug information. + /// A that indicates if tail call optimization will be applied when compiling the created expression. + /// An that contains objects to use to populate the collection. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Expression body, string name, bool tailCall, IEnumerable parameters) { + ContractUtils.RequiresNotNull(body, "body"); + + var parameterList = parameters.ToReadOnly(); + + int paramCount = parameterList.Count; + Type[] typeArgs = new Type[paramCount + 1]; + if (paramCount > 0) { + var set = new Set(parameterList.Count); + for (int i = 0; i < paramCount; i++) { + var param = parameterList[i]; + ContractUtils.RequiresNotNull(param, "parameter"); + typeArgs[i] = param.IsByRef ? param.Type.MakeByRefType() : param.Type; + if (set.Contains(param)) { + throw Error.DuplicateVariable(param); + } + set.Add(param); + } + } + typeArgs[paramCount] = body.Type; + + Type delegateType = DelegateHelpers.MakeDelegateType(typeArgs); + + return CreateLambda(delegateType, name, body, tailCall, parameterList); + } + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// An to set the property equal to. + /// An that contains objects to use to populate the collection. + /// The name for the lambda. Used for emitting debug information. + /// A representing the delegate signature for the lambda. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Type delegateType, Expression body, string name, IEnumerable parameters) { + var paramList = parameters.ToReadOnly(); + ValidateLambdaArgs(delegateType, ref body, paramList); + + return CreateLambda(delegateType, name, body, false, paramList); + } + + /// + /// Creates a LambdaExpression by first constructing a delegate type. + /// + /// A representing the delegate signature for the lambda. + /// An to set the property equal to. + /// The name for the lambda. Used for emitting debug information. + /// A that indicates if tail call optimization will be applied when compiling the created expression. + /// An that contains objects to use to populate the collection. + /// A that has the property equal to Lambda and the and properties set to the specified values. + public static LambdaExpression Lambda(Type delegateType, Expression body, string name, bool tailCall, IEnumerable parameters) { + var paramList = parameters.ToReadOnly(); + ValidateLambdaArgs(delegateType, ref body, paramList); + + return CreateLambda(delegateType, name, body, tailCall, paramList); + } + + private static void ValidateLambdaArgs(Type delegateType, ref Expression body, ReadOnlyCollection parameters) { + ContractUtils.RequiresNotNull(delegateType, "delegateType"); + RequiresCanRead(body, "body"); + + if (!typeof(Delegate).IsAssignableFrom(delegateType) || delegateType == typeof(Delegate)) { + throw Error.LambdaTypeMustBeDerivedFromSystemDelegate(); + } + + MethodInfo mi; + lock (_LambdaDelegateCache) { + if (!_LambdaDelegateCache.TryGetValue(delegateType, out mi)) { + _LambdaDelegateCache[delegateType] = mi = delegateType.GetMethod("Invoke"); + } + } + + ParameterInfo[] pis = mi.GetParametersCached(); + + if (pis.Length > 0) { + if (pis.Length != parameters.Count) { + throw Error.IncorrectNumberOfLambdaDeclarationParameters(); + } + var set = new Set(pis.Length); + for (int i = 0, n = pis.Length; i < n; i++) { + ParameterExpression pex = parameters[i]; + ParameterInfo pi = pis[i]; + RequiresCanRead(pex, "parameters"); + Type pType = pi.ParameterType; + if (pex.IsByRef) { + if (!pType.IsByRef) { + //We cannot pass a parameter of T& to a delegate that takes T or any non-ByRef type. + throw Error.ParameterExpressionNotValidAsDelegate(pex.Type.MakeByRefType(), pType); + } + pType = pType.GetElementType(); + } + if (!TypeUtils.AreReferenceAssignable(pex.Type, pType)) { + throw Error.ParameterExpressionNotValidAsDelegate(pex.Type, pType); + } + if (set.Contains(pex)) { + throw Error.DuplicateVariable(pex); + } + set.Add(pex); + } + } else if (parameters.Count > 0) { + throw Error.IncorrectNumberOfLambdaDeclarationParameters(); + } + if (mi.ReturnType != typeof(void) && !TypeUtils.AreReferenceAssignable(mi.ReturnType, body.Type)) { + if (TypeUtils.IsSameOrSubclass(typeof(LambdaExpression), mi.ReturnType) && mi.ReturnType.IsAssignableFrom(body.GetType())) { + body = Expression.Quote(body); + } else { + throw Error.ExpressionTypeDoesNotMatchReturn(body.Type, mi.ReturnType); + } + } + } + + private static bool ValidateTryGetFuncActionArgs(Type[] typeArgs) { + if (typeArgs == null) { + throw new ArgumentNullException("typeArgs"); + } + for (int i = 0, n = typeArgs.Length; i < n; i++) { + var a = typeArgs[i]; + if (a == null) { + throw new ArgumentNullException("typeArgs"); + } + if (a.IsByRef) { + return false; + } + } + return true; + } + + /// + /// Creates a object that represents a generic System.Func delegate type that has specific type arguments. + /// The last type argument specifies the return type of the created delegate. + /// + /// An array of Type objects that specify the type arguments for the System.Func delegate type. + /// The type of a System.Func delegate that has the specified type arguments. + public static Type GetFuncType(params Type[] typeArgs) { + ContractUtils.Requires(ValidateTryGetFuncActionArgs(typeArgs), "typeArgs", Strings.TypeMustNotBeByRef); + + Type result = DelegateHelpers.GetFuncType(typeArgs); + if (result == null) { + throw Error.IncorrectNumberOfTypeArgsForFunc(); + } + return result; + } + + /// + /// Creates a object that represents a generic System.Func delegate type that has specific type arguments. + /// The last type argument specifies the return type of the created delegate. + /// + /// An array of Type objects that specify the type arguments for the System.Func delegate type. + /// When this method returns, contains the generic System.Func delegate type that has specific type arguments. Contains null if there is no generic System.Func delegate that matches the .This parameter is passed uninitialized. + /// true if generic System.Func delegate type was created for specific ; false otherwise. + public static bool TryGetFuncType(Type[] typeArgs, out Type funcType) { + if (ValidateTryGetFuncActionArgs(typeArgs)) { + return (funcType = DelegateHelpers.GetFuncType(typeArgs)) != null; + } + funcType = null; + return false; + } + + /// + /// Creates a object that represents a generic System.Action delegate type that has specific type arguments. + /// + /// An array of Type objects that specify the type arguments for the System.Action delegate type. + /// The type of a System.Action delegate that has the specified type arguments. + public static Type GetActionType(params Type[] typeArgs) { + ContractUtils.Requires(ValidateTryGetFuncActionArgs(typeArgs), "typeArgs", Strings.TypeMustNotBeByRef); + + Type result = DelegateHelpers.GetActionType(typeArgs); + if (result == null) { + throw Error.IncorrectNumberOfTypeArgsForAction(); + } + return result; + } + + /// + /// Creates a object that represents a generic System.Action delegate type that has specific type arguments. + /// + /// An array of Type objects that specify the type arguments for the System.Action delegate type. + /// When this method returns, contains the generic System.Action delegate type that has specific type arguments. Contains null if there is no generic System.Action delegate that matches the .This parameter is passed uninitialized. + /// true if generic System.Action delegate type was created for specific ; false otherwise. + public static bool TryGetActionType(Type[] typeArgs, out Type actionType) { + if (ValidateTryGetFuncActionArgs(typeArgs)) { + return (actionType = DelegateHelpers.GetActionType(typeArgs)) != null; + } + actionType = null; + return false; + } + + /// + /// Gets a object that represents a generic System.Func or System.Action delegate type that has specific type arguments. + /// The last type argument determines the return type of the delegate. If no Func or Action is large enough, it will generate a custom + /// delegate type. + /// + /// The type arguments of the delegate. + /// The delegate type. + /// + /// As with Func, the last argument is the return type. It can be set + /// to System.Void to produce an Action. + public static Type GetDelegateType(params Type[] typeArgs) { + ContractUtils.RequiresNotEmpty(typeArgs, "typeArgs"); + ContractUtils.RequiresNotNullItems(typeArgs, "typeArgs"); + return DelegateHelpers.MakeDelegateType(typeArgs); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ListArgumentProvider.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ListArgumentProvider.cs new file mode 100644 index 00000000000..fefe4121f38 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ListArgumentProvider.cs @@ -0,0 +1,153 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ + +#if CODEPLEX_40 +using System; +#else +using System; using Microsoft; +#endif +using System.Collections.Generic; +using System.Text; +#if CODEPLEX_40 +using System.Linq.Expressions; +using System.Dynamic.Utils; +#else +using Microsoft.Linq.Expressions; +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Provides a wrapper around an IArgumentProvider which exposes the argument providers + /// members out as an IList of Expression. This is used to avoid allocating an array + /// which needs to be stored inside of a ReadOnlyCollection. Instead this type has + /// the same amount of overhead as an array without duplicating the storage of the + /// elements. This ensures that internally we can avoid creating and copying arrays + /// while users of the Expression trees also don't pay a size penalty for this internal + /// optimization. See IArgumentProvider for more general information on the Expression + /// tree optimizations being used here. + /// + class ListArgumentProvider : IList { + private readonly IArgumentProvider _provider; + private readonly Expression _arg0; + + internal ListArgumentProvider(IArgumentProvider provider, Expression arg0) { + _provider = provider; + _arg0 = arg0; + } + + #region IList Members + + public int IndexOf(Expression item) { + if (_arg0 == item) { + return 0; + } + + for (int i = 1; i < _provider.ArgumentCount; i++) { + if (_provider.GetArgument(i) == item) { + return i; + } + } + + return -1; + } + + public void Insert(int index, Expression item) { + throw ContractUtils.Unreachable; + } + + public void RemoveAt(int index) { + throw ContractUtils.Unreachable; + } + + public Expression this[int index] { + get { + if (index == 0) { + return _arg0; + } + + return _provider.GetArgument(index); + } + set { + throw ContractUtils.Unreachable; + } + } + + #endregion + + #region ICollection Members + + public void Add(Expression item) { + throw ContractUtils.Unreachable; + } + + public void Clear() { + throw ContractUtils.Unreachable; + } + + public bool Contains(Expression item) { + return IndexOf(item) != -1; + } + + public void CopyTo(Expression[] array, int arrayIndex) { + array[arrayIndex++] = _arg0; + for (int i = 1; i < _provider.ArgumentCount; i++) { + array[arrayIndex++] = _provider.GetArgument(i); + } + } + + public int Count { + get { return _provider.ArgumentCount; } + } + + public bool IsReadOnly { + get { return true; } + } + + public bool Remove(Expression item) { + throw ContractUtils.Unreachable; + } + + #endregion + + #region IEnumerable Members + + public IEnumerator GetEnumerator() { + yield return _arg0; + + for (int i = 1; i < _provider.ArgumentCount; i++) { + yield return _provider.GetArgument(i); + } + } + + #endregion + + #region IEnumerable Members + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { + yield return _arg0; + + for (int i = 1; i < _provider.ArgumentCount; i++) { + yield return _provider.GetArgument(i); + } + } + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ListInitExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ListInitExpression.cs new file mode 100644 index 00000000000..5d9f18750a3 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ListInitExpression.cs @@ -0,0 +1,224 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents a constructor call that has a collection initializer. + /// + /// + /// Use the factory methods to create a ListInitExpression. + /// The value of the NodeType property of a ListInitExpression is ListInit. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.ListInitExpressionProxy))] +#endif + public sealed class ListInitExpression : Expression { + private readonly NewExpression _newExpression; + private readonly ReadOnlyCollection _initializers; + + internal ListInitExpression(NewExpression newExpression, ReadOnlyCollection initializers) { + _newExpression = newExpression; + _initializers = initializers; + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.ListInit; } + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _newExpression.Type; } + } + + /// + /// Gets a value that indicates whether the expression tree node can be reduced. + /// + public override bool CanReduce { + get { + return true; + } + } + + /// + /// Gets the expression that contains a call to the constructor of a collection type. + /// + public NewExpression NewExpression { + get { return _newExpression; } + } + + /// + /// Gets the element initializers that are used to initialize a collection. + /// + public ReadOnlyCollection Initializers { + get { return _initializers; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitListInit(this); + } + + /// + /// Reduces the binary expression node to a simpler expression. + /// If CanReduce returns true, this should return a valid expression. + /// This method is allowed to return another node which itself + /// must be reduced. + /// + /// The reduced expression. + public override Expression Reduce() { + return MemberInitExpression.ReduceListInit(_newExpression, _initializers, true); + } + } + + + public partial class Expression { + /// + /// Creates a that uses a method named "Add" to add elements to a collection. + /// + /// A to set the property equal to. + /// An array of objects to use to populate the collection. + /// A that has the property equal to ListInit and the property set to the specified value. + public static ListInitExpression ListInit(NewExpression newExpression, params Expression[] initializers) { + ContractUtils.RequiresNotNull(newExpression, "newExpression"); + ContractUtils.RequiresNotNull(initializers, "initializers"); + return ListInit(newExpression, initializers as IEnumerable); + } + + /// + /// Creates a that uses a method named "Add" to add elements to a collection. + /// + /// A to set the property equal to. + /// An that contains objects to use to populate the collection. + /// A that has the property equal to ListInit and the property set to the specified value. + public static ListInitExpression ListInit(NewExpression newExpression, IEnumerable initializers) { + ContractUtils.RequiresNotNull(newExpression, "newExpression"); + ContractUtils.RequiresNotNull(initializers, "initializers"); + + var initializerlist = initializers.ToReadOnly(); + if (initializerlist.Count == 0) { + throw Error.ListInitializerWithZeroMembers(); + } + + MethodInfo addMethod = FindMethod(newExpression.Type, "Add", null, new Expression[] { initializerlist[0] }, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + return ListInit(newExpression, addMethod, initializers); + } + + /// + /// Creates a that uses a specified method to add elements to a collection. + /// + /// A to set the property equal to. + /// A that represents an instance method named "Add" (case insensitive), that adds an element to a collection. + /// An array of objects to use to populate the collection. + /// A that has the property equal to ListInit and the property set to the specified value. + public static ListInitExpression ListInit(NewExpression newExpression, MethodInfo addMethod, params Expression[] initializers) { + if (addMethod == null) { + return ListInit(newExpression, initializers as IEnumerable); + } + ContractUtils.RequiresNotNull(newExpression, "newExpression"); + ContractUtils.RequiresNotNull(initializers, "initializers"); + return ListInit(newExpression, addMethod, initializers as IEnumerable); + } + + /// + /// Creates a that uses a specified method to add elements to a collection. + /// + /// A to set the property equal to. + /// A that represents an instance method named "Add" (case insensitive), that adds an element to a collection. + /// An that contains objects to use to populate the Initializers collection. + /// A that has the property equal to ListInit and the property set to the specified value. + public static ListInitExpression ListInit(NewExpression newExpression, MethodInfo addMethod, IEnumerable initializers) { + if (addMethod == null) { + return ListInit(newExpression, initializers); + } + ContractUtils.RequiresNotNull(newExpression, "newExpression"); + ContractUtils.RequiresNotNull(initializers, "initializers"); + + var initializerlist = initializers.ToReadOnly(); + if (initializerlist.Count == 0) { + throw Error.ListInitializerWithZeroMembers(); + } + ElementInit[] initList = new ElementInit[initializerlist.Count]; + for (int i = 0; i < initializerlist.Count; i++) { + initList[i] = ElementInit(addMethod, initializerlist[i]); + } + return ListInit(newExpression, new TrueReadOnlyCollection(initList)); + } + + /// + /// Creates a that uses specified objects to initialize a collection. + /// + /// A to set the property equal to. + /// An array that contains objects to use to populate the collection. + /// + /// A that has the property equal to ListInit + /// and the and properties set to the specified values. + /// + /// + /// The property of must represent a type that implements . + /// The property of the resulting is equal to newExpression.Type. + /// + public static ListInitExpression ListInit(NewExpression newExpression, params ElementInit[] initializers) { + return ListInit(newExpression, (IEnumerable)initializers); + } + + /// + /// Creates a that uses specified objects to initialize a collection. + /// + /// A to set the property equal to. + /// An that contains objects to use to populate the collection. + /// An that contains objects to use to populate the collection. + /// + /// The property of must represent a type that implements . + /// The property of the resulting is equal to newExpression.Type. + /// + public static ListInitExpression ListInit(NewExpression newExpression, IEnumerable initializers) { + ContractUtils.RequiresNotNull(newExpression, "newExpression"); + ContractUtils.RequiresNotNull(initializers, "initializers"); + var initializerlist = initializers.ToReadOnly(); + if (initializerlist.Count == 0) { + throw Error.ListInitializerWithZeroMembers(); + } + ValidateListInitArgs(newExpression.Type, initializerlist); + return new ListInitExpression(newExpression, initializerlist); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LoopExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LoopExpression.cs new file mode 100644 index 00000000000..13c9b43f480 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/LoopExpression.cs @@ -0,0 +1,123 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents an infinite loop. It can be exited with "break". + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.LoopExpressionProxy))] +#endif + public sealed class LoopExpression : Expression { + private readonly Expression _body; + private readonly LabelTarget _break; + private readonly LabelTarget _continue; + + internal LoopExpression(Expression body, LabelTarget @break, LabelTarget @continue) { + _body = body; + _break = @break; + _continue = @continue; + } + + /// + /// Gets the static type of the expression that this represents. + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _break == null ? typeof(void) : _break.Type; } + } + + /// + /// Returns the node type of this Expression. Extension nodes should return + /// ExpressionType.Extension when overriding this method. + /// + /// The of the expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Loop; } + } + + /// + /// Gets the that is the body of the loop. + /// + public Expression Body { + get { return _body; } + } + + /// + /// Gets the that is used by the loop body as a break statement target. + /// + public LabelTarget BreakLabel { + get { return _break; } + } + + /// + /// Gets the that is used by the loop body as a continue statement target. + /// + public LabelTarget ContinueLabel { + get { return _continue; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitLoop(this); + } + } + + public partial class Expression { + /// + /// Creates a with the given body. + /// + /// The body of the loop. + /// The created . + public static LoopExpression Loop(Expression body) { + return Loop(body, null); + } + + /// + /// Creates a with the given body and break target. + /// + /// The body of the loop. + /// The break target used by the loop body. + /// The created . + public static LoopExpression Loop(Expression body, LabelTarget @break) { + return Loop(body, @break, null); + } + + /// + /// Creates a with the given body. + /// + /// The body of the loop. + /// The break target used by the loop body. + /// The continue target used by the loop body. + /// The created . + public static LoopExpression Loop(Expression body, LabelTarget @break, LabelTarget @continue) { + RequiresCanRead(body, "body"); + ContractUtils.Requires(@continue == null || @continue.Type == typeof(void), "continue", Strings.LabelTypeMustBeVoid); + return new LoopExpression(body, @break, @continue); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberAssignment.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberAssignment.cs new file mode 100644 index 00000000000..c700b6e0524 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberAssignment.cs @@ -0,0 +1,98 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents assignment to a member of an object. + /// + public sealed class MemberAssignment : MemberBinding { + Expression _expression; + internal MemberAssignment(MemberInfo member, Expression expression) +#pragma warning disable 618 + : base(MemberBindingType.Assignment, member) { +#pragma warning restore 618 + _expression = expression; + } + /// + /// Gets the which represents the object whose member is being assigned to. + /// + public Expression Expression { + get { return _expression; } + } + } + + + public partial class Expression { + /// + /// Creates a binding the specified value to the given member. + /// + /// The for the member which is being assigned to. + /// The value to be assigned to . + /// The created . + public static MemberAssignment Bind(MemberInfo member, Expression expression) { + ContractUtils.RequiresNotNull(member, "member"); + RequiresCanRead(expression, "expression"); + Type memberType; + ValidateSettableFieldOrPropertyMember(member, out memberType); + if (!memberType.IsAssignableFrom(expression.Type)) { + throw Error.ArgumentTypesMustMatch(); + } + return new MemberAssignment(member, expression); + } + + /// + /// Creates a binding the specified value to the given property. + /// + /// The for the property which is being assigned to. + /// The value to be assigned to . + /// The created . + public static MemberAssignment Bind(MethodInfo propertyAccessor, Expression expression) { + ContractUtils.RequiresNotNull(propertyAccessor, "propertyAccessor"); + ContractUtils.RequiresNotNull(expression, "expression"); + ValidateMethodInfo(propertyAccessor); + return Bind(GetProperty(propertyAccessor), expression); + } + + + private static void ValidateSettableFieldOrPropertyMember(MemberInfo member, out Type memberType) { + FieldInfo fi = member as FieldInfo; + if (fi == null) { + PropertyInfo pi = member as PropertyInfo; + if (pi == null) { + throw Error.ArgumentMustBeFieldInfoOrPropertInfo(); + } + if (!pi.CanWrite) { + throw Error.PropertyDoesNotHaveSetter(pi); + } + memberType = pi.PropertyType; + } else { + memberType = fi.FieldType; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberBinding.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberBinding.cs new file mode 100644 index 00000000000..7532f71515d --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberBinding.cs @@ -0,0 +1,83 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Describes the binding types that are used in MemberInitExpression objects. + /// + public enum MemberBindingType { + /// + /// A binding that represents initializing a member with the value of an expression. + /// + Assignment, + /// + /// A binding that represents recursively initializing members of a member. + /// + MemberBinding, + /// + /// A binding that represents initializing a member of type or from a list of elements. + /// + ListBinding + } + + /// + /// Provides the base class from which the classes that represent bindings that are used to initialize members of a newly created object derive. + /// + public abstract class MemberBinding { + MemberBindingType _type; + MemberInfo _member; + + /// + /// Initializes an instance of class. + /// + /// The type of member binding. + /// The field or property to be initialized. + [Obsolete("Do not use this constructor. It will be removed in future releases.")] + protected MemberBinding(MemberBindingType type, MemberInfo member) { + _type = type; + _member = member; + } + + /// + /// Gets the type of binding that is represented. + /// + public MemberBindingType BindingType { + get { return _type; } + } + + /// + /// Gets the field or property to be initialized. + /// + public MemberInfo Member { + get { return _member; } + } + + /// + /// Returns a that represents the current . + /// + /// A that represents the current . + public override string ToString() { + return ExpressionStringBuilder.MemberBindingToString(this); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberExpression.cs new file mode 100644 index 00000000000..7f4ac52f81e --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberExpression.cs @@ -0,0 +1,352 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Represents accessing a field or property. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.MemberExpressionProxy))] +#endif + public class MemberExpression : Expression { + private readonly Expression _expression; + + /// + /// Gets the field or property to be accessed. + /// + public MemberInfo Member { + get { return GetMember(); } + } + + /// + /// Gets the containing object of the field or property. + /// + public Expression Expression { + get { return _expression; } + } + + // param order: factories args in order, then other args + internal MemberExpression(Expression expression) { + + _expression = expression; + } + + internal static MemberExpression Make(Expression expression, MemberInfo member) { + if (member.MemberType == MemberTypes.Field) { + FieldInfo fi = (FieldInfo)member; + return new FieldExpression(expression, fi); + } else { + PropertyInfo pi = (PropertyInfo)member; + return new PropertyExpression(expression, pi); + } + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.MemberAccess; } + } + + internal virtual MemberInfo GetMember() { + throw ContractUtils.Unreachable; + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitMember(this); + } + } + + internal class FieldExpression : MemberExpression { + private readonly FieldInfo _field; + + public FieldExpression(Expression expression, FieldInfo member) + : base(expression) { + _field = member; + } + + internal override MemberInfo GetMember() { + return _field; + } + + public sealed override Type Type { + get { return _field.FieldType; } + } + } + + internal class PropertyExpression : MemberExpression { + private readonly PropertyInfo _property; + public PropertyExpression(Expression expression, PropertyInfo member) + : base(expression) { + _property = member; + } + + internal override MemberInfo GetMember() { + return _property; + } + + public sealed override Type Type { + get { return _property.PropertyType; } + } + } + + public partial class Expression { + + #region Field + + /// + /// Creates a accessing a field. + /// + /// The containing object of the field. This can be null for static fields. + /// The field to be accessed. + /// The created . + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1719:ParameterNamesShouldNotMatchMemberNames")] + public static MemberExpression Field(Expression expression, FieldInfo field) { + ContractUtils.RequiresNotNull(field, "field"); + + if (field.IsStatic) { + ContractUtils.Requires(expression == null, "expression", Strings.OnlyStaticFieldsHaveNullInstance); + } else { + ContractUtils.Requires(expression != null, "field", Strings.OnlyStaticFieldsHaveNullInstance); + RequiresCanRead(expression, "expression"); + if (!TypeUtils.AreReferenceAssignable(field.DeclaringType, expression.Type)) { + throw Error.FieldInfoNotDefinedForType(field.DeclaringType, field.Name, expression.Type); + } + } + return MemberExpression.Make(expression, field); + } + + /// + /// Creates a accessing a field. + /// + /// The containing object of the field. This can be null for static fields. + /// The field to be accessed. + /// The created . + public static MemberExpression Field(Expression expression, string fieldName) { + RequiresCanRead(expression, "expression"); + + // bind to public names first + FieldInfo fi = expression.Type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + if (fi == null) { + fi = expression.Type.GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + } + if (fi == null) { + throw Error.InstanceFieldNotDefinedForType(fieldName, expression.Type); + } + return Expression.Field(expression, fi); + } + + + /// + /// Creates a accessing a field. + /// + /// The containing object of the field. This can be null for static fields. + /// The containing the field. + /// The field to be accessed. + /// The created . + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1719:ParameterNamesShouldNotMatchMemberNames")] + public static MemberExpression Field(Expression expression, Type type, string fieldName) { + ContractUtils.RequiresNotNull(type, "type"); + + // bind to public names first + FieldInfo fi = type.GetField(fieldName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + if (fi == null) { + fi = type.GetField(fieldName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + } + + if (fi == null) { + throw Error.FieldNotDefinedForType(fieldName, type); + } + return Expression.Field(expression, fi); + } + #endregion + + #region Property + + /// + /// Creates a accessing a property. + /// + /// The containing object of the property. This can be null for static properties. + /// The property to be accessed. + /// The created . + public static MemberExpression Property(Expression expression, string propertyName) { + RequiresCanRead(expression, "expression"); + ContractUtils.RequiresNotNull(propertyName, "propertyName"); + // bind to public names first + PropertyInfo pi = expression.Type.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + if (pi == null) { + pi = expression.Type.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + } + if (pi == null) { + throw Error.InstancePropertyNotDefinedForType(propertyName, expression.Type); + } + return Property(expression, pi); + } + + /// + /// Creates a accessing a property. + /// + /// The containing object of the property. This can be null for static properties. + /// The containing the property. + /// The property to be accessed. + /// The created . + public static MemberExpression Property(Expression expression, Type type, string propertyName) { + ContractUtils.RequiresNotNull(type, "type"); + ContractUtils.RequiresNotNull(propertyName, "propertyName"); + // bind to public names first + PropertyInfo pi = type.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + if (pi == null) { + pi = type.GetProperty(propertyName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + } + if (pi == null) { + throw Error.PropertyNotDefinedForType(propertyName, type); + } + return Property(expression, pi); + } + + /// + /// Creates a accessing a property. + /// + /// The containing object of the property. This can be null for static properties. + /// The property to be accessed. + /// The created . + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1719:ParameterNamesShouldNotMatchMemberNames")] + public static MemberExpression Property(Expression expression, PropertyInfo property) { + ContractUtils.RequiresNotNull(property, "property"); + + MethodInfo mi = property.GetGetMethod(true) ?? property.GetSetMethod(true); + + if (mi == null) { + throw Error.PropertyDoesNotHaveAccessor(property); + } + + if (mi.IsStatic) { + ContractUtils.Requires(expression == null, "expression", Strings.OnlyStaticPropertiesHaveNullInstance); + } else { + ContractUtils.Requires(expression != null, "property", Strings.OnlyStaticPropertiesHaveNullInstance); + RequiresCanRead(expression, "expression"); + if (!TypeUtils.IsValidInstanceType(property, expression.Type)) { + throw Error.PropertyNotDefinedForType(property, expression.Type); + } + } + return MemberExpression.Make(expression, property); + } + + /// + /// Creates a accessing a property. + /// + /// The containing object of the property. This can be null for static properties. + /// An accessor method of the property to be accessed. + /// The created . + public static MemberExpression Property(Expression expression, MethodInfo propertyAccessor) { + ContractUtils.RequiresNotNull(propertyAccessor, "propertyAccessor"); + ValidateMethodInfo(propertyAccessor); + return Property(expression, GetProperty(propertyAccessor)); + } + + private static PropertyInfo GetProperty(MethodInfo mi) { + Type type = mi.DeclaringType; + BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic; + flags |= (mi.IsStatic) ? BindingFlags.Static : BindingFlags.Instance; + PropertyInfo[] props = type.GetProperties(flags); + foreach (PropertyInfo pi in props) { + if (pi.CanRead && CheckMethod(mi, pi.GetGetMethod(true))) { + return pi; + } + if (pi.CanWrite && CheckMethod(mi, pi.GetSetMethod(true))) { + return pi; + } + } + throw Error.MethodNotPropertyAccessor(mi.DeclaringType, mi.Name); + } + + private static bool CheckMethod(MethodInfo method, MethodInfo propertyMethod) { + if (method == propertyMethod) { + return true; + } + // If the type is an interface then the handle for the method got by the compiler will not be the + // same as that returned by reflection. + // Check for this condition and try and get the method from reflection. + Type type = method.DeclaringType; + if (type.IsInterface && method.Name == propertyMethod.Name && type.GetMethod(method.Name) == propertyMethod) { + return true; + } + return false; + } + + #endregion + + /// + /// Creates a accessing a property or field. + /// + /// The containing object of the member. This can be null for static members. + /// The member to be accessed. + /// The created . + public static MemberExpression PropertyOrField(Expression expression, string propertyOrFieldName) { + RequiresCanRead(expression, "expression"); + // bind to public names first + PropertyInfo pi = expression.Type.GetProperty(propertyOrFieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + if (pi != null) + return Property(expression, pi); + FieldInfo fi = expression.Type.GetField(propertyOrFieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + if (fi != null) + return Field(expression, fi); + pi = expression.Type.GetProperty(propertyOrFieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + if (pi != null) + return Property(expression, pi); + fi = expression.Type.GetField(propertyOrFieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); + if (fi != null) + return Field(expression, fi); + + throw Error.NotAMemberOfType(propertyOrFieldName, expression.Type); + } + + /// + /// Creates a accessing a property or field. + /// + /// The containing object of the member. This can be null for static members. + /// The member to be accessed. + /// The created . + public static MemberExpression MakeMemberAccess(Expression expression, MemberInfo member) { + ContractUtils.RequiresNotNull(member, "member"); + + FieldInfo fi = member as FieldInfo; + if (fi != null) { + return Expression.Field(expression, fi); + } + PropertyInfo pi = member as PropertyInfo; + if (pi != null) { + return Expression.Property(expression, pi); + } + throw Error.MemberNotFieldOrProperty(member); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberInitExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberInitExpression.cs new file mode 100644 index 00000000000..3481b59d2db --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberInitExpression.cs @@ -0,0 +1,171 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents calling a constructor and initializing one or more members of the new object. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.MemberInitExpressionProxy))] +#endif + public sealed class MemberInitExpression : Expression { + private readonly NewExpression _newExpression; + private readonly ReadOnlyCollection _bindings; + + internal MemberInitExpression(NewExpression newExpression, ReadOnlyCollection bindings) { + _newExpression = newExpression; + _bindings = bindings; + } + + /// + /// Gets the static type of the expression that this represents. + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _newExpression.Type; } + } + + /// + /// Gets a value that indicates whether the expression tree node can be reduced. + /// + public override bool CanReduce { + get { + return true; + } + } + + /// + /// Returns the node type of this Expression. Extension nodes should return + /// ExpressionType.Extension when overriding this method. + /// + /// The of the expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.MemberInit; } + } + + ///Gets the expression that represents the constructor call. + ///A that represents the constructor call. + public NewExpression NewExpression { + get { return _newExpression; } + } + + ///Gets the bindings that describe how to initialize the members of the newly created object. + ///A of objects which describe how to initialize the members. + public ReadOnlyCollection Bindings { + get { return _bindings; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitMemberInit(this); + } + + /// + /// Reduces the to a simpler expression. + /// If CanReduce returns true, this should return a valid expression. + /// This method is allowed to return another node which itself + /// must be reduced. + /// + /// The reduced expression. + public override Expression Reduce() { + return ReduceMemberInit(_newExpression, _bindings, true); + } + + internal static Expression ReduceMemberInit(Expression objExpression, ReadOnlyCollection bindings, bool keepOnStack) { + var objVar = Expression.Variable(objExpression.Type, null); + int count = bindings.Count; + var block = new Expression[count + 2]; + block[0] = Expression.Assign(objVar, objExpression); + for (int i = 0; i < count; i++) { + block[i + 1] = ReduceMemberBinding(objVar, bindings[i]); + } + block[count + 1] = keepOnStack ? (Expression)objVar : Expression.Empty(); + return Expression.Block(new TrueReadOnlyCollection(block)); + } + + internal static Expression ReduceListInit(Expression listExpression, ReadOnlyCollection initializers, bool keepOnStack) { + var listVar = Expression.Variable(listExpression.Type, null); + int count = initializers.Count; + var block = new Expression[count + 2]; + block[0] = Expression.Assign(listVar, listExpression); + for (int i = 0; i < count; i++) { + ElementInit element = initializers[i]; + block[i + 1] = Expression.Call(listVar, element.AddMethod, element.Arguments); + } + block[count + 1] = keepOnStack ? (Expression)listVar : Expression.Empty(); + return Expression.Block(new TrueReadOnlyCollection(block)); + } + + internal static Expression ReduceMemberBinding(ParameterExpression objVar, MemberBinding binding) { + MemberExpression member = Expression.MakeMemberAccess(objVar, binding.Member); + switch (binding.BindingType) { + case MemberBindingType.Assignment: + return Expression.Assign(member, ((MemberAssignment)binding).Expression); + case MemberBindingType.ListBinding: + return ReduceListInit(member, ((MemberListBinding)binding).Initializers, false); + case MemberBindingType.MemberBinding: + return ReduceMemberInit(member, ((MemberMemberBinding)binding).Bindings, false); + default: throw ContractUtils.Unreachable; + } + } + } + + public partial class Expression { + ///Creates a . + ///A that has the property equal to and the and properties set to the specified values. + ///A to set the property equal to. + ///An array of objects to use to populate the collection. + /// + /// or is null. + ///The property of an element of does not represent a member of the type that .Type represents. + public static MemberInitExpression MemberInit(NewExpression newExpression, params MemberBinding[] bindings) { + return MemberInit(newExpression, (IEnumerable)bindings); + } + + ///Creates a . + ///A that has the property equal to and the and properties set to the specified values. + ///A to set the property equal to. + ///An that contains objects to use to populate the collection. + /// + /// or is null. + ///The property of an element of does not represent a member of the type that .Type represents. + public static MemberInitExpression MemberInit(NewExpression newExpression, IEnumerable bindings) { + ContractUtils.RequiresNotNull(newExpression, "newExpression"); + ContractUtils.RequiresNotNull(bindings, "bindings"); + var roBindings = bindings.ToReadOnly(); + ValidateMemberInitArgs(newExpression.Type, roBindings); + return new MemberInitExpression(newExpression, roBindings); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberListBinding.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberListBinding.cs new file mode 100644 index 00000000000..e46e58ac9b2 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberListBinding.cs @@ -0,0 +1,128 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Represents initializing the elements of a collection member of a newly created object. + /// + public sealed class MemberListBinding : MemberBinding { + ReadOnlyCollection _initializers; + internal MemberListBinding(MemberInfo member, ReadOnlyCollection initializers) +#pragma warning disable 618 + : base(MemberBindingType.ListBinding, member) { +#pragma warning restore 618 + _initializers = initializers; + } + + /// + /// Gets the element initializers for initializing a collection member of a newly created object. + /// + public ReadOnlyCollection Initializers { + get { return _initializers; } + } + } + + + public partial class Expression { + + ///Creates a where the member is a field or property. + ///A that has the property equal to and the and properties set to the specified values. + ///A that represents a field or property to set the property equal to. + ///An array of objects to use to populate the collection. + /// + /// is null. -or-One or more elements of is null. + /// + /// does not represent a field or property.-or-The or of the field or property that represents does not implement . + public static MemberListBinding ListBind(MemberInfo member, params ElementInit[] initializers) { + ContractUtils.RequiresNotNull(member, "member"); + ContractUtils.RequiresNotNull(initializers, "initializers"); + return ListBind(member, (IEnumerable)initializers); + } + + ///Creates a where the member is a field or property. + ///A that has the property equal to and the and properties set to the specified values. + ///A that represents a field or property to set the property equal to. + ///An that contains objects to use to populate the collection. + /// + /// is null. -or-One or more elements of is null. + /// + /// does not represent a field or property.-or-The or of the field or property that represents does not implement . + public static MemberListBinding ListBind(MemberInfo member, IEnumerable initializers) { + ContractUtils.RequiresNotNull(member, "member"); + ContractUtils.RequiresNotNull(initializers, "initializers"); + Type memberType; + ValidateGettableFieldOrPropertyMember(member, out memberType); + var initList = initializers.ToReadOnly(); + ValidateListInitArgs(memberType, initList); + return new MemberListBinding(member, initList); + } + + ///Creates a object based on a specified property accessor method. + ///A that has the property equal to , the property set to the that represents the property accessed in , and populated with the elements of . + ///A that represents a property accessor method. + ///An array of objects to use to populate the collection. + /// + /// is null. -or-One or more elements of is null. + /// + /// does not represent a property accessor method.-or-The of the property that the method represented by accesses does not implement . + public static MemberListBinding ListBind(MethodInfo propertyAccessor, params ElementInit[] initializers) { + ContractUtils.RequiresNotNull(propertyAccessor, "propertyAccessor"); + ContractUtils.RequiresNotNull(initializers, "initializers"); + return ListBind(propertyAccessor, (IEnumerable)initializers); + } + + ///Creates a based on a specified property accessor method. + ///A that has the property equal to , the property set to the that represents the property accessed in , and populated with the elements of . + ///A that represents a property accessor method. + ///An that contains objects to use to populate the collection. + /// + /// is null. -or-One or more elements of are null. + /// + /// does not represent a property accessor method.-or-The of the property that the method represented by accesses does not implement . + public static MemberListBinding ListBind(MethodInfo propertyAccessor, IEnumerable initializers) { + ContractUtils.RequiresNotNull(propertyAccessor, "propertyAccessor"); + ContractUtils.RequiresNotNull(initializers, "initializers"); + return ListBind(GetProperty(propertyAccessor), initializers); + } + + private static void ValidateListInitArgs(Type listType, ReadOnlyCollection initializers) { + if (!typeof(IEnumerable).IsAssignableFrom(listType)) { + throw Error.TypeNotIEnumerable(listType); + } + for (int i = 0, n = initializers.Count; i < n; i++) { + ElementInit element = initializers[i]; + ContractUtils.RequiresNotNull(element, "initializers"); + ValidateCallInstanceType(listType, element.AddMethod); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberMemberBinding.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberMemberBinding.cs new file mode 100644 index 00000000000..58308c31da7 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MemberMemberBinding.cs @@ -0,0 +1,142 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents initializing members of a member of a newly created object. + /// + /// + /// Use the factory methods to create a . + /// The value of the property of a object is . + /// + public sealed class MemberMemberBinding : MemberBinding { + ReadOnlyCollection _bindings; + internal MemberMemberBinding(MemberInfo member, ReadOnlyCollection bindings) +#pragma warning disable 618 + : base(MemberBindingType.MemberBinding, member) { +#pragma warning restore 618 + _bindings = bindings; + } + + /// + /// Gets the bindings that describe how to initialize the members of a member. + /// + public ReadOnlyCollection Bindings { + get { return _bindings; } + } + } + + + public partial class Expression { + /// + /// Creates a that represents the recursive initialization of members of a field or property. + /// + /// The to set the property equal to. + /// An array of objects to use to populate the collection. + /// A that has the property equal to and the and properties set to the specified values. + public static MemberMemberBinding MemberBind(MemberInfo member, params MemberBinding[] bindings) { + ContractUtils.RequiresNotNull(member, "member"); + ContractUtils.RequiresNotNull(bindings, "bindings"); + return MemberBind(member, (IEnumerable)bindings); + } + + /// + /// Creates a that represents the recursive initialization of members of a field or property. + /// + /// The to set the property equal to. + /// An that contains objects to use to populate the collection. + /// A that has the property equal to and the and properties set to the specified values. + public static MemberMemberBinding MemberBind(MemberInfo member, IEnumerable bindings) { + ContractUtils.RequiresNotNull(member, "member"); + ContractUtils.RequiresNotNull(bindings, "bindings"); + ReadOnlyCollection roBindings = bindings.ToReadOnly(); + Type memberType; + ValidateGettableFieldOrPropertyMember(member, out memberType); + ValidateMemberInitArgs(memberType, roBindings); + return new MemberMemberBinding(member, roBindings); + } + + /// + /// Creates a that represents the recursive initialization of members of a member that is accessed by using a property accessor method. + /// + /// The that represents a property accessor method. + /// An that contains objects to use to populate the collection. + /// + /// A that has the property equal to , + /// the Member property set to the that represents the property accessed in , + /// and properties set to the specified values. + /// + public static MemberMemberBinding MemberBind(MethodInfo propertyAccessor, params MemberBinding[] bindings) { + ContractUtils.RequiresNotNull(propertyAccessor, "propertyAccessor"); + return MemberBind(GetProperty(propertyAccessor), bindings); + } + + /// + /// Creates a that represents the recursive initialization of members of a member that is accessed by using a property accessor method. + /// + /// The that represents a property accessor method. + /// An that contains objects to use to populate the collection. + /// + /// A that has the property equal to , + /// the Member property set to the that represents the property accessed in , + /// and properties set to the specified values. + /// + public static MemberMemberBinding MemberBind(MethodInfo propertyAccessor, IEnumerable bindings) { + ContractUtils.RequiresNotNull(propertyAccessor, "propertyAccessor"); + return MemberBind(GetProperty(propertyAccessor), bindings); + } + + private static void ValidateGettableFieldOrPropertyMember(MemberInfo member, out Type memberType) { + FieldInfo fi = member as FieldInfo; + if (fi == null) { + PropertyInfo pi = member as PropertyInfo; + if (pi == null) { + throw Error.ArgumentMustBeFieldInfoOrPropertInfo(); + } + if (!pi.CanRead) { + throw Error.PropertyDoesNotHaveGetter(pi); + } + memberType = pi.PropertyType; + } else { + memberType = fi.FieldType; + } + } + + private static void ValidateMemberInitArgs(Type type, ReadOnlyCollection bindings) { + for (int i = 0, n = bindings.Count; i < n; i++) { + MemberBinding b = bindings[i]; + ContractUtils.RequiresNotNull(b, "bindings"); + if (!b.Member.DeclaringType.IsAssignableFrom(type)) { + throw Error.NotAMemberOfType(b.Member.Name, type); + } + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MethodCallExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MethodCallExpression.cs new file mode 100644 index 00000000000..1fc2f424b1c --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/MethodCallExpression.cs @@ -0,0 +1,1022 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents a call to either static or an instance method. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.MethodCallExpressionProxy))] +#endif + public class MethodCallExpression : Expression, IArgumentProvider { + private readonly MethodInfo _method; + + internal MethodCallExpression(MethodInfo method) { + + _method = method; + } + + internal virtual Expression GetInstance() { + return null; + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Call; } + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _method.ReturnType; } + } + + /// + /// Gets the for the method to be called. + /// + public MethodInfo Method { + get { return _method; } + } + + /// + /// Gets the that represents the instance + /// for instance method calls or null for static method cals. + /// + public Expression Object { + get { return GetInstance(); } + } + + /// + /// Gets a collection of expressions that represent arguments to the method call. + /// + public ReadOnlyCollection Arguments { + get { return GetOrMakeArguments(); } + } + + internal virtual ReadOnlyCollection GetOrMakeArguments() { + throw ContractUtils.Unreachable; + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitMethodCall(this); + } + + /// + /// Returns a new MethodCallExpression replacing the existing instance/args with the + /// newly provided instance and args. Arguments can be null to use the existing + /// arguments. + /// + /// This helper is provided to allow re-writing of nodes to not depend on the specific optimized + /// subclass of MethodCallExpression which is being used. + /// + internal virtual MethodCallExpression Rewrite(Expression instance, IList args) { + throw ContractUtils.Unreachable; + } + + #region IArgumentProvider Members + + Expression IArgumentProvider.GetArgument(int index) { + throw ContractUtils.Unreachable; + } + + int IArgumentProvider.ArgumentCount { + get { throw ContractUtils.Unreachable; } + } + + #endregion + } + + #region Specialized Subclasses + + internal class MethodCallExpressionN : MethodCallExpression, IArgumentProvider { + private IList _arguments; + + public MethodCallExpressionN(MethodInfo method, IList args) + : base(method) { + _arguments = args; + } + + Expression IArgumentProvider.GetArgument(int index) { + return _arguments[index]; + } + + int IArgumentProvider.ArgumentCount { + get { + return _arguments.Count; + } + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(ref _arguments); + } + + internal override MethodCallExpression Rewrite(Expression instance, IList args) { + Debug.Assert(instance == null); + Debug.Assert(args == null || args.Count == _arguments.Count); + + return Expression.Call(Method, args ?? _arguments); + } + } + + internal class InstanceMethodCallExpressionN : MethodCallExpression, IArgumentProvider { + private IList _arguments; + private readonly Expression _instance; + + public InstanceMethodCallExpressionN(MethodInfo method, Expression instance, IList args) + : base(method) { + _instance = instance; + _arguments = args; + } + + Expression IArgumentProvider.GetArgument(int index) { + return _arguments[index]; + } + + int IArgumentProvider.ArgumentCount { + get { + return _arguments.Count; + } + } + + internal override Expression GetInstance() { + return _instance; + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(ref _arguments); + } + + internal override MethodCallExpression Rewrite(Expression instance, IList args) { + Debug.Assert(instance != null); + Debug.Assert(args == null || args.Count == _arguments.Count); + + return Expression.Call(instance, Method, args ?? _arguments); + } + } + + internal class MethodCallExpression1 : MethodCallExpression, IArgumentProvider { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider + + public MethodCallExpression1(MethodInfo method, Expression arg0) + : base(method) { + _arg0 = arg0; + } + + Expression IArgumentProvider.GetArgument(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + default: throw new InvalidOperationException(); + } + } + + int IArgumentProvider.ArgumentCount { + get { + return 1; + } + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(this, ref _arg0); + } + + internal override MethodCallExpression Rewrite(Expression instance, IList args) { + Debug.Assert(instance == null); + Debug.Assert(args == null || args.Count == 1); + + if (args != null) { + return Expression.Call(Method, args[0]); + } + + return Expression.Call(Method, ReturnObject(_arg0)); + } + } + + internal class MethodCallExpression2 : MethodCallExpression, IArgumentProvider { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider + private readonly Expression _arg1; // storage for the 2nd arg + + public MethodCallExpression2(MethodInfo method, Expression arg0, Expression arg1) + : base(method) { + _arg0 = arg0; + _arg1 = arg1; + } + + Expression IArgumentProvider.GetArgument(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + default: throw new InvalidOperationException(); + } + } + + int IArgumentProvider.ArgumentCount { + get { + return 2; + } + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(this, ref _arg0); + } + + internal override MethodCallExpression Rewrite(Expression instance, IList args) { + Debug.Assert(instance == null); + Debug.Assert(args == null || args.Count == 2); + + if (args != null) { + return Expression.Call(Method, args[0], args[1]); + } + return Expression.Call(Method, ReturnObject(_arg0), _arg1); + } + } + + internal class MethodCallExpression3 : MethodCallExpression, IArgumentProvider { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider + private readonly Expression _arg1, _arg2; // storage for the 2nd - 3rd args. + + public MethodCallExpression3(MethodInfo method, Expression arg0, Expression arg1, Expression arg2) + : base(method) { + _arg0 = arg0; + _arg1 = arg1; + _arg2 = arg2; + } + + Expression IArgumentProvider.GetArgument(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + case 2: return _arg2; + default: throw new InvalidOperationException(); + } + } + + int IArgumentProvider.ArgumentCount { + get { + return 3; + } + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(this, ref _arg0); + } + + internal override MethodCallExpression Rewrite(Expression instance, IList args) { + Debug.Assert(instance == null); + Debug.Assert(args == null || args.Count == 3); + + if (args != null) { + return Expression.Call(Method, args[0], args[1], args[2]); + } + return Expression.Call(Method, ReturnObject(_arg0), _arg1, _arg2); + } + } + + internal class MethodCallExpression4 : MethodCallExpression, IArgumentProvider { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider + private readonly Expression _arg1, _arg2, _arg3; // storage for the 2nd - 4th args. + + public MethodCallExpression4(MethodInfo method, Expression arg0, Expression arg1, Expression arg2, Expression arg3) + : base(method) { + _arg0 = arg0; + _arg1 = arg1; + _arg2 = arg2; + _arg3 = arg3; + } + + Expression IArgumentProvider.GetArgument(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + case 2: return _arg2; + case 3: return _arg3; + default: throw new InvalidOperationException(); + } + } + + int IArgumentProvider.ArgumentCount { + get { + return 4; + } + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(this, ref _arg0); + } + + internal override MethodCallExpression Rewrite(Expression instance, IList args) { + Debug.Assert(instance == null); + Debug.Assert(args == null || args.Count == 4); + + if (args != null) { + return Expression.Call(Method, args[0], args[1], args[2], args[3]); + } + return Expression.Call(Method, ReturnObject(_arg0), _arg1, _arg2, _arg3); + } + } + + internal class MethodCallExpression5 : MethodCallExpression, IArgumentProvider { + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider + private readonly Expression _arg1, _arg2, _arg3, _arg4; // storage for the 2nd - 5th args. + + public MethodCallExpression5(MethodInfo method, Expression arg0, Expression arg1, Expression arg2, Expression arg3, Expression arg4) + : base(method) { + _arg0 = arg0; + _arg1 = arg1; + _arg2 = arg2; + _arg3 = arg3; + _arg4 = arg4; + } + + Expression IArgumentProvider.GetArgument(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + case 2: return _arg2; + case 3: return _arg3; + case 4: return _arg4; + default: throw new InvalidOperationException(); + } + } + + int IArgumentProvider.ArgumentCount { + get { + return 5; + } + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(this, ref _arg0); + } + + internal override MethodCallExpression Rewrite(Expression instance, IList args) { + Debug.Assert(instance == null); + Debug.Assert(args == null || args.Count == 5); + + if (args != null) { + return Expression.Call(Method, args[0], args[1], args[2], args[3], args[4]); + } + + return Expression.Call(Method, ReturnObject(_arg0), _arg1, _arg2, _arg3, _arg4); + } + } + + internal class InstanceMethodCallExpression2 : MethodCallExpression, IArgumentProvider { + private readonly Expression _instance; + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider + private readonly Expression _arg1; // storage for the 2nd argument + + public InstanceMethodCallExpression2(MethodInfo method, Expression instance, Expression arg0, Expression arg1) + : base(method) { + Debug.Assert(instance != null); + + _instance = instance; + _arg0 = arg0; + _arg1 = arg1; + } + + Expression IArgumentProvider.GetArgument(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + default: throw new InvalidOperationException(); + } + } + + int IArgumentProvider.ArgumentCount { + get { + return 2; + } + } + + internal override Expression GetInstance() { + return _instance; + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(this, ref _arg0); + } + + internal override MethodCallExpression Rewrite(Expression instance, IList args) { + Debug.Assert(instance != null); + Debug.Assert(args == null || args.Count == 2); + + if (args != null) { + return Expression.Call(instance, Method, args[0], args[1]); + } + return Expression.Call(instance, Method, ReturnObject(_arg0), _arg1); + } + } + + internal class InstanceMethodCallExpression3 : MethodCallExpression, IArgumentProvider { + private readonly Expression _instance; + private object _arg0; // storage for the 1st argument or a readonly collection. See IArgumentProvider + private readonly Expression _arg1, _arg2; // storage for the 2nd - 3rd argument + + public InstanceMethodCallExpression3(MethodInfo method, Expression instance, Expression arg0, Expression arg1, Expression arg2) + : base(method) { + Debug.Assert(instance != null); + + _instance = instance; + _arg0 = arg0; + _arg1 = arg1; + _arg2 = arg2; + } + + Expression IArgumentProvider.GetArgument(int index) { + switch (index) { + case 0: return ReturnObject(_arg0); + case 1: return _arg1; + case 2: return _arg2; + default: throw new InvalidOperationException(); + } + } + + int IArgumentProvider.ArgumentCount { + get { + return 3; + } + } + + internal override Expression GetInstance() { + return _instance; + } + + internal override ReadOnlyCollection GetOrMakeArguments() { + return ReturnReadOnly(this, ref _arg0); + } + + internal override MethodCallExpression Rewrite(Expression instance, IList args) { + Debug.Assert(instance != null); + Debug.Assert(args == null || args.Count == 3); + + if (args != null) { + return Expression.Call(instance, Method, args[0], args[1], args[2]); + } + return Expression.Call(instance, Method, ReturnObject(_arg0), _arg1, _arg2); + } + } + + #endregion + + public partial class Expression { + + #region Call + + ///Creates a that represents a call to a static method that takes one argument. + ///A that has the property equal to and the and properties set to the specified values. + ///A to set the property equal to. + ///The that represents the first argument. + /// + /// is null. + public static MethodCallExpression Call(MethodInfo method, Expression arg0) { + ContractUtils.RequiresNotNull(method, "method"); + ContractUtils.RequiresNotNull(arg0, "arg0"); + + ParameterInfo[] pis = ValidateMethodAndGetParameters(null, method); + + ValidateArgumentCount(method, ExpressionType.Call, 1, pis); + + arg0 = ValidateOneArgument(method, ExpressionType.Call, arg0, pis[0]); + + return new MethodCallExpression1(method, arg0); + } + + ///Creates a that represents a call to a static method that takes two arguments. + ///A that has the property equal to and the and properties set to the specified values. + ///A to set the property equal to. + ///The that represents the first argument. + ///The that represents the second argument. + /// + /// is null. + public static MethodCallExpression Call(MethodInfo method, Expression arg0, Expression arg1) { + ContractUtils.RequiresNotNull(method, "method"); + ContractUtils.RequiresNotNull(arg0, "arg0"); + ContractUtils.RequiresNotNull(arg1, "arg1"); + + ParameterInfo[] pis = ValidateMethodAndGetParameters(null, method); + + ValidateArgumentCount(method, ExpressionType.Call, 2, pis); + + arg0 = ValidateOneArgument(method, ExpressionType.Call, arg0, pis[0]); + arg1 = ValidateOneArgument(method, ExpressionType.Call, arg1, pis[1]); + + return new MethodCallExpression2(method, arg0, arg1); + } + + ///Creates a that represents a call to a static method that takes three arguments. + ///A that has the property equal to and the and properties set to the specified values. + ///A to set the property equal to. + ///The that represents the first argument. + ///The that represents the second argument. + ///The that represents the third argument. + /// + /// is null. + public static MethodCallExpression Call(MethodInfo method, Expression arg0, Expression arg1, Expression arg2) { + ContractUtils.RequiresNotNull(method, "method"); + ContractUtils.RequiresNotNull(arg0, "arg0"); + ContractUtils.RequiresNotNull(arg1, "arg1"); + ContractUtils.RequiresNotNull(arg2, "arg2"); + + ParameterInfo[] pis = ValidateMethodAndGetParameters(null, method); + + ValidateArgumentCount(method, ExpressionType.Call, 3, pis); + + arg0 = ValidateOneArgument(method, ExpressionType.Call, arg0, pis[0]); + arg1 = ValidateOneArgument(method, ExpressionType.Call, arg1, pis[1]); + arg2 = ValidateOneArgument(method, ExpressionType.Call, arg2, pis[2]); + + return new MethodCallExpression3(method, arg0, arg1, arg2); + } + + ///Creates a that represents a call to a static method that takes four arguments. + ///A that has the property equal to and the and properties set to the specified values. + ///A to set the property equal to. + ///The that represents the first argument. + ///The that represents the second argument. + ///The that represents the third argument. + ///The that represents the fourth argument. + /// + /// is null. + public static MethodCallExpression Call(MethodInfo method, Expression arg0, Expression arg1, Expression arg2, Expression arg3) { + ContractUtils.RequiresNotNull(method, "method"); + ContractUtils.RequiresNotNull(arg0, "arg0"); + ContractUtils.RequiresNotNull(arg1, "arg1"); + ContractUtils.RequiresNotNull(arg2, "arg2"); + ContractUtils.RequiresNotNull(arg3, "arg3"); + + ParameterInfo[] pis = ValidateMethodAndGetParameters(null, method); + + ValidateArgumentCount(method, ExpressionType.Call, 4, pis); + + arg0 = ValidateOneArgument(method, ExpressionType.Call, arg0, pis[0]); + arg1 = ValidateOneArgument(method, ExpressionType.Call, arg1, pis[1]); + arg2 = ValidateOneArgument(method, ExpressionType.Call, arg2, pis[2]); + arg3 = ValidateOneArgument(method, ExpressionType.Call, arg3, pis[3]); + + return new MethodCallExpression4(method, arg0, arg1, arg2, arg3); + } + + ///Creates a that represents a call to a static method that takes five arguments. + ///A that has the property equal to and the and properties set to the specified values. + ///A to set the property equal to. + ///The that represents the first argument. + ///The that represents the second argument. + ///The that represents the third argument. + ///The that represents the fourth argument. + ///The that represents the fifth argument. + /// + /// is null. + ///A that has the property equal to and the and properties set to the specified values. + public static MethodCallExpression Call(MethodInfo method, Expression arg0, Expression arg1, Expression arg2, Expression arg3, Expression arg4) { + ContractUtils.RequiresNotNull(method, "method"); + ContractUtils.RequiresNotNull(arg0, "arg0"); + ContractUtils.RequiresNotNull(arg1, "arg1"); + ContractUtils.RequiresNotNull(arg2, "arg2"); + ContractUtils.RequiresNotNull(arg3, "arg3"); + ContractUtils.RequiresNotNull(arg4, "arg4"); + + ParameterInfo[] pis = ValidateMethodAndGetParameters(null, method); + + ValidateArgumentCount(method, ExpressionType.Call, 5, pis); + + arg0 = ValidateOneArgument(method, ExpressionType.Call, arg0, pis[0]); + arg1 = ValidateOneArgument(method, ExpressionType.Call, arg1, pis[1]); + arg2 = ValidateOneArgument(method, ExpressionType.Call, arg2, pis[2]); + arg3 = ValidateOneArgument(method, ExpressionType.Call, arg3, pis[3]); + arg4 = ValidateOneArgument(method, ExpressionType.Call, arg4, pis[4]); + + return new MethodCallExpression5(method, arg0, arg1, arg2, arg3, arg4); + } + + /// + /// Creates a that represents a call to a static (Shared in Visual Basic) method. + /// + /// The that represents the target method. + /// The array of one or more of that represents the call arguments. + ///A that has the property equal to and the and properties set to the specified values. + public static MethodCallExpression Call(MethodInfo method, params Expression[] arguments) { + return Call(null, method, arguments); + } + + /// + /// Creates a that represents a call to a static (Shared in Visual Basic) method. + /// + /// The that represents the target method. + /// A collection of that represents the call arguments. + ///A that has the property equal to and the and properties set to the specified values. + public static MethodCallExpression Call(MethodInfo method, IEnumerable arguments) { + return Call(null, method, arguments); + } + + /// + /// Creates a that represents a call to a method that takes no arguments. + /// + /// An that specifies the instance for an instance call. (pass null for a static (Shared in Visual Basic) method). + /// The that represents the target method. + ///A that has the property equal to and the and properties set to the specified values. + public static MethodCallExpression Call(Expression instance, MethodInfo method) { + return Call(instance, method, EmptyReadOnlyCollection.Instance); + } + + /// + /// Creates a that represents a method call. + /// + /// An that specifies the instance for an instance call. (pass null for a static (Shared in Visual Basic) method). + /// The that represents the target method. + /// An array of one or more of that represents the call arguments. + ///A that has the property equal to and the and properties set to the specified values. + public static MethodCallExpression Call(Expression instance, MethodInfo method, params Expression[] arguments) { + return Call(instance, method, (IEnumerable)arguments); + } + + /// + /// Creates a that represents a call to a method that takes two arguments. + /// + /// An that specifies the instance for an instance call. (pass null for a static (Shared in Visual Basic) method). + /// The that represents the target method. + /// The that represents the first argument. + /// The that represents the second argument. + ///A that has the property equal to and the and properties set to the specified values. + public static MethodCallExpression Call(Expression instance, MethodInfo method, Expression arg0, Expression arg1) { + ContractUtils.RequiresNotNull(method, "method"); + ContractUtils.RequiresNotNull(arg0, "arg0"); + ContractUtils.RequiresNotNull(arg1, "arg1"); + + ParameterInfo[] pis = ValidateMethodAndGetParameters(instance, method); + + ValidateArgumentCount(method, ExpressionType.Call, 2, pis); + + arg0 = ValidateOneArgument(method, ExpressionType.Call, arg0, pis[0]); + arg1 = ValidateOneArgument(method, ExpressionType.Call, arg1, pis[1]); + + if (instance != null) { + return new InstanceMethodCallExpression2(method, instance, arg0, arg1); + } + + return new MethodCallExpression2(method, arg0, arg1); + } + + /// + /// Creates a that represents a call to a method that takes three arguments. + /// + /// An that specifies the instance for an instance call. (pass null for a static (Shared in Visual Basic) method). + /// The that represents the target method. + /// The that represents the first argument. + /// The that represents the second argument. + /// The that represents the third argument. + ///A that has the property equal to and the and properties set to the specified values. + public static MethodCallExpression Call(Expression instance, MethodInfo method, Expression arg0, Expression arg1, Expression arg2) { + ContractUtils.RequiresNotNull(method, "method"); + ContractUtils.RequiresNotNull(arg0, "arg0"); + ContractUtils.RequiresNotNull(arg1, "arg1"); + ContractUtils.RequiresNotNull(arg2, "arg2"); + + ParameterInfo[] pis = ValidateMethodAndGetParameters(instance, method); + + ValidateArgumentCount(method, ExpressionType.Call, 3, pis); + + arg0 = ValidateOneArgument(method, ExpressionType.Call, arg0, pis[0]); + arg1 = ValidateOneArgument(method, ExpressionType.Call, arg1, pis[1]); + arg2 = ValidateOneArgument(method, ExpressionType.Call, arg2, pis[2]); + + if (instance != null) { + return new InstanceMethodCallExpression3(method, instance, arg0, arg1, arg2); + } + return new MethodCallExpression3(method, arg0, arg1, arg2); + } + + ///Creates a that represents a call to an instance method by calling the appropriate factory method. + ///A that has the property equal to , the property equal to , set to the that represents the specified instance method, and set to the specified arguments. + ///An whose property value will be searched for a specific method. + ///The name of the method. + /// + ///An array of objects that specify the type parameters of the generic method. + ///This argument should be null when specifies a non-generic method. + /// + ///An array of objects that represents the arguments to the method. + /// + /// or is null. + ///No method whose name is , whose type parameters match , and whose parameter types match is found in .Type or its base types.-or-More than one method whose name is , whose type parameters match , and whose parameter types match is found in .Type or its base types. + public static MethodCallExpression Call(Expression instance, string methodName, Type[] typeArguments, params Expression[] arguments) { + ContractUtils.RequiresNotNull(instance, "instance"); + ContractUtils.RequiresNotNull(methodName, "methodName"); + if (arguments == null) { + arguments = new Expression[0]; + } + + BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; + return Expression.Call(instance, FindMethod(instance.Type, methodName, typeArguments, arguments, flags), arguments); + } + + ///Creates a that represents a call to a static (Shared in Visual Basic) method by calling the appropriate factory method. + ///A that has the property equal to , the property set to the that represents the specified static (Shared in Visual Basic) method, and the property set to the specified arguments. + ///The that specifies the type that contains the specified static (Shared in Visual Basic) method. + ///The name of the method. + /// + ///An array of objects that specify the type parameters of the generic method. + ///This argument should be null when specifies a non-generic method. + /// + ///An array of objects that represent the arguments to the method. + /// + /// or is null. + ///No method whose name is , whose type parameters match , and whose parameter types match is found in or its base types.-or-More than one method whose name is , whose type parameters match , and whose parameter types match is found in or its base types. + public static MethodCallExpression Call(Type type, string methodName, Type[] typeArguments, params Expression[] arguments) { + ContractUtils.RequiresNotNull(type, "type"); + ContractUtils.RequiresNotNull(methodName, "methodName"); + + if (arguments == null) arguments = new Expression[] { }; + BindingFlags flags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; + return Expression.Call(null, FindMethod(type, methodName, typeArguments, arguments, flags), arguments); + } + + ///Creates a that represents a method call. + ///A that has the property equal to and the , , and properties set to the specified values. + ///An to set the property equal to (pass null for a static (Shared in Visual Basic) method). + ///A to set the property equal to. + ///An that contains objects to use to populate the collection. + /// + /// is null.-or- is null and represents an instance method. + /// + ///.Type is not assignable to the declaring type of the method represented by .-or-The number of elements in does not equal the number of parameters for the method represented by .-or-One or more of the elements of is not assignable to the corresponding parameter for the method represented by . + public static MethodCallExpression Call(Expression instance, MethodInfo method, IEnumerable arguments) { + ContractUtils.RequiresNotNull(method, "method"); + + ReadOnlyCollection argList = arguments.ToReadOnly(); + + ValidateMethodInfo(method); + ValidateStaticOrInstanceMethod(instance, method); + ValidateArgumentTypes(method, ExpressionType.Call, ref argList); + + if (instance == null) { + return new MethodCallExpressionN(method, argList); + } else { + return new InstanceMethodCallExpressionN(method, instance, argList); + } + } + + private static ParameterInfo[] ValidateMethodAndGetParameters(Expression instance, MethodInfo method) { + ValidateMethodInfo(method); + ValidateStaticOrInstanceMethod(instance, method); + + return GetParametersForValidation(method, ExpressionType.Call); + } + + private static void ValidateStaticOrInstanceMethod(Expression instance, MethodInfo method) { + if (method.IsStatic) { + ContractUtils.Requires(instance == null, "instance", Strings.OnlyStaticMethodsHaveNullInstance); + } else { + ContractUtils.Requires(instance != null, "method", Strings.OnlyStaticMethodsHaveNullInstance); + RequiresCanRead(instance, "instance"); + ValidateCallInstanceType(instance.Type, method); + } + } + + private static void ValidateCallInstanceType(Type instanceType, MethodInfo method) { + if (!TypeUtils.IsValidInstanceType(method, instanceType)) { + throw Error.InstanceAndMethodTypeMismatch(method, method.DeclaringType, instanceType); + } + } + + private static void ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ref ReadOnlyCollection arguments) { + Debug.Assert(nodeKind == ExpressionType.Invoke || nodeKind == ExpressionType.Call || nodeKind == ExpressionType.Dynamic || nodeKind == ExpressionType.New); + + ParameterInfo[] pis = GetParametersForValidation(method, nodeKind); + + ValidateArgumentCount(method, nodeKind, arguments.Count, pis); + + Expression[] newArgs = null; + for (int i = 0, n = pis.Length; i < n; i++) { + Expression arg = arguments[i]; + ParameterInfo pi = pis[i]; + arg = ValidateOneArgument(method, nodeKind, arg, pi); + + if (newArgs == null && arg != arguments[i]) { + newArgs = new Expression[arguments.Count]; + for (int j = 0; j < i; j++) { + newArgs[j] = arguments[j]; + } + } + if (newArgs != null) { + newArgs[i] = arg; + } + } + if (newArgs != null) { + arguments = new TrueReadOnlyCollection(newArgs); + } + } + + private static ParameterInfo[] GetParametersForValidation(MethodBase method, ExpressionType nodeKind) { + ParameterInfo[] pis = method.GetParametersCached(); + + if (nodeKind == ExpressionType.Dynamic) { + pis = pis.RemoveFirst(); // ignore CallSite argument + } + return pis; + } + + private static void ValidateArgumentCount(MethodBase method, ExpressionType nodeKind, int count, ParameterInfo[] pis) { + if (pis.Length != count) { + // Throw the right error for the node we were given + switch (nodeKind) { + case ExpressionType.New: + throw Error.IncorrectNumberOfConstructorArguments(); + case ExpressionType.Invoke: + throw Error.IncorrectNumberOfLambdaArguments(); + case ExpressionType.Dynamic: + case ExpressionType.Call: + throw Error.IncorrectNumberOfMethodCallArguments(method); + default: + throw ContractUtils.Unreachable; + } + } + } + + private static Expression ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi) { + RequiresCanRead(arg, "arguments"); + Type pType = pi.ParameterType; + if (pType.IsByRef) { + pType = pType.GetElementType(); + } + TypeUtils.ValidateType(pType); + if (!TypeUtils.AreReferenceAssignable(pType, arg.Type)) { + if (TypeUtils.IsSameOrSubclass(typeof(LambdaExpression), pType) && pType.IsAssignableFrom(arg.GetType())) { + arg = Expression.Quote(arg); + } else { + // Throw the right error for the node we were given + switch (nodeKind) { + case ExpressionType.New: + throw Error.ExpressionTypeDoesNotMatchConstructorParameter(arg.Type, pType); + case ExpressionType.Invoke: + throw Error.ExpressionTypeDoesNotMatchParameter(arg.Type, pType); + case ExpressionType.Dynamic: + case ExpressionType.Call: + throw Error.ExpressionTypeDoesNotMatchMethodParameter(arg.Type, pType, method); + default: + throw ContractUtils.Unreachable; + } + } + } + return arg; + } + + private static MethodInfo FindMethod(Type type, string methodName, Type[] typeArgs, Expression[] args, BindingFlags flags) { + MemberInfo[] members = type.FindMembers(MemberTypes.Method, flags, Type.FilterNameIgnoreCase, methodName); + if (members == null || members.Length == 0) + throw Error.MethodDoesNotExistOnType(methodName, type); + + MethodInfo method; + + var methodInfos = members.Map(t => (MethodInfo)t); + int count = FindBestMethod(methodInfos, typeArgs, args, out method); + + if (count == 0) { + if (typeArgs != null && typeArgs.Length > 0) { + throw Error.GenericMethodWithArgsDoesNotExistOnType(methodName, type); + } else { + throw Error.MethodWithArgsDoesNotExistOnType(methodName, type); + } + } + if (count > 1) + throw Error.MethodWithMoreThanOneMatch(methodName, type); + return method; + } + + private static int FindBestMethod(IEnumerable methods, Type[] typeArgs, Expression[] args, out MethodInfo method) { + int count = 0; + method = null; + foreach (MethodInfo mi in methods) { + MethodInfo moo = ApplyTypeArgs(mi, typeArgs); + if (moo != null && IsCompatible(moo, args)) { + // favor public over non-public methods + if (method == null || (!method.IsPublic && moo.IsPublic)) { + method = moo; + count = 1; + } + // only count it as additional method if they both public or both non-public + else if (method.IsPublic == moo.IsPublic) { + count++; + } + } + } + return count; + } + + private static bool IsCompatible(MethodBase m, Expression[] args) { + ParameterInfo[] parms = m.GetParametersCached(); + if (parms.Length != args.Length) + return false; + for (int i = 0; i < args.Length; i++) { + Expression arg = args[i]; + ContractUtils.RequiresNotNull(arg, "argument"); + Type argType = arg.Type; + Type pType = parms[i].ParameterType; + if (pType.IsByRef) { + pType = pType.GetElementType(); + } + if (!TypeUtils.AreReferenceAssignable(pType, argType) && + !(TypeUtils.IsSameOrSubclass(typeof(LambdaExpression), pType) && pType.IsAssignableFrom(arg.GetType()))) { + return false; + } + } + return true; + } + + private static MethodInfo ApplyTypeArgs(MethodInfo m, Type[] typeArgs) { + if (typeArgs == null || typeArgs.Length == 0) { + if (!m.IsGenericMethodDefinition) + return m; + } else { + if (m.IsGenericMethodDefinition && m.GetGenericArguments().Length == typeArgs.Length) + return m.MakeGenericMethod(typeArgs); + } + return null; + } + + + #endregion + + #region ArrayIndex + + ///Creates a that represents applying an array index operator to a multi-dimensional array. + ///A that has the property equal to and the and properties set to the specified values. + ///An array of instances - indexes for the array index operation. + ///An array that contains objects to use to populate the collection. + public static MethodCallExpression ArrayIndex(Expression array, params Expression[] indexes) { + return ArrayIndex(array, (IEnumerable)indexes); + } + + ///Creates a that represents applying an array index operator to an array of rank more than one. + ///A that has the property equal to and the and properties set to the specified values. + ///An to set the property equal to. + ///An that contains objects to use to populate the collection. + /// + /// or is null. + /// + ///.Type does not represent an array type.-or-The rank of .Type does not match the number of elements in .-or-The property of one or more elements of does not represent the type. + public static MethodCallExpression ArrayIndex(Expression array, IEnumerable indexes) { + RequiresCanRead(array, "array"); + ContractUtils.RequiresNotNull(indexes, "indexes"); + + Type arrayType = array.Type; + if (!arrayType.IsArray) { + throw Error.ArgumentMustBeArray(); + } + + ReadOnlyCollection indexList = indexes.ToReadOnly(); + if (arrayType.GetArrayRank() != indexList.Count) { + throw Error.IncorrectNumberOfIndexes(); + } + + foreach (Expression e in indexList) { + RequiresCanRead(e, "indexes"); + if (e.Type != typeof(int)) { + throw Error.ArgumentMustBeArrayIndexType(); + } + } + + MethodInfo mi = array.Type.GetMethod("Get", BindingFlags.Public | BindingFlags.Instance); + return Call(array, mi, indexList); + } + + #endregion + + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/NewArrayExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/NewArrayExpression.cs new file mode 100644 index 00000000000..abf7394cca3 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/NewArrayExpression.cs @@ -0,0 +1,227 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Represents creating a new array and possibly initializing the elements of the new array. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.NewArrayExpressionProxy))] +#endif + public class NewArrayExpression : Expression { + private readonly ReadOnlyCollection _expressions; + private readonly Type _type; + + internal NewArrayExpression(Type type, ReadOnlyCollection expressions) { + _expressions = expressions; + _type = type; + } + + internal static NewArrayExpression Make(ExpressionType nodeType, Type type, ReadOnlyCollection expressions) { + if (nodeType == ExpressionType.NewArrayInit) { + return new NewArrayInitExpression(type, expressions); + } else { + return new NewArrayBoundsExpression(type, expressions); + } + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _type; } + } + + /// + /// Gets the bounds of the array if the value of the property is NewArrayBounds, or the values to initialize the elements of the new array if the value of the property is NewArrayInit. + /// + public ReadOnlyCollection Expressions { + get { return _expressions; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitNewArray(this); + } + } + + internal sealed class NewArrayInitExpression : NewArrayExpression { + internal NewArrayInitExpression(Type type, ReadOnlyCollection expressions) + : base(type, expressions) { + } + + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.NewArrayInit; } + } + } + + internal sealed class NewArrayBoundsExpression : NewArrayExpression { + internal NewArrayBoundsExpression(Type type, ReadOnlyCollection expressions) + : base(type, expressions) { + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.NewArrayBounds; } + } + } + + public partial class Expression { + + #region NewArrayInit + + + /// + /// Creates a new array expression of the specified type from the provided initializers. + /// + /// A Type that represents the element type of the array. + /// The expressions used to create the array elements. + /// An instance of the . + public static NewArrayExpression NewArrayInit(Type type, params Expression[] initializers) { + return NewArrayInit(type, (IEnumerable)initializers); + } + + /// + /// Creates a new array expression of the specified type from the provided initializers. + /// + /// A Type that represents the element type of the array. + /// The expressions used to create the array elements. + /// An instance of the . + public static NewArrayExpression NewArrayInit(Type type, IEnumerable initializers) { + ContractUtils.RequiresNotNull(type, "type"); + ContractUtils.RequiresNotNull(initializers, "initializers"); + if (type.Equals(typeof(void))) { + throw Error.ArgumentCannotBeOfTypeVoid(); + } + + ReadOnlyCollection initializerList = initializers.ToReadOnly(); + + Expression[] newList = null; + for (int i = 0, n = initializerList.Count; i < n; i++) { + Expression expr = initializerList[i]; + RequiresCanRead(expr, "initializers"); + + if (!TypeUtils.AreReferenceAssignable(type, expr.Type)) { + if (TypeUtils.IsSameOrSubclass(typeof(LambdaExpression), type) && type.IsAssignableFrom(expr.GetType())) { + expr = Expression.Quote(expr); + } else { + throw Error.ExpressionTypeCannotInitializeArrayType(expr.Type, type); + } + if (newList == null) { + newList = new Expression[initializerList.Count]; + for (int j = 0; j < i; j++) { + newList[j] = initializerList[j]; + } + } + } + if (newList != null) { + newList[i] = expr; + } + } + if (newList != null) { + initializerList = new TrueReadOnlyCollection(newList); + } + + return NewArrayExpression.Make(ExpressionType.NewArrayInit, type.MakeArrayType(), initializerList); + } + + #endregion + + #region NewArrayBounds + + + /// + /// Creates a that represents creating an array that has a specified rank. + /// + /// A that represents the element type of the array. + /// An array that contains Expression objects to use to populate the Expressions collection. + /// A that has the property equal to type and the property set to the specified value. + public static NewArrayExpression NewArrayBounds(Type type, params Expression[] bounds) { + return NewArrayBounds(type, (IEnumerable)bounds); + } + + + /// + /// Creates a that represents creating an array that has a specified rank. + /// + /// A that represents the element type of the array. + /// An IEnumerable{T} that contains Expression objects to use to populate the Expressions collection. + /// A that has the property equal to type and the property set to the specified value. + public static NewArrayExpression NewArrayBounds(Type type, IEnumerable bounds) { + ContractUtils.RequiresNotNull(type, "type"); + ContractUtils.RequiresNotNull(bounds, "bounds"); + + if (type.Equals(typeof(void))) { + throw Error.ArgumentCannotBeOfTypeVoid(); + } + + ReadOnlyCollection boundsList = bounds.ToReadOnly(); + + int dimensions = boundsList.Count; + ContractUtils.Requires(dimensions > 0, "bounds", Strings.BoundsCannotBeLessThanOne); + + for (int i = 0; i < dimensions; i++) { + Expression expr = boundsList[i]; + RequiresCanRead(expr, "bounds"); + if (!TypeUtils.IsInteger(expr.Type)) { + throw Error.ArgumentMustBeInteger(); + } + } + + Type arrayType; + if (dimensions == 1) { + //To get a vector, need call Type.MakeArrayType(). + //Type.MakeArrayType(1) gives a non-vector array, which will cause type check error. + arrayType = type.MakeArrayType(); + } else { + arrayType = type.MakeArrayType(dimensions); + } + + return NewArrayExpression.Make(ExpressionType.NewArrayBounds, arrayType, bounds.ToReadOnly()); + } + + #endregion + + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/NewExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/NewExpression.cs new file mode 100644 index 00000000000..a9e607ce966 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/NewExpression.cs @@ -0,0 +1,321 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Represents a constructor call. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.NewExpressionProxy))] +#endif + public class NewExpression : Expression, IArgumentProvider { + private readonly ConstructorInfo _constructor; + private IList _arguments; + private readonly ReadOnlyCollection _members; + + internal NewExpression(ConstructorInfo constructor, IList arguments, ReadOnlyCollection members) { + _constructor = constructor; + _arguments = arguments; + _members = members; + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public override Type Type { + get { return _constructor.DeclaringType; } + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.New; } + } + + /// + /// Gets the called constructor. + /// + public ConstructorInfo Constructor { + get { return _constructor; } + } + + /// + /// Gets the arguments to the constructor. + /// + public ReadOnlyCollection Arguments { + get { return ReturnReadOnly(ref _arguments); } + } + + Expression IArgumentProvider.GetArgument(int index) { + return _arguments[index]; + } + + int IArgumentProvider.ArgumentCount { + get { + return _arguments.Count; + } + } + + /// + /// Gets the members that can retrieve the values of the fields that were initialized with constructor arguments. + /// + public ReadOnlyCollection Members { + get { return _members; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitNew(this); + } + } + + internal class NewValueTypeExpression : NewExpression { + private readonly Type _valueType; + + internal NewValueTypeExpression(Type type, ReadOnlyCollection arguments, ReadOnlyCollection members) + : base(null, arguments, members) { + _valueType = type; + } + + public sealed override Type Type { + get { return _valueType; } + } + } + + public partial class Expression { + + /// + /// Creates a new that represents calling the specified constructor that takes no arguments. + /// + /// The to set the property equal to. + /// A that has the property equal to and the property set to the specified value. + public static NewExpression New(ConstructorInfo constructor) { + return New(constructor, (IEnumerable)null); + } + + + /// + /// Creates a new that represents calling the specified constructor that takes no arguments. + /// + /// The to set the property equal to. + /// An array of objects to use to populate the Arguments collection. + /// A that has the property equal to and the and properties set to the specified value. + public static NewExpression New(ConstructorInfo constructor, params Expression[] arguments) { + return New(constructor, (IEnumerable)arguments); + } + + + /// + /// Creates a new that represents calling the specified constructor that takes no arguments. + /// + /// The to set the property equal to. + /// An of objects to use to populate the Arguments collection. + /// A that has the property equal to and the and properties set to the specified value. + public static NewExpression New(ConstructorInfo constructor, IEnumerable arguments) { + ContractUtils.RequiresNotNull(constructor, "constructor"); + ContractUtils.RequiresNotNull(constructor.DeclaringType, "constructor.DeclaringType"); + TypeUtils.ValidateType(constructor.DeclaringType); + var argList = arguments.ToReadOnly(); + ValidateArgumentTypes(constructor, ExpressionType.New, ref argList); + + return new NewExpression(constructor, argList, null); + } + + + /// + /// Creates a new that represents calling the specified constructor with the specified arguments. The members that access the constructor initialized fields are specified. + /// + /// The to set the property equal to. + /// An of objects to use to populate the Arguments collection. + /// An of objects to use to populate the Members collection. + /// A that has the property equal to and the , and properties set to the specified value. + public static NewExpression New(ConstructorInfo constructor, IEnumerable arguments, IEnumerable members) { + ContractUtils.RequiresNotNull(constructor, "constructor"); + var memberList = members.ToReadOnly(); + var argList = arguments.ToReadOnly(); + ValidateNewArgs(constructor, ref argList, ref memberList); + return new NewExpression(constructor, argList, memberList); + } + + + /// + /// Creates a new that represents calling the specified constructor with the specified arguments. The members that access the constructor initialized fields are specified. + /// + /// The to set the property equal to. + /// An of objects to use to populate the Arguments collection. + /// An Array of objects to use to populate the Members collection. + /// A that has the property equal to and the , and properties set to the specified value. + public static NewExpression New(ConstructorInfo constructor, IEnumerable arguments, params MemberInfo[] members) { + return New(constructor, arguments, (IEnumerable)members); + } + + + /// + /// Creates a that represents calling the parameterless constructor of the specified type. + /// + /// A that has a constructor that takes no arguments. + /// A that has the property equal to New and the Constructor property set to the ConstructorInfo that represents the parameterless constructor of the specified type. + public static NewExpression New(Type type) { + ContractUtils.RequiresNotNull(type, "type"); + if (type == typeof(void)) { + throw Error.ArgumentCannotBeOfTypeVoid(); + } + ConstructorInfo ci = null; + if (!type.IsValueType) { + ci = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, System.Type.EmptyTypes, null); + if (ci == null) { + throw Error.TypeMissingDefaultConstructor(type); + } + return New(ci); + } + return new NewValueTypeExpression(type, EmptyReadOnlyCollection.Instance, null); + } + + + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private static void ValidateNewArgs(ConstructorInfo constructor, ref ReadOnlyCollection arguments, ref ReadOnlyCollection members) { + ParameterInfo[] pis; + if ((pis = constructor.GetParametersCached()).Length > 0) { + if (arguments.Count != pis.Length) { + throw Error.IncorrectNumberOfConstructorArguments(); + } + if (arguments.Count != members.Count) { + throw Error.IncorrectNumberOfArgumentsForMembers(); + } + Expression[] newArguments = null; + MemberInfo[] newMembers = null; + for (int i = 0, n = arguments.Count; i < n; i++) { + Expression arg = arguments[i]; + RequiresCanRead(arg, "argument"); + MemberInfo member = members[i]; + ContractUtils.RequiresNotNull(member, "member"); + if (!TypeUtils.AreEquivalent(member.DeclaringType, constructor.DeclaringType)) { + throw Error.ArgumentMemberNotDeclOnType(member.Name, constructor.DeclaringType.Name); + } + Type memberType; + ValidateAnonymousTypeMember(ref member, out memberType); + if (!TypeUtils.AreReferenceAssignable(memberType, arg.Type)) { + if (TypeUtils.IsSameOrSubclass(typeof(LambdaExpression), memberType) && memberType.IsAssignableFrom(arg.GetType())) { + arg = Expression.Quote(arg); + } else { + throw Error.ArgumentTypeDoesNotMatchMember(arg.Type, memberType); + } + } + ParameterInfo pi = pis[i]; + Type pType = pi.ParameterType; + if (pType.IsByRef) { + pType = pType.GetElementType(); + } + if (!TypeUtils.AreReferenceAssignable(pType, arg.Type)) { + if (TypeUtils.IsSameOrSubclass(typeof(LambdaExpression), pType) && pType.IsAssignableFrom(arg.Type)) { + arg = Expression.Quote(arg); + } else { + throw Error.ExpressionTypeDoesNotMatchConstructorParameter(arg.Type, pType); + } + } + if (newArguments == null && arg != arguments[i]) { + newArguments = new Expression[arguments.Count]; + for (int j = 0; j < i; j++) { + newArguments[j] = arguments[j]; + } + } + if (newArguments != null) { + newArguments[i] = arg; + } + + if (newMembers == null && member != members[i]) { + newMembers = new MemberInfo[members.Count]; + for (int j = 0; j < i; j++) { + newMembers[j] = members[j]; + } + } + if (newMembers != null) { + newMembers[i] = member; + } + } + if (newArguments != null) { + arguments = new TrueReadOnlyCollection(newArguments); + } + if (newMembers != null) { + members = new TrueReadOnlyCollection(newMembers); + } + } else if (arguments != null && arguments.Count > 0) { + throw Error.IncorrectNumberOfConstructorArguments(); + } else if (members != null && members.Count > 0) { + throw Error.IncorrectNumberOfMembersForGivenConstructor(); + } + } + + + private static void ValidateAnonymousTypeMember(ref MemberInfo member, out Type memberType) { + switch (member.MemberType) { + case MemberTypes.Field: + FieldInfo field = member as FieldInfo; + if (field.IsStatic) { + throw Error.ArgumentMustBeInstanceMember(); + } + memberType = field.FieldType; + break; + case MemberTypes.Property: + PropertyInfo pi = member as PropertyInfo; + if (!pi.CanRead) { + throw Error.PropertyDoesNotHaveGetter(pi); + } + if (pi.GetGetMethod().IsStatic) { + throw Error.ArgumentMustBeInstanceMember(); + } + memberType = pi.PropertyType; + break; + case MemberTypes.Method: + MethodInfo method = member as MethodInfo; + if (method.IsStatic) { + throw Error.ArgumentMustBeInstanceMember(); + } + + PropertyInfo prop = GetProperty(method); + member = prop; + memberType = prop.PropertyType; + break; + default: + throw Error.ArgumentMustBeFieldInfoOrPropertInfoOrMethod(); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ParameterExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ParameterExpression.cs new file mode 100644 index 00000000000..7ab0ce553d3 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/ParameterExpression.cs @@ -0,0 +1,226 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Represents a named parameter expression. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.ParameterExpressionProxy))] +#endif + public class ParameterExpression : Expression { + private readonly string _name; + + internal ParameterExpression(string name) { + _name = name; + } + + internal static ParameterExpression Make(Type type, string name, bool isByRef) { + if (isByRef) { + return new ByRefParameterExpression(type, name); + } else { + if (!type.IsEnum) { + switch (Type.GetTypeCode(type)) { + case TypeCode.Boolean: return new PrimitiveParameterExpression(name); + case TypeCode.Byte: return new PrimitiveParameterExpression(name); + case TypeCode.Char: return new PrimitiveParameterExpression(name); + case TypeCode.DateTime: return new PrimitiveParameterExpression(name); + case TypeCode.DBNull: return new PrimitiveParameterExpression(name); + case TypeCode.Decimal: return new PrimitiveParameterExpression(name); + case TypeCode.Double: return new PrimitiveParameterExpression(name); + case TypeCode.Int16: return new PrimitiveParameterExpression(name); + case TypeCode.Int32: return new PrimitiveParameterExpression(name); + case TypeCode.Int64: return new PrimitiveParameterExpression(name); + case TypeCode.Object: + // common reference types which we optimize go here. Of course object is in + // the list, the others are driven by profiling of various workloads. This list + // should be kept short. + if (type == typeof(object)) { + return new ParameterExpression(name); + } else if (type == typeof(Exception)) { + return new PrimitiveParameterExpression(name); + } else if (type == typeof(object[])) { + return new PrimitiveParameterExpression(name); + } + break; + case TypeCode.SByte: return new PrimitiveParameterExpression(name); + case TypeCode.Single: return new PrimitiveParameterExpression(name); + case TypeCode.String: return new PrimitiveParameterExpression(name); + case TypeCode.UInt16: return new PrimitiveParameterExpression(name); + case TypeCode.UInt32: return new PrimitiveParameterExpression(name); + case TypeCode.UInt64: return new PrimitiveParameterExpression(name); + } + } + } + + return new TypedParameterExpression(type, name); + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public override Type Type { + get { return typeof(object); } + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Parameter; } + } + + /// + /// The Name of the parameter or variable. + /// + public string Name { + get { return _name; } + } + + /// + /// Indicates that this ParameterExpression is to be treated as a ByRef parameter. + /// + public bool IsByRef { + get { + return GetIsByRef(); + } + } + + internal virtual bool GetIsByRef() { + return false; + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitParameter(this); + } + } + + /// + /// Specialized subclass to avoid holding onto the byref flag in a + /// parameter expression. This version always holds onto the expression + /// type explicitly and therefore derives from TypedParameterExpression. + /// + internal sealed class ByRefParameterExpression : TypedParameterExpression { + internal ByRefParameterExpression(Type type, string name) + : base(type, name) { + } + + internal override bool GetIsByRef() { + return true; + } + } + + /// + /// Specialized subclass which holds onto the type of the expression for + /// uncommon types. + /// + internal class TypedParameterExpression : ParameterExpression { + private readonly Type _paramType; + + internal TypedParameterExpression(Type type, string name) + : base(name) { + _paramType = type; + } + + public sealed override Type Type { + get { return _paramType; } + } + } + + /// + /// Generic type to avoid needing explicit storage for primitive data types + /// which are commonly used. + /// + internal sealed class PrimitiveParameterExpression : ParameterExpression { + internal PrimitiveParameterExpression(string name) + : base(name) { + } + + public sealed override Type Type { + get { return typeof(T); } + } + } + + public partial class Expression { + + /// + /// Creates a node that can be used to identify a parameter or a variable in an expression tree. + /// + /// The type of the parameter or variable. + /// A node with the specified name and type. + public static ParameterExpression Parameter(Type type) { + return Parameter(type, null); + } + + /// + /// Creates a node that can be used to identify a parameter or a variable in an expression tree. + /// + /// The type of the parameter or variable. + /// A node with the specified name and type. + public static ParameterExpression Variable(Type type) { + return Variable(type, null); + } + + /// + /// Creates a node that can be used to identify a parameter or a variable in an expression tree. + /// + /// The type of the parameter or variable. + /// The name of the parameter or variable, used for debugging or pretty printing purpose only. + /// A node with the specified name and type. + public static ParameterExpression Parameter(Type type, string name) { + ContractUtils.RequiresNotNull(type, "type"); + + if (type == typeof(void)) { + throw Error.ArgumentCannotBeOfTypeVoid(); + } + + bool byref = type.IsByRef; + if (byref) { + type = type.GetElementType(); + } + + return ParameterExpression.Make(type, name, byref); + } + + /// + /// Creates a node that can be used to identify a parameter or a variable in an expression tree. + /// + /// The type of the parameter or variable. + /// The name of the parameter or variable, used for debugging or pretty printing purpose only. + /// A node with the specified name and type. + public static ParameterExpression Variable(Type type, string name) { + ContractUtils.RequiresNotNull(type, "type"); + ContractUtils.Requires(type != typeof(void), "type", Strings.ArgumentCannotBeOfTypeVoid); + ContractUtils.Requires(!type.IsByRef, "type", Strings.TypeMustNotBeByRef); + return ParameterExpression.Make(type, name, false); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/RuntimeVariablesExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/RuntimeVariablesExpression.cs new file mode 100644 index 00000000000..9a2af5f8765 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/RuntimeVariablesExpression.cs @@ -0,0 +1,111 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// An expression that provides runtime read/write access to variables. + /// Needed to implement "eval" in some dynamic languages. + /// Evaluates to an instance of when executed. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.RuntimeVariablesExpressionProxy))] +#endif + public sealed class RuntimeVariablesExpression : Expression { + private readonly ReadOnlyCollection _variables; + + internal RuntimeVariablesExpression(ReadOnlyCollection variables) { + _variables = variables; + } + + /// + /// Gets the static type of the expression that this represents. + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return typeof(IRuntimeVariables); } + } + + /// + /// Returns the node type of this Expression. Extension nodes should return + /// ExpressionType.Extension when overriding this method. + /// + /// The of the expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.RuntimeVariables; } + } + + /// + /// The variables or parameters to which to provide runtime access. + /// + public ReadOnlyCollection Variables { + get { return _variables; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitRuntimeVariables(this); + } + } + + public partial class Expression { + + /// + /// Creates an instance of . + /// + /// An array of objects to use to populate the collection. + /// An instance of that has the property equal to and the property set to the specified value. + public static RuntimeVariablesExpression RuntimeVariables(params ParameterExpression[] variables) { + return RuntimeVariables((IEnumerable)variables); + } + + /// + /// Creates an instance of . + /// + /// A collection of objects to use to populate the collection. + /// An instance of that has the property equal to and the property set to the specified value. + public static RuntimeVariablesExpression RuntimeVariables(IEnumerable variables) { + ContractUtils.RequiresNotNull(variables, "variables"); + + var vars = variables.ToReadOnly(); + for (int i = 0; i < vars.Count; i++) { + Expression v = vars[i]; + if (v == null) { + throw new ArgumentNullException("variables[" + i + "]"); + } + } + + return new RuntimeVariablesExpression(vars); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/SwitchCase.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/SwitchCase.cs new file mode 100644 index 00000000000..e40bc23895f --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/SwitchCase.cs @@ -0,0 +1,97 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents one case of a . + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.SwitchCaseProxy))] +#endif + public sealed class SwitchCase { + private readonly ReadOnlyCollection _testValues; + private readonly Expression _body; + + internal SwitchCase(Expression body, ReadOnlyCollection testValues) { + _body = body; + _testValues = testValues; + } + + /// + /// Gets the values of this case. This case is selected for execution when the matches any of these values. + /// + public ReadOnlyCollection TestValues { + get { return _testValues; } + } + + /// + /// Gets the body of this case. + /// + public Expression Body { + get { return _body; } + } + + /// + /// Returns a that represents the current . + /// + /// A that represents the current . + public override string ToString() { + return ExpressionStringBuilder.SwitchCaseToString(this); + } + } + + public partial class Expression { + /// + /// Creates a SwitchCase for use in a . + /// + /// The body of the case. + /// The test values of the case. + /// The created SwitchCase. + public static SwitchCase SwitchCase(Expression body, params Expression[] testValues) { + return SwitchCase(body, (IEnumerable)testValues); + } + + /// + /// Creates a SwitchCase for use in a . + /// + /// The body of the case. + /// The test values of the case. + /// The created SwitchCase. + public static SwitchCase SwitchCase(Expression body, IEnumerable testValues) { + RequiresCanRead(body, "body"); + + var values = testValues.ToReadOnly(); + RequiresCanRead(values, "testValues"); + ContractUtils.RequiresNotEmpty(values, "testValues"); + + return new SwitchCase(body, values); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/SwitchExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/SwitchExpression.cs new file mode 100644 index 00000000000..bbf4c68265c --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/SwitchExpression.cs @@ -0,0 +1,286 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents a control expression that handles multiple selections by passing control to a . + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.SwitchExpressionProxy))] +#endif + public sealed class SwitchExpression : Expression { + private readonly Type _type; + private readonly Expression _switchValue; + private readonly ReadOnlyCollection _cases; + private readonly Expression _defaultBody; + private readonly MethodInfo _comparison; + + internal SwitchExpression(Type type, Expression switchValue, Expression defaultBody, MethodInfo comparison, ReadOnlyCollection cases) { + _type = type; + _switchValue = switchValue; + _defaultBody = defaultBody; + _comparison = comparison; + _cases = cases; + } + + /// + /// Gets the static type of the expression that this represents. + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _type; } + } + + /// + /// Returns the node type of this Expression. Extension nodes should return + /// ExpressionType.Extension when overriding this method. + /// + /// The of the expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Switch; } + } + + /// + /// Gets the test for the switch. + /// + public Expression SwitchValue { + get { return _switchValue; } + } + + /// + /// Gets the collection of objects for the switch. + /// + public ReadOnlyCollection Cases { + get { return _cases; } + } + + /// + /// Gets the test for the switch. + /// + public Expression DefaultBody { + get { return _defaultBody; } + } + + /// + /// Gets the equality comparison method, if any. + /// + public MethodInfo Comparison { + get { return _comparison; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitSwitch(this); + } + + internal bool IsLifted { + get { + if (_switchValue.Type.IsNullableType()) { + return (_comparison == null) || + !TypeUtils.AreEquivalent(_switchValue.Type, _comparison.GetParametersCached()[0].ParameterType.GetNonRefType()); + } + return false; + } + } + } + + public partial class Expression { + /// + /// Creates a . + /// + /// The value to be tested against each case. + /// The valid cases for this switch. + /// The created . + public static SwitchExpression Switch(Expression switchValue, params SwitchCase[] cases) { + return Switch(switchValue, null, null, (IEnumerable)cases); + } + + /// + /// Creates a . + /// + /// The value to be tested against each case. + /// The result of the switch if no cases are matched. + /// The valid cases for this switch. + /// The created . + public static SwitchExpression Switch(Expression switchValue, Expression defaultBody, params SwitchCase[] cases) { + return Switch(switchValue, defaultBody, null, (IEnumerable)cases); + } + + /// + /// Creates a . + /// + /// The value to be tested against each case. + /// The result of the switch if no cases are matched. + /// The equality comparison method to use. + /// The valid cases for this switch. + /// The created . + public static SwitchExpression Switch(Expression switchValue, Expression defaultBody, MethodInfo comparison, params SwitchCase[] cases) { + return Switch(switchValue, defaultBody, comparison, (IEnumerable)cases); + } + + /// + /// Creates a . + /// + /// The result type of the switch. + /// The value to be tested against each case. + /// The result of the switch if no cases are matched. + /// The equality comparison method to use. + /// The valid cases for this switch. + /// The created . + public static SwitchExpression Switch(Type type, Expression switchValue, Expression defaultBody, MethodInfo comparison, params SwitchCase[] cases) { + return Switch(type, switchValue, defaultBody, comparison, (IEnumerable)cases); + } + + /// + /// Creates a . + /// + /// The value to be tested against each case. + /// The result of the switch if no cases are matched. + /// The equality comparison method to use. + /// The valid cases for this switch. + /// The created . + public static SwitchExpression Switch(Expression switchValue, Expression defaultBody, MethodInfo comparison, IEnumerable cases) { + return Switch(null, switchValue, defaultBody, comparison, cases); + } + + /// + /// Creates a . + /// + /// The result type of the switch. + /// The value to be tested against each case. + /// The result of the switch if no cases are matched. + /// The equality comparison method to use. + /// The valid cases for this switch. + /// The created . + public static SwitchExpression Switch(Type type, Expression switchValue, Expression defaultBody, MethodInfo comparison, IEnumerable cases) { + RequiresCanRead(switchValue, "switchValue"); + ContractUtils.Requires(switchValue.Type != typeof(void), "switchValue", Strings.ArgumentCannotBeOfTypeVoid); + + var caseList = cases.ToReadOnly(); + ContractUtils.RequiresNotEmpty(caseList, "cases"); + ContractUtils.RequiresNotNullItems(caseList, "cases"); + + // Type of the result. Either provided, or it is type of the branches. + Type resultType = type ?? caseList[0].Body.Type; + bool customType = type != null; + + if (comparison != null) { + var pms = comparison.GetParametersCached(); + if (pms.Length != 2) { + throw Error.IncorrectNumberOfMethodCallArguments(comparison); + } + // Validate that the switch value's type matches the comparison method's + // left hand side parameter type. + var leftParam = pms[0]; + bool liftedCall = false; + if (!ParameterIsAssignable(leftParam, switchValue.Type)) { + liftedCall = ParameterIsAssignable(leftParam, switchValue.Type.GetNonNullableType()); + if (!liftedCall) { + throw Error.SwitchValueTypeDoesNotMatchComparisonMethodParameter(switchValue.Type, leftParam.ParameterType); + } + } + + var rightParam = pms[1]; + foreach (var c in caseList) { + ContractUtils.RequiresNotNull(c, "cases"); + ValidateSwitchCaseType(c.Body, customType, resultType, "cases"); + for (int i = 0; i < c.TestValues.Count; i++) { + // When a comparison method is provided, test values can have different type but have to + // be reference assignable to the right hand side parameter of the method. + Type rightOperandType = c.TestValues[i].Type; + if (liftedCall) { + if (!rightOperandType.IsNullableType()) { + throw Error.TestValueTypeDoesNotMatchComparisonMethodParameter(rightOperandType, rightParam.ParameterType); + } + rightOperandType = rightOperandType.GetNonNullableType(); + } + if (!ParameterIsAssignable(rightParam, rightOperandType)) { + throw Error.TestValueTypeDoesNotMatchComparisonMethodParameter(rightOperandType, rightParam.ParameterType); + } + } + } + } else { + // When comparison method is not present, all the test values must have + // the same type. Use the first test value's type as the baseline. + var firstTestValue = caseList[0].TestValues[0]; + foreach (var c in caseList) { + ContractUtils.RequiresNotNull(c, "cases"); + ValidateSwitchCaseType(c.Body, customType, resultType, "cases"); + // When no comparison method is provided, require all test values to have the same type. + for (int i = 0; i < c.TestValues.Count; i++) { + if (!TypeUtils.AreEquivalent(firstTestValue.Type, c.TestValues[i].Type)) { + throw new ArgumentException(Strings.AllTestValuesMustHaveSameType, "cases"); + } + } + } + + // Now we need to validate that switchValue.Type and testValueType + // make sense in an Equal node. Fortunately, Equal throws a + // reasonable error, so just call it. + var equal = Equal(switchValue, firstTestValue, false, comparison); + + // Get the comparison function from equals node. + comparison = equal.Method; + } + + if (defaultBody == null) { + ContractUtils.Requires(resultType == typeof(void), "defaultBody", Strings.DefaultBodyMustBeSupplied); + } else { + ValidateSwitchCaseType(defaultBody, customType, resultType, "defaultBody"); + } + + // if we have a non-boolean userdefined equals, we don't want it. + if (comparison != null && comparison.ReturnType != typeof(bool)) { + throw Error.EqualityMustReturnBoolean(comparison); + } + + return new SwitchExpression(resultType, switchValue, defaultBody, comparison, caseList); + } + + + /// + /// If custom type is provided, all branches must be reference assignable to the result type. + /// If no custom type is provided, all branches must have the same type - resultType. + /// + private static void ValidateSwitchCaseType(Expression @case, bool customType, Type resultType, string parameterName) { + if (customType) { + if (resultType != typeof(void)) { + if (!TypeUtils.AreReferenceAssignable(resultType, @case.Type)) { + throw new ArgumentException(Strings.ArgumentTypesMustMatch, parameterName); + } + } + } else { + if (!TypeUtils.AreEquivalent(resultType, @case.Type)) { + throw new ArgumentException(Strings.AllCaseBodiesMustHaveSameType, parameterName); + } + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/SymbolDocumentInfo.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/SymbolDocumentInfo.cs new file mode 100644 index 00000000000..71c23c2043d --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/SymbolDocumentInfo.cs @@ -0,0 +1,158 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Stores information needed to emit debugging symbol information for a + /// source file, in particular the file name and unique language identifier. + /// + public class SymbolDocumentInfo { + private readonly string _fileName; + + internal SymbolDocumentInfo(string fileName) { + ContractUtils.RequiresNotNull(fileName, "fileName"); + _fileName = fileName; + } + + /// + /// The source file name. + /// + public string FileName { + get { return _fileName; } + } + + /// + /// Returns the language's unique identifier, if any. + /// + public virtual Guid Language { + get { return Guid.Empty; } + } + + /// + /// Returns the language vendor's unique identifier, if any. + /// + public virtual Guid LanguageVendor { + get { return Guid.Empty; } + } + + /// + /// Returns the document type's unique identifier, if any. + /// Defaults to the guid for a text file. + /// + public virtual Guid DocumentType { + get { return Compiler.SymbolGuids.DocumentType_Text; } + } + } + + internal sealed class SymbolDocumentWithGuids : SymbolDocumentInfo { + private readonly Guid _language; + private readonly Guid _vendor; + private readonly Guid _documentType; + + internal SymbolDocumentWithGuids(string fileName, ref Guid language) + : base(fileName) { + _language = language; + _documentType = Compiler.SymbolGuids.DocumentType_Text; + } + + internal SymbolDocumentWithGuids(string fileName, ref Guid language, ref Guid vendor) + : base(fileName) { + _language = language; + _vendor = vendor; + _documentType = Compiler.SymbolGuids.DocumentType_Text; + } + + internal SymbolDocumentWithGuids(string fileName, ref Guid language, ref Guid vendor, ref Guid documentType) + : base(fileName) { + _language = language; + _vendor = vendor; + _documentType = documentType; + } + + public override Guid Language { + get { return _language; } + } + + public override Guid LanguageVendor { + get { return _vendor; } + } + + public override Guid DocumentType { + get { return _documentType; } + } + } + + public partial class Expression { + /// + /// Creates an instance of . + /// + /// A to set the equal to. + /// A that has the property set to the specified value. + public static SymbolDocumentInfo SymbolDocument(string fileName) { + return new SymbolDocumentInfo(fileName); + } + + /// + /// Creates an instance of . + /// + /// A to set the equal to. + /// A to set the equal to. + /// A that has the + /// and properties set to the specified value. + public static SymbolDocumentInfo SymbolDocument(string fileName, Guid language) { + return new SymbolDocumentWithGuids(fileName, ref language); + } + + /// + /// Creates an instance of . + /// + /// A to set the equal to. + /// A to set the equal to. + /// A to set the equal to. + /// A that has the + /// and + /// and properties set to the specified value. + public static SymbolDocumentInfo SymbolDocument(string fileName, Guid language, Guid languageVendor) { + return new SymbolDocumentWithGuids(fileName, ref language, ref languageVendor); + } + + /// + /// Creates an instance of . + /// + /// A to set the equal to. + /// A to set the equal to. + /// A to set the equal to. + /// A to set the equal to. + /// A that has the + /// and + /// and + /// and properties set to the specified value. + public static SymbolDocumentInfo SymbolDocument(string fileName, Guid language, Guid languageVendor, Guid documentType) { + return new SymbolDocumentWithGuids(fileName, ref language, ref languageVendor, ref documentType); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/TryExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/TryExpression.cs new file mode 100644 index 00000000000..e38aa9e601e --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/TryExpression.cs @@ -0,0 +1,215 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents a try/catch/finally/fault block. + /// + /// The body is protected by the try block. + /// The handlers consist of a set of s that can either be catch or filters. + /// The fault runs if an exception is thrown. + /// The finally runs regardless of how control exits the body. + /// Only one of fault or finally can be supplied. + /// The return type of the try block must match the return type of any associated catch statements. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.TryExpressionProxy))] +#endif + public sealed class TryExpression : Expression { + private readonly Type _type; + private readonly Expression _body; + private readonly ReadOnlyCollection _handlers; + private readonly Expression _finally; + private readonly Expression _fault; + + internal TryExpression(Type type, Expression body, Expression @finally, Expression fault, ReadOnlyCollection handlers) { + _type = type; + _body = body; + _handlers = handlers; + _finally = @finally; + _fault = fault; + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _type; } + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return ExpressionType.Try; } + } + + /// + /// Gets the representing the body of the try block. + /// + public Expression Body { + get { return _body; } + } + + /// + /// Gets the collection of s associated with the try block. + /// + public ReadOnlyCollection Handlers { + get { return _handlers; } + } + + /// + /// Gets the representing the finally block. + /// + public Expression Finally { + get { return _finally; } + } + + /// + /// Gets the representing the fault block. + /// + public Expression Fault { + get { return _fault; } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitTry(this); + } + } + + public partial class Expression { + + /// + /// Creates a representing a try block with a fault block and no catch statements. + /// + /// The body of the try block. + /// The body of the fault block. + /// The created . + public static TryExpression TryFault(Expression body, Expression fault) { + return MakeTry(null, body, null, fault, null); + } + + /// + /// Creates a representing a try block with a finally block and no catch statements. + /// + /// The body of the try block. + /// The body of the finally block. + /// The created . + public static TryExpression TryFinally(Expression body, Expression @finally) { + return MakeTry(null, body, @finally, null, null); + } + + /// + /// Creates a representing a try block with any number of catch statements and neither a fault nor finally block. + /// + /// The body of the try block. + /// The array of zero or more s representing the catch statements to be associated with the try block. + /// The created . + public static TryExpression TryCatch(Expression body, params CatchBlock[] handlers) { + return MakeTry(null, body, null, null, handlers); + } + + /// + /// Creates a representing a try block with any number of catch statements and a finally block. + /// + /// The body of the try block. + /// The body of the finally block. + /// The array of zero or more s representing the catch statements to be associated with the try block. + /// The created . + public static TryExpression TryCatchFinally(Expression body, Expression @finally, params CatchBlock[] handlers) { + return MakeTry(null, body, @finally, null, handlers); + } + + /// + /// Creates a representing a try block with the specified elements. + /// + /// The result type of the try expression. If null, bodh and all handlers must have identical type. + /// The body of the try block. + /// The body of the finally block. Pass null if the try block has no finally block associated with it. + /// The body of the t block. Pass null if the try block has no fault block associated with it. + /// A collection of s representing the catch statements to be associated with the try block. + /// The created . + public static TryExpression MakeTry(Type type, Expression body, Expression @finally, Expression fault, IEnumerable handlers) { + RequiresCanRead(body, "body"); + + var @catch = handlers.ToReadOnly(); + ContractUtils.RequiresNotNullItems(@catch, "handlers"); + ValidateTryAndCatchHaveSameType(type, body, @catch); + + if (fault != null) { + if (@finally != null || @catch.Count > 0) { + throw Error.FaultCannotHaveCatchOrFinally(); + } + RequiresCanRead(fault, "fault"); + } else if (@finally != null) { + RequiresCanRead(@finally, "finally"); + } else if (@catch.Count == 0) { + throw Error.TryMustHaveCatchFinallyOrFault(); + } + + return new TryExpression(type ?? body.Type, body, @finally, fault, @catch); + } + + //Validate that the body of the try expression must have the same type as the body of every try block. + private static void ValidateTryAndCatchHaveSameType(Type type, Expression tryBody, ReadOnlyCollection handlers) { + // Type unification ... all parts must be reference assignable to "type" + if (type != null) { + if (type != typeof(void)) { + if (!TypeUtils.AreReferenceAssignable(type, tryBody.Type)) { + throw Error.ArgumentTypesMustMatch(); + } + foreach (var cb in handlers) { + if (!TypeUtils.AreReferenceAssignable(type, cb.Body.Type)) { + throw Error.ArgumentTypesMustMatch(); + } + } + } + } else if (tryBody == null || tryBody.Type == typeof(void)) { + //The body of every try block must be null or have void type. + foreach (CatchBlock cb in handlers) { + if (cb.Body != null && cb.Body.Type != typeof(void)) { + throw Error.BodyOfCatchMustHaveSameTypeAsBodyOfTry(); + } + } + } else { + //Body of every catch must have the same type of body of try. + type = tryBody.Type; + foreach (CatchBlock cb in handlers) { + if (cb.Body == null || !TypeUtils.AreEquivalent(cb.Body.Type, type)) { + throw Error.BodyOfCatchMustHaveSameTypeAsBodyOfTry(); + } + } + } + } + } + +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/TypeBinaryExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/TypeBinaryExpression.cs new file mode 100644 index 00000000000..101591c9c0c --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/TypeBinaryExpression.cs @@ -0,0 +1,198 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + /// + /// Represents an operation between an expression and a type. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.TypeBinaryExpressionProxy))] +#endif + public sealed class TypeBinaryExpression : Expression { + private readonly Expression _expression; + private readonly Type _typeOperand; + private readonly ExpressionType _nodeKind; + + internal TypeBinaryExpression(Expression expression, Type typeOperand, ExpressionType nodeKind) { + _expression = expression; + _typeOperand = typeOperand; + _nodeKind = nodeKind; + } + + /// + /// Gets the static type of the expression that this represents. + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return typeof(bool); } + } + + /// + /// Returns the node type of this Expression. Extension nodes should return + /// ExpressionType.Extension when overriding this method. + /// + /// The of the expression. + public sealed override ExpressionType NodeType { + get { return _nodeKind; } + } + + /// + /// Gets the expression operand of a type test operation. + /// + public Expression Expression { + get { return _expression; } + } + + /// + /// Gets the type operand of a type test operation. + /// + public Type TypeOperand { + get { return _typeOperand; } + } + + #region Reduce TypeEqual + + internal Expression ReduceTypeEqual() { + Type cType = Expression.Type; + + // For value types (including Void, but not nullables), we can + // determine the result now + if (cType.IsValueType && !cType.IsNullableType()) { + return Expression.Block(Expression, Expression.Constant(cType == _typeOperand.GetNonNullableType())); + } + + // Can check the value right now for constants. + if (Expression.NodeType == ExpressionType.Constant) { + return ReduceConstantTypeEqual(); + } + + // If the operand type is a sealed reference type or a nullable + // type, it will match if value is not null + if (cType.IsSealed && (cType == _typeOperand)) { + if (cType.IsNullableType()) { + return Expression.NotEqual(Expression, Expression.Constant(null, Expression.Type)); + } else { + return Expression.ReferenceNotEqual(Expression, Expression.Constant(null, Expression.Type)); + } + } + + // expression is a ByVal parameter. Can safely reevaluate. + var parameter = Expression as ParameterExpression; + if (parameter != null && !parameter.IsByRef) { + return ByValParameterTypeEqual(parameter); + } + + // Create a temp so we only evaluate the left side once + parameter = Expression.Parameter(typeof(object)); + + // Convert to object if necessary + var expression = Expression; + if (!TypeUtils.AreReferenceAssignable(typeof(object), expression.Type)) { + expression = Expression.Convert(expression, typeof(object)); + } + + return Expression.Block( + new[] { parameter }, + Expression.Assign(parameter, expression), + ByValParameterTypeEqual(parameter) + ); + } + + // Helper that is used when re-eval of LHS is safe. + private Expression ByValParameterTypeEqual(ParameterExpression value) { + Expression getType = Expression.Call(value, typeof(object).GetMethod("GetType")); + + // In remoting scenarios, obj.GetType() can return an interface. + // But there's a bug in the JIT32's optimized "obj.GetType() == + // typeof(ISomething)" codegen, causing it to always return false. + // We workaround the bug by generating different, less optimal IL + // if TypeOperand is an interface. + if (_typeOperand.IsInterface) { + var temp = Expression.Parameter(typeof(Type)); + getType = Expression.Block(new[] { temp }, Expression.Assign(temp, getType), temp); + } + + // We use reference equality when comparing to null for correctness + // (don't invoke a user defined operator), and reference equality + // on types for performance (so the JIT can optimize the IL). + return Expression.AndAlso( + Expression.ReferenceNotEqual(value, Expression.Constant(null)), + Expression.ReferenceEqual( + getType, + Expression.Constant(_typeOperand.GetNonNullableType(), typeof(Type)) + ) + ); + } + + private Expression ReduceConstantTypeEqual() { + ConstantExpression ce = Expression as ConstantExpression; + //TypeEqual(null, T) always returns false. + if (ce.Value == null) { + return Expression.Constant(false); + } else { + return Expression.Constant(_typeOperand.GetNonNullableType() == ce.Value.GetType()); + } + } + + #endregion + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitTypeBinary(this); + } + } + + public partial class Expression { + /// + /// Creates a . + /// + /// An to set the property equal to. + /// A to set the property equal to. + /// A for which the property is equal to and for which the and properties are set to the specified values. + public static TypeBinaryExpression TypeIs(Expression expression, Type type) { + RequiresCanRead(expression, "expression"); + ContractUtils.RequiresNotNull(type, "type"); + ContractUtils.Requires(!type.IsByRef, "type", Strings.TypeMustNotBeByRef); + + return new TypeBinaryExpression(expression, type, ExpressionType.TypeIs); + } + + /// + /// Creates a that compares run-time type identity. + /// + /// An to set the property equal to. + /// A to set the property equal to. + /// A for which the property is equal to and for which the and properties are set to the specified values. + public static TypeBinaryExpression TypeEqual(Expression expression, Type type) { + RequiresCanRead(expression, "expression"); + ContractUtils.RequiresNotNull(type, "type"); + ContractUtils.Requires(!type.IsByRef, "type", Strings.TypeMustNotBeByRef); + + return new TypeBinaryExpression(expression, type, ExpressionType.TypeEqual); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/TypeUtils.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/TypeUtils.cs new file mode 100644 index 00000000000..d154ecdb386 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/TypeUtils.cs @@ -0,0 +1,585 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif +using System.Reflection; + +#if CODEPLEX_40 +namespace System.Dynamic.Utils { +#else +namespace Microsoft.Scripting.Utils { +#endif + + internal static class TypeUtils { + private const BindingFlags AnyStatic = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; + internal const MethodAttributes PublicStatic = MethodAttributes.Public | MethodAttributes.Static; + + internal static Type GetNonNullableType(this Type type) { + if (IsNullableType(type)) { + return type.GetGenericArguments()[0]; + } + return type; + } + + internal static Type GetNullableType(Type type) { + Debug.Assert(type != null, "type cannot be null"); + if (type.IsValueType && !IsNullableType(type)) { + return typeof(Nullable<>).MakeGenericType(type); + } + return type; + } + + internal static bool IsNullableType(this Type type) { + return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); + } + + internal static bool IsBool(Type type) { + return GetNonNullableType(type) == typeof(bool); + } + + internal static bool IsNumeric(Type type) { + type = GetNonNullableType(type); + if (!type.IsEnum) { + switch (Type.GetTypeCode(type)) { + case TypeCode.Char: + case TypeCode.SByte: + case TypeCode.Byte: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Double: + case TypeCode.Single: + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.UInt64: + return true; + } + } + return false; + } + + internal static bool IsInteger(Type type) { + type = GetNonNullableType(type); + if (type.IsEnum) { + return false; + } + switch (Type.GetTypeCode(type)) { + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.UInt64: + return true; + default: + return false; + } + } + + + internal static bool IsArithmetic(Type type) { + type = GetNonNullableType(type); + if (!type.IsEnum) { + switch (Type.GetTypeCode(type)) { + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Double: + case TypeCode.Single: + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.UInt64: + return true; + } + } + return false; + } + + internal static bool IsUnsignedInt(Type type) { + type = GetNonNullableType(type); + if (!type.IsEnum) { + switch (Type.GetTypeCode(type)) { + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.UInt64: + return true; + } + } + return false; + } + + internal static bool IsIntegerOrBool(Type type) { + type = GetNonNullableType(type); + if (!type.IsEnum) { + switch (Type.GetTypeCode(type)) { + case TypeCode.Int64: + case TypeCode.Int32: + case TypeCode.Int16: + case TypeCode.UInt64: + case TypeCode.UInt32: + case TypeCode.UInt16: + case TypeCode.Boolean: + case TypeCode.SByte: + case TypeCode.Byte: + return true; + } + } + return false; + } + + internal static bool AreEquivalent(Type t1, Type t2) { +#if MICROSOFT_SCRIPTING_CORE + return t1 == t2; +#else + return t1 == t2 || t1.IsEquivalentTo(t2); +#endif + } + + internal static bool AreReferenceAssignable(Type dest, Type src) { + // WARNING: This actually implements "Is this identity assignable and/or reference assignable?" + if (AreEquivalent(dest, src)) { + return true; + } + if (!dest.IsValueType && !src.IsValueType && dest.IsAssignableFrom(src)) { + return true; + } + return false; + } + + // Checks if the type is a valid target for an instance call + internal static bool IsValidInstanceType(MemberInfo member, Type instanceType) { + Type targetType = member.DeclaringType; + if (AreReferenceAssignable(targetType, instanceType)) { + return true; + } + if (instanceType.IsValueType) { + if (AreReferenceAssignable(targetType, typeof(System.Object))) { + return true; + } + if (AreReferenceAssignable(targetType, typeof(System.ValueType))) { + return true; + } + if (instanceType.IsEnum && AreReferenceAssignable(targetType, typeof(System.Enum))) { + return true; + } + // A call to an interface implemented by a struct is legal whether the struct has + // been boxed or not. + if (targetType.IsInterface) { + foreach (Type interfaceType in instanceType.GetInterfaces()) { + if (AreReferenceAssignable(targetType, interfaceType)) { + return true; + } + } + } + } + return false; + } + + internal static bool HasIdentityPrimitiveOrNullableConversion(Type source, Type dest) { + Debug.Assert(source != null && dest != null); + + // Identity conversion + if (AreEquivalent(source, dest)) { + return true; + } + + // Nullable conversions + if (IsNullableType(source) && AreEquivalent(dest, GetNonNullableType(source))) { + return true; + } + if (IsNullableType(dest) && AreEquivalent(source, GetNonNullableType(dest))) { + return true; + } + // Primitive runtime conversions + // All conversions amongst enum, bool, char, integer and float types + // (and their corresponding nullable types) are legal except for + // nonbool==>bool and nonbool==>bool? + // Since we have already covered bool==>bool, bool==>bool?, etc, above, + // we can just disallow having a bool or bool? destination type here. + if (IsConvertible(source) && IsConvertible(dest) && GetNonNullableType(dest) != typeof(bool)) { + return true; + } + return false; + } + + internal static bool HasReferenceConversion(Type source, Type dest) { + Debug.Assert(source != null && dest != null); + + // void -> void conversion is handled elsewhere + // (it's an identity conversion) + // All other void conversions are disallowed. + if (source == typeof(void) || dest == typeof(void)) { + return false; + } + + Type nnSourceType = TypeUtils.GetNonNullableType(source); + Type nnDestType = TypeUtils.GetNonNullableType(dest); + + // Down conversion + if (nnSourceType.IsAssignableFrom(nnDestType)) { + return true; + } + // Up conversion + if (nnDestType.IsAssignableFrom(nnSourceType)) { + return true; + } + // Interface conversion + if (source.IsInterface || dest.IsInterface) { + return true; + } + // Object conversion + if (source == typeof(object) || dest == typeof(object)) { + return true; + } + return false; + } + + internal static bool IsConvertible(Type type) { + type = GetNonNullableType(type); + if (type.IsEnum) { + return true; + } + switch (Type.GetTypeCode(type)) { + case TypeCode.Boolean: + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Char: + return true; + default: + return false; + } + } + + internal static bool HasReferenceEquality(Type left, Type right) { + if (left.IsValueType || right.IsValueType) { + return false; + } + + // If we have an interface and a reference type then we can do + // reference equality. + + // If we have two reference types and one is assignable to the + // other then we can do reference equality. + + return left.IsInterface || right.IsInterface || + AreReferenceAssignable(left, right) || + AreReferenceAssignable(right, left); + } + + internal static bool HasBuiltInEqualityOperator(Type left, Type right) { + // If we have an interface and a reference type then we can do + // reference equality. + if (left.IsInterface && !right.IsValueType) { + return true; + } + if (right.IsInterface && !left.IsValueType) { + return true; + } + // If we have two reference types and one is assignable to the + // other then we can do reference equality. + if (!left.IsValueType && !right.IsValueType) { + if (AreReferenceAssignable(left, right) || AreReferenceAssignable(right, left)) { + return true; + } + } + // Otherwise, if the types are not the same then we definitely + // do not have a built-in equality operator. + if (!AreEquivalent(left, right)) { + return false; + } + // We have two identical value types, modulo nullability. (If they were both the + // same reference type then we would have returned true earlier.) + Debug.Assert(left.IsValueType); + // Equality between struct types is only defined for numerics, bools, enums, + // and their nullable equivalents. + Type nnType = GetNonNullableType(left); + if (nnType == typeof(bool) || IsNumeric(nnType) || nnType.IsEnum) { + return true; + } + return false; + } + + internal static bool IsImplicitlyConvertible(Type source, Type destination) { + return AreEquivalent(source, destination) || // identity conversion + IsImplicitNumericConversion(source, destination) || + IsImplicitReferenceConversion(source, destination) || + IsImplicitBoxingConversion(source, destination) || + IsImplicitNullableConversion(source, destination); + } + + + internal static MethodInfo GetUserDefinedCoercionMethod(Type convertFrom, Type convertToType, bool implicitOnly) { + // check for implicit coercions first + Type nnExprType = TypeUtils.GetNonNullableType(convertFrom); + Type nnConvType = TypeUtils.GetNonNullableType(convertToType); + // try exact match on types + MethodInfo[] eMethods = nnExprType.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); + MethodInfo method = FindConversionOperator(eMethods, convertFrom, convertToType, implicitOnly); + if (method != null) { + return method; + } + MethodInfo[] cMethods = nnConvType.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); + method = FindConversionOperator(cMethods, convertFrom, convertToType, implicitOnly); + if (method != null) { + return method; + } + // try lifted conversion + if (!TypeUtils.AreEquivalent(nnExprType, convertFrom) || + !TypeUtils.AreEquivalent(nnConvType, convertToType)) { + method = FindConversionOperator(eMethods, nnExprType, nnConvType, implicitOnly); + if (method == null) { + method = FindConversionOperator(cMethods, nnExprType, nnConvType, implicitOnly); + } + if (method != null) { + return method; + } + } + return null; + } + + internal static MethodInfo FindConversionOperator(MethodInfo[] methods, Type typeFrom, Type typeTo, bool implicitOnly) { + foreach (MethodInfo mi in methods) { + if (mi.Name != "op_Implicit" && (implicitOnly || mi.Name != "op_Explicit")) { + continue; + } + if (!TypeUtils.AreEquivalent(mi.ReturnType, typeTo)) { + continue; + } + ParameterInfo[] pis = mi.GetParametersCached(); + if (!TypeUtils.AreEquivalent(pis[0].ParameterType, typeFrom)) { + continue; + } + return mi; + } + return null; + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private static bool IsImplicitNumericConversion(Type source, Type destination) { + TypeCode tcSource = Type.GetTypeCode(source); + TypeCode tcDest = Type.GetTypeCode(destination); + + switch (tcSource) { + case TypeCode.SByte: + switch (tcDest) { + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Byte: + switch (tcDest) { + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Int16: + switch (tcDest) { + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.UInt16: + switch (tcDest) { + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Int32: + switch (tcDest) { + case TypeCode.Int64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.UInt32: + switch (tcDest) { + case TypeCode.UInt32: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Int64: + case TypeCode.UInt64: + switch (tcDest) { + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Char: + switch (tcDest) { + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return true; + } + return false; + case TypeCode.Single: + return (tcDest == TypeCode.Double); + } + return false; + } + + private static bool IsImplicitReferenceConversion(Type source, Type destination) { + return destination.IsAssignableFrom(source); + } + + private static bool IsImplicitBoxingConversion(Type source, Type destination) { + if (source.IsValueType && (destination == typeof(object) || destination == typeof(System.ValueType))) + return true; + if (source.IsEnum && destination == typeof(System.Enum)) + return true; + return false; + } + + private static bool IsImplicitNullableConversion(Type source, Type destination) { + if (IsNullableType(destination)) + return IsImplicitlyConvertible(GetNonNullableType(source), GetNonNullableType(destination)); + return false; + } + + internal static bool IsSameOrSubclass(Type type, Type subType) { + return AreEquivalent(type, subType) || subType.IsSubclassOf(type); + } + + internal static void ValidateType(Type type) { + if (type.IsGenericTypeDefinition) { + throw Error.TypeIsGeneric(type); + } + if (type.ContainsGenericParameters) { + throw Error.TypeContainsGenericParameters(type); + } + } + + //from TypeHelper + internal static Type FindGenericType(Type definition, Type type) { + while (type != null && type != typeof(object)) { + if (type.IsGenericType && AreEquivalent(type.GetGenericTypeDefinition(), definition)) { + return type; + } + if (definition.IsInterface) { + foreach (Type itype in type.GetInterfaces()) { + Type found = FindGenericType(definition, itype); + if (found != null) + return found; + } + } + type = type.BaseType; + } + return null; + } + + internal static bool IsUnsigned(Type type) { + type = GetNonNullableType(type); + switch (Type.GetTypeCode(type)) { + case TypeCode.Byte: + case TypeCode.UInt16: + case TypeCode.Char: + case TypeCode.UInt32: + case TypeCode.UInt64: + return true; + default: + return false; + } + } + + internal static bool IsFloatingPoint(Type type) { + type = GetNonNullableType(type); + switch (Type.GetTypeCode(type)) { + case TypeCode.Single: + case TypeCode.Double: + return true; + default: + return false; + } + } + + /// + /// Searches for an operator method on the type. The method must have + /// the specified signature, no generic arguments, and have the + /// SpecialName bit set. Also searches inherited operator methods. + /// + /// NOTE: This was designed to satisfy the needs of op_True and + /// op_False, because we have to do runtime lookup for those. It may + /// not work right for unary operators in general. + /// + internal static MethodInfo GetBooleanOperator(Type type, string name) { + do { + MethodInfo result = type.GetMethodValidated(name, AnyStatic, null, new Type[] { type }, null); + if (result != null && result.IsSpecialName && !result.ContainsGenericParameters) { + return result; + } + type = type.BaseType; + } while (type != null); + return null; + } + + internal static Type GetNonRefType(this Type type) { + return type.IsByRef ? type.GetElementType() : type; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/UnaryExpression.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/UnaryExpression.cs new file mode 100644 index 00000000000..dbdc26c57ea --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Ast/UnaryExpression.cs @@ -0,0 +1,989 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// Represents an expression that has a unary operator. + /// +#if !SILVERLIGHT + [DebuggerTypeProxy(typeof(Expression.UnaryExpressionProxy))] +#endif + public sealed class UnaryExpression : Expression { + private readonly Expression _operand; + private readonly MethodInfo _method; + private readonly ExpressionType _nodeType; + private readonly Type _type; + + internal UnaryExpression(ExpressionType nodeType, Expression expression, Type type, MethodInfo method) { + _operand = expression; + _method = method; + _nodeType = nodeType; + _type = type; + } + + /// + /// Gets the static type of the expression that this represents. (Inherited from .) + /// + /// The that represents the static type of the expression. + public sealed override Type Type { + get { return _type; } + } + + /// + /// Returns the node type of this . (Inherited from .) + /// + /// The that represents this expression. + public sealed override ExpressionType NodeType { + get { return _nodeType; } + } + + /// + /// Gets the operand of the unary operation. + /// + /// An that represents the operand of the unary operation. + public Expression Operand { + get { return _operand; } + } + + /// + /// Gets the implementing method for the unary operation. + /// + /// The that represents the implementing method. + public MethodInfo Method { + get { return _method; } + } + + /// + /// Gets a value that indicates whether the expression tree node represents a lifted call to an operator. + /// + /// true if the node represents a lifted call; otherwise, false. + public bool IsLifted { + get { + if (NodeType == ExpressionType.TypeAs || NodeType == ExpressionType.Quote || NodeType == ExpressionType.Throw) { + return false; + } + bool operandIsNullable = TypeUtils.IsNullableType(_operand.Type); + bool resultIsNullable = TypeUtils.IsNullableType(this.Type); + if (_method != null) { + return (operandIsNullable && !TypeUtils.AreEquivalent(_method.GetParametersCached()[0].ParameterType, _operand.Type)) || + (resultIsNullable && !TypeUtils.AreEquivalent(_method.ReturnType, this.Type)); + } + return operandIsNullable || resultIsNullable; + } + } + + /// + /// Gets a value that indicates whether the expression tree node represents a lifted call to an operator whose return type is lifted to a nullable type. + /// + /// true if the operator's return type is lifted to a nullable type; otherwise, false. + public bool IsLiftedToNull { + get { + return IsLifted && TypeUtils.IsNullableType(this.Type); + } + } + + internal override Expression Accept(ExpressionVisitor visitor) { + return visitor.VisitUnary(this); + } + + /// + /// Gets a value that indicates whether the expression tree node can be reduced. + /// + public override bool CanReduce { + get { + switch (_nodeType) { + case ExpressionType.PreIncrementAssign: + case ExpressionType.PreDecrementAssign: + case ExpressionType.PostIncrementAssign: + case ExpressionType.PostDecrementAssign: + return true; + } + return false; + } + } + + /// + /// Reduces the expression node to a simpler expression. + /// If CanReduce returns true, this should return a valid expression. + /// This method is allowed to return another node which itself + /// must be reduced. + /// + /// The reduced expression. + public override Expression Reduce() { + if (CanReduce) { + switch (_operand.NodeType) { + case ExpressionType.Index: + return ReduceIndex(); + case ExpressionType.MemberAccess: + return ReduceMember(); + default: + return ReduceVariable(); + } + } + return this; + } + + private bool IsPrefix { + get { return _nodeType == ExpressionType.PreIncrementAssign || _nodeType == ExpressionType.PreDecrementAssign; } + } + + private UnaryExpression FunctionalOp(Expression operand) { + ExpressionType functional; + if (_nodeType == ExpressionType.PreIncrementAssign || _nodeType == ExpressionType.PostIncrementAssign) { + functional = ExpressionType.Increment; + } else { + functional = ExpressionType.Decrement; + } + return new UnaryExpression(functional, operand, operand.Type, _method); + } + + private Expression ReduceVariable() { + if (IsPrefix) { + // (op) var + // ... is reduced into ... + // var = op(var) + return Assign(_operand, FunctionalOp(_operand)); + } + // var (op) + // ... is reduced into ... + // temp = var + // var = op(var) + // temp + var temp = Parameter(_operand.Type, null); + return Block( + new[] { temp }, + Assign(temp, _operand), + Assign(_operand, FunctionalOp(temp)), + temp + ); + } + + private Expression ReduceMember() { + var member = (MemberExpression)_operand; + if (member.Expression == null) { + //static member, reduce the same as variable + return ReduceVariable(); + } else { + var temp1 = Parameter(member.Expression.Type, null); + var initTemp1 = Assign(temp1, member.Expression); + member = MakeMemberAccess(temp1, member.Member); + + if (IsPrefix) { + // (op) value.member + // ... is reduced into ... + // temp1 = value + // temp1.member = op(temp1.member) + return Block( + new[] { temp1 }, + initTemp1, + Assign(member, FunctionalOp(member)) + ); + } + + // value.member (op) + // ... is reduced into ... + // temp1 = value + // temp2 = temp1.member + // temp1.member = op(temp2) + // temp2 + var temp2 = Parameter(member.Type, null); + return Block( + new[] { temp1, temp2 }, + initTemp1, + Assign(temp2, member), + Assign(member, FunctionalOp(temp2)), + temp2 + ); + } + } + + private Expression ReduceIndex() { + // left[a0, a1, ... aN] (op) + // + // ... is reduced into ... + // + // tempObj = left + // tempArg0 = a0 + // ... + // tempArgN = aN + // tempValue = tempObj[tempArg0, ... tempArgN] + // tempObj[tempArg0, ... tempArgN] = op(tempValue) + // tempValue + + bool prefix = IsPrefix; + var index = (IndexExpression)_operand; + int count = index.Arguments.Count; + var block = new Expression[count + (prefix ? 2 : 4)]; + var temps = new ParameterExpression[count + (prefix ? 1 : 2)]; + var args = new ParameterExpression[count]; + + int i = 0; + temps[i] = Parameter(index.Object.Type, null); + block[i] = Assign(temps[i], index.Object); + i++; + while (i <= count) { + var arg = index.Arguments[i - 1]; + args[i - 1] = temps[i] = Parameter(arg.Type, null); + block[i] = Assign(temps[i], arg); + i++; + } + index = MakeIndex(temps[0], index.Indexer, new TrueReadOnlyCollection(args)); + if (!prefix) { + var lastTemp = temps[i] = Parameter(index.Type, null); + block[i] = Assign(temps[i], index); + i++; + Debug.Assert(i == temps.Length); + block[i++] = Assign(index, FunctionalOp(lastTemp)); + block[i++] = lastTemp; + } else { + Debug.Assert(i == temps.Length); + block[i++] = Assign(index, FunctionalOp(index)); + } + Debug.Assert(i == block.Length); + return Block(new TrueReadOnlyCollection(temps), new TrueReadOnlyCollection(block)); + } + } + + public partial class Expression { + + /// + /// Creates a , given an operand, by calling the appropriate factory method. + /// + /// The that specifies the type of unary operation. + /// An that represents the operand. + /// The that specifies the type to be converted to (pass null if not applicable). + /// The that results from calling the appropriate factory method. + /// Thrown when does not correspond to a unary expression. + /// Thrown when is null. + public static UnaryExpression MakeUnary(ExpressionType unaryType, Expression operand, Type type) { + return MakeUnary(unaryType, operand, type, null); + } + + /// + /// Creates a , given an operand and implementing method, by calling the appropriate factory method. + /// + /// The that specifies the type of unary operation. + /// An that represents the operand. + /// The that specifies the type to be converted to (pass null if not applicable). + /// The that represents the implementing method. + /// The that results from calling the appropriate factory method. + /// Thrown when does not correspond to a unary expression. + /// Thrown when is null. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + public static UnaryExpression MakeUnary(ExpressionType unaryType, Expression operand, Type type, MethodInfo method) { + switch (unaryType) { + case ExpressionType.Negate: + return Negate(operand, method); + case ExpressionType.NegateChecked: + return NegateChecked(operand, method); + case ExpressionType.Not: + return Not(operand, method); + case ExpressionType.IsFalse: + return IsFalse(operand, method); + case ExpressionType.IsTrue: + return IsTrue(operand, method); + case ExpressionType.OnesComplement: + return OnesComplement(operand, method); + case ExpressionType.ArrayLength: + return ArrayLength(operand); + case ExpressionType.Convert: + return Convert(operand, type, method); + case ExpressionType.ConvertChecked: + return ConvertChecked(operand, type, method); + case ExpressionType.Throw: + return Throw(operand, type); + case ExpressionType.TypeAs: + return TypeAs(operand, type); + case ExpressionType.Quote: + return Quote(operand); + case ExpressionType.UnaryPlus: + return UnaryPlus(operand, method); + case ExpressionType.Unbox: + return Unbox(operand, type); + case ExpressionType.Increment: + return Increment(operand, method); + case ExpressionType.Decrement: + return Decrement(operand, method); + case ExpressionType.PreIncrementAssign: + return PreIncrementAssign(operand, method); + case ExpressionType.PostIncrementAssign: + return PostIncrementAssign(operand, method); + case ExpressionType.PreDecrementAssign: + return PreDecrementAssign(operand, method); + case ExpressionType.PostDecrementAssign: + return PostDecrementAssign(operand, method); + default: + throw Error.UnhandledUnary(unaryType); + } + } + + private static UnaryExpression GetUserDefinedUnaryOperatorOrThrow(ExpressionType unaryType, string name, Expression operand) { + UnaryExpression u = GetUserDefinedUnaryOperator(unaryType, name, operand); + if (u != null) { + ValidateParamswithOperandsOrThrow(u.Method.GetParametersCached()[0].ParameterType, operand.Type, unaryType, name); + return u; + } + throw Error.UnaryOperatorNotDefined(unaryType, operand.Type); + } + + private static UnaryExpression GetUserDefinedUnaryOperator(ExpressionType unaryType, string name, Expression operand) { + Type operandType = operand.Type; + Type[] types = new Type[] { operandType }; + Type nnOperandType = TypeUtils.GetNonNullableType(operandType); + BindingFlags flags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; + MethodInfo method = nnOperandType.GetMethodValidated(name, flags, null, types, null); + if (method != null) { + return new UnaryExpression(unaryType, operand, method.ReturnType, method); + } + // try lifted call + if (TypeUtils.IsNullableType(operandType)) { + types[0] = nnOperandType; + method = nnOperandType.GetMethodValidated(name, flags, null, types, null); + if (method != null && method.ReturnType.IsValueType && !TypeUtils.IsNullableType(method.ReturnType)) { + return new UnaryExpression(unaryType, operand, TypeUtils.GetNullableType(method.ReturnType), method); + } + } + return null; + } + + private static UnaryExpression GetMethodBasedUnaryOperator(ExpressionType unaryType, Expression operand, MethodInfo method) { + System.Diagnostics.Debug.Assert(method != null); + ValidateOperator(method); + ParameterInfo[] pms = method.GetParametersCached(); + if (pms.Length != 1) + throw Error.IncorrectNumberOfMethodCallArguments(method); + if (ParameterIsAssignable(pms[0], operand.Type)) { + ValidateParamswithOperandsOrThrow(pms[0].ParameterType, operand.Type, unaryType, method.Name); + return new UnaryExpression(unaryType, operand, method.ReturnType, method); + } + // check for lifted call + if (TypeUtils.IsNullableType(operand.Type) && + ParameterIsAssignable(pms[0], TypeUtils.GetNonNullableType(operand.Type)) && + method.ReturnType.IsValueType && !TypeUtils.IsNullableType(method.ReturnType)) { + return new UnaryExpression(unaryType, operand, TypeUtils.GetNullableType(method.ReturnType), method); + } + + throw Error.OperandTypesDoNotMatchParameters(unaryType, method.Name); + } + + private static UnaryExpression GetUserDefinedCoercionOrThrow(ExpressionType coercionType, Expression expression, Type convertToType) { + UnaryExpression u = GetUserDefinedCoercion(coercionType, expression, convertToType); + if (u != null) { + return u; + } + throw Error.CoercionOperatorNotDefined(expression.Type, convertToType); + } + + private static UnaryExpression GetUserDefinedCoercion(ExpressionType coercionType, Expression expression, Type convertToType) { + MethodInfo method = TypeUtils.GetUserDefinedCoercionMethod(expression.Type, convertToType, false); + if (method != null) { + return new UnaryExpression(coercionType, expression, convertToType, method); + } else { + return null; + } + } + + private static UnaryExpression GetMethodBasedCoercionOperator(ExpressionType unaryType, Expression operand, Type convertToType, MethodInfo method) { + System.Diagnostics.Debug.Assert(method != null); + ValidateOperator(method); + ParameterInfo[] pms = method.GetParametersCached(); + if (pms.Length != 1) { + throw Error.IncorrectNumberOfMethodCallArguments(method); + } + if (ParameterIsAssignable(pms[0], operand.Type) && TypeUtils.AreEquivalent(method.ReturnType, convertToType)) { + return new UnaryExpression(unaryType, operand, method.ReturnType, method); + } + // check for lifted call + if ((TypeUtils.IsNullableType(operand.Type) || TypeUtils.IsNullableType(convertToType)) && + ParameterIsAssignable(pms[0], TypeUtils.GetNonNullableType(operand.Type)) && + TypeUtils.AreEquivalent(method.ReturnType, TypeUtils.GetNonNullableType(convertToType))) { + return new UnaryExpression(unaryType, operand, convertToType, method); + } + throw Error.OperandTypesDoNotMatchParameters(unaryType, method.Name); + } + + /// + /// Creates a that represents an arithmetic negation operation. + /// + /// An to set the property equal to. + /// A that has the property equal to and the properties set to the specified value. + /// Thrown when is null. + /// Thrown when the unary minus operator is not defined for + public static UnaryExpression Negate(Expression expression) { + return Negate(expression, null); + } + + /// + /// Creates a that represents an arithmetic negation operation. + /// + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to and the and properties set to the specified value. + /// Thrown when is null. + /// Thrown when is not null and the method it represents returns void, is not static (Shared in Visual Basic), or does not take exactly one argument. + /// Thown when is null and the unary minus operator is not defined for expression.Type or expression.Type (or its corresponding non-nullable type if it is a nullable value type) is not assignable to the argument type of the method represented by method. + public static UnaryExpression Negate(Expression expression, MethodInfo method) { + RequiresCanRead(expression, "expression"); + if (method == null) { + if (TypeUtils.IsArithmetic(expression.Type) && !TypeUtils.IsUnsignedInt(expression.Type)) { + return new UnaryExpression(ExpressionType.Negate, expression, expression.Type, null); + } + return GetUserDefinedUnaryOperatorOrThrow(ExpressionType.Negate, "op_UnaryNegation", expression); + } + return GetMethodBasedUnaryOperator(ExpressionType.Negate, expression, method); + } + + /// + /// Creates a that represents a unary plus operation. + /// + /// An to set the property equal to. + /// A that has the property equal to and the property set to the specified value. + /// Thrown when is null. + /// Thown when the unary minus operator is not defined for expression.Type. + public static UnaryExpression UnaryPlus(Expression expression) { + return UnaryPlus(expression, null); + } + + /// + /// Creates a that represents a unary plus operation. + /// + /// An to set the property equal to. + /// A to set the property equal to. + /// A that has the property equal to and the and property set to the specified value. + /// Thrown when is null. + /// Thrown when is not null and the method it represents returns void, is not static (Shared in Visual Basic), or does not take exactly one argument. + /// Thown when is null and the unary minus operator is not defined for expression.Type or expression.Type (or its corresponding non-nullable type if it is a nullable value type) is not assignable to the argument type of the method represented by method. + public static UnaryExpression UnaryPlus(Expression expression, MethodInfo method) { + RequiresCanRead(expression, "expression"); + if (method == null) { + if (TypeUtils.IsArithmetic(expression.Type)) { + return new UnaryExpression(ExpressionType.UnaryPlus, expression, expression.Type, null); + } + return GetUserDefinedUnaryOperatorOrThrow(ExpressionType.UnaryPlus, "op_UnaryPlus", expression); + } + return GetMethodBasedUnaryOperator(ExpressionType.UnaryPlus, expression, method); + } + + /// Creates a that represents an arithmetic negation operation that has overflow checking. + /// A that has the property equal to and the property set to the specified value. + /// An to set the property equal to. + /// + /// Thrown when is null. + /// Thrown when the unary minus operator is not defined for .Type. + public static UnaryExpression NegateChecked(Expression expression) { + return NegateChecked(expression, null); + } + + ///Creates a that represents an arithmetic negation operation that has overflow checking. The implementing method can be specified. + ///A that has the property equal to and the and properties set to the specified values. + ///An to set the property equal to. + ///A to set the property equal to. + /// + /// is null. + /// + /// is not null and the method it represents returns void, is not static (Shared in Visual Basic), or does not take exactly one argument. + /// + /// is null and the unary minus operator is not defined for .Type.-or-.Type (or its corresponding non-nullable type if it is a nullable value type) is not assignable to the argument type of the method represented by . + public static UnaryExpression NegateChecked(Expression expression, MethodInfo method) { + RequiresCanRead(expression, "expression"); + if (method == null) { + if (TypeUtils.IsArithmetic(expression.Type) && !TypeUtils.IsUnsignedInt(expression.Type)) { + return new UnaryExpression(ExpressionType.NegateChecked, expression, expression.Type, null); + } + return GetUserDefinedUnaryOperatorOrThrow(ExpressionType.NegateChecked, "op_UnaryNegation", expression); + } + return GetMethodBasedUnaryOperator(ExpressionType.NegateChecked, expression, method); + } + + ///Creates a that represents a bitwise complement operation. + ///A that has the property equal to and the property set to the specified value. + ///An to set the property equal to. + /// + /// is null. + ///The unary not operator is not defined for .Type. + public static UnaryExpression Not(Expression expression) { + return Not(expression, null); + } + + ///Creates a that represents a bitwise complement operation. The implementing method can be specified. + ///A that has the property equal to and the and properties set to the specified values. + ///An to set the property equal to. + ///A to set the property equal to. + /// + /// is null. + /// + /// is not null and the method it represents returns void, is not static (Shared in Visual Basic), or does not take exactly one argument. + /// + /// is null and the unary not operator is not defined for .Type.-or-.Type (or its corresponding non-nullable type if it is a nullable value type) is not assignable to the argument type of the method represented by . + public static UnaryExpression Not(Expression expression, MethodInfo method) { + RequiresCanRead(expression, "expression"); + if (method == null) { + if (TypeUtils.IsIntegerOrBool(expression.Type)) { + return new UnaryExpression(ExpressionType.Not, expression, expression.Type, null); + } + UnaryExpression u = GetUserDefinedUnaryOperator(ExpressionType.Not, "op_LogicalNot", expression); + if (u != null) { + return u; + } + return GetUserDefinedUnaryOperatorOrThrow(ExpressionType.Not, "op_OnesComplement", expression); + } + return GetMethodBasedUnaryOperator(ExpressionType.Not, expression, method); + } + + /// + /// Returns whether the expression evaluates to false. + /// + /// An to evaluate. + /// An instance of . + public static UnaryExpression IsFalse(Expression expression) { + return IsFalse(expression, null); + } + + /// + /// Returns whether the expression evaluates to false. + /// + ///An to evaluate. + ///A that represents the implementing method. + /// An instance of . + public static UnaryExpression IsFalse(Expression expression, MethodInfo method) { + RequiresCanRead(expression, "expression"); + if (method == null) { + if (TypeUtils.IsBool(expression.Type)) { + return new UnaryExpression(ExpressionType.IsFalse, expression, expression.Type, null); + } + return GetUserDefinedUnaryOperatorOrThrow(ExpressionType.IsFalse, "op_False", expression); + } + return GetMethodBasedUnaryOperator(ExpressionType.IsFalse, expression, method); + } + + /// + /// Returns whether the expression evaluates to true. + /// + /// An to evaluate. + /// An instance of . + public static UnaryExpression IsTrue(Expression expression) { + return IsTrue(expression, null); + } + + /// + /// Returns whether the expression evaluates to true. + /// + ///An to evaluate. + ///A that represents the implementing method. + /// An instance of . + public static UnaryExpression IsTrue(Expression expression, MethodInfo method) { + RequiresCanRead(expression, "expression"); + if (method == null) { + if (TypeUtils.IsBool(expression.Type)) { + return new UnaryExpression(ExpressionType.IsTrue, expression, expression.Type, null); + } + return GetUserDefinedUnaryOperatorOrThrow(ExpressionType.IsTrue, "op_True", expression); + } + return GetMethodBasedUnaryOperator(ExpressionType.IsTrue, expression, method); + } + + /// + /// Returns the expression representing the ones complement. + /// + ///An . + /// An instance of . + public static UnaryExpression OnesComplement(Expression expression) { + return OnesComplement(expression, null); + } + + /// + /// Returns the expression representing the ones complement. + /// + /// An . + /// A that represents the implementing method. + /// An instance of . + public static UnaryExpression OnesComplement(Expression expression, MethodInfo method) { + RequiresCanRead(expression, "expression"); + if (method == null) { + if (TypeUtils.IsInteger(expression.Type)) { + return new UnaryExpression(ExpressionType.OnesComplement, expression, expression.Type, null); + } + return GetUserDefinedUnaryOperatorOrThrow(ExpressionType.OnesComplement, "op_OnesComplement", expression); + } + return GetMethodBasedUnaryOperator(ExpressionType.OnesComplement, expression, method); + } + + ///Creates a that represents an explicit reference or boxing conversion where null is supplied if the conversion fails. + ///A that has the property equal to and the and properties set to the specified values. + ///An to set the property equal to. + ///A to set the property equal to. + /// + /// or is null. + public static UnaryExpression TypeAs(Expression expression, Type type) { + RequiresCanRead(expression, "expression"); + ContractUtils.RequiresNotNull(type, "type"); + TypeUtils.ValidateType(type); + + if (type.IsValueType && !TypeUtils.IsNullableType(type)) { + throw Error.IncorrectTypeForTypeAs(type); + } + return new UnaryExpression(ExpressionType.TypeAs, expression, type, null); + } + + /// + /// Creates a that represents an explicit unboxing. + /// + /// An to unbox. + /// The new of the expression. + /// An instance of . + public static UnaryExpression Unbox(Expression expression, Type type) { + RequiresCanRead(expression, "expression"); + ContractUtils.RequiresNotNull(type, "type"); + ContractUtils.Requires( + expression.Type.IsInterface || expression.Type == typeof(object), + "expression", Strings.InvalidUnboxType + ); + ContractUtils.Requires(type.IsValueType, "type", Strings.InvalidUnboxType); + TypeUtils.ValidateType(type); + return new UnaryExpression(ExpressionType.Unbox, expression, type, null); + } + + ///Creates a that represents a conversion operation. + ///A that has the property equal to and the and properties set to the specified values. + ///An to set the property equal to. + ///A to set the property equal to. + /// + /// or is null. + ///No conversion operator is defined between .Type and . + public static UnaryExpression Convert(Expression expression, Type type) { + return Convert(expression, type, null); + } + + ///Creates a that represents a conversion operation for which the implementing method is specified. + ///A that has the property equal to and the , , and properties set to the specified values. + ///An to set the property equal to. + ///A to set the property equal to. + ///A to set the property equal to. + /// + /// or is null. + /// + /// is not null and the method it represents returns void, is not static (Shared in Visual Basic), or does not take exactly one argument. + ///More than one method that matches the description was found. + ///No conversion operator is defined between .Type and .-or-.Type is not assignable to the argument type of the method represented by .-or-The return type of the method represented by is not assignable to .-or-.Type or is a nullable value type and the corresponding non-nullable value type does not equal the argument type or the return type, respectively, of the method represented by . + public static UnaryExpression Convert(Expression expression, Type type, MethodInfo method) { + RequiresCanRead(expression, "expression"); + ContractUtils.RequiresNotNull(type, "type"); + TypeUtils.ValidateType(type); + + if (method == null) { + if (TypeUtils.HasIdentityPrimitiveOrNullableConversion(expression.Type, type) || + TypeUtils.HasReferenceConversion(expression.Type, type)) { + return new UnaryExpression(ExpressionType.Convert, expression, type, null); + } + return GetUserDefinedCoercionOrThrow(ExpressionType.Convert, expression, type); + } + return GetMethodBasedCoercionOperator(ExpressionType.Convert, expression, type, method); + } + + ///Creates a that represents a conversion operation that throws an exception if the target type is overflowed. + ///A that has the property equal to and the and properties set to the specified values. + ///An to set the property equal to. + ///A to set the property equal to. + /// + /// or is null. + ///No conversion operator is defined between .Type and . + public static UnaryExpression ConvertChecked(Expression expression, Type type) { + return ConvertChecked(expression, type, null); + } + + ///Creates a that represents a conversion operation that throws an exception if the target type is overflowed and for which the implementing method is specified. + ///A that has the property equal to and the , , and properties set to the specified values. + ///An to set the property equal to. + ///A to set the property equal to. + ///A to set the property equal to. + /// + /// or is null. + /// + /// is not null and the method it represents returns void, is not static (Shared in Visual Basic), or does not take exactly one argument. + ///More than one method that matches the description was found. + ///No conversion operator is defined between .Type and .-or-.Type is not assignable to the argument type of the method represented by .-or-The return type of the method represented by is not assignable to .-or-.Type or is a nullable value type and the corresponding non-nullable value type does not equal the argument type or the return type, respectively, of the method represented by . + public static UnaryExpression ConvertChecked(Expression expression, Type type, MethodInfo method) { + RequiresCanRead(expression, "expression"); + ContractUtils.RequiresNotNull(type, "type"); + TypeUtils.ValidateType(type); + + if (method == null) { + if (TypeUtils.HasIdentityPrimitiveOrNullableConversion(expression.Type, type)) { + return new UnaryExpression(ExpressionType.ConvertChecked, expression, type, null); + } + if (TypeUtils.HasReferenceConversion(expression.Type, type)) { + return new UnaryExpression(ExpressionType.Convert, expression, type, null); + } + return GetUserDefinedCoercionOrThrow(ExpressionType.ConvertChecked, expression, type); + } + return GetMethodBasedCoercionOperator(ExpressionType.ConvertChecked, expression, type, method); + } + + ///Creates a that represents getting the length of a one-dimensional array. + ///A that has the property equal to and the property equal to . + ///An to set the property equal to. + /// + /// is null. + /// + ///.Type does not represent an array type. + public static UnaryExpression ArrayLength(Expression array) { + ContractUtils.RequiresNotNull(array, "array"); + if (!array.Type.IsArray || !typeof(Array).IsAssignableFrom(array.Type)) { + throw Error.ArgumentMustBeArray(); + } + if (array.Type.GetArrayRank() != 1) { + throw Error.ArgumentMustBeSingleDimensionalArrayType(); + } + return new UnaryExpression(ExpressionType.ArrayLength, array, typeof(int), null); + } + + ///Creates a that represents an expression that has a constant value of type . + ///A that has the property equal to and the property set to the specified value. + ///An to set the property equal to. + /// + /// is null. + public static UnaryExpression Quote(Expression expression) { + RequiresCanRead(expression, "expression"); + ContractUtils.Requires(expression is LambdaExpression, Strings.QuotedExpressionMustBeLambda); + return new UnaryExpression(ExpressionType.Quote, expression, expression.GetType(), null); + } + + /// + /// Creates a that represents a rethrowing of an exception. + /// + /// A that represents a rethrowing of an exception. + public static UnaryExpression Rethrow() { + return Throw(null); + } + + /// + /// Creates a that represents a rethrowing of an exception with a given type. + /// + ///The new of the expression. + /// A that represents a rethrowing of an exception. + public static UnaryExpression Rethrow(Type type) { + return Throw(null, type); + } + + /// + /// Creates a that represents a throwing of an exception. + /// + /// An . + /// A that represents the exception. + public static UnaryExpression Throw(Expression value) { + return Throw(value, typeof(void)); + } + + /// + /// Creates a that represents a throwing of a value with a given type. + /// + /// An . + /// The new of the expression. + /// A that represents the exception. + public static UnaryExpression Throw(Expression value, Type type) { + ContractUtils.RequiresNotNull(type, "type"); + TypeUtils.ValidateType(type); + + if (value != null) { + RequiresCanRead(value, "value"); + ContractUtils.Requires(!value.Type.IsValueType, "value", Strings.ArgumentMustNotHaveValueType); + } + return new UnaryExpression(ExpressionType.Throw, value, type, null); + } + + /// + /// Creates a that represents the incrementing of the expression by 1. + /// + /// An to increment. + /// A that represents the incremented expression. + public static UnaryExpression Increment(Expression expression) { + return Increment(expression, null); + } + + /// + /// Creates a that represents the incrementing of the expression by 1. + /// + /// An to increment. + ///A that represents the implementing method. + /// A that represents the incremented expression. + public static UnaryExpression Increment(Expression expression, MethodInfo method) { + RequiresCanRead(expression, "expression"); + if (method == null) { + if (TypeUtils.IsArithmetic(expression.Type)) { + return new UnaryExpression(ExpressionType.Increment, expression, expression.Type, null); + } + return GetUserDefinedUnaryOperatorOrThrow(ExpressionType.Increment, "op_Increment", expression); + } + return GetMethodBasedUnaryOperator(ExpressionType.Increment, expression, method); + } + + /// + /// Creates a that represents the decrementing of the expression by 1. + /// + /// An to decrement. + /// A that represents the decremented expression. + public static UnaryExpression Decrement(Expression expression) { + return Decrement(expression, null); + } + + /// + /// Creates a that represents the decrementing of the expression by 1. + /// + /// An to decrement. + ///A that represents the implementing method. + /// A that represents the decremented expression. + public static UnaryExpression Decrement(Expression expression, MethodInfo method) { + RequiresCanRead(expression, "expression"); + if (method == null) { + if (TypeUtils.IsArithmetic(expression.Type)) { + return new UnaryExpression(ExpressionType.Decrement, expression, expression.Type, null); + } + return GetUserDefinedUnaryOperatorOrThrow(ExpressionType.Decrement, "op_Decrement", expression); + } + return GetMethodBasedUnaryOperator(ExpressionType.Decrement, expression, method); + } + + /// + /// Creates a that increments the expression by 1 + /// and assigns the result back to the expression. + /// + /// An to apply the operations on. + /// A that represents the resultant expression. + public static UnaryExpression PreIncrementAssign(Expression expression) { + return MakeOpAssignUnary(ExpressionType.PreIncrementAssign, expression, null); + + } + + /// + /// Creates a that increments the expression by 1 + /// and assigns the result back to the expression. + /// + /// An to apply the operations on. + /// A that represents the implementing method. + /// A that represents the resultant expression. + public static UnaryExpression PreIncrementAssign(Expression expression, MethodInfo method) { + return MakeOpAssignUnary(ExpressionType.PreIncrementAssign, expression, method); + } + + /// + /// Creates a that decrements the expression by 1 + /// and assigns the result back to the expression. + /// + /// An to apply the operations on. + /// A that represents the resultant expression. + public static UnaryExpression PreDecrementAssign(Expression expression) { + return MakeOpAssignUnary(ExpressionType.PreDecrementAssign, expression, null); + } + + /// + /// Creates a that decrements the expression by 1 + /// and assigns the result back to the expression. + /// + /// An to apply the operations on. + /// A that represents the implementing method. + /// A that represents the resultant expression. + public static UnaryExpression PreDecrementAssign(Expression expression, MethodInfo method) { + return MakeOpAssignUnary(ExpressionType.PreDecrementAssign, expression, method); + } + + /// + /// Creates a that represents the assignment of the expression + /// followed by a subsequent increment by 1 of the original expression. + /// + /// An to apply the operations on. + /// A that represents the resultant expression. + public static UnaryExpression PostIncrementAssign(Expression expression) { + return MakeOpAssignUnary(ExpressionType.PostIncrementAssign, expression, null); + } + + /// + /// Creates a that represents the assignment of the expression + /// followed by a subsequent increment by 1 of the original expression. + /// + /// An to apply the operations on. + /// A that represents the implementing method. + /// A that represents the resultant expression. + public static UnaryExpression PostIncrementAssign(Expression expression, MethodInfo method) { + return MakeOpAssignUnary(ExpressionType.PostIncrementAssign, expression, method); + } + + /// + /// Creates a that represents the assignment of the expression + /// followed by a subsequent decrement by 1 of the original expression. + /// + /// An to apply the operations on. + /// A that represents the resultant expression. + public static UnaryExpression PostDecrementAssign(Expression expression) { + return MakeOpAssignUnary(ExpressionType.PostDecrementAssign, expression, null); + } + + /// + /// Creates a that represents the assignment of the expression + /// followed by a subsequent decrement by 1 of the original expression. + /// + /// An to apply the operations on. + /// A that represents the implementing method. + /// A that represents the resultant expression. + public static UnaryExpression PostDecrementAssign(Expression expression, MethodInfo method) { + return MakeOpAssignUnary(ExpressionType.PostDecrementAssign, expression, method); + } + + private static UnaryExpression MakeOpAssignUnary(ExpressionType kind, Expression expression, MethodInfo method) { + RequiresCanRead(expression, "expression"); + RequiresCanWrite(expression, "expression"); + + UnaryExpression result; + if (method == null) { + if (TypeUtils.IsArithmetic(expression.Type)) { + return new UnaryExpression(kind, expression, expression.Type, null); + } + string name; + if (kind == ExpressionType.PreIncrementAssign || kind == ExpressionType.PostIncrementAssign) { + name = "op_Increment"; + } else { + name = "op_Decrement"; + } + result = GetUserDefinedUnaryOperatorOrThrow(kind, name, expression); + } else { + result = GetMethodBasedUnaryOperator(kind, expression, method); + } + // return type must be assignable back to the operand type + if (!TypeUtils.AreReferenceAssignable(expression.Type, result.Type)) { + throw Error.UserDefinedOpMustHaveValidReturnType(kind, method.Name); + } + return result; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/AnalyzedTree.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/AnalyzedTree.cs new file mode 100644 index 00000000000..13a09fddbb7 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/AnalyzedTree.cs @@ -0,0 +1,47 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics.SymbolStore; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + internal sealed class AnalyzedTree { + internal readonly Dictionary Scopes = new Dictionary(); + internal readonly Dictionary Constants = new Dictionary(); + + internal DebugInfoGenerator DebugInfoGenerator { get; set; } + + // Created by VariableBinder + internal AnalyzedTree() { + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/AssemblyGen.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/AssemblyGen.cs new file mode 100644 index 00000000000..750425c21a9 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/AssemblyGen.cs @@ -0,0 +1,184 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.IO; +using System.Reflection; +using System.Reflection.Emit; +using System.Security; +using System.Text; +using System.Threading; + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + internal sealed class AssemblyGen { + private static AssemblyGen _assembly; + + // Testing options. Only ever set in MICROSOFT_SCRIPTING_CORE build + // configurations, see SetSaveAssemblies +#if MICROSOFT_SCRIPTING_CORE + private static string _saveAssembliesPath; + private static bool _saveAssemblies; +#endif + + private readonly AssemblyBuilder _myAssembly; + private readonly ModuleBuilder _myModule; + +#if MICROSOFT_SCRIPTING_CORE && !SILVERLIGHT + private readonly string _outFileName; // can be null iff !SaveAndReloadAssemblies + private readonly string _outDir; // null means the current directory +#endif + private int _index; + + private static AssemblyGen Assembly { + get { + if (_assembly == null) { + Interlocked.CompareExchange(ref _assembly, new AssemblyGen(), null); + } + return _assembly; + } + } + + private AssemblyGen() { + var name = new AssemblyName("Snippets"); + +#if SILVERLIGHT // AssemblyBuilderAccess.RunAndSave, Environment.CurrentDirectory + _myAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run); + _myModule = _myAssembly.DefineDynamicModule(name.Name, false); +#else + + // mark the assembly transparent so that it works in partial trust: + var attributes = new[] { + new CustomAttributeBuilder(typeof(SecurityTransparentAttribute).GetConstructor(Type.EmptyTypes), new object[0]) + }; + +#if MICROSOFT_SCRIPTING_CORE + if (_saveAssemblies) { + string outDir = _saveAssembliesPath ?? Directory.GetCurrentDirectory(); + try { + outDir = Path.GetFullPath(outDir); + } catch (Exception) { + throw Error.InvalidOutputDir(); + } + try { + Path.Combine(outDir, name.Name + ".dll"); + } catch (ArgumentException) { + throw Error.InvalidAsmNameOrExtension(); + } + + _outFileName = name.Name + ".dll"; + _outDir = outDir; + _myAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave, outDir, + null, null, null, null, false, attributes); + + _myModule = _myAssembly.DefineDynamicModule(name.Name, _outFileName, false); + } else +#endif + { + _myAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run, attributes); + _myModule = _myAssembly.DefineDynamicModule(name.Name, false); + } + + _myAssembly.DefineVersionInfoResource(); +#endif + } + + private TypeBuilder DefineType(string name, Type parent, TypeAttributes attr) { + ContractUtils.RequiresNotNull(name, "name"); + ContractUtils.RequiresNotNull(parent, "parent"); + + StringBuilder sb = new StringBuilder(name); + + int index = Interlocked.Increment(ref _index); + sb.Append("$"); + sb.Append(index); + + // There is a bug in Reflection.Emit that leads to + // Unhandled Exception: System.Runtime.InteropServices.COMException (0x80131130): Record not found on lookup. + // if there is any of the characters []*&+,\ in the type name and a method defined on the type is called. + sb.Replace('+', '_').Replace('[', '_').Replace(']', '_').Replace('*', '_').Replace('&', '_').Replace(',', '_').Replace('\\', '_'); + + name = sb.ToString(); + + return _myModule.DefineType(name, attr, parent); + } + + internal static TypeBuilder DefineDelegateType(string name) { + return Assembly.DefineType( + name, + typeof(MulticastDelegate), + TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.AnsiClass | TypeAttributes.AutoClass + ); + } + +#if MICROSOFT_SCRIPTING_CORE + //Return the location of the saved assembly file. + //The file location is used by PE verification in Microsoft.Scripting. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal string SaveAssembly() { +#if !SILVERLIGHT // AssemblyBuilder.Save + _myAssembly.Save(_outFileName, PortableExecutableKinds.ILOnly, ImageFileMachine.I386); + return Path.Combine(_outDir, _outFileName); +#else + return null; +#endif + } + + // NOTE: this method is called through reflection from Microsoft.Scripting + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal static void SetSaveAssemblies(bool enable, string directory) { + _saveAssemblies = enable; + _saveAssembliesPath = directory; + } + + // NOTE: this method is called through reflection from Microsoft.Scripting + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal static string[] SaveAssembliesToDisk() { + if (!_saveAssemblies) { + return new string[0]; + } + + var assemlyLocations = new List(); + + // first save all assemblies to disk: + if (_assembly != null) { + string assemblyLocation = _assembly.SaveAssembly(); + if (assemblyLocation != null) { + assemlyLocations.Add(assemblyLocation); + } + _assembly = null; + } + + return assemlyLocations.ToArray(); + } +#endif + } + + internal static class SymbolGuids { + internal static readonly Guid DocumentType_Text = + new Guid(0x5a869d0b, 0x6611, 0x11d3, 0xbd, 0x2a, 0, 0, 0xf8, 8, 0x49, 0xbd); + } +} + diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/BoundConstants.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/BoundConstants.cs new file mode 100644 index 00000000000..9893c6ff726 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/BoundConstants.cs @@ -0,0 +1,193 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + /// + /// This type tracks "runtime" constants--live objects that appear in + /// ConstantExpression nodes and must be bound to the delegate. + /// + internal sealed class BoundConstants { + + /// + /// Constants can emit themselves as different types + /// For caching purposes, we need to treat each distinct Type as a + /// seperate thing to cache. (If we have to cast it on the way out, it + /// ends up using a JIT temp and defeats the purpose of caching the + /// value in a local) + /// + private struct TypedConstant : IEquatable { + internal readonly object Value; + internal readonly Type Type; + + internal TypedConstant(object value, Type type) { + Value = value; + Type = type; + } + + public override int GetHashCode() { + return RuntimeHelpers.GetHashCode(Value) ^ Type.GetHashCode(); + } + public bool Equals(TypedConstant other) { + return object.ReferenceEquals(Value, other.Value) && Type.Equals(other.Type); + } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2231:OverloadOperatorEqualsOnOverridingValueTypeEquals")] + public override bool Equals(object obj) { + return (obj is TypedConstant) && Equals((TypedConstant)obj); + } + } + + /// + /// The list of constants in the order they appear in the constant array + /// + private readonly List _values = new List(); + + /// + /// The index of each constant in the constant array + /// + private readonly Dictionary _indexes = new Dictionary(ReferenceEqualityComparer.Instance); + + /// + /// Each constant referenced within this lambda, and how often it was referenced + /// + private readonly Dictionary _references = new Dictionary(); + + /// + /// IL locals for storing frequently used constants + /// + private readonly Dictionary _cache = new Dictionary(); + + internal int Count { + get { return _values.Count; } + } + + internal object[] ToArray() { + return _values.ToArray(); + } + + /// + /// Called by VariableBinder. Adds the constant to the list (if needed) + /// and increases the reference count by one + /// + internal void AddReference(object value, Type type) { + if (!_indexes.ContainsKey(value)) { + _indexes.Add(value, _values.Count); + _values.Add(value); + } + Helpers.IncrementCount(new TypedConstant(value, type), _references); + } + + /// + /// Emits a live object as a constant + /// + internal void EmitConstant(LambdaCompiler lc, object value, Type type) { + Debug.Assert(!ILGen.CanEmitConstant(value, type)); + + if (!lc.CanEmitBoundConstants) { + throw Error.CannotCompileConstant(value); + } + + LocalBuilder local; + if (_cache.TryGetValue(new TypedConstant(value, type), out local)) { + lc.IL.Emit(OpCodes.Ldloc, local); + return; + } + EmitConstantsArray(lc); + EmitConstantFromArray(lc, value, type); + } + + /// + /// Emit code to cache frequently used constants into IL locals, + /// instead of pulling them out of the array each time + /// + internal void EmitCacheConstants(LambdaCompiler lc) { + int count = 0; + foreach (var reference in _references) { + if (!lc.CanEmitBoundConstants) { + throw Error.CannotCompileConstant(reference.Value); + } + + if (ShouldCache(reference.Value)) { + count++; + } + } + if (count == 0) { + return; + } + EmitConstantsArray(lc); + foreach (var reference in _references) { + if (ShouldCache(reference.Value)) { + if (--count > 0) { + // Dup array to keep it on the stack + lc.IL.Emit(OpCodes.Dup); + } + LocalBuilder local = lc.IL.DeclareLocal(reference.Key.Type); + EmitConstantFromArray(lc, reference.Key.Value, local.LocalType); + lc.IL.Emit(OpCodes.Stloc, local); + _cache.Add(reference.Key, local); + } + } + } + + private static bool ShouldCache(int refCount) { + // This caching is too aggressive in the face of conditionals and + // switch. Also, it is too conservative for variables used inside + // of loops. + return refCount > 2; + } + + private static void EmitConstantsArray(LambdaCompiler lc) { + Debug.Assert(lc.CanEmitBoundConstants); // this should've been checked already + + lc.EmitClosureArgument(); + lc.IL.Emit(OpCodes.Ldfld, typeof(Closure).GetField("Constants")); + } + + private void EmitConstantFromArray(LambdaCompiler lc, object value, Type type) { + int index; + if (!_indexes.TryGetValue(value, out index)) { + _indexes.Add(value, index = _values.Count); + _values.Add(value); + } + + lc.IL.EmitInt(index); + lc.IL.Emit(OpCodes.Ldelem_Ref); + if (type.IsValueType) { + lc.IL.Emit(OpCodes.Unbox_Any, type); + } else if (type != typeof(object)) { + lc.IL.Emit(OpCodes.Castclass, type); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/Closure.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/Closure.cs new file mode 100644 index 00000000000..58c8b375a55 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/Closure.cs @@ -0,0 +1,57 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.ComponentModel; +using System.Diagnostics; + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + + /// + /// This API supports the .NET Framework infrastructure and is not intended to be used directly from your code. + /// Represents the runtime state of a dynamically generated method. + /// + [EditorBrowsable(EditorBrowsableState.Never), DebuggerStepThrough] + public sealed class Closure { + /// + /// Represents the non-trivial constants and locally executable expressions that are referenced by a dynamically generated method. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2105:ArrayFieldsShouldNotBeReadOnly")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] + public readonly object[] Constants; + + /// + /// Represents the hoisted local variables from the parent context. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2105:ArrayFieldsShouldNotBeReadOnly")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] + public readonly object[] Locals; + + /// + /// Creates an object to hold state of a dynamically generated method. + /// + /// The constant values used by the method. + /// The hoisted local variables from the parent context. + public Closure(object[] constants, object[] locals) { + Constants = constants; + Locals = locals; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/CompilerScope.Storage.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/CompilerScope.Storage.cs new file mode 100644 index 00000000000..0e348c26967 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/CompilerScope.Storage.cs @@ -0,0 +1,191 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + internal sealed partial class CompilerScope { + + private abstract class Storage { + internal readonly LambdaCompiler Compiler; + internal readonly ParameterExpression Variable; + + internal Storage(LambdaCompiler compiler, ParameterExpression variable) { + Compiler = compiler; + Variable = variable; + } + + internal abstract void EmitLoad(); + internal abstract void EmitAddress(); + internal abstract void EmitStore(); + + internal virtual void EmitStore(Storage value) { + value.EmitLoad(); + EmitStore(); + } + + internal virtual void FreeLocal() { + } + } + + private sealed class LocalStorage : Storage { + private readonly LocalBuilder _local; + + internal LocalStorage(LambdaCompiler compiler, ParameterExpression variable) + : base(compiler, variable) { + // ByRef variables are supported. This is used internally by + // the compiler when emitting an inlined lambda invoke, to + // handle ByRef parameters. BlockExpression prevents this + // from being exposed to user created trees. + _local = compiler.GetNamedLocal(variable.IsByRef ? variable.Type.MakeByRefType() : variable.Type, variable); + } + + internal override void EmitLoad() { + Compiler.IL.Emit(OpCodes.Ldloc, _local); + } + + internal override void EmitStore() { + Compiler.IL.Emit(OpCodes.Stloc, _local); + } + + internal override void EmitAddress() { + Compiler.IL.Emit(OpCodes.Ldloca, _local); + } + } + + private sealed class ArgumentStorage : Storage { + private readonly int _argument; + + internal ArgumentStorage(LambdaCompiler compiler, ParameterExpression p) + : base(compiler, p) { + _argument = compiler.GetLambdaArgument(compiler.Parameters.IndexOf(p)); + } + + internal override void EmitLoad() { + Compiler.IL.EmitLoadArg(_argument); + } + + internal override void EmitStore() { + Compiler.IL.EmitStoreArg(_argument); + } + + internal override void EmitAddress() { + Compiler.IL.EmitLoadArgAddress(_argument); + } + } + + private sealed class ElementBoxStorage : Storage { + private readonly int _index; + private readonly Storage _array; + private readonly Type _boxType; + private readonly FieldInfo _boxValueField; + + internal ElementBoxStorage(Storage array, int index, ParameterExpression variable) + : base(array.Compiler, variable) { + _array = array; + _index = index; + _boxType = typeof(StrongBox<>).MakeGenericType(variable.Type); + _boxValueField = _boxType.GetField("Value"); + } + + internal override void EmitLoad() { + EmitLoadBox(); + Compiler.IL.Emit(OpCodes.Ldfld, _boxValueField); + } + + internal override void EmitStore() { + LocalBuilder value = Compiler.GetLocal(Variable.Type); + Compiler.IL.Emit(OpCodes.Stloc, value); + EmitLoadBox(); + Compiler.IL.Emit(OpCodes.Ldloc, value); + Compiler.FreeLocal(value); + Compiler.IL.Emit(OpCodes.Stfld, _boxValueField); + } + + internal override void EmitStore(Storage value) { + EmitLoadBox(); + value.EmitLoad(); + Compiler.IL.Emit(OpCodes.Stfld, _boxValueField); + } + + internal override void EmitAddress() { + EmitLoadBox(); + Compiler.IL.Emit(OpCodes.Ldflda, _boxValueField); + } + + internal void EmitLoadBox() { + _array.EmitLoad(); + Compiler.IL.EmitInt(_index); + Compiler.IL.Emit(OpCodes.Ldelem_Ref); + Compiler.IL.Emit(OpCodes.Castclass, _boxType); + } + } + + private sealed class LocalBoxStorage : Storage { + private readonly LocalBuilder _boxLocal; + private readonly Type _boxType; + private readonly FieldInfo _boxValueField; + + internal LocalBoxStorage(LambdaCompiler compiler, ParameterExpression variable) + : base(compiler, variable) { + _boxType = typeof(StrongBox<>).MakeGenericType(variable.Type); + _boxValueField = _boxType.GetField("Value"); + _boxLocal = compiler.GetNamedLocal(_boxType, variable); + } + + internal override void EmitLoad() { + Compiler.IL.Emit(OpCodes.Ldloc, _boxLocal); + Compiler.IL.Emit(OpCodes.Ldfld, _boxValueField); + } + + internal override void EmitAddress() { + Compiler.IL.Emit(OpCodes.Ldloc, _boxLocal); + Compiler.IL.Emit(OpCodes.Ldflda, _boxValueField); + } + + internal override void EmitStore() { + LocalBuilder value = Compiler.GetLocal(Variable.Type); + Compiler.IL.Emit(OpCodes.Stloc, value); + Compiler.IL.Emit(OpCodes.Ldloc, _boxLocal); + Compiler.IL.Emit(OpCodes.Ldloc, value); + Compiler.FreeLocal(value); + Compiler.IL.Emit(OpCodes.Stfld, _boxValueField); + } + + internal override void EmitStore(Storage value) { + Compiler.IL.Emit(OpCodes.Ldloc, _boxLocal); + value.EmitLoad(); + Compiler.IL.Emit(OpCodes.Stfld, _boxValueField); + } + + internal void EmitStoreBox() { + Compiler.IL.Emit(OpCodes.Stloc, _boxLocal); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/CompilerScope.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/CompilerScope.cs new file mode 100644 index 00000000000..c0faaa933b7 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/CompilerScope.cs @@ -0,0 +1,468 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +#if CODEPLEX_40 +using System.Dynamic; +using System.Dynamic.Utils; +#else +using Microsoft.Scripting; +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + internal enum VariableStorageKind { + Local, + Hoisted + } + + /// + /// CompilerScope is the data structure which the Compiler keeps information + /// related to compiling scopes. It stores the following information: + /// 1. Parent relationship (for resolving variables) + /// 2. Information about hoisted variables + /// 3. Information for resolving closures + /// + /// Instances are produced by VariableBinder, which does a tree walk + /// looking for scope nodes: LambdaExpression and BlockExpression. + /// + internal sealed partial class CompilerScope { + /// + /// parent scope, if any + /// + private CompilerScope _parent; + + /// + /// The expression node for this scope + /// Can be LambdaExpression, BlockExpression, or CatchBlock + /// + internal readonly object Node; + + /// + /// True if this node corresponds to an IL method. + /// Can only be true if the Node is a LambdaExpression. + /// But inlined lambdas will have it set to false. + /// + internal readonly bool IsMethod; + + /// + /// Does this scope (or any inner scope) close over variables from any + /// parent scope? + /// Populated by VariableBinder + /// + internal bool NeedsClosure; + + /// + /// Variables defined in this scope, and whether they're hoisted or not + /// Populated by VariableBinder + /// + internal readonly Dictionary Definitions = new Dictionary(); + + /// + /// Each variable referenced within this scope, and how often it was referenced + /// Populated by VariableBinder + /// + internal Dictionary ReferenceCount; + + /// + /// Scopes whose variables were merged into this one + /// + /// Created lazily as we create hundreds of compiler scopes w/o merging scopes when compiling rules. + /// + internal Set MergedScopes; + + /// + /// The scope's hoisted locals, if any. + /// Provides storage for variables that are referenced from nested lambdas + /// + private HoistedLocals _hoistedLocals; + + /// + /// The closed over hoisted locals + /// + private HoistedLocals _closureHoistedLocals; + + /// + /// Mutable dictionary that maps non-hoisted variables to either local + /// slots or argument slots + /// + private readonly Dictionary _locals = new Dictionary(); + + internal CompilerScope(object node, bool isMethod) { + Node = node; + IsMethod = isMethod; + var variables = GetVariables(node); + + Definitions = new Dictionary(variables.Count); + foreach (var v in variables) { + Definitions.Add(v, VariableStorageKind.Local); + } + } + + /// + /// This scope's hoisted locals, or the closed over locals, if any + /// Equivalent to: _hoistedLocals ?? _closureHoistedLocals + /// + internal HoistedLocals NearestHoistedLocals { + get { return _hoistedLocals ?? _closureHoistedLocals; } + } + + /// + /// Called when entering a lambda/block. Performs all variable allocation + /// needed, including creating hoisted locals and IL locals for accessing + /// parent locals + /// + internal CompilerScope Enter(LambdaCompiler lc, CompilerScope parent) { + SetParent(lc, parent); + + AllocateLocals(lc); + + if (IsMethod && _closureHoistedLocals != null) { + EmitClosureAccess(lc, _closureHoistedLocals); + } + + EmitNewHoistedLocals(lc); + + if (IsMethod) { + EmitCachedVariables(); + } + + return this; + } + + /// + /// Frees unnamed locals, clears state associated with this compiler + /// + internal CompilerScope Exit() { + // free scope's variables + if (!IsMethod) { + foreach (Storage storage in _locals.Values) { + storage.FreeLocal(); + } + } + + // Clear state that is associated with this parent + // (because the scope can be reused in another context) + CompilerScope parent = _parent; + _parent = null; + _hoistedLocals = null; + _closureHoistedLocals = null; + _locals.Clear(); + + return parent; + } + + #region LocalScopeExpression support + + internal void EmitVariableAccess(LambdaCompiler lc, ReadOnlyCollection vars) { + if (NearestHoistedLocals != null) { + // Find what array each variable is on & its index + var indexes = new List(vars.Count); + + foreach (var variable in vars) { + // For each variable, find what array it's defined on + ulong parents = 0; + HoistedLocals locals = NearestHoistedLocals; + while (!locals.Indexes.ContainsKey(variable)) { + parents++; + locals = locals.Parent; + Debug.Assert(locals != null); + } + + // combine the number of parents we walked, with the + // real index of variable to get the index to emit. + ulong index = (parents << 32) | (uint)locals.Indexes[variable]; + + indexes.Add((long)index); + } + + if (indexes.Count > 0) { + EmitGet(NearestHoistedLocals.SelfVariable); + lc.EmitConstantArray(indexes.ToArray()); + lc.IL.Emit(OpCodes.Call, typeof(RuntimeOps).GetMethod("CreateRuntimeVariables", new[] { typeof(object[]), typeof(long[]) })); + return; + } + } + + // No visible variables + lc.IL.Emit(OpCodes.Call, typeof(RuntimeOps).GetMethod("CreateRuntimeVariables", Type.EmptyTypes)); + return; + } + + #endregion + + #region Variable access + + /// + /// Adds a new virtual variable corresponding to an IL local + /// + internal void AddLocal(LambdaCompiler gen, ParameterExpression variable) { + _locals.Add(variable, new LocalStorage(gen, variable)); + } + + internal void EmitGet(ParameterExpression variable) { + ResolveVariable(variable).EmitLoad(); + } + + internal void EmitSet(ParameterExpression variable) { + ResolveVariable(variable).EmitStore(); + } + + internal void EmitAddressOf(ParameterExpression variable) { + ResolveVariable(variable).EmitAddress(); + } + + private Storage ResolveVariable(ParameterExpression variable) { + return ResolveVariable(variable, NearestHoistedLocals); + } + + /// + /// Resolve a local variable in this scope or a closed over scope + /// Throws if the variable is defined + /// + private Storage ResolveVariable(ParameterExpression variable, HoistedLocals hoistedLocals) { + // Search IL locals and arguments, but only in this lambda + for (CompilerScope s = this; s != null; s = s._parent) { + Storage storage; + if (s._locals.TryGetValue(variable, out storage)) { + return storage; + } + + // if this is a lambda, we're done + if (s.IsMethod) { + break; + } + } + + // search hoisted locals + for (HoistedLocals h = hoistedLocals; h != null; h = h.Parent) { + int index; + if (h.Indexes.TryGetValue(variable, out index)) { + return new ElementBoxStorage( + ResolveVariable(h.SelfVariable, hoistedLocals), + index, + variable + ); + } + } + + // + // If this is an unbound variable in the lambda, the error will be + // thrown from VariableBinder. So an error here is generally caused + // by an internal error, e.g. a scope was created but it bypassed + // VariableBinder. + // + throw Error.UndefinedVariable(variable.Name, variable.Type, CurrentLambdaName); + } + + #endregion + + private void SetParent(LambdaCompiler lc, CompilerScope parent) { + Debug.Assert(_parent == null && parent != this); + _parent = parent; + + if (NeedsClosure && _parent != null) { + _closureHoistedLocals = _parent.NearestHoistedLocals; + } + + var hoistedVars = GetVariables().Where(p => Definitions[p] == VariableStorageKind.Hoisted).ToReadOnly(); + + if (hoistedVars.Count > 0) { + _hoistedLocals = new HoistedLocals(_closureHoistedLocals, hoistedVars); + AddLocal(lc, _hoistedLocals.SelfVariable); + } + } + + // Emits creation of the hoisted local storage + private void EmitNewHoistedLocals(LambdaCompiler lc) { + if (_hoistedLocals == null) { + return; + } + + // create the array + lc.IL.EmitInt(_hoistedLocals.Variables.Count); + lc.IL.Emit(OpCodes.Newarr, typeof(object)); + + // initialize all elements + int i = 0; + foreach (ParameterExpression v in _hoistedLocals.Variables) { + // array[i] = new StrongBox(...); + lc.IL.Emit(OpCodes.Dup); + lc.IL.EmitInt(i++); + Type boxType = typeof(StrongBox<>).MakeGenericType(v.Type); + + if (IsMethod && lc.Parameters.Contains(v)) { + // array[i] = new StrongBox(argument); + int index = lc.Parameters.IndexOf(v); + lc.EmitLambdaArgument(index); + lc.IL.Emit(OpCodes.Newobj, boxType.GetConstructor(new Type[] { v.Type })); + } else if (v == _hoistedLocals.ParentVariable) { + // array[i] = new StrongBox(closure.Locals); + ResolveVariable(v, _closureHoistedLocals).EmitLoad(); + lc.IL.Emit(OpCodes.Newobj, boxType.GetConstructor(new Type[] { v.Type })); + } else { + // array[i] = new StrongBox(); + lc.IL.Emit(OpCodes.Newobj, boxType.GetConstructor(Type.EmptyTypes)); + } + // if we want to cache this into a local, do it now + if (ShouldCache(v)) { + lc.IL.Emit(OpCodes.Dup); + CacheBoxToLocal(lc, v); + } + lc.IL.Emit(OpCodes.Stelem_Ref); + } + + // store it + EmitSet(_hoistedLocals.SelfVariable); + } + + // If hoisted variables are referenced "enough", we cache the + // StrongBox in an IL local, which saves an array index and a cast + // when we go to look it up later + private void EmitCachedVariables() { + if (ReferenceCount == null) { + return; + } + + foreach (var refCount in ReferenceCount) { + if (ShouldCache(refCount.Key, refCount.Value)) { + var storage = ResolveVariable(refCount.Key) as ElementBoxStorage; + if (storage != null) { + storage.EmitLoadBox(); + CacheBoxToLocal(storage.Compiler, refCount.Key); + } + } + } + } + + private bool ShouldCache(ParameterExpression v, int refCount) { + // This caching is too aggressive in the face of conditionals and + // switch. Also, it is too conservative for variables used inside + // of loops. + return refCount > 2 && !_locals.ContainsKey(v); + } + + private bool ShouldCache(ParameterExpression v) { + if (ReferenceCount == null) { + return false; + } + + int refCount; + return ReferenceCount.TryGetValue(v, out refCount) && ShouldCache(v, refCount); + } + + private void CacheBoxToLocal(LambdaCompiler lc, ParameterExpression v) { + Debug.Assert(ShouldCache(v) && !_locals.ContainsKey(v)); + var local = new LocalBoxStorage(lc, v); + local.EmitStoreBox(); + _locals.Add(v, local); + } + + // Creates IL locals for accessing closures + private void EmitClosureAccess(LambdaCompiler lc, HoistedLocals locals) { + if (locals == null) { + return; + } + + EmitClosureToVariable(lc, locals); + + while ((locals = locals.Parent) != null) { + var v = locals.SelfVariable; + var local = new LocalStorage(lc, v); + local.EmitStore(ResolveVariable(v)); + _locals.Add(v, local); + } + } + + private void EmitClosureToVariable(LambdaCompiler lc, HoistedLocals locals) { + lc.EmitClosureArgument(); + lc.IL.Emit(OpCodes.Ldfld, typeof(Closure).GetField("Locals")); + AddLocal(lc, locals.SelfVariable); + EmitSet(locals.SelfVariable); + } + + // Allocates slots for IL locals or IL arguments + private void AllocateLocals(LambdaCompiler lc) { + foreach (ParameterExpression v in GetVariables()) { + if (Definitions[v] == VariableStorageKind.Local) { + // + // If v is in lc.Parameters, it is a parameter. + // Otherwise, it is a local variable. + // + // Also, for inlined lambdas we'll create a local, which + // is possibly a byref local if the parameter is byref. + // + Storage s; + if (IsMethod && lc.Parameters.Contains(v)) { + s = new ArgumentStorage(lc, v); + } else { + s = new LocalStorage(lc, v); + } + _locals.Add(v, s); + } + } + } + + private IList GetVariables() { + var vars = GetVariables(Node); + if (MergedScopes == null) { + return vars; + } + var list = new List(vars); + foreach (var scope in MergedScopes) { + list.AddRange(GetVariables(scope)); + } + return list; + } + + private static IList GetVariables(object scope) { + var lambda = scope as LambdaExpression; + if (lambda != null) { + return lambda.Parameters; + } + var block = scope as BlockExpression; + if (block != null) { + return block.Variables; + } + return new[] { ((CatchBlock)scope).Variable }; + } + + private string CurrentLambdaName { + get { + CompilerScope s = this; + while (true) { + var lambda = s.Node as LambdaExpression; + if (lambda != null) { + return lambda.Name; + } + } + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/ConstantCheck.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/ConstantCheck.cs new file mode 100644 index 00000000000..33ae973fb9a --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/ConstantCheck.cs @@ -0,0 +1,133 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + internal enum AnalyzeTypeIsResult { + KnownFalse, + KnownTrue, + KnownAssignable, // need null check only + Unknown, // need full runtime check + } + + internal static class ConstantCheck { + + internal static bool IsNull(Expression e) { + switch (e.NodeType) { + case ExpressionType.Constant: + return ((ConstantExpression)e).Value == null; + + case ExpressionType.TypeAs: + var typeAs = (UnaryExpression)e; + // if the TypeAs check is guarenteed to fail, then its result will be null + return AnalyzeTypeIs(typeAs) == AnalyzeTypeIsResult.KnownFalse; + } + return false; + } + + + /// + /// If the result of a TypeBinaryExpression is known statically, this + /// returns the result, otherwise it returns null, meaning we'll need + /// to perform the IsInst instruction at runtime. + /// + /// The result of this function must be equivalent to IsInst, or + /// null. + /// + internal static AnalyzeTypeIsResult AnalyzeTypeIs(TypeBinaryExpression typeIs) { + return AnalyzeTypeIs(typeIs.Expression, typeIs.TypeOperand); + } + + /// + /// If the result of a unary TypeAs expression is known statically, this + /// returns the result, otherwise it returns null, meaning we'll need + /// to perform the IsInst instruction at runtime. + /// + /// The result of this function must be equivalent to IsInst, or + /// null. + /// + internal static AnalyzeTypeIsResult AnalyzeTypeIs(UnaryExpression typeAs) { + Debug.Assert(typeAs.NodeType == ExpressionType.TypeAs); + return AnalyzeTypeIs(typeAs.Operand, typeAs.Type); + } + + /// + /// If the result of an isinst opcode is known statically, this + /// returns the result, otherwise it returns null, meaning we'll need + /// to perform the IsInst instruction at runtime. + /// + /// The result of this function must be equivalent to IsInst, or + /// null. + /// + private static AnalyzeTypeIsResult AnalyzeTypeIs(Expression operand, Type testType) { + Type operandType = operand.Type; + + // Oddly, we allow void operands + // This is LinqV1 behavior of TypeIs + if (operandType == typeof(void)) { + return AnalyzeTypeIsResult.KnownFalse; + } + + // + // Type comparisons treat nullable types as if they were the + // underlying type. The reason is when you box a nullable it + // becomes a boxed value of the underlying type, or null. + // + Type nnOperandType = operandType.GetNonNullableType(); + Type nnTestType = testType.GetNonNullableType(); + + // + // See if we can determine the answer based on the static types + // + // Extensive testing showed that Type.IsAssignableFrom, + // Type.IsInstanceOfType, and the isinst instruction were all + // equivalent when used against a live object + // + if (nnTestType.IsAssignableFrom(nnOperandType)) { + // If the operand is a value type (other than nullable), we + // know the result is always true. + if (operandType.IsValueType && !operandType.IsNullableType()) { + return AnalyzeTypeIsResult.KnownTrue; + } + + // For reference/nullable types, we need to compare to null at runtime + return AnalyzeTypeIsResult.KnownAssignable; + } + + // + // If we couldn't statically assign and the type is sealed, no + // value at runtime can make isinst succeed + // + if (nnOperandType.IsSealed) { + return AnalyzeTypeIsResult.KnownFalse; + } + + // Otherwise we need a full runtime check + return AnalyzeTypeIsResult.Unknown; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/DebugInfoGenerator.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/DebugInfoGenerator.cs new file mode 100644 index 00000000000..843b30bd1fe --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/DebugInfoGenerator.cs @@ -0,0 +1,72 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ + +#if CODEPLEX_40 +using ILGenerator = System.Linq.Expressions.Compiler.OffsetTrackingILGenerator; +#else +using ILGenerator = Microsoft.Linq.Expressions.Compiler.OffsetTrackingILGenerator; +#endif + +#if CODEPLEX_40 +using System; +#else +using System; using Microsoft; +#endif +using System.Collections.Generic; +using System.Text; +using System.Reflection.Emit; +using System.Diagnostics; +using System.Diagnostics.SymbolStore; +using System.Reflection; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + /// + /// Generates debug information for lambdas in an expression tree. + /// + public abstract class DebugInfoGenerator { + /// + /// Creates PDB symbol generator. + /// + /// PDB symbol generator. + public static DebugInfoGenerator CreatePdbGenerator() { + return new SymbolDocumentGenerator(); + } + + /// + /// Marks a sequence point. + /// + /// The lambda being generated. + /// IL offset where to mark the sequence point. + /// Debug informaton corresponding to the sequence point. + public abstract void MarkSequencePoint(LambdaExpression method, int ilOffset, DebugInfoExpression sequencePoint); + + internal virtual void MarkSequencePoint(LambdaExpression method, MethodBase methodBase, ILGenerator ilg, DebugInfoExpression sequencePoint) { + MarkSequencePoint(method, ilg.CurrentOffset, sequencePoint); + } + + internal virtual void SetLocalName(LocalBuilder localBuilder, string name) { + // nop + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/DelegateHelpers.Generated.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/DelegateHelpers.Generated.cs new file mode 100644 index 00000000000..7d5528fa924 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/DelegateHelpers.Generated.cs @@ -0,0 +1,299 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic; +using System.Dynamic.Utils; +#else +using Microsoft.Scripting; +using Microsoft.Scripting.Utils; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + internal static partial class DelegateHelpers { + private static TypeInfo _DelegateCache = new TypeInfo(); + + #region Generated Maximum Delegate Arity + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_max_delegate_arity from: generate_dynsites.py + + private const int MaximumArity = 17; + + // *** END GENERATED CODE *** + + #endregion + + internal class TypeInfo { + public Type DelegateType; + public Dictionary TypeChain; + + public Type MakeDelegateType(Type retType, params Expression[] args) { + return MakeDelegateType(retType, (IList)args); + } + + public Type MakeDelegateType(Type retType, IList args) { + // nope, go ahead and create it and spend the + // cost of creating the array. + Type[] paramTypes = new Type[args.Count + 2]; + paramTypes[0] = typeof(CallSite); + paramTypes[paramTypes.Length - 1] = retType; + for (int i = 0; i < args.Count; i++) { + paramTypes[i + 1] = args[i].Type; + } + + return DelegateType = MakeNewDelegate(paramTypes); + } + } + + + /// + /// Finds a delegate type using the types in the array. + /// We use the cache to avoid copying the array, and to cache the + /// created delegate type + /// + internal static Type MakeDelegateType(Type[] types) { + lock (_DelegateCache) { + TypeInfo curTypeInfo = _DelegateCache; + + // arguments & return type + for (int i = 0; i < types.Length; i++) { + curTypeInfo = NextTypeInfo(types[i], curTypeInfo); + } + + // see if we have the delegate already + if (curTypeInfo.DelegateType == null) { + // clone because MakeCustomDelegate can hold onto the array. + curTypeInfo.DelegateType = MakeNewDelegate((Type[])types.Clone()); + } + + return curTypeInfo.DelegateType; + } + } + + /// + /// Finds a delegate type for a CallSite using the types in the ReadOnlyCollection of Expression. + /// + /// We take the readonly collection of Expression explicitly to avoid allocating memory (an array + /// of types) on lookup of delegate types. + /// + internal static Type MakeCallSiteDelegate(ReadOnlyCollection types, Type returnType) { + lock (_DelegateCache) { + TypeInfo curTypeInfo = _DelegateCache; + + // CallSite + curTypeInfo = NextTypeInfo(typeof(CallSite), curTypeInfo); + + // arguments + for (int i = 0; i < types.Count; i++) { + curTypeInfo = NextTypeInfo(types[i].Type, curTypeInfo); + } + + // return type + curTypeInfo = NextTypeInfo(returnType, curTypeInfo); + + // see if we have the delegate already + if (curTypeInfo.DelegateType == null) { + curTypeInfo.MakeDelegateType(returnType, types); + } + + return curTypeInfo.DelegateType; + } + } + + /// + /// Finds a delegate type for a CallSite using the MetaObject array. + /// + /// We take the array of MetaObject explicitly to avoid allocating memory (an array of types) on + /// lookup of delegate types. + /// + internal static Type MakeDeferredSiteDelegate(DynamicMetaObject[] args, Type returnType) { + lock (_DelegateCache) { + TypeInfo curTypeInfo = _DelegateCache; + + // CallSite + curTypeInfo = NextTypeInfo(typeof(CallSite), curTypeInfo); + + // arguments + for (int i = 0; i < args.Length; i++) { + DynamicMetaObject mo = args[i]; + Type paramType = mo.Expression.Type; + if (IsByRef(mo)) { + paramType = paramType.MakeByRefType(); + } + curTypeInfo = NextTypeInfo(paramType, curTypeInfo); + } + + // return type + curTypeInfo = NextTypeInfo(returnType, curTypeInfo); + + // see if we have the delegate already + if (curTypeInfo.DelegateType == null) { + // nope, go ahead and create it and spend the + // cost of creating the array. + Type[] paramTypes = new Type[args.Length + 2]; + paramTypes[0] = typeof(CallSite); + paramTypes[paramTypes.Length - 1] = returnType; + for (int i = 0; i < args.Length; i++) { + DynamicMetaObject mo = args[i]; + Type paramType = mo.Expression.Type; + if (IsByRef(mo)) { + paramType = paramType.MakeByRefType(); + } + paramTypes[i + 1] = paramType; + } + + curTypeInfo.DelegateType = MakeNewDelegate(paramTypes); + } + + return curTypeInfo.DelegateType; + } + } + + private static bool IsByRef(DynamicMetaObject mo) { + ParameterExpression pe = mo.Expression as ParameterExpression; + return pe != null && pe.IsByRef; + } + + internal static TypeInfo NextTypeInfo(Type initialArg) { + lock (_DelegateCache) { + return NextTypeInfo(initialArg, _DelegateCache); + } + } + + internal static TypeInfo GetNextTypeInfo(Type initialArg, TypeInfo curTypeInfo) { + lock (_DelegateCache) { + return NextTypeInfo(initialArg, curTypeInfo); + } + } + + private static TypeInfo NextTypeInfo(Type initialArg, TypeInfo curTypeInfo) { + Type lookingUp = initialArg; + TypeInfo nextTypeInfo; + if (curTypeInfo.TypeChain == null) { + curTypeInfo.TypeChain = new Dictionary(); + } + + if (!curTypeInfo.TypeChain.TryGetValue(lookingUp, out nextTypeInfo)) { + curTypeInfo.TypeChain[lookingUp] = nextTypeInfo = new TypeInfo(); + } + return nextTypeInfo; + } + + /// + /// Creates a new delegate, or uses a func/action + /// Note: this method does not cache + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private static Type MakeNewDelegate(Type[] types) { + Debug.Assert(types != null && types.Length > 0); + + // Can only used predefined delegates if we have no byref types and + // the arity is small enough to fit in Func<...> or Action<...> + if (types.Length > MaximumArity || types.Any(t => t.IsByRef)) { + return MakeNewCustomDelegate(types); + } + + Type result; + if (types[types.Length - 1] == typeof(void)) { + result = GetActionType(types.RemoveLast()); + } else { + result = GetFuncType(types); + } + Debug.Assert(result != null); + return result; + } + + internal static Type GetFuncType(Type[] types) { + switch (types.Length) { + #region Generated Delegate Func Types + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_delegate_func from: generate_dynsites.py + + case 1: return typeof(Func<>).MakeGenericType(types); + case 2: return typeof(Func<,>).MakeGenericType(types); + case 3: return typeof(Func<,,>).MakeGenericType(types); + case 4: return typeof(Func<,,,>).MakeGenericType(types); + case 5: return typeof(Func<,,,,>).MakeGenericType(types); + case 6: return typeof(Func<,,,,,>).MakeGenericType(types); + case 7: return typeof(Func<,,,,,,>).MakeGenericType(types); + case 8: return typeof(Func<,,,,,,,>).MakeGenericType(types); + case 9: return typeof(Func<,,,,,,,,>).MakeGenericType(types); + case 10: return typeof(Func<,,,,,,,,,>).MakeGenericType(types); + case 11: return typeof(Func<,,,,,,,,,,>).MakeGenericType(types); + case 12: return typeof(Func<,,,,,,,,,,,>).MakeGenericType(types); + case 13: return typeof(Func<,,,,,,,,,,,,>).MakeGenericType(types); + case 14: return typeof(Func<,,,,,,,,,,,,,>).MakeGenericType(types); + case 15: return typeof(Func<,,,,,,,,,,,,,,>).MakeGenericType(types); + case 16: return typeof(Func<,,,,,,,,,,,,,,,>).MakeGenericType(types); + case 17: return typeof(Func<,,,,,,,,,,,,,,,,>).MakeGenericType(types); + + // *** END GENERATED CODE *** + + #endregion + + default: return null; + } + } + + internal static Type GetActionType(Type[] types) { + switch (types.Length) { + case 0: return typeof(Action); + #region Generated Delegate Action Types + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_delegate_action from: generate_dynsites.py + + case 1: return typeof(Action<>).MakeGenericType(types); + case 2: return typeof(Action<,>).MakeGenericType(types); + case 3: return typeof(Action<,,>).MakeGenericType(types); + case 4: return typeof(Action<,,,>).MakeGenericType(types); + case 5: return typeof(Action<,,,,>).MakeGenericType(types); + case 6: return typeof(Action<,,,,,>).MakeGenericType(types); + case 7: return typeof(Action<,,,,,,>).MakeGenericType(types); + case 8: return typeof(Action<,,,,,,,>).MakeGenericType(types); + case 9: return typeof(Action<,,,,,,,,>).MakeGenericType(types); + case 10: return typeof(Action<,,,,,,,,,>).MakeGenericType(types); + case 11: return typeof(Action<,,,,,,,,,,>).MakeGenericType(types); + case 12: return typeof(Action<,,,,,,,,,,,>).MakeGenericType(types); + case 13: return typeof(Action<,,,,,,,,,,,,>).MakeGenericType(types); + case 14: return typeof(Action<,,,,,,,,,,,,,>).MakeGenericType(types); + case 15: return typeof(Action<,,,,,,,,,,,,,,>).MakeGenericType(types); + case 16: return typeof(Action<,,,,,,,,,,,,,,,>).MakeGenericType(types); + + // *** END GENERATED CODE *** + + #endregion + + default: return null; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/DelegateHelpers.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/DelegateHelpers.cs new file mode 100644 index 00000000000..ac8b05bec6e --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/DelegateHelpers.cs @@ -0,0 +1,47 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Reflection.Emit; + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + internal static partial class DelegateHelpers { + private const MethodAttributes CtorAttributes = MethodAttributes.RTSpecialName | MethodAttributes.HideBySig | MethodAttributes.Public; + private const MethodImplAttributes ImplAttributes = MethodImplAttributes.Runtime | MethodImplAttributes.Managed; + private const MethodAttributes InvokeAttributes = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual; + private static readonly Type[] _DelegateCtorSignature = new Type[] { typeof(object), typeof(IntPtr) }; + + private static Type MakeNewCustomDelegate(Type[] types) { + Type returnType = types[types.Length - 1]; + Type[] parameters = types.RemoveLast(); + + TypeBuilder builder = AssemblyGen.DefineDelegateType("Delegate" + types.Length); + builder.DefineConstructor(CtorAttributes, CallingConventions.Standard, _DelegateCtorSignature).SetImplementationFlags(ImplAttributes); + builder.DefineMethod("Invoke", InvokeAttributes, returnType, parameters).SetImplementationFlags(ImplAttributes); + return builder.CreateType(); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/ExpressionQuoter.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/ExpressionQuoter.cs new file mode 100644 index 00000000000..5313bda264f --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/ExpressionQuoter.cs @@ -0,0 +1,253 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +using System.Linq.Expressions; +using System.Linq.Expressions.Compiler; +#else +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +using Microsoft.Linq.Expressions.Compiler; +#endif + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + public partial class RuntimeOps { + /// + /// Quotes the provided expression tree. + /// + /// The expression to quote. + /// The hoisted local state provided by the compiler. + /// The actual hoisted local values. + /// The quoted expression. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static Expression Quote(Expression expression, object hoistedLocals, object[] locals) { + Debug.Assert(hoistedLocals != null && locals != null); + var quoter = new ExpressionQuoter((HoistedLocals)hoistedLocals, locals); + return quoter.Visit(expression); + } + + /// + /// Combines two runtime variable lists and returns a new list. + /// + /// The first list. + /// The second list. + /// The index array indicating which list to get variables from. + /// The merged runtime variables. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static IRuntimeVariables MergeRuntimeVariables(IRuntimeVariables first, IRuntimeVariables second, int[] indexes) { + return new MergedRuntimeVariables(first, second, indexes); + } + + // Modifies a quoted Expression instance by changing hoisted variables and + // parameters into hoisted local references. The variable's StrongBox is + // burned as a constant, and all hoisted variables/parameters are rewritten + // as indexing expressions. + // + // The behavior of Quote is indended to be like C# and VB expression quoting + private sealed class ExpressionQuoter : ExpressionVisitor { + private readonly HoistedLocals _scope; + private readonly object[] _locals; + + // A stack of variables that are defined in nested scopes. We search + // this first when resolving a variable in case a nested scope shadows + // one of our variable instances. + private readonly Stack> _shadowedVars = new Stack>(); + + internal ExpressionQuoter(HoistedLocals scope, object[] locals) { + _scope = scope; + _locals = locals; + } + + protected internal override Expression VisitLambda(Expression node) { + _shadowedVars.Push(new Set(node.Parameters)); + Expression b = Visit(node.Body); + _shadowedVars.Pop(); + if (b == node.Body) { + return node; + } + return Expression.Lambda(b, node.Name, node.TailCall, node.Parameters); + } + + protected internal override Expression VisitBlock(BlockExpression node) { + if (node.Variables.Count > 0) { + _shadowedVars.Push(new Set(node.Variables)); + } + var b = Visit(node.Expressions); + if (node.Variables.Count > 0) { + _shadowedVars.Pop(); + } + if (b == node.Expressions) { + return node; + } + return Expression.Block(node.Variables, b); + } + + protected override CatchBlock VisitCatchBlock(CatchBlock node) { + if (node.Variable != null) { + _shadowedVars.Push(new Set(new[] { node.Variable })); + } + Expression b = Visit(node.Body); + Expression f = Visit(node.Filter); + if (node.Variable != null) { + _shadowedVars.Pop(); + } + if (b == node.Body && f == node.Filter) { + return node; + } + return Expression.MakeCatchBlock(node.Test, node.Variable, b, f); + } + + protected internal override Expression VisitRuntimeVariables(RuntimeVariablesExpression node) { + int count = node.Variables.Count; + var boxes = new List(); + var vars = new List(); + var indexes = new int[count]; + for (int i = 0; i < count; i++) { + IStrongBox box = GetBox(node.Variables[i]); + if (box == null) { + indexes[i] = vars.Count; + vars.Add(node.Variables[i]); + } else { + indexes[i] = -1 - boxes.Count; + boxes.Add(box); + } + } + + // No variables were rewritten. Just return the original node + if (boxes.Count == 0) { + return node; + } + + var boxesConst = Expression.Constant(new RuntimeVariables(boxes.ToArray()), typeof(IRuntimeVariables)); + // All of them were rewritten. Just return the array as a constant + if (vars.Count == 0) { + return boxesConst; + } + + // Otherwise, we need to return an object that merges them + return Expression.Call( + typeof(RuntimeOps).GetMethod("MergeRuntimeVariables"), + Expression.RuntimeVariables(new TrueReadOnlyCollection(vars.ToArray())), + boxesConst, + Expression.Constant(indexes) + ); + } + + protected internal override Expression VisitParameter(ParameterExpression node) { + IStrongBox box = GetBox(node); + if (box == null) { + return node; + } + return Expression.Field(Expression.Constant(box), "Value"); + } + + private IStrongBox GetBox(ParameterExpression variable) { + // Skip variables that are shadowed by a nested scope/lambda + foreach (Set hidden in _shadowedVars) { + if (hidden.Contains(variable)) { + return null; + } + } + + HoistedLocals scope = _scope; + object[] locals = _locals; + while (true) { + int hoistIndex; + if (scope.Indexes.TryGetValue(variable, out hoistIndex)) { + return (IStrongBox)locals[hoistIndex]; + } + scope = scope.Parent; + if (scope == null) { + break; + } + locals = HoistedLocals.GetParent(locals); + } + + // Unbound variable: an error should've been thrown already + // from VariableBinder + throw ContractUtils.Unreachable; + } + } + + private sealed class RuntimeVariables : IRuntimeVariables { + private readonly IStrongBox[] _boxes; + + internal RuntimeVariables(IStrongBox[] boxes) { + _boxes = boxes; + } + + int IRuntimeVariables.Count { + get { return _boxes.Length; } + } + + object IRuntimeVariables.this[int index] { + get { + return _boxes[index].Value; + } + set { + _boxes[index].Value = value; + } + } + } + + /// + /// Provides a list of variables, supporing read/write of the values + /// Exposed via RuntimeVariablesExpression + /// + private sealed class MergedRuntimeVariables : IRuntimeVariables { + private readonly IRuntimeVariables _first; + private readonly IRuntimeVariables _second; + + // For reach item, the index into the first or second list + // Positive values mean the first array, negative means the second + private readonly int[] _indexes; + + internal MergedRuntimeVariables(IRuntimeVariables first, IRuntimeVariables second, int[] indexes) { + _first = first; + _second = second; + _indexes = indexes; + } + + public int Count { + get { return _indexes.Length; } + } + + public object this[int index] { + get { + index = _indexes[index]; + return (index >= 0) ? _first[index] : _second[-1 - index]; + } + set { + index = _indexes[index]; + if (index >= 0) { + _first[index] = value; + } else { + _second[-1 - index] = value; + } + } + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/HoistedLocals.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/HoistedLocals.cs new file mode 100644 index 00000000000..3179709362a --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/HoistedLocals.cs @@ -0,0 +1,111 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + // Suppose we have something like: + // + // (string s)=>()=>s. + // + // We wish to generate the outer as: + // + // Func OuterMethod(Closure closure, string s) + // { + // object[] locals = new object[1]; + // locals[0] = new StrongBox(); + // ((StrongBox)locals[0]).Value = s; + // return ((DynamicMethod)closure.Constants[0]).CreateDelegate(typeof(Func), new Closure(null, locals)); + // } + // + // ... and the inner as: + // + // string InnerMethod(Closure closure) + // { + // object[] locals = closure.Locals; + // return ((StrongBox)locals[0]).Value; + // } + // + // This class tracks that "s" was hoisted into a closure, as the 0th + // element in the array + // + /// + /// Stores information about locals and arguments that are hoisted into + /// the closure array because they're referenced in an inner lambda. + /// + /// This class is sometimes emitted as a runtime constant for internal + /// use to hoist variables/parameters in quoted expressions + /// + /// Invariant: this class stores no mutable state + /// + internal sealed class HoistedLocals { + + // The parent locals, if any + internal readonly HoistedLocals Parent; + + // A mapping of hoisted variables to their indexes in the array + internal readonly ReadOnlyDictionary Indexes; + + // The variables, in the order they appear in the array + internal readonly ReadOnlyCollection Variables; + + // A virtual variable for accessing this locals array + internal readonly ParameterExpression SelfVariable; + + internal HoistedLocals(HoistedLocals parent, ReadOnlyCollection vars) { + + if (parent != null) { + // Add the parent locals array as the 0th element in the array + vars = new TrueReadOnlyCollection(vars.AddFirst(parent.SelfVariable)); + } + + Dictionary indexes = new Dictionary(vars.Count); + for (int i = 0; i < vars.Count; i++) { + indexes.Add(vars[i], i); + } + + SelfVariable = Expression.Variable(typeof(object[]), null); + Parent = parent; + Variables = vars; + Indexes = new ReadOnlyDictionary(indexes); + } + + internal ParameterExpression ParentVariable { + get { return Parent != null ? Parent.SelfVariable : null; } + } + + internal static object[] GetParent(object[] locals) { + return ((StrongBox)locals[0]).Value; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/ILGen.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/ILGen.cs new file mode 100644 index 00000000000..f4521c2f0dd --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/ILGen.cs @@ -0,0 +1,1061 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using ILGenerator = System.Linq.Expressions.Compiler.OffsetTrackingILGenerator; +#else +using ILGenerator = Microsoft.Linq.Expressions.Compiler.OffsetTrackingILGenerator; +#endif + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + internal static class ILGen { + + internal static void Emit(this ILGenerator il, OpCode opcode, MethodBase methodBase) { + Debug.Assert(methodBase is MethodInfo || methodBase is ConstructorInfo); + + if (methodBase.MemberType == MemberTypes.Constructor) { + il.Emit(opcode, (ConstructorInfo)methodBase); + } else { + il.Emit(opcode, (MethodInfo)methodBase); + } + } + + #region Instruction helpers + + internal static void EmitLoadArg(this ILGenerator il, int index) { + Debug.Assert(index >= 0); + + switch (index) { + case 0: + il.Emit(OpCodes.Ldarg_0); + break; + case 1: + il.Emit(OpCodes.Ldarg_1); + break; + case 2: + il.Emit(OpCodes.Ldarg_2); + break; + case 3: + il.Emit(OpCodes.Ldarg_3); + break; + default: + if (index <= Byte.MaxValue) { + il.Emit(OpCodes.Ldarg_S, (byte)index); + } else { + il.Emit(OpCodes.Ldarg, index); + } + break; + } + } + + internal static void EmitLoadArgAddress(this ILGenerator il, int index) { + Debug.Assert(index >= 0); + + if (index <= Byte.MaxValue) { + il.Emit(OpCodes.Ldarga_S, (byte)index); + } else { + il.Emit(OpCodes.Ldarga, index); + } + } + + internal static void EmitStoreArg(this ILGenerator il, int index) { + Debug.Assert(index >= 0); + + if (index <= Byte.MaxValue) { + il.Emit(OpCodes.Starg_S, (byte)index); + } else { + il.Emit(OpCodes.Starg, index); + } + } + + /// + /// Emits a Ldind* instruction for the appropriate type + /// + internal static void EmitLoadValueIndirect(this ILGenerator il, Type type) { + ContractUtils.RequiresNotNull(type, "type"); + + if (type.IsValueType) { + if (type == typeof(int)) { + il.Emit(OpCodes.Ldind_I4); + } else if (type == typeof(uint)) { + il.Emit(OpCodes.Ldind_U4); + } else if (type == typeof(short)) { + il.Emit(OpCodes.Ldind_I2); + } else if (type == typeof(ushort)) { + il.Emit(OpCodes.Ldind_U2); + } else if (type == typeof(long) || type == typeof(ulong)) { + il.Emit(OpCodes.Ldind_I8); + } else if (type == typeof(char)) { + il.Emit(OpCodes.Ldind_I2); + } else if (type == typeof(bool)) { + il.Emit(OpCodes.Ldind_I1); + } else if (type == typeof(float)) { + il.Emit(OpCodes.Ldind_R4); + } else if (type == typeof(double)) { + il.Emit(OpCodes.Ldind_R8); + } else { + il.Emit(OpCodes.Ldobj, type); + } + } else { + il.Emit(OpCodes.Ldind_Ref); + } + } + + + /// + /// Emits a Stind* instruction for the appropriate type. + /// + internal static void EmitStoreValueIndirect(this ILGenerator il, Type type) { + ContractUtils.RequiresNotNull(type, "type"); + + if (type.IsValueType) { + if (type == typeof(int)) { + il.Emit(OpCodes.Stind_I4); + } else if (type == typeof(short)) { + il.Emit(OpCodes.Stind_I2); + } else if (type == typeof(long) || type == typeof(ulong)) { + il.Emit(OpCodes.Stind_I8); + } else if (type == typeof(char)) { + il.Emit(OpCodes.Stind_I2); + } else if (type == typeof(bool)) { + il.Emit(OpCodes.Stind_I1); + } else if (type == typeof(float)) { + il.Emit(OpCodes.Stind_R4); + } else if (type == typeof(double)) { + il.Emit(OpCodes.Stind_R8); + } else { + il.Emit(OpCodes.Stobj, type); + } + } else { + il.Emit(OpCodes.Stind_Ref); + } + } + + // Emits the Ldelem* instruction for the appropriate type + + internal static void EmitLoadElement(this ILGenerator il, Type type) { + ContractUtils.RequiresNotNull(type, "type"); + + if (!type.IsValueType) { + il.Emit(OpCodes.Ldelem_Ref); + } else if (type.IsEnum) { + il.Emit(OpCodes.Ldelem, type); + } else { + switch (Type.GetTypeCode(type)) { + case TypeCode.Boolean: + case TypeCode.SByte: + il.Emit(OpCodes.Ldelem_I1); + break; + case TypeCode.Byte: + il.Emit(OpCodes.Ldelem_U1); + break; + case TypeCode.Int16: + il.Emit(OpCodes.Ldelem_I2); + break; + case TypeCode.Char: + case TypeCode.UInt16: + il.Emit(OpCodes.Ldelem_U2); + break; + case TypeCode.Int32: + il.Emit(OpCodes.Ldelem_I4); + break; + case TypeCode.UInt32: + il.Emit(OpCodes.Ldelem_U4); + break; + case TypeCode.Int64: + case TypeCode.UInt64: + il.Emit(OpCodes.Ldelem_I8); + break; + case TypeCode.Single: + il.Emit(OpCodes.Ldelem_R4); + break; + case TypeCode.Double: + il.Emit(OpCodes.Ldelem_R8); + break; + default: + il.Emit(OpCodes.Ldelem, type); + break; + } + } + } + + /// + /// Emits a Stelem* instruction for the appropriate type. + /// + internal static void EmitStoreElement(this ILGenerator il, Type type) { + ContractUtils.RequiresNotNull(type, "type"); + + if (type.IsEnum) { + il.Emit(OpCodes.Stelem, type); + return; + } + switch (Type.GetTypeCode(type)) { + case TypeCode.Boolean: + case TypeCode.SByte: + case TypeCode.Byte: + il.Emit(OpCodes.Stelem_I1); + break; + case TypeCode.Char: + case TypeCode.Int16: + case TypeCode.UInt16: + il.Emit(OpCodes.Stelem_I2); + break; + case TypeCode.Int32: + case TypeCode.UInt32: + il.Emit(OpCodes.Stelem_I4); + break; + case TypeCode.Int64: + case TypeCode.UInt64: + il.Emit(OpCodes.Stelem_I8); + break; + case TypeCode.Single: + il.Emit(OpCodes.Stelem_R4); + break; + case TypeCode.Double: + il.Emit(OpCodes.Stelem_R8); + break; + default: + if (type.IsValueType) { + il.Emit(OpCodes.Stelem, type); + } else { + il.Emit(OpCodes.Stelem_Ref); + } + break; + } + } + + internal static void EmitType(this ILGenerator il, Type type) { + ContractUtils.RequiresNotNull(type, "type"); + + il.Emit(OpCodes.Ldtoken, type); + il.Emit(OpCodes.Call, typeof(Type).GetMethod("GetTypeFromHandle")); + } + + #endregion + + #region Fields, properties and methods + + internal static void EmitFieldAddress(this ILGenerator il, FieldInfo fi) { + ContractUtils.RequiresNotNull(fi, "fi"); + + if (fi.IsStatic) { + il.Emit(OpCodes.Ldsflda, fi); + } else { + il.Emit(OpCodes.Ldflda, fi); + } + } + + internal static void EmitFieldGet(this ILGenerator il, FieldInfo fi) { + ContractUtils.RequiresNotNull(fi, "fi"); + + if (fi.IsStatic) { + il.Emit(OpCodes.Ldsfld, fi); + } else { + il.Emit(OpCodes.Ldfld, fi); + } + } + + internal static void EmitFieldSet(this ILGenerator il, FieldInfo fi) { + ContractUtils.RequiresNotNull(fi, "fi"); + + if (fi.IsStatic) { + il.Emit(OpCodes.Stsfld, fi); + } else { + il.Emit(OpCodes.Stfld, fi); + } + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1711:IdentifiersShouldNotHaveIncorrectSuffix")] + internal static void EmitNew(this ILGenerator il, ConstructorInfo ci) { + ContractUtils.RequiresNotNull(ci, "ci"); + + if (ci.DeclaringType.ContainsGenericParameters) { + throw Error.IllegalNewGenericParams(ci.DeclaringType); + } + + il.Emit(OpCodes.Newobj, ci); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1711:IdentifiersShouldNotHaveIncorrectSuffix")] + internal static void EmitNew(this ILGenerator il, Type type, Type[] paramTypes) { + ContractUtils.RequiresNotNull(type, "type"); + ContractUtils.RequiresNotNull(paramTypes, "paramTypes"); + + ConstructorInfo ci = type.GetConstructor(paramTypes); + ContractUtils.Requires(ci != null, "type", Strings.TypeDoesNotHaveConstructorForTheSignature); + il.EmitNew(ci); + } + + #endregion + + #region Constants + + internal static void EmitNull(this ILGenerator il) { + il.Emit(OpCodes.Ldnull); + } + + internal static void EmitString(this ILGenerator il, string value) { + ContractUtils.RequiresNotNull(value, "value"); + il.Emit(OpCodes.Ldstr, value); + } + + internal static void EmitBoolean(this ILGenerator il, bool value) { + if (value) { + il.Emit(OpCodes.Ldc_I4_1); + } else { + il.Emit(OpCodes.Ldc_I4_0); + } + } + + internal static void EmitChar(this ILGenerator il, char value) { + il.EmitInt(value); + il.Emit(OpCodes.Conv_U2); + } + + internal static void EmitByte(this ILGenerator il, byte value) { + il.EmitInt(value); + il.Emit(OpCodes.Conv_U1); + } + + internal static void EmitSByte(this ILGenerator il, sbyte value) { + il.EmitInt(value); + il.Emit(OpCodes.Conv_I1); + } + + internal static void EmitShort(this ILGenerator il, short value) { + il.EmitInt(value); + il.Emit(OpCodes.Conv_I2); + } + + internal static void EmitUShort(this ILGenerator il, ushort value) { + il.EmitInt(value); + il.Emit(OpCodes.Conv_U2); + } + + internal static void EmitInt(this ILGenerator il, int value) { + OpCode c; + switch (value) { + case -1: + c = OpCodes.Ldc_I4_M1; + break; + case 0: + c = OpCodes.Ldc_I4_0; + break; + case 1: + c = OpCodes.Ldc_I4_1; + break; + case 2: + c = OpCodes.Ldc_I4_2; + break; + case 3: + c = OpCodes.Ldc_I4_3; + break; + case 4: + c = OpCodes.Ldc_I4_4; + break; + case 5: + c = OpCodes.Ldc_I4_5; + break; + case 6: + c = OpCodes.Ldc_I4_6; + break; + case 7: + c = OpCodes.Ldc_I4_7; + break; + case 8: + c = OpCodes.Ldc_I4_8; + break; + default: + if (value >= -128 && value <= 127) { + il.Emit(OpCodes.Ldc_I4_S, (sbyte)value); + } else { + il.Emit(OpCodes.Ldc_I4, value); + } + return; + } + il.Emit(c); + } + + internal static void EmitUInt(this ILGenerator il, uint value) { + il.EmitInt((int)value); + il.Emit(OpCodes.Conv_U4); + } + + internal static void EmitLong(this ILGenerator il, long value) { + il.Emit(OpCodes.Ldc_I8, value); + + // + // Now, emit convert to give the constant type information. + // + // Otherwise, it is treated as unsigned and overflow is not + // detected if it's used in checked ops. + // + il.Emit(OpCodes.Conv_I8); + } + + internal static void EmitULong(this ILGenerator il, ulong value) { + il.Emit(OpCodes.Ldc_I8, (long)value); + il.Emit(OpCodes.Conv_U8); + } + + internal static void EmitDouble(this ILGenerator il, double value) { + il.Emit(OpCodes.Ldc_R8, value); + } + + internal static void EmitSingle(this ILGenerator il, float value) { + il.Emit(OpCodes.Ldc_R4, value); + } + + // matches TryEmitConstant + internal static bool CanEmitConstant(object value, Type type) { + if (value == null || CanEmitILConstant(type)) { + return true; + } + + Type t = value as Type; + if (t != null && ShouldLdtoken(t)) { + return true; + } + + MethodBase mb = value as MethodBase; + if (mb != null && ShouldLdtoken(mb)) { + return true; + } + + return false; + } + + // matches TryEmitILConstant + private static bool CanEmitILConstant(Type type) { + switch (Type.GetTypeCode(type)) { + case TypeCode.Boolean: + case TypeCode.SByte: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.Int64: + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Char: + case TypeCode.Byte: + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.UInt64: + case TypeCode.Decimal: + case TypeCode.String: + return true; + } + return false; + } + + internal static void EmitConstant(this ILGenerator il, object value) { + Debug.Assert(value != null); + EmitConstant(il, value, value.GetType()); + } + + + // + // Note: we support emitting more things as IL constants than + // Linq does + internal static void EmitConstant(this ILGenerator il, object value, Type type) { + if (value == null) { + // Smarter than the Linq implementation which uses the initobj + // pattern for all value types (works, but requires a local and + // more IL) + il.EmitDefault(type); + return; + } + + // Handle the easy cases + if (il.TryEmitILConstant(value, type)) { + return; + } + + // Check for a few more types that we support emitting as constants + Type t = value as Type; + if (t != null && ShouldLdtoken(t)) { + il.EmitType(t); + if (type != typeof(Type)) { + il.Emit(OpCodes.Castclass, type); + } + return; + } + + MethodBase mb = value as MethodBase; + if (mb != null && ShouldLdtoken(mb)) { + il.Emit(OpCodes.Ldtoken, mb); + Type dt = mb.DeclaringType; + if (dt != null && dt.IsGenericType) { + il.Emit(OpCodes.Ldtoken, dt); + il.Emit(OpCodes.Call, typeof(MethodBase).GetMethod("GetMethodFromHandle", new Type[] { typeof(RuntimeMethodHandle), typeof(RuntimeTypeHandle) })); + } else { + il.Emit(OpCodes.Call, typeof(MethodBase).GetMethod("GetMethodFromHandle", new Type[] { typeof(RuntimeMethodHandle) })); + } + if (type != typeof(MethodBase)) { + il.Emit(OpCodes.Castclass, type); + } + return; + } + + throw ContractUtils.Unreachable; + } + + internal static bool ShouldLdtoken(Type t) { + return t is TypeBuilder || t.IsGenericParameter || t.IsVisible; + } + + internal static bool ShouldLdtoken(MethodBase mb) { + // Can't ldtoken on a DynamicMethod + if (mb is DynamicMethod) { + return false; + } + + Type dt = mb.DeclaringType; + return dt == null || ShouldLdtoken(dt); + } + + + private static bool TryEmitILConstant(this ILGenerator il, object value, Type type) { + switch (Type.GetTypeCode(type)) { + case TypeCode.Boolean: + il.EmitBoolean((bool)value); + return true; + case TypeCode.SByte: + il.EmitSByte((sbyte)value); + return true; + case TypeCode.Int16: + il.EmitShort((short)value); + return true; + case TypeCode.Int32: + il.EmitInt((int)value); + return true; + case TypeCode.Int64: + il.EmitLong((long)value); + return true; + case TypeCode.Single: + il.EmitSingle((float)value); + return true; + case TypeCode.Double: + il.EmitDouble((double)value); + return true; + case TypeCode.Char: + il.EmitChar((char)value); + return true; + case TypeCode.Byte: + il.EmitByte((byte)value); + return true; + case TypeCode.UInt16: + il.EmitUShort((ushort)value); + return true; + case TypeCode.UInt32: + il.EmitUInt((uint)value); + return true; + case TypeCode.UInt64: + il.EmitULong((ulong)value); + return true; + case TypeCode.Decimal: + il.EmitDecimal((decimal)value); + return true; + case TypeCode.String: + il.EmitString((string)value); + return true; + default: + return false; + } + } + + #endregion + + #region Linq Conversions + + internal static void EmitConvertToType(this ILGenerator il, Type typeFrom, Type typeTo, bool isChecked) { + if (TypeUtils.AreEquivalent(typeFrom, typeTo)) { + return; + } + + if (typeFrom == typeof(void) || typeTo == typeof(void)) { + throw ContractUtils.Unreachable; + } + + bool isTypeFromNullable = TypeUtils.IsNullableType(typeFrom); + bool isTypeToNullable = TypeUtils.IsNullableType(typeTo); + + Type nnExprType = TypeUtils.GetNonNullableType(typeFrom); + Type nnType = TypeUtils.GetNonNullableType(typeTo); + + if (typeFrom.IsInterface || // interface cast + typeTo.IsInterface || + typeFrom == typeof(object) || // boxing cast + typeTo == typeof(object)) { + il.EmitCastToType(typeFrom, typeTo); + } else if (isTypeFromNullable || isTypeToNullable) { + il.EmitNullableConversion(typeFrom, typeTo, isChecked); + } else if (!(TypeUtils.IsConvertible(typeFrom) && TypeUtils.IsConvertible(typeTo)) // primitive runtime conversion + && + (nnExprType.IsAssignableFrom(nnType) || // down cast + nnType.IsAssignableFrom(nnExprType))) // up cast + { + il.EmitCastToType(typeFrom, typeTo); + } else if (typeFrom.IsArray && typeTo.IsArray) { + // See DevDiv Bugs #94657. + il.EmitCastToType(typeFrom, typeTo); + } else { + il.EmitNumericConversion(typeFrom, typeTo, isChecked); + } + } + + + private static void EmitCastToType(this ILGenerator il, Type typeFrom, Type typeTo) { + if (!typeFrom.IsValueType && typeTo.IsValueType) { + il.Emit(OpCodes.Unbox_Any, typeTo); + } else if (typeFrom.IsValueType && !typeTo.IsValueType) { + il.Emit(OpCodes.Box, typeFrom); + if (typeTo != typeof(object)) { + il.Emit(OpCodes.Castclass, typeTo); + } + } else if (!typeFrom.IsValueType && !typeTo.IsValueType) { + il.Emit(OpCodes.Castclass, typeTo); + } else { + throw Error.InvalidCast(typeFrom, typeTo); + } + } + + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private static void EmitNumericConversion(this ILGenerator il, Type typeFrom, Type typeTo, bool isChecked) { + bool isFromUnsigned = TypeUtils.IsUnsigned(typeFrom); + bool isFromFloatingPoint = TypeUtils.IsFloatingPoint(typeFrom); + if (typeTo == typeof(Single)) { + if (isFromUnsigned) + il.Emit(OpCodes.Conv_R_Un); + il.Emit(OpCodes.Conv_R4); + } else if (typeTo == typeof(Double)) { + if (isFromUnsigned) + il.Emit(OpCodes.Conv_R_Un); + il.Emit(OpCodes.Conv_R8); + } else { + TypeCode tc = Type.GetTypeCode(typeTo); + if (isChecked) { + if (isFromUnsigned) { + switch (tc) { + case TypeCode.SByte: + il.Emit(OpCodes.Conv_Ovf_I1_Un); + break; + case TypeCode.Int16: + il.Emit(OpCodes.Conv_Ovf_I2_Un); + break; + case TypeCode.Int32: + il.Emit(OpCodes.Conv_Ovf_I4_Un); + break; + case TypeCode.Int64: + il.Emit(OpCodes.Conv_Ovf_I8_Un); + break; + case TypeCode.Byte: + il.Emit(OpCodes.Conv_Ovf_U1_Un); + break; + case TypeCode.UInt16: + case TypeCode.Char: + il.Emit(OpCodes.Conv_Ovf_U2_Un); + break; + case TypeCode.UInt32: + il.Emit(OpCodes.Conv_Ovf_U4_Un); + break; + case TypeCode.UInt64: + il.Emit(OpCodes.Conv_Ovf_U8_Un); + break; + default: + throw Error.UnhandledConvert(typeTo); + } + } else { + switch (tc) { + case TypeCode.SByte: + il.Emit(OpCodes.Conv_Ovf_I1); + break; + case TypeCode.Int16: + il.Emit(OpCodes.Conv_Ovf_I2); + break; + case TypeCode.Int32: + il.Emit(OpCodes.Conv_Ovf_I4); + break; + case TypeCode.Int64: + il.Emit(OpCodes.Conv_Ovf_I8); + break; + case TypeCode.Byte: + il.Emit(OpCodes.Conv_Ovf_U1); + break; + case TypeCode.UInt16: + case TypeCode.Char: + il.Emit(OpCodes.Conv_Ovf_U2); + break; + case TypeCode.UInt32: + il.Emit(OpCodes.Conv_Ovf_U4); + break; + case TypeCode.UInt64: + il.Emit(OpCodes.Conv_Ovf_U8); + break; + default: + throw Error.UnhandledConvert(typeTo); + } + } + } else { + if (isFromUnsigned) { + switch (tc) { + case TypeCode.SByte: + case TypeCode.Byte: + il.Emit(OpCodes.Conv_U1); + break; + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Char: + il.Emit(OpCodes.Conv_U2); + break; + case TypeCode.Int32: + case TypeCode.UInt32: + il.Emit(OpCodes.Conv_U4); + break; + case TypeCode.Int64: + case TypeCode.UInt64: + il.Emit(OpCodes.Conv_U8); + break; + default: + throw Error.UnhandledConvert(typeTo); + } + } else { + switch (tc) { + case TypeCode.SByte: + case TypeCode.Byte: + il.Emit(OpCodes.Conv_I1); + break; + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Char: + il.Emit(OpCodes.Conv_I2); + break; + case TypeCode.Int32: + case TypeCode.UInt32: + il.Emit(OpCodes.Conv_I4); + break; + case TypeCode.Int64: + case TypeCode.UInt64: + il.Emit(OpCodes.Conv_I8); + break; + default: + throw Error.UnhandledConvert(typeTo); + } + } + } + } + } + + + private static void EmitNullableToNullableConversion(this ILGenerator il, Type typeFrom, Type typeTo, bool isChecked) { + Debug.Assert(TypeUtils.IsNullableType(typeFrom)); + Debug.Assert(TypeUtils.IsNullableType(typeTo)); + Label labIfNull = default(Label); + Label labEnd = default(Label); + LocalBuilder locFrom = null; + LocalBuilder locTo = null; + locFrom = il.DeclareLocal(typeFrom); + il.Emit(OpCodes.Stloc, locFrom); + locTo = il.DeclareLocal(typeTo); + // test for null + il.Emit(OpCodes.Ldloca, locFrom); + il.EmitHasValue(typeFrom); + labIfNull = il.DefineLabel(); + il.Emit(OpCodes.Brfalse_S, labIfNull); + il.Emit(OpCodes.Ldloca, locFrom); + il.EmitGetValueOrDefault(typeFrom); + Type nnTypeFrom = TypeUtils.GetNonNullableType(typeFrom); + Type nnTypeTo = TypeUtils.GetNonNullableType(typeTo); + il.EmitConvertToType(nnTypeFrom, nnTypeTo, isChecked); + // construct result type + ConstructorInfo ci = typeTo.GetConstructor(new Type[] { nnTypeTo }); + il.Emit(OpCodes.Newobj, ci); + il.Emit(OpCodes.Stloc, locTo); + labEnd = il.DefineLabel(); + il.Emit(OpCodes.Br_S, labEnd); + // if null then create a default one + il.MarkLabel(labIfNull); + il.Emit(OpCodes.Ldloca, locTo); + il.Emit(OpCodes.Initobj, typeTo); + il.MarkLabel(labEnd); + il.Emit(OpCodes.Ldloc, locTo); + } + + + private static void EmitNonNullableToNullableConversion(this ILGenerator il, Type typeFrom, Type typeTo, bool isChecked) { + Debug.Assert(!TypeUtils.IsNullableType(typeFrom)); + Debug.Assert(TypeUtils.IsNullableType(typeTo)); + LocalBuilder locTo = null; + locTo = il.DeclareLocal(typeTo); + Type nnTypeTo = TypeUtils.GetNonNullableType(typeTo); + il.EmitConvertToType(typeFrom, nnTypeTo, isChecked); + ConstructorInfo ci = typeTo.GetConstructor(new Type[] { nnTypeTo }); + il.Emit(OpCodes.Newobj, ci); + il.Emit(OpCodes.Stloc, locTo); + il.Emit(OpCodes.Ldloc, locTo); + } + + + private static void EmitNullableToNonNullableConversion(this ILGenerator il, Type typeFrom, Type typeTo, bool isChecked) { + Debug.Assert(TypeUtils.IsNullableType(typeFrom)); + Debug.Assert(!TypeUtils.IsNullableType(typeTo)); + if (typeTo.IsValueType) + il.EmitNullableToNonNullableStructConversion(typeFrom, typeTo, isChecked); + else + il.EmitNullableToReferenceConversion(typeFrom); + } + + + private static void EmitNullableToNonNullableStructConversion(this ILGenerator il, Type typeFrom, Type typeTo, bool isChecked) { + Debug.Assert(TypeUtils.IsNullableType(typeFrom)); + Debug.Assert(!TypeUtils.IsNullableType(typeTo)); + Debug.Assert(typeTo.IsValueType); + LocalBuilder locFrom = null; + locFrom = il.DeclareLocal(typeFrom); + il.Emit(OpCodes.Stloc, locFrom); + il.Emit(OpCodes.Ldloca, locFrom); + il.EmitGetValue(typeFrom); + Type nnTypeFrom = TypeUtils.GetNonNullableType(typeFrom); + il.EmitConvertToType(nnTypeFrom, typeTo, isChecked); + } + + + private static void EmitNullableToReferenceConversion(this ILGenerator il, Type typeFrom) { + Debug.Assert(TypeUtils.IsNullableType(typeFrom)); + // We've got a conversion from nullable to Object, ValueType, Enum, etc. Just box it so that + // we get the nullable semantics. + il.Emit(OpCodes.Box, typeFrom); + } + + + private static void EmitNullableConversion(this ILGenerator il, Type typeFrom, Type typeTo, bool isChecked) { + bool isTypeFromNullable = TypeUtils.IsNullableType(typeFrom); + bool isTypeToNullable = TypeUtils.IsNullableType(typeTo); + Debug.Assert(isTypeFromNullable || isTypeToNullable); + if (isTypeFromNullable && isTypeToNullable) + il.EmitNullableToNullableConversion(typeFrom, typeTo, isChecked); + else if (isTypeFromNullable) + il.EmitNullableToNonNullableConversion(typeFrom, typeTo, isChecked); + else + il.EmitNonNullableToNullableConversion(typeFrom, typeTo, isChecked); + } + + + internal static void EmitHasValue(this ILGenerator il, Type nullableType) { + MethodInfo mi = nullableType.GetMethod("get_HasValue", BindingFlags.Instance | BindingFlags.Public); + Debug.Assert(nullableType.IsValueType); + il.Emit(OpCodes.Call, mi); + } + + + internal static void EmitGetValue(this ILGenerator il, Type nullableType) { + MethodInfo mi = nullableType.GetMethod("get_Value", BindingFlags.Instance | BindingFlags.Public); + Debug.Assert(nullableType.IsValueType); + il.Emit(OpCodes.Call, mi); + } + + + internal static void EmitGetValueOrDefault(this ILGenerator il, Type nullableType) { + MethodInfo mi = nullableType.GetMethod("GetValueOrDefault", System.Type.EmptyTypes); + Debug.Assert(nullableType.IsValueType); + il.Emit(OpCodes.Call, mi); + } + + #endregion + + #region Arrays + + /// + /// Emits an array of constant values provided in the given list. + /// The array is strongly typed. + /// + internal static void EmitArray(this ILGenerator il, IList items) { + ContractUtils.RequiresNotNull(items, "items"); + + il.EmitInt(items.Count); + il.Emit(OpCodes.Newarr, typeof(T)); + for (int i = 0; i < items.Count; i++) { + il.Emit(OpCodes.Dup); + il.EmitInt(i); + il.EmitConstant(items[i], typeof(T)); + il.EmitStoreElement(typeof(T)); + } + } + + /// + /// Emits an array of values of count size. The items are emitted via the callback + /// which is provided with the current item index to emit. + /// + internal static void EmitArray(this ILGenerator il, Type elementType, int count, Action emit) { + ContractUtils.RequiresNotNull(elementType, "elementType"); + ContractUtils.RequiresNotNull(emit, "emit"); + ContractUtils.Requires(count >= 0, "count", Strings.CountCannotBeNegative); + + il.EmitInt(count); + il.Emit(OpCodes.Newarr, elementType); + for (int i = 0; i < count; i++) { + il.Emit(OpCodes.Dup); + il.EmitInt(i); + + emit(i); + + il.EmitStoreElement(elementType); + } + } + + /// + /// Emits an array construction code. + /// The code assumes that bounds for all dimensions + /// are already emitted. + /// + internal static void EmitArray(this ILGenerator il, Type arrayType) { + ContractUtils.RequiresNotNull(arrayType, "arrayType"); + ContractUtils.Requires(arrayType.IsArray, "arrayType", Strings.ArrayTypeMustBeArray); + + int rank = arrayType.GetArrayRank(); + if (rank == 1) { + il.Emit(OpCodes.Newarr, arrayType.GetElementType()); + } else { + Type[] types = new Type[rank]; + for (int i = 0; i < rank; i++) { + types[i] = typeof(int); + } + il.EmitNew(arrayType, types); + } + } + + #endregion + + #region Support for emitting constants + + internal static void EmitDecimal(this ILGenerator il, decimal value) { + if (Decimal.Truncate(value) == value) { + if (Int32.MinValue <= value && value <= Int32.MaxValue) { + int intValue = Decimal.ToInt32(value); + il.EmitInt(intValue); + il.EmitNew(typeof(Decimal).GetConstructor(new Type[] { typeof(int) })); + } else if (Int64.MinValue <= value && value <= Int64.MaxValue) { + long longValue = Decimal.ToInt64(value); + il.EmitLong(longValue); + il.EmitNew(typeof(Decimal).GetConstructor(new Type[] { typeof(long) })); + } else { + il.EmitDecimalBits(value); + } + } else { + il.EmitDecimalBits(value); + } + } + + private static void EmitDecimalBits(this ILGenerator il, decimal value) { + int[] bits = Decimal.GetBits(value); + il.EmitInt(bits[0]); + il.EmitInt(bits[1]); + il.EmitInt(bits[2]); + il.EmitBoolean((bits[3] & 0x80000000) != 0); + il.EmitByte((byte)(bits[3] >> 16)); + il.EmitNew(typeof(decimal).GetConstructor(new Type[] { typeof(int), typeof(int), typeof(int), typeof(bool), typeof(byte) })); + } + + /// + /// Emits default(T) + /// Semantics match C# compiler behavior + /// + internal static void EmitDefault(this ILGenerator il, Type type) { + switch (Type.GetTypeCode(type)) { + case TypeCode.Object: + case TypeCode.DateTime: + if (type.IsValueType) { + // Type.GetTypeCode on an enum returns the underlying + // integer TypeCode, so we won't get here. + Debug.Assert(!type.IsEnum); + + // This is the IL for default(T) if T is a generic type + // parameter, so it should work for any type. It's also + // the standard pattern for structs. + LocalBuilder lb = il.DeclareLocal(type); + il.Emit(OpCodes.Ldloca, lb); + il.Emit(OpCodes.Initobj, type); + il.Emit(OpCodes.Ldloc, lb); + } else { + il.Emit(OpCodes.Ldnull); + } + break; + + case TypeCode.Empty: + case TypeCode.String: + case TypeCode.DBNull: + il.Emit(OpCodes.Ldnull); + break; + + case TypeCode.Boolean: + case TypeCode.Char: + case TypeCode.SByte: + case TypeCode.Byte: + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + il.Emit(OpCodes.Ldc_I4_0); + break; + + case TypeCode.Int64: + case TypeCode.UInt64: + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Conv_I8); + break; + + case TypeCode.Single: + il.Emit(OpCodes.Ldc_R4, default(Single)); + break; + + case TypeCode.Double: + il.Emit(OpCodes.Ldc_R8, default(Double)); + break; + + case TypeCode.Decimal: + il.Emit(OpCodes.Ldc_I4_0); + il.Emit(OpCodes.Newobj, typeof(Decimal).GetConstructor(new Type[] { typeof(int) })); + break; + + default: + throw ContractUtils.Unreachable; + } + } + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/KeyedQueue.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/KeyedQueue.cs new file mode 100644 index 00000000000..464293c9c63 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/KeyedQueue.cs @@ -0,0 +1,95 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + /// + /// A simple dictionary of queues, keyed off a particular type + /// This is useful for storing free lists of variables + /// + internal sealed class KeyedQueue { + private readonly Dictionary> _data; + + internal KeyedQueue() { + _data = new Dictionary>(); + } + + internal void Enqueue(K key, V value) { + Queue queue; + if (!_data.TryGetValue(key, out queue)) { + _data.Add(key, queue = new Queue()); + } + queue.Enqueue(value); + } + + internal V Dequeue(K key) { + Queue queue; + if (!_data.TryGetValue(key, out queue)) { + throw Error.QueueEmpty(); + } + V result = queue.Dequeue(); + if (queue.Count == 0) { + _data.Remove(key); + } + return result; + } + + internal bool TryDequeue(K key, out V value) { + Queue queue; + if (_data.TryGetValue(key, out queue) && queue.Count > 0) { + value = queue.Dequeue(); + if (queue.Count == 0) { + _data.Remove(key); + } + return true; + } + value = default(V); + return false; + } + + internal V Peek(K key) { + Queue queue; + if (!_data.TryGetValue(key, out queue)) { + throw Error.QueueEmpty(); + } + return queue.Peek(); + } + + internal int GetCount(K key) { + Queue queue; + if (!_data.TryGetValue(key, out queue)) { + return 0; + } + return queue.Count; + } + + internal void Clear() { + _data.Clear(); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LabelInfo.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LabelInfo.cs new file mode 100644 index 00000000000..ad35a95e270 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LabelInfo.cs @@ -0,0 +1,365 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using ILGenerator = System.Linq.Expressions.Compiler.OffsetTrackingILGenerator; +#else +using ILGenerator = Microsoft.Linq.Expressions.Compiler.OffsetTrackingILGenerator; +#endif + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection.Emit; + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + /// + /// Contains compiler state corresponding to a LabelTarget + /// See also LabelScopeInfo. + /// + internal sealed class LabelInfo { + // The tree node representing this label + private readonly LabelTarget _node; + + // The IL label, will be mutated if Node is redefined + private Label _label; + private bool _labelDefined; + + internal Label Label { + get { + EnsureLabelAndValue(); + return _label; + } + } + + // The local that carries the label's value, if any + private LocalBuilder _value; + + // The blocks where this label is defined. If it has more than one item, + // the blocks can't be jumped to except from a child block + private readonly Set _definitions = new Set(); + + // Blocks that jump to this block + private readonly List _references = new List(); + + // True if this label is the last thing in this block + // (meaning we can emit a direct return) + private readonly bool _canReturn; + + // True if at least one jump is across blocks + // If we have any jump across blocks to this label, then the + // LabelTarget can only be defined in one place + private bool _acrossBlockJump; + + // Until we have more information, default to a leave instruction, + // which always works. Note: leave spills the stack, so we need to + // ensure that StackSpiller has guarenteed us an empty stack at this + // point. Otherwise Leave and Branch are not equivalent + private OpCode _opCode = OpCodes.Leave; + + private readonly ILGenerator _ilg; + + internal LabelInfo(ILGenerator il, LabelTarget node, bool canReturn) { + _ilg = il; + _node = node; + _canReturn = canReturn; + } + + internal bool CanReturn { + get { return _canReturn; } + } + + /// + /// Indicates if it is legal to emit a "branch" instruction based on + /// currently available information. Call the Reference method before + /// using this property. + /// + internal bool CanBranch { + get { return _opCode != OpCodes.Leave; } + } + + internal void Reference(LabelScopeInfo block) { + _references.Add(block); + if (_definitions.Count > 0) { + ValidateJump(block); + } + } + + // Returns true if the label was successfully defined + // or false if the label is now ambiguous + internal void Define(LabelScopeInfo block) { + // Prevent the label from being shadowed, which enforces cleaner + // trees. Also we depend on this for simplicity (keeping only one + // active IL Label per LabelInfo) + for (LabelScopeInfo j = block; j != null; j = j.Parent) { + if (j.ContainsTarget(_node)) { + throw Error.LabelTargetAlreadyDefined(_node.Name); + } + } + + _definitions.Add(block); + block.AddLabelInfo(_node, this); + + // Once defined, validate all jumps + if (_definitions.Count == 1) { + foreach (var r in _references) { + ValidateJump(r); + } + } else { + // Was just redefined, if we had any across block jumps, they're + // now invalid + if (_acrossBlockJump) { + throw Error.AmbiguousJump(_node.Name); + } + // For local jumps, we need a new IL label + // This is okay because: + // 1. no across block jumps have been made or will be made + // 2. we don't allow the label to be shadowed + _labelDefined = false; + } + } + + private void ValidateJump(LabelScopeInfo reference) { + // Assume we can do a ret/branch + _opCode = _canReturn ? OpCodes.Ret : OpCodes.Br; + + // look for a simple jump out + for (LabelScopeInfo j = reference; j != null; j = j.Parent) { + if (_definitions.Contains(j)) { + // found it, jump is valid! + return; + } + if (j.Kind == LabelScopeKind.Finally || + j.Kind == LabelScopeKind.Filter) { + break; + } + if (j.Kind == LabelScopeKind.Try || + j.Kind == LabelScopeKind.Catch) { + _opCode = OpCodes.Leave; + } + } + + _acrossBlockJump = true; + if (_node != null && _node.Type != typeof(void)) { + throw Error.NonLocalJumpWithValue(_node.Name); + } + + if (_definitions.Count > 1) { + throw Error.AmbiguousJump(_node.Name); + } + + // We didn't find an outward jump. Look for a jump across blocks + LabelScopeInfo def = _definitions.First(); + LabelScopeInfo common = Helpers.CommonNode(def, reference, b => b.Parent); + + // Assume we can do a ret/branch + _opCode = _canReturn ? OpCodes.Ret : OpCodes.Br; + + // Validate that we aren't jumping across a finally + for (LabelScopeInfo j = reference; j != common; j = j.Parent) { + if (j.Kind == LabelScopeKind.Finally) { + throw Error.ControlCannotLeaveFinally(); + } + if (j.Kind == LabelScopeKind.Filter) { + throw Error.ControlCannotLeaveFilterTest(); + } + if (j.Kind == LabelScopeKind.Try || + j.Kind == LabelScopeKind.Catch) { + _opCode = OpCodes.Leave; + } + } + + // Valdiate that we aren't jumping into a catch or an expression + for (LabelScopeInfo j = def; j != common; j = j.Parent) { + if (!j.CanJumpInto) { + if (j.Kind == LabelScopeKind.Expression) { + throw Error.ControlCannotEnterExpression(); + } else { + throw Error.ControlCannotEnterTry(); + } + } + } + } + + internal void ValidateFinish() { + // Make sure that if this label was jumped to, it is also defined + if (_references.Count > 0 && _definitions.Count == 0) { + throw Error.LabelTargetUndefined(_node.Name); + } + } + + internal void EmitJump() { + // Return directly if we can + if (_opCode == OpCodes.Ret) { + _ilg.Emit(OpCodes.Ret); + } else { + StoreValue(); + _ilg.Emit(_opCode, Label); + } + } + + private void StoreValue() { + EnsureLabelAndValue(); + if (_value != null) { + _ilg.Emit(OpCodes.Stloc, _value); + } + } + + internal void Mark() { + if (_canReturn) { + // Don't mark return labels unless they were actually jumped to + // (returns are last so we know for sure if anyone jumped to it) + if (!_labelDefined) { + // We don't even need to emit the "ret" because + // LambdaCompiler does that for us. + return; + } + + // Otherwise, emit something like: + // ret + // : + // ldloc + _ilg.Emit(OpCodes.Ret); + } else { + + // For the normal case, we emit: + // stloc + // : + // ldloc + StoreValue(); + } + MarkWithEmptyStack(); + } + + // Like Mark, but assumes the stack is empty + internal void MarkWithEmptyStack() { + _ilg.MarkLabel(Label); + if (_value != null) { + // We always read the value from a local, because we don't know + // if there will be a "leave" instruction targeting it ("branch" + // preserves its stack, but "leave" empties the stack) + _ilg.Emit(OpCodes.Ldloc, _value); + } + } + + private void EnsureLabelAndValue() { + if (!_labelDefined) { + _labelDefined = true; + _label = _ilg.DefineLabel(); + if (_node != null && _node.Type != typeof(void)) { + _value = _ilg.DeclareLocal(_node.Type); + } + } + } + } + + internal enum LabelScopeKind { + // any "statement like" node that can be jumped into + Statement, + + // these correspond to the node of the same name + Block, + Switch, + Lambda, + Try, + + // these correspond to the part of the try block we're in + Catch, + Finally, + Filter, + + // the catch-all value for any other expression type + // (means we can't jump into it) + Expression, + } + + // + // Tracks scoping information for LabelTargets. Logically corresponds to a + // "label scope". Even though we have arbitrary goto support, we still need + // to track what kinds of nodes that gotos are jumping through, both to + // emit property IL ("leave" out of a try block), and for validation, and + // to allow labels to be duplicated in the tree, as long as the jumps are + // considered "up only" jumps. + // + // We create one of these for every Expression that can be jumped into, as + // well as creating them for the first expression we can't jump into. The + // "Kind" property indicates what kind of scope this is. + // + internal sealed class LabelScopeInfo { + private Dictionary Labels; // lazily allocated, we typically use this only once every 6th-7th block + internal readonly LabelScopeKind Kind; + internal readonly LabelScopeInfo Parent; + + internal LabelScopeInfo(LabelScopeInfo parent, LabelScopeKind kind) { + Parent = parent; + Kind = kind; + } + + /// + /// Returns true if we can jump into this node + /// + internal bool CanJumpInto { + get { + switch (Kind) { + case LabelScopeKind.Block: + case LabelScopeKind.Statement: + case LabelScopeKind.Switch: + case LabelScopeKind.Lambda: + return true; + } + return false; + } + } + + + internal bool ContainsTarget(LabelTarget target) { + if (Labels == null) { + return false; + } + + return Labels.ContainsKey(target); + } + + internal bool TryGetLabelInfo(LabelTarget target, out LabelInfo info) { + if (Labels == null) { + info = null; + return false; + } + + return Labels.TryGetValue(target, out info); + } + + internal void AddLabelInfo(LabelTarget target, LabelInfo info) { + Debug.Assert(CanJumpInto); + + if (Labels == null) { + Labels = new Dictionary(); + } + + Labels.Add(target, info); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Address.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Address.cs new file mode 100644 index 00000000000..acdbcd33016 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Address.cs @@ -0,0 +1,339 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Reflection.Emit; + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + partial class LambdaCompiler { + private void EmitAddress(Expression node, Type type) { + EmitAddress(node, type, CompilationFlags.EmitExpressionStart); + } + + // We don't want "ref" parameters to modify values of expressions + // except where it would in IL: locals, args, fields, and array elements + // (Unbox is an exception, it's intended to emit a ref to the orignal + // boxed value) + private void EmitAddress(Expression node, Type type, CompilationFlags flags) { + Debug.Assert(node != null); + bool emitStart = (flags & CompilationFlags.EmitExpressionStartMask) == CompilationFlags.EmitExpressionStart; + CompilationFlags startEmitted = emitStart ? EmitExpressionStart(node) : CompilationFlags.EmitNoExpressionStart; + + switch (node.NodeType) { + default: + EmitExpressionAddress(node, type); + break; + + case ExpressionType.ArrayIndex: + AddressOf((BinaryExpression)node, type); + break; + + case ExpressionType.Parameter: + AddressOf((ParameterExpression)node, type); + break; + + case ExpressionType.MemberAccess: + AddressOf((MemberExpression)node, type); + break; + + case ExpressionType.Unbox: + AddressOf((UnaryExpression)node, type); + break; + + case ExpressionType.Call: + AddressOf((MethodCallExpression)node, type); + break; + + case ExpressionType.Index: + AddressOf((IndexExpression)node, type); + break; + } + + if (emitStart) { + EmitExpressionEnd(startEmitted); + } + } + + + private void AddressOf(BinaryExpression node, Type type) { + Debug.Assert(node.NodeType == ExpressionType.ArrayIndex && node.Method == null); + + if (TypeUtils.AreEquivalent(type, node.Type)) { + EmitExpression(node.Left); + EmitExpression(node.Right); + Type rightType = node.Right.Type; + if (TypeUtils.IsNullableType(rightType)) { + LocalBuilder loc = GetLocal(rightType); + _ilg.Emit(OpCodes.Stloc, loc); + _ilg.Emit(OpCodes.Ldloca, loc); + _ilg.EmitGetValue(rightType); + FreeLocal(loc); + } + Type indexType = TypeUtils.GetNonNullableType(rightType); + if (indexType != typeof(int)) { + _ilg.EmitConvertToType(indexType, typeof(int), true); + } + _ilg.Emit(OpCodes.Ldelema, node.Type); + } else { + EmitExpressionAddress(node, type); + } + } + + private void AddressOf(ParameterExpression node, Type type) { + if (TypeUtils.AreEquivalent(type, node.Type)) { + if (node.IsByRef) { + _scope.EmitGet(node); + } else { + _scope.EmitAddressOf(node); + } + } else { + EmitExpressionAddress(node, type); + } + } + + + private void AddressOf(MemberExpression node, Type type) { + if (TypeUtils.AreEquivalent(type, node.Type)) { + // emit "this", if any + Type objectType = null; + if (node.Expression != null) { + EmitInstance(node.Expression, objectType = node.Expression.Type); + } + EmitMemberAddress(node.Member, objectType); + } else { + EmitExpressionAddress(node, type); + } + } + + // assumes the instance is already on the stack + private void EmitMemberAddress(MemberInfo member, Type objectType) { + if (member.MemberType == MemberTypes.Field) { + FieldInfo field = (FieldInfo)member; + + // Verifiable code may not take the address of an init-only field. + // If we are asked to do so then get the value out of the field, stuff it + // into a local of the same type, and then take the address of the local. + // Typically this is what we want to do anyway; if we are saying + // Foo.bar.ToString() for a static value-typed field bar then we don't need + // the address of field bar to do the call. The address of a local which + // has the same value as bar is sufficient. + + // CONSIDER: + // The C# compiler will not compile a lambda expression tree + // which writes to the address of an init-only field. But one could + // probably use the expression tree API to build such an expression. + // (When compiled, such an expression would fail silently.) It might + // be worth it to add checking to the expression tree API to ensure + // that it is illegal to attempt to write to an init-only field, + // the same way that it is illegal to write to a read-only property. + // The same goes for literal fields. + if (!field.IsLiteral && !field.IsInitOnly) { + _ilg.EmitFieldAddress(field); + return; + } + } + + EmitMemberGet(member, objectType); + LocalBuilder temp = GetLocal(GetMemberType(member)); + _ilg.Emit(OpCodes.Stloc, temp); + _ilg.Emit(OpCodes.Ldloca, temp); + } + + + private void AddressOf(MethodCallExpression node, Type type) { + // An array index of a multi-dimensional array is represented by a call to Array.Get, + // rather than having its own array-access node. This means that when we are trying to + // get the address of a member of a multi-dimensional array, we'll be trying to + // get the address of a Get method, and it will fail to do so. Instead, detect + // this situation and replace it with a call to the Address method. + if (!node.Method.IsStatic && + node.Object.Type.IsArray && + node.Method == node.Object.Type.GetMethod("Get", BindingFlags.Public | BindingFlags.Instance)) { + + MethodInfo mi = node.Object.Type.GetMethod("Address", BindingFlags.Public | BindingFlags.Instance); + + EmitMethodCall(node.Object, mi, node); + } else { + EmitExpressionAddress(node, type); + } + } + + private void AddressOf(IndexExpression node, Type type) { + if (!TypeUtils.AreEquivalent(type, node.Type) || node.Indexer != null) { + EmitExpressionAddress(node, type); + return; + } + + if (node.Arguments.Count == 1) { + EmitExpression(node.Object); + EmitExpression(node.Arguments[0]); + _ilg.Emit(OpCodes.Ldelema, node.Type); + } else { + var address = node.Object.Type.GetMethod("Address", BindingFlags.Public | BindingFlags.Instance); + EmitMethodCall(node.Object, address, node); + } + } + + private void AddressOf(UnaryExpression node, Type type) { + Debug.Assert(node.NodeType == ExpressionType.Unbox); + Debug.Assert(type.IsValueType && !TypeUtils.IsNullableType(type)); + + // Unbox leaves a pointer to the boxed value on the stack + EmitExpression(node.Operand); + _ilg.Emit(OpCodes.Unbox, type); + } + + private void EmitExpressionAddress(Expression node, Type type) { + Debug.Assert(TypeUtils.AreReferenceAssignable(type, node.Type)); + + EmitExpression(node, CompilationFlags.EmitAsNoTail | CompilationFlags.EmitNoExpressionStart); + LocalBuilder tmp = GetLocal(type); + _ilg.Emit(OpCodes.Stloc, tmp); + _ilg.Emit(OpCodes.Ldloca, tmp); + } + + + // Emits the address of the expression, returning the write back if necessary + // + // For properties, we want to write back into the property if it's + // passed byref. + private WriteBack EmitAddressWriteBack(Expression node, Type type) { + CompilationFlags startEmitted = EmitExpressionStart(node); + + WriteBack result = null; + if (TypeUtils.AreEquivalent(type, node.Type)) { + switch (node.NodeType) { + case ExpressionType.MemberAccess: + result = AddressOfWriteBack((MemberExpression)node); + break; + case ExpressionType.Index: + result = AddressOfWriteBack((IndexExpression)node); + break; + } + } + if (result == null) { + EmitAddress(node, type, CompilationFlags.EmitAsNoTail | CompilationFlags.EmitNoExpressionStart); + } + + EmitExpressionEnd(startEmitted); + + return result; + } + + private WriteBack AddressOfWriteBack(MemberExpression node) { + if (node.Member.MemberType != MemberTypes.Property || !((PropertyInfo)node.Member).CanWrite) { + return null; + } + + // emit instance, if any + LocalBuilder instanceLocal = null; + Type instanceType = null; + if (node.Expression != null) { + EmitInstance(node.Expression, instanceType = node.Expression.Type); + // store in local + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Stloc, instanceLocal = GetLocal(instanceType)); + } + + PropertyInfo pi = (PropertyInfo)node.Member; + + // emit the get + EmitCall(instanceType, pi.GetGetMethod(true)); + + // emit the address of the value + var valueLocal = GetLocal(node.Type); + _ilg.Emit(OpCodes.Stloc, valueLocal); + _ilg.Emit(OpCodes.Ldloca, valueLocal); + + // Set the property after the method call + // don't re-evaluate anything + return delegate() { + if (instanceLocal != null) { + _ilg.Emit(OpCodes.Ldloc, instanceLocal); + FreeLocal(instanceLocal); + } + _ilg.Emit(OpCodes.Ldloc, valueLocal); + FreeLocal(valueLocal); + EmitCall(instanceType, pi.GetSetMethod(true)); + }; + } + + private WriteBack AddressOfWriteBack(IndexExpression node) { + if (node.Indexer == null || !node.Indexer.CanWrite) { + return null; + } + + // emit instance, if any + LocalBuilder instanceLocal = null; + Type instanceType = null; + if (node.Object != null) { + EmitInstance(node.Object, instanceType = node.Object.Type); + + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Stloc, instanceLocal = GetLocal(instanceType)); + } + + // Emit indexes. We don't allow byref args, so no need to worry + // about writebacks or EmitAddress + List args = new List(); + foreach (var arg in node.Arguments) { + EmitExpression(arg); + + var argLocal = GetLocal(arg.Type); + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Stloc, argLocal); + args.Add(argLocal); + } + + // emit the get + EmitGetIndexCall(node, instanceType); + + // emit the address of the value + var valueLocal = GetLocal(node.Type); + _ilg.Emit(OpCodes.Stloc, valueLocal); + _ilg.Emit(OpCodes.Ldloca, valueLocal); + + // Set the property after the method call + // don't re-evaluate anything + return delegate() { + if (instanceLocal != null) { + _ilg.Emit(OpCodes.Ldloc, instanceLocal); + FreeLocal(instanceLocal); + } + foreach (var arg in args) { + _ilg.Emit(OpCodes.Ldloc, arg); + FreeLocal(arg); + } + _ilg.Emit(OpCodes.Ldloc, valueLocal); + FreeLocal(valueLocal); + + EmitSetIndexCall(node, instanceType); + }; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Binary.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Binary.cs new file mode 100644 index 00000000000..03a18d04f6a --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Binary.cs @@ -0,0 +1,706 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Reflection.Emit; + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + partial class LambdaCompiler { + + private void EmitBinaryExpression(Expression expr) { + EmitBinaryExpression(expr, CompilationFlags.EmitAsNoTail); + } + + private void EmitBinaryExpression(Expression expr, CompilationFlags flags) { + BinaryExpression b = (BinaryExpression)expr; + + Debug.Assert(b.NodeType != ExpressionType.AndAlso && b.NodeType != ExpressionType.OrElse && b.NodeType != ExpressionType.Coalesce); + + if (b.Method != null) { + EmitBinaryMethod(b, flags); + return; + } + + // For EQ and NE, if there is a user-specified method, use it. + // Otherwise implement the C# semantics that allow equality + // comparisons on non-primitive nullable structs that don't + // overload "==" + if ((b.NodeType == ExpressionType.Equal || b.NodeType == ExpressionType.NotEqual) && + (b.Type == typeof(bool) || b.Type == typeof(bool?))) { + + // If we have x==null, x!=null, null==x or null!=x where x is + // nullable but not null, then generate a call to x.HasValue. + Debug.Assert(!b.IsLiftedToNull || b.Type == typeof(bool?)); + if (ConstantCheck.IsNull(b.Left) && !ConstantCheck.IsNull(b.Right) && TypeUtils.IsNullableType(b.Right.Type)) { + EmitNullEquality(b.NodeType, b.Right, b.IsLiftedToNull); + return; + } + if (ConstantCheck.IsNull(b.Right) && !ConstantCheck.IsNull(b.Left) && TypeUtils.IsNullableType(b.Left.Type)) { + EmitNullEquality(b.NodeType, b.Left, b.IsLiftedToNull); + return; + } + + // For EQ and NE, we can avoid some conversions if we're + // ultimately just comparing two managed pointers. + EmitExpression(GetEqualityOperand(b.Left)); + EmitExpression(GetEqualityOperand(b.Right)); + } else { + // Otherwise generate it normally + EmitExpression(b.Left); + EmitExpression(b.Right); + } + + EmitBinaryOperator(b.NodeType, b.Left.Type, b.Right.Type, b.Type, b.IsLiftedToNull); + } + + + private void EmitNullEquality(ExpressionType op, Expression e, bool isLiftedToNull) { + Debug.Assert(TypeUtils.IsNullableType(e.Type)); + Debug.Assert(op == ExpressionType.Equal || op == ExpressionType.NotEqual); + // If we are lifted to null then just evaluate the expression for its side effects, discard, + // and generate null. If we are not lifted to null then generate a call to HasValue. + if (isLiftedToNull) { + EmitExpressionAsVoid(e); + _ilg.EmitDefault(typeof(bool?)); + } else { + EmitAddress(e, e.Type); + _ilg.EmitHasValue(e.Type); + if (op == ExpressionType.Equal) { + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + } + } + } + + + private void EmitBinaryMethod(BinaryExpression b, CompilationFlags flags) { + if (b.IsLifted) { + ParameterExpression p1 = Expression.Variable(TypeUtils.GetNonNullableType(b.Left.Type), null); + ParameterExpression p2 = Expression.Variable(TypeUtils.GetNonNullableType(b.Right.Type), null); + MethodCallExpression mc = Expression.Call(null, b.Method, p1, p2); + Type resultType = null; + if (b.IsLiftedToNull) { + resultType = TypeUtils.GetNullableType(mc.Type); + } else { + switch (b.NodeType) { + case ExpressionType.Equal: + case ExpressionType.NotEqual: + case ExpressionType.LessThan: + case ExpressionType.LessThanOrEqual: + case ExpressionType.GreaterThan: + case ExpressionType.GreaterThanOrEqual: + if (mc.Type != typeof(bool)) { + throw Error.ArgumentMustBeBoolean(); + } + resultType = typeof(bool); + break; + default: + resultType = TypeUtils.GetNullableType(mc.Type); + break; + } + } + var variables = new ParameterExpression[] { p1, p2 }; + var arguments = new Expression[] { b.Left, b.Right }; + ValidateLift(variables, arguments); + EmitLift(b.NodeType, resultType, mc, variables, arguments); + } else { + EmitMethodCallExpression(Expression.Call(null, b.Method, b.Left, b.Right), flags); + } + } + + + private void EmitBinaryOperator(ExpressionType op, Type leftType, Type rightType, Type resultType, bool liftedToNull) { + bool leftIsNullable = TypeUtils.IsNullableType(leftType); + bool rightIsNullable = TypeUtils.IsNullableType(rightType); + + switch (op) { + case ExpressionType.ArrayIndex: + if (rightType != typeof(int)) { + throw ContractUtils.Unreachable; + } + _ilg.EmitLoadElement(leftType.GetElementType()); + return; + case ExpressionType.Coalesce: + throw Error.UnexpectedCoalesceOperator(); + } + + if (leftIsNullable || rightIsNullable) { + EmitLiftedBinaryOp(op, leftType, rightType, resultType, liftedToNull); + } else { + EmitUnliftedBinaryOp(op, leftType, rightType); + EmitConvertArithmeticResult(op, resultType); + } + } + + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private void EmitUnliftedBinaryOp(ExpressionType op, Type leftType, Type rightType) { + Debug.Assert(!TypeUtils.IsNullableType(leftType)); + Debug.Assert(!TypeUtils.IsNullableType(rightType)); + + if (op == ExpressionType.Equal || op == ExpressionType.NotEqual) { + EmitUnliftedEquality(op, leftType); + return; + } + if (!leftType.IsPrimitive) { + throw Error.OperatorNotImplementedForType(op, leftType); + } + switch (op) { + case ExpressionType.Add: + _ilg.Emit(OpCodes.Add); + break; + case ExpressionType.AddChecked: + if (TypeUtils.IsFloatingPoint(leftType)) { + _ilg.Emit(OpCodes.Add); + } else if (TypeUtils.IsUnsigned(leftType)) { + _ilg.Emit(OpCodes.Add_Ovf_Un); + } else { + _ilg.Emit(OpCodes.Add_Ovf); + } + break; + case ExpressionType.Subtract: + _ilg.Emit(OpCodes.Sub); + break; + case ExpressionType.SubtractChecked: + if (TypeUtils.IsFloatingPoint(leftType)) { + _ilg.Emit(OpCodes.Sub); + } else if (TypeUtils.IsUnsigned(leftType)) { + _ilg.Emit(OpCodes.Sub_Ovf_Un); + } else { + _ilg.Emit(OpCodes.Sub_Ovf); + } + break; + case ExpressionType.Multiply: + _ilg.Emit(OpCodes.Mul); + break; + case ExpressionType.MultiplyChecked: + if (TypeUtils.IsFloatingPoint(leftType)) { + _ilg.Emit(OpCodes.Mul); + } else if (TypeUtils.IsUnsigned(leftType)) { + _ilg.Emit(OpCodes.Mul_Ovf_Un); + } else { + _ilg.Emit(OpCodes.Mul_Ovf); + } + break; + case ExpressionType.Divide: + if (TypeUtils.IsUnsigned(leftType)) { + _ilg.Emit(OpCodes.Div_Un); + } else { + _ilg.Emit(OpCodes.Div); + } + break; + case ExpressionType.Modulo: + if (TypeUtils.IsUnsigned(leftType)) { + _ilg.Emit(OpCodes.Rem_Un); + } else { + _ilg.Emit(OpCodes.Rem); + } + break; + case ExpressionType.And: + case ExpressionType.AndAlso: + _ilg.Emit(OpCodes.And); + break; + case ExpressionType.Or: + case ExpressionType.OrElse: + _ilg.Emit(OpCodes.Or); + break; + case ExpressionType.LessThan: + if (TypeUtils.IsUnsigned(leftType)) { + _ilg.Emit(OpCodes.Clt_Un); + } else { + _ilg.Emit(OpCodes.Clt); + } + break; + case ExpressionType.LessThanOrEqual: { + Label labFalse = _ilg.DefineLabel(); + Label labEnd = _ilg.DefineLabel(); + if (TypeUtils.IsUnsigned(leftType)) { + _ilg.Emit(OpCodes.Ble_Un_S, labFalse); + } else { + _ilg.Emit(OpCodes.Ble_S, labFalse); + } + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Br_S, labEnd); + _ilg.MarkLabel(labFalse); + _ilg.Emit(OpCodes.Ldc_I4_1); + _ilg.MarkLabel(labEnd); + } + break; + case ExpressionType.GreaterThan: + if (TypeUtils.IsUnsigned(leftType)) { + _ilg.Emit(OpCodes.Cgt_Un); + } else { + _ilg.Emit(OpCodes.Cgt); + } + break; + case ExpressionType.GreaterThanOrEqual: { + Label labFalse = _ilg.DefineLabel(); + Label labEnd = _ilg.DefineLabel(); + if (TypeUtils.IsUnsigned(leftType)) { + _ilg.Emit(OpCodes.Bge_Un_S, labFalse); + } else { + _ilg.Emit(OpCodes.Bge_S, labFalse); + } + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Br_S, labEnd); + _ilg.MarkLabel(labFalse); + _ilg.Emit(OpCodes.Ldc_I4_1); + _ilg.MarkLabel(labEnd); + } + break; + case ExpressionType.ExclusiveOr: + _ilg.Emit(OpCodes.Xor); + break; + case ExpressionType.LeftShift: + if (rightType != typeof(int)) { + throw ContractUtils.Unreachable; + } + _ilg.Emit(OpCodes.Shl); + break; + case ExpressionType.RightShift: + if (rightType != typeof(int)) { + throw ContractUtils.Unreachable; + } + if (TypeUtils.IsUnsigned(leftType)) { + _ilg.Emit(OpCodes.Shr_Un); + } else { + _ilg.Emit(OpCodes.Shr); + } + break; + default: + throw Error.UnhandledBinary(op); + } + } + + // Binary/unary operations on 8 and 16 bit operand types will leave a + // 32-bit value on the stack, because that's how IL works. For these + // cases, we need to cast it back to the resultType, possibly using a + // checked conversion if the original operator was convert + private void EmitConvertArithmeticResult(ExpressionType op, Type resultType) { + Debug.Assert(!resultType.IsNullableType()); + + switch (Type.GetTypeCode(resultType)) { + case TypeCode.Byte: + _ilg.Emit(IsChecked(op) ? OpCodes.Conv_Ovf_U1 : OpCodes.Conv_U1); + break; + case TypeCode.SByte: + _ilg.Emit(IsChecked(op) ? OpCodes.Conv_Ovf_I1 : OpCodes.Conv_I1); + break; + case TypeCode.UInt16: + _ilg.Emit(IsChecked(op) ? OpCodes.Conv_Ovf_U2 : OpCodes.Conv_U2); + break; + case TypeCode.Int16: + _ilg.Emit(IsChecked(op) ? OpCodes.Conv_Ovf_I2 : OpCodes.Conv_I2); + break; + } + } + + private void EmitUnliftedEquality(ExpressionType op, Type type) { + Debug.Assert(op == ExpressionType.Equal || op == ExpressionType.NotEqual); + if (!type.IsPrimitive && type.IsValueType && !type.IsEnum) { + throw Error.OperatorNotImplementedForType(op, type); + } + _ilg.Emit(OpCodes.Ceq); + if (op == ExpressionType.NotEqual) { + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + } + } + + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private void EmitLiftedBinaryOp(ExpressionType op, Type leftType, Type rightType, Type resultType, bool liftedToNull) { + Debug.Assert(TypeUtils.IsNullableType(leftType) || TypeUtils.IsNullableType(rightType)); + switch (op) { + case ExpressionType.And: + if (leftType == typeof(bool?)) { + EmitLiftedBooleanAnd(); + } else { + EmitLiftedBinaryArithmetic(op, leftType, rightType, resultType); + } + break; + case ExpressionType.Or: + if (leftType == typeof(bool?)) { + EmitLiftedBooleanOr(); + } else { + EmitLiftedBinaryArithmetic(op, leftType, rightType, resultType); + } + break; + case ExpressionType.ExclusiveOr: + case ExpressionType.Add: + case ExpressionType.AddChecked: + case ExpressionType.Subtract: + case ExpressionType.SubtractChecked: + case ExpressionType.Multiply: + case ExpressionType.MultiplyChecked: + case ExpressionType.Divide: + case ExpressionType.Modulo: + case ExpressionType.LeftShift: + case ExpressionType.RightShift: + EmitLiftedBinaryArithmetic(op, leftType, rightType, resultType); + break; + case ExpressionType.LessThan: + case ExpressionType.LessThanOrEqual: + case ExpressionType.GreaterThan: + case ExpressionType.GreaterThanOrEqual: + case ExpressionType.Equal: + case ExpressionType.NotEqual: + EmitLiftedRelational(op, leftType, rightType, resultType, liftedToNull); + break; + case ExpressionType.AndAlso: + case ExpressionType.OrElse: + default: + throw ContractUtils.Unreachable; + } + } + + + private void EmitLiftedRelational(ExpressionType op, Type leftType, Type rightType, Type resultType, bool liftedToNull) { + Debug.Assert(TypeUtils.IsNullableType(leftType)); + + Label shortCircuit = _ilg.DefineLabel(); + LocalBuilder locLeft = GetLocal(leftType); + LocalBuilder locRight = GetLocal(rightType); + + // store values (reverse order since they are already on the stack) + _ilg.Emit(OpCodes.Stloc, locRight); + _ilg.Emit(OpCodes.Stloc, locLeft); + + if (op == ExpressionType.Equal) { + // test for both null -> true + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(leftType); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitHasValue(rightType); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.And); + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Brtrue_S, shortCircuit); + _ilg.Emit(OpCodes.Pop); + + // test for either is null -> false + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(leftType); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitHasValue(rightType); + _ilg.Emit(OpCodes.And); + + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Brfalse_S, shortCircuit); + _ilg.Emit(OpCodes.Pop); + } else if (op == ExpressionType.NotEqual) { + // test for both null -> false + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(leftType); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitHasValue(rightType); + _ilg.Emit(OpCodes.Or); + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Brfalse_S, shortCircuit); + _ilg.Emit(OpCodes.Pop); + + // test for either is null -> true + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(leftType); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitHasValue(rightType); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Or); + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Brtrue_S, shortCircuit); + _ilg.Emit(OpCodes.Pop); + } else { + // test for either is null -> false + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(leftType); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitHasValue(rightType); + _ilg.Emit(OpCodes.And); + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Brfalse_S, shortCircuit); + _ilg.Emit(OpCodes.Pop); + } + + // do op on values + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitGetValueOrDefault(leftType); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitGetValueOrDefault(rightType); + + //RELEASING locLeft locRight + FreeLocal(locLeft); + FreeLocal(locRight); + + EmitBinaryOperator( + op, + TypeUtils.GetNonNullableType(leftType), + TypeUtils.GetNonNullableType(rightType), + TypeUtils.GetNonNullableType(resultType), + false + ); + + if (!liftedToNull) { + _ilg.MarkLabel(shortCircuit); + } + + if (!TypeUtils.AreEquivalent(resultType, TypeUtils.GetNonNullableType(resultType))) { + _ilg.EmitConvertToType(TypeUtils.GetNonNullableType(resultType), resultType, true); + } + + if (liftedToNull) { + Label labEnd = _ilg.DefineLabel(); + _ilg.Emit(OpCodes.Br, labEnd); + _ilg.MarkLabel(shortCircuit); + _ilg.Emit(OpCodes.Pop); + _ilg.Emit(OpCodes.Ldnull); + _ilg.Emit(OpCodes.Unbox_Any, resultType); + _ilg.MarkLabel(labEnd); + } + } + + + private void EmitLiftedBinaryArithmetic(ExpressionType op, Type leftType, Type rightType, Type resultType) { + bool leftIsNullable = TypeUtils.IsNullableType(leftType); + bool rightIsNullable = TypeUtils.IsNullableType(rightType); + + Debug.Assert(leftIsNullable || rightIsNullable); + + Label labIfNull = _ilg.DefineLabel(); + Label labEnd = _ilg.DefineLabel(); + LocalBuilder locLeft = GetLocal(leftType); + LocalBuilder locRight = GetLocal(rightType); + LocalBuilder locResult = GetLocal(resultType); + + // store values (reverse order since they are already on the stack) + _ilg.Emit(OpCodes.Stloc, locRight); + _ilg.Emit(OpCodes.Stloc, locLeft); + + // test for null + // use short circuiting + if (leftIsNullable) { + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(leftType); + _ilg.Emit(OpCodes.Brfalse_S, labIfNull); + } + if (rightIsNullable) { + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitHasValue(rightType); + _ilg.Emit(OpCodes.Brfalse_S, labIfNull); + } + + // do op on values + if (leftIsNullable) { + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitGetValueOrDefault(leftType); + } else { + _ilg.Emit(OpCodes.Ldloc, locLeft); + } + + if (rightIsNullable) { + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitGetValueOrDefault(rightType); + } else { + _ilg.Emit(OpCodes.Ldloc, locRight); + } + + //RELEASING locLeft locRight + FreeLocal(locLeft); + FreeLocal(locRight); + + EmitBinaryOperator(op, TypeUtils.GetNonNullableType(leftType), TypeUtils.GetNonNullableType(rightType), TypeUtils.GetNonNullableType(resultType), false); + + // construct result type + ConstructorInfo ci = resultType.GetConstructor(new Type[] { TypeUtils.GetNonNullableType(resultType) }); + _ilg.Emit(OpCodes.Newobj, ci); + _ilg.Emit(OpCodes.Stloc, locResult); + _ilg.Emit(OpCodes.Br_S, labEnd); + + // if null then create a default one + _ilg.MarkLabel(labIfNull); + _ilg.Emit(OpCodes.Ldloca, locResult); + _ilg.Emit(OpCodes.Initobj, resultType); + + _ilg.MarkLabel(labEnd); + + _ilg.Emit(OpCodes.Ldloc, locResult); + + //RELEASING locResult + FreeLocal(locResult); + } + + + private void EmitLiftedBooleanAnd() { + Type type = typeof(bool?); + Label labComputeRight = _ilg.DefineLabel(); + Label labReturnFalse = _ilg.DefineLabel(); + Label labReturnNull = _ilg.DefineLabel(); + Label labReturnValue = _ilg.DefineLabel(); + Label labExit = _ilg.DefineLabel(); + + // store values (reverse order since they are already on the stack) + LocalBuilder locLeft = GetLocal(type); + LocalBuilder locRight = GetLocal(type); + _ilg.Emit(OpCodes.Stloc, locRight); + _ilg.Emit(OpCodes.Stloc, locLeft); + + // compute left + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse, labComputeRight); + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitGetValueOrDefault(type); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Brtrue, labReturnFalse); + + // compute right + _ilg.MarkLabel(labComputeRight); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse_S, labReturnNull); + _ilg.Emit(OpCodes.Ldloca, locRight); + + //RELEASING locRight + FreeLocal(locRight); + + _ilg.EmitGetValueOrDefault(type); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Brtrue_S, labReturnFalse); + + // check left for null again + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse, labReturnNull); + + // return true + _ilg.Emit(OpCodes.Ldc_I4_1); + _ilg.Emit(OpCodes.Br_S, labReturnValue); + + // return false + _ilg.MarkLabel(labReturnFalse); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Br_S, labReturnValue); + + _ilg.MarkLabel(labReturnValue); + ConstructorInfo ci = type.GetConstructor(new Type[] { typeof(bool) }); + _ilg.Emit(OpCodes.Newobj, ci); + _ilg.Emit(OpCodes.Stloc, locLeft); + _ilg.Emit(OpCodes.Br, labExit); + + // return null + _ilg.MarkLabel(labReturnNull); + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.Emit(OpCodes.Initobj, type); + + _ilg.MarkLabel(labExit); + _ilg.Emit(OpCodes.Ldloc, locLeft); + + //RELEASING locLeft + FreeLocal(locLeft); + } + + + private void EmitLiftedBooleanOr() { + Type type = typeof(bool?); + Label labComputeRight = _ilg.DefineLabel(); + Label labReturnTrue = _ilg.DefineLabel(); + Label labReturnNull = _ilg.DefineLabel(); + Label labReturnValue = _ilg.DefineLabel(); + Label labExit = _ilg.DefineLabel(); + + // store values (reverse order since they are already on the stack) + LocalBuilder locLeft = GetLocal(type); + LocalBuilder locRight = GetLocal(type); + _ilg.Emit(OpCodes.Stloc, locRight); + _ilg.Emit(OpCodes.Stloc, locLeft); + + // compute left + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse, labComputeRight); + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitGetValueOrDefault(type); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Brfalse, labReturnTrue); + + // compute right + _ilg.MarkLabel(labComputeRight); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse_S, labReturnNull); + _ilg.Emit(OpCodes.Ldloca, locRight); + + //RELEASING locRight + FreeLocal(locRight); + + _ilg.EmitGetValueOrDefault(type); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Brfalse_S, labReturnTrue); + + // check left for null again + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse, labReturnNull); + + // return false + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Br_S, labReturnValue); + + // return true + _ilg.MarkLabel(labReturnTrue); + _ilg.Emit(OpCodes.Ldc_I4_1); + _ilg.Emit(OpCodes.Br_S, labReturnValue); + + _ilg.MarkLabel(labReturnValue); + ConstructorInfo ci = type.GetConstructor(new Type[] { typeof(bool) }); + _ilg.Emit(OpCodes.Newobj, ci); + _ilg.Emit(OpCodes.Stloc, locLeft); + _ilg.Emit(OpCodes.Br, labExit); + + // return null + _ilg.MarkLabel(labReturnNull); + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.Emit(OpCodes.Initobj, type); + + _ilg.MarkLabel(labExit); + _ilg.Emit(OpCodes.Ldloc, locLeft); + + //RELEASING locLeft + FreeLocal(locLeft); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.ControlFlow.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.ControlFlow.cs new file mode 100644 index 00000000000..2b9de7c56ac --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.ControlFlow.cs @@ -0,0 +1,263 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + // The part of the LambdaCompiler dealing with low level control flow + // break, contiue, return, exceptions, etc + partial class LambdaCompiler { + + private LabelInfo EnsureLabel(LabelTarget node) { + LabelInfo result; + if (!_labelInfo.TryGetValue(node, out result)) { + _labelInfo.Add(node, result = new LabelInfo(_ilg, node, false)); + } + return result; + } + + private LabelInfo ReferenceLabel(LabelTarget node) { + LabelInfo result = EnsureLabel(node); + result.Reference(_labelBlock); + return result; + } + + private LabelInfo DefineLabel(LabelTarget node) { + if (node == null) { + return new LabelInfo(_ilg, null, false); + } + LabelInfo result = EnsureLabel(node); + result.Define(_labelBlock); + return result; + } + + private void PushLabelBlock(LabelScopeKind type) { + _labelBlock = new LabelScopeInfo(_labelBlock, type); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "kind")] + private void PopLabelBlock(LabelScopeKind kind) { + Debug.Assert(_labelBlock != null && _labelBlock.Kind == kind); + _labelBlock = _labelBlock.Parent; + } + + private void EmitLabelExpression(Expression expr, CompilationFlags flags) { + var node = (LabelExpression)expr; + Debug.Assert(node.Target != null); + + // If we're an immediate child of a block, our label will already + // be defined. If not, we need to define our own block so this + // label isn't exposed except to its own child expression. + LabelInfo label = null; + + if (_labelBlock.Kind == LabelScopeKind.Block) { + _labelBlock.TryGetLabelInfo(node.Target, out label); + + // We're in a block but didn't find our label, try switch + if (label == null && _labelBlock.Parent.Kind == LabelScopeKind.Switch) { + _labelBlock.Parent.TryGetLabelInfo(node.Target, out label); + } + + // if we're in a switch or block, we should've found the label + Debug.Assert(label != null); + } + + if (label == null) { + label = DefineLabel(node.Target); + } + + if (node.DefaultValue != null) { + if (node.Target.Type == typeof(void)) { + EmitExpressionAsVoid(node.DefaultValue, flags); + } else { + flags = UpdateEmitExpressionStartFlag(flags, CompilationFlags.EmitExpressionStart); + EmitExpression(node.DefaultValue, flags); + } + } + + label.Mark(); + } + + private void EmitGotoExpression(Expression expr, CompilationFlags flags) { + var node = (GotoExpression)expr; + var labelInfo = ReferenceLabel(node.Target); + + var tailCall = flags & CompilationFlags.EmitAsTailCallMask; + if (tailCall != CompilationFlags.EmitAsNoTail) { + // Since tail call flags are not passed into EmitTryExpression, CanReturn + // means the goto will be emitted as Ret. Therefore we can emit the goto's + // default value with tail call. This can be improved by detecting if the + // target label is equivalent to the return label. + tailCall = labelInfo.CanReturn ? CompilationFlags.EmitAsTail : CompilationFlags.EmitAsNoTail; + flags = UpdateEmitAsTailCallFlag(flags, tailCall); + } + + if (node.Value != null) { + if (node.Target.Type == typeof(void)) { + EmitExpressionAsVoid(node.Value, flags); + } else { + flags = UpdateEmitExpressionStartFlag(flags, CompilationFlags.EmitExpressionStart); + EmitExpression(node.Value, flags); + } + } + + labelInfo.EmitJump(); + + EmitUnreachable(node, flags); + } + + // We need to push default(T), unless we're emitting ourselves as + // void. Even though the code is unreachable, we still have to + // generate correct IL. We can get rid of this once we have better + // reachability analysis. + private void EmitUnreachable(Expression node, CompilationFlags flags) { + if (node.Type != typeof(void) && (flags & CompilationFlags.EmitAsVoidType) == 0) { + _ilg.EmitDefault(node.Type); + } + } + + private bool TryPushLabelBlock(Expression node) { + // Anything that is "statement-like" -- e.g. has no associated + // stack state can be jumped into, with the exception of try-blocks + // We indicate this by a "Block" + // + // Otherwise, we push an "Expression" to indicate that it can't be + // jumped into + switch (node.NodeType) { + default: + if (_labelBlock.Kind != LabelScopeKind.Expression) { + PushLabelBlock(LabelScopeKind.Expression); + return true; + } + return false; + case ExpressionType.Label: + // LabelExpression is a bit special, if it's directly in a + // block it becomes associate with the block's scope. Same + // thing if it's in a switch case body. + if (_labelBlock.Kind == LabelScopeKind.Block) { + var label = ((LabelExpression)node).Target; + if (_labelBlock.ContainsTarget(label)) { + return false; + } + if (_labelBlock.Parent.Kind == LabelScopeKind.Switch && + _labelBlock.Parent.ContainsTarget(label)) { + return false; + } + } + PushLabelBlock(LabelScopeKind.Statement); + return true; + case ExpressionType.Block: + if (node is SpilledExpressionBlock) { + // treat it as an expression + goto default; + } + + PushLabelBlock(LabelScopeKind.Block); + // Labels defined immediately in the block are valid for + // the whole block. + if (_labelBlock.Parent.Kind != LabelScopeKind.Switch) { + DefineBlockLabels(node); + } + return true; + case ExpressionType.Switch: + PushLabelBlock(LabelScopeKind.Switch); + // Define labels inside of the switch cases so theyare in + // scope for the whole switch. This allows "goto case" and + // "goto default" to be considered as local jumps. + var @switch = (SwitchExpression)node; + foreach (SwitchCase c in @switch.Cases) { + DefineBlockLabels(c.Body); + } + DefineBlockLabels(@switch.DefaultBody); + return true; + + // Remove this when Convert(Void) goes away. + case ExpressionType.Convert: + if (node.Type != typeof(void)) { + // treat it as an expression + goto default; + } + PushLabelBlock(LabelScopeKind.Statement); + return true; + + case ExpressionType.Conditional: + case ExpressionType.Loop: + case ExpressionType.Goto: + PushLabelBlock(LabelScopeKind.Statement); + return true; + } + } + + private void DefineBlockLabels(Expression node) { + var block = node as BlockExpression; + if (block == null || block is SpilledExpressionBlock) { + return; + } + for (int i = 0, n = block.ExpressionCount; i < n; i++) { + Expression e = block.GetExpression(i); + + var label = e as LabelExpression; + if (label != null) { + DefineLabel(label.Target); + } + } + } + + // See if this lambda has a return label + // If so, we'll create it now and mark it as allowing the "ret" opcode + // This allows us to generate better IL + private void AddReturnLabel(LambdaExpression lambda) { + var expression = lambda.Body; + + while (true) { + switch (expression.NodeType) { + default: + // Didn't find return label + return; + case ExpressionType.Label: + // Found the label. We can directly return from this place + // only if the label type is reference assignable to the lambda return type. + var label = ((LabelExpression)expression).Target; + _labelInfo.Add(label, new LabelInfo(_ilg, label, TypeUtils.AreReferenceAssignable(lambda.ReturnType, label.Type))); + return; + case ExpressionType.Block: + // Look in the last significant expression of a block + var body = (BlockExpression)expression; + // omit empty and debuginfo at the end of the block since they + // are not going to emit any IL + for (int i = body.ExpressionCount - 1; i >= 0; i--) { + expression = body.GetExpression(i); + if (Significant(expression)) { + break; + } + } + continue; + } + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Expressions.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Expressions.cs new file mode 100644 index 00000000000..35224319a84 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Expressions.cs @@ -0,0 +1,1094 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + partial class LambdaCompiler { + [Flags] + internal enum CompilationFlags { + EmitExpressionStart = 0x0001, + EmitNoExpressionStart = 0x0002, + EmitAsDefaultType = 0x0010, + EmitAsVoidType = 0x0020, + EmitAsTail = 0x0100, // at the tail position of a lambda, tail call can be safely emitted + EmitAsMiddle = 0x0200, // in the middle of a lambda, tail call can be emitted if it is in a return + EmitAsNoTail = 0x0400, // neither at the tail or in a return, or tail call is not turned on, no tail call is emitted + + EmitExpressionStartMask = 0x000f, + EmitAsTypeMask = 0x00f0, + EmitAsTailCallMask = 0x0f00 + } + + /// + /// Update the flag with a new EmitAsTailCall flag + /// + private static CompilationFlags UpdateEmitAsTailCallFlag(CompilationFlags flags, CompilationFlags newValue) { + Debug.Assert(newValue == CompilationFlags.EmitAsTail || newValue == CompilationFlags.EmitAsMiddle || newValue == CompilationFlags.EmitAsNoTail); + var oldValue = flags & CompilationFlags.EmitAsTailCallMask; + return flags ^ oldValue | newValue; + } + + /// + /// Update the flag with a new EmitExpressionStart flag + /// + private static CompilationFlags UpdateEmitExpressionStartFlag(CompilationFlags flags, CompilationFlags newValue) { + Debug.Assert(newValue == CompilationFlags.EmitExpressionStart || newValue == CompilationFlags.EmitNoExpressionStart); + var oldValue = flags & CompilationFlags.EmitExpressionStartMask; + return flags ^ oldValue | newValue; + } + + /// + /// Update the flag with a new EmitAsType flag + /// + private static CompilationFlags UpdateEmitAsTypeFlag(CompilationFlags flags, CompilationFlags newValue) { + Debug.Assert(newValue == CompilationFlags.EmitAsDefaultType || newValue == CompilationFlags.EmitAsVoidType); + var oldValue = flags & CompilationFlags.EmitAsTypeMask; + return flags ^ oldValue | newValue; + } + + /// + /// Generates code for this expression in a value position. + /// This method will leave the value of the expression + /// on the top of the stack typed as Type. + /// + internal void EmitExpression(Expression node) { + EmitExpression(node, CompilationFlags.EmitAsNoTail | CompilationFlags.EmitExpressionStart); + } + + /// + /// Emits an expression and discards the result. For some nodes this emits + /// more optimial code then EmitExpression/Pop + /// + private void EmitExpressionAsVoid(Expression node) { + EmitExpressionAsVoid(node, CompilationFlags.EmitAsNoTail); + } + + private void EmitExpressionAsVoid(Expression node, CompilationFlags flags) { + Debug.Assert(node != null); + + CompilationFlags startEmitted = EmitExpressionStart(node); + + switch (node.NodeType) { + case ExpressionType.Assign: + EmitAssign((BinaryExpression)node, CompilationFlags.EmitAsVoidType); + break; + case ExpressionType.Block: + Emit((BlockExpression)node, UpdateEmitAsTypeFlag(flags, CompilationFlags.EmitAsVoidType)); + break; + case ExpressionType.Throw: + EmitThrow((UnaryExpression)node, CompilationFlags.EmitAsVoidType); + break; + case ExpressionType.Goto: + EmitGotoExpression(node, UpdateEmitAsTypeFlag(flags, CompilationFlags.EmitAsVoidType)); + break; + case ExpressionType.Constant: + case ExpressionType.Default: + case ExpressionType.Parameter: + // no-op + break; + default: + if (node.Type == typeof(void)) { + EmitExpression(node, UpdateEmitExpressionStartFlag(flags, CompilationFlags.EmitNoExpressionStart)); + } else { + EmitExpression(node, CompilationFlags.EmitAsNoTail | CompilationFlags.EmitNoExpressionStart); + _ilg.Emit(OpCodes.Pop); + } + break; + } + EmitExpressionEnd(startEmitted); + } + + private void EmitExpressionAsType(Expression node, Type type, CompilationFlags flags) { + + if (type == typeof(void)) { + EmitExpressionAsVoid(node, flags); + } else { + // if the node is emitted as a different type, CastClass IL is emitted at the end, + // should not emit with tail calls. + if (!TypeUtils.AreEquivalent(node.Type, type)) { + EmitExpression(node); + Debug.Assert(TypeUtils.AreReferenceAssignable(type, node.Type)); + _ilg.Emit(OpCodes.Castclass, type); + } else { + // emit the with the flags and emit emit expression start + EmitExpression(node, UpdateEmitExpressionStartFlag(flags, CompilationFlags.EmitExpressionStart)); + } + } + } + + #region label block tracking + + private CompilationFlags EmitExpressionStart(Expression node) { + if (TryPushLabelBlock(node)) { + return CompilationFlags.EmitExpressionStart; + } + return CompilationFlags.EmitNoExpressionStart; + } + + private void EmitExpressionEnd(CompilationFlags flags) { + if ((flags & CompilationFlags.EmitExpressionStartMask) == CompilationFlags.EmitExpressionStart) { + PopLabelBlock(_labelBlock.Kind); + } + } + + #endregion + + #region InvocationExpression + + private void EmitInvocationExpression(Expression expr, CompilationFlags flags) { + InvocationExpression node = (InvocationExpression)expr; + + // Optimization: inline code for literal lambda's directly + // + // This is worth it because otherwise we end up with a extra call + // to DynamicMethod.CreateDelegate, which is expensive. + // + if (node.LambdaOperand != null) { + EmitInlinedInvoke(node, flags); + return; + } + + expr = node.Expression; + if (typeof(LambdaExpression).IsAssignableFrom(expr.Type)) { + // if the invoke target is a lambda expression tree, first compile it into a delegate + expr = Expression.Call(expr, expr.Type.GetMethod("Compile", new Type[0])); + } + expr = Expression.Call(expr, expr.Type.GetMethod("Invoke"), node.Arguments); + + EmitExpression(expr); + } + + private void EmitInlinedInvoke(InvocationExpression invoke, CompilationFlags flags) { + var lambda = invoke.LambdaOperand; + + // This is tricky: we need to emit the arguments outside of the + // scope, but set them inside the scope. Fortunately, using the IL + // stack it is entirely doable. + + // 1. Emit invoke arguments + List wb = EmitArguments(lambda.Type.GetMethod("Invoke"), invoke); + + // 2. Create the nested LambdaCompiler + var inner = new LambdaCompiler(this, lambda); + + // 3. Emit the body + // if the inlined lambda is the last expression of the whole lambda, + // tail call can be applied. + if (wb.Count != 0) { + flags = UpdateEmitAsTailCallFlag(flags, CompilationFlags.EmitAsNoTail); + } + inner.EmitLambdaBody(_scope, true, flags); + + // 4. Emit writebacks if needed + EmitWriteBack(wb); + } + + #endregion + + #region IndexExpression + + private void EmitIndexExpression(Expression expr) { + var node = (IndexExpression)expr; + + // Emit instance, if calling an instance method + Type objectType = null; + if (node.Object != null) { + EmitInstance(node.Object, objectType = node.Object.Type); + } + + // Emit indexes. We don't allow byref args, so no need to worry + // about writebacks or EmitAddress + foreach (var arg in node.Arguments) { + EmitExpression(arg); + } + + EmitGetIndexCall(node, objectType); + } + + private void EmitIndexAssignment(BinaryExpression node, CompilationFlags flags) { + var index = (IndexExpression)node.Left; + + var emitAs = flags & CompilationFlags.EmitAsTypeMask; + + // Emit instance, if calling an instance method + Type objectType = null; + if (index.Object != null) { + EmitInstance(index.Object, objectType = index.Object.Type); + } + + // Emit indexes. We don't allow byref args, so no need to worry + // about writebacks or EmitAddress + foreach (var arg in index.Arguments) { + EmitExpression(arg); + } + + // Emit value + EmitExpression(node.Right); + + // Save the expression value, if needed + LocalBuilder temp = null; + if (emitAs != CompilationFlags.EmitAsVoidType) { + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Stloc, temp = GetLocal(node.Type)); + } + + EmitSetIndexCall(index, objectType); + + // Restore the value + if (emitAs != CompilationFlags.EmitAsVoidType) { + _ilg.Emit(OpCodes.Ldloc, temp); + FreeLocal(temp); + } + } + + private void EmitGetIndexCall(IndexExpression node, Type objectType) { + if (node.Indexer != null) { + // For indexed properties, just call the getter + var method = node.Indexer.GetGetMethod(true); + EmitCall(objectType, method); + } else if (node.Arguments.Count != 1) { + // Multidimensional arrays, call get + _ilg.Emit(OpCodes.Call, node.Object.Type.GetMethod("Get", BindingFlags.Public | BindingFlags.Instance)); + } else { + // For one dimensional arrays, emit load + _ilg.EmitLoadElement(node.Type); + } + } + + private void EmitSetIndexCall(IndexExpression node, Type objectType) { + if (node.Indexer != null) { + // For indexed properties, just call the setter + var method = node.Indexer.GetSetMethod(true); + EmitCall(objectType, method); + } else if (node.Arguments.Count != 1) { + // Multidimensional arrays, call set + _ilg.Emit(OpCodes.Call, node.Object.Type.GetMethod("Set", BindingFlags.Public | BindingFlags.Instance)); + } else { + // For one dimensional arrays, emit store + _ilg.EmitStoreElement(node.Type); + } + } + + #endregion + + #region MethodCallExpression + + private void EmitMethodCallExpression(Expression expr, CompilationFlags flags) { + MethodCallExpression node = (MethodCallExpression)expr; + + EmitMethodCall(node.Object, node.Method, node, flags); + } + + private void EmitMethodCallExpression(Expression expr) { + EmitMethodCallExpression(expr, CompilationFlags.EmitAsNoTail); + } + + private void EmitMethodCall(Expression obj, MethodInfo method, IArgumentProvider methodCallExpr) { + EmitMethodCall(obj, method, methodCallExpr, CompilationFlags.EmitAsNoTail); + } + + private void EmitMethodCall(Expression obj, MethodInfo method, IArgumentProvider methodCallExpr, CompilationFlags flags) { + // Emit instance, if calling an instance method + Type objectType = null; + if (!method.IsStatic) { + EmitInstance(obj, objectType = obj.Type); + } + // if the obj has a value type, its address is passed to the method call so we cannot destroy the + // stack by emitting a tail call + if (obj != null && obj.Type.IsValueType) { + EmitMethodCall(method, methodCallExpr, objectType); + } else { + EmitMethodCall(method, methodCallExpr, objectType, flags); + } + } + + // assumes 'object' of non-static call is already on stack + private void EmitMethodCall(MethodInfo mi, IArgumentProvider args, Type objectType) { + EmitMethodCall(mi, args, objectType, CompilationFlags.EmitAsNoTail); + } + + // assumes 'object' of non-static call is already on stack + private void EmitMethodCall(MethodInfo mi, IArgumentProvider args, Type objectType, CompilationFlags flags) { + + // Emit arguments + List wb = EmitArguments(mi, args); + + // Emit the actual call + OpCode callOp = UseVirtual(mi) ? OpCodes.Callvirt : OpCodes.Call; + if (callOp == OpCodes.Callvirt && objectType.IsValueType) { + // This automatically boxes value types if necessary. + _ilg.Emit(OpCodes.Constrained, objectType); + } + // The method call can be a tail call if + // 1) the method call is the last instruction before Ret + // 2) the method does not have any ByRef parameters, refer to ECMA-335 Partition III Section 2.4. + // "Verification requires that no managed pointers are passed to the method being called, since + // it does not track pointers into the current frame." + if ((flags & CompilationFlags.EmitAsTailCallMask) == CompilationFlags.EmitAsTail && !MethodHasByRefParameter(mi)) { + _ilg.Emit(OpCodes.Tailcall); + } + if (mi.CallingConvention == CallingConventions.VarArgs) { + _ilg.EmitCall(callOp, mi, args.Map(a => a.Type)); + } else { + _ilg.Emit(callOp, mi); + } + + // Emit writebacks for properties passed as "ref" arguments + EmitWriteBack(wb); + } + + private static bool MethodHasByRefParameter(MethodInfo mi) { + foreach (var pi in mi.GetParametersCached()) { + if (pi.IsByRefParameter()) { + return true; + } + } + return false; + } + + private void EmitCall(Type objectType, MethodInfo method) { + if (method.CallingConvention == CallingConventions.VarArgs) { + throw Error.UnexpectedVarArgsCall(method); + } + + OpCode callOp = UseVirtual(method) ? OpCodes.Callvirt : OpCodes.Call; + if (callOp == OpCodes.Callvirt && objectType.IsValueType) { + _ilg.Emit(OpCodes.Constrained, objectType); + } + _ilg.Emit(callOp, method); + } + + private static bool UseVirtual(MethodInfo mi) { + // There are two factors: is the method static, virtual or non-virtual instance? + // And is the object ref or value? + // The cases are: + // + // static, ref: call + // static, value: call + // virtual, ref: callvirt + // virtual, value: call -- eg, double.ToString must be a non-virtual call to be verifiable. + // instance, ref: callvirt -- this looks wrong, but is verifiable and gives us a free null check. + // instance, value: call + // + // We never need to generate a nonvirtual call to a virtual method on a reference type because + // expression trees do not support "base.Foo()" style calling. + // + // We could do an optimization here for the case where we know that the object is a non-null + // reference type and the method is a non-virtual instance method. For example, if we had + // (new Foo()).Bar() for instance method Bar we don't need the null check so we could do a + // call rather than a callvirt. However that seems like it would not be a very big win for + // most dynamically generated code scenarios, so let's not do that for now. + + if (mi.IsStatic) { + return false; + } + if (mi.DeclaringType.IsValueType) { + return false; + } + return true; + } + + /// + /// Emits arguments to a call, and returns an array of writebacks that + /// should happen after the call. + /// + private List EmitArguments(MethodBase method, IArgumentProvider args) { + return EmitArguments(method, args, 0); + } + + /// + /// Emits arguments to a call, and returns an array of writebacks that + /// should happen after the call. For emitting dynamic expressions, we + /// need to skip the first parameter of the method (the call site). + /// + private List EmitArguments(MethodBase method, IArgumentProvider args, int skipParameters) { + ParameterInfo[] pis = method.GetParametersCached(); + Debug.Assert(args.ArgumentCount + skipParameters == pis.Length); + + var writeBacks = new List(); + for (int i = skipParameters, n = pis.Length; i < n; i++) { + ParameterInfo parameter = pis[i]; + Expression argument = args.GetArgument(i - skipParameters); + Type type = parameter.ParameterType; + + if (type.IsByRef) { + type = type.GetElementType(); + + WriteBack wb = EmitAddressWriteBack(argument, type); + if (wb != null) { + writeBacks.Add(wb); + } + } else { + EmitExpression(argument); + } + } + return writeBacks; + } + + private static void EmitWriteBack(IList writeBacks) { + foreach (WriteBack wb in writeBacks) { + wb(); + } + } + + #endregion + + private void EmitConstantExpression(Expression expr) { + ConstantExpression node = (ConstantExpression)expr; + + EmitConstant(node.Value, node.Type); + } + + private void EmitConstant(object value, Type type) { + // Try to emit the constant directly into IL + if (ILGen.CanEmitConstant(value, type)) { + _ilg.EmitConstant(value, type); + return; + } + + _boundConstants.EmitConstant(this, value, type); + } + + private void EmitDynamicExpression(Expression expr) { + if (!(_method is DynamicMethod)) { + throw Error.CannotCompileDynamic(); + } + + var node = (DynamicExpression)expr; + + var site = CallSite.Create(node.DelegateType, node.Binder); + Type siteType = site.GetType(); + + var invoke = node.DelegateType.GetMethod("Invoke"); + + // site.Target.Invoke(site, args) + EmitConstant(site, siteType); + + // Emit the temp as type CallSite so we get more reuse + _ilg.Emit(OpCodes.Dup); +#if MICROSOFT_SCRIPTING_CORE + // For 3.5, emit the temp as CallSite to work around a Jit32 + // verifier issue (fixed in 3.5 sp1) + var siteTemp = GetLocal(siteType); +#else + var siteTemp = GetLocal(typeof(CallSite)); +#endif + _ilg.Emit(OpCodes.Stloc, siteTemp); + _ilg.Emit(OpCodes.Ldfld, siteType.GetField("Target")); + _ilg.Emit(OpCodes.Ldloc, siteTemp); + FreeLocal(siteTemp); + + List wb = EmitArguments(invoke, node, 1); + _ilg.Emit(OpCodes.Callvirt, invoke); + EmitWriteBack(wb); + } + + private void EmitNewExpression(Expression expr) { + NewExpression node = (NewExpression)expr; + + if (node.Constructor != null) { + List wb = EmitArguments(node.Constructor, node); + _ilg.Emit(OpCodes.Newobj, node.Constructor); + EmitWriteBack(wb); + } else { + Debug.Assert(node.Arguments.Count == 0, "Node with arguments must have a constructor."); + Debug.Assert(node.Type.IsValueType, "Only value type may have constructor not set."); + LocalBuilder temp = GetLocal(node.Type); + _ilg.Emit(OpCodes.Ldloca, temp); + _ilg.Emit(OpCodes.Initobj, node.Type); + _ilg.Emit(OpCodes.Ldloc, temp); + FreeLocal(temp); + } + } + + private void EmitTypeBinaryExpression(Expression expr) { + TypeBinaryExpression node = (TypeBinaryExpression)expr; + + if (node.NodeType == ExpressionType.TypeEqual) { + EmitExpression(node.ReduceTypeEqual()); + return; + } + + Type type = node.Expression.Type; + + // Try to determine the result statically + AnalyzeTypeIsResult result = ConstantCheck.AnalyzeTypeIs(node); + + if (result == AnalyzeTypeIsResult.KnownTrue || + result == AnalyzeTypeIsResult.KnownFalse) { + // Result is known statically, so just emit the expression for + // its side effects and return the result + EmitExpressionAsVoid(node.Expression); + _ilg.EmitBoolean(result == AnalyzeTypeIsResult.KnownTrue); + return; + } + + if (result == AnalyzeTypeIsResult.KnownAssignable) { + // We know the type can be assigned, but still need to check + // for null at runtime + if (type.IsNullableType()) { + EmitAddress(node.Expression, type); + _ilg.EmitHasValue(type); + return; + } + + Debug.Assert(!type.IsValueType); + EmitExpression(node.Expression); + _ilg.Emit(OpCodes.Ldnull); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + return; + } + + Debug.Assert(result == AnalyzeTypeIsResult.Unknown); + + // Emit a full runtime "isinst" check + EmitExpression(node.Expression); + if (type.IsValueType) { + _ilg.Emit(OpCodes.Box, type); + } + _ilg.Emit(OpCodes.Isinst, node.TypeOperand); + _ilg.Emit(OpCodes.Ldnull); + _ilg.Emit(OpCodes.Cgt_Un); + } + + private void EmitVariableAssignment(BinaryExpression node, CompilationFlags flags) { + var variable = (ParameterExpression)node.Left; + var emitAs = flags & CompilationFlags.EmitAsTypeMask; + + EmitExpression(node.Right); + if (emitAs != CompilationFlags.EmitAsVoidType) { + _ilg.Emit(OpCodes.Dup); + } + + if (variable.IsByRef) { + // Note: the stloc/ldloc pattern is a bit suboptimal, but it + // saves us from having to spill stack when assigning to a + // byref parameter. We already make this same tradeoff for + // hoisted variables, see ElementStorage.EmitStore + + LocalBuilder value = GetLocal(variable.Type); + _ilg.Emit(OpCodes.Stloc, value); + _scope.EmitGet(variable); + _ilg.Emit(OpCodes.Ldloc, value); + FreeLocal(value); + _ilg.EmitStoreValueIndirect(variable.Type); + } else { + _scope.EmitSet(variable); + } + } + + private void EmitAssignBinaryExpression(Expression expr) { + EmitAssign((BinaryExpression)expr, CompilationFlags.EmitAsDefaultType); + } + + private void EmitAssign(BinaryExpression node, CompilationFlags emitAs) { + switch (node.Left.NodeType) { + case ExpressionType.Index: + EmitIndexAssignment(node, emitAs); + return; + case ExpressionType.MemberAccess: + EmitMemberAssignment(node, emitAs); + return; + case ExpressionType.Parameter: + EmitVariableAssignment(node, emitAs); + return; + default: + throw Error.InvalidLvalue(node.Left.NodeType); + } + } + + private void EmitParameterExpression(Expression expr) { + ParameterExpression node = (ParameterExpression)expr; + _scope.EmitGet(node); + if (node.IsByRef) { + _ilg.EmitLoadValueIndirect(node.Type); + } + } + + private void EmitLambdaExpression(Expression expr) { + LambdaExpression node = (LambdaExpression)expr; + EmitDelegateConstruction(node); + } + + private void EmitRuntimeVariablesExpression(Expression expr) { + RuntimeVariablesExpression node = (RuntimeVariablesExpression)expr; + _scope.EmitVariableAccess(this, node.Variables); + } + + private void EmitMemberAssignment(BinaryExpression node, CompilationFlags flags) { + MemberExpression lvalue = (MemberExpression)node.Left; + MemberInfo member = lvalue.Member; + + // emit "this", if any + Type objectType = null; + if (lvalue.Expression != null) { + EmitInstance(lvalue.Expression, objectType = lvalue.Expression.Type); + } + + // emit value + EmitExpression(node.Right); + + LocalBuilder temp = null; + var emitAs = flags & CompilationFlags.EmitAsTypeMask; + if (emitAs != CompilationFlags.EmitAsVoidType) { + // save the value so we can return it + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Stloc, temp = GetLocal(node.Type)); + } + + switch (member.MemberType) { + case MemberTypes.Field: + _ilg.EmitFieldSet((FieldInfo)member); + break; + case MemberTypes.Property: + EmitCall(objectType, ((PropertyInfo)member).GetSetMethod(true)); + break; + default: + throw Error.InvalidMemberType(member.MemberType); + } + + if (emitAs != CompilationFlags.EmitAsVoidType) { + _ilg.Emit(OpCodes.Ldloc, temp); + FreeLocal(temp); + } + } + + private void EmitMemberExpression(Expression expr) { + MemberExpression node = (MemberExpression)expr; + + // emit "this", if any + Type instanceType = null; + if (node.Expression != null) { + EmitInstance(node.Expression, instanceType = node.Expression.Type); + } + + EmitMemberGet(node.Member, instanceType); + } + + // assumes instance is already on the stack + private void EmitMemberGet(MemberInfo member, Type objectType) { + switch (member.MemberType) { + case MemberTypes.Field: + FieldInfo fi = (FieldInfo)member; + if (fi.IsLiteral) { + EmitConstant(fi.GetRawConstantValue(), fi.FieldType); + } else { + _ilg.EmitFieldGet(fi); + } + break; + case MemberTypes.Property: + EmitCall(objectType, ((PropertyInfo)member).GetGetMethod(true)); + break; + default: + throw ContractUtils.Unreachable; + } + } + + private void EmitInstance(Expression instance, Type type) { + if (instance != null) { + if (type.IsValueType) { + EmitAddress(instance, type); + } else { + EmitExpression(instance); + } + } + } + + private void EmitNewArrayExpression(Expression expr) { + NewArrayExpression node = (NewArrayExpression)expr; + + if (node.NodeType == ExpressionType.NewArrayInit) { + _ilg.EmitArray( + node.Type.GetElementType(), + node.Expressions.Count, + delegate(int index) { + EmitExpression(node.Expressions[index]); + } + ); + } else { + ReadOnlyCollection bounds = node.Expressions; + for (int i = 0; i < bounds.Count; i++) { + Expression x = bounds[i]; + EmitExpression(x); + _ilg.EmitConvertToType(x.Type, typeof(int), true); + } + _ilg.EmitArray(node.Type); + } + } + + private void EmitDebugInfoExpression(Expression expr) { + if (!EmitDebugSymbols) { + return; + } + var node = (DebugInfoExpression)expr; + + if (node.IsClear && _sequencePointCleared) { + // Emitting another clearance after one clearance does not + // have any effect, so we can save it. + return; + } + + _tree.DebugInfoGenerator.MarkSequencePoint(_lambda, _method, _ilg, node); + _ilg.Emit(OpCodes.Nop); + _sequencePointCleared = node.IsClear; + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "expr")] + private static void EmitExtensionExpression(Expression expr) { + throw Error.ExtensionNotReduced(); + } + + #region ListInit, MemberInit + + private void EmitListInitExpression(Expression expr) { + EmitListInit((ListInitExpression)expr); + } + + private void EmitMemberInitExpression(Expression expr) { + EmitMemberInit((MemberInitExpression)expr); + } + + private void EmitBinding(MemberBinding binding, Type objectType) { + switch (binding.BindingType) { + case MemberBindingType.Assignment: + EmitMemberAssignment((MemberAssignment)binding, objectType); + break; + case MemberBindingType.ListBinding: + EmitMemberListBinding((MemberListBinding)binding); + break; + case MemberBindingType.MemberBinding: + EmitMemberMemberBinding((MemberMemberBinding)binding); + break; + default: + throw Error.UnknownBindingType(); + } + } + + private void EmitMemberAssignment(MemberAssignment binding, Type objectType) { + EmitExpression(binding.Expression); + FieldInfo fi = binding.Member as FieldInfo; + if (fi != null) { + _ilg.Emit(OpCodes.Stfld, fi); + } else { + PropertyInfo pi = binding.Member as PropertyInfo; + if (pi != null) { + EmitCall(objectType, pi.GetSetMethod(true)); + } else { + throw Error.UnhandledBinding(); + } + } + } + + private void EmitMemberMemberBinding(MemberMemberBinding binding) { + Type type = GetMemberType(binding.Member); + if (binding.Member is PropertyInfo && type.IsValueType) { + throw Error.CannotAutoInitializeValueTypeMemberThroughProperty(binding.Member); + } + if (type.IsValueType) { + EmitMemberAddress(binding.Member, binding.Member.DeclaringType); + } else { + EmitMemberGet(binding.Member, binding.Member.DeclaringType); + } + EmitMemberInit(binding.Bindings, false, type); + } + + private void EmitMemberListBinding(MemberListBinding binding) { + Type type = GetMemberType(binding.Member); + if (binding.Member is PropertyInfo && type.IsValueType) { + throw Error.CannotAutoInitializeValueTypeElementThroughProperty(binding.Member); + } + if (type.IsValueType) { + EmitMemberAddress(binding.Member, binding.Member.DeclaringType); + } else { + EmitMemberGet(binding.Member, binding.Member.DeclaringType); + } + EmitListInit(binding.Initializers, false, type); + } + + private void EmitMemberInit(MemberInitExpression init) { + EmitExpression(init.NewExpression); + LocalBuilder loc = null; + if (init.NewExpression.Type.IsValueType && init.Bindings.Count > 0) { + loc = _ilg.DeclareLocal(init.NewExpression.Type); + _ilg.Emit(OpCodes.Stloc, loc); + _ilg.Emit(OpCodes.Ldloca, loc); + } + EmitMemberInit(init.Bindings, loc == null, init.NewExpression.Type); + if (loc != null) { + _ilg.Emit(OpCodes.Ldloc, loc); + } + } + + // This method assumes that the instance is on the stack and is expected, based on "keepOnStack" flag + // to either leave the instance on the stack, or pop it. + private void EmitMemberInit(ReadOnlyCollection bindings, bool keepOnStack, Type objectType) { + int n = bindings.Count; + if (n == 0) { + // If there are no initializers and instance is not to be kept on the stack, we must pop explicitly. + if (!keepOnStack) { + _ilg.Emit(OpCodes.Pop); + } + } else { + for (int i = 0; i < n; i++) { + if (keepOnStack || i < n - 1) { + _ilg.Emit(OpCodes.Dup); + } + EmitBinding(bindings[i], objectType); + } + } + } + + private void EmitListInit(ListInitExpression init) { + EmitExpression(init.NewExpression); + LocalBuilder loc = null; + if (init.NewExpression.Type.IsValueType) { + loc = _ilg.DeclareLocal(init.NewExpression.Type); + _ilg.Emit(OpCodes.Stloc, loc); + _ilg.Emit(OpCodes.Ldloca, loc); + } + EmitListInit(init.Initializers, loc == null, init.NewExpression.Type); + if (loc != null) { + _ilg.Emit(OpCodes.Ldloc, loc); + } + } + + // This method assumes that the list instance is on the stack and is expected, based on "keepOnStack" flag + // to either leave the list instance on the stack, or pop it. + private void EmitListInit(ReadOnlyCollection initializers, bool keepOnStack, Type objectType) { + int n = initializers.Count; + + if (n == 0) { + // If there are no initializers and instance is not to be kept on the stack, we must pop explicitly. + if (!keepOnStack) { + _ilg.Emit(OpCodes.Pop); + } + } else { + for (int i = 0; i < n; i++) { + if (keepOnStack || i < n - 1) { + _ilg.Emit(OpCodes.Dup); + } + EmitMethodCall(initializers[i].AddMethod, initializers[i], objectType); + + // Aome add methods, ArrayList.Add for example, return non-void + if (initializers[i].AddMethod.ReturnType != typeof(void)) { + _ilg.Emit(OpCodes.Pop); + } + } + } + } + + private static Type GetMemberType(MemberInfo member) { + FieldInfo fi = member as FieldInfo; + if (fi != null) return fi.FieldType; + PropertyInfo pi = member as PropertyInfo; + if (pi != null) return pi.PropertyType; + throw Error.MemberNotFieldOrProperty(member); + } + + #endregion + + #region Expression helpers + + internal static void ValidateLift(IList variables, IList arguments) { + System.Diagnostics.Debug.Assert(variables != null); + System.Diagnostics.Debug.Assert(arguments != null); + + if (variables.Count != arguments.Count) { + throw Error.IncorrectNumberOfIndexes(); + } + for (int i = 0, n = variables.Count; i < n; i++) { + if (!TypeUtils.AreReferenceAssignable(variables[i].Type, TypeUtils.GetNonNullableType(arguments[i].Type))) { + throw Error.ArgumentTypesMustMatch(); + } + } + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private void EmitLift(ExpressionType nodeType, Type resultType, MethodCallExpression mc, ParameterExpression[] paramList, Expression[] argList) { + Debug.Assert(TypeUtils.AreEquivalent(TypeUtils.GetNonNullableType(resultType), TypeUtils.GetNonNullableType(mc.Type))); + + switch (nodeType) { + default: + case ExpressionType.LessThan: + case ExpressionType.LessThanOrEqual: + case ExpressionType.GreaterThan: + case ExpressionType.GreaterThanOrEqual: { + Label exit = _ilg.DefineLabel(); + Label exitNull = _ilg.DefineLabel(); + LocalBuilder anyNull = _ilg.DeclareLocal(typeof(bool)); + for (int i = 0, n = paramList.Length; i < n; i++) { + ParameterExpression v = paramList[i]; + Expression arg = argList[i]; + if (TypeUtils.IsNullableType(arg.Type)) { + _scope.AddLocal(this, v); + EmitAddress(arg, arg.Type); + _ilg.Emit(OpCodes.Dup); + _ilg.EmitHasValue(arg.Type); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Stloc, anyNull); + _ilg.EmitGetValueOrDefault(arg.Type); + _scope.EmitSet(v); + } else { + _scope.AddLocal(this, v); + EmitExpression(arg); + if (!arg.Type.IsValueType) { + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Ldnull); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Stloc, anyNull); + } + _scope.EmitSet(v); + } + _ilg.Emit(OpCodes.Ldloc, anyNull); + _ilg.Emit(OpCodes.Brtrue, exitNull); + } + EmitMethodCallExpression(mc); + if (TypeUtils.IsNullableType(resultType) && !TypeUtils.AreEquivalent(resultType, mc.Type)) { + ConstructorInfo ci = resultType.GetConstructor(new Type[] { mc.Type }); + _ilg.Emit(OpCodes.Newobj, ci); + } + _ilg.Emit(OpCodes.Br_S, exit); + _ilg.MarkLabel(exitNull); + if (TypeUtils.AreEquivalent(resultType, TypeUtils.GetNullableType(mc.Type))) { + if (resultType.IsValueType) { + LocalBuilder result = GetLocal(resultType); + _ilg.Emit(OpCodes.Ldloca, result); + _ilg.Emit(OpCodes.Initobj, resultType); + _ilg.Emit(OpCodes.Ldloc, result); + FreeLocal(result); + } else { + _ilg.Emit(OpCodes.Ldnull); + } + } else { + switch (nodeType) { + case ExpressionType.LessThan: + case ExpressionType.LessThanOrEqual: + case ExpressionType.GreaterThan: + case ExpressionType.GreaterThanOrEqual: + _ilg.Emit(OpCodes.Ldc_I4_0); + break; + default: + throw Error.UnknownLiftType(nodeType); + } + } + _ilg.MarkLabel(exit); + return; + } + case ExpressionType.Equal: + case ExpressionType.NotEqual: { + if (TypeUtils.AreEquivalent(resultType, TypeUtils.GetNullableType(mc.Type))) { + goto default; + } + Label exit = _ilg.DefineLabel(); + Label exitAllNull = _ilg.DefineLabel(); + Label exitAnyNull = _ilg.DefineLabel(); + + LocalBuilder anyNull = _ilg.DeclareLocal(typeof(bool)); + LocalBuilder allNull = _ilg.DeclareLocal(typeof(bool)); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Stloc, anyNull); + _ilg.Emit(OpCodes.Ldc_I4_1); + _ilg.Emit(OpCodes.Stloc, allNull); + + for (int i = 0, n = paramList.Length; i < n; i++) { + ParameterExpression v = paramList[i]; + Expression arg = argList[i]; + _scope.AddLocal(this, v); + if (TypeUtils.IsNullableType(arg.Type)) { + EmitAddress(arg, arg.Type); + _ilg.Emit(OpCodes.Dup); + _ilg.EmitHasValue(arg.Type); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Ldloc, anyNull); + _ilg.Emit(OpCodes.Or); + _ilg.Emit(OpCodes.Stloc, anyNull); + _ilg.Emit(OpCodes.Ldloc, allNull); + _ilg.Emit(OpCodes.And); + _ilg.Emit(OpCodes.Stloc, allNull); + _ilg.EmitGetValueOrDefault(arg.Type); + } else { + EmitExpression(arg); + if (!arg.Type.IsValueType) { + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Ldnull); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Ldloc, anyNull); + _ilg.Emit(OpCodes.Or); + _ilg.Emit(OpCodes.Stloc, anyNull); + _ilg.Emit(OpCodes.Ldloc, allNull); + _ilg.Emit(OpCodes.And); + _ilg.Emit(OpCodes.Stloc, allNull); + } else { + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Stloc, allNull); + } + } + _scope.EmitSet(v); + } + _ilg.Emit(OpCodes.Ldloc, allNull); + _ilg.Emit(OpCodes.Brtrue, exitAllNull); + _ilg.Emit(OpCodes.Ldloc, anyNull); + _ilg.Emit(OpCodes.Brtrue, exitAnyNull); + + EmitMethodCallExpression(mc); + if (TypeUtils.IsNullableType(resultType) && !TypeUtils.AreEquivalent(resultType, mc.Type)) { + ConstructorInfo ci = resultType.GetConstructor(new Type[] { mc.Type }); + _ilg.Emit(OpCodes.Newobj, ci); + } + _ilg.Emit(OpCodes.Br_S, exit); + + _ilg.MarkLabel(exitAllNull); + _ilg.EmitBoolean(nodeType == ExpressionType.Equal); + _ilg.Emit(OpCodes.Br_S, exit); + + _ilg.MarkLabel(exitAnyNull); + _ilg.EmitBoolean(nodeType == ExpressionType.NotEqual); + + _ilg.MarkLabel(exit); + return; + } + } + } + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Generated.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Generated.cs new file mode 100644 index 00000000000..5599650b650 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Generated.cs @@ -0,0 +1,288 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + partial class LambdaCompiler { + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1505:AvoidUnmaintainableCode"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private void EmitExpression(Expression node, CompilationFlags flags) { + Debug.Assert(node != null); + + bool emitStart = (flags & CompilationFlags.EmitExpressionStartMask) == CompilationFlags.EmitExpressionStart; + + CompilationFlags startEmitted = emitStart ? EmitExpressionStart(node) : CompilationFlags.EmitNoExpressionStart; + // only pass tail call flags to emit the expression + flags = flags & CompilationFlags.EmitAsTailCallMask; + + switch (node.NodeType) { + #region Generated Expression Compiler + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_compiler from: generate_tree.py + + case ExpressionType.Add: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.AddChecked: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.And: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.AndAlso: + EmitAndAlsoBinaryExpression(node, flags); + break; + case ExpressionType.ArrayLength: + EmitUnaryExpression(node, flags); + break; + case ExpressionType.ArrayIndex: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.Call: + EmitMethodCallExpression(node, flags); + break; + case ExpressionType.Coalesce: + EmitCoalesceBinaryExpression(node); + break; + case ExpressionType.Conditional: + EmitConditionalExpression(node, flags); + break; + case ExpressionType.Constant: + EmitConstantExpression(node); + break; + case ExpressionType.Convert: + EmitConvertUnaryExpression(node, flags); + break; + case ExpressionType.ConvertChecked: + EmitConvertUnaryExpression(node, flags); + break; + case ExpressionType.Divide: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.Equal: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.ExclusiveOr: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.GreaterThan: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.GreaterThanOrEqual: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.Invoke: + EmitInvocationExpression(node, flags); + break; + case ExpressionType.Lambda: + EmitLambdaExpression(node); + break; + case ExpressionType.LeftShift: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.LessThan: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.LessThanOrEqual: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.ListInit: + EmitListInitExpression(node); + break; + case ExpressionType.MemberAccess: + EmitMemberExpression(node); + break; + case ExpressionType.MemberInit: + EmitMemberInitExpression(node); + break; + case ExpressionType.Modulo: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.Multiply: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.MultiplyChecked: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.Negate: + EmitUnaryExpression(node, flags); + break; + case ExpressionType.UnaryPlus: + EmitUnaryExpression(node, flags); + break; + case ExpressionType.NegateChecked: + EmitUnaryExpression(node, flags); + break; + case ExpressionType.New: + EmitNewExpression(node); + break; + case ExpressionType.NewArrayInit: + EmitNewArrayExpression(node); + break; + case ExpressionType.NewArrayBounds: + EmitNewArrayExpression(node); + break; + case ExpressionType.Not: + EmitUnaryExpression(node, flags); + break; + case ExpressionType.NotEqual: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.Or: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.OrElse: + EmitOrElseBinaryExpression(node, flags); + break; + case ExpressionType.Parameter: + EmitParameterExpression(node); + break; + case ExpressionType.Power: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.Quote: + EmitQuoteUnaryExpression(node); + break; + case ExpressionType.RightShift: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.Subtract: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.SubtractChecked: + EmitBinaryExpression(node, flags); + break; + case ExpressionType.TypeAs: + EmitUnaryExpression(node, flags); + break; + case ExpressionType.TypeIs: + EmitTypeBinaryExpression(node); + break; + case ExpressionType.Assign: + EmitAssignBinaryExpression(node); + break; + case ExpressionType.Block: + EmitBlockExpression(node, flags); + break; + case ExpressionType.DebugInfo: + EmitDebugInfoExpression(node); + break; + case ExpressionType.Decrement: + EmitUnaryExpression(node, flags); + break; + case ExpressionType.Dynamic: + EmitDynamicExpression(node); + break; + case ExpressionType.Default: + EmitDefaultExpression(node); + break; + case ExpressionType.Extension: + EmitExtensionExpression(node); + break; + case ExpressionType.Goto: + EmitGotoExpression(node, flags); + break; + case ExpressionType.Increment: + EmitUnaryExpression(node, flags); + break; + case ExpressionType.Index: + EmitIndexExpression(node); + break; + case ExpressionType.Label: + EmitLabelExpression(node, flags); + break; + case ExpressionType.RuntimeVariables: + EmitRuntimeVariablesExpression(node); + break; + case ExpressionType.Loop: + EmitLoopExpression(node); + break; + case ExpressionType.Switch: + EmitSwitchExpression(node, flags); + break; + case ExpressionType.Throw: + EmitThrowUnaryExpression(node); + break; + case ExpressionType.Try: + EmitTryExpression(node); + break; + case ExpressionType.Unbox: + EmitUnboxUnaryExpression(node); + break; + case ExpressionType.TypeEqual: + EmitTypeBinaryExpression(node); + break; + case ExpressionType.OnesComplement: + EmitUnaryExpression(node, flags); + break; + case ExpressionType.IsTrue: + EmitUnaryExpression(node, flags); + break; + case ExpressionType.IsFalse: + EmitUnaryExpression(node, flags); + break; + + // *** END GENERATED CODE *** + + #endregion + + default: + throw ContractUtils.Unreachable; + } + + if (emitStart) { + EmitExpressionEnd(startEmitted); + } + } + + private static bool IsChecked(ExpressionType op) { + switch (op) { + #region Generated Checked Operations + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_checked_ops from: generate_tree.py + + case ExpressionType.AddChecked: + case ExpressionType.ConvertChecked: + case ExpressionType.MultiplyChecked: + case ExpressionType.NegateChecked: + case ExpressionType.SubtractChecked: + case ExpressionType.AddAssignChecked: + case ExpressionType.MultiplyAssignChecked: + case ExpressionType.SubtractAssignChecked: + + // *** END GENERATED CODE *** + + #endregion + return true; + } + return false; + } + + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Lambda.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Lambda.cs new file mode 100644 index 00000000000..f789af9dabd --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Lambda.cs @@ -0,0 +1,202 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Threading; + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + /// + /// Dynamic Language Runtime Compiler. + /// This part compiles lambdas. + /// + partial class LambdaCompiler { + private static int _Counter; + + internal void EmitConstantArray(T[] array) { + // Emit as runtime constant if possible + // if not, emit into IL + if (_method is DynamicMethod) { + EmitConstant(array, typeof(T[])); + } else if(_typeBuilder != null) { + // store into field in our type builder, we will initialize + // the value only once. + FieldBuilder fb = CreateStaticField("ConstantArray", typeof(T[])); + Label l = _ilg.DefineLabel(); + _ilg.Emit(OpCodes.Ldsfld, fb); + _ilg.Emit(OpCodes.Ldnull); + _ilg.Emit(OpCodes.Bne_Un, l); + _ilg.EmitArray(array); + _ilg.Emit(OpCodes.Stsfld, fb); + _ilg.MarkLabel(l); + _ilg.Emit(OpCodes.Ldsfld, fb); + } else { + _ilg.EmitArray(array); + } + } + + private void EmitClosureCreation(LambdaCompiler inner) { + bool closure = inner._scope.NeedsClosure; + bool boundConstants = inner._boundConstants.Count > 0; + + if (!closure && !boundConstants) { + _ilg.EmitNull(); + return; + } + + // new Closure(constantPool, currentHoistedLocals) + if (boundConstants) { + _boundConstants.EmitConstant(this, inner._boundConstants.ToArray(), typeof(object[])); + } else { + _ilg.EmitNull(); + } + if (closure) { + _scope.EmitGet(_scope.NearestHoistedLocals.SelfVariable); + } else { + _ilg.EmitNull(); + } + _ilg.EmitNew(typeof(Closure).GetConstructor(new Type[] { typeof(object[]), typeof(object[]) })); + } + + /// + /// Emits code which creates new instance of the delegateType delegate. + /// + /// Since the delegate is getting closed over the "Closure" argument, this + /// cannot be used with virtual/instance methods (inner must be static method) + /// + private void EmitDelegateConstruction(LambdaCompiler inner) { + Type delegateType = inner._lambda.Type; + DynamicMethod dynamicMethod = inner._method as DynamicMethod; + if (dynamicMethod != null) { + // dynamicMethod.CreateDelegate(delegateType, closure) + _boundConstants.EmitConstant(this, dynamicMethod, typeof(DynamicMethod)); + _ilg.EmitType(delegateType); + EmitClosureCreation(inner); + _ilg.Emit(OpCodes.Callvirt, typeof(DynamicMethod).GetMethod("CreateDelegate", new Type[] { typeof(Type), typeof(object) })); + _ilg.Emit(OpCodes.Castclass, delegateType); + } else { + // new DelegateType(closure) + EmitClosureCreation(inner); + _ilg.Emit(OpCodes.Ldftn, (MethodInfo)inner._method); + _ilg.Emit(OpCodes.Newobj, (ConstructorInfo)(delegateType.GetMember(".ctor")[0])); + } + } + + /// + /// Emits a delegate to the method generated for the LambdaExpression. + /// May end up creating a wrapper to match the requested delegate type. + /// + /// Lambda for which to generate a delegate + /// + private void EmitDelegateConstruction(LambdaExpression lambda) { + // 1. Create the new compiler + LambdaCompiler impl; + if (_method is DynamicMethod) { + impl = new LambdaCompiler(_tree, lambda); + } else { + // When the lambda does not have a name or the name is empty, generate a unique name for it. + string name = String.IsNullOrEmpty(lambda.Name) ? GetUniqueMethodName() : lambda.Name; + MethodBuilder mb = _typeBuilder.DefineMethod(name, MethodAttributes.Private | MethodAttributes.Static); + impl = new LambdaCompiler(_tree, lambda, mb); + } + + // 2. emit the lambda + // Since additional ILs are always emitted after the lambda's body, should not emit with tail call optimization. + impl.EmitLambdaBody(_scope, false, CompilationFlags.EmitAsNoTail); + + // 3. emit the delegate creation in the outer lambda + EmitDelegateConstruction(impl); + } + + private static Type[] GetParameterTypes(LambdaExpression lambda) { + return lambda.Parameters.Map(p => p.IsByRef ? p.Type.MakeByRefType() : p.Type); + } + + private static string GetUniqueMethodName() { + return "{" + Interlocked.Increment(ref _Counter) + "}lambda_method"; + } + + private void EmitLambdaBody() { + // The lambda body is the "last" expression of the lambda + CompilationFlags tailCallFlag = _lambda.TailCall ? CompilationFlags.EmitAsTail : CompilationFlags.EmitAsNoTail; + EmitLambdaBody(null, false, tailCallFlag); + } + + /// + /// Emits the lambda body. If inlined, the parameters should already be + /// pushed onto the IL stack. + /// + /// The parent scope. + /// true if the lambda is inlined; false otherwise. + /// + /// The emum to specify if the lambda is compiled with the tail call optimization. + /// + private void EmitLambdaBody(CompilerScope parent, bool inlined, CompilationFlags flags) { + _scope.Enter(this, parent); + + if (inlined) { + // The arguments were already pushed onto the IL stack. + // Store them into locals, popping in reverse order. + // + // If any arguments were ByRef, the address is on the stack and + // we'll be storing it into the variable, which has a ref type. + for (int i = _lambda.Parameters.Count - 1; i >= 0; i--) { + _scope.EmitSet(_lambda.Parameters[i]); + } + } + + // Need to emit the expression start for the lambda body + flags = UpdateEmitExpressionStartFlag(flags, CompilationFlags.EmitExpressionStart); + if (_lambda.ReturnType == typeof(void)) { + EmitExpressionAsVoid(_lambda.Body, flags); + } else { + EmitExpression(_lambda.Body, flags); + } + + // Return must be the last instruction in a CLI method. + // But if we're inlining the lambda, we want to leave the return + // value on the IL stack. + if (!inlined) { + _ilg.Emit(OpCodes.Ret); + } + + _scope.Exit(); + + // Validate labels + Debug.Assert(_labelBlock.Parent == null && _labelBlock.Kind == LabelScopeKind.Lambda); + foreach (LabelInfo label in _labelInfo.Values) { + label.ValidateFinish(); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Logical.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Logical.cs new file mode 100644 index 00000000000..2dd68e61706 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Logical.cs @@ -0,0 +1,651 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Reflection.Emit; + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + partial class LambdaCompiler { + + #region Conditional + + private void EmitConditionalExpression(Expression expr, CompilationFlags flags) { + ConditionalExpression node = (ConditionalExpression)expr; + Debug.Assert(node.Test.Type == typeof(bool)); + Label labFalse = _ilg.DefineLabel(); + EmitExpressionAndBranch(false, node.Test, labFalse); + EmitExpressionAsType(node.IfTrue, node.Type, flags); + + if (NotEmpty(node.IfFalse)) { + Label labEnd = _ilg.DefineLabel(); + if ((flags & CompilationFlags.EmitAsTailCallMask) == CompilationFlags.EmitAsTail) { + // We know the conditional expression is at the end of the lambda, + // so it is safe to emit Ret here. + _ilg.Emit(OpCodes.Ret); + } else { + _ilg.Emit(OpCodes.Br, labEnd); + } + _ilg.MarkLabel(labFalse); + EmitExpressionAsType(node.IfFalse, node.Type, flags); + _ilg.MarkLabel(labEnd); + } else { + _ilg.MarkLabel(labFalse); + } + } + + /// + /// returns true if the expression is not empty, otherwise false. + /// + private static bool NotEmpty(Expression node) { + var empty = node as DefaultExpression; + if (empty == null || empty.Type != typeof(void)) { + return true; + } + + return false; + } + + /// + /// returns true if the expression is NOT empty and is not debug info, + /// or a block that contains only insignificant expressions. + /// + private static bool Significant(Expression node) { + var block = node as BlockExpression; + if (block != null) { + for (int i = 0; i < block.ExpressionCount; i++) { + if (Significant(block.GetExpression(i))) { + return true; + } + } + return false; + } + return NotEmpty(node) && !(node is DebugInfoExpression); + } + + #endregion + + #region Coalesce + + + private void EmitCoalesceBinaryExpression(Expression expr) { + BinaryExpression b = (BinaryExpression)expr; + Debug.Assert(b.Method == null); + + if (TypeUtils.IsNullableType(b.Left.Type)) { + EmitNullableCoalesce(b); + } else if (b.Left.Type.IsValueType) { + throw Error.CoalesceUsedOnNonNullType(); + } else if (b.Conversion != null) { + EmitLambdaReferenceCoalesce(b); + } else { + EmitReferenceCoalesceWithoutConversion(b); + } + } + + + private void EmitNullableCoalesce(BinaryExpression b) { + Debug.Assert(b.Method == null); + + LocalBuilder loc = GetLocal(b.Left.Type); + Label labIfNull = _ilg.DefineLabel(); + Label labEnd = _ilg.DefineLabel(); + EmitExpression(b.Left); + _ilg.Emit(OpCodes.Stloc, loc); + _ilg.Emit(OpCodes.Ldloca, loc); + _ilg.EmitHasValue(b.Left.Type); + _ilg.Emit(OpCodes.Brfalse, labIfNull); + + Type nnLeftType = TypeUtils.GetNonNullableType(b.Left.Type); + if (b.Conversion != null) { + Debug.Assert(b.Conversion.Parameters.Count == 1); + ParameterExpression p = b.Conversion.Parameters[0]; + Debug.Assert(p.Type.IsAssignableFrom(b.Left.Type) || + p.Type.IsAssignableFrom(nnLeftType)); + + // emit the delegate instance + EmitLambdaExpression(b.Conversion); + + // emit argument + if (!p.Type.IsAssignableFrom(b.Left.Type)) { + _ilg.Emit(OpCodes.Ldloca, loc); + _ilg.EmitGetValueOrDefault(b.Left.Type); + } else { + _ilg.Emit(OpCodes.Ldloc, loc); + } + + // emit call to invoke + _ilg.Emit(OpCodes.Callvirt, b.Conversion.Type.GetMethod("Invoke")); + } else if (!TypeUtils.AreEquivalent(b.Type, nnLeftType)) { + _ilg.Emit(OpCodes.Ldloca, loc); + _ilg.EmitGetValueOrDefault(b.Left.Type); + _ilg.EmitConvertToType(nnLeftType, b.Type, true); + } else { + _ilg.Emit(OpCodes.Ldloca, loc); + _ilg.EmitGetValueOrDefault(b.Left.Type); + } + FreeLocal(loc); + + _ilg.Emit(OpCodes.Br, labEnd); + _ilg.MarkLabel(labIfNull); + EmitExpression(b.Right); + if (!TypeUtils.AreEquivalent(b.Right.Type, b.Type)) { + _ilg.EmitConvertToType(b.Right.Type, b.Type, true); + } + _ilg.MarkLabel(labEnd); + } + + + private void EmitLambdaReferenceCoalesce(BinaryExpression b) { + LocalBuilder loc = GetLocal(b.Left.Type); + Label labEnd = _ilg.DefineLabel(); + Label labNotNull = _ilg.DefineLabel(); + EmitExpression(b.Left); + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Stloc, loc); + _ilg.Emit(OpCodes.Ldnull); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Brfalse, labNotNull); + EmitExpression(b.Right); + _ilg.Emit(OpCodes.Br, labEnd); + + // if not null, call conversion + _ilg.MarkLabel(labNotNull); + Debug.Assert(b.Conversion.Parameters.Count == 1); + ParameterExpression p = b.Conversion.Parameters[0]; + + // emit the delegate instance + EmitLambdaExpression(b.Conversion); + + // emit argument + _ilg.Emit(OpCodes.Ldloc, loc); + FreeLocal(loc); + + // emit call to invoke + _ilg.Emit(OpCodes.Callvirt, b.Conversion.Type.GetMethod("Invoke")); + + _ilg.MarkLabel(labEnd); + } + + + private void EmitReferenceCoalesceWithoutConversion(BinaryExpression b) { + Label labEnd = _ilg.DefineLabel(); + Label labCast = _ilg.DefineLabel(); + EmitExpression(b.Left); + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Ldnull); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Brfalse, labCast); + _ilg.Emit(OpCodes.Pop); + EmitExpression(b.Right); + if (!TypeUtils.AreEquivalent(b.Right.Type, b.Type)) { + if (b.Right.Type.IsValueType) { + _ilg.Emit(OpCodes.Box, b.Right.Type); + } + _ilg.Emit(OpCodes.Castclass, b.Type); + } + _ilg.Emit(OpCodes.Br_S, labEnd); + _ilg.MarkLabel(labCast); + if (!TypeUtils.AreEquivalent(b.Left.Type, b.Type)) { + Debug.Assert(!b.Left.Type.IsValueType); + _ilg.Emit(OpCodes.Castclass, b.Type); + } + _ilg.MarkLabel(labEnd); + } + + #endregion + + #region AndAlso + + private void EmitLiftedAndAlso(BinaryExpression b) { + Type type = typeof(bool?); + Label labComputeRight = _ilg.DefineLabel(); + Label labReturnFalse = _ilg.DefineLabel(); + Label labReturnNull = _ilg.DefineLabel(); + Label labReturnValue = _ilg.DefineLabel(); + Label labExit = _ilg.DefineLabel(); + LocalBuilder locLeft = GetLocal(type); + LocalBuilder locRight = GetLocal(type); + EmitExpression(b.Left); + _ilg.Emit(OpCodes.Stloc, locLeft); + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse, labComputeRight); + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitGetValueOrDefault(type); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Brtrue, labReturnFalse); + // compute right + _ilg.MarkLabel(labComputeRight); + EmitExpression(b.Right); + _ilg.Emit(OpCodes.Stloc, locRight); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse_S, labReturnNull); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitGetValueOrDefault(type); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Brtrue_S, labReturnFalse); + // check left for null again + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse, labReturnNull); + // return true + _ilg.Emit(OpCodes.Ldc_I4_1); + _ilg.Emit(OpCodes.Br_S, labReturnValue); + // return false + _ilg.MarkLabel(labReturnFalse); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Br_S, labReturnValue); + _ilg.MarkLabel(labReturnValue); + ConstructorInfo ci = type.GetConstructor(new Type[] { typeof(bool) }); + _ilg.Emit(OpCodes.Newobj, ci); + _ilg.Emit(OpCodes.Stloc, locLeft); + _ilg.Emit(OpCodes.Br, labExit); + // return null + _ilg.MarkLabel(labReturnNull); + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.Emit(OpCodes.Initobj, type); + _ilg.MarkLabel(labExit); + _ilg.Emit(OpCodes.Ldloc, locLeft); + FreeLocal(locLeft); + FreeLocal(locRight); + } + + private void EmitMethodAndAlso(BinaryExpression b, CompilationFlags flags) { + Label labEnd = _ilg.DefineLabel(); + EmitExpression(b.Left); + _ilg.Emit(OpCodes.Dup); + MethodInfo opFalse = TypeUtils.GetBooleanOperator(b.Method.DeclaringType, "op_False"); + Debug.Assert(opFalse != null, "factory should check that the method exists"); + _ilg.Emit(OpCodes.Call, opFalse); + _ilg.Emit(OpCodes.Brtrue, labEnd); + + //store the value of the left value before emitting b.Right to empty the evaluation stack + LocalBuilder locLeft = GetLocal(b.Left.Type); + _ilg.Emit(OpCodes.Stloc, locLeft); + + EmitExpression(b.Right); + //store the right value to local + LocalBuilder locRight = GetLocal(b.Right.Type); + _ilg.Emit(OpCodes.Stloc, locRight); + + Debug.Assert(b.Method.IsStatic); + _ilg.Emit(OpCodes.Ldloc, locLeft); + _ilg.Emit(OpCodes.Ldloc, locRight); + if ((flags & CompilationFlags.EmitAsTailCallMask) == CompilationFlags.EmitAsTail) { + _ilg.Emit(OpCodes.Tailcall); + } + _ilg.Emit(OpCodes.Call, b.Method); + FreeLocal(locLeft); + FreeLocal(locRight); + _ilg.MarkLabel(labEnd); + } + + private void EmitUnliftedAndAlso(BinaryExpression b) { + Label @else = _ilg.DefineLabel(); + Label end = _ilg.DefineLabel(); + EmitExpressionAndBranch(false, b.Left, @else); + EmitExpression(b.Right); + _ilg.Emit(OpCodes.Br, end); + _ilg.MarkLabel(@else); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.MarkLabel(end); + } + + private void EmitAndAlsoBinaryExpression(Expression expr, CompilationFlags flags) { + BinaryExpression b = (BinaryExpression)expr; + + if (b.Method != null && !b.IsLiftedLogical) { + EmitMethodAndAlso(b, flags); + } else if (b.Left.Type == typeof(bool?)) { + EmitLiftedAndAlso(b); + } else if (b.IsLiftedLogical) { + EmitExpression(b.ReduceUserdefinedLifted()); + } else { + EmitUnliftedAndAlso(b); + } + } + + #endregion + + #region OrElse + + private void EmitLiftedOrElse(BinaryExpression b) { + Type type = typeof(bool?); + Label labComputeRight = _ilg.DefineLabel(); + Label labReturnTrue = _ilg.DefineLabel(); + Label labReturnNull = _ilg.DefineLabel(); + Label labReturnValue = _ilg.DefineLabel(); + Label labExit = _ilg.DefineLabel(); + LocalBuilder locLeft = GetLocal(type); + LocalBuilder locRight = GetLocal(type); + EmitExpression(b.Left); + _ilg.Emit(OpCodes.Stloc, locLeft); + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse, labComputeRight); + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitGetValueOrDefault(type); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Brfalse, labReturnTrue); + // compute right + _ilg.MarkLabel(labComputeRight); + EmitExpression(b.Right); + _ilg.Emit(OpCodes.Stloc, locRight); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse_S, labReturnNull); + _ilg.Emit(OpCodes.Ldloca, locRight); + _ilg.EmitGetValueOrDefault(type); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Brfalse_S, labReturnTrue); + // check left for null again + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.EmitHasValue(type); + _ilg.Emit(OpCodes.Brfalse, labReturnNull); + // return false + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Br_S, labReturnValue); + // return true + _ilg.MarkLabel(labReturnTrue); + _ilg.Emit(OpCodes.Ldc_I4_1); + _ilg.Emit(OpCodes.Br_S, labReturnValue); + _ilg.MarkLabel(labReturnValue); + ConstructorInfo ci = type.GetConstructor(new Type[] { typeof(bool) }); + _ilg.Emit(OpCodes.Newobj, ci); + _ilg.Emit(OpCodes.Stloc, locLeft); + _ilg.Emit(OpCodes.Br, labExit); + // return null + _ilg.MarkLabel(labReturnNull); + _ilg.Emit(OpCodes.Ldloca, locLeft); + _ilg.Emit(OpCodes.Initobj, type); + _ilg.MarkLabel(labExit); + _ilg.Emit(OpCodes.Ldloc, locLeft); + FreeLocal(locLeft); + FreeLocal(locRight); + } + + private void EmitUnliftedOrElse(BinaryExpression b) { + Label @else = _ilg.DefineLabel(); + Label end = _ilg.DefineLabel(); + EmitExpressionAndBranch(false, b.Left, @else); + _ilg.Emit(OpCodes.Ldc_I4_1); + _ilg.Emit(OpCodes.Br, end); + _ilg.MarkLabel(@else); + EmitExpression(b.Right); + _ilg.MarkLabel(end); + } + + private void EmitMethodOrElse(BinaryExpression b, CompilationFlags flags) { + Label labEnd = _ilg.DefineLabel(); + EmitExpression(b.Left); + _ilg.Emit(OpCodes.Dup); + MethodInfo opTrue = TypeUtils.GetBooleanOperator(b.Method.DeclaringType, "op_True"); + Debug.Assert(opTrue != null, "factory should check that the method exists"); + _ilg.Emit(OpCodes.Call, opTrue); + _ilg.Emit(OpCodes.Brtrue, labEnd); + + //store the value of the left value before emitting b.Right to empty the evaluation stack + LocalBuilder locLeft = GetLocal(b.Left.Type); + _ilg.Emit(OpCodes.Stloc, locLeft); + + EmitExpression(b.Right); + //store the right value to local + LocalBuilder locRight = GetLocal(b.Right.Type); + _ilg.Emit(OpCodes.Stloc, locRight); + + Debug.Assert(b.Method.IsStatic); + _ilg.Emit(OpCodes.Ldloc, locLeft); + _ilg.Emit(OpCodes.Ldloc, locRight); + if ((flags & CompilationFlags.EmitAsTailCallMask) == CompilationFlags.EmitAsTail) { + _ilg.Emit(OpCodes.Tailcall); + } + _ilg.Emit(OpCodes.Call, b.Method); + FreeLocal(locLeft); + FreeLocal(locRight); + _ilg.MarkLabel(labEnd); + } + + private void EmitOrElseBinaryExpression(Expression expr, CompilationFlags flags) { + BinaryExpression b = (BinaryExpression)expr; + + if (b.Method != null && !b.IsLiftedLogical) { + EmitMethodOrElse(b, flags); + } else if (b.Left.Type == typeof(bool?)) { + EmitLiftedOrElse(b); + } else if (b.IsLiftedLogical) { + EmitExpression(b.ReduceUserdefinedLifted()); + } else { + EmitUnliftedOrElse(b); + } + } + + #endregion + + #region Optimized branching + + /// + /// Emits the expression and then either brtrue/brfalse to the label. + /// + /// True for brtrue, false for brfalse. + /// The expression to emit. + /// The label to conditionally branch to. + /// + /// This function optimizes equality and short circuiting logical + /// operators to avoid double-branching, minimize instruction count, + /// and generate similar IL to the C# compiler. This is important for + /// the JIT to optimize patterns like: + /// x != null AndAlso x.GetType() == typeof(SomeType) + /// + /// One optimization we don't do: we always emits at least one + /// conditional branch to the label, and always possibly falls through, + /// even if we know if the branch will always succeed or always fail. + /// We do this to avoid generating unreachable code, which is fine for + /// the CLR JIT, but doesn't verify with peverify. + /// + /// This kind of optimization could be implemented safely, by doing + /// constant folding over conditionals and logical expressions at the + /// tree level. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + private void EmitExpressionAndBranch(bool branchValue, Expression node, Label label) { + CompilationFlags startEmitted = EmitExpressionStart(node); + try { + if (node.Type == typeof(bool)) { + switch (node.NodeType) { + case ExpressionType.Not: + EmitBranchNot(branchValue, (UnaryExpression)node, label); + return; + case ExpressionType.AndAlso: + case ExpressionType.OrElse: + EmitBranchLogical(branchValue, (BinaryExpression)node, label); + return; + case ExpressionType.Block: + EmitBranchBlock(branchValue, (BlockExpression)node, label); + return; + case ExpressionType.Equal: + case ExpressionType.NotEqual: + EmitBranchComparison(branchValue, (BinaryExpression)node, label); + return; + } + } + EmitExpression(node, CompilationFlags.EmitAsNoTail | CompilationFlags.EmitNoExpressionStart); + EmitBranchOp(branchValue, label); + } finally { + EmitExpressionEnd(startEmitted); + } + } + + private void EmitBranchOp(bool branch, Label label) { + _ilg.Emit(branch ? OpCodes.Brtrue : OpCodes.Brfalse, label); + } + + private void EmitBranchNot(bool branch, UnaryExpression node, Label label) { + if (node.Method != null) { + EmitExpression(node, CompilationFlags.EmitAsNoTail | CompilationFlags.EmitNoExpressionStart); + EmitBranchOp(branch, label); + return; + } + EmitExpressionAndBranch(!branch, node.Operand, label); + } + + private void EmitBranchComparison(bool branch, BinaryExpression node, Label label) { + Debug.Assert(node.NodeType == ExpressionType.Equal || node.NodeType == ExpressionType.NotEqual); + Debug.Assert(!node.IsLiftedToNull); + + // To share code paths, we want to treat NotEqual as an inverted Equal + bool branchWhenEqual = branch == (node.NodeType == ExpressionType.Equal); + + if (node.Method != null) { + EmitBinaryMethod(node, CompilationFlags.EmitAsNoTail); + // EmitBinaryMethod takes into account the Equal/NotEqual + // node kind, so use the original branch value + EmitBranchOp(branch, label); + } else if (ConstantCheck.IsNull(node.Left)) { + if (TypeUtils.IsNullableType(node.Right.Type)) { + EmitAddress(node.Right, node.Right.Type); + _ilg.EmitHasValue(node.Right.Type); + } else { + Debug.Assert(!node.Right.Type.IsValueType); + EmitExpression(GetEqualityOperand(node.Right)); + } + EmitBranchOp(!branchWhenEqual, label); + } else if (ConstantCheck.IsNull(node.Right)) { + if (TypeUtils.IsNullableType(node.Left.Type)) { + EmitAddress(node.Left, node.Left.Type); + _ilg.EmitHasValue(node.Left.Type); + } else { + Debug.Assert(!node.Left.Type.IsValueType); + EmitExpression(GetEqualityOperand(node.Left)); + } + EmitBranchOp(!branchWhenEqual, label); + } else if (TypeUtils.IsNullableType(node.Left.Type) || TypeUtils.IsNullableType(node.Right.Type)) { + EmitBinaryExpression(node); + // EmitBinaryExpression takes into account the Equal/NotEqual + // node kind, so use the original branch value + EmitBranchOp(branch, label); + } else { + EmitExpression(GetEqualityOperand(node.Left)); + EmitExpression(GetEqualityOperand(node.Right)); + if (branchWhenEqual) { + _ilg.Emit(OpCodes.Beq, label); + } else { + _ilg.Emit(OpCodes.Ceq); + _ilg.Emit(OpCodes.Brfalse, label); + } + } + } + + // For optimized Equal/NotEqual, we can eliminate reference + // conversions. IL allows comparing managed pointers regardless of + // type. See ECMA-335 "Binary Comparison or Branch Operations", in + // Partition III, Section 1.5 Table 4. + private static Expression GetEqualityOperand(Expression expression) { + if (expression.NodeType == ExpressionType.Convert) { + var convert = (UnaryExpression)expression; + if (TypeUtils.AreReferenceAssignable(convert.Type, convert.Operand.Type)) { + return convert.Operand; + } + } + return expression; + } + + private void EmitBranchLogical(bool branch, BinaryExpression node, Label label) { + Debug.Assert(node.NodeType == ExpressionType.AndAlso || node.NodeType == ExpressionType.OrElse); + Debug.Assert(!node.IsLiftedToNull); + + if (node.Method != null || node.IsLifted) { + EmitExpression(node); + EmitBranchOp(branch, label); + return; + } + + + bool isAnd = node.NodeType == ExpressionType.AndAlso; + + // To share code, we make the following substitutions: + // if (!(left || right)) branch value + // becomes: + // if (!left && !right) branch value + // and: + // if (!(left && right)) branch value + // becomes: + // if (!left || !right) branch value + // + // The observation is that "brtrue(x && y)" has the same codegen as + // "brfalse(x || y)" except the branches have the opposite sign. + // Same for "brfalse(x && y)" and "brtrue(x || y)". + // + if (branch == isAnd) { + EmitBranchAnd(branch, node, label); + } else { + EmitBranchOr(branch, node, label); + } + } + + // Generates optimized AndAlso with branch == true + // or optimized OrElse with branch == false + private void EmitBranchAnd(bool branch, BinaryExpression node, Label label) { + // if (left) then + // if (right) branch label + // endif + + Label endif = _ilg.DefineLabel(); + EmitExpressionAndBranch(!branch, node.Left, endif); + EmitExpressionAndBranch(branch, node.Right, label); + _ilg.MarkLabel(endif); + } + + // Generates optimized OrElse with branch == true + // or optimized AndAlso with branch == false + private void EmitBranchOr(bool branch, BinaryExpression node, Label label) { + // if (left OR right) branch label + + EmitExpressionAndBranch(branch, node.Left, label); + EmitExpressionAndBranch(branch, node.Right, label); + } + + private void EmitBranchBlock(bool branch, BlockExpression node, Label label) { + EnterScope(node); + + int count = node.ExpressionCount; + for (int i = 0; i < count - 1; i++) { + EmitExpressionAsVoid(node.GetExpression(i)); + } + EmitExpressionAndBranch(branch, node.GetExpression(count - 1), label); + + ExitScope(node); + } + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Statements.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Statements.cs new file mode 100644 index 00000000000..530bda3a03d --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Statements.cs @@ -0,0 +1,824 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Reflection.Emit; +using System.Globalization; + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + partial class LambdaCompiler { + private void EmitBlockExpression(Expression expr, CompilationFlags flags) { + // emit body + Emit((BlockExpression)expr, UpdateEmitAsTypeFlag(flags, CompilationFlags.EmitAsDefaultType)); + } + + private void Emit(BlockExpression node, CompilationFlags flags) { + EnterScope(node); + + CompilationFlags emitAs = flags & CompilationFlags.EmitAsTypeMask; + + int count = node.ExpressionCount; + CompilationFlags tailCall = flags & CompilationFlags.EmitAsTailCallMask; + CompilationFlags middleTailCall = tailCall == CompilationFlags.EmitAsNoTail ? CompilationFlags.EmitAsNoTail : CompilationFlags.EmitAsMiddle; + + for (int index = 0; index < count - 1; index++) { + var e = node.GetExpression(index); + var next = node.GetExpression(index + 1); + + if (EmitDebugSymbols) { + // No need to emit a clearance if the next expression in the block is also a + // DebugInfoExprssion. + var debugInfo = e as DebugInfoExpression; + if (debugInfo != null && debugInfo.IsClear && next is DebugInfoExpression) { + continue; + } + } + // In the middle of the block. + // We may do better here by marking it as Tail if the following expressions are not going to emit any IL. + var tailCallFlag = middleTailCall; + + var g = next as GotoExpression; + if (g != null && (g.Value == null || !Significant(g.Value))) { + var labelInfo = ReferenceLabel(g.Target); + if (labelInfo.CanReturn) { + // Since tail call flags are not passed into EmitTryExpression, CanReturn means the goto will be emitted + // as Ret. Therefore we can emit the current expression with tail call. + tailCallFlag = CompilationFlags.EmitAsTail; + } + } + flags = UpdateEmitAsTailCallFlag(flags, tailCallFlag); + EmitExpressionAsVoid(e, flags); + } + + // if the type of Block it means this is not a Comma + // so we will force the last expression to emit as void. + // We don't need EmitAsType flag anymore, should only pass + // the EmitTailCall field in flags to emitting the last expression. + if (emitAs == CompilationFlags.EmitAsVoidType || node.Type == typeof(void)) { + EmitExpressionAsVoid(node.GetExpression(count - 1), tailCall); + } else { + EmitExpressionAsType(node.GetExpression(count - 1), node.Type, tailCall); + } + + ExitScope(node); + } + + private void EnterScope(object node) { + if (HasVariables(node) && + (_scope.MergedScopes == null || !_scope.MergedScopes.Contains(node))) { + + CompilerScope scope; + if (!_tree.Scopes.TryGetValue(node, out scope)) { + // + // Very often, we want to compile nodes as reductions + // rather than as IL, but usually they need to allocate + // some IL locals. To support this, we allow emitting a + // BlockExpression that was not bound by VariableBinder. + // This works as long as the variables are only used + // locally -- i.e. not closed over. + // + // User-created blocks will never hit this case; only our + // internally reduced nodes will. + // + scope = new CompilerScope(node, false) { NeedsClosure = _scope.NeedsClosure }; + } + + _scope = scope.Enter(this, _scope); + Debug.Assert(_scope.Node == node); + } + } + + private static bool HasVariables(object node) { + var block = node as BlockExpression; + if (block != null) { + return block.Variables.Count > 0; + } + return ((CatchBlock)node).Variable != null; + } + + private void ExitScope(object node) { + if (_scope.Node == node) { + _scope = _scope.Exit(); + } + } + + private void EmitDefaultExpression(Expression expr) { + var node = (DefaultExpression)expr; + if (node.Type != typeof(void)) { + // emit default(T) + _ilg.EmitDefault(node.Type); + } + } + + private void EmitLoopExpression(Expression expr) { + LoopExpression node = (LoopExpression)expr; + + PushLabelBlock(LabelScopeKind.Statement); + LabelInfo breakTarget = DefineLabel(node.BreakLabel); + LabelInfo continueTarget = DefineLabel(node.ContinueLabel); + + continueTarget.MarkWithEmptyStack(); + + EmitExpressionAsVoid(node.Body); + + _ilg.Emit(OpCodes.Br, continueTarget.Label); + + PopLabelBlock(LabelScopeKind.Statement); + + breakTarget.MarkWithEmptyStack(); + } + + #region SwitchExpression + + private void EmitSwitchExpression(Expression expr, CompilationFlags flags) { + SwitchExpression node = (SwitchExpression)expr; + + // Try to emit it as an IL switch. Works for integer types. + if (TryEmitSwitchInstruction(node, flags)) { + return; + } + + // Try to emit as a hashtable lookup. Works for strings. + if (TryEmitHashtableSwitch(node, flags)) { + return; + } + + // + // Fall back to a series of tests. We need to IL gen instead of + // transform the tree to avoid stack overflow on a big switch. + // + + var switchValue = Expression.Parameter(node.SwitchValue.Type, "switchValue"); + var testValue = Expression.Parameter(GetTestValueType(node), "testValue"); + _scope.AddLocal(this, switchValue); + _scope.AddLocal(this, testValue); + + EmitExpression(node.SwitchValue); + _scope.EmitSet(switchValue); + + // Emit tests + var labels = new Label[node.Cases.Count]; + var isGoto = new bool[node.Cases.Count]; + for (int i = 0, n = node.Cases.Count; i < n; i++) { + DefineSwitchCaseLabel(node.Cases[i], out labels[i], out isGoto[i]); + foreach (Expression test in node.Cases[i].TestValues) { + // Pull the test out into a temp so it runs on the same + // stack as the switch. This simplifies spilling. + EmitExpression(test); + _scope.EmitSet(testValue); + Debug.Assert(TypeUtils.AreReferenceAssignable(testValue.Type, test.Type)); + EmitExpressionAndBranch(true, Expression.Equal(switchValue, testValue, false, node.Comparison), labels[i]); + } + } + + // Define labels + Label end = _ilg.DefineLabel(); + Label @default = (node.DefaultBody == null) ? end : _ilg.DefineLabel(); + + // Emit the case and default bodies + EmitSwitchCases(node, labels, isGoto, @default, end, flags); + } + + /// + /// Gets the common test test value type of the SwitchExpression. + /// + private static Type GetTestValueType(SwitchExpression node) { + if (node.Comparison == null) { + // If we have no comparison, all right side types must be the + // same. + return node.Cases[0].TestValues[0].Type; + } + + // Otherwise, get the type from the method. + Type result = node.Comparison.GetParametersCached()[1].ParameterType.GetNonRefType(); + if (node.IsLifted) { + result = TypeUtils.GetNullableType(result); + } + return result; + } + + private sealed class SwitchLabel { + internal readonly decimal Key; + internal readonly Label Label; + + // Boxed version of Key, preseving the original type. + internal readonly object Constant; + + internal SwitchLabel(decimal key, object @constant, Label label) { + Key = key; + Constant = @constant; + Label = label; + } + } + + private sealed class SwitchInfo { + internal readonly SwitchExpression Node; + internal readonly LocalBuilder Value; + internal readonly Label Default; + internal readonly Type Type; + internal readonly bool IsUnsigned; + internal readonly bool Is64BitSwitch; + + internal SwitchInfo(SwitchExpression node, LocalBuilder value, Label @default) { + Node = node; + Value = value; + Default = @default; + Type = Node.SwitchValue.Type; + IsUnsigned = TypeUtils.IsUnsigned(Type); + var code = Type.GetTypeCode(Type); + Is64BitSwitch = code == TypeCode.UInt64 || code == TypeCode.Int64; + } + } + + private static bool FitsInBucket(List buckets, decimal key, int count) { + Debug.Assert(key > buckets[buckets.Count - 1].Key); + decimal jumpTableSlots = key - buckets[0].Key + 1; + if (jumpTableSlots > int.MaxValue) { + return false; + } + // density must be > 50% + return (buckets.Count + count) * 2 > jumpTableSlots; + } + + private static void MergeBuckets(List> buckets) { + while (buckets.Count > 1) { + List first = buckets[buckets.Count - 2]; + List second = buckets[buckets.Count - 1]; + + if (!FitsInBucket(first, second[second.Count - 1].Key, second.Count)) { + return; + } + + // Merge them + first.AddRange(second); + buckets.RemoveAt(buckets.Count - 1); + } + } + + // Add key to a new or existing bucket + private static void AddToBuckets(List> buckets, SwitchLabel key) { + if (buckets.Count > 0) { + List last = buckets[buckets.Count - 1]; + if (FitsInBucket(last, key.Key, 1)) { + last.Add(key); + // we might be able to merge now + MergeBuckets(buckets); + return; + } + } + // else create a new bucket + buckets.Add(new List { key }); + } + + // Determines if the type is an integer we can switch on. + private static bool CanOptimizeSwitchType(Type valueType) { + // enums & char are allowed + switch (Type.GetTypeCode(valueType)) { + case TypeCode.Byte: + case TypeCode.SByte: + case TypeCode.Char: + case TypeCode.Int16: + case TypeCode.Int32: + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + return true; + default: + return false; + } + } + + // Tries to emit switch as a jmp table + private bool TryEmitSwitchInstruction(SwitchExpression node, CompilationFlags flags) { + // If we have a comparison, bail + if (node.Comparison != null) { + return false; + } + + // Make sure the switch value type and the right side type + // are types we can optimize + Type type = node.SwitchValue.Type; + if (!CanOptimizeSwitchType(type) || + !TypeUtils.AreEquivalent(type, node.Cases[0].TestValues[0].Type)) { + return false; + } + + // Make sure all test values are constant, or we can't emit the + // jump table. + if (!node.Cases.All(c => c.TestValues.All(t => t is ConstantExpression))) { + return false; + } + + // + // We can emit the optimized switch, let's do it. + // + + // Build target labels, collect keys. + var labels = new Label[node.Cases.Count]; + var isGoto = new bool[node.Cases.Count]; + + var uniqueKeys = new Set(); + var keys = new List(); + for (int i = 0; i < node.Cases.Count; i++) { + + DefineSwitchCaseLabel(node.Cases[i], out labels[i], out isGoto[i]); + + foreach (ConstantExpression test in node.Cases[i].TestValues) { + // Guarenteed to work thanks to CanOptimizeSwitchType. + // + // Use decimal because it can hold Int64 or UInt64 without + // precision loss or signed/unsigned conversions. + decimal key = ConvertSwitchValue(test.Value); + + // Only add each key once. If it appears twice, it's + // allowed, but can't be reached. + if (!uniqueKeys.Contains(key)) { + keys.Add(new SwitchLabel(key, test.Value, labels[i])); + uniqueKeys.Add(key); + } + } + } + + // Sort the keys, and group them into buckets. + keys.Sort((x, y) => Math.Sign(x.Key - y.Key)); + var buckets = new List>(); + foreach (var key in keys) { + AddToBuckets(buckets, key); + } + + // Emit the switchValue + LocalBuilder value = GetLocal(node.SwitchValue.Type); + EmitExpression(node.SwitchValue); + _ilg.Emit(OpCodes.Stloc, value); + + // Create end label, and default label if needed + Label end = _ilg.DefineLabel(); + Label @default = (node.DefaultBody == null) ? end : _ilg.DefineLabel(); + + // Emit the switch + var info = new SwitchInfo(node, value, @default); + EmitSwitchBuckets(info, buckets, 0, buckets.Count - 1); + + // Emit the case bodies and default + EmitSwitchCases(node, labels, isGoto, @default, end, flags); + + FreeLocal(value); + return true; + } + + private static decimal ConvertSwitchValue(object value) { + if (value is char) { + return (int)(char)value; + } + return Convert.ToDecimal(value, CultureInfo.InvariantCulture); + } + + /// + /// Creates the label for this case. + /// Optimization: if the body is just a goto, and we can branch + /// to it, put the goto target directly in the jump table. + /// + private void DefineSwitchCaseLabel(SwitchCase @case, out Label label, out bool isGoto) { + var jump = @case.Body as GotoExpression; + // if it's a goto with no value + if (jump != null && jump.Value == null) { + // Reference the label from the switch. This will cause us to + // analyze the jump target and determine if it is safe. + LabelInfo jumpInfo = ReferenceLabel(jump.Target); + + // If we have are allowed to emit the "branch" opcode, then we + // can jump directly there from the switch's jump table. + // (Otherwise, we need to emit the goto later as a "leave".) + if (jumpInfo.CanBranch) { + label = jumpInfo.Label; + isGoto = true; + return; + } + } + // otherwise, just define a new label + label = _ilg.DefineLabel(); + isGoto = false; + } + + private void EmitSwitchCases(SwitchExpression node, Label[] labels, bool[] isGoto, Label @default, Label end, CompilationFlags flags) { + // Jump to default (to handle the fallthrough case) + _ilg.Emit(OpCodes.Br, @default); + + // Emit the cases + for (int i = 0, n = node.Cases.Count; i < n; i++) { + // If the body is a goto, we already emitted an optimized + // branch directly to it. No need to emit anything else. + if (isGoto[i]) { + continue; + } + + _ilg.MarkLabel(labels[i]); + EmitExpressionAsType(node.Cases[i].Body, node.Type, flags); + + // Last case doesn't need branch + if (node.DefaultBody != null || i < n - 1) { + if ((flags & CompilationFlags.EmitAsTailCallMask) == CompilationFlags.EmitAsTail) { + //The switch case is at the tail of the lambda so + //it is safe to emit a Ret. + _ilg.Emit(OpCodes.Ret); + } else { + _ilg.Emit(OpCodes.Br, end); + } + } + } + + // Default value + if (node.DefaultBody != null) { + _ilg.MarkLabel(@default); + EmitExpressionAsType(node.DefaultBody, node.Type, flags); + } + + _ilg.MarkLabel(end); + } + + private void EmitSwitchBuckets(SwitchInfo info, List> buckets, int first, int last) { + if (first == last) { + EmitSwitchBucket(info, buckets[first]); + return; + } + + // Split the buckets into two groups, and use an if test to find + // the right bucket. This ensures we'll only need O(lg(B)) tests + // where B is the number of buckets + int mid = (int)(((long)first + last + 1) / 2); + + if (first == mid - 1) { + EmitSwitchBucket(info, buckets[first]); + } else { + // If the first half contains more than one, we need to emit an + // explicit guard + Label secondHalf = _ilg.DefineLabel(); + _ilg.Emit(OpCodes.Ldloc, info.Value); + _ilg.EmitConstant(buckets[mid - 1].Last().Constant); + _ilg.Emit(info.IsUnsigned ? OpCodes.Bgt_Un : OpCodes.Bgt, secondHalf); + EmitSwitchBuckets(info, buckets, first, mid - 1); + _ilg.MarkLabel(secondHalf); + } + + EmitSwitchBuckets(info, buckets, mid, last); + } + + private void EmitSwitchBucket(SwitchInfo info, List bucket) { + // No need for switch if we only have one value + if (bucket.Count == 1) { + _ilg.Emit(OpCodes.Ldloc, info.Value); + _ilg.EmitConstant(bucket[0].Constant); + _ilg.Emit(OpCodes.Beq, bucket[0].Label); + return; + } + + // + // If we're switching off of Int64/UInt64, we need more guards here + // because we'll have to narrow the switch value to an Int32, and + // we can't do that unless the value is in the right range. + // + Label? after = null; + if (info.Is64BitSwitch) { + after = _ilg.DefineLabel(); + _ilg.Emit(OpCodes.Ldloc, info.Value); + _ilg.EmitConstant(bucket.Last().Constant); + _ilg.Emit(info.IsUnsigned ? OpCodes.Bgt_Un : OpCodes.Bgt, after.Value); + _ilg.Emit(OpCodes.Ldloc, info.Value); + _ilg.EmitConstant(bucket[0].Constant); + _ilg.Emit(info.IsUnsigned ? OpCodes.Blt_Un : OpCodes.Blt, after.Value); + } + + _ilg.Emit(OpCodes.Ldloc, info.Value); + + // Normalize key + decimal key = bucket[0].Key; + if (key != 0) { + _ilg.EmitConstant(bucket[0].Constant); + _ilg.Emit(OpCodes.Sub); + } + + if (info.Is64BitSwitch) { + _ilg.Emit(OpCodes.Conv_I4); + } + + // Collect labels + int len = (int)(bucket[bucket.Count - 1].Key - bucket[0].Key + 1); + Label[] jmpLabels = new Label[len]; + + // Initialize all labels to the default + int slot = 0; + foreach (SwitchLabel label in bucket) { + while (key++ != label.Key) { + jmpLabels[slot++] = info.Default; + } + jmpLabels[slot++] = label.Label; + } + + // check we used all keys and filled all slots + Debug.Assert(key == bucket[bucket.Count - 1].Key + 1); + Debug.Assert(slot == jmpLabels.Length); + + // Finally, emit the switch instruction + _ilg.Emit(OpCodes.Switch, jmpLabels); + + if (info.Is64BitSwitch) { + _ilg.MarkLabel(after.Value); + } + } + + private bool TryEmitHashtableSwitch(SwitchExpression node, CompilationFlags flags) { + // If we have a comparison other than string equality, bail + if (node.Comparison != typeof(string).GetMethod("op_Equality", BindingFlags.Public | BindingFlags.Static | BindingFlags.ExactBinding, null, new[] { typeof(string), typeof(string) }, null)) { + return false; + } + + // All test values must be constant. + int tests = 0; + foreach (SwitchCase c in node.Cases) { + foreach (Expression t in c.TestValues) { + if (!(t is ConstantExpression)) { + return false; + } + tests++; + } + } + + // Must have >= 7 labels for it to be worth it. + if (tests < 7) { + return false; + } + + // If we're in a DynamicMethod, we could just build the dictionary + // immediately. But that would cause the two code paths to be more + // different than they really need to be. + var initializers = new List(tests); + var cases = new List(node.Cases.Count); + + int nullCase = -1; + MethodInfo add = typeof(Dictionary).GetMethod("Add", new[] { typeof(string), typeof(int) }); + for (int i = 0, n = node.Cases.Count; i < n; i++) { + foreach (ConstantExpression t in node.Cases[i].TestValues) { + if (t.Value != null) { + initializers.Add(Expression.ElementInit(add, t, Expression.Constant(i))); + } else { + nullCase = i; + } + } + cases.Add(Expression.SwitchCase(node.Cases[i].Body, Expression.Constant(i))); + } + + // Create the field to hold the lazily initialized dictionary + MemberExpression dictField = CreateLazyInitializedField>("dictionarySwitch"); + + // If we happen to initialize it twice (multithreaded case), it's + // not the end of the world. The C# compiler does better here by + // emitting a volatile access to the field. + Expression dictInit = Expression.Condition( + Expression.Equal(dictField, Expression.Constant(null, dictField.Type)), + Expression.Assign( + dictField, + Expression.ListInit( + Expression.New( + typeof(Dictionary).GetConstructor(new[] { typeof(int) }), + Expression.Constant(initializers.Count) + ), + initializers + ) + ), + dictField + ); + + // + // Create a tree like: + // + // switchValue = switchValueExpression; + // if (switchValue == null) { + // switchIndex = nullCase; + // } else { + // if (_dictField == null) { + // _dictField = new Dictionary(count) { { ... }, ... }; + // } + // if (!_dictField.TryGetValue(switchValue, out switchIndex)) { + // switchIndex = -1; + // } + // } + // switch (switchIndex) { + // case 0: ... + // case 1: ... + // ... + // default: + // } + // + var switchValue = Expression.Variable(typeof(string), "switchValue"); + var switchIndex = Expression.Variable(typeof(int), "switchIndex"); + var reduced = Expression.Block( + new[] { switchIndex, switchValue }, + Expression.Assign(switchValue, node.SwitchValue), + Expression.IfThenElse( + Expression.Equal(switchValue, Expression.Constant(null, typeof(string))), + Expression.Assign(switchIndex, Expression.Constant(nullCase)), + Expression.IfThenElse( + Expression.Call(dictInit, "TryGetValue", null, switchValue, switchIndex), + Expression.Empty(), + Expression.Assign(switchIndex, Expression.Constant(-1)) + ) + ), + Expression.Switch(node.Type, switchIndex, node.DefaultBody, null, cases) + ); + + EmitExpression(reduced, flags); + return true; + } + + #endregion + + private void CheckRethrow() { + // Rethrow is only valid inside a catch. + for (LabelScopeInfo j = _labelBlock; j != null; j = j.Parent) { + if (j.Kind == LabelScopeKind.Catch) { + return; + } else if (j.Kind == LabelScopeKind.Finally) { + // Rethrow from inside finally is not verifiable + break; + } + } + throw Error.RethrowRequiresCatch(); + } + + #region TryStatement + + private void CheckTry() { + // Try inside a filter is not verifiable + for (LabelScopeInfo j = _labelBlock; j != null; j = j.Parent) { + if (j.Kind == LabelScopeKind.Filter) { + throw Error.TryNotAllowedInFilter(); + } + } + } + + private void EmitSaveExceptionOrPop(CatchBlock cb) { + if (cb.Variable != null) { + // If the variable is present, store the exception + // in the variable. + _scope.EmitSet(cb.Variable); + } else { + // Otherwise, pop it off the stack. + _ilg.Emit(OpCodes.Pop); + } + } + + private void EmitTryExpression(Expression expr) { + var node = (TryExpression)expr; + + CheckTry(); + + //****************************************************************** + // 1. ENTERING TRY + //****************************************************************** + + PushLabelBlock(LabelScopeKind.Try); + _ilg.BeginExceptionBlock(); + + //****************************************************************** + // 2. Emit the try statement body + //****************************************************************** + + EmitExpression(node.Body); + + Type tryType = expr.Type; + LocalBuilder value = null; + if (tryType != typeof(void)) { + //store the value of the try body + value = GetLocal(tryType); + _ilg.Emit(OpCodes.Stloc, value); + } + //****************************************************************** + // 3. Emit the catch blocks + //****************************************************************** + + foreach (CatchBlock cb in node.Handlers) { + PushLabelBlock(LabelScopeKind.Catch); + + // Begin the strongly typed exception block + if (cb.Filter == null) { + _ilg.BeginCatchBlock(cb.Test); + } else { + _ilg.BeginExceptFilterBlock(); + } + + EnterScope(cb); + + EmitCatchStart(cb); + + // + // Emit the catch block body + // + EmitExpression(cb.Body); + if (tryType != typeof(void)) { + //store the value of the catch block body + _ilg.Emit(OpCodes.Stloc, value); + } + + ExitScope(cb); + + PopLabelBlock(LabelScopeKind.Catch); + } + + //****************************************************************** + // 4. Emit the finally block + //****************************************************************** + + if (node.Finally != null || node.Fault != null) { + PushLabelBlock(LabelScopeKind.Finally); + + if (node.Finally != null) { + _ilg.BeginFinallyBlock(); + } else { + _ilg.BeginFaultBlock(); + } + + // Emit the body + EmitExpressionAsVoid(node.Finally ?? node.Fault); + + _ilg.EndExceptionBlock(); + PopLabelBlock(LabelScopeKind.Finally); + } else { + _ilg.EndExceptionBlock(); + } + + if (tryType != typeof(void)) { + _ilg.Emit(OpCodes.Ldloc, value); + FreeLocal(value); + } + PopLabelBlock(LabelScopeKind.Try); + } + + /// + /// Emits the start of a catch block. The exception value that is provided by the + /// CLR is stored in the variable specified by the catch block or popped if no + /// variable is provided. + /// + private void EmitCatchStart(CatchBlock cb) { + if (cb.Filter == null) { + EmitSaveExceptionOrPop(cb); + return; + } + + // emit filter block. Filter blocks are untyped so we need to do + // the type check ourselves. + Label endFilter = _ilg.DefineLabel(); + Label rightType = _ilg.DefineLabel(); + + // skip if it's not our exception type, but save + // the exception if it is so it's available to the + // filter + _ilg.Emit(OpCodes.Isinst, cb.Test); + _ilg.Emit(OpCodes.Dup); + _ilg.Emit(OpCodes.Brtrue, rightType); + _ilg.Emit(OpCodes.Pop); + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Br, endFilter); + + // it's our type, save it and emit the filter. + _ilg.MarkLabel(rightType); + EmitSaveExceptionOrPop(cb); + PushLabelBlock(LabelScopeKind.Filter); + EmitExpression(cb.Filter); + PopLabelBlock(LabelScopeKind.Filter); + + // begin the catch, clear the exception, we've + // already saved it + _ilg.MarkLabel(endFilter); + _ilg.BeginCatchBlock(null); + _ilg.Emit(OpCodes.Pop); + } + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Unary.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Unary.cs new file mode 100644 index 00000000000..d63a1f14561 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Unary.cs @@ -0,0 +1,354 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + partial class LambdaCompiler { + + private void EmitQuoteUnaryExpression(Expression expr) { + EmitQuote((UnaryExpression)expr); + } + + + private void EmitQuote(UnaryExpression quote) { + // emit the quoted expression as a runtime constant + EmitConstant(quote.Operand, quote.Type); + + // Heuristic: only emit the tree rewrite logic if we have hoisted + // locals. + if (_scope.NearestHoistedLocals != null) { + // HoistedLocals is internal so emit as System.Object + EmitConstant(_scope.NearestHoistedLocals, typeof(object)); + _scope.EmitGet(_scope.NearestHoistedLocals.SelfVariable); + _ilg.Emit(OpCodes.Call, typeof(RuntimeOps).GetMethod("Quote")); + + if (quote.Type != typeof(Expression)) { + _ilg.Emit(OpCodes.Castclass, quote.Type); + } + } + } + + private void EmitThrowUnaryExpression(Expression expr) { + EmitThrow((UnaryExpression)expr, CompilationFlags.EmitAsDefaultType); + } + + private void EmitThrow(UnaryExpression expr, CompilationFlags flags) { + if (expr.Operand == null) { + CheckRethrow(); + + _ilg.Emit(OpCodes.Rethrow); + } else { + EmitExpression(expr.Operand); + _ilg.Emit(OpCodes.Throw); + } + + EmitUnreachable(expr, flags); + } + + private void EmitUnaryExpression(Expression expr, CompilationFlags flags) { + EmitUnary((UnaryExpression)expr, flags); + } + + private void EmitUnary(UnaryExpression node, CompilationFlags flags) { + if (node.Method != null) { + EmitUnaryMethod(node, flags); + } else if (node.NodeType == ExpressionType.NegateChecked && TypeUtils.IsInteger(node.Operand.Type)) { + EmitExpression(node.Operand); + LocalBuilder loc = GetLocal(node.Operand.Type); + _ilg.Emit(OpCodes.Stloc, loc); + _ilg.EmitInt(0); + _ilg.EmitConvertToType(typeof(int), node.Operand.Type, false); + _ilg.Emit(OpCodes.Ldloc, loc); + FreeLocal(loc); + EmitBinaryOperator(ExpressionType.SubtractChecked, node.Operand.Type, node.Operand.Type, node.Type, false); + } else { + EmitExpression(node.Operand); + EmitUnaryOperator(node.NodeType, node.Operand.Type, node.Type); + } + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private void EmitUnaryOperator(ExpressionType op, Type operandType, Type resultType) { + bool operandIsNullable = TypeUtils.IsNullableType(operandType); + + if (op == ExpressionType.ArrayLength) { + _ilg.Emit(OpCodes.Ldlen); + return; + } + + if (operandIsNullable) { + switch (op) { + case ExpressionType.Not: { + if (operandType != typeof(bool?)) + goto case ExpressionType.Negate; + + Label labIfNull = _ilg.DefineLabel(); + Label labEnd = _ilg.DefineLabel(); + LocalBuilder loc = GetLocal(operandType); + + // store values (reverse order since they are already on the stack) + _ilg.Emit(OpCodes.Stloc, loc); + + // test for null + _ilg.Emit(OpCodes.Ldloca, loc); + _ilg.EmitHasValue(operandType); + _ilg.Emit(OpCodes.Brfalse_S, labEnd); + + // do op on non-null value + _ilg.Emit(OpCodes.Ldloca, loc); + _ilg.EmitGetValueOrDefault(operandType); + Type nnOperandType = TypeUtils.GetNonNullableType(operandType); + EmitUnaryOperator(op, nnOperandType, typeof(bool)); + + // construct result + ConstructorInfo ci = resultType.GetConstructor(new Type[] { typeof(bool) }); + _ilg.Emit(OpCodes.Newobj, ci); + _ilg.Emit(OpCodes.Stloc, loc); + + _ilg.MarkLabel(labEnd); + _ilg.Emit(OpCodes.Ldloc, loc); + FreeLocal(loc); + return; + } + case ExpressionType.UnaryPlus: + case ExpressionType.NegateChecked: + case ExpressionType.Negate: + case ExpressionType.Increment: + case ExpressionType.Decrement: + case ExpressionType.OnesComplement: + case ExpressionType.IsFalse: + case ExpressionType.IsTrue: { + Debug.Assert(TypeUtils.AreEquivalent(operandType, resultType)); + Label labIfNull = _ilg.DefineLabel(); + Label labEnd = _ilg.DefineLabel(); + LocalBuilder loc = GetLocal(operandType); + + // check for null + _ilg.Emit(OpCodes.Stloc, loc); + _ilg.Emit(OpCodes.Ldloca, loc); + _ilg.EmitHasValue(operandType); + _ilg.Emit(OpCodes.Brfalse_S, labIfNull); + + // apply operator to non-null value + _ilg.Emit(OpCodes.Ldloca, loc); + _ilg.EmitGetValueOrDefault(operandType); + Type nnOperandType = TypeUtils.GetNonNullableType(resultType); + EmitUnaryOperator(op, nnOperandType, nnOperandType); + + // construct result + ConstructorInfo ci = resultType.GetConstructor(new Type[] { nnOperandType }); + _ilg.Emit(OpCodes.Newobj, ci); + _ilg.Emit(OpCodes.Stloc, loc); + _ilg.Emit(OpCodes.Br_S, labEnd); + + // if null then create a default one + _ilg.MarkLabel(labIfNull); + _ilg.Emit(OpCodes.Ldloca, loc); + _ilg.Emit(OpCodes.Initobj, resultType); + + _ilg.MarkLabel(labEnd); + _ilg.Emit(OpCodes.Ldloc, loc); + FreeLocal(loc); + return; + } + case ExpressionType.TypeAs: + _ilg.Emit(OpCodes.Box, operandType); + _ilg.Emit(OpCodes.Isinst, resultType); + if (TypeUtils.IsNullableType(resultType)) { + _ilg.Emit(OpCodes.Unbox_Any, resultType); + } + return; + default: + throw Error.UnhandledUnary(op); + } + } else { + switch (op) { + case ExpressionType.Not: + if (operandType == typeof(bool)) { + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + } else { + _ilg.Emit(OpCodes.Not); + } + break; + case ExpressionType.OnesComplement: + _ilg.Emit(OpCodes.Not); + break; + case ExpressionType.IsFalse: + _ilg.Emit(OpCodes.Ldc_I4_0); + _ilg.Emit(OpCodes.Ceq); + // Not an arithmetic operation -> no conversion + return; + case ExpressionType.IsTrue: + _ilg.Emit(OpCodes.Ldc_I4_1); + _ilg.Emit(OpCodes.Ceq); + // Not an arithmetic operation -> no conversion + return; + case ExpressionType.UnaryPlus: + _ilg.Emit(OpCodes.Nop); + break; + case ExpressionType.Negate: + case ExpressionType.NegateChecked: + _ilg.Emit(OpCodes.Neg); + break; + case ExpressionType.TypeAs: + if (operandType.IsValueType) { + _ilg.Emit(OpCodes.Box, operandType); + } + _ilg.Emit(OpCodes.Isinst, resultType); + if (TypeUtils.IsNullableType(resultType)) { + _ilg.Emit(OpCodes.Unbox_Any, resultType); + } + // Not an arithmetic operation -> no conversion + return; + case ExpressionType.Increment: + EmitConstantOne(resultType); + _ilg.Emit(OpCodes.Add); + break; + case ExpressionType.Decrement: + EmitConstantOne(resultType); + _ilg.Emit(OpCodes.Sub); + break; + default: + throw Error.UnhandledUnary(op); + } + + EmitConvertArithmeticResult(op, resultType); + } + } + + private void EmitConstantOne(Type type) { + switch (Type.GetTypeCode(type)) { + case TypeCode.UInt16: + case TypeCode.UInt32: + case TypeCode.Int16: + case TypeCode.Int32: + _ilg.Emit(OpCodes.Ldc_I4_1); + break; + case TypeCode.Int64: + case TypeCode.UInt64: + _ilg.Emit(OpCodes.Ldc_I8, (long)1); + break; + case TypeCode.Single: + _ilg.Emit(OpCodes.Ldc_R4, 1.0f); + break; + case TypeCode.Double: + _ilg.Emit(OpCodes.Ldc_R8, 1.0d); + break; + default: + // we only have to worry about aritmetic types, see + // TypeUtils.IsArithmetic + throw ContractUtils.Unreachable; + } + } + + private void EmitUnboxUnaryExpression(Expression expr) { + var node = (UnaryExpression)expr; + Debug.Assert(node.Type.IsValueType && !TypeUtils.IsNullableType(node.Type)); + + // Unbox_Any leaves the value on the stack + EmitExpression(node.Operand); + _ilg.Emit(OpCodes.Unbox_Any, node.Type); + } + + private void EmitConvertUnaryExpression(Expression expr, CompilationFlags flags) { + EmitConvert((UnaryExpression)expr, flags); + } + + private void EmitConvert(UnaryExpression node, CompilationFlags flags) { + if (node.Method != null) { + // User-defined conversions are only lifted if both source and + // destination types are value types. The C# compiler gets this wrong. + // In C#, if you have an implicit conversion from int->MyClass and you + // "lift" the conversion to int?->MyClass then a null int? goes to a + // null MyClass. This is contrary to the specification, which states + // that the correct behaviour is to unwrap the int?, throw an exception + // if it is null, and then call the conversion. + // + // We cannot fix this in C# but there is no reason why we need to + // propagate this bug into the expression tree API. Unfortunately + // this means that when the C# compiler generates the lambda + // (int? i)=>(MyClass)i, we will get different results for converting + // that lambda to a delegate directly and converting that lambda to + // an expression tree and then compiling it. We can live with this + // discrepancy however. + + if (node.IsLifted && (!node.Type.IsValueType || !node.Operand.Type.IsValueType)) { + ParameterInfo[] pis = node.Method.GetParametersCached(); + Debug.Assert(pis != null && pis.Length == 1); + Type paramType = pis[0].ParameterType; + if (paramType.IsByRef) { + paramType = paramType.GetElementType(); + } + + UnaryExpression e = Expression.Convert( + Expression.Call( + node.Method, + Expression.Convert(node.Operand, pis[0].ParameterType) + ), + node.Type + ); + + EmitConvert(e, flags); + } else { + EmitUnaryMethod(node, flags); + } + } else if (node.Type == typeof(void)) { + EmitExpressionAsVoid(node.Operand, flags); + } else { + if (TypeUtils.AreEquivalent(node.Operand.Type, node.Type)) { + EmitExpression(node.Operand, flags); + } else { + // A conversion is emitted after emitting the operand, no tail call is emitted + EmitExpression(node.Operand); + _ilg.EmitConvertToType(node.Operand.Type, node.Type, node.NodeType == ExpressionType.ConvertChecked); + } + } + } + + + private void EmitUnaryMethod(UnaryExpression node, CompilationFlags flags) { + if (node.IsLifted) { + ParameterExpression v = Expression.Variable(TypeUtils.GetNonNullableType(node.Operand.Type), null); + MethodCallExpression mc = Expression.Call(node.Method, v); + + Type resultType = TypeUtils.GetNullableType(mc.Type); + EmitLift(node.NodeType, resultType, mc, new ParameterExpression[] { v }, new Expression[] { node.Operand }); + _ilg.EmitConvertToType(resultType, node.Type, false); + } else { + EmitMethodCallExpression(Expression.Call(node.Method, node.Operand), flags); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.cs new file mode 100644 index 00000000000..4139dec8beb --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.cs @@ -0,0 +1,323 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +using ILGenerator = System.Linq.Expressions.Compiler.OffsetTrackingILGenerator; +#else +using ILGenerator = Microsoft.Linq.Expressions.Compiler.OffsetTrackingILGenerator; +#endif + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Threading; + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + /// + /// LambdaCompiler is responsible for compiling individual lambda (LambdaExpression). The complete tree may + /// contain multiple lambdas, the Compiler class is reponsible for compiling the whole tree, individual + /// lambdas are then compiled by the LambdaCompiler. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling")] + internal sealed partial class LambdaCompiler { + + private delegate void WriteBack(); + + // Information on the entire lambda tree currently being compiled + private readonly AnalyzedTree _tree; + + private readonly ILGenerator _ilg; + + // The TypeBuilder backing this method, if any + private readonly TypeBuilder _typeBuilder; + + private readonly MethodInfo _method; + + // Currently active LabelTargets and their mapping to IL labels + private LabelScopeInfo _labelBlock = new LabelScopeInfo(null, LabelScopeKind.Lambda); + // Mapping of labels used for "long" jumps (jumping out and into blocks) + private readonly Dictionary _labelInfo = new Dictionary(); + + // The currently active variable scope + private CompilerScope _scope; + + // The lambda we are compiling + private readonly LambdaExpression _lambda; + + // True if the method's first argument is of type Closure + private readonly bool _hasClosureArgument; + + // True if we want to emitting debug symbols + private bool EmitDebugSymbols { get { return _tree.DebugInfoGenerator != null; } } + + // Runtime constants bound to the delegate + private readonly BoundConstants _boundConstants; + + // Free list of locals, so we reuse them rather than creating new ones + private readonly KeyedQueue _freeLocals = new KeyedQueue(); + + /// + /// The value is true if a clearance was emitted and no new sequence point + /// has been emitted since that. + /// + bool _sequencePointCleared; + + /// + /// Creates a lambda compiler that will compile to a dynamic method + /// + private LambdaCompiler(AnalyzedTree tree, LambdaExpression lambda) { + Type[] parameterTypes = GetParameterTypes(lambda).AddFirst(typeof(Closure)); + +#if SILVERLIGHT + var method = new DynamicMethod(lambda.Name ?? "lambda_method", lambda.ReturnType, parameterTypes); +#else + var method = new DynamicMethod(lambda.Name ?? "lambda_method", lambda.ReturnType, parameterTypes, true); +#endif + + _tree = tree; + _lambda = lambda; + _method = method; + + _ilg = new OffsetTrackingILGenerator(method.GetILGenerator()); + + _hasClosureArgument = true; + + // These are populated by AnalyzeTree/VariableBinder + _scope = tree.Scopes[lambda]; + _boundConstants = tree.Constants[lambda]; + + InitializeMethod(); + } + + /// + /// Creates a lambda compiler that will compile into the provided Methodbuilder + /// + private LambdaCompiler(AnalyzedTree tree, LambdaExpression lambda, MethodBuilder method) { + _hasClosureArgument = tree.Scopes[lambda].NeedsClosure; + Type[] paramTypes = GetParameterTypes(lambda); + if (_hasClosureArgument) { + paramTypes = paramTypes.AddFirst(typeof(Closure)); + } + + method.SetReturnType(lambda.ReturnType); + method.SetParameters(paramTypes); + var paramNames = lambda.Parameters.Map(p => p.Name); + // parameters are index from 1, with closure argument we need to skip the first arg + int startIndex = _hasClosureArgument ? 2 : 1; + for (int i = 0; i < paramNames.Length; i++) { + method.DefineParameter(i + startIndex, ParameterAttributes.None, paramNames[i]); + } + + _tree = tree; + _lambda = lambda; + _typeBuilder = (TypeBuilder)method.DeclaringType; + _method = method; + + _ilg = new OffsetTrackingILGenerator(method.GetILGenerator()); + + // These are populated by AnalyzeTree/VariableBinder + _scope = tree.Scopes[lambda]; + _boundConstants = tree.Constants[lambda]; + + InitializeMethod(); + } + + /// + /// Creates a lambda compiler for an inlined lambda + /// + private LambdaCompiler(LambdaCompiler parent, LambdaExpression lambda) { + _tree = parent._tree; + _lambda = lambda; + _method = parent._method; + _ilg = parent._ilg; + _hasClosureArgument = parent._hasClosureArgument; + _typeBuilder = parent._typeBuilder; + _scope = _tree.Scopes[lambda]; + _boundConstants = parent._boundConstants; + } + + private void InitializeMethod() { + // See if we can find a return label, so we can emit better IL + AddReturnLabel(_lambda); + _boundConstants.EmitCacheConstants(this); + } + + public override string ToString() { + return _method.ToString(); + } + + internal ILGenerator IL { + get { return _ilg; } + } + + internal ReadOnlyCollection Parameters { + get { return _lambda.Parameters; } + } + + internal bool CanEmitBoundConstants { + get { return _method is DynamicMethod; } + } + + #region Compiler entry points + + /// + /// Compiler entry point + /// + /// LambdaExpression to compile. + /// Debug info generator. + /// The compiled delegate. + internal static Delegate Compile(LambdaExpression lambda, DebugInfoGenerator debugInfoGenerator) { + // 1. Bind lambda + AnalyzedTree tree = AnalyzeLambda(ref lambda); + + tree.DebugInfoGenerator = debugInfoGenerator; + + // 2. Create lambda compiler + LambdaCompiler c = new LambdaCompiler(tree, lambda); + + // 3. Emit + c.EmitLambdaBody(); + + // 4. Return the delegate. + return c.CreateDelegate(); + } + + /// + /// Mutates the MethodBuilder parameter, filling in IL, parameters, + /// and return type. + /// + /// (probably shouldn't be modifying parameters/return type...) + /// + internal static void Compile(LambdaExpression lambda, MethodBuilder method, DebugInfoGenerator debugInfoGenerator) { + // 1. Bind lambda + AnalyzedTree tree = AnalyzeLambda(ref lambda); + + tree.DebugInfoGenerator = debugInfoGenerator; + + // 2. Create lambda compiler + LambdaCompiler c = new LambdaCompiler(tree, lambda, method); + + // 3. Emit + c.EmitLambdaBody(); + } + + #endregion + + private static AnalyzedTree AnalyzeLambda(ref LambdaExpression lambda) { + // Spill the stack for any exception handling blocks or other + // constructs which require entering with an empty stack + lambda = StackSpiller.AnalyzeLambda(lambda); + + // Bind any variable references in this lambda + return VariableBinder.Bind(lambda); + } + + internal LocalBuilder GetLocal(Type type) { + Debug.Assert(type != null); + + LocalBuilder local; + if (_freeLocals.TryDequeue(type, out local)) { + Debug.Assert(type == local.LocalType); + return local; + } + + return _ilg.DeclareLocal(type); + } + + internal void FreeLocal(LocalBuilder local) { + if (local != null) { + _freeLocals.Enqueue(local.LocalType, local); + } + } + + internal LocalBuilder GetNamedLocal(Type type, ParameterExpression variable) { + Debug.Assert(type != null && variable != null); + + LocalBuilder lb = _ilg.DeclareLocal(type); + if (EmitDebugSymbols && variable.Name != null) { + _tree.DebugInfoGenerator.SetLocalName(lb, variable.Name); + } + return lb; + } + + /// + /// Gets the argument slot corresponding to the parameter at the given + /// index. Assumes that the method takes a certain number of prefix + /// arguments, followed by the real parameters stored in Parameters + /// + internal int GetLambdaArgument(int index) { + return index + (_hasClosureArgument ? 1 : 0) + (_method.IsStatic ? 0 : 1); + } + + /// + /// Returns the index-th argument. This method provides access to the actual arguments + /// defined on the lambda itself, and excludes the possible 0-th closure argument. + /// + internal void EmitLambdaArgument(int index) { + _ilg.EmitLoadArg(GetLambdaArgument(index)); + } + + internal void EmitClosureArgument() { + Debug.Assert(_hasClosureArgument, "must have a Closure argument"); + Debug.Assert(_method.IsStatic, "must be a static method"); + _ilg.EmitLoadArg(0); + } + + private Delegate CreateDelegate() { + Debug.Assert(_method is DynamicMethod); + + return _method.CreateDelegate(_lambda.Type, new Closure(_boundConstants.ToArray(), null)); + } + + private FieldBuilder CreateStaticField(string name, Type type) { + // We are emitting into someone else's type. We don't want name + // conflicts, so choose a long name that is unlikely to confict. + // Naming scheme chosen here is similar to what the C# compiler + // uses. + return _typeBuilder.DefineField("{" + Interlocked.Increment(ref _Counter) + "}" + name, type, FieldAttributes.Static | FieldAttributes.Private); + } + + /// + /// Creates an unitialized field suitible for private implementation details + /// Works with DynamicMethods or TypeBuilders. + /// + private MemberExpression CreateLazyInitializedField(string name) { + if (_method is DynamicMethod) { + return Expression.Field(Expression.Constant(new StrongBox()), "Value"); + } else { + return Expression.Field(null, CreateStaticField(name, typeof(T))); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/OffsetTrackingILGenerator.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/OffsetTrackingILGenerator.cs new file mode 100644 index 00000000000..f3f251977a9 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/OffsetTrackingILGenerator.cs @@ -0,0 +1,363 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; +using System.Reflection.Emit; +using System.Diagnostics.SymbolStore; + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + /// + /// Wraps ILGenerator with code that tracks the current IL offset as instructions are emitted into the IL stream. + /// We can conditionally compile this for non-Dev10 release only (using #ifdef MICROSOFT_SCRIPTING) + /// as soon as Dev10 feature request (http://vstfdevdiv:8080/WorkItemTracking/WorkItem.aspx?artifactMoniker=599427) gets implemented. + /// + internal sealed class OffsetTrackingILGenerator { + private readonly ILGenerator _ilg; + internal int _offset; + + internal int CurrentOffset { get { return _offset; } } + + internal OffsetTrackingILGenerator(ILGenerator ilg) { + Debug.Assert(ilg != null); + _ilg = ilg; + } + + private void AdvanceOffset(OpCode opcode) { + _offset += opcode.Size; + } + + private void AdvanceOffsetWithLabel(OpCode opcode) { + AdvanceOffset(opcode); + if (OpCodes.TakesSingleByteArgument(opcode)) { + _offset++; + } else { + _offset += 4; + } + } + + #region Simple Instructions + + internal void Emit(OpCode opcode) { + _ilg.Emit(opcode); + AdvanceOffset(opcode); + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, byte arg) { + _ilg.Emit(opcode, arg); + AdvanceOffset(opcode); + _offset++; + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, sbyte arg) { + _ilg.Emit(opcode, arg); + AdvanceOffset(opcode); + _offset++; + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, int arg) { + _ilg.Emit(opcode, arg); + AdvanceOffset(opcode); + _offset += 4; + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, MethodInfo meth) { + _ilg.Emit(opcode, meth); + AdvanceOffset(opcode); + _offset += 4; + AssertOffsetMatches(); + } + + internal void EmitCall(OpCode opcode, MethodInfo methodInfo, Type[] optionalParameterTypes) { + _ilg.EmitCall(opcode, methodInfo, optionalParameterTypes); + AdvanceOffset(opcode); + _offset += 4; + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, ConstructorInfo con) { + _ilg.Emit(opcode, con); + AdvanceOffset(opcode); + _offset += 4; + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, Type cls) { + _ilg.Emit(opcode, cls); + AdvanceOffset(opcode); + _offset += 4; + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, long arg) { + _ilg.Emit(opcode, arg); + AdvanceOffset(opcode); + _offset += 8; + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, float arg) { + _ilg.Emit(opcode, arg); + AdvanceOffset(opcode); + _offset += 4; + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, double arg) { + _ilg.Emit(opcode, arg); + AdvanceOffset(opcode); + _offset += 8; + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, Label label) { + _ilg.Emit(opcode, label); + AdvanceOffsetWithLabel(opcode); + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, Label[] labels) { + _ilg.Emit(opcode, labels); + AdvanceOffset(opcode); + _offset += 4; + for (int remaining = labels.Length * 4, i = 0; remaining > 0; remaining -= 4, i++) { + _offset += 4; + } + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, FieldInfo field) { + _ilg.Emit(opcode, field); + AdvanceOffset(opcode); + _offset += 4; + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, String str) { + _ilg.Emit(opcode, str); + AdvanceOffset(opcode); + _offset += 4; + AssertOffsetMatches(); + } + + internal void Emit(OpCode opcode, LocalBuilder local) { + _ilg.Emit(opcode, local); + int tempVal = local.LocalIndex; + if (opcode.Equals(OpCodes.Ldloc)) { + switch (tempVal) { + case 0: + opcode = OpCodes.Ldloc_0; + break; + case 1: + opcode = OpCodes.Ldloc_1; + break; + case 2: + opcode = OpCodes.Ldloc_2; + break; + case 3: + opcode = OpCodes.Ldloc_3; + break; + default: + if (tempVal <= 255) + opcode = OpCodes.Ldloc_S; + break; + } + } else if (opcode.Equals(OpCodes.Stloc)) { + switch (tempVal) { + case 0: + opcode = OpCodes.Stloc_0; + break; + case 1: + opcode = OpCodes.Stloc_1; + break; + case 2: + opcode = OpCodes.Stloc_2; + break; + case 3: + opcode = OpCodes.Stloc_3; + break; + default: + if (tempVal <= 255) + opcode = OpCodes.Stloc_S; + break; + } + } else if (opcode.Equals(OpCodes.Ldloca)) { + if (tempVal <= 255) + opcode = OpCodes.Ldloca_S; + } + + AdvanceOffset(opcode); + + if (opcode.OperandType == OperandType.InlineNone) + return; + else if (!OpCodes.TakesSingleByteArgument(opcode)) { + _offset += 2; + } else { + _offset++; + } + AssertOffsetMatches(); + } + + #endregion + + #region Exception Handling + + private enum ExceptionState { + Try = 0, + Filter = 1, + Catch = 2, + Finally = 3, + Fault = 4, + } + + private Stack _exceptionState = new Stack(); + + internal void BeginExceptionBlock() { + _ilg.BeginExceptionBlock(); + _exceptionState.Push(ExceptionState.Try); + AssertOffsetMatches(); + } + + internal void EndExceptionBlock() { + _ilg.EndExceptionBlock(); + + ExceptionState state = _exceptionState.Pop(); + if (state == ExceptionState.Catch) { + AdvanceOffsetWithLabel(OpCodes.Leave); + } else if (state == ExceptionState.Finally || state == ExceptionState.Fault) { + AdvanceOffset(OpCodes.Endfinally); + } + + AssertOffsetMatches(); + } + + internal void BeginExceptFilterBlock() { + _ilg.BeginExceptFilterBlock(); + + _exceptionState.Pop(); + _exceptionState.Push(ExceptionState.Filter); + + AssertOffsetMatches(); + } + + internal void BeginCatchBlock(Type exceptionType) { + _ilg.BeginCatchBlock(exceptionType); + + ExceptionState state = _exceptionState.Pop(); + if (state == ExceptionState.Filter) { + AdvanceOffset(OpCodes.Endfilter); + } else { + AdvanceOffsetWithLabel(OpCodes.Leave); + } + + _exceptionState.Push(ExceptionState.Catch); + + AssertOffsetMatches(); + } + + internal void BeginFaultBlock() { + _ilg.BeginFaultBlock(); + + AdvanceOffsetWithLabel(OpCodes.Leave); + _exceptionState.Pop(); + _exceptionState.Push(ExceptionState.Fault); + + AssertOffsetMatches(); + } + + internal void BeginFinallyBlock() { + _ilg.BeginFinallyBlock(); + + ExceptionState state = _exceptionState.Pop(); + if (state != ExceptionState.Try) { + // leave for any preceeding catch clause + AdvanceOffsetWithLabel(OpCodes.Leave); + } + + // leave for try clause + AdvanceOffsetWithLabel(OpCodes.Leave); + _exceptionState.Push(ExceptionState.Finally); + + AssertOffsetMatches(); + } + + #endregion + + #region Labels and Locals + + internal Label DefineLabel() { + return _ilg.DefineLabel(); + } + + internal void MarkLabel(Label loc) { + _ilg.MarkLabel(loc); + } + + internal LocalBuilder DeclareLocal(Type localType) { + return _ilg.DeclareLocal(localType); + } + + internal void MarkSequencePoint(ISymbolDocumentWriter document, int startLine, int startColumn, int endLine, int endColumn) { + _ilg.MarkSequencePoint(document, startLine, startColumn, endLine, endColumn); + } + + #endregion + + #region Assertions + +#if STRESS_DEBUG + private FieldInfo _ilgOffsetField; + private bool _checkOffset = true; +#endif + + [Conditional("STRESS_DEBUG")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] + private void AssertOffsetMatches() { +#if STRESS_DEBUG + if (!_checkOffset) { + return; + } + + int m_length = -1; + try { + if (_ilgOffsetField == null) { + _ilgOffsetField = typeof(ILGenerator).GetField("m_length", BindingFlags.NonPublic | BindingFlags.Instance); + } + m_length = (int)_ilgOffsetField.GetValue(_ilg); + } catch (Exception) { + _checkOffset = false; + } + + if (_checkOffset) { + Debug.Assert(m_length == _offset); + } +#endif + } + + #endregion + } + +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/RuntimeVariableList.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/RuntimeVariableList.cs new file mode 100644 index 00000000000..bb28100a6b6 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/RuntimeVariableList.cs @@ -0,0 +1,128 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.ComponentModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions.Compiler; +#else +using Microsoft.Linq.Expressions.Compiler; +#endif + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + + /// + /// This API supports the .NET Framework infrastructure and is not intended to be used directly from your code. + /// Contains helper methods called from dynamically generated methods. + /// + [EditorBrowsable(EditorBrowsableState.Never), DebuggerStepThrough] + public static partial class RuntimeOps { + /// + /// Creates an interface that can be used to modify closed over variables at runtime. + /// + /// The closure array. + /// An array of indicies into the closure array where variables are found. + /// An interface to access variables. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static IRuntimeVariables CreateRuntimeVariables(object[] data, long[] indexes) { + return new RuntimeVariableList(data, indexes); + } + + /// + /// Creates an interface that can be used to modify closed over variables at runtime. + /// + /// An interface to access variables. + [Obsolete("do not use this method", true), EditorBrowsable(EditorBrowsableState.Never)] + public static IRuntimeVariables CreateRuntimeVariables() { + return new EmptyRuntimeVariables(); + } + + private sealed class EmptyRuntimeVariables : IRuntimeVariables { + int IRuntimeVariables.Count { + get { return 0; } + } + + object IRuntimeVariables.this[int index] { + get { + throw new ArgumentOutOfRangeException("index"); + } + set { + throw new ArgumentOutOfRangeException("index"); + } + } + } + + /// + /// Provides a list of variables, supporing read/write of the values + /// Exposed via RuntimeVariablesExpression + /// + private sealed class RuntimeVariableList : IRuntimeVariables { + // The top level environment. It contains pointers to parent + // environments, which are always in the first element + private readonly object[] _data; + + // An array of (int, int) pairs, each representing how to find a + // variable in the environment data struction. + // + // The first integer indicates the number of times to go up in the + // closure chain, the second integer indicates the index into that + // closure chain. + private readonly long[] _indexes; + + internal RuntimeVariableList(object[] data, long[] indexes) { + Debug.Assert(data != null); + Debug.Assert(indexes != null); + + _data = data; + _indexes = indexes; + } + + public int Count { + get { return _indexes.Length; } + } + + public object this[int index] { + get { + return GetStrongBox(index).Value; + } + set { + GetStrongBox(index).Value = value; + } + } + + private IStrongBox GetStrongBox(int index) { + // We lookup the closure using two ints: + // 1. The high dword is the number of parents to go up + // 2. The low dword is the index into that array + long closureKey = _indexes[index]; + + // walk up the parent chain to find the real environment + object[] result = _data; + for (int parents = (int)(closureKey >> 32); parents > 0; parents--) { + result = HoistedLocals.GetParent(result); + } + + // Return the variable storage + return (IStrongBox)result[(int)closureKey]; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/Set.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/Set.cs new file mode 100644 index 00000000000..6af4d573c64 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/Set.cs @@ -0,0 +1,97 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections; +using System.Collections.Generic; + +#if CODEPLEX_40 +// Note: can't move to Utils because name conflicts with System.Linq.Set +namespace System.Linq.Expressions { +#else +// Note: can't move to Utils because name conflicts with Microsoft.Linq.Set +namespace Microsoft.Linq.Expressions { +#endif + + /// + /// A simple hashset, built on Dictionary{K, V} + /// + internal sealed class Set : ICollection { + private readonly Dictionary _data; + + internal Set() { + _data = new Dictionary(); + } + + internal Set(IEqualityComparer comparer) { + _data = new Dictionary(comparer); + } + + internal Set(IList list) { + _data = new Dictionary(list.Count); + foreach (T t in list) { + Add(t); + } + } + + internal Set(IEnumerable list) { + _data = new Dictionary(); + foreach (T t in list) { + Add(t); + } + } + + internal Set(int capacity) { + _data = new Dictionary(capacity); + } + + public void Add(T item) { + _data[item] = null; + } + + public void Clear() { + _data.Clear(); + } + + public bool Contains(T item) { + return _data.ContainsKey(item); + } + + public void CopyTo(T[] array, int arrayIndex) { + _data.Keys.CopyTo(array, arrayIndex); + } + + public int Count { + get { return _data.Count; } + } + + public bool IsReadOnly { + get { return false; } + } + + public bool Remove(T item) { + return _data.Remove(item); + } + + public IEnumerator GetEnumerator() { + return _data.Keys.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { + return _data.Keys.GetEnumerator(); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Bindings.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Bindings.cs new file mode 100644 index 00000000000..e102b5a03ad --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Bindings.cs @@ -0,0 +1,238 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.ObjectModel; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + internal partial class StackSpiller { + + private abstract class BindingRewriter { + protected MemberBinding _binding; + protected RewriteAction _action; + protected StackSpiller _spiller; + + internal BindingRewriter(MemberBinding binding, StackSpiller spiller) { + _binding = binding; + _spiller = spiller; + } + + internal RewriteAction Action { + get { return _action; } + } + + internal abstract MemberBinding AsBinding(); + internal abstract Expression AsExpression(Expression target); + + internal static BindingRewriter Create(MemberBinding binding, StackSpiller spiller, Stack stack) { + switch (binding.BindingType) { + case MemberBindingType.Assignment: + MemberAssignment assign = (MemberAssignment)binding; + return new MemberAssignmentRewriter(assign, spiller, stack); + case MemberBindingType.ListBinding: + MemberListBinding list = (MemberListBinding)binding; + return new ListBindingRewriter(list, spiller, stack); + case MemberBindingType.MemberBinding: + MemberMemberBinding member = (MemberMemberBinding)binding; + return new MemberMemberBindingRewriter(member, spiller, stack); + } + throw Error.UnhandledBinding(); + } + } + + private class MemberMemberBindingRewriter : BindingRewriter { + ReadOnlyCollection _bindings; + BindingRewriter[] _bindingRewriters; + + internal MemberMemberBindingRewriter(MemberMemberBinding binding, StackSpiller spiller, Stack stack) : + base(binding, spiller) { + + _bindings = binding.Bindings; + _bindingRewriters = new BindingRewriter[_bindings.Count]; + for (int i = 0; i < _bindings.Count; i++) { + BindingRewriter br = BindingRewriter.Create(_bindings[i], spiller, stack); + _action |= br.Action; + _bindingRewriters[i] = br; + } + } + + internal override MemberBinding AsBinding() { + switch (_action) { + case RewriteAction.None: + return _binding; + case RewriteAction.Copy: + MemberBinding[] newBindings = new MemberBinding[_bindings.Count]; + for (int i = 0; i < _bindings.Count; i++) { + newBindings[i] = _bindingRewriters[i].AsBinding(); + } + return Expression.MemberBind(_binding.Member, new TrueReadOnlyCollection(newBindings)); + } + throw ContractUtils.Unreachable; + } + + internal override Expression AsExpression(Expression target) { + if (target.Type.IsValueType && _binding.Member is System.Reflection.PropertyInfo) { + throw Error.CannotAutoInitializeValueTypeMemberThroughProperty(_binding.Member); + } + RequireNotRefInstance(target); + + MemberExpression member = Expression.MakeMemberAccess(target, _binding.Member); + ParameterExpression memberTemp = _spiller.MakeTemp(member.Type); + + Expression[] block = new Expression[_bindings.Count + 2]; + block[0] = Expression.Assign(memberTemp, member); + + for (int i = 0; i < _bindings.Count; i++) { + BindingRewriter br = _bindingRewriters[i]; + block[i + 1] = br.AsExpression(memberTemp); + } + + // We need to copy back value types + if (memberTemp.Type.IsValueType) { + block[_bindings.Count + 1] = Expression.Block( + typeof(void), + Expression.Assign(Expression.MakeMemberAccess(target, _binding.Member), memberTemp) + ); + } else { + block[_bindings.Count + 1] = Expression.Empty(); + } + return MakeBlock(block); + } + } + + private class ListBindingRewriter : BindingRewriter { + ReadOnlyCollection _inits; + ChildRewriter[] _childRewriters; + + internal ListBindingRewriter(MemberListBinding binding, StackSpiller spiller, Stack stack) : + base(binding, spiller) { + + _inits = binding.Initializers; + + _childRewriters = new ChildRewriter[_inits.Count]; + for (int i = 0; i < _inits.Count; i++) { + ElementInit init = _inits[i]; + + ChildRewriter cr = new ChildRewriter(spiller, stack, init.Arguments.Count); + cr.Add(init.Arguments); + + _action |= cr.Action; + _childRewriters[i] = cr; + } + } + + internal override MemberBinding AsBinding() { + switch (_action) { + case RewriteAction.None: + return _binding; + case RewriteAction.Copy: + ElementInit[] newInits = new ElementInit[_inits.Count]; + for (int i = 0; i < _inits.Count; i++) { + ChildRewriter cr = _childRewriters[i]; + if (cr.Action == RewriteAction.None) { + newInits[i] = _inits[i]; + } else { + newInits[i] = Expression.ElementInit(_inits[i].AddMethod, cr[0, -1]); + } + } + return Expression.ListBind(_binding.Member, new TrueReadOnlyCollection(newInits)); + } + throw ContractUtils.Unreachable; + } + + internal override Expression AsExpression(Expression target) { + if (target.Type.IsValueType && _binding.Member is System.Reflection.PropertyInfo) { + throw Error.CannotAutoInitializeValueTypeElementThroughProperty(_binding.Member); + } + RequireNotRefInstance(target); + + MemberExpression member = Expression.MakeMemberAccess(target, _binding.Member); + ParameterExpression memberTemp = _spiller.MakeTemp(member.Type); + + Expression[] block = new Expression[_inits.Count + 2]; + block[0] = Expression.Assign(memberTemp, member); + + for (int i = 0; i < _inits.Count; i++) { + ChildRewriter cr = _childRewriters[i]; + Result add = cr.Finish(Expression.Call(memberTemp, _inits[i].AddMethod, cr[0, -1])); + block[i + 1] = add.Node; + } + + // We need to copy back value types + if (memberTemp.Type.IsValueType) { + block[_inits.Count + 1] = Expression.Block( + typeof(void), + Expression.Assign(Expression.MakeMemberAccess(target, _binding.Member), memberTemp) + ); + } else { + block[_inits.Count + 1] = Expression.Empty(); + } + return MakeBlock(block); + } + } + + private class MemberAssignmentRewriter : BindingRewriter { + Expression _rhs; + + internal MemberAssignmentRewriter(MemberAssignment binding, StackSpiller spiller, Stack stack) : + base(binding, spiller) { + + Result result = spiller.RewriteExpression(binding.Expression, stack); + _action = result.Action; + _rhs = result.Node; + } + + internal override MemberBinding AsBinding() { + switch (_action) { + case RewriteAction.None: + return _binding; + case RewriteAction.Copy: + return Expression.Bind(_binding.Member, _rhs); + } + throw ContractUtils.Unreachable; + } + + internal override Expression AsExpression(Expression target) { + RequireNotRefInstance(target); + + MemberExpression member = Expression.MakeMemberAccess(target, _binding.Member); + ParameterExpression memberTemp = _spiller.MakeTemp(member.Type); + + return MakeBlock( + Expression.Assign(memberTemp, _rhs), + Expression.Assign(member, memberTemp), + Expression.Empty() + ); + } + } + + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Generated.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Generated.cs new file mode 100644 index 00000000000..4de2f4073e3 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Generated.cs @@ -0,0 +1,278 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + internal partial class StackSpiller { + + /// + /// Rewrite the expression + /// + /// + /// Expression to rewrite + /// State of the stack before the expression is emitted. + /// Rewritten expression. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1505:AvoidUnmaintainableCode")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + private Result RewriteExpression(Expression node, Stack stack) { + if (node == null) { + return new Result(RewriteAction.None, null); + } + + Result result; + switch (node.NodeType) { + #region Generated StackSpiller Switch + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_stackspiller_switch from: generate_tree.py + + case ExpressionType.Add: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.AddChecked: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.And: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.AndAlso: + result = RewriteLogicalBinaryExpression(node, stack); + break; + case ExpressionType.ArrayLength: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.ArrayIndex: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.Call: + result = RewriteMethodCallExpression(node, stack); + break; + case ExpressionType.Coalesce: + result = RewriteLogicalBinaryExpression(node, stack); + break; + case ExpressionType.Conditional: + result = RewriteConditionalExpression(node, stack); + break; + case ExpressionType.Convert: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.ConvertChecked: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.Divide: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.Equal: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.ExclusiveOr: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.GreaterThan: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.GreaterThanOrEqual: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.Invoke: + result = RewriteInvocationExpression(node, stack); + break; + case ExpressionType.Lambda: + result = RewriteLambdaExpression(node, stack); + break; + case ExpressionType.LeftShift: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.LessThan: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.LessThanOrEqual: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.ListInit: + result = RewriteListInitExpression(node, stack); + break; + case ExpressionType.MemberAccess: + result = RewriteMemberExpression(node, stack); + break; + case ExpressionType.MemberInit: + result = RewriteMemberInitExpression(node, stack); + break; + case ExpressionType.Modulo: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.Multiply: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.MultiplyChecked: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.Negate: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.UnaryPlus: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.NegateChecked: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.New: + result = RewriteNewExpression(node, stack); + break; + case ExpressionType.NewArrayInit: + result = RewriteNewArrayExpression(node, stack); + break; + case ExpressionType.NewArrayBounds: + result = RewriteNewArrayExpression(node, stack); + break; + case ExpressionType.Not: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.NotEqual: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.Or: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.OrElse: + result = RewriteLogicalBinaryExpression(node, stack); + break; + case ExpressionType.Power: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.RightShift: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.Subtract: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.SubtractChecked: + result = RewriteBinaryExpression(node, stack); + break; + case ExpressionType.TypeAs: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.TypeIs: + result = RewriteTypeBinaryExpression(node, stack); + break; + case ExpressionType.Assign: + result = RewriteAssignBinaryExpression(node, stack); + break; + case ExpressionType.Block: + result = RewriteBlockExpression(node, stack); + break; + case ExpressionType.Decrement: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.Dynamic: + result = RewriteDynamicExpression(node, stack); + break; + case ExpressionType.Extension: + result = RewriteExtensionExpression(node, stack); + break; + case ExpressionType.Goto: + result = RewriteGotoExpression(node, stack); + break; + case ExpressionType.Increment: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.Index: + result = RewriteIndexExpression(node, stack); + break; + case ExpressionType.Label: + result = RewriteLabelExpression(node, stack); + break; + case ExpressionType.Loop: + result = RewriteLoopExpression(node, stack); + break; + case ExpressionType.Switch: + result = RewriteSwitchExpression(node, stack); + break; + case ExpressionType.Throw: + result = RewriteThrowUnaryExpression(node, stack); + break; + case ExpressionType.Try: + result = RewriteTryExpression(node, stack); + break; + case ExpressionType.Unbox: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.TypeEqual: + result = RewriteTypeBinaryExpression(node, stack); + break; + case ExpressionType.OnesComplement: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.IsTrue: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.IsFalse: + result = RewriteUnaryExpression(node, stack); + break; + case ExpressionType.AddAssign: + case ExpressionType.AndAssign: + case ExpressionType.DivideAssign: + case ExpressionType.ExclusiveOrAssign: + case ExpressionType.LeftShiftAssign: + case ExpressionType.ModuloAssign: + case ExpressionType.MultiplyAssign: + case ExpressionType.OrAssign: + case ExpressionType.PowerAssign: + case ExpressionType.RightShiftAssign: + case ExpressionType.SubtractAssign: + case ExpressionType.AddAssignChecked: + case ExpressionType.MultiplyAssignChecked: + case ExpressionType.SubtractAssignChecked: + case ExpressionType.PreIncrementAssign: + case ExpressionType.PreDecrementAssign: + case ExpressionType.PostIncrementAssign: + case ExpressionType.PostDecrementAssign: + result = RewriteReducibleExpression(node, stack); + break; + case ExpressionType.Quote: + case ExpressionType.Parameter: + case ExpressionType.Constant: + case ExpressionType.RuntimeVariables: + case ExpressionType.Default: + case ExpressionType.DebugInfo: + return new Result(RewriteAction.None, node); + + // *** END GENERATED CODE *** + + #endregion + + default: + throw ContractUtils.Unreachable; + } + + VerifyRewrite(result, node); + + return result; + } + } +} + diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Temps.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Temps.cs new file mode 100644 index 00000000000..42a147ac047 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.Temps.cs @@ -0,0 +1,313 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + internal partial class StackSpiller { + + private class TempMaker { + /// + /// Current temporary variable + /// + private int _temp; + + /// + /// List of free temporary variables. These can be recycled for new temps. + /// + private List _freeTemps; + + /// + /// Stack of currently active temporary variables. + /// + private Stack _usedTemps; + + /// + /// List of all temps created by stackspiller for this rule/lambda + /// + private List _temps = new List(); + + internal List Temps { + get { return _temps; } + } + + internal ParameterExpression Temp(Type type) { + ParameterExpression temp; + if (_freeTemps != null) { + // Recycle from the free-list if possible. + for (int i = _freeTemps.Count - 1; i >= 0; i--) { + temp = _freeTemps[i]; + if (temp.Type == type) { + _freeTemps.RemoveAt(i); + return UseTemp(temp); + } + } + } + // Not on the free-list, create a brand new one. + temp = Expression.Variable(type, "$temp$" + _temp++); + _temps.Add(temp); + return UseTemp(temp); + } + + private ParameterExpression UseTemp(ParameterExpression temp) { + Debug.Assert(_freeTemps == null || !_freeTemps.Contains(temp)); + Debug.Assert(_usedTemps == null || !_usedTemps.Contains(temp)); + + if (_usedTemps == null) { + _usedTemps = new Stack(); + } + _usedTemps.Push(temp); + return temp; + } + + private void FreeTemp(ParameterExpression temp) { + Debug.Assert(_freeTemps == null || !_freeTemps.Contains(temp)); + if (_freeTemps == null) { + _freeTemps = new List(); + } + _freeTemps.Add(temp); + } + + internal int Mark() { + return _usedTemps != null ? _usedTemps.Count : 0; + } + + // Free temporaries created since the last marking. + // This is a performance optimization to lower the overall number of tempories needed. + internal void Free(int mark) { + // (_usedTemps != null) ==> (mark <= _usedTemps.Count) + Debug.Assert(_usedTemps == null || mark <= _usedTemps.Count); + // (_usedTemps == null) ==> (mark == 0) + Debug.Assert(mark == 0 || _usedTemps != null); + + if (_usedTemps != null) { + while (mark < _usedTemps.Count) { + FreeTemp(_usedTemps.Pop()); + } + } + } + + [Conditional("DEBUG")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] + internal void VerifyTemps() { + Debug.Assert(_usedTemps == null || _usedTemps.Count == 0); + } + } + + + /// + /// Rewrites child expressions, spilling them into temps if needed. The + /// stack starts in the inital state, and after the first subexpression + /// is added it is change to non-empty. This behavior can be overridden + /// by setting the stack manually between adds. + /// + /// When all children have been added, the caller should rewrite the + /// node if Rewrite is true. Then, it should call Finish with etiher + /// the orignal expression or the rewritten expression. Finish will call + /// Expression.Comma if necessary and return a new Result. + /// + private class ChildRewriter { + private readonly StackSpiller _self; + private readonly Expression[] _expressions; + private int _expressionsCount; + private List _comma; + private RewriteAction _action; + private Stack _stack; + private bool _done; + + internal ChildRewriter(StackSpiller self, Stack stack, int count) { + _self = self; + _stack = stack; + _expressions = new Expression[count]; + } + + internal void Add(Expression node) { + Debug.Assert(!_done); + + if (node == null) { + _expressions[_expressionsCount++] = null; + return; + } + + Result exp = _self.RewriteExpression(node, _stack); + _action |= exp.Action; + _stack = Stack.NonEmpty; + + // track items in case we need to copy or spill stack + _expressions[_expressionsCount++] = exp.Node; + } + + internal void Add(IList expressions) { + for (int i = 0, count = expressions.Count; i < count; i++) { + Add(expressions[i]); + } + } + + internal void AddArguments(IArgumentProvider expressions) { + for (int i = 0, count = expressions.ArgumentCount; i < count; i++) { + Add(expressions.GetArgument(i)); + } + } + + private void EnsureDone() { + // done adding arguments, build the comma if necessary + if (!_done) { + _done = true; + + if (_action == RewriteAction.SpillStack) { + Expression[] clone = _expressions; + int count = clone.Length; + List comma = new List(count + 1); + for (int i = 0; i < count; i++) { + if (clone[i] != null) { + Expression temp; + clone[i] = _self.ToTemp(clone[i], out temp); + comma.Add(temp); + } + } + comma.Capacity = comma.Count + 1; + _comma = comma; + } + } + } + + internal bool Rewrite { + get { return _action != RewriteAction.None; } + } + + internal RewriteAction Action { + get { return _action; } + } + + internal Result Finish(Expression expr) { + EnsureDone(); + + if (_action == RewriteAction.SpillStack) { + Debug.Assert(_comma.Capacity == _comma.Count + 1); + _comma.Add(expr); + expr = MakeBlock(_comma); + } + + return new Result(_action, expr); + } + + internal Expression this[int index] { + get { + EnsureDone(); + if (index < 0) { + index += _expressions.Length; + } + return _expressions[index]; + } + } + + internal Expression[] this[int first, int last] { + get { + EnsureDone(); + if (last < 0) { + last += _expressions.Length; + } + int count = last - first + 1; + ContractUtils.RequiresArrayRange(_expressions, first, count, "first", "last"); + + if (count == _expressions.Length) { + Debug.Assert(first == 0); + // if the entire array is requested just return it so we don't make a new array + return _expressions; + } + + Expression[] clone = new Expression[count]; + Array.Copy(_expressions, first, clone, 0, count); + return clone; + } + } + } + + + private ParameterExpression MakeTemp(Type type) { + return _tm.Temp(type); + } + + private int Mark() { + return _tm.Mark(); + } + + private void Free(int mark) { + _tm.Free(mark); + } + + [Conditional("DEBUG")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] + private void VerifyTemps() { + _tm.VerifyTemps(); + } + + /// + /// Will perform: + /// save: temp = expression + /// return value: temp + /// + private ParameterExpression ToTemp(Expression expression, out Expression save) { + ParameterExpression temp = MakeTemp(expression.Type); + save = Expression.Assign(temp, expression); + return temp; + } + + /// + /// Creates a special block that is marked as not allowing jumps in. + /// This should not be used for rewriting BlockExpression itself, or + /// anything else that supports jumping. + /// + private static Expression MakeBlock(params Expression[] expressions) { + return MakeBlock((IList)expressions); + } + + /// + /// Creates a special block that is marked as not allowing jumps in. + /// This should not be used for rewriting BlockExpression itself, or + /// anything else that supports jumping. + /// + private static Expression MakeBlock(IList expressions) { + return new SpilledExpressionBlock(expressions); + } + } + + /// + /// A special subtype of BlockExpression that indicates to the compiler + /// that this block is a spilled expression and should not allow jumps in. + /// + internal sealed class SpilledExpressionBlock : BlockN { + internal SpilledExpressionBlock(IList expressions) + : base(expressions) { + } + internal override BlockExpression Rewrite(ReadOnlyCollection variables, Expression[] args) { + throw ContractUtils.Unreachable; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.cs new file mode 100644 index 00000000000..12298c86dd6 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/StackSpiller.cs @@ -0,0 +1,991 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + + /// + /// Expression rewriting to spill the CLR stack into temporary variables + /// in order to guarantee some properties of code generation, for + /// example that we always enter try block on empty stack. + /// + internal partial class StackSpiller { + + // Is the evaluation stack empty? + private enum Stack { + Empty, + NonEmpty + }; + + // Should the parent nodes be rewritten, and in what way? + // Designed so bitwise-or produces the correct result when merging two + // subtrees. In particular, SpillStack is preferred over Copy which is + // preferred over None. + // + // Values: + // None -> no rewrite needed + // Copy -> copy into a new node + // SpillStack -> spill stack into temps + [Flags] + private enum RewriteAction { + None = 0, + Copy = 1, + SpillStack = 3, + } + + // Result of a rewrite operation. Always contains an action and a node. + private struct Result { + internal readonly RewriteAction Action; + internal readonly Expression Node; + + internal Result(RewriteAction action, Expression node) { + Action = action; + Node = node; + } + } + + /// + /// The source of temporary variables + /// + private readonly TempMaker _tm = new TempMaker(); + + /// + /// Initial stack state. Normally empty, but when inlining the lambda + /// we might have a non-empty starting stack state. + /// + private readonly Stack _startingStack; + + /// + /// Lambda rewrite result. We need this for inlined lambdas to figure + /// out whether we need to guarentee it an empty stack. + /// + private RewriteAction _lambdaRewrite; + + /// + /// Analyzes a lambda, producing a new one that has correct invariants + /// for codegen. In particular, it spills the IL stack to temps in + /// places where it's invalid to have a non-empty stack (for example, + /// entering a try statement). + /// + internal static LambdaExpression AnalyzeLambda(LambdaExpression lambda) { + return lambda.Accept(new StackSpiller(Stack.Empty)); + } + + private StackSpiller(Stack stack) { + _startingStack = stack; + } + + // called by Expression.Accept + internal Expression Rewrite(Expression lambda) { + VerifyTemps(); + + // Lambda starts with an empty stack + Result body = RewriteExpressionFreeTemps(lambda.Body, _startingStack); + _lambdaRewrite = body.Action; + + VerifyTemps(); + + if (body.Action != RewriteAction.None) { + // Create a new scope for temps + // (none of these will be hoisted so there is no closure impact) + Expression newBody = body.Node; + if (_tm.Temps.Count > 0) { + newBody = Expression.Block(_tm.Temps, newBody); + } + + // Clone the lambda, replacing the body & variables + return new Expression(newBody, lambda.Name, lambda.TailCall, lambda.Parameters); + } + + return lambda; + } + + #region Expressions + + [Conditional("DEBUG")] + private static void VerifyRewrite(Result result, Expression node) { + Debug.Assert(result.Node != null); + + // (result.Action == RewriteAction.None) if and only if (node == result.Node) + Debug.Assert((result.Action == RewriteAction.None) ^ (node != result.Node), "rewrite action does not match node object identity"); + + // if the original node is an extension node, it should have been rewritten + Debug.Assert(result.Node.NodeType != ExpressionType.Extension, "extension nodes must be rewritten"); + + // if we have Copy, then node type must match + Debug.Assert( + result.Action != RewriteAction.Copy || node.NodeType == result.Node.NodeType || node.CanReduce, + "rewrite action does not match node object kind" + ); + + // New type must be reference assignable to the old type + // (our rewrites preserve type exactly, but the rules for rewriting + // an extension node are more lenient, see Expression.ReduceAndCheck()) + Debug.Assert( + TypeUtils.AreReferenceAssignable(node.Type, result.Node.Type), + "rewritten object must be reference assignable to the original type" + ); + } + + private Result RewriteExpressionFreeTemps(Expression expression, Stack stack) { + int mark = Mark(); + Result result = RewriteExpression(expression, stack); + Free(mark); + return result; + } + + // DynamicExpression + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "stack")] + private Result RewriteDynamicExpression(Expression expr, Stack stack) { + var node = (DynamicExpression)expr; + + // CallSite is on the stack + IArgumentProvider argNode = (IArgumentProvider)node; + ChildRewriter cr = new ChildRewriter(this, Stack.NonEmpty, argNode.ArgumentCount); + cr.AddArguments(argNode); + if (cr.Action == RewriteAction.SpillStack) { + RequireNoRefArgs(node.DelegateType.GetMethod("Invoke")); + } + return cr.Finish(cr.Rewrite ? node.Rewrite(cr[0, -1]) : expr); + } + + private Result RewriteIndexAssignment(BinaryExpression node, Stack stack) { + IndexExpression index = (IndexExpression)node.Left; + + ChildRewriter cr = new ChildRewriter(this, stack, 2 + index.Arguments.Count); + + cr.Add(index.Object); + cr.Add(index.Arguments); + cr.Add(node.Right); + + if (cr.Action == RewriteAction.SpillStack) { + RequireNotRefInstance(index.Object); + } + + if (cr.Rewrite) { + node = new AssignBinaryExpression( + new IndexExpression( + cr[0], // Object + index.Indexer, + cr[1, -2] // arguments + ), + cr[-1] // value + ); + } + + return cr.Finish(node); + } + + // BinaryExpression: AndAlso, OrElse + private Result RewriteLogicalBinaryExpression(Expression expr, Stack stack) { + BinaryExpression node = (BinaryExpression)expr; + + // Left expression runs on a stack as left by parent + Result left = RewriteExpression(node.Left, stack); + // ... and so does the right one + Result right = RewriteExpression(node.Right, stack); + //conversion is a lambda. stack state will be ignored. + Result conversion = RewriteExpression(node.Conversion, stack); + + RewriteAction action = left.Action | right.Action | conversion.Action; + if (action != RewriteAction.None) { + + // We don't have to worry about byref parameters here, because the + // factory doesn't allow it (it requires identical parameters and + // return type from the AndAlso/OrElse method) + + expr = BinaryExpression.Create( + node.NodeType, + left.Node, + right.Node, + node.Type, + node.Method, + (LambdaExpression)conversion.Node + ); + } + return new Result(action, expr); + } + + private Result RewriteReducibleExpression(Expression expr, Stack stack) { + Result result = RewriteExpression(expr.Reduce(), stack); + // it's at least Copy because we reduced the node + return new Result(result.Action | RewriteAction.Copy, result.Node); + } + + // BinaryExpression + private Result RewriteBinaryExpression(Expression expr, Stack stack) { + BinaryExpression node = (BinaryExpression)expr; + + ChildRewriter cr = new ChildRewriter(this, stack, 3); + // Left expression executes on the stack as left by parent + cr.Add(node.Left); + // Right expression always has non-empty stack (left is on it) + cr.Add(node.Right); + // conversion is a lambda, stack state will be ignored + cr.Add(node.Conversion); + + if (cr.Action == RewriteAction.SpillStack) { + RequireNoRefArgs(node.Method); + } + + return cr.Finish(cr.Rewrite ? + BinaryExpression.Create( + node.NodeType, + cr[0], + cr[1], + node.Type, + node.Method, + (LambdaExpression)cr[2]) : + expr); + } + + // variable assignment + private Result RewriteVariableAssignment(BinaryExpression node, Stack stack) { + // Expression is evaluated on a stack in current state + Result right = RewriteExpression(node.Right, stack); + if (right.Action != RewriteAction.None) { + node = Expression.Assign(node.Left, right.Node); + } + return new Result(right.Action, node); + } + + private Result RewriteAssignBinaryExpression(Expression expr, Stack stack) { + var node = (BinaryExpression)expr; + + switch (node.Left.NodeType) { + case ExpressionType.Index: + return RewriteIndexAssignment(node, stack); + case ExpressionType.MemberAccess: + return RewriteMemberAssignment(node, stack); + case ExpressionType.Parameter: + return RewriteVariableAssignment(node, stack); + case ExpressionType.Extension: + return RewriteExtensionAssignment(node, stack); + default: + throw Error.InvalidLvalue(node.Left.NodeType); + } + } + + private Result RewriteExtensionAssignment(BinaryExpression node, Stack stack) { + node = Expression.Assign(node.Left.ReduceExtensions(), node.Right); + Result result = RewriteAssignBinaryExpression(node, stack); + // it's at least Copy because we reduced the node + return new Result(result.Action | RewriteAction.Copy, result.Node); + } + + // LambdaExpression + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "stack")] + private static Result RewriteLambdaExpression(Expression expr, Stack stack) { + LambdaExpression node = (LambdaExpression)expr; + + // Call back into the rewriter + expr = AnalyzeLambda(node); + + // If the lambda gets rewritten, we don't need to spill the stack, + // but we do need to rebuild the tree above us so it includes the new node. + RewriteAction action = (expr == node) ? RewriteAction.None : RewriteAction.Copy; + + return new Result(action, expr); + } + + // ConditionalExpression + private Result RewriteConditionalExpression(Expression expr, Stack stack) { + ConditionalExpression node = (ConditionalExpression)expr; + // Test executes at the stack as left by parent + Result test = RewriteExpression(node.Test, stack); + // The test is popped by conditional jump so branches execute + // at the stack as left by parent too. + Result ifTrue = RewriteExpression(node.IfTrue, stack); + Result ifFalse = RewriteExpression(node.IfFalse, stack); + + RewriteAction action = test.Action | ifTrue.Action | ifFalse.Action; + if (action != RewriteAction.None) { + expr = Expression.Condition(test.Node, ifTrue.Node, ifFalse.Node, node.Type); + } + + return new Result(action, expr); + } + + // member assignment + private Result RewriteMemberAssignment(BinaryExpression node, Stack stack) { + MemberExpression lvalue = (MemberExpression)node.Left; + + ChildRewriter cr = new ChildRewriter(this, stack, 2); + + // If there's an instance, it executes on the stack in current state + // and rest is executed on non-empty stack. + // Otherwise the stack is left unchaged. + cr.Add(lvalue.Expression); + + cr.Add(node.Right); + + if (cr.Action == RewriteAction.SpillStack) { + RequireNotRefInstance(lvalue.Expression); + } + + if (cr.Rewrite) { + return cr.Finish( + new AssignBinaryExpression( + MemberExpression.Make(cr[0], lvalue.Member), + cr[1] + ) + ); + } + return new Result(RewriteAction.None, node); + } + + // MemberExpression + private Result RewriteMemberExpression(Expression expr, Stack stack) { + MemberExpression node = (MemberExpression)expr; + + // Expression is emitted on top of the stack in current state + Result expression = RewriteExpression(node.Expression, stack); + if (expression.Action != RewriteAction.None) { + if (expression.Action == RewriteAction.SpillStack && + node.Member.MemberType == MemberTypes.Property) { + // Only need to validate propreties because reading a field + // is always side-effect free. + RequireNotRefInstance(node.Expression); + } + expr = MemberExpression.Make(expression.Node, node.Member); + } + return new Result(expression.Action, expr); + } + + //RewriteIndexExpression + private Result RewriteIndexExpression(Expression expr, Stack stack) { + IndexExpression node = (IndexExpression)expr; + + ChildRewriter cr = new ChildRewriter(this, stack, node.Arguments.Count + 1); + + // For instance methods, the instance executes on the + // stack as is, but stays on the stack, making it non-empty. + cr.Add(node.Object); + cr.Add(node.Arguments); + + if (cr.Action == RewriteAction.SpillStack) { + RequireNotRefInstance(node.Object); + } + + if (cr.Rewrite) { + expr = new IndexExpression( + cr[0], + node.Indexer, + cr[1, -1] + ); + } + + return cr.Finish(expr); + } + + // MethodCallExpression + private Result RewriteMethodCallExpression(Expression expr, Stack stack) { + MethodCallExpression node = (MethodCallExpression)expr; + + ChildRewriter cr = new ChildRewriter(this, stack, node.Arguments.Count + 1); + + // For instance methods, the instance executes on the + // stack as is, but stays on the stack, making it non-empty. + cr.Add(node.Object); + + cr.AddArguments(node); + + if (cr.Action == RewriteAction.SpillStack) { + RequireNotRefInstance(node.Object); + RequireNoRefArgs(node.Method); + } + + return cr.Finish(cr.Rewrite ? node.Rewrite(cr[0], cr[1, -1]) : expr); + } + + // NewArrayExpression + private Result RewriteNewArrayExpression(Expression expr, Stack stack) { + NewArrayExpression node = (NewArrayExpression)expr; + + if (node.NodeType == ExpressionType.NewArrayInit) { + // In a case of array construction with element initialization + // the element expressions are never emitted on an empty stack because + // the array reference and the index are on the stack. + stack = Stack.NonEmpty; + } else { + // In a case of NewArrayBounds we make no modifications to the stack + // before emitting bounds expressions. + } + + ChildRewriter cr = new ChildRewriter(this, stack, node.Expressions.Count); + cr.Add(node.Expressions); + + if (cr.Rewrite) { + Type element = node.Type.GetElementType(); + if (node.NodeType == ExpressionType.NewArrayInit) { + expr = Expression.NewArrayInit(element, cr[0, -1]); + } else { + expr = Expression.NewArrayBounds(element, cr[0, -1]); + } + } + + return cr.Finish(expr); + } + + // InvocationExpression + private Result RewriteInvocationExpression(Expression expr, Stack stack) { + InvocationExpression node = (InvocationExpression)expr; + + ChildRewriter cr; + + // See if the lambda will be inlined + LambdaExpression lambda = node.LambdaOperand; + if (lambda != null) { + // Arguments execute on current stack + cr = new ChildRewriter(this, stack, node.Arguments.Count); + cr.Add(node.Arguments); + + if (cr.Action == RewriteAction.SpillStack) { + RequireNoRefArgs(Expression.GetInvokeMethod(node.Expression)); + } + + // Lambda body also executes on current stack + var spiller = new StackSpiller(stack); + lambda = lambda.Accept(spiller); + + if (cr.Rewrite || spiller._lambdaRewrite != RewriteAction.None) { + node = new InvocationExpression(lambda, cr[0, -1], node.Type); + } + + Result result = cr.Finish(node); + return new Result(result.Action | spiller._lambdaRewrite, result.Node); + } + + cr = new ChildRewriter(this, stack, node.Arguments.Count + 1); + + // first argument starts on stack as provided + cr.Add(node.Expression); + + // rest of arguments have non-empty stack (delegate instance on the stack) + cr.Add(node.Arguments); + + if (cr.Action == RewriteAction.SpillStack) { + RequireNoRefArgs(Expression.GetInvokeMethod(node.Expression)); + } + + return cr.Finish(cr.Rewrite ? new InvocationExpression(cr[0], cr[1, -1], node.Type) : expr); + } + + // NewExpression + private Result RewriteNewExpression(Expression expr, Stack stack) { + NewExpression node = (NewExpression)expr; + + // The first expression starts on a stack as provided by parent, + // rest are definitely non-emtpy (which ChildRewriter guarantees) + ChildRewriter cr = new ChildRewriter(this, stack, node.Arguments.Count); + cr.AddArguments(node); + + if (cr.Action == RewriteAction.SpillStack) { + RequireNoRefArgs(node.Constructor); + } + + return cr.Finish(cr.Rewrite ? new NewExpression(node.Constructor, cr[0, -1], node.Members) : expr); + } + + // TypeBinaryExpression + private Result RewriteTypeBinaryExpression(Expression expr, Stack stack) { + TypeBinaryExpression node = (TypeBinaryExpression)expr; + // The expression is emitted on top of current stack + Result expression = RewriteExpression(node.Expression, stack); + if (expression.Action != RewriteAction.None) { + if (node.NodeType == ExpressionType.TypeIs) { + expr = Expression.TypeIs(expression.Node, node.TypeOperand); + } else { + expr = Expression.TypeEqual(expression.Node, node.TypeOperand); + } + } + return new Result(expression.Action, expr); + } + + // Throw + private Result RewriteThrowUnaryExpression(Expression expr, Stack stack) { + UnaryExpression node = (UnaryExpression)expr; + + // Throw statement itself does not care about the stack + // but it will empty the stack and it may cause stack misbalance + // it so we need to restore stack after unconditional throw to make JIT happy + // this has an effect of executing Throw on an empty stack. + + Result value = RewriteExpressionFreeTemps(node.Operand, Stack.Empty); + RewriteAction action = value.Action; + + if (stack != Stack.Empty) { + action = RewriteAction.SpillStack; + } + + if (action != RewriteAction.None) { + expr = Expression.Throw(value.Node, node.Type); + } + + return new Result(action, expr); + } + + // UnaryExpression + private Result RewriteUnaryExpression(Expression expr, Stack stack) { + UnaryExpression node = (UnaryExpression)expr; + + Debug.Assert(node.NodeType != ExpressionType.Quote, "unexpected Quote"); + Debug.Assert(node.NodeType != ExpressionType.Throw, "unexpected Throw"); + + // Operand is emitted on top of the stack as is + Result expression = RewriteExpression(node.Operand, stack); + + if (expression.Action == RewriteAction.SpillStack) { + RequireNoRefArgs(node.Method); + } + + if (expression.Action != RewriteAction.None) { + expr = new UnaryExpression(node.NodeType, expression.Node, node.Type, node.Method); + } + return new Result(expression.Action, expr); + } + + // RewriteListInitExpression + private Result RewriteListInitExpression(Expression expr, Stack stack) { + ListInitExpression node = (ListInitExpression)expr; + + //ctor runs on initial stack + Result newResult = RewriteExpression(node.NewExpression, stack); + Expression rewrittenNew = newResult.Node; + RewriteAction action = newResult.Action; + + ReadOnlyCollection inits = node.Initializers; + + ChildRewriter[] cloneCrs = new ChildRewriter[inits.Count]; + + for (int i = 0; i < inits.Count; i++) { + ElementInit init = inits[i]; + + //initializers all run on nonempty stack + ChildRewriter cr = new ChildRewriter(this, Stack.NonEmpty, init.Arguments.Count); + cr.Add(init.Arguments); + + action |= cr.Action; + cloneCrs[i] = cr; + } + + switch (action) { + case RewriteAction.None: + break; + case RewriteAction.Copy: + ElementInit[] newInits = new ElementInit[inits.Count]; + for (int i = 0; i < inits.Count; i++) { + ChildRewriter cr = cloneCrs[i]; + if (cr.Action == RewriteAction.None) { + newInits[i] = inits[i]; + } else { + newInits[i] = Expression.ElementInit(inits[i].AddMethod, cr[0, -1]); + } + } + expr = Expression.ListInit((NewExpression)rewrittenNew, new TrueReadOnlyCollection(newInits)); + break; + case RewriteAction.SpillStack: + RequireNotRefInstance(node.NewExpression); + + ParameterExpression tempNew = MakeTemp(rewrittenNew.Type); + Expression[] comma = new Expression[inits.Count + 2]; + comma[0] = Expression.Assign(tempNew, rewrittenNew); + + for (int i = 0; i < inits.Count; i++) { + ChildRewriter cr = cloneCrs[i]; + Result add = cr.Finish(Expression.Call(tempNew, inits[i].AddMethod, cr[0, -1])); + comma[i + 1] = add.Node; + } + comma[inits.Count + 1] = tempNew; + expr = MakeBlock(comma); + break; + default: + throw ContractUtils.Unreachable; + } + + return new Result(action, expr); + } + + // RewriteMemberInitExpression + private Result RewriteMemberInitExpression(Expression expr, Stack stack) { + MemberInitExpression node = (MemberInitExpression)expr; + + //ctor runs on original stack + Result result = RewriteExpression(node.NewExpression, stack); + Expression rewrittenNew = result.Node; + RewriteAction action = result.Action; + + ReadOnlyCollection bindings = node.Bindings; + BindingRewriter[] bindingRewriters = new BindingRewriter[bindings.Count]; + for (int i = 0; i < bindings.Count; i++) { + MemberBinding binding = bindings[i]; + //bindings run on nonempty stack + BindingRewriter rewriter = BindingRewriter.Create(binding, this, Stack.NonEmpty); + bindingRewriters[i] = rewriter; + action |= rewriter.Action; + } + + switch (action) { + case RewriteAction.None: + break; + case RewriteAction.Copy: + MemberBinding[] newBindings = new MemberBinding[bindings.Count]; + for (int i = 0; i < bindings.Count; i++) { + newBindings[i] = bindingRewriters[i].AsBinding(); + } + expr = Expression.MemberInit((NewExpression)rewrittenNew, new TrueReadOnlyCollection(newBindings)); + break; + case RewriteAction.SpillStack: + RequireNotRefInstance(node.NewExpression); + + ParameterExpression tempNew = MakeTemp(rewrittenNew.Type); + Expression[] comma = new Expression[bindings.Count + 2]; + comma[0] = Expression.Assign(tempNew, rewrittenNew); + for (int i = 0; i < bindings.Count; i++) { + BindingRewriter cr = bindingRewriters[i]; + Expression initExpr = cr.AsExpression(tempNew); + comma[i + 1] = initExpr; + } + comma[bindings.Count + 1] = tempNew; + expr = MakeBlock(comma); + break; + default: + throw ContractUtils.Unreachable; + } + return new Result(action, expr); + } + + #endregion + + #region Statements + + // Block + private Result RewriteBlockExpression(Expression expr, Stack stack) { + BlockExpression node = (BlockExpression)expr; + + int count = node.ExpressionCount; + RewriteAction action = RewriteAction.None; + Expression[] clone = null; + for (int i = 0; i < count; i++) { + Expression expression = node.GetExpression(i); + // All statements within the block execute at the + // same stack state. + Result rewritten = RewriteExpression(expression, stack); + action |= rewritten.Action; + + if (clone == null && rewritten.Action != RewriteAction.None) { + clone = Clone(node.Expressions, i); + } + + if (clone != null) { + clone[i] = rewritten.Node; + } + } + + if (action != RewriteAction.None) { + // okay to wrap since we know no one can mutate the clone array + expr = node.Rewrite(null, clone); + } + return new Result(action, expr); + } + + // LabelExpression + private Result RewriteLabelExpression(Expression expr, Stack stack) { + LabelExpression node = (LabelExpression)expr; + + Result expression = RewriteExpression(node.DefaultValue, stack); + if (expression.Action != RewriteAction.None) { + expr = Expression.Label(node.Target, expression.Node); + } + return new Result(expression.Action, expr); + } + + // LoopStatement + private Result RewriteLoopExpression(Expression expr, Stack stack) { + LoopExpression node = (LoopExpression)expr; + + // The loop statement requires empty stack for itself, so it + // can guarantee it to the child nodes. + Result body = RewriteExpression(node.Body, Stack.Empty); + + RewriteAction action = body.Action; + + // However, the loop itself requires that it executes on an empty stack + // so we need to rewrite if the stack is not empty. + if (stack != Stack.Empty) { + action = RewriteAction.SpillStack; + } + + if (action != RewriteAction.None) { + expr = new LoopExpression(body.Node, node.BreakLabel, node.ContinueLabel); + } + return new Result(action, expr); + } + + // GotoExpression + // Note: goto does not necessarily need an empty stack. We could always + // emit it as a "leave" which would clear the stack for us. That would + // prevent us from doing certain optimizations we might want to do, + // however, like the switch-case-goto pattern. For now, be conservative + private Result RewriteGotoExpression(Expression expr, Stack stack) { + GotoExpression node = (GotoExpression)expr; + + // Goto requires empty stack to execute so the expression is + // going to execute on an empty stack. + Result value = RewriteExpressionFreeTemps(node.Value, Stack.Empty); + + // However, the statement itself needs an empty stack for itself + // so if stack is not empty, rewrite to empty the stack. + RewriteAction action = value.Action; + if (stack != Stack.Empty) { + action = RewriteAction.SpillStack; + } + + if (action != RewriteAction.None) { + expr = Expression.MakeGoto(node.Kind, node.Target, value.Node, node.Type); + } + return new Result(action, expr); + } + + // SwitchStatement + private Result RewriteSwitchExpression(Expression expr, Stack stack) { + SwitchExpression node = (SwitchExpression)expr; + + // The switch statement test is emitted on the stack in current state + Result switchValue = RewriteExpressionFreeTemps(node.SwitchValue, stack); + + RewriteAction action = switchValue.Action; + ReadOnlyCollection cases = node.Cases; + SwitchCase[] clone = null; + for (int i = 0; i < cases.Count; i++) { + SwitchCase @case = cases[i]; + + Expression[] cloneTests = null; + ReadOnlyCollection testValues = @case.TestValues; + for (int j = 0; j < testValues.Count; j++) { + // All tests execute at the same stack state as the switch. + // This is guarenteed by the compiler (to simplify spilling) + Result test = RewriteExpression(testValues[j], stack); + action |= test.Action; + + if (cloneTests == null && test.Action != RewriteAction.None) { + cloneTests = Clone(testValues, j); + } + + if (cloneTests != null) { + cloneTests[j] = test.Node; + } + } + + // And all the cases also run on the same stack level. + Result body = RewriteExpression(@case.Body, stack); + action |= body.Action; + + if (body.Action != RewriteAction.None || cloneTests != null) { + if (cloneTests != null) { + testValues = new ReadOnlyCollection(cloneTests); + } + @case = new SwitchCase(body.Node, testValues); + + if (clone == null) { + clone = Clone(cases, i); + } + } + + if (clone != null) { + clone[i] = @case; + } + } + + // default body also runs on initial stack + Result defaultBody = RewriteExpression(node.DefaultBody, stack); + action |= defaultBody.Action; + + if (action != RewriteAction.None) { + if (clone != null) { + // okay to wrap because we aren't modifying the array + cases = new ReadOnlyCollection(clone); + } + + expr = new SwitchExpression(node.Type, switchValue.Node, defaultBody.Node, node.Comparison, cases); + } + + return new Result(action, expr); + } + + // TryStatement + private Result RewriteTryExpression(Expression expr, Stack stack) { + TryExpression node = (TryExpression)expr; + + // Try statement definitely needs an empty stack so its + // child nodes execute at empty stack. + Result body = RewriteExpression(node.Body, Stack.Empty); + ReadOnlyCollection handlers = node.Handlers; + CatchBlock[] clone = null; + + RewriteAction action = body.Action; + if (handlers != null) { + for (int i = 0; i < handlers.Count; i++) { + RewriteAction curAction = body.Action; + + CatchBlock handler = handlers[i]; + + Expression filter = handler.Filter; + if (handler.Filter != null) { + // our code gen saves the incoming filter value and provides it as a varaible so the stack is empty + Result rfault = RewriteExpression(handler.Filter, Stack.Empty); + action |= rfault.Action; + curAction |= rfault.Action; + filter = rfault.Node; + } + + // Catch block starts with an empty stack (guaranteed by TryStatement) + Result rbody = RewriteExpression(handler.Body, Stack.Empty); + action |= rbody.Action; + curAction |= rbody.Action; + + if (curAction != RewriteAction.None) { + handler = Expression.MakeCatchBlock(handler.Test, handler.Variable, rbody.Node, filter); + + if (clone == null) { + clone = Clone(handlers, i); + } + } + + if (clone != null) { + clone[i] = handler; + } + } + } + + Result fault = RewriteExpression(node.Fault, Stack.Empty); + action |= fault.Action; + + Result @finally = RewriteExpression(node.Finally, Stack.Empty); + action |= @finally.Action; + + // If the stack is initially not empty, rewrite to spill the stack + if (stack != Stack.Empty) { + action = RewriteAction.SpillStack; + } + + if (action != RewriteAction.None) { + if (clone != null) { + // okay to wrap because we aren't modifying the array + handlers = new ReadOnlyCollection(clone); + } + + expr = new TryExpression(node.Type, body.Node, @finally.Node, fault.Node, handlers); + } + return new Result(action, expr); + } + + private Result RewriteExtensionExpression(Expression expr, Stack stack) { + Result result = RewriteExpression(expr.ReduceExtensions(), stack); + // it's at least Copy because we reduced the node + return new Result(result.Action | RewriteAction.Copy, result.Node); + } + + #endregion + + #region Cloning + + /// + /// Will clone an IList into an array of the same size, and copy + /// all vaues up to (and NOT including) the max index + /// + /// The cloned array. + private static T[] Clone(ReadOnlyCollection original, int max) { + Debug.Assert(original != null); + Debug.Assert(max < original.Count); + + T[] clone = new T[original.Count]; + for (int j = 0; j < max; j++) { + clone[j] = original[j]; + } + return clone; + } + + #endregion + + /// + /// If we are spilling, requires that there are no byref arguments to + /// the method call. + /// + /// Used for: + /// NewExpression, + /// MethodCallExpression, + /// InvocationExpression, + /// DynamicExpression, + /// UnaryExpression, + /// BinaryExpression. + /// + /// + /// We could support this if spilling happened later in the compiler. + /// Other expressions that can emit calls with arguments (such as + /// ListInitExpression and IndexExpression) don't allow byref arguments. + /// + private static void RequireNoRefArgs(MethodBase method) { + if (method != null && method.GetParametersCached().Any(p => p.ParameterType.IsByRef)) { + throw Error.TryNotSupportedForMethodsWithRefArgs(method); + } + } + + /// + /// Requires that the instance is not a value type (primitive types are + /// okay because they're immutable). + /// + /// Used for: + /// MethodCallExpression, + /// MemberExpression (for properties), + /// IndexExpression, + /// ListInitExpression, + /// MemberInitExpression, + /// assign to MemberExpression, + /// assign to IndexExpression. + /// + /// + /// We could support this if spilling happened later in the compiler. + /// + private static void RequireNotRefInstance(Expression instance) { + // Primitive value types are okay because they are all readonly, + // but we can't rely on this for non-primitive types. So we throw + // NotSupported. + if (instance != null && instance.Type.IsValueType && Type.GetTypeCode(instance.Type) == TypeCode.Object) { + throw Error.TryNotSupportedForValueTypeInstances(instance.Type); + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/SymbolDocumentGenerator.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/SymbolDocumentGenerator.cs new file mode 100644 index 00000000000..cb0775cd49c --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/SymbolDocumentGenerator.cs @@ -0,0 +1,76 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.SymbolStore; +#if CODEPLEX_40 +using System.Linq.Expressions; +using System.Linq.Expressions.Compiler; +#else +using Microsoft.Linq.Expressions; +using Microsoft.Linq.Expressions.Compiler; +#endif +using System.Reflection; +using System.Reflection.Emit; +#if CODEPLEX_40 +using ILGenerator = System.Linq.Expressions.Compiler.OffsetTrackingILGenerator; +#else +using ILGenerator = Microsoft.Linq.Expressions.Compiler.OffsetTrackingILGenerator; +#endif + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + /// + /// Generator of PDB debugging information for expression trees. + /// + internal sealed class SymbolDocumentGenerator : DebugInfoGenerator { + private Dictionary _symbolWriters; + + private ISymbolDocumentWriter GetSymbolWriter(MethodBuilder method, SymbolDocumentInfo document) { + ISymbolDocumentWriter result; + if (_symbolWriters == null) { + _symbolWriters = new Dictionary(); + } + + if (!_symbolWriters.TryGetValue(document, out result)) { + result = ((ModuleBuilder)method.Module).DefineDocument(document.FileName, document.Language, document.LanguageVendor, SymbolGuids.DocumentType_Text); + _symbolWriters.Add(document, result); + } + + return result; + } + + internal override void MarkSequencePoint(LambdaExpression method, MethodBase methodBase, ILGenerator ilg, DebugInfoExpression sequencePoint) { + MethodBuilder builder = methodBase as MethodBuilder; + if (builder != null) { + ilg.MarkSequencePoint(GetSymbolWriter(builder, sequencePoint.Document), sequencePoint.StartLine, sequencePoint.StartColumn, sequencePoint.EndLine, sequencePoint.EndColumn); + } + } + + public override void MarkSequencePoint(LambdaExpression method, int ilOffset, DebugInfoExpression sequencePoint) { + Debug.Assert(false); + } + + internal override void SetLocalName(LocalBuilder localBuilder, string name) { + localBuilder.SetLocalSymInfo(name); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/VariableBinder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/VariableBinder.cs new file mode 100644 index 00000000000..fb01051b8e3 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/VariableBinder.cs @@ -0,0 +1,246 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Linq.Expressions.Compiler { +#else +namespace Microsoft.Linq.Expressions.Compiler { +#endif + /// + /// Determines if variables are closed over in nested lambdas and need to + /// be hoisted. + /// + internal sealed class VariableBinder : ExpressionVisitor { + private readonly AnalyzedTree _tree = new AnalyzedTree(); + private readonly Stack _scopes = new Stack(); + private readonly Stack _constants = new Stack(); + private bool _inQuote; + + internal static AnalyzedTree Bind(LambdaExpression lambda) { + var binder = new VariableBinder(); + binder.Visit(lambda); + return binder._tree; + } + + private VariableBinder() { + } + + protected internal override Expression VisitConstant(ConstantExpression node) { + // If we're in Quote, we can ignore constants completely + if (_inQuote) { + return node; + } + + // Constants that can be emitted into IL don't need to be stored on + // the delegate + if (ILGen.CanEmitConstant(node.Value, node.Type)) { + return node; + } + + _constants.Peek().AddReference(node.Value, node.Type); + return node; + } + + protected internal override Expression VisitUnary(UnaryExpression node) { + if (node.NodeType == ExpressionType.Quote) { + bool savedInQuote = _inQuote; + _inQuote = true; + Visit(node.Operand); + _inQuote = savedInQuote; + } else { + Visit(node.Operand); + } + return node; + } + + protected internal override Expression VisitLambda(Expression node) { + _scopes.Push(_tree.Scopes[node] = new CompilerScope(node, true)); + _constants.Push(_tree.Constants[node] = new BoundConstants()); + Visit(MergeScopes(node)); + _constants.Pop(); + _scopes.Pop(); + return node; + } + + protected internal override Expression VisitInvocation(InvocationExpression node) { + LambdaExpression lambda = node.LambdaOperand; + + // optimization: inline code for literal lambda's directly + if (lambda != null) { + // visit the lambda, but treat it more like a scope + _scopes.Push(_tree.Scopes[lambda] = new CompilerScope(lambda, false)); + Visit(MergeScopes(lambda)); + _scopes.Pop(); + // visit the invoke's arguments + Visit(node.Arguments); + return node; + } + + return base.VisitInvocation(node); + } + + protected internal override Expression VisitBlock(BlockExpression node) { + if (node.Variables.Count == 0) { + Visit(node.Expressions); + return node; + } + _scopes.Push(_tree.Scopes[node] = new CompilerScope(node, false)); + Visit(MergeScopes(node)); + _scopes.Pop(); + return node; + } + + protected override CatchBlock VisitCatchBlock(CatchBlock node) { + if (node.Variable == null) { + Visit(node.Body); + return node; + } + _scopes.Push(_tree.Scopes[node] = new CompilerScope(node, false)); + Visit(node.Body); + _scopes.Pop(); + return node; + } + + // If the immediate child is another scope, merge it into this one + // This is an optimization to save environment allocations and + // array accesses. + private ReadOnlyCollection MergeScopes(Expression node) { + ReadOnlyCollection body; + var lambda = node as LambdaExpression; + if (lambda != null) { + body = new ReadOnlyCollection(new[] { lambda.Body }); + } else { + body = ((BlockExpression)node).Expressions; + } + + var currentScope = _scopes.Peek(); + + // A block body is mergeable if the body only contains one single block node containing variables, + // and the child block has the same type as the parent block. + while (body.Count == 1 && body[0].NodeType == ExpressionType.Block) { + var block = (BlockExpression)body[0]; + + if (block.Variables.Count > 0) { + // Make sure none of the variables are shadowed. If any + // are, we can't merge it. + foreach (var v in block.Variables) { + if (currentScope.Definitions.ContainsKey(v)) { + return body; + } + } + + // Otherwise, merge it + if (currentScope.MergedScopes == null) { + currentScope.MergedScopes = new Set(ReferenceEqualityComparer.Instance); + } + currentScope.MergedScopes.Add(block); + foreach (var v in block.Variables) { + currentScope.Definitions.Add(v, VariableStorageKind.Local); + } + } + node = block; + body = block.Expressions; + } + return body; + } + + + protected internal override Expression VisitParameter(ParameterExpression node) { + Reference(node, VariableStorageKind.Local); + + // + // Track reference count so we can emit it in a more optimal way if + // it is used a lot. + // + CompilerScope referenceScope = null; + foreach (CompilerScope scope in _scopes) { + // + // There are two times we care about references: + // 1. When we enter a lambda, we want to cache frequently + // used variables + // 2. When we enter a scope with closed-over variables, we + // want to cache it immediately when we allocate the + // closure slot for it + // + if (scope.IsMethod || scope.Definitions.ContainsKey(node)) { + referenceScope = scope; + break; + } + } + + Debug.Assert(referenceScope != null); + if (referenceScope.ReferenceCount == null) { + referenceScope.ReferenceCount = new Dictionary(); + } + + Helpers.IncrementCount(node, referenceScope.ReferenceCount); + return node; + } + + protected internal override Expression VisitRuntimeVariables(RuntimeVariablesExpression node) { + foreach (var v in node.Variables) { + // Force hoisting of these variables + Reference(v, VariableStorageKind.Hoisted); + } + return node; + } + + private void Reference(ParameterExpression node, VariableStorageKind storage) { + CompilerScope definition = null; + foreach (CompilerScope scope in _scopes) { + if (scope.Definitions.ContainsKey(node)) { + definition = scope; + break; + } + scope.NeedsClosure = true; + if (scope.IsMethod) { + storage = VariableStorageKind.Hoisted; + } + } + if (definition == null) { + throw Error.UndefinedVariable(node.Name, node.Type, CurrentLambdaName); + } + if (storage == VariableStorageKind.Hoisted) { + if (node.IsByRef) { + throw Error.CannotCloseOverByRef(node.Name, CurrentLambdaName); + } + definition.Definitions[node] = VariableStorageKind.Hoisted; + } + } + + private string CurrentLambdaName { + get { + foreach (var scope in _scopes) { + var lambda = scope.Node as LambdaExpression; + if (lambda != null) { + return lambda.Name; + } + } + throw ContractUtils.Unreachable; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/GlobalSuppressions.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/GlobalSuppressions.cs new file mode 100644 index 00000000000..72fe59d28d6 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/GlobalSuppressions.cs @@ -0,0 +1,28 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. +// +// To add a suppression to this file, right-click the message in the +// Error List, point to "Suppress Message(s)", and click +// "In Project Suppression File". +// You do not need to add suppressions to this file manually. + +#if CODEPLEX_40 +//UnhandledExpressionType is used by System.Linq.Expressions.OldExpressionVisitor +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Linq.Expressions.Error.#UnhandledExpressionType(System.Object)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Linq.Expressions.Strings.#UnhandledExpressionType(System.Object)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Linq.Expressions.Error.#InvalidNullValue(System.Object)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Linq.Expressions.Error.#InvalidObjectType(System.Object,System.Object)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Linq.Expressions.Error.#HomogenousAppDomainRequired()")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "System.Linq.Expressions.Strings.#HomogenousAppDomainRequired")] +#else +//UnhandledExpressionType is used by Microsoft.Linq.Expressions.OldExpressionVisitor +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Microsoft.Linq.Expressions.Error.#UnhandledExpressionType(System.Object)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Microsoft.Linq.Expressions.Strings.#UnhandledExpressionType(System.Object)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Microsoft.Linq.Expressions.Error.#InvalidNullValue(System.Object)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Microsoft.Linq.Expressions.Error.#InvalidObjectType(System.Object,System.Object)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Microsoft.Linq.Expressions.Error.#HomogenousAppDomainRequired()")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Microsoft.Linq.Expressions.Strings.#HomogenousAppDomainRequired")] +#endif +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "System.Runtime.CompilerServices.StrongBox`1.#System.Runtime.CompilerServices.IStrongBox.Value")] diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Microsoft.Scripting.Core.csproj b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Microsoft.Scripting.Core.csproj new file mode 100644 index 00000000000..766f3130950 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Microsoft.Scripting.Core.csproj @@ -0,0 +1,248 @@ + + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {2AE75F5A-CD1F-4925-9647-AF4D1C282FB4} + Library + Properties + true + System.Scripting + Microsoft.Scripting.Core +$(OutputPath)\Microsoft.Scripting.Core.XML + 1591 + 2.0 +$(SolutionDir)\Runtime\MSSharedLibKey.snk + true + SIGNED + true + $(ProgramFiles)\Microsoft Silverlight\2.0.40115.0 + 855638016 + + + pdbonly + true +$(SolutionDir)\..\Bin\fxcop\ + TRACE;$(SignedSym);MICROSOFT_SCRIPTING_CORE + prompt + 4 + true + true + -Microsoft.Usage#CA2209;+!Microsoft.Design#CA1012;-!Microsoft.Design#CA2210;+!Microsoft.Design#CA1040;+!Microsoft.Design#CA1005;+!Microsoft.Design#CA1020;-!Microsoft.Design#CA1021;+!Microsoft.Design#CA1010;+!Microsoft.Design#CA1011;+!Microsoft.Design#CA1009;+!Microsoft.Design#CA1050;+!Microsoft.Design#CA1026;+!Microsoft.Design#CA1019;+!Microsoft.Design#CA1031;+!Microsoft.Design#CA1047;+!Microsoft.Design#CA1000;+!Microsoft.Design#CA1048;+!Microsoft.Design#CA1051;+!Microsoft.Design#CA1002;+!Microsoft.Design#CA1061;+!Microsoft.Design#CA1006;+!Microsoft.Design#CA1046;+!Microsoft.Design#CA1045;+!Microsoft.Design#CA1065;+!Microsoft.Design#CA1038;+!Microsoft.Design#CA1008;+!Microsoft.Design#CA1028;+!Microsoft.Design#CA1064;-!Microsoft.Design#CA1004;+!Microsoft.Design#CA1035;+!Microsoft.Design#CA1063;+!Microsoft.Design#CA1032;+!Microsoft.Design#CA1023;+!Microsoft.Design#CA1033;+!Microsoft.Design#CA1039;+!Microsoft.Design#CA1016;+!Microsoft.Design#CA1014;+!Microsoft.Design#CA1017;+!Microsoft.Design#CA1018;+!Microsoft.Design#CA1027;+!Microsoft.Design#CA1059;+!Microsoft.Design#CA1060;+!Microsoft.Design#CA1034;+!Microsoft.Design#CA1013;+!Microsoft.Design#CA1036;+!Microsoft.Design#CA1044;+!Microsoft.Design#CA1041;+!Microsoft.Design#CA1025;+!Microsoft.Design#CA1052;+!Microsoft.Design#CA1053;+!Microsoft.Design#CA1057;+!Microsoft.Design#CA1058;+!Microsoft.Design#CA1001;+!Microsoft.Design#CA1049;+!Microsoft.Design#CA1054;+!Microsoft.Design#CA1056;+!Microsoft.Design#CA1055;+!Microsoft.Design#CA1030;+!Microsoft.Design#CA1003;+!Microsoft.Design#CA1007;+!Microsoft.Design#CA1043;+!Microsoft.Design#CA1024;+!Microsoft.Globalization#CA1301;+!Microsoft.Globalization#CA1302;+!Microsoft.Globalization#CA1308;+!Microsoft.Globalization#CA1306;+!Microsoft.Globalization#CA1304;+!Microsoft.Globalization#CA1305;+!Microsoft.Globalization#CA2101;+!Microsoft.Globalization#CA1300;+!Microsoft.Globalization#CA1307;+!Microsoft.Globalization#CA1309;+!Microsoft.Interoperability#CA1403;+!Microsoft.Interoperability#CA1406;+!Microsoft.Interoperability#CA1413;+!Microsoft.Interoperability#CA1402;+!Microsoft.Interoperability#CA1407;+!Microsoft.Interoperability#CA1404;+!Microsoft.Interoperability#CA1410;+!Microsoft.Interoperability#CA1411;+!Microsoft.Interoperability#CA1405;+!Microsoft.Interoperability#CA1409;+!Microsoft.Interoperability#CA1415;+!Microsoft.Interoperability#CA1408;+!Microsoft.Interoperability#CA1414;+!Microsoft.Interoperability#CA1412;+!Microsoft.Interoperability#CA1400;+!Microsoft.Interoperability#CA1401;+!Microsoft.Maintainability#CA1506;+!Microsoft.Maintainability#CA1502;+!Microsoft.Maintainability#CA1501;+!Microsoft.Maintainability#CA1505;+!Microsoft.Maintainability#CA1504;+!Microsoft.Maintainability#CA1500;+!Microsoft.Mobility#CA1600;+!Microsoft.Mobility#CA1601;-!Microsoft.Naming#CA1702;+!Microsoft.Naming#CA1700;+!Microsoft.Naming#CA1712;+!Microsoft.Naming#CA1713;+!Microsoft.Naming#CA1714;+!Microsoft.Naming#CA1709;-!Microsoft.Naming#CA1704;+!Microsoft.Naming#CA1708;+!Microsoft.Naming#CA1715;-!Microsoft.Naming#CA1710;-!Microsoft.Naming#CA1720;+!Microsoft.Naming#CA1707;+!Microsoft.Naming#CA1722;-!Microsoft.Naming#CA1711;+!Microsoft.Naming#CA1716;+!Microsoft.Naming#CA1717;+!Microsoft.Naming#CA1725;+!Microsoft.Naming#CA1719;+!Microsoft.Naming#CA1721;+!Microsoft.Naming#CA1701;+!Microsoft.Naming#CA1703;+!Microsoft.Naming#CA1724;-!Microsoft.Naming#CA1726;+!Microsoft.Performance#CA1809;+!Microsoft.Performance#CA1811;+!Microsoft.Performance#CA1812;+!Microsoft.Performance#CA1813;+!Microsoft.Performance#CA1823;+!Microsoft.Performance#CA1800;+!Microsoft.Performance#CA1805;+!Microsoft.Performance#CA1810;+!Microsoft.Performance#CA1824;+!Microsoft.Performance#CA1822;+!Microsoft.Performance#CA1815;+!Microsoft.Performance#CA1814;+!Microsoft.Performance#CA1819;+!Microsoft.Performance#CA1821;+!Microsoft.Performance#CA1804;+!Microsoft.Performance#CA1820;+!Microsoft.Performance#CA1802;+!Microsoft.Portability#CA1901;+!Microsoft.Portability#CA1900;+!Microsoft.Reliability#CA2001;+!Microsoft.Reliability#CA2002;+!Microsoft.Reliability#CA2003;+!Microsoft.Reliability#CA2004;+!Microsoft.Reliability#CA2006;+!Microsoft.Security#CA2116;+!Microsoft.Security#CA2117;+!Microsoft.Security#CA2105;+!Microsoft.Security#CA2115;+!Microsoft.Security#CA2102;+!Microsoft.Security#CA2104;+!Microsoft.Security#CA2122;+!Microsoft.Security#CA2114;+!Microsoft.Security#CA2123;+!Microsoft.Security#CA2111;+!Microsoft.Security#CA2108;+!Microsoft.Security#CA2107;+!Microsoft.Security#CA2103;+!Microsoft.Security#CA2118;+!Microsoft.Security#CA2109;+!Microsoft.Security#CA2119;+!Microsoft.Security#CA2106;+!Microsoft.Security#CA2112;+!Microsoft.Security#CA2120;+!Microsoft.Security#CA2121;+!Microsoft.Security#CA2126;+!Microsoft.Security#CA2124;+!Microsoft.Security#CA2127;+!Microsoft.Security#CA2128;+!Microsoft.Security#CA2129;+!Microsoft.Usage#CA2243;+!Microsoft.Usage#CA2236;+!Microsoft.Usage#CA1816;+!Microsoft.Usage#CA2227;+!Microsoft.Usage#CA2213;+!Microsoft.Usage#CA2216;+!Microsoft.Usage#CA2214;+!Microsoft.Usage#CA2222;+!Microsoft.Usage#CA1806;+!Microsoft.Usage#CA2217;+!Microsoft.Usage#CA2212;+!Microsoft.Usage#CA2219;+!Microsoft.Usage#CA2201;+!Microsoft.Usage#CA2228;+!Microsoft.Usage#CA2221;+!Microsoft.Usage#CA2220;+!Microsoft.Usage#CA2240;+!Microsoft.Usage#CA2229;+!Microsoft.Usage#CA2238;+!Microsoft.Usage#CA2207;+!Microsoft.Usage#CA2208;+!Microsoft.Usage#CA2235;+!Microsoft.Usage#CA2237;+!Microsoft.Usage#CA2232;+!Microsoft.Usage#CA2223;+!Microsoft.Usage#CA2211;+!Microsoft.Usage#CA2233;+!Microsoft.Usage#CA2225;+!Microsoft.Usage#CA2226;+!Microsoft.Usage#CA2231;+!Microsoft.Usage#CA2224;+!Microsoft.Usage#CA2218;+!Microsoft.Usage#CA2234;+!Microsoft.Usage#CA2239;+!Microsoft.Usage#CA2200;+!Microsoft.Usage#CA1801;+!Microsoft.Usage#CA2242;+!Microsoft.Usage#CA2205;+!Microsoft.Usage#CA2230 + + + + + true + full + false +$(SolutionDir)\..\Bin\Debug\ +$(OutputPath)\Microsoft.Scripting.Core.xml + DEBUG;TRACE;$(SignedSym);MICROSOFT_SCRIPTING_CORE + prompt + 4 + true + false + + + + + pdbonly + true +$(SolutionDir)\..\Bin\Release\ +$(OutputPath)\Microsoft.Scripting.Core.xml + TRACE;$(SignedSym);MICROSOFT_SCRIPTING_CORE + prompt + 4 + true + false + + + + + true +$(SolutionDir)\..\Bin\Silverlight Debug\ + TRACE;DEBUG;SILVERLIGHT;MICROSOFT_SCRIPTING_CORE + true + full + AnyCPU + false + prompt + true +$(OutputPath)\Microsoft.Scripting.Core.xml + 618 + true + + +$(SolutionDir)\..\Bin\Silverlight Release\ + TRACE;SILVERLIGHT;MICROSOFT_SCRIPTING_CORE +$(OutputPath)\Microsoft.Scripting.Core.xml + true + 618 + true + pdbonly + AnyCPU + prompt + true + + + + + + False + $(SilverlightPath)\mscorlib.dll + + + False + $(SilverlightPath)\System.dll + + + + + + + Properties\SilverlightVersion.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {8B0F1074-750E-4D64-BF23-A1E0F54261E5} + Microsoft.Scripting.ExtensionAttribute + + + + + Ast\System.Linq.Expressions.txt + + + + + + + + + + diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Microsoft.Scripting.ExtensionAttribute.csproj b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Microsoft.Scripting.ExtensionAttribute.csproj new file mode 100644 index 00000000000..863a5d01eeb --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Microsoft.Scripting.ExtensionAttribute.csproj @@ -0,0 +1,104 @@ + + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {8B0F1074-750E-4D64-BF23-A1E0F54261E5} + Library + Properties + Microsoft.Scripting.ExtensionAttribute + Microsoft.Scripting.ExtensionAttribute + 2.0 +$(SolutionDir)\Runtime\MSSharedLibKey.snk + true + SIGNED + true + 866123776 + $(ProgramFiles)\Microsoft Silverlight\2.0.40115.0 + + + pdbonly + true +$(SolutionDir)\..\Bin\fxcop\ + TRACE;$(SignedSym) + prompt + 4 + true + true + -Microsoft.Usage#CA2209;+!Microsoft.Design#CA1012;-!Microsoft.Design#CA2210;+!Microsoft.Design#CA1040;+!Microsoft.Design#CA1005;+!Microsoft.Design#CA1020;-!Microsoft.Design#CA1021;+!Microsoft.Design#CA1010;+!Microsoft.Design#CA1011;+!Microsoft.Design#CA1009;+!Microsoft.Design#CA1050;+!Microsoft.Design#CA1026;+!Microsoft.Design#CA1019;+!Microsoft.Design#CA1031;+!Microsoft.Design#CA1047;+!Microsoft.Design#CA1000;+!Microsoft.Design#CA1048;+!Microsoft.Design#CA1051;+!Microsoft.Design#CA1002;+!Microsoft.Design#CA1061;+!Microsoft.Design#CA1006;+!Microsoft.Design#CA1046;+!Microsoft.Design#CA1045;+!Microsoft.Design#CA1065;+!Microsoft.Design#CA1038;+!Microsoft.Design#CA1008;+!Microsoft.Design#CA1028;+!Microsoft.Design#CA1064;-!Microsoft.Design#CA1004;+!Microsoft.Design#CA1035;+!Microsoft.Design#CA1063;+!Microsoft.Design#CA1032;+!Microsoft.Design#CA1023;+!Microsoft.Design#CA1033;+!Microsoft.Design#CA1039;+!Microsoft.Design#CA1016;+!Microsoft.Design#CA1014;+!Microsoft.Design#CA1017;+!Microsoft.Design#CA1018;+!Microsoft.Design#CA1027;+!Microsoft.Design#CA1059;+!Microsoft.Design#CA1060;+!Microsoft.Design#CA1034;+!Microsoft.Design#CA1013;+!Microsoft.Design#CA1036;+!Microsoft.Design#CA1044;+!Microsoft.Design#CA1041;+!Microsoft.Design#CA1025;+!Microsoft.Design#CA1052;+!Microsoft.Design#CA1053;+!Microsoft.Design#CA1057;+!Microsoft.Design#CA1058;+!Microsoft.Design#CA1001;+!Microsoft.Design#CA1049;+!Microsoft.Design#CA1054;+!Microsoft.Design#CA1056;+!Microsoft.Design#CA1055;+!Microsoft.Design#CA1030;+!Microsoft.Design#CA1003;+!Microsoft.Design#CA1007;+!Microsoft.Design#CA1043;+!Microsoft.Design#CA1024;+!Microsoft.Globalization#CA1301;+!Microsoft.Globalization#CA1302;+!Microsoft.Globalization#CA1308;+!Microsoft.Globalization#CA1306;+!Microsoft.Globalization#CA1304;+!Microsoft.Globalization#CA1305;+!Microsoft.Globalization#CA2101;+!Microsoft.Globalization#CA1300;+!Microsoft.Globalization#CA1307;+!Microsoft.Globalization#CA1309;+!Microsoft.Interoperability#CA1403;+!Microsoft.Interoperability#CA1406;+!Microsoft.Interoperability#CA1413;+!Microsoft.Interoperability#CA1402;+!Microsoft.Interoperability#CA1407;+!Microsoft.Interoperability#CA1404;+!Microsoft.Interoperability#CA1410;+!Microsoft.Interoperability#CA1411;+!Microsoft.Interoperability#CA1405;+!Microsoft.Interoperability#CA1409;+!Microsoft.Interoperability#CA1415;+!Microsoft.Interoperability#CA1408;+!Microsoft.Interoperability#CA1414;+!Microsoft.Interoperability#CA1412;+!Microsoft.Interoperability#CA1400;+!Microsoft.Interoperability#CA1401;+!Microsoft.Maintainability#CA1506;+!Microsoft.Maintainability#CA1502;+!Microsoft.Maintainability#CA1501;+!Microsoft.Maintainability#CA1505;+!Microsoft.Maintainability#CA1504;+!Microsoft.Maintainability#CA1500;+!Microsoft.Mobility#CA1600;+!Microsoft.Mobility#CA1601;-!Microsoft.Naming#CA1702;+!Microsoft.Naming#CA1700;+!Microsoft.Naming#CA1712;+!Microsoft.Naming#CA1713;+!Microsoft.Naming#CA1714;+!Microsoft.Naming#CA1709;-!Microsoft.Naming#CA1704;+!Microsoft.Naming#CA1708;+!Microsoft.Naming#CA1715;-!Microsoft.Naming#CA1710;-!Microsoft.Naming#CA1720;+!Microsoft.Naming#CA1707;+!Microsoft.Naming#CA1722;-!Microsoft.Naming#CA1711;+!Microsoft.Naming#CA1716;+!Microsoft.Naming#CA1717;+!Microsoft.Naming#CA1725;+!Microsoft.Naming#CA1719;+!Microsoft.Naming#CA1721;+!Microsoft.Naming#CA1701;+!Microsoft.Naming#CA1703;+!Microsoft.Naming#CA1724;-!Microsoft.Naming#CA1726;+!Microsoft.Performance#CA1809;+!Microsoft.Performance#CA1811;+!Microsoft.Performance#CA1812;+!Microsoft.Performance#CA1813;+!Microsoft.Performance#CA1823;+!Microsoft.Performance#CA1800;+!Microsoft.Performance#CA1805;+!Microsoft.Performance#CA1810;+!Microsoft.Performance#CA1824;+!Microsoft.Performance#CA1822;+!Microsoft.Performance#CA1815;+!Microsoft.Performance#CA1814;+!Microsoft.Performance#CA1819;+!Microsoft.Performance#CA1821;+!Microsoft.Performance#CA1804;+!Microsoft.Performance#CA1820;+!Microsoft.Performance#CA1802;+!Microsoft.Portability#CA1901;+!Microsoft.Portability#CA1900;+!Microsoft.Reliability#CA2001;+!Microsoft.Reliability#CA2002;+!Microsoft.Reliability#CA2003;+!Microsoft.Reliability#CA2004;+!Microsoft.Reliability#CA2006;+!Microsoft.Security#CA2116;+!Microsoft.Security#CA2117;+!Microsoft.Security#CA2105;+!Microsoft.Security#CA2115;+!Microsoft.Security#CA2102;+!Microsoft.Security#CA2104;+!Microsoft.Security#CA2122;+!Microsoft.Security#CA2114;+!Microsoft.Security#CA2123;+!Microsoft.Security#CA2111;+!Microsoft.Security#CA2108;+!Microsoft.Security#CA2107;+!Microsoft.Security#CA2103;+!Microsoft.Security#CA2118;+!Microsoft.Security#CA2109;+!Microsoft.Security#CA2119;+!Microsoft.Security#CA2106;+!Microsoft.Security#CA2112;+!Microsoft.Security#CA2120;+!Microsoft.Security#CA2121;+!Microsoft.Security#CA2126;+!Microsoft.Security#CA2124;+!Microsoft.Security#CA2127;+!Microsoft.Security#CA2128;+!Microsoft.Security#CA2129;+!Microsoft.Usage#CA2243;+!Microsoft.Usage#CA2236;+!Microsoft.Usage#CA1816;+!Microsoft.Usage#CA2227;+!Microsoft.Usage#CA2213;+!Microsoft.Usage#CA2216;+!Microsoft.Usage#CA2214;+!Microsoft.Usage#CA2222;+!Microsoft.Usage#CA1806;+!Microsoft.Usage#CA2217;+!Microsoft.Usage#CA2212;+!Microsoft.Usage#CA2219;+!Microsoft.Usage#CA2201;+!Microsoft.Usage#CA2228;+!Microsoft.Usage#CA2221;+!Microsoft.Usage#CA2220;+!Microsoft.Usage#CA2240;+!Microsoft.Usage#CA2229;+!Microsoft.Usage#CA2238;+!Microsoft.Usage#CA2207;+!Microsoft.Usage#CA2208;+!Microsoft.Usage#CA2235;+!Microsoft.Usage#CA2237;+!Microsoft.Usage#CA2232;+!Microsoft.Usage#CA2223;+!Microsoft.Usage#CA2211;+!Microsoft.Usage#CA2233;+!Microsoft.Usage#CA2225;+!Microsoft.Usage#CA2226;+!Microsoft.Usage#CA2231;+!Microsoft.Usage#CA2224;+!Microsoft.Usage#CA2218;+!Microsoft.Usage#CA2234;+!Microsoft.Usage#CA2239;+!Microsoft.Usage#CA2200;+!Microsoft.Usage#CA1801;+!Microsoft.Usage#CA2242;+!Microsoft.Usage#CA2205;+!Microsoft.Usage#CA2230 + + + true + full + false +$(SolutionDir)\..\Bin\Debug\ + DEBUG;TRACE;$(SignedSym) + prompt + 4 + true + false + + + pdbonly + true +$(SolutionDir)\..\Bin\Release\ + TRACE;$(SignedSym) + prompt + 4 + true + false + 1929379840 + + + true +$(SolutionDir)\..\Bin\Silverlight Debug\ + TRACE;DEBUG;SILVERLIGHT + true + full + AnyCPU + false + prompt + true + 1591,618 + true + + +$(SolutionDir)\..\Bin\Silverlight Release\ + TRACE;SILVERLIGHT + true + 1591,618 + true + pdbonly + AnyCPU + prompt + true + + + + + False + $(SilverlightPath)\mscorlib.dll + + + False + $(SilverlightPath)\System.dll + + + + + Properties\SilverlightVersion.cs + + + + + + + + + + + + diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Properties/AssemblyInfo.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Properties/AssemblyInfo.cs new file mode 100644 index 00000000000..8760043dbb1 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Properties/AssemblyInfo.cs @@ -0,0 +1,73 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ + +#if CODEPLEX_40 +using System; +#else +using System; using Microsoft; +#endif +using System.Reflection; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + +using System.Runtime.InteropServices; +using System.Security; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Microsoft.Scripting")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Microsoft.Scripting")] +[assembly: AssemblyCopyright("� Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +[assembly: CLSCompliant(true)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("cabb8088-1370-43ca-ad47-1c32d3f7bd10")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: SecurityTransparent] + +[assembly: System.Resources.NeutralResourcesLanguage("en-US")] + +#if !SILVERLIGHT +[assembly: AssemblyVersion("0.9.6.10")] +[assembly: AssemblyFileVersion("1.0.0.00")] +[assembly: AssemblyInformationalVersion("1.0")] +[assembly: AllowPartiallyTrustedCallers] +#if CODEPLEX_40 +[assembly: SecurityRules(SecurityRuleSet.Level1)] +#endif +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Properties/ExtensionAssemblyInfo.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Properties/ExtensionAssemblyInfo.cs new file mode 100644 index 00000000000..b4d07215ed9 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Properties/ExtensionAssemblyInfo.cs @@ -0,0 +1,69 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ + +#if CODEPLEX_40 +using System; +#else +using System; using Microsoft; +#endif +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Microsoft.Scripting.ExtensionAttribute")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Microsoft.Scripting.ExtensionAttribute")] +[assembly: AssemblyCopyright("� Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +[assembly: CLSCompliant(true)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b828a36d-f568-48a7-9bdd-412b0a1bfa32")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: SecurityTransparent] + +[assembly: System.Resources.NeutralResourcesLanguage("en-US")] + +#if !SILVERLIGHT +[assembly: AssemblyVersion("2.0.0.0")] // shouldn't change, this assembly is unchanged. This is the version it originally shipped as. +[assembly: AssemblyFileVersion("1.0.0.00")] +[assembly: AssemblyInformationalVersion("1.0")] +[assembly: AllowPartiallyTrustedCallers] +#if CODEPLEX_40 +[assembly: SecurityRules(SecurityRuleSet.Level1)] +#endif +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Stubs.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Stubs.cs new file mode 100644 index 00000000000..25ef27c9f77 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Stubs.cs @@ -0,0 +1,213 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ + +#if CODEPLEX_40 +using System; +#else +using System; using Microsoft; +#endif +using System.Diagnostics; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if SILVERLIGHT // Stubs + +namespace System { + + /// + /// An application exception. + /// + public class ApplicationException : Exception { + private const int error = unchecked((int)0x80131600); + /// + /// The constructor. + /// + public ApplicationException() + : base("Application Exception") { + HResult = error; + } + + /// + /// The constructor. + /// + /// The message. + public ApplicationException(string message) + : base(message) { + HResult = error; + } + + /// + /// The constructor. + /// + /// The message. + /// The inner exception. + public ApplicationException(string message, Exception innerException) + : base(message, innerException) { + HResult = error; + } + } + + namespace Runtime.InteropServices { + /// + /// The Default Parameter Value Attribute. + /// + public sealed class DefaultParameterValueAttribute : Attribute { + /// + /// The constructor + /// + /// The value. + public DefaultParameterValueAttribute(object value) { } + } + } + + // We reference these namespaces via "using" + // We don't actually use them because the code is #if !SILVERLIGHT + // Rather than fix the usings all over the place, just define these here + namespace Runtime.Remoting { class Dummy {} } + namespace Security.Policy { class Dummy {} } + namespace Xml.XPath { class Dummy {} } + + namespace Reflection { + /// + /// PortableExecutableKinds enum. + /// + public enum PortableExecutableKinds { + /// + /// ILOnly + /// + ILOnly = 0 + } + + /// + /// ImageFileMachine enum. + /// + public enum ImageFileMachine { + /// + /// I386 + /// + I386 = 1 + } + } + + namespace ComponentModel { + + /// + /// The Warning exception. + /// + public class WarningException : SystemException { + /// + /// The constructor. + /// + /// The message. + public WarningException(string message) : base(message) { } + } + } + + /// + /// The serializable attribute. + /// + public class SerializableAttribute : Attribute { + } + + /// + /// Non serializable attribute. + /// + public class NonSerializedAttribute : Attribute { + } + + namespace Runtime.Serialization { + /// + /// ISerializable interface. + /// + public interface ISerializable { + } + } + + /// + /// The ConsoleColor enum. + /// + public enum ConsoleColor { + /// + /// Black. + /// + Black = 0, + /// + /// DarkBlue. + /// + DarkBlue = 1, + /// + /// DarkGreen. + /// + DarkGreen = 2, + /// + /// DaryCyan. + /// + DarkCyan = 3, + /// + /// DarkRed + /// + DarkRed = 4, + /// + /// DarkMagenta + /// + DarkMagenta = 5, + /// + /// DarkYellow + /// + DarkYellow = 6, + /// + /// Gray + /// + Gray = 7, + /// + /// DarkGray + /// + DarkGray = 8, + /// + /// Blue + /// + Blue = 9, + /// + /// Green + /// + Green = 10, + /// + /// Cyan + /// + Cyan = 11, + /// + /// Red + /// + Red = 12, + /// + /// Magenta + /// + Magenta = 13, + /// + /// Yellow + /// + Yellow = 14, + /// + /// White + /// + White = 15, + } + +} + +#endif diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/System.Core.csproj b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/System.Core.csproj new file mode 100644 index 00000000000..22938af0480 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/System.Core.csproj @@ -0,0 +1,253 @@ + + + + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {2AE75F5A-CD1F-4925-9647-AF4D1C282FB4} + Library + Properties + true + System.Scripting + System.Core +$(OutputPath)\System.Core.XML + 1591 + 2.0 +$(SolutionDir)\Runtime\MSSharedLibKey.snk + true + SIGNED + true + 855638016 + v4.0 + + + pdbonly + true +$(SolutionDir)\..\Bin\fxcop\ + TRACE;$(SignedSym) + prompt + 4 + true + true + -Microsoft.Usage#CA2209;+!Microsoft.Design#CA1012;-!Microsoft.Design#CA2210;+!Microsoft.Design#CA1040;+!Microsoft.Design#CA1005;+!Microsoft.Design#CA1020;-!Microsoft.Design#CA1021;+!Microsoft.Design#CA1010;+!Microsoft.Design#CA1011;+!Microsoft.Design#CA1009;+!Microsoft.Design#CA1050;+!Microsoft.Design#CA1026;+!Microsoft.Design#CA1019;+!Microsoft.Design#CA1031;+!Microsoft.Design#CA1047;+!Microsoft.Design#CA1000;+!Microsoft.Design#CA1048;+!Microsoft.Design#CA1051;+!Microsoft.Design#CA1002;+!Microsoft.Design#CA1061;+!Microsoft.Design#CA1006;+!Microsoft.Design#CA1046;+!Microsoft.Design#CA1045;+!Microsoft.Design#CA1065;+!Microsoft.Design#CA1038;+!Microsoft.Design#CA1008;+!Microsoft.Design#CA1028;+!Microsoft.Design#CA1064;-!Microsoft.Design#CA1004;+!Microsoft.Design#CA1035;+!Microsoft.Design#CA1063;+!Microsoft.Design#CA1032;+!Microsoft.Design#CA1023;+!Microsoft.Design#CA1033;+!Microsoft.Design#CA1039;+!Microsoft.Design#CA1016;+!Microsoft.Design#CA1014;+!Microsoft.Design#CA1017;+!Microsoft.Design#CA1018;+!Microsoft.Design#CA1027;+!Microsoft.Design#CA1059;+!Microsoft.Design#CA1060;+!Microsoft.Design#CA1034;+!Microsoft.Design#CA1013;+!Microsoft.Design#CA1036;+!Microsoft.Design#CA1044;+!Microsoft.Design#CA1041;+!Microsoft.Design#CA1025;+!Microsoft.Design#CA1052;+!Microsoft.Design#CA1053;+!Microsoft.Design#CA1057;+!Microsoft.Design#CA1058;+!Microsoft.Design#CA1001;+!Microsoft.Design#CA1049;+!Microsoft.Design#CA1054;+!Microsoft.Design#CA1056;+!Microsoft.Design#CA1055;+!Microsoft.Design#CA1030;+!Microsoft.Design#CA1003;+!Microsoft.Design#CA1007;+!Microsoft.Design#CA1043;+!Microsoft.Design#CA1024;+!Microsoft.Globalization#CA1301;+!Microsoft.Globalization#CA1302;+!Microsoft.Globalization#CA1308;+!Microsoft.Globalization#CA1306;+!Microsoft.Globalization#CA1304;+!Microsoft.Globalization#CA1305;+!Microsoft.Globalization#CA2101;+!Microsoft.Globalization#CA1300;+!Microsoft.Globalization#CA1307;+!Microsoft.Globalization#CA1309;+!Microsoft.Interoperability#CA1403;+!Microsoft.Interoperability#CA1406;+!Microsoft.Interoperability#CA1413;+!Microsoft.Interoperability#CA1402;+!Microsoft.Interoperability#CA1407;+!Microsoft.Interoperability#CA1404;+!Microsoft.Interoperability#CA1410;+!Microsoft.Interoperability#CA1411;+!Microsoft.Interoperability#CA1405;+!Microsoft.Interoperability#CA1409;+!Microsoft.Interoperability#CA1415;+!Microsoft.Interoperability#CA1408;+!Microsoft.Interoperability#CA1414;+!Microsoft.Interoperability#CA1412;+!Microsoft.Interoperability#CA1400;+!Microsoft.Interoperability#CA1401;+!Microsoft.Maintainability#CA1506;+!Microsoft.Maintainability#CA1502;+!Microsoft.Maintainability#CA1501;+!Microsoft.Maintainability#CA1505;+!Microsoft.Maintainability#CA1504;+!Microsoft.Maintainability#CA1500;+!Microsoft.Mobility#CA1600;+!Microsoft.Mobility#CA1601;-!Microsoft.Naming#CA1702;+!Microsoft.Naming#CA1700;+!Microsoft.Naming#CA1712;+!Microsoft.Naming#CA1713;+!Microsoft.Naming#CA1714;+!Microsoft.Naming#CA1709;-!Microsoft.Naming#CA1704;+!Microsoft.Naming#CA1708;+!Microsoft.Naming#CA1715;-!Microsoft.Naming#CA1710;-!Microsoft.Naming#CA1720;+!Microsoft.Naming#CA1707;+!Microsoft.Naming#CA1722;-!Microsoft.Naming#CA1711;+!Microsoft.Naming#CA1716;+!Microsoft.Naming#CA1717;+!Microsoft.Naming#CA1725;+!Microsoft.Naming#CA1719;+!Microsoft.Naming#CA1721;+!Microsoft.Naming#CA1701;+!Microsoft.Naming#CA1703;+!Microsoft.Naming#CA1724;-!Microsoft.Naming#CA1726;+!Microsoft.Performance#CA1809;+!Microsoft.Performance#CA1811;+!Microsoft.Performance#CA1812;+!Microsoft.Performance#CA1813;+!Microsoft.Performance#CA1823;+!Microsoft.Performance#CA1800;+!Microsoft.Performance#CA1805;+!Microsoft.Performance#CA1810;+!Microsoft.Performance#CA1824;+!Microsoft.Performance#CA1822;+!Microsoft.Performance#CA1815;+!Microsoft.Performance#CA1814;+!Microsoft.Performance#CA1819;+!Microsoft.Performance#CA1821;+!Microsoft.Performance#CA1804;+!Microsoft.Performance#CA1820;+!Microsoft.Performance#CA1802;+!Microsoft.Portability#CA1901;+!Microsoft.Portability#CA1900;+!Microsoft.Reliability#CA2001;+!Microsoft.Reliability#CA2002;+!Microsoft.Reliability#CA2003;+!Microsoft.Reliability#CA2004;+!Microsoft.Reliability#CA2006;+!Microsoft.Security#CA2116;+!Microsoft.Security#CA2117;+!Microsoft.Security#CA2105;+!Microsoft.Security#CA2115;+!Microsoft.Security#CA2102;+!Microsoft.Security#CA2104;+!Microsoft.Security#CA2122;+!Microsoft.Security#CA2114;+!Microsoft.Security#CA2123;+!Microsoft.Security#CA2111;+!Microsoft.Security#CA2108;+!Microsoft.Security#CA2107;+!Microsoft.Security#CA2103;+!Microsoft.Security#CA2118;+!Microsoft.Security#CA2109;+!Microsoft.Security#CA2119;+!Microsoft.Security#CA2106;+!Microsoft.Security#CA2112;+!Microsoft.Security#CA2120;+!Microsoft.Security#CA2121;+!Microsoft.Security#CA2126;+!Microsoft.Security#CA2124;+!Microsoft.Security#CA2127;+!Microsoft.Security#CA2128;+!Microsoft.Security#CA2129;+!Microsoft.Usage#CA2243;+!Microsoft.Usage#CA2236;+!Microsoft.Usage#CA1816;+!Microsoft.Usage#CA2227;+!Microsoft.Usage#CA2213;+!Microsoft.Usage#CA2216;+!Microsoft.Usage#CA2214;+!Microsoft.Usage#CA2222;+!Microsoft.Usage#CA1806;+!Microsoft.Usage#CA2217;+!Microsoft.Usage#CA2212;+!Microsoft.Usage#CA2219;+!Microsoft.Usage#CA2201;+!Microsoft.Usage#CA2228;+!Microsoft.Usage#CA2221;+!Microsoft.Usage#CA2220;+!Microsoft.Usage#CA2240;+!Microsoft.Usage#CA2229;+!Microsoft.Usage#CA2238;+!Microsoft.Usage#CA2207;+!Microsoft.Usage#CA2208;+!Microsoft.Usage#CA2235;+!Microsoft.Usage#CA2237;+!Microsoft.Usage#CA2232;+!Microsoft.Usage#CA2223;+!Microsoft.Usage#CA2211;+!Microsoft.Usage#CA2233;+!Microsoft.Usage#CA2225;+!Microsoft.Usage#CA2226;+!Microsoft.Usage#CA2231;+!Microsoft.Usage#CA2224;+!Microsoft.Usage#CA2218;+!Microsoft.Usage#CA2234;+!Microsoft.Usage#CA2239;+!Microsoft.Usage#CA2200;+!Microsoft.Usage#CA1801;+!Microsoft.Usage#CA2242;+!Microsoft.Usage#CA2205;+!Microsoft.Usage#CA2230 + + + v4.0 + + + true + full + false +$(SolutionDir)\..\Bin\Debug\ +$(OutputPath)\System.Core.xml + DEBUG;TRACE;$(SignedSym) + prompt + 4 + true + false + + + + + pdbonly + true +$(SolutionDir)\..\Bin\Release\ +$(OutputPath)\System.Scripting.Core.xml + TRACE;$(SignedSym) + prompt + 4 + true + false + + + + + true +$(SolutionDir)\..\Bin\Silverlight Debug\ + TRACE;DEBUG;SILVERLIGHT + true + full + AnyCPU + false + prompt + true +$(OutputPath)\System.Scripting.Core.xml + 618 + true + $(ProgramFiles)\Microsoft Silverlight\2.0.31005.0 + + +$(SolutionDir)\..\Bin\Silverlight Release\ + TRACE;SILVERLIGHT +$(OutputPath)\System.Scripting.Core.xml + true + 618 + true + pdbonly + AnyCPU + prompt + true + $(ProgramFiles)\Microsoft Silverlight\2.0.31005.0 + + + + + + False + $(SilverlightSdkPath)\mscorlib.dll + + + False + $(SilverlightSdkPath)\System.dll + + + + + + + Properties\SilverlightVersion.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ast\System.Linq.Expressions.txt + + + + + + + + + + diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Action.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Action.cs new file mode 100644 index 00000000000..3d6eee3ae10 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Action.cs @@ -0,0 +1,654 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +namespace System { +#else +namespace Microsoft { +#endif + #if MICROSOFT_SCRIPTING_CORE + + /// + /// Encapsulates a method that takes no parameters and does not return a value. + /// + public delegate void Action(); + + #endif + + // public delegate void Action(T obj); -- Already defined in mscorlib + + #region Generated Action Types + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_action_types from: generate_dynsites.py + +#if MICROSOFT_SCRIPTING_CORE + + /// + /// Encapsulates a method that takes two parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + public delegate void Action(T1 arg1, T2 arg2); + + /// + /// Encapsulates a method that takes three parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3); + + /// + /// Encapsulates a method that takes four parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4); + + /// + /// Encapsulates a method that takes five parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5); + + /// + /// Encapsulates a method that takes six parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6); + + /// + /// Encapsulates a method that takes seven parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7); + + /// + /// Encapsulates a method that takes eight parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8); + + /// + /// Encapsulates a method that takes nine parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9); + + /// + /// Encapsulates a method that takes ten parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10); + + /// + /// Encapsulates a method that takes eleven parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11); + + /// + /// Encapsulates a method that takes twelve parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12); + + /// + /// Encapsulates a method that takes thirteen parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13); + + /// + /// Encapsulates a method that takes fourteen parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14); + + /// + /// Encapsulates a method that takes fifteen parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The type of the fifteenth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + /// The fifteenth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15); + + /// + /// Encapsulates a method that takes sixteen parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The type of the fifteenth parameter of the method that this delegate encapsulates. + /// The type of the sixteenth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + /// The fifteenth parameter of the method that this delegate encapsulates. + /// The sixteenth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16); +#else + + /// + /// Encapsulates a method that takes nine parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9); + + /// + /// Encapsulates a method that takes ten parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10); + + /// + /// Encapsulates a method that takes eleven parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11); + + /// + /// Encapsulates a method that takes twelve parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12); + + /// + /// Encapsulates a method that takes thirteen parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13); + + /// + /// Encapsulates a method that takes fourteen parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14); + + /// + /// Encapsulates a method that takes fifteen parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The type of the fifteenth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + /// The fifteenth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15); + + /// + /// Encapsulates a method that takes sixteen parameters and does not return a value. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The type of the fifteenth parameter of the method that this delegate encapsulates. + /// The type of the sixteenth parameter of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + /// The fifteenth parameter of the method that this delegate encapsulates. + /// The sixteenth parameter of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate void Action(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16); + +#endif + + // *** END GENERATED CODE *** + + #endregion +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/CacheDict.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/CacheDict.cs new file mode 100644 index 00000000000..3297e6e975e --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/CacheDict.cs @@ -0,0 +1,121 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ + +#if CODEPLEX_40 +using System; +#else +using System; using Microsoft; +#endif +using System.Collections.Generic; +using System.Text; +using System.Diagnostics; + +#if CODEPLEX_40 +namespace System.Dynamic.Utils { +#else +namespace Microsoft.Scripting.Utils { +#endif + /// + /// Provides a dictionary-like object used for caches which holds onto a maximum + /// number of elements specified at construction time. + /// + /// This class is not thread safe. + /// + internal class CacheDict { + private readonly Dictionary _dict = new Dictionary(); + private readonly LinkedList _list = new LinkedList(); + private readonly int _maxSize; + + /// + /// Creates a dictionary-like object used for caches. + /// + /// The maximum number of elements to store. + internal CacheDict(int maxSize) { + _maxSize = maxSize; + } + + /// + /// Tries to get the value associated with 'key', returning true if it's found and + /// false if it's not present. + /// + internal bool TryGetValue(TKey key, out TValue value) { + KeyInfo storedValue; + if (_dict.TryGetValue(key, out storedValue)) { + LinkedListNode node = storedValue.List; + if (node.Previous != null) { + // move us to the head of the list... + _list.Remove(node); + _list.AddFirst(node); + } + + value = storedValue.Value; + return true; + } + + value = default(TValue); + return false; + } + + /// + /// Adds a new element to the cache, replacing and moving it to the front if the + /// element is already present. + /// + internal void Add(TKey key, TValue value) { + KeyInfo keyInfo; + if (_dict.TryGetValue(key, out keyInfo)) { + // remove original entry from the linked list + _list.Remove(keyInfo.List); + } else if (_list.Count == _maxSize) { + // we've reached capacity, remove the last used element... + LinkedListNode node = _list.Last; + _list.RemoveLast(); + bool res = _dict.Remove(node.Value); + Debug.Assert(res); + } + + // add the new entry to the head of the list and into the dictionary + LinkedListNode listNode = new LinkedListNode(key); + _list.AddFirst(listNode); + _dict[key] = new CacheDict.KeyInfo(value, listNode); + } + + /// + /// Returns the value associated with the given key, or throws KeyNotFoundException + /// if the key is not present. + /// + internal TValue this[TKey key] { + get { + TValue res; + if (TryGetValue(key, out res)) { + return res; + } + throw new KeyNotFoundException(); + } + set { + Add(key, value); + } + } + + private struct KeyInfo { + internal readonly TValue Value; + internal readonly LinkedListNode List; + + internal KeyInfo(TValue value, LinkedListNode list) { + Value = value; + List = list; + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/CollectionExtensions.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/CollectionExtensions.cs new file mode 100644 index 00000000000..48ac6c1e17d --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/CollectionExtensions.cs @@ -0,0 +1,193 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Dynamic.Utils { +#else +namespace Microsoft.Scripting.Utils { +#endif + internal static class CollectionExtensions { + /// + /// Wraps the provided enumerable into a ReadOnlyCollection{T} + /// + /// Copies all of the data into a new array, so the data can't be + /// changed after creation. The exception is if the enumerable is + /// already a ReadOnlyCollection{T}, in which case we just return it. + /// + internal static ReadOnlyCollection ToReadOnly(this IEnumerable enumerable) { + if (enumerable == null) { + return EmptyReadOnlyCollection.Instance; + } + + var troc = enumerable as TrueReadOnlyCollection; + if (troc != null) { + return troc; + } + + var builder = enumerable as ReadOnlyCollectionBuilder; + if (builder != null) { + return builder.ToReadOnlyCollection(); + } + + var collection = enumerable as ICollection; + if (collection != null) { + int count = collection.Count; + if (count == 0) { + return EmptyReadOnlyCollection.Instance; + } + + T[] clone = new T[count]; + collection.CopyTo(clone, 0); + return new TrueReadOnlyCollection(clone); + } + + // ToArray trims the excess space and speeds up access + return new TrueReadOnlyCollection(new List(enumerable).ToArray()); + } + + // We could probably improve the hashing here + internal static int ListHashCode(this IEnumerable list) { + var cmp = EqualityComparer.Default; + int h = 6551; + foreach (T t in list) { + h ^= (h << 5) ^ cmp.GetHashCode(t); + } + return h; + } + + internal static bool ListEquals(this ICollection first, ICollection second) { + if (first.Count != second.Count) { + return false; + } + var cmp = EqualityComparer.Default; + var f = first.GetEnumerator(); + var s = second.GetEnumerator(); + while (f.MoveNext()) { + s.MoveNext(); + + if (!cmp.Equals(f.Current, s.Current)) { + return false; + } + } + return true; + } + + internal static IEnumerable Select(this IEnumerable enumerable, Func select) { + foreach (T t in enumerable) { + yield return select(t); + } + } + + // Name needs to be different so it doesn't conflict with Enumerable.Select + internal static U[] Map(this ICollection collection, Func select) { + int count = collection.Count; + U[] result = new U[count]; + count = 0; + foreach (T t in collection) { + result[count++] = select(t); + } + return result; + } + + internal static IEnumerable Where(this IEnumerable enumerable, Func where) { + foreach (T t in enumerable) { + if (where(t)) { + yield return t; + } + } + } + + internal static bool Any(this IEnumerable source, Func predicate) { + foreach (T element in source) { + if (predicate(element)) { + return true; + } + } + return false; + } + + internal static bool All(this IEnumerable source, Func predicate) { + foreach (T element in source) { + if (!predicate(element)) { + return false; + } + } + return true; + } + + internal static T[] RemoveFirst(this T[] array) { + T[] result = new T[array.Length - 1]; + Array.Copy(array, 1, result, 0, result.Length); + return result; + } + + internal static T[] RemoveLast(this T[] array) { + T[] result = new T[array.Length - 1]; + Array.Copy(array, 0, result, 0, result.Length); + return result; + } + + internal static T[] AddFirst(this IList list, T item) { + T[] res = new T[list.Count + 1]; + res[0] = item; + list.CopyTo(res, 1); + return res; + } + + internal static T[] AddLast(this IList list, T item) { + T[] res = new T[list.Count + 1]; + list.CopyTo(res, 0); + res[list.Count] = item; + return res; + } + + internal static T First(this IEnumerable source) { + var list = source as IList; + if (list != null) { + return list[0]; + } + using (var e = source.GetEnumerator()) { + if (e.MoveNext()) return e.Current; + } + throw new InvalidOperationException(); + } + + internal static T Last(this IList list) { + return list[list.Count - 1]; + } + + internal static T[] Copy(this T[] array) { + T[] copy = new T[array.Length]; + Array.Copy(array, copy, array.Length); + return copy; + } + } + + + internal static class EmptyReadOnlyCollection { + internal static ReadOnlyCollection Instance = new TrueReadOnlyCollection(new T[0]); + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ContractUtils.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ContractUtils.cs new file mode 100644 index 00000000000..2e09e18c7f2 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ContractUtils.cs @@ -0,0 +1,107 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Diagnostics; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic.Utils { +#else +namespace Microsoft.Scripting.Utils { +#endif + + // Will be replaced with CLRv4 managed contracts + internal static class ContractUtils { + + internal static Exception Unreachable { + get { + Debug.Assert(false, "Unreachable"); + return new InvalidOperationException("Code supposed to be unreachable"); + } + } + + internal static void Requires(bool precondition) { + if (!precondition) { + throw new ArgumentException(Strings.MethodPreconditionViolated); + } + } + + internal static void Requires(bool precondition, string paramName) { + Debug.Assert(!string.IsNullOrEmpty(paramName)); + + if (!precondition) { + throw new ArgumentException(Strings.InvalidArgumentValue, paramName); + } + } + + internal static void Requires(bool precondition, string paramName, string message) { + Debug.Assert(!string.IsNullOrEmpty(paramName)); + + if (!precondition) { + throw new ArgumentException(message, paramName); + } + } + + internal static void RequiresNotNull(object value, string paramName) { + Debug.Assert(!string.IsNullOrEmpty(paramName)); + + if (value == null) { + throw new ArgumentNullException(paramName); + } + } + + internal static void RequiresNotEmpty(ICollection collection, string paramName) { + RequiresNotNull(collection, paramName); + if (collection.Count == 0) { + throw new ArgumentException(Strings.NonEmptyCollectionRequired, paramName); + } + } + + /// + /// Requires the range [offset, offset + count] to be a subset of [0, array.Count]. + /// + /// Array is null. + /// Offset or count are out of range. + internal static void RequiresArrayRange(IList array, int offset, int count, string offsetName, string countName) { + Debug.Assert(!string.IsNullOrEmpty(offsetName)); + Debug.Assert(!string.IsNullOrEmpty(countName)); + Debug.Assert(array != null); + + if (count < 0) throw new ArgumentOutOfRangeException(countName); + if (offset < 0 || array.Count - offset < count) throw new ArgumentOutOfRangeException(offsetName); + } + + /// + /// Requires the array and all its items to be non-null. + /// + internal static void RequiresNotNullItems(IList array, string arrayName) { + Debug.Assert(arrayName != null); + RequiresNotNull(array, arrayName); + + for (int i = 0; i < array.Count; i++) { + if (array[i] == null) { + throw new ArgumentNullException(string.Format(System.Globalization.CultureInfo.CurrentCulture, "{0}[{1}]", arrayName, i)); + } + } + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ExceptionFactory.Generated.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ExceptionFactory.Generated.cs new file mode 100644 index 00000000000..b08b49e68cc --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ExceptionFactory.Generated.cs @@ -0,0 +1,2524 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +namespace System.Linq.Expressions { +#else +namespace Microsoft.Linq.Expressions { +#endif + + internal static partial class Strings { + private static string FormatString(string format, params object[] args) { + return string.Format(System.Globalization.CultureInfo.CurrentCulture, format, args); + } + } + + #region Generated Exception Factory + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_expr_factory_core from: generate_exception_factory.py + + /// + /// Strongly-typed and parameterized string factory. + /// + + internal static partial class Strings { + /// + /// A string like "Method precondition violated" + /// + internal static string MethodPreconditionViolated { + get { + return "Method precondition violated"; + } + } + + /// + /// A string like "Invalid argument value" + /// + internal static string InvalidArgumentValue { + get { + return "Invalid argument value"; + } + } + + /// + /// A string like "Non-empty collection required" + /// + internal static string NonEmptyCollectionRequired { + get { + return "Non-empty collection required"; + } + } + + /// + /// A string like "Argument count must be greater than number of named arguments." + /// + internal static string ArgCntMustBeGreaterThanNameCnt { + get { + return "Argument count must be greater than number of named arguments."; + } + } + + /// + /// A string like "reducible nodes must override Expression.Reduce()" + /// + internal static string ReducibleMustOverrideReduce { + get { + return "reducible nodes must override Expression.Reduce()"; + } + } + + /// + /// A string like "node cannot reduce to itself or null" + /// + internal static string MustReduceToDifferent { + get { + return "node cannot reduce to itself or null"; + } + } + + /// + /// A string like "cannot assign from the reduced node type to the original node type" + /// + internal static string ReducedNotCompatible { + get { + return "cannot assign from the reduced node type to the original node type"; + } + } + + /// + /// A string like "Setter must have parameters." + /// + internal static string SetterHasNoParams { + get { + return "Setter must have parameters."; + } + } + + /// + /// A string like "Property cannot have a managed pointer type." + /// + internal static string PropertyCannotHaveRefType { + get { + return "Property cannot have a managed pointer type."; + } + } + + /// + /// A string like "Indexing parameters of getter and setter must match." + /// + internal static string IndexesOfSetGetMustMatch { + get { + return "Indexing parameters of getter and setter must match."; + } + } + + /// + /// A string like "Accessor method should not have VarArgs." + /// + internal static string AccessorsCannotHaveVarArgs { + get { + return "Accessor method should not have VarArgs."; + } + } + + /// + /// A string like "Accessor indexes cannot be passed ByRef." + /// + internal static string AccessorsCannotHaveByRefArgs { + get { + return "Accessor indexes cannot be passed ByRef."; + } + } + + /// + /// A string like "Bounds count cannot be less than 1" + /// + internal static string BoundsCannotBeLessThanOne { + get { + return "Bounds count cannot be less than 1"; + } + } + + /// + /// A string like "type must not be ByRef" + /// + internal static string TypeMustNotBeByRef { + get { + return "type must not be ByRef"; + } + } + + /// + /// A string like "Type doesn't have constructor with a given signature" + /// + internal static string TypeDoesNotHaveConstructorForTheSignature { + get { + return "Type doesn't have constructor with a given signature"; + } + } + + /// + /// A string like "Count must be non-negative." + /// + internal static string CountCannotBeNegative { + get { + return "Count must be non-negative."; + } + } + + /// + /// A string like "arrayType must be an array type" + /// + internal static string ArrayTypeMustBeArray { + get { + return "arrayType must be an array type"; + } + } + + /// + /// A string like "Setter should have void type." + /// + internal static string SetterMustBeVoid { + get { + return "Setter should have void type."; + } + } + + /// + /// A string like "Property type must match the value type of setter" + /// + internal static string PropertyTyepMustMatchSetter { + get { + return "Property type must match the value type of setter"; + } + } + + /// + /// A string like "Both accessors must be static." + /// + internal static string BothAccessorsMustBeStatic { + get { + return "Both accessors must be static."; + } + } + + /// + /// A string like "Static field requires null instance, non-static field requires non-null instance." + /// + internal static string OnlyStaticFieldsHaveNullInstance { + get { + return "Static field requires null instance, non-static field requires non-null instance."; + } + } + + /// + /// A string like "Static property requires null instance, non-static property requires non-null instance." + /// + internal static string OnlyStaticPropertiesHaveNullInstance { + get { + return "Static property requires null instance, non-static property requires non-null instance."; + } + } + + /// + /// A string like "Static method requires null instance, non-static method requires non-null instance." + /// + internal static string OnlyStaticMethodsHaveNullInstance { + get { + return "Static method requires null instance, non-static method requires non-null instance."; + } + } + + /// + /// A string like "Property cannot have a void type." + /// + internal static string PropertyTypeCannotBeVoid { + get { + return "Property cannot have a void type."; + } + } + + /// + /// A string like "Can only unbox from an object or interface type to a value type." + /// + internal static string InvalidUnboxType { + get { + return "Can only unbox from an object or interface type to a value type."; + } + } + + /// + /// A string like "Expression must be readable" + /// + internal static string ExpressionMustBeReadable { + get { + return "Expression must be readable"; + } + } + + /// + /// A string like "Expression must be writeable" + /// + internal static string ExpressionMustBeWriteable { + get { + return "Expression must be writeable"; + } + } + + /// + /// A string like "Argument must not have a value type." + /// + internal static string ArgumentMustNotHaveValueType { + get { + return "Argument must not have a value type."; + } + } + + /// + /// A string like "must be reducible node" + /// + internal static string MustBeReducible { + get { + return "must be reducible node"; + } + } + + /// + /// A string like "All test values must have the same type." + /// + internal static string AllTestValuesMustHaveSameType { + get { + return "All test values must have the same type."; + } + } + + /// + /// A string like "All case bodies and the default body must have the same type." + /// + internal static string AllCaseBodiesMustHaveSameType { + get { + return "All case bodies and the default body must have the same type."; + } + } + + /// + /// A string like "Default body must be supplied if case bodies are not System.Void." + /// + internal static string DefaultBodyMustBeSupplied { + get { + return "Default body must be supplied if case bodies are not System.Void."; + } + } + + /// + /// A string like "MethodBuilder does not have a valid TypeBuilder" + /// + internal static string MethodBuilderDoesNotHaveTypeBuilder { + get { + return "MethodBuilder does not have a valid TypeBuilder"; + } + } + + /// + /// A string like "Type must be derived from System.Delegate" + /// + internal static string TypeMustBeDerivedFromSystemDelegate { + get { + return "Type must be derived from System.Delegate"; + } + } + + /// + /// A string like "Argument type cannot be void" + /// + internal static string ArgumentTypeCannotBeVoid { + get { + return "Argument type cannot be void"; + } + } + + /// + /// A string like "Label type must be System.Void if an expression is not supplied" + /// + internal static string LabelMustBeVoidOrHaveExpression { + get { + return "Label type must be System.Void if an expression is not supplied"; + } + } + + /// + /// A string like "Type must be System.Void for this label argument" + /// + internal static string LabelTypeMustBeVoid { + get { + return "Type must be System.Void for this label argument"; + } + } + + /// + /// A string like "Quoted expression must be a lambda" + /// + internal static string QuotedExpressionMustBeLambda { + get { + return "Quoted expression must be a lambda"; + } + } + + /// + /// A string like "Variable '{0}' uses unsupported type '{1}'. Reference types are not supported for variables." + /// + internal static string VariableMustNotBeByRef(object p0, object p1) { + return FormatString("Variable '{0}' uses unsupported type '{1}'. Reference types are not supported for variables.", p0, p1); + } + + /// + /// A string like "Found duplicate parameter '{0}'. Each ParameterExpression in the list must be a unique object." + /// + internal static string DuplicateVariable(object p0) { + return FormatString("Found duplicate parameter '{0}'. Each ParameterExpression in the list must be a unique object.", p0); + } + + /// + /// A string like "Start and End must be well ordered" + /// + internal static string StartEndMustBeOrdered { + get { + return "Start and End must be well ordered"; + } + } + + /// + /// A string like "fault cannot be used with catch or finally clauses" + /// + internal static string FaultCannotHaveCatchOrFinally { + get { + return "fault cannot be used with catch or finally clauses"; + } + } + + /// + /// A string like "try must have at least one catch, finally, or fault clause" + /// + internal static string TryMustHaveCatchFinallyOrFault { + get { + return "try must have at least one catch, finally, or fault clause"; + } + } + + /// + /// A string like "Body of catch must have the same type as body of try." + /// + internal static string BodyOfCatchMustHaveSameTypeAsBodyOfTry { + get { + return "Body of catch must have the same type as body of try."; + } + } + + /// + /// A string like "Extension node must override the property {0}." + /// + internal static string ExtensionNodeMustOverrideProperty(object p0) { + return FormatString("Extension node must override the property {0}.", p0); + } + + /// + /// A string like "User-defined operator method '{0}' must be static." + /// + internal static string UserDefinedOperatorMustBeStatic(object p0) { + return FormatString("User-defined operator method '{0}' must be static.", p0); + } + + /// + /// A string like "User-defined operator method '{0}' must not be void." + /// + internal static string UserDefinedOperatorMustNotBeVoid(object p0) { + return FormatString("User-defined operator method '{0}' must not be void.", p0); + } + + /// + /// A string like "No coercion operator is defined between types '{0}' and '{1}'." + /// + internal static string CoercionOperatorNotDefined(object p0, object p1) { + return FormatString("No coercion operator is defined between types '{0}' and '{1}'.", p0, p1); + } + + /// + /// A string like "The result type '{0}' of the dynamic binding produced by binder '{1}' is not compatible with the result type '{2}' expected by the call site." + /// + internal static string DynamicBinderResultNotAssignable(object p0, object p1, object p2) { + return FormatString("The result type '{0}' of the dynamic binding produced by binder '{1}' is not compatible with the result type '{2}' expected by the call site.", p0, p1, p2); + } + + /// + /// A string like "The result type '{0}' of the dynamic binding produced by the object with type '{1}' for the binder '{2}' is not compatible with the result type '{3}' expected by the call site." + /// + internal static string DynamicObjectResultNotAssignable(object p0, object p1, object p2, object p3) { + return FormatString("The result type '{0}' of the dynamic binding produced by the object with type '{1}' for the binder '{2}' is not compatible with the result type '{3}' expected by the call site.", p0, p1, p2, p3); + } + + /// + /// A string like "The result of the dynamic binding produced by the object with type '{0}' for the binder '{1}' needs at least one restriction." + /// + internal static string DynamicBindingNeedsRestrictions(object p0, object p1) { + return FormatString("The result of the dynamic binding produced by the object with type '{0}' for the binder '{1}' needs at least one restriction.", p0, p1); + } + + /// + /// A string like "The result type '{0}' of the binder '{1}' is not compatible with the result type '{2}' expected by the call site." + /// + internal static string BinderNotCompatibleWithCallSite(object p0, object p1, object p2) { + return FormatString("The result type '{0}' of the binder '{1}' is not compatible with the result type '{2}' expected by the call site.", p0, p1, p2); + } + + /// + /// A string like "The unary operator {0} is not defined for the type '{1}'." + /// + internal static string UnaryOperatorNotDefined(object p0, object p1) { + return FormatString("The unary operator {0} is not defined for the type '{1}'.", p0, p1); + } + + /// + /// A string like "The binary operator {0} is not defined for the types '{1}' and '{2}'." + /// + internal static string BinaryOperatorNotDefined(object p0, object p1, object p2) { + return FormatString("The binary operator {0} is not defined for the types '{1}' and '{2}'.", p0, p1, p2); + } + + /// + /// A string like "Reference equality is not defined for the types '{0}' and '{1}'." + /// + internal static string ReferenceEqualityNotDefined(object p0, object p1) { + return FormatString("Reference equality is not defined for the types '{0}' and '{1}'.", p0, p1); + } + + /// + /// A string like "The operands for operator '{0}' do not match the parameters of method '{1}'." + /// + internal static string OperandTypesDoNotMatchParameters(object p0, object p1) { + return FormatString("The operands for operator '{0}' do not match the parameters of method '{1}'.", p0, p1); + } + + /// + /// A string like "The return type of overload method for operator '{0}' does not match the parameter type of conversion method '{1}'." + /// + internal static string OverloadOperatorTypeDoesNotMatchConversionType(object p0, object p1) { + return FormatString("The return type of overload method for operator '{0}' does not match the parameter type of conversion method '{1}'.", p0, p1); + } + + /// + /// A string like "Conversion is not supported for arithmetic types without operator overloading." + /// + internal static string ConversionIsNotSupportedForArithmeticTypes { + get { + return "Conversion is not supported for arithmetic types without operator overloading."; + } + } + + /// + /// A string like "Argument must be array" + /// + internal static string ArgumentMustBeArray { + get { + return "Argument must be array"; + } + } + + /// + /// A string like "Argument must be boolean" + /// + internal static string ArgumentMustBeBoolean { + get { + return "Argument must be boolean"; + } + } + + /// + /// A string like "The user-defined equality method '{0}' must return a boolean value." + /// + internal static string EqualityMustReturnBoolean(object p0) { + return FormatString("The user-defined equality method '{0}' must return a boolean value.", p0); + } + + /// + /// A string like "Argument must be either a FieldInfo or PropertyInfo" + /// + internal static string ArgumentMustBeFieldInfoOrPropertInfo { + get { + return "Argument must be either a FieldInfo or PropertyInfo"; + } + } + + /// + /// A string like "Argument must be either a FieldInfo, PropertyInfo or MethodInfo" + /// + internal static string ArgumentMustBeFieldInfoOrPropertInfoOrMethod { + get { + return "Argument must be either a FieldInfo, PropertyInfo or MethodInfo"; + } + } + + /// + /// A string like "Argument must be an instance member" + /// + internal static string ArgumentMustBeInstanceMember { + get { + return "Argument must be an instance member"; + } + } + + /// + /// A string like "Argument must be of an integer type" + /// + internal static string ArgumentMustBeInteger { + get { + return "Argument must be of an integer type"; + } + } + + /// + /// A string like "Argument for array index must be of type Int32" + /// + internal static string ArgumentMustBeArrayIndexType { + get { + return "Argument for array index must be of type Int32"; + } + } + + /// + /// A string like "Argument must be single dimensional array type" + /// + internal static string ArgumentMustBeSingleDimensionalArrayType { + get { + return "Argument must be single dimensional array type"; + } + } + + /// + /// A string like "Argument types do not match" + /// + internal static string ArgumentTypesMustMatch { + get { + return "Argument types do not match"; + } + } + + /// + /// A string like "Cannot auto initialize elements of value type through property '{0}', use assignment instead" + /// + internal static string CannotAutoInitializeValueTypeElementThroughProperty(object p0) { + return FormatString("Cannot auto initialize elements of value type through property '{0}', use assignment instead", p0); + } + + /// + /// A string like "Cannot auto initialize members of value type through property '{0}', use assignment instead" + /// + internal static string CannotAutoInitializeValueTypeMemberThroughProperty(object p0) { + return FormatString("Cannot auto initialize members of value type through property '{0}', use assignment instead", p0); + } + + /// + /// A string like "The type used in TypeAs Expression must be of reference or nullable type, {0} is neither" + /// + internal static string IncorrectTypeForTypeAs(object p0) { + return FormatString("The type used in TypeAs Expression must be of reference or nullable type, {0} is neither", p0); + } + + /// + /// A string like "Coalesce used with type that cannot be null" + /// + internal static string CoalesceUsedOnNonNullType { + get { + return "Coalesce used with type that cannot be null"; + } + } + + /// + /// A string like "An expression of type '{0}' cannot be used to initialize an array of type '{1}'" + /// + internal static string ExpressionTypeCannotInitializeArrayType(object p0, object p1) { + return FormatString("An expression of type '{0}' cannot be used to initialize an array of type '{1}'", p0, p1); + } + + /// + /// A string like "Expression of type '{0}' cannot be used for constructor parameter of type '{1}'" + /// + internal static string ExpressionTypeDoesNotMatchConstructorParameter(object p0, object p1) { + return FormatString("Expression of type '{0}' cannot be used for constructor parameter of type '{1}'", p0, p1); + } + + /// + /// A string like " Argument type '{0}' does not match the corresponding member type '{1}'" + /// + internal static string ArgumentTypeDoesNotMatchMember(object p0, object p1) { + return FormatString(" Argument type '{0}' does not match the corresponding member type '{1}'", p0, p1); + } + + /// + /// A string like " The member '{0}' is not declared on type '{1}' being created" + /// + internal static string ArgumentMemberNotDeclOnType(object p0, object p1) { + return FormatString(" The member '{0}' is not declared on type '{1}' being created", p0, p1); + } + + /// + /// A string like "Expression of type '{0}' cannot be used for parameter of type '{1}' of method '{2}'" + /// + internal static string ExpressionTypeDoesNotMatchMethodParameter(object p0, object p1, object p2) { + return FormatString("Expression of type '{0}' cannot be used for parameter of type '{1}' of method '{2}'", p0, p1, p2); + } + + /// + /// A string like "Expression of type '{0}' cannot be used for parameter of type '{1}'" + /// + internal static string ExpressionTypeDoesNotMatchParameter(object p0, object p1) { + return FormatString("Expression of type '{0}' cannot be used for parameter of type '{1}'", p0, p1); + } + + /// + /// A string like "Expression of type '{0}' cannot be used for return type '{1}'" + /// + internal static string ExpressionTypeDoesNotMatchReturn(object p0, object p1) { + return FormatString("Expression of type '{0}' cannot be used for return type '{1}'", p0, p1); + } + + /// + /// A string like "Expression of type '{0}' cannot be used for assignment to type '{1}'" + /// + internal static string ExpressionTypeDoesNotMatchAssignment(object p0, object p1) { + return FormatString("Expression of type '{0}' cannot be used for assignment to type '{1}'", p0, p1); + } + + /// + /// A string like "Expression of type '{0}' cannot be used for label of type '{1}'" + /// + internal static string ExpressionTypeDoesNotMatchLabel(object p0, object p1) { + return FormatString("Expression of type '{0}' cannot be used for label of type '{1}'", p0, p1); + } + + /// + /// A string like "Expression of type '{0}' cannot be invoked" + /// + internal static string ExpressionTypeNotInvocable(object p0) { + return FormatString("Expression of type '{0}' cannot be invoked", p0); + } + + /// + /// A string like "Field '{0}' is not defined for type '{1}'" + /// + internal static string FieldNotDefinedForType(object p0, object p1) { + return FormatString("Field '{0}' is not defined for type '{1}'", p0, p1); + } + + /// + /// A string like "Instance field '{0}' is not defined for type '{1}'" + /// + internal static string InstanceFieldNotDefinedForType(object p0, object p1) { + return FormatString("Instance field '{0}' is not defined for type '{1}'", p0, p1); + } + + /// + /// A string like "Field '{0}.{1}' is not defined for type '{2}'" + /// + internal static string FieldInfoNotDefinedForType(object p0, object p1, object p2) { + return FormatString("Field '{0}.{1}' is not defined for type '{2}'", p0, p1, p2); + } + + /// + /// A string like "Incorrect number of indexes" + /// + internal static string IncorrectNumberOfIndexes { + get { + return "Incorrect number of indexes"; + } + } + + /// + /// A string like "Incorrect number of arguments supplied for lambda invocation" + /// + internal static string IncorrectNumberOfLambdaArguments { + get { + return "Incorrect number of arguments supplied for lambda invocation"; + } + } + + /// + /// A string like "Incorrect number of parameters supplied for lambda declaration" + /// + internal static string IncorrectNumberOfLambdaDeclarationParameters { + get { + return "Incorrect number of parameters supplied for lambda declaration"; + } + } + + /// + /// A string like "Incorrect number of arguments supplied for call to method '{0}'" + /// + internal static string IncorrectNumberOfMethodCallArguments(object p0) { + return FormatString("Incorrect number of arguments supplied for call to method '{0}'", p0); + } + + /// + /// A string like "Incorrect number of arguments for constructor" + /// + internal static string IncorrectNumberOfConstructorArguments { + get { + return "Incorrect number of arguments for constructor"; + } + } + + /// + /// A string like " Incorrect number of members for constructor" + /// + internal static string IncorrectNumberOfMembersForGivenConstructor { + get { + return " Incorrect number of members for constructor"; + } + } + + /// + /// A string like "Incorrect number of arguments for the given members " + /// + internal static string IncorrectNumberOfArgumentsForMembers { + get { + return "Incorrect number of arguments for the given members "; + } + } + + /// + /// A string like "Lambda type parameter must be derived from System.Delegate" + /// + internal static string LambdaTypeMustBeDerivedFromSystemDelegate { + get { + return "Lambda type parameter must be derived from System.Delegate"; + } + } + + /// + /// A string like "Member '{0}' not field or property" + /// + internal static string MemberNotFieldOrProperty(object p0) { + return FormatString("Member '{0}' not field or property", p0); + } + + /// + /// A string like "Method {0} contains generic parameters" + /// + internal static string MethodContainsGenericParameters(object p0) { + return FormatString("Method {0} contains generic parameters", p0); + } + + /// + /// A string like "Method {0} is a generic method definition" + /// + internal static string MethodIsGeneric(object p0) { + return FormatString("Method {0} is a generic method definition", p0); + } + + /// + /// A string like "The method '{0}.{1}' is not a property accessor" + /// + internal static string MethodNotPropertyAccessor(object p0, object p1) { + return FormatString("The method '{0}.{1}' is not a property accessor", p0, p1); + } + + /// + /// A string like "The property '{0}' has no 'get' accessor" + /// + internal static string PropertyDoesNotHaveGetter(object p0) { + return FormatString("The property '{0}' has no 'get' accessor", p0); + } + + /// + /// A string like "The property '{0}' has no 'set' accessor" + /// + internal static string PropertyDoesNotHaveSetter(object p0) { + return FormatString("The property '{0}' has no 'set' accessor", p0); + } + + /// + /// A string like "The property '{0}' has no 'get' or 'set' accessors" + /// + internal static string PropertyDoesNotHaveAccessor(object p0) { + return FormatString("The property '{0}' has no 'get' or 'set' accessors", p0); + } + + /// + /// A string like "'{0}' is not a member of type '{1}'" + /// + internal static string NotAMemberOfType(object p0, object p1) { + return FormatString("'{0}' is not a member of type '{1}'", p0, p1); + } + + /// + /// A string like "The operator '{0}' is not implemented for type '{1}'" + /// + internal static string OperatorNotImplementedForType(object p0, object p1) { + return FormatString("The operator '{0}' is not implemented for type '{1}'", p0, p1); + } + + /// + /// A string like "ParameterExpression of type '{0}' cannot be used for delegate parameter of type '{1}'" + /// + internal static string ParameterExpressionNotValidAsDelegate(object p0, object p1) { + return FormatString("ParameterExpression of type '{0}' cannot be used for delegate parameter of type '{1}'", p0, p1); + } + + /// + /// A string like "Property '{0}' is not defined for type '{1}'" + /// + internal static string PropertyNotDefinedForType(object p0, object p1) { + return FormatString("Property '{0}' is not defined for type '{1}'", p0, p1); + } + + /// + /// A string like "Instance property '{0}' is not defined for type '{1}'" + /// + internal static string InstancePropertyNotDefinedForType(object p0, object p1) { + return FormatString("Instance property '{0}' is not defined for type '{1}'", p0, p1); + } + + /// + /// A string like "Instance property '{0}' that takes no argument is not defined for type '{1}'" + /// + internal static string InstancePropertyWithoutParameterNotDefinedForType(object p0, object p1) { + return FormatString("Instance property '{0}' that takes no argument is not defined for type '{1}'", p0, p1); + } + + /// + /// A string like "Instance property '{0}{1}' is not defined for type '{2}'" + /// + internal static string InstancePropertyWithSpecifiedParametersNotDefinedForType(object p0, object p1, object p2) { + return FormatString("Instance property '{0}{1}' is not defined for type '{2}'", p0, p1, p2); + } + + /// + /// A string like "Method '{0}' declared on type '{1}' cannot be called with instance of type '{2}'" + /// + internal static string InstanceAndMethodTypeMismatch(object p0, object p1, object p2) { + return FormatString("Method '{0}' declared on type '{1}' cannot be called with instance of type '{2}'", p0, p1, p2); + } + + /// + /// A string like "Type {0} contains generic parameters" + /// + internal static string TypeContainsGenericParameters(object p0) { + return FormatString("Type {0} contains generic parameters", p0); + } + + /// + /// A string like "Type {0} is a generic type definition" + /// + internal static string TypeIsGeneric(object p0) { + return FormatString("Type {0} is a generic type definition", p0); + } + + /// + /// A string like "Type '{0}' does not have a default constructor" + /// + internal static string TypeMissingDefaultConstructor(object p0) { + return FormatString("Type '{0}' does not have a default constructor", p0); + } + + /// + /// A string like "List initializers must contain at least one initializer" + /// + internal static string ListInitializerWithZeroMembers { + get { + return "List initializers must contain at least one initializer"; + } + } + + /// + /// A string like "Element initializer method must be named 'Add'" + /// + internal static string ElementInitializerMethodNotAdd { + get { + return "Element initializer method must be named 'Add'"; + } + } + + /// + /// A string like "Parameter '{0}' of element initializer method '{1}' must not be a pass by reference parameter" + /// + internal static string ElementInitializerMethodNoRefOutParam(object p0, object p1) { + return FormatString("Parameter '{0}' of element initializer method '{1}' must not be a pass by reference parameter", p0, p1); + } + + /// + /// A string like "Element initializer method must have at least 1 parameter" + /// + internal static string ElementInitializerMethodWithZeroArgs { + get { + return "Element initializer method must have at least 1 parameter"; + } + } + + /// + /// A string like "Element initializer method must be an instance method" + /// + internal static string ElementInitializerMethodStatic { + get { + return "Element initializer method must be an instance method"; + } + } + + /// + /// A string like "Type '{0}' is not IEnumerable" + /// + internal static string TypeNotIEnumerable(object p0) { + return FormatString("Type '{0}' is not IEnumerable", p0); + } + + /// + /// A string like "Type parameter is {0}. Expected a delegate." + /// + internal static string TypeParameterIsNotDelegate(object p0) { + return FormatString("Type parameter is {0}. Expected a delegate.", p0); + } + + /// + /// A string like "Unexpected coalesce operator." + /// + internal static string UnexpectedCoalesceOperator { + get { + return "Unexpected coalesce operator."; + } + } + + /// + /// A string like "Cannot cast from type '{0}' to type '{1}" + /// + internal static string InvalidCast(object p0, object p1) { + return FormatString("Cannot cast from type '{0}' to type '{1}", p0, p1); + } + + /// + /// A string like "Unhandled binary: {0}" + /// + internal static string UnhandledBinary(object p0) { + return FormatString("Unhandled binary: {0}", p0); + } + + /// + /// A string like "Unhandled binding " + /// + internal static string UnhandledBinding { + get { + return "Unhandled binding "; + } + } + + /// + /// A string like "Unhandled Binding Type: {0}" + /// + internal static string UnhandledBindingType(object p0) { + return FormatString("Unhandled Binding Type: {0}", p0); + } + + /// + /// A string like "Unhandled convert: {0}" + /// + internal static string UnhandledConvert(object p0) { + return FormatString("Unhandled convert: {0}", p0); + } + + /// + /// A string like "Unhandled Expression Type: {0}" + /// + internal static string UnhandledExpressionType(object p0) { + return FormatString("Unhandled Expression Type: {0}", p0); + } + + /// + /// A string like "Unhandled unary: {0}" + /// + internal static string UnhandledUnary(object p0) { + return FormatString("Unhandled unary: {0}", p0); + } + + /// + /// A string like "Unknown binding type" + /// + internal static string UnknownBindingType { + get { + return "Unknown binding type"; + } + } + + /// + /// A string like "The user-defined operator method '{1}' for operator '{0}' must have identical parameter and return types." + /// + internal static string UserDefinedOpMustHaveConsistentTypes(object p0, object p1) { + return FormatString("The user-defined operator method '{1}' for operator '{0}' must have identical parameter and return types.", p0, p1); + } + + /// + /// A string like "The user-defined operator method '{1}' for operator '{0}' must return the same type as its parameter or a derived type." + /// + internal static string UserDefinedOpMustHaveValidReturnType(object p0, object p1) { + return FormatString("The user-defined operator method '{1}' for operator '{0}' must return the same type as its parameter or a derived type.", p0, p1); + } + + /// + /// A string like "The user-defined operator method '{1}' for operator '{0}' must have associated boolean True and False operators." + /// + internal static string LogicalOperatorMustHaveBooleanOperators(object p0, object p1) { + return FormatString("The user-defined operator method '{1}' for operator '{0}' must have associated boolean True and False operators.", p0, p1); + } + + /// + /// A string like "No method '{0}' exists on type '{1}'." + /// + internal static string MethodDoesNotExistOnType(object p0, object p1) { + return FormatString("No method '{0}' exists on type '{1}'.", p0, p1); + } + + /// + /// A string like "No method '{0}' on type '{1}' is compatible with the supplied arguments." + /// + internal static string MethodWithArgsDoesNotExistOnType(object p0, object p1) { + return FormatString("No method '{0}' on type '{1}' is compatible with the supplied arguments.", p0, p1); + } + + /// + /// A string like "No generic method '{0}' on type '{1}' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic. " + /// + internal static string GenericMethodWithArgsDoesNotExistOnType(object p0, object p1) { + return FormatString("No generic method '{0}' on type '{1}' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic. ", p0, p1); + } + + /// + /// A string like "More than one method '{0}' on type '{1}' is compatible with the supplied arguments." + /// + internal static string MethodWithMoreThanOneMatch(object p0, object p1) { + return FormatString("More than one method '{0}' on type '{1}' is compatible with the supplied arguments.", p0, p1); + } + + /// + /// A string like "More than one property '{0}' on type '{1}' is compatible with the supplied arguments." + /// + internal static string PropertyWithMoreThanOneMatch(object p0, object p1) { + return FormatString("More than one property '{0}' on type '{1}' is compatible with the supplied arguments.", p0, p1); + } + + /// + /// A string like "An incorrect number of type args were specified for the declaration of a Func type." + /// + internal static string IncorrectNumberOfTypeArgsForFunc { + get { + return "An incorrect number of type args were specified for the declaration of a Func type."; + } + } + + /// + /// A string like "An incorrect number of type args were specified for the declaration of an Action type." + /// + internal static string IncorrectNumberOfTypeArgsForAction { + get { + return "An incorrect number of type args were specified for the declaration of an Action type."; + } + } + + /// + /// A string like "Argument type cannot be System.Void." + /// + internal static string ArgumentCannotBeOfTypeVoid { + get { + return "Argument type cannot be System.Void."; + } + } + + /// + /// A string like "More than one key matching '{0}' was found in the ExpandoObject." + /// + internal static string AmbiguousMatchInExpandoObject(object p0) { + return FormatString("More than one key matching '{0}' was found in the ExpandoObject.", p0); + } + + /// + /// A string like "An element with the same key '{0}' already exists in the ExpandoObject." + /// + internal static string SameKeyExistsInExpando(object p0) { + return FormatString("An element with the same key '{0}' already exists in the ExpandoObject.", p0); + } + + /// + /// A string like "The specified key '{0}' does not exist in the ExpandoObject." + /// + internal static string KeyDoesNotExistInExpando(object p0) { + return FormatString("The specified key '{0}' does not exist in the ExpandoObject.", p0); + } + + /// + /// A string like "No or Invalid rule produced" + /// + internal static string NoOrInvalidRuleProduced { + get { + return "No or Invalid rule produced"; + } + } + + /// + /// A string like "First argument of delegate must be CallSite" + /// + internal static string FirstArgumentMustBeCallSite { + get { + return "First argument of delegate must be CallSite"; + } + } + + /// + /// A string like "Bind cannot return null." + /// + internal static string BindingCannotBeNull { + get { + return "Bind cannot return null."; + } + } + + /// + /// A string like "Invalid operation: '{0}'" + /// + internal static string InvalidOperation(object p0) { + return FormatString("Invalid operation: '{0}'", p0); + } + + /// + /// A string like "{0} must be greater than or equal to {1}" + /// + internal static string OutOfRange(object p0, object p1) { + return FormatString("{0} must be greater than or equal to {1}", p0, p1); + } + + /// + /// A string like "Queue empty." + /// + internal static string QueueEmpty { + get { + return "Queue empty."; + } + } + + /// + /// A string like "Cannot redefine label '{0}' in an inner block." + /// + internal static string LabelTargetAlreadyDefined(object p0) { + return FormatString("Cannot redefine label '{0}' in an inner block.", p0); + } + + /// + /// A string like "Cannot jump to undefined label '{0}'." + /// + internal static string LabelTargetUndefined(object p0) { + return FormatString("Cannot jump to undefined label '{0}'.", p0); + } + + /// + /// A string like "Control cannot leave a finally block." + /// + internal static string ControlCannotLeaveFinally { + get { + return "Control cannot leave a finally block."; + } + } + + /// + /// A string like "Control cannot leave a filter test." + /// + internal static string ControlCannotLeaveFilterTest { + get { + return "Control cannot leave a filter test."; + } + } + + /// + /// A string like "Cannot jump to ambiguous label '{0}'." + /// + internal static string AmbiguousJump(object p0) { + return FormatString("Cannot jump to ambiguous label '{0}'.", p0); + } + + /// + /// A string like "Control cannot enter a try block." + /// + internal static string ControlCannotEnterTry { + get { + return "Control cannot enter a try block."; + } + } + + /// + /// A string like "Control cannot enter an expression--only statements can be jumped into." + /// + internal static string ControlCannotEnterExpression { + get { + return "Control cannot enter an expression--only statements can be jumped into."; + } + } + + /// + /// A string like "Cannot jump to non-local label '{0}' with a value. Only jumps to labels defined in outer blocks can pass values." + /// + internal static string NonLocalJumpWithValue(object p0) { + return FormatString("Cannot jump to non-local label '{0}' with a value. Only jumps to labels defined in outer blocks can pass values.", p0); + } + + /// + /// A string like "Extension should have been reduced." + /// + internal static string ExtensionNotReduced { + get { + return "Extension should have been reduced."; + } + } + + /// + /// A string like "CompileToMethod cannot compile constant '{0}' because it is a non-trivial value, such as a live object. Instead, create an expression tree that can construct this value." + /// + internal static string CannotCompileConstant(object p0) { + return FormatString("CompileToMethod cannot compile constant '{0}' because it is a non-trivial value, such as a live object. Instead, create an expression tree that can construct this value.", p0); + } + + /// + /// A string like "Dynamic expressions are not supported by CompileToMethod. Instead, create an expression tree that uses System.Runtime.CompilerServices.CallSite." + /// + internal static string CannotCompileDynamic { + get { + return "Dynamic expressions are not supported by CompileToMethod. Instead, create an expression tree that uses System.Runtime.CompilerServices.CallSite."; + } + } + + /// + /// A string like "Invalid lvalue for assignment: {0}." + /// + internal static string InvalidLvalue(object p0) { + return FormatString("Invalid lvalue for assignment: {0}.", p0); + } + + /// + /// A string like "Invalid member type: {0}." + /// + internal static string InvalidMemberType(object p0) { + return FormatString("Invalid member type: {0}.", p0); + } + + /// + /// A string like "unknown lift type: '{0}'." + /// + internal static string UnknownLiftType(object p0) { + return FormatString("unknown lift type: '{0}'.", p0); + } + + /// + /// A string like "Invalid output directory." + /// + internal static string InvalidOutputDir { + get { + return "Invalid output directory."; + } + } + + /// + /// A string like "Invalid assembly name or file extension." + /// + internal static string InvalidAsmNameOrExtension { + get { + return "Invalid assembly name or file extension."; + } + } + + /// + /// A string like "Collection is read-only." + /// + internal static string CollectionReadOnly { + get { + return "Collection is read-only."; + } + } + + /// + /// A string like "Cannot create instance of {0} because it contains generic parameters" + /// + internal static string IllegalNewGenericParams(object p0) { + return FormatString("Cannot create instance of {0} because it contains generic parameters", p0); + } + + /// + /// A string like "variable '{0}' of type '{1}' referenced from scope '{2}', but it is not defined" + /// + internal static string UndefinedVariable(object p0, object p1, object p2) { + return FormatString("variable '{0}' of type '{1}' referenced from scope '{2}', but it is not defined", p0, p1, p2); + } + + /// + /// A string like "Cannot close over byref parameter '{0}' referenced in lambda '{1}'" + /// + internal static string CannotCloseOverByRef(object p0, object p1) { + return FormatString("Cannot close over byref parameter '{0}' referenced in lambda '{1}'", p0, p1); + } + + /// + /// A string like "Unexpected VarArgs call to method '{0}'" + /// + internal static string UnexpectedVarArgsCall(object p0) { + return FormatString("Unexpected VarArgs call to method '{0}'", p0); + } + + /// + /// A string like "Rethrow statement is valid only inside a Catch block." + /// + internal static string RethrowRequiresCatch { + get { + return "Rethrow statement is valid only inside a Catch block."; + } + } + + /// + /// A string like "Try expression is not allowed inside a filter body." + /// + internal static string TryNotAllowedInFilter { + get { + return "Try expression is not allowed inside a filter body."; + } + } + + /// + /// A string like "When called from '{0}', rewriting a node of type '{1}' must return a non-null value of the same type. Alternatively, override '{2}' and change it to not visit children of this type." + /// + internal static string MustRewriteToSameNode(object p0, object p1, object p2) { + return FormatString("When called from '{0}', rewriting a node of type '{1}' must return a non-null value of the same type. Alternatively, override '{2}' and change it to not visit children of this type.", p0, p1, p2); + } + + /// + /// A string like "Rewriting child expression from type '{0}' to type '{1}' is not allowed, because it would change the meaning of the operation. If this is intentional, override '{2}' and change it to allow this rewrite." + /// + internal static string MustRewriteChildToSameType(object p0, object p1, object p2) { + return FormatString("Rewriting child expression from type '{0}' to type '{1}' is not allowed, because it would change the meaning of the operation. If this is intentional, override '{2}' and change it to allow this rewrite.", p0, p1, p2); + } + + /// + /// A string like "Rewritten expression calls operator method '{0}', but the original node had no operator method. If this is is intentional, override '{1}' and change it to allow this rewrite." + /// + internal static string MustRewriteWithoutMethod(object p0, object p1) { + return FormatString("Rewritten expression calls operator method '{0}', but the original node had no operator method. If this is is intentional, override '{1}' and change it to allow this rewrite.", p0, p1); + } + + /// + /// A string like "The value null is not of type '{0}' and cannot be used in this collection." + /// + internal static string InvalidNullValue(object p0) { + return FormatString("The value null is not of type '{0}' and cannot be used in this collection.", p0); + } + + /// + /// A string like "The value '{0}' is not of type '{1}' and cannot be used in this collection." + /// + internal static string InvalidObjectType(object p0, object p1) { + return FormatString("The value '{0}' is not of type '{1}' and cannot be used in this collection.", p0, p1); + } + + /// + /// A string like "TryExpression is not supported as an argument to method '{0}' because it has an argument with by-ref type. Construct the tree so the TryExpression is not nested inside of this expression." + /// + internal static string TryNotSupportedForMethodsWithRefArgs(object p0) { + return FormatString("TryExpression is not supported as an argument to method '{0}' because it has an argument with by-ref type. Construct the tree so the TryExpression is not nested inside of this expression.", p0); + } + + /// + /// A string like "TryExpression is not supported as a child expression when accessing a member on type '{0}' because it is a value type. Construct the tree so the TryExpression is not nested inside of this expression." + /// + internal static string TryNotSupportedForValueTypeInstances(object p0) { + return FormatString("TryExpression is not supported as a child expression when accessing a member on type '{0}' because it is a value type. Construct the tree so the TryExpression is not nested inside of this expression.", p0); + } + + /// + /// A string like "Collection was modified; enumeration operation may not execute." + /// + internal static string CollectionModifiedWhileEnumerating { + get { + return "Collection was modified; enumeration operation may not execute."; + } + } + + /// + /// A string like "Enumeration has either not started or has already finished." + /// + internal static string EnumerationIsDone { + get { + return "Enumeration has either not started or has already finished."; + } + } + + /// + /// A string like "Dynamic operations can only be performed in homogenous AppDomain." + /// + internal static string HomogenousAppDomainRequired { + get { + return "Dynamic operations can only be performed in homogenous AppDomain."; + } + } + + /// + /// A string like "Test value of type '{0}' cannot be used for the comparison method parameter of type '{1}'" + /// + internal static string TestValueTypeDoesNotMatchComparisonMethodParameter(object p0, object p1) { + return FormatString("Test value of type '{0}' cannot be used for the comparison method parameter of type '{1}'", p0, p1); + } + + /// + /// A string like "Switch value of type '{0}' cannot be used for the comparison method parameter of type '{1}'" + /// + internal static string SwitchValueTypeDoesNotMatchComparisonMethodParameter(object p0, object p1) { + return FormatString("Switch value of type '{0}' cannot be used for the comparison method parameter of type '{1}'", p0, p1); + } + + /// + /// A string like "An IDynamicMetaObjectProvider {0} created an invalid DynamicMetaObject instance." + /// + internal static string InvalidMetaObjectCreated(object p0) { + return FormatString("An IDynamicMetaObjectProvider {0} created an invalid DynamicMetaObject instance.", p0); + } + + } + /// + /// Strongly-typed and parameterized exception factory. + /// + + internal static partial class Error { + /// + /// ArgumentException with message like "Variable '{0}' uses unsupported type '{1}'. Reference types are not supported for variables." + /// + internal static Exception VariableMustNotBeByRef(object p0, object p1) { + return new ArgumentException(Strings.VariableMustNotBeByRef(p0, p1)); + } + + /// + /// ArgumentException with message like "Found duplicate parameter '{0}'. Each ParameterExpression in the list must be a unique object." + /// + internal static Exception DuplicateVariable(object p0) { + return new ArgumentException(Strings.DuplicateVariable(p0)); + } + + /// + /// ArgumentException with message like "Start and End must be well ordered" + /// + internal static Exception StartEndMustBeOrdered() { + return new ArgumentException(Strings.StartEndMustBeOrdered); + } + + /// + /// ArgumentException with message like "fault cannot be used with catch or finally clauses" + /// + internal static Exception FaultCannotHaveCatchOrFinally() { + return new ArgumentException(Strings.FaultCannotHaveCatchOrFinally); + } + + /// + /// ArgumentException with message like "try must have at least one catch, finally, or fault clause" + /// + internal static Exception TryMustHaveCatchFinallyOrFault() { + return new ArgumentException(Strings.TryMustHaveCatchFinallyOrFault); + } + + /// + /// ArgumentException with message like "Body of catch must have the same type as body of try." + /// + internal static Exception BodyOfCatchMustHaveSameTypeAsBodyOfTry() { + return new ArgumentException(Strings.BodyOfCatchMustHaveSameTypeAsBodyOfTry); + } + + /// + /// InvalidOperationException with message like "Extension node must override the property {0}." + /// + internal static Exception ExtensionNodeMustOverrideProperty(object p0) { + return new InvalidOperationException(Strings.ExtensionNodeMustOverrideProperty(p0)); + } + + /// + /// ArgumentException with message like "User-defined operator method '{0}' must be static." + /// + internal static Exception UserDefinedOperatorMustBeStatic(object p0) { + return new ArgumentException(Strings.UserDefinedOperatorMustBeStatic(p0)); + } + + /// + /// ArgumentException with message like "User-defined operator method '{0}' must not be void." + /// + internal static Exception UserDefinedOperatorMustNotBeVoid(object p0) { + return new ArgumentException(Strings.UserDefinedOperatorMustNotBeVoid(p0)); + } + + /// + /// InvalidOperationException with message like "No coercion operator is defined between types '{0}' and '{1}'." + /// + internal static Exception CoercionOperatorNotDefined(object p0, object p1) { + return new InvalidOperationException(Strings.CoercionOperatorNotDefined(p0, p1)); + } + + /// + /// InvalidCastException with message like "The result type '{0}' of the dynamic binding produced by binder '{1}' is not compatible with the result type '{2}' expected by the call site." + /// + internal static Exception DynamicBinderResultNotAssignable(object p0, object p1, object p2) { + return new InvalidCastException(Strings.DynamicBinderResultNotAssignable(p0, p1, p2)); + } + + /// + /// InvalidCastException with message like "The result type '{0}' of the dynamic binding produced by the object with type '{1}' for the binder '{2}' is not compatible with the result type '{3}' expected by the call site." + /// + internal static Exception DynamicObjectResultNotAssignable(object p0, object p1, object p2, object p3) { + return new InvalidCastException(Strings.DynamicObjectResultNotAssignable(p0, p1, p2, p3)); + } + + /// + /// InvalidOperationException with message like "The result of the dynamic binding produced by the object with type '{0}' for the binder '{1}' needs at least one restriction." + /// + internal static Exception DynamicBindingNeedsRestrictions(object p0, object p1) { + return new InvalidOperationException(Strings.DynamicBindingNeedsRestrictions(p0, p1)); + } + + /// + /// InvalidOperationException with message like "The result type '{0}' of the binder '{1}' is not compatible with the result type '{2}' expected by the call site." + /// + internal static Exception BinderNotCompatibleWithCallSite(object p0, object p1, object p2) { + return new InvalidOperationException(Strings.BinderNotCompatibleWithCallSite(p0, p1, p2)); + } + + /// + /// InvalidOperationException with message like "The unary operator {0} is not defined for the type '{1}'." + /// + internal static Exception UnaryOperatorNotDefined(object p0, object p1) { + return new InvalidOperationException(Strings.UnaryOperatorNotDefined(p0, p1)); + } + + /// + /// InvalidOperationException with message like "The binary operator {0} is not defined for the types '{1}' and '{2}'." + /// + internal static Exception BinaryOperatorNotDefined(object p0, object p1, object p2) { + return new InvalidOperationException(Strings.BinaryOperatorNotDefined(p0, p1, p2)); + } + + /// + /// InvalidOperationException with message like "Reference equality is not defined for the types '{0}' and '{1}'." + /// + internal static Exception ReferenceEqualityNotDefined(object p0, object p1) { + return new InvalidOperationException(Strings.ReferenceEqualityNotDefined(p0, p1)); + } + + /// + /// InvalidOperationException with message like "The operands for operator '{0}' do not match the parameters of method '{1}'." + /// + internal static Exception OperandTypesDoNotMatchParameters(object p0, object p1) { + return new InvalidOperationException(Strings.OperandTypesDoNotMatchParameters(p0, p1)); + } + + /// + /// InvalidOperationException with message like "The return type of overload method for operator '{0}' does not match the parameter type of conversion method '{1}'." + /// + internal static Exception OverloadOperatorTypeDoesNotMatchConversionType(object p0, object p1) { + return new InvalidOperationException(Strings.OverloadOperatorTypeDoesNotMatchConversionType(p0, p1)); + } + + /// + /// InvalidOperationException with message like "Conversion is not supported for arithmetic types without operator overloading." + /// + internal static Exception ConversionIsNotSupportedForArithmeticTypes() { + return new InvalidOperationException(Strings.ConversionIsNotSupportedForArithmeticTypes); + } + + /// + /// ArgumentException with message like "Argument must be array" + /// + internal static Exception ArgumentMustBeArray() { + return new ArgumentException(Strings.ArgumentMustBeArray); + } + + /// + /// ArgumentException with message like "Argument must be boolean" + /// + internal static Exception ArgumentMustBeBoolean() { + return new ArgumentException(Strings.ArgumentMustBeBoolean); + } + + /// + /// ArgumentException with message like "The user-defined equality method '{0}' must return a boolean value." + /// + internal static Exception EqualityMustReturnBoolean(object p0) { + return new ArgumentException(Strings.EqualityMustReturnBoolean(p0)); + } + + /// + /// ArgumentException with message like "Argument must be either a FieldInfo or PropertyInfo" + /// + internal static Exception ArgumentMustBeFieldInfoOrPropertInfo() { + return new ArgumentException(Strings.ArgumentMustBeFieldInfoOrPropertInfo); + } + + /// + /// ArgumentException with message like "Argument must be either a FieldInfo, PropertyInfo or MethodInfo" + /// + internal static Exception ArgumentMustBeFieldInfoOrPropertInfoOrMethod() { + return new ArgumentException(Strings.ArgumentMustBeFieldInfoOrPropertInfoOrMethod); + } + + /// + /// ArgumentException with message like "Argument must be an instance member" + /// + internal static Exception ArgumentMustBeInstanceMember() { + return new ArgumentException(Strings.ArgumentMustBeInstanceMember); + } + + /// + /// ArgumentException with message like "Argument must be of an integer type" + /// + internal static Exception ArgumentMustBeInteger() { + return new ArgumentException(Strings.ArgumentMustBeInteger); + } + + /// + /// ArgumentException with message like "Argument for array index must be of type Int32" + /// + internal static Exception ArgumentMustBeArrayIndexType() { + return new ArgumentException(Strings.ArgumentMustBeArrayIndexType); + } + + /// + /// ArgumentException with message like "Argument must be single dimensional array type" + /// + internal static Exception ArgumentMustBeSingleDimensionalArrayType() { + return new ArgumentException(Strings.ArgumentMustBeSingleDimensionalArrayType); + } + + /// + /// ArgumentException with message like "Argument types do not match" + /// + internal static Exception ArgumentTypesMustMatch() { + return new ArgumentException(Strings.ArgumentTypesMustMatch); + } + + /// + /// InvalidOperationException with message like "Cannot auto initialize elements of value type through property '{0}', use assignment instead" + /// + internal static Exception CannotAutoInitializeValueTypeElementThroughProperty(object p0) { + return new InvalidOperationException(Strings.CannotAutoInitializeValueTypeElementThroughProperty(p0)); + } + + /// + /// InvalidOperationException with message like "Cannot auto initialize members of value type through property '{0}', use assignment instead" + /// + internal static Exception CannotAutoInitializeValueTypeMemberThroughProperty(object p0) { + return new InvalidOperationException(Strings.CannotAutoInitializeValueTypeMemberThroughProperty(p0)); + } + + /// + /// ArgumentException with message like "The type used in TypeAs Expression must be of reference or nullable type, {0} is neither" + /// + internal static Exception IncorrectTypeForTypeAs(object p0) { + return new ArgumentException(Strings.IncorrectTypeForTypeAs(p0)); + } + + /// + /// InvalidOperationException with message like "Coalesce used with type that cannot be null" + /// + internal static Exception CoalesceUsedOnNonNullType() { + return new InvalidOperationException(Strings.CoalesceUsedOnNonNullType); + } + + /// + /// InvalidOperationException with message like "An expression of type '{0}' cannot be used to initialize an array of type '{1}'" + /// + internal static Exception ExpressionTypeCannotInitializeArrayType(object p0, object p1) { + return new InvalidOperationException(Strings.ExpressionTypeCannotInitializeArrayType(p0, p1)); + } + + /// + /// ArgumentException with message like "Expression of type '{0}' cannot be used for constructor parameter of type '{1}'" + /// + internal static Exception ExpressionTypeDoesNotMatchConstructorParameter(object p0, object p1) { + return new ArgumentException(Strings.ExpressionTypeDoesNotMatchConstructorParameter(p0, p1)); + } + + /// + /// ArgumentException with message like " Argument type '{0}' does not match the corresponding member type '{1}'" + /// + internal static Exception ArgumentTypeDoesNotMatchMember(object p0, object p1) { + return new ArgumentException(Strings.ArgumentTypeDoesNotMatchMember(p0, p1)); + } + + /// + /// ArgumentException with message like " The member '{0}' is not declared on type '{1}' being created" + /// + internal static Exception ArgumentMemberNotDeclOnType(object p0, object p1) { + return new ArgumentException(Strings.ArgumentMemberNotDeclOnType(p0, p1)); + } + + /// + /// ArgumentException with message like "Expression of type '{0}' cannot be used for parameter of type '{1}' of method '{2}'" + /// + internal static Exception ExpressionTypeDoesNotMatchMethodParameter(object p0, object p1, object p2) { + return new ArgumentException(Strings.ExpressionTypeDoesNotMatchMethodParameter(p0, p1, p2)); + } + + /// + /// ArgumentException with message like "Expression of type '{0}' cannot be used for parameter of type '{1}'" + /// + internal static Exception ExpressionTypeDoesNotMatchParameter(object p0, object p1) { + return new ArgumentException(Strings.ExpressionTypeDoesNotMatchParameter(p0, p1)); + } + + /// + /// ArgumentException with message like "Expression of type '{0}' cannot be used for return type '{1}'" + /// + internal static Exception ExpressionTypeDoesNotMatchReturn(object p0, object p1) { + return new ArgumentException(Strings.ExpressionTypeDoesNotMatchReturn(p0, p1)); + } + + /// + /// ArgumentException with message like "Expression of type '{0}' cannot be used for assignment to type '{1}'" + /// + internal static Exception ExpressionTypeDoesNotMatchAssignment(object p0, object p1) { + return new ArgumentException(Strings.ExpressionTypeDoesNotMatchAssignment(p0, p1)); + } + + /// + /// ArgumentException with message like "Expression of type '{0}' cannot be used for label of type '{1}'" + /// + internal static Exception ExpressionTypeDoesNotMatchLabel(object p0, object p1) { + return new ArgumentException(Strings.ExpressionTypeDoesNotMatchLabel(p0, p1)); + } + + /// + /// ArgumentException with message like "Expression of type '{0}' cannot be invoked" + /// + internal static Exception ExpressionTypeNotInvocable(object p0) { + return new ArgumentException(Strings.ExpressionTypeNotInvocable(p0)); + } + + /// + /// ArgumentException with message like "Field '{0}' is not defined for type '{1}'" + /// + internal static Exception FieldNotDefinedForType(object p0, object p1) { + return new ArgumentException(Strings.FieldNotDefinedForType(p0, p1)); + } + + /// + /// ArgumentException with message like "Instance field '{0}' is not defined for type '{1}'" + /// + internal static Exception InstanceFieldNotDefinedForType(object p0, object p1) { + return new ArgumentException(Strings.InstanceFieldNotDefinedForType(p0, p1)); + } + + /// + /// ArgumentException with message like "Field '{0}.{1}' is not defined for type '{2}'" + /// + internal static Exception FieldInfoNotDefinedForType(object p0, object p1, object p2) { + return new ArgumentException(Strings.FieldInfoNotDefinedForType(p0, p1, p2)); + } + + /// + /// ArgumentException with message like "Incorrect number of indexes" + /// + internal static Exception IncorrectNumberOfIndexes() { + return new ArgumentException(Strings.IncorrectNumberOfIndexes); + } + + /// + /// InvalidOperationException with message like "Incorrect number of arguments supplied for lambda invocation" + /// + internal static Exception IncorrectNumberOfLambdaArguments() { + return new InvalidOperationException(Strings.IncorrectNumberOfLambdaArguments); + } + + /// + /// ArgumentException with message like "Incorrect number of parameters supplied for lambda declaration" + /// + internal static Exception IncorrectNumberOfLambdaDeclarationParameters() { + return new ArgumentException(Strings.IncorrectNumberOfLambdaDeclarationParameters); + } + + /// + /// ArgumentException with message like "Incorrect number of arguments supplied for call to method '{0}'" + /// + internal static Exception IncorrectNumberOfMethodCallArguments(object p0) { + return new ArgumentException(Strings.IncorrectNumberOfMethodCallArguments(p0)); + } + + /// + /// ArgumentException with message like "Incorrect number of arguments for constructor" + /// + internal static Exception IncorrectNumberOfConstructorArguments() { + return new ArgumentException(Strings.IncorrectNumberOfConstructorArguments); + } + + /// + /// ArgumentException with message like " Incorrect number of members for constructor" + /// + internal static Exception IncorrectNumberOfMembersForGivenConstructor() { + return new ArgumentException(Strings.IncorrectNumberOfMembersForGivenConstructor); + } + + /// + /// ArgumentException with message like "Incorrect number of arguments for the given members " + /// + internal static Exception IncorrectNumberOfArgumentsForMembers() { + return new ArgumentException(Strings.IncorrectNumberOfArgumentsForMembers); + } + + /// + /// ArgumentException with message like "Lambda type parameter must be derived from System.Delegate" + /// + internal static Exception LambdaTypeMustBeDerivedFromSystemDelegate() { + return new ArgumentException(Strings.LambdaTypeMustBeDerivedFromSystemDelegate); + } + + /// + /// ArgumentException with message like "Member '{0}' not field or property" + /// + internal static Exception MemberNotFieldOrProperty(object p0) { + return new ArgumentException(Strings.MemberNotFieldOrProperty(p0)); + } + + /// + /// ArgumentException with message like "Method {0} contains generic parameters" + /// + internal static Exception MethodContainsGenericParameters(object p0) { + return new ArgumentException(Strings.MethodContainsGenericParameters(p0)); + } + + /// + /// ArgumentException with message like "Method {0} is a generic method definition" + /// + internal static Exception MethodIsGeneric(object p0) { + return new ArgumentException(Strings.MethodIsGeneric(p0)); + } + + /// + /// ArgumentException with message like "The method '{0}.{1}' is not a property accessor" + /// + internal static Exception MethodNotPropertyAccessor(object p0, object p1) { + return new ArgumentException(Strings.MethodNotPropertyAccessor(p0, p1)); + } + + /// + /// ArgumentException with message like "The property '{0}' has no 'get' accessor" + /// + internal static Exception PropertyDoesNotHaveGetter(object p0) { + return new ArgumentException(Strings.PropertyDoesNotHaveGetter(p0)); + } + + /// + /// ArgumentException with message like "The property '{0}' has no 'set' accessor" + /// + internal static Exception PropertyDoesNotHaveSetter(object p0) { + return new ArgumentException(Strings.PropertyDoesNotHaveSetter(p0)); + } + + /// + /// ArgumentException with message like "The property '{0}' has no 'get' or 'set' accessors" + /// + internal static Exception PropertyDoesNotHaveAccessor(object p0) { + return new ArgumentException(Strings.PropertyDoesNotHaveAccessor(p0)); + } + + /// + /// ArgumentException with message like "'{0}' is not a member of type '{1}'" + /// + internal static Exception NotAMemberOfType(object p0, object p1) { + return new ArgumentException(Strings.NotAMemberOfType(p0, p1)); + } + + /// + /// NotImplementedException with message like "The operator '{0}' is not implemented for type '{1}'" + /// + internal static Exception OperatorNotImplementedForType(object p0, object p1) { + return new NotImplementedException(Strings.OperatorNotImplementedForType(p0, p1)); + } + + /// + /// ArgumentException with message like "ParameterExpression of type '{0}' cannot be used for delegate parameter of type '{1}'" + /// + internal static Exception ParameterExpressionNotValidAsDelegate(object p0, object p1) { + return new ArgumentException(Strings.ParameterExpressionNotValidAsDelegate(p0, p1)); + } + + /// + /// ArgumentException with message like "Property '{0}' is not defined for type '{1}'" + /// + internal static Exception PropertyNotDefinedForType(object p0, object p1) { + return new ArgumentException(Strings.PropertyNotDefinedForType(p0, p1)); + } + + /// + /// ArgumentException with message like "Instance property '{0}' is not defined for type '{1}'" + /// + internal static Exception InstancePropertyNotDefinedForType(object p0, object p1) { + return new ArgumentException(Strings.InstancePropertyNotDefinedForType(p0, p1)); + } + + /// + /// ArgumentException with message like "Instance property '{0}' that takes no argument is not defined for type '{1}'" + /// + internal static Exception InstancePropertyWithoutParameterNotDefinedForType(object p0, object p1) { + return new ArgumentException(Strings.InstancePropertyWithoutParameterNotDefinedForType(p0, p1)); + } + + /// + /// ArgumentException with message like "Instance property '{0}{1}' is not defined for type '{2}'" + /// + internal static Exception InstancePropertyWithSpecifiedParametersNotDefinedForType(object p0, object p1, object p2) { + return new ArgumentException(Strings.InstancePropertyWithSpecifiedParametersNotDefinedForType(p0, p1, p2)); + } + + /// + /// ArgumentException with message like "Method '{0}' declared on type '{1}' cannot be called with instance of type '{2}'" + /// + internal static Exception InstanceAndMethodTypeMismatch(object p0, object p1, object p2) { + return new ArgumentException(Strings.InstanceAndMethodTypeMismatch(p0, p1, p2)); + } + + /// + /// ArgumentException with message like "Type {0} contains generic parameters" + /// + internal static Exception TypeContainsGenericParameters(object p0) { + return new ArgumentException(Strings.TypeContainsGenericParameters(p0)); + } + + /// + /// ArgumentException with message like "Type {0} is a generic type definition" + /// + internal static Exception TypeIsGeneric(object p0) { + return new ArgumentException(Strings.TypeIsGeneric(p0)); + } + + /// + /// ArgumentException with message like "Type '{0}' does not have a default constructor" + /// + internal static Exception TypeMissingDefaultConstructor(object p0) { + return new ArgumentException(Strings.TypeMissingDefaultConstructor(p0)); + } + + /// + /// ArgumentException with message like "List initializers must contain at least one initializer" + /// + internal static Exception ListInitializerWithZeroMembers() { + return new ArgumentException(Strings.ListInitializerWithZeroMembers); + } + + /// + /// ArgumentException with message like "Element initializer method must be named 'Add'" + /// + internal static Exception ElementInitializerMethodNotAdd() { + return new ArgumentException(Strings.ElementInitializerMethodNotAdd); + } + + /// + /// ArgumentException with message like "Parameter '{0}' of element initializer method '{1}' must not be a pass by reference parameter" + /// + internal static Exception ElementInitializerMethodNoRefOutParam(object p0, object p1) { + return new ArgumentException(Strings.ElementInitializerMethodNoRefOutParam(p0, p1)); + } + + /// + /// ArgumentException with message like "Element initializer method must have at least 1 parameter" + /// + internal static Exception ElementInitializerMethodWithZeroArgs() { + return new ArgumentException(Strings.ElementInitializerMethodWithZeroArgs); + } + + /// + /// ArgumentException with message like "Element initializer method must be an instance method" + /// + internal static Exception ElementInitializerMethodStatic() { + return new ArgumentException(Strings.ElementInitializerMethodStatic); + } + + /// + /// ArgumentException with message like "Type '{0}' is not IEnumerable" + /// + internal static Exception TypeNotIEnumerable(object p0) { + return new ArgumentException(Strings.TypeNotIEnumerable(p0)); + } + + /// + /// InvalidOperationException with message like "Type parameter is {0}. Expected a delegate." + /// + internal static Exception TypeParameterIsNotDelegate(object p0) { + return new InvalidOperationException(Strings.TypeParameterIsNotDelegate(p0)); + } + + /// + /// InvalidOperationException with message like "Unexpected coalesce operator." + /// + internal static Exception UnexpectedCoalesceOperator() { + return new InvalidOperationException(Strings.UnexpectedCoalesceOperator); + } + + /// + /// InvalidOperationException with message like "Cannot cast from type '{0}' to type '{1}" + /// + internal static Exception InvalidCast(object p0, object p1) { + return new InvalidOperationException(Strings.InvalidCast(p0, p1)); + } + + /// + /// ArgumentException with message like "Unhandled binary: {0}" + /// + internal static Exception UnhandledBinary(object p0) { + return new ArgumentException(Strings.UnhandledBinary(p0)); + } + + /// + /// ArgumentException with message like "Unhandled binding " + /// + internal static Exception UnhandledBinding() { + return new ArgumentException(Strings.UnhandledBinding); + } + + /// + /// ArgumentException with message like "Unhandled Binding Type: {0}" + /// + internal static Exception UnhandledBindingType(object p0) { + return new ArgumentException(Strings.UnhandledBindingType(p0)); + } + + /// + /// ArgumentException with message like "Unhandled convert: {0}" + /// + internal static Exception UnhandledConvert(object p0) { + return new ArgumentException(Strings.UnhandledConvert(p0)); + } + + /// + /// ArgumentException with message like "Unhandled Expression Type: {0}" + /// + internal static Exception UnhandledExpressionType(object p0) { + return new ArgumentException(Strings.UnhandledExpressionType(p0)); + } + + /// + /// ArgumentException with message like "Unhandled unary: {0}" + /// + internal static Exception UnhandledUnary(object p0) { + return new ArgumentException(Strings.UnhandledUnary(p0)); + } + + /// + /// ArgumentException with message like "Unknown binding type" + /// + internal static Exception UnknownBindingType() { + return new ArgumentException(Strings.UnknownBindingType); + } + + /// + /// ArgumentException with message like "The user-defined operator method '{1}' for operator '{0}' must have identical parameter and return types." + /// + internal static Exception UserDefinedOpMustHaveConsistentTypes(object p0, object p1) { + return new ArgumentException(Strings.UserDefinedOpMustHaveConsistentTypes(p0, p1)); + } + + /// + /// ArgumentException with message like "The user-defined operator method '{1}' for operator '{0}' must return the same type as its parameter or a derived type." + /// + internal static Exception UserDefinedOpMustHaveValidReturnType(object p0, object p1) { + return new ArgumentException(Strings.UserDefinedOpMustHaveValidReturnType(p0, p1)); + } + + /// + /// ArgumentException with message like "The user-defined operator method '{1}' for operator '{0}' must have associated boolean True and False operators." + /// + internal static Exception LogicalOperatorMustHaveBooleanOperators(object p0, object p1) { + return new ArgumentException(Strings.LogicalOperatorMustHaveBooleanOperators(p0, p1)); + } + + /// + /// InvalidOperationException with message like "No method '{0}' exists on type '{1}'." + /// + internal static Exception MethodDoesNotExistOnType(object p0, object p1) { + return new InvalidOperationException(Strings.MethodDoesNotExistOnType(p0, p1)); + } + + /// + /// InvalidOperationException with message like "No method '{0}' on type '{1}' is compatible with the supplied arguments." + /// + internal static Exception MethodWithArgsDoesNotExistOnType(object p0, object p1) { + return new InvalidOperationException(Strings.MethodWithArgsDoesNotExistOnType(p0, p1)); + } + + /// + /// InvalidOperationException with message like "No generic method '{0}' on type '{1}' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic. " + /// + internal static Exception GenericMethodWithArgsDoesNotExistOnType(object p0, object p1) { + return new InvalidOperationException(Strings.GenericMethodWithArgsDoesNotExistOnType(p0, p1)); + } + + /// + /// InvalidOperationException with message like "More than one method '{0}' on type '{1}' is compatible with the supplied arguments." + /// + internal static Exception MethodWithMoreThanOneMatch(object p0, object p1) { + return new InvalidOperationException(Strings.MethodWithMoreThanOneMatch(p0, p1)); + } + + /// + /// InvalidOperationException with message like "More than one property '{0}' on type '{1}' is compatible with the supplied arguments." + /// + internal static Exception PropertyWithMoreThanOneMatch(object p0, object p1) { + return new InvalidOperationException(Strings.PropertyWithMoreThanOneMatch(p0, p1)); + } + + /// + /// ArgumentException with message like "An incorrect number of type args were specified for the declaration of a Func type." + /// + internal static Exception IncorrectNumberOfTypeArgsForFunc() { + return new ArgumentException(Strings.IncorrectNumberOfTypeArgsForFunc); + } + + /// + /// ArgumentException with message like "An incorrect number of type args were specified for the declaration of an Action type." + /// + internal static Exception IncorrectNumberOfTypeArgsForAction() { + return new ArgumentException(Strings.IncorrectNumberOfTypeArgsForAction); + } + + /// + /// ArgumentException with message like "Argument type cannot be System.Void." + /// + internal static Exception ArgumentCannotBeOfTypeVoid() { + return new ArgumentException(Strings.ArgumentCannotBeOfTypeVoid); + } + + /// + /// System.Reflection.AmbiguousMatchException with message like "More than one key matching '{0}' was found in the ExpandoObject." + /// + internal static Exception AmbiguousMatchInExpandoObject(object p0) { + return new System.Reflection.AmbiguousMatchException(Strings.AmbiguousMatchInExpandoObject(p0)); + } + + /// + /// ArgumentException with message like "An element with the same key '{0}' already exists in the ExpandoObject." + /// + internal static Exception SameKeyExistsInExpando(object p0) { + return new ArgumentException(Strings.SameKeyExistsInExpando(p0)); + } + + /// + /// System.Collections.Generic.KeyNotFoundException with message like "The specified key '{0}' does not exist in the ExpandoObject." + /// + internal static Exception KeyDoesNotExistInExpando(object p0) { + return new System.Collections.Generic.KeyNotFoundException(Strings.KeyDoesNotExistInExpando(p0)); + } + + /// + /// InvalidOperationException with message like "No or Invalid rule produced" + /// + internal static Exception NoOrInvalidRuleProduced() { + return new InvalidOperationException(Strings.NoOrInvalidRuleProduced); + } + + /// + /// ArgumentException with message like "First argument of delegate must be CallSite" + /// + internal static Exception FirstArgumentMustBeCallSite() { + return new ArgumentException(Strings.FirstArgumentMustBeCallSite); + } + + /// + /// InvalidOperationException with message like "Bind cannot return null." + /// + internal static Exception BindingCannotBeNull() { + return new InvalidOperationException(Strings.BindingCannotBeNull); + } + + /// + /// ArgumentException with message like "Invalid operation: '{0}'" + /// + internal static Exception InvalidOperation(object p0) { + return new ArgumentException(Strings.InvalidOperation(p0)); + } + + /// + /// ArgumentOutOfRangeException with message like "{0} must be greater than or equal to {1}" + /// + internal static Exception OutOfRange(object p0, object p1) { + return new ArgumentOutOfRangeException(Strings.OutOfRange(p0, p1)); + } + + /// + /// InvalidOperationException with message like "Queue empty." + /// + internal static Exception QueueEmpty() { + return new InvalidOperationException(Strings.QueueEmpty); + } + + /// + /// InvalidOperationException with message like "Cannot redefine label '{0}' in an inner block." + /// + internal static Exception LabelTargetAlreadyDefined(object p0) { + return new InvalidOperationException(Strings.LabelTargetAlreadyDefined(p0)); + } + + /// + /// InvalidOperationException with message like "Cannot jump to undefined label '{0}'." + /// + internal static Exception LabelTargetUndefined(object p0) { + return new InvalidOperationException(Strings.LabelTargetUndefined(p0)); + } + + /// + /// InvalidOperationException with message like "Control cannot leave a finally block." + /// + internal static Exception ControlCannotLeaveFinally() { + return new InvalidOperationException(Strings.ControlCannotLeaveFinally); + } + + /// + /// InvalidOperationException with message like "Control cannot leave a filter test." + /// + internal static Exception ControlCannotLeaveFilterTest() { + return new InvalidOperationException(Strings.ControlCannotLeaveFilterTest); + } + + /// + /// InvalidOperationException with message like "Cannot jump to ambiguous label '{0}'." + /// + internal static Exception AmbiguousJump(object p0) { + return new InvalidOperationException(Strings.AmbiguousJump(p0)); + } + + /// + /// InvalidOperationException with message like "Control cannot enter a try block." + /// + internal static Exception ControlCannotEnterTry() { + return new InvalidOperationException(Strings.ControlCannotEnterTry); + } + + /// + /// InvalidOperationException with message like "Control cannot enter an expression--only statements can be jumped into." + /// + internal static Exception ControlCannotEnterExpression() { + return new InvalidOperationException(Strings.ControlCannotEnterExpression); + } + + /// + /// InvalidOperationException with message like "Cannot jump to non-local label '{0}' with a value. Only jumps to labels defined in outer blocks can pass values." + /// + internal static Exception NonLocalJumpWithValue(object p0) { + return new InvalidOperationException(Strings.NonLocalJumpWithValue(p0)); + } + + /// + /// InvalidOperationException with message like "Extension should have been reduced." + /// + internal static Exception ExtensionNotReduced() { + return new InvalidOperationException(Strings.ExtensionNotReduced); + } + + /// + /// InvalidOperationException with message like "CompileToMethod cannot compile constant '{0}' because it is a non-trivial value, such as a live object. Instead, create an expression tree that can construct this value." + /// + internal static Exception CannotCompileConstant(object p0) { + return new InvalidOperationException(Strings.CannotCompileConstant(p0)); + } + + /// + /// NotSupportedException with message like "Dynamic expressions are not supported by CompileToMethod. Instead, create an expression tree that uses System.Runtime.CompilerServices.CallSite." + /// + internal static Exception CannotCompileDynamic() { + return new NotSupportedException(Strings.CannotCompileDynamic); + } + + /// + /// InvalidOperationException with message like "Invalid lvalue for assignment: {0}." + /// + internal static Exception InvalidLvalue(object p0) { + return new InvalidOperationException(Strings.InvalidLvalue(p0)); + } + + /// + /// InvalidOperationException with message like "Invalid member type: {0}." + /// + internal static Exception InvalidMemberType(object p0) { + return new InvalidOperationException(Strings.InvalidMemberType(p0)); + } + + /// + /// InvalidOperationException with message like "unknown lift type: '{0}'." + /// + internal static Exception UnknownLiftType(object p0) { + return new InvalidOperationException(Strings.UnknownLiftType(p0)); + } + + /// + /// ArgumentException with message like "Invalid output directory." + /// + internal static Exception InvalidOutputDir() { + return new ArgumentException(Strings.InvalidOutputDir); + } + + /// + /// ArgumentException with message like "Invalid assembly name or file extension." + /// + internal static Exception InvalidAsmNameOrExtension() { + return new ArgumentException(Strings.InvalidAsmNameOrExtension); + } + + /// + /// NotSupportedException with message like "Collection is read-only." + /// + internal static Exception CollectionReadOnly() { + return new NotSupportedException(Strings.CollectionReadOnly); + } + + /// + /// ArgumentException with message like "Cannot create instance of {0} because it contains generic parameters" + /// + internal static Exception IllegalNewGenericParams(object p0) { + return new ArgumentException(Strings.IllegalNewGenericParams(p0)); + } + + /// + /// InvalidOperationException with message like "variable '{0}' of type '{1}' referenced from scope '{2}', but it is not defined" + /// + internal static Exception UndefinedVariable(object p0, object p1, object p2) { + return new InvalidOperationException(Strings.UndefinedVariable(p0, p1, p2)); + } + + /// + /// InvalidOperationException with message like "Cannot close over byref parameter '{0}' referenced in lambda '{1}'" + /// + internal static Exception CannotCloseOverByRef(object p0, object p1) { + return new InvalidOperationException(Strings.CannotCloseOverByRef(p0, p1)); + } + + /// + /// InvalidOperationException with message like "Unexpected VarArgs call to method '{0}'" + /// + internal static Exception UnexpectedVarArgsCall(object p0) { + return new InvalidOperationException(Strings.UnexpectedVarArgsCall(p0)); + } + + /// + /// InvalidOperationException with message like "Rethrow statement is valid only inside a Catch block." + /// + internal static Exception RethrowRequiresCatch() { + return new InvalidOperationException(Strings.RethrowRequiresCatch); + } + + /// + /// InvalidOperationException with message like "Try expression is not allowed inside a filter body." + /// + internal static Exception TryNotAllowedInFilter() { + return new InvalidOperationException(Strings.TryNotAllowedInFilter); + } + + /// + /// InvalidOperationException with message like "When called from '{0}', rewriting a node of type '{1}' must return a non-null value of the same type. Alternatively, override '{2}' and change it to not visit children of this type." + /// + internal static Exception MustRewriteToSameNode(object p0, object p1, object p2) { + return new InvalidOperationException(Strings.MustRewriteToSameNode(p0, p1, p2)); + } + + /// + /// InvalidOperationException with message like "Rewriting child expression from type '{0}' to type '{1}' is not allowed, because it would change the meaning of the operation. If this is intentional, override '{2}' and change it to allow this rewrite." + /// + internal static Exception MustRewriteChildToSameType(object p0, object p1, object p2) { + return new InvalidOperationException(Strings.MustRewriteChildToSameType(p0, p1, p2)); + } + + /// + /// InvalidOperationException with message like "Rewritten expression calls operator method '{0}', but the original node had no operator method. If this is is intentional, override '{1}' and change it to allow this rewrite." + /// + internal static Exception MustRewriteWithoutMethod(object p0, object p1) { + return new InvalidOperationException(Strings.MustRewriteWithoutMethod(p0, p1)); + } + + /// + /// ArgumentNullException with message like "The value null is not of type '{0}' and cannot be used in this collection." + /// + internal static Exception InvalidNullValue(object p0) { + return new ArgumentNullException(Strings.InvalidNullValue(p0)); + } + + /// + /// ArgumentException with message like "The value '{0}' is not of type '{1}' and cannot be used in this collection." + /// + internal static Exception InvalidObjectType(object p0, object p1) { + return new ArgumentException(Strings.InvalidObjectType(p0, p1)); + } + + /// + /// NotSupportedException with message like "TryExpression is not supported as an argument to method '{0}' because it has an argument with by-ref type. Construct the tree so the TryExpression is not nested inside of this expression." + /// + internal static Exception TryNotSupportedForMethodsWithRefArgs(object p0) { + return new NotSupportedException(Strings.TryNotSupportedForMethodsWithRefArgs(p0)); + } + + /// + /// NotSupportedException with message like "TryExpression is not supported as a child expression when accessing a member on type '{0}' because it is a value type. Construct the tree so the TryExpression is not nested inside of this expression." + /// + internal static Exception TryNotSupportedForValueTypeInstances(object p0) { + return new NotSupportedException(Strings.TryNotSupportedForValueTypeInstances(p0)); + } + + /// + /// InvalidOperationException with message like "Collection was modified; enumeration operation may not execute." + /// + internal static Exception CollectionModifiedWhileEnumerating() { + return new InvalidOperationException(Strings.CollectionModifiedWhileEnumerating); + } + + /// + /// InvalidOperationException with message like "Enumeration has either not started or has already finished." + /// + internal static Exception EnumerationIsDone() { + return new InvalidOperationException(Strings.EnumerationIsDone); + } + + /// + /// InvalidOperationException with message like "Dynamic operations can only be performed in homogenous AppDomain." + /// + internal static Exception HomogenousAppDomainRequired() { + return new InvalidOperationException(Strings.HomogenousAppDomainRequired); + } + + /// + /// ArgumentException with message like "Test value of type '{0}' cannot be used for the comparison method parameter of type '{1}'" + /// + internal static Exception TestValueTypeDoesNotMatchComparisonMethodParameter(object p0, object p1) { + return new ArgumentException(Strings.TestValueTypeDoesNotMatchComparisonMethodParameter(p0, p1)); + } + + /// + /// ArgumentException with message like "Switch value of type '{0}' cannot be used for the comparison method parameter of type '{1}'" + /// + internal static Exception SwitchValueTypeDoesNotMatchComparisonMethodParameter(object p0, object p1) { + return new ArgumentException(Strings.SwitchValueTypeDoesNotMatchComparisonMethodParameter(p0, p1)); + } + + /// + /// InvalidOperationException with message like "An IDynamicMetaObjectProvider {0} created an invalid DynamicMetaObject instance." + /// + internal static Exception InvalidMetaObjectCreated(object p0) { + return new InvalidOperationException(Strings.InvalidMetaObjectCreated(p0)); + } + + } + + // *** END GENERATED CODE *** + + #endregion + +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Extension.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Extension.cs new file mode 100644 index 00000000000..f42f7a8516a --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Extension.cs @@ -0,0 +1,14 @@ +#if CODEPLEX_40 +using System; +#else +using System; using Microsoft; +#endif + +namespace System.Runtime.CompilerServices +{ + /// + /// Indicates that a method is an extension method, or that a class or assembly contains extension methods. + /// + [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)] + public sealed class ExtensionAttribute : Attribute { } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Function.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Function.cs new file mode 100644 index 00000000000..be68a4f7145 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Function.cs @@ -0,0 +1,711 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +namespace System { +#else +namespace Microsoft { +#endif + + #if MICROSOFT_SCRIPTING_CORE + + /// + /// Encapsulates a method that has no parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the return value of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + public delegate TResult Func(); + + /// + /// Encapsulates a method that has one parameter and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + public delegate TResult Func(T arg); + + #endif + + #region Generated Func Types + + // *** BEGIN GENERATED CODE *** + // generated by function: gen_func_types from: generate_dynsites.py + +#if MICROSOFT_SCRIPTING_CORE + + /// + /// Encapsulates a method that has two parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2); + + /// + /// Encapsulates a method that has three parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3); + + /// + /// Encapsulates a method that has four parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4); + + /// + /// Encapsulates a method that has five parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5); + + /// + /// Encapsulates a method that has six parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6); + + /// + /// Encapsulates a method that has seven parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7); + + /// + /// Encapsulates a method that has eight parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8); + + /// + /// Encapsulates a method that has nine parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9); + + /// + /// Encapsulates a method that has ten parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10); + + /// + /// Encapsulates a method that has eleven parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11); + + /// + /// Encapsulates a method that has twelve parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12); + + /// + /// Encapsulates a method that has thirteen parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13); + + /// + /// Encapsulates a method that has fourteen parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14); + + /// + /// Encapsulates a method that has fifteen parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The type of the fifteenth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + /// The fifteenth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15); + + /// + /// Encapsulates a method that has sixteen parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The type of the fifteenth parameter of the method that this delegate encapsulates. + /// The type of the sixteenth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + /// The fifteenth parameter of the method that this delegate encapsulates. + /// The sixteenth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16); +#else + + /// + /// Encapsulates a method that has nine parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9); + + /// + /// Encapsulates a method that has ten parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10); + + /// + /// Encapsulates a method that has eleven parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11); + + /// + /// Encapsulates a method that has twelve parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12); + + /// + /// Encapsulates a method that has thirteen parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13); + + /// + /// Encapsulates a method that has fourteen parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14); + + /// + /// Encapsulates a method that has fifteen parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The type of the fifteenth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + /// The fifteenth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15); + + /// + /// Encapsulates a method that has sixteen parameters and returns a value of the type specified by the TResult parameter. + /// + /// The type of the first parameter of the method that this delegate encapsulates. + /// The type of the second parameter of the method that this delegate encapsulates. + /// The type of the third parameter of the method that this delegate encapsulates. + /// The type of the fourth parameter of the method that this delegate encapsulates. + /// The type of the fifth parameter of the method that this delegate encapsulates. + /// The type of the sixth parameter of the method that this delegate encapsulates. + /// The type of the seventh parameter of the method that this delegate encapsulates. + /// The type of the eighth parameter of the method that this delegate encapsulates. + /// The type of the ninth parameter of the method that this delegate encapsulates. + /// The type of the tenth parameter of the method that this delegate encapsulates. + /// The type of the eleventh parameter of the method that this delegate encapsulates. + /// The type of the twelfth parameter of the method that this delegate encapsulates. + /// The type of the thirteenth parameter of the method that this delegate encapsulates. + /// The type of the fourteenth parameter of the method that this delegate encapsulates. + /// The type of the fifteenth parameter of the method that this delegate encapsulates. + /// The type of the sixteenth parameter of the method that this delegate encapsulates. + /// The type of the return value of the method that this delegate encapsulates. + /// The first parameter of the method that this delegate encapsulates. + /// The second parameter of the method that this delegate encapsulates. + /// The third parameter of the method that this delegate encapsulates. + /// The fourth parameter of the method that this delegate encapsulates. + /// The fifth parameter of the method that this delegate encapsulates. + /// The sixth parameter of the method that this delegate encapsulates. + /// The seventh parameter of the method that this delegate encapsulates. + /// The eighth parameter of the method that this delegate encapsulates. + /// The ninth parameter of the method that this delegate encapsulates. + /// The tenth parameter of the method that this delegate encapsulates. + /// The eleventh parameter of the method that this delegate encapsulates. + /// The twelfth parameter of the method that this delegate encapsulates. + /// The thirteenth parameter of the method that this delegate encapsulates. + /// The fourteenth parameter of the method that this delegate encapsulates. + /// The fifteenth parameter of the method that this delegate encapsulates. + /// The sixteenth parameter of the method that this delegate encapsulates. + /// The return value of the method that this delegate encapsulates. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1005:AvoidExcessiveParametersOnGenericTypes")] + public delegate TResult Func(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16); + +#endif + + // *** END GENERATED CODE *** + + #endregion +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Helpers.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Helpers.cs new file mode 100644 index 00000000000..ec62bed8ba4 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/Helpers.cs @@ -0,0 +1,57 @@ + +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic.Utils { +#else +namespace Microsoft.Scripting.Utils { +#endif + // Miscellaneous helpers that don't belong anywhere else + internal static class Helpers { + + internal static T CommonNode(T first, T second, Func parent) where T : class { + var cmp = EqualityComparer.Default; + if (cmp.Equals(first, second)) { + return first; + } + var set = new Set(cmp); + for (T t = first; t != null; t = parent(t)) { + set.Add(t); + } + for (T t = second; t != null; t = parent(t)) { + if (set.Contains(t)) { + return t; + } + } + return null; + } + + internal static void IncrementCount(T key, Dictionary dict) { + int count; + dict.TryGetValue(key, out count); + dict[key] = count + 1; + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/IRuntimeVariables.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/IRuntimeVariables.cs new file mode 100644 index 00000000000..72abfe2a0c9 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/IRuntimeVariables.cs @@ -0,0 +1,39 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + /// + /// An interface to represent values of runtime variables. + /// + public interface IRuntimeVariables { + /// + /// Count of the variables. + /// + int Count { get; } + + /// + /// An indexer to get/set the values of the runtime variables. + /// + /// An index of the runtime variable. + /// The value of the runtime variable. + object this[int index] { get; set; } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ReadOnlyCollectionBuilder.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ReadOnlyCollectionBuilder.cs new file mode 100644 index 00000000000..e9c24a93bf9 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ReadOnlyCollectionBuilder.cs @@ -0,0 +1,525 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +#if CODEPLEX_40 +using System.Dynamic.Utils; +using System.Linq.Expressions; +#else +using Microsoft.Scripting.Utils; +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + /// + /// The builder for read only collection. + /// + /// The type of the collection element. + [Serializable] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] + public sealed class ReadOnlyCollectionBuilder : IList, System.Collections.IList { + private const int DefaultCapacity = 4; + + private T[] _items; + private int _size; + private int _version; + [NonSerialized] + private Object _syncRoot; + + static readonly T[] _emptyArray = new T[0]; + + /// + /// Constructs a ReadOnlyCollectionBuilder. + /// + public ReadOnlyCollectionBuilder() { + _items = _emptyArray; + } + + /// + /// Constructs a ReadOnlyCollectionBuilder with a given initial capacity. + /// The contents are empty but builder will have reserved room for the given + /// number of elements before any reallocations are required. + /// + public ReadOnlyCollectionBuilder(int capacity) { + ContractUtils.Requires(capacity >= 0, "capacity"); + _items = new T[capacity]; + } + + /// + /// Constructs a ReadOnlyCollectionBuilder, copying contents of the given collection. + /// + /// + public ReadOnlyCollectionBuilder(IEnumerable collection) { + ContractUtils.Requires(collection != null, "collection"); + + ICollection c = collection as ICollection; + if (c != null) { + int count = c.Count; + _items = new T[count]; + c.CopyTo(_items, 0); + _size = count; + } else { + _size = 0; + _items = new T[DefaultCapacity]; + + using (IEnumerator en = collection.GetEnumerator()) { + while (en.MoveNext()) { + Add(en.Current); + } + } + } + } + + /// + /// Gets and sets the capacity of this ReadOnlyCollectionBuilder + /// + public int Capacity { + get { return _items.Length; } + set { + ContractUtils.Requires(value >= _size, "value"); + + if (value != _items.Length) { + if (value > 0) { + T[] newItems = new T[value]; + if (_size > 0) { + Array.Copy(_items, 0, newItems, 0, _size); + } + _items = newItems; + } else { + _items = _emptyArray; + } + } + } + } + + /// + /// Returns number of elements in the ReadOnlyCollectionBuilder. + /// + public int Count { + get { return _size; } + } + + #region IList Members + + /// + /// Returns the index of the first occurrence of a given value in the builder. + /// + /// An item to search for. + /// The index of the first occurrence of an item. + public int IndexOf(T item) { + return Array.IndexOf(_items, item, 0, _size); + } + + /// + /// Inserts an item to the at the specified index. + /// + /// The zero-based index at which item should be inserted. + /// The object to insert into the . + public void Insert(int index, T item) { + ContractUtils.Requires(index <= _size, "index"); + + if (_size == _items.Length) { + EnsureCapacity(_size + 1); + } + if (index < _size) { + Array.Copy(_items, index, _items, index + 1, _size - index); + } + _items[index] = item; + _size++; + _version++; + } + + /// + /// Removes the item at the specified index. + /// + /// The zero-based index of the item to remove. + public void RemoveAt(int index) { + ContractUtils.Requires(index >= 0 && index < _size, "index"); + + _size--; + if (index < _size) { + Array.Copy(_items, index + 1, _items, index, _size - index); + } + _items[_size] = default(T); + _version++; + } + + /// + /// Gets or sets the element at the specified index. + /// + /// The zero-based index of the element to get or set. + /// The element at the specified index. + public T this[int index] { + get { + ContractUtils.Requires(index < _size, "index"); + return _items[index]; + } + set { + ContractUtils.Requires(index < _size, "index"); + _items[index] = value; + _version++; + } + } + + #endregion + + #region ICollection Members + + /// + /// Adds an item to the . + /// + /// The object to add to the . + public void Add(T item) { + if (_size == _items.Length) { + EnsureCapacity(_size + 1); + } + _items[_size++] = item; + _version++; + } + + /// + /// Removes all items from the . + /// + public void Clear() { + if (_size > 0) { + Array.Clear(_items, 0, _size); + _size = 0; + } + _version++; + } + + /// + /// Determines whether the contains a specific value + /// + /// the object to locate in the . + /// true if item is found in the ; otherwise, false. + public bool Contains(T item) { + if ((Object)item == null) { + for (int i = 0; i < _size; i++) { + if ((Object)_items[i] == null) { + return true; + } + } + return false; + } else { + EqualityComparer c = EqualityComparer.Default; + for (int i = 0; i < _size; i++) { + if (c.Equals(_items[i], item)) { + return true; + } + } + return false; + } + } + + /// + /// Copies the elements of the to an , + /// starting at particular index. + /// + /// The one-dimensional that is the destination of the elements copied from . + /// The zero-based index in array at which copying begins. + public void CopyTo(T[] array, int arrayIndex) { + Array.Copy(_items, 0, array, arrayIndex, _size); + } + + bool ICollection.IsReadOnly { + get { return false; } + } + + /// + /// Removes the first occurrence of a specific object from the . + /// + /// The object to remove from the . + /// true if item was successfully removed from the ; + /// otherwise, false. This method also returns false if item is not found in the original . + /// + public bool Remove(T item) { + int index = IndexOf(item); + if (index >= 0) { + RemoveAt(index); + return true; + } + + return false; + } + + #endregion + + #region IEnumerable Members + + /// + /// Returns an enumerator that iterates through the collection. + /// + /// A that can be used to iterate through the collection. + public IEnumerator GetEnumerator() { + return new Enumerator(this); + } + + #endregion + + #region IEnumerable Members + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { + return GetEnumerator(); + } + + #endregion + + #region IList Members + + bool System.Collections.IList.IsReadOnly { + get { return false; } + } + + int System.Collections.IList.Add(object value) { + ValidateNullValue(value, "value"); + try { + Add((T)value); + } catch (InvalidCastException) { + ThrowInvalidTypeException(value, "value"); + } + return Count - 1; + } + + bool System.Collections.IList.Contains(object value) { + if (IsCompatibleObject(value)) { + return Contains((T)value); + } else return false; + } + + int System.Collections.IList.IndexOf(object value) { + if (IsCompatibleObject(value)) { + return IndexOf((T)value); + } + return -1; + } + + void System.Collections.IList.Insert(int index, object value) { + ValidateNullValue(value, "value"); + try { + Insert(index, (T)value); + } catch (InvalidCastException) { + ThrowInvalidTypeException(value, "value"); + } + } + + bool System.Collections.IList.IsFixedSize { + get { return false; } + } + + void System.Collections.IList.Remove(object value) { + if (IsCompatibleObject(value)) { + Remove((T)value); + } + } + + object System.Collections.IList.this[int index] { + get { + return this[index]; + } + set { + ValidateNullValue(value, "value"); + + try { + this[index] = (T)value; + } catch (InvalidCastException) { + ThrowInvalidTypeException(value, "value"); + } + } + } + + #endregion + + #region ICollection Members + + void System.Collections.ICollection.CopyTo(Array array, int index) { + ContractUtils.RequiresNotNull(array, "array"); + ContractUtils.Requires(array.Rank == 1, "array"); + Array.Copy(_items, 0, array, index, _size); + } + + bool System.Collections.ICollection.IsSynchronized { + get { return false; } + } + + object System.Collections.ICollection.SyncRoot { + get { + if (_syncRoot == null) { + System.Threading.Interlocked.CompareExchange(ref _syncRoot, new Object(), null); + } + return _syncRoot; + } + } + + #endregion + + /// + /// Reverses the order of the elements in the entire . + /// + public void Reverse() { + Reverse(0, Count); + } + + /// + /// Reverses the order of the elements in the specified range. + /// + /// The zero-based starting index of the range to reverse. + /// The number of elements in the range to reverse. + public void Reverse(int index, int count) { + ContractUtils.Requires(index >= 0, "index"); + ContractUtils.Requires(count >= 0, "count"); + + Array.Reverse(_items, index, count); + _version++; + } + + /// + /// Copies the elements of the to a new array. + /// + /// An array containing copies of the elements of the . + public T[] ToArray() { + T[] array = new T[_size]; + Array.Copy(_items, 0, array, 0, _size); + return array; + } + + /// + /// Creates a containing all of the the elements of the , + /// avoiding copying the elements to the new array if possible. Resets the after the + /// has been created. + /// + /// A new instance of . + public ReadOnlyCollection ToReadOnlyCollection() { + // Can we use the stored array? + T[] items; + if (_size == _items.Length) { + items = _items; + } else { + items = ToArray(); + } + _items = _emptyArray; + _size = 0; + _version++; + + return new TrueReadOnlyCollection(items); + } + + private void EnsureCapacity(int min) { + if (_items.Length < min) { + int newCapacity = DefaultCapacity; + if (_items.Length > 0) { + newCapacity = _items.Length * 2; + } + if (newCapacity < min) { + newCapacity = min; + } + Capacity = newCapacity; + } + } + + private static bool IsCompatibleObject(object value) { + return ((value is T) || (value == null && default(T) == null)); + } + + private static void ValidateNullValue(object value, string argument) { + if (value == null && !(default(T) == null)) { + throw new ArgumentException(Strings.InvalidNullValue(typeof(T)), argument); + } + } + + private static void ThrowInvalidTypeException(object value, string argument) { + throw new ArgumentException(Strings.InvalidObjectType(value != null ? value.GetType() : (object)"null", typeof(T)), argument); + } + + [Serializable] + private class Enumerator : IEnumerator, System.Collections.IEnumerator { + private readonly ReadOnlyCollectionBuilder _builder; + private readonly int _version; + + private int _index; + private T _current; + + internal Enumerator(ReadOnlyCollectionBuilder builder) { + _builder = builder; + _version = builder._version; + _index = 0; + _current = default(T); + } + + #region IEnumerator Members + + public T Current { + get { return _current; } + } + + #endregion + + #region IDisposable Members + + public void Dispose() { + GC.SuppressFinalize(this); + } + + #endregion + + #region IEnumerator Members + + object System.Collections.IEnumerator.Current { + get { + if (_index == 0 || _index > _builder._size) { + throw Error.EnumerationIsDone(); + } + return _current; + } + } + + public bool MoveNext() { + if (_version == _builder._version) { + if (_index < _builder._size) { + _current = _builder._items[_index++]; + return true; + } else { + _index = _builder._size + 1; + _current = default(T); + return false; + } + } else { + throw Error.CollectionModifiedWhileEnumerating(); + } + } + + #endregion + + #region IEnumerator Members + + void System.Collections.IEnumerator.Reset() { + if (_version != _builder._version) { + throw Error.CollectionModifiedWhileEnumerating(); + } + _index = 0; + _current = default(T); + } + + #endregion + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ReadOnlyDictionary.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ReadOnlyDictionary.cs new file mode 100644 index 00000000000..3d444f371b9 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ReadOnlyDictionary.cs @@ -0,0 +1,205 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +#if CODEPLEX_40 +using System.Linq.Expressions; +#else +using Microsoft.Linq.Expressions; +#endif + +#if CODEPLEX_40 +namespace System.Dynamic.Utils { +#else +namespace Microsoft.Scripting.Utils { +#endif + + // Like ReadOnlyCollection: wraps an IDictionary in a read-only wrapper + internal sealed class ReadOnlyDictionary : IDictionary { + + // For wrapping non-readonly Keys, Values collections + // Not used for standard dictionaries, which return read-only Keys and Values + private sealed class ReadOnlyWrapper : ICollection { + // no idea why this warning is here + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + private readonly ICollection _collection; + + internal ReadOnlyWrapper(ICollection collection) { + _collection = collection; + } + + #region ICollection Members + + public void Add(T item) { + throw Error.CollectionReadOnly(); + } + + public void Clear() { + throw Error.CollectionReadOnly(); + } + + public bool Contains(T item) { + return _collection.Contains(item); + } + + public void CopyTo(T[] array, int arrayIndex) { + _collection.CopyTo(array, arrayIndex); + } + + public int Count { + get { return _collection.Count; } + } + + public bool IsReadOnly { + get { return true; } + } + + public bool Remove(T item) { + throw Error.CollectionReadOnly(); + } + + #endregion + + #region IEnumerable Members + + public IEnumerator GetEnumerator() { + return _collection.GetEnumerator(); + } + + #endregion + + #region IEnumerable Members + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { + return _collection.GetEnumerator(); + } + + #endregion + } + + private readonly IDictionary _dict; + + internal ReadOnlyDictionary(IDictionary dict) { + ReadOnlyDictionary rodict = dict as ReadOnlyDictionary; + _dict = (rodict != null) ? rodict._dict : dict; + } + + #region IDictionary Members + + public bool ContainsKey(K key) { + return _dict.ContainsKey(key); + } + + public ICollection Keys { + get { + ICollection keys = _dict.Keys; + if (!keys.IsReadOnly) { + return new ReadOnlyWrapper(keys); + } + return keys; + } + } + + public bool TryGetValue(K key, out V value) { + return _dict.TryGetValue(key, out value); + } + + public ICollection Values { + get { + ICollection values = _dict.Values; + if (!values.IsReadOnly) { + return new ReadOnlyWrapper(values); + } + return values; + } + } + + public V this[K key] { + get { + return _dict[key]; + } + } + + + void IDictionary.Add(K key, V value) { + throw Error.CollectionReadOnly(); + } + + bool IDictionary.Remove(K key) { + throw Error.CollectionReadOnly(); + } + + V IDictionary.this[K key] { + get { + return _dict[key]; + } + set { + throw Error.CollectionReadOnly(); + } + } + + #endregion + + #region ICollection> Members + + public bool Contains(KeyValuePair item) { + return _dict.Contains(item); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) { + _dict.CopyTo(array, arrayIndex); + } + + public int Count { + get { return _dict.Count; } + } + + public bool IsReadOnly { + get { return true; } + } + + void ICollection>.Add(KeyValuePair item) { + throw Error.CollectionReadOnly(); + } + + void ICollection>.Clear() { + throw Error.CollectionReadOnly(); + } + + bool ICollection>.Remove(KeyValuePair item) { + throw Error.CollectionReadOnly(); + } + + #endregion + + #region IEnumerable> Members + + public IEnumerator> GetEnumerator() { + return _dict.GetEnumerator(); + } + + #endregion + + #region IEnumerable Members + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { + return _dict.GetEnumerator(); + } + + #endregion + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ReferenceEqualityComparer.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ReferenceEqualityComparer.cs new file mode 100644 index 00000000000..236217c5012 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/ReferenceEqualityComparer.cs @@ -0,0 +1,43 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Runtime.CompilerServices; +#if !CODEPLEX_40 +using Microsoft.Runtime.CompilerServices; +#endif + + +#if CODEPLEX_40 +namespace System.Dynamic.Utils { +#else +namespace Microsoft.Scripting.Utils { +#endif + internal sealed class ReferenceEqualityComparer : IEqualityComparer { + internal static readonly ReferenceEqualityComparer Instance = new ReferenceEqualityComparer(); + + private ReferenceEqualityComparer() { } + + public bool Equals(T x, T y) { + return object.ReferenceEquals(x, y); + } + + public int GetHashCode(T obj) { + return RuntimeHelpers.GetHashCode(obj); + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/StrongBox.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/StrongBox.cs new file mode 100644 index 00000000000..e302b2bdb60 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/StrongBox.cs @@ -0,0 +1,69 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + + /// + /// Holds a reference to a value. + /// + /// The type of the value that the references. + public class StrongBox : IStrongBox { + /// + /// Gets the strongly typed value associated with the + /// This is explicitly exposed as a field instead of a property to enable loading the address of the field. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] + public T Value; + + /// + /// Initializes a new StrongBox which can receive a value when used in a reference call. + /// + public StrongBox() { + } + + /// + /// Initializes a new with the specified value. + /// + /// A value that the will reference. + public StrongBox(T value) { + Value = value; + } + + object IStrongBox.Value { + get { + return Value; + } + set { + Value = (T)value; + } + } + } + + /// + /// Defines a property for accessing the value that an object references. + /// + public interface IStrongBox { + /// + /// Gets or sets the value the object references. + /// + object Value { get; set; } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/TrueReadOnlyCollection.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/TrueReadOnlyCollection.cs new file mode 100644 index 00000000000..68a7d53ee05 --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/TrueReadOnlyCollection.cs @@ -0,0 +1,40 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Collections.Generic; +using System.Collections.ObjectModel; +#if CODEPLEX_40 +using System.Dynamic.Utils; +#else +using Microsoft.Scripting.Utils; +#endif + +#if CODEPLEX_40 +namespace System.Runtime.CompilerServices { +#else +namespace Microsoft.Runtime.CompilerServices { +#endif + sealed class TrueReadOnlyCollection : ReadOnlyCollection { + /// + /// Creates instnace of TrueReadOnlyCollection, wrapping passed in array. + /// !!! DOES NOT COPY THE ARRAY !!! + /// + internal TrueReadOnlyCollection(T[] list) + : base(list) { + } + } +} diff --git a/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/TypeExtensions.cs b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/TypeExtensions.cs new file mode 100644 index 00000000000..10e2c553cdc --- /dev/null +++ b/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Utils/TypeExtensions.cs @@ -0,0 +1,128 @@ +/* **************************************************************************** + * + * Copyright (c) Microsoft Corporation. + * + * This source code is subject to terms and conditions of the Microsoft Public License. A + * copy of the license can be found in the License.html file at the root of this distribution. If + * you cannot locate the Microsoft Public License, please send an email to + * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound + * by the terms of the Microsoft Public License. + * + * You must not remove this notice, or any other, from this software. + * + * + * ***************************************************************************/ +using System; using Microsoft; + + +using System.Diagnostics; +using System.Reflection; +using System.Reflection.Emit; +using System.Text; + +#if CODEPLEX_40 +namespace System.Dynamic.Utils { +#else +namespace Microsoft.Scripting.Utils { +#endif + + // Extensions on System.Type and friends + internal static class TypeExtensions { + + /// + /// Creates an open delegate for the given (dynamic)method. + /// + internal static Delegate CreateDelegate(this MethodInfo methodInfo, Type delegateType) { + Debug.Assert(methodInfo != null && delegateType != null); + + var dm = methodInfo as DynamicMethod; + if (dm != null) { + return dm.CreateDelegate(delegateType); + } else { + return Delegate.CreateDelegate(delegateType, methodInfo); + } + } + + /// + /// Creates a closed delegate for the given (dynamic)method. + /// + internal static Delegate CreateDelegate(this MethodInfo methodInfo, Type delegateType, object target) { + Debug.Assert(methodInfo != null && delegateType != null); + + var dm = methodInfo as DynamicMethod; + if (dm != null) { + return dm.CreateDelegate(delegateType, target); + } else { + return Delegate.CreateDelegate(delegateType, target, methodInfo); + } + } + + internal static Type GetReturnType(this MethodBase mi) { + return (mi.IsConstructor) ? mi.DeclaringType : ((MethodInfo)mi).ReturnType; + } + + private static readonly CacheDict _ParamInfoCache = new CacheDict(75); + + internal static ParameterInfo[] GetParametersCached(this MethodBase method) { + ParameterInfo[] pis; + lock (_ParamInfoCache) { + if (!_ParamInfoCache.TryGetValue(method, out pis)) { + _ParamInfoCache[method] = pis = method.GetParameters(); + } + } + return pis; + } + + // Expression trees/compiler just use IsByRef, why do we need this? + // (see LambdaCompiler.EmitArguments for usage in the compiler) + internal static bool IsByRefParameter(this ParameterInfo pi) { + // not using IsIn/IsOut properties as they are not available in Silverlight: + if (pi.ParameterType.IsByRef) return true; + + return (pi.Attributes & (ParameterAttributes.Out)) == ParameterAttributes.Out; + } + + // Returns the matching method if the parameter types are reference + // assignable from the provided type arguments, otherwise null. + internal static MethodInfo GetMethodValidated( + this Type type, + string name, + BindingFlags bindingAttr, + Binder binder, + Type[] types, + ParameterModifier[] modifiers) { + + var method = type.GetMethod(name, bindingAttr, binder, types, modifiers); + + return method.MatchesArgumentTypes(types) ? method : null; + } + + /// + /// Returns true if the method's parameter types are reference assignable from + /// the argument types, otherwise false. + /// + /// An example that can make the method return false is that + /// typeof(double).GetMethod("op_Equality", ..., new[] { typeof(double), typeof(int) }) + /// returns a method with two double parameters, which doesn't match the provided + /// argument types. + /// + /// + private static bool MatchesArgumentTypes(this MethodInfo mi, Type[] argTypes) { + if (mi == null || argTypes == null) { + return false; + } + var ps = mi.GetParameters(); + + if (ps.Length != argTypes.Length) { + return false; + } + + for (int i = 0; i < ps.Length; i++) { + if (!TypeUtils.AreReferenceAssignable(ps[i].ParameterType, argTypes[i])) { + return false; + } + } + return true; + } + } +} diff --git a/mcs/errors/ChangeLog b/mcs/errors/ChangeLog index 9776ec7e3fb..6362b225827 100644 --- a/mcs/errors/ChangeLog +++ b/mcs/errors/ChangeLog @@ -1,3 +1,17 @@ +2009-06-18 Raja R Harinath + + * Makefile (run-test-local): Make parallel-make safe. + +2009-06-17 Marek Safar + + * Makefile: Keep at least one target usable for me. + +2009-06-16 Raja R Harinath + + Improve profile test coverage + * Makefile (test-local): Empty out. + (run-test-local): Remove $(TEST_SUPPORT_FILES). + 2009-02-06 Scott Peterson This patch is contributed under the MIT/X11 license. diff --git a/mcs/errors/Makefile b/mcs/errors/Makefile index c539c9a36c1..678b03306a0 100644 --- a/mcs/errors/Makefile +++ b/mcs/errors/Makefile @@ -3,7 +3,6 @@ SUBDIRS = include ../build/rules.make with_mono_path = MONO_PATH="$(topdir)/class/lib/$(PROFILE)$(PLATFORM_PATH_SEPARATOR)$$MONO_PATH" -with_mono_path_n11b = MONO_PATH="$(topdir)/class/lib/net_1_1_bootstrap$(PLATFORM_PATH_SEPARATOR)$$MONO_PATH" ifeq (net_1_1, $(PROFILE)) # force this, we don't case if CSC is broken. This also @@ -14,10 +13,8 @@ else EXTRA_SUPPORT_FILES = CSFriendAssembly-lib.dll GCS0122-2-lib.dll GCS0730-lib.dll GCS0733-lib.dll GCS1685-lib.dll endif -ilasm = $(topdir)/class/lib/net_1_1_bootstrap/ilasm.exe -ILASM = $(with_mono_path_n11b) $(RUNTIME) $(RUNTIME_FLAGS) $(ilasm) - -GENERICS_COMPILE = $(CSCOMPILE) /target:library +ilasm = $(topdir)/class/lib/$(PROFILE)/ilasm.exe +ILASM = $(with_mono_path) $(RUNTIME) $(RUNTIME_FLAGS) $(ilasm) DISTFILES = \ CONTRIBUTORS_README \ @@ -48,14 +45,16 @@ all-local $(STD_TARGETS:=-local): VALID_PROFILE := $(filter net_1_1 net_2_0 net_2_1, $(PROFILE)) ifdef VALID_PROFILE -test-local: $(TEST_SUPPORT_FILES) - -check: run-test-local +check: run-mcs-tests # again, run-test is when the tests actually happen, so # don't compile on make test. -run-test-local: run-mcs-tests +test-local: + @: + +run-test-local: clean-local + $(MAKE) run-mcs-tests test-everything: $(MAKE) PROFILE=net_1_1 run-test @@ -79,9 +78,6 @@ COMPILER = $(topdir)/class/lib/$(PROFILE)/$(COMPILER_NAME).exe TESTER = MONO_RUNTIME='$(RUNTIME)' $(TEST_RUNTIME) $(RUNTIME_FLAGS) $(LOCAL_RUNTIME_FLAGS) $(topdir)/class/lib/$(PROFILE)/compiler-tester.exe run-mcs-tests: $(TEST_SUPPORT_FILES) - -run-mcs-tests: - rm -f *.exe *.mdb $(TESTER) -mode:neg -files:$(TEST_PATTERN) -compiler:$(COMPILER) -issues:known-issues-$(COMPILER_NAME) -log:$(COMPILER_NAME).log $(TESTER_OPTIONS) cecil: diff --git a/mcs/errors/cs0121-7.cs b/mcs/errors/cs0121-7.cs new file mode 100644 index 00000000000..2c88ccb3b00 --- /dev/null +++ b/mcs/errors/cs0121-7.cs @@ -0,0 +1,19 @@ +// CS0121: The call is ambiguous between the following methods or properties: `D.Test(string)' and `D.Test(int, string)' +// Line: 16 +// Compiler options: -langversion:future + +public class D +{ + static void Test (string a = "s") + { + } + + static void Test (int i = 9, string a = "b") + { + } + + public static void Main () + { + Test (); + } +} diff --git a/mcs/errors/cs0121-8.cs b/mcs/errors/cs0121-8.cs new file mode 100644 index 00000000000..75403fc3425 --- /dev/null +++ b/mcs/errors/cs0121-8.cs @@ -0,0 +1,21 @@ +// CS0121: The call is ambiguous between the following methods or properties: `C.Foo(byte)' and `C.Foo(int)' +// Line: 18 +// Compiler options: -langversion:future + +class C +{ + static int Foo (byte b = 9) + { + return 4; + } + + static int Foo (int i = 8) + { + return 2; + } + + public static void Main () + { + Foo (); + } +} diff --git a/mcs/errors/cs0122-30.cs b/mcs/errors/cs0122-30.cs new file mode 100644 index 00000000000..aa461653646 --- /dev/null +++ b/mcs/errors/cs0122-30.cs @@ -0,0 +1,21 @@ +// CS0122: `MainClass.Nested.Delegate()' is inaccessible due to its protection level +// Line: 18 + +delegate int TestDelegate (); + +public class MainClass +{ + class Nested + { + static int Delegate () + { + return 0; + } + } + + public static void Main () + { + TestDelegate delegateInstance = new TestDelegate (Nested.Delegate); + } +} + diff --git a/mcs/errors/cs0151-2.cs b/mcs/errors/cs0151-2.cs index 7b5bb87c619..d2b8028c978 100644 --- a/mcs/errors/cs0151-2.cs +++ b/mcs/errors/cs0151-2.cs @@ -1,5 +1,5 @@ -// cs0151-2.cs: A value of an integral type or string expected for switch -// Line: 12 +// CS0151: A switch expression of type `Y' cannot be converted to an integral type, bool, char, string, enum or nullable type +// Line: 28 class Y { byte b; diff --git a/mcs/errors/cs0151.cs b/mcs/errors/cs0151.cs index c76071fd356..7fc40a5f24e 100644 --- a/mcs/errors/cs0151.cs +++ b/mcs/errors/cs0151.cs @@ -1,5 +1,6 @@ -// cs0151.cs: A value of an integral type or string expected for switch -// Line: 12 +// CS0151: A switch expression of type `Y' cannot be converted to an integral type, bool, char, string, enum or nullable type +// Line: 13 + class Y { byte b; } diff --git a/mcs/errors/cs0175-2.cs b/mcs/errors/cs0175-2.cs deleted file mode 100644 index 3fabcb37732..00000000000 --- a/mcs/errors/cs0175-2.cs +++ /dev/null @@ -1,9 +0,0 @@ -// cs0175-2.cs: Use of keyword `base' is not valid in this context -// Line: 13 - -class DerivedClass { - public DerivedClass() { - base = null; - } -} - diff --git a/mcs/errors/cs0175.cs b/mcs/errors/cs0175.cs deleted file mode 100644 index 45782ee438e..00000000000 --- a/mcs/errors/cs0175.cs +++ /dev/null @@ -1,12 +0,0 @@ -// cs0175.cs: Use of keyword `base' is not valid in this context -// Line: 8 -using System.Collections; -class Collection : CollectionBase -{ - public int Add (int x) - { - return ((IList) base).Add (x); - } -} - - diff --git a/mcs/errors/cs0178-2.cs b/mcs/errors/cs0178-2.cs deleted file mode 100755 index 31e8f096c0f..00000000000 --- a/mcs/errors/cs0178-2.cs +++ /dev/null @@ -1,10 +0,0 @@ -// CS0178: Invalid rank specifier: expected `,' or `]' -// Line: 8 - -public class Blah { - - public static void Main () - { - int [,] i = new int [][2]; - } -} diff --git a/mcs/errors/cs0178.cs b/mcs/errors/cs0178.cs index d2c990e8a0b..31e8f096c0f 100644 --- a/mcs/errors/cs0178.cs +++ b/mcs/errors/cs0178.cs @@ -5,6 +5,6 @@ public class Blah { public static void Main () { - int [,] i = new int [4,2] { 0, 1, 2, 3, 4, 5 }; + int [,] i = new int [][2]; } } diff --git a/mcs/errors/cs0246-18.cs b/mcs/errors/cs0246-18.cs new file mode 100644 index 00000000000..077c4710fd1 --- /dev/null +++ b/mcs/errors/cs0246-18.cs @@ -0,0 +1,11 @@ +// CS0246: The type or namespace name `dynamic' could not be found. Are you missing a using directive or an assembly reference? +// Line: 9 +// Compiler options: -langversion:ISO-2 + +class C +{ + public static void Main () + { + dynamic d = 9; + } +} diff --git a/mcs/errors/cs0643.cs b/mcs/errors/cs0643.cs index d11593e67f5..b0096f5a6b9 100644 --- a/mcs/errors/cs0643.cs +++ b/mcs/errors/cs0643.cs @@ -1,4 +1,4 @@ -// cs0643.cs: 'x' duplicate named attribute argument +// CS0643: Duplicate named attribute `x' argument // Line: 8 using System; diff --git a/mcs/errors/cs0846.cs b/mcs/errors/cs0846.cs new file mode 100644 index 00000000000..2eb46fcb59a --- /dev/null +++ b/mcs/errors/cs0846.cs @@ -0,0 +1,10 @@ +// CS0846: A nested array initializer was expected +// Line: 8 + +class M +{ + public static void Main () + { + int[,] i = new int[1, 1] { 2 }; + } +} diff --git a/mcs/errors/cs0847.cs b/mcs/errors/cs0847.cs new file mode 100644 index 00000000000..d3da37983c2 --- /dev/null +++ b/mcs/errors/cs0847.cs @@ -0,0 +1,10 @@ +// CS0847: An array initializer of length `1' was expected +// Line: 8 + +class M +{ + public static void Main () + { + int[] i = new int [1] { 2, 3 }; + } +} diff --git a/mcs/errors/cs1016.cs b/mcs/errors/cs1016.cs index 890c5cda0db..69a36460318 100644 --- a/mcs/errors/cs1016.cs +++ b/mcs/errors/cs1016.cs @@ -1,4 +1,4 @@ -// cs1016.cs: Named attribute argument expected +// CS1016: Named attribute arguments must appear after the positional arguments // Line: 19 using System; @@ -18,4 +18,4 @@ public class E { [Attr (Arg = "xxx", 3)] public void Method () {} -} \ No newline at end of file +} diff --git a/mcs/errors/cs1066-2.cs b/mcs/errors/cs1066-2.cs new file mode 100644 index 00000000000..06135d384da --- /dev/null +++ b/mcs/errors/cs1066-2.cs @@ -0,0 +1,12 @@ +// CS1066: The default value specified for optional parameter `s' will never be used +// Line: 9 +// Compiler options: -warnaserror -langversion:future + +public partial class C +{ + partial void Test (int u, string s); + + partial void Test (int u, string s = "optional") + { + } +} diff --git a/mcs/errors/cs1066-3.cs b/mcs/errors/cs1066-3.cs new file mode 100644 index 00000000000..84af75a05c1 --- /dev/null +++ b/mcs/errors/cs1066-3.cs @@ -0,0 +1,15 @@ +// CS1066: The default value specified for optional parameter `x' will never be used +// Line: 12 +// Compiler options: -warnaserror -langversion:future + +interface I +{ + void Method (int i); +} + +class C : I +{ + void I.Method (int x = 9) + { + } +} diff --git a/mcs/errors/cs1066-4.cs b/mcs/errors/cs1066-4.cs new file mode 100644 index 00000000000..024848b61f9 --- /dev/null +++ b/mcs/errors/cs1066-4.cs @@ -0,0 +1,11 @@ +// CS1066: The default value specified for optional parameter `i' will never be used +// Line: 7 +// Compiler options: -warnaserror -langversion:future + +class C +{ + public static implicit operator C (int i = 8) + { + return null; + } +} diff --git a/mcs/errors/cs1066.cs b/mcs/errors/cs1066.cs index 89fa63f4a6f..128684e6396 100644 --- a/mcs/errors/cs1066.cs +++ b/mcs/errors/cs1066.cs @@ -1,6 +1,6 @@ -// CS1066: The default value specified for optional parameter 'i' will never be used +// CS1066: The default value specified for optional parameter `i' will never be used // Line: 6 -// Compiler options: -warnaserror +// Compiler options: -warnaserror -langversion:future public class C { diff --git a/mcs/errors/cs1503-10.cs b/mcs/errors/cs1503-10.cs new file mode 100644 index 00000000000..7d2afbecb7f --- /dev/null +++ b/mcs/errors/cs1503-10.cs @@ -0,0 +1,17 @@ +// CS1503: Argument `#1' cannot convert `System.RuntimeArgumentHandle' expression to type `__arglist' +// Line: 10 + +using System; + +class C +{ + void Foo (__arglist) + { + InstanceArgList (__arglist); + } + + int InstanceArgList (__arglist) + { + return 54; + } +} diff --git a/mcs/errors/cs1525-13.cs b/mcs/errors/cs1525-13.cs new file mode 100644 index 00000000000..cd091bc9c14 --- /dev/null +++ b/mcs/errors/cs1525-13.cs @@ -0,0 +1,14 @@ +// CS1525: Unexpected symbol `)', expecting `.', or `[' +// Line: 10 + +using System.Collections; + +class Collection : CollectionBase +{ + public int Add (int x) + { + return ((IList) base).Add (x); + } +} + + diff --git a/mcs/errors/cs1525-14.cs b/mcs/errors/cs1525-14.cs new file mode 100644 index 00000000000..03f54690d41 --- /dev/null +++ b/mcs/errors/cs1525-14.cs @@ -0,0 +1,11 @@ +// CS1525: Unexpected symbol `=', expecting `.', or `[' +// Line: 8 + +class DerivedClass +{ + public DerivedClass () + { + base = null; + } +} + diff --git a/mcs/errors/cs1644-13.cs b/mcs/errors/cs1644-13.cs new file mode 100644 index 00000000000..3b9390e3536 --- /dev/null +++ b/mcs/errors/cs1644-13.cs @@ -0,0 +1,15 @@ +// CS1644: Feature `named argument' cannot be used because it is not part of the C# 3.0 language specification +// Line: 13 +// Compiler options: -langversion:3 + +public class C +{ + static void Foo (int i) + { + } + + public static void Main () + { + Foo (i : 3); + } +} diff --git a/mcs/errors/cs1644-14.cs b/mcs/errors/cs1644-14.cs new file mode 100644 index 00000000000..dc7aaf66e76 --- /dev/null +++ b/mcs/errors/cs1644-14.cs @@ -0,0 +1,11 @@ +// CS1644: Feature `implicitly typed local variable' cannot be used because it is not part of the C# 2.0 language specification +// Line: 9 +// Compiler options: -langversion:ISO-2 + +class M +{ + public static void Main () + { + var a = 1; + } +} diff --git a/mcs/errors/cs1736.cs b/mcs/errors/cs1736.cs index 06f9ca4951b..990445aef99 100644 --- a/mcs/errors/cs1736.cs +++ b/mcs/errors/cs1736.cs @@ -1,4 +1,4 @@ -// CS1736: The expression being assigned to optional parameter `v' must be constant +// CS1736: The expression being assigned to optional parameter `v' must be a constant or default value // Line: 8 // Compiler options: -langversion:future diff --git a/mcs/errors/cs1738-2.cs b/mcs/errors/cs1738-2.cs new file mode 100644 index 00000000000..cd6838c3754 --- /dev/null +++ b/mcs/errors/cs1738-2.cs @@ -0,0 +1,17 @@ +// CS1738: Named arguments must appear after the positional arguments +// Line: 13 +// Compiler options: -langversion:future + +using System; + +class MyAttribute : Attribute +{ + public MyAttribute (string s, int value) + { + } +} + +[MyAttribute (s : "a", 1)] +class C +{ +} diff --git a/mcs/errors/cs1738.cs b/mcs/errors/cs1738.cs new file mode 100644 index 00000000000..e2a5ab57900 --- /dev/null +++ b/mcs/errors/cs1738.cs @@ -0,0 +1,15 @@ +// CS1738: Named arguments must appear after the positional arguments +// Line: 12 +// Compiler options: -langversion:future + +class C +{ + static void Foo (int a, string s) + { + } + + public static void Main () + { + Foo (a : 1, "out"); + } +} diff --git a/mcs/errors/cs1739-2.cs b/mcs/errors/cs1739-2.cs new file mode 100644 index 00000000000..bcf6c180229 --- /dev/null +++ b/mcs/errors/cs1739-2.cs @@ -0,0 +1,20 @@ +// CS1739: The best overloaded method match for `A.this[int]' does not contain a parameter named `value' +// Line: 17 +// Compiler options: -langversion:future + +class A +{ + public int this [int id] { + set { + } + } +} + +class B +{ + public static void Main () + { + A a = new A (); + a [value:1] = 9; + } +} diff --git a/mcs/errors/cs1739.cs b/mcs/errors/cs1739.cs new file mode 100644 index 00000000000..b58074a391e --- /dev/null +++ b/mcs/errors/cs1739.cs @@ -0,0 +1,15 @@ +// CS1739: The best overloaded method match for `C.Foo(int, int)' does not contain a parameter named `b' +// Line: 12 +// Compiler options: -langversion:future + +class C +{ + static void Foo (int x, int y) + { + } + + public static void Main () + { + Foo (1, b : 2); + } +} diff --git a/mcs/errors/cs1740.cs b/mcs/errors/cs1740.cs new file mode 100644 index 00000000000..107ac501b82 --- /dev/null +++ b/mcs/errors/cs1740.cs @@ -0,0 +1,14 @@ +// CS1738: Named argument `a' specified multiple times +// Line: 12 + +class C +{ + static void Foo (int a) + { + } + + public static void Main () + { + Foo (a : 1, a : 2); + } +} diff --git a/mcs/errors/cs1742-2.cs b/mcs/errors/cs1742-2.cs new file mode 100644 index 00000000000..203daf34827 --- /dev/null +++ b/mcs/errors/cs1742-2.cs @@ -0,0 +1,16 @@ +// CS1742: An element access expression cannot use named argument +// Line: 13 +// Compiler options: -unsafe -langversion:future + +using System; + +unsafe class C +{ + static void Main () + { + int *p = null; + + if (p [value:10] == 4) + return; + } +} diff --git a/mcs/errors/cs1742.cs b/mcs/errors/cs1742.cs new file mode 100644 index 00000000000..53698a87146 --- /dev/null +++ b/mcs/errors/cs1742.cs @@ -0,0 +1,12 @@ +// CS1742: An element access expression cannot use named argument +// Line: 9 +// Compiler options: -langversion:future + +class C +{ + public static void Main () + { + int[] o = new int[5]; + o [u:3] = 9; + } +} diff --git a/mcs/errors/cs1744.cs b/mcs/errors/cs1744.cs new file mode 100644 index 00000000000..14d1f7ca208 --- /dev/null +++ b/mcs/errors/cs1744.cs @@ -0,0 +1,15 @@ +// CS1744: Named argument `a' cannot be used for a parameter which has positional argument specified +// Line: 12 +// Compiler options: -langversion:future + +static class C +{ + public static void Test (int a, int b) + { + } + + public static void Main () + { + Test (1, a : 2); + } +} diff --git a/mcs/errors/cs1746.cs b/mcs/errors/cs1746.cs new file mode 100644 index 00000000000..93b87375217 --- /dev/null +++ b/mcs/errors/cs1746.cs @@ -0,0 +1,21 @@ +// CS1746: The delegate `C.IntDelegate' does not contain a parameter named `b' +// Line: 18 +// Compiler options: -langversion:future + +using System; + +class C +{ + delegate int IntDelegate (int a); + + static int TestInt (int u) + { + return 29; + } + + public static void Main () + { + var del = new IntDelegate (TestInt); + del (b : 7); + } +} diff --git a/mcs/errors/cs1763-2.cs b/mcs/errors/cs1763-2.cs new file mode 100644 index 00000000000..b4c0ef5fafa --- /dev/null +++ b/mcs/errors/cs1763-2.cs @@ -0,0 +1,14 @@ +// CS1763: Optional parameter `c' of type `C' can only be initialized with `null' +// Line: 10 +// Compiler options: -langversion:future + +struct S +{ +} + +class C +{ + public static void Test (C c = new S ()) + { + } +} diff --git a/mcs/errors/cs1763.cs b/mcs/errors/cs1763.cs new file mode 100644 index 00000000000..f6ea5a67366 --- /dev/null +++ b/mcs/errors/cs1763.cs @@ -0,0 +1,10 @@ +// CS1763: Optional parameter `o' of type `object' can only be initialized with `null' +// Line: 6 +// Compiler options: -langversion:future + +class C +{ + public static void Test (object o = 9) + { + } +} diff --git a/mcs/errors/gcs0065.cs b/mcs/errors/gcs0065.cs new file mode 100644 index 00000000000..efb72438bba --- /dev/null +++ b/mcs/errors/gcs0065.cs @@ -0,0 +1,12 @@ +// CS0065: `EventClass.handler': event property must have both add and remove accessors +// Line: 10 + +using System; + +public delegate void EventHandler (object sender, EventArgs e); + +public class EventClass +{ + event EventHandler handler { add {} } +} + diff --git a/mcs/errors/gcs0069.cs b/mcs/errors/gcs0069.cs new file mode 100644 index 00000000000..b7ba89c7612 --- /dev/null +++ b/mcs/errors/gcs0069.cs @@ -0,0 +1,14 @@ +// CS0069: Event in interface cannot have add or remove accessors +// Line: 11 + +using System; + +public delegate void FooHandler (); + +interface IBar +{ + event FooHandler OnFoo { + remove { } + } +} + diff --git a/mcs/errors/gcs0411-13.cs b/mcs/errors/gcs0411-13.cs new file mode 100644 index 00000000000..2bf576a0539 --- /dev/null +++ b/mcs/errors/gcs0411-13.cs @@ -0,0 +1,14 @@ +// CS0411: The type arguments for method `C.Foo(T[], T[])' cannot be inferred from the usage. Try specifying the type arguments explicitly +// Line: 12 + +class C +{ + public static void Foo (T[] t1, T[] t2) + { + } + + public static void Main () + { + Foo (new int[0], new byte[0]); + } +} diff --git a/mcs/errors/gcs0411-14.cs b/mcs/errors/gcs0411-14.cs new file mode 100644 index 00000000000..565c5a54f1a --- /dev/null +++ b/mcs/errors/gcs0411-14.cs @@ -0,0 +1,16 @@ +// CS0411: The type arguments for method `C.Foo(ref T, ref T)' cannot be inferred from the usage. Try specifying the type arguments explicitly +// Line: 14 + +class C +{ + public static void Foo (ref T t1, ref T t2) + { + } + + public static void Main () + { + string s = "a"; + object o = null; + Foo (ref s, ref o); + } +} diff --git a/mcs/errors/gcs0411-15.cs b/mcs/errors/gcs0411-15.cs new file mode 100644 index 00000000000..cc5fddb9cdf --- /dev/null +++ b/mcs/errors/gcs0411-15.cs @@ -0,0 +1,21 @@ +// CS0411: The type arguments for method `C.Foo(IFoo, IFoo)' cannot be inferred from the usage. Try specifying the type arguments explicitly +// Line: 18 +// Compiler options: -langversion:future + +interface IFoo +{ +} + +class C +{ + public static void Foo (IFoo e1, IFoo e2) + { + } + + public static void Main () + { + IFoo a = null; + IFoo b = null; + Foo (a, b); + } +} diff --git a/mcs/errors/gcs0411-16.cs b/mcs/errors/gcs0411-16.cs new file mode 100644 index 00000000000..57b7cc1f178 --- /dev/null +++ b/mcs/errors/gcs0411-16.cs @@ -0,0 +1,16 @@ +// CS0411: The type arguments for method `M.Foo(System.Func)' cannot be inferred from the usage. Try specifying the type arguments explicitly +// Line: 14 + +using System; + +class M +{ + static void Foo (Func t) + { + } + + public static void Main () + { + Foo (delegate { throw new Exception("foo"); }); + } +} diff --git a/mcs/errors/gcs0853.cs b/mcs/errors/gcs0853.cs new file mode 100644 index 00000000000..83b7dd069ac --- /dev/null +++ b/mcs/errors/gcs0853.cs @@ -0,0 +1,18 @@ +// CS0853: An expression tree cannot contain named argument +// Line: 15 +// Compiler options: -langversion:future + +using System; +using System.Linq.Expressions; + +class M +{ + static void Named (int i) + { + } + + public static void Main () + { + Expression e = () => Named (i : 1); + } +} diff --git a/mcs/errors/gcs0854.cs b/mcs/errors/gcs0854.cs new file mode 100644 index 00000000000..fe15bdb2c8b --- /dev/null +++ b/mcs/errors/gcs0854.cs @@ -0,0 +1,18 @@ +// CS0854: An expression tree cannot contain an invocation which uses optional parameter +// Line: 15 +// Compiler options: -langversion:future + +using System; +using System.Linq.Expressions; + +class M +{ + static void Optional (int i, string s = "value") + { + } + + public static void Main () + { + Expression e = () => Optional (1); + } +} diff --git a/mcs/errors/gcs1501-4.cs b/mcs/errors/gcs1501-4.cs new file mode 100644 index 00000000000..f64a51f6bc3 --- /dev/null +++ b/mcs/errors/gcs1501-4.cs @@ -0,0 +1,19 @@ +// CS1501: No overload for method `Test' takes `2' arguments +// Line: 16 +// Compiler options: -langversion:future + +static class S +{ + public static int Test (this int value) + { + return value; + } +} + +class M +{ + public static void Main () + { + 1.Test (value: 1); + } +} diff --git a/mcs/errors/gcs1744.cs b/mcs/errors/gcs1744.cs new file mode 100644 index 00000000000..3427f80bbf2 --- /dev/null +++ b/mcs/errors/gcs1744.cs @@ -0,0 +1,16 @@ +// CS1744: Named argument `a' cannot be used for a parameter which has positional argument specified +// Line: 13 +// Compiler options: -langversion:future + +static class C +{ + public static int Test (this int a, int b) + { + return a * 3 + b; + } + + public static void Main () + { + 1.Test (a : 2); + } +} diff --git a/mcs/mcs/ChangeLog b/mcs/mcs/ChangeLog index 22786876f2a..a70cd94bd28 100644 --- a/mcs/mcs/ChangeLog +++ b/mcs/mcs/ChangeLog @@ -1,3 +1,119 @@ +2009-07-13 Marcus Griep + + * ecore.cs: Fix obscure bug with resolving members of interfaces + that hide parent interface members. Fixes bug #444388 and corrects + bug #323096 + +2009-07-13 Marek Safar + + * expression.cs (LocalVariableReference): Bounce resolve. + +2009-07-10 Marek Safar + + * typemanager.cs, lambda.cs, parameter.cs, convert.cs, anonymous.cs, + expression.cs, literal.cs, ecore.cs, complete.cs: Moved internal + types to new class. + + * support.cs: New dynamic type wrapper. + +2009-07-08 Marek Safar + + * ecore.cs, cs-parser.jay: Better error reporting for implicitly + typed local variable. + +2009-07-06 Marek Safar + + A fix for bug #519005 + * anonymous.cs: Use null_type as no return type placeholder. + +2009-07-02 Marek Safar + + * generic.cs: Handle type inference of identical type parameters + with different bounds. + +2009-07-01 Marek Safar + + * expression.cs, class.cs: Events variance. + + * cs-parser.jay: Interface events error messages. + +2009-07-01 Marek Safar + + * generic.cs, argument.cs: Updated type inference logic to C# 4.0. + +2009-06-29 Marek Safar + + * parameter.cs, convert.cs, expression.cs, class.cs: Default + parameter expression can be value-type New. + + * cs-parser.jay: Clean up too many parameter modifier boolean flags. + +2009-06-26 Marek Safar + + * generic.cs, argument.cs, expression.cs, ecore.cs, cs-parser.jay: + Implemented C# 4.0 named arguments. + +2009-06-24 Marek Safar + + * typemanager.cs, parameter.cs, iterators.cs, convert.cs, + expression.cs, ecore.cs, delegate.cs: Removed unnecessary ArgList + parameter modifier. Also fixes bug #515497. + +2009-06-24 Marek Safar + + * *.cs: Replaced ArrayList with Arguments in need of a nonsequential + arguments expression to be implemented. + + *.sources: Add argument.cs + +2009-06-23 Marek Safar + + * parameter.cs: Moved GetParameterIndexByName to base class. + + * expression.cs, statement.cs, ecore.cs, delegate.cs: Removed + unused AType. Use argument's version of GetExpressionTree. + +2009-06-22 Marek Safar + + * expression.cs, cs-parser.jay, attribute.cs, codegen.cs: Named + arguments grammar. + +2009-06-17 Marek Safar + + A fix for bug #514096 + * class.cs: Allow IntPtr/UIntPtr fields to be volatile. + +2009-06-17 Marek Safar + + * expression.cs: The first multi-dimensional array nested array + initializers was not checked. + + * statement.cs (Switch): Fixed error message to reflect 2.0 changes. + +2009-06-17 Marek Safar + + A fix for bug #513400 + * nullable.cs (EmitEquality): Operands emit could be simplified for + built-in types when we now emit user operators differently. + +2009-06-16 Marek Safar + + * ecore.cs: Report inaccessible delegate methods correctly. + +2009-06-16 Marek Safar + + * parameter.cs, expression.cs, ecore.cs, class.cs, delegate.cs, + cs-parser.jay: Implemented C# 4.0 optional parameters. + +2009-06-16 Marek Safar + + * driver.cs: Removed broken DefineManifestResource. + +2009-06-16 Raja R Harinath + + * Makefile [net_2_0_bootstrap]: Don't explicitly mention net_1_1. + Use $(BOOTSTRAP_PROFILE) instead. + 2009-06-12 Jb Evain * rootcontext.cs: add a Platform field. diff --git a/mcs/mcs/Makefile b/mcs/mcs/Makefile index c15b0415c30..c6a1fbe0cac 100644 --- a/mcs/mcs/Makefile +++ b/mcs/mcs/Makefile @@ -56,7 +56,7 @@ clean-program: $(PROGRAM) $(PROGRAM).config: $(dir $(PROGRAM))/.stamp -$(PROGRAM): $(topdir)/class/lib/net_1_1/mcs.exe +$(PROGRAM): $(topdir)/class/lib/$(BOOTSTRAP_PROFILE)/mcs.exe cp $< $@ $(PROGRAM).config: gmcs.exe.config diff --git a/mcs/mcs/anonymous.cs b/mcs/mcs/anonymous.cs index b11557f31af..e98f07b4887 100644 --- a/mcs/mcs/anonymous.cs +++ b/mcs/mcs/anonymous.cs @@ -312,7 +312,7 @@ namespace Mono.CSharp { storey_type_expr = new TypeExpression (TypeBuilder, Location); } - Expression e = new New (storey_type_expr, new ArrayList (0), Location).Resolve (ec); + Expression e = new New (storey_type_expr, null, Location).Resolve (ec); e.Emit (ec); Instance = new LocalTemporary (storey_type_expr.Type); @@ -999,7 +999,7 @@ namespace Mono.CSharp { { AnonymousMethodBody am; using (ec.Set (EmitContext.Flags.ProbingMode | EmitContext.Flags.InferReturnType)) { - am = CompatibleMethod (ec, tic, GetType (), delegate_type); + am = CompatibleMethod (ec, tic, TypeManager.null_type, delegate_type); } if (am == null) @@ -1129,7 +1129,7 @@ namespace Mono.CSharp { // anywhere', we depend on special conversion // rules. // - type = TypeManager.anonymous_method_type; + type = InternalType.AnonymousMethod; if ((Parameters != null) && !Parameters.Resolve (ec)) return null; @@ -1755,14 +1755,14 @@ namespace Mono.CSharp { new TypeArguments (new SimpleName (TypeParameters [i].Name, loc)), loc), "Default", loc); - ArrayList arguments_equal = new ArrayList (2); + Arguments arguments_equal = new Arguments (2); arguments_equal.Add (new Argument (new MemberAccess (new This (f.Location), f.Name))); arguments_equal.Add (new Argument (new MemberAccess (other_variable, f.Name))); Expression field_equal = new Invocation (new MemberAccess (equality_comparer, "Equals", loc), arguments_equal); - ArrayList arguments_hashcode = new ArrayList (1); + Arguments arguments_hashcode = new Arguments (1); arguments_hashcode.Add (new Argument (new MemberAccess (new This (f.Location), f.Name))); Expression field_hashcode = new Invocation (new MemberAccess (equality_comparer, "GetHashCode", loc), arguments_hashcode); diff --git a/mcs/mcs/argument.cs b/mcs/mcs/argument.cs new file mode 100644 index 00000000000..9069fc53a56 --- /dev/null +++ b/mcs/mcs/argument.cs @@ -0,0 +1,362 @@ +// +// argument.cs: Argument expressions +// +// Author: +// Miguel de Icaza (miguel@ximain.com) +// Marek Safar (marek.safar@gmail.com) +// +// Dual licensed under the terms of the MIT X11 or GNU GPL +// Copyright 2003-2008 Novell, Inc. +// + +using System; +using System.Collections; +using System.Reflection; +using System.Reflection.Emit; + +namespace Mono.CSharp +{ + // + // Argument expression used for invocation + // + public class Argument + { + public enum AType : byte + { + Ref = 1, // ref modifier used + Out = 2, // out modifier used + Default = 3 // argument created from default parameter value + } + + public readonly AType ArgType; + public Expression Expr; + + public Argument (Expression expr, AType type) + { + this.Expr = expr; + this.ArgType = type; + } + + public Argument (Expression expr) + { + if (expr == null) + throw new ArgumentNullException (); + + this.Expr = expr; + } + + public Type Type { + get { return Expr.Type; } + } + + public Parameter.Modifier Modifier { + get { + switch (ArgType) { + case AType.Out: + return Parameter.Modifier.OUT; + + case AType.Ref: + return Parameter.Modifier.REF; + + default: + return Parameter.Modifier.NONE; + } + } + } + + public virtual Expression CreateExpressionTree (EmitContext ec) + { + if (ArgType == AType.Default) + Report.Error (854, Expr.Location, "An expression tree cannot contain an invocation which uses optional parameter"); + + return Expr.CreateExpressionTree (ec); + } + + public string GetSignatureForError () + { + if (Expr.eclass == ExprClass.MethodGroup) + return Expr.ExprClassName; + + return TypeManager.CSharpName (Expr.Type); + } + + public bool IsByRef { + get { return ArgType == AType.Ref || ArgType == AType.Out; } + } + + public bool IsDefaultArgument { + get { return ArgType == AType.Default; } + } + + public bool ResolveMethodGroup (EmitContext ec) + { + SimpleName sn = Expr as SimpleName; + if (sn != null) + Expr = sn.GetMethodGroup (); + + // FIXME: csc doesn't report any error if you try to use `ref' or + // `out' in a delegate creation expression. + Expr = Expr.Resolve (ec, ResolveFlags.VariableOrValue | ResolveFlags.MethodGroup); + if (Expr == null) + return false; + + return true; + } + + public void Resolve (EmitContext ec) + { + if (Expr == EmptyExpression.Null) + return; + + using (ec.With (EmitContext.Flags.DoFlowAnalysis, true)) { + // Verify that the argument is readable + if (ArgType != AType.Out) + Expr = Expr.Resolve (ec); + + // Verify that the argument is writeable + if (Expr != null && IsByRef) + Expr = Expr.ResolveLValue (ec, EmptyExpression.OutAccess); + + if (Expr == null) + Expr = EmptyExpression.Null; + } + } + + public virtual void Emit (EmitContext ec) + { + if (!IsByRef) { + Expr.Emit (ec); + return; + } + + AddressOp mode = AddressOp.Store; + if (ArgType == AType.Ref) + mode |= AddressOp.Load; + + IMemoryLocation ml = (IMemoryLocation) Expr; + ParameterReference pr = ml as ParameterReference; + + // + // ParameterReferences might already be references, so we want + // to pass just the value + // + if (pr != null && pr.IsRef) + pr.EmitLoad (ec); + else + ml.AddressOf (ec, mode); + } + + public Argument Clone (CloneContext clonectx) + { + Argument a = (Argument) MemberwiseClone (); + a.Expr = Expr.Clone (clonectx); + return a; + } + } + + public class NamedArgument : Argument + { + public readonly LocatedToken Name; + LocalTemporary variable; + + public NamedArgument (LocatedToken name, Expression expr) + : base (expr) + { + Name = name; + } + + public override Expression CreateExpressionTree (EmitContext ec) + { + Report.Error (853, Name.Location, "An expression tree cannot contain named argument"); + return base.CreateExpressionTree (ec); + } + + public override void Emit (EmitContext ec) + { + // TODO: Should guard against multiple emits + base.Emit (ec); + + // Release temporary variable when used + if (variable != null) + variable.Release (ec); + } + + public void EmitAssign (EmitContext ec) + { + Expr.Emit (ec); + variable = new LocalTemporary (Expr.Type); + variable.Store (ec); + + Expr = variable; + } + } + + public class Arguments + { + ArrayList args; // TODO: This should really be linked list + ArrayList reordered; // TODO: LinkedList + + public Arguments (int capacity) + { + args = new ArrayList (capacity); + } + + public int Add (Argument arg) + { + return args.Add (arg); + } + + public void AddRange (Arguments args) + { + this.args.AddRange (args.args); + } + + public static Arguments CreateForExpressionTree (EmitContext ec, Arguments args, params Expression[] e) + { + Arguments all = new Arguments ((args == null ? 0 : args.Count) + e.Length); + for (int i = 0; i < e.Length; ++i) { + if (e [i] != null) + all.Add (new Argument (e[i])); + } + + if (args != null) { + foreach (Argument a in args.args) { + Expression tree_arg = a.CreateExpressionTree (ec); + if (tree_arg != null) + all.Add (new Argument (tree_arg)); + } + } + + return all; + } + + public void CheckArrayAsAttribute () + { + foreach (Argument arg in args) { + // Type is undefined (was error 246) + if (arg.Type == null) + continue; + + if (arg.Type.IsArray) + Report.Warning (3016, 1, arg.Expr.Location, "Arrays as attribute arguments are not CLS-compliant"); + } + } + + public Arguments Clone (CloneContext ctx) + { + Arguments cloned = new Arguments (args.Count); + foreach (Argument a in args) + cloned.Add (a.Clone (ctx)); + + return cloned; + } + + public int Count { + get { return args.Count; } + } + + // + // Emits a list of resolved Arguments + // + public void Emit (EmitContext ec) + { + Emit (ec, false, null); + } + + // + // if `dup_args' is true, a copy of the arguments will be left + // on the stack. If `dup_args' is true, you can specify `this_arg' + // which will be duplicated before any other args. Only EmitCall + // should be using this interface. + // + public void Emit (EmitContext ec, bool dup_args, LocalTemporary this_arg) + { + LocalTemporary[] temps = null; + + if (dup_args && Count != 0) + temps = new LocalTemporary [Count]; + + if (reordered != null && Count > 1) { + foreach (NamedArgument na in reordered) + na.EmitAssign (ec); + } + + int i = 0; + foreach (Argument a in args) { + a.Emit (ec); + if (dup_args) { + ec.ig.Emit (OpCodes.Dup); + (temps [i++] = new LocalTemporary (a.Type)).Store (ec); + } + } + + if (dup_args) { + if (this_arg != null) + this_arg.Emit (ec); + + for (i = 0; i < temps.Length; i++) { + temps[i].Emit (ec); + temps[i].Release (ec); + } + } + } + + public bool GetAttributableValue (EmitContext ec, out object[] values) + { + values = new object [args.Count]; + for (int j = 0; j < values.Length; ++j) { + Argument a = this [j]; + if (!a.Expr.GetAttributableValue (ec, a.Type, out values[j])) + return false; + } + + return true; + } + + public IEnumerator GetEnumerator () + { + return args.GetEnumerator (); + } + + public void Insert (int index, Argument arg) + { + args.Insert (index, arg); + } + + public void MarkReorderedArgument (NamedArgument a) + { + // + // Constant expression can have no effect on left-to-right execution + // + if (a.Expr is Constant) + return; + + if (reordered == null) + reordered = new ArrayList (); + + reordered.Add (a); + } + + public void Resolve (EmitContext ec) + { + foreach (Argument a in args) + a.Resolve (ec); + } + + public void MutateHoistedGenericType (AnonymousMethodStorey storey) + { + foreach (Argument a in args) + a.Expr.MutateHoistedGenericType (storey); + } + + public void RemoveAt (int index) + { + args.RemoveAt (index); + } + + public Argument this [int index] { + get { return (Argument) args [index]; } + set { args [index] = value; } + } + } +} \ No newline at end of file diff --git a/mcs/mcs/assign.cs b/mcs/mcs/assign.cs index 19a5e7e6dac..32643bbeeb6 100644 --- a/mcs/mcs/assign.cs +++ b/mcs/mcs/assign.cs @@ -208,7 +208,7 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (1); + Arguments args = new Arguments (1); args.Add (new Argument (this)); return CreateExpressionFactoryCall ("Constant", args); } @@ -342,7 +342,7 @@ namespace Mono.CSharp { source = EmptyExpression.Null; } - target = target.ResolveLValue (ec, source, Location); + target = target.ResolveLValue (ec, source); if (target == null || !ok) return null; diff --git a/mcs/mcs/attribute.cs b/mcs/mcs/attribute.cs index d918c6043c7..7d0158949dd 100644 --- a/mcs/mcs/attribute.cs +++ b/mcs/mcs/attribute.cs @@ -125,8 +125,8 @@ namespace Mono.CSharp { public readonly Expression LeftExpr; public readonly string Identifier; - ArrayList PosArguments; - ArrayList NamedArguments; + Arguments PosArguments; + Arguments NamedArguments; bool resolve_error; readonly bool nameEscaped; @@ -148,15 +148,15 @@ namespace Mono.CSharp { static PtrHashtable usage_attr_cache; // Cache for parameter-less attributes static PtrHashtable att_cache; - - public Attribute (string target, Expression left_expr, string identifier, object[] args, Location loc, bool nameEscaped) + + public Attribute (string target, Expression left_expr, string identifier, Arguments[] args, Location loc, bool nameEscaped) { LeftExpr = left_expr; Identifier = identifier; Name = LeftExpr == null ? identifier : LeftExpr + "." + identifier; if (args != null) { - PosArguments = (ArrayList)args [0]; - NamedArguments = (ArrayList)args [1]; + PosArguments = args [0]; + NamedArguments = args [1]; } this.loc = loc; ExplicitTarget = target; @@ -200,18 +200,19 @@ namespace Mono.CSharp { owner.OptAttributes = null; } - void Error_InvalidNamedArgument (string name) + void Error_InvalidNamedArgument (NamedArgument name) { - Report.Error (617, Location, "`{0}' is not a valid named attribute argument. Named attribute arguments " + + Report.Error (617, name.Name.Location, "`{0}' is not a valid named attribute argument. Named attribute arguments " + "must be fields which are not readonly, static, const or read-write properties which are " + "public and not static", - name); + name.Name.Value); } - void Error_InvalidNamedAgrumentType (string name) + void Error_InvalidNamedArgumentType (NamedArgument name) { - Report.Error (655, Location, "`{0}' is not a valid named attribute argument because it is not a valid " + - "attribute parameter type", name); + Report.Error (655, name.Name.Location, + "`{0}' is not a valid named attribute argument because it is not a valid attribute parameter type", + name.Name.Value); } public static void Error_AttributeArgumentNotValid (Location loc) @@ -375,16 +376,16 @@ namespace Mono.CSharp { const string CharSetEnumMember = "CharSet"; if (NamedArguments == null) { - NamedArguments = new ArrayList (1); + NamedArguments = new Arguments (1); } else { - foreach (DictionaryEntry de in NamedArguments) { - if ((string)de.Key == CharSetEnumMember) + foreach (NamedArgument a in NamedArguments) { + if (a.Name.Value == CharSetEnumMember) return; } } - NamedArguments.Add (new DictionaryEntry (CharSetEnumMember, - new Argument (Constant.CreateConstant (typeof (CharSet), RootContext.ToplevelTypes.DefaultCharSet, Location)))); + NamedArguments.Add (new NamedArgument (new LocatedToken (loc, CharSetEnumMember), + Constant.CreateConstant (typeof (CharSet), RootContext.ToplevelTypes.DefaultCharSet, Location))); } public CustomAttributeBuilder Resolve () @@ -474,15 +475,9 @@ namespace Mono.CSharp { protected virtual ConstructorInfo ResolveConstructor (EmitContext ec) { - if (PosArguments != null) { - for (int i = 0; i < PosArguments.Count; i++) { - Argument a = (Argument) PosArguments [i]; + if (PosArguments != null) + PosArguments.Resolve (ec); - if (!a.Resolve (ec, Location)) - return null; - } - } - MethodGroupExpr mg = MemberLookupFinal (ec, ec.ContainerType, Type, ConstructorInfo.ConstructorName, MemberTypes.Constructor, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, @@ -503,14 +498,8 @@ namespace Mono.CSharp { AParametersCollection pd = TypeManager.GetParameterData (constructor); - int pos_arg_count = PosArguments.Count; - pos_values = new object [pos_arg_count]; - for (int j = 0; j < pos_arg_count; ++j) { - Argument a = (Argument) PosArguments [j]; - - if (!a.Expr.GetAttributableValue (ec, a.Type, out pos_values [j])) - return null; - } + if (!PosArguments.GetAttributableValue (ec, out pos_values)) + return null; // Here we do the checks which should be done by corlib or by runtime. // However Zoltan doesn't like it and every Mono compiler has to do it again. @@ -533,7 +522,7 @@ namespace Mono.CSharp { if (Type == pa.IndexerName || Type == pa.Conditional) { string v = pos_values [0] as string; if (!Tokenizer.IsValidIdentifier (v) || Tokenizer.IsKeyword (v)) { - Report.Error (633, ((Argument)PosArguments[0]).Expr.Location, + Report.Error (633, PosArguments [0].Expr.Location, "The argument to the `{0}' attribute must be a valid identifier", GetSignatureForError ()); return null; } @@ -558,29 +547,27 @@ namespace Mono.CSharp { ArrayList field_values = new ArrayList (named_arg_count); ArrayList prop_values = new ArrayList (named_arg_count); - ArrayList seen_names = new ArrayList(named_arg_count); + ArrayList seen_names = new ArrayList (named_arg_count); - foreach (DictionaryEntry de in NamedArguments) { - string member_name = (string) de.Key; - - if (seen_names.Contains(member_name)) { - Report.Error(643, Location, "'{0}' duplicate named attribute argument", member_name); - return false; - } - seen_names.Add(member_name); + foreach (NamedArgument a in NamedArguments) { + string name = a.Name.Value; + if (seen_names.Contains (name)) { + Report.Error (643, a.Name.Location, "Duplicate named attribute `{0}' argument", name); + continue; + } + + seen_names.Add (name); - Argument a = (Argument) de.Value; - if (!a.Resolve (ec, Location)) - return false; + a.Resolve (ec); Expression member = Expression.MemberLookup ( - ec.ContainerType, Type, member_name, + ec.ContainerType, Type, name, MemberTypes.All, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static, Location); if (member == null) { - member = Expression.MemberLookup (ec.ContainerType, Type, member_name, + member = Expression.MemberLookup (ec.ContainerType, Type, name, MemberTypes.All, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static, Location); @@ -592,12 +579,12 @@ namespace Mono.CSharp { } if (member == null){ - Expression.Error_TypeDoesNotContainDefinition (Location, Type, member_name); + Expression.Error_TypeDoesNotContainDefinition (Location, Type, name); return false; } if (!(member is PropertyExpr || member is FieldExpr)) { - Error_InvalidNamedArgument (member_name); + Error_InvalidNamedArgument (a); return false; } @@ -613,13 +600,13 @@ namespace Mono.CSharp { if (!pi.CanWrite || !pi.CanRead || pi.GetGetMethod ().IsStatic) { Report.SymbolRelatedToPreviousError (pi); - Error_InvalidNamedArgument (member_name); + Error_InvalidNamedArgument (a); return false; } if (!IsValidArgumentType (member.Type)) { Report.SymbolRelatedToPreviousError (pi); - Error_InvalidNamedAgrumentType (member_name); + Error_InvalidNamedArgumentType (a); return false; } @@ -640,13 +627,13 @@ namespace Mono.CSharp { FieldInfo fi = ((FieldExpr) member).FieldInfo; if (fi.IsInitOnly || fi.IsStatic) { - Error_InvalidNamedArgument (member_name); + Error_InvalidNamedArgument (a); return false; } if (!IsValidArgumentType (member.Type)) { Report.SymbolRelatedToPreviousError (fi); - Error_InvalidNamedAgrumentType (member_name); + Error_InvalidNamedArgumentType (a); return false; } @@ -1272,34 +1259,13 @@ namespace Mono.CSharp { // Here we are testing attribute arguments for array usage (error 3016) if (Owner.IsClsComplianceRequired ()) { - if (PosArguments != null) { - foreach (Argument arg in PosArguments) { - // Type is undefined (was error 246) - if (arg.Type == null) - return; - - if (arg.Type.IsArray) { - Report.Warning (3016, 1, Location, "Arrays as attribute arguments are not CLS-compliant"); - return; - } - } - } + if (PosArguments != null) + PosArguments.CheckArrayAsAttribute (); if (NamedArguments == null) return; - - foreach (DictionaryEntry de in NamedArguments) { - Argument arg = (Argument) de.Value; - // Type is undefined (was error 246) - if (arg.Type == null) - return; - - if (arg.Type.IsArray) { - Report.Warning (3016, 1, Location, "Arrays as attribute arguments are not CLS-compliant"); - return; - } - } + NamedArguments.CheckArrayAsAttribute (); } } @@ -1308,7 +1274,7 @@ namespace Mono.CSharp { if (PosArguments == null || PosArguments.Count < 1) return null; - return ((Argument) PosArguments [0]).Expr; + return PosArguments [0].Expr; } public string GetString () @@ -1361,7 +1327,7 @@ namespace Mono.CSharp { public readonly NamespaceEntry ns; public GlobalAttribute (NamespaceEntry ns, string target, - Expression left_expr, string identifier, object[] args, Location loc, bool nameEscaped): + Expression left_expr, string identifier, Arguments[] args, Location loc, bool nameEscaped): base (target, left_expr, identifier, args, loc, nameEscaped) { this.ns = ns; diff --git a/mcs/mcs/class.cs b/mcs/mcs/class.cs index ffa0de67d77..4d91bf00de1 100644 --- a/mcs/mcs/class.cs +++ b/mcs/mcs/class.cs @@ -3561,6 +3561,10 @@ namespace Mono.CSharp { bool error = false; for (int i = 0; i < parameters.Count; ++i) { Parameter p = parameters [i]; + + if (p.HasDefaultValue && (IsExplicitImpl || this is Operator || (this is Indexer && parameters.Count == 1))) + p.Warning_UselessOptionalParameter (); + if (p.CheckAccessibility (this)) continue; @@ -3836,11 +3840,14 @@ namespace Mono.CSharp { if ((ModFlags & Modifiers.PARTIAL) != 0) { for (int i = 0; i < Parameters.Count; ++i) { - if (Parameters.FixedParameters[i].ModFlags == Parameter.Modifier.OUT) { + IParameterData p = Parameters.FixedParameters [i]; + if (p.ModFlags == Parameter.Modifier.OUT) { Report.Error (752, Location, "`{0}': A partial method parameters cannot use `out' modifier", GetSignatureForError ()); - break; } + + if (p.HasDefaultValue && IsPartialImplementation) + ((Parameter) p).Warning_UselessOptionalParameter (); } } } @@ -4336,6 +4343,11 @@ namespace Mono.CSharp { { caching_flags |= Flags.PartialDefinitionExists; methodDefinition.MethodBuilder = MethodBuilder; + + for (int i = 0; i < methodDefinition.Parameters.Count; ++i ) { + Parameters [i].DefaultValue = methodDefinition.Parameters [i].DefaultValue; + } + if (methodDefinition.attributes == null) return; @@ -4363,16 +4375,16 @@ namespace Mono.CSharp { public abstract class ConstructorInitializer : ExpressionStatement { - ArrayList argument_list; + Arguments argument_list; MethodGroupExpr base_constructor_group; - - public ConstructorInitializer (ArrayList argument_list, Location loc) + + public ConstructorInitializer (Arguments argument_list, Location loc) { this.argument_list = argument_list; this.loc = loc; } - public ArrayList Arguments { + public Arguments Arguments { get { return argument_list; } @@ -4386,10 +4398,7 @@ namespace Mono.CSharp { public bool Resolve (ConstructorBuilder caller_builder, EmitContext ec) { if (argument_list != null){ - foreach (Argument a in argument_list){ - if (!a.Resolve (ec, loc)) - return false; - } + argument_list.Resolve (ec); } if (this is ConstructorBaseInitializer) { @@ -4463,7 +4472,7 @@ namespace Mono.CSharp { } public class ConstructorBaseInitializer : ConstructorInitializer { - public ConstructorBaseInitializer (ArrayList argument_list, Location l) : + public ConstructorBaseInitializer (Arguments argument_list, Location l) : base (argument_list, l) { } @@ -4477,7 +4486,7 @@ namespace Mono.CSharp { } public class ConstructorThisInitializer : ConstructorInitializer { - public ConstructorThisInitializer (ArrayList argument_list, Location l) : + public ConstructorThisInitializer (Arguments argument_list, Location l) : base (argument_list, l) { } @@ -5177,7 +5186,7 @@ namespace Mono.CSharp { // TODO: Should use AddScopeStatement or something else which emits correct // debugger scope // - finaly_block.AddStatement (new StatementExpression (new Invocation (method_expr, new ArrayList (0)))); + finaly_block.AddStatement (new StatementExpression (new Invocation (method_expr, new Arguments (0)))); new_block.AddStatement (new TryFinally (try_block, finaly_block, Location)); block = new_block; @@ -5290,7 +5299,8 @@ namespace Mono.CSharp { } } - TypeManager.CheckTypeVariance (MemberType, Variance.Covariant, this); + Variance variance = this is Event ? Variance.Contravariant : Variance.Covariant; + TypeManager.CheckTypeVariance (MemberType, variance, this); } protected bool IsTypePermitted () @@ -5758,7 +5768,8 @@ namespace Mono.CSharp { MemberType == TypeManager.sbyte_type || MemberType == TypeManager.byte_type || MemberType == TypeManager.short_type || MemberType == TypeManager.ushort_type || MemberType == TypeManager.int32_type || MemberType == TypeManager.uint32_type || - MemberType == TypeManager.float_type) + MemberType == TypeManager.float_type || + MemberType == TypeManager.intptr_type || MemberType == TypeManager.uintptr_type) return true; if (TypeManager.IsEnumType (MemberType)) diff --git a/mcs/mcs/codegen.cs b/mcs/mcs/codegen.cs index 6bd80338bf0..39adbb4fa8c 100644 --- a/mcs/mcs/codegen.cs +++ b/mcs/mcs/codegen.cs @@ -1173,14 +1173,14 @@ namespace Mono.CSharp { MemberAccess system_security_permissions = new MemberAccess (new MemberAccess ( new QualifiedAliasMember (QualifiedAliasMember.GlobalAlias, "System", loc), "Security", loc), "Permissions", loc); - ArrayList pos = new ArrayList (1); + Arguments pos = new Arguments (1); pos.Add (new Argument (new MemberAccess (new MemberAccess (system_security_permissions, "SecurityAction", loc), "RequestMinimum"))); - ArrayList named = new ArrayList (1); - named.Add (new DictionaryEntry ("SkipVerification", new Argument (new BoolLiteral (true, loc)))); + Arguments named = new Arguments (1); + named.Add (new NamedArgument (new LocatedToken (loc, "SkipVerification"), (new BoolLiteral (true, loc)))); GlobalAttribute g = new GlobalAttribute (new NamespaceEntry (null, null, null), "assembly", system_security_permissions, - "SecurityPermissionAttribute", new object[] { pos, named }, loc, false); + "SecurityPermissionAttribute", new Arguments[] { pos, named }, loc, false); g.AttachTo (this); if (g.Resolve () != null) { diff --git a/mcs/mcs/complete.cs b/mcs/mcs/complete.cs index 199fc274ddd..9ff1d96690d 100644 --- a/mcs/mcs/complete.cs +++ b/mcs/mcs/complete.cs @@ -142,7 +142,7 @@ namespace Mono.CSharp { return null; Type expr_type = expr_resolved.Type; - if (expr_type.IsPointer || expr_type == TypeManager.void_type || expr_type == TypeManager.null_type || expr_type == TypeManager.anonymous_method_type) { + if (expr_type.IsPointer || expr_type == TypeManager.void_type || expr_type == TypeManager.null_type || expr_type == InternalType.AnonymousMethod) { Unary.Error_OperatorCannotBeApplied (loc, ".", expr_type); return null; } diff --git a/mcs/mcs/constant.cs b/mcs/mcs/constant.cs index f141c821110..3cc2bb672df 100644 --- a/mcs/mcs/constant.cs +++ b/mcs/mcs/constant.cs @@ -163,10 +163,9 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); args.Add (new Argument (this)); - args.Add (new Argument ( - new TypeOf (new TypeExpression (type, loc), loc))); + args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc))); return CreateExpressionFactoryCall ("Constant", args); } diff --git a/mcs/mcs/convert.cs b/mcs/mcs/convert.cs index 8168eb0118f..52cee4969fc 100644 --- a/mcs/mcs/convert.cs +++ b/mcs/mcs/convert.cs @@ -281,7 +281,7 @@ namespace Mono.CSharp { // from the null type to any reference-type. if (expr_type == TypeManager.null_type) - return target_type != TypeManager.anonymous_method_type; + return target_type != InternalType.AnonymousMethod; if (TypeManager.IsGenericParameter (expr_type)) return ImplicitTypeParameterConversion (expr, target_type) != null; @@ -453,7 +453,7 @@ namespace Mono.CSharp { return false; } - static Expression ImplicitNulableConversion (EmitContext ec, Expression expr, Type target_type) + public static Expression ImplicitNulableConversion (EmitContext ec, Expression expr, Type target_type) { Type expr_type = expr.Type; @@ -656,7 +656,7 @@ namespace Mono.CSharp { if (ImplicitStandardConversionExists (expr, target_type)) return true; - if (expr.Type == TypeManager.anonymous_method_type) { + if (expr.Type == InternalType.AnonymousMethod) { if (!TypeManager.IsDelegateType (target_type) && TypeManager.DropGenericTypeArguments (target_type) != TypeManager.expression_type) return false; @@ -778,9 +778,9 @@ namespace Mono.CSharp { if (target_type == TypeManager.void_ptr_type && expr_type.IsPointer) return true; - // Conversion from __arglist to RuntimeArgumentHandle - if (expr_type == typeof (ArglistAccess)) - return target_type == TypeManager.runtime_argument_handle_type; + // Conversion from __arglist to System.ArgIterator + if (expr_type == InternalType.Arglist) + return target_type == TypeManager.arg_iterator_type; return false; } @@ -1224,7 +1224,7 @@ namespace Mono.CSharp { Expression e; if (expr_type.Equals (target_type)) { - if (expr_type != TypeManager.null_type && expr_type != TypeManager.anonymous_method_type) + if (expr_type != TypeManager.null_type && expr_type != InternalType.AnonymousMethod) return expr; return null; } @@ -1293,14 +1293,14 @@ namespace Mono.CSharp { return EmptyCast.Create (new NullPointer (loc), target_type); } - if (expr_type == TypeManager.anonymous_method_type){ + if (expr_type == InternalType.AnonymousMethod){ AnonymousMethodExpression ame = (AnonymousMethodExpression) expr; Expression am = ame.Compatible (ec, target_type); if (am != null) return am.DoResolve (ec); } - if (expr_type == typeof (ArglistAccess) && target_type == TypeManager.runtime_argument_handle_type) + if (expr_type == InternalType.Arglist && target_type == TypeManager.arg_iterator_type) return expr; return null; diff --git a/mcs/mcs/cs-parser.jay b/mcs/mcs/cs-parser.jay index 303dd4a7dd6..e51c7ea66fa 100644 --- a/mcs/mcs/cs-parser.jay +++ b/mcs/mcs/cs-parser.jay @@ -32,7 +32,21 @@ namespace Mono.CSharp /// /// The C# Parser /// - public class CSharpParser { + public class CSharpParser + { + [Flags] + enum ParameterModifierType + { + Ref = 1 << 1, + Out = 1 << 2, + This = 1 << 3, + Params = 1 << 4, + Arglist = 1 << 5, + DefaultValue = 1 << 6, + + All = Ref | Out | This | Params | Arglist | DefaultValue + } + NamespaceEntry current_namespace; TypeContainer current_container; DeclSpace current_class; @@ -118,9 +132,9 @@ namespace Mono.CSharp /// assembly and module attribute definitions are enabled bool global_attrs_enabled = true; bool has_get, has_set; - bool parameter_modifiers_not_allowed; - bool complex_parameters_modifiers_not_allowed; - bool arglist_allowed; + + ParameterModifierType valid_param_mod; + bool default_parameter_used; /// When using the interactive parser, this holds the @@ -767,7 +781,7 @@ attribute { ++lexer.parsing_block; } - opt_attribute_arguments + opt_attribute_arguments { --lexer.parsing_block; MemberName mname = (MemberName) $1; @@ -776,7 +790,7 @@ attribute "'<' unexpected: attributes cannot be generic"); } - object [] arguments = (object []) $3; + Arguments [] arguments = (Arguments []) $3; MemberName left = mname.Left; string identifier = mname.Name; @@ -807,78 +821,68 @@ opt_attribute_arguments attribute_arguments - : opt_positional_argument_list - { - if ($1 == null) - $$ = null; - else { - $$ = new object [] { $1, null }; - } - } - | positional_argument_list COMMA named_argument_list + : /* empty */ { $$ = null; } + | positional_or_named_argument { - $$ = new object[] { $1, $3 }; + Arguments a = new Arguments (4); + a.Add ((Argument) $1); + $$ = new Arguments [] { a, null }; } - | named_argument_list + | named_attribute_argument { - $$ = new object [] { null, $1 }; + Arguments a = new Arguments (4); + a.Add ((Argument) $1); + $$ = new Arguments [] { null, a }; } - ; - - -opt_positional_argument_list - : /* empty */ { $$ = null; } - | positional_argument_list - ; - -positional_argument_list - : expression + | attribute_arguments COMMA positional_or_named_argument { - ArrayList args = new ArrayList (4); - args.Add (new Argument ((Expression) $1, Argument.AType.Expression)); - - $$ = args; + Arguments[] o = (Arguments[]) $1; + if (o [1] != null) { + Report.Error (1016, ((Argument) $3).Expr.Location, "Named attribute arguments must appear after the positional arguments"); + o [0] = new Arguments (4); + } + + Arguments args = ((Arguments) o [0]); + if (args.Count > 0 && !($3 is NamedArgument) && args [args.Count - 1] is NamedArgument) + Error_NamedArgumentExpected ((NamedArgument) args [args.Count - 1]); + + args.Add ((Argument) $3); } - | positional_argument_list COMMA expression - { - ArrayList args = (ArrayList) $1; - args.Add (new Argument ((Expression) $3, Argument.AType.Expression)); - - $$ = args; - } - ; - -named_argument_list - : named_argument + | attribute_arguments COMMA named_attribute_argument { - ArrayList args = new ArrayList (4); - args.Add ($1); + Arguments[] o = (Arguments[]) $1; + if (o [1] == null) { + o [1] = new Arguments (4); + } - $$ = args; + ((Arguments) o [1]).Add ((Argument) $3); } - | named_argument_list COMMA named_argument - { - ArrayList args = (ArrayList) $1; - args.Add ($3); + ; - $$ = args; - } - | named_argument_list COMMA expression +positional_or_named_argument + : expression { - Report.Error (1016, ((Expression) $3).Location, "Named attribute argument expected"); - $$ = null; + $$ = new Argument ((Expression) $1); } + | named_argument ; -named_argument +named_attribute_argument : IDENTIFIER ASSIGN expression { - // FIXME: keep location - $$ = new DictionaryEntry ( - ((LocatedToken) $1).Value, - new Argument ((Expression) $3, Argument.AType.Expression)); + $$ = new NamedArgument ((LocatedToken) $1, (Expression) $3); } ; + +named_argument + : IDENTIFIER COLON expression + { + if (RootContext.Version <= LanguageVersion.V_3) + Report.FeatureIsNotAvailable (GetLocation ($1), "named argument"); + + $$ = new NamedArgument ((LocatedToken) $1, (Expression) $3); + } + ; class_body @@ -1282,16 +1286,16 @@ method_header member_type method_declaration_name OPEN_PARENS { - arglist_allowed = true; + valid_param_mod = ParameterModifierType.All; } - opt_formal_parameter_list CLOSE_PARENS + opt_formal_parameter_list CLOSE_PARENS { lexer.ConstraintsParsing = true; } opt_type_parameter_constraints_clauses { lexer.ConstraintsParsing = false; - arglist_allowed = false; + valid_param_mod = 0; MemberName name = (MemberName) $4; current_local_parameters = (ParametersCompiled) $7; @@ -1323,18 +1327,23 @@ method_header opt_modifiers PARTIAL VOID method_declaration_name - OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + OPEN_PARENS + { + valid_param_mod = ParameterModifierType.All; + } + opt_formal_parameter_list CLOSE_PARENS { lexer.ConstraintsParsing = true; } opt_type_parameter_constraints_clauses { lexer.ConstraintsParsing = false; + valid_param_mod = 0; MemberName name = (MemberName) $5; - current_local_parameters = (ParametersCompiled) $7; + current_local_parameters = (ParametersCompiled) $8; - if ($9 != null && name.TypeArguments == null) + if ($10 != null && name.TypeArguments == null) Report.Error (80, lexer.Location, "Constraints are not allowed on non-generic declarations"); @@ -1344,7 +1353,7 @@ method_header generic = new GenericMethod (current_namespace, current_class, name, TypeManager.system_void_expr, current_local_parameters); - generic.SetParameterInfo ((ArrayList) $10); + generic.SetParameterInfo ((ArrayList) $11); } int modifiers = (int) $2; @@ -1363,7 +1372,7 @@ method_header Report.Error (751, name.Location, "A partial method must be declared within a " + "partial class or partial struct"); } - + modifiers |= Modifiers.PARTIAL | Modifiers.PRIVATE; method = new Method (current_class, generic, TypeManager.system_void_expr, @@ -1407,19 +1416,6 @@ opt_formal_parameter_list | formal_parameter_list ; -opt_parameter_list_no_mod - : /* empty */ { $$ = ParametersCompiled.EmptyReadOnlyParameters; } - | - { - parameter_modifiers_not_allowed = true; - } - formal_parameter_list - { - parameter_modifiers_not_allowed = false; - $$ = $2; - } - ; - formal_parameter_list : fixed_parameters { @@ -1567,11 +1563,13 @@ fixed_parameter mod = Parameter.Modifier.NONE; } - if (complex_parameters_modifiers_not_allowed) + if ((valid_param_mod & ParameterModifierType.DefaultValue) == 0) Report.Error (1065, GetLocation ($6), "Optional parameter is not valid in this context"); LocatedToken lt = (LocatedToken) $4; - $$ = new Parameter ((FullNamedExpression) $3, lt.Value, mod, (Attributes) $1, (Expression) $6, lt.Location); + $$ = new Parameter ((FullNamedExpression) $3, lt.Value, mod, (Attributes) $1, lt.Location); + if ($6 != null) + ((Parameter) $$).DefaultValue = (Expression) $6; } ; @@ -1611,21 +1609,21 @@ parameter_modifiers parameter_modifier : REF { - if (parameter_modifiers_not_allowed) + if ((valid_param_mod & ParameterModifierType.Ref) == 0) Error_ParameterModifierNotValid ("ref", (Location)$1); $$ = Parameter.Modifier.REF; } | OUT { - if (parameter_modifiers_not_allowed) + if ((valid_param_mod & ParameterModifierType.Out) == 0) Error_ParameterModifierNotValid ("out", (Location)$1); $$ = Parameter.Modifier.OUT; } | THIS { - if (parameter_modifiers_not_allowed) + if ((valid_param_mod & ParameterModifierType.This) == 0) Error_ParameterModifierNotValid ("this", (Location)$1); if (RootContext.Version <= LanguageVersion.ISO_2) @@ -1657,7 +1655,7 @@ parameter_array params_modifier : PARAMS { - if (complex_parameters_modifiers_not_allowed) + if ((valid_param_mod & ParameterModifierType.Params) == 0) Report.Error (1670, ((Location) $1), "The `params' modifier is not allowed in current context"); } | PARAMS parameter_modifier @@ -1678,7 +1676,7 @@ params_modifier arglist_modifier : ARGLIST { - if (!arglist_allowed) + if ((valid_param_mod & ParameterModifierType.Arglist) == 0) Report.Error (1669, (Location) $1, "__arglist is not valid in this context"); } ; @@ -1981,11 +1979,11 @@ operator_type operator_declarator : operator_type OPERATOR overloadable_operator OPEN_PARENS { - complex_parameters_modifiers_not_allowed = true; + valid_param_mod = ParameterModifierType.DefaultValue; } - opt_parameter_list_no_mod CLOSE_PARENS + opt_formal_parameter_list CLOSE_PARENS { - complex_parameters_modifiers_not_allowed = false; + valid_param_mod = 0; Location loc = (Location) $2; Operator.OpType op = (Operator.OpType) $3; @@ -2056,11 +2054,11 @@ overloadable_operator conversion_operator_declarator : IMPLICIT OPERATOR type OPEN_PARENS { - complex_parameters_modifiers_not_allowed = true; + valid_param_mod = ParameterModifierType.DefaultValue; } - opt_parameter_list_no_mod CLOSE_PARENS + opt_formal_parameter_list CLOSE_PARENS { - complex_parameters_modifiers_not_allowed = false; + valid_param_mod = 0; Location loc = (Location) $2; current_local_parameters = (ParametersCompiled)$6; @@ -2074,11 +2072,11 @@ conversion_operator_declarator } | EXPLICIT OPERATOR type OPEN_PARENS { - complex_parameters_modifiers_not_allowed = true; + valid_param_mod = ParameterModifierType.DefaultValue; } - opt_parameter_list_no_mod CLOSE_PARENS + opt_formal_parameter_list CLOSE_PARENS { - complex_parameters_modifiers_not_allowed = false; + valid_param_mod = 0; Location loc = (Location) $2; current_local_parameters = (ParametersCompiled)$6; @@ -2129,11 +2127,12 @@ constructor_declarator tmpComment = Lexer.consume_doc_comment (); Lexer.doc_state = XmlCommentState.Allowed; } - arglist_allowed = true; + + valid_param_mod = ParameterModifierType.All; } OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS { - arglist_allowed = false; + valid_param_mod = 0; current_local_parameters = (ParametersCompiled) $6; // @@ -2189,7 +2188,7 @@ constructor_initializer opt_argument_list CLOSE_PARENS { --lexer.parsing_block; - $$ = new ConstructorBaseInitializer ((ArrayList) $5, (Location) $2); + $$ = new ConstructorBaseInitializer ((Arguments) $5, (Location) $2); } | COLON THIS OPEN_PARENS { @@ -2198,7 +2197,7 @@ constructor_initializer opt_argument_list CLOSE_PARENS { --lexer.parsing_block; - $$ = new ConstructorThisInitializer ((ArrayList) $5, (Location) $2); + $$ = new ConstructorThisInitializer ((Arguments) $5, (Location) $2); } | COLON error { Report.Error (1018, GetLocation ($1), "Keyword `this' or `base' expected"); @@ -2292,30 +2291,29 @@ event_declaration if (current_container.Kind == Kind.Interface) { Report.Error (69, (Location) $3, "Event in interface cannot have add or remove accessors"); + $8 = new Accessors (null, null); + } else if ($8 == null) { + Report.Error (65, (Location) $3, "`{0}.{1}': event property must have both add and remove accessors", + current_container.GetSignatureForError (), name.GetSignatureForError ()); + $8 = new Accessors (null, null); } + + Accessors accessors = (Accessors) $8; - if ($8 == null){ - Report.Error (65, (Location) $3, "`{0}.{1}': event property must have both add and remove accessors", - current_container.Name, name.GetSignatureForError ()); + if (accessors.get_or_add == null || accessors.set_or_remove == null) + // CS0073 is already reported, so no CS0065 here. $$ = null; - } else { - Accessors accessors = (Accessors) $8; - - if (accessors.get_or_add == null || accessors.set_or_remove == null) - // CS0073 is already reported, so no CS0065 here. - $$ = null; - else { - Event e = new EventProperty ( - current_class, (FullNamedExpression) $4, (int) $2, name, - (Attributes) $1, accessors.get_or_add, accessors.set_or_remove); - if (RootContext.Documentation != null) { - e.DocComment = Lexer.consume_doc_comment (); - Lexer.doc_state = XmlCommentState.Allowed; - } - - current_container.AddEvent (e); - implicit_value_parameter_type = null; + else { + Event e = new EventProperty ( + current_class, (FullNamedExpression) $4, (int) $2, name, + (Attributes) $1, accessors.get_or_add, accessors.set_or_remove); + if (RootContext.Documentation != null) { + e.DocComment = Lexer.consume_doc_comment (); + Lexer.doc_state = XmlCommentState.Allowed; } + + current_container.AddEvent (e); + implicit_value_parameter_type = null; } current_local_parameters = null; } @@ -2397,20 +2395,19 @@ remove_accessor_declaration indexer_declaration : opt_attributes opt_modifiers - member_type indexer_declaration_name OPEN_BRACKET opt_parameter_list_no_mod CLOSE_BRACKET + member_type indexer_declaration_name OPEN_BRACKET + { + valid_param_mod = ParameterModifierType.Params | ParameterModifierType.DefaultValue; + } + opt_formal_parameter_list CLOSE_BRACKET OPEN_BRACE { + valid_param_mod = 0; implicit_value_parameter_type = (FullNamedExpression) $3; - indexer_parameters = (ParametersCompiled) $6; + indexer_parameters = (ParametersCompiled) $7; if (indexer_parameters.IsEmpty) { Report.Error (1551, GetLocation ($5), "Indexers must have at least one parameter"); - } else if (indexer_parameters.Count == 1) { - Parameter p = indexer_parameters [0]; - if (p.HasDefaultValue) - Report.Warning (1066, 1, p.Location, - "The default value specified for optional parameter 'i' will never be used", - p.Name); } if (RootContext.Documentation != null) { @@ -2430,13 +2427,13 @@ indexer_declaration } CLOSE_BRACE { - Accessors accessors = (Accessors) $10; + Accessors accessors = (Accessors) $11; Accessor get_block = accessors != null ? accessors.get_or_add : null; Accessor set_block = accessors != null ? accessors.set_or_remove : null; bool order = accessors != null ? accessors.declared_in_reverse : false; Indexer indexer = new Indexer (current_class, (FullNamedExpression) $3, - (MemberName)$4, (int) $2, (ParametersCompiled) $6, (Attributes) $1, + (MemberName)$4, (int) $2, (ParametersCompiled) $7, (Attributes) $1, get_block, set_block, order); if ($3 == TypeManager.system_void_expr) @@ -2546,7 +2543,7 @@ enum_body ; opt_enum_member_declarations - : /* empty */ { $$ = new ArrayList (4); } + : /* empty */ { $$ = new ArrayList (0); } | enum_member_declarations opt_comma { $$ = $1; } ; @@ -2607,10 +2604,16 @@ delegate_declaration opt_modifiers DELEGATE member_type type_declaration_name - OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS + OPEN_PARENS + { + valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out | ParameterModifierType.Params | ParameterModifierType.DefaultValue; + } + opt_formal_parameter_list CLOSE_PARENS { + valid_param_mod = 0; + MemberName name = MakeName ((MemberName) $5); - ParametersCompiled p = (ParametersCompiled) $7; + ParametersCompiled p = (ParametersCompiled) $8; Delegate del = new Delegate (current_namespace, current_class, (FullNamedExpression) $4, (int) $2, name, p, (Attributes) $1); @@ -2630,7 +2633,7 @@ delegate_declaration } SEMICOLON { - current_delegate.SetParameterInfo ((ArrayList) $10); + current_delegate.SetParameterInfo ((ArrayList) $11); $$ = current_delegate; current_delegate = null; @@ -2887,7 +2890,7 @@ type_expression if ($2 != null) { $$ = new ComposedCast (name.GetTypeExpression (), "?", lexer.Location); } else { - if (name.Left == null && name.Name == "var" && RootContext.Version > LanguageVersion.ISO_2) + if (name.Left == null && name.Name == "var") $$ = current_array_type = new VarExpr (name.Location); else $$ = name.GetTypeExpression (); @@ -3115,7 +3118,7 @@ member_access invocation_expression : primary_expression open_parens_any opt_argument_list CLOSE_PARENS { - $$ = new Invocation ((Expression) $1, (ArrayList) $3); + $$ = new Invocation ((Expression) $1, (Arguments) $3); } ; @@ -3199,16 +3202,33 @@ opt_argument_list ; argument_list - : argument + : argument_or_named_argument { - ArrayList list = new ArrayList (4); - list.Add ($1); + Arguments list = new Arguments (4); + list.Add ((Argument) $1); $$ = list; } | argument_list COMMA argument { - ArrayList list = (ArrayList) $1; - list.Add ($3); + Arguments list = (Arguments) $1; + if (list [list.Count - 1] is NamedArgument) + Error_NamedArgumentExpected ((NamedArgument) list [list.Count - 1]); + + list.Add ((Argument) $3); + $$ = list; + } + | argument_list COMMA named_argument + { + Arguments list = (Arguments) $1; + NamedArgument a = (NamedArgument) $3; + for (int i = 0; i < list.Count; ++i) { + NamedArgument na = list [i] as NamedArgument; + if (na != null && na.Name.Value == a.Name.Value) + Report.Error (1740, na.Name.Location, "Named argument `{0}' specified multiple times", + na.Name.Value); + } + + list.Add (a); $$ = list; } | argument_list COMMA @@ -3216,7 +3236,7 @@ argument_list Report.Error (839, GetLocation ($2), "An argument is missing"); $$ = null; } - | COMMA argument + | COMMA argument_or_named_argument { Report.Error (839, GetLocation ($1), "An argument is missing"); $$ = null; @@ -3226,12 +3246,14 @@ argument_list argument : expression { - $$ = new Argument ((Expression) $1, Argument.AType.Expression); + $$ = new Argument ((Expression) $1); } | non_simple_argument - { - $$ = $1; - } + ; + +argument_or_named_argument + : argument + | named_argument ; non_simple_argument @@ -3245,36 +3267,31 @@ non_simple_argument } | ARGLIST open_parens_any argument_list CLOSE_PARENS { - ArrayList list = (ArrayList) $3; - Argument[] args = new Argument [list.Count]; - list.CopyTo (args, 0); - - Expression expr = new Arglist (args, (Location) $1); - $$ = new Argument (expr, Argument.AType.Expression); + $$ = new Argument (new Arglist ((Arguments) $3, (Location) $1)); } | ARGLIST open_parens_any CLOSE_PARENS { - $$ = new Argument (new Arglist ((Location) $1), Argument.AType.Expression); + $$ = new Argument (new Arglist ((Location) $1)); } | ARGLIST { - $$ = new Argument (new ArglistAccess ((Location) $1), Argument.AType.ArgList); + $$ = new Argument (new ArglistAccess ((Location) $1)); } ; variable_reference - : expression { note ("section 5.4"); $$ = $1; } + : expression ; element_access - : primary_expression_no_array_creation OPEN_BRACKET expression_list CLOSE_BRACKET + : primary_expression_no_array_creation OPEN_BRACKET expression_list_arguments CLOSE_BRACKET { - $$ = new ElementAccess ((Expression) $1, (ArrayList) $3); + $$ = new ElementAccess ((Expression) $1, (Arguments) $3); } - | array_creation_expression OPEN_BRACKET expression_list CLOSE_BRACKET + | array_creation_expression OPEN_BRACKET expression_list_arguments CLOSE_BRACKET { // LAMESPEC: Not allowed according to specification - $$ = new ElementAccess ((Expression) $1, (ArrayList) $3); + $$ = new ElementAccess ((Expression) $1, (Arguments) $3); } | primary_expression_no_array_creation rank_specifiers { @@ -3317,6 +3334,29 @@ expression_list $$ = list; } ; + +expression_list_arguments + : expression_list_argument + { + Arguments args = new Arguments (4); + args.Add ((Argument) $1); + $$ = args; + } + | expression_list_arguments COMMA expression_list_argument + { + Arguments args = (Arguments) $1; + args.Add ((Argument) $3); + $$ = args; + } + ; + +expression_list_argument + : expression + { + $$ = new Argument ((Expression) $1); + } + | named_argument + ; this_access : THIS @@ -3331,13 +3371,14 @@ base_access LocatedToken lt = (LocatedToken) $3; $$ = new BaseAccess (lt.Value, (TypeArguments) $4, lt.Location); } - | BASE OPEN_BRACKET expression_list CLOSE_BRACKET + | BASE OPEN_BRACKET expression_list_arguments CLOSE_BRACKET { - $$ = new BaseIndexerAccess ((ArrayList) $3, (Location) $1); + $$ = new BaseIndexerAccess ((Arguments) $3, (Location) $1); } - | BASE error { - Report.Error (175, (Location) $1, "Use of keyword `base' is not valid in this context"); - $$ = null; + | BASE error + { + Error_SyntaxError (yyToken); + $$ = new BaseAccess (null, GetLocation ($2)); } ; @@ -3362,10 +3403,10 @@ object_or_delegate_creation_expression if (RootContext.Version <= LanguageVersion.ISO_2) Report.FeatureIsNotAvailable (GetLocation ($1), "object initializers"); - $$ = new NewInitialize ((Expression) $1, (ArrayList) $3, (CollectionOrObjectInitializers) $5, GetLocation ($1)); + $$ = new NewInitialize ((Expression) $1, (Arguments) $3, (CollectionOrObjectInitializers) $5, GetLocation ($1)); } else - $$ = new New ((Expression) $1, (ArrayList) $3, GetLocation ($1)); + $$ = new New ((Expression) $1, (Arguments) $3, GetLocation ($1)); } | new_expr_start object_or_collection_initializer { @@ -3725,11 +3766,11 @@ opt_anonymous_method_signature anonymous_method_signature : OPEN_PARENS { - complex_parameters_modifiers_not_allowed = true; + valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; } opt_formal_parameter_list CLOSE_PARENS { - complex_parameters_modifiers_not_allowed = false; + valid_param_mod = 0; $$ = $3; } ; @@ -4093,13 +4134,18 @@ lambda_expression { $$ = end_anonymous ((ToplevelBlock) $4); } - | OPEN_PARENS_LAMBDA opt_lambda_parameter_list CLOSE_PARENS ARROW + | OPEN_PARENS_LAMBDA + { + valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out; + } + opt_lambda_parameter_list CLOSE_PARENS ARROW { - start_anonymous (true, (ParametersCompiled) $2, GetLocation ($1)); + valid_param_mod = 0; + start_anonymous (true, (ParametersCompiled) $3, GetLocation ($1)); } lambda_expression_body { - $$ = end_anonymous ((ToplevelBlock) $6); + $$ = end_anonymous ((ToplevelBlock) $7); } ; @@ -4537,7 +4583,7 @@ variable_type // if (rank_or_nullable.Length == 0) { SimpleName sn = expr as SimpleName; - if (sn != null && sn.Name == "var" && RootContext.Version > LanguageVersion.ISO_2) + if (sn != null && sn.Name == "var") $$ = current_array_type = new VarExpr (sn.Location); else $$ = $1; @@ -5863,7 +5909,7 @@ struct OperatorDeclaration { } } -void Error_ExpectingTypeName (Expression expr) +static void Error_ExpectingTypeName (Expression expr) { if (expr is Invocation){ Report.Error (1002, expr.Location, "Expecting `;'"); @@ -5889,6 +5935,11 @@ static void Error_TypeExpected (Location loc) Report.Error (1031, loc, "Type expected"); } +static void Error_NamedArgumentExpected (NamedArgument a) +{ + Report.Error (1738, a.Name.Location, "Named arguments must appear after the positional arguments"); +} + void push_current_class (TypeContainer tc, object partial_token) { if (RootContext.EvalMode){ @@ -6084,11 +6135,6 @@ void syntax_error (Location l, string msg) Report.Error (1003, l, "Syntax error, " + msg); } -void note (string s) -{ - // Used to put annotations -} - Tokenizer lexer; public Tokenizer Lexer { diff --git a/mcs/mcs/delegate.cs b/mcs/mcs/delegate.cs index 728b18d1ea8..83924df0338 100644 --- a/mcs/mcs/delegate.cs +++ b/mcs/mcs/delegate.cs @@ -548,8 +548,7 @@ namespace Mono.CSharp { // Verifies whether the invocation arguments are compatible with the // delegate's target method // - public static bool VerifyApplicability (EmitContext ec, Type delegate_type, - ArrayList args, Location loc) + public static bool VerifyApplicability (EmitContext ec, Type delegate_type, ref Arguments args, Location loc) { int arg_count; @@ -567,7 +566,9 @@ namespace Mono.CSharp { bool params_method = pd.HasParams; bool is_params_applicable = false; - bool is_applicable = me.IsApplicable (ec, args, arg_count, ref mb, ref is_params_applicable) == 0; + bool is_applicable = me.IsApplicable (ec, ref args, arg_count, ref mb, ref is_params_applicable) == 0; + if (args != null) + arg_count = args.Count; if (!is_applicable && !params_method && arg_count != pd_count) { Report.Error (1593, loc, "Delegate `{0}' does not take `{1}' arguments", @@ -671,10 +672,10 @@ namespace Mono.CSharp { protected MethodGroupExpr method_group; protected Expression delegate_instance_expression; - public static ArrayList CreateDelegateMethodArguments (MethodInfo invoke_method, Location loc) + // TODO: Should either cache it or use interface to abstract it + public static Arguments CreateDelegateMethodArguments (AParametersCollection pd, Location loc) { - AParametersCollection pd = TypeManager.GetParameterData (invoke_method); - ArrayList delegate_arguments = new ArrayList (pd.Count); + Arguments delegate_arguments = new Arguments (pd.Count); for (int i = 0; i < pd.Count; ++i) { Argument.AType atype_modifier; Type atype = pd.Types [i]; @@ -687,11 +688,8 @@ namespace Mono.CSharp { atype_modifier = Argument.AType.Out; //atype = atype.GetElementType (); break; - case Parameter.Modifier.ARGLIST: - // __arglist is not valid - throw new InternalErrorException ("__arglist modifier"); default: - atype_modifier = Argument.AType.Expression; + atype_modifier = 0; break; } delegate_arguments.Add (new Argument (new TypeExpression (atype, loc), atype_modifier)); @@ -703,7 +701,7 @@ namespace Mono.CSharp { { MemberAccess ma = new MemberAccess (new MemberAccess (new QualifiedAliasMember ("global", "System", loc), "Delegate", loc), "CreateDelegate", loc); - ArrayList args = new ArrayList (3); + Arguments args = new Arguments (3); args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc))); args.Add (new Argument (new NullLiteral (loc))); args.Add (new Argument (new TypeOfMethodInfo (delegate_method, loc))); @@ -726,7 +724,7 @@ namespace Mono.CSharp { method_group.DelegateType = type; method_group.CustomErrorHandler = this; - ArrayList arguments = CreateDelegateMethodArguments (invoke_method, loc); + Arguments arguments = CreateDelegateMethodArguments (TypeManager.GetParameterData (invoke_method), loc); method_group = method_group.OverloadResolve (ec, ref arguments, false, loc); if (method_group == null) return null; @@ -904,12 +902,12 @@ namespace Mono.CSharp { // public class NewDelegate : DelegateCreation { - public ArrayList Arguments; + public Arguments Arguments; // // This constructor is invoked from the `New' expression // - public NewDelegate (Type type, ArrayList Arguments, Location loc) + public NewDelegate (Type type, Arguments Arguments, Location loc) { this.type = type; this.Arguments = Arguments; @@ -923,7 +921,7 @@ namespace Mono.CSharp { return null; } - Argument a = (Argument) Arguments [0]; + Argument a = Arguments [0]; if (!a.ResolveMethodGroup (ec)) return null; @@ -965,11 +963,10 @@ namespace Mono.CSharp { public class DelegateInvocation : ExpressionStatement { readonly Expression InstanceExpr; - readonly ArrayList Arguments; - + Arguments Arguments; MethodInfo method; - public DelegateInvocation (Expression instance_expr, ArrayList args, Location loc) + public DelegateInvocation (Expression instance_expr, Arguments args, Location loc) { this.InstanceExpr = instance_expr; this.Arguments = args; @@ -978,17 +975,8 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args; - if (Arguments == null) - args = new ArrayList (1); - else - args = new ArrayList (Arguments.Count + 1); - - args.Add (new Argument (InstanceExpr.CreateExpressionTree (ec))); - if (Arguments != null) { - foreach (Argument a in Arguments) - args.Add (new Argument (a.Expr.CreateExpressionTree (ec))); - } + Arguments args = Arguments.CreateForExpressionTree (ec, Arguments, + InstanceExpr.CreateExpressionTree (ec)); return CreateExpressionFactoryCall ("Invoke", args); } @@ -1005,13 +993,10 @@ namespace Mono.CSharp { return null; if (Arguments != null){ - foreach (Argument a in Arguments){ - if (!a.Resolve (ec, loc)) - return null; - } + Arguments.Resolve (ec); } - if (!Delegate.VerifyApplicability (ec, del_type, Arguments, loc)) + if (!Delegate.VerifyApplicability (ec, del_type, ref Arguments, loc)) return null; method = Delegate.GetInvokeMethod (ec.ContainerType, del_type); @@ -1045,11 +1030,8 @@ namespace Mono.CSharp { method = storey.MutateGenericMethod (method); type = storey.MutateType (type); - if (Arguments != null) { - foreach (Argument a in Arguments) { - a.Expr.MutateHoistedGenericType (storey); - } - } + if (Arguments != null) + Arguments.MutateHoistedGenericType (storey); InstanceExpr.MutateHoistedGenericType (storey); } diff --git a/mcs/mcs/dmcs.exe.sources b/mcs/mcs/dmcs.exe.sources index 957bfc22c56..11862a6a532 100644 --- a/mcs/mcs/dmcs.exe.sources +++ b/mcs/mcs/dmcs.exe.sources @@ -1,5 +1,6 @@ AssemblyInfo.cs anonymous.cs +argument.cs assign.cs attribute.cs cs-tokenizer.cs @@ -42,4 +43,4 @@ symbolwriter.cs ../class/Mono.CompilerServices.SymbolWriter/MonoSymbolWriter.cs ../class/corlib/Mono.Security.Cryptography/CryptoConvert.cs ../build/common/Consts.cs -../tools/monop/outline.cs \ No newline at end of file +../tools/monop/outline.cs diff --git a/mcs/mcs/driver.cs b/mcs/mcs/driver.cs index 46dfd3a740a..7c93aef655a 100644 --- a/mcs/mcs/driver.cs +++ b/mcs/mcs/driver.cs @@ -1891,28 +1891,6 @@ namespace Mono.CSharp class EmbededResource : IResource { -#if GMCS_SOURCE - string name; - string file; - ResourceAttributes attributes; - - public EmbededResource (string name, string file, bool isPrivate) - { - this.name = name; - this.file = file; - this.attributes = isPrivate ? ResourceAttributes.Private : ResourceAttributes.Public; - } - - public void Emit () - { - RootContext.ToplevelTypes.Builder.DefineManifestResource ( - name, new FileStream (file, FileMode.Open, FileAccess.Read), attributes); - } - - public string FileName { - get { return file; } - } -#else static MethodInfo embed_res; static EmbededResource () { @@ -1949,7 +1927,6 @@ namespace Mono.CSharp return (string)args [1]; } } -#endif } class LinkedResource : IResource diff --git a/mcs/mcs/ecore.cs b/mcs/mcs/ecore.cs index 657b261e73d..bc4c7d8c48f 100644 --- a/mcs/mcs/ecore.cs +++ b/mcs/mcs/ecore.cs @@ -370,7 +370,7 @@ namespace Mono.CSharp { protected void Error_ValueCannotBeConvertedCore (EmitContext ec, Location loc, Type target, bool expl) { // The error was already reported as CS1660 - if (type == TypeManager.anonymous_method_type) + if (type == InternalType.AnonymousMethod) return; if (TypeManager.IsGenericParameter (Type) && TypeManager.IsGenericParameter (target) && type.Name == target.Name) { @@ -552,7 +552,7 @@ namespace Mono.CSharp { /// Currently ResolveLValue wraps DoResolveLValue to perform sanity /// checking and assertion checking on what we expect from Resolve /// - public Expression ResolveLValue (EmitContext ec, Expression right_side, Location loc) + public Expression ResolveLValue (EmitContext ec, Expression right_side) { int errors = Report.Errors; bool out_access = right_side == EmptyExpression.OutAccess; @@ -715,27 +715,39 @@ namespace Mono.CSharp { continue; } - if (non_methods == null) { + if (non_methods == null) non_methods = new ArrayList (2); - non_methods.Add (m); - continue; - } - foreach (MemberInfo n_m in non_methods) { - if (m.DeclaringType.IsInterface && TypeManager.ImplementsInterface (m.DeclaringType, n_m.DeclaringType)) - continue; - - Report.SymbolRelatedToPreviousError (m); - Report.Error (229, loc, "Ambiguity between `{0}' and `{1}'", - TypeManager.GetFullNameSignature (m), TypeManager.GetFullNameSignature (n_m)); - return null; + bool is_candidate = true; + for (int i = 0; i < non_methods.Count; ++i) { + MemberInfo n_m = (MemberInfo) non_methods [i]; + if (n_m.DeclaringType.IsInterface && TypeManager.ImplementsInterface (m.DeclaringType, n_m.DeclaringType)) { + non_methods.Remove (n_m); + --i; + } else if (m.DeclaringType.IsInterface && TypeManager.ImplementsInterface (n_m.DeclaringType, m.DeclaringType)) { + is_candidate = false; + break; + } + } + + if (is_candidate) { + non_methods.Add (m); } } + + if (methods.Count == 0 && non_methods != null && non_methods.Count > 1) { + Report.SymbolRelatedToPreviousError ((MemberInfo)non_methods [1]); + Report.SymbolRelatedToPreviousError ((MemberInfo)non_methods [0]); + Report.Error (229, loc, "Ambiguity between `{0}' and `{1}'", + TypeManager.GetFullNameSignature ((MemberInfo)non_methods [1]), + TypeManager.GetFullNameSignature ((MemberInfo)non_methods [0])); + return null; + } if (methods.Count == 0) return ExprClassFromMemberInfo (container_type, (MemberInfo)non_methods [0], loc); - if (non_methods != null) { + if (non_methods != null && non_methods.Count > 0) { MethodBase method = (MethodBase) methods [0]; MemberInfo non_method = (MemberInfo) non_methods [0]; if (method.DeclaringType == non_method.DeclaringType) { @@ -942,8 +954,8 @@ namespace Mono.CSharp { if (operator_group == null) return null; - ArrayList arguments = new ArrayList (1); - arguments.Add (new Argument (e, Argument.AType.Expression)); + Arguments arguments = new Arguments (1); + arguments.Add (new Argument (e)); operator_group = operator_group.OverloadResolve ( ec, ref arguments, false, loc); @@ -1267,17 +1279,17 @@ namespace Mono.CSharp { // public abstract Expression CreateExpressionTree (EmitContext ec); - protected Expression CreateExpressionFactoryCall (string name, ArrayList args) + protected Expression CreateExpressionFactoryCall (string name, Arguments args) { return CreateExpressionFactoryCall (name, null, args, loc); } - protected Expression CreateExpressionFactoryCall (string name, TypeArguments typeArguments, ArrayList args) + protected Expression CreateExpressionFactoryCall (string name, TypeArguments typeArguments, Arguments args) { return CreateExpressionFactoryCall (name, typeArguments, args, loc); } - public static Expression CreateExpressionFactoryCall (string name, TypeArguments typeArguments, ArrayList args, Location loc) + public static Expression CreateExpressionFactoryCall (string name, TypeArguments typeArguments, Arguments args, Location loc) { return new Invocation (new MemberAccess (CreateExpressionTypeExpression (loc), name, typeArguments, loc), args); } @@ -1364,7 +1376,7 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); args.Add (new Argument (child.CreateExpressionTree (ec))); args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc))); @@ -1585,9 +1597,10 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); - args.Add (new Argument (child.CreateExpressionTree (ec))); - args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc))); + Arguments args = Arguments.CreateForExpressionTree (ec, null, + child.CreateExpressionTree (ec), + new TypeOf (new TypeExpression (type, loc), loc)); + if (type.IsPointer) Error_PointerInsideExpressionTree (); @@ -2623,7 +2636,7 @@ namespace Mono.CSharp { if (vi != null){ LocalVariableReference var = new LocalVariableReference (ec.CurrentBlock, Name, loc); if (right_side != null) { - return var.ResolveLValue (ec, right_side, loc); + return var.ResolveLValue (ec, right_side); } else { ResolveFlags rf = ResolveFlags.VariableOrValue; if (intermediate) @@ -2635,7 +2648,7 @@ namespace Mono.CSharp { Expression expr = current_block.Toplevel.GetParameterReference (Name, loc); if (expr != null) { if (right_side != null) - return expr.ResolveLValue (ec, right_side, loc); + return expr.ResolveLValue (ec, right_side); return expr.Resolve (ec); } @@ -3132,45 +3145,30 @@ namespace Mono.CSharp { get { return namespace_entry == null; } } - public override void EmitArguments (EmitContext ec, ArrayList arguments) - { - if (arguments == null) - arguments = new ArrayList (1); - arguments.Insert (0, extension_argument); - base.EmitArguments (ec, arguments); - } - - public override void EmitCall (EmitContext ec, ArrayList arguments) - { - if (arguments == null) - arguments = new ArrayList (1); - arguments.Insert (0, extension_argument); - base.EmitCall (ec, arguments); - } - public override void MutateHoistedGenericType (AnonymousMethodStorey storey) { extension_argument.Expr.MutateHoistedGenericType (storey); base.MutateHoistedGenericType (storey); } - public override MethodGroupExpr OverloadResolve (EmitContext ec, ref ArrayList arguments, bool may_fail, Location loc) + public override MethodGroupExpr OverloadResolve (EmitContext ec, ref Arguments arguments, bool may_fail, Location loc) { if (arguments == null) - arguments = new ArrayList (1); + arguments = new Arguments (1); arguments.Insert (0, new Argument (ExtensionExpression)); - MethodGroupExpr mg = ResolveOverloadExtensions (ec, arguments, namespace_entry, loc); + MethodGroupExpr mg = ResolveOverloadExtensions (ec, ref arguments, namespace_entry, loc); // Store resolved argument and restore original arguments if (mg != null) - ((ExtensionMethodGroupExpr)mg).extension_argument = (Argument)arguments [0]; - arguments.RemoveAt (0); + ((ExtensionMethodGroupExpr)mg).extension_argument = arguments [0]; + else + arguments.RemoveAt (0); // Clean-up modified arguments for error reporting return mg; } - MethodGroupExpr ResolveOverloadExtensions (EmitContext ec, ArrayList arguments, NamespaceEntry ns, Location loc) + MethodGroupExpr ResolveOverloadExtensions (EmitContext ec, ref Arguments arguments, NamespaceEntry ns, Location loc) { // Use normal resolve rules MethodGroupExpr mg = base.OverloadResolve (ec, ref arguments, ns != null, loc); @@ -3187,7 +3185,7 @@ namespace Mono.CSharp { e.ExtensionExpression = ExtensionExpression; e.SetTypeArguments (type_arguments); - return e.ResolveOverloadExtensions (ec, arguments, e.namespace_entry, loc); + return e.ResolveOverloadExtensions (ec, ref arguments, e.namespace_entry, loc); } } @@ -3248,7 +3246,7 @@ namespace Mono.CSharp { { this.loc = loc; eclass = ExprClass.MethodGroup; - this.type = typeof (MethodGroupExpr); + this.type = InternalType.MethodGroup; queried_type = type; } @@ -3329,7 +3327,7 @@ namespace Mono.CSharp { static int BetterExpressionConversion (EmitContext ec, Argument a, Type p, Type q) { Type argument_type = TypeManager.TypeToCoreType (a.Type); - if (argument_type == TypeManager.anonymous_method_type && RootContext.Version > LanguageVersion.ISO_2) { + if (argument_type == InternalType.AnonymousMethod && RootContext.Version > LanguageVersion.ISO_2) { // // Uwrap delegate from Expression // @@ -3422,7 +3420,7 @@ namespace Mono.CSharp { /// false if candidate ain't better /// true if candidate is better than the current best match /// - static bool BetterFunction (EmitContext ec, ArrayList args, int argument_count, + static bool BetterFunction (EmitContext ec, Arguments args, int argument_count, MethodBase candidate, bool candidate_params, MethodBase best, bool best_params) { @@ -3433,7 +3431,11 @@ namespace Mono.CSharp { bool same = true; for (int j = 0, c_idx = 0, b_idx = 0; j < argument_count; ++j, ++c_idx, ++b_idx) { - Argument a = (Argument) args [j]; + Argument a = args [j]; + + // Provided default argument value is never better + if (a.IsDefaultArgument && candidate_params == best_params) + return false; Type ct = candidate_pd.Types [c_idx]; Type bt = best_pd.Types [b_idx]; @@ -3510,7 +3512,7 @@ namespace Mono.CSharp { if (candidate_param_count != best_param_count) // can only happen if (candidate_params && best_params) - return candidate_param_count > best_param_count; + return candidate_param_count > best_param_count && best_pd.HasParams; // // now, both methods have the same number of parameters, and the parameters have the same types @@ -3609,12 +3611,7 @@ namespace Mono.CSharp { ReportUsageError (); } - public virtual void EmitArguments (EmitContext ec, ArrayList arguments) - { - Invocation.EmitArguments (ec, arguments, false, null); - } - - public virtual void EmitCall (EmitContext ec, ArrayList arguments) + public void EmitCall (EmitContext ec, Arguments arguments) { Invocation.EmitCall (ec, IsBase, InstanceExpression, best_candidate, arguments, loc); } @@ -3721,21 +3718,101 @@ namespace Mono.CSharp { /// 0 = the best, int.MaxValue = the worst /// public int IsApplicable (EmitContext ec, - ArrayList arguments, int arg_count, ref MethodBase method, ref bool params_expanded_form) + ref Arguments arguments, int arg_count, ref MethodBase method, ref bool params_expanded_form) { MethodBase candidate = method; AParametersCollection pd = TypeManager.GetParameterData (candidate); int param_count = GetApplicableParametersCount (candidate, pd); + int optional_count = 0; if (arg_count != param_count) { - if (!pd.HasParams) - return int.MaxValue - 10000 + Math.Abs (arg_count - param_count); - if (arg_count < param_count - 1) - return int.MaxValue - 10000 + Math.Abs (arg_count - param_count); - + for (int i = 0; i < pd.Count; ++i) { + if (pd.FixedParameters [i].HasDefaultValue) { + optional_count = pd.Count - i; + break; + } + } + + int args_gap = Math.Abs (arg_count - param_count); + if (optional_count != 0) { + if (args_gap > optional_count) + return int.MaxValue - 10000 + args_gap - optional_count; + + // Readjust expected number when params used + if (pd.HasParams) { + optional_count--; + if (arg_count < param_count) + param_count--; + } + } else if (arg_count != param_count) { + if (!pd.HasParams) + return int.MaxValue - 10000 + args_gap; + if (arg_count < param_count - 1) + return int.MaxValue - 10000 + args_gap; + } + // Initialize expanded form of a method with 1 params parameter params_expanded_form = param_count == 1 && pd.HasParams; + + // Resize to fit optional arguments + if (optional_count != 0) { + Arguments resized; + if (arguments == null) { + resized = new Arguments (optional_count); + } else { + resized = new Arguments (param_count); + resized.AddRange (arguments); + } + + for (int i = arg_count; i < param_count; ++i) + resized.Add (null); + arguments = resized; + } + } + + if (arg_count > 0) { + // + // Shuffle named arguments to the right positions if there are any + // + if (arguments [arg_count - 1] is NamedArgument) { + arg_count = arguments.Count; + + for (int i = 0; i < arg_count; ++i) { + bool arg_moved = false; + while (true) { + NamedArgument na = arguments[i] as NamedArgument; + if (na == null) + break; + + int index = pd.GetParameterIndexByName (na.Name.Value); + + // Named parameter not found or already reordered + if (index <= i) + break; + + // When using parameters which should not be available to the user + if (index >= param_count) + break; + + if (!arg_moved) { + arguments.MarkReorderedArgument (na); + arg_moved = true; + } + + Argument temp = arguments[index]; + arguments[index] = arguments[i]; + arguments[i] = temp; + + if (temp == null) + break; + } + } + } else { + arg_count = arguments.Count; + } + } else if (arguments != null) { + arg_count = arguments.Count; } #if GMCS_SOURCE @@ -3767,7 +3844,7 @@ namespace Mono.CSharp { if (type_arguments != null) return int.MaxValue - 15000; } -#endif +#endif // // 2. Each argument has to be implicitly convertible to method parameter @@ -3776,25 +3853,27 @@ namespace Mono.CSharp { Parameter.Modifier p_mod = 0; Type pt = null; for (int i = 0; i < arg_count; i++) { - Argument a = (Argument) arguments [i]; - Parameter.Modifier a_mod = a.Modifier & - ~(Parameter.Modifier.OUTMASK | Parameter.Modifier.REFMASK); - - if (p_mod != Parameter.Modifier.PARAMS) { - p_mod = pd.FixedParameters [i].ModFlags & ~(Parameter.Modifier.OUTMASK | Parameter.Modifier.REFMASK); + Argument a = arguments [i]; + if (a == null) { + if (!pd.FixedParameters [i].HasDefaultValue) + throw new InternalErrorException (); - if (p_mod == Parameter.Modifier.ARGLIST) { - if (a.Type == typeof (ArglistAccess)) - continue; + Expression e = pd.FixedParameters [i].DefaultValue as Constant; + if (e == null) + e = new DefaultValueExpression (new TypeExpression (pd.Types [i], loc), loc).Resolve (ec); - p_mod = 0; - } + arguments [i] = new Argument (e, Argument.AType.Default); + continue; + } + if (p_mod != Parameter.Modifier.PARAMS) { + p_mod = pd.FixedParameters [i].ModFlags & ~(Parameter.Modifier.OUTMASK | Parameter.Modifier.REFMASK); pt = pd.Types [i]; } else { params_expanded_form = true; } + Parameter.Modifier a_mod = a.Modifier & ~(Parameter.Modifier.OUTMASK | Parameter.Modifier.REFMASK); int score = 1; if (!params_expanded_form) score = IsArgumentCompatible (ec, a_mod, a, p_mod & ~Parameter.Modifier.PARAMS, pt); @@ -3814,7 +3893,7 @@ namespace Mono.CSharp { } if (arg_count != param_count) - params_expanded_form = true; + params_expanded_form = true; return 0; } @@ -3962,12 +4041,11 @@ namespace Mono.CSharp { /// that is the best match of me on Arguments. /// /// - public virtual MethodGroupExpr OverloadResolve (EmitContext ec, ref ArrayList Arguments, + public virtual MethodGroupExpr OverloadResolve (EmitContext ec, ref Arguments Arguments, bool may_fail, Location loc) { bool method_params = false; Type applicable_type = null; - int arg_count = 0; ArrayList candidates = new ArrayList (2); ArrayList candidate_overrides = null; @@ -3979,9 +4057,10 @@ namespace Mono.CSharp { // false is normal form, true is expanded form // Hashtable candidate_to_form = null; + Hashtable candidates_expanded = null; + Arguments candidate_args = Arguments; - if (Arguments != null) - arg_count = Arguments.Count; + int arg_count = Arguments != null ? Arguments.Count : 0; if (RootContext.Version == LanguageVersion.ISO_1 && Name == "Invoke" && TypeManager.IsDelegateType (DeclaringType)) { if (!may_fail) @@ -4042,7 +4121,7 @@ namespace Mono.CSharp { // Check if candidate is applicable (section 14.4.2.1) // bool params_expanded_form = false; - int candidate_rate = IsApplicable (ec, Arguments, arg_count, ref Methods [i], ref params_expanded_form); + int candidate_rate = IsApplicable (ec, ref candidate_args, arg_count, ref Methods [i], ref params_expanded_form); if (candidate_rate < best_candidate_rate) { best_candidate_rate = candidate_rate; @@ -4055,6 +4134,14 @@ namespace Mono.CSharp { MethodBase candidate = Methods [i]; candidate_to_form [candidate] = candidate; } + + if (candidate_args != Arguments) { + if (candidates_expanded == null) + candidates_expanded = new Hashtable (2); + + candidates_expanded.Add (Methods [i], candidate_args); + candidate_args = Arguments; + } if (candidate_rate != 0 || has_inaccessible_candidates_only) { if (msg_recorder != null) @@ -4106,7 +4193,7 @@ namespace Mono.CSharp { // return error info about the closest match // if (best_candidate != null) { - if (CustomErrorHandler != null && CustomErrorHandler.NoExactMatch (ec, best_candidate)) + if (CustomErrorHandler != null && !has_inaccessible_candidates_only && CustomErrorHandler.NoExactMatch (ec, best_candidate)) return null; AParametersCollection pd = TypeManager.GetParameterData (best_candidate); @@ -4233,6 +4320,15 @@ namespace Mono.CSharp { best_candidate = (MethodBase) candidates [0]; method_params = candidate_to_form != null && candidate_to_form.Contains (best_candidate); + // + // TODO: Broken inverse order of candidates logic does not work with optional + // parameters used for method overrides and I am not going to fix it for SRE + // + if (candidates_expanded != null && candidates_expanded.Contains (best_candidate)) { + candidate_args = (Arguments) candidates_expanded [best_candidate]; + arg_count = candidate_args.Count; + } + for (int ix = 1; ix < candidate_top; ix++) { MethodBase candidate = (MethodBase) candidates [ix]; @@ -4241,7 +4337,7 @@ namespace Mono.CSharp { bool cand_params = candidate_to_form != null && candidate_to_form.Contains (candidate); - if (BetterFunction (ec, Arguments, arg_count, + if (BetterFunction (ec, candidate_args, arg_count, candidate, cand_params, best_candidate, method_params)) { best_candidate = candidate; @@ -4260,7 +4356,7 @@ namespace Mono.CSharp { continue; bool cand_params = candidate_to_form != null && candidate_to_form.Contains (candidate); - if (!BetterFunction (ec, Arguments, arg_count, + if (!BetterFunction (ec, candidate_args, arg_count, best_candidate, method_params, candidate, cand_params)) { @@ -4321,7 +4417,7 @@ namespace Mono.CSharp { // necessary etc. and return if everything is // all right // - if (!VerifyArgumentsCompat (ec, ref Arguments, arg_count, best_candidate, + if (!VerifyArgumentsCompat (ec, ref candidate_args, arg_count, best_candidate, method_params, may_fail, loc)) return null; @@ -4344,6 +4440,7 @@ namespace Mono.CSharp { if (data != null) data.SetMemberIsUsed (); + Arguments = candidate_args; return this; } @@ -4352,12 +4449,13 @@ namespace Mono.CSharp { type_arguments = ta; } - public bool VerifyArgumentsCompat (EmitContext ec, ref ArrayList arguments, + public bool VerifyArgumentsCompat (EmitContext ec, ref Arguments arguments, int arg_count, MethodBase method, bool chose_params_expanded, bool may_fail, Location loc) { AParametersCollection pd = TypeManager.GetParameterData (method); + int param_count = GetApplicableParametersCount (method, pd); int errors = Report.Errors; Parameter.Modifier p_mod = 0; @@ -4368,18 +4466,12 @@ namespace Mono.CSharp { bool has_unsafe_arg = false; for (; a_idx < arg_count; a_idx++, ++a_pos) { - a = (Argument) arguments [a_idx]; + a = arguments [a_idx]; if (p_mod != Parameter.Modifier.PARAMS) { p_mod = pd.FixedParameters [a_idx].ModFlags; pt = pd.Types [a_idx]; has_unsafe_arg |= pt.IsPointer; - if (p_mod == Parameter.Modifier.ARGLIST) { - if (a.Type != typeof (ArglistAccess)) - break; - continue; - } - if (p_mod == Parameter.Modifier.PARAMS) { if (chose_params_expanded) { params_initializers = new ArrayList (arg_count - a_idx); @@ -4399,6 +4491,33 @@ namespace Mono.CSharp { break; continue; + } else { + NamedArgument na = a as NamedArgument; + if (na != null) { + int name_index = pd.GetParameterIndexByName (na.Name.Value); + if (name_index < 0 || name_index >= param_count) { + if (DeclaringType != null && TypeManager.IsDelegateType (DeclaringType)) { + Report.SymbolRelatedToPreviousError (DeclaringType); + Report.Error (1746, na.Name.Location, + "The delegate `{0}' does not contain a parameter named `{1}'", + TypeManager.CSharpName (DeclaringType), na.Name.Value); + } else { + Report.SymbolRelatedToPreviousError (best_candidate); + Report.Error (1739, na.Name.Location, + "The best overloaded method match for `{0}' does not contain a parameter named `{1}'", + TypeManager.CSharpSignature (method), na.Name.Value); + } + } else if (arguments[name_index] != a) { + if (DeclaringType != null && TypeManager.IsDelegateType (DeclaringType)) + Report.SymbolRelatedToPreviousError (DeclaringType); + else + Report.SymbolRelatedToPreviousError (best_candidate); + + Report.Error (1744, na.Name.Location, + "Named argument `{0}' cannot be used for a parameter which has positional argument specified", + na.Name.Value); + } + } } if (delegate_type != null && !Delegate.IsTypeCovariant (a.Expr, pt)) @@ -4437,10 +4556,9 @@ namespace Mono.CSharp { // // Fill not provided arguments required by params modifier // - int param_count = GetApplicableParametersCount (method, pd); if (params_initializers == null && pd.HasParams && arg_count + 1 == param_count) { if (arguments == null) - arguments = new ArrayList (1); + arguments = new Arguments (1); pt = pd.Types [param_count - 1]; pt = TypeManager.GetElementType (pt); @@ -4642,9 +4760,10 @@ namespace Mono.CSharp { instance = InstanceExpression.CreateExpressionTree (ec); } - ArrayList args = new ArrayList (2); - args.Add (new Argument (instance)); - args.Add (new Argument (CreateTypeOfExpression ())); + Arguments args = Arguments.CreateForExpressionTree (ec, null, + instance, + CreateTypeOfExpression ()); + return CreateExpressionFactoryCall ("Field", args); } @@ -4680,7 +4799,7 @@ namespace Mono.CSharp { out_access ? EmptyExpression.LValueMemberOutAccess : EmptyExpression.LValueMemberAccess; if (InstanceExpression != EmptyExpression.Null) - InstanceExpression = InstanceExpression.ResolveLValue (ec, right_side, loc); + InstanceExpression = InstanceExpression.ResolveLValue (ec, right_side); } } else { ResolveFlags rf = ResolveFlags.VariableOrValue | ResolveFlags.DisableFlowAnalysis; @@ -5126,9 +5245,9 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args; + Arguments args; if (IsSingleDimensionalArrayLength ()) { - args = new ArrayList (1); + args = new Arguments (1); args.Add (new Argument (InstanceExpression.CreateExpressionTree (ec))); return CreateExpressionFactoryCall ("ArrayLength", args); } @@ -5138,7 +5257,7 @@ namespace Mono.CSharp { return null; } - args = new ArrayList (2); + args = new Arguments (2); if (InstanceExpression == null) args.Add (new Argument (new NullLiteral (loc))); else @@ -5251,7 +5370,7 @@ namespace Mono.CSharp { InstanceExpression = InstanceExpression.DoResolve (ec); if (lvalue_instance && InstanceExpression != null) - InstanceExpression = InstanceExpression.ResolveLValue (ec, EmptyExpression.LValueMemberAccess, loc); + InstanceExpression = InstanceExpression.ResolveLValue (ec, EmptyExpression.LValueMemberAccess); if (InstanceExpression == null) return false; @@ -5523,8 +5642,8 @@ namespace Mono.CSharp { my_source = temp; } - ArrayList args = new ArrayList (1); - args.Add (new Argument (my_source, Argument.AType.Expression)); + Arguments args = new Arguments (1); + args.Add (new Argument (my_source)); Invocation.EmitCall (ec, IsBase, InstanceExpression, setter, args, loc, false, prepared); @@ -5734,8 +5853,8 @@ namespace Mono.CSharp { public void EmitAddOrRemove (EmitContext ec, bool is_add, Expression source) { - ArrayList args = new ArrayList (1); - args.Add (new Argument (source, Argument.AType.Expression)); + Arguments args = new Arguments (1); + args.Add (new Argument (source)); Invocation.EmitCall (ec, IsBase, InstanceExpression, is_add ? add_accessor : remove_accessor, args, loc); } } @@ -5828,7 +5947,7 @@ namespace Mono.CSharp { /// Handles `var' contextual keyword; var becomes a keyword only /// if no type called var exists in a variable scope /// - public class VarExpr : SimpleName + class VarExpr : SimpleName { // Used for error reporting only ArrayList initializer; @@ -5850,7 +5969,7 @@ namespace Mono.CSharp { throw new InternalErrorException ("An implicitly typed local variable could not be redefined"); type = right_side.Type; - if (type == TypeManager.null_type || type == TypeManager.void_type || type == TypeManager.anonymous_method_type) { + if (type == TypeManager.null_type || type == TypeManager.void_type || type == InternalType.AnonymousMethod) { Report.Error (815, loc, "An implicitly typed local variable declaration cannot be initialized with `{0}'", right_side.GetSignatureForError ()); return false; @@ -5862,7 +5981,10 @@ namespace Mono.CSharp { protected override void Error_TypeOrNamespaceNotFound (IResolveContext ec) { - Report.Error (825, loc, "The contextual keyword `var' may only appear within a local variable declaration"); + if (RootContext.Version < LanguageVersion.V_3) + base.Error_TypeOrNamespaceNotFound (ec); + else + Report.Error (825, loc, "The contextual keyword `var' may only appear within a local variable declaration"); } public override TypeExpr ResolveAsContextualType (IResolveContext rc, bool silent) @@ -5871,22 +5993,25 @@ namespace Mono.CSharp { if (te != null) return te; + if (RootContext.Version < LanguageVersion.V_3) + Report.FeatureIsNotAvailable (loc, "implicitly typed local variable"); + if (initializer == null) return null; - - if (initializer.Count > 1) { - Location loc = ((Mono.CSharp.CSharpParser.VariableDeclaration)initializer [1]).Location; - Report.Error (819, loc, "An implicitly typed local variable declaration cannot include multiple declarators"); + + if (initializer.Count > 1) { + Location loc_init = ((CSharpParser.VariableDeclaration) initializer[1]).Location; + Report.Error (819, loc_init, "An implicitly typed local variable declaration cannot include multiple declarators"); initializer = null; return null; - } - - Expression variable_initializer = ((Mono.CSharp.CSharpParser.VariableDeclaration)initializer [0]).expression_or_array_initializer; + } + + Expression variable_initializer = ((CSharpParser.VariableDeclaration) initializer[0]).expression_or_array_initializer; if (variable_initializer == null) { Report.Error (818, loc, "An implicitly typed local variable declarator must include an initializer"); return null; } - + return null; } } diff --git a/mcs/mcs/expression.cs b/mcs/mcs/expression.cs index 667f65af0a8..43bbbd64bef 100644 --- a/mcs/mcs/expression.cs +++ b/mcs/mcs/expression.cs @@ -24,11 +24,11 @@ namespace Mono.CSharp { public class UserOperatorCall : Expression { public delegate Expression ExpressionTreeExpression (EmitContext ec, MethodGroupExpr mg); - protected readonly ArrayList arguments; + protected readonly Arguments arguments; protected readonly MethodGroupExpr mg; readonly ExpressionTreeExpression expr_tree; - public UserOperatorCall (MethodGroupExpr mg, ArrayList args, ExpressionTreeExpression expr_tree, Location loc) + public UserOperatorCall (MethodGroupExpr mg, Arguments args, ExpressionTreeExpression expr_tree, Location loc) { this.mg = mg; this.arguments = args; @@ -44,12 +44,9 @@ namespace Mono.CSharp { if (expr_tree != null) return expr_tree (ec, mg); - ArrayList args = new ArrayList (arguments.Count + 1); - args.Add (new Argument (new NullLiteral (loc))); - args.Add (new Argument (mg.CreateExpressionTree (ec))); - foreach (Argument a in arguments) { - args.Add (new Argument (a.Expr.CreateExpressionTree (ec))); - } + Arguments args = Arguments.CreateForExpressionTree (ec, arguments, + new NullLiteral (loc), + mg.CreateExpressionTree (ec)); return CreateExpressionFactoryCall ("Call", args); } @@ -78,9 +75,7 @@ namespace Mono.CSharp { public override void MutateHoistedGenericType (AnonymousMethodStorey storey) { - foreach (Argument a in arguments) - a.Expr.MutateHoistedGenericType (storey); - + arguments.MutateHoistedGenericType (storey); mg.MutateHoistedGenericType (storey); } } @@ -376,7 +371,7 @@ namespace Mono.CSharp { throw new InternalErrorException ("Unknown unary operator " + Oper.ToString ()); } - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); args.Add (new Argument (Expr.CreateExpressionTree (ec))); if (user_op != null) args.Add (new Argument (user_op.CreateExpressionTree (ec))); @@ -673,14 +668,14 @@ namespace Mono.CSharp { if (user_op == null) return null; - ArrayList args = new ArrayList (1); + Arguments args = new Arguments (1); args.Add (new Argument (expr)); user_op = user_op.OverloadResolve (ec, ref args, false, expr.Location); if (user_op == null) return null; - Expr = ((Argument) args [0]).Expr; + Expr = args [0].Expr; return new UserOperatorCall (user_op, args, CreateExpressionTree, expr.Location); } @@ -947,7 +942,7 @@ namespace Mono.CSharp { // a property access or an indexer access // if (expr.eclass == ExprClass.Variable || expr.eclass == ExprClass.IndexerAccess || expr.eclass == ExprClass.PropertyAccess) { - expr = expr.ResolveLValue (ec, expr, Location); + expr = expr.ResolveLValue (ec, expr); } else { Report.Error (1059, loc, "The operand of an increment or decrement operator must be a variable, property or indexer"); } @@ -966,8 +961,8 @@ namespace Mono.CSharp { mg = MemberLookup (ec.ContainerType, type, op_name, MemberTypes.Method, AllBindingFlags, loc) as MethodGroupExpr; if (mg != null) { - ArrayList args = new ArrayList (1); - args.Add (new Argument (expr, Argument.AType.Expression)); + Arguments args = new Arguments (1); + args.Add (new Argument (expr)); mg = mg.OverloadResolve (ec, ref args, false, loc); if (mg == null) return null; @@ -1155,7 +1150,7 @@ namespace Mono.CSharp { return null; } - if (expr.Type == TypeManager.anonymous_method_type) { + if (expr.Type == InternalType.AnonymousMethod) { Report.Error (837, loc, "The `{0}' operator cannot be applied to a lambda expression or anonymous method", OperatorName); return null; @@ -1195,9 +1190,10 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); - args.Add (new Argument (expr.CreateExpressionTree (ec))); - args.Add (new Argument (new TypeOf (probe_type_expr, loc))); + Arguments args = Arguments.CreateForExpressionTree (ec, null, + expr.CreateExpressionTree (ec), + new TypeOf (probe_type_expr, loc)); + return CreateExpressionFactoryCall ("TypeIs", args); } @@ -1353,9 +1349,10 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); - args.Add (new Argument (expr.CreateExpressionTree (ec))); - args.Add (new Argument (new TypeOf (probe_type_expr, loc))); + Arguments args = Arguments.CreateForExpressionTree (ec, null, + expr.CreateExpressionTree (ec), + new TypeOf (probe_type_expr, loc)); + return CreateExpressionFactoryCall ("TypeAs", args); } @@ -1564,7 +1561,7 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); args.Add (new Argument (this)); args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc))); return CreateExpressionFactoryCall ("Constant", args); @@ -2614,15 +2611,15 @@ namespace Mono.CSharp { Expression ResolveOperatorDelegate (EmitContext ec, Type l, Type r) { bool is_equality = (oper & Operator.EqualityMask) != 0; - if (!TypeManager.IsEqual (l, r)) { + if (!TypeManager.IsEqual (l, r) && !TypeManager.IsVariantOf (r, l)) { Expression tmp; - if (right.eclass == ExprClass.MethodGroup || (r == TypeManager.anonymous_method_type && !is_equality)) { + if (right.eclass == ExprClass.MethodGroup || (r == InternalType.AnonymousMethod && !is_equality)) { tmp = Convert.ImplicitConversionRequired (ec, right, l, loc); if (tmp == null) return null; right = tmp; r = right.Type; - } else if (left.eclass == ExprClass.MethodGroup || (l == TypeManager.anonymous_method_type && !is_equality)) { + } else if (left.eclass == ExprClass.MethodGroup || (l == InternalType.AnonymousMethod && !is_equality)) { tmp = Convert.ImplicitConversionRequired (ec, left, r, loc); if (tmp == null) return null; @@ -2640,9 +2637,9 @@ namespace Mono.CSharp { return ResolveUserOperator (ec, l, r); MethodInfo method; - ArrayList args = new ArrayList (2); - args.Add (new Argument (left, Argument.AType.Expression)); - args.Add (new Argument (right, Argument.AType.Expression)); + Arguments args = new Arguments (2); + args.Add (new Argument (left)); + args.Add (new Argument (right)); if (oper == Operator.Addition) { if (TypeManager.delegate_combine_delegate_delegate == null) { @@ -2842,7 +2839,7 @@ namespace Mono.CSharp { return null; } - if (l == TypeManager.anonymous_method_type) + if (l == InternalType.AnonymousMethod) return null; if (TypeManager.IsValueType (l)) @@ -3047,7 +3044,7 @@ namespace Mono.CSharp { return null; } - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); Argument larg = new Argument (left); args.Add (larg); Argument rarg = new Argument (right); @@ -3548,7 +3545,7 @@ namespace Mono.CSharp { throw new InternalErrorException ("Unknown expression tree binary operator " + oper); } - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); args.Add (new Argument (left.CreateExpressionTree (ec))); args.Add (new Argument (right.CreateExpressionTree (ec))); if (method != null) { @@ -3567,7 +3564,7 @@ namespace Mono.CSharp { // b, c, d... may be strings or objects. // public class StringConcat : Expression { - ArrayList arguments; + Arguments arguments; public StringConcat (EmitContext ec, Location loc, Expression left, Expression right) { @@ -3575,15 +3572,15 @@ namespace Mono.CSharp { type = TypeManager.string_type; eclass = ExprClass.Value; - arguments = new ArrayList (2); + arguments = new Arguments (2); Append (ec, left); Append (ec, right); } public override Expression CreateExpressionTree (EmitContext ec) { - Argument arg = (Argument) arguments [0]; - return CreateExpressionAddCall (ec, arg, arg.Expr.CreateExpressionTree (ec), 1); + Argument arg = arguments [0]; + return CreateExpressionAddCall (ec, arg, arg.CreateExpressionTree (ec), 1); } // @@ -3591,14 +3588,14 @@ namespace Mono.CSharp { // Expression CreateExpressionAddCall (EmitContext ec, Argument left, Expression left_etree, int pos) { - ArrayList concat_args = new ArrayList (2); - ArrayList add_args = new ArrayList (3); + Arguments concat_args = new Arguments (2); + Arguments add_args = new Arguments (3); concat_args.Add (left); add_args.Add (new Argument (left_etree)); concat_args.Add (arguments [pos]); - add_args.Add (new Argument (((Argument) arguments [pos]).Expr.CreateExpressionTree (ec))); + add_args.Add (new Argument (arguments [pos].CreateExpressionTree (ec))); MethodGroupExpr method = CreateConcatMemberExpression ().Resolve (ec) as MethodGroupExpr; if (method == null) @@ -3631,7 +3628,7 @@ namespace Mono.CSharp { StringConstant sc = operand as StringConstant; if (sc != null) { if (arguments.Count != 0) { - Argument last_argument = (Argument) arguments [arguments.Count - 1]; + Argument last_argument = arguments [arguments.Count - 1]; StringConstant last_expr_constant = last_argument.Expr as StringConstant; if (last_expr_constant != null) { last_argument.Expr = new StringConstant ( @@ -3668,8 +3665,7 @@ namespace Mono.CSharp { public override void MutateHoistedGenericType (AnonymousMethodStorey storey) { - foreach (Argument a in arguments) - a.Expr.MutateHoistedGenericType (storey); + arguments.MutateHoistedGenericType (storey); } } @@ -3680,7 +3676,7 @@ namespace Mono.CSharp { readonly bool is_and; Expression oper; - public ConditionalLogicalOperator (MethodGroupExpr oper_method, ArrayList arguments, + public ConditionalLogicalOperator (MethodGroupExpr oper_method, Arguments arguments, ExpressionTreeExpression expr_tree, bool is_and, Location loc) : base (oper_method, arguments, expr_tree, loc) { @@ -3722,7 +3718,7 @@ namespace Mono.CSharp { // // Emit and duplicate left argument // - ((Argument)arguments [0]).Expr.Emit (ec); + arguments [0].Expr.Emit (ec); ig.Emit (OpCodes.Dup); arguments.RemoveAt (0); @@ -3903,7 +3899,7 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (3); + Arguments args = new Arguments (3); args.Add (new Argument (expr.CreateExpressionTree (ec))); args.Add (new Argument (true_expr.CreateExpressionTree (ec))); args.Add (new Argument (false_expr.CreateExpressionTree (ec))); @@ -4170,13 +4166,13 @@ namespace Mono.CSharp { public Block Block; public LocalInfo local_info; bool is_readonly; + bool resolved; // TODO: merge with eclass public LocalVariableReference (Block block, string name, Location l) { Block = block; this.name = name; loc = l; - eclass = ExprClass.Variable; } // @@ -4244,8 +4240,8 @@ namespace Mono.CSharp { HoistedVariable hv = GetHoistedVariable (ec); if (hv != null) return hv.CreateExpressionTree (ec); - - ArrayList arg = new ArrayList (1); + + Arguments arg = new Arguments (1); arg.Add (new Argument (this)); return CreateExpressionFactoryCall ("Constant", arg); } @@ -4274,11 +4270,16 @@ namespace Mono.CSharp { } } + resolved |= ec.DoFlowAnalysis; + eclass = ExprClass.Variable; return this; } public override Expression DoResolve (EmitContext ec) { + if (resolved) + return this; + ResolveLocalInfo (); local_info.Used = true; @@ -4291,7 +4292,7 @@ namespace Mono.CSharp { return DoResolveBase (ec); } - override public Expression DoResolveLValue (EmitContext ec, Expression right_side) + public override Expression DoResolveLValue (EmitContext ec, Expression right_side) { ResolveLocalInfo (); @@ -4570,130 +4571,11 @@ namespace Mono.CSharp { } } - /// - /// Used for arguments to New(), Invocation() - /// - public class Argument { - public enum AType : byte { - Expression, - Ref, - Out, - ArgList - }; - - public static readonly Argument[] Empty = new Argument [0]; - - public readonly AType ArgType; - public Expression Expr; - - public Argument (Expression expr, AType type) - { - this.Expr = expr; - this.ArgType = type; - } - - public Argument (Expression expr) - { - this.Expr = expr; - this.ArgType = AType.Expression; - } - - public Type Type { - get { return Expr.Type; } - } - - public Parameter.Modifier Modifier - { - get { - switch (ArgType) { - case AType.Out: - return Parameter.Modifier.OUT; - - case AType.Ref: - return Parameter.Modifier.REF; - - default: - return Parameter.Modifier.NONE; - } - } - } - - public string GetSignatureForError () - { - if (Expr.eclass == ExprClass.MethodGroup) - return Expr.ExprClassName; - - return TypeManager.CSharpName (Expr.Type); - } - - public bool ResolveMethodGroup (EmitContext ec) - { - SimpleName sn = Expr as SimpleName; - if (sn != null) - Expr = sn.GetMethodGroup (); - - // FIXME: csc doesn't report any error if you try to use `ref' or - // `out' in a delegate creation expression. - Expr = Expr.Resolve (ec, ResolveFlags.VariableOrValue | ResolveFlags.MethodGroup); - if (Expr == null) - return false; - - return true; - } - - public bool Resolve (EmitContext ec, Location loc) - { - if (Expr == null) - return false; - - using (ec.With (EmitContext.Flags.DoFlowAnalysis, true)) { - // Verify that the argument is readable - if (ArgType != AType.Out) - Expr = Expr.Resolve (ec); - - // Verify that the argument is writeable - if (Expr != null && (ArgType == AType.Out || ArgType == AType.Ref)) - Expr = Expr.ResolveLValue (ec, EmptyExpression.OutAccess, loc); - - return Expr != null; - } - } - - public void Emit (EmitContext ec) - { - if (ArgType != AType.Ref && ArgType != AType.Out) { - Expr.Emit (ec); - return; - } - - AddressOp mode = AddressOp.Store; - if (ArgType == AType.Ref) - mode |= AddressOp.Load; - - IMemoryLocation ml = (IMemoryLocation) Expr; - ParameterReference pr = ml as ParameterReference; - - // - // ParameterReferences might already be references, so we want - // to pass just the value - // - if (pr != null && pr.IsRef) - pr.EmitLoad (ec); - else - ml.AddressOf (ec, mode); - } - - public Argument Clone (CloneContext clonectx) - { - return new Argument (Expr.Clone (clonectx), ArgType); - } - } - /// /// Invocation of methods or delegates. /// public class Invocation : ExpressionStatement { - protected ArrayList Arguments; + protected Arguments Arguments; protected Expression expr; protected MethodGroupExpr mg; bool arguments_resolved; @@ -4702,7 +4584,7 @@ namespace Mono.CSharp { // arguments is an ArrayList, but we do not want to typecast, // as it might be null. // - public Invocation (Expression expr, ArrayList arguments) + public Invocation (Expression expr, Arguments arguments) { SimpleName sn = expr as SimpleName; if (sn != null) @@ -4715,7 +4597,7 @@ namespace Mono.CSharp { loc = expr.Location; } - public Invocation (Expression expr, ArrayList arguments, bool arguments_resolved) + public Invocation (Expression expr, Arguments arguments, bool arguments_resolved) : this (expr, arguments) { this.arguments_resolved = arguments_resolved; @@ -4723,47 +4605,24 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args; + Arguments args; // // Special conversion for nested expression trees // if (TypeManager.DropGenericTypeArguments (type) == TypeManager.expression_type) { - args = new ArrayList (1); + args = new Arguments (1); args.Add (new Argument (this)); return CreateExpressionFactoryCall ("Quote", args); } - ExtensionMethodGroupExpr emg = mg as ExtensionMethodGroupExpr; - - int arg_count = Arguments == null ? 2 : Arguments.Count + 2; - if (emg != null) - ++arg_count; - args = new ArrayList (arg_count); + Expression instance = mg.IsInstance ? + mg.InstanceExpression.CreateExpressionTree (ec) : + new NullLiteral (loc); - if (mg.IsInstance) - args.Add (new Argument (mg.InstanceExpression.CreateExpressionTree (ec))); - else - args.Add (new Argument (new NullLiteral (loc))); - - args.Add (new Argument (mg.CreateExpressionTree (ec))); - - // - // Use extension argument when exists - // - if (emg != null) { - Expression e = emg.ExtensionExpression.CreateExpressionTree (ec); - if (e != null) - args.Add (new Argument (e)); - } - - if (Arguments != null) { - foreach (Argument a in Arguments) { - Expression e = a.Expr.CreateExpressionTree (ec); - if (e != null) - args.Add (new Argument (e)); - } - } + args = Arguments.CreateForExpressionTree (ec, Arguments, + instance, + mg.CreateExpressionTree (ec)); if (mg.IsBase) MemberExpr.Error_BaseAccessInExpressionTree (loc); @@ -4810,11 +4669,7 @@ namespace Mono.CSharp { // Next, evaluate all the expressions in the argument list // if (Arguments != null && !arguments_resolved) { - for (int i = 0; i < Arguments.Count; ++i) - { - if (!((Argument)Arguments[i]).Resolve(ec, loc)) - return null; - } + Arguments.Resolve (ec); } mg = DoResolveOverload (ec); @@ -4892,58 +4747,11 @@ namespace Mono.CSharp { return true; } - /// - /// Emits a list of resolved Arguments that are in the arguments - /// ArrayList. - /// - /// The MethodBase argument might be null if the - /// emission of the arguments is known not to contain - /// a `params' field (for example in constructors or other routines - /// that keep their arguments in this structure) - /// - /// if `dup_args' is true, a copy of the arguments will be left - /// on the stack. If `dup_args' is true, you can specify `this_arg' - /// which will be duplicated before any other args. Only EmitCall - /// should be using this interface. - /// - public static void EmitArguments (EmitContext ec, ArrayList arguments, bool dup_args, LocalTemporary this_arg) - { - if (arguments == null) - return; - - int top = arguments.Count; - LocalTemporary [] temps = null; - - if (dup_args && top != 0) - temps = new LocalTemporary [top]; - - int argument_index = 0; - Argument a; - for (int i = 0; i < top; i++) { - a = (Argument) arguments [argument_index++]; - a.Emit (ec); - if (dup_args) { - ec.ig.Emit (OpCodes.Dup); - (temps [i] = new LocalTemporary (a.Type)).Store (ec); - } - } - - if (dup_args) { - if (this_arg != null) - this_arg.Emit (ec); - - for (int i = 0; i < top; i ++) { - temps [i].Emit (ec); - temps [i].Release (ec); - } - } - } - - static Type[] GetVarargsTypes (MethodBase mb, ArrayList arguments) + static Type[] GetVarargsTypes (MethodBase mb, Arguments arguments) { AParametersCollection pd = TypeManager.GetParameterData (mb); - Argument a = (Argument) arguments [pd.Count - 1]; + Argument a = arguments [pd.Count - 1]; Arglist list = (Arglist) a.Expr; return list.ArgumentTypes; @@ -4988,7 +4796,7 @@ namespace Mono.CSharp { /// public static void EmitCall (EmitContext ec, bool is_base, Expression instance_expr, - MethodBase method, ArrayList Arguments, Location loc) + MethodBase method, Arguments Arguments, Location loc) { EmitCall (ec, is_base, instance_expr, method, Arguments, loc, false, false); } @@ -5001,7 +4809,7 @@ namespace Mono.CSharp { // only have been evaluated once. public static void EmitCall (EmitContext ec, bool is_base, Expression instance_expr, - MethodBase method, ArrayList Arguments, Location loc, + MethodBase method, Arguments Arguments, Location loc, bool dup_args, bool omit_args) { ILGenerator ig = ec.ig; @@ -5080,8 +4888,8 @@ namespace Mono.CSharp { } } - if (!omit_args) - EmitArguments (ec, Arguments, dup_args, this_arg); + if (!omit_args && Arguments != null) + Arguments.Emit (ec, dup_args, this_arg); OpCode call_op; if (is_static || struct_call || is_base || (this_call && !method.IsVirtual)) { @@ -5133,11 +4941,8 @@ namespace Mono.CSharp { { Invocation target = (Invocation) t; - if (Arguments != null) { - target.Arguments = new ArrayList (Arguments.Count); - foreach (Argument a in Arguments) - target.Arguments.Add (a.Clone (clonectx)); - } + if (Arguments != null) + target.Arguments = Arguments.Clone (clonectx); target.expr = expr.Clone (clonectx); } @@ -5146,8 +4951,7 @@ namespace Mono.CSharp { { mg.MutateHoistedGenericType (storey); if (Arguments != null) { - foreach (Argument a in Arguments) - a.Expr.MutateHoistedGenericType (storey); + Arguments.MutateHoistedGenericType (storey); } } } @@ -5263,7 +5067,7 @@ namespace Mono.CSharp { /// Implements the new expression /// public class New : ExpressionStatement, IMemoryLocation { - ArrayList Arguments; + Arguments Arguments; // // During bootstrap, it contains the RequestedType, @@ -5275,8 +5079,8 @@ namespace Mono.CSharp { MethodGroupExpr method; bool is_type_parameter; - - public New (Expression requested_type, ArrayList arguments, Location l) + + public New (Expression requested_type, Arguments arguments, Location l) { RequestedType = requested_type; Arguments = arguments; @@ -5347,21 +5151,13 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = Arguments == null ? - new ArrayList (1) : new ArrayList (Arguments.Count + 1); - + Arguments args; if (method == null) { + args = new Arguments (1); args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc))); } else { - args.Add (new Argument (method.CreateExpressionTree (ec))); - if (Arguments != null) { - Expression expr; - foreach (Argument a in Arguments) { - expr = a.Expr.CreateExpressionTree (ec); - if (expr != null) - args.Add (new Argument (expr)); - } - } + args = Arguments.CreateForExpressionTree (ec, Arguments, + method.CreateExpressionTree (ec)); } return CreateExpressionFactoryCall ("New", args); @@ -5470,12 +5266,8 @@ namespace Mono.CSharp { Expression ml = MemberLookupFinal (ec, type, type, ".ctor", MemberTypes.Constructor, AllBindingFlags | BindingFlags.DeclaredOnly, loc); - if (Arguments != null){ - foreach (Argument a in Arguments){ - if (!a.Resolve (ec, loc)) - return null; - } - } + if (Arguments != null) + Arguments.Resolve (ec); if (ml == null) return null; @@ -5580,8 +5372,8 @@ namespace Mono.CSharp { if (is_type_parameter) return DoEmitTypeParameter (ec); - if (method != null) - method.EmitArguments (ec, Arguments); + if (Arguments != null) + Arguments.Emit (ec); if (is_value_type) { if (method == null) { @@ -5629,6 +5421,12 @@ namespace Mono.CSharp { ec.ig.Emit (OpCodes.Pop); } + public bool IsDefaultValueType { + get { + return TypeManager.IsValueType (type) && !HasInitializer && Arguments == null; + } + } + public virtual bool HasInitializer { get { return false; @@ -5666,7 +5464,9 @@ namespace Mono.CSharp { if (method == null) { ec.ig.Emit (OpCodes.Initobj, type); } else { - method.EmitArguments (ec, Arguments); + if (Arguments != null) + Arguments.Emit (ec); + ec.ig.Emit (OpCodes.Call, (ConstructorInfo) method); } @@ -5680,10 +5480,7 @@ namespace Mono.CSharp { target.RequestedType = RequestedType.Clone (clonectx); if (Arguments != null){ - target.Arguments = new ArrayList (); - foreach (Argument a in Arguments){ - target.Arguments.Add (a.Clone (clonectx)); - } + target.Arguments = Arguments.Clone (clonectx); } } @@ -5692,8 +5489,7 @@ namespace Mono.CSharp { if (method != null) { method.MutateHoistedGenericType (storey); if (Arguments != null) { - foreach (Argument a in Arguments) - a.Expr.MutateHoistedGenericType (storey); + Arguments.MutateHoistedGenericType (storey); } } @@ -5745,7 +5541,7 @@ namespace Mono.CSharp { arguments = new ArrayList (exprs.Count); foreach (Expression e in exprs) { - arguments.Add (new Argument (e, Argument.AType.Expression)); + arguments.Add (e); num_arguments++; } } @@ -5774,64 +5570,51 @@ namespace Mono.CSharp { { Report.Error (248, loc, "Cannot create an array with a negative size"); } - - bool CheckIndices (EmitContext ec, ArrayList probe, int idx, bool specified_dims) + + bool CheckIndices (EmitContext ec, ArrayList probe, int idx, bool specified_dims, int child_bounds) { if (specified_dims) { - Argument a = (Argument) arguments [idx]; - - if (!a.Resolve (ec, loc)) + Expression a = (Expression) arguments [idx]; + a = a.Resolve (ec); + if (a == null) return false; - Constant c = a.Expr as Constant; + Constant c = a as Constant; if (c != null) { - c = c.ImplicitConversionRequired (ec, TypeManager.int32_type, a.Expr.Location); + c = c.ImplicitConversionRequired (ec, TypeManager.int32_type, a.Location); } if (c == null) { - Report.Error (150, a.Expr.Location, "A constant value is expected"); + Report.Error (150, a.Location, "A constant value is expected"); return false; } int value = (int) c.GetValue (); if (value != probe.Count) { - Error_IncorrectArrayInitializer (loc); + Report.Error (847, loc, "An array initializer of length `{0}' was expected", value); return false; } bounds [idx] = value; } - int child_bounds = -1; only_constant_initializers = true; for (int i = 0; i < probe.Count; ++i) { object o = probe [i]; if (o is ArrayList) { ArrayList sub_probe = o as ArrayList; - int current_bounds = sub_probe.Count; - - if (child_bounds == -1) - child_bounds = current_bounds; - - else if (child_bounds != current_bounds){ - Error_IncorrectArrayInitializer (loc); - return false; - } if (idx + 1 >= dimensions){ Error (623, "Array initializers can only be used in a variable or field initializer. Try using a new expression instead"); return false; } - bool ret = CheckIndices (ec, sub_probe, idx + 1, specified_dims); + bool ret = CheckIndices (ec, sub_probe, idx + 1, specified_dims, child_bounds - 1); if (!ret) return false; + } else if (child_bounds > 1) { + Report.Error (846, ((Expression) o).Location, "A nested array initializer was expected"); } else { - if (child_bounds != -1){ - Error_IncorrectArrayInitializer (loc); - return false; - } - Expression element = ResolveArrayElement (ec, (Expression) o); if (element == null) continue; @@ -5858,18 +5641,18 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args; + Arguments args; if (array_data == null) { - args = new ArrayList (arguments.Count + 1); + args = new Arguments (arguments.Count + 1); args.Add (new Argument (new TypeOf (new TypeExpression (array_element_type, loc), loc))); - foreach (Argument a in arguments) { + foreach (Expression a in arguments) { if (arguments.Count == 1) { - Constant c = a.Expr as Constant; + Constant c = a as Constant; if (c.IsDefaultValue) return CreateExpressionFactoryCall ("NewArrayInit", args); } - args.Add (new Argument (a.Expr.CreateExpressionTree (ec))); + args.Add (new Argument (a.CreateExpressionTree (ec))); } return CreateExpressionFactoryCall ("NewArrayBounds", args); @@ -5880,7 +5663,7 @@ namespace Mono.CSharp { return null; } - args = new ArrayList (array_data == null ? 1 : array_data.Count + 1); + args = new Arguments (array_data == null ? 1 : array_data.Count + 1); args.Add (new Argument (new TypeOf (new TypeExpression (array_element_type, loc), loc))); if (array_data != null) { for (int i = 0; i < array_data.Count; ++i) { @@ -5901,7 +5684,7 @@ namespace Mono.CSharp { for (ArrayList probe = initializers; probe != null;) { if (probe.Count > 0 && probe [0] is ArrayList) { Expression e = new IntConstant (probe.Count, Location.Null); - arguments.Add (new Argument (e, Argument.AType.Expression)); + arguments.Add (e); bounds [i++] = probe.Count; @@ -5909,7 +5692,7 @@ namespace Mono.CSharp { } else { Expression e = new IntConstant (probe.Count, Location.Null); - arguments.Add (new Argument (e, Argument.AType.Expression)); + arguments.Add (e); bounds [i++] = probe.Count; return; @@ -5952,11 +5735,11 @@ namespace Mono.CSharp { bounds = new System.Collections.Specialized.HybridDictionary (); if (arguments != null) - return CheckIndices (ec, initializers, 0, true); + return CheckIndices (ec, initializers, 0, true, dimensions); arguments = new ArrayList (); - if (!CheckIndices (ec, initializers, 0, false)) + if (!CheckIndices (ec, initializers, 0, false, dimensions)) return false; UpdateIndices (); @@ -6023,15 +5806,12 @@ namespace Mono.CSharp { if (!ResolveInitializers (ec)) return null; - if (arguments.Count != dimensions) { - Error_IncorrectArrayInitializer (loc); - } - - foreach (Argument a in arguments){ - if (!a.Resolve (ec, loc)) + for (int i = 0; i < arguments.Count; ++i) { + Expression e = ((Expression) arguments[i]).Resolve (ec); + if (e == null) continue; - a.Expr = ConvertExpressionToArrayIndex (ec, a.Expr); + arguments [i] = ConvertExpressionToArrayIndex (ec, e); } eclass = ExprClass.Value; @@ -6213,8 +5993,8 @@ namespace Mono.CSharp { array_element_type = storey.MutateType (array_element_type); type = storey.MutateType (type); if (arguments != null) { - foreach (Argument a in arguments) - a.Expr.MutateHoistedGenericType (storey); + foreach (Expression e in arguments) + e.MutateHoistedGenericType (storey); } if (array_data != null) { @@ -6346,8 +6126,8 @@ namespace Mono.CSharp { first_emit_temp.Store (ec); } - foreach (Argument a in arguments) - a.Emit (ec); + foreach (Expression e in arguments) + e.Emit (ec); if (arguments.Count == 1) ig.Emit (OpCodes.Newarr, array_element_type); @@ -6383,7 +6163,7 @@ namespace Mono.CSharp { } if (array_data == null) { - Constant c = (Constant)((Argument)arguments [0]).Expr; + Constant c = (Constant) arguments [0]; if (c.IsDefaultValue) { value = Array.CreateInstance (array_element_type, 0); return true; @@ -6421,8 +6201,8 @@ namespace Mono.CSharp { if (arguments != null){ target.arguments = new ArrayList (arguments.Count); - foreach (Argument a in arguments) - target.arguments.Add (a.Clone (clonectx)); + foreach (Expression e in arguments) + target.arguments.Add (e.Clone (clonectx)); } if (initializers != null){ @@ -6468,7 +6248,7 @@ namespace Mono.CSharp { return null; if (array_element_type == null || array_element_type == TypeManager.null_type || - array_element_type == TypeManager.void_type || array_element_type == TypeManager.anonymous_method_type || + array_element_type == TypeManager.void_type || array_element_type == InternalType.AnonymousMethod || arguments.Count != dimensions) { Error_NoBestType (); return null; @@ -6704,7 +6484,7 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (1); + Arguments args = new Arguments (1); args.Add (new Argument (this)); // Use typeless constant for ldarg.0 to save some @@ -6795,7 +6575,7 @@ namespace Mono.CSharp { public override Expression DoResolve (EmitContext ec) { eclass = ExprClass.Variable; - type = typeof (ArglistAccess); + type = TypeManager.runtime_argument_handle_type; if (ec.IsInFieldInitializer || !ec.CurrentBlock.Toplevel.Parameters.HasArglist) { @@ -6821,28 +6601,32 @@ namespace Mono.CSharp { /// /// Represents the `__arglist (....)' construct /// - public class Arglist : Expression + class Arglist : Expression { - Argument[] Arguments; + Arguments Arguments; public Arglist (Location loc) - : this (Argument.Empty, loc) + : this (null, loc) { } - public Arglist (Argument[] args, Location l) + public Arglist (Arguments args, Location l) { Arguments = args; loc = l; } public Type[] ArgumentTypes { - get { - Type[] retval = new Type [Arguments.Length]; - for (int i = 0; i < Arguments.Length; i++) - retval [i] = Arguments [i].Type; - return retval; - } + get { + if (Arguments == null) + return Type.EmptyTypes; + + Type[] retval = new Type [Arguments.Count]; + for (int i = 0; i < retval.Length; i++) + retval [i] = Arguments [i].Expr.Type; + + return retval; + } } public override Expression CreateExpressionTree (EmitContext ec) @@ -6854,35 +6638,31 @@ namespace Mono.CSharp { public override Expression DoResolve (EmitContext ec) { eclass = ExprClass.Variable; - type = typeof (ArglistAccess); - - foreach (Argument arg in Arguments) { - if (!arg.Resolve (ec, loc)) - return null; - } + type = InternalType.Arglist; + if (Arguments != null) + Arguments.Resolve (ec); return this; } public override void Emit (EmitContext ec) { - foreach (Argument arg in Arguments) - arg.Emit (ec); + if (Arguments != null) + Arguments.Emit (ec); } public override void MutateHoistedGenericType (AnonymousMethodStorey storey) { - foreach (Argument arg in Arguments) - arg.Expr.MutateHoistedGenericType (storey); + if (Arguments != null) + Arguments.MutateHoistedGenericType (storey); } protected override void CloneTo (CloneContext clonectx, Expression t) { Arglist target = (Arglist) t; - target.Arguments = new Argument [Arguments.Length]; - for (int i = 0; i < Arguments.Length; i++) - target.Arguments [i] = Arguments [i].Clone (clonectx); + if (Arguments != null) + target.Arguments = Arguments.Clone (clonectx); } } @@ -6901,7 +6681,7 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); args.Add (new Argument (this)); args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc))); return CreateExpressionFactoryCall ("Constant", args); @@ -7062,7 +6842,7 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); args.Add (new Argument (this)); args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc))); return CreateExpressionFactoryCall ("Constant", args); @@ -7353,7 +7133,7 @@ namespace Mono.CSharp { Type expr_type = expr_resolved.Type; if (expr_type.IsPointer || expr_type == TypeManager.void_type || - expr_type == TypeManager.null_type || expr_type == TypeManager.anonymous_method_type) { + expr_type == TypeManager.null_type || expr_type == InternalType.AnonymousMethod) { Unary.Error_OperatorCannotBeApplied (loc, ".", expr_type); return null; } @@ -7635,7 +7415,7 @@ namespace Mono.CSharp { if (Expr == null) return null; - if (Expr is Constant || Expr is MethodGroupExpr || Expr is AnonymousMethodExpression) + if (Expr is Constant || Expr is MethodGroupExpr || Expr is AnonymousMethodExpression || Expr is DefaultValueExpression) return Expr; eclass = Expr.eclass; @@ -7695,7 +7475,7 @@ namespace Mono.CSharp { if (Expr == null) return null; - if (Expr is Constant || Expr is MethodGroupExpr || Expr is AnonymousMethodExpression) + if (Expr is Constant || Expr is MethodGroupExpr || Expr is AnonymousMethodExpression || Expr is DefaultValueExpression) return Expr; eclass = Expr.eclass; @@ -7735,43 +7515,30 @@ namespace Mono.CSharp { /// IndexerAccess, ArrayAccess or a PointerArithmetic. /// public class ElementAccess : Expression { - public ArrayList Arguments; + public Arguments Arguments; public Expression Expr; - - public ElementAccess (Expression e, ArrayList e_list) + + public ElementAccess (Expression e, Arguments args) { Expr = e; loc = e.Location; - - if (e_list == null) - return; - - Arguments = new ArrayList (e_list.Count); - foreach (Expression tmp in e_list) - Arguments.Add (new Argument (tmp, Argument.AType.Expression)); + this.Arguments = args; } bool CommonResolve (EmitContext ec) { Expr = Expr.Resolve (ec); - if (Arguments == null) - return false; - - foreach (Argument a in Arguments){ - if (!a.Resolve (ec, loc)) - return false; - } + if (Arguments != null) + Arguments.Resolve (ec); return Expr != null; } public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (Arguments.Count + 1); - args.Add (new Argument (Expr.CreateExpressionTree (ec))); - foreach (Argument a in Arguments) - args.Add (new Argument (a.Expr.CreateExpressionTree (ec))); + Arguments args = Arguments.CreateForExpressionTree (ec, Arguments, + Expr.CreateExpressionTree (ec)); return CreateExpressionFactoryCall ("ArrayIndex", args); } @@ -7783,7 +7550,10 @@ namespace Mono.CSharp { return null; } - Expression p = new PointerArithmetic (Binary.Operator.Addition, Expr, ((Argument) Arguments [0]).Expr, t, loc).Resolve (ec); + if (Arguments [0] is NamedArgument) + Error_NamedArgument ((NamedArgument) Arguments[0]); + + Expression p = new PointerArithmetic (Binary.Operator.Addition, Expr, Arguments [0].Expr, t, loc).Resolve (ec); if (p == null) return null; return new Indirection (p, loc).Resolve (ec); @@ -7845,6 +7615,11 @@ namespace Mono.CSharp { throw new Exception ("Should never be reached"); } + public static void Error_NamedArgument (NamedArgument na) + { + Report.Error (1742, na.Name.Location, "An element access expression cannot use named argument"); + } + public override string GetSignatureForError () { return Expr.GetSignatureForError (); @@ -7855,9 +7630,8 @@ namespace Mono.CSharp { ElementAccess target = (ElementAccess) t; target.Expr = Expr.Clone (clonectx); - target.Arguments = new ArrayList (Arguments.Count); - foreach (Argument a in Arguments) - target.Arguments.Add (a.Clone (clonectx)); + if (Arguments != null) + target.Arguments = Arguments.Clone (clonectx); } } @@ -7921,6 +7695,9 @@ namespace Mono.CSharp { } foreach (Argument a in ea.Arguments) { + if (a is NamedArgument) + ElementAccess.Error_NamedArgument ((NamedArgument) a); + a.Expr = ConvertExpressionToArrayIndex (ec, a.Expr); } @@ -8081,7 +7858,7 @@ namespace Mono.CSharp { ea.Expr.Emit (ec); for (int i = 0; i < ea.Arguments.Count; ++i) { - ((Argument)ea.Arguments [i]).Emit (ec); + ea.Arguments [i].Emit (ec); } } @@ -8356,7 +8133,7 @@ namespace Mono.CSharp { protected Type indexer_type; protected Type current_type; protected Expression instance_expr; - protected ArrayList arguments; + protected Arguments arguments; public IndexerAccess (ElementAccess ea, Location loc) : this (ea.Expr, false, loc) @@ -8386,11 +8163,9 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (arguments.Count + 2); - args.Add (new Argument (instance_expr.CreateExpressionTree (ec))); - args.Add (new Argument (new TypeOfMethodInfo (get, loc))); - foreach (Argument a in arguments) - args.Add (new Argument (a.Expr.CreateExpressionTree (ec))); + Arguments args = Arguments.CreateForExpressionTree (ec, arguments, + instance_expr.CreateExpressionTree (ec), + new TypeOfMethodInfo (get, loc)); return CreateExpressionFactoryCall ("Call", args); } @@ -8556,7 +8331,9 @@ namespace Mono.CSharp { value = temp; } - arguments.Add (new Argument (value, Argument.AType.Expression)); + if (!prepared) + arguments.Add (new Argument (value)); + Invocation.EmitCall (ec, is_base_indexer, instance_expr, set, arguments, loc, false, prepared); if (temp != null) { @@ -8583,8 +8360,8 @@ namespace Mono.CSharp { set = storey.MutateGenericMethod (set); instance_expr.MutateHoistedGenericType (storey); - foreach (Argument a in arguments) - a.Expr.MutateHoistedGenericType (storey); + if (arguments != null) + arguments.MutateHoistedGenericType (storey); type = storey.MutateType (type); } @@ -8593,11 +8370,9 @@ namespace Mono.CSharp { { IndexerAccess target = (IndexerAccess) t; - if (arguments != null){ - target.arguments = new ArrayList (); - foreach (Argument a in arguments) - target.arguments.Add (a.Clone (clonectx)); - } + if (arguments != null) + target.arguments = arguments.Clone (clonectx); + if (instance_expr != null) target.instance_expr = instance_expr.Clone (clonectx); } @@ -8720,12 +8495,10 @@ namespace Mono.CSharp { /// The base indexer operator /// public class BaseIndexerAccess : IndexerAccess { - public BaseIndexerAccess (ArrayList args, Location loc) + public BaseIndexerAccess (Arguments args, Location loc) : base (null, true, loc) { - arguments = new ArrayList (); - foreach (Expression tmp in args) - arguments.Add (new Argument (tmp, Argument.AType.Expression)); + this.arguments = args; } protected override bool CommonResolve (EmitContext ec) @@ -8735,10 +8508,7 @@ namespace Mono.CSharp { current_type = ec.ContainerType.BaseType; indexer_type = current_type; - foreach (Argument a in arguments){ - if (!a.Resolve (ec, loc)) - return false; - } + arguments.Resolve (ec); return true; } @@ -8881,7 +8651,7 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (3); + Arguments args = new Arguments (3); args.Add (new Argument (source.CreateExpressionTree (ec))); args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc))); args.Add (new Argument (new TypeOfMethodInfo (method, loc))); @@ -9064,7 +8834,7 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); args.Add (new Argument (child.CreateExpressionTree (ec))); args.Add (new Argument (new TypeOf (new TypeExpression (TypeManager.int32_type, loc), loc))); return CreateExpressionFactoryCall ("ConvertChecked", args); @@ -9191,7 +8961,7 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); FieldExpr fe = target as FieldExpr; if (fe != null) args.Add (new Argument (fe.CreateTypeOfExpression ())); @@ -9270,7 +9040,7 @@ namespace Mono.CSharp { // // A collection initializer expression // - public class CollectionElementInitializer : Invocation + class CollectionElementInitializer : Invocation { public class ElementInitializerArgument : Argument { @@ -9297,26 +9067,29 @@ namespace Mono.CSharp { } public CollectionElementInitializer (Expression argument) - : base (null, new ArrayList (1), true) + : base (null, new Arguments (1), true) { - Arguments.Add (argument); + Arguments.Add (new ElementInitializerArgument (argument)); this.loc = argument.Location; } public CollectionElementInitializer (ArrayList arguments, Location loc) - : base (null, arguments, true) + : base (null, new Arguments (arguments.Count), true) { + foreach (Expression e in arguments) + Arguments.Add (new ElementInitializerArgument (e)); + this.loc = loc; } public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); args.Add (new Argument (mg.CreateExpressionTree (ec))); ArrayList expr_initializers = new ArrayList (Arguments.Count); foreach (Argument a in Arguments) - expr_initializers.Add (a.Expr.CreateExpressionTree (ec)); + expr_initializers.Add (a.CreateExpressionTree (ec)); args.Add (new Argument (new ArrayCreation ( CreateExpressionTypeExpression (loc), "[]", expr_initializers, loc))); @@ -9327,9 +9100,7 @@ namespace Mono.CSharp { { CollectionElementInitializer target = (CollectionElementInitializer) t; - target.Arguments = new ArrayList (Arguments.Count); - foreach (Expression e in Arguments) - target.Arguments.Add (e.Clone (clonectx)); + target.Arguments = Arguments.Clone (clonectx); } public override Expression DoResolve (EmitContext ec) @@ -9339,18 +9110,8 @@ namespace Mono.CSharp { // TODO: We could call a constructor which takes element count argument, // for known types like List, Dictionary - - for (int i = 0; i < Arguments.Count; ++i) { - Expression expr = Arguments [i] as Expression; - if (expr == null) - return null; - expr = expr.Resolve (ec); - if (expr == null) - return null; - - Arguments [i] = new ElementInitializerArgument (expr); - } + Arguments.Resolve (ec); base.expr = new AddMemberAccess (ec.CurrentInitializerVariable, loc); @@ -9548,7 +9309,7 @@ namespace Mono.CSharp { CollectionOrObjectInitializers initializers; IMemoryLocation instance; - public NewInitialize (Expression requested_type, ArrayList arguments, CollectionOrObjectInitializers initializers, Location l) + public NewInitialize (Expression requested_type, Arguments arguments, CollectionOrObjectInitializers initializers, Location l) : base (requested_type, arguments, l) { this.initializers = initializers; @@ -9574,7 +9335,7 @@ namespace Mono.CSharp { public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); args.Add (new Argument (base.CreateExpressionTree (ec))); if (!initializers.IsEmpty) args.Add (new Argument (initializers.CreateExpressionTree (ec))); @@ -9715,7 +9476,7 @@ namespace Mono.CSharp { } bool error = false; - ArrayList arguments = new ArrayList (parameters.Count); + Arguments arguments = new Arguments (parameters.Count); TypeExpression [] t_args = new TypeExpression [parameters.Count]; for (int i = 0; i < parameters.Count; ++i) { Expression e = ((AnonymousTypeParameter) parameters [i]).Resolve (ec); @@ -9801,7 +9562,7 @@ namespace Mono.CSharp { type = e.Type; if (type == TypeManager.void_type || type == TypeManager.null_type || - type == TypeManager.anonymous_method_type || type.IsPointer) { + type == InternalType.AnonymousMethod || type.IsPointer) { Error_InvalidInitializer (e.GetSignatureForError ()); return null; } diff --git a/mcs/mcs/generic.cs b/mcs/mcs/generic.cs index 59843cbc0a3..c9224e2f931 100644 --- a/mcs/mcs/generic.cs +++ b/mcs/mcs/generic.cs @@ -1871,7 +1871,7 @@ namespace Mono.CSharp { return LookupTypeContainer (t); } - static Variance GetTypeParameterVariance (Type type) + public static Variance GetTypeParameterVariance (Type type) { TypeParameter tparam = LookupTypeParameter (type); if (tparam != null) @@ -2080,9 +2080,7 @@ namespace Mono.CSharp { /// when resolving an Invocation or a DelegateInvocation and the user /// did not explicitly specify type arguments. /// - public static int InferTypeArguments (EmitContext ec, - ArrayList arguments, - ref MethodBase method) + public static int InferTypeArguments (EmitContext ec, Arguments arguments, ref MethodBase method) { ATypeInference ti = ATypeInference.CreateInstance (arguments); Type[] i_args = ti.InferMethodArguments (ec, method); @@ -2099,13 +2097,12 @@ namespace Mono.CSharp { /// /// Type inference. /// - public static bool InferTypeArguments (AParametersCollection apd, - ref MethodBase method) + public static bool InferTypeArguments (AParametersCollection param, ref MethodBase method) { if (!TypeManager.IsGenericMethod (method)) return true; - ATypeInference ti = ATypeInference.CreateInstance (ArrayList.Adapter (apd.Types)); + ATypeInference ti = ATypeInference.CreateInstance (DelegateCreation.CreateDelegateMethodArguments (param, Location.Null)); Type[] i_args = ti.InferDelegateArguments (method); if (i_args == null) return false; @@ -2117,19 +2114,19 @@ namespace Mono.CSharp { abstract class ATypeInference { - protected readonly ArrayList arguments; + protected readonly Arguments arguments; protected readonly int arg_count; - protected ATypeInference (ArrayList arguments) + protected ATypeInference (Arguments arguments) { this.arguments = arguments; if (arguments != null) arg_count = arguments.Count; } - public static ATypeInference CreateInstance (ArrayList arguments) + public static ATypeInference CreateInstance (Arguments arguments) { - return new TypeInferenceV3 (arguments); + return new TypeInference (arguments); } public virtual int InferenceScore { @@ -2143,16 +2140,16 @@ namespace Mono.CSharp { } // - // Implements C# 3.0 type inference + // Implements C# type inference // - class TypeInferenceV3 : ATypeInference + class TypeInference : ATypeInference { // // Tracks successful rate of type inference // int score = int.MaxValue; - public TypeInferenceV3 (ArrayList arguments) + public TypeInference (Arguments arguments) : base (arguments) { } @@ -2179,7 +2176,7 @@ namespace Mono.CSharp { if (!t.IsGenericParameter) continue; - context.LowerBoundInference ((Type)arguments[i], t); + context.LowerBoundInference (arguments [i].Expr.Type, t); } if (!context.FixAllTypes ()) @@ -2221,7 +2218,9 @@ namespace Mono.CSharp { // Type method_parameter = null; for (int i = 0; i < arg_count; i++) { - Argument a = (Argument) arguments [i]; + Argument a = arguments [i]; + if (a == null) + continue; if (i < params_arguments_start) { method_parameter = methodParameters.Types [i]; @@ -2246,9 +2245,19 @@ namespace Mono.CSharp { continue; } + if (a.IsByRef) { + score -= tic.ExactInference (a.Type, method_parameter); + continue; + } + if (a.Expr.Type == TypeManager.null_type) continue; + if (TypeManager.IsValueType (method_parameter)) { + score -= tic.LowerBoundInference (a.Type, method_parameter); + continue; + } + // // Otherwise an output type inference is made // @@ -2304,7 +2313,7 @@ namespace Mono.CSharp { #endif if (tic.IsReturnTypeNonDependent (mi, rtype)) - score -= tic.OutputTypeInference (ec, ((Argument) arguments [i]).Expr, t_i); + score -= tic.OutputTypeInference (ec, arguments [i].Expr, t_i); } @@ -2314,6 +2323,36 @@ namespace Mono.CSharp { public class TypeInferenceContext { + enum BoundKind + { + Exact = 0, + Lower = 1, + Upper = 2 + } + + class BoundInfo + { + public readonly Type Type; + public readonly BoundKind Kind; + + public BoundInfo (Type type, BoundKind kind) + { + this.Type = type; + this.Kind = kind; + } + + public override int GetHashCode () + { + return Type.GetHashCode (); + } + + public override bool Equals (object obj) + { + BoundInfo a = (BoundInfo) obj; + return Type == a.Type && Kind == a.Kind; + } + } + readonly Type[] unfixed_types; readonly Type[] fixed_types; readonly ArrayList[] bounds; @@ -2344,12 +2383,12 @@ namespace Mono.CSharp { } } - void AddToBounds (Type t, int index) + void AddToBounds (BoundInfo bound, int index) { // // Some types cannot be used as type arguments // - if (t == TypeManager.void_type || t.IsPointer) + if (bound.Type == TypeManager.void_type || bound.Type.IsPointer) return; ArrayList a = bounds [index]; @@ -2357,7 +2396,7 @@ namespace Mono.CSharp { a = new ArrayList (); bounds [index] = a; } else { - if (a.Contains (t)) + if (a.Contains (bound)) return; } @@ -2371,7 +2410,7 @@ namespace Mono.CSharp { // // t = constraints.EffectiveBaseClass; // } //} - a.Add (t); + a.Add (bound); } bool AllTypesAreFixed (Type[] types) @@ -2428,7 +2467,7 @@ namespace Mono.CSharp { if (pos == -1) return 0; - AddToBounds (u, pos); + AddToBounds (new BoundInfo (u, BoundKind.Exact), pos); return 1; } @@ -2531,7 +2570,7 @@ namespace Mono.CSharp { if (candidates.Count == 1) { unfixed_types[i] = null; - fixed_types[i] = (Type)candidates[0]; + fixed_types[i] = ((BoundInfo) candidates[0]).Type; return true; } @@ -2544,24 +2583,38 @@ namespace Mono.CSharp { int cii; int candidates_count = candidates.Count; for (int ci = 0; ci < candidates_count; ++ci) { - Type candidate = (Type)candidates [ci]; + BoundInfo bound = (BoundInfo)candidates [ci]; for (cii = 0; cii < candidates_count; ++cii) { if (cii == ci) continue; - if (!Convert.ImplicitConversionExists (null, - new TypeExpression ((Type)candidates [cii], Location.Null), candidate)) { + Type ctype = ((BoundInfo) candidates[cii]).Type; + + // Same type parameters with different bounds + if (ctype == bound.Type) + continue; + + if (bound.Kind == BoundKind.Exact) break; + + if (bound.Kind == BoundKind.Lower) { + if (!Convert.ImplicitConversionExists (null, new TypeExpression (ctype, Location.Null), bound.Type)) { + break; + } + } else { + if (!Convert.ImplicitConversionExists (null, new TypeExpression (bound.Type, Location.Null), ctype)) { + break; + } } } if (cii != candidates_count) continue; - if (best_candidate != null) + if (best_candidate != null && best_candidate != bound.Type) return false; - best_candidate = candidate; + best_candidate = bound.Type; } if (best_candidate == null) @@ -2650,31 +2703,38 @@ namespace Mono.CSharp { // 26.3.3.9 Lower-bound Inference // public int LowerBoundInference (Type u, Type v) + { + return LowerBoundInference (u, v, false); + } + + // + // Lower-bound (false) or Upper-bound (true) inference based on inversed argument + // + int LowerBoundInference (Type u, Type v, bool inversed) { // If V is one of the unfixed type arguments int pos = IsUnfixed (v); if (pos != -1) { - AddToBounds (u, pos); + AddToBounds (new BoundInfo (u, inversed ? BoundKind.Upper : BoundKind.Lower), pos); return 1; } // If U is an array type if (u.IsArray) { int u_dim = u.GetArrayRank (); - Type v_e; - Type u_e = TypeManager.GetElementType (u); + Type v_i; + Type u_i = TypeManager.GetElementType (u); if (v.IsArray) { if (u_dim != v.GetArrayRank ()) return 0; - v_e = TypeManager.GetElementType (v); + v_i = TypeManager.GetElementType (v); - if (u.IsByRef) { - return LowerBoundInference (u_e, v_e); - } + if (TypeManager.IsValueType (u_i)) + return ExactInference (u_i, v_i); - return ExactInference (u_e, v_e); + return LowerBoundInference (u_i, v_i, inversed); } if (u_dim != 1) @@ -2686,19 +2746,17 @@ namespace Mono.CSharp { (g_v != TypeManager.generic_ienumerable_type)) return 0; - v_e = TypeManager.GetTypeArguments (v)[0]; - - if (u.IsByRef) { - return LowerBoundInference (u_e, v_e); - } + v_i = TypeManager.GetTypeArguments (v) [0]; + if (TypeManager.IsValueType (u_i)) + return ExactInference (u_i, v_i); - return ExactInference (u_e, v_e); + return LowerBoundInference (u_i, v_i); } } else if (v.IsGenericType && !v.IsGenericTypeDefinition) { // - // if V is a constructed type C and there is a unique set of types U1..Uk - // such that a standard implicit conversion exists from U to C then an exact - // inference is made from each Ui for the corresponding Vi + // if V is a constructed type C and there is a unique type C + // such that U is identical to, inherits from (directly or indirectly), + // or implements (directly or indirectly) C // ArrayList u_candidates = new ArrayList (); if (u.IsGenericType) @@ -2724,9 +2782,9 @@ namespace Mono.CSharp { continue; // - // The unique set of types U1..Uk means that if we have an interface C, - // class U: C, C then no type inference is made when inferring - // from U to C because T could be int or long + // The unique set of types U1..Uk means that if we have an interface I, + // class U : I, I then no type inference is made when inferring + // type I by applying type U because T could be int or long // if (unique_candidate_targs != null) { Type[] second_unique_candidate_targs = u_candidate.GetGenericArguments (); @@ -2734,7 +2792,7 @@ namespace Mono.CSharp { unique_candidate_targs = second_unique_candidate_targs; continue; } - + // // This should always cause type inference failure // @@ -2746,10 +2804,23 @@ namespace Mono.CSharp { } if (unique_candidate_targs != null) { + Type[] ga_open_v = open_v.GetGenericArguments (); int score = 0; - for (int i = 0; i < unique_candidate_targs.Length; ++i) - if (ExactInference (unique_candidate_targs [i], ga_v [i]) == 0) - ++score; + for (int i = 0; i < unique_candidate_targs.Length; ++i) { + Variance variance = TypeManager.GetTypeParameterVariance (ga_open_v [i]); + + Type u_i = unique_candidate_targs [i]; + if (variance == Variance.None || TypeManager.IsValueType (u_i)) { + if (ExactInference (u_i, ga_v [i]) == 0) + ++score; + } else { + bool upper_bound = (variance == Variance.Contravariant && !inversed) || + (variance == Variance.Covariant && inversed); + + if (LowerBoundInference (u_i, ga_v [i], upper_bound) == 0) + ++score; + } + } return score; } } @@ -2805,7 +2876,7 @@ namespace Mono.CSharp { return 0; MethodGroupExpr mg = (MethodGroupExpr) e; - ArrayList args = DelegateCreation.CreateDelegateMethodArguments (invoke, e.Location); + Arguments args = DelegateCreation.CreateDelegateMethodArguments (TypeManager.GetParameterData (invoke), e.Location); mg = mg.OverloadResolve (ec, ref args, true, e.Location); if (mg == null) return 0; diff --git a/mcs/mcs/gmcs.csproj b/mcs/mcs/gmcs.csproj index 393d72b4dc7..5a844a86c0a 100644 --- a/mcs/mcs/gmcs.csproj +++ b/mcs/mcs/gmcs.csproj @@ -52,6 +52,7 @@ MonoSymbolWriter.cs + diff --git a/mcs/mcs/gmcs.exe.sources b/mcs/mcs/gmcs.exe.sources index 957bfc22c56..11862a6a532 100644 --- a/mcs/mcs/gmcs.exe.sources +++ b/mcs/mcs/gmcs.exe.sources @@ -1,5 +1,6 @@ AssemblyInfo.cs anonymous.cs +argument.cs assign.cs attribute.cs cs-tokenizer.cs @@ -42,4 +43,4 @@ symbolwriter.cs ../class/Mono.CompilerServices.SymbolWriter/MonoSymbolWriter.cs ../class/corlib/Mono.Security.Cryptography/CryptoConvert.cs ../build/common/Consts.cs -../tools/monop/outline.cs \ No newline at end of file +../tools/monop/outline.cs diff --git a/mcs/mcs/iterators.cs b/mcs/mcs/iterators.cs index d94283841e1..eb624f1a40e 100644 --- a/mcs/mcs/iterators.cs +++ b/mcs/mcs/iterators.cs @@ -249,10 +249,10 @@ namespace Mono.CSharp { } if (init != null) { - new_storey = new NewInitialize (storey_type_expr, new ArrayList (0), + new_storey = new NewInitialize (storey_type_expr, null, new CollectionOrObjectInitializers (init, loc), loc); } else { - new_storey = new New (storey_type_expr, new ArrayList (0), loc); + new_storey = new New (storey_type_expr, null, loc); } new_storey = new_storey.Resolve (ec); @@ -512,7 +512,7 @@ namespace Mono.CSharp { // Just call generic GetEnumerator implementation // get_enumerator.Block.AddStatement ( - new Return (new Invocation (new DynamicMethodGroupExpr (gget_enumerator, Location), new ArrayList (0)), Location)); + new Return (new Invocation (new DynamicMethodGroupExpr (gget_enumerator, Location), null), Location)); AddMethod (get_enumerator); AddMethod (gget_enumerator); @@ -906,7 +906,7 @@ namespace Mono.CSharp { return; } - if ((mod & Parameter.Modifier.ARGLIST) != 0) { + if (p is ArglistParameter) { Report.Error (1636, method.Location, "__arglist is not allowed in parameter list of iterators"); return; diff --git a/mcs/mcs/lambda.cs b/mcs/mcs/lambda.cs index 3b7ddf918db..81108fa7533 100644 --- a/mcs/mcs/lambda.cs +++ b/mcs/mcs/lambda.cs @@ -37,7 +37,7 @@ namespace Mono.CSharp { if (expr == null) return null; - ArrayList arguments = new ArrayList (2); + Arguments arguments = new Arguments (2); arguments.Add (new Argument (expr)); arguments.Add (new Argument (args)); return CreateExpressionFactoryCall ("Lambda", @@ -111,7 +111,7 @@ namespace Mono.CSharp { } eclass = ExprClass.Value; - type = TypeManager.anonymous_method_type; + type = InternalType.AnonymousMethod; return this; } @@ -153,7 +153,7 @@ namespace Mono.CSharp { if (expr == null) return null; - ArrayList arguments = new ArrayList (2); + Arguments arguments = new Arguments (2); arguments.Add (new Argument (expr)); arguments.Add (new Argument (args)); return CreateExpressionFactoryCall ("Lambda", diff --git a/mcs/mcs/linq.cs b/mcs/mcs/linq.cs index 2c83844c64a..5d193d51418 100644 --- a/mcs/mcs/linq.cs +++ b/mcs/mcs/linq.cs @@ -81,7 +81,7 @@ namespace Mono.CSharp.Linq class QueryExpressionInvocation : Invocation, MethodGroupExpr.IErrorHandler { - public QueryExpressionInvocation (QueryExpressionAccess expr, ArrayList arguments) + public QueryExpressionInvocation (QueryExpressionAccess expr, Arguments arguments) : base (expr, arguments) { } @@ -107,7 +107,7 @@ namespace Mono.CSharp.Linq AParametersCollection pd = TypeManager.GetParameterData (method); Type source_type = pd.ExtensionMethodType; if (source_type != null) { - Argument a = (Argument) Arguments [0]; + Argument a = Arguments [0]; if (TypeManager.IsGenericType (source_type) && TypeManager.ContainsGenericParameters (source_type)) { #if GMCS_SOURCE @@ -134,7 +134,7 @@ namespace Mono.CSharp.Linq if (mg.Name == "SelectMany") { Report.Error (1943, loc, "An expression type is incorrect in a subsequent `from' clause in a query expression with source type `{0}'", - ((Argument) Arguments [0]).GetSignatureForError ()); + Arguments [0].GetSignatureForError ()); } else { Report.Error (1942, loc, "An expression type in `{0}' clause is incorrect. Type inference failed in the call to `{1}'", @@ -183,7 +183,7 @@ namespace Mono.CSharp.Linq public virtual Expression BuildQueryClause (EmitContext ec, Expression lSide) { - ArrayList args; + Arguments args; CreateArguments (ec, out args); lSide = CreateQueryExpression (lSide, args); if (next != null) { @@ -199,9 +199,9 @@ namespace Mono.CSharp.Linq return lSide; } - protected virtual void CreateArguments (EmitContext ec, out ArrayList args) + protected virtual void CreateArguments (EmitContext ec, out Arguments args) { - args = new ArrayList (2); + args = new Arguments (2); LambdaExpression selector = new LambdaExpression (loc); selector.Block = block; @@ -210,13 +210,13 @@ namespace Mono.CSharp.Linq args.Add (new Argument (selector)); } - protected Invocation CreateQueryExpression (Expression lSide, ArrayList arguments) + protected Invocation CreateQueryExpression (Expression lSide, Arguments arguments) { return new QueryExpressionInvocation ( new QueryExpressionAccess (lSide, MethodName, loc), arguments); } - protected Invocation CreateQueryExpression (Expression lSide, TypeArguments typeArguments, ArrayList arguments) + protected Invocation CreateQueryExpression (Expression lSide, TypeArguments typeArguments, Arguments arguments) { return new QueryExpressionInvocation ( new QueryExpressionAccess (lSide, MethodName, typeArguments, loc), arguments); @@ -345,7 +345,7 @@ namespace Mono.CSharp.Linq } } - protected override void CreateArguments (EmitContext ec, out ArrayList args) + protected override void CreateArguments (EmitContext ec, out Arguments args) { base.CreateArguments (ec, out args); @@ -386,9 +386,9 @@ namespace Mono.CSharp.Linq this.inner_selector = innerSelector; } - protected override void CreateArguments (EmitContext ec, out ArrayList args) + protected override void CreateArguments (EmitContext ec, out Arguments args) { - args = new ArrayList (4); + args = new Arguments (4); args.Add (new Argument (expr)); @@ -507,7 +507,7 @@ namespace Mono.CSharp.Linq this.lt = lt; } - protected override void CreateArguments (EmitContext ec, out ArrayList args) + protected override void CreateArguments (EmitContext ec, out Arguments args) { base.CreateArguments (ec, out args); diff --git a/mcs/mcs/literal.cs b/mcs/mcs/literal.cs index 1565dda2daf..b23d0004c0e 100644 --- a/mcs/mcs/literal.cs +++ b/mcs/mcs/literal.cs @@ -119,7 +119,7 @@ namespace Mono.CSharp { } // Exlude internal compiler types - if (targetType == TypeManager.anonymous_method_type) + if (targetType == InternalType.AnonymousMethod) return null; if (type != TypeManager.null_type && !Convert.ImplicitStandardConversionExists (this, targetType)) diff --git a/mcs/mcs/mcs.exe.sources b/mcs/mcs/mcs.exe.sources index a12b350ed2c..a3a9a529ba3 100644 --- a/mcs/mcs/mcs.exe.sources +++ b/mcs/mcs/mcs.exe.sources @@ -1,5 +1,6 @@ AssemblyInfo.cs anonymous.cs +argument.cs assign.cs attribute.cs driver.cs @@ -43,4 +44,4 @@ linq.cs ../class/Mono.CompilerServices.SymbolWriter/MonoSymbolWriter.cs ../class/corlib/Mono.Security.Cryptography/CryptoConvert.cs ../build/common/Consts.cs -../tools/monop/outline.cs \ No newline at end of file +../tools/monop/outline.cs diff --git a/mcs/mcs/nullable.cs b/mcs/mcs/nullable.cs index 876ece336f1..6b109500c0a 100644 --- a/mcs/mcs/nullable.cs +++ b/mcs/mcs/nullable.cs @@ -341,7 +341,7 @@ namespace Mono.CSharp.Nullable public override Expression CreateExpressionTree (EmitContext ec) { - ArrayList args = new ArrayList (2); + Arguments args = new Arguments (2); args.Add (new Argument (this)); args.Add (new Argument (new TypeOf (new TypeExpression (type, loc), loc))); @@ -709,15 +709,8 @@ namespace Mono.CSharp.Nullable user_operator.Emit (ec); ig.Emit (Oper == Operator.Equality ? OpCodes.Brfalse_S : OpCodes.Brtrue_S, dissimilar_label); } else { - if (left_unwrap != null && !(left is UserCast)) - left_unwrap.Emit (ec); - else - left.Emit (ec); - - if (right_unwrap != null && !(right is UserCast)) - right_unwrap.Emit (ec); - else - right.Emit (ec); + left.Emit (ec); + right.Emit (ec); ig.Emit (OpCodes.Bne_Un_S, dissimilar_label); } @@ -960,13 +953,13 @@ namespace Mono.CSharp.Nullable if (uc != null) { left = uc.Source; - ArrayList c_args = new ArrayList (2); + Arguments c_args = new Arguments (2); c_args.Add (new Argument (uc.CreateExpressionTree (ec))); c_args.Add (new Argument (left.CreateExpressionTree (ec))); conversion = CreateExpressionFactoryCall ("Lambda", c_args); } - ArrayList args = new ArrayList (3); + Arguments args = new Arguments (3); args.Add (new Argument (left.CreateExpressionTree (ec))); args.Add (new Argument (right.CreateExpressionTree (ec))); if (conversion != null) diff --git a/mcs/mcs/parameter.cs b/mcs/mcs/parameter.cs index d2925fa46f9..bfef2d87ca6 100644 --- a/mcs/mcs/parameter.cs +++ b/mcs/mcs/parameter.cs @@ -190,7 +190,7 @@ namespace Mono.CSharp { public class ArglistParameter : Parameter { // Doesn't have proper type because it's never chosen for better conversion public ArglistParameter (Location loc) : - base (null, String.Empty, Parameter.Modifier.ARGLIST, null, loc) + base (null, String.Empty, Parameter.Modifier.NONE, null, loc) { } @@ -206,7 +206,7 @@ namespace Mono.CSharp { public override Type Resolve (IResolveContext ec) { - return typeof (ArglistParameter); + return InternalType.Arglist; } public override string GetSignatureForError () @@ -217,7 +217,9 @@ namespace Mono.CSharp { public interface IParameterData { + Expression DefaultValue { get; } bool HasExtensionMethodModifier { get; } + bool HasDefaultValue { get; } Parameter.Modifier ModFlags { get; } string Name { get; } } @@ -234,7 +236,6 @@ namespace Mono.CSharp { PARAMS = 4, // This is a flag which says that it's either REF or OUT. ISBYREF = 8, - ARGLIST = 16, REFMASK = 32, OUTMASK = 64, This = 128 @@ -269,12 +270,6 @@ namespace Mono.CSharp { TypeName = type; } - public Parameter (FullNamedExpression type, string name, Modifier mod, Attributes attrs, Expression defaultValue, Location loc) - : this (type, name, mod, attrs, loc) - { - default_expr = defaultValue; - } - public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb, PredefinedAttributes pa) { if (a.Type == pa.In && ModFlags == Modifier.OUT) { @@ -373,25 +368,48 @@ namespace Mono.CSharp { return parameter_type; if (default_expr != null) { - EmitContext ec = new EmitContext (rc, rc.DeclContainer, Location, null, parameter_type, 0); + EmitContext ec = new EmitContext (rc, rc.GenericDeclContainer, Location, null, parameter_type, 0); default_expr = default_expr.Resolve (ec); if (default_expr != null) { Constant value = default_expr as Constant; if (value == null) { - if (default_expr != null) - Report.Error (1736, default_expr.Location, "The expression being assigned to optional parameter `{0}' must be constant", - Name); + if (default_expr != null) { + bool is_valid = false; + if (default_expr is DefaultValueExpression) { + is_valid = true; + } else if (default_expr is New && ((New) default_expr).IsDefaultValueType) { + is_valid = TypeManager.IsEqual (parameter_type, default_expr.Type) || + (TypeManager.IsNullableType (parameter_type) && + Convert.ImplicitNulableConversion (ec, default_expr, parameter_type) != EmptyExpression.Null); + } else { + Report.Error (1736, default_expr.Location, + "The expression being assigned to optional parameter `{0}' must be a constant or default value", + Name); + is_valid = true; + } + + if (!is_valid) { + default_expr = null; + Report.Error (1763, Location, + "Optional parameter `{0}' of type `{1}' can only be initialized with `null'", + Name, GetSignatureForError ()); + } + } } else { Constant c = value.ConvertImplicitly (parameter_type); - if (c == null) - Report.Error (1750, Location, - "Optional parameter value `{0}' cannot be converted to parameter type `{1}'", - value.GetValue (), GetSignatureForError ()); - - // value = c; + if (c == null) { + if (parameter_type == TypeManager.object_type) { + Report.Error (1763, Location, + "Optional parameter `{0}' of type `{1}' can only be initialized with `null'", + Name, GetSignatureForError ()); + } else { + Report.Error (1750, Location, + "Optional parameter value `{0}' cannot be converted to parameter type `{1}'", + value.GetValue (), GetSignatureForError ()); + } + default_expr = null; + } } - - default_expr = value; } } @@ -506,11 +524,17 @@ namespace Mono.CSharp { OptAttributes.Emit (); if (HasDefaultValue) { - Constant c = (Constant) default_expr; - if (default_expr.Type == TypeManager.decimal_type) { - builder.SetCustomAttribute (Const.CreateDecimalConstantAttribute (c)); - } else { - builder.SetConstant (c.GetValue ()); + // + // Emit constant values for true constants only, the other + // constant-like expressions will rely on default value expression + // + Constant c = default_expr as Constant; + if (c != null) { + if (default_expr.Type == TypeManager.decimal_type) { + builder.SetCustomAttribute (Const.CreateDecimalConstantAttribute (c)); + } else { + builder.SetConstant (c.GetValue ()); + } } } } @@ -549,7 +573,7 @@ namespace Mono.CSharp { expr_tree_variable = new LocalVariableReference ( ec.CurrentBlock, variable.Name, Location, variable, false); - ArrayList arguments = new ArrayList (2); + Arguments arguments = new Arguments (2); arguments.Add (new Argument (new TypeOf ( new TypeExpression (parameter_type, Location), Location))); arguments.Add (new Argument (new StringConstant (Name, Location))); @@ -557,6 +581,11 @@ namespace Mono.CSharp { Expression.CreateExpressionFactoryCall ("Parameter", null, arguments, Location)); } + public Expression DefaultValue { + get { return default_expr; } + set { default_expr = value; } + } + public void Emit (EmitContext ec) { int arg_idx = idx; @@ -620,6 +649,13 @@ namespace Mono.CSharp { return parameter_expr_tree_type; } + + public void Warning_UselessOptionalParameter () + { + Report.Warning (1066, 1, Location, + "The default value specified for optional parameter `{0}' will never be used", + Name); + } } // @@ -629,6 +665,7 @@ namespace Mono.CSharp { { readonly string name; readonly Parameter.Modifier modifiers; + readonly Expression default_value; public ParameterData (string name, Parameter.Modifier modifiers) { @@ -636,12 +673,26 @@ namespace Mono.CSharp { this.modifiers = modifiers; } + public ParameterData (string name, Parameter.Modifier modifiers, Expression defaultValue) + : this (name, modifiers) + { + this.default_value = defaultValue; + } + #region IParameterData Members + public Expression DefaultValue { + get { return default_value; } + } + public bool HasExtensionMethodModifier { get { return (modifiers & Parameter.Modifier.This) != 0; } } + public bool HasDefaultValue { + get { return default_value != null; } + } + public Parameter.Modifier ModFlags { get { return modifiers & ~Parameter.Modifier.This; } } @@ -715,6 +766,19 @@ namespace Mono.CSharp { return types; } + // + // Returns the parameter information based on the name + // + public int GetParameterIndexByName (string name) + { + for (int idx = 0; idx < Count; ++idx) { + if (parameters [idx].Name == name) + return idx; + } + + return -1; + } + public string GetSignatureForError () { StringBuilder sb = new StringBuilder ("("); @@ -757,7 +821,7 @@ namespace Mono.CSharp { if (FixedParameters [pos].HasExtensionMethodModifier) return "this " + type; - Parameter.Modifier mod = FixedParameters [pos].ModFlags & ~Parameter.Modifier.ARGLIST; + Parameter.Modifier mod = FixedParameters [pos].ModFlags; if (mod == 0) return type; @@ -815,20 +879,12 @@ namespace Mono.CSharp { has_params = param.HasParams; } - ParametersImported (IParameterData [] parameters, Type [] types, MethodBase method, bool hasParams) + ParametersImported (IParameterData [] parameters, Type [] types, bool hasArglist, bool hasParams) { this.parameters = parameters; this.types = types; - has_arglist = (method.CallingConvention & CallingConventions.VarArgs) != 0; - if (has_arglist) { - this.parameters = new IParameterData [parameters.Length + 1]; - parameters.CopyTo (this.parameters, 0); - this.parameters [parameters.Length] = new ArglistParameter (Location.Null); - this.types = new Type [types.Length + 1]; - types.CopyTo (this.types, 0); - this.types [types.Length] = TypeManager.arg_iterator_type; - } - has_params = hasParams; + this.has_arglist = hasArglist; + this.has_params = hasParams; } public ParametersImported (IParameterData [] param, Type[] types) @@ -868,23 +924,22 @@ namespace Mono.CSharp { // public static AParametersCollection Create (ParameterInfo [] pi, MethodBase method) { - if (pi.Length == 0) { - if (method != null && (method.CallingConvention & CallingConventions.VarArgs) != 0) - return new ParametersImported (new IParameterData [0], Type.EmptyTypes, method, false); + int varargs = method != null && (method.CallingConvention & CallingConventions.VarArgs) != 0 ? 1 : 0; + if (pi.Length == 0 && varargs == 0) return ParametersCompiled.EmptyReadOnlyParameters; - } - Type [] types = new Type [pi.Length]; - IParameterData [] par = new IParameterData [pi.Length]; + Type [] types = new Type [pi.Length + varargs]; + IParameterData [] par = new IParameterData [pi.Length + varargs]; bool is_params = false; PredefinedAttribute extension_attr = PredefinedAttributes.Get.Extension; PredefinedAttribute param_attr = PredefinedAttributes.Get.ParamArray; - for (int i = 0; i < types.Length; i++) { + for (int i = 0; i < pi.Length; i++) { types [i] = TypeManager.TypeToCoreType (pi [i].ParameterType); ParameterInfo p = pi [i]; Parameter.Modifier mod = 0; + Expression default_value = null; if (types [i].IsByRef) { if ((p.Attributes & (ParameterAttributes.Out | ParameterAttributes.In)) == ParameterAttributes.Out) mod = Parameter.Modifier.OUT; @@ -899,23 +954,32 @@ namespace Mono.CSharp { (method.DeclaringType.Attributes & Class.StaticClassAttribute) == Class.StaticClassAttribute && method.IsDefined (extension_attr.Type, false)) { mod = Parameter.Modifier.This; - } else if (i >= pi.Length - 2) { - if (types[i].IsArray) { + } else { + if (i >= pi.Length - 2 && types[i].IsArray) { if (p.IsDefined (param_attr.Type, false)) { mod = Parameter.Modifier.PARAMS; is_params = true; } - } else if (types [i] == TypeManager.runtime_argument_handle_type) { - par [i] = new ArglistParameter (Location.Null); - continue; + } + + if (!is_params && p.IsOptional) { + if (p.DefaultValue == Missing.Value) + default_value = EmptyExpression.Null; + else + default_value = Constant.CreateConstant (types[i], p.DefaultValue, Location.Null); } } - par [i] = new ParameterData (p.Name, mod); + par [i] = new ParameterData (p.Name, mod, default_value); + } + + if (varargs != 0) { + par [par.Length - 1] = new ArglistParameter (Location.Null); + types [types.Length - 1] = InternalType.Arglist; } return method != null ? - new ParametersImported (par, types, method, is_params) : + new ParametersImported (par, types, varargs != 0, is_params) : new ParametersImported (par, types); } } @@ -1039,19 +1103,6 @@ namespace Mono.CSharp { Report.Error (100, p.Location, "The parameter name `{0}' is a duplicate", p.Name); } - /// - /// Returns the parameter information based on the name - /// - public int GetParameterIndexByName (string name) - { - for (int idx = 0; idx < Count; ++idx) { - if (parameters [idx].Name == name) - return idx; - } - - return -1; - } - public bool Resolve (IResolveContext ec) { if (types != null) diff --git a/mcs/mcs/smcs.exe.sources b/mcs/mcs/smcs.exe.sources index ac24210c431..8681ae8f379 100644 --- a/mcs/mcs/smcs.exe.sources +++ b/mcs/mcs/smcs.exe.sources @@ -1,5 +1,6 @@ AssemblyInfo.cs anonymous.cs +argument.cs assign.cs attribute.cs driver.cs diff --git a/mcs/mcs/statement.cs b/mcs/mcs/statement.cs index 5491e925f96..417830431db 100644 --- a/mcs/mcs/statement.cs +++ b/mcs/mcs/statement.cs @@ -3616,7 +3616,9 @@ namespace Mono.CSharp { } if (new_expr == null){ - Report.Error (151, loc, "A value of an integral type or string expected for switch"); + Report.Error (151, loc, + "A switch expression of type `{0}' cannot be converted to an integral type, bool, char, string, enum or nullable type", + TypeManager.CSharpName (Expr.Type)); return false; } @@ -3746,7 +3748,7 @@ namespace Mono.CSharp { ++counter; } - ArrayList args = new ArrayList (1); + Arguments args = new Arguments (1); args.Add (new Argument (new IntConstant (init.Count, loc))); Expression initializer = new NewInitialize (string_dictionary_type, args, new CollectionOrObjectInitializers (init, loc), loc); @@ -3775,7 +3777,7 @@ namespace Mono.CSharp { LocalTemporary string_switch_variable = new LocalTemporary (TypeManager.int32_type); if (TypeManager.generic_ienumerable_type != null) { - ArrayList get_value_args = new ArrayList (2); + Arguments get_value_args = new Arguments (2); get_value_args.Add (new Argument (value)); get_value_args.Add (new Argument (string_switch_variable, Argument.AType.Out)); Expression get_item = new Invocation (new MemberAccess (switch_cache_field, "TryGetValue", loc), get_value_args).Resolve (ec); @@ -3787,8 +3789,8 @@ namespace Mono.CSharp { // get_item.EmitBranchable (ec, default_target, false); } else { - ArrayList get_value_args = new ArrayList (1); - get_value_args.Add (value); + Arguments get_value_args = new Arguments (1); + get_value_args.Add (new Argument (value)); Expression get_item = new IndexerAccess (new ElementAccess (switch_cache_field, get_value_args), loc).Resolve (ec); if (get_item == null) @@ -5018,7 +5020,7 @@ namespace Mono.CSharp { ig.Emit (OpCodes.Brfalse, skip); } - Invocation.EmitCall (ec, false, var, TypeManager.void_dispose_void, new ArrayList (0), loc); + Invocation.EmitCall (ec, false, var, TypeManager.void_dispose_void, null, loc); if (emit_null_check) ig.MarkLabel (skip); @@ -5150,7 +5152,7 @@ namespace Mono.CSharp { copy.Resolve (ec); int rank = length_exprs.Length; - ArrayList list = new ArrayList (rank); + Arguments list = new Arguments (rank); for (int i = 0; i < rank; i++) { counter [i] = new ArrayCounter (loc); counter [i].ResolveIncrement (ec); @@ -5161,12 +5163,12 @@ namespace Mono.CSharp { lengths [i] = new TemporaryVariable (TypeManager.int32_type, loc); lengths [i].Resolve (ec); - ArrayList args = new ArrayList (1); + Arguments args = new Arguments (1); args.Add (new Argument (new IntConstant (i, loc))); length_exprs [i] = new Invocation (new MemberAccess (copy, "GetLength"), args).Resolve (ec); } - list.Add (counter [i]); + list.Add (new Argument (counter [i])); } access = new ElementAccess (copy, list).Resolve (ec); @@ -5193,7 +5195,7 @@ namespace Mono.CSharp { ec.StartFlowBranching (FlowBranching.BranchingType.Loop, loc); ec.CurrentBranching.CreateSibling (); - for_each.variable = for_each.variable.ResolveLValue (ec, conv, loc); + for_each.variable = for_each.variable.ResolveLValue (ec, conv); if (for_each.variable == null) ok = false; @@ -5769,7 +5771,7 @@ namespace Mono.CSharp { ig.MarkLabel (call_dispose); } - Invocation.EmitCall (ec, false, instance, TypeManager.void_dispose_void, new ArrayList (0), loc); + Invocation.EmitCall (ec, false, instance, TypeManager.void_dispose_void, null, loc); } public override void MutateHoistedGenericType (AnonymousMethodStorey storey) diff --git a/mcs/mcs/support.cs b/mcs/mcs/support.cs index b31507195d7..fd14019cc46 100644 --- a/mcs/mcs/support.cs +++ b/mcs/mcs/support.cs @@ -407,6 +407,189 @@ namespace Mono.CSharp { } } + class DynamicType : Type + { + public override Assembly Assembly { + get { throw new NotImplementedException (); } + } + + public override string AssemblyQualifiedName { + get { throw new NotImplementedException (); } + } + + public override Type BaseType { + get { return null; } + } + + public override string FullName { + get { return UnderlyingSystemType.FullName; } + } + + public override Guid GUID { + get { throw new NotImplementedException (); } + } + + protected override TypeAttributes GetAttributeFlagsImpl () + { + return UnderlyingSystemType.Attributes; + } + + protected override ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) + { + throw new NotImplementedException (); + } + + public override ConstructorInfo[] GetConstructors (BindingFlags bindingAttr) + { + throw new NotImplementedException (); + } + + public override Type GetElementType () + { + throw new NotImplementedException (); + } + + public override EventInfo GetEvent (string name, BindingFlags bindingAttr) + { + throw new NotImplementedException (); + } + + public override EventInfo[] GetEvents (BindingFlags bindingAttr) + { + throw new NotImplementedException (); + } + + public override FieldInfo GetField (string name, BindingFlags bindingAttr) + { + throw new NotImplementedException (); + } + + public override FieldInfo[] GetFields (BindingFlags bindingAttr) + { + throw new NotImplementedException (); + } + + public override Type GetInterface (string name, bool ignoreCase) + { + throw new NotImplementedException (); + } + + public override Type[] GetInterfaces () + { + throw new NotImplementedException (); + } + + public override MemberInfo[] GetMembers (BindingFlags bindingAttr) + { + throw new NotImplementedException (); + } + + protected override MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) + { + throw new NotImplementedException (); + } + + public override MethodInfo[] GetMethods (BindingFlags bindingAttr) + { + throw new NotImplementedException (); + } + + public override Type GetNestedType (string name, BindingFlags bindingAttr) + { + throw new NotImplementedException (); + } + + public override Type[] GetNestedTypes (BindingFlags bindingAttr) + { + throw new NotImplementedException (); + } + + public override PropertyInfo[] GetProperties (BindingFlags bindingAttr) + { + throw new NotImplementedException (); + } + + protected override PropertyInfo GetPropertyImpl (string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) + { + throw new NotImplementedException (); + } + + protected override bool HasElementTypeImpl () + { + throw new NotImplementedException (); + } + + public override object InvokeMember (string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters) + { + throw new NotImplementedException (); + } + + protected override bool IsArrayImpl () + { + return false; + } + + protected override bool IsByRefImpl () + { + return false; + } + + protected override bool IsCOMObjectImpl () + { + return false; + } + + protected override bool IsPointerImpl () + { + return false; + } + + protected override bool IsPrimitiveImpl () + { + return false; + } + + public override Module Module { + get { return UnderlyingSystemType.Module; } + } + + public override string Namespace { + get { throw new NotImplementedException (); } + } + + public override Type UnderlyingSystemType { + get { return TypeManager.object_type; } + } + + public override object[] GetCustomAttributes (Type attributeType, bool inherit) + { + return new object [0]; + } + + public override object[] GetCustomAttributes (bool inherit) + { + return new object [0]; + } + + public override bool IsDefined (Type attributeType, bool inherit) + { + throw new NotImplementedException (); + } + + public override string Name { + get { return UnderlyingSystemType.Name; } + } + + public override string ToString () + { + return GetType ().ToString (); + } + + public override RuntimeTypeHandle TypeHandle { + get { return UnderlyingSystemType.TypeHandle; } + } + } + public class UnixUtils { [System.Runtime.InteropServices.DllImport ("libc", EntryPoint="isatty")] extern static int _isatty (int fd); diff --git a/mcs/mcs/typemanager.cs b/mcs/mcs/typemanager.cs index b3bc9e29c2e..31e7f67dcab 100644 --- a/mcs/mcs/typemanager.cs +++ b/mcs/mcs/typemanager.cs @@ -71,7 +71,6 @@ namespace Mono.CSharp { static public Type void_ptr_type; static public Type exception_type; - static public Type anonymous_method_type; static public Type typed_reference_type; static public Type arg_iterator_type; static public Type mbr_type; @@ -500,7 +499,7 @@ namespace Mono.CSharp { if (t == null_type) return "null"; - if (t == typeof (ArglistParameter) || t == typeof (ArglistAccess)) + if (t == typeof (ArglistAccess)) return "__arglist"; if (t == typeof (AnonymousMethodBody)) @@ -965,7 +964,6 @@ namespace Mono.CSharp { // // These are only used for compare purposes // - anonymous_method_type = typeof (AnonymousMethodBody); null_type = typeof (NullLiteral); void_ptr_type = GetPointerType (void_type); @@ -2463,7 +2461,7 @@ namespace Mono.CSharp { return a.FullName == b.FullName; // Some types are never equal - if (a == TypeManager.null_type || a == TypeManager.anonymous_method_type) + if (a == TypeManager.null_type || a == InternalType.AnonymousMethod) return false; return true; @@ -3187,6 +3185,14 @@ namespace Mono.CSharp { } + class InternalType + { + public static readonly Type AnonymousMethod = typeof (AnonymousMethodBody); + public static readonly Type Arglist = typeof (ArglistAccess); + public static readonly Type Dynamic = new DynamicType (); + public static readonly Type MethodGroup = typeof (MethodGroupExpr); + } + /// /// There is exactly one instance of this class per type. /// diff --git a/mcs/nunit20/.cvsignore b/mcs/nunit20/.cvsignore deleted file mode 100644 index 3e409dd9260..00000000000 --- a/mcs/nunit20/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -*.dll -*.pdb - diff --git a/mcs/nunit20/ChangeLog b/mcs/nunit20/ChangeLog deleted file mode 100644 index 8cf4db7bc0f..00000000000 --- a/mcs/nunit20/ChangeLog +++ /dev/null @@ -1,76 +0,0 @@ -2008-10-17 Jonathan Pryor - - * */Documentation/**: Flush updated documentation. - -2008-10-17 Jonathan Pryor - - * Documentation/en/**: Move to appropriate assembly-specific - directories. - -2008-01-23 Raja R Harinath - - * mocks/Makefile (install-symlink, uninstall-symlink): New. In the - net_2_0 profile, just install a symlink to the 1.1 profile library - in the compiler search path. - -2007-01-04 Miguel de Icaza - - * nunit-console/ConsoleUi.cs: Do not use the word "failure" if - there are no failues, simplifies reading the logs. - -2006-08-09 Vladimir Krasnov - - * added NET_2_0 solution files for VS2005 - -2006-06-06 Merav Sudri - * nunit.java.sln - not used build configurations was deleted. - * readme: instructions for using nunit.java was added. - -2006-05-09 Atsushi Enomoto - - * mocks, Makefile : added nunit.mocks.dll due to the request - in bug #78275. Patch by Matt Hargett. - -2006-01-25 Boris Kirzner - * nunit.java.sln: added solution file for TARGET_JVM. - -Wed Apr 20 18:05:41 CEST 2005 Paolo Molaro - - * */AssemblyInfo.cs: fixed path to key file. - -2004-12-27 Ben Maurer - - * Changelog: rename to ChangeLog - * */Makefile.am: build for 2.0 - * */AssemblyInfo.cs: Different version for 2.0 to make the GAC happy. - -2004-10-28 Sebastien Pouliot - - * Updated to NUnit 2.2.0 Final Release. - -2004-05-01 Sebastien Pouliot - - * nunit.key: New. (Truncated) key pair used to sign nunit assemblies. - -2003-10-12 Todd Berman - - * Lots of files changed, upgraded to nunit 2.1.4. I built and ran the - corlib test, so it seems like existing tests should still work under - this new version of nunit. - -2003-02-22 Martin Baulig - - * makefile(s): Added `MCS' and `MCS_FLAGS' variables. - -2003-01-12 Nick Drochak - - * makefile(s): Only build if source changes. Naive implementation. - -2003-01-12 Nick Drochak - - * TestResult.xml: Generated result file. Shouldn't be in CVS. - -2002-12-15 Nick Drochak - - * nunit.build: Don't delete Transform.resources now, we don't generate - it anymore. diff --git a/mcs/nunit20/Makefile b/mcs/nunit20/Makefile deleted file mode 100644 index 1f91334e6ef..00000000000 --- a/mcs/nunit20/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -thisdir = nunit20 -SUBDIRS = framework core util nunit-console mocks -include ../build/rules.make - -DISTFILES = license.rtf nunit-console.sln README - -all-local install-local test-local run-test-local run-test-ondotnet-local clean-local uninstall-local doc-update-local: - -dist-local: dist-default - diff --git a/mcs/nunit20/README b/mcs/nunit20/README deleted file mode 100755 index 1003d97f3a8..00000000000 --- a/mcs/nunit20/README +++ /dev/null @@ -1,32 +0,0 @@ - -The source for NUnit 2 was altered to work with mono. Go to www.nunit.org to get the original source code. - -Using Nunit on J2EE - -To use Nunit on J2EE do the following steps: - -1. Install Grasshopper -2. Open nunit.java.sln -3. Build the project using Debug_Java or Release_Java configurations. -4. To run nunit use the following command line: -"%JAVA_HOME%\bin\java" -cp [classpath] NUnit.Console.ConsoleUi [input files] [options] - -Options: -/fixture=STR Fixture to test -/config=STR Project configuration to load -/xml=STR Name of XML output file -/transform=STR Name of transform file -/xmlConsole Display XML to the console -/output=STR File to receive test output (Short format: /out=STR) -/err=STR File to receive test error output -/labels Label each test in stdOut -/include=STR List of categories to include -/exclude=STR List of categories to exclude -/noshadow Disable shadow copy -/thread Run tests on a separate thread -/wait Wait for input before closing console window -/nologo Do not display the logo -/help Display help (Short format: /?) - - - diff --git a/mcs/nunit20/core/AssemblyInfo.cs b/mcs/nunit20/core/AssemblyInfo.cs deleted file mode 100644 index f87088a88df..00000000000 --- a/mcs/nunit20/core/AssemblyInfo.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; - -#if !TARGET_JVM -[assembly: CLSCompliant(true)] -#endif -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("2.2.0.0")] - - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -#if !StronglyNamedAssembly -[assembly: AssemblyDelaySign(false)] -#else -[assembly: AssemblyKeyFile("../../../nunit.key")] -[assembly: AssemblyKeyName("")] -#endif diff --git a/mcs/nunit20/core/CategoryFilter.cs b/mcs/nunit20/core/CategoryFilter.cs deleted file mode 100644 index 57d55030fa2..00000000000 --- a/mcs/nunit20/core/CategoryFilter.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.Collections; - -namespace NUnit.Core -{ - /// - /// Summary description for CategoryFilter. - /// - /// - [Serializable] - public class CategoryFilter : Filter - { - ArrayList categories; - - public CategoryFilter() : this( false ) { } - - public CategoryFilter( bool exclude ) : base( exclude ) - { - categories = new ArrayList(); - } - - public CategoryFilter( string name ) : this( name, false ) { } - - public CategoryFilter( string name, bool exclude ) : base( exclude ) - { - categories = new ArrayList(); - categories.Add( name ); - } - - public CategoryFilter( string[] names ) : this( names, false ) { } - - public CategoryFilter( string[] names, bool exclude ) : base( exclude ) - { - categories = new ArrayList(); - categories.AddRange( names ); - } - - public void AddCategory(string name) - { - categories.Add( name ); - } - - #region IFilter Members - - public override bool Pass(TestSuite suite) - { -// return CheckCategories( suite ) ? !Exclude : Exclude; - - if ( categories.Count == 0 ) return true; - - bool pass = Exclude; - - if (CheckCategories(suite)) - return !Exclude; - - foreach (Test test in suite.Tests) - { - if ( test.Filter(this) == !Exclude ) - { - pass=true; - break; - } - } - - return pass; - } - - public override bool Pass(TestCase test) - { - if ( categories.Count == 0 ) - return true; - return CheckCategories( test ) ? !Exclude : Exclude ; - -// if (CheckCategories(test.Parent)) -// return true; -// -// return CheckCategories(test); - } - - #endregion - - /// - /// Method returns true if the test has a particular - /// category or if an ancestor test does. We don't - /// worry about whether this is an include or an - /// exclude filter at this point because only positive - /// categories are inherited, not their absence. - /// - private bool CheckCategories(Test test) - { - return test.HasCategory( categories ) - || test.Parent != null - && test.Parent.HasCategory( categories ); - -// if (test.Categories != null) -// { -// foreach (string name in categories) -// { -// if (test.Categories.Contains(name)) -// return true; -// } -// } -// -// return false; - } - } -} diff --git a/mcs/nunit20/core/CategoryManager.cs b/mcs/nunit20/core/CategoryManager.cs deleted file mode 100644 index 40c93de52b3..00000000000 --- a/mcs/nunit20/core/CategoryManager.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections; - -namespace NUnit.Core -{ - public class CategoryManager - { - private static Hashtable categories = new Hashtable(); - - public static void Add(string name) - { - categories[name] = name; - } - - public static void Add(IList list) - { - foreach(string name in list) - { - Add(name); - } - } - - public static ICollection Categories - { - get { return categories.Values; } - } - - public static void Clear() - { - categories = new Hashtable(); - } - } -} diff --git a/mcs/nunit20/core/ChangeLog b/mcs/nunit20/core/ChangeLog deleted file mode 100644 index 2af1411a54a..00000000000 --- a/mcs/nunit20/core/ChangeLog +++ /dev/null @@ -1,34 +0,0 @@ -2008-01-23 Raja R Harinath - - * Makefile (install-symlink, uninstall-symlink): New. In the - net_2_0 profile, just install a symlink to the 1.1 profile library - in the compiler search path. - -2006-08-09 Vladimir Krasnov - - * added NET_2_0 projects files for VS2005 - -2006-01-25 Boris Kirzner - * AssemblyInfo.cs, TestSuiteBuilder.cs : added #ifdef for features - not supported in TARGET_JVM. - * nunit.core.dll.J2EE.vmwcsproj: added project file for TARGET_JVM. - -2005-01-13 Atsushi Enomoto - - * ConsoleWriter.cs : Flush() should call that of input writer. - -2004-11-23 Raja R Harinath - - * Makefile (NO_INSTALL) [PROFILE=net_2_0]: Don't install dll. - -2004-10-28 Sebastien Pouliot - - * Updated to NUnit 2.2.0 Final Release. - -2004-06-21 Raja R Harinath - - * Makefile (LIBRARY_SNK): Sign with nunit.key. - -2004-05-25 Sebastien Pouliot - - * Imported NUnit 2.1.91 (2.2 beta) source code for new assembly. diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/AssemblyTestSuite.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/AssemblyTestSuite.xml deleted file mode 100644 index d0d15567565..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/AssemblyTestSuite.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.TestSuite - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/BufferedStringTextWriter.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/BufferedStringTextWriter.xml deleted file mode 100644 index 18f97016801..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/BufferedStringTextWriter.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.StringTextWriter - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/CategoryFilter.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/CategoryFilter.xml deleted file mode 100644 index 810cffe8c7b..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/CategoryFilter.xml +++ /dev/null @@ -1,164 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.Filter - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/CategoryManager.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/CategoryManager.xml deleted file mode 100644 index 236c7a2f5f1..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/CategoryManager.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.ICollection - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/EmptyFilter.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/EmptyFilter.xml deleted file mode 100644 index 6a75c9ca830..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/EmptyFilter.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.Filter - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.EmptyFilter - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/EventListener.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/EventListener.xml deleted file mode 100644 index 2f2daef5725..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/EventListener.xml +++ /dev/null @@ -1,158 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/ExpectedExceptionTestCase.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/ExpectedExceptionTestCase.xml deleted file mode 100644 index a589e380bfe..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/ExpectedExceptionTestCase.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.TemplateTestCase - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/Filter.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/Filter.xml deleted file mode 100644 index 145f85e13e0..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/Filter.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.Object - - - - NUnit.Core.IFilter - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/IFilter.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/IFilter.xml deleted file mode 100644 index 9fd6ab67b3e..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/IFilter.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/ILoadEvents.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/ILoadEvents.xml deleted file mode 100644 index da1eae4b344..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/ILoadEvents.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/IRunEvents.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/IRunEvents.xml deleted file mode 100644 index bc342eaf48f..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/IRunEvents.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/ITest.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/ITest.xml deleted file mode 100644 index 678c32d45ee..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/ITest.xml +++ /dev/null @@ -1,278 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.IList - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.ArrayList - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/ITestEvents.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/ITestEvents.xml deleted file mode 100644 index 657f49abe72..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/ITestEvents.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - - NUnit.Core.ILoadEvents - - - NUnit.Core.IRunEvents - - - - To be added. - To be added. - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/InvalidSuiteException.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/InvalidSuiteException.xml deleted file mode 100644 index 318825260e7..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/InvalidSuiteException.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.ApplicationException - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/InvalidTestFixtureException.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/InvalidTestFixtureException.xml deleted file mode 100644 index 26685a8f429..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/InvalidTestFixtureException.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.ApplicationException - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/LegacySuite.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/LegacySuite.xml deleted file mode 100644 index f38f1f17235..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/LegacySuite.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.TestSuite - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/LongLivingMarshalByRefObject.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/LongLivingMarshalByRefObject.xml deleted file mode 100644 index c95a0b24d8e..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/LongLivingMarshalByRefObject.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.MarshalByRefObject - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/NameFilter.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/NameFilter.xml deleted file mode 100644 index fd583d89b19..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/NameFilter.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.Filter - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/NamespaceSuite.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/NamespaceSuite.xml deleted file mode 100644 index 20ae2f32320..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/NamespaceSuite.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.TestSuite - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/NoTestFixturesException.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/NoTestFixturesException.xml deleted file mode 100644 index b9b1d3b93b7..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/NoTestFixturesException.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.ApplicationException - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/NormalTestCase.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/NormalTestCase.xml deleted file mode 100644 index 83428ae71ac..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/NormalTestCase.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.TemplateTestCase - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/NotRunnableTestCase.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/NotRunnableTestCase.xml deleted file mode 100644 index ddd2bb6e420..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/NotRunnableTestCase.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.TestCase - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/NullListener.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/NullListener.xml deleted file mode 100644 index 855c9ae6917..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/NullListener.xml +++ /dev/null @@ -1,192 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.Object - - - - NUnit.Core.EventListener - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.EventListener - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/NunitException.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/NunitException.xml deleted file mode 100644 index d51263d00ca..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/NunitException.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.ApplicationException - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/Reflect.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/Reflect.xml deleted file mode 100644 index 7292dcc567a..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/Reflect.xml +++ /dev/null @@ -1,743 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Object - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Collections.IList - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Reflection.ConstructorInfo - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Framework.ExpectedExceptionAttribute - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Reflection.MethodInfo - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Reflection.MethodInfo - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Framework.IgnoreAttribute - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Reflection.MethodInfo - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Reflection.MethodInfo - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Reflection.MethodInfo - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Reflection.PropertyInfo - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Reflection.MethodInfo - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Framework.TestAttribute - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Framework.TestFixtureAttribute - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/RemoteTestRunner.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/RemoteTestRunner.xml deleted file mode 100644 index 1fd5afc68fa..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/RemoteTestRunner.xml +++ /dev/null @@ -1,638 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.LongLivingMarshalByRefObject - - - - NUnit.Core.EventListener - - - NUnit.Core.TestRunner - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.IO.TextWriter - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.ITestEvents - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Version - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Collections.ICollection - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.IO.TextWriter - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestResult - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestResult[] - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult[] - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/ResultVisitor.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/ResultVisitor.xml deleted file mode 100644 index 8e3ec985a3c..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/ResultVisitor.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/RootTestSuite.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/RootTestSuite.xml deleted file mode 100644 index 2c8b4d5bb05..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/RootTestSuite.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.TestSuite - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/StringTextWriter.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/StringTextWriter.xml deleted file mode 100644 index a144d18f397..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/StringTextWriter.xml +++ /dev/null @@ -1,145 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.IO.TextWriter - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Text.Encoding - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.IO.TextWriter - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TemplateTestCase.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TemplateTestCase.xml deleted file mode 100644 index d2daf10f1a3..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TemplateTestCase.xml +++ /dev/null @@ -1,167 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.TestCase - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/Test.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/Test.xml deleted file mode 100644 index f18d4b10dcc..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/Test.xml +++ /dev/null @@ -1,595 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.LongLivingMarshalByRefObject - - - - NUnit.Core.ITest - - - System.IComparable - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.IList - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Object - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestSuite - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.ArrayList - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestAction.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestAction.xml deleted file mode 100644 index 8e813cfccf4..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestAction.xml +++ /dev/null @@ -1,224 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.Enum - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestCase.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestCase.xml deleted file mode 100644 index cd248807d7c..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestCase.xml +++ /dev/null @@ -1,206 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.Test - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.ArrayList - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestCaseBuilder.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestCaseBuilder.xml deleted file mode 100644 index 6257d72e92c..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestCaseBuilder.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestCase - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestCase - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestCase - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestCaseResult.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestCaseResult.xml deleted file mode 100644 index 21041e9cc60..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestCaseResult.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.TestResult - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestEventArgs.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestEventArgs.xml deleted file mode 100644 index 83f6b160442..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestEventArgs.xml +++ /dev/null @@ -1,279 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.EventArgs - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestAction - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Exception - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestResult - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestResult[] - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.Test - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.Test[] - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestEventDispatcher.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestEventDispatcher.xml deleted file mode 100644 index bc0e88641e9..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestEventDispatcher.xml +++ /dev/null @@ -1,581 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.Object - - - - NUnit.Core.ITestEvents - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Core.TestEventHandler - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestEventHandler.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestEventHandler.xml deleted file mode 100644 index d64ddf63005..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestEventHandler.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.Delegate - - - - - - - System.Void - - - To be added. - To be added. - To be added. - To be added. - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestFixture.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestFixture.xml deleted file mode 100644 index 0e055eace7b..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestFixture.xml +++ /dev/null @@ -1,136 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.TestSuite - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestResult.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestResult.xml deleted file mode 100644 index 14f61008011..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestResult.xml +++ /dev/null @@ -1,306 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.ITest - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Double - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestRunner.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestRunner.xml deleted file mode 100644 index 174523c85ca..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestRunner.xml +++ /dev/null @@ -1,410 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Version - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Collections.ICollection - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestResult - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestResult[] - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult[] - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestRunnerThread.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestRunnerThread.xml deleted file mode 100644 index eccb0b3e1b1..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestRunnerThread.xml +++ /dev/null @@ -1,135 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestResult[] - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestSuite.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestSuite.xml deleted file mode 100644 index 24dc699beec..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestSuite.xml +++ /dev/null @@ -1,455 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.Test - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Reflection.MethodInfo - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Reflection.MethodInfo - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.ArrayList - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestSuiteBuilder.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestSuiteBuilder.xml deleted file mode 100644 index e278efbc857..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestSuiteBuilder.xml +++ /dev/null @@ -1,164 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestSuite - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestSuite - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestSuite - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestSuite - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Object - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Version - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Reflection.Assembly - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestSuiteResult.xml b/mcs/nunit20/core/Documentation/en/NUnit.Core/TestSuiteResult.xml deleted file mode 100644 index 8ff926fa318..00000000000 --- a/mcs/nunit20/core/Documentation/en/NUnit.Core/TestSuiteResult.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - - nunit.core - 2.2.0.0 - - - NUnit.Core.TestResult - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.IList - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/core/Documentation/en/index.xml b/mcs/nunit20/core/Documentation/en/index.xml deleted file mode 100644 index 8f42a3e6a36..00000000000 --- a/mcs/nunit20/core/Documentation/en/index.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows=true) - - - System.Reflection.AssemblyKeyName("") - - - System.Reflection.AssemblyTrademark("") - - - System.Reflection.AssemblyCopyright("") - - - System.Reflection.AssemblyProduct("") - - - System.Reflection.AssemblyCompany("") - - - System.Reflection.AssemblyConfiguration("") - - - System.Reflection.AssemblyDescription("") - - - System.Reflection.AssemblyTitle("") - - - System.CLSCompliant(true) - - - - - To be added. - To be added. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - nunit.core - diff --git a/mcs/nunit20/core/Documentation/en/ns-NUnit.Core.xml b/mcs/nunit20/core/Documentation/en/ns-NUnit.Core.xml deleted file mode 100644 index 56f587abbf5..00000000000 --- a/mcs/nunit20/core/Documentation/en/ns-NUnit.Core.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - To be added. - To be added. - - diff --git a/mcs/nunit20/core/EmptyFilter.cs b/mcs/nunit20/core/EmptyFilter.cs deleted file mode 100644 index 186f9f922a6..00000000000 --- a/mcs/nunit20/core/EmptyFilter.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; - -namespace NUnit.Core -{ - /// - /// Summary description for EmptyFilter. - /// - public class EmptyFilter : Filter - { - #region IFilter Members - - public override bool Pass(TestSuite suite) - { - return true; - } - - public override bool Pass(TestCase test) - { - return true; - } - - #endregion - - public static EmptyFilter Empty - { - get { return new EmptyFilter(); } - } - } -} diff --git a/mcs/nunit20/core/EventListener.cs b/mcs/nunit20/core/EventListener.cs deleted file mode 100644 index 1d4c3fa6028..00000000000 --- a/mcs/nunit20/core/EventListener.cs +++ /dev/null @@ -1,89 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - - /// - /// The EventListener interface is used to receive notifications of - /// significant events while a test is being run. - /// - public interface EventListener - { - /// - /// Run is starting - /// - /// Array of tests to be run - void RunStarted( Test[] tests ); - - /// - /// Run finished successfully - /// - /// Array of test results - void RunFinished( TestResult[] results ); - - /// - /// Run was terminated due to an exception - /// - /// Exception that was thrown - void RunFinished( Exception exception ); - - /// - /// A single test case is starting - /// - /// The test case - void TestStarted(TestCase testCase); - - /// - /// A test case finished - /// - /// Result of the test case - void TestFinished(TestCaseResult result); - - /// - /// A suite is starting - /// - /// The suite that is starting - void SuiteStarted(TestSuite suite); - - /// - /// A suite finished - /// - /// Result of the suite - void SuiteFinished(TestSuiteResult result); - - /// - /// An unhandled exception occured while running a test, - /// but the test was not terminated. - /// - /// - void UnhandledException( Exception exception ); - } -} diff --git a/mcs/nunit20/core/ExpectedExceptionTestCase.cs b/mcs/nunit20/core/ExpectedExceptionTestCase.cs deleted file mode 100644 index 338470a98b3..00000000000 --- a/mcs/nunit20/core/ExpectedExceptionTestCase.cs +++ /dev/null @@ -1,103 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Diagnostics; - using System.Reflection; - - /// - /// Summary description for ExpectedExceptionTestCase. - /// - public class ExpectedExceptionTestCase : TemplateTestCase - { - private Type expectedException; - private string expectedMessage; - - public ExpectedExceptionTestCase(Type fixtureType, MethodInfo method) : base(fixtureType, method) - { - Initialize( method ); - } - - public ExpectedExceptionTestCase(object fixture, MethodInfo method) : base(fixture, method) - { - Initialize( method ); - } - - private void Initialize( MethodInfo method ) - { - NUnit.Framework.ExpectedExceptionAttribute attribute = - Reflect.GetExpectedExceptionAttribute( method ); - - if ( attribute == null ) - throw new InvalidTestFixtureException( "ExpectedExceptionAttribute not found" ); - - this.expectedException = attribute.ExceptionType; - this.expectedMessage = attribute.ExpectedMessage; - } - - protected override internal void ProcessException(Exception exception, TestCaseResult testResult) - { -#if TARGET_JVM //sometimes JAVA has a wider exception hierarchy, i.e. ArrayIndexOutOfBoundsException : IndexOutOfBoundsException; we ignore this. - if (expectedException.IsAssignableFrom(exception.GetType())) -#else - if (expectedException.Equals(exception.GetType())) -#endif - { - if (expectedMessage != null && !expectedMessage.Equals(exception.Message)) - { - string message = string.Format("Expected exception to have message: \"{0}\" but received message \"{1}\"", - expectedMessage, exception.Message); - testResult.Failure(message, exception.StackTrace); - } - else - { - testResult.Success(); - } - } - else if (exception is Framework.AssertionException) - { - RecordException(exception,testResult); - } - else - { - string message = "Expected: " + expectedException.Name + " but was " + exception.GetType().Name; - testResult.Failure(message, exception.StackTrace); - } - - return; - } - - protected override internal void ProcessNoException(TestCaseResult testResult) - { - testResult.Failure(expectedException.Name + " was expected", null); - } - } -} diff --git a/mcs/nunit20/core/Filter.cs b/mcs/nunit20/core/Filter.cs deleted file mode 100644 index 047bbf31936..00000000000 --- a/mcs/nunit20/core/Filter.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections; - -namespace NUnit.Core -{ - /// - /// Summary description for Filter. - /// - public interface IFilter - { - bool Pass(TestSuite suite); - - bool Pass(TestCase test); - } - - [Serializable] - public abstract class Filter : IFilter - { - private bool exclude; - - public Filter() : this( false ) { } - - public Filter( bool exclude ) - { - this.exclude = exclude; - } - - public bool Exclude - { - get { return exclude; } - set { exclude = value; } - } - - public void Negate() - { - exclude = !exclude; - } - - #region IFilter Members - - public abstract bool Pass(TestSuite suite); - - public abstract bool Pass(TestCase test); - - #endregion - } -} diff --git a/mcs/nunit20/core/ITest.cs b/mcs/nunit20/core/ITest.cs deleted file mode 100644 index c31608bb8be..00000000000 --- a/mcs/nunit20/core/ITest.cs +++ /dev/null @@ -1,126 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Collections; - - /// - /// Common interface supported by all representations - /// of a test. Only includes informational fields. - /// The Run method is specifically excluded to allow - /// for data-only representations of a test. - /// - public interface ITest - { - /// - /// Name of the test - /// - string Name { get; } - - /// - /// Full Name of the test - /// - string FullName { get; } - - /// - /// Last part of the full name - /// - string ShortName { get; } - - /// - /// Int used to distinguish suites of the same - /// name across multiple assemblies. - /// - int AssemblyKey { get; set; } - - /// - /// Key used to look up a test in a hash table - /// - string UniqueName { get; } - - /// - /// Whether or not the test should be run - /// - bool ShouldRun { get; set; } - - /// - /// Reason for not running the test, if applicable - /// - string IgnoreReason { get; set; } - - /// - /// Count of the test cases ( 1 if this is a test case ) - /// - int CountTestCases(); - - /// - /// For a test suite, the child tests or suites - /// Null if this is not a test suite - /// - ArrayList Tests { get; } - - /// - /// Categories available for this test - /// - IList Categories { get; } - - bool HasCategory( string name ); - - bool HasCategory( IList names ); - - /// - /// True if this is a suite - /// - bool IsSuite { get; } - - /// - /// True if this is a TestFixture - /// - bool IsFixture { get; } - - /// - /// True if this is a TestCase - /// - bool IsTestCase { get; } - - /// - /// Return the description field. - /// - string Description { get; set; } - - /// - /// True if this should only be run explicitly - that is - /// if it was marked with the ExplicitAttribute. - /// - bool IsExplicit { get; set; } - } -} - diff --git a/mcs/nunit20/core/ITestEvents.cs b/mcs/nunit20/core/ITestEvents.cs deleted file mode 100644 index 66cba458a49..00000000000 --- a/mcs/nunit20/core/ITestEvents.cs +++ /dev/null @@ -1,82 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Core -{ - /// - /// Defines events related to the loading of tests. - /// - public interface ILoadEvents - { - event TestEventHandler TestLoading; - event TestEventHandler TestLoaded; - event TestEventHandler TestLoadFailed; - - event TestEventHandler TestReloading; - event TestEventHandler TestReloaded; - event TestEventHandler TestReloadFailed; - - event TestEventHandler TestUnloading; - event TestEventHandler TestUnloaded; - event TestEventHandler TestUnloadFailed; - } - - /// - /// Defines events related to the running of tests. - /// - public interface IRunEvents - { - // Events related to a running a set of tests - event TestEventHandler RunStarting; - event TestEventHandler RunFinished; - - // Events that arise while a test is running - // These are translated from calls to the runner on the - // EventListener interface. - event TestEventHandler SuiteStarting; - event TestEventHandler SuiteFinished; - event TestEventHandler TestStarting; - event TestEventHandler TestFinished; - - /// - /// An unhandled exception was thrown during a test run, - /// and it cannot be associated with a particular test failure. - /// - event TestEventHandler TestException; - } - - /// - /// The combined interface, typically implemented by test runners. - /// - public interface ITestEvents : ILoadEvents, IRunEvents - { - } -} diff --git a/mcs/nunit20/core/InvalidFixture.cs b/mcs/nunit20/core/InvalidFixture.cs deleted file mode 100644 index 7ed6fadcd73..00000000000 --- a/mcs/nunit20/core/InvalidFixture.cs +++ /dev/null @@ -1,58 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Core -{ - /// - /// Summary description for InvalidFixture. - /// - public class InvalidFixture - { - private Type fixtureType; - private string message; - - public InvalidFixture(Type original, string why) - { - fixtureType = original; - message = why; - } - - public Type OriginalType - { - get { return fixtureType; } - } - - public string Message - { - get { return message; } - } - } -} diff --git a/mcs/nunit20/core/InvalidSuiteException.cs b/mcs/nunit20/core/InvalidSuiteException.cs deleted file mode 100644 index 0faaf1ccf2c..00000000000 --- a/mcs/nunit20/core/InvalidSuiteException.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Runtime.Serialization; - - [Serializable] - public class InvalidSuiteException : ApplicationException - { - public InvalidSuiteException () : base() - {} - - /// - /// Standard constructor - /// - /// The error message that explains - /// the reason for the exception - public InvalidSuiteException(string message) : base (message) - {} - - /// - /// Standard constructor - /// - /// The error message that explains - /// the reason for the exception - /// The exception that caused the - /// current exception - public InvalidSuiteException(string message, Exception inner) : - base(message, inner) - {} - - /// - /// Serialization Constructor - /// - protected InvalidSuiteException(SerializationInfo info, - StreamingContext context) : base(info,context){} - - } -} \ No newline at end of file diff --git a/mcs/nunit20/core/InvalidTestFixtureException.cs b/mcs/nunit20/core/InvalidTestFixtureException.cs deleted file mode 100644 index 613d5f444a3..00000000000 --- a/mcs/nunit20/core/InvalidTestFixtureException.cs +++ /dev/null @@ -1,57 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Runtime.Serialization; - - /// - /// Summary description for NoTestMethodsException. - /// - /// - [Serializable] - public class InvalidTestFixtureException : ApplicationException - { - public InvalidTestFixtureException() : base() {} - - public InvalidTestFixtureException(string message) : base(message) - {} - - public InvalidTestFixtureException(string message, Exception inner) : base(message, inner) - {} - - /// - /// Serialization Constructor - /// - protected InvalidTestFixtureException(SerializationInfo info, - StreamingContext context) : base(info,context){} - - } -} \ No newline at end of file diff --git a/mcs/nunit20/core/LegacySuite.cs b/mcs/nunit20/core/LegacySuite.cs deleted file mode 100644 index 3d3ff18f972..00000000000 --- a/mcs/nunit20/core/LegacySuite.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Reflection; - -namespace NUnit.Core -{ - /// - /// Represents a test suite constructed from a type that has a static Suite property - /// - public class LegacySuite : TestSuite - { - private PropertyInfo suiteProperty; - - #region Constructors - - public LegacySuite( Type fixtureType ) : base( fixtureType, 0 ) - { - Initialize(); - } - - public LegacySuite( Type fixtureType, int assemblyKey ) : base( fixtureType, assemblyKey ) - { - Initialize(); - } - - public LegacySuite( object fixture ) : base( fixture, 0 ) - { - Initialize(); - } - - public LegacySuite( object fixture, int assemblyKey ) : base( fixture, assemblyKey ) - { - Initialize(); - } - - private void Initialize() - { - suiteProperty = Reflect.GetSuiteProperty( this.fixtureType ); - - MethodInfo method = suiteProperty.GetGetMethod(true); - if(method.ReturnType!=typeof(NUnit.Core.TestSuite) || method.GetParameters().Length>0) - { - this.ShouldRun = false; - this.IgnoreReason = "Invalid suite property method signature"; - } - else - { - TestSuite suite = (TestSuite)suiteProperty.GetValue(null, new Object[0]); - foreach( Test test in suite.Tests ) - this.Add( test ); - } - } - - #endregion - - #region Static methods - - public static bool IsValidType( Type type ) - { - return Reflect.GetSuiteProperty( type ) != null; - } - - #endregion - } -} diff --git a/mcs/nunit20/core/LongLivingMarshalByRefObject.cs b/mcs/nunit20/core/LongLivingMarshalByRefObject.cs deleted file mode 100644 index ed570308c27..00000000000 --- a/mcs/nunit20/core/LongLivingMarshalByRefObject.cs +++ /dev/null @@ -1,58 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Core -{ - /// - /// All objects which are marshalled by reference - /// and whose lifetime is manually controlled by - /// the app, should derive from this class rather - /// than MarshalByRefObject. - /// - /// This includes the remote test domain objects - /// which are accessed by the client and those - /// client objects which are called back by the - /// remote test domain. - /// - /// Objects in this category that already inherit - /// from some other class (e.g. from TextWriter) - /// which in turn inherits from MarshalByRef object - /// should override InitializeLifetimeService to - /// return null to obtain the same effect. - /// - public class LongLivingMarshalByRefObject : MarshalByRefObject - { - public override Object InitializeLifetimeService() - { - return null; - } - } -} diff --git a/mcs/nunit20/core/Makefile b/mcs/nunit20/core/Makefile deleted file mode 100644 index 2273728bd4e..00000000000 --- a/mcs/nunit20/core/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -thisdir = nunit20/core -SUBDIRS = -include ../../build/rules.make - -LIBRARY = nunit.core.dll -LIBRARY_SNK = $(topdir)/nunit.key - -LOCAL_MCS_FLAGS= -debug -r:nunit.framework.dll -r:System.dll /d:StronglyNamedAssembly -NO_TEST = yo - -ifeq (net_2_0, $(PROFILE)) -NO_INSTALL = yes -install-local: install-symlink -uninstall-local: uninstall-symlink -endif - -EXTRA_DISTFILES = nunit.core.dll.csproj - -include ../../build/library.make - -symlinkdir = $(mono_libdir)/mono/$(FRAMEWORK_VERSION) -install-symlink: - $(MKINSTALLDIRS) $(DESTDIR)$(symlinkdir) - cd $(DESTDIR)$(symlinkdir) && rm -f $(LIBRARY_NAME) && ln -s ../1.0/$(LIBRARY_NAME) $(LIBRARY_NAME) - -uninstall-symlink: - rm -f $(DESTDIR)$(symlinkdir)/$(LIBRARY_NAME) diff --git a/mcs/nunit20/core/NameFilter.cs b/mcs/nunit20/core/NameFilter.cs deleted file mode 100644 index 76908a20055..00000000000 --- a/mcs/nunit20/core/NameFilter.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections; - -namespace NUnit.Core -{ - /// - /// Summary description for NameFilter. - /// - /// - [Serializable] - public class NameFilter : Filter - { - private ArrayList testNodes; - - public NameFilter(Test node) - { - testNodes = new ArrayList(); - testNodes.Add(node); - } - - public NameFilter(ArrayList nodes) - { - testNodes = nodes; - } - - public override bool Pass(TestSuite suite) - { - bool passed = Exclude; - - foreach (Test node in testNodes) - { - if (suite.IsDescendant(node) || node.IsDescendant(suite) || node == suite) - { - passed = !Exclude; - break; - } - } - - return passed; - } - - public override bool Pass(TestCase test) - { - bool passed = Exclude; - - foreach(Test node in testNodes) - { - if (test.IsDescendant(node) || test == node) - { - passed = !Exclude; - break; - } - } - - return passed; - } - } -} diff --git a/mcs/nunit20/core/NamespaceSuite.cs b/mcs/nunit20/core/NamespaceSuite.cs deleted file mode 100644 index c72550ddb84..00000000000 --- a/mcs/nunit20/core/NamespaceSuite.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace NUnit.Core -{ - /// - /// TestSuite containing all the test classes in a namespace - /// - /// TODO: Add a fixture for holding setup and teardown - /// - public class NamespaceSuite : TestSuite - { - public NamespaceSuite( string name ) : base( name, 0 ) { } - - public NamespaceSuite( string name, int assemblyKey ) - : base( name, assemblyKey ) { } - - public NamespaceSuite( string parentSuiteName, string name ) - : base( parentSuiteName, name, 0 ) { } - - public NamespaceSuite( string parentSuiteName, string name, int assemblyKey ) - : base( parentSuiteName, name, assemblyKey ) { } - } -} diff --git a/mcs/nunit20/core/NoTestFixturesException.cs b/mcs/nunit20/core/NoTestFixturesException.cs deleted file mode 100644 index 2b0c36b4a83..00000000000 --- a/mcs/nunit20/core/NoTestFixturesException.cs +++ /dev/null @@ -1,51 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Runtime.Serialization; - - /// - /// Summary description for NoTestFixtureException. - /// - [Serializable] - public class NoTestFixturesException : ApplicationException - { - public NoTestFixturesException() : base () {} - - public NoTestFixturesException(string message) : base(message) - {} - - public NoTestFixturesException(string message, Exception inner) : base(message, inner) {} - - protected NoTestFixturesException(SerializationInfo info, StreamingContext context) : base(info, context) - {} - } -} diff --git a/mcs/nunit20/core/NormalTestCase.cs b/mcs/nunit20/core/NormalTestCase.cs deleted file mode 100644 index 3f1fea77078..00000000000 --- a/mcs/nunit20/core/NormalTestCase.cs +++ /dev/null @@ -1,57 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Reflection; - - /// - /// Summary description for TestCase. - /// - public class NormalTestCase : TemplateTestCase - { - public NormalTestCase(Type fixtureType, MethodInfo method) : base(fixtureType, method) - {} - - public NormalTestCase(object fixture, MethodInfo method) : base(fixture, method) - {} - - protected internal override void ProcessNoException(TestCaseResult testResult) - { - testResult.Success(); - } - - protected internal override void ProcessException(Exception exception, TestCaseResult testResult) - { - RecordException( exception, testResult ); - } - } -} - diff --git a/mcs/nunit20/core/NotRunnableTestCase.cs b/mcs/nunit20/core/NotRunnableTestCase.cs deleted file mode 100644 index 55fe41bf035..00000000000 --- a/mcs/nunit20/core/NotRunnableTestCase.cs +++ /dev/null @@ -1,74 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using System.Diagnostics; - -namespace NUnit.Core -{ - /// - /// Summary description for NotRunnableTestCase. - /// - public class NotRunnableTestCase : TestCase - { - public NotRunnableTestCase(MethodInfo method, string reason) : base(method.DeclaringType.FullName, method.Name) - { - ShouldRun = false; - IgnoreReason = reason; - } - - public NotRunnableTestCase(MethodInfo method) : base(method.DeclaringType.FullName, method.Name) - { - string reason; - - if (method.IsAbstract) - reason = "it must not be abstract"; - else if (method.IsStatic) - reason = "it must be an instance method"; - else if (!method.IsPublic) - reason = "it must be a public method"; - else if (method.GetParameters().Length != 0) - reason = "it must not have parameters"; - else if (!method.ReturnType.Equals(typeof(void))) - reason = "it must return void"; - else - reason = "reason not known"; - - ShouldRun = false; - IgnoreReason = String.Format("Method {0}'s signature is not correct: {1}.", method.Name, reason); - } - - public override void Run(TestCaseResult result) - { - result.NotRun(base.IgnoreReason); - } - } -} - diff --git a/mcs/nunit20/core/NullListener.cs b/mcs/nunit20/core/NullListener.cs deleted file mode 100644 index 129a8291f29..00000000000 --- a/mcs/nunit20/core/NullListener.cs +++ /dev/null @@ -1,62 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Core -{ - /// - /// Summary description for NullListener. - /// - /// - [Serializable] - public class NullListener : EventListener - { - public void RunStarted( Test[] tests ){ } - - public void RunFinished( TestResult[] results ) { } - - public void RunFinished( Exception exception ) { } - - public void TestStarted(TestCase testCase){} - - public void TestFinished(TestCaseResult result){} - - public void SuiteStarted(TestSuite suite){} - - public void SuiteFinished(TestSuiteResult result){} - - public void UnhandledException( Exception exception ) {} - - public static EventListener NULL - { - get { return new NullListener();} - } - } -} diff --git a/mcs/nunit20/core/NunitException.cs b/mcs/nunit20/core/NunitException.cs deleted file mode 100644 index 359461eedee..00000000000 --- a/mcs/nunit20/core/NunitException.cs +++ /dev/null @@ -1,73 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Runtime.Serialization; - - /// - /// Thrown when an assertion failed. Here to preserve the inner - /// exception and hence its stack trace. - /// - /// - [Serializable] - public class NunitException : ApplicationException - { - public NunitException () : base() - {} - - /// - /// Standard constructor - /// - /// The error message that explains - /// the reason for the exception - public NunitException(string message) : base (message) - {} - - /// - /// Standard constructor - /// - /// The error message that explains - /// the reason for the exception - /// The exception that caused the - /// current exception - public NunitException(string message, Exception inner) : - base(message, inner) - {} - - /// - /// Serialization Constructor - /// - protected NunitException(SerializationInfo info, - StreamingContext context) : base(info,context){} - - - } -} diff --git a/mcs/nunit20/core/Reflect.cs b/mcs/nunit20/core/Reflect.cs deleted file mode 100644 index 98cdfe3e380..00000000000 --- a/mcs/nunit20/core/Reflect.cs +++ /dev/null @@ -1,409 +0,0 @@ -using System; -using System.Reflection; -using System.Collections; -using NUnit.Framework; - -namespace NUnit.Core -{ - /// - /// Helper methods for inspecting a type by reflection. - /// - /// Many of these methods take a MemberInfo as an argument to avoid - /// duplication, even though certain attributes can only appear on - /// specific types of members, like MethodInfo or Type. - /// - /// Generally, these methods perform simple utility functions like - /// checking for a given attribute. However, some of the methdods - /// actually implement policies, which might change at some later - /// time. The intent is that policies that may vary among different - /// types of test cases or suites should be handled by those types, - /// while common decisions are handled here. - /// - public class Reflect - { - #region Attribute types used by reflect - - public static readonly Type TestFixtureType = typeof( TestFixtureAttribute ); - public static readonly Type TestType = typeof( TestAttribute ); - public static readonly Type SetUpType = typeof( SetUpAttribute ); - public static readonly Type TearDownType = typeof( TearDownAttribute ); - public static readonly Type FixtureSetUpType = typeof( TestFixtureSetUpAttribute ); - public static readonly Type FixtureTearDownType = typeof( TestFixtureTearDownAttribute ); - public static readonly Type ExplicitType = typeof( ExplicitAttribute ); - public static readonly Type CategoryType = typeof( CategoryAttribute ); - public static readonly Type IgnoreType = typeof( IgnoreAttribute ); - public static readonly Type ExpectedExceptionType = typeof( ExpectedExceptionAttribute ); - public static readonly Type SuiteType = typeof( SuiteAttribute ); - - #endregion - - #region Binding flags used by reflect - - private static readonly BindingFlags InstanceMethods = - BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; - - private static readonly BindingFlags StaticMethods = - BindingFlags.Static | BindingFlags.Public | BindingFlags.DeclaredOnly; - - private static readonly BindingFlags AllMethods = - BindingFlags.Public | BindingFlags.NonPublic | - BindingFlags.Instance | BindingFlags.Static; - - private static readonly BindingFlags AllDeclaredMethods = - AllMethods | BindingFlags.DeclaredOnly; - - #endregion - - #region Check for presence of an attribute - - public static bool HasTestFixtureAttribute(Type type) - { - return type.IsDefined( TestFixtureType, true ); // Inheritable - } - - public static bool HasTestAttribute(MethodInfo method) - { - return method.IsDefined( TestType, false ); - } - - public static bool HasExplicitAttribute(MemberInfo member) - { - return member.IsDefined( ExplicitType, false ); - } - - public static bool HasCategoryAttribute(MemberInfo member) - { - return member.IsDefined( CategoryType, false ); - } - - public static bool HasExpectedExceptionAttribute(MethodInfo method) - { - return method.IsDefined( ExpectedExceptionType, false ); - } - - public static bool HasIgnoreAttribute( MemberInfo member ) - { - return member.IsDefined( IgnoreType, false ); - } - - public static bool HasSuiteAttribute( PropertyInfo property ) - { - return property.IsDefined( SuiteType, false ); - } - - #endregion - - #region Legacy Checks on Names - - public static bool IsObsoleteTestMethod(MethodInfo methodToCheck) - { - if ( methodToCheck.Name.ToLower().StartsWith("test") ) - { - object[] attributes = methodToCheck.GetCustomAttributes( false ); - - foreach( Attribute attribute in attributes ) - if( attribute is SetUpAttribute || - attribute is TestFixtureSetUpAttribute || - attribute is TearDownAttribute || - attribute is TestFixtureTearDownAttribute ) - { - return false; - } - - return true; - } - - return false; - } - - #endregion - - #region Get Attributes - - public static TestFixtureAttribute GetTestFixtureAttribute( Type type ) - { - object[] attributes = type.GetCustomAttributes( TestFixtureType, true ); - return attributes.Length > 0 ? (TestFixtureAttribute) attributes[0] : null; - } - - public static TestAttribute GetTestAttribute( MemberInfo member ) - { - object[] attributes = member.GetCustomAttributes( TestType, false ); - return attributes.Length > 0 ? (TestAttribute)attributes[0] : null; - } - - public static IgnoreAttribute GetIgnoreAttribute( MemberInfo member ) - { - object[] attributes = member.GetCustomAttributes( IgnoreType, false ); - return attributes.Length > 0 ? (IgnoreAttribute) attributes[0] : null; - } - - public static ExpectedExceptionAttribute GetExpectedExceptionAttribute( MethodInfo method ) - { - object[] attributes = method.GetCustomAttributes( ExpectedExceptionType, false); - return attributes.Length > 0 ? (ExpectedExceptionAttribute) attributes[0] : null; - } - - #endregion - - #region Get Properties of Attributes - - public static string GetIgnoreReason( MemberInfo member ) - { - IgnoreAttribute attribute = GetIgnoreAttribute( member ); - return attribute == null ? "no reason" : attribute.Reason; - } - - public static string GetDescription( MethodInfo method ) - { - TestAttribute attribute = GetTestAttribute( method ); - return attribute == null ? null : attribute.Description; - } - - public static string GetDescription( Type fixtureType ) - { - TestFixtureAttribute attribute = GetTestFixtureAttribute( fixtureType ); - return attribute == null ? null : attribute.Description; - } - - #endregion - - #region Methods to check validity of a type and its members - - /// - /// Method to validate that a type is a valid test fixture - /// - /// The type to be checked - public static void CheckFixtureType( Type fixtureType ) - { - if ( fixtureType.GetConstructor( Type.EmptyTypes ) == null ) - throw new InvalidTestFixtureException(fixtureType.FullName + " does not have a valid constructor"); - - CheckSetUpTearDownMethod( fixtureType, SetUpType ); - CheckSetUpTearDownMethod( fixtureType, TearDownType ); - CheckSetUpTearDownMethod( fixtureType, FixtureSetUpType ); - CheckSetUpTearDownMethod( fixtureType, FixtureTearDownType ); - } - - /// - /// This method verifies that a type has no more than one method of a particular - /// SetUp or TearDown type and that the method has a correct signature. - /// - /// The type to be checked - /// The attribute to check for - private static void CheckSetUpTearDownMethod( Type fixtureType, Type attributeType ) - { - int count = 0; - MethodInfo theMethod = null; - - foreach(MethodInfo method in fixtureType.GetMethods( AllDeclaredMethods )) - { - if( method.IsDefined( attributeType, false ) ) - { - theMethod = method; - count++; - } - } - - if ( count > 1 ) - { - string attributeName = attributeType.Name; - if ( attributeName.EndsWith( "Attribute" ) ) - attributeName = attributeName.Substring( - 0, attributeName.Length - 9 ); - - throw new InvalidTestFixtureException( - string.Format( "{0} has multiple {1} methods", - fixtureType.Name, attributeName ) ); - } - - CheckSetUpTearDownSignature( theMethod ); - } - - private static void CheckSetUpTearDownSignature( MethodInfo method ) - { - if ( method != null ) - { - if ( !method.IsPublic && !method.IsFamily || method.IsStatic || method.ReturnType != typeof(void) || method.GetParameters().Length > 0 ) - throw new InvalidTestFixtureException("Invalid SetUp or TearDown method signature"); - } - } - - /// - /// Check the signature of a test method - /// - /// The method signature to check - /// True if the signature is correct, otherwise false - public static bool IsTestMethodSignatureCorrect(MethodInfo methodToCheck) - { - return - !methodToCheck.IsStatic - && !methodToCheck.IsAbstract - && methodToCheck.IsPublic - && methodToCheck.GetParameters().Length == 0 - && methodToCheck.ReturnType.Equals(typeof(void)); - } - - #endregion - - #region Get Methods of a type - - // These methods all take an object and assume that the type of the - // object was pre-checked so that there are no duplicate methods, - // statics, private methods, etc. - - public static ConstructorInfo GetConstructor( Type fixtureType ) - { - return fixtureType.GetConstructor( Type.EmptyTypes ); - } - - public static MethodInfo GetSetUpMethod( Type fixtureType ) - { - return GetMethod( fixtureType, SetUpType ); - } - - public static MethodInfo GetTearDownMethod(Type fixtureType) - { - return GetMethod(fixtureType, TearDownType ); - } - - public static MethodInfo GetFixtureSetUpMethod( Type fixtureType ) - { - return GetMethod( fixtureType, FixtureSetUpType ); - } - - public static MethodInfo GetFixtureTearDownMethod( Type fixtureType ) - { - return GetMethod( fixtureType, FixtureTearDownType ); - } - - public static MethodInfo GetMethod( Type fixtureType, Type attributeType ) - { - foreach(MethodInfo method in fixtureType.GetMethods( InstanceMethods ) ) - { - if( method.IsDefined( attributeType, true ) ) - return method; - } - - return null; - } - - public static MethodInfo GetMethod( Type fixtureType, string methodName ) - { - foreach(MethodInfo method in fixtureType.GetMethods( InstanceMethods ) ) - { - if( method.Name == methodName ) - return method; - } - - return null; - } - - #endregion - - #region Get Suite Property - - public static PropertyInfo GetSuiteProperty( Type testClass ) - { - if( testClass != null ) - { - PropertyInfo[] properties = testClass.GetProperties( StaticMethods ); - foreach( PropertyInfo property in properties ) - { - if( Reflect.HasSuiteAttribute( property ) ) - { - try - { - CheckSuiteProperty(property); - } - catch( InvalidSuiteException ) - { - return null; - } - return property; - } - } - } - return null; - } - - private static void CheckSuiteProperty(PropertyInfo property) - { - MethodInfo method = property.GetGetMethod(true); - if(method.ReturnType!=typeof(NUnit.Core.TestSuite)) - throw new InvalidSuiteException("Invalid suite property method signature"); - if(method.GetParameters().Length>0) - throw new InvalidSuiteException("Invalid suite property method signature"); - } - - #endregion - - #region Categories - - public static IList GetCategories( MemberInfo member ) - { - object[] attributes = member.GetCustomAttributes( CategoryType, false ); - IList names = new ArrayList(); - - foreach(CategoryAttribute attribute in attributes) - names.Add(attribute.Name); - - return names; - } - - #endregion - - #region Invoke Methods - - public static object Construct( Type type ) - { - ConstructorInfo ctor = GetConstructor( type ); - if ( ctor == null ) - throw new InvalidTestFixtureException(type.FullName + " does not have a valid constructor"); - - return ctor.Invoke( Type.EmptyTypes ); - } - - public static void InvokeMethod( MethodInfo method, object fixture ) - { - if(method != null) - { - try - { - method.Invoke( fixture, null ); - } - catch(TargetInvocationException e) - { - Exception inner = e.InnerException; - throw new NunitException("Rethrown",inner); - } - } - } - - public static void InvokeSetUp( object fixture ) - { - MethodInfo method = GetSetUpMethod( fixture.GetType() ); - if(method != null) - { - InvokeMethod(method, fixture); - } - } - - public static void InvokeTearDown( object fixture ) - { - MethodInfo method = GetTearDownMethod( fixture.GetType() ); - if(method != null) - { - InvokeMethod(method, fixture); - } - } - - #endregion - - #region Private Constructor for static-only class - - private Reflect() { } - - #endregion - } -} diff --git a/mcs/nunit20/core/RemoteTestRunner.cs b/mcs/nunit20/core/RemoteTestRunner.cs deleted file mode 100644 index e5aa8be3a82..00000000000 --- a/mcs/nunit20/core/RemoteTestRunner.cs +++ /dev/null @@ -1,558 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.IO; - using System.Collections; - using System.Reflection; - using System.Threading; - using System.Runtime.Remoting; - - /// - /// Summary description for RemoteTestRunner. - /// - /// - [Serializable] - public class RemoteTestRunner : LongLivingMarshalByRefObject, TestRunner, EventListener - { - #region Instance variables - - /// - /// The loaded test suite - /// - private TestSuite suite; - - /// - /// TestRunner thread used for asynchronous running - /// - private TestRunnerThread runningThread; - - /// - /// Our writer for standard output - /// - private TextWriter outText; - - /// - /// Our writer for error output - /// - private TextWriter errorText; - - /// - /// Buffered standard output writer created for each test run - /// - private BufferedStringTextWriter outBuffer; - - /// - /// Buffered error writer created for each test run - /// - private BufferedStringTextWriter errorBuffer; - - /// - /// Console standard output to restore after a run - /// - private TextWriter saveOut; - - /// - /// Console error output to restore after a run - /// - private TextWriter saveError; - - /// - /// Saved current directory to restore after a run - /// - private string currentDirectory; - - /// - /// Saved paths of the assemblies we loaded - used to set - /// current directory when we are running the tests. - /// - private string[] assemblies; - - /// - /// Dispatcher used to put out runner's test events - /// - private TestEventDispatcher events = new TestEventDispatcher(); - - private EventListener listener; // Temp - - private Version frameworkVersion; - - private IFilter filter; - - private bool displayTestLabels; - - /// - /// Results from the last test run - /// - private TestResult[] results; - - #endregion - - #region Constructors - - /// - /// Construct with stdOut and stdErr writers - /// - public RemoteTestRunner( TextWriter outText, TextWriter errorText ) - { - this.outText = outText; - this.errorText = errorText; - } - - /// - /// Default constructor uses Null writers. - /// - public RemoteTestRunner() : this( TextWriter.Null, TextWriter.Null ) { } - - #endregion - - #region Properties - - /// - /// Writer for standard output - this is a public property - /// so that we can set it when creating an instance - /// in another AppDomain. - /// - public TextWriter Out - { - get { return outText; } - set { outText = value; } - } - - /// - /// Writer for error output - this is a public property - /// so that we can set it when creating an instance - /// in another AppDomain. - /// - public TextWriter Error - { - get { return errorText; } - set { errorText = value; } - } - - /// - /// Interface to the events sourced by the runner - /// - public ITestEvents Events - { - get { return events; } - } - - public Version FrameworkVersion - { - get { return frameworkVersion; } - } - - public bool DisplayTestLabels - { - get { return displayTestLabels; } - set { displayTestLabels = value; } - } - - /// - /// Results from the last test run - /// - public TestResult[] Results - { - get { return results; } - } - - /// - /// First (or only) result from the last test run - /// - public TestResult Result - { - get { return results == null ? null : results[0]; } - } - - #endregion - - #region Methods for Loading Tests - - /// - /// Load an assembly - /// - /// - public Test Load( string assemblyName ) - { - this.assemblies = new string[] { assemblyName }; - TestSuiteBuilder builder = new TestSuiteBuilder(); - suite = builder.Build( assemblyName ); - frameworkVersion = builder.FrameworkVersion; - return suite; - } - - /// - /// Load a particular test in an assembly - /// - public Test Load( string assemblyName, string testName ) - { - this.assemblies = new string[] { assemblyName }; - TestSuiteBuilder builder = new TestSuiteBuilder(); - suite = builder.Build( assemblyName, testName ); - frameworkVersion = builder.FrameworkVersion; - return suite; - } - - /// - /// Load multiple assemblies - /// - public Test Load( string projectName, string[] assemblies ) - { - this.assemblies = (string[])assemblies.Clone(); - TestSuiteBuilder builder = new TestSuiteBuilder(); - suite = builder.Build( projectName, assemblies ); - frameworkVersion = builder.FrameworkVersion; - return suite; - } - - public Test Load( string projectName, string[] assemblies, string testName ) - { - this.assemblies = (string[])assemblies.Clone(); - TestSuiteBuilder builder = new TestSuiteBuilder(); - suite = builder.Build( assemblies, testName ); - frameworkVersion = builder.FrameworkVersion; - return suite; - } - - public void Unload() - { - suite = null; // All for now - frameworkVersion = null; - } - - #endregion - - #region Methods for Counting TestCases - - public int CountTestCases() - { - return suite.CountTestCases(); - } - - public int CountTestCases( string testName ) - { - Test test = FindTest( suite, testName ); - return test == null ? 0 : test.CountTestCases(); - } - - public int CountTestCases(string[] testNames ) - { - int count = 0; - foreach( string testName in testNames) - count += CountTestCases( testName ); - - return count; - } - - public ICollection GetCategories() - { - return CategoryManager.Categories; - } - - #endregion - - #region Methods for Running Tests - - public void SetFilter( IFilter filter ) - { - this.filter = filter; - } - - public TestResult Run( EventListener listener ) - { - return Run( listener, suite ); - } - - public TestResult Run(NUnit.Core.EventListener listener, string testName ) - { - if ( testName == null || testName.Length == 0 ) - return Run( listener, suite ); - else - return Run( listener, FindTest( suite, testName ) ); - } - - public TestResult[] Run(NUnit.Core.EventListener listener, string[] testNames) - { - if ( testNames == null || testNames.Length == 0 ) - return new TestResult[] { Run( listener, suite ) }; - else - return Run( listener, FindTests( suite, testNames ) ); - } - - public void RunTest(NUnit.Core.EventListener listener ) - { - runningThread = new TestRunnerThread( this ); - runningThread.Run( listener ); - } - - public void RunTest(NUnit.Core.EventListener listener, string testName ) - { - runningThread = new TestRunnerThread( this ); - runningThread.Run( listener, testName ); - } - - public void RunTest(NUnit.Core.EventListener listener, string[] testNames) - { - runningThread = new TestRunnerThread( this ); - runningThread.Run( listener, testNames ); - } - - public void CancelRun() - { - if ( runningThread != null ) - runningThread.Cancel(); - - CleanUpAfterTestRun(); - } - - public void Wait() - { - if ( runningThread != null ) - runningThread.Wait(); - } - - #endregion - - #region Helper Routines - - /// - /// Private method to run a single test - /// - private TestResult Run( EventListener listener, Test test ) - { - // Create array with the one test - Test[] tests = new Test[] { test }; - // Call our workhorse method - results = Run( listener, tests ); - // Return the first result we got - return results[0]; - } - - /// - /// Private method to run a set of tests. This routine is the workhorse - /// that is called anytime tests are run. - /// - private TestResult[] Run( EventListener listener, Test[] tests ) - { - // Create buffered writers for efficiency - outBuffer = new BufferedStringTextWriter( outText ); - errorBuffer = new BufferedStringTextWriter( errorText ); - - // Save previous state of Console. This is needed because Console.Out and - // Console.Error are static. In the case where the test itself calls this - // method, we can lose output if we don't save and restore their values. - // This is exactly what happens when we are testing NUnit itself. - saveOut = Console.Out; - saveError = Console.Error; -#if !TARGET_JVM - // Set Console to go to our buffers. Note that any changes made by - // the user in the test code or the code it calls will defeat this. - Console.SetOut( outBuffer ); - Console.SetError( errorBuffer ); -#endif - // Save the current directory so we can run each test in - // the same directory as its assembly - currentDirectory = Environment.CurrentDirectory; - - try - { - // Create an array for the resuls - results = new TestResult[ tests.Length ]; - - // Signal that we are starting the run - this.listener = listener; - listener.RunStarted( tests ); - - // TODO: Get rid of count - int count = 0; - foreach( Test test in tests ) - count += filter == null ? test.CountTestCases() : test.CountTestCases( filter ); - - events.FireRunStarting( tests, count ); - - // Run each test, saving the results - int index = 0; - foreach( Test test in tests ) - { - string assemblyDirectory = Path.GetDirectoryName( this.assemblies[test.AssemblyKey] ); - - if ( assemblyDirectory != null && assemblyDirectory != string.Empty ) - Environment.CurrentDirectory = assemblyDirectory; - - results[index++] = test.Run( this, filter ); - } - - // Signal that we are done - listener.RunFinished( results ); - events.FireRunFinished( results ); - - // Return result array - return results; - } - catch( Exception exception ) - { - // Signal that we finished with an exception - listener.RunFinished( exception ); - events.FireRunFinished( exception ); - // Rethrow - should we do this? - throw; - } - finally - { - CleanUpAfterTestRun(); - } - } - - private Test FindTest(Test test, string fullName) - { - if(test.UniqueName.Equals(fullName)) return test; - if(test.FullName.Equals(fullName)) return test; - - Test result = null; - if(test is TestSuite) - { - TestSuite suite = (TestSuite)test; - foreach(Test testCase in suite.Tests) - { - result = FindTest(testCase, fullName); - if(result != null) break; - } - } - - return result; - } - - private Test[] FindTests( Test test, string[] names ) - { - Test[] tests = new Test[ names.Length ]; - - int index = 0; - foreach( string name in names ) - tests[index++] = FindTest( test, name ); - - return tests; - } - - private void CleanUpAfterTestRun() - { - // Restore the directory we saved - if ( currentDirectory != null ) - { - Environment.CurrentDirectory = currentDirectory; - currentDirectory = null; - } - - // Close our output buffers - if ( outBuffer != null ) - { - outBuffer.Close(); - outBuffer = null; - } - - if ( errorBuffer != null ) - { - errorBuffer.Close(); - errorBuffer = null; - } - - // Restore previous console values - if ( saveOut != null ) - { - Console.SetOut( saveOut ); - saveOut = null; - } - - if ( saveError != null ) - { - Console.SetError( saveError ); - saveError = null; - } - } - - #endregion - - #region EventListener Members - - public void RunStarted(Test[] tests) - { - // TODO: Remove - } - - void NUnit.Core.EventListener.RunFinished(TestResult[] results) - { - // TODO: Remove - outText.Close(); - } - - void NUnit.Core.EventListener.RunFinished(Exception exception) - { - // TODO: Remove - outText.Close(); - } - - public void TestStarted(TestCase testCase) - { - if ( displayTestLabels ) - outText.WriteLine("***** {0}", testCase.FullName ); - - this.listener.TestStarted( testCase ); - events.FireTestStarting( testCase ); - } - - void NUnit.Core.EventListener.TestFinished(TestCaseResult result) - { - listener.TestFinished( result ); - events.FireTestFinished( result ); - } - - public void SuiteStarted(TestSuite suite) - { - listener.SuiteStarted( suite ); - events.FireSuiteStarting( suite ); - } - - void NUnit.Core.EventListener.SuiteFinished(TestSuiteResult result) - { - listener.SuiteFinished( result ); - events.FireSuiteFinished( result ); - } - - public void UnhandledException(Exception exception) - { - listener.UnhandledException( exception ); - events.FireTestException( exception ); - } - - #endregion - } -} - diff --git a/mcs/nunit20/core/ResultVisitor.cs b/mcs/nunit20/core/ResultVisitor.cs deleted file mode 100644 index 072ac6bf75e..00000000000 --- a/mcs/nunit20/core/ResultVisitor.cs +++ /dev/null @@ -1,42 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - - /// - /// - /// - public interface ResultVisitor - { - void Visit(TestCaseResult caseResult); - void Visit(TestSuiteResult suiteResult); - } -} diff --git a/mcs/nunit20/core/Results.xsd b/mcs/nunit20/core/Results.xsd deleted file mode 100755 index df3e76ea3f0..00000000000 --- a/mcs/nunit20/core/Results.xsd +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mcs/nunit20/core/RootTestSuite.cs b/mcs/nunit20/core/RootTestSuite.cs deleted file mode 100644 index 23dd74e4c6d..00000000000 --- a/mcs/nunit20/core/RootTestSuite.cs +++ /dev/null @@ -1,43 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Core -{ - /// - /// TestSuite forming the root of a test project - /// - public class RootTestSuite : TestSuite - { - public RootTestSuite( string projectName ) : base( projectName ) - { - } - } -} \ No newline at end of file diff --git a/mcs/nunit20/core/StringTextWriter.cs b/mcs/nunit20/core/StringTextWriter.cs deleted file mode 100644 index a5fb51a658a..00000000000 --- a/mcs/nunit20/core/StringTextWriter.cs +++ /dev/null @@ -1,150 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.IO; -using System.Text; - -namespace NUnit.Core -{ - #region StringTextWriter - - /// - /// Use this wrapper to ensure that only strings get passed accross the AppDomain - /// boundary. Otherwise tests will break when non-remotable objects are passed to - /// Console.Write/WriteLine. - /// - public class StringTextWriter : TextWriter - { - public StringTextWriter( TextWriter aTextWriter ) - { - theTextWriter = aTextWriter; - } - - protected TextWriter theTextWriter; - - override public void Write(char aChar) - { - theTextWriter.Write(aChar); - } - - override public void Write(string aString) - { - theTextWriter.Write(aString); - } - - override public void WriteLine(string aString) - { - theTextWriter.WriteLine(aString); - } - - override public System.Text.Encoding Encoding - { - get { return theTextWriter.Encoding; } - } - - public override void Close() - { - this.Flush(); - theTextWriter.Close (); - } - - public override void Flush() - { - theTextWriter.Flush (); - } - } - - #endregion - - #region BufferedStringTextWriter - - /// - /// This wrapper derives from StringTextWriter and adds buffering - /// to improve cross-domain performance. The buffer is flushed whenever - /// it reaches or exceeds a maximum size or when Flush is called. - /// - public class BufferedStringTextWriter : StringTextWriter - { - public BufferedStringTextWriter( TextWriter aTextWriter ) : base( aTextWriter ){ } - - private static readonly int MAX_BUFFER = 1000; - private StringBuilder sb = new StringBuilder( MAX_BUFFER ); - - override public void Write(char aChar) - { - lock( sb ) - { - sb.Append( aChar ); - this.CheckBuffer(); - } - } - - override public void Write(string aString) - { - lock( sb ) - { - sb.Append( aString ); - this.CheckBuffer(); - } - } - - override public void WriteLine(string aString) - { - lock( sb ) - { - sb.Append( aString ); - sb.Append( '\n' ); - this.CheckBuffer(); - } - } - - override public void Flush() - { - if ( sb.Length > 0 ) - { - lock( sb ) - { - theTextWriter.Write( sb.ToString() ); - sb.Length = 0; - } - } - - theTextWriter.Flush(); - } - - private void CheckBuffer() - { - if ( sb.Length >= MAX_BUFFER ) - this.Flush(); - } - } - - #endregion -} diff --git a/mcs/nunit20/core/Summary.xslt b/mcs/nunit20/core/Summary.xslt deleted file mode 100755 index 004806df978..00000000000 --- a/mcs/nunit20/core/Summary.xslt +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - -Tests run: - -, Failures: - -, Not run: - -, Time: - - seconds - - - - -Failures: - - -Tests not run: - - - - - - - ) - - : - - - - - - - - - - - - \ No newline at end of file diff --git a/mcs/nunit20/core/TemplateTestCase.cs b/mcs/nunit20/core/TemplateTestCase.cs deleted file mode 100644 index 381a9e3bc40..00000000000 --- a/mcs/nunit20/core/TemplateTestCase.cs +++ /dev/null @@ -1,239 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Text; - using System.Reflection; - - /// - /// Summary description for TestCase. - /// - public abstract class TemplateTestCase : TestCase - { - private MethodInfo method; - - public TemplateTestCase(Type fixtureType, MethodInfo method) : base(fixtureType.FullName, method.Name) - { - this.fixtureType = fixtureType; - this.method = method; - } - - public TemplateTestCase(object fixture, MethodInfo method) : base(fixture.GetType().FullName, method.Name) - { - this.Fixture = fixture; - this.fixtureType = fixture.GetType(); - this.method = method; - } - - public override void Run(TestCaseResult testResult) - { - if ( ShouldRun ) - { - bool doParentSetUp = false; - if ( Parent != null ) - { - doParentSetUp = !Parent.IsSetUp; - - } - - try - { - if ( doParentSetUp ) - Parent.DoSetUp( testResult ); - - if ( Fixture == null && Parent != null) - Fixture = Parent.Fixture; - - if ( !testResult.IsFailure ) - doRun( testResult ); - } - catch(Exception ex) - { - if ( ex is NunitException ) - ex = ex.InnerException; - - if ( ex is NUnit.Framework.IgnoreException ) - testResult.NotRun( ex.Message ); - else - RecordException( ex, testResult ); - } - finally - { - if ( doParentSetUp ) - Parent.DoTearDown( testResult ); - } - } - else - { - testResult.NotRun(this.IgnoreReason); - } - } - - /// - /// The doRun method is used to run a test internally. - /// It assumes that the caller is taking care of any - /// TestFixtureSetUp and TestFixtureTearDown needed. - /// - /// The result in which to record success or failure - public void doRun( TestCaseResult testResult ) - { - DateTime start = DateTime.Now; - - try - { - Reflect.InvokeSetUp( this.Fixture ); - doTestCase( testResult ); - } - catch(Exception ex) - { - if ( ex is NunitException ) - ex = ex.InnerException; - - if ( ex is NUnit.Framework.IgnoreException ) - testResult.NotRun( ex.Message ); - else - RecordException( ex, testResult ); - } - finally - { - doTearDown( testResult ); - - DateTime stop = DateTime.Now; - TimeSpan span = stop.Subtract(start); - testResult.Time = (double)span.Ticks / (double)TimeSpan.TicksPerSecond; - } - } - - #region Invoke Methods by Reflection, Recording Errors - - private void doTearDown( TestCaseResult testResult ) - { - try - { - Reflect.InvokeTearDown( this.Fixture ); - } - catch(Exception ex) - { - if ( ex is NunitException ) - ex = ex.InnerException; - RecordException(ex, testResult, true); - } - } - - private void doTestCase( TestCaseResult testResult ) - { - try - { - Reflect.InvokeMethod( this.method, this.Fixture ); - ProcessNoException(testResult); - } - catch( Exception ex ) - { - if ( ex is NunitException ) - ex = ex.InnerException; - - if ( ex is NUnit.Framework.IgnoreException ) - testResult.NotRun( ex.Message ); - else - ProcessException(ex, testResult); - } - } - - #endregion - - #region Record Info About An Exception - - protected void RecordException( Exception exception, TestCaseResult testResult ) - { - RecordException( exception, testResult, false ); - } - - protected void RecordException( Exception exception, TestCaseResult testResult, bool inTearDown ) - { - StringBuilder msg = new StringBuilder(); - StringBuilder st = new StringBuilder(); - - if ( inTearDown ) - { - msg.Append( testResult.Message ); - msg.Append( Environment.NewLine ); - msg.Append( "TearDown : " ); - st.Append( testResult.StackTrace ); - st.Append( Environment.NewLine ); - st.Append( "--TearDown" ); - st.Append( Environment.NewLine ); - } - - msg.Append( BuildMessage( exception ) ); - st.Append( BuildStackTrace( exception ) ); - testResult.Failure( msg.ToString(), st.ToString() ); - } - - private string BuildMessage(Exception exception) - { - StringBuilder sb = new StringBuilder(); - if ( exception is NUnit.Framework.AssertionException ) - sb.Append( exception.Message ); - else - sb.AppendFormat( "{0} : {1}", exception.GetType().ToString(), exception.Message ); - - Exception inner = exception.InnerException; - while( inner != null ) - { - sb.Append( Environment.NewLine ); - sb.AppendFormat( " ----> {0} : {1}", inner.GetType().ToString(), inner.Message ); - inner = inner.InnerException; - } - - return sb.ToString(); - } - - private string BuildStackTrace(Exception exception) - { - if(exception.InnerException!=null) - return exception.StackTrace + Environment.NewLine + - "--" + exception.GetType().Name + Environment.NewLine + - BuildStackTrace(exception.InnerException); - else - return exception.StackTrace; - } - - #endregion - - #region Abstract Methods - - protected internal abstract void ProcessNoException(TestCaseResult testResult); - - protected internal abstract void ProcessException(Exception exception, TestCaseResult testResult); - - #endregion - } -} diff --git a/mcs/nunit20/core/Test.cs b/mcs/nunit20/core/Test.cs deleted file mode 100644 index afd6d4256fd..00000000000 --- a/mcs/nunit20/core/Test.cs +++ /dev/null @@ -1,311 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Collections; - - /// - /// Test Class. - /// - public abstract class Test : LongLivingMarshalByRefObject, ITest, IComparable - { - #region Private Fields - - /// - /// Name of the test - /// - private string testName; - - /// - /// Full Name of the test - /// - private string fullName; - - /// - /// Int used to distinguish suites of the same - /// name across multiple assemblies. - /// - private int assemblyKey; - - /// - /// The Type of the fixture associated with this test, or null - /// - protected Type fixtureType; - - /// - /// The fixture object, to be used with this test, or null - /// - private object fixture; - - /// - /// Whether or not the test should be run - /// - private bool shouldRun; - - /// - /// Reason for not running the test, if applicable - /// - private string ignoreReason; - - /// - /// Description for this test - /// - private string description; - - /// - /// Test suite containing this test, or null - /// - private TestSuite parent; - - /// - /// List of categories applying to this test - /// - private IList categories; - - /// - /// True if the test had the Explicit attribute - /// - private bool isExplicit; - - #endregion - - #region Constructors - - public Test( string name ) : this( name, 0 ) { } - - public Test( string name, int assemblyKey ) - { - fullName = testName = name; - this.assemblyKey = assemblyKey; - } - - protected Test( string pathName, string testName ) - : this( pathName, testName, 0 ) { } - - protected Test( string pathName, string testName, int assemblyKey ) - { - fullName = pathName == null || pathName == string.Empty ? testName : pathName + "." + testName; - this.testName = testName; - this.assemblyKey = assemblyKey; - shouldRun = true; - } - - protected Test( Type fixtureType ) : this( fixtureType, 0 ) { } - - protected Test( Type fixtureType, int assemblyKey ) - { - this.fixtureType = fixtureType; - this.fullName = this.testName = fixtureType.FullName; - this.assemblyKey = assemblyKey; - this.shouldRun = true; - - if ( fixtureType.Namespace != null ) - testName = testName.Substring( Name.LastIndexOf( '.' ) + 1 ); - } - - // TODO: Currently, these two are only used by our tests. Remove? - protected Test( object fixture ) : this( fixture, 0 ) { } - - protected Test( object fixture, int assemblyKey ) : this( fixture.GetType(), assemblyKey ) - { - this.fixture = fixture; - } - - #endregion - - #region Properties - - public string Name - { - get { return testName; } - } - - public string FullName - { - get { return fullName; } - } - - /// - /// If the name is a path, this just returns the file part - /// - public string ShortName - { - get - { - string name = Name; - int val = name.LastIndexOf("\\"); - if(val != -1) - name = name.Substring(val+1); - return name; - } - } - - /// - /// Int used to distinguish suites of the same - /// name across multiple assemblies. - /// - public int AssemblyKey - { - get { return assemblyKey; } - set { assemblyKey = value; } - } - - /// - /// Key used to look up a test in a hash table - /// - public string UniqueName - { - get { return string.Format( "[{0}]{1}", assemblyKey, fullName ); } - } - - public object Fixture - { - get { return fixture; } - set { fixture = value; } - } - - /// - /// Whether or not the test should be run - /// - public virtual bool ShouldRun - { - get { return shouldRun; } - set { shouldRun = value; } - } - - /// - /// Reason for not running the test, if applicable - /// - public string IgnoreReason - { - get { return ignoreReason; } - set { ignoreReason = value; } - } - - public TestSuite Parent - { - get { return parent; } - set { parent = value; } - } - - public string TestPath - { - get - { - string testPath = ""; - if (parent != null) - testPath = parent.TestPath; - return testPath + FullName; - } - } - - public IList Categories - { - get { return categories; } - set { categories = value; } - } - - public bool HasCategory( string name ) - { - return categories != null && categories.Contains( name ); - } - - public bool HasCategory( IList names ) - { - if ( categories == null ) - return false; - - foreach( string name in names ) - if ( categories.Contains( name ) ) - return true; - - return false; - } - - public bool IsDescendant(Test test) - { - if (parent != null) - { - return parent == test || parent.IsDescendant(test); - } - - return false; - } - - public String Description - { - get { return description; } - set { description = value; } - } - - public bool IsExplicit - { - get { return isExplicit; } - set { isExplicit = value; } - } - - #endregion - - #region Abstract Methods and Properties - - /// - /// Count of the test cases ( 1 if this is a test case ) - /// - public abstract int CountTestCases(); - public abstract int CountTestCases(IFilter filter); - - public abstract bool IsSuite { get; } - public abstract bool IsFixture{ get; } - public abstract bool IsTestCase{ get; } - public abstract ArrayList Tests { get; } - - public abstract bool Filter(IFilter filter); - - public abstract TestResult Run( EventListener listener ); - public abstract TestResult Run(EventListener listener, IFilter filter); - - #endregion - - #region IComparable Members - - public int CompareTo(object obj) - { - Test other = obj as Test; - - if ( other == null ) - return -1; - - return this.FullName.CompareTo( other.FullName ); - } - - #endregion - } -} diff --git a/mcs/nunit20/core/TestAssembly.cs b/mcs/nunit20/core/TestAssembly.cs deleted file mode 100644 index cdf99c517d5..00000000000 --- a/mcs/nunit20/core/TestAssembly.cs +++ /dev/null @@ -1,70 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.IO; - -namespace NUnit.Core -{ - /// - /// Test Suite formed from an assembly. - /// Class name changed from TestAssembly - /// to avoid conflict with namespace. - /// - public class AssemblyTestSuite : TestSuite - { - public AssemblyTestSuite( string assembly ) : this( assembly, 0 ) - { - } - - public AssemblyTestSuite( string assembly, int key) : base( assembly, key ) - { - } - - public override TestResult Run(EventListener listener) - { - string directoryName = Path.GetDirectoryName( this.Name ); - - if ( directoryName != null && directoryName != string.Empty ) - Environment.CurrentDirectory = directoryName; - - return base.Run( listener ); - } - - public override TestResult Run(EventListener listener, IFilter filter) - { - string directoryName = Path.GetDirectoryName( this.Name ); - - if ( directoryName != null && directoryName != string.Empty ) - Environment.CurrentDirectory = directoryName; - - return base.Run( listener, filter ); - } - } -} diff --git a/mcs/nunit20/core/TestCase.cs b/mcs/nunit20/core/TestCase.cs deleted file mode 100644 index 5b5e89febfe..00000000000 --- a/mcs/nunit20/core/TestCase.cs +++ /dev/null @@ -1,107 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Collections; - using System.Reflection; - - /// - /// Summary description for TestCase. - /// - public abstract class TestCase : Test - { - public TestCase( string path, string name ) : base( path, name ) { } - - public override int CountTestCases() - { - return 1; - } - - public override int CountTestCases(IFilter filter) - { - if (Filter(filter)) - return 1; - - return 0; - } - - public override TestResult Run(EventListener listener, IFilter filter) - { - return Run( listener ); // Ignore filter for now - } - - public override TestResult Run( EventListener listener ) - { - TestCaseResult testResult = new TestCaseResult(this); - - listener.TestStarted(this); - long startTime = DateTime.Now.Ticks; - - Run( testResult ); - - testResult.AssertCount = NUnit.Framework.Assert.Counter; - - long stopTime = DateTime.Now.Ticks; - double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond; - testResult.Time = time; - - listener.TestFinished(testResult); - return testResult; - } - - public override bool IsSuite - { - get { return false; } - } - - public override bool IsFixture - { - get { return false; } - } - - public override bool IsTestCase - { - get { return true; } - } - - public override ArrayList Tests - { - get { return null; } - } - - public override bool Filter(IFilter filter) - { - return filter.Pass(this); - } - - public abstract void Run(TestCaseResult result); - } -} diff --git a/mcs/nunit20/core/TestCaseBuilder.cs b/mcs/nunit20/core/TestCaseBuilder.cs deleted file mode 100644 index 97d6cd1cb04..00000000000 --- a/mcs/nunit20/core/TestCaseBuilder.cs +++ /dev/null @@ -1,177 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Reflection; - using System.Collections; - - /// - /// Summary description for TestCaseBuilder. - /// - public class TestCaseBuilder - { - private static Hashtable builders; - private static ITestBuilder normalBuilder = new NormalBuilder(); - - private static void InitBuilders() - { - builders = new Hashtable(); - builders[typeof(NUnit.Framework.ExpectedExceptionAttribute)] = new ExpectedExceptionBuilder(); - } - - private static ITestBuilder GetBuilder(MethodInfo method) - { - if (builders == null) - InitBuilders(); - - object[] attributes = method.GetCustomAttributes(false); - - foreach (object attribute in attributes) - { - ITestBuilder builder = (ITestBuilder) builders[attribute.GetType()]; - if (builder != null) - return builder; - } - - return normalBuilder; - } - - /// - /// Make a test case from a given fixture type and method - /// - /// The fixture type - /// MethodInfo for the particular method - /// A test case or null - public static TestCase Make(Type fixtureType, MethodInfo method) - { - TestCase testCase = null; - - if( Reflect.HasTestAttribute(method) || Reflect.IsObsoleteTestMethod( method ) ) - { - if( Reflect.IsTestMethodSignatureCorrect( method ) ) - { - ITestBuilder builder = GetBuilder(method); - testCase = builder.Make(fixtureType, method); - - if(Reflect.HasIgnoreAttribute(method)) - { - testCase.ShouldRun = false; - testCase.IgnoreReason = Reflect.GetIgnoreReason(method); - } - - if (Reflect.HasCategoryAttribute(method)) - { - IList categories = Reflect.GetCategories(method); - CategoryManager.Add(categories); - testCase.Categories = categories; - } - - testCase.IsExplicit = Reflect.HasExplicitAttribute(method); - - testCase.Description = Reflect.GetDescription(method); - } - else - { - testCase = new NotRunnableTestCase(method); - } - } - - return testCase; - } - - #region Make Test Cases with pre-created fixtures - - // TODO: These methods are only used by our tests, since we no longer - // create the fixture in advance. They should be phased out. - - public static TestCase Make(object fixture, MethodInfo method) - { - TestCase testCase = Make( fixture.GetType(), method ); - testCase.Fixture = fixture; - - return testCase; - } - - public static TestCase Make(object fixture, string methodName) - { - MethodInfo method = Reflect.GetMethod( fixture.GetType(), methodName ); - if ( method != null ) - return Make(fixture, method); - - return null; - } - - #endregion - } - - internal interface ITestBuilder - { - TestCase Make(Type fixtureType, MethodInfo method); - TestCase Make(object fixture, MethodInfo method); - } - - internal class ExpectedExceptionBuilder : ITestBuilder - { - #region ITestBuilder Members - - public TestCase Make(Type fixtureType, MethodInfo method) - { - return new ExpectedExceptionTestCase( fixtureType, method ); - } - - public TestCase Make(object fixture, MethodInfo method) - { - return new ExpectedExceptionTestCase( fixture, method ); - } - - #endregion - } - - internal class NormalBuilder : ITestBuilder - { - #region ITestBuilder Members - - public TestCase Make(Type fixtureType, MethodInfo method) - { - return new NormalTestCase(fixtureType, method); - } - - public TestCase Make(object fixture, MethodInfo method) - { - return new NormalTestCase(fixture, method); - } - - #endregion - } - - -} - diff --git a/mcs/nunit20/core/TestCaseResult.cs b/mcs/nunit20/core/TestCaseResult.cs deleted file mode 100644 index 70101349229..00000000000 --- a/mcs/nunit20/core/TestCaseResult.cs +++ /dev/null @@ -1,77 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Text; - - /// - /// - /// - // - [Serializable] - public class TestCaseResult : TestResult - { - public TestCaseResult(ITest testCase):base(testCase, testCase.FullName) - { - Executed = false; - } - - public TestCaseResult(string testCaseString) : base(null, testCaseString) - { - Executed = false; - } - - public void Success() - { - Executed = true; - IsFailure = false; - } - - public override string ToString() - { - StringBuilder builder = new StringBuilder(); - string name = Name; - if ( Test != null ) - name = Test.FullName; - - builder.AppendFormat("{0} : " , name); - if(!IsSuccess) - builder.Append(messageString); - - return builder.ToString(); - } - - public override void Accept(ResultVisitor visitor) - { - visitor.Visit(this); - } - } -} diff --git a/mcs/nunit20/core/TestEventArgs.cs b/mcs/nunit20/core/TestEventArgs.cs deleted file mode 100644 index f2bac2f8efe..00000000000 --- a/mcs/nunit20/core/TestEventArgs.cs +++ /dev/null @@ -1,198 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Core -{ - /// - /// The delegate for all events related to running tests - /// - public delegate void TestEventHandler ( object sender, TestEventArgs args ); - - /// - /// Enumeration used to distiguish test events - /// - public enum TestAction - { - // Test Load Events - TestLoading, - TestLoaded, - TestLoadFailed, - TestReloading, - TestReloaded, - TestReloadFailed, - TestUnloading, - TestUnloaded, - TestUnloadFailed, - // Test Run Events - RunStarting, - RunFinished, - SuiteStarting, - SuiteFinished, - TestStarting, - TestFinished, - TestException - } - - /// - /// Argument used for all test events - /// - public class TestEventArgs : EventArgs - { - #region Instance Variables - - // The action represented by the event - private TestAction action; - - // The name of the test or other item - private string name; - - // The tests we are running - private Test[] tests; - - // The results from our tests - private TestResult[] results; - - // The exception causing a failure - private Exception exception; - - // TODO: Remove this count of test cases - private int count; - - #endregion - - #region Constructors - - public TestEventArgs( TestAction action, - string name, Test test ) - { - this.action = action; - this.name = name; - this.tests = new Test[] { test }; - } - - public TestEventArgs( TestAction action, string name ) - { - this.action = action; - this.name = name; - } - - public TestEventArgs( TestAction action, - string name, Exception exception ) - { - this.action = action; - this.name = name; - this.exception = exception; - } - - public TestEventArgs( TestAction action, Test test ) - { - this.action = action; - this.tests = new Test[] { test }; - this.count = test.CountTestCases(); - } - - public TestEventArgs( TestAction action, TestResult result ) - { - this.action = action; - this.results = new TestResult[] { result }; - } - - public TestEventArgs( TestAction action, TestResult[] results ) - { - this.action = action; - this.results = results; - } - - public TestEventArgs( TestAction action, Exception exception ) - { - this.action = action; - this.exception = exception; - } - - public TestEventArgs( TestAction action, Test[] tests, int count) - { - this.action = action; - this.tests = tests; - this.count = count; - } - - #endregion - - #region Properties - - public TestAction Action - { - get { return action; } - } - - public string Name - { - get { return name; } - } - -// public bool IsProjectFile -// { -// get { return NUnitProject.IsProjectFile( testFileName ); } -// } - - public Test Test - { - get { return tests == null || tests.Length == 0 ? null : tests[0]; } - } - - public Test[] Tests - { - get { return tests; } - } - - public int TestCount - { - get { return count; } - } - - public TestResult Result - { - get { return results == null || results.Length == 0 ? null : results[0]; } - } - - public TestResult[] Results - { - get { return results; } - } - - public Exception Exception - { - get { return exception; } - } - - #endregion - } -} diff --git a/mcs/nunit20/core/TestEventDispatcher.cs b/mcs/nunit20/core/TestEventDispatcher.cs deleted file mode 100644 index f6abff3cc65..00000000000 --- a/mcs/nunit20/core/TestEventDispatcher.cs +++ /dev/null @@ -1,169 +0,0 @@ -using System; - -namespace NUnit.Core -{ - /// - /// Helper class used by runner to dispatch test events - /// - public class TestEventDispatcher : ITestEvents - { - #region Events - - // Test loading events - public event TestEventHandler TestLoading; - public event TestEventHandler TestLoaded; - public event TestEventHandler TestLoadFailed; - - public event TestEventHandler TestReloading; - public event TestEventHandler TestReloaded; - public event TestEventHandler TestReloadFailed; - - public event TestEventHandler TestUnloading; - public event TestEventHandler TestUnloaded; - public event TestEventHandler TestUnloadFailed; - - // Test running events - public event TestEventHandler RunStarting; - public event TestEventHandler RunFinished; - - public event TestEventHandler SuiteStarting; - public event TestEventHandler SuiteFinished; - - public event TestEventHandler TestStarting; - public event TestEventHandler TestFinished; - - public event TestEventHandler TestException; - - #endregion - - #region Methods for Firing Events - - private void Fire( - TestEventHandler handler, TestEventArgs e ) - { - if ( handler != null ) - handler( this, e ); - } - - public void FireTestLoading( string fileName ) - { - Fire( - TestLoading, - new TestEventArgs( TestAction.TestLoading, fileName ) ); - } - - public void FireTestLoaded( string fileName, Test test ) - { - Fire( - TestLoaded, - new TestEventArgs( TestAction.TestLoaded, fileName, test ) ); - } - - public void FireTestLoadFailed( string fileName, Exception exception ) - { - Fire( - TestLoadFailed, - new TestEventArgs( TestAction.TestLoadFailed, fileName, exception ) ); - } - - public void FireTestUnloading( string fileName, Test test ) - { - Fire( - TestUnloading, - new TestEventArgs( TestAction.TestUnloading, fileName, test ) ); - } - - public void FireTestUnloaded( string fileName, Test test ) - { - Fire( - TestUnloaded, - new TestEventArgs( TestAction.TestUnloaded, fileName, test ) ); - } - - public void FireTestUnloadFailed( string fileName, Exception exception ) - { - Fire( - TestUnloadFailed, - new TestEventArgs( TestAction.TestUnloadFailed, fileName, exception ) ); - } - - public void FireTestReloading( string fileName, Test test ) - { - Fire( - TestReloading, - new TestEventArgs( TestAction.TestReloading, fileName, test ) ); - } - - public void FireTestReloaded( string fileName, Test test ) - { - Fire( - TestReloaded, - new TestEventArgs( TestAction.TestReloaded, fileName, test ) ); - } - - public void FireTestReloadFailed( string fileName, Exception exception ) - { - Fire( - TestReloadFailed, - new TestEventArgs( TestAction.TestReloadFailed, fileName, exception ) ); - } - - public void FireRunStarting( Test[] tests, int count ) - { - Fire( - RunStarting, - new TestEventArgs( TestAction.RunStarting, tests, count ) ); - } - - public void FireRunFinished( TestResult[] results ) - { - Fire( - RunFinished, - new TestEventArgs( TestAction.RunFinished, results ) ); - } - - public void FireRunFinished( Exception exception ) - { - Fire( - RunFinished, - new TestEventArgs( TestAction.RunFinished, exception ) ); - } - - public void FireTestStarting( Test test ) - { - Fire( - TestStarting, - new TestEventArgs( TestAction.TestStarting, test ) ); - } - - public void FireTestFinished( TestResult result ) - { - Fire( - TestFinished, - new TestEventArgs( TestAction.TestFinished, result ) ); - } - - public void FireSuiteStarting( Test test ) - { - Fire( - SuiteStarting, - new TestEventArgs( TestAction.SuiteStarting, test ) ); - } - - public void FireSuiteFinished( TestResult result ) - { - Fire( - SuiteFinished, - new TestEventArgs( TestAction.SuiteFinished, result ) ); - } - - public void FireTestException( Exception exception ) - { - Fire( - TestException, - new TestEventArgs( TestAction.TestException, exception ) ); - } - - #endregion - } -} diff --git a/mcs/nunit20/core/TestFixture.cs b/mcs/nunit20/core/TestFixture.cs deleted file mode 100644 index 7b1f9448871..00000000000 --- a/mcs/nunit20/core/TestFixture.cs +++ /dev/null @@ -1,166 +0,0 @@ -using System; -using System.Collections; -using System.Reflection; - -namespace NUnit.Core -{ - /// - /// A TestSuite that wraps a class marked with TestFixtureAttribute - /// - public class TestFixture : TestSuite - { - private const string FIXTURE_SETUP_FAILED = "Fixture setup failed"; - - #region Constructors - - public TestFixture( object fixture ) : base( fixture, 0 ) - { - Initialize(); - } - - public TestFixture( object fixture, int assemblyKey ) : base( fixture, assemblyKey ) - { - Initialize(); - } - - public TestFixture( Type fixtureType ) : base( fixtureType, 0 ) - { - Initialize(); - } - - public TestFixture( Type fixtureType, int assemblyKey ) : base( fixtureType, assemblyKey ) - { - Initialize(); - } - - private void Initialize() - { - try - { - Reflect.CheckFixtureType( fixtureType ); - - IList categories = Reflect.GetCategories( fixtureType ); - CategoryManager.Add( categories ); - this.Categories = categories; - - this.fixtureSetUp = Reflect.GetFixtureSetUpMethod( fixtureType ); - this.fixtureTearDown = Reflect.GetFixtureTearDownMethod( fixtureType ); - - this.IsExplicit = Reflect.HasExplicitAttribute( fixtureType ); - - if ( Reflect.HasIgnoreAttribute( fixtureType ) ) - { - this.ShouldRun = false; - this.IgnoreReason = Reflect.GetIgnoreReason( fixtureType ); - } - - this.Description = Reflect.GetDescription( fixtureType ); - - MethodInfo [] methods = fixtureType.GetMethods(BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static|BindingFlags.NonPublic); - foreach(MethodInfo method in methods) - { - TestCase testCase = TestCaseBuilder.Make( fixtureType, method ); - if(testCase != null) - { - testCase.AssemblyKey = this.AssemblyKey; - this.Add( testCase ); - } - } - - if( this.CountTestCases() == 0 ) - { - this.ShouldRun = false; - this.IgnoreReason = this.Name + " does not have any tests"; - } - } - catch( InvalidTestFixtureException exception ) - { - this.ShouldRun = false; - this.IgnoreReason = exception.Message; - } - } - - #endregion - - #region Static Methods - - public static bool IsValidType( Type type ) - { - return !type.IsAbstract && Reflect.HasTestFixtureAttribute( type ); - } - - #endregion - - public override void DoSetUp( TestResult suiteResult ) - { - try - { - if ( Fixture == null ) - Fixture = Reflect.Construct( fixtureType ); - - if (this.fixtureSetUp != null) - Reflect.InvokeMethod(fixtureSetUp, Fixture); - IsSetUp = true; - } - catch (Exception ex) - { - // Error in TestFixtureSetUp causes the suite and - // all contained suites to be ignored. - // TODO: Change this to be a failure? - NunitException nex = ex as NunitException; - if (nex != null) - ex = nex.InnerException; - - if ( ex is NUnit.Framework.IgnoreException ) - { - this.ShouldRun = false; - suiteResult.NotRun(ex.Message); - suiteResult.StackTrace = ex.StackTrace; - this.IgnoreReason = ex.Message; - } - else - { - suiteResult.Failure( ex.Message, ex.StackTrace, true ); - } - } - finally - { - suiteResult.AssertCount = NUnit.Framework.Assert.Counter; - } - } - - public override void DoTearDown( TestResult suiteResult ) - { - if (this.ShouldRun) - { - try - { - IsSetUp = false; - if (this.fixtureTearDown != null) - Reflect.InvokeMethod(fixtureTearDown, Fixture); - } - catch (Exception ex) - { - // Error in TestFixtureTearDown causes the - // suite to be marked as a failure, even if - // all the contained tests passed. - NunitException nex = ex as NunitException; - if (nex != null) - ex = nex.InnerException; - - suiteResult.Failure( ex.Message, ex.StackTrace); - } - finally - { - suiteResult.AssertCount += NUnit.Framework.Assert.Counter; - } - } - - if (this.IgnoreReason == FIXTURE_SETUP_FAILED) - { - this.ShouldRun = true; - this.IgnoreReason = null; - } - } - } -} diff --git a/mcs/nunit20/core/TestResult.cs b/mcs/nunit20/core/TestResult.cs deleted file mode 100644 index 8d9d9152891..00000000000 --- a/mcs/nunit20/core/TestResult.cs +++ /dev/null @@ -1,211 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - - /// - /// Summary description for TestResult. - /// - /// - [Serializable] - public abstract class TestResult - { - #region Fields - - /// - /// True if the test executed - /// - private bool executed; - - /// - /// True if the test was marked as a failure - /// - private bool isFailure; - - /// - /// True if the setup failed: This means SetUp for a test case, - /// or TestFixtureSetUp for a fixture. - /// - private bool setupFailure; - - /// - /// The elapsed time for executing this test - /// - private double time; - - /// - /// The name of the test - /// - private string name; - - /// - /// The test that this result pertains to - /// - private ITest test; - - /// - /// The stacktrace at the point of failure - /// - private string stackTrace; - - /// - /// Description of this test - /// - private string description; - - /// - /// Message giving the reason for failure - /// - protected string messageString; - - /// - /// Number of asserts executed by this test - /// - private int assertCount; - - #endregion - - #region Protected Constructor - - protected TestResult(ITest test, string name) - { - this.name = name; - this.test = test; - if(test != null) - this.description = test.Description; - } - - #endregion - - #region Properties - - public bool Executed - { - get { return executed; } - set { executed = value; } - } - - public virtual bool AllTestsExecuted - { - get { return executed; } - } - - public virtual string Name - { - get{ return name;} - } - - public ITest Test - { - get{ return test;} - } - - public virtual bool IsSuccess - { - get { return !(isFailure); } - } - - public virtual bool IsFailure - { - get { return isFailure; } - set { isFailure = value; } - } - - public bool SetupFailure - { - get { return setupFailure; } - set { setupFailure = value; } - } - - public virtual string Description - { - get { return description; } - set { description = value; } - } - - public double Time - { - get{ return time; } - set{ time = value; } - } - - public string Message - { - get { return messageString; } - } - - public virtual string StackTrace - { - get - { - return stackTrace; - } - set - { - stackTrace = value; - } - } - - public int AssertCount - { - get { return assertCount; } - set { assertCount = value; } - } - - #endregion - - #region Public Methods - - public void NotRun(string reason) - { - this.executed = false; - this.messageString = reason; - } - - public void Failure(string message, string stackTrace ) - { - Failure( message, stackTrace, false ); - } - - public void Failure(string message, string stackTrace, bool setupFailure) - { - this.executed = true; - this.isFailure = true; - this.messageString = message; - this.stackTrace = stackTrace; - this.setupFailure = setupFailure; - } - - #endregion - - public abstract void Accept(ResultVisitor visitor); - } -} diff --git a/mcs/nunit20/core/TestRunner.cs b/mcs/nunit20/core/TestRunner.cs deleted file mode 100644 index faf929c78b1..00000000000 --- a/mcs/nunit20/core/TestRunner.cs +++ /dev/null @@ -1,189 +0,0 @@ -using System; -using System.Collections; -using System.IO; -using System.Threading; - -namespace NUnit.Core -{ - /// - /// The TestRunner Interface is allows client code, such as the NUnit console and - /// gui runners, to load and run tests. This is the lowest level interface generally - /// supported for running tests and is implemented by the RemoteTestRunner class in - /// the NUnit core as well as by other classes running on the client side. - /// - /// The Load family of methods is used to load a suite of tests from one or more - /// assemblies, returning the resulting test suite to the caller. - /// - /// The CountTestCases family of methods returns the number of test cases in the - /// loaded suite, either in its entirety or by taking a subset of tests as roots. - /// - /// The Run family of methods performs a test run synchronously, returning a TestResult - /// or TestResult[] to the caller. If provided, an EventListener interface will be - /// notified of significant events in the running of the tests. - /// - /// The RunTest family of methods uses the same set of signatures as Run but operates - /// asynchronously. The final result of the run may be obtained through the user of an - /// EventListener or through the Results property. - /// - public interface TestRunner - { - #region Properties - - /// - /// IsTestRunning indicates whether a test is in progress. MayTo retrieve the - /// results from an asynchronous test run, wait till IsTestRunning is false. - /// - // bool IsTestRunning - // { - // get; - // } - - Version FrameworkVersion - { - get; - } - - /// - /// Setting to show a header line for each test case in - /// the console output. - /// - bool DisplayTestLabels - { - get; set; - } - - /// - /// Results from the last test run - /// - TestResult[] Results - { - get; - } - - /// - /// First (or only) result from the last test run - /// - TestResult Result - { - get; - } - - #endregion - - /// - /// Load all tests from an assembly - /// - /// The assembly from which tests are to be loaded - Test Load( string assemblyName ); - - /// - /// Load a particular test in an assembly - /// - /// The assembly from which tests are to be loaded - /// The name of the test fixture or suite to be loaded - Test Load( string assemblyName, string testName ); - - /// - /// Load multiple assemblies - /// - /// The project name to use for the root test node - /// The assemblies from which tests are to be loaded - Test Load( string projectName, string[] assemblies ); - - /// - /// Load a particular test in a set of assemblies - /// - /// The project name to use for the root test node - /// The assemblies from which tests are to be loaded - /// The name of the test fixture or suite to be loaded - Test Load( string projectName, string[] assemblies, string testName ); - - /// - /// Unload all tests previously loaded - /// - void Unload(); - - void SetFilter( IFilter filter ); - - /// - /// Count test cases previously loaded - /// - /// The number of test cases found - int CountTestCases(); - - /// - /// Count Test Cases under a given test name - /// - /// The name of a test case, fixture or suite - /// The number of test cases found - int CountTestCases(string testName ); - - /// - /// Count test cases starting at a set of roots - /// - /// An array of names of test cases, fixtures or suites - /// The number of test cases found - int CountTestCases(string[] testNames); - - /// - /// Get the collectiion of categories used by the runner; - /// - /// - ICollection GetCategories(); - - /// - /// Run the loaded tests using a test filter - /// -// TestResult Run(NUnit.Core.EventListener listener, IFilter filter); - - /// - /// Run all loaded tests and return a test result. The test is run synchronously, - /// and the listener interface is notified as it progresses. - /// - /// Interface to receive EventListener notifications. - TestResult Run(NUnit.Core.EventListener listener); - - /// - /// Run a particular loaded test and return a test result. The test is run - /// synchronously and the listener interface is notified as it progresses. - /// - /// Interface to receive EventListener notifications - /// The name of the test case, fixture or suite to be run - TestResult Run(NUnit.Core.EventListener listener, string testName); - - /// - /// Run a set of loaded tests and return a set of results. The test is run - /// synchronously and the listener interface is notified as it progresses. - /// - /// Interface to receive EventListener notifications - /// The names of the test cases, fixtures or suites to be run - TestResult[] Run(NUnit.Core.EventListener listener, string[] testNames); - - /// - /// Run all loaded tests. The test is run asynchronously and the listener - /// interface is notified as it progresses. - /// - /// Interface to an object to receive EventListener notifications - void RunTest(NUnit.Core.EventListener listener); - - /// - /// Run a particular loaded test. The test is run asynchronously and the - /// listener interface is notified as it progresses. - /// - /// Interface to an object to receive EventListener notifications - /// The name of the test case, fixture or suite to be run - void RunTest(NUnit.Core.EventListener listener, string testName); - - /// - /// Run a set of loaded tests. The tests are run asynchronously and the - /// listener interface is notified as it progresses. - /// - /// Interface to an object to receive EventListener notifications - /// The names of the test cases, fixtures or suites to be run - void RunTest(NUnit.Core.EventListener listener, string[] testNames); - - void CancelRun(); - - void Wait(); - } -} diff --git a/mcs/nunit20/core/TestRunnerThread.cs b/mcs/nunit20/core/TestRunnerThread.cs deleted file mode 100644 index 9205d7134b4..00000000000 --- a/mcs/nunit20/core/TestRunnerThread.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System; -using System.IO; -using System.Threading; -using System.Configuration; -using System.Collections.Specialized; - -namespace NUnit.Core -{ - /// - /// Summary description for TestRunnerThread. - /// - public class TestRunnerThread - { - #region Private Fields - - /// - /// The Test runner to be used in running tests on the thread - /// - private TestRunner runner; - - /// - /// The System.Threading.Thread created by the object - /// - private Thread thread; - - /// - /// Collection of TestRunner settings from the config file - /// - private NameValueCollection settings; - - /// - /// The exception that terminated a test run - /// - private Exception lastException; - - /// - /// The EventListener interface to receive test events - /// - private NUnit.Core.EventListener listener; - - /// - /// Array of test names for ues by the thread proc - /// - private string[] testNames; - - /// - /// Array of returned results - /// - private TestResult[] results; - - #endregion - - #region Properties - - /// - /// Array of returned results - /// - public TestResult[] Results - { - get { return results; } - } - - #endregion - - #region Constructor - - public TestRunnerThread( TestRunner runner ) - { - this.runner = runner; - this.thread = new Thread( new ThreadStart( TestRunnerThreadProc ) ); - - this.settings = (NameValueCollection) - ConfigurationSettings.GetConfig( "NUnit/TestRunner" ); - - try - { - string apartment = (string)settings["ApartmentState"]; - if ( apartment == "STA" ) - thread.ApartmentState = ApartmentState.STA; - else if ( apartment == "MTA" ) - thread.ApartmentState = ApartmentState.MTA; - - string priority = (string)settings["ThreadPriority"]; - if ( priority != null ) - thread.Priority = (ThreadPriority) - System.Enum.Parse( typeof( ThreadPriority ), priority, true ); - } - catch - { - // Ignore any problems for now - test will run using default settings - } - } - - #endregion - - #region Public Methods - - public void Wait() - { - if ( this.thread.IsAlive ) - this.thread.Join(); - } - - public void Cancel() - { - this.thread.Abort(); - this.thread.Join(); - } - - public void Run( EventListener listener ) - { - this.listener = listener; - - thread.Start();} - - public void Run( EventListener listener, string testName ) - { - this.listener = listener; - this.testNames = new string[] { testName }; - - thread.Start(); } - - public void Run( EventListener listener, string[] testNames ) - { - this.listener = listener; - this.testNames = testNames; - - thread.Start(); - } - - #endregion - - #region Thread Proc - - /// - /// The thread proc for our actual test run - /// - private void TestRunnerThreadProc() - { - try - { - //TODO: do we need a run started event? - - results = runner.Run(listener, testNames ); - - //TODO: do we need a run finished event? - } - catch( Exception exception ) - { - lastException = exception; - //TODO: do we need a run finished event? - } - finally - { - testNames = null; // Do we need this? - //runningThread = null; // Ditto - } - } - - #endregion - } -} diff --git a/mcs/nunit20/core/TestSuite.cs b/mcs/nunit20/core/TestSuite.cs deleted file mode 100644 index bfe27f8e7da..00000000000 --- a/mcs/nunit20/core/TestSuite.cs +++ /dev/null @@ -1,275 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Collections; - using System.Reflection; - using System.Text; - - /// - /// Summary description for TestSuite. - /// - /// - [Serializable] - public class TestSuite : Test - { - private static readonly string EXPLICIT_SELECTION_REQUIRED = "Explicit selection required"; - - #region Fields - - /// - /// Our collection of child tests - /// - private ArrayList tests = new ArrayList(); - - /// - /// The fixture setup method for this suite - /// - protected MethodInfo fixtureSetUp; - - /// - /// The fixture teardown method for this suite - /// - protected MethodInfo fixtureTearDown; - - /// - /// True if the fixture has been set up - /// - private bool isSetUp; - - #endregion - - #region Constructors - - public TestSuite( string name ) : this( name, 0 ) { } - - public TestSuite( string name, int assemblyKey ) - : base( name, assemblyKey ) - { - ShouldRun = true; - } - - public TestSuite( string parentSuiteName, string name ) - : this( parentSuiteName, name, 0 ) { } - - public TestSuite( string parentSuiteName, string name, int assemblyKey ) - : base( parentSuiteName, name, assemblyKey ) - { - ShouldRun = true; - } - - public TestSuite( Type fixtureType ) : base( fixtureType, 0 ) { } - - public TestSuite( Type fixtureType, int assemblyKey ) : base( fixtureType, assemblyKey ) { } - - protected TestSuite( object fixture ) : base( fixture, 0 ) { } - - protected TestSuite( object fixture, int assemblyKey ) : base( fixture, assemblyKey ) { } - - #endregion - - public void Sort() - { - this.Tests.Sort(); - - foreach( Test test in Tests ) - { - TestSuite suite = test as TestSuite; - if ( suite != null ) - suite.Sort(); - } - } - - public void Add( Test test ) - { - if(test.ShouldRun) - { - test.ShouldRun = ShouldRun; - test.IgnoreReason = IgnoreReason; - } - test.Parent = this; - tests.Add(test); - } - - //Keep this in for testing for the time being - public void Add( object fixture ) - { - Add( new TestFixture( fixture ) ); - } - - #region Properties - - public override ArrayList Tests - { - get { return tests; } - } - - public override bool IsSuite - { - get { return true; } - } - - public override bool IsTestCase - { - get { return false; } - } - - public bool IsSetUp - { - get { return isSetUp; } - set { isSetUp = value; } - } - - #endregion - - /// - /// True if this is a fixture. May populate the test's - /// children as a side effect. - /// TODO: An easier way to tell this? - /// - public override bool IsFixture - { - get - { - // We have no way of constructing an empty suite unless it's a fixture - if ( Tests.Count == 0 ) return true; - - // Any suite with children is a fixture if the children are test cases - Test firstChild = (Test)Tests[0]; - return !firstChild.IsSuite; - } - } - - public override int CountTestCases() - { - int count = 0; - - foreach(Test test in Tests) - { - count += test.CountTestCases(); - } - return count; - } - - public override int CountTestCases(IFilter filter) - { - int count = 0; - - if(this.Filter(filter)) - { - foreach(Test test in Tests) - { - count += test.CountTestCases(filter); - } - } - return count; - } - - public override TestResult Run(EventListener listener) - { - return Run( listener, null ); - } - - public override TestResult Run(EventListener listener, IFilter filter) - { - TestSuiteResult suiteResult = new TestSuiteResult(this, Name); - - listener.SuiteStarted(this); - long startTime = DateTime.Now.Ticks; - - if ( ShouldRun ) - { - suiteResult.Executed = true; - DoSetUp( suiteResult ); - - RunAllTests( suiteResult, listener, filter ); - - DoTearDown( suiteResult ); - } - else - suiteResult.NotRun(this.IgnoreReason); - - long stopTime = DateTime.Now.Ticks; - double time = ((double)(stopTime - startTime)) / (double)TimeSpan.TicksPerSecond; - suiteResult.Time = time; - - listener.SuiteFinished(suiteResult); - return suiteResult; - } - - public virtual void DoSetUp( TestResult suiteResult ) - { - } - - public virtual void DoTearDown( TestResult suiteResult ) - { - } - - protected virtual void RunAllTests( - TestSuiteResult suiteResult, EventListener listener, IFilter filter ) - { - foreach(Test test in ArrayList.Synchronized(Tests)) - { - bool saveShouldRun = test.ShouldRun; - - if (test.ShouldRun) - { - if (this.ShouldRun == false) - { - test.ShouldRun = false; - test.IgnoreReason = this.IgnoreReason; - } - else if ( test.IsExplicit && filter == null ) - { - test.ShouldRun = false; - test.IgnoreReason = EXPLICIT_SELECTION_REQUIRED; - } - } - - if ( filter == null || test.Filter( filter ) ) - { - suiteResult.AddResult( test.Run( listener, filter ) ); - } - - if ( saveShouldRun && !test.ShouldRun ) - { - test.ShouldRun = true; - test.IgnoreReason = null; - } - } - } - - public override bool Filter(IFilter filter) - { - return filter.Pass(this); - } - } -} diff --git a/mcs/nunit20/core/TestSuiteBuilder.cs b/mcs/nunit20/core/TestSuiteBuilder.cs deleted file mode 100644 index f48d5821767..00000000000 --- a/mcs/nunit20/core/TestSuiteBuilder.cs +++ /dev/null @@ -1,352 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.IO; - using System.Reflection; - using System.Collections; - - /// - /// Summary description for TestSuiteBuilder. - /// - public class TestSuiteBuilder - { - #region Private Fields - - /// - /// Hashtable of all test suites we have created to represent namespaces. - /// Used to locate namespace parent suites for fixtures. - /// - Hashtable namespaceSuites = new Hashtable(); - - /// - /// The root of the test suite being created by this builder. This - /// may be a simple TestSuite, an AssemblyTestSuite or a RootTestSuite - /// encompassing multiple assemblies. - /// - TestSuite rootSuite; - - /// - /// The version of the nunit framework referenced by the loaded assembly. - /// - Version frameworkVersion = null; - - #endregion - - #region Properties - - public Version FrameworkVersion - { - get { return frameworkVersion; } - } - - #endregion - - #region Public Methods - - public Assembly Load(string assemblyName) - { - // Change currentDirectory in case assembly references unmanaged dlls - string currentDirectory = Environment.CurrentDirectory; - string assemblyDirectory = Path.GetDirectoryName( assemblyName ); - bool swap = assemblyDirectory != null && assemblyDirectory != string.Empty; - - try - { - if ( swap ) - Environment.CurrentDirectory = assemblyDirectory; - -#if !TARGET_JVM - Assembly assembly = AppDomain.CurrentDomain.Load(Path.GetFileNameWithoutExtension(assemblyName)); -#else - Assembly assembly = Assembly.Load(Path.GetFileNameWithoutExtension(assemblyName)); -#endif - - foreach( AssemblyName refAssembly in assembly.GetReferencedAssemblies() ) - { - if ( refAssembly.Name == "nunit.framework" ) - this.frameworkVersion = refAssembly.Version; - } - - return assembly; - } - finally - { - if ( swap ) - Environment.CurrentDirectory = currentDirectory; - } - } - - public TestSuite Build(string projectName, IList assemblies) - { - RootTestSuite rootSuite = new RootTestSuite( projectName ); - - int assemblyKey = 0; - foreach(string assembly in assemblies) - { - TestSuite suite = Build( assembly, assemblyKey++ ); - rootSuite.Add( suite ); - } - - return rootSuite; - } - - public TestSuite Build( string assemblyName ) - { - return Build( assemblyName, 0 ); - } - - public TestSuite Build(string assemblyName, string testName ) - { - TestSuite suite = null; - - Assembly assembly = Load(assemblyName); - - if(assembly != null) - { - Type testType = assembly.GetType(testName); - if( testType != null ) - return MakeSuite( testType ); - - // Assume that testName is a namespace - string prefix = testName + '.'; - -#if !TARGET_JVM - Type[] testTypes = assembly.GetExportedTypes(); -#else - Type[] testTypes = GetAssemblyExportedTypes(assembly); -#endif - int testFixtureCount = 0; - - foreach(Type type in testTypes) - { - if( CanMakeSuite( type ) && type.Namespace != null ) - { - if( type.Namespace == testName || type.Namespace.StartsWith(prefix) ) - { - suite = BuildFromNameSpace(testName, 0); - - //suite.Add( new TestFixture( type ) ); - suite.Add( MakeSuite( type ) ); - testFixtureCount++; - } - } - } - - return testFixtureCount == 0 ? null : rootSuite; - } - - return suite; - } - - public TestSuite Build( IList assemblies, string testName ) - { - TestSuite suite = null; - - foreach(string assemblyName in assemblies) - { - suite = Build( assemblyName, testName ); - if ( suite != null ) break; - } - - return suite; - } - - // TODO: Only used in tests - public object BuildTestFixture( Type fixtureType ) - { - Reflect.CheckFixtureType( fixtureType ); - - object testFixture; - ConstructorInfo ctor = Reflect.GetConstructor( fixtureType ); - - try - { - testFixture = ctor.Invoke( Type.EmptyTypes ); - } - catch( Exception ex ) - { - throw new InvalidTestFixtureException( ctor.Name + " threw a exception", ex ); - } - - if(testFixture == null) throw new InvalidTestFixtureException(ctor.Name + " cannot be invoked"); - - return testFixture; - } - - #endregion - - #region Nested TypeFilter Class - - private class TypeFilter - { - private string rootNamespace; - - TypeFilter( string rootNamespace ) - { - this.rootNamespace = rootNamespace; - } - - public bool Include( Type type ) - { - if ( type.Namespace == rootNamespace ) - return true; - - return type.Namespace.StartsWith( rootNamespace + '.' ); - } - } - - #endregion - - #region Helper Methods - - private TestSuite BuildFromNameSpace( string nameSpace, int assemblyKey ) - { - if( nameSpace == null || nameSpace == "" ) return rootSuite; - TestSuite suite = (TestSuite)namespaceSuites[nameSpace]; - if(suite!=null) return suite; - - int index = nameSpace.LastIndexOf("."); - string prefix = string.Format( "[{0}]", assemblyKey ); - if( index == -1 ) - { - suite = new NamespaceSuite( nameSpace, assemblyKey ); - if ( rootSuite == null ) - rootSuite = suite; - else - rootSuite.Add(suite); - namespaceSuites[nameSpace]=suite; - } - else - { - string parentNameSpace = nameSpace.Substring( 0,index ); - TestSuite parent = BuildFromNameSpace( parentNameSpace, assemblyKey ); - string suiteName = nameSpace.Substring( index+1 ); - suite = new NamespaceSuite( parentNameSpace, suiteName, assemblyKey ); - parent.Add( suite ); - namespaceSuites[nameSpace] = suite; - } - - return suite; - } - - private TestSuite Build( string assemblyName, int assemblyKey ) - { - TestSuiteBuilder builder = new TestSuiteBuilder(); - - Assembly assembly = Load( assemblyName ); - - builder.rootSuite = new AssemblyTestSuite( assemblyName, assemblyKey ); - int testFixtureCount = 0; -#if !TARGET_JVM - Type[] testTypes = assembly.GetExportedTypes(); -#else - Type[] testTypes = GetAssemblyExportedTypes(assembly); -#endif - foreach(Type testType in testTypes) - { - if( CanMakeSuite( testType ) ) - { - testFixtureCount++; - string namespaces = testType.Namespace; - TestSuite suite = builder.BuildFromNameSpace( namespaces, assemblyKey ); - - //suite.Add( new TestFixture( testType ) ); - suite.Add( MakeSuite( testType ) ); - } - } - - if(testFixtureCount == 0) - { - builder.rootSuite.ShouldRun = false; - builder.rootSuite.IgnoreReason = "Has no TestFixtures"; - } - - return builder.rootSuite; - } - -#if TARGET_JVM - private Type[] GetAssemblyExportedTypes(Assembly assembly) - { - Type[] allTypes = null; - try - { - allTypes = assembly.GetTypes(); - } - catch (Exception e) - { - System.Console.WriteLine("ReflectionTypeLoadException error"); - } - ArrayList tmpTestTypes = new ArrayList(allTypes.Length); - foreach(Type current in allTypes) - { - if (current.IsPublic || current.IsNestedPublic) - { - tmpTestTypes.Add(current); - } - } - return (Type[])tmpTestTypes.ToArray(typeof(Type)); - } -#endif - /// - /// Helper routine that makes a suite from either a TestFixture or - /// a legacy Suite property. - /// - /// - /// - private TestSuite MakeSuite( Type testType ) - { - TestSuite suite = null; - - if(testType != null) - { - if( TestFixture.IsValidType( testType ) ) - { - suite = new TestFixture( testType ); - } - else if( LegacySuite.IsValidType( testType ) ) - { - suite = new LegacySuite( testType ); - } - } - - return suite; - } - - private bool CanMakeSuite( Type testType ) - { - //return TestFixture.IsValidType( testType ) || LegacySuite.IsValidType( testType ); - return TestFixture.IsValidType( testType ); - } - } - - #endregion -} diff --git a/mcs/nunit20/core/TestSuiteResult.cs b/mcs/nunit20/core/TestSuiteResult.cs deleted file mode 100644 index a6257c04e25..00000000000 --- a/mcs/nunit20/core/TestSuiteResult.cs +++ /dev/null @@ -1,111 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Core -{ - using System; - using System.Collections; - - /// - /// TestSuiteResult - /// - /// - [Serializable] - public class TestSuiteResult : TestResult - { - private ArrayList results = new ArrayList(); - - public TestSuiteResult(ITest test, string name) : base(test, name) - { - Executed = false; - } - - public void AddResult(TestResult result) - { - results.Add(result); - } - - public override bool IsSuccess - { - get - { - bool result = true; - foreach(TestResult testResult in results) - result &= testResult.IsSuccess; - return result; - } - } - - /// - /// A suite is considered as failing if it is marked as a failure - usually - /// because TestFixtureSetUp or TestFixtureTearDown failed - or if one of the - /// tests it contains failed. - /// - public override bool IsFailure - { - get - { - if ( base.IsFailure ) - return true; - - foreach(TestResult testResult in results) - if ( testResult.IsFailure ) - return true; - - return false; - } - } - - public override bool AllTestsExecuted - { - get - { - if (!this.Executed) - return false; - - foreach( TestResult testResult in results ) - { - if ( !testResult.AllTestsExecuted ) - return false; - } - return true; - } - } - - public IList Results - { - get { return results; } - } - - public override void Accept(ResultVisitor visitor) - { - visitor.Visit(this); - } - } -} diff --git a/mcs/nunit20/core/WarningSuite.cs b/mcs/nunit20/core/WarningSuite.cs deleted file mode 100644 index 34afcd613bc..00000000000 --- a/mcs/nunit20/core/WarningSuite.cs +++ /dev/null @@ -1,61 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Core -{ - /// - /// Summary description for WarningSuite. - /// - public class WarningSuite : TestSuite - { - public WarningSuite(string name) : base(name) - { - ShouldRun=false; - } - - public WarningSuite(string parentName, string name) : base(parentName,name) - { - ShouldRun=false; - } - - protected internal override void Add(Test test) - { - base.Add(test); - test.ShouldRun = false; - test.IgnoreReason = "Containing Suite cannot be run"; - } - - protected internal override TestSuite CreateNewSuite(Type type) - { - return new WarningSuite(type.Namespace,type.Name); - } - } -} diff --git a/mcs/nunit20/core/nunit.core.build b/mcs/nunit20/core/nunit.core.build deleted file mode 100755 index e41c5ad13dd..00000000000 --- a/mcs/nunit20/core/nunit.core.build +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/core/nunit.core.dll.J2EE.vmwcsproj b/mcs/nunit20/core/nunit.core.dll.J2EE.vmwcsproj deleted file mode 100644 index 8a22c1600d5..00000000000 --- a/mcs/nunit20/core/nunit.core.dll.J2EE.vmwcsproj +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/core/nunit.core.dll.csproj b/mcs/nunit20/core/nunit.core.dll.csproj deleted file mode 100755 index c74369099ad..00000000000 --- a/mcs/nunit20/core/nunit.core.dll.csproj +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/core/nunit.core.dll.sources b/mcs/nunit20/core/nunit.core.dll.sources deleted file mode 100644 index cc89157931e..00000000000 --- a/mcs/nunit20/core/nunit.core.dll.sources +++ /dev/null @@ -1,40 +0,0 @@ -./AssemblyInfo.cs -./CategoryFilter.cs -./CategoryManager.cs -./EmptyFilter.cs -./EventListener.cs -./ExpectedExceptionTestCase.cs -./Filter.cs -./InvalidSuiteException.cs -./InvalidTestFixtureException.cs -./ITest.cs -./ITestEvents.cs -./LegacySuite.cs -./LongLivingMarshalByRefObject.cs -./NamespaceSuite.cs -./NameFilter.cs -./NormalTestCase.cs -./NoTestFixturesException.cs -./NotRunnableTestCase.cs -./NullListener.cs -./NunitException.cs -./Reflect.cs -./RemoteTestRunner.cs -./ResultVisitor.cs -./RootTestSuite.cs -./StringTextWriter.cs -./TemplateTestCase.cs -./TestAssembly.cs -./TestCaseBuilder.cs -./TestCase.cs -./TestCaseResult.cs -./Test.cs -./TestEventArgs.cs -./TestEventDispatcher.cs -./TestFixture.cs -./TestResult.cs -./TestRunner.cs -./TestRunnerThread.cs -./TestSuiteBuilder.cs -./TestSuite.cs -./TestSuiteResult.cs diff --git a/mcs/nunit20/core/nunit.core.dll20.J2EE.csproj b/mcs/nunit20/core/nunit.core.dll20.J2EE.csproj deleted file mode 100644 index 1d6c1cac110..00000000000 --- a/mcs/nunit20/core/nunit.core.dll20.J2EE.csproj +++ /dev/null @@ -1,172 +0,0 @@ - - - bin\Release_Java20\ - TRACE;TARGET_JVM;NET_1_1;NET_2_0 - 285212672 - true - pdbonly - AnyCPU - prompt - false - false - 1 - false - - - - - 2.0 - 1.5.0_05 - 0 - - - true - bin\Debug_Java20\ - TRACE;DEBUG;TARGET_JVM;NET_1_1;NET_2_0 - 285212672 - full - AnyCPU - prompt - True - False - 1 - false - - - - - 2.0 - 1.5.0_05 - 0 - - - Debug_Java - AnyCPU - 8.0.50727 - 2.0 - {995DE32D-06AB-4926-97FF-565B9205D5F8} - Library - Properties - NUnit.Core - nunit.core - 1.5.0_05 - 1 - 2.0 - {F6B19D50-1E2E-4e87-ADFB-10393B439DE0};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - true - full - false - bin\Debug_Java\ - TRACE;DEBUG;TARGET_JVM;NET_1_1;ONLY_1_1 - prompt - 4 - 285212672 - false - True - False - 0 - - - - - pdbonly - true - bin\Release_Java\ - TRACE;TARGET_JVM;NET_1_1;ONLY_1_1 - prompt - 4 - 285212672 - false - false - false - 0 - - - - - - False - ..\..\class\lib\J2SE.Helpers.dll - - - False - ..\..\class\lib\rt.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - - - - - - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC} - nunit.framework.dll20.J2EE - - - - - - - - - - - diff --git a/mcs/nunit20/core/nunit.core.dll20.csproj b/mcs/nunit20/core/nunit.core.dll20.csproj deleted file mode 100644 index 3fdc6b191bc..00000000000 --- a/mcs/nunit20/core/nunit.core.dll20.csproj +++ /dev/null @@ -1,245 +0,0 @@ - - - Local - 8.0.50727 - 2.0 - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3} - Debug - AnyCPU - - - - - nunit.core - - - JScript - Grid - IE50 - false - Library - NUnit.Core - OnBuildSuccess - - - - - - - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;StronglyNamedAssembly - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - bin\Release\ - false - 285212672 - false - - - TRACE;StronglyNamedAssembly - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - bin\Debug\ - false - 285212672 - false - - - DEBUG;TRACE;StronglyNamedAssembly - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - - System - - - System.XML - - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - Results.xsd - - - - - {83DD7E12-A705-4DBA-9D71-09C8973D9382} - nunit.framework.dll20 - - - - - - - - - - \ No newline at end of file diff --git a/mcs/nunit20/framework/.cvsignore b/mcs/nunit20/framework/.cvsignore deleted file mode 100644 index 53c46fd08c5..00000000000 --- a/mcs/nunit20/framework/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -*.dll -semantic.cache diff --git a/mcs/nunit20/framework/AssemblyInfo.cs b/mcs/nunit20/framework/AssemblyInfo.cs deleted file mode 100644 index c4d4d85d98d..00000000000 --- a/mcs/nunit20/framework/AssemblyInfo.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; - -#if !TARGET_JVM -[assembly: CLSCompliant(true)] -#endif -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - - -[assembly: AssemblyVersion("2.2.0.0")] - - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -#if !StronglyNamedAssembly -[assembly: AssemblyDelaySign(false)] -#else -[assembly: AssemblyKeyFile("../../../nunit.key")] -[assembly: AssemblyKeyName("")] -#endif diff --git a/mcs/nunit20/framework/Assert.cs b/mcs/nunit20/framework/Assert.cs deleted file mode 100644 index 8fcc5742e7f..00000000000 --- a/mcs/nunit20/framework/Assert.cs +++ /dev/null @@ -1,781 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.ComponentModel; - -namespace NUnit.Framework -{ - /// - /// A set of Assert methods - /// - public class Assert - { - private static int counter = 0; - - /// - /// Gets the number of assertions executed so far and - /// resets the counter to zero. - /// - public static int Counter - { - get - { - int cnt = counter; - counter = 0; - return cnt; - } - } - - /// - /// A private constructor disallows any instances of this object. - /// - private Assert() - {} - - /// - /// Asserts that a condition is true. If the condition is false the method throws - /// an . - /// - /// The evaluated condition - /// The message to display if the condition is false - /// Arguments to be used in formatting the message - static public void IsTrue(bool condition, string message, params object[] args) - { - ++counter; - if (!condition) - Assert.Fail(message, args); - } - - /// - /// Asserts that a condition is true. If the condition is false the method throws - /// an . - /// - /// The evaluated condition - /// The message to display if the condition is false - static public void IsTrue(bool condition, string message) - { - Assert.IsTrue(condition, message, null); - } - - /// - /// Asserts that a condition is true. If the condition is false the method throws - /// an . - /// - /// The evaluated condition - static public void IsTrue(bool condition) - { - Assert.IsTrue(condition, string.Empty, null); - } - - /// - /// Asserts that a condition is false. If the condition is true the method throws - /// an . - /// - /// The evaluated condition - /// The message to display if the condition is true - /// Arguments to be used in formatting the message - static public void IsFalse(bool condition, string message, params object[] args) - { - ++counter; - if (condition) - Assert.Fail(message, args); - } - - /// - /// Asserts that a condition is false. If the condition is true the method throws - /// an . - /// - /// The evaluated condition - /// The message to display if the condition is true - static public void IsFalse(bool condition, string message) - { - Assert.IsFalse( condition, message, null ); - } - - /// - /// Asserts that a condition is false. If the condition is true the method throws - /// an . - /// - /// The evaluated condition - static public void IsFalse(bool condition) - { - Assert.IsFalse(condition, string.Empty, null); - } - - /// - /// Verifies that two doubles are equal considering a delta. If the - /// expected value is infinity then the delta value is ignored. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - /// The maximum acceptable difference between the - /// the expected and the actual - /// The message that will be printed on failure - /// Arguments to be used in formatting the message - static public void AreEqual(double expected, - double actual, double delta, string message, params object[] args) - { - ++counter; - // handle infinity specially since subtracting two infinite values gives - // NaN and the following test fails. mono also needs NaN to be handled - // specially although ms.net could use either method. - if (double.IsInfinity(expected) || double.IsNaN(expected) || double.IsNaN(actual)) - { - if (!(expected == actual)) - Assert.FailNotEquals(expected, actual, message, args); - } - else if (!(Math.Abs(expected-actual) <= delta)) - Assert.FailNotEquals(expected, actual, message, args); - } - - /// - /// Verifies that two doubles are equal considering a delta. If the - /// expected value is infinity then the delta value is ignored. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - /// The maximum acceptable difference between the - /// the expected and the actual - /// The message that will be printed on failure - static public void AreEqual(double expected, - double actual, double delta, string message) - { - Assert.AreEqual( expected, actual, delta, message, null ); - } - - /// - /// Verifies that two doubles are equal considering a delta. If the - /// expected value is infinity then the delta value is ignored. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - /// The maximum acceptable difference between the - /// the expected and the actual - static public void AreEqual(double expected, double actual, double delta) - { - Assert.AreEqual(expected, actual, delta, string.Empty, null); - } - - /// - /// Verifies that two floats are equal considering a delta. If the - /// expected value is infinity then the delta value is ignored. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - /// The maximum acceptable difference between the - /// the expected and the actual - /// The message printed out upon failure - /// Arguments to be used in formatting the message - static public void AreEqual(float expected, - float actual, float delta, string message, params object[] args) - { - ++counter; - // handle infinity specially since subtracting two infinite values gives - // NaN and the following test fails. mono also needs NaN to be handled - // specially although ms.net could use either method. - if (float.IsInfinity(expected) || float.IsNaN(expected) || float.IsNaN(actual)) - { - if (!(expected == actual)) - Assert.FailNotEquals(expected, actual, message, args); - } - else if (!(Math.Abs(expected-actual) <= delta)) - Assert.FailNotEquals(expected, actual, message, args); - } - - /// - /// Verifies that two floats are equal considering a delta. If the - /// expected value is infinity then the delta value is ignored. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - /// The maximum acceptable difference between the - /// the expected and the actual - /// The message printed out upon failure - static public void AreEqual(float expected, float actual, float delta, string message) - { - Assert.AreEqual(expected, actual, delta, message, null); - } - - /// - /// Verifies that two floats are equal considering a delta. If the - /// expected value is infinity then the delta value is ignored. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - /// The maximum acceptable difference between the - /// the expected and the actual - static public void AreEqual(float expected, float actual, float delta) - { - Assert.AreEqual(expected, actual, delta, string.Empty, null); - } - - /// - /// Verifies that two decimals are equal. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - /// The message printed out upon failure - /// Arguments to be used in formatting the message - static public void AreEqual(decimal expected, decimal actual, string message, params object[] args) - { - ++counter; - if(!(expected == actual)) - Assert.FailNotEquals(expected, actual, message, args); - } - - /// - /// Verifies that two decimals are equal. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - /// The message printed out upon failure - static public void AreEqual(decimal expected, decimal actual, string message) - { - Assert.AreEqual(expected, actual, message, null); - } - - /// - /// Verifies that two decimals are equal. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - static public void AreEqual(decimal expected, decimal actual) - { - Assert.AreEqual(expected, actual, string.Empty, null); - } - - /// - /// Verifies that two ints are equal. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - /// The message printed out upon failure - /// Arguments to be used in formatting the message - static public void AreEqual(int expected, int actual, string message, params object[] args) - { - ++counter; - if(!(expected == actual)) - Assert.FailNotEquals(expected, actual, message, args); - } - - /// - /// Verifies that two ints are equal. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - /// The message printed out upon failure - static public void AreEqual(int expected, int actual, string message) - { - Assert.AreEqual(expected, actual, message, null); - } - - /// - /// Verifies that two ints are equal. If - /// they are not equals then an is - /// thrown. - /// - /// The expected value - /// The actual value - static public void AreEqual(int expected, int actual) - { - Assert.AreEqual(expected, actual, string.Empty, null); - } - - /// - /// Verifies that two arrays are equal. If they are not, - /// then an is thrown. - /// - /// The expected value - /// The actual value - /// The message printed out upon failure - /// Arguments to be used in formatting the message - static public void AreEqual( System.Array expected, System.Array actual, string message, params object[] args ) - { - ++counter; - - if ( expected == null && actual == null ) return; - - if ( expected == null || actual == null ) - Assert.FailNotEquals( expected, actual, message, args ); - - if ( expected.Rank != actual.Rank ) - Assert.FailNotEquals( expected, actual, message, args ); - - if ( expected.Rank != 1 ) - Assert.Fail( "Multi-dimension array comparison is not supported" ); - - int iLength = Math.Min( expected.Length, actual.Length ); - for( int i = 0; i < iLength; i++ ) - if ( !ObjectsEqual( expected.GetValue( i ), actual.GetValue( i ) ) ) - { - Assert.FailArraysNotEqual(i, expected, actual, message, args ); - } - - if ( expected.Length != actual.Length ) - Assert.FailArraysNotEqual( iLength, expected, actual, message, args ); - - return; - } - - /// - /// Verifies that two arrays are equal. If they are not, - /// then an is thrown. - /// - /// The expected value - /// The actual value - /// The message printed out upon failure - static public void AreEqual( System.Array expected, System.Array actual, string message ) - { - Assert.AreEqual( expected, actual, message, null ); - } - - /// - /// Verifies that two arrays are equal. If they are not, - /// then an is thrown. - /// - /// The expected value - /// The actual value - static public void AreEqual( System.Array expected, System.Array actual ) - { - Assert.AreEqual( expected, actual, string.Empty, null ); - } - - /// - /// Verifies that two objects are equal. Two objects are considered - /// equal if both are null, or if both have the same value. All - /// non-numeric types are compared by using the Equals method. - /// Arrays are compared by comparing each element using the same rules. - /// If they are not equal an is thrown. - /// - /// The value that is expected - /// The actual value - /// The message to display if objects are not equal - /// Arguments to be used in formatting the message - static public void AreEqual(Object expected, Object actual, string message, params object[] args) - { - if ( expected == null && actual == null ) return; - if ( expected == null || actual == null ) - Assert.FailNotEquals( expected, actual, message, args ); - - // FOr now, dynamically call array assertion if necessary. Try to move - // this into the ObjectsEqual method later on. - if ( expected.GetType().IsArray && actual.GetType().IsArray ) - Assert.AreEqual( (System.Array)expected, (System.Array)actual, message, args ); - else - { - ++counter; - - if ( !ObjectsEqual( expected, actual ) ) - Assert.FailNotEquals( expected, actual, message, args ); - } - } - - /// - /// Verifies that two objects are equal. Two objects are considered - /// equal if both are null, or if both have the same value. All - /// non-numeric types are compared by using the Equals method. - /// If they are not equal an is thrown. - /// - /// The value that is expected - /// The actual value - /// The message to display if objects are not equal - static public void AreEqual(Object expected, Object actual, string message) - { - Assert.AreEqual(expected, actual, message, null); - } - - /// - /// Verifies that two objects are equal. Two objects are considered - /// equal if both are null, or if both have the same value. All - /// non-numeric types are compared by using the Equals method. - /// If they are not equal an is thrown. - /// - /// The value that is expected - /// The actual value - static public void AreEqual(Object expected, Object actual) - { - Assert.AreEqual(expected, actual, string.Empty, null); - } - - /// - /// The Equals method throws an AssertionException. This is done - /// to make sure there is no mistake by calling this function. - /// - /// - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public static new bool Equals(object a, object b) - { - throw new AssertionException("Assert.Equals should not be used for Assertions"); - } - - /// - /// override the default ReferenceEquals to throw an AssertionException. This - /// implementation makes sure there is no mistake in calling this function - /// as part of Assert. - /// - /// - /// - public static new void ReferenceEquals(object a, object b) - { - throw new AssertionException("Assert.ReferenceEquals should not be used for Assertions"); - } - - /// - /// Checks the type of the object, returning true if - /// the object is a numeric type. - /// - /// The object to check - /// true if the object is a numeric type - static protected bool IsNumericType( Object obj ) - { - if( null != obj ) - { - if( obj is byte ) return true; - if( obj is sbyte ) return true; - if( obj is decimal ) return true; - if( obj is double ) return true; - if( obj is float ) return true; - if( obj is int ) return true; - if( obj is uint ) return true; - if( obj is long ) return true; - if( obj is short ) return true; - if( obj is ushort ) return true; - - if( obj is System.Byte ) return true; - if( obj is System.SByte ) return true; - if( obj is System.Decimal ) return true; - if( obj is System.Double ) return true; - if( obj is System.Single ) return true; - if( obj is System.Int32 ) return true; - if( obj is System.UInt32 ) return true; - if( obj is System.Int64 ) return true; - if( obj is System.UInt64 ) return true; - if( obj is System.Int16 ) return true; - if( obj is System.UInt16 ) return true; - } - return false; - } - - /// - /// Used to compare two objects. Two nulls are equal and null - /// is not equal to non-null. Comparisons between the same - /// numeric types are fine (Int32 to Int32, or Int64 to Int64), - /// but the Equals method fails across different types so we - /// use ToString and compare the results. - /// - /// - /// - /// - static protected bool ObjectsEqual( Object expected, Object actual ) - { - if ( expected == null && actual == null ) return true; - if ( expected == null || actual == null ) return false; - - if( IsNumericType( expected ) && - IsNumericType( actual ) ) - { - // - // Convert to strings and compare result to avoid - // issues with different types that have the same - // value - // - string sExpected = expected.ToString(); - string sActual = actual.ToString(); - return sExpected.Equals( sActual ); - } - return expected.Equals(actual); - } - - /// - /// Verifies that the object that is passed in is not equal to null - /// If the object is not null then an - /// is thrown. - /// - /// The object that is to be tested - /// The message to be printed when the object is null - /// Arguments to be used in formatting the message - static public void IsNotNull(Object anObject, string message, params object[] args) - { - Assert.IsTrue(anObject != null, message, args); - } - - /// - /// Verifies that the object that is passed in is not equal to null - /// If the object is not null then an - /// is thrown. - /// - /// The object that is to be tested - static public void IsNotNull(Object anObject, string message) - { - Assert.IsNotNull(anObject, message, null); - } - - /// - /// Verifies that the object that is passed in is not equal to null - /// If the object is not null then an - /// is thrown. - /// - /// The object that is to be tested - static public void IsNotNull(Object anObject) - { - Assert.IsNotNull(anObject, string.Empty, null); - } - - - /// - /// Verifies that the object that is passed in is equal to null - /// If the object is null then an - /// is thrown. - /// - /// The object that is to be tested - /// The message to be printed when the object is not null - /// Arguments to be used in formatting the message - static public void IsNull(Object anObject, string message, params object[] args) - { - Assert.IsTrue(anObject == null, message, args); - } - - /// - /// Verifies that the object that is passed in is equal to null - /// If the object is null then an - /// is thrown. - /// - /// The object that is to be tested - static public void IsNull(Object anObject, string message) - { - Assert.IsNull(anObject, message, null); - } - - /// - /// Verifies that the object that is passed in is equal to null - /// If the object is null then an - /// is thrown. - /// - /// The object that is to be tested - static public void IsNull(Object anObject) - { - Assert.IsNull(anObject, string.Empty, null); - } - - - /// - /// Asserts that two objects refer to the same object. If they - /// are not the same an is thrown. - /// - /// The expected object - /// The actual object - /// The message to be printed when the two objects are not the same object. - /// Arguments to be used in formatting the message - static public void AreSame(Object expected, Object actual, string message, params object[] args) - { - ++counter; - if (object.ReferenceEquals(expected, actual)) return; - - Assert.FailNotSame(expected, actual, message, args); - } - - /// - /// Asserts that two objects refer to the same object. If they - /// are not the same an is thrown. - /// - /// The expected object - /// The actual object - /// The message to be printed when the object is null - static public void AreSame(Object expected, Object actual, string message) - { - Assert.AreSame(expected, actual, message, null); - } - - /// - /// Asserts that two objects refer to the same object. If they - /// are not the same an is thrown. - /// - /// The expected object - /// The actual object - static public void AreSame(Object expected, Object actual) - { - Assert.AreSame(expected, actual, string.Empty, null); - } - - /// - /// Throws an with the message and arguments - /// that are passed in. This is used by the other Assert functions. - /// - /// The message to initialize the with. - /// Arguments to be used in formatting the message - static public void Fail(string message, params object[] args ) - { - if (message == null) message = string.Empty; - else if ( args != null && args.Length > 0 ) - message = string.Format( message, args ); - - throw new AssertionException(message); - } - - /// - /// Throws an with the message that is - /// passed in. This is used by the other Assert functions. - /// - /// The message to initialize the with. - static public void Fail(string message) - { - Assert.Fail(message, null); - } - - /// - /// Throws an . - /// This is used by the other Assert functions. - /// - static public void Fail() - { - Assert.Fail(string.Empty, null); - } - - /// - /// Throws an with the message and arguments - /// that are passed in. This causes the test to be reported as ignored. - /// - /// The message to initialize the with. - /// Arguments to be used in formatting the message - static public void Ignore( string message, object[] args ) - { - if (message == null) message = string.Empty; - else if ( args != null && args.Length > 0 ) - message = string.Format( message, args ); - - throw new IgnoreException(message); - } - - /// - /// Throws an with the message that is - /// passed in. This causes the test to be reported as ignored. - /// - /// The message to initialize the with. - static public void Ignore( string message ) - { - Assert.Ignore( message, null ); - } - - /// - /// Throws an . - /// This causes the test to be reported as ignored. - /// - /// The message to initialize the with. - static public void Ignore() - { - Assert.Ignore( string.Empty, null ); - } - - /// - /// This method is called when two objects have been compared and found to be - /// different. This prints a nice message to the screen. - /// - /// The message that is to be printed prior to the comparison failure - /// The expected object - /// The actual object - /// Arguments to be used in formatting the message - static protected void FailNotEquals(Object expected, Object actual, string message, - params object[] args) - { - Assert.Fail( - AssertionFailureMessage.FormatMessageForFailNotEquals( - expected, - actual, - message, - args)); - } - - /// - /// This method is called when two arrays have been compared and found to be - /// different. This prints a nice message to the screen. - /// - /// The index at which the failure occured - /// The expected array - /// The actual array - /// The message that is to be printed prior to the comparison failure - /// Arguments to be used in formatting the message - static protected void FailArraysNotEqual(int index, Array expected, Array actual, - string message, params object[] args) - { - Assert.Fail( - AssertionFailureMessage.FormatMessageForFailArraysNotEqual( - index, - expected, - actual, - message, - args)); - } - - /// - /// This method is called when the two objects are not the same. - /// - /// The message to be printed on the screen - /// The expected object - /// The actual object - /// Arguments to be used in formatting the message - static protected void FailNotSame(Object expected, Object actual, string message, params object[] args) - { - string formatted = string.Empty; - if ( message != null ) - { - if (args != null && args.Length > 0 ) - formatted = string.Format( message+" ", args ); - else - formatted = message+" "; - } - - Assert.Fail(formatted+"expected same"); - } - } -} \ No newline at end of file diff --git a/mcs/nunit20/framework/Assertion.cs b/mcs/nunit20/framework/Assertion.cs deleted file mode 100644 index b1c6fe8ed63..00000000000 --- a/mcs/nunit20/framework/Assertion.cs +++ /dev/null @@ -1,190 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - - /// A set of Assert methods. - /// - [Obsolete("Use Assert class instead")] - public class Assertion - { - /// - /// Asserts that a condition is true. If it isn't it throws - /// an . - /// - /// The message to display is the condition - /// is false - /// The evaluated condition - static public void Assert(string message, bool condition) - { - NUnit.Framework.Assert.IsTrue(condition, message); - } - - /// - /// Asserts that a condition is true. If it isn't it throws - /// an . - /// - /// The evaluated condition - static public void Assert(bool condition) - { - Assertion.Assert(string.Empty, condition); - } - - /// - /// /// Asserts that two doubles are equal concerning a delta. If the - /// expected value is infinity then the delta value is ignored. - /// - /// The expected value - /// The actual value - /// The maximum acceptable difference between the - /// the expected and the actual - static public void AssertEquals(double expected, double actual, double delta) - { - Assertion.AssertEquals(string.Empty, expected, actual, delta); - } - /// - /// /// Asserts that two singles are equal concerning a delta. If the - /// expected value is infinity then the delta value is ignored. - /// - /// The expected value - /// The actual value - /// The maximum acceptable difference between the - /// the expected and the actual - static public void AssertEquals(float expected, float actual, float delta) - { - Assertion.AssertEquals(string.Empty, expected, actual, delta); - } - - /// Asserts that two objects are equal. If they are not - /// an is thrown. - static public void AssertEquals(Object expected, Object actual) - { - Assertion.AssertEquals(string.Empty, expected, actual); - } - - /// Asserts that two ints are equal. If they are not - /// an is thrown. - static public void AssertEquals(int expected, int actual) - { - Assertion.AssertEquals(string.Empty, expected, actual); - } - - /// Asserts that two ints are equal. If they are not - /// an is thrown. - static public void AssertEquals(string message, int expected, int actual) - { - NUnit.Framework.Assert.AreEqual(expected, actual, message); - } - - /// Asserts that two doubles are equal concerning a delta. - /// If the expected value is infinity then the delta value is ignored. - /// - static public void AssertEquals(string message, double expected, - double actual, double delta) - { - NUnit.Framework.Assert.AreEqual(expected, actual, delta, message); - } - - /// Asserts that two floats are equal concerning a delta. - /// If the expected value is infinity then the delta value is ignored. - /// - static public void AssertEquals(string message, float expected, - float actual, float delta) - { - NUnit.Framework.Assert.AreEqual(expected, actual, delta, message); - } - - /// - /// Asserts that two objects are equal. Two objects are considered - /// equal if both are null, or if both have the same value. Numeric - /// types are compared via string comparision on their contents to - /// avoid problems comparing values between different types. All - /// non-numeric types are compared by using the Equals method. - /// If they are not equal an is thrown. - /// - static public void AssertEquals(string message, Object expected, Object actual) - { - NUnit.Framework.Assert.AreEqual(expected, actual, message); - } - - /// Asserts that an object isn't null. - static public void AssertNotNull(Object anObject) - { - NUnit.Framework.Assert.IsNotNull(anObject, string.Empty); - } - - /// Asserts that an object isn't null. - static public void AssertNotNull(string message, Object anObject) - { - NUnit.Framework.Assert.IsNotNull(anObject, message); - } - - /// Asserts that an object is null. - static public void AssertNull(Object anObject) - { - NUnit.Framework.Assert.IsNull(anObject, string.Empty); - } - - /// Asserts that an object is null. - static public void AssertNull(string message, Object anObject) - { - NUnit.Framework.Assert.IsNull(anObject, message); - } - - /// Asserts that two objects refer to the same object. If they - /// are not the same an is thrown. - /// - static public void AssertSame(Object expected, Object actual) - { - NUnit.Framework.Assert.AreSame(expected, actual, string.Empty); - } - - /// Asserts that two objects refer to the same object. - /// If they are not an is thrown. - /// - static public void AssertSame(string message, Object expected, Object actual) - { - NUnit.Framework.Assert.AreSame(expected, actual, message); - } - - /// Fails a test with no message. - static public void Fail() - { - NUnit.Framework.Assert.Fail(); - } - - /// Fails a test with the given message. - static public void Fail(string message) - { - NUnit.Framework.Assert.Fail(message); - } - } -} \ No newline at end of file diff --git a/mcs/nunit20/framework/AssertionException.cs b/mcs/nunit20/framework/AssertionException.cs deleted file mode 100644 index 8a6689b07b6..00000000000 --- a/mcs/nunit20/framework/AssertionException.cs +++ /dev/null @@ -1,68 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - using System.Runtime.Serialization; - - /// - /// Thrown when an assertion failed. - /// - /// - [Serializable] - public class AssertionException : System.Exception - { - /// - /// - /// - /// - public AssertionException (string message) : base(message) - {} - - /// - /// Standard constructor - /// - /// The error message that explains - /// the reason for the exception - /// The exception that caused the - /// current exception - public AssertionException(string message, Exception inner) : - base(message, inner) - {} - - /// - /// Serialization Constructor - /// - protected AssertionException(SerializationInfo info, - StreamingContext context) : base(info,context) - {} - - } -} diff --git a/mcs/nunit20/framework/AssertionFailureMessage.cs b/mcs/nunit20/framework/AssertionFailureMessage.cs deleted file mode 100644 index 312de6acf90..00000000000 --- a/mcs/nunit20/framework/AssertionFailureMessage.cs +++ /dev/null @@ -1,758 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig, Douglas de la Torre -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' Copyright 2001 Douglas de la Torre -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov -' Copyright 2000-2002 Philip A. Craig, or Copyright 2001 Douglas de la Torre -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Text; - -namespace NUnit.Framework -{ - /// - /// Summary description for AssertionFailureMessage. - /// - public class AssertionFailureMessage - { - /// - /// Protected constructor, used since this class is only used via - /// static methods - /// - protected AssertionFailureMessage() - {} - - /// - /// Number of characters before a highlighted position before - /// clipping will occur. Clipped text is replaced with an - /// elipses "..." - /// - static protected int PreClipLength - { - get - { - return 35; - } - } - - /// - /// Number of characters after a highlighted position before - /// clipping will occur. Clipped text is replaced with an - /// elipses "..." - /// - static protected int PostClipLength - { - get - { - return 35; - } - } - - /// - /// Called to test if the position will cause clipping - /// to occur in the early part of a string. - /// - /// - /// - static private bool IsPreClipped( int iPosition ) - { - if( iPosition > PreClipLength ) - { - return true; - } - return false; - } - - /// - /// Called to test if the position will cause clipping - /// to occur in the later part of a string past the - /// specified position. - /// - /// - /// - /// - static private bool IsPostClipped( string sString, int iPosition ) - { - if( sString.Length - iPosition > PostClipLength ) - { - return true; - } - return false; - } - - /// - /// Property called to insert newline characters into a string - /// - static private string NewLine - { - get - { - return "\r\n\t"; - } - } - - /// - /// Renders up to M characters before, and up to N characters after - /// the specified index position. If leading or trailing text is - /// clipped, and elipses "..." is added where the missing text would - /// be. - /// - /// Clips strings to limit previous or post newline characters, - /// since these mess up the comparison - /// - /// - /// - /// - static protected string ClipAroundPosition( string sString, int iPosition ) - { - if( null == sString || 0 == sString.Length ) - { - return ""; - } - - return BuildBefore( sString, iPosition ) + BuildAfter( sString, iPosition ); - } - - /// - /// Clips the string before the specified position, and appends - /// ellipses (...) to show that clipping has occurred - /// - /// - /// - /// - static protected string PreClip( string sString, int iPosition ) - { - return "..." + sString.Substring( iPosition - PreClipLength, PreClipLength ); - } - - /// - /// Clips the string after the specified position, and appends - /// ellipses (...) to show that clipping has occurred - /// - /// - /// - /// - static protected string PostClip( string sString, int iPosition ) - { - return sString.Substring( iPosition, PostClipLength ) + "..."; - } - - /// - /// Builds the first half of a string, limiting the number of - /// characters before the position, and removing newline - /// characters. If the leading string is truncated, the - /// ellipses (...) characters are appened. - /// - /// - /// - /// - static private string BuildBefore( string sString, int iPosition ) - { - if( IsPreClipped(iPosition) ) - { - return PreClip( sString, iPosition ); - } - return sString.Substring( 0, iPosition ); - } - - /// - /// Builds the last half of a string, limiting the number of - /// characters after the position, and removing newline - /// characters. If the string is truncated, the - /// ellipses (...) characters are appened. - /// - /// - /// - /// - static private string BuildAfter( string sString, int iPosition ) - { - if( IsPostClipped(sString, iPosition) ) - { - return PostClip( sString, iPosition ); - } - return sString.Substring( iPosition ); - } - - /// - /// Text that is rendered for the expected value - /// - /// - static protected string ExpectedText() - { - return "expected:<"; - } - - /// - /// Text rendered for the actual value. This text should - /// be the same length as the Expected text, so leading - /// spaces should pad this string to ensure they match. - /// - /// - static protected string ButWasText() - { - return " but was:<"; - } - - /// - /// Raw line that communicates the expected value, and the actual value - /// - /// - /// - /// - static protected void AppendExpectedAndActual( StringBuilder sbOutput, Object expected, Object actual ) - { - sbOutput.Append( NewLine ); - sbOutput.Append( ExpectedText() ); - sbOutput.Append( DisplayString( expected ) ); - sbOutput.Append( ">" ); - sbOutput.Append( NewLine ); - sbOutput.Append( ButWasText() ); - sbOutput.Append( DisplayString( actual ) ); - sbOutput.Append( ">" ); - } - - /// - /// Display an object as a string - /// - /// - /// - static protected string DisplayString( object obj ) - { - if ( obj == null ) - return "(null)"; - else if ( obj is string ) - return Quoted( (string)obj ); - else - return obj.ToString(); - } - - /// - /// Quote a string - /// - /// - /// - static protected string Quoted( string text ) - { - return string.Format( "\"{0}\"", text ); - } - - /// - /// Draws a marker under the expected/actual strings that highlights - /// where in the string a mismatch occurred. - /// - /// - /// - static protected void AppendPositionMarker( StringBuilder sbOutput, int iPosition ) - { - sbOutput.Append( new String( '-', ButWasText().Length + 1 ) ); - if( iPosition > 0 ) - { - sbOutput.Append( new string( '-', iPosition ) ); - } - sbOutput.Append( "^" ); - } - - /// - /// Tests two objects to determine if they are strings. - /// - /// - /// - /// - static protected bool InputsAreStrings( Object expected, Object actual ) - { - if( null != expected && - null != actual && - expected is string && - actual is string ) - { - return true; - } - return false; - } - - /// - /// Tests if two strings are different lengths. - /// - /// - /// - /// True if string lengths are different - static protected bool LengthsDifferent( string sExpected, string sActual ) - { - if( sExpected.Length != sActual.Length ) - { - return true; - } - return false; - } - - /// - /// Tests if two arrays are different lengths. - /// - /// - /// - /// True if array lengths are different - static protected bool LengthsDifferent( object[] expected, object[] actual ) - { - if( expected.Length != actual.Length ) - { - return true; - } - return false; - } - - /// - /// Used to construct a message when the lengths of two strings are - /// different. Also includes the strings themselves, to allow them - /// to be compared visually. - /// - /// - /// - /// - static protected void BuildLengthsDifferentMessage( StringBuilder sbOutput, string sExpected, string sActual ) - { - BuildContentDifferentMessage( sbOutput, sExpected, sActual ); - } - - /// - /// Reports the length of two strings that are different lengths - /// - /// - /// - /// - static protected void BuildStringLengthDifferentReport( StringBuilder sbOutput, string sExpected, string sActual ) - { - sbOutput.Append( "String lengths differ. Expected length=" ); - sbOutput.Append( sExpected.Length ); - sbOutput.Append( ", but was length=" ); - sbOutput.Append( sActual.Length ); - sbOutput.Append( "." ); - sbOutput.Append( NewLine ); - } - - /// - /// Reports the length of two strings that are the same length - /// - /// - /// - /// - static protected void BuildStringLengthSameReport( StringBuilder sbOutput, string sExpected, string sActual ) - { - sbOutput.Append( "String lengths are both " ); - sbOutput.Append( sExpected.Length ); - sbOutput.Append( "." ); - sbOutput.Append( NewLine ); - } - - /// - /// Reports whether the string lengths are the same or different, and - /// what the string lengths are. - /// - /// - /// - /// - static protected void BuildStringLengthReport( StringBuilder sbOutput, string sExpected, string sActual ) - { - if( sExpected.Length != sActual.Length ) - { - BuildStringLengthDifferentReport( sbOutput, sExpected, sActual ); - } - else - { - BuildStringLengthSameReport( sbOutput, sExpected, sActual ); - } - } - - /// - /// Reports the length of two arrays that are different lengths - /// - /// - /// - /// - static protected void BuildArrayLengthDifferentReport( StringBuilder sbOutput, Array expected, Array actual ) - { - sbOutput.Append( "Array lengths differ. Expected length=" ); - sbOutput.Append( expected.Length ); - sbOutput.Append( ", but was length=" ); - sbOutput.Append( actual.Length ); - sbOutput.Append( "." ); - sbOutput.Append( NewLine ); - } - - /// - /// Reports the length of two arrays that are the same length - /// - /// - /// - /// - static protected void BuildArrayLengthSameReport( StringBuilder sbOutput, Array expected, Array actual ) - { - sbOutput.Append( "Array lengths are both " ); - sbOutput.Append( expected.Length ); - sbOutput.Append( "." ); - sbOutput.Append( NewLine ); - } - - /// - /// Reports whether the array lengths are the same or different, and - /// what the array lengths are. - /// - /// - /// - /// - static protected void BuildArrayLengthReport( StringBuilder sbOutput, Array expected, Array actual ) - { - if( expected.Length != actual.Length ) - { - BuildArrayLengthDifferentReport( sbOutput, expected, actual ); - } - else - { - BuildArrayLengthSameReport( sbOutput, expected, actual ); - } - } - - /// - /// - /// - /// - /// - /// - /// - static private void BuildContentDifferentAtPosition( StringBuilder sbOutput, string sExpected, string sActual, int iPosition ) - { - BuildStringLengthReport( sbOutput, sExpected, sActual ); - - sbOutput.Append( "Strings differ at index " ); - sbOutput.Append( iPosition ); - sbOutput.Append( "." ); - sbOutput.Append( NewLine ); - - // - // Clips the strings, then turns any hidden whitespace into visible - // characters - // - string sClippedExpected = ConvertWhitespace(ClipAroundPosition( sExpected, iPosition )); - string sClippedActual = ConvertWhitespace(ClipAroundPosition( sActual, iPosition )); - - AppendExpectedAndActual( - sbOutput, - sClippedExpected, - sClippedActual ); - sbOutput.Append( NewLine ); - - // Add a line showing where they differ. If the string lengths are - // different, they start differing just past the length of the - // shorter string - AppendPositionMarker( - sbOutput, - FindMismatchPosition( sClippedExpected, sClippedActual, 0 ) ); - sbOutput.Append( NewLine ); - } - - /// - /// Turns CR, LF, or TAB into visual indicator to preserve visual marker - /// position. This is done by replacing the '\r' into '\\' and 'r' - /// characters, and the '\n' into '\\' and 'n' characters, and '\t' into - /// '\\' and 't' characters. - /// - /// Thus the single character becomes two characters for display. - /// - /// - /// - static protected string ConvertWhitespace( string sInput ) - { - if( null != sInput ) - { - sInput = sInput.Replace( "\r", "\\r" ); - sInput = sInput.Replace( "\n", "\\n" ); - sInput = sInput.Replace( "\t", "\\t" ); - } - return sInput; - } - - /// - /// Shows the position two strings start to differ. Comparison - /// starts at the start index. - /// - /// - /// - /// - /// -1 if no mismatch found, or the index where mismatch found - static private int FindMismatchPosition( string sExpected, string sActual, int iStart ) - { - int iLength = Math.Min( sExpected.Length, sActual.Length ); - for( int i=iStart; i - /// Constructs a message that can be displayed when the content of two - /// strings are different, but the string lengths are the same. The - /// message will clip the strings to a reasonable length, centered - /// around the first position where they are mismatched, and draw - /// a line marking the position of the difference to make comparison - /// quicker. - /// - /// - /// - /// - static protected void BuildContentDifferentMessage( StringBuilder sbOutput, string sExpected, string sActual ) - { - // - // If they mismatch at a specified position, report the - // difference. - // - int iMismatch = FindMismatchPosition( sExpected, sActual, 0 ); - if( -1 != iMismatch ) - { - BuildContentDifferentAtPosition( - sbOutput, - sExpected, - sActual, - iMismatch ); - return; - } - - // - // If the lengths differ, but they match up to the length, - // show the difference just past the length of the shorter - // string - // - if( sExpected.Length != sActual.Length ) - { - BuildContentDifferentAtPosition( - sbOutput, - sExpected, - sActual, - Math.Min(sExpected.Length, sActual.Length) ); - } - } - - /// - /// Called to append a message when the input strings are different. - /// A different message is rendered when the lengths are mismatched, - /// and when the lengths match but content is mismatched. - /// - /// - /// - /// - static private void BuildStringsDifferentMessage( StringBuilder sbOutput, string expected, string actual ) - { - sbOutput.Append( NewLine ); - if( LengthsDifferent( expected, actual ) ) - { - BuildLengthsDifferentMessage( sbOutput, expected, actual ); - } - else - { - BuildContentDifferentMessage( sbOutput, expected, actual ); - } - } - - /// - /// Called to append a message when the input arrays are different. - /// A different message is rendered when the lengths are mismatched, - /// and when the lengths match but content is mismatched. - /// - /// - /// - /// - static private void BuildArraysDifferentMessage( StringBuilder sbOutput, int index, Array expected, Array actual ) - { - sbOutput.Append( NewLine ); - - BuildArrayLengthReport( sbOutput, expected, actual ); - - sbOutput.Append( "Arrays differ at index " ); - sbOutput.Append( index ); - sbOutput.Append( "." ); - sbOutput.Append( NewLine ); - - if ( index < expected.Length && index < actual.Length ) - { - if( InputsAreStrings( expected.GetValue(index), actual.GetValue(index) ) ) - { - BuildStringsDifferentMessage( - sbOutput, - (string)expected.GetValue(index), - (string)actual.GetValue(index) ); - } - else - { - AppendExpectedAndActual( sbOutput, expected.GetValue(index), actual.GetValue(index) ); - } - } - else if( expected.Length < actual.Length ) - { - sbOutput.Append( NewLine ); - sbOutput.Append( " extra:<" ); - DisplayElements( sbOutput, actual, index, 3 ); - sbOutput.Append( ">" ); - } - else - { - sbOutput.Append( NewLine ); - sbOutput.Append( " missing:<" ); - DisplayElements( sbOutput, expected, index, 3 ); - sbOutput.Append( ">" ); - } - - return; - } - - static private void DisplayElements( StringBuilder sbOutput, Array array, int index, int max ) - { - for( int i = 0; i < max; i++ ) - { - sbOutput.Append( DisplayString( array.GetValue(index++) ) ); - - if ( index >= array.Length ) - return; - - sbOutput.Append( "," ); - } - - sbOutput.Append( "..." ); - } - - /// - /// Used to create a StringBuilder that is used for constructing - /// the output message when text is different. Handles initialization - /// when a message is provided. If message is null, an empty - /// StringBuilder is returned. - /// - /// - /// - static protected StringBuilder CreateStringBuilder( string message, params object[] args ) - { - StringBuilder sbOutput; - if (message != null) - { - if ( args != null && args.Length > 0 ) - sbOutput = new StringBuilder( string.Format( message, args ) ); - else - sbOutput = new StringBuilder( message ); - } - else - { - sbOutput = new StringBuilder(); - } - return sbOutput; - } - - /// - /// Called to create a message when two objects have been found to - /// be unequal. If the inputs are strings, a special message is - /// rendered that can help track down where the strings are different, - /// based on differences in length, or differences in content. - /// - /// If the inputs are not strings, the ToString method of the objects - /// is used to show what is different about them. - /// - /// - /// - /// - /// - /// - static public string FormatMessageForFailNotEquals(Object expected, Object actual, - string message, params object[] args) - { - StringBuilder sbOutput = CreateStringBuilder( message, args ); - if( null != message ) - { - if( message.Length > 0 ) - { - sbOutput.Append( " " ); - } - } - - if( InputsAreStrings( expected, actual ) ) - { - BuildStringsDifferentMessage( - sbOutput, - (string)expected, - (string)actual ); - } - else - { - AppendExpectedAndActual( sbOutput, expected, actual ); - } - return sbOutput.ToString(); - } - - /// - /// Called to create a message when two arrays are not equal. - /// - /// - /// - /// - /// - static public string FormatMessageForFailArraysNotEqual(int index, Array expected, Array actual, - string message, params object[] args) - { - StringBuilder sbOutput = CreateStringBuilder( message, args ); - if( null != message ) - { - if( message.Length > 0 ) - { - sbOutput.Append( " " ); - } - } - - BuildArraysDifferentMessage( - sbOutput, - index, - expected, - actual ); - - return sbOutput.ToString(); - } - } -} diff --git a/mcs/nunit20/framework/CategoryAttribute.cs b/mcs/nunit20/framework/CategoryAttribute.cs deleted file mode 100644 index 007e938d41b..00000000000 --- a/mcs/nunit20/framework/CategoryAttribute.cs +++ /dev/null @@ -1,60 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Framework -{ - /// - /// Summary description for CategoryAttribute. - /// - /// - [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple=true)] - public sealed class CategoryAttribute : Attribute - { - private string name; - - /// - /// Construct attribute for a given category - /// - /// The name of the category - public CategoryAttribute(string name) - { - this.name = name; - } - - /// - /// The name of the category - /// - public string Name - { - get { return name; } - } - } -} diff --git a/mcs/nunit20/framework/ChangeLog b/mcs/nunit20/framework/ChangeLog deleted file mode 100644 index 76c47640607..00000000000 --- a/mcs/nunit20/framework/ChangeLog +++ /dev/null @@ -1,44 +0,0 @@ -2008-01-23 Raja R Harinath - - * Makefile (install-symlink, uninstall-symlink): New. In the - net_2_0 profile, just install a symlink to the 1.1 profile library - in the compiler search path. - -2006-08-09 Vladimir Krasnov - - * added NET_2_0 projects files for VS2005 - -2006-01-25 Boris Kirzner - * AssemblyInfo.cs: added #ifdef for features not supported in TARGET_JVM. - * nunit.framework.dll.J2EE.vmwcsproj: added project file for TARGET_JVM. - -2004-11-23 Raja R Harinath - - * Makefile (NO_INSTALL) [PROFILE=net_2_0]: Don't install dll. - -2004-10-28 Sebastien Pouliot - - * Updated to NUnit 2.2.0 Final Release. - -2004-06-21 Raja R Harinath - - * Makefile (LIBRARY_SNK): Sign with nunit.key. - -2004-05-25 Sebastien Pouliot - - * All: Synched files with NUnit 2.1.91 (2.2 beta) release. - -2004-05-02 Sebastien Pouliot - - * AssemblyInfo.cs: Now that bug #57941 (incomplete key pairs) is fixed - we now use nunit.key to sign their assemblies. - -2003-01-10 Gonzalo Paniagua Javier - - * makefile.gnu: added resource file. - -2002-12-15 Nick Drochak - - * Transform.resources: Add file. This is technically a generated file, - but it will never change for us since we get the sources from the nunit - project anyway. diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/Assert.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/Assert.xml deleted file mode 100644 index 5251eb846c6..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/Assert.xml +++ /dev/null @@ -1,1106 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - - - System.Object - - - - To be added - To be added - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Void - - - - - - - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Void - - - - - - - - - a - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Void - - - - - - - - - a - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Void - - - - - - - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Method - - System.Boolean - - - - - - - a - a - To be added - a - To be added - - - 2.2.0.0 - - - - System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never) - - - - - - Method - - System.Void - - - - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Void - - - - - - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Void - - - - - - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Void - - - - - - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Void - - - - - - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Void - - - - - - - a - a - To be added - To be added - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/Assertion.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/Assertion.xml deleted file mode 100644 index daa041d8366..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/Assertion.xml +++ /dev/null @@ -1,439 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the <link location="node:gtk-sharp/programming/threads">Gtk# Thread Programming</link> for details. - - System.Object - - - - - System.Obsolete("Use Assert class instead") - - - - - The class Assertion is used to make assertions in methods flaged as a Test in a class flages as a TestFixture. - - - - Note: It is not mandatory to inherit from Assertion, - but if you do, the code becomes a little more clear and you will save some typing. - Assertion.AssertionEquals (...) vs AssertionEquals (...) - - - A good idea is to tag your Test with the name of the test and a number. - That information can be used when generating bug reports. - - - - using NUnit.Framework; - - [TestFixture] - public class MyUnitTest : Assertion { - - string foo; - - [SetUp] - public void GetReady() - { - foo = "Foobar"; - } - - [Test] - public void TestLength() - { - AssertEquals ("(1) Length", 6, foo.Length); - } - } - - - - - - - - Constructor - - - - Creates an Assertion object - Should not be used, all methods are static - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - The condition - Asserts that a condition is true - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - A message - The condition - Asserts that a condition is true - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - The expected - The actual - Asserts that two ints are equal - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - The expected object - The actual object - Asserts that two objects are Equal - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - The expected - The actual - The delta difference allowed - Asserts that two doubles are equal, accepting some difference expresed by the delta - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - The expected - The actual - The delta difference allowed - Asserts that two floats are equal, accepting some difference expresed by the delta - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - A message - The expected - The actual - Asserts that two ints are equal - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - A message - The expected object - The actual object - Asserts that two objects are Equal - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - - A message - The expected - The actual - The delta difference allowed - Asserts that two doubles are equal, accepting some difference expresed by the delta - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - - A message - The expected - The actual - The delta difference allowed - Asserts that two floats are equal, accepting some difference expresed by the delta - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - The object - Asserts that an object do not reference null - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - A message - The object - Asserts that an object do not reference null - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - The object - Asserts that an object references null - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - A message - The object - Asserts that an object references null - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - The expected object - The actual object - Assert that two references refers to the same object - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - A message - The expected object - The actual object - Assert that two references refers to the same object - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - Fails a Test - To be added. - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - The message - Fails a Test with a message - To be added. - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/AssertionException.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/AssertionException.xml deleted file mode 100644 index f90e8f6c76b..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/AssertionException.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the <link location="node:gtk-sharp/programming/threads">Gtk# Thread Programming</link> for details. - - System.Exception - - - - - - The class AssertionException is thrown if an Assertion failed. - - - - You can use this Exception if you want to split up your Test method. - - - - using NUnit.Framework; - - [TestFixture] - public class MyUnitTest : Assertion { - - string foo; - - [SetUp] - public void GetReady() - { - foo = "Foobar"; - } - - [Test] - public void Foobar() - { - try { - Foo (foo); - } catch (AssertionException ex) { - throw new AssertionException ("Foobar failed: " + ex.Message, ex); - } - - try { - Bar (foo); - } catch (AssertionException ex) { - throw new AssertionException ("Foobar failed: " + ex.Message, ex); - } - } - - private void Foo (string foobar) - { - Assert ("(1) Foo: ", foobar.StartsWith ("Foo")); - } - - private void Bar (string foobar) - { - Assert ("(2) Bar: ", foobar.EndsWith ("bar")); - } - } - - - - - - - - Constructor - - - - - - The message - Creates an AssertionException with a message - To be added. - - - 2.2.0.0 - - - - - Constructor - - - - - - - The serialization info. - The streaming context - Creates an AssertionException with customized serialization handling. - - - - - 2.2.0.0 - - - - - Constructor - - - - - - - The message - An exception which should be wrapped - Creates an AssertionException with a message and wraps it around another exception - To be added. - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/AssertionFailureMessage.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/AssertionFailureMessage.xml deleted file mode 100644 index c2bbb4fdcc7..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/AssertionFailureMessage.xml +++ /dev/null @@ -1,588 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the Gtk# Thread Programming for details. - - System.Object - - - - To be added - To be added - - - - - Constructor - - - - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - - - - - a - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.String - - - - To be added - a - To be added - - - 2.2.0.0 - - - - - Method - - System.String - - - - - - - a - a - To be added - a - To be added - - - 2.2.0.0 - - - - - Method - - System.String - - - - - - a - To be added - a - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Text.StringBuilder - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.String - - - - - - a - To be added - a - To be added - - - 2.2.0.0 - - - - - Method - - System.String - - - - To be added - a - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Boolean - - - - - - - a - a - To be added - a - To be added - - - 2.2.0.0 - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - System.Boolean - - - - - - - a - a - To be added - a - To be added - - - 2.2.0.0 - - - - - Method - - System.String - - - - - - - a - a - To be added - a - To be added - - - 2.2.0.0 - - - - - Property - - System.Int32 - - - To be added - a - To be added - - - 2.2.0.0 - - - - - Method - - System.String - - - - - - - a - a - To be added - a - To be added - - - 2.2.0.0 - - - - - Property - - System.Int32 - - - To be added - a - To be added - - - 2.2.0.0 - - - - - Method - - System.String - - - - - - a - To be added - a - To be added - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/CategoryAttribute.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/CategoryAttribute.xml deleted file mode 100644 index 64c1b469eac..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/CategoryAttribute.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - nunit.framework - 2.2.0.0 - - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true) - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/ExpectedExceptionAttribute.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/ExpectedExceptionAttribute.xml deleted file mode 100644 index 176b39d8b21..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/ExpectedExceptionAttribute.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the <link location="node:gtk-sharp/programming/threads">Gtk# Thread Programming</link> for details. - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false) - - - - This is the way to specify that the execution of a test will throw an exception. - - - This attribute takes a parameter which is a Type. - The runner will execute the test and if it throws the specific exception, then the test passes. - If it throws a different exception the test will fail. - This is true even if the thrown exception inherits from the expected exception. - - - - using System; - using NUnit.Framework; - - [TestFixture] - public class SuccessTests - { - [Test] - [ExpectedException(typeof(InvalidOperationException))] - public void ExpectAnException() - { - /* ... */ - } - } - - - - - - - - Constructor - - - - - - The exception which should be thrown to pass the Test - Flags a Test that a test should throw a specific exception - To be added. - - - 2.2.0.0 - - - - - Constructor - - - - - - - a - a - To be added - To be added - - - 2.2.0.0 - - - - - Property - - 2.2.0.0 - - - System.Type - - - To be added. - To be added. - To be added. - - - - - Property - - System.String - - - - To be added - a - To be added - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/ExplicitAttribute.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/ExplicitAttribute.xml deleted file mode 100644 index c65832b90df..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/ExplicitAttribute.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - nunit.framework - 2.2.0.0 - - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=false) - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/IgnoreAttribute.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/IgnoreAttribute.xml deleted file mode 100644 index f2dee2b5d46..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/IgnoreAttribute.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the <link location="node:gtk-sharp/programming/threads">Gtk# Thread Programming</link> for details. - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=false) - - - - - The ignore attribute is an attribute to not run a test or test fixture for a period of time. - - - - The person marks either a Test or a TestFixture with the Ignore Attribute. - The running program sees the attribute and does not run the test or tests. - The progress bar will turn yellow if a test is not run and the test will - be mentioned in the reports that it was not run. - - - This feature should be used to temporarily not run a test or fixture. - This is a better mechanism than commenting out the test or renaming methods, - since the tests will be compiled with the rest of the code and - there is an indication at run time that a test is not being run. - This insures that tests will not be forgotten. - - - - using System; - using NUnit.Framework; - - [TestFixture] - [Ignore("Ignore a fixture")] - public class SuccessTests - { - [Test] - [Ignore ("I am only finished with Foo not bar")] - public void Foobar() - { - /* ... */ - } - } - - - - - - - - Constructor - - - - - - The reason - The reason for why the Fixture or Test should not be run - To be added. - - - 2.2.0.0 - - - - - Property - - System.String - - - The reason why a Fixture or Test should not be run - The reason - To be added. - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/IgnoreException.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/IgnoreException.xml deleted file mode 100644 index 5f63e52d2c2..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/IgnoreException.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - nunit.framework - 2.2.0.0 - - - System.Exception - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/SetUpAttribute.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/SetUpAttribute.xml deleted file mode 100644 index b7e9ff57ab0..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/SetUpAttribute.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the <link location="node:gtk-sharp/programming/threads">Gtk# Thread Programming</link> for details. - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false) - - - - - SetUp this attribute are used inside a TestFixture to provide a function that are performed prior a test method is called. - - - - A TestFixture can have only one SetUp method. If more than one is defined the TestFixture will not be run. - It will compile however. - - - - using System; - using NUnit.Framework; - - [TestFixture] - public class SuccessTests - { - [SetUp] - public void GetReady() - { - /* ... */ - } - - [TearDown] - public void Clear() - { - /* ... */ - } - - [Test] - public void Foobar() - { - /* ... */ - } - } - - - - - - - - Constructor - - - - Flags a method as a Setup method - To be added. - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/SuiteAttribute.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/SuiteAttribute.xml deleted file mode 100644 index 3bf5880d17d..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/SuiteAttribute.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the Gtk# Thread Programming for details. - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Property, AllowMultiple=false) - - - - To be added - To be added - - - - - Constructor - - - - To be added - To be added - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TearDownAttribute.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TearDownAttribute.xml deleted file mode 100644 index 6bf6d0b5f3b..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TearDownAttribute.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the <link location="node:gtk-sharp/programming/threads">Gtk# Thread Programming</link> for details. - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false) - - - - - This attribute is used inside a TestFixture to provide a function that are performed after a test method is called. - - - - A TestFixture can have only one TearDown method. - If more than one is defined the TestFixture will not be run. It will compile however. - - - - using System; - using NUnit.Framework; - - [TestFixture] - public class SuccessTests - { - [SetUp] - public void GetReady() - { - /* ... */ - } - - [TearDown] - public void Clear() - { - /* ... */ - } - - [Test] - public void Foobar() - { - /* ... */ - } - } - - - - - - - - Constructor - - - - Flags a method as a Cleanup method - To be added. - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestAttribute.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestAttribute.xml deleted file mode 100644 index ea7c65197b1..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestAttribute.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the <link location="node:gtk-sharp/programming/threads">Gtk# Thread Programming</link> for details. - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false) - - - - - The Test attribute marks a specific method inside a class that has already been marked as a TestFixture, - as a test method. - - - - For backwards compatibility with previous versions of Nunit a test method will also be found if - the first 4 letters are "test" regardless of case. - - Note: The signature for a test method is defined as follows; public void MethodName() - - There must be no parameters. If the programmer marks a test method that does not have the correct signature it will - not be run and it will appear in the Test Not Run area in the UI that ran the program. - - - - using System; - using NUnit.Framework; - - [TestFixture] - public class SuccessTests - { - [Test] - public void Add() { /* ... */ } - - public void TestSubtract() - { - /* backwards compatibility */ - } - } - - - - - - - - Constructor - - - - Flags a method to be a Test - To be added. - - - 2.2.0.0 - - - - - Property - - System.String - - - - To be added - a - To be added - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestCase.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestCase.xml deleted file mode 100644 index e0081b4672b..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestCase.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the Gtk# Thread Programming for details. - - NUnit.Framework.Assertion - - - - - System.Obsolete("use TestFixture attribute instead of inheritance", false) - - - NUnit.Framework.TestFixture - - - - To be added - To be added - - - - - Constructor - - - - To be added - To be added - - - 2.2.0.0 - - - - - Method - - System.Void - - - - To be added - To be added - - - 2.2.0.0 - - - - System.Obsolete("use SetUp attribute instead of naming convention", false) - - - NUnit.Framework.SetUp - - - - - - Method - - System.Void - - - - To be added - To be added - - - 2.2.0.0 - - - - System.Obsolete("use TearDown attribute instead of naming convention", false) - - - NUnit.Framework.TearDown - - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestFixtureAttribute.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestFixtureAttribute.xml deleted file mode 100644 index 470f6a0a891..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestFixtureAttribute.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the <link location="node:gtk-sharp/programming/threads">Gtk# Thread Programming</link> for details. - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple=false, Inherited=true) - - - - This is the attribute that marks a class that contains test methods. - - - This attribute is contained in the NUnit.Framework namespace. - In previous versions of NUnit the programmer was required to inherit from a class called TestCase. - This is more flexible because it allows a TestFixture attribute to be put on any class. - - - Note: There are a few restrictions. The class must have a default constructor. - The class must also be a publicly exported type or the program that dynamically builds suites will not see it. - - - - using System; - using NUnit.Framework; - - [TestFixture] - public class SuccessTests { /* ... */ } - - - - - - - - Constructor - - - - Flags a class containing test methods - To be added. - - - 2.2.0.0 - - - - - Property - - System.String - - - - To be added - a - To be added - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestFixtureSetUpAttribute.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestFixtureSetUpAttribute.xml deleted file mode 100644 index 8ba4a76b5e8..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestFixtureSetUpAttribute.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the Gtk# Thread Programming for details. - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false) - - - - To be added - To be added - - - - - Constructor - - - - To be added - To be added - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestFixtureTearDownAttribute.xml b/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestFixtureTearDownAttribute.xml deleted file mode 100644 index beb24553dbd..00000000000 --- a/mcs/nunit20/framework/Documentation/en/NUnit.Framework/TestFixtureTearDownAttribute.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - nunit.framework - - - 2.1.4.0 - 2.2.0.0 - - Gtk# is thread aware, but not thread safe; See the Gtk# Thread Programming for details. - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false) - - - - To be added - To be added - - - - - Constructor - - - - To be added - To be added - - - 2.2.0.0 - - - - diff --git a/mcs/nunit20/framework/Documentation/en/index.xml b/mcs/nunit20/framework/Documentation/en/index.xml deleted file mode 100644 index 549687a20c7..00000000000 --- a/mcs/nunit20/framework/Documentation/en/index.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows=true) - - - System.Reflection.AssemblyKeyName("") - - - System.Reflection.AssemblyTrademark("") - - - System.Reflection.AssemblyCopyright("") - - - System.Reflection.AssemblyProduct("") - - - System.Reflection.AssemblyCompany("") - - - System.Reflection.AssemblyConfiguration("") - - - System.Reflection.AssemblyDescription("") - - - System.Reflection.AssemblyTitle("") - - - System.CLSCompliant(true) - - - - - To be added. - To be added. - - - - - - - - - - - - - - - - - - - - - - nunit.framework - diff --git a/mcs/nunit20/framework/Documentation/en/ns-NUnit.Framework.xml b/mcs/nunit20/framework/Documentation/en/ns-NUnit.Framework.xml deleted file mode 100644 index ab241fc6dac..00000000000 --- a/mcs/nunit20/framework/Documentation/en/ns-NUnit.Framework.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - NUnit is a unit-testing framework for all .Net languages. - - - Initially ported from JUnit, the current version, 2.0 is the second major release of this xUnit based unit testing tool for - NET. It is written entirely in C# and has been completely redesigned to take advantage of many .NET language features, - for example custom attributes and other reflection related capabilities. NUnit brings xUnit to all .NET languages. - - - - diff --git a/mcs/nunit20/framework/ExpectedExceptionAttribute.cs b/mcs/nunit20/framework/ExpectedExceptionAttribute.cs deleted file mode 100644 index 137730249cc..00000000000 --- a/mcs/nunit20/framework/ExpectedExceptionAttribute.cs +++ /dev/null @@ -1,82 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - - /// - /// ExpectedAttributeException. - /// - /// - [AttributeUsage(AttributeTargets.Method, AllowMultiple=false)] - public sealed class ExpectedExceptionAttribute : Attribute - { - private Type expectedException; - private string expectedMessage; - - /// - /// Constructor for a given type of exception - /// - /// - public ExpectedExceptionAttribute(Type exceptionType) - { - expectedException = exceptionType; - } - - /// - /// Constructor for a given type of exception and expected message text - /// - /// - /// - public ExpectedExceptionAttribute(Type exceptionType, string expectedMessage) - { - expectedException = exceptionType; - this.expectedMessage = expectedMessage; - } - - /// - /// The expected exception type - /// - public Type ExceptionType - { - get{ return expectedException; } - set{ expectedException = value; } - } - - /// - /// The expected message - /// - public string ExpectedMessage - { - get { return expectedMessage; } - set { expectedMessage = value; } - } - } -} diff --git a/mcs/nunit20/framework/ExplicitAttribute.cs b/mcs/nunit20/framework/ExplicitAttribute.cs deleted file mode 100644 index d96ded73789..00000000000 --- a/mcs/nunit20/framework/ExplicitAttribute.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace NUnit.Framework -{ - /// - /// ExplicitAttribute marks a test or test fixture so that it will - /// only be run if explicitly executed from the gui or command line - /// or if it is included by use of a filter. The test will not be - /// run simply because an enclosing suite is run. - /// - [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, AllowMultiple=false)] - public sealed class ExplicitAttribute : Attribute - { - /// - /// Constructor - /// - public ExplicitAttribute() - { - } - } -} diff --git a/mcs/nunit20/framework/IgnoreAttribute.cs b/mcs/nunit20/framework/IgnoreAttribute.cs deleted file mode 100644 index 9d1d0e9f6bc..00000000000 --- a/mcs/nunit20/framework/IgnoreAttribute.cs +++ /dev/null @@ -1,59 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - /// - /// IgnoreAttribute. - /// - /// - [AttributeUsage(AttributeTargets.Method|AttributeTargets.Class, AllowMultiple=false)] - public sealed class IgnoreAttribute : Attribute - { - private string reason; - - /// - /// Constructor - /// - /// - public IgnoreAttribute(string reason) - { - this.reason = reason; - } - - /// - /// The reason for ignoring a test - /// - public string Reason - { - get { return reason; } - } - } -} diff --git a/mcs/nunit20/framework/IgnoreException.cs b/mcs/nunit20/framework/IgnoreException.cs deleted file mode 100644 index faf610a24cf..00000000000 --- a/mcs/nunit20/framework/IgnoreException.cs +++ /dev/null @@ -1,68 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - using System.Runtime.Serialization; - - /// - /// Thrown when an assertion failed. - /// - /// - [Serializable] - public class IgnoreException : System.Exception - { - /// - /// - /// - /// - public IgnoreException (string message) : base(message) - {} - - /// - /// Standard constructor - /// - /// The error message that explains - /// the reason for the exception - /// The exception that caused the - /// current exception - public IgnoreException(string message, Exception inner) : - base(message, inner) - {} - - /// - /// Serialization Constructor - /// - protected IgnoreException(SerializationInfo info, - StreamingContext context) : base(info,context) - {} - - } -} diff --git a/mcs/nunit20/framework/Makefile b/mcs/nunit20/framework/Makefile deleted file mode 100644 index 9a70bb4ce38..00000000000 --- a/mcs/nunit20/framework/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -thisdir = nunit20/framework -SUBDIRS = -include ../../build/rules.make - -LIBRARY = NUnit.Framework.dll -LIBRARY_NAME = nunit.framework.dll -LIBRARY_SNK = $(topdir)/nunit.key - -LIB_MCS_FLAGS = -debug /r:System.Xml.dll /r:System.dll /d:StronglyNamedAssembly -NO_TEST = yo - -ifeq (net_2_0, $(PROFILE)) -NO_INSTALL = yes -install-local: install-symlink -uninstall-local: uninstall-symlink -endif - -EXTRA_DISTFILES = \ - nunit.framework.dll.csproj - -include ../../build/library.make - -symlinkdir = $(mono_libdir)/mono/$(FRAMEWORK_VERSION) -install-symlink: - $(MKINSTALLDIRS) $(DESTDIR)$(symlinkdir) - cd $(DESTDIR)$(symlinkdir) && rm -f $(LIBRARY_NAME) && ln -s ../1.0/$(LIBRARY_NAME) $(LIBRARY_NAME) - -uninstall-symlink: - rm -f $(DESTDIR)$(symlinkdir)/$(LIBRARY_NAME) diff --git a/mcs/nunit20/framework/NUnit.Framework.dll.sources b/mcs/nunit20/framework/NUnit.Framework.dll.sources deleted file mode 100644 index 5a73afcd649..00000000000 --- a/mcs/nunit20/framework/NUnit.Framework.dll.sources +++ /dev/null @@ -1,18 +0,0 @@ -./AssemblyInfo.cs -./Assert.cs -./Assertion.cs -./AssertionException.cs -./AssertionFailureMessage.cs -./CategoryAttribute.cs -./ExpectedExceptionAttribute.cs -./ExplicitAttribute.cs -./IgnoreAttribute.cs -./IgnoreException.cs -./OldTestCase.cs -./SetUpAttribute.cs -./SuiteAttribute.cs -./TearDownAttribute.cs -./TestAttribute.cs -./TestFixtureAttribute.cs -./TestFixtureSetUpAttribute.cs -./TestFixtureTearDownAttribute.cs diff --git a/mcs/nunit20/framework/OldTestCase.cs b/mcs/nunit20/framework/OldTestCase.cs deleted file mode 100644 index d1dd7dedfc9..00000000000 --- a/mcs/nunit20/framework/OldTestCase.cs +++ /dev/null @@ -1,58 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - - /// - /// TestFixture - /// - /// - [TestFixture] - [Obsolete("use TestFixture attribute instead of inheritance",false)] - public class TestCase : Assertion - { - /// - /// SetUp method - /// - [SetUp] - [Obsolete("use SetUp attribute instead of naming convention",false)] - protected virtual void SetUp() - {} - - /// - /// TearDown method - /// - [TearDown] - [Obsolete("use TearDown attribute instead of naming convention",false)] - protected virtual void TearDown() - {} - } -} diff --git a/mcs/nunit20/framework/SetUpAttribute.cs b/mcs/nunit20/framework/SetUpAttribute.cs deleted file mode 100644 index 9a1b47c3029..00000000000 --- a/mcs/nunit20/framework/SetUpAttribute.cs +++ /dev/null @@ -1,40 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - /// - /// SetUpAttribute. - /// - /// - [AttributeUsage(AttributeTargets.Method, AllowMultiple=false)] - public sealed class SetUpAttribute : Attribute - {} -} diff --git a/mcs/nunit20/framework/SuiteAttribute.cs b/mcs/nunit20/framework/SuiteAttribute.cs deleted file mode 100644 index 1708c4348ad..00000000000 --- a/mcs/nunit20/framework/SuiteAttribute.cs +++ /dev/null @@ -1,40 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - /// - /// SuiteAttribute. - /// - /// - [AttributeUsage(AttributeTargets.Property, AllowMultiple=false)] - public sealed class SuiteAttribute : Attribute - {} -} diff --git a/mcs/nunit20/framework/TearDownAttribute.cs b/mcs/nunit20/framework/TearDownAttribute.cs deleted file mode 100644 index 071d1aee7e7..00000000000 --- a/mcs/nunit20/framework/TearDownAttribute.cs +++ /dev/null @@ -1,40 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - /// - /// TearDownAttribute. - /// - /// - [AttributeUsage(AttributeTargets.Method, AllowMultiple=false)] - public sealed class TearDownAttribute : Attribute - {} -} diff --git a/mcs/nunit20/framework/TestAttribute.cs b/mcs/nunit20/framework/TestAttribute.cs deleted file mode 100644 index 3674b877813..00000000000 --- a/mcs/nunit20/framework/TestAttribute.cs +++ /dev/null @@ -1,69 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, -' Charlie Poole or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - - /// - /// Adding this attribute to a method within a - /// class makes the method callable from the NUnit test runner. There is a property - /// called Description which is optional which you can provide a more detailed test - /// description. This class cannot be inherited. - /// - /// - /// - /// [TestFixture] - /// public class Fixture - /// { - /// [Test] - /// public void MethodToTest() - /// {} - /// - /// [Test(Description = "more detailed description")] - /// publc void TestDescriptionMethod() - /// {} - /// } - /// - /// - [AttributeUsage(AttributeTargets.Method, AllowMultiple=false)] - public sealed class TestAttribute : Attribute - { - private string description; - - /// - /// Descriptive text for this test - /// - public string Description - { - get { return description; } - set { description = value; } - } - } -} diff --git a/mcs/nunit20/framework/TestFixtureAttribute.cs b/mcs/nunit20/framework/TestFixtureAttribute.cs deleted file mode 100644 index ae19f60a23f..00000000000 --- a/mcs/nunit20/framework/TestFixtureAttribute.cs +++ /dev/null @@ -1,56 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - - /// - /// TestFixtureAttribute - /// - /// - /// [TestFixture] - /// public class ExampleClass - /// {} - /// - [AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)] - public sealed class TestFixtureAttribute : Attribute - { - private string description; - - /// - /// Descriptive text for this fixture - /// - public string Description - { - get { return description; } - set { description = value; } - } - } -} \ No newline at end of file diff --git a/mcs/nunit20/framework/TestFixtureSetUpAttribute.cs b/mcs/nunit20/framework/TestFixtureSetUpAttribute.cs deleted file mode 100644 index 99cf8b62125..00000000000 --- a/mcs/nunit20/framework/TestFixtureSetUpAttribute.cs +++ /dev/null @@ -1,41 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - - /// - /// TestFixtureSetUpAttribute - /// - [AttributeUsage(AttributeTargets.Method, AllowMultiple=false)] - public class TestFixtureSetUpAttribute : Attribute - { - } -} diff --git a/mcs/nunit20/framework/TestFixtureTearDownAttribute.cs b/mcs/nunit20/framework/TestFixtureTearDownAttribute.cs deleted file mode 100644 index c884fc706f9..00000000000 --- a/mcs/nunit20/framework/TestFixtureTearDownAttribute.cs +++ /dev/null @@ -1,42 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Framework -{ - using System; - - /// - /// TestFixtureTearDownAttribute - /// - [AttributeUsage(AttributeTargets.Method, AllowMultiple=false)] - public class TestFixtureTearDownAttribute : Attribute - { - } -} - diff --git a/mcs/nunit20/framework/nunit.framework.build b/mcs/nunit20/framework/nunit.framework.build deleted file mode 100755 index 11ab2db40f5..00000000000 --- a/mcs/nunit20/framework/nunit.framework.build +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/framework/nunit.framework.dll.J2EE.vmwcsproj b/mcs/nunit20/framework/nunit.framework.dll.J2EE.vmwcsproj deleted file mode 100644 index 86d809be95a..00000000000 --- a/mcs/nunit20/framework/nunit.framework.dll.J2EE.vmwcsproj +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/framework/nunit.framework.dll.csproj b/mcs/nunit20/framework/nunit.framework.dll.csproj deleted file mode 100755 index 4b892f57e22..00000000000 --- a/mcs/nunit20/framework/nunit.framework.dll.csproj +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/framework/nunit.framework.dll20.J2EE.csproj b/mcs/nunit20/framework/nunit.framework.dll20.J2EE.csproj deleted file mode 100644 index 7e239df8b5e..00000000000 --- a/mcs/nunit20/framework/nunit.framework.dll20.J2EE.csproj +++ /dev/null @@ -1,139 +0,0 @@ - - - bin\Release_Java20\ - TRACE;TARGET_JVM;NET_1_1;NET_2_0 - 285212672 - true - pdbonly - AnyCPU - prompt - false - false - 1 - false - - - - - 2.0 - 1.5.0_05 - 0 - bin\Debug\nunit.framework.xml - - - true - bin\Debug_Java20\ - TRACE;DEBUG;TARGET_JVM;NET_1_1;NET_2_0 - 285212672 - full - AnyCPU - prompt - True - False - 1 - false - - - - - 2.0 - 1.5.0_05 - 0 - bin\Debug\nunit.framework.xml - - - Debug_Java - AnyCPU - 8.0.50727 - 2.0 - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC} - Library - Properties - NUnit.Framework - nunit.framework - 1.5.0_05 - 1 - 2.0 - {F6B19D50-1E2E-4e87-ADFB-10393B439DE0};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - true - full - false - bin\Debug_Java\ - TRACE;DEBUG;TARGET_JVM;NET_1_1;ONLY_1_1 - prompt - 4 - 285212672 - false - True - False - 0 - - - bin\Debug\nunit.framework.xml - - - pdbonly - true - bin\Release_Java\ - TRACE;TARGET_JVM;NET_1_1;ONLY_1_1 - prompt - 4 - 285212672 - false - false - false - 0 - - - bin\Debug\nunit.framework.xml - - - - False - ..\..\class\lib\J2SE.Helpers.dll - - - False - ..\..\class\lib\rt.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mcs/nunit20/framework/nunit.framework.dll20.csproj b/mcs/nunit20/framework/nunit.framework.dll20.csproj deleted file mode 100644 index f66d4462829..00000000000 --- a/mcs/nunit20/framework/nunit.framework.dll20.csproj +++ /dev/null @@ -1,168 +0,0 @@ - - - Local - 8.0.50727 - 2.0 - {83DD7E12-A705-4DBA-9D71-09C8973D9382} - Debug - AnyCPU - - - - - nunit.framework - - - JScript - Grid - IE50 - false - Library - NUnit.Framework - OnBuildSuccess - - - - - - - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;StronglyNamedAssembly - bin\Debug\nunit.framework.xml - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - bin\Release\ - false - 285212672 - false - - - TRACE;StronglyNamedAssembly - bin\Release\nunit.framework.xml - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - bin\Debug\ - false - 285212672 - false - - - DEBUG;TRACE;StronglyNamedAssembly - bin\Debug\nunit.framework.xml - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - - System - - - System.Data - - - System.XML - - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - \ No newline at end of file diff --git a/mcs/nunit20/license.rtf b/mcs/nunit20/license.rtf deleted file mode 100755 index 8a6874e7339..00000000000 --- a/mcs/nunit20/license.rtf +++ /dev/null @@ -1,38 +0,0 @@ -{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch13\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f13\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????\'a8\'ac??};}{\f36\fnil\fcharset134\fprq2{\*\panose 00000000000000000000}@SimSun;} -{\f37\froman\fcharset238\fprq2 Times New Roman CE;}{\f38\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f40\froman\fcharset161\fprq2 Times New Roman Greek;}{\f41\froman\fcharset162\fprq2 Times New Roman Tur;} -{\f42\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f43\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f44\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f45\froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\f57\fmodern\fcharset238\fprq1 Courier New CE;}{\f58\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f60\fmodern\fcharset161\fprq1 Courier New Greek;}{\f61\fmodern\fcharset162\fprq1 Courier New Tur;}{\f62\fmodern\fcharset177\fprq1 Courier New (Hebrew);} -{\f63\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f64\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f65\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255; -\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0; -\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp1033\langfenp2052 \snext0 Normal;}{\*\cs10 -\additive \ssemihidden Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\loch\f0\hich\af0\dbch\af13\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{ -\s15\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1033\langfe2052\loch\f2\hich\af2\dbch\af13\cgrid\langnp1033\langfenp2052 \sbasedon0 \snext15 \styrsid9332467 Plain Text;}}{\*\rsidtbl \rsid610709\rsid818068 -\rsid7476632\rsid8721477\rsid9332467\rsid10426157\rsid11172945\rsid11871043\rsid15552035}{\*\generator Microsoft Word 10.0.3416;}{\info{\title Copyright (c) 2002 James W}{\author James Newkirk}{\operator Charlie}{\creatim\yr2002\mo9\dy11\hr14\min43} -{\revtim\yr2004\mo5\dy15\hr15\min52}{\version7}{\edmins5}{\nofpages1}{\nofwords159}{\nofchars912}{\*\company Nascent Software, Inc.}{\nofcharsws1069}{\vern16453}}\margl1319\margr1319 -\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1319\dgvorigin1440\dghshow1\dgvshow1 -\jexpand\viewkind1\viewscale120\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot15552035 \fet0\sectd -\linex0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid9332467\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}} -{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain -\s15\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9332467 \fs20\lang1033\langfe2052\loch\af2\hich\af2\dbch\af13\cgrid\langnp1033\langfenp2052 {\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Copyright }{ -\insrsid10426157 \loch\af2\dbch\af13\hich\f2 \'a9\loch\f2 }{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 2002}{\insrsid8721477 \hich\af2\dbch\af13\loch\f2 -200}{\insrsid11871043 \hich\af2\dbch\af13\loch\f2 4}{\insrsid610709\charrsid9332467 -\hich\af2\dbch\af13\loch\f2 James W. Newkirk, Mich}{\insrsid7476632 \hich\af2\dbch\af13\loch\f2 ael C. Two, Alexei A. Vorontsov, Charlie Poole -\par }{\insrsid11871043 \hich\af2\dbch\af13\loch\f2 \hich\f2 Copyright \'a9\loch\f2 2000-2004}{\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Philip A. Craig -\par -\par \hich\af2\dbch\af13\loch\f2 This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. -\par -\par \hich\af2\dbch\af13\loch\f2 Permission is granted to anyone to use this software for any purpose, including \hich\af2\dbch\af13\loch\f2 commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: -\par -\par \hich\af2\dbch\af13\loch\f2 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a p\hich\af2\dbch\af13\loch\f2 -roduct, an acknowledgment (see the following) in the product documentation is required. -\par -\par \hich\af2\dbch\af13\loch\f2 Portions Copyright }{\insrsid10426157 \loch\af2\dbch\af13\hich\f2 \'a9\loch\f2 2002}{\insrsid11871043 \hich\af2\dbch\af13\loch\f2 -2004}{\insrsid10426157 \hich\af2\dbch\af13\loch\f2 James W. Newkirk, }{ -\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Michael C. Two, Alexei A. Vorontsov, Charlie Poole or Copyright }{\insrsid10426157 \loch\af2\dbch\af13\hich\f2 \'a9}{\insrsid11871043 \hich\af2\dbch\af13\loch\f2 2000-2004}{ -\insrsid610709\charrsid9332467 \hich\af2\dbch\af13\loch\f2 Philip A. Craig -\par -\par \hich\af2\dbch\af13\loch\f2 2. Altered source version\hich\af2\dbch\af13\loch\f2 s must be plainly marked as such, and must not be misrepresented as being the original software. -\par -\par \hich\af2\dbch\af13\loch\f2 3. This notice may not be removed or altered from any source distribution.}{\insrsid9332467 -\par }} \ No newline at end of file diff --git a/mcs/nunit20/mocks/AssemblyInfo.cs b/mcs/nunit20/mocks/AssemblyInfo.cs deleted file mode 100644 index 696f7f6f022..00000000000 --- a/mcs/nunit20/mocks/AssemblyInfo.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; - -#if !TARGET_JVM -[assembly: CLSCompliant(true)] -#endif - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("2.2.8.0")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// - -#if !StronglyNamedAssembly -[assembly: AssemblyDelaySign(false)] -#else -[assembly: AssemblyKeyFile("../../../nunit.key")] -[assembly: AssemblyKeyName("")] -#endif diff --git a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/DynamicMock.xml b/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/DynamicMock.xml deleted file mode 100644 index 2aa9dedeb5c..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/DynamicMock.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - nunit.mocks - 2.2.8.0 - - - NUnit.Mocks.Mock - - - - To be added. - To be added. - - - - - Constructor - - 2.2.8.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.8.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.8.0 - - - System.Object - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/ICall.xml b/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/ICall.xml deleted file mode 100644 index 1795692dd90..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/ICall.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - nunit.mocks - 2.2.8.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Object - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/ICallHandler.xml b/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/ICallHandler.xml deleted file mode 100644 index c9b75bcc0f0..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/ICallHandler.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - nunit.mocks - 2.2.8.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Object - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/IMethod.xml b/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/IMethod.xml deleted file mode 100644 index 4fde8d73f22..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/IMethod.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - nunit.mocks - 2.2.8.0 - - - - NUnit.Mocks.ICall - - - NUnit.Mocks.IVerify - - - - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.8.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/IMock.xml b/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/IMock.xml deleted file mode 100644 index 59210a4dbc6..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/IMock.xml +++ /dev/null @@ -1,189 +0,0 @@ - - - - nunit.mocks - 2.2.8.0 - - - - NUnit.Mocks.ICallHandler - - - NUnit.Mocks.IVerify - - - - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.8.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.8.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/IVerify.xml b/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/IVerify.xml deleted file mode 100644 index b354a6d9209..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/IVerify.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - nunit.mocks - 2.2.8.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MethodSignature.xml b/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MethodSignature.xml deleted file mode 100644 index f32d6a7fc26..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MethodSignature.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - nunit.mocks - 2.2.8.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.8.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Field - - 2.2.8.0 - - - System.Type[] - - - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Type[] - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Field - - 2.2.8.0 - - - System.String - - - To be added. - To be added. - - - - - Field - - 2.2.8.0 - - - System.String - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/Mock.xml b/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/Mock.xml deleted file mode 100644 index 1d33dbdaae5..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/Mock.xml +++ /dev/null @@ -1,273 +0,0 @@ - - - - nunit.mocks - 2.2.8.0 - - - System.Object - - - - NUnit.Mocks.IMock - - - - To be added. - To be added. - - - - - Constructor - - 2.2.8.0 - - - - To be added. - To be added. - - - - - Constructor - - 2.2.8.0 - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Object - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.8.0 - - - System.Exception - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.8.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.8.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MockCall.xml b/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MockCall.xml deleted file mode 100644 index b45cd4c9b71..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MockCall.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - nunit.mocks - 2.2.8.0 - - - System.Object - - - - NUnit.Mocks.ICall - - - - To be added. - To be added. - - - - - Constructor - - 2.2.8.0 - - - - - - - - - System.ParamArray - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Object - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MockInterfaceHandler.xml b/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MockInterfaceHandler.xml deleted file mode 100644 index b41078b044c..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MockInterfaceHandler.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - nunit.mocks - 2.2.8.0 - - - System.Runtime.Remoting.Proxies.RealProxy - - - - To be added. - To be added. - - - - - Constructor - - 2.2.8.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Runtime.Remoting.Messaging.IMessage - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MockMethod.xml b/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MockMethod.xml deleted file mode 100644 index e31fd7bb99e..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/NUnit.Mocks/MockMethod.xml +++ /dev/null @@ -1,139 +0,0 @@ - - - - nunit.mocks - 2.2.8.0 - - - System.Object - - - - NUnit.Mocks.IMethod - - - - To be added. - To be added. - - - - - Constructor - - 2.2.8.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.8.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.8.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Object - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.8.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.8.0 - - - System.Void - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/mocks/Documentation/en/index.xml b/mcs/nunit20/mocks/Documentation/en/index.xml deleted file mode 100644 index 8479ce0e7d4..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/index.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows=true) - - - System.Reflection.AssemblyKeyName("") - - - System.Reflection.AssemblyTrademark("") - - - System.Reflection.AssemblyCopyright("") - - - System.Reflection.AssemblyProduct("") - - - System.Reflection.AssemblyCompany("") - - - System.Reflection.AssemblyConfiguration("") - - - System.Reflection.AssemblyDescription("") - - - System.Reflection.AssemblyTitle("") - - - System.CLSCompliant(true) - - - - - To be added. - To be added. - - - - - - - - - - - - - - - - nunit.mocks - diff --git a/mcs/nunit20/mocks/Documentation/en/ns-NUnit.Mocks.xml b/mcs/nunit20/mocks/Documentation/en/ns-NUnit.Mocks.xml deleted file mode 100644 index 888b043512c..00000000000 --- a/mcs/nunit20/mocks/Documentation/en/ns-NUnit.Mocks.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - To be added. - To be added. - - diff --git a/mcs/nunit20/mocks/DynamicMock.cs b/mcs/nunit20/mocks/DynamicMock.cs deleted file mode 100644 index 5c528eaf6f7..00000000000 --- a/mcs/nunit20/mocks/DynamicMock.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; - -namespace NUnit.Mocks -{ - /// - /// Summary description for DynamicMock. - /// - public class DynamicMock : Mock - { - private Type type; - - private object mockInstance; - - public object MockInstance - { - get - { - if ( mockInstance == null ) - { - MockInterfaceHandler handler = new MockInterfaceHandler( type, this ); - mockInstance = handler.GetTransparentProxy(); - } - - return mockInstance; - } - } - - #region Constructors - - public DynamicMock( Type type ) : this( "Mock" + type.Name, type ) { } - - public DynamicMock( string name, Type type ) : base( name ) - { -// if ( !type.IsInterface ) -// throw new VerifyException( "DynamicMock constructor requires an interface type" ); - this.type = type; - } - - #endregion - } -} diff --git a/mcs/nunit20/mocks/ICall.cs b/mcs/nunit20/mocks/ICall.cs deleted file mode 100644 index d1cea648a98..00000000000 --- a/mcs/nunit20/mocks/ICall.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace NUnit.Mocks -{ - /// - /// The ICall interface is implemented by objects that can be called - /// with an array of arguments and return a value. - /// - public interface ICall - { - /// - /// Process a call with a possibly empty set of arguments. - /// - /// Arguments for this call - /// An implementation-defined return value - object Call( object[] args ); - } -} diff --git a/mcs/nunit20/mocks/ICallHandler.cs b/mcs/nunit20/mocks/ICallHandler.cs deleted file mode 100644 index 802e4df181a..00000000000 --- a/mcs/nunit20/mocks/ICallHandler.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace NUnit.Mocks -{ - /// - /// The ICallHandler interface dispatches calls to methods or - /// other objects implementing the ICall interface. - /// - public interface ICallHandler - { - /// - /// Simulate a method call on the mocked object. - /// - /// The name of the method - /// Arguments for this call - /// Previously specified object or null - object Call( string methodName, params object[] args ); - } -} diff --git a/mcs/nunit20/mocks/IMethod.cs b/mcs/nunit20/mocks/IMethod.cs deleted file mode 100644 index f219e1a8264..00000000000 --- a/mcs/nunit20/mocks/IMethod.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace NUnit.Mocks -{ - /// - /// The IMethod interface represents an method or other named object that - /// is both callable and self-verifying. - /// - public interface IMethod : IVerify, ICall - { - /// - /// The name of the object - /// - string Name { get; } - - /// - /// Tell the object to expect a certain call. - /// - /// - void Expect( ICall call ); - } -} diff --git a/mcs/nunit20/mocks/IMock.cs b/mcs/nunit20/mocks/IMock.cs deleted file mode 100644 index e781813d5ff..00000000000 --- a/mcs/nunit20/mocks/IMock.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; - -namespace NUnit.Mocks -{ - /// - /// Summary description for IMock. - /// - public interface IMock : IVerify, ICallHandler - { - /// - /// The name of this mock - used in messages - /// - string Name { get; } - - /// - /// True if unexpected calls should cause an error, false to ignore them - /// - bool Strict { get; set; } - - /// - /// Set up to expect a call to a method with a set of arguments - /// - /// The name of the method - /// Arguments for this call - void Expect( string methodName, params object[] args ); - - void Expect( string MethodName ); - - /// - /// Set up expectation that the named method will not be called - /// - /// The name of the method - void ExpectNoCall( string methodName ); - - /// - /// Set up to expect a call to a method with a set of arguments. - /// The specified value will be returned. - /// - /// The name of the method - /// The value to be returned - /// Arguments for this call - void ExpectAndReturn( string methodName, object returnVal, params object[] args ); - - /// - /// Set up to expect a call to a method with a set of arguments. - /// The specified exception will be thrown. - /// - /// The name of the method - /// The exception to throw - /// Arguments for this call - void ExpectAndThrow( string methodname, Exception exception, params object[] args ); - - /// - /// Set value to return for a method or property called with any arguments - /// - /// The name of the method - /// The value to be returned - void SetReturnValue( string methodName, object returnVal ); - } -} diff --git a/mcs/nunit20/mocks/IVerify.cs b/mcs/nunit20/mocks/IVerify.cs deleted file mode 100644 index ee0fe88721e..00000000000 --- a/mcs/nunit20/mocks/IVerify.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace NUnit.Mocks -{ - /// - /// The IVerify interface is implemented by objects capable of self-verification. - /// - public interface IVerify - { - void Verify(); - } -} diff --git a/mcs/nunit20/mocks/Makefile b/mcs/nunit20/mocks/Makefile deleted file mode 100644 index 7a9d884b4cb..00000000000 --- a/mcs/nunit20/mocks/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -thisdir = nunit20/mocks -SUBDIRS = -include ../../build/rules.make - -LIBRARY = nunit.mocks.dll -LIBRARY_SNK = $(topdir)/nunit.key - -LOCAL_MCS_FLAGS= -debug -r:nunit.framework.dll -r:System.dll /d:StronglyNamedAssembly -NO_TEST = yo - -ifeq (net_2_0, $(PROFILE)) -NO_INSTALL = yes -install-local: install-symlink -uninstall-local: uninstall-symlink -endif - -EXTRA_DISTFILES = nunit.mocks.csproj - -include ../../build/library.make - -symlinkdir = $(mono_libdir)/mono/$(FRAMEWORK_VERSION) -install-symlink: - $(MKINSTALLDIRS) $(DESTDIR)$(symlinkdir) - cd $(DESTDIR)$(symlinkdir) && rm -f $(LIBRARY_NAME) && ln -s ../1.0/$(LIBRARY_NAME) $(LIBRARY_NAME) - -uninstall-symlink: - rm -f $(DESTDIR)$(symlinkdir)/$(LIBRARY_NAME) diff --git a/mcs/nunit20/mocks/MethodSignature.cs b/mcs/nunit20/mocks/MethodSignature.cs deleted file mode 100644 index 516b5ed6d37..00000000000 --- a/mcs/nunit20/mocks/MethodSignature.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; - -namespace NUnit.Mocks -{ - /// - /// Summary description for MockSignature. - /// - public class MethodSignature - { - public readonly string typeName; - public readonly string methodName; - public readonly Type[] argTypes; - - public MethodSignature( string typeName, string methodName, Type[] argTypes ) - { - this.typeName = typeName; - this.methodName = methodName; - this.argTypes = argTypes; - } - - public bool IsCompatibleWith( object[] args ) - { - if ( args.Length != argTypes.Length ) - return false; - - for( int i = 0; i < args.Length; i++ ) - if ( !argTypes[i].IsAssignableFrom( args[i].GetType() ) ) - return false; - - return true; - } - - public static Type[] GetArgTypes( object[] args ) - { - if ( args == null ) - return new Type[0]; - - Type[] argTypes = new Type[args.Length]; - for (int i = 0; i < argTypes.Length; ++i) - { - if (args[i] == null) - argTypes[i] = typeof(object); - else - argTypes[i] = args[i].GetType(); - } - - return argTypes; - } - } -} diff --git a/mcs/nunit20/mocks/Mock.cs b/mcs/nunit20/mocks/Mock.cs deleted file mode 100644 index 5a82615ed35..00000000000 --- a/mcs/nunit20/mocks/Mock.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.Collections; -using System.Runtime.Remoting.Proxies; -using System.Runtime.Remoting.Messaging; -using NUnit.Framework; - -namespace NUnit.Mocks -{ - /// - /// Summary description for MockObject. - /// - public class Mock : IMock - { - #region Private Fields - - private string name; - - private bool strict; - - private IDictionary methods = new Hashtable(); - - private Exception lastException; - - #endregion - - #region Properties - - public Exception LastException - { - get { return lastException; } - } - - #endregion - - #region Constructors - - public Mock() : this( "Mock" ) { } - - public Mock( string name ) - { - this.name = name; - } - - #endregion - - #region IMock Members - - public string Name - { - get { return name; } - } - - public bool Strict - { - get { return strict; } - set { strict = value; } - } - - public void Expect( string methodName, params object[] args ) - { - ExpectAndReturn( methodName, null, args ); - } - - public void Expect( string methodName ) - { - ExpectAndReturn( methodName, null, null ); - } - - public void ExpectNoCall( string methodName ) - { - methods[methodName] = new MockMethod( methodName, null, - new AssertionException("Unexpected call to method " + methodName) ); - } - - public void ExpectAndReturn( string methodName, object returnVal, params object[] args ) - { - AddExpectedCall( methodName, returnVal, null, args ); - } - - public void ExpectAndThrow( string methodName, Exception exception, params object[] args ) - { - AddExpectedCall( methodName, null, exception, args ); - } - - public void SetReturnValue( string methodName, object returnVal ) - { - methods[methodName] = new MockMethod( methodName, returnVal ); - } - - #endregion - - #region IVerify Members - - public virtual void Verify() - { - foreach( IMethod method in methods.Values ) - method.Verify(); - } - - #endregion - - #region ICallHandler Members - - public virtual object Call( string methodName, params object[] args ) - { - if ( methods.Contains( methodName ) ) - { - try - { - IMethod method = (IMethod)methods[methodName]; - return method.Call( args ); - } - catch( Exception exception ) - { - // Save exception in case MO is running on a separate thread - lastException = exception; - throw; - } - } - else // methodName is not listed in methods - if ( Strict ) - Assert.Fail( "Unexpected call to " + methodName ); - - // not listed but Strict is not specified - return null; - } - - #endregion - - #region Helper Methods - - private void AddExpectedCall( string methodName, object returnVal, Exception exception, object[] args ) - { - IMethod method = (IMethod)methods[methodName]; - if ( method == null ) - { - method = new MockMethod( methodName ); - methods[methodName] = method; - } - - Type[] argTypes = MethodSignature.GetArgTypes( args ); - MethodSignature signature = new MethodSignature( this.Name, methodName, argTypes ); - - method.Expect( new MockCall( signature, returnVal, exception, args ) ); - } - - #endregion - } -} diff --git a/mcs/nunit20/mocks/MockCall.cs b/mcs/nunit20/mocks/MockCall.cs deleted file mode 100644 index 0cb64f8607d..00000000000 --- a/mcs/nunit20/mocks/MockCall.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using NUnit.Framework; - -namespace NUnit.Mocks -{ - /// - /// Summary description for ExpectedCall. - /// - public class MockCall : ICall - { - private MethodSignature signature; - private object returnVal; - private Exception exception; - private object[] expectedArgs; - -// public static object[] Any = new object[0]; - - public MockCall( MethodSignature signature, object returnVal, Exception exception, params object[] args ) - { - this.signature = signature; - this.returnVal = returnVal; - this.exception = exception; - this.expectedArgs = args; - } - - public object Call( object[] actualArgs ) - { - if ( expectedArgs != null ) -// if ( expectedArgs.Length != 0 ) - { - //Assert.IsTrue( signature.IsCompatibleWith( actualArgs ) ); - Assert.AreEqual( expectedArgs.Length, actualArgs.Length ); - - for( int i = 0; i < expectedArgs.Length; i++ ) - Assert.AreEqual( expectedArgs[i], actualArgs[i] ); - } - - if ( exception != null ) - throw exception; - - return returnVal; - } - } -} diff --git a/mcs/nunit20/mocks/MockInterfaceHandler.cs b/mcs/nunit20/mocks/MockInterfaceHandler.cs deleted file mode 100644 index 6b2b5dacc3e..00000000000 --- a/mcs/nunit20/mocks/MockInterfaceHandler.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections; -using System.Runtime.Remoting.Proxies; -using System.Runtime.Remoting.Messaging; -using System.Reflection; - -namespace NUnit.Mocks -{ - /// - /// Summary description for MockInterfaceHandler. - /// - public class MockInterfaceHandler : RealProxy - { - private ICallHandler callHandler; - - public MockInterfaceHandler( Type type, ICallHandler callHandler ) : base( type ) - { - this.callHandler = callHandler; - } - - public override IMessage Invoke( IMessage msg ) - { - IMethodCallMessage call = (IMethodCallMessage)msg; - IMethodReturnMessage result = null; - - if ( call != null ) - { - try - { - object ret = callHandler.Call( call.MethodName, call.Args ); - - if ( ret == null ) - { - MethodInfo info = call.MethodBase as MethodInfo; - Type returnType = info.ReturnType; - - if( returnType == typeof( System.Boolean ) ) ret = false; - - if( returnType == typeof( System.Byte ) ) ret = (System.Byte)0; - if( returnType == typeof( System.SByte ) ) ret = (System.SByte)0; - if( returnType == typeof( System.Decimal ) ) ret = (System.Decimal)0; - if( returnType == typeof( System.Double ) ) ret = (System.Double)0; - if( returnType == typeof( System.Single ) ) ret = (System.Single)0; - if( returnType == typeof( System.Int32 ) ) ret = (System.Int32)0; - if( returnType == typeof( System.UInt32 ) ) ret = (System.UInt32)0; - if( returnType == typeof( System.Int64 ) ) ret = (System.Int64)0; - if( returnType == typeof( System.UInt64 ) ) ret = (System.UInt64)0; - if( returnType == typeof( System.Int16 ) ) ret = (System.Int16)0; - if( returnType == typeof( System.UInt16 ) ) ret = (System.UInt16)0; - - if( returnType == typeof( System.Char ) ) ret = '?'; - } - - result = new ReturnMessage( ret, null, 0, null, call ); - } - catch( Exception e ) - { - result = new ReturnMessage( e, call ); - } - } - - return result; - } - } -} - diff --git a/mcs/nunit20/mocks/MockMethod.cs b/mcs/nunit20/mocks/MockMethod.cs deleted file mode 100644 index 4a48e1bf09a..00000000000 --- a/mcs/nunit20/mocks/MockMethod.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Collections; -using NUnit.Framework; - -namespace NUnit.Mocks -{ - /// - /// The MockMethod object represents one named method on a mock object. - /// All overloads are represented by one MockMethod. A method may return - /// a fixed value, throw a fixed exception or have an expected sequence - /// of calls. If it has a call sequence, then the signature must match and - /// each call provides it's own return value or exception. - /// - public class MockMethod : IMethod - { - #region Private Fields - - /// - /// Name of this method - /// - private string methodName; - - /// - /// Fixed return value - /// - private object returnVal; - - /// - /// Exception to be thrown - /// - private Exception exception; - - /// - /// Expected call sequence. If null, this method has no expectations - /// and simply provides a fixed return value or exception. - /// - private ArrayList expectedCalls = null; - - /// - /// Actual sequence of calls... currently not used - /// - //private ArrayList actualCalls = null; - - #endregion - - #region Constructors - - public MockMethod( string methodName ) - : this( methodName, null, null ) { } - - public MockMethod( string methodName, object returnVal ) - : this( methodName, returnVal, null ) { } - - public MockMethod( string methodName, object returnVal, Exception exception ) - { - this.methodName = methodName; - this.returnVal = returnVal; - this.exception = exception; - } - - #endregion - - #region IMethod Members - - public string Name - { - get { return methodName; } - } - - public void Expect( ICall call ) - { - if ( expectedCalls == null ) - expectedCalls = new ArrayList(); - - expectedCalls.Add( call ); - } - - #endregion - - #region ICall Members - - public object Call( object[] args ) - { - if ( expectedCalls == null ) - { - if ( exception != null ) - throw exception; - - return returnVal; - } - else - { - //actualCalls.Add( new MethodCall( methodName, null, null, args ) ); - Assert.IsTrue( expectedCalls.Count > 0, "Too many calls to " + Name ); - MockCall mockCall = (MockCall)expectedCalls[0]; - expectedCalls.RemoveAt( 0 ); - return mockCall.Call( args ); - } - } - - #endregion - - #region IVerify Members - - public void Verify() - { - if ( expectedCalls != null ) - Assert.IsTrue( expectedCalls.Count == 0, "Not all methods were called" ); - } - - #endregion - } -} diff --git a/mcs/nunit20/mocks/nunit.mocks.build b/mcs/nunit20/mocks/nunit.mocks.build deleted file mode 100644 index 018df4904d4..00000000000 --- a/mcs/nunit20/mocks/nunit.mocks.build +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/mocks/nunit.mocks.csproj b/mcs/nunit20/mocks/nunit.mocks.csproj deleted file mode 100644 index 3dc6d5feb26..00000000000 --- a/mcs/nunit20/mocks/nunit.mocks.csproj +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/mocks/nunit.mocks.dll.sources b/mcs/nunit20/mocks/nunit.mocks.dll.sources deleted file mode 100644 index d3ffb9c5779..00000000000 --- a/mcs/nunit20/mocks/nunit.mocks.dll.sources +++ /dev/null @@ -1,12 +0,0 @@ -./AssemblyInfo.cs -./DynamicMock.cs -./ICall.cs -./ICallHandler.cs -./IMethod.cs -./IMock.cs -./IVerify.cs -./MethodSignature.cs -./Mock.cs -./MockCall.cs -./MockInterfaceHandler.cs -./MockMethod.cs diff --git a/mcs/nunit20/nunit-console.sln b/mcs/nunit20/nunit-console.sln deleted file mode 100755 index 3ec499e0b79..00000000000 --- a/mcs/nunit20/nunit-console.sln +++ /dev/null @@ -1,17 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 7.00 -Project("{8BC9CEB9-8B4A-11D0-8D11-00A0C91BC942}") = "nunit-console.exe", "nunit-console.exe", "{73335CBD-181C-46CB-A2D2-189EDBE976CF}" -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - ConfigName.0 = Debug - EndGlobalSection - GlobalSection(ProjectDependencies) = postSolution - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {73335CBD-181C-46CB-A2D2-189EDBE976CF}.Debug.ActiveCfg = Debug - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/mcs/nunit20/nunit-console/App.ico b/mcs/nunit20/nunit-console/App.ico deleted file mode 100755 index 3a5525fd794..00000000000 Binary files a/mcs/nunit20/nunit-console/App.ico and /dev/null differ diff --git a/mcs/nunit20/nunit-console/AssemblyInfo.cs b/mcs/nunit20/nunit-console/AssemblyInfo.cs deleted file mode 100644 index 9f3e685e3ee..00000000000 --- a/mcs/nunit20/nunit-console/AssemblyInfo.cs +++ /dev/null @@ -1,88 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("NUnit")] -[assembly: AssemblyCopyright("Copyright (C) 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole.\r\nCopyright (C) 2000-2003 Philip Craig.\r\nAll Rights Reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - - -[assembly: AssemblyVersion("2.2.0.0")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/mcs/nunit20/nunit-console/ChangeLog b/mcs/nunit20/nunit-console/ChangeLog deleted file mode 100644 index 31a6db7f22a..00000000000 --- a/mcs/nunit20/nunit-console/ChangeLog +++ /dev/null @@ -1,73 +0,0 @@ -2007-12-06 Atsushi Enomoto - - * nunit-console.exe.config.net_3_5 : It is just a copy of *_net_2_0. - net_3_5 profile requires it. - * Makefile : added above as EXTRA_DISTFILES. - -2007-09-18 Massimiliano Mantione - - * Added "" to the - config files to allow nunit to deal with unhandled exceptions. - -2006-08-09 Vladimir Krasnov - - * added NET_2_0 projects files for VS2005 - -2006-08-09 Andrew Skiba - - * ConsoleUi.cs: TARGET_JVM ifdef. - -2006-06-15 Raja R Harinath - - * Makefile (EXTRA_DISTFILES): Rename from DISTFILES. - -2006-01-25 Boris Kirzner - * ConsoleUi.cs: added #ifdef for features not supported in TARGET_JVM. - * nunit-console.J2EE.vmwcsproj: added project file for TARGET_JVM. - -2006-01-12 Raja R Harinath - - * Makefile: Revert my '2006-01-10' commit. Prefer the more - generic fix to build/executable.make. - (DISTFILES): Distribute nunit-console.exe.config.net_2_0. - * nunit-console.exe.net_2_0.config: Delete. - -2006-01-11 Gonzalo Paniagua Javier - - * nunit-console.exe.config.net_2_0: configuration for - nunit-console in the 2.0 profile. - -2006-01-10 Raja R Harinath - - This should fix #76928. This fix incorporates ideas from a patch - posted on that bugreport. - * Makefile [net_2_0 profile]: Don't build nunit-console.exe. Copy - the executable from the 'default' profile, and use a slightly - customized nunit-console.exe.config. - * nunit-console.exe.net_2_0.config: New config file for the - net_2_0 profile. Alter the list of 'supportedRuntime's to prefer - the 2.0 runtime. - -2005-11-05 Kornél Pál - - * nunit-console.exe.config: Updated runtime version to v2.0.50727 (2.0 RTM). - -2005-01-13 Atsushi Enomoto - - * ConsoleUI.cs : at least it should flush stream, even though it - cannot close the stream (due to the behavioral difference between - Console.Out and usual StreamWriter). - -2004-11-26 Martin Baulig - - * ConsoleUI.cs (ConsoleUI.Execute): Print a short summary (number - of tests run, ignored, failed) to the console, honor the /output - argument for the detailed summary. - -2004-11-23 Raja R Harinath - - * Makefile (NO_INSTALL): Don't install nunit-console.exe. - -2004-10-28 Sebastien Pouliot - - * Updated to NUnit 2.2.0 Final Release. diff --git a/mcs/nunit20/nunit-console/ConsoleUi.cs b/mcs/nunit20/nunit-console/ConsoleUi.cs deleted file mode 100644 index 6f222bb723d..00000000000 --- a/mcs/nunit20/nunit-console/ConsoleUi.cs +++ /dev/null @@ -1,451 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Console -{ - using System; - using System.Collections; - using System.Collections.Specialized; - using System.IO; - using System.Reflection; - using System.Xml; - using System.Xml.Xsl; - using System.Xml.XPath; - using System.Resources; - using System.Text; - using System.Text.RegularExpressions; - using System.Diagnostics; - using NUnit.Core; - using NUnit.Util; - - - /// - /// Summary description for ConsoleUi. - /// - public class ConsoleUi - { -#if !TARGET_JVM - [STAThread] -#endif - public static int Main(string[] args) - { - ConsoleOptions options = new ConsoleOptions(args); - if(!options.nologo) - WriteCopyright(); - - if(options.help) - { - options.Help(); - return 0; - } - - if(options.NoArgs) - { - Console.Error.WriteLine("fatal error: no inputs specified"); - options.Help(); - return 0; - } - - if(!options.Validate()) - { - Console.Error.WriteLine("fatal error: invalid arguments"); - options.Help(); - return 2; - } - - try - { - ConsoleUi consoleUi = new ConsoleUi(); - return consoleUi.Execute( options ); - } - catch( FileNotFoundException ex ) - { - Console.WriteLine( ex.Message ); - return 2; - } - catch( BadImageFormatException ex ) - { - Console.WriteLine( ex.Message ); - return 2; - } - catch( Exception ex ) - { - Console.WriteLine( "Unhandled Exception:\n{0}", ex.ToString() ); - return 2; - } - finally - { - if(options.wait) - { - Console.Out.WriteLine("\nHit key to continue"); - Console.ReadLine(); - } - } - } - - private static XmlTextReader GetTransformReader(ConsoleOptions parser) - { - XmlTextReader reader = null; - if(!parser.IsTransform) - { - Assembly assembly = Assembly.GetAssembly(typeof(XmlResultVisitor)); - ResourceManager resourceManager = new ResourceManager("NUnit.Util.Transform",assembly); - string xmlData = (string)resourceManager.GetObject("Summary.xslt"); - - reader = new XmlTextReader(new StringReader(xmlData)); - } - else - { - FileInfo xsltInfo = new FileInfo(parser.transform); - if(!xsltInfo.Exists) - { - Console.Error.WriteLine("Transform file: {0} does not exist", xsltInfo.FullName); - reader = null; - } - else - { - reader = new XmlTextReader(xsltInfo.FullName); - } - } - - return reader; - } - - private static void WriteCopyright() - { - Assembly executingAssembly = Assembly.GetExecutingAssembly(); - System.Version version = executingAssembly.GetName().Version; - - object[] objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false); - AssemblyProductAttribute productAttr = (AssemblyProductAttribute)objectAttrs[0]; - - objectAttrs = executingAssembly.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); - AssemblyCopyrightAttribute copyrightAttr = (AssemblyCopyrightAttribute)objectAttrs[0]; - - Console.WriteLine(String.Format("{0} version {1}", productAttr.Product, version.ToString(3))); - Console.WriteLine(copyrightAttr.Copyright); - Console.WriteLine(); - - string clrPlatform = Type.GetType("Mono.Runtime", false) == null ? ".NET" : "Mono"; -#if !TARGET_JVM - Console.WriteLine( string.Format("OS Version: {0} {1} Version: {2}", - Environment.OSVersion, clrPlatform, Environment.Version ) ); -#endif - Console.WriteLine(); - } - - private static Test MakeTestFromCommandLine(TestDomain testDomain, ConsoleOptions parser) - { - NUnitProject project; - - if ( parser.IsTestProject ) - { - project = NUnitProject.LoadProject( (string)parser.Parameters[0] ); - string configName = (string) parser.config; - if ( configName != null ) - project.SetActiveConfig( configName ); - } - else - project = NUnitProject.FromAssemblies( (string[])parser.Parameters.ToArray( typeof( string ) ) ); - - return testDomain.Load( project, parser.fixture ); - } - - public ConsoleUi() - { - } - - public int Execute( ConsoleOptions options ) - { - XmlTextReader transformReader = GetTransformReader(options); - if(transformReader == null) return 3; - - ConsoleWriter outStream = options.isOut - ? new ConsoleWriter( new StreamWriter( options.output ) ) - : new ConsoleWriter(Console.Out); - - ConsoleWriter errorStream = options.isErr - ? new ConsoleWriter( new StreamWriter( options.err ) ) - : new ConsoleWriter(Console.Error); - - TestDomain testDomain = new TestDomain(outStream, errorStream); - if ( options.noshadow ) testDomain.ShadowCopyFiles = false; - - Test test = MakeTestFromCommandLine(testDomain, options); - - if(test == null) - { - Console.Error.WriteLine("Unable to locate fixture {0}", options.fixture); - return 2; - } - - Directory.SetCurrentDirectory(new FileInfo((string)options.Parameters[0]).DirectoryName); - - EventCollector collector = new EventCollector( options, outStream ); - - string savedDirectory = Environment.CurrentDirectory; - - if (options.HasInclude) - { - Console.WriteLine( "Included categories: " + options.include ); - testDomain.SetFilter( new CategoryFilter( options.IncludedCategories ) ); - } - else if ( options.HasExclude ) - { - Console.WriteLine( "Excluded categories: " + options.exclude ); - testDomain.SetFilter( new CategoryFilter( options.ExcludedCategories, true ) ); - } - - TestResult result = null; - if ( options.thread ) - { - testDomain.RunTest( collector ); - testDomain.Wait(); - result = testDomain.Result; - } - else - { - result = testDomain.Run( collector ); - } - - Directory.SetCurrentDirectory( savedDirectory ); - - Console.WriteLine(); - Console.WriteLine(); - collector.PrintSummary( result ); - Console.WriteLine(); - - string xmlOutput = CreateXmlOutput( result ); - - if (options.xmlConsole) - Console.WriteLine(xmlOutput); - else - CreateSummaryDocument(xmlOutput, transformReader, outStream); - - // Write xml output here - string xmlResultFile = options.IsXml ? options.xml : "TestResult.xml"; - - using ( StreamWriter writer = new StreamWriter( xmlResultFile ) ) - { - writer.Write(xmlOutput); - } - outStream.Flush(); - errorStream.Flush(); - - if ( testDomain != null ) - testDomain.Unload(); - - return result.IsFailure ? 1 : 0; - } - - private string CreateXmlOutput( TestResult result ) - { - StringBuilder builder = new StringBuilder(); - XmlResultVisitor resultVisitor = new XmlResultVisitor(new StringWriter( builder ), result); - result.Accept(resultVisitor); - resultVisitor.Write(); - - return builder.ToString(); - } - - private void CreateSummaryDocument(string xmlOutput, XmlTextReader transformReader, - ConsoleWriter outStream) - { - XPathDocument originalXPathDocument = new XPathDocument(new StringReader(xmlOutput)); - XslTransform summaryXslTransform = new XslTransform(); - - // Using obsolete form for now, remove warning suppression from project after changing - summaryXslTransform.Load(transformReader); - - // Using obsolete form for now, remove warning suppression from project after changing - summaryXslTransform.Transform(originalXPathDocument,null,outStream); - } - - #region Nested Class to Handle Events - - private class EventCollector : LongLivingMarshalByRefObject, EventListener - { - private int testRunCount; - private int testIgnoreCount; - private int failureCount; - private int level; - - private ConsoleOptions options; - private ConsoleWriter writer; - - StringCollection messages; - - private bool debugger = false; - private string currentTestName; - - public EventCollector( ConsoleOptions options, ConsoleWriter writer ) - { - debugger = Debugger.IsAttached; - level = 0; - this.options = options; - this.writer = writer; - this.currentTestName = string.Empty; - } - - public void RunStarted(Test[] tests) - { - } - - public void RunFinished(TestResult[] results) - { - } - - public void RunFinished(Exception exception) - { - } - - public void TestFinished(TestCaseResult testResult) - { - if ( !options.xmlConsole && !options.labels ) - { - if(testResult.Executed) - { - testRunCount++; - - if(testResult.IsFailure) - { - failureCount++; - Console.Write("F"); - if ( debugger ) - { - messages.Add( string.Format( "{0}) {1} :", failureCount, testResult.Test.FullName ) ); - messages.Add( testResult.Message.Trim( Environment.NewLine.ToCharArray() ) ); - - string stackTrace = StackTraceFilter.Filter( testResult.StackTrace ); - string[] trace = stackTrace.Split( System.Environment.NewLine.ToCharArray() ); - foreach( string s in trace ) - { - if ( s != string.Empty ) - { - string link = Regex.Replace( s.Trim(), @".* in (.*):line (.*)", "$1($2)"); - messages.Add( string.Format( "at\n{0}", link ) ); - } - } - } - } - } - else - { - testIgnoreCount++; - Console.Write("N"); - } - } - - currentTestName = string.Empty; - } - - public void TestStarted(TestCase testCase) - { - currentTestName = testCase.FullName; - - if ( options.labels ) - writer.WriteLine("***** {0}", testCase.FullName ); - else if ( !options.xmlConsole ) - Console.Write("."); -} - - public void SuiteStarted(TestSuite suite) - { - if ( debugger && level++ == 0 ) - { - messages = new StringCollection(); - testRunCount = 0; - testIgnoreCount = 0; - failureCount = 0; - Trace.WriteLine( "################################ UNIT TESTS ################################" ); - Trace.WriteLine( "Running tests in '" + suite.FullName + "'..." ); - } - } - - public void SuiteFinished(TestSuiteResult suiteResult) - { - if ( debugger && --level == 0) - { - Trace.WriteLine( "############################################################################" ); - - if (messages.Count == 0) - { - Trace.WriteLine( "############## S U C C E S S #################" ); - } - else - { - Trace.WriteLine( "############## F A I L U R E S #################" ); - - foreach ( string s in messages ) - { - Trace.WriteLine(s); - } - } - - Trace.WriteLine( "############################################################################" ); - Trace.WriteLine( "Executed tests : " + testRunCount ); - Trace.WriteLine( "Ignored tests : " + testIgnoreCount ); - Trace.WriteLine( "Failed tests : " + failureCount ); - Trace.WriteLine( "Total time : " + suiteResult.Time + " seconds" ); - Trace.WriteLine( "############################################################################"); - } - } - - public void PrintSummary (TestResult suiteResult) - { - if (failureCount > 0){ - Console.WriteLine("Tests run: {0}, Failures: {1}, Not run: {2}, Time: {3} seconds", - testRunCount, failureCount, testIgnoreCount, suiteResult.Time); - } else { - Console.WriteLine("Tests run: {0} (all pass), Not run: {1}, Time: {2} seconds", - testRunCount, testIgnoreCount, suiteResult.Time); - } - } - - public void UnhandledException( Exception exception ) - { - string msg = string.Format( "##### Unhandled Exception while running {0}", currentTestName ); - - // If we do labels, we already have a newline - if ( !options.labels ) writer.WriteLine(); - writer.WriteLine( msg ); - writer.WriteLine( exception.ToString() ); - - if ( debugger ) - { - Trace.WriteLine( msg ); - Trace.WriteLine( exception.ToString() ); - } - } - } - - #endregion - } -} - diff --git a/mcs/nunit20/nunit-console/Makefile b/mcs/nunit20/nunit-console/Makefile deleted file mode 100644 index 05ebc255aef..00000000000 --- a/mcs/nunit20/nunit-console/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -thisdir = nunit20/nunit-console -SUBDIRS = -include ../../build/rules.make - -PROGRAM = $(topdir)/class/lib/$(PROFILE)/nunit-console.exe -LOCAL_MCS_FLAGS = /r:nunit.framework.dll /r:nunit.util.dll /r:nunit.core.dll -EXTRA_DISTFILES = App.ico nunit-console.csproj \ - nunit-console.exe.config.net_2_0 \ - nunit-console.exe.config.net_3_5 - -include ../../build/executable.make diff --git a/mcs/nunit20/nunit-console/nunit-console.J2EE.vmwcsproj b/mcs/nunit20/nunit-console/nunit-console.J2EE.vmwcsproj deleted file mode 100644 index 971d3d22669..00000000000 --- a/mcs/nunit20/nunit-console/nunit-console.J2EE.vmwcsproj +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/nunit-console/nunit-console.build b/mcs/nunit20/nunit-console/nunit-console.build deleted file mode 100755 index 2b167cf6848..00000000000 --- a/mcs/nunit20/nunit-console/nunit-console.build +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/nunit-console/nunit-console.csproj b/mcs/nunit20/nunit-console/nunit-console.csproj deleted file mode 100755 index 4832eb2d36e..00000000000 --- a/mcs/nunit20/nunit-console/nunit-console.csproj +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/nunit-console/nunit-console.exe.config b/mcs/nunit20/nunit-console/nunit-console.exe.config deleted file mode 100644 index f5712847e01..00000000000 --- a/mcs/nunit20/nunit-console/nunit-console.exe.config +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/nunit-console/nunit-console.exe.config.net_2_0 b/mcs/nunit20/nunit-console/nunit-console.exe.config.net_2_0 deleted file mode 100644 index bbff23abd8d..00000000000 --- a/mcs/nunit20/nunit-console/nunit-console.exe.config.net_2_0 +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/nunit-console/nunit-console.exe.config.net_3_5 b/mcs/nunit20/nunit-console/nunit-console.exe.config.net_3_5 deleted file mode 100644 index bbff23abd8d..00000000000 --- a/mcs/nunit20/nunit-console/nunit-console.exe.config.net_3_5 +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/nunit-console/nunit-console.exe.sources b/mcs/nunit20/nunit-console/nunit-console.exe.sources deleted file mode 100644 index 5630e22a5a3..00000000000 --- a/mcs/nunit20/nunit-console/nunit-console.exe.sources +++ /dev/null @@ -1,2 +0,0 @@ -./ConsoleUi.cs -./AssemblyInfo.cs diff --git a/mcs/nunit20/nunit-console/nunit-console20.J2EE.csproj b/mcs/nunit20/nunit-console/nunit-console20.J2EE.csproj deleted file mode 100644 index 7f3a26e8b7e..00000000000 --- a/mcs/nunit20/nunit-console/nunit-console20.J2EE.csproj +++ /dev/null @@ -1,133 +0,0 @@ - - - bin\Release_Java20\ - TRACE;TARGET_JVM;NET_1_1;NET_2_0;GHT_MARSHAL_BY_REF_OBJECT;GHT_THREAD_ABORT;GHT_ENVIRONMENT_OSVERSION;GHT_ASSEMBLYNAME_VERSION;ASSEMBLY_GETASSEMBLY - 285212672 - true - pdbonly - AnyCPU - prompt - false - false - 1 - false - - - - - 2.0 - 1.5.0_05 - 0 - - - true - bin\Debug_Java20\ - TRACE;DEBUG;TARGET_JVM;NET_1_1;NET_2_0;GHT_MARSHAL_BY_REF_OBJECT;GHT_THREAD_ABORT;GHT_ENVIRONMENT_OSVERSION;GHT_ASSEMBLYNAME_VERSION;ASSEMBLY_GETASSEMBLY - 285212672 - full - AnyCPU - prompt - True - False - 1 - false - - - - - 2.0 - 1.5.0_05 - 0 - - - Debug_Java - AnyCPU - 8.0.50727 - 2.0 - {4E3FBF55-6720-43F1-880F-562F851B0221} - Exe - Properties - nunit_console - nunit-console - 1.6 - 1 - 2.0 - {F6B19D50-1E2E-4e87-ADFB-10393B439DE0};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - true - full - false - bin\Debug_Java\ - TRACE;DEBUG;TARGET_JVM;NET_1_1;ONLY_1_1;GHT_MARSHAL_BY_REF_OBJECT;GHT_THREAD_ABORT;GHT_ENVIRONMENT_OSVERSION;GHT_ASSEMBLYNAME_VERSION;ASSEMBLY_GETASSEMBLY - prompt - 4 - 285212672 - false - True - False - 0 - - - - - pdbonly - true - bin\Release_Java\ - TRACE;TARGET_JVM;NET_1_1;ONLY_1_1;GHT_MARSHAL_BY_REF_OBJECT;GHT_THREAD_ABORT;GHT_ENVIRONMENT_OSVERSION;GHT_ASSEMBLYNAME_VERSION;ASSEMBLY_GETASSEMBLY - prompt - 4 - 285212672 - false - false - false - 0 - - - - - - False - ..\..\class\lib\J2SE.Helpers.dll - - - False - ..\..\class\lib\rt.dll - - - - - - - - - - - - {995DE32D-06AB-4926-97FF-565B9205D5F8} - nunit.core.dll20.J2EE - - - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC} - nunit.framework.dll20.J2EE - - - {170EE6EB-1DEF-4BC6-88B7-6A90358BAA6B} - nunit.util.dll20.J2EE - - - - - - - - - - - diff --git a/mcs/nunit20/nunit-console/nunit-console20.csproj b/mcs/nunit20/nunit-console/nunit-console20.csproj deleted file mode 100644 index 3bb36010bfc..00000000000 --- a/mcs/nunit20/nunit-console/nunit-console20.csproj +++ /dev/null @@ -1,109 +0,0 @@ - - - Local - 8.0.50727 - 2.0 - {9367EC89-6A38-42BA-9607-0DC288E4BC3A} - Debug - AnyCPU - - - - - nunit-console - - - JScript - Grid - IE50 - false - Exe - nunit_console - OnBuildSuccess - - - - - - - - - bin\Debug\ - false - 285212672 - false - - - DEBUG;TRACE - - - true - 4096 - false - 618 - false - false - false - false - 4 - full - prompt - - - bin\Release\ - false - 285212672 - false - - - TRACE - - - false - 4096 - false - 618 - true - false - false - false - 4 - none - prompt - - - - System - - - System.Data - - - System.XML - - - - - - - Code - - - - - - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3} - nunit.core.dll20 - - - {61CE9CE5-943E-44D4-A381-814DC1406767} - nunit.util.dll20 - - - - - - - copy "$(ProjectDir)nunit-console.exe.config.net_2_0" "$(TargetDir)nunit-console.exe.config" - - \ No newline at end of file diff --git a/mcs/nunit20/nunit.build b/mcs/nunit20/nunit.build deleted file mode 100755 index 11f49b905cb..00000000000 --- a/mcs/nunit20/nunit.build +++ /dev/null @@ -1,612 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Configuration - Config: ${build.config} - Runtime: ${runtime.config}-${runtime.version} - Version: ${package.version} - Package name: ${package.name} - Zip file: ${zip.file.name} - Msi file: ${msi.file.name} - Source zip: ${zipped.src.file.name} - - Project Directories - Base: ${nant.project.basedir} - Build: ${project.build.dir} - Package: ${project.package.dir} - - Current Directories - Build: ${build.dir} - Package: ${package.dir} - - System Directories - Framework: ${nant.settings.currentframework.frameworkdirectory} - SDK: ${nant.settings.currentframework.sdkdirectory} - VS 2002: ${vs.2002.path} - VS 2003: ${vs.2003.path} - - - \ No newline at end of file diff --git a/mcs/nunit20/nunit.java.sln b/mcs/nunit20/nunit.java.sln deleted file mode 100644 index 6e1a9390ad9..00000000000 --- a/mcs/nunit20/nunit.java.sln +++ /dev/null @@ -1,63 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{83B010C7-76FC-4FAD-A26C-00D7EFE60256}") = "nunit.framework.dll.J2EE", "framework\nunit.framework.dll.J2EE.vmwcsproj", "{39CC8FF7-EF1A-41A1-B727-42684211ECD1}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{83B010C7-76FC-4FAD-A26C-00D7EFE60256}") = "nunit.core.dll.J2EE", "core\nunit.core.dll.J2EE.vmwcsproj", "{7C52A6A5-71ED-4468-9564-2FF5CD6E6E6C}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{83B010C7-76FC-4FAD-A26C-00D7EFE60256}") = "nunit.util.dll.J2EE", "util\nunit.util.dll.J2EE.vmwcsproj", "{36BE0465-4DE4-44CE-AF8D-6E50D0C40BC6}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{83B010C7-76FC-4FAD-A26C-00D7EFE60256}") = "nunit-console.J2EE", "nunit-console\nunit-console.J2EE.vmwcsproj", "{EE901CF2-A263-471C-AEE2-2400A7105ABE}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Debug_Java = Debug_Java - Release = Release - Release_Java = Release_Java - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {39CC8FF7-EF1A-41A1-B727-42684211ECD1}.Debug.ActiveCfg = Debug|.NET - {39CC8FF7-EF1A-41A1-B727-42684211ECD1}.Debug.Build.0 = Debug|.NET - {39CC8FF7-EF1A-41A1-B727-42684211ECD1}.Debug_Java.ActiveCfg = Debug_Java|.NET - {39CC8FF7-EF1A-41A1-B727-42684211ECD1}.Debug_Java.Build.0 = Debug_Java|.NET - {39CC8FF7-EF1A-41A1-B727-42684211ECD1}.Release.ActiveCfg = Release_Java|.NET - {39CC8FF7-EF1A-41A1-B727-42684211ECD1}.Release.Build.0 = Release_Java|.NET - {39CC8FF7-EF1A-41A1-B727-42684211ECD1}.Release_Java.ActiveCfg = Release_Java|.NET - {39CC8FF7-EF1A-41A1-B727-42684211ECD1}.Release_Java.Build.0 = Release_Java|.NET - {7C52A6A5-71ED-4468-9564-2FF5CD6E6E6C}.Debug.ActiveCfg = Debug|.NET - {7C52A6A5-71ED-4468-9564-2FF5CD6E6E6C}.Debug.Build.0 = Debug|.NET - {7C52A6A5-71ED-4468-9564-2FF5CD6E6E6C}.Debug_Java.ActiveCfg = Debug_Java|.NET - {7C52A6A5-71ED-4468-9564-2FF5CD6E6E6C}.Debug_Java.Build.0 = Debug_Java|.NET - {7C52A6A5-71ED-4468-9564-2FF5CD6E6E6C}.Release.ActiveCfg = Release_Java|.NET - {7C52A6A5-71ED-4468-9564-2FF5CD6E6E6C}.Release.Build.0 = Release_Java|.NET - {7C52A6A5-71ED-4468-9564-2FF5CD6E6E6C}.Release_Java.ActiveCfg = Release_Java|.NET - {7C52A6A5-71ED-4468-9564-2FF5CD6E6E6C}.Release_Java.Build.0 = Release_Java|.NET - {36BE0465-4DE4-44CE-AF8D-6E50D0C40BC6}.Debug.ActiveCfg = Debug|.NET - {36BE0465-4DE4-44CE-AF8D-6E50D0C40BC6}.Debug.Build.0 = Debug|.NET - {36BE0465-4DE4-44CE-AF8D-6E50D0C40BC6}.Debug_Java.ActiveCfg = Debug_Java|.NET - {36BE0465-4DE4-44CE-AF8D-6E50D0C40BC6}.Debug_Java.Build.0 = Debug_Java|.NET - {36BE0465-4DE4-44CE-AF8D-6E50D0C40BC6}.Release.ActiveCfg = Release_Java|.NET - {36BE0465-4DE4-44CE-AF8D-6E50D0C40BC6}.Release.Build.0 = Release_Java|.NET - {36BE0465-4DE4-44CE-AF8D-6E50D0C40BC6}.Release_Java.ActiveCfg = Release_Java|.NET - {36BE0465-4DE4-44CE-AF8D-6E50D0C40BC6}.Release_Java.Build.0 = Release_Java|.NET - {EE901CF2-A263-471C-AEE2-2400A7105ABE}.Debug.ActiveCfg = Debug|.NET - {EE901CF2-A263-471C-AEE2-2400A7105ABE}.Debug.Build.0 = Debug|.NET - {EE901CF2-A263-471C-AEE2-2400A7105ABE}.Debug_Java.ActiveCfg = Debug_Java|.NET - {EE901CF2-A263-471C-AEE2-2400A7105ABE}.Debug_Java.Build.0 = Debug_Java|.NET - {EE901CF2-A263-471C-AEE2-2400A7105ABE}.Release.ActiveCfg = Release_Java|.NET - {EE901CF2-A263-471C-AEE2-2400A7105ABE}.Release.Build.0 = Release_Java|.NET - {EE901CF2-A263-471C-AEE2-2400A7105ABE}.Release_Java.ActiveCfg = Release_Java|.NET - {EE901CF2-A263-471C-AEE2-2400A7105ABE}.Release_Java.Build.0 = Release_Java|.NET - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/mcs/nunit20/nunit.sln b/mcs/nunit20/nunit.sln deleted file mode 100755 index be1fe2d593a..00000000000 --- a/mcs/nunit20/nunit.sln +++ /dev/null @@ -1,217 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.dll", "framework\nunit.framework.dll.csproj", "{83DD7E12-A705-4DBA-9D71-09C8973D9382}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.extensions.dll", "extensions\nunit.extensions.dll.csproj", "{98B10E98-003C-45A0-9587-119142E39986}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.util.dll", "util\nunit.util.dll.csproj", "{61CE9CE5-943E-44D4-A381-814DC1406767}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-gui", "nunit-gui\nunit-gui.csproj", "{3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - {61CE9CE5-943E-44D4-A381-814DC1406767} = {61CE9CE5-943E-44D4-A381-814DC1406767} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console", "nunit-console\nunit-console.csproj", "{9367EC89-6A38-42BA-9607-0DC288E4BC3A}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - {61CE9CE5-943E-44D4-A381-814DC1406767} = {61CE9CE5-943E-44D4-A381-814DC1406767} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.tests.dll", "tests\nunit.tests.dll.csproj", "{3E63AD0F-24D4-46BE-BEE4-5A3299847D86}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - {2E368281-3BA8-4050-B05E-0E0E43F8F446} = {2E368281-3BA8-4050-B05E-0E0E43F8F446} - {98B10E98-003C-45A0-9587-119142E39986} = {98B10E98-003C-45A0-9587-119142E39986} - {5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D} = {5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D} - {61CE9CE5-943E-44D4-A381-814DC1406767} = {61CE9CE5-943E-44D4-A381-814DC1406767} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mock-assembly", "tests\mock-assembly\mock-assembly.csproj", "{2E368281-3BA8-4050-B05E-0E0E43F8F446}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "money", "samples\money\money.csproj", "{11EDF872-A04D-4F75-A1BF-71168DC86AF3}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "money-port", "samples\money-port\money-port.csproj", "{A257E931-6755-4655-A474-7CAB1B3775D2}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - EndProjectSection -EndProject -Project("{E6FDF86B-F3D1-11D4-8576-0002A516ECE8}") = "jsharp", "samples\jsharp\jsharp.vjsproj", "{B55A6E53-57A9-4205-B396-C9983B3AF46A}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csharp-sample", "samples\csharp\csharp-sample.csproj", "{15D66EEE-A852-4A52-89C2-83E74ECF3770}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - EndProjectSection -EndProject -Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vb-sample", "samples\vb\vb-sample.vbproj", "{F199991B-6C8E-4AB0-9AAA-703CD4897700}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpp-sample", "samples\cpp-sample\cpp-sample.vcproj", "{7E5849C7-0469-4AD2-91B9-C87203934254}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "install", "install\install.vdproj", "{CAA6C96A-E7FB-4EEA-9376-44D6CB3F85DD}" - ProjectSection(ProjectDependencies) = postProject - {3E63AD0F-24D4-46BE-BEE4-5A3299847D86} = {3E63AD0F-24D4-46BE-BEE4-5A3299847D86} - {3E63AD0F-24D4-46BE-BEE4-5A3299847D86} = {3E63AD0F-24D4-46BE-BEE4-5A3299847D86} - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - {F199991B-6C8E-4AB0-9AAA-703CD4897700} = {F199991B-6C8E-4AB0-9AAA-703CD4897700} - {A257E931-6755-4655-A474-7CAB1B3775D2} = {A257E931-6755-4655-A474-7CAB1B3775D2} - {B55A6E53-57A9-4205-B396-C9983B3AF46A} = {B55A6E53-57A9-4205-B396-C9983B3AF46A} - {11EDF872-A04D-4F75-A1BF-71168DC86AF3} = {11EDF872-A04D-4F75-A1BF-71168DC86AF3} - {2E368281-3BA8-4050-B05E-0E0E43F8F446} = {2E368281-3BA8-4050-B05E-0E0E43F8F446} - {2E368281-3BA8-4050-B05E-0E0E43F8F446} = {2E368281-3BA8-4050-B05E-0E0E43F8F446} - {9367EC89-6A38-42BA-9607-0DC288E4BC3A} = {9367EC89-6A38-42BA-9607-0DC288E4BC3A} - {9367EC89-6A38-42BA-9607-0DC288E4BC3A} = {9367EC89-6A38-42BA-9607-0DC288E4BC3A} - {9367EC89-6A38-42BA-9607-0DC288E4BC3A} = {9367EC89-6A38-42BA-9607-0DC288E4BC3A} - {98B10E98-003C-45A0-9587-119142E39986} = {98B10E98-003C-45A0-9587-119142E39986} - {98B10E98-003C-45A0-9587-119142E39986} = {98B10E98-003C-45A0-9587-119142E39986} - {7E5849C7-0469-4AD2-91B9-C87203934254} = {7E5849C7-0469-4AD2-91B9-C87203934254} - {5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D} = {5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D} - {3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148} = {3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148} - {3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148} = {3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148} - {3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148} = {3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148} - {61CE9CE5-943E-44D4-A381-814DC1406767} = {61CE9CE5-943E-44D4-A381-814DC1406767} - {61CE9CE5-943E-44D4-A381-814DC1406767} = {61CE9CE5-943E-44D4-A381-814DC1406767} - {15D66EEE-A852-4A52-89C2-83E74ECF3770} = {15D66EEE-A852-4A52-89C2-83E74ECF3770} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nonamespace-assembly", "tests\nonamespace-assembly\nonamespace-assembly.csproj", "{5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "timing-tests", "tests\timing-tests\timing-tests.csproj", "{F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - {2E368281-3BA8-4050-B05E-0E0E43F8F446} = {2E368281-3BA8-4050-B05E-0E0E43F8F446} - {61CE9CE5-943E-44D4-A381-814DC1406767} = {61CE9CE5-943E-44D4-A381-814DC1406767} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.uikit.dll", "UiKit\nunit.uikit.dll.csproj", "{27531BBF-183D-4C3A-935B-D840B9F1A3A4}" - ProjectSection(ProjectDependencies) = postProject - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {83DD7E12-A705-4DBA-9D71-09C8973D9382} - {61CE9CE5-943E-44D4-A381-814DC1406767} = {61CE9CE5-943E-44D4-A381-814DC1406767} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "notestfixtures-assembly", "tests\notestfixtures-assembly\notestfixtures-assembly.csproj", "{8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.dll", "core\nunit.core.dll.csproj", "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.mocks", "mocks\nunit.mocks.csproj", "{EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug.ActiveCfg = Debug|.NET - {83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug.Build.0 = Debug|.NET - {83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release.ActiveCfg = Release|.NET - {83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release.Build.0 = Release|.NET - {98B10E98-003C-45A0-9587-119142E39986}.Debug.ActiveCfg = Debug|.NET - {98B10E98-003C-45A0-9587-119142E39986}.Debug.Build.0 = Debug|.NET - {98B10E98-003C-45A0-9587-119142E39986}.Release.ActiveCfg = Release|.NET - {98B10E98-003C-45A0-9587-119142E39986}.Release.Build.0 = Release|.NET - {61CE9CE5-943E-44D4-A381-814DC1406767}.Debug.ActiveCfg = Debug|.NET - {61CE9CE5-943E-44D4-A381-814DC1406767}.Debug.Build.0 = Debug|.NET - {61CE9CE5-943E-44D4-A381-814DC1406767}.Release.ActiveCfg = Release|.NET - {61CE9CE5-943E-44D4-A381-814DC1406767}.Release.Build.0 = Release|.NET - {3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Debug.ActiveCfg = Debug|.NET - {3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Debug.Build.0 = Debug|.NET - {3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Release.ActiveCfg = Release|.NET - {3FF340D5-D3B4-4DF0-BAF1-98B3C00B6148}.Release.Build.0 = Release|.NET - {9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Debug.ActiveCfg = Debug|.NET - {9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Debug.Build.0 = Debug|.NET - {9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Release.ActiveCfg = Release|.NET - {9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Release.Build.0 = Release|.NET - {3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Debug.ActiveCfg = Debug|.NET - {3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Debug.Build.0 = Debug|.NET - {3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Release.ActiveCfg = Release|.NET - {3E63AD0F-24D4-46BE-BEE4-5A3299847D86}.Release.Build.0 = Release|.NET - {2E368281-3BA8-4050-B05E-0E0E43F8F446}.Debug.ActiveCfg = Debug|.NET - {2E368281-3BA8-4050-B05E-0E0E43F8F446}.Debug.Build.0 = Debug|.NET - {2E368281-3BA8-4050-B05E-0E0E43F8F446}.Release.ActiveCfg = Release|.NET - {2E368281-3BA8-4050-B05E-0E0E43F8F446}.Release.Build.0 = Release|.NET - {11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Debug.ActiveCfg = Debug|.NET - {11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Debug.Build.0 = Debug|.NET - {11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Release.ActiveCfg = Release|.NET - {11EDF872-A04D-4F75-A1BF-71168DC86AF3}.Release.Build.0 = Release|.NET - {A257E931-6755-4655-A474-7CAB1B3775D2}.Debug.ActiveCfg = Debug|.NET - {A257E931-6755-4655-A474-7CAB1B3775D2}.Debug.Build.0 = Debug|.NET - {A257E931-6755-4655-A474-7CAB1B3775D2}.Release.ActiveCfg = Release|.NET - {A257E931-6755-4655-A474-7CAB1B3775D2}.Release.Build.0 = Release|.NET - {B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug.ActiveCfg = Debug|.NET - {B55A6E53-57A9-4205-B396-C9983B3AF46A}.Debug.Build.0 = Debug|.NET - {B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release.ActiveCfg = Release|.NET - {B55A6E53-57A9-4205-B396-C9983B3AF46A}.Release.Build.0 = Release|.NET - {15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug.ActiveCfg = Debug|.NET - {15D66EEE-A852-4A52-89C2-83E74ECF3770}.Debug.Build.0 = Debug|.NET - {15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release.ActiveCfg = Release|.NET - {15D66EEE-A852-4A52-89C2-83E74ECF3770}.Release.Build.0 = Release|.NET - {F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug.ActiveCfg = Debug|.NET - {F199991B-6C8E-4AB0-9AAA-703CD4897700}.Debug.Build.0 = Debug|.NET - {F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release.ActiveCfg = Release|.NET - {F199991B-6C8E-4AB0-9AAA-703CD4897700}.Release.Build.0 = Release|.NET - {7E5849C7-0469-4AD2-91B9-C87203934254}.Debug.ActiveCfg = Debug|Win32 - {7E5849C7-0469-4AD2-91B9-C87203934254}.Debug.Build.0 = Debug|Win32 - {7E5849C7-0469-4AD2-91B9-C87203934254}.Release.ActiveCfg = Release|Win32 - {7E5849C7-0469-4AD2-91B9-C87203934254}.Release.Build.0 = Release|Win32 - {CAA6C96A-E7FB-4EEA-9376-44D6CB3F85DD}.Debug.ActiveCfg = Debug - {CAA6C96A-E7FB-4EEA-9376-44D6CB3F85DD}.Release.ActiveCfg = Release - {5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Debug.ActiveCfg = Debug|.NET - {5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Debug.Build.0 = Debug|.NET - {5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Release.ActiveCfg = Release|.NET - {5110F0D2-8E50-46F8-9E17-7C8EBFECCA9D}.Release.Build.0 = Release|.NET - {F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Debug.ActiveCfg = Debug|.NET - {F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Debug.Build.0 = Debug|.NET - {F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Release.ActiveCfg = Release|.NET - {F16DED73-A2AD-4711-BC1B-5DDFC2BF8667}.Release.Build.0 = Release|.NET - {27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Debug.ActiveCfg = Debug|.NET - {27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Debug.Build.0 = Debug|.NET - {27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Release.ActiveCfg = Release|.NET - {27531BBF-183D-4C3A-935B-D840B9F1A3A4}.Release.Build.0 = Release|.NET - {8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Debug.ActiveCfg = Debug|.NET - {8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Debug.Build.0 = Debug|.NET - {8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Release.ActiveCfg = Release|.NET - {8D330DE4-B980-4A57-9F07-E9F7A7A33F4F}.Release.Build.0 = Release|.NET - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Debug.ActiveCfg = Debug|.NET - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Debug.Build.0 = Debug|.NET - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Release.ActiveCfg = Release|.NET - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Release.Build.0 = Release|.NET - {EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Debug.ActiveCfg = Debug|.NET - {EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Debug.Build.0 = Debug|.NET - {EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Release.ActiveCfg = Release|.NET - {EEE7C98B-23E6-472D-9036-C2D53B0DFE7C}.Release.Build.0 = Release|.NET - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/mcs/nunit20/nunit20.java.sln b/mcs/nunit20/nunit20.java.sln deleted file mode 100644 index 958e4d360ca..00000000000 --- a/mcs/nunit20/nunit20.java.sln +++ /dev/null @@ -1,55 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.dll20.J2EE", "core\nunit.core.dll20.J2EE.csproj", "{995DE32D-06AB-4926-97FF-565B9205D5F8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.dll20.J2EE", "framework\nunit.framework.dll20.J2EE.csproj", "{ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console20.J2EE", "nunit-console\nunit-console20.J2EE.csproj", "{4E3FBF55-6720-43F1-880F-562F851B0221}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.util.dll20.J2EE", "util\nunit.util.dll20.J2EE.csproj", "{170EE6EB-1DEF-4BC6-88B7-6A90358BAA6B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Java|Any CPU = Debug_Java|Any CPU - Debug_Java20|Any CPU = Debug_Java20|Any CPU - Release_Java|Any CPU = Release_Java|Any CPU - Release_Java20|Any CPU = Release_Java20|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {995DE32D-06AB-4926-97FF-565B9205D5F8}.Debug_Java|Any CPU.ActiveCfg = Debug_Java|Any CPU - {995DE32D-06AB-4926-97FF-565B9205D5F8}.Debug_Java|Any CPU.Build.0 = Debug_Java|Any CPU - {995DE32D-06AB-4926-97FF-565B9205D5F8}.Debug_Java20|Any CPU.ActiveCfg = Debug_Java20|Any CPU - {995DE32D-06AB-4926-97FF-565B9205D5F8}.Debug_Java20|Any CPU.Build.0 = Debug_Java20|Any CPU - {995DE32D-06AB-4926-97FF-565B9205D5F8}.Release_Java|Any CPU.ActiveCfg = Release_Java|Any CPU - {995DE32D-06AB-4926-97FF-565B9205D5F8}.Release_Java|Any CPU.Build.0 = Release_Java|Any CPU - {995DE32D-06AB-4926-97FF-565B9205D5F8}.Release_Java20|Any CPU.ActiveCfg = Release_Java20|Any CPU - {995DE32D-06AB-4926-97FF-565B9205D5F8}.Release_Java20|Any CPU.Build.0 = Release_Java20|Any CPU - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC}.Debug_Java|Any CPU.ActiveCfg = Debug_Java|Any CPU - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC}.Debug_Java|Any CPU.Build.0 = Debug_Java|Any CPU - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC}.Debug_Java20|Any CPU.ActiveCfg = Debug_Java20|Any CPU - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC}.Debug_Java20|Any CPU.Build.0 = Debug_Java20|Any CPU - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC}.Release_Java|Any CPU.ActiveCfg = Release_Java|Any CPU - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC}.Release_Java|Any CPU.Build.0 = Release_Java|Any CPU - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC}.Release_Java20|Any CPU.ActiveCfg = Release_Java20|Any CPU - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC}.Release_Java20|Any CPU.Build.0 = Release_Java20|Any CPU - {4E3FBF55-6720-43F1-880F-562F851B0221}.Debug_Java|Any CPU.ActiveCfg = Debug_Java|Any CPU - {4E3FBF55-6720-43F1-880F-562F851B0221}.Debug_Java|Any CPU.Build.0 = Debug_Java|Any CPU - {4E3FBF55-6720-43F1-880F-562F851B0221}.Debug_Java20|Any CPU.ActiveCfg = Debug_Java20|Any CPU - {4E3FBF55-6720-43F1-880F-562F851B0221}.Debug_Java20|Any CPU.Build.0 = Debug_Java20|Any CPU - {4E3FBF55-6720-43F1-880F-562F851B0221}.Release_Java|Any CPU.ActiveCfg = Release_Java|Any CPU - {4E3FBF55-6720-43F1-880F-562F851B0221}.Release_Java|Any CPU.Build.0 = Release_Java|Any CPU - {4E3FBF55-6720-43F1-880F-562F851B0221}.Release_Java20|Any CPU.ActiveCfg = Release_Java20|Any CPU - {4E3FBF55-6720-43F1-880F-562F851B0221}.Release_Java20|Any CPU.Build.0 = Release_Java20|Any CPU - {170EE6EB-1DEF-4BC6-88B7-6A90358BAA6B}.Debug_Java|Any CPU.ActiveCfg = Debug_Java|Any CPU - {170EE6EB-1DEF-4BC6-88B7-6A90358BAA6B}.Debug_Java|Any CPU.Build.0 = Debug_Java|Any CPU - {170EE6EB-1DEF-4BC6-88B7-6A90358BAA6B}.Debug_Java20|Any CPU.ActiveCfg = Debug_Java20|Any CPU - {170EE6EB-1DEF-4BC6-88B7-6A90358BAA6B}.Debug_Java20|Any CPU.Build.0 = Debug_Java20|Any CPU - {170EE6EB-1DEF-4BC6-88B7-6A90358BAA6B}.Release_Java|Any CPU.ActiveCfg = Release_Java|Any CPU - {170EE6EB-1DEF-4BC6-88B7-6A90358BAA6B}.Release_Java|Any CPU.Build.0 = Release_Java|Any CPU - {170EE6EB-1DEF-4BC6-88B7-6A90358BAA6B}.Release_Java20|Any CPU.ActiveCfg = Release_Java20|Any CPU - {170EE6EB-1DEF-4BC6-88B7-6A90358BAA6B}.Release_Java20|Any CPU.Build.0 = Release_Java20|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/mcs/nunit20/nunit20.sln b/mcs/nunit20/nunit20.sln deleted file mode 100644 index 838a9dbb373..00000000000 --- a/mcs/nunit20/nunit20.sln +++ /dev/null @@ -1,37 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit-console20", "nunit-console\nunit-console20.csproj", "{9367EC89-6A38-42BA-9607-0DC288E4BC3A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.dll20", "core\nunit.core.dll20.csproj", "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.dll20", "framework\nunit.framework.dll20.csproj", "{83DD7E12-A705-4DBA-9D71-09C8973D9382}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.util.dll20", "util\nunit.util.dll20.csproj", "{61CE9CE5-943E-44D4-A381-814DC1406767}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9367EC89-6A38-42BA-9607-0DC288E4BC3A}.Release|Any CPU.Build.0 = Release|Any CPU - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}.Release|Any CPU.Build.0 = Release|Any CPU - {83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug|Any CPU.Build.0 = Debug|Any CPU - {83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release|Any CPU.ActiveCfg = Release|Any CPU - {83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release|Any CPU.Build.0 = Release|Any CPU - {61CE9CE5-943E-44D4-A381-814DC1406767}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {61CE9CE5-943E-44D4-A381-814DC1406767}.Debug|Any CPU.Build.0 = Debug|Any CPU - {61CE9CE5-943E-44D4-A381-814DC1406767}.Release|Any CPU.ActiveCfg = Release|Any CPU - {61CE9CE5-943E-44D4-A381-814DC1406767}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/mcs/nunit20/nunit20under21.config b/mcs/nunit20/nunit20under21.config deleted file mode 100755 index 271d15c0eed..00000000000 --- a/mcs/nunit20/nunit20under21.config +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/util/.cvsignore b/mcs/nunit20/util/.cvsignore deleted file mode 100644 index 3f8aead411f..00000000000 --- a/mcs/nunit20/util/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -*.dll -Transform.resources diff --git a/mcs/nunit20/util/AssemblyInfo.cs b/mcs/nunit20/util/AssemblyInfo.cs deleted file mode 100644 index 1a2c1e46045..00000000000 --- a/mcs/nunit20/util/AssemblyInfo.cs +++ /dev/null @@ -1,91 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - - -[assembly: AssemblyVersion("2.2.0.0")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -#if TARGET_JVM -[assembly: AssemblyDelaySign(false)] -#else -[assembly: AssemblyKeyFile("../../../nunit.key")] -[assembly: AssemblyKeyName("")] -#endif diff --git a/mcs/nunit20/util/AssemblyList.cs b/mcs/nunit20/util/AssemblyList.cs deleted file mode 100644 index 1c5bb930591..00000000000 --- a/mcs/nunit20/util/AssemblyList.cs +++ /dev/null @@ -1,107 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.IO; -using System.Collections; - -namespace NUnit.Util -{ - /// - /// Represents a list of assemblies. It stores paths - /// that are added and marks it's ProjectContainer - /// as dirty whenever it changes. All paths must - /// be added as absolute paths. - /// - public class AssemblyList : CollectionBase - { - private ProjectConfig config; - - public AssemblyList( ProjectConfig config ) - { - this.config = config; - } - - #region Properties - - public ProjectConfig Config - { - get { return config; } - } - - /// - /// Our indexer - /// - public AssemblyListItem this[int index] - { - get { return (AssemblyListItem)List[index]; } -// set { List[index] = value; } - } - - #endregion - - #region Methods - - public void Add( string assemblyPath, bool hasTests ) - { - List.Add( new AssemblyListItem( this.config, assemblyPath, hasTests ) ); - } - - public void Add( string assemblyPath ) - { - Add( assemblyPath, true ); - } - - public void Remove( string assemblyPath ) - { - for( int index = 0; index < this.Count; index++ ) - { - if ( this[index].FullPath == assemblyPath ) - RemoveAt( index ); - } - } - - protected override void OnRemoveComplete(int index, object value) - { - config.IsDirty = true; - } - - protected override void OnInsertComplete(int index, object value) - { - config.IsDirty = true; - } - - protected override void OnSetComplete(int index, object oldValue, object newValue ) - { - config.IsDirty = true; - } - - #endregion - } -} diff --git a/mcs/nunit20/util/AssemblyListItem.cs b/mcs/nunit20/util/AssemblyListItem.cs deleted file mode 100644 index f85645af01d..00000000000 --- a/mcs/nunit20/util/AssemblyListItem.cs +++ /dev/null @@ -1,75 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.IO; - -namespace NUnit.Util -{ - /// - /// Holds an absolute assembly path and a flag that - /// indicates if the assembly is a test assembly. - /// - public class AssemblyListItem - { - private string path; - private bool hasTests; - private ProjectConfig config; - - public AssemblyListItem( ProjectConfig config, string path, bool hasTests ) - { - if ( !Path.IsPathRooted( path ) ) - throw new ArgumentException( "Assembly path must be absolute" ); - - this.config = config; - this.path = path; - this.hasTests = hasTests; - } - - public string FullPath - { - get { return path; } - set - { - path = value; - config.IsDirty = true; - } - } - - public bool HasTests - { - get { return hasTests; } - set - { - hasTests = value; - config.IsDirty = true; - } - } - } -} diff --git a/mcs/nunit20/util/AssemblyWatcher.cs b/mcs/nunit20/util/AssemblyWatcher.cs deleted file mode 100644 index ae6967b72e6..00000000000 --- a/mcs/nunit20/util/AssemblyWatcher.cs +++ /dev/null @@ -1,138 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.IO; -using System.Text; -using System.Timers; -using System.Collections; -using NUnit.Core; - -namespace NUnit.Util -{ - /// - /// AssemblyWatcher keeps track of one or more assemblies to - /// see if they have changed. It incorporates a delayed notification - /// and uses a standard event to notify any interested parties - /// about the change. The path to the assembly is provided as - /// an argument to the event handler so that one routine can - /// be used to handle events from multiple watchers. - /// - public class AssemblyWatcher - { - FileSystemWatcher[] fileWatcher; - FileInfo[] fileInfo; - - protected System.Timers.Timer timer; - protected string changedAssemblyPath; - - public delegate void AssemblyChangedHandler(String fullPath); - public event AssemblyChangedHandler AssemblyChangedEvent; - - public AssemblyWatcher( int delay, string assemblyFileName ) - : this( delay, new string[]{ assemblyFileName } ) { } - - public AssemblyWatcher( int delay, IList assemblies ) - { - fileInfo = new FileInfo[assemblies.Count]; - fileWatcher = new FileSystemWatcher[assemblies.Count]; - - for( int i = 0; i < assemblies.Count; i++ ) - { - fileInfo[i] = new FileInfo( (string)assemblies[i] ); - - fileWatcher[i] = new FileSystemWatcher(); - fileWatcher[i].Path = fileInfo[i].DirectoryName; - fileWatcher[i].Filter = fileInfo[i].Name; - fileWatcher[i].NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite; - fileWatcher[i].Changed+=new FileSystemEventHandler(OnChanged); - fileWatcher[i].EnableRaisingEvents = false; - } - - timer = new System.Timers.Timer( delay ); - timer.AutoReset=false; - timer.Enabled=false; - timer.Elapsed+=new ElapsedEventHandler(OnTimer); - } - - public FileInfo GetFileInfo( int index ) - { - return fileInfo[index]; - } - - public void Start() - { - EnableWatchers( true ); - } - - public void Stop() - { - EnableWatchers( false ); - } - - private void EnableWatchers( bool enable ) - { - foreach( FileSystemWatcher watcher in fileWatcher ) - watcher.EnableRaisingEvents = enable; - } - - protected void OnTimer(Object source, ElapsedEventArgs e) - { - lock(this) - { - PublishEvent(); - timer.Enabled=false; - } - } - - protected void OnChanged(object source, FileSystemEventArgs e) - { - changedAssemblyPath = e.FullPath; - if ( timer != null ) - { - lock(this) - { - if(!timer.Enabled) - timer.Enabled=true; - timer.Start(); - } - } - else - { - PublishEvent(); - } - } - - protected void PublishEvent() - { - if ( AssemblyChangedEvent != null ) - AssemblyChangedEvent( changedAssemblyPath ); - } - } -} \ No newline at end of file diff --git a/mcs/nunit20/util/ChangeLog b/mcs/nunit20/util/ChangeLog deleted file mode 100644 index ca5c0d0b97f..00000000000 --- a/mcs/nunit20/util/ChangeLog +++ /dev/null @@ -1,55 +0,0 @@ -2008-10-31 Gonzalo Paniagua Javier - - * TestDomain.cs: if the TEMP environment variable is not there, make - fix this up. Another side-effect of fixing CachePath handling. - -2008-01-23 Raja R Harinath - - * Makefile (install-symlink, uninstall-symlink): New. In the - net_2_0 profile, just install a symlink to the 1.1 profile library - in the compiler search path. - -2006-08-09 Vladimir Krasnov - - * added NET_2_0 projects files for VS2005 - -2006-01-25 Boris Kirzner - * AssemblyInfo.cs, ProjectPath.cs, TestDomain.cs, TestExceptionHandler.cs: - added #ifdef and alternative implementation for features - not supported in TARGET_JVM. - * nunit.util.dll.J2EE.vmwcsproj : added project file for TARGET_JVM. - -2005-07-03 Ben Maurer - - * Makefile: Fix so it really doesn't install for 2.0. - -2004-12-07 Raja R Harinath - - * Makefile ($(RESX_RES)): Pass argument of RESGEN through - PLATFORM_CHANGE_SEPARATOR_CMD. - -2004-12-03 Atsushi Enomoto - - * XmlResultVisitor.cs : ... was still broken. - -2004-12-03 Atsushi Enomoto - - * XmlResultVisitor.cs : Local fix - don't use WriteCData() which - cannot escape invalid characters. It broke VB unit test. See also: - http://sourceforge.net/tracker/?group_id=10749&atid=110749&func=detail&aid=1073539 - -2004-11-23 Raja R Harinath - - * Makefile (NO_INSTALL) [PROFILE=net_2_0]: Don't install dll. - -2004-10-28 Sebastien Pouliot - - * Updated to NUnit 2.2.0 Final Release. - -2004-06-28 Raja R Harinath - - * Makefile (%.resources): Use $(RESGEN). - -2004-06-21 Raja R Harinath - - * Makefile (LIBRARY_SNK): Sign with nunit.key. diff --git a/mcs/nunit20/util/CommandLineOptions.cs b/mcs/nunit20/util/CommandLineOptions.cs deleted file mode 100644 index 4c76a973b8b..00000000000 --- a/mcs/nunit20/util/CommandLineOptions.cs +++ /dev/null @@ -1,285 +0,0 @@ -// File: CommandLineOptions.cs -// -// This is a re-usable component to be used when you -// need to parse command-line options/parameters. -// -// Separates command line parameters from command line options. -// Uses reflection to populate member variables the derived class with the values -// of the options. -// -// An option can start with "/", "-" or "--". -// -// I define 3 types of "options": -// 1. Boolean options (yes/no values), e.g: /r to recurse -// 2. Value options, e.g: /loglevel=3 -// 2. Parameters: standalone strings like file names -// -// An example to explain: -// csc /nologo /t:exe myfile.cs -// | | | -// | | + parameter -// | | -// | + value option -// | -// + boolean option -// -// Please see a short description of the CommandLineOptions class -// at http://codeblast.com/~gert/dotnet/sells.html -// -// Gert Lombard (gert@codeblast.com) -// James Newkirk (jim@nunit.org) - -namespace Codeblast -{ - using System; - using System.Reflection; - using System.Collections; - using System.Text; - - // - // The Attributes - // - - [AttributeUsage(AttributeTargets.Field)] - public class OptionAttribute : Attribute - { - protected object optValue; - protected string optName; - protected string description; - - public string Short - { - get { return optName; } - set { optName = value; } - } - - public object Value - { - get { return optValue; } - set { optValue = value; } - } - - public string Description - { - get { return description; } - set { description = value; } - } - } - - // - // The CommandLineOptions members - // - - public abstract class CommandLineOptions - { - protected ArrayList parameters; - private int optionCount; - - public CommandLineOptions(string[] args) - { - optionCount = Init(args); - } - - public bool NoArgs - { - get - { - return ParameterCount == 0 && optionCount == 0; - } - } - - public int Init(string[] args) - { - int count = 0; - int n = 0; - while (n < args.Length) - { - int pos = IsOption(args[n]); - if (pos > 0) - { - // It's an option: - if (GetOption(args, ref n, pos)) - count++; - else - InvalidOption(args[Math.Min(n, args.Length-1)]); - } - else - { - // It's a parameter: - if (parameters == null) parameters = new ArrayList(); - parameters.Add(args[n]); - } - n++; - } - return count; - } - - // An option starts with "/", "-" or "--": - protected virtual int IsOption(string opt) - { - char[] c = null; - if (opt.Length < 2) - { - return 0; - } - else if (opt.Length > 2) - { - c = opt.ToCharArray(0, 3); - if (c[0] == '-' && c[1] == '-' && IsOptionNameChar(c[2])) return 2; - } - else - { - c = opt.ToCharArray(0, 2); - } - if ((c[0] == '-' || c[0] == '/') && IsOptionNameChar(c[1])) return 1; - return 0; - } - - protected virtual bool IsOptionNameChar(char c) - { - return Char.IsLetterOrDigit(c) || c == '?'; - } - - protected abstract void InvalidOption(string name); - - protected virtual bool MatchShortName(FieldInfo field, string name) - { - object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true); - foreach (OptionAttribute att in atts) - { - if (string.Compare(att.Short, name, true) == 0) return true; - } - return false; - } - - protected virtual FieldInfo GetMemberField(string name) - { - Type t = this.GetType(); - FieldInfo[] fields = t.GetFields(BindingFlags.Instance|BindingFlags.Public); - foreach (FieldInfo field in fields) - { - if (string.Compare(field.Name, name, true) == 0) return field; - if (MatchShortName(field, name)) return field; - } - return null; - } - - protected virtual object GetOptionValue(FieldInfo field) - { - object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true); - if (atts.Length > 0) - { - OptionAttribute att = (OptionAttribute)atts[0]; - return att.Value; - } - return null; - } - - protected virtual bool GetOption(string[] args, ref int index, int pos) - { - try - { - object cmdLineVal = null; - string opt = args[index].Substring(pos, args[index].Length-pos); - SplitOptionAndValue(ref opt, ref cmdLineVal); - FieldInfo field = GetMemberField(opt); - if (field != null) - { - object value = GetOptionValue(field); - if (value == null) - { - if (field.FieldType == typeof(bool)) - value = true; // default for bool values is true - else if(field.FieldType == typeof(string)) - { - value = cmdLineVal != null ? cmdLineVal : args[++index]; - field.SetValue(this, Convert.ChangeType(value, field.FieldType)); - string stringValue = (string)value; - if(stringValue == null || stringValue.Length == 0) return false; - return true; - } - else - value = cmdLineVal != null ? cmdLineVal : args[++index]; - } - field.SetValue(this, Convert.ChangeType(value, field.FieldType)); - return true; - } - } - catch (Exception) - { - // Ignore exceptions like type conversion errors. - } - return false; - } - - protected virtual void SplitOptionAndValue(ref string opt, ref object val) - { - // Look for ":" or "=" separator in the option: - int pos = opt.IndexOfAny( new char[] { ':', '=' } ); - if (pos < 1) return; - - val = opt.Substring(pos+1); - opt = opt.Substring(0, pos); - } - - // Parameter accessor: - public string this[int index] - { - get - { - if (parameters != null) return (string)parameters[index]; - return null; - } - } - - public ArrayList Parameters - { - get { return parameters; } - } - - public int ParameterCount - { - get - { - return parameters == null ? 0 : parameters.Count; - } - } - - public virtual void Help() - { - Console.WriteLine(GetHelpText()); - } - - public virtual string GetHelpText() - { - StringBuilder helpText = new StringBuilder(); - - Type t = this.GetType(); - FieldInfo[] fields = t.GetFields(BindingFlags.Instance|BindingFlags.Public); - foreach (FieldInfo field in fields) - { - object[] atts = field.GetCustomAttributes(typeof(OptionAttribute), true); - if (atts.Length > 0) - { - OptionAttribute att = (OptionAttribute)atts[0]; - if (att.Description != null) - { - string valType = ""; - if (att.Value == null) - { - if (field.FieldType == typeof(float)) valType = "=FLOAT"; - else if (field.FieldType == typeof(string)) valType = "=STR"; - else if (field.FieldType != typeof(bool)) valType = "=X"; - } - - helpText.AppendFormat("/{0,-20}{1}", field.Name+valType, att.Description); - if (att.Short != null) - helpText.AppendFormat(" (Short format: /{0}{1})", att.Short, valType); - helpText.Append( Environment.NewLine ); - } - } - } - return helpText.ToString(); - } - } -} diff --git a/mcs/nunit20/util/ConsoleOptions.cs b/mcs/nunit20/util/ConsoleOptions.cs deleted file mode 100644 index 8d3565e46c8..00000000000 --- a/mcs/nunit20/util/ConsoleOptions.cs +++ /dev/null @@ -1,227 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using Codeblast; - - public class ConsoleOptions : CommandLineOptions - { - [Option(Description = "Fixture to test")] - public string fixture; - - [Option(Description = "Project configuration to load")] - public string config; - - [Option(Description = "Name of XML output file")] - public string xml; - - [Option(Description = "Name of transform file")] - public string transform; - - [Option(Description = "Display XML to the console")] - public bool xmlConsole; - - [Option(Short="out", Description = "File to receive test output")] - public string output; - - [Option(Description = "File to receive test error output")] - public string err; - - [Option(Description = "Label each test in stdOut")] - public bool labels = false; - - [Option(Description = "List of categories to include")] - public string include; - - [Option(Description = "List of categories to exclude")] - public string exclude; - -// [Option(Description = "Run in a separate process")] -// public bool process; - -// [Option(Description = "Run in a separate AppDomain")] -// public bool domain; - -// [Option(Description = "Disable shadow copy when running in separate domain")] - [Option(Description = "Disable shadow copy")] - public bool noshadow; - - [Option (Description = "Run tests on a separate thread")] - public bool thread; - - [Option(Description = "Wait for input before closing console window")] - public bool wait = false; - - [Option(Description = "Do not display the logo")] - public bool nologo = false; - - [Option(Short="?", Description = "Display help")] - public bool help = false; - - private bool isInvalid = false; - - public ConsoleOptions(String[] args) : base(args) - {} - - protected override void InvalidOption(string name) - { - isInvalid = true; - } - - public bool Validate() - { - if(isInvalid) return false; - - if(HasInclude && HasExclude) return false; - - if(NoArgs) return true; - - if(IsFixture) return true; - - if(ParameterCount >= 1) return true; - - return false; - } - - public bool IsAssembly - { - get - { - return ParameterCount >= 1 && !IsFixture; - } - } - - public bool IsTestProject - { - get - { - return ParameterCount == 1 && NUnitProject.CanLoadAsProject( (string)Parameters[0] ); - } - } - - public bool IsFixture - { - get - { - return ParameterCount >= 1 && - ((fixture != null) && (fixture.Length > 0)); - } - } - - public bool IsXml - { - get - { - return (xml != null) && (xml.Length != 0); - } - } - - public bool isOut - { - get - { - return (output != null) && (output.Length != 0); - } - } - - public bool isErr - { - get - { - return (err != null) && (err.Length != 0); - } - } - - public bool IsTransform - { - get - { - return (transform != null) && (transform.Length != 0); - } - } - - public bool HasInclude - { - get - { - return include != null && include.Length != 0; - } - } - - public bool HasExclude - { - get - { - return exclude != null && exclude.Length != 0; - } - } - - public string[] IncludedCategories - { - get - { - if (HasInclude) - return include.Split( new char[] {';', ','}); - - return null; - } - } - - public string[] ExcludedCategories - { - get - { - if (HasExclude) - return exclude.Split( new char[] {';', ','}); - - return null; - } - } - - public override void Help() - { - Console.WriteLine(); - Console.WriteLine( "NUNIT-CONSOLE [inputfiles] [options]" ); - Console.WriteLine(); - Console.WriteLine( "Runs a set of NUnit tests from the console." ); - Console.WriteLine(); - Console.WriteLine( "You may specify one or more assemblies or a single" ); - Console.WriteLine( "project file of type .nunit." ); - Console.WriteLine(); - Console.WriteLine( "Options:" ); - base.Help(); - Console.WriteLine(); - Console.WriteLine( "Options that take values may use an equal sign, a colon" ); - Console.WriteLine( "or a space to separate the option from its value." ); - Console.WriteLine(); - } - } -} \ No newline at end of file diff --git a/mcs/nunit20/util/ConsoleWriter.cs b/mcs/nunit20/util/ConsoleWriter.cs deleted file mode 100644 index 70300c3b0c7..00000000000 --- a/mcs/nunit20/util/ConsoleWriter.cs +++ /dev/null @@ -1,78 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using System.IO; - using System.Text; - - /// - /// Class used for receiving console output from the running test and displaying it. - /// - public class ConsoleWriter : TextWriter - { - private TextWriter console; - - public ConsoleWriter(TextWriter console) - { - this.console = console; - } - - public override void Flush() - { - console.Flush(); - } - - public override void Write(char c) - { - console.Write(c); - } - - public override void Write(String s) - { - console.Write(s); - } - - public override void WriteLine(string s) - { - console.WriteLine(s); - } - - public override Encoding Encoding - { - get { return Encoding.Default; } - } - - public override Object InitializeLifetimeService() - { - return null; - } - } -} diff --git a/mcs/nunit20/util/Documentation/en/Codeblast/CommandLineOptions.xml b/mcs/nunit20/util/Documentation/en/Codeblast/CommandLineOptions.xml deleted file mode 100644 index 891b72e4302..00000000000 --- a/mcs/nunit20/util/Documentation/en/Codeblast/CommandLineOptions.xml +++ /dev/null @@ -1,318 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Reflection.FieldInfo - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Object - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Collections.ArrayList - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.ArrayList - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/Codeblast/OptionAttribute.xml b/mcs/nunit20/util/Documentation/en/Codeblast/OptionAttribute.xml deleted file mode 100644 index 83c6c26f9d2..00000000000 --- a/mcs/nunit20/util/Documentation/en/Codeblast/OptionAttribute.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Attribute - - - - - System.AttributeUsage(System.AttributeTargets.Field) - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Object - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Object - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyList.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyList.xml deleted file mode 100644 index 32944a0a7d6..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyList.xml +++ /dev/null @@ -1,184 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Collections.CollectionBase - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.ProjectConfig - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.AssemblyListItem - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyListItem.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyListItem.xml deleted file mode 100644 index f44b1dc0f95..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyListItem.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyWatcher+AssemblyChangedHandler.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyWatcher+AssemblyChangedHandler.xml deleted file mode 100644 index 0fb462d1d64..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyWatcher+AssemblyChangedHandler.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Delegate - - - - - - System.Void - - - To be added. - To be added. - To be added. - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyWatcher.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyWatcher.xml deleted file mode 100644 index d74c39c02d5..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/AssemblyWatcher.xml +++ /dev/null @@ -1,197 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.AssemblyWatcher+AssemblyChangedHandler - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.IO.FileInfo - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Timers.Timer - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/BinPathType.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/BinPathType.xml deleted file mode 100644 index 81e810dc891..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/BinPathType.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Enum - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.BinPathType - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.BinPathType - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.BinPathType - - - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ConsoleOptions.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ConsoleOptions.xml deleted file mode 100644 index f3ac2911e5c..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ConsoleOptions.xml +++ /dev/null @@ -1,531 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - Codeblast.CommandLineOptions - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Project configuration to load") - - - - System.String - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="File to receive test error output") - - - - System.String - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="List of categories to exclude") - - - - System.String - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String[] - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Fixture to test") - - - - System.String - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Short="?", Description="Display help") - - - - System.Boolean - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="List of categories to include") - - - - System.String - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String[] - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Label each test in stdOut") - - - - System.Boolean - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Do not display the logo") - - - - System.Boolean - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Disable shadow copy") - - - - System.Boolean - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Short="out", Description="File to receive test output") - - - - System.String - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Run tests on a separate thread") - - - - System.Boolean - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Name of transform file") - - - - System.String - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Wait for input before closing console window") - - - - System.Boolean - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Name of XML output file") - - - - System.String - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Display XML to the console") - - - - System.Boolean - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ConsoleWriter.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ConsoleWriter.xml deleted file mode 100644 index 506ff7f3a9b..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ConsoleWriter.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.IO.TextWriter - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Text.Encoding - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/GuiOptions.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/GuiOptions.xml deleted file mode 100644 index 15faada8928..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/GuiOptions.xml +++ /dev/null @@ -1,207 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - Codeblast.CommandLineOptions - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Project configuration to load") - - - - System.String - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Fixture to test") - - - - System.String - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Short="?", Description="Display help") - - - - System.Boolean - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Suppress loading of last project") - - - - System.Boolean - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - - Codeblast.Option(Description="Automatically run the loaded project") - - - - System.Boolean - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/IProjectEvents.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/IProjectEvents.xml deleted file mode 100644 index 62ddf502aa9..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/IProjectEvents.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - - NUnit.Core.ITestEvents - - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ITestLoader.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ITestLoader.xml deleted file mode 100644 index 57b58b8f1f0..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ITestLoader.xml +++ /dev/null @@ -1,340 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestResult[] - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/NUnitProject.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/NUnitProject.xml deleted file mode 100644 index e43185b586c..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/NUnitProject.xml +++ /dev/null @@ -1,575 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.ProjectConfig - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.ProjectEventHandler - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.ProjectConfigCollection - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.ProjectConfigCollection - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectChangeType.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectChangeType.xml deleted file mode 100644 index df35fd3a6fa..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectChangeType.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Enum - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.ProjectChangeType - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.ProjectChangeType - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.ProjectChangeType - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.ProjectChangeType - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.ProjectChangeType - - - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectConfig.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectConfig.xml deleted file mode 100644 index fd92147bc69..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectConfig.xml +++ /dev/null @@ -1,286 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String[] - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.AssemblyList - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.BinPathType - - - To be added. - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - System.EventHandler - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String[] - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String[] - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectConfigCollection.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectConfigCollection.xml deleted file mode 100644 index c4e69c0ccaa..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectConfigCollection.xml +++ /dev/null @@ -1,324 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Collections.CollectionBase - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.ProjectConfig - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.ProjectConfig - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.ArrayList - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectEventArgs.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectEventArgs.xml deleted file mode 100644 index e895d7835ec..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectEventArgs.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.EventArgs - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.ProjectChangeType - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectEventDispatcher.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectEventDispatcher.xml deleted file mode 100644 index f49920fbd86..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectEventDispatcher.xml +++ /dev/null @@ -1,229 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - NUnit.Core.TestEventDispatcher - - - - NUnit.Util.IProjectEvents - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - - Event - - 2.2.0.0 - - - NUnit.Util.TestProjectEventHandler - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectEventHandler.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectEventHandler.xml deleted file mode 100644 index ef3191b82d4..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectEventHandler.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Delegate - - - - - - - System.Void - - - To be added. - To be added. - To be added. - To be added. - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectFormatException.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectFormatException.xml deleted file mode 100644 index 1fc33533e30..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectFormatException.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.ApplicationException - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectPath.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectPath.xml deleted file mode 100644 index 25744af7a79..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ProjectPath.xml +++ /dev/null @@ -1,175 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.UInt32 - - 16 - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.UInt32 - - 128 - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - System.Int32 - - 256 - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/ResultSummarizer.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/ResultSummarizer.xml deleted file mode 100644 index 5a98bb514b1..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/ResultSummarizer.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Double - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/SettingsGroup.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/SettingsGroup.xml deleted file mode 100644 index 0ae0e7e888c..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/SettingsGroup.xml +++ /dev/null @@ -1,328 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - System.IDisposable - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Object - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Object - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.SettingsStorage - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/SettingsStorage.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/SettingsStorage.xml deleted file mode 100644 index ed83da0062d..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/SettingsStorage.xml +++ /dev/null @@ -1,309 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - System.IDisposable - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Object - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Object - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Util.SettingsStorage - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.SettingsStorage - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/StackTraceFilter.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/StackTraceFilter.xml deleted file mode 100644 index d65df20a904..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/StackTraceFilter.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/SummaryVisitor.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/SummaryVisitor.xml deleted file mode 100644 index 7bffbc97cea..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/SummaryVisitor.xml +++ /dev/null @@ -1,174 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - NUnit.Core.ResultVisitor - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Double - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestDomain.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/TestDomain.xml deleted file mode 100644 index 8cfbb8ca5b7..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestDomain.xml +++ /dev/null @@ -1,594 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - NUnit.Core.TestRunner - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.AppDomain - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.IO.TextWriter - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Version - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Collections.ICollection - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.Test - - - - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.IO.TextWriter - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestResult - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestResult[] - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult[] - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestExceptionHandler.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/TestExceptionHandler.xml deleted file mode 100644 index 6276b4daafa..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestExceptionHandler.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - System.IDisposable - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestLoader.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/TestLoader.xml deleted file mode 100644 index 67d8ae04d96..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestLoader.xml +++ /dev/null @@ -1,635 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - NUnit.Core.LongLivingMarshalByRefObject - - - - NUnit.Core.EventListener - - - NUnit.Util.ITestLoader - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.IProjectEvents - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Version - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Collections.IList - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Exception - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Core.TestResult[] - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.NUnitProject - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestProjectAction.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/TestProjectAction.xml deleted file mode 100644 index d235141ecb9..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestProjectAction.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Enum - - - To be added. - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.TestProjectAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.TestProjectAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.TestProjectAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.TestProjectAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.TestProjectAction - - - To be added. - - - - - Field - - 2.2.0.0 - - - NUnit.Util.TestProjectAction - - - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestProjectEventArgs.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/TestProjectEventArgs.xml deleted file mode 100644 index be934c8c16b..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestProjectEventArgs.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.EventArgs - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.TestProjectAction - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Exception - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestProjectEventHandler.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/TestProjectEventHandler.xml deleted file mode 100644 index 4ca7adc2eba..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestProjectEventHandler.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Delegate - - - - - - - System.Void - - - To be added. - To be added. - To be added. - To be added. - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestResultItem.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/TestResultItem.xml deleted file mode 100644 index d78a39c9d7f..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/TestResultItem.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.String - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/UIHelper.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/UIHelper.xml deleted file mode 100644 index 0e291e03708..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/UIHelper.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/UITestNode.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/UITestNode.xml deleted file mode 100644 index 3cd7d8b9d39..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/UITestNode.xml +++ /dev/null @@ -1,421 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - NUnit.Core.ITest - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - - To be added. - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Int32 - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.IList - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Int32 - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Util.UITestNode - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - NUnit.Core.TestResult - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Boolean - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.ArrayList - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/VSProject.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/VSProject.xml deleted file mode 100644 index 5d09ba211e2..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/VSProject.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.VSProjectConfigCollection - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/VSProjectConfig.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/VSProjectConfig.xml deleted file mode 100644 index 253a909a2b6..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/VSProjectConfig.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.Collections.Specialized.StringCollection - - - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - System.String - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/VSProjectConfigCollection.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/VSProjectConfigCollection.xml deleted file mode 100644 index 2fd79f4c8d7..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/VSProjectConfigCollection.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Collections.CollectionBase - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Boolean - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.VSProjectConfig - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Property - - 2.2.0.0 - - - NUnit.Util.VSProjectConfig - - - - - - To be added. - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/NUnit.Util/XmlResultVisitor.xml b/mcs/nunit20/util/Documentation/en/NUnit.Util/XmlResultVisitor.xml deleted file mode 100644 index 18a72c8e870..00000000000 --- a/mcs/nunit20/util/Documentation/en/NUnit.Util/XmlResultVisitor.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - nunit.util - 2.2.0.0 - - - System.Object - - - - NUnit.Core.ResultVisitor - - - - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Constructor - - 2.2.0.0 - - - - - - - To be added. - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - To be added. - To be added. - - - - - Method - - 2.2.0.0 - - - System.Void - - - - - - To be added. - To be added. - To be added. - - - - diff --git a/mcs/nunit20/util/Documentation/en/index.xml b/mcs/nunit20/util/Documentation/en/index.xml deleted file mode 100644 index b87f34a6432..00000000000 --- a/mcs/nunit20/util/Documentation/en/index.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows=true) - - - System.Reflection.AssemblyKeyName("") - - - System.Reflection.AssemblyTrademark("") - - - System.Reflection.AssemblyCopyright("") - - - System.Reflection.AssemblyProduct("") - - - System.Reflection.AssemblyCompany("") - - - System.Reflection.AssemblyConfiguration("") - - - System.Reflection.AssemblyDescription("") - - - System.Reflection.AssemblyTitle("") - - - - - To be added. - To be added. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - nunit.util - diff --git a/mcs/nunit20/util/Documentation/en/ns-Codeblast.xml b/mcs/nunit20/util/Documentation/en/ns-Codeblast.xml deleted file mode 100644 index 8e44746b9ba..00000000000 --- a/mcs/nunit20/util/Documentation/en/ns-Codeblast.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - To be added. - To be added. - - diff --git a/mcs/nunit20/util/Documentation/en/ns-NUnit.Util.xml b/mcs/nunit20/util/Documentation/en/ns-NUnit.Util.xml deleted file mode 100644 index 6e78c085aa7..00000000000 --- a/mcs/nunit20/util/Documentation/en/ns-NUnit.Util.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - To be added. - To be added. - - diff --git a/mcs/nunit20/util/FormSettings.cs b/mcs/nunit20/util/FormSettings.cs deleted file mode 100644 index 6e1e1eae1aa..00000000000 --- a/mcs/nunit20/util/FormSettings.cs +++ /dev/null @@ -1,194 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using System.Drawing; - - /// - /// FormSettings holds settings for NUnitForm - /// - public class FormSettings : SettingsGroup - { - private static readonly string NAME = "Form"; - - private static readonly string MAXIMIZED = "maximized"; - private static readonly string WIDTH = "width"; - private static readonly string HEIGHT = "height"; - private static readonly string XLOCATION = "x-location"; - private static readonly string YLOCATION = "y-location"; - private static readonly string TREE_SPLITTER_POSITION = "tree-splitter-position"; - private static readonly string TAB_SPLITTER_POSITION = "tab-splitter-position"; - - public static readonly int DEFAULT_WIDTH = 756; - public static readonly int MIN_WIDTH = 160; - - public static readonly int DEFAULT_HEIGHT = 512; - public static readonly int MIN_HEIGHT = 32; - - public static readonly int DEFAULT_XLOCATION = 10; - - public static readonly int DEFAULT_YLOCATION = 10; - - public static readonly int TREE_DEFAULT_POSITION = 300; - public static readonly int TREE_MIN_POSITION = 240; - - public static readonly int TAB_DEFAULT_POSITION = 119; - public static readonly int TAB_MIN_POSITION = 100; - - public FormSettings( ) : base( NAME, UserSettings.GetStorageImpl( NAME ) ) { } - - public FormSettings( SettingsStorage storage ) : base( NAME, storage ) { } - - public FormSettings( SettingsGroup parent ) : base( NAME, parent ) { } - - private Point location = Point.Empty; - private Size size = Size.Empty; - private int treeSplitterPosition = -1; - private int tabSplitterPosition = -1; - - public bool IsMaximized - { - get - { - return LoadIntSetting( MAXIMIZED, 0 ) == 1 ? true : false; - } - - set - { - SaveIntSetting( MAXIMIZED, value ? 1 : 0 ); - } - } - - public Point Location - { - get - { - if ( location == Point.Empty ) - { - int x = LoadIntSetting( XLOCATION, DEFAULT_XLOCATION ); - int y = LoadIntSetting( YLOCATION, DEFAULT_YLOCATION ); - - location = new Point(x, y); - - if ( !IsValidLocation( location ) ) - location = new Point( DEFAULT_XLOCATION, DEFAULT_YLOCATION ); - } - - return location; - } - set - { - location = value; - SaveSetting( XLOCATION, location.X ); - SaveSetting( YLOCATION, location.Y ); - } - } - - private bool IsValidLocation( Point location ) - { - Rectangle myArea = new Rectangle( location, this.Size ); - bool intersect = false; - foreach (System.Windows.Forms.Screen screen in System.Windows.Forms.Screen.AllScreens) - { - intersect |= myArea.IntersectsWith(screen.WorkingArea); - } - return intersect; - } - - public Size Size - { - get - { - if ( size == Size.Empty ) - { - int width = LoadIntSetting( WIDTH, DEFAULT_WIDTH ); - if ( width < MIN_WIDTH ) width = MIN_WIDTH; - int height = LoadIntSetting( HEIGHT, DEFAULT_HEIGHT ); - if ( height < MIN_HEIGHT ) height = MIN_HEIGHT; - - size = new Size(width, height); - } - - return size; - } - set - { - size = value; - SaveIntSetting( WIDTH, size.Width ); - SaveIntSetting( HEIGHT, size.Height ); - } - } - - public int TreeSplitterPosition - { - get - { - if ( treeSplitterPosition == -1 ) - { - treeSplitterPosition = - LoadIntSetting( TREE_SPLITTER_POSITION, TREE_DEFAULT_POSITION ); - - if ( treeSplitterPosition < TREE_MIN_POSITION || treeSplitterPosition > this.Size.Width ) - treeSplitterPosition = TREE_MIN_POSITION; - } - - return treeSplitterPosition; - } - set - { - treeSplitterPosition = value; - SaveSetting( TREE_SPLITTER_POSITION, treeSplitterPosition ); - } - } - - public int TabSplitterPosition - { - get - { - if ( tabSplitterPosition == -1 ) - { - tabSplitterPosition = - LoadIntSetting( TAB_SPLITTER_POSITION, TAB_DEFAULT_POSITION ); - - if ( tabSplitterPosition < TAB_MIN_POSITION || tabSplitterPosition > this.Size.Height ) - tabSplitterPosition = TAB_MIN_POSITION; - } - - return tabSplitterPosition; - } - set - { - tabSplitterPosition = value; - SaveSetting( TAB_SPLITTER_POSITION, tabSplitterPosition ); - } - } - } -} diff --git a/mcs/nunit20/util/GuiOptions.cs b/mcs/nunit20/util/GuiOptions.cs deleted file mode 100644 index d7caf2153a2..00000000000 --- a/mcs/nunit20/util/GuiOptions.cs +++ /dev/null @@ -1,94 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using System.Text; - using Codeblast; - - public class GuiOptions : CommandLineOptions - { - private bool isInvalid = false; - - [Option(Short="?", Description = "Display help")] - public bool help = false; - - [Option(Description = "Project configuration to load")] - public string config; - - [Option(Description = "Suppress loading of last project")] - public bool noload; - - [Option(Description = "Automatically run the loaded project")] - public bool run; - - [Option(Description = "Fixture to test")] - public string fixture; - - public GuiOptions(String[] args) : base(args) - {} - - protected override void InvalidOption(string name) - { isInvalid = true; } - - public string Assembly - { - get - { - return (string)Parameters[0]; - } - } - - public bool IsAssembly - { - get - { - return ParameterCount == 1; - } - } - - public bool Validate() - { - return (NoArgs || ParameterCount <= 1) && !isInvalid; - } - - public override string GetHelpText() - { - const string initialText = - "NUNIT-GUI [inputfile] [options]\r\rRuns a set of NUnit tests from the console. You may specify\ran assembly or a project file of type .nunit as input.\r\rOptions:\r"; - - const string finalText = - "\rOptions that take values may use an equal sign, a colon\ror a space to separate the option from its value."; - - return initialText + base.GetHelpText() + finalText; - } - - } -} \ No newline at end of file diff --git a/mcs/nunit20/util/ITestEvents.cs b/mcs/nunit20/util/ITestEvents.cs deleted file mode 100644 index 03614e33f89..00000000000 --- a/mcs/nunit20/util/ITestEvents.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using NUnit.Core; - -//TODO: rename this file -namespace NUnit.Util -{ - /// - /// IProjectEvents interface extends NUnit.Core.ITestEvents adding - /// events that are fired as projects are loaded and unloaded. - /// - public interface IProjectEvents : ITestEvents - { - // Events related to the loading and unloading - // of projects - including wrapper projects - // created in order to load assemblies. This - // occurs separately from the loading of tests - // for the assemblies in the project. - event TestProjectEventHandler ProjectLoading; - event TestProjectEventHandler ProjectLoaded; - event TestProjectEventHandler ProjectLoadFailed; - event TestProjectEventHandler ProjectUnloading; - event TestProjectEventHandler ProjectUnloaded; - event TestProjectEventHandler ProjectUnloadFailed; - } -} diff --git a/mcs/nunit20/util/ITestLoader.cs b/mcs/nunit20/util/ITestLoader.cs deleted file mode 100644 index f37adbdaaae..00000000000 --- a/mcs/nunit20/util/ITestLoader.cs +++ /dev/null @@ -1,113 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Collections; -using NUnit.Core; - -namespace NUnit.Util -{ - /// - /// The ITestLoader interface supports the loading and running - /// of tests in a remote domain. In addition to methods for - /// performing these operations, it inherits from the ITestEvents - /// interface to provide appropriate events. The two interfaces - /// are kept separate so that client objects not intended to - /// issue commands can just handle the first interface. - /// - public interface ITestLoader - { - #region Properties - - // See if a project is loaded - bool IsProjectLoaded { get; } - - // See if a test has been loaded from the project - bool IsTestLoaded { get; } - - // See if a test is running - bool IsTestRunning { get; } - - // The loaded test project - NUnitProject TestProject { get; set; } - - string TestFileName { get; } - - // Our last test results - TestResult[] Results { get; } - - #endregion - - #region Methods - - // Create a new empty project using a default name - void NewProject(); - - // Create a new project given a filename - void NewProject( string filename ); - - // Load a project given a filename - void LoadProject( string filename ); - - // Load a project given a filename and config - void LoadProject( string filename, string configname ); - - // Load a project given an array of assemblies - void LoadProject( string[] assemblies ); - - // Unload current project - void UnloadProject(); - - // Load tests for current project and config - void LoadTest(); - - // Load a specific test for current project and config - void LoadTest( string testName ); - - // Unload current test - void UnloadTest(); - - // Reload current test - void ReloadTest(); - - // Set a filter for running tests - void SetFilter( IFilter filter ); - - // Run a test suite - void RunTest( ITest test ); - - // Run a collection of tests - void RunTests(ITest[] tests); - - // Cancel the running test - void CancelTestRun(); - - #endregion - } -} \ No newline at end of file diff --git a/mcs/nunit20/util/Makefile b/mcs/nunit20/util/Makefile deleted file mode 100644 index 6b03f808834..00000000000 --- a/mcs/nunit20/util/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -thisdir = nunit20/util -SUBDIRS = -include ../../build/rules.make - -LIBRARY = NUnit.Util.dll -LIBRARY_NAME = nunit.util.dll -LIBRARY_SNK = $(topdir)/nunit.key - -LOCAL_MCS_FLAGS= \ - /resource:Transform.resources,NUnit.Util.Transform.resources \ - -r:nunit.framework.dll -r:nunit.core.dll -r:System.dll \ - -r:System.Xml.dll /d:MONO /d:StronglyNamedAssembly -NO_TEST = yo - -RESX_RES = Transform.resources - -EXTRA_DISTFILES = \ - nunit.util.dll.csproj \ - $(RESX_RES:.resources=.resx) - -CLEAN_FILES = $(RESX_RES) - -ifeq (net_2_0, $(PROFILE)) -NO_INSTALL = yes -install-local: install-symlink -uninstall-local: uninstall-symlink -endif - -include ../../build/library.make - -$(the_lib): $(RESX_RES) - -$(RESX_RES): %.resources: %.resx - $(RESGEN) `echo $< | $(PLATFORM_CHANGE_SEPARATOR_CMD)` - -symlinkdir = $(mono_libdir)/mono/$(FRAMEWORK_VERSION) -install-symlink: - $(MKINSTALLDIRS) $(DESTDIR)$(symlinkdir) - cd $(DESTDIR)$(symlinkdir) && rm -f $(LIBRARY_NAME) && ln -s ../1.0/$(LIBRARY_NAME) $(LIBRARY_NAME) - -uninstall-symlink: - rm -f $(DESTDIR)$(symlinkdir)/$(LIBRARY_NAME) diff --git a/mcs/nunit20/util/NUnit.Util.dll.sources b/mcs/nunit20/util/NUnit.Util.dll.sources deleted file mode 100644 index 43ecad45824..00000000000 --- a/mcs/nunit20/util/NUnit.Util.dll.sources +++ /dev/null @@ -1,32 +0,0 @@ -./AssemblyInfo.cs -./AssemblyList.cs -./AssemblyListItem.cs -./AssemblyWatcher.cs -./CommandLineOptions.cs -./ConsoleOptions.cs -./ConsoleWriter.cs -./GuiOptions.cs -./ITestEvents.cs -./ITestLoader.cs -./NUnitProject.cs -./ProjectConfig.cs -./ProjectConfigCollection.cs -./ProjectFormatException.cs -./ProjectPath.cs -./ResultSummarizer.cs -./SettingsGroup.cs -./SettingsStorage.cs -./StackTraceFilter.cs -./SummaryVisitor.cs -./TestDomain.cs -./TestEventArgs.cs -./TestEventDispatcher.cs -./TestExceptionHandler.cs -./TestLoader.cs -./TestResultItem.cs -./UIHelper.cs -./UITestNode.cs -./VSProjectConfigCollection.cs -./VSProjectConfig.cs -./VSProject.cs -./XmlResultVisitor.cs diff --git a/mcs/nunit20/util/NUnitGuiSettings.cs b/mcs/nunit20/util/NUnitGuiSettings.cs deleted file mode 100644 index b8579466203..00000000000 --- a/mcs/nunit20/util/NUnitGuiSettings.cs +++ /dev/null @@ -1,57 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Util -{ - /// - /// NUnitGuiSettings hods settings for the GUI test runner - /// - public class NUnitGuiSettings : SettingsGroup - { - private static readonly string NAME = "NUnitGui"; - - public NUnitGuiSettings( ) : base( NAME, UserSettings.GetStorageImpl( NAME ) ) { } - - public NUnitGuiSettings( SettingsStorage storage ) : base( NAME, storage ) { } - - public NUnitGuiSettings( SettingsGroup parent ) : base( NAME, parent ) { } - - public FormSettings Form - { - get { return new FormSettings( this ); } - } - -// public GuiOptionsSettings Options -// { -// get { return new GuiOptionsSettings( this ); } -// } - } -} diff --git a/mcs/nunit20/util/NUnitProject.cs b/mcs/nunit20/util/NUnitProject.cs deleted file mode 100644 index 5f2edd5faaf..00000000000 --- a/mcs/nunit20/util/NUnitProject.cs +++ /dev/null @@ -1,612 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Xml; -using System.Xml.Schema; -using System.IO; -using System.Threading; -using NUnit.Core; - -namespace NUnit.Util -{ - /// - /// Types of changes that may occur to a config - /// - public enum ProjectChangeType - { - ActiveConfig, - AddConfig, - RemoveConfig, - UpdateConfig, - Other - } - - /// - /// Arguments for a project event - /// - public class ProjectEventArgs : EventArgs - { - public ProjectChangeType type; - public string configName; - - public ProjectEventArgs( ProjectChangeType type, string configName ) - { - this.type = type; - this.configName = configName; - } - } - - /// - /// Delegate to be used to handle project events - /// - public delegate void ProjectEventHandler( object sender, ProjectEventArgs e ); - - /// - /// Class that represents an NUnit test project - /// - public class NUnitProject - { - #region Static and instance variables - - /// - /// Used to generate default names for projects - /// - private static int projectSeed = 0; - - /// - /// The extension used for test projects - /// - private static readonly string nunitExtension = ".nunit"; - - /// - /// Path to the file storing this project - /// - protected string projectPath; - - /// - /// Whether the project is dirty - /// - protected bool isDirty = false; - - /// - /// Collection of configs for the project - /// - protected ProjectConfigCollection configs; - - /// - /// The currently active configuration - /// - private ProjectConfig activeConfig; - - /// - /// Flag indicating that this project is a - /// temporary wrapper for an assembly. - /// - private bool isAssemblyWrapper = false; - - #endregion - - #region Constructor - - public NUnitProject( string projectPath ) - { - this.projectPath = Path.GetFullPath( projectPath ); - configs = new ProjectConfigCollection( this ); - } - - #endregion - - #region Static Methods - - // True if it's one of our project types - public static bool IsProjectFile( string path ) - { - return Path.GetExtension( path ) == nunitExtension; - } - - // True if it's ours or one we can load - public static bool CanLoadAsProject( string path ) - { - return IsProjectFile( path ) || - VSProject.IsProjectFile( path ) || - VSProject.IsSolutionFile( path ); - } - - public static string GenerateProjectName() - { - return string.Format( "Project{0}", ++projectSeed ); - } - - public static NUnitProject EmptyProject() - { - return new NUnitProject( GenerateProjectName() ); - } - - public static NUnitProject NewProject() - { - NUnitProject project = EmptyProject(); - - project.Configs.Add( "Debug" ); - project.Configs.Add( "Release" ); - project.IsDirty = false; - - return project; - } - - /// - /// Return a test project by either loading it from - /// the supplied path, creating one from a VS file - /// or wrapping an assembly. - /// - public static NUnitProject LoadProject( string path ) - { - if ( NUnitProject.IsProjectFile( path ) ) - { - NUnitProject project = new NUnitProject( path ); - project.Load(); - return project; - } - else if ( VSProject.IsProjectFile( path ) ) - return NUnitProject.FromVSProject( path ); - else if ( VSProject.IsSolutionFile( path ) ) - return NUnitProject.FromVSSolution( path ); - else - return NUnitProject.FromAssembly( path ); - - } - - /// - /// Creates a project to wrap a list of assemblies - /// - public static NUnitProject FromAssemblies( string[] assemblies ) - { - // if only one assembly is passed in then the configuration file - // should follow the name of the assembly. This will only happen - // if the LoadAssembly method is called. Currently the console ui - // does not differentiate between having one or multiple assemblies - // passed in. - if ( assemblies.Length == 1) - return NUnitProject.FromAssembly(assemblies[0]); - - - NUnitProject project = NUnitProject.EmptyProject(); - ProjectConfig config = new ProjectConfig( "Default" ); - foreach( string assembly in assemblies ) - { - string fullPath = Path.GetFullPath( assembly ); - - if ( !File.Exists( fullPath ) ) - throw new FileNotFoundException( string.Format( "Assembly not found: {0}", fullPath ) ); - - config.Assemblies.Add( fullPath ); - } - - project.Configs.Add( config ); - - // TODO: Deduce application base, and provide a - // better value for loadpath and project path - // analagous to how new projects are handled - string basePath = Path.GetDirectoryName( Path.GetFullPath( assemblies[0] ) ); - project.projectPath = Path.Combine( basePath, project.Name + ".nunit" ); - - project.IsDirty = true; - - return project; - } - - /// - /// Creates a project to wrap an assembly - /// - public static NUnitProject FromAssembly( string assemblyPath ) - { - if ( !File.Exists( assemblyPath ) ) - throw new FileNotFoundException( string.Format( "Assembly not found: {0}", assemblyPath ) ); - - string fullPath = Path.GetFullPath( assemblyPath ); - - NUnitProject project = new NUnitProject( fullPath ); - - ProjectConfig config = new ProjectConfig( "Default" ); - config.Assemblies.Add( fullPath ); - project.Configs.Add( config ); - - project.isAssemblyWrapper = true; - project.IsDirty = false; - - return project; - } - - public static NUnitProject FromVSProject( string vsProjectPath ) - { - NUnitProject project = new NUnitProject( Path.GetFullPath( vsProjectPath ) ); - - VSProject vsProject = new VSProject( vsProjectPath ); - project.Add( vsProject ); - - project.isDirty = false; - - return project; - } - - public static NUnitProject FromVSSolution( string solutionPath ) - { - NUnitProject project = new NUnitProject( Path.GetFullPath( solutionPath ) ); - - string solutionDirectory = Path.GetDirectoryName( solutionPath ); - StreamReader reader = new StreamReader( solutionPath ); - - char[] delims = { '=', ',' }; - char[] trimchars = { ' ', '"' }; - - string line = reader.ReadLine(); - while ( line != null ) - { - if ( line.StartsWith( "Project" ) ) - { - string[] parts = line.Split( delims ); - string vsProjectPath = Path.Combine( solutionDirectory, parts[2].Trim(trimchars) ); - - if ( VSProject.IsProjectFile( vsProjectPath ) ) - project.Add( new VSProject( vsProjectPath ) ); - } - - line = reader.ReadLine(); - } - - project.isDirty = false; - - return project; - } - - /// - /// Figure out the proper name to be used when saving a file. - /// - public static string ProjectPathFromFile( string path ) - { - string fileName = Path.GetFileNameWithoutExtension( path ) + nunitExtension; - return Path.Combine( Path.GetDirectoryName( path ), fileName ); - } - - #endregion - - #region Properties and Events - - public static int ProjectSeed - { - get { return projectSeed; } - set { projectSeed = value; } - } - - /// - /// The path to which a project will be saved. - /// - public string ProjectPath - { - get { return projectPath; } - set - { - projectPath = Path.GetFullPath( value ); - isDirty = true; - } - } - - /// - /// The base path for the project is the - /// directory part of the project path. - /// - public string BasePath - { - get { return Path.GetDirectoryName( projectPath ); } - } - - /// - /// The name of the project. - /// - public string Name - { - get { return Path.GetFileNameWithoutExtension( projectPath ); } - } - - public ProjectConfig ActiveConfig - { - get - { - // In case the previous active config was removed - if ( activeConfig != null && !configs.Contains( activeConfig ) ) - activeConfig = null; - - // In case no active config is set or it was removed - if ( activeConfig == null && configs.Count > 0 ) - activeConfig = configs[0]; - - return activeConfig; - } - } - - // Safe access to name of the active config - public string ActiveConfigName - { - get - { - ProjectConfig config = ActiveConfig; - return config == null ? null : config.Name; - } - } - - public bool IsLoadable - { - get - { - return ActiveConfig != null && - ActiveConfig.Assemblies.Count > 0; - } - } - - // A project made from a single assembly is treated - // as a transparent wrapper for some purposes until - // a change is made to it. - public bool IsAssemblyWrapper - { - get { return isAssemblyWrapper; } - } - - public string ConfigurationFile - { - get - { - // TODO: Check this - return isAssemblyWrapper - ? Path.GetFileName( projectPath ) + ".config" - : Path.GetFileNameWithoutExtension( projectPath ) + ".config"; - } - } - - public bool IsDirty - { - get { return isDirty; } - set { isDirty = value; } - } - - public ProjectConfigCollection Configs - { - get { return configs; } - } - - public event ProjectEventHandler Changed; - - #endregion - - #region Instance Methods - - public void SetActiveConfig( int index ) - { - activeConfig = configs[index]; - OnProjectChange( ProjectChangeType.ActiveConfig, activeConfig.Name ); - } - - public void SetActiveConfig( string name ) - { - foreach( ProjectConfig config in configs ) - { - if ( config.Name == name ) - { - activeConfig = config; - OnProjectChange( ProjectChangeType.ActiveConfig, activeConfig.Name ); - break; - } - } - } - - public void OnProjectChange( ProjectChangeType type, string configName ) - { - isDirty = true; - - if ( isAssemblyWrapper ) - { - projectPath = Path.ChangeExtension( projectPath, ".nunit" ); - isAssemblyWrapper = false; - } - - if ( Changed != null ) - Changed( this, new ProjectEventArgs( type, configName ) ); - - if ( type == ProjectChangeType.RemoveConfig && activeConfig.Name == configName ) - { - if ( configs.Count > 0 ) - SetActiveConfig( 0 ); - } - } - - public void Add( VSProject vsProject ) - { - foreach( VSProjectConfig vsConfig in vsProject.Configs ) - { - string name = vsConfig.Name; - - if ( !this.Configs.Contains( name ) ) - this.Configs.Add( name ); - - ProjectConfig config = this.Configs[name]; - - foreach ( string assembly in vsConfig.Assemblies ) - config.Assemblies.Add( assembly ); - } - } - - public void Load() - { - XmlTextReader reader = new XmlTextReader( projectPath ); - - string activeConfigName = null; - ProjectConfig currentConfig = null; - - try - { - reader.MoveToContent(); - if ( reader.NodeType != XmlNodeType.Element || reader.Name != "NUnitProject" ) - throw new ProjectFormatException( - "Invalid project format: expected.", - reader.LineNumber, reader.LinePosition ); - - while( reader.Read() ) - if ( reader.NodeType == XmlNodeType.Element ) - switch( reader.Name ) - { - case "Settings": - if ( reader.NodeType == XmlNodeType.Element ) - activeConfigName = reader.GetAttribute( "activeconfig" ); - break; - - case "Config": - if ( reader.NodeType == XmlNodeType.Element ) - { - string configName = reader.GetAttribute( "name" ); - currentConfig = new ProjectConfig( configName ); - currentConfig.BasePath = reader.GetAttribute( "appbase" ); - currentConfig.ConfigurationFile = reader.GetAttribute( "configfile" ); - - string binpath = reader.GetAttribute( "binpath" ); - string type = reader.GetAttribute( "binpathtype" ); - if ( type == null ) - if ( binpath == null ) - currentConfig.BinPathType = BinPathType.Auto; - else - currentConfig.BinPathType = BinPathType.Manual; - else - currentConfig.BinPathType = (BinPathType)Enum.Parse( typeof( BinPathType ), type, true ); - Configs.Add( currentConfig ); - if ( configName == activeConfigName ) - activeConfig = currentConfig; - } - else if ( reader.NodeType == XmlNodeType.EndElement ) - currentConfig = null; - break; - - case "assembly": - if ( reader.NodeType == XmlNodeType.Element && currentConfig != null ) - { - string path = reader.GetAttribute( "path" ); - string test = reader.GetAttribute( "test" ); - bool hasTests = test == null ? true : bool.Parse( test ); - currentConfig.Assemblies.Add( - Path.Combine( currentConfig.BasePath, path ), - hasTests ); - } - break; - - default: - break; - } - - this.IsDirty = false; - } - catch( XmlException e ) - { - throw new ProjectFormatException( - string.Format( "Invalid project format: {0}", e.Message ), - e.LineNumber, e.LinePosition ); - } - catch( Exception e ) - { - throw new ProjectFormatException( - string.Format( "Invalid project format: {0} Line {1}, Position {2}", - e.Message, reader.LineNumber, reader.LinePosition ), - reader.LineNumber, reader.LinePosition ); - } - finally - { - reader.Close(); - } - } - - public void Save() - { - projectPath = ProjectPathFromFile( projectPath ); - - XmlTextWriter writer = new XmlTextWriter( projectPath, System.Text.Encoding.UTF8 ); - writer.Formatting = Formatting.Indented; - - writer.WriteStartElement( "NUnitProject" ); - - if ( configs.Count > 0 ) - { - writer.WriteStartElement( "Settings" ); - writer.WriteAttributeString( "activeconfig", ActiveConfigName ); - writer.WriteEndElement(); - } - - foreach( ProjectConfig config in Configs ) - { - writer.WriteStartElement( "Config" ); - writer.WriteAttributeString( "name", config.Name ); - if ( config.RelativeBasePath != null ) - writer.WriteAttributeString( "appbase", config.RelativeBasePath ); - - string configFile = config.ConfigurationFile; - if ( configFile != null && configFile != this.ConfigurationFile ) - writer.WriteAttributeString( "configfile", config.ConfigurationFile ); - - if ( config.BinPathType == BinPathType.Manual ) - writer.WriteAttributeString( "binpath", config.PrivateBinPath ); - else - writer.WriteAttributeString( "binpathtype", config.BinPathType.ToString() ); - - foreach( AssemblyListItem assembly in config.Assemblies ) - { - writer.WriteStartElement( "assembly" ); - writer.WriteAttributeString( "path", config.RelativePathTo( assembly.FullPath ) ); - if ( !assembly.HasTests ) - writer.WriteAttributeString( "test", "false" ); - writer.WriteEndElement(); - } - - writer.WriteEndElement(); - } - - writer.WriteEndElement(); - - writer.Close(); - this.IsDirty = false; - - // Once we save a project, it's no longer - // loaded as an assembly wrapper on reload. - this.isAssemblyWrapper = false; - } - - public void Save( string projectPath ) - { - this.ProjectPath = projectPath; - Save(); - } - - #endregion - } -} diff --git a/mcs/nunit20/util/NUnitRegistry.cs b/mcs/nunit20/util/NUnitRegistry.cs deleted file mode 100644 index 9fec88fa39f..00000000000 --- a/mcs/nunit20/util/NUnitRegistry.cs +++ /dev/null @@ -1,129 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using System.IO; - using System.Text; - using System.Windows.Forms; - using Microsoft.Win32; - - /// - /// NUnitRegistry provides static properties for NUnit's - /// CurrentUser and LocalMachine subkeys. - /// - public class NUnitRegistry - { - private static readonly string KEY = - @"Software\Nascent Software\Nunit\"; - - private static bool testMode = false; - private static string testKey = - @"Software\Nascent Software\Nunit-Test"; - - - /// - /// Prevent construction of object - /// - private NUnitRegistry() { } - - public static bool TestMode - { - get { return testMode; } - set { testMode = value; } - } - - public static string TestKey - { - get { return testKey; } - set { testKey = value; } - } - - /// - /// Registry subkey for the current user - /// - public static RegistryKey CurrentUser - { - get - { - // Todo: Code can go here to migrate the registry - // if we change our location. - // Try to open new key - // if ( key doesn't exist ) - // create it - // open old key - // if ( it was opened ) - // copy entries to new key - // return new key - return Registry.CurrentUser.CreateSubKey( testMode ? testKey : KEY ); - } - } - - /// - /// Registry subkey for the local machine - /// - public static RegistryKey LocalMachine - { - get { return Registry.LocalMachine.CreateSubKey( testMode ? testKey : KEY ); } - } - - public static void ClearTestKeys() - { - ClearSubKey( Registry.CurrentUser, testKey ); - ClearSubKey( Registry.LocalMachine, testKey ); - } - - /// - /// Static function that clears out the contents of a subkey - /// - /// Base key for the subkey - /// Name of the subkey - public static void ClearSubKey( RegistryKey baseKey, string subKey ) - { - using( RegistryKey key = baseKey.OpenSubKey( subKey, true ) ) - { - if ( key != null ) ClearKey( key ); - } - } - - /// - /// Static function that clears out the contents of a key - /// - /// Key to be cleared - public static void ClearKey( RegistryKey key ) - { - foreach( string name in key.GetValueNames() ) - key.DeleteValue( name ); - - foreach( string name in key.GetSubKeyNames() ) - key.DeleteSubKeyTree( name ); - } - } -} diff --git a/mcs/nunit20/util/OptionSettings.cs b/mcs/nunit20/util/OptionSettings.cs deleted file mode 100644 index 1e21c93ede1..00000000000 --- a/mcs/nunit20/util/OptionSettings.cs +++ /dev/null @@ -1,108 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Util -{ - /// - /// Summary description for OptionSettings. - /// - public class OptionSettings : SettingsGroup - { - private static readonly string NAME = "Options"; - - public OptionSettings( ) : base( NAME, UserSettings.GetStorageImpl( NAME ) ) { } - - public OptionSettings( SettingsStorage storage ) : base( NAME, storage ) { } - - public OptionSettings( SettingsGroup parent ) : base( NAME, parent ) { } - - public bool LoadLastProject - { - get { return LoadIntSetting( "LoadLastProject", 1 ) != 0; } - set { SaveIntSetting( "LoadLastProject", value ? 1 : 0 ); } - } - - public int InitialTreeDisplay - { - get { return LoadIntSetting( "InitialTreeDisplay", 0 ); } - set { SaveIntSetting( "InitialTreeDisplay", value ); } - } - - public bool ReloadOnRun - { - get { return LoadIntSetting( "ReloadOnRun", 1 ) != 0; } - set { SaveIntSetting( "ReloadOnRun", value ? 1 : 0 ); } - } - - public bool ShowCheckBoxes - { - get { return LoadIntSetting( "ShowCheckBoxes", 0 ) != 0; } - set { SaveIntSetting( "ShowCheckBoxes", value ? 1 : 0 ); } - } - - public bool ReloadOnChange - { - get - { - if ( Environment.OSVersion.Platform != System.PlatformID.Win32NT ) - return false; - - return LoadIntSetting( "ReloadOnChange", 1 ) != 0; - } - - set - { - if ( Environment.OSVersion.Platform != System.PlatformID.Win32NT ) - return; - - SaveIntSetting( "ReloadOnChange", value ? 1 : 0 ); - } - } - - public bool ClearResults - { - get { return LoadIntSetting( "ClearResults", 1 ) != 0; } - set { SaveIntSetting( "ClearResults", value ? 1 : 0 ); } - } - - public bool TestLabels - { - get { return LoadIntSetting( "TestLabels", 0 ) != 0; } - set { SaveIntSetting( "TestLabels", value ? 1 : 0 ); } - } - - public bool VisualStudioSupport - { - get { return LoadIntSetting( "VisualStudioSupport", 0 ) != 0; } - set { SaveIntSetting( "VisualStudioSupport", value ? 1 : 0 ); } - } - } -} diff --git a/mcs/nunit20/util/ProjectConfig.cs b/mcs/nunit20/util/ProjectConfig.cs deleted file mode 100644 index aac3f733f4d..00000000000 --- a/mcs/nunit20/util/ProjectConfig.cs +++ /dev/null @@ -1,339 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Text; -using System.Collections; -using System.IO; -using NUnit.Core; - -namespace NUnit.Util -{ - public enum BinPathType - { - Auto, - Manual, - None - } - - public class ProjectConfig - { - #region Instance Variables - - /// - /// The name of this config - /// - private string name; - - /// - /// IProject interface of containing project - /// - protected NUnitProject project = null; - - /// - /// Mark this config as changed - /// - private bool isDirty = false; - - /// - /// List of the names of the assemblies - /// - private AssemblyList assemblies; - - /// - /// Base path specific to this configuration - /// - private string basePath; - - /// - /// Our configuration file, if specified - /// - private string configFile; - - /// - /// Private bin path, if specified - /// - private string binPath; - - /// - /// True if assembly paths should be added to bin path - /// - private BinPathType binPathType = BinPathType.Auto; - - #endregion - - #region Construction - - public ProjectConfig() - { - this.assemblies = new AssemblyList( this ); - } - - public ProjectConfig( string name ) - { - this.name = name; - this.assemblies = new AssemblyList( this ); - } - - #endregion - - #region Properties and Events - - public NUnitProject Project - { - get { return project; } - set { project = value; } - } - - public bool IsDirty - { - get { return isDirty; } - set - { - isDirty = value; - - if ( isDirty ) - { - if ( Changed != null ) - Changed( this, EventArgs.Empty ); - } - } - } - - public string Name - { - get { return name; } - set - { - if ( name != value ) - { - name = value; - IsDirty = true; - } - } - } - - public event EventHandler Changed; - - /// - /// The base directory for this config - used - /// as the application base for loading tests. - /// - public string BasePath - { - get - { - if ( project == null || project.BasePath == null ) - return basePath; - - if ( basePath == null ) - return project.BasePath; - - return Path.Combine( project.BasePath, basePath ); - } - set - { - if ( BasePath != value ) - { - basePath = value; - IsDirty = true; - } - } - } - - /// - /// The base path relative to the project base - /// - public string RelativeBasePath - { - get - { - if ( project == null || basePath == null || !Path.IsPathRooted( basePath ) ) - return basePath; - - return ProjectPath.RelativePath( project.BasePath, basePath ); - } - } - - public string ConfigurationFile - { - get - { - return configFile == null && project != null - ? project.ConfigurationFile - : configFile; - } - set - { - if ( ConfigurationFile != value ) - { - configFile = value; - IsDirty = true; - } - } - } - - public string ConfigurationFilePath - { - get - { - return BasePath != null && ConfigurationFile != null - ? Path.Combine( BasePath, ConfigurationFile ) - : ConfigurationFile; - } - } - - /// - /// The semicolon-separated path containing all the - /// assemblies in the list. - /// - public string PrivateBinPath - { - get - { - switch( binPathType ) - { - case BinPathType.Manual: - return binPath; - - case BinPathType.Auto: - StringBuilder sb = new StringBuilder(200); - ArrayList dirList = new ArrayList(); - - foreach( AssemblyListItem assembly in Assemblies ) - { - string dir = ProjectPath.RelativePath( BasePath, Path.GetDirectoryName( assembly.FullPath ) ); - if ( dir != null && dir != "." && !dirList.Contains( dir ) ) - { - dirList.Add( dir ); - if ( sb.Length > 0 ) - sb.Append( ';' ); - sb.Append( dir ); - } - } - - return sb.Length == 0 ? null : sb.ToString(); - - default: - return null; - } - } - - set - { - if ( binPath != value ) - { - binPath = value; - binPathType = binPath == null ? BinPathType.Auto : BinPathType.Manual; - IsDirty = true; - } - } - } - - /// - /// How our PrivateBinPath is generated - /// - public BinPathType BinPathType - { - get { return binPathType; } - set - { - if ( binPathType != value ) - { - binPathType = value; - IsDirty = true; - } - } - } - - /// - /// Return our AssemblyList - /// - public AssemblyList Assemblies - { - get { return assemblies; } - } - - /// - /// Return a string array with the absolute paths of all assemblies - /// - public string[] AbsolutePaths - { - get - { - ArrayList paths = new ArrayList(); - foreach( AssemblyListItem assembly in assemblies ) - paths.Add( assembly.FullPath ); - return (string[])paths.ToArray( typeof(string) ); - } - } - - /// - /// Return a string array with the relative paths of all - /// assemblies from the configuration BasePath. - /// - public string[] RelativePaths - { - get - { - ArrayList paths = new ArrayList(); - foreach( AssemblyListItem assembly in Assemblies ) - paths.Add( ProjectPath.RelativePath( BasePath, assembly.FullPath ) ); - return (string[])paths.ToArray( typeof(string) ); - } - } - - /// - /// Return a string array with the absolute paths of all - /// assemblies that have tests - /// - public string[] TestAssemblies - { - get - { - ArrayList paths = new ArrayList(); - foreach( AssemblyListItem assembly in Assemblies ) - if ( assembly.HasTests ) - paths.Add( assembly.FullPath ); - return (string[])paths.ToArray( typeof(string) ); - } - } - - #endregion - - #region Methods - - public string RelativePathTo( string path ) - { - return ProjectPath.RelativePath( BasePath, path ); - } - - #endregion - } -} diff --git a/mcs/nunit20/util/ProjectConfigCollection.cs b/mcs/nunit20/util/ProjectConfigCollection.cs deleted file mode 100644 index 8a28fa3cfef..00000000000 --- a/mcs/nunit20/util/ProjectConfigCollection.cs +++ /dev/null @@ -1,169 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Collections; - -namespace NUnit.Util -{ - /// - /// Summary description for ProjectConfigCollection. - /// - public class ProjectConfigCollection : CollectionBase - { - protected NUnitProject project; - - public ProjectConfigCollection( NUnitProject project ) - { - this.project = project; - } - - #region Properties - - public NUnitProject Project - { - get { return project; } - } - - public ArrayList Names - { - get - { - ArrayList names = new ArrayList(); - - foreach( ProjectConfig config in InnerList ) - names.Add( config.Name ); - - return names; - } - } - - public ProjectConfig this[int index] - { - get { return (ProjectConfig)InnerList[index]; } - } - - public ProjectConfig this[string name] - { - get - { - int index = IndexOf( name ); - return index >= 0 ? (ProjectConfig)InnerList[index]: null; - } - } - #endregion - - #region Methods - - public void Add( ProjectConfig config ) - { - List.Add( config ); - config.Project = this.Project; - } - - public void Add( string name ) - { - Add( new ProjectConfig( name ) ); - } - - public void Remove( ProjectConfig config ) - { - string name = config.Name; - bool wasActive = name == this.Project.ActiveConfigName; - List.Remove( config ); - } - - public void Remove( string name ) - { - int index = IndexOf( name ); - if ( index >= 0 ) - { - bool wasActive = name == this.Project.ActiveConfigName; - RemoveAt( index ); - } - } - - public int IndexOf( ProjectConfig config ) - { - return InnerList.IndexOf( config ); - } - - public int IndexOf( string name ) - { - for( int index = 0; index < InnerList.Count; index++ ) - { - ProjectConfig config = (ProjectConfig)InnerList[index]; - if( config.Name == name ) - return index; - } - - return -1; - } - - public bool Contains( ProjectConfig config ) - { - return InnerList.Contains( config ); - } - - public bool Contains( string name ) - { - return IndexOf( name ) >= 0; - } - - protected override void OnRemoveComplete( int index, object obj ) - { - ProjectConfig config = obj as ProjectConfig; - this.Project.OnProjectChange( ProjectChangeType.RemoveConfig, config.Name ); - } - - protected override void OnInsertComplete( int index, object obj ) - { - ProjectConfig config = obj as ProjectConfig; - project.OnProjectChange( ProjectChangeType.AddConfig, config.Name ); - config.Changed += new EventHandler( OnConfigChanged ); - } - - protected override void OnSetComplete( int index, object oldValue, object newValue ) - { - ProjectConfig oldConfig = oldValue as ProjectConfig; - ProjectConfig newConfig = newValue as ProjectConfig; - bool active = oldConfig.Name == project.ActiveConfigName; - - project.OnProjectChange( ProjectChangeType.UpdateConfig, newConfig.Name ); - } - - private void OnConfigChanged( object sender, EventArgs e ) - { - ProjectConfig config = sender as ProjectConfig; - project.OnProjectChange( ProjectChangeType.UpdateConfig, config.Name ); - } - - #endregion - } -} diff --git a/mcs/nunit20/util/ProjectFormatException.cs b/mcs/nunit20/util/ProjectFormatException.cs deleted file mode 100644 index 662aa8a6c4b..00000000000 --- a/mcs/nunit20/util/ProjectFormatException.cs +++ /dev/null @@ -1,81 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Util -{ - /// - /// Exception raised when loading a project file with - /// an invalid format. - /// - public class ProjectFormatException : ApplicationException - { - #region Instance Variables - - private int lineNumber; - - private int linePosition; - - #endregion - - #region Constructors - - public ProjectFormatException() : base() {} - - public ProjectFormatException( string message ) - : base( message ) {} - - public ProjectFormatException( string message, Exception inner ) - : base( message, inner ) {} - - public ProjectFormatException( string message, int lineNumber, int linePosition ) - : base( message ) - { - this.lineNumber = lineNumber; - this.linePosition = linePosition; - } - - #endregion - - #region Properties - - public int LineNumber - { - get { return lineNumber; } - } - - public int LinePosition - { - get { return linePosition; } - } - - #endregion - } -} diff --git a/mcs/nunit20/util/ProjectPath.cs b/mcs/nunit20/util/ProjectPath.cs deleted file mode 100644 index 93d951a5bb5..00000000000 --- a/mcs/nunit20/util/ProjectPath.cs +++ /dev/null @@ -1,234 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.IO; -using System.Text; -using System.Runtime.InteropServices; -#if TARGET_JVM -using System.Collections; -#endif -namespace NUnit.Util -{ - /// - /// Static methods for manipulating project paths, including both directories - /// and files. Some synonyms for System.Path methods are included as well. - /// - public class ProjectPath - { - public const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010; - public const uint FILE_ATTRIBUTE_NORMAL = 0x00000080; - public const int MAX_PATH = 256; - - #region Public methods - - public static bool IsAssemblyFileType( string path ) - { - string extension = Path.GetExtension( path ); - return extension == ".dll" || extension == ".exe"; - } - -#if !TARGET_JVM - /// - /// Returns the relative path from a base directory to another - /// directory or file. - /// - public static string RelativePath( string from, string to ) - { - from = Canonicalize( from ); - to = Canonicalize( to ); - - // Second argument to PathRelativeTo must be absolute - if ( !Path.IsPathRooted( to ) ) - return to; - - StringBuilder sb = new StringBuilder( MAX_PATH ); - - // Return null if call fails - if ( !PathRelativePathTo( sb, from, FILE_ATTRIBUTE_DIRECTORY, to, FILE_ATTRIBUTE_DIRECTORY ) ) - return null; - - // Remove initial .\ from path if present - if ( sb.Length >=2 && sb[0] == '.' && sb[1] == '\\' ) - sb.Remove( 0, 2 ); - - if ( sb.Length == 0 ) - return null; - - return sb.ToString(); - } -#else - /// - /// Returns the relative path from a base directory to another - /// directory or file. - /// - public static string RelativePath( string from, string to ) - { - char dirSeperator = System.IO.Path.DirectorySeparatorChar; - string upDirStr = @"..\"; - - //Start by normalizing paths - NormalizePath (ref from); - NormalizePath (ref to); - - if ( !IsPathValid (from) || !IsPathValid (to) ) - return string.Empty; - - if (!System.IO.Path.IsPathRooted (to)) - return to; - - //First check if FullPath begins with the BasePath - if ( to.StartsWith (from)) - return to.Replace (from,"."); - - //Now parse backwards - StringBuilder backDirs = new StringBuilder (); - string partialPath = from; - int index = partialPath.LastIndexOf (dirSeperator); - while (index > 0) { - //Strip path step string to last backslash and add another step backwards to our pass replacement - partialPath = partialPath.Substring(0,index); - backDirs.Append(upDirStr); - - //check if FullPath begins with the current partialPath - if ( to.StartsWith(partialPath) ) - if ( to == partialPath ) { - //Full Directory match and need to replace it all - backDirs.Remove (backDirs.Length-1, 1); - return backDirs.ToString (); - } - else //We're dealing with a file or a start path - return to.Replace (partialPath + dirSeperator, backDirs.ToString ()); - - index = partialPath.LastIndexOf (dirSeperator, partialPath.Length-1); - } - //No common root found, return null. - return null; - } -#endif - /// - /// Return the canonical form of a path. - public static string Canonicalize( string path ) - { -#if !TARGET_JVM - StringBuilder sb = new StringBuilder( MAX_PATH ); - if ( !PathCanonicalize( sb, path ) ) - throw new ArgumentException( string.Format( "Invalid path passed to PathCanonicalize: {0}", path ) ); - - return sb.ToString(); -#else - return Path.GetFullPath( path ); -#endif - } - - /// - /// True if the two paths are the same. However, two paths - /// to the same file or directory using different network - /// shares or drive letters are not treated as equal. - /// - public static bool SamePath( string path1, string path2 ) - { - return Canonicalize(path1).ToLower() == Canonicalize(path2).ToLower(); - } - - /// - /// True if the two paths are the same or if the second is - /// directly or indirectly under the first. Note that paths - /// using different network shares or drive letters are - /// considered unrelated, even if they end up referencing - /// the same subtrees in the file system. - /// - public static bool SamePathOrUnder( string path1, string path2 ) - { - path1 = Canonicalize( path1 ); - path2 = Canonicalize( path2 ); - - int length1 = path1.Length; - int length2 = path2.Length; - - // if path1 is longer, then path2 can't be under it - if ( length1 > length2 ) - return false; - - // if lengths are the same, check for equality - if ( length1 == length2 ) - return path1.ToLower() == path2.ToLower(); - - // path 2 is longer than path 1: see if initial parts match - if ( path1.ToLower() != path2.Substring( 0, length1 ).ToLower() ) - return false; - - // must match through or up to a directory separator boundary - return path2[length1-1] == Path.DirectorySeparatorChar || - path2[length1] == Path.DirectorySeparatorChar; - } - - #endregion - -#if !TARGET_JVM - #region Shlwapi functions used internally - - [DllImport("shlwapi.dll")] - private static extern bool PathRelativePathTo( - StringBuilder result, - string from, - uint attrFrom, - string to, - uint attrTo ); - - [DllImport("shlwapi.dll")] - private static extern bool PathCanonicalize( - StringBuilder result, - string path ); - - [DllImport("shlwapi.dll")] - private static extern int PathCommonPrefix( - string file1, - string file2, - StringBuilder result ); - - #endregion -#else - private static bool IsPathValid(string path) - { - return (path!=string.Empty) && (path[0] != System.IO.Path.DirectorySeparatorChar); - } - - private static void NormalizePath (ref string path) - { - string dirSeperator = new string (new char [] {System.IO.Path.DirectorySeparatorChar}); - - path = path.ToLower (); - if (path.EndsWith (dirSeperator)) - path = path.Substring (0, path.Length - 1); - } - -#endif - } -} diff --git a/mcs/nunit20/util/RecentFileSettings.cs b/mcs/nunit20/util/RecentFileSettings.cs deleted file mode 100644 index 17216c304aa..00000000000 --- a/mcs/nunit20/util/RecentFileSettings.cs +++ /dev/null @@ -1,173 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Collections; - -namespace NUnit.Util -{ - /// - /// Base class for settings that hold lists of recent files - /// - public abstract class RecentFileSettings : SettingsGroup - { - // TODO: This class does more loading and - // storing than it should but this is the - // current simplest solution to having - // multiple recentfiles objects around. - // We can fix this by using a singleton. - private IList fileEntries; - - public static readonly int MinSize = 1; - - public static readonly int MaxSize = 24; - - public static readonly int DefaultSize = 5; - - public RecentFileSettings( string name ) : base ( name, UserSettings.GetStorageImpl( name ) ) - { - LoadFiles(); - } - - public RecentFileSettings( string name, SettingsStorage storage ) : base( name, storage ) - { - LoadFiles(); - } - - public RecentFileSettings( string name, SettingsGroup parent ) : base( name, parent ) - { - LoadFiles(); - } - - public int MaxFiles - { - get - { - int size = LoadIntSetting( "MaxFiles", DefaultSize ); - - if ( size < MinSize ) size = MinSize; - if ( size > MaxSize ) size = MaxSize; - - return size; - } - set - { - int oldSize = MaxFiles; - int newSize = value; - - if ( newSize < MinSize ) newSize = MinSize; - if ( newSize > MaxSize ) newSize = MaxSize; - - SaveIntSetting( "MaxFiles", newSize ); - if ( newSize < oldSize ) SaveSettings(); - } - } - - protected void LoadFiles() - { - fileEntries = new ArrayList(); - for ( int index = 1; index <= MaxFiles; index++ ) - { - string fileName = LoadStringSetting( ValueName( index ) ); - if ( fileName != null ) - fileEntries.Add( fileName ); - } - } - - public override void Clear() - { - base.Clear(); - fileEntries = new ArrayList(); - } - - public IList GetFiles() - { - LoadFiles(); - return fileEntries; - } - - public string RecentFile - { - get - { - LoadFiles(); - if( fileEntries.Count > 0 ) - return (string)fileEntries[0]; - - return null; - } - set - { - LoadFiles(); - - int index = fileEntries.IndexOf(value); - - if(index == 0) return; - - if(index != -1) - { - fileEntries.RemoveAt(index); - } - - fileEntries.Insert( 0, value ); - if( fileEntries.Count > MaxFiles ) - fileEntries.RemoveAt( MaxFiles ); - - SaveSettings(); - } - } - - public void Remove( string fileName ) - { - LoadFiles(); - fileEntries.Remove( fileName ); - SaveSettings(); - } - - private void SaveSettings() - { - while( fileEntries.Count > MaxFiles ) - fileEntries.RemoveAt( fileEntries.Count - 1 ); - - for( int index = 0; index < MaxSize; index++ ) - { - string valueName = ValueName( index + 1 ); - if ( index < fileEntries.Count ) - SaveSetting( valueName, fileEntries[index] ); - else - RemoveSetting( valueName ); - } - } - - private string ValueName( int index ) - { - return string.Format( "File{0}", index ); - } - } -} diff --git a/mcs/nunit20/util/RecentProjectSettings.cs b/mcs/nunit20/util/RecentProjectSettings.cs deleted file mode 100644 index 80c1f6a5baf..00000000000 --- a/mcs/nunit20/util/RecentProjectSettings.cs +++ /dev/null @@ -1,60 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Util -{ - /// - /// Holds list of most recent projects - /// - /// NOTE: An earlier version had separate settings for - /// RecentProjects and RecentAssemblies. Currently we - /// currently only have RecentProjects, displayed in - /// the user interface as "Recent Files" and containing - /// all types of projects and assemblies that have - /// been opened. We retained the separation into two - /// classes in case we should need another recent list - /// at some time in the future. The UI component - /// RecentFilesMenuHandler can deal with any class - /// derived from RecentFileSettings. - /// - public class RecentProjectSettings : RecentFileSettings - { - private static readonly string NAME = "Recent-Projects"; - - public RecentProjectSettings( ) : base ( NAME ) { } - - public RecentProjectSettings( SettingsStorage storage ) - : base( NAME, storage ) { } - - public RecentProjectSettings( SettingsGroup parent ) - : base( NAME, parent ) { } - } -} diff --git a/mcs/nunit20/util/RegistrySettingsStorage.cs b/mcs/nunit20/util/RegistrySettingsStorage.cs deleted file mode 100644 index a07c389e02d..00000000000 --- a/mcs/nunit20/util/RegistrySettingsStorage.cs +++ /dev/null @@ -1,263 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Diagnostics; -using Microsoft.Win32; - -namespace NUnit.Util -{ - /// - /// Implementation of SettingsStorage for NUnit user settings, - /// based on storage of settings in the registry. - /// - public class RegistrySettingsStorage : SettingsStorage, IDisposable - { - #region Instance Variables - - /// - /// If not null, the registry key for this storage - /// - private RegistryKey storageKey; - - #endregion - - #region Construction and Disposal - - /// - /// Construct a storage as a child of another storage - /// - /// The name to give the storage - /// The parent in which the storage is to be created - public RegistrySettingsStorage( string storageName, RegistrySettingsStorage parentStorage ) - : base( storageName, parentStorage ) - { - this.storageKey = parentStorage.StorageKey.CreateSubKey( storageName ); - } - - /// - /// Construct a storage using a registry key. This constructor is - /// intended for use at the top level of the hierarchy. - /// - /// The name to give the storage - /// The registry Key under which the storage will be created - public RegistrySettingsStorage( string storageName, RegistryKey parentKey ) - : base ( storageName, null ) - { - this.storageKey = parentKey.CreateSubKey( storageName ); - } - - /// - /// Construct a storage on top of a given key, using the key's name - /// - /// - public RegistrySettingsStorage( RegistryKey storageKey ) - : base( storageKey.Name, null ) - { - this.storageKey = storageKey; - } - - /// - /// Dispose of this object by closing the storage key, if any - /// - public override void Dispose() - { - if ( storageKey != null ) - storageKey.Close(); - } - - #endregion - - #region Properties - - /// - /// The registry key used to hold this storage - /// - public RegistryKey StorageKey - { - get { return storageKey; } - } - - /// - /// The count of settings in this storage - /// - public override int SettingsCount - { - get { return storageKey.ValueCount; } - } - - #endregion - - #region Methods - - /// - /// Find out if a child storage exists - /// - /// Name of the child storage - /// True if the child storage exists - public override bool ChildStorageExists( string storageName ) - { - using (RegistryKey key = storageKey.OpenSubKey( storageName ) ) - { - return key != null; - } - } - - /// - /// Make a new child storage under this one - /// - /// Name of the child storage to make - /// New storage - public override SettingsStorage MakeChildStorage( string storageName ) - { - return new RegistrySettingsStorage( storageName, this ); - } - - /// - /// Load a setting from this storage - /// - /// Name of the setting to load - /// Value of the setting - public override object LoadSetting( string settingName ) - { - return storageKey.GetValue( settingName ); - } - - /// - /// Load an int setting from this storage. Since int is a - /// value type, we can't return null so zero is used to - /// indicate that nothing was found - or the found value - /// was zero. If you need to distinguish, use your own - /// default value or call LoadSetting and check for null. - /// - /// Name of the setting to load - /// Value of the setting or zero if missing - public override int LoadIntSetting( string settingName ) - { - return LoadIntSetting( settingName, 0 ); - } - - /// - /// Load a string setting from this storage - /// - /// Name of the setting to load - /// Value of the setting - public override string LoadStringSetting( string settingName ) - { - object resultValue = storageKey.GetValue( settingName ); - if ( resultValue == null || resultValue is string ) - return (string) resultValue; - - return resultValue.ToString(); - } - - /// - /// Load a setting from this storage or return a default value - /// - /// Name of setting to load - /// Value to return if the seeting is not present - /// Value of the setting or the default - public override object LoadSetting( string settingName, object defaultValue ) - { - return storageKey.GetValue( settingName, defaultValue ); - } - - /// - /// Load an integer setting from this storage or return a default value - /// - /// Name of setting to load - /// Value to return if the seeting is not present - /// Value of the setting or the default - public override int LoadIntSetting( string settingName, int defaultValue ) - { - object resultValue = storageKey.GetValue( settingName, defaultValue ); - if ( resultValue is int ) - return (int)resultValue; - - return int.Parse( (string)resultValue ); - } - - /// - /// Load a string setting from this storage or return a default value - /// - /// Name of setting to load - /// Value to return if the seeting is not present - /// Value of the setting or the default - public override string LoadStringSetting( string settingName, string defaultValue ) - { - object resultValue = storageKey.GetValue( settingName, defaultValue ); - if ( resultValue is string ) - return (string) resultValue; - - return resultValue.ToString(); - } - - /// - /// Remove a setting from the storage - /// - /// Name of the setting to remove - public override void RemoveSetting( string settingName ) - { - storageKey.DeleteValue( settingName, false ); - } - - /// - /// Save a setting in this storage - /// - /// Name of the setting to save - /// Value to be saved - public override void SaveSetting( string settingName, object settingValue ) - { - storageKey.SetValue( settingName, settingValue ); - } - - /// - /// Static function that clears out the contents of a key - /// - /// Key to be cleared - public static void ClearKey( RegistryKey key ) - { - foreach( string name in key.GetValueNames() ) - key.DeleteValue( name ); - - foreach( string name in key.GetSubKeyNames() ) - key.DeleteSubKeyTree( name ); - } - - /// - /// Clear all settings from the storage - empty storage remains - /// - public override void Clear() - { - ClearKey( storageKey ); - } - - #endregion - } -} diff --git a/mcs/nunit20/util/ResultSummarizer.cs b/mcs/nunit20/util/ResultSummarizer.cs deleted file mode 100644 index 408a8e4cb30..00000000000 --- a/mcs/nunit20/util/ResultSummarizer.cs +++ /dev/null @@ -1,93 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using NUnit.Core; - - /// - /// Summary description for ResultSummarizer. - /// - public class ResultSummarizer - { - private SummaryVisitor visitor = new SummaryVisitor(); - - public ResultSummarizer(TestResult result) - { - result.Accept(visitor); - } - - public ResultSummarizer(TestResult[] results) - { - foreach( TestResult result in results ) - result.Accept( visitor ); - } - - public string Name - { - get { return visitor.Name; } - } - - public bool Success - { - get { return visitor.Success; } - } - - public int ResultCount - { - get { return visitor.Count; } - } - -// public int Errors -// { -// get { return visitor.Errors; } -// } - - public int Failures - { - get { return visitor.Failures; } - } - - public double Time - { - get { return visitor.Time; } - } - - public int TestsNotRun - { - get { return visitor.TestsNotRun; } - } - - public int SuitesNotRun - { - get { return visitor.SuitesNotRun; } - } - } -} diff --git a/mcs/nunit20/util/SettingsGroup.cs b/mcs/nunit20/util/SettingsGroup.cs deleted file mode 100644 index 410249765d9..00000000000 --- a/mcs/nunit20/util/SettingsGroup.cs +++ /dev/null @@ -1,247 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using System.Collections; - - /// - /// SettingsGroup is the base class representing a group - /// of user or system settings. A pimpl idiom is used - /// to provide implementation-independence. - /// - public class SettingsGroup : IDisposable - { - #region Instance Variables - /// - /// The name of this group of settings - /// - private string name; - - /// - /// If not null, the storage implementation holding the group settings. - /// - private SettingsStorage storageImpl; - - /// - /// If not null, the settings group that contains this one. - /// - private SettingsGroup parentSettings; - - #endregion - - #region Construction and Disposal - - /// - /// Construct a settings group based on a storage implementation. - /// - /// Name of the group - /// Storage for the group settings - public SettingsGroup( string name, SettingsStorage storageImpl ) - { - this.name = name; - this.storageImpl = storageImpl; - } - - /// - /// Construct a settings group based on a parent group that contains it. - /// - /// Name of the group - /// Containing group - public SettingsGroup( string name, SettingsGroup parentSettings ) - { - this.name = name; - this.parentSettings = parentSettings; - this.storageImpl = parentSettings.Storage.MakeChildStorage( name ); - } - - /// - /// Dispose of this group by disposing of it's storage implementation - /// - public void Dispose() - { - if ( storageImpl != null ) - { - storageImpl.Dispose(); - storageImpl = null; - } - } - - #endregion - - #region Properties - - /// - /// The name of the group - /// - public string Name - { - get { return name; } - } - - /// - /// The storage used for the group settings - /// - public SettingsStorage Storage - { - get { return storageImpl; } - } - - /// - /// The number of settings in this group - /// - public int SettingsCount - { - get { return storageImpl.SettingsCount; } - } - - #endregion - - #region Methods - - /// - /// Clear all settings and subgroups in this group - /// - public virtual void Clear() - { - storageImpl.Clear(); - } - - /// - /// Load the value of one of the group's settings - /// - /// Name of setting to load - /// Value of the setting or null - public object LoadSetting( string settingName ) - { - return storageImpl.LoadSetting( settingName ); - } - - /// - /// Load the value of one of the group's integer settings - /// in a type-safe manner. - /// - /// Name of setting to load - /// Value of the setting or null - public int LoadIntSetting( string settingName ) - { - return storageImpl.LoadIntSetting( settingName ); - } - - /// - /// Load the value of one of the group's string settings - /// in a type-safe manner. - /// - /// Name of setting to load - /// Value of the setting or null - public string LoadStringSetting( string settingName ) - { - return storageImpl.LoadStringSetting( settingName ); - } - - /// - /// Load the value of one of the group's settings or return a default value - /// - /// Name of setting to load - /// Value to return if the seeting is not present - /// Value of the setting or the default - public object LoadSetting( string settingName, object defaultValue ) - { - return storageImpl.LoadSetting( settingName, defaultValue ); - } - - /// - /// Load the value of one of the group's integer settings - /// in a type-safe manner or return a default value - /// - /// Name of setting to load - /// Value to return if the seeting is not present - /// Value of the setting or the default - public int LoadIntSetting( string settingName, int defaultValue ) - { - return storageImpl.LoadIntSetting( settingName, defaultValue ); - } - - /// - /// Load the value of one of the group's string settings - /// in a type-safe manner or return a default value - /// - /// Name of setting to load - /// Value to return if the seeting is not present - /// Value of the setting or the default - public string LoadStringSetting( string settingName, string defaultValue ) - { - return storageImpl.LoadStringSetting( settingName, defaultValue ); - } - - /// - /// Remove a setting from the group - /// - /// Name of the setting to remove - public void RemoveSetting( string settingName ) - { - storageImpl.RemoveSetting( settingName ); - } - - /// - /// Save the value of one of the group's settings - /// - /// Name of the setting to save - /// Value to be saved - public void SaveSetting( string settingName, object settingValue ) - { - storageImpl.SaveSetting( settingName, settingValue ); - } - - /// - /// Save the value of one of the group's integer settings - /// in a type-safe manner. - /// - /// Name of the setting to save - /// Value to be saved - public void SaveIntSetting( string settingName, int settingValue ) - { - storageImpl.SaveSetting( settingName, settingValue ); - } - - /// - /// Save the value of one of the group's string settings - /// in a type-safe manner. - /// - /// Name of the setting to save - /// Value to be saved - public void SaveStringSetting( string settingName, string settingValue ) - { - storageImpl.SaveSetting( settingName, settingValue ); - } - - #endregion - } -} diff --git a/mcs/nunit20/util/SettingsStorage.cs b/mcs/nunit20/util/SettingsStorage.cs deleted file mode 100644 index d3e3e3b14ae..00000000000 --- a/mcs/nunit20/util/SettingsStorage.cs +++ /dev/null @@ -1,185 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using System.IO; - - /// - /// Abstract class representing a hierarchical storage used to hold - /// application settings. The actual implementation is left to - /// derived classes, and may be based on the registry, isolated - /// storage or any other mechanism. - /// - public abstract class SettingsStorage : IDisposable - { - #region Instance Variables - - /// - /// The name of this storage - /// - private string storageName; - - /// - /// The parent storage containing this storage - /// - private SettingsStorage parentStorage; - #endregion - - #region Construction and Disposal - - /// - /// Construct a SettingsStorage under a parent storage - /// - /// Name of the storage - /// The parent which contains the new storage - public SettingsStorage( string storageName, SettingsStorage parentStorage ) - { - this.storageName = storageName; - this.parentStorage = parentStorage; - } - - /// - /// Dispose of resources held by this storage - /// - public abstract void Dispose(); - - #endregion - - #region Properties - - /// - /// The number of settings in this group - /// - public abstract int SettingsCount - { - get; - } - - /// - /// The name of the storage - /// - public string StorageName - { - get { return storageName; } - } - - /// - /// The storage that contains this one - /// - public SettingsStorage ParentStorage - { - get { return parentStorage; } - } - - #endregion - - #region Methods - - /// - /// Find out if a substorage exists - /// - /// Name of the child storage - /// True if the storage exists - public abstract bool ChildStorageExists( string name ); - - /// - /// Create a child storage of the same type - /// - /// Name of the child storage - /// New child storage - public abstract SettingsStorage MakeChildStorage( string name ); - - /// - /// Clear all settings from the storage - empty storage remains - /// - public abstract void Clear(); - - /// - /// Load a setting from the storage. - /// - /// Name of the setting to load - /// Value of the setting or null - public abstract object LoadSetting( string settingName ); - - /// - /// Load an integer setting from the storage - /// - /// Name of the setting to load - /// Value of the setting or null - public abstract int LoadIntSetting( string settingName ); - - /// - /// Load a string setting from the storage - /// - /// Name of the setting to load - /// Value of the setting or null - public abstract string LoadStringSetting( string settingName ); - - /// - /// Load a setting from the storage or return a default value - /// - /// Name of the setting to load - /// Value to return if the setting is missing - /// Value of the setting or the default value - public abstract object LoadSetting( string settingName, object defaultValue ); - - /// - /// Load an integer setting from the storage or return a default value - /// - /// Name of the setting to load - /// Value to return if the setting is missing - /// Value of the setting or the default value - public abstract int LoadIntSetting( string settingName, int defaultValue ); - - /// - /// Load a string setting from the storage or return a default value - /// - /// Name of the setting to load - /// Value to return if the setting is missing - /// Value of the setting or the default value - public abstract string LoadStringSetting( string settingName, string defaultValue ); - - /// - /// Remove a setting from the storage - /// - /// Name of the setting to remove - public abstract void RemoveSetting( string settingName ); - - /// - /// Save a setting in the storage - /// - /// Name of the setting to save - /// Value to be saved - public abstract void SaveSetting( string settingName, object settingValue ); - - #endregion - } -} diff --git a/mcs/nunit20/util/StackTraceFilter.cs b/mcs/nunit20/util/StackTraceFilter.cs deleted file mode 100644 index 331a11d9ce2..00000000000 --- a/mcs/nunit20/util/StackTraceFilter.cs +++ /dev/null @@ -1,85 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using System.IO; - - /// - /// Summary description for StackTraceFilter. - /// - public class StackTraceFilter - { - public static string Filter(string stack) - { - if(stack == null) return null; - StringWriter sw = new StringWriter(); - StringReader sr = new StringReader(stack); - - try - { - string line; - while ((line = sr.ReadLine()) != null) - { - if (!FilterLine(line)) - sw.WriteLine(line); - } - } - catch (Exception) - { - return stack; - } - return sw.ToString(); - } - - static bool FilterLine(string line) - { - string[] patterns = new string[] - { - "NUnit.Core.TestCase", - "NUnit.Core.ExpectedExceptionTestCase", - "NUnit.Core.TemplateTestCase", - "NUnit.Core.TestResult", - "NUnit.Core.TestSuite", - "NUnit.Framework.Assertion", - "NUnit.Framework.Assert" - }; - - for (int i = 0; i < patterns.Length; i++) - { - if (line.IndexOf(patterns[i]) > 0) - return true; - } - - return false; - } - - } -} diff --git a/mcs/nunit20/util/SummaryVisitor.cs b/mcs/nunit20/util/SummaryVisitor.cs deleted file mode 100644 index 34d4d4e8075..00000000000 --- a/mcs/nunit20/util/SummaryVisitor.cs +++ /dev/null @@ -1,129 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using NUnit.Core; - - /// - /// Summary description for SiummaryVisitor. - /// - public class SummaryVisitor : ResultVisitor - { - private int totalCount; - private int failureCount; - private int testsNotRun; - private int suitesNotRun; - - private double time; - private string name; - private bool initialized; - - public SummaryVisitor() - { - totalCount = 0; - initialized = false; - } - - public void Visit(TestCaseResult caseResult) - { - SetNameandTime(caseResult.Name, caseResult.Time); - - if(caseResult.Executed) - { - totalCount++; - if(caseResult.IsFailure) - failureCount++; - } - else - testsNotRun++; - } - - public void Visit(TestSuiteResult suiteResult) - { - SetNameandTime(suiteResult.Name, suiteResult.Time); - - - - foreach (TestResult result in suiteResult.Results) - { - result.Accept(this); - } - - if(!suiteResult.Executed) - suitesNotRun++; - } - - public double Time - { - get { return time; } - } - - private void SetNameandTime(string name, double time) - { - if(!initialized) - { - this.time = time; - this.name = name; - initialized = true; - } - } - - public bool Success - { - get { return (failureCount == 0); } - } - - public int Count - { - get { return totalCount; } - } - - public int Failures - { - get { return failureCount; } - } - - public int TestsNotRun - { - get { return testsNotRun; } - } - - public int SuitesNotRun - { - get { return suitesNotRun; } - } - - public string Name - { - get { return name; } - } - } -} diff --git a/mcs/nunit20/util/TestDomain.cs b/mcs/nunit20/util/TestDomain.cs deleted file mode 100644 index 6959233c087..00000000000 --- a/mcs/nunit20/util/TestDomain.cs +++ /dev/null @@ -1,542 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Util -{ - using System.Runtime.Remoting; - using System.Security.Policy; - using System.Reflection; - using System.Collections; - using System.Collections.Specialized; - using System.Configuration; - using System.IO; - - using NUnit.Core; - - public class TestDomain : TestRunner - { - #region Instance Variables - - /// - /// The appdomain used to load tests - /// - private AppDomain domain; - - /// - /// The path to our cache - /// - private string cachePath; - - /// - /// The remote runner loaded in the test appdomain - /// - private TestRunner testRunner; - - /// - /// Writer for console standard output - /// - private TextWriter outWriter; - - /// - /// Writer for console error output - /// - private TextWriter errorWriter; - - /// - /// Holds the event listener while we are running - /// - private EventListener listener; - - /// - /// Indicate whether files should be shadow copied - /// - private bool shadowCopyFiles = true; - - #endregion - - #region Properties - - public AppDomain AppDomain - { - get { return domain; } - } - - public TextWriter Out - { - get { return outWriter; } - set { outWriter = value; } - } - - public TextWriter Error - { - get { return errorWriter; } - set { errorWriter = value; } - } - - private TestRunner Runner - { - get - { - if ( testRunner == null ) - testRunner = MakeRemoteTestRunner( domain ); - - return testRunner; - } - } - - public bool DisplayTestLabels - { - get { return Runner.DisplayTestLabels; } - set { Runner.DisplayTestLabels = value; } - } - - private TestRunner MakeRemoteTestRunner( AppDomain runnerDomain ) - { -#if !TARGET_JVM - object obj = runnerDomain.CreateInstanceAndUnwrap( - typeof(RemoteTestRunner).Assembly.FullName, - typeof(RemoteTestRunner).FullName, - false, BindingFlags.Default,null,null,null,null,null); - - RemoteTestRunner runner = (RemoteTestRunner) obj; -#else - RemoteTestRunner runner = new RemoteTestRunner(); -#endif - - runner.Out = this.outWriter; - runner.Error = this.errorWriter; - - return runner; - } - - public Version FrameworkVersion - { - get { return Runner.FrameworkVersion; } - } - - public bool ShadowCopyFiles - { - get { return shadowCopyFiles; } - set - { - if ( this.domain != null ) - throw new ArgumentException( "ShadowCopyFiles may not be set after domain is created" ); - shadowCopyFiles = value; - } - } - - public TestResult[] Results - { - get { return Runner.Results; } - } - - public TestResult Result - { - get { return Runner.Result; } - } - - #endregion - - #region Constructors - - public TestDomain( TextWriter outWriter, TextWriter errorWriter ) - { - this.outWriter = outWriter; - this.errorWriter = errorWriter; - } - - public TestDomain() : this( TextWriter.Null, TextWriter.Null ) { } - - #endregion - - #region Loading and Unloading Tests - - public Test Load( string assemblyFileName ) - { - return Load( assemblyFileName, string.Empty ); - } - - public Test Load(string assemblyFileName, string testFixture) - { - Unload(); - - try - { - CreateDomain( assemblyFileName ); - string assemblyPath = Path.GetFullPath( assemblyFileName ); - - if ( testFixture != null && testFixture != string.Empty ) - return Runner.Load( assemblyPath, testFixture ); - else - return Runner.Load( assemblyPath ); - } - catch - { - Unload(); - throw; - } - } - - public Test Load( string testFileName, string[] assemblies ) - { - return Load( testFileName, assemblies, null ); - } - - public Test Load( string testFileName, string[] assemblies, string testFixture ) - { - FileInfo testFile = new FileInfo( testFileName ); - return Load( testFileName, testFile.DirectoryName, testFile.FullName + ".config", GetBinPath(assemblies), assemblies, testFixture ); - } - - public Test Load( string testFileName, string appBase, string configFile, string binPath, string[] assemblies, string testFixture ) - { - Unload(); - - try - { - CreateDomain( testFileName, appBase, configFile, binPath, assemblies ); - - if ( testFixture != null ) - return Runner.Load( testFileName, assemblies, testFixture ); - else - return Runner.Load( testFileName, assemblies ); - } - catch - { - Unload(); - throw; - } - } - - public Test Load( NUnitProject project ) - { - return Load( project, null ); - } - - public Test Load( NUnitProject project, string testFixture ) - { - ProjectConfig cfg = project.ActiveConfig; - - if ( project.IsAssemblyWrapper ) - return Load( cfg.Assemblies[0].FullPath, testFixture ); - else - return Load( project.ProjectPath, cfg.BasePath, cfg.ConfigurationFile, cfg.PrivateBinPath, cfg.TestAssemblies, testFixture ); - } - - public void Unload() - { - testRunner = null; -#if !TARGET_JVM - if(domain != null) - { - try - { - AppDomain.Unload(domain); - if ( this.ShadowCopyFiles ) - DeleteCacheDir( new DirectoryInfo( cachePath ) ); - } - catch( CannotUnloadAppDomainException ) - { - // TODO: Do something useful. For now we just - // leave the orphaned AppDomain "out there" - // rather than aborting the application. - } - finally - { - domain = null; - } - } -#endif - } - - public static string GetBinPath( string[] assemblies ) - { - ArrayList dirs = new ArrayList(); - string binPath = null; - - foreach( string path in assemblies ) - { - string dir = Path.GetDirectoryName( Path.GetFullPath( path ) ); - if ( !dirs.Contains( dir ) ) - { - dirs.Add( dir ); - - if ( binPath == null ) - binPath = dir; - else - binPath = binPath + ";" + dir; - } - } - - return binPath; - } - - #endregion - - #region Counting Tests - - public int CountTestCases() - { - return Runner.CountTestCases(); - } - - public int CountTestCases( string testName ) - { - return Runner.CountTestCases( testName ); - } - - - public int CountTestCases( string[] testNames ) - { - return Runner.CountTestCases( testNames ); - } - - #endregion - - public ICollection GetCategories() - { - return Runner.GetCategories(); - } - - #region Running Tests - -// public TestResult Run(NUnit.Core.EventListener listener, IFilter filter) -// { -// return Runner.Run( listener, filter ); -// } - - public void SetFilter( IFilter filter ) - { - Runner.SetFilter( filter ); - } - - public TestResult Run(NUnit.Core.EventListener listener) - { - using( new TestExceptionHandler( new UnhandledExceptionEventHandler( OnUnhandledException ) ) ) - { - this.listener = listener; - return Runner.Run( listener ); - } - } - - public TestResult Run(NUnit.Core.EventListener listener, string testName) - { - using( new TestExceptionHandler( new UnhandledExceptionEventHandler( OnUnhandledException ) ) ) - { - this.listener = listener; - return Runner.Run( listener, testName ); - } - } - - public TestResult[] Run(NUnit.Core.EventListener listener, string[] testNames) - { - using( new TestExceptionHandler( new UnhandledExceptionEventHandler( OnUnhandledException ) ) ) - { - this.listener = listener; - return Runner.Run( listener, testNames ); - } - } - - public void RunTest(NUnit.Core.EventListener listener ) - { - using( new TestExceptionHandler( new UnhandledExceptionEventHandler( OnUnhandledException ) ) ) - { - this.listener = listener; - Runner.RunTest( listener ); - } - } - - public void RunTest(NUnit.Core.EventListener listener, string testName ) - { - using( new TestExceptionHandler( new UnhandledExceptionEventHandler( OnUnhandledException ) ) ) - { - this.listener = listener; - Runner.RunTest( listener, testName ); - } - } - - public void RunTest(NUnit.Core.EventListener listener, string[] testNames) - { - using( new TestExceptionHandler( new UnhandledExceptionEventHandler( OnUnhandledException ) ) ) - { - this.listener = listener; - Runner.RunTest( listener, testNames ); - } - } - - public void CancelRun() - { - Runner.CancelRun(); - } - - public void Wait() - { - Runner.Wait(); - } - - // For now, just publish any unhandled exceptions and let the listener - // figure out what to do with them. - private void OnUnhandledException( object sender, UnhandledExceptionEventArgs e ) - { - this.listener.UnhandledException( (Exception)e.ExceptionObject ); - } - - #endregion - - #region Helpers Used in AppDomain Creation and Removal - - /// - /// Construct an application domain for testing a single assembly - /// - /// The assembly file name - private void CreateDomain( string assemblyFileName ) - { - FileInfo testFile = new FileInfo( assemblyFileName ); - - string assemblyPath = Path.GetFullPath( assemblyFileName ); - string domainName = string.Format( "domain-{0}", Path.GetFileName( assemblyFileName ) ); - - domain = MakeAppDomain( domainName, testFile.DirectoryName, testFile.FullName + ".config", testFile.DirectoryName ); - } - - /// - /// Construct an application domain for testing multiple assemblies - /// - /// The file name of the project file - /// The application base path - /// The configuration file to use - /// The private bin path - /// A collection of assemblies to load - private void CreateDomain( string testFileName, string appBase, string configFile, string binPath, string[] assemblies ) - { - string domainName = string.Format( "domain-{0}", Path.GetFileName( testFileName ) ); - domain = MakeAppDomain( testFileName, appBase, configFile, binPath ); - } -#if !TARGET_JVM - /// - /// This method creates appDomains for the framework. - /// - /// Name of the domain - /// ApplicationBase for the domain - /// ConfigurationFile for the domain - /// PrivateBinPath for the domain - /// - private AppDomain MakeAppDomain( string domainName, string appBase, string configFile, string binPath ) - { - Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; - Evidence evidence = new Evidence(baseEvidence); - - AppDomainSetup setup = new AppDomainSetup(); - - // We always use the same application name - setup.ApplicationName = "Tests"; - // Note that we do NOT - // set ShadowCopyDirectories because we rely on the default - // setting of ApplicationBase plus PrivateBinPath - if ( this.ShadowCopyFiles ) - { - setup.ShadowCopyFiles = "true"; - setup.ShadowCopyDirectories = appBase; - } - else - { - setup.ShadowCopyFiles = "false"; - } - - setup.ApplicationBase = appBase; - setup.ConfigurationFile = configFile; - setup.PrivateBinPath = binPath; - - AppDomain runnerDomain = AppDomain.CreateDomain(domainName, evidence, setup); - - if ( this.ShadowCopyFiles ) - ConfigureCachePath(runnerDomain); - - return runnerDomain; - } -#else - private AppDomain MakeAppDomain( string domainName, string appBase, string configFile, string binPath ) - { - return AppDomain.CurrentDomain; - } -#endif - - /// - /// Set the location for caching and delete any old cache info - /// - /// Our domain - private void ConfigureCachePath(AppDomain domain) - { - cachePath = String.Format(@"{0}\{1}", - ConfigurationSettings.AppSettings["shadowfiles.path"], DateTime.Now.Ticks); - cachePath = Environment.ExpandEnvironmentVariables(cachePath); - if(cachePath.IndexOf ("%temp%\\") != -1) { - cachePath = cachePath.Replace ("%temp%\\", Path.GetTempPath()); - if (Path.DirectorySeparatorChar == '/') { - cachePath = cachePath.Replace ('\\', '/'); - } - } - - DirectoryInfo dir = new DirectoryInfo(cachePath); - if(dir.Exists) dir.Delete(true); - - domain.SetCachePath(cachePath); - - return; - } - - /// - /// Helper method to delete the cache dir. This method deals - /// with a bug that occurs when pdb files are marked read-only. - /// - /// - private void DeleteCacheDir( DirectoryInfo cacheDir ) - { - if(cacheDir.Exists) - { - foreach( DirectoryInfo dirInfo in cacheDir.GetDirectories() ) - { - dirInfo.Attributes &= ~FileAttributes.ReadOnly; - DeleteCacheDir( dirInfo ); - } - - foreach( FileInfo fileInfo in cacheDir.GetFiles() ) - { - fileInfo.Attributes &= ~FileAttributes.ReadOnly; - } - - cacheDir.Delete(true); - } - } - - #endregion - } -} diff --git a/mcs/nunit20/util/TestEventArgs.cs b/mcs/nunit20/util/TestEventArgs.cs deleted file mode 100644 index 4bca9d328e3..00000000000 --- a/mcs/nunit20/util/TestEventArgs.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; - -namespace NUnit.Util -{ - /// - /// The delegate for all events related to loading test projects - /// - public delegate void TestProjectEventHandler ( object sender, TestProjectEventArgs args ); - - public enum TestProjectAction - { - ProjectLoading, - ProjectLoaded, - ProjectLoadFailed, - ProjectUnloading, - ProjectUnloaded, - ProjectUnloadFailed, - } - - /// - /// Summary description for TestProjectEventArgs. - /// - public class TestProjectEventArgs : EventArgs - { - #region Instance Variables - - // The action represented by the event - private TestProjectAction action; - - // The project name - private string projectName; - - // The exception causing a failure - private Exception exception; - - #endregion - - #region Constructors - - public TestProjectEventArgs( TestProjectAction action, string projectName ) - { - this.action = action; - this.projectName = projectName; - } - - public TestProjectEventArgs( TestProjectAction action, - string projectName, Exception exception ) - { - this.action = action; - this.projectName = projectName; - this.exception = exception; - } - - #endregion - - #region Properties - - public TestProjectAction Action - { - get { return action; } - } - - public string ProjectName - { - get { return projectName; } - } - - public Exception Exception - { - get { return exception; } - } - - #endregion - } -} diff --git a/mcs/nunit20/util/TestEventDispatcher.cs b/mcs/nunit20/util/TestEventDispatcher.cs deleted file mode 100644 index 3c4a28968b9..00000000000 --- a/mcs/nunit20/util/TestEventDispatcher.cs +++ /dev/null @@ -1,257 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Collections; -using NUnit.Core; - -namespace NUnit.Util -{ - /// - /// Helper class used to dispatch test events - /// - public class ProjectEventDispatcher : TestEventDispatcher, IProjectEvents - { - #region Events - - // Project loading events - public event TestProjectEventHandler ProjectLoading; - public event TestProjectEventHandler ProjectLoaded; - public event TestProjectEventHandler ProjectLoadFailed; - public event TestProjectEventHandler ProjectUnloading; - public event TestProjectEventHandler ProjectUnloaded; - public event TestProjectEventHandler ProjectUnloadFailed; - - // Test loading events -// public event TestEventHandler TestLoading; -// public event TestEventHandler TestLoaded; -// public event TestEventHandler TestLoadFailed; -// -// public event TestEventHandler TestReloading; -// public event TestEventHandler TestReloaded; -// public event TestEventHandler TestReloadFailed; -// -// public event TestEventHandler TestUnloading; -// public event TestEventHandler TestUnloaded; -// public event TestEventHandler TestUnloadFailed; -// -// // Test running events -// public event TestEventHandler RunStarting; -// public event TestEventHandler RunFinished; -// -// public event TestEventHandler SuiteStarting; -// public event TestEventHandler SuiteFinished; -// -// public event TestEventHandler TestStarting; -// public event TestEventHandler TestFinished; -// -// public event TestEventHandler TestException; - - #endregion - - #region Methods for Firing Events - - private void Fire( - TestEventHandler handler, TestEventArgs e ) - { - if ( handler != null ) - handler( this, e ); - } - - private void Fire( - TestProjectEventHandler handler, TestProjectEventArgs e ) - { - if ( handler != null ) - handler( this, e ); - } - - public void FireProjectLoading( string fileName ) - { - Fire( - ProjectLoading, - new TestProjectEventArgs( TestProjectAction.ProjectLoading, fileName ) ); - } - - public void FireProjectLoaded( string fileName ) - { - Fire( - ProjectLoaded, - new TestProjectEventArgs( TestProjectAction.ProjectLoaded, fileName ) ); - } - - public void FireProjectLoadFailed( string fileName, Exception exception ) - { - Fire( - ProjectLoadFailed, - new TestProjectEventArgs( TestProjectAction.ProjectLoadFailed, fileName, exception ) ); - } - - public void FireProjectUnloading( string fileName ) - { - Fire( - ProjectUnloading, - new TestProjectEventArgs( TestProjectAction.ProjectUnloading, fileName ) ); - } - - public void FireProjectUnloaded( string fileName ) - { - Fire( - ProjectUnloaded, - new TestProjectEventArgs( TestProjectAction.ProjectUnloaded, fileName ) ); - } - - public void FireProjectUnloadFailed( string fileName, Exception exception ) - { - Fire( - ProjectUnloadFailed, - new TestProjectEventArgs( TestProjectAction.ProjectUnloadFailed, fileName, exception ) ); - } - -// public void FireTestLoading( string fileName ) -// { -// Fire( -// TestLoading, -// new TestEventArgs( TestAction.TestLoading, fileName ) ); -// } -// -// public void FireTestLoaded( string fileName, ITest test ) -// { -// Fire( -// TestLoaded, -// new TestEventArgs( TestAction.TestLoaded, fileName, test ) ); -// } -// -// public void FireTestLoadFailed( string fileName, Exception exception ) -// { -// Fire( -// TestLoadFailed, -// new TestEventArgs( TestAction.TestLoadFailed, fileName, exception ) ); -// } -// -// public void FireTestUnloading( string fileName, ITest test ) -// { -// Fire( -// TestUnloading, -// new TestEventArgs( TestAction.TestUnloading, fileName, test ) ); -// } -// -// public void FireTestUnloaded( string fileName, ITest test ) -// { -// Fire( -// TestUnloaded, -// new TestEventArgs( TestAction.TestUnloaded, fileName, test ) ); -// } -// -// public void FireTestUnloadFailed( string fileName, Exception exception ) -// { -// Fire( -// TestUnloadFailed, -// new TestEventArgs( TestAction.TestUnloadFailed, fileName, exception ) ); -// } -// -// public void FireTestReloading( string fileName, ITest test ) -// { -// Fire( -// TestReloading, -// new TestEventArgs( TestAction.TestReloading, fileName, test ) ); -// } -// -// public void FireTestReloaded( string fileName, ITest test ) -// { -// Fire( -// TestReloaded, -// new TestEventArgs( TestAction.TestReloaded, fileName, test ) ); -// } -// -// public void FireTestReloadFailed( string fileName, Exception exception ) -// { -// Fire( -// TestReloadFailed, -// new TestEventArgs( TestAction.TestReloadFailed, fileName, exception ) ); -// } -// -// public void FireRunStarting( ITest[] tests, int count ) -// { -// Fire( -// RunStarting, -// new TestEventArgs( TestAction.RunStarting, tests, count ) ); -// } -// -// public void FireRunFinished( TestResult[] results ) -// { -// Fire( -// RunFinished, -// new TestEventArgs( TestAction.RunFinished, results ) ); -// } -// -// public void FireRunFinished( Exception exception ) -// { -// Fire( -// RunFinished, -// new TestEventArgs( TestAction.RunFinished, exception ) ); -// } -// -// public void FireTestStarting( ITest test ) -// { -// Fire( -// TestStarting, -// new TestEventArgs( TestAction.TestStarting, test ) ); -// } -// -// public void FireTestFinished( TestResult result ) -// { -// Fire( -// TestFinished, -// new TestEventArgs( TestAction.TestFinished, result ) ); -// } -// -// public void FireSuiteStarting( ITest test ) -// { -// Fire( -// SuiteStarting, -// new TestEventArgs( TestAction.SuiteStarting, test ) ); -// } -// -// public void FireSuiteFinished( TestResult result ) -// { -// Fire( -// SuiteFinished, -// new TestEventArgs( TestAction.SuiteFinished, result ) ); -// } -// -// public void FireTestException( Exception exception ) -// { -// Fire( -// TestException, -// new TestEventArgs( TestAction.TestException, exception ) ); -// } - - #endregion - } -} diff --git a/mcs/nunit20/util/TestExceptionHandler.cs b/mcs/nunit20/util/TestExceptionHandler.cs deleted file mode 100644 index 5787ec8170a..00000000000 --- a/mcs/nunit20/util/TestExceptionHandler.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; - -namespace NUnit.Util -{ - /// - /// Summary description for UnhandledExceptionCatcher. - /// - public class TestExceptionHandler : IDisposable - { - private UnhandledExceptionEventHandler handler; - - public TestExceptionHandler( UnhandledExceptionEventHandler handler ) - { -#if !TARGET_JVM - this.handler = handler; - AppDomain.CurrentDomain.UnhandledException += handler; -#endif - } - - ~TestExceptionHandler() - { -#if !TARGET_JVM - if ( handler != null ) - { - AppDomain.CurrentDomain.UnhandledException -= handler; - handler = null; - } -#endif - } - - - - public void Dispose() - { -#if !TARGET_JVM - if ( handler != null ) - { - AppDomain.CurrentDomain.UnhandledException -= handler; - handler = null; - } - - System.GC.SuppressFinalize( this ); -#endif - } - } -} diff --git a/mcs/nunit20/util/TestLoader.cs b/mcs/nunit20/util/TestLoader.cs deleted file mode 100644 index daa5aed7b88..00000000000 --- a/mcs/nunit20/util/TestLoader.cs +++ /dev/null @@ -1,700 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using System.IO; - using System.Collections; - using System.Configuration; - using System.Threading; - using NUnit.Core; - - - /// - /// TestLoader handles interactions between a test runner and a - /// client program - typically the user interface - for the - /// purpose of loading, unloading and running tests. - /// - /// It implemements the EventListener interface which is used by - /// the test runner and repackages those events, along with - /// others as individual events that clients may subscribe to - /// in collaboration with a TestEventDispatcher helper object. - /// - /// TestLoader is quite handy for use with a gui client because - /// of the large number of events it supports. However, it has - /// no dependencies on ui components and can be used independently. - /// - public class TestLoader : LongLivingMarshalByRefObject, NUnit.Core.EventListener, ITestLoader - { - #region Instance Variables - - /// - /// StdOut stream for use by the TestRunner - /// - private TextWriter stdOutWriter; - - /// - /// StdErr stream for use by the TestRunner - /// - private TextWriter stdErrWriter; - - /// - /// Our event dispatiching helper object - /// - private ProjectEventDispatcher events; - - /// - /// Loads and executes tests. Non-null when - /// we have loaded a test. - /// - private TestDomain testDomain = null; - - /// - /// Our current test project, if we have one. - /// - private NUnitProject testProject = null; - - /// - /// The currently loaded test, returned by the testrunner - /// - private Test loadedTest = null; - - /// - /// The test name that was specified when loading - /// - private string loadedTestName = null; - - /// - /// The tests that are running - /// - private ITest[] runningTests = null; - - /// - /// Result of the last test run - /// - private TestResult[] results = null; - - /// - /// The last exception received when trying to load, unload or run a test - /// - private Exception lastException = null; - - /// - /// Watcher fires when the assembly changes - /// - private AssemblyWatcher watcher; - - /// - /// Assembly changed during a test and - /// needs to be reloaded later - /// - private bool reloadPending = false; - - /// - /// Indicates whether to watch for changes - /// and reload the tests when a change occurs. - /// - private bool reloadOnChange = false; - - /// - /// Indicates whether to reload the tests - /// before each run. - /// - private bool reloadOnRun = false; - - private IFilter filter; - - #endregion - - #region Constructor - - public TestLoader(TextWriter stdOutWriter, TextWriter stdErrWriter ) - { - this.stdOutWriter = stdOutWriter; - this.stdErrWriter = stdErrWriter; - this.events = new ProjectEventDispatcher(); - } - - #endregion - - #region Properties - - public bool IsProjectLoaded - { - get { return testProject != null; } - } - - public bool IsTestLoaded - { - get { return loadedTest != null; } - } - - public bool IsTestRunning - { - get { return runningTests != null; } - } - - public NUnitProject TestProject - { - get { return testProject; } - set { OnProjectLoad( value ); } - } - - public IProjectEvents Events - { - get { return events; } - } - - public string TestFileName - { - get { return testProject.ProjectPath; } - } - - public TestResult[] Results - { - get { return results; } - } - - public Exception LastException - { - get { return lastException; } - } - - public bool ReloadOnChange - { - get { return reloadOnChange; } - set { reloadOnChange = value; } - } - - public bool ReloadOnRun - { - get { return reloadOnRun; } - set { reloadOnRun = value; } - } - - public Version FrameworkVersion - { - get { return this.testDomain.FrameworkVersion; } - } - - #endregion - - #region EventListener Handlers - - void EventListener.RunStarted(Test[] tests) - { - int count = 0; - foreach( Test test in tests ) - count += filter == null ? test.CountTestCases() : test.CountTestCases( filter ); - - events.FireRunStarting( tests, count ); - } - - void EventListener.RunFinished(NUnit.Core.TestResult[] results) - { - this.results = results; - events.FireRunFinished( results ); - runningTests = null; - } - - void EventListener.RunFinished(Exception exception) - { - this.lastException = exception; - events.FireRunFinished( exception ); - runningTests = null; - } - - /// - /// Trigger event when each test starts - /// - /// TestCase that is starting - void EventListener.TestStarted(NUnit.Core.TestCase testCase) - { - events.FireTestStarting( testCase ); - } - - /// - /// Trigger event when each test finishes - /// - /// Result of the case that finished - void EventListener.TestFinished(TestCaseResult result) - { - events.FireTestFinished( result ); - } - - /// - /// Trigger event when each suite starts - /// - /// Suite that is starting - void EventListener.SuiteStarted(TestSuite suite) - { - events.FireSuiteStarting( suite ); - } - - /// - /// Trigger event when each suite finishes - /// - /// Result of the suite that finished - void EventListener.SuiteFinished(TestSuiteResult result) - { - events.FireSuiteFinished( result ); - } - - /// - /// Trigger event when an unhandled exception occurs during a test - /// - /// The unhandled exception - void EventListener.UnhandledException(Exception exception) - { - events.FireTestException( exception ); - } - - #endregion - - #region Methods for Loading and Unloading Projects - - /// - /// Create a new project with default naming - /// - public void NewProject() - { - try - { - events.FireProjectLoading( "New Project" ); - - OnProjectLoad( NUnitProject.NewProject() ); - } - catch( Exception exception ) - { - lastException = exception; - events.FireProjectLoadFailed( "New Project", exception ); - } - } - - /// - /// Create a new project using a given path - /// - public void NewProject( string filePath ) - { - try - { - events.FireProjectLoading( filePath ); - - NUnitProject project = new NUnitProject( filePath ); - - project.Configs.Add( "Debug" ); - project.Configs.Add( "Release" ); - project.IsDirty = false; - - OnProjectLoad( project ); - } - catch( Exception exception ) - { - lastException = exception; - events.FireProjectLoadFailed( filePath, exception ); - } - } - - /// - /// Load a new project, optionally selecting the config and fire events - /// - public void LoadProject( string filePath, string configName ) - { - try - { - events.FireProjectLoading( filePath ); - - NUnitProject newProject = NUnitProject.LoadProject( filePath ); - if ( configName != null ) - { - newProject.SetActiveConfig( configName ); - newProject.IsDirty = false; - } - - OnProjectLoad( newProject ); - -// return true; - } - catch( Exception exception ) - { - lastException = exception; - events.FireProjectLoadFailed( filePath, exception ); - -// return false; - } - } - - /// - /// Load a new project using the default config and fire events - /// - public void LoadProject( string filePath ) - { - LoadProject( filePath, null ); - } - - /// - /// Load a project from a list of assemblies and fire events - /// - public void LoadProject( string[] assemblies ) - { - try - { - events.FireProjectLoading( "New Project" ); - - NUnitProject newProject = NUnitProject.FromAssemblies( assemblies ); - - OnProjectLoad( newProject ); - -// return true; - } - catch( Exception exception ) - { - lastException = exception; - events.FireProjectLoadFailed( "New Project", exception ); - -// return false; - } - } - - /// - /// Unload the current project and fire events - /// - public void UnloadProject() - { - string testFileName = TestFileName; - - try - { - events.FireProjectUnloading( testFileName ); - -// if ( testFileName != null && File.Exists( testFileName ) ) -// UserSettings.RecentProjects.RecentFile = testFileName; - - if ( IsTestLoaded ) - UnloadTest(); - - testProject.Changed -= new ProjectEventHandler( OnProjectChanged ); - testProject = null; - - events.FireProjectUnloaded( testFileName ); - } - catch (Exception exception ) - { - lastException = exception; - events.FireProjectUnloadFailed( testFileName, exception ); - } - - } - - /// - /// Common operations done each time a project is loaded - /// - /// The newly loaded project - private void OnProjectLoad( NUnitProject testProject ) - { - if ( IsProjectLoaded ) - UnloadProject(); - - this.testProject = testProject; - testProject.Changed += new ProjectEventHandler( OnProjectChanged ); - - events.FireProjectLoaded( TestFileName ); - } - - private void OnProjectChanged( object sender, ProjectEventArgs e ) - { - switch ( e.type ) - { - case ProjectChangeType.ActiveConfig: - if( TestProject.IsLoadable ) - LoadTest(); - break; - - case ProjectChangeType.AddConfig: - case ProjectChangeType.UpdateConfig: - if ( e.configName == TestProject.ActiveConfigName && TestProject.IsLoadable ) - LoadTest(); - break; - - case ProjectChangeType.RemoveConfig: - if ( IsTestLoaded && TestProject.Configs.Count == 0 ) - UnloadTest(); - break; - - default: - break; - } - } - - #endregion - - #region Methods for Loading and Unloading Tests - - public void LoadTest() - { - LoadTest( null ); - } - - public void LoadTest( string testName ) - { - try - { - events.FireTestLoading( TestFileName ); - - testDomain = new TestDomain( stdOutWriter, stdErrWriter ); - Test test = testDomain.Load( TestProject, testName ); - - TestSuite suite = test as TestSuite; - if ( suite != null ) - suite.Sort(); - - loadedTest = test; - loadedTestName = testName; - results = null; - reloadPending = false; - - if ( ReloadOnChange ) - InstallWatcher( ); - - if ( suite != null ) - events.FireTestLoaded( TestFileName, this.loadedTest ); - else - { - lastException = new ApplicationException( string.Format ( "Unable to find test {0} in assembly", testName ) ); - events.FireTestLoadFailed( TestFileName, lastException ); - } - } - catch( FileNotFoundException exception ) - { - lastException = exception; - - foreach( string assembly in TestProject.ActiveConfig.AbsolutePaths ) - { - if ( Path.GetFileNameWithoutExtension( assembly ) == exception.FileName && - !ProjectPath.SamePathOrUnder( testProject.ActiveConfig.BasePath, assembly ) ) - { - lastException = new ApplicationException( string.Format( "Unable to load {0} because it is not located under the AppBase", exception.FileName ), exception ); - break; - } - } - - events.FireTestLoadFailed( TestFileName, lastException ); - } - catch( Exception exception ) - { - lastException = exception; - events.FireTestLoadFailed( TestFileName, exception ); - } - } - - /// - /// Unload the current test suite and fire the Unloaded event - /// - public void UnloadTest( ) - { - if( IsTestLoaded ) - { - // Hold the name for notifications after unload - string fileName = TestFileName; - - try - { - events.FireTestUnloading( TestFileName, this.loadedTest ); - - RemoveWatcher(); - - testDomain.Unload(); - - testDomain = null; - - loadedTest = null; - loadedTestName = null; - results = null; - reloadPending = false; - - events.FireTestUnloaded( fileName, this.loadedTest ); - } - catch( Exception exception ) - { - lastException = exception; - events.FireTestUnloadFailed( fileName, exception ); - } - } - } - - /// - /// Reload the current test on command - /// - public void ReloadTest() - { - OnTestChanged( TestFileName ); - } - - /// - /// Handle watcher event that signals when the loaded assembly - /// file has changed. Make sure it's a real change before - /// firing the SuiteChangedEvent. Since this all happens - /// asynchronously, we use an event to let ui components - /// know that the failure happened. - /// - /// Assembly file that changed - public void OnTestChanged( string testFileName ) - { - if ( IsTestRunning ) - reloadPending = true; - else - try - { - events.FireTestReloading( testFileName, this.loadedTest ); - - // Don't unload the old domain till after the event - // handlers get a chance to compare the trees. - TestDomain newDomain = new TestDomain( stdOutWriter, stdErrWriter ); - Test newTest = newDomain.Load( testProject, loadedTestName ); - TestSuite suite = newTest as TestSuite; - if ( suite != null ) - suite.Sort(); - - testDomain.Unload(); - - testDomain = newDomain; - loadedTest = newTest; - reloadPending = false; - - events.FireTestReloaded( testFileName, newTest ); - } - catch( Exception exception ) - { - lastException = exception; - events.FireTestReloadFailed( testFileName, exception ); - } - } - - #endregion - - #region Methods for Running Tests - - public void SetFilter( IFilter filter ) - { - this.filter = filter; - } - - /// - /// Run the currently loaded top level test suite - /// - public void RunLoadedTest() - { - RunTest( loadedTest ); - } - - /// - /// Run a testcase or testsuite from the currrent tree - /// firing the RunStarting and RunFinished events. - /// Silently ignore the call if a test is running - /// to allow for latency in the UI. - /// - /// The test to be run - public void RunTest( ITest test ) - { - RunTests( new ITest[] { test } ); - } - - public void RunTests( ITest[] tests ) - { - if ( !IsTestRunning ) - { - if ( reloadPending || ReloadOnRun ) - ReloadTest(); - - runningTests = tests; - - //kind of silly - string[] testNames = new string[ runningTests.Length ]; - int index = 0; - foreach (ITest node in runningTests) - testNames[index++] = node.UniqueName; - - testDomain.SetFilter( filter ); -// testDomain.DisplayTestLabels = UserSettings.Options.TestLabels; - testDomain.RunTest( this, testNames ); - } - } - - /// - /// Cancel the currently running test. - /// Fail silently if there is none to - /// allow for latency in the UI. - /// - public void CancelTestRun() - { - if ( IsTestRunning ) - testDomain.CancelRun(); - } - - public IList GetCategories() - { - ArrayList list = new ArrayList(); - list.AddRange(testDomain.GetCategories()); - return list; - } - - #endregion - - #region Helper Methods - - /// - /// Install our watcher object so as to get notifications - /// about changes to a test. - /// - /// Full path of the assembly to watch - private void InstallWatcher() - { - if(watcher!=null) watcher.Stop(); - - watcher = new AssemblyWatcher( 1000, TestProject.ActiveConfig.AbsolutePaths ); - watcher.AssemblyChangedEvent += new AssemblyWatcher.AssemblyChangedHandler( OnTestChanged ); - watcher.Start(); - } - - /// - /// Stop and remove our current watcher object. - /// - private void RemoveWatcher() - { - if ( watcher != null ) - { - watcher.Stop(); - watcher = null; - } - } - - #endregion - } -} diff --git a/mcs/nunit20/util/TestResultItem.cs b/mcs/nunit20/util/TestResultItem.cs deleted file mode 100644 index 06fac469372..00000000000 --- a/mcs/nunit20/util/TestResultItem.cs +++ /dev/null @@ -1,86 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; - -namespace NUnit.Util -{ - using NUnit.Core; - - /// - /// Summary description for TestResultItem. - /// - public class TestResultItem - { - private string testName; - private string message; - private string stackTrace; - - public TestResultItem(TestResult result ) - { - testName = result.Name; - message = result.Message; - stackTrace = result.StackTrace; - } - - public override string ToString() - { - return String.Format("{0} : {1}", testName, message); - } - - public string GetMessage() - { - return ToString(); - } - - public string GetToolTipMessage() //NRG 05/28/03 - Substitute spaces for tab characters - { - return (ReplaceTabs(GetMessage(), 8)); // Change each tab to 8 space characters - } - - public string ReplaceTabs(string strOriginal, int nSpaces) //NRG 05/28/03 - { - string strSpaces = string.Empty; - strSpaces = strSpaces.PadRight(nSpaces, ' '); - return(strOriginal.Replace("\t", strSpaces)); - } - - public string StackTrace - { - get - { - string trace = "No stack trace is available"; - if(stackTrace != null) - trace = StackTraceFilter.Filter(stackTrace); - - return stackTrace; - } - } - } -} diff --git a/mcs/nunit20/util/Transform.resx b/mcs/nunit20/util/Transform.resx deleted file mode 100755 index 991d2130529..00000000000 --- a/mcs/nunit20/util/Transform.resx +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - <?xml version="1.0" encoding="UTF-8" ?> -<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> -<xsl:output method='text'/> - -<xsl:template match="/"> - <xsl:apply-templates/> -</xsl:template> - -<xsl:template match="test-results"> -<xsl:text>Tests run: </xsl:text> -<xsl:value-of select="@total"/> -<xsl:text>, Failures: </xsl:text> -<xsl:value-of select="@failures"/> -<xsl:text>, Not run: </xsl:text> -<xsl:value-of select="@not-run"/> -<xsl:text>, Time: </xsl:text> -<xsl:value-of select="test-suite/@time"/> -<xsl:text> seconds -</xsl:text> -<xsl:text> -</xsl:text> - -<xsl:if test="//test-case[failure]"><xsl:text>Failures: -</xsl:text></xsl:if> -<xsl:apply-templates select="//test-case[failure]"/> -<xsl:if test="//test-case[@executed='False']"><xsl:text>Tests not run: -</xsl:text></xsl:if> -<xsl:apply-templates select="//test-case[@executed='False']"/> -<xsl:text disable-output-escaping='yes'>&#xD;&#xA;</xsl:text> -</xsl:template> - -<xsl:template match="test-case"> - <xsl:value-of select="position()"/><xsl:text>) </xsl:text> - <xsl:value-of select="@name"/> - <xsl:text> : </xsl:text> - <xsl:value-of select="child::node()/message"/> -<xsl:text disable-output-escaping='yes'>&#xD;&#xA;</xsl:text> - <xsl:if test="failure"> - <xsl:value-of select="failure/stack-trace"/> -<xsl:text> -</xsl:text> - </xsl:if> -</xsl:template> - -</xsl:stylesheet> - - - - \ No newline at end of file diff --git a/mcs/nunit20/util/UIHelper.cs b/mcs/nunit20/util/UIHelper.cs deleted file mode 100644 index 11593e3cd6f..00000000000 --- a/mcs/nunit20/util/UIHelper.cs +++ /dev/null @@ -1,98 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using NUnit.Core; - - /// - /// Summary description for UIHelper. - /// - public class UIHelper - { - private static bool AreNodesTheSame(Test testOne, Test testTwo) - { - if(testOne==null && testTwo!=null) return false; - if(testTwo==null && testOne!=null) return false; - if(testOne.GetType().FullName != testTwo.GetType().FullName) return false; - if(testOne.ShouldRun ^ testTwo.ShouldRun) return false; - return testOne.FullName.Equals(testTwo.FullName); - } - - public static bool CompareTree(Test rootTestOriginal, Test rootTestNew) - { - if(!AreNodesTheSame(rootTestOriginal,rootTestNew)) return false; - if((rootTestOriginal is TestSuite) && (rootTestNew is TestSuite)) - { - TestSuite originalSuite = (TestSuite)rootTestOriginal; - TestSuite newSuite = (TestSuite)rootTestNew; - int originalCount = originalSuite.Tests.Count; - int newCount = newSuite.Tests.Count; - if(originalCount!=newCount) - { - return false; - } - for(int i=0; i - /// UITestNode holds common info needed about a test - /// in the UI, avoiding the remoting issues associated - /// with holding an actual Test object. - /// - public class UITestNode : ITest - { - #region Instance Variables - - /// - /// The full name of the test, including the assembly and namespaces - /// - private string fullName; - - /// - /// The test name - /// - private string testName; - - /// - /// Used to distinguish tests in multiple assemblies; - /// - private int assemblyKey; - - /// - /// True if the test should be run - /// - private bool shouldRun; - - /// - /// Reason for not running the test - /// - private string ignoreReason; - - /// - /// Number of test cases in this test or suite - /// - private int testCaseCount; - - /// - /// For a test suite, the child tests or suites - /// Null if this is not a test suite - /// - private ArrayList tests; - - /// - /// True if this is a suite - /// - private bool isSuite; - - /// - /// Interface of the test suite from which this - /// object was constructed. Used for deferred - /// population of the object. - /// - private ITest testSuite; - - /// - /// The test description - /// - private string description; - - private ArrayList categories = new ArrayList(); - - private bool isExplicit; - - #endregion - - #region Construction and Conversion - - /// - /// Construct from a TestInfo interface, which might be - /// a Test or another UITestNode. Optionally, populate - /// the array of child tests. - /// - /// TestInfo interface from which a UITestNode is to be constructed - /// True if child array is to be populated - public UITestNode ( ITest test, bool populate ) - { - fullName = test.FullName; - testName = test.Name; - assemblyKey = test.AssemblyKey; - shouldRun = test.ShouldRun; - ignoreReason = test.IgnoreReason; - description = test.Description; - isExplicit = test.IsExplicit; - - if (test.Categories != null) - { - categories.AddRange(test.Categories); - } - - if ( test is UITestNode ) - testCaseCount = 0; - - if ( test.IsSuite ) - { - testCaseCount = 0; - testSuite = test; - isSuite = true; - - tests = new ArrayList(); - - if ( populate ) PopulateTests(); - } - else - { - testCaseCount = 1; - isSuite = false; - } - } - - /// - /// Default construction uses lazy population approach - /// - /// - public UITestNode ( ITest test ) : this( test, false ) { } - - public UITestNode ( string pathName, string testName ) - : this( pathName, testName, 0 ) { } - - public UITestNode ( string pathName, string testName, int assemblyKey ) - { - this.fullName = pathName + "." + testName; - this.testName = testName; - this.assemblyKey = assemblyKey; - this.shouldRun = true; - this.isSuite = false; - this.testCaseCount = 1; - } - - /// - /// Populate the arraylist of child Tests recursively. - /// If already populated, it has no effect. - /// - public void PopulateTests() - { - if ( !Populated ) - { - foreach( ITest test in testSuite.Tests ) - { - UITestNode node = new UITestNode( test, true ); - tests.Add( node ); - testCaseCount += node.CountTestCases(); - } - - testSuite = null; - } - } - - /// - /// Allow implicit conversion of a Test to a TestInfo - /// - /// - /// - public static implicit operator UITestNode( Test test ) - { - return new UITestNode( test ); - } - - #endregion - - #region Properties - - /// - /// The test description - /// - public string Description - { - get { return description; } - set { description = value; } - } - - /// - /// The reason for ignoring a test - /// - public string IgnoreReason - { - get { return ignoreReason; } - set { ignoreReason = value; } - } - - /// - /// True if the test should be run - /// - public bool ShouldRun - { - get { return shouldRun; } - set { shouldRun = value; } - } - - /// - /// Full name of the test - /// - public string FullName - { - get { return fullName; } - } - - /// - /// Name of the test - /// - public string Name - { - get { return testName; } - } - - /// - /// Identifier for assembly containing this test - /// - public int AssemblyKey - { - get { return assemblyKey; } - set { assemblyKey = value; } - } - - public string UniqueName - { - get{ return string.Format( "[{0}]{1}", assemblyKey, fullName ); } - } - - /// - /// If the name is a path, this just returns the file part - /// - public string ShortName - { - get - { - string name = Name; - int val = name.LastIndexOf("\\"); - if(val != -1) - name = name.Substring(val+1); - return name; - } - } - - public bool IsExplicit - { - get { return isExplicit; } - set { isExplicit = value; } - } - - public IList Categories - { - get { return categories; } - } - - public bool HasCategory( string name ) - { - return categories != null && categories.Contains( name ); - } - - public bool HasCategory( IList names ) - { - if ( categories == null ) - return false; - - foreach( string name in names ) - if ( categories.Contains( name ) ) - return true; - - return false; - } - - /// - /// Count of test cases in this test. If the suite - /// has never been populated, it will be done now. - /// - public int CountTestCases() - { - if ( !Populated ) - PopulateTests(); - - return testCaseCount; - } - - /// - /// Array of child tests, null if this is a test case. - /// The array is populated on access if necessary. - /// - public ArrayList Tests - { - get - { - if ( !Populated ) - PopulateTests(); - - return tests; - } - } - - /// - /// True if this is a suite, false if a test case - /// - public bool IsSuite - { - get { return isSuite; } - } - - /// - /// True if this is a test case, false if a suite - /// - public bool IsTestCase - { - get { return !isSuite; } - } - - /// - /// True if this is a fixture. May populate the test's - /// children as a side effect. - /// TODO: An easier way to tell this? - /// - public bool IsFixture - { - get - { - // A test case is obviously not a fixture - if ( IsTestCase ) return false; - - // We have no way of constructing an empty suite unless it's a fixture - if ( Tests.Count == 0 ) return true; - - // Any suite with children is a fixture if the children are test cases - UITestNode firstChild = (UITestNode)Tests[0]; - return !firstChild.IsSuite; - } - } - - /// - /// False for suites that have not yet been populated - /// with their children, otherwise true - used for testing. - /// - public bool Populated - { - get { return testSuite == null; } - } - - public TestResult Run( EventListener listener ) - { - throw new InvalidOperationException( "Cannot use Run on a local copy of Test data" ); - } - - #endregion - } -} diff --git a/mcs/nunit20/util/UserSettings.cs b/mcs/nunit20/util/UserSettings.cs deleted file mode 100644 index 0f0a8c68b35..00000000000 --- a/mcs/nunit20/util/UserSettings.cs +++ /dev/null @@ -1,69 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Drawing; - -namespace NUnit.Util -{ - /// - /// UserSettings represents the main group of per-user - /// settings used by NUnit. - /// - public class UserSettings : SettingsGroup - { - private UserSettings() - : base( "UserSettings", GetStorageImpl( ) ) { } - - public static SettingsStorage GetStorageImpl() - { - return new RegistrySettingsStorage( NUnitRegistry.CurrentUser ); - } - - public static SettingsStorage GetStorageImpl( string name ) - { - return new RegistrySettingsStorage( name, NUnitRegistry.CurrentUser ); - } - - public static OptionSettings Options - { - get { return new OptionSettings( GetStorageImpl( "Options" ) ); } - } - - public static FormSettings Form - { - get { return new FormSettings( GetStorageImpl( "Form" ) ); } - } - - public static RecentProjectSettings RecentProjects - { - get { return new RecentProjectSettings( GetStorageImpl( "Recent-Projects" ) ); } - } - } -} diff --git a/mcs/nunit20/util/VSProject.cs b/mcs/nunit20/util/VSProject.cs deleted file mode 100644 index f5a3c1cddeb..00000000000 --- a/mcs/nunit20/util/VSProject.cs +++ /dev/null @@ -1,228 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.IO; -using System.Xml; - -namespace NUnit.Util -{ - /// - /// This class allows loading information about - /// configurations and assemblies in a Visual - /// Studio project file and inspecting them. - /// Only the most common project types are - /// supported and an exception is thrown if - /// an attempt is made to load an invalid - /// file or one of an unknown type. - /// - public class VSProject - { - #region Static and Instance Variables - - /// - /// VS Project extentions - /// - private static readonly string[] validExtensions = { ".csproj", ".vbproj", ".vjsproj", ".vcproj" }; - - /// - /// VS Solution extension - /// - private static readonly string solutionExtension = ".sln"; - - /// - /// Path to the file storing this project - /// - private string projectPath; - - /// - /// Collection of configs for the project - /// - private VSProjectConfigCollection configs; - - #endregion - - #region Constructor - - public VSProject( string projectPath ) - { - this.projectPath = Path.GetFullPath( projectPath ); - configs = new VSProjectConfigCollection(); - - Load(); - } - - #endregion - - #region Properties - - /// - /// The name of the project. - /// - public string Name - { - get { return Path.GetFileNameWithoutExtension( projectPath ); } - } - - /// - /// The path to the project - /// - public string ProjectPath - { - get { return projectPath; } - } - - /// - /// Our collection of configurations - /// - public VSProjectConfigCollection Configs - { - get { return configs; } - } - - #endregion - - #region Static Methods - - public static bool IsProjectFile( string path ) - { - string extension = Path.GetExtension( path ); - - foreach( string validExtension in validExtensions ) - if ( extension == validExtension ) - return true; - - return false; - } - - public static bool IsSolutionFile( string path ) - { - return Path.GetExtension( path ) == solutionExtension; - } - - #endregion - - #region Instance Methods - - public void Load() - { - if ( !IsProjectFile( projectPath ) ) - ThrowInvalidFileType( projectPath ); - - string projectDirectory = Path.GetFullPath( Path.GetDirectoryName( projectPath ) ); - - try - { - XmlDocument doc = new XmlDocument(); - doc.Load( projectPath ); - - string extension = Path.GetExtension( projectPath ); - string assemblyName; - - switch ( extension ) - { - case ".vcproj": - foreach ( XmlNode configNode in doc.SelectNodes( "/VisualStudioProject/Configurations/Configuration" ) ) - { - string name = configNode.Attributes["Name"].Value; - string outputPath = configNode.Attributes["OutputDirectory"].Value; - string outputDirectory = Path.Combine( projectDirectory, outputPath ); - XmlNode toolNode = configNode.SelectSingleNode( "Tool[@Name='VCLinkerTool']" ); - assemblyName = Path.GetFileName( toolNode.Attributes["OutputFile"].Value ); - string assemblyPath = Path.Combine( outputDirectory, assemblyName ); - - VSProjectConfig config = new VSProjectConfig ( name ); - config.Assemblies.Add( assemblyPath ); - - this.configs.Add( config ); - } - - break; - - case ".csproj": - case ".vbproj": - case ".vjsproj": - XmlNode settingsNode = doc.SelectSingleNode( "/VisualStudioProject/*/Build/Settings" ); - - assemblyName = settingsNode.Attributes["AssemblyName"].Value; - string outputType = settingsNode.Attributes["OutputType"].Value; - - if ( outputType == "Exe" || outputType == "WinExe" ) - assemblyName = assemblyName + ".exe"; - else - assemblyName = assemblyName + ".dll"; - - XmlNodeList nodes = settingsNode.SelectNodes("Config"); - if ( nodes != null ) - foreach ( XmlNode configNode in nodes ) - { - string name = configNode.Attributes["Name"].Value; - string outputPath = configNode.Attributes["OutputPath"].Value; - string outputDirectory = Path.Combine( projectDirectory, outputPath ); - string assemblyPath = Path.Combine( outputDirectory, assemblyName ); - - VSProjectConfig config = new VSProjectConfig ( name ); - config.Assemblies.Add( assemblyPath ); - - configs.Add( config ); - } - - break; - - default: - break; - } - } - catch( FileNotFoundException ) - { - throw; - } - catch( Exception e ) - { - ThrowInvalidFormat( projectPath, e ); - } - } - - private void ThrowInvalidFileType( string projectPath ) - { - throw new ArgumentException( - string.Format( "Invalid project file type: {0}", - Path.GetFileName( projectPath ) ) ); - } - - private void ThrowInvalidFormat( string projectPath, Exception e ) - { - throw new ArgumentException( - string.Format( "Invalid project file format: {0}", - Path.GetFileName( projectPath ) ), e ); - } - - #endregion - } -} diff --git a/mcs/nunit20/util/VSProjectConfig.cs b/mcs/nunit20/util/VSProjectConfig.cs deleted file mode 100644 index 0ca24070259..00000000000 --- a/mcs/nunit20/util/VSProjectConfig.cs +++ /dev/null @@ -1,62 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Collections.Specialized; - -namespace NUnit.Util -{ - /// - /// Originally, we used the same ProjectConfig class for both - /// NUnit and Visual Studio projects. Since we really do very - /// little with VS Projects, this class has been created to - /// hold the name and the collection of assembly paths. - /// - public class VSProjectConfig - { - private string name; - - private StringCollection assemblies = new StringCollection(); - - public VSProjectConfig( string name ) - { - this.name = name; - } - - public string Name - { - get { return name; } - } - - public StringCollection Assemblies - { - get { return assemblies; } - } - } -} diff --git a/mcs/nunit20/util/VSProjectConfigCollection.cs b/mcs/nunit20/util/VSProjectConfigCollection.cs deleted file mode 100644 index b335d617714..00000000000 --- a/mcs/nunit20/util/VSProjectConfigCollection.cs +++ /dev/null @@ -1,71 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright 2000-2002 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright 2000-2002 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -using System; -using System.Collections; - -namespace NUnit.Util -{ - /// - /// A simple collection to hold VSProjectConfigs. Originally, - /// we used the (NUnit) ProjectConfigCollection, but the - /// classes have since diverged. - /// - public class VSProjectConfigCollection : CollectionBase - { - public VSProjectConfig this[int index] - { - get { return List[index] as VSProjectConfig; } - } - - public VSProjectConfig this[string name] - { - get - { - foreach ( VSProjectConfig config in InnerList ) - if ( config.Name == name ) return config; - - return null; - } - } - - public void Add( VSProjectConfig config ) - { - List.Add( config ); - } - - public bool Contains( string name ) - { - foreach( VSProjectConfig config in InnerList ) - if ( config.Name == name ) return true; - - return false; - } - } -} diff --git a/mcs/nunit20/util/XmlResultVisitor.cs b/mcs/nunit20/util/XmlResultVisitor.cs deleted file mode 100644 index 45786a0ce5a..00000000000 --- a/mcs/nunit20/util/XmlResultVisitor.cs +++ /dev/null @@ -1,201 +0,0 @@ -#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig -/************************************************************************************ -' -' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' Copyright © 2000-2003 Philip A. Craig -' -' This software is provided 'as-is', without any express or implied warranty. In no -' event will the authors be held liable for any damages arising from the use of this -' software. -' -' Permission is granted to anyone to use this software for any purpose, including -' commercial applications, and to alter it and redistribute it freely, subject to the -' following restrictions: -' -' 1. The origin of this software must not be misrepresented; you must not claim that -' you wrote the original software. If you use this software in a product, an -' acknowledgment (see the following) in the product documentation is required. -' -' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole -' or Copyright © 2000-2003 Philip A. Craig -' -' 2. Altered source versions must be plainly marked as such, and must not be -' misrepresented as being the original software. -' -' 3. This notice may not be removed or altered from any source distribution. -' -'***********************************************************************************/ -#endregion - -namespace NUnit.Util -{ - using System; - using System.Globalization; - using System.IO; - using System.Xml; - using NUnit.Core; - - /// - /// Summary description for XmlResultVisitor. - /// - public class XmlResultVisitor : ResultVisitor - { - private XmlTextWriter xmlWriter; - private TextWriter writer; - private MemoryStream memoryStream; - - public XmlResultVisitor(string fileName, TestResult result) - { - xmlWriter = new XmlTextWriter( new StreamWriter(fileName, false, System.Text.Encoding.UTF8) ); - Initialize(result); - } - - public XmlResultVisitor( TextWriter writer, TestResult result ) - { - this.memoryStream = new MemoryStream(); - this.writer = writer; - this.xmlWriter = new XmlTextWriter( new StreamWriter( memoryStream, System.Text.Encoding.UTF8 ) ); - Initialize( result ); - } - - private void Initialize(TestResult result) - { - ResultSummarizer summaryResults = new ResultSummarizer(result); - - xmlWriter.Formatting = Formatting.Indented; - xmlWriter.WriteStartDocument(false); - xmlWriter.WriteComment("This file represents the results of running a test suite"); - - xmlWriter.WriteStartElement("test-results"); - - xmlWriter.WriteAttributeString("name", summaryResults.Name); - xmlWriter.WriteAttributeString("total", summaryResults.ResultCount.ToString()); - xmlWriter.WriteAttributeString("failures", summaryResults.Failures.ToString()); - xmlWriter.WriteAttributeString("not-run", summaryResults.TestsNotRun.ToString()); - - DateTime now = DateTime.Now; - xmlWriter.WriteAttributeString("date", now.ToShortDateString()); - xmlWriter.WriteAttributeString("time", now.ToShortTimeString()); - } - - public void Visit(TestCaseResult caseResult) - { - xmlWriter.WriteStartElement("test-case"); - xmlWriter.WriteAttributeString("name",caseResult.Name); - - if(caseResult.Description != null) - xmlWriter.WriteAttributeString("description", caseResult.Description); - - xmlWriter.WriteAttributeString("executed", caseResult.Executed.ToString()); - if(caseResult.Executed) - { - xmlWriter.WriteAttributeString("success", caseResult.IsSuccess.ToString()); - - xmlWriter.WriteAttributeString("time", caseResult.Time.ToString("#####0.000", NumberFormatInfo.InvariantInfo)); - - xmlWriter.WriteAttributeString("asserts", caseResult.AssertCount.ToString() ); - WriteCategories(caseResult); - if(caseResult.IsFailure) - { - if(caseResult.IsFailure) - xmlWriter.WriteStartElement("failure"); - else - xmlWriter.WriteStartElement("error"); - - xmlWriter.WriteStartElement("message"); - xmlWriter.WriteString( caseResult.Message ); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("stack-trace"); - if(caseResult.StackTrace != null) - xmlWriter.WriteString( StackTraceFilter.Filter( caseResult.StackTrace ) ); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteEndElement(); - } - - } - else - { - WriteCategories(caseResult); - xmlWriter.WriteStartElement("reason"); - xmlWriter.WriteStartElement("message"); - xmlWriter.WriteCData(caseResult.Message); - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndElement(); - } - - xmlWriter.WriteEndElement(); - } - - private string EncodeCData( string text ) - { - if ( text.IndexOf( "]]>" ) < 0 ) - return text; - - return text.Replace( "]]>", "]]>" ); - } - - public void WriteCategories(TestResult result) - { - if (result.Test.Categories != null && result.Test.Categories.Count > 0) - { - xmlWriter.WriteStartElement("categories"); - foreach (string category in result.Test.Categories) - { - xmlWriter.WriteStartElement("category"); - xmlWriter.WriteAttributeString("name", category); - xmlWriter.WriteEndElement(); - } - xmlWriter.WriteEndElement(); - } - } - - public void Visit(TestSuiteResult suiteResult) - { - xmlWriter.WriteStartElement("test-suite"); - xmlWriter.WriteAttributeString("name",suiteResult.Name); - if(suiteResult.Description != null) - xmlWriter.WriteAttributeString("description", suiteResult.Description); - - xmlWriter.WriteAttributeString("success", suiteResult.IsSuccess.ToString()); - xmlWriter.WriteAttributeString("time", suiteResult.Time.ToString()); - xmlWriter.WriteAttributeString("asserts", suiteResult.AssertCount.ToString() ); - - WriteCategories(suiteResult); - xmlWriter.WriteStartElement("results"); - foreach (TestResult result in suiteResult.Results) - { - result.Accept(this); - } - xmlWriter.WriteEndElement(); - - xmlWriter.WriteEndElement(); - } - - public void Write() - { - try - { - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndDocument(); - xmlWriter.Flush(); - - if ( memoryStream != null && writer != null ) - { - memoryStream.Position = 0; - using ( StreamReader rdr = new StreamReader( memoryStream ) ) - { - writer.Write( rdr.ReadToEnd() ); - } - } - - xmlWriter.Close(); - } - finally - { - //writer.Close(); - } - } - } -} diff --git a/mcs/nunit20/util/nunit.util.build b/mcs/nunit20/util/nunit.util.build deleted file mode 100755 index f7851eefc88..00000000000 --- a/mcs/nunit20/util/nunit.util.build +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/util/nunit.util.dll.J2EE.vmwcsproj b/mcs/nunit20/util/nunit.util.dll.J2EE.vmwcsproj deleted file mode 100644 index 57deb565e42..00000000000 --- a/mcs/nunit20/util/nunit.util.dll.J2EE.vmwcsproj +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/util/nunit.util.dll.csproj b/mcs/nunit20/util/nunit.util.dll.csproj deleted file mode 100755 index 012a3ba0de4..00000000000 --- a/mcs/nunit20/util/nunit.util.dll.csproj +++ /dev/null @@ -1,314 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mcs/nunit20/util/nunit.util.dll20.J2EE.csproj b/mcs/nunit20/util/nunit.util.dll20.J2EE.csproj deleted file mode 100644 index ede1e3d42c1..00000000000 --- a/mcs/nunit20/util/nunit.util.dll20.J2EE.csproj +++ /dev/null @@ -1,162 +0,0 @@ - - - bin\Release_Java20\ - TRACE;TARGET_JVM;NET_1_1;NET_2_0 - 285212672 - true - pdbonly - AnyCPU - prompt - false - false - 1 - false - - - - - 2.0 - 1.5.0_05 - 0 - - - true - bin\Debug_Java20\ - TRACE;DEBUG;TARGET_JVM;NET_1_1;NET_2_0 - 285212672 - full - AnyCPU - prompt - True - False - 1 - false - - - - - 2.0 - 1.5.0_05 - 0 - - - Debug_Java - AnyCPU - 8.0.50727 - 2.0 - {170EE6EB-1DEF-4BC6-88B7-6A90358BAA6B} - Library - Properties - NUnit.Util - nunit.util - 1.5.0_05 - 1 - 2.0 - {F6B19D50-1E2E-4e87-ADFB-10393B439DE0};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - true - full - false - bin\Debug_Java\ - TRACE;DEBUG;TARGET_JVM;NET_1_1;ONLY_1_1 - prompt - 4 - 285212672 - false - True - False - 0 - - - - - pdbonly - true - bin\Release_Java\ - TRACE;TARGET_JVM;NET_1_1;ONLY_1_1 - prompt - 4 - 285212672 - false - false - false - 0 - - - - - - False - ..\..\class\lib\J2SE.Helpers.dll - - - False - ..\..\class\lib\rt.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - - - {995DE32D-06AB-4926-97FF-565B9205D5F8} - nunit.core.dll20.J2EE - - - {ACDA29DB-62AB-4AF8-8862-B3B4FC755BBC} - nunit.framework.dll20.J2EE - - - - - - - - - - - diff --git a/mcs/nunit20/util/nunit.util.dll20.csproj b/mcs/nunit20/util/nunit.util.dll20.csproj deleted file mode 100644 index 196b27bf727..00000000000 --- a/mcs/nunit20/util/nunit.util.dll20.csproj +++ /dev/null @@ -1,231 +0,0 @@ - - - Local - 8.0.50727 - 2.0 - {61CE9CE5-943E-44D4-A381-814DC1406767} - Debug - AnyCPU - - - - - nunit.util - - - JScript - Grid - IE50 - false - Library - NUnit.Util - OnBuildSuccess - - - - - - - - - bin\Debug\ - false - 285212672 - false - - - DEBUG;TRACE;NUNIT_LEAKAGE_TEST - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - bin\Release\ - false - 285212672 - false - - - TRACE - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - - System - - - System.Data - - - System.Drawing - - - System.Windows.Forms - - - System.XML - - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3} - nunit.core.dll20 - - - {83DD7E12-A705-4DBA-9D71-09C8973D9382} - nunit.framework.dll20 - - - - - - - - - - \ No newline at end of file diff --git a/mcs/tests/ChangeLog b/mcs/tests/ChangeLog index 3647c83dca1..7161a46fe79 100644 --- a/mcs/tests/ChangeLog +++ b/mcs/tests/ChangeLog @@ -1,3 +1,12 @@ +2009-07-13 Marcus Griep + + * test-723.cs, test-724.cs: Added test for resolution of interface + members that hide parent interface definitions. + +2009-06-16 Raja R Harinath + + * Makefile (test-local): Empty out. + 2009-06-12 Jb Evain * gtest-449.cs diff --git a/mcs/tests/Makefile b/mcs/tests/Makefile index 37973b672f3..84c040e2228 100644 --- a/mcs/tests/Makefile +++ b/mcs/tests/Makefile @@ -51,8 +51,7 @@ mcs-casts.out: casts-mcs.exe test-casts: boot-casts.out mcs-casts.out cmp $^ - -test-local: casts-boot.exe + -rm -f bootstrap-cast.exe casts.cs casts-boot.exe casts-mcs.exe boot-casts.out mcs-casts.out eval.exe: eval-tests.cs @@ -88,6 +87,9 @@ endif check: run-test +test-local: + @: + run-test-local: $(TEST_ILS:.il=.dll) eval-test $(TESTER) -mode:pos -files:$(TEST_PATTERN) -compiler:$(COMPILER) -issues:known-issues-$(COMPILER_NAME) -log:$(COMPILER_NAME).log $(TOPTIONS) diff --git a/mcs/tests/gtest-137.cs b/mcs/tests/gtest-137.cs index 880f3e8ee28..29a236118d6 100644 --- a/mcs/tests/gtest-137.cs +++ b/mcs/tests/gtest-137.cs @@ -2,10 +2,22 @@ using System; class X { - static void Main () + public static int Main () { int? a = 4; int? b = -a; Console.WriteLine (b); + + int? x = 42; + uint y = 42; + + bool r = (x == y); + if (!r) + return 1; + + if (x != y) + return 2; + + return 0; } } diff --git a/mcs/tests/gtest-278-2-lib.cs b/mcs/tests/gtest-278-2-lib.cs index 35a81b1a83a..3614f024d9f 100644 --- a/mcs/tests/gtest-278-2-lib.cs +++ b/mcs/tests/gtest-278-2-lib.cs @@ -1,10 +1,19 @@ // Compiler options: -t:library +// CECIL FIXME: Every method should actually throw new ApplicationException ("Should not be called"); +// but because mcs dependency on System.Reflection it cannot be done + using System; public class C { - public class CC {} + public class CC + { + public static string Print () + { + return typeof (CC).FullName; + } + } public static string Print () { diff --git a/mcs/tests/gtest-278-3-lib.cs b/mcs/tests/gtest-278-3-lib.cs index 70c77f8cf00..552a0e3bbba 100644 --- a/mcs/tests/gtest-278-3-lib.cs +++ b/mcs/tests/gtest-278-3-lib.cs @@ -1,8 +1,28 @@ // Compiler options: -r:gtest-278-2-lib.dll -t:library using System; -using System.Runtime.CompilerServices; -[assembly: TypeForwardedTo (typeof (C))] -[assembly: TypeForwardedTo (typeof (D))] -[assembly: TypeForwardedTo (typeof (G))] +public class B +{ + public static int Test () + { + if (C.Print () != "C") + return 1; + + if (D.Print () != "D") + return 2; + + if (G.Test (5) != 5) + return 3; + + if (C.CC.Print () != "C+CC") + return 4; + + Console.WriteLine (typeof (C)); + Console.WriteLine (typeof (D)); + Console.WriteLine (typeof (G)); + Console.WriteLine (typeof (C.CC).Assembly.FullName); + + return 0; + } +} diff --git a/mcs/tests/gtest-278-4-lib.cs b/mcs/tests/gtest-278-4-lib.cs new file mode 100644 index 00000000000..cf9cd3b87e1 --- /dev/null +++ b/mcs/tests/gtest-278-4-lib.cs @@ -0,0 +1,35 @@ +// Compiler options: -t:library + +using System; + +public class C +{ + public class CC + { + public static string Print () + { + return typeof (CC).FullName; + } + } + + public static string Print () + { + return typeof (C).FullName; + } +} + +public class D +{ + public static string Print () + { + return typeof (D).FullName; + } +} + +public struct G +{ + public static T Test (T t) + { + return t; + } +} diff --git a/mcs/tests/gtest-278-5-lib.cs b/mcs/tests/gtest-278-5-lib.cs new file mode 100644 index 00000000000..78d8d1d8539 --- /dev/null +++ b/mcs/tests/gtest-278-5-lib.cs @@ -0,0 +1,8 @@ +// Compiler options: -t:library -r:gtest-278-4-lib.dll -out:gtest-278-2-lib.dll + +using System; +using System.Runtime.CompilerServices; + +[assembly: TypeForwardedTo (typeof (C))] +[assembly: TypeForwardedTo (typeof (D))] +[assembly: TypeForwardedTo (typeof (G))] diff --git a/mcs/tests/gtest-278.cs b/mcs/tests/gtest-278.cs index d6d41174d96..2cc85c93122 100644 --- a/mcs/tests/gtest-278.cs +++ b/mcs/tests/gtest-278.cs @@ -2,19 +2,10 @@ using System; -class B +class Program { public static int Main () { - if (C.Print () != "C") - return 1; - - if (D.Print () != "D") - return 2; - - if (G.Test (5) != 5) - return 3; - - return 0; + return B.Test (); } } diff --git a/mcs/tests/gtest-448.cs b/mcs/tests/gtest-448.cs index fe39c1204e5..cd24648ff35 100644 --- a/mcs/tests/gtest-448.cs +++ b/mcs/tests/gtest-448.cs @@ -44,13 +44,12 @@ public class C info = typeof (C).GetMethod ("TestC").GetParameters (); -/* RUNTIME BUG #512330 if (info[0].DefaultValue.GetType () != typeof (decimal)) return 21; - if ((int) info[0].DefaultValue != decimal.MaxValue) + if ((decimal) info[0].DefaultValue != decimal.MaxValue) return 22; -*/ + if (!info[0].IsOptional) return 23; diff --git a/mcs/tests/gtest-451-lib.cs b/mcs/tests/gtest-451-lib.cs new file mode 100644 index 00000000000..d7e4dd6ebb6 --- /dev/null +++ b/mcs/tests/gtest-451-lib.cs @@ -0,0 +1,39 @@ +// Compiler options: -t:library -langversion:future + +public struct S +{ +} + +public class B +{ + public static string TestString (string s = "mono") + { + return s; + } + + public static B TestB (B b = null) + { + return b; + } + + public static T Test (T t = default (T)) + { + return t; + } + + public static S TestNew (S s = new S ()) + { + return s; + } + + public static decimal TestDecimal (int i, decimal d = decimal.MinValue) + { + return d; + } + + char ch; + public char this [int id, char v = 'h'] { + get { return v; } + set { ch = value; } + } +} diff --git a/mcs/tests/gtest-451.cs b/mcs/tests/gtest-451.cs new file mode 100644 index 00000000000..5fd951737fe --- /dev/null +++ b/mcs/tests/gtest-451.cs @@ -0,0 +1,46 @@ +// Compiler options: -r:gtest-451-lib.dll -langversion:future + +using System; + +class C +{ + static int Test (int i = 1, string s = "", bool b = false, ushort u = 4) + { + return i; + } + + public static int Main () + { + if (Test () != 1) + return 1; + + if (B.TestString () != "mono") + return 3; + + if (B.TestString ("top") != "top") + return 4; + + if (B.TestB () != null) + return 5; + + if (B.Test () != 0) + return 6; + + if (B.TestDecimal (2) != decimal.MinValue) + return 7; + + if (B.TestDecimal (2, 5) != 5) + return 8; + + B b = new B (); + b [1] = 'z'; + if (b [0] != 'h') + return 9; + + B.TestNew (); + + Console.WriteLine ("ok"); + + return 0; + } +} diff --git a/mcs/tests/gtest-452.cs b/mcs/tests/gtest-452.cs new file mode 100644 index 00000000000..192277cea08 --- /dev/null +++ b/mcs/tests/gtest-452.cs @@ -0,0 +1,53 @@ +// Compiler options: -langversion:future + +using System; + +struct S +{ +} + +public class C +{ + static void Foo (T t, T u = default (T)) + { + } + + static void TestParams (params int[] i) + { + throw new ApplicationException (); + } + + static void TestParams (int i = 4) + { + } + + static void TestStruct (S? s = new S ()) + { + } + + public string this [int i, string s = "test"] { + get { return s; } + set { value = s; } + } + + public static int Main () + { + Foo ("f"); + Foo (2); + Foo (2, 4); + Foo (2); + Foo ("2", "3"); + + TestParams (); + + TestStruct (); + + C c = new C (); + if (c [1] != "test") + return 1; + + c [3] = "value"; + + return 0; + } +} diff --git a/mcs/tests/gtest-etree-01.cs b/mcs/tests/gtest-etree-01.cs index 978cf81bccd..221132d47f7 100644 --- a/mcs/tests/gtest-etree-01.cs +++ b/mcs/tests/gtest-etree-01.cs @@ -1150,6 +1150,14 @@ class Tester Assert (false, e.Compile ().Invoke (MyEnum.Value_1)); } + void EqualTest_15 () + { + Expression> e = (a, b) => a == b; + AssertNodeType (e, ExpressionType.Equal); + Assert (false, e.Compile ().Invoke (null, 0)); + Assert (true, e.Compile ().Invoke (4, 4)); + } + void EqualTestDelegate () { Expression> e1 = (a, b) => a == b; diff --git a/mcs/tests/gtest-named-01.cs b/mcs/tests/gtest-named-01.cs new file mode 100644 index 00000000000..49b23efe9c7 --- /dev/null +++ b/mcs/tests/gtest-named-01.cs @@ -0,0 +1,45 @@ +// Compiler options: -langversion:future + +using System; + +static class C +{ + public static int Test (this int a, int b = 5, string s = "") + { + return a * 3 + b; + } + + static T Foo (T t, int a) + { + return t; + } + + static void Lambda (Func a) + { + a (6); + } + + public static int Main () + { + if (2.Test () != 11) + return 1; + + if (1.Test (b : 2) != 5) + return 2; + + if (Foo ("n", a : 4) != "n") + return 3; + + if (Foo (t : "x", a : 4) != "x") + return 4; + + Lambda (a : (a) => 1); + + // Hoisted variable + int var = 8; + Lambda (a : (a) => var); + + Console.WriteLine ("ok"); + return 0; + } +} diff --git a/mcs/tests/gtest-variance-11.cs b/mcs/tests/gtest-variance-11.cs new file mode 100644 index 00000000000..35a26094a78 --- /dev/null +++ b/mcs/tests/gtest-variance-11.cs @@ -0,0 +1,41 @@ +// Compiler options: -langversion:future + +using System; + +interface IContravariant +{ +} + +interface ICovariant +{ +} + +class D +{ + public static bool Contra (IContravariant e1, IContravariant e2) + { + Console.WriteLine (typeof (T)); + return typeof (T) == typeof (string); + } + + public static bool Covariant (ICovariant e1, ICovariant e2) + { + Console.WriteLine (typeof (T)); + return typeof (T) == typeof (object); + } + + public static int Main () + { + ICovariant a = null; + ICovariant b = null; + if (!Covariant (a, b)) + return 1; + + IContravariant a_1 = null; + IContravariant b_1 = null; + if (!Contra (a_1, b_1)) + return 2; + + return 0; + } +} diff --git a/mcs/tests/gtest-variance-12.cs b/mcs/tests/gtest-variance-12.cs new file mode 100644 index 00000000000..bf5a32f2e91 --- /dev/null +++ b/mcs/tests/gtest-variance-12.cs @@ -0,0 +1,26 @@ +// Compiler options: -langversion:future + +using System; + +delegate void D (); + +interface I +{ + event D field; +} + +class D : I +{ + public event D field; + + public static int Main () + { + D dd = () => {}; + + D d = new D (); + d.field += dd; + d.field (); + + return 0; + } +} diff --git a/mcs/tests/gtest-variance-13.cs b/mcs/tests/gtest-variance-13.cs new file mode 100644 index 00000000000..9aaf3757378 --- /dev/null +++ b/mcs/tests/gtest-variance-13.cs @@ -0,0 +1,40 @@ +// Compiler options: -langversion:future + +using System; +using System.Collections.Generic; + +interface I +{ +} + +class A +{ + static void Foo (T a, IList c) + { + } + + public static void Test () + { + Foo ("aaaa", new object[0]); + } +} + +class B +{ + static void Foo (T a, I c) + { + } + + static void Test (U u, I x) + { + Foo (u, x); + } +} + +class M +{ + public static int Main () + { + return 0; + } +} diff --git a/mcs/tests/known-issues-gmcs b/mcs/tests/known-issues-gmcs index 542234eaac7..e83bd223ec0 100644 --- a/mcs/tests/known-issues-gmcs +++ b/mcs/tests/known-issues-gmcs @@ -19,5 +19,8 @@ gtest-variance-4.cs gtest-variance-5.cs IGNORE gtest-variance-8.cs gtest-variance-10.cs +gtest-variance-12.cs +test-416.cs bug #504085 +test-418.cs bug #504085 test-704.cs IGNORE #472845 diff --git a/mcs/tests/test-251.cs b/mcs/tests/test-251.cs index 588cca9f2ac..156de30c80f 100644 --- a/mcs/tests/test-251.cs +++ b/mcs/tests/test-251.cs @@ -1,6 +1,9 @@ // // Tests the valid value types for volatile fields. // + +using System; + interface R { } @@ -21,6 +24,8 @@ class X { volatile X x; volatile R r; volatile XX dd; + volatile IntPtr ip; + volatile UIntPtr uip; static void Main () {} } diff --git a/mcs/tests/test-722.cs b/mcs/tests/test-722.cs new file mode 100644 index 00000000000..182c78fe30c --- /dev/null +++ b/mcs/tests/test-722.cs @@ -0,0 +1,27 @@ +// Compiler options: -langversion:future + +using System; + +public class Blah +{ + public delegate int MyDelegate (int i, int j = 7); + + public int Foo (int i, int j) + { + return i+j; + } + + public static int Main () + { + Blah i = new Blah (); + MyDelegate del = new MyDelegate (i.Foo); + + int number = del (2); + + Console.WriteLine (number); + if (number != 9) + return 1; + + return 0; + } +} diff --git a/mcs/tests/test-723.cs b/mcs/tests/test-723.cs new file mode 100644 index 00000000000..120716325cb --- /dev/null +++ b/mcs/tests/test-723.cs @@ -0,0 +1,34 @@ +interface ICollectionValue +{ + int Count { get; } +} + +interface ISCGCollection +{ + int Count { get; } +} + +interface ICollection : ISCGCollection, ICollectionValue +{ + new int Count { get; } +} + +interface ISequenced : ICollection +{ +} + +class Test : ISequenced +{ + public int Count { get { return 0; } } +} + +static class Maine +{ + public static int Main () + { + ISequenced t = new Test (); + if (t.Count != 0) + return 1; + return 0; + } +} diff --git a/mcs/tests/test-724.cs b/mcs/tests/test-724.cs new file mode 100644 index 00000000000..d4ca16add96 --- /dev/null +++ b/mcs/tests/test-724.cs @@ -0,0 +1,46 @@ +public class Test +{ + private static int DoTest (string type, string expected, string actual, int failcode) + { + if (!actual.Equals (expected)) { + System.Console.WriteLine ("Bad {0}: Expected {1}, Was {2}", + type, expected, actual); + return failcode; + } + return 0; + } + + public static int Main () + { + int failure = 0; + Concrete val = new Concrete (); + + failure |= DoTest ("A", "A", ((A) val).Spec, 0x01); + failure |= DoTest ("B", "B", ((B) val).Spec, 0x02); + failure |= DoTest ("C", "B", ((C) val).Spec, 0x04); + failure |= DoTest ("Concrete", "Concrete", val.Spec, 0x08); + + return failure; + } +} + +interface A +{ + string Spec { get; } +} + +interface B : A +{ + new string Spec { get; } +} + +interface C : B +{ +} + +class Concrete : C +{ + string A.Spec { get { return "A"; } } + string B.Spec { get { return "B"; } } + public string Spec { get { return "Concrete"; } } +} diff --git a/mcs/tests/test-named-01.cs b/mcs/tests/test-named-01.cs new file mode 100644 index 00000000000..44484610a0b --- /dev/null +++ b/mcs/tests/test-named-01.cs @@ -0,0 +1,65 @@ +// Compiler options: -langversion:future + +using System; + +class A +{ + public int Index; + + public A () + : this (x : 0) + { + } + + protected A (object x) + { + } + + public virtual int this [int i] { + set { + Index = value; + } + } +} + +class B : A +{ + public B () + : base (x : "x") + { + } + + public override int this [int i] { + set { + base [i : i] = value + 4; + } + } +} + +class XAttribute:Attribute +{ + public XAttribute (int h) + { + } +} + +[X (h : 3)] +class M +{ + static void Foo (int a) + { + } + + public static int Main () + { + Foo (a : -9); + + B b = new B (); + b [8] = 5; + if (b.Index != 9) + return 1; + + Console.WriteLine ("ok"); + return 0; + } +} \ No newline at end of file diff --git a/mcs/tests/test-named-02.cs b/mcs/tests/test-named-02.cs new file mode 100644 index 00000000000..346ebe7b1f0 --- /dev/null +++ b/mcs/tests/test-named-02.cs @@ -0,0 +1,87 @@ +// Compiler options: -langversion:future + +using System; + +class A +{ + public int id; + + public int this [int i] { + set { Console.WriteLine ("set= " + i); id = value; } + get { Console.WriteLine ("get= " + i); return id; } + } +} + +struct MyPoint +{ + public MyPoint (int x, int y) + { + X = x; + Y = y; + } + + public int X, Y; +} + +class C +{ + static decimal Foo (decimal t, decimal a) + { + return a; + } + + static string Bar (int a = 1, string s = "2", char c = '3') + { + return a.ToString () + s + c; + } + + static int Test (int a, int b) + { + Console.WriteLine ("{0} {1}", a, b); + return a * 3 + b * 7; + } + + public static int Main () + { + int h; + if (Foo (a : h = 9, t : 3) != 9) + return 1; + + if (h != 9) + return 2; + + if (Bar (a : 1, s : "x", c : '2') != "1x2") + return 3; + + if (Bar (s : "x") != "1x3") + return 4; + + int i = 1; + if (Test (a: i++, b: i++) != 17) + return 5; + + if (i != 3) + return 6; + + i = 1; + if (Test (b: i++, a: i++) != 13) + return 7; + + A a = new A (); + i = 5; + a [i:i++]++; + + if (a.id != 1) + return 8; + + if (i != 6) + return 9; + + MyPoint mp = new MyPoint (y : -1, x : 5); + if (mp.Y != -1) + return 10; + + Console.WriteLine ("ok"); + return 0; + } +} \ No newline at end of file diff --git a/mcs/tests/test-named-03.cs b/mcs/tests/test-named-03.cs new file mode 100644 index 00000000000..441b76b487d --- /dev/null +++ b/mcs/tests/test-named-03.cs @@ -0,0 +1,21 @@ +// Compiler options: -langversion:future + +using System; + +class C +{ + delegate int IntDelegate (int a); + + static int TestInt (int u) + { + return 29; + } + + public static int Main () + { + var del = new IntDelegate (TestInt); + del (a : 7); + + return 0; + } +} \ No newline at end of file diff --git a/mcs/tests/test-partial-25.cs b/mcs/tests/test-partial-25.cs new file mode 100644 index 00000000000..b9046692f09 --- /dev/null +++ b/mcs/tests/test-partial-25.cs @@ -0,0 +1,20 @@ +// Compiler options: -langversion:future + +using System; + +partial class C +{ + static partial void Partial (int i = 8); + + static partial void Partial (int i) + { + if (i != 8) + throw new ApplicationException (); + } + + public static int Main () + { + Partial (); + return 0; + } +} \ No newline at end of file diff --git a/mcs/tests/ver-il-gmcs.xml b/mcs/tests/ver-il-gmcs.xml index 5021b8e5b4f..f370b937d3e 100644 --- a/mcs/tests/ver-il-gmcs.xml +++ b/mcs/tests/ver-il-gmcs.xml @@ -3718,8 +3718,8 @@ 7 - - 56 + + 134 @@ -7675,12 +7675,12 @@ - + 7 - 60 + 6 @@ -11571,7 +11571,68 @@ 1 - 242 + 309 + + + + + + + 7 + + + 59 + + + + + + + 7 + + + 59 + + + + + + + 7 + + + 2 + + + 232 + + + + + + + 7 + + + 1 + + + 6 + + + 1 + + + 2 + + + 4 + + + 123 + + + 1 @@ -15705,6 +15766,11 @@ 7 + + + 159 + + @@ -19041,6 +19107,33 @@ + + + + 6 + + + 2 + + + 9 + + + 173 + + + 2 + + + + + 7 + + + 7 + + + @@ -19051,6 +19144,54 @@ + + + + 7 + + + 38 + + + 38 + + + 38 + + + + + + + 7 + + + 1 + + + 17 + + + + + 7 + + + 1 + + + 8 + + + + + 7 + + + 2 + + + @@ -28938,24 +29079,6 @@ - - - - 7 - - - 20 - - - - - 7 - - - 4 - - - @@ -28975,26 +29098,6 @@ - - - - 12 - - - 133 - - - - - 14 - - - - - 7 - - - @@ -34890,31 +34993,6 @@ - - - - 7 - - - 7 - - - 73 - - - 73 - - - 73 - - - 73 - - - 472 - - - @@ -35768,6 +35846,75 @@ + + + + 7 + + + 4 + + + 46 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + 7 + + + 2 + + + + + 21 + + + + + + + 7 + + + 29 + + + 110 + + + + + 7 + + + 6 + + + 6 + + + 6 + + + @@ -41670,6 +41817,105 @@ + + + + 13 + + + 7 + + + 8 + + + + + 12 + + + 11 + + + + + 7 + + + + + 7 + + + 1 + + + 48 + + + + + + + 7 + + + 29 + + + 28 + + + + + 15 + + + + + 7 + + + 2 + + + 20 + + + 30 + + + 279 + + + + + + + 7 + + + 3 + + + 23 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + @@ -42314,6 +42560,19 @@ + + + + 7 + + + 14 + + + 8 + + + diff --git a/mcs/tools/ChangeLog b/mcs/tools/ChangeLog index 482dbf659d4..31cd67c8c77 100644 --- a/mcs/tools/ChangeLog +++ b/mcs/tools/ChangeLog @@ -1,3 +1,7 @@ +2009-07-02 Jb Evain + + * Makefile: build the linker and the tuner in the net_2_0 profile. + 2009-04-23 Jb Evain * Makefile: add pdb2mdb to the build. diff --git a/mcs/tools/Makefile b/mcs/tools/Makefile index bd9c6759597..46d74dca1f7 100644 --- a/mcs/tools/Makefile +++ b/mcs/tools/Makefile @@ -14,8 +14,6 @@ net_1_1_dirs := \ browsercaps-updater \ monop \ gacutil \ - linker \ - tuner \ cil-strip \ resgen \ macpack \ @@ -34,6 +32,8 @@ net_1_1_dirs := \ net_2_0_dirs := \ al \ corcompare \ + linker \ + tuner \ csharplib \ csharp \ mono-xsd \ diff --git a/mcs/tools/browsercaps-updater/BrowserCapsUpdater.cs b/mcs/tools/browsercaps-updater/BrowserCapsUpdater.cs index 843bfe2232e..98bed6b94ad 100644 --- a/mcs/tools/browsercaps-updater/BrowserCapsUpdater.cs +++ b/mcs/tools/browsercaps-updater/BrowserCapsUpdater.cs @@ -48,7 +48,7 @@ namespace Mono.ASPNET Console.WriteLine ("WARNING: your site may be blocked from updating if you abuse."); Console.WriteLine ("You're encouraged to browse and understand " + - "http://www.GaryKeith.com/browsers"); + "http://browsers.GaryKeith.com/"); string r = "NO"; while (r != "YES") { @@ -79,8 +79,8 @@ namespace Mono.ASPNET class Updater { - static string VersionUrl = "http://www.garykeith.com/browsers/version.asp"; - static string BrowscapUrl = "http://www.garykeith.com/browsers/stream.asp?BrowsCapINI"; + static string VersionUrl = "http://browsers.garykeith.com/version-number.asp"; + static string BrowscapUrl = "http://browsers.garykeith.com/stream.asp?BrowsCapINI"; static string UserAgent = "Mono Browser Capabilities Updater 0.1"; string filename; diff --git a/mcs/tools/csharplib/ChangeLog b/mcs/tools/csharplib/ChangeLog index b87493f2063..800178b1fac 100644 --- a/mcs/tools/csharplib/ChangeLog +++ b/mcs/tools/csharplib/ChangeLog @@ -1,3 +1,7 @@ +2009-07-02 Jb Evain + + * Makefile: adjust to the linker build change. + 2008-10-09 Daniel Nauck * link.xml: follow up r114301 and rename csharplib diff --git a/mcs/tools/csharplib/Makefile b/mcs/tools/csharplib/Makefile index aa12a855bdb..47d751b166f 100644 --- a/mcs/tools/csharplib/Makefile +++ b/mcs/tools/csharplib/Makefile @@ -2,7 +2,7 @@ thisdir = tools/csharplib SUBDIRS = include ../../build/rules.make -LINKER = $(topdir)/class/lib/net_1_1/monolinker.exe +LINKER = $(topdir)/class/lib/$(PROFILE)/monolinker.exe LOCAL_MCS_FLAGS = -d:GMCS_SOURCE -d:NET_1_1 -d:NET_2_0 -r:System -r:System.Xml diff --git a/mcs/tools/linker/ChangeLog b/mcs/tools/linker/ChangeLog index 11d57cafb70..47a3cb331db 100644 --- a/mcs/tools/linker/ChangeLog +++ b/mcs/tools/linker/ChangeLog @@ -1,3 +1,7 @@ +2009-07-02 Jb Evain + + * Makefile: fix cecil's location. + 2009-06-09 Andrés G. Aragoneses * Mono.Linker.Steps/BaseStep.cs: New virtual API needed. diff --git a/mcs/tools/linker/Makefile b/mcs/tools/linker/Makefile index 99670dc3fc3..052101e5d68 100644 --- a/mcs/tools/linker/Makefile +++ b/mcs/tools/linker/Makefile @@ -4,6 +4,8 @@ include ../../build/rules.make PROGRAM_SNK = ../../class/mono.snk +CECIL = $(topdir)/class/lib/net_1_1/Mono.Cecil.dll + RESOURCES = \ Descriptors/mscorlib.xml \ Descriptors/System.xml \ @@ -15,7 +17,7 @@ PROGRAM = $(topdir)/class/lib/$(PROFILE)/monolinker.exe $(PROGRAM): $(RESOURCES) -LOCAL_MCS_FLAGS = /r:Mono.Cecil.dll /r:System.Xml.dll -keyfile:$(PROGRAM_SNK) $(RESOURCES:%=-resource:%) +LOCAL_MCS_FLAGS = /r:$(CECIL) /r:System.Xml.dll -keyfile:$(PROGRAM_SNK) $(RESOURCES:%=-resource:%) EXTRA_DISTFILES = $(RESOURCES) diff --git a/mcs/tools/mdoc/ChangeLog b/mcs/tools/mdoc/ChangeLog index 97129b7a4a5..291d4349276 100644 --- a/mcs/tools/mdoc/ChangeLog +++ b/mcs/tools/mdoc/ChangeLog @@ -1,3 +1,15 @@ +2009-06-23 Jonathan Pryor + + * Mono.Documentation/monodocer.cs: Don't generate an exception when an + enumeration contains multiple names with the same value. + Fixes #515030. + * Test/DocTest-v1.cs: Add test for #515030. + * Test/en.expected/Mono.DocTest/Color.xml, + Test/en.expected.since/Mono.DocTest/Color.xml, + Test/html.expected/Mono.DocTest/Color.html, + Test/msxdoc-expected.importslashdoc.xml, + Test/en.expected.importslashdoc/Mono.DocTest/Color.xml: Flush. + 2009-04-18 Jonathan Pryor * Mono.Documentation/webdoc.cs: Change -o semantics to be a directory diff --git a/mcs/tools/mdoc/Mono.Documentation/monodocer.cs b/mcs/tools/mdoc/Mono.Documentation/monodocer.cs index a667e8f56c1..ffe53145b40 100644 --- a/mcs/tools/mdoc/Mono.Documentation/monodocer.cs +++ b/mcs/tools/mdoc/Mono.Documentation/monodocer.cs @@ -2269,11 +2269,14 @@ class MDocUpdater : MDocCommand private static Dictionary GetEnumerationValues (TypeDefinition type) { - return - (from f in type.Fields.Cast () - where !(f.IsRuntimeSpecialName || f.IsSpecialName) - select f) - .ToDictionary (f => Convert.ToUInt64 (f.Constant), f => f.Name); + var values = new Dictionary (); + foreach (var f in + (from f in type.Fields.Cast () + where !(f.IsRuntimeSpecialName || f.IsSpecialName) + select f)) { + values [Convert.ToUInt64 (f.Constant)] = f.Name; + } + return values; } private void MakeParameters (XmlElement root, ParameterDefinitionCollection parameters) diff --git a/mcs/tools/mdoc/Test/DocTest-v1.cs b/mcs/tools/mdoc/Test/DocTest-v1.cs index 173ace7897d..79763155be5 100644 --- a/mcs/tools/mdoc/Test/DocTest-v1.cs +++ b/mcs/tools/mdoc/Test/DocTest-v1.cs @@ -110,7 +110,9 @@ namespace Mono.DocTest { Blue, /// Insert Green summary here /// F:Mono.DocTest.Color.Green. - Green + Green, + + AnotherGreen = Green, } /// Process interface diff --git a/mcs/tools/mdoc/Test/en.expected.importslashdoc/Mono.DocTest/Color.xml b/mcs/tools/mdoc/Test/en.expected.importslashdoc/Mono.DocTest/Color.xml index 30b228fc090..7c8322d89e6 100644 --- a/mcs/tools/mdoc/Test/en.expected.importslashdoc/Mono.DocTest/Color.xml +++ b/mcs/tools/mdoc/Test/en.expected.importslashdoc/Mono.DocTest/Color.xml @@ -13,6 +13,19 @@ . + + + Field + + 0.0.0.0 + + + Mono.DocTest.Color + + + To be added. + + Field diff --git a/mcs/tools/mdoc/Test/en.expected.since/Mono.DocTest/Color.xml b/mcs/tools/mdoc/Test/en.expected.since/Mono.DocTest/Color.xml index 4dfecb872d2..6a1f914e359 100644 --- a/mcs/tools/mdoc/Test/en.expected.since/Mono.DocTest/Color.xml +++ b/mcs/tools/mdoc/Test/en.expected.since/Mono.DocTest/Color.xml @@ -13,6 +13,20 @@ To be added. + + + Field + + 0.0.0.0 + 2.0.0.0 + + + Mono.DocTest.Color + + + To be added. + + Field diff --git a/mcs/tools/mdoc/Test/en.expected/Mono.DocTest/Color.xml b/mcs/tools/mdoc/Test/en.expected/Mono.DocTest/Color.xml index c9c477fac8b..b2cb4f0440d 100644 --- a/mcs/tools/mdoc/Test/en.expected/Mono.DocTest/Color.xml +++ b/mcs/tools/mdoc/Test/en.expected/Mono.DocTest/Color.xml @@ -12,6 +12,19 @@ To be added. + + + Field + + 0.0.0.0 + + + Mono.DocTest.Color + + + To be added. + + Field diff --git a/mcs/tools/mdoc/Test/html.expected/Mono.DocTest/Color.html b/mcs/tools/mdoc/Test/html.expected/Mono.DocTest/Color.html index 9e740c6a4f0..df5931b558c 100644 --- a/mcs/tools/mdoc/Test/html.expected/Mono.DocTest/Color.html +++ b/mcs/tools/mdoc/Test/html.expected/Mono.DocTest/Color.html @@ -227,6 +227,14 @@
+ + + +
+ + + + 0 + 1 + 2+ + +
Member Name Description
+ AnotherGreen + + Documentation for this section has not yet been entered. +
Blue diff --git a/mcs/tools/mdoc/Test/msxdoc-expected.importslashdoc.xml b/mcs/tools/mdoc/Test/msxdoc-expected.importslashdoc.xml index b245908c6e1..8d6d19c1124 100644 --- a/mcs/tools/mdoc/Test/msxdoc-expected.importslashdoc.xml +++ b/mcs/tools/mdoc/Test/msxdoc-expected.importslashdoc.xml @@ -16,6 +16,9 @@ . + + To be added. + Insert Blue summary here diff --git a/mcs/tools/sqlmetal/Makefile b/mcs/tools/sqlmetal/Makefile index ca5bfecf3e6..f1556669ea8 100644 --- a/mcs/tools/sqlmetal/Makefile +++ b/mcs/tools/sqlmetal/Makefile @@ -29,7 +29,7 @@ PROGRAM = sqlmetal.exe $(PROGRAM) : Makefile $(SQLMETAL_RESOURCES) -HAS_NUNIT_TEST = yes +#HAS_NUNIT_TEST = yes include ../../build/executable.make diff --git a/mcs/tools/tuner/ChangeLog b/mcs/tools/tuner/ChangeLog index 3f74bbaa531..8b84f3cc604 100644 --- a/mcs/tools/tuner/ChangeLog +++ b/mcs/tools/tuner/ChangeLog @@ -1,3 +1,14 @@ +2009-07-02 Jb Evain + + * Makefile: fix cecil's location. + +2009-06-16 Andrés G. Aragoneses + + * Mono.Tuner/MoonlightA11yProcessor.cs: GLibSharp uses + Activator.CreateInstance for *Adapter classes, so we need to + have an exception here for these ctors (to avoid + MissingMethodExceptions). + 2009-06-10 Andrés G. Aragoneses * Mono.Tuner/MoonlightA11yDescriptorGenerator.cs: Cosmetic. diff --git a/mcs/tools/tuner/Makefile b/mcs/tools/tuner/Makefile index 63aabda21c9..f917423e01a 100644 --- a/mcs/tools/tuner/Makefile +++ b/mcs/tools/tuner/Makefile @@ -2,9 +2,10 @@ thisdir = tools/tuner SUBDIRS = include ../../build/rules.make -LINKER = $(topdir)/class/lib/net_1_1/monolinker.exe +CECIL = $(topdir)/class/lib/net_1_1/Mono.Cecil.dll +LINKER = $(topdir)/class/lib/net_2_0/monolinker.exe -LOCAL_MCS_FLAGS = -r:System.Xml.dll -r:$(LINKER) -r:Mono.Cecil.dll +LOCAL_MCS_FLAGS = -r:System.Xml.dll -r:$(LINKER) -r:$(CECIL) LIBRARY = Mono.Tuner.dll diff --git a/mcs/tools/tuner/Mono.Tuner/MoonlightA11yProcessor.cs b/mcs/tools/tuner/Mono.Tuner/MoonlightA11yProcessor.cs index 83c481e31d7..d01a9dc965a 100644 --- a/mcs/tools/tuner/Mono.Tuner/MoonlightA11yProcessor.cs +++ b/mcs/tools/tuner/Mono.Tuner/MoonlightA11yProcessor.cs @@ -65,7 +65,7 @@ namespace Mono.Tuner { if (type.IsPublic) type.IsPublic = false; - if (type.HasConstructors) + if (type.HasConstructors && !type.Name.EndsWith ("Adapter")) foreach (MethodDefinition ctor in type.Constructors) if (ctor.IsPublic) ctor.IsAssembly = true; diff --git a/mono/arch/ChangeLog b/mono/arch/ChangeLog index 2b4a92ac0ab..91704654442 100644 --- a/mono/arch/ChangeLog +++ b/mono/arch/ChangeLog @@ -1,3 +1,32 @@ +2009-07-10 Jerry Maine + + Contributed under the terms of the MIT/X11 license by + Jerry Maine . + + * amd64/amd64-codegen.h: Add marcos for coding several specific sse opcodes. + * amd64/amd64-codegen.h: Fix bugs in simd marcos. + +2009-06-24 Jerry Maine + + Contributed under the terms of the MIT/X11 license by + Jerry Maine . + + * amd64/amd64-codegen.h: Add marcos for coding several specific sse opcodes. + +2009-06-22 Zoltan Varga + + * ppc/ppc-codegen.h: Rework the naming of the load/store macros, + ldr/str now handle register sized quantities, while ldptr/stptr handle + pointer sized quantities. + +2009-06-20 Zoltan Varga + + * ppc/ppc-codegen.h: Fix the last change to avoid self-assignments inside + macros. + + * ppc/ppc-codegen.h: Add ppc_ldr/ppc_str macros to store regsize quantities. + Handle little endian host platforms in ppc_emit32. + 2009-10-06 Jerry Maine Contributed under the terms of the MIT/X11 license by diff --git a/mono/arch/amd64/amd64-codegen.h b/mono/arch/amd64/amd64-codegen.h index 87b4dc44c33..adf239249c7 100644 --- a/mono/arch/amd64/amd64-codegen.h +++ b/mono/arch/amd64/amd64-codegen.h @@ -504,6 +504,8 @@ typedef union { * SSE */ +//TODO Reorganize SSE opcode defines. + /* Two opcode SSE defines */ #define emit_sse_reg_reg_op2_size(inst,dreg,reg,op1,op2,size) do { \ @@ -515,6 +517,11 @@ typedef union { #define emit_sse_reg_reg_op2(inst,dreg,reg,op1,op2) emit_sse_reg_reg_op2_size ((inst), (dreg), (reg), (op1), (op2), 0) +#define emit_sse_reg_reg_op2_imm(inst,dreg,reg,op1,op2,imm) do { \ + emit_sse_reg_reg_op2 ((inst), (dreg), (reg), (op1), (op2)); \ + x86_imm_emit8 ((inst), (imm)); \ +} while (0) + #define emit_sse_membase_reg_op2(inst,basereg,disp,reg,op1,op2) do { \ amd64_emit_rex ((inst), 0, (reg), 0, (basereg)); \ *(inst)++ = (unsigned char)(op1); \ @@ -547,6 +554,11 @@ typedef union { #define emit_sse_reg_reg(inst,dreg,reg,op1,op2,op3) emit_sse_reg_reg_size ((inst), (dreg), (reg), (op1), (op2), (op3), 0) +#define emit_sse_reg_reg_imm(inst,dreg,reg,op1,op2,op3,imm) do { \ + emit_sse_reg_reg ((inst), (dreg), (reg), (op1), (op2), (op3)); \ + x86_imm_emit8 ((inst), (imm)); \ +} while (0) + #define emit_sse_membase_reg(inst,basereg,disp,reg,op1,op2,op3) do { \ *(inst)++ = (unsigned char)(op1); \ amd64_emit_rex ((inst), 0, (reg), 0, (basereg)); \ @@ -563,6 +575,19 @@ typedef union { amd64_membase_emit ((inst), (dreg), (basereg), (disp)); \ } while (0) +/* Four opcode SSE defines */ + +#define emit_sse_reg_reg_op4_size(inst,dreg,reg,op1,op2,op3,op4,size) do { \ + *(inst)++ = (unsigned char)(op1); \ + amd64_emit_rex ((inst), size, (dreg), 0, (reg)); \ + *(inst)++ = (unsigned char)(op2); \ + *(inst)++ = (unsigned char)(op3); \ + *(inst)++ = (unsigned char)(op4); \ + x86_reg_emit ((inst), (dreg), (reg)); \ +} while (0) + +#define emit_sse_reg_reg_op4(inst,dreg,reg,op1,op2,op3,op4) emit_sse_reg_reg_op4_size ((inst), (dreg), (reg), (op1), (op2), (op3), (op4), 0) + /* specific SSE opcode defines */ #define amd64_sse_xorpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst),(dreg),(reg), 0x66, 0x0f, 0x57) @@ -609,6 +634,313 @@ typedef union { #define amd64_sse_divsd_reg_reg(inst,dreg,reg) emit_sse_reg_reg ((inst), (dreg), (reg), 0xf2, 0x0f, 0x5e) + +#define amd64_sse_pinsrw_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm ((inst), (dreg), (reg), 0x66, 0x0f, 0xc4, (imm)) + +#define amd64_sse_pextrw_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm ((inst), (dreg), (reg), 0x66, 0x0f, 0xc5, (imm)) + + +#define amd64_sse_cvttsd2si_reg_xreg_size(inst,reg,xreg,size) emit_sse_reg_reg_size ((inst), (reg), (xreg), 0xf2, 0x0f, 0x2c, (size)) + + +#define amd64_sse_addps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x58) + +#define amd64_sse_divps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x5e) + +#define amd64_sse_mulps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x59) + +#define amd64_sse_subps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x5c) + +#define amd64_sse_maxps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x5f) + +#define amd64_sse_minps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x5d) + +#define amd64_sse_cmpps_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_op2_imm((inst), (dreg), (reg), 0x0f, 0xc2, (imm)) + +#define amd64_sse_andps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x54) + +#define amd64_sse_andnps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x55) + +#define amd64_sse_orps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x56) + +#define amd64_sse_xorps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x57) + +#define amd64_sse_sqrtps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x51) + +#define amd64_sse_rsqrtps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x52) + +#define amd64_sse_rcpps_reg_reg(inst,dreg,reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x53) + +#define amd64_sse_addsubps_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf2, 0x0f, 0xd0) + +#define amd64_sse_haddps_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf2, 0x0f, 0x7c) + +#define amd64_sse_hsubps_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf2, 0x0f, 0x7d) + +#define amd64_sse_movshdup_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf3, 0x0f, 0x16) + +#define amd64_sse_movsldup_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf3, 0x0f, 0x12) + + +#define amd64_sse_pshufhw_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm((inst), (dreg), (reg), 0xf3, 0x0f, 0x70, (imm)) + +#define amd64_sse_pshuflw_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm((inst), (dreg), (reg), 0xf2, 0x0f, 0x70, (imm)) + +#define amd64_sse_pshufd_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm((inst), (dreg), (reg), 0x66, 0x0f, 0x70, (imm)) + + +#define amd64_sse_addpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x58) + +#define amd64_sse_divpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x5e) + +#define amd64_sse_mulpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x59) + +#define amd64_sse_subpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x5c) + +#define amd64_sse_maxpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x5f) + +#define amd64_sse_minpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x5d) + +#define amd64_sse_cmppd_reg_reg_imm(inst,dreg,reg,imm) emit_sse_reg_reg_imm((inst), (dreg), (reg), 0x66, 0x0f, 0xc2, (imm)) + +#define amd64_sse_andpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x54) + +#define amd64_sse_andnpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x55) + +#define amd64_sse_orpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x56) + +#define amd64_sse_sqrtpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x51) + +#define amd64_sse_rsqrtpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x52) + +#define amd64_sse_rcppd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x53) + +#define amd64_sse_addsubpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd0) + +#define amd64_sse_haddpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x7c) + +#define amd64_sse_hsubpd_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x7d) + +#define amd64_sse_movddup_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0xf2, 0x0f, 0x12) + + +#define amd64_sse_pmovmskb_reg_reg(inst,dreg,reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd7) + + +#define amd64_sse_pand_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xdb) + +#define amd64_sse_por_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xeb) + +#define amd64_sse_pxor_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xef) + + +#define amd64_sse_paddb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xfc) + +#define amd64_sse_paddw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xfd) + +#define amd64_sse_paddd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xfe) + +#define amd64_sse_paddq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd4) + + +#define amd64_sse_psubb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf8) + +#define amd64_sse_psubw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf9) + +#define amd64_sse_psubd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xfa) + +#define amd64_sse_psubq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xfb) + + +#define amd64_sse_pmaxub_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xde) + +#define amd64_sse_pmaxuw_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3e) + +#define amd64_sse_pmaxud_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3f) + + +#define amd64_sse_pmaxsb_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3c) + +#define amd64_sse_pmaxsw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xee) + +#define amd64_sse_pmaxsd_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3d) + + +#define amd64_sse_pavgb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe0) + +#define amd64_sse_pavgw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe3) + + +#define amd64_sse_pminub_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xda) + +#define amd64_sse_pminuw_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3a) + +#define amd64_sse_pminud_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x3) + + +#define amd64_sse_pminsb_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x38) + +#define amd64_sse_pminsw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xea) + +#define amd64_sse_pminsd_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x39) + + +#define amd64_sse_pcmpeqb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x74) + +#define amd64_sse_pcmpeqw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x75) + +#define amd64_sse_pcmpeqd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x76) + +#define amd64_sse_pcmpeqq_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x29) + + +#define amd64_sse_pcmpgtb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x64) + +#define amd64_sse_pcmpgtw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x65) + +#define amd64_sse_pcmpgtd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x66) + +#define amd64_sse_pcmpgtq_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x37) + + +#define amd64_sse_psadbw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf6) + + +#define amd64_sse_punpcklbw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x60) + +#define amd64_sse_punpcklwd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x61) + +#define amd64_sse_punpckldq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x62) + +#define amd64_sse_punpcklqdq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x6c) + +#define amd64_sse_unpcklpd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x14) + +#define amd64_sse_unpcklps_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x14) + + +#define amd64_sse_punpckhbw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x68) + +#define amd64_sse_punpckhwd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x69) + +#define amd64_sse_punpckhdq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x6a) + +#define amd64_sse_punpckhqdq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x6d) + +#define amd64_sse_unpckhpd_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x15) + +#define amd64_sse_unpckhps_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x15) + + +#define amd64_sse_packsswb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x63) + +#define amd64_sse_packssdw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x6b) + +#define amd64_sse_packuswb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0x67) + +#define amd64_sse_packusdw_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x2b) + + +#define amd64_sse_paddusb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xdc) + +#define amd64_sse_psubusb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd8) + +#define amd64_sse_paddusw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xdd) + +#define amd64_sse_psubusw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd8) + + +#define amd64_sse_paddsb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xec) + +#define amd64_sse_psubsb_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe8) + +#define amd64_sse_paddsw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xed) + +#define amd64_sse_psubsw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe9) + + +#define amd64_sse_pmullw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd5) + +#define amd64_sse_pmulld_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op4((inst), (dreg), (reg), 0x66, 0x0f, 0x38, 0x40) + +#define amd64_sse_pmuludq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf4) + +#define amd64_sse_pmulhuw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe4) + +#define amd64_sse_pmulhw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe5) + + +#define amd64_sse_psrlw_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHR, (reg), 0x66, 0x0f, 0x71, (imm)) + +#define amd64_sse_psrlw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd1) + + +#define amd64_sse_psraw_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SAR, (reg), 0x66, 0x0f, 0x71, (imm)) + +#define amd64_sse_psraw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe1) + + +#define amd64_sse_psllw_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHL, (reg), 0x66, 0x0f, 0x71, (imm)) + +#define amd64_sse_psllw_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf1) + + +#define amd64_sse_psrld_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHR, (reg), 0x66, 0x0f, 0x72, (imm)) + +#define amd64_sse_psrld_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd2) + + +#define amd64_sse_psrad_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SAR, (reg), 0x66, 0x0f, 0x72, (imm)) + +#define amd64_sse_psrad_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe2) + + +#define amd64_sse_pslld_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHL, (reg), 0x66, 0x0f, 0x72, (imm)) + +#define amd64_sse_pslld_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf2) + + +#define amd64_sse_psrlq_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHR, (reg), 0x66, 0x0f, 0x73, (imm)) + +#define amd64_sse_psrlq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xd3) + + +#define amd64_sse_psraq_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SAR, (reg), 0x66, 0x0f, 0x73, (imm)) + +#define amd64_sse_psraq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xe3) + + +#define amd64_sse_psllq_reg_imm(inst, reg, imm) emit_sse_reg_reg_imm((inst), X86_SSE_SHL, (reg), 0x66, 0x0f, 0x73, (imm)) + +#define amd64_sse_psllq_reg_reg(inst, dreg, reg) emit_sse_reg_reg((inst), (dreg), (reg), 0x66, 0x0f, 0xf3) + + +#define amd64_movd_xreg_reg_size(inst,dreg,sreg,size) emit_sse_reg_reg_size((inst), (dreg), (sreg), 0x66, 0x0f, 0x6e, (size)) + +#define amd64_movd_reg_xreg_size(inst,dreg,sreg,size) emit_sse_reg_reg_size((inst), (sreg), (dreg), 0x66, 0x0f, 0x7e, (size)) + +#define amd64_movd_xreg_membase(inst,dreg,basereg,disp) emit_sse_reg_membase((inst), (dreg), (basereg), (disp), 0x66, 0x0f, 0x6e) + + +#define amd64_movlhps_reg_reg(inst,dreg,sreg) emit_sse_reg_reg_op2((inst), (dreg), (sreg), 0x0f, 0x16) + +#define amd64_movhlps_reg_reg(inst,dreg,sreg) emit_sse_reg_reg_op2((inst), (dreg), (sreg), 0x0f, 0x12) + + +#define amd64_sse_movups_membase_reg(inst, basereg, disp, reg) emit_sse_membase_reg_op2((inst), (basereg), (disp), (reg), 0x0f, 0x11) + +#define amd64_sse_movups_reg_membase(inst, dreg, basereg, disp) emit_sse_reg_membase_op2((inst), (dreg), (basereg), (disp), 0x0f, 0x10) + +#define amd64_sse_movaps_membase_reg(inst, basereg, disp, reg) emit_sse_membase_reg_op2((inst), (basereg), (disp), (reg), 0x0f, 0x29) + +#define amd64_sse_movaps_reg_membase(inst, dreg, basereg, disp) emit_sse_reg_membase_op2((inst), (dreg), (basereg), (disp), 0x0f, 0x28) + +#define amd64_sse_movaps_reg_reg(inst, dreg, reg) emit_sse_reg_reg_op2((inst), (dreg), (reg), 0x0f, 0x28) + +#define amd64_sse_movntps_reg_membase(inst, dreg, basereg, disp) emit_sse_reg_membase_op2((inst), (dreg), (basereg), (disp), 0x0f, 0x2b) + +#define amd64_sse_prefetch_reg_membase(inst, arg, basereg, disp) emit_sse_reg_membase_op2((inst), (arg), (basereg), (disp), 0x0f, 0x18) + /* Generated from x86-codegen.h */ #define amd64_breakpoint_size(inst,size) do { x86_breakpoint(inst); } while (0) diff --git a/mono/arch/ppc/ppc-codegen.h b/mono/arch/ppc/ppc-codegen.h index 08bb9e43b2f..b1d1ea62777 100644 --- a/mono/arch/ppc/ppc-codegen.h +++ b/mono/arch/ppc/ppc-codegen.h @@ -123,7 +123,7 @@ enum { PPC_TRAP_GE_UN = 16 + PPC_TRAP_EQ }; -#define ppc_emit32(c,x) do { *((guint32 *) (c)) = x; (c) = (gpointer)((guint8 *)(c) + sizeof (guint32));} while (0) +#define ppc_emit32(c,x) do { *((guint32 *) (c)) = GUINT32_TO_BE (x); (c) = (gpointer)((guint8 *)(c) + sizeof (guint32));} while (0) #define ppc_is_imm16(val) ((((val)>> 15) == 0) || (((val)>> 15) == -1)) #define ppc_is_uimm16(val) ((glong)(val) >= 0L && (glong)(val) <= 65535L) @@ -133,6 +133,62 @@ enum { ppc_ori ((c), (D), (D), (guint32)(v) & 0xffff); \ } G_STMT_END +/* Macros to load/store pointer sized quantities */ + +#if defined(__mono_ppc64__) && !defined(__mono_ilp32__) + +#define ppc_ldptr(c,D,d,A) ppc_ld ((c), (D), (d), (A)) +#define ppc_ldptr_update(c,D,d,A) ppc_ldu ((c), (D), (d), (A)) +#define ppc_ldptr_indexed(c,D,A,B) ppc_ldx ((c), (D), (A), (B)) +#define ppc_ldptr_update_indexed(c,D,A,B) ppc_ldux ((c), (D), (A), (B)) + +#define ppc_stptr(c,S,d,A) ppc_std ((c), (S), (d), (A)) +#define ppc_stptr_update(c,S,d,A) ppc_stdu ((c), (S), (d), (A)) +#define ppc_stptr_indexed(c,S,A,B) ppc_stdx ((c), (S), (A), (B)) +#define ppc_stptr_update_indexed(c,S,A,B) ppc_stdux ((c), (S), (A), (B)) + +#else + +/* Same as ppc32 */ +#define ppc_ldptr(c,D,d,A) ppc_lwz ((c), (D), (d), (A)) +#define ppc_ldptr_update(c,D,d,A) ppc_lwzu ((c), (D), (d), (A)) +#define ppc_ldptr_indexed(c,D,A,B) ppc_lwzx ((c), (D), (A), (B)) +#define ppc_ldptr_update_indexed(c,D,A,B) ppc_lwzux ((c), (D), (A), (B)) + +#define ppc_stptr(c,S,d,A) ppc_stw ((c), (S), (d), (A)) +#define ppc_stptr_update(c,S,d,A) ppc_stwu ((c), (S), (d), (A)) +#define ppc_stptr_indexed(c,S,A,B) ppc_stwx ((c), (S), (A), (B)) +#define ppc_stptr_update_indexed(c,S,A,B) ppc_stwux ((c), (S), (A), (B)) + +#endif + +/* Macros to load pointer sized immediates */ +#define ppc_load_ptr(c,D,v) ppc_load ((c),(D),(gsize)(v)) +#define ppc_load_ptr_sequence(c,D,v) ppc_load_sequence ((c),(D),(gsize)(v)) + +/* Macros to load/store regsize quantities */ + +#ifdef __mono_ppc64__ +#define ppc_ldr(c,D,d,A) ppc_ld ((c), (D), (d), (A)) +#define ppc_ldr_indexed(c,D,A,B) ppc_ldx ((c), (D), (A), (B)) +#define ppc_str(c,S,d,A) ppc_std ((c), (S), (d), (A)) +#define ppc_str_update(c,S,d,A) ppc_stdu ((c), (S), (d), (A)) +#define ppc_str_indexed(c,S,A,B) ppc_stdx ((c), (S), (A), (B)) +#define ppc_str_update_indexed(c,S,A,B) ppc_stdux ((c), (S), (A), (B)) +#else +#define ppc_ldr(c,D,d,A) ppc_lwz ((c), (D), (d), (A)) +#define ppc_ldr_indexed(c,D,A,B) ppc_lwzx ((c), (D), (A), (B)) +#define ppc_str(c,S,d,A) ppc_stw ((c), (S), (d), (A)) +#define ppc_str_update(c,S,d,A) ppc_stwu ((c), (S), (d), (A)) +#define ppc_str_indexed(c,S,A,B) ppc_stwx ((c), (S), (A), (B)) +#define ppc_str_update_indexed(c,S,A,B) ppc_stwux ((c), (S), (A), (B)) +#endif + +#define ppc_str_multiple(c,S,d,A) ppc_store_multiple_regs((c),(S),(d),(A)) +#define ppc_ldr_multiple(c,D,d,A) ppc_load_multiple_regs((c),(D),(d),(A)) + +/* PPC32 macros */ + #ifndef __mono_ppc64__ #define ppc_load_sequence(c,D,v) ppc_load32 ((c), (D), (guint32)(v)) @@ -149,16 +205,8 @@ enum { #define ppc_load_func(c,D,V) ppc_load_sequence ((c), (D), (V)) -#define ppc_load_reg(c,D,d,A) ppc_lwz ((c), (D), (d), (A)) -#define ppc_load_reg_update(c,D,d,A) ppc_lwzu ((c), (D), (d), (A)) -#define ppc_load_reg_indexed(c,D,A,B) ppc_lwzx ((c), (D), (A), (B)) -#define ppc_load_reg_update_indexed(c,D,A,B) ppc_lwzux ((c), (D), (A), (B)) #define ppc_load_multiple_regs(c,D,d,A) ppc_lmw ((c), (D), (d), (A)) -#define ppc_store_reg(c,S,d,A) ppc_stw ((c), (S), (d), (A)) -#define ppc_store_reg_update(c,S,d,A) ppc_stwu ((c), (S), (d), (A)) -#define ppc_store_reg_indexed(c,S,A,B) ppc_stwx ((c), (S), (A), (B)) -#define ppc_store_reg_update_indexed(c,S,A,B) ppc_stwux ((c), (S), (A), (B)) #define ppc_store_multiple_regs(c,S,d,A) ppc_stmw ((c), (S), (d), (A)) #define ppc_compare(c,cfrD,A,B) ppc_cmp((c), (cfrD), 0, (A), (B)) @@ -718,8 +766,8 @@ my and Ximian's copyright to this code. ;) #define PPC_LOAD_SEQUENCE_LENGTH 20 -#define ppc_is_imm32(val) (((((long)val)>> 31) == 0) || ((((long)val)>> 31) == -1)) -#define ppc_is_imm48(val) (((((long)val)>> 47) == 0) || ((((long)val)>> 47) == -1)) +#define ppc_is_imm32(val) (((((gint64)val)>> 31) == 0) || ((((gint64)val)>> 31) == -1)) +#define ppc_is_imm48(val) (((((gint64)val)>> 47) == 0) || ((((gint64)val)>> 47) == -1)) #define ppc_load48(c,D,v) G_STMT_START { \ ppc_li ((c), (D), ((gint64)(v) >> 32) & 0xffff); \ @@ -729,11 +777,11 @@ my and Ximian's copyright to this code. ;) } G_STMT_END #define ppc_load(c,D,v) G_STMT_START { \ - if (ppc_is_imm16 ((gulong)(v))) { \ + if (ppc_is_imm16 ((guint64)(v))) { \ ppc_li ((c), (D), (guint16)(guint64)(v)); \ - } else if (ppc_is_imm32 ((gulong)(v))) { \ + } else if (ppc_is_imm32 ((guint64)(v))) { \ ppc_load32 ((c), (D), (guint32)(guint64)(v)); \ - } else if (ppc_is_imm48 ((gulong)(v))) { \ + } else if (ppc_is_imm48 ((guint64)(v))) { \ ppc_load48 ((c), (D), (guint64)(v)); \ } else { \ ppc_load_sequence ((c), (D), (guint64)(v)); \ @@ -741,32 +789,24 @@ my and Ximian's copyright to this code. ;) } G_STMT_END #define ppc_load_func(c,D,v) G_STMT_START { \ - ppc_load_sequence ((c), ppc_r11, (guint64)(v)); \ - ppc_load_reg ((c), ppc_r2, 8, ppc_r11); \ - ppc_load_reg ((c), (D), 0, ppc_r11); \ + ppc_load_sequence ((c), ppc_r11, (guint64)(gsize)(v)); \ + ppc_ldptr ((c), ppc_r2, 8, ppc_r11); \ + ppc_ldptr ((c), (D), 0, ppc_r11); \ } G_STMT_END -#define ppc_load_reg(c,D,d,A) ppc_ld ((c), (D), (d), (A)) -#define ppc_load_reg_update(c,D,d,A) ppc_ldu ((c), (D), (d), (A)) -#define ppc_load_reg_indexed(c,D,A,B) ppc_ldx ((c), (D), (A), (B)) -#define ppc_load_reg_update_indexed(c,D,A,B) ppc_ldux ((c), (D), (A), (B)) #define ppc_load_multiple_regs(c,D,d,A) G_STMT_START { \ int __i, __o = (d); \ for (__i = (D); __i <= 31; ++__i) { \ - ppc_load_reg ((c), __i, __o, (A)); \ - __o += sizeof (gulong); \ + ppc_ldr ((c), __i, __o, (A)); \ + __o += sizeof (guint64); \ } \ } G_STMT_END -#define ppc_store_reg(c,S,d,A) ppc_std ((c), (S), (d), (A)) -#define ppc_store_reg_update(c,S,d,A) ppc_stdu ((c), (S), (d), (A)) -#define ppc_store_reg_indexed(c,S,A,B) ppc_stdx ((c), (S), (A), (B)) -#define ppc_store_reg_update_indexed(c,S,A,B) ppc_stdux ((c), (S), (A), (B)) #define ppc_store_multiple_regs(c,S,d,A) G_STMT_START { \ int __i, __o = (d); \ for (__i = (S); __i <= 31; ++__i) { \ - ppc_store_reg ((c), __i, __o, (A)); \ - __o += sizeof (gulong); \ + ppc_str ((c), __i, __o, (A)); \ + __o += sizeof (guint64); \ } \ } G_STMT_END diff --git a/mono/arch/s390x/ChangeLog b/mono/arch/s390x/ChangeLog index e53ab6e3093..d35967b025d 100644 --- a/mono/arch/s390x/ChangeLog +++ b/mono/arch/s390x/ChangeLog @@ -1,3 +1,7 @@ +2009-06-24 Neale Ferguson + + * s390x-codegen.h: Add some new instructions. + 2007-04-12 Neale Ferguson * tramp.c: Add MONO_TYPE_PTR case. diff --git a/mono/arch/s390x/s390x-codegen.h b/mono/arch/s390x/s390x-codegen.h index 6ae7058e655..6af46dbf240 100644 --- a/mono/arch/s390x/s390x-codegen.h +++ b/mono/arch/s390x/s390x-codegen.h @@ -659,6 +659,7 @@ typedef struct { #define s390_lam(c, r1, r2, b, d) S390_RS_1(c, 0x9a, r1, r2, b, d) #define s390_larl(c, r, o) S390_RIL_1(c, 0xc00, r, o) #define s390_lb(c, r, x, b, d) S390_RXY(c, 0xe376, r, x, b, d) +#define s390_lbr(c, r1, r2) S390_RRE(c, 0xb926, r1, r2) #define s390_lcdbr(c, r1, r2) S390_RRE(c, 0xb313, r1, r2) #define s390_lcgr(c, r1, r2) S390_RRE(c, 0xb903, r1, r2) #define s390_lcr(c, r1, r2) S390_RR(c, 0x13, r1, r2) @@ -672,6 +673,7 @@ typedef struct { #define s390_ler(c, r1, r2) S390_RR(c, 0x38, r1, r2) #define s390_ley(c, r, x, b, d) S390_RXY(c, 0xed64, r, x, b, d) #define s390_lgb(c, r, x, b, d) S390_RXY(c, 0xe377, r, x, b, d) +#define s390_lgbr(c, r1, r2) S390_RRE(c, 0xb906, r1, r2) #define s390_lg(c, r, x, b, d) S390_RXY(c, 0xe304, r, x, b, d) #define s390_lgf(c, r, x, b, d) S390_RXY(c, 0xe314, r, x, b, d) #define s390_lgfr(c, r1, r2) S390_RRE(c, 0xb914, r1, r2) @@ -679,13 +681,19 @@ typedef struct { #define s390_lghi(c, r, v) S390_RI(c, 0xa79, r, v) #define s390_lgr(c, r1, r2) S390_RRE(c, 0xb904, r1, r2) #define s390_lh(c, r, x, b, d) S390_RX(c, 0x48, r, x, b, d) +#define s390_lhr(c, r1, r2) S390_RRE(c, 0xb927, r1, r2) #define s390_lhg(c, r, x, b, d) S390_RXY(c, 0xe315, r, x, b, d) +#define s390_lghr(c, r1, r2) S390_RRE(c, 0xb907, r1, r2) #define s390_lhi(c, r, v) S390_RI(c, 0xa78, r, v) #define s390_lhy(c, r, x, b, d) S390_RXY(c, 0xe378, r, x, b, d) +#define s390_llcr(c, r1, r2) S390_RRE(c, 0xb994, r1, r2) #define s390_llgc(c, r, x, b, d) S390_RXY(c, 0xe390, r, x, b, d) +#define s390_llgcr(c, r1, r2) S390_RRE(c, 0xb984, r1, r2) #define s390_llgf(c, r, x, b, d) S390_RXY(c, 0xe316, r, x, b, d) #define s390_llgfr(c, r1, r2) S390_RRE(c, 0xb916, r1, r2) #define s390_llgh(c, r, x, b, d) S390_RXY(c, 0xe391, r, x, b, d) +#define s390_llghr(c, r1, r2) S390_RRE(c, 0xb985, r1, r2) +#define s390_llhr(c, r1, r2) S390_RRE(c, 0xb995, r1, r2) #define s390_lm(c, r1, r2, b, d) S390_RS_1(c, 0x98, r1, r2, b, d) #define s390_lmg(c, r1, r2, b, d) S390_RSY_1(c, 0xeb04, r1, r2, b, d) #define s390_lndbr(c, r1, r2) S390_RRE(c, 0xb311, r1, r2) diff --git a/mono/io-layer/ChangeLog b/mono/io-layer/ChangeLog index 51ed0eafcc0..2086a29e8a7 100644 --- a/mono/io-layer/ChangeLog +++ b/mono/io-layer/ChangeLog @@ -1,3 +1,16 @@ +2009-06-25 Gonzalo Paniagua Javier + + * sockets.c: add the error number to the message so we can figure out + when this happens. + +2009-06-25 Gonzalo Paniagua Javier + + * wait.c: add missing 'break'. + +2009-06-20 Zoltan Varga + + * atomic.h: Fix ilp32 support on ppc. + 2009-05-28 Mark Probst * collection.c (_wapi_collection_init): If pthread_create() fails, diff --git a/mono/io-layer/atomic.h b/mono/io-layer/atomic.h index c9ead6aeadf..2fd0e5e131e 100644 --- a/mono/io-layer/atomic.h +++ b/mono/io-layer/atomic.h @@ -629,7 +629,7 @@ static inline gint32 InterlockedExchange(register volatile gint32 *dest, registe #define InterlockedExchangePointer(dest,exch) (void*)InterlockedExchange((volatile gint32 *)(dest), (gint32)(exch)) #else -#ifdef __mono_ppc64__ +#if defined(__mono_ppc64__) && !defined(__mono_ilp32__) #define LDREGX "ldarx" #define STREGCXD "stdcx." #define CMPREG "cmpd" diff --git a/mono/io-layer/sockets.c b/mono/io-layer/sockets.c index a55569a3902..4bc6ad28acb 100644 --- a/mono/io-layer/sockets.c +++ b/mono/io-layer/sockets.c @@ -336,7 +336,7 @@ int _wapi_connect(guint32 fd, const struct sockaddr *serv_addr, if (ok == FALSE) { /* ECONNRESET means the socket was closed by another thread */ if (errnum != WSAECONNRESET) - g_warning ("%s: error looking up socket handle %p", __func__, handle); + g_warning ("%s: error looking up socket handle %p (error %d)", __func__, handle, errnum); } else { socket_handle->saved_error = errnum; } diff --git a/mono/io-layer/wait.c b/mono/io-layer/wait.c index 51a1758629a..db008cc1f87 100644 --- a/mono/io-layer/wait.c +++ b/mono/io-layer/wait.c @@ -627,6 +627,7 @@ guint32 WaitForMultipleObjectsEx(guint32 numobjects, gpointer *handles, #endif bogustype = TRUE; + break; } g_hash_table_insert (dups, handles[i], handles[i]); diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index 2713ebef947..ab8e9a99dd6 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,3 +1,484 @@ +2009-07-13 Mark Probst + + * sgen-gc.c: When the minor GC needs to allocate a new section, + invoke the major GC afterwards. + +2009-07-14 Bill Holmes + + * process.c (ves_icall_System_Diagnostics_Process_ShellExecuteEx_internal) : + Applying the window_style field to the SHELLEXECUTEINFO struct. + + Code is contributed under MIT/X11 license. + +2009-07-13 Mark Probst + + * sgen-gc.c: Fix the race condition in the unmanaged allocator by + locking earlier. Fix it in the managed allocator by making sure + that no thread is stopped there before the GC runs. If we do stop + a thread there, we restart it and let it run a but, until it stops + somewhere else. + + * gc-internal.h, gc.c: Function for getting the IP from a signal + context via a function registered by mini. + +2009-07-11 Zoltan Varga + + * object-internals.h (MonoIntPtr): New structure describing a boxed + IntPtr. + + * object.c (mono_runtime_invoke_array): Handle ptr arguments and + returns. Fixes #519953. + + * marshal.c (mono_marshal_get_runtime_invoke): Handle pointer returns. + +2009-07-09 Mark Probst + + * class-internals.h, generic-sharing.c: New RGCTX info type for + getting a remoting invoke with check wrapper. + +2009-07-07 Geoff Norton + + * icall-def.h: Fix the enable-minimal build. + +2009-07-07 Rodrigo Kumpera + + * object-internals.h: Add MonoReflectionDerivedType. + + * reflection.c: Implement support for PointerType. + Fixed tons of warnings. + +2009-07-07 Rodrigo Kumpera + + * object-internals.h: Add MonoReflectionByRefType. + + * reflection.c: Implement support for ByRefType. + +2009-07-07 Rodrigo Kumpera + + * icall-def.h: Add System.Reflection.Emit.DerivedType::create_unmanaged_type. + + * object-internals.h: Add MonoReflectionArrayType and + mono_reflection_create_unmanaged_type. + + * reflection.c: Implement support for ArrayType. + +2009-07-07 Rodrigo Kumpera + + * metadata-verify.c (is_valid_method_header): Parse EH block + flags correctly. + +2009-07-03 Mark Probst + + * sgen-gc.c (finish_gray_stack): Set the to_space pointer after + processing the disappearing links, and process disappearing links + in a loop until no new objects are copied. + +2009-07-03 Mark Probst + + * object.c (handle_enum): Invoke the write barrier when copying + value type instances. + + * sgen-gc.c: Register remsets for unmanaged write barriers only + when the address written to is actually on the heap. This makes + set_value() in object.c work without requiring that the result be + on the heap. + +2009-07-02 Rodrigo Kumpera + + The runtime wrappers are all bound to a given type that must + exist in the same image. For regular images we use the + type, which is required to exist for all images. + + The type can't be used for dynamic images because it + might not exist at the time the wrapper is required, so we create + a synthetic type to use instead. + + The current code works because of the 2 stage setup of MonoClass, + but once this is gone it will no longer work. + + * icall-def.h: Add ModuleBuilder::set_wrappers_type. + + * metadata-internals.h (MonoDynamicImage): Add wrappers_type. + + * object-internals.h: Export mono_image_set_wrappers_type icall + as part of the internal API. + + * marshal.c (get_wrapper_target_class): If the image is dynamic, + use MonoDynamicImage::wrappers_type instead of the type. + + reflection.c: Add mono_image_set_wrappers_type qhixh sets the dynamic + image wrappers_type to the provided value. + +2009-07-01 Rodrigo Kumpera + + * appdomain.c (deregister_reflection_info_roots): No need + to use the image lock here. + +2009-07-02 Mark Probst + + * sgen-gc.c (collect_nursery): Also scan from write-barrier roots. + +2009-06-29 Zoltan Varga + + * threads.c: Store the thread start argument in a hash table instead of + registering it as a root, as libgc doesn't support unregistering roots + under windows, leading to 'too many root sets' errors when many threads + are created. + + * gc.c (mono_gc_run_finalize): Avoid finalizing dynamic methods during + shutdown, they can still be referenced by the other dying objects. + Fixes #514506. + +2009-06-27 Gonzalo Paniagua Javier + + * socket-io.c: DontLinger does not allow LingerOptions. + +2009-06-26 Rodrigo Kumpera + + * metadata-verify.c: The spec doesn't mention that it's possible to add + custom attribute to a generic parameter. Fixed. + +2009-06-26 Rodrigo Kumpera + + * class.c (inflate_generic_type): Don't crash while trying to output a message + on why we're aborting. + +2009-06-26 Gonzalo Paniagua Javier + + * socket-io.c: DontLinger can take an int or a boolean too. + +Fri Jun 26 17:00:04 CEST 2009 Paolo Molaro + + * gc.c: check for a null argument to SuppressFinalize () and + ReRegisterForFinalize (). + +2009-06-26 Rodrigo Kumpera + + * loader.c (method_from_methodspec): Call into the verifier to check + the signature. + + * metadata-verify.c: Addmono_verifier_verify_methodspec_signature. + + * verify-internals.h: Export mono_verifier_verify_methodspec_signature as + part of the internal API. + +2009-06-25 Rodrigo Kumpera + + * metadata.c (mono_type_create_from_typespec): Call into the verifier to check + the signature. + + * metadata-verify.c: Add mono_verifier_verify_typespec_signature. + + * verify-internals.h: Export mono_verifier_verify_typespec_signature as + part of the internal API. + +2009-06-25 Rodrigo Kumpera + + * metadata.c (mono_metadata_parse_mh_full): Call into the verifier to check + the signature. + + * metadata-verify.c: Add mono_verifier_verify_standalone_signature. Fix + blob verification. + + * verify-internals.h: Export mono_verifier_verify_memberref_signature as + part of the internal API. + +2009-06-25 Rodrigo Kumpera + + * metadata-verify.c: Use is_valid_blob_object to verify blob validity + when doing basic verification. + + This check must be done since the runtime peeks into signatures in much + more places than it does decoding so it makes sense to ensure that all + pointers to blob objects are well formed. + +2009-06-25 Rodrigo Kumpera + + * metadata-verify.c (is_valid_blob_object): Add extra minsize argument. + Use proper overflow dectection. Fix usage of it. + +2009-06-25 Rodrigo Kumpera + + * loader.c (field_from_memberref): Call into the verifier to check + the signature. + + * loader.c (mono_method_get_signature_full): Same. + + * loader.c (method_from_memberref): Same. + + * metadata-verify.c: Add mono_verifier_verify_memberref_signature. + + * verify-internals.h: Export mono_verifier_verify_memberref_signature as + part of the internal API. + +2009-06-25 Mark Probst + + * threadpool.c (mono_thread_pool_add): If the domain is unloading + or unloaded, still return an AsyncResult, but don't add it to the + threadpool. + +2009-06-25 Gonzalo Paniagua Javier + + * threads.c: fix missing colon when DEBUG is defined. + +2009-06-25 Mark Probst + + * threadpool.c: Don't add new calls to a threadpool if the domain + of the call is unloading or unloaded. When dequeuing a job, null + the reference in the queue. + +2009-06-25 Mark Probst + + * sgen-gc.c (null_link_in_range): Add the dislink for the old + generation if an object was moved. + +2009-06-25 Sylvain Dupont + + * cominterop.h cominterop.c marshal.c: Added support for marshalling out + parameters of type SAFEARRAY[VARIANT]. + + * reflection.c (encode_marshal_blob): Properly generate element type + (SafeArraySubType marshal attribute option). + + Code is contributed under MIT/X11 license. + +Thu Jun 25 15:48:09 CEST 2009 Paolo Molaro + + * reflection.c: in mono_method_clear_object () really ensure all the + objects are removed. + +2009-06-24 Rodrigo Kumpera + + * loader.c (mono_method_signature): Call into the verifier to check + the method signature. + + * metadata-verify.c (verify_method_table): Move signature verification + to verify_method_table_full. + + * metadata-verify.c: Add mono_verifier_verify_method_signature. + + * verify-internals.h: Export mono_verifier_verify_method_signature as + part of the internal API. + +2009-06-24 Rodrigo Kumpera + + * loader.c (mono_method_get_header): Call into the verifier to + check the method header. + + * metadata-verify.c: Add mono_verifier_verify_method_header. + + * verify-internals.h: Export mono_verifier_verify_method_header as + part of the internal API. + +2009-06-24 Rodrigo Kumpera + + * class.c (mono_class_find_enum_basetype): Call into the verifier to + check the field signature. Replace an assert with an explicit check. + + * class.c (mono_class_setup_fields): Call into the verifier to check + the field signature. + + * metadata-verify.c: Add mono_verifier_verify_field_signature. + + * verify-internals.h: Export mono_verifier_verify_field_signature as + part of the internal API. + +2009-06-24 Rodrigo Kumpera + + * class.c (mono_class_find_enum_basetype): Simplify this function + by moving code outside of the loop and not decoding static fields. + +2009-06-24 Rodrigo Kumpera + + * metadata-verify.c (verify_typedef_table): Check the extends + token here. Move to here a flags check from verify_typedef_table_full. + +2009-06-24 Zoltan Varga + + * metadata-verify.c (is_valid_method_header): Fix a warning. + + * metadata-internals.h (MonoImage): Remove the unused + static_rgctx_invoke_wrapper_cache. + + * image.c marshal.c: Ditto. + +2009-06-23 Rodrigo Kumpera + + * image.c (do_mono_image_load): Enable table data verification. + +2009-06-23 Rodrigo Kumpera + + * metadata-verify.c (is_valid_constant): Fix nullref check. + +2009-06-23 Rodrigo Kumpera + + * metadata-verify.c (is_valid_constant): Fix string bounds check. + +2009-06-22 Mark Probst + + * sgen-gc.c: Managed allocation with pthreads TLS. + + * threads.c, threads-types.h: Functions for the JIT to tell the + runtime whether it supports the MONO_TLS opcode. + +2009-06-22 Rodrigo Kumpera + + * metadata-verify.c (verify_param_table): Fix a crash for assemblies + without methods. + +2009-06-22 Rodrigo Kumpera + + * metadata-verify.c (is_valid_constant): Fix the string length check. + Use safe overflow checking. Add decent error messages. + +2009-06-22 Rodrigo Kumpera + + * metadata-verify.c: Move remaininh blob checks to the offline + verification path. + +2009-06-22 Rodrigo Kumpera + + * metadata-verify.c: Move more blob checks to the offline verification + path. + +2009-06-22 Bill Holmes + + * object-internals.h : Adding interrupt_on_stop field. + + * threads.c (mono_thread_request_interruption) : On Windows exit the + thread if interrupt_on_stop is set. + + * socket-io.c (ves_icall_System_Net_Sockets_Socket_Accept_internal) : + Removing old interrupt logic and setting the interrupt_on_stop for the + thread when calling accept. + + * socket-io.c (ves_icall_System_Net_Sockets_Socket_Receive_internal) : + setting the interrupt_on_stop for the thread when calling accept. + + Contributed under MIT/X11 license. + +2009-06-20 Martin Baulig + + * mono-debug.h (MONO_DEBUGGER_MINOR_VERSION): Bump to 3. + +2009-06-21 Zoltan Varga + + * appdomain.c (mono_try_assembly_resolve): Don't call managed code when + running in no-exec mode. + +2009-06-19 Rodrigo Kumpera + + * metadata-verify.c (verify_method_table): Move header + checking to verify_method_table_full. + + * metata-verify.c (mono_verifier_verify_full_table_data): + Call verify_method_table_full. + +2009-06-19 Rodrigo Kumpera + + * metadata-verify.c (verify_field_table): Move signature + checking to verify_field_table_full. + + * metata-verify.c (mono_verifier_verify_full_table_data): + Call verify_field_table_full. + +2009-06-19 Rodrigo Kumpera + + * metadata-verify.c (verify_typedef_table): Move remaining + stuff to verify_typedef_table_full. + +2009-06-19 Rodrigo Kumpera + + * metadata-verify.c: Kill is_corlib from VerifyContext. + It is only used by the offline mode. + So we better remove it from the runtime path. + +2009-06-19 Rodrigo Kumpera + + * metadata-verify.c: Add new mono_verifier_verify_full_table_data + function that perform the offline metadata verification steps. + + * metadata-verify.c (verify_typedef_table): Move some checks to + verify_typedef_table_full and make it been called by new function + mono_verifier_verify_full_table_data. + + * pedump.c: Call mono_verifier_verify_full_table_data. + + * verify-internals.h: Export mono_verifier_verify_full_table_data as + part of the internal API. + +2009-06-19 Rodrigo Kumpera + + * metadata-verify.c (typedef_is_system_object): Fix System.Object + check. + + * metadata-verify.c (verify_implmap_table): Fix implmap invalid + flags bits. SupportLastError was confused as bit 7 instead of 6. + + * metadata-verify.c (verify_implmap_table): Fix import scope verification + to check against the module ref table instead of module. + + * metadata-verify.c (verify_implmap_table): Fix corlib check. + + * pedump.c: Call mono_image_load_names. + +2009-06-19 Rodrigo Kumpera + + * image.c: Extract mono_image_load_names from do_mono_image_load. + + * metadata-internals.h: Export mono_image_load_names as part of + the internal API. + +2009-06-19 Zoltan Varga + + * metadata.c (mono_metadata_cleanup): Free the generic method cache + first, as it could reference data in the other caches. + +2009-06-18 Rodrigo Kumpera + + * metadata-verify.c: Finished with method header verification. + +2009-06-18 Rodrigo Kumpera + + * metadata-verify.c: Added more header verification code. + Now only EH clauses are missing. + +2009-06-17 Zoltan Varga + + * marshal.c (get_runtime_invoke_type): Don't share primitive types + for return values. + +2009-06-16 Rodrigo Kumpera + + * metadata-verify.c: Initial method header verification. + +2009-06-16 Rodrigo Kumpera + + * metadata-verify.c (verify_import_table): The IAT contents + might end been patched by the windows DL when running with + coree enabled. + +2009-06-15 Rodrigo Kumpera + + * class.c (mono_class_from_typeref): If the enclosing type is not + found return null instead of crashing. Fixes #508487. + +2009-06-15 Atsushi Enomoto + + * normalization-tables.h : updated to the latest unicode charcter + data. + * appdomain.c : bump corlib version. + +2009-06-14 Zoltan Varga + + * class.c (mono_class_from_name): Fix support for assembly references + in the EXPORTEDTYPE table. Fixes #511704. + +2009-06-13 Geoff Norton + + * domain.c: Ensure that mono_domain_assembly_open actually opens the + assembly in the target domain. + 2009-06-12 Robert Jordan * cominterop.c (cominterop_get_ccw): Increment mspec's SizeParamIndex diff --git a/mono/metadata/appdomain.c b/mono/metadata/appdomain.c index b72096de3b5..88b699c5a69 100644 --- a/mono/metadata/appdomain.c +++ b/mono/metadata/appdomain.c @@ -72,7 +72,7 @@ * Changes which are already detected at runtime, like the addition * of icalls, do not require an increment. */ -#define MONO_CORLIB_VERSION 77 +#define MONO_CORLIB_VERSION 78 typedef struct { @@ -818,6 +818,9 @@ mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, gboolean refon MonoBoolean isrefonly; gpointer params [2]; + if (mono_runtime_get_no_exec ()) + return NULL; + g_assert (domain != NULL && fname != NULL); klass = domain->domain->mbr.obj.vtable->klass; @@ -1999,8 +2002,7 @@ deregister_reflection_info_roots (MonoDomain *domain) MonoAssembly *assembly = list->data; MonoImage *image = assembly->image; int i; - - mono_image_lock (image); /*FIXME this is a temporary fix until we change the code to loop over image->class_cache*/ + /*No need to take the image lock here since dynamic images are appdomain bound and at this point the mutator is gone.*/ if (image->dynamic && image->name_cache) g_hash_table_foreach (image->name_cache, deregister_reflection_info_roots_name_space, image); for (i = 0; i < image->module_count; ++i) { @@ -2008,7 +2010,6 @@ deregister_reflection_info_roots (MonoDomain *domain) if (module && module->dynamic && module->name_cache) g_hash_table_foreach (module->name_cache, deregister_reflection_info_roots_name_space, module); } - mono_image_unlock (image); } mono_domain_assemblies_unlock (domain); mono_loader_unlock (); diff --git a/mono/metadata/class-internals.h b/mono/metadata/class-internals.h index 57a297800b3..0bfc2b39494 100644 --- a/mono/metadata/class-internals.h +++ b/mono/metadata/class-internals.h @@ -217,7 +217,8 @@ enum { MONO_RGCTX_INFO_GENERIC_METHOD_CODE, MONO_RGCTX_INFO_CLASS_FIELD, MONO_RGCTX_INFO_METHOD_RGCTX, - MONO_RGCTX_INFO_METHOD_CONTEXT + MONO_RGCTX_INFO_METHOD_CONTEXT, + MONO_RGCTX_INFO_REMOTING_INVOKE_WITH_CHECK }; typedef struct _MonoRuntimeGenericContextOtherInfoTemplate { diff --git a/mono/metadata/class.c b/mono/metadata/class.c index 2c56a9e0d83..9b26e22c61c 100644 --- a/mono/metadata/class.c +++ b/mono/metadata/class.c @@ -121,6 +121,9 @@ mono_class_from_typeref (MonoImage *image, guint32 type_token) MonoClass *enclosing = mono_class_from_typeref (image, MONO_TOKEN_TYPE_REF | idx); GList *tmp; + if (!enclosing) + return NULL; + if (enclosing->nested_classes_inited && enclosing->ext) { /* Micro-optimization: don't scan the metadata tables if enclosing is already inited */ for (tmp = enclosing->ext->nested_classes; tmp; tmp = tmp->next) { @@ -497,9 +500,11 @@ inflate_generic_type (MonoImage *image, MonoType *type, MonoGenericContext *cont MonoGenericInst *inst = context->method_inst; if (!inst || !inst->type_argv) return NULL; - if (num >= inst->type_argc) + if (num >= inst->type_argc) { + MonoGenericParamInfo *info = mono_generic_param_info (type->data.generic_param); g_error ("MVAR %d (%s) cannot be expanded in this context with %d instantiations", - num, mono_generic_param_info (type->data.generic_param)->name, inst->type_argc); + num, info ? info->name : "", inst->type_argc); + } /* * Note that the VAR/MVAR cases are different from the rest. The other cases duplicate @type, @@ -517,9 +522,11 @@ inflate_generic_type (MonoImage *image, MonoType *type, MonoGenericContext *cont MonoGenericInst *inst = context->class_inst; if (!inst) return NULL; - if (num >= inst->type_argc) + if (num >= inst->type_argc) { + MonoGenericParamInfo *info = mono_generic_param_info (type->data.generic_param); g_error ("VAR %d (%s) cannot be expanded in this context with %d instantiations", - num, mono_generic_param_info (type->data.generic_param)->name, inst->type_argc); + num, info ? info->name : "", inst->type_argc); + } nt = mono_metadata_type_dup (image, inst->type_argv [num]); nt->byref = type->byref; nt->attrs = type->attrs; @@ -990,12 +997,22 @@ mono_method_set_generic_container (MonoMethod *method, MonoGenericContainer* con static MonoType* mono_class_find_enum_basetype (MonoClass *class) { + MonoGenericContainer *container = NULL; MonoImage *m = class->image; const int top = class->field.count; int i; g_assert (class->enumtype); + if (class->generic_container) + container = class->generic_container; + else if (class->generic_class) { + MonoClass *gklass = class->generic_class->container_class; + + container = gklass->generic_container; + g_assert (container); + } + /* * Fetch all the field information. */ @@ -1003,23 +1020,23 @@ mono_class_find_enum_basetype (MonoClass *class) const char *sig; guint32 cols [MONO_FIELD_SIZE]; int idx = class->field.first + i; - MonoGenericContainer *container = NULL; MonoType *ftype; /* class->field.first and idx points into the fieldptr table */ mono_metadata_decode_table_row (m, MONO_TABLE_FIELD, idx, cols, MONO_FIELD_SIZE); + + if (cols [MONO_FIELD_FLAGS] & FIELD_ATTRIBUTE_STATIC) //no need to decode static fields + continue; + + if (!mono_verifier_verify_field_signature (class->image, cols [MONO_FIELD_SIGNATURE], NULL)) + return NULL; + sig = mono_metadata_blob_heap (m, cols [MONO_FIELD_SIGNATURE]); mono_metadata_decode_value (sig, &sig); /* FIELD signature == 0x06 */ - g_assert (*sig == 0x06); - if (class->generic_container) - container = class->generic_container; - else if (class->generic_class) { - MonoClass *gklass = class->generic_class->container_class; + if (*sig != 0x06) + return NULL; - container = gklass->generic_container; - g_assert (container); - } ftype = mono_metadata_parse_type_full (m, container, MONO_PARSE_FIELD, cols [MONO_FIELD_FLAGS], sig + 1, &sig); if (!ftype) return NULL; @@ -1029,8 +1046,7 @@ mono_class_find_enum_basetype (MonoClass *class) ftype->attrs = cols [MONO_FIELD_FLAGS]; } - if (class->enumtype && !(cols [MONO_FIELD_FLAGS] & FIELD_ATTRIBUTE_STATIC)) - return ftype; + return ftype; } return NULL; @@ -1173,6 +1189,10 @@ mono_class_setup_fields (MonoClass *class) mono_metadata_decode_table_row (m, MONO_TABLE_FIELD, idx, cols, MONO_FIELD_SIZE); /* The name is needed for fieldrefs */ field->name = mono_metadata_string_heap (m, cols [MONO_FIELD_NAME]); + if (!mono_verifier_verify_field_signature (class->image, cols [MONO_FIELD_SIGNATURE], NULL)) { + mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL); + break; + } sig = mono_metadata_blob_heap (m, cols [MONO_FIELD_SIGNATURE]); mono_metadata_decode_value (sig, &sig); /* FIELD signature == 0x06 */ @@ -5870,20 +5890,17 @@ mono_class_from_name (MonoImage *image, const char* name_space, const char *name return return_nested_in (class, nested); return class; } else if ((impl & MONO_IMPLEMENTATION_MASK) == MONO_IMPLEMENTATION_ASSEMBLYREF) { - MonoAssembly **references = image->references; guint32 assembly_idx; assembly_idx = impl >> MONO_IMPLEMENTATION_BITS; - if (!references [assembly_idx - 1]) - mono_assembly_load_reference (image, assembly_idx - 1); - g_assert (references == image->references); - g_assert (references [assembly_idx - 1]); - if (references [assembly_idx - 1] == (gpointer)-1) + mono_assembly_load_reference (image, assembly_idx - 1); + g_assert (image->references [assembly_idx - 1]); + if (image->references [assembly_idx - 1] == (gpointer)-1) return NULL; else /* FIXME: Cycle detection */ - return mono_class_from_name (references [assembly_idx - 1]->image, name_space, name); + return mono_class_from_name (image->references [assembly_idx - 1]->image, name_space, name); } else { g_error ("not yet implemented"); } diff --git a/mono/metadata/cominterop.c b/mono/metadata/cominterop.c index ad29cfb337e..4f6d9cee472 100644 --- a/mono/metadata/cominterop.c +++ b/mono/metadata/cominterop.c @@ -125,6 +125,19 @@ cominterop_get_ccw (MonoObject* object, MonoClass* itf); static MonoObject* cominterop_get_ccw_object (MonoCCWInterface* ccw_entry, gboolean verify); +/* SAFEARRAY marshalling */ +static gboolean +mono_marshal_safearray_begin (gpointer safearray, MonoArray **result, gpointer *indices, gpointer empty); + +static gpointer +mono_marshal_safearray_get_value (gpointer safearray, gpointer indices); + +static gboolean +mono_marshal_safearray_next (gpointer safearray, gpointer indices); + +static void +mono_marshal_safearray_end (gpointer safearray, gpointer indices); + /** * cominterop_method_signature: * @method: a method @@ -491,6 +504,12 @@ mono_cominterop_init (void) register_icall (mono_string_from_bstr, "mono_string_from_bstr", "obj ptr", FALSE); register_icall (mono_free_bstr, "mono_free_bstr", "void ptr", FALSE); register_icall (cominterop_type_from_handle, "cominterop_type_from_handle", "object ptr", FALSE); + + /* SAFEARRAY marshalling */ + register_icall (mono_marshal_safearray_begin, "mono_marshal_safearray_begin", "int32 ptr ptr ptr ptr", FALSE); + register_icall (mono_marshal_safearray_get_value, "mono_marshal_safearray_get_value", "ptr ptr ptr", FALSE); + register_icall (mono_marshal_safearray_next, "mono_marshal_safearray_next", "int32 ptr ptr", FALSE); + register_icall (mono_marshal_safearray_end, "mono_marshal_safearray_end", "void ptr ptr", FALSE); } void @@ -2373,14 +2392,26 @@ cominterop_ccw_invoke (MonoCCWInterface* ccwe, guint32 dispIdMember, return MONO_E_NOTIMPL; } -typedef gpointer (*SysAllocStringLenFunc)(gunichar* str, guint32 len); -typedef guint32 (*SysStringLenFunc)(gpointer bstr); -typedef void (*SysFreeStringFunc)(gunichar* str); +typedef gpointer (STDCALL *SysAllocStringLenFunc)(gunichar* str, guint32 len); +typedef guint32 (STDCALL *SysStringLenFunc)(gpointer bstr); +typedef void (STDCALL *SysFreeStringFunc)(gunichar* str); static SysAllocStringLenFunc sys_alloc_string_len_ms = NULL; static SysStringLenFunc sys_string_len_ms = NULL; static SysFreeStringFunc sys_free_string_ms = NULL; +typedef guint32 (STDCALL *SafeArrayGetDimFunc)(gpointer psa); +typedef int (STDCALL *SafeArrayGetLBoundFunc)(gpointer psa, guint32 nDim, glong* plLbound); +typedef int (STDCALL *SafeArrayGetUBoundFunc)(gpointer psa, guint32 nDim, glong* plUbound); +typedef int (STDCALL *SafeArrayPtrOfIndexFunc)(gpointer psa, glong* rgIndices, gpointer* ppvData); +typedef int (STDCALL *SafeArrayDestroyFunc)(gpointer psa); + +static SafeArrayGetDimFunc safe_array_get_dim_ms = NULL; +static SafeArrayGetLBoundFunc safe_array_get_lbound_ms = NULL; +static SafeArrayGetUBoundFunc safe_array_get_ubound_ms = NULL; +static SafeArrayPtrOfIndexFunc safe_array_ptr_of_index_ms = NULL; +static SafeArrayDestroyFunc safe_array_destroy_ms = NULL; + static gboolean init_com_provider_ms (void) { @@ -2419,6 +2450,41 @@ init_com_provider_ms (void) return FALSE; } + error_msg = mono_dl_symbol (module, "SafeArrayGetDim", (gpointer*)&safe_array_get_dim_ms); + if (error_msg) { + g_warning ("Error loading entry point '%s' in COM support library '%s': %s", "SafeArrayGetDim", scope, error_msg); + g_assert_not_reached (); + return FALSE; + } + + error_msg = mono_dl_symbol (module, "SafeArrayGetLBound", (gpointer*)&safe_array_get_lbound_ms); + if (error_msg) { + g_warning ("Error loading entry point '%s' in COM support library '%s': %s", "SafeArrayGetLBound", scope, error_msg); + g_assert_not_reached (); + return FALSE; + } + + error_msg = mono_dl_symbol (module, "SafeArrayGetUBound", (gpointer*)&safe_array_get_ubound_ms); + if (error_msg) { + g_warning ("Error loading entry point '%s' in COM support library '%s': %s", "SafeArrayGetUBound", scope, error_msg); + g_assert_not_reached (); + return FALSE; + } + + error_msg = mono_dl_symbol (module, "SafeArrayPtrOfIndex", (gpointer*)&safe_array_ptr_of_index_ms); + if (error_msg) { + g_warning ("Error loading entry point '%s' in COM support library '%s': %s", "SafeArrayPtrOfIndex", scope, error_msg); + g_assert_not_reached (); + return FALSE; + } + + error_msg = mono_dl_symbol (module, "SafeArrayDestroy", (gpointer*)&safe_array_destroy_ms); + if (error_msg) { + g_warning ("Error loading entry point '%s' in COM support library '%s': %s", "SafeArrayDestroy", scope, error_msg); + g_assert_not_reached (); + return FALSE; + } + initialized = TRUE; return TRUE; } @@ -2504,6 +2570,301 @@ mono_free_bstr (gpointer bstr) #endif } + +/* SAFEARRAY marshalling */ +int +mono_cominterop_emit_marshal_safearray (EmitMarshalContext *m, int argnum, MonoType *t, + MonoMarshalSpec *spec, + int conv_arg, MonoType **conv_arg_type, + MarshalAction action) +{ + MonoMethodBuilder *mb = m->mb; + + mono_init_com_types (); + + switch (action) { + + case MARSHAL_ACTION_CONV_OUT: { + + if (t->byref && (t->attrs & PARAM_ATTRIBUTE_OUT || !(t->attrs & PARAM_ATTRIBUTE_IN))) { + + /* Generates IL code for the following algorithm: + + Array result; // result_var + IntPtr indices; // indices_var + int empty; // empty_var + if (mono_marshal_safearray_begin(safearray, out result, out indices, out empty)) { + if (!empty) { + int index=0; // index_var + do { // label3 + object elem = Variant.GetObjectForNativeVariant(mono_marshal_safearray_get_value(safearray, indices)); + result.SetValueImpl(elem, index); + ++index; + } + while (mono_marshal_safearray_next(safearray, indices)); + } // label2 + mono_marshal_safearray_end(safearray, indices); + } // label1 + */ + + int result_var, indices_var, empty_var, elem_var, index_var; + guint32 label1 = 0, label2 = 0, label3 = 0; + static MonoMethod *get_object_for_native_variant = NULL; + static MonoMethod *set_value_impl = NULL; + + result_var = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg); + indices_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); + empty_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); + + mono_mb_emit_ldloc (mb, conv_arg); + mono_mb_emit_ldloc_addr (mb, result_var); + mono_mb_emit_ldloc_addr (mb, indices_var); + mono_mb_emit_ldloc_addr (mb, empty_var); + mono_mb_emit_icall (mb, mono_marshal_safearray_begin); + + label1 = mono_mb_emit_short_branch (mb, CEE_BRFALSE_S); + + mono_mb_emit_ldloc (mb, empty_var); + + label2 = mono_mb_emit_short_branch (mb, CEE_BRTRUE_S); + + index_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); + mono_mb_emit_byte (mb, CEE_LDC_I4_0); + mono_mb_emit_stloc (mb, index_var); + + label3 = mono_mb_get_label (mb); + + mono_mb_emit_ldloc (mb, conv_arg); + mono_mb_emit_ldloc (mb, indices_var); + mono_mb_emit_icall (mb, mono_marshal_safearray_get_value); + + if (!get_object_for_native_variant) + get_object_for_native_variant = mono_class_get_method_from_name (mono_defaults.marshal_class, "GetObjectForNativeVariant", 1); + g_assert (get_object_for_native_variant); + + if (!set_value_impl) + set_value_impl = mono_class_get_method_from_name (mono_defaults.array_class, "SetValueImpl", 2); + g_assert (set_value_impl); + + elem_var = mono_mb_add_local (mb, &mono_defaults.object_class->byval_arg); + + mono_mb_emit_managed_call (mb, get_object_for_native_variant, NULL); + mono_mb_emit_stloc (mb, elem_var); + + mono_mb_emit_ldloc (mb, result_var); + mono_mb_emit_ldloc (mb, elem_var); + mono_mb_emit_ldloc (mb, index_var); + mono_mb_emit_managed_call (mb, set_value_impl, NULL); + + mono_mb_emit_add_to_local (mb, index_var, 1); + + mono_mb_emit_ldloc (mb, conv_arg); + mono_mb_emit_ldloc (mb, indices_var); + mono_mb_emit_icall (mb, mono_marshal_safearray_next); + mono_mb_emit_branch_label (mb, CEE_BRTRUE, label3); + + mono_mb_patch_short_branch (mb, label2); + + mono_mb_emit_ldloc (mb, conv_arg); + mono_mb_emit_ldloc (mb, indices_var); + mono_mb_emit_icall (mb, mono_marshal_safearray_end); + + mono_mb_patch_short_branch (mb, label1); + + mono_mb_emit_ldarg (mb, argnum); + mono_mb_emit_ldloc (mb, result_var); + mono_mb_emit_byte (mb, CEE_STIND_REF); + } + break; + } + + default: + g_assert_not_reached (); + } + + return conv_arg; +} + +static +guint32 mono_marshal_safearray_get_dim (gpointer safearray) +{ + guint32 result=0; +#ifdef PLATFORM_WIN32 + result = SafeArrayGetDim (safearray); +#else + if (com_provider == MONO_COM_MS && init_com_provider_ms ()) { + result = safe_array_get_dim_ms (safearray); + } else { + g_assert_not_reached (); + } +#endif + return result; +} + +static +int mono_marshal_safe_array_get_lbound (gpointer psa, guint nDim, glong* plLbound) +{ + int result=MONO_S_OK; +#ifdef PLATFORM_WIN32 + result = SafeArrayGetLBound (psa, nDim, plLbound); +#else + if (com_provider == MONO_COM_MS && init_com_provider_ms ()) { + result = safe_array_get_lbound_ms (psa, nDim, plLbound); + } else { + g_assert_not_reached (); + } +#endif + return result; +} + +static +int mono_marshal_safe_array_get_ubound (gpointer psa, guint nDim, glong* plUbound) +{ + int result=MONO_S_OK; +#ifdef PLATFORM_WIN32 + result = SafeArrayGetUBound (psa, nDim, plUbound); +#else + if (com_provider == MONO_COM_MS && init_com_provider_ms ()) { + result = safe_array_get_ubound_ms (psa, nDim, plUbound); + } else { + g_assert_not_reached (); + } +#endif + return result; +} + +static gboolean +mono_marshal_safearray_begin (gpointer safearray, MonoArray **result, gpointer *indices, gpointer empty) +{ + int dim; + mono_array_size_t *sizes; + mono_array_size_t *bounds; + MonoClass *aklass; + int i; + gboolean bounded = FALSE; + +#ifndef PLATFORM_WIN32 + // If not on windows, check that the MS provider is used as it is + // required for SAFEARRAY support. + // If SAFEARRAYs are not supported, returning FALSE from this + // function will prevent the other mono_marshal_safearray_xxx functions + // from being called. + if ((com_provider != MONO_COM_MS) || !init_com_provider_ms ()) { + return FALSE; + } +#endif + + dim = mono_marshal_safearray_get_dim (safearray); + + *indices = g_malloc (dim * sizeof(int)); + + sizes = alloca (dim * sizeof(mono_array_size_t)); + bounds = alloca (dim * sizeof(mono_array_size_t)); + + (*(int*)empty) = TRUE; + for (i=0; i=0; --i) + { + glong lbound, ubound; + + hr = mono_marshal_safe_array_get_ubound (safearray, i+1, &ubound); + if (hr < 0) { + cominterop_raise_hr_exception (hr); + } + + if (++pIndices[i] <= ubound) { + break; + } + + hr = mono_marshal_safe_array_get_lbound (safearray, i+1, &lbound); + if (hr < 0) { + cominterop_raise_hr_exception (hr); + } + + pIndices[i] = lbound; + + if (i == 0) + ret = FALSE; + } + return ret; +} + +static +void mono_marshal_safearray_end (gpointer safearray, gpointer indices) +{ + g_free(indices); +#ifdef PLATFORM_WIN32 + SafeArrayDestroy (safearray); +#else + if (com_provider == MONO_COM_MS && init_com_provider_ms ()) { + safe_array_destroy_ms (safearray); + } else { + g_assert_not_reached (); + } +#endif +} + #else /* DISABLE_COM */ void diff --git a/mono/metadata/cominterop.h b/mono/metadata/cominterop.h index 653b3dc9c87..d3da2d93f46 100644 --- a/mono/metadata/cominterop.h +++ b/mono/metadata/cominterop.h @@ -40,6 +40,13 @@ mono_cominterop_emit_marshal_com_interface (EmitMarshalContext *m, int argnum, int conv_arg, MonoType **conv_arg_type, MarshalAction action) MONO_INTERNAL; +int +mono_cominterop_emit_marshal_safearray (EmitMarshalContext *m, int argnum, + MonoType *t, + MonoMarshalSpec *spec, + int conv_arg, MonoType **conv_arg_type, + MarshalAction action) MONO_INTERNAL; + MonoString * mono_string_from_bstr (gpointer bstr); diff --git a/mono/metadata/domain.c b/mono/metadata/domain.c index 57ba9aff841..ebe13ad5568 100644 --- a/mono/metadata/domain.c +++ b/mono/metadata/domain.c @@ -1826,6 +1826,7 @@ mono_domain_foreach (MonoDomainFunc func, gpointer user_data) MonoAssembly * mono_domain_assembly_open (MonoDomain *domain, const char *name) { + MonoDomain *current; MonoAssembly *ass; GSList *tmp; @@ -1839,8 +1840,15 @@ mono_domain_assembly_open (MonoDomain *domain, const char *name) } mono_domain_assemblies_unlock (domain); - if (!(ass = mono_assembly_open (name, NULL))) - return NULL; + if (domain != mono_domain_get ()) { + current = mono_domain_get (); + + mono_domain_set (domain, FALSE); + ass = mono_assembly_open (name, NULL); + mono_domain_set (current, FALSE); + } else { + ass = mono_assembly_open (name, NULL); + } return ass; } diff --git a/mono/metadata/gc-internal.h b/mono/metadata/gc-internal.h index 56aff2938dd..c800cc7d20a 100644 --- a/mono/metadata/gc-internal.h +++ b/mono/metadata/gc-internal.h @@ -195,5 +195,11 @@ void *mono_gc_scan_object (void *obj) MONO_INTERNAL; /* Return the bitmap encoded by a descriptor */ gsize* mono_gc_get_bitmap_for_descr (void *descr, int *numbits) MONO_INTERNAL; +typedef gpointer (*MonoGetIPFromSigCtxFunc) (gpointer ctx); + +void mono_install_get_ip_from_sigctx (MonoGetIPFromSigCtxFunc func) MONO_INTERNAL; + +gpointer mono_gc_get_ip_from_sigctx (gpointer ctx) MONO_INTERNAL; + #endif /* __MONO_METADATA_GC_INTERNAL_H__ */ diff --git a/mono/metadata/gc.c b/mono/metadata/gc.c index 43b09a5eb37..ab384437d17 100644 --- a/mono/metadata/gc.c +++ b/mono/metadata/gc.c @@ -162,6 +162,17 @@ mono_gc_run_finalize (void *obj, void *data) } } + if (o->vtable->klass->image == mono_defaults.corlib && !strcmp (o->vtable->klass->name, "DynamicMethod") && finalizing_root_domain) { + /* + * These can't be finalized during unloading/shutdown, since that would + * free the native code which can still be referenced by other + * finalizers. + * FIXME: This is not perfect, objects dying at the same time as + * dynamic methods can still reference them even when !shutdown. + */ + return; + } + if (mono_runtime_get_no_exec ()) return; @@ -415,7 +426,8 @@ ves_icall_System_GC_KeepAlive (MonoObject *obj) void ves_icall_System_GC_ReRegisterForFinalize (MonoObject *obj) { - MONO_ARCH_SAVE_REGS; + if (!obj) + mono_raise_exception (mono_get_exception_argument_null ("obj")); object_register_finalizer (obj, mono_gc_run_finalize); } @@ -423,7 +435,8 @@ ves_icall_System_GC_ReRegisterForFinalize (MonoObject *obj) void ves_icall_System_GC_SuppressFinalize (MonoObject *obj) { - MONO_ARCH_SAVE_REGS; + if (!obj) + mono_raise_exception (mono_get_exception_argument_null ("obj")); /* delegates have no finalizers, but we register them to deal with the * unmanaged->managed trampoline. We don't let the user suppress it @@ -1152,4 +1165,17 @@ mono_gc_is_finalizer_thread (MonoThread *thread) return thread == gc_thread; } +static MonoGetIPFromSigCtxFunc get_ip_from_sigctx = NULL; +void +mono_install_get_ip_from_sigctx (MonoGetIPFromSigCtxFunc func) +{ + get_ip_from_sigctx = func; +} + +gpointer +mono_gc_get_ip_from_sigctx (gpointer ctx) +{ + g_assert (get_ip_from_sigctx); + return get_ip_from_sigctx (ctx); +} diff --git a/mono/metadata/generic-sharing.c b/mono/metadata/generic-sharing.c index a197f3027e6..ba26d2665a5 100644 --- a/mono/metadata/generic-sharing.c +++ b/mono/metadata/generic-sharing.c @@ -536,7 +536,8 @@ inflate_other_data (gpointer data, int info_type, MonoGenericContext *context, M case MONO_RGCTX_INFO_METHOD: case MONO_RGCTX_INFO_GENERIC_METHOD_CODE: case MONO_RGCTX_INFO_METHOD_RGCTX: - case MONO_RGCTX_INFO_METHOD_CONTEXT: { + case MONO_RGCTX_INFO_METHOD_CONTEXT: + case MONO_RGCTX_INFO_REMOTING_INVOKE_WITH_CHECK: { MonoMethod *method = data; MonoMethod *inflated_method; MonoType *inflated_type = mono_class_inflate_generic_type (&method->klass->byval_arg, context); @@ -812,6 +813,10 @@ instantiate_other_info (MonoDomain *domain, MonoRuntimeGenericContextOtherInfoTe case MONO_RGCTX_INFO_GENERIC_METHOD_CODE: return mono_create_ftnptr (mono_domain_get (), mono_runtime_create_jump_trampoline (mono_domain_get (), data, TRUE)); + case MONO_RGCTX_INFO_REMOTING_INVOKE_WITH_CHECK: + return mono_create_ftnptr (mono_domain_get (), + mono_runtime_create_jump_trampoline (mono_domain_get (), + mono_marshal_get_remoting_invoke_with_check (data), TRUE)); case MONO_RGCTX_INFO_CLASS_FIELD: return data; case MONO_RGCTX_INFO_METHOD_RGCTX: { @@ -935,6 +940,7 @@ other_info_equal (gpointer data1, gpointer data2, int info_type) case MONO_RGCTX_INFO_CLASS_FIELD: case MONO_RGCTX_INFO_METHOD_RGCTX: case MONO_RGCTX_INFO_METHOD_CONTEXT: + case MONO_RGCTX_INFO_REMOTING_INVOKE_WITH_CHECK: return data1 == data2; default: g_assert_not_reached (); diff --git a/mono/metadata/icall-def.h b/mono/metadata/icall-def.h index 78eae543a6f..c542d19ef7b 100644 --- a/mono/metadata/icall-def.h +++ b/mono/metadata/icall-def.h @@ -505,6 +505,11 @@ ICALL(ASSEMB_2, "basic_init", mono_image_basic_init) ICALL_TYPE(CATTRB, "System.Reflection.Emit.CustomAttributeBuilder", CATTRB_1) ICALL(CATTRB_1, "GetBlob", mono_reflection_get_custom_attrs_blob) +#ifndef DISABLE_REFLECTION_EMIT +ICALL_TYPE(DERIVEDTYPE, "System.Reflection.Emit.DerivedType", DERIVEDTYPE_1) +ICALL(DERIVEDTYPE_1, "create_unmanaged_type", mono_reflection_create_unmanaged_type) +#endif + ICALL_TYPE(DYNM, "System.Reflection.Emit.DynamicMethod", DYNM_1) ICALL(DYNM_1, "create_dynamic_method", mono_reflection_create_dynamic_method) ICALL(DYNM_2, "destroy_dynamic_method", mono_reflection_destroy_dynamic_method) @@ -527,6 +532,7 @@ ICALL(MODULEB_4, "create_modified_type", ves_icall_ModuleBuilder_create_modified ICALL(MODULEB_5, "getMethodToken", ves_icall_ModuleBuilder_getMethodToken) ICALL(MODULEB_6, "getToken", ves_icall_ModuleBuilder_getToken) ICALL(MODULEB_7, "getUSIndex", mono_image_insert_string) +ICALL(MODULEB_9, "set_wrappers_type", mono_image_set_wrappers_type) ICALL_TYPE(SIGH, "System.Reflection.Emit.SignatureHelper", SIGH_1) ICALL(SIGH_1, "get_signature_field", mono_reflection_sighelper_get_signature_field) diff --git a/mono/metadata/image.c b/mono/metadata/image.c index e553a29711f..47e85ea3690 100644 --- a/mono/metadata/image.c +++ b/mono/metadata/image.c @@ -853,6 +853,21 @@ mono_image_load_cli_data (MonoImage *image) return TRUE; } +void +mono_image_load_names (MonoImage *image) +{ + /* modules don't have an assembly table row */ + if (image->tables [MONO_TABLE_ASSEMBLY].rows) { + image->assembly_name = mono_metadata_string_heap (image, + mono_metadata_decode_row_col (&image->tables [MONO_TABLE_ASSEMBLY], + 0, MONO_ASSEMBLY_NAME)); + } + + image->module_name = mono_metadata_string_heap (image, + mono_metadata_decode_row_col (&image->tables [MONO_TABLE_MODULE], + 0, MONO_MODULE_NAME)); +} + static MonoImage * do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status, gboolean care_about_cli, gboolean care_about_pecoff) @@ -889,16 +904,10 @@ do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status, if (!mono_image_load_cli_data (image)) goto invalid_image; - /* modules don't have an assembly table row */ - if (image->tables [MONO_TABLE_ASSEMBLY].rows) { - image->assembly_name = mono_metadata_string_heap (image, - mono_metadata_decode_row_col (&image->tables [MONO_TABLE_ASSEMBLY], - 0, MONO_ASSEMBLY_NAME)); - } + if (!mono_verifier_verify_table_data (image, NULL)) + goto invalid_image; - image->module_name = mono_metadata_string_heap (image, - mono_metadata_decode_row_col (&image->tables [MONO_TABLE_MODULE], - 0, MONO_MODULE_NAME)); + mono_image_load_names (image); load_modules (image); @@ -1529,7 +1538,6 @@ mono_image_close (MonoImage *image) free_hash (image->castclass_cache); free_hash (image->proxy_isinst_cache); free_hash (image->thunk_invoke_cache); - free_hash (image->static_rgctx_invoke_cache); /* The ownership of signatures is not well defined */ //g_hash_table_foreach (image->memberref_signatures, free_mr_signatures, NULL); diff --git a/mono/metadata/loader.c b/mono/metadata/loader.c index 596d0c5d116..6fd64a2979f 100644 --- a/mono/metadata/loader.c +++ b/mono/metadata/loader.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -419,6 +420,11 @@ field_from_memberref (MonoImage *image, guint32 token, MonoClass **retklass, fname = mono_metadata_string_heap (image, cols [MONO_MEMBERREF_NAME]); + if (!mono_verifier_verify_memberref_signature (image, cols [MONO_MEMBERREF_SIGNATURE], NULL)) { + mono_loader_set_error_bad_image (g_strdup_printf ("Bad field signature class token %08x field name %s token %08x", class, fname, token)); + return NULL; + } + ptr = mono_metadata_blob_heap (image, cols [MONO_MEMBERREF_SIGNATURE]); mono_metadata_decode_blob_size (ptr, &ptr); /* we may want to check the signature here... */ @@ -783,6 +789,14 @@ mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 to sig = find_cached_memberref_sig (image, sig_idx); if (!sig) { + if (!mono_verifier_verify_memberref_signature (image, sig_idx, NULL)) { + guint32 class = cols [MONO_MEMBERREF_CLASS] & MONO_MEMBERREF_PARENT_MASK; + const char *fname = mono_metadata_string_heap (image, cols [MONO_MEMBERREF_NAME]); + + mono_loader_set_error_bad_image (g_strdup_printf ("Bad method signature class token %08x field name %s token %08x", class, fname, token)); + return NULL; + } + ptr = mono_metadata_blob_heap (image, sig_idx); mono_metadata_decode_blob_size (ptr, &ptr); sig = mono_metadata_parse_method_signature (image, 0, ptr, NULL); @@ -908,6 +922,11 @@ method_from_memberref (MonoImage *image, guint32 idx, MonoGenericContext *typesp sig_idx = cols [MONO_MEMBERREF_SIGNATURE]; + if (!mono_verifier_verify_memberref_signature (image, sig_idx, NULL)) { + mono_loader_set_error_method_load (klass->name, mname); + return NULL; + } + ptr = mono_metadata_blob_heap (image, sig_idx); mono_metadata_decode_blob_size (ptr, &ptr); @@ -983,6 +1002,9 @@ method_from_methodspec (MonoImage *image, MonoGenericContext *context, guint32 i token = cols [MONO_METHODSPEC_METHOD]; nindex = token >> MONO_METHODDEFORREF_BITS; + if (!mono_verifier_verify_methodspec_signature (image, cols [MONO_METHODSPEC_SIGNATURE], NULL)) + return NULL; + ptr = mono_metadata_blob_heap (image, cols [MONO_METHODSPEC_SIGNATURE]); mono_metadata_decode_value (ptr, &ptr); @@ -1979,6 +2001,7 @@ mono_method_signature (MonoMethod *m) MonoGenericContainer *container; MonoMethodSignature *signature = NULL; int *pattrs; + guint32 sig_offset; /* We need memory barriers below because of the double-checked locking pattern */ @@ -2010,7 +2033,7 @@ mono_method_signature (MonoMethod *m) idx = mono_metadata_token_index (m->token); img = m->klass->image; - sig = mono_metadata_blob_heap (img, mono_metadata_decode_row_col (&img->tables [MONO_TABLE_METHOD], idx - 1, MONO_METHOD_SIGNATURE)); + sig = mono_metadata_blob_heap (img, sig_offset = mono_metadata_decode_row_col (&img->tables [MONO_TABLE_METHOD], idx - 1, MONO_METHOD_SIGNATURE)); g_assert (!m->klass->generic_class); container = mono_method_get_generic_container (m); @@ -2033,6 +2056,11 @@ mono_method_signature (MonoMethod *m) if (!signature) { const char *sig_body; + /*TODO we should cache the failure result somewhere*/ + if (!mono_verifier_verify_method_signature (img, sig_offset, NULL)) { + mono_loader_unlock (); + return NULL; + } size = mono_metadata_decode_blob_size (sig, &sig_body); @@ -2164,6 +2192,9 @@ mono_method_get_header (MonoMethod *method) g_assert (loc); + if (!mono_verifier_verify_method_header (img, rva, NULL)) + return NULL; + header = mono_metadata_parse_mh_full (img, mono_method_get_generic_container (method), loc); mono_loader_lock (); diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c index 8a2dbb646a6..ea28a332555 100644 --- a/mono/metadata/marshal.c +++ b/mono/metadata/marshal.c @@ -3824,6 +3824,13 @@ get_runtime_invoke_type (MonoType *t, gboolean ret) return &mono_defaults.int_class->byval_arg; } + if (MONO_TYPE_IS_REFERENCE (t)) + return &mono_defaults.object_class->byval_arg; + + if (ret) + /* The result needs to be boxed */ + return t; + handle_enum: switch (t->type) { case MONO_TYPE_U1: @@ -3842,14 +3849,12 @@ handle_enum: case MONO_TYPE_PTR: return &mono_defaults.int_class->byval_arg; case MONO_TYPE_VALUETYPE: - if (t->data.klass->enumtype && !ret) { + if (t->data.klass->enumtype) { t = mono_class_enum_basetype (t->data.klass); goto handle_enum; } return t; default: - if (MONO_TYPE_IS_REFERENCE (t)) - return &mono_defaults.object_class->byval_arg; return t; } } @@ -3905,7 +3910,10 @@ get_wrapper_target_class (MonoImage *image) * To avoid these problems, we put the wrappers into the class of * the image. */ - klass = mono_class_get (image, mono_metadata_make_token (MONO_TABLE_TYPEDEF, 1)); + if (image->dynamic) + klass = ((MonoDynamicImage*)image)->wrappers_type; + else + klass = mono_class_get (image, mono_metadata_make_token (MONO_TABLE_TYPEDEF, 1)); g_assert (klass); return klass; @@ -4234,6 +4242,9 @@ handle_enum: /* nothing to do */ break; case MONO_TYPE_PTR: + /* The result is an IntPtr */ + mono_mb_emit_op (mb, CEE_BOX, mono_defaults.int_class); + break; default: g_assert_not_reached (); } @@ -7405,6 +7416,10 @@ emit_marshal (EmitMarshalContext *m, int argnum, MonoType *t, spec->native == MONO_NATIVE_IDISPATCH || spec->native == MONO_NATIVE_INTERFACE)) return mono_cominterop_emit_marshal_com_interface (m, argnum, t, spec, conv_arg, conv_arg_type, action); + if (spec && (spec->native == MONO_NATIVE_SAFEARRAY) && + (spec->data.safearray_data.elem_type == MONO_VARIANT_VARIANT) && + (action == MARSHAL_ACTION_CONV_OUT)) + return mono_cominterop_emit_marshal_safearray (m, argnum, t, spec, conv_arg, conv_arg_type, action); #endif if (mono_defaults.safehandle_class != NULL && t->data.klass && @@ -10663,8 +10678,6 @@ mono_marshal_free_inflated_wrappers (MonoMethod *method) g_hash_table_remove (method->klass->image->cominterop_invoke_cache, method); if (method->klass->image->cominterop_wrapper_cache) g_hash_table_remove (method->klass->image->cominterop_wrapper_cache, method); - if (method->klass->image->static_rgctx_invoke_cache) - g_hash_table_remove (method->klass->image->static_rgctx_invoke_cache, method); if (method->klass->image->thunk_invoke_cache) g_hash_table_remove (method->klass->image->thunk_invoke_cache, method); diff --git a/mono/metadata/metadata-internals.h b/mono/metadata/metadata-internals.h index eb083c44da9..e27ffc770a1 100644 --- a/mono/metadata/metadata-internals.h +++ b/mono/metadata/metadata-internals.h @@ -218,8 +218,7 @@ struct _MonoImage { GHashTable *synchronized_cache; GHashTable *unbox_wrapper_cache; GHashTable *cominterop_invoke_cache; - GHashTable *cominterop_wrapper_cache; - GHashTable *static_rgctx_invoke_cache; /* LOCKING: marshal lock */ + GHashTable *cominterop_wrapper_cache; /* LOCKING: marshal lock */ GHashTable *thunk_invoke_cache; /* @@ -343,6 +342,7 @@ struct _MonoDynamicImage { MonoDynamicStream tstream; MonoDynamicStream guid; MonoDynamicTable tables [MONO_TABLE_NUM]; + MonoClass *wrappers_type; /*wrappers are bound to this type instead of */ }; /* Contains information about assembly binding */ @@ -553,6 +553,8 @@ gboolean mono_image_load_pe_data (MonoImage *image) MONO_INTERNAL; gboolean mono_image_load_cli_data (MonoImage *image) MONO_INTERNAL; +void mono_image_load_names (MonoImage *image) MONO_INTERNAL; + MonoImage *mono_image_open_raw (const char *fname, MonoImageOpenStatus *status) MONO_INTERNAL; #endif /* __MONO_METADATA_INTERNALS_H__ */ diff --git a/mono/metadata/metadata-verify.c b/mono/metadata/metadata-verify.c index 2d39bd25e3c..5b5fd81303a 100644 --- a/mono/metadata/metadata-verify.c +++ b/mono/metadata/metadata-verify.c @@ -97,7 +97,7 @@ const static unsigned char coded_index_desc[] = { #define HAS_CATTR_DESC (HAS_CONSTANT_DESC + 5) 5, /*bits*/ - 19, /*tables*/ + 20, /*tables*/ MONO_TABLE_METHOD, MONO_TABLE_FIELD, MONO_TABLE_TYPEREF, @@ -117,8 +117,9 @@ const static unsigned char coded_index_desc[] = { MONO_TABLE_FILE, MONO_TABLE_EXPORTEDTYPE, MONO_TABLE_MANIFESTRESOURCE, + MONO_TABLE_GENERICPARAM, -#define HAS_FIELD_MARSHAL_DESC (HAS_CATTR_DESC + 21) +#define HAS_FIELD_MARSHAL_DESC (HAS_CATTR_DESC + 22) 1, /*bits*/ 2, /*tables*/ MONO_TABLE_FIELD, @@ -219,7 +220,6 @@ typedef struct { guint32 size; GSList *errors; int valid; - gboolean is_corlib; MonoImage *image; gboolean report_error; int stage; @@ -261,6 +261,28 @@ typedef struct { #define CHECK_ERROR() do { if (!ctx->valid) return; } while (0) +#define CHECK_ADD4_OVERFLOW_UN(a, b) ((guint32)(0xFFFFFFFFU) - (guint32)(b) < (guint32)(a)) +#define CHECK_ADD8_OVERFLOW_UN(a, b) ((guint64)(0xFFFFFFFFFFFFFFFFUL) - (guint64)(b) < (guint64)(a)) + +#if SIZEOF_VOID_P == 4 +#define CHECK_ADDP_OVERFLOW_UN(a,b) CHECK_ADD4_OVERFLOW_UN(a, b) +#else +#define CHECK_ADDP_OVERFLOW_UN(a,b) CHECK_ADD8_OVERFLOW_UN(a, b) +#endif + +#define ADDP_IS_GREATER_OR_OVF(a, b, c) (((a) + (b) > (c)) || CHECK_ADDP_OVERFLOW_UN (a, b)) +#define ADD_IS_GREATER_OR_OVF(a, b, c) (((a) + (b) > (c)) || CHECK_ADD4_OVERFLOW_UN (a, b)) + +static const char * +dword_align (const char *ptr) +{ +#if SIZEOF_VOID_P == 8 + return (const char *) (((guint64) (ptr + 3)) & ~3); +#else + return (const char *) (((guint32) (ptr + 3)) & ~3); +#endif +} + static guint32 pe_signature_offset (VerifyContext *ctx) { @@ -565,34 +587,42 @@ verify_import_table (VerifyContext *ctx) ADD_ERROR (ctx, g_strdup_printf ("Import table size %d is smaller than 40", it.size)); ilt_rva = read32 (ptr); - if (!bounds_check_virtual_address (ctx, ilt_rva, 8)) + if (ilt_rva && !bounds_check_virtual_address (ctx, ilt_rva, 8)) ADD_ERROR (ctx, g_strdup_printf ("Invalid Import Lookup Table rva %x", ilt_rva)); name_rva = read32 (ptr + 12); - if (!bounds_check_virtual_address (ctx, name_rva, SIZE_OF_MSCOREE)) + if (name_rva && !bounds_check_virtual_address (ctx, name_rva, SIZE_OF_MSCOREE)) ADD_ERROR (ctx, g_strdup_printf ("Invalid Import Table Name rva %x", name_rva)); iat_rva = read32 (ptr + 16); - if (!bounds_check_virtual_address (ctx, iat_rva, 8)) - ADD_ERROR (ctx, g_strdup_printf ("Invalid Import Address Table rva %x", iat_rva)); - - if (iat_rva != ctx->data_directories [IAT_IDX].rva) - ADD_ERROR (ctx, g_strdup_printf ("Import Address Table rva %x different from data directory entry %x", read32 (ptr + 16), ctx->data_directories [IAT_IDX].rva)); + if (iat_rva) { + if (!bounds_check_virtual_address (ctx, iat_rva, 8)) + ADD_ERROR (ctx, g_strdup_printf ("Invalid Import Address Table rva %x", iat_rva)); - name_rva = translate_rva (ctx, name_rva); - g_assert (name_rva != INVALID_OFFSET); - ptr = ctx->data + name_rva; + if (iat_rva != ctx->data_directories [IAT_IDX].rva) + ADD_ERROR (ctx, g_strdup_printf ("Import Address Table rva %x different from data directory entry %x", read32 (ptr + 16), ctx->data_directories [IAT_IDX].rva)); + } - if (memcmp ("mscoree.dll", ptr, SIZE_OF_MSCOREE)) { - char name[SIZE_OF_MSCOREE]; - memcpy (name, ptr, SIZE_OF_MSCOREE); - name [SIZE_OF_MSCOREE - 1] = 0; - ADD_ERROR (ctx, g_strdup_printf ("Invalid Import Table Name: '%s'", name)); + if (name_rva) { + name_rva = translate_rva (ctx, name_rva); + g_assert (name_rva != INVALID_OFFSET); + ptr = ctx->data + name_rva; + + if (memcmp ("mscoree.dll", ptr, SIZE_OF_MSCOREE)) { + char name[SIZE_OF_MSCOREE]; + memcpy (name, ptr, SIZE_OF_MSCOREE); + name [SIZE_OF_MSCOREE - 1] = 0; + ADD_ERROR (ctx, g_strdup_printf ("Invalid Import Table Name: '%s'", name)); + } } - verify_hint_name_table (ctx, ilt_rva, "Import Lookup Table"); - CHECK_ERROR (); - verify_hint_name_table (ctx, iat_rva, "Import Address Table"); + if (ilt_rva) { + verify_hint_name_table (ctx, ilt_rva, "Import Lookup Table"); + CHECK_ERROR (); + } + + if (iat_rva) + verify_hint_name_table (ctx, iat_rva, "Import Address Table"); } static void @@ -1021,10 +1051,19 @@ string_cmp (VerifyContext *ctx, const char *str, guint offset) return strcmp (str, get_string_ptr (ctx, offset)); } +static gboolean +mono_verifier_is_corlib (MonoImage *image) +{ + gboolean trusted_location = (mono_security_get_mode () != MONO_SECURITY_MODE_CORE_CLR) ? + TRUE : mono_security_core_clr_is_platform_image (image); + + return trusted_location && image->module_name && !strcmp ("mscorlib.dll", image->module_name); +} + static gboolean typedef_is_system_object (VerifyContext *ctx, guint32 *data) { - return ctx->is_corlib && !string_cmp (ctx, "System", data [MONO_TYPEDEF_NAME]) && !string_cmp (ctx, "Object", data [MONO_TYPEDEF_NAMESPACE]); + return mono_verifier_is_corlib (ctx->image) && !string_cmp (ctx, "System", data [MONO_TYPEDEF_NAMESPACE]) && !string_cmp (ctx, "Object", data [MONO_TYPEDEF_NAME]); } static gboolean @@ -1680,23 +1719,25 @@ is_valid_methodspec_blog (VerifyContext *ctx, guint32 offset) } static gboolean -is_valid_blob_object (VerifyContext *ctx, guint32 offset) +is_valid_blob_object (VerifyContext *ctx, guint32 offset, guint32 minsize) { OffsetAndSize blob = get_metadata_stream (ctx, &ctx->image->heap_blob); guint32 entry_size, bytes; - if (blob.size < offset) { - printf ("1\n"); + if (blob.size < offset) return FALSE; - } if (!decode_value (ctx->data + offset + blob.offset, blob.size - blob.offset, &entry_size, &bytes)) return FALSE; - if (offset + entry_size + bytes < offset) + if (entry_size < minsize) return FALSE; - return blob.size >= offset + entry_size + bytes; + if (CHECK_ADD4_OVERFLOW_UN (entry_size, bytes)) + return FALSE; + entry_size += bytes; + + return !ADD_IS_GREATER_OR_OVF (offset, entry_size, blob.size); } static gboolean @@ -1705,23 +1746,20 @@ is_valid_constant (VerifyContext *ctx, guint32 type, guint32 offset) OffsetAndSize blob = get_metadata_stream (ctx, &ctx->image->heap_blob); guint32 size, entry_size, bytes; - if (blob.size < offset) { - printf ("1\n"); - return FALSE; - } - + if (blob.size < offset) + FAIL (ctx, g_strdup ("ContantValue: invalid offset")); if (!decode_value (ctx->data + offset + blob.offset, blob.size - blob.offset, &entry_size, &bytes)) - return FALSE; + FAIL (ctx, g_strdup ("ContantValue: not enough space to decode size")); if (type == MONO_TYPE_STRING) { - //String is encoded as: compressed_int:len len *chars - + //String is encoded as: compressed_int:len len *bytes offset += bytes; - if (offset > offset + entry_size * 2) //overflow - return FALSE; - offset += offset + entry_size * 2; - return offset <= blob.size; + + if (ADD_IS_GREATER_OR_OVF (offset, entry_size, blob.size)) + FAIL (ctx, g_strdup_printf ("ContantValue: not enough space for string, required %d but got %d", entry_size * 2, blob.size - offset)); + + return TRUE; } switch (type) { @@ -1752,25 +1790,131 @@ is_valid_constant (VerifyContext *ctx, guint32 type, guint32 offset) } if (size != entry_size) - return FALSE; - offset += bytes; + FAIL (ctx, g_strdup_printf ("ContantValue: Expected size %d but got %d", size, entry_size)); - if(offset > offset + size) //overflow - return FALSE; + offset += bytes; - if (offset + size > blob.size) - return FALSE; + if (ADD_IS_GREATER_OR_OVF (offset, size, blob.size)) + FAIL (ctx, g_strdup_printf ("ContantValue: Not enough room for constant, required %d but have %d", size, blob.size - offset)); - if (type == MONO_TYPE_CLASS && read32 (ctx->data + offset)) - return FALSE; + if (type == MONO_TYPE_CLASS && read32 (ctx->data + blob.offset + offset)) + FAIL (ctx, g_strdup_printf ("ContantValue: Type is class but value is not null")); return TRUE; } +#define FAT_HEADER_INVALID_FLAGS ~(0x3 | 0x8 | 0x10 | 0xF000) +//only 0x01, 0x40 and 0x80 are allowed +#define SECTION_HEADER_INVALID_FLAGS 0x3E + static gboolean is_valid_method_header (VerifyContext *ctx, guint32 rva) { - //TODO do proper method header validation - return mono_cli_rva_image_map (ctx->image, rva) != INVALID_ADDRESS; + guint32 local_vars_tok, code_size, offset = mono_cli_rva_image_map (ctx->image, rva); + guint8 header = 0; + guint16 fat_header = 0, size = 0, max_stack; + const char *ptr = NULL, *end; + + if (offset == INVALID_ADDRESS) + FAIL (ctx, g_strdup ("MethodHeader: Invalid RVA")); + + ptr = ctx->data + offset; + end = ctx->data + ctx->size; /*no worries if it spawns multiple sections*/ + + if (!safe_read8 (header, ptr, end)) + FAIL (ctx, g_strdup ("MethodHeader: Not enough room for header")); + + switch (header & 0x3) { + case 0: + case 1: + FAIL (ctx, g_strdup_printf ("MethodHeader: Invalid header type 0x%x", header & 0x3)); + case 2: + header >>= 2; + if (ADDP_IS_GREATER_OR_OVF (ptr, header, end)) + FAIL (ctx, g_strdup_printf ("MethodHeader: Not enough room for method body. Required %d, but only %d is available", header, (int)(end - ptr))); + return TRUE; + } + //FAT HEADER + --ptr; + if (!safe_read16 (fat_header, ptr, end)) + FAIL (ctx, g_strdup ("MethodHeader: Not enough room for fat header")); + + size = (fat_header >> 12) & 0xF; + if (size != 3) + FAIL (ctx, g_strdup ("MethodHeader: header size must be 3")); + + if (!safe_read16 (max_stack, ptr, end)) + FAIL (ctx, g_strdup ("MethodHeader: Not enough room for max stack")); + + if (!safe_read32 (code_size, ptr, end)) + FAIL (ctx, g_strdup ("MethodHeader: Not enough room for code size")); + + if (!safe_read32 (local_vars_tok, ptr, end)) + FAIL (ctx, g_strdup ("MethodHeader: Not enough room for local vars tok")); + + if (local_vars_tok) { + if (((local_vars_tok >> 24) & 0xFF) != 0x11) + FAIL (ctx, g_strdup_printf ("MethodHeader: Invalid local vars signature table 0x%x", ((local_vars_tok >> 24) & 0xFF))); + if ((local_vars_tok & 0xFFFFFF) > ctx->image->tables [MONO_TABLE_STANDALONESIG].rows) + FAIL (ctx, g_strdup_printf ("MethodHeader: Invalid local vars signature points to invalid row 0x%x", local_vars_tok & 0xFFFFFF)); + } + + if (fat_header & FAT_HEADER_INVALID_FLAGS) + FAIL (ctx, g_strdup_printf ("MethodHeader: Invalid fat signature flags %x", fat_header & FAT_HEADER_INVALID_FLAGS)); + + if (ADDP_IS_GREATER_OR_OVF (ptr, code_size, end)) + FAIL (ctx, g_strdup_printf ("MethodHeader: Not enough room for code %d", code_size)); + + if (!(fat_header & 0x08)) + return TRUE; + + ptr += code_size; + + do { + guint32 section_header = 0, section_size = 0; + gboolean is_fat; + + ptr = dword_align (ptr); + if (!safe_read32 (section_header, ptr, end)) + FAIL (ctx, g_strdup ("MethodHeader: Not enough room for data section header")); + + if (section_header & SECTION_HEADER_INVALID_FLAGS) + FAIL (ctx, g_strdup_printf ("MethodHeader: Invalid section header flags 0x%x", section_header & SECTION_HEADER_INVALID_FLAGS)); + + is_fat = (section_header & METHOD_HEADER_SECTION_FAT_FORMAT) != 0; + section_size = (section_header >> 8) & (is_fat ? 0xFFFFFF : 0xFF); + + if (section_size < 4) + FAIL (ctx, g_strdup_printf ("MethodHeader: Section size too small")); + + if (ADDP_IS_GREATER_OR_OVF (ptr, section_size - 4, end)) /*must be section_size -4 as ptr was incremented by safe_read32*/ + FAIL (ctx, g_strdup_printf ("MethodHeader: Not enough room for section content %d", section_size)); + + if (section_header & METHOD_HEADER_SECTION_EHTABLE) { + guint32 i, clauses = (section_size - 4) / (is_fat ? 24 : 12); + if (clauses * (is_fat ? 24 : 12) + 4 != section_size) + FAIL (ctx, g_strdup_printf ("MethodHeader: Invalid EH section size %d, it's not of the proper size", section_size)); + + /* only verify the class token is verified as the rest is done by the IL verifier*/ + for (i = 0; i < clauses; ++i) { + guint flags = *ptr; + guint32 class_token = 0; + ptr += (is_fat ? 20 : 8); + if (!safe_read32 (class_token, ptr, end)) + FAIL (ctx, g_strdup_printf ("MethodHeader: Not enough room for section %d", i)); + if (flags == MONO_EXCEPTION_CLAUSE_NONE && class_token) { + guint table = mono_metadata_token_table (class_token); + if (table != MONO_TABLE_TYPEREF && table != MONO_TABLE_TYPEDEF && table != MONO_TABLE_TYPESPEC) + FAIL (ctx, g_strdup_printf ("MethodHeader: Invalid section %d class token table %x", i, table)); + if (mono_metadata_token_index (class_token) > ctx->image->tables [table].rows) + FAIL (ctx, g_strdup_printf ("MethodHeader: Invalid section %d class token index %x", i, mono_metadata_token_index (class_token))); + } + } + } + + if (!(section_header & METHOD_HEADER_SECTION_MORE_SECTS)) + break; + } while (1); + return TRUE; } static void @@ -1847,32 +1991,17 @@ verify_typedef_table (VerifyContext *ctx) if ((data [MONO_TYPEDEF_FLAGS] & 0xC00000) != 0) ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d mono doesn't support custom string format", i)); + if ((data [MONO_TYPEDEF_FLAGS] & TYPE_ATTRIBUTE_INTERFACE) && (data [MONO_TYPEDEF_FLAGS] & TYPE_ATTRIBUTE_ABSTRACT) == 0) + ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d for interface type must be abstract", i)); + if (!data [MONO_TYPEDEF_NAME] || !is_valid_non_empty_string (ctx, data [MONO_TYPEDEF_NAME])) ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d invalid name token %08x", i, data [MONO_TYPEDEF_NAME])); if (data [MONO_TYPEREF_NAMESPACE] && !is_valid_non_empty_string (ctx, data [MONO_TYPEREF_NAMESPACE])) ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d invalid namespace token %08x", i, data [MONO_TYPEREF_NAMESPACE])); - if (i == 0) { - if (data [MONO_TYPEDEF_EXTENDS] != 0) - ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row 0 for the special type must have a null extend field")); - } else { - if (typedef_is_system_object (ctx, data) && data [MONO_TYPEDEF_EXTENDS] != 0) - ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d for System.Object must have a null extend field", i)); - - if (data [MONO_TYPEDEF_FLAGS] & TYPE_ATTRIBUTE_INTERFACE) { - if (data [MONO_TYPEDEF_EXTENDS]) - ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d for interface type must have a null extend field", i)); - if ((data [MONO_TYPEDEF_FLAGS] & TYPE_ATTRIBUTE_ABSTRACT) == 0) - ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d for interface type must be abstract", i)); - } else { - if (!is_valid_coded_index (ctx, TYPEDEF_OR_REF_DESC, data [MONO_TYPEDEF_EXTENDS])) - ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d extend field coded index 0x%08x", i, data [MONO_TYPEDEF_EXTENDS])); - - if (!get_coded_index_token (TYPEDEF_OR_REF_DESC, data [MONO_TYPEDEF_EXTENDS])) - ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d for non-interface type must have a non-null extend field", i)); - } - } + if (data [MONO_TYPEDEF_EXTENDS] && !is_valid_coded_index (ctx, TYPEDEF_OR_REF_DESC, data [MONO_TYPEDEF_EXTENDS])) + ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d extend field coded index 0x%08x", i, data [MONO_TYPEDEF_EXTENDS])); if (data [MONO_TYPEDEF_FIELD_LIST] == 0) ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d FieldList be be >= 1", i)); @@ -1892,12 +2021,49 @@ verify_typedef_table (VerifyContext *ctx) if (data [MONO_TYPEDEF_METHOD_LIST] < methodlist) ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d MethodList rowid 0x%08x can't be smaller than of previous row 0x%08x", i, data [MONO_TYPEDEF_METHOD_LIST], methodlist)); - fieldlist = data [MONO_TYPEDEF_FIELD_LIST]; methodlist = data [MONO_TYPEDEF_METHOD_LIST]; } } +static void +verify_typedef_table_full (VerifyContext *ctx) +{ + MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_TYPEDEF]; + guint32 data [MONO_TYPEDEF_SIZE]; + int i; + + if (table->rows == 0) + ADD_ERROR (ctx, g_strdup_printf ("Typedef table must have exactly at least one row")); + + for (i = 0; i < table->rows; ++i) { + mono_metadata_decode_row (table, i, data, MONO_TYPEDEF_SIZE); + + if (i == 0) { + if (data [MONO_TYPEDEF_EXTENDS] != 0) + ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row 0 for the special type must have a null extend field")); + continue; + } + + if (data [MONO_TYPEDEF_FLAGS] & TYPE_ATTRIBUTE_INTERFACE) { + if (data [MONO_TYPEDEF_EXTENDS]) + ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d for interface type must have a null extend field", i)); + } else { + gboolean is_sys_obj = typedef_is_system_object (ctx, data); + gboolean has_parent = get_coded_index_token (TYPEDEF_OR_REF_DESC, data [MONO_TYPEDEF_EXTENDS]) != 0; + + if (is_sys_obj) { + if (has_parent) + ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d for System.Object must have a null extend field", i)); + } else { + if (!has_parent) { + ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d for non-interface type must have a non-null extend field", i)); + } + } + } + } +} + /*bits 3,11,14 */ #define INVALID_FIELD_FLAG_BITS ((1 << 3) | (1 << 11) | (1 << 14)) static void @@ -1951,9 +2117,10 @@ verify_field_table (VerifyContext *ctx) if (!data [MONO_FIELD_NAME] || !is_valid_non_empty_string (ctx, data [MONO_FIELD_NAME])) ADD_ERROR (ctx, g_strdup_printf ("Invalid field row %d invalid name token %08x", i, data [MONO_FIELD_NAME])); + if (data [MONO_FIELD_SIGNATURE] && !is_valid_blob_object (ctx, data [MONO_FIELD_SIGNATURE], 1)) + ADD_ERROR (ctx, g_strdup_printf ("Invalid field row %d invalid signature blob token 0x%x", i, data [MONO_FIELD_SIGNATURE])); + //TODO verify contant flag - if (!data [MONO_FIELD_SIGNATURE] || !is_valid_field_signature (ctx, data [MONO_FIELD_SIGNATURE])) - ADD_ERROR (ctx, g_strdup_printf ("Invalid field row %d invalid signature token %08x", i, data [MONO_FIELD_SIGNATURE])); if (i + 1 < module_field_list) { guint32 access = flags & FIELD_ATTRIBUTE_FIELD_ACCESS_MASK; @@ -1965,6 +2132,21 @@ verify_field_table (VerifyContext *ctx) } } +static void +verify_field_table_full (VerifyContext *ctx) +{ + MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_FIELD]; + guint32 data [MONO_FIELD_SIZE]; + int i; + + for (i = 0; i < table->rows; ++i) { + mono_metadata_decode_row (table, i, data, MONO_FIELD_SIZE); + + if (!data [MONO_FIELD_SIGNATURE] || !is_valid_field_signature (ctx, data [MONO_FIELD_SIGNATURE])) + ADD_ERROR (ctx, g_strdup_printf ("Invalid field row %d invalid signature token %08x", i, data [MONO_FIELD_SIGNATURE])); + } +} + /*bits 6,8,9,10,11,13,14,15*/ #define INVALID_METHOD_IMPLFLAG_BITS ((1 << 6) | (1 << 8) | (1 << 9) | (1 << 10) | (1 << 11) | (1 << 13) | (1 << 14) | (1 << 15)) static void @@ -2029,9 +2211,6 @@ verify_method_table (VerifyContext *ctx) //TODO check iface with .ctor (15,16) - if (!data [MONO_METHOD_SIGNATURE] || !is_valid_method_signature (ctx, data [MONO_METHOD_SIGNATURE])) - ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d invalid signature token 0x%08x", i, data [MONO_METHOD_SIGNATURE])); - if (i + 1 < module_method_list) { if (!(flags & METHOD_ATTRIBUTE_STATIC)) ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d is a global method but not Static", i)); @@ -2063,8 +2242,6 @@ verify_method_table (VerifyContext *ctx) ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d has RVA != 0 but is Abstract", i)); if (code_type == METHOD_IMPL_ATTRIBUTE_OPTIL) ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d has RVA != 0 but is CodeTypeMask is neither Native, CIL or Runtime", i)); - if (!is_valid_method_header (ctx, rva)) - ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d RVA points to an invalid method header", i)); } else { if (!(flags & (METHOD_ATTRIBUTE_ABSTRACT | METHOD_ATTRIBUTE_PINVOKE_IMPL)) && !(implflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) && code_type != METHOD_IMPL_ATTRIBUTE_RUNTIME) ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d has RVA = 0 but neither Abstract, InternalCall, Runtime or PinvokeImpl", i)); @@ -2082,6 +2259,9 @@ verify_method_table (VerifyContext *ctx) if ((is_ctor || is_cctor) && !(flags & METHOD_ATTRIBUTE_RT_SPECIAL_NAME)) ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d is named .ctor or .cctor but is not RtSpecialName", i)); + if (data [MONO_METHOD_SIGNATURE] && !is_valid_blob_object (ctx, data [MONO_METHOD_SIGNATURE], 1)) + ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d invalid signature blob token 0x%x", i, data [MONO_METHOD_SIGNATURE])); + if (data [MONO_METHOD_PARAMLIST] == 0) ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d ParamList be be >= 1", i)); @@ -2096,6 +2276,25 @@ verify_method_table (VerifyContext *ctx) } } +static void +verify_method_table_full (VerifyContext *ctx) +{ + MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_METHOD]; + guint32 data [MONO_METHOD_SIZE], rva; + int i; + + for (i = 0; i < table->rows; ++i) { + mono_metadata_decode_row (table, i, data, MONO_METHOD_SIZE); + rva = data [MONO_METHOD_RVA]; + + if (!data [MONO_METHOD_SIGNATURE] || !is_valid_method_signature (ctx, data [MONO_METHOD_SIGNATURE])) + ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d invalid signature token 0x%08x", i, data [MONO_METHOD_SIGNATURE])); + + if (rva && !is_valid_method_header (ctx, rva)) + ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d RVA points to an invalid method header", i)); + } +} + static guint32 get_next_param_count (VerifyContext *ctx, guint32 *current_method) { @@ -2129,6 +2328,12 @@ verify_param_table (VerifyContext *ctx) gboolean first_param = TRUE; int i; + if (ctx->image->tables [MONO_TABLE_METHOD].rows == 0) { + if (table->rows > 0) + ADD_ERROR (ctx, g_strdup ("Param table has rows while the method table has zero")); + return; + } + remaining_params = get_next_param_count (ctx, ¤t_method); for (i = 0; i < table->rows; ++i) { @@ -2203,6 +2408,22 @@ verify_memberref_table (VerifyContext *ctx) if (!is_valid_non_empty_string (ctx, data [MONO_MEMBERREF_NAME])) ADD_ERROR (ctx, g_strdup_printf ("Invalid MemberRef row %d Name field coded is invalid or empty 0x%08x", i, data [MONO_MEMBERREF_NAME])); + if (data [MONO_MEMBERREF_SIGNATURE] && !is_valid_blob_object (ctx, data [MONO_MEMBERREF_SIGNATURE], 1)) + ADD_ERROR (ctx, g_strdup_printf ("Invalid MemberRef row %d invalid signature blob token 0x%x", i, data [MONO_MEMBERREF_SIGNATURE])); + } +} + + +static void +verify_memberref_table_full (VerifyContext *ctx) +{ + MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_MEMBERREF]; + guint32 data [MONO_MEMBERREF_SIZE]; + int i; + + for (i = 0; i < table->rows; ++i) { + mono_metadata_decode_row (table, i, data, MONO_MEMBERREF_SIZE); + if (!is_valid_method_or_field_signature (ctx, data [MONO_MEMBERREF_SIGNATURE])) ADD_ERROR (ctx, g_strdup_printf ("Invalid MemberRef row %d Signature field 0x%08x", i, data [MONO_MEMBERREF_SIGNATURE])); } @@ -2249,9 +2470,23 @@ verify_cattr_table (VerifyContext *ctx) if (!is_valid_coded_index (ctx, CATTR_TYPE_DESC, data [MONO_CUSTOM_ATTR_TYPE])) ADD_ERROR (ctx, g_strdup_printf ("Invalid CustomAttribute row %d Parent field 0x%08x", i, data [MONO_CUSTOM_ATTR_PARENT])); + if (data [MONO_CUSTOM_ATTR_VALUE] && !is_valid_blob_object (ctx, data [MONO_CUSTOM_ATTR_VALUE], 0)) + ADD_ERROR (ctx, g_strdup_printf ("Invalid CustomAttribute row %d invalid value blob 0x%x", i, data [MONO_CUSTOM_ATTR_VALUE])); + } +} + +static void +verify_cattr_table_full (VerifyContext *ctx) +{ + MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_CUSTOMATTRIBUTE]; + guint32 data [MONO_CUSTOM_ATTR_SIZE]; + int i; + + for (i = 0; i < table->rows; ++i) { + mono_metadata_decode_row (table, i, data, MONO_CUSTOM_ATTR_SIZE); + if (!is_vald_cattr_blob (ctx, data [MONO_CUSTOM_ATTR_VALUE])) ADD_ERROR (ctx, g_strdup_printf ("Invalid CustomAttribute row %d Value field 0x%08x", i, data [MONO_CUSTOM_ATTR_VALUE])); - } } @@ -2274,9 +2509,23 @@ verify_field_marshal_table (VerifyContext *ctx) if (!data [MONO_FIELD_MARSHAL_NATIVE_TYPE]) ADD_ERROR (ctx, g_strdup_printf ("Invalid FieldMarshal row %d NativeType field is null", i)); + if (!is_valid_blob_object (ctx, data [MONO_FIELD_MARSHAL_NATIVE_TYPE], 1)) + ADD_ERROR (ctx, g_strdup_printf ("Invalid FieldMarshal row %d invalid NativeType blob 0x%x", i, data [MONO_FIELD_MARSHAL_NATIVE_TYPE])); + } +} + +static void +verify_field_marshal_table_full (VerifyContext *ctx) +{ + MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_FIELDMARSHAL]; + guint32 data [MONO_FIELD_MARSHAL_SIZE]; + int i; + + for (i = 0; i < table->rows; ++i) { + mono_metadata_decode_row (table, i, data, MONO_FIELD_MARSHAL_SIZE); + if (!is_valid_marshal_spec (ctx, data [MONO_FIELD_MARSHAL_NATIVE_TYPE])) ADD_ERROR (ctx, g_strdup_printf ("Invalid FieldMarshal row %d NativeType field 0x%08x", i, data [MONO_FIELD_MARSHAL_NATIVE_TYPE])); - } } @@ -2298,10 +2547,21 @@ verify_decl_security_table (VerifyContext *ctx) if (!data [MONO_DECL_SECURITY_PERMISSIONSET]) ADD_ERROR (ctx, g_strdup_printf ("Invalid DeclSecurity row %d PermissionSet field is null", i)); + } +} + +static void +verify_decl_security_table_full (VerifyContext *ctx) +{ + MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_DECLSECURITY]; + guint32 data [MONO_DECL_SECURITY_SIZE]; + int i; + + for (i = 0; i < table->rows; ++i) { + mono_metadata_decode_row (table, i, data, MONO_DECL_SECURITY_SIZE); if (!is_valid_permission_set (ctx, data [MONO_DECL_SECURITY_PERMISSIONSET])) ADD_ERROR (ctx, g_strdup_printf ("Invalid DeclSecurity row %d PermissionSet field 0x%08x", i, data [MONO_DECL_SECURITY_PERMISSIONSET])); - } } @@ -2357,6 +2617,21 @@ verify_standalonesig_table (VerifyContext *ctx) guint32 data [MONO_STAND_ALONE_SIGNATURE_SIZE]; int i; + for (i = 0; i < table->rows; ++i) { + mono_metadata_decode_row (table, i, data, MONO_STAND_ALONE_SIGNATURE_SIZE); + + if (data [MONO_STAND_ALONE_SIGNATURE] && !is_valid_blob_object (ctx, data [MONO_STAND_ALONE_SIGNATURE], 1)) + ADD_ERROR (ctx, g_strdup_printf ("Invalid StandAloneSig row %d invalid signature 0x%x", i, data [MONO_STAND_ALONE_SIGNATURE])); + } +} + +static void +verify_standalonesig_table_full (VerifyContext *ctx) +{ + MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_STANDALONESIG]; + guint32 data [MONO_STAND_ALONE_SIGNATURE_SIZE]; + int i; + for (i = 0; i < table->rows; ++i) { mono_metadata_decode_row (table, i, data, MONO_STAND_ALONE_SIGNATURE_SIZE); @@ -2390,10 +2665,8 @@ static void verify_event_table (VerifyContext *ctx) { MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_EVENT]; - MonoTableInfo *sema_table = &ctx->image->tables [MONO_TABLE_METHODSEMANTICS]; - guint32 data [MONO_EVENT_SIZE], sema_data [MONO_METHOD_SEMA_SIZE], token; - gboolean found_add, found_remove; - int i, idx; + guint32 data [MONO_EVENT_SIZE]; + int i; for (i = 0; i < table->rows; ++i) { mono_metadata_decode_row (table, i, data, MONO_EVENT_SIZE); @@ -2406,8 +2679,21 @@ verify_event_table (VerifyContext *ctx) if (!is_valid_coded_index (ctx, TYPEDEF_OR_REF_DESC, data [MONO_EVENT_TYPE])) ADD_ERROR (ctx, g_strdup_printf ("Invalid Event row %d EventType field %08x", i, data [MONO_EVENT_TYPE])); + } +} + +static void +verify_event_table_full (VerifyContext *ctx) +{ + MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_EVENT]; + MonoTableInfo *sema_table = &ctx->image->tables [MONO_TABLE_METHODSEMANTICS]; + guint32 data [MONO_EVENT_SIZE], sema_data [MONO_METHOD_SEMA_SIZE], token; + gboolean found_add, found_remove; + int i, idx; + + for (i = 0; i < table->rows; ++i) { + mono_metadata_decode_row (table, i, data, MONO_EVENT_SIZE); - //check for Add and Remove token = make_coded_token (HAS_SEMANTICS_DESC, MONO_TABLE_EVENT, i); idx = search_sorted_table (ctx, MONO_TABLE_METHODSEMANTICS, MONO_METHOD_SEMA_ASSOCIATION, token); if (idx == -1) @@ -2537,6 +2823,21 @@ verify_typespec_table (VerifyContext *ctx) guint32 data [MONO_TYPESPEC_SIZE]; int i; + for (i = 0; i < table->rows; ++i) { + mono_metadata_decode_row (table, i, data, MONO_TYPESPEC_SIZE); + + if (data [MONO_TYPESPEC_SIGNATURE] && !is_valid_blob_object (ctx, data [MONO_TYPESPEC_SIGNATURE], 1)) + ADD_ERROR (ctx, g_strdup_printf ("Invalid TypeSpec row %d Signature field %08x", i, data [MONO_TYPESPEC_SIGNATURE])); + } +} + +static void +verify_typespec_table_full (VerifyContext *ctx) +{ + MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_TYPESPEC]; + guint32 data [MONO_TYPESPEC_SIZE]; + int i; + for (i = 0; i < table->rows; ++i) { mono_metadata_decode_row (table, i, data, MONO_TYPESPEC_SIZE); @@ -2545,7 +2846,7 @@ verify_typespec_table (VerifyContext *ctx) } } -#define INVALID_IMPLMAP_FLAGS_BITS ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10)) +#define INVALID_IMPLMAP_FLAGS_BITS ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 6) | (1 << 8) | (1 << 9) | (1 << 10)) static void verify_implmap_table (VerifyContext *ctx) { @@ -2575,7 +2876,7 @@ verify_implmap_table (VerifyContext *ctx) if (!is_valid_non_empty_string (ctx, data [MONO_IMPLMAP_NAME])) ADD_ERROR (ctx, g_strdup_printf ("Invalid ImplMap row %d ImportName Token %x", i, data [MONO_IMPLMAP_NAME])); - if (!data [MONO_IMPLMAP_SCOPE] || data [MONO_IMPLMAP_SCOPE] > ctx->image->tables [MONO_TABLE_MODULE].rows + 1) + if (!data [MONO_IMPLMAP_SCOPE] || data [MONO_IMPLMAP_SCOPE] > ctx->image->tables [MONO_TABLE_MODULEREF].rows + 1) ADD_ERROR (ctx, g_strdup_printf ("Invalid ImplMap row %d Invalid ImportScope token %x", i, data [MONO_IMPLMAP_SCOPE])); } } @@ -2619,7 +2920,7 @@ verify_assembly_table (VerifyContext *ctx) if (data [MONO_ASSEMBLY_FLAGS] & INVALID_ASSEMBLY_FLAGS_BITS) ADD_ERROR (ctx, g_strdup_printf ("Assembly table row %d has invalid Flags %08x", i, data [MONO_ASSEMBLY_FLAGS])); - if (data [MONO_ASSEMBLY_PUBLIC_KEY] && !is_valid_blob_object (ctx, data [MONO_ASSEMBLY_PUBLIC_KEY])) + if (data [MONO_ASSEMBLY_PUBLIC_KEY] && !is_valid_blob_object (ctx, data [MONO_ASSEMBLY_PUBLIC_KEY], 1)) ADD_ERROR (ctx, g_strdup_printf ("Assembly table row %d has invalid PublicKey %08x", i, data [MONO_ASSEMBLY_FLAGS])); if (!is_valid_non_empty_string (ctx, data [MONO_ASSEMBLY_NAME])) @@ -2644,7 +2945,7 @@ verify_assemblyref_table (VerifyContext *ctx) if (data [MONO_ASSEMBLYREF_FLAGS] & INVALID_ASSEMBLYREF_FLAGS_BITS) ADD_ERROR (ctx, g_strdup_printf ("AssemblyRef table row %d has invalid Flags %08x", i, data [MONO_ASSEMBLYREF_FLAGS])); - if (data [MONO_ASSEMBLYREF_PUBLIC_KEY] && !is_valid_blob_object (ctx, data [MONO_ASSEMBLYREF_PUBLIC_KEY])) + if (data [MONO_ASSEMBLYREF_PUBLIC_KEY] && !is_valid_blob_object (ctx, data [MONO_ASSEMBLYREF_PUBLIC_KEY], 1)) ADD_ERROR (ctx, g_strdup_printf ("AssemblyRef table row %d has invalid PublicKeyOrToken %08x", i, data [MONO_ASSEMBLYREF_PUBLIC_KEY])); if (!is_valid_non_empty_string (ctx, data [MONO_ASSEMBLYREF_NAME])) @@ -2653,7 +2954,7 @@ verify_assemblyref_table (VerifyContext *ctx) if (data [MONO_ASSEMBLYREF_CULTURE] && !is_valid_string (ctx, data [MONO_ASSEMBLYREF_CULTURE])) ADD_ERROR (ctx, g_strdup_printf ("AssemblyRef table row %d has invalid Culture %08x", i, data [MONO_ASSEMBLYREF_CULTURE])); - if (data [MONO_ASSEMBLYREF_HASH_VALUE] && !is_valid_blob_object (ctx, data [MONO_ASSEMBLYREF_HASH_VALUE])) + if (data [MONO_ASSEMBLYREF_HASH_VALUE] && !is_valid_blob_object (ctx, data [MONO_ASSEMBLYREF_HASH_VALUE], 1)) ADD_ERROR (ctx, g_strdup_printf ("AssemblyRef table row %d has invalid HashValue %08x", i, data [MONO_ASSEMBLYREF_HASH_VALUE])); } } @@ -2675,7 +2976,7 @@ verify_file_table (VerifyContext *ctx) if (!is_valid_non_empty_string (ctx, data [MONO_FILE_NAME])) ADD_ERROR (ctx, g_strdup_printf ("File table row %d has invalid Name %08x", i, data [MONO_FILE_NAME])); - if (!data [MONO_FILE_HASH_VALUE] || !is_valid_blob_object (ctx, data [MONO_FILE_HASH_VALUE])) + if (!data [MONO_FILE_HASH_VALUE] || !is_valid_blob_object (ctx, data [MONO_FILE_HASH_VALUE], 1)) ADD_ERROR (ctx, g_strdup_printf ("File table row %d has invalid HashValue %08x", i, data [MONO_FILE_HASH_VALUE])); } } @@ -2828,6 +3129,21 @@ verify_method_spec_table (VerifyContext *ctx) if (!get_coded_index_token (METHODDEF_OR_REF_DESC, data [MONO_METHODSPEC_METHOD])) ADD_ERROR (ctx, g_strdup_printf ("MethodSpec table row %d has null Method token", i)); + if (data [MONO_METHODSPEC_SIGNATURE] && !is_valid_blob_object (ctx, data [MONO_METHODSPEC_SIGNATURE], 1)) + ADD_ERROR (ctx, g_strdup_printf ("MethodSpec table row %d has invalid signature token %08x", i, data [MONO_METHODSPEC_SIGNATURE])); + } +} + +static void +verify_method_spec_table_full (VerifyContext *ctx) +{ + MonoTableInfo *table = &ctx->image->tables [MONO_TABLE_METHODSPEC]; + guint32 data [MONO_METHODSPEC_SIZE]; + int i; + + for (i = 0; i < table->rows; ++i) { + mono_metadata_decode_row (table, i, data, MONO_METHODSPEC_SIZE); + if (!is_valid_methodspec_blog (ctx, data [MONO_METHODSPEC_SIGNATURE])) ADD_ERROR (ctx, g_strdup_printf ("MethodSpec table row %d has invalid Instantiation token %08x", i, data [MONO_METHODSPEC_SIGNATURE])); } @@ -2946,15 +3262,6 @@ verify_tables_data (VerifyContext *ctx) verify_generic_param_constraint_table (ctx); } -static gboolean -mono_verifier_is_corlib (MonoImage *image) -{ - gboolean trusted_location = (mono_security_get_mode () != MONO_SECURITY_MODE_CORE_CLR) ? - TRUE : mono_security_core_clr_is_platform_image (image); - - return trusted_location && !strcmp ("mscorlib.dll", image->name); -} - static void init_verify_context (VerifyContext *ctx, MonoImage *image, GSList **error_list) { @@ -2964,7 +3271,6 @@ init_verify_context (VerifyContext *ctx, MonoImage *image, GSList **error_list) ctx->valid = 1; ctx->size = image->raw_data_len; ctx->data = image->raw_data; - ctx->is_corlib = mono_verifier_is_corlib (image); } static gboolean @@ -3029,6 +3335,18 @@ cleanup: return cleanup_context (&ctx, error_list); } + +/* + * Verifies basic table constraints such as global table invariants (sorting, field monotonicity, etc). + * Other verification checks are meant to be done lazily by the runtime. Those include: + * blob items (signatures, method headers, custom attributes, etc) + * type semantics related + * vtable related + * stuff that should not block other pieces from running such as bad types/methods/fields/etc. + * + * The whole idea is that if this succeed the runtime is free to play around safely but any complex + * operation still need more checking. + */ gboolean mono_verifier_verify_table_data (MonoImage *image, GSList **error_list) { @@ -3044,6 +3362,153 @@ mono_verifier_verify_table_data (MonoImage *image, GSList **error_list) return cleanup_context (&ctx, error_list); } + + +/* + * Verifies all other constraints. + */ +gboolean +mono_verifier_verify_full_table_data (MonoImage *image, GSList **error_list) +{ + VerifyContext ctx; + + if (!mono_verifier_is_enabled_for_image (image)) + return TRUE; + + init_verify_context (&ctx, image, error_list); + ctx.stage = STAGE_TABLES; + + verify_typedef_table_full (&ctx); + CHECK_STATE (); + verify_field_table_full (&ctx); + CHECK_STATE (); + verify_method_table_full (&ctx); + CHECK_STATE (); + verify_memberref_table_full (&ctx); + CHECK_STATE (); + verify_cattr_table_full (&ctx); + CHECK_STATE (); + verify_field_marshal_table_full (&ctx); + CHECK_STATE (); + verify_decl_security_table_full (&ctx); + CHECK_STATE (); + verify_standalonesig_table_full (&ctx); + CHECK_STATE (); + verify_event_table_full (&ctx); + CHECK_STATE (); + verify_typespec_table_full (&ctx); + CHECK_STATE (); + verify_method_spec_table_full (&ctx); + +cleanup: + return cleanup_context (&ctx, error_list); +} + +gboolean +mono_verifier_verify_field_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + VerifyContext ctx; + + if (!mono_verifier_is_enabled_for_image (image)) + return TRUE; + + init_verify_context (&ctx, image, error_list); + ctx.stage = STAGE_TABLES; + + is_valid_field_signature (&ctx, offset); + return cleanup_context (&ctx, error_list); +} + +gboolean +mono_verifier_verify_method_header (MonoImage *image, guint32 offset, GSList **error_list) +{ + VerifyContext ctx; + + if (!mono_verifier_is_enabled_for_image (image)) + return TRUE; + + init_verify_context (&ctx, image, error_list); + ctx.stage = STAGE_TABLES; + + is_valid_method_header (&ctx, offset); + return cleanup_context (&ctx, error_list); +} + +gboolean +mono_verifier_verify_method_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + VerifyContext ctx; + + if (!mono_verifier_is_enabled_for_image (image)) + return TRUE; + + init_verify_context (&ctx, image, error_list); + ctx.stage = STAGE_TABLES; + + is_valid_method_signature (&ctx, offset); + return cleanup_context (&ctx, error_list); +} + +gboolean +mono_verifier_verify_memberref_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + VerifyContext ctx; + + if (!mono_verifier_is_enabled_for_image (image)) + return TRUE; + + init_verify_context (&ctx, image, error_list); + ctx.stage = STAGE_TABLES; + + is_valid_method_or_field_signature (&ctx, offset); + return cleanup_context (&ctx, error_list); +} + +gboolean +mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + VerifyContext ctx; + + if (!mono_verifier_is_enabled_for_image (image)) + return TRUE; + + init_verify_context (&ctx, image, error_list); + ctx.stage = STAGE_TABLES; + + is_valid_standalonesig_blob (&ctx, offset); + return cleanup_context (&ctx, error_list); +} + +gboolean +mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + VerifyContext ctx; + + if (!mono_verifier_is_enabled_for_image (image)) + return TRUE; + + init_verify_context (&ctx, image, error_list); + ctx.stage = STAGE_TABLES; + + is_valid_typespec_blob (&ctx, offset); + return cleanup_context (&ctx, error_list); +} + +gboolean +mono_verifier_verify_methodspec_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + VerifyContext ctx; + + if (!mono_verifier_is_enabled_for_image (image)) + return TRUE; + + init_verify_context (&ctx, image, error_list); + ctx.stage = STAGE_TABLES; + + is_valid_methodspec_blog (&ctx, offset); + return cleanup_context (&ctx, error_list); +} + #else gboolean mono_verifier_verify_table_data (MonoImage *image, GSList **error_list) @@ -3062,4 +3527,53 @@ mono_verifier_verify_pe_data (MonoImage *image, GSList **error_list) { return TRUE; } + +gboolean +mono_verifier_verify_full_table_data (MonoImage *image, GSList **error_list) +{ + return TRUE; +} + +gboolean +mono_verifier_verify_field_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + return TRUE; +} + +gboolean +mono_verifier_verify_method_header (MonoImage *image, guint32 offset, GSList **error_list) +{ + return TRUE; +} + +gboolean +mono_verifier_verify_method_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + return TRUE; +} + +gboolean +mono_verifier_verify_memberref_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + return TRUE; +} + +gboolean +mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + return TRUE; +} + +gboolean +mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + return TRUE; +} + +gboolean +mono_verifier_verify_methodspec_signature (MonoImage *image, guint32 offset, GSList **error_list) +{ + return TRUE; +} + #endif /* DISABLE_VERIFIER */ diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c index 2a5db3c9730..3ac1a5a54f6 100644 --- a/mono/metadata/metadata.c +++ b/mono/metadata/metadata.c @@ -24,6 +24,7 @@ #include "tokentype.h" #include "metadata-internals.h" #include "class-internals.h" +#include "verify-internals.h" #include "class.h" #include "marshal.h" @@ -1506,11 +1507,12 @@ mono_metadata_init (void) void mono_metadata_cleanup (void) { + /* Has to free this first, as it could reference data in the other caches */ + if (generic_method_cache) + g_hash_table_destroy (generic_method_cache); g_hash_table_destroy (type_cache); g_hash_table_destroy (generic_inst_cache); g_hash_table_destroy (generic_class_cache); - if (generic_method_cache) - g_hash_table_destroy (generic_method_cache); if (generic_signature_cache) g_hash_table_destroy (generic_signature_cache); type_cache = NULL; @@ -2982,6 +2984,10 @@ mono_metadata_parse_mh_full (MonoImage *m, MonoGenericContainer *container, cons int len=0, i, bsize; mono_metadata_decode_row (t, (local_var_sig_tok & 0xffffff)-1, cols, 1); + + if (!mono_verifier_verify_standalone_signature (m, cols [MONO_STAND_ALONE_SIGNATURE], NULL)) + return NULL; + locals_ptr = mono_metadata_blob_heap (m, cols [MONO_STAND_ALONE_SIGNATURE]); bsize = mono_metadata_decode_blob_size (locals_ptr, &locals_ptr); if (*locals_ptr != 0x07) @@ -4639,6 +4645,12 @@ mono_type_create_from_typespec (MonoImage *image, guint32 type_spec) mono_metadata_decode_row (t, idx-1, cols, MONO_TYPESPEC_SIZE); ptr = mono_metadata_blob_heap (image, cols [MONO_TYPESPEC_SIGNATURE]); + + if (!mono_verifier_verify_typespec_signature (image, cols [MONO_TYPESPEC_SIGNATURE], NULL)) { + mono_loader_unlock (); + return NULL; + } + len = mono_metadata_decode_value (ptr, &ptr); type = mono_image_alloc0 (image, sizeof (MonoType)); diff --git a/mono/metadata/mono-debug.h b/mono/metadata/mono-debug.h index 2baf72c0d3b..32d6dfcd25f 100644 --- a/mono/metadata/mono-debug.h +++ b/mono/metadata/mono-debug.h @@ -129,7 +129,7 @@ struct _MonoDebugVarInfo { }; #define MONO_DEBUGGER_MAJOR_VERSION 81 -#define MONO_DEBUGGER_MINOR_VERSION 1 +#define MONO_DEBUGGER_MINOR_VERSION 3 #define MONO_DEBUGGER_MAGIC 0x7aff65af4253d427ULL extern MonoSymbolTable *mono_symbol_table; diff --git a/mono/metadata/normalization-tables.h b/mono/metadata/normalization-tables.h index 1114136e880..82c36d3d7ea 100644 --- a/mono/metadata/normalization-tables.h +++ b/mono/metadata/normalization-tables.h @@ -252,6 +252,38 @@ static const guint8 props [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,128,3,128,3,128,3,128,3,128,3,0, +0,128,3,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,168,0,0,0,0,128,3,128,3,128,128, +3,3,128,3,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,18,18,18,0, @@ -399,6 +431,7 @@ static const guint8 props [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,87,128,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,18,18,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -487,6 +520,7 @@ static const guint8 props [] = { 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, +18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87, 87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87, 87,87,87,87,87,87,87,87,87,87,87,87,87,87,87,87, @@ -960,186 +994,188 @@ static const guint32 mappedChars [] = { 4497,0,4498,0,4500,0,4510,0,4513,0,4522,0,4524,0,4525,0, 4528,0,4529,0,4530,0,4531,0,4532,0,4533,0,4551,0,4552,0, 4556,0,4558,0,4563,0,4567,0,4569,0,4573,0,4575,0,4593,0, -4594,0,7426,0,7446,0,7447,0,7452,0,7453,0,7461,0,7547,0, -7557,0,7734,772,0,7735,772,0,7770,772,0,7771,772,0,7778,775, -0,7779,775,0,7840,770,0,7840,774,0,7841,770,0,7841,774,0, -7864,770,0,7865,770,0,7884,770,0,7885,770,0,7936,768,0,7936, -769,0,7936,834,0,7936,837,0,7937,768,0,7937,769,0,7937,834, -0,7937,837,0,7938,837,0,7939,837,0,7940,837,0,7941,837,0, -7942,837,0,7943,837,0,7944,768,0,7944,769,0,7944,834,0,7944, -837,0,7945,768,0,7945,769,0,7945,834,0,7945,837,0,7946,837, -0,7947,837,0,7948,837,0,7949,837,0,7950,837,0,7951,837,0, -7952,768,0,7952,769,0,7953,768,0,7953,769,0,7960,768,0,7960, -769,0,7961,768,0,7961,769,0,7968,768,0,7968,769,0,7968,834, -0,7968,837,0,7969,768,0,7969,769,0,7969,834,0,7969,837,0, -7970,837,0,7971,837,0,7972,837,0,7973,837,0,7974,837,0,7975, -837,0,7976,768,0,7976,769,0,7976,834,0,7976,837,0,7977,768, -0,7977,769,0,7977,834,0,7977,837,0,7978,837,0,7979,837,0, -7980,837,0,7981,837,0,7982,837,0,7983,837,0,7984,768,0,7984, -769,0,7984,834,0,7985,768,0,7985,769,0,7985,834,0,7992,768, -0,7992,769,0,7992,834,0,7993,768,0,7993,769,0,7993,834,0, -8000,768,0,8000,769,0,8001,768,0,8001,769,0,8008,768,0,8008, -769,0,8009,768,0,8009,769,0,8016,768,0,8016,769,0,8016,834, -0,8017,768,0,8017,769,0,8017,834,0,8025,768,0,8025,769,0, -8025,834,0,8032,768,0,8032,769,0,8032,834,0,8032,837,0,8033, -768,0,8033,769,0,8033,834,0,8033,837,0,8034,837,0,8035,837, -0,8036,837,0,8037,837,0,8038,837,0,8039,837,0,8040,768,0, -8040,769,0,8040,834,0,8040,837,0,8041,768,0,8041,769,0,8041, -834,0,8041,837,0,8042,837,0,8043,837,0,8044,837,0,8045,837, -0,8046,837,0,8047,837,0,8048,837,0,8052,837,0,8060,837,0, -8118,837,0,8127,768,0,8127,769,0,8127,834,0,8134,837,0,8182, -837,0,8190,768,0,8190,769,0,8190,834,0,8194,0,8195,0,8208, -0,8211,0,8212,0,8229,0,8230,0,8242,8242,0,8242,8242,8242,0, -8242,8242,8242,8242,0,8245,8245,0,8245,8245,8245,0,8254,0,8361,0, -8592,0,8592,824,0,8593,0,8594,0,8594,824,0,8595,0,8596,824, -0,8656,824,0,8658,824,0,8660,824,0,8707,824,0,8712,824,0, -8715,824,0,8721,0,8722,0,8739,824,0,8741,824,0,8747,8747,0, -8747,8747,8747,0,8747,8747,8747,8747,0,8750,8750,0,8750,8750,8750,0, -8764,824,0,8771,824,0,8773,824,0,8776,824,0,8781,824,0,8801, -824,0,8804,824,0,8805,824,0,8818,824,0,8819,824,0,8822,824, -0,8823,824,0,8826,824,0,8827,824,0,8828,824,0,8829,824,0, -8834,824,0,8835,824,0,8838,824,0,8839,824,0,8849,824,0,8850, -824,0,8866,824,0,8872,824,0,8873,824,0,8875,824,0,8882,824, -0,8883,824,0,8884,824,0,8885,824,0,9474,0,9632,0,9675,0, -10629,0,10630,0,10973,824,0,11617,0,12289,0,12290,0,12296,0,12297, -0,12298,0,12299,0,12300,0,12301,0,12302,0,12303,0,12304,0,12305, -0,12306,0,12308,0,12309,0,12310,0,12311,0,12358,12441,0,12363,12441, -0,12365,12441,0,12367,12441,0,12369,12441,0,12371,12441,0,12373,12441,0, -12375,12441,0,12377,12441,0,12379,12441,0,12381,12441,0,12383,12441,0,12385, -12441,0,12388,12441,0,12390,12441,0,12392,12441,0,12399,12441,0,12399,12442, -0,12402,12441,0,12402,12442,0,12405,12441,0,12405,12442,0,12408,12441,0, -12408,12442,0,12411,12441,0,12411,12442,0,12424,12426,0,12441,0,12442,0, -12445,12441,0,12449,0,12450,0,12450,12497,12540,12488,0,12450,12523,12501,12449, -0,12450,12531,12506,12450,0,12450,12540,12523,0,12451,0,12452,0,12452,12491, -12531,12464,0,12452,12531,12481,0,12453,0,12454,0,12454,12441,0,12454,12457, -12531,0,12455,0,12456,0,12456,12473,12463,12540,12489,0,12456,12540,12459,12540, -0,12457,0,12458,0,12458,12531,12473,0,12458,12540,12512,0,12459,0,12459, -12441,0,12459,12452,12522,0,12459,12521,12483,12488,0,12459,12525,12522,12540,0, -12460,12525,12531,0,12460,12531,12510,0,12461,0,12461,12441,0,12461,12517,12522, -12540,0,12461,12525,0,12461,12525,12464,12521,12512,0,12461,12525,12513,12540,12488, -12523,0,12461,12525,12527,12483,12488,0,12462,12460,0,12462,12491,12540,0,12462, -12523,12480,12540,0,12463,0,12463,12441,0,12463,12523,12476,12452,12525,0,12463, -12525,12540,12493,0,12464,12521,12512,0,12464,12521,12512,12488,12531,0,12465,0, -12465,12441,0,12465,12540,12473,0,12467,0,12467,12441,0,12467,12488,0,12467, -12523,12490,0,12467,12540,12509,0,12469,0,12469,12441,0,12469,12452,12463,12523, -0,12469,12531,12481,12540,12512,0,12471,0,12471,12441,0,12471,12522,12531,12464, -0,12473,0,12473,12441,0,12475,0,12475,12441,0,12475,12531,12481,0,12475, -12531,12488,0,12477,0,12477,12441,0,12479,0,12479,12441,0,12480,12540,12473, -0,12481,0,12481,12441,0,12483,0,12484,0,12484,12441,0,12486,0,12486, -12441,0,12487,12471,0,12488,0,12488,12441,0,12488,12531,0,12489,12523,0, -12490,0,12490,12494,0,12491,0,12492,0,12493,0,12494,0,12494,12483,12488, -0,12495,0,12495,12441,0,12495,12442,0,12495,12452,12484,0,12496,12540,12524, -12523,0,12497,12540,12475,12531,12488,0,12497,12540,12484,0,12498,0,12498,12441, -0,12498,12442,0,12499,12523,0,12500,12450,12473,12488,12523,0,12500,12463,12523, -0,12500,12467,0,12501,0,12501,12441,0,12501,12442,0,12501,12449,12521,12483, -12489,0,12501,12451,12540,12488,0,12501,12521,12531,0,12502,12483,12471,12455,12523, -0,12504,0,12504,12441,0,12504,12442,0,12504,12463,12479,12540,12523,0,12504, -12523,12484,0,12505,12540,12479,0,12506,12477,0,12506,12491,12498,0,12506,12531, -12473,0,12506,12540,12472,0,12507,0,12507,12441,0,12507,12442,0,12507,12531, -0,12507,12540,12523,0,12507,12540,12531,0,12508,12523,12488,0,12509,12452,12531, -12488,0,12509,12531,12489,0,12510,0,12510,12452,12463,12525,0,12510,12452,12523, -0,12510,12483,12495,0,12510,12523,12463,0,12510,12531,12471,12519,12531,0,12511, -0,12511,12463,12525,12531,0,12511,12522,0,12511,12522,12496,12540,12523,0,12512, -0,12513,0,12513,12460,0,12513,12460,12488,12531,0,12513,12540,12488,12523,0, -12514,0,12515,0,12516,0,12516,12540,12489,0,12516,12540,12523,0,12517,0, -12518,0,12518,12450,12531,0,12519,0,12520,0,12521,0,12522,0,12522,12483, -12488,12523,0,12522,12521,0,12523,0,12523,12500,12540,0,12523,12540,12502,12523, -0,12524,0,12524,12512,0,12524,12531,12488,12466,12531,0,12525,0,12527,0, -12527,12441,0,12527,12483,12488,0,12528,0,12528,12441,0,12529,0,12529,12441, -0,12530,0,12530,12441,0,12531,0,12539,0,12540,0,12541,12441,0,12593, -0,12594,0,12595,0,12596,0,12597,0,12598,0,12599,0,12600,0,12601, -0,12602,0,12603,0,12604,0,12605,0,12606,0,12607,0,12608,0,12609, -0,12610,0,12611,0,12612,0,12613,0,12614,0,12615,0,12616,0,12617, -0,12618,0,12619,0,12620,0,12621,0,12622,0,12623,0,12624,0,12625, -0,12626,0,12627,0,12628,0,12629,0,12630,0,12631,0,12632,0,12633, -0,12634,0,12635,0,12636,0,12637,0,12638,0,12639,0,12640,0,12641, -0,12642,0,12643,0,12644,0,15261,0,16408,0,16441,0,19968,0,19969, -0,19971,0,19977,0,19978,0,19979,0,19981,0,19993,0,20006,0,20008, -0,20013,0,20018,0,20022,0,20025,0,20031,0,20057,0,20061,0,20098, -0,20101,0,20102,0,20108,0,20116,0,20128,0,20142,0,20154,0,20160, -0,20196,0,20225,0,20241,0,20352,0,20358,0,20363,0,20398,0,20415, -0,20523,0,20698,0,20711,0,20778,0,20799,0,20800,0,20805,0,20813, -0,20837,0,20840,0,20841,0,20843,0,20845,0,20864,0,20866,0,20886, -0,20889,0,20907,0,20917,0,20919,0,20937,0,20940,0,20956,0,20958, -0,20960,0,20981,0,20992,0,20999,0,21015,0,21033,0,21050,0,21129, -0,21147,0,21155,0,21172,0,21191,0,21193,0,21202,0,21214,0,21220, -0,21237,0,21241,0,21242,0,21269,0,21271,0,21274,0,21304,0,21307, -0,21311,0,21313,0,21316,0,21317,0,21329,0,21332,0,21340,0,21353, -0,21360,0,21365,0,21378,0,21430,0,21443,0,21448,0,21475,0,21477, -0,21491,0,21517,0,21519,0,21533,0,21570,0,21693,0,21845,0,21895, -0,21913,0,21917,0,21952,0,21986,0,22022,0,22120,0,22231,0,22235, -0,22265,0,22303,0,22320,0,22592,0,22618,0,22622,0,22696,0,22707, -0,22744,0,22751,0,22763,0,22786,0,22794,0,22805,0,22812,0,22823, -0,22823,27491,0,22825,0,22852,0,22856,0,22865,0,22868,0,22899,0, -23138,0,23336,0,23376,0,23398,0,23424,0,23429,0,23447,0,23527,0, -23534,0,23544,0,23567,0,23586,0,23608,0,23615,0,23650,0,23652,0, -23653,0,23662,0,23665,0,23833,0,23888,0,23994,0,24027,0,24037,0, -24038,0,24049,0,24062,0,24178,0,24179,25104,0,24180,0,24186,0,24191, -0,24230,0,24265,0,24266,0,24274,0,24275,0,24281,0,24300,0,24308, -0,24318,0,24324,0,24331,0,24339,0,24400,0,24417,0,24425,0,24435, -0,24459,0,24489,0,24493,0,24515,0,24565,0,24594,0,24604,0,24724, -0,24792,0,24801,0,24840,0,24900,0,24910,0,24928,0,24936,0,24974, -0,24976,0,25074,0,25078,0,25088,0,25096,0,25134,0,25140,0,25142, -0,25163,0,25289,0,25295,0,25299,0,25342,0,25467,0,25504,0,25540, -0,25628,0,25682,0,25754,0,25796,0,25903,0,25908,0,25935,0,25942, -0,25976,0,25991,0,26007,0,26009,0,26020,0,26041,0,26053,0,26080, -0,26082,0,26085,0,26126,27835,0,26131,0,26157,21644,0,26228,0,26248, -0,26257,0,26292,0,26310,0,26352,0,26356,0,26376,0,26377,0,26391, -0,26395,0,26408,0,26446,0,26454,0,26491,0,26519,0,26611,0,26647, -0,26666,0,26666,24335,20250,31038,0,26753,0,26757,0,26792,0,27138,0, -27155,0,27347,0,27396,0,27424,0,27490,0,27491,0,27511,0,27513,0, -27566,0,27571,0,27578,0,27595,0,27597,0,27604,0,27611,0,27663,0, -27668,0,27700,0,27784,0,27852,0,27877,0,27880,0,27931,0,27934,0, -27969,0,28010,0,28023,0,28107,0,28122,0,28138,0,28186,0,28316,0, -28346,0,28363,0,28369,0,28379,0,28431,0,28450,0,28451,0,28651,0, -28670,0,28702,0,28779,0,28825,0,28872,0,28889,0,29001,0,29038,0, -29134,0,29136,0,29200,0,29211,0,29226,0,29227,0,29237,0,29238,0, -29243,0,29247,0,29255,0,29273,0,29275,0,29282,0,29305,0,29356,0, -29359,0,29376,0,29436,0,29482,0,29557,0,29572,0,29575,0,29577,0, -29618,0,29662,0,29702,0,29705,0,29730,0,29801,0,29809,0,29833,0, -29848,0,29916,0,29926,0,29958,0,29976,0,29983,0,29992,0,30000,0, -30002,0,30007,0,30011,0,30041,0,30053,0,30064,0,30091,0,30098,0, -30178,0,30237,0,30239,0,30274,0,30313,0,30326,0,30333,0,30382,0, -30399,0,30410,0,30427,0,30435,0,30439,0,30446,0,30452,0,30465,0, -30528,0,30538,0,30631,0,30683,0,30690,0,30707,0,30827,0,30860,0, -30865,0,30922,0,30924,0,30971,0,31018,0,31034,0,31036,0,31038,0, -31048,0,31049,0,31056,0,31062,0,31069,0,31070,0,31077,0,31103,0, -31117,0,31118,0,31119,0,31150,0,31160,0,31166,0,31178,0,31192,0, -31260,0,31296,0,31348,0,31361,0,31409,0,31435,0,31481,0,31520,0, -31680,0,31806,0,31840,0,31859,0,31867,0,31890,0,31934,0,31958,0, -31975,0,31992,0,32016,0,32034,0,32047,0,32091,0,32160,0,32190,0, -32244,0,32265,0,32311,0,32321,0,32566,0,32574,0,32593,0,32626,0, -32633,0,32645,0,32650,0,32666,0,32701,0,32769,0,32773,0,32780,0, -32786,0,32819,0,32838,0,32879,0,32894,0,32895,0,32905,0,32907,0, -33240,0,33251,0,33256,0,33258,0,33261,0,33267,0,33276,0,33292,0, -33307,0,33311,0,33390,0,33391,0,33394,0,33400,0,33401,0,33509,0, -33590,0,33618,0,33737,0,33775,0,33777,0,33853,0,33865,0,33879,0, -34030,0,34044,0,34253,0,34298,0,34310,0,34322,0,34349,0,34367,0, -34381,0,34396,0,34411,0,34681,0,34746,0,34847,0,34880,0,34892,0, -34915,0,35010,0,35023,0,35041,0,35064,0,35088,0,35137,0,35172,0, -35198,0,35206,0,35211,0,35222,0,35282,0,35328,0,35498,0,35519,0, -35531,0,35538,0,35542,0,35565,0,35576,0,35582,0,35585,0,35641,0, -35672,0,35712,0,35722,0,35895,0,35910,0,35912,0,35925,0,35960,0, -35997,0,36001,0,36034,0,36039,0,36040,0,36051,0,36104,0,36196,0, -36208,0,36275,0,36335,0,36523,0,36554,0,36646,0,36650,0,36664,0, -36667,0,36706,0,36763,0,36784,0,36789,0,36790,0,36899,0,36920,0, -36969,0,36978,0,36988,0,37007,0,37009,0,37070,0,37117,0,37193,0, -37226,0,37273,0,37300,0,37318,0,37324,0,37327,0,37329,0,37428,0, -37494,0,37636,0,37706,0,38263,0,38272,0,38317,0,38428,0,38446,0, -38475,0,38477,0,38517,0,38520,0,38524,0,38534,0,38563,0,38582,0, -38584,0,38585,0,38626,0,38627,0,38632,0,38646,0,38647,0,38706,0, -38728,0,38737,0,38742,0,38750,0,38754,0,38761,0,38859,0,38875,0, -38893,0,38899,0,38911,0,38913,0,38917,0,38923,0,38936,0,38971,0, -39006,0,39080,0,39131,0,39135,0,39151,0,39164,0,39208,0,39318,0, -39321,0,39340,0,39409,0,39530,0,39592,0,39640,0,39647,0,39698,0, -39717,0,39727,0,39730,0,39740,0,39770,0,39791,0,40023,0,40165,0, -40372,0,40442,0,40478,0,40565,0,40575,0,40599,0,40607,0,40613,0, -40635,0,40643,0,40653,0,40654,0,40657,0,40697,0,40701,0,40718,0, -40723,0,40736,0,40763,0,40771,0,40778,0,40786,0,40845,0,40846,0, -40860,0,40863,0,40864,0,64329,1473,0,64329,1474,0,141380,0,141386,0, -144341,0,152137,0,154832,0,163539,0,0}; +4594,0,6917,6965,0,6919,6965,0,6921,6965,0,6923,6965,0,6925,6965, +0,6929,6965,0,6970,6965,0,6972,6965,0,6974,6965,0,6975,6965,0, +6978,6965,0,7426,0,7446,0,7447,0,7452,0,7453,0,7461,0,7547, +0,7557,0,7734,772,0,7735,772,0,7770,772,0,7771,772,0,7778, +775,0,7779,775,0,7840,770,0,7840,774,0,7841,770,0,7841,774, +0,7864,770,0,7865,770,0,7884,770,0,7885,770,0,7936,768,0, +7936,769,0,7936,834,0,7936,837,0,7937,768,0,7937,769,0,7937, +834,0,7937,837,0,7938,837,0,7939,837,0,7940,837,0,7941,837, +0,7942,837,0,7943,837,0,7944,768,0,7944,769,0,7944,834,0, +7944,837,0,7945,768,0,7945,769,0,7945,834,0,7945,837,0,7946, +837,0,7947,837,0,7948,837,0,7949,837,0,7950,837,0,7951,837, +0,7952,768,0,7952,769,0,7953,768,0,7953,769,0,7960,768,0, +7960,769,0,7961,768,0,7961,769,0,7968,768,0,7968,769,0,7968, +834,0,7968,837,0,7969,768,0,7969,769,0,7969,834,0,7969,837, +0,7970,837,0,7971,837,0,7972,837,0,7973,837,0,7974,837,0, +7975,837,0,7976,768,0,7976,769,0,7976,834,0,7976,837,0,7977, +768,0,7977,769,0,7977,834,0,7977,837,0,7978,837,0,7979,837, +0,7980,837,0,7981,837,0,7982,837,0,7983,837,0,7984,768,0, +7984,769,0,7984,834,0,7985,768,0,7985,769,0,7985,834,0,7992, +768,0,7992,769,0,7992,834,0,7993,768,0,7993,769,0,7993,834, +0,8000,768,0,8000,769,0,8001,768,0,8001,769,0,8008,768,0, +8008,769,0,8009,768,0,8009,769,0,8016,768,0,8016,769,0,8016, +834,0,8017,768,0,8017,769,0,8017,834,0,8025,768,0,8025,769, +0,8025,834,0,8032,768,0,8032,769,0,8032,834,0,8032,837,0, +8033,768,0,8033,769,0,8033,834,0,8033,837,0,8034,837,0,8035, +837,0,8036,837,0,8037,837,0,8038,837,0,8039,837,0,8040,768, +0,8040,769,0,8040,834,0,8040,837,0,8041,768,0,8041,769,0, +8041,834,0,8041,837,0,8042,837,0,8043,837,0,8044,837,0,8045, +837,0,8046,837,0,8047,837,0,8048,837,0,8052,837,0,8060,837, +0,8118,837,0,8127,768,0,8127,769,0,8127,834,0,8134,837,0, +8182,837,0,8190,768,0,8190,769,0,8190,834,0,8194,0,8195,0, +8208,0,8211,0,8212,0,8229,0,8230,0,8242,8242,0,8242,8242,8242, +0,8242,8242,8242,8242,0,8245,8245,0,8245,8245,8245,0,8254,0,8361, +0,8592,0,8592,824,0,8593,0,8594,0,8594,824,0,8595,0,8596, +824,0,8656,824,0,8658,824,0,8660,824,0,8707,824,0,8712,824, +0,8715,824,0,8721,0,8722,0,8739,824,0,8741,824,0,8747,8747, +0,8747,8747,8747,0,8747,8747,8747,8747,0,8750,8750,0,8750,8750,8750, +0,8764,824,0,8771,824,0,8773,824,0,8776,824,0,8781,824,0, +8801,824,0,8804,824,0,8805,824,0,8818,824,0,8819,824,0,8822, +824,0,8823,824,0,8826,824,0,8827,824,0,8828,824,0,8829,824, +0,8834,824,0,8835,824,0,8838,824,0,8839,824,0,8849,824,0, +8850,824,0,8866,824,0,8872,824,0,8873,824,0,8875,824,0,8882, +824,0,8883,824,0,8884,824,0,8885,824,0,9474,0,9632,0,9675, +0,10629,0,10630,0,10973,824,0,11617,0,12289,0,12290,0,12296,0, +12297,0,12298,0,12299,0,12300,0,12301,0,12302,0,12303,0,12304,0, +12305,0,12306,0,12308,0,12309,0,12310,0,12311,0,12358,12441,0,12363, +12441,0,12365,12441,0,12367,12441,0,12369,12441,0,12371,12441,0,12373,12441, +0,12375,12441,0,12377,12441,0,12379,12441,0,12381,12441,0,12383,12441,0, +12385,12441,0,12388,12441,0,12390,12441,0,12392,12441,0,12399,12441,0,12399, +12442,0,12402,12441,0,12402,12442,0,12405,12441,0,12405,12442,0,12408,12441, +0,12408,12442,0,12411,12441,0,12411,12442,0,12424,12426,0,12441,0,12442, +0,12445,12441,0,12449,0,12450,0,12450,12497,12540,12488,0,12450,12523,12501, +12449,0,12450,12531,12506,12450,0,12450,12540,12523,0,12451,0,12452,0,12452, +12491,12531,12464,0,12452,12531,12481,0,12453,0,12454,0,12454,12441,0,12454, +12457,12531,0,12455,0,12456,0,12456,12473,12463,12540,12489,0,12456,12540,12459, +12540,0,12457,0,12458,0,12458,12531,12473,0,12458,12540,12512,0,12459,0, +12459,12441,0,12459,12452,12522,0,12459,12521,12483,12488,0,12459,12525,12522,12540, +0,12460,12525,12531,0,12460,12531,12510,0,12461,0,12461,12441,0,12461,12517, +12522,12540,0,12461,12525,0,12461,12525,12464,12521,12512,0,12461,12525,12513,12540, +12488,12523,0,12461,12525,12527,12483,12488,0,12462,12460,0,12462,12491,12540,0, +12462,12523,12480,12540,0,12463,0,12463,12441,0,12463,12523,12476,12452,12525,0, +12463,12525,12540,12493,0,12464,12521,12512,0,12464,12521,12512,12488,12531,0,12465, +0,12465,12441,0,12465,12540,12473,0,12467,0,12467,12441,0,12467,12488,0, +12467,12523,12490,0,12467,12540,12509,0,12469,0,12469,12441,0,12469,12452,12463, +12523,0,12469,12531,12481,12540,12512,0,12471,0,12471,12441,0,12471,12522,12531, +12464,0,12473,0,12473,12441,0,12475,0,12475,12441,0,12475,12531,12481,0, +12475,12531,12488,0,12477,0,12477,12441,0,12479,0,12479,12441,0,12480,12540, +12473,0,12481,0,12481,12441,0,12483,0,12484,0,12484,12441,0,12486,0, +12486,12441,0,12487,12471,0,12488,0,12488,12441,0,12488,12531,0,12489,12523, +0,12490,0,12490,12494,0,12491,0,12492,0,12493,0,12494,0,12494,12483, +12488,0,12495,0,12495,12441,0,12495,12442,0,12495,12452,12484,0,12496,12540, +12524,12523,0,12497,12540,12475,12531,12488,0,12497,12540,12484,0,12498,0,12498, +12441,0,12498,12442,0,12499,12523,0,12500,12450,12473,12488,12523,0,12500,12463, +12523,0,12500,12467,0,12501,0,12501,12441,0,12501,12442,0,12501,12449,12521, +12483,12489,0,12501,12451,12540,12488,0,12501,12521,12531,0,12502,12483,12471,12455, +12523,0,12504,0,12504,12441,0,12504,12442,0,12504,12463,12479,12540,12523,0, +12504,12523,12484,0,12505,12540,12479,0,12506,12477,0,12506,12491,12498,0,12506, +12531,12473,0,12506,12540,12472,0,12507,0,12507,12441,0,12507,12442,0,12507, +12531,0,12507,12540,12523,0,12507,12540,12531,0,12508,12523,12488,0,12509,12452, +12531,12488,0,12509,12531,12489,0,12510,0,12510,12452,12463,12525,0,12510,12452, +12523,0,12510,12483,12495,0,12510,12523,12463,0,12510,12531,12471,12519,12531,0, +12511,0,12511,12463,12525,12531,0,12511,12522,0,12511,12522,12496,12540,12523,0, +12512,0,12513,0,12513,12460,0,12513,12460,12488,12531,0,12513,12540,12488,12523, +0,12514,0,12515,0,12516,0,12516,12540,12489,0,12516,12540,12523,0,12517, +0,12518,0,12518,12450,12531,0,12519,0,12520,0,12521,0,12522,0,12522, +12483,12488,12523,0,12522,12521,0,12523,0,12523,12500,12540,0,12523,12540,12502, +12523,0,12524,0,12524,12512,0,12524,12531,12488,12466,12531,0,12525,0,12527, +0,12527,12441,0,12527,12483,12488,0,12528,0,12528,12441,0,12529,0,12529, +12441,0,12530,0,12530,12441,0,12531,0,12539,0,12540,0,12541,12441,0, +12593,0,12594,0,12595,0,12596,0,12597,0,12598,0,12599,0,12600,0, +12601,0,12602,0,12603,0,12604,0,12605,0,12606,0,12607,0,12608,0, +12609,0,12610,0,12611,0,12612,0,12613,0,12614,0,12615,0,12616,0, +12617,0,12618,0,12619,0,12620,0,12621,0,12622,0,12623,0,12624,0, +12625,0,12626,0,12627,0,12628,0,12629,0,12630,0,12631,0,12632,0, +12633,0,12634,0,12635,0,12636,0,12637,0,12638,0,12639,0,12640,0, +12641,0,12642,0,12643,0,12644,0,15261,0,16408,0,16441,0,19968,0, +19969,0,19971,0,19977,0,19978,0,19979,0,19981,0,19993,0,20006,0, +20008,0,20013,0,20018,0,20022,0,20025,0,20031,0,20057,0,20061,0, +20098,0,20101,0,20102,0,20108,0,20116,0,20128,0,20142,0,20154,0, +20160,0,20196,0,20225,0,20241,0,20352,0,20358,0,20363,0,20398,0, +20415,0,20523,0,20698,0,20711,0,20778,0,20799,0,20800,0,20805,0, +20813,0,20837,0,20840,0,20841,0,20843,0,20845,0,20864,0,20866,0, +20886,0,20889,0,20907,0,20917,0,20919,0,20937,0,20940,0,20956,0, +20958,0,20960,0,20981,0,20992,0,20999,0,21015,0,21033,0,21050,0, +21129,0,21147,0,21155,0,21172,0,21191,0,21193,0,21202,0,21214,0, +21220,0,21237,0,21241,0,21242,0,21269,0,21271,0,21274,0,21304,0, +21307,0,21311,0,21313,0,21316,0,21317,0,21329,0,21332,0,21340,0, +21353,0,21360,0,21365,0,21378,0,21430,0,21443,0,21448,0,21475,0, +21477,0,21491,0,21517,0,21519,0,21533,0,21570,0,21693,0,21845,0, +21895,0,21913,0,21917,0,21952,0,21986,0,22022,0,22120,0,22231,0, +22235,0,22265,0,22303,0,22320,0,22592,0,22618,0,22622,0,22696,0, +22707,0,22744,0,22751,0,22763,0,22786,0,22794,0,22805,0,22812,0, +22823,0,22823,27491,0,22825,0,22852,0,22856,0,22865,0,22868,0,22899, +0,23138,0,23336,0,23376,0,23398,0,23424,0,23429,0,23447,0,23527, +0,23534,0,23544,0,23567,0,23586,0,23608,0,23615,0,23650,0,23652, +0,23653,0,23662,0,23665,0,23833,0,23888,0,23994,0,24027,0,24037, +0,24038,0,24049,0,24062,0,24178,0,24179,25104,0,24180,0,24186,0, +24191,0,24230,0,24265,0,24266,0,24274,0,24275,0,24281,0,24300,0, +24308,0,24318,0,24324,0,24331,0,24339,0,24400,0,24417,0,24425,0, +24435,0,24459,0,24489,0,24493,0,24515,0,24565,0,24594,0,24604,0, +24724,0,24792,0,24801,0,24840,0,24900,0,24910,0,24928,0,24936,0, +24974,0,24976,0,25074,0,25078,0,25088,0,25096,0,25134,0,25140,0, +25142,0,25163,0,25289,0,25295,0,25299,0,25342,0,25467,0,25504,0, +25540,0,25628,0,25682,0,25754,0,25796,0,25903,0,25908,0,25935,0, +25942,0,25976,0,25991,0,26007,0,26009,0,26020,0,26041,0,26053,0, +26080,0,26082,0,26085,0,26126,27835,0,26131,0,26157,21644,0,26228,0, +26248,0,26257,0,26292,0,26310,0,26352,0,26356,0,26376,0,26377,0, +26391,0,26395,0,26408,0,26446,0,26454,0,26491,0,26519,0,26611,0, +26647,0,26666,0,26666,24335,20250,31038,0,26753,0,26757,0,26792,0,27138, +0,27155,0,27347,0,27396,0,27424,0,27490,0,27491,0,27511,0,27513, +0,27566,0,27571,0,27578,0,27595,0,27597,0,27604,0,27611,0,27663, +0,27668,0,27700,0,27784,0,27852,0,27877,0,27880,0,27931,0,27934, +0,27969,0,28010,0,28023,0,28107,0,28122,0,28138,0,28186,0,28316, +0,28346,0,28363,0,28369,0,28379,0,28431,0,28450,0,28451,0,28651, +0,28670,0,28702,0,28779,0,28825,0,28872,0,28889,0,29001,0,29038, +0,29134,0,29136,0,29200,0,29211,0,29226,0,29227,0,29237,0,29238, +0,29243,0,29247,0,29255,0,29273,0,29275,0,29282,0,29305,0,29356, +0,29359,0,29376,0,29436,0,29482,0,29557,0,29572,0,29575,0,29577, +0,29618,0,29662,0,29702,0,29705,0,29730,0,29801,0,29809,0,29833, +0,29848,0,29916,0,29926,0,29958,0,29976,0,29983,0,29992,0,30000, +0,30002,0,30007,0,30011,0,30041,0,30053,0,30064,0,30091,0,30098, +0,30178,0,30237,0,30239,0,30274,0,30313,0,30326,0,30333,0,30382, +0,30399,0,30410,0,30427,0,30435,0,30439,0,30446,0,30452,0,30465, +0,30528,0,30538,0,30631,0,30683,0,30690,0,30707,0,30827,0,30860, +0,30865,0,30922,0,30924,0,30971,0,31018,0,31034,0,31036,0,31038, +0,31048,0,31049,0,31056,0,31062,0,31069,0,31070,0,31077,0,31103, +0,31117,0,31118,0,31119,0,31150,0,31160,0,31166,0,31178,0,31192, +0,31260,0,31296,0,31348,0,31361,0,31409,0,31435,0,31481,0,31520, +0,31680,0,31806,0,31840,0,31859,0,31867,0,31890,0,31934,0,31958, +0,31975,0,31992,0,32016,0,32034,0,32047,0,32091,0,32160,0,32190, +0,32244,0,32265,0,32311,0,32321,0,32566,0,32574,0,32593,0,32626, +0,32633,0,32645,0,32650,0,32666,0,32701,0,32769,0,32773,0,32780, +0,32786,0,32819,0,32838,0,32879,0,32894,0,32895,0,32905,0,32907, +0,33240,0,33251,0,33256,0,33258,0,33261,0,33267,0,33276,0,33292, +0,33307,0,33311,0,33390,0,33391,0,33394,0,33400,0,33401,0,33509, +0,33590,0,33618,0,33737,0,33775,0,33777,0,33853,0,33865,0,33879, +0,34030,0,34044,0,34253,0,34298,0,34310,0,34322,0,34349,0,34367, +0,34381,0,34396,0,34411,0,34681,0,34746,0,34847,0,34880,0,34892, +0,34915,0,35010,0,35023,0,35041,0,35064,0,35088,0,35137,0,35172, +0,35198,0,35206,0,35211,0,35222,0,35282,0,35328,0,35498,0,35519, +0,35531,0,35538,0,35542,0,35565,0,35576,0,35582,0,35585,0,35641, +0,35672,0,35712,0,35722,0,35895,0,35910,0,35912,0,35925,0,35960, +0,35997,0,36001,0,36034,0,36039,0,36040,0,36051,0,36104,0,36196, +0,36208,0,36275,0,36335,0,36523,0,36554,0,36646,0,36650,0,36664, +0,36667,0,36706,0,36763,0,36784,0,36789,0,36790,0,36899,0,36920, +0,36969,0,36978,0,36988,0,37007,0,37009,0,37070,0,37117,0,37193, +0,37226,0,37273,0,37300,0,37318,0,37324,0,37327,0,37329,0,37428, +0,37494,0,37636,0,37706,0,38263,0,38272,0,38317,0,38428,0,38446, +0,38475,0,38477,0,38517,0,38520,0,38524,0,38534,0,38563,0,38582, +0,38584,0,38585,0,38626,0,38627,0,38632,0,38646,0,38647,0,38706, +0,38728,0,38737,0,38742,0,38750,0,38754,0,38761,0,38859,0,38875, +0,38893,0,38899,0,38911,0,38913,0,38917,0,38923,0,38936,0,38971, +0,39006,0,39080,0,39131,0,39135,0,39151,0,39164,0,39208,0,39318, +0,39321,0,39340,0,39409,0,39530,0,39592,0,39640,0,39647,0,39698, +0,39717,0,39727,0,39730,0,39740,0,39770,0,39791,0,40023,0,40165, +0,40372,0,40442,0,40478,0,40565,0,40575,0,40599,0,40607,0,40613, +0,40635,0,40643,0,40653,0,40654,0,40657,0,40697,0,40701,0,40718, +0,40723,0,40736,0,40763,0,40771,0,40778,0,40786,0,40845,0,40846, +0,40860,0,40863,0,40864,0,42863,0,64329,1473,0,64329,1474,0,141380, +0,141386,0,144341,0,152137,0,154832,0,163539,0,0}; static const guint16 charMapIndex [] = { -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +8599,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,21,0,2004,0,0,0,0,9, 0,0,841,957,3,3699,0,0,36,638,2610,0,816,808,1000,0, 1199,1202,1205,1208,1220,1226,0,1283,1325,1328,1331,1346,1475,1478,1481,1496, @@ -1368,14 +1404,14 @@ static const guint16 charMapIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,5500,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1194,3022,1251,0, 1291,1323,3252,1385,1422,1454,1520,1525,1551,1584,1615,0,1653,3327,1703,1730, -1788,1822,1905,2004,3347,3349,5746,2070,2131,2177,3357,3359,3361,2262,0,2393, -2494,3208,2610,3353,5748,5750,2663,2768,2794,5754,3381,2853,5756,3631,3633,3635, +1788,1822,1905,2004,3347,3349,5779,2070,2131,2177,3357,3359,3361,2262,0,2393, +2494,3208,2610,3353,5781,5783,2663,2768,2794,5787,3381,2853,5789,3631,3633,3635, 3773,3775,2322,2696,2794,2853,3631,3633,3739,3773,3775,0,0,0,0,0, 0,0,0,0,0,0,0,0,3939,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,3351,2085,3355,3129,3361, -2237,3363,3365,3369,3373,3375,3377,5758,3426,3379,5760,3428,3385,3383,3387,3389, -3391,3393,3395,3403,3405,3286,3407,3409,5752,3411,3413,2943,3415,3417,3419,3669, +2237,3363,3365,3369,3373,3375,3377,5791,3426,3379,5793,3428,3385,3383,3387,3389, +3391,3393,3395,3403,3405,3286,3407,3409,5785,3411,3413,2943,3415,3417,3419,3669, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1383,44 +1419,44 @@ static const guint16 charMapIndex [] = { 1241,2064,1256,2076,1259,2079,1262,2082,3030,3111,1305,2156,1311,2162,1320,2171, 1314,2165,1317,2168,3194,3200,3197,3203,1370,2231,1373,2234,3335,3338,1382,2259, 1407,2274,1436,2301,1445,2310,1439,2304,1448,2313,1451,2316,1517,2382,3045,3126, -1536,2434,1542,2440,1548,2446,1572,2482,5762,5765,1581,2491,1578,2488,1603,2539, +1536,2434,1542,2440,1548,2446,1572,2482,5795,5798,1581,2491,1578,2488,1603,2539, 1606,2542,1609,2545,1635,2592,1641,2598,1650,2607,1647,2604,3060,3143,3066,3149, -3210,3216,3213,3219,1722,2688,1725,2691,1738,2718,1750,2730,5768,5771,1756,2736, -1773,2753,1779,2759,3222,3225,3228,3231,5774,5777,1801,2770,1807,2779,1819,2791, +3210,3216,3213,3219,1722,2688,1725,2691,1738,2718,1750,2730,5801,5804,1756,2736, +1773,2753,1779,2759,3222,3225,3228,3231,5807,5810,1801,2770,1807,2779,1819,2791, 1816,2788,1869,2841,1878,2850,1875,2847,3234,3237,3240,3243,1895,2867,1898,2870, 1910,2875,1913,2878,1922,2887,1919,2884,1925,2893,1937,2905,1940,2908,1960,2928, 1977,2948,1986,2957,1989,2960,2319,2773,2890,2937,2019,3249,0,0,0,0, -1238,2061,1223,2046,3005,3090,3002,3087,3011,3096,3008,3093,5780,5786,3173,3185, -3170,3182,3179,3191,3176,3188,5783,5789,1361,2222,1349,2210,1334,2195,3036,3117, -3033,3114,3042,3123,3039,3120,5792,5795,1499,2364,1511,2376,1697,2657,1679,2639, -3051,3134,3048,3131,3057,3140,3054,3137,5798,5801,3259,3274,3256,3271,3265,3280, +1238,2061,1223,2046,3005,3090,3002,3087,3011,3096,3008,3093,5813,5819,3173,3185, +3170,3182,3179,3191,3176,3188,5816,5822,1361,2222,1349,2210,1334,2195,3036,3117, +3033,3114,3042,3123,3039,3120,5825,5828,1499,2364,1511,2376,1697,2657,1679,2639, +3051,3134,3048,3131,3057,3140,3054,3137,5831,5834,3259,3274,3256,3271,3265,3280, 3262,3277,3268,3283,1866,2838,1845,2817,3291,3306,3288,3303,3297,3312,3294,3309, 3300,3315,1945,2913,1969,2940,1966,2934,1954,2922,0,0,0,0,0,0, -3619,3622,5804,5816,5807,5819,5810,5822,3474,3477,5846,5858,5849,5861,5852,5864, -3645,3648,5888,5894,5891,5897,0,0,3491,3494,5900,5906,5903,5909,0,0, -3657,3660,5912,5924,5915,5927,5918,5930,3503,3506,5954,5966,5957,5969,5960,5972, -3688,3691,5996,6005,5999,6008,6002,6011,3529,3532,6014,6023,6017,6026,6020,6029, -3731,3734,6032,6038,6035,6041,0,0,3541,3544,6044,6050,6047,6053,0,0, -3764,3767,6056,6065,6059,6068,6062,6071,0,3571,0,6074,0,6077,0,6080, -3783,3786,6083,6095,6086,6098,6089,6101,3582,3585,6125,6137,6128,6140,6131,6143, +3619,3622,5837,5849,5840,5852,5843,5855,3474,3477,5879,5891,5882,5894,5885,5897, +3645,3648,5921,5927,5924,5930,0,0,3491,3494,5933,5939,5936,5942,0,0, +3657,3660,5945,5957,5948,5960,5951,5963,3503,3506,5987,5999,5990,6002,5993,6005, +3688,3691,6029,6038,6032,6041,6035,6044,3529,3532,6047,6056,6050,6059,6053,6062, +3731,3734,6065,6071,6068,6074,0,0,3541,3544,6077,6083,6080,6086,0,0, +3764,3767,6089,6098,6092,6101,6095,6104,0,3571,0,6107,0,6110,0,6113, +3783,3786,6116,6128,6119,6131,6122,6134,3582,3585,6158,6170,6161,6173,6164,6176, 3607,3591,3639,3596,3651,3598,3673,3603,3725,3813,3749,3815,3777,3817,0,0, -5813,5825,5828,5831,5834,5837,5840,5843,5855,5867,5870,5873,5876,5879,5882,5885, -5921,5933,5936,5939,5942,5945,5948,5951,5963,5975,5978,5981,5984,5987,5990,5993, -6092,6104,6107,6110,6113,6116,6119,6122,6134,6146,6149,6152,6155,6158,6161,6164, -3616,3613,6167,3628,3593,0,3625,6176,3471,3468,3462,3446,3480,30,3671,30, -45,2985,6170,3666,3600,0,3663,6188,3485,3448,3497,3450,3509,6179,6182,6185, -3682,3679,3795,3460,0,0,3694,3801,3523,3520,3514,3452,0,6194,6197,6200, +5846,5858,5861,5864,5867,5870,5873,5876,5888,5900,5903,5906,5909,5912,5915,5918, +5954,5966,5969,5972,5975,5978,5981,5984,5996,6008,6011,6014,6017,6020,6023,6026, +6125,6137,6140,6143,6146,6149,6152,6155,6167,6179,6182,6185,6188,6191,6194,6197, +3616,3613,6200,3628,3593,0,3625,6209,3471,3468,3462,3446,3480,30,3671,30, +45,2985,6203,3666,3600,0,3663,6221,3485,3448,3497,3450,3509,6212,6215,6218, +3682,3679,3795,3460,0,0,3694,3801,3523,3520,3514,3452,0,6227,6230,6233, 3758,3755,3804,3605,3741,3744,3770,3810,3565,3562,3556,3456,3549,2979,3444,2002, -0,0,6173,3792,3819,0,3789,6191,3535,3454,3576,3458,3588,2998,33,0, -6203,6205,1,1,1,1,1,1,1,1,1,0,0,0,0,0, -0,6207,0,0,0,0,0,42,0,0,0,0,0,0,0,0, +0,0,6206,3792,3819,0,3789,6224,3535,3454,3576,3458,3588,2998,33,0, +6236,6238,1,1,1,1,1,1,1,1,1,0,0,0,0,0, +0,6240,0,0,0,0,0,42,0,0,0,0,0,0,0,0, 0,0,0,0,622,624,627,0,0,0,0,0,0,0,0,1, -0,0,0,6217,6220,0,6229,6232,0,0,0,0,107,0,12,0, +0,0,0,6250,6253,0,6262,6265,0,0,0,0,107,0,12,0, 0,0,0,0,0,0,0,1189,1186,110,0,0,0,0,0,0, -0,0,0,0,0,0,0,6224,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,6257,0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -633,2322,0,0,1021,1069,1094,1108,1126,1140,616,6277,1167,125,612,2560, -633,638,841,957,1021,1069,1094,1108,1126,1140,616,6277,1167,125,612,0, +633,2322,0,0,1021,1069,1094,1108,1126,1140,616,6310,1167,125,612,2560, +633,638,841,957,1021,1069,1094,1108,1126,1140,616,6310,1167,125,612,0, 2004,2177,2610,2896,3357,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1732,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1432,37 +1468,37 @@ static const guint16 charMapIndex [] = { 1454,1454,1551,2455,0,1615,1623,0,0,1703,1728,1730,1730,1730,0,0, 1761,1790,1798,0,1972,0,3574,0,1972,0,1525,3017,1251,1265,0,2177, 1323,1376,0,1584,2610,4004,4018,4026,4031,2322,0,1378,3737,3633,3483,3547, -6275,0,0,0,0,1291,2131,2177,2322,2385,0,0,0,0,0,0, +6308,0,0,0,0,1291,2131,2177,2322,2385,0,0,0,0,0,0, 0,0,0,812,940,820,944,1004,1056,824,1077,828,1008,1081,1113,805, 1454,1456,1459,1469,1881,1883,1886,1890,1472,1928,1930,1933,1551,1265,1291,1584, 2322,2324,2327,2337,2853,2855,2858,2862,2340,2896,2898,2901,2455,2085,2131,2494, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,6242,6249,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,6254,0, +0,0,0,0,0,0,0,0,0,0,6275,6282,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,6287,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,6257,6263,6260, +0,0,0,0,0,0,0,0,0,0,0,0,0,6290,6296,6293, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,6266,0,0,0,0,6269,0,0,6272,0,0,0, +0,0,0,0,6299,0,0,0,0,6302,0,0,6305,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,6279,0,6282,0,0,0,0,0,6285,6288,0,6297, -6300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,6304,0,0,6307,0,0,6310,0,6313,0,0,0,0,0,0, +0,0,0,0,6312,0,6315,0,0,0,0,0,6318,6321,0,6330, +6333,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,6337,0,0,6340,0,0,6343,0,6346,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1176,0,6319,0,0,0,0,0,0,0,0,0,0,6316,1164,1181, -6322,6325,0,0,6328,6331,0,0,6334,6337,0,0,0,0,0,0, -6340,6343,0,0,6352,6355,0,0,6358,6361,0,0,0,0,0,0, +1176,0,6352,0,0,0,0,0,0,0,0,0,0,6349,1164,1181, +6355,6358,0,0,6361,6364,0,0,6367,6370,0,0,0,0,0,0, +6373,6376,0,0,6385,6388,0,0,6391,6394,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6370,6373,6376,6379, +0,0,0,0,0,0,0,0,0,0,0,0,6403,6406,6409,6412, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6346,6349,6364,6367,0,0,0,0,0,0,6382,6385,6388,6391,0,0, +6379,6382,6397,6400,0,0,0,0,0,0,6415,6418,6421,6424,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,6413,6415,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,6446,6448,0,0,0,0,0, 638,841,957,1021,1069,1094,1108,1126,1140,643,662,681,700,715,730,745, 760,775,790,846,127,181,190,194,198,202,206,210,214,131,136,141, 146,151,156,161,166,171,176,185,640,843,959,1023,1071,1096,1110,1128, @@ -1472,7 +1508,7 @@ static const guint16 charMapIndex [] = { 1525,1551,1584,1615,1653,1703,1728,1730,1759,1788,1822,1881,1905,1928,1943,1972, 2004,2070,2085,2131,2177,2237,2262,2289,2322,2385,2393,2455,2494,2560,2610,2663, 2694,2696,2739,2768,2794,2853,2873,2896,2911,2943,633,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6292,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,6325,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1485,47 +1521,47 @@ static const guint16 charMapIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6404,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6407, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7800, +0,0,0,0,0,0,0,0,0,0,0,0,6437,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6440, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7833, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,8562,0,0,0,0,0,0,0,0,0,0,0,0, -7245,7263,7269,7273,7275,7281,7285,7289,7293,7321,7329,7335,7341,7343,7347,7361, -7363,7365,7377,7395,7399,7403,7405,7411,7421,7423,7429,7431,7435,7437,7469,7475, -7493,7495,7497,7499,7503,7518,7524,7528,7538,7540,7542,7544,7554,7556,7564,7566, -7570,7572,7574,7581,7583,7599,7601,7605,7607,7609,7611,7615,7623,7657,7663,7665, -7689,7691,7699,7701,7705,7707,7711,7715,7735,7739,7747,7782,7784,7790,7794,7798, -7802,7804,7806,7808,7810,7860,7880,7886,7888,7890,7892,7894,7896,7902,7914,7918, -7938,7940,7944,7946,7948,7950,7964,7966,7978,7980,7982,7984,7994,8006,8008,8010, -8026,8056,8058,8068,8074,8076,8086,8098,8120,8124,8132,8136,8138,8142,8144,8146, -8154,8156,8162,8166,8170,8172,8174,8176,8178,8180,8184,8186,8224,8228,8236,8238, -8240,8256,8260,8264,8266,8294,8296,8300,8302,8304,8318,8320,8322,8326,8328,8340, -8342,8344,8360,8366,8374,8376,8380,8390,8392,8396,8414,8418,8424,8434,8438,8440, -8442,8444,8448,8450,8454,8466,8468,8470,8478,8480,8482,8488,8490,8492,8496,8498, -8500,8502,8504,8510,8518,8520,8526,8528,8530,8532,8536,8538,8540,8542,8544,8546, -8548,8552,8554,8556,8560,8564,0,0,0,0,0,0,0,0,0,0, +0,0,0,8595,0,0,0,0,0,0,0,0,0,0,0,0, +7278,7296,7302,7306,7308,7314,7318,7322,7326,7354,7362,7368,7374,7376,7380,7394, +7396,7398,7410,7428,7432,7436,7438,7444,7454,7456,7462,7464,7468,7470,7502,7508, +7526,7528,7530,7532,7536,7551,7557,7561,7571,7573,7575,7577,7587,7589,7597,7599, +7603,7605,7607,7614,7616,7632,7634,7638,7640,7642,7644,7648,7656,7690,7696,7698, +7722,7724,7732,7734,7738,7740,7744,7748,7768,7772,7780,7815,7817,7823,7827,7831, +7835,7837,7839,7841,7843,7893,7913,7919,7921,7923,7925,7927,7929,7935,7947,7951, +7971,7973,7977,7979,7981,7983,7997,7999,8011,8013,8015,8017,8027,8039,8041,8043, +8059,8089,8091,8101,8107,8109,8119,8131,8153,8157,8165,8169,8171,8175,8177,8179, +8187,8189,8195,8199,8203,8205,8207,8209,8211,8213,8217,8219,8257,8261,8269,8271, +8273,8289,8293,8297,8299,8327,8329,8333,8335,8337,8351,8353,8355,8359,8361,8373, +8375,8377,8393,8399,8407,8409,8413,8423,8425,8429,8447,8451,8457,8467,8471,8473, +8475,8477,8481,8483,8487,8499,8501,8503,8511,8513,8515,8521,8523,8525,8529,8531, +8533,8535,8537,8543,8551,8553,8559,8561,8563,8565,8569,8571,8573,8575,8577,8579, +8581,8585,8587,8589,8593,8597,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,6433,0,7411,7413,7415,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6446,0,6449,0, -6452,0,6455,0,6458,0,6461,0,6464,0,6467,0,6470,0,6473,0, -6476,0,6479,0,0,6482,0,6485,0,6488,0,0,0,0,0,0, -6491,6494,0,6497,6500,0,6503,6506,0,6509,6512,0,6515,6518,0,0, +0,0,0,0,0,0,6466,0,7444,7446,7448,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,6479,0,6482,0, +6485,0,6488,0,6491,0,6494,0,6497,0,6500,0,6503,0,6506,0, +6509,0,6512,0,0,6515,0,6518,0,6521,0,0,0,0,0,0, +6524,6527,0,6530,6533,0,6536,6539,0,6542,6545,0,6548,6551,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,6443,0,0,0,0,0,0,99,102,0,6528,6521, -0,0,0,0,0,0,0,0,0,0,0,0,6607,0,6634,0, -6678,0,6704,0,6713,0,6729,0,6745,0,6755,0,6760,0,6773,0, -6778,0,6787,0,0,6794,0,6799,0,6807,0,0,0,0,0,0, -6835,6838,0,6862,6865,0,6886,6889,0,6915,6918,0,6952,6955,0,0, +0,0,0,0,6476,0,0,0,0,0,0,99,102,0,6561,6554, +0,0,0,0,0,0,0,0,0,0,0,0,6640,0,6667,0, +6711,0,6737,0,6746,0,6762,0,6778,0,6788,0,6793,0,6806,0, +6811,0,6820,0,0,6827,0,6832,0,6840,0,0,0,0,0,0, +6868,6871,0,6895,6898,0,6919,6922,0,6948,6951,0,6985,6988,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,6571,0,0,7104,7113,7118,7123,0,0,0,7132,6716, +0,0,0,0,6604,0,0,7137,7146,7151,7156,0,0,0,7165,6749, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1535,7 +1571,7 @@ static const guint16 charMapIndex [] = { 5682,5684,5686,5688,5646,5596,5598,5724,5726,5728,5730,5732,5734,5736,5602,5738, 5740,5604,5606,5608,5612,5614,5616,5618,5620,5622,5624,5626,5628,5630,5632,5634, 5636,5638,5742,5744,5640,5642,5644,5690,5692,5694,5696,5698,5700,5702,5704,0, -0,0,7245,7285,7251,7471,7253,7265,7255,7952,7275,7259,7247,7508,7477,7293, +0,0,7278,7318,7284,7504,7286,7298,7288,7985,7308,7292,7280,7541,7510,7326, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1550,22 +1586,22 @@ static const guint16 charMapIndex [] = { 1715,861,872,883,894,905,912,919,926,933,962,969,976,979,982,985, 5502,5509,5514,5521,5526,5531,5538,5545,5553,5565,5576,5581,5586,5591,5504,5511, 5516,5523,5528,5533,5540,5547,5555,5567,5578,5583,5588,5593,5570,5558,5550,0, -7245,7285,7251,7471,7287,7337,7249,7335,7277,7411,7739,7860,7810,7747,8380,7475, -7715,7761,7741,8030,7443,7900,8306,8040,7381,8062,7954,7518,8352,7319,7425,7818, -8456,7301,7345,7786,7253,7265,7255,7568,7441,7407,7532,7526,7990,7299,8310,7419, -7501,988,991,994,997,1026,1029,1032,1035,1038,1041,1044,1047,1050,1053,1074, +7278,7318,7284,7504,7320,7370,7282,7368,7310,7444,7772,7893,7843,7780,8413,7508, +7748,7794,7774,8063,7476,7933,8339,8073,7414,8095,7987,7551,8385,7352,7458,7851, +8489,7334,7378,7819,7286,7298,7288,7601,7474,7440,7565,7559,8023,7332,8343,7452, +7534,988,991,994,997,1026,1029,1032,1035,1038,1041,1044,1047,1050,1053,1074, 835,951,1015,1063,1088,1102,1120,1134,1148,654,673,692,1427,2182,2179,1556, -6533,6556,6569,6580,6595,6605,6632,6676,6702,6711,6727,6743,6753,6758,6771,6776, -6785,6792,6797,6805,6816,6821,6823,6825,6827,6833,6860,6884,6913,6950,6982,7007, -7023,7025,7040,7044,7056,7064,7066,7068,7078,7089,7100,7102,7111,7116,7121,0, -6535,6540,6545,6550,6558,6563,6574,6582,6588,6597,6601,6610,6614,6619,6624,6628, -6664,6667,6637,6671,6642,6645,6651,6658,6692,6696,6681,6687,6707,6719,6723,6732, -6737,6748,6763,6767,6781,6802,6813,6810,6818,6829,6841,6850,6856,6845,6871,6877, -6881,6868,6892,6898,6907,6903,6921,6935,6938,6927,6942,6946,6931,6973,6969,6958, -6978,6961,6965,6984,6989,6993,6997,7001,7009,7014,7017,7027,7030,7035,7046,7050, -7058,7070,7075,7080,7084,7091,7094,7107,635,838,954,1018,1066,1091,1105,1123, +6566,6589,6602,6613,6628,6638,6665,6709,6735,6744,6760,6776,6786,6791,6804,6809, +6818,6825,6830,6838,6849,6854,6856,6858,6860,6866,6893,6917,6946,6983,7015,7040, +7056,7058,7073,7077,7089,7097,7099,7101,7111,7122,7133,7135,7144,7149,7154,0, +6568,6573,6578,6583,6591,6596,6607,6615,6621,6630,6634,6643,6647,6652,6657,6661, +6697,6700,6670,6704,6675,6678,6684,6691,6725,6729,6714,6720,6740,6752,6756,6765, +6770,6781,6796,6800,6814,6835,6846,6843,6851,6862,6874,6883,6889,6878,6904,6910, +6914,6901,6925,6931,6940,6936,6954,6968,6971,6960,6975,6979,6964,7006,7002,6991, +7011,6994,6998,7017,7022,7026,7030,7034,7042,7047,7050,7060,7063,7068,7079,7083, +7091,7103,7108,7113,7117,7124,7127,7140,635,838,954,1018,1066,1091,1105,1123, 1137,1151,658,677,696,711,726,741,756,771,786,801,857,868,879,890, -901,2291,2136,1196,2072,2612,2682,2139,2142,2146,1466,7576,7722,7505,7717,7763, +901,2291,2136,1196,2072,2612,2682,2139,2142,2146,1466,7609,7755,7538,7750,7796, 2670,2562,3701,2496,2395,1527,1586,1387,2095,2412,2673,2565,3704,3713,2508,2417, 1430,2398,1589,1390,1794,3722,2548,2174,2452,2256,2577,3716,2515,2105,2420,2518, 2108,2533,2423,2522,2112,2536,2427,2551,2555,1719,2402,1593,1394,2698,2702,2708, @@ -1574,41 +1610,41 @@ static const guint16 charMapIndex [] = { 2460,2463,2466,2470,2505,2511,2526,1705,2665,1708,1712,2741,1764,1907,1901,1247, 832,948,1012,1060,1085,1099,1117,1131,1145,650,669,688,707,722,737,752, 767,782,797,853,864,875,886,897,908,915,922,929,936,965,972,2264, -8298,7737,8328,8312,7844,7267,7439,8560,8560,7514,8380,7455,7512,7653,7976,8130, -8222,8232,8248,8358,7774,7820,7866,7922,8202,8368,8484,7279,7427,7780,7878,8220, -8516,7560,7854,8212,8254,7667,8160,8234,7589,7743,7826,7908,8362,7305,7351,7389, -7687,7778,7876,7992,8138,8216,8226,8324,8430,8506,8514,8014,8046,8108,8196,8386, -8520,8276,7491,7603,8084,8152,7898,8018,8308,8428,7489,7548,7776,7832,7848,8104, -8116,8400,7387,8158,7357,7355,8064,8110,8200,8404,8290,7669,7774,8282,7271,7534, -7627,7916,7962,7401,8022,7311,7619,7257,7814,7697,8102,7433,7483,7998,8204,8268, -7796,8342,7812,7673,8190,7677,7960,7291,7333,7353,7768,8096,8182,8274,8378,7393, -7449,7518,7597,7709,7856,8024,8394,8486,8522,8534,7377,7733,7788,8338,7579,7649, -7655,7685,7852,7868,7934,8060,8112,8150,8330,8208,8348,8388,7369,7379,7451,7864, -8242,8268,7587,7625,7675,7792,8082,7912,7297,7473,7534,7562,7629,7920,7930,8134, -8148,8382,8426,8432,8460,7307,8054,8372,8416,7635,7283,7315,7536,7546,7703,7774, -7872,7974,8210,8356,8556,7727,8398,7375,7753,7757,7824,7838,7926,7958,8012,8100, -8464,7337,7659,8406,7313,7558,7834,8332,7617,7639,7759,7916,8410,7371,7445,7552, -7720,7749,7772,7816,7924,7968,8128,8244,8246,8376,8420,7409,7840,7447,7874,7936, -8214,8412,8508,8524,7755,7830,8164,8074,8078,8090,7906,7862,8288,7295,8192,7373, -7367,7585,7671,8094,7530,7822,7731,8336,8238,8402,8260,7593,7323,7461,0,0, -7481,0,7725,0,0,7359,7910,7986,8028,8042,8044,8052,8436,8092,8136,0, -8218,0,8280,0,0,8350,8364,0,0,0,8472,8474,8476,8512,0,0, -7309,7317,7327,7385,7391,7417,7459,7465,7467,7479,7485,7550,7554,7631,7645,7647, -7651,7693,7713,7729,7770,7828,7836,7850,7870,7882,7928,8016,8030,8034,8032,8036, -8038,8040,8048,8050,8066,8070,8080,8112,8114,8118,8126,8140,8168,8188,8188,8206, -8250,8262,8284,8286,8314,8316,8346,8350,8422,8452,8462,0,0,0,0,0, -7261,7349,7331,7303,7325,7339,7383,7397,7459,7453,7457,7463,7481,7487,7510,7516, -7520,7522,7591,7595,7613,7621,7633,7641,7637,7647,7643,7651,7661,7679,7681,7683, -7695,7725,7743,7745,7751,7790,7796,7824,7846,7842,7850,7858,7870,8004,7884,7904, -7910,7932,7942,7956,7970,7972,7986,7988,7996,8002,8000,8020,8072,8080,8088,8106, -8112,8122,8140,8194,8198,8230,8252,8258,8262,8270,8280,8272,8284,8282,8278,8286, -8292,8316,8334,8354,8370,8384,8408,8422,8436,8446,8452,8458,8462,8494,8560,8574, -8572,8576,7239,7241,7243,8578,8580,8582,8550,8558,0,0,0,0,0,0, +8331,7770,8361,8345,7877,7300,7472,8593,8593,7547,8413,7488,7545,7686,8009,8163, +8255,8265,8281,8391,7807,7853,7899,7955,8235,8401,8517,7312,7460,7813,7911,8253, +8549,7593,7887,8245,8287,7700,8193,8267,7622,7776,7859,7941,8395,7338,7384,7422, +7720,7811,7909,8025,8171,8249,8259,8357,8463,8539,8547,8047,8079,8141,8229,8419, +8553,8309,7524,7636,8117,8185,7931,8051,8341,8461,7522,7581,7809,7865,7881,8137, +8149,8433,7420,8191,7390,7388,8097,8143,8233,8437,8323,7702,7807,8315,7304,7567, +7660,7949,7995,7434,8055,7344,7652,7290,7847,7730,8135,7466,7516,8031,8237,8301, +7829,8375,7845,7706,8223,7710,7993,7324,7366,7386,7801,8129,8215,8307,8411,7426, +7482,7551,7630,7742,7889,8057,8427,8519,8555,8567,7410,7766,7821,8371,7612,7682, +7688,7718,7885,7901,7967,8093,8145,8183,8363,8241,8381,8421,7402,7412,7484,7897, +8275,8301,7620,7658,7708,7825,8115,7945,7330,7506,7567,7595,7662,7953,7963,8167, +8181,8415,8459,8465,8493,7340,8087,8405,8449,7668,7316,7348,7569,7579,7736,7807, +7905,8007,8243,8389,8589,7760,8431,7408,7786,7790,7857,7871,7959,7991,8045,8133, +8497,7370,7692,8439,7346,7591,7867,8365,7650,7672,7792,7949,8443,7404,7478,7585, +7753,7782,7805,7849,7957,8001,8161,8277,8279,8409,8453,7442,7873,7480,7907,7969, +8247,8445,8541,8557,7788,7863,8197,8107,8111,8123,7939,7895,8321,7328,8225,7406, +7400,7618,7704,8127,7563,7855,7764,8369,8271,8435,8293,7626,7356,7494,0,0, +7514,0,7758,0,0,7392,7943,8019,8061,8075,8077,8085,8469,8125,8169,0, +8251,0,8313,0,0,8383,8397,0,0,0,8505,8507,8509,8545,0,0, +7342,7350,7360,7418,7424,7450,7492,7498,7500,7512,7518,7583,7587,7664,7678,7680, +7684,7726,7746,7762,7803,7861,7869,7883,7903,7915,7961,8049,8063,8067,8065,8069, +8071,8073,8081,8083,8099,8103,8113,8145,8147,8151,8159,8173,8201,8221,8221,8239, +8283,8295,8317,8319,8347,8349,8379,8383,8455,8485,8495,0,0,0,0,0, +7294,7382,7364,7336,7358,7372,7416,7430,7492,7486,7490,7496,7514,7520,7543,7549, +7553,7555,7624,7628,7646,7654,7666,7674,7670,7680,7676,7684,7694,7712,7714,7716, +7728,7758,7776,7778,7784,7823,7829,7857,7879,7875,7883,7891,7903,8037,7917,7937, +7943,7965,7975,7989,8003,8005,8019,8021,8029,8035,8033,8053,8105,8113,8121,8139, +8145,8155,8173,8227,8231,8263,8285,8291,8295,8303,8313,8305,8317,8315,8311,8319, +8325,8349,8367,8387,8403,8417,8441,8455,8469,8479,8485,8491,8495,8527,8593,8609, +8607,8611,7272,7274,7276,8613,8615,8617,8583,8591,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2239,2250,2253,2242,2246,3246,2744,0,0,0,0,0,0,0,0,0, 0,0,0,3998,3989,3992,4001,3995,0,0,0,0,0,4053,0,4122, -4086,4004,4031,4036,4062,4070,4075,4103,4117,616,4111,4114,8566,8569,4006,4009, +4086,4004,4031,4036,4062,4070,4075,4103,4117,616,4111,4114,8601,8604,4006,4009, 4012,4020,4028,4033,4038,4044,4047,0,4050,4056,4059,4064,4072,0,4077,0, 4080,4083,0,4088,4091,0,4097,4100,4105,4108,4119,4041,4023,4067,4094,4015, 5202,5202,5210,5210,5210,5210,5212,5212,5212,5212,5216,5216,5216,5216,5208,5208, @@ -1655,11 +1691,11 @@ static const guint16 charMapIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 4628,4835,4195,4190,5000,4600,4462,4720,5132,4605,4609,4380,4470,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -618,6409,6411,1154,1160,105,1184,6439,6441,6215,0,0,0,0,0,0, +618,6442,6444,1154,1160,105,1184,6472,6474,6248,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6213,6211,6209,2000,2000,125,612,2963,2967,6435,6437,6429,6431,6417,6419,6413, -6415,6421,6423,6425,6427,0,0,1992,1996,6236,6236,6236,6236,2000,2000,2000, -618,6409,622,0,1160,1154,1184,105,6211,125,612,2963,2967,6435,6437,115, +6246,6244,6242,2000,2000,125,612,2963,2967,6468,6470,6462,6464,6450,6452,6446, +6448,6454,6456,6458,6460,0,0,1992,1996,6269,6269,6269,6269,2000,2000,2000, +618,6442,622,0,1160,1154,1184,105,6244,125,612,2963,2967,6468,6470,115, 121,614,616,620,1162,1179,1167,0,1994,117,119,1192,0,0,0,0, 51,4772,54,0,61,0,68,4775,75,4782,82,4789,89,4796,96,4799, 4125,4127,4127,4129,4129,4131,4131,4133,4133,4135,4135,4135,4135,4188,4188,4215, @@ -1675,16 +1711,16 @@ static const guint16 charMapIndex [] = { 1192,1194,1251,1265,1291,1323,1376,1385,1422,1454,1520,1525,1551,1584,1615,1653, 1703,1728,1730,1759,1788,1822,1881,1905,1928,1943,1972,1992,1994,1996,1998,2000, 2002,2004,2070,2085,2131,2177,2237,2262,2289,2322,2385,2393,2455,2494,2560,2610, -2663,2694,2696,2739,2768,2794,2853,2873,2896,2911,2943,2963,2965,2967,2969,6400, -6402,6411,6421,6423,6409,7128,7121,6531,6554,6567,6578,6593,7042,7054,7062,6790, -7130,6533,6556,6569,6580,6595,6605,6632,6676,6702,6711,6727,6743,6753,6758,6771, -6776,6785,6792,6797,6805,6816,6821,6823,6825,6827,6833,6860,6884,6913,6950,6982, -7007,7023,7025,7040,7044,7056,7064,7066,7068,7078,7089,7100,7102,7126,6524,6526, -7237,7135,7137,7139,7141,7143,7145,7147,7149,7151,7153,7155,7157,7159,7161,7163, -7165,7167,7169,7171,7173,7175,7177,7179,7181,7183,7185,7187,7189,7191,7193,0, -0,0,7195,7197,7199,7201,7203,7205,0,0,7207,7209,7211,7213,7215,7217, -0,0,7219,7221,7223,7225,7227,7229,0,0,7231,7233,7235,0,0,0, -2971,2973,2988,2990,2977,2975,6238,0,6394,6240,6245,6247,6252,6396,6398,0, +2663,2694,2696,2739,2768,2794,2853,2873,2896,2911,2943,2963,2965,2967,2969,6433, +6435,6444,6454,6456,6442,7161,7154,6564,6587,6600,6611,6626,7075,7087,7095,6823, +7163,6566,6589,6602,6613,6628,6638,6665,6709,6735,6744,6760,6776,6786,6791,6804, +6809,6818,6825,6830,6838,6849,6854,6856,6858,6860,6866,6893,6917,6946,6983,7015, +7040,7056,7058,7073,7077,7089,7097,7099,7101,7111,7122,7133,7135,7159,6557,6559, +7270,7168,7170,7172,7174,7176,7178,7180,7182,7184,7186,7188,7190,7192,7194,7196, +7198,7200,7202,7204,7206,7208,7210,7212,7214,7216,7218,7220,7222,7224,7226,0, +0,0,7228,7230,7232,7234,7236,7238,0,0,7240,7242,7244,7246,7248,7250, +0,0,7252,7254,7256,7258,7260,7262,0,0,7264,7266,7268,0,0,0, +2971,2973,2988,2990,2977,2975,6271,0,6427,6273,6278,6280,6285,6429,6431,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0}; static const guint16 helperIndex [] = { @@ -1963,36 +1999,36 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,5762,5765,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,5795,5798,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,5768,5771,0,0,0,0, -0,0,5774,5777,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,5801,5804,0,0,0,0, +0,0,5807,5810,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5780,5786,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5792,5795,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5798,5801,0,0, +5813,5819,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5825,5828,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5831,5834,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5804,5816,5828,5831,5834,5837,5840,5843,5846,5858,5870,5873,5876,5879,5882,5885, -5888,5894,0,0,0,0,0,0,5900,5906,0,0,0,0,0,0, -5912,5924,5936,5939,5942,5945,5948,5951,5954,5966,5978,5981,5984,5987,5990,5993, -5996,6005,0,0,0,0,0,0,6014,6023,0,0,0,0,0,0, -6032,6038,0,0,0,0,0,0,6044,6050,0,0,0,0,0,0, -6056,6065,0,0,0,0,0,0,0,6074,0,0,0,0,0,0, -6083,6095,6107,6110,6113,6116,6119,6122,6125,6137,6149,6152,6155,6158,6161,6164, -6167,0,0,0,6170,0,0,0,0,0,0,0,6173,0,0,0, +5837,5849,5861,5864,5867,5870,5873,5876,5879,5891,5903,5906,5909,5912,5915,5918, +5921,5927,0,0,0,0,0,0,5933,5939,0,0,0,0,0,0, +5945,5957,5969,5972,5975,5978,5981,5984,5987,5999,6011,6014,6017,6020,6023,6026, +6029,6038,0,0,0,0,0,0,6047,6056,0,0,0,0,0,0, +6065,6071,0,0,0,0,0,0,6077,6083,0,0,0,0,0,0, +6089,6098,0,0,0,0,0,0,0,6107,0,0,0,0,0,0, +6116,6128,6140,6143,6146,6149,6152,6155,6158,6170,6182,6185,6188,6191,6194,6197, +6200,0,0,0,6203,0,0,0,0,0,0,0,6206,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,6176,0,0,0,0,0,0,0,0,6179, -0,0,0,0,0,0,6188,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,6209,0,0,0,0,0,0,0,0,6212, +0,0,0,0,0,0,6221,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,6191,0,0,0,0,0,0,0,6194,0, -0,0,6203,6205,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,6224,0,0,0,0,0,0,0,6227,0, +0,0,6236,6238,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2017,25 +2053,25 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6242,0,6249,0,6254,0,0,0,0,0,0,0,0,0,0,0, +6275,0,6282,0,6287,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6257,0,6260,0,6263,0,0,0,0,0,0,0,0,0,0,0, +6290,0,6293,0,6296,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,6266,0,0,0,0,6269,0,0,6272,0,0,0,0, +0,0,0,6299,0,0,0,0,6302,0,0,6305,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,6279,0,6282,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6304,0,0,0, -0,0,0,6307,0,6310,0,0,6313,0,0,0,0,6316,0,0, +0,0,0,6312,0,6315,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,6337,0,0,0, +0,0,0,6340,0,6343,0,0,6346,0,0,0,0,6349,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,6319,0,0,6322,6325,0,0,0,0,0,0,0,0,0,0, -0,0,6328,6331,0,0,6334,6337,0,0,6340,6343,6346,6349,0,0, -0,0,6352,6355,0,0,6358,6361,0,0,0,0,0,0,0,0, -0,6364,6367,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,6370,0,0,0,0,0,6373,6376,0,6379,0,0,0,0, -0,0,6382,6385,6388,6391,0,0,0,0,0,0,0,0,0,0, +0,6352,0,0,6355,6358,0,0,0,0,0,0,0,0,0,0, +0,0,6361,6364,0,0,6367,6370,0,0,6373,6376,6379,6382,0,0, +0,0,6385,6388,0,0,6391,6394,0,0,0,0,0,0,0,0, +0,6397,6400,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,6403,0,0,0,0,0,6406,6409,0,6412,0,0,0,0, +0,0,6415,6418,6421,6424,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2056,46 +2092,46 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,6413,6415,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,6446,6448,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,6443,0,0,0,0,6446,0,6449,0,6452, -0,6455,0,6458,0,6461,0,6464,0,6467,0,6470,0,6473,0,6476, -0,6479,0,0,6482,0,6485,0,6488,0,0,0,0,0,0,6491, -0,0,6497,0,0,6503,0,0,6509,0,0,6515,0,0,0,0, +0,0,0,0,0,0,6476,0,0,0,0,6479,0,6482,0,6485, +0,6488,0,6491,0,6494,0,6497,0,6500,0,6503,0,6506,0,6509, +0,6512,0,0,6515,0,6518,0,6521,0,0,0,0,0,0,6524, +0,0,6530,0,0,6536,0,0,6542,0,0,6548,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,6528,0,0, -0,0,0,0,0,0,6571,0,0,0,0,6607,0,6634,0,6678, -0,6704,0,6713,0,6729,0,6745,0,6755,0,6760,0,6773,0,6778, -0,6787,0,0,6794,0,6799,0,6807,0,0,0,0,0,0,6835, -0,0,6862,0,0,6886,0,0,6915,0,0,6952,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7104, -7113,7118,7123,0,0,0,0,0,0,0,0,0,0,7132,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,6561,0,0, +0,0,0,0,0,0,6604,0,0,0,0,6640,0,6667,0,6711, +0,6737,0,6746,0,6762,0,6778,0,6788,0,6793,0,6806,0,6811, +0,6820,0,0,6827,0,6832,0,6840,0,0,0,0,0,0,6868, +0,0,6895,0,0,6919,0,0,6948,0,0,6985,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7137, +7146,7151,7156,0,0,0,0,0,0,0,0,0,0,7165,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,7239,0,0, -0,0,0,0,0,0,0,0,7241,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,7272,0,0, +0,0,0,0,0,0,0,0,7274,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,7257,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,7290,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,7261,0,0,0,0,0,0,0,0,0, -0,0,7267,0,0,0,0,0,0,7271,0,0,0,0,0,0, +0,0,0,0,0,0,7294,0,0,0,0,0,0,0,0,0, +0,0,7300,0,0,0,0,0,0,7304,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7279,0,0,0,7283,0,0,0,0,0,0,0,0,0, +0,0,7312,0,0,0,7316,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7291,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7324,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +7328,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7297,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7330,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2105,17 +2141,17 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7303,0,0,0,0,0,7305,0,0,0,0,7307,0,0,0,0, +7336,0,0,0,0,0,7338,0,0,0,0,7340,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7309,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7311, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7342,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7344, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7313,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7346,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2126,69 +2162,69 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7315,0,0,0,0,0, -0,0,0,0,0,0,0,7317,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,7348,0,0,0,0,0, +0,0,0,0,0,0,0,7350,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7323,0,0,0,0,7325,0,0,0,0,0,0,0,7327,0,0, +7356,0,0,0,0,7358,0,0,0,0,0,0,0,7360,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7331,7333,0,0,0,7337,0,0, +0,0,0,0,0,0,0,0,7364,7366,0,0,0,7370,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7339,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +7372,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7349,0,7351,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7353,0,0,7355,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,7357,0,7359,0, +0,0,0,0,0,7382,0,7384,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7386,0,0,7388,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,7390,0,7392,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7367,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7369,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7371,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7373,0,0,0,0,0, +0,0,0,0,0,0,0,7400,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,7402,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7404,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,7406,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7375,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7377,0,0,0,0, -0,0,0,7379,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7408,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7410,0,0,0,0, +0,0,0,7412,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7383,0,7385,0,0,0,0,0,0, -0,0,7387,0,0,0,0,0,0,0,0,0,0,0,7389,0, -0,0,0,0,7391,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7393,0,0,0,0,7397,0,0,0,0,0, +0,0,0,0,0,0,0,7416,0,7418,0,0,0,0,0,0, +0,0,7420,0,0,0,0,0,0,0,0,0,0,0,7422,0, +0,0,0,0,7424,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,7426,0,0,0,0,7430,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7401,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,7434,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7409, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7442, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,7417,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,7450,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7427,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,7460,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,7433,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,7466,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7439,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,7472,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7445, -0,0,0,0,0,0,0,0,0,0,0,0,0,7447,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7478, +0,0,0,0,0,0,0,0,0,0,0,0,0,7480,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7449,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7482,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,7451,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,7484,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2198,24 +2234,24 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7453,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,7486,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7455,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7457,0,0,0,7459,0,0, +0,0,0,0,0,0,0,7488,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7490,0,0,0,7492,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7461,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +7494,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7463,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7496,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,7465,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,7498,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7467,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,7500,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2224,7 +2260,7 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7473,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7506,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2245,26 +2281,26 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7479,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7481,0,0,0,7483,0, +7512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,7514,0,0,0,7516,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7485,0,0,0,0,0,0,0, -0,0,0,7487,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,7518,0,0,0,0,0,0,0, +0,0,0,7520,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7489,0,0,0,0,0,0,7491, +0,0,0,0,0,0,0,0,7522,0,0,0,0,0,0,7524, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7510,0,0,0,7512,0,0,0,0,0,0,0, -0,7514,0,0,7516,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7543,0,0,0,7545,0,0,0,0,0,0,0, +0,7547,0,0,7549,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,7518,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,7551,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2279,7 +2315,7 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7520,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7553,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2291,27 +2327,27 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7522,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,7555,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7530,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,7563,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7534,0,0,0,0,0,0,7536,0, +0,0,0,0,0,0,0,7567,0,0,0,0,0,0,7569,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7546, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7579, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7548,0,7550,7552,0,0,0,0,0,0,0,0,7554,0, +0,0,7581,0,7583,7585,0,0,0,0,0,0,0,0,7587,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2322,17 +2358,17 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7558,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7591,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7560,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +7593,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7562,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,7595,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2344,33 +2380,33 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7579,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7612,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,7585,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,7618,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7587,7589,0,0,0,0,0, -0,0,7591,7593,0,0,0,0,0,7595,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,7597,0,0,0, +0,0,0,0,0,0,0,0,0,7620,7622,0,0,0,0,0, +0,0,7624,7626,0,0,0,0,0,7628,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,7630,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7603,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7636,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7613,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7646,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7617,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7650,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7619,0,0,0,7621,0,0, +0,0,0,0,0,0,0,0,0,7652,0,0,0,7654,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7625,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,7658,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7627,0,0,0,0,0,0,0,0,0,7629,0,0,0, +0,0,7660,0,0,0,0,0,0,0,0,0,7662,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2378,33 +2414,33 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7631,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7664,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7633,0,0,0,0,0,0,0, -0,7635,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,7666,0,0,0,0,0,0,0, +0,7668,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7637,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,7670,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7639,0,0,0,0,0,0,0,0,0,7641,0, +0,0,0,0,7672,0,0,0,0,0,0,0,0,0,7674,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7643,0,0,0,0,0,0,0,7645,0,0,0,0,0,0,0, +7676,0,0,0,0,0,0,0,7678,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7647,0, -7649,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7680,0, +7682,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7651,0,0,0,7653,0,0,0,0,0,0,0,0,0, -7655,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7684,0,0,0,7686,0,0,0,0,0,0,0,0,0, +7688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7659,0, -0,0,0,0,7661,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7692,0, +0,0,0,0,7694,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2413,10 +2449,10 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7667,0,0,0,0,0,7669, -0,0,0,7671,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7700,0,0,0,0,0,7702, +0,0,0,7704,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7673,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7706,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2424,28 +2460,28 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7675,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7708,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7677,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +7710,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7679,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7712,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,7681,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,7714,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7683,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7716,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7685,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,7718,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7687,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7720,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2453,61 +2489,61 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7693, -0,0,0,0,0,0,7695,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7726, +0,0,0,0,0,0,7728,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7697,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,7730,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7703,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7736,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7709,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,7742,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7713,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7746,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,7720,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,7753,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7725,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7727,0,0,0,0,0,0,0, -0,7729,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7758,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,7760,0,0,0,0,0,0,0, +0,7762,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7731,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,7733,0,0,0,0,0,0,0,0,0, +0,0,0,0,7764,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,7766,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7737,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7770,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7743,0,0,0,7745,0,0,0,0, +0,0,0,0,0,0,0,7776,0,0,0,7778,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7749,0, -0,0,0,0,0,0,7751,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7782,0, +0,0,0,0,0,0,7784,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7753,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7786,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7755,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,7788,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,7757,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,7790,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7759,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,7792,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,7768,0,0,0,7770,0,0,0,0,0,0,0,0,0,0, +0,7801,0,0,0,7803,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7772,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,7805,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2529,8 +2565,8 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7774,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,7776,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7807,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,7809,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2542,21 +2578,21 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,7778,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,7811,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,7780,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,7813,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7788,0,7790,0,0,0,0,0,0, +0,0,0,0,0,0,0,7821,0,7823,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7792,0, -0,0,0,0,0,0,0,0,0,0,7796,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7825,0, +0,0,0,0,0,0,0,0,0,0,7829,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2569,32 +2605,32 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7812,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,7845,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,7814,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,7847,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7816,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,7849,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7820,0,0,7822,0, +0,0,0,0,0,0,0,0,0,0,0,7853,0,0,7855,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,7824,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,7857,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7826,0,0,0,0,0, -0,0,0,0,0,0,0,7828,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,7859,0,0,0,0,0, +0,0,0,0,0,0,0,7861,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7830,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7832,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7834,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7863,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,7865,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,7867,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7836,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,7869,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2602,16 +2638,16 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,7838,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,7871,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7840,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7842,0,0,0,0, -0,7844,0,0,0,0,0,0,0,0,0,7846,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,7873,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7875,0,0,0,0, +0,7877,0,0,0,0,0,0,0,0,0,7879,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7848, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7881, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7850,7852,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7883,7885,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2623,10 +2659,10 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7854,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7856,0, +0,0,0,0,0,0,0,0,0,0,0,7887,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7889,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7858,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7891,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2634,120 +2670,120 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7862,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7895,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7864,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7866,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,7897,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7899,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7868,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7901,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7870,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7903,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7872,0, -7874,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7905,0, +7907,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7876,0,0,0,0,0,0,0,0,0,0,7878,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7882,0,0,0,0, -0,0,0,0,0,7884,0,0,0,0,0,0,0,0,0,0, +7909,0,0,0,0,0,0,0,0,0,0,7911,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7915,0,0,0,0, +0,0,0,0,0,7917,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7898,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7931,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7904, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7937, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -7906,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +7939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,7908,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,7941,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7910,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,7943,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,7912,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7916,0,0,0,0,0,0,0,0, +0,0,0,0,0,7945,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,7949,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7920,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7953,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,7922,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,7955,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,7924,0,0,7926,0,0,0,0,0,0, +0,0,0,0,0,0,7957,0,0,7959,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7928,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,7961,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7930,0,0,0,0,0,0, -0,7932,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7934,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,7936,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7963,0,0,0,0,0,0, +0,7965,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7967,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,7969,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,7942,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,7975,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7956,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,7989,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7958,0,0,0,0,0,0, -0,0,0,0,0,7960,0,0,0,0,0,0,0,0,0,0, -7962,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,7991,0,0,0,0,0,0, +0,0,0,0,0,7993,0,0,0,0,0,0,0,0,0,0, +7995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7968,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8001,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,7970,0,7972, +0,0,0,0,0,0,0,0,0,0,0,0,0,8003,0,8005, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,7974,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8007,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,7976,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,8009,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,7986,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,7988,0,0,0,0, -0,0,0,0,0,0,0,7992,0,0,0,0,0,0,0,0, -0,0,0,0,7996,0,0,0,0,0,0,0,0,0,0,0, -0,7998,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,8019,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,8021,0,0,0,0, +0,0,0,0,0,0,0,8025,0,0,0,0,0,0,0,0, +0,0,0,0,8029,0,0,0,0,0,0,0,0,0,0,0, +0,8031,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8000,0,0,0,0,0,0,0,0,0,8002,0,0,0,0,0, +8033,0,0,0,0,0,0,0,0,0,8035,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,8004,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,8037,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2759,51 +2795,51 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,8012,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,8045,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,8014,0,0,0, -0,8016,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,8047,0,0,0, +0,8049,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8018,0,8020,0,0,0, +0,0,0,0,0,0,0,0,0,0,8051,0,8053,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,8022,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,8055,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8024,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,8028,0,8030,0, -0,0,0,0,0,0,0,0,8032,8034,0,0,0,0,0,0, -8036,0,0,0,0,0,8038,0,0,0,0,0,0,8040,8042,0, -0,0,0,0,0,8044,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8046, -0,0,0,0,0,0,0,0,0,0,0,0,0,8048,8050,8052, +0,0,0,0,0,0,0,0,0,0,8057,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,8061,0,8063,0, +0,0,0,0,0,0,0,0,8065,8067,0,0,0,0,0,0, +8069,0,0,0,0,0,8071,0,0,0,0,0,0,8073,8075,0, +0,0,0,0,0,8077,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8079, +0,0,0,0,0,0,0,0,0,0,0,0,0,8081,8083,8085, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8054,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8087,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8060,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,8093,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,8064,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,8097,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8066,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +8099,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,8070,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,8103,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,8072,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,8074,0,0,0,0, +0,8105,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,8107,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8078,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +8111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2813,47 +2849,47 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8080,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +8113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8082,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8115,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8084,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,8088,0,0,0,0, +8117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,8121,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8090,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8123,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8092,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8125,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,8094,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,8096,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,8127,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,8129,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8102,0,0,0,0,0,0,0,0,0,0,0,0,8104, +8133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8135,0,0,0,0,0,0,0,0,0,0,0,0,8137, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,8106,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,8139,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8110,0, +8141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8143,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,8112,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,8114,0,0,0,0,0,0, +0,0,0,0,8145,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,8147,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,8116,0,0,0,0,0,0,0,0, -0,8118,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,8149,0,0,0,0,0,0,0,0, +0,8151,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2868,28 +2904,28 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8122,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8155,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8126,0,0,0,0,0,0,8128,0,0,0,0,0,0, -0,0,0,0,0,8130,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8134,0,0,0,0,0, +0,0,8159,0,0,0,0,0,0,8161,0,0,0,0,0,0, +0,0,0,0,0,8163,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,8167,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8136,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,8169,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,8138,0,0,0,8140,0,0,0,0,0,0,0,0,0,0, +0,8171,0,0,0,8173,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,8148,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,8181,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8150, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8152,0, -0,0,0,0,0,0,0,0,0,0,0,8158,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8183, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8185,0, +0,0,0,0,0,0,0,0,0,0,0,8191,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2910,8 +2946,8 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8160,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8164,0,0,0,0,8168,0,0, +0,0,0,0,0,0,0,0,8193,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,8197,0,0,0,0,8201,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2919,38 +2955,38 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8182, -0,0,0,0,0,0,0,0,0,8188,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8215, +0,0,0,0,0,0,0,0,0,8221,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,8190,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,8223,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,8192,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,8225,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8194,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8227,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,8196,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,8229,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8198, -0,8200,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8231, +0,8233,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8202,0,0, -0,0,0,0,0,0,0,0,0,8204,0,0,0,0,0,0, -0,0,0,0,0,0,0,8206,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,8235,0,0, +0,0,0,0,0,0,0,0,0,8237,0,0,0,0,0,0, +0,0,0,0,0,0,0,8239,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2959,8 +2995,8 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8208,0, -0,0,0,0,0,0,0,0,0,0,0,0,8210,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8241,0, +0,0,0,0,0,0,0,0,0,0,0,0,8243,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -2973,16 +3009,16 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8212,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,8245,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8214,0,0,0,0,0, -0,0,0,0,0,0,8216,0,0,0,0,0,0,0,0,0, -0,0,8218,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8220,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8222, +0,0,0,0,0,0,0,0,0,0,8247,0,0,0,0,0, +0,0,0,0,0,0,8249,0,0,0,0,0,0,0,0,0, +0,0,8251,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,8253,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8255, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,8226,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,8259,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3000,20 +3036,20 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,8230,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,8263,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8232,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,8265,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8234, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8267, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,8238,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,8271,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3021,20 +3057,20 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8242,0,0,0,0,0,0,0,0,0,0,0,0,8244, +0,0,8275,0,0,0,0,0,0,0,0,0,0,0,0,8277, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,8246,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8248,0,0,0,0,0,0,0, +0,8279,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,8281,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +8283,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,8252,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,8285,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,8254,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,8287,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,8258,0,0,0,0,8260,0,0,0,0, -0,0,0,0,0,0,8262,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,8291,0,0,0,0,8293,0,0,0,0, +0,0,0,0,0,0,8295,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3051,21 +3087,21 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8268,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8270, -0,0,0,0,0,0,0,0,0,0,0,8272,0,0,0,0, -0,0,8274,0,0,0,8276,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8278,0,0, -0,0,0,0,0,0,0,0,8280,0,0,0,0,0,8282,0, -0,8284,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,8301,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8303, +0,0,0,0,0,0,0,0,0,0,0,8305,0,0,0,0, +0,0,8307,0,0,0,8309,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,8311,0,0, +0,0,0,0,0,0,0,0,8313,0,0,0,0,0,8315,0, +0,8317,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,8286,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,8319,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8288,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,8321,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8290,0,0,0,0,0,0,0,0,0,8292,0,0,0,0,0, +8323,0,0,0,0,0,0,0,0,0,8325,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3077,7 +3113,7 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8298,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,8331,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3085,11 +3121,11 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8308,0,0,0,0,0,8312,0,0,0,0,0,0,0, -0,0,0,8314,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8341,0,0,0,0,0,8345,0,0,0,0,0,0,0, +0,0,0,8347,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8316,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,8349,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3103,7 +3139,7 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8324, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8357, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3117,66 +3153,66 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8328,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,8361,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,8330,0,0,0,8332,0,0,0,0,0, -0,0,0,0,0,0,0,0,8334,0,0,8336,0,0,0,0, +0,0,0,0,0,0,8363,0,0,0,8365,0,0,0,0,0, +0,0,0,0,0,0,0,0,8367,0,0,8369,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8338,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8371,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8342,0,0,0,0,0,8346,0,0,0,0,0,0,0,0,0, +8375,0,0,0,0,0,8379,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,8348,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8350,0,0,0,0,0,0,0, +0,0,0,8381,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,8383,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8354,0,0,0,0,0,0,0,0,0,8356,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8358, +0,0,8387,0,0,0,0,0,0,0,0,0,8389,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8391, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8362,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8395,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8364,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,8397,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8368,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,8401,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,8370,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,8403,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,8372,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,8376,0,0,8378, -0,8380,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,8405,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,8409,0,0,8411, +0,8413,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,8382,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,8415,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,8384,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,8417,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3185,11 +3221,11 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,8386,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,8419,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8388,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,8421,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3227,7 +3263,7 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8394,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,8427,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3235,26 +3271,26 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8398,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8431,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,8400,0,8402,0,0, +0,0,0,0,0,0,0,0,0,0,0,8433,0,8435,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,8404,0,0,8406,0,0,0,8408,0,0,0, -0,0,0,0,0,0,8410,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,8437,0,0,8439,0,0,0,8441,0,0,0, +0,0,0,0,0,0,8443,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,8412,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8416,0,0,0,0,0,0,0, +0,0,0,8445,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,8449,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8420,8422,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,8426,8428,0,0,0,0,0,0,0,0, +0,0,8453,8455,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,8459,8461,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8430,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8432,0,0,0,0,0,0,0, -0,0,0,0,0,0,8436,0,0,0,0,0,0,0,0,0, +0,0,8463,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,8465,0,0,0,0,0,0,0, +0,0,0,0,0,0,8469,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3262,15 +3298,15 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,8446,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,8479,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8452, -0,0,0,0,0,0,0,0,0,0,0,8458,0,0,0,0, -0,0,0,0,0,0,0,0,8460,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8485, +0,0,0,0,0,0,0,0,0,0,0,8491,0,0,0,0, +0,0,0,0,0,0,0,0,8493,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,8462,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,8495,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8464,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8497,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3279,11 +3315,11 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8472, -0,0,0,0,0,0,0,0,0,0,0,0,8474,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8505, +0,0,0,0,0,0,0,0,0,0,0,0,8507,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,8476,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,8509,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3296,14 +3332,14 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,8484,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,8517,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8486,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,8519,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3314,12 +3350,12 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8494,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,8527,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8506, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8539, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3334,7 +3370,7 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,8508,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,8541,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3356,24 +3392,24 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,8512,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,8545,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,8514,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,8547,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8516,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8549,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8520, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8553, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,8522,0,0,0,0,0,0,0,8524, +0,0,0,0,0,0,0,8555,0,0,0,0,0,0,0,8557, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,8534,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,8567,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3381,19 +3417,19 @@ static const guint16 helperIndex [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,8550,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,8583,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,8556,8558,0, -0,0,0,0,0,0,0,0,0,0,0,0,8560,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,8589,8591,0, +0,0,0,0,0,0,0,0,0,0,0,0,8593,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,8566,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,8601,0,0,0,0,0,0, 0}; static const guint16 mapIdxToComposite [] = { 0,0,0,0,0,0,0,0,894,0,0,0,8814,0,0,0, @@ -3616,178 +3652,178 @@ static const guint16 mapIdxToComposite [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8070,0,0,8071,0,0,7946,0,0,7948,0,0,7950,0,0,8072, -0,0,7947,0,0,7949,0,0,7951,0,0,8073,0,0,8074,0, -0,8075,0,0,8076,0,0,8077,0,0,8078,0,0,8079,0,0, -7954,0,0,7956,0,0,7955,0,0,7957,0,0,7962,0,0,7964, -0,0,7963,0,0,7965,0,0,7970,0,0,7972,0,0,7974,0, -0,8080,0,0,7971,0,0,7973,0,0,7975,0,0,8081,0,0, -8082,0,0,8083,0,0,8084,0,0,8085,0,0,8086,0,0,8087, -0,0,7978,0,0,7980,0,0,7982,0,0,8088,0,0,7979,0, -0,7981,0,0,7983,0,0,8089,0,0,8090,0,0,8091,0,0, -8092,0,0,8093,0,0,8094,0,0,8095,0,0,7986,0,0,7988, -0,0,7990,0,0,7987,0,0,7989,0,0,7991,0,0,7994,0, -0,7996,0,0,7998,0,0,7995,0,0,7997,0,0,7999,0,0, -8002,0,0,8004,0,0,8003,0,0,8005,0,0,8010,0,0,8012, -0,0,8011,0,0,8013,0,0,8018,0,0,8020,0,0,8022,0, -0,8019,0,0,8021,0,0,8023,0,0,8027,0,0,8029,0,0, -8031,0,0,8034,0,0,8036,0,0,8038,0,0,8096,0,0,8035, -0,0,8037,0,0,8039,0,0,8097,0,0,8098,0,0,8099,0, -0,8100,0,0,8101,0,0,8102,0,0,8103,0,0,8042,0,0, -8044,0,0,8046,0,0,8104,0,0,8043,0,0,8045,0,0,8047, -0,0,8105,0,0,8106,0,0,8107,0,0,8108,0,0,8109,0, -0,8110,0,0,8111,0,0,8114,0,0,8130,0,0,8178,0,0, -8119,0,0,8141,0,0,8142,0,0,8143,0,0,8135,0,0,8183, -0,0,8157,0,0,8158,0,0,8159,0,0,8192,0,8193,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,8602,0,0,0,0,0,0,8603,0,0,0,0,8622,0, -0,8653,0,0,8655,0,0,8654,0,0,8708,0,0,8713,0,0, -8716,0,0,0,0,0,0,8740,0,0,8742,0,0,0,0,0, +7940,0,0,7942,0,0,8064,0,0,7939,0,0,7941,0,0,7943, +0,0,8065,0,0,8066,0,0,8067,0,0,8068,0,0,8069,0, +0,8070,0,0,8071,0,0,7946,0,0,7948,0,0,7950,0,0, +8072,0,0,7947,0,0,7949,0,0,7951,0,0,8073,0,0,8074, +0,0,8075,0,0,8076,0,0,8077,0,0,8078,0,0,8079,0, +0,7954,0,0,7956,0,0,7955,0,0,7957,0,0,7962,0,0, +7964,0,0,7963,0,0,7965,0,0,7970,0,0,7972,0,0,7974, +0,0,8080,0,0,7971,0,0,7973,0,0,7975,0,0,8081,0, +0,8082,0,0,8083,0,0,8084,0,0,8085,0,0,8086,0,0, +8087,0,0,7978,0,0,7980,0,0,7982,0,0,8088,0,0,7979, +0,0,7981,0,0,7983,0,0,8089,0,0,8090,0,0,8091,0, +0,8092,0,0,8093,0,0,8094,0,0,8095,0,0,7986,0,0, +7988,0,0,7990,0,0,7987,0,0,7989,0,0,7991,0,0,7994, +0,0,7996,0,0,7998,0,0,7995,0,0,7997,0,0,7999,0, +0,8002,0,0,8004,0,0,8003,0,0,8005,0,0,8010,0,0, +8012,0,0,8011,0,0,8013,0,0,8018,0,0,8020,0,0,8022, +0,0,8019,0,0,8021,0,0,8023,0,0,8027,0,0,8029,0, +0,8031,0,0,8034,0,0,8036,0,0,8038,0,0,8096,0,0, +8035,0,0,8037,0,0,8039,0,0,8097,0,0,8098,0,0,8099, +0,0,8100,0,0,8101,0,0,8102,0,0,8103,0,0,8042,0, +0,8044,0,0,8046,0,0,8104,0,0,8043,0,0,8045,0,0, +8047,0,0,8105,0,0,8106,0,0,8107,0,0,8108,0,0,8109, +0,0,8110,0,0,8111,0,0,8114,0,0,8130,0,0,8178,0, +0,8119,0,0,8141,0,0,8142,0,0,8143,0,0,8135,0,0, +8183,0,0,8157,0,0,8158,0,0,8159,0,0,8192,0,8193,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -8769,0,0,8772,0,0,8775,0,0,8777,0,0,8813,0,0,8802, -0,0,8816,0,0,8817,0,0,8820,0,0,8821,0,0,8824,0, -0,8825,0,0,8832,0,0,8833,0,0,8928,0,0,8929,0,0, -8836,0,0,8837,0,0,8840,0,0,8841,0,0,8930,0,0,8931, -0,0,8876,0,0,8877,0,0,8878,0,0,8879,0,0,8938,0, -0,8939,0,0,8940,0,0,8941,0,0,0,0,0,0,0,0, -0,0,0,0,10972,0,0,0,0,0,0,0,0,9001,0,9002, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,12436,0,0,12364,0, -0,12366,0,0,12368,0,0,12370,0,0,12372,0,0,12374,0,0, -12376,0,0,12378,0,0,12380,0,0,12382,0,0,12384,0,0,12386, -0,0,12389,0,0,12391,0,0,12393,0,0,12400,0,0,12401,0, -0,12403,0,0,12404,0,0,12406,0,0,12407,0,0,12409,0,0, -12410,0,0,12412,0,0,12413,0,0,0,0,0,0,0,0,0, -12446,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,12532,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12460, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,12462,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,12464,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -12466,0,0,0,0,0,0,0,0,12468,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,12470,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,12472,0,0,0,0,0,0, -0,0,0,12474,0,0,0,0,12476,0,0,0,0,0,0,0, -0,0,0,0,0,12478,0,0,0,0,12480,0,0,0,0,0, -0,0,0,12482,0,0,0,0,0,0,12485,0,0,0,0,12487, -0,0,0,0,0,0,0,12489,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,12496,0,0,12497,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,12499,0, -0,12500,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,12502,0,0,12503,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,12505,0,0,12506,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,12508,0,0,12509,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -12535,0,0,0,0,0,0,0,0,12536,0,0,0,0,12537,0, -0,0,0,12538,0,0,0,0,0,0,0,0,12542,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,64210,0,64211,0,64212,0,0,0,0, -0,0,0,0,0,0,0,0,0,63847,0,0,0,64112,0,0, -0,0,0,63749,0,0,0,63838,0,0,0,0,0,0,0,63771, -0,0,0,63930,0,0,0,0,0,0,0,63863,0,0,0,63997, -0,63912,0,0,0,0,0,64115,0,63789,0,63925,0,64048,0,63845, -0,63956,0,63931,0,64049,0,0,0,0,0,64012,0,64116,0,64050, -0,0,0,64114,0,63864,0,0,0,63953,0,64117,0,0,0,0, -0,0,0,0,0,64113,0,63790,0,63865,0,63829,0,63828,0,64021, -0,0,0,0,0,0,0,64000,0,63900,0,63965,0,63999,0,63943, -0,63882,0,63901,0,0,0,64118,0,64051,0,63826,0,63791,0,64052, -0,63871,0,0,0,64119,0,0,0,63843,0,0,0,0,0,0, -0,63979,0,0,0,0,0,0,0,64053,0,0,0,0,0,0, -0,0,0,63772,0,0,0,0,0,63851,0,0,0,0,0,63750, -0,0,0,0,0,63966,0,63981,0,63872,0,63902,0,64121,0,63755, -0,64122,0,64120,0,64013,0,64123,0,64055,0,64056,0,0,0,0, -0,63913,0,0,0,0,0,64057,0,64016,0,63852,0,64058,0,64125, -0,63818,0,63810,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,64126,0,63756,0,63753,0,64127,0,63873,0, -64128,0,64129,0,0,0,0,0,0,0,64004,0,0,0,63839,0, -63932,0,0,0,0,0,0,0,0,0,63933,0,63819,0,64059,0, -63967,0,64060,0,0,0,63957,0,63777,0,63915,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,63886,0,0,0,0, -0,64001,0,63906,0,63784,0,64130,0,64011,0,64131,0,63874,0,0, -0,0,0,63811,0,0,0,0,0,0,0,0,0,64132,0,0, -0,63960,0,63846,0,64133,0,0,0,63907,0,63840,0,63916,0,64061, -0,64134,0,63929,0,64136,0,63961,0,64135,0,64138,0,64062,0,64063, -0,63887,0,64064,0,63757,0,63888,0,0,0,63954,0,64140,0,0, -0,0,0,63781,0,63835,0,64002,0,63859,0,63908,0,63861,0,64141, -0,64142,0,64143,0,63889,0,63792,0,0,0,0,0,64065,0,64144, -0,63849,0,0,0,0,0,63934,0,0,0,0,0,63875,0,0, -0,64066,0,0,0,0,0,0,63968,0,0,0,0,64145,0,63941, -0,64067,0,64006,0,63883,0,0,0,63745,0,0,0,0,0,64146, -0,64147,0,0,0,63969,0,64148,0,63944,0,63988,0,63945,0,63962, -0,0,0,0,0,0,0,0,63866,0,64068,0,63970,0,63836,0, -63820,0,63793,0,63773,0,0,0,0,0,0,0,63884,0,64149,0, -63909,0,0,0,63856,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,63858,0,63848,0,63971,0,0,0,63765,0,64005,0, -63946,0,63786,0,64069,0,63989,0,63821,0,63958,0,64070,0,63947,0, -63980,0,64153,0,63748,0,64152,0,63822,0,64071,0,63890,0,63778,0, -63876,0,64155,0,0,0,63995,0,63903,0,63766,0,63891,0,64156,0, -63936,0,63982,0,63794,0,63774,0,0,0,64073,0,64158,0,0,0, -0,0,0,0,0,0,0,0,0,0,63814,0,0,0,0,0, -64159,0,63994,0,63787,0,64022,0,63911,0,0,0,63963,0,0,0, -63917,0,63767,0,63972,0,63948,0,64074,0,63918,0,64161,0,63892,0, -63983,0,0,0,0,0,64162,0,0,0,0,0,0,0,0,0, -0,0,0,0,64163,0,63949,0,63862,0,63842,0,0,0,0,0, -63973,0,64164,0,64165,0,63937,0,63758,0,0,0,0,0,0,0, -0,0,64023,0,64167,0,0,0,63795,0,0,0,64168,0,63853,0, -64170,0,64169,0,64157,0,0,0,0,0,0,0,63950,0,63803,0, -64075,0,63815,0,64171,0,63844,0,63877,0,0,0,64024,0,64076,0, -64078,0,64077,0,64079,0,64080,0,64081,0,64025,0,64026,0,63804,0, -64082,0,64083,0,64027,0,63926,0,0,0,0,0,63893,0,0,0, -63830,0,64084,0,0,0,64085,0,64172,0,63991,0,0,0,63992,0, -64173,0,63910,0,63812,0,0,0,64174,0,63993,0,64029,0,64003,0, -63867,0,0,0,63951,0,63850,0,63823,0,64175,0,63805,0,63831,0, -63894,0,64088,0,63824,0,64089,0,0,0,64177,0,0,0,64090,0, -63974,0,63759,0,0,0,63919,0,64030,0,63796,0,64091,0,0,0, -0,0,0,0,63920,0,63895,0,63813,0,0,0,0,0,63827,0, -63782,0,0,0,63990,0,0,0,64092,0,0,0,0,0,0,0, -0,0,0,0,0,0,63868,0,0,0,0,0,64094,0,63860,0, -63998,0,64179,0,63806,0,64180,0,63832,0,63768,0,63854,0,64095,0, -63897,0,63938,0,63779,0,63984,0,63797,0,64032,0,63775,0,63760,0, -0,0,63798,0,0,0,64181,0,63761,0,63783,0,0,0,64008,0, -0,0,63904,0,63975,0,63976,0,63762,0,64096,0,64182,0,63780,0, -0,0,64183,0,64010,0,64184,0,0,0,0,0,63855,0,64185,0, -64187,0,63869,0,63809,0,64190,0,64034,0,64189,0,64188,0,64191,0, -63996,0,63834,0,64192,0,0,0,0,0,63744,0,0,0,0,0, -0,0,0,0,63816,0,0,0,63747,0,64100,0,64193,0,0,0, -0,0,0,0,63799,0,0,0,63746,0,63896,0,63959,0,64194,0, -64007,0,63885,0,0,0,63857,0,0,0,64102,0,63898,0,64037,0, -0,0,64195,0,63939,0,63763,0,0,0,63788,0,64038,0,0,0, -63769,0,64196,0,63927,0,0,0,63977,0,63870,0,63754,0,63921,0, -64197,0,63807,0,63899,0,0,0,0,0,63878,0,0,0,63942,0, -63825,0,64009,0,63833,0,63955,0,64198,0,63964,0,63985,0,0,0, -63928,0,0,0,63978,0,64199,0,0,0,63922,0,63817,0,63800,0, -63923,0,0,0,64200,0,0,0,0,0,0,0,0,0,64201,0, -0,0,0,0,64105,0,0,0,0,0,64203,0,63924,0,64106,0, -63952,0,0,0,0,0,0,0,64042,0,64043,0,64044,0,0,0, -0,0,0,0,63770,0,63879,0,0,0,0,0,0,0,64205,0, -0,0,0,0,0,0,0,0,0,0,63801,0,63986,0,0,0, -64045,0,63802,0,63776,0,0,0,63808,0,63880,0,63987,0,0,0, -0,0,0,0,0,0,63881,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,64216,0,0,0,0,0,63940,0,64217,0, -64206,0,0,0,0,0,64300,0,0,64301,0,0,64208,0,64207,0, -64209,0,64213,0,64214,0,64215,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,8602,0,0,0,0,0,0,8603,0,0,0,0,8622, +0,0,8653,0,0,8655,0,0,8654,0,0,8708,0,0,8713,0, +0,8716,0,0,0,0,0,0,8740,0,0,8742,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,8769,0,0,8772,0,0,8775,0,0,8777,0,0,8813,0,0, +8802,0,0,8816,0,0,8817,0,0,8820,0,0,8821,0,0,8824, +0,0,8825,0,0,8832,0,0,8833,0,0,8928,0,0,8929,0, +0,8836,0,0,8837,0,0,8840,0,0,8841,0,0,8930,0,0, +8931,0,0,8876,0,0,8877,0,0,8878,0,0,8879,0,0,8938, +0,0,8939,0,0,8940,0,0,8941,0,0,0,0,0,0,0, +0,0,0,0,0,10972,0,0,0,0,0,0,0,0,9001,0, +9002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,12436,0,0,12364, +0,0,12366,0,0,12368,0,0,12370,0,0,12372,0,0,12374,0, +0,12376,0,0,12378,0,0,12380,0,0,12382,0,0,12384,0,0, +12386,0,0,12389,0,0,12391,0,0,12393,0,0,12400,0,0,12401, +0,0,12403,0,0,12404,0,0,12406,0,0,12407,0,0,12409,0, +0,12410,0,0,12412,0,0,12413,0,0,0,0,0,0,0,0, +0,12446,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,12532,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +12460,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,12462,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,12464,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,12466,0,0,0,0,0,0,0,0,12468,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,12470,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,12472,0,0,0,0,0, +0,0,0,0,12474,0,0,0,0,12476,0,0,0,0,0,0, +0,0,0,0,0,0,12478,0,0,0,0,12480,0,0,0,0, +0,0,0,0,12482,0,0,0,0,0,0,12485,0,0,0,0, +12487,0,0,0,0,0,0,0,12489,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,12496,0,0,12497,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12499, +0,0,12500,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,12502,0,0,12503,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,12505,0,0,12506,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,12508,0,0,12509,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,12535,0,0,0,0,0,0,0,0,12536,0,0,0,0,12537, +0,0,0,0,12538,0,0,0,0,0,0,0,0,12542,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,64210,0,64211,0,64212,0,0,0, +0,0,0,0,0,0,0,0,0,0,63847,0,0,0,64112,0, +0,0,0,0,63749,0,0,0,63838,0,0,0,0,0,0,0, +63771,0,0,0,63930,0,0,0,0,0,0,0,63863,0,0,0, +63997,0,63912,0,0,0,0,0,64115,0,63789,0,63925,0,64048,0, +63845,0,63956,0,63931,0,64049,0,0,0,0,0,64012,0,64116,0, +64050,0,0,0,64114,0,63864,0,0,0,63953,0,64117,0,0,0, +0,0,0,0,0,0,64113,0,63790,0,63865,0,63829,0,63828,0, +64021,0,0,0,0,0,0,0,64000,0,63900,0,63965,0,63999,0, +63943,0,63882,0,63901,0,0,0,64118,0,64051,0,63826,0,63791,0, +64052,0,63871,0,0,0,64119,0,0,0,63843,0,0,0,0,0, +0,0,63979,0,0,0,0,0,0,0,64053,0,0,0,0,0, +0,0,0,0,63772,0,0,0,0,0,63851,0,0,0,0,0, +63750,0,0,0,0,0,63966,0,63981,0,63872,0,63902,0,64121,0, +63755,0,64122,0,64054,0,64013,0,64123,0,64055,0,64056,0,0,0, +0,0,63913,0,0,0,0,0,64057,0,64124,0,63852,0,64058,0, +64125,0,63818,0,63810,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,64126,0,63756,0,63753,0,64127,0,63873, +0,64128,0,64129,0,0,0,0,0,0,0,64004,0,0,0,63914, +0,63932,0,0,0,0,0,0,0,0,0,63933,0,63819,0,64059, +0,63967,0,64060,0,0,0,63957,0,63777,0,63915,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,63886,0,0,0, +0,0,64001,0,63906,0,63784,0,64130,0,64011,0,64131,0,63874,0, +0,0,0,0,63811,0,0,0,0,0,0,0,0,0,64132,0, +0,0,63960,0,63846,0,64133,0,0,0,63907,0,63840,0,63916,0, +64061,0,64134,0,63929,0,64136,0,63961,0,64135,0,64138,0,64062,0, +64063,0,63887,0,64139,0,63757,0,63888,0,0,0,63954,0,64140,0, +0,0,0,0,63781,0,63835,0,64002,0,63859,0,63908,0,63861,0, +64141,0,64142,0,64143,0,63889,0,63792,0,0,0,0,0,64065,0, +64144,0,63849,0,0,0,0,0,63934,0,0,0,0,0,63875,0, +0,0,64066,0,0,0,0,0,0,63968,0,0,0,0,64018,0, +63941,0,64067,0,64006,0,63883,0,0,0,63745,0,0,0,0,0, +64146,0,64147,0,0,0,63969,0,64148,0,63944,0,63988,0,63945,0, +63962,0,0,0,0,0,0,0,0,63866,0,64068,0,63970,0,63764, +0,63820,0,63793,0,63773,0,0,0,0,0,0,0,63884,0,64149, +0,63909,0,0,0,64150,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,63858,0,63848,0,63971,0,0,0,63765,0,64005, +0,64151,0,63786,0,64069,0,63989,0,63821,0,63958,0,64070,0,63947, +0,63980,0,64153,0,63748,0,64152,0,63822,0,64071,0,63890,0,63778, +0,63876,0,64155,0,0,0,63995,0,63903,0,63766,0,63891,0,64072, +0,63936,0,63982,0,63794,0,63774,0,0,0,64073,0,64158,0,0, +0,0,0,0,0,0,0,0,0,0,0,63814,0,0,0,0, +0,64159,0,63994,0,63787,0,64022,0,63911,0,0,0,63963,0,0, +0,63917,0,63767,0,63972,0,63948,0,64074,0,63918,0,64161,0,63892, +0,63983,0,0,0,0,0,64162,0,0,0,0,0,0,0,0, +0,0,0,0,0,64163,0,63949,0,63862,0,63842,0,0,0,0, +0,63973,0,64164,0,64165,0,63937,0,63758,0,0,0,0,0,0, +0,0,0,64166,0,64167,0,0,0,63795,0,0,0,64168,0,63853, +0,64170,0,64169,0,64157,0,0,0,0,0,0,0,63950,0,63803, +0,64075,0,63815,0,64171,0,63844,0,63877,0,0,0,64024,0,64076, +0,64078,0,64077,0,64079,0,64080,0,64081,0,64025,0,64026,0,63804, +0,64082,0,64083,0,64027,0,63926,0,0,0,0,0,63893,0,0, +0,63830,0,64084,0,0,0,64085,0,64172,0,63991,0,0,0,63992, +0,64086,0,63910,0,63812,0,0,0,64174,0,63993,0,64029,0,64003, +0,63867,0,0,0,63951,0,63850,0,63823,0,64175,0,63805,0,63831, +0,64087,0,64088,0,63824,0,64089,0,0,0,64177,0,0,0,64090, +0,63974,0,63759,0,0,0,63919,0,64030,0,63796,0,64178,0,0, +0,0,0,0,0,63920,0,63895,0,63813,0,0,0,0,0,63827, +0,63782,0,0,0,63990,0,0,0,64092,0,0,0,0,0,0, +0,0,0,0,0,0,0,63868,0,0,0,0,0,64093,0,63860, +0,63998,0,64179,0,63806,0,64180,0,63832,0,63768,0,63854,0,64095, +0,63897,0,63938,0,63779,0,63984,0,63797,0,64032,0,63775,0,63760, +0,0,0,63798,0,0,0,64181,0,63761,0,63783,0,0,0,64008, +0,0,0,63904,0,63975,0,63976,0,63762,0,64096,0,64182,0,63780, +0,0,0,64183,0,64010,0,64097,0,0,0,0,0,63905,0,64185, +0,64187,0,63869,0,63809,0,64190,0,64034,0,64189,0,64188,0,64099, +0,63996,0,63834,0,64192,0,0,0,0,0,63744,0,0,0,0, +0,0,0,0,0,63816,0,0,0,63747,0,64100,0,64101,0,0, +0,0,0,0,0,63799,0,0,0,63746,0,63896,0,63959,0,64194, +0,64007,0,63885,0,0,0,63857,0,0,0,64102,0,63898,0,64037, +0,0,0,64195,0,63939,0,63763,0,0,0,63788,0,64038,0,0, +0,63769,0,64196,0,63927,0,0,0,63977,0,63870,0,63754,0,63921, +0,64197,0,63807,0,63899,0,0,0,0,0,63878,0,0,0,63942, +0,63825,0,64009,0,63833,0,63955,0,64198,0,63964,0,63985,0,0, +0,63928,0,0,0,63978,0,64199,0,0,0,63922,0,63817,0,63800, +0,63923,0,0,0,64028,0,0,0,0,0,0,0,0,0,64201, +0,0,0,0,0,64202,0,0,0,0,0,64203,0,63924,0,64204, +0,63952,0,0,0,0,0,0,0,64042,0,64043,0,64044,0,0, +0,0,0,0,0,63770,0,63879,0,0,0,0,0,0,0,64205, +0,0,0,0,0,0,0,0,0,0,0,63801,0,63986,0,0, +0,64045,0,63802,0,63776,0,0,0,63808,0,63880,0,63987,0,0, +0,0,0,0,0,0,0,63881,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,64216,0,0,0,0,0,63940,0,64217, 0}; static const guint8 combiningClass [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3797,16 +3833,16 @@ static const guint8 combiningClass [] = { 220,220,220,220,1,1,1,1,1,220,220,220,220,230,230,230, 230,230,230,230,230,240,230,220,220,220,230,230,230,220,220,0, 230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233, -0,0,0,230,230,230,230,0,0,0,0,0,0,0,0,0, +0,0,0,230,230,230,230,230,0,0,0,0,0,0,0,0, 0,220,230,230,230,230,220,230,230,230,222,220,230,230,230,230, 230,230,220,220,220,220,220,220,230,230,220,230,230,222,228,230, -10,11,12,13,14,15,16,17,18,19,0,20,21,22,0,23, +10,11,12,13,14,15,16,17,18,19,19,20,21,22,0,23, 0,24,25,0,230,220,0,18,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -230,230,230,230,230,230,0,0,0,0,0,0,0,0,0,0, +230,230,230,230,230,230,230,230,30,31,32,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,27,28,29,30,31, @@ -3861,7 +3897,7 @@ static const guint8 combiningClass [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,220,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,7,0,9,0,0,0,0,0,0, +0,0,0,0,0,0,0,7,0,9,9,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,230, 0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -3870,12 +3906,12 @@ static const guint8 combiningClass [] = { 0,0,0,0,0,0,0,0,0,228,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,222,230,220,0,0,0,0, 0,0,0,0,0,0,0,230,220,0,0,0,0,0,0,0, -230,230,220,230,0,0,0,0,0,0,0,0,0,0,0,0, +230,230,220,230,230,230,230,230,230,230,220,230,230,234,214,220, 230,230,1,1,230,230,230,230,1,1,1,230,230,0,0,0, -0,230,0,0,0,1,1,230,220,230,1,1,0,0,0,0, +0,230,0,0,0,1,1,230,220,230,1,1,220,220,220,220, 0,0,0,0,0,0,0,0,0,0,218,228,232,222,224,224, 0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0, 0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0, -230,230,230,230,0,0,0,0,0,0,0,0,0,0,0,0, +230,230,230,230,230,230,230,0,0,0,0,0,0,0,0,0, 0}; diff --git a/mono/metadata/object-internals.h b/mono/metadata/object-internals.h index 300a7fa884e..4d3c495c795 100644 --- a/mono/metadata/object-internals.h +++ b/mono/metadata/object-internals.h @@ -354,7 +354,7 @@ struct _MonoThread { * These fields are used to avoid having to increment corlib versions * when a new field is added to the unmanaged MonoThread structure. */ - gpointer unused2; + gpointer interrupt_on_stop; gpointer unused3; gpointer unused4; gpointer unused5; @@ -1063,6 +1063,17 @@ typedef struct { MonoReflectionType *created; } MonoReflectionTypeBuilder; +typedef struct { + MonoReflectionType type; + MonoReflectionType *element_type; + int rank; +} MonoReflectionArrayType; + +typedef struct { + MonoReflectionType type; + MonoReflectionType *element_type; +} MonoReflectionDerivedType; + typedef struct { MonoReflectionType type; MonoReflectionTypeBuilder *tbuilder; @@ -1213,6 +1224,12 @@ typedef struct { guint32 location; } MonoManifestResourceInfo; +/* A boxed IntPtr */ +typedef struct { + MonoObject object; + gpointer m_value; +} MonoIntPtr; + /* Keep in sync with System.GenericParameterAttributes */ typedef enum { GENERIC_PARAMETER_ATTRIBUTE_NON_VARIANT = 0, @@ -1236,6 +1253,7 @@ guint32 mono_image_create_method_token (MonoDynamicImage *assembly, MonoOb void mono_image_module_basic_init (MonoReflectionModuleBuilder *module) MONO_INTERNAL; void mono_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObject *obj) MONO_INTERNAL; void mono_dynamic_image_free (MonoDynamicImage *image) MONO_INTERNAL; +void mono_image_set_wrappers_type (MonoReflectionModuleBuilder *mb, MonoReflectionType *type) MONO_INTERNAL; void mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb) MONO_INTERNAL; @@ -1253,6 +1271,7 @@ void mono_reflection_create_dynamic_method (MonoReflectionDynamicMethod *m) MONO void mono_reflection_destroy_dynamic_method (MonoReflectionDynamicMethod *mb) MONO_INTERNAL; void mono_reflection_initialize_generic_parameter (MonoReflectionGenericParam *gparam) MONO_INTERNAL; +void mono_reflection_create_unmanaged_type (MonoReflectionType *type) MONO_INTERNAL; MonoArray* mono_param_get_objects_internal (MonoDomain *domain, MonoMethod *method, MonoClass *refclass) MONO_INTERNAL; diff --git a/mono/metadata/object.c b/mono/metadata/object.c index 33f261b513a..18c31b20e02 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -2591,6 +2591,8 @@ set_value (MonoType *type, void *dest, void *value, int deref_pointer) { int t; if (type->byref) { + /* object fields cannot be byref, so we don't need a + wbarrier here */ gpointer *p = (gpointer*)dest; *p = value; return; @@ -2661,12 +2663,14 @@ handle_enum: t = mono_class_enum_basetype (type->data.klass)->type; goto handle_enum; } else { - int size; - size = mono_class_value_size (mono_class_from_mono_type (type), NULL); - if (value == NULL) + MonoClass *class = mono_class_from_mono_type (type); + int size = mono_class_value_size (class, NULL); + if (value == NULL) { memset (dest, 0, size); - else + } else { memcpy (dest, value, size); + mono_gc_wbarrier_value_copy (dest, value, size, class); + } } return; case MONO_TYPE_GENERICINST: @@ -3590,8 +3594,21 @@ mono_runtime_invoke_array (MonoMethod *method, void *obj, MonoArray *params, else t = &t->data.generic_class->container_class->byval_arg; goto again; + case MONO_TYPE_PTR: { + MonoObject *arg; + + /* The argument should be an IntPtr */ + arg = mono_array_get (params, MonoObject*, i); + if (arg == NULL) { + pa [i] = NULL; + } else { + g_assert (arg->vtable->klass == mono_defaults.int_class); + pa [i] = ((MonoIntPtr*)arg)->m_value; + } + break; + } default: - g_error ("type 0x%x not handled in ves_icall_InternalInvoke", sig->params [i]->type); + g_error ("type 0x%x not handled in mono_runtime_invoke_array", sig->params [i]->type); } } } @@ -3638,6 +3655,27 @@ mono_runtime_invoke_array (MonoMethod *method, void *obj, MonoArray *params, /* obj must be already unboxed if needed */ res = mono_runtime_invoke (method, obj, pa, exc); + if (sig->ret->type == MONO_TYPE_PTR) { + MonoClass *pointer_class; + static MonoMethod *box_method; + void *box_args [2]; + MonoObject *box_exc; + + /* + * The runtime-invoke wrapper returns a boxed IntPtr, need to + * convert it to a Pointer object. + */ + pointer_class = mono_class_from_name_cached (mono_defaults.corlib, "System.Reflection", "Pointer"); + if (!box_method) + box_method = mono_class_get_method_from_name (pointer_class, "Box", -1); + + g_assert (res->vtable->klass == mono_defaults.int_class); + box_args [0] = ((MonoIntPtr*)res)->m_value; + box_args [1] = mono_type_get_object (mono_domain_get (), sig->ret); + res = mono_runtime_invoke (box_method, NULL, box_args, &box_exc); + g_assert (!box_exc); + } + if (has_byref_nullables) { /* * The runtime invoke wrapper already converted byref nullables back, diff --git a/mono/metadata/pedump.c b/mono/metadata/pedump.c index 6ab39c39f76..83091fcbffb 100644 --- a/mono/metadata/pedump.c +++ b/mono/metadata/pedump.c @@ -450,6 +450,11 @@ verify_image_file (const char *fname) if (!mono_verifier_verify_table_data (image, &errors)) goto invalid_image; + mono_image_load_names (image); + + if (!mono_verifier_verify_full_table_data (image, &errors)) + goto invalid_image; + return 0; invalid_image: diff --git a/mono/metadata/process.c b/mono/metadata/process.c index cfdce2ca994..ab6ed49a3ad 100644 --- a/mono/metadata/process.c +++ b/mono/metadata/process.c @@ -615,8 +615,8 @@ MonoBoolean ves_icall_System_Diagnostics_Process_ShellExecuteEx_internal (MonoPr shellex.cbSize = sizeof(SHELLEXECUTEINFO); shellex.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_NOCLOSEPROCESS | SEE_MASK_UNICODE; - shellex.nShow = SW_SHOWNORMAL; - + shellex.nShow = proc_start_info->window_style; + shellex.nShow = (shellex.nShow == 0) ? 1 : (shellex.nShow == 1 ? 0 : shellex.nShow); if (proc_start_info->filename != NULL) { diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c index 00c92b3b91c..179c722d40b 100644 --- a/mono/metadata/reflection.c +++ b/mono/metadata/reflection.c @@ -37,6 +37,7 @@ #include #include #include +#include #if HAVE_SGEN_GC static void* reflection_info_desc = NULL; @@ -173,6 +174,17 @@ static void get_default_param_value_blobs (MonoMethod *method, char **blobs, gui static MonoObject *mono_get_object_from_blob (MonoDomain *domain, MonoType *type, const char *blob); static MonoReflectionType *mono_reflection_type_get_underlying_system_type (MonoReflectionType* t); static MonoType* mono_reflection_get_type_with_rootimage (MonoImage *rootimage, MonoImage* image, MonoTypeNameParse *info, gboolean ignorecase, gboolean *type_resolve); +static MonoType* mono_reflection_type_get_handle (MonoReflectionType *ref); +static MonoReflectionType* mono_reflection_type_resolve_user_types (MonoReflectionType *type); + +#define RESOLVE_TYPE(type) do { type = (void*)mono_reflection_type_resolve_user_types ((MonoReflectionType*)type); } while (0) +#define RESOLVE_ARRAY_TYPE_ELEMENT(array, index) do { \ + MonoReflectionType *__type = mono_array_get (array, MonoReflectionType*, index); \ + __type = mono_reflection_type_resolve_user_types (__type); \ + mono_array_set (arr, MonoReflectionType*, index, __type); \ +} while (0) + +#define mono_type_array_get_and_resolve(array, index) mono_reflection_type_get_handle ((MonoReflectionType*)mono_array_get (array, gpointer, index)) void mono_reflection_init (void) @@ -690,14 +702,7 @@ encode_reflection_type (MonoDynamicImage *assembly, MonoReflectionType *type, Si return; } - if (type->type || - ((type = mono_reflection_type_get_underlying_system_type (type)) && type->type)) { - encode_type (assembly, type->type, buf); - return; - } - - g_assert_not_reached (); - + encode_type (assembly, mono_reflection_type_get_handle (type), buf); } static void @@ -707,16 +712,16 @@ encode_custom_modifiers (MonoDynamicImage *assembly, MonoArray *modreq, MonoArra if (modreq) { for (i = 0; i < mono_array_length (modreq); ++i) { - MonoReflectionType *mod = mono_type_array_get (modreq, i); + MonoType *mod = mono_type_array_get_and_resolve (modreq, i); sigbuffer_add_byte (buf, MONO_TYPE_CMOD_REQD); - sigbuffer_add_value (buf, mono_image_typedef_or_ref (assembly, mod->type)); + sigbuffer_add_value (buf, mono_image_typedef_or_ref (assembly, mod)); } } if (modopt) { for (i = 0; i < mono_array_length (modopt); ++i) { - MonoReflectionType *mod = mono_type_array_get (modopt, i); + MonoType *mod = mono_type_array_get_and_resolve (modopt, i); sigbuffer_add_byte (buf, MONO_TYPE_CMOD_OPT); - sigbuffer_add_value (buf, mono_image_typedef_or_ref (assembly, mod->type)); + sigbuffer_add_value (buf, mono_image_typedef_or_ref (assembly, mod)); } } } @@ -796,7 +801,7 @@ method_builder_encode_signature (MonoDynamicImage *assembly, ReflectionMethodBui if (mb->param_modopt && (i < mono_array_length (mb->param_modopt))) modopt = mono_array_get (mb->param_modopt, MonoArray*, i); encode_custom_modifiers (assembly, modreq, modopt, &buf); - pt = mono_type_array_get (mb->parameters, i); + pt = mono_array_get (mb->parameters, MonoReflectionType*, i); encode_reflection_type (assembly, pt, &buf); } if (notypes) @@ -804,7 +809,7 @@ method_builder_encode_signature (MonoDynamicImage *assembly, ReflectionMethodBui for (i = 0; i < notypes; ++i) { MonoReflectionType *pt; - pt = mono_type_array_get (mb->opt_types, i); + pt = mono_array_get (mb->opt_types, MonoReflectionType*, i); encode_reflection_type (assembly, pt, &buf); } @@ -832,7 +837,7 @@ encode_locals (MonoDynamicImage *assembly, MonoReflectionILGen *ilgen) if (lb->is_pinned) sigbuffer_add_value (&buf, MONO_TYPE_PINNED); - encode_reflection_type (assembly, monotype_cast (lb->type), &buf); + encode_reflection_type (assembly, (MonoReflectionType*)lb->type, &buf); } sig_idx = sigbuffer_add_to_blob_cached (assembly, &buf); sigbuffer_free (&buf); @@ -907,7 +912,7 @@ method_encode_clauses (MonoImage *image, MonoDynamicImage *assembly, MonoReflect clause->handler_offset = ex_block->start; clause->handler_len = ex_block->len; if (ex_block->extype) { - clause->data.catch_class = mono_class_from_mono_type (monotype_cast (ex_block->extype)->type); + clause->data.catch_class = mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)ex_block->extype)); } else { if (ex_block->type == MONO_EXCEPTION_CLAUSE_FILTER) clause->data.filter_offset = ex_block->filter_offset; @@ -1059,7 +1064,7 @@ fat_header: mono_image_add_stream_data (&assembly->code, (char*)&val, sizeof (guint32)); finally_start = ex_block->start + ex_block->len; if (ex_block->extype) { - val = mono_metadata_token_from_dor (mono_image_typedef_or_ref (assembly, monotype_cast (ex_block->extype)->type)); + val = mono_metadata_token_from_dor (mono_image_typedef_or_ref (assembly, mono_reflection_type_get_handle ((MonoReflectionType*)ex_block->extype))); } else { if (ex_block->type == MONO_EXCEPTION_CLAUSE_FILTER) val = ex_block->filter_offset; @@ -1384,7 +1389,7 @@ reflection_methodbuilder_from_method_builder (ReflectionMethodBuilder *rmb, Mono memset (rmb, 0, sizeof (ReflectionMethodBuilder)); rmb->ilgen = mb->ilgen; - rmb->rtype = monotype_cast (mb->rtype); + rmb->rtype = mono_reflection_type_resolve_user_types ((MonoReflectionType*)mb->rtype); rmb->parameters = mb->parameters; rmb->generic_params = mb->generic_params; rmb->generic_container = mb->generic_container; @@ -1647,7 +1652,7 @@ field_encode_signature (MonoDynamicImage *assembly, MonoReflectionFieldBuilder * sigbuffer_add_value (&buf, 0x06); encode_custom_modifiers (assembly, fb->modreq, fb->modopt, &buf); /* encode custom attributes before the type */ - encode_reflection_type (assembly, monotype_cast (fb->type), &buf); + encode_reflection_type (assembly, (MonoReflectionType*)fb->type, &buf); idx = sigbuffer_add_to_blob_cached (assembly, &buf); sigbuffer_free (&buf); return idx; @@ -1785,6 +1790,10 @@ encode_marshal_blob (MonoDynamicImage *assembly, MonoReflectionMarshal *minfo) { } } break; + case MONO_NATIVE_SAFEARRAY: + if (minfo->eltype) + sigbuffer_add_value (&buf, minfo->eltype); + break; case MONO_NATIVE_CUSTOM: if (minfo->guid) { str = mono_string_to_utf8 (minfo->guid); @@ -1800,7 +1809,7 @@ encode_marshal_blob (MonoDynamicImage *assembly, MonoReflectionMarshal *minfo) { /* custom marshaler type name */ if (minfo->marshaltype || minfo->marshaltyperef) { if (minfo->marshaltyperef) - str = type_get_fully_qualified_name (monotype_cast (minfo->marshaltyperef)->type); + str = type_get_fully_qualified_name (mono_reflection_type_get_handle ((MonoReflectionType*)minfo->marshaltyperef)); else str = mono_string_to_utf8 (minfo->marshaltype); len = strlen (str); @@ -1910,20 +1919,20 @@ property_encode_signature (MonoDynamicImage *assembly, MonoReflectionPropertyBui sigbuffer_add_byte (&buf, 0x08); sigbuffer_add_value (&buf, nparams); if (mb) { - encode_reflection_type (assembly, monotype_cast (mb->rtype), &buf); + encode_reflection_type (assembly, (MonoReflectionType*)mb->rtype, &buf); for (i = 0; i < nparams; ++i) { - MonoReflectionType *pt = mono_type_array_get (mb->parameters, i); + MonoReflectionType *pt = mono_array_get (mb->parameters, MonoReflectionType*, i); encode_reflection_type (assembly, pt, &buf); } } else if (smb && smb->parameters) { /* the property type is the last param */ - encode_reflection_type (assembly, mono_type_array_get (smb->parameters, nparams), &buf); + encode_reflection_type (assembly, mono_array_get (smb->parameters, MonoReflectionType*, nparams), &buf); for (i = 0; i < nparams; ++i) { - MonoReflectionType *pt = mono_type_array_get (smb->parameters, i); + MonoReflectionType *pt = mono_array_get (smb->parameters, MonoReflectionType*, i); encode_reflection_type (assembly, pt, &buf); } } else { - encode_reflection_type (assembly, monotype_cast (fb->type), &buf); + encode_reflection_type (assembly, (MonoReflectionType*)fb->type, &buf); } idx = sigbuffer_add_to_blob_cached (assembly, &buf); @@ -2905,17 +2914,17 @@ add_custom_modifiers (MonoDynamicImage *assembly, MonoType *type, MonoArray *mod pos = 0; if (modreq) { for (i = 0; i < mono_array_length (modreq); ++i) { - MonoReflectionType *mod = mono_type_array_get (modreq, i); + MonoType *mod = mono_type_array_get_and_resolve (modreq, i); t->modifiers [pos].required = 1; - t->modifiers [pos].token = mono_image_typedef_or_ref (assembly, mod->type); + t->modifiers [pos].token = mono_image_typedef_or_ref (assembly, mod); pos ++; } } if (modopt) { for (i = 0; i < mono_array_length (modopt); ++i) { - MonoReflectionType *mod = mono_type_array_get (modopt, i); + MonoType *mod = mono_type_array_get_and_resolve (modopt, i); t->modifiers [pos].required = 0; - t->modifiers [pos].token = mono_image_typedef_or_ref (assembly, mod->type); + t->modifiers [pos].token = mono_image_typedef_or_ref (assembly, mod); pos ++; } } @@ -2943,11 +2952,11 @@ mono_image_get_generic_field_token (MonoDynamicImage *assembly, MonoReflectionFi /* fb->type does not include the custom modifiers */ /* FIXME: We should do this in one place when a fieldbuilder is created */ if (fb->modreq || fb->modopt) { - custom = add_custom_modifiers (assembly, monotype_cast (fb->type)->type, fb->modreq, fb->modopt); + custom = add_custom_modifiers (assembly, mono_reflection_type_get_handle ((MonoReflectionType*)fb->type), fb->modreq, fb->modopt); sig = fieldref_encode_signature (assembly, custom); g_free (custom); } else { - sig = fieldref_encode_signature (assembly, monotype_cast (fb->type)->type); + sig = fieldref_encode_signature (assembly, mono_reflection_type_get_handle ((MonoReflectionType*)fb->type)); } parent = create_generic_typespec (assembly, (MonoReflectionTypeBuilder *) fb->typeb); @@ -3027,7 +3036,7 @@ mono_reflection_encode_sighelper (MonoDynamicImage *assembly, MonoReflectionSigH modopts = mono_array_get (helper->modopts, MonoArray*, i); encode_custom_modifiers (assembly, modreqs, modopts, &buf); - pt = mono_type_array_get (helper->arguments, i); + pt = mono_array_get (helper->arguments, MonoReflectionType*, i); encode_reflection_type (assembly, pt, &buf); } idx = sigbuffer_add_to_blob_cached (assembly, &buf); @@ -3093,10 +3102,8 @@ mono_image_get_array_token (MonoDynamicImage *assembly, MonoReflectionArrayMetho sig->call_convention = reflection_cc_to_file (m->call_conv); sig->param_count = nparams; sig->ret = m->ret? m->ret->type: &mono_defaults.void_class->byval_arg; - for (i = 0; i < nparams; ++i) { - MonoReflectionType *t = mono_type_array_get (m->parameters, i); - sig->params [i] = t->type; - } + for (i = 0; i < nparams; ++i) + sig->params [i] = mono_type_array_get_and_resolve (m->parameters, i); for (tmp = assembly->array_methods; tmp; tmp = tmp->next) { am = tmp->data; @@ -3148,7 +3155,7 @@ mono_image_get_type_info (MonoDomain *domain, MonoReflectionTypeBuilder *tb, Mon g_free (n); if (tb->parent && !(is_system && is_object) && !(tb->attrs & TYPE_ATTRIBUTE_INTERFACE)) { /* interfaces don't have a parent */ - values [MONO_TYPEDEF_EXTENDS] = mono_image_typedef_or_ref (assembly, monotype_cast (tb->parent)->type); + values [MONO_TYPEDEF_EXTENDS] = mono_image_typedef_or_ref (assembly, mono_reflection_type_get_handle ((MonoReflectionType*)tb->parent)); } else { values [MONO_TYPEDEF_EXTENDS] = 0; } @@ -3586,13 +3593,15 @@ mono_image_fill_export_table_from_type_forwarders (MonoReflectionAssemblyBuilder return; for (i = 0; i < mono_array_length (assemblyb->type_forwarders); ++i) { - MonoReflectionType *t = mono_type_array_get (assemblyb->type_forwarders, i); + MonoReflectionType *t = mono_array_get (assemblyb->type_forwarders, MonoReflectionType *, i); + MonoType *type; if (!t) continue; - g_assert (t->type); + type = mono_reflection_type_get_handle (t); + g_assert (type); - klass = mono_class_from_mono_type (t->type); + klass = mono_class_from_mono_type (type); add_exported_type (assemblyb, assembly, klass); } @@ -4725,6 +4734,12 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObject *obj, } else if (strcmp (klass->name, "MethodOnTypeBuilderInst") == 0) { MonoReflectionMethodOnTypeBuilderInst *m = (MonoReflectionMethodOnTypeBuilderInst*)obj; token = mono_image_get_method_on_inst_token (assembly, m, create_methodspec); + } else if (strcmp (klass->name, "ArrayType") == 0 || + strcmp (klass->name, "ByRefType") == 0|| + strcmp (klass->name, "PointerType") == 0) { + MonoReflectionType *type = (MonoReflectionType *)obj; + token = mono_metadata_token_from_dor ( + mono_image_typedef_or_ref (assembly, mono_reflection_type_get_handle (type))); } else { g_error ("requested token for %s\n", klass->name); } @@ -5860,6 +5875,13 @@ mono_image_module_basic_init (MonoReflectionModuleBuilder *moduleb) } } +void +mono_image_set_wrappers_type (MonoReflectionModuleBuilder *moduleb, MonoReflectionType *type) +{ + MonoDynamicImage *image = moduleb->dynamic_image; + image->wrappers_type = mono_class_from_mono_type (type->type); +} + #endif /* @@ -6285,11 +6307,21 @@ mono_method_get_object (MonoDomain *domain, MonoMethod *method, MonoClass *refcl void mono_method_clear_object (MonoDomain *domain, MonoMethod *method) { + MonoClass *klass; g_assert (method->dynamic); - clear_cached_object (domain, method, method->klass); + klass = method->klass; + while (klass) { + clear_cached_object (domain, method, klass); + klass = klass->parent; + } /* Added by mono_param_get_objects () */ clear_cached_object (domain, &(method->signature), NULL); + klass = method->klass; + while (klass) { + clear_cached_object (domain, &(method->signature), klass); + klass = klass->parent; + } } /* @@ -8465,17 +8497,104 @@ mono_reflection_type_get_underlying_system_type (MonoReflectionType* t) } #ifndef DISABLE_REFLECTION_EMIT + +static gboolean +is_corlib_type (MonoReflectionType *ref) +{ + return ref && mono_object_class (ref)->image == mono_defaults.corlib; +} + +static gboolean +is_sre_usertype (MonoReflectionType *ref) +{ + MonoClass *class = mono_object_class (ref); + return ref && class->image == mono_defaults.corlib && strcmp ("TypeDelegator", class->name); +} + +static gboolean +is_sre_array (MonoReflectionType *ref) +{ + return ref && is_corlib_type (ref) && + !strcmp ("ArrayType", mono_object_class (ref)->name) && + !strcmp ("System.Reflection.Emit", mono_object_class (ref)->name_space); +} + +static gboolean +is_sre_byref (MonoReflectionType *ref) +{ + return ref && is_corlib_type (ref) && + !strcmp ("ByRefType", mono_object_class (ref)->name) && + !strcmp ("System.Reflection.Emit", mono_object_class (ref)->name_space); +} + +static gboolean +is_sre_pointer (MonoReflectionType *ref) +{ + return ref && is_corlib_type (ref) && + !strcmp ("PointerType", mono_object_class (ref)->name) && + !strcmp ("System.Reflection.Emit", mono_object_class (ref)->name_space); +} + static MonoType* -mono_reflection_type_get_handle (MonoReflectionType* t) +mono_reflection_type_get_handle (MonoReflectionType* ref) { - if (t->type) - return t->type; + if (!ref) + return NULL; + if (ref->type) + return ref->type; + + if (!is_sre_usertype (ref)) + ref = mono_reflection_type_get_underlying_system_type (ref); + + if (is_sre_array (ref)) { + MonoType *res; + MonoReflectionArrayType *sre_array = (MonoReflectionArrayType*)ref; + MonoType *base = mono_reflection_type_get_handle (sre_array->element_type); + g_assert (base); + res = &mono_array_class_get (mono_class_from_mono_type (base), sre_array->rank)->byval_arg; + sre_array->type.type = res; + return res; + } else if (is_sre_byref (ref)) { + MonoType *res; + MonoReflectionDerivedType *sre_byref = (MonoReflectionDerivedType*)ref; + MonoType *base = mono_reflection_type_get_handle (sre_byref->element_type); + g_assert (base); + res = &mono_class_from_mono_type (base)->this_arg; + sre_byref->type.type = res; + return res; + } else if (is_sre_pointer (ref)) { + MonoType *res; + MonoReflectionDerivedType *sre_pointer = (MonoReflectionDerivedType*)ref; + MonoType *base = mono_reflection_type_get_handle (sre_pointer->element_type); + g_assert (base); + res = &mono_ptr_class_get (base)->byval_arg; + sre_pointer->type.type = res; + return res; + } - t = mono_reflection_type_get_underlying_system_type (t); - if (t) - return t->type; + g_error ("Cannot handle corlib user type %s", mono_type_full_name (&mono_object_class(ref)->byval_arg)); + return NULL; +} + +static MonoReflectionType* +mono_reflection_type_resolve_user_types (MonoReflectionType *type) +{ + if (!type || type->type) + return type; - return NULL; + if (!is_sre_usertype (type)) { + type = mono_reflection_type_get_underlying_system_type (type); + if (!is_sre_usertype (type)) + mono_raise_exception (mono_get_exception_not_supported ("User defined subclasses of System.Type are not yet supported22")); + } + + return type; +} + +void +mono_reflection_create_unmanaged_type (MonoReflectionType *type) +{ + mono_reflection_type_get_handle (type); } /** @@ -8491,10 +8610,8 @@ parameters_to_signature (MonoImage *image, MonoArray *parameters) { sig = image_g_malloc0 (image, sizeof (MonoMethodSignature) + sizeof (MonoType*) * count); sig->param_count = count; sig->sentinelpos = -1; /* FIXME */ - for (i = 0; i < count; ++i) { - MonoReflectionType *pt = mono_type_array_get (parameters, i); - sig->params [i] = mono_reflection_type_get_handle (pt); - } + for (i = 0; i < count; ++i) + sig->params [i] = mono_type_array_get_and_resolve (parameters, i); return sig; } @@ -8520,7 +8637,7 @@ method_builder_to_signature (MonoImage *image, MonoReflectionMethodBuilder *meth sig = parameters_to_signature (image, method->parameters); sig->hasthis = method->attrs & METHOD_ATTRIBUTE_STATIC? 0: 1; - sig->ret = method->rtype? monotype_cast (method->rtype)->type: &mono_defaults.void_class->byval_arg; + sig->ret = method->rtype? mono_reflection_type_get_handle ((MonoReflectionType*)method->rtype): &mono_defaults.void_class->byval_arg; sig->generic_param_count = method->generic_params ? mono_array_length (method->generic_params) : 0; return sig; } @@ -8543,7 +8660,7 @@ get_prop_name_and_type (MonoObject *prop, char **name, MonoType **type) if (strcmp (klass->name, "PropertyBuilder") == 0) { MonoReflectionPropertyBuilder *pb = (MonoReflectionPropertyBuilder *)prop; *name = mono_string_to_utf8 (pb->name); - *type = monotype_cast (pb->type)->type; + *type = mono_reflection_type_get_handle ((MonoReflectionType*)pb->type); } else { MonoReflectionProperty *p = (MonoReflectionProperty *)prop; *name = g_strdup (p->property->name); @@ -8561,7 +8678,7 @@ get_field_name_and_type (MonoObject *field, char **name, MonoType **type) if (strcmp (klass->name, "FieldBuilder") == 0) { MonoReflectionFieldBuilder *fb = (MonoReflectionFieldBuilder *)field; *name = mono_string_to_utf8 (fb->name); - *type = monotype_cast (fb->type)->type; + *type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type); } else { MonoReflectionField *f = (MonoReflectionField *)field; *name = g_strdup (mono_field_get_name (f->field)); @@ -8988,7 +9105,7 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb) MONO_ARCH_SAVE_REGS; - CHECK_MONOTYPE (tb->parent); + RESOLVE_TYPE (tb->parent); mono_loader_lock (); @@ -8996,9 +9113,9 @@ mono_reflection_setup_internal_class (MonoReflectionTypeBuilder *tb) /* check so we can compile corlib correctly */ if (strcmp (mono_object_class (tb->parent)->name, "TypeBuilder") == 0) { /* mono_class_setup_mono_type () guaranteess type->data.klass is valid */ - parent = monotype_cast (tb->parent)->type->data.klass; + parent = mono_reflection_type_get_handle ((MonoReflectionType*)tb->parent)->data.klass; } else { - parent = mono_class_from_mono_type (monotype_cast (tb->parent)->type); + parent = mono_class_from_mono_type (mono_reflection_type_get_handle ((MonoReflectionType*)tb->parent)); } } else { parent = NULL; @@ -9161,12 +9278,12 @@ mono_reflection_create_internal_class (MonoReflectionTypeBuilder *tb) fb = mono_array_get (tb->fields, MonoReflectionFieldBuilder*, 0); - if (!mono_type_is_valid_enum_basetype (monotype_cast (fb->type)->type)) { + if (!mono_type_is_valid_enum_basetype (mono_reflection_type_get_handle ((MonoReflectionType*)fb->type))) { mono_loader_unlock (); return; } - enum_basetype = monotype_cast (fb->type)->type; + enum_basetype = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type); klass->element_class = mono_class_from_mono_type (enum_basetype); if (!klass->element_class) klass->element_class = mono_class_from_mono_type (enum_basetype); @@ -9219,7 +9336,7 @@ mono_marshal_spec_from_builder (MonoImage *image, MonoAssembly *assembly, case MONO_NATIVE_CUSTOM: if (minfo->marshaltyperef) res->data.custom_data.custom_name = - type_get_fully_qualified_name (monotype_cast (minfo->marshaltyperef)->type); + type_get_fully_qualified_name (mono_reflection_type_get_handle ((MonoReflectionType*)minfo->marshaltyperef)); if (minfo->mcookie) res->data.custom_data.cookie = mono_string_to_utf8 (minfo->mcookie); break; @@ -9393,7 +9510,7 @@ reflection_methodbuilder_to_mono_method (MonoClass *klass, mono_array_get (rmb->ilgen->locals, MonoReflectionLocalBuilder*, i); header->locals [i] = image_g_new0 (image, MonoType, 1); - memcpy (header->locals [i], monotype_cast (lb->type)->type, sizeof (MonoType)); + memcpy (header->locals [i], mono_reflection_type_get_handle ((MonoReflectionType*)lb->type), sizeof (MonoType)); } header->num_clauses = num_clauses; @@ -9578,7 +9695,7 @@ fieldbuilder_to_mono_class_field (MonoClass *klass, MonoReflectionFieldBuilder* field->name = mono_string_to_utf8 (fb->name); if (fb->attrs || fb->modreq || fb->modopt) { - field->type = mono_metadata_type_dup (NULL, monotype_cast (fb->type)->type); + field->type = mono_metadata_type_dup (NULL, mono_reflection_type_get_handle ((MonoReflectionType*)fb->type)); field->type->attrs = fb->attrs; g_assert (klass->image->dynamic); @@ -9586,7 +9703,7 @@ fieldbuilder_to_mono_class_field (MonoClass *klass, MonoReflectionFieldBuilder* g_free (field->type); field->type = custom; } else { - field->type = monotype_cast (fb->type)->type; + field->type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type); } if (fb->offset != -1) field->offset = fb->offset; @@ -9995,8 +10112,8 @@ ensure_runtime_vtable (MonoClass *klass) klass->interface_count = mono_array_length (tb->interfaces); klass->interfaces = mono_image_alloc (klass->image, sizeof (MonoClass*) * klass->interface_count); for (i = 0; i < klass->interface_count; ++i) { - MonoReflectionType *iface = mono_type_array_get (tb->interfaces, i); - klass->interfaces [i] = mono_class_from_mono_type (iface->type); + MonoType *iface = mono_type_array_get_and_resolve (tb->interfaces, i); + klass->interfaces [i] = mono_class_from_mono_type (iface); ensure_runtime_vtable (klass->interfaces [i]); } klass->interfaces_inited = 1; @@ -10112,10 +10229,10 @@ typebuilder_setup_fields (MonoClass *klass) field = &klass->fields [i]; field->name = mono_string_to_utf8_image (image, fb->name); if (fb->attrs) { - field->type = mono_metadata_type_dup (klass->image, monotype_cast (fb->type)->type); + field->type = mono_metadata_type_dup (klass->image, mono_reflection_type_get_handle ((MonoReflectionType*)fb->type)); field->type->attrs = fb->attrs; } else { - field->type = monotype_cast (fb->type)->type; + field->type = mono_reflection_type_get_handle ((MonoReflectionType*)fb->type); } if ((fb->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA) && fb->rva_data) klass->ext->field_def_values [i].data = mono_array_addr (fb->rva_data, char, 0); @@ -10270,7 +10387,7 @@ check_array_for_usertypes (MonoArray *arr) return; for (i = 0; i < mono_array_length (arr); ++i) - CHECK_MONOTYPE (mono_array_get (arr, gpointer, i)); + RESOLVE_ARRAY_TYPE_ELEMENT (arr, i); } MonoReflectionType* @@ -10289,17 +10406,17 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb) /* * Check for user defined Type subclasses. */ - CHECK_MONOTYPE (tb->parent); + RESOLVE_TYPE (tb->parent); check_array_for_usertypes (tb->interfaces); if (tb->fields) { for (i = 0; i < mono_array_length (tb->fields); ++i) { MonoReflectionFieldBuilder *fb = mono_array_get (tb->fields, gpointer, i); if (fb) { - CHECK_MONOTYPE (fb->type); + RESOLVE_TYPE (fb->type); check_array_for_usertypes (fb->modreq); check_array_for_usertypes (fb->modopt); if (fb->marshal_info && fb->marshal_info->marshaltyperef) - CHECK_MONOTYPE (fb->marshal_info->marshaltyperef); + RESOLVE_TYPE (fb->marshal_info->marshaltyperef); } } } @@ -10307,7 +10424,7 @@ mono_reflection_create_runtime_class (MonoReflectionTypeBuilder *tb) for (i = 0; i < mono_array_length (tb->methods); ++i) { MonoReflectionMethodBuilder *mb = mono_array_get (tb->methods, gpointer, i); if (mb) { - CHECK_MONOTYPE (mb->rtype); + RESOLVE_TYPE (mb->rtype); check_array_for_usertypes (mb->return_modreq); check_array_for_usertypes (mb->return_modopt); check_array_for_usertypes (mb->parameters); @@ -10490,7 +10607,7 @@ mono_reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig) sigbuffer_add_value (&buf, 0x07); sigbuffer_add_value (&buf, na); for (i = 0; i < na; ++i) { - MonoReflectionType *type = mono_type_array_get (sig->arguments, i); + MonoReflectionType *type = mono_array_get (sig->arguments, MonoReflectionType*, i); encode_reflection_type (assembly, type, &buf); } @@ -10517,7 +10634,7 @@ mono_reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig) sigbuffer_add_value (&buf, 0x06); for (i = 0; i < na; ++i) { - MonoReflectionType *type = mono_type_array_get (sig->arguments, i); + MonoReflectionType *type = mono_array_get (sig->arguments, MonoReflectionType*, i); encode_reflection_type (assembly, type, &buf); } @@ -10668,7 +10785,7 @@ mono_reflection_lookup_dynamic_token (MonoImage *image, guint32 token, gboolean mono_loader_unlock (); if (!obj) { if (valid_token) - g_assert_not_reached (); + g_error ("Could not find required dynamic token 0x%08x", token); else return NULL; } @@ -10852,10 +10969,8 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon sig->param_count = nargs; /* TODO: Copy type ? */ sig->ret = helper->return_type->type; - for (i = 0; i < nargs; ++i) { - MonoReflectionType *rt = mono_type_array_get (helper->arguments, i); - sig->params [i] = rt->type; - } + for (i = 0; i < nargs; ++i) + sig->params [i] = mono_type_array_get_and_resolve (helper->arguments, i); result = sig; *handle_class = NULL; @@ -10908,6 +11023,13 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon result = inflate_mono_method (inflated_klass, m->mb->mhandle, (MonoObject*)m->mb); *handle_class = mono_defaults.methodhandle_class; mono_metadata_free_type (type); + } else if (strcmp (mono_object_get_class(obj)->name, "ArrayType") == 0 || + strcmp (mono_object_get_class(obj)->name, "ByRefType") == 0 || + strcmp (mono_object_get_class(obj)->name, "PointerType") == 0) { + MonoReflectionType *ref_type = (MonoReflectionType *)obj; + MonoType *type = mono_reflection_type_get_handle (ref_type); + result = mono_class_from_mono_type (type); + *handle_class = mono_defaults.typehandle_class; } else { g_print (obj->vtable->klass->name); g_assert_not_reached (); @@ -10960,6 +11082,12 @@ mono_image_module_basic_init (MonoReflectionModuleBuilder *moduleb) g_assert_not_reached (); } +void +mono_image_set_wrappers_type (MonoReflectionModuleBuilder *moduleb, MonoReflectionType *type) +{ + g_assert_not_reached (); +} + MonoReflectionModule * mono_image_load_module_dynamic (MonoReflectionAssemblyBuilder *ab, MonoString *fileName) { diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c index 6743d600a06..71b98971f96 100644 --- a/mono/metadata/sgen-gc.c +++ b/mono/metadata/sgen-gc.c @@ -678,6 +678,8 @@ struct _SgenThreadInfo { char **tlab_real_end_addr; RememberedSet *remset; gpointer runtime_data; + gpointer stopped_ip; /* only valid if the thread is stopped */ + MonoDomain *stopped_domain; /* ditto */ #ifndef HAVE_KW_THREAD char *tlab_start; char *tlab_next; @@ -2291,7 +2293,7 @@ alloc_nursery (void) UPDATE_HEAP_BOUNDARIES (nursery_start, nursery_real_end); nursery_next = nursery_start; total_alloc += alloc_size; - DEBUG (4, fprintf (gc_debug_file, "Expanding heap size: %zd, total: %zd\n", nursery_size, total_alloc)); + DEBUG (4, fprintf (gc_debug_file, "Expanding nursery size (%p-%p): %zd, total: %zd\n", data, data + alloc_size, nursery_size, total_alloc)); section->data = section->next_data = data; section->size = alloc_size; section->end_data = nursery_real_end; @@ -2488,10 +2490,8 @@ finish_gray_stack (char *start_addr, char *end_addr, int generation) gray_start = scan_object (gray_start, start_addr, end_addr); } } while (fin_ready != num_ready_finalizers || bigo_scanned_num); - - DEBUG (2, fprintf (gc_debug_file, "Copied from %s to old space: %d bytes\n", generation_name (generation), (int)(gray_objects - to_space))); - to_space = gray_start; - to_space_section->next_data = to_space; + TV_GETTIME (btv); + DEBUG (2, fprintf (gc_debug_file, "Finalize queue handling scan for %s generation: %d usecs\n", generation_name (generation), TV_ELAPSED (atv, btv))); /* * handle disappearing links @@ -2501,11 +2501,23 @@ finish_gray_stack (char *start_addr, char *end_addr, int generation) * GC a finalized object my lose the monitor because it is cleared before the finalizer is * called. */ - null_link_in_range (start_addr, end_addr, generation); - if (generation == GENERATION_OLD) - null_link_in_range (start_addr, end_addr, GENERATION_NURSERY); - TV_GETTIME (btv); - DEBUG (2, fprintf (gc_debug_file, "Finalize queue handling scan for %s generation: %d usecs\n", generation_name (generation), TV_ELAPSED (atv, btv))); + g_assert (gray_start == gray_objects); + for (;;) { + null_link_in_range (start_addr, end_addr, generation); + if (generation == GENERATION_OLD) + null_link_in_range (start_addr, end_addr, GENERATION_NURSERY); + if (gray_start == gray_objects) + break; + while (gray_start < gray_objects) { + DEBUG (9, fprintf (gc_debug_file, "Precise gray object scan %p (%s)\n", gray_start, safe_name (gray_start))); + gray_start = scan_object (gray_start, start_addr, end_addr); + } + } + + g_assert (gray_start == gray_objects); + DEBUG (2, fprintf (gc_debug_file, "Copied from %s to old space: %d bytes (%p-%p)\n", generation_name (generation), (int)(gray_objects - to_space), to_space, gray_objects)); + to_space = gray_start; + to_space_section->next_data = to_space; } static int last_num_pinned = 0; @@ -2633,9 +2645,10 @@ scan_from_registered_roots (char *addr_start, char *addr_end, int root_type) } /* - * Collect objects in the nursery. + * Collect objects in the nursery. Returns whether to trigger a major + * collection. */ -static void +static gboolean collect_nursery (size_t requested_size) { GCMemSection *section; @@ -2643,6 +2656,7 @@ collect_nursery (size_t requested_size) int i; char *orig_nursery_next; Fragment *frag; + gboolean invoke_major_gc = FALSE; TV_DECLARE (all_atv); TV_DECLARE (all_btv); TV_DECLARE (atv); @@ -2682,6 +2696,7 @@ collect_nursery (size_t requested_size) to_space = gray_objects = gray_first = section->next_data; to_space_end = section->end_data; to_space_section = section; + invoke_major_gc = TRUE; } DEBUG (2, fprintf (gc_debug_file, "To space setup: %p-%p in section %p\n", to_space, to_space_end, to_space_section)); nursery_section->next_data = nursery_next; @@ -2717,6 +2732,7 @@ collect_nursery (size_t requested_size) } /* registered roots, this includes static fields */ scan_from_registered_roots (nursery_start, nursery_next, ROOT_TYPE_NORMAL); + scan_from_registered_roots (nursery_start, nursery_next, ROOT_TYPE_WBARRIER); scan_thread_data (nursery_start, nursery_next, TRUE); /* alloc_pinned objects */ scan_from_pinned_objects (nursery_start, nursery_next); @@ -2743,6 +2759,8 @@ collect_nursery (size_t requested_size) DEBUG (4, fprintf (gc_debug_file, "Finalizer-thread wakeup: ready %d\n", num_ready_finalizers)); mono_gc_finalize_notify (); } + + return invoke_major_gc; } static void @@ -2977,7 +2995,7 @@ alloc_section (size_t size) section->end_data = data + new_size; UPDATE_HEAP_BOUNDARIES (data, section->end_data); total_alloc += new_size; - DEBUG (2, fprintf (gc_debug_file, "Expanding heap size: %zd, total: %zd\n", new_size, total_alloc)); + DEBUG (2, fprintf (gc_debug_file, "Expanding heap size: %zd (%p-%p), total: %zd\n", new_size, data, data + new_size, total_alloc)); section->data = data; section->size = new_size; scan_starts = new_size / SCAN_START_SIZE; @@ -3020,7 +3038,8 @@ minor_collect_or_expand_inner (size_t size) } if (do_minor_collection) { stop_world (); - collect_nursery (size); + if (collect_nursery (size)) + major_collection (); DEBUG (2, fprintf (gc_debug_file, "Heap size: %zd, LOS size: %zd\n", total_alloc, los_memory_usage)); restart_world (); /* this also sets the proper pointers for the next allocation */ @@ -3592,6 +3611,18 @@ mono_gc_alloc_obj (MonoVTable *vtable, size_t size) } } + /* + * We need to lock here instead of after the fast path because + * we might be interrupted in the fast path (after confirming + * that new_next < TLAB_TEMP_END) by the GC, and we'll end up + * allocating an object in a fragment which no longer belongs + * to us. + * + * The managed allocator does not do this, but it's treated + * specially by the world-stopping code. + */ + LOCK_GC; + /* tlab_next and tlab_temp_end are TLS vars so accessing them might be expensive */ p = (void**)TLAB_NEXT; @@ -3608,8 +3639,13 @@ mono_gc_alloc_obj (MonoVTable *vtable, size_t size) */ DEBUG (6, fprintf (gc_debug_file, "Allocated object %p, vtable: %p (%s), size: %zd\n", p, vtable, vtable->klass->name, size)); + g_assert (*p == NULL); *p = vtable; - + + g_assert (TLAB_NEXT == new_next); + + UNLOCK_GC; + return p; } @@ -3624,7 +3660,7 @@ mono_gc_alloc_obj (MonoVTable *vtable, size_t size) * This avoids taking again the GC lock when registering, but this is moot when * doing thread-local allocation, so it may not be a good idea. */ - LOCK_GC; + g_assert (TLAB_NEXT == new_next); if (size > MAX_SMALL_OBJ_SIZE) { /* get ready for possible collection */ update_current_thread_stack (&dummy); @@ -3958,7 +3994,7 @@ null_link_in_range (char *start, char *end, int generation) hash->num_links--; add_or_remove_disappearing_link ((MonoObject*)copy, link, - track, generation); + track, GENERATION_OLD); DEBUG (5, fprintf (gc_debug_file, "Upgraded dislink at %p to major because object %p moved to %p\n", link, object, copy)); @@ -4517,6 +4553,28 @@ signal_desc (int signum) return "unknown"; } +#define MANAGED_ALLOCATION +#define MANAGED_WBARRIER + +#ifdef MANAGED_ALLOCATION +static gboolean +is_ip_in_managed_allocator (MonoDomain *domain, gpointer ip); +#endif + +static void +wait_for_suspend_ack (int count) +{ + int i, result; + + for (i = 0; i < count; ++i) { + while ((result = sem_wait (suspend_ack_semaphore_ptr)) != 0) { + if (errno != EINTR) { + g_error ("sem_wait ()"); + } + } + } +} + /* LOCKING: assumes the GC lock is held */ static int thread_handshake (int signum) @@ -4546,14 +4604,82 @@ thread_handshake (int signum) } } - for (i = 0; i < count; ++i) { - while ((result = sem_wait (suspend_ack_semaphore_ptr)) != 0) { - if (errno != EINTR) { - g_error ("sem_wait ()"); + wait_for_suspend_ack (count); + + return count; +} + +static int +restart_threads_until_none_in_managed_allocator (void) +{ + SgenThreadInfo *info; + int i, result, num_threads_died = 0; + int sleep_duration = -1; + +#ifdef MANAGED_ALLOCATION + for (;;) { + int restart_count = 0, restarted_count = 0; + /* restart all threads that stopped in the + allocator */ + for (i = 0; i < THREAD_HASH_SIZE; ++i) { + for (info = thread_table [i]; info; info = info->next) { + if (info->skip) + continue; + if (is_ip_in_managed_allocator (info->stopped_domain, info->stopped_ip)) { + result = pthread_kill (info->id, restart_signal_num); + if (result == 0) { + ++restart_count; + } else { + info->skip = 1; + } + } else { + /* we set the stopped_ip to + NULL for threads which + we're not restarting so + that we can easily identify + the others */ + info->stopped_ip = NULL; + info->stopped_domain = NULL; + } + } + } + /* if no threads were restarted, we're done */ + if (restart_count == 0) + break; + + /* wait for the threads to signal their restart */ + wait_for_suspend_ack (restart_count); + + if (sleep_duration < 0) { + sched_yield (); + sleep_duration = 0; + } else { + g_usleep (sleep_duration); + sleep_duration += 10; + } + + /* stop them again */ + for (i = 0; i < THREAD_HASH_SIZE; ++i) { + for (info = thread_table [i]; info; info = info->next) { + if (info->skip || info->stopped_ip == NULL) + continue; + result = pthread_kill (info->id, suspend_signal_num); + if (result == 0) { + ++restarted_count; + } else { + info->skip = 1; + } } } + /* some threads might have died */ + num_threads_died += restart_count - restarted_count; + /* wait for the threads to signal their suspension + again */ + wait_for_suspend_ack (restart_count); } - return count; +#endif + + return num_threads_died; } /* LOCKING: assumes the GC lock is held (by the stopping thread) */ @@ -4567,6 +4693,8 @@ suspend_handler (int sig, siginfo_t *siginfo, void *context) id = pthread_self (); info = thread_info_lookup (id); + info->stopped_domain = mono_domain_get (); + info->stopped_ip = mono_gc_get_ip_from_sigctx (context); stop_count = global_stop_count; /* duplicate signal */ if (0 && info->stop_count == stop_count) { @@ -4629,6 +4757,8 @@ stop_world (void) DEBUG (3, fprintf (gc_debug_file, "stopping world n %d from %p %p\n", global_stop_count, thread_info_lookup (ARCH_GET_THREAD ()), (gpointer)ARCH_GET_THREAD ())); TV_GETTIME (stop_world_time); count = thread_handshake (suspend_signal_num); + count -= restart_threads_until_none_in_managed_allocator (); + g_assert (count >= 0); DEBUG (3, fprintf (gc_debug_file, "world stopped %d thread(s)\n", count)); return count; } @@ -4725,15 +4855,51 @@ find_pinning_ref_from_thread (char *obj, size_t size) /* FIXME: check register */ } +static gboolean +ptr_on_stack (void *ptr) +{ + int rs = 0; + int dummy; + SgenThreadInfo *info = thread_info_lookup (ARCH_GET_THREAD ()); + + update_current_thread_stack (&dummy); + + if (ptr >= (gpointer)info->stack_start && ptr < (gpointer)info->stack_end) + return TRUE; + return FALSE; +} + /* return TRUE if ptr points inside the managed heap */ static gboolean ptr_in_heap (void* ptr) { mword p = (mword)ptr; + LOSObject *bigobj; + GCMemSection *section; + if (p < lowest_heap_address || p >= highest_heap_address) return FALSE; - /* FIXME: more checks */ - return TRUE; + + if (ptr_in_nursery (ptr)) + return TRUE; + + if (ptr_on_stack (ptr)) + return FALSE; + + for (section = section_list; section; section = section->next) { + if (ptr >= (gpointer)section->data && ptr < (gpointer)(section->data + section->size)) + return TRUE; + } + + if (obj_is_from_pinned_alloc (ptr)) + return TRUE; + + for (bigobj = los_object_list; bigobj; bigobj = bigobj->next) { + if (ptr >= (gpointer)bigobj->data && ptr < (gpointer)(bigobj->data + bigobj->size)) + return TRUE; + } + + return FALSE; } static mword* @@ -4982,6 +5148,8 @@ gc_register_current_thread (void *addr) info->tlab_next_addr = &TLAB_NEXT; info->tlab_temp_end_addr = &TLAB_TEMP_END; info->tlab_real_end_addr = &TLAB_REAL_END; + info->stopped_ip = NULL; + info->stopped_domain = NULL; #ifdef HAVE_KW_THREAD tlab_next_addr = &tlab_next; @@ -5291,14 +5459,13 @@ mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value) { RememberedSet *rs; TLAB_ACCESS_INIT; - if (ptr_in_nursery (ptr)) { + if (ptr_in_nursery (ptr) || !ptr_in_heap (ptr)) { DEBUG (8, fprintf (gc_debug_file, "Skipping remset at %p\n", ptr)); *(void**)ptr = value; return; } rs = REMEMBERED_SET; DEBUG (8, fprintf (gc_debug_file, "Adding remset at %p (%s)\n", ptr, value ? safe_name (value) : "null")); - /* FIXME: ensure it is on the heap */ if (rs->store_next < rs->end_set) { *(rs->store_next++) = (mword)ptr; *(void**)ptr = value; @@ -5348,7 +5515,7 @@ mono_gc_wbarrier_value_copy (gpointer dest, gpointer src, int count, MonoClass * RememberedSet *rs; TLAB_ACCESS_INIT; rs = REMEMBERED_SET; - if (ptr_in_nursery (dest)) + if (ptr_in_nursery (dest) || !ptr_in_heap (dest)) return; DEBUG (8, fprintf (gc_debug_file, "Adding value remset at %p, count %d for class %s\n", dest, count, klass->name)); @@ -6037,8 +6204,23 @@ enum { ATYPE_NUM }; -#ifdef HAVE_KW_THREAD #define MANAGED_ALLOCATION + +#ifdef HAVE_KW_THREAD +#define EMIT_TLS_ACCESS(mb,dummy,offset) do { \ + mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \ + mono_mb_emit_byte ((mb), CEE_MONO_TLS); \ + mono_mb_emit_i4 ((mb), (offset)); \ + } while (0) +#else +#define EMIT_TLS_ACCESS(mb,member,dummy) do { \ + mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \ + mono_mb_emit_byte ((mb), CEE_MONO_TLS); \ + mono_mb_emit_i4 ((mb), thread_info_key); \ + mono_mb_emit_icon ((mb), G_STRUCT_OFFSET (SgenThreadInfo, member)); \ + mono_mb_emit_byte ((mb), CEE_ADD); \ + mono_mb_emit_byte ((mb), CEE_LDIND_I); \ + } while (0) #endif #ifdef MANAGED_ALLOCATION @@ -6049,20 +6231,24 @@ enum { static MonoMethod* create_allocator (int atype) { - int tlab_next_addr_offset = -1; - int tlab_temp_end_offset = -1; - int p_var, size_var, tlab_next_addr_var, new_next_var; + int p_var, size_var; guint32 slowpath_branch; MonoMethodBuilder *mb; MonoMethod *res; MonoMethodSignature *csig; static gboolean registered = FALSE; + int tlab_next_addr_var, new_next_var; + +#ifdef HAVE_KW_THREAD + int tlab_next_addr_offset = -1; + int tlab_temp_end_offset = -1; MONO_THREAD_VAR_OFFSET (tlab_next_addr, tlab_next_addr_offset); MONO_THREAD_VAR_OFFSET (tlab_temp_end, tlab_temp_end_offset); g_assert (tlab_next_addr_offset != -1); g_assert (tlab_temp_end_offset != -1); +#endif g_assert (atype == ATYPE_NORMAL); @@ -6104,9 +6290,7 @@ create_allocator (int atype) /* tlab_next_addr (local) = tlab_next_addr (TLS var) */ tlab_next_addr_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_TLS); - mono_mb_emit_i4 (mb, tlab_next_addr_offset); + EMIT_TLS_ACCESS (mb, tlab_next_addr, tlab_next_addr_offset); mono_mb_emit_stloc (mb, tlab_next_addr_var); /* p = (void**)tlab_next; */ @@ -6130,9 +6314,7 @@ create_allocator (int atype) /* if (G_LIKELY (new_next < tlab_temp_end)) */ mono_mb_emit_ldloc (mb, new_next_var); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_TLS); - mono_mb_emit_i4 (mb, tlab_temp_end_offset); + EMIT_TLS_ACCESS (mb, tlab_temp_end, tlab_temp_end_offset); slowpath_branch = mono_mb_emit_short_branch (mb, MONO_CEE_BLT_UN_S); /* Slowpath */ @@ -6167,6 +6349,26 @@ create_allocator (int atype) } static MonoMethod* alloc_method_cache [ATYPE_NUM]; + +static gboolean +is_ip_in_managed_allocator (MonoDomain *domain, gpointer ip) +{ + MonoJitInfo *ji; + MonoMethod *method; + int i; + + if (!ip || !domain) + return FALSE; + ji = mono_jit_info_table_find (domain, ip); + if (!ji) + return FALSE; + method = ji->method; + + for (i = 0; i < ATYPE_NUM; ++i) + if (method == alloc_method_cache [i]) + return TRUE; + return FALSE; +} #endif /* @@ -6178,14 +6380,20 @@ MonoMethod* mono_gc_get_managed_allocator (MonoVTable *vtable, gboolean for_box) { #ifdef MANAGED_ALLOCATION + MonoClass *klass = vtable->klass; + +#ifdef HAVE_KW_THREAD int tlab_next_offset = -1; int tlab_temp_end_offset = -1; - MonoClass *klass = vtable->klass; MONO_THREAD_VAR_OFFSET (tlab_next, tlab_next_offset); MONO_THREAD_VAR_OFFSET (tlab_temp_end, tlab_temp_end_offset); if (tlab_next_offset == -1 || tlab_temp_end_offset == -1) return NULL; +#endif + + if (!mono_runtime_has_tls_get ()) + return NULL; if (klass->instance_size > tlab_size) return NULL; if (klass->has_finalize || klass->marshalbyref || (mono_profiler_get_events () & MONO_PROFILE_ALLOCATIONS)) @@ -6215,6 +6423,9 @@ mono_gc_get_managed_allocator_by_type (int atype) #ifdef MANAGED_ALLOCATION MonoMethod *res; + if (!mono_runtime_has_tls_get ()) + return NULL; + mono_loader_lock (); res = alloc_method_cache [atype]; if (!res) @@ -6242,10 +6453,14 @@ mono_gc_get_write_barrier (void) MonoMethodSignature *sig; #ifdef MANAGED_ALLOCATION int label1, label2; - int remset_offset = -1; int remset_var, next_var; +#ifdef HAVE_KW_THREAD + int remset_offset = -1; + MONO_THREAD_VAR_OFFSET (remembered_set, remset_offset); + g_assert (remset_offset != -1); +#endif #endif // FIXME: Maybe create a separate version for ctors (the branch would be @@ -6262,82 +6477,78 @@ mono_gc_get_write_barrier (void) mb = mono_mb_new (mono_defaults.object_class, "wbarrier", MONO_WRAPPER_WRITE_BARRIER); #ifdef MANAGED_ALLOCATION - /* ptr_in_nursery () check */ + if (mono_runtime_has_tls_get ()) { + /* ptr_in_nursery () check */ #ifdef ALIGN_NURSERY - /* - * Masking out the bits might be faster, but we would have to use 64 bit - * immediates, which might be slower. - */ - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_icon (mb, DEFAULT_NURSERY_BITS); - mono_mb_emit_byte (mb, CEE_SHR_UN); - mono_mb_emit_icon (mb, (mword)nursery_start >> DEFAULT_NURSERY_BITS); - label1 = mono_mb_emit_branch (mb, CEE_BNE_UN); + /* + * Masking out the bits might be faster, but we would have to use 64 bit + * immediates, which might be slower. + */ + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_icon (mb, DEFAULT_NURSERY_BITS); + mono_mb_emit_byte (mb, CEE_SHR_UN); + mono_mb_emit_icon (mb, (mword)nursery_start >> DEFAULT_NURSERY_BITS); + label1 = mono_mb_emit_branch (mb, CEE_BNE_UN); #else - // FIXME: - g_assert_not_reached (); -#endif - - /* Don't need write barrier case */ - /* do the assignment */ - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_ldarg (mb, 1); - /* Don't use STIND_REF, as it would cause infinite recursion */ - mono_mb_emit_byte (mb, CEE_STIND_I); - mono_mb_emit_byte (mb, CEE_RET); - - /* Need write barrier case */ - mono_mb_patch_branch (mb, label1); - - if (remset_offset == -1) // FIXME: g_assert_not_reached (); +#endif - // remset_var = remembered_set; - remset_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); - mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); - mono_mb_emit_byte (mb, CEE_MONO_TLS); - mono_mb_emit_i4 (mb, remset_offset); - mono_mb_emit_stloc (mb, remset_var); - - // next_var = rs->store_next - next_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); - mono_mb_emit_ldloc (mb, remset_var); - mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (RememberedSet, store_next)); - mono_mb_emit_byte (mb, CEE_LDIND_I); - mono_mb_emit_stloc (mb, next_var); - - // if (rs->store_next < rs->end_set) { - mono_mb_emit_ldloc (mb, next_var); - mono_mb_emit_ldloc (mb, remset_var); - mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (RememberedSet, end_set)); - mono_mb_emit_byte (mb, CEE_LDIND_I); - label2 = mono_mb_emit_branch (mb, CEE_BGE); - - /* write barrier fast path */ - // *(rs->store_next++) = (mword)ptr; - mono_mb_emit_ldloc (mb, next_var); - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_byte (mb, CEE_STIND_I); - - mono_mb_emit_ldloc (mb, next_var); - mono_mb_emit_icon (mb, sizeof (gpointer)); - mono_mb_emit_byte (mb, CEE_ADD); - mono_mb_emit_stloc (mb, next_var); - - mono_mb_emit_ldloc (mb, remset_var); - mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (RememberedSet, store_next)); - mono_mb_emit_ldloc (mb, next_var); - mono_mb_emit_byte (mb, CEE_STIND_I); - - // *(void**)ptr = value; - mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_ldarg (mb, 1); - mono_mb_emit_byte (mb, CEE_STIND_I); - mono_mb_emit_byte (mb, CEE_RET); - - /* write barrier slow path */ - mono_mb_patch_branch (mb, label2); + /* Don't need write barrier case */ + /* do the assignment */ + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_ldarg (mb, 1); + /* Don't use STIND_REF, as it would cause infinite recursion */ + mono_mb_emit_byte (mb, CEE_STIND_I); + mono_mb_emit_byte (mb, CEE_RET); + + /* Need write barrier case */ + mono_mb_patch_branch (mb, label1); + + // remset_var = remembered_set; + remset_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); + EMIT_TLS_ACCESS (mb, remset, remset_offset); + mono_mb_emit_stloc (mb, remset_var); + + // next_var = rs->store_next + next_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg); + mono_mb_emit_ldloc (mb, remset_var); + mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (RememberedSet, store_next)); + mono_mb_emit_byte (mb, CEE_LDIND_I); + mono_mb_emit_stloc (mb, next_var); + + // if (rs->store_next < rs->end_set) { + mono_mb_emit_ldloc (mb, next_var); + mono_mb_emit_ldloc (mb, remset_var); + mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (RememberedSet, end_set)); + mono_mb_emit_byte (mb, CEE_LDIND_I); + label2 = mono_mb_emit_branch (mb, CEE_BGE); + + /* write barrier fast path */ + // *(rs->store_next++) = (mword)ptr; + mono_mb_emit_ldloc (mb, next_var); + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_byte (mb, CEE_STIND_I); + + mono_mb_emit_ldloc (mb, next_var); + mono_mb_emit_icon (mb, sizeof (gpointer)); + mono_mb_emit_byte (mb, CEE_ADD); + mono_mb_emit_stloc (mb, next_var); + + mono_mb_emit_ldloc (mb, remset_var); + mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (RememberedSet, store_next)); + mono_mb_emit_ldloc (mb, next_var); + mono_mb_emit_byte (mb, CEE_STIND_I); + + // *(void**)ptr = value; + mono_mb_emit_ldarg (mb, 0); + mono_mb_emit_ldarg (mb, 1); + mono_mb_emit_byte (mb, CEE_STIND_I); + mono_mb_emit_byte (mb, CEE_RET); + + /* write barrier slow path */ + mono_mb_patch_branch (mb, label2); + } #endif mono_mb_emit_ldarg (mb, 0); diff --git a/mono/metadata/socket-io.c b/mono/metadata/socket-io.c index 25b1ab673c7..7c541783388 100644 --- a/mono/metadata/socket-io.c +++ b/mono/metadata/socket-io.c @@ -844,45 +844,16 @@ gpointer ves_icall_System_Net_Sockets_Socket_Accept_internal(SOCKET sock, MONO_ARCH_SAVE_REGS; *error = 0; - #ifdef PLATFORM_WIN32 - /* Several applications are getting stuck during shutdown on Windows - * when an accept call is on a background thread. - * - */ - if (blocking) { + { MonoThread* curthread = mono_thread_current (); - - if (curthread) { - for (;;) { - int selectret; - int optlen = sizeof (gint); - TIMEVAL timeout; - fd_set readfds; - FD_ZERO (&readfds); - FD_SET(sock, &readfds); - timeout.tv_sec = 0; - timeout.tv_usec = 1000; - selectret = select (0, &readfds, NULL, NULL, &timeout); - if (selectret > 0) - break; - if (curthread->state & ThreadState_StopRequested) - return NULL; - /* A negative return from select means that an error has occurred. - * Let _wapi_accept handle that.*/ - if (selectret != 0) - break; - /* The socket's state may have changed. If it is no longer listening, stop.*/ - if (!getsockopt (sock, SOL_SOCKET, SO_ACCEPTCONN, (char*)&selectret, &optlen)) { - if (!selectret) - break; - } - } - } + curthread->interrupt_on_stop = (gpointer)TRUE; + newsock = _wapi_accept (sock, NULL, 0); + curthread->interrupt_on_stop = (gpointer)FALSE; } -#endif - +#else newsock = _wapi_accept (sock, NULL, 0); +#endif if(newsock==INVALID_SOCKET) { *error = WSAGetLastError (); return(NULL); @@ -1430,8 +1401,18 @@ gint32 ves_icall_System_Net_Sockets_Socket_Receive_internal(SOCKET sock, MonoArr *error = WSAEOPNOTSUPP; return (0); } - + +#ifdef PLATFORM_WIN32 + { + MonoThread* curthread = mono_thread_current (); + curthread->interrupt_on_stop = (gpointer)TRUE; + ret = _wapi_recv (sock, buf, count, recvflags); + curthread->interrupt_on_stop = (gpointer)FALSE; + } +#else ret = _wapi_recv (sock, buf, count, recvflags); +#endif + if(ret==SOCKET_ERROR) { *error = WSAGetLastError (); return(0); @@ -1995,6 +1976,7 @@ static struct in6_addr ipaddress_to_struct_in6_addr(MonoObject *ipaddr) void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, gint32 level, gint32 name, MonoObject *obj_val, MonoArray *byte_val, gint32 int_val, gint32 *error) { + struct linger linger; int system_level; int system_name; int ret; @@ -2040,18 +2022,9 @@ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, g /* Only one of obj_val, byte_val or int_val has data */ if(obj_val!=NULL) { MonoClassField *field; - struct linger linger; int valsize; switch(name) { - case SocketOptionName_DontLinger: - linger.l_onoff=0; - linger.l_linger=0; - valsize=sizeof(linger); - ret = _wapi_setsockopt (sock, system_level, - system_name, &linger, valsize); - break; - case SocketOptionName_Linger: /* Dig out "bool enabled" and "int seconds" * fields @@ -2139,17 +2112,31 @@ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, g return; } } else if (byte_val!=NULL) { - int valsize=mono_array_length(byte_val); - guchar *buf=mono_array_addr(byte_val, guchar, 0); - - ret = _wapi_setsockopt (sock, system_level, system_name, buf, valsize); - if(ret==SOCKET_ERROR) { - *error = WSAGetLastError (); - return; + int valsize = mono_array_length (byte_val); + guchar *buf = mono_array_addr (byte_val, guchar, 0); + + switch(name) { + case SocketOptionName_DontLinger: + if (valsize == 1) { + linger.l_onoff = (*buf) ? 0 : 1; + linger.l_linger = 0; + ret = _wapi_setsockopt (sock, system_level, system_name, &linger, sizeof (linger)); + } else { + *error = WSAEINVAL; + } + break; + default: + ret = _wapi_setsockopt (sock, system_level, system_name, buf, valsize); + break; } } else { /* ReceiveTimeout/SendTimeout get here */ switch(name) { + case SocketOptionName_DontLinger: + linger.l_onoff = !int_val; + linger.l_linger = 0; + ret = _wapi_setsockopt (sock, system_level, system_name, &linger, sizeof (linger)); + break; case SocketOptionName_DontFragment: #ifdef HAVE_IP_MTU_DISCOVER /* Fiddle with the value slightly if we're diff --git a/mono/metadata/threadpool.c b/mono/metadata/threadpool.c index 3f445bb2f04..4bc6db73407 100644 --- a/mono/metadata/threadpool.c +++ b/mono/metadata/threadpool.c @@ -1116,6 +1116,9 @@ mono_thread_pool_add (MonoObject *target, MonoMethodMessage *msg, MonoDelegate * ares = mono_async_result_new (domain, NULL, ac->state, NULL, (MonoObject*)ac); MONO_OBJECT_SETREF (ares, async_delegate, target); + if (domain->state == MONO_APPDOMAIN_UNLOADED || domain->state == MONO_APPDOMAIN_UNLOADING) + return ares; + EnterCriticalSection (&ares_lock); mono_g_hash_table_insert (ares_htable, ares, ares); LeaveCriticalSection (&ares_lock); @@ -1331,6 +1334,7 @@ dequeue_job (CRITICAL_SECTION *cs, TPQueue *list) return NULL; } ar = mono_array_get (list->array, MonoObject*, list->first_elem); + mono_array_setref (list->array, list->first_elem, NULL); list->first_elem++; count = list->next_elem - list->first_elem; /* reduce the size of the array if it's mostly empty */ diff --git a/mono/metadata/threads-types.h b/mono/metadata/threads-types.h index 1f98902215b..263df6b6b95 100644 --- a/mono/metadata/threads-types.h +++ b/mono/metadata/threads-types.h @@ -187,4 +187,7 @@ void mono_threads_install_notify_pending_exc (MonoThreadNotifyPendingExcFunc fun MonoObject* mono_thread_get_execution_context (void) MONO_INTERNAL; void mono_thread_set_execution_context (MonoObject *ec) MONO_INTERNAL; +void mono_runtime_set_has_tls_get (gboolean val) MONO_INTERNAL; +gboolean mono_runtime_has_tls_get (void) MONO_INTERNAL; + #endif /* _MONO_METADATA_THREADS_TYPES_H_ */ diff --git a/mono/metadata/threads.c b/mono/metadata/threads.c index 672d18855e1..6998d82bda4 100644 --- a/mono/metadata/threads.c +++ b/mono/metadata/threads.c @@ -126,6 +126,10 @@ static MonoGHashTable *threads=NULL; * Protected by mono_threads_lock (). */ static MonoGHashTable *threads_starting_up = NULL; + +/* Maps a MonoThread to its start argument */ +/* Protected by mono_threads_lock () */ +static MonoGHashTable *thread_start_args = NULL; /* The TLS key that holds the MonoObject assigned to each thread */ static guint32 current_object_key = -1; @@ -141,8 +145,8 @@ static __thread MonoThread * tls_current_object MONO_TLS_FAST; } while (FALSE) #define GET_CURRENT_OBJECT() tls_current_object #else -#define SET_CURRENT_OBJECT(x) TlsSetValue (current_object_key, x); -#define GET_CURRENT_OBJECT() (MonoThread*) TlsGetValue (current_object_key); +#define SET_CURRENT_OBJECT(x) TlsSetValue (current_object_key, x) +#define GET_CURRENT_OBJECT() (MonoThread*) TlsGetValue (current_object_key) #endif /* function called at thread start */ @@ -620,7 +624,10 @@ static guint32 WINAPI start_wrapper(void *data) ReleaseSemaphore (thread->start_notify, 1, NULL); } - MONO_GC_UNREGISTER_ROOT (start_info->start_arg); + mono_threads_lock (); + mono_g_hash_table_remove (thread_start_args, thread); + mono_threads_unlock (); + g_free (start_info); thread_adjust_static_data (thread); @@ -729,12 +736,6 @@ MonoThread* mono_thread_create_internal (MonoDomain *domain, gpointer func, gpoi start_info->domain = domain; start_info->start_arg = arg; - /* - * The argument may be an object reference, and there is no ref to keep it alive - * when the new thread is started but not yet registered with the collector. - */ - MONO_GC_REGISTER_ROOT (start_info->start_arg); - mono_threads_lock (); if (shutting_down) { mono_threads_unlock (); @@ -744,7 +745,17 @@ MonoThread* mono_thread_create_internal (MonoDomain *domain, gpointer func, gpoi MONO_GC_REGISTER_ROOT (threads_starting_up); threads_starting_up = mono_g_hash_table_new (NULL, NULL); } - mono_g_hash_table_insert (threads_starting_up, thread, thread); + if (thread_start_args == NULL) { + MONO_GC_REGISTER_ROOT (thread_start_args); + thread_start_args = mono_g_hash_table_new (NULL, NULL); + } + mono_g_hash_table_insert (threads_starting_up, thread, thread); + /* + * The argument may be an object reference, and there is no ref to keep it alive + * when the new thread is started but not yet registered with the collector. So + * we store it in a GC tracked hash table. + */ + mono_g_hash_table_insert (thread_start_args, thread, start_info->start_arg); mono_threads_unlock (); /* Create suspended, so we can do some housekeeping before the thread @@ -755,7 +766,6 @@ MonoThread* mono_thread_create_internal (MonoDomain *domain, gpointer func, gpoi THREAD_DEBUG (g_message ("%s: Started thread ID %"G_GSIZE_FORMAT" (handle %p)", __func__, tid, thread_handle)); if (thread_handle == NULL) { /* The thread couldn't be created, so throw an exception */ - MONO_GC_UNREGISTER_ROOT (start_info->start_arg); mono_threads_lock (); mono_g_hash_table_remove (threads_starting_up, thread); mono_threads_unlock (); @@ -1321,7 +1331,7 @@ ves_icall_System_Threading_Thread_SetSerializedCurrentUICulture (MonoThread *thi MonoThread * mono_thread_current (void) { - MonoThread *res = GET_CURRENT_OBJECT () + MonoThread *res = GET_CURRENT_OBJECT (); THREAD_DEBUG (g_message ("%s: returning %p", __func__, res)); return res; } @@ -3774,6 +3784,13 @@ mono_thread_request_interruption (gboolean running_managed) /* The thread may already be stopping */ if (thread == NULL) return NULL; + +#ifdef PLATFORM_WIN32 + if (thread->interrupt_on_stop && + thread->state & ThreadState_StopRequested && + thread->state & ThreadState_Background) + ExitThread (1); +#endif if (InterlockedCompareExchange (&thread->interruption_requested, 1, 0) == 1) return NULL; @@ -4023,3 +4040,17 @@ mono_thread_set_execution_context (MonoObject *ec) { *get_execution_context_addr () = ec; } + +static gboolean has_tls_get = FALSE; + +void +mono_runtime_set_has_tls_get (gboolean val) +{ + has_tls_get = val; +} + +gboolean +mono_runtime_has_tls_get (void) +{ + return has_tls_get; +} diff --git a/mono/metadata/verify-internals.h b/mono/metadata/verify-internals.h index 9476ca95170..90364f64051 100644 --- a/mono/metadata/verify-internals.h +++ b/mono/metadata/verify-internals.h @@ -30,6 +30,16 @@ gboolean mono_verifier_verify_pe_data (MonoImage *image, GSList **error_list) MO gboolean mono_verifier_verify_cli_data (MonoImage *image, GSList **error_list) MONO_INTERNAL; gboolean mono_verifier_verify_table_data (MonoImage *image, GSList **error_list) MONO_INTERNAL; +gboolean mono_verifier_verify_full_table_data (MonoImage *image, GSList **error_list) MONO_INTERNAL; + +gboolean mono_verifier_verify_field_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; +gboolean mono_verifier_verify_method_header (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; +gboolean mono_verifier_verify_method_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; +gboolean mono_verifier_verify_memberref_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; +gboolean mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; +gboolean mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; +gboolean mono_verifier_verify_methodspec_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL; + G_END_DECLS #endif /* __MONO_METADATA_VERIFY_INTERNAL_H__ */ diff --git a/mono/mini/CMakeLists.txt b/mono/mini/CMakeLists.txt index dd34cc91e20..cdd8c486c49 100644 --- a/mono/mini/CMakeLists.txt +++ b/mono/mini/CMakeLists.txt @@ -356,6 +356,19 @@ add_library(libmono-static STATIC ${libmono_la_SOURCES} ${CMAKE_CURRENT_BINARY_D target_link_libraries(libmono-static monoruntime-static monoutils-static monogc-static wapi-static ${GLIB2_LIBRARIES} ${LIBS}) set_target_properties(libmono-static PROPERTIES OUTPUT_NAME "mono-static") +# Since cmake has no support for convenience libraries, we have to link the +# final libmono.a ourselves, similarly to how libtool does it +add_custom_target(libmono.a + COMMAND rm -rf .libs/tmp libmono.a + COMMAND mkdir -p .libs/tmp/{1,2,3,4,5} + COMMAND cd .libs/tmp/1 && ar x ../../../../metadata/libmonoruntime-static.a + COMMAND cd .libs/tmp/2 && ar x ../../../../utils/libmonoutils-static.a + COMMAND cd .libs/tmp/3 && ar x ../../../../io-layer/libwapi-static.a + COMMAND cd .libs/tmp/3 && ar x ../../../../mini/libmono-static.a + COMMAND cd .libs/tmp/4 && ar x ../../../../../libgc/libmonogc-static.a + COMMAND ar r libmono.a `find .libs/tmp/ -name '*.o'` +) + # FIXME: cmake has no support for convenience libraries, so we would end up # creating a lot of shared libraries linking to each other #add_library(libmono SHARED ${libmono_la_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/${arch_built}) @@ -412,6 +425,15 @@ add_executable(mono main.c ${CMAKE_CURRENT_BINARY_DIR}/buildver.h) add_dependencies(mono libmono-static) target_link_libraries(mono libmono-static ${GLIB2_LIBRARIES}) +install( + TARGETS mono + RUNTIME DESTINATION bin) + +# FIXME: Can't specify a dependency on libmono.a, and we don't want to build +# libmono.a until needed +install( + FILES libmono.a DESTINATION lib) + # Test file targets foreach(test ${test_sources}) diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog index 86c9a65171e..559cd719dfa 100644 --- a/mono/mini/ChangeLog +++ b/mono/mini/ChangeLog @@ -1,3 +1,265 @@ + +Mon Jul 13 17:58:50 CEST 2009 Paolo Molaro + + * mini-ppc.c: fixed bug introduced by Steven's TLS changes. + +2009-07-13 Mark Probst + + * mini.c: Register function for getting the IP from a signal + context with metadata. + +2009-07-09 Mark Probst + + * method-to-ir.c: When doing a call which might be remote from + shared generic code to other shared code with open type arguments, + get the remoting invoke wrapper from the RGCTX and do an indirect + call to it. + +2009-07-03 Zoltan Varga + + * mini-trampolines.c (get_unbox_trampoline): Add an rgctx trampoline + after the unbox trampoline in the full-aot case. + +2009-07-02 jonas echterhoff + + * mini.c: Move initialization of jit_mutex before debugger initialization + + to avoid crashes. + + + * Info.plist: added Info.plist and link flag to enable the mono executable + to access other processes. Requires codesigning of the executable to work. + + * mdb-debug-info32-darwin.s: The same as mdb-debug-info32.s, changed to + + compile on OS X. + + +2009-06-30 Zoltan Varga + + * driver.c (mini_regression): Handle loading errors. Fixes #508869. + +2009-06-29 Zoltan Varga + + * mini-exceptions.c (get_generic_context_from_stack_frame): Fix the case + when the generic instance is an instantiation of a subclass of the + methods class. Fixes #517166. + +2009-06-26 Zoltan Varga + + * mini-amd64.c (mono_arch_emit_prolog): Fix thread attaching in AOTed + code. + + * mini.c (mono_jit_thread_attach): Allow domain to be NULL for calls from + AOTed code. + + * CMakeLists.txt: Add minimal support for installation. + +2009-06-25 Zoltan Varga + + * aot-compiler.c (emit_and_reloc_code): Factor out the code to + determine whenever a method is directly callable to a separate function. + + * mini-.c tramp-.c: Remove needless casts and add new + needed ones as a result of the previous change. + + * mini-.c tramp-.c: Use mgreg_t* as the + type of register arrays. + + * mini-trampolines.c tramp-.c aot-runtime.c: Use mgreg_t* as the + type of register arrays. + +2009-06-24 Jerry Maine + + Contributed under the terms of the MIT/X11 license by + Jerry Maine . + + * mini-amd64.c: Added code to convert simd IR to native amd64 sse. + +2009-06-24 Zoltan Varga + + * aot-compiler.c (emit_plt): Define debug labels for most plt entries. + +2009-06-24 Neale Ferguson + + * mini-s390x.c: Correct LCONV_TO_Ix and ICONV_TO_Ix routines. Fix leave_method + dump of structure return value. Fix some formatting. + * cpu-s390x.md: Fix lengths of instruction sequences. + * mini-s390.c: Minor formatting changes. + +2009-06-24 Zoltan Varga + + * mini-x86.h: Applied patch from Romain Tartiere (romain@blogreen.org). + Use sigaction on freebsd as well. + +2009-06-23 Zoltan Varga + + * mini.h: Don't define MONO_ARCH_HAVE_TLS_GET to 0, as some code + uses #ifdef on it. + + * mini.c (mini_init): Revert a change which breaks cross-compilation. + +2009-06-22 Mark Probst + + * mini-ppc.c, cpu-ppc.md: Enable TLS on Darwin/G4. + +2009-06-22 Mark Probst + + * mini.c, mini.h: Tell the runtime whether we support MONO_TLS. + +2009-06-20 Martin Baulig + + * debug-mini.c + (MonoDebuggerThreadFlags): New enum typedef. + (MonoDebuggerThreadInfo): Added `guint32 thread_flags'. + (mono_debugger_thread_created): Added `gpointer func' argument; + initialize the new `thread_flags' field. + +2009-06-18 Martin Baulig + + * debug-debugger.h (MonoDebuggerRuntimeFlags): New enum typedef. + (MonoDebuggerInfo): Renamed the `dummy' field info `runtime_info'. + + * debug-debugger.c + (mini_debugger_set_attach_ok): New function; sets the attach-ok + flag in `MONO_DEBUGGER__info.runtime_info'. + + * driver.c + (mono_main): Call mini_debugger_set_attach_ok() if generics + sharing is disabled. + +2009-06-22 Zoltan Varga + + * aot-compiler.c (add_wrappers): Fix a warning. + + * mini-ppc.c tramp-ppc.c exceptions-ppc.c aot-compiler.c: Update after + the ppc load/store macro changes. + +2009-06-21 Zoltan Varga + + * tramp-ppc.c (mono_arch_patch_plt_entry): Implement this. + + * aot-compiler.c (mono_compile_assembly): Sanitize the plt symbol too, + not just the got symbol. + + * mini-ppc.c aot-compiler.c unwind.c: Implement generation of unwind info + on ppc. + + * aot-compiler.c unwind.c: Add infrastructure for unwind support on + ppc. + + * aot-compiler.c: Remove some fixmes. + + * driver.c (mono_main): Print a helpful message when cross-compiling. + + * mini.c (mini_init): Disable signal handlers when cross-compiling. + + * method-to-ir.c (initialize_array_data): Do the optimization if the + target byte order is little endian, instead of the host byte order. + + * aot-compiler.c: Emit sizes for most symbols, only emit runtime-invoke + wrappers into the mscorlib image, Emit a unique plt symbol for each + image, emit symbols for plt entries. + + * image-writer.c (img_writer_emit_symbol_size): New function to emit + a .size directive. + +2009-06-20 Zoltan Varga + + * aot-compiler.c (add_wrappers): Avoid calling + mono_marshal_get_type_info () since it can assert for some types. + + * method-to-ir.c (mono_method_to_ir): Disable aot when some forms of + ldtoken are used inside wrappers. + + * helpers.c: Add support for prefixing tools with the arch name. + + * mini.h (OP_LOADR_MEMBASE): New opcodes to load/store pointer sized + quantities when using ilp32. + + * mini-codegen.c: Use OP_LOADR_MEMBASE/OP_STORER_MEMBASE for loading/storing + spill slots. Use sizeof(mgreg_t) for the spill slot size. + + * image-writer.c: Use .long on ilp32. + + * aot-compiler.c: Use 32 bit loads on ilp32. + +2009-06-19 Zoltan Varga + + * tramp-ppc.c (mono_arch_create_trampoline_code): Fix the ppc build. + + * mini-ops.h: Use TARGET_POWERPC define for consistency. + + * patch-info.h: Add 'MSCORLIB_GOT_ADDR' patch type. + + * aot-compiler.c aot-runtime.c: Put the mscorlib got address into the + second got slot of every aot image. + + * aot-compiler.c aot-runtime.c mini-trampolines.c: Add support for + aot on platforms with function pointers. + + * mini-ppc.h mini-ppp.c cpu-ppc.md exceptions-ppc.c tramp-ppc.c: Add + support for aot/full aot on ppc/ppc64. + + * tramp-.c (mono_arch_patch_plt_entry): Add 'got' and 'regs' + arguments which are needed on ppc. + + * tramp-arm.c (mono_arch_nullify_class_init_trampoline): Add 'regs' + argument. + + * mini-trampolines.c aot-runtime.c: Update after the above changes. + + * liveness.c (BITS_PER_CHUNK): Use MONO_BITSET_BITS_PER_CHUNK. + + * regalloc2.c (BITS_PER_CHUNK): Ditto. + + * aot-compiler.c (emit_got_info): Fix reading unused memory. + + * ir-emit.h (alloc_dreg): Add a 'return -1' to quiet some compilers. + +2009-06-17 Geoff Norton + + * aot-compiler.c: Ensure we dont try to close a null dwarf writer. + +2009-06-17 Zoltan Varga + + * dwarfwriter.c (mono_dwarf_writer_create): Add an 'appending' parameter + to control whenever the dwarf writer is in xdebug or aot mode. + (emit_class_dwarf_info): Use a separate abbrev for structures without + children. + + * aot-compiler.c: Pass the appending parameter to + mono_dwarf_writer_create (). + + * branch-opts.c (mono_merge_basic_blocks): Fix the case when bbn + falls through to its next bblock. Fixes #513931. + + * iltests.il: Add a test. + + * dwarfwriter.c (mono_dwarf_writer_emit_base_info): Emit some line number + infor even if emit_line is FALSE, as the apple linker seems to require it. + + * image-writer.c (asm_writer_emit_symbol_diff): Call get_label (). + + * dwarfwriter.c (emit_cie): Emit a separate symbol for the cie start, as + gcc does. + (emit_fde): Ditto. + +2009-06-15 Zoltan Varga + + * exceptions-mips.c (mono_arch_get_throw_exception_by_name): Fix the + mips build. + +2009-06-13 Zoltan Varga + + * mini.h (struct MonoBasicBlock): Add 'has_jump_table' and + 'has_call_handler' fields. + + * method-to-ir.c (mono_method_to_ir): Set them if needed. + + * branch-opts.c (mono_merge_basic_blocks): Avoid iterating through the + first bblock if not needed. Fixes #512790. + 2009-06-11 Zoltan Varga * aot-compiler.c (mono_compile_assembly): Fix a warning. @@ -90,6 +352,28 @@ * dwarfwriter.c: Avoid the usage of subsections if the assembler doesn't support them. +2009-06-08 Martin Baulig + + * debug-mini.c + (MonoDebuggerExceptionAction): Moved into debug-mini.h. + (_mono_debugger_throw_exception): Don't make this static. + (_mono_debugger_unhandled_exception): Likewise. + (mono_debugger_handle_exception): Moved to mini-exceptions.c + + * debug-mini.c + (MonoDebuggerExceptionAction): Moved here from debug-mini.c. + (_mono_debugger_throw_exception): Add function prototype. + (_mono_debugger_unhandled_exception): Likewise. + + * mini-exceptions.c + (mono_handle_exception_internal): Added `MonoJitInfo **out_ji' + arg; return the first exception handler if the exception is caught + and we're running inside the debugger. + (mono_debugger_handle_exception): Moved here from debug-mini.c; + improve exception handle inside runtime-invoke, check whether the + exception is actually caught in the method being invoked and not + by the runtime-invoke-wrapper. + 2009-06-07 Zoltan Varga * image-writer.c (append_subsection): Don't align subsections of the diff --git a/mono/mini/Info.plist b/mono/mini/Info.plist new file mode 100644 index 00000000000..4ae22bb5176 --- /dev/null +++ b/mono/mini/Info.plist @@ -0,0 +1,16 @@ + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.novell.mono + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + mono + CFBundleVersion + 0.3 + SecTaskAccess + allowed + + diff --git a/mono/mini/Makefile.am b/mono/mini/Makefile.am index fe31efd0d49..1a38defb972 100644 --- a/mono/mini/Makefile.am +++ b/mono/mini/Makefile.am @@ -117,7 +117,7 @@ mono_LDADD = \ $(MONO_DTRACE_OBJECT) mono_LDFLAGS = \ - $(static_flags) -export-dynamic $(monobinldflags) + $(static_flags) -export-dynamic $(monobinldflags) $(monobin_platform_ldflags) if DTRACE_G_REQUIRED @@ -304,6 +304,9 @@ test_sources = \ basic-simd.cs if MONO_DEBUGGER_SUPPORTED +if PLATFORM_DARWIN +mono_debugger_arch_sources = mdb-debug-info32-darwin.s +else if AMD64 mono_debugger_arch_sources = mdb-debug-info64.s else @@ -311,6 +314,7 @@ if X86 mono_debugger_arch_sources = mdb-debug-info32.s endif endif +endif mono_debugger_sources = debug-debugger.c debug-debugger.h $(mono_debugger_arch_sources) else mono_debugger_sources = @@ -401,14 +405,17 @@ endif if PLATFORM_WIN32 os_sources = $(windows_sources) +monobin_platform_ldflags= endif if PLATFORM_SIGPOSIX os_sources = $(posix_sources) +monobin_platform_ldflags= endif if PLATFORM_DARWIN os_sources = $(darwin_sources) $(posix_sources) +monobin_platform_ldflags=-sectcreate __TEXT __info_plist $(top_srcdir)/mono/mini/Info.plist endif libmono_la_SOURCES = $(common_sources) $(llvm_sources) $(arch_sources) $(os_sources) diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index 41cacebd6f4..6adf8659960 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -9,8 +9,6 @@ */ /* Remaining AOT-only work: - * - reduce the length of the wrapper names. - * - aot IMT tables, so we don't have two kinds of aot code. * - optimize the trampolines, generate more code in the arch files. * - make things more consistent with how elf works, for example, use ELF * relocations. @@ -156,8 +154,10 @@ typedef struct MonoAotCompile { GPtrArray *unwind_ops; guint32 unwind_info_offset; char *got_symbol; + char *plt_symbol; GHashTable *method_label_hash; const char *temp_prefix; + guint32 label_generator; } MonoAotCompile; #define mono_acfg_lock(acfg) EnterCriticalSection (&((acfg)->mutex)) @@ -312,11 +312,18 @@ emit_global (MonoAotCompile *acfg, const char *name, gboolean func) { if (acfg->aot_opts.no_dlsym) { g_ptr_array_add (acfg->globals, g_strdup (name)); + img_writer_emit_local_symbol (acfg->w, name, NULL, func); } else { img_writer_emit_global (acfg->w, name, func); } } +static void +emit_symbol_size (MonoAotCompile *acfg, const char *name, const char *end_label) +{ + img_writer_emit_symbol_size (acfg->w, name, end_label); +} + static void emit_string_symbol (MonoAotCompile *acfg, const char *name, const char *value) { @@ -415,7 +422,7 @@ encode_sleb128 (gint32 value, guint8 *buf, guint8 **endbuf) /* ARCHITECTURE SPECIFIC CODE */ -#if defined(TARGET_X86) || defined(TARGET_AMD64) || defined(TARGET_ARM) +#if defined(TARGET_X86) || defined(TARGET_AMD64) || defined(TARGET_ARM) || defined(TARGET_POWERPC) #define EMIT_DWARF_INFO 1 #endif @@ -424,6 +431,14 @@ encode_sleb128 (gint32 value, guint8 *buf, guint8 **endbuf) #else #define AOT_FUNC_ALIGNMENT 16 #endif + +#if defined(TARGET_POWERPC64) && !defined(__mono_ilp32__) +#define PPC_LD_OP "ld" +#define PPC_LDX_OP "ldx" +#else +#define PPC_LD_OP "lwz" +#define PPC_LDX_OP "lwzx" +#endif /* * arch_emit_direct_call: @@ -454,11 +469,45 @@ arch_emit_direct_call (MonoAotCompile *acfg, const char *target, int *call_size) fprintf (acfg->fp, "bl %s\n", target); } *call_size = 4; +#elif defined(TARGET_POWERPC) + if (acfg->use_bin_writer) { + g_assert_not_reached (); + } else { + img_writer_emit_unset_mode (acfg->w); + fprintf (acfg->fp, "bl %s\n", target); + *call_size = 4; + } #else g_assert_not_reached (); #endif } +/* + * PPC32 design: + * - we use an approach similar to the x86 abi: reserve a register (r30) to hold + * the GOT pointer. + * - The full-aot trampolines need access to the GOT of mscorlib, so we store + * in in the 2. slot of every GOT, and require every method to place the GOT + * address in r30, even when it doesn't access the GOT otherwise. This way, + * the trampolines can compute the mscorlib GOT address by loading 4(r30). + */ + +/* + * PPC64 design: + * PPC64 uses function descriptors which greatly complicate all code, since + * these are used very inconsistently in the runtime. Some functions like + * mono_compile_method () return ftn descriptors, while others like the + * trampoline creation functions do not. + * We assume that all GOT slots contain function descriptors, and create + * descriptors in aot-runtime.c when needed. + * The ppc64 abi uses r2 to hold the address of the TOC/GOT, which is loaded + * from function descriptors, we could do the same, but it would require + * rewriting all the ppc/aot code to handle function descriptors properly. + * So instead, we use the same approach as on PPC32. + * This is a horrible mess, but fixing it would probably lead to an even bigger + * one. + */ + #ifdef MONO_ARCH_AOT_SUPPORTED /* * arch_emit_got_offset: @@ -470,11 +519,36 @@ arch_emit_direct_call (MonoAotCompile *acfg, const char *target, int *call_size) static void arch_emit_got_offset (MonoAotCompile *acfg, guint8 *code, int *code_size) { +#if defined(TARGET_POWERPC64) + g_assert (!acfg->use_bin_writer); + img_writer_emit_unset_mode (acfg->w); + /* + * The ppc32 code doesn't seem to work on ppc64, the assembler complains about + * unsupported relocations. So we store the got address into the .Lgot_addr + * symbol which is in the text segment, compute its address, and load it. + */ + fprintf (acfg->fp, ".L%d:\n", acfg->label_generator); + fprintf (acfg->fp, "lis 0, (.Lgot_addr + 4 - .L%d)@h\n", acfg->label_generator); + fprintf (acfg->fp, "ori 0, 0, (.Lgot_addr + 4 - .L%d)@l\n", acfg->label_generator); + fprintf (acfg->fp, "add 30, 30, 0\n"); + fprintf (acfg->fp, "%s 30, 0(30)\n", PPC_LD_OP); + acfg->label_generator ++; + *code_size = 16; +#elif defined(TARGET_POWERPC) + g_assert (!acfg->use_bin_writer); + img_writer_emit_unset_mode (acfg->w); + fprintf (acfg->fp, ".L%d:\n", acfg->label_generator); + fprintf (acfg->fp, "lis 0, (%s + 4 - .L%d)@h\n", acfg->got_symbol, acfg->label_generator); + fprintf (acfg->fp, "ori 0, 0, (%s + 4 - .L%d)@l\n", acfg->got_symbol, acfg->label_generator); + acfg->label_generator ++; + *code_size = 8; +#else guint32 offset = mono_arch_get_patch_offset (code); emit_bytes (acfg, code, offset); emit_symbol_diff (acfg, acfg->got_symbol, ".", offset); *code_size = offset + 4; +#endif } /* @@ -493,15 +567,27 @@ arch_emit_got_access (MonoAotCompile *acfg, guint8 *code, int got_slot, int *cod /* Emit the offset */ #ifdef TARGET_AMD64 emit_symbol_diff (acfg, acfg->got_symbol, ".", (unsigned int) ((got_slot * sizeof (gpointer)) - 4)); + *code_size = mono_arch_get_patch_offset (code) + 4; #elif defined(TARGET_X86) emit_int32 (acfg, (unsigned int) ((got_slot * sizeof (gpointer)))); + *code_size = mono_arch_get_patch_offset (code) + 4; #elif defined(TARGET_ARM) emit_symbol_diff (acfg, acfg->got_symbol, ".", (unsigned int) ((got_slot * sizeof (gpointer))) - 12); + *code_size = mono_arch_get_patch_offset (code) + 4; +#elif defined(TARGET_POWERPC) + { + guint8 buf [32]; + guint8 *code; + + code = buf; + ppc_load32 (code, ppc_r0, got_slot * sizeof (gpointer)); + g_assert (code - buf == 8); + emit_bytes (acfg, buf, code - buf); + *code_size = code - buf; + } #else g_assert_not_reached (); #endif - - *code_size = mono_arch_get_patch_offset (code) + 4; } #endif @@ -521,7 +607,7 @@ arch_emit_plt_entry (MonoAotCompile *acfg, int index) } else { /* Need to make sure this is 9 bytes long */ emit_byte (acfg, '\xe9'); - emit_symbol_diff (acfg, "plt", ".", -4); + emit_symbol_diff (acfg, acfg->plt_symbol, ".", -4); emit_int32 (acfg, acfg->plt_got_info_offsets [index]); } #elif defined(TARGET_AMD64) @@ -571,6 +657,23 @@ arch_emit_plt_entry (MonoAotCompile *acfg, int index) * The plt_got_info_offset is computed automatically by * mono_aot_get_plt_info_offset (), so no need to save it here. */ +#elif defined(TARGET_POWERPC) + guint32 offset = (acfg->plt_got_offset_base + index) * sizeof (gpointer); + + /* The GOT address is guaranteed to be in r30 by OP_LOAD_GOTADDR */ + g_assert (!acfg->use_bin_writer); + img_writer_emit_unset_mode (acfg->w); + fprintf (acfg->fp, "lis 11, %d@h\n", offset); + fprintf (acfg->fp, "ori 11, 11, %d@l\n", offset); + fprintf (acfg->fp, "add 11, 11, 30\n"); + fprintf (acfg->fp, "%s 11, 0(11)\n", PPC_LD_OP); +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + fprintf (acfg->fp, "%s 2, %d(11)\n", PPC_LD_OP, (int)sizeof (gpointer)); + fprintf (acfg->fp, "%s 11, 0(11)\n", PPC_LD_OP); +#endif + fprintf (acfg->fp, "mtctr 11\n"); + fprintf (acfg->fp, "bctr\n"); + emit_int32 (acfg, acfg->plt_got_info_offsets [index]); #else g_assert_not_reached (); #endif @@ -633,6 +736,45 @@ arch_emit_specific_trampoline (MonoAotCompile *acfg, int offset, int *tramp_size */ emit_symbol_diff (acfg, acfg->got_symbol, ".", (offset * sizeof (gpointer)) - 4 + 4); //emit_symbol_diff (acfg, acfg->got_symbol, ".", ((offset + 1) * sizeof (gpointer)) - 4 + 8); +#elif defined(TARGET_POWERPC) + guint8 buf [128]; + guint8 *code; + + *tramp_size = 4; + code = buf; + + g_assert (!acfg->use_bin_writer); + + /* + * PPC has no ip relative addressing, so we need to compute the address + * of the mscorlib got. That is slow and complex, so instead, we store it + * in the second got slot of every aot image. The caller already computed + * the address of its got and placed it into r30. + */ + img_writer_emit_unset_mode (acfg->w); + /* Load mscorlib got address */ + fprintf (acfg->fp, "%s 0, %d(30)\n", PPC_LD_OP, (int)sizeof (gpointer)); + /* Load generic trampoline address */ + fprintf (acfg->fp, "lis 11, %d@h\n", (int)(offset * sizeof (gpointer))); + fprintf (acfg->fp, "ori 11, 11, %d@l\n", (int)(offset * sizeof (gpointer))); + fprintf (acfg->fp, "%s 11, 11, 0\n", PPC_LDX_OP); +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + fprintf (acfg->fp, "%s 11, 0(11)\n", PPC_LD_OP); +#endif + fprintf (acfg->fp, "mtctr 11\n"); + /* Load trampoline argument */ + /* On ppc, we pass it normally to the generic trampoline */ + fprintf (acfg->fp, "lis 11, %d@h\n", (int)((offset + 1) * sizeof (gpointer))); + fprintf (acfg->fp, "ori 11, 11, %d@l\n", (int)((offset + 1) * sizeof (gpointer))); + fprintf (acfg->fp, "%s 0, 11, 0\n", PPC_LDX_OP); + /* Branch to generic trampoline */ + fprintf (acfg->fp, "bctr\n"); + +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + *tramp_size = 10 * 4; +#else + *tramp_size = 9 * 4; +#endif #else g_assert_not_reached (); #endif @@ -686,6 +828,16 @@ arch_emit_unbox_trampoline (MonoAotCompile *acfg, MonoMethod *method, MonoGeneri } else { fprintf (acfg->fp, "\n\tb %s\n", call_target); } +#elif defined(TARGET_POWERPC) + int this_pos = 3; + + if (MONO_TYPE_ISSTRUCT (mono_method_signature (method)->ret)) + this_pos = 4; + + g_assert (!acfg->use_bin_writer); + + fprintf (acfg->fp, "\n\taddi %d, %d, %d\n", this_pos, this_pos, (int)sizeof (MonoObject)); + fprintf (acfg->fp, "\n\tb %s\n", call_target); #else g_assert_not_reached (); #endif @@ -738,6 +890,46 @@ arch_emit_static_rgctx_trampoline (MonoAotCompile *acfg, int offset, int *tramp_ emit_bytes (acfg, buf, code - buf); emit_symbol_diff (acfg, acfg->got_symbol, ".", (offset * sizeof (gpointer)) - 4 + 8); emit_symbol_diff (acfg, acfg->got_symbol, ".", ((offset + 1) * sizeof (gpointer)) - 4 + 4); +#elif defined(TARGET_POWERPC) + guint8 buf [128]; + guint8 *code; + + *tramp_size = 4; + code = buf; + + g_assert (!acfg->use_bin_writer); + + /* + * PPC has no ip relative addressing, so we need to compute the address + * of the mscorlib got. That is slow and complex, so instead, we store it + * in the second got slot of every aot image. The caller already computed + * the address of its got and placed it into r30. + */ + img_writer_emit_unset_mode (acfg->w); + /* Load mscorlib got address */ + fprintf (acfg->fp, "%s 0, %d(30)\n", PPC_LD_OP, (int)sizeof (gpointer)); + /* Load rgctx */ + fprintf (acfg->fp, "lis 11, %d@h\n", (int)(offset * sizeof (gpointer))); + fprintf (acfg->fp, "ori 11, 11, %d@l\n", (int)(offset * sizeof (gpointer))); + fprintf (acfg->fp, "%s %d, 11, 0\n", PPC_LDX_OP, MONO_ARCH_RGCTX_REG); + /* Load target address */ + fprintf (acfg->fp, "lis 11, %d@h\n", (int)((offset + 1) * sizeof (gpointer))); + fprintf (acfg->fp, "ori 11, 11, %d@l\n", (int)((offset + 1) * sizeof (gpointer))); + fprintf (acfg->fp, "%s 11, 11, 0\n", PPC_LDX_OP); +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + fprintf (acfg->fp, "%s 2, %d(11)\n", PPC_LD_OP, (int)sizeof (gpointer)); + fprintf (acfg->fp, "%s 11, 0(11)\n", PPC_LD_OP); +#endif + fprintf (acfg->fp, "mtctr 11\n"); + /* Branch to the target address */ + fprintf (acfg->fp, "bctr\n"); + +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + *tramp_size = 11 * 4; +#else + *tramp_size = 9 * 4; +#endif + #else g_assert_not_reached (); #endif @@ -851,6 +1043,53 @@ arch_emit_imt_thunk (MonoAotCompile *acfg, int offset, int *tramp_size) emit_symbol_diff (acfg, acfg->got_symbol, ".", (offset * sizeof (gpointer)) + (code - (labels [0] + 8)) - 4); *tramp_size = code - buf + 4; +#elif defined(TARGET_POWERPC) + guint8 buf [128]; + guint8 *code, *labels [16]; + + code = buf; + + /* Load the mscorlib got address */ + ppc_ldptr (code, ppc_r11, sizeof (gpointer), ppc_r30); + /* Load the parameter from the GOT */ + ppc_load (code, ppc_r0, offset * sizeof (gpointer)); + ppc_ldptr_indexed (code, ppc_r11, ppc_r11, ppc_r0); + + /* Load and check key */ + labels [1] = code; + ppc_ldptr (code, ppc_r0, 0, ppc_r11); + ppc_cmp (code, 0, sizeof (gpointer) == 8 ? 1 : 0, ppc_r0, MONO_ARCH_IMT_REG); + labels [2] = code; + ppc_bc (code, PPC_BR_TRUE, PPC_BR_EQ, 0); + + /* End-of-loop check */ + ppc_cmpi (code, 0, sizeof (gpointer) == 8 ? 1 : 0, ppc_r0, 0); + labels [3] = code; + ppc_bc (code, PPC_BR_TRUE, PPC_BR_EQ, 0); + + /* Loop footer */ + ppc_addi (code, ppc_r11, ppc_r11, 2 * sizeof (gpointer)); + labels [4] = code; + ppc_b (code, 0); + mono_ppc_patch (labels [4], labels [1]); + + /* Match */ + mono_ppc_patch (labels [2], code); + ppc_ldptr (code, ppc_r11, sizeof (gpointer), ppc_r11); + /* r11 now contains the value of the vtable slot */ + /* this is not a function descriptor on ppc64 */ + ppc_ldptr (code, ppc_r11, 0, ppc_r11); + ppc_mtctr (code, ppc_r11); + ppc_bcctr (code, PPC_BR_ALWAYS, 0); + + /* Fail */ + mono_ppc_patch (labels [3], code); + /* FIXME: */ + ppc_break (code); + + *tramp_size = code - buf; + + emit_bytes (acfg, buf, code - buf); #else g_assert_not_reached (); #endif @@ -870,6 +1109,12 @@ arch_get_cie_program (void) mono_add_unwind_op_def_cfa (l, (guint8*)NULL, (guint8*)NULL, AMD64_RSP, 8); mono_add_unwind_op_offset (l, (guint8*)NULL, (guint8*)NULL, AMD64_RIP, -8); + return l; +#elif defined(TARGET_POWERPC) + GSList *l = NULL; + + mono_add_unwind_op_def_cfa (l, (guint8*)NULL, (guint8*)NULL, ppc_r1, 0); + return l; #else return NULL; @@ -1461,7 +1706,7 @@ static void add_wrappers (MonoAotCompile *acfg) { MonoMethod *method, *m; - int i, j, nallocators; + int i, j; MonoMethodSignature *sig, *csig; guint32 token; @@ -1476,62 +1721,6 @@ add_wrappers (MonoAotCompile *acfg) * names. */ - /* FIXME: Collect these automatically */ - - /* Runtime invoke wrappers */ - - /* void runtime-invoke () [.cctor] */ - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 0); - csig->ret = &mono_defaults.void_class->byval_arg; - add_method (acfg, get_runtime_invoke_sig (csig)); - - /* void runtime-invoke () [Finalize] */ - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 0); - csig->hasthis = 1; - csig->ret = &mono_defaults.void_class->byval_arg; - add_method (acfg, get_runtime_invoke_sig (csig)); - - /* void runtime-invoke (string) [exception ctor] */ - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 1); - csig->hasthis = 1; - csig->ret = &mono_defaults.void_class->byval_arg; - csig->params [0] = &mono_defaults.string_class->byval_arg; - add_method (acfg, get_runtime_invoke_sig (csig)); - - /* void runtime-invoke (string, string) [exception ctor] */ - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 2); - csig->hasthis = 1; - csig->ret = &mono_defaults.void_class->byval_arg; - csig->params [0] = &mono_defaults.string_class->byval_arg; - csig->params [1] = &mono_defaults.string_class->byval_arg; - add_method (acfg, get_runtime_invoke_sig (csig)); - - /* string runtime-invoke () [Exception.ToString ()] */ - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 0); - csig->hasthis = 1; - csig->ret = &mono_defaults.string_class->byval_arg; - add_method (acfg, get_runtime_invoke_sig (csig)); - - /* void runtime-invoke (string, Exception) [exception ctor] */ - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 2); - csig->hasthis = 1; - csig->ret = &mono_defaults.void_class->byval_arg; - csig->params [0] = &mono_defaults.string_class->byval_arg; - csig->params [1] = &mono_defaults.exception_class->byval_arg; - add_method (acfg, get_runtime_invoke_sig (csig)); - - /* Assembly runtime-invoke (string, bool) [DoAssemblyResolve] */ - csig = mono_metadata_signature_alloc (mono_defaults.corlib, 2); - csig->hasthis = 1; - csig->ret = &(mono_class_from_name ( - mono_defaults.corlib, "System.Reflection", "Assembly"))->byval_arg; - csig->params [0] = &mono_defaults.string_class->byval_arg; - csig->params [1] = &mono_defaults.boolean_class->byval_arg; - add_method (acfg, get_runtime_invoke_sig (csig)); - - /* runtime-invoke used by finalizers */ - add_method (acfg, mono_marshal_get_runtime_invoke (mono_class_get_method_from_name_flags (mono_defaults.object_class, "Finalize", 0, 0), TRUE)); - for (i = 0; i < acfg->image->tables [MONO_TABLE_METHOD].rows; ++i) { MonoMethod *method; guint32 token = MONO_TOKEN_METHOD_DEF | (i + 1); @@ -1563,13 +1752,74 @@ add_wrappers (MonoAotCompile *acfg) } if (strcmp (acfg->image->assembly->aname.name, "mscorlib") == 0) { +#ifdef MONO_ARCH_HAVE_TLS_GET MonoMethodDesc *desc; MonoMethod *orig_method; + int nallocators; +#endif + + /* Runtime invoke wrappers */ + + /* void runtime-invoke () [.cctor] */ + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 0); + csig->ret = &mono_defaults.void_class->byval_arg; + add_method (acfg, get_runtime_invoke_sig (csig)); + + /* void runtime-invoke () [Finalize] */ + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 0); + csig->hasthis = 1; + csig->ret = &mono_defaults.void_class->byval_arg; + add_method (acfg, get_runtime_invoke_sig (csig)); + + /* void runtime-invoke (string) [exception ctor] */ + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 1); + csig->hasthis = 1; + csig->ret = &mono_defaults.void_class->byval_arg; + csig->params [0] = &mono_defaults.string_class->byval_arg; + add_method (acfg, get_runtime_invoke_sig (csig)); + + /* void runtime-invoke (string, string) [exception ctor] */ + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 2); + csig->hasthis = 1; + csig->ret = &mono_defaults.void_class->byval_arg; + csig->params [0] = &mono_defaults.string_class->byval_arg; + csig->params [1] = &mono_defaults.string_class->byval_arg; + add_method (acfg, get_runtime_invoke_sig (csig)); + + /* string runtime-invoke () [Exception.ToString ()] */ + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 0); + csig->hasthis = 1; + csig->ret = &mono_defaults.string_class->byval_arg; + add_method (acfg, get_runtime_invoke_sig (csig)); + + /* void runtime-invoke (string, Exception) [exception ctor] */ + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 2); + csig->hasthis = 1; + csig->ret = &mono_defaults.void_class->byval_arg; + csig->params [0] = &mono_defaults.string_class->byval_arg; + csig->params [1] = &mono_defaults.exception_class->byval_arg; + add_method (acfg, get_runtime_invoke_sig (csig)); + + /* Assembly runtime-invoke (string, bool) [DoAssemblyResolve] */ + csig = mono_metadata_signature_alloc (mono_defaults.corlib, 2); + csig->hasthis = 1; + csig->ret = &(mono_class_from_name ( + mono_defaults.corlib, "System.Reflection", "Assembly"))->byval_arg; + csig->params [0] = &mono_defaults.string_class->byval_arg; + csig->params [1] = &mono_defaults.boolean_class->byval_arg; + add_method (acfg, get_runtime_invoke_sig (csig)); + + /* runtime-invoke used by finalizers */ + add_method (acfg, mono_marshal_get_runtime_invoke (mono_class_get_method_from_name_flags (mono_defaults.object_class, "Finalize", 0, 0), TRUE)); /* JIT icall wrappers */ /* FIXME: locking */ g_hash_table_foreach (mono_get_jit_icall_info (), add_jit_icall_wrapper, acfg); + /* stelemref */ + add_method (acfg, mono_marshal_get_stelemref ()); + +#ifdef MONO_ARCH_HAVE_TLS_GET /* Managed Allocators */ nallocators = mono_gc_get_managed_allocator_types (); for (i = 0; i < nallocators; ++i) { @@ -1578,9 +1828,6 @@ add_wrappers (MonoAotCompile *acfg) add_method (acfg, m); } - /* stelemref */ - add_method (acfg, mono_marshal_get_stelemref ()); - /* Monitor Enter/Exit */ desc = mono_method_desc_new ("Monitor:Enter", FALSE); orig_method = mono_method_desc_search_in_class (desc, mono_defaults.monitor_class); @@ -1597,6 +1844,7 @@ add_wrappers (MonoAotCompile *acfg) method = mono_monitor_get_fast_path (orig_method); if (method) add_method (acfg, method); +#endif } /* @@ -1674,15 +1922,13 @@ add_wrappers (MonoAotCompile *acfg) klass = mono_class_get (acfg->image, token); if (klass->valuetype && !klass->generic_container && ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) != TYPE_ATTRIBUTE_AUTO_LAYOUT)) { - MonoMarshalType *info; gboolean can_marshal = TRUE; - int j; - - info = mono_marshal_load_type_info (klass); + gpointer iter = NULL; + MonoClassField *field; /* Only allow a few field types to avoid asserts in the marshalling code */ - for (j = 0; j < info->num_fields; j++) { - switch (info->fields [j].field->type->type) { + while ((field = mono_class_get_fields (klass, &iter))) { + switch (field->type->type) { case MONO_TYPE_I4: case MONO_TYPE_U4: case MONO_TYPE_I1: @@ -1900,6 +2146,34 @@ add_generic_instances (MonoAotCompile *acfg) } } +/* + * is_direct_callable: + * + * Return whenever the method identified by JI is directly callable without + * going through the PLT. + */ +static gboolean +is_direct_callable (MonoAotCompile *acfg, MonoMethod *method, MonoJumpInfo *patch_info) +{ + if ((patch_info->type == MONO_PATCH_INFO_METHOD) && (patch_info->data.method->klass->image == acfg->image)) { + MonoCompile *callee_cfg = g_hash_table_lookup (acfg->method_to_cfg, patch_info->data.method); + if (callee_cfg) { + gboolean direct_callable = TRUE; + + if (direct_callable && !(!callee_cfg->has_got_slots && (callee_cfg->method->klass->flags & TYPE_ATTRIBUTE_BEFORE_FIELD_INIT))) + direct_callable = FALSE; + if ((callee_cfg->method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED) && (!method || method->wrapper_type != MONO_WRAPPER_SYNCHRONIZED)) + // FIXME: Maybe call the wrapper directly ? + direct_callable = FALSE; + + if (direct_callable) + return TRUE; + } + } + + return FALSE; +} + /* * emit_and_reloc_code: * @@ -1954,6 +2228,7 @@ emit_and_reloc_code (MonoAotCompile *acfg, MonoMethod *method, guint8 *code, gui arch_emit_got_offset (acfg, code + i, &code_size); i += code_size - 1; skip = TRUE; + patch_info->type = MONO_PATCH_INFO_NONE; break; } default: { @@ -1963,23 +2238,14 @@ emit_and_reloc_code (MonoAotCompile *acfg, MonoMethod *method, guint8 *code, gui * the same assembly and requires no initialization. */ direct_call = FALSE; - if (!got_only && (patch_info->type == MONO_PATCH_INFO_METHOD) && (patch_info->data.method->klass->image == method->klass->image)) { - MonoCompile *callee_cfg = g_hash_table_lookup (acfg->method_to_cfg, patch_info->data.method); - if (callee_cfg) { - gboolean direct_callable = TRUE; - - if (direct_callable && !(!callee_cfg->has_got_slots && (callee_cfg->method->klass->flags & TYPE_ATTRIBUTE_BEFORE_FIELD_INIT))) - direct_callable = FALSE; - if ((callee_cfg->method->iflags & METHOD_IMPL_ATTRIBUTE_SYNCHRONIZED) && method->wrapper_type != MONO_WRAPPER_SYNCHRONIZED) - // FIXME: Maybe call the wrapper directly ? - direct_callable = FALSE; - if (direct_callable) { - //printf ("DIRECT: %s %s\n", method ? mono_method_full_name (method, TRUE) : "", mono_method_full_name (callee_cfg->method, TRUE)); - direct_call = TRUE; - sprintf (direct_call_target, "%sm_%x", acfg->temp_prefix, get_method_index (acfg, callee_cfg->orig_method)); - patch_info->type = MONO_PATCH_INFO_NONE; - acfg->stats.direct_calls ++; - } + if ((patch_info->type == MONO_PATCH_INFO_METHOD) && (patch_info->data.method->klass->image == acfg->image)) { + if (!got_only && is_direct_callable (acfg, method, patch_info)) { + MonoCompile *callee_cfg = g_hash_table_lookup (acfg->method_to_cfg, patch_info->data.method); + //printf ("DIRECT: %s %s\n", method ? mono_method_full_name (method, TRUE) : "", mono_method_full_name (callee_cfg->method, TRUE)); + direct_call = TRUE; + sprintf (direct_call_target, "%sm_%x", acfg->temp_prefix, get_method_index (acfg, callee_cfg->orig_method)); + patch_info->type = MONO_PATCH_INFO_NONE; + acfg->stats.direct_calls ++; } acfg->stats.all_calls ++; @@ -2036,12 +2302,67 @@ emit_and_reloc_code (MonoAotCompile *acfg, MonoMethod *method, guint8 *code, gui } } +/* + * sanitize_symbol: + * + * Modify SYMBOL so it only includes characters permissible in symbols. + */ +static void +sanitize_symbol (char *symbol) +{ + int i, len = strlen (symbol); + + for (i = 0; i < len; ++i) + if (!isalnum (symbol [i]) && (symbol [i] != '_')) + symbol [i] = '_'; +} + +static char* +get_debug_sym (MonoMethod *method, const char *prefix, GHashTable *cache) +{ + char *name1, *name2, *cached; + int i, j, len, count; + + name1 = mono_method_full_name (method, TRUE); + len = strlen (name1); + name2 = malloc (strlen (prefix) + len + 16); + memcpy (name2, prefix, strlen (prefix)); + j = strlen (prefix); + for (i = 0; i < len; ++i) { + if (isalnum (name1 [i])) { + name2 [j ++] = name1 [i]; + } else if (name1 [i] == ' ' && name1 [i + 1] == '(' && name1 [i + 2] == ')') { + i += 2; + } else if (name1 [i] == ',' && name1 [i + 1] == ' ') { + name2 [j ++] = '_'; + i++; + } else if (name1 [i] == '(' || name1 [i] == ')' || name1 [i] == '>') { + } else + name2 [j ++] = '_'; + } + name2 [j] = '\0'; + + g_free (name1); + + count = 0; + while (g_hash_table_lookup (cache, name2)) { + sprintf (name2 + j, "_%d", count); + count ++; + } + + cached = g_strdup (name2); + g_hash_table_insert (cache, cached, cached); + + return name2; +} + static void emit_method_code (MonoAotCompile *acfg, MonoCompile *cfg) { MonoMethod *method; int method_index; guint8 *code; + char *debug_sym = NULL; char symbol [128]; int func_alignment = AOT_FUNC_ALIGNMENT; MonoMethodHeader *header; @@ -2079,47 +2400,17 @@ emit_method_code (MonoAotCompile *acfg, MonoCompile *cfg) emit_label (acfg, symbol); if (acfg->aot_opts.write_symbols) { - char *name1, *name2, *cached; - int i, j, len, count; - /* * Write a C style symbol for every method, this has two uses: * - it works on platforms where the dwarf debugging info is not * yet supported. * - it allows the setting of breakpoints of aot-ed methods. */ - name1 = mono_method_full_name (method, TRUE); - len = strlen (name1); - name2 = malloc (len + 1); - j = 0; - for (i = 0; i < len; ++i) { - if (isalnum (name1 [i])) { - name2 [j ++] = name1 [i]; - } else if (name1 [i] == ' ' && name1 [i + 1] == '(' && name1 [i + 2] == ')') { - i += 2; - } else if (name1 [i] == ',' && name1 [i + 1] == ' ') { - name2 [j ++] = '_'; - i++; - } else if (name1 [i] == '(' || name1 [i] == ')' || name1 [i] == '>') { - } else - name2 [j ++] = '_'; - } - name2 [j] = '\0'; - - count = 0; - while (g_hash_table_lookup (acfg->method_label_hash, name2)) { - sprintf (name2 + j, "_%d", count); - count ++; - } - - cached = g_strdup (name2); - g_hash_table_insert (acfg->method_label_hash, cached, cached); + debug_sym = get_debug_sym (method, "", acfg->method_label_hash); sprintf (symbol, "%sme_%x", acfg->temp_prefix, method_index); - emit_local_symbol (acfg, name2, symbol, TRUE); - emit_label (acfg, name2); - g_free (name1); - g_free (name2); + emit_local_symbol (acfg, debug_sym, symbol, TRUE); + emit_label (acfg, debug_sym); } if (cfg->verbose_level > 0) @@ -2133,6 +2424,11 @@ emit_method_code (MonoAotCompile *acfg, MonoCompile *cfg) emit_line (acfg); + if (acfg->aot_opts.write_symbols) { + emit_symbol_size (acfg, debug_sym, "."); + g_free (debug_sym); + } + sprintf (symbol, "%sme_%x", acfg->temp_prefix, method_index); emit_label (acfg, symbol); } @@ -2153,6 +2449,8 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint case MONO_PATCH_INFO_IMAGE: encode_value (get_image_index (acfg, patch_info->data.image), p, &p); break; + case MONO_PATCH_INFO_MSCORLIB_GOT_ADDR: + break; case MONO_PATCH_INFO_METHOD_REL: encode_value ((gint)patch_info->data.offset, p, &p); break; @@ -2606,6 +2904,9 @@ emit_plt (MonoAotCompile *acfg) { char symbol [128]; int i; + GHashTable *cache; + + cache = g_hash_table_new (g_str_hash, g_str_equal); emit_line (acfg); sprintf (symbol, "plt"); @@ -2619,28 +2920,83 @@ emit_plt (MonoAotCompile *acfg) emit_alignment (acfg, 16); #endif emit_label (acfg, symbol); + emit_label (acfg, acfg->plt_symbol); for (i = 0; i < acfg->plt_offset; ++i) { char label [128]; + char *debug_sym = NULL; sprintf (label, "%sp_%d", acfg->temp_prefix, i); emit_label (acfg, label); + if (acfg->aot_opts.write_symbols) { + MonoJumpInfo *ji = g_hash_table_lookup (acfg->plt_offset_to_patch, GUINT_TO_POINTER (i)); + char *debug_sym = NULL; + + if (ji) { + switch (ji->type) { + case MONO_PATCH_INFO_METHOD: + debug_sym = get_debug_sym (ji->data.method, "plt_", cache); + break; + case MONO_PATCH_INFO_INTERNAL_METHOD: + debug_sym = g_strdup_printf ("plt__jit_icall_%s", ji->data.name); + break; + case MONO_PATCH_INFO_CLASS_INIT: + debug_sym = g_strdup_printf ("plt__class_init_%s", mono_type_get_name (&ji->data.klass->byval_arg)); + sanitize_symbol (debug_sym); + break; + case MONO_PATCH_INFO_RGCTX_FETCH: + debug_sym = g_strdup_printf ("plt__rgctx_fetch_%d", acfg->label_generator ++); + break; + case MONO_PATCH_INFO_ICALL_ADDR: { + char *s = get_debug_sym (ji->data.method, "", cache); + + debug_sym = g_strdup_printf ("plt__icall_native_%s", s); + g_free (s); + break; + } + case MONO_PATCH_INFO_JIT_ICALL_ADDR: + debug_sym = g_strdup_printf ("plt__jit_icall_native_%s", ji->data.name); + break; + case MONO_PATCH_INFO_GENERIC_CLASS_INIT: + debug_sym = g_strdup_printf ("plt__generic_class_init"); + break; + default: + break; + } + + if (debug_sym) { + emit_local_symbol (acfg, debug_sym, NULL, TRUE); + emit_label (acfg, debug_sym); + } + } + } + /* * The first plt entry is used to transfer code to the AOT loader. */ arch_emit_plt_entry (acfg, i); + + if (debug_sym) { + emit_symbol_size (acfg, debug_sym, "."); + g_free (debug_sym); + } } + emit_symbol_size (acfg, acfg->plt_symbol, "."); + sprintf (symbol, "plt_end"); emit_global (acfg, symbol, TRUE); emit_label (acfg, symbol); + + g_hash_table_destroy (cache); } static G_GNUC_UNUSED void emit_trampoline (MonoAotCompile *acfg, const char *name, guint8 *code, guint32 code_size, int got_offset, MonoJumpInfo *ji, GSList *unwind_ops) { + char start_symbol [256]; char symbol [256]; guint32 buf_size; MonoJumpInfo *patch_info; @@ -2649,12 +3005,12 @@ emit_trampoline (MonoAotCompile *acfg, const char *name, guint8 *code, /* Emit code */ - sprintf (symbol, "%s", name); + sprintf (start_symbol, "%s", name); emit_section_change (acfg, ".text", 0); - emit_global (acfg, symbol, TRUE); + emit_global (acfg, start_symbol, TRUE); emit_alignment (acfg, 16); - emit_label (acfg, symbol); + emit_label (acfg, start_symbol); sprintf (symbol, "%snamed_%s", acfg->temp_prefix, name); emit_label (acfg, symbol); @@ -2665,12 +3021,15 @@ emit_trampoline (MonoAotCompile *acfg, const char *name, guint8 *code, */ emit_and_reloc_code (acfg, NULL, code, code_size, ji, TRUE); + emit_symbol_size (acfg, start_symbol, "."); + /* Emit info */ /* Sort relocations */ patches = g_ptr_array_new (); for (patch_info = ji; patch_info; patch_info = patch_info->next) - g_ptr_array_add (patches, patch_info); + if (patch_info->type != MONO_PATCH_INFO_NONE) + g_ptr_array_add (patches, patch_info); g_ptr_array_sort (patches, compare_patches); buf_size = patches->len * 128 + 128; @@ -2770,7 +3129,6 @@ emit_trampolines (MonoAotCompile *acfg) emit_trampoline (acfg, "throw_pending_exception", code, code_size, acfg->got_offset, ji, NULL); #endif -#if defined(TARGET_AMD64) || defined(TARGET_ARM) for (i = 0; i < 128; ++i) { int offset; @@ -2784,9 +3142,7 @@ emit_trampolines (MonoAotCompile *acfg) sprintf (symbol, "rgctx_fetch_trampoline_%u", offset); emit_trampoline (acfg, symbol, code, code_size, acfg->got_offset, ji, NULL); } -#endif -#if defined(TARGET_AMD64) || defined(TARGET_ARM) { GSList *l; @@ -2799,7 +3155,6 @@ emit_trampolines (MonoAotCompile *acfg) l = l->next; } } -#endif #endif /* #ifdef MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES */ @@ -3391,6 +3746,14 @@ emit_code (MonoAotCompile *acfg) char symbol [256]; GList *l; +#if defined(TARGET_POWERPC64) + sprintf (symbol, ".Lgot_addr"); + emit_section_change (acfg, ".text", 0); + emit_alignment (acfg, 8); + emit_label (acfg, symbol); + emit_pointer (acfg, acfg->got_symbol); +#endif + sprintf (symbol, "methods"); emit_section_change (acfg, ".text", 0); emit_global (acfg, symbol, TRUE); @@ -4153,6 +4516,9 @@ emit_got_info (MonoAotCompile *acfg) p = buf = mono_mempool_alloc (acfg->mempool, buf_size); got_info_offsets = mono_mempool_alloc (acfg->mempool, acfg->got_patches->len * sizeof (guint32)); acfg->plt_got_info_offsets = mono_mempool_alloc (acfg->mempool, acfg->plt_offset * sizeof (guint32)); + /* Unused */ + if (acfg->plt_offset) + acfg->plt_got_info_offsets [0] = 0; for (i = 0; i < acfg->got_patches->len; ++i) { MonoJumpInfo *ji = g_ptr_array_index (acfg->got_patches, i); @@ -4474,10 +4840,17 @@ compile_asm (MonoAotCompile *acfg) #if defined(TARGET_AMD64) #define AS_OPTIONS "--64" +#elif defined(TARGET_POWERPC64) +#define AS_OPTIONS "-a64 -mppc64" +#define LD_OPTIONS "-m elf64ppc" #elif defined(sparc) && SIZEOF_VOID_P == 8 #define AS_OPTIONS "-xarch=v9" #else #define AS_OPTIONS "" +#endif + +#ifndef LD_OPTIONS +#define LD_OPTIONS "" #endif if (acfg->aot_opts.asm_only) { @@ -4526,7 +4899,7 @@ compile_asm (MonoAotCompile *acfg) #elif defined(PLATFORM_WIN32) command = g_strdup_printf ("gcc -shared --dll -mno-cygwin -o %s %s.o", tmp_outfile_name, acfg->tmpfname); #else - command = g_strdup_printf ("ld -shared -o %s %s.o", tmp_outfile_name, acfg->tmpfname); + command = g_strdup_printf ("ld %s -shared -o %s %s.o", LD_OPTIONS, tmp_outfile_name, acfg->tmpfname); #endif printf ("Executing the native linker: %s\n", command); if (system (command) != 0) { @@ -4615,6 +4988,8 @@ acfg_free (MonoAotCompile *acfg) g_free (acfg->cfgs [i]); g_free (acfg->cfgs); g_free (acfg->static_linking_symbol); + g_free (acfg->got_symbol); + g_free (acfg->plt_symbol); g_ptr_array_free (acfg->methods, TRUE); g_ptr_array_free (acfg->got_patches, TRUE); g_ptr_array_free (acfg->image_table, TRUE); @@ -4674,13 +5049,17 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) acfg->num_trampolines [MONO_AOT_TRAMP_IMT_THUNK] = acfg->aot_opts.full_aot ? 128 : 0; acfg->got_symbol = g_strdup_printf ("mono_aot_%s_got", acfg->image->assembly->aname.name); + acfg->plt_symbol = g_strdup_printf ("mono_aot_%s_plt", acfg->image->assembly->aname.name); /* Get rid of characters which cannot occur in symbols */ - p = acfg->got_symbol; for (p = acfg->got_symbol; *p; ++p) { if (!(isalnum (*p) || *p == '_')) *p = '_'; } + for (p = acfg->plt_symbol; *p; ++p) { + if (!(isalnum (*p) || *p == '_')) + *p = '_'; + } acfg->method_index = 1; @@ -4701,6 +5080,11 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) ji->data.image = acfg->image; get_got_offset (acfg, ji); + + /* Slot 1 is reserved for the mscorlib got addr */ + ji = mono_mempool_alloc0 (acfg->mempool, sizeof (MonoAotCompile)); + ji->type = MONO_PATCH_INFO_MSCORLIB_GOT_ADDR; + get_got_offset (acfg, ji); } TV_GETTIME (atv); @@ -4755,7 +5139,7 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) acfg->temp_prefix = img_writer_get_temp_label_prefix (acfg->w); if (!acfg->aot_opts.nodebug) - acfg->dwarf = mono_dwarf_writer_create (acfg->w, NULL); + acfg->dwarf = mono_dwarf_writer_create (acfg->w, NULL, FALSE); img_writer_emit_start (acfg->w); @@ -4792,8 +5176,10 @@ mono_compile_assembly (MonoAssembly *ass, guint32 opts, const char *aot_options) emit_globals (acfg); - if (acfg->dwarf) + if (acfg->dwarf) { emit_dwarf_info (acfg); + mono_dwarf_writer_close (acfg->dwarf); + } emit_mem_end (acfg); @@ -4896,7 +5282,7 @@ mono_xdebug_init (void) /* This file will contain the IL code for methods which don't have debug info */ il_file = fopen ("xdb.il", "w"); - xdebug_writer = mono_dwarf_writer_create (w, il_file); + xdebug_writer = mono_dwarf_writer_create (w, il_file, TRUE); /* Emit something so the file has a text segment */ img_writer_emit_section_change (w, ".text", 0); diff --git a/mono/mini/aot-runtime.c b/mono/mini/aot-runtime.c index e30cab1b54b..77342319bb9 100644 --- a/mono/mini/aot-runtime.c +++ b/mono/mini/aot-runtime.c @@ -59,7 +59,7 @@ #ifdef PLATFORM_WIN32 #define SHARED_EXT ".dll" -#elif (defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__)) || defined(__MACH__) +#elif ((defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__)) || defined(__MACH__)) && !defined(__linux__) #define SHARED_EXT ".dylib" #else #define SHARED_EXT ".so" @@ -1069,6 +1069,17 @@ load_aot_module (MonoAssembly *assembly, gpointer user_data) assembly->image->aot_module = amodule; + if (mono_aot_only) { + if (mono_defaults.corlib) { + /* The second got slot contains the mscorlib got addr */ + MonoAotModule *mscorlib_amodule = mono_defaults.corlib->aot_module; + + amodule->got [1] = mscorlib_amodule->got; + } else { + amodule->got [1] = amodule->got; + } + } + /* * Since we store methoddef and classdef tokens when referring to methods/classes in * referenced assemblies, we depend on the exact versions of the referenced assemblies. @@ -1654,7 +1665,7 @@ decode_patch (MonoAotModule *aot_module, MonoMemPool *mp, MonoJumpInfo *ji, guin goto cleanup; if (!method && !mono_aot_only && !no_aot_trampoline && (ji->type == MONO_PATCH_INFO_METHOD) && (mono_metadata_token_table (token) == MONO_TABLE_METHOD)) { - ji->data.target = mono_create_jit_trampoline_from_token (image, token); + ji->data.target = mono_create_ftnptr (mono_domain_get (), mono_create_jit_trampoline_from_token (image, token)); ji->type = MONO_PATCH_INFO_ABS; } else { @@ -1976,6 +1987,8 @@ load_method (MonoDomain *domain, MonoAotModule *aot_module, MonoImage *image, Mo if (!aot_module->got [got_slots [pindex]]) { aot_module->got [got_slots [pindex]] = mono_resolve_patch_target (method, domain, code, ji, TRUE); + if (ji->type == MONO_PATCH_INFO_METHOD_JUMP) + aot_module->got [got_slots [pindex]] = mono_create_ftnptr (domain, aot_module->got [got_slots [pindex]]); if (ji->type == MONO_PATCH_INFO_METHOD_JUMP) register_jump_target_got_slot (domain, ji->data.method, &(aot_module->got [got_slots [pindex]])); } @@ -2185,6 +2198,13 @@ find_extra_method (MonoMethod *method, MonoAotModule **out_amodule) return index; } +/* + * mono_aot_get_method: + * + * Return a pointer to the AOTed native code for METHOD if it can be found, + * NULL otherwise. + * On platforms with function pointers, this doesn't return a function pointer. + */ gpointer mono_aot_get_method (MonoDomain *domain, MonoMethod *method) { @@ -2388,7 +2408,7 @@ mono_aot_plt_resolve (gpointer aot_module, guint32 plt_info_offset, guint8 *code /* Patch the PLT entry with target which might be the actual method not a trampoline */ plt_entry = mono_aot_get_plt_entry (code); g_assert (plt_entry); - mono_arch_patch_plt_entry (plt_entry, target); + mono_arch_patch_plt_entry (plt_entry, module->got, NULL, target); return target; #else @@ -2407,11 +2427,14 @@ mono_aot_plt_resolve (gpointer aot_module, guint32 plt_info_offset, guint8 *code static void init_plt (MonoAotModule *amodule) { +#ifndef MONO_CROSS_COMPILE + #ifdef MONO_ARCH_AOT_SUPPORTED #ifdef __i386__ guint8 *buf = amodule->plt; -#elif defined(__x86_64__) || defined(__arm__) +#elif defined(__x86_64__) || defined(__arm__) || defined(__mono_ppc__) int i; + gpointer plt_0; #endif gpointer tramp; @@ -2424,22 +2447,26 @@ init_plt (MonoAotModule *amodule) /* Initialize the first PLT entry */ make_writable (amodule->plt, amodule->plt_end - amodule->plt); x86_jump_code (buf, tramp); -#elif defined(__x86_64__) || defined(__arm__) +#elif defined(__x86_64__) || defined(__arm__) || defined(__mono_ppc__) /* * Initialize the PLT entries in the GOT to point to the default targets. */ + tramp = mono_create_ftnptr (mono_domain_get (), tramp); + plt_0 = mono_create_ftnptr (mono_domain_get (), amodule->plt); /* The first entry points to the AOT trampoline */ ((gpointer*)amodule->got)[amodule->info.plt_got_offset_base] = tramp; for (i = 1; i < amodule->info.plt_size; ++i) /* All the default entries point to the first entry */ - ((gpointer*)amodule->got)[amodule->info.plt_got_offset_base + i] = amodule->plt; + ((gpointer*)amodule->got)[amodule->info.plt_got_offset_base + i] = plt_0; #else g_assert_not_reached (); #endif amodule->plt_inited = TRUE; #endif + +#endif /* MONO_CROSS_COMPILE */ } /* @@ -2451,7 +2478,7 @@ guint8* mono_aot_get_plt_entry (guint8 *code) { MonoAotModule *aot_module = find_aot_module (code); -#if defined(__arm__) +#if defined(__arm__) || defined(__mono_ppc__) guint32 ins; #endif @@ -2477,6 +2504,17 @@ mono_aot_get_plt_entry (guint8 *code) if ((target >= (guint8*)(aot_module->plt)) && (target < (guint8*)(aot_module->plt_end))) return target; } +#elif defined(__mono_ppc__) + /* Should be a bl */ + ins = ((guint32*)(gpointer)code) [-1]; + + if ((ins >> 26 == 18) && ((ins & 1) == 1) && ((ins & 2) == 0)) { + gint32 disp = (((gint32)ins) >> 2) & 0xffffff; + guint8 *target = code - 4 + (disp * 4); + + if ((target >= (guint8*)(aot_module->plt)) && (target < (guint8*)(aot_module->plt_end))) + return target; + } #else g_assert_not_reached (); #endif @@ -2490,7 +2528,7 @@ mono_aot_get_plt_entry (guint8 *code) * Return the PLT info offset belonging to the plt entry called by CODE. */ guint32 -mono_aot_get_plt_info_offset (gssize *regs, guint8 *code) +mono_aot_get_plt_info_offset (mgreg_t *regs, guint8 *code) { guint8 *plt_entry = mono_aot_get_plt_entry (code); @@ -2504,12 +2542,34 @@ mono_aot_get_plt_info_offset (gssize *regs, guint8 *code) #elif defined(__arm__) /* The offset is stored as the 4th word of the plt entry */ return ((guint32*)plt_entry) [3]; +#elif defined(__mono_ppc__) +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + return ((guint32*)plt_entry) [8]; +#else + return ((guint32*)plt_entry) [6]; +#endif #else g_assert_not_reached (); return 0; #endif } +static gpointer +mono_create_ftnptr_malloc (guint8 *code) +{ +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + MonoPPCFunctionDescriptor *ftnptr = g_malloc0 (sizeof (MonoPPCFunctionDescriptor)); + + ftnptr->code = code; + ftnptr->toc = NULL; + ftnptr->env = NULL; + + return ftnptr; +#else + return code; +#endif +} + /* * load_function: * @@ -2589,6 +2649,10 @@ load_function (MonoAotModule *amodule, const char *name) target = mono_arm_throw_exception; } else if (!strcmp (ji->data.name, "mono_arm_throw_exception_by_token")) { target = mono_arm_throw_exception_by_token; +#endif +#ifdef __mono_ppc__ + } else if (!strcmp (ji->data.name, "mono_ppc_throw_exception")) { + target = mono_ppc_throw_exception; #endif } else if (strstr (ji->data.name, "trampoline_func_") == ji->data.name) { int tramp_type2 = atoi (ji->data.name + strlen ("trampoline_func_")); @@ -2601,12 +2665,16 @@ load_function (MonoAotModule *amodule, const char *name) res = sscanf (ji->data.name, "specific_trampoline_lazy_fetch_%u", &slot); g_assert (res == 1); target = mono_create_specific_trampoline (GUINT_TO_POINTER (slot), MONO_TRAMPOLINE_RGCTX_LAZY_FETCH, mono_get_root_domain (), NULL); + target = mono_create_ftnptr_malloc (target); } else if (!strcmp (ji->data.name, "specific_trampoline_monitor_enter")) { target = mono_create_specific_trampoline (NULL, MONO_TRAMPOLINE_MONITOR_ENTER, mono_get_root_domain (), NULL); + target = mono_create_ftnptr_malloc (target); } else if (!strcmp (ji->data.name, "specific_trampoline_monitor_exit")) { target = mono_create_specific_trampoline (NULL, MONO_TRAMPOLINE_MONITOR_EXIT, mono_get_root_domain (), NULL); + target = mono_create_ftnptr_malloc (target); } else if (!strcmp (ji->data.name, "specific_trampoline_generic_class_init")) { target = mono_create_specific_trampoline (NULL, MONO_TRAMPOLINE_GENERIC_CLASS_INIT, mono_get_root_domain (), NULL); + target = mono_create_ftnptr_malloc (target); } else if (!strcmp (ji->data.name, "mono_thread_get_and_clear_pending_exception")) { target = mono_thread_get_and_clear_pending_exception; } else { @@ -2635,6 +2703,7 @@ load_function (MonoAotModule *amodule, const char *name) /* * Return the piece of code identified by NAME from the mscorlib AOT file. + * On ppc64, this returns a function descriptor. */ gpointer mono_aot_get_named_code (const char *name) @@ -2648,7 +2717,7 @@ mono_aot_get_named_code (const char *name) amodule = image->aot_module; g_assert (amodule); - return load_function (amodule, name); + return mono_create_ftnptr_malloc (load_function (amodule, name)); } /* Return a given kind of trampoline */ @@ -2747,7 +2816,8 @@ mono_aot_get_static_rgctx_trampoline (gpointer ctx, gpointer addr) amodule->got [got_offset] = ctx; amodule->got [got_offset + 1] = addr; - return code; + /* The caller expects an ftnptr */ + return mono_create_ftnptr (mono_domain_get (), code); } gpointer @@ -2771,7 +2841,9 @@ mono_aot_get_unbox_trampoline (MonoMethod *method) } code = load_function (amodule, symbol); g_free (symbol); - return code; + + /* The caller expects an ftnptr */ + return mono_create_ftnptr (mono_domain_get (), code); } gpointer @@ -2880,7 +2952,7 @@ mono_aot_get_method_from_vt_slot (MonoDomain *domain, MonoVTable *vtable, int sl } guint32 -mono_aot_get_plt_info_offset (gssize *regs, guint8 *code) +mono_aot_get_plt_info_offset (mgreg_t *regs, guint8 *code) { g_assert_not_reached (); diff --git a/mono/mini/branch-opts.c b/mono/mini/branch-opts.c index ff4de4e3d2c..3d27d244404 100644 --- a/mono/mini/branch-opts.c +++ b/mono/mini/branch-opts.c @@ -958,21 +958,27 @@ mono_merge_basic_blocks (MonoCompile *cfg, MonoBasicBlock *bb, MonoBasicBlock *b mono_unlink_bblock (cfg, bbn, bbn->out_bb [0]); /* Handle the branch at the end of the bb */ - for (inst = bb->code; inst != NULL; inst = inst->next) { - if (inst->opcode == OP_CALL_HANDLER) { - g_assert (inst->inst_target_bb == bbn); - NULLIFY_INS (inst); + if (bb->has_call_handler) { + for (inst = bb->code; inst != NULL; inst = inst->next) { + if (inst->opcode == OP_CALL_HANDLER) { + g_assert (inst->inst_target_bb == bbn); + NULLIFY_INS (inst); + } } - if (MONO_IS_JUMP_TABLE (inst)) { - int i; - MonoJumpInfoBBTable *table = MONO_JUMP_TABLE_FROM_INS (inst); - for (i = 0; i < table->table_size; i++ ) { - /* Might be already NULL from a previous merge */ - if (table->table [i]) - g_assert (table->table [i] == bbn); - table->table [i] = NULL; + } + if (bb->has_jump_table) { + for (inst = bb->code; inst != NULL; inst = inst->next) { + if (MONO_IS_JUMP_TABLE (inst)) { + int i; + MonoJumpInfoBBTable *table = MONO_JUMP_TABLE_FROM_INS (inst); + for (i = 0; i < table->table_size; i++ ) { + /* Might be already NULL from a previous merge */ + if (table->table [i]) + g_assert (table->table [i] == bbn); + table->table [i] = NULL; + } + /* Can't nullify this as later instructions depend on it */ } - /* Can't nullify this as later instructions depend on it */ } } if (bb->last_ins && MONO_IS_COND_BRANCH_OP (bb->last_ins)) { @@ -983,6 +989,9 @@ mono_merge_basic_blocks (MonoCompile *cfg, MonoBasicBlock *bb, MonoBasicBlock *b NULLIFY_INS (bb->last_ins); } + bb->has_call_handler |= bbn->has_call_handler; + bb->has_jump_table |= bbn->has_jump_table; + if (bb->last_ins) { if (bbn->code) { bb->last_ins->next = bbn->code; @@ -1004,6 +1013,16 @@ mono_merge_basic_blocks (MonoCompile *cfg, MonoBasicBlock *bb, MonoBasicBlock *b bb->next_bb = bbn->next_bb; } mono_nullify_basic_block (bbn); + + /* + * If bbn fell through to its next bblock, have to add a branch, since bb + * will not fall though to the same bblock (#513931). + */ + if (bb->last_ins && bb->out_count == 1 && bb->out_bb [0] != bb->next_bb && !MONO_IS_BRANCH_OP (bb->last_ins)) { + MONO_INST_NEW (cfg, inst, OP_BR); + inst->inst_target_bb = bb->out_bb [0]; + MONO_ADD_INS (bb, inst); + } } static void diff --git a/mono/mini/cpu-ppc.md b/mono/mini/cpu-ppc.md index 7c7571e3140..81308285a98 100644 --- a/mono/mini/cpu-ppc.md +++ b/mono/mini/cpu-ppc.md @@ -75,22 +75,22 @@ oparglist: src1:i len:12 setlret: src1:i src2:i len:12 checkthis: src1:b len:4 voidcall: len:16 clob:c -voidcall_reg: src1:i len:8 clob:c +voidcall_reg: src1:i len:16 clob:c voidcall_membase: src1:b len:12 clob:c fcall: dest:g len:16 clob:c -fcall_reg: dest:g src1:i len:8 clob:c +fcall_reg: dest:g src1:i len:16 clob:c fcall_membase: dest:g src1:b len:12 clob:c lcall: dest:l len:16 clob:c -lcall_reg: dest:l src1:i len:8 clob:c +lcall_reg: dest:l src1:i len:16 clob:c lcall_membase: dest:l src1:b len:12 clob:c vcall: len:16 clob:c -vcall_reg: src1:i len:8 clob:c +vcall_reg: src1:i len:16 clob:c vcall_membase: src1:b len:12 clob:c -call_reg: dest:a src1:i len:8 clob:c +call_reg: dest:a src1:i len:16 clob:c call_membase: dest:a src1:b len:12 clob:c iconst: dest:i len:8 r4const: dest:f len:12 -r8const: dest:f len:12 +r8const: dest:f len:24 label: len:0 store_membase_reg: dest:b src1:i len:12 storei1_membase_reg: dest:b src1:i len:12 @@ -196,6 +196,8 @@ float_conv_to_u: dest:i src1:f len:36 call_handler: len:12 endfilter: src1:i len:32 aot_const: dest:i len:8 +load_gotaddr: dest:i len:32 +got_entry: dest:i src1:b len:32 sqrt: dest:f src1:f len:4 adc: dest:i src1:i src2:i len:4 addcc: dest:i src1:i src2:i len:4 @@ -207,7 +209,7 @@ ppc_subfic: dest:i src1:i len:4 ppc_subfze: dest:i src1:i len:4 bigmul: len:12 dest:l src1:i src2:i bigmul_un: len:12 dest:l src1:i src2:i -tls_get: len:8 dest:i +tls_get: len:20 dest:i # Linear IR opcodes dummy_use: len:0 diff --git a/mono/mini/cpu-ppc64.md b/mono/mini/cpu-ppc64.md index 3f0210f251a..d590514eb4b 100644 --- a/mono/mini/cpu-ppc64.md +++ b/mono/mini/cpu-ppc64.md @@ -91,7 +91,7 @@ call_membase: dest:a src1:b len:12 clob:c iconst: dest:i len:20 i8const: dest:i len:20 r4const: dest:f len:12 -r8const: dest:f len:12 +r8const: dest:f len:24 label: len:0 store_membase_reg: dest:b src1:i len:12 storei1_membase_reg: dest:b src1:i len:12 @@ -199,6 +199,8 @@ float_conv_to_u: dest:i src1:f len:36 call_handler: len:12 endfilter: src1:i len:20 aot_const: dest:i len:8 +load_gotaddr: dest:i len:32 +got_entry: dest:i src1:b len:32 sqrt: dest:f src1:f len:4 adc: dest:i src1:i src2:i len:4 addcc: dest:i src1:i src2:i len:4 diff --git a/mono/mini/cpu-s390x.md b/mono/mini/cpu-s390x.md index 262f2018ef2..beb01966c2a 100644 --- a/mono/mini/cpu-s390x.md +++ b/mono/mini/cpu-s390x.md @@ -139,7 +139,7 @@ icompare_imm: src1:i len:14 iconst: dest:i len:40 -jmp: len:40 +jmp: len:46 label: len:0 lcall: dest:o len:22 clob:c lcall_membase: dest:o src1:b len:12 clob:c @@ -296,8 +296,8 @@ long_sub_imm: dest:i src1:i len:16 long_sub_ovf: dest:i src1:i src2:i len:16 long_sub_ovf_un: dest:i src1:i src2:i len:28 -long_conv_to_i1: dest:i src1:i len:30 -long_conv_to_i2: dest:i src1:i len:36 +long_conv_to_i1: dest:i src1:i len:12 +long_conv_to_i2: dest:i src1:i len:12 long_conv_to_i4: dest:i src1:i len:4 long_conv_to_i8: dest:i src1:i len:4 long_conv_to_i: dest:i src1:i len:4 @@ -307,7 +307,7 @@ long_conv_to_ovf_u4: dest:i src1:i len:48 long_conv_to_ovf_u8_un: dest:i src1:i len:4 long_conv_to_r4: dest:f src1:i len:16 long_conv_to_r8: dest:f src1:i len:16 -long_conv_to_u1: dest:i src1:i len:14 +long_conv_to_u1: dest:i src1:i len:16 long_conv_to_u2: dest:i src1:i len:24 long_conv_to_u4: dest:i src1:i len:4 long_conv_to_u8: dest:i src1:i len:4 @@ -333,11 +333,11 @@ not_null: src1:i len:0 jump_table: dest:i len:24 -int_conv_to_i1: dest:i src1:i len:26 -int_conv_to_i2: dest:i src1:i len:26 +int_conv_to_i1: dest:i src1:i len:12 +int_conv_to_i2: dest:i src1:i len:12 int_conv_to_i4: dest:i src1:i len:2 int_conv_to_i: dest:i src1:i len:2 -int_conv_to_u1: dest:i src1:i len:8 +int_conv_to_u1: dest:i src1:i len:10 int_conv_to_u2: dest:i src1:i len:16 int_conv_to_u4: dest:i src1:i int_conv_to_r_un: dest:f src1:i len:37 diff --git a/mono/mini/debug-debugger.c b/mono/mini/debug-debugger.c index 23283d12675..65de48d1130 100644 --- a/mono/mini/debug-debugger.c +++ b/mono/mini/debug-debugger.c @@ -120,7 +120,7 @@ MonoDebuggerInfo MONO_DEBUGGER__debugger_info = { MONO_DEBUGGER_MAGIC, MONO_DEBUGGER_MAJOR_VERSION, MONO_DEBUGGER_MINOR_VERSION, - 0, /* dummy */ + 0, /* runtime_flags */ sizeof (MonoDebuggerInfo), sizeof (MonoSymbolTable), MONO_TRAMPOLINE_NUM, @@ -515,6 +515,12 @@ mini_debugger_init (void) (guint64) (gssize) MONO_DEBUGGER__debugger_info_ptr, 0); } +void +mini_debugger_set_attach_ok (void) +{ + MONO_DEBUGGER__debugger_info.runtime_flags |= DEBUGGER_RUNTIME_FLAGS_ATTACH_OK; +} + typedef struct { MonoDomain *domain; diff --git a/mono/mini/debug-debugger.h b/mono/mini/debug-debugger.h index 5b30c73a650..e945a5c6e82 100644 --- a/mono/mini/debug-debugger.h +++ b/mono/mini/debug-debugger.h @@ -23,6 +23,11 @@ typedef struct _MonoDebuggerMetadataInfo MonoDebuggerMetadataInfo; */ extern guint8 *mono_trampoline_code []; +typedef enum { + DEBUGGER_RUNTIME_FLAGS_NONE = 0, + DEBUGGER_RUNTIME_FLAGS_ATTACH_OK = 1 +} MonoDebuggerRuntimeFlags; + /* * There's a global data symbol called `MONO_DEBUGGER__debugger_info' which * contains pointers to global variables and functions which must be accessed @@ -32,7 +37,7 @@ struct _MonoDebuggerInfo { guint64 magic; guint32 major_version; guint32 minor_version; - guint32 dummy; + guint32 runtime_flags; guint32 total_size; guint32 symbol_table_size; guint32 mono_trampoline_num; diff --git a/mono/mini/debug-mini.c b/mono/mini/debug-mini.c index abb82272953..2866f631945 100644 --- a/mono/mini/debug-mini.c +++ b/mono/mini/debug-mini.c @@ -47,6 +47,12 @@ typedef struct { guint32 stopped_on_unhandled : 1; } MonoDebuggerExceptionState; +typedef enum { + MONO_DEBUGGER_THREAD_FLAGS_NONE = 0, + MONO_DEBUGGER_THREAD_FLAGS_INTERNAL = 1, + MONO_DEBUGGER_THREAD_FLAGS_THREADPOOL = 2 +} MonoDebuggerThreadFlags; + struct _MonoDebuggerThreadInfo { guint64 tid; guint64 lmf_addr; @@ -65,11 +71,13 @@ struct _MonoDebuggerThreadInfo { guint32 stack_size; guint32 signal_stack_size; - MonoDebuggerExceptionState exception_state; + guint32 thread_flags; /* * The debugger doesn't access anything beyond this point. */ + MonoDebuggerExceptionState exception_state; + MonoJitTlsData *jit_tls; MonoThread *thread; }; @@ -766,7 +774,7 @@ mono_debugger_breakpoint_callback (MonoMethod *method, guint32 index) } void -mono_debugger_thread_created (gsize tid, MonoThread *thread, MonoJitTlsData *jit_tls) +mono_debugger_thread_created (gsize tid, MonoThread *thread, MonoJitTlsData *jit_tls, gpointer func) { #ifdef MONO_DEBUGGER_SUPPORTED size_t stsize = 0; @@ -791,6 +799,11 @@ mono_debugger_thread_created (gsize tid, MonoThread *thread, MonoJitTlsData *jit info->lmf_addr = (guint64) (gsize) mono_get_lmf_addr (); info->jit_tls = jit_tls; + if (func) + info->thread_flags = MONO_DEBUGGER_THREAD_FLAGS_INTERNAL; + if (thread->threadpool_thread) + info->thread_flags |= MONO_DEBUGGER_THREAD_FLAGS_THREADPOOL; + info->next = mono_debugger_thread_table; mono_debugger_thread_table = info; diff --git a/mono/mini/debug-mini.h b/mono/mini/debug-mini.h index 73f98c760ed..5c245e69082 100644 --- a/mono/mini/debug-mini.h +++ b/mono/mini/debug-mini.h @@ -10,7 +10,7 @@ typedef struct _MonoDebuggerThreadInfo MonoDebuggerThreadInfo; extern MonoDebuggerThreadInfo *mono_debugger_thread_table; void -mono_debugger_thread_created (gsize tid, MonoThread *thread, MonoJitTlsData *jit_tls); +mono_debugger_thread_created (gsize tid, MonoThread *thread, MonoJitTlsData *jit_tls, gpointer func); void mono_debugger_thread_cleanup (MonoJitTlsData *jit_tls); diff --git a/mono/mini/driver.c b/mono/mini/driver.c index b4b35711de1..a3383aa699f 100644 --- a/mono/mini/driver.c +++ b/mono/mini/driver.c @@ -368,7 +368,9 @@ mini_regression (MonoImage *image, int verbose, int *total_run) /* load the metadata */ for (i = 0; i < mono_image_get_table_rows (image, MONO_TABLE_METHOD); ++i) { - method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL); + method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL); + if (!method) + continue; mono_class_init (method->klass); if (!strncmp (method->name, "test_", 5) && mini_stats_fd) { @@ -402,7 +404,9 @@ mini_regression (MonoImage *image, int verbose, int *total_run) if (mini_stats_fd) fprintf (mini_stats_fd, "["); for (i = 0; i < mono_image_get_table_rows (image, MONO_TABLE_METHOD); ++i) { - method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL); + method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i + 1), NULL); + if (!method) + continue; if (strncmp (method->name, "test_", 5) == 0) { expected = atoi (method->name + 5); run++; @@ -1491,6 +1495,13 @@ mono_main (int argc, char* argv[]) if (getenv ("MONO_XDEBUG")) enable_debugging = TRUE; +#ifdef MONO_CROSS_COMPILE + if (!mono_compile_aot) { + fprintf (stderr, "This mono runtime is compiled for cross-compiling. Only the --aot option is supported."); + exit (1); + } +#endif + if ((action == DO_EXEC) && mono_debug_using_mono_debugger ()) action = DO_DEBUGGER; @@ -1532,6 +1543,13 @@ mono_main (int argc, char* argv[]) } else if (enable_debugging) mono_debug_init (MONO_DEBUG_FORMAT_MONO); +#ifdef MONO_DEBUGGER_SUPPORTED + if (enable_debugging) { + if ((opt & MONO_OPT_GSHARED) == 0) + mini_debugger_set_attach_ok (); + } +#endif + mono_set_defaults (mini_verbose, opt); mono_setup_vtable_in_class_init = FALSE; domain = mini_init (argv [i], forced_version); diff --git a/mono/mini/dwarfwriter.c b/mono/mini/dwarfwriter.c index 94f1459c5ed..a7530ac22b7 100644 --- a/mono/mini/dwarfwriter.c +++ b/mono/mini/dwarfwriter.c @@ -42,7 +42,7 @@ struct _MonoDwarfWriter GSList *cie_program; FILE *fp; const char *temp_prefix; - gboolean emit_line; + gboolean emit_line, appending; }; /* @@ -51,14 +51,31 @@ struct _MonoDwarfWriter * Create a DWARF writer object. WRITER is the underlying image writer this * writer will emit to. IL_FILE is the file where IL code will be dumped to for * methods which have no line number info. It can be NULL. + * If APPENDING is TRUE, the output file will be in assembleable state after each + * call to the _emit_ functions. This is used for XDEBUG. If APPENDING is FALSE, + * a separate mono_dwarf_writer_close () call is needed to finish the emission of + * debug information. */ MonoDwarfWriter* -mono_dwarf_writer_create (MonoImageWriter *writer, FILE *il_file) +mono_dwarf_writer_create (MonoImageWriter *writer, FILE *il_file, gboolean appending) { MonoDwarfWriter *w = g_new0 (MonoDwarfWriter, 1); + /* + * The appending flag is needed because we use subsections to order things in + * the debug info, and: + * - apple's assembler doesn't support them + * - the binary writer has problems with subsections+alignment + * So instead of subsections, we use the _close () function in AOT mode, + * which writes out things in order. + */ + w->w = writer; w->il_file = il_file; + w->appending = appending; + + if (appending) + g_assert (img_writer_subsections_supported (w->w)); w->fp = img_writer_get_fp (w->w); w->temp_prefix = img_writer_get_temp_label_prefix (w->w); @@ -281,7 +298,8 @@ emit_cie (MonoDwarfWriter *w) emit_alignment (w, 8); /* Emit a CIE */ - emit_symbol_diff (w, ".Lcie0_end", ".", -4); /* length */ + emit_symbol_diff (w, ".Lcie0_end", ".Lcie0_start", 0); /* length */ + emit_label (w, ".Lcie0_start"); emit_int32 (w, 0xffffffff); /* CIE id */ emit_byte (w, 3); /* version */ emit_string (w, ""); /* augmention */ @@ -312,15 +330,18 @@ static void emit_fde (MonoDwarfWriter *w, int fde_index, char *start_symbol, char *end_symbol, guint8 *code, guint32 code_size, GSList *unwind_ops, gboolean use_cie) { - char symbol [128]; + char symbol1 [128]; + char symbol2 [128]; GSList *l; guint8 *uw_info; guint32 uw_info_len; emit_section_change (w, ".debug_frame", 0); - sprintf (symbol, ".Lfde%d_end", fde_index); - emit_symbol_diff (w, symbol, ".", -4); /* length */ + sprintf (symbol1, ".Lfde%d_start", fde_index); + sprintf (symbol2, ".Lfde%d_end", fde_index); + emit_symbol_diff (w, symbol2, symbol1, 0); /* length */ + emit_label (w, symbol1); emit_int32 (w, 0); /* CIE_pointer */ if (start_symbol) { emit_pointer (w, start_symbol); /* initial_location */ @@ -353,9 +374,8 @@ emit_fde (MonoDwarfWriter *w, int fde_index, char *start_symbol, char *end_symbo emit_bytes (w, uw_info, uw_info_len); g_free (uw_info); - emit_alignment (w, sizeof (gpointer)); - sprintf (symbol, ".Lfde%d_end", fde_index); - emit_label (w, symbol); + emit_alignment (w, sizeof (mgreg_t)); + emit_label (w, symbol2); } /* Abbrevations */ @@ -375,6 +395,7 @@ emit_fde (MonoDwarfWriter *w, int fde_index, char *start_symbol, char *end_symbo #define ABBREV_REFERENCE_TYPE 14 #define ABBREV_PARAM_LOCLIST 15 #define ABBREV_INHERITANCE 16 +#define ABBREV_STRUCT_TYPE_NOCHILDREN 17 static int compile_unit_attr [] = { DW_AT_producer ,DW_FORM_string, @@ -667,6 +688,8 @@ mono_dwarf_writer_emit_base_info (MonoDwarfWriter *w, GSList *base_unwind_progra base_type_attr, G_N_ELEMENTS (base_type_attr)); emit_dwarf_abbrev (w, ABBREV_STRUCT_TYPE, DW_TAG_class_type, TRUE, struct_type_attr, G_N_ELEMENTS (struct_type_attr)); + emit_dwarf_abbrev (w, ABBREV_STRUCT_TYPE_NOCHILDREN, DW_TAG_class_type, FALSE, + struct_type_attr, G_N_ELEMENTS (struct_type_attr)); emit_dwarf_abbrev (w, ABBREV_DATA_MEMBER, DW_TAG_member, FALSE, data_member_attr, G_N_ELEMENTS (data_member_attr)); emit_dwarf_abbrev (w, ABBREV_TYPEDEF, DW_TAG_typedef, FALSE, @@ -691,15 +714,16 @@ mono_dwarf_writer_emit_base_info (MonoDwarfWriter *w, GSList *base_unwind_progra emit_section_change (w, ".debug_info", 0); emit_label (w, ".Ldebug_info_start"); - emit_symbol_diff (w, ".Ldebug_info_end", ".", -4); /* length */ + emit_symbol_diff (w, ".Ldebug_info_end", ".Ldebug_info_begin", 0); /* length */ + emit_label (w, ".Ldebug_info_begin"); emit_int16 (w, 0x2); /* DWARF version 2 */ emit_int32 (w, 0); /* .debug_abbrev offset */ emit_byte (w, sizeof (gpointer)); /* address size */ - if (img_writer_subsections_supported (w->w)) { + if (img_writer_subsections_supported (w->w) && w->appending) { /* Emit this into a separate section so it gets placed at the end */ emit_section_change (w, ".debug_info", 1); - emit_int32 (w, 0); /* close everything */ + emit_byte (w, 0); /* close COMPILE_UNIT */ emit_label (w, ".Ldebug_info_end"); emit_section_change (w, ".debug_info", 0); } @@ -717,10 +741,7 @@ mono_dwarf_writer_emit_base_info (MonoDwarfWriter *w, GSList *base_unwind_progra emit_pointer_value (w, 0); emit_pointer_value (w, 0); /* offset into .debug_line section */ - if (w->emit_line) - emit_symbol_diff (w, ".Ldebug_line_start", ".Ldebug_line_section_start", 0); - else - emit_int32 (w, 0); + emit_symbol_diff (w, ".Ldebug_line_start", ".Ldebug_line_section_start", 0); /* Base types */ for (i = 0; i < G_N_ELEMENTS (basic_types); ++i) { @@ -738,12 +759,30 @@ mono_dwarf_writer_emit_base_info (MonoDwarfWriter *w, GSList *base_unwind_progra emit_label (w, ".Ldebug_loc_start"); /* debug_line section */ - if (w->emit_line) - emit_line_number_info_begin (w); + /* + * We emit some info even if emit_line is FALSE, as the + * apple linker seems to require a .debug_line section. + */ + emit_line_number_info_begin (w); emit_cie (w); } +/* + * mono_dwarf_writer_close: + * + * Finalize the emitted debugging info. + */ +void +mono_dwarf_writer_close (MonoDwarfWriter *w) +{ + if (!w->appending) { + emit_section_change (w, ".debug_info", 0); + emit_byte (w, 0); /* close COMPILE_UNIT */ + emit_label (w, ".Ldebug_info_end"); + } +} + static const char* emit_type (MonoDwarfWriter *w, MonoType *t); /* Returns the local symbol pointing to the emitted debug info */ @@ -756,7 +795,7 @@ emit_class_dwarf_info (MonoDwarfWriter *w, MonoClass *klass, gboolean vtype) MonoClassField *field; const char *fdie; int k; - gboolean emit_namespace = FALSE; + gboolean emit_namespace = FALSE, has_children; GHashTable *cache; // FIXME: Appdomains @@ -873,6 +912,8 @@ emit_class_dwarf_info (MonoDwarfWriter *w, MonoClass *klass, gboolean vtype) g_assert_not_reached (); } } + + has_children = TRUE; } else { guint8 buf [128]; guint8 *p; @@ -892,9 +933,12 @@ emit_class_dwarf_info (MonoDwarfWriter *w, MonoClass *klass, gboolean vtype) emit_type (w, field->type); } + iter = NULL; + has_children = parent_die || mono_class_get_fields (klass, &iter); + emit_label (w, die); - emit_uleb128 (w, ABBREV_STRUCT_TYPE); + emit_uleb128 (w, has_children ? ABBREV_STRUCT_TYPE : ABBREV_STRUCT_TYPE_NOCHILDREN); emit_string (w, full_name); emit_uleb128 (w, klass->instance_size); @@ -935,7 +979,8 @@ emit_class_dwarf_info (MonoDwarfWriter *w, MonoClass *klass, gboolean vtype) } /* Type end */ - emit_uleb128 (w, 0x0); + if (has_children) + emit_uleb128 (w, 0x0); /* Add a typedef, so we can reference the type without a 'struct' in gdb */ emit_uleb128 (w, ABBREV_TYPEDEF); diff --git a/mono/mini/dwarfwriter.h b/mono/mini/dwarfwriter.h index bd8fed5b951..319cc38acc6 100644 --- a/mono/mini/dwarfwriter.h +++ b/mono/mini/dwarfwriter.h @@ -20,12 +20,14 @@ typedef struct _MonoDwarfWriter MonoDwarfWriter; -MonoDwarfWriter* mono_dwarf_writer_create (MonoImageWriter *writer, FILE *il_file) MONO_INTERNAL; +MonoDwarfWriter* mono_dwarf_writer_create (MonoImageWriter *writer, FILE *il_file, gboolean appending) MONO_INTERNAL; void mono_dwarf_writer_destroy (MonoDwarfWriter *w) MONO_INTERNAL; void mono_dwarf_writer_emit_base_info (MonoDwarfWriter *w, GSList *base_unwind_program) MONO_INTERNAL; +void mono_dwarf_writer_close (MonoDwarfWriter *w) MONO_INTERNAL; + void mono_dwarf_writer_emit_trampoline (MonoDwarfWriter *w, const char *tramp_name, char *start_symbol, char *end_symbol, guint8 *code, guint32 code_size, GSList *unwind_info) MONO_INTERNAL; void diff --git a/mono/mini/exceptions-mips.c b/mono/mini/exceptions-mips.c index e1edb17acc8..b104152a16e 100644 --- a/mono/mini/exceptions-mips.c +++ b/mono/mini/exceptions-mips.c @@ -344,6 +344,19 @@ mono_arch_get_throw_exception (void) return start; } +gpointer +mono_arch_get_throw_exception_by_name (void) +{ + guint8 *start, *code; + int size = 64; + + /* Not used on MIPS */ + start = code = mono_global_codeman_reserve (size); + mips_break (code, 0xfd); + mono_arch_flush_icache (start, code - start); + return start; +} + /** * mono_arch_get_throw_corlib_exception: * diff --git a/mono/mini/exceptions-ppc.c b/mono/mini/exceptions-ppc.c index 36bc44c3c43..79189e078b9 100644 --- a/mono/mini/exceptions-ppc.c +++ b/mono/mini/exceptions-ppc.c @@ -163,7 +163,7 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; #define restore_regs_from_context(ctx_reg,ip_reg,tmp_reg) do { \ int reg; \ - ppc_load_reg (code, ip_reg, G_STRUCT_OFFSET (MonoContext, sc_ir), ctx_reg); \ + ppc_ldptr (code, ip_reg, G_STRUCT_OFFSET (MonoContext, sc_ir), ctx_reg); \ ppc_load_multiple_regs (code, ppc_r13, G_STRUCT_OFFSET (MonoContext, regs), ctx_reg); \ for (reg = 0; reg < MONO_SAVED_FREGS; ++reg) { \ ppc_lfd (code, (14 + reg), \ @@ -196,16 +196,18 @@ mono_ppc_create_pre_code_ftnptr (guint8 *code) * The first argument in r3 is the pointer to the context. */ gpointer -mono_arch_get_restore_context (void) +mono_arch_get_restore_context_full (guint32 *code_size, MonoJumpInfo **ji, gboolean aot) { guint8 *start, *code; int size = MONO_PPC_32_64_CASE (128, 172) + PPC_FTNPTR_SIZE; code = start = mono_global_codeman_reserve (size); - code = mono_ppc_create_pre_code_ftnptr (code); + *ji = NULL; + if (!aot) + code = mono_ppc_create_pre_code_ftnptr (code); restore_regs_from_context (ppc_r3, ppc_r4, ppc_r5); /* restore also the stack pointer */ - ppc_load_reg (code, ppc_sp, G_STRUCT_OFFSET (MonoContext, sc_sp), ppc_r3); + ppc_ldptr (code, ppc_sp, G_STRUCT_OFFSET (MonoContext, sc_sp), ppc_r3); //ppc_break (code); /* jump to the saved IP */ ppc_mtctr (code, ppc_r4); @@ -215,6 +217,9 @@ mono_arch_get_restore_context (void) g_assert ((code - start) <= size); mono_arch_flush_icache (start, code - start); + + *code_size = code - start; + return start; } @@ -247,27 +252,30 @@ emit_save_saved_regs (guint8 *code, int pos) * @exc object in this case). */ gpointer -mono_arch_get_call_filter (void) +mono_arch_get_call_filter_full (guint32 *code_size, MonoJumpInfo **ji, gboolean aot) { guint8 *start, *code; int alloc_size, pos, i; int size = MONO_PPC_32_64_CASE (320, 500) + PPC_FTNPTR_SIZE; + *ji = NULL; + /* call_filter (MonoContext *ctx, unsigned long eip, gpointer exc) */ code = start = mono_global_codeman_reserve (size); - code = mono_ppc_create_pre_code_ftnptr (code); + if (!aot) + code = mono_ppc_create_pre_code_ftnptr (code); /* store ret addr */ ppc_mflr (code, ppc_r0); - ppc_store_reg (code, ppc_r0, PPC_RET_ADDR_OFFSET, ppc_sp); + ppc_stptr (code, ppc_r0, PPC_RET_ADDR_OFFSET, ppc_sp); alloc_size = REG_SAVE_STACK_FRAME_SIZE; /* allocate stack frame and set link from sp in ctx */ g_assert ((alloc_size & (MONO_ARCH_FRAME_ALIGNMENT-1)) == 0); - ppc_load_reg (code, ppc_r0, G_STRUCT_OFFSET (MonoContext, sc_sp), ppc_r3); - ppc_load_reg_indexed (code, ppc_r0, ppc_r0, ppc_r0); - ppc_store_reg_update (code, ppc_r0, -alloc_size, ppc_sp); + ppc_ldptr (code, ppc_r0, G_STRUCT_OFFSET (MonoContext, sc_sp), ppc_r3); + ppc_ldptr_indexed (code, ppc_r0, ppc_r0, ppc_r0); + ppc_stptr_update (code, ppc_r0, -alloc_size, ppc_sp); code = emit_save_saved_regs (code, alloc_size); @@ -279,7 +287,7 @@ mono_arch_get_call_filter (void) ppc_bcctrl (code, PPC_BR_ALWAYS, 0); /* epilog */ - ppc_load_reg (code, ppc_r0, alloc_size + PPC_RET_ADDR_OFFSET, ppc_sp); + ppc_ldptr (code, ppc_r0, alloc_size + PPC_RET_ADDR_OFFSET, ppc_sp); ppc_mtlr (code, ppc_r0); /* restore all the regs from the stack */ @@ -296,11 +304,14 @@ mono_arch_get_call_filter (void) g_assert ((code - start) < size); mono_arch_flush_icache (start, code - start); + + *code_size = code - start; + return start; } -static void -throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, gulong *int_regs, gdouble *fp_regs, gboolean rethrow) +void +mono_ppc_throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, gulong *int_regs, gdouble *fp_regs, gboolean rethrow) { static void (*restore_context) (MonoContext *); MonoContext ctx; @@ -339,45 +350,60 @@ throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, gulong * * void (*func) (guint32 ex_token, gpointer ip) * */ -static gpointer -mono_arch_get_throw_exception_generic (int size, int corlib, gboolean rethrow) +static gpointer +mono_arch_get_throw_exception_generic (int size, guint32 *code_size, MonoJumpInfo **ji, int corlib, gboolean rethrow, gboolean aot) { guint8 *start, *code; int alloc_size, pos; - start = mono_global_codeman_reserve (size); + *ji = NULL; - code = mono_ppc_create_pre_code_ftnptr (start); + code = start = mono_global_codeman_reserve (size); + if (!aot) + code = mono_ppc_create_pre_code_ftnptr (code); /* store ret addr */ if (corlib) ppc_mr (code, ppc_r0, ppc_r4); else ppc_mflr (code, ppc_r0); - ppc_store_reg (code, ppc_r0, PPC_RET_ADDR_OFFSET, ppc_sp); + ppc_stptr (code, ppc_r0, PPC_RET_ADDR_OFFSET, ppc_sp); alloc_size = REG_SAVE_STACK_FRAME_SIZE; g_assert ((alloc_size & (MONO_ARCH_FRAME_ALIGNMENT-1)) == 0); - ppc_store_reg_update (code, ppc_sp, -alloc_size, ppc_sp); + ppc_stptr_update (code, ppc_sp, -alloc_size, ppc_sp); code = emit_save_saved_regs (code, alloc_size); //ppc_break (code); if (corlib) { ppc_mr (code, ppc_r4, ppc_r3); - ppc_load (code, ppc_r3, (gulong)mono_defaults.corlib); - ppc_load_func (code, ppc_r0, mono_exception_from_token); - ppc_mtctr (code, ppc_r0); - ppc_bcctrl (code, PPC_BR_ALWAYS, 0); + + if (aot) { + code = mono_arch_emit_load_aotconst (start, code, ji, MONO_PATCH_INFO_IMAGE, mono_defaults.corlib); + ppc_mr (code, ppc_r3, ppc_r11); + code = mono_arch_emit_load_aotconst (start, code, ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_exception_from_token"); +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + ppc_ldptr (code, ppc_r2, sizeof (gpointer), ppc_r11); + ppc_ldptr (code, ppc_r11, 0, ppc_r11); +#endif + ppc_mtctr (code, ppc_r11); + ppc_bcctrl (code, PPC_BR_ALWAYS, 0); + } else { + ppc_load (code, ppc_r3, (gulong)mono_defaults.corlib); + ppc_load_func (code, ppc_r0, mono_exception_from_token); + ppc_mtctr (code, ppc_r0); + ppc_bcctrl (code, PPC_BR_ALWAYS, 0); + } } /* call throw_exception (exc, ip, sp, int_regs, fp_regs) */ /* caller sp */ - ppc_load_reg (code, ppc_r5, 0, ppc_sp); + ppc_ldptr (code, ppc_r5, 0, ppc_sp); /* exc is already in place in r3 */ if (corlib) - ppc_load_reg (code, ppc_r4, PPC_RET_ADDR_OFFSET, ppc_r5); + ppc_ldptr (code, ppc_r4, PPC_RET_ADDR_OFFSET, ppc_r5); else ppc_mr (code, ppc_r4, ppc_r0); /* caller ip */ /* pointer to the saved fp regs */ @@ -388,13 +414,30 @@ mono_arch_get_throw_exception_generic (int size, int corlib, gboolean rethrow) ppc_addi (code, ppc_r6, ppc_sp, pos); ppc_li (code, ppc_r8, rethrow); - ppc_load_func (code, ppc_r0, throw_exception); - ppc_mtctr (code, ppc_r0); - ppc_bcctrl (code, PPC_BR_ALWAYS, 0); + if (aot) { + // This can be called from runtime code, which can't guarantee that + // r30 contains the got address. + // So emit the got address loading code too + code = mono_arch_emit_load_got_addr (start, code, NULL, ji); + code = mono_arch_emit_load_aotconst (start, code, ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_ppc_throw_exception"); +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + ppc_ldptr (code, ppc_r2, sizeof (gpointer), ppc_r11); + ppc_ldptr (code, ppc_r11, 0, ppc_r11); +#endif + ppc_mtctr (code, ppc_r11); + ppc_bcctrl (code, PPC_BR_ALWAYS, 0); + } else { + ppc_load_func (code, ppc_r0, mono_ppc_throw_exception); + ppc_mtctr (code, ppc_r0); + ppc_bcctrl (code, PPC_BR_ALWAYS, 0); + } /* we should never reach this breakpoint */ ppc_break (code); g_assert ((code - start) <= size); mono_arch_flush_icache (start, code - start); + + *code_size = code - start; + return start; } @@ -407,12 +450,15 @@ mono_arch_get_throw_exception_generic (int size, int corlib, gboolean rethrow) * */ gpointer -mono_arch_get_rethrow_exception (void) +mono_arch_get_rethrow_exception_full (guint32 *code_size, MonoJumpInfo **ji, gboolean aot) { int size = MONO_PPC_32_64_CASE (132, 224) + PPC_FTNPTR_SIZE; - return mono_arch_get_throw_exception_generic (size, FALSE, TRUE); + if (aot) + size += 64; + return mono_arch_get_throw_exception_generic (size, code_size, ji, FALSE, TRUE, aot); } + /** * arch_get_throw_exception: * @@ -425,12 +471,14 @@ mono_arch_get_rethrow_exception (void) * x86_call_code (code, arch_get_throw_exception ()); * */ -gpointer -mono_arch_get_throw_exception (void) +gpointer +mono_arch_get_throw_exception_full (guint32 *code_size, MonoJumpInfo **ji, gboolean aot) { int size = MONO_PPC_32_64_CASE (132, 224) + PPC_FTNPTR_SIZE; - return mono_arch_get_throw_exception_generic (size, FALSE, FALSE); + if (aot) + size += 64; + return mono_arch_get_throw_exception_generic (size, code_size, ji, FALSE, FALSE, aot); } /** @@ -445,16 +493,19 @@ mono_arch_get_throw_exception (void) * x86_call_code (code, arch_get_throw_exception_by_name ()); * */ -gpointer -mono_arch_get_throw_exception_by_name (void) +gpointer +mono_arch_get_throw_exception_by_name_full (guint32 *code_size, MonoJumpInfo **ji, gboolean aot) { guint8 *start, *code; int size = 64; + *ji = NULL; + /* Not used on PPC */ start = code = mono_global_codeman_reserve (size); ppc_break (code); mono_arch_flush_icache (start, code - start); + *code_size = code - start; return start; } @@ -466,12 +517,14 @@ mono_arch_get_throw_exception_by_name (void) * signature: void (*func) (guint32 ex_token, guint32 offset); * On PPC, we pass the ip instead of the offset */ -gpointer -mono_arch_get_throw_corlib_exception (void) +gpointer +mono_arch_get_throw_corlib_exception_full (guint32 *code_size, MonoJumpInfo **ji, gboolean aot) { int size = MONO_PPC_32_64_CASE (168, 304) + PPC_FTNPTR_SIZE; - return mono_arch_get_throw_exception_generic (size, TRUE, FALSE); + if (aot) + size += 64; + return mono_arch_get_throw_exception_generic (size, code_size, ji, TRUE, FALSE, aot); } /* mono_arch_find_jit_info: @@ -584,30 +637,42 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInf void mono_arch_sigctx_to_monoctx (void *ctx, MonoContext *mctx) { +#ifdef MONO_CROSS_COMPILE + g_assert_not_reached (); +#else os_ucontext *uc = ctx; mctx->sc_ir = UCONTEXT_REG_NIP(uc); mctx->sc_sp = UCONTEXT_REG_Rn(uc, 1); memcpy (&mctx->regs, &UCONTEXT_REG_Rn(uc, 13), sizeof (gulong) * MONO_SAVED_GREGS); memcpy (&mctx->fregs, &UCONTEXT_REG_FPRn(uc, 14), sizeof (double) * MONO_SAVED_FREGS); +#endif } void mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *ctx) { +#ifdef MONO_CROSS_COMPILE + g_assert_not_reached (); +#else os_ucontext *uc = ctx; UCONTEXT_REG_NIP(uc) = mctx->sc_ir; UCONTEXT_REG_Rn(uc, 1) = mctx->sc_sp; memcpy (&UCONTEXT_REG_Rn(uc, 13), &mctx->regs, sizeof (gulong) * MONO_SAVED_GREGS); memcpy (&UCONTEXT_REG_FPRn(uc, 14), &mctx->fregs, sizeof (double) * MONO_SAVED_FREGS); +#endif } gpointer mono_arch_ip_from_context (void *sigctx) { +#ifdef MONO_CROSS_COMPILE + g_assert_not_reached (); +#else os_ucontext *uc = sigctx; return (gpointer)UCONTEXT_REG_NIP(uc); +#endif } static void @@ -625,6 +690,9 @@ altstack_handle_and_restore (void *sigctx, gpointer obj, gboolean test_only) void mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean stack_ovf) { +#ifdef MONO_CROSS_COMPILE + g_assert_not_reached (); +#else #ifdef MONO_ARCH_USE_SIGACTION os_ucontext *uc = (ucontext_t*)sigctx; os_ucontext *uc_copy; @@ -681,6 +749,8 @@ mono_arch_handle_altstack_exception (void *sigctx, gpointer fault_addr, gboolean UCONTEXT_REG_Rn(uc, PPC_FIRST_ARG_REG + 1) = 0; UCONTEXT_REG_Rn(uc, PPC_FIRST_ARG_REG + 2) = 0; #endif + +#endif /* !MONO_CROSS_COMPILE */ } gboolean diff --git a/mono/mini/helpers.c b/mono/mini/helpers.c index 1b17098ec5d..8bdcccd4609 100644 --- a/mono/mini/helpers.c +++ b/mono/mini/helpers.c @@ -62,6 +62,9 @@ opnames[] = { #define emit_debug_info FALSE #endif +#define ARCH_PREFIX "" +//#define ARCH_PREFIX "powerpc64-linux-gnu-" + const char* mono_inst_name (int op) { if (op >= OP_LOAD && op <= OP_LAST) @@ -215,7 +218,7 @@ mono_disassemble_code (MonoCompile *cfg, guint8 *code, int size, char *id) close (i); #endif - cmd = g_strdup_printf (AS_CMD " %s -o %s", as_file, o_file); + cmd = g_strdup_printf (ARCH_PREFIX AS_CMD " %s -o %s", as_file, o_file); system (cmd); g_free (cmd); if (!objdump_args) @@ -226,12 +229,12 @@ mono_disassemble_code (MonoCompile *cfg, guint8 *code, int size, char *id) * The arm assembler inserts ELF directives instructing objdump to display * everything as data. */ - cmd = g_strdup_printf ("strip -x %s", o_file); + cmd = g_strdup_printf (ARCH_PREFIX "strip -x %s", o_file); system (cmd); g_free (cmd); #endif - cmd = g_strdup_printf (DIS_CMD " %s %s", objdump_args, o_file); + cmd = g_strdup_printf (ARCH_PREFIX DIS_CMD " %s %s", objdump_args, o_file); system (cmd); g_free (cmd); diff --git a/mono/mini/iltests.il.in b/mono/mini/iltests.il.in index b5bf6fe5e36..46171b740bf 100644 --- a/mono/mini/iltests.il.in +++ b/mono/mini/iltests.il.in @@ -2292,5 +2292,67 @@ OK_2: call int32 Tests::regress_497271_helper (int32) ret } + + .field private static int32 Value + + .method public static hidebysig specialname + default int32 regress_513931_inner () cil managed + { + // Method begins at RVA 0x225c + // Code size 52 (0x34) + .maxstack 2 + .locals init ( + int32 V_0, + int32 V_1, + bool V_2) + + ldc.i4 999 + stsfld int32 Tests::Value + + IL_0000: nop + IL_0001: ldsfld int32 Tests::Value + IL_0006: stloc.0 + IL_0007: ldloc.0 + IL_0008: ldc.i4.0 + IL_0009: cgt + IL_000b: ldc.i4.0 + IL_000c: ceq + IL_000e: stloc.2 + IL_000f: ldloc.2 + IL_0010: brtrue.s IL_0027 + + IL_0012: nop + IL_0013: ldloc.0 + IL_0014: ldc.i4.s 0x7b + IL_0016: ceq + IL_0018: ldc.i4.0 + IL_0019: ceq + IL_001b: stloc.2 + IL_001c: ldloc.2 + IL_001d: brtrue.s IL_0023 + + IL_001f: ldc.i4.m1 + IL_0020: stloc.1 + IL_0021: br.s IL_0032 + + IL_0023: ldc.i4.1 + IL_0024: stloc.1 + IL_0025: br.s IL_0032 + + IL_0027: + IL_002c: newobj instance void class [mscorlib]System.Exception::'.ctor'() + IL_0031: throw + IL_0032: ldloc.1 + IL_0033: ret + } + + .method public static hidebysig specialname + default int32 test_0_regress_513931 () cil managed + { + call int32 Tests::regress_513931_inner () + pop + ldc.i4.0 + ret + } } diff --git a/mono/mini/image-writer.c b/mono/mini/image-writer.c index e4d2f748931..9fcbd03b6f3 100644 --- a/mono/mini/image-writer.c +++ b/mono/mini/image-writer.c @@ -72,7 +72,7 @@ #define AS_INT32_DIRECTIVE ".long" #define AS_INT64_DIRECTIVE ".quad" -#if defined(TARGET_AMD64) || defined(TARGET_POWERPC64) +#if (defined(TARGET_AMD64) || defined(TARGET_POWERPC64)) && !defined(__mono_ilp32__) #define AS_POINTER_DIRECTIVE ".quad" #else #define AS_POINTER_DIRECTIVE ".long" @@ -1504,6 +1504,16 @@ asm_writer_emit_local_symbol (MonoImageWriter *acfg, const char *name, const cha asm_writer_emit_symbol_type (acfg, name, func); } +static void +asm_writer_emit_symbol_size (MonoImageWriter *acfg, const char *name, const char *end_label) +{ + asm_writer_emit_unset_mode (acfg); + +#ifndef TARGET_ASM_APPLE + fprintf (acfg->fp, "\t.size %s,%s-%s\n", name, end_label, name); +#endif +} + static void asm_writer_emit_label (MonoImageWriter *acfg, const char *name) { @@ -1649,6 +1659,8 @@ asm_writer_emit_symbol_diff (MonoImageWriter *acfg, const char *end, const char* fprintf (acfg->fp, "\n\t%s ", AS_INT32_DIRECTIVE); fprintf (acfg->fp, "%s", symbol); #else + start = get_label (start); + end = get_label (end); if ((acfg->col_count++ % 8) == 0) fprintf (acfg->fp, "\n\t%s ", AS_INT32_DIRECTIVE); else @@ -1745,6 +1757,13 @@ img_writer_emit_local_symbol (MonoImageWriter *acfg, const char *name, const cha #endif } +void +img_writer_emit_symbol_size (MonoImageWriter *acfg, const char *name, const char *end_label) +{ + if (!acfg->use_bin_writer) + asm_writer_emit_symbol_size (acfg, name, end_label); +} + void img_writer_emit_label (MonoImageWriter *acfg, const char *name) { diff --git a/mono/mini/image-writer.h b/mono/mini/image-writer.h index d7e99b41562..01a2d1853dd 100644 --- a/mono/mini/image-writer.h +++ b/mono/mini/image-writer.h @@ -46,6 +46,8 @@ void img_writer_emit_global (MonoImageWriter *w, const char *name, gboolean func void img_writer_emit_local_symbol (MonoImageWriter *w, const char *name, const char *end_label, gboolean func) MONO_INTERNAL; +void img_writer_emit_symbol_size (MonoImageWriter *w, const char *start, const char *end_label); + void img_writer_emit_label (MonoImageWriter *w, const char *name) MONO_INTERNAL; void img_writer_emit_bytes (MonoImageWriter *w, const guint8* buf, int size) MONO_INTERNAL; diff --git a/mono/mini/ir-emit.h b/mono/mini/ir-emit.h index b46d21e07fb..46f2895956c 100644 --- a/mono/mini/ir-emit.h +++ b/mono/mini/ir-emit.h @@ -71,6 +71,7 @@ alloc_dreg (MonoCompile *cfg, MonoStackType stack_type) default: g_warning ("Unknown stack type %x\n", stack_type); g_assert_not_reached (); + return -1; } } diff --git a/mono/mini/liveness.c b/mono/mini/liveness.c index 9fc3862bc58..20941f999e6 100644 --- a/mono/mini/liveness.c +++ b/mono/mini/liveness.c @@ -13,11 +13,7 @@ //#define DEBUG_LIVENESS -#if SIZEOF_REGISTER == 8 -#define BITS_PER_CHUNK 64 -#else -#define BITS_PER_CHUNK 32 -#endif +#define BITS_PER_CHUNK MONO_BITSET_BITS_PER_CHUNK /* * The liveness2 pass can't handle long vars on 32 bit platforms because the component diff --git a/mono/mini/mdb-debug-info32-darwin.s b/mono/mini/mdb-debug-info32-darwin.s new file mode 100644 index 00000000000..d7cb2cbc82d --- /dev/null +++ b/mono/mini/mdb-debug-info32-darwin.s @@ -0,0 +1,13 @@ +.text +.globl _MONO_DEBUGGER__debugger_info +.globl _MONO_DEBUGGER__notification_function +_MONO_DEBUGGER__notification_function: + int3 + ret +.section .mdb_debug_info, "aw" +.globl _MONO_DEBUGGER__debugger_info_ptr +.globl _MONO_DEBUGGER__using_debugger +_MONO_DEBUGGER__debugger_info_ptr: + .long _MONO_DEBUGGER__debugger_info +_MONO_DEBUGGER__using_debugger: + .quad 0 diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c index aa4c026dc5e..787961ef457 100644 --- a/mono/mini/method-to-ir.c +++ b/mono/mini/method-to-ir.c @@ -1047,7 +1047,7 @@ mono_get_domainvar (MonoCompile *cfg) * The got_var contains the address of the Global Offset Table when AOT * compiling. */ -inline static MonoInst * +MonoInst * mono_get_got_var (MonoCompile *cfg) { #ifdef MONO_ARCH_NEED_GOT_VAR @@ -2232,12 +2232,17 @@ mono_emit_rgctx_calli (MonoCompile *cfg, MonoMethodSignature *sig, MonoInst **ar #endif } +static MonoInst* +emit_get_rgctx_method (MonoCompile *cfg, int context_used, MonoMethod *cmethod, int rgctx_type); + static MonoInst* mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSignature *sig, MonoInst **args, MonoInst *this, MonoInst *imt_arg) { + gboolean might_be_remote; gboolean virtual = this != NULL; gboolean enable_for_aot = TRUE; + int context_used; MonoCallInst *call; if (method->string_ctor) { @@ -2249,15 +2254,27 @@ mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSign sig = ctor_sig; } + might_be_remote = this && sig->hasthis && + (method->klass->marshalbyref || method->klass == mono_defaults.object_class) && + !(method->flags & METHOD_ATTRIBUTE_VIRTUAL) && !MONO_CHECK_THIS (this); + + context_used = mono_method_check_context_used (method); + if (might_be_remote && context_used) { + MonoInst *addr; + + g_assert (cfg->generic_sharing_context); + + addr = emit_get_rgctx_method (cfg, context_used, method, MONO_RGCTX_INFO_REMOTING_INVOKE_WITH_CHECK); + + return mono_emit_calli (cfg, sig, args, addr); + } + call = mono_emit_call_args (cfg, sig, args, FALSE, virtual, FALSE); - if (this && sig->hasthis && - (method->klass->marshalbyref || method->klass == mono_defaults.object_class) && - !(method->flags & METHOD_ATTRIBUTE_VIRTUAL) && !MONO_CHECK_THIS (this)) { + if (might_be_remote) call->method = mono_marshal_get_remoting_invoke_with_check (method); - } else { + else call->method = method; - } call->inst.flags |= MONO_INST_HAS_METHOD; call->inst.inst_left = this; @@ -2859,7 +2876,11 @@ handle_alloc (MonoCompile *cfg, MonoClass *klass, gboolean for_box) return mono_emit_jit_icall (cfg, mono_helper_newobj_mscorlib, iargs); } else { MonoVTable *vtable = mono_class_vtable (cfg->domain, klass); +#ifdef MONO_CROSS_COMPILE + MonoMethod *managed_alloc = NULL; +#else MonoMethod *managed_alloc = mono_gc_get_managed_allocator (vtable, for_box); +#endif gboolean pass_lw; if (managed_alloc) { @@ -4036,7 +4057,11 @@ mini_redirect_call (MonoCompile *cfg, MonoMethod *method, if (strcmp (method->name, "InternalAllocateStr") == 0) { MonoInst *iargs [2]; MonoVTable *vtable = mono_class_vtable (cfg->domain, method->klass); +#ifdef MONO_CROSS_COMPILE + MonoMethod *managed_alloc = NULL; +#else MonoMethod *managed_alloc = mono_gc_get_managed_allocator (vtable, FALSE); +#endif if (!managed_alloc) return NULL; EMIT_NEW_VTABLECONST (cfg, iargs [0], vtable); @@ -4669,7 +4694,7 @@ initialize_array_data (MonoMethod *method, gboolean aot, unsigned char *ip, Mono case MONO_TYPE_U1: size = 1; break; /* we need to swap on big endian, so punt. Should we handle R4 and R8 as well? */ -#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#if TARGET_BYTE_ORDER == G_LITTLE_ENDIAN case MONO_TYPE_CHAR: case MONO_TYPE_I2: case MONO_TYPE_U2: @@ -5869,38 +5894,76 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b break; case CEE_LDC_R4: { float *f; + gboolean use_aotconst = FALSE; + +#ifdef TARGET_POWERPC + /* FIXME: Clean this up */ + if (cfg->compile_aot) + use_aotconst = TRUE; +#endif + /* FIXME: we should really allocate this only late in the compilation process */ f = mono_domain_alloc (cfg->domain, sizeof (float)); CHECK_OPSIZE (5); CHECK_STACK_OVF (1); - MONO_INST_NEW (cfg, ins, OP_R4CONST); - ins->type = STACK_R8; - ins->dreg = alloc_dreg (cfg, STACK_R8); + + if (use_aotconst) { + MonoInst *cons; + int dreg; + + EMIT_NEW_AOTCONST (cfg, cons, MONO_PATCH_INFO_R4, f); + + dreg = alloc_freg (cfg); + EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOADR4_MEMBASE, dreg, cons->dreg, 0); + ins->type = STACK_R8; + } else { + MONO_INST_NEW (cfg, ins, OP_R4CONST); + ins->type = STACK_R8; + ins->dreg = alloc_dreg (cfg, STACK_R8); + ins->inst_p0 = f; + MONO_ADD_INS (bblock, ins); + } ++ip; readr4 (ip, f); - ins->inst_p0 = f; - MONO_ADD_INS (bblock, ins); - ip += 4; *sp++ = ins; break; } case CEE_LDC_R8: { double *d; + gboolean use_aotconst = FALSE; + +#ifdef TARGET_POWERPC + /* FIXME: Clean this up */ + if (cfg->compile_aot) + use_aotconst = TRUE; +#endif + /* FIXME: we should really allocate this only late in the compilation process */ d = mono_domain_alloc (cfg->domain, sizeof (double)); CHECK_OPSIZE (9); CHECK_STACK_OVF (1); - MONO_INST_NEW (cfg, ins, OP_R8CONST); - ins->type = STACK_R8; - ins->dreg = alloc_dreg (cfg, STACK_R8); + + if (use_aotconst) { + MonoInst *cons; + int dreg; + + EMIT_NEW_AOTCONST (cfg, cons, MONO_PATCH_INFO_R8, d); + + dreg = alloc_freg (cfg); + EMIT_NEW_LOAD_MEMBASE (cfg, ins, OP_LOADR8_MEMBASE, dreg, cons->dreg, 0); + ins->type = STACK_R8; + } else { + MONO_INST_NEW (cfg, ins, OP_R8CONST); + ins->type = STACK_R8; + ins->dreg = alloc_dreg (cfg, STACK_R8); + ins->inst_p0 = d; + MONO_ADD_INS (bblock, ins); + } ++ip; readr8 (ip, d); - ins->inst_p0 = d; - MONO_ADD_INS (bblock, ins); - ip += 8; - *sp++ = ins; + *sp++ = ins; break; } case CEE_DUP: { @@ -6501,6 +6564,9 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b */ ins = (MonoInst*)mono_emit_abs_call (cfg, MONO_PATCH_INFO_ICALL_ADDR, addr->inst_p0, fsig, sp); NULLIFY_INS (addr); + } else if (addr->opcode == OP_GOT_ENTRY && addr->inst_right->inst_c1 == MONO_PATCH_INFO_ICALL_ADDR) { + ins = (MonoInst*)mono_emit_abs_call (cfg, MONO_PATCH_INFO_ICALL_ADDR, addr->inst_right->inst_left, fsig, sp); + NULLIFY_INS (addr); } else { ins = (MonoInst*)mono_emit_calli (cfg, fsig, sp, addr); } @@ -6856,6 +6922,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if (COMPILE_LLVM (cfg)) use_op_switch = TRUE; + cfg->cbb->has_jump_table = 1; + if (use_op_switch) { MONO_INST_NEW (cfg, ins, OP_SWITCH); ins->sreg1 = src1->dreg; @@ -7496,8 +7564,6 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b INLINE_FAILURE; ins = mono_emit_rgctx_method_call_full (cfg, cmethod, fsig, sp, callvirt_this_arg, NULL, vtable_arg); - if (mono_method_is_generic_sharable_impl (cmethod, TRUE) && ((MonoCallInst*)ins)->method->wrapper_type == MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK) - GENERIC_SHARING_FAILURE (*ip); } } @@ -8676,7 +8742,13 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b ins = emit_get_rgctx_klass (cfg, context_used, tclass, MONO_RGCTX_INFO_REFLECTION_TYPE); } else if (cfg->compile_aot) { - EMIT_NEW_TYPE_FROM_HANDLE_CONST (cfg, ins, image, n, generic_context); + if (method->wrapper_type) { + /* FIXME: n is not a normal token */ + cfg->disable_aot = TRUE; + EMIT_NEW_PCONST (cfg, ins, NULL); + } else { + EMIT_NEW_TYPE_FROM_HANDLE_CONST (cfg, ins, image, n, generic_context); + } } else { EMIT_NEW_PCONST (cfg, ins, mono_type_get_object (cfg->domain, handle)); } @@ -8813,6 +8885,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b MONO_INST_NEW (cfg, ins, OP_CALL_HANDLER); ins->inst_target_bb = tblock; MONO_ADD_INS (bblock, ins); + bblock->has_call_handler = 1; } g_list_free (handlers); } @@ -9565,6 +9638,12 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b MONO_ADD_INS (cfg->cbb, store); } +#ifdef TARGET_POWERPC + if (cfg->compile_aot) + /* FIXME: The plt slots require a GOT var even if the method doesn't use it */ + mono_get_got_var (cfg); +#endif + if (cfg->method == method && cfg->got_var) mono_emit_load_got_addr (cfg); diff --git a/mono/mini/mini-alpha.c b/mono/mini/mini-alpha.c index 2d5507660d2..c696fb68393 100644 --- a/mono/mini/mini-alpha.c +++ b/mono/mini/mini-alpha.c @@ -5806,7 +5806,7 @@ mono_arch_print_tree (MonoInst *tree, int arity) */ gpointer* -mono_arch_get_vcall_slot_addr (guint8* code, gpointer *regs) +mono_arch_get_vcall_slot_addr (guint8* code, mgreg_t *regs) { unsigned int *pc = (unsigned int *)code; guint32 reg, disp; @@ -5858,7 +5858,7 @@ mono_arch_get_vcall_slot_addr (guint8* code, gpointer *regs) } gpointer -mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code) +mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code) { unsigned int *pc = (unsigned int *)code; diff --git a/mono/mini/mini-amd64.c b/mono/mini/mini-amd64.c index b083dbf2f06..d51ecaf3789 100644 --- a/mono/mini/mini-amd64.c +++ b/mono/mini/mini-amd64.c @@ -916,6 +916,36 @@ mono_arch_cpu_optimizazions (guint32 *exclude_mask) return opts; } +/* + * This function test for all SSE functions supported. + * + * Returns a bitmask corresponding to all supported versions. + * + * TODO detect other versions like SSE4a. + */ +guint32 +mono_arch_cpu_enumerate_simd_versions (void) +{ + int eax, ebx, ecx, edx; + guint32 sse_opts = 0; + + if (cpuid (1, &eax, &ebx, &ecx, &edx)) { + if (edx & (1 << 25)) + sse_opts |= 1 << SIMD_VERSION_SSE1; + if (edx & (1 << 26)) + sse_opts |= 1 << SIMD_VERSION_SSE2; + if (ecx & (1 << 0)) + sse_opts |= 1 << SIMD_VERSION_SSE3; + if (ecx & (1 << 9)) + sse_opts |= 1 << SIMD_VERSION_SSSE3; + if (ecx & (1 << 19)) + sse_opts |= 1 << SIMD_VERSION_SSE41; + if (ecx & (1 << 20)) + sse_opts |= 1 << SIMD_VERSION_SSE42; + } + return sse_opts; +} + GList * mono_arch_get_allocatable_int_vars (MonoCompile *cfg) { @@ -4451,6 +4481,158 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) amd64_mov_reg_reg (code, ins->dreg, AMD64_RAX, size); break; } +#ifdef MONO_ARCH_SIMD_INTRINSICS + case OP_ADDPS: + amd64_sse_addps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_DIVPS: + amd64_sse_divps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_MULPS: + amd64_sse_mulps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_SUBPS: + amd64_sse_subps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_MAXPS: + amd64_sse_maxps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_MINPS: + amd64_sse_minps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_COMPPS: + g_assert (ins->inst_c0 >= 0 && ins->inst_c0 <= 7); + amd64_sse_cmpps_reg_reg_imm (code, ins->sreg1, ins->sreg2, ins->inst_c0); + break; + case OP_ANDPS: + amd64_sse_andps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_ANDNPS: + amd64_sse_andnps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_ORPS: + amd64_sse_orps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_XORPS: + amd64_sse_xorps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_SQRTPS: + amd64_sse_sqrtps_reg_reg (code, ins->dreg, ins->sreg1); + break; + case OP_RSQRTPS: + amd64_sse_rsqrtps_reg_reg (code, ins->dreg, ins->sreg1); + break; + case OP_RCPPS: + amd64_sse_rcpps_reg_reg (code, ins->dreg, ins->sreg1); + break; + case OP_ADDSUBPS: + amd64_sse_addsubps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_HADDPS: + amd64_sse_haddps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_HSUBPS: + amd64_sse_hsubps_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_DUPPS_HIGH: + amd64_sse_movshdup_reg_reg (code, ins->dreg, ins->sreg1); + break; + case OP_DUPPS_LOW: + amd64_sse_movsldup_reg_reg (code, ins->dreg, ins->sreg1); + break; + + case OP_PSHUFLEW_HIGH: + g_assert (ins->inst_c0 >= 0 && ins->inst_c0 <= 0xFF); + amd64_sse_pshufhw_reg_reg_imm (code, ins->dreg, ins->sreg1, ins->inst_c0); + break; + case OP_PSHUFLEW_LOW: + g_assert (ins->inst_c0 >= 0 && ins->inst_c0 <= 0xFF); + amd64_sse_pshuflw_reg_reg_imm (code, ins->dreg, ins->sreg1, ins->inst_c0); + break; + case OP_PSHUFLED: + g_assert (ins->inst_c0 >= 0 && ins->inst_c0 <= 0xFF); + amd64_sse_pshufd_reg_reg_imm (code, ins->dreg, ins->sreg1, ins->inst_c0); + break; + + case OP_ADDPD: + amd64_sse_addpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_DIVPD: + amd64_sse_divpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_MULPD: + amd64_sse_mulpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_SUBPD: + amd64_sse_subpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_MAXPD: + amd64_sse_maxpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_MINPD: + amd64_sse_minpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_COMPPD: + g_assert (ins->inst_c0 >= 0 && ins->inst_c0 <= 7); + amd64_sse_cmppd_reg_reg_imm (code, ins->sreg1, ins->sreg2, ins->inst_c0); + break; + case OP_ANDPD: + amd64_sse_andpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_ANDNPD: + amd64_sse_andnpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_ORPD: + amd64_sse_orpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_XORPD: + amd64_sse_xorpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + /* TODO: This op is in the AMD64 manual but has not been implemented. + case OP_SQRTPD: + amd64_sse_sqrtpd_reg_reg (code, ins->dreg, ins->sreg1); + break; + */ + case OP_ADDSUBPD: + amd64_sse_addsubpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_HADDPD: + amd64_sse_haddpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_HSUBPD: + amd64_sse_hsubpd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_DUPPD: + amd64_sse_movddup_reg_reg (code, ins->dreg, ins->sreg1); + break; + + case OP_EXTRACT_MASK: + amd64_sse_pmovmskb_reg_reg (code, ins->dreg, ins->sreg1); + break; + + case OP_PAND: + amd64_sse_pand_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_POR: + amd64_sse_por_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_PXOR: + amd64_sse_pxor_reg_reg (code, ins->sreg1, ins->sreg2); + break; + + case OP_PADDB: + amd64_sse_paddb_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_PADDW: + amd64_sse_paddw_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_PADDD: + amd64_sse_paddd_reg_reg (code, ins->sreg1, ins->sreg2); + break; + case OP_PADDQ: + amd64_sse_paddq_reg_reg (code, ins->sreg1, ins->sreg2); + break; +#endif case OP_LIVERANGE_START: { if (cfg->verbose_level > 1) printf ("R%d START=0x%x\n", MONO_VARINFO (cfg, ins->inst_c0)->vreg, (int)(code - cfg->native_code)); @@ -4973,10 +5155,15 @@ mono_arch_emit_prolog (MonoCompile *cfg) guint8 *buf, *no_domain_branch; code = mono_amd64_emit_tls_get (code, AMD64_RAX, appdomain_tls_offset); - if ((domain >> 32) == 0) - amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 4); - else - amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 8); + if (cfg->compile_aot) { + /* AOT code is only used in the root domain */ + amd64_mov_reg_imm (code, AMD64_ARG_REG1, 0); + } else { + if ((domain >> 32) == 0) + amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 4); + else + amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 8); + } amd64_alu_reg_reg (code, X86_CMP, AMD64_RAX, AMD64_ARG_REG1); no_domain_branch = code; x86_branch8 (code, X86_CC_NE, 0, 0); @@ -4995,10 +5182,15 @@ mono_arch_emit_prolog (MonoCompile *cfg) #endif } else { g_assert (!cfg->compile_aot); - if ((domain >> 32) == 0) - amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 4); - else - amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 8); + if (cfg->compile_aot) { + /* AOT code is only used in the root domain */ + amd64_mov_reg_imm (code, AMD64_ARG_REG1, 0); + } else { + if ((domain >> 32) == 0) + amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 4); + else + amd64_mov_reg_imm_size (code, AMD64_ARG_REG1, domain, 8); + } code = emit_call (cfg, code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_jit_thread_attach", TRUE); } @@ -5007,8 +5199,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) if (method->save_lmf) { if ((lmf_tls_offset != -1) && !optimize_for_xen) { /* - * Optimized version which uses the mono_lmf TLS variable instead of indirection - * through the mono_lmf_addr TLS variable. + * Optimized version which uses the mono_lmf TLS variable instead of + * indirection through the mono_lmf_addr TLS variable. */ /* %rax = previous_lmf */ x86_prefix (code, X86_FS_PREFIX); @@ -5747,7 +5939,7 @@ mono_breakpoint_clean_code (guint8 *method_start, guint8 *code, int offset, guin } gpointer -mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement) +mono_arch_get_vcall_slot (guint8 *code, mgreg_t *regs, int *displacement) { guint8 buf [10]; guint32 reg; @@ -5828,7 +6020,7 @@ mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement) g_assert (reg != AMD64_R11); *displacement = disp; - return regs [reg]; + return (gpointer)regs [reg]; } int @@ -5853,7 +6045,7 @@ mono_arch_get_this_arg_reg (MonoMethodSignature *sig, MonoGenericSharingContext } gpointer -mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code) +mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code) { return (gpointer)regs [mono_arch_get_this_arg_reg (sig, gsctx, code)]; } @@ -6205,20 +6397,20 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI } MonoMethod* -mono_arch_find_imt_method (gpointer *regs, guint8 *code) +mono_arch_find_imt_method (mgreg_t *regs, guint8 *code) { - return regs [MONO_ARCH_IMT_REG]; + return (MonoMethod*)regs [MONO_ARCH_IMT_REG]; } MonoObject* -mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) +mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) { - return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), (gssize*)regs, NULL); + return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL); } #endif MonoVTable* -mono_arch_find_static_call_vtable (gpointer *regs, guint8 *code) +mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code) { return (MonoVTable*) regs [MONO_ARCH_RGCTX_REG]; } diff --git a/mono/mini/mini-arch.h b/mono/mini/mini-arch.h index 9abaff99987..a59f5f40913 100644 --- a/mono/mini/mini-arch.h +++ b/mono/mini/mini-arch.h @@ -5,7 +5,7 @@ #include "mini-x86.h" #elif defined(TARGET_AMD64) #include "mini-amd64.h" -#elif defined(__mono_ppc__) +#elif defined(TARGET_POWERPC) #include "mini-ppc.h" #elif defined(__sparc__) || defined(sparc) #include "mini-sparc.h" diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c index 2cb0665ae2a..5e3654f86c2 100644 --- a/mono/mini/mini-arm.c +++ b/mono/mini/mini-arm.c @@ -264,7 +264,7 @@ mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJit } static gpointer -decode_vcall_slot_from_ldr (guint32 ldr, gpointer *regs, int *displacement) +decode_vcall_slot_from_ldr (guint32 ldr, mgreg_t *regs, int *displacement) { char *o = NULL; int reg, offset = 0; @@ -280,7 +280,7 @@ decode_vcall_slot_from_ldr (guint32 ldr, gpointer *regs, int *displacement) } gpointer -mono_arch_get_vcall_slot (guint8 *code_ptr, gpointer *regs, int *displacement) +mono_arch_get_vcall_slot (guint8 *code_ptr, mgreg_t *regs, int *displacement) { guint32* code = (guint32*)code_ptr; @@ -466,7 +466,7 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe } gpointer -mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code) +mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code) { /* FIXME: handle returning a struct */ if (MONO_TYPE_ISSTRUCT (sig->ret)) @@ -4350,7 +4350,7 @@ mono_arch_emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoInst *imt } MonoMethod* -mono_arch_find_imt_method (gpointer *regs, guint8 *code) +mono_arch_find_imt_method (mgreg_t *regs, guint8 *code) { guint32 *code_ptr = (guint32*)code; code_ptr -= 2; @@ -4367,13 +4367,13 @@ mono_arch_find_imt_method (gpointer *regs, guint8 *code) } MonoObject* -mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) +mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) { - return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), (gssize*)regs, NULL); + return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL); } MonoVTable* -mono_arch_find_static_call_vtable (gpointer *regs, guint8 *code) +mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code) { return (MonoVTable*) regs [MONO_ARCH_RGCTX_REG]; } diff --git a/mono/mini/mini-codegen.c b/mono/mini/mini-codegen.c index 897a113ff07..0982ffb6be7 100644 --- a/mono/mini/mini-codegen.c +++ b/mono/mini/mini-codegen.c @@ -41,13 +41,13 @@ static const int regbank_size [] = { }; static const int regbank_load_ops [] = { - OP_LOAD_MEMBASE, + OP_LOADR_MEMBASE, OP_LOADR8_MEMBASE, OP_LOADX_MEMBASE }; static const int regbank_store_ops [] = { - OP_STORE_MEMBASE_REG, + OP_STORER_MEMBASE_REG, OP_STORER8_MEMBASE_REG, OP_STOREX_MEMBASE }; @@ -73,7 +73,7 @@ static const regmask_t regbank_callee_regs [] = { }; static const int regbank_spill_var_size[] = { - sizeof (gpointer), + sizeof (mgreg_t), sizeof (double), 16 /*FIXME make this a constant. Maybe MONO_ARCH_SIMD_VECTOR_SIZE? */ }; @@ -260,14 +260,14 @@ mono_spillvar_offset (MonoCompile *cfg, int spillvar, int bank) */ info = &cfg->spill_info [bank][spillvar]; if (info->offset == -1) { - cfg->stack_offset += sizeof (gpointer) - 1; - cfg->stack_offset &= ~(sizeof (gpointer) - 1); + cfg->stack_offset += sizeof (mgreg_t) - 1; + cfg->stack_offset &= ~(sizeof (mgreg_t) - 1); g_assert (bank < MONO_NUM_REGBANKS); if (G_UNLIKELY (bank)) size = regbank_spill_var_size [bank]; else - size = sizeof (gpointer); + size = sizeof (mgreg_t); if (cfg->flags & MONO_CFG_HAS_SPILLUP) { cfg->stack_offset += size - 1; diff --git a/mono/mini/mini-exceptions.c b/mono/mini/mini-exceptions.c index 852aa416192..365097d734f 100644 --- a/mono/mini/mini-exceptions.c +++ b/mono/mini/mini-exceptions.c @@ -307,15 +307,21 @@ get_generic_context_from_stack_frame (MonoJitInfo *ji, gpointer generic_info) class = generic_info; } - if (class->generic_class || class->generic_container) - context.class_inst = mini_class_get_context (class)->class_inst; - g_assert (!ji->method->klass->generic_container); if (ji->method->klass->generic_class) method_container_class = ji->method->klass->generic_class->container_class; else method_container_class = ji->method->klass; + /* class might refer to a subclass of ji->method's class */ + while (class->generic_class && class->generic_class->container_class != method_container_class) { + class = class->parent; + g_assert (class); + } + + if (class->generic_class || class->generic_container) + context.class_inst = mini_class_get_context (class)->class_inst; + if (class->generic_class) g_assert (mono_class_has_parent_and_ignore_generics (class->generic_class->container_class, method_container_class)); else @@ -329,7 +335,7 @@ get_method_from_stack_frame (MonoJitInfo *ji, gpointer generic_info) { MonoGenericContext context; MonoMethod *method; - + if (!ji->has_generic_jit_info || !mono_jit_info_get_generic_jit_info (ji)->has_this) return ji->method; context = get_generic_context_from_stack_frame (ji, generic_info); @@ -1369,7 +1375,7 @@ restore_stack_protection (void) } gpointer -mono_altstack_restore_prot (gssize *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) +mono_altstack_restore_prot (mgreg_t *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) { void (*func)(void) = (gpointer)tramp_data; func (); diff --git a/mono/mini/mini-hppa.c b/mono/mini/mini-hppa.c index f5f1afecc1f..e881352ad68 100644 --- a/mono/mini/mini-hppa.c +++ b/mono/mini/mini-hppa.c @@ -1112,7 +1112,7 @@ emit_memcpy (guint32 *code, int doff, int dreg, int soff, int sreg, int size) * Determine the vtable slot used by a virtual call. */ gpointer* -mono_arch_get_vcall_slot_addr (guint8 *code8, gpointer *regs) +mono_arch_get_vcall_slot_addr (guint8 *code8, mgreg_t *regs) { guint32 *code = (guint32*)((unsigned long)code8 & ~3); diff --git a/mono/mini/mini-ia64.c b/mono/mini/mini-ia64.c index 8b29baa2d60..c44af5c899b 100644 --- a/mono/mini/mini-ia64.c +++ b/mono/mini/mini-ia64.c @@ -4500,7 +4500,7 @@ mono_arch_get_patch_offset (guint8 *code) } gpointer -mono_arch_get_vcall_slot (guint8* code, gpointer *regs, int *displacement) +mono_arch_get_vcall_slot (guint8* code, mgreg_t *regs, int *displacement) { guint8 *bundle2 = code - 48; guint8 *bundle3 = code - 32; @@ -4558,7 +4558,7 @@ mono_arch_get_vcall_slot (guint8* code, gpointer *regs, int *displacement) } gpointer* -mono_arch_get_delegate_method_ptr_addr (guint8* code, gpointer *regs) +mono_arch_get_delegate_method_ptr_addr (guint8* code, mgreg_t *regs) { NOT_IMPLEMENTED; @@ -4659,7 +4659,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI } MonoMethod* -mono_arch_find_imt_method (gpointer *regs, guint8 *code) +mono_arch_find_imt_method (mgreg_t *regs, guint8 *code) { return regs [IA64_R9]; } @@ -4672,15 +4672,15 @@ mono_arch_emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoInst *imt #endif gpointer -mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code) +mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code) { return (gpointer)regs [IA64_R10]; } MonoObject* -mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) +mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) { - return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), (gssize*)regs, NULL); + return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL); } gpointer diff --git a/mono/mini/mini-mips.c b/mono/mini/mini-mips.c index ff3098331e8..5a9a010f3de 100644 --- a/mono/mini/mini-mips.c +++ b/mono/mini/mini-mips.c @@ -508,7 +508,7 @@ mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJit gpointer -mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code) +mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code) { /* FIXME: handle returning a struct */ if (MONO_TYPE_ISSTRUCT (sig->ret)) @@ -5565,20 +5565,20 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI } MonoMethod* -mono_arch_find_imt_method (gpointer *regs, guint8 *code) +mono_arch_find_imt_method (mgreg_t *regs, guint8 *code) { return (MonoMethod*) regs [MONO_ARCH_IMT_REG]; } MonoObject* -mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) +mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) { - return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), (gssize*)regs, NULL); + return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL); } #endif MonoVTable* -mono_arch_find_static_call_vtable (gpointer *regs, guint8 *code) +mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code) { NOT_IMPLEMENTED; return (MonoVTable*) regs [MONO_ARCH_RGCTX_REG]; diff --git a/mono/mini/mini-ops.h b/mono/mini/mini-ops.h index 76a4be2d592..ca4650cb994 100644 --- a/mono/mini/mini-ops.h +++ b/mono/mini/mini-ops.h @@ -930,7 +930,7 @@ MINI_OP(OP_AMD64_LOADI8_MEMINDEX, "amd64_loadi8_memindex", IREG, IREG, IR MINI_OP(OP_AMD64_SAVE_SP_TO_LMF, "amd64_save_sp_to_lmf", NONE, NONE, NONE) #endif -#if defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__) +#if defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__) || defined(TARGET_POWERPC) MINI_OP(OP_PPC_SUBFIC, "ppc_subfic", IREG, IREG, NONE) MINI_OP(OP_PPC_SUBFZE, "ppc_subfze", IREG, IREG, NONE) MINI_OP(OP_CHECK_FINITE, "ppc_check_finite", NONE, IREG, NONE) diff --git a/mono/mini/mini-ppc.c b/mono/mini/mini-ppc.c index 51c74000b08..960f81d4e6e 100644 --- a/mono/mini/mini-ppc.c +++ b/mono/mini/mini-ppc.c @@ -16,7 +16,7 @@ #include #include "mini-ppc.h" -#ifdef __mono_ppc64__ +#ifdef TARGET_POWERPC64 #include "cpu-ppc64.h" #else #include "cpu-ppc.h" @@ -64,14 +64,14 @@ offsets_from_pthread_key (guint32 key, int *offset2) #define emit_linuxthreads_tls(code,dreg,key) do {\ int off1, off2; \ off1 = offsets_from_pthread_key ((key), &off2); \ - ppc_load_reg ((code), (dreg), off1, ppc_r2); \ - ppc_load_reg ((code), (dreg), off2, (dreg)); \ + ppc_ldptr ((code), (dreg), off1, ppc_r2); \ + ppc_ldptr ((code), (dreg), off2, (dreg)); \ } while (0); #define emit_darwing5_tls(code,dreg,key) do {\ int off1 = 0x48 + key * sizeof (gpointer); \ ppc_mfspr ((code), (dreg), 104); \ - ppc_load_reg ((code), (dreg), off1, (dreg)); \ + ppc_ldptr ((code), (dreg), off1, (dreg)); \ } while (0); /* FIXME: ensure the sc call preserves all but r3 */ @@ -89,11 +89,11 @@ offsets_from_pthread_key (guint32 key, int *offset2) int off1 = key; \ int off2 = key >> 15; \ if ((off2 == 0) || (off2 == -1)) { \ - ppc_load_reg ((code), (dreg), off1, PPC_THREAD_PTR_REG); \ + ppc_ldptr ((code), (dreg), off1, PPC_THREAD_PTR_REG); \ } else { \ int off3 = (off2 + 1) > 1; \ ppc_addis ((code), ppc_r11, PPC_THREAD_PTR_REG, off3); \ - ppc_load_reg ((code), (dreg), off1, ppc_r11); \ + ppc_ldptr ((code), (dreg), off1, ppc_r11); \ } \ } while (0); #else @@ -113,7 +113,7 @@ offsets_from_pthread_key (guint32 key, int *offset2) } while (0) #define MONO_EMIT_NEW_LOAD_R8(cfg,dr,addr) do { \ - MonoInst *inst; \ + MonoInst *inst; \ MONO_INST_NEW ((cfg), (inst), OP_R8CONST); \ inst->type = STACK_R8; \ inst->dreg = (dr); \ @@ -168,8 +168,8 @@ emit_memcpy (guint8 *code, int size, int dreg, int doffset, int sreg, int soffse ppc_addi (code, ppc_r12, dreg, (doffset - sizeof (gpointer))); ppc_addi (code, ppc_r11, sreg, (soffset - sizeof (gpointer))); copy_loop_start = code; - ppc_load_reg_update (code, ppc_r0, (unsigned int)sizeof (gpointer), ppc_r11); - ppc_store_reg_update (code, ppc_r0, (unsigned int)sizeof (gpointer), ppc_r12); + ppc_ldptr_update (code, ppc_r0, (unsigned int)sizeof (gpointer), ppc_r11); + ppc_stptr_update (code, ppc_r0, (unsigned int)sizeof (gpointer), ppc_r12); copy_loop_jump = code; ppc_bc (code, PPC_BR_DEC_CTR_NONZERO, 0, 0); ppc_patch (copy_loop_jump, copy_loop_start); @@ -179,8 +179,8 @@ emit_memcpy (guint8 *code, int size, int dreg, int doffset, int sreg, int soffse } #ifdef __mono_ppc64__ while (size >= 8) { - ppc_load_reg (code, ppc_r0, soffset, sreg); - ppc_store_reg (code, ppc_r0, doffset, dreg); + ppc_ldptr (code, ppc_r0, soffset, sreg); + ppc_stptr (code, ppc_r0, doffset, dreg); size -= 8; soffset += 8; doffset += 8; @@ -322,7 +322,7 @@ mono_ppc_is_direct_call_sequence (guint32 *code) } gpointer -mono_arch_get_vcall_slot (guint8 *code_ptr, gpointer *regs, int *displacement) +mono_arch_get_vcall_slot (guint8 *code_ptr, mgreg_t *regs, int *displacement) { char *o = NULL; int reg, offset = 0; @@ -375,72 +375,47 @@ mono_arch_get_vcall_slot (guint8 *code_ptr, gpointer *regs, int *displacement) #define MAX_ARCH_DELEGATE_PARAMS 7 -gpointer -mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_target) +static gpointer +get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *code_len, gboolean aot) { guint8 *code, *start; - /* FIXME: Support more cases */ - if (MONO_TYPE_ISSTRUCT (sig->ret)) - return NULL; - if (has_target) { - static guint8* cached = NULL; - int size = MONO_PPC_32_64_CASE (16, 20) + PPC_FTNPTR_SIZE; - mono_mini_arch_lock (); - if (cached) { - mono_mini_arch_unlock (); - return cached; - } + int size = MONO_PPC_32_64_CASE (32, 32) + PPC_FTNPTR_SIZE; start = code = mono_global_codeman_reserve (size); - code = mono_ppc_create_pre_code_ftnptr (code); + if (!aot) + code = mono_ppc_create_pre_code_ftnptr (code); /* Replace the this argument with the target */ - ppc_load_reg (code, ppc_r0, G_STRUCT_OFFSET (MonoDelegate, method_ptr), ppc_r3); + ppc_ldptr (code, ppc_r0, G_STRUCT_OFFSET (MonoDelegate, method_ptr), ppc_r3); #ifdef PPC_USES_FUNCTION_DESCRIPTOR /* it's a function descriptor */ ppc_ldx (code, ppc_r0, 0, ppc_r0); #endif ppc_mtctr (code, ppc_r0); - ppc_load_reg (code, ppc_r3, G_STRUCT_OFFSET (MonoDelegate, target), ppc_r3); + ppc_ldptr (code, ppc_r3, G_STRUCT_OFFSET (MonoDelegate, target), ppc_r3); ppc_bcctr (code, PPC_BR_ALWAYS, 0); g_assert ((code - start) <= size); mono_arch_flush_icache (start, size); - cached = start; - mono_mini_arch_unlock (); - return cached; } else { - static guint8* cache [MAX_ARCH_DELEGATE_PARAMS + 1] = {NULL}; int size, i; - if (sig->param_count > MAX_ARCH_DELEGATE_PARAMS) - return NULL; - for (i = 0; i < sig->param_count; ++i) - if (!mono_is_regsize_var (sig->params [i])) - return NULL; - - mono_mini_arch_lock (); - code = cache [sig->param_count]; - if (code) { - mono_mini_arch_unlock (); - return code; - } - - size = MONO_PPC_32_64_CASE (12, 16) + sig->param_count * 4 + PPC_FTNPTR_SIZE; + size = MONO_PPC_32_64_CASE (32, 32) + param_count * 4 + PPC_FTNPTR_SIZE; start = code = mono_global_codeman_reserve (size); - code = mono_ppc_create_pre_code_ftnptr (code); + if (!aot) + code = mono_ppc_create_pre_code_ftnptr (code); - ppc_load_reg (code, ppc_r0, G_STRUCT_OFFSET (MonoDelegate, method_ptr), ppc_r3); + ppc_ldptr (code, ppc_r0, G_STRUCT_OFFSET (MonoDelegate, method_ptr), ppc_r3); #ifdef PPC_USES_FUNCTION_DESCRIPTOR /* it's a function descriptor */ ppc_ldx (code, ppc_r0, 0, ppc_r0); #endif ppc_mtctr (code, ppc_r0); /* slide down the arguments */ - for (i = 0; i < sig->param_count; ++i) { + for (i = 0; i < param_count; ++i) { ppc_mr (code, (ppc_r3 + i), (ppc_r3 + i + 1)); } ppc_bcctr (code, PPC_BR_ALWAYS, 0); @@ -448,15 +423,88 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe g_assert ((code - start) <= size); mono_arch_flush_icache (start, size); + } + + if (code_len) + *code_len = code - start; + + return start; +} + +GSList* +mono_arch_get_delegate_invoke_impls (void) +{ + GSList *res = NULL; + guint8 *code; + guint32 code_len; + int i; + + code = get_delegate_invoke_impl (TRUE, 0, &code_len, TRUE); + res = g_slist_prepend (res, mono_aot_tramp_info_create (g_strdup ("delegate_invoke_impl_has_target"), code, code_len)); + + for (i = 0; i < MAX_ARCH_DELEGATE_PARAMS; ++i) { + code = get_delegate_invoke_impl (FALSE, i, &code_len, TRUE); + res = g_slist_prepend (res, mono_aot_tramp_info_create (g_strdup_printf ("delegate_invoke_impl_target_%d", i), code, code_len)); + } + + return res; +} + +gpointer +mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_target) +{ + guint8 *code, *start; + + /* FIXME: Support more cases */ + if (MONO_TYPE_ISSTRUCT (sig->ret)) + return NULL; + + if (has_target) { + static guint8* cached = NULL; + + if (cached) + return cached; + + if (mono_aot_only) + start = mono_aot_get_named_code ("delegate_invoke_impl_has_target"); + else + start = get_delegate_invoke_impl (TRUE, 0, NULL, FALSE); + + mono_memory_barrier (); + + cached = start; + } else { + static guint8* cache [MAX_ARCH_DELEGATE_PARAMS + 1] = {NULL}; + int i; + + if (sig->param_count > MAX_ARCH_DELEGATE_PARAMS) + return NULL; + for (i = 0; i < sig->param_count; ++i) + if (!mono_is_regsize_var (sig->params [i])) + return NULL; + + + code = cache [sig->param_count]; + if (code) + return code; + + if (mono_aot_only) { + char *name = g_strdup_printf ("delegate_invoke_impl_target_%d", sig->param_count); + start = mono_aot_get_named_code (name); + g_free (name); + } else { + start = get_delegate_invoke_impl (FALSE, sig->param_count, NULL, FALSE); + } + + mono_memory_barrier (); + cache [sig->param_count] = start; - mono_mini_arch_unlock (); - return start; } - return NULL; + return start; } gpointer -mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code) +mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code) { /* FIXME: handle returning a struct */ if (MONO_TYPE_ISSTRUCT (sig->ret)) @@ -606,6 +654,8 @@ typedef struct { void mono_arch_flush_icache (guint8 *code, gint size) { +#ifdef MONO_CROSS_COMPILE +#else register guint8 *p; guint8 *endp, *start; static int cachelinesize = 0; @@ -692,6 +742,7 @@ mono_arch_flush_icache (guint8 *code, gint size) asm ("sync"); asm ("isync"); #endif +#endif } void @@ -1002,7 +1053,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) case MONO_TYPE_U8: case MONO_TYPE_I8: cinfo->args [n].size = 8; - add_general (&gr, &stack_size, cinfo->args + n, sizeof (gpointer) == 8); + add_general (&gr, &stack_size, cinfo->args + n, SIZEOF_REGISTER == 8); n++; break; case MONO_TYPE_R4: @@ -1014,12 +1065,12 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) cinfo->args [n].reg = fr; fr ++; FP_ALSO_IN_REG (gr ++); - ALWAYS_ON_STACK (stack_size += sizeof (gpointer)); + ALWAYS_ON_STACK (stack_size += SIZEOF_REGISTER); } else { cinfo->args [n].offset = PPC_STACK_PARAM_OFFSET + stack_size + MONO_PPC_32_64_CASE (0, 4); cinfo->args [n].regtype = RegTypeBase; cinfo->args [n].reg = ppc_sp; /* in the caller*/ - stack_size += sizeof (gpointer); + stack_size += SIZEOF_REGISTER; } n++; break; @@ -1030,7 +1081,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke) cinfo->args [n].regtype = RegTypeFP; cinfo->args [n].reg = fr; fr ++; - FP_ALSO_IN_REG (gr += sizeof (double) / sizeof (gpointer)); + FP_ALSO_IN_REG (gr += sizeof (double) / SIZEOF_REGISTER); ALWAYS_ON_STACK (stack_size += 8); } else { cinfo->args [n].offset = PPC_STACK_PARAM_OFFSET + stack_size; @@ -1357,6 +1408,9 @@ emit_sig_cookie (MonoCompile *cfg, MonoCallInst *call, CallInfo *cinfo) { int sig_reg = mono_alloc_ireg (cfg); + /* FIXME: Add support for signature tokens to AOT */ + cfg->disable_aot = TRUE; + MONO_EMIT_NEW_ICONST (cfg, sig_reg, (gulong)call->signature); MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, ppc_r1, cinfo->sig_cookie.offset, sig_reg); @@ -1697,7 +1751,7 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea } break; case SAVE_ONE: - ppc_store_reg (code, ppc_r3, save_offset, cfg->frame_reg); + ppc_stptr (code, ppc_r3, save_offset, cfg->frame_reg); if (enable_arguments) { ppc_mr (code, ppc_r4, ppc_r3); } @@ -1734,7 +1788,7 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea ppc_lwz (code, ppc_r4, save_offset + 4, cfg->frame_reg); break; case SAVE_ONE: - ppc_load_reg (code, ppc_r3, save_offset, cfg->frame_reg); + ppc_ldptr (code, ppc_r3, save_offset, cfg->frame_reg); break; case SAVE_FP: ppc_lfd (code, ppc_f1, save_offset, cfg->frame_reg); @@ -2468,6 +2522,10 @@ loop_start: goto loop_start; /* make it handle the possibly big ins->inst_offset */ case OP_R8CONST: case OP_R4CONST: + if (cfg->compile_aot) { + /* Keep these in the aot case */ + break; + } NEW_INS (cfg, temp, OP_ICONST); temp->inst_c0 = (gulong)ins->inst_p0; temp->dreg = mono_alloc_ireg (cfg); @@ -2505,7 +2563,7 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size, if (ppc_is_imm16 (offset + sub_offset)) { ppc_stfd (code, ppc_f0, offset, cfg->frame_reg); if (size == 8) - ppc_load_reg (code, dreg, offset + sub_offset, cfg->frame_reg); + ppc_ldptr (code, dreg, offset + sub_offset, cfg->frame_reg); else ppc_lwz (code, dreg, offset + sub_offset, cfg->frame_reg); } else { @@ -2513,7 +2571,7 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size, ppc_add (code, dreg, dreg, cfg->frame_reg); ppc_stfd (code, ppc_f0, 0, dreg); if (size == 8) - ppc_load_reg (code, dreg, sub_offset, dreg); + ppc_ldptr (code, dreg, sub_offset, dreg); else ppc_lwz (code, dreg, sub_offset, dreg); } @@ -2788,6 +2846,12 @@ ppc_patch (guchar *code, const guchar *target) ppc_patch_full (code, target, FALSE); } +void +mono_ppc_patch (guchar *code, const guchar *target) +{ + ppc_patch (code, target); +} + static guint8* emit_move_return_value (MonoCompile *cfg, MonoInst *ins, guint8 *code) { @@ -2831,7 +2895,7 @@ emit_load_volatile_arguments (MonoCompile *cfg, guint8 *code) ArgInfo *ainfo = &cinfo->ret; inst = cfg->vret_addr; g_assert (ppc_is_imm16 (inst->inst_offset)); - ppc_load_reg (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); + ppc_ldptr (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); } for (i = 0; i < sig->param_count + sig->hasthis; ++i) { ArgInfo *ainfo = cinfo->args + i; @@ -2855,7 +2919,7 @@ emit_load_volatile_arguments (MonoCompile *cfg, guint8 *code) break; #endif default: - ppc_load_reg (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); + ppc_ldptr (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); break; } break; @@ -2883,8 +2947,8 @@ emit_load_volatile_arguments (MonoCompile *cfg, guint8 *code) #endif if (MONO_TYPE_IS_REFERENCE (type) || type->type == MONO_TYPE_I8) { - ppc_load_reg (code, ppc_r0, inst->inst_offset, inst->inst_basereg); - ppc_store_reg (code, ppc_r0, ainfo->offset, ainfo->reg); + ppc_ldptr (code, ppc_r0, inst->inst_offset, inst->inst_basereg); + ppc_stptr (code, ppc_r0, ainfo->offset, ainfo->reg); } else if (type->type == MONO_TYPE_I4) { ppc_lwz (code, ppc_r0, inst->inst_offset, inst->inst_basereg); ppc_stw (code, ppc_r0, ainfo->offset, ainfo->reg); @@ -2917,7 +2981,7 @@ emit_load_volatile_arguments (MonoCompile *cfg, guint8 *code) } else #endif for (j = 0; j < ainfo->size; ++j) { - ppc_load_reg (code, ainfo->reg + j, + ppc_ldptr (code, ainfo->reg + j, inst->inst_offset + j * sizeof (gpointer), inst->inst_basereg); /* FIXME: shift to the right */ @@ -2932,7 +2996,7 @@ emit_load_volatile_arguments (MonoCompile *cfg, guint8 *code) g_assert (ppc_is_imm16 (addr->inst_offset)); g_assert (!ainfo->offset); - ppc_load_reg (code, ainfo->reg, addr->inst_offset, addr->inst_basereg); + ppc_ldptr (code, ainfo->reg, addr->inst_offset, addr->inst_basereg); struct_index++; break; @@ -3011,12 +3075,12 @@ emit_reserve_param_area (MonoCompile *cfg, guint8 *code) if (!size) return code; - ppc_load_reg (code, ppc_r0, 0, ppc_sp); + ppc_ldptr (code, ppc_r0, 0, ppc_sp); if (ppc_is_imm16 (-size)) { - ppc_store_reg_update (code, ppc_r0, -size, ppc_sp); + ppc_stptr_update (code, ppc_r0, -size, ppc_sp); } else { ppc_load (code, ppc_r11, -size); - ppc_store_reg_update_indexed (code, ppc_r0, ppc_sp, ppc_r11); + ppc_stptr_update_indexed (code, ppc_r0, ppc_sp, ppc_r11); } return code; @@ -3033,12 +3097,12 @@ emit_unreserve_param_area (MonoCompile *cfg, guint8 *code) if (!size) return code; - ppc_load_reg (code, ppc_r0, 0, ppc_sp); + ppc_ldptr (code, ppc_r0, 0, ppc_sp); if (ppc_is_imm16 (size)) { - ppc_store_reg_update (code, ppc_r0, size, ppc_sp); + ppc_stptr_update (code, ppc_r0, size, ppc_sp); } else { ppc_load (code, ppc_r11, size); - ppc_store_reg_update_indexed (code, ppc_r0, ppc_sp, ppc_r11); + ppc_stptr_update_indexed (code, ppc_r0, ppc_sp, ppc_r11); } return code; @@ -3132,10 +3196,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_STORE_MEMBASE_REG: if (ppc_is_imm16 (ins->inst_offset)) { - ppc_store_reg (code, ins->sreg1, ins->inst_offset, ins->inst_destbasereg); + ppc_stptr (code, ins->sreg1, ins->inst_offset, ins->inst_destbasereg); } else { ppc_load (code, ppc_r0, ins->inst_offset); - ppc_store_reg_indexed (code, ins->sreg1, ins->inst_destbasereg, ppc_r0); + ppc_stptr_indexed (code, ins->sreg1, ins->inst_destbasereg, ppc_r0); } break; case OP_STOREI1_MEMINDEX: @@ -3145,17 +3209,17 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_sthx (code, ins->sreg1, ins->sreg2, ins->inst_destbasereg); break; case OP_STORE_MEMINDEX: - ppc_store_reg_indexed (code, ins->sreg1, ins->sreg2, ins->inst_destbasereg); + ppc_stptr_indexed (code, ins->sreg1, ins->sreg2, ins->inst_destbasereg); break; case OP_LOADU4_MEM: g_assert_not_reached (); break; case OP_LOAD_MEMBASE: if (ppc_is_imm16 (ins->inst_offset)) { - ppc_load_reg (code, ins->dreg, ins->inst_offset, ins->inst_basereg); + ppc_ldptr (code, ins->dreg, ins->inst_offset, ins->inst_basereg); } else { ppc_load (code, ppc_r0, ins->inst_offset); - ppc_load_reg_indexed (code, ins->dreg, ins->inst_basereg, ppc_r0); + ppc_ldptr_indexed (code, ins->dreg, ins->inst_basereg, ppc_r0); } break; case OP_LOADI4_MEMBASE: @@ -3204,7 +3268,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } break; case OP_LOAD_MEMINDEX: - ppc_load_reg_indexed (code, ins->dreg, ins->sreg2, ins->inst_basereg); + ppc_ldptr_indexed (code, ins->dreg, ins->sreg2, ins->inst_basereg); break; case OP_LOADI4_MEMINDEX: #ifdef __mono_ppc64__ @@ -3570,6 +3634,19 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) CASE_PPC64 (OP_I8CONST) ppc_load (code, ins->dreg, ins->inst_c0); break; + case OP_LOAD_GOTADDR: + /* The PLT implementation depends on this */ + g_assert (ins->dreg == ppc_r30); + + code = mono_arch_emit_load_got_addr (cfg->native_code, code, cfg, NULL); + break; + case OP_GOT_ENTRY: + // FIXME: Fix max instruction length + mono_add_patch_info (cfg, offset, (MonoJumpInfoType)ins->inst_right->inst_i1, ins->inst_right->inst_p0); + /* arch_emit_got_access () patches this */ + ppc_load32 (code, ppc_r0, 0); + ppc_ldptr_indexed (code, ins->dreg, ins->inst_basereg, ppc_r0); + break; case OP_AOTCONST: mono_add_patch_info (cfg, offset, (MonoJumpInfoType)ins->inst_i1, ins->inst_p0); ppc_load_sequence (code, ins->dreg, 0); @@ -3611,10 +3688,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (1 || cfg->flags & MONO_CFG_HAS_CALLS) { long ret_offset = cfg->stack_usage + PPC_RET_ADDR_OFFSET; if (ppc_is_imm16 (ret_offset)) { - ppc_load_reg (code, ppc_r0, ret_offset, cfg->frame_reg); + ppc_ldptr (code, ppc_r0, ret_offset, cfg->frame_reg); } else { ppc_load (code, ppc_r11, ret_offset); - ppc_load_reg_indexed (code, ppc_r0, cfg->frame_reg, ppc_r11); + ppc_ldptr_indexed (code, ppc_r0, cfg->frame_reg, ppc_r11); } ppc_mtlr (code, ppc_r0); } @@ -3638,7 +3715,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) for (i = 31; i >= 13; --i) { if (cfg->used_int_regs & (1 << i)) { pos += sizeof (gpointer); - ppc_load_reg (code, i, -pos, ppc_r11); + ppc_ldptr (code, i, -pos, ppc_r11); } } } else { @@ -3646,12 +3723,25 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } ppc_mr (code, ppc_sp, ppc_r11); mono_add_patch_info (cfg, (guint8*) code - cfg->native_code, MONO_PATCH_INFO_METHOD_JUMP, ins->inst_p0); - ppc_b (code, 0); + if (cfg->compile_aot) { + /* arch_emit_got_access () patches this */ + ppc_load32 (code, ppc_r0, 0); +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + ppc_ldptr_indexed (code, ppc_r11, ppc_r30, ppc_r0); + ppc_ldptr (code, ppc_r0, 0, ppc_r11); +#else + ppc_ldptr_indexed (code, ppc_r0, ppc_r30, ppc_r0); +#endif + ppc_mtctr (code, ppc_r0); + ppc_bcctr (code, PPC_BR_ALWAYS, 0); + } else { + ppc_b (code, 0); + } break; } case OP_CHECK_THIS: /* ensure ins->sreg1 is not NULL */ - ppc_load_reg (code, ppc_r0, 0, ins->sreg1); + ppc_ldptr (code, ppc_r0, 0, ins->sreg1); break; case OP_ARGLIST: { long cookie_offset = cfg->sig_cookie + cfg->stack_usage; @@ -3661,7 +3751,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_load (code, ppc_r0, cookie_offset); ppc_add (code, ppc_r0, cfg->frame_reg, ppc_r0); } - ppc_store_reg (code, ppc_r0, 0, ins->sreg1); + ppc_stptr (code, ppc_r0, 0, ins->sreg1); break; } case OP_FCALL: @@ -3675,7 +3765,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) mono_add_patch_info (cfg, offset, MONO_PATCH_INFO_METHOD, call->method); else mono_add_patch_info (cfg, offset, MONO_PATCH_INFO_ABS, call->fptr); - if (FORCE_INDIR_CALL || cfg->method->dynamic) { + if ((FORCE_INDIR_CALL || cfg->method->dynamic) && !cfg->compile_aot) { ppc_load_func (code, ppc_r0, 0); ppc_mtlr (code, ppc_r0); ppc_blrl (code); @@ -3692,10 +3782,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_VOIDCALL_REG: case OP_CALL_REG: #ifdef PPC_USES_FUNCTION_DESCRIPTOR - ppc_load_reg (code, ppc_r0, 0, ins->sreg1); + ppc_ldptr (code, ppc_r0, 0, ins->sreg1); /* FIXME: if we know that this is a method, we can omit this load */ - ppc_load_reg (code, ppc_r2, 8, ins->sreg1); + ppc_ldptr (code, ppc_r2, 8, ins->sreg1); ppc_mtlr (code, ppc_r0); #else ppc_mtlr (code, ins->sreg1); @@ -3710,7 +3800,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_VCALL2_MEMBASE: case OP_VOIDCALL_MEMBASE: case OP_CALL_MEMBASE: - ppc_load_reg (code, ppc_r0, ins->inst_offset, ins->sreg1); + ppc_ldptr (code, ppc_r0, ins->inst_offset, ins->sreg1); ppc_mtlr (code, ppc_r0); ppc_blrl (code); /* FIXME: this should be handled somewhere else in the new jit */ @@ -3736,9 +3826,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_shift_right_arith_imm (code, ppc_r0, ppc_r0, 2); ppc_mtctr (code, ppc_r0); } - ppc_load_reg (code, ppc_r0, 0, ppc_sp); + ppc_ldptr (code, ppc_r0, 0, ppc_sp); ppc_neg (code, ppc_r11, ppc_r11); - ppc_store_reg_update_indexed (code, ppc_r0, ppc_sp, ppc_r11); + ppc_stptr_update_indexed (code, ppc_r0, ppc_sp, ppc_r11); /* FIXME: make this loop work in 8 byte increments on PPC64 */ @@ -3763,7 +3853,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_mr (code, ppc_r3, ins->sreg1); mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_arch_throw_exception"); - if (FORCE_INDIR_CALL || cfg->method->dynamic) { + if ((FORCE_INDIR_CALL || cfg->method->dynamic) && !cfg->compile_aot) { ppc_load_func (code, ppc_r0, 0); ppc_mtlr (code, ppc_r0); ppc_blrl (code); @@ -3777,7 +3867,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ppc_mr (code, ppc_r3, ins->sreg1); mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_arch_rethrow_exception"); - if (FORCE_INDIR_CALL || cfg->method->dynamic) { + if ((FORCE_INDIR_CALL || cfg->method->dynamic) && !cfg->compile_aot) { ppc_load_func (code, ppc_r0, 0); ppc_mtlr (code, ppc_r0); ppc_blrl (code); @@ -3792,10 +3882,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) code = emit_reserve_param_area (cfg, code); ppc_mflr (code, ppc_r0); if (ppc_is_imm16 (spvar->inst_offset)) { - ppc_store_reg (code, ppc_r0, spvar->inst_offset, spvar->inst_basereg); + ppc_stptr (code, ppc_r0, spvar->inst_offset, spvar->inst_basereg); } else { ppc_load (code, ppc_r11, spvar->inst_offset); - ppc_store_reg_indexed (code, ppc_r0, ppc_r11, spvar->inst_basereg); + ppc_stptr_indexed (code, ppc_r0, ppc_r11, spvar->inst_basereg); } break; } @@ -3806,10 +3896,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) if (ins->sreg1 != ppc_r3) ppc_mr (code, ppc_r3, ins->sreg1); if (ppc_is_imm16 (spvar->inst_offset)) { - ppc_load_reg (code, ppc_r0, spvar->inst_offset, spvar->inst_basereg); + ppc_ldptr (code, ppc_r0, spvar->inst_offset, spvar->inst_basereg); } else { ppc_load (code, ppc_r11, spvar->inst_offset); - ppc_load_reg_indexed (code, ppc_r0, spvar->inst_basereg, ppc_r11); + ppc_ldptr_indexed (code, ppc_r0, spvar->inst_basereg, ppc_r11); } ppc_mtlr (code, ppc_r0); ppc_blr (code); @@ -3819,7 +3909,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) MonoInst *spvar = mono_find_spvar_for_region (cfg, bb->region); g_assert (spvar->inst_basereg != ppc_sp); code = emit_unreserve_param_area (cfg, code); - ppc_load_reg (code, ppc_r0, spvar->inst_offset, spvar->inst_basereg); + ppc_ldptr (code, ppc_r0, spvar->inst_offset, spvar->inst_basereg); ppc_mtlr (code, ppc_r0); ppc_blr (code); break; @@ -3910,8 +4000,19 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) /* floating point opcodes */ case OP_R8CONST: + g_assert (cfg->compile_aot); + + /* FIXME: Optimize this */ + ppc_bl (code, 1); + ppc_mflr (code, ppc_r11); + ppc_b (code, 3); + *(double*)code = *(double*)ins->inst_p0; + code += 8; + ppc_lfd (code, ins->dreg, 8, ppc_r11); + break; case OP_R4CONST: g_assert_not_reached (); + break; case OP_STORER8_MEMBASE_REG: if (ppc_is_imm16 (ins->inst_offset)) { ppc_stfd (code, ins->sreg1, ins->inst_offset, ins->inst_destbasereg); @@ -4147,7 +4248,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } else { tmp = ins->sreg1; } - ppc_store_reg (code, tmp, -8, ppc_r1); + ppc_stptr (code, tmp, -8, ppc_r1); ppc_lfd (code, ins->dreg, -8, ppc_r1); ppc_fcfid (code, ins->dreg, ins->dreg); if (ins->opcode == OP_ICONV_TO_R4 || ins->opcode == OP_LCONV_TO_R4) @@ -4287,6 +4388,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) void mono_arch_register_lowlevel_calls (void) { + /* The signature doesn't matter */ + mono_register_jit_icall (mono_ppc_throw_exception, "mono_ppc_throw_exception", mono_create_icall_signature ("void"), TRUE); } #ifdef __mono_ppc64__ @@ -4309,6 +4412,7 @@ void mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, guint8 *code, MonoJumpInfo *ji, gboolean run_cctors) { MonoJumpInfo *patch_info; + gboolean compile_aot = !run_cctors; for (patch_info = ji; patch_info; patch_info = patch_info->next) { unsigned char *ip = patch_info->ip.i + code; @@ -4317,6 +4421,17 @@ mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, guint8 *code, Mono target = mono_resolve_patch_target (method, domain, code, patch_info, run_cctors); + if (compile_aot) { + switch (patch_info->type) { + case MONO_PATCH_INFO_BB: + case MONO_PATCH_INFO_LABEL: + break; + default: + /* No need to patch these */ + continue; + } + } + switch (patch_info->type) { case MONO_PATCH_INFO_IP: patch_load_sequence (ip, ip); @@ -4385,22 +4500,24 @@ mono_arch_patch_code (MonoMethod *method, MonoDomain *domain, guint8 *code, Mono * the instruction offset immediate for all the registers. */ static guint8* -save_registers (guint8* code, int pos, int base_reg, gboolean save_lmf, guint32 used_int_regs) +save_registers (MonoCompile *cfg, guint8* code, int pos, int base_reg, gboolean save_lmf, guint32 used_int_regs, int cfa_offset) { int i; if (!save_lmf) { for (i = 13; i <= 31; i++) { if (used_int_regs & (1 << i)) { - ppc_store_reg (code, i, pos, base_reg); - pos += sizeof (gulong); + ppc_str (code, i, pos, base_reg); + mono_emit_unwind_op_offset (cfg, code, i, pos - cfa_offset); + pos += sizeof (mgreg_t); } } } else { /* pos is the start of the MonoLMF structure */ int offset = pos + G_STRUCT_OFFSET (MonoLMF, iregs); for (i = 13; i <= 31; i++) { - ppc_store_reg (code, i, offset, base_reg); - offset += sizeof (gulong); + ppc_str (code, i, offset, base_reg); + mono_emit_unwind_op_offset (cfg, code, i, offset - cfa_offset); + offset += sizeof (mgreg_t); } offset = pos + G_STRUCT_OFFSET (MonoLMF, fregs); for (i = 14; i < 32; i++) { @@ -4436,7 +4553,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) MonoBasicBlock *bb; MonoMethodSignature *sig; MonoInst *inst; - long alloc_size, pos, max_offset; + long alloc_size, pos, max_offset, cfa_offset; int i; guint8 *code; CallInfo *cinfo; @@ -4447,13 +4564,20 @@ mono_arch_emit_prolog (MonoCompile *cfg) if (mono_jit_trace_calls != NULL && mono_trace_eval (method)) tracing = 1; + /* We currently emit unwind info for aot, but don't use it */ + mono_emit_unwind_op_def_cfa (cfg, code, ppc_r1, 0); + sig = mono_method_signature (method); cfg->code_size = MONO_PPC_32_64_CASE (260, 384) + sig->param_count * 20; code = cfg->native_code = g_malloc (cfg->code_size); + cfa_offset = 0; + if (1 || cfg->flags & MONO_CFG_HAS_CALLS) { ppc_mflr (code, ppc_r0); - ppc_store_reg (code, ppc_r0, PPC_RET_ADDR_OFFSET, ppc_sp); + ppc_str (code, ppc_r0, PPC_RET_ADDR_OFFSET, ppc_sp); + + mono_emit_unwind_op_offset (cfg, code, ppc_lr, PPC_RET_ADDR_OFFSET); } alloc_size = cfg->stack_offset; @@ -4480,25 +4604,31 @@ mono_arch_emit_prolog (MonoCompile *cfg) g_assert ((alloc_size & (MONO_ARCH_FRAME_ALIGNMENT-1)) == 0); if (alloc_size) { if (ppc_is_imm16 (-alloc_size)) { - ppc_store_reg_update (code, ppc_sp, -alloc_size, ppc_sp); - code = save_registers (code, alloc_size - pos, ppc_sp, method->save_lmf, cfg->used_int_regs); + ppc_str_update (code, ppc_sp, -alloc_size, ppc_sp); + cfa_offset = alloc_size; + mono_emit_unwind_op_def_cfa_offset (cfg, code, alloc_size); + code = save_registers (cfg, code, alloc_size - pos, ppc_sp, method->save_lmf, cfg->used_int_regs, cfa_offset); } else { if (pos) ppc_addi (code, ppc_r11, ppc_sp, -pos); ppc_load (code, ppc_r0, -alloc_size); - ppc_store_reg_update_indexed (code, ppc_sp, ppc_sp, ppc_r0); - code = save_registers (code, 0, ppc_r11, method->save_lmf, cfg->used_int_regs); + ppc_str_update_indexed (code, ppc_sp, ppc_sp, ppc_r0); + cfa_offset = alloc_size; + mono_emit_unwind_op_def_cfa_offset (cfg, code, alloc_size); + code = save_registers (cfg, code, 0, ppc_r11, method->save_lmf, cfg->used_int_regs, cfa_offset); } } - if (cfg->frame_reg != ppc_sp) + if (cfg->frame_reg != ppc_sp) { ppc_mr (code, cfg->frame_reg, ppc_sp); + mono_emit_unwind_op_def_cfa_reg (cfg, code, cfg->frame_reg); + } /* store runtime generic context */ if (cfg->rgctx_var) { g_assert (cfg->rgctx_var->opcode == OP_REGOFFSET && (cfg->rgctx_var->inst_basereg == ppc_r1 || cfg->rgctx_var->inst_basereg == ppc_r31)); - ppc_store_reg (code, MONO_ARCH_RGCTX_REG, cfg->rgctx_var->inst_offset, cfg->rgctx_var->inst_basereg); + ppc_stptr (code, MONO_ARCH_RGCTX_REG, cfg->rgctx_var->inst_offset, cfg->rgctx_var->inst_basereg); } /* compute max_offset in order to use short forward jumps @@ -4529,10 +4659,10 @@ mono_arch_emit_prolog (MonoCompile *cfg) g_assert (inst); if (ppc_is_imm16 (inst->inst_offset)) { - ppc_store_reg (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); + ppc_stptr (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); } else { ppc_load (code, ppc_r11, inst->inst_offset); - ppc_store_reg_indexed (code, ainfo->reg, ppc_r11, inst->inst_basereg); + ppc_stptr_indexed (code, ainfo->reg, ppc_r11, inst->inst_basereg); } } @@ -4549,8 +4679,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) else if (ainfo->regtype == RegTypeFP) ppc_fmr (code, inst->dreg, ainfo->reg); else if (ainfo->regtype == RegTypeBase) { - ppc_load_reg (code, ppc_r11, 0, ppc_sp); - ppc_load_reg (code, inst->dreg, ainfo->offset, ppc_r11); + ppc_ldptr (code, ppc_r11, 0, ppc_sp); + ppc_ldptr (code, inst->dreg, ainfo->offset, ppc_r11); } else g_assert_not_reached (); @@ -4600,17 +4730,17 @@ mono_arch_emit_prolog (MonoCompile *cfg) #endif default: if (ppc_is_imm16 (inst->inst_offset)) { - ppc_store_reg (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); + ppc_stptr (code, ainfo->reg, inst->inst_offset, inst->inst_basereg); } else { ppc_load (code, ppc_r11, inst->inst_offset); - ppc_store_reg_indexed (code, ainfo->reg, ppc_r11, inst->inst_basereg); + ppc_stptr_indexed (code, ainfo->reg, ppc_r11, inst->inst_basereg); } break; } } else if (ainfo->regtype == RegTypeBase) { /* load the previous stack pointer in r11 */ - ppc_load_reg (code, ppc_r11, 0, ppc_sp); - ppc_load_reg (code, ppc_r0, ainfo->offset, ppc_r11); + ppc_ldptr (code, ppc_r11, 0, ppc_sp); + ppc_ldptr (code, ppc_r0, ainfo->offset, ppc_r11); switch (ainfo->size) { case 1: if (ppc_is_imm16 (inst->inst_offset)) { @@ -4651,10 +4781,10 @@ mono_arch_emit_prolog (MonoCompile *cfg) #endif default: if (ppc_is_imm16 (inst->inst_offset)) { - ppc_store_reg (code, ppc_r0, inst->inst_offset, inst->inst_basereg); + ppc_stptr (code, ppc_r0, inst->inst_offset, inst->inst_basereg); } else { ppc_load (code, ppc_r11, inst->inst_offset); - ppc_store_reg_indexed (code, ppc_r0, ppc_r11, inst->inst_basereg); + ppc_stptr_indexed (code, ppc_r0, ppc_r11, inst->inst_basereg); } break; } @@ -4697,11 +4827,11 @@ mono_arch_emit_prolog (MonoCompile *cfg) g_assert (cur_reg == 0); ppc_sldi (code, ppc_r0, ainfo->reg, (sizeof (gpointer) - ainfo->bytes) * 8); - ppc_store_reg (code, ppc_r0, doffset, inst->inst_basereg); + ppc_stptr (code, ppc_r0, doffset, inst->inst_basereg); } else #endif { - ppc_store_reg (code, ainfo->reg + cur_reg, doffset, + ppc_stptr (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); } } @@ -4713,7 +4843,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) if (ainfo->bytes) NOT_IMPLEMENTED; /* load the previous stack pointer in r11 (r0 gets overwritten by the memcpy) */ - ppc_load_reg (code, ppc_r11, 0, ppc_sp); + ppc_ldptr (code, ppc_r11, 0, ppc_sp); if ((size & MONO_PPC_32_64_CASE (3, 7)) != 0) { code = emit_memcpy (code, size - soffset, inst->inst_basereg, doffset, @@ -4728,8 +4858,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) /* if it was originally a RegTypeBase */ if (ainfo->offset) { /* load the previous stack pointer in r11 */ - ppc_load_reg (code, ppc_r11, 0, ppc_sp); - ppc_load_reg (code, ppc_r11, ainfo->offset, ppc_r11); + ppc_ldptr (code, ppc_r11, 0, ppc_sp); + ppc_ldptr (code, ppc_r11, ainfo->offset, ppc_r11); } else { ppc_mr (code, ppc_r11, ainfo->reg); } @@ -4738,7 +4868,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) MonoInst *addr = cfg->tailcall_valuetype_addrs [tailcall_struct_index]; g_assert (ppc_is_imm16 (addr->inst_offset)); - ppc_store_reg (code, ppc_r11, addr->inst_offset, addr->inst_basereg); + ppc_stptr (code, ppc_r11, addr->inst_offset, addr->inst_basereg); tailcall_struct_index++; } @@ -4755,7 +4885,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) if (method->wrapper_type == MONO_WRAPPER_NATIVE_TO_MANAGED) { ppc_load (code, ppc_r3, cfg->domain); mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_jit_thread_attach"); - if (FORCE_INDIR_CALL || cfg->method->dynamic) { + if ((FORCE_INDIR_CALL || cfg->method->dynamic) && !cfg->compile_aot) { ppc_load_func (code, ppc_r0, 0); ppc_mtlr (code, ppc_r0); ppc_blrl (code); @@ -4772,7 +4902,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) } else { mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, (gpointer)"mono_get_lmf_addr"); - if (FORCE_INDIR_CALL || cfg->method->dynamic) { + if ((FORCE_INDIR_CALL || cfg->method->dynamic) && !cfg->compile_aot) { ppc_load_func (code, ppc_r0, 0); ppc_mtlr (code, ppc_r0); ppc_blrl (code); @@ -4789,24 +4919,33 @@ mono_arch_emit_prolog (MonoCompile *cfg) */ ppc_addi (code, ppc_r11, ppc_sp, alloc_size - lmf_offset); /* ppc_r3 is the result from mono_get_lmf_addr () */ - ppc_store_reg (code, ppc_r3, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); + ppc_stptr (code, ppc_r3, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); /* new_lmf->previous_lmf = *lmf_addr */ - ppc_load_reg (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); - ppc_store_reg (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); + ppc_ldptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); + ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); /* *(lmf_addr) = r11 */ - ppc_store_reg (code, ppc_r11, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); + ppc_stptr (code, ppc_r11, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); /* save method info */ - ppc_load (code, ppc_r0, method); - ppc_store_reg (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, method), ppc_r11); - ppc_store_reg (code, ppc_sp, G_STRUCT_OFFSET(MonoLMF, ebp), ppc_r11); + if (cfg->compile_aot) + // FIXME: + ppc_load (code, ppc_r0, 0); + else + ppc_load (code, ppc_r0, method); + ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, method), ppc_r11); + ppc_stptr (code, ppc_sp, G_STRUCT_OFFSET(MonoLMF, ebp), ppc_r11); /* save the current IP */ - mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_IP, NULL); + if (cfg->compile_aot) { + ppc_bl (code, 1); + ppc_mflr (code, ppc_r0); + } else { + mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_IP, NULL); #ifdef __mono_ppc64__ - ppc_load_sequence (code, ppc_r0, (gulong)0x0101010101010101L); + ppc_load_sequence (code, ppc_r0, (gulong)0x0101010101010101L); #else - ppc_load_sequence (code, ppc_r0, (gulong)0x01010101L); + ppc_load_sequence (code, ppc_r0, (gulong)0x01010101L); #endif - ppc_store_reg (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, eip), ppc_r11); + } + ppc_stptr (code, ppc_r0, G_STRUCT_OFFSET(MonoLMF, eip), ppc_r11); } if (tracing) @@ -4860,11 +4999,11 @@ mono_arch_emit_epilog (MonoCompile *cfg) ppc_mr (code, ppc_r8, cfg->frame_reg); ppc_addi (code, ppc_r11, cfg->frame_reg, cfg->stack_usage - lmf_offset); /* r5 = previous_lmf */ - ppc_load_reg (code, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); + ppc_ldptr (code, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); /* r6 = lmf_addr */ - ppc_load_reg (code, ppc_r6, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); + ppc_ldptr (code, ppc_r6, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); /* *(lmf_addr) = previous_lmf */ - ppc_store_reg (code, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r6); + ppc_stptr (code, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r6); /* FIXME: speedup: there is no actual need to restore the registers if * we didn't actually change them (idea from Zoltan). */ @@ -4877,7 +5016,7 @@ mono_arch_emit_epilog (MonoCompile *cfg) g_assert (ppc_is_imm16 (cfg->stack_usage + PPC_RET_ADDR_OFFSET)); /* use the saved copy of the frame reg in r8 */ if (1 || cfg->flags & MONO_CFG_HAS_CALLS) { - ppc_load_reg (code, ppc_r0, cfg->stack_usage + PPC_RET_ADDR_OFFSET, ppc_r8); + ppc_ldptr (code, ppc_r0, cfg->stack_usage + PPC_RET_ADDR_OFFSET, ppc_r8); ppc_mtlr (code, ppc_r0); } ppc_addic (code, ppc_sp, ppc_r8, cfg->stack_usage); @@ -4885,10 +5024,10 @@ mono_arch_emit_epilog (MonoCompile *cfg) if (1 || cfg->flags & MONO_CFG_HAS_CALLS) { long return_offset = cfg->stack_usage + PPC_RET_ADDR_OFFSET; if (ppc_is_imm16 (return_offset)) { - ppc_load_reg (code, ppc_r0, return_offset, cfg->frame_reg); + ppc_ldptr (code, ppc_r0, return_offset, cfg->frame_reg); } else { ppc_load (code, ppc_r11, return_offset); - ppc_load_reg_indexed (code, ppc_r0, cfg->frame_reg, ppc_r11); + ppc_ldptr_indexed (code, ppc_r0, cfg->frame_reg, ppc_r11); } ppc_mtlr (code, ppc_r0); } @@ -4903,7 +5042,7 @@ mono_arch_emit_epilog (MonoCompile *cfg) /* note r31 (possibly the frame register) is restored last */ for (i = 13; i <= 31; i++) { if (cfg->used_int_regs & (1 << i)) { - ppc_load_reg (code, i, offset, cfg->frame_reg); + ppc_ldptr (code, i, offset, cfg->frame_reg); offset += sizeof (gulong); } } @@ -4918,7 +5057,7 @@ mono_arch_emit_epilog (MonoCompile *cfg) for (i = 31; i >= 13; --i) { if (cfg->used_int_regs & (1 << i)) { pos += sizeof (gulong); - ppc_load_reg (code, i, -pos, ppc_r11); + ppc_ldptr (code, i, -pos, ppc_r11); } } ppc_mr (code, ppc_sp, ppc_r11); @@ -5123,12 +5262,12 @@ setup_tls_access (void) } if (tls_mode == TLS_MODE_DETECT) { -#if defined(__linux__) && defined(_CS_GNU_LIBPTHREAD_VERSION) +#if defined(__APPLE__) && defined(__mono_ppc__) && !defined(__mono_ppc64__) + tls_mode = TLS_MODE_DARWIN_G4; +#elif defined(__linux__) && defined(_CS_GNU_LIBPTHREAD_VERSION) conf_size = confstr ( _CS_GNU_LIBPTHREAD_VERSION, confbuf, sizeof(confbuf)); if ((conf_size > 4) && (strncmp (confbuf, "NPTL", 4) == 0)) tls_mode = TLS_MODE_NPTL; - else - tls_mode = TLS_MODE_LTHREADS; #else ins = (guint32*)pthread_getspecific; /* uncond branch to the real method */ @@ -5203,6 +5342,10 @@ setup_tls_access (void) } #endif } + if (tls_mode == TLS_MODE_DETECT) + tls_mode = TLS_MODE_FAILED; + if (tls_mode == TLS_MODE_FAILED) + return; if ((monodomain_key == -1) && (tls_mode == TLS_MODE_NPTL)) { monodomain_key = mono_domain_get_tls_offset(); } @@ -5330,8 +5473,8 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI * FIXME: Get rid of this by making sure that r11 is * not used as the vtable register in interface calls. */ - ppc_store_reg (code, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_sp); - ppc_load (code, ppc_r11, (gulong)(& (vtable->vtable [0]))); + ppc_stptr (code, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_sp); + ppc_load (code, ppc_r11, (gsize)(& (vtable->vtable [0]))); } for (i = 0; i < count; ++i) { MonoIMTCheckItem *item = imt_entries [i]; @@ -5339,7 +5482,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI if (item->is_equals) { if (item->check_target_idx) { if (!item->compare_done) { - ppc_load (code, ppc_r0, (gulong)item->key); + ppc_load (code, ppc_r0, (gsize)item->key); ppc_compare_log (code, 0, MONO_ARCH_IMT_REG, ppc_r0); } item->jmp_code = code; @@ -5347,8 +5490,8 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI if (item->has_target_code) { ppc_load (code, ppc_r0, item->value.target_code); } else { - ppc_load_reg (code, ppc_r0, (sizeof (gpointer) * item->value.vtable_slot), ppc_r11); - ppc_load_reg (code, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_sp); + ppc_ldptr (code, ppc_r0, (sizeof (gpointer) * item->value.vtable_slot), ppc_r11); + ppc_ldptr (code, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_sp); } ppc_mtctr (code, ppc_r0); ppc_bcctr (code, PPC_BR_ALWAYS, 0); @@ -5363,7 +5506,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI } else { g_assert (vtable); ppc_load (code, ppc_r0, & (vtable->vtable [item->value.vtable_slot])); - ppc_load_reg_indexed (code, ppc_r0, 0, ppc_r0); + ppc_ldptr_indexed (code, ppc_r0, 0, ppc_r0); } ppc_mtctr (code, ppc_r0); ppc_bcctr (code, PPC_BR_ALWAYS, 0); @@ -5380,8 +5523,8 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI item->jmp_code = code; ppc_bc (code, PPC_BR_FALSE, PPC_BR_EQ, 0); #endif - ppc_load_reg (code, ppc_r0, (sizeof (gpointer) * item->value.vtable_slot), ppc_r11); - ppc_load_reg (code, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_sp); + ppc_ldptr (code, ppc_r0, (sizeof (gpointer) * item->value.vtable_slot), ppc_r11); + ppc_ldptr (code, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_sp); ppc_mtctr (code, ppc_r0); ppc_bcctr (code, PPC_BR_ALWAYS, 0); #if ENABLE_WRONG_METHOD_CHECK @@ -5416,20 +5559,20 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI } MonoMethod* -mono_arch_find_imt_method (gpointer *regs, guint8 *code) +mono_arch_find_imt_method (mgreg_t *regs, guint8 *code) { return (MonoMethod*) regs [MONO_ARCH_IMT_REG]; } MonoObject* -mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) +mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) { - return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), (gssize*)regs, NULL); + return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL); } #endif MonoVTable* -mono_arch_find_static_call_vtable (gpointer *regs, guint8 *code) +mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code) { return (MonoVTable*) regs [MONO_ARCH_RGCTX_REG]; } @@ -5484,3 +5627,59 @@ mono_arch_context_get_int_reg (MonoContext *ctx, int reg) return (gpointer)ctx->regs [reg - ppc_r13]; } + +guint32 +mono_arch_get_patch_offset (guint8 *code) +{ + return 0; +} + +/* + * mono_aot_emit_load_got_addr: + * + * Emit code to load the got address. + * On PPC, the result is placed into r30. + */ +guint8* +mono_arch_emit_load_got_addr (guint8 *start, guint8 *code, MonoCompile *cfg, MonoJumpInfo **ji) +{ + ppc_bl (code, 1); + ppc_mflr (code, ppc_r30); + if (cfg) + mono_add_patch_info (cfg, code - start, MONO_PATCH_INFO_GOT_OFFSET, NULL); + else + *ji = mono_patch_info_list_prepend (*ji, code - start, MONO_PATCH_INFO_GOT_OFFSET, NULL); + /* arch_emit_got_address () patches this */ +#if defined(TARGET_POWERPC64) + ppc_nop (code); + ppc_nop (code); + ppc_nop (code); + ppc_nop (code); +#else + ppc_load32 (code, ppc_r0, 0); + ppc_add (code, ppc_r30, ppc_r30, ppc_r0); +#endif + + return code; +} + +/* + * mono_ppc_emit_load_aotconst: + * + * Emit code to load the contents of the GOT slot identified by TRAMP_TYPE and + * TARGET from the mscorlib GOT in full-aot code. + * On PPC, the GOT address is assumed to be in r30, and the result is placed into + * r11. + */ +guint8* +mono_arch_emit_load_aotconst (guint8 *start, guint8 *code, MonoJumpInfo **ji, int tramp_type, gconstpointer target) +{ + /* Load the mscorlib got address */ + ppc_ldptr (code, ppc_r11, sizeof (gpointer), ppc_r30); + *ji = mono_patch_info_list_prepend (*ji, code - start, tramp_type, target); + /* arch_emit_got_access () patches this */ + ppc_load32 (code, ppc_r0, 0); + ppc_ldptr_indexed (code, ppc_r11, ppc_r11, ppc_r0); + + return code; +} diff --git a/mono/mini/mini-ppc.h b/mono/mini/mini-ppc.h index 19bc05b2f81..fb35e2a60f8 100644 --- a/mono/mini/mini-ppc.h +++ b/mono/mini/mini-ppc.h @@ -52,14 +52,26 @@ typedef struct MonoCompileArch { int fp_conv_var_offset; } MonoCompileArch; +/* + * ILP32 uses a version of the ppc64 abi with sizeof(void*)==sizeof(long)==4. + * To support this, code which needs the size of a pointer needs to use + * sizeof (gpointer), while code which needs the size of a register/stack slot + * needs to use SIZEOF_REGISTER. + */ + #ifdef __mono_ppc64__ #define MONO_ARCH_NO_EMULATE_LONG_SHIFT_OPS #define MONO_ARCH_NO_EMULATE_LONG_MUL_OPTS #define MONO_ARCH_HAVE_ATOMIC_ADD 1 #define PPC_USES_FUNCTION_DESCRIPTOR + +#ifndef __mono_ilp32__ #define MONO_ARCH_HAVE_TLS_GET 1 #define MONO_ARCH_ENABLE_MONITOR_IL_FASTPATH 1 +#endif + #else /* must be __mono_ppc__ */ + #if 0 /* enabling this for PPC32 causes hangs in the thread/delegate tests. So disable for now. */ @@ -167,10 +179,13 @@ typedef struct MonoCompileArch { #define MONO_ARCH_HAVE_THROW_CORLIB_EXCEPTION 1 #define MONO_ARCH_HAVE_STATIC_RGCTX_TRAMPOLINE 1 +#define MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES 1 #define MONO_ARCH_GSHARED_SUPPORTED 1 #define MONO_ARCH_NEED_DIV_CHECK 1 +#define MONO_ARCH_AOT_SUPPORTED 1 +#define MONO_ARCH_NEED_GOT_VAR 1 #define PPC_NUM_REG_ARGS (PPC_LAST_ARG_REG-PPC_FIRST_ARG_REG+1) #define PPC_NUM_REG_FPARGS (PPC_LAST_FPARG_REG-PPC_FIRST_FPARG_REG+1) @@ -184,7 +199,17 @@ typedef struct MonoCompileArch { #define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->regs [ppc_r31-13])) #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->sc_sp)) -#ifdef __APPLE__ +#ifdef MONO_CROSS_COMPILE + +typedef struct { + unsigned long sp; + unsigned long unused1; + unsigned long lr; +} MonoPPCStackFrame; + +#define MONO_INIT_CONTEXT_FROM_FUNC(ctx,start_func) g_assert_not_reached () + +#elif defined(__APPLE__) typedef struct { unsigned long sp; @@ -294,6 +319,12 @@ extern guint8* mono_ppc_create_pre_code_ftnptr (guint8 *code) MONO_INTERNAL; #include "mini-ppc-os.h" #endif +void +mono_ppc_patch (guchar *code, const guchar *target) MONO_INTERNAL; + +void +mono_ppc_throw_exception (MonoObject *exc, unsigned long eip, unsigned long esp, gulong *int_regs, gdouble *fp_regs, gboolean rethrow) MONO_INTERNAL; + #ifdef __mono_ppc64__ #define MONO_PPC_32_64_CASE(c32,c64) c64 extern void mono_ppc_emitted (guint8 *code, ssize_t length, const char *format, ...); @@ -301,6 +332,8 @@ extern void mono_ppc_emitted (guint8 *code, ssize_t length, const char *format, #define MONO_PPC_32_64_CASE(c32,c64) c32 #endif -extern gboolean mono_ppc_is_direct_call_sequence (guint32 *code); +gboolean mono_ppc_is_direct_call_sequence (guint32 *code) MONO_INTERNAL; + +void mono_ppc_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) MONO_INTERNAL; #endif /* __MONO_MINI_PPC_H__ */ diff --git a/mono/mini/mini-s390.c b/mono/mini/mini-s390.c index 19d0f7ef981..d36cded9fed 100644 --- a/mono/mini/mini-s390.c +++ b/mono/mini/mini-s390.c @@ -4978,7 +4978,7 @@ mono_arch_free_jit_tls_data (MonoJitTlsData *tls) /*------------------------------------------------------------------*/ /* */ -/* Name - mono_arch_emit_inst_for_method */ +/* Name - mono_arch_emit_inst_for_method */ /* */ /*------------------------------------------------------------------*/ @@ -4990,6 +4990,12 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_decompose_opts */ +/* */ +/*------------------------------------------------------------------*/ + void mono_arch_decompose_opts (MonoCompile *cfg, MonoInst *ins) { @@ -5015,7 +5021,7 @@ mono_arch_decompose_opts (MonoCompile *cfg, MonoInst *ins) /*------------------------------------------------------------------*/ /* */ -/* Name - mono_arch_decompose_long_opts */ +/* Name - mono_arch_decompose_long_opts */ /* */ /*------------------------------------------------------------------*/ @@ -5283,6 +5289,16 @@ mono_arch_get_patch_offset (guint8 *code) /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_context_get_int_reg. */ +/* */ +/* Function - Dummy entry point until s390x supports aot. */ +/* */ +/* Returns - Pointer to intreg. */ +/* */ +/*------------------------------------------------------------------*/ + gpointer mono_arch_context_get_int_reg (MonoContext *ctx, int reg) { @@ -5290,3 +5306,5 @@ mono_arch_context_get_int_reg (MonoContext *ctx, int reg) g_assert_not_reached (); return NULL; } + +/*========================= End of Function ========================*/ diff --git a/mono/mini/mini-s390x.c b/mono/mini/mini-s390x.c index e7a03079955..623602445f6 100644 --- a/mono/mini/mini-s390x.c +++ b/mono/mini/mini-s390x.c @@ -474,7 +474,7 @@ mono_arch_get_argument_info (MonoMethodSignature *csig, for (k = 0; k < param_count; k++) { if (csig->pinvoke) - size = mono_type_native_stack_size (csig->params [k], &align); + size = mono_type_native_stack_size (csig->params [k], (guint32 *) &align); else size = mini_type_stack_size (NULL, csig->params [k], &align); @@ -993,8 +993,7 @@ handle_enum: type = mono_class_enum_basetype (type->data.klass); goto handle_enum; } else { - guint8 *p = va_arg (ap, gpointer); - int j, size, align; + int size, align; info = mono_marshal_load_type_info (type->data.klass); @@ -1016,17 +1015,30 @@ handle_enum: size = mono_type_size (type, &align); switch (size) { - case 1: - case 2: - case 4: - case 8: - printf ("["); - for (j = 0; p && j < size; j++) - printf ("%02x,", p [j]); - printf ("]\n"); - break; - default: - printf ("[VALUETYPE]\n"); + case 1: { + guint32 p = va_arg (ap, guint32); + printf ("[%02x]\n",p); + break; + } + case 2: { + guint32 p = va_arg (ap, guint32); + printf ("[%04x]\n",p); + break; + } + case 4: { + guint32 p = va_arg (ap, guint32); + printf ("[%08x]\n",p); + break; + } + case 8: { + guint64 p = va_arg (ap, guint64); + printf ("[%016lx]\n",p); + break; + } + default: { + gpointer p = va_arg (ap, gpointer); + printf ("[VALUETYPE] %p\n",p); + } } } break; @@ -1743,7 +1755,7 @@ mono_arch_allocate_vars (MonoCompile *cfg) MonoMethodHeader *header; MonoInst *inst; CallInfo *cinfo; - int iParm, iVar, offset, size, align, curinst; + int iParm, iVar, offset, align, size, curinst; int frame_reg = STK_BASE; int sArg, eArg; @@ -1928,7 +1940,8 @@ mono_arch_allocate_vars (MonoCompile *cfg) /* call functions returning structure */ /*--------------------------------------------------*/ if (inst->backend.is_pinvoke && MONO_TYPE_ISSTRUCT (inst->inst_vtype)) - size = mono_class_native_size (mono_class_from_mono_type(inst->inst_vtype), &align); + size = mono_class_native_size (mono_class_from_mono_type(inst->inst_vtype), + (guint32 *) &align); else size = mono_type_size (inst->inst_vtype, &align); @@ -2089,9 +2102,9 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call) } for (i = 0; i < n; ++i) { - ainfo = cinfo->args + i; MonoType *t; + ainfo = cinfo->args + i; if (i >= sig->hasthis) t = sig->params [i - sig->hasthis]; else @@ -2582,7 +2595,7 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size, { /* sreg is a float, dreg is an integer reg. */ if (is_signed) { - s390_cfdbr (code, dreg, 5, sreg); + s390_cgdbr (code, dreg, 5, sreg); switch (size) { case 1: s390_lghi (code, s390_r0, 0); @@ -2625,7 +2638,17 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size, /*========================= End of Function ========================*/ -static gboolean is_unsigned (MonoInst *next) +/*------------------------------------------------------------------*/ +/* */ +/* Name - gboolean_is_unsigned. */ +/* */ +/* Function - Return TRUE if next opcode is checking for un- */ +/* signed value. */ +/* */ +/*------------------------------------------------------------------*/ + +static +gboolean is_unsigned (MonoInst *next) { if ((next) && (((next->opcode >= OP_IBNE_UN) && @@ -2647,6 +2670,8 @@ static gboolean is_unsigned (MonoInst *next) return FALSE; } +/*========================= End of Function ========================*/ + /*------------------------------------------------------------------*/ /* */ /* Name - mono_arch_output_basic_block */ @@ -2798,89 +2823,90 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } break; case OP_LCONV_TO_I1: { - s390_lghi (code, s390_r0, 0x80); - if (ins->dreg != ins->sreg1) { - s390_lgr (code, ins->dreg, ins->sreg1); - } - s390_ngr (code, s390_r0, ins->sreg1); - s390_jz (code, 9); - s390_lghi (code, s390_r13, -1); - s390_sllg (code, s390_r13, s390_r13, 0, 8); - s390_ogr (code, ins->dreg, s390_r13); +#if 0 + s390_lgbr (code, ins->dreg, ins->sreg1); +#else + s390_sllg (code, ins->dreg, ins->sreg1, 0, 56); + s390_srag (code, ins->dreg, ins->dreg, 0, 56); +#endif } break; case OP_LCONV_TO_I2: { - s390_lghi (code, s390_r0, 0x80); - s390_sllg (code, s390_r0, s390_r0, 0, 8); - if (ins->dreg != ins->sreg1) { - s390_lgr (code, ins->dreg, ins->sreg1); - } - s390_ngr (code, s390_r0, ins->sreg1); - s390_jz (code, 9); - s390_lghi (code, s390_r13, -1); - s390_sllg (code, s390_r13, s390_r13, 0, 16); - s390_ogr (code, ins->dreg, s390_r13); +#if 0 + s390_lghr (code, ins->dreg, ins->sreg1); +#else + s390_sllg (code, ins->dreg, ins->sreg1, 0, 48); + s390_srag (code, ins->dreg, ins->dreg, 0, 48); +#endif } break; case OP_LCONV_TO_U1: { - s390_lghi (code, s390_r0, 0xff); - if (ins->dreg != ins->sreg1) { +#if 0 + s390_llghr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) s390_lgr (code, ins->dreg, ins->sreg1); - } - s390_ngr (code, ins->dreg, s390_r0); + s390_lghi (code, s390_r0, 0xff); + s390_ngr (code, ins->dreg, s390_r0); +#endif } break; case OP_LCONV_TO_U2: { - s390_lghi (code, s390_r0, -1); - s390_sllg (code, s390_r0, s390_r0, 0, 48); - s390_srlg (code, s390_r0, s390_r0, 0, 48); - if (ins->dreg != ins->sreg1) { +#if 0 + s390_llghr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) s390_lgr (code, ins->dreg, ins->sreg1); - } - s390_ngr (code, ins->dreg, s390_r0); + s390_lghi (code, s390_r0, -1); + s390_srlg (code, s390_r0, s390_r0, 0, 48); + s390_ngr (code, ins->dreg, s390_r0); +#endif } break; case OP_ICONV_TO_I1: { - s390_lhi (code, s390_r0, 0x80); - if (ins->dreg != ins->sreg1) { - s390_lr (code, ins->dreg, ins->sreg1); - } - s390_nr (code, s390_r0, ins->sreg1); - s390_jz (code, 7); - s390_lhi (code, s390_r13, -1); - s390_sll (code, s390_r13, 0, 8); - s390_or (code, ins->dreg, s390_r13); +#if 0 + s390_lbr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) + s390_lr (code, ins->dreg, ins->sreg1); + s390_sll (code, ins->dreg, 0, 24); + s390_sra (code, ins->dreg, 0, 24); + +#endif } break; case OP_ICONV_TO_I2: { - s390_lhi (code, s390_r0, 0x80); - s390_sll (code, s390_r0, 0, 8); - if (ins->dreg != ins->sreg1) { - s390_lr (code, ins->dreg, ins->sreg1); - } - s390_nr (code, s390_r0, ins->sreg1); - s390_jz (code, 7); - s390_lhi (code, s390_r13, -1); - s390_sll (code, s390_r13, 0, 16); - s390_or (code, ins->dreg, s390_r13); +#if 0 + s390_lhr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) + s390_lr (code, ins->dreg, ins->sreg1); + s390_sll (code, ins->dreg, 0, 16); + s390_sra (code, ins->dreg, 0, 16); +#endif } break; case OP_ICONV_TO_U1: { +#if 0 + s390_llcr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) + s390_lr (code, ins->dreg, ins->sreg1); s390_lhi (code, s390_r0, 0xff); - if (ins->dreg != ins->sreg1) { - s390_lr (code, ins->dreg, ins->sreg1); - } - s390_nr (code, ins->dreg, s390_r0); + s390_nr (code, ins->dreg, s390_r0); +#endif } break; case OP_ICONV_TO_U2: { +#if 0 + s390_llhr (code, ins->dreg, ins->sreg1); +#else + if (ins->dreg != ins->sreg1) + s390_lr (code, ins->dreg, ins->sreg1); s390_lhi (code, s390_r0, -1); - s390_sll (code, s390_r0, 0, 16); s390_srl (code, s390_r0, 0, 16); - if (ins->dreg != ins->sreg1) { - s390_lr (code, ins->dreg, ins->sreg1); - } - s390_nr (code, ins->dreg, s390_r0); + s390_nr (code, ins->dreg, s390_r0); +#endif } break; case OP_COMPARE: @@ -5196,6 +5222,14 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_decompose_opts */ +/* */ +/* Function - Decompose opcode into a System z opcode. */ +/* */ +/*------------------------------------------------------------------*/ + void mono_arch_decompose_opts (MonoCompile *cfg, MonoInst *ins) { @@ -5440,6 +5474,16 @@ mono_arch_get_patch_offset (guint8 *code) /*========================= End of Function ========================*/ +/*------------------------------------------------------------------*/ +/* */ +/* Name - mono_arch_context_get_int_reg. */ +/* */ +/* Function - */ +/* */ +/* Returns - Offset for patch. */ +/* */ +/*------------------------------------------------------------------*/ + gpointer mono_arch_context_get_int_reg (MonoContext *ctx, int reg) { @@ -5447,3 +5491,5 @@ mono_arch_context_get_int_reg (MonoContext *ctx, int reg) g_assert_not_reached (); return NULL; } + +/*========================= End of Function ========================*/ diff --git a/mono/mini/mini-sparc.c b/mono/mini/mini-sparc.c index e00d95736f5..687878c52fd 100644 --- a/mono/mini/mini-sparc.c +++ b/mono/mini/mini-sparc.c @@ -2248,7 +2248,7 @@ mono_sparc_is_virtual_call (guint32 *code) * Determine the vtable slot used by a virtual call. */ gpointer -mono_arch_get_vcall_slot (guint8 *code8, gpointer *regs, int *displacement) +mono_arch_get_vcall_slot (guint8 *code8, mgreg_t *regs, int *displacement) { guint32 *code = (guint32*)(gpointer)code8; guint32 ins = code [0]; @@ -2416,7 +2416,7 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI } MonoMethod* -mono_arch_find_imt_method (gpointer *regs, guint8 *code) +mono_arch_find_imt_method (mgreg_t *regs, guint8 *code) { #ifdef SPARCV9 g_assert_not_reached (); @@ -2426,7 +2426,7 @@ mono_arch_find_imt_method (gpointer *regs, guint8 *code) } MonoObject* -mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) +mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) { mono_sparc_flushw (); diff --git a/mono/mini/mini-sparc.h b/mono/mini/mini-sparc.h index 89aa41f5c8e..6d1c171bf0c 100644 --- a/mono/mini/mini-sparc.h +++ b/mono/mini/mini-sparc.h @@ -176,7 +176,7 @@ static void * __builtin_frame_address(int depth) gboolean mono_sparc_is_virtual_call (guint32 *code); -gpointer* mono_sparc_get_vcall_slot_addr (guint32 *code, gpointer *regs); +gpointer* mono_sparc_get_vcall_slot_addr (guint32 *code, mgreg_t *regs); void mono_sparc_flushw (void); diff --git a/mono/mini/mini-trampolines.c b/mono/mini/mini-trampolines.c index 902eb2688f4..a7b102f50b3 100644 --- a/mono/mini/mini-trampolines.c +++ b/mono/mini/mini-trampolines.c @@ -30,12 +30,20 @@ static GHashTable *rgctx_lazy_fetch_trampoline_hash_addr = NULL; static CRITICAL_SECTION trampolines_mutex; static gpointer -get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr) +get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr, gboolean need_rgctx_tramp) { - if (mono_aot_only) - return mono_aot_get_unbox_trampoline (m); - else + if (mono_aot_only) { + if (need_rgctx_tramp) + /* + * The unbox trampolines call the method directly, so need to add + * an rgctx tramp before them. + */ + return mono_create_static_rgctx_trampoline (m, mono_aot_get_unbox_trampoline (m)); + else + return mono_aot_get_unbox_trampoline (m); + } else { return mono_arch_get_unbox_trampoline (gsctx, m, addr); + } } #ifdef MONO_ARCH_HAVE_STATIC_RGCTX_TRAMPOLINE @@ -98,7 +106,7 @@ mono_create_static_rgctx_trampoline (MonoMethod *m, gpointer addr) #endif gpointer* -mono_get_vcall_slot_addr (guint8* code, gpointer *regs) +mono_get_vcall_slot_addr (guint8* code, mgreg_t *regs) { gpointer vt; int displacement; @@ -111,7 +119,7 @@ mono_get_vcall_slot_addr (guint8* code, gpointer *regs) #ifdef MONO_ARCH_HAVE_IMT static gpointer* -mono_convert_imt_slot_to_vtable_slot (gpointer* slot, gpointer *regs, guint8 *code, MonoMethod *method, MonoMethod **impl_method, gboolean *need_rgctx_tramp) +mono_convert_imt_slot_to_vtable_slot (gpointer* slot, mgreg_t *regs, guint8 *code, MonoMethod *method, MonoMethod **impl_method, gboolean *need_rgctx_tramp) { MonoGenericSharingContext *gsctx = mono_get_generic_context_from_code (code); MonoObject *this_argument = mono_arch_find_this_argument (regs, method, gsctx); @@ -192,7 +200,7 @@ mono_convert_imt_slot_to_vtable_slot (gpointer* slot, gpointer *regs, guint8 *co * This trampoline handles calls from JITted code. */ gpointer -mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) +mono_magic_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tramp) { gpointer addr; gpointer *vtable_slot; @@ -205,7 +213,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) if (m == MONO_FAKE_VTABLE_METHOD) { int displacement; - MonoVTable *vt = mono_arch_get_vcall_slot (code, (gpointer*)regs, &displacement); + MonoVTable *vt = mono_arch_get_vcall_slot (code, regs, &displacement); if (!vt) { int i; MonoJitInfo *ji; @@ -226,8 +234,10 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) /* Avoid loading metadata or creating a generic vtable if possible */ addr = mono_aot_get_method_from_vt_slot (mono_domain_get (), vt, displacement); + if (addr) + addr = mono_create_ftnptr (mono_domain_get (), addr); if (addr && !vt->klass->valuetype) { - vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs); + vtable_slot = mono_get_vcall_slot_addr (code, regs); if (mono_aot_is_got_entry (code, (guint8*)vtable_slot) || mono_domain_owns_vtable_slot (mono_domain_get (), vtable_slot)) { *vtable_slot = mono_get_addr_from_ftnptr (addr); } @@ -257,19 +267,19 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) /* we get the interface method because mono_convert_imt_slot_to_vtable_slot () * needs the signature to be able to find the this argument */ - m = mono_arch_find_imt_method ((gpointer*)regs, code); - vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs); + m = mono_arch_find_imt_method (regs, code); + vtable_slot = mono_get_vcall_slot_addr (code, regs); g_assert (vtable_slot); gsctx = mono_get_generic_context_from_code (code); - this_arg = mono_arch_find_this_argument ((gpointer*)regs, m, gsctx); + this_arg = mono_arch_find_this_argument (regs, m, gsctx); if (this_arg->vtable->klass == mono_defaults.transparent_proxy_class) { /* Use the slow path for now */ proxy = TRUE; m = mono_object_get_virtual_method (this_arg, m); } else { - vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, (gpointer*)regs, code, m, &impl_method, &need_rgctx_tramp); + vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, regs, code, m, &impl_method, &need_rgctx_tramp); /* mono_convert_imt_slot_to_vtable_slot () also gives us the method that is supposed * to be called, so we compile it and go ahead as usual. */ @@ -301,7 +311,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) g_assert (!m->klass->generic_container); #ifdef MONO_ARCH_HAVE_IMT - generic_virtual = mono_arch_find_imt_method ((gpointer*)regs, code); + generic_virtual = mono_arch_find_imt_method (regs, code); #endif if (generic_virtual) { g_assert (generic_virtual->is_inflated); @@ -324,7 +334,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) if (m->is_inflated && mono_method_get_context (m)->method_inst) { #ifdef MONO_ARCH_RGCTX_REG - MonoMethodRuntimeGenericContext *mrgctx = (MonoMethodRuntimeGenericContext*)mono_arch_find_static_call_vtable ((gpointer*)regs, code); + MonoMethodRuntimeGenericContext *mrgctx = (MonoMethodRuntimeGenericContext*)mono_arch_find_static_call_vtable (regs, code); klass = mrgctx->class_vtable->klass; method_inst = mrgctx->method_inst; @@ -333,7 +343,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) #endif } else if ((m->flags & METHOD_ATTRIBUTE_STATIC) || m->klass->valuetype) { #ifdef MONO_ARCH_RGCTX_REG - MonoVTable *vtable = mono_arch_find_static_call_vtable ((gpointer*)regs, code); + MonoVTable *vtable = mono_arch_find_static_call_vtable (regs, code); klass = vtable->klass; #else @@ -341,11 +351,11 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) #endif } else { #ifdef MONO_ARCH_HAVE_IMT - MonoObject *this_argument = mono_arch_find_this_argument ((gpointer*)regs, m, + MonoObject *this_argument = mono_arch_find_this_argument (regs, m, mono_get_generic_context_from_code (code)); vt = this_argument->vtable; - vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs); + vtable_slot = mono_get_vcall_slot_addr (code, regs); g_assert (this_argument->vtable->klass->inited); //mono_class_init (this_argument->vtable->klass); @@ -426,13 +436,13 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) if (generic_virtual) { int displacement; - MonoVTable *vt = mono_arch_get_vcall_slot (code, (gpointer*)regs, &displacement); + MonoVTable *vt = mono_arch_get_vcall_slot (code, regs, &displacement); - vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs); + vtable_slot = mono_get_vcall_slot_addr (code, regs); g_assert (vtable_slot); if (vt->klass->valuetype) - addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr); + addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr, need_rgctx_tramp); mono_method_add_generic_virtual_invocation (mono_domain_get (), vt, vtable_slot, @@ -469,16 +479,16 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) return addr; } - vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs); + vtable_slot = mono_get_vcall_slot_addr (code, regs); if (vtable_slot) { if (m->klass->valuetype) - addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr); + addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr, need_rgctx_tramp); g_assert (*vtable_slot); if (!proxy && (mono_aot_is_got_entry (code, (guint8*)vtable_slot) || mono_domain_owns_vtable_slot (mono_domain_get (), vtable_slot))) { #ifdef MONO_ARCH_HAVE_IMT - vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, (gpointer*)regs, code, m, NULL, &need_rgctx_tramp); + vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, regs, code, m, NULL, &need_rgctx_tramp); #endif *vtable_slot = mono_get_addr_from_ftnptr (addr); } @@ -487,7 +497,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) guint8 *plt_entry = mono_aot_get_plt_entry (code); if (plt_entry) { - mono_arch_patch_plt_entry (plt_entry, addr); + mono_arch_patch_plt_entry (plt_entry, NULL, regs, addr); } else if (!generic_shared || (m->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) || mono_domain_lookup_shared_generic (mono_domain_get (), declaring)) { if (generic_shared) { @@ -521,7 +531,7 @@ mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) * This trampoline handles virtual calls when using LLVM. */ static gpointer -mono_llvm_vcall_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8 *tramp) +mono_llvm_vcall_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8 *tramp) { MonoObject *this; gpointer addr; @@ -562,14 +572,14 @@ mono_llvm_vcall_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8 *t g_assert (addr); if (m->klass->valuetype) - addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr); + addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr, need_rgctx_tramp); vtable_slot = &(vt->vtable [mono_method_get_vtable_slot (m)]); g_assert (*vtable_slot); if (!proxy && (mono_aot_is_got_entry (code, (guint8*)vtable_slot) || mono_domain_owns_vtable_slot (mono_domain_get (), vtable_slot))) { #ifdef MONO_ARCH_HAVE_IMT - vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, (gpointer*)regs, code, m, NULL, &need_rgctx_tramp); + vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, regs, code, m, NULL, &need_rgctx_tramp); #endif *vtable_slot = mono_get_addr_from_ftnptr (addr); } @@ -581,7 +591,7 @@ mono_llvm_vcall_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8 *t #endif gpointer -mono_generic_virtual_remoting_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8 *tramp) +mono_generic_virtual_remoting_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8 *tramp) { MonoGenericContext context = { NULL, NULL }; MonoMethod *imt_method, *declaring; @@ -600,7 +610,7 @@ mono_generic_virtual_remoting_trampoline (gssize *regs, guint8 *code, MonoMethod g_assert (!m->klass->generic_container); #ifdef MONO_ARCH_HAVE_IMT - imt_method = mono_arch_find_imt_method ((gpointer*)regs, code); + imt_method = mono_arch_find_imt_method (regs, code); if (imt_method->is_inflated) context.method_inst = ((MonoMethodInflated*)imt_method)->context.method_inst; #endif @@ -623,7 +633,7 @@ mono_generic_virtual_remoting_trampoline (gssize *regs, guint8 *code, MonoMethod */ #ifdef MONO_ARCH_AOT_SUPPORTED gpointer -mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info, +mono_aot_trampoline (mgreg_t *regs, guint8 *code, guint8 *token_info, guint8* tramp) { MonoImage *image; @@ -648,14 +658,16 @@ mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info, return mono_magic_trampoline (regs, code, method, tramp); } - vtable_slot = mono_get_vcall_slot_addr (code, (gpointer*)regs); + addr = mono_create_ftnptr (mono_domain_get (), addr); + + vtable_slot = mono_get_vcall_slot_addr (code, regs); g_assert (!vtable_slot); /* This is a normal call through a PLT entry */ plt_entry = mono_aot_get_plt_entry (code); g_assert (plt_entry); - mono_arch_patch_plt_entry (plt_entry, addr); + mono_arch_patch_plt_entry (plt_entry, NULL, regs, addr); is_got_entry = FALSE; @@ -669,7 +681,7 @@ mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info, #ifdef MONO_ARCH_HAVE_IMT if (!method) method = mono_get_method (image, token, NULL); - vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, (gpointer*)regs, code, method, NULL, &need_rgctx_tramp); + vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, regs, code, method, NULL, &need_rgctx_tramp); #endif *vtable_slot = addr; } @@ -683,7 +695,7 @@ mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info, * This trampoline handles calls made from AOT code through the PLT table. */ gpointer -mono_aot_plt_trampoline (gssize *regs, guint8 *code, guint8 *aot_module, +mono_aot_plt_trampoline (mgreg_t *regs, guint8 *code, guint8 *aot_module, guint8* tramp) { guint32 plt_info_offset = mono_aot_get_plt_info_offset (regs, code); @@ -699,14 +711,14 @@ mono_aot_plt_trampoline (gssize *regs, guint8 *code, guint8 *aot_module, * for the type, then patches the caller code so it is not called again. */ void -mono_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) +mono_class_init_trampoline (mgreg_t *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) { guint8 *plt_entry = mono_aot_get_plt_entry (code); mono_runtime_class_init (vtable); if (plt_entry) { - mono_arch_nullify_plt_entry (plt_entry); + mono_arch_nullify_plt_entry (plt_entry, regs); } else { mono_arch_nullify_class_init_trampoline (code, regs); } @@ -719,19 +731,20 @@ mono_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guin * for the type. */ void -mono_generic_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) +mono_generic_class_init_trampoline (mgreg_t *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) { mono_runtime_class_init (vtable); } static gpointer -mono_rgctx_lazy_fetch_trampoline (gssize *regs, guint8 *code, gpointer data, guint8 *tramp) +mono_rgctx_lazy_fetch_trampoline (mgreg_t *regs, guint8 *code, gpointer data, guint8 *tramp) { #ifdef MONO_ARCH_VTABLE_REG static gboolean inited = FALSE; static int num_lookups = 0; guint32 slot = GPOINTER_TO_UINT (data); - gpointer arg = (gpointer)(gssize)regs [MONO_ARCH_VTABLE_REG]; + mgreg_t *r = (mgreg_t*)regs; + gpointer arg = (gpointer)(gssize)r [MONO_ARCH_VTABLE_REG]; guint32 index = MONO_RGCTX_SLOT_INDEX (slot); gboolean mrgctx = MONO_RGCTX_SLOT_IS_MRGCTX (slot); @@ -752,13 +765,13 @@ mono_rgctx_lazy_fetch_trampoline (gssize *regs, guint8 *code, gpointer data, gui } void -mono_monitor_enter_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint8 *tramp) +mono_monitor_enter_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp) { mono_monitor_enter (obj); } void -mono_monitor_exit_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint8 *tramp) +mono_monitor_exit_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp) { mono_monitor_exit (obj); } @@ -772,7 +785,7 @@ mono_monitor_exit_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint * This is called once the first time a delegate is invoked, so it must be fast. */ gpointer -mono_delegate_trampoline (gssize *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) +mono_delegate_trampoline (mgreg_t *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) { MonoDomain *domain = mono_domain_get (); MonoDelegate *delegate; diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c index e8239ff80f7..1ee4ae4940d 100644 --- a/mono/mini/mini-x86.c +++ b/mono/mini/mini-x86.c @@ -5113,13 +5113,13 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI } MonoMethod* -mono_arch_find_imt_method (gpointer *regs, guint8 *code) +mono_arch_find_imt_method (mgreg_t *regs, guint8 *code) { return (MonoMethod*) regs [MONO_ARCH_IMT_REG]; } MonoObject* -mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) +mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) { MonoMethodSignature *sig = mono_method_signature (method); CallInfo *cinfo = get_call_info (gsctx, NULL, sig, FALSE); @@ -5142,7 +5142,7 @@ mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSha #endif MonoVTable* -mono_arch_find_static_call_vtable (gpointer *regs, guint8 *code) +mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code) { return (MonoVTable*) regs [MONO_ARCH_RGCTX_REG]; } @@ -5322,7 +5322,7 @@ mono_breakpoint_clean_code (guint8 *method_start, guint8 *code, int offset, guin } gpointer -mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement) +mono_arch_get_vcall_slot (guint8 *code, mgreg_t *regs, int *displacement) { guint8 buf [8]; guint8 reg = 0; @@ -5366,12 +5366,12 @@ mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement) return NULL; *displacement = disp; - return regs [reg]; + return (gpointer)regs [reg]; } gpointer mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, - gssize *regs, guint8 *code) + mgreg_t *regs, guint8 *code) { guint32 esp = regs [X86_ESP]; CallInfo *cinfo = NULL; diff --git a/mono/mini/mini-x86.h b/mono/mini/mini-x86.h index 11e48b2e5bd..2c2ac3d361f 100644 --- a/mono/mini/mini-x86.h +++ b/mono/mini/mini-x86.h @@ -43,7 +43,7 @@ LONG CALLBACK seh_handler(EXCEPTION_POINTERS* ep); #endif /* PLATFORM_WIN32 */ -#if defined( __linux__) || defined(__sun) || defined(__APPLE__) || defined(__NetBSD__) +#if defined( __linux__) || defined(__sun) || defined(__APPLE__) || defined(__NetBSD__) || defined(__FreeBSD__) #define MONO_ARCH_USE_SIGACTION #endif diff --git a/mono/mini/mini.c b/mono/mini/mini.c index 3899302c932..8c8979a3f71 100644 --- a/mono/mini/mini.c +++ b/mono/mini/mini.c @@ -2172,6 +2172,13 @@ mono_get_lmf_addr (void) void mono_jit_thread_attach (MonoDomain *domain) { + if (!domain) + /* + * Happens when called from AOTed code which is only used in the root + * domain. + */ + domain = mono_get_root_domain (); + #ifdef HAVE_KW_THREAD if (!mono_lmf_addr) { mono_thread_attach (domain); @@ -2260,7 +2267,7 @@ mono_thread_start_cb (gsize tid, gpointer stack_start, gpointer func) MonoThread *thread; void *jit_tls = setup_jit_tls_data (stack_start, mono_thread_abort); thread = mono_thread_current (); - mono_debugger_thread_created (tid, thread, jit_tls); + mono_debugger_thread_created (tid, thread, jit_tls, func); if (thread) thread->jit_data = jit_tls; } @@ -2282,7 +2289,7 @@ mono_thread_attach_cb (gsize tid, gpointer stack_start) MonoThread *thread; void *jit_tls = setup_jit_tls_data (stack_start, mono_thread_abort_dummy); thread = mono_thread_current (); - mono_debugger_thread_created (tid, thread, (MonoJitTlsData *) jit_tls); + mono_debugger_thread_created (tid, thread, (MonoJitTlsData *) jit_tls, NULL); if (thread) thread->jit_data = jit_tls; if (mono_profiler_get_events () & MONO_PROFILE_STATISTICAL) @@ -4728,12 +4735,18 @@ mini_init (const char *filename, const char *runtime_version) if (!default_opt_set) default_opt = mono_parse_default_optimizations (NULL); + InitializeCriticalSection (&jit_mutex); + #ifdef MONO_DEBUGGER_SUPPORTED if (mini_debug_running_inside_mdb ()) mini_debugger_init (); #endif - InitializeCriticalSection (&jit_mutex); +#ifdef MONO_ARCH_HAVE_TLS_GET + mono_runtime_set_has_tls_get (TRUE); +#else + mono_runtime_set_has_tls_get (FALSE); +#endif if (!global_codeman) global_codeman = mono_code_manager_new (); @@ -4784,7 +4797,9 @@ mini_init (const char *filename, const char *runtime_version) mono_set_generic_sharing_supported (TRUE); #endif +#ifndef MONO_CROSS_COMPILE mono_runtime_install_handlers (); +#endif mono_threads_install_cleanup (mini_thread_cleanup); #ifdef MONO_ARCH_HAVE_NOTIFY_PENDING_EXC @@ -4822,6 +4837,8 @@ mini_init (const char *filename, const char *runtime_version) mono_install_get_class_from_name (mono_aot_get_class_from_name); mono_install_jit_info_find_in_aot (mono_aot_find_jit_info); + mono_install_get_ip_from_sigctx (mono_arch_ip_from_context); + if (runtime_version) domain = mono_init_version (filename, runtime_version); else @@ -5172,7 +5189,8 @@ mini_cleanup (MonoDomain *domain) #ifndef DISABLE_COM cominterop_release_all_rcws (); #endif - + +#ifndef MONO_CROSS_COMPILE /* * mono_runtime_cleanup() and mono_domain_finalize () need to * be called early since they need the execution engine still @@ -5180,11 +5198,14 @@ mini_cleanup (MonoDomain *domain) * and mono_runtime_cleanup will wait for other threads to finish). */ mono_domain_finalize (domain, 2000); +#endif /* This accesses metadata so needs to be called before runtime shutdown */ print_jit_stats (); +#ifndef MONO_CROSS_COMPILE mono_runtime_cleanup (domain); +#endif mono_profiler_shutdown (); diff --git a/mono/mini/mini.h b/mono/mini/mini.h index a575105a72c..e2ca9b14188 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -429,6 +429,10 @@ struct MonoBasicBlock { guint has_array_access : 1; /* Whenever this bblock is extended, ie. it has branches inside it */ guint extended : 1; + /* Whenever this bblock contains a OP_JUMP_TABLE instruction */ + guint has_jump_table : 1; + /* Whenever this bblock contains an OP_CALL_HANDLER instruction */ + guint has_call_handler : 1; /* use for liveness analysis */ MonoBitSet *gen_set; @@ -1144,6 +1148,15 @@ enum { #define OP_STOREP_MEMBASE_IMM OP_STOREI4_MEMBASE_IMM #endif +/* Opcodes to load/store regsize quantities */ +#ifdef __mono_ilp32__ +#define OP_LOADR_MEMBASE OP_LOADI8_MEMBASE +#define OP_STORER_MEMBASE_REG OP_STOREI8_MEMBASE_REG +#else +#define OP_LOADR_MEMBASE OP_LOAD_MEMBASE +#define OP_STORER_MEMBASE_REG OP_STORE_MEMBASE_REG +#endif + typedef enum { STACK_INV, STACK_I4, @@ -1366,6 +1379,7 @@ void mono_print_ins_index (int i, MonoInst *ins) MONO_INTERNAL; void mono_print_ins (MonoInst *ins) MONO_INTERNAL; gboolean mini_assembly_can_skip_verification (MonoDomain *domain, MonoMethod *method) MONO_INTERNAL; gboolean mini_method_verify (MonoCompile *cfg, MonoMethod *method) MONO_INTERNAL; +MonoInst *mono_get_got_var (MonoCompile *cfg) MONO_INTERNAL; gboolean mini_class_is_system_array (MonoClass *klass) MONO_INTERNAL; MonoMethodSignature *mono_get_element_address_signature (int arity) MONO_INTERNAL; @@ -1387,7 +1401,7 @@ gpointer mono_aot_get_method (MonoDomain *domain, gpointer mono_aot_get_method_from_token (MonoDomain *domain, MonoImage *image, guint32 token) MONO_INTERNAL; gboolean mono_aot_is_got_entry (guint8 *code, guint8 *addr) MONO_INTERNAL; guint8* mono_aot_get_plt_entry (guint8 *code) MONO_INTERNAL; -guint32 mono_aot_get_plt_info_offset (gssize *regs, guint8 *code) MONO_INTERNAL; +guint32 mono_aot_get_plt_info_offset (mgreg_t *regs, guint8 *code) MONO_INTERNAL; gboolean mono_aot_get_cached_class_info (MonoClass *klass, MonoCachedClassInfo *res) MONO_INTERNAL; gboolean mono_aot_get_class_from_name (MonoImage *image, const char *name_space, const char *name, MonoClass **klass) MONO_INTERNAL; MonoJitInfo* mono_aot_find_jit_info (MonoDomain *domain, MonoImage *image, gpointer addr) MONO_INTERNAL; @@ -1458,20 +1472,20 @@ gpointer mono_create_static_rgctx_trampoline (MonoMethod *m, gpointer a gpointer mono_create_llvm_vcall_trampoline (MonoMethod *method) MONO_INTERNAL; MonoVTable* mono_find_class_init_trampoline_by_addr (gconstpointer addr) MONO_INTERNAL; guint32 mono_find_rgctx_lazy_fetch_trampoline_by_addr (gconstpointer addr) MONO_INTERNAL; -gpointer mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) MONO_INTERNAL; -gpointer mono_generic_virtual_remoting_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8 *tramp) MONO_INTERNAL; -gpointer mono_delegate_trampoline (gssize *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) MONO_INTERNAL; -gpointer mono_aot_trampoline (gssize *regs, guint8 *code, guint8 *token_info, +gpointer mono_magic_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tramp) MONO_INTERNAL; +gpointer mono_generic_virtual_remoting_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8 *tramp) MONO_INTERNAL; +gpointer mono_delegate_trampoline (mgreg_t *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) MONO_INTERNAL; +gpointer mono_aot_trampoline (mgreg_t *regs, guint8 *code, guint8 *token_info, guint8* tramp) MONO_INTERNAL; -gpointer mono_aot_plt_trampoline (gssize *regs, guint8 *code, guint8 *token_info, +gpointer mono_aot_plt_trampoline (mgreg_t *regs, guint8 *code, guint8 *token_info, guint8* tramp) MONO_INTERNAL; -void mono_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL; -void mono_generic_class_init_trampoline (gssize *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL; -void mono_monitor_enter_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL; -void mono_monitor_exit_trampoline (gssize *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL; +void mono_class_init_trampoline (mgreg_t *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL; +void mono_generic_class_init_trampoline (mgreg_t *regs, guint8 *code, MonoVTable *vtable, guint8 *tramp) MONO_INTERNAL; +void mono_monitor_enter_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL; +void mono_monitor_exit_trampoline (mgreg_t *regs, guint8 *code, MonoObject *obj, guint8 *tramp) MONO_INTERNAL; gconstpointer mono_get_trampoline_func (MonoTrampolineType tramp_type); gpointer mini_get_vtable_trampoline (void) MONO_INTERNAL; -gpointer* mono_get_vcall_slot_addr (guint8* code, gpointer *regs) MONO_INTERNAL; +gpointer* mono_get_vcall_slot_addr (guint8* code, mgreg_t *regs) MONO_INTERNAL; gboolean mono_running_on_valgrind (void) MONO_INTERNAL; void* mono_global_codeman_reserve (int size) MONO_INTERNAL; @@ -1569,6 +1583,8 @@ void mono_arch_decompose_opts (MonoCompile *cfg, MonoInst *ins void mono_arch_decompose_long_opts (MonoCompile *cfg, MonoInst *ins) MONO_INTERNAL; GSList* mono_arch_get_delegate_invoke_impls (void) MONO_INTERNAL; LLVMCallInfo* mono_arch_get_llvm_call_info (MonoCompile *cfg, MonoMethodSignature *sig) MONO_INTERNAL; +guint8* mono_arch_emit_load_got_addr (guint8 *start, guint8 *code, MonoCompile *cfg, MonoJumpInfo **ji) MONO_INTERNAL; +guint8* mono_arch_emit_load_aotconst (guint8 *start, guint8 *code, MonoJumpInfo **ji, int tramp_type, gconstpointer target) MONO_INTERNAL; MonoJitInfo *mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, @@ -1601,25 +1617,25 @@ MonoInst* mono_arch_get_thread_intrinsic (MonoCompile* cfg) MONO_INTERNAL gboolean mono_arch_is_int_overflow (void *sigctx, void *info) MONO_INTERNAL; void mono_arch_invalidate_method (MonoJitInfo *ji, void *func, gpointer func_arg) MONO_INTERNAL; guint32 mono_arch_get_patch_offset (guint8 *code) MONO_INTERNAL; -gpointer mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement) MONO_INTERNAL; -gpointer*mono_arch_get_delegate_method_ptr_addr (guint8* code, gpointer *regs) MONO_INTERNAL; +gpointer mono_arch_get_vcall_slot (guint8 *code, mgreg_t *regs, int *displacement) MONO_INTERNAL; +gpointer*mono_arch_get_delegate_method_ptr_addr (guint8* code, mgreg_t *regs) MONO_INTERNAL; void mono_arch_create_vars (MonoCompile *cfg) MONO_INTERNAL; void mono_arch_save_unwind_info (MonoCompile *cfg) MONO_INTERNAL; void mono_arch_register_lowlevel_calls (void) MONO_INTERNAL; gpointer mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr) MONO_INTERNAL; gpointer mono_arch_get_static_rgctx_trampoline (MonoMethod *m, MonoMethodRuntimeGenericContext *mrgctx, gpointer addr) MONO_INTERNAL; void mono_arch_patch_callsite (guint8 *method_start, guint8 *code, guint8 *addr) MONO_INTERNAL; -void mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) MONO_INTERNAL; -void mono_arch_nullify_class_init_trampoline(guint8 *code, gssize *regs) MONO_INTERNAL; -void mono_arch_nullify_plt_entry (guint8 *code) MONO_INTERNAL; +void mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) MONO_INTERNAL; +void mono_arch_nullify_class_init_trampoline(guint8 *code, mgreg_t *regs) MONO_INTERNAL; +void mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) MONO_INTERNAL; int mono_arch_get_this_arg_reg (MonoMethodSignature *sig, MonoGenericSharingContext *gsctx, guint8 *code) MONO_INTERNAL; -gpointer mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gssize *regs, guint8 *code) MONO_INTERNAL; -MonoObject* mono_arch_find_this_argument (gpointer *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) MONO_INTERNAL; +gpointer mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code) MONO_INTERNAL; +MonoObject* mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx) MONO_INTERNAL; gpointer mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_target) MONO_INTERNAL; gpointer mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_type, MonoDomain *domain, guint32 *code_len) MONO_INTERNAL; void mono_arch_emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoInst *imt_arg) MONO_INTERNAL; -MonoMethod* mono_arch_find_imt_method (gpointer *regs, guint8 *code) MONO_INTERNAL; -MonoVTable* mono_arch_find_static_call_vtable (gpointer *regs, guint8 *code) MONO_INTERNAL; +MonoMethod* mono_arch_find_imt_method (mgreg_t *regs, guint8 *code) MONO_INTERNAL; +MonoVTable* mono_arch_find_static_call_vtable (mgreg_t *regs, guint8 *code) MONO_INTERNAL; gpointer mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckItem **imt_entries, int count, gpointer fail_tramp) MONO_INTERNAL; void mono_arch_notify_pending_exc (void) MONO_INTERNAL; @@ -1633,7 +1649,7 @@ void mono_jit_walk_stack (MonoStackWalk func, gboolean do void mono_jit_walk_stack_from_ctx (MonoStackWalk func, MonoContext *ctx, gboolean do_il_offset, gpointer user_data) MONO_INTERNAL; void mono_setup_altstack (MonoJitTlsData *tls) MONO_INTERNAL; void mono_free_altstack (MonoJitTlsData *tls) MONO_INTERNAL; -gpointer mono_altstack_restore_prot (gssize *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) MONO_INTERNAL; +gpointer mono_altstack_restore_prot (mgreg_t *regs, guint8 *code, gpointer *tramp_data, guint8* tramp) MONO_INTERNAL; MonoJitInfo * mono_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInfo *res, MonoJitInfo *prev_ji, MonoContext *ctx, MonoContext *new_ctx, char **trace, MonoLMF **lmf, int *native_offset, gboolean *managed) MONO_INTERNAL; @@ -1696,6 +1712,7 @@ gboolean mono_breakpoint_clean_code (guint8 *method_start, guint8 *code, int off void mini_debugger_init (void); int mini_debugger_main (MonoDomain *domain, MonoAssembly *assembly, int argc, char **argv); gboolean mini_debug_running_inside_mdb (void); +void mini_debugger_set_attach_ok (void); #endif diff --git a/mono/mini/patch-info.h b/mono/mini/patch-info.h index 41cfc2f60d3..390bee4a6aa 100644 --- a/mono/mini/patch-info.h +++ b/mono/mini/patch-info.h @@ -37,4 +37,5 @@ PATCH_INFO(RGCTX_FETCH, "rgctx_fetch") PATCH_INFO(GENERIC_CLASS_INIT, "generic_class_init") PATCH_INFO(MONITOR_ENTER, "monitor_enter") PATCH_INFO(MONITOR_EXIT, "monitor_exit") +PATCH_INFO(MSCORLIB_GOT_ADDR, "mscorlib_got_addr") PATCH_INFO(NONE, "none") diff --git a/mono/mini/regalloc2.c b/mono/mini/regalloc2.c index 79ab478c94a..c0308e8c303 100644 --- a/mono/mini/regalloc2.c +++ b/mono/mini/regalloc2.c @@ -135,12 +135,7 @@ typedef struct MonoRegallocContext { * MACROS */ -#if SIZEOF_REGISTER == 8 -#define BITS_PER_CHUNK 64 -#else -#define BITS_PER_CHUNK 32 -#endif - +#define BITS_PER_CHUNK MONO_BITSET_BITS_PER_CHUNK #define MONO_FIRST_VREG (MONO_MAX_IREGS+MONO_MAX_FREGS) /* diff --git a/mono/mini/tramp-alpha.c b/mono/mini/tramp-alpha.c index 03b69988788..186d9bc08cb 100644 --- a/mono/mini/tramp-alpha.c +++ b/mono/mini/tramp-alpha.c @@ -497,7 +497,7 @@ mono_arch_create_specific_trampoline (gpointer arg1, /*========================= End of Function ========================*/ void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { unsigned int *pcode = (unsigned int *)code; @@ -614,13 +614,13 @@ mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, } void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { g_assert_not_reached (); } void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { g_assert_not_reached (); } diff --git a/mono/mini/tramp-amd64.c b/mono/mini/tramp-amd64.c index c5a10f83397..1a8988cb565 100644 --- a/mono/mini/tramp-amd64.c +++ b/mono/mini/tramp-amd64.c @@ -153,7 +153,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr) } void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { gint32 disp; gpointer *plt_jump_table_entry; @@ -170,7 +170,7 @@ mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) } void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { guint8 buf [16]; gboolean can_write = mono_breakpoint_clean_code (NULL, code, 7, buf, sizeof (buf)); @@ -189,7 +189,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) gpointer *vtable_slot; /* call *(%rip) */ - vtable_slot = mono_get_vcall_slot_addr (code + 3, (gpointer*)regs); + vtable_slot = mono_get_vcall_slot_addr (code + 3, regs); g_assert (vtable_slot); *vtable_slot = nullified_class_init_trampoline; @@ -243,12 +243,12 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) } void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { if (mono_aot_only && !nullified_class_init_trampoline) nullified_class_init_trampoline = mono_aot_get_named_code ("nullified_class_init_trampoline"); - mono_arch_patch_plt_entry (code, nullified_class_init_trampoline); + mono_arch_patch_plt_entry (code, NULL, regs, nullified_class_init_trampoline); } guchar* diff --git a/mono/mini/tramp-arm.c b/mono/mini/tramp-arm.c index 32f81084b48..c2e2124ee98 100644 --- a/mono/mini/tramp-arm.c +++ b/mono/mini/tramp-arm.c @@ -130,7 +130,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *code_ptr, guint8 *addr) } void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { guint8 *jump_entry; @@ -148,18 +148,18 @@ mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) } void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { mono_arch_patch_callsite (NULL, code, nullified_class_init_trampoline); } void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { if (mono_aot_only && !nullified_class_init_trampoline) nullified_class_init_trampoline = mono_aot_get_named_code ("nullified_class_init_trampoline"); - mono_arch_patch_plt_entry (code, nullified_class_init_trampoline); + mono_arch_patch_plt_entry (code, NULL, regs, nullified_class_init_trampoline); } /* Stack size for trampoline function diff --git a/mono/mini/tramp-hppa.c b/mono/mini/tramp-hppa.c index 04dc219b651..595bbc04166 100644 --- a/mono/mini/tramp-hppa.c +++ b/mono/mini/tramp-hppa.c @@ -114,13 +114,13 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *p, guint8 *addr) } void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { g_assert_not_reached (); } void -mono_arch_nullify_class_init_trampoline (guint8 *code8, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code8, mgreg_t *regs) { guint32 *buf = (guint32 *)((unsigned long)code8 & ~3); guint32 *code = buf; @@ -137,7 +137,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code8, gssize *regs) } void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { g_assert_not_reached (); } @@ -229,7 +229,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) hppa_ldo (buf, HPPA_STACK_LMF_OFFSET, hppa_r3, hppa_r1); hppa_stw (buf, hppa_r1, 0, hppa_r28); - /* Call mono_magic_trampoline (gssize *regs, guint8 *code, MonoMethod *m, guint8* tramp) */ + /* Call mono_magic_trampoline (mgreg_t *regs, guint8 *code, MonoMethod *m, guint8* tramp) */ hppa_ldo (buf, HPPA_STACK_LMF_OFFSET + G_STRUCT_OFFSET (MonoLMF, regs), hppa_r3, hppa_r26); hppa_ldw (buf, HPPA_STACK_LMF_OFFSET + G_STRUCT_OFFSET (MonoLMF, method), hppa_r3, hppa_r24); if (tramp_type == MONO_TRAMPOLINE_JUMP) diff --git a/mono/mini/tramp-ia64.c b/mono/mini/tramp-ia64.c index db0bf5d61e4..4a9970ff42e 100644 --- a/mono/mini/tramp-ia64.c +++ b/mono/mini/tramp-ia64.c @@ -122,13 +122,13 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *code, guint8 *addr) } void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { g_assert_not_reached (); } void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { guint8 *callsite_begin; guint64 *callsite = (guint64*)(gpointer)(code - 16); @@ -174,7 +174,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) } void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { g_assert_not_reached (); } diff --git a/mono/mini/tramp-mips.c b/mono/mini/tramp-mips.c index b2947d385e2..3cc54ce4c2d 100644 --- a/mono/mini/tramp-mips.c +++ b/mono/mini/tramp-mips.c @@ -99,7 +99,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr) } void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { g_assert_not_reached (); } @@ -115,7 +115,7 @@ mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) gpointer -mono_arch_get_vcall_slot (guint8 *code_ptr, gpointer *regs, int *displacement) +mono_arch_get_vcall_slot (guint8 *code_ptr, mgreg_t *regs, int *displacement) { char *o = NULL; char *vtable = NULL; @@ -177,13 +177,13 @@ mono_arch_get_vcall_slot (guint8 *code_ptr, gpointer *regs, int *displacement) } void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { g_assert_not_reached (); } void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { guint32 *code32 = (guint32*)code; diff --git a/mono/mini/tramp-ppc.c b/mono/mini/tramp-ppc.c index cd8498690e4..694392c1365 100644 --- a/mono/mini/tramp-ppc.c +++ b/mono/mini/tramp-ppc.c @@ -24,6 +24,23 @@ static guint8* nullified_class_init_trampoline; +/* Same as mono_create_ftnptr, but doesn't require a domain */ +static gpointer +mono_ppc_create_ftnptr (guint8 *code) +{ +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + MonoPPCFunctionDescriptor *ftnptr = mono_global_codeman_reserve (sizeof (MonoPPCFunctionDescriptor)); + + ftnptr->code = code; + ftnptr->toc = NULL; + ftnptr->env = NULL; + + return ftnptr; +#else + return code; +#endif +} + /* * Return the instruction to jump from code to target, 0 if not * reachable with a single instruction @@ -165,34 +182,45 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *code_ptr, guint8 *addr) } void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { - g_assert_not_reached (); + guint32 ins1, ins2, offset; + + /* Patch the jump table entry used by the plt entry */ + + /* Should be a lis+ori */ + ins1 = ((guint32*)code)[0]; + g_assert (ins1 >> 26 == 15); + ins2 = ((guint32*)code)[1]; + g_assert (ins2 >> 26 == 24); + offset = ((ins1 & 0xffff) << 16) | (ins2 & 0xffff); + + /* Either got or regs is set */ + if (!got) + got = (gpointer*)regs [30]; + *(guint8**)((guint8*)got + offset) = addr; } void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { mono_arch_patch_callsite (NULL, code, nullified_class_init_trampoline); } void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { - g_assert_not_reached (); + if (mono_aot_only && !nullified_class_init_trampoline) + nullified_class_init_trampoline = mono_aot_get_named_code ("nullified_class_init_trampoline"); + + mono_arch_patch_plt_entry (code, NULL, regs, nullified_class_init_trampoline); } /* Stack size for trampoline function * PPC_MINIMAL_STACK_SIZE + 16 (args + alignment to ppc_magic_trampoline) - * + MonoLMF + 14 fp regs + 13 gregs + alignment - * #define STACK (PPC_MINIMAL_STACK_SIZE + 4 * sizeof (gulong) + sizeof (MonoLMF) + 14 * sizeof (double) + 13 * (sizeof (gulong))) - * STACK would be 444 for 32 bit darwin + * + MonoLMF + 14 fp regs + 31 gregs + alignment */ -#ifdef __mono_ppc64__ -#define STACK (PPC_MINIMAL_STACK_SIZE + 4 * sizeof (gulong) + sizeof (MonoLMF) + 14 * sizeof (double) + 13 * sizeof (gulong)) -#else -#define STACK (448) -#endif +#define STACK (PPC_MINIMAL_STACK_SIZE + 4 * sizeof (gulong) + sizeof (MonoLMF) + 14 * sizeof (double) + 31 * sizeof (gulong)) /* Method-specific trampoline code fragment size */ #define METHOD_TRAMPOLINE_SIZE 64 @@ -200,6 +228,31 @@ mono_arch_nullify_plt_entry (guint8 *code) /* Jump-specific trampoline code fragment size */ #define JUMP_TRAMPOLINE_SIZE 64 +#ifdef PPC_USES_FUNCTION_DESCRIPTOR +#define PPC_TOC_REG ppc_r2 +#else +#define PPC_TOC_REG -1 +#endif + +guchar* +mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) +{ + MonoJumpInfo *ji; + guint32 code_size; + guchar *code; + GSList *unwind_ops, *l; + + code = mono_arch_create_trampoline_code_full (tramp_type, &code_size, &ji, &unwind_ops, FALSE); + + //mono_save_trampoline_xdebug_info ("", code, code_size, unwind_ops); + + for (l = unwind_ops; l; l = l->next) + g_free (l->data); + g_slist_free (unwind_ops); + + return code; +} + /* * Stack frame description when the generic trampoline is called. * caller frame @@ -208,7 +261,7 @@ mono_arch_nullify_plt_entry (guint8 *code) * ------------------- * Saved FP registers 0-13 * ------------------- - * Saved general registers 0-12 + * Saved general registers 0-30 * ------------------- * param area for 3 args to ppc_magic_trampoline * ------------------- @@ -216,19 +269,22 @@ mono_arch_nullify_plt_entry (guint8 *code) * ------------------- */ guchar* -mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) +mono_arch_create_trampoline_code_full (MonoTrampolineType tramp_type, guint32 *code_size, MonoJumpInfo **ji, GSList **out_unwind_ops, gboolean aot) { guint8 *buf, *code = NULL; int i, offset; gconstpointer tramp_handler; - int size = MONO_PPC_32_64_CASE (516, 692); + int size = MONO_PPC_32_64_CASE (600, 800); /* Now we'll create in 'buf' the PowerPC trampoline code. This is the trampoline code common to all methods */ code = buf = mono_global_codeman_reserve (size); - ppc_store_reg_update (buf, ppc_r1, -STACK, ppc_r1); + *ji = NULL; + *out_unwind_ops = NULL; + + ppc_stptr_update (buf, ppc_r1, -STACK, ppc_r1); /* start building the MonoLMF on the stack */ offset = STACK - sizeof (double) * MONO_SAVED_FREGS; @@ -243,64 +299,75 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) ppc_store_multiple_regs (buf, ppc_r13, offset, ppc_r1); /* Now save the rest of the registers below the MonoLMF struct, first 14 - * fp regs and then the 13 gregs. + * fp regs and then the 31 gregs. */ offset = STACK - sizeof (MonoLMF) - (14 * sizeof (double)); for (i = 0; i < 14; i++) { ppc_stfd (buf, i, offset, ppc_r1); offset += sizeof (double); } -#define GREGS_OFFSET (STACK - sizeof (MonoLMF) - (14 * sizeof (double)) - (13 * sizeof (gulong))) +#define GREGS_OFFSET (STACK - sizeof (MonoLMF) - (14 * sizeof (double)) - (31 * sizeof (gulong))) offset = GREGS_OFFSET; - for (i = 0; i < 13; i++) { - ppc_store_reg (buf, i, offset, ppc_r1); + for (i = 0; i < 31; i++) { + ppc_stptr (buf, i, offset, ppc_r1); offset += sizeof (gulong); } + /* we got here through a jump to the ctr reg, we must save the lr * in the parent frame (we do it here to reduce the size of the * method-specific trampoline) */ ppc_mflr (buf, ppc_r0); - ppc_store_reg (buf, ppc_r0, STACK + PPC_RET_ADDR_OFFSET, ppc_r1); + ppc_stptr (buf, ppc_r0, STACK + PPC_RET_ADDR_OFFSET, ppc_r1); /* ok, now we can continue with the MonoLMF setup, mostly untouched * from emit_prolog in mini-ppc.c */ - ppc_load_func (buf, ppc_r0, mono_get_lmf_addr); - ppc_mtlr (buf, ppc_r0); - ppc_blrl (buf); + if (aot) { + buf = mono_arch_emit_load_aotconst (code, buf, ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "mono_get_lmf_addr"); +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + ppc_ldptr (buf, ppc_r2, sizeof (gpointer), ppc_r11); + ppc_ldptr (buf, ppc_r11, 0, ppc_r11); +#endif + ppc_mtlr (buf, ppc_r11); + ppc_blrl (buf); + } else { + ppc_load_func (buf, ppc_r0, mono_get_lmf_addr); + ppc_mtlr (buf, ppc_r0); + ppc_blrl (buf); + } /* we build the MonoLMF structure on the stack - see mini-ppc.h * The pointer to the struct is put in ppc_r11. */ ppc_addi (buf, ppc_r11, ppc_sp, STACK - sizeof (MonoLMF)); - ppc_store_reg (buf, ppc_r3, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); + ppc_stptr (buf, ppc_r3, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); /* new_lmf->previous_lmf = *lmf_addr */ - ppc_load_reg (buf, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); - ppc_store_reg (buf, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); + ppc_ldptr (buf, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); + ppc_stptr (buf, ppc_r0, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); /* *(lmf_addr) = r11 */ - ppc_store_reg (buf, ppc_r11, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); + ppc_stptr (buf, ppc_r11, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r3); /* save method info (it's stored on the stack, so get it first and put it * in r5 as it's the third argument to the function) */ if (tramp_type == MONO_TRAMPOLINE_GENERIC_CLASS_INIT) - ppc_load_reg (buf, ppc_r5, GREGS_OFFSET + PPC_FIRST_ARG_REG * sizeof (gpointer), ppc_r1); + ppc_ldptr (buf, ppc_r5, GREGS_OFFSET + PPC_FIRST_ARG_REG * sizeof (gpointer), ppc_r1); else - ppc_load_reg (buf, ppc_r5, GREGS_OFFSET, ppc_r1); + ppc_ldptr (buf, ppc_r5, GREGS_OFFSET, ppc_r1); if ((tramp_type == MONO_TRAMPOLINE_JIT) || (tramp_type == MONO_TRAMPOLINE_JUMP)) - ppc_store_reg (buf, ppc_r5, G_STRUCT_OFFSET(MonoLMF, method), ppc_r11); + ppc_stptr (buf, ppc_r5, G_STRUCT_OFFSET(MonoLMF, method), ppc_r11); /* store the frame pointer of the calling method */ ppc_addi (buf, ppc_r0, ppc_sp, STACK); - ppc_store_reg (buf, ppc_r0, G_STRUCT_OFFSET(MonoLMF, ebp), ppc_r11); + ppc_stptr (buf, ppc_r0, G_STRUCT_OFFSET(MonoLMF, ebp), ppc_r11); /* save the IP (caller ip) */ if (tramp_type == MONO_TRAMPOLINE_JUMP) { ppc_li (buf, ppc_r0, 0); } else { - ppc_load_reg (buf, ppc_r0, STACK + PPC_RET_ADDR_OFFSET, ppc_r1); + ppc_ldptr (buf, ppc_r0, STACK + PPC_RET_ADDR_OFFSET, ppc_r1); } - ppc_store_reg (buf, ppc_r0, G_STRUCT_OFFSET(MonoLMF, eip), ppc_r11); + ppc_stptr (buf, ppc_r0, G_STRUCT_OFFSET(MonoLMF, eip), ppc_r11); /* - * Now we're ready to call trampoline (gssize *regs, guint8 *code, gpointer value, guint8 *tramp) + * Now we're ready to call trampoline (mgreg_t *regs, guint8 *code, gpointer value, guint8 *tramp) * Note that the last argument is unused. */ /* Arg 1: a pointer to the registers */ @@ -310,15 +377,25 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) if (tramp_type == MONO_TRAMPOLINE_JUMP) ppc_li (buf, ppc_r4, 0); else - ppc_load_reg (buf, ppc_r4, STACK + PPC_RET_ADDR_OFFSET, ppc_r1); + ppc_ldptr (buf, ppc_r4, STACK + PPC_RET_ADDR_OFFSET, ppc_r1); /* Arg 3: MonoMethod *method. It was put in r5 already above */ /*ppc_mr (buf, ppc_r5, ppc_r5);*/ - tramp_handler = mono_get_trampoline_func (tramp_type); - ppc_load_func (buf, ppc_r0, tramp_handler); - ppc_mtlr (buf, ppc_r0); - ppc_blrl (buf); + if (aot) { + buf = mono_arch_emit_load_aotconst (code, buf, ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, g_strdup_printf ("trampoline_func_%d", tramp_type)); +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + ppc_ldptr (buf, ppc_r2, sizeof (gpointer), ppc_r11); + ppc_ldptr (buf, ppc_r11, 0, ppc_r11); +#endif + ppc_mtlr (buf, ppc_r11); + ppc_blrl (buf); + } else { + tramp_handler = mono_get_trampoline_func (tramp_type); + ppc_load_func (buf, ppc_r0, tramp_handler); + ppc_mtlr (buf, ppc_r0); + ppc_blrl (buf); + } /* OK, code address is now on r3. Move it to the counter reg * so it will be ready for the final jump: this is safe since we @@ -326,7 +403,8 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) */ if (!MONO_TRAMPOLINE_TYPE_MUST_RETURN (tramp_type)) { #ifdef PPC_USES_FUNCTION_DESCRIPTOR - ppc_load_reg (buf, ppc_r3, 0, ppc_r3); + ppc_ldptr (buf, ppc_r2, sizeof (gpointer), ppc_r3); + ppc_ldptr (buf, ppc_r3, 0, ppc_r3); #endif ppc_mtctr (buf, ppc_r3); } @@ -339,11 +417,11 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) */ ppc_addi (buf, ppc_r11, ppc_r1, STACK - sizeof (MonoLMF)); /* r5 = previous_lmf */ - ppc_load_reg (buf, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); + ppc_ldptr (buf, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r11); /* r6 = lmf_addr */ - ppc_load_reg (buf, ppc_r6, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); + ppc_ldptr (buf, ppc_r6, G_STRUCT_OFFSET(MonoLMF, lmf_addr), ppc_r11); /* *(lmf_addr) = previous_lmf */ - ppc_store_reg (buf, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r6); + ppc_stptr (buf, ppc_r5, G_STRUCT_OFFSET(MonoLMF, previous_lmf), ppc_r6); /* restore iregs */ ppc_load_multiple_regs (buf, ppc_r13, G_STRUCT_OFFSET(MonoLMF, iregs), ppc_r11); /* restore fregs */ @@ -356,12 +434,12 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) ppc_lfd (buf, i, offset, ppc_r1); offset += sizeof (double); } - offset = STACK - sizeof (MonoLMF) - (14 * sizeof (double)) - (13 * sizeof (gulong)); - ppc_load_reg (buf, ppc_r0, offset, ppc_r1); + offset = STACK - sizeof (MonoLMF) - (14 * sizeof (double)) - (31 * sizeof (gulong)); + ppc_ldptr (buf, ppc_r0, offset, ppc_r1); offset += 2 * sizeof (gulong); for (i = 2; i < 13; i++) { - if (i != 3 || tramp_type != MONO_TRAMPOLINE_RGCTX_LAZY_FETCH) - ppc_load_reg (buf, i, offset, ppc_r1); + if (i != PPC_TOC_REG && (i != 3 || tramp_type != MONO_TRAMPOLINE_RGCTX_LAZY_FETCH)) + ppc_ldptr (buf, i, offset, ppc_r1); offset += sizeof (gulong); } @@ -369,8 +447,8 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) * return, we just jump to the compiled code. */ /* Restore stack pointer and LR and jump to the code */ - ppc_load_reg (buf, ppc_r1, 0, ppc_r1); - ppc_load_reg (buf, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_r1); + ppc_ldptr (buf, ppc_r1, 0, ppc_r1); + ppc_ldptr (buf, ppc_r11, PPC_RET_ADDR_OFFSET, ppc_r1); ppc_mtlr (buf, ppc_r11); if (MONO_TRAMPOLINE_TYPE_MUST_RETURN (tramp_type)) ppc_blr (buf); @@ -380,14 +458,16 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) /* Flush instruction cache, since we've generated code */ mono_arch_flush_icache (code, buf - code); + *code_size = buf - code; + /* Sanity check */ g_assert ((buf - code) <= size); if (tramp_type == MONO_TRAMPOLINE_CLASS_INIT) { guint32 code_len; - /* Initialize the nullified class init trampoline used in the AOT case */ - nullified_class_init_trampoline = mono_arch_get_nullified_class_init_trampoline (&code_len); + /* Initialize the nullified class init trampoline */ + nullified_class_init_trampoline = mono_ppc_create_ftnptr (mono_arch_get_nullified_class_init_trampoline (&code_len)); } return code; @@ -456,6 +536,15 @@ emit_trampoline_jump (guint8 *code, guint8 *tramp) gpointer mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot) +{ + guint32 code_size; + MonoJumpInfo *ji; + + return mono_arch_create_rgctx_lazy_fetch_trampoline_full (slot, &code_size, &ji, FALSE); +} + +gpointer +mono_arch_create_rgctx_lazy_fetch_trampoline_full (guint32 slot, guint32 *code_size, MonoJumpInfo **ji, gboolean aot) { #ifdef MONO_ARCH_VTABLE_REG guint8 *tramp; @@ -466,6 +555,8 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot) int i; gboolean mrgctx; + *ji = NULL; + mrgctx = MONO_RGCTX_SLOT_IS_MRGCTX (slot); index = MONO_RGCTX_SLOT_INDEX (slot); if (mrgctx) @@ -483,6 +574,8 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot) tramp_size += 4; else tramp_size += 12; + if (aot) + tramp_size += 32; code = buf = mono_global_codeman_reserve (tramp_size); @@ -493,7 +586,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot) ppc_mr (code, ppc_r4, PPC_FIRST_ARG_REG); } else { /* load rgctx ptr from vtable */ - ppc_load_reg (code, ppc_r4, G_STRUCT_OFFSET (MonoVTable, runtime_generic_context), PPC_FIRST_ARG_REG); + ppc_ldptr (code, ppc_r4, G_STRUCT_OFFSET (MonoVTable, runtime_generic_context), PPC_FIRST_ARG_REG); /* is the rgctx ptr null? */ ppc_compare_reg_imm (code, 0, ppc_r4, 0); /* if yes, jump to actual trampoline */ @@ -504,9 +597,9 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot) for (i = 0; i < depth; ++i) { /* load ptr to next array */ if (mrgctx && i == 0) - ppc_load_reg (code, ppc_r4, sizeof (MonoMethodRuntimeGenericContext), ppc_r4); + ppc_ldptr (code, ppc_r4, sizeof (MonoMethodRuntimeGenericContext), ppc_r4); else - ppc_load_reg (code, ppc_r4, 0, ppc_r4); + ppc_ldptr (code, ppc_r4, 0, ppc_r4); /* is the ptr null? */ ppc_compare_reg_imm (code, 0, ppc_r4, 0); /* if yes, jump to actual trampoline */ @@ -515,7 +608,7 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot) } /* fetch slot */ - ppc_load_reg (code, ppc_r4, sizeof (gpointer) * (index + 1), ppc_r4); + ppc_ldptr (code, ppc_r4, sizeof (gpointer) * (index + 1), ppc_r4); /* is the slot null? */ ppc_compare_reg_imm (code, 0, ppc_r4, 0); /* if yes, jump to actual trampoline */ @@ -534,16 +627,28 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot) /* move the rgctx pointer to the VTABLE register */ ppc_mr (code, MONO_ARCH_VTABLE_REG, ppc_r3); - tramp = mono_arch_create_specific_trampoline (GUINT_TO_POINTER (slot), + if (aot) { + code = mono_arch_emit_load_aotconst (buf, code, ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, g_strdup_printf ("specific_trampoline_lazy_fetch_%u", slot)); + /* Branch to the trampoline */ +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + ppc_ldptr (code, ppc_r11, 0, ppc_r11); +#endif + ppc_mtctr (code, ppc_r11); + ppc_bcctr (code, PPC_BR_ALWAYS, 0); + } else { + tramp = mono_arch_create_specific_trampoline (GUINT_TO_POINTER (slot), MONO_TRAMPOLINE_RGCTX_LAZY_FETCH, mono_get_root_domain (), NULL); - /* jump to the actual trampoline */ - code = emit_trampoline_jump (code, tramp); + /* jump to the actual trampoline */ + code = emit_trampoline_jump (code, tramp); + } mono_arch_flush_icache (buf, code - buf); g_assert (code - buf <= tramp_size); + *code_size = code - buf; + return buf; #else g_assert_not_reached (); @@ -552,6 +657,15 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot) gpointer mono_arch_create_generic_class_init_trampoline (void) +{ + guint32 code_size; + MonoJumpInfo *ji; + + return mono_arch_create_generic_class_init_trampoline_full (&code_size, &ji, FALSE); +} + +gpointer +mono_arch_create_generic_class_init_trampoline_full (guint32 *code_size, MonoJumpInfo **ji, gboolean aot) { guint8 *tramp; guint8 *code, *buf; @@ -561,9 +675,13 @@ mono_arch_create_generic_class_init_trampoline (void) int tramp_size; tramp_size = MONO_PPC_32_64_CASE (32, 44); + if (aot) + tramp_size += 32; code = buf = mono_global_codeman_reserve (tramp_size); + *ji = NULL; + if (byte_offset < 0) mono_marshal_find_bitfield_offset (MonoVTable, initialized, &byte_offset, &bitmask); @@ -576,14 +694,26 @@ mono_arch_create_generic_class_init_trampoline (void) ppc_patch (jump, code); - tramp = mono_arch_create_specific_trampoline (NULL, MONO_TRAMPOLINE_GENERIC_CLASS_INIT, + if (aot) { + code = mono_arch_emit_load_aotconst (buf, code, ji, MONO_PATCH_INFO_JIT_ICALL_ADDR, "specific_trampoline_generic_class_init"); + /* Branch to the trampoline */ +#ifdef PPC_USES_FUNCTION_DESCRIPTOR + ppc_ldptr (code, ppc_r11, 0, ppc_r11); +#endif + ppc_mtctr (code, ppc_r11); + ppc_bcctr (code, PPC_BR_ALWAYS, 0); + } else { + tramp = mono_arch_create_specific_trampoline (NULL, MONO_TRAMPOLINE_GENERIC_CLASS_INIT, mono_get_root_domain (), NULL); - /* jump to the actual trampoline */ - code = emit_trampoline_jump (code, tramp); + /* jump to the actual trampoline */ + code = emit_trampoline_jump (code, tramp); + } mono_arch_flush_icache (buf, code - buf); + *code_size = code - buf; + g_assert (code - buf <= tramp_size); return buf; @@ -596,7 +726,6 @@ mono_arch_get_nullified_class_init_trampoline (guint32 *code_len) guint32 tramp_size = 64; code = buf = mono_global_codeman_reserve (tramp_size); - code = mono_ppc_create_pre_code_ftnptr (code); ppc_blr (code); mono_arch_flush_icache (buf, code - buf); diff --git a/mono/mini/tramp-s390.c b/mono/mini/tramp-s390.c index 1fc75f48ba6..c4294458abd 100644 --- a/mono/mini/tramp-s390.c +++ b/mono/mini/tramp-s390.c @@ -143,7 +143,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr) /*========================= End of Function ========================*/ void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { g_assert_not_reached (); } @@ -159,7 +159,7 @@ mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) /*------------------------------------------------------------------*/ void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { char patch[6] = {0x47, 0x00, 0x00, 0x00, 0x07, 0x00}; @@ -171,7 +171,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) /*========================= End of Function ========================*/ void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { g_assert_not_reached (); } @@ -199,7 +199,7 @@ mono_arch_nullify_plt_entry (guint8 *code) /*------------------------------------------------------------------*/ gpointer -mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement) +mono_arch_get_vcall_slot (guint8 *code, mgreg_t *regs, int *displacement) { int reg; guchar* base; @@ -377,7 +377,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) /* Set arguments */ - /* Arg 1: gssize *regs. We pass sp instead */ + /* Arg 1: mgreg_t *regs. We pass sp instead */ s390_lr (buf, s390_r2, STK_BASE); s390_ahi (buf, s390_r2, CREATE_STACK_SIZE); diff --git a/mono/mini/tramp-s390x.c b/mono/mini/tramp-s390x.c index 3abe460f15c..0398aa6191e 100644 --- a/mono/mini/tramp-s390x.c +++ b/mono/mini/tramp-s390x.c @@ -158,7 +158,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr) /*========================= End of Function ========================*/ void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { g_assert_not_reached (); } @@ -174,7 +174,7 @@ mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) /*------------------------------------------------------------------*/ void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { char patch[2] = {0x07, 0x00}; @@ -186,7 +186,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) /*========================= End of Function ========================*/ void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { g_assert_not_reached (); } @@ -209,7 +209,7 @@ mono_arch_nullify_plt_entry (guint8 *code) /*------------------------------------------------------------------*/ gpointer -mono_arch_get_vcall_slot (guint8 *code, gpointer *regs, int *displacement) +mono_arch_get_vcall_slot (guint8 *code, mgreg_t *regs, int *displacement) { int reg, lkReg; guchar* base; @@ -401,7 +401,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type) /* Set arguments */ - /* Arg 1: gssize *regs. We pass sp instead */ + /* Arg 1: mgreg_t *regs. We pass sp instead */ s390_lgr (buf, s390_r2, STK_BASE); s390_ahi (buf, s390_r2, CREATE_STACK_SIZE); diff --git a/mono/mini/tramp-sparc.c b/mono/mini/tramp-sparc.c index b1e129042b8..0fae9ac9b6a 100644 --- a/mono/mini/tramp-sparc.c +++ b/mono/mini/tramp-sparc.c @@ -67,20 +67,20 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *code, guint8 *addr) } void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { g_assert_not_reached (); } void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { /* Patch calling code */ sparc_nop (code); } void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { g_assert_not_reached (); } diff --git a/mono/mini/tramp-x86.c b/mono/mini/tramp-x86.c index d32f3d7f9cc..4234cd8806f 100644 --- a/mono/mini/tramp-x86.c +++ b/mono/mini/tramp-x86.c @@ -119,7 +119,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *orig_code, guint8 *addr) } void -mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) +mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) { /* A PLT entry: jmp */ g_assert (code [0] == 0xe9); @@ -129,7 +129,7 @@ mono_arch_patch_plt_entry (guint8 *code, guint8 *addr) } void -mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) +mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs) { guint8 buf [16]; gboolean can_write = mono_breakpoint_clean_code (NULL, code, 6, buf, sizeof (buf)); @@ -174,7 +174,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) /* call *() -> Call made from AOT code */ gpointer *vtable_slot; - vtable_slot = mono_get_vcall_slot_addr (code + 5, (gpointer*)regs); + vtable_slot = mono_get_vcall_slot_addr (code + 5, regs); g_assert (vtable_slot); *vtable_slot = nullified_class_init_trampoline; @@ -186,7 +186,7 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs) } void -mono_arch_nullify_plt_entry (guint8 *code) +mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) { if (!mono_running_on_valgrind ()) { guint32 ops; diff --git a/mono/mini/unwind.c b/mono/mini/unwind.c index b7b83e2cff0..c0d5a45fa19 100644 --- a/mono/mini/unwind.c +++ b/mono/mini/unwind.c @@ -55,6 +55,15 @@ static int map_hw_reg_to_dwarf_reg [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; #define NUM_REGS X86_NREG + 1 #define DWARF_DATA_ALIGN (-4) #define DWARF_PC_REG (mono_hw_reg_to_dwarf_reg (X86_NREG)) +#elif defined (TARGET_POWERPC) +// http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html +static int map_hw_reg_to_dwarf_reg [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31 }; +#define NUM_REGS 110 +#define DWARF_DATA_ALIGN (-(gint32)sizeof (mgreg_t)) +#define DWARF_PC_REG 108 #else static int map_hw_reg_to_dwarf_reg [16]; #define NUM_REGS 16 @@ -74,6 +83,13 @@ static int map_dwarf_reg_to_hw_reg [NUM_REGS]; int mono_hw_reg_to_dwarf_reg (int reg) { +#ifdef TARGET_POWERPC + if (reg == ppc_lr) + return 108; + else + g_assert (reg < NUM_REGS); +#endif + if (NUM_REGS == 0) { g_assert_not_reached (); return -1; @@ -122,6 +138,37 @@ encode_uleb128 (guint32 value, guint8 *buf, guint8 **endbuf) *endbuf = p; } +static G_GNUC_UNUSED void +encode_sleb128 (gint32 value, guint8 *buf, guint8 **endbuf) +{ + gboolean more = 1; + gboolean negative = (value < 0); + guint32 size = 32; + guint8 byte; + guint8 *p = buf; + + while (more) { + byte = value & 0x7f; + value >>= 7; + /* the following is unnecessary if the + * implementation of >>= uses an arithmetic rather + * than logical shift for a signed left operand + */ + if (negative) + /* sign extend */ + value |= - (1 <<(size - 7)); + /* sign bit of byte is second high order bit (0x40) */ + if ((value == 0 && !(byte & 0x40)) || + (value == -1 && (byte & 0x40))) + more = 0; + else + byte |= 0x80; + *p ++= byte; + } + + *endbuf = p; +} + static inline guint32 decode_uleb128 (guint8 *buf, guint8 **endbuf) { @@ -221,8 +268,14 @@ mono_unwind_ops_encode (GSList *unwind_ops, guint32 *out_len) encode_uleb128 (reg, p, &p); break; case DW_CFA_offset: - *p ++ = DW_CFA_offset | reg; - encode_uleb128 (op->val / DWARF_DATA_ALIGN, p, &p); + if (reg > 63) { + *p ++ = DW_CFA_offset_extended_sf; + encode_uleb128 (reg, p, &p); + encode_sleb128 (op->val / DWARF_DATA_ALIGN, p, &p); + } else { + *p ++ = DW_CFA_offset | reg; + encode_uleb128 (op->val / DWARF_DATA_ALIGN, p, &p); + } break; default: g_assert_not_reached (); @@ -265,11 +318,11 @@ print_dwarf_state (int cfa_reg, int cfa_offset, int ip, int nregs, Loc *location */ void mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len, - guint8 *start_ip, guint8 *end_ip, guint8 *ip, gssize *regs, + guint8 *start_ip, guint8 *end_ip, guint8 *ip, mgreg_t *regs, int nregs, guint8 **out_cfa) { Loc locations [NUM_REGS]; - int i, pos, reg, cfa_reg, cfa_offset; + int i, pos, reg, cfa_reg, cfa_offset, offset; guint8 *p; guint8 *cfa_val; @@ -311,6 +364,10 @@ mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len, case DW_CFA_def_cfa_register: cfa_reg = mono_dwarf_reg_to_hw_reg (decode_uleb128 (p, &p)); break; + case DW_CFA_offset_extended_sf: + reg = mono_dwarf_reg_to_hw_reg (decode_uleb128 (p, &p)); + offset = decode_sleb128 (p, &p) * DWARF_DATA_ALIGN; + break; case DW_CFA_advance_loc4: pos += *(guint32*)p; p += 4; diff --git a/mono/mini/unwind.h b/mono/mini/unwind.h index 004898478ab..4e02bc32dd7 100644 --- a/mono/mini/unwind.h +++ b/mono/mini/unwind.h @@ -57,7 +57,7 @@ /* Represents one unwind instruction */ typedef struct { guint8 op; /* One of DW_CFA_... */ - guint8 reg; /* register number in the hardware encoding */ + guint16 reg; /* register number in the hardware encoding */ gint32 val; /* arbitrary value */ guint32 when; /* The offset _after_ the cpu instruction this unwind op belongs to */ } MonoUnwindOp; @@ -100,7 +100,7 @@ mono_unwind_ops_encode (GSList *unwind_ops, guint32 *out_len) MONO_INTERNAL; void mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len, - guint8 *start_ip, guint8 *end_ip, guint8 *ip, gssize *regs, + guint8 *start_ip, guint8 *end_ip, guint8 *ip, mgreg_t *regs, int nregs, guint8 **out_cfa) MONO_INTERNAL; void mono_unwind_init (void) MONO_INTERNAL; diff --git a/mono/profiler/ChangeLog b/mono/profiler/ChangeLog index dbf952fb5d4..7aed4e2ecec 100644 --- a/mono/profiler/ChangeLog +++ b/mono/profiler/ChangeLog @@ -1,3 +1,14 @@ +2009-06-18 Massimiliano Mantione + * mono-profiler-logging.c: Removed debugging printf statement. + +2009-06-18 Massimiliano Mantione + * mono-profiler-logging.c: + Added assembly information to classes and wrapper flag to methods. + +2009-05-25 Massimiliano Mantione + * mono-profiler-logging.c (write_thread_data_block): Only emit initial + stack snippet if we are tracking stacks. + 2009-05-25 Massimiliano Mantione * mono-profiler-logging.c (setup_user_options): Avoid tracking stacks and emitting allocation caller information if we are already emitting diff --git a/mono/profiler/mono-profiler-logging.c b/mono/profiler/mono-profiler-logging.c index 2e95832ad50..266be44b68c 100644 --- a/mono/profiler/mono-profiler-logging.c +++ b/mono/profiler/mono-profiler-logging.c @@ -51,6 +51,9 @@ typedef enum { MONO_PROFILER_DIRECTIVE_ALLOCATIONS_CARRY_CALLER = 1, MONO_PROFILER_DIRECTIVE_ALLOCATIONS_HAVE_STACK = 2, MONO_PROFILER_DIRECTIVE_ALLOCATIONS_CARRY_ID = 3, + MONO_PROFILER_DIRECTIVE_LOADED_ELEMENTS_CARRY_ID = 4, + MONO_PROFILER_DIRECTIVE_CLASSES_CARRY_ASSEMBLY_ID = 5, + MONO_PROFILER_DIRECTIVE_METHODS_CARRY_WRAPPER_FLAG = 6, MONO_PROFILER_DIRECTIVE_LAST } MonoProfilerDirectives; @@ -308,6 +311,7 @@ typedef struct _LoadedElement { guint64 load_end_counter; guint64 unload_start_counter; guint64 unload_end_counter; + guint32 id; guint8 loaded; guint8 load_written; guint8 unloaded; @@ -819,6 +823,7 @@ struct _MonoProfiler { MethodIdMapping *methods; ClassIdMapping *classes; + guint32 loaded_element_next_free_id; GHashTable *loaded_assemblies; GHashTable *loaded_modules; GHashTable *loaded_appdomains; @@ -1508,6 +1513,8 @@ print_load_event (const char *event_name, GHashTable *table, gpointer item, Load static LoadedElement* loaded_element_load_start (GHashTable *table, gpointer item) { LoadedElement *element = g_new0 (LoadedElement, 1); + element->id = profiler->loaded_element_next_free_id; + profiler->loaded_element_next_free_id ++; #if (DEBUG_LOAD_EVENTS) print_load_event ("LOAD START", table, item, element); #endif @@ -1552,6 +1559,21 @@ loaded_element_unload_end (GHashTable *table, gpointer item) { return element; } +static LoadedElement* +loaded_element_find (GHashTable *table, gpointer item) { + LoadedElement *element = g_hash_table_lookup (table, item); + return element; +} + +static guint32 +loaded_element_get_id (GHashTable *table, gpointer item) { + LoadedElement *element = loaded_element_find (table, item); + if (element != NULL) { + return element->id; + } else { + return 0; + } +} static void loaded_element_destroy (gpointer element) { @@ -1585,7 +1607,7 @@ print_load_event (const char *event_name, GHashTable *table, gpointer item, Load item_name = ""; } - printf ("%s EVENT for %s (%s)\n", event_name, item_info, item_name); + printf ("%s EVENT for %s (%s [id %d])\n", event_name, item_info, item_name, element->id); g_free (item_info); } #endif @@ -2017,6 +2039,9 @@ write_directives_block (gboolean start) { if (profiler->action_flags.allocations_carry_id) { write_uint32 (MONO_PROFILER_DIRECTIVE_ALLOCATIONS_CARRY_ID); } + write_uint32 (MONO_PROFILER_DIRECTIVE_LOADED_ELEMENTS_CARRY_ID); + write_uint32 (MONO_PROFILER_DIRECTIVE_CLASSES_CARRY_ASSEMBLY_ID); + write_uint32 (MONO_PROFILER_DIRECTIVE_METHODS_CARRY_WRAPPER_FLAG); } write_uint32 (MONO_PROFILER_DIRECTIVE_END); @@ -2249,12 +2274,37 @@ profiler_heap_shot_write_block (ProfilerHeapShotWriteJob *job) { } static void -write_element_load_block (LoadedElement *element, guint8 kind, gsize thread_id) { +write_element_load_block (LoadedElement *element, guint8 kind, gsize thread_id, gpointer item) { WRITE_BYTE (kind); write_uint64 (element->load_start_counter); write_uint64 (element->load_end_counter); write_uint64 (thread_id); + write_uint32 (element->id); write_string (element->name); + if (kind & MONO_PROFILER_LOADED_EVENT_ASSEMBLY) { + MonoImage *image = mono_assembly_get_image ((MonoAssembly*) item); + MonoAssemblyName aname; + if (mono_assembly_fill_assembly_name (image, &aname)) { + write_string (aname.name); + write_uint32 (aname.major); + write_uint32 (aname.minor); + write_uint32 (aname.build); + write_uint32 (aname.revision); + write_string (aname.culture && *aname.culture? aname.culture: "neutral"); + write_string (aname.public_key_token [0] ? (char *)aname.public_key_token : "null"); + /* Retargetable flag */ + write_uint32 ((aname.flags & 0x00000100) ? 1 : 0); + } else { + write_string ("UNKNOWN"); + write_uint32 (0); + write_uint32 (0); + write_uint32 (0); + write_uint32 (0); + write_string ("neutral"); + write_string ("null"); + write_uint32 (0); + } + } write_current_block (MONO_PROFILER_FILE_BLOCK_KIND_LOADED); element->load_written = TRUE; } @@ -2265,6 +2315,7 @@ write_element_unload_block (LoadedElement *element, guint8 kind, gsize thread_id write_uint64 (element->unload_start_counter); write_uint64 (element->unload_end_counter); write_uint64 (thread_id); + write_uint32 (element->id); write_string (element->name); write_current_block (MONO_PROFILER_FILE_BLOCK_KIND_UNLOADED); element->unload_written = TRUE; @@ -2298,7 +2349,11 @@ write_mapping_block (gsize thread_id) { write_uint64 (thread_id); for (current_class = profiler->classes->unwritten; current_class != NULL; current_class = current_class->next_unwritten) { + MonoImage *image = mono_class_get_image (current_class->klass); + MonoAssembly *assembly = mono_image_get_assembly (image); + guint32 assembly_id = loaded_element_get_id (profiler->loaded_assemblies, assembly); write_uint32 (current_class->id); + write_uint32 (assembly_id); write_string (current_class->name); #if (DEBUG_MAPPING_EVENTS) printf ("mapping CLASS (%d => %s)\n", current_class->id, current_class->name); @@ -2316,6 +2371,11 @@ write_mapping_block (gsize thread_id) { g_assert (class_element != NULL); write_uint32 (current_method->id); write_uint32 (class_element->id); + if (method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) { + write_uint32 (1); + } else { + write_uint32 (0); + } write_string (current_method->name); #if (DEBUG_MAPPING_EVENTS) printf ("mapping METHOD ([%d]%d => %s)\n", class_element?class_element->id:1, current_method->id, current_method->name); @@ -2546,8 +2606,11 @@ write_thread_data_block (ProfilerPerThreadData *data) { write_uint64 (data->start_event_counter); - /* Make sure that stack sections can be fully reconstructed even reading only one block */ - rewrite_last_written_stack (&(data->stack)); + /* If we are tracking the stack, make sure that stack sections */ + /* can be fully reconstructed even reading only one block */ + if (profiler->action_flags.track_stack) { + rewrite_last_written_stack (&(data->stack)); + } while (start < end) { start = write_event (start, data); @@ -3733,7 +3796,7 @@ appdomain_end_load (MonoProfiler *profiler, MonoDomain *domain, int result) { name = g_strdup_printf ("%d", mono_domain_get_id (domain)); LOCK_PROFILER (); element = loaded_element_load_end (profiler->loaded_appdomains, domain, name); - write_element_load_block (element, MONO_PROFILER_LOADED_EVENT_APPDOMAIN | RESULT_TO_LOAD_CODE (result), CURRENT_THREAD_ID ()); + write_element_load_block (element, MONO_PROFILER_LOADED_EVENT_APPDOMAIN | RESULT_TO_LOAD_CODE (result), CURRENT_THREAD_ID (), domain); UNLOCK_PROFILER (); } @@ -3775,7 +3838,7 @@ module_end_load (MonoProfiler *profiler, MonoImage *module, int result) { } LOCK_PROFILER (); element = loaded_element_load_end (profiler->loaded_modules, module, name); - write_element_load_block (element, MONO_PROFILER_LOADED_EVENT_MODULE | RESULT_TO_LOAD_CODE (result), CURRENT_THREAD_ID ()); + write_element_load_block (element, MONO_PROFILER_LOADED_EVENT_MODULE | RESULT_TO_LOAD_CODE (result), CURRENT_THREAD_ID (), module); UNLOCK_PROFILER (); } @@ -3817,7 +3880,7 @@ assembly_end_load (MonoProfiler *profiler, MonoAssembly *assembly, int result) { } LOCK_PROFILER (); element = loaded_element_load_end (profiler->loaded_assemblies, assembly, name); - write_element_load_block (element, MONO_PROFILER_LOADED_EVENT_ASSEMBLY | RESULT_TO_LOAD_CODE (result), CURRENT_THREAD_ID ()); + write_element_load_block (element, MONO_PROFILER_LOADED_EVENT_ASSEMBLY | RESULT_TO_LOAD_CODE (result), CURRENT_THREAD_ID (), assembly); UNLOCK_PROFILER (); } @@ -5443,6 +5506,7 @@ mono_profiler_startup (const char *desc) profiler->methods = method_id_mapping_new (); profiler->classes = class_id_mapping_new (); + profiler->loaded_element_next_free_id = 1; profiler->loaded_assemblies = g_hash_table_new_full (g_direct_hash, NULL, NULL, loaded_element_destroy); profiler->loaded_modules = g_hash_table_new_full (g_direct_hash, NULL, NULL, loaded_element_destroy); profiler->loaded_appdomains = g_hash_table_new_full (g_direct_hash, NULL, NULL, loaded_element_destroy); diff --git a/mono/tests/ChangeLog b/mono/tests/ChangeLog index 763e35cd369..63754c0a73f 100644 --- a/mono/tests/ChangeLog +++ b/mono/tests/ChangeLog @@ -1,3 +1,55 @@ +2009-07-11 Zoltan Varga + + * runtime-invoke.cs: Convert it to use TestDriver. Add tests for + ptr types. + +2009-07-09 Mark Probst + + * generic-xdomain.2.cs: Test case for generic marshal-by-ref + objects. + + * Makefile.am: Test added. + +2009-06-29 Zoltan Varga + + * generic-stack-traces.2.cs: Add a test for #509406. + + * dynamic-method-finalize.2.cs: New test. + +2009-06-25 Mark Probst + + * appdomain-async-invoke.cs: Fail if BeginInvoke doesn't return an + AsyncResult. + +2009-06-25 Mark Probst + + * appdomain-async-invoke.cs: Test for adding async invokes while a + domain is unloading. + + * Makefile.am: Test added. + +2009-06-25 Sylvain Dupont + + * cominterop.cs libtest.c: Added tests for marshalling + out parameters of type SAFEARRAY[VARIANT]. + + Code is contributed under MIT/X11 license. + +2009-06-24 Zoltan Varga + + * libtest.c make_imt_test.sh: Applied patch from Romain Tartiere + (romain@blogreen.org). Fix tests on freebsd. + +2009-06-17 Zoltan Varga + + * runtime-invoke.cs: Add test for sharing i8/u8 return values. + +2009-06-15 Rodrigo Kumpera + + * load-exceptions.cs class.cs: Add regression test for #508487. + + * t-missing.cs: Add nested type. + 2009-06-06 Gert Driesen * bug-508538.cs: New regression test for bug #508538. diff --git a/mono/tests/Makefile.am b/mono/tests/Makefile.am index 6deff37fce4..ae44aac94ff 100644 --- a/mono/tests/Makefile.am +++ b/mono/tests/Makefile.am @@ -158,6 +158,7 @@ BASE_TEST_CS_SRC= \ appdomain2.cs \ appdomain-client.cs \ appdomain-unload.cs \ + appdomain-async-invoke.cs \ loader.cs \ pointer.cs \ hashcode.cs \ @@ -289,6 +290,7 @@ BASE_TEST_CS_SRC= \ generic-array-iface-set.2.cs \ generic-typedef.2.cs \ generic-marshalbyref.2.cs \ + generic-xdomain.2.cs \ bug-431413.2.cs \ bug-459285.2.cs \ generic-virtual-invoke.2.cs \ @@ -304,6 +306,7 @@ BASE_TEST_CS_SRC= \ bug-479763.2.cs \ bug-80392.2.cs \ dynamic-method-access.2.cs \ + dynamic-method-finalize.2.cs \ bug-82194.2.cs \ anonarray.2.cs \ ienumerator-interfaces.2.cs \ @@ -772,7 +775,7 @@ test-generic-sharing : generics-sharing.2.exe shared-generic-methods.2.exe \ generic-sealed-virtual.2.exe generic-system-arrays.2.exe \ generic-stack-traces.2.exe generic-stack-traces2.2.exe \ bug-472600.2.exe bug-473482.2.exe bug-473999.2.exe \ - bug-479763.2.exe + bug-479763.2.exe generic-xdomain.2.exe @for fn in $+ ; do \ echo "Testing $$fn ..."; \ MONO_GENERIC_SHARING=all $(RUNTIME) -O=gshared $$fn > $$fn.stdout || exit 1; \ diff --git a/mono/tests/appdomain-async-invoke.cs b/mono/tests/appdomain-async-invoke.cs new file mode 100644 index 00000000000..0ec52b83b59 --- /dev/null +++ b/mono/tests/appdomain-async-invoke.cs @@ -0,0 +1,49 @@ +using System; +using System.Threading; +using System.Runtime.Remoting; + +public class Test : MarshalByRefObject { + delegate int GetIntDelegate (); + + static void async_callback (IAsyncResult ar) + { + Console.WriteLine ("Async Callback in domain " + AppDomain.CurrentDomain + " " + ar.AsyncState); + } + + ~Test () { + Console.WriteLine ("in test desctructor"); + GetIntDelegate del = new GetIntDelegate (getInt); + AsyncCallback ac = new AsyncCallback (async_callback); + if (del.BeginInvoke (ac, "bla") == null) { + Console.WriteLine ("async recult is null"); + Environment.Exit (1); + } + } + + public int getInt () { + Console.WriteLine ("getInt in " + AppDomain.CurrentDomain); + return 123; + } +} + +public class main { + public static int Main (string [] args) { + AppDomain domain = AppDomain.CreateDomain ("newdomain"); + int i; + + for (i = 0; i < 200; ++i) { + domain.CreateInstanceAndUnwrap (typeof (Test).Assembly.FullName, typeof (Test).FullName); + } + + Console.WriteLine ("unloading"); + AppDomain.Unload (domain); + Console.WriteLine ("unloaded"); + + GC.Collect (); + GC.WaitForPendingFinalizers (); + + Console.WriteLine ("done"); + + return 0; + } +} diff --git a/mono/tests/cominterop.cs b/mono/tests/cominterop.cs index 985e58f29ed..1614a172aec 100644 --- a/mono/tests/cominterop.cs +++ b/mono/tests/cominterop.cs @@ -211,6 +211,18 @@ public class Tests [DllImport ("libtest")] public static extern int mono_test_marshal_ccw_itest ([MarshalAs (UnmanagedType.Interface)]ITestPresSig itest); + [DllImport("libtest")] + public static extern int mono_test_marshal_variant_out_safearray_1dim_vt_bstr_empty([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array); + + [DllImport("libtest")] + public static extern int mono_test_marshal_variant_out_safearray_1dim_vt_bstr ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array); + + [DllImport("libtest")] + public static extern int mono_test_marshal_variant_out_safearray_2dim_vt_int ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array); + + [DllImport("libtest")] + public static extern int mono_test_marshal_variant_out_safearray_4dim_vt_int ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array); + public static int Main() { bool isWindows = !(((int)Environment.OSVersion.Platform == 4) || @@ -423,6 +435,54 @@ public class Tests mono_test_marshal_ccw_itest (test_pres_sig); #endregion // COM Callable Wrapper Tests + + #region SAFEARRAY tests + + Array array; + if ((mono_test_marshal_variant_out_safearray_1dim_vt_bstr_empty(out array) != 0) || (array.Rank != 1) || (array.Length != 0)) + return 62; + + if ((mono_test_marshal_variant_out_safearray_1dim_vt_bstr (out array) != 0) || (array.Rank != 1) || (array.Length != 10)) + return 63; + for (int i = 0; i < 10; ++i) { + if (i != Convert.ToInt32(array.GetValue (i))) + return 64; + } + + if ((mono_test_marshal_variant_out_safearray_2dim_vt_int (out array) != 0) || (array.Rank != 2)) + return 65; + if ( (array.GetLowerBound (0) != 0) || (array.GetUpperBound (0) != 3) + || (array.GetLowerBound (1) != 0) || (array.GetUpperBound (1) != 2)) + return 66; + for (int i = array.GetLowerBound (0); i <= array.GetUpperBound (0); ++i) + { + for (int j = array.GetLowerBound (1); j <= array.GetUpperBound (1); ++j) { + if ((i + 1) * 10 + (j + 1) != (int)array.GetValue (new long[] { i, j })) + return 67; + } + } + + if ((mono_test_marshal_variant_out_safearray_4dim_vt_int (out array) != 0) || (array.Rank != 4)) + return 68; + if ( (array.GetLowerBound (0) != 15) || (array.GetUpperBound (0) != 24) + || (array.GetLowerBound (1) != 20) || (array.GetUpperBound (1) != 22) + || (array.GetLowerBound (2) != 5) || (array.GetUpperBound (2) != 10) + || (array.GetLowerBound (3) != 12) || (array.GetUpperBound (3) != 18) ) + return 69; + + int index = 0; + for (int i = array.GetLowerBound (3); i <= array.GetUpperBound (3); ++i) { + for (int j = array.GetLowerBound (2); j <= array.GetUpperBound (2); ++j) { + for (int k = array.GetLowerBound (1); k <= array.GetUpperBound (1); ++k) { + for (int l = array.GetLowerBound (0); l <= array.GetUpperBound (0); ++l) { + if (index != (int)array.GetValue (new long[] { l, k, j, i })) + return 70; + ++index; + } + } + } + } + #endregion // SafeArray Tests } return 0; diff --git a/mono/tests/dynamic-method-finalize.2.cs b/mono/tests/dynamic-method-finalize.2.cs new file mode 100644 index 00000000000..bcc74ddb381 --- /dev/null +++ b/mono/tests/dynamic-method-finalize.2.cs @@ -0,0 +1,51 @@ +using System; +using System.Reflection; +using System.Reflection.Emit; + +delegate int Getter (); + +class Host { + + static int Field = 42; + + Getter g; + + public Host (Getter g) { + this.g = g; + } + + ~Host () { + int d = g (); + Console.WriteLine (d); + } +} + +class Program { + + static Host h; + + public static int Main () + { + DynamicMethod method = new DynamicMethod ("GetField", + typeof (int), new Type [0], Type.GetType ("Host")); + + ILGenerator il = method.GetILGenerator (); + il.Emit (OpCodes.Ldsfld, typeof (Host).GetField ( + "Field", BindingFlags.Static | +BindingFlags.NonPublic)); + il.Emit (OpCodes.Ret); + + Getter g = (Getter) method.CreateDelegate (typeof (Getter)); + + /* + * Create an object whose finalizer calls a dynamic method which + * dies at the same time. + * Storing into a static guarantees that this is only finalized during + * shutdown. This is needed since the !shutdown case still doesn't + * work. + */ + h = new Host (g); + + return 0; + } +} diff --git a/mono/tests/generic-stack-traces.2.cs b/mono/tests/generic-stack-traces.2.cs index c8ae9bf8bf4..340b28f2678 100644 --- a/mono/tests/generic-stack-traces.2.cs +++ b/mono/tests/generic-stack-traces.2.cs @@ -13,6 +13,20 @@ public class Gen { } } +class Foo { + + public void Throw () { + throw new Exception (); + } + + public void Throw () { + throw new Exception (); + } +} + +class Bar : Foo { +} + public class main { public static void callCallStaticCrash () { Gen gt = new Gen (); @@ -70,6 +84,21 @@ public class main { if (!test (exc, typeof (Gen))) return 1; } + + // Exception thrown in inherited method with different generic context + // (#509406) + try { + new Bar ().Throw (); + } catch (Exception ex) { + Console.WriteLine (new StackTrace (ex)); + } + + try { + new Bar ().Throw> (); + } catch (Exception ex) { + Console.WriteLine (new StackTrace (ex)); + } + return 0; } } diff --git a/mono/tests/generic-xdomain.2.cs b/mono/tests/generic-xdomain.2.cs new file mode 100644 index 00000000000..7a08380515b --- /dev/null +++ b/mono/tests/generic-xdomain.2.cs @@ -0,0 +1,54 @@ +using System; +using System.ComponentModel; +using System.Runtime.Remoting; + +namespace Test { + public class Test { + static void Main () + { + AppDomain domain = AppDomain.CreateDomain ("new-domain"); + domain.DoCallBack (Run); + Type stType = typeof (Something); + Other st = (Other) domain.CreateInstanceAndUnwrap (stType.Assembly.FullName, stType.FullName); + Console.WriteLine ("in main int: {0}", st.getInt ()); + Console.WriteLine ("in main types: {0}", st.getTypeNames ()); + } + + public static void Run () + { + DoRun(new Something ()); + } + + public static void DoRun (Other some) + { + Console.WriteLine ("domain: {0}", AppDomain.CurrentDomain.FriendlyName); + Console.WriteLine ("This is null: {0}", some.Mappings == null); + Console.WriteLine ("int: {0}", some.getInt ()); + } + } + + public class Other : MarshalByRefObject { + public T2 Mappings { + get { return default(T2); } + } + + public virtual int getInt () { + return 123; + } + + public virtual string getTypeNames () { + return "error"; + } + } + + public class Something : Other { + public override int getInt () { + return 456; + } + + public override string getTypeNames () { + Console.WriteLine ("getTypeNames in {0}", AppDomain.CurrentDomain.FriendlyName); + return typeof(T1).ToString () + " " + typeof(T2).ToString () + " " + typeof (T3).ToString (); + } + } +} diff --git a/mono/tests/libtest.c b/mono/tests/libtest.c index 08a7c6ce3cd..59a338fc249 100644 --- a/mono/tests/libtest.c +++ b/mono/tests/libtest.c @@ -3000,7 +3000,7 @@ mono_test_marshal_ccw_itest (MonoComObject *pUnk) * mono_method_get_unmanaged_thunk tests */ -#if defined(__GNUC__) && ((defined(__i386__) && (defined(__linux__) || defined (__APPLE__))) || (defined(__ppc__) && defined(__APPLE__))) +#if defined(__GNUC__) && ((defined(__i386__) && (defined(__linux__) || defined (__APPLE__)) || defined (__FreeBSD__)) || (defined(__ppc__) && defined(__APPLE__))) #define ALIGN(size) __attribute__ ((aligned(size))) #else #define ALIGN(size) @@ -4045,4 +4045,126 @@ mono_test_managed_marshal_bool_ref (int arg, unsigned int expected, unsigned int return 0; } +#ifdef WIN32 + +LIBTEST_API int STDCALL +mono_test_marshal_variant_out_safearray_1dim_vt_bstr_empty (SAFEARRAY** safearray) +{ + /* Create an empty one-dimensional array of variants */ + SAFEARRAY *pSA; + SAFEARRAYBOUND dimensions [1]; + + dimensions [0].lLbound = 0; + dimensions [0].cElements = 0; + + pSA= SafeArrayCreate (VT_VARIANT, 1, dimensions); + *safearray = pSA; + return S_OK; +} + +LIBTEST_API int STDCALL +mono_test_marshal_variant_out_safearray_1dim_vt_bstr (SAFEARRAY** safearray) +{ + /* Create a one-dimensional array of 10 variants filled with "0" to "9" */ + SAFEARRAY *pSA; + SAFEARRAYBOUND dimensions [1]; + long i; + wchar_t buffer [20]; + HRESULT hr = S_OK; + long indices [1]; + + dimensions [0].lLbound = 0; + dimensions [0].cElements = 10; + + pSA= SafeArrayCreate (VT_VARIANT, 1, dimensions); + for (i= dimensions [0].lLbound; i< (dimensions [0].cElements + dimensions [0].lLbound); i++) { + VARIANT vOut; + VariantInit (&vOut); + vOut.vt = VT_BSTR; + _ltow (i,buffer,10); + vOut.bstrVal= SysAllocString (buffer); + indices [0] = i; + if ((hr = SafeArrayPutElement (pSA, indices, &vOut)) != S_OK) { + VariantClear (&vOut); + SafeArrayDestroy (pSA); + return hr; + } + VariantClear (&vOut); + } + *safearray = pSA; + return hr; +} + +LIBTEST_API int STDCALL +mono_test_marshal_variant_out_safearray_2dim_vt_int (SAFEARRAY** safearray) +{ + /* Create a two-dimensional array of 4x3 variants filled with 11, 12, 13, etc. */ + SAFEARRAY *pSA; + SAFEARRAYBOUND dimensions [2]; + long i, j; + HRESULT hr = S_OK; + long indices [2]; + + dimensions [0].lLbound = 0; + dimensions [0].cElements = 4; + dimensions [1].lLbound = 0; + dimensions [1].cElements = 3; + + pSA= SafeArrayCreate(VT_VARIANT, 2, dimensions); + for (i= dimensions [0].lLbound; i< (dimensions [0].cElements + dimensions [0].lLbound); i++) { + for (j= dimensions [1].lLbound; j< (dimensions [1].cElements + dimensions [1].lLbound); j++) { + VARIANT vOut; + VariantInit (&vOut); + vOut.vt = VT_I4; + vOut.intVal = (i+1)*10+(j+1); + indices [0] = i; + indices [1] = j; + if ((hr = SafeArrayPutElement (pSA, indices, &vOut)) != S_OK) { + VariantClear (&vOut); + SafeArrayDestroy (pSA); + return hr; + } + VariantClear (&vOut); // does a deep destroy of source VARIANT + } + } + *safearray = pSA; + return hr; +} + +LIBTEST_API int STDCALL +mono_test_marshal_variant_out_safearray_4dim_vt_int (SAFEARRAY** safearray) +{ + /* Create a four-dimensional array of 10x3x6x7 variants filled with their indices */ + /* Also use non zero lower bounds */ + SAFEARRAY *pSA; + SAFEARRAYBOUND dimensions [4]; + long i; + HRESULT hr = S_OK; + VARIANT *pData; + + dimensions [0].lLbound = 15; + dimensions [0].cElements = 10; + dimensions [1].lLbound = 20; + dimensions [1].cElements = 3; + dimensions [2].lLbound = 5; + dimensions [2].cElements = 6; + dimensions [3].lLbound = 12; + dimensions [3].cElements = 7; + + pSA= SafeArrayCreate (VT_VARIANT, 4, dimensions); + + SafeArrayAccessData (pSA, (void **)&pData); + + for (i= 0; i< 10*3*6*7; i++) { + VariantInit(&pData [i]); + pData [i].vt = VT_I4; + pData [i].intVal = i; + } + SafeArrayUnaccessData(pSA); + *safearray = pSA; + return hr; +} + +#endif + diff --git a/mono/tests/load-exceptions.cs b/mono/tests/load-exceptions.cs index 697a79ce2a9..ed6f8cb357c 100644 --- a/mono/tests/load-exceptions.cs +++ b/mono/tests/load-exceptions.cs @@ -247,8 +247,17 @@ public class Tests : LoadMissing { } catch (TypeLoadException) {} return 0; } - - // FIXME: These do not work yet + + + public static void missing_outer () { + new Missing.Foo1.InnerFoo (); + } + + //Regression test for #508487 + public static int test_0_missing_outer_type_in_typeref () { + return check_type_load (new TestDel (missing_outer)); + } + #if FALSE public static void missing_parent () { new Miss1 (); diff --git a/mono/tests/make_imt_test.sh b/mono/tests/make_imt_test.sh index a828e10aa54..3cc1c872186 100755 --- a/mono/tests/make_imt_test.sh +++ b/mono/tests/make_imt_test.sh @@ -1,4 +1,4 @@ -#! /bin/bash +#!/usr/bin/env bash LOW=2000 HIGH=2000 diff --git a/mono/tests/metadata-verifier/Changelog b/mono/tests/metadata-verifier/Changelog index c9ecc318b6f..25a11b44eb0 100644 --- a/mono/tests/metadata-verifier/Changelog +++ b/mono/tests/metadata-verifier/Changelog @@ -1,3 +1,31 @@ +2009-06-26 Rodrigo Kumpera + + * cli-tables-tests.md: Fix a cattr-table test + where generic param is allowed as a parent. + +2009-06-19 Rodrigo Kumpera + + * cli-tables-tests.md: Fix a implmap-table test + related to SupportLastError. + +2009-06-18 Rodrigo Kumpera + + * cli-blob-tests.md: Last tests for method header. + +2009-06-18 Rodrigo Kumpera + + * cli-blob-tests.md: Tests for method header. + + * assembly-with-methods.cs: Fill in more methods + with EH tables. + +2009-06-16 Rodrigo Kumpera + + * cli-blob-tests.md: Tests for method header. + + * assembly-with-methods.cs: Add some body to + make for some fat headers. + 2009-06-10 Rodrigo Kumpera * cli-cattr-tests.md: Tests for custom attributes diff --git a/mono/tests/metadata-verifier/assembly-with-methods.cs b/mono/tests/metadata-verifier/assembly-with-methods.cs index 9dd9526cea5..d17bfa2ee15 100644 --- a/mono/tests/metadata-verifier/assembly-with-methods.cs +++ b/mono/tests/metadata-verifier/assembly-with-methods.cs @@ -4,10 +4,18 @@ using System.Runtime.CompilerServices; public class TypeOne { + static int z; public void GenericMethod () { + int foo = 10; + z = foo; } - public void SimpleMethod () { + public void SimpleMethod () { //thin EH table + int foo = 10; + z = foo; + try { + z = 10; + } catch (Exception e) {} } } @@ -19,12 +27,42 @@ public interface IFace public abstract class TypeTwo { + public TypeTwo () { //2 simple EH entries + try { + new TypeOne (); + } catch (Exception) {} + + try { + new TypeOne (); + } finally {} + + } [DllImport ("bla.dll")] public static extern void PInvoke (); } public abstract class AbsClass { + public AbsClass () { //fat EH table + int z = 99; + int foo = 10; + z = foo; + try { + //make this bigger than 256 bytes, each entry is 25 bytes + z = typeof(int).GetHashCode (); + z = typeof(int).GetHashCode (); + z = typeof(int).GetHashCode (); + z = typeof(int).GetHashCode (); + z = typeof(int).GetHashCode (); + z = typeof(int).GetHashCode (); + z = typeof(int).GetHashCode (); + z = typeof(int).GetHashCode (); + z = typeof(int).GetHashCode (); + z = typeof(int).GetHashCode (); + z = typeof(int).GetHashCode (); + z = typeof(int).GetHashCode (); + } finally {} + } public abstract void AbsBla (); } @@ -53,6 +91,5 @@ public class LastClass { public static void Main () { - } } \ No newline at end of file diff --git a/mono/tests/metadata-verifier/cli-blob-tests.md b/mono/tests/metadata-verifier/cli-blob-tests.md index f30f106de48..cfd4da083d2 100644 --- a/mono/tests/metadata-verifier/cli-blob-tests.md +++ b/mono/tests/metadata-verifier/cli-blob-tests.md @@ -291,3 +291,72 @@ methodspec-sig { #bad argument invalid offset blob.i (table-row (0x2B 0) + 2) + 3 set-byte 0x01 } + +method-header { + assembly assembly-with-methods.exe + + #invalid header kind + #method zero is an empty .ctor (), so it takes 7 bytes (call super + ret) so we do 7 << 2 | header kind + invalid offset translate.rva.ind (table-row (0x06 0)) + 0 set-byte 0x1C + invalid offset translate.rva.ind (table-row (0x06 0)) + 0 set-byte 0x1D + + #method 1 has fat header + #size must be 3 + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0x0013 + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0x1013 + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0x2013 + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0x5013 + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0xF013 + + #maxstack can be anything between 0-2^16-1, it's up to the IL verifier to use it. + + #make codesize huge enought to overflow + invalid offset translate.rva.ind (table-row (0x06 1)) + 4 set-uint 0x1FFFFFF0 + + #bad local vars token + #out of bounds + invalid offset translate.rva.ind (table-row (0x06 1)) + 8 set-uint 0x1100FFFF + #wrong table + invalid offset translate.rva.ind (table-row (0x06 1)) + 8 set-uint 0x1B000001 + + #bad fat header flags + #only 0x08 and 0x10 allowed + #regular value is + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0x3033 #or 0x20 + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0x3053 + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0x3093 + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0x3113 + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0x3213 + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0x3413 + invalid offset translate.rva.ind (table-row (0x06 1)) + 0 set-ushort 0x3813 + + #methods 2, 4 and 6 have EH tables. 2 and 4 are regular, 6 is fat 4 has 2 EH entries + #LAMEIMPL (our) well, 2 and 4 could be thin, but mono's SRE isn't keen to use small form + #thin format must have size that is n*12+4 fat n*24+4 + + #set invalid flags + valid offset translate.rva.ind (table-row (0x06 2)) + 4 set-ushort 0x1C #set the code size to be sure + + invalid offset translate.rva.ind (table-row (0x06 2)) + 40 or-byte 0x02 + invalid offset translate.rva.ind (table-row (0x06 2)) + 40 or-byte 0x04 + invalid offset translate.rva.ind (table-row (0x06 2)) + 40 or-byte 0x08 + invalid offset translate.rva.ind (table-row (0x06 2)) + 40 or-byte 0x10 + invalid offset translate.rva.ind (table-row (0x06 2)) + 40 or-byte 0x20 + + #set invalid size + #not multiple of n*24+4 + invalid offset translate.rva.ind (table-row (0x06 2)) + 41 set-byte 0x10 + invalid offset translate.rva.ind (table-row (0x06 2)) + 41 set-byte 0x1F + + #out of bound + invalid offset translate.rva.ind (table-row (0x06 2)) + 40 set-uint 0x5FFFFF41 + + #extra section is at + 40, so EH table at + 44, class token at + 64 + #bad table + invalid offset translate.rva.ind (table-row (0x06 2)) + 64 set-uint 0x11000001 + #bad token idx + invalid offset translate.rva.ind (table-row (0x06 2)) + 64 set-uint 0x010FF001 + invalid offset translate.rva.ind (table-row (0x06 2)) + 64 set-uint 0x020FF001 + invalid offset translate.rva.ind (table-row (0x06 2)) + 64 set-uint 0x1B0FF001 + +} diff --git a/mono/tests/metadata-verifier/cli-tables-tests.md b/mono/tests/metadata-verifier/cli-tables-tests.md index 3b2f1b3b1a5..b2f4a4a9d03 100644 --- a/mono/tests/metadata-verifier/cli-tables-tests.md +++ b/mono/tests/metadata-verifier/cli-tables-tests.md @@ -344,7 +344,7 @@ methoddef-table { #Interface cannot have .ctors (15) #method 3 belongs to an inteface invalid offset table-row ( 6 3 ) + 8 set-ushort read.ushort ( table-row ( 6 0 ) + 8 ) - #Interfacre methods can't be static + #Interface methods can't be static invalid offset table-row ( 6 3 ) + 6 or-ushort 0x0010 #XXX we don't care about CLS names (17) @@ -417,7 +417,7 @@ methoddef-table { invalid offset table-row ( 6 9 ) + 6 set-ushort 0x0006 invalid offset table-row ( 6 10 ) + 6 set-ushort 0x0016 - #TODO do all .ctor and .cctor valdiation (39, 40) + #TODO do all .ctor and .cctor validation (39, 40) } methoddef-table-global-methods { @@ -611,8 +611,9 @@ cattr-table { #parent is a valid coded index (2) #The spec say any table can be used, but only 19 tables are allowed on the coded token + #Actually 20 tables are allowed, the spec doesn't mention, but generic param is allowed + valid offset table-row ( 0xC 0 ) set-ushort 0x33 #bad table - invalid offset table-row ( 0xC 0 ) set-ushort 0x33 invalid offset table-row ( 0xC 0 ) set-ushort 0x34 invalid offset table-row ( 0xC 0 ) set-ushort 0x35 invalid offset table-row ( 0xC 0 ) set-ushort 0x36 @@ -905,7 +906,7 @@ implmap-table { invalid offset table-row (0x1C 0) set-bit 3 invalid offset table-row (0x1C 0) set-bit 4 invalid offset table-row (0x1C 0) set-bit 5 - invalid offset table-row (0x1C 0) set-bit 6 + invalid offset table-row (0x1C 0) set-bit 7 invalid offset table-row (0x1C 0) set-bit 11 invalid offset table-row (0x1C 0) set-bit 12 invalid offset table-row (0x1C 0) set-bit 13 diff --git a/mono/tests/runtime-invoke.cs b/mono/tests/runtime-invoke.cs index 475690e30eb..eafe3104708 100644 --- a/mono/tests/runtime-invoke.cs +++ b/mono/tests/runtime-invoke.cs @@ -29,7 +29,7 @@ enum Enum2 D } -class X +class Tests { public static Enum1 return_enum1 () { return Enum1.A; @@ -39,9 +39,21 @@ class X return Enum2.C; } - static int Main () + public static long return_long () { + return 1234; + } + + public static ulong return_ulong () { + return UInt64.MaxValue - 5; + } + + static int Main (string[] args) { - Assembly ass = Assembly.GetCallingAssembly (); + return TestDriver.RunTests (typeof (Tests), args); + } + + public static int test_0_base () { + Assembly ass = typeof (Tests).Assembly; Type a_type = ass.GetType ("A"); MethodInfo a_method = a_type.GetMethod ("ToString"); @@ -59,12 +71,47 @@ class X object d_ret = d_method.Invoke (d, null); Console.WriteLine (d_ret); + return 0; + } + + public static int test_0_enum_sharing () { /* Check sharing of wrappers returning enums */ - if (typeof (X).GetMethod ("return_enum1").Invoke (null, null).GetType () != typeof (Enum1)) + if (typeof (Tests).GetMethod ("return_enum1").Invoke (null, null).GetType () != typeof (Enum1)) return 1; - if (typeof (X).GetMethod ("return_enum2").Invoke (null, null).GetType () != typeof (Enum2)) + if (typeof (Tests).GetMethod ("return_enum2").Invoke (null, null).GetType () != typeof (Enum2)) return 2; + return 0; + } + + public static int test_0_primitive_sharing () { + /* Check sharing of wrappers returning primitive types */ + if (typeof (Tests).GetMethod ("return_long").Invoke (null, null).GetType () != typeof (long)) + return 3; + if (typeof (Tests).GetMethod ("return_ulong").Invoke (null, null).GetType () != typeof (ulong)) + return 4; return 0; } + + public static unsafe int test_0_ptr () { + int[] arr = new int [10]; + fixed (void *p = &arr [5]) { + object o = typeof (Tests).GetMethod ("Test").Invoke (null, new object [1] { new IntPtr (p) }); + void *p2 = Pointer.Unbox (o); + if (new IntPtr (p) != new IntPtr (p2)) + return 1; + + o = typeof (Tests).GetMethod ("Test").Invoke (null, new object [1] { null }); + p2 = Pointer.Unbox (o); + if (new IntPtr (p2) != IntPtr.Zero) + return 1; + } + + return 0; + } + + public static unsafe int* Test (int *val) { + Console.WriteLine (new IntPtr (val)); + return val; + } } diff --git a/mono/tests/t-missing.cs b/mono/tests/t-missing.cs index bbb25bfb39d..e594b3e7c21 100644 --- a/mono/tests/t-missing.cs +++ b/mono/tests/t-missing.cs @@ -4,6 +4,7 @@ namespace Missing { #if FOUND public class Foo1 { + public class InnerFoo {} } #endif diff --git a/mono/utils/ChangeLog b/mono/utils/ChangeLog index e0769c612b4..c39e127b04b 100644 --- a/mono/utils/ChangeLog +++ b/mono/utils/ChangeLog @@ -1,3 +1,7 @@ +2009-06-15 Zoltan Varga + + * gc_wrapper.h: Disable thread local alloc on mips. + 2009-05-26 Zoltan Varga * CMakeLists.txt: New file. diff --git a/mono/utils/gc_wrapper.h b/mono/utils/gc_wrapper.h index 801300867f1..0dbf7096359 100644 --- a/mono/utils/gc_wrapper.h +++ b/mono/utils/gc_wrapper.h @@ -28,7 +28,7 @@ * ARM has no definition for some atomic functions in gc_locks.h and * support is also disabled in libgc/configure.in. */ -# if !defined(__sparc__) && !defined(__sun) && !defined(__arm__) +# if !defined(__sparc__) && !defined(__sun) && !defined(__arm__) && !defined(__mips__) # define GC_REDIRECT_TO_LOCAL # endif # endif diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt new file mode 100644 index 00000000000..bdfc8f60ffa --- /dev/null +++ b/scripts/CMakeLists.txt @@ -0,0 +1,230 @@ +# +# Scripts that we install +# +# Starting with Mono 2.0, the majority of the tools default to the +# 2.0 profile. Commands that support the 1.0 toolchain and must +# run under 1.0 have the number 1 appended to their command names +# (for example mcs1 is the C# 1.0 compiler) and are listed in the +# scripts_1_0 compat variable. +# +# To preserve compatibility with old Makefiles and tools we keep the +# command names that had the suffix 2 (like wsdl2) +# +if(USE_BATCH_FILES) +message(FATAL_ERROR FIXME) +set(SCRIPT_IN script.bat.in) +set(FILTER sed -e 's,\.bat\.exe,\.exe,g' -e 's,/,\\,g') +set(SCRIPT_SUFFIX .bat) +else() +set(SCRIPT_IN script.in) +set(FILTER cat) +set(SCRIPT_SUFFIX) +endif() + +set(COMPAT_1_0_SUFFIX 1${SCRIPT_SUFFIX}) +set(COMPAT_2_0_SUFFIX 2${SCRIPT_SUFFIX}) + +set(scripts_1_0_compat + al1${SCRIPT_SUFFIX} + genxs1${SCRIPT_SUFFIX} + ilasm1${SCRIPT_SUFFIX} + mcs1${SCRIPT_SUFFIX} + mkbundle1${SCRIPT_SUFFIX} + gacutil1${SCRIPT_SUFFIX} + monop1${SCRIPT_SUFFIX} + resgen1${SCRIPT_SUFFIX} + wsdl1${SCRIPT_SUFFIX}) + +set(scripts_1_0 + caspol${SCRIPT_SUFFIX} + cert2spc${SCRIPT_SUFFIX} + certmgr${SCRIPT_SUFFIX} + chktrust${SCRIPT_SUFFIX} + cilc${SCRIPT_SUFFIX} + disco${SCRIPT_SUFFIX} + dtd2xsd${SCRIPT_SUFFIX} + dtd2rng${SCRIPT_SUFFIX} + installvst${SCRIPT_SUFFIX} + genxs${SCRIPT_SUFFIX} + macpack${SCRIPT_SUFFIX} + mcs${SCRIPT_SUFFIX} + mjs${SCRIPT_SUFFIX} + monolinker${SCRIPT_SUFFIX} + mono-cil-strip${SCRIPT_SUFFIX} + mozroots${SCRIPT_SUFFIX} + permview${SCRIPT_SUFFIX} + prj2make${SCRIPT_SUFFIX} + secutil${SCRIPT_SUFFIX} + setreg${SCRIPT_SUFFIX} + signcode${SCRIPT_SUFFIX} + soapsuds${SCRIPT_SUFFIX} + xsd${SCRIPT_SUFFIX}) + +set(scripts_1_0_umask + makecert${SCRIPT_SUFFIX} + sn${SCRIPT_SUFFIX}) + +set(scripts_2_0 + al2${SCRIPT_SUFFIX} + csharp${SCRIPT_SUFFIX} + gacutil2${SCRIPT_SUFFIX} + gmcs${SCRIPT_SUFFIX} + httpcfg${SCRIPT_SUFFIX} + ilasm2${SCRIPT_SUFFIX} + mconfig${SCRIPT_SUFFIX} + mkbundle2${SCRIPT_SUFFIX} + mdoc${SCRIPT_SUFFIX} + mono-api-info${SCRIPT_SUFFIX} + mono-shlib-cop${SCRIPT_SUFFIX} + monop2${SCRIPT_SUFFIX} + resgen2${SCRIPT_SUFFIX} + pdb2mdb${SCRIPT_SUFFIX} + wsdl2${SCRIPT_SUFFIX} + xsd2${SCRIPT_SUFFIX} + mono-xmltool${SCRIPT_SUFFIX} + sgen${SCRIPT_SUFFIX} + sqlmetal${SCRIPT_SUFFIX} + sqlsharp${SCRIPT_SUFFIX} + svcutil${SCRIPT_SUFFIX} + xbuild${SCRIPT_SUFFIX}) + +set(MDOC_SUBCOMMANDS + mdoc-assemble + mdoc-export-html + mdoc-export-msxdoc + mdoc-update + mdoc-validate) + +set(MDOC_COMPAT + mdassembler + mdvalidater + monodocer + monodocs2html + monodocs2slashdoc) + +set(bin_SCRIPTS + ${scripts_1_0} + ${scripts_1_0_umask} + ${scripts_1_0_compat} + ${scripts_defaults} + ${scripts_2_0} + ${scripts_service} + ${scripts_nunit} + ${scripts_rpmhelpers} + ${MDOC_SUBCOMMANDS} + ${MDOC_COMPAT} + mod + mono-test-install) + +# +# these are the new defaults, 2.0 profile-based commands +# +# we can move scripts_1_0 scripts here as we see fit, if(we need to +# keep a 1.0 command available, we should additionally put it on +# the scripts_1_0_compat list +# +set(scripts_defaults + al${SCRIPT_SUFFIX} + ilasm${SCRIPT_SUFFIX} + gacutil${SCRIPT_SUFFIX} + mkbundle${SCRIPT_SUFFIX} + monop${SCRIPT_SUFFIX} + resgen${SCRIPT_SUFFIX} + wsdl${SCRIPT_SUFFIX}) + +###scripts_service = mono-service mono-service2 +###scripts_nunit = nunit-console${SCRIPT_SUFFIX} nunit-console2${SCRIPT_SUFFIX} +###scripts_rpmhelpers = mono-find-provides mono-find-requires +### +###CLEANFILES = ${scripts_1_0} ${scripts_1_0_umask} ${scripts_2_0} ${scripts_defaults} ${scripts_1_0_compat} mono-service mono-service2 nunit-console nunit-console2 mono-find-provides mono-find-requires mod ${MDOC_SUBCOMMANDS} +###DISTCLEANFILES = ${pkgconfig_DATA} ${scripts_rpmhelpers} +### +###EXTRA_DIST = \ +### script.in \ +### script.bat.in \ +### script_umask.in \ +### script_umask.bat.in \ +### mod.in \ +### mono-service.in \ +### mono-find-provides.in \ +### mono-find-requires.in \ +### mono-test-install \ +### ${MDOC_COMPAT} \ +### patch-quiet.sh +### +if(USE_JIT) +set(mono_interp mono) +else() +set(mono_interp mint) +endif() + +if(PLATFORM_WIN32) +if(CROSS_COMPILING) +set(plat_bindir ${bindir}) +set(mono_instdir ${prefix}/lib/mono) +else() +set(plat_bindir ${shell cygpath -m ${libdir}}) +set(mono_instdir ${shell cygpath -m ${libdir}}/mono) +endif() +else() +set(plat_bindir ${bindir}) +set(mono_instdir ${prefix}/lib/mono) +endif() + +function(rewrite input output exe version) + file(READ ${input} s) + string(REPLACE "\@bindir\@" "${bindir_full}" s ${s}) + string(REPLACE "\@mono_instdir\@" "${mono_instdir}" s ${s}) + string(REPLACE "\@mono_interp\@" "${mono_interp}" s ${s}) + string(REPLACE "\@framework_version\@" "${version}" s ${s}) + string(REPLACE "\@exe_name\@" "${exe}" s ${s}) + file(WRITE ${output} ${s}) +endfunction() + +function(rewrite_debug input output exe version) + file(READ ${input} s) + string(REPLACE "\@bindir\@" "${bindir_full}" s ${s}) + string(REPLACE "\@mono_instdir\@" "${mono_instdir}" s ${s}) + string(REPLACE "\@mono_interp\@" "${mono_interp} --debug" s ${s}) + string(REPLACE "\@framework_version\@" "${version}" s ${s}) + string(REPLACE "\@exe_name\@" "${exe}" s ${s}) + file(WRITE ${output} ${s}) +endfunction() + +set(srcdir ${top_srcdir}/scripts) + +# FIXME: Make these into targets +rewrite(mono-service.in mono-service mono-service 1.0) +rewrite(mono-service.in mono-service2 mono-service2 2.0) +rewrite_debug(${SCRIPT_IN} nunit-console${SCRIPT_SUFFIX} nunit-console 1.0) +rewrite_debug(${SCRIPT_IN} nunit-console2${SCRIPT_SUFFIX} nunit-console 2.0) +rewrite(mod.in mod${SCRIPT_SUFFIX} mod 1.0) + +foreach(script ${scripts_1_0}) + rewrite(${srcdir}/script.in ${script} ${script} 1.0) +endforeach() + +foreach(script ${scripts_1_0_umask}) + rewrite(${srcdir}/script_umask.in ${script} ${script} 1.0) +endforeach() + +foreach(script ${scripts_1_0_compat}) + string(REPLACE ${COMPAT_1_0_SUFFIX} "" exe ${script}) + rewrite(${srcdir}/script_umask.in ${script} ${exe} 1.0) +endforeach() + +foreach(script ${scripts_defaults}) + rewrite(${srcdir}/script.in ${script} ${script} 2.0) +endforeach() + +foreach(script ${scripts_2_0}) + string(REPLACE ${COMPAT_2_0_SUFFIX} "" exe ${script}) + rewrite(${srcdir}/script.in ${script} ${exe} 2.0) +endforeach() + +foreach(script ${MDOC_SUBCOMMANDS}) + string(REPLACE "mdoc-" "" cmd ${script}) + file(WRITE ${script} "#!/bin/sh\nexec mdoc ${cmd} \"$@\"\n") +endforeach() + +install(PROGRAMS ${bin_SCRIPTS} DESTINATION bin) diff --git a/scripts/Makefile.am b/scripts/Makefile.am index d634ecc5e36..8131b5a2419 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -62,7 +62,6 @@ scripts_1_0 = \ macpack$(SCRIPT_SUFFIX) \ mcs$(SCRIPT_SUFFIX) \ mjs$(SCRIPT_SUFFIX) \ - monolinker$(SCRIPT_SUFFIX) \ mono-cil-strip$(SCRIPT_SUFFIX) \ mozroots$(SCRIPT_SUFFIX) \ permview$(SCRIPT_SUFFIX) \ @@ -87,6 +86,7 @@ scripts_2_0 = \ mconfig$(SCRIPT_SUFFIX) \ mkbundle2$(SCRIPT_SUFFIX) \ mdoc$(SCRIPT_SUFFIX) \ + monolinker$(SCRIPT_SUFFIX) \ mono-api-info$(SCRIPT_SUFFIX) \ mono-shlib-cop$(SCRIPT_SUFFIX) \ monop2$(SCRIPT_SUFFIX) \